我是 Python 的粉丝,在一个不幸的常见情况下,当一个人在其他定理的实际证明中创建新的定理、定义等时,我希望“内部定理”能够缩进。
为此,我发现此解决方案,它不仅提供了框架,还提供了缩进。但是,该解决方案会为所有内容设置框架/缩进,甚至是基础定理,结果有点丑陋。有没有办法让它仅在嵌套在另一个证明中时才设置框架/缩进,而无需定义单独的环境并手动执行?
不确定这是否重要,但如果重要的话,我当前的设置是:
\usepackage[amsmath,thmmarks,framed]{ntheorem}
\theorembodyfont{\small}
\usepackage{framed}
\usepackage{color}
\definecolor{gray}{rgb}{0.6,0.6,0.6}
\renewcommand*\FrameCommand{{\color{gray}\vrule width 5pt \hspace{10pt}}}
\theoremstyle{plain}
\newframedtheorem{thm}{Theorem}[page]
\newframedtheorem{lem}[thm]{Lemma}
\newframedtheorem{cor}[thm]{Corollary}
\newframedtheorem{prop}[thm]{Proposition}
\theoremheaderfont{\normalfont\itshape}
\newframedtheorem{rem}[thm]{Remark}
\newframedtheorem{ques}[thm]{Question}
\theoremstyle{nonumberplain}
\theoremheaderfont{\normalfont\itshape}
\newframedtheorem{proof}{Proof:}
编辑:我的最终解决方案是对已选中答案中发布的内容进行 lualatex 修改。因为他将其编辑掉,所以我将在这里模糊地重新引用总体思路:
定义环境的两个版本,
thm
和frthm
,并在proof
定义中重新定义\thm
为\frthm
和\endthm
为endfrthm
。这个解决方案不如前一个那么好,但从技术上讲它可以工作。
这是该想法的 MWE,用 lualatex 编写,用于自动化(您必须修改它tex.print
本身以更改特定于实现的细节,例如\newtheorem
以不同的方式定义)。
\documentclass[11pt,openany]{memoir}
\usepackage{cool}
\usepackage{luacode}
\usepackage{etoolbox}
\usepackage[amsmath,thmmarks,framed]{ntheorem}
\usepackage{framed}
\usepackage{color}
\definecolor{gray}{rgb}{0.6,0.6,0.6}
\begin{luacode}
prefix = "fr"
function createEnvironments(environs)
for sh, lo in pairs(environs) do
tex.print("\\newtheorem{" .. sh .. "}{" .. lo .. "}")
tex.print("\\newframedtheorem{" .. prefix .. sh .. "}{" .. lo .. "}")
end
end
function redefineEnvironments(environs)
for sh, lo in pairs(environs) do
tex.print("\\def\\" .. sh .. "{\\" .. prefix .. sh .. "}" )
tex.print("\\def\\end" .. sh .. "{\\end" .. prefix .. sh .. "}")
end
end
\end{luacode}
\begin{luacode}
--your list of shortcut="Environment"; fill in this table!
environList = { lem="Lemma" , prop="Proposition",proof="Proof"}
createEnvironments(environList)
\end{luacode}
\renewcommand*\FrameCommand{{\color{gray}\vrule width 5pt \hspace{10pt}}}
\appto\proof{% ... within the proof environment, we redefine the commands to point to the framed environments
\directlua{redefineEnvironments(environList)}
}
\begin{document}
\begin{lem}
Layer 1
\end{lem}
\begin{proof}
Layer 0 stuff
\begin{prop}
Layer 1 starts getting embedded
\begin{lem}
This is an artefact: once you get into the first proof you start nesting no matter what
\end{lem}
\end{prop}
Layer 0 stuff
\begin{lem}
Another layer 1
\end{lem}
Can put layer 0 stuff here
\begin{proof}
Layer 1 proof
\begin{prop}
Layer 2
\end{prop}
\begin{proof}
We conclude with a layer 2 proof
\end{proof}
\end{proof}
\end{proof}
\end{document}
解释:我意识到将每个定理都变成框架定理会产生不良的排版副作用。这个新版本创建了两者,并在环境中将前者重新定义为后者proof
,其中两者都可能发生嵌套。当然,您可以在任何其他环境中执行相同操作。
答案1
这里有一种方法,用于调整最外层定理中etoolbox
的定义。完整的 MWE 如下:\FrameCommand
\documentclass{article}
\usepackage[framed]{ntheorem}
\usepackage{framed} % To define \FrameCommand
\usepackage{color} % To define \definecolor
\usepackage{lipsum} % For the dummy text
\definecolor{gray}{rgb}{0.6,0.6,0.6}
\usepackage{etoolbox} % For \appto
\theoremstyle{plain}
\newframedtheorem{thm}{Theorem}[page]
\renewcommand*\FrameCommand{\relax} % By default, no framing occurs
\appto\thm{% ... but within the thm environment, FrameCommand is different
\renewcommand*\FrameCommand{{\color{gray}\vrule width 5pt \hspace{10pt}}}
}
\begin{document}
\noindent \lipsum[1]
\begin{thm}
Outer theorem
\begin{thm}
Theorem nested once
\begin{thm}
Theorem nested twice
\end{thm}
\end{thm}
\end{thm}
\end{document}
其结果如下:
\appto
对于每个需要这种嵌套行为的附加环境,您需要添加类似的调用。(不幸的是,我提出的原始解决方案使用AtBeginEnvironment
在环境定义中过早添加了钩子,因此FrameCommand
在最外层环境中使用之前也会重新定义。此版本使用\appto\thm
稍微不太礼貌,因为它通过\thm
直接修改命令来破解环境的打开,但它在正确的时刻添加了钩子。)