pgfplots fillbetween 不适用于新环境

pgfplots fillbetween 不适用于新环境

这是一个最小的非工作示例:

% preamble
\documentclass[class=minimal,border=0pt]{standalone}
\usepackage{tikz}
\usepackage{pgfplots}
\pgfplotsset{compat=1.12}
\usepgfplotslibrary{fillbetween}

\begin{document}

% 想要使用此环境。不适用于fill between

\newenvironment{myaxes}
{%
\begin{axis}[% here are many options in a real case
    ]
}
{%
\end{axis}
}

% 一个简单的绘图命令,在任何地方都是相同的

\newcommand{\myplot}{
    \addplot [domain=-1:1, name path = func] {- x*x + 1};
    \addplot [draw=none, name path = xaxis] {0};
    \addplot [red] fill between [of = xaxis and func ];
}

% 这张图片不错

\begin{tikzpicture}
\begin{axis}
\myplot
\end{axis}
\end{tikzpicture}

% 已绘制,但尚未填充。

\begin{tikzpicture}
\begin{myaxes}
\myplot
\end{myaxes}
\end{tikzpicture}

% 此解决方法有效

\newcommand{\beginmyaxis}{
\begin{axis}[% options here
    ]
}

% name 'endmyaxis' doesn't work, but it's not most important
\newcommand{\emyaxis}{
\end{axis}
}

\begin{tikzpicture}
\beginmyaxis
\myplot
\emyaxis
\end{tikzpicture}

\end{document}

fillbetween 的结果

看来 pgfplots 和我的环境可以工作,问题仅出在fillbetween

我在用着pgfplots 1.12

我的主要问题是为什么会发生这种情况?这只是一个错误,还是我没有理解一些深奥的东西。我最近读过 pgfplots更改日志关于 fillbetween,但这个问题不存在。如果这是一个错误,我不会感到惊讶,那么最好告诉其他人。

看看其他的解决方法将会很有趣。

我最初的意图是创建几个在一些参数和装饰上有所不同但有很多共同点的图,我想将其定义为一个环境(似乎比打开和关闭命令更具(La)TeXnical)。

答案1

这是由于通过与深度魔法结合引入的附加\begingroup/对将图形图层集从轴传达到 tikzpicture。\endgroup\newenvironment

基本上有三种方法可以解决它:

1]激活分层图形手动在你的轴之前:

\documentclass[class=minimal,border=0pt]{standalone}
\usepackage{tikz}
\usepackage{pgfplots}
\pgfplotsset{compat=1.12}
\usepgfplotslibrary{fillbetween}

\newenvironment{myaxes}
{%
    \begin{axis}[% here are many options in a real case
        ]
}
{%
    \end{axis}%
}

\newcommand{\myplot}{
    \addplot [domain=-1:1, name path = func] {- x*x + 1};
    \addplot [draw=none, name path = xaxis] {0};
    \addplot [red] fill between [of = xaxis and func ];
}
\begin{document}
\begin{tikzpicture}
\pgfplotsset{set layers}
\begin{myaxes}
\myplot
\end{myaxes}
\end{tikzpicture}

\end{document}

2]使用依赖于PGF / pgfplots内部的深度魔法:

\documentclass[class=minimal,border=0pt]{standalone}
\usepackage{tikz}
\usepackage{pgfplots}
\pgfplotsset{compat=1.12}
\usepgfplotslibrary{fillbetween}

\newenvironment{myaxes}
{%
    \begin{axis}[% here are many options in a real case
        ]
}
{%
    \end{axis}%
    \expandafter\aftergroup\csname pgf@restore@layerlist@from@global\endcsname
}

\newcommand{\myplot}{
    \addplot [domain=-1:1, name path = func] {- x*x + 1};
    \addplot [draw=none, name path = xaxis] {0};
    \addplot [red] fill between [of = xaxis and func ];
}
\begin{document}
\begin{tikzpicture}
\begin{myaxes}
\myplot
\end{myaxes}
\end{tikzpicture}

\end{document}

3]使用

\begin{tikzpicture}
\myaxes
\myplot
\endmyaxes
\end{tikzpicture}

而不是 LaTeX 环境(这些宏由 定义\newenvironment)。


解释:fill between隐式激活分层图形,使得填充区域为在下面虽然已经定义了分界线在代码中将它们组合起来。这组分层图形需要传达给封闭的 tikzpicture,而这(不幸的是)受 TeX 分组构造的影响:every\endgroup会清除此类列表。PGF/pgfplots 的解决方案似乎适用于标准情况—​​—但在本例中失败了。

这意味着如果您写入以禁用额外的层,图片也会起作用fill between[on layer={}](但看起来会有所不同)。

这是个 bug 吗?说实话我不知道……也许应该以某种方式修复它。

相关内容