我遇到了一个问题,我需要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