我想知道是否有反向版本的输入。
例如,我维护一个事物清单。
list.txt
\myitem{20080103}{a}
\myitem{20090202}{b}
我可以在一个文件中执行\input{list.txt}
并定义\myitem
以生成逐项列表。
但现在我想在另一个文件中以表格形式反向列出它们。我可以重新定义\myitem
,但有没有一种简单的方法可以\input
反向排列?即
\myitem{20090202}{b}
\myitem{20080103}{a}
答案1
下面的示例重新定义宏\myitem
来构建 中的反转列表\rlist
,然后使用它来代替\input
:
\documentclass{article}
\usepackage{etoolbox}
\newcommand*{\myitem}[2]{#1\\}
\begin{document}
\begin{tabular}{ll}
\hline
\input{list.txt}
\hline
\end{tabular}
\begingroup
\def\rlist{}%
\renewcommand*{\myitem}[2]{%
\pretocmd\rlist{\myitem{#1}{#2}}{}{}%
}%
\input{list.txt}
\global\let\rlist=\rlist
\endgroup
\begin{tabular}{ll}
\hline
\rlist
\hline
\end{tabular}
\end{document}
答案2
编程练习expl3
。
\begin{filecontents*}{\jobname.list}
\myitem{20080103}{a}
\myitem{20090202}{b}
\end{filecontents*}
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\inputlist}{sm}
{
\IfBooleanTF{#1}
{
\cs_set_eq:NN \__egreg_list_put:Nn \seq_put_left:Nn
\egreg_print_list:n { #2 }
}
{
\cs_set_eq:NN \__egreg_list_put:Nn \seq_put_right:Nn
\egreg_print_list:n { #2 }
}
}
\seq_new:N \l__egreg_list_input_seq
\ior_new:N \l__egreg_list_read_stream
\cs_new_protected:Npn \egreg_print_list:n #1
{
\seq_clear:N \l__egreg_list_input_seq
\ior_open:Nn \l__egreg_list_read_stream { #1 }
\ior_map_inline:Nn \l__egreg_list_read_stream
{
\__egreg_list_put:Nn \l__egreg_list_input_seq { ##1 }
}
\seq_use:Nn \l__egreg_list_input_seq { }
}
\ExplSyntaxOff
\newcommand{\myitem}[2]{\printdate#1\\}
\newcommand{\printdate}[8]{#1#2#3#4-#5#6-#7#8}
\begin{document}
\begin{tabular}{ll}
\inputlist{\jobname.list}
\end{tabular}
\bigskip
\begin{tabular}{ll}
\inputlist*{\jobname.list}
\end{tabular}
\end{document}
输入文件逐行读取,每行按顺序存储以供后续使用。*
变体会反转顺序,因为序列是反向构建的。
可以进行多种改进。