关于 \ifcase 语法的一个问题

关于 \ifcase 语法的一个问题

该命令\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代币。

  1. <integer>值是通过查找寄存器的值或通过评估显式常量来确定的,假设它是n
  2. 如果n< 0 或n>,则 TeX 跳过直到 (包括 )\else或 直到 (不包括 )的标记(\fi如果没有\else出现);
  3. 如果 0 ≤n,标记被跳过到(并包括)n\or

因为没有“第 0 个” \or<integer>当计算结果为 0时,将跳过所有文本。

以下\or标记和它们之间的文本会发生什么情况? 的扩展\or包括跳过匹配的标记(不扩展) 。和\fi之间的文本以相同的方式消失,当\else\fin=


可以\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

相关内容