\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 \short
se define para cuando tengo \underset
o \overset
con \mathclap
y \substack
se \text
combina 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 \underset
y \overset
) es el gemelo de \short
colocar el argumento en su lugar. Cada uno de ellos se basa en un contador, con los contadores nombrados \mw@shortcnt
y \mw@unshortcnt
, definiendo macros con un inicio estándar seguido del valor del contador (previamente incrementado globalmente para evitar conflictos en secuencias de \short
s) para expandirse al argumento que se recuperará más tarde, y recuperar el argumento colocado en el \short
momento \mw@shortcnt
tenía un valor determinado ( \mw@unshortcnt
, previamente incrementado globalmente en 1). El ejemplo se compila para:
Ambos contadores comienzan en 0 según lo establecido. Entonces el shortcnt
se convierte en 2 debido a los dos \short
s. Y eso está bien. ¡Entonces abro el align*
y unshortcnt
má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 amsmath
saber algo sobre él para manipularlo?
Actualizar:
Parece que configurar el unshortcnt
valor 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 \temp
macro 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 \short
y \unshort
. Como el uso más frecuente de esto era en \underset
, lo combiné \unshort
con é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 amsmath
entornos 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 \@namedef
y \@nameuse
para evitar \expandafter\def\csname...\endcsname
y \csname...\endcsname
.
Finalmente, lo usé \romannumeral
en \@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}
No hace falta decir que la tipografía es terrible.