在 tikz externalize 中:如何使文件名自动与图形标签匹配?

在 tikz externalize 中:如何使文件名自动与图形标签匹配?

我想外部化我的 Tikz 图片并自动为它们命名 Figure1.pdf、Figure2a.pdf、Figure2b.pdf 等。

因此,我想\textsetnextfilename与 cleveref 之类的东西结合起来,它会自动给我我喜欢的参考字符串。

目的是,我必须将所有图表单独作为 PDF 提交给期刊,并且我想确保他们知道哪个图表属于哪里,而不需要我手动命名所有内容,也不需要在我移动文档中的东西后跟踪哪个 PDF 在哪里。

%MWE
\documentclass{article}
\usepackage{cleveref}
\usepackage{tikz}
\usetikzlibrary{external}
\tikzexternalize
\begin{document}
\tikzsetnextfilename{Figure1 (manually)} %%% Here should be some construct with \cref{fig:Test} that expands to Figure 1...
\begin{figure}
\centering
\begin{tikzpicture}
\draw[fill=gray](0,0)rectangle(0.3\textwidth,0.3\textwidth)node[midway, anchor=center,font=\Huge]{A};
\end{tikzpicture}
\caption{Blababal}\label{fig:Test}
\end{figure}
\Cref{fig:Test} shows a square with a uppercase letter A. 
\end{document}

\cref{fig:Test}因此,必须输入基于的某些内容作为参数\tikzsetnextfilename,才能自动获得 PDF 文件名“图 1.pdf”。在 MWE 中,我手动输入,但如何使用 实现自动化\cref?如果有办法不用\cref它也可以。

答案1

可以使用标签作为文件名。但由于\ref-like 命令不能与\tikzexternalize和默认 一起使用mode=convert with system call,因此必须使用\tikzexternalize[mode=list and make]。这将生成一个名为main.makefile的文件main.tex。并且必须在 shell 中使用 手动构建图形make -f main.makefile

如果这不是太麻烦的话,这里有一个解决方案。

而不必调用\tikzsetnextfilename{...} \NextFigureNameByLabel{<label>}必须调用。图形的文件名将是 egFigure-1Figure-2b

它会对未定义的标签发出警告。在这种情况下,将有名为 的文件Figure-??....。这也会在第一次运行时发生,当时尚未设置标签。这可以忽略。

因此,运行两次 LaTeX 以获取正确引用,执行make -f main.makefile,然后再次运行 LaTeX。

\documentclass{article}
\usepackage{cleveref}
\usepackage{tikz}
\usetikzlibrary{external}
\usepackage{subcaption}

\makeatletter
% based on LaTeX definition of \ref, only gives out the number
\def\@setvalref#1#2#3{%
  \ifx#1\relax
    % warning will not work here, moved to \NextFigureNameByLabel
%    \protect\G@refundefinedtrue
    ??%
%    \@latex@warning{Reference ‘#3’ on page \thepage \space undefined}%
  \else
    \expandafter#2#1%
  \fi}
\def\valref#1{\expandafter\@setvalref\csname r@#1\endcsname\@firstoftwo{#1}}

\newcommand{\NextFigureNameByLabel}[1]{%
    % to get a proper warning for undefined labels
    \expandafter\ifx\csname r@#1\endcsname\relax
        \protect\G@refundefinedtrue
        \@latex@warning{Reference ‘#1’ on page \thepage \space undefined}%
    \fi    
    \edef\NFNtemp{Figure-\valref{#1}}%
    \expandafter\tikzsetnextfilename\expandafter{\NFNtemp}%
}
\makeatother

\tikzexternalize[mode=list and make]
\begin{document}
\begin{figure}
\centering
\NextFigureNameByLabel{fig:SubA}
\begin{subfigure}{0.42\textwidth}
\centering
\begin{tikzpicture}
\draw[fill=gray](0,0)rectangle(0.3\textwidth,0.3\textwidth)node[midway, anchor=center,font=\Huge]{A};
\end{tikzpicture}
\caption{Blababal}\label{fig:SubA}
\end{subfigure}
\NextFigureNameByLabel{fig:SubB}
\begin{subfigure}{0.42\textwidth}
\centering
\begin{tikzpicture}
\draw[fill=gray](0,0)rectangle(0.3\textwidth,0.3\textwidth)node[midway, anchor=center,font=\Huge]{B};
\end{tikzpicture}
\caption{Blababal}\label{fig:SubB}
\end{subfigure}
\caption{Blababal}\label{fig:Test}
\end{figure}
\Cref{fig:Test} shows two squares with a uppercase letters. (\ref{fig:Test})
\Cref{fig:SubA} shows a square with a uppercase letter A. (\ref{fig:SubA})
\Cref{fig:SubB} shows a square with a uppercase letter B. (\ref{fig:SubB})
\end{document}

答案2

以下生成名为Figure1.pdf和的外部化 PDF Figure2.pdf\arrastikzsetnextfilename增加figure计数器,设置文件名,然后减少计数器,\caption然后增加计数器以使图形的数字与外部化文件名相匹配。

\documentclass{article}
\usepackage{tikz}
\usepackage{cleveref}
\usetikzlibrary{external}
\tikzexternalize
\newcommand*\arrastikzsetnextfilename{%
  \refstepcounter{figure}\edef\tempa{Figure\thefigure}%
  \expandafter\tikzsetnextfilename{\tempa}%
  \addtocounter{figure}{-1}%
}
\begin{document}
\arrastikzsetnextfilename
\begin{figure}
  \tikz{\node {first};}

  \caption{first}\label{fig:first}
\end{figure}
\arrastikzsetnextfilename
\begin{figure}
  \tikz{\node {second};}

  \caption{second}\label{fig:second}
\end{figure}
\end{document}

相关内容