使用 \show 命令检查的宏未得到正确评估

使用 \show 命令检查的宏未得到正确评估

我正在构建一个可以读取 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”选择合适的单元格宽度时,需要多次重新评估表格。

相关内容