今天在使用 Tikz 绘制简单图表时,我遇到了一个问题。下图中的水平线右侧比左侧略低。
在左侧添加下标\mathbb B
不会改变这种行为 - 也不会省略h_j
顶部的标签。
以下是该图的最小工作代码:
\documentclass{article}
\usepackage{amssymb}
\usepackage{tikz}
\usetikzlibrary{matrix}
\begin{document}
\begin{center}
\begin{tikzpicture}
\matrix (m)
[matrix of math nodes,row sep=4em,column sep=4em,minimum width=2em]
{
\mathbb B & \mathbb B_{j} \\
& \mathbb B_{i} \\
};
\path[-stealth]
(m-1-1) edge node [above] {$h_{j}$} (m-1-2)
edge node [below] {$h_{i}$} (m-2-2)
(m-1-2) edge node [right] {$h_{\mathbb B_{i}, \mathbb B_{j}}$} (m-2-2);
\end{tikzpicture}
\end{center}
\end{document}
这是一个已知问题吗?有人知道如何解决吗?
答案1
右侧\mathbb{B}_j
的 比左侧的 更深\mathbb{B}
,这就是为什么右侧的线更低。您只需\vphantom{_j}
在左侧的节点上添加 即可弥补这一点。
\documentclass[border=2pt,tikz]{standalone}
\usetikzlibrary{matrix}
\usepackage{amssymb}
\begin{document}
\begin{tikzpicture}
\matrix (m)
[matrix of math nodes,row sep=4em,column sep=4em,minimum width=2em]
{
\mathbb{B}\vphantom{_j} & \mathbb{B}_j \\
& \mathbb B_{i} \\
};
\path[-stealth]
(m-1-1) edge node [above] {$h_{j}$} (m-1-2)
edge node [below] {$h_{i}$} (m-2-2)
(m-1-2) edge node [right] {$h_{\mathbb B_{i}, \mathbb B_{j}}$} (m-2-2);
\end{tikzpicture}
\end{document}
另外用节点positioning
代替\matrix
会看起来更美观:
\documentclass[border=2pt,tikz]{standalone}
\usetikzlibrary{positioning}
\usepackage{amssymb}
\begin{document}
\begin{tikzpicture}[node distance=1.5cm]
\node (b) {$\mathbb{B}$};
\node[right=of b] (bj) {$\mathbb{B}_j$};
\node[below=of bj] (bi) {$\mathbb{B}_i$};
\path[-stealth]
(b) edge node [above] {$h_{j}$} (bj)
edge node [below] {$h_{i}$} (bi)
(bj) edge node [right] {$h_{\mathbb B_{i}, \mathbb B_{j}}$} (bi);
\end{tikzpicture}
\end{document}
答案2
我建议使用tikz-cd
:
\documentclass{article}
\usepackage{amsmath,amssymb,tikz-cd}
\begin{document}
\[
\begin{tikzcd}
\mathbb{B} \arrow[r,"h_j"] \arrow[dr,swap,"h_i"] &
\mathbb{B}_j \arrow[d,"h_{\mathbb{B}_i,\mathbb{B}_j}"]
\\
& \mathbb{B}_i
\end{tikzcd}
\]
\end{document}
答案3
正如前面提到的,问题在于节点内容的文本深度。调整此问题的一种简单方法是通过使用以下键手动指定文本深度,在每个节点中为其保留相等的空间text depth
:
\documentclass[tikz]{standalone}
\usepackage{amssymb}
\usetikzlibrary{matrix}
\begin{document}
\begin{tikzpicture}[
every node/.style={text depth=0.5pt}
]
\matrix (m)
[matrix of math nodes,row sep=4em,column sep=4em, minimum width=2em]
{
\mathbb B & \mathbb B_{j} \\
& \mathbb B_{i} \\
};
\path[-stealth]
(m-1-1) edge node [above] {$h_{j}$} (m-1-2)
edge node [below] {$h_{i}$} (m-2-2)
(m-1-2) edge node [right] {$h_{\mathbb B_{i}, \mathbb B_{j}}$} (m-2-2);
\end{tikzpicture}
\end{document}
答案4
XY图提供了另一种选择。在这种情况下,它无需特殊调整即可正确对齐。tikz-cd
在简单情况下,语法与非常相似。(虽然我认为更正确的说法是:的语法tikz-cd
与xymatrix
...非常相似)
\documentclass[margin=5mm]{standalone}
\usepackage{amssymb}
\usepackage[matrix,pdf,arrow]{xy}
\begin{document}
\begin{xymatrix}{
\mathbb{B} \ar[rd]_{h_i} \ar[r]^{h_j}
&\mathbb{B}_j \ar[d]^{h_{\mathbb{B}_i,\mathbb{B}_j}}
\\
&\mathbb{B}_i
\\}
\end{xymatrix}
\end{document}