使用“listofitems”包中的 \greadlist*

使用“listofitems”包中的 \greadlist*

我正在尝试定义一个列表使用\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

展开\csname 调用\greadlist

\documentclass{amsart}
\usepackage{listofitems}

\begin{document}
\newcounter{num}\setcounter{num}{4}
\setsepchar{,}
\expandafter\greadlist\expandafter*\csname 
  LIST\roman{num}\endcsname{a,b,c}

\LISTiv[2]
\end{document}

在此处输入图片描述

答案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对于不能嵌套在括号中但由左括号分隔的参数{。)

相关内容