在数组环境中对行进行编号

在数组环境中对行进行编号

我想(使用\label-\ref机制)将下图中的第一行和第三行编号为方程式:

\documentclass[10pt]{article}

\usepackage{amsmath}
\usepackage{amsfonts}
\usepackage{amssymb}
\usepackage{amsthm}
\usepackage{graphicx}

\begin{document}    
    \begin{equation} 
    \begin{array}{cccccccccc}
    1 & \longrightarrow &A  & \longrightarrow & B \times C & \overset{\pi}\longrightarrow & D & \longrightarrow & 1 \phantom{\, ,} \\
&&\rotatebox[origin=c]{90}{$\leqslant$}&&\rotatebox[origin=c]{90}{$\leqslant$}&&\rotatebox[origin=c]{90}{$\leqslant$}\\
1 & \longrightarrow &a \cap b  & \longrightarrow & c & \longrightarrow & c \pi & \longrightarrow & 1 \, , 
     \end{array}
     \end{equation}
\end{document}

虽然我做了一些研究,但找到的解决方案(使用 align、alignat 等)都无法很好地处理我的图表。您有什么建议吗?具体来说,哪个环境最适合使用,以及如何使用?

答案1

正如您所要求的,这里有一个使用的解决方案tikz-cd。它使用自定义标签宏\cdlabel,抛出图表的当前行并生成由第一个参数命名的标签。您可以\ref像往常一样使用它。

\documentclass{article}
\usepackage{amssymb}
\usepackage{tikz}
\usetikzlibrary{cd}

\newcounter{cdrow}
\newcommand\cdlabel[1]{%
  \refstepcounter{cdrow}
  \label{#1}
  (\thecdrow)
}

\begin{document}
\begin{tikzcd}
  1 \arrow[r] & A \arrow[r] & B \times C \arrow[r, "\pi"] & D \arrow[r] & 1 & \cdlabel{eq1}\\
  & \rotatebox[origin=c]{90}{$\leqslant$} & \rotatebox[origin=c]{90}{$\leqslant$} & \rotatebox[origin=c]{90}{$\leqslant$} && \\
  1 \arrow[r] & a \cap b  \arrow[r] & c \arrow[r] & c\pi \arrow[r] & 1 & \cdlabel{eq2}
\end{tikzcd}
%
%1st line: eq. \ref{eq1}, 2nd line: eq. \ref{eq2}.
\end{document}

输出裁剪

答案2

您可以使用alignat(其中行默认编号)代替array

\documentclass{article}

\usepackage{amsmath,amssymb}
\usepackage{graphicx}

\begin{document}
\begin{alignat}{10}
  1 & \longrightarrow & A & \longrightarrow & B \times C & \overset{\pi}\longrightarrow & D & \longrightarrow & 1 \phantom{\, ,} \label{eq1}\\
    && \rotatebox[origin=c]{90}{$\leqslant$} && \rotatebox[origin=c]{90}{$\leqslant$} && \rotatebox[origin=c]{90}{$\leqslant$}   \nonumber\\
  1 & \longrightarrow &a \cap b  & \longrightarrow & c & \longrightarrow & c \pi & \longrightarrow & 1 \, ,                      \label{eq2}
\end{alignat}
\end{document}

输出裁剪-中间

但是,单元格内容位置的默认设置alignat是为方程式(分别是方程式的各个部分)设计的,并且不符合您的图表或一般图表的要求(参见上图)。

要解决此问题,您可以使用自定义版本来alignat修改定位和间距。我将此环境称为labeledcd。请注意,它需要一个参数,该参数指定列数,如alignat。(该参数实际上直接传递给alignat。)

\documentclass{article}

\usepackage{amsmath,amssymb}
\usepackage{graphicx}

\makeatletter
\newenvironment{labeledcd}[1]{%
  \def\align@preamble{%
     &\hfil
      \strut@
      \setboxz@h{\@lign$\m@th\displaystyle{####}$}%
      \ifmeasuring@\savefieldlength@\fi
      \set@field
      \hfil
      \tabskip\tabcolsep
     &\setboxz@h{\@lign$\m@th\displaystyle{{}####}$}%
      \ifmeasuring@\savefieldlength@\fi
      \set@field
      \hfil
      \tabskip\tabcolsep
  }%
  \alignat{#1}
}{%
  \endalignat
}
\makeatother

\begin{document}
\begin{labeledcd}{10}
  1 & \longrightarrow & A & \longrightarrow & B \times C & \overset{\pi}\longrightarrow & D & \longrightarrow & 1              \label{eq1}\\
    && \rotatebox[origin=c]{90}{$\leqslant$} && \rotatebox[origin=c]{90}{$\leqslant$} && \rotatebox[origin=c]{90}{$\leqslant$} \nonumber\\
  1 & \longrightarrow &a \cap b  & \longrightarrow & c & \longrightarrow & c \pi & \longrightarrow & 1                         \label{eq2}
\end{labeledcd}
1st line: eq. \ref{eq1}, 2nd line: eq. \ref{eq2}.
\end{document}

输出裁剪

相关内容