使用两个循环定义命令

使用两个循环定义命令

我想使用两个循环定义一系列命令。

例如,我想创建一系列可以以 YY 或 NN 作为下标的变量。

我想定义命令\yy并将\nn这些字母作为大写下标。

下列的此解决方案,我使用 Tikz / pgffor

\documentclass{minimal}
\usepackage{pgffor}

\foreach \p in {yy,nn}{%
    \expandafter\xdef\csname \p\endcsname{
         \noexpand\ensuremath{_{\uppercase{\p}}}
     }
}

\begin{document}
    $B\nn$ and $B\yy$
\end{document}

现在我想知道如何创建变量\ann\ayy\bnn、等等,它们相当于、、等等\byy\cnn$A\nn$$A\yy$$B\nn$

我想做类似的事情

\foreach \p in {yy,nn}{%
    \expandafter\xdef\csname \a\\p\endcsname{
         \noexpand\ensuremath{A\\p}
     }
}

\\p当我希望循环使用函数\yy并预先定义时,我曾写过\nn。但显然它不起作用

(! Undefined control sequence.
\GenericError  ...                                                                                 \@empty \def \MessageBreak...)

任何想法?

答案1

有了更多的牛铃,你就能找到解决方案

\documentclass{article}
\usepackage{pgffor}
\foreach \x in {a,...,z}{
\foreach \p in {yy,nn}{%
    \expandafter\expandafter\expandafter\xdef\expandafter\csname\x\p\endcsname{
         \noexpand\ensuremath{\uppercase{\x}_{\uppercase{\p}}}
     }
}
}
\begin{document}
    \foreach \var in {a,f,...,z}{
    \csname\var nn\endcsname and} \zyy
\end{document}

在此处输入图片描述

编辑(艾哈迈德)

打击乐器的使用超过\expandafter了必要范围:

\documentclass{article}
\usepackage{pgffor}
\foreach \x in {a,...,z}{%
  \foreach \p in {yy,nn}{%
    \expandafter\xdef\csname\x\p\endcsname{%
      \noexpand\ensuremath{\uppercase{\x_\p}}%
    }%
  }%
}
\begin{document}
\foreach \var in {a,f,...,z}{%
  \csname\var nn\endcsname\space and
}
\zyy
\end{document}

在本练习中,我本应使用堆栈,而不是定义可能无数的命令。

答案2

根据您的定义,宏\yy将扩展为_{\uppercase{yy}}。您可以做得更好,将其扩展为_{YY}

\documentclass{article}
\usepackage{pgffor}

\foreach \p in {yy,nn}{
  \begingroup\edef\x{\endgroup
  \unexpanded{\expandafter\gdef\csname\p\endcsname}{_{\p}}}
  \uppercase\expandafter{\x}
}
\foreach \l in {a,b,c}{
  \foreach \p in {yy,nn}{
    \begingroup\edef\x{\endgroup
    \unexpanded{\expandafter\gdef\csname\l\p\endcsname}{\l_{\p}}}
    \uppercase\expandafter{\x}
  }
}

\begin{document}
$B\nn$ and $B\yy$ --- $\ann$ and  $\byy$

\texttt{\meaning\ann}
\end{document}

在此处输入图片描述

如您所见,\ann扩展为A_{NN}而不是\uppercase{a}_{\uppercase{nn}}。在某些情况下,您可能会因为某些原因而\uppercase暂时将其重新定义为不执行任何操作(或者更糟的是,执行其他操作),从而造成严重破坏。

我留下如何添加作为练习\ensuremath(不希望我会帮助犯下轻罪)。

答案3

好的,我想我刚刚知道该怎么做:

   \documentclass{minimal}
   \usepackage{pgffor}

    \foreach \p in {yy,nn}{%
        \expandafter\xdef\csname \p\endcsname{\noexpand\ensuremath{_{\uppercase{\p}}}
    }
    }
    \foreach \l in {a,b,c} {
    \foreach \p in {yy,nn}{%
        \expandafter\xdef \csname \l\p\endcsname{
             \noexpand\ensuremath{\uppercase{\l}\csname \p\endcsname}}
    }
    }
    \begin{document}
        $\ann$  $\byy$
    \end{document}

它确实会抛出错误“缺少$插入”,我无法解决,但这是开始......

底线:诀窍是使用 \csname \endcsname。

相关内容