只是出于好奇才问的。我测试了下面的代码,前两个{\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}