\ForEachX 和字符串连接

\ForEachX 和字符串连接

我正在编写一个类,其中有任意数量的字符串,我想将它们连接起来,然后循环并使用包\ForEachX中的字符串进行排版forarray。如果我定义一个命令来添加到字符串中,如下所示:

\newcommand{\addtostring}[1]{\expandafter\def\expandafter\teststring\expandafter{\teststring {, }#1}}
\addtostring{A string}
\addtostring{to break}

然后尝试用逗号分隔,但\ForEachX似乎无法识别要分隔的逗号。

相反,如果我定义一个包含类似字符串的命令,则不会有问题(请参阅下面的 MWE)。我怀疑这与命令有关\expandafter,但我对这个命令的工作原理的理解相当模糊。

我该如何设置,以便我的\addtostring命令允许将任意数量的逗号分隔的标记串在一起,形成可以用逗号分隔的内容\ForEachX

这是MWE:

\documentclass[10pt,a4paper]{article}
\usepackage{forarray}

\newcommand{\teststring}{}
\newcommand{\addtostring}[1]{\expandafter\def\expandafter\teststring\expandafter{\teststring {, }#1}}
\addtostring{A string}
\addtostring{to break}

\newcommand{\anotherteststring}{, Another string, to break}

\begin{document}

 Test string: \teststring

 \begin{itemize}
  \ForEachX{,}{\item \thislevelitem}{\teststring}
  \ForEachX{,}{\item \thislevelitem}{\anotherteststring}
 \end{itemize}

\end{document}

我知道这个例子有点不自然。\addtostring是一个命令的存根,它接受两个参数并用它们生成一个格式化的字符串。

另外,我知道我设置此代码的方式会在字符串开头有一个额外的空标记。我可以处理这个问题。

答案1

删除逗号周围的括号:

\documentclass[10pt,a4paper]{article}
\usepackage{forarray}

\newcommand{\teststring}{}
\newcommand{\addtostring}[1]{%
  \expandafter\def\expandafter\teststring\expandafter{\teststring,#1}%
}
\addtostring{A string}
\addtostring{to break}

\newcommand{\anotherteststring}{, Another string, to break}

\begin{document}

 Test string: \teststring

 \begin{itemize}
  \ForEachX{,}{\item \thislevelitem}{\teststring}
  \ForEachX{,}{\item \thislevelitem}{\anotherteststring}
 \end{itemize}

\end{document}

在此处输入图片描述

更好的实现是expl3使用序列。 的可选参数\addtostring是“字符串名称”(默认情况下,名称为“default”)。 的可选参数也是如此\usestring。请注意,开头有逗号时不会产生副作用。

\documentclass[10pt,a4paper]{article}
\usepackage{xparse}

\ExplSyntaxOn
\NewDocumentCommand{\addtostring}{O{default}m}
 {
  \seq_if_exist:cF { g_goblin_string_#1_seq }
   {
    \seq_new:c { g_goblin_string_#1_seq }
   }
  \seq_gput_right:cn { g_goblin_string_#1_seq } { #2 }
 }

\NewDocumentCommand{\usestring}{O{default}m}
 {
  \seq_map_inline:cn { g_goblin_string_#1_seq } { #2 ##1 }
 }
\ExplSyntaxOff

\addtostring{A string}
\addtostring{to break}

\addtostring[new]{Another string}
\addtostring[new]{to break}

\begin{document}

\begin{itemize}
\usestring{\item}
\usestring[new]{\item}
\end{itemize}

\end{document}

在此处输入图片描述

相关内容