考虑一个交换图,例如
\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}