我必须在一个矩形内绘制许多节点,并用一条线将第一个节点与后面的节点分开。如果我垂直执行此操作,它似乎可以工作:我使用矩阵节点作为外矩形,并在内部绘制节点,并用 \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
,它允许更紧凑地表示矩阵。示例使用了\midrule
包booktabs
,因为它在行周围添加了一些空间。
\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}
它给出了与上图类似但稍微好一点的结果。