引用不同的枚举点,使用全局编号

引用不同的枚举点,使用全局编号

我希望所有定理、方程和假设都具有相同的全局编号,具体取决于章节和小节。我还想在假设中的枚举中引用各个要点。

我使用了以下代码:

\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定理环境没有加载amsthmntheorem。处理定理引用的大量代码cleveref(尤其是处理共享/兄弟计数器时)设计为仅在加载两者之一时才有效。(请参阅文档的第 14.1 节“无错误” cleveref。)如果您也加载,\usepackage{amsthm}这个问题就会消失。

倒置问号问题

我很确定您的 PDF 编译应该因错误而中止!该问题是多个问题的组合:

  1. 当你扩展时,\value{subsection}你就会得到\c@subsection它,而让它四处浮动并不是一个好主意,因为它会在使用点而不是定义点拾取子部分编号。
  2. 正如文档中警告的那样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}

生成以下输出

在此处输入图片描述

离题评论有些时候当下划线字符不能作为公式标签时;我在调试过程中将它们从上面的代码中删除,以确保它们不是问题所在。一般来说,我建议改用冒号:

相关内容