在\ffigbox
浮行包中,外部图像被创建了两次。原因是的参数\ffigbox
被解析了两次。显然结果是符合预期的,但我还是想防止生成那些不必要的重复项。如何才能做到这一点?
首先从以下 MWE 开始:
\documentclass{article}
\usepackage{floatrow}
\usepackage{tikz}
\usetikzlibrary{external}
\tikzexternalize
\begin{document}
\ffigbox{\tikz{\node{a};}}{}
\end{document}
答案1
作为一个初步的解决方案,我提出了一个肮脏的黑客攻击:
\documentclass{article}
\usepackage{floatrow}
\makeatletter
\newif\ifFBgettingBox
\let\OldFBget@box\FBget@box
\renewcommand\FBget@box[3]{%
\FBgettingBoxtrue%
\OldFBget@box{#1}{#2}{#3}%
\FBgettingBoxfalse}
\makeatother
\usepackage{tikz}
\usetikzlibrary{external}
\tikzexternalize
\usepackage{calc} % needed just for demonstration
\begin{document}
\ffigbox{
\ifFBgettingBox
\rule{\widthof{a}}{\heightof{a}}
\else
\tikz{\node{a};}
\fi
}{}
\end{document}
\widthof{a}
显然,实际用例看起来会更复杂,但人们通常很幸运地知道图形的宽度和高度。(在这个例子中,我借助计算包裹。)
当然,每次使用 时都要输入 if 子句,这很烦人\ffigbox
。可以通过定义宏来避免这种情况。
我更希望使用\tikzifexternalizing
或类似的解决方案。这种方法的问题在于,当禁用通常外部化的图像的外部化时仅有的在外化本身的过程中,使得外化令人头晕......