如何修改 tikzexternalize 文件名的计数器?

如何修改 tikzexternalize 文件名的计数器?

许多期刊要求将投稿的图片单独提交,并使用合理的名称。如果大多数图片基于 tikz/pgf,则 Tikz-external 似乎是这项工作的完美选择,因为它支持自动更新和命名。

但是,pgfmanual 和 pgf 文档都仅说明:

每个不同的 将使用一个唯一的计数器{<name>},并且每个计数器都将从 0 开始。

pgf 文档进一步指出

这些计数器存储在不同的宏中。换句话说:不需要 TEX 寄存器。

从 0 开始有点不方便,除非你恰好有一个图形摘要。在这种情况下一切都很好,后续 PDF 文件的编号与文档中的图号相对应。

graphical_abstract.tex -> Fig0.pdf
Fig1 (tikzpicture) -> Fig1.pdf
...

当一个或多个图形不使用 tikz 时,就会出现另一个问题,例如因为它是一个已经存在的 PDF 或 PNG 图像,只是简单包含其中。

Fig2 (not a tikzpicture)
Fig3 (tikzpicture) -> Fig2.pdf

由于文件名计数器仅考虑\begin{tikzpicture} ... \end{tikzpicture}它不知道这样的中间图形,因此文档中的“图 3”生成为Fig2.pdf

在一个类似问题@percusse 提到该\tikzexternal@getnextfilename@advancecount宏用于加强计数器。

这引出了两个问题:

  1. 如何将计数器设置为特定值(由@Ulrike 回答)
  2. 当需要跳过某个数字时,如何增加计数器

这是一个受@Ulrike 的回答启发的基本 MWE

\documentclass{article}
\usepackage{tikz, float}
\usetikzlibrary{external}
\tikzexternalize

\tikzsetfigurename{Fig}

% NOTE: Modified from https://tex.stackexchange.com/a/580401/140433
\newcommand{\setpgfexternalcounter}[1]{
  \makeatletter%
  \pgfkeysgetvalue{/tikz/external/figure name}\myexternalname
  \expandafter\gdef\csname c@tikzext@no@\myexternalname\endcsname{#1}%
  \makeatother
}

\begin{document}

  one
  %
  \setpgfexternalcounter{1}
  %
  \begin{figure}[H]
    \centering
    \begin{tikzpicture}
      \draw(0.5, 0)--(0.5, 1);
    \end{tikzpicture}
    \caption{The number one}
    \label{fig:one}
  \end{figure}

  two
  %
  % TODO: \skippgfexternalcounter
  %
  \begin{figure}[H]
    \centering
    % NOTE: use the following to generate Fig2.pdf
    % \tikzsetnextfilename{figures/Fig2}
    % \begin{tikzpicture}
    %   \draw (0.5, 0) -- (0, 0) -- (0, 0.5) -- (0.5, 0.5) -- (0.5, 1) -- (0, 1);
    % \end{tikzpicture}
    \includegraphics{figures/Fig2}
    \caption{The number two}
    \label{fig:two}
  \end{figure}

  three
  %
  % TODO: Avoid explicitly having to give the number of the next figure
  \setpgfexternalcounter{3}
  %
  \begin{figure}[H]
    \centering
    \begin{tikzpicture}
      \draw (0, 0)  -- (0.5, 0) -- (0.5, 1)  -- (0, 1);
      \draw (0, 0.5) -- (0.5, 0.5);
    \end{tikzpicture}
    \caption{The number three}
    \label{fig:three}
  \end{figure}
\end{document}

请注意,问题的第二部分的解决方案(例如通过某些宏\skippgfexternalcounter)不需要明确指定下一个图形的编号。它甚至可以通过将它包含在所有非 tikzpictures 的图形中来实现进一步的自动化。当然,也可以定义一个新的计数器,为所有非 tikzpictures 增加它,然后将该
值添加到外部图形计数器的当前值(例如,在内\setpgfexternalcounter)。但为此,我需要获取该计数器的值,但我无法做到这一点,因为我仍然不太明白它到底是什么或有关它的信息来自哪里。

答案1

以下创建并包含 XYZ1.pdf 和 XYZ6.pdf:

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{external}
\tikzexternalize
\begin{document}
blub
\makeatletter 
\tikzsetfigurename{XYZ} %not needed only for demo.
\pgfkeysgetvalue{/tikz/external/figure name}\myexternalname
\expandafter\gdef\csname c@tikzext@no@\myexternalname\endcsname{1}%
\makeatother
\begin{tikzpicture}
  \draw(0,0)--(1,-1);
\end{tikzpicture}

\makeatletter
\expandafter\gdef\csname c@tikzext@no@\myexternalname\endcsname{6}%
\makeatother
\begin{tikzpicture}
  \draw[red](0,0)--(-1,2);
\end{tikzpicture}

\end{document}
 <./XYZ1.pdf> <./XYZ6.pdf>

但您需要小心,不要创建非唯一的名称......

相关内容