我阅读了很多关于此事的问题和答案,每个问题和答案都符合我的要求,但当我试图将它们合并在一起时,整个世界都崩溃了……
我的目标是在文档开头建立一个修订表。我发现生成自动修订编号表格这样做效果很好。问题是,我的公司要求修订版按“最后”的顺序排列。因此,使用这个例子,当我使用
\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}