MWE

MWE

tikz나는 많은 것을 쉽게 작성할 수 있도록 에 "표"를 그리려고 노력하고 있으며 더 일반적으로는 그것을 해결하려고 노력하고 있습니다 .

라이브러리 matrix를 사용하면 정렬된 노드를 배치하는 것이 훨씬 쉬워집니다. 다음 단계는 수직선과 수평선을 그릴 수 있게 되는 것입니다.

나는 여러 가지 접근 방식을 시도했습니다(그 중 일부는 "확실히 하기 위해").

  • 예를 들어 다음에 대한 답변에 설명된 대로 노드 앵커를 사용합니다.이 질문(노드의 높이나 너비가 가변적이면 작동하지 않습니다. 아래 파란색 및 빨간색 선을 참조하세요.)
  • 열이나 행에 노드를 사용하고, fit답변에 설명된 대로 라이브러리를 사용합니다.이 질문(이전 것보다 낫습니다. 주황색 ​​선을 참조하세요. 그러나 행(resp 열)이 행렬만큼 넓지 않은 경우(resp 높음)[녹색 선 참조] 여전히 몇 가지 문제가 있습니다.

수평선을 그릴 수 있다는 점은 주목할 가치가 있습니다 \hline(그러나 tikz 경로의 사용자 정의 기능은 부족합니다).

그렇다면 질문은: 어떻게 이런 종류의 선을 일관된 방식으로 그릴 수 있을까요?

편집 (첫 번째 답변 이후 추가 정보)

각 셀의 높이, 깊이, 너비를 지정하여 앵커를 강제로 정렬할 수 있다는 것을 이해합니다. 그러나 pgf행렬을 그릴 때 정확히 그랬던 것이 아닌가요 ?

pgf따라서 질문의 요점은 (가능한 경우) 에 의해 계산된 대로 이 정보(행렬의 경계 상자 교차 위치 및 행과 열 사이의 영역 제한)에 액세스하는 것입니다. 매트릭스가 그려집니다.

MWE:

\documentclass{standalone}

\usepackage{tikz}
\usetikzlibrary{matrix,fit}

\begin{document}

\begin{tikzpicture}%[every node/.style={draw=black!30}]
  \node[%
  matrix of nodes,%
  every node/.append style={%
    inner xsep=5pt,
    inner ysep=5pt,
    outer sep=0pt
  },
  row sep=0pt,
  column sep=0pt
  ] (M) {
    {} & 1 & 2 \\
    1 & 1 & 2 \\
    2 & 2 & 4 \\
    3 & 3 & 6 \\
    1000000 & 1000000 & 2000000 \\
  };
  \draw[red] (M-1-2.north west) -- (M-5-1.south east);
  \draw[blue] (M-1-1.north east) -- (M-5-1.south east);

  \node[fit=(M-1-3) (M-5-3),inner sep=0pt] (C3) {};
  \draw[orange!80!black] (C3.north west) -- (C3.south west);

  \node[fit=(M-2-1) (M-2-3),inner sep=0pt] (R2) {};
  \draw[green!50!black] (R2.north west) -- (R2.north east);
\end{tikzpicture}

\end{document}

산출:

여기에 이미지 설명을 입력하세요

셀 테두리가 있는 출력:

여기에 이미지 설명을 입력하세요

관련 질문:

답변1

모든 노드가 열의 수평 중앙에 위치하므로 calc라이브러리를 로드하고 사용할 수 있습니다.

\draw[blue]({$(M-1-1)!.5!(M-1-2)$} |- M.north) -- ({$(M-1-1)!.5!(M-1-2)$} |- M.south);

첫 번째 열과 두 번째 열 사이에 파란색 선을 그립니다.

녹색 선을 얻으려면 사용해야합니다모두옵션 내부 두 번째 행의 노드 fit:

\node[fit=(M-2-1) (M-2-2) (M-2-3),inner sep=0pt] (R2) {};
\draw[green!50!black] (R2.north -| M.west) -- (R2.north -| M.east);

여기에 이미지 설명을 입력하세요

\documentclass[tikz,margin=10pt]{standalone}
\usetikzlibrary{matrix,fit,calc}

\begin{document}
\begin{tikzpicture}%
  \node[%
  matrix of nodes,%
  inner xsep=0pt,% <- code added
  every node/.append style={%
    draw=lightgray,
    inner xsep=5pt,
    inner ysep=5pt,
    outer sep=0pt,
  },
  row sep=0pt,
  column sep=0pt
  ] (M) {
    {}& 1 & 20 \\
    {}& 1 & {} \\
    2 & 2 & 4 \\
    3 & 3 & 6 \\
    1000000 & 1000000 & 2000000 \\
  };
% horizontal lines
  \draw[blue]({$(M-1-1)!.5!(M-1-2)$} |- M.north) -- ({$(M-1-1)!.5!(M-1-2)$} |- M.south);
  \draw[orange!80!black]({$(M-1-2)!.5!(M-1-3)$} |- M.north) --({$(M-1-2)!.5!(M-1-3)$} |- M.south);
% vertical lines
    \node[fit=(M-2-1) (M-2-2) (M-2-3),inner sep=0pt] (R2) {};
    \draw[green!50!black] (R2.north -| M.west) -- (R2.north -| M.east);
\end{tikzpicture}
\end{document}

매크로를 정의하는 것이 가능합니다:

\documentclass[tikz,margin=10pt]{standalone}
\usetikzlibrary{matrix,fit,calc}

% \mvline[<style>]{<matrix name>}{<row number on the right hand side of the line>}
\newcommand\mvline[3][]{%
  \pgfmathtruncatemacro\hc{#3-1}
  \draw[#1]({$(#2-1-#3)!.5!(#2-1-\hc)$} |- #2.north) -- ({$(#2-1-#3)!.5!(#2-1-\hc)$} |- #2.south);
}
% \mhline[<style>]{<matrix name>}{<column number below of the line>}{<number of columns in a row>}
\newcommand\mhline[4][]{%
  \node[fit=(#2-#3-1),inner sep=0pt,outer sep=0pt](R){};
  \foreach \i in {1,...,#4}\node[fit=(R) (#2-#3-\i),inner sep=0pt,outer sep=0pt](R){};
  \draw[#1] (R.north -| #2.west) -- (R.north -| #2.east);
}
\begin{document}
\begin{tikzpicture}%
  \node[%
  matrix of nodes,%
  inner xsep=0pt,% <- code added
  nodes in empty cells,% <- code added, nodes also in empty cells
  every node/.append style={%
    %draw=lightgray,
    inner xsep=5pt,
    inner ysep=5pt,
    outer sep=0pt,
  },
  row sep=0pt,
  column sep=0pt
  ] (M) {
      & 1 & 20 \\
      &   & \huge T  \\
    2 & 2 & 4 \\
    3 & 3 & 6 \\
    1000000 & 1000000 & 2000000 \\
  };
% border of the table
    \draw[purple](M.south west) rectangle (M.north east);
% horizontal lines
    \mvline[blue]{M}{2}
    \mvline[orange]{M}{3}
% vertical lines
    \foreach \r in {2,...,5} {\mhline[green!50!black]{M}{\r}{3}}
\end{tikzpicture}
\end{document}

여기에 이미지 설명을 입력하세요

답변2

, 및 를 사용 하여 행렬의 모든 노드가 동일한 크기를 갖도록 강제할 수 있습니다 text height. 그런 다음 노드가 더 작아지도록 및 를 조정합니다 .text widthtext depthcolumn seprow sep

MWE

\documentclass{standalone}

\usepackage{tikz}
\usetikzlibrary{matrix,fit}
\usepackage{calc}

\begin{document}

\begin{tikzpicture}%[every node/.style={draw=black!30}]
  \node[%
  matrix of nodes,%
  every node/.append style={%
    inner xsep=5pt,
    inner ysep=5pt, 
    draw=lightgray, % just to show node borders
    text height=\heightof{0},
    text width=\widthof{2000000},
    align=center
  },
  row sep=-\pgflinewidth,
  column sep=-.5\pgflinewidth,
  ] (M) {
    {} & 1 & 2 \\
    1 & 1 & 2 \\
    2 & 2 & 4 \\
    3 & 3 & 6 \\
    1000000 & 1000000 & 2000000 \\
  };
  \draw[red] (M-1-2.north west) -- (M-5-1.south east);
  \draw[blue] (M-1-1.north east) -- (M-5-1.south east);

  % \node[fit=(M-1-3) (M-5-3),inner sep=0pt] (C3) {};
  \draw[orange!80!black] (M-1-3.north west) -- (M-5-3.south west);

  % \node[fit=(M-2-1) (M-2-3),inner sep=0pt] (R2) {};
  \draw[green!50!black] (M-2-1.north west) -- (M-2-3.north east);
\end{tikzpicture}

\end{document}

산출

여기에 이미지 설명을 입력하세요

관련 정보