警告(pdf 后端):弹出空彩色页面堆栈 0

警告(pdf 后端):弹出空彩色页面堆栈 0

我已经收到这个警告,并且已经持续了几个小时(呃,大概 12 个小时了)。我一直在尝试缩小导致警告的原因,但无济于事。我设法将项目缩减到约 1000 行代码,但仍然会产生警告,但我尝试从约 1000 行代码中删去数十种不同的内容,到目前为止,无论我尝试删去多少行,警告都会消失,这让调试变得异常困难。当然,警告没有指向哪一行,文档中也没有视觉指示来指出哪里出了问题,从而为我指明正确的方向。

这里是指向产生警告的实际项目的链接。到目前为止,我已经设法推断出\includeonly{basics,apd}会重现错误,但如果您在此处删除basicsapd,警告就会消失。此外,虽然我还没有测试过任何两章组合,但它是我发现的唯一会重现警告的两章组合(并且没有章节本身会重现它)。

我还可以从这两个文件中删除大约一半的行,但仍然保留警告,但除了我删除的实际代码量之外,我没有在代码中看到任何模式可以重现或不重现警告。我还可以删除标题页、目录、参考资料和索引,但仍然保留警告。

我很抱歉不能给出任何形式的 MWE,但我真的无法给出更多\includeonly{basics,apd}经过数小时的实验更多的程度。希望至少有人知道这个错误是什么方法这样我就有更好的机会调试它?

(FWIW,我一直在使用的 pdf 后端是 LuaLaTeX,尽管我已经确认 pdfLaTeX 会产生同样的警告(来自 TeX Live 2016 发行版)。也许还值得注意的是 Texmaker(我当前的 IDE)不是报告此警告,我必须进入日志文件才能找到它。)

答案1

嗯,这意味着你破坏了颜色堆栈。与字体变化不同,颜色不是文本框的固有属性,因此颜色变化由标记状态变化的节点管理那是什么, 最初,很难在分页符上保持正确的颜色,因为宏包需要规范页面标题中的颜色,并且无法重置页面开头文本的当前颜色,因为分页程序无法轻松地在那里插入特殊颜色。

dvips 引入了颜色堆栈的概念,其中驱动程序维护一个在分页符处正确处理的颜色堆栈,并且宏层只需要将颜色推送和弹出到这个堆栈上,而不是试图在它无法控制的点设置“正确”的颜色。

pdftex(和 luatex)进一步扩展了此模型,并具有特定的推送/弹出命令

或多或少:

 \pdfcolorstack  push {red}
...
 \pdfcolorstack pop

因此,如果您有一个\colorstack pop没有匹配的推送,或者在乳胶宏包装器中,如果您有一个\reset@color没有\set@color


我想这可以修复它, \tcbtitle在结构文件中加载 tcolorbox 后进行修改:

\usepackage{tcolorbox} % Required for creating the theorem, definition, exercise and corollary boxes.

\makeatletter
\renewcommand\tcbtitle{\ifx\tcbtitletext\@empty\else%
  {\leavevmode\color{tcbcol@title}\kvtcb@fonttitle
 \kvtcb@haligntitle\kvtcb@before@title
  \tcbtitletext\kvtcb@after@title}\fi}
\makeatother

或者可能更好

\makeatletter
\renewcommand\tcbtitle{\ifx\tcbtitletext\@empty\else%
  {\kvtcb@fonttitle\kvtcb@haligntitle\kvtcb@before@title
\leavevmode\color{tcbcol@title}\tcbtitletext\kvtcb@after@title}\fi}
\makeatother

所以你把颜色推迟到之后\kvtcb@before@title

答案2

警告“弹出空颜色堆栈”通常是由于颜色堆栈命令顺序错误引起的。典型的情况是使用低级框集命令\setbox而不是 LaTeX 框集宏(\sbox、环境lrbox、...)。当 LaTeX 设置颜色时,颜色重置命令会在当前组之后发出。因此,LaTeX 框宏会在框的内容周围添加一个组层。如果没有这个额外的组,颜色重置(弹出颜色堆栈的操作)就会从框中泄漏出来并在错误的时间执行:

\documentclass{article}
\usepackage{color}
\begin{document}
\setbox0=\hbox{\color{red}Red}
\null
\end{document}

在盒子的开头,红色被放入堆栈中。然后关闭盒子,弹出操作从盒子中泄漏出来,并在使用盒子之前在盒子定义时执行。推送和弹出顺序混乱(在示例中,盒子未被使用,只有弹出操作特殊)。

解决方案:A组保留pop特殊功能在里面:

\setbox0{\begingroup\color{red}Red\endgroup}

因为它是\endgroup在框关闭之前插入的。LaTeX\sbox会自动执行此操作:

\sbox0{\color{red}Red}

相关内容