我希望所有定理、方程和假设都具有相同的全局编号,具体取决于章节和小节。我还想在假设中的枚举中引用各个要点。
我使用了以下代码:
\documentclass{article}
\title{Untitled Document}
\author{Your Name}
\date{\today}
\usepackage{amsfonts}
\usepackage{graphicx}
\usepackage{epstopdf}
\usepackage{hyperref}
\usepackage{amsmath}
\usepackage{amssymb}
\usepackage{enumitem}
\usepackage{mathtools}
\usepackage{cleveref}
% Global numbering
\counterwithin*{equation}{section}
\counterwithin*{equation}{subsection}
\renewcommand{\theequation}{%
\thesection.%
\ifnum\value{subsection}>0 \arabic{subsection}.\fi
\arabic{equation}%
}
% Used for creating new theorem and remark environments
\newtheorem{thm}[equation]{Theorem}
\newtheorem{hp}[equation]{Assumption}
\crefname{thm}{Theorem}{Theorem}
\crefname{hp}{hypothesis}{hypotheses}
% Reference items in enumerate
\newlist{hypothesisenum}{enumerate}{1}
\setlist[hypothesisenum]{label=\alph*), ref=\thehp~(\alph*)}
\crefalias{hypothesisenumi}{hp}
\begin{document}
\maketitle
\section{A section}
\section{Another section}
\subsection{Subsection of another section}
\begin{thm}[A theorem]
\end{thm}
\begin{hp}[Admissible shapes]\label{hp:hypo}
\hfill
\begin{hypothesisenum}
\item \label{hp:hypo_1} first
\item \label{hp:hypo_2} second
\end{hypothesisenum}
\end{hp}
\begin{thm}[A theorem]
\end{thm}
We used \cref{hp:hypo_1,hp:hypo_2,hp:hypo}.
\end{document}
这根本不起作用:
事实上,我希望蓝色圈出的东西不存在。
答案1
有两个问题:
“等式”问题
这是因为你尝试使用cleveref
定理环境没有加载amsthm
或ntheorem
。处理定理引用的大量代码cleveref
(尤其是处理共享/兄弟计数器时)设计为仅在加载两者之一时才有效。(请参阅文档的第 14.1 节“无错误” cleveref
。)如果您也加载,\usepackage{amsthm}
这个问题就会消失。
倒置问号问题
我很确定您的 PDF 编译应该因错误而中止!该问题是多个问题的组合:
- 当你扩展时,
\value{subsection}
你就会得到\c@subsection
它,而让它四处浮动并不是一个好主意,因为它会在使用点而不是定义点拾取子部分编号。 - 正如文档中警告的那样
enumitem
,接下来ref=
是一个移动的论点,所以你必须担心脆弱的命令。
因此,正如所写,您的代码将无法编译。为了解决第二个问题,我们可以将代码抽象为隐藏子节编号,并将其保存为单独的宏并进行保护。
\renewcommand{\theequation}{%
\thesection.\protect\hide{\value{subsection}}{\arabic{subsection}}\arabic{equation}%
}
\newcommand{\hide}[2]{\ifnum#1>0 #2.\fi}
如果你这样做,你的代码就可以很好地构建。不幸的是,你会得到错误的数字,因为你在文件中发现了.aux
类似这样的内容:
\newlabel{hp:hypo}{{2.\hide {\c@subsection }{1}2}{1}{Admissible shapes}{equation.2.1.2}{}}
\newlabel{hp:hypo@cref}{{[hp][2][2,1]2.\hide {\c@subsection }{1}2}{[1][1][]1}}
\newlabel{hp:hypo1}{{{2.\hide {\c@subsection }{1}2.(a)}}{1}{Admissible shapes}{Item.3}{}}
\newlabel{hp:hypo1@cref}{{[hp][1][]{2.\hide {\c@subsection }{1}2.(a)}}{[1][1][]1}}
\newlabel{hp:hypo2}{{{2.\hide {\c@subsection }{1}2.(b)}}{1}{Admissible shapes}{Item.4}{}}
\newlabel{hp:hypo2@cref}{{[hp][2][]{2.\hide {\c@subsection }{1}2.(b)}}{[1][1][]1}}
这意味着每当你调用时\ref{hp:hypo2}
,你的代码都会在参考点评估计数器的当前值subsection
,然后使用它来决定是否隐藏显示。如果您有一组在第 1 节中定义的假设,但在第 2.1 节中引用,这显然是一个问题。
为了解决这个问题,我们可以利用计数器的阿拉伯形式扩展为整数的事实,并且可以通过\ifnum
很好的方式来进行评估,我们将\hide
在阿拉伯形式本身上运行,而不是在计数器值上运行。
以下是完整的代码(包含一些附加内容):
\documentclass{article}
\title{Untitled Document}
\author{Your Name}
\date{\today}
\usepackage{amsfonts}
\usepackage{graphicx}
\usepackage{epstopdf}
\usepackage{hyperref}
\usepackage{amsmath}
\usepackage{amssymb}
\usepackage{amsthm}
\usepackage{enumitem}
\usepackage{mathtools}
\usepackage{cleveref}
% Global numbering
\counterwithin*{equation}{section}
\counterwithin*{equation}{subsection}
\renewcommand{\theequation}{%
\thesection.\protect\hide{\arabic{subsection}}\arabic{equation}%
}
\newcommand{\hide}[1]{\ifnum#1>0 #1.\fi}
% Used for creating new theorem and remark environments
\newtheorem{thm}[equation]{Theorem}
\newtheorem{hp}[equation]{Assumption}
\crefname{thm}{Theorem}{Theorem}
\crefname{hp}{hypothesis}{hypotheses}
% Reference items in enumerate
\newlist{hypothesisenum}{enumerate}{1}
\setlist[hypothesisenum]{label=\alph*), ref=\theequation.(\alph*)}
\crefalias{hypothesisenumi}{hp}
\begin{document}
\maketitle
\section{A section}
\begin{hp}[Admissible shapes]\label{hp:hypop}
\hfill
\begin{hypothesisenum}
\item \label{hp:hypo21} first
\item \label{hp:hypo22} second
\end{hypothesisenum}
\end{hp}
\section{Another section}
\subsection{Subsection of another section}
\begin{thm}[A theorem]\label{thm:thm1}
\end{thm}
\begin{hp}[Admissible shapes]\label{hp:hypo}
\hfill
\begin{hypothesisenum}
\item \label{hp:hypo1} first
\item \label{hp:hypo2} second
\end{hypothesisenum}
\end{hp}
\begin{thm}[A theorem]
\end{thm}
We used \cref{hp:hypo1,hp:hypo2,hp:hypo}.
We also used \cref{hp:hypo21,hp:hypo22} to prove \cref{thm:thm1}.
\end{document}
生成以下输出
离题评论有些时候当下划线字符不能作为公式标签时;我在调试过程中将它们从上面的代码中删除,以确保它们不是问题所在。一般来说,我建议改用冒号:
。