自动将前缀附加到 tcolorbox 的标题

自动将前缀附加到 tcolorbox 的标题

我希望有一个tcolorbox环境,将前缀“注释:”附加到给定的标题。因此,使用选项

title={My Title} 

到这个环境将产生一个标题Note: My Title

实现这一点的一种方法是让环境接受两个参数。第一个是通常的tcolorbox选项,第二个是标题。这就是MyNoteX下面 MWE 中的环境所做的。然而,我不喜欢这个,因为它的界面不再与我拥有的其他界面相似tcolorbox

问题:

如何修改MyNote环境,使其产生与MyNoteX更改相同的标题仅有的在序言中?

下面的 MWE 产生以下输出:

在此处输入图片描述

但我希望第二个标题与第一个标题一致,而不需要任何变化 \begin{document}

可能的解决方案:

另一种方法是用键值定义我自己的环境,但这需要我在该环境中实现全部tcolorbox我想要使​​用的可能选项,并将它们传递给tcolorbox。我希望有办法修补title

代码:

\documentclass{article}
\usepackage{tcolorbox}
\usepackage{lipsum}

\newenvironment{MyNoteX}[2][]{%
    \par\noindent\ignorespaces%
    \begin{tcolorbox}[
        title={Note:~#2},
        coltitle=black,
        colbacktitle=green!25,
        #1
        ]%
}{%
    \end{tcolorbox}%
    \ignorespacesafterend%
}

\newenvironment{MyNote}[1][]{%
    \par\noindent\ignorespaces%
    \begin{tcolorbox}[
        title={Note},
        coltitle=black,
        colbacktitle=orange!25,
        #1
        ]%
}{%
    \end{tcolorbox}%
    \ignorespacesafterend%
}

\pagecolor{white}
\begin{document}

\begin{MyNoteX}[]{My Title}
    This is produced by the \verb|MyNoteX| environment.
\end{MyNoteX}

\begin{MyNote}[title={My Title}]
    This is produced by the \verb|MyNote| environment.
    Title is \emph{not} correct.
\end{MyNote}

\end{document}

答案1

请参阅此答案末尾的更新...

在此处输入图片描述

tcolorbox\kvtcb@title在评估密钥后将标题存储在 中title。添加前缀的一种方法是使用密钥code并使用\pretocmdfrom etoolbox,即\pretocmd{\kvtcb@title}{Note:~}{}{}

在 Ulrike Fischer 提醒我关键之后before title,其实就简单多了:

before title={Note:~}

这在特殊环境中显示mytitlebox tcolorbox,它只有一个可选参数而没有第二个强制参数。

\documentclass{article}
\usepackage{tcolorbox}
\usepackage{lipsum}


\newenvironment{MyNoteX}[2][]{%
    \par\noindent\ignorespaces%
    \begin{tcolorbox}[
        title={Note:~#2},
        coltitle=black,
        colbacktitle=green!25,
        #1
        ]%
}{%
    \end{tcolorbox}%
    \ignorespacesafterend%
}

\newenvironment{MyNote}[1][]{%
    \par\noindent\ignorespaces%
    \begin{tcolorbox}[
        title={Note},
        coltitle=black,
        colbacktitle=orange!25,
        #1,
        ]%
}{%
    \end{tcolorbox}%
    \ignorespacesafterend%
}

\makeatletter

\newtcolorbox{mytitlebox}[1][]{%
  nobeforeafter,
  coltitle=black,
  colbacktitle=orange!25,
  code={\noindent},
  before title={Note:~},
  #1,
}

\makeatother


\pagecolor{white}
\begin{document}

\begin{MyNoteX}[]{My Title}
    This is produced by the \verb|MyNoteX| environment.
\end{MyNoteX}

\begin{MyNote}[title={My Title}]
    This is produced by the \verb|MyNote| environment.
    Title is \emph{not} correct.
\end{MyNote}

\begin{mytitlebox}[title={My Title}]
  Foo
\end{mytitlebox}

\end{document}

更新

一种变体,首先评估标题title=Note,如果没有标题,则重新注入。

\documentclass{article}
\usepackage[most]{tcolorbox}
\usepackage{lipsum}

\makeatletter

\newtcolorbox{mytitlebox}[1][]{%
  nobeforeafter,
  coltitle=black,
  colbacktitle=orange!25,
  code={\noindent\pgfkeysalsofiltered{#1}%
    \expandafter\ifblank\expandafter{\kvtcb@title}{\pgfkeysalsofiltered{title=Note}}{\pgfkeysalsofiltered{title=Note:~}}},
}

\makeatother


\pagecolor{white}
\begin{document}

\begin{mytitlebox}[title={My Title}]
  Foo
\end{mytitlebox}

\begin{mytitlebox}[colbacktitle={yellow!20}]
  Foo
\end{mytitlebox}


\end{document}

在此处输入图片描述

相关内容