将参数传递给 newcommand 时删除反斜杠“\”

将参数传递给 newcommand 时删除反斜杠“\”

考虑以下最小示例:

\documentclass{article}

\usepackage{glossaries}
\makeglossaries

\newcommand{\NewS}[4]{
    % Q1: How can I use argument #1 without the backslash in the following line?
    \newglossaryentry{symb:#4}{
        name=\ensuremath{#2},
        description={\nopostdesc #3}, 
        sort=sym#4,
    }

    % Q2: Why is the space between the '}' necessary?
    \def#1{\ensuremath{#2} } 
}

\NewS{\power}{P}{the power of something}{power}

\begin{document}
    One can refer to the symbol via \power and \gls{symb:power} and. 
\end{document}

我的两个问题已经插入到示例中。特别是,我正在寻找一种方法来消除\power我作为第一个参数传递给的字符串的反冲,newcommand以便我可以编写类似以下内容的内容:

\newglossaryentry{symb:WITHOUT_BACKSLASH(#1)}{

其次,我不明白为什么我必须在两个括号之间留一个空格,\def才能在输出中得到“P and”而不是“Pand”——这是我删除空格后得到的。如果我直接写,\ensuremath{P} and我看不到任何问题,所以我只是好奇。

感谢您的帮助!

问候

答案1

这取决于你需要如何使用控制序列名称。印刷不带反斜杠的控制序列名称是

\begingroup\escapechar=-1\edef\x{\endgroup\string\power}\x

在定义中,显式\power将是#1。但是,同样,这取决于您要对字符串执行的操作。

第二个问题经常被问到:TeX 会忽略控制序列名称后面的空格,例如\power。不要在定义中放置空格,而是\power{}在文档中写入。

如果你只想省去一个参数,那么使用 LaTeX 核函数

\makeatletter
\newcommand{\NewS}[3]{%
    \newglossaryentry{symb:#1}{
        name=\ensuremath{#2},
        description={\nopostdesc #3}, 
        sort=sym#1,
    }%
    \@namedef{#1}{\ensuremath{#2}}%
}
\makeatother

现在\NewS{power}{P}{the power of something}就足够了,你可以说

\begin{document}
One can refer to the symbol via \power{} and \gls{symb:power} and. 
\end{document}

答案2

在 中expl3,有一个\cs_to_str:N函数可以获取不带反斜杠的宏名。如果你不熟悉expl3语法,你可以定义该函数的克隆:

\documentclass{minimal}
\usepackage{expl3}
\ExplSyntaxOn
  \let\cstostr\cs_to_str:N
\ExplSyntaxOff
\begin{document}
\cstostr\foobar
% We obtain: foobar
\end{document}

注意:\cs_to_str:N完全可扩展。因此它足够强大。

定义这样的命令并不简单\cs_to_str:N。你可以在source3如果你想窥探的话,可以查阅一下文件。

这是我的版本\cstostr

\makeatletter
\def\cstostr#1{%
  \expandafter\@gobble\detokenize\expandafter{\string#1}}
\makeatother

定义比LaTeX3的简单很多\cs_to_str:N,但可能会在\escapechar异常情况下失败。它也是完全可扩展的。


TeX 默认会忽略全字母宏后的所有空格。要解决空格问题,你可以使用:

\power\ and

或者

\power{} and

答案3

另一种方法是从字符串创建宏。

\documentclass{minimal}
\newcommand\makemacro[1]{\expandafter\def\csname#1\endcsname{arnold}}
\begin{document}
\makemacro{power}
\power
\end{document}

相关内容