我已经使用创建了一些环境
\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
( amsthm
version) 的内部宏,以将定理环境名称收集到一个列表中,然后在文档开头重新定义这些环境。此处的代码执行顺序很重要,您必须首先修补内部宏,然后使用\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}
附言:来自文档source2e
LaTeX2e 中的 17.4 节\samepage
不再受支持。所以我不确定samepage
在 2020 年是否建议使用环境。通常你可以使用minipage
环境,请参阅牢不可破的方块。
2023-05-27 更新:即将发布的 LaTeX2e 2023-06-01 版本确认\samepage
仍受支持。source2e.pdf
由于在 2e 中 |\samepage| 不再受支持,...
被删除。相关链接