鉴于 TeX 的 catcode 系统,我想可以混淆TeX 的程度令人惊叹。为了更多地了解 TeX 的内部结构,我想问:我该如何向我的文档中添加一段模糊代码?假设我想在我的文档中添加一个水印,但不想让我的合著者能够编辑。我该怎么做?
我可以使用什么技巧来使某段代码更难理解?
答案1
试用十二.tex。这是一个纯TeX 文件,你可以在 CTAN 上找到它。
和恩里科“埃格尔”格雷戈里奥提出了类似的代码,甚至更短。参见你见过用 TeX 做过的最奇怪的事情是什么,它被称为xcix.tex
。
答案2
如果您使用的是 XeTeX,这里有一些(稍微模糊的)代码来将\p
Ascii 字符对打包()成一个 Unicode 字符,将结果存储在\toks0
(令牌寄存器,我在\|
下面调用它)中,或者解包(\u
)结果。
编码利用了这样一个事实:可见的 ascii 字符在(空格) 和(波浪符号)\number`
之间有一个字符代码 (用 访问) ,因此可以通过移动 将它们存储在两位数字中。然后通过添加(减去 的两次移位,因此,减去定义中的隐藏,因此)将四位数字打包成一个字符,以确保这给出 5 位数字(从 1 开始)。32
127
32
10000
32
6768
32
\.
6736
解码一次读取一个字符,直到\number`
,得到1
,后跟两对数字。我们将32
每对数字相加,将的大写代码设置.
为该值,并存储\uppercase{.}
在中\|
。
\iffalse
通过在打包和拆包时在正确的位置插入可以停止循环。
% Packing 2 ascii char per Unicode char with XeTeX.
\begingroup
\toksdef\|0
\let\ea\expandafter
\def\>{\uppercase{\|\ea{\the\|.}}}
\def\.{\uccode`.\numexpr32+}
\def\p#1{\|{}\ea\q#1\ {\ \iffalse}\ \fi\relax}
\def\q#1#2{\.\number`#100+`#2+6736\>\q}
\def\u#1{\|{}\ea\v\number`#1 \^^J{\iffalse}..\fi\relax}
\def\v1#1#2#3#4{\.#1#2\>\.#3#4\>\ea\v\number`}
% Example
\p{The\ main\ author\ is\ Seamus!}\showthe\|
\ea\u\ea{\the\|}\showthe\|
\endgroup
\csname @@end\endcsname\end
组的存在是为了避免泄露定义。当然,您可能只想保留 的定义,并在文档中\u
写入。\u{㮨䈄䃉䠨䘾❙䝼㭁䃁䢗❴}\message{\the\|}
答案3
我刚刚发现\char
:
\documentclass{article}
\begin{document}
\char'110 \char'105 \char'114 \char'114 \char'117 \kern .8em \char'127 \char'117\char'122 \char'114 \char'104
\end{document}
另外,我想知道在文档全部扩展为原始内容后,是否有办法访问文档的外观。我认为这本身就相当令人困惑...