列表不会在纯连字符处断开

列表不会在纯连字符处断开

我遇到了一个问题,我需要listings在连字符 ( ) 处中断包-。我将在下面给出 MWE。

根据https://tex.stackexchange.com/a/140725/7166连字符是“其他”类型的字符,如果(默认设置)则应允许换行breakatwhitespace=false。在我要排版的代码中(包含由其他软件生成的文件),给出了纯连字符的长分隔线。这些似乎没有按预期断开。

相反,只有在字母/其他字符的边界处才可能进行换行。添加\allowbreak如下内容https://tex.stackexchange.com/a/208254/7166没有帮助。

这是列表中的错误还是我错过了一些选项?

\documentclass[a4paper,10pt]{article}
\usepackage[utf8]{inputenc}
\usepackage{listings}
\lstset{
    basicstyle=\ttfamily\small,
    breaklines=true,
    frame=single
}
\begin{document}
\begin{lstlisting}
----------------------------------------------------a-------------------------------------------
-----------------------------------------------------------------------------------------------
\end{lstlisting}
\end{document}

答案1

在您的示例中,使用literate允许在之后中断的选项-是可行的。请确保listings安装了最新版本的软件包。您可以使用以下方式全局设置该选项

\lstset{literate={-}{{-\allowbreak}}{1}}

或选择性地列出单个列表

\begin{lstlisting}[literate={-}{{-\allowbreak}}{1}]

在此处输入图片描述

关于为什么默认情况下中断在这里不起作用的说明。扩展listings文档描述字符序列的构建方式:

这些“类”如何协同工作?假设当前字符串是tr。然后 lettery只需附加字母即可得到try。下一个非字母(和非数字)导致字符的输出。然后我们收集所有即将到来的非字母,直到再次到达字母。这会导致非字母的输出,依此类推。

这意味着所有连字符都会粘合在一起形成一个类似于标记的序列,并且不会在行尾断开,除非您使用该literate选项明确允许在其中断开。

答案2

问题literate是它允许断开连字符之前和之后。我只想要“之前”,最后这样做了:

\makeatletter
% Allow break after, but not before hyphen
\def\lst@AppendHyphen#1{\lst@Append{-}\lst@Output\lst@letterfalse}
\def\lst@ProcessHyphen{\lst@whitespacefalse \lst@AppendHyphen}
\lst@CCPutMacro
    \lst@ProcessHyphen {"2D}{\lst@ttfamily{-{}}{\textminus}}
    \@empty\z@\@empty
\makeatother

相关内容