使用 tikz-cd 为交换图中的行添加标签

使用 tikz-cd 为交换图中的行添加标签

考虑一个交换图,例如

\documentclass{scrartcl}
\usepackage{mathtools, tikz-cd}
\begin{document}
    \begin{equation}
        \begin{tikzcd}
            0 \rar & A \dar \rar & B \dar \rar & C \dar \rar & 0 &[3em] \text{(\textit{i})}\\
            0 \rar & A' \rar & B' \rar & C' \rar & 0 & \text{(\textit{ii})}
        \end{tikzcd}
    \end{equation}
\end{document}

在此处输入图片描述

如您所见,我想向图表的行添加标签。现在,您会同意这个解决方案相当丑陋。是否可以向出现在边缘的行添加标签;也就是说,我希望得到的不是您看到的内容,例如, 在此处输入图片描述 我使用

\documentclass{scrartcl}
\usepackage{mathtools, amsmath, tikz-cd}
\tikzset{every picture/.append style={remember picture}}
\begin{document}
    \begin{gather}
        \begin{tikzcd}[ampersand replacement=\&]
            0 \rar \& |[alias=A]|  A \rar \& B \rar \& C \rar \& 0
        \end{tikzcd}\\
        \begin{tikzcd}[ampersand replacement=\&]
            0 \rar \& A' \ar[from=A] \rar \& B' \rar \& C' \rar \& 0 
        \end{tikzcd}
    \end{gather}
\end{document}

这当然不是可行的办法,因为它不是特别稳定,并且单元格的正确排列(我在这里太懒了)会变得一团糟。

答案1

对于这种图表,您实际上不需要 tikz-cd。这里有一种方法可以使用alignat\rotatebox

无关:您不必amsmath在加载时加载mathtools,因为后者会为您完成此项工作。

\documentclass{scrartcl}
\usepackage{mathtools}

\begin{document}

    \begin{alignat}{4}
            0 \xrightarrow{\hskip 2em}{} & A & \xrightarrow{\hskip 2em} {}& B & \xrightarrow{\hskip 2em}{} & C \xrightarrow{\hskip 2em} 0 \\[-1ex]
                             & \,\rotatebox[origin=c]{-90}{${} \xrightarrow{\hskip 2em}{}$} & & \,\rotatebox[origin=c]{-90}{${} \xrightarrow{\hskip 2em}{}$} & & \,\rotatebox[origin=c]{-90}{${} \xrightarrow{\hskip 2em}{}$} \notag \\[-1ex]
            0\xrightarrow{\hskip 2em}{} & A' &\xrightarrow{\hskip 2em} {}& B' & \xrightarrow{\hskip 2em}{} & C' \xrightarrow{\hskip 2em} 0
    \end{alignat}

\end{document} 

在此处输入图片描述

答案2

如果你的第二个例子的问题仅仅是对齐,那么你可以修复它。

这样,引用以下行时就不会出现问题:

\documentclass{scrartcl}
\usepackage{mathtools, tikz-cd}
\tikzset{every picture/.append style={remember picture}}
\begin{document}
If the problem of your second example is only the alignment, you can fix it. 

This way, there is no problem referencing the first
\eqref{eq:first} or the second line \eqref{eq:second}:

\begin{gather}
    \begin{tikzcd}[ampersand replacement=\&,
    every cell/.append style={text centered}]
        0 \rar \& |[alias=A, text width=width("$A'$")]|A \rar \& |[text width=width("$B'$")]|B \rar \& |[text width=width("$C'$")]|C \rar \& 0\label{eq:first}
    \end{tikzcd}\\[5ex]
    \begin{tikzcd}[overlay, ampersand replacement=\&]
        0 \rar \& A' \ar[from=A] \rar \& B' \rar \& C' \rar \& 0\label{eq:second} 
    \end{tikzcd}
\end{gather}
\end{document}

在此处输入图片描述

答案3

这更像是一个概念验证,因为我对 AMSMath 的内部结构不是很熟悉。

笔记:

  • 这需要每行第 1 列中有一个节点。
  • 如果将此节点向上或向下移动,方程编号也会随之垂直移动。
  • \tag不起作用\nonumber
  • 当行太长时,方程编号不会下移。
  • 不要在 TikZ-CD 之前或之后写任何内容。方程编号的位置取决于图表是否位于线的水平中间。
  • Hyperref?Cleveref?或许吧。

代码

\documentclass{scrartcl}
\usepackage{mathtools, tikz-cd}
\makeatletter
\tikzcdset{
  eqno per line/.style={
    /tikz/column 1/.append code=%
      \global\pgfutil@namelet{tikzcd@rowlabel@\the\pgfmatrixcurrentrow}
                             {pgfutil@empty},
    /tikz/execute at end picture={%
      \pgfmathloop % simpler than \foreach
        \node[overlay,path only,anchor=base east,inner sep=+0pt,outer sep=+0pt](@)
        at(.5\linewidth,0|-\tikzcdmatrixname-\pgfmathcounter-1.base){%
          \@eqnswtrue\make@display@tag
          \expandafter\pgfutil@ifxempty
            \csname tikzcd@rowlabel@\pgfmathcounter\endcsname{}{%
            \expandafter\expandafter\expandafter\ltx@label
            \expandafter\expandafter\expandafter{%
              \csname tikzcd@rowlabel@\pgfmathcounter\endcsname}}};%
      \ifnum\pgfmathcounter<\pgfmatrixcurrentrow
      \repeatpgfmathloop}},
  every matrix/.append code={%
    \def\label##1{%
      \expandafter\xdef
        \csname tikzcd@rowlabel@\the\pgfmatrixcurrentrow\endcsname{##1}}}}
\makeatother
\newenvironment*{tikzcdeq}[1][]
  {\begin{equation*}\tikzcd[eqno per line,#1]}
  {\endtikzcd\end{equation*}}
\begin{document}
Lorem \ref{label3}
\begin{equation}
c^2 = a^2 + b^2
\end{equation}
ipsum \ref{label1}
\begin{equation*}
\begin{tikzcd}[eqno per line]
  0 \rar & A \dar \rar & B \dar \rar & C \dar \rar & 0 \label{label1} \\
  0 \rar & A' \rar     & B' \rar     & C' \rar     & 0 \label{label2}
\end{tikzcd}
\end{equation*}
dolor \eqref{label2}
\begin{equation}
E = mc^2
\end{equation}
sit \eqref{label4}
\begin{tikzcdeq}
  0 \rar & A \dar \rar & B \dar \rar & C \dar \rar & 0 \label{label3} \\
  0 \rar & A' \rar     & B' \rar     & C' \rar     & 0 \label{label4}
\end{tikzcdeq}
amet.
\end{document}

输出

在此处输入图片描述

相关内容