Listings + Tcolorbox 分页符重置颜色

Listings + Tcolorbox 分页符重置颜色

我想lstlisting在 中拥有一个环境tcolorbox。问题是,当有分页符时,使用breakable,列表选项的颜色组件basicstyle在分页符后重置,文本返回黑色。当您仅使用 设置颜色时也会出现同样的问题\color{<color>},但可以通过重新声明颜色声明来解决这个问题。

(虽然,这似乎不那么容易,因为你需要知道盒子会在哪里断裂,而且由于某种原因,断裂后颜色不会立即重置,我通过\ \kern-1ex\color{<color>}在重新声明时添加和删除空格来解决这个问题,这有点像黑客行为,但这不是我要解决的问题。)

这个问题是相关的,但解决方案(选项coltexttcolorbox不可行,因为我不希望所有文本都改变颜色。我想要一些文本以默认颜色解释代码片段的作用,然后环境中的文本lstlisting应该全部是我为选项设置的颜色basicstyle

我还在这个网站上找到了关于类似问题的讨论,但它与 XeLaTeX 有关,我在 TeXLive 2021、TeXLive 2020(均在背面)和 MiKTeX 上尝试过这个问题,其中相关的软件包版本是

  • tcolorbox4.51
  • xcolor2.12
  • listings1.8天

我非常确定这个问题与默认颜色有关,因为其他选项(basicstyle=\itshape例如)在分页符后不会重置。其他选项(例如)中的颜色也是如此,keywordstyle=\color{blue}这在分页符的两侧都有效,前提是您设置了语言并使用了有效的关键字。

梅威瑟:

\documentclass{article}
\usepackage{xcolor}
\usepackage[listings]{tcolorbox}
\tcbuselibrary{breakable}
\usepackage[top=1cm, bottom=1.5cm]{geometry} % decrease margins to make images smaller
\begin{document}
    ~\vspace{23cm}\obeylines
    % Example
    \begin{tcolorbox}[breakable]
    \color{red}
    1 Test
    2 Test
    3 Test % line breaks here
    % \ \kern-1ex\color{red}4 Test  % replace line below with this to get around colour swapping back
    4 Test
    5 Test
    6 Test
    \end{tcolorbox}
    \vspace{21cm}
    % Standard use case:
    \begin{tcolorbox}[breakable]
        Some text explaining what the code does, in the default black colour.
        \begin{lstlisting}[gobble=12, basicstyle=\color{red}, escapechar=|]
            some code, which should all be the same colour
            this line is after the page break and is back to black
            can't redeclare color: \color{red} still black
            can't escape to redeclare: |\color{red}| still black
        \end{lstlisting}
    \end{tcolorbox}
\end{document}

第一的tcolorboxtcolorbox 拆分页面,分页符前的文本为红色,分页符后的文本为黑色

第二tcolorboxtcolorbox 拆分页面,分页符前的文本为红色,分页符后的文本为黑色,此时文本包括列表环境,表明您无法在逐字环境中更改颜色

答案1

您可以使用use color stack键。请注意,它应该位于可破坏键之前,并且会影响间距:

\documentclass{article}
\usepackage{xcolor}
\usepackage[listings]{tcolorbox}
\tcbuselibrary{breakable}
\usepackage[top=1cm, bottom=1.5cm]{geometry} % decrease margins to make images smaller
\begin{document}
    ~\vspace{23cm}\obeylines
    % Example
    \begin{tcolorbox}[use color stack,breakable]
    \color{red}
    1 Test
    2 Test
    3 Test % line breaks here
    % \ \kern-1ex\color{red}4 Test  % replace line below with this to get around colour swapping back
    4 Test
    5 Test
    6 Test
    \end{tcolorbox}
    \vspace{21cm}
    % Standard use case:
    \begin{tcolorbox}[use color stack,breakable]
        Some text explaining what the code does, in the default black colour.
        \begin{lstlisting}[gobble=12, basicstyle=\color{red}, escapechar=|]
            some code, which should all be the same colour
            this line is after the page break and is back to black
            can't redeclare color: \color{red} still black
            can't escape to redeclare: |\color{red}| still black
        \end{lstlisting}
    \end{tcolorbox}
\end{document}

相关内容