pgf/tikz 外部化 + tabu:makefile 和图例来命名问题

pgf/tikz 外部化 + tabu:makefile 和图例来命名问题

我在使用和 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}

相关内容