我在使用和 pgf/tikz 外部化的组合时遇到了麻烦tabu
。请考虑下面的代码片段,我尝试使用 lualatex 或 pdflatex 使用 texlive 2018 进行编译。
\documentclass{book}
\usepackage{filecontents}
\newcommand{\legendname}{defaultlegendname}
\begin{filecontents*}{test.tikz}
\tikz{\begin{axis}[
width=4cm,height=4cm,
]
\addplot +[]%
table[row sep=crcr] {%
1 1\\
2 4\\
};
\label{testAAA}
\end{axis}
\begin{axis}[
legend to name=\legendname,
width=4cm,height=4cm,
at={(4.1cm,0cm)}
]
%
\addlegendimage{/pgfplots/refstyle={testAAA}}\addlegendentry{AAA}%
\addplot +[red]%
table[row sep=crcr] {%
1 2\\
5 10\\
};
\addlegendentry{BBB}%
\end{axis}}
\end{filecontents*}
\usepackage{tikz,pgfplots,pgfplotstable,subcaption,tabu}
\usetikzlibrary{external}
\tikzexternalize[mode=list and make]
\begin{document}
\begin{figure}
\begin{tabu} to \linewidth {X}
\renewcommand{\legendname}{fig1-legend}\ref{\legendname}\\
\tikzsetnextfilename{fig1}\subcaptionbox{}{\input{test.tikz}}\\
\end{tabu}
\end{figure}
\end{document}
我的编译过程如下:1)Lualatex 提醒我有数据需要更新。
figfile 和 makefile 如下:
% cat test.figlist
fig1
% cat test.makefile
fig1.pdf:
lualatex -shell-escape -halt-on-error -interaction=batchmode -jobname "fig1" "\def\tikzexternalrealjob{test}\input{test}"
fig1.pdf: fig1.md5
2)make -f test.makefile
完成且没有错误
3) 2 次 lualatex。现在没有提示要更新图形(我本来预料到会这样,因为图例尚未外部化)。相反,我得到了以下更新的 makefile
% cat test.makefile
fig1.pdf:
lualatex -shell-escape -halt-on-error -interaction=batchmode -jobname "fig1" "\def\tikzexternalrealjob{test}\input{test}"
fig1.pdf: fig1.md5
fig1.pdf: FORCEREMAKE
4)我再次运行 makefile,让 latex 知道有些引用尚未更新,但它给了我
% make -f test.makefile
make: *** No rule to make target 'FORCEREMAKE', needed by 'fig1.pdf'. Stop.
5) 由于 makefile 是伪造的,我手动运行 makefile 中的命令。这样没有任何问题。
6) 我再次运行 lualatex,看看他是否注意到图例仍需构建。但他仍然没有注意到,因此也没有更新 figlist 或 makefile
因此,我还看到了带有图例问号的实际图形。在环境之外/没有环境的情况下tabu
,它似乎工作正常。但我有几个多面板图形tabu
非常方便。
我在这里做错了什么?
答案1
这似乎有效:
我把传说里面灵感tikzpicture
来自Stefan Pinnow 的回答回答类似的问题。
由于标签的信息存储在主.aux
文件中,因此您必须先编译,然后执行make fig1.pdf
,再编译,make fig1.pdf
再执行以生成正确的图像,最后再编译以在文档中获得正确的图像。请注意,我在 Windows 上,因此无法直接测试 makefile,但我只是复制了它的命令并在命令提示符中执行。
这似乎也可以很好地与 配合使用tabu
,但我相信我听到/读到过某处被tabu
认为已被弃用和有缺陷。
\documentclass{book}
\usepackage{tikz,pgfplots,pgfplotstable,subcaption,tabu}
\usetikzlibrary{
matrix,
pgfplots.external,
}
\tikzexternalize[mode=list and make]
\pgfplotsset{compat=1.3}
\usepackage{filecontents}
\newcommand{\legendname}{defaultlegendname}
\begin{filecontents*}{test.tikz}
\tikzsetnextfilename{fig1}
\begin{tikzpicture}
\begin{axis}[
width=4cm,
height=4cm,
]
\addplot +[] table[row sep=crcr] {%
1 1\\
2 4\\
};
\label{plots:AAA}
\coordinate (top) at (rel axis cs:0,1);% coordinate at top of the first plot
\end{axis}
\begin{axis}[
width=4cm,
height=4cm,
at={(4.1cm,0cm)}
]
\addplot +[draw=red] table[row sep=crcr] {%
1 2\\
5 10\\
};
\label{plots:BBB}
\coordinate (bot) at (rel axis cs:1,0);% coordinate at bottom of the last plot
\end{axis}
\path (top|-current bounding box.north)--
coordinate(legendpos)
(bot|-current bounding box.north);
\matrix[
matrix of nodes,
anchor=south,
draw,
inner sep=0.2em,
] at ([yshift=1ex]legendpos) {
\ref{plots:AAA} & AAA \\
\ref{plots:BBB} & BBB \\
};
\end{tikzpicture}
\end{filecontents*}
\begin{document}
\begin{figure}
\begin{tabu} to \linewidth {X}
\subcaptionbox{}{\input{test.tikz}}\\
\end{tabu}
\end{figure}
\end{document}