Tikz 행렬에서 노드 가장자리 그리기 제어

Tikz 행렬에서 노드 가장자리 그리기 제어

특정 크기의 노드 그리드를 그리려고 합니다. 또한 셀, 특히 셀 내부 테두리를 흰색으로 만들어 이 그리드에 구멍을 뚫습니다. 이를 구체적으로 만들려면 다음을 고려하세요.

\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 nodeA grid island node는 단순히 path only(예: draw = none, fill = node, …) 무엇이든 될 수 있습니다. 어쩌면 단지 좌표일 수도 있습니다(그러나 이를 위해서는 row sep또는 를 수행해야 합니다).column sepbetween 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

아래 명령은 \islands3개의 인수를 사용합니다. 첫 번째 인수는 행 수, 두 번째 인수는 열 수, 세 번째 인수는 형식의 셀 목록입니다.(<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}

관련 정보