使用 floatrow 包进行 TikZ 外部化

使用 floatrow 包进行 TikZ 外部化

\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或类似的解决方案。这种方法的问题在于,当禁用通常外部化的图像的外部化时仅有的在外化本身的过程中,使得外化令人头晕......

相关内容