有没有办法在里面使用 LaTeX 命令\pgfplotsset
?
例如,以下代码会产生行中指示的错误,而如果在命令中用\pgfplotsset
替换,那么一切都会好起来。\contents
\pgfplotsset
axis 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 once
和expand 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}