在循环中使用先前定义的命令

在循环中使用先前定义的命令

我定义如下:

\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}

相关内容