我想使用 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}
现在我可以将每一个“图例到名称”引用缩放到所需的字体大小。
我希望这可以帮助某人解决将来的问题。