当将 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
中。basicstyle
lstset
\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}
我基于这个答案这个相关问题。