我想了解为什么表达式在没有空格的情况下\the\count0\the\count1
返回0
。以下是代码:
\documentclass[12pt,a4paper]{article}
\usepackage[utf8]{inputenc}
\begin{document}
\count0=12
\count1=34
The value of \textbackslash count0 is `\the\count0'.
The value of \textbackslash count1 is `\the\count1'.
To form `1234' with count0 and count1 one does: `\the\count0 \the\count1'.
But when the expression is put together one gets: `\the\count0\the\count1'.
One way to get the desired output is to add \textbackslash relax between them: `\the\count0\relax\the\count1'.
\end{document}
输出:
避免输出的一种方法0
是放在\relax
计数器之间。为什么我会得到输出0
,分离表达式和添加命令有什么区别\relax
?
答案1
当 TeX 扩展 时\the\count0
,它发现要打印的内容是寄存器的内容,因此它会在(要打印的寄存器编号)\count
之后寻找 〈number〉。这个“寻找”过程包括扩展输入流中的所有标记,直到找到一个无法扩展的标记,该标记不适合 TeXbook p. 269 中给出的 〈number〉 语法。 〈space token〉 总是结束这个过程并成为 〈number〉 的一部分(它会被 〈number〉 扫描过程吞噬),但不会超过一个——参见\count
\count
语法补充下面。\relax
标记也会结束该过程,但不会成为 〈number〉 的一部分,因此 TeX 将使用它来进一步处理输入流。
注意:在很多情况下,\relax
它不执行任何操作,但在某些情况下,它可能会结束 TeX 的特定进程(寻找\noalign
或位于[分别] 行 [分别 ]\omit
的开头或结尾)。\halign
\valign
因此,当您写入时\the\count0 \the\count1
,第一个\the
适用于,\count0
因为后面的空格0
结束了<number>。\the\count0
(以空格结尾)始终扩展到计数寄存器 0 的内容,并且不会向输入或水平列表添加任何虚假空格。
\the\count1
打印... 取决于 后面的内容1
。如果后面有更多数字(可能在扩展宏之后),要打印的寄存器编号可能大于 1。1
如您的示例中所示,在 后面跟一个单引号,则终止 〈number〉 并打印计数寄存器 1 的内容。当您不确定后面的内容(宏不受您的控制)时,请用空格标记终止 〈number〉;它将被吞噬。\relax
是一种流行的替代方法,并且始终完成 〈number〉,但如上文所述,它会保留在输入流中,这在某些特定情况下可能会产生不良后果(请参阅这个答案)。
当你写 时\the\count0\the\count1'
,第一个 的情况会有所不同\the\count
,因为在 之后0
,TeX 仍在扩展标记,寻找以 开头的 〈number〉 的后一位数字0
。由于\the
始终可扩展,因此它会被扩展。在你的例子中,\the\count1
会扩展为34
;因此,它34
成为第一个 〈number〉 的一部分,即034
,即十进制的 34,因为 〈number〉 没有以表示八进制或十六进制表示法的单引号或双引号开头。因此,在你的例子中:
\the\count0\the\count1'
(内部没有空格)打印计数寄存器 34 的内容,后跟一个撇号,您可以通过设置来验证\count34=77
(后跟一个空格标记或\relax
\count
)来验证这一点。当然,在正常操作中,您不应该在未首先确保寄存器尚未用于其他用途的情况下写入寄存器(请参阅“临时寄存器”)。
语法补充
在展开 <number> 的第一条语法生成规则之后(参见 TeXbook 第 269 页;这些规则允许在 <number> 的开头使用可选的加号、减号和空格,以及将 <internal dimen> 或 <internal glue> 强制转换为 <number>),你将得到 <normal integer> 的生成规则:
〈normal integer〉 → 〈internal integer〉
| 〈integer constant〉〈one optional space〉
| '〈octal constant〉〈one optional space〉
| "〈hexadecimal constant〉〈one optional space〉
| `〈character token〉〈one optional space〉
其中'
,"
和`
是类别代码为 12(“其他”)的字符标记,<一个可选空格> 定义为:
〈one optional space〉 → 〈space token〉 | 〈empty〉
而 <整数常量> 匹配任意非空的、类别码为 12 的十进制数字序列。产生式规则
〈normal integer〉 → 〈integer constant〉〈one optional space〉
(其中之一为 〈normal integer〉)用于你例子中的所有 〈number〉,而 〈space token〉 是我们上面提到的,当存在时(但只有一个),它成为 〈number〉 的一部分。