pgfmathsetmacro 中的尺寸太大

pgfmathsetmacro 中的尺寸太大

这适用于

\测试{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}

结束 :)

相关内容