我正在尝试为发票模板制作一个税务计算器,其想法是将变量传递subcost
给命令\taxcalc
。
\newcommand*{\taxcalc}[2]{%
\pgfmathparse{#1/(1.0-#2)-#1}%
\pgfmathprintnumber{\pgfmathresult}%
}
\newcommand{\vatTotal}{
& & & {\bf BTW 21\%} & {\bf {\bf \euro\taxcalc{subcost}{0.21}}}
\\*[1.5ex]
}
问题是,无论我尝试做什么subcost
,编译器都会不断抱怨:
包 PGF 数学错误:未知函数“subcost”(在‘subcost/(1.0-0.21)-subcost’中)。’
它非常适合以下情况:
\newcommand*{\total}[1]{\FPdiv{\t}{\arabic{#1}}{1000}\formatNumber{\t}}
\newcommand{\subTotal}{
& & & {\bf Subtotaal (excl. btw)} & {\bf \euro\total{subcost}}
\\*[1.5ex]
}
有人能帮帮我吗?我已经在 Google 上搜索了好几个小时,想知道如何正确地将变量传递给该语言的函数,但无论我怎么尝试,只有对数字进行硬编码才有效。
subcost
定义如下:
\newcounter{hours} \newcounter{subhours}
\newcounter{cost} \newcounter{subcost}
\newcounter{vat}
答案1
请注意,LaTeX 计数器的概念与 PGF-math 中的数学函数的概念不同。
看来您的第一个片段存在问题:
\taxcalc
的第一个和第二个参数必须是数字或者对定义的 PGF-math-functions 的调用——即可用于使用 PGF-math-things 进行计算的东西。
但是\vatTotal
作为第一个参数,该序列subcost
被传递给\taxcalc
。该序列既不表示这样的数字,也不表示对这样定义的 PGF 数学函数的调用。
PGF-math-things 不能/不“知道”该序列subcost
表示要获取其值的 LaTeX 计数器的名称。
PGF-math-things “假设”subcost
表示通过 PGF-math-things 实现的用于执行 PGF-math-things 的 PGF-math 函数的名称,因此“抱怨”函数“subcost”未定义。
另一个问题是:为什么要\bf
打开两次,打开两个嵌套的本地作用域?似乎一个本地作用域和一个\bf
就足够了。:-)
您可以进行修改\vatTotal
,以确保 -LaTeX-counter 的值在执行之前subcost
“扩展为”\taxcalc
的第一个参数。这样,在执行时, 的第一个参数将不再是指示 LaTeX-counter 名称的字符序列,而是一个数字,因此是 PGF-math-things 可以“理解”的东西。\taxcalc
\taxcalc
\taxcalc
做
\newcommand*{\taxcalc}[2]{%
\pgfmathparse{#1/(1.0-#2)-#1}%
\pgfmathprintnumber{\pgfmathresult}%
}
\newcommand{\vatTotal}{%
&&&{\bf BTW 21\%}%
&{\bf\euro\expandafter\taxcalc\expandafter{\number\value{subcost}}{0.21}}%
\\*[1.5ex]%
}
工作?
或许可以\textbf{..}
改为{\bf...}
:
\newcommand*{\taxcalc}[2]{%
\pgfmathparse{#1/(1.0-#2)-#1}%
\pgfmathprintnumber{\pgfmathresult}%
}
\newcommand{\vatTotal}{%
&&&\textbf{BTW 21\%}%
&\textbf{\euro\expandafter\taxcalc\expandafter{\number\value{subcost}}{0.21}}%
\\*[1.5ex]%
}
您的第二个代码片段有效,因为这里的序列被例程subcost
包装起来,而参数\arabic{...}
\total
\arabic
必须表示 LaTeX 计数器的名称。
换句话说:这里\total
考虑subcost
通过应用该短语来表示 LaTeX 计数器的名称,\arabic
以获得 FP-math-stuff 可以计算的数字。
概要:
您的第一个代码片段中的例程\taxcalc
处理两个参数,每个参数必须表示一个数字或对定义的 PGF 数学函数的调用,该函数又传递一个数字。
这姓名LaTeX 计数器既不表示这样的数字,也不表示对定义的 PGF 数学函数的调用。
因此,您需要获取值/数字来自 LaTeX 计数器的名称。
该例程\total
处理一个必须表示 LaTeX 计数器的名称的参数。
\total
内部适用\arabic
于获取 FP-math-thingies 可用于计算的数字。
顺便一提:
如果使用 PGF-math,那么我更喜欢薛定谔的猫的方法根本不使用 LaTeX 计数器来保存“变量”的值,而是使用不处理参数但始终提供相同数字的 PGF 数学函数。(原因:每个 LaTeX 计数器内部都需要分配一个计数寄存器,而 LaTeX 中的计数寄存器数量是有限的。据我所知,声明新的 PGF 数学函数不需要分配另一个计数寄存器。)
如果 PGF 数学函数不处理参数并且始终传递相同的数字,则可以将 PGF 数学上下文中的该 PGF 数学函数名称作为该数字的占位符/作为值为该数字的变量的占位符。
答案2
你的方法有效。你可以声明一个变量或无参数函数,pgf
你似乎正在使用它。为了能够重新定义函数,你需要带星号的版本\pgfmathdeclarefunction*
。这允许你定义一个变量并为其分配一个值,你可以在使用解析的任何表达式中使用该值pgf
。为了方便起见,我将这些\pgfmathdeclarefunction*
东西打包在一个宏中\SetPgfVariable
。
\documentclass{article}
\usepackage{pgf}
\newcommand*{\taxcalc}[2]{%
\pgfmathparse{#1/(1.0-#2)-#1}%
\pgfmathprintnumber{\pgfmathresult}%
}
\newcommand{\SetPgfVariable}[2]{%
\pgfmathdeclarefunction*{#1}{0}{\pgfmathparse{#2}}}
\begin{document}
\SetPgfVariable{subcost}{0.4}
\taxcalc{subcost}{0.21}
\SetPgfVariable{subcost}{0.5}
\taxcalc{subcost}{0.21}
\end{document}