lstlistings 代码默认看起来这么丑有什么原因吗?

lstlistings 代码默认看起来这么丑有什么原因吗?

我一直认为 LaTeX 的目的是让创作变得简单美丽的文档。然而,每次看到这些文档,lstlistings我都会情不自禁地对残缺的字距感到不解。例如,以下是从\tikzmark文档中截取的简单代码片段:

这里发生了什么事?

为什么这两个词的突出用法使用排版这么不同?它不是等宽字体,也不是成比例的,而是……其他的。我在顶部字符之间添加了垂直线,以展示古怪的对齐方式。

这也是我通常不使用该包而是使用tabulars\ttfamilyverbatim环境的原因。

那么,为什么要这样做呢?为什么要将丑陋作为默认设置,让人们寻找一种使其看起来更好的方法(从包含丑陋列表的论文和讲义的数量来看,似乎没有人愿意这样做),而不是默认让它看起来好看?是否有充分的技术或印刷原因来这样做,而不是使用适当的等宽字体(应该始终存在)或至少正确使用比例字体?

是否有其他软件包可以更好地默认列出实际程序代码(即不是伪代码中的算法)?

还有其他关于如何让lstlistings 看起来更好的问题,比如我怎样才能使 lstlisting 看起来和 verbatim 一模一样?或者lstlisting、tt 字体和对齐。,所以这实际上不是这里主题。

\documentclass{article}
\usepackage{listings}
\begin{document}
\begin{lstlisting}
\usepackage{tikz}
\usetikzlibrary{tikzmark}
\end{lstlisting}
\end{document}

答案1

(实际答案:使用\lstset{basicstyle=\ttfamily}


笑话答案(做不是去做!)

我会帮你解决这个问题。这里有一个自定义包,名为fritzlistings,建立在 之上listings,默认使用打字机字体。

\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{fritzlistings}%
 [2014/09/08 v0.1 Fritz's listings]
\DeclareOption*{\PassOptionsToPackage{\CurrentOption}{listings}}
\ProcessOptions\relax
\RequirePackage{listings}
\lst@Key{basicstyle}\ttfamily{\def\lst@basicstyle{#1}}
\endinput

好了。现在开心了吗?:p

在此处输入图片描述

\documentclass{article}

\usepackage{fritzlistings}

\begin{document}
\begin{lstlisting}
\usepackage{tikz}
\usetikzlibrary{tikzmark}
\end{lstlisting}
\end{document}

更严重的是...

我禁不住对残缺的字距感到畏缩。[...] 这也是我通常根本不使用该包而是使用带有\ttfamilyverbatim环境的制表符的原因。

tabular如果你正在排版源代码,使用环境与\ttfamily使用环境相比有什么优势lstlisting?我想不出任何优势。此外,你可以配置listings以复制环境的外观verbatim(如我怎样才能使 lstlisting 看起来和 verbatim 一模一样?),但具有自动换行这一不可忽视的好处。

为什么要将丑陋作为默认设置,并让人们寻找一种方法使其看起来好看(从包含丑陋列表的论文和讲义的数量来看,似乎没有人关心这一点),而不是让它默认看起来好看?

我同意你的观点, 的输出listings很基础,而且可以说是丑陋的,但情人眼里出西施。你可能觉得很美的东西,别人可能觉得丑得要命。我认为 的作者 Carsten Heinzlistings只是不想把任何特定的风格强加给用户。特别是,你会注意到 中的语言定义lstdvrs.dtx就是这样:语言定义; 诸如 之类的键keywordstyle在这些语言定义中没有使用。

该软件包提供了多种自定义输出外观的方法。您可以根据需要使用它们(我通常会将我最喜欢的样式保存在自定义 LaTeX 软件包中),然后广而告之;这比抱怨更有助于改善当前状况。

是否有一个好的、技术性的或印刷上的理由来这样做,而不是使用适当的等宽字体(应该始终存在)或至少正确使用比例字体?

我同意你的观点,默认columns=fixed和不默认并cmr不相容。

  • 并且,columns=fixedcmtt
  • columns=flexible(或fullflexible) 和cmr

对我来说更有意义,尽管其他人可能不同意这一点。那么为什么这是默认设置?谁知道呢……我所能收集到的信息listings.dtx是,basicstyle密钥(在 v0.18 中引入)早于columns密钥(v1.0)。我无法访问该软件包的完整开发历史,因此我只能进行推测。

我的观点是,listings默认字体是出于历史原因。我猜想在 v1.0 中listings引入 key 之前,最初根本没有对字距进行任何改动;在此之前,这可能是列表可接受的字体选择。然后 v1.0 出现了,但 Carsten 可能认为在那个阶段将默认字体更改为会让现有用户感到不快,因此他决定坚持使用。columnscmrcmttlistingscmr

当然,只有卡斯滕·海因茨(或者可能是其中一位维护者,无论是现任还是退休的)可以为这一选择提供确凿的理由。

是否有其他软件包可以更好地默认列出实际程序代码(而不是伪代码中的算法)?

由于 Python 的缘故,基于 Pygments 的软件包(例如mintedverbmentspythontex)比列表具有一些优势;特别是,

  • 卓越的词汇分析/扫描功能,
  • 完全支持 Unicode,

想到了。然而,在定制方面从内部LaTeX (及其同类) 文档,listings胜出;毫无疑问。至少,目前情况如此;在这方面,minted最终可能会赶上。listings

相关内容