凑个热闹。
在MWE
中凡与此问题无关联的内容都应该酌情删改,否则可能影响潜在答题者的解答质量。
实际上,你的导言区只需要这几句代码:
% !TEX program = pdflatex
\documentclass[openany]{book}
\usepackage[many]{tcolorbox}
\usepackage{hyperref}
应该等你确实需要了,再往导言区加东西。例如,添加你的额外需求实现\Doubleref
:
% !TEX program = pdflatex
\documentclass[openany]{book}
\usepackage[many]{tcolorbox}
\usepackage{hyperref}
\NewDocumentCommand{\Doubleref}{m}{{\color{red}Definition \ref{#1} (\nameref{#1})}}
总之,做MWE
时秉持越少越好原则,才能更方便地排查错误。
然后我也浅答一个,完全用tcolorbox实现的效果:
而要实现这个效果,只需如下定制即可:
\newtcbtheorem
[number within=chapter]
{definition}
{Definition}
{
fonttitle=\bfseries\color{black},
opacityback=0,
left=.25em,
right=.25em,
top=.45ex,
bottom=.45ex,
before skip=2pt plus 2pt minus 1pt,
after skip =6pt plus 2pt minus 4pt,
arc=0pt,
enhanced,
breakable,
boxrule=0pt,
frame hidden,
borderline south={1pt}{0mm}{black},
borderline west ={1pt}{0mm}{black},
borderline east ={1pt}{0mm}{black},
attach boxed title to top left={
yshift=-3mm,
yshifttext=-1mm,
xshift=3em
},
overlay unbroken and first={
\draw [line width=1pt] (title.west) -- ++(-3em+.5pt,0pt) -- ++(down:\baselineskip);
\draw [line width=1pt] (title.east) -- ++( 3em,0pt);
},
overlay middle and last={},
boxed title style={
frame style ={fill=none},
interior style={fill=none},
left=.25em,
right=.25em,
top=.45ex,
bottom=.45ex
}
}
{def}
其中参数的含义是:
\newtcbtheorem
[<初始化选项>] %上面用到了计数器关联,也可以在此处理cleveref兼容问题
{<新环境的name>} %用于\begin{}...\end{}的环境名
{<用于展示的name>} %用于排版结果中展示的环境名
{<定制tcb的选项>} %主要是操纵外观
{<标签的前缀>} %人为将标签分为前缀、分隔符(默认使用英文冒号)和主体
然后在正文区使用
\begin{<新环境的name>}{<定理的标题文本>}{<标签的主体>}
...
\end{<新环境的name>}
例如
\begin{definition}{GouGu}{gougu}
...
\end{definition}
即可创建一个基于定制tcolorbox的新定理。
然后在正文区其他地方使用
\Doubleref{<标签的前缀>:<标签的主体>}
例如
\Doubleref{def:gougu}
即可交叉引用。
如需兼容cleveref
宏包,需注意导言区的代码顺序,且需要在\newtcbtheorem
的可选参数[<初始化选项>]
里增加,Crefname={Definition}{Definitions}
。然后即可采用由cleveref
宏包提供的交叉引用类型。
原题没有提出断页需求,因此未进行测试,代码已修改。原来使用的frame code app
在不断页的条件下的确可以正常工作,但是当分页发生时,主盒子会被保存到一个寄存器中,所以原先的主盒子会消失,这将导致原先的盒子的追加代码失效。在tcb手册中对此问题有专门叙述,解决方案之一是分别定制盒子的前中后部分以及不可断页共四种类型的皮肤。完整代码在此。
问 tcolorbox 实现某种特定的边框