我必须承认,我完全是个新手。我尝试使用 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   &\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%
}
另一种方法可能是将订单存储在列表数据结构中,并将其总计与设置表格分开。但我觉得这样做弊大于利。