![使用哪个包来排版 objective-C 源代码?](https://linux22.com/image/282346/%E4%BD%BF%E7%94%A8%E5%93%AA%E4%B8%AA%E5%8C%85%E6%9D%A5%E6%8E%92%E7%89%88%20objective-C%20%E6%BA%90%E4%BB%A3%E7%A0%81%EF%BC%9F.png)
我想排版一些源代码(约 70k 行)。
该语言是 Objective-C,因此它被组织成类。我想要一个目录和页码。我还希望每个类都从页面顶部开始。
如果能够为这段代码的某些部分添加内联注释就好了。如果能够在文档的某些部分之间添加一些交叉引用链接也不错。(这两项操作均需手动完成)。
哪一个包最好来生成这样的东西(你也可以告诉我不要使用 TeX)?
答案1
这里有三个强大的软件包可以用来排版 Objective-C 源代码:listings
,minted
,verbments
. 全部三个包
- 支持 Objective-C,
- 拥有“列表”功能,
- 允许在源代码中添加内联注释,
- 允许交叉引用。
那么,您应该选择哪一个?这取决于您的要求。在做出决定之前,您需要了解以下几点:
minted
和软件包verbments
非常相似。请参阅minted 与 texments 与 verbments进行更详细的比较。它们都基于pygments
并需要调用一些 Python 代码,这意味着您需要-shell-escape
在编译tex
文件时启用。相比之下,listings
直接在 TeX 中执行所有语法突出显示。- 与其他两个软件包相比,该
listings
软件包的词法分析和语法高亮功能有限。在我看来,minted
(或verbments
)列表通常看起来更漂亮。 - 但是,
listings
允许对文件中的语法突出显示进行一些自定义.tex
,而其他的则需要在.tex
文件外部进行一些额外的 Python 操作。 listings
具有自动换行功能,而其他的则没有。下面最后的屏幕截图显示了当minted
用于排版太宽而无法在页面上显示的列表时会发生什么。当然,您可以选择减小字体大小以避免此类问题。
以下是使用的示例listings
。有关更多详细信息,请参阅文档。
\documentclass{article}
\setlength\parindent{0pt}
\usepackage{lipsum} % for filler text
\usepackage{lmodern} % for, among other things, bold typewriter font
\usepackage{xcolor}
\usepackage{listings}
\usepackage{filecontents} % for writing to the .m file from within this .tex file
% http://www.otierney.net/objective-c.html
\begin{filecontents*}{sampleObjCcode.m}
#import <stdio.h>
int main( int argc, const char *argv[] ) {
printf( "hello world\n" );
return 0;
}
\end{filecontents*}
% http://www.ultraweaver.com/2010/04/13/objective-c-and-for-loop-with-fibonacci/
\begin{filecontents*}{fibonacci.m}
int i; // used in the "for" loop
int fcounter = 20; // specifies the number of values to loop through
int f1 = 1; // seed value 1
int f2 = 0; // seed value 2
int fn; // used as a holder for each new value in the loop
for (i=1; i<fcounter; i++){
fn = f1 + f2;
f1 = f2;
f2 = fn;
printf("%d: ", fn); // print each value of fn
}
\end{filecontents*}
\lstdefinestyle{myObjCstyle}
{
language=[Objective]C,
basicstyle=\ttfamily,
frame=single,
keywordstyle=\color{blue},
breaklines=true,
}
\begin{document}
\lstlistoflistings
\lipsum[1] % filler text
\lstinputlisting
[
style = myObjCstyle,
caption = {Hello World in Objective-C},
label = hello,
]{sampleObjCcode.m}
As you can see in Listing~\ref{hello}, blah blah blah
but in Listing~\ref{fibo} on page~\pageref{fibo}, we'll improve blah blah blah
\lipsum[2-5]
\lstinputlisting
[
style = myObjCstyle,
caption = {Fibonacci sequence},
label = fibo,
]{fibonacci.m}
\end{document}
minted
例子
\documentclass{article}
\setlength\parindent{0pt}
\usepackage{lipsum} % for filler text
\usepackage{lmodern} % for, among other things, bold typewriter font
\usepackage{xcolor}
\usepackage{listings}
\usepackage{minted}
\usepackage{filecontents} % for writing to the .m file from within this .tex file
% http://www.otierney.net/objective-c.html
\begin{filecontents*}{sampleObjCcode.m}
#import <stdio.h>
int main( int argc, const char *argv[] ) {
printf( "hello world\n" );
return 0;
}
\end{filecontents*}
% http://www.ultraweaver.com/2010/04/13/objective-c-and-for-loop-with-fibonacci/
\begin{filecontents*}{fibonacci.m}
int i; // used in the "for" loop
int fcounter = 20; // specifies the number of values to loop through
int f1 = 1; // seed value 1
int f2 = 0; // seed value 2
int fn; // used as a holder for each new value in the loop
for (i=1; i<fcounter; i++){
fn = f1 + f2;
f1 = f2;
f2 = fn;
printf("%d: ", fn); // print each value of fn
}
\end{filecontents*}
\begin{document}
\listoflistings
\lipsum[1] % filler text
\begin{listing}
\inputminted[frame=single]{objective-c}{sampleObjCcode.m}
\caption{Hello Word in Objective-C}
\label{hello}
\end{listing}
As you can see in Listing~\ref{hello}, blah blah blah
but in Listing~\ref{fibo} on page~\pageref{fibo}, we'll improve blah blah blah
\lipsum[2-5]
\begin{listing}
\inputminted[frame=single]{objective-c}{fibonacci.m}
\caption{Fibonacci sequence}
\label{fibo}
\end{listing}
\end{document}