使用 TeX Live 2019(手动安装),这是我的代码:
\documentclass[french]{article}
\usepackage{ifxetex}
\ifxetex
\usepackage{fontspec}
\else
\usepackage{lmodern}
\fi
%
\usepackage{babel}
\usepackage{listings}
%
\begin{document}
\begin{lstlisting}[language=Python,showstringspaces=true,basicstyle=\ttfamily]
# un commentaire
i = 1
while i <= 5:
print(i)
i = i + 1
print('Fini !')
\end{lstlisting}
\end{document}
!
使用 pdflatex 时,会出现之前可见的空间'Fini !'
。使用 xelatex 时,它会消失...
在 TeX Live 2015/dev/Debian 上,它同时出现于 pdflatex 和 xelatex 中...
如何在 TeX Live 2019 上使用 xelatex 获取视觉空间?
答案1
当字体系列为 时,的定义\lst@visiblespace
会进行listings
排版,但是 Latin Modern Mono 的 OTF 版本在那里没有可见的空间。\char32
\ttdefault
\documentclass[french]{article}
\usepackage{ifxetex}
\ifxetex
\usepackage{fontspec}
\else
\usepackage[T1]{fontenc} % <- don't forget
\usepackage{lmodern}
\fi
\usepackage{babel}
\usepackage{listings}
\ifxetex
\makeatletter
\def\lst@visiblespace{\lst@ttfamily{\char"2423}\textvisiblespace}
\makeatother
\fi
\begin{document}
\begin{lstlisting}[language=Python,showstringspaces=true,basicstyle=\ttfamily]
# un commentaire
i = 1
while i <= 5:
print(i)
i = i + 1
print('Fini !')
\end{lstlisting}
\end{document}
我使用与 相同的字符\textvisiblespace
,即 U+2423 OPEN BOX。
使用最新版本的 LaTeX(2019 年 10 月),更好的补丁是
\def\lst@visiblespace{\lst@ttfamily\verbvisible\textvisiblespace}
甚至不需要有条件地执行。
到 2018 年为止,fontspec
用于修补\lst@visiblespace
,使其等于\fontspec_visible_space:
。最后一个版本没有,但这可能是一个错误。以下是如何恢复更好的代码:
\documentclass[french]{article}
\usepackage{ifxetex}
\ifxetex
\usepackage{fontspec}
\else
\usepackage{lmodern}
\fi
\usepackage{babel}
\usepackage{listings}
\ifxetex
\ExplSyntaxOn
\cs_set_eq:cN { lst@visiblespace } \fontspec_visible_space:
\ExplSyntaxOff
\fi
\begin{document}
\begin{lstlisting}[language=Python,showstringspaces=true,basicstyle=\ttfamily]
# un commentaire
i = 1
while i <= 5:
print(i)
i = i + 1
print('Fini !')
\end{lstlisting}
\end{document}