框架非常适合控制定理的外部布局。thm工具另一方面,它可以处理许多其他大大小小的事情,特别是文本流中标题的详细格式,以及诸如维护灵活的定理列表、正确设置自动引用名称等。我知道我可以使用命令mdframed
的键来让它创建一个框架并控制该框架的\declaretheorem
大部分方面。但我缺少的是一种利用frametitle
框架这样。
有没有办法将标题排版命令从thm工具融入到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
。要使用mdframed
,frametitle
您必须重新定义 的默认环境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}