특정 크기의 노드 그리드를 그리려고 합니다. 또한 셀, 특히 셀 내부 테두리를 흰색으로 만들어 이 그리드에 구멍을 뚫습니다. 이를 구체적으로 만들려면 다음을 고려하세요.
\documentclass[tikz]{standalone}
\usetikzlibrary{fit, matrix}
\begin{document}
\begin{tikzpicture}
\matrix [
matrix of nodes,
inner sep=0pt, % no padding around the cells
row sep=-\pgflinewidth,
column sep=-\pgflinewidth,
nodes={
rectangle, draw=black, minimum height=11mm, minimum width=11mm,
anchor=center, inner sep=0pt, outer sep=0pt
},
nodes in empty cells,
name=table
] {
& & & & \\
& & |[white]| & & \\
& |[white]| & |[white]| & & \\
& & |[white]| & |[white]| & \\
& & & & \\
};
\end{tikzpicture}
\end{document}
일반적으로 매트릭스에 임의의 백혈구 "섬"이 있다고 가정합니다. 이 경우에는 섬(크기 5)이 하나만 있습니다. 즉, 흰색 셀이 호스트 그리드의 연결된 하위 그래프에 걸쳐 있지만 이러한 섬이 여러 개 있을 수 있습니다.
내부 테두리는 그려지지 않기를 원하지만 외부 테두리는 그대로 두어야 합니다. 그대로, 바깥쪽 테두리는 가장자리만 보이도록 그려져 회색 빛을 띠게 됩니다. 원하지 않는 출력은 아래를 참조하세요.
노드와 해당 가장자리가 그려지는 방식을 어떻게 더 잘 제어할 수 있습니까? 나도 본다이 질문이는 더 좋은 방법으로 그리는 데 도움이 될 수 있습니다. 프로그래밍 방식으로 이 작업을 수행하므로 목록과 같은 방식으로 섬 좌표를 지정할 수 있는 것이 좋을 것 같습니다.
답변1
흰색 테두리를 그리는 대신 테두리를 그리지 마세요. 이렇게 하면 회색 선(실제로는 검정색 위에 흰색이 있음)이 나타나지 않습니다.
아래 코드에서는 matrix of grid nodes = <rows> x <columns>
각 셀에 포함된 행과 열의 지정된 수를 사용하여 TikZ 행렬을 설정합니다 \node{};
. 기본적으로 이러한 각 노드는grid node
.
키를 사용하면 대신 a를 사용해야 하는 island(s)
셀을 지정할 수 있습니다. grid island node
A grid island node
는 단순히 path only
(예: draw = none, fill = node, …
) 무엇이든 될 수 있습니다. 어쩌면 단지 좌표일 수도 있습니다(그러나 이를 위해서는 row sep
또는 를 수행해야 합니다).column sep
between origins
않으면 전체 행이나 열에 섬이 포함된 경우 크기가 0인 행이나 열을 얻게 됩니다.
대신에 우리는 각 셀에 \node{};
배치할 수 있습니다 .\tikzgridnode
\node[grid node]{};
섬인 경우 셀에 아무것도 넣을 수 없습니다(좌표도 아님).
암호
\documentclass[tikz]{standalone}
\makeatletter
\newcommand*\utilrepeat[2]{%
\ifnum#1=1 \expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi
{#2}{#2\expandafter\utilrepeat\expandafter{\the\numexpr#1-1\relax}{#2}}}
\makeatother
\tikzset{
grid node/.style={
shape=rectangle, draw=black, fill=lightgray, anchor=center,
minimum size=+11mm, inner sep=+0pt, outer sep=+0pt},
% grid island node/.style={shape=coordinate}, % no node, just a coordinate
grid island node/.style=path only, % node but no output
tight matrices/.style={every outer matrix/.append style={inner sep=+0pt}},
matrix of grid nodes/.style args={#1x#2}{
matrix, tight matrices, nodes=grid node,
row sep=+-\pgflinewidth, column sep=+-\pgflinewidth,
execute at empty cell=\node{};,
node contents=%
\utilrepeat{#1}{%
\utilrepeat{\pgfinteval{#2-1}}{\pgfmatrixnextcell}\pgfmatrixendrow}},
island/.style args={#1-#2}{
row #1 column #2/.append style={nodes=grid island node}},
islands/.style={island/.list={#1}}}
\begin{document}
\tikz\node[matrix of grid nodes = 5 x 5, islands = {2-3, 3-2, 3-3, 4-3, 4-4}];
\end{document}
산출
답변2
테두리 없이 셀 스타일을 정의하여 간단하고 다소 무례한 솔루션을 만들 수 있습니다.
\documentclass[border=6pt]{standalone}
\usepackage{tikz}
\usetikzlibrary{matrix}
\begin{document}
\begin{tikzpicture}
\newcommand\nx{|[draw=none]|}
\matrix (m) [matrix of nodes,
row sep=-\pgflinewidth,
column sep=-\pgflinewidth,
nodes = {draw,
minimum size=11mm, anchor=center,
inner sep=0pt, outer sep=0pt}
]
{
a & b & c & d & e\\
f & g & \nx
h & i & j\\
k & \nx l
& \nx m
& n & o\\
p & q & \nx r
& \nx s
& t\\
u & v & w & x & y\\
};
\end{tikzpicture}
\end{document}
답변3
아래 명령은 \islands
3개의 인수를 사용합니다. 첫 번째 인수는 행 수, 두 번째 인수는 열 수, 세 번째 인수는 형식의 셀 목록입니다.(<row>,<column>)
.
이 명령은 수평선과 수직선을 그립니다. 세 번째 인수의 목록에 위와 아래의 셀이 포함되어 있으면 수평선이 그려지지 않습니다. 수직선도 마찬가지입니다.
\documentclass[border=6pt]{standalone}
\usepackage{tikz}
\usetikzlibrary{matrix}
\ExplSyntaxOn
\cs_generate_variant:Nn \str_if_in:nnT { neT }
\bool_new:N \l__islands_bool
\NewDocumentCommand { \islands } { mmm }
% #1 number of rows
% #2 number of columns
% #3 list of cells in the form (<row>,<column>)
{
\begin { scope }
[
shift = { ( mymatrix-1-1.north~west ) } ,
x = 11 mm ,
y = -11 mm
]
\int_step_inline:nnn { 0 } {#1}
{
\int_step_inline:nn {#2}
{
\bool_set_true:N \l__islands_bool
\str_if_in:neT {#3} { ( ##1 , ####1 ) }
{
\str_if_in:neT {#3} { ( \int_eval:n { ##1 + 1 } , ####1 ) }
{
\bool_set_false:N \l__islands_bool
}
}
\bool_if:NT \l__islands_bool
{ \draw ( { ####1 - 1 } , ##1 ) --++ ( 1 , 0 ) ; }
}
}
\int_step_inline:nnn { 0 } {#2}
{
\int_step_inline:nn {#1}
{
\bool_set_true:N \l__islands_bool
\str_if_in:neT {#3} { ( ####1 , ##1 ) }
{
\str_if_in:neT {#3} { ( ####1 , \int_eval:n { ##1 + 1 } ) }
{
\bool_set_false:N \l__islands_bool
}
}
\bool_if:NT \l__islands_bool
{ \draw ( ##1 , { ####1 - 1 } ) --++ ( 0 , 1 ) ; }
}
}
\end { scope }
}
\ExplSyntaxOff
\begin{document}
\begin{tikzpicture}
\matrix (mymatrix) [
matrix of nodes,
inner sep=0pt,
row sep=-\pgflinewidth,
column sep=-\pgflinewidth,
nodes={
rectangle,
minimum height=11mm,
minimum width=11mm,
anchor=center,
inner sep=0pt,
outer sep=0pt
}
]
{
a & b & c & d & e\\
f & g & h & i & j\\
k & l & m & n & o\\
p & q & r & s & t\\
u & v & w & x & y\\
};
\islands{5}{5}{(2,3),(3,2),(3,3),(4,3),(4,4)}
\end{tikzpicture}
\end{document}