\documentclass[a4paper]{report}
\usepackage{amsmath,mathtools}
\makeatletter
\newcount\mw@shortcnt
\mw@shortcnt=0
\newcommand{\short}[1]{%
\global\advance\mw@shortcnt by +1%
\expandafter\def\csname temp\the\mw@shortcnt\endcsname{#1}
}
\newcount\mw@unshortcnt
\mw@unshortcnt=0
\newcommand{\unshort}{%
\global\advance\mw@unshortcnt by +1%
\csname temp\the\mw@unshortcnt\endcsname
}
\newcommand{\undershort}[1]{\underset{\unshort}{#1}}
\newcommand{\overshort}[1]{\overset{\unshort}{#1}}
\newcommand{\abbr}[2]{\expandafter\gdef\csname#1\endcsname{#2}}
\newcommand{\setshortcnt}[1]{\mw@shortcnt=#1}
\newcommand{\setunshortcnt}[1]{\mw@unshortcnt=#1}
\newcommand{\showshort}{\the\mw@shortcnt}
\newcommand{\showunshort}{\the\mw@unshortcnt}
\newcommand{\showboth}{\showshort\showunshort}
\makeatother
\newcommand{\ang}[1]{\left\langle #1\right\rangle}
\begin{document}
\showboth \\
\short{\mathclap{\substack{\text{posso portarmi da un membro all'altro la proiezione e $p_1$ idempotente.} \\ |}}}
\short{\mathclap{\substack{| \\ \text{commutano per ipotesi e $p_2$ porto a destra nel primo}}}}
\showboth \\
\begin{align*}
\showboth \\
\setunshortcnt{0}
\ang{x-p_1(p_2(x)\!),p_1(p_2(y)\!)}={}\text{\textit{\showboth}}&\text{\textit{\showboth}}\ang{x,p_1(p_2(y)\!)}-\ang{p_1p_2(x),p_1p_2(y)}\undershort{=}{} \\
{}={}&\ang{p_1(x),p_2(y)}-\ang{p_1(p_2(x)\!),p_2(y)}\undershort{=}\ang{p_2(p_1(x)\!),y}-\ang{p_1(x),p_2(y)}=0.
\end{align*}
\end{document}
Der Befehl \short
ist für definiert, wenn ich ein oder mit habe und \underset
im \overset
Unter- oder Überargument kombiniert bin, wie im Beispiel, um die Komplikationen dieses Arguments außerhalb der Gleichung zu halten und den Code der Gleichung lesbarer zu machen. Der Befehl (und seine Abkürzung in Kombination mit und ) ist das Zwillingszeichen von , um das Argument an die richtige Stelle zu setzen. Sie basieren jeweils auf einem Zähler, wobei die Zähler und benannt sind , und definieren Makros mit einem Standardanfang, gefolgt vom Wert des Zählers (der zuvor global erhöht wurde, um Konflikte in Folgen von s zu vermeiden), um auf das Argument zu erweitern, das später wiederhergestellt werden soll, und stellen das in platzierte Argument wieder her, wenn es einen bestimmten Wert hatte ( , zuvor global um 1 erhöht). Das Beispiel wird zu folgendem kompiliert:\mathclap
\substack
\text
\unshort
\underset
\overset
\short
\mw@shortcnt
\mw@unshortcnt
\short
\short
\mw@shortcnt
\mw@unshortcnt
Beide Zähler beginnen bei 0, wie eingestellt. Dann shortcnt
wird der aufgrund der beiden \short
s zu 2. Und das ist in Ordnung. Dann öffne ich den align*
und der unshortcnt
wird wie durch Zauberhand zu 2! Ich setze ihn manuell auf 0 zurück und die folgenden 20 zeigen, dass der Befehl ausgeführt wird, aber der &
macht das irgendwie rückgängig! Was passiert hier? Was macht diese align*
Umgebung mit meinen Zählern und warum? Immerhin ist ihm ein Präfix vorangestellt mw@
, ich meine den Zählernamen, also woher kann ich amsmath
etwas darüber wissen, um es zu manipulieren?
Aktualisieren:
Es sieht so aus, als ob es unshortcnt
ausreicht, die richtige Einstellung beim ersten Mal manuell vorzunehmen, um das Problem zu lösen. Warum wird beim ersten Mal &
der Zähler durcheinandergebracht, während dies beim zweiten Mal nicht der Fall ist?
Bearbeiten: Die Idee dahinter ist folgende. Wenn ich den obigen Code beispielsweise mit folgendem schreibe:
`\overset{\mathclap{\substack{\text{posso portarmi da un membro all'altro la proiezione e $p_1$ idempotente.} \\ |}{=}
Es ist nahezu unlesbar. Deshalb wollte ich das chaotische, unlesbare Argument irgendwo außerhalb der Gleichung speichern, um die Dinge in der Gleichung lesbarer zu machen. Ich begann, Dinge zu tun wie:
\def\temp{\mathclap{\substack{\text{posso portarmi da un membro all'altro la proiezione e $p_1$ idempotente.} \\ |}
Um dann das \temp
Makro innerhalb der Gleichung wieder aufzurufen. Da es sich um eine Verkürzung und Entkürzung der Argumente handelte, schien es logisch, ein Makro zu haben, das sich um die Makrodefinition und den Abruf kümmert und den Namen erstellt. Hier kamen \short
und \unshort
. Da dies am häufigsten in verwendet wurde , habe ich es damit \underset
kombiniert , was zu ergab . Der einzige Zweck dieser Makros bestand also darin, den Gleichungscode lesbarer zu machen.\unshort
\undershort
Antwort1
Die amsmath
Alignment-Umgebungen durchlaufen das Material zweimal. Beim Messdurchgang \ifmeasuring@
wird die Bedingung auf true gesetzt, andernfalls auf false.
Ich habe einige Änderungen am Code vorgenommen. Beispielsweise haben Sie zwei falsche %
nach +1
; außerdem waren Ihre Einstellungen der Zähler manchmal lokal und manchmal global, was falsch ist. Es gibt \@namedef
und \@nameuse
zur Vermeidung von \expandafter\def\csname...\endcsname
und \csname...\endcsname
.
Schließlich habe ich \romannumeral
in verwendet \@namedef
, da Steuersequenzen, die mit Ziffern enden, am besten vermieden werden. SieheSo implementieren Sie (Low-Level-)Arrays in TeXund insbesondere die Antwort von Bruno Le Floch.
\documentclass[a4paper]{report}
\usepackage{amsmath,mathtools}
\makeatletter
\newcount\mw@shortcnt
\newcommand{\short}[1]{%
\ifmeasuring@\else
\global\advance\mw@shortcnt\@ne
\@namedef{mickgtemp\romannumeral\mw@shortcnt}{#1}
\fi
}
\newcount\mw@unshortcnt
\newcommand{\unshort}{%
\ifmeasuring@\else
\global\advance\mw@unshortcnt\@ne
\@nameuse{mickgtemp\romannumeral\mw@unshortcnt}%
\fi
}
\newcommand{\undershort}[1]{\underset{\unshort}{#1}}
\newcommand{\overshort}[1]{\overset{\unshort}{#1}}
\newcommand{\abbr}[2]{\global\@namedef{#1}{#2}}
\newcommand{\setshortcnt}[1]{\global\mw@shortcnt=#1\relax}
\newcommand{\setunshortcnt}[1]{\global\mw@unshortcnt=#1\relax}
\newcommand{\showshort}{\the\mw@shortcnt}
\newcommand{\showunshort}{\the\mw@unshortcnt}
\newcommand{\showboth}{\showshort\showunshort}
\makeatother
\newcommand{\ang}[1]{\left\langle #1\right\rangle}
\begin{document}
\showboth \\
\short{\mathclap{\substack{\text{posso portarmi da un membro all'altro la proiezione e $p_1$ idempotente.} \\ |}}}
\short{\mathclap{\substack{| \\ \text{commutano per ipotesi e $p_2$ porto a destra nel primo}}}}
\showboth \\
\begin{align*}
\showboth \\
\setunshortcnt{0}
\ang{x-p_1(p_2(x)\!),p_1(p_2(y)\!)}={}\text{\textit{\showboth}}&\text{\textit{\showboth}}\ang{x,p_1(p_2(y)\!)}-\ang{p_1p_2(x),p_1p_2(y)}\undershort{=}{} \\
{}={}&\ang{p_1(x),p_2(y)}-\ang{p_1(p_2(x)\!),p_2(y)}\undershort{=}\ang{p_2(p_1(x)\!),y}-\ang{p_1(x),p_2(y)}=0.
\end{align*}
\end{document}
Es versteht sich von selbst, dass die Typografie schrecklich ist.