嵌套定理/证明的自动缩进/框架

嵌套定理/证明的自动缩进/框架

我是 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 修改。因为他将其编辑掉,所以我将在这里模糊地重新引用总体思路:

定义环境的两个版本,thmfrthm,并在proof定义中重新定义\thm\frthm\endthmendfrthm。这个解决方案不如前一个那么好,但从技术上讲它可以工作。

这是该想法的 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直接修改命令来破解环境的打开,但它在正确的时刻添加了钩子。)

相关内容