\chapter{入门}

\section{Hello, World!}
\label{sec:hello_world}
把下面例子用编辑器保存为~\verb|hello_world.tex|，这就是一个最简单的~\LaTeX~源文件。

\begin{code}
%hello_world.tex
\documentclass{article}
\begin{document}
    Hello, World!
\end{document}
\end{code}

有了源文件，我们可以在命令行把它编译成~DVI~文件（DVI~格式见\ref{sec:dvi}小节）。此命令知道输入的是~\LaTeX~源文件，所以这里的~\verb|.tex|~后缀可以省略。以后的示例中可以省略的后缀都用~\verb|()|~标出，不再特别声明。
\begin{code}
latex hello_world(.tex)
\end{code}

如果系统显示类似下面的错误信息，请检查源文件是否有拼写错误。\verb|.log|~文件里有更详细的编译信息。
\begin{code}
! LaTeX Error:
...
! Emergency stop.
...
No pages of output.
Transcript written on hello_world.log.
\end{code}

如果编译成功，系统会报出类似下面的信息：
\begin{code}
Output written on hello_world.dvi (1 page, 232 bytes).
Transcript written on hello_world.log.
\end{code}

每种~\LaTeX~发行包附带不同的~DVI~浏览器，比如~MiKTeX~的是~yap。
\begin{code}
yap hello_world(.dvi)
\end{code}

\section{格式及其转换}
\subsection{页面描述语言}
\label{sec:pdl}
页面描述语言（Page Description Language，PDL）是一种在较高层次上描述实际输出结果的语言。本文只讨论其中三种与~\LaTeX~紧密相关的格式：DVI、PostScript、PDF。

\subsubsection{PostScript}
最早的打印机只用于打印字符，它使用的硬字符与打字机类似。后来出现的点阵（dot matrix）打字机用一系列的点来“画”出字符，当然它也可以画出图形。当时矢量图的打印只能由绘图仪（plotter）来完成。

1976~年，施乐（Xerox）推出了首台激光打印机，它结合了点阵打印机和绘图仪的优点，可以同时打印高质量的图形和文字。

同一时期，John Warnock~也在酝酿一种类似于~Forth~的图形设计语言，也就是后来的~PostScript（PS），当时他正在旧金山一家电脑图形公司~Evans \& Sutherland~工作。1978~年老板想让~Warnock~搬到位于犹他州的总部，他不想搬家就跳槽到了施乐。

Warnock~和~Martin Newell~开发了新的图形系统~JaM（John and Martin），它后来被合并到施乐的打印机驱动程序~InterPress~中去。这两位还开发过另一个系统~MaJ。

1982~年，Warnock~和施乐研究中心图形实验室主任~Chuck Geschke~一起离开施乐，成立了~Adobe~公司。Newell~后来也加入了~Adobe。

1984~年~Adobe~发布~PS~后不久，Steve Jobs~跑来参观，并建议用它来驱动激光打印机。次年，武装着~PS~驱动的~Apple LaserWriter~横空出世，打响了~80~年代中期桌面出版革命的第一枪。

90~年代中后期，廉价喷墨打印机的流行使得~PS~逐渐式微，因为~PS~驱动对它们毕竟是一个成本负担。

\subsubsection{PDF}
1993~年，Adobe~推出了一种开放的格式：Portable Document Format（PDF），它于~2007~年成为~ISO 32000~标准。除了开放，PDF~比起~PS~还有一些其它优势：
\begin{itemize}
    \item PDF~基本上是~PS~的一个子集，因此更轻便。
    \item PDF~可以嵌入更先进的字体，具体见\ref{sec:font}节。
    \item PDF~支持嵌入乱七八糟的东东，比如动画。
    \item PDF~支持透明图形。
\end{itemize}

PDF~虽然拥有上述优势，起初它的推广却并不顺利，因为其读写工具~Acrobat~太贵。Adobe~很快推出了免费的~Acrobat Reader（后更名为~Adobe Reader），并不断改进~PDF，终于使它超越了曾经的事实标准~PS，成为网络时代电子文档的新标准。

\subsubsection{DVI}
\label{sec:dvi}
Knuth~最初设计的~\TeX~只能用于~XGP~打印机，这台打印机本身还需要一台~PDP-6~主机为它服务。1979~年，David Fuchs\footnote{Fuchs~本科毕业于普林斯顿，1978~年进入斯坦福攻读博士学位。他不是~Knuth~的学生，但是完成过一些~\TeX~的开发任务。他在~Adobe~工作过一段时间，现在混入了娱乐圈，担任过电影《Red Diaper Baby》和《Haiku Tunnel》的制片人。}提出把~\TeX~的输出改为设备无关的格式，也就是~Device Independent format（DVI）。

DVI~只是一种中间格式，用户还需要另外的处理程序（driver）把它转换为其它格式，比如~PS~或~PDF~，甚至~PNG、SVG~等。DVI~不能嵌入字体和图形，PS~和~PDF~可以选择是否嵌入字体。

\subsubsection{Ghostscript}
\label{sec:ghostscript}
PS~输出时需要一个解释器（Raster Image Processor，RIP）来把它转换为点阵图形。RIP~可以是软件，也可以是固件（firmware）或硬件\footnote{固件~RIP~在打印机内置处理器上运行，硬件~RIP~常见于高端打印设备。}。

Ghostscript~是一个基于~RIP~的软件包，除了~RIP~它还有一些其它功能，比如处理~EPS，把~PS~转换为~PDF~等。Ghostscript~已经被移植到~Windows、Unix/Linux、Mac OS~等多种操作系统，和它匹配的前端图形用户界面（GUI）有\href{http://pages.cs.wisc.edu/~ghost/}{GSview、Ghostview、gv}等。

\subsection{格式转换}
\label{sec:convert_format}
DVI、PS、PDF~等格式的的转换关系如\Fref{fig:convert_format}所示。

\begin{figure}[htbp]
\centering
\begin{tikzpicture}
    \node[box] (tex) {.tex};
    \node[box] (dvi) [right=5 of tex] {.dvi};
    \node[box] (pdf) [right=6 of dvi] {.pdf};
    \node[box] (ps) [above=3 of pdf] {.ps};
    \path (tex) edge [arrow] node[auto] {latex} (dvi)
        (dvi) edge [arrow] node[auto] {dvipdfm} (pdf)
        (dvi.north) [arrow,draw] to node[above,sloped] {dvips} (ps.west)
        (ps) edge [arrow] node[right] {ps2pdf} (pdf)
        (tex) edge [arrow,bloop] (pdf);
    \node [below=.7 of dvi] {pdflatex};
\end{tikzpicture}
\caption{格式转换}
\label{fig:convert_format}
\end{figure}

最早的~driver~是~\verb|dvips|，它把~DVI~转换为~PS。\verb|dvipdf|~把~DVI~转为~PDF，它后来被~\verb|dvipdfm|~所取代；\verb|dvipdfm|~主要用于处理单字节字符，1999~年之后停止开发；在~\verb|dvipdfm|~基础上发展来的~\verb|dvipdfmx|~可以处理多字节编码（字符编码详见\ref{sec:encoding}节）。

pdf\TeX~是一种特殊的driver，它跳过~DVI，直接用~\TeX~源文件生成~PDF。基于~pdf\TeX~的~pdf\LaTeX~则把\LaTeX~源文件转为~PDF。

包老师倾向于~\verb|dvipdfmx|，因为它对图形格式的兼容性较好，而且擅长处理中文。

得到~DVI~后，我们可以在控制台用以下命令把它转为~PDF。
\begin{code}
dvipdfm hello_world(.dvi)
\end{code}

我们也可以把它转为~PS，接着用~Ghostscript~的一个命令行程序把它转换为~PDF，注意第二个命令需要~\verb|.ps|~后缀。一般情况下不推荐这种方法，因为它多了个步骤。
\begin{code}
dvips hello_world(.dvi)
ps2pdf hello_world.ps
\end{code}

pdf\LaTeX~用法如下。
\begin{code}
pdflatex hello_world(.tex)
\end{code}

\section{\LaTeX~语句}
\LaTeX~源文件的每一行称作一条语句（statement），语句可以分三种：命令（command）、数据（data）和注释（comment）。

命令分为两种：普通命令和环境（environment）。普通命令以\verb|\|~起始，大多只有一行；而环境包含一对起始声明和结尾声明，用于多行的场合。命令和环境可以互相嵌套。

数据就是普通内容。注释语句以~\verb|%|~起始，它在编译过程中被忽略。

例如在\ref{sec:hello_world}节例1中，第一行是注释，第二行是普通命令；第三、五行是环境的起始和结尾声明；第四行是数据。

\section{文档结构}
\subsection{文档类、序言、正文}
\LaTeX~源文件的结构分三大部分，依次为：文档类声明、序言（可选）、正文。

文档类声明用来指定文档的类型；序言（preamble）用来完成一些特殊任务，比如引入宏包，定义命令，设置环境等；文档的实际内容则放在正文部分。这里的正文指得是\verb|\begin{document}|和\verb|\end|~\verb|{document}|之间的部分，和通常人们心目中的“正文”概念有所出入。

这三部分的基本语法如下：
\begin{code}
\documentclass[options]{class}  %文档类声明
\usepackage[options]{package}   %引入宏包
...
\begin{document}                %正文
...
\end{document}
\end{code}

常用的文档类（documentclass）有三种：\verb|article、report、book|，它们的常用选项见\fref{tab:class_options}。

\begin{table}[htbp]
\centering
\caption{文档类常用选项}
\label{tab:class_options}
\begin{tabularx}{350pt}{lX}
    \toprule
    10pt, 11pt, 12pt & 正文字号，缺省10pt。\LaTeX~会根据正文字号选择标题、上下标等的字号。\\
    letterpaper, a4paper & 纸张尺寸，缺省是~letter。\\
    notitlepage, titlepage & 标题后是否另起新页。article~缺省~notitlepage，report~和~book~缺省有~titlepage。\\
    onecolumn, twocolumn & 栏数，缺省单栏。\\
    oneside, twoside & 单面双面。article~和~report~缺省单面，book~缺省双面。\\
    landscape & 打印方向横向，缺省纵向。\\
    openany, openright & 此选项只用于~report~和~book。report~缺省~openany~，book~缺省~openright。\\
    draft & 草稿模式。有时某些行排得过满，draft~模式可以在它们右边标上粗黑线提醒用户。\\
    \bottomrule
\end{tabularx}
\end{table}

\LaTeX~的核心只提供基本的功能，系统以宏包（package）的形式提供附加功能或增强原有功能。其它一些编程语言也有类似的模块化机制，比如~C/C++~的~\verb|#include|，Java~的~\verb|import|。

\subsection{标题、摘要、章节}


一份文档正文部分的开头通常有标题、作者、摘要等信息，之后是章节等层次结构，内容则散布于层次结构之间。

标题、作者、日期等命令如下，注意\verb|\maketitle|~命令要放在最后。
\begin{code}
\title{标题}
\author{作者}
\today
\maketitle
\end{code}

摘要环境用法如下：
\begin{code}
\begin{abstract}
...
\end{abstract}
\end{code}

常用的层次结构命令如下，
\begin{code}
\chapter{...}
\section{...}
\subsection{...}
\subsubsection{...}
\end{code}

每个高级层次可以包含若干低级层次。\verb|article|~中没有~\verb|chapter|，而~\verb|report|~和~\verb|book|~则支持上面所有层次。

\subsection{目录}

我们可以用~\verb|\tableofcontents|~命令来生成整个文档的目录，\LaTeX~会自动设定目录包含的章节层次，也可以用~\verb|\setcounter|~命令来指定目录层次深度。
\begin{code}
\tableofcontents
\setcounter{tocdepth}{2}
\end{code}

如果不想让某个章节标题出现在目录中，可以使用以下带~\verb|*|~的命令来声明章节。
\begin{code}
\chapter*{...}
\section*{...}
\subsection*{...}
\end{code}

类似地，我们也可以用以下命令生成插图和表格的目录，插图和表格功能将在后面章节中介绍。

\begin{code}
\listoffigures
\listoftables
\end{code}

当章节或图表等结构发生变化时，我们需要执行两遍编译命令以获得正确结果。\LaTeX~之所以设计成这样可能是因为当时的电脑内存容量有限。

\section{文字排版}
\subsection{字符输入}
文档中可以输入的内容大致可以分为：普通字符、控制符、特殊符号、注音符号、预定义字符串等。而这些内容有两种输入模式：文本模式（缺省）和数学模式，普通的行间（inline）数学模式用\verb|\$...\$|来表示。

\LaTeX~中有些字符（例如~\verb|# $ % ^ & _ { } ~ \|~等）被用作特殊的控制符，所以不能直接输入，多数需要在前面加个~\verb|\|。而~\verb|\|~本身则要用~\verb|\textbackslash|~命令来输入，因为~\verb|\\|~被用作了换行指令。很奇怪为什么不用~C~语言的~\verb|\n|，也许是因为~\TeX~的编程语言是~Pascal。

\begin{code}
\# \$ \% \^{} \& \_ \{ \} \~{} \textbackslash
\end{code}

\Fref{tab:symbol}~提供了一些符号的输入方法示例，完整的符号列表见~Scott Pakin的《The Comprehensive \LaTeX~ Symbol List》\citep{Pakin_2008}。

\begin{table}[htbp]
\centering
\caption{一些符号和预定义字符串}
\label{tab:symbol}
\begin{tabular}{llllll}
    \toprule
    \multicolumn{2}{c}{特殊符号} & \multicolumn{2}{c}{注音符号} & 
    \multicolumn{2}{c}{预定义字符串} \\
    \cmidrule(lr){1-2} \cmidrule(lr){3-4} \cmidrule(lr){5-6}
    \textcopyright  & \verb|\textcopyright|  & \aa & \verb|\aa| & 
        \today & \verb|\today| \\
    \textregistered & \verb|\textregistered| & \AA & \verb|\AA| & 
        \TeX & \verb|\TeX| \\
    $^\circ$C       & \verb|$^\circ$C|       & \ae & \verb|\ae| & 
        \LaTeX & \verb|\LaTeX| \\
    \textyen        & \verb|\textyen|        & \o  & \verb|\o| &
        \LaTeXe & \verb|\LaTeXe| \\
    \pounds         & \verb|\pounds|         & \"o & \verb|\"o| &
        \MF & \verb|\MF| \\
    \texteuro       & \verb|\texteuro|       & \^o & \verb|\^o| &
        \MP & \verb|\MP| \\
    \dots           & \verb|\dots|           & \~o & \verb|\~o| & \\
    \bottomrule
\end{tabular}
\end{table}

\subsection{换行、换页、断字}
通常~\LaTeX~会自动换行、换页。用户也可以用~\verb|\\|~或~\verb|\newline|~来强制换行；用~\verb|\newpage|~来强制换页。

一般情况下~\LaTeX~会尽量均匀地断字（Hyphenate），使得每一行的字间距分布整齐。但有时我们也需要显式指明断字位置，比如下例就指明~BASIC~这个词不能断开，而~blar-blar-blar~可以在-处断开。
\begin{code}
\hyphenation{BASIC blar-blar-blar}
\end{code}

\subsection{字样、字号}

\LaTeX~会自动调整正文、标题、章节、上下标、脚注等的字样\footnote{关于字样详见\ref{sec:typeface}节}、字号。我们也可以用\fref{tab:typeface_command}中的命令来设置字样；用\fref{tab:fontsize_command}中的命令来设置相对字号，比如正文字号是~10pt、11pt、12pt~时，tiny的字号就分别是~5pt、6pt、6pt。

\LaTeX~有一个特别的字样强调命令：\verb|\emph|，它在不同字样和装饰环境下有不同效果。比如周围文字是正体，它就是斜体；反之它就是正体。

\begin{table}[hbtp]
\centering
\caption{字样命令}
\label{tab:typeface_command}
\begin{tabular}{llll}
    \toprule
    \verb|\textrm{...}| & \textrm{roman} & 
    \verb|\textbf{...}| & \textbf{bold face} \\
    \verb|\textsf{...}| & \textsf{sans serif} & 
    \verb|\textit{...}| & \textit{italic} \\
    \verb|\texttt{...}| & \texttt{typewriter} & 
    \verb|\textsl{...}| & \textsl{slanted} \\
    \\
    \verb|\emph{...}|   & \emph{emphasized} & 
    \verb|\underline{...}|  & \underline{underline} \\
    \verb|\textsc{...}| & \textsc{Small Caps} & & \\
    \bottomrule
\end{tabular}
\end{table}

\begin{table}[htbp]
\centering
\caption{字号命令}
\label{tab:fontsize_command}
\begin{tabular}{llll}
    \toprule
    & \multicolumn{3}{c}{正文字号} \\
    \cmidrule(lr){2-4}
    命令 & 10pt & 11pt & 12pt \\
    \midrule
    \verb|\tiny|         & 5pt  & 6pt  & 6pt \\
    \verb|\scriptsize|   & 7pt  & 8pt  & 8pt \\
    \verb|\footnotesize| & 8pt  & 9pt  & 10pt \\
    \verb|\small|        & 9pt  & 10pt & 11pt \\
    \verb|\normalsize|   & 10pt & 11pt & 12pt \\
    \verb|\large|        & 12pt & 12pt & 14pt \\
    \verb|\Large|        & 14pt & 14pt & 17pt \\
    \verb|\LARGE|        & 17pt & 17pt & 20pt \\
    \verb|\huge|         & 20pt & 20pt & 25pt \\
    \verb|\Huge|         & 25pt & 25pt & 25pt \\
    \bottomrule
\end{tabular}
\end{table}

\section{常用命令环境}
\subsection{列表}

\LaTeX~中有三种列表环境：\verb|itemize、enumerate、description|，它们的一般用法如下：

\begin{demo}
\begin{itemize}
    \item C++
    \item Java
    \item HTML
\end{itemize}
\end{demo}

\begin{demo}
\begin{enumerate}
    \item C++
    \item Java
    \item HTML
\end{enumerate}
\end{demo}

\begin{demo}
\begin{description}
    \item{C++} 一种编程语言
    \item{Java} 另一种编程语言
    \item{HTML} 一种标记语言
\end{description}
\end{demo}

\subsection{对齐}
\LaTeX~中的段落缺省两端对齐（fully justified），我们也可以让段落居左、居右或居中对齐。

\begin{demo}
\begin{flushleft}
本段落\\
居左
\end{flushleft}
\end{demo}

\begin{demo}
\begin{flushright}
本段落\\
居右
\end{flushright}
\end{demo}

\begin{demo}
\begin{center}
本段落\\
居中
\end{center}
\end{demo}

\subsection{摘录}
\LaTeX~中有三种摘录环境：\verb|quote、quotation、verse|。\verb|quote|~两端都缩进，\verb|quotation|~在~\verb|quote|~的基础上增加了首行缩进，\verb|verse|~比~\verb|quote|~多了第二行起的缩进。

\begin{demo}
正文
\begin{quote}
引文两端都缩进。
\end{quote}
正文
\end{demo}

\begin{demo}
正文
\begin{quotation}
引文两端缩进，首行缩进。
\end{quotation}
正文
\end{demo}

\begin{demo}
正文
\begin{verse}
引文两端缩进，第二行起缩进。
\end{verse}
正文
\end{demo}

\subsection{原文照排}
一般文档中，命令和源代码通常使用等宽字样来表示，也就是原文照排。对此~\LaTeX~提供了~\verb|\verb|~命令（一般用于在正文中插入较短的命令）和~\verb|verbatim|~环境。后者有带~\verb|*|~的版本用来标明空格。

\begin{demo}
正文中插入\verb|command|
\begin{verbatim}
printf("Hello, world!");
\end{verbatim}
\begin{verbatim*}
printf("Hello, world!");
\end{verbatim*}
\end{demo}

\subsection{交叉引用}
我们常常需要引用文档中~\verb|section、subsection、figure、table|~等对象的编号，这种功能叫作交叉引用（cross referencing）。

\LaTeX~中可以用~\verb|\label{marker}|~命令来定义一个标记，标记名可以是任意字符串，但是在全文中须保持唯一。之后可以用~\verb|\ref{marker}|~命令来引用标记处章节或图表的编号，用~\verb|\pageref{marker}|~来引用标记处的页码。

\begin{demo}
被引用处\label{sec}\\
...\\
第\pageref{sec}页\ref{sec}节
\end{demo}

文档中新增交叉引用后，第一次执行~\verb|latex|~或~\verb|pdflatex|~编译命令时会得到类似下面的警告信息。因为第一次编译只会扫描出有交叉引用的地方，第二次编译才能得到正确结果。

\begin{code}
LaTeX Warning: There were undefined references.
...
LaTeX Warning: Label(s) may have changed. Rerun to get cross-
references right.
\end{code}

\subsection{脚注}
脚注（footnote）的一般用法如下:
\begin{demo}
这里是一段正文。\footnote{这里是一段脚注。}
\end{demo}

\section{长度单位}
\LaTeX~中的常用长度单位如\Fref{tab:unit}~所示。point~是个传统印刷业采用的单位，而~big point~是~Adobe~推出~PS~时新定义的单位。em~是个相对单位，比如当前字体是~11pt~时，1em~就是~11pt。
\begin{table}[htbp]
\caption{常用长度单位}
\label{tab:unit}
\centering
\begin{tabular}{llllll}
    \toprule
    in & 英寸 & pt & point, 1/72.27 in  & em & 当前字体中字母M的宽度 \\
    cm & 厘米 & bp & big point, 1/72 in & ex & 当前字体中字母x的高度 \\
    mm & 毫米 & pc & pica, 12 pt        & mu & math unit，1/18 em \\
    \bottomrule
\end{tabular}
\end{table}

\section{盒子}
\LaTeX~在排版时把每个对象（小到一个字母，大到一个段落）都视为一个矩形盒子（box），我们在~HTML~和~CSS~中也可以见到类似的模型。

\subsection{mbox~和~fbox}

\LaTeX~中最简单的盒子是~\verb|\mbox|~和~\verb|\fbox|。前者把一组对象组合起来，后者在此基础上加了个边框。
\begin{demo}
\mbox{010 6278 5001}
\fbox{010 6278 5001}
\end{demo}

\subsection{makebox~和~framebox}
稍复杂的~\verb|\makebox|~和~\verb|\framebox|~提供了宽度和对齐方式控制选项。这里用~l、r、s~分别代表居左、居右和分散对齐。
\begin{demo}
%语法：[宽度][对齐方式]{内容}
\makebox[100pt][l]{居左}
\framebox[100pt][r]{居右}
\end{demo}

\subsection{parbox~和~minipage}
大一些的对象比如整个段落可以用~\verb|\parbox|~命令和~\verb|\minipage|~环境，两者语法类似，也提供了对齐方式和宽度的选项。但是这里的对齐方式是指与周围内容的纵向关系，用~t、c、b~分别代表居顶、居中和居底对齐。

\begin{demo}
%语法：[对齐方式]{宽度}{内容}
\parbox[c]{90pt}{锦瑟无端五十弦，\\一弦一柱思华年。}李商隐
\end{demo}

细心的读者会发现~\verb|\parbox|~和~\verb|\minipage|~的选项排列顺序和~\verb|\makebox|~和~\verb~\framebox|~的不一致，可能出自不同的作者。

\bibliographystyle{unsrtnat}
\bibliography{reading}
\newpage
