pgfplots fillbetween não funciona com novo ambiente

pgfplots fillbetween não funciona com novo ambiente

Aqui está um exemplo mínimo não funcional:

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

\begin{document}

% desejam usar este ambiente. Não funciona com fill between.

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

% um comando de plotagem trivial que é idêntico em todos os lugares

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

% esta foto está boa

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

% isso é sorteado, mas não preenchido.

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

% esta solução alternativa funciona

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

os resultados de fillbetween

Parece que o pgfplots e meu ambiente funcionam, o problema é apenas com o fillbetween.

Estou a usar pgfplots 1.12.

Minha pergunta principal épor que isso acontece?É apenas um bug ou não entendo algo profundo. Eu li pgfplots recentementeregistro de alteraçõessobre fillbetween, mas esse problema não existe. Não ficarei surpreso se for um bug, então seria bom contar isso a outras pessoas.

Seria interessante ver outras soluções alternativas.

Minha intenção original era criar vários plots que variassem em alguns parâmetros e decorações, mas que tivessem muito em comum que eu quisesse definir como ambiente (parece mais (La)TeXnical do que comandos de abrir e fechar).

Responder1

Isso se deve a um par \begingroup/ adicional que é introduzido combinado com magia profunda que comunica o conjunto de camadas gráficas do eixo para a imagem tikz.\endgroup\newenvironment

Existem basicamente três maneiras de resolver isso:

1] Ative gráficos em camadasmanualmenteantes do seu eixo:

\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] Use magia profunda que depende dos detalhes internos do 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] usar

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

Em vez do ambiente LaTeX (essas macros são definidas por \newenvironment).


Explicação: fill betweenativa implicitamente gráficos em camadas de forma que a região preenchida sejasobas parcelas delimitadoras embora tenha sido definidodepoiseles no código. Este conjunto de gráficos em camadas precisa ser comunicado ao tikzpicture anexo, e isso está (infelizmente) sujeito às construções de agrupamento do TeX: each \endgrouplimpa essas listas. A solução do PGF/pgfplots parece funcionar para casos padrão - e falhou neste caso.

Isso significa que a imagem também funcionaria se você escrevesse fill between[on layer={}]para desabilitar a camada extra (mas teria uma aparência diferente).

Isso é um inseto? Não sei, honestamente... talvez devesse ser consertado de alguma forma.

informação relacionada