\lowercase 技巧

\lowercase 技巧

\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(类别代码)。

相关内容