微量元素

微量元素

我試著在 中畫一個「表格」tikz,更一般地說,是為了解決這個問題,以便很容易寫出很多表格。

matrix庫使放置對齊節點變得更加容易。下一步是能夠繪製垂直和水平線。

我嘗試了幾種方法(其中一些“只是為了確定”):

  • 使用節點錨點,例如在答案中描述的這個問題(如果節點的高度或寬度可變,則不起作用,請參見下面的藍線和紅線)
  • 使用列或行的節點,使用fit答案中描述的庫這個問題(比以前更好,請參閱橘色線,但如果行(或列)不像矩陣那麼寬(或高),仍然存在一些問題[參見綠線]。

值得注意的是,可以繪製水平線\hline(但缺乏 tikz 路徑的可自訂性)。

那麼問題來了:如何以一致的方式繪製這種線條?

編輯(第一個答案後的更多資訊)

據我所知,可以透過指定每個單元格的高度、深度和寬度來強制錨點對齊。然而,這不正是pgf繪製矩陣時所做的嗎?

因此,問題的重點是(如果可能的話)存取此資訊(矩陣邊界框的交點位置,以及行和列之間的區域的限制),由 計算得出pgf,在繪製矩陣。

微量元素:

\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 width和強制矩陣中的所有節點具有相同的大小text depth。然後進行調整column seprow sep使節點更加緊湊。

微量元素

\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}

輸出

在此輸入影像描述

相關內容