tcolorbox 设置 breakable 后断页颜色失效问题及解决方案
一、问题背景
在使用 tcolorbox 排版长文本时,常常需要开启 breakable 选项,以支持盒子内容跨页显示。但在实际使用过程中,很多人会遇到这样一个问题:
在 tcolorbox 中设置了字体颜色(如 red),当盒子发生断页后,断页之后的文字颜色恢复为默认黑色,与断页之前不一致。
该问题在排版示例、代码说明、强调文本等场景中非常常见,尤其是在写书籍、论文或技术文档时,会严重影响排版一致性。
二、问题复现示例
下面给出一个最小示例,用于复现该问题:
latex
\documentclass[a4paper,11pt]{book}
\usepackage{lipsum}
\usepackage[most]{tcolorbox}
\newcommand{\example}[1]{%
\begin{tcolorbox}[
breakable,
enhanced,
colback=gray!10,
extras={\color{red}#1}
]
#1
\end{tcolorbox}
}
\begin{document}
\example{\lipsum}
\end{document}
现象说明:
- 在第一页中,文本颜色为红色;
- 当
tcolorbox内容发生断页后; - 断页之后的文字颜色变为默认黑色。
三、问题原因分析
根据 tcolorbox 官方文档说明:
颜色命令在可断页盒子(breakable box)发生分页时会失效。
这是因为:
breakable的tcolorbox本质上会被拆分为多个内部 box;- 普通的
\color{}或extras中的颜色命令不会自动继承到断页后的 box; - 因此,断页之后颜色状态被重置。
关于 use color stack 选项
tcolorbox 提供了 use color stack 选项,用于在分页时保持颜色状态:
latex
\begin{tcolorbox}[breakable, use color stack]
⚠️ 但需要注意:
use color stack仅对pdflatex有效;- 在
xelatex或lualatex下无效; - 并且该选项必须放在
breakable前面。
在实际写论文、写书时,很多人使用的是 xelatex,因此该方法往往不可用。
四、推荐解决方案(通用 & 稳定)
在不依赖 use color stack 的前提下,推荐使用 colupper 和 collower 选项,分别控制断页前后文本颜色。
方案核心思想
tcolorbox 在分页时,会将内容拆分为:
- upper 部分(断页前)
- lower 部分(断页后)
我们可以分别指定它们的文字颜色。
五、正确写法示例
latex
\documentclass[a4paper,11pt]{book}
\usepackage{lipsum}
\usepackage[most]{tcolorbox}
\begin{document}
\begin{tcolorbox}[
breakable,
enhanced,
colback=gray!10,
colupper=black, % 断页前文字颜色
collower=red, % 断页后文字颜色
segmentation hidden % 可选:隐藏分页分隔线
]
Black text before page break.
\tcblower
\lipsum
\end{tcolorbox}
\end{document}
参数说明
colupper:设置\tcblower之前的文字颜色;collower:设置\tcblower之后的文字颜色;\tcblower:人为指定分页点(也可由 tcolorbox 自动分页);segmentation hidden:隐藏上下部分之间的虚线分隔,更美观。
六、方案优点总结
✔ 适用于 pdflatex / xelatex / lualatex
✔ 颜色在断页前后完全可控
✔ 不依赖 color stack,稳定可靠
✔ 适合论文、书籍、长文本排版
七、结论
当 tcolorbox 开启 breakable 后,颜色在断页处失效并非 bug,而是排版机制所致。
在跨编译引擎、追求稳定排版效果的情况下:
推荐使用
colupper + collower的方式控制断页前后文字颜色,而不是依赖extras或\color命令。