定义并迭代项目列表

定义并迭代项目列表

我希望有一个动态的项目列表,这些项目是我在文档中的某个位置定义的,然后通过遍历这些项目在其他地方的表中使用。为了澄清我的意思,下面是一个最小的解决方案:

\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、、和其他类似的软件包,但是这些软件包和/或它们的使用结果非常不舒服,即使它确实起作用(无论舒服与否,我迄今为止都无法找到一个完整的、可行的解决方案)forloopforarray

如您所见,我受 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以便它正确显示在脚线上。我已经有了一个方法,但到目前为止还没有测试过。然而,那是另一个故事……

相关内容