amsmath align* 私のカウンターを改ざんする

amsmath align* 私のカウンターを改ざんする
\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}

コマンドは、またはが とともにあり、例のように under または over 引数で結合されている\short場合に に対して定義されます。これにより、その引数の複雑さが式の外側に保持され、式のコードが読みやすくなります。 コマンド (およびと組み合わせたその省略形)は、引数を所定の場所に配置するの双子です。 これらはそれぞれカウンタに依存しており、カウンタは およびと呼ばれ、標準の開始に続いてカウンタの値 ( のシーケンスの競合を避けるために事前にグローバルに増分されている) を持つマクロを定義して、後で回復される引数に展開し、 が特定の値 ( 、事前にグローバルに 1 ずつ増分されている) であった場合に に配置された引数を回復します。 この例は次のようにコンパイルされます。\underset\overset\mathclap\substack\text\unshort\underset\overset\short\mw@shortcnt\mw@unshortcnt\short\short\mw@shortcnt\mw@unshortcnt

ここに画像の説明を入力してください

両方のカウンターは設定どおり 0 から始まります。次に はshortcnt2 つの があるため 2 になります\short。これは問題ありません。次に を開くalign*と はunshortcnt魔法のように 2 になります。手動で 0 に戻すと、次の 20 はコマンドが実行されたことを示していますが、 は&どういうわけかそれを元に戻します。ここで何が起こっているのでしょうか。このalign*環境はカウンターに何を行い、なぜ行うのでしょうか。結局のところ、 はカウンター名である で始まっているので、それについて何か知り、改ざん mw@できるでしょうか。amsmathアップデート:unshortcnt最初に手動で正しく 設定すれば、この問題を解決するのに十分なようです... 最初は&カウンターが混乱するのに、2 回目は混乱しないのはなぜですか?

編集: この考え方は次のとおりです。上記のコードを次のように記述すると:

`\overset{\mathclap{\substack{\text{posso portarmi da un membro all'altro la proiezione e $p_1$ idempotente.} \\ |}{=}

ほとんど読めません。そこで、読みにくい乱雑な引数を式の外側のどこかに保存して、式内のものをより読みやすくしたいと考えました。次のようなことを始めました。

\def\temp{\mathclap{\substack{\text{posso portarmi da un membro all'altro la proiezione e $p_1$ idempotente.} \\ |}

次に、\temp方程式内でマクロを呼び出します。引数の短縮と復元なので、マクロの定義と呼び出しを処理し、名前を作成するマクロを用意するのが理にかなっているように思われます。ここで\shortとが登場しました\unshort。これは で最も頻繁に使用されるため\underset\unshortと組み合わせて を作成しました\undershort。したがって、これらのマクロの唯一の目的は、方程式コードをより読みやすくすることでした。

答え1

アライメントamsmath環境は、材料を 2 回通過します。測定パスでは、条件は\ifmeasuring@true に設定され、それ以外の場合は false になります。

コードにいくつか修正を加えました。たとえば、%の後に2 つの誤りがあります。また、カウンターの設定がローカルの場合もあればグローバルの場合もあり、これは誤りです。と を回避するためにと が+1あります。\@namedef\@nameuse\expandafter\def\csname...\endcsname\csname...\endcsname

最後に、数字で終わる制御シーケンスは避けたほうがよいため、\romannumeralを使用しました。\@namedefTeX で (低レベルの) 配列を実装する方法特に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}

ここに画像の説明を入力してください

言うまでもなく、タイポグラフィはひどいです。

関連情報