问题
我已为标题定义了某种字体样式,并希望在文档的其他部分使用该样式。如何访问该样式以便重复使用它?
注意:我想重现该样式作为代码重用的最佳实践。我也可以复制粘贴代码到文档的特定部分,但我认为以后这可能是一个不明智的决定。
平均能量损失
\documentclass{article}
\usepackage{caption}
\DeclareCaptionType{problem}[Problem]
\DeclareCaptionLabelFormat{problemlabel}{\color{red}▶~~%
\sffamily#1~~#2}
\captionsetup[problem]{ labelformat=problemlabel }
\begin{document}
\captionof{problem}{This is a caption with the style ``problemlabel.''}
This text should somehow also by styled like a ``problemlabel.'' How can this be achieved?
\end{document}
基本原理
重复使用代码的原因如下。我定义了一个框,用于区分数学问题,这些问题也都有编号和标题。然而,在特定情况下,我希望有一个带有标题的框,但标题中没有数字,例如“问题 —标题”而不是“问题 9 —标题“为此,我想使用我的环境的星号版本。
caption 包提供了命令 \captionof*{}{},但是,这会删除整个标签,而不仅仅是数字。因此,我尝试在框的设计中重新使用原始标题标签的样式,但现在自己写下“问题”。
下面的代码可以清楚地说明这一点:
\NewDocumentEnvironment{problembox}{smo}{%
\begin{mdframed}[%
frametitle={%
\IfBooleanTF #1
{ \captionof*{problem}{#2} }%
{ \captionof{problem}{#2} }%
\IfNoValueF{#3}{\label{#3}}%
},
style=boxstyle,
]
\small
}{%
\end{mdframed}
}
代替行{ \captionof*{problem}{#2} }%
,我希望有类似的东西{ {\captionlabelstyle Problem} #2 }
。这就是为什么我需要访问为标题标签定义的样式。
答案1
对于这个任务,我根本不会使用标题。我还认为,对环境使用星号参数非常不寻常。我宁愿定义一个带星号的变体(其中星号是环境名称的一部分)。然后,我不会为标签定义可选参数。\label
如果需要,只需添加它就很容易了:
\documentclass{article}
\usepackage{xparse,mdframed,xcolor,wasysym}
\newcounter{problem}
\newcommand*\problemformat{\sffamily\color{green!30!blue!70}}
\NewDocumentEnvironment{problembox}{m}{%
\refstepcounter{problem}%
\mdframed[
frametitle = {\RIGHTarrow\quad Problem \theproblem: #1} ,
frametitlefont = \problemformat
]
\problemformat\small
}{%
\endmdframed
}
\NewDocumentEnvironment{problembox*}{m}{%
\mdframed[
frametitle = {\RIGHTarrow\quad Problem: #1} ,
frametitlefont = \problemformat
]
\problemformat\small
}{%
\endmdframed
}
\usepackage{lipsum}
\begin{document}
\lipsum[4]
\begin{problembox}{foo}\label{prb:foo}
\lipsum[2]
\end{problembox}
See problem~\ref{prb:foo} \lipsum[4]
\begin{problembox*}{foo}
\lipsum[2]
\end{problembox*}
\lipsum[4]
\end{document}