我使用TikZ
它在同一个环境中绘制多个对象(几何表面、线图等)。这些图取决于我在同一tikzpicture
环境中定义的几个常量。这是一个(虚拟)示例:
\begin{tikzpicture}
\def\a{1}
\def\g{0.5}
\def\kamax{5}
\def\M{15}
\def\T{3}
\pgfmathsetmacro{\Ra}{1 + \a*\M^(1-\g)/\kamax}
\pgfmathsetmacro{\Rb}{1 + \a*\M^(1-\g)/(4*\kamax)}
\pgfmathsetmacro{\la}{\M/(2*\T*\Ra)}
\pgfmathsetmacro{\lb}{\M/(2*\T*\Rb)}
\begin{axis}[domain=0:\M/\T, xlabel = Rate of consumption, ylabel = Time of purchase, title = Optimal time to purchase, legend pos=north west, axis equal image]
\addplot[color=blue][domain=0:\la] {0};
\addplot[color=blue][domain=\la:\lb] {2*\T - (sqrt(2*\a*\kamax*\M^(1+\g)*\T*\x*(\M-2*\T*\x)))/(\a*\M*\x)};
\addplot[color=blue][domain=\lb:\M/\T] {\T};
\addplot[color=red] coordinates {(\la,0)(\la,\T)};
\addplot[color=red] coordinates {(\lb,0)(\lb,\T)};
\end{axis}
\end{tikzpicture}
在示例中,用 定义的常量\def
是我正在研究的问题的“基本”常量,而用 定义的常量\pgfmathsetmacro
是为了使绘图更容易。
在绘制之前展示的示例后,我想更改一些“基本”常数的值,并再次绘制相同的五个图(在相同的环境中)以比较结果。我的问题是:有没有办法创建宏或函数,将我的“基本”常数作为输入,并将其他常数作为输出返回?
我的目的纯粹是为了简化.tex
阅读;如果我在绘制编译之后在相同的环境中重新定义常量.tex
就可以了。
提前非常感谢您。
答案1
你可以像这样将代码打包成宏
\newcommand*{\a}{}
\newcommand*{\g}{}
\newcommand*{\kamax}{}
\newcommand*{\M}{}
\newcommand*{\T}{}
\newcommand*{\SetupPlot}[5]{%
\renewcommand*{\a}{#1}%
\renewcommand*{\g}{#2}%
\renewcommand*{\kamax}{#3}%
\renewcommand*{\M}{#4}%
\renewcommand*{\T}{#5}%
\pgfmathsetmacro{\Ra}{1 + \a*\M^(1-\g)/\kamax}%
\pgfmathsetmacro{\Rb}{1 + \a*\M^(1-\g)/(4*\kamax)}%
\pgfmathsetmacro{\la}{\M/(2*\T*\Ra)}%
\pgfmathsetmacro{\lb}{\M/(2*\T*\Rb)}%
}
第一行只是确保宏尚未定义。否则,您会收到一条错误消息。\def
只会覆盖宏。
然后你可以写
\SetupPlot{1}{0.5}{5}{15}{3}
编辑:
我%
在 的定义行末尾添加了\SetupPlot
,因为正如 cfr 指出的那样,如果在 a 之外使用此宏,tikzpicture
它将产生没有 的不需要的空间%
。
答案2
您可以使用 pgf/tikz 键自动设置变量。既然您正在使用,tikz
那么您也可以使用\tikzset
。您需要做的就是使用code
处理程序定义一个键,然后让代码处理程序设置所有变量。
这里有一种方法可以做到这一点(正如 cfr 在评论中所说,根据 OP,这里使用的变量名的选择是不明智的):
\documentclass{article}
\usepackage{tikz}
\usepackage{etoolbox}% only for \csuse in the MWE
\begin{document}
\tikzset{mysettings/.code n args={5}{% 5 arguments: \a, \g, \kamax, \M and \T
\def\a{#1}% set the variables
\def\g{#2}
\def\kamax{#3}
\def\M{#4}
\def\T{#5}
\pgfmathsetmacro{\Ra}{1 + \a*\M^(1-\g)/\kamax}
\pgfmathsetmacro{\Rb}{1 + \a*\M^(1-\g)/(4*\kamax)}
\pgfmathsetmacro{\la}{\M/(2*\T*\Ra)}
\pgfmathsetmacro{\lb}{\M/(2*\T*\Rb)}
}
}
\tikzset{mysettings={1}{0.5}{5}{15}{3}}
\foreach \var [count=\y]in {a,g,kamax,M,T,Ra,Rb,la,lb} {
\var = \csuse{\var};
}
\tikzset{mysettings={2}{0.2}{1}{10}{-3}}
\foreach \var [count=\y]in {a,g,kamax,M,T,Ra,Rb,la,lb} {
\var = \csuse{\var};
}
\end{document}
因此,我已将tikz
密钥定义mysettings
为采用五个参数,分别对应于您的参数\a
、\g
、\kamax
和\M
(\T
按此顺序)。将这些参数传递给mysettings
设置这五个变量,此外,还设置\Ra
、\Rb
和。\la
\lb
MWe 末尾的 for 循环只是为了证明它有效。MWE 产生:
还有两条评论。您还可以在环境开始时设置变量tikzicture
:
\begin{tikzpicture}[mysettings={1}{0.5}{5}{15}{3}]
....
\end{tikzpicture}
您可能希望使用而不是\def
在定义中使用以使定义“全局”。另一方面,上面的代码使它成为本地的,这可能更适合您的用例。正如 cfr 在评论中所说,这需要谨慎使用。mysettings
\gdef