打印使用 etoolbox 包创建的工作数组的所有元素

打印使用 etoolbox 包创建的工作数组的所有元素

我正在尝试定义一个包含元素的数组,偶然发现了以下代码,它可以工作。问题是我如何定义一个命令,它可以一次打印所有元素,而不是逐个打印每个元素。

\documentclass{article} 
\usepackage{etoolbox}

\newcounter{cnt}

\newcommand\addtext[1]{%
\stepcounter{cnt}%
 \csdef{text\thecnt}{#1}}

\newcommand\gettext[1]{%
  \csuse{text#1}}


\begin{document}

\addtext{one}
\addtext{two}
\addtext{three}

\gettext{1}
\gettext{2}
\gettext{3}


\end{document}

答案1

任何循环命令都可以,我使用了\forloop同名包中的命令并定义了一个命令\getfulltext[]{number of textelements}

第一个可选参数默认为[ ](空格之间!!!),用作各个文本元素的分隔符。如果不需要空格,请[]在调用时使用 explitly。

然而,该命令确实\gettext总是使用相同的文本“数组”

编辑spacing现在列表末尾没有附加内容。

\documentclass{article} 

\usepackage{forloop}%


\usepackage{etoolbox}

\newcounter{cnt}

\newcounter{loopcounter}
\newcounter{numberofelements}%

\newcommand\addtext[1]{%
\stepcounter{cnt}%
 \csdef{text\thecnt}{#1}
\setcounter{numberofelements}{\number\value{cnt}}%
}%



\newcommand\gettext[1]{%
  \csuse{text#1}}

\newrobustcmd{\getfulltext}[2][ ]{%
\forloop{loopcounter}{1}{\number\value{loopcounter} < #2}{%
\ifnumless{\number\value{loopcounter}}{#2 - 1}{%
\gettext{\number\value{loopcounter}}#1%
}{%
\gettext{\number\value{loopcounter}}%
}%
}% End of loop
\setcounter{loopcounter}{0}%
}% End of command


\begin{document}

\addtext{one}
\addtext{two}
\addtext{three}

\stepcounter{numberofelements}%



  \begin{itemize}
\item Separate usage of `\texttt{\(\backslash\) gettext\{\}}`

\gettext{1}
\gettext{2}
\gettext{3}

\item No space between:

\getfulltext[]{\number\value{numberofelements}}%

\item Space between

\getfulltext{\number\value{numberofelements}}%

\item Long \(\longrightarrow\) between

\getfulltext[\(\longrightarrow\)]{\number\value{numberofelements}}% 
\end{itemize}



\end{document}

在此处输入图片描述

答案2

etoolbox包有几个用于管理列表的函数,但我将展示一种使用xparseexpl3(LaTeX3 的编程环境)的不同方法。

我将定义宏来管理您想要的任意数量的列表。宏\addtolist添加到列表中;宏\printlist使用作为可选参数给出的命令映射列表(默认为仅打印项目)。\listlength您可以访问列表中的项目数。

\documentclass{article}
\usepackage{xparse}

\ExplSyntaxOn
\NewDocumentCommand{\createlist}{ m }
 {
  \seq_new:c { g_ncory_list_#1_seq }
 }

\NewDocumentCommand{\addtolist}{ m m }
 {
  \seq_gput_right:cn { g_ncory_list_#1_seq } { #2 }
 }

\DeclareExpandableDocumentCommand{\getfromlist}{ m m }
 {
  \ncory_getfromlist:nn { #1 } { #2 }
 }

\NewDocumentCommand{\printlist}{ O{\use:n} m }
 {
  \ncory_printlist:nn { #1 } { #2 }
 }

\DeclareExpandableDocumentCommand{\listlength}{ m }
 {
  \seq_count:c { g_ncory_list_#1_seq }
 }

\cs_new:Npn \ncory_getfromlist:nn #1 #2
 {
  \int_compare:nTF { #2 > \seq_count:c { g_ncory_list_#1_seq } }
   {
    OUT~OF~RANGE
   }
   {
    \seq_item:cn { g_ncory_list_#1_seq } { #2 }
   }
 }

\cs_new_protected:Npn \ncory_printlist:nn #1 #2
 {
  \seq_map_inline:cn { g_ncory_list_#2_seq } { #1 { ##1 } }
 }

\ExplSyntaxOff

\createlist{default}
\newcommand{\foo}[1]{\item #1}

\begin{document}

\addtolist{default}{one}
\addtolist{default}{two}
\addtolist{default}{three}

\getfromlist{default}{1}

\printlist{default}, \listlength{default}

\begin{itemize}
\printlist[\foo]{default}
\end{itemize}

\end{document}

在此处输入图片描述

相关内容