LaTeX小技巧整理

这篇文章是在经历\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内部。

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

```latex \newcommand{}[3]{
\par

\makebox[][s]{