![是否可以从 \@preamblecmds 列表中弹出命令?](https://linux22.com/image/303922/%E6%98%AF%E5%90%A6%E5%8F%AF%E4%BB%A5%E4%BB%8E%20%5C%40preamblecmds%20%E5%88%97%E8%A1%A8%E4%B8%AD%E5%BC%B9%E5%87%BA%E5%91%BD%E4%BB%A4%EF%BC%9F.png)
是否可以从列表中弹出命令\@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
这里才能访问正确的名称。