将 thmtools 中的定理名称包含到 mdframed 标题框中

将 thmtools 中的定理名称包含到 mdframed 标题框中

非常适合控制定理的外部布局。另一方面,它可以处理许多其他大大小小的事情,特别是文本流中标题的详细格式,以及诸如维护灵活的定理列表、正确设置自动引用名称等。我知道我可以使用命令mdframed的键来让它创建一个框架并控制该框架的\declaretheorem大部分方面。但我缺少的是一种利用frametitle这样。

有没有办法将标题排版命令从融入到frametitle它所创造的环境的争论中mdframed

我发现我可以在标题之前和之后添加一个钩子,但至少我使用\def\myframetitle\bgroup和在这两个之间捕捉标题的简单方法\egroup失败了:

\documentclass{article}
\usepackage{xcolor,tikz,geometry,amsthm,thmtools}
\usepackage[framemethod=TikZ]{mdframed}
\usepackage{thm-patch}% copied from thmdef-mdframed.sty
\makeatletter
\mdfdefinestyle{fstyle}{linecolor=blue,frametitlerule=true}
% The following was adapted from thmdef-mdframed.sty but does not work:
\define@key{thmdef}{mymdframed}[{}]{%
  \thmt@trytwice{}{%
    \addtotheorempreheadhook[\thmt@envname]{%
      \def\myframetitle\bgroup}%
    \addtotheorempostheadhook[\thmt@envname]{%
      \egroup\begin{mdframed}[frametitle=\myframetitle,#1]}%
    \addtotheorempostfoothook[\thmt@envname]{\end{mdframed}}%
    }%
}
% Change the mymdframed to mdframed to make this compile at all:
\declaretheoremstyle[mymdframed={style=fstyle}]{tstyle}
\declaretheorem[style=tstyle]{thm}
\begin{document}
\begin{thm}[Round] The world is round\end{thm}

And this is what it \emph{should} look like:
\begin{mdframed}[frametitle={Thm 1: Round},style=fstyle]
The world is round\end{mdframed}
\end{document}

我很高兴了解任何让两个包一起工作的方法,包括标题。必须有一些解决方案,例如通过定义自己的包装器宏来处理标题参数,但我希望那些了解更多信息的人能提供一些更优雅的方法。

答案1

让我尝试给出答案。

thmtools使用 提供的默认环境amsthm。要使用mdframedframetitle您必须重新定义 的默认环境amsthm。但是我不知道这是否是个好主意。使用下面的简单测试文件,它可以工作。请注意,所有定理环境都包含在 中mdframed

在示例中,我还展示了如何修改样式mdframed

\setcounter{errorcontextlines}{999}
\documentclass{article}
\usepackage{xcolor,tikz,geometry,amsthm}
\usepackage{thmtools,thm-patch}% copied from thmdef-mdframed.sty
\usepackage[framemethod=TikZ]{mdframed}
\makeatletter

\def\@thm#1#2#3{%
%  \ifhmode\unskip\unskip\par\fi
  \normalfont
  \let\thmheadnl\relax
  \let\thm@swap\@gobble
  \thm@notefont{\fontseries\mddefault\upshape}%
  \thm@headpunct{.}% add period after heading
  \thm@headsep 5\p@ plus\p@ minus\p@\relax
  \thm@space@setup
  #1% style overrides
  \@topsep \thm@preskip               % used by thm head
  \@topsepadd \thm@postskip           % used by \@endparenv
  %
  \def\@tempa{#2}\ifx\@empty\@tempa
    \def\@tempa{\@oparg{\@begintheorem{#3}{}}[]}%
  \else
    \refstepcounter{#2}%
    \def\@tempa{\@oparg{\@begintheorem{#3}{\csname the#2\endcsname}}[]}%
  \fi
  \@tempa
}
\def\@begintheorem#1#2[#3]{%
    \mdframed[style=fstyle,frametitle={%
    \the\thm@headfont \thm@indent
    \@ifempty{#1}{\let\thmname\@gobble}{\let\thmname\@iden}%
    \@ifempty{#2}{\let\thmnumber\@gobble}{\let\thmnumber\@iden}%
    \@ifempty{#3}{\let\thmnote\@gobble}{\let\thmnote\@iden}%
    \thm@swap\swappedhead\thmhead{#1}{#2}{#3}%
    \the\thm@headpunct}]%
  }%

\def\@endtheorem{\endmdframed}
\makeatother


\mdfdefinestyle{fstyle}{linecolor=blue,frametitlerule=true,linewidth=2pt,}
\declaretheoremstyle[notefont=\itshape,preheadhook={\mdfapptodefinestyle{fstyle}{backgroundcolor=gray}}]{tstyle}
\declaretheorem[style=tstyle]{thm}
\begin{document}
\begin{thm}[Round] The world is round\end{thm}

And this is what it \emph{should} look like:

\begin{thm}The world is round\end{thm}


\end{document}

在此处输入图片描述

相关内容