我想外部化我的 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-1
或Figure-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}