\lowercase
我们使用(并解释)这个“技巧”提出了许多问题,或者说是答案。
\begingroup
\lccode`\~=`\.
\lowercase{\endgroup\def~}#1{foo with #1}
然而,在阅读了大写和小写代码后,我开始怀疑它是如何工作的。引用TeX 按主题分类:
每个字符代码对应一个大写字母代码和一个小写字母代码 [...]。这些可以通过以下方式分配:
\uccode number equals number
和
\lccode number equals number .
在 IniTeX 代码中
`a
..`z
、`A
..`Z
有大写代码`A
..`Z
和小写代码`a
..`z
。所有其他字符代码都有大写和小写代码零。命令
\uppercase{...}
和\lowercase{...}
遍历它们的参数列表,如果这些非零,则分别用它们的大写和小写代码替换所有显式字符标记的字符代码,而不改变类别代码。
最后一句话让我思考:如果获得定义的符号的小写代码为 0,那么这个“技巧”如何奏效~
?我天真的期望是
\lccode`\~=`\.
给出~
与之前相同的小写代码,相当于\lccode`~=0
。但对我来说,这意味着“技巧”不应该奏效?为什么做工作?
\documentclass{article}
\begin{document}
\verb+\the\lccode`. += \the\lccode`. \par
\verb+\the\lccode`~ += \the\lccode`~
\begingroup
\lccode`\~=`\.
\lowercase{\endgroup\def~}#1{foo with #1}
\catcode`\.=13
.{bar}
\end{document}
答案1
你的直觉是错误的。在 TeX 的语法中,
`\~
是一个数字,精确地表示反引号后面出现的字符的 ASCII 码(它也可以是长度为 1 的控制序列,含义相同,以适应类似 的情况%
)。因此赋值
\lccode`\~=`\.
和
\lccode 126=46
因此就其而言,波浪号的小写对应部分就变成了句号\lowercase
。
如果你写
\lccode`\~=\lccode`\.
然后你将波浪号分配给 lccode 0,但它非常不同的。
对于初学者来说,更多的单词可能会有所帮助。你可以认为它\lccode
是一个长度为 256 的数组,其索引从 0 开始。命令
\lccode <number1> = <number2>
存储<number2>
在编号为 的插槽中<number1>
。当\lowercase
执行其工作并找到具有 charcode 的字符X,它看起来在插槽中X数组\lccode
;如果存储的数字为 0,\lowercase
则不执行任何操作;否则它会找到一个数字是> 0 并替换字符代码X使用字符代码是(不改变 catcode)。
与 TeX 中通常的情况一样,执行赋值的相同原语可用于检索槽中的值。因此\the\lccode`\A
将打印 97(在正常设置下)和
\count255=\lccode`A
会将 97 存储在计数寄存器 255 中。甚至可以说
\count\lccode`A=42
以便在计数寄存器 97 中存储 42。但这似乎不是很好的用法\lccode
。;-)
\lccode
除和之外,还有几个其他数组\uccode
:(\sfcode
空间因子代码)、\mathcode
(数学代码)、\delcode
(分隔符代码)和\catcode
(类别代码)。