TikZ 仅用一个宏定义多个常量的方法

TikZ 仅用一个宏定义多个常量的方法

我使用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

相关内容