tikz:剪切节点

tikz:剪切节点

我想获得这种效果

\documentclass{standalone}

\usepackage{tikz}
\usetikzlibrary{calc}

\begin{document}
\begin{tikzpicture}
\clip (-1ex,-12pt) rectangle (1ex,12pt);
\node [align=center] (text) {A \\ B \\ C};
\end{tikzpicture}
\end{document}

但是我找不到方法来剪辑仍需绘制的节点,例如

\clip ($(text.south west) + (0,6pt)$) rectangle ($(text.north east) - (0,6pt)$);

如果不明确使用剪辑位置,我该如何实现它?

答案1

啊,这看起来像是 的工作\pgfpositionnodelater!如果您在本地范围内调用此命令,随后定义的节点将不会立即排版,但它们的内容将保存到一个框中,并且边缘坐标可以保存到宏中。然后,您可以使用节点别名not yet positioned@<node name>来设置剪辑路径,然后加载边缘坐标并使用 排版节点\pgfpositionnodenow

\documentclass{standalone}

\usepackage{tikz}
\usetikzlibrary{calc}

\newbox\mybox
\def\mysaver{
\global\setbox\mybox=\box\pgfpositionnodelaterbox
\global\let\myname=\pgfpositionnodelatername
\global\let\myminx=\pgfpositionnodelaterminx
\global\let\myminy=\pgfpositionnodelaterminy
\global\let\mymaxx=\pgfpositionnodelatermaxx
\global\let\mymaxy=\pgfpositionnodelatermaxy
}

\newcommand{\loadnode}{
\let\pgfpositionnodelatername=\myname
\let\pgfpositionnodelaterminx=\myminx
\let\pgfpositionnodelaterminy=\myminy
\let\pgfpositionnodelatermaxx=\mymaxx
\let\pgfpositionnodelatermaxy=\mymaxy
\setbox\pgfpositionnodelaterbox=\box\mybox
}

\begin{document}
\begin{tikzpicture}
{
\pgfpositionnodelater{\mysaver}
\node [align=center] (text) {A \\ B \\ C \\ ABCDEF};
}
\clip ($(not yet [email protected] west) + (0,6pt)$) rectangle ($(not yet [email protected] east) - (0,6pt)$);
\loadnode
\pgfpositionnodenow{\pgfqpoint{0pt}{0pt}
}

\end{tikzpicture}
\end{document}

由 percusse 编辑

如果您想使用 TikZ 前端实现类似的效果,您可以append after command按如下方式使用键:

\begin{tikzpicture} 
\clip node [append after command={%
        ($(text.south west) + (0,6pt)$) rectangle ($(text.north east) - (0,6pt)$)%
        },%
    align=center] (text) {TOP TEXT\\ A \\ B \\ C \\ LONGER}; 
\end{tikzpicture}

粗略地说,它以所需的顺序嵌套路径构造和节点放置。顺序的对应部分由 给出prefix after command。这允许我们预先使用要创建的节点的名称。但是,正如手册中所述,它的使用非常有限。您无法更改节点的结构属性,例如形状、颜色等。

答案2

您可以先创建一个不可见的节点,只是为了捕捉尺寸,然后剪辑并最后绘制文本,就像这样(这只是 tikzpicture 的内部):

\node [transparent, align=center] (text) {A \\ B \\ C};
\clip ($(text.south west) + (0,6pt)$) rectangle ($(text.north east) - (0,6pt)$);
\draw (text) node [align=center] {A \\ B \\ C};

包含较长文本的完整示例(放入宏来删除文本重复):

\documentclass{minimal}
\usepackage{tikz}
\usetikzlibrary{calc}
\begin{document}
\def\longText{Lorem ipsum dolor sit amet, consectetuer adipiscing elit. 
Faucibus, tortor lacus vestibulum sapien, tempus tellus. Praesent a leo ac diam. 
Pellentesque facilisis hendrerit. Maecenas interdum eu, ullamcorper ut, 
pulvinar vitae, vestibulum varius. In hac habitasse platea dictumst. 
Aenean tincidunt enim. Mauris at magna. Donec vitae ornare elementum congue, 
lorem pretium sit amet felis non odio. Nam non nulla.}
\begin{tikzpicture}
\node [transparent, align=justify, text width=10cm] (text) {\longText};
\clip ($(text.south west) + (0,6pt)$) rectangle ($(text.north east) - (0,6pt)$);
\draw (text) node [align=justify, text width=10cm] {\longText};
\end{tikzpicture}
\end{document}

答案3

一种方法是通过 存储节点的边界save path,然后use path在稍后使用。一个例子:在已知 3 条边的情况下构造三角形 ( ABC) 时的指南针效果。在这里我画了一个圆,但在node中心处裁剪了一个圆C

在此处输入图片描述

\documentclass[tikz,border=5mm]{standalone}
\usetikzlibrary{calc}
\begin{document}
\begin{tikzpicture}
\draw 
(0,0) coordinate (A) node[left]{$A$}--      
(5,0) coordinate (B) node[right]{$B$}--
(1,3.5) coordinate (C) node[above]{$C$}--cycle;

\path (C) node[circle,minimum size=2.5cm,save path=\Cvicinity]{};
\clip[use path=\Cvicinity];
\draw[red] (A) let \p1=($(A)-(C)$) in circle({veclen(\x1,\y1)});
\draw[red] (B) let \p1=($(B)-(C)$) in circle({veclen(\x1,\y1)});
\end{tikzpicture}
\end{document}

相关内容