该命令\today
定义如下:
\def\today{\ifcase\month\or
January\or February\or March\or April\or May\or June\or
July\or August\or September\or October\or November\or December\fi
\space\number\day, \number\year}
我的问题是关于。上面例子中\ifcase <number><case0>\or<case1>\or...\else<defaultcase>\fi
的是什么?或?这是什么意思?<case0>
\month
{}
答案1
文字<case 0>
为空。
事实上,\month
是一个“内部整数”,所以\ifcase\month
是一个完整的条件测试(从某种意义上说,TeX 不会提前查看扩展以查看是否有空格)。
TeX 处理\ifcase
如下;假设有米 \or
代币。
- 该
<integer>
值是通过查找寄存器的值或通过评估显式常量来确定的,假设它是n; - 如果n< 0 或n>米,则 TeX 跳过直到 (包括 )
\else
或 直到 (不包括 )的标记(\fi
如果没有\else
出现); - 如果 0 ≤n≤米,标记被跳过到(并包括)n第
\or
。
因为没有“第 0 个” \or
,不<integer>
当计算结果为 0时,将跳过所有文本。
以下\or
标记和它们之间的文本会发生什么情况? 的扩展\or
包括跳过匹配的标记(不扩展) 。和\fi
之间的文本以相同的方式消失,当\else
\fi
n=米。
可以\month
为零或负数吗?当然可以。寄存器的值是在作业开始时计算并分配给当前月份对应的数字,但寄存器是可写的,写入\month=0
(或任何其他整数值)只会更改存储的值(对日期有明显影响,但那是另一回事)。
假设\month
保存的值为 11,扩展后\today
,输入流将包含
\ifcase\month\or
January\or February\or March\or April\or May\or June\or
July\or August\or September\or October\or November\or December\fi
\space\number\day, \number\year
TeX 现在将查看 的值,并在删除 后\month
跳过前 11 个;剩下\or
\ifcase\month
November\or December\fi\space\number\day, \number\year
接下来November
传递到下一个处理阶段(通常用于打印),输入流将具有
\or December\fi\space\number\day, \number\year
的扩展\or
包括删除(不扩展)所有标记,直到\fi
:
\space\number\day, \number\year
并且加工将通过扩展进行\space
。
在(不太可能的)事件中,其\month
值为 0,删除 之后不会跳过任何内容;与前一种情况一样,\ifcase\month
到 为止的文本\fi
将通过扩展 而被删除。\or