考虑以下最小示例:
\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}