我想使用两个循环定义一系列命令。
例如,我想创建一系列可以以 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。