\newcommand 与 autonum 不兼容的帮助

\newcommand 与 autonum 不兼容的帮助

我正在写论文。为了编写数学公式,我创建了\eq 以下命令。

\newcommand{\eq}[1]{
\begin{equation}
  \begin{split}
  #1 
  \end{split}
\end{equation}} 

但是现在我想cleveref与一起使用autonum

但是,我认为这是不可能的,因为我定义命令的方式\eq。这是一个最小的工作示例。

\documentclass{minimal}
\usepackage{amsmath}
\usepackage{cleveref}
\usepackage{autonum}

\newcommand{\eq}[1]{ 
\begin{equation}
  \begin{split}
  #1 
  \end{split}
\end{equation}} 

\begin{document}

Without my command:\\

This is an equation
\begin{equation}\label{eq_1}
\begin{split}
    1+1 &=2,\\
    2+2 &=4.
\end{split}
\end{equation}

This is another
\begin{equation}\label{eq_2}
    1+1=3.
\end{equation}

Only \cref{eq_1} is correct.\\

\noindent\rule{8cm}{0.4pt}

But with my command:\\

This is an equation
\eq{\label{Eq_1}
  1+1 &=2,\\
  2+2 &=4.
}

This is another
\eq{\label{Eq_2}
  1+1=3.
}

Only \cref{Eq_1} is correct.

\end{document}

输出没有显示方程的数量Eq_1

因此,我认为错误在于 的标签\eq在 内\split,并且autonum理解起来存在问题。如果我注释包,autonum一切都会顺利进行,但当然所有 eq 都会被编号。

我有很多方程式,所以我不想改变每一个方程式。

有人能建议一种方法来改变命令的定义\eq以便它能autonum起作用吗?

答案1

这是非常错误的;你为了获得最小的利益而混淆代码。

无论如何,这是不改变您的输入的方法。

\documentclass{article}
\usepackage{amsmath}
\usepackage{cleveref}
\usepackage{autonum}

\makeatletter
\newcommand{\eq}[1]{%
  \begingroup
  \findlabel@{#1}%
  \begin{equation}
  \put@label
  \begin{split}
  \pre@label\post@label
  \end{split}
  \end{equation}%
  \endgroup
}
\def\put@label{}
\def\findlabel@#1{\findlabel@i#1\label\@nil}
\def\findlabel@i#1\label#2\@nil{%
  \def\pre@label{#1}
  \if\relax\detokenize{#2}\relax
    \def\post@label{}%
  \else
    \findlabel@ii#2\@nil
  \fi
}
\def\findlabel@ii#1#2\@nil{%
  \def\put@label{\label{#1}}\findlabel@iii#2%
}
\def\findlabel@iii#1\label{%
  \def\post@label{#1}%
}
\makeatother

\begin{document}

Without my command:

This is an equation
\begin{equation}\label{eq_1}
\begin{split}
    1+1 &=2,\\
    2+2 &=4.
\end{split}
\end{equation}

This is another
\begin{equation}\label{eq_2}
    1+1=3.
\end{equation}

Only \cref{eq_1} is correct.

\noindent\rule{8cm}{0.4pt}

But with my command:

This is an equation
\eq{\label{Eq_1}
  1+1 &=2,\\
  2+2 &=4.
}

This is another
\eq{\label{Eq_2}
  1+1=3.
}

Now \cref{Eq_1} is correct.

\end{document}

在此处输入图片描述

代码查找\label命令,隔离其之前和之后的内容,然后构建环境并在正确的位置(\label外部split)提供各个位。

答案2

如果您\eq按照原来的定义,那么标签就会进入环境内部split,因此您的标签将无法被识别。

正确的定义可能是

\newcommand{\eq}[2]{%
\begin{equation}\label{#1}%
  \begin{split}%
  #2%
  \end{split}%
\end{equation}}

以这种方式使用(第一个参数是标签,第二个参数是正文):

\eq{Eq_1}{
  1+1 &=2,\\
  2+2 &=4.
}

梅威瑟:

\documentclass{minimal}
\usepackage{amsmath}
\usepackage{cleveref}
\usepackage{autonum}

\newcommand{\eq}[2]{%
\begin{equation}\label{#1}%
  \begin{split}%
  #2%
  \end{split}%
\end{equation}}

\begin{document}

Without my command:\bigskip

This is an equation
\begin{equation}\label{eq_1}
\begin{split}
    1+1 &=2,\\
    2+2 &=4.
\end{split}
\end{equation}

This is another
\begin{equation}\label{eq_2}
    1+1=3.
\end{equation}

Only \cref{eq_1} is correct.\bigskip

\noindent\rule{8cm}{0.4pt}\bigskip

But with my command:\bigskip

This is an equation
\eq{Eq_1}{
  1+1 &=2,\\
  2+2 &=4.
}

This is another
\eq{Eq_2}{
  1+1=3.
}

Only \cref{Eq_1} is correct.

\end{document} 

输出:

在此处输入图片描述

备注:切勿使用\\来终止线路...参见何时使用 \par 以及何时使用 \\ 或空行以供参考。

相关内容