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}

当我有一个或和时,命令\short定义为,并像示例中那样在 under 或 over 参数中组合,以将该参数的复杂性保持在等式之外并使等式的代码更具可读性。命令(及其与和组合的缩写)是 的孪生兄弟,用于将参数放置在适当位置。它们每个都依赖于一个计数器,计数器名为和,定义具有标准开头的宏,后跟计数器的值(先前全局递增以避免s 序列中发生冲突)以扩展为稍后要恢复的参数,并恢复放置在当为某个值(,先前全局递增 1)时的参数。该示例编译为:\underset\overset\mathclap\substack\text\unshort\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@设置为真,否则为假。

我对代码做了一些修改。例如,%在 之后你有两个错误+1;此外,你的计数器设置有时是局部的,有时是全局的,这是错误的。为了避免和 ,有\@namedef和。\@nameuse\expandafter\def\csname...\endcsname\csname...\endcsname

最后,我使用了\romannumeral\@namedef因为最好避免使用以数字结尾的控制序列。请参阅如何在 TeX 中实现(低级)数组特别是 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}

在此处输入图片描述

毋庸置疑,字体排版非常糟糕。

相关内容