我正在尝试定义一个包含元素的数组,偶然发现了以下代码,它可以工作。问题是我如何定义一个命令,它可以一次打印所有元素,而不是逐个打印每个元素。
\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
包有几个用于管理列表的函数,但我将展示一种使用xparse
和expl3
(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}