PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Formelsammlung mit Ausrichtung an oberster Grundlinie



FloSch369
07-03-2008, 12:01
Hi,

zunächst Entschuldigung für den langen ersten Post, aber ich wollte alle ausgeschöpften Möglichkeiten angeben um die Lösungssuche zu erleichtern.

Hier das Problem: ich möchte eine Formelsammlung nach genauen Vorstellungen erstellen und bin so langsam am Verzweifeln. Boardsuche, Google, Dokus habe ich alles benutzt nur leider ohne Erfolg. Falls es eine elegante Lösung zu meinem Problem geben sollte und ich diese übersehen habe, bitte ich dies zu entschuldigen - über einen Link würde ich mich dann sehr freuen!

Die FS soll folgendes Grundmuster haben:

links: Beschriftung
mitte: Formel
rechts: evtl. ergänzender Text

Weitere Optionen sollen sein:

Das Dokument soll nicht durchgängig "dreispaltig" sein, sondern nur dort, wo eine Formel gesetzt wird. Also lokale Umgebung z.B. mittels \newcommand{\formel}[3]{...} global definiert.
die jeweiligen Spalten sollen mehrzeiligen Inhalt aufnehmen können.
im Falle der Formel-Spalte soll jede Mathe-Umgebung verwendet werden können, also \[...\], align*, alignat*, gather*, ...

Und jetzt kommt die Schwierigkeit:

die Grundlinien der jeweils obersten Zeilen sollen identisch sein! Also keine vertikale Zentrierung...


Die einfachste Lösung schien

\newcommand{\formel}[3]{%
\parbox[t]{länge_x}{#1} \parbox[t]{länge_y}{#2} \parbox[t]{länge_z}{#3}
}
Wenn ich dann eine einzeilige Formel übergebe, z.B. schreibe:


\formel{Beispielformel}{\[ a + b = c\]}{Beispielbeschreibung}
stimmt die Grundlinie der Formel nicht mit der Grundlinie der Beschreibung überein.
http://www.schmidt-kontakt.de/mrunix/fs/formel.png
Die Option [t] bei der parbox hat leider nichts gebracht. Die jeweiligen displayskips (above, below und jeweils noch den short) hatte ich testweise auch auf 0pt gesetzt, leider ohne Erfolg.

Bin dann auf das Paket multicols gestoßen. Damit könnte ich mittels \columnbreak dann manuell umbrechen - leider kann ich damit die Spaltenbreite nicht festlegen bzw. keine unterschiedlich breiten Spalten definieren. Aber damit war die Ausrichtung astrein.

Ein weiterer Versuch war für jede Mathe-Umgebung ein eigene Kommando bereitzustellen und dann die Beschrifung mittels \text vorzunehmen. Mathindent habe ich hierfür auf die gewünschte Breite der ersten Spalte eingestellt, also z.B. \mathindent30mm


\newcommand{\formelalign}[3]{%
\parbox{länge_x}{
\begin{align*}
\hspace*{-30mm}\parbox{30mm}{#1} #2
\end{align*}}
\parbox{länge_y}{#3}
}
auf die Berücksichtigung der inneren Abstände der parbox habe ich hier verzichtet. Wenn ich jetzt als Formel z.B.


a + b &= c \\
d + e + f + g + h + i &= 0
eingebe, dann ist klar, dass das nicht funktionieren kann. Denn die zweite Zeile der Formel ragt viel weiter nach links. Der Text wird aber relativ zum "a" verschoben. Somit ist der Text nicht links auf der Seite.

Ich weiß im Moment echt keinen Rat mehr und hoffe, dass mir jemand helfen kann.
Besten Dank schon im Voraus.

bischi
07-03-2008, 13:04
Tabelle, p{0.3\textwidth} Spalten und eventuell noch minipages?

MfG Bischi

PS: Eventuell hilft auch \vfill weiter...

sofa-surfer
07-03-2008, 13:31
Hallo,

vermutlich hast du die Längenregister versucht vor \begin{document} zu ändern? Versuchs mal danach:


\documentclass[ngerman]{scrartcl}
\usepackage{babel,blindtext}
\usepackage{amsmath}
\newlength{\x}
\setlength{\x}{.33\textwidth}

\newcommand{\formel}[3]{%

\parbox[t]{\x}{#1}
\parbox[t]{\x}{%
\begin{flalign*}#2\end{flalign*}
}%
\parbox[t]{\x}{#3}%

}

\begin{document}
\setlength{\abovedisplayskip}{-\baselineskip}
\setlength{\belowdisplayskip}{0pt}
\blindtext\\
\formel{bla\\ blub}{g +b &= c &}{bla}\\
\blindtext
\end{document}

Matthias

FloSch369
07-03-2008, 14:03
Hi zusammen und vielen Dank für Eure Beiträge!

@bischi
Mit Tabellen habe ich leider dasselbe Problem, das hatte ich schon ausprobiert. Und Minipages und Parboxes schenken sich in der Darstellung der Inhalte nichts, oder? Hatte aber auch schon Minipages verwendet - selbes Resultat.

@sofa-surfer
Ne, die Änderung der Längenregister (Du meinst die displayskip-Dinger, oder?) hatte ich schon nach Dokumentenanfang gesetzt. Sonst tut sich da ja nichts und der Unterschied ist mir dann schon aufgefallen :p. Interessant finde ich aber, dass das genau die Lösung ist, die ich gleich zu Beginn hatte. Nur hatte sie damals nicht funktioniert oder bei irgend einem Beispiel hatte die versagt. Dummerweise habe ich die Originaldatei nicht mehr (hab da in der Zwischenzeit zu viel daran rumgepfriemelt) und kann das jetzt nicht nachvollziehen. Auf den ersten Blick scheint es zu funktionieren, vielen Dank! Ich wüsste nur zu gerne, warum ich dann von der Lösung abgewichen bin...

Sollte ich dann wieder auf ein Beispiel stoßen, melde ich mich... Im Moment ist das Thema erst einmal erledigt, vielen Dank noch einmal und Grüße von dem...

... der vermutlich den Wald vor lauter Bäumen nicht sah und sich dann in der Lösung verrannt hatte.

FloSch369
07-03-2008, 14:44
So, da war ich leider zu voreilig :( . Hab jetzt wieder gefunden, warum ich das damals nicht so gemacht hatte:

M_i = \sum\limits_{j=1}^{N_e} a_{ij} \cdot M_{j} = m_i \cdot n_i

Das liefert mir mit folgendem Code:

\documentclass[ngerman, fleqn, parskip]{scrartcl}
\usepackage{babel}
\usepackage{amsmath}

\newcommand{\formelnormal}[3]{%
\parbox[t]{0.33\textwidth}{ #1 }%
\parbox[t]{0.33\textwidth}{ \[ #2 \] }%
\parbox[t]{0.33\textwidth}{ #3 }%
}

\begin{document}
\mathindent0mm
\setlength{\abovedisplayskip}{-\baselineskip}
\setlength{\abovedisplayshortskip}{-\baselineskip}
\setlength{\belowdisplayskip}{0pt}
\setlength{\belowdisplayshortskip}{0pt}

\formelnormal{Molmasse}{M_i = \sum\limits_{j=1}^{N_e} a_{ij} \cdot M_{j} = m_i \cdot n_i}{Test }

\formelnormal{Satz des Pythagoras}{a^2 + b^2 = c^2}{Test }
\end{document}


Diesen unschönen Output:
http://www.schmidt-kontakt.de/mrunix/fs/mini.png

Wie bekomme ich es hin, dass auch solche Formeln an der Grundlinie schön ausgerichtet werden?

Stefan_K
07-03-2008, 23:57
Hallo,

zumindest hier könnte man vielleicht statt der abgesetzten Formel eine eingebettete mit \displaystyle nehmen:
\newcommand{\formelnormal}[3]{%
\parbox[t]{0.33\textwidth}{ #1 }%
\parbox[t]{0.33\textwidth}{ $ \displaystyle #2 $ }%
\parbox[t]{0.33\textwidth}{ #3 }%
}

Viele Grüße,

Stefan

FloSch369
08-03-2008, 08:52
Hi und danke für Deine Antwort.

Das würde zwar das Problem bei einzeiliger Formel lösen, allerdings besteht das Problem bei mehrzeiligen Formeln dann noch immer.


\newcommand{\formel}[3]{%
\parbox[t]{0.33\textwidth}{ #1 }%
\parbox[t]{0.33\textwidth}{ \begin{gather*} #2 \end{gather*} }%
\parbox[t]{0.33\textwidth}{ #3 }%
}

\formel{Molmasse}
{M_i = \sum\limits_{j=1}^{N_e} a_{ij} \cdot M_{j} = m_i \cdot n_i %
\\ %
a + b = c %
}
{Test }

Hier sind die obersten Grundlinien nicht ausgerichtet. Gather* ist jetzt nur ein Beispiel, da könnte ich eigentlich sonst gleich zwei einzeilige Formeln nehmen und dann hätte ich das Problem nicht. Aber das gleiche Problem besteht bei align* und dergleichen...

Grüße
Florian

rais
08-03-2008, 18:06
ohne Garantie :D


\documentclass[ngerman, fleqn, parskip]{scrartcl}
\usepackage{babel,blindtext}
\usepackage{amsmath}
\newlength\mytmph
\newlength\mytmpd
\newlength\myeqh
\newlength\myeqd
\newlength\mytxth
\newlength\myeqov
\newlength\mygh
\setlength\fboxsep{0pt}
\newcommand{\formel}[3]{%
\settoheight{\myeqh}{\parbox{0.33\linewidth}{#2}}%
\settoheight{\myeqov}{\parbox{0.33\linewidth}{\[\sum_{j=1}^{N_e}\]}}
\ifnum\myeqov > \myeqh \setlength\myeqov{\baselineskip}\fi
\settodepth{\myeqd}{\parbox{0.33\linewidth}{#2}}%
\settoheight{\mytmph}{\parbox{0.33\linewidth}{#1}} %
\settodepth{\mytmpd}{\parbox{0.33\linewidth}{#1}}%
\setlength\mytxth{\myeqh}
\addtolength\mytxth{\myeqd}%Total h der Gleichung
\addtolength\mytmph{\mytmpd}%Total h der ersten Textbox
\ifnum\mytmph > \mytxth \setlength\mytxth{\mytmph}\fi%
\settoheight{\mytmph}{\parbox{0.33\linewidth}{#3}} %
\settodepth{\mytmpd}{\parbox{0.33\linewidth}{#3}}%
\addtolength\mytmph{\mytmpd}%Total h der zweiten Textbox
\ifnum\mytmph > \mytxth \setlength\mytxth{\mytmph}\fi%
\settoheight{\mygh}{M}% Grundhöhe
\addtolength{\mytxth}{\myeqov}
\noindent\parbox[t][\mytxth]{\linewidth}{%
\parbox[t][\myeqh][t]{0.33\linewidth}{#1}%
\raisebox{\myeqov}{\parbox[t][\myeqh][t]{0.33\linewidth}{#2}}%
\parbox[t][\myeqh][t]{0.33\linewidth}{#3}}%
}

\begin{document}
\setlength{\parskip}{0pt}%
\setlength{\mathindent}{0pt}%
\setlength{\abovedisplayskip}{0pt}%
\setlength{\abovedisplayshortskip}{0pt}%
\setlength{\belowdisplayskip}{0pt}%
\setlength{\belowdisplayshortskip}{0pt}%
\blindtext\par
\formel{Molmasse}{\[M_i = \sum_{j=1}^{N_e} a_{ij} \cdot M_{j} = m_i \cdot n_i\]}{Hier steht nur ein wenig mehr Text, damit auch diese Box gegebenfalls umbrochen wird.}
\blindtext
\formel{Molmasse}
{\begin{gather*}M_i = \sum_{j=1}^{N_e} a_{ij} \cdot M_{j} = m_i \cdot n_i %
\\ %
a + b = c %
\end{gather*}}
{Test }
\blindtext
\formel{Satz des Pythagoras}{\[a^2 + b^2 = c^2\]}{Test}
\end{document}

MfG

FloSch369
09-03-2008, 12:02
Hallo Rainer,

vielen Dank für Dein ausführliches Beispiel! Allerdings habe ich es nicht probiert, weil ich jetzt eine äußerst elegante Lösung habe. Tut mir leid, dass Du Dir die Mühe umsonst gemacht hast, aber ich habe Deine Nachricht leider erst jetzt gesehen :( .

Auf die Lösung brachte mich Frank Mittelbach (LaTeX-Genie), den ich bezüglich unterschiedlicher Spaltenbreiten beim Multicol-Paket angemailt und ihm mein Problem geschildert hatte. Er hat eine, wie ich finde, geniale Lösung gefunden. Genial weil: elegant, schlank und bestechend einfach! So einfach, dass es mich ärgert, dass ich da nicht selbst drauf gekommen bin. Hut ab!

Für alle die, die auch mit dem Problem kämpfen, eine gescheite Formelsammlung in LaTeX erstellen zu wollen (und das sind schon ein paar), hier der Code:

Ausgangspunkt ist folgender, einfacher Code:

\begin{equation*}
\begin{minipage}[t]{\breiteformelname}
Satz des Pythagoras % Formelname
\end{minipage}
\begin{aligned}[t]
a^2 + b^2 = c^2 % Formel
\end{aligned}
\hfill
\begin{minipage}[t]{\breiteformelbeschreibung}
Kennt ja jedes Kind % Ergänzende Anmerkungen
\end{minipage}
\end{equation*}

Dieser setzt alles in eine einzige equation-Umgebung, das ist wichtig, damit die Grundlinien alle korrekt ausgerichtet werden. Formelname und die Beschreibung zur Formel werden jeweils in eine minipage gesetzt. Theoretisch könnte man hier auch parboxes nehmen aber durch die minipages werden Anfang und Ende der Umgebung deutlicher. Damit die Formel linksbündig ausgerichtet wird (Globaloption fleqn), folgt nach der aligned-Umgebung das \hfill. Damit klebt der Formelname ganz links auf der Seite und die ergänzenden Erläuterungen ganz rechts. Der Platz wird also voll ausgenutzt.

Daraus abgeleitet:

\newcommand{\formel}[3]
{
\begin{equation*}
\begin{minipage}[t]{\designatorwidth}% minipage des namens
#1 % Formelname
\end{minipage}% minipage des namens
\begin{aligned}[t]% formelumgebung
#2 % Formel
\end{aligned}
\hfill
\begin{minipage}[t]{\descriptionwidth}% minipage der Beschreibung
#3 % Formelbeschreibung
\end{minipage}% minipage der beschreibung
\end{equation*}
}

Falls jetzt nicht immer aligned, sondern z.B. auch gathered verwendet werden soll, wird es nur unwesentlich komplizierter:

\newcommand{\setdescription}{}

\newcommand{\setformula}[1]
{
\end{minipage}% minipage des namens
\renewcommand{\setdescription}
{
\end{#1}
\hfill
\begin{minipage}[t]{\descriptionwidth}% minipage der Beschreibung
}
\begin{#1}[t]% formelumgebung
}

\newcommand{\formel}[4]
{
\begin{equation*}
\begin{minipage}[t]{\designatorwidth}% minipage des namens
#2
\setformula{#1}
#3
\setdescription
#4
\end{minipage}% minipage der beschreibung
\end{equation*}
}

An dieser Stelle noch einmal vielen Dank an alle, die sich mit meinem Problem beschäftigt haben und speziell an Frank Mittelbach, der die genial einfache Lösung geliefert hat.

Viele Grüße und einen schönen Sonntag wünscht
Florian

rais
09-03-2008, 15:04
Moin Florian,

Tut mir leid, dass Du Dir die Mühe umsonst gemacht hast, aber ich habe Deine Nachricht leider erst jetzt gesehen :( .

naja, auch wenn Du diesen Ansatz nicht weiter verfolgst, würde ich es für mich nicht als unnütze Mühe ansehen, sind mir so doch wieder ein paar Dinge etwas klarer geworden ... u. a., daß mein Ansatz noch eine zu große Gesamthöhe besitzt, wenn die Gleichung eh das größte Element darstellt (ich dürfte hier die Gesamtbox nur um den Betrag vergrößern, um den die Gleichung oben überstehen würde -- und das auch nur dann, wenn eine der Textboxen höher als die Gleichung ist) -- und wer weiß, unter welchen Bedingungen das Teil überhaupt bzw. nicht mehr funktioniert.:D


Auf die Lösung brachte mich Frank Mittelbach (LaTeX-Genie), den ich bezüglich unterschiedlicher Spaltenbreiten beim Multicol-Paket angemailt und ihm mein Problem geschildert hatte. Er hat eine, wie ich finde, geniale Lösung gefunden.

Ist Frank eigentlich darauf eingegangen, warum die \parbox[t] mit der Gleichung tiefer gesetzt wird, als die umliegenden \parbox[t] mit den Texten (bei \abovedisplayskip von 0pt)? Das würd' mich in diesem Zusammenhang schon noch interessieren.;-)


Falls jetzt nicht immer aligned, sondern z.B. auch gathered verwendet werden soll, wird es nur unwesentlich komplizierter:

\newcommand{\setdescription}{}

\newcommand{\setformula}[1]
{
\end{minipage}% minipage des namens
\renewcommand{\setdescription}
{
\end{#1}
\hfill
\begin{minipage}[t]{\descriptionwidth}% minipage der Beschreibung
}
\begin{#1}[t]% formelumgebung
}

\newcommand{\formel}[4]
{
\begin{equation*}
\begin{minipage}[t]{\designatorwidth}% minipage des namens
#2
\setformula{#1}
#3
\setdescription
#4
\end{minipage}% minipage der beschreibung
\end{equation*}
}

Das hab ich nu allerdings nicht ganz verstanden -- warum der Umweg über \setformula/\setdescription? Warum nicht einfach


\newcommand{\formel}[4][aligned]{%
\begin{equation*}
\begin{minipage}[t]{\designatorwidth}% minipage des namens
#2 % Formelname
\end{minipage}% minipage des namens
\begin{#1}[t]% formelumgebung
#3 % Formel
\end{#1}
\hfill
\begin{minipage}[t]{\descriptionwidth}% minipage der Beschreibung
#4 % Formelbeschreibung
\end{minipage}% minipage der beschreibung
\end{equation*}
}
oder Vergleichbares?

BTW: Tut der \hfill vor der letzten minipage überhaupt irgendwas?

MfG und auch Dir einen schönen Sonntag

FloSch369
09-03-2008, 18:33
Servus zurück,



Ist Frank eigentlich darauf eingegangen, warum die \parbox[t] mit der Gleichung tiefer gesetzt wird, als die umliegenden \parbox[t] mit den Texten (bei \abovedisplayskip von 0pt)? Das würd' mich in diesem Zusammenhang schon noch interessieren.;-)

Das würde mich auch echt interessieren, weil das für mich überhaupt keinen Sinn macht. Deshalb sind ja auch meine ganzen Probleme entstanden. Aber leider muss ich Dich enttäuschen, da haben wir gar nicht drüber gesprochen, bzw. ich hab nicht gezielt gefragt. Wahrscheinlich ist es aber wie so oft:

It's not a bug in TeX! It's a feature...



Das hab ich nu allerdings nicht ganz verstanden -- warum der Umweg über \setformula/\setdescription?

Ähm ja. Da hast Du wohl recht :p. Ich hatte den Code zunächst so, dass die Formel samt Name und Beschreibung innerhalb einer selbst definierten Umgebung steht. Nachdem ich das dann von newenvironment auf newcommand umgeschrieben hatte, habe ich das nicht entrümpelt. Vielen Dank für den Hinweis, das macht die Sache natürlich noch einmal schlanker!
Und jetzt kann ich sogar noch die Idee von Frank einarbeiten und aligned als Standard vorgeben. Wenn ich dann mal gathered benötige, kann ich dies dann immer noch mit \formel[gathered]{...}{...}{...} machen:

\newcommand{\formel}[4][aligned]
{
\begin{equation*}
\begin{minipage}[t]{\designatorwidth}% minipage des namens
#2
\end{minipage}% minipage des namens
\begin{#1}[t]
#3
\end{#1}
\hfill
\begin{minipage}[t]{\descriptionwidth}% minipage der Beschreibung
#4
\end{minipage}% minipage der beschreibung
\end{equation*}
}




BTW: Tut der \hfill vor der letzten minipage überhaupt irgendwas?

Ja, der sorgt dafür, dass die letze minipage auch tatsächlich ganz rechts auf die Seite plaziert wird. Sonst würde die minipage und damit die ergänzenden Erläuterungen zur Formel direkt hinter der Formel kleben und ich hätte diese Texte gerne alle untereinander in einer Spalte.

Viele Grüße
Florian

rais
09-03-2008, 21:25
Moin Florian,

Ja, der sorgt dafür, dass die letze minipage auch tatsächlich ganz rechts auf die Seite plaziert wird.
da hab ich wohl irgend etwas noch nicht verstanden bzw. nicht richtig umgesetzt:


\documentclass{scrartcl}
\usepackage{amsmath}
\newlength\designatorwidth
\newlength\descriptionwidth
\setlength\designatorwidth{0.33\linewidth}
\setlength\descriptionwidth{0.33\linewidth}
\newcommand{\formel}[4][aligned]
{
\begin{equation*}
\begin{minipage}[t]{\designatorwidth}% minipage des namens
#2
\end{minipage}% minipage des namens
\begin{#1}[t]
#3
\end{#1}
\hfill
\begin{minipage}[t]{\descriptionwidth}% minipage der Beschreibung
#4
\end{minipage}% minipage der beschreibung
\end{equation*}
}
\begin{document}
\noindent\hrulefill\par
\formel{Satz des Pythagoras}{a^2 + b^2 = c^2}{Test}
\end{document}

ergibt bei mir [siehe Anhang] -- also eigentlich genau das, was Du gar nicht haben wolltest ... wie hast Du das denn nun genau umgesetzt bzw. wo steckt mein Fehler?

MfG

FloSch369
09-03-2008, 22:20
Hi Rainer,

Deine Formel wird noch mittig auf die Seite und mit Einzug gesetzt. Daher klebt die Formelbeschreibung direkt dahinter und deswegen ist der Formelname auch nicht linksbündig. Damit sollte es klappen:

\documentclass{scrartcl}
\usepackage[fleqn]{amsmath}
\setlength\mathindent{0pt}
\newlength\designatorwidth
\newlength\descriptionwidth
\setlength\designatorwidth{0.33\linewidth}
\setlength\descriptionwidth{0.33\linewidth}
\newcommand{\formel}[4][aligned]
{
\begin{equation*}
\begin{minipage}[t]{\designatorwidth}% minipage des namens
#2
\end{minipage}% minipage des namens
\begin{#1}[t]
#3
\end{#1}
\hfill
\begin{minipage}[t]{\descriptionwidth}% minipage der Beschreibung
#4
\end{minipage}% minipage der beschreibung
\end{equation*}
}
\begin{document}
\noindent\hrulefill\par
\formel{Satz des Pythagoras}{a^2 + b^2 = c^2}{Test}
\end{document}
Tut mir leid, das hatte ich vergessen, bei mir hinzuschreiben. Dabei ist das natürlich wichtig :rolleyes: . Aber jetzt sollte das so stimmen und komplett sein.

Grüße
Florian

PS: Wer den Satz des Pythagoras jetzt noch immer nicht kann, dem kann ich auch nicht mehr helfen :D

rais
09-03-2008, 23:05
Moin Florian,


Deine Formel wird noch mittig auf die Seite und mit Einzug gesetzt. Daher klebt die Formelbeschreibung direkt dahinter und deswegen ist der Formelname auch nicht linksbündig. Damit sollte es klappen:

Ah, danke -- ich wusste doch, daß ich irgend etwas vergessen hab.;-)


PS: Wer den Satz des Pythagoras jetzt noch immer nicht kann, dem kann ich auch nicht mehr helfen :D
Ja, den Satz des Pythagoras sieht man oft in dieser Form, aber um es einmal pedantisch auszudrücken: a^2 + b^2 = c^2 gilt nur genau dann, wenn `c' auch die Hypotenuse (und damit `a' und 'b' die beiden Katheten) eines rechtwinkligen Dreiecks darstellt -- Du kannst genauso gut `a' zur Hypotenuse allein dadurch deklarieren, daß Du den rechten Winkel eben gegenüber der `a'-Linie ansiedelst, nur ... dann stimmt die Formel so nicht mehr -- und dabei geh ich schon davon aus, daß die drei Seiten eines rechtwinkligen Dreiecks überhaupt mit `a', `b' und `c' bezeichnet werden.;)

MfG