amsmath align* manipuliert einen meiner Zähler

amsmath align* manipuliert einen meiner Zähler
\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 \shortist für definiert, wenn ich ein oder mit habe und \undersetim \oversetUnter- 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

Bildbeschreibung hier eingeben

Beide Zähler beginnen bei 0, wie eingestellt. Dann shortcntwird der aufgrund der beiden \shorts zu 2. Und das ist in Ordnung. Dann öffne ich den align*und der unshortcntwird 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 amsmathetwas darüber wissen, um es zu manipulieren? Aktualisieren: Es sieht so aus, als ob es unshortcntausreicht, 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 \tempMakro 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 \shortund \unshort. Da dies am häufigsten in verwendet wurde , habe ich es damit \undersetkombiniert , was zu ergab . Der einzige Zweck dieser Makros bestand also darin, den Gleichungscode lesbarer zu machen.\unshort\undershort

Antwort1

Die amsmathAlignment-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 \@namedefund \@nameusezur Vermeidung von \expandafter\def\csname...\endcsnameund \csname...\endcsname.

Schließlich habe ich \romannumeralin 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}

Bildbeschreibung hier eingeben

Es versteht sich von selbst, dass die Typografie schrecklich ist.

verwandte Informationen