空间奇怪现象:是否存在不会出现在页面上的空间?

空间奇怪现象:是否存在不会出现在页面上的空间?

我认为我的问题的答案是“不”,但有人可能会说如果有的话会很好。以下是提出这个问题的原因。定义

\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, ...

相关内容