在 pgfplotsset 中使用 LaTeX 命令

在 pgfplotsset 中使用 LaTeX 命令

有没有办法在里面使用 LaTeX 命令\pgfplotsset

例如,以下代码会产生行中指示的错误,而如果在命令中用\pgfplotsset替换,那么一切都会好起来。\contents\pgfplotssetaxis x line=bottom

\documentclass{article}


\usepackage{pgfplots}
\newcommand{\contents}{axis x line=bottom}

\begin{document}
\begin{tikzpicture}

\pgfplotsset{\contents}  % <----- fails with ! Package pgfkeys Error: I do not know the key '/pgfplots/axis x line=bottom'

\begin{axis}
\addplot[domain=-3e-3:3e-3,samples=201]{exp(-x^2 / (2e-3^2)) / (1e-3 * sqrt(2*pi))};
\end{axis}
\end{tikzpicture}

\end{document}

答案1

可能 Till Tantau 也遇到过类似的问题,所以他以更智能的方式创建了错误消息。例如:如果我这样做

\tikz[xasfwr=yeah]{}

错误信息是

/tikz/xasfwr软件包 pgfkeys 错误:我不知道您传递的密钥yeah,我将忽略它。也许您拼错了。

现在你的例子;让我们读一下错误信息

程序包 pgfkeys 错误:我不知道密钥/pgfplots/axis x line=bottom

请注意,它并没有说你试图通过,bottom而是说它没有理解整个事情。因为它没有解析它,错过了等式符号和你提供的值。你可能会遇到更多愚蠢的情况,例如

\pgfplotsset{\contents=out haha so funny}

包 pgfkeys 错误:我不知道/pgfplots/axis x line=bottom您传递的密钥out haha so funny,我将忽略它。

\pgfplotsset{这些都表明 PGF 键没有正确扩展。一个直接的方法是通过延迟部分扩展来手动扩展参数

\expandafter\pgfplotsset\expandafter{\contents}

可以。或者您仍然可以留在 PGF 密钥中并使用/.expanded为您进行扩展的处理程序。

\pgfkeys{/utils/exec/.expanded={\noexpand\pgfplotsset{\contents}}}

这是做什么的?首先,/utils/exec它是执行任意 TeX 代码的通用处理程序。然后,只需在此处标识不应扩展的内容\pgfplotsset\noexpand在其前面添加,即可设置任何类型的宏值。

您还可以控制它应该扩展的次数,您可以查看手册expand onceexpand twice相关按键。

答案2

你确实提到过评论您正在编写一个小的 lua 脚本来输出\pgfplotsset命令。编写一个简单的 texfile 很容易,可以在环境(此处称为foobar)关闭后读取。

\begin{filecontents}{\jobname-pgf.tex}
\pgfplotsset{width=5cm}
% I am the file your Lua script makes
\end{filecontents}
\documentclass{article}
\usepackage{pgfplots}
\newenvironment{foobar}{}{}
\usepackage{etoolbox}
\AfterEndEnvironment{foobar}{\input{\jobname-pgf}}
\begin{document}
\begin{tikzpicture}
\begin{axis}
\addplot{x+1};
\end{axis}
\end{tikzpicture}

\begin{tikzpicture}
\begin{foobar}
    %Some luacode wrting a file represented by filecontents
\end{foobar}
%this file is being read here ^
%pgfplotsset is executed
\begin{axis}
\addplot{x^2};
\end{axis}
% the whole set is limited to the scope of the tikzpicture
\end{tikzpicture}

\begin{tikzpicture}
    \begin{axis}
\addplot{-x^2};
\end{axis}
\end{tikzpicture}
%everything back to normal herea
\end{document}

您应该将您的定义定义为样式并在以后重复使用它们。

\documentclass{article}
\usepackage{pgfplots}
\pgfplotsset{contents/.style={axis x line=bottom}}
\begin{document}
\begin{tikzpicture}
\begin{axis}
\addplot[domain=-3e-3:3e-3,samples=201]{exp(-x^2 / (2e-3^2)) / (1e-3 * sqrt(2*pi))};
\end{axis}
\end{tikzpicture}
%\pgfplotsset{contents}%JB: That would change the behaviour
%globally

\begin{tikzpicture}
    \begin{axis}[contents]%JB: Just for this axis environment
\addplot[domain=-3e-3:3e-3,samples=201]{exp(-x^2 / (2e-3^2)) / (1e-3 * sqrt(2*pi))};
\end{axis}
\end{tikzpicture}
\end{document}

相关内容