数字定理作为 pagenumber.counter

数字定理作为 pagenumber.counter

对于我的论文,我想将定理类环境编号为(pagenumber).(counter),其中counter是所有环境共享的计数器,每页重新启动一次。例如,在第 86 页,我会有

定义 86.1。

定理 86.2。贝比

备注86.3。加拿大

然后,在第 87 页,

推论87.1。滴滴

提案 87.2。电竞

我尝试通过设置amsthm和来实现这一点,并将所有其他定理环境定义为定理的兄弟。在这样做时,我注意到有时计数器是错误的,尤其是当定理出现在页面顶部附近时。考虑以下 MWE:thmtools\declaretheorem[numberwithin=page]{theorem}

\documentclass{memoir}

\usepackage[height=5cm]{geometry}

\usepackage{amsthm}
\usepackage{thmtools}
\usepackage{lipsum}

\declaretheorem[numberwithin=page]{theorem}

\begin{document}
    \begin{theorem}
        Aaa
    \end{theorem}
    
    \lipsum[1]
    
    \begin{theorem}
        Bbb
    \end{theorem}
    
    \begin{theorem}
        Ccc
    \end{theorem}
    
    \lipsum[1]
    
    aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa
    aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa
    aa aa aa aa aa aa
    
    \begin{theorem}
        Ddd
    \end{theorem}
\end{document}

这里,第 1 页上的定理编号正确,但第 2 页和第 3 页上的定理编号不正确(1.3 和 3.0 应该分别编号为 2.1 和 3.1)。当定理出现在页面下方时,问题就消失了。

这个问题已经问过了这里,但那里的解决方案似乎与不兼容amsthm

知道如何修复这个问题吗?

答案1

我不确定这是否是一种合理的风格,但论点是你的。

我的解决方案涉及perpageneedspace

  1. 表示形式\thetheorem\pageref{theorem@\theglobaltheorem}.\arabic{theorem}\pageref需要使用 是因为在编译期间任何时候都无法知道页码,并且只有在上次运行中收集的引用是安全的(如果引用已更改,您将收到警告)。

  2. 在发出合适的信号后,计数器globaltheorem会增加;我使用,但也可能被使用。\labelpostheadhookpreheadhook

  3. theorem计数器被声明为“每页”。

  4. 有一点复杂,因为计数器会增加该定理实际上是排版的,因此我使用preheadhook来确保至少有一行可用,以克服这个问题。您可以检查,如果\needspace{\baselineskip}省略,第 2 页上的注释将编号为 2.3,而不是预期的 2.1。

\documentclass{memoir}

\usepackage[a6paper]{geometry}

\usepackage{perpage}
\usepackage{amsthm}
\usepackage{thmtools}
\usepackage{needspace}

\declaretheorem[
  name=Theorem,
  preheadhook=\needspace{\baselineskip},
  postheadhook=\label{theorem@\theglobaltheorem}\stepcounter{globaltheorem},
]{theorem}

\MakePerPage{theorem}
\newcounter{globaltheorem}
\renewcommand{\thetheorem}{\pageref{theorem@\theglobaltheorem}.\arabic{theorem}}

\declaretheorem[
  style=definition,
  sibling=theorem,
  name=Definition,
  preheadhook=\needspace{\baselineskip},
  postheadhook=\label{theorem@\theglobaltheorem}\stepcounter{globaltheorem},
]{definition}
\declaretheorem[
  style=definition,
  sibling=theorem,
  name=Remark,
  preheadhook=\needspace{\baselineskip},
  postheadhook=\label{theorem@\theglobaltheorem}\stepcounter{globaltheorem},
]{remark}

\begin{document}

\begin{theorem}
Aaa
\end{theorem}

\begin{definition}
Bbb
\end{definition}

\vspace{20\baselineskip}

\begin{remark}
Ccc
\end{remark}

\begin{theorem}
Ddd
\end{theorem}

\end{document}

在此处输入图片描述

相关内容