如何使用 Tikz 找到多个节点中最宽的节点

如何使用 Tikz 找到多个节点中最宽的节点

我有几个节点,我需要找出哪个节点最宽。

此示例从最宽节点的中心画出一条垂直线,但我知道选择哪个节点。

\documentclass[12pt,a4paper]{article}
\usepackage{tikz}

\begin{document}
\begin{tikzpicture}
    \foreach \name[count = \n] in {peter, wellingon, john, william}{
        \node[draw, anchor = west] at (0, -\n) (name-\n) {\name};
    }
    \draw let \p1 = (name-1.center) in (\x1, 0) -- (\x1, -5);
\end{tikzpicture}
\end{document}

我可以自动做出这个选择吗?我找不到获取坐标并将其存储在全局宏中以供以后使用的方法。let据我所知,该运算符可以轻松访问坐标,但仅限于路径内。

在此处输入图片描述

答案1

编辑:

您可以将所有内容放入其中,从而将所有内容装箱scope。添加local bounding box选项允许您命名它并将其用作常规节点。

\documentclass[12pt,a4paper]{article}
\usepackage{tikz}

\begin{document}
\begin{tikzpicture}
\begin{scope}[local bounding box=foo]
    \foreach \name[count = \n] in {peter, wellingon, john, william}{
        \node[draw, anchor = west] at (0, -\n) (name-\n) {\name};
    }
\end{scope}

\draw ([yshift=20pt]foo.north) -- ([yshift=-20pt]foo.south);

\end{tikzpicture}
\end{document}

谢谢@sgmoye对于此言论。


原始帖子:

可以使用库来解决问题fit,以便您能够创建一个具有最大节点边长的幻影框(节点)。

\documentclass[12pt,a4paper]{article}
\usepackage{tikz}
\usetikzlibrary{fit}

\begin{document}
\begin{tikzpicture}
\begin{scope}[local bounding box=foo]
    \foreach \name[count = \n] in {peter, wellingon, john, william}{
        \node[draw, anchor = west] at (0, -\n) (name-\n) {\name};
    }
\end{scope}

\node[fit=(foo),inner sep=0pt](bar){};

\draw[shorten >=-20pt,shorten <=-20pt] (bar.south) -- (bar.north);
\end{tikzpicture}
\end{document}

在此处输入图片描述

答案2

@antshar 的回答无疑是最好的方法。但是,你确实问了如何找到最长的节点,这确实回答了这个问题。这是一个远不那么优雅的解决方案并不推荐。我仅提供参考。此代码的来源可以在这里找到矩阵中两列分别着色尽管在很多地方都可以找到类似的变体。输出是相同的。

\documentclass[12pt,a4paper]{article}
\usepackage{tikz}

\newlength{\tempx}
\newlength{\longest}

\begin{document}

\begin{tikzpicture}
    \foreach \name[count = \n] in {peter, wellingon, john, william}{%
        \node[draw, anchor = west] at (0, -\n) (name-\n) {\name};
        \pgfextractx{\tempx}
            {\pgfpointdiff{\pgfpointanchor{name-\n}{west}}{\pgfpointanchor{name-\n}{east}}}
            \ifdim\tempx>\longest \global\longest=\tempx\fi%% foreach is *local*
    }%
    \draw ([xshift=\longest/2,yshift=-20pt]current bounding box.south west) --
        ([xshift=\longest/2,yshift=20pt]current bounding box.north west);
\end{tikzpicture}

\end{document}

在此处输入图片描述

相关内容