
Этот код помещает английский алфавит от a до y в квадрат 5 на 5, а затем удаляет s в (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
к узлу, как в первом примере.