expandafter 和 csname

expandafter 和 csname

我最近在寻找使用另一个命令名称的命令的创建方法,最近我发现了 \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_宏在重新定义中被用在了错误的地方。

相关内容