我正在构建一个可以读取 CSV 文件并使用datatool
和输出发票文件的类tabularx
。
% file "invoice.cls"
...
\newcommand \invoice{
% load invoice table database
\DTLloadrawdb{invoicedb}{\invoicefile}
% generate invoice table
\begin{table}
\newcommand \amount{\$0}
\newcommand \amounttotal{\$0}
\newcommand \hourstotal{0.0}
\centering
\begin{tabularx}{\linewidth}{lXrrr}
\textbf{Date} & \textbf{Description} & \textbf{Rate} & \textbf{Hour(s)} & \textbf{Amount} \\ \hline
\DTLforeach{invoicedb}{\date=Date,\description=Description,\rate=Rate,\hours=Hours}{%
\DTLgmul{\amount}{\rate}{\hours}%
\DTLgadd{\amounttotal}{\amount}{\amounttotal}%
% table row
\date &
\description &
\DTLround{\v}{\rate}{2}\v &
\DTLround{\v}{\hours}{1}\v &
\DTLround{\v}{\amount}{2}\v \\
\DTLiflastrow{\hline}{}%
}
\DTLground{\amounttotal}{\amounttotal}{2}%
\DTLsumcolumn{invoicedb}{Hours}{\hourstotal}%
%\show \amounttotal
%\show \hourstotal
& & \textbf{Total:} &
\hourstotal &
\amounttotal
\end{tabularx}
\end{table}
}
...
这几乎按预期工作;但是,总和值\hourstotal
并\amounttotal
没有按我期望的方式进行评估。
取消注释每个\show
命令:
$ pdflatex invoice.tex
...
> \amounttotal=macro:
->\$655.20.
<inserted text> ...total }\par \show \amounttotal
& & \textbf {Total:} & \ho...
l.5 \invoice
...
然后再次
$ pdflatex invoice.tex
...
> \hourstotal=macro:
->23.400000000.
<inserted text> ...stotal }\par \show \hourstotal
& & \textbf {Total:} & \ho...
l.5 \invoice
...
这些价值观正确的。我预计总数量为$655.20
,总小时数为23.4
。
然而,当它们被评估时紧接着的下一行,实际产生的值是$1,965.60
总金额和0.0
小时数。
我发现这真是太奇怪了,这个\amounttotal
值正好是命令看到的值的三倍,\show
但同时这个\totalhours
值似乎已经丢失了。
任何帮助都将不胜感激。请告诉我在尝试调试此问题时是否应该包含任何其他重要信息。
答案1
谢谢卡博哈和大卫·查莱尔tabular
,我能够通过使用而不是来提出这个解决方案tabularx
:
...
\begin{tabular}{lp{3.2in}rrr}
\textbf{Date} & \textbf{Description} & \textbf{Rate} & \textbf{Hour(s)} & \textbf{Amount} \\ \hline
\DTLforeach{invoicedb}{\date=Date,\description=Description,\rate=Rate,\hours=Hours}{%
\DTLgmul{\amount}{\rate}{\hours}%
\DTLgadd{\amounttotal}{\amount}{\amounttotal}%
\DTLgadd{\hourstotal}{\hours}{\hourstotal}%
% table row
\date &
\description &
\DTLround{\v}{\rate}{2}\v &
\DTLround{\v}{\hours}{1}\v &
\DTLround{\v}{\amount}{2}\v \\
\DTLiflastrow{\hline}{}%
}
% table footer
& & \textbf{Total:} &
\DTLround{\v}{\hourstotal}{1}\v &
\DTLround{\v}{\amounttotal}{2}\v
\end{tabular}
...
重申我所面临的问题(据我所知),tabularx
在为单元格定位字符“X”选择合适的单元格宽度时,需要多次重新评估表格。