pgfplot 交叉引用和 externalize 之前的调用组合会产生错误

pgfplot 交叉引用和 externalize 之前的调用组合会产生错误

我想使用 pgfplots 的“图例到名称”功能和 externalize。如果我不使用用于设置所需字体大小的“在 crossref tikzpicture 之前调用”,则此方法可正常工作(对于交叉引用,我特别希望能够独立于为各个 pgfplot 图片本身设置的内容(即通过“每个轴图例/.append 样式”设置的内容)更改此设置)。

当使用 externalize 和“invoke before”的组合时,出现以下错误:

! Extra \endgroup.
\pgfplots@legend@to@name@named ...i \fi \endgroup                                       

l.26 \ref{named}

使用 externalize 而不使用“invoke before..”会产生预期(但不期望)的结果。

以下是 MWE,其中必须注释掉前 4 行注释掉的行才能产生错误(无论是否外部化到子文件夹)。或者,可以注释掉“之前调用”部分,然后外部化就可以完美运行。

\documentclass{article}
\usepackage{lipsum}

\usepackage{pgfplots}

% \usetikzlibrary{external}
% \tikzexternalize[
%   %prefix=TikzCompiledFigures/,
% ]
\pgfplotsset{
    compat=1.18,
    samples=10,
    invoke before crossref tikzpicture={% <--- "invoke before" is used to change the fontsize according to the surrounding text
        \tikzset{%
            every node/.append style={%
                font=\normalsize
            }
        }
    }
}

\begin{document}

\lipsum[1] %
$x$ %
\ref{named}
\lipsum[2]

\begin{figure}[t]
\centering
%
\begin{tikzpicture}
\begin{axis}[
width=7cm,
legend columns=-1,
legend entries={$(x+0)^k$;,$(x+1)^k$},
legend to name=named,
every axis legend/.append style={
    draw=none,
    font=\Huge,
},
]
\addplot {x};
\addplot {x+1};
\end{axis}
\end{tikzpicture}
%
\caption{\footnotesize Test: $x$ %
\ref{named}
.
}
\end{figure}

\end{document}

我知道有时禁用 externalize 会有所帮助,如下所示问题,但在这种情况下,它并不能缓解问题。事实上,正如其中一条评论中所建议的那样,使用“invoke before”禁用 externalize 的解决方案之一产生了我面临的相同错误。

我希望有人能在这里帮助我。每一条提示都非常感谢。

为了完整起见:这个问题是这个问题的后续问题: 正文和标题中 pgfplot 内联图例的对齐

答案1

经过反复尝试,我找到了解决这两个问题的方法。

看来必须跟invoke after crossref tikzpicture命令匹配啊invoke before crossref tikzpicture

但我在手册中找不到对此的说明,所以对此持怀疑态度。

此外,只有使用外部化选项时,mode=list and make输出才会按(某种程度上)预期的方式生成。这将消除错误。

以下是完整代码的示例:

\documentclass{article}
\usepackage{lipsum}

\usepackage{pgfplots}

\usetikzlibrary{external}
\tikzexternalize[
    prefix=TikzCompiledFigures/,
    mode=list and make,
]
\pgfplotsset{
    compat=1.18,
    samples=10,
    invoke before crossref tikzpicture={
        \tikzset{%
            every node/.append style={%
                font=\Huge
            },%
        }%
    },
    invoke after crossref tikzpicture={
        \tikzset{%
            every node/.append style={%
                font=\normalsize
            },%
        }%
    },%
}

\begin{document}

\lipsum[1] %
$x$ %
\ref{named}
\lipsum[2]

\begin{figure}[t]
\centering
%
\begin{tikzpicture}
\begin{axis}[
width=7cm,
legend columns=-1,
legend entries={$(x+0)^k$;,$(x+1)^k$},
legend to name=named,
every axis legend/.append style={
    draw=none,
    font=\tiny,
},
]
\addplot {x};
\addplot {x+1};
\end{axis}
\end{tikzpicture}%
\caption{\footnotesize Test: $x$ %
\ref{named}
.
}
\end{figure}

\end{document}

这仍然无助于以所需的字体大小排版外部图例。

为此,我使用了relsize如下包回答

\documentclass{article}
\usepackage{lipsum}

\usepackage{pgfplots}

\usetikzlibrary{external}
\tikzexternalize[
    prefix=TikzCompiledFigures/,
    mode=list and make,
]
\pgfplotsset{
    compat=1.18,
    samples=10,
}
% This is what was propsed
\usepackage{relsize}
\newcommand\scaleInNode[1][1]{\tikzset{execute at begin node={\normalsize\larger[#1]}}}
% to here


\begin{document}
\lipsum[1] %

$x$ %
% And here is one example of how it can be used
{\scaleInNode[0]\ref{named}}

\lipsum[2]

\begin{figure}[t]
\centering
%
\begin{tikzpicture}
\begin{axis}[
width=7cm,
legend columns=-1,
legend entries={$(x+0)^k$;,$(x+1)^k$},
legend to name=named,
every axis legend/.append style={
    draw=none,
    font=\scriptsize,
},
]
\addplot {x};
\addplot {x+1};
\end{axis}
\end{tikzpicture}%
\caption{%
    Test: $x$ %
    % Here, two legends with different font sizes are added:
    {\ref{named}}
    {\scaleInNode[0]\ref{named}}
    .
}
\end{figure}

\end{document}

现在我可以将每一个“图例到名称”引用缩放到所需的字体大小。

标题中“名称到图例”的结果带有不同的字体大小。

我希望这可以帮助某人解决将来的问题。

相关内容