许多期刊要求将投稿的图片单独提交,并使用合理的名称。如果大多数图片基于 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
宏用于加强计数器。
这引出了两个问题:
- 如何将计数器设置为特定值(由@Ulrike 回答)
- 当需要跳过某个数字时,如何增加计数器
这是一个受@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>
但您需要小心,不要创建非唯一的名称......