你能解释一下这段代码是如何工作的吗?

你能解释一下这段代码是如何工作的吗?

我在 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 \lettoken =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 的工作情况。

相关内容