如何在 tikz 中的矩阵节点内插入 \vline

如何在 tikz 中的矩阵节点内插入 \vline

我必须在一个矩形内绘制许多节点,并用一条线将第一个节点与后面的节点分开。如果我垂直执行此操作,它似乎可以工作:我使用矩阵节点作为外矩形,并在内部绘制节点,并用 \hline 将它们分开

\begin{tikzpicture}
\node[draw, inner sep = 1pt, rectangle,matrix,ampersand replacement=\&] (A)
     {\node[inner sep=2pt] (a) {a }; \\ \hline \\ \node {$d_1$};\\ \node {$\vdots$};\\ \node{$d_n$};\\};
\end{tikzpicture}

但是,当我尝试水平执行同样的事情时, \vline 不会显示:

\begin{tikzpicture}
\node[draw, inner sep = 1pt, rectangle,matrix,ampersand replacement=\&] (A)
     {\node[inner sep=2pt] (a) {a}; \& \vline \& \node {$d_1$};\& \node {$\dots$};\& \node{$d_n$};\\};
\end{tikzpicture}

在此处输入图片描述

知道为什么吗?

最小工作示例:

\documentclass{beamer}
\usepackage{tikz}

\begin{document}

\frame{
\begin{tikzpicture}
\node[draw, inner sep = 1pt, rectangle,matrix,ampersand replacement=\&] 
    (A) {\node[inner sep= 2pt] (a) {a }; \\ \hline \\ \node {$d_1$};\\ \node {$\vdots$};\\ \node{$d_n$};\\};
\end{tikzpicture}
\bigskip


\begin{tikzpicture}
\node[draw, inner sep = 1pt, rectangle,matrix,ampersand replacement=\&] (A)
     {\node[inner sep=2pt] (a) {a}; \& \vline \& \node {$d_1$};\& \node {$\dots$};\& \node{$d_n$};\\};
\end{tikzpicture}
}

\end{document}

答案1

以下示例以三种方式设置垂直线:

  • 放置一个虚拟节点以节省一些空间并获取水平位置。然后dn为垂直位置命名最大的元素。之后绘制一条线。

  • inner sep当在底部和顶部添加时,该线可以延伸至框架。

  • 该线只是简单地画成数学符号|

完整示例:

\documentclass{article}
\usepackage{tikz}

\begin{document}
  \begin{tikzpicture}
    \node[
      draw,
      inner sep = 1pt,
      rectangle,
      matrix,
      ampersand replacement=\&,
    ] (A) {%
      \node[inner sep=2pt] (a) {a }; \\
      \hline \\
      \node {$d_1$};\\
      \node[rotate=90, inner sep=2pt] {$\dots$};\\
      \node{$d_n$};\\
    };
  \end{tikzpicture}

  \begin{tikzpicture}
    \node[
      draw,
      inner sep = 1pt,
      rectangle,
      matrix,
      anchor=base,
      ampersand replacement=\&,
    ] (A) {%
      \node (a) {a}; \&
      \node (vline) {}; \&
      \node {$d_1$};\&
      \node {$\dots$};\&
      \node (dn) {$d_n$};\\
    };
    \draw (vline |- dn.south) -- (vline |- dn.north);
  \end{tikzpicture}

  \begin{tikzpicture}
    \node[
      draw,
      inner sep = 1pt,
      rectangle,
      matrix,
      anchor=base,
      ampersand replacement=\&,
    ] (A) {%
      \node (a) {a}; \&
      \node[inner sep=0pt] {$|$}; \&
      \node {$d_1$};\&
      \node {$\cdots$};\&
      \node {$d_n$};\\
    };
  \end{tikzpicture}
\end{document}

结果

提示:

  • 节点垂直居中,因此与下标的a基线不同d。可以通过添加anchor=base到矩阵选项来修复此问题。

  • a在数学中没有设置为,这是正确的吗d

  • \vdots在垂直方向上不对称。因此,示例用旋转的 代替了它们\dots

  • 最新版本使用\cdots,表示点不应该位于基线上。

TikZ 库matrix

TikZ 库matrix提供了 key matrix of nodes,它允许更紧凑地表示矩阵。示例使用了\midrulebooktabs,因为它在行周围添加了一些空间。

\documentclass{article}
\usepackage{booktabs}
\usepackage{tikz}
\usetikzlibrary{calc}
\usetikzlibrary{matrix}

\begin{document}
  \begin{tikzpicture}
    \matrix[
      matrix of nodes,
      draw,
      inner sep=1pt,
      ampersand replacement=\&,
    ] {
      a \\
      \midrule
      $d_1$ \\
      |[rotate=90, inner sep=2pt]| $\dots$ \\
      $d_n$ \\
    };
  \end{tikzpicture}

  \begin{tikzpicture}
    \matrix[
      matrix of nodes,
      draw,
      inner sep=1pt,
      ampersand replacement=\&,
    ] {
      a \&
      |[inner sep=0pt]| $|$ \&
      $d_1$ \&
      $\dots$ \&
      $d_n$ \\
    };
  \end{tikzpicture}
\end{document}

节点结果矩阵

或者两者都画线:

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{calc}
\usetikzlibrary{matrix}

\begin{document}
  \begin{tikzpicture}
    \matrix (tmp) [
      matrix of nodes,
      draw,
      inner sep=1pt,
      ampersand replacement=\&,
    ] {
      a \\[4pt]
      $d_1$ \\
      |[rotate=90, inner sep=2pt]| $\dots$ \\
      $d_n$ \\
    };
    \draw
      ($(tmp.west |- tmp-1-1.south) + (1pt, -2pt)$) --
      ($(tmp.east |- tmp-1-1.south) + (-1pt, -2pt)$)
    ;
  \end{tikzpicture}

  \begin{tikzpicture}
    \matrix (tmp) [
      matrix of nodes,
      draw,
      inner sep=1pt,
      ampersand replacement=\&,
    ] {
      a \&
      |[inner sep=0pt]| \kern2pt \&
      $d_1$ \&
      $\dots$ \&
      $d_n$ \\
    };
    \draw
      ($(tmp-1-2 |- tmp.south) + (0pt, 1pt)$) --
      ($(tmp-1-2 |- tmp.north) + (0pt, -1pt)$)
    ;
  \end{tikzpicture}
\end{document}

结果

答案2

你的意思是这样的吗:

在此处输入图片描述

或者你更喜欢那条线与节点的边界保持一致?上面的图片是由

\documentclass[border=3mm,
               tikz,
               prewiev]{standalone}
\usetikzlibrary{matrix}
    \begin{document}
\begin{tikzpicture}
\node[draw,inner sep = 1pt,rectangle, matrix, ampersand replacement=\&] (A)
     {\node[inner sep=2pt] (a) {a}; 
      \& \& \node {$d_1$};
      \& \node {$\dots$};
      \& \node{$d_n$};\\};
\draw (a.north east) -- (a.south east);% <--- this is new
\end{tikzpicture}
    \end{document}

编辑: 另一种更简单(在我看来)的解决方案可以通过以下代码实现:

\documentclass[border=3mm,
               tikz,many,
               prewiev]{standalone}
\usetikzlibrary{matrix}

    \begin{document}
\begin{tikzpicture}
\matrix[draw,inner sep=1pt,matrix of math nodes] (m) 
        {
a & d_1 & \dots & d_n\\
        };
\draw (m-1-2.north west) -- (m-1-2.south west);
\end{tikzpicture}
    \end{document}

它给出了与上图类似但稍微好一点的结果。

相关内容