我将从一个最小失败的例子开始:
\documentclass{article}
\usepackage{listings}
\usepackage{color}
\lstdefinelanguage{x}{
escapechar={!}
}
\lstset{language=x,
breaklines=true,
backgroundcolor=\color{yellow}
}
\begin{document}
\newcommand{\mycommand}[1]{\textbf{#1}}
\begin{lstlisting}[language=x]
foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo bar bar bar bar
foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo !\mycommand{EUREKA}! bar bar bar bar
foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo !\mycommand{EUREKA }! bar bar bar bar
foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo bar bar bar bar
\end{lstlisting}
\end{document}
注意两行 EUREKA 之间的区别,唯一的区别是第二行还将尾随空格传递给\mycommand
。这应该不会对列表的呈现产生任何影响,对吧?但这是输出:
!EUREKA !
这里完全不需要换行符,尤其是缺少的颜色。我也可以通过使用(不带命令调用)填充转义部分来重现相同的行为。
请注意,我的定义\mycommand
是过于简单了——现实,我在这里进行一些条件检查,以决定是否应显示带有尾随空格的参数。我不可能放弃这个空间。
这种行为是软件包的 bug 还是功能listings
?如果是第一种情况,我可以在哪里报告这个 bug?还是我遗漏了其他内容?我期待您的支持!
答案1
问题是,它breaklines
基本上是一个连字符,只是没有连字符。TeX 尽力避免太多行使用连字符,因此非常乐意找到一个可以插入换行符而不用连字符的空间。
我认为将相关缺点设置为零以便列出是有意义的:
\makeatletter
\lst@AddToHook{InitVars}{\finalhyphendemerits=0\relax\doublehyphendemerits=0\relax}
\makeatother