我在编写的某些内容的多个地方使用了 lstlisting 环境,语言设置为 Python 或 Mathematica。在这两种情况下,等号合并在一起看起来像一个长等号(或者,如果它们实际上没有合并,它们非常接近,这很烦人)。我该如何解决这个问题?
\,
我的想法是在有双等号时在第一个等号后添加,但是 a. lstlisting 故意关闭 LaTeX 命令,并且 b. 这很乏味和烦人。
梅威瑟:
\documentclass{article}
\usepackage{listings}
\begin{document}
\begin{lstlisting}
something == something
\end{lstlisting}
\end{document}
答案1
请参阅§2.10固定和灵活列的listings
文档。
在 MWE 中,您使用的columns=fixed
是可变宽度字体。这意味着字体的不同字形/字符具有不同的宽度。如果您要写一行l
s 和一行M
s,则“l”和“M”不会对齐。因此,要保持代码的正确缩进和对齐,listings
必须使用一些技巧。
[这固定的格式化放置n字符放入宽度为n× 'base width',示例中的 base width 为 0.6em。格式会缩小和拉伸字符之间的空间,以使其适合框。[...]
如果你不需要或者不喜欢这个,你应该使用灵活的格式。所有字符都按其自然宽度排版。特别是,它们从不重叠。如果一个单词需要的空间比保留的空间多,则行的其余部分将简单地向右移动。这三种格式之间的区别在于,完全灵活格式不关心其他任何事情,而正常灵活和空间灵活格式会在字符串需要的空间小于“保留”时尝试修复列对齐。
文档解释道
摘要中我们可以说:固定列格式破坏了字体设计者想要的间距,而灵活的格式破坏了程序员(可能)想要的列对齐。
由于等号很长,所以它们之间的空间恰好缩小到两个等号合并在一起的程度。
那么你能做什么来解决这个问题呢?
使用固定宽度的打字机字体。在这些字体中,所有字符的宽度都相同,因此无需大量拉伸和缩小空格。一切都自然对齐。
basicstyle=\ttfamily
如果您想保留粗体和斜体/倾斜标记,则必须找到支持粗体和倾斜的打字机字体。默认的 Computer Modern
\ttfamily
没有粗体版本(将 \ttfamily 与 \bfseries 结合使用(或如何在等宽字体中启用粗体))。拉丁现代字体(\usepackage{lmodern}
)采用粗体字体,与常规字体非常相似,因此您可能想尝试一下lighttt
(在这种情况下,您需要注意lmodern-lighttt 中的斜体字体)。您可以增加该
basewidth
参数。这样可以增加字形需要放入的框的宽度,从而在等号周围留出一些空间。当然,所有其他单词的字母间距都会增加。固定模式的默认值为 0.6em,灵活模式的默认值为 0.45em。在本例中,该值已增加到 0.7em。空格仍然很模糊,因此可能有人想进一步增加宽度,但这当然会使其他字母之间的距离进一步拉大。
使用
columns=flexible
或者
columns=fullflexible
虽然这里可能不太容易计算出空格的确切数量,但第二行缩进的事实仍然非常明显。缩进级别不要迷失这些设置,只有确切的空间数量可能很难确定。
\documentclass{article}
\usepackage[lighttt]{lmodern}
\usepackage{listings}
\lstset{%
basicstyle=\ttfamily,
language=python,
}
\begin{document}
\begin{lstlisting}
if something == something:
somethingelse(something)
\end{lstlisting}
\begin{lstlisting}[basicstyle=\normalfont, basewidth=0.7em]
if something == something:
somethingelse(something)
\end{lstlisting}
\begin{lstlisting}[basicstyle=\normalfont, columns=flexible]
if something == something:
somethingelse(something)
\end{lstlisting}
\begin{lstlisting}[basicstyle=\normalfont, columns=fullflexible]
if something == something:
somethingelse(something)
\end{lstlisting}
\end{document}
答案2
如果您想使用标准字体来列出列表,我建议设置灵活或完全灵活的列;如果您更喜欢固定列(以令人讨厌的字母间空格为代价),请增加宽度(这取决于文档字体)。
\documentclass{article}
\usepackage{listings}
\lstset{
basewidth={0.7em,0.5em},
}
\begin{document}
\begin{lstlisting}[language=C]
something == something
\end{lstlisting}
\begin{lstlisting}[language=C,columns=flexible]
something == something
\end{lstlisting}
\begin{lstlisting}[language=C,columns=fullflexible]
something == something
\end{lstlisting}
\end{document}