编辑由 \newtheorem 创建的所有环境

编辑由 \newtheorem 创建的所有环境

我已经使用创建了一些环境

\newtheorem{theo}{Theorem}[section]
\newtheorem{defi}[theo]{Definition}
\newtheorem{obs}[theo]{Observation}
...

还有一些。我想修改所有这些,并在每个\begin{samepage}之前和之后添加内容。\end{samepage}

我想要这样的东西:

\newtheorem{pretheo}{Theorem}[section]
\newenvironment{theo}{\begin{samepage}\begin{pretheo}}{\end{pretheo}\end{samepage}}

但是我有太多不同的环境,我觉得为每个环境创建两个环境太麻烦了。有没有直接的方法可以同时对所有环境执行此操作?

多谢!

答案1

您可以重新创建基础设施并定义\newstheorem“samepage”定理。

\documentclass{article}
\usepackage{amsthm} % not required, but better loading it

\usepackage{lipsum} % for mock text

\NewDocumentCommand{\newstheorem}{smomo}{%
  % #1 = optional * for unnumbered theorem
  % #2 = env name
  % #3 = shared counter
  % #4 = label
  % #5 = parent counter
  % define the true environment
  \newenvironment{#2}
    {\par\pagebreak[0]\begin{samepage}\UseName{#2@inner}}
    {\UseName{end#2@inner}\end{samepage}}%
  \IfBooleanTF{#1}
    {\newtheorem*{#2@inner}{#4}}%
    {%
     \IfNoValueTF{#5}{%
       % no parent counter
       \IfNoValueTF{#3}{%
         % no shared counter
         \newtheorem{#2@inner}{#4}%
       }{% shared counter
         \newtheorem{#2@inner}[#3@inner]{#4}%
       }%
     }{% parent counter
         \newtheorem{#2@inner}{#4}[#5]%
     }%
  }%
}

\newtheorem{theonormal}{Theorem}[section]

\newstheorem{theo}{Theorem}[section]
\newstheorem{defi}[theo]{Definition}
\newstheorem{obs}[theo]{Observation}

\newstheorem*{foo}{Foo}

\begin{document}

\lipsum[1-4]

\begin{theonormal}
\lipsum[5-6]
\end{theonormal}

\clearpage

\lipsum[1-4]

\begin{theo}
\lipsum[5-6]
\end{theo}

\clearpage

\lipsum[1-3]

\begin{theo}
\lipsum[5-8]
\end{theo}


\end{document}

在前两页中我展示了通常会发生的情况。

以下两页运用了“同一页定理”。

最后两页显示如果语句很长,则samepage没有效果,但这应该不是一个真正的问题。

在此处输入图片描述

答案2

以下示例修补了\newtheorem( amsthmversion) 的内部宏,以将定理环境名称收集到一个列表中,然后在文档开头重新定义这些环境。此处的代码执行顺序很重要,您必须首先修补内部宏,然后使用\newtheorem,最后重新定义定理。

\documentclass{article}
\usepackage{amsmath}
\usepackage{amsthm}
\usepackage{etoolbox}

%% codes added before every occurrances of \newtheorem
\makeatletter
% init a comma-seperated list
\let\thm@list\@empty

% patch \@xnthm, collect theorem env names in \thm@list
% This patch must be used before any use of \newtheorem.
\patchcmd\@xnthm
  {\global\@xp\let}
  {\g@addto@macro\thm@list{,#2}\global\@xp\let}
  {}{\fail}

% patch every theorem env defined before \begin{document}
\AtBeginDocument{
  % strip comma from left
  \def\lstrip@comma,#1\@nil#2{\def#2{#1}}
  \expandafter\lstrip@comma\thm@list\@nil\thm@list
  
  % patch theorem envs
  \@for\@tempa:=\thm@list\do{%
    % backup
    \csletcs{\@tempa @backup}{\@tempa}%
    \csletcs{end\@tempa @backup}{end\@tempa}%
    % redefine
    \edef\temp{%
      \noexpand\renewenvironment{\@tempa}
        {\noexpand\begin{samepage}\noexpand\begin{\@tempa @backup}}
        {\noexpand\end{\@tempa @backup}\noexpand\end{samepage}}%
    }
    \temp
  }
}
\makeatother


\newtheorem{thm}{Theorem}[section]
\newtheorem{defn}[thm]{Definition}

\begin{document}
\section{title}
\begin{thm}
  content
\end{thm}

\begin{defn}
  content
\end{defn}

\begin{thm}[title]
  content
\end{thm}

\begin{defn}[title]
  content
\end{defn}
\end{document}

附言:来自文档source2eLaTeX2e 中的 17.4 节\samepage不再受支持。所以我不确定samepage在 2020 年是否建议使用环境。通常你可以使用minipage环境,请参阅牢不可破的方块

2023-05-27 更新:即将发布的 LaTeX2e 2023-06-01 版本确认\samepage仍受支持。source2e.pdf

由于在 2e 中 |\samepage| 不再受支持,...

被删除。相关链接

  • 犯罪ecf19e5a(Gh1022(#1023),2023-03-22)
    • 拉取请求#1023Gh1022
    • 问题#1022在 \samepage 中重置 \predisplaypenalty
  • 犯罪a7187bb5(更新有关“samepage”的一些文档;毕竟它仍然(勉强)受支持 [ci skip],2023-05-26)

相关内容