Cleveref 不对自定义标签进行排序

Cleveref 不对自定义标签进行排序

因为我的文档中有很多方程式,而且大多数都不需要引用,所以我总是使用\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}

解决方案_pdf

相关内容