TikZ:重新定义/更新节点标签

TikZ:重新定义/更新节点标签

我需要绘制许多节点,这些节点的标签可以根据它们的索引计算出来。但是,其中一小部分不符合规则,因此我需要手动分配它们的标签。我能以某种方式做到这一点吗?

梅威瑟:

\documentclass[tikz,border=3.14mm]{standalone}
\usepackage{amssymb}
\begin{document}
\begin{tikzpicture}
    \foreach \i in {1,...,30}
    {
        \node at (\i,0) [rectangle,label=above:\i] (v\i) {$i$};
    }
    % here I want to make the label of node v7 to become $\varnothing$
\end{tikzpicture}
\end{document}

注意:这与动画无关,我只是想循环创建节点,然后更改其中一些节点的标签。

UPD:我纠正了 MWE,因为原来的 MWE 并不完全是我所暗示的。

答案1

为此,您可以使用\node alsopgfmanual 第 250 页中描述的方法。

\documentclass[tikz,border=3.14mm]{standalone}
\usepackage{amssymb}
\begin{document}
\begin{tikzpicture}
    \foreach \i in {1,...,10}
    {
        \node at (\i,0) [rectangle,label={above:$ \i $}] (v\i) {$i$};
    }
    \foreach \i in {3,6,8}{
        \node also [label={[fill=white]above:$ \varnothing $}] (v\i);
    }
\end{tikzpicture}
\end{document}

在此处输入图片描述

非常感谢 MAX进行编辑。

以防万一您有更宽的标签:为标签命名并使用它们的宽度来进行 Max 的fill=white技巧。

\documentclass[tikz,border=3.14mm]{standalone}
\usetikzlibrary{calc}
\usepackage{amssymb}
\begin{document}
\begin{tikzpicture}
    \foreach \i in {1,2,...,10}
    {
        \node at (\i,0) [rectangle,label={[name=lab\i]above:$\i\i$}] (v\i) {$i$};
    }
    \foreach \i in {3,6,10}{
        \path let \p1=($(lab\i.north east)-(lab\i.south west)$) in node also 
        [label={[fill=white,minimum width=\x1,minimum height=\y1]above:$ \varnothing $}] (v\i);
    }
\end{tikzpicture}
\end{document}

附录:只是出于好奇,我想知道是否有一种简单的方法可以Max 的精彩回答处理列表。我相信有,并让其他人使用一些xparse或其他魔法。在这里我只想报告一个命运的讽刺。如果一个人追求内置 LaTeX 检查某物是否是列表的元素,那么我的天真尝试就失败了两位数,恰恰是上面最简单的版本也开始出错的地方。我想说,这相当有趣和讽刺。;-)

\documentclass[tikz]{standalone}
\makeatletter
% https://tex.stackexchange.com/a/260921/121799 and https://tex.stackexchange.com/a/287094/121799
\newcommand\ifmember[2]{% 
\in@{#1}{#2}%
\ifin@
\expandafter\@firstoftwo
\else
\expandafter\@secondoftwo
\fi
}
\makeatother
\usepackage{amssymb}

\begin{document}

\begin{tikzpicture}
    \foreach \i in {1,...,10}
    {   
        \edef\temp{\noexpand\ifmember{\i}{3,6,9}{\varnothing}{\i}}
        \node at (\i,0) [rectangle,label=above:$\temp$] (v\i) {$ i $};
    }
\end{tikzpicture}
\end{document}

答案2

您可以在\foreach循环内使用条件:

\documentclass[tikz]{standalone}

\usepackage{amssymb}

\begin{document}
\begin{tikzpicture}
    \foreach \i in {1,...,10}
    {
        \ifnum\i=7
            \node at (\i,0) [rectangle,label=above:$ \varnothing $] (v\i) {$ i $};
        \else
            \node at (\i,0) [rectangle,label=above:$ \i $] (v\i) {$ i $};
        \fi
    }
    % here I want to make the label of node v7 to become $\varnothing$
\end{tikzpicture}
\end{document}

在此处输入图片描述

\pgfmathparse如果有更多应该不同的标签,则使用以下方法检查条件会使代码更具可读性:

\documentclass[tikz,border=3.14mm]{standalone}
\usepackage{amssymb}
\begin{document}
\begin{tikzpicture}
    \foreach \i in {1,2,...,10}
    {
        \pgfmathparse{
            ifthenelse(\i==3,
                "varnothing",
                ifthenelse(\i==7,
                    "varnothing",
                    ifthenelse(\i==10,
                        "varnothing",
                        "i"
                    )
                )
            )
        }
        \def\myLabel{\csname\pgfmathresult\endcsname}
        \node at (\i,0) [rectangle,label={above:$ \myLabel $}] (v\i) {$i$};
    }
\end{tikzpicture}
\end{document}

在此处输入图片描述

相关内容