這是一個最小的非工作範例:
% 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={}]
(但看起來會有所不同)。
這是一個錯誤嗎?老實說,我不知道......也許應該以某種方式修復它。