有什么方法可以定义一个变量来计算 LaTeX 中 for 循环的总值

有什么方法可以定义一个变量来计算 LaTeX 中 for 循环的总值

我正在创建报价报告并使用 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
  • 我用过书签让桌子看起来更漂亮

相关内容