我需要绘制许多节点,这些节点的标签可以根据它们的索引计算出来。但是,其中一小部分不符合规则,因此我需要手动分配它们的标签。我能以某种方式做到这一点吗?
梅威瑟:
\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 also
pgfmanual 第 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}