列表包将连字符更改为减号

列表包将连字符更改为减号

listings使用默认比例字体时,软件包会将源代码连字符(-,U+002D)转换为减号(,U+2212),但使用默认等宽打字机字体时则不会。一个最小的工作示例:

\documentclass{article}
\usepackage{listings}
\lstset{language=C}

\begin{document}
  \lstinline[basicstyle=\rmfamily]{--x} \textrm{-{}-x} \par
  \lstinline[basicstyle=\sffamily]{--x} \textsf{-{}-x} \par
  \lstinline[basicstyle=\ttfamily]{--x} \texttt{-{}-x}
\end{document}

前两行渲染清楚地显示了长减号和短连字符之间的区别:

长减号取代罗马和无衬线列表中的短连字符,但不等宽

这不仅仅是一个美学问题。清单中的代码确实不再正确。减号不是连字符,C(以及大多数其他语言)的语法不将它们视为可互换的。 --x是有效的 C 代码,但−−x事实并非如此。如果一个不懂 Unicode 的人试图从这样的清单中复制和粘贴代码,她可能会发现它无法编译,但对问题感到困惑。

如何防止listings连字符变成减号?

答案1

添加literate={-}{-}1到列表集。例如:

\documentclass{article}
\usepackage{listings}
\lstset{language=C, literate={-}{-}1}

\begin{document}
  \lstinline[basicstyle=\rmfamily]{--x} \textrm{-{}-x} \par
  \lstinline[basicstyle=\sffamily]{--x} \textsf{-{}-x} \par
  \lstinline[basicstyle=\ttfamily]{--x} \texttt{-{}-x}
\end{document}

在此处输入图片描述

清单手册第 6.4 节。

相关内容