pgfplots fill Between 不適用於新環境

pgfplots fill Between 不適用於新環境

這是一個最小的非工作範例:

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

之間填充的結果

看來 pgfplots 和我的環境運作正常,問題僅在於fillbetween.

我在用著pgfplots 1.12

我的主要問題是為什麼會發生這種情況?這只是一個錯誤,還是我沒有理解深刻的東西。我最近讀過 pgfplots變更日誌關於fill Between,但是不存在這個問題。如果這是一個錯誤,我不會感到驚訝,那麼將其告訴其他人會很高興。

看到其他解決方法會很有趣。

我的初衷是創建幾個在某些參數和裝飾方面有所不同的圖,但有很多共同點,我想將其定義為一個環境(看起來比打開和關閉命令更(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 分組結構的約束:每個\endgroup都會清除此類清單。 PGF/pgfplots 的解決方案似乎適用於標準情況,但在這種情況下失敗了。

這意味著如果您編寫禁用額外層的操作,圖片也可以工作fill between[on layer={}](但看起來會有所不同)。

這是一個錯誤嗎?老實說,我不知道......也許應該以某種方式修復它。

相關內容