![是否可以在不指定 frametitle 键的情况下设置 mdframed newmdenv 的标题](https://linux22.com/image/328746/%E6%98%AF%E5%90%A6%E5%8F%AF%E4%BB%A5%E5%9C%A8%E4%B8%8D%E6%8C%87%E5%AE%9A%20frametitle%20%E9%94%AE%E7%9A%84%E6%83%85%E5%86%B5%E4%B8%8B%E8%AE%BE%E7%BD%AE%20mdframed%20newmdenv%20%E7%9A%84%E6%A0%87%E9%A2%98.png)
我希望能够调用 mdframed 框并指定标题,而不使用以下frametitle=Title
语法:
我想写
\begin{mdframedbox}[Title]
...content here...
\end{mdframedbox}
代替
\begin{mdframedbox}[frametitle=Title]
...content here...
\end{mdframedbox}
这是一个编译时不包含我当前如何使用 mdframed 包来创建一个盒子的 tex 文档。
\documentclass{article}
\usepackage[framemethod=TikZ]{mdframed}%boxes
\usepackage{xcolor}%boxes
\usepackage{lipsum}
%% Generic use box with grey background
\newmdenv[%
backgroundcolor=gray!15,
linecolor=black,
outerlinewidth=1pt,
roundcorner=1mm,
skipabove=\baselineskip,
skipbelow=\baselineskip,
font=\small,
nobreak=true,
]{graybox}
\begin{document}
\begin{graybox}[frametitle=Gray Box Title]
\lipsum[1]
\end{graybox}
\end{document}
编辑:
我已经看过了mdframed 的文档并没有看到任何突出的东西。我的第一个猜测是,这是不可能的,因为 mdframed 是编写的,我需要围绕它编写一个包装器环境才能获得所需的行为,但是我想确保在尝试编写所述包装器之前没有错过已经存在的东西
答案1
我所做的只是稍微修改了\begin{graybox}
工作方式,以便它需要一个参数,即标题。然后我将其传递给密钥frametitle
。我通过修改命令来做到这一点\graybox
,该命令在您拥有时会隐式调用\begin{graybox}
。实现这一点的小魔法是:
\let\orig@graybox=\graybox
\def\graybox#1{
\orig@graybox[frametitle={#1}]
}
第一行将原始\graybox
定义保存在 中\orig@graybox
。第二行和第三行覆盖该\graybox
定义,以便它调用原始灰盒并将其第一个参数(用 表示#1
)传递给frametitle
键。
下面的\makeatletter
和\makeatother
允许@
在定义中使用符号,以便\orig@graybox
不会在代码中意外使用。
\documentclass{article}
\usepackage[framemethod=TikZ]{mdframed}%boxes
\usepackage{xcolor}%boxes
\usepackage{lipsum}
%% Generic use box with grey background
\newmdenv[%
backgroundcolor=gray!15,
linecolor=black,
outerlinewidth=1pt,
roundcorner=1mm,
skipabove=\baselineskip,
skipbelow=\baselineskip,
font=\small,
nobreak=true,
]{graybox}
\makeatletter
\let\orig@graybox=\graybox
\def\graybox#1{
\orig@graybox[frametitle={#1}]
}
\makeatother
\begin{document}
\begin{graybox}{Gray Box Title}
\lipsum[1]
\end{graybox}
\end{document}
附录
如果您希望不显示标题,最简单的选择是将参数留空,因为包mdframed
将把空白frametitle
视为没有标题。
否则,另一种方法是给它一个可选参数,通常用 包围[]
。
% ...
\makeatletter
\let\orig@graybox=\graybox
\def\graybox{
\@ifnextchar[{\graybox@opt}{\orig@graybox}
}
\def\graybox@opt[#1]{
\orig@graybox[frametitle={#1}]
}
\makeatother
\begin{document}
\begin{graybox}[Gray Box Title]
\lipsum[1]
\end{graybox}
\begin{graybox}
\lipsum[1]
\end{graybox}
\end{document}