创建命令来填充模板表

创建命令来填充模板表

我正在为项目的可交付成果创建样式文件。在草稿阶段,可交付成果需要在表格中显示修订历史记录(版本、日期、修改、修改者)。

在样式文件中,我定义了一个命令:

\newcommand{\makedeliverable}{ % very long template
}

在使用模板制作的任何可交付成果中,都会立即用于创建封面、目录、图表列表等。(我知道这可能不是最好的方式,但效果很好,我能够快速完成它)。\newdeliverable \makedeliverable\begin{document}

我还希望此命令根据用户在其自己的序言中指定的修订来创建修订历史记录表。

因此在.sty文件中(作为命令的一部分\makedeliverable),我将拥有:

\begin{tabular}{|p{0.2\textwidth} | p{0.3\textwidth} | p{0.3\textwidth} | p{0.2\textwidth} |}
    \hline
   \textbf{Version} & \textbf{Date} & \textbf{Modifications} &     \textbf{Modified by}\\
\hline
% something here to populate the table
\end{tabular}

并且还有一个命令定义如下:

\newcommand{\addrevision}[4]{ %something
}

在序言中会这样调用(例如):

\addrevision{0.1, 2017-11-27, Added new stuff, J. Bloggs}
\addrevision{0.2, 2017-11-27, Added more new stuff, B. Smith}

凭借我的编程能力,我本来可以\addrevision填充一个数组,然后将其打印在表格中。但我不确定如何在 LaTeX 中做到这一点。

欢迎任何建议。

答案1

下面的代码可以实现我认为你想要的功能。它使用LaTeX3为修订历史建立一个标记列表。代码假定这些\addrevision{...}行是按“修订顺序”添加的。遵循书签手册中,我放弃了垂直规则,因为普遍的看法是,没有它们,表格看起来会更好(如果需要的话,将它们添加回来也很简单)。

代码定义了两个命令:

  • \addrevision{...}:接受/期望以逗号分隔的列表“修订数据”:版本、日期、修改、修改器
  • \RevisionHistory:插入当前修订历史记录

输出如下:

在此处输入图片描述

...代码如下:

\documentclass{article}
\usepackage{expl3}
\usepackage{booktabs}

\ExplSyntaxOn
\tl_new:N \l_revisions_tl% to hold revision history
\newcommand\addrevision[1]{% add to \l_revisions_tl
  \regex_split:nnN {\,} {#1} \l_tmpa_seq% split #1 on commas
  \seq_pop_left:NN \l_tmpa_seq \l_tmpa_tl% don't want & before first entry
  \tl_put_right:NV \l_revisions_tl \l_tmpa_tl
  \seq_map_inline:Nn \l_tmpa_seq { \tl_put_right:Nn \l_revisions_tl {&##1} }
  \tl_put_right:Nn \l_revisions_tl {\\}% add \\ for end of line
}
\newcommand\RevisionHistory{%
  \begin{tabular}{p{0.2\textwidth}p{0.3\textwidth}p{0.3\textwidth}p{0.2\textwidth}}
     \toprule
     \textbf{Version} & \textbf{Date} & \textbf{Modifications} & \textbf{Modified~by}\\
     \midrule
     \tl_use:N \l_revisions_tl
     \bottomrule
  \end{tabular}
}
\ExplSyntaxOff

\begin{document}

  \addrevision{0.1, 2017-11-27, Added new stuff, J. Bloggs}
  \addrevision{0.2, 2017-11-27, Added more new stuff, B. Smith}

  \RevisionHistory

\end{document}

我使用了与 OP 相同的列宽,但可能应该将第 1、2 和 4 列都缩小,而修改列应该更宽。如果修订历史记录长达几页,那么长桌或者超表格式应该使用。

编辑

这是使用序列的第二个版本expl3。这在精神上更接近 OP 中建议的方法,并且代码更短,可以说更容易理解。

\documentclass{article}
\usepackage{expl3}
\usepackage{booktabs}

\ExplSyntaxOn
\seq_new:N \l_revisions_seq
\newcommand\addrevision[1]{% add to \l_revisions_seq
  \seq_put_right:Nn \l_revisions_seq {#1}
}
\newcommand\RevisionHistory{%
\begin{tabular}{p{0.2\textwidth}p{0.3\textwidth}p{0.3\textwidth}p{0.2\textwidth}}
     \toprule
     \textbf{Version} & \textbf{Date} & \textbf{Modifications} & \textbf{Modified~by}\\
     \midrule
     \seq_map_inline:Nn \l_revisions_seq {% loop over revisions
       \regex_split:nnN {\,} {##1} \l_tmpa_seq% split on commas
       \seq_use:Nn \l_tmpa_seq {&}% print the table row
       \\
     }
     \\[-12pt]% \\ is necessary here but it inserts a blank line, so hack...
     \bottomrule
  \end{tabular}
}
\ExplSyntaxOff

\begin{document}

  \addrevision{0.1, 2017-11-27, Added new stuff, J. Bloggs}
  \addrevision{0.2, 2017-11-27, Added more new stuff, B. Smith}

  \RevisionHistory

\end{document}

由于一些我不知道的原因,我不得不使用 hack\\[-12pt]\bottomrule来防止表格底部出现空行。输出与以前相同

答案2

强制性的\xintFor解决方案。

\documentclass{article}
\usepackage{xinttools}
\usepackage{booktabs}

\newcommand\Revisions {}%

\newcommand\addrevision[1]{% 
% append a new revision, the csv list being converted to braced items
    \global\oodef\Revisions
% oodef = twice expand contents, second expansion will expand \Revisions
% itself; first expansion propagates to \xintcsvtolist to convert #1
% into braced items, which we will use with \xintListWithSep later on
    {\expandafter\Revisions\expandafter{\romannumeral0\xintcsvtolist{#1}}}%
}

\newcommand\RevisionHistory{%
  \begin{tabular}{p{0.2\textwidth}p{0.3\textwidth}p{0.3\textwidth}p{0.2\textwidth}}
     \toprule
     \textbf{Version} & \textbf{Date} & \textbf{Modifications} & \textbf{Modified~by}\\
     \midrule
% we need to double the # here because we are inside a macro definition
     \xintFor* ##1 in \Revisions
     \do
         {\xintListWithSep{&}{##1}\\}% one row for each revision
     \bottomrule
  \end{tabular}
}

\begin{document}

  \addrevision{0.1, 2017-11-27, Added new stuff, J. Bloggs}
  \addrevision{0.2, 2017-11-27, Added more new stuff, B. Smith}

  \RevisionHistory

\end{document}

在此处输入图片描述

答案3

您可以将\addrevision表行写入临时文件\input\makedeliverable

\documentclass{article}
\usepackage{booktabs}
%%%%% In sty-file
\newwrite\RevisionFile
\immediate\openout\RevisionFile=\jobname.Revision.txt
\newcommand\addrevision[4]{%
  \immediate\write\RevisionFile{#1 & #2 & #3 & #4 \noexpand\\}  
}
\newcommand\makedeliverable{%
  \immediate\closeout\RevisionFile
  \begin{tabular}{p{0.2\textwidth}p{0.3\textwidth}p{0.3\textwidth}p{0.2\textwidth}}
    \toprule
    \textbf{Version} & \textbf{Date} & \textbf{Modifications} &     \textbf{Modified by}\\\midrule
    \input{\jobname.Revision.txt}
    \bottomrule
  \end{tabular}
}
%%%%% End of sty-file
%%%%% Revisions
\addrevision{0.1}{2017-11-27}{Added new stuff}{J. Bloggs}
\addrevision{0.2}{2017-11-27}{Added more new stuff}{B. Smith}
%%%%%
\begin{document}
\makedeliverable

\end{document}

该文件<filename>.Revision.txt创建为

0.1 & 2017-11-27 & Added new stuff & J. Bloggs \\
0.2 & 2017-11-27 & Added more new stuff & B. Smith \\

输出结果如下:

在此处输入图片描述

相关内容