表中的倒排标记列表

表中的倒排标记列表

我阅读了很多关于此事的问题和答案,每个问题和答案都符合我的要求,但当我试图将它们合并在一起时,整个世界都崩溃了……

我的目标是在文档开头建立一个修订表。我发现生成自动修订编号表格这样做效果很好。问题是,我的公司要求修订版按“最后”的顺序排列。因此,使用这个例子,当我使用

\AddRevision{2017-04-28}{Initial Release}{Miraino Hikari}
\AddRevision{2017-05-02}{Modification for something}{Jo Someone}

我得到了这个结果

Revisions:
0   2017-04-28     Initial Release                     Miraino Hikari
1   2017-05-02     Modification after some revision        Jo Someone

但我想要的是

Revisions:
1   2017-05-02     Modification after some revision        Jo Someone
0   2017-04-28     Initial Release                     Miraino Hikari

因此我找到了一种恢复列表的方法:如何反转用于 tikz foreach 循环的列表当你有一个普通列表时,它工作得很好,但当你尝试构建表格时,它就不那么好了。然后我发现构建表时,如何在 foreach 或条件(或其他组/环境)中使用与号 (&)?其工作原理类似于修订编号表格示例,但我仍然不知道如何恢复我的列表。

为了进行一些测试,我尝试使用所有这些示例来生成“First-Top”和“Last-Top”示例。(名称已更改以保持原始工作)

\let\revlist\empty
\let\revlistI\empty

\newcommand\NewAddRevTable[1]{%
    \ifx\revlist\empty
        \xdef\revlist{#1}%
        \xdef\revlistI{#1}%
    \else
        \xdef\revlist{\revlist,{#1}}%
        \xdef\revlistI{{#1},\revlistI}%
    \fi
}

\newcommand*\MyRevisionTable{
    \begin{flushleft}
        \textbf{\iflanguage{french}{Révisions :}{Revisions:}}\\
    \end{flushleft}
    \begin{table}[H]
        \begin{tabularx}{\textwidth}{llXr}
            \foreach\rev in \revlist {
                \rev\\
            }
        \end{tabularx}
    \end{table}
}

\newcounter{MyRevCounter}
\newcommand{\NewRevision}[3]{ 
    \NewAddRevTable{\arabic{MyRevCounter} & #1 & #2 & #3} 
    \stepcounter{MyRevCounter}
}%

\NewRevision{2017-04-28}{Version initiale}{Miraino Hikari}
\NewRevision{2017-05-02}{Modification after some revision}{Jo Someone}

当然,这段代码不起作用(除非我转义了 & 并删除了 tabularx 环境)。但是更改更新列表为了列表I完全按照我所寻找的进行操作(除了它不在表中)

我怀疑原始修订代码中的魔法就发生在这里

\newcommand\AddNewRevTableTokens[1]{\global\@myrevtabtoks\expandafter{\the\@myrevtabtoks#1}}
\newcommand\eAddNewRevTableTokens[1]{%
    \protected@edef\NewRevTkTable{#1}%
    \expandafter\AddNewRevTableTokens\expandafter{\NewRevTkTable}%  
}

但为此我尝试过

\newcommand\AddNewRevTableTokens[1]{\global\@myrevtabtoks\expandafter{\the\@myrevtabtoks#1}}
\newcommand\eAddNewRevTableTokens[1]{%
    \expandafter\AddNewRevTableTokens\expandafter{\NewRevTkTable}%  
    \protected@edef\NewRevTkTable{#1}%
}

它不关心任何额外的修改,而这个

\newcommand\AddNewRevTableTokens[1]{\global\@myrevtabtoks\expandafter{#1\the\@myrevtabtoks}}
\newcommand\eAddNewRevTableTokens[1]{%
    \protected@edef\NewRevTkTable{#1}%
    \expandafter\AddNewRevTableTokens\expandafter{\NewRevTkTable}%  
}

只是编译不成功,出现错误

TeX capacity exceeded, sorry [input stack size=5000]. \MyRevisionTable

所以我需要帮助。提前谢谢。

答案1

这里有一些获取两个订单的代码:

\documentclass{article}   

\usepackage{xparse}
\ExplSyntaxOn

\tl_new:N   \l_rev_tablecontents_first_tl
\tl_new:N   \l_rev_tablecontents_last_tl
\int_new:N  \l_rev_counter_int

\NewDocumentCommand\ClearRevision { }
 {
  \tl_clear:N \l_rev_tablecontents
  \int_zero:N \l_rev_counter_int
 }

\NewDocumentCommand\AddRevision { m m m}
{
  \int_incr:N  \l_rev_counter_int
  \tl_put_left:Nn \l_rev_tablecontents_last_tl   { #1 & #2 & #3 \\}
  \tl_put_left:Nx \l_rev_tablecontents_last_tl   { \int_to_arabic:n { \l_rev_counter_int }  & }
  \tl_put_left:Nn \l_rev_tablecontents_last_tl   {Revision \c_space_tl} 
  \tl_put_right:Nn \l_rev_tablecontents_first_tl {Revision \c_space_tl}
  \tl_put_right:Nx \l_rev_tablecontents_first_tl { \int_to_arabic:n { \l_rev_counter_int }  & }
  \tl_put_right:Nn \l_rev_tablecontents_first_tl { #1 & #2 & #3 \\}
}

\NewDocumentCommand\PrintRevisionFirst { }
  { 
   \begin{tabular}{lccl}
       \l_rev_tablecontents_first_tl
   \end{tabular} 
  }


\NewDocumentCommand\PrintRevisionLast { }
  {
   \begin{tabular}{lccl}
       \l_rev_tablecontents_last_tl
   \end{tabular}
  }


\ExplSyntaxOff

%-----------------------------------------------------------


\AddRevision{2017-04-28}{Initial Release}{Miraino Hikari}
\AddRevision{2017-05-02}{Modification for something}{Jo Someone}

\begin{document}

    \PrintRevisionFirst 

   \bigskip   
    \PrintRevisionLast
\end{document}

如果您想从零开始,请将 \int_incr 移至末尾。

在此处输入图片描述

答案2

如果修订是按时间顺序输入的,那么在打印时很容易以相反的顺序获取它们:只需按相反的顺序存储它们!;-)

\documentclass{article}
\usepackage{xparse,tabularx}

\ExplSyntaxOn

\NewDocumentCommand{\AddRevision}{mmm}
 {
  \hikari_revision_add:nnn { #1 } { #2 } { #3 }
 }
\NewDocumentCommand{\PrintRevisions}{}
 {
  \begin{center}
  \cs_set_eq:NN \__hikari_revision_do:nnnn \hikari_revision_print_entry:nnnn
  \begin{tabularx}{\textwidth}{llXr}
  \multicolumn{4}{l}{Revisions} \\
  \hline
  \hikari_revision_print:
  \\\hline
  \end{tabularx}
  \end{center}
 }

\seq_new:N \g_hikari_revision_list_seq
\int_new:N \g_hikari_revision_number_int

\cs_new_protected:Nn \hikari_revision_add:nnn
 {
  \seq_gput_left:Nx \g_hikari_revision_list_seq
   {
    \exp_not:N \__hikari_revision_do:nnnn
     { \int_eval:n { \g_hikari_revision_number_int } }
     \exp_not:n { { #1 } { #2 } { #3 } }
   }
  \int_incr:N \g_hikari_revision_number_int
 }

\cs_new_protected:Nn \hikari_revision_print:
 {
  \seq_use:Nn \g_hikari_revision_list_seq { \\ }
 }

\cs_new:Nn \hikari_revision_print_entry:nnnn
 {
  #1 & #2 & #3 & #4
 }

\ExplSyntaxOff

\begin{document}

\AddRevision{2017-04-28}{Initial Release}{Miraino Hikari}
\AddRevision{2017-05-02}{Modification for something}{Jo Someone}

\PrintRevisions

\end{document}

我使用间接方法存储条目,使用“虚拟函数”,我们可以在调用时将其设置为与某个真实函数相等。因此,修订列表可以以不同的方式使用,而无需更改主代码。也许您还想打印出审阅者列表或日期:只需定义一个合适的函数,就像我为 所做的那样\hikari_revision_print_entry:nnnn

在此处输入图片描述

\AddRevision允许在文档中按任意顺序排列的不同版本。项目按(反向)日期排序,作为 的一部分\PrintRevisions

\documentclass{article}
\usepackage{xparse,tabularx}

\ExplSyntaxOn

\NewDocumentCommand{\AddRevision}{mmm}
 {
  \hikari_revision_add:nnn { #1 } { #2 } { #3 }
 }
\NewDocumentCommand{\PrintRevisions}{}
 {
  \begin{center}
  \cs_set_eq:NN \__hikari_revision_do:nnn \hikari_revision_date:nnn
  \seq_set_eq:NN \l__hikari_revision_temp_seq \g_hikari_revision_list_seq
  \seq_sort:Nn \l__hikari_revision_temp_seq
   {
    \int_compare:nNnTF
     { ##1 } > { ##2 }
     { \sort_return_same: }
     { \sort_return_swapped: }
   }
  \cs_set_eq:NN \__hikari_revision_do:nnn \hikari_revision_entry:nnn
  \int_gset:Nn \g__hikari_revision_entry_int { \seq_count:N \l__hikari_revision_temp_seq }
  \tl_clear:N \l__hikari_revision_tablebody_tl
  \seq_map_inline:Nn \l__hikari_revision_temp_seq
   {
    \int_gdecr:N \g__hikari_revision_entry_int
    \tl_put_right:Nf \l__hikari_revision_tablebody_tl
     { \int_to_arabic:n { \g__hikari_revision_entry_int } ##1 }
   }
  \begin{tabularx}{\textwidth}{llXr}
  \multicolumn{4}{l}{Revisions} \\
  \hline
  \tl_use:N \l__hikari_revision_tablebody_tl
  \hline
  \end{tabularx}
  \end{center}
 }

\seq_new:N \g_hikari_revision_list_seq
\seq_new:N \l__hikari_revision_temp_seq
\int_new:N \g__hikari_revision_entry_int
\tl_new:N \l__hikari_revision_tablebody_tl
\cs_generate_variant:Nn \tl_put_right:Nn { Nf }

\cs_new_protected:Nn \hikari_revision_add:nnn
 {
  \seq_gput_right:Nn \g_hikari_revision_list_seq
   {
    \__hikari_revision_do:nnn { #1 } { #2 } { #3 }
   }
 }

\cs_new:Nn \hikari_revision_entry:nnn
 {
   & #1 & #2 & #3 \\
 }

\cs_new:Nn \hikari_revision_date:nnn
 {
  \__hikari_revision_make_date:w #1 \q_stop
 }
\cs_new:Npn \__hikari_revision_make_date:w #1-#2-#3 \q_stop
 {
  #1#2#3
 }
\ExplSyntaxOff

\begin{document}

\AddRevision{2017-05-03}{Changed code for revisions}{egreg}

\AddRevision{2017-04-28}{Initial Release}{Miraino Hikari}
\AddRevision{2017-05-02}{Modification for something}{Jo Someone}

\PrintRevisions

\end{document}

在此处输入图片描述

相关内容