为什么 \loop 的行为会根据其内容的顺序而有所不同?

为什么 \loop 的行为会根据其内容的顺序而有所不同?

只是出于好奇才问的。我测试了下面的代码,前两个{\loop...\repeat}命令返回了\TeX!\quad六次,其他命令返回了五次。为什么只有前两个{\loop...\repeat}命令返回\A(= \TeX!\quad) 六次?前两个命令和其余命令之间有什么区别?

\documentclass{article}
\begin{document}
\makeatletter
\newcount\cnt@a
\def\A{\TeX!\quad}
\def\B{\advance\cnt@a by-1}
\def\C{\ifnum\cnt@a>0}
\cnt@a=5
{\loop\A\B\C\repeat}

{\loop\A\C\B\repeat}

{\loop\B\A\C\repeat}

{\loop\B\C\A\repeat}

{\loop\C\A\B\repeat}

{\loop\C\B\A\repeat}
\end{document}

答案1

\B和的定义\C是问题:

\def\B{\advance\cnt@a by-1}
\def\C{\ifnum\cnt@a>0}

TeX 不会在数字末尾停止,而是继续扩展,直到找到一个不是数字的标记,例如:

\B1234\relax

将减少\cnt@a-11234,而不是 -1。或者

\B\C

然后\ifnum执行计数器减少。

这两种情况都可以通过在数字后附加一个空格来解决,这个空格会结束数字并且在排版时会被忽略:

\def\B{\advance\cnt@a by-1 }
\def\C{\ifnum\cnt@a>0 }

或者,也可以使用寄存器\m@ne或:\z@

\def\B{\advance\cnt@a by\m@ne}
\def\C{\ifnum\cnt@a>\z@}

完整示例:

\documentclass{article}
\begin{document}
\makeatletter
\newcount\cnt@a
\def\A{\TeX!\quad}
\def\B{\advance\cnt@a by-1 }
\def\C{\ifnum\cnt@a>0 }
\cnt@a=5
{\loop\A\B\C\repeat}

{\loop\A\C\B\repeat}

{\loop\B\A\C\repeat}

{\loop\B\C\A\repeat}

{\loop\C\A\B\repeat}

{\loop\C\B\A\repeat}
\end{document}

结果

相关内容