xelatex + frenchb 在 lstlisting 块中的某些字符前引入了额外的空格

xelatex + frenchb 在 lstlisting 块中的某些字符前引入了额外的空格

当将 babel 'frenchb' 与 xelatex 结合使用时,冒号和其他字符之前会引入空格。这对于散文来说非常好,但也适用于代码片段。当将代码渲染为等宽字体时,这会产生不可接受的结果。

下面的图片应该是“a:b:c”,但由于额外的空格,冒号被其他字母隐藏了:

在此处输入图片描述

它是用以下代码生成的:

\documentclass{report}
\usepackage{listings} 
\usepackage[frenchb]{babel} 

\lstset{basicstyle=\ttfamily, columns=fixed}

\begin{document}

\begin{lstlisting}
a:b:c
\end{lstlisting}

\end{document}

我不知道该如何解决这个问题。我已经尝试使用其他字体,但没有效果,而且columns=flexible由于多余的空格,设置会破坏垂直对齐。

答案1

解决方法是添加到的属性\NoAutoSpacing中。basicstylelstset

\documentclass{report}
\usepackage{listings} 
\usepackage[frenchb]{babel} 

\lstset{ basicstyle=\ttfamily\NoAutoSpacing, columns=fixed }

\begin{document}

\begin{lstlisting}
a:b:c
\end{lstlisting}

\end{document}

\NoAutoSpacing有记录这里。它是 中的一项功能frenchb.dtx,它定义了法语的所有语言定义宏。

对我来说仍然是个谜的是为什么 xelatex 需要这样做,而纯 latex 却不需要。

答案2

在 前面添加相关代码,当遇到 时\lstlisting分组执行。\begin{lstlisting}

\documentclass{report}

%Uncomment the following to try Polyglossia (and comment the babel line)
%\usepackage{polyglossia}
%\setmainlanguage{french}

\usepackage[frenchb]{babel}

\usepackage{listings}
\lstset{basicstyle=\ttfamily, columns=fixed}

\usepackage{etoolbox}
\makeatletter
\@ifundefined{XeTeXinterchartokenstate}
 {\pretocmd{\lstlisting}{\NoAutoSpacing}{}{}}
 {\pretocmd{\lstlisting}{\XeTeXinterchartokenstate=0 }{}{}}
\makeatother

\begin{document}

\begin{lstlisting}
a:b:c
\end{lstlisting}

\end{document}

这应该与使用 XeLaTeX 时使用的 Babel 3.9 新版本兼容\XeTeXinterchartokenstate(Polyglossia 已经这样做了)。我在 TeX Live 2013 的预发布版本上对其进行了测试。

答案3

带有法语选项的 Babel 使 : 成为活动字符。您可以使用 本地禁用此行为,\shorthandoff{:}然后使用 重新启用它\shorthandon{:}

这将产生以下(未经测试的)代码

\documentclass{report}
\usepackage{fontspec,listings} 
\usepackage[french]{babel} 

\lstset{basicstyle=\ttfamily, columns=fixed}

\begin{document}

\shorthandoff{:}
\begin{lstlisting}
a:b:c
\end{lstlisting}
\shorthandon{:}

\end{document}

我基于这个答案这个相关问题

相关内容