LaTeX 排版(一)——基础应用
1. LaTeX 基本概念
LaTeX\LaTeXLATE?X 的源代碼為文本文件。這些文本除了文字本身,還包括各種命令,用在排版公式、劃分文檔結構、控制樣式等等不同的地方.
1.1 LaTeX 命令和代碼結構
1.1.1 LaTeX 命令
LaTeX\LaTeXLATE?X 中命令以 \ 開頭,為以下兩種形式之一:
- 反斜線和后面的一串字母,如 \LaTeX,它們以任意非字母符號(空格、數字、標點等)為界限
- 反斜線和后面的單個非字母符號,如 \$
命令是大小寫敏感的
一些 LaTeX\LaTeXLATE?X 命令可以接收一些參數,參數的內容會影響命令的效果. LaTeX\LaTeXLATE?X 的參數分為可選參數和必選參數. 可選參數以方括號 [ 和 ] 包裹;必選參數一般以花括號 { 和 } 包裹. 還有些命令可以帶一個星號 *,帶星號和不帶星號的命令效果有一定差異. 初次接觸這些概念時,可以粗略地把星號看作一種特殊的可選參數.
1.1.2 LaTeX 環境
LaTeX\LaTeXLATE?X 中還包括環境,用以令一些效果在局部生效,或是生成特殊的文檔元素. LaTeX\LaTeXLATE?X 環境的用法為一對命令 \begin 和 \end:
\begin{?environment name?}[?optional arguments?]{?mandatory arguments?} … \end{?environment name?}- 其中 ?environment name? 為環境名,\begin 和 \end 中填寫的環境名應當一致
- 類似命令,{?mandatory arguments?} 和 [?optional arguments?] 為環境所需的必選和可選參數
- 部分環境允許嵌套使用
1.1.3 LaTeX 分組
有些命令(如 \bfseries)會對其后所有內容產生作用,若要限制其作用范圍,則需要使用分組.
LaTeX\LaTeXLATE?X 使用一對花括號 { 和 } 作為分組,在分組中使用的命令被限制在分組內,不會影響到分組外的內容.
上文提到的 LaTeX\LaTeXLATE?X 環境隱含了一個分組,在環境中的命令被包裹在分組內.
1.1.4 LaTeX 源代碼結構
LaTeX\LaTeXLATE?X 源代碼以一個 \documentclass 命令作為開頭,它指定了文檔使用的文檔類. document 環境當中的內容是文檔正文.
在 \documentclass和 \begin{document} 之間的位置稱為導言區,在導言區中一般會使用 \usepackage 命令調用宏包,還會進行文檔的全局設置.
\documentclass{...} % ... 為某文檔類 % 導言區 \begin{document} % 正文內容 \end{document} % 此后內容會被忽略1.2 LaTeX 宏包和文檔類
1.2.1 文檔類
文檔類規定了 LaTeX\LaTeXLATE?X 源代碼所要生成的文檔的性質——普通文章、書籍、演示文稿、個人簡歷等等. LaTeX\LaTeXLATE?X 源代碼的開頭須用 \documentclass 指定文檔類:
\documentclass[?options?]{?class-name?}其中 ?class-name? 為文檔類的名稱,如 LaTeX\LaTeXLATE?X 提供的 article, report, book,在其基礎上派生的一些文檔類如支持中文排版的 ctexart / ctexrep / ctexbook,或者有其它功能的一些文檔類,如 moderncv / beamer 等, LaTeX\LaTeXLATE?X 提供的基礎文檔類如下所示:
可選參數 ?options? 為文檔類指定選項,以全局地規定一些排版的參數,如字號、紙張大小、單雙面等等。比如調用 article 文檔類排版文章,指定紙張為 A4 大小,基本字號為 11pt,雙面排版:
\documentclass[11pt,twoside,a4paper]{article}LaTeX\LaTeXLATE?X 的三個標準文檔類可指定的選項包括:
- 10pt,11pt,12pt 指定文檔的基本字號,默認為 10pt.
- a4paper, letterpaper 指定紙張大小,默認為美式信紙 letterpaper. 可指定選項還包括 a5paper,b5paper,executivepaper 和 legalpaper.
- twoside,oneside 指定單面/雙面排版. 雙面排版時,奇偶頁的頁眉頁腳、頁邊距不同. article 和 report 默認為 oneside,book 默認為 twoside.
- onecolumn,twocolumn 指定單欄/雙欄排版,默認為 onecolumn.
- openright,openany 指定新的一章 \chapter 是在奇數頁(右側)開始,還是直接緊跟著上一頁開始. report 默認為 openany,book 默認為 openright,對 article 無效.
- landscape 指定橫向排版,默認為縱向.
- titlepage, notitlepage 指定標題命令 \maketitle 是否生成單獨的標題頁,article 默認為 notitlepage,report 和 book 默認為 titlepage.
- fleqn 令行間公式左對齊,默認為居中對齊.
- leqno 將公式編號放在左邊,默認為右邊.
- draft,final 指定草稿/終稿模式。草稿模式下,斷行不良的地方會在行尾添加一個黑色方塊,默認為 final.
1.2.2 宏包
在使用 LaTeX\LaTeXLATE?X 時,時常需要依賴一些擴展來增強或補充 LaTeX\LaTeXLATE?X 的功能,比如排版復雜的表格、插入圖片、增加顏色甚至超鏈接等等,這些擴展稱為宏包. 調用宏包的方法非常類似調用文檔類的方法:
\usepackage[?options?]{?package-name?}宏包(包括前面所說的文檔類)可能定義了許多命令和環境,或者修改了 LaTeX\LaTeXLATE?X 已有的命令和環境。它們的用法說明記在相應宏包和文檔類的幫助文檔。在 Windows 命令提示符或者 Linux 終端下輸入命令可查閱相應文檔:
texdoc ?pkg-name?1.3 LaTeX 用到的文件
- .tex:源碼文件
- .sty:宏包文件,宏包的名稱與文件名一致
- .cls:文檔類文件,文檔類名稱與文件名一致
- .bib:BIBTEX 參考文獻數據庫文件
- .bst:BIBTEX 用到的參考文獻格式模板
LaTeX\LaTeXLATE?X 在編譯過程中除了生成 .dvi 或 .pdf 格式的文檔外,還可能會生成相當多的輔助文件和日志. 一些功能如交叉引用、參考文獻、目錄、索引等,需要先通過編譯生成輔助文件,然后再次編譯時讀入輔助文件得到正確的結果,所以復雜的 LaTeX\LaTeXLATE?X 源代碼可能要編譯多次:
- .aux:LaTeX\LaTeXLATE?X 生成的主輔助文件,記錄交叉引用、目錄、參考文獻的引用等
- .toc:LaTeX\LaTeXLATE?X 生成的目錄記錄文件
- .lof LaTeX\LaTeXLATE?X 生成的圖片目錄記錄文件
- .lot LaTeX\LaTeXLATE?X 生成的表格目錄記錄文件
- .bbl BIBTEX 生成的參考文獻記錄文件
- .idx LaTeX\LaTeXLATE?X 生成的供 makeindex 處理的索引記錄文件
- .ind makeindex 處理 .idx 生成的用于排版的格式化索引文件
- .out hyperref 宏包生成的 PDF 書簽記錄文件
1.4 文件的組織方式
當編寫長篇文檔時,例如當編寫書籍、畢業論文時,單個源文件會使修改、校對變得十分困難. 將源文件分割成若干個文件,例如將每章內容單獨寫在一個文件中,會大大簡化修改和校對的工作.
LaTeX\LaTeXLATE?X 提供了命令 \include 用來在源代碼里插入文件:
\include{?filename?}?filename? 為文件名(不帶 .tex擴展名),如果和要編譯的主文件不在一個目錄中,則要加上相對或絕對路徑
值得注意的是 \include 在讀入 ?filename? 之前會另起一頁. 有的時候我們并不需要這樣,而是用 \input 命令,它純粹是把文件里的內容插入:
\input{?filename?}當導言區內容較多時,常常將其單獨放置在一個 .tex 文件中,再用 \input 命令插入,復雜的圖、表、代碼等也會用類似的手段處理.
LaTeX\LaTeXLATE?X 還提供了一個 \includeonly 命令來組織文件,用于導言區,指定只載入某些文件. 導言區使用了 \includeonly 后,正文中不在其列表范圍的 \include 命令不會起效:
\includeonly{?filename1?,?filename2?,…}需要注意的是,使用 \include 和 \input 命令載入的文件名最好不要加空格和特殊字符,也盡量避免使用中文名,否則很可能會出錯.
最后介紹一個實用的工具宏包 syntonly。加載這個宏包后,在導言區使用 \syntaxonly 命令,可令 LaTeX\LaTeXLATE?X 編譯后不生成 DVI 或者PDF 文檔,只排查錯誤,編譯速度會快不少:
\usepackage{syntonly} \syntaxonly2. 用 LaTeX 排版文字
2.1 示例
\documentclass{ctexart} \begin{document}在\LaTeX{}中排版中文。漢字和English單詞混排,通常不需要在中英文之間添加額外的空格。當然,為了代碼的可讀性,加上漢字和English 之間的空格也無妨。漢字換行時不會引入多余的空格。 \end{document}輸出結果為:
2.2 LaTeX 中的字符
2.2.1 空格和分段
LaTeX\LaTeXLATE?X 源代碼中,空格鍵和 Tab 鍵輸入的空白字符視為“空格”,連續的若干個空白字符視為一個空格.
一行開頭的空格忽略不計.
行末的換行符視為一個空格;但連續兩個換行符,也就是空行,會將文字分段.
多個空行被視為一個空行,也可以在行末使用 \par 命令分段。
2.2.2 注釋
LaTeX\LaTeXLATE?X 用 % 字符作為注釋. 在這個字符之后直到行末,所有的字符都被忽略,行末的換行符也不引入空格.
2.2.3 特殊字符
\documentclass{ctexart} \begin{document} \# \$ \% \& \{ \} \_ \^{} \~{} \textbackslash \end{document}2.2.4 連字
西文排版中經常會出現連字(ligatures),常見的有 ff 、 fi 、 fl 、 ffi 、 ffl
\documentclass{ctexart} \begin{document} It's difficult to find \ldots\\ It's dif{}f{}icult to f{}ind \ldots \end{document}2.2.5 標點符號
中文的標點符號(絕大多數為非ASCII 字符)使用中文輸入法輸入即可,一般不需要過多留意. 而輸入西文標點符號時,有不少地方需要留意.
-
引號
LaTeX\LaTeXLATE?X 中單引號 ‘ 和 ’ 分別用 ` 和 ’ 輸入;雙引號 “ 和 ” 分別用 `` 和 ‘’ 輸入
``Please press the `x' key.''中文的引號 ‘ ’ 和 “ ” 與西文的引號實際上是同一組符號,但由于中西文通常用不同的字體顯示,它們的具體形狀和寬度可能有所不同。在使用 ctex 宏包或文檔類的情況下,中文引號可以通過輸入法直接輸入.
-
連字號破折號
LaTeX\LaTeXLATE?X 中有三種長度的“橫線”可用:連字號(hyphen)、短破折號(en-dash)和長破折號(em-dash).
它們分別有不同的用途:連字號 - 用來組成復合詞;短破折號 – 用來連接數字表示范圍;長破折號 — 用來連接單詞,語義上類似中文的破折號.
daughter-in-law, X-rated\\ pages 13--67\\ yes---or no? -
省略號
LaTeX\LaTeXLATE?X 提供了 \ldots 命令表示省略號,相對于直接輸入三個點的方式更為合理.
\dots 與 \ldots 命令等效.
2.3 斷行和斷頁
LaTeX\LaTeXLATE?X 將文字段落在合適的位置進行斷行,盡可能做到每行的疏密程度勻稱,單詞間距不會過寬或過窄. 文字段落和公式、圖表等內容從上到下順序排布,并在合適的位置斷頁,分割成勻稱的頁面. 在絕大多數時候,我們無需自己操心斷行和斷頁,但偶爾會遇到需要手工調整的地方.
2.3.1 單詞間距
在西文排版實踐中,斷行的位置優先選取在兩個單詞之間,也就是在源代碼中輸入的“空格”. “空格”本身通常生成一個間距,它會根據行寬和上下文自動調整,文字密一些的地方,單詞間距就略窄,反之略寬.
文字在單詞間的“空格”處斷行時,“空格”生成的間距隨之舍去. 我們可以使用字符 ~ 輸入一個不會斷行的空格(高德納稱之為 tie,“帶子”),通常用在英文人名、圖表名稱等上下文環境:
Fig.~2a \\ Donald~E. Knuth2.3.2 手動斷行和斷頁
如果我們確實需要手動斷行,可使用如下命令:
\\[?length?] \\*[?length?] \newline它們有兩點區別:
- 一是 \\ 可以帶可選參數 ?length?,用于在斷行處向下增加垂直間距,而 \newline 不帶可選參數
- 二是 \\ 也在表格、公式等地方用于換行,而 \newline 只用于文本段落中
帶星號的 \\ 表示禁止在斷行處分頁
斷頁的命令有兩個:
\newpage \clearpage通常情況下兩個命令都起到另起一頁的作用,區別在于:
- 第一,在雙欄排版模式中 \newpage 起到另起一欄的作用,\clearpage 則能夠另起一頁
- 第二,在涉及浮動體的排版上行為不同
有時候我們不滿足于 LaTeX\LaTeXLATE?X 默認的斷行和斷頁位置,需要進行微調,可以用以下命令告訴 LaTeX\LaTeXLATE?X 哪些地方適合斷行或斷頁,哪些地方不適合:
\linebreak[?n?] \nolinebreak[?n?] \pagebreak[?n?] \nopagebreak[?n?]以上命令都帶一個可選參數,用數字 ?n? 代表適合/不適合的程度,取值范圍為 0–4,不帶可選參數時,缺省為 4. 比如 \linebreak 或者 \linebreak[4] 意味著此處需要強行斷行;`nopagebreak或\nopagebreak[4]` 意味著禁止在此處斷頁.
以上命令適合給出優先考慮斷行斷頁/禁止斷行斷頁的位置,但不適合直接拿來斷行或斷頁,使用 \newline 或 \newpage 等命令是更好的選擇. 因為 \newline 和 \newpage 會在斷行/斷頁位置填充適當的間距,但 \linebreak 和 \pagebreak 不能,使用這些命令強行斷行/斷頁可能會制造出糟糕的排版效果.
使用\verb|\newline| 斷行的效果 \newline 與使用\verb|\linebreak| 斷行的效果 \linebreak 進行對比。2.3.3 斷詞
如果 LaTeX\LaTeXLATE?X 遇到了很長的英文單詞,僅在單詞之間的“空格”處斷行無法生成疏密程度勻稱的段落時,就會考慮從單詞中間斷開. 對于絕大多數單詞,LaTeX\LaTeXLATE?X 能夠找到合適的斷詞位置,在斷開的行尾加上連字符 -。
如果一些單詞沒能自動斷詞,我們可以在單詞內手動使用 \- 命令指定斷詞的位置:
I think this is: su\-per\-cal\-% i\-frag\-i\-lis\-tic\-ex\-pi\-% al\-i\-do\-cious.3. 文檔元素
3.1 章節和目錄
3.1.1 章節標題
一篇結構化的、條理清晰文檔一定是層次分明的,通過不同的命令分割為章、節、小節. 三個標準文檔類 article、report 和 book 提供了劃分章節的命令:
\chapter{?title?} \section{?title?} \subsection{?title?} \subsubsection{?title?} \paragraph{?title?} \subparagraph{?title?}其中 \chapter 只在 report 和 book 文檔類有定義
這些命令生成章節標題,并能夠自動編號.
上述命令除了生成帶編號的標題之外,還向目錄中添加條目,并影響頁眉頁腳的內容,每個命令有兩種變體:
-
帶可選參數
\section[?short title?]{?title?}標題使用 ?title? 參數,在目錄和頁眉頁腳中使用 ?short title? 參數
-
帶星號
\section*{?title?}標題不帶編號,也不生成目錄項和頁眉頁腳
-
article 文檔類帶編號的層級為 \section , \subsection , \subsubsection 三級
-
report 和 book 文檔類帶編號的層級為 \chapter , \section , \subsection 三級
LaTeX\LaTeXLATE?X 及標準文檔類并未提供為 \section 等章節命令定制格式的功能,這一功能由 titlesec 宏包提供
3.1.2 目錄
在 LaTeX\LaTeXLATE?X 中生成目錄非常容易,只需在合適的地方使用命令:
\tableofcontents這個命令會生成單獨的一章(report 或 book)或一節(article),標題默認為“Contents”
\tableofcontents 生成的章節默認不寫入目錄(\section 或 \chapter),可使用 tocbibind 等宏包修改設置
titletoc、tocloft 等宏包提供了具體定制目錄項格式的功能
正確生成目錄項,一般需要編譯兩次源代碼
3.1.3 文檔結構的劃分
所有標準文檔類都提供了一個 \appendix 命令將正文和附錄分開,使用 \appendix 后,最高一級章節改為使用拉丁字母編號,從 A 開始
book 文檔類還提供了前言、正文、后記結構的劃分命令:
- \frontmatter 前言部分,頁碼使用小寫羅馬數字;其后的 \chapter 不編號
- \mainmatter 正文部分,頁碼使用阿拉伯數字,從 111 開始計數,其后的章節編號正常
- \backmatter 后記部分,頁碼格式不變,繼續正常計數;其后的 \chapter 不編號
以上三個命令還可和 \appendix 命令結合,生成有前言、正文、附錄、后記四部分的文檔
\documentclass{book} % 導言區,加載宏包和各項設置,包括參考文獻、索引等 \usepackage{makeidx} % 調用makeidx 宏包,用來處理索引 \makeindex % 開啟索引的收集 \bibliographystyle{plain} % 指定參考文獻樣式為plain \begin{document} \frontmatter % 前言部分 \maketitle % 標題頁 \include{preface} % 前言章節preface.tex \tableofcontents \mainmatter % 正文部分 \include{chapter1} % 第一章chapter1.tex \include{chapter2} % 第二章chapter2.tex ... \appendix % 附錄 \include{appendixA} % 附錄A appendixA.tex ... \backmatter % 后記部分 \include{prologue} % 后記prologue.tex \bibliography{books} % 利用BibTeX 工具從數據庫文件books.bib 生成參考文獻 \printindex % 利用makeindex 工具生成索引 \end{document}3.2 標題頁
LaTeX\LaTeXLATE?X 支持生成簡單的標題頁. 首先需要給定標題和作者等信息:
\title{?title?} \author{?author?} \date{?date?}其中前兩個命令是必須的(不用 \title 會報錯;不用 \author 會警告),\date 命令可選
LaTeX\LaTeXLATE?X 還提供了一個 \today 命令自動生成當前日期,\date 默認使用 \today.
在 \title、\author 等命令內可以使用 \thanks 命令生成標題頁的腳注,用 \and 隔開多個人名.
在信息給定后,就可以使用 \maketitle 命令生成一個簡單的標題頁了:
\title{Test title} \author{ Mary\thanks{E-mail:*****@***.com} \and Ted\thanks{Corresponding author} \and Louis} \date{\today}article 文檔類的標題默認不單獨成頁,而 report 和 book 默認單獨成頁.
可在 \documentclass 命令調用文檔類時指定 titlepage / notitlepage 選項以修改默認的行為.
LaTeX\LaTeXLATE?X 標準類還提供了一個簡單的 titlepage 環境,生成不帶頁眉頁腳的一頁. 用戶可以在這個環境中使用各種排版元素自由發揮,生成自定義的標題頁以替代 \maketitle 命令. 甚至可以利用 titlepage 環境重新定義 \maketitle:
\renewcommand{\maketitle}{\begin{titlepage} ... % 用戶自定義命令 \end{titlepage}}事實上,為標準文檔類指定了 titlepage 選項以后,使用 \maketitle 命令生成的標題頁就是一個 titlepage 環境.
3.3 交叉引用
交叉引用是 LaTeX\LaTeXLATE?X 強大的自動排版功能的體現之一,在能夠被交叉引用的地方,如章節、公式、圖表、定理等位置使用 \label 命令:
\label{?label-name?}之后可以在別處使用 \ref 或 \pageref 命令,分別生成交叉引用的編號和頁碼:
\ref{?label-name?} \pageref{?label-name?}【Example】
A reference to this subsection \label{sec:this} looks like: ``see section~\ref{sec:this} on page~\pageref{sec:this}.''為了生成正確的交叉引用,一般也需要多次編譯源代碼
\label 命令可用于記錄各種類型的交叉引用,使用位置分別為:
- 章節標題:在章節標題命令 \section 等之后緊接著使用
- 行間公式:單行公式在公式內任意位置使用;多行公式在每一行公式的任意位置使用
- 有序列表:在 enumerate 環境的每個 \item 命令之后、下一個 \item 命令之前任意位置使用
- 圖表標題:在圖表標題命令 \caption 之后緊接著使用
- 定理環境:在定理環境內部任意位置使用
3.4 腳注和邊注
3.4.1 腳注
使用 \footnote 命令可以在頁面底部生成一個腳注:
\footnote{?footnote?}假如我們輸入以下文字和命令:
“天地玄黃,宇宙洪荒。日月盈昃,辰宿列張。”\footnote{出自《千字文》。}正文顯示為:
腳注在頁面底部顯示為:
有些情況下(比如在表格環境、各種盒子內)使用 \footnote 并不能正確生成腳注. 我們可以分兩步進行,先使用 \footnotemark 為腳注計數,再在合適的位置用\footnotetext 生成腳注。比如:
\begin{tabular}{l} \hline “天地玄黃,宇宙洪荒。日月盈昃,辰宿列張。”\footnotemark \\ \hline \end{tabular} \footnotetext{表格里的名句出自《千字文》。}效果為:
3.4.2 邊注
使用 \marginpar 命令可在邊欄位置生成邊注:
\marginpar[?left-margin?]{?right-margin?}如果只給定了 ?right-margin?,那么邊注在奇偶數頁文字相同;如果同時給定了 ?left-margin?,則偶數頁使用 ?left-margin? 的文字,例如以下代碼:
\marginpar{\footnotesize 邊注較窄,不要寫過多文字,最好設置較小的字號。}其效果為:
3.5 特殊環境
3.5.1 列表
LaTeX\LaTeXLATE?X 提供了基本的有序和無序列表環境 enumerate 和 itemize,兩者的用法很類似,都用 \item 標明每個列表項,enumerate 環境會自動對列表項編號.
\begin{enumerate} \item … \end{enumerate}其中 \item 可帶一個可選參數,將有序列表的計數或者無序列表的符號替換成自定義的符號,列表可以嵌套使用,最多嵌套四層.
例如有序列表:
\begin{enumerate} \item An item. \begin{enumerate} \item A nested item.\label{itref} \item[*] A starred item. \end{enumerate} \item Reference(\ref{itref}). \end{enumerate}其效果為:
無序列表:
\begin{itemize} \item An item. \begin{itemize} \item A nested item. \item[+] A `plus' item. \item Another item. \end{itemize} \item Go back to upper level. \end{itemize}其效果為:
關鍵字環境 description 的用法與以上兩者類似,不同的是 \item 后的可選參數用來寫關鍵字,以粗體顯示,一般是必填的:
\begin{description} \item[?item title?] … \end{description}例如:
\begin{description} \item[Enumerate] Numbered list. \item[Itemize] Non-numbered list. \end{description}其效果為:
各級無序列表的符號由命令 \labelitemi 到 \labelitemiv 定義,可以簡單地重新定義它們:
\renewcommand{\labelitemi}{\ddag} \renewcommand{\labelitemii}{\dag} \begin{itemize} \item First item \begin{itemize} \item Subitem \item Subitem \end{itemize} \item Second item \end{itemize}有序列表的符號由命令 \labelenumi 到 \labelenumiv 定義,重新定義這些命令需要用到計數器相關命令:
\renewcommand{\labelenumi}% {\Alph{enumi}>} \begin{enumerate} \item First item \item Second item \end{enumerate}默認的列表間距比較寬,LaTeX\LaTeXLATE?X 本身也未提供方便的定制功能,可用 enumitem 宏包定制各種列表間距,enumitem 宏包還提供了對列表標簽、引用等的定制.
3.5.2 文本對齊環境
center、flushleft 和 flushright 環境分別用于生成居中、左對齊和右對齊的文本環境.
\begin{center} … \end{center} \begin{flushleft} … \end{flushleft} \begin{flushright} … \end{flushright}例如:
\begin{center} Centered text using a \verb|center| environment. \end{center} \begin{flushleft} Left-aligned text using a \verb|flushleft| environment. \end{flushleft} \begin{flushright} Right-aligned text using a \verb|flushright| environment. \end{flushright}其效果為:
除此之外,還可以用以下命令直接改變文字的對齊方式:
\centering \raggedright \raggedleft例如:
\centering Centered text paragraph.\raggedright Left-aligned text paragraph.\raggedleft Right-aligned text paragraph.效果為:
有一點可以將兩者區分開來:center 等環境會在上下文產生一個額外間距,而 \centering 等命令不產生,只是改變對齊方式. 比如在浮動體環境 table 或 figure 內實現居中對齊,用 \centering 命令即可,沒必要再用 center 環境.
3.5.3 引用環境
LaTeX\LaTeXLATE?X 提供了兩種引用的環境:quote 用于引用較短的文字,首行不縮進;quotation 用于引用若干段文字,首行縮進.
引用環境較一般文字有額外的左右縮進.
Francis Bacon says: \begin{quote} Knowledge is power. \end{quote}效果為:
《木蘭詩》: \begin{quotation} 萬里赴戎機,關山度若飛。 朔氣傳金柝,寒光照鐵衣。 將軍百戰死,壯士十年歸。歸來見天子,天子坐明堂。 策勛十二轉,賞賜百千強。?? \end{quotation}verse 用于排版詩歌,與 quotation 恰好相反,verse 是首行懸掛縮進的.
Rabindranath Tagore's short poem: \begin{verse} Beauty is truth's smile when she beholds her own face in a perfect mirror. \end{verse}3.5.4 摘要環境
摘要環境 abstract 默認只在標準文檔類中的 article 和 report 文檔類可用,一般用于緊跟 \maketitle 命令之后介紹文檔的摘要。如果文檔類指定了 titlepage 選項,則單獨成頁;反之,單欄排版時相當于一個居中的小標題加一個 quotation 環境,雙欄排版時相當于 \section* 定義的一節.
3.5.5 代碼環境
有時我們需要將一段代碼原樣轉義輸出,這就要用到代碼環境 verbatim,它以等寬字體排版代碼,回車和空格也分別起到換行和空位的作用;帶星號的版本更進一步將空格顯示成 “?”.
\begin{verbatim} #include <iostream> int main() {std::cout << "Hello, world!"<< std::endl;return 0; } \end{verbatim} \begin{verbatim*} for (int i=0; i<4; ++i)printf("Number %d\n",i); \end{verbatim*}要排版簡短的代碼或關鍵字,可使用 \verb 命令:
\verb?delim??code??delim??delim? 標明代碼的分界位置,前后必須一致,除字母、空格或星號外,可任意選擇使得不與代碼本身沖突,習慣上使用 | 符號.
同 verbatim 環境,\verb 后也可以帶一個星號,以顯示空格:
\verb|\LaTeX| \\ \verb+(a || b)+ \verb*+(a || b)+\verb命令對符號的處理比較復雜,一般不能用在其它命令的參數里,否則多半會出錯
verbatim 宏包優化了 verbatim 環境的內部命令,并提供了 \verbatiminput 命令用來直接讀入文件生成代碼環境. fancyvrb 宏包提供了可定制格式的 Verbatim 環境;listings 宏包更進一步,可生成關鍵字高亮的代碼環境,支持各種程序設計語言的語法和關鍵字.
3.6 表格
LaTeX\LaTeXLATE?X 里排版表格不如 Word 等所見即所得的工具簡便和自由,不過對于不太復雜的表格來講,完全能夠勝任.
排版表格最基本的 tabular 環境用法為:
\begin{tabular}[?align?]{?column-spec?} ?item1? & ?item2? & … \\ \hline ?item1? & ?item2? & … \\ \end{tabular}其中 ?column-spec? 是列格式標記;& 用來分隔單元格;\\ 用來換行;\hline 用來在行與行之間繪制橫線
直接使用 tabular 環境的話,會和周圍的文字混排。此時可用一個可選參數 ?align? 控制垂直對齊:t 和 b 分別表示按表格頂部、底部對齊,其他參數或省略不寫(默認)表示居中對齊.
\begin{tabular}{|c|} center-\\ aligned \\ \end{tabular}, \begin{tabular}[t]{|c|} top-\\ aligned \\ \end{tabular}, \begin{tabular}[b]{|c|} bottom-\\ aligned\\ \end{tabular} tabulars.但是通常情況下 tabular 環境很少與文字直接混排,而是會放在 table 浮動體環境中,并用 \caption 命令加標題.
3.6.1 列格式
tabular 環境使用 ?column-spec? 參數指定表格的列數以及每列的格式,基本的列格式見下表:
| l/c/r | 單元格內容左對齊/居中/右對齊,不折行 |
| p{?width?} | 單元格寬度固定為 ?width?,可自動折行 |
| | | 繪制豎線 |
| @{?string?} | 自定義內容 ?string? |
例如:
\begin{tabular}{lcr|p{6em}} \hline left & center & right & par box with fixed width\\ L & C & R & P \\ \hline \end{tabular}表格中每行的單元格數目不能多于列格式里 l/c/r/p 的總數(可以少于這個總數),否則出錯.
@ 格式可在單元格前后插入任意的文本,但同時它也消除了單元格前后額外添加的間距. @ 格式可以適當使用以充當“豎線”,特別地,@{} 可直接用來消除單元格前后的間距:
\begin{tabular}{@{} r@{:}lr @{}} \hline 1 & 1 & one \\ 11 & 3 & eleven \\ \hline \end{tabular}另外 LaTeX\LaTeXLATE?X 還提供了簡便的將格式參數重復的寫法 *{?n?}{?column-spec?},比如以下兩種寫法是等效的:
\begin{tabular}{|c|c|c|c|c|p{4em}|p{4em}|} \begin{tabular}{|*{5}{c|}*{2}{p{4em}|}}有時需要為整列修飾格式,比如整列改變為粗體,如果每個單元格都加上 \bfseries 命令會比較麻煩。array 宏包提供了輔助格式 > 和<,用于給列格式前后加上修飾命令:
% \usepackage{array} \begin{tabular}{>{\itshape}r<{*}l}\hlineitalic & normal \\column & column \\\hline \end{tabular}array 宏包還提供了類似 p 格式的 m 格式和 b 格式,三者分別在垂直方向上靠頂端對齊、居中以及底端對齊:
% \usepackage{array} \newcommand\txt{a b c d e f g h i} \begin{tabular}{cp{2em}m{2em}b{2em}}\hlinepos & \txt & \txt & \txt \\\hline \end{tabular}3.6.2 列寬
在控制列寬方面,LaTeX\LaTeXLATE?X 表格有著明顯的不足:l/c/r 格式的列寬是由文字內容的自然寬度決定的,而 p 格式給定了列寬卻不好控制對齊(可用 array 宏包的輔助格式),更何況列與列之間通常還有間距,所以直接生成給定總寬度的表格并不容易.
tabularx 宏包為我們提供了方便的解決方案。它引入了一個 X 列格式,類似 p 列格式,不過會根據表格寬度自動計算列寬,多個 X 列格式平均分配列寬. X 列格式也可以用array 里的輔助格式修飾對齊方式:
% \usepackage{array,tabularx} \begin{tabularx}{14em}%{|*{4}{>{\centering\arraybackslash}X|}}\hlineA & B & C & D \\ \hlinea & b & c & d \\ \hline \end{tabularx}3.6.3 橫線
我們已經在之前的例子見過許多次繪制表格線的 \hline 命令. 另外\cline{?i?-?j?} 用來繪制跨越部分單元格的橫線:
\begin{tabular}{|c|c|c|}\hline4 & 9 & 2 \\ \cline{2-3}3 & 5 & 7 \\ \cline{1-1}8 & 1 & 6 \\ \hline \end{tabular}在科技論文排版中廣泛應用的表格形式是三線表,形式干凈簡明. 三線表由 booktabs 宏包支持,它提供了\toprule、\midrule 和 \bottomrule 命令用以排版三線表的三條線,以及和 \cline 對應的 \cmidrule. 除此之外,最好不要用其它橫線以及豎線:
% \usepackage{booktabs} \begin{tabular}{cccc}\toprule& \multicolumn{3}{c}{Numbers} \\\cmidrule{2-4}& 1 & 2 & 3 \\\midruleAlphabet & A & B & C \\Roman & I & II& III \\\bottomrule \end{tabular}3.6.4 合并單元格
LaTeX\LaTeXLATE?X 是一行一行排版表格的,橫向合并單元格較為容易,由 \multicolumn 命令實現:
\multicolumn{?n?}{?column-spec?}{?item?}其中 ?n? 為要合并的列數,?column-spec? 為合并單元格后的列格式,只允許出現一個 l / c / r 或 p 格式
如果合并前的單元格前后帶表格線 |,合并后的列格式也要帶 | 以使得表格的豎線一致
\begin{tabular}{|c|c|c|}\hline1 & 2 & Center \\ \hline\multicolumn{2}{|c|}{3} &\multicolumn{1}{r|}{Right} \\ \hline4 & \multicolumn{2}{c|}{C} \\ \hline \end{tabular}上面的例子還體現了,形如 \multicolumn{1}{?column-spec?}{?item?} 的命令可以用來修改某一個單元格的列格式.
縱向合并單元格需要用到 multirow 宏包提供的 \multirow 命令:
\multirow{?n?}{?width?}{?item?}?width? 為合并后單元格的寬度,可以填 * 以使用自然寬度
我們看一個結合 \cline、\multicolumn 和 \multirow 命令的例子:
% \usepackage{multirow} \begin{tabular}{ccc}\hline\multirow{2}{*}{Item} & \multicolumn{2}{c}{Value} \\ \cline{2-3}& First & Second \\ \hlineA & 1 & 2 \\ \hline \end{tabular}3.6.5 行距控制
LaTeX\LaTeXLATE?X 生成的表格看起來通常比較緊湊,修改參數 \arraystretch 可以得到行距更加寬松的表格:
\renewcommand\arraystretch{1.8} \begin{tabular}{|c|}\hlineReally loose \\ \hlinetabular rows.\\ \hline \end{tabular}3.7 圖片
LaTeX\LaTeXLATE?X 本身不支持插圖功能,需要由 graphicx 宏包輔助支持. 在調用了graphicx 宏包以后,就可以使用 \includegraphics 命令加載圖片了:
\includegraphics[?options?]{?filename?}其中 ?filename? 為圖片文件名,與 \include 命令的用法類似,文件名可能需要用相對路徑或絕對路徑表示
圖片文件的擴展名一般可不寫,另外一定要注意,文件名里既不要有空格(類似 \include),也不要有多余的英文點號,否則宏包在解析文件名的過程中會出錯.
另外 graphicx 宏包還提供了 \graphicspath 命令,用于聲明一個或多個圖片文件存放的目錄,使用這些目錄里的圖片時可不用寫路徑:
% 假設主要的圖片放在figures 子目錄下,標志放在logo 子目錄下 \graphicspath{{figures/}{logo/}}\includegraphics 命令的可選參數 ?options? 支持 ?key?=?value? 形式賦值,常用的參數如下:
3.8 盒子
盒子是 LaTeX\LaTeXLATE?X 排版的基礎單元,雖然解釋上去有些抽象:每一行是一個盒子,里面的文字從左到右依次排列;每一頁也是一個盒子,各行文字從上到下依次排布??
3.8.1 水平盒子
生成水平盒子的命令如下:
\mbox{…} \makebox[?width?][?align?]{…}\mbox 生成一個基本的水平盒子,內容只有一行,不允許分段(除非嵌套其它盒子,比如后文的垂直盒子). 外表看上去,\mbox 的內容與正常的文本無二,不過斷行時文字不會從盒子里斷開.
\makebox 更進一步,可以加上可選參數用于控制盒子的寬度 ?width?,以及內容的對齊方式 ?align?,可選居中 c(默認值)、左對齊 l、右對齊 r 和分散對齊 s.
|\mbox{Test some words.}|\\ |\makebox[10em]{Test some words.}|\\ |\makebox[10em][l]{Test some words.}|\\ |\makebox[10em][r]{Test some words.}|\\ |\makebox[10em][s]{Test some words.}|3.8.2 帶框的水平盒子
\fbox 和 \framebox 讓我們可以為水平盒子添加邊框. 使用的語法與 \mbox 和 \makebox 一模一樣:
\fbox{…} \framebox[?width?][?align?]{…}可以通過 \setlength 命令調節邊框的寬度 \fboxrule 和內邊距 \fboxsep:
\framebox[10em][r]{Test box}\\[1ex] \setlength{\fboxrule}{1.6pt} \setlength{\fboxsep}{1em} \framebox[10em][r]{Test box}3.8.3 垂直盒子
如果需要排版一個文字可以換行的盒子,LaTeX\LaTeXLATE?X 提供了兩種方式:
\parbox[?align?][?height?][?inner-align?]{?width?}{…} \begin{minipage}[?align?][?height?][?inner-align?]{?width?} … \end{minipage}其中?align? 為盒子和周圍文字的對齊情況(類似 tabular 環境);?height? 和 ?inner-align? 設置盒子的高度和內容的對齊方式,類似水平盒子\makebox 的設置,不過?inner-align? 接受的參數是頂部 t、底部 b、居中 c 和分散對齊 s.
三字經:\parbox[t]{3em}% {人之初性本善性相近習相遠} \quad 千字文: \begin{minipage}[b][8ex][t]{4em} 天地玄黃宇宙洪荒 \end{minipage}3.8.4 標尺盒子
\rule 命令用來畫一個實心的矩形盒子,也可適當調整以用來畫線(標尺):
\rule[?raise?]{?width?}{?height?}例如:
Black \rule{12pt}{4pt} box. \\ \\ Upper \rule[4pt]{6pt}{8pt} and lower \rule[-4pt]{6pt}{8pt} box. \\ \\ A \rule[-.4pt]{3em}{.4pt} line.3.9 浮動體
內容豐富的文章或者書籍往往包含許多圖片和表格等內容,這些內容的尺寸往往太大,導致分頁困難. LaTeX\LaTeXLATE?X 為此引入了浮動體的機制,令大塊的內容可以脫離上下文,放置在合適的位置.
LaTeX\LaTeXLATE?X 預定義了兩類浮動體環境 figure 和 table。習慣上 figure 里放圖片,table 里放表格,但并沒有嚴格限制,可以在任何一個浮動體里放置文字、公式、表格、圖片等等任意內容.
以 table 環境的用法舉例,figure 同理:
\begin{table}[?placement?] … \end{table}?placement? 參數提供了一些符號用來表示浮動體允許排版的位置,如 hbp 允許浮動體排版在當前位置、底部或者單獨成頁. table 和 figure 浮動體的默認設置為 tbp.
- 排版位置的選取與參數里符號的順序無關,LaTeX\LaTeXLATE?X 總是以 h-t-b-p 的優先級順序決定浮動體位置,也就是說 [!htp] 和 [ph!t] 沒有區別
- 限制包括浮動體個數(除單獨成頁外,默認每頁不超過 3 個浮動體,其中頂部不超過 2 個,底部不超過 1 個)以及浮動體空間占頁面的百分比(默認頂部不超過 70%,底部不超過 30%)
雙欄排版環境下,LaTeX\LaTeXLATE?X 提供了 table* 和 figure* 環境用來排版跨欄的浮動體. 它們的用法與 table 和 figure 一樣,不同之處為雙欄的?placement? 參數只能用 tp 兩個位置.
浮動體的位置選取受到先后順序的限制. 如果某個浮動體由于參數限制、空間限制等原因在當前頁無法放置,就要推遲到之后處理,并使得之后的同類浮動體一并推遲. \clearpage 命令會在另起一頁之前,先將所有推遲處理的浮動體排版成頁,此時 htbp 等位置限制被完全忽略.
float 宏包為浮動體提供了 H 位置參數,不與 htbp 及 ! 混用. 使用 H 位置參數時,會取消浮動機制,將浮動體視為一般的盒子插入當前位置. 這在一些特殊情況下很有用(如使用 multicol 宏包排版分欄內容的時候),但尺寸過大的浮動體可能使得分頁比較困難.
3.9.1 浮動體的標題
圖表等浮動體提供了 \caption 命令加標題,并且自動給浮動體編號:
\caption{…}\caption 的用法非常類似于 \section 等命令,可以用帶星號的命令 \caption* 生成不帶編號的標題,也可以使用帶可選參數的形式 \caption[…]{…},使得在目錄里使用短標題. \caption 命令之后還可以緊跟 \label 命令標記交叉引用.
\caption 生成的標題形如 “Figure 1: …”(figure 環境)或 “Table 1: …”(table 環境). 可通過修改 \figurename 和 \tablename 的內容來修改標題的前綴. 標題樣式的
定制功能由 caption 宏包提供.
table 和 figure 兩種浮動體分別有各自的生成目錄的命令:
\listoftables \listoffigures它們類似 \tableofcontents 生成單獨的章節
3.9.2 并排和子圖表
我們時常有在一個浮動體里面放置多張圖的用法. 最簡單的用法就是直接并排放置,也可以通過分段或者換行命令 \\ 排版多行多列的圖片,以下為示意代碼:
\begin{figure}[htbp]\centering\includegraphics[width=...]{...}\qquad\includegraphics[width=...]{...} \\[..pt]\includegraphics[width=...]{...}\caption{...} \end{figure}示意圖大致如下:
由于標題是橫跨一行的,用 \caption 命令為每個圖片單獨生成標題就需要借助前文提到的 \parbox 或者 minipage 環境,將標題限制在盒子內.
\begin{figure}[htbp]\centering\begin{minipage}{...}\centering\includegraphics[width=...]{...}\caption{...}\end{minipage}\qquad\begin{minipage}{...}\centering\includegraphics[width=...]{...}\caption{...}\end{minipage} \end{figure}示意圖如下:
當我們需要更進一步,給每個圖片定義小標題時,就要用到 subfig 宏包的功能了. 這里僅舉一例:
\begin{figure}[htbp]\centering\subfloat[...]{\label{sub-fig-1}% 為子圖加交叉引用\begin{minipage}{...}\centering\includegraphics[width=...]{...}\end{minipage}}\qquad\subfloat[...]{%\begin{minipage}{...}\centering\includegraphics[width=...]{...}\end{minipage}}\caption{...} \end{figure}總結
以上是生活随笔為你收集整理的LaTeX 排版(一)——基础应用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JavaSE学习18(接口组成更新,方法
- 下一篇: python 梳理:安装并开始使用