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 についてですが、この問題は発生していません。バグだとしても驚きませんが、そのことを他の人に伝えていただけると嬉しいです。

他の回避策を見るのも興味深いでしょう。

私の当初の意図は、いくつかのパラメータと装飾が異なるが、環境として定義したい共通点がたくさんある複数のプロットを作成することでした (開くコマンドと閉じるコマンドよりも (ラ)テクスニカルなようです)。

答え1

これは、軸から tikzpicture にグラフィック レイヤーのセットを伝達するディープ マジックとの組み合わせによって導入される追加の\begingroup/ペアによるものです。\endgroup\newenvironment

これを解決するには基本的に 3 つの方法があります。

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={}]追加レイヤーを無効にするように記述した場合でも、画像は機能します (ただし、見た目は異なります)。

これはバグでしょうか? 正直わかりません... おそらく何らかの形で修正されるはずです。

関連情報