![如何删除 tikz 节点?](https://linux22.com/image/455838/%E5%A6%82%E4%BD%95%E5%88%A0%E9%99%A4%20tikz%20%E8%8A%82%E7%82%B9%EF%BC%9F.png)
此代码将英文字母从 a 到 y 放在一个 5 x 5 的正方形中,然后通过在 (3,3) 中放置一个白色正方形来将其从视图中移除。有没有办法正确地删除节点而不是用其他对象覆盖它?
\documentclass{article}
\usepackage{tikz}
\usepackage{alphalph}
\begin{document}
\begin{tikzpicture}
\foreach \i in {0,...,4}
\foreach \j in {0,...,4}
\node at (\i,\j) {$\alphalph{5*\j+\i+1}$};
\fill[color=white] (2.5,2.5) rectangle (3.5,3.5);
\end{tikzpicture}
\end{document}
答案1
请尝试以下操作:
\documentclass[margin=3mm]{standalone}
\usepackage{tikz}
\usepackage{alphalph}
\begin{document}
\begin{tikzpicture}
\foreach \i in {0,...,4}
\foreach \j in {0,...,4}
{
\pgfmathsetmacro{\x}{int(5*\j+\i+1)}
\ifnum\x=19
\else
\node[anchor=mid] at (\i,\j) {$\alphalph{\x}$};
\fi;
}
\end{tikzpicture}
\end{document}
编辑: 考虑了 @Andrew Stacey 关于节点样式的评论。现在字母的垂直对齐很好。
答案2
隐藏节点的最简单方法是将其转换为coordinate
(无文本和无边框的节点)。
这仍然会定义一个节点,并且仍然应用对坐标有效的所有选项(样式every coordinate
和类似label
s 或其他append after command
s 的东西)。
\documentclass[tikz]{standalone}
\begin{document}
\begin{tikzpicture}[letter s/.style=coordinate]
\foreach \l[count=\i from 0] in {a,...,y}
\node[anchor=base, letter \l/.try] at ({mod(\i,5)},{int(\i/5)}) {$\l$};
\end{tikzpicture}
\end{document}
我们还可以使用letter s
样式来禁用放置节点的样式,这样甚至不会放置坐标。
\documentclass[tikz]{standalone}
\begin{document}
\begin{tikzpicture}[
place node/.style={insert path={
node[anchor=base] at ({mod(\i,5)},{int(\i/5)}) {$\l$}}},
letter s/.style={place node/.style=}]
\foreach \l[count=\i from 0] in {a,...,y}
\path [letter \l/.try, place node];
\end{tikzpicture}
\end{document}
通过一次循环,您可以跳过18
(s
)。
\documentclass[tikz]{standalone}
\usepackage{alphalph}
\begin{document}
\begin{tikzpicture}
\foreach \i in {0,...,17,19,20,...,24}
\node[anchor=base] at ({mod(\i,5)},{int(\i/5)}) {$\alphalph{\i+1}$};
\end{tikzpicture}
\end{document}
或者没有alphalph
:
\documentclass[tikz]{standalone}
\begin{document}
\begin{tikzpicture}
\foreach \l[count=\i from 0, evaluate={\I=\i+(\i>17?1:0);}] in {a,...,r,t,u,...,y}
\node[anchor=base] at ({mod(\I,5)},{int(\I/5)}) {$\l$};
\end{tikzpicture}
\end{document}
使用一个简单的node if
键,您就可以不在路径上放置节点:
\documentclass[tikz]{standalone}
\usetikzlibrary{ext.misc}
\tikzset{node if/.style 2 args={/utils/if={#1}{insert path={node#2}}{}}}
\begin{document}
\begin{tikzpicture}
\foreach \l[count=\i from 0] in {a,...,y}
\path [node if={\i!=18}{[anchor=base] at ({mod(\i,5)},{int(\i/5)}) {$\l$}}];
\end{tikzpicture}
\end{document}
当然,/utils/if
也可以像第一个示例那样简单地用于应用coordinate
到节点。