我在 TeX 档案库中找到了这段代码,并思考了一段时间。有人能描述一下它的工作原理吗?
% Date: Thu, 7 Feb 91 12:20:50 -0500
%From: [email protected]
%Subject: A response to perl hackers
\let~\catcode~`?`\
\let?\the~`#?~`~~`]?~`~\let]\let~`\.?~`~~`,?~`~~`\%?~`~~`=?~`~]=\def
],\expandafter~`[?~`~][{=%{\message[}~`\$?~`~=${\uccode`'.\uppercase
{,=,%,{%'}}}~`*?~`~=*{\advance.by}]#\number~`/?~`~=/{*-1}\newcount.
=\-{*-}~`-?~`~]-\-~`^?~`~=^{*1}~`\ ?~`~= {.`\ $}~`@?~`~=@{,.,"#`@^$}
.`#*`'$.?~`~0-?~`~$//$^$ .``^$*?~`~$^$.?~`~0-?~`~/$-?~`~^$@*?~`~$ *
?~`~*?~`~*?~`~*?~`~$@-?~`~$ .?~`~0-?~`~-?~`~$.``^$^^$.`<-?~`~*`<$@*
?~`~$*?~`~-`(-`+$%}\batchmode
它列出了您所有的输入文件!
答案1
这里的大部分代码都已设置好,实际的“有效负载”很少。将每条指令分成一行很有用,但前提是这会因引入空格而导致实际问题。正如已经指出的那样,这也会有所\tracingall
帮助。
取发布代码的第一行,我们有
\let~\catcode
~`?`\
首先假设 是~
活动的,因此 也可以是\let
。\catcode
接下来,使用这种设置 catcode 的新方法使 处于活动状态,因为行尾字符的字符代码为 13,这是活动字符的类别代码。(要查看此内容,请注意行尾的 后面?
没有空格)。\
原文的下一行内容如下:
~`#?~`~
~`]?~`~
\let]\let
~`\.?~`~
~`,?~`~
~`\%?~`~
~`=?~`~
]=\def
因此,这主要是 catcode 分配(记住是~
)\catcode
。字符#
和]
都变为活动状态,并且 变为]
。\let
接下来\let
,.
、,
和%
都=
变为活动状态。这些行通常会写成
\catcode`\.\the\catcode`~
或者更常见的是
\catcode`\.\active
第二行的最后一条指令是to \let
token =
to \def
。
原文的第三行实际上与第四行略有重叠:
],\expandafter
~`[?~`~
][{
=%{\message[}
~`\$?~`~
=${\uccode`'.\uppercase{,=,%,{%'}}}
因此,我们有另一个\let
,类别代码更改,然后是另一个\let
。然后是\def
(使用=
版本),这导致 active%
具有定义\message[
。该宏稍后将用于构建代码打印的消息。接下来是另一个类别代码更改,以使$
active 成为可能,然后在行的最后一部分定义它。该定义的想法是使active 成为可能并在大小写更改块内'
重新定义。%
第四行的其余部分包含
~`*?~`~
=*{\advance.by}
]#\number
~`/?~`~
=/{*-1}
\newcount.
因此,我们再次激活了一个标记,这次*
是 ,然后将其定义为\advance.by
。然后我们#
开始\let
,\number
然后/
激活并定义为 扩展为*-1
。此行的最后一条指令创建了一个新的\count
,它将被称为.
(不久前已激活)。
下一行可以拆分成以下形式
=\-{*-}
~`-?~`~
]-\-
~`^?~`~
=^{*1}
~`\ ?~`~
= {.`\ $}
~`@?~`~
=@{,.,"#`@^$}
因此,有一个 的定义\-
,然后-
被激活并\let
被定义为\-
。^
标记被激活并定义为*1
,然后空间标记被激活并被赋予定义。最后,@
被激活并被赋予定义。这完成了大部分设置:其余大部分代码是要打印的消息!
代码的其余部分包括更改.
(计数)的值,然后重新定义%
。这个想法(一般来说)是'
给出值的大写代码.
,这个值是消息所需字母的字符代码。为了保持代码的复杂性,数字尽可能使用字符代码而不是实际数字来完成。这相当繁琐,所以我建议阅读输出\tracingall
以了解完整细节。
还有一点需要注意的是代码完成
%}\batchmode
在这个阶段,%
被定义为\message[Just another TeX hacker
,其中[
将充当左括号,但没有右括号。 这是由}
后面的文字 提供的,%
最终被使用。
答案2
\tracingall
这也许有点作弊,但请尝试在第一行之前运行代码。您可以观察 TeX 的工作情况。