使用 xelatex 时可见空格字符会消失

使用 xelatex 时可见空格字符会消失

使用 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}

相关内容