amsmath align* manipulando un contador mío

amsmath align* manipulando un contador mío
\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}

El comando \shortse define para cuando tengo \underseto \oversetcon \mathclapy \substackse \textcombina en el argumento under o over, como en el ejemplo, para mantener las complicaciones de ese argumento fuera de la ecuación y hacer que el código de la ecuación sea más legible. El comando \unshort(y su abreviatura en combinación con \undersety \overset) es el gemelo de \shortcolocar el argumento en su lugar. Cada uno de ellos se basa en un contador, con los contadores nombrados \mw@shortcnty \mw@unshortcnt, definiendo macros con un inicio estándar seguido del valor del contador (previamente incrementado globalmente para evitar conflictos en secuencias de \shorts) para expandirse al argumento que se recuperará más tarde, y recuperar el argumento colocado en el \shortmomento \mw@shortcnttenía un valor determinado ( \mw@unshortcnt, previamente incrementado globalmente en 1). El ejemplo se compila para:

ingrese la descripción de la imagen aquí

Ambos contadores comienzan en 0 según lo establecido. Entonces el shortcntse convierte en 2 debido a los dos \shorts. Y eso está bien. ¡Entonces abro el align*y unshortcntmágicamente se convierte en 2! Lo puse de nuevo a 0 manualmente, y los siguientes 20 muestran que el comando se ejecuta, ¡pero &de alguna manera lo deshace! ¿Que está sucediendo aquí? ¿Qué efecto tiene este align*entorno en mis contadores y por qué? Después de todo, tiene el prefijo mw@, me refiero al nombre del contador, entonces, ¿cómo puedo amsmathsaber algo sobre él para manipularlo? Actualizar: Parece que configurar el unshortcntvalor correcto manualmente la primera vez es suficiente para resolver esto... ¿por qué el primero &altera el contador mientras que el segundo no?

Editar: La idea de esto es la siguiente. Si escribo el código anterior con, por ejemplo:

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

Es casi ilegible. Así que quería almacenar el argumento ilegible y desordenado en algún lugar fuera de la ecuación, haciendo que las cosas sean más legibles en la ecuación. Empecé a hacer cosas como:

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

Para luego recuperar la \tempmacro dentro de la ecuación. Dado que se trataba de acortar y acortar los argumentos, parecía lógico tener una macro para encargarse de la definición y recuperación de la macro, y para crear el nombre. Aquí vino \shorty \unshort. Como el uso más frecuente de esto era en \underset, lo combiné \unshortcon él, dando como resultado \undershort. Entonces, el único propósito de estas macros era hacer que el código de ecuación fuera más legible.

Respuesta1

Los amsmathentornos de alineación pasan dos veces sobre el material. En el paso de medición, el condicional \ifmeasuring@se establece en verdadero; de lo contrario, es falso.

He hecho algunas modificaciones al código. Por ejemplo, tienes dos errores %después +1; Además, la configuración de los contadores era a veces local y a veces global, lo cual es incorrecto. Hay \@namedefy \@nameusepara evitar \expandafter\def\csname...\endcsnamey \csname...\endcsname.

Finalmente, lo usé \romannumeralen \@namedef, porque es mejor evitar las secuencias de control que terminan con dígitos. VerCómo implementar matrices (de bajo nivel) en TeXy en particular la respuesta 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}

ingrese la descripción de la imagen aquí

No hace falta decir que la tipografía es terrible.

información relacionada