pgfplots fillbetween funktioniert nicht mit newenvironment

pgfplots fillbetween funktioniert nicht mit newenvironment

Hier ist ein minimales, nicht funktionierendes Beispiel:

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

\begin{document}

% möchten diese Umgebung verwenden. Funktioniert nicht mit fill between.

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

% ein trivialer Plotbefehl, der überall identisch ist

\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 ];
}

% dieses Bild ist in Ordnung

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

% dies wird gezeichnet, aber nicht ausgefüllt.

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

% dieser Workaround funktioniert

\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}

die Ergebnisse von fillbetween

Es scheint, dass pgfplots und meine Umgebung funktionieren, das Problem besteht nur bei fillbetween.

Ich benutze pgfplots 1.12.

Meine Hauptfrage istwarum passiert das?Ist das nur ein Fehler oder verstehe ich etwas nicht? Ich habe pgfplots kürzlich gelesenÄnderungsprotokollüber fillbetween, aber dieses Problem gibt es nicht. Es würde mich nicht überraschen, wenn es ein Fehler ist, dann wäre es nett, anderen davon zu erzählen.

Es wäre interessant, andere Workarounds zu sehen.

Meine ursprüngliche Absicht bestand darin, mehrere Diagramme zu erstellen, die sich in einigen Parametern und Dekorationen unterscheiden, aber vieles gemeinsam haben, was ich als Umgebung definieren wollte (scheint mehr (La)TeXnisch zu sein als öffnende und schließende Befehle).

Antwort1

Dies ist auf ein zusätzliches \begingroup/ \endgroup-Paar zurückzuführen, das in \newenvironmentKombination mit Deep Magic eingeführt wird und den Satz von Grafikebenen von der Achse an das Tikz-Bild übermittelt.

Zur Lösung des Problems gibt es grundsätzlich drei Möglichkeiten:

1] Aktivieren Sie geschichtete Grafikenmanuellvor deiner Achse:

\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] Verwenden Sie Deep Magic, das von den internen Komponenten von PGF/pgfplots abhängt:

\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] verwenden

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

Anstelle der LaTeX-Umgebung (diese Makros werden definiert durch \newenvironment).


Erklärung: fill betweenaktiviert implizit geschichtete Grafiken, so dass der gefüllte Bereichunterdie Grenzparzellen, obwohl definiert wurdenachsie im Code. Dieser Satz von geschichteten Grafiken muss dem umschließenden Tikzpicture mitgeteilt werden, und das unterliegt (leider) den Gruppierungskonstrukten von TeX: every \endgrouplöscht solche Listen. Die Lösung von PGF/pgfplots scheint in Standardfällen zu funktionieren – und ist in diesem Fall fehlgeschlagen.

Das heißt, das Bild würde auch funktionieren, wenn du schreiben würdest, fill between[on layer={}]dass die zusätzliche Ebene deaktiviert werden soll (es würde aber anders aussehen).

Ist das ein Fehler? Ich weiß es ehrlich gesagt nicht ... vielleicht sollte es irgendwie behoben werden.

verwandte Informationen