为什么在同一个命令中加载多个 pgfplotslibraries 有时会破坏库?

为什么在同一个命令中加载多个 pgfplotslibraries 有时会破坏库?

我正在使用 pgf 统计库制作一些箱线图。我发现了以下内容。

这:

\documentclass{standalone}
\usepackage[T1]{fontenc}
\usepackage{fontspec}
\usepackage{tikz}
\usepackage{pgfplots}
\pgfplotsset{compat=1.17}


\usepgfplotslibrary{statistics}
\usepgfplotslibrary{fillbetween}

%Loading the libraries the other way around gives the same result
%\usepgfplotslibrary{fillbetween}
%\usepgfplotslibrary{statistics}

\begin{document}
\begin{tikzpicture}
    \begin{axis}[
        boxplot/draw direction = y,
    ]
        \addplot [boxplot] table [col sep=comma,y index=0] {datatest.txt};
    \end{axis}
\end{tikzpicture}
\end{document}

产生这个: 在此处输入图片描述

但是这个(我现在在同一个命令fillbetween中包含了):statistics\usepgfplotslibrary

\documentclass{standalone}
\usepackage[T1]{fontenc}
\usepackage{fontspec}
\usepackage{tikz}
\usepackage{pgfplots}
\pgfplotsset{compat=1.17}

\usepgfplotslibrary{fillbetween,statistics}

%Loading the libraries the other way around gives the same result
%\usepgfplotslibrary{statistics,fillbetween}

\begin{document}
\begin{tikzpicture}
    \begin{axis}[
        boxplot/draw direction = y,
    ]
        \addplot [boxplot] table [col sep=comma,y index=0] {datatest.txt};
    \end{axis}
\end{tikzpicture}
\end{document}

产生这个:

在此处输入图片描述 未标记异常值的地方。

为什么在同一个语句中加载两个库会破坏一个库?谢谢帮助 ;-)

编辑,抱歉,我忘记了测试文件:

数据测试.txt:

1
1
2
1
1
3
5

\usepgfplotslibrary{statistics,fillbetween}我也用和都测试了这一点,\usepgfplotslibrary{fillbetween,statistics}结果都错了。同时,

\usepgfplotslibrary{statistics} 
\usepgfplotslibrary{fillbetween}

\usepgfplotslibrary{fillbetween}
\usepgfplotslibrary{statistics} 

产生正确的结果。

答案1

定义\use@@pgfplotslibrary末尾有这段代码

    \expandafter\ifx\csname pgfp@library@#1@loadoptions\endcsname\relax
    \else
        \expandafter\let\expandafter\pgfplots@glob@TMPa\csname pgfp@library@\pgf@temp @loadoptions\endcsname
        \expandafter\pgfplotsset\expandafter{\pgfplots@glob@TMPa}%
    \fi

其目的是加载“库钩子代码”。对于统计库,它应该执行,\csname pgfp@library@statistics@loadoptions\endcsname基本上就是

/pgfplots/compat/library hook={statistics}{/pgfplots/boxplot/estimator=Excel,/pgfplots/boxplot/ensure mark=true},

在那里ensure mark=true给出你的标记。

问题是,#1或者statistics,fillbetween如果fillbetween,statistics你将两者结合在一个命令中,那么测试总是错误的。

所以这是一个错误,但只需#1替换\pgf@temp 不起作用,因为这些库调用可以嵌套,因此该值并非在所有情况下都正确。

答案2

我没有资格发表评论。所以我在写一个“答案”。不同之处在于加载了不同的文件。当你说

\usepgfplotslibrary{fillbetween,statistics}

你加载

/usr/local/texlive/2020/texmf-dist/tex/generic/pgfplots/pgfcontrib/tikzlibraryfillbetween.code.tex

\usepgfplotslibrary{statistics}
\usepgfplotslibrary{fillbetween}

你加载

/usr/local/texlive/2020/texmf-dist/tex/generic/pgfplots/libs/tikzlibrarypgfplots.fillbetween.code.tex

所有路径均指向我的 TeXLive 安装,但路径的具体名称并不重要。

据我所知,这与有关\pgfplots@iffileexists,它被调用\use@@pgfplotslibrary。执行此检查时,您似乎处于“错误”的子目录中。

所以恕我直言,最重要的是你发现了一个问题,你可能想要报告它本网站

相关内容