有没有办法我可以做类似的事情
\createlist{listone} % A description list specifically
\additem{listone}{item1}{description1}
\additem{listone}{item2}{description2}
.
.
.
\makelist{listone}
我真的不知道该如何开始用谷歌搜索这个(试过但失败了)。如果你能给我指出任何文档或告诉我是否有可能创建这样的函数,那就太棒了!谢谢!
此外,如果您能指出该问题的正确标签,我将非常感激。
编辑:
这个想法是,你可以有各种“列表”,你可以在其中添加任意数量的项目.tex
。然后,当你使用命令时,你决定输出该描述列表\makelist
答案1
xparse
您可以使用和 来完成expl3
:
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\createlist}{m}
{
\seq_new:c { g_mo_list_#1_seq }
}
\NewDocumentCommand{\additem}{mmm}
{
\seq_gput_right:cn { g_mo_list_#1_seq } { {#2}{#3} }
}
\NewDocumentCommand{\makelist}{m}
{
\begin{description}
\seq_map_function:cN { g_mo_list_#1_seq } \__mo_list_item:n
\end{description}
}
\cs_new:Nn \__mo_list_item:n { \__mo_list_item:nn #1 }
\cs_new:Nn \__mo_list_item:nn { \item[#1] #2 }
\ExplSyntaxOff
\begin{document}
\createlist{listone} % A description list specifically
\additem{listone}{item1}{description1}
\additem{listone}{item2}{description2}
\makelist{listone}
\end{document}
更灵活的实现,您可以改变列表的格式。
键的值command
可以使用#1
和#2
来引用项目的两个部分。
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\createlist}{m}
{
\seq_new:c { g_mo_list_#1_seq }
}
\NewDocumentCommand{\additem}{mmm}
{
\seq_gput_right:cn { g_mo_list_#1_seq } { \__mo_list_do:nn {#2}{#3} }
}
\NewDocumentCommand{\makelist}{O{}m}
{
\group_begin:
\keys_set:nn { mo/list } { #1 }
\l__mo_list_pre_tl
\seq_use:cn { g_mo_list_#2_seq } { }
\l__mo_list_post_tl
\group_end:
}
\keys_define:nn { mo/list }
{
pre .tl_set:N = \l__mo_list_pre_tl,
post .tl_set:N = \l__mo_list_post_tl,
command .code:n = \cs_set:Nn \__mo_list_do:nn { #1 },
pre .initial:n = { \begin{description} },
post .initial:n = { \end{description} },
command .initial:n = \item[#1] #2,
}
\ExplSyntaxOff
\begin{document}
\createlist{listone} % A description list specifically
\additem{listone}{item1}{description1}
\additem{listone}{item2}{description2}
\makelist{listone}
\bigskip
\makelist[
pre=\begin{tabular}{ll} Item & Description \\ \hline,
post=\end{tabular},
command=#1 & #2 \\,
]{listone}
\end{document}