我遇到了一个自己无法解决的问题。
以下代码生成了下面的图像,我不太喜欢。
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{matrix, arrows}
\usepackage{amssymb}
\begin{document}
\begin{center}
\begin{tikzpicture}
\matrix (m) [matrix of math nodes, row sep=0em, column sep=4em, minimum width=2em]
{ 0 & \mathbb{Z}\times\mathbb{Z} & \mathbb{Z}^2 & 0 \\
& (\alpha_0, \alpha_1) & (-\alpha_0, \alpha_1) & \\
& & \beta_{01} & 0 \\ };
\path[>=stealth, ->]
(m-1-1.east|-m-1-2) edge node [above] {\scriptsize$d_{-1}$} (m-1-2.west|-m-1-2)
(m-1-2.east|-m-1-2) edge node [above] {\scriptsize$d_{ 0}$} (m-1-3.west|-m-1-2)
(m-1-3.east|-m-1-2) edge node [above] {\scriptsize$d_{ 1}$} (m-1-4.west|-m-1-2);
\path[>=stealth, |->]
(m-2-2.east|-m-2-2) edge (m-2-3.west|-m-2-2);
\path[>=stealth, |->]
(m-3-3.east|-m-3-3) edge (m-3-4.west|-m-3-3);
\end{tikzpicture}
\end{center}
\end{document}
我想要实现的是让箭头对齐,大致如下图所示
有人能提供一些提示吗?
我更喜欢使用 tikz,但任何其他包都受欢迎。
答案1
除非您TiKZ
出于其他原因使用。无需使用它来获取您的图表。
在以下机构的帮助下“综合 LaTeX 符号列表”(对于\xrightarrow
和\xmapsto
)以及 egreg 的回答制作具有最小宽度的框(在数学模式下)(对于\minwidthbox
)可以写成:
\documentclass{article}
\usepackage{amsmath,amssymb,empheq,mathtools}
\DeclareRobustCommand{\minwidthbox}[2]{%
\ifmmode
\expandafter\mathmakebox
\else
\expandafter\makebox
\fi
[\ifdim#2<\width\width\else#2\fi]{#1}%
}
\begin{document}
\[
\begin{array}{ccccccc}
0 & \xrightarrow{\minwidthbox{d_{-1}}{3em}}
& \mathbb{Z}\times\mathbb{Z}
& \xrightarrow{\minwidthbox{d_0}{3em}}
& \mathbb{Z}^2
& \xrightarrow{\minwidthbox{d_1}{3em}}
& 0 \\
&
& (\alpha_0,\alpha_1)
& \xmapsto{\minwidthbox{}{3em}}
& (-\alpha_0,\alpha_1)
&
& \\
&
&
&
& \beta_{01} & \xmapsto{\minwidthbox{}{3em}} & 0
\end{array}
\]
\end{document}
产生
答案2
感谢@percusse 为我指明正确的方向以找到解决方案。
逐列设置样式是解决此问题的方法(尽管不如我预期的那么优雅)。
关键是修改每个列的定义以获得我想要的内容,例如
column 2/.style={nodes={text width=1.5cm, align=center}}
最终代码如下
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{matrix, arrows}
\usepackage{amssymb}
\begin{document}
\begin{center}
\begin{tikzpicture}
\matrix (m) [matrix of math nodes, row sep=0em, column sep=4em, column 2/.style={nodes={text width=1.5cm, align=center}},column 3/.style={nodes={text width=1.5cm, align=center}}]
{ 0 & \mathbb{Z}\times\mathbb{Z} & \mathbb{Z}^2 & 0\\
& (\alpha_0, \alpha_1) & (-\alpha_0, \alpha_1) & \\
& & \beta_{01} & 0\\ };
\path[>=stealth, ->]
(m-1-1.east|-m-1-2) edge node [above] {\scriptsize$d_{-1}$} (m-1-2.west|-m-1-2)
(m-1-2.east|-m-1-2) edge node [above] {\scriptsize$d_{ 0}$} (m-1-3.west|-m-1-2)
(m-1-3.east|-m-1-2) edge node [above] {\scriptsize$d_{ 1}$} (m-1-4.west|-m-1-2);
\path[>=stealth, |->]
(m-2-2.east|-m-2-2) edge (m-2-3.west|-m-2-2);
\path[>=stealth, |->]
(m-3-3.east|-m-3-3) edge (m-3-4.west|-m-3-3);
\end{tikzpicture}
\end{center}
\end{document}
答案3
您还可以定义\Arrow
固定宽度和可变样式的命令,并让其\matrix
管理对齐方式和列宽,而不必手动执行:
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{matrix, arrows}
\usepackage{amssymb}
\newcommand{\Arrow}[2][->]{%
\tikz[baseline=-0.7ex, x=2cm, #1]
\path (0,0) edge node [above] {\scriptsize#2} (1,0);
}
\begin{document}
\begin{center}
\begin{tikzpicture}
\matrix (m) [matrix of math nodes, row sep=0em]
{ 0 & \Arrow{$d_{-1}$} & \mathbb{Z}\times\mathbb{Z} & \Arrow{$d_{0}$} & \mathbb{Z}^2 & \Arrow{$d_{1}$} & 0 \\
& & (\alpha_0, \alpha_1) & \Arrow[|->]{} & (-\alpha_0, \alpha_1) & & \\
& & & & \beta_{01} & \Arrow[|->]{} & 0 \\ };
\end{tikzpicture}
\end{center}
\end{document}
结果: