Babel 和列表导致 classicthesis 中的分段标题出现硬空格问题

Babel 和列表导致 classicthesis 中的分段标题出现硬空格问题

有问题的 MWE:

\documentclass[headinclude,footinclude]{scrbook}%\documentclass[headinclude,footinclude,a4paper]{scrbook}
\usepackage{classicthesis}%\usepackage[style=arsclassica]{classicthesis}

\usepackage[english]{babel}
\usepackage[utf8]{inputenc}%\usepackage[ansinew]{inputenc}
%\usepackage[T1]{fontenc}

\usepackage{listings}%\usepackage{listingsutf8}
\lstset{breaklines=true}

\begin{document}

%\tableofcontents

\chapter{Exemplary~chapter~title here}
\section{Exemplary~section~title here}

%\lstinputlisting{a.py}
\begin{lstlisting}
    a = 1;
    a = 1;
    a = 1;
    a = 1;
    a = 1;
    a = 1;
    a = 1;
    a = 1;
    a = 1;
    a = 1;
    a = 1;
    a = 1;
    a = 1;
    a = 1;
    a = 1;
    a = 1;
    a = 1;
    a = 1;
    a = 1;
    a = 1;
    a = 1;
    a = 1;
    a = 1;
    a = 1;
    a = 1;
    a = 1;
    a = 1;
    a = 1;
    a = 1;
    a = 1;
    a = 1;
    a = 1;
    a = 1;
    a = 1;
    a = 1;
    a = 1;
    a = 1;
    a = 1;
    a = 1;
    a = 1;
    a = 1;
    a = 1;
    a = 1;
    a = 1;
    a = 1;
    a = 1;
    a = 1;
    a = 1;
    a = 1;
    a = 1;
    a = 1;
    a = 1;
    a = 1;
    a = 1;
    a = 1;
    a = 1;
    a = 1;
    a = 1;
    a = 1;
    a = 1;
    a = 1;
    a = 1;
    a = 1;
    a = 1;
    a = 1;
    a = 1;
    a = 1;
    a = 1;
    a = 1;
    a = 1;
    a = 1;
    a = 1;
    a = 1;
    a = 1;
    a = 1;
    a = 1;
    a = 1;
    a = 1;
    a = 1;
    a = 1;
    a = 1;
    a = 1;
    a = 1;
    a = 1;
    a = 1;
    a = 1;
    a = 1;
    a = 1;
    a = 1;
    a = 1;
    a = 1;
    a = 1;
    a = 1;
    a = 1;
    a = 1;
    a = 1;
    a = 1;
    a = 1;
    a = 1;
    a = 1;
    a = 1;
    a = 1;
    a = 1;
    a = 1;
    a = 1;
    a = 1;
    a = 1;
    a = 1;
    a = 1;
    a = 1;
    a = 1;
    a = 1;
    a = 1;
    a = 1;
    a = 1;
    a = 1;
    a = 1;
    a = 1;
    a = 1;
    a = 1;
    a = 1;
    a = 1;
    a = 1;
    a = 1;
    a = 1;
    a = 1;
    a = 1;
    a = 1;
    a = 1;
    a = 1;
    a = 1;
    a = 1;
    a = 1;
\end{lstlisting}

\end{document}

问题(下图中以红色突出显示):

  1. chapter和命令中使用的硬空格(波浪号)section在页眉中显示错误 - 有时是问题清单中以“)”括号结尾的代码部分(在本例中为:'␣␣␣␣␣␣a)'),有时也只是作为 ')' 括号。
  2. lstlisting列表中的某个换行符lstinputlisting丢失。不久之后,列表长度达到临界值,导致出现标题问题。

观察结果:

  1. 如果通过删除足够多的行来缩短列表,则列表最后一页的页眉问题最终会消失(但前面的页面似乎仍然受到影响)。
  2. 删除\usepackage[english]{babel}似乎可以防止这两个问题的发生。
  3. 删除\usepackage{classicthesis}也会删除问题。
  4. 这似乎与包\lccode`\~=0\relax中的错误无关listings(例如,文本大小写、列表和波浪符号)。


实际结果:

错误结果


错误结果(缩放)


期望结果的近似值:

期望结果


期望结果(缩放)

答案1

我无法说出问题的确切原因,但显然是 和 包(后者由 加载)之间的奇怪交互listings。触发babel该问题似乎需要四个条件:textcaseclassicthesis

  1. ~命令必须在标题中的文本中使用。如果您在此处使用普通空格,则输出没有问题。
  2. 必须lstlisting出现在页面上并跨越到下一页。如果您只使用纯虚拟文本,标题看起来会很正常。
  3. babel必须加载该包,这样~命令(\nobreakspace {})的正常定义就会被替换,\active@prefix ~\active@char~从而以某种方式触发问题。
  4. 最后,\lowercase必须涉及一个。在标题中classicthesis使用textcase的命令。这会使用 TeX 的原始 和,从而导致奇怪的行为。如果使用 重新定义,则可以看到相同的行为,但使用简单的 则不会。\MakeTextLowercase\lowercase~\MakeTextLowercase\def\MakeTextLowercase#1{\lowercase{#1}}\def\MakeTextLowercase#1{#1}

综上所述,listings您在问题中提到的错误似乎确实与此有关。至少我是这么认为的,因为它以某种方式操纵了 的小写代码~。所以我建议的解决方案是删除 的babel实现~并使用原始实现:

\let\origtilde=~
\usepackage[english]{babel}
\let~=\origtilde

相关内容