是否可以在不指定 frametitle 键的情况下设置 mdframed newmdenv 的标题

是否可以在不指定 frametitle 键的情况下设置 mdframed newmdenv 的标题

我希望能够调用 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}

相关内容