哪些 TeX 基元在其初始定义被覆盖后可以恢复?

哪些 TeX 基元在其初始定义被覆盖后可以恢复?

这主要是出于好奇而提出的一个学术问题,但我认为它可能会给出一些有趣的答案。问题是,给定一个以 开头的 TeX 文件\def\someprimitive{},对于 的哪些值,\someprimitive之后可以恢复其原始含义?

例如,\def\relax{}并不是灾难性的,因为\csname可以用来得到原始含义:

\def\relax{}
\expandafter\let\expandafter\relax\csname PleaseGiveMeBackRelax\endcsname
\meaning\relax

稍微放宽(没有双关语的意思)要求,人们可能会问是否有可能重新创建一个宏,该宏在所有实际用途上都与原始宏相同:

\def\gdef{}
\def\gdef{\global\def}

(至少,我想不出这不起作用的情况,但当然这取决于以后是否被重新定义)\global\def

这个问题可以根据您最喜欢的 TeX 引擎和相关原语集来解释。但依赖为原语创建别名的格式可能是作弊行为(例如纯 TeX 的\endgraf = \par)。

答案1

此外\pdfprimitive,在 Luatex 中,您可以通过添加前缀将基元集映射到 csname。例如,\directlua{tex.enableprimitives('Knuths', tex.extraprimitives('tex'))}将把所有 Knuth 的 Tex 基元映射到带有前缀的基名称上Knuths,因此\Knuthsdef与基元具有相同的含义\def

的第二个参数tex.enableprimitives是一个表,因此可以通过这种方式映射任意图元集。 tex.extraprimitives为基本 Tex 图元和 Luatex 支持的各种 Tex 扩展('etex'、'pdftex'、'omega' 等)定义一个图元表。

答案2

使用当前的 pdftex (luatex),您可以使用以下命令检索原语\pdfprimitive

\documentclass[11pt]{article}
\begin{document}

{\def\hbox{I was a hbox}
 new: \hbox{}

 old: \pdfprimitive\hbox{abc}}

\end{document}

相关内容