使用 \pgfmathsetmacro 自定义名称

使用 \pgfmathsetmacro 自定义名称

我有一个函数,该函数的参数需要在该函数的某个点计算大数,我想用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>;通过几个\expandafters 即可轻松实现。此外,创建宏可让您的生活更轻松:

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}

相关内容