我最近在寻找使用另一个命令名称的命令的创建方法,最近我发现了 \expandafter 和 \csname 指令。我设法使用这些指令创建了一个简单的命令,但对于更复杂的命令我遇到了问题。
这是我的代码的一个最小示例:
\documentclass{book}
\usepackage{polyglossia}
\setmainlanguage{french}
\usepackage{xargs}
\usepackage{xparse}
\usepackage{ifthen}
\usepackage{amsmath}
\usepackage{mathtools}
\newcommand{\DeclareCentredMathEtype}[2]
{
\DeclareMathOperator*{#1}
{
\begin{minipage}{\widthof{\begin{huge}#2\end{huge}}}\begin{huge}#2\end{huge}\end{minipage}
}
}
\newcommand{\DisplayEtype}[1]
{
\expandafter\let\csname old#1\expandafter\endcsname\csname #1\endcsname
\expandafter\RenewDocumentCommand\csname #1\endcsname{m o m}{\IfValueTF{##2}{\underset{\substack{##1}}{\overset{##2}{\csname old#1\endcsname}} ##3 }{\underset{\substack{##1}}{\csname old#1\endcsname}{##3}}}
}
\DeclareCentredMathEtype{\test}{A}
\DisplayEtype{test}
\DisplayEtype{sum}
\begin{document}
$\displaystyle\oldtest_{k=0}^{3}{f(k)}$
$\displaystyle\sum{k=0}[3]{f(k)}$
%$\displaystyle\test{k=0}[3]{f(k)}$
\end{document}
在此代码中,\DisplayEtype 无法正常工作。对于 \sum,它会创建 \oldsum 并重新定义 \sum,没有任何问题(\sum 被重新定义为具有范围索引和显式的总和)。但是,对于 \test,它会产生致命错误(最后一行注释)。
我认为这是因为我在这里使用了 \expandafter。我一直在搜索相关主题,但到目前为止,我还没有找到任何解决方案。
你能告诉我我错过了什么吗?
感谢您的帮助。
PS:顺便问一下,您知道在哪里使用 \expandafter 指令的简单规则吗?
答案1
如果你添加\show
你会看到
> \oldtest=macro:
->\protect \test
因为test
最初是一个健壮的宏,定义为
\def\test{\protect\test_}
(但带有空格而不是_
)则您\let
没有保存真正的底层含义并且test_
宏在重新定义中被用在了错误的地方。