如何使用 \csname 调用带有参数的命令?

如何使用 \csname 调用带有参数的命令?

我有一个函数可以重新定义给定的三角函数,以便

\cos[2]{\frac{1}{2}}

\cos^2\!\pqty{\frac{1}{2}}

最后看起来就像这样:

代码结果

,我使用\pqty(来自physics包)来自动缩放括号中的内容。我创建了以下命令来执行此操作:

\newcommand{\makeold}[1]{
    \expandafter\let\csname old#1\expandafter\endcsname \csname#1\endcsname
}%This makes it so that \makeold{cos} would call \let\oldcos\cos

\newcommand{\changetrig}[1]{
    \makeold{#1}

    \expandafter\renewcommand\csname#1\endcsname[2][]
    {\qopname\relax o{#1}
    \ifx\relax##1\relax\else^{##1}\fi\!\pqty{##2}}
}

当我调用时,它工作得很好\changetrig{cos}。但是,我想添加功能,以便它也可以\renewcommand\arccos\cos[-1]在此命令中调用(如果\changetrig{cos}需要调用)。但是在我的\changetrig命令中添加这个

\expandafter\renewcommand\csname arc#1\expandafter\endcsname\csname#1\endcsname[-1]

根本不起作用。我在添加时遗漏了什么?

编辑:我意识到顶部的示例代码与我的图片不匹配,并且我忘了提及相关的包。

答案1

如果#1cos ,那么你想构造

\renewcommand\arccos{\cos[-1]} 

所以

\expandafter\renewcommand\csname arc#1\expandafter\endcsname\expandafter{\csname#1\endcsname[-1]}

答案2

如果太多的\csname..\endcsname让您感到困惑,您可以通过{-delimited 宏来使用它们,例如\MakeTokenFromCsname

\documentclass{article}
\usepackage{physics}
\usepackage{letltxmacro}

\makeatletter
%%
%% \MakeTokenFromCsname<stuff not nested in braces and without braces>{Csname}
%%    ->
%% <stuff not nested in braces and without braces>\Csname
%%
%% E.g.,  
%%
%%   \MakeTokenFromCsname\foo{bar} -> \foo\bar
%%   \MakeTokenFromCsname{bar} -> \bar
%%   \MakeTokenFromCsname\let\foo={bar} -> \let\foo=\bar
%%   \MakeTokenFromCsname\MakeTokenFromCsname\let{foo}={bar} 
%%      -> \MakeTokenFromCsname\let\foo={bar} 
%%      -> \let\foo=\bar
%%
%% \MakeTokenFromCsname requires the triggering of _two_ expansion-steps/_two_
%% "hits" by \expandafter to deliver the result.
%%
\@ifdefinable\MakeTokenFromCsname{%
  \long\def\MakeTokenFromCsname#1#{%
    \romannumeral0\@MakeTokenFromCsname{#1}%
  }%
}%
\newcommand\@MakeTokenFromCsname[2]{%
  \expandafter\@@@MakeTokenFromCsname\expandafter{\csname#2\endcsname}{ #1}%
}%
\newcommand\@@@MakeTokenFromCsname[2]{#2#1}%
\makeatother

\newcommand{\changetrig}[1]{%
  \MakeTokenFromCsname\MakeTokenFromCsname{@ifdefinable}{old#1}{%
    \MakeTokenFromCsname\MakeTokenFromCsname\LetLtxMacro{old#1}{#1}%
  }%
  \MakeTokenFromCsname\DeclareRobustCommand{#1}[2][]{%
    \qopname\relax o{#1}%
    \ifx\relax##1\relax\else^{##1}\fi\!\pqty{##2}%
  }%
  \MakeTokenFromCsname
  \expandafter\expandafter\expandafter\renewcommand
  \expandafter\expandafter\expandafter{arc#1}%
  \expandafter\expandafter\expandafter{\MakeTokenFromCsname{#1}[-1]}%
}

\changetrig{cos}

\show\oldcos
\show\cos
\show\arccos

\begin{document}

$\oldcos^{2}\!\pqty{\frac{1}{2}}$

$\cos[2]{\frac{1}{2}}$

\end{document}

在此处输入图片描述

相关内容