\按相反顺序输入

\按相反顺序输入

我想知道是否有反向版本的输入。

例如,我维护一个事物清单。

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&#2\\}

\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&#2\\}
\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}

输入文件逐行读取,每行按顺序存储以供后续使用。*变体会反转顺序,因为序列是反向构建的。

可以进行多种改进。

在此处输入图片描述

相关内容