Evian Zhang's
naive blog

LaTeX入门(六)——章节与列表

在我们的写作中,除了字斟句酌、段落分明以外,我们还需要做的,就是将这些段落组织成一个有层次的主体。就像我们设计衣服,找到了合适的纱线,纺成了一匹匹布料,我们还需要将这些布料用心组合,搭配出合适的衣服。

在LaTeX中,与文章层次有关的,就是章节与列表。

章节

不同的文档类中的章节不一样。我们常用的article文档类的章节层次有:section, subsection, subsubsection, paragraph, subparagraph. 常用的report文档类的章节层次有:chapter, section, subsection, subsubsection, paragraph, subparagraph. 也就是说,report比article多了一个chapter.

调用这些章节层次的方法为: \section{} , \subsection{} 等等,以此类推。其中大括号内的参数为该章节的名字。比如说,在一篇数学建模的论文中,我们可以在正文中有如下章节结构:

\section{问题重述}
\section{符号说明}
\section{问题分析}
\section{基本假设}
\section{模型的建立与求解}
\subsection{问题一的求解}
\subsection{问题二的求解}
\subsection{问题三的求解}
\section{模型的优缺点}

在写完章节名以后,就可以写本章的内容了。比如说,

\section{问题重述}
本次建模的题目为......
\section{符号说明}
......

也就是说, \section{} 这些命令,起到了分隔文章主体的作用。

同时,LaTeX强大的一点在于,你只需要写 \section{} ,而不需要声明这是第几章,它会自动给你编号。比如说,你在ctexart文档类中把上述的框架写进正文,排版出来的效果为:

此外,如果想要改变章节标题的格式,对于英文文档类,请参考宏包 titlesec 的说明文档(就像之前说的那样,用texdoc)。对于中文文档类,如ctexart, ctexrep等,我们可以使用 \CTEXsetup[]{} 命令,具体方法请参考宏包 ctex 的说明文档,这里不再赘述。一般我们也不太会需要改变章节标题的格式,唯一可能会想改变的,是把中文 \section 居左。我们可以在导言区中写

\CTEXsetup[format+={\raggedright}]{section} 

来实现。

此外,值得一提的是,对于英文文档类,如article等,由于英文论文的写作规范,每个章节的首段是不缩进的。这不需要我们额外设置,LaTeX是自动设置好的。具体效果可参见下图:

在某些时候,我们会发现,尽管LaTeX给我们提供到了subsubsection,但结构层次依然不够。但是,paragraph却有其与众不同的特点,标题后不能换行,对subsubsubsection的需要就出现了。但是,LaTeX并没有给我们subsubsubsection命令,我们需要自己定义。将下面一段文字复制到导言区:

\usepackage{titlesec}
\titleclass{\subsubsubsection}{straight}[\subsection]

\newcounter{subsubsubsection}[subsubsection]
\renewcommand\thesubsubsubsection{\thesubsubsection.\arabic{subsubsubsection}}
\renewcommand\theparagraph{\thesubsubsubsection.\arabic{paragraph}}

\titleformat{\subsubsubsection}
  {\normalfont\normalsize\bfseries}{\thesubsubsubsection}{1em}{}
\titlespacing*{\subsubsubsection}
{0pt}{3.25ex plus 1ex minus .2ex}{1.5ex plus .2ex}

\makeatletter
\renewcommand\paragraph{\@startsection{paragraph}{5}{\z@}%
  {3.25ex \@plus1ex \@minus.2ex}%
  {-1em}%
  {\normalfont\normalsize\bfseries}}
\renewcommand\subparagraph{\@startsection{subparagraph}{6}{\parindent}%
  {3.25ex \@plus1ex \@minus .2ex}%
  {-1em}%
  {\normalfont\normalsize\bfseries}}
\def\toclevel@subsubsubsection{4}
\def\toclevel@paragraph{5}
\def\toclevel@paragraph{6}
\def\l@subsubsubsection{\@dottedtocline{4}{7em}{4em}}
\def\l@paragraph{\@dottedtocline{5}{10em}{5em}}
\def\l@subparagraph{\@dottedtocline{6}{14em}{6em}}
\makeatother

\setcounter{secnumdepth}{4}

即可在正文中使用 \subsubsubsection{} 命令了。

一篇文章中,不仅仅有正文,还也许会有参考文献及附录。

参考文献

对于参考文献,这里不再介绍bibtex的方法,如果想了解的同学可以去网上自行搜索。下面介绍手动控制参考文献的方法:

在正文中使用 thebibliography 环境。下面给大家看一下我某次数学建模的参考文献:

\begin{thebibliography}{99}
\bibitem{CPStructure}{Borgatti, S. and Everett, M. Models of core/periphery structures. Social Networks, 21:
375-395, October 2000}
\bibitem{rightskewed}{Newman, M. The structure and function of complex networks. SIAM Review, 45:167-256, 2003.}
\bibitem{CD}{Natarajan Meghanathan.A Binary Search Algorithm for Correlation Study of Decay Centrality vs. Degree Centrality and Closeness Centrality[J].Computer and information science,2017,10(2):52-75.}
\bibitem{CC}{Masucci, A. Paolo,Molinero, Carlos.Robustness and closeness centrality for self-organized and planned cities[J].The European physical journal, B. Condensed matter physics,2016,89(2):-.}
\bibitem{SA}{Chengxiang Zhuge,Chunfu Shao,Shuling Wang, et al.Sensitivity analysis of integrated activity-based model: using MATSim as an example[J].Transportation Letters,2019,11(2):93-103. DOI:10.1080/19427867.2017.1286772.}
\bibitem{CE}{L. Laporta,J. Afonso,I. Mesquita.The need for weighting indirect connections between game variables: Social Network Analysis and eigenvector centrality applied to high-level men’s volleyball[J].International Journal of Performance Analysis in Sport,2018,18(6):1067-1077. DOI:10.1080/24748668.2018.1553094.}
\end{thebibliography} 

排版出来的效果为:

\begin{thebibliography} 后还有一个 {99} , 这是参考文献的最大条数,你也可以写 {80} 之类的,不重要。

在这之间的每一个 \bibitem 代表一条参考文献。同样地,这是LaTeX自动帮你编号的。它实际上只有一个参数,我之所以写了两个大括号,是方便我们理解和使用。 \bibitem{aRef}{aContent} , 排版出来的效果只有 aContent . aRef 有什么用呢?它用于文章前面的交叉引用(关于这个我后面的文章里会详细说明)。这里只需要知道一点,在文章后面写了以后,在文章正文内就能使用 \cite{aRef} 来引用这条参考文献。排版出来的效果为出现这个参考文献对应的编号。如果需要将编号置于右上角,则可以在导言区里写

\newcommand{\upcite}[1]{\textsuperscript{\cite{#1}}} 

然后在正文中使用 \upcite{aRef} 即可。

而这些参考文献的格式从哪来,我们一般是在百度学术或者Google学术上,找到对应的论文,然后点引用,会出现三种格式。我们直接复制GB/T 7714即可。

附录

使用附录的方式有许多种,我常用的是使用宏包 appendix ,其他方法大家也可以自行搜索。

在导言区里写上:

\usepackage[toc, page]{appendix} 

然后,在正文中想要出现附录的地方使用 appendices 环境,并且添加一句话,即:

\begin{appendices}
\addtocontents{toc}{\protect\setcounter{tocdepth}{0}}
\end{appendices} 

然后,在这个环境中用 \section{} 等命令就能产生附录中的章节了。那句额外的代码,是为了不在目录中出现每个附录章节的名字,而只在目录中出现一个附录代表全体。

对于中文文档类,如ctexart等,需要在导言区 \usepackage[toc, page]{appendix} 之后加上两句话:

\renewcommand{\appendixtocname}{附录}
\renewcommand{\appendixpagename}{附录} 

这两个的作用,一个是在目录中用“附录”替换"appendices", 一个是在正文中用“附录”替换"appendices".

目录

刚刚提到了好多次目录,那么目录是怎么做的呢?

在你正文中想要加入目录的地方,写上一行命令:

\tableofcontents

然后排版两次(原因我会在之后的文章中提到),就能得到相应的目录了。

列表

除了章节以外,比章节更细的层次划分就是列表了。LaTeX中常见的列表有两种:有序列表和无序列表。有序列表即以1, 2, 3..这类的序号编号每一条条目,无序列表即每一条条目都被一个·所引起。

有序列表的使用方法为:

\begin{enumerate}
\item anItem
\item anotherItem
\end{enumerate}

无序列表的使用方法为:

\begin{itemize}
\item anItem
\item anotherItem
\end{itemize}

每一个 \item 代表一个条目。

在列表中换行可以使用 \\ .但是,我们会发现,在列表中不分段落,没有缩进。

我们可以实现列表的嵌套,即例如:

将不同动物放入冰箱的步骤:
\begin{itemize}
\item 大象
\begin{enumerate}
\item 打开冰箱门
\item 把大象放进去
\item 关上冰箱门
\end{enumerate}
\item 长颈鹿
\begin{enumerate}
\item 打开冰箱门
\item 把大象拿出来
\item 把长颈鹿放进去
\item 关上冰箱门
\end{enumerate}
\end{itemize}

排版效果为:

此外,我们也可以自己定制列表环境。使用宏包 enumitem . 具体方法请参见宏包的说明文档。在数学建模中,我们常用一个用于问题重述的列表环境,即生成“问题一”“问题二”的列表。我的代码为:

\usepackage{enumitem}
\newlist{question}{enumerate}{1}
\setlist[question,1]{itemsep = 0pt, parsep = 0pt, align=left, leftmargin=*, label = {\bfseries 问题\chinese*}} 

直接复制到导言区,然后就可以在正文中使用

\begin{question}
\item %这是问题一
\item %这是问题二
\item %这是问题三
\end{question}

来使用了。

最后讲一下如何修改 enumerate itemize 列表编号的问题。

对于 enumerate 列表,即有序列表来说,第一级列表编号默认为1. 2. 3. ... 如果我们要修改这个列表编号怎么办呢?对于每一个有序列表,都有一个 enumi 来存储当前的计数。比如说现在第一级列表到了第三个,那么 enumi 就是3(这里是第一级列表,如果列表内再嵌套列表,也就是第二级有序列表,则就是 enumii , 第三级就是 enumiii 以此类推)。 而命令 \theenumi 控制的是 enumi 的表现形式,比如说,如果我们在导言区中写

 \renewcommand{\theenumi}{\chinese{enumi}}

那么第一级编号时出现的就不是1 2 3而是一二三。

而命令 \labelenumi 控制的是在列表中的编号格式。比如说,我们如果在导言区中写

\renewcommand{\labelenumi}{(\theenumi)}

那么在列表中出现的就是(一) (二) (三)这种。

对于 itemize 列表,即无序列表来说,就没有了那个计数器。所以,我们只需要在导言区中写

\renewcommand{\labelitemi}{sth.} 

其中 sth. 是你想将无序列表变成的模样。比如说,空心圆圈 $\circ$ 等等。