我想(使用\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}