使用 TikZ,是否可以仅水平或垂直剪辑?

使用 TikZ,是否可以仅水平或垂直剪辑?

使用 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

这里有两个问题:

  1. 与“巨大”矩形一起使用\clip,同时避免将剪辑矩形用作 BoundingBox 的一部分。这可以通过在环境\clip内使用来解决pgfinterruptboundingbox

  2. 以这种方式设置剪切区域后,我们进行绘制,但图形的 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}

在此处输入图片描述

相关内容