我认为我的问题的答案是“不”,但有人可能会说如果有的话会很好。以下是提出这个问题的原因。定义
\def\myloop#1#2{\count11=#1#2%
\advance\count11 by -1\ %
\ifnum\count11>0{\myloop{\count11}{#2}}\fi}
\myloop{4}{T}
然后产生T T T T
(注意末尾的额外空格)。输出末尾不需要的空格是由于定义中的空格需要终止命令\advance
。空格有两个作用:它既充当编程语言中的分隔符,也出现在页面上。最好是一种“分隔但不可见”的空格。
当然,我们不清楚如何表达这样的事情,或者如何才能比
\def\myloop#1#2{\count11=#1#2%
\advance\count11 by -1\relax\ifnum\count11>0{\ }\fi
\ifnum\count11>0{\myloop{\count11}{#2}}\fi}
但是 TeX 有太多的角落和缝隙,我可能忽略了一些东西。
抱歉,这个标题是别人建议的,我无法拒绝。
答案1
引用我之前的回答解析奇异点:什么时候空格不是空格
更多解释
上述意义上的空格标记是类别代码为 10 的显式字符。当 TeX 寻找数字来执行赋值时,它将进行宏扩展(包括可扩展基元),并且如前所述,当扩展后发现非数字时,它将停止。如果停止是由空格标记引起的,它将被忽略;否则,在赋值完成后,将再次读取导致停止的标记。
因此\
不是空格标记,用于终止数字。它确实会停止搜索其他数字,但它是不可扩展的原语,因此在使用该数字后会重新检查它,在本例中是将其分配给\count11
。因此它将出现在打印中。
\newcount\loopcount
\def\myloop#1#2{\loopcount=#1\relax
#2% print the second argument
\advance\loopcount by -1 % decrease the counter
\ifnum\loopcount>0
\myloop{\loopcount}{#2}% repeat
\fi
}
您需要\relax
在第一行中,因为#1
可能是明确的数字或寄存器。如果赋值使用寄存器的值,则不会吞噬空格标记。在行中\advance
,-1
以空格正确终止(不会出现在输出中)。0
下一行中的结束行也是如此(当 TeX 对输入进行标记时,它会转换为空格)。
脚注
首先,你不应该使用\count11
。它是 TeX 用来跟踪寄存器分配的重要寄存器:第 194 行plain.tex
说
\count11=9 % allocates \dimen registers 10, 11, ...