如何将变量传递给 LaTeX 中的命令?

如何将变量传递给 LaTeX 中的命令?

我正在尝试为发票模板制作一个税务计算器,其想法是将变量传递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}

在此处输入图片描述

相关内容