因为我的文档中有很多方程式,而且大多数都不需要引用,所以我总是使用\begin{align*}...\end{align*}
。当我确实需要方程式编号时,我会写一个命令
\newcommand{\nr}{\addtocounter{equation}{1}\tag{\theequation}}
这个方法很好用,只是 cleveref 不会对它进行排序。一个例子
\documentclass{article}
\usepackage{amsmath,cleveref}
\newcommand{\nr}{\addtocounter{equation}{1}\tag{\theequation}}
\begin{document}
\begin{align*}
foo \nr\label{eq1}\\
bar \nr\label{eq2}
\end{align*}
\cref{eq2,eq1}
\end{document}
这样输出的是“eqs. (2) and (1)”,而不是“eqs. (1) and (2)”。有办法修复这个问题吗?
答案1
(不是解决方案,只是对问题进行更深入的分析。)
问题似乎与\tag
宏在包中的定义方式有关amsmath
。在下面给出的代码中,如果 (i) 通过 定义两个未编号的显示方程,\[...\]
并且 (ii) 使用\eqno
(“原始” TeX 宏) 而不是 ,则方程编号排序正确\tag
。不幸的是,amsmath
包确实不是允许\eqno
在其数学环境中使用。
\documentclass{article}
\usepackage{amsmath,cleveref}
\setlength\textwidth{2in} % just for this example
\newcommand{\nr}[1]{% first method uses \tag
\refstepcounter{equation}\label{#1}\tag{\theequation}}
\newcommand{\nrx}[1]{% second method uses \eqno
\refstepcounter{equation}\label{#1}\eqno(\theequation)}
\begin{document}
\begin{align*}
foo \nr{eq1}\\
bar \nr{eq2}
\end{align*}
\cref{eq2,eq1}
\[ newfoo \nrx{eq3} \]
\[ newbar \nrx{eq4} \]
\cref{eq4,eq3}
\end{document}
答案2
回答很晚,但他的工作似乎很好。
\documentclass{article}
\usepackage{amsmath}
% just make sure that cleveref is included last (even after hyperref if used)
\usepackage[capitalize]{cleveref}
\newcommand{\creflastconjunction}{,~and~}
\begin{document}
\begin{align}
x &= 1 \nonumber \\
x &= 2 \nonumber \\
x &= 3.14159 \label{eq:1}\\
y &= 4 \label{eq:2}
\end{align}
The first two equations are unnumbered (e.g., working out details) and \cref{eq:2,eq:1} are referenced correctly by cleveref.
Note that by default cleveref will sort the list.
Now, if you want to refer to equation 2 before equation 1 you must be explicit with cleveref, like \cref{eq:2} and \labelcref{eq:1}.
This sorting behavior can be changed globally with the option nosort.
\end{document}