我正在写论文。为了编写数学公式,我创建了\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 以及何时使用 \\ 或空行以供参考。