我有一个函数,该函数的参数需要在该函数的某个点计算大数,我想用pgfmath
它来累积数据(因为计数器没有足够的范围):
...
\pgfkeys{/pgf/fpu=true}
\pgfmathsetmacro\csname Total#1\endcsname{\csname Total#1\endcsname + #2} %does not work probably missing a \expandafter
\pgfmathsetmacro\TotalContractH{\TotalContractH + #2}
\pgfmathsetmacro\temp{#2 * #3}
\pgfmathsetmacro\TotalContractC{\TotalContractC + \temp}
\pgfkeys{/pgf/fpu=false}
...
我怎样才能获得该物品的动态名称。提前致谢
答案1
在 中\pgfsetmacro\csname Total#1\endcsname{...}
, 的第一个参数\pgfsetmacro
是\csname
而不是动态宏。因此,\csname
需要先展开:
\expandafter\pgfsetmacro\csname Total#1\endcsname{...}
答案2
在序言中添加,
\newcommand\pgfmathsetmacroname[1]{%
\expandafter\pgfmathsetmacro\csname#1\endcsname
}
然后像
\pgfmathsetmacroname{Total#1}{\csname Total#1\endcsname + #2}
应该可以工作。
更完整的例子:
\documentclass{article}
\usepackage{tikz}
\newcommand\pgfmathsetmacroname[1]{%
\expandafter\pgfmathsetmacro\csname#1\endcsname
}
\newcommand\settotal[2]{%
\pgfmathsetmacroname{Total#1}{#2}%
}
\newcommand{\usetotal}[1]{\csname Total#1\endcsname}
\begin{document}
\settotal{A}{1}% starting value
\settotal{A}{\usetotal{A}+2}
\settotal{A}{\usetotal{A}*3}
\usetotal{A}
\end{document}
正如预期的那样,这将打印
9.0
答案3
\csname <stuff>\endcsname
需要先展开才能得到\<stuff>
;通过几个\expandafter
s 即可轻松实现。此外,创建宏可让您的生活更轻松:
10
30.0
\documentclass{article}
\usepackage{tikz}
\newcommand{\newContract}[2]{%
\expandafter\pgfmathsetmacro\csname Total#1\endcsname{#2}%
}
\newcommand{\addtoContract}[2]{%
\def\contractAssign{\expandafter\pgfmathsetmacro\csname Total#1\endcsname}%
\expandafter\contractAssign\expandafter{\csname Total#1\endcsname + #2}%
}
\newcommand{\contractValue}[1]{\csname Total#1\endcsname}
\begin{document}
\newContract{ABC}{10}\contractValue{ABC}
\addtoContract{ABC}{20}\contractValue{ABC}
\end{document}