使用 tikz/textpos 时出现意外输出

使用 tikz/textpos 时出现意外输出

以下代码(MWE)

\documentclass[a4paper]{article}

\usepackage{tikz}
\usepackage[absolute]{textpos}

\usetikzlibrary{external}
\tikzexternalize

\begin{document}

\begin{textblock}{4}[0,0](1.3,2.5)
\begin{center}
SOME TITLE TEXT SOME TITLE TEXT\\
SOME TITLE TEXT SOME TITLE TEXT
\end{center}
\end{textblock}
\thispagestyle{empty}
\mbox{} \clearpage  %flush this page

\begin{figure}
\begin{tikzpicture}
  \path[draw] (20mm,150mm) -- (20mm,250mm);
  \path[draw] (100mm,150mm) -- (100mm,250mm);
\end{tikzpicture}

\end{figure}

\end{document}

预计将产生两页;

第一个包含一些标题文本,第二个包含两条平行线。

相反,在第二页附加了第一页(看一下图片)

在此处输入图片描述

我正在使用pdflatexMikTeX 2.9(已更新)并用 进行编译-enable-write18

怎么了?

答案1

问题在于textpos包和externalize库都利用了 TeX shipout 机制。

据称,externalize应该忽略环境之外的所有文本tikzpicture,包括textblock环境中的文本。然而,textposabsolute模式中,这些文本包含在页面末尾附带的框内,显然 tikz 对此并不知情,因此干扰了正在externalize尝试构建的“页面”。

我发现的窍门是textpos在使用后清空此框。在这个特定示例中,以下 MWE 有效,但我不知道它是否足够通用。请在您的实际用例中尝试它并告诉我们。

\documentclass[a4paper]{article}

\usepackage{tikz}
\usepackage[absolute]{textpos}

\makeatletter
\def\cleartextposbox{\global\setbox\TP@holdbox\vbox{}}
\makeatother

\usetikzlibrary{external}

\tikzexternalize
\begin{document}
\begin{textblock}{4}[0,0](1.3,2.5)
\begin{center}
SOME TITLE TEXT SOME TITLE TEXT\\
SOME TITLE TEXT SOME TITLE TEXT
\end{center}
\end{textblock}
\thispagestyle{empty}
\null\newpage\cleartextposbox   % <----- 

\begin{figure}
\begin{tikzpicture}
 \path[draw] (20mm,150mm) -- (20mm,250mm);
 \path[draw] (100mm,150mm) -- (100mm,250mm);
\end{tikzpicture}
\end{figure}

\end{document}

结果

相关内容