是否可以从 \@preamblecmds 列表中弹出命令?

是否可以从 \@preamblecmds 列表中弹出命令?

是否可以从列表中弹出命令\@preamblecmds?我想到的用例是允许\DeclareMathOperator在序言之后使用。

答案1

您必须小心,因为某些命令受到限制,因为基本上它们之后将不再起作用,\begin{document}但大多数情况下它们会被删除以节省几个字节,这是 1994 年的一个主要问题,但现在可能不那么重要了:

\documentclass{article}


\makeatletter
\let\zzz\@preamblecmds
\usepackage{amsmath}
\let\@preamblecmds\zzz
\makeatother


\begin{document}

\DeclareMathOperator\foo{BAR}

$\foo x$

\end{document}

答案2

如果要从标记列表中删除某项,则需要适当的辅助工具来执行删除操作。这可以通过几种方式进行设置,但最直接的方法可能是首先检查内容是否存在,然后如果存在则将其删除:

\documentclass{article}
\usepackage{amsmath}
\makeatletter
\def\@tempa#1\do\DeclareMathOperator#2\nil{%
  \ifx\relax#2\relax
  \else
    \def\@tempa##1\do\DeclareMathOperator##2\nil{\def\@preamblecmds{##1##2}}%
    \expandafter\@tempa\@preamblecmds\nil
  \fi
}
\expandafter\@tempa\@preamblecmds\do\DeclareMathOperator\nil
%\show\@preamblecmds
\makeatother
\begin{document}

Hello

\end{document}

这里的计划很简单:检查是否\do\DeclareMathOperator在,如果在\@preamblecmds,则将其余的 token 拆分并重新保存。在本例中David 的解决方案可能是更可取的,因为还有其他命令可能也涉及(\do\@declmathop也添加到\@preamblecmds)。


我们可以概括上述内容,但我只使用expl3,例如

\documentclass{article}
\usepackage{amsmath}
\usepackage{expl3}
\ExplSyntaxOn
\makeatletter
\tl_remove_all:Nn \@preamblecmds { \do \DeclareMathOperator }
\tl_remove_all:Nn \@preamblecmds { \do \@declmathop }
\makeatother
\ExplSyntaxOff

\makeatletter
\show\@preamblecmds

(我可以\tl_remove_once:Nn在这里使用,因为只发生了一次:无论如何都不是一个大问题。)请注意,我需要\ExplSyntaxOn\makeatletter这里才能访问正确的名称。

相关内容