在这个LaTeX文档中插入带缩进的代码

516

我如何在LaTeX文档中插入代码?是否有类似于:

\begin{code}## Heading ##
...
\end{code}

我真正需要的是缩进和等宽字体。语法高亮可能很好,但绝对不是必需的。


不是精确的复制,但答案涵盖了同样的内容:请参见https://dev59.com/xXRB5IYBdhLWcg3wCjcV - Charles Stewart
我这里还有一个跟进的问题:http://stackoverflow.com/questions/3408996/insert-code-into-a-latex-doc-without-leading-tabs - sixtyfootersdude
这个链接可以帮助你:https://www.overleaf.com/learn/latex/Code_listing - Amin Bashiri
9个回答

762

使用listings宏包。

LaTeX头部的简单配置(在\begin{document}之前):

\usepackage{listings}
\usepackage{color}

\definecolor{dkgreen}{rgb}{0,0.6,0}
\definecolor{gray}{rgb}{0.5,0.5,0.5}
\definecolor{mauve}{rgb}{0.58,0,0.82}

\lstset{frame=tb,
  language=Java,
  aboveskip=3mm,
  belowskip=3mm,
  showstringspaces=false,
  columns=flexible,
  basicstyle={\small\ttfamily},
  numbers=none,
  numberstyle=\tiny\color{gray},
  keywordstyle=\color{blue},
  commentstyle=\color{dkgreen},
  stringstyle=\color{mauve},
  breaklines=true,
  breakatwhitespace=true,
  tabsize=3
}

你可以使用 \lstset{language=Java} 在文档中间更改默认语言。

文档中的使用示例:

\begin{lstlisting}
// Hello.java
import javax.swing.JApplet;
import java.awt.Graphics;

public class Hello extends JApplet {
    public void paintComponent(Graphics g) {
        g.drawString("Hello, world!", 65, 95);
    }    
}
\end{lstlisting}

以下是结果:

示例图像


4
关于您的代码,我有一个跟进问题。如果您有机会,请查看:http://stackoverflow.com/questions/3408996/insert-code-into-a-latex-doc-without-leading-tabs - sixtyfootersdude
2
有没有办法减少代码行之间的空间? - sukhvir
能否在代码片段下面添加小文本,类似于Latex中图像下方的文本? - Brian Var
我听说这个包现在已经过时了! - hola
@BrianVar:这是你要求的内容 \begin{lstlisting}[caption={无用代码},label=useless] - V B
显示剩余3条评论

230

您还可以使用verbatim环境

\begin{verbatim}
your
code
example
\end{verbatim}

70
在verbatim环境中使用制表符可能会引发问题。如果将制表符转换为“空格”,则该问题将消失。 - midtiby
1
这对于展示示例文本文件内容非常有用(例如,程序要读取/处理的文本数据)。 - nalyd88
1
对于双列文章,它无法很好地处理边距。 - Sazzad Hissain Khan

129

以下是如何添加内联代码:

您可以使用 {\tt code }\texttt{ code } 添加内联代码。如果您想格式化内联代码,最好是创建您自己的命令。

\newcommand{\code}[1]{\texttt{#1}}

另外,请注意可以使用以下方式从其他文件加载代码块:

\lstinputlisting[breaklines]{source.c}

breaklines不是必须的,但我发现它很有用。请注意,您将需要指定\usepackage{ listings }来使用此功能。

更新:列表包还包括\lstinline命令,它具有与\lstlisting\lstinputlisting命令相同的语法高亮功能(有关配置详细信息,请参见Cloudanger的答案)。正如几个其他答案中提到的那样,还有minted包,它提供了\mintinline命令。与\lstinline一样,\mintinline提供与常规minted代码块相同的语法高亮:

\documentclass{article}

\usepackage{minted}

\begin{document}
  This is a sentence with \mintinline{python}{def inlineCode(a="ipsum)}
\end{document}

1
有没有更好的内联代码方式,可以激活关键字颜色等? - Minimus Heximus
你如何插入空格/制表符以使代码更易读? - Charlie Parker
当使用 mintinline 时,是否可能去除字符之间的空格? - alper
我不确定你的意思。听起来像是字体问题。CTAN上的minted页面有关于这些问题的详尽文档:https://ctan.org/pkg/minted - alan

36

专业软件包如 minted ,依赖于Pygments进行格式化,相比于 listings 软件包,提供了各种优势。引用自 minted 手册:

与传统的软件包相比,Pygments提供了更加出色的语法高亮。例如,listings基本上只突出显示字符串,注释和关键字。另一方面,Pygments可以完全定制以突出显示源语言可能支持的任何标记类型,这可能包括字符串内部的特殊格式序列、数字、不同类型的标识符以及像HTML标记这样的奇异结构。


2
我已经尝试过Minted,它的文档非常简单明了。默认样式相当不错。 - user2262504
9
对许多用户来说,这可能是一种不理想的解决方案,因为需要对Pygmentsic进行外部调用。特别是,要求使用“-shell-escape”指令调用latex,最好只是对现有构建系统进行轻微修改,但最坏的情况是与一些用户的安全偏好不兼容。 - KDN

29

Minted(代码高亮插件),不论是从GitHub还是CTAN,Comprehensive TeX Archive Network下载,都可以在Overleaf、TeX Live和MiKTeX中使用。

使用Minted需要安装Python包Pygments,有关此安装过程的说明在上述任一来源的文档中。虽然Pygments的宣传口号是Python语法高亮工具,但是Minted确保支持数百种其他语言。

示例:

\documentclass{article}
\usepackage{minted}
\begin{document}

\begin{minted}[mathescape, linenos]{python}

# Note: $\pi=\lim_{n\to\infty}\frac{P_n}{d}$
title = "Hello World"

sum = 0
for i in range(10):
 sum += i

\end{minted}

\end{document}

输出:

此处输入图片描述


14

使用Minted

这是一个使用强大的Pygments库,在LaTeX中促进表现力语法突出显示的软件包。该软件包还提供了使用fancyvrb自定义高亮源代码输出的选项。

它比其他任何软件包都更进化和可定制!


2
然而,正如在类似的答案中已经提到的那样,“-shell-escape”可能对某些人来说并不理想。 - Egor Hans

14

如果您的代码是用Python编写的,并且不想安装Python包,那么一个非常简单的方法是:

\documentclass[11pt]{article}  
\usepackage{pythonhighlight}

\begin{document}

The following is some Python code

\begin{python}
# A comment
x = [5, 7, 10]
y = 0

for num in x:
    y += num
    
print(y)
\end{python}

\end{document}

这看起来像是:

enter image description here

不幸的是,这只适用于Python。


pythonhilight包开箱即用,效果不错。在解决安装pygments时遇到问题时,我使用它一段时间。然而,如果您想要控制字体大小、语法高亮、背景颜色、边框、是否包括行号以及位置,或者在双列页面中更好地放置短代码片段,那么minted是一个更好的选择。此外,PyCharm对minted的支持更好:它不会抱怨minted环境中的“_”。 - hlongmore

7

既然这里还没有提到,那么可能值得增加另一个选项,使用spverbatim包(不带语法高亮):

\documentclass{article}
\usepackage{spverbatim}

\begin{document}

\begin{spverbatim}
  Your code here
\end{spverbatim}

\end{document}

此外,如果不需要语法高亮显示,则可以使用包alltt
\documentclass{article}
\usepackage{alltt}

\begin{document}

\begin{alltt}
  Your code here
\end{alltt}

\end{document}

1
这大致是我想要的,但我似乎无法使用制表符进行缩进。你如何缩进/是否有类似的软件包可以更轻松地进行缩进? - Darokrithia
1
@Darokrithia 我编辑了我的答案:你能检查/对齐缩进吗? :) - MattAllegro
1
似乎不起作用。我可以把我正在使用的代码发送给你,但是在注释中格式会被破坏。顺便说一句,我使用了另一个答案,它运行良好,但我觉得这个问题仍然应该为未来的读者解决。 - Darokrithia

6

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接