我正在尝试定义一个列表使用\greadlist来自物品清单包。我想给该列表一个动态名称,例如收听, 在哪里否取决于计数器。
我尝试过类似
\documentclass{amsart}
\usepackage{listofitems}
\begin{document}
\newcounter{num}\setcounter{num}{1}
\setsepchar{,}
\greadlist*{\expandafter\noexpand\csname LIST\roman{num}\endcsname}{a,b,c}
\end{document}
但这只是让 LaTeX 不会停止运行......
答案1
答案2
您可以定义自己的命令变体。
\documentclass{amsart}
\usepackage{listofitems}
\ExplSyntaxOn
\NewDocumentCommand{\readnamedlist}{smm}
{
\IfBooleanTF{#1}
{\exp_args:NNc \readlist*{#2}{#3}} % * variant
{\exp_args:Nc \readlist{#2}{#3}}
}
\NewDocumentCommand{\greadnamedlist}{smm}
{
\IfBooleanTF{#1}
{\exp_args:NNc \greadlist*{#2}{#3}} % *-variant
{\exp_args:Nc \greadlist{#2}{#3}}
}
\ExplSyntaxOff
\begin{document}
\newcounter{num}\setcounter{num}{1}
\setsepchar{,}
\greadnamedlist*{LIST\roman{num}}{a,b,c}
\LISTi[1],\LISTi[2],\LISTi[3]
\stepcounter{num}
\readnamedlist{LIST\roman{num}}{d,e,f}
\LISTii[1],\LISTii[2],\LISTii[3]
\end{document}
它做什么\exp_args:Nc
?它跳过下一个标记并应用于\csname...\endcsname
以下括号组的内容。类似地\exp_args:NNc
,跳过两个标记。
如果您更喜欢“经典”的实现,这里有一个参数反转过程。
\documentclass{amsart}
\usepackage{listofitems}
\makeatletter
\newcommand{\readnamedlist}{%
\@ifstar{\@readnamedlist{\readlist*}}{\@readnamedlist{\readlist}}%
}
\newcommand{\greadnamedlist}{%
\@ifstar{\@readnamedlist{\greadlist*}}{\@readnamedlist{\greadlist}}%
}
\newcommand{\@readnamedlist}[2]{%
\expandafter\@@readnamedlist\csname #2\endcsname{#1}%
}
\newcommand{\@@readnamedlist}[2]{#2#1}
\makeatother
\begin{document}
\newcounter{num}\setcounter{num}{1}
\setsepchar{,}
\greadnamedlist*{LIST\roman{num}}{a,b,c}
\LISTi[1],\LISTi[2],\LISTi[3]
\stepcounter{num}
\readnamedlist{LIST\roman{num}}{d,e,f}
\LISTii[1],\LISTii[2],\LISTii[3]
\end{document}
答案3
我认为那些日子的 expl3-solutions 是最先进的,所以无论如何我更喜欢 egreg 的解决方案。
下面仅展示扩展后交换参数的技巧:
\documentclass{amsart}
\usepackage{listofitems}
\newcommand\PassFirstToSecond[2]{#2{#1}}%
\begin{document}
\newcounter{num}\setcounter{num}{1}
\setsepchar{,}
\expandafter\PassFirstToSecond\expandafter{\csname LIST\roman{num}\endcsname}{\greadlist*}{a,b,c}
\end{document}
或者,宏 → 可以帮助避免/隐藏-orgies:
\CsNameToCsToken⟨stuff not in braces⟩{NameOfCs}
⟨stuff not in braces⟩\NameOfCs
\expandafter...\csname..\endcsname
\documentclass{amsart}
\usepackage{listofitems}
%%===============================================================================
%% Obtain control sequence token from name of control sequence token:
%%===============================================================================
%% \CsNameToCsToken<stuff not in braces>{NameOfCs}
%% -> <stuff not in braces>\NameOfCs
%% (<stuff not in braces> may be empty.)
\csname @ifdefinable\endcsname\CsNameToCsToken{%
\long\def\CsNameToCsToken#1#{\InnerCsNameToCsToken{#1}}%
}%
\newcommand\InnerCsNameToCsToken[2]{%
\expandafter\exchange\expandafter{\csname#2\endcsname}{#1}%
}%
\newcommand\exchange[2]{#2#1}%
%%===============================================================================
\begin{document}
\newcounter{num}\setcounter{num}{1}
\setsepchar{,}
\CsNameToCsToken\greadlist*{LIST\roman{num}}{a,b,c}
\end{document}
(如果它在那里实现,在 expl3 中,的名称\CsNameToCsToken
可能类似于\exp_args:wc
或任何您使用的参数类型,而不是w
对于不能嵌套在括号中但由左括号分隔的参数{
。)