用于科学文献的LaTeX

LaTeX 理念及历史

TeX是一个可以追溯到1970年代末的排版系统。在那时候,用图形终端就像微软的 Word 那样可以设计一个文档布局并立即查看它是很少见的。相反,TeX 使用了一个两步的工作流程,我们首先使用我们最喜欢的文本编辑器在一个ascii 文档中输入我们的格式指令。接下来,我们将调用 LaTeX 程序作为一种编译器,把这个文件翻译成可以打印或查看的形式。

%% edit mydocument.TeX %% LaTeX mydocument %% # print or view the resulting output

这个过程与通过输入 HTML 命令制作网页相似。

这种工作方式可能看起来很笨拙,但它有一些优点。例如,TeX 的输入文件是纯粹的 ascii ,所以它们可以很容易地被自动生成,例如从数据库中生成。而且,我们可以用我们喜欢的任何编辑器来编辑它们。另一个有利于 TeX 的地方是,布局是由以某种编程语言编写的命令来指定的。这有一些重要的结果:

  • 关注点分离:当我们在写文件时,我们不必考虑到布局。我们给出一个 “章节”命令,而该命令的执行将由我们独立决定。例如,由我们选择一个文档样式。
  • 通过在输入文件中选择不同的实现方式,可以很容易地改变已完成的文档的布局。 在输入文件中选择不同的布局命令,就可以很容易地改变完成的文件的布局:使用相同的 “章节 “命令,但通过选择不同的风格,产生的布局是不同的。 但通过选择不同的风格,所产生的布局是不同的。这种改变可以简单到只用一行 改变文件的样式声明。
  • 如果我们有不寻常的排版需求,也可以为此编写新的TeX命令。对于 许多需求,这样的扩展实际上已经写好了;见第30.4节。

安装LaTeX

在我们的系统上安装 LaTeX 的最简单方法是下载 TeXlive 发行版,地址是http://tug.org/TeXlive 。苹果用户也可以使 finkmacports,有各种 TeX 的前端,例如 Mac 上的 TeXshop

运行LaTeX

目的:在本节中,我们将运行LaTeX编译器。

最初,LaTeX 编译器会输出一种名为 dvi 独立于设备的文件格式,,它可以被翻译成 PostScriptPDF 或直接输出。如今,许多人使用 pdfLaTeX 程序,直接将 .TeX 文件翻译成 .pdf 文件。这有一个很大的好处,即生成的 PDF 文件有自动交叉链接和带目录的侧板。示例图如下

让我们做一个简单的例子。

用于科学文献的LaTeX - 图1

[^]: 图 30.1: 一个最小的LaTeX文件

练习:创建一个文本文件 minimal.TeX ,内容如图30.1所示。尝试使用 pdfLaTeX minimalLaTeX minimal 命令。在第一种情况下,我们是否得到了 minimal.pdf 文件,或者在第二种情况下得到 minimal.dvi 文件?请分别使用 pdf 阅读器,如 Adobe Reader,或 dvips 来查看输出。

注意事项:如果我们打错了字,TeX 可能有些不友好。如果我们得到一个错误信息并且 TeX 要求输入,输入 x 通常会让我们退出,或者 Ctrl-C 。有些系统允许我们输入 e ,直接进入编辑器纠正错字。

对LaTeX的简单介绍

在这里,我们将得到一个非常简单的 LaTeX 功能的介绍。还有各种更深入的教程,例如 Oetiker 的教程。

文档结构

每个 LaTeX 文档都需要以下几行:

  1. \documentclass{ .... } % the dots will be replaced
  2. \begin{document}
  3. \end{document}

documentclass ’一行需要在大括号之间输入一个类别名称;典型的值是 ‘ article ‘ 或’ book ‘。一些组织有自己的风格,例如,‘ieeeproc’是指 IEEE 的会议记录。

所有的文档文本都在 begin{document}end{document} 行之间。(匹配的 ‘begin‘ 和 ‘end’ 行被称为表示一个 ‘environment‘,在这里是指文档环境)。

\begin{document} 之前的部分被称为 “序言”。它包含了对这个特定文档的定制。例如,一个让整个文档变成双倍行距的命令将被放在序言中。如果我们使用 pdfLaTeX 来格式化我们的文档,我们需要有一行

  1. \usepackage{hyperref}

我们有没有注意到以下几点?

  • 反斜线字符很特别:它是 LaTeX 命令的开始。
  • 大括号也很特别:它有各种功能,比如表示一个命令的参数。
  • 百分号字符表示到行末的所有内容都是注释。

一些简单的文本

目的:在本节中,我们将学习一些文本格式化的基本知识。

练习:创建一个 first.TeX 文件 ,其中包含图30.1的内容。在序言中输入一些文字,也就是在 ‘begin{document} ‘行之前,在文件中运行 pdfLaTeX

预期结果:我们应该会得到一个报错信息,因为不允许在序言中出现文字,这里只允许存在命令;所有的文字都必须放在 ‘begin{document}’ 之后。

当shell通过使用我们的一个或多个输入行或只使用一个输入行的一部分来收集要执行的命令行时,如刚才所述,它将对命令行进行扩展(第20.7节)。然后,它将把命令行解释为一个命令和参数,并继续用找到的参数来调用该命令。编辑我们的文档:在 \begin{document}\end{document} 之间添加一些文字。让我们的文本有一些的持续一段时间的长行,还有一些短行。 在字与字之间、行与行之间的开头或结尾处加上空格。在我们的文档上运行 pdfLaTeX 并查看输出。

预期结果:我们注意到我们输入的空白处在输出中已经被压缩了。TeX 有它自己关于空格应该是什么样子的的概念,我们不需要关心这个问题。

练习:再次编辑我们的文档,剪切并粘贴这段文字,但在两份副本之间留出一行空白。第三次粘贴,留下几个空行。格式化,并查看输出结果。

预期结果:TeX 将一个或多个空行解释为段落之间的分隔。

练习:在序言中加入 usepackage{psLaTeX} ,然后在我们的文档中重新运行 pdfLaTeX 。输出结果有什么变化?

预期的结果:这样做的效果是,将字体从默认的改为 Times Roman

注意事项:字体是出了名的不标准化,试图使用不同的字体可能不起作用。对此,一般来说没有什么可说的。

在第一段前添加以下一行:

\section{This is a section}

和第二行之前的类似的行。我们可以看到 LaTeX 会自动对章节进行编号,并且它对标题后的第一段的缩进处理是不同的。

练习:documentclass 声明行中用 artikel3 替换 article,然后重新格式化我们的文档。有什么变化?

预期结果:有许多文档类实现了与 article(或其他标准样式)一样的命令,但它们有自己的布局。我们的文档格式应该没有任何问题,但得到了一个更好看的布局。

注意事项:artikel3 类是现在大多数发行版的一部分,但如果它是一个未知的文档类,如果缺少这个类,或者我们的环境设置不正确,我们可能会得到一个关于未知文档类的报错信息。这取决于我们的安装,如果该文件丢失了,请从以下网站 http://tug.org/TeXmf-dist/TeX/LaTeX/ntgclass/ 下载文件并把它们放到我们的当前目录中;另见第30.2.9节。

关于数学的排版

目的:在本节中,我们将学习数学排版的基本知识。

最初的 TeX 系统的目标之一是促进数学的设置,有两种方法在我们的文档中设置数学公式:

  • 内联数学是段落的一部分,由美元符号划定。
  • 展示公式(Display math)模式,顾名思义,就是通过自身显示。

练习:$x+y$ 放在一个段落中的某个地方,然后格式化我们的文件。将 \[x+y\] 放在段落中的某处,然后格式化。

预期结果:单一美元之间的公式被包含在我们声明它们的段落中。介于 \[…\] 之间的公式在显示中排版。

对于带有数字的显示方程,使用 equation 环境。尝试如此。

这里有一些数学公式中常见的事情。请务必试一下:

  • 下标和上标:$x_i^2$ ,如果下标或上标是一个以上的符号需要进行分组:$x_{i+1}^{2n}$。如果我们在公式中需要一个括号,请使用:$\{ \}$
  • 希腊字母和其他符号:$\alpha\otimes\beta_i$
  • 所有这些的组合 $\int_{t=0}^\inftytdt$

练习:以最后一个例子为例,把它排成显示数学。我们看到与内联数学的区别了吗?

预期结果:TeX 试图不包括文本行之间的距离,即使在段落中有数学。由于这个原因,它对积分符号的界限的排版与展示公式不同。

引用

目的:在本节中,我们将看到 TeX 的交叉引用机制在发挥作用。

到目前为止,我们还没有看到 LaTeX 做了多少能让我们省事的事情。LaTeX 的交叉引用机制肯定会帮我们节省工作:LaTeX 插入的任何计数器(如章节编号)都可以通过标签来引用。因此,参考总是正确的。

从一个至少有两个章节标题的例子文件开始。在我们的第一个章节标题后面,把 命令 \label{sec:first} ,并在第二节标题后加上 \label{sec:other}。这些标签命令可以和章节命令放在同一行,也可以放在下一行。现在输出

As we will see in section˜\ref{sec:other}.

在第二节之前的段落中。( tilde 字符表示一个非断裂的空格)

练习:进行这些编辑,并对文件进行格式化。我们看到关于未定义引用的警告了吗?看一下输出文件。再次格式化文件,并再次检查输出。我们的目录中有任何新文件吗?

预期结果:在第一次浏览文档时,TeX 编译器会把所有的标签和它们的值放在一个 .aux 文件中。文件将显示一个双问号,表示任何的引用是未知的。在第二遍中,正确的值将被填入。

注意事项:如果在第二遍之后,仍然有未定义的参考文献,那么我们可能是打错了。如果我们使用 bibTeX工具来处理文献引用,我们将经常需要三遍来解决所有的引用。

上面我们看到,equation 环境给出的是带有方程编号的数学计算。我们可以在这个环境中添加一个标签来指代方程编号。

练习:在一个 equation 环境中写一个公式,并添加一个标签。在文本中的任何地方提到这个标签,格式化(两次)并检查输出。

预期结果:对公式来说,labelref 命令的使用方法与对章节编号的使用方法相同。请注意,我们必须使用 begin/end{equation} 而不是用公式 \[…\]

列表

目的:在本节中,我们将看到列表的基本知识。

通过一个环境提供项目和编号的列表。

\begin{itemize} \item This is an item; \item this is one too. \end{itemize} \begin{enumerate} \item This item is numbered; \item this one is two. \end{enumerate}

练习:在我们的文档中添加一些列表,包括嵌套列表并检查输出。

预期结果:嵌套的列表将被进一步缩进,标签和编号样式会随着列表深度的增加而改变。

练习:enumerate 列表中的一个项目添加一个标签,并引用它。

预期结果:同样, \label\ref 命令像以前一样工作。

源代码和算法

作为一名程序员,我们经常希望在我们的著作中包括算法,有时甚至包括源代码。在本教程中,我们已经看到一些字符对 LaTeX 有特殊的意义,而不能输入这些字符并期待它们出现在输出中。由于有趣的字符经常出现在我们需要一个工具来解决这个问题:verbatim mode

要在一个段落内显示代码位,我们可以使用 \verb 命令。这条命令用两个相同的字符来限定其用两个相同的字符来限定其参数,这些字符不能出现在逐字文本中。例如,输出 if (x%5>0) { … } 是由 \verb+if (x%5>0) { … }+。(练习:本书作者是如何这本书的作者是如何在文本中得到这个逐字命令的?)

对于较长的逐字文本,需要单独显示,我们可以使用

  1. \begin{verbatim}
  2. stuff
  3. \end{verbatim}

最后,为了将整个文件作为逐字记录包括在内,可以使用以上方法。

逐字文本是显示算法的一种方式,但还有更优雅的解决方案。例如,在本书中本书中使用了以下方法。

  1. \usepackage[algo2e,noline,noend]{algorithm2e}

例如,在第299页可以看到这个结果。

图片

由于我们不能立即看到我们所输入的内容的输出,有时输出可能是一个惊喜。对于图形来说更是如此。LaTeX 没有处理图片的标准方法,但以下是一组常用的命令:

  1. \usepackage{graphicx} % this line in the preamble
  2. \includegraphics{myfigure} % in the body of the document

图片可以是多种格式中的任何一种,但如果使用 pdfLaTeX ,则不能使用 PostScript 图形(扩展名为.ps或.eps)不能被使用。

由于我们的图片往往不合适,通常会有这样的内容:

\includegraphics[scale=.5]{myfigure}

一个更大的问题是,如果图片放在我们声明的地方,它们可能会太大,无法在页面上放置。由于这个原因,它们通常被视为 ‘ floating material ‘。下面是一个典型的图片声明:

  1. \begin{figure}[ht]
  2. \includegraphics{myfigure}
  3. \caption{This is a figure}
  4. \label{fig:first}
  5. \end{figure}

它包含以下内容:

  • figure 环境用于 ‘floating‘ 的图篇;它们可以直接放在声明的位置上。也可以放在下一页的顶部或底部,或者放在本章的结尾,等等。

  • begin{figure} 行的 [ht] 参数指出,我们的数字应该尝试放在这里;如果不成功,它应该放在下一页的顶部。其余可能的参数是 b 用于放置在页面的底部,或者 p 用于放置在页面上。例如

    1. \begin{figure}[hbp]
  • 在图片的下面有一个包括图片号标题。

  • 一个标签,这样我们就可以通过它的标签来参考图号:fig˜ref{fig:first}

  • 当然还有图的材料,有各种方法来微调图的位置。例如

    1. \begin{center}
    2. \includegraphics{myfigure}
    3. \end{center}

    给出一个居中的图片。

参考文献目录

在我们的文件中引用论文和书籍的机制有点像交叉引用的机制,这里有一个 \cite{thatbook} 命令可以插入一个参考文献。但是,由于我们可能会在我们写的不止一个文档中引用一篇论文或一本书,LaTeX 允许我们建立一个文献参考数据库,而不是在文档的某个地方。

制作一个 mybibliography.bib 文件,内容如下:

  1. @article{JoeDoe1985,
  2. author = {Joe Doe},
  3. title = {A framework for bibliography references},
  4. journal = {American Library Assoc. Mag.},
  5. year = {1985}
  6. }

在我们的 mydocument.TeX 文件中放入

  1. For details, refer to Doe˜\cite{JoeDoe1985} % somewhere in the TeXt
  2. \bibliography{mybibliography} % at the end of the document
  3. \bibliographystyle{plain}

格式化我们的文件,然后在命令行上输入:

  1. bibTeX mydocument

并对我们的文件再进行两次格式化,现在里面应该有一个书目和一个正确的引文,我们还会看到文件 mydocument.bblmydocument.blg 已经被创建。

环境变量

Unix 系统中,当 TeX 试图找到一个包含文件时,它将查询 TeXINPUTS 环境变量。因此,我们可以为我们的样式和其他下载的包含文件创建一个目录,并将这个变量为该目录的位置。同样地,BIBINPUTS 变量指示的是 bibTeX 的书目文件(第30.2.8节)。

已完成的例子

下面的例子 demo.TeX 包含了上面讨论的许多元素。

  1. \documentclass{artikel3}
  2. \usepackage{psLaTeX,graphicx,amsmath,amssymb}
  3. \usepackage{pdfLaTeX}
  4. \newtheorem{theorem}{Theorem}
  5. \newcounter{excounter}
  6. \newenvironment{exercise}
  7. {\refstepcounter{excounter}
  8. \begin{quotation}\TeXtbf{Exercise \arabic{excounter}.} }
  9. {\end{quotation}}
  10. \begin{document}
  11. \title{SSC 335: demo}
  12. \author{Victor Eijkhout}
  13. \date{today}
  14. \maketitle
  15. \section{This is a section}
  16. \label{sec:intro}
  17. This is a test document, used in˜\cite{LaTeXdemo}. It contains a
  18. discussion in section˜\ref{sec:discussion}.
  19. \begin{exercise}\label{easy-ex}
  20. Left to the reader.
  21. \end{exercise}
  22. \begin{exercise}
  23. Also left to the reader, just like in exercise˜\ref{easy-ex}
  24. \end{exercise}
  25. \begin{theorem}
  26. This is cool.
  27. \end{theorem}
  28. This is a formula: $a\Leftarrow b$.
  29. \begin{equation}
  30. \label{eq:one}
  31. x_i\leftarrow y_{ij}\cdot xˆ{(k)}_j
  32. \end{equation}
  33. TeXt: $\int_0ˆ1 \sqrt x\,dx$
  34. \[
  35. \int_0ˆ1 \sqrt x\,dx
  36. \]
  37. \section{This is another section}
  38. \label{sec:discussion}
  39. \begin{table}[ht]
  40. \centering
  41. \begin{tabular}{|rl|}
  42. \hline one&value \\ \hline another&values \\ \hline
  43. \end{tabular}
  44. \caption{This is the only table in my demo}
  45. \label{tab:thetable}
  46. \end{table}
  47. \begin{figure}[ht]
  48. \centering
  49. \includegraphics{graphics/caches}
  50. \caption{this is the only figure}
  51. \label{fig:thefigure}
  52. \end{figure}
  53. As I showed in the introductory section˜\ref{sec:intro}, in the
  54. paper˜\cite{AdJo:colorblind}, it was shown that
  55. equation˜\eqref{eq:one}
  56. \begin{itemize}
  57. \item There is an item.
  58. \item There is another item
  59. \begin{itemize}
  60. \item sub one
  61. \item sub two
  62. \end{itemize}
  63. \end{itemize}
  64. \begin{enumerate}
  65. \item item one
  66. \item item two
  67. \begin{enumerate}
  68. \item sub one
  69. \item sub two
  70. \end{enumerate}
  71. \end{enumerate}
  72. \tableofcontents
  73. \listoffigures
  74. \bibliography{math}
  75. \bibliographystyle{plain}
  76. \end{document}

我们还需要 math.bib 这个文件:

@article{AdJo:colorblind, author = {Loyce M. Adams and Harry F. Jordan}, title = {Is {SOR} color-blind?}, journal = {SIAM J. Sci. Stat. Comput.}, year = {1986}, volume = {7}, pages = {490--506}, abstract = {For what stencils do ordinary and multi-colour SOR have the same eigenvalues.}, keywords = {SOR, colouring} } @misc{LaTeXdemo, author = {Victor Eijkhout}, title = {Short {\LaTeX}\ demo}, note = {SSC 335, oct 1, 2008} }

以下的命令顺序:

pdfLaTeX demo bibTeX demo pdfLaTeX demo pdfLaTeX demo