eqnarray vs. align

Formelsatz für Mathematik, Naturwissenschaften und Technik


dribkcalb
Forum-Newbie
Forum-Newbie
Beiträge: 4
Registriert: Mo 27. Jan 2014, 09:31

eqnarray vs. align

Beitrag von dribkcalb »

Hallo! Im Zusammenhang mit Fragen zur Formelerstellung mit eqnarray wird ja immer wieder darauf hingewiesen, dass man doch bitte anstelle von eqnarray die align-Umgebung verwenden sollte. Nun würde ich das ja gerne tun, wenn mir align die richtige Ausgabe erzeugen würde. Folgendes ist mein Problem: Ich versuche einen mathematischen Beweis aufzuschreiben. Manchmal sollen dann über den Relationszeichen noch Kommentare zur besseren Verständlichkeit sitzen. Klappt recht gut mit eqnarray, mit align irgendwie nicht. Ich habe mal ein kleines Beispiel, um mein Problem zu verdeutlichen:
\documentclass[11pt,ngerman,a4paper,DIV11,]{scrartcl}
\usepackage {amsmath} %Mathe-Umgebung
\begin{document}
\begin{eqnarray}
 \forall\;u\in D(A+B)\colon \langle (A+B)u\vert x\rangle &=& \langle Au\vert x\rangle+\langle Bu\vert x\rangle \nonumber\\
 &\overset{x\in D(A^*)}{=}& \langle u\vert A^*x\rangle+\langle u\vert B^*x\rangle \nonumber\\
 &=& \langle u\vert (A^*+B^*)x\rangle \nonumber
\end{eqnarray} 
\begin{align}
 \forall\;u\in D(A+B)\colon \langle (A+B)u\vert x\rangle &= \langle Au\vert x\rangle+\langle Bu\vert x\rangle \nonumber\\
 &\overset{x\in D(A^*)}{=} \langle u\vert A^*x\rangle+\langle u\vert B^*x\rangle \nonumber\\
 &= \langle u\vert (A^*+B^*)x\rangle \nonumber
\end{align} 
\end{document}
Also: Die Gleichheitszeichen sollen, wie in eqnarray, schön zentriert untereinander stehen. Wie man sieht, wird das bei align aber linksbündig geschrieben. Wie bekomme ich denn das korrekte Aussehen (wie mit eqnarray) mit der align-Umgebung hin?

Felix
Forum-Century
Forum-Century
Beiträge: 210
Registriert: Sa 25. Jan 2014, 13:57

Beitrag von Felix »

Das Problem ist lediglich die Breite des Ausdrucks über dem Relationszeichen. Bei eqnarray siehst Du auch, dass es die Abstände am Relationszeichen zerstört. Man kann die Breite reduzieren bzw. auf Null setzen.

Zum Beispiel mit \mathclap von mathtools:
\documentclass[11pt,ngerman,a4paper,DIV11,]{scrartcl}
\usepackage{mathtools}
\begin{document}
\begin{align}
 \forall\;u\in D(A+B)\colon \langle (A+B)u\vert x\rangle &= \langle Au\vert x\rangle+\langle Bu\vert x\rangle \nonumber\\
 &\overset{\mathclap{x\in D(A^*)}}{=} \langle u\vert A^*x\rangle+\langle u\vert B^*x\rangle \nonumber\\
 &= \langle u\vert (A^*+B^*)x\rangle \nonumber
\end{align}
\end{document} 
Du könntest auch \stackrel statt \overset verwenden. Und wenn Du mathtools nicht willst oder hast, geht auch \makebox, wie in
\stackrel{\makebox[0pt]{\scriptsize$x\in D(A^*)$}}{=}
.

Du kannst auch den anderen Weg gehen, und die anderen Gleichheitszeichen "verbreitern", wenn Dir das sonst zu dicht ist. Halte ich auch nicht für schön. Und das ist für mich ein Indiz, dass es in einem ernsthaften mathematischen Dokument vielleicht gar nicht so geschrieben wird. An Tafel oder Übungszettel kein Problem, bei einer schriftlichen Arbeit hingegen würde ich zuerst schauen, ob Fachbücher solche Schritte ebenfalls mit Drübersetzen über Relationszeichen illustrieren.

Felix
Ein TikZ Süchtiger :-)

dribkcalb
Forum-Newbie
Forum-Newbie
Beiträge: 4
Registriert: Mo 27. Jan 2014, 09:31

Beitrag von dribkcalb »

Danke Felix für die Antwort, leider ist das gar nicht, was ich wollte...

Die Kommentare über den Relationszeichen sind natürlich immer breiter als das eigentliche Zeichen, da führt kein Weg dran vorbei. Mit dem \mathclap hab ich doch aber jetzt Dinge auf-/übereinander stehen - sieht auch nicht wirklich gut aus (Zumal ich hier ein eher einfaches Beispiel gewählt hab - stell dir mal ein Integral am Anfang vor und dann schreibt mir das den Text darüber :( ). Eigentlich hätte ich wirklich gern den Weg gewusst, wie ich mit align exakt die selbe Ansicht erhalte wie mit eqnarray (siehe Minimalbeispiel) - also eine zentrierte Darstellung des Relationszeichen(?) (bzw. allem was dazugehört, bei mir also auch die Schrift darüber). Den "zerstörten" Abstand beim Relationszeichen nehme ich bewusst in Kauf, bzw. ist er ja genau das, was ich will (möglicherweise gibts auch ne bessere Darstellung solcher Sachverhalte, mein Minibeispiel zeigt allerdings die meines Wissens beste Realisiserung).

Wer sich jetzt fragt, warum ich nicht einfach weiter eqnarray verwende: die Umgebung hat noch weitere Tücken und sollte nicht mehr verwendet werden. Ich will jetzt hier keine Romane schreiben, warum und weshalb, es gibt schon genug Dokus, die genau das zum Thema haben. Meine Frage dreht sich eigentlich darum, dass ich eqnarray nicht mehr verwenden möchte, aber noch keine Möglichkeit gefunden habe, eine gleichwertige Lösung mit einem alternativen Befehl zu erzeugen.

sudo
Forum-Guru
Forum-Guru
Beiträge: 459
Registriert: Mi 3. Okt 2012, 11:32

Beitrag von sudo »

Dann probiere doch mal das von Felix vorgeschlagene breiter machen:
\documentclass[11pt,ngerman,a4paper,DIV11,]{scrartcl} 
\usepackage {amsmath} %Mathe-Umgebung 
\begin{document} 
\begin{align} 
 \forall\;u\in D(A+B)\colon \langle (A+B)u\vert x\rangle 
 &\overset{\hphantom{x\in D(A^*)}}{=} \langle Au\vert x\rangle+\langle Bu\vert x\rangle \nonumber\\ 
 &\overset{x\in D(A^*)}{=} \langle u\vert A^*x\rangle+\langle u\vert B^*x\rangle \nonumber\\ 
 &\overset{\hphantom{x\in D(A^*)}}{=} \langle u\vert (A^*+B^*)x\rangle \nonumber 
\end{align} 
\end{document}
Ein vollständiges Minimalbeispiel (VM) zu erzeugen, ist gar nicht schwer und hilft ganz oft, Fehler selber zu finden. Ohne bekommt man selten gute Antworten. Anleitungen findest du z.B. im golatex Wiki auf TeXWelt oder minimalbeipiel.de
Außerdem hilft das Lesen dieser Seite, Fragen richtig zu stellen.

Studi
Forum-Century
Forum-Century
Beiträge: 185
Registriert: So 5. Jan 2014, 20:18

Beitrag von Studi »

Als Alternative zum Vorschlag von sudo, Felix' Hinweis mal mit Makro:

- mit \widest sagt man TeX vor der align-Umgebung, was der breiteste Ausdruck ist
- \wideequal schreibt ein Gleichheitszeichen und lässt ausreichend Platz

Die Definition am Anfang sieht kompliziert aus (ist aber straightforward), erspart einem das Schreiben mit wiederholtem \overset oder \stackrel und \hphantom später.
\documentclass[11pt,ngerman,a4paper,DIV11,]{scrartcl}
\usepackage{mathtools}
\newlength{\wide}{}
\newcommand*{\widestExpression}{}
\newcommand*{\widest}[1]{%
  \renewcommand*{\widestExpression}{#1}}
\newcommand*{\wideequal}{%
  \settowidth{\wide}{$\stackrel{\widestExpression}{=}$}%
  \mathrel{\makebox[\wide]{=}}}
\begin{document}
\widest{x\in D(A^*)}
\begin{align}
 \forall\;u\in D(A+B)\colon \langle (A+B)u\vert x\rangle &\wideequal \langle Au\vert x\rangle+\langle Bu\vert x\rangle \nonumber\\
 &\stackrel{x\in D(A^*)}{=} \langle u\vert A^*x\rangle+\langle u\vert B^*x\rangle \nonumber\\
 &\wideequal \langle u\vert (A^*+B^*)x\rangle \nonumber
\end{align}
\end{document}
Studi

dribkcalb
Forum-Newbie
Forum-Newbie
Beiträge: 4
Registriert: Mo 27. Jan 2014, 09:31

Beitrag von dribkcalb »

Wow, das sieht ja richtig gut aus. Danke Leute!

Mit dem ersten Vorschlag zu "breiter machen" konnte ich mich nicht richtig anfreunden. Auch wenn das nun gut aussah, ist dieses jedes mal \hphantom... doch recht aufwändig. Ganz zu schweigen davon, dass man erstmal das breiteste finden müsste (meine bisher längster Beweis dieser Art geht über 3 Seiten und hat in fast jeder zweiten Zeile was überm Zeichen stehn - natürlich immer was anderes).

Aber natürlich kann man das auch skripten, wie von Studi gezeigt - Super!

Ich hab das ganze mal noch allgemeiner, weils ja nicht nur Gleichheitszeichen gibt, für beliebige Relation als
\newcommand*{\widerela}[1]{%
  \settowidth{\wide}{$\stackrel{\widestExpression}{=}$}%
  \mathrel{\makebox[\wide]{$#1$}}}
Jetzt würde mich ja nur noch interessieren, wie man die Definition \widestExpression hinbekommt. Das ist doch rekursiv, oder? Hab das mal versucht, selbst zu durchdenken und hab jetzt nen Knoten im Kopf....

dribkcalb
Forum-Newbie
Forum-Newbie
Beiträge: 4
Registriert: Mo 27. Jan 2014, 09:31

Beitrag von dribkcalb »

Achja, nun nochmal die Bemerkung von Felix ganz am Anfang. Du hast sicher recht - der "zerstörte" Abstand am Relationszeichen wirkt erstmal unschön. Ist aber meiner Ansicht nach notwendig. Außerdem soll das ganze demnächst als Fachbuch veröffentlicht werden - die Formeln kommen von 2 "richtigen" Mathematikdoktoren hier an der Uni und die haben sich noch nicht über das Layout beschwert. Aber bei denen liegt der Schwerpunkt auch eher im Inhalt, nicht in der Darstellung. Wenns hier also ne "bessere" Idee zur Umsetzung des Sachverhaltes geht - ich bin für Vorschläge offen und dankbar.

sudo
Forum-Guru
Forum-Guru
Beiträge: 459
Registriert: Mi 3. Okt 2012, 11:32

Beitrag von sudo »

Also eine Alternative wäre, die Bedingungen in kurze Texte zu schreiben:
\documentclass[11pt,ngerman,a4paper,DIV11,]{scrartcl} 
\usepackage {mathtools} %Mathe-Paket
\begin{document} 
\begin{align} 
 \forall\;u\in D(A+B)\colon \langle (A+B)u\vert x\rangle 
 &= \langle Au\vert x\rangle+\langle Bu\vert x\rangle \nonumber\\ 
\shortintertext{Wenn $x\in D(A^*)$}
 &= \langle u\vert A^*x\rangle+\langle u\vert B^*x\rangle \nonumber\\ 
 &= \langle u\vert (A^*+B^*)x\rangle \nonumber 
\end{align} 
\end{document}
\shortintertext ist dabei für kurze Zwischentexte. amsmath selbst stellt nur \intertext bereit. Ein weiterer Vorteil ist, dass vor und nach diesen Zwischentexten auch Seitenumbrüche stattfinden können. Das macht sich bei 3 Seiten langen Beweisen vielleicht ganz gut ;-)
Ein vollständiges Minimalbeispiel (VM) zu erzeugen, ist gar nicht schwer und hilft ganz oft, Fehler selber zu finden. Ohne bekommt man selten gute Antworten. Anleitungen findest du z.B. im golatex Wiki auf TeXWelt oder minimalbeipiel.de
Außerdem hilft das Lesen dieser Seite, Fragen richtig zu stellen.

Studi
Forum-Century
Forum-Century
Beiträge: 185
Registriert: So 5. Jan 2014, 20:18

Beitrag von Studi »

dribkcalb hat geschrieben:Jetzt würde mich ja nur noch interessieren, wie man die Definition \widestExpression hinbekommt. Das ist doch rekursiv, oder? Hab das mal versucht, selbst zu durchdenken und hab jetzt nen Knoten im Kopf....
Am einfachsten, einfach mit \renewcommand*{\widestExpression}{...} setzen, kann man auch direkt im Text. Oben hab ich ein Makro \widest dafür gemacht, damit man es per Makro und Argument setzen kann. Könnte ja bequemer und besser im Dokument zu lesen sein.

Ich habe auch daran gedacht, es per optionales Argument an \widerel setzen zu lassen, also verwenden (wenn optionales Argument nicht gegeben) oder setzen (wenn optionales Argument angeben ist). Optionales Argument mit Voreinstellung \widestExpression, später wird \widestExpression auf den Wert des optionalen Arguments gesetzt. Klingt auch nach Rekursion. ;-) "Rekursive" Sachen kriegt man auch hin, indem man die Expansionsreihenfolge ändert. Wenn Du sowas wirklich willst, frag genauer, ich seh nicht, was exakt Du meinst.

Man kann das breiteste Element auch automatisch bestimmen lassen wenn es mehrere gibt.

Die letzten beiden Gedanken sind aber sicherlich übertrieben, in der Praxis muss man nicht alles austüfteln, was man automatisieren könnte, das kostet viel Zeit, wenn man das gleiche Ergebnis wie oben genauso hinkriegt. Bei \widerela würde ich das eine = drinnen auch noch ersetzen, und das Argument optional machen mit Voreinstellung =, also \newcommand*{\widerela}[1][=]{...}

Studi

Antworten