这篇文章是在经历 \(\LaTeX\) 改格式改得死去活来后对于以后可能经常会用到的格式调整小技巧的一个汇总。许多片段的来源是 TeX StackExchange, 源链接就不一一表明了。这些技巧在 XeTeX 上编译通过,对于其他的引擎尚未测试。

该列表预计会随着我被 \(\LaTeX\) 虐的次数增加而不断更新。

页边距设置

使用 geometry 宏包:

\usepackage{geometry}
\geometry{a4paper, top = 34.4mm, bottom = 45mm, left = 23mm, right = 23mm}

更高级的用途可以参阅其官方文档。

字体设置

Times New Roman

为了全局设置 Times New Roman 字体,我们需要 fontspec 宏包:

\usepackage{fontspec}
\setmainfont{Times New Roman}

如果希望数学公式的字体也使用 Times New Roman,可以使用 newtx 宏包:

\usepackage{newtxmath}

注:newtx 宏包下还有 newtxtext 可以代替 fontspecsetmainfont 的功能,但是不知为何在 Windows 的 XeTeX 上编译错误。归根结底,XeTeX 以及 LuaTeX 的一个设计理念就是使用户可以直接调用系统字体而不用拘泥于宏包,因此我个人还是偏向于 setmainfont 的解决方案。

宋体粗体

CTeX 在 Windows 系统下宋体采用的是中易的字库,而不幸的是中易的宋体并不包括粗体。Word 之所以可以给中易宋体加粗,是因为它有在标准字重基础之上自动加粗的算法。而高贵的 \(\LaTeX\) 显然是不屑于用这种歪门邪道加粗字体的,所以你惊喜地发现在 Windows 下你似乎无论怎么 \textbf/\bfseries 都得不到加粗的宋体(于是 CTeX 就机智地把黑体作为粗体时的字体)。如果因为种种原因迫不得已一定要使用粗体,CTeX 给出了两个解决方案:

  1. 伪粗体:通过对于一个汉字堆叠若干个微距平移标准字号的宋体实现视觉上的粗体效果。这种伪粗体效果肯定不如专门的宋体效果好,而且在 PDF 内选词的时候偶尔会遇到问题,因此我是没有使用过。
  2. 使用带有粗体的宋体:可以使用 \setCJKmainfont 命令转而使用例如思源黑体等设计时考虑粗体的字体。这在 Windows 下其实也不简单。最傻瓜的做法是在 \documentclass{ctexart} 前加上 [fontset = fandol] 选项,使得 CTeX 采用 Fandol 的字库。这家的字库可以在 GPL 协议下自由使用,但是缺点是缺的字不少。
  3. 不是解决办法的办法:装一台 Ubuntu 的虚拟机,Ubuntu 下的默认宋体是带有粗字号的,问题直接解决。

标题格式的修改

一般来说,LaTeX 内修改标题格式最合适的宏包是 titlesectitlesec 的文档相当详细,SE 上也有非常多的教程,所以在这类就不多赘述了。我想记一笔的是 CTeX 内部自带的格式设置功能:这个功能在 CTeX 的官方手册上确有记载,但是在网上却不是很好找。个人认为用法比 titlesec 简洁明了,对于一般的中文文档已是相当够用了。这里举一个例子:

\ctexset{
    section/format = \songti\sffamily\zihao{-4}\bfseries, % 中文宋体,英文无衬线体,字号小四,加粗
    section/afterskip = 0pt, % 标题下方不留空,直接接段落,更紧凑
    subsection/format = \songti\sffamily\zihao{5}\bfseries, % 中文宋体,英文无衬线体,字号五号,加粗
    subsection/beforeskip = 0pt, % 标题上方不留空,直接在上一段下方,更紧凑
    subsection/afterskip = 0pt, % 标题上方不留空
    subsubsection/format = \songti\sffamily\zihao{5}\bfseries, % 中文宋体,英文无衬线体,字号五号,加粗
    subsubsection/beforeskip = 0pt,
    subsubsection/afterskip = 0pt   
}

“参考文献” 标题格式的修改

和上节相同,只需要在 \thebibliography 之前修改 section 的格式就行了(如果还有附录的话不要忘记改回来)。

如果要修改 “参考文献” 这四个字本身,CTeX 提供了 refname 选项。

自动引号配对

使用 csquotes 宏包:

\usepackage[autostyle=false, style=english]{csquotes}
\MakeOuterQuote{"}

中文的定理环境

CTeX 会自动将 amsthm 包当中的证明环境从 “Proof” 改成 “证明”,但在 ctexart 类型下不会对定理,引理,定义等环境进行汉化,因此需要手动加入如下代码:

\usepackage{amsthm}
\newtheorem{theorem}{定理}[section]
\newtheorem{definition}{定义}[section]
\newtheorem{corollary}{推论}[section]
\newtheorem*{remark}{注}
\newtheorem{lemma}{引理}[section]

列表环境下的间距

一般列表去除间距

使用 enumitem 宏包的 nosep 选项让 enumerateitemize 中相邻项之间的垂直间距为 0:

\usepackage{enumitem}

\begin{enumerate}[nosep]

\end{enumerate}

文献列表去除间距

通过以下代码去除文献列表中相邻项的垂直间距:

% 去除参考文献一节文献项之间过大的间隙
\let\OLDthebibliography\thebibliography
\renewcommand\thebibliography[1]{
    \OLDthebibliography{ #1 }
    \setlength{\parskip}{0pt}
    \setlength{\itemsep}{0pt plus 0.3ex}
}

图注格式修改

最为通用,最为灵活的方法:

% 宋体五号粗体,#1#2#3 分别是 “图 xxx”,“:”,以及图注文字本身
\DeclareCaptionFormat{mycaptionformat}{\songti\zihao{-5}\bfseries#1#2#3\par}
\captionsetup{format = mycaptionformat}

页眉页脚相关

首页特殊

\usepackage{fancyhdr}
\fancypagestyle{firststyle}{
    \fancyhf{}
    \renewcommand{\headrule}{\hrule height 0.5pt \vspace{0.8pt}\hrule height 0.5pt}
    \renewcommand{\footrule}{\hrule height 0.5pt width 0.3\textwidth}
    ...
}

% 在 \begin {document} 之后
\thispagestyle{firststyle}

装饰线

% 页眉双线
\renewcommand{\headrule}{\hrule height 0.5pt \vspace{0.8pt}\hrule height 0.5pt}
% 页脚部分装饰线
\renewcommand{\footrule}{\hrule height 0.5pt width 0.3\textwidth}

参数可以视情况自行调整;可以写在 \fancypagestyle 内部。

在一行内同时包括左中右对齐的文本

\newcommand{\headerline}[3]{
    \par\medskip\noindent
    \makebox[\textwidth][s]{\rlap{#1}\hfill#2\hfill\llap{#3}}%
    \par\medskip
}
% 用例:
\headerline{•栏目•}{doi: 10.3866/PKU.DXHX20xxxxxxx}{www.dxhx.pku.edu.cn}

在表格环境内改变表线宽度

鉴于许多办法可能不适用于除 tabular 之外的环境,这里提供一个简单粗暴的办法:

\setlength{\doublerulesep}{0pt}
...
\hline\hline % 两倍标准线宽