如何定义 pgfmath 局部变量?

如何定义 pgfmath 局部变量?

在命令中使用pfgmathsetmacro(由 定义\newcommand)时,我们面临变量局部性的问题。例如,如果你设计两个函数

\newcommand\f[4]{%
  \pgfmathsetmacro#3{cosh(#1+#2)}%
  \pgfmathsetmacro#4{cos(#1+#2)}%
}
\newcommand\g[4]{%
  \pgfmathsetmacro#3{sqrt(1+(#1-#2)^2)}%
  \pgfmathsetmacro#4{sqrt((#1)^2+(#2)^2)}%
}

并想定义组合函数

\newcommand\h[4]{%
  \f#1#2\x\y%
  \g\x\y#3#4%
}

如何保护变量\x和,\y这样就不必担心没有命名其他变量\x\y?如果只有一个变量,可以使用来避免此问题\pgfmathresult,但如果您有两个(或更多!)变量怎么办?

答案1

我将展示一个具有一个变量函数的简化版本:

\documentclass{article}
\usepackage{tikz}

\newcommand\funcF[2]{%
  \pgfmathsetmacro#1{cosh(#2)}%
}
\newcommand\funcG[2]{%
  \pgfmathsetmacro#1{sqrt(#2)}%
}

\newcommand{\compose}[4]{%
  \begingroup
  #3\x{#4}%
  #2\x{\x}%
  \edef\x{\endgroup\noexpand\pgfmathsetmacro\noexpand#1{\x}}\x
}

\newcommand{\funcH}[2]{%
  \compose#1\funcG\funcF{#2}%
}

\begin{document}

\funcH\firstvalue{1}$\firstvalue$

\funcH\secondvalue{2}$\secondvalue$

\end{document}

\x一旦\x执行完final 语句,“局部变量”就会被忘记。

在此处输入图片描述

相反,\x您可能想要使用\AcOmMaNdNaMeThAtSpRoBaBlYnOtUsEd或一些类似这样的不寻常的东西。

以下是来自的响应bc -l,表明考虑到 PGF 的精度较低,函数计算正确:

> bc -l
bc 1.06
Copyright 1991-1994, 1997, 1998, 2000 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'. 
sqrt((e(1)+e(-1))/2)
1.24220796761864467541
sqrt((e(2)+e(-2))/2)
1.93963803094382315206

答案2

考虑以下 MWE:

\documentclass{article}
\setlength{\parindent}{0pt}

\newcommand{\h}[2]{%
\begingroup%
\edef\x{#1}
\global\edef#2{#1}
\endgroup}

\begin{document}

\def\x{0}
\def\y{1}

\h{2}{\y}

x=\x\newline
y=\y\newline

\end{document}

如果删除 \begingroup \endgroup,您将得到 x=2,y=2。如果删除 \global,您将得到 x=0,y=1。(我不知道 \pgfmathsetmacro 是否使用 \global,但我猜没有。)

相关内容