带有覆盖层的 Tikzpicture 占用空间

带有覆盖层的 Tikzpicture 占用空间

考虑一下这个MWE:

\documentclass{article}
\usepackage{tikz}

\begin{document}

\begin{tikzpicture}[remember picture,overlay]
    \node [circle, fill=red!90!black, minimum width=15em] at (current page.center) {};
\end{tikzpicture}

\section{Amazing movable type!}
\end{document}

尽管带覆盖的图片不应占用空间,但部分标题还是被移动了。尝试只输入不带 的部分标题tikzpicture,并注意部分标题上方的垂直空间较少:

\documentclass{article}

\begin{document}
\section{Amazing movable type!}
\end{document}

或参见插图:

带有覆盖层的 Tikzpicture 占用空间

该行为与占用空间的注释相同:

\documentclass{article}
\usepackage{tikz}

\begin{document}%
%
\begin{tikzpicture}[remember picture,overlay]%
    \node [circle, fill=red!90!black, minimum width=15em] at (current page.center) {};%
\end{tikzpicture}%
%
\section{Amazing movable type!}
\end{document}

我注意到在以下情况下会添加额外的垂直空间:

  • sectiontikzpicture 在标题前输入
  • descriptiontikzpicture 在环境之前输入
  • itemizetikzpicture 在环境之前输入
  • enumeratetikzpicture 在环境之前输入

Tikzpicture 与普通文本的行为符合预期。例如,这将正常工作:

\documentclass{article}
\usepackage{lipsum, tikz}

\begin{document}
\section{Amazing movable type!}
\begin{tikzpicture}[remember picture,overlay]
    \node [circle, fill=red!90!black, minimum width=15em] at (current page.center) {};
\end{tikzpicture}%but you must not leave some space here, otherwise, a single blank space is shown before text.
\lipsum[13]

\end{document}

为什么会发生这种情况?如何预防?\useasboundingbox (0,0);让 tikz 图片浮动 没有帮助。

编辑

Caramdir 建议\nointerlineskip在之前输入tikzpicture似乎可以解决章节标题的垂直空间问题,但描述和类似环境仍然有不必要的额外垂直空间。参见插图:

无行间跳过解决方案

答案1

tikzpicture环境必须嵌入段落中,例如在开头或结尾

\section{Not amazing}

\begin{tikzpicture}[...]...\end{tikzpicture}%
Text of the paragraph

如果将其放在段落之间,它将与所有间距功能产生不良影响。垂直空间不会在分页符处消失,基线跳过空间将被插入,\addvspace不会知道该环境之前的空格。

TikZ 的工作应该是认识到这样的覆盖环境不能对当前页面做任何事情,并将其保留以供发货。即使阿特别格什存在问题:

\AtBeginShipout{\begin{tikzpicture}[...]...\end{tikzpicture}}

由于 TikZ 图片产生了一个 hbox,导致输出再次向下移动(并出现过满 vbox 警告)。

答案2

如果你每页最多只能使用一张叠加图片,则可以使用background包(另请参阅TikZ 叠加图片影响其周围的文本):

\documentclass{article}
\usepackage{tikz, showframe}
\usepackage[pages=some]{background} 

\begin{document}

\backgroundsetup{opacity=1, scale=1, angle=0, contents={%
    \begin{tikzpicture}[remember picture, overlay]
    \node [circle, fill=red!90!black, minimum width=15em] at (current page.center) {};
    \end{tikzpicture}}}
\BgThispage

\section{Amazing movable type!}    
\end{document}

在此处输入图片描述

答案3

您可以将覆盖tikzpicture环境放在宽度为零的框中:

\makebox[0pt][c]{%
  \begin{tikzpicture}[overlay]
    ...
  \end{tikzpicture}%
}

我还发现,代码结构换行符产生的“意外”空行可能会导致添加不必要的空格。确保注释掉敏感代码区域中的所有行尾。

相关内容