Макрорасширение внутри массива

Макрорасширение внутри массива

Я застрял на следующем фрагменте TeX:

\def\foo{A}
\def\bar{\foo}
\let\baz\bar
1: \baz
\def\foo{B}
\\
2: \baz
\\

\begin{array}[t]{r}
\def\foo{C}
3: \baz
\\
\def\foo{D}
4: \baz
\\
5: \baz
\end{array}

\begin{enumerate}
\def\foo{E}
\item[6:] \baz

\item[7:]
\def\foo{F}
\baz

\item[8:] \baz
\end{enumerate}

Этот фрагмент TeX отображается следующим образом:

1: A
2: B

3: C
4: D
5: B

6: E
7: F
8: F

Теперь строки 1 и 2 ведут себя так, как и ожидалось, после переопределения \fooновое значение выводится на печать. Однако при обертывании в массив строка 5 выводится Bтам, где я ожидал D. Макросы работают так, как и ожидалось, когда находятся внутри enumerate (строки 6-8).

Как так получается, что строка 5 печатает как Bвместо Dи как исправить определение макросов? Я предполагаю, что что-то странное происходит с расширением внутри массива. Я пробовал изменить массив на выравнивание, но это проявляет ту же проблему.

решение1

Это вполне ожидаемо.

\def\foo{A}     % now \foo expands to A
\def\bar{\foo}  % now \bar expands to \foo
\let\baz\bar    % now \baz expands to \foo
1: \baz         % we get \foo, then A
\def\foo{B}     % now \foo expands to B
\\
2: \baz         % we get \foo, then B
\\

\begin{array}[t]{r}
\def\foo{C}     % now \foo expands to C
3: \baz         % we get \foo, then C
\\              % end of cell, \foo reverts to B
\def\foo{D}     % now \foo expands to D
4: \baz         % we get \foo, then D
\\              % end of cell, \foo reverts to B
5: \baz         % we get \foo, then B
\end{array}

\begin{enumerate}
\def\foo{E}     % now \foo expands to E
\item[6:] \baz  % we get \foo, then E

\item[7:]
\def\foo{F}     % now \foo expands to F
\baz            % we get \foo, then F

\item[8:] \baz  % we get \foo, then F
\end{enumerate}

Ячейки в arrayобразуют группы. Неясно, чего вы хотите добиться, но если вы хотите, чтобы определение \fooвыходило за рамки групп, вам нужно \gdefвместо \def.

В частности, какова роль \bar? Вы никогда не используете его, за исключением случаев, когда определяете \bazего как псевдоним.

Связанный контент