amsmath align* adulterando um contador meu

amsmath align* adulterando um contador meu
\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}

O comando \shorté definido para quando tenho um \undersetou \oversetcom \mathclap, \substacke \textcombinado no argumento under ou over, como no exemplo, para manter as complicações desse argumento fora da equação e tornar o código da equação mais legível. O comando \unshort(e sua abreviatura em combinação com \undersete \overset) é gêmeo de \shortcolocar o argumento no lugar. Cada um deles depende de um contador, com os contadores nomeados \mw@shortcnte \mw@unshortcnt, definindo macros com um início padrão seguido pelo valor do contador (previamente incrementado globalmente para evitar conflito em sequências de \shorts) para expandir para o argumento que será recuperado posteriormente, e recuperando o argumento colocado em \shortquando \mw@shortcntestava em um determinado valor ( \mw@unshortcnt, anteriormente incrementado globalmente em 1). O exemplo compila para:

insira a descrição da imagem aqui

Ambos os contadores começam em 0 conforme definido. Então o shortcnttorna-se 2 por causa dos dois \shorts. E está tudo bem. Então eu abro align*e unshortcntmagicamente se torna 2! Eu configurei de volta para 0 manualmente, e os 20 seguintes mostram que o comando foi executado, mas &de alguma forma desfaz isso! O que esta acontecendo aqui? O que esse align*ambiente faz com meus contadores e por quê? Afinal, ele é prefixado com mw@, quero dizer, o nome do contador, então como posso amsmathsaber algo sobre ele para adulterá-lo? Atualizar: Parece que acertar unshortcntmanualmente na primeira vez é suficiente para resolver isso… por que o primeiro &bagunça o contador e o segundo não?

Editar: A ideia disso é a seguinte. Se eu escrever o código acima com, por exemplo:

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

É quase ilegível. Então, eu queria armazenar o argumento confuso e ilegível em algum lugar fora da equação, tornando as coisas mais legíveis na equação. Comecei a fazer coisas como:

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

Para então recuperar a \tempmacro dentro da equação. Por se tratar de um encurtamento e encurtamento dos argumentos, parecia lógico ter uma macro para cuidar da definição e recuperação da macro, e para criar o nome. Aí veio \shorte \unshort. Como o uso mais frequente disso foi em \underset, combinei \unshortcom ele, rendendo \undershort. Portanto, o único propósito dessas macros era tornar o código da equação mais legível.

Responder1

Os amsmathambientes de alinhamento passam duas vezes sobre o material. Na passagem de medição, a condicional \ifmeasuring@é definida como verdadeira, caso contrário é falsa.

Fiz algumas alterações no código. Por exemplo, você tem dois erros %depois +1; Além disso, as configurações dos contadores às vezes eram locais, às vezes globais, o que está errado. Existem \@namedefe \@nameusepara evitar \expandafter\def\csname...\endcsnamee \csname...\endcsname.

Finalmente, usei \romannumeralno \@namedef, porque é melhor evitar sequências de controle que terminam com dígitos. VerComo implementar arrays (de baixo nível) no TeXe em particular a resposta de 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}

insira a descrição da imagem aqui

Nem é preciso dizer que a tipografia é terrível.

informação relacionada