Tikz 矩阵箭头对齐

Tikz 矩阵箭头对齐

我遇到了一个自己无法解决的问题。

以下代码生成了下面的图像,我不太喜欢。

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

结果:

编译结果

相关内容