![pgfmathsetmacro 中的尺寸太大](https://linux22.com/image/477841/pgfmathsetmacro%20%E4%B8%AD%E7%9A%84%E5%B0%BA%E5%AF%B8%E5%A4%AA%E5%A4%A7.png)
这适用于
\测试{500}
但不能说
\测试{50000}
\documentclass[10pt,german]{article}
\usepackage[T1]{fontenc}
\usepackage[ngerman]{babel}
\usepackage[utf8]{inputenc}
\usepackage{pgffor} %foreach
\newcommand{\Beleg}[2]{%
\expandafter\xdef\csname BelegKontozweiSoll#1\endcsname{#2}
}
\newcommand{\test}[1]{%
\pgfmathsetmacro{\saldoo}{#1}
\foreach \x in {10,20,30}{%
\pgfmathsetmacro{\saldo}{\csname BelegKontozweiSoll\x\endcsname+\saldoo}
\global\let\saldoo=\saldo
}
\textbf{\saldoo}
}
\begin{document}
\Beleg{10}{50.60}
\Beleg{20}{145.05}
\Beleg{30}{603.28}
\test{500}
\end{document}
我该如何解决这个问题?注意:一般来说,我的 tex 文件有点长,所以我想保留
\cs名称.... \endcs名称
反之亦然,我必须在原始 tex 文件中更改很多内容,而我不会这样做。
有人有想法吗?
答案1
不要将 pgf 用于如此大的数字。由于它在内部使用维度,因此其范围有点受限。使用 expl3 及其 fp 库则没有问题:
\documentclass[10pt,german]{article}
\usepackage[T1]{fontenc}
\usepackage[ngerman]{babel}
\usepackage[utf8]{inputenc}
\usepackage{pgffor} %foreach
\usepackage{siunitx} %loads expl3
\sisetup{locale=DE}
\newcommand{\Beleg}[2]{%
\expandafter\xdef\csname BelegKontozweiSoll#1\endcsname{#2}
}
\ExplSyntaxOn
\newcommand{\test}[1]
{
\fp_set:Nn\l_tmpa_fp{#1}
\clist_map_inline:nn {10,20,30}
{
\fp_add:Nn \l_tmpa_fp { \use:c{ BelegKontozweiSoll##1} }
}
\textbf{\num[detect-weight]{\fp_eval:n{\l_tmpa_fp}}}
}
\ExplSyntaxOff
\begin{document}
\Beleg{10}{50.60}
\Beleg{20}{145.05}
\Beleg{30}{603.28}
\test{50000}
\end{document}
答案2
我的意思像这样:
\documentclass[10pt,german]{article}
\usepackage[T1]{fontenc}
\usepackage[ngerman]{babel}
\usepackage[utf8]{inputenc}
\usepackage{pgffor} %foreach
\usepackage[nomessages]{fp}% http://ctan.org/pkg/fp -> FPeval
\usepackage{fp}
\newcommand{\Beleg}[2]{%
\expandafter\xdef\csname BelegKontozweiSoll#1\endcsname{#2}
}
\newcommand{\test}[1]{%
\pgfmathsetmacro{\saldoo}{#1}
\foreach \x in {10,20,30}{%
\FPeval{\saldo}{ {\csname BelegKontozweiSoll\x \endcsname} + \saldoo}
\FPeval{\saldoo}{\saldo}
}
\textbf{\saldoo}
}
\begin{document}
\Beleg{10}{50.60}
\Beleg{20}{145.05}
\Beleg{30}{603.28}
\test{50000}
\end{document}
这对于 50000 也适用,但 FPeval 不接受该值
{\csname BelegKontozweiSoll\x \endcsname}
您能修改这部分代码吗?这样我就不用使用 expl3 了。我喜欢 FPeval……
答案3
现在我明白了:) - 可以将 FPeval 与 csname ... endcsname 结合起来 - foreach 中的计算值可能是全局的(xdef....)
\documentclass[10pt,german]{article}
\usepackage[T1]{fontenc}
\usepackage[ngerman]{babel}
\usepackage[utf8]{inputenc}
\usepackage{pgffor} %foreach
\usepackage[nomessages]{fp}% http://ctan.org/pkg/fp -> FPeval
\usepackage{fp}
\newcommand{\Beleg}[2]{%
\expandafter\xdef\csname BelegKontozweiSoll#1\endcsname{#2}
}
\newcommand{\test}[1]{%
\FPeval{\saldoo}{#1}
\foreach \x in {1,...,5}{%
\FPeval{\saldo}{ \csname BelegKontozweiSoll\x \endcsname + \saldoo}
\FPeval{\saldoo}{\saldo}
\xdef\saldoo{\saldo}
}
\saldoo
}
\begin{document}
\Beleg{1}{25}
\Beleg{2}{25}
\Beleg{3}{25}
\Beleg{4}{100}
\Beleg{5}{100}
\test{50000}
\end{document}
结束 :)