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}

이 명령은 예와 같이 or with 가 있고 under 또는 over 인수에 결합 되어 해당 인수의 복잡도를 방정식 외부에 유지하고 방정식 코드를 더 읽기 쉽게 만드는 \short경우에 대해 정의됩니다 . 명령 (및 및 와 함께 사용된 약어 )은 인수를 제자리에 배치하는 의 쌍둥이입니다 . 그들은 각각 및 라는 이름의 카운터가 있는 카운터에 의존하며 표준 시작 과 카운터 값(이전에는 s 시퀀스의 충돌을 피하기 위해 전역적으로 증가됨)으로 매크로를 정의하여 나중에 복구할 인수로 확장하고 복구합니다. 특정 값( 이전에는 전역적으로 1씩 증가) 에 있었던 경우 에 배치된 인수입니다 . 예제는 다음과 같이 컴파일됩니다.\underset\overset\mathclap\substack\text\unshort\underset\overset\short\mw@shortcnt\mw@unshortcnt\short\short\mw@shortcnt\mw@unshortcnt

여기에 이미지 설명을 입력하세요

두 카운터는 모두 설정된 대로 0부터 시작합니다. 그러면 shortcnt2 s 때문에 는 2가 됩니다 \short. 그리고 그것은 괜찮습니다. 그런 다음 뚜껑을 열면 마술 align*처럼 unshortcnt2가 됩니다! 수동으로 다시 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에서 (저수준) 배열을 구현하는 방법특히 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}

여기에 이미지 설명을 입력하세요

타이포그래피가 끔찍하다는 것은 말할 필요도 없습니다.

관련 정보