amsmathalign* 篡改我的計數器

amsmathalign* 篡改我的計數器
\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}

該命令\short是在我有\undersetor \oversetwith時定義的\mathclap\substack\text在under 或over 參數中組合(如示例中所示),以將該參數的複雜性保留在方程式之外,並使方程式的程式碼更具可讀性。此指令(及其與和\unshort組合的縮寫)是放置參數的孿生指令。它們都依賴於一個計數器,計數器名為和,用標準開始定義宏,後跟計數器的值(之前全局遞增以避免s 序列中的衝突)以擴展到稍後要恢復的參數,並恢復放置在when處於某個值(,之前全域遞增 1)。此範例編譯為:\underset\overset\short\mw@shortcnt\mw@unshortcnt\short\short\mw@shortcnt\mw@unshortcnt

在此輸入影像描述

兩個計數器均按設定從 0 開始。然後shortcnt由於有兩個\shorts,所以 變成 2。沒關係。然後我打開align*unshortcnt神奇地變成了 2!我手動將其設置回 0,下面的 20 顯示命令已執行,但不知&何故撤消了該操作!這裡發生了什麼事?此align*環境對我的計數器有何影響?畢竟它的前綴是mw@,我的意思是計數器名稱,那麼如何amsmath知道它的任何資訊來篡改它呢? 更新: 看起來unshortcnt第一次手動設定正確的值足以解決這個問題…為什麼第一次會&弄亂計數器,而第二次卻不會?

編輯: 這個想法如下。如果我用例如寫上面的程式碼:

`\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環境經過材料兩次。在測量過程中,條件\ifmeasuring@設定為 true,否則為 false。

我對程式碼做了一些修改。例如,你%之後有兩個錯誤+1;另外,您的計數器設定有時是本地的,有時是全域的,這是錯誤的。有\@namedef\@nameuse用於避免\expandafter\def\csname...\endcsname\csname...\endcsname

最後,我\romannumeral在 中使用\@namedef,因為最好避免以數字結尾的控制序列。看如何在 TeX 中實現(低級)數組特別是布魯諾·勒弗洛赫的回答。

\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}

在此輸入影像描述

不言而喻,排版很糟糕。

相關內容