我定义如下:
\newcommand{\pl}{\ensuremath{p^L}\xspace}
\newcommand{\pr}{\ensuremath{p^R}\xspace}
\newcommand{\xx}{\ensuremath{_{XX}}\xspace}
\newcommand{\xc}{\ensuremath{_{XC}}\xspace}
现在我想定义
\newcommand{\plxx}{\ensuremath{\pl\xx}\xspace}
\newcommand{\plxc}{\ensuremath{\pl\xc}\xspace}
...
等等。(我其实不止四个……)
我尝试去适应此解决方案
\documentclass{minimal}
\usepackage{pgffor}
\newcommand{\pl}{\ensuremath{p^L}}
\newcommand{\xx}{_{XX}}
\newcommand{\xc}{_{XC}}
\foreach \p in {xx,xc}{
\expandafter\xdef\csname pl\p\endcsname{%
\noexpand\ensuremath{\pl\p}%
}%
}%
\begin{document}
$\plxc$
\end{document}
但它给了我错误
! Missing $ inserted.
<inserted text>
$
l.15 $\plxc
$
! Missing $ inserted.
<inserted text>
$
l.16 \end{document}
真的很抱歉打扰您,因为我已经问过类似的问题,但我无法将解决方案应用于另一个问题......
答案1
我只想说
\newcommand{\pl}{p^L}
\newcommand{\pr}{p^R}
\newcommand{\xx}{_{XX}}
\newcommand{\xc}{_{XC}}
以便
$\pl\xx$
会给出你需要的结果。更清晰、更简单。
我真的不明白为什么你需要\xx
文本模式(所以用\ensuremath
)。
有许多滥用\ensuremath
和的问题\xspace
;你自己就发现了一个问题:$\pl\xx$
,这是最自然的语法,但它不起作用,你不得不增加要记住的命令数量。
当你说“我\pl
也需要在文本中”时,你错了:你需要在文本中使用数学公式,这是很常见的,并且可以通过
\(\pl\)
(像我这样的老前辈已经习惯了$\pl$
)如果你有一个好的编辑器,它也会出现标记。
如果你真的坚持使用错误的方式做事,方法如下。
\documentclass{article}
\usepackage{xspace}
\usepackage{pgffor}
\newcommand{\pl}{\ensuremath{p^L}\xspace}
\newcommand{\pr}{\ensuremath{p^R}\xspace}
\newcommand{\xx}{\ensuremath{_{XX}}\xspace}
\newcommand{\xc}{\ensuremath{_{XC}}\xspace}
\begingroup
\def\ensuremath#1{#1}
\def\xspace{}
\foreach \p in {xx,xc}{
\expandafter\xdef\csname pl\p\endcsname{%
\noexpand\ensuremath{\pl\csname\p\endcsname}\noexpand\xspace
}%
}
\endgroup
\begin{document}
Here \plxc is used in text
\texttt{\meaning\plxc}
\end{document}
答案2
\pl
你也应该抑制循环中的扩展
在评论后编辑:如果您想插入命令\xx
(而不是字符串xx
),您必须使用\csname\p\endsname
或\noexpand\csname\p\noexpand\endcsname
:
\documentclass{minimal}
\usepackage{pgffor}
\newcommand{\pl}{\ensuremath{p^L}}
\newcommand{\xx}{_{XX}}
\newcommand{\xc}{_{XC}}
\foreach \p in {xx,xc}{
\expandafter\xdef\csname pl\p\endcsname{%
\noexpand\ensuremath{\noexpand\pl\noexpand\csname\p\noexpand\endcsname}%
}%
}%
\begin{document}
$\plxc$
\end{document}