这主要是出于好奇而提出的一个学术问题,但我认为它可能会给出一些有趣的答案。问题是,给定一个以 开头的 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}