列表中的等号合并在一起

列表中的等号合并在一起

我在编写的某些内容的多个地方使用了 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是可变宽度字体。这意味着字体的不同字形/字符具有不同的宽度。如果您要写一行ls 和一行Ms,则“l”和“M”不会对齐。因此,要保持代码的正确缩进和对齐,listings必须使用一些技巧。

[这固定的格式化放置n字符放入宽度为n× 'base width',示例中的 base width 为 0.6em。格式会缩小和拉伸字符之间的空间,以使其适合框。[...]

如果你不需要或者不喜欢这个,你应该使用灵活的格式。所有字符都按其自然宽度排版。特别是,它们从不重叠。如果一个单词需要的空间比保留的空间多,则行的其余部分将简单地向右移动。这三种格式之间的区别在于,完全灵活格式不关心其他任何事情,而正常灵活和空间灵活格式会在字符串需要的空间小于“保留”时尝试修复列对齐。

文档解释道

摘要中我们可以说:固定列格式破坏了字体设计者想要的间距,而灵活的格式破坏了程序员(可能)想要的列对齐。

由于等号很长,所以它们之间的空间恰好缩小到两个等号合并在一起的程度。

那么你能做什么来解决这个问题呢?

  1. 使用固定宽度的打字机字体。在这些字体中,所有字符的宽度都相同,因此无需大量拉伸和缩小空格。一切都自然对齐。

    basicstyle=\ttfamily
    

    如果您想保留粗体和斜体/倾斜标记,则必须找到支持粗体和倾斜的打字机字体。默认的 Computer Modern\ttfamily没有粗体版本(将 \ttfamily 与 \bfseries 结合使用(或如何在等宽字体中启用粗体))。拉丁现代字体(\usepackage{lmodern})采用粗体字体,与常规字体非常相似,因此您可能想尝试一下lighttt(在这种情况下,您需要注意lmodern-lighttt 中的斜体字体)。

    <code>basicstyle=\ttfamily,</code>

  2. 您可以增加该basewidth参数。这样可以增加字形需要放入的框的宽度,从而在等号周围留出一些空间。当然,所有其他单词的字母间距都会增加。

    <code>basicstyle=\normalfont, basewidth=0.7em</code>

    固定模式的默认值为 0.6em,灵活模式的默认值为 0.45em。在本例中,该值已增加到 0.7em。空格仍然很模糊,因此可能有人想进一步增加宽度,但这当然会使其他字母之间的距离进一步拉大。

  3. 使用columns=flexible

    <code>basicstyle=\normalfont,列=flexible</code>

    或者columns=fullflexible

    <code>basicstyle=\normalfont,columns=fullflexible</code>

    虽然这里可能不太容易计算出空格的确切数量,但第二行缩进的事实仍然非常明显。缩进级别不要迷失这些设置,只有确切的空间数量可能很难确定。

\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}

在此处输入图片描述

相关内容