我正在创建报价报告并使用 for 循环列出产品。但问题是我必须自己计算总价值,然后我尝试像这样在循环中每次创建变量并求和
\usepackage{calc}
\newcounter{sum_price}
%in for loop
\setcounter{sum_price}{sum_price+price}
%display value
\sum_price$
答案1
在 TeX 中你可以使用以下内容:
\newcount\sumPrice
\sumPrice=1
\newcount\price
\price=5
\advance\sumPrice by \price
在 LaTeX 中你可能会使用:
\newcounter{sumPrice}
\setcounter{sumPrice}{1}
\newcounter{price}
\setcounter{price}{5}
\addtocounter{sumPrice}{\theprice}
你也可以使用\numexpr
(在 TeX 中):
\newcount\newprice
\newprice=7
\advance\sumPrice by \numexpr\price+\newprice\relax
或者用 LaTeX 编写:
\newcounter{newprice}
\setcounter{newprice}{7}
\addtocounter{sumPrice}{\numexpr\theprice+\thenewprice}
\setcounter{newprice}{\numexpr\theprice+\thenewprice}% this also works
在 TeX 中还有\multiply
和\divide
:
\multiply\sumPrice by 2
\divide\sumPrice by 2
另请注意,您不应将其用作_
变量名的一部分。
在 LaTeX 文档中使用两者的示例(并显示结果):
\documentclass[]{article}
\begin{document}
\newcount\sumPrice
\sumPrice=1
\newcount\price
\price=5
\newcount\newprice
\newprice=7
\advance\sumPrice by \price
\the\sumPrice
\advance\sumPrice by \numexpr\price+\newprice\relax
\ %just to put one space here
\the\sumPrice
\newcounter{sumPrice}
\setcounter{sumPrice}{1}
\newcounter{price}
\setcounter{price}{5}
\newcounter{newprice}
\setcounter{newprice}{7}
\addtocounter{sumPrice}{\theprice}
\thesumPrice
\addtocounter{sumPrice}{\numexpr\theprice+\thenewprice}
\thesumPrice
%in a loop:
\noindent
\sumPrice=0
\loop\ifnum\price>0
\advance\sumPrice by \price
\advance\price by -1
\the\sumPrice\\
\repeat
\end{document}
答案2
计数器(整数)不太适合计算奖品(奖品有小数部分)。我建议使用(新!)xfp 包和 siunitx 来显示数字:
\documentclass{article}
\usepackage[ngerman]{babel}
\usepackage{xfp,siunitx}
\sisetup{locale=DE}
\newcommand\mysum{}
\newcommand\clearsum{\renewcommand\mysum{0}}
\newcommand\addprice[1]{\xdef\mysum{\fpeval{\mysum + #1}}\SI{#1}{EUR}}
\newcommand\showsum{\SI{\mysum}{EUR}}
\begin{document}
\clearsum
\addprice{1.3} + \addprice{2.3} + \addprice{4.99} = \showsum
\end{document}
答案3
我不确定您使用哪种循环,但也许您想要生成如下“产品表”:
以下是一种方法:
\documentclass{article}
\usepackage{etoolbox}
\usepackage{booktabs}
\usepackage{pgf}
\def\process#1:#2!{% two arguments separated by a colon and ending with !
\pgfmathparse{add(\producttotal,#2)}% add to total
\xdef\producttotal{\pgfmathresult}% remember total
#1 & #2\\% add to table
}
\newcommand\Products[1]{%
\gdef\producttotal{0}% initialise total as 0
\renewcommand*\do[1]{\process##1!}% loop iteration is delegated to \process
\begin{tabular}{lr}
\toprule Product & Price\\\midrule% heading
\docsvlist{#1} \midrule% add the products
Total & % now add the total
\pgfmathparse{\producttotal+0}% annoyance to get right precision!
\pgfmathprintnumber[precision=2]\pgfmathresult\\ \bottomrule
\end{tabular}
}
\begin{document}
\Products{
Chocolates: 4.99,
Flowers: 14.99,
Wine: 24.99
}
\end{document}
一些评论:
- 该宏
\Products
接受逗号分隔的“产品”列表,我们将对其进行“循环”。每个“产品”本身都是一个冒号分隔的产品名称和价格 - 产品总价存储在 中
\total
,它实际上只是字符串。LaTeX 不能很好地处理小数,这就是为什么我使用了数学用于计算。不幸的是,它不是特别准确,这就是为什么我习惯将\pgfmathprintnumber
数字打印到小数点后两位(在 MWE 中,它打印时44.97002
没有这个!) - 这
\xdef\producttotal{\pgfmathresult}
是必要的,以确保我们在循环过程中记住总数 - 我正在使用
\docsvloop
来自解析包。它循环遍历逗号分隔的列表并将“循环变量”传递给命令\do
。这里唯一棘手/非标准的一点是\do
需要分隔产品名称和价格,它使用来实现\process
。 - 我用过书签让桌子看起来更漂亮