问题
在 Python 等语言中,你可以像这样定义列表:
example_list = ['apples']
我可以像这样附加此列表:
example_list.append('oranges')
我可以使用打印此列表
print example_list
结果是:
['apples', 'oranges']
我怎样才能在 LaTeX 中做类似的事情?
这个问题是一系列问题的一部分。我的目标是在节点内使用此列表tikz
,但为了保持简单,我从这个问题中删除了这一点。所以,对于那些感兴趣的人,以下是供参考的快速列表:
要制作一个可以处理解析后输入列表项的宏,请参阅:
对于具有节点支持的相同解决方案tikz
,请参阅:
情况
我有一个输入语言的列表(参见我的其他问题)。我希望将每种语言代码捕获到一个列表中,以便可以将其作为内联列表打印到纸上(即 da、de、en 等)。
我希望标题页看起来像这样:
标题
da、de、en ...(或者代替 ISO 639-1 代码,使用完整语言名称列表)
附属物
已经有几个不错的答案了。虽然最初的问题得到了回答,但我的问题并没有得到解决,因为我最初没有想到一些其他事情。:( 也许有人可以帮助我。
我有一份需要输入的文件清单
伪代码
根据 Werner 的回答列出
\maketitle[\printlist{languagelist}]{User Manual}
\inputlanguagefile{En}{English}{./Languages/en/UserManual_en.tex}
\inputlanguagefile{Da}{Dansk}{./Languages/da/UserManual_da.tex}
\inputlanguagefile{De}{Deutsch}{./Languages/de/UserManual_de.tex}
我有一个自定义\maketitle
命令,其中强制输入{}
是文档的标题,可选输入[]
是副标题(ISO 639-1语言代码列表)我的问题是该\maketitle
命令在调用文件输入之前被调用,这意味着在调用语言列表时,它仍然是空的。我需要找到一种方法来逐个循环输入命令以获取两个字母的语言代码(#1)并将它们附加到我的列表中。
\maketitle
然后我想实际添加sudo 代码中所示的输入。显然,输入的文档应该出现在封面页之后,但我需要在maketitle
调用页面之前解析语言代码。
答案1
etoolbox
提供了一系列列表管理工具。以下是\listadd{<stuff>}
似乎符合您要求的一种使用方法:
\documentclass{article}
\usepackage{etoolbox}
% \printlist[<sep>]{<list macro>}
\newcommand{\printlist}[2][,]{{% Print list
% http://tex.stackexchange.com/a/89187/5764
\def\listsep{\def\listsep{#1}}% Delayed execution of list separator
\renewcommand{\do}[1]{\listsep`##1'}%
[\dolistloop\languagelist]
}}
\begin{document}
\listadd{\languagelist}{de}
\listadd{\languagelist}{da}
\listadd{\languagelist}{en}
\printlist{\languagelist}
\end{document}
还有其他方法可以添加列表元素(预扩展、全局等)。唯一的要求是,\languagelist
在通过 打印之前,先定义 中包含的元素\printlist
。也就是说,它不像\label
-系统那样工作,在 -\ref
系统中,您可以参考未来 \label
秒。
答案2
expl3
使用和可以获得相当灵活的列表管理xparse
。
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\listset}{O{default}m}
{
\seq_clear_new:c { l_macmadness_list_#1_seq }
\seq_set_from_clist:cn { l_macmadness_list_#1_seq } { #2 }
}
\NewDocumentCommand{\listappend}{O{default}m}
{
\clist_map_inline:nn { #2 }
{
\seq_put_right:cn { l_macmadness_list_#1_seq } { ##1 }
}
}
\NewDocumentCommand{\listprint}{O{}}
{
\group_begin:
\keys_set:nn { macmadness/lists } { #1 }
\macmadness_print_list:V \l__macmadness_list_name_tl
\group_end:
}
\seq_new:N \l_macmadness_list_default_seq
\tl_new:N \l__macmadness_list_lastitem_tl
\keys_define:nn { macmadness/lists }
{
name .tl_set:N = \l__macmadness_list_name_tl,
name .initial:n = default,
action .code:n = \cs_set_eq:NN \__macmadness_action:n #1,
action .initial:n = \use:n,
separator .tl_set:N = \l__macmadness_list_separator_tl,
separator .initial:n = { ,~ },
}
\cs_new_protected:Npn \macmadness_print_list:n #1
{
\seq_if_empty:cTF { l_macmadness_list_#1_seq }
{
$\langle$ \textit{empty~list} $\rangle$
}
{
% split off the last item
\seq_pop_right:cN { l_macmadness_list_#1_seq } \l__macmadness_list_lastitem_tl
% print the items followed by the separator
\seq_map_inline:cn
{ l_macmadness_list_#1_seq }
{
\__macmadness_action:n { ##1 } % the item
\l__macmadness_list_separator_tl % the separator
}
% print the last item
\__macmadness_action:n { \l__macmadness_list_lastitem_tl }
}
}
\cs_generate_variant:Nn \macmadness_print_list:n { V }
\ExplSyntaxOff
\newcommand{\addquotes}[1]{`#1'}
\begin{document}
\listset{apples}
\listappend{oranges,strawberries}
\listprint
\listprint[
separator={ $|$ },
action=\addquotes
]
\listset[languages]{de,da,en}
\listprint[
name=languages,
action=\addquotes,
]
\listset[empty]{}
\listprint[name=empty]
\end{document}
\listset
列表通过作为或 的可选参数给出的名称来标识\listappend
。如果没有可选参数,则名称为default
。
该命令\listprint
接收可选的键值对列表。键是
name
用于告诉打印什么列表(name=default
隐式);separator
用于指示如何分隔项目,默认是“逗号和空格”;action
应该接收一个参数宏作为值;在示例中它是\addquotes
,但它可以是\textit
任何预定义或个人宏;默认只是打印该项目。
您可以将其action
用于任何您喜欢的操作,例如输入文件。我创建了UserManual_de.tex
,UserManual_en.tex
并UserManual_de.tex
在其中包含一些模拟文本(只是“这是德语|英语|丹麦语手册”)并定义了适当的\inputlanguagefile
操作。
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\listset}{O{default}m}
{
\seq_clear_new:c { l_macmadness_list_#1_seq }
\seq_set_from_clist:cn { l_macmadness_list_#1_seq } { #2 }
}
\NewDocumentCommand{\listappend}{O{default}m}
{
\clist_map_inline:nn { #2 }
{
\seq_put_right:cn { l_macmadness_list_#1_seq } { ##1 }
}
}
\NewDocumentCommand{\listprint}{+O{}}
{
\group_begin:
\keys_set:nn { macmadness/lists } { #1 }
\macmadness_print_list:V \l__macmadness_list_name_tl
\group_end:
}
\seq_new:N \l_macmadness_list_default_seq
\tl_new:N \l__macmadness_list_lastitem_tl
\keys_define:nn { macmadness/lists }
{
name .tl_set:N = \l__macmadness_list_name_tl,
name .initial:n = default,
action .code:n = \cs_set_eq:NN \__macmadness_action:n #1,
action .initial:n = \use:n,
separator .tl_set:N = \l__macmadness_list_separator_tl,
separator .initial:n = { ,~ },
}
\cs_new_protected:Npn \macmadness_print_list:n #1
{
\seq_if_empty:cTF { l_macmadness_list_#1_seq }
{
$\langle$ \textit{empty~list} $\rangle$
}
{
% split off the last item
\seq_pop_right:cN { l_macmadness_list_#1_seq } \l__macmadness_list_lastitem_tl
% print the items followed by the separator
\seq_map_inline:cn
{ l_macmadness_list_#1_seq }
{
\__macmadness_action:n { ##1 } % the item
\l__macmadness_list_separator_tl % the separator
}
% print the last item
\__macmadness_action:n { \l__macmadness_list_lastitem_tl }
}
}
\cs_generate_variant:Nn \macmadness_print_list:n { V }
\ExplSyntaxOff
\newcommand{\addquotes}[1]{`#1'}
\newcommand{\inputlanguagefile}[1]{%
\input{UserManual_#1}%
}
\listset[languages]{de,da,en}
\begin{document}
\title{\listprint[name=languages]}
\author{macmadness86}
\maketitle
\section{Examples of list management}
\listset{apples}
\listappend{oranges,strawberries}
\listprint
\listprint[
separator={ $|$ },
action=\addquotes
]
\listprint[
name=languages,
action=\addquotes,
]
\listset[empty]{}
\listprint[name=empty]
\section{The manuals}
\listprint[
name=languages,
separator=\par\bigskip,
action=\inputlanguagefile,
]
\end{document}
答案3
这使用该包并使用等etoolbox
在一行中添加一些列表元素。\forcsvlist{\listadd{\myfruitlist}}{element1,element2,element3}
根据扩展/全局可用性的需求,可以使用\listadd{\myfruitlist}{element}
或\listgadd
、\listeadd
、来添加单个元素。\listxadd
列表的输出/处理可以通过(例如)\forlistloop
和元素处理宏来完成。还有其他例程,请参阅有关此内容 \printfruitlist
的文档。etoolbox
\documentclass{article}
\usepackage{etoolbox}
\def\myfruitlist{}
\newcommand{\printfruitlist}[1]{%
\textbf{#1}
}%
\begin{document}
\forcsvlist{\listadd{\myfruitlist}}{apples,oranges,strawberries}
\listadd{\myfruitlist}{salad}
\listadd{\myfruitlist}{bananas}
Find the error in this list:
\forlistloop{\printfruitlist}{\myfruitlist}
\end{document}