列表、文学编程和精美的排版

列表、文学编程和精美的排版

现在,我拖延着调整 LaTeX,而不是完成我的博士论文,我想知道在 LaTeX 中排版源代码(C#、C++、LISP、XML、BNF)最漂亮的方法是什么。目前,我正在使用该listings包和literate选项来搜索和替换一些具有数学等效符号的字符,例如:

\lstset{ %
  ...
  literate= {+}{{$+$}}1 {*}{{$*$}}1 {=}{{$\gets$}}1 
            {<=}{{$\leq$}}1 {>=}{{$\geq$}}1 {!=}{{$\neq$}}1 
            {==}{{$\equiv$}}1 {=>}{{$\leadsto$}}1
}

尽管人们可以在 CWEB 中找到一些符号灵感,但我想知道是否存在任何用于常见编程(和特定领域)语言的标准符号系统。或者也许有更合适的软件包(顺便说一句,我不是在寻找花哨的语法着色,这会破坏我的双色文档)。


由于有些用户担心这是否应该被视为一种良好做法,我认为这个问题值得进一步解释。总的来说,我同意我不同意他们的观点(我认为很多有文化的编程社区的人也不同意)。时间如下:

  1. 绝对同意在某些情况下,有人正在写一本关于该语言的书、教程、食谱、模式,或者一些旨在让读者在计算机上尝试该代码的东西。这可能会让读者感到困惑(那个 <- 符号在哪里?),并妨碍他们阅读模式(当你快速浏览数百行代码时你就知道了)。
  2. 但在论文、论文和其他科学出版物中,大多数片段都是说明性的;几乎就像他们伪代码可读性得到了改善,特别是因为许多两/三个字符的符号(可能因语言而异)被压缩为更具符号性的符号。现在,大多数人确实会建议:“那你为什么不使用伪代码呢?”嗯……首先,因为环境提供的伪代码algorithmic对于简化命令式语言很有用,但它不适用于 LISP、XML 和 BNF 之类的东西。其次,因为转换它们需要花费大量时间,而且很快就会失去同步。

不过,我仍然坚持我最初的问题:“源代码精美排版的示例”。

答案1

当以非等宽字体排版 C 代码时,我发现“文学编程”选项确实很有用。

我使用它们来指定在标准非等宽字体中不太易读的符号对的排版 - 不是用不同的符号替换它们,而是调整以使相同的符号更易读。例如,“--”在 Times 中看起来不正确,所以我用literate={--}{{\texttt{--}}它来让它看起来更好。

同时,当人们在讨论与编程语言语法细节无关的算法时使用说明性伪代码时,我确实认为使用非编程符号很有用。首先,它有助于明确表明你编写的内容不是可编译的 C 代码——即使它具有类似 C 的语法,并且实际上只是删除了不相关部分的 C。(或 Lisp,或其他。)而且,由于“不相关部分”会因讨论而异,我发现没有一种特定的伪代码格式适用于所有内容。

答案2

\not对于逻辑运算符,使用、\and和是很自然的\lor

但总的来说,我同意 Aditya 的观点:使用的符号与实际输入的偏差越大,就越容易造成混淆。例如,Pascal WEB 使用向左的箭头进行赋值(:=在 Pascal 中),即使接触多年,我也觉得这很令人困惑。

答案3

抱歉深入挖掘这个话题,但与此同时,我发现 Emacs 中也做了类似的事情,用于实时编辑 Haskell 等编程语言。符号序列被 unicode 字符替换,大大提高了可读性。同样的原理可以应用于 LaTeX 文档。这是一个关联描述如何配置这种技术,下面是截图这个博客

另一个典型的用法是在 Literate Haskell 中,編輯工具。

答案4

要在 LaTeX 中排版代码,请使用 listings 包或 minted(该包需要 pygments,并通过外部美化器运行您的代码,该美化器可以处理各种各样的语言,甚至可以根据需要为输出着色)。

无论你做什么,只要不要用一些所谓的“数学等价物”来代替语言的符号。语言不是这样写的,而且$\wedge$有一个非常与 C 等的含义不同&&

对于排版算法,我使用 algorithm2e。在那里你可以随意使用数学符号。

相关内容