在命令中使用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,但我猜没有。)