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 결과

fillbetweenpgfplots와 내 환경이 작동하는 것 같습니다 . 문제는 .

나는 pgfplots 1.12.

내 주요 질문은왜 이런 일이 발생합니까?그것은 단지 버그입니까, 아니면 깊은 것을 이해하지 못하는 것입니까? 최근에 pgfplots를 읽었습니다.변경 로그fillbetween에 대해 설명했지만 이 문제는 없습니다. 버그라고 해도 놀라지 않을 것이고, 다른 사람들에게 그 사실을 알리는 것도 좋을 것 같습니다.

다른 해결 방법을 살펴보는 것도 흥미로울 것입니다.

내 원래 의도는 일부 매개 변수와 장식이 다른 여러 플롯을 만드는 것이었지만 환경으로 정의하고 싶은 공통점이 많았습니다(열기 및 닫기 명령보다 (La)TeXnical에 더 가깝습니다).

답변1

이는 그래픽 레이어 세트를 축에서 tikzpicture로 전달하는 깊은 마법과 결합 하여 도입된 추가 \begingroup/ \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 그룹화 구성의 적용을 받습니다. 모든 것은 \endgroup그러한 목록을 지웁니다. PGF/pgfplots의 솔루션은 표준 사례에서 작동하는 것으로 보이지만 이 경우에는 실패했습니다.

fill between[on layer={}]이는 추가 레이어를 비활성화하도록 작성하는 경우에도 그림이 작동한다는 것을 의미합니다 (그러나 다르게 보일 수 있음).

이것은 버그인가요? 글쎄요, 솔직히... 아마도 어떻게든 고쳐져야 할 것 같습니다.

관련 정보