![定义并迭代项目列表](https://linux22.com/image/243210/%E5%AE%9A%E4%B9%89%E5%B9%B6%E8%BF%AD%E4%BB%A3%E9%A1%B9%E7%9B%AE%E5%88%97%E8%A1%A8.png)
我希望有一个动态的项目列表,这些项目是我在文档中的某个位置定义的,然后通过遍历这些项目在其他地方的表中使用。为了澄清我的意思,下面是一个最小的解决方案:
\documentclass{scrartcl}
\usepackage{ltxtable}
\usepackage{booktabs}
\usepackage{fltpoint}
\usepackage{numprint}
%\newitem{nameoflist,
% date = {2011-11-03},
% description = {Item A},
% amount = {29}
% price = {19}
%}
%\newitem{nameoflist,
% date = {2011-11-27},
% description = {Item B},
% amount = {32}
% price = {22}
%}
\begin{document}
\newcommand*{\initsubtotal}{\global\def\subtotal{0}}
\newcommand*{\addsubtotal}[1]{\fpAdd{\subtotal}{\subtotal}{#1}\global\let\subtotal\subtotal}
\newcommand*{\calclinetotal}[2]{\fpMul{\linetotal}{#1}{#2}}
\initsubtotal
\begin{longtable}{cclcrr}
\textbf{Pos.} &
\textbf{Date} &
\textbf{Description} &
\textbf{Amount} &
\textbf{Price} &
\textbf{Total} \\
\midrule
\endfirsthead
\textbf{Pos.} &
\textbf{Date} &
\textbf{Description} &
\textbf{Amount} &
\textbf{Price} &
\textbf{Total} \\
\midrule
\endhead
\multicolumn{5}{r}{Sum} & \numprint{\subtotal} \\
\endfoot
\midrule
\multicolumn{5}{r}{Sum} & \numprint{\subtotal} \\
\endlastfoot
%\foreachitem{nameoflist}{index}{
% \itemindex &
% \itemdate &
% \itemdescription &
% \itemamount &
% \numprint{\itemprice} &
% \calclinetotal{\itemamount}{\itemprice}
% \addsubtotal{\linetotal}
% \numprint{\linetotal} \\
%}
\end{longtable}
\end{document}
我已经注释掉了这些项目的定义和用法,因为代码中的这些点只是我希望如何拥有的示例解决方案。
我已经尝试过诸如arrayjob
、、和其他类似的软件包,但是这些软件包和/或它们的使用结果非常不舒服,即使它确实起作用(无论舒服与否,我迄今为止都无法找到一个完整的、可行的解决方案)forloop
。forarray
如您所见,我受 BibTeX 条目的常见样式启发而定义了这些条目。用法只是一个简单的想法,即它如何绝对舒适(至少对于给定的目的而言)。
答案1
根据 Yiannis 在对我的问题的评论中提供的链接示例,我使用该包得出了以下解决方案lstdoc
:
\documentclass{scrartcl}
\usepackage{ltxtable}
\usepackage{booktabs}
\usepackage{fltpoint}
\usepackage{numprint}
\usepackage{lstdoc}
\begin{document}
\makeatletter
\let\itemlist\@empty
\def\addtolist#1#2{%
\lst@lAddTo#1{#2}%
}
\def\newitem#1|#2|#3|#4|#5;{%
\addtolist{\itemlist}{#1,}%
\expandafter\gdef\csname#1\endcsname{%
#1 &
#2 &
#3 &
#4 &
#5 &
\calclinetotal{#4}{#5}%
\addsubtotal{\linetotal}%
\numprint{\linetotal} \\
}%
}
\newitem 1 | 2011-11-03 | Item A | 29 | 19;
\newitem 2 | 2011-11-27 | Item B | 32 | 22;
\newcommand*{\initsubtotal}{\global\def\subtotal{0}}
\newcommand*{\addsubtotal}[1]{\fpAdd{\subtotal}{\subtotal}{#1}\global\let\subtotal\subtotal}
\newcommand*{\calclinetotal}[2]{\fpMul{\linetotal}{#1}{#2}}
\initsubtotal
\begin{longtable}{cclcrr}
\textbf{Pos.} &
\textbf{Date} &
\textbf{Description} &
\textbf{Amount} &
\textbf{Price} &
\textbf{Total} \\
\midrule
\endfirsthead
\textbf{Pos.} &
\textbf{Date} &
\textbf{Description} &
\textbf{Amount} &
\textbf{Price} &
\textbf{Total} \\
\midrule
\endhead
\multicolumn{5}{r}{Sum} & \numprint{\subtotal} \\
\endfoot
\midrule
\multicolumn{5}{r}{Sum} & \numprint{\subtotal} \\
\endlastfoot
\@for\item:=\itemlist \do{\ifx\@empty\item\vspace{-14pt}\else\csname\item\endcsname\fi}
\end{longtable}
\end{document}
现在,我只需要弄清楚如何处理,\subtotal
以便它正确显示在脚线上。我已经有了一个方法,但到目前为止还没有测试过。然而,那是另一个故事……