Tikz 理解节点和绘制之间的空白

Tikz 理解节点和绘制之间的空白

我是 Tikz 的新手,在一些实验中,我做了类似下面例子的事情,但我不太明白为什么我的两行之间会留有空格......

\documentclass[tikz,border=10pt]{standalone}
\usepackage{tikz}

\begin{document}
\begin{tikzpicture}[every node/.style={inner sep=0,outer sep=0}]
  \node at (0,0) (test) {\tikz \draw (0,0) -- (1,0);};
  \draw (test.east) --++ (1,0);
\end{tikzpicture}
\end{document}

这是我想做的一个非常简单的例子,也许我理解错了,不应该以这种方式进行,但我很想知道是否有可能消除这个空间。

在此处输入图片描述

答案1

这是一个有趣的案例!我最初认为这是因为,正如@Andrew在评论中所说,\node有边框。但是,可以通过设置inner sepouter sep来删除该边框0,这正是您要做的。因此节点没有边界。

发生的事情是内部\tikz图片有边框。究竟为什么会这样,这很微妙。当 TikZ 构建图片时,它会在内部跟踪图片的大小。这样做的主要方法是跟踪一个足够大的矩形,以包含已使用的每个坐标,这足以确保每条路径都在图片内(关于贝塞尔曲线有一些有趣的问题)。但是,当绘制一条线时,它会以厚度绘制,因此如果路径介于 和 之间,(0,0)那么(1,0)它的最大高度实际上将是 的一半线宽以上0。因此,当 TikZ 将一个点添加到边界框时,它实际上会在它之外添加一半线宽。因此,当您使用坐标(0,0)(1,0)以及(为了便于解释)线宽 2mm 创建一个图片时,边界框将具有 的角(-.1,-1.)(1.1,.1)这会稍微超出线。

当将其嵌入另一个节点时(我会比@Andrew 更强烈地指出应该避免嵌套 TikZ 图片),外部 TikZ 对内部 TikZ 绘制的内容一无所知,只知道框的大小。因此,它会创建一个足够大的节点来包含该框。即使您使该节点尽可能紧密贴合(通过inner sep=0, outer sep=0),也不会使其接触内线。

@AboAmmar 提出的解决方案解决了这个问题,它使内部 TikZ 图片中的线条延伸到内部图片的边界,因为line cap=rect确保线条延伸到坐标之外的线宽的一半。这在水平/垂直线的情况下有效,因为线条的超出部分与添加到框中的超出部分完全匹配,但对角线的情况可能需要更多调整。

(我实际上会记住这一点,作为另一个例子,说明为什么嵌套 tikz 图片会导致奇怪的效果,因此不是一个好主意。如果您遇到需要嵌套 tikz 图片的情况,请先在这里询问,有人会想出替代解决方案!)

答案2

在这种特殊情况下,您可以添加line cap=rect,然后那个微小的间隙就会消失。

\documentclass{article}
\usepackage{tikz}

\begin{document}

\begin{tikzpicture}[every node/.style={inner sep=0,outer sep=0}, line cap=rect]
  \node at (0,0) (test) {\tikz\draw (0,0) -- (1,0);};
  \draw [inner sep=0,outer sep=0](test.east) --++ (1,0);
\end{tikzpicture}

\end{document}

缩放至 1200% 时:

在此处输入图片描述

答案3

正如我的评论和 Loop Space 的精彩回答中所写,tikzpictures应避免嵌套。实现此目的的标准方法是使用\saveboxes。当然,节点具有由线宽给出的边框。

\documentclass[tikz,border=10pt]{standalone}
\usepackage{tikz}
\newsavebox\TikzBar
\sbox\TikzBar{\tikz \draw (0,0) -- (1,0);}
\begin{document}
\begin{tikzpicture}[every node/.style={inner sep=0,outer sep=0}]
  \node at (0,0) (test) {\usebox\TikzBar};
  \draw (test.east) --++ (1,0);
\end{tikzpicture}
\begin{tikzpicture}[every node/.style={inner sep=0,outer sep=0}]
  \node at (0,0) (test) {\usebox\TikzBar};
  \draw ([xshift=-\pgflinewidth/2]test.east) --++ (1,0);
\end{tikzpicture}
\end{document}

在此处输入图片描述

正如你所看到的,一旦你避免了 tikzpictures 的嵌套,差距是几乎消失了,如果你通过将线移近来纠正边界,-\pgflinewidth/2它就会完全消失。

相关内容