环境中宏的奇怪扩展

环境中宏的奇怪扩展

我必须承认,我完全是个新手。我尝试使用 LaTeX 生成发票,因此我使用了 fp 包。

但奇怪的是,计算发生了很多次,而这些计算应该每个产品只发生一次。这是我的 LaTeX 文件,下面,你能帮我理解为什么它会这样吗?并帮助我改进它?

其中最重要的两个部分可能是环境invoice和宏product。对于每件产品,我将单价乘以数量,得到该金额,并将其添加到发票总额中,称为TotalHT

\documentclass[a4paper,12pt]{article}

\usepackage[frenchb]{babel}
\usepackage[utf8x]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{array}
\usepackage{tabularx}
\usepackage{fancyhdr}
\usepackage{textcomp}
\usepackage{fltpoint}
\usepackage[nomessages]{fp}
\RequirePackage{numprint}

% - Page and Headers Style {{{
\setlength{\parindent}{0pt}
\pagestyle{fancy}
\fancyhf{} 
\renewcommand{\headheight}{51pt}
\lhead{\nous}
%\rhead{\nous}
\renewcommand{\headrulewidth}{0.125mm}
% - }}}

% - New Commands {{{

\def\TotalHT{0}

% set standard decimal position (numprint package)
\nprounddigits{2}

\newcommand{\nous}{
    \small{
        \textsf{%
            \textsc{My Company}\\
            My address\\
        }
    }
}

\newcommand{\client}[1]{%
    \vspace{1cm}
    \begin{flushright}
        \small{\textsf {#1}}
    \end{flushright}
}

\newcommand{\numero}[2]{%
    \vspace*{1cm}
    \begin{center}
        \Huge{\textbf{Facture n° #1}}\\
        \textsf{\small{Du #2}}
    \end{center}
}

\newcommand{\firstth}[1]{
    \multicolumn{1}{|l|}{#1}
}

\newenvironment{invoice}{%
    \ignorespaces
    \small
    \tabularx{\textwidth}{|X|r|c|r|}
    \hline
    \firstth{Designation} & Unit Price. & Qty. & Amount\\
    \hline
}%
{%
    \endtabularx%
}

\newcommand{\product}[3]{%
    \FPround\p{#2}{2} 
    \FPeval\m{\p * #3}
    \FPround\m\m{2}
    \FPadd\TotalHT\TotalHT\m
    \global\let\TotalHT\TotalHT
    \message{t \TotalHT  prod #1}
    #1 & 
    \FPround{\p}{#2}{2}\numprint\p &
    #3 &
    \FPround\p{#2}{2} 
    \FPeval\m{\p * #3}
    \numprint\m\\ 
    \hline
}


\newcommand{\totalttc}{
    \FPround\TotalHT\TotalHT{2}
    & \multicolumn{2}{r|}{\textbf{Total TTC}} & \numprint\TotalHT \\
    \cline{2-4}
}

\newcommand{\enlettres}[1]{
    \vspace*{1cm}
    \textsf{Arrêter la présente facture à la somme de \textbf{#1}.}
}

% - }}}

\begin{document}
\numero{01/2010}{17/03/2010}

\client{
    My Client Sarl.\\
    His address\\
    His phone
}

\begin{invoice}
    \product{product One}{1000.00}{1}
    \product{product Two}{2000}{1}
    \product{product Three}{3000.00}{1}
    \product{Product Four}{5000.00}{1}
    \totalttc
\end{invoice}

\enlettres{Cent dix-sept milles cinq cents euros et zéro centimes}
\end{document}

\message{t \TotalHT prod #1}每当我通过 pdflatex 运行此程序时,每个产品都会出现多次该消息。但是,在 PDF 中生成的表格中,每个产品恰好只有一行,但总数是错误的。

非常感谢您帮助我理解这一点!

PS 注释中的三个括号(如 % - }}}和)% - New Commands {{{只是为了在 vim 中折叠

答案1

正如 Mathew 所说,这tabularx是罪魁祸首。我还对您使用该包的方式做了一些小改动fp。下面的代码有效。

\documentclass[a4paper,12pt]{article}
\usepackage[frenchb]{babel}
\usepackage[utf8x]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{array}
\usepackage[nomessages]{fp}
\gdef\TotalHT{0}
\newcommand{\product}[3]{%
  #1  &#2   &#3  &\FPmul\temp{#2}{#3}\FPround\temp{\temp}{2}\temp 
%% Totalize
\FPadd\total{\TotalHT}{\temp}
\FPround\total{\total}{2}
\global\let\TotalHT\total
\\ }
\newcommand{\totalttc}{
   \TotalHT  }
\begin{document}
\begin{tabular}{lrrr}
    \product{product One}{1000.00}{1}
    \product{product Two}{2000}{1}
    \product{product Three}{3000.00}{1}
    \product{Product Four}{5000.00}{1}
    \product{Product Four}{5000.00}{1}
    &&& Total \totalttc
\end{tabular}
\end{document}

答案2

tabularx您用于排版表格的环境在设置表格内容之前会对其进行三次评估。这可能是为了帮助它进行计算。

您可以通过使用tabular环境来避免此问题:

\newenvironment{invoice}{%
    \ignorespaces
    \small
    \tabular{|p{0.5\textwidth}|r|c|r|}
    \hline
    \firstth{Designation} & Unit Price. & Qty. & Amount\\
    \hline
}%
{%
    \endtabular%
}

虽然不那么漂亮,tabularx但是可以完成工作。

如果您愿意tabularx并且不介意重复计算,只需确保初始化:

\newenvironment{invoice}{%
    \ignorespaces
    \small
    \tabularx{\textwidth}{|X|r|c|r|}
    \hline
    \firstth{Designation} & Unit Price. & Qty. & Amount\\
    \hline
    \def\TotalHT{0}
    \global\let\TotalHT\TotalHT
}%
{%
    \endtabularx%
}

另一种方法可能是将订单存储在列表数据结构中,并将其总计与设置表格分开。但我觉得这样做弊大于利。

相关内容