我想知道所有控制序列的列表,这些控制序列在常见格式中等于基元。例如,对于纯 TeX,我们将获得以下列表
\endgraf % = \par
\endline % = \cr
\repeat % = \fi
\bgroup % = { so not quite a primitive
\egroup % = }
\sp % = ^
\sb % = _
^^M % (active character) = \par in \obeylines
% (active space) = space in \obeyspaces
% (the \if... defined by \newif) = \iftrue or \iffalse
% (various control sequences) = \relax
而对于其他格式,我们会得到更长的列表(例如\@@par
LaTeX2e\par
或\normalunexpanded
ConTeXt \unexpanded
)。
我特别感兴趣的是控制序列(和活动字符),让其等于执行赋值(,,,,,,,,,,,,,,,,,),前缀(,,,,)和的基元。\def
当\edef
TeX启动并预加载这些格式时,我可以进一步限制自己控制序列(和活动字符) ,它们等于此列表中的基元之一。\gdef
\xdef
\let
\futurelet
\chardef
\mathchardef
\countdef
\dimendef
\skipdef
\muskipdef
\toksdef
\read
\readline
\font
\protected
\long
\outer
\global
\afterassignment
我关心的原因如下:我刚刚编写了一些代码,重新定义了上面列出的原语,以便追踪分配。这样我就可以列出文档中定义的所有命令,并且我有想法如何从中提取文档中实际使用的所有命令的列表。但是,要求是我应该挂钩到所有为标记分配新含义的命令,即所有控制序列和活动字符都分配给上面列表中的原语之一。如果我错过了其中一个原语的别名,那么使用它定义的所有标记都会丢失。
答案1
LaTeX2e 答案。
在 LaTeX2e 中,只有两个控制序列属于问题中列出的“前缀和定义原语”之一。
\install@mathalphabet % = \gdef
\l@ngrel@x % = \long or \relax in \@star@or@long
接下来,让我们列出在运行 LaTeX2e 的过程中没有错误地设置为原始值的每个控制序列或活动字符,除了以迂回的方式设置为等于自身的原始值(例如,被重新定义,然后最终由于 而\par
回到原始值)。\par
\@@par
% Expandable primitives
\@@input % = \input
\if@tempswa % = \iftrue or \iffalse (and all other \newif switches)
\repeat % = \fi
\do % = \noexpand in \begin{document}
\protect % = \string or \noexpand (or a macro)
\@@protect % see \protect
\firstmark % = \botmark in \@outputpage
% Non-expandable primitives
\frozen@everymath % = \everymath
\frozen@everydisplay % = \everydisplay
\mathgroup % = \fam
\mathalpha % = \mathord in \DeclareMathDelimiter
\@@underline % = \underline
\@@hyph % = \-
\@@italiccorr % = \/
\mb@b % = \vss in \@imakepicbox
\mb@l % = \hss in \@imakepicbox and \@shortstack
\mb@r % = \hss in \@imakepicbox and \@shortstack
\mb@t % = \vss in \@imakepicbox
\hss % = \vss in \@iiiparbox
\unhbox % = \unvbox in \@iiiparbox
\@upordown % = \raise or \lower in \@sline
\@cite@ofmt % = \hbox
\endline % = \cr
\@@par % = \par
\endgraf % = \par
(active) ^^M % = \par
\@@end % = \end
\install@mathalphabet % = \gdef
\l@ngrel@x % = \long (or \relax) in \@star@or@long
\@end@tempboxa % = \endgroup
\@err@<74 spaces> % = \errmessage in for old TeXs.
\c@errorcontextlines % = \errorcontextlines
\@let@token % \futurelet (various uses) to what follows
\reserved@a % \futurelet in \hline to what follows
\reserved@b % = items in \nocorrlist (could be primitives)
\reserved@d % = #1 of \@ifnextchar
\reserved@e % = \vadjust in \\ or \newline
最后五行是为了完整性而包含的,但都是临时定义,因此对于任何想要挂钩原语的人来说都不是问题。最后,隐式字符标记,对于原语挂钩来说没有意义,但对其他人来说可能有用。
\bgroup % = {
\math@bgroup % = \bgroup
\@@math@bgroup % = \bgroup
\egroup % = }
\@sptoken % = space
\sp % = ^
\sb % = _
\@sharp % = # in \@array