使用 TikZ,是否可以仅水平或垂直剪辑?
通常情况下,在剪辑时,例如,
\documentclass{article}
\usepackage{tikz}
\begin{document}
\begin{tikz}
\clip (-1,-1) rectangle (1,1);
\draw (-2,0) -- (2,0);
\end{document}
\end{tikz}
裁剪一个矩形区域,并将整个区域包含在图片的边界框中。当某些图片元素的位置事先未知时(例如在图中),这可能意味着边界框太大(或太小)。
处理这个问题的一种方法是只水平裁剪(例如,绘图范围已知,我们使用一个表格来绘图,其中绘图点超出该范围,但不包含绘图值)或垂直裁剪。但如何实现呢?
答案1
这里有两个问题:
与“巨大”矩形一起使用
\clip
,同时避免将剪辑矩形用作 BoundingBox 的一部分。这可以通过在环境\clip
内使用来解决pgfinterruptboundingbox
。以这种方式设置剪切区域后,我们进行绘制,但图形的 BoundingBox 会针对每个笔划进行更新(即使对于剪切区域外的笔划它不可见)。因此,在绘制图形后,我们必须将 BoundingBox 重置为剪切区域。这可以通过放置 来完成
\pgfresetboundingbox
,然后[use as bounding box]
设置适当的路径。
棘手的部分是为第二个问题找出“合适的路径”。它必须是 1 中使用的裁剪区域与 2 中生成的真实 BoundingBox 的交集。
这是一种(复杂的)可能性:
\documentclass{article}
\usepackage{tikz}
\newcommand\flower[1][black]{
\foreach \a in {0,10,...,360} {
\draw[#1] (\a:2) circle(1.5);
}
}
\begin{document}
A---%
\begin{tikzpicture}
\coordinate (left) at (-1.3, -20); % -20 is arbitrarily large
\coordinate (right) at (1.3, 20); % 20 is arbitrarily large
\begin{pgfinterruptboundingbox} % Clip, without affecting BB
\clip (left) rectangle (right);
\end{pgfinterruptboundingbox}
\flower % This draws the "plot" (and creates a new BB, outside the clip)
% Save new BB top and bottom
\coordinate (top) at (current bounding box.north);
\coordinate (bottom) at (current bounding box.south);
% Clear BB
\pgfresetboundingbox
% Set a new BB adjusted to the clipped part
\path[use as bounding box] (left|-bottom) rectangle (right|-top);
\end{tikzpicture}%
---B
\end{document}
生成:
答案2
我认为通过仔细选择矩形的尺寸是可以实现的。在您的示例中,您应该选择一个高度等于线宽的矩形。在本例中,它是\pgflinewidth
。
\documentclass{article}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
\clip (-1,-0.5\pgflinewidth) rectangle (1,0.5\pgflinewidth);
\draw (-2,0) -- (2,0);
\end{tikzpicture}
\end{document}