Skip to content

Instantly share code, notes, and snippets.

@l1997i
Last active December 1, 2025 12:10
Show Gist options
  • Select an option

  • Save l1997i/d371ae8d8c4c41f0a283771c617ab611 to your computer and use it in GitHub Desktop.

Select an option

Save l1997i/d371ae8d8c4c41f0a283771c617ab611 to your computer and use it in GitHub Desktop.
My notes for LaTeX

LaTeX 学习笔记

Author:李 理

部分代码来源于网络,所有原创文章采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可。可以自由的转载和修改,但请务必注明文章来源并且不可用于商业目的。

常规操作

插入图片、图注和引用

插入图注需要在起始段包含caption包:

\usepackage{caption}

插图具体示例:

\begin{figure}[H]
      \small
      \centering
      \includegraphics[width=9cm]{b.pdf}
      \caption{Three-dimensional coordinate figure}
      \label{picture-label}
\end{figure}
  • width指定图片宽度(默认长宽比固定);
  • 使用\centering使图片居中
  • b.pdf是图片路径(支持pdf、png、jpg、tiff、svg等多种格式,建议使用相对路径矢量图格式);
  • caption命令指定图片的图注内容,例如本例的图注内容就是Three-dimensional coordinate figure;
  • label命令指定图片的标签label,在同一个tex文件中必须唯一,在用\ref{}引用时需要用这个label来引用。此label不能包含中文和空格。比如在文中如需引用此图,则使用\ref{picture-label}来引用。

插入表格、表注和引用

\begin{table}[H]\label{tab:classificationRules}
  \centering
   \begin{center}
    \caption{The classification rules}
    \begin{tabular}{p{4cm}<{\centering}p{4cm}<{\centering}p{4cm}<{\centering}}
        \toprule
        Category & CEV   & Color       \\
        \midrule   % \hline
         Alert & Above 0.6 & Red \\
         Warning & -0.3 to 0.6 & Yellow \\
         Stable & Below -0.3 & Green \\
         Not assessed & N/A	& Light gray \\
        \bottomrule
    \end{tabular}
   \end{center}
\end{table}

以上表格是最简单的标准三线表

  • toprule命令显示表格顶框线;
  • midrule命令显示表格第二根上框线;
  • bottomrule命令显示表格底框线;
  • &符号表示分列;
  • \\符号表示换行;
  • \begin{center}表示以下内容居中显示;
  • \begin{tabular}{p{4cm}<{\centering}p{4cm}<{\centering}p{4cm}<{\centering}} 自定义表格每列的宽度和对齐方式(此处为居中)。若对列宽无要求,本行可无;
  • label命令和caption命令的使用和插入图片、图注和引用中的类似。

下面是稍稍复杂一点的三线表。

\begin{table}[H]\label{tab:notations}
  \centering
   \begin{center}
    \caption{Physical meaning of parameters.}
    \begin{tabular}{p{2.5cm}<{\centering}p{6.5cm}l}
        \toprule
         Parameters or indicators & Physical meaning & Value      \\
        \midrule   % \hline
         CCPI1  &  Emissions Level & 30\% weighting of CCPI \\
         CCPI2  &  Development of Emissions & 30\%weighting of CCPI \\
         CCPI3  &  Renewable Energies & 10\% weighting of CCPI \\
         CCPI4  &  Efficiency & 10\% weighting of CCPI \\
         CCPI5  &  Climate Policy & 20\% weighting of CCPI \\
         G1  &  Net number of migrants, both sexes combined (thousands) \\
         G2  &  Proportion of the population using improved drinking water sources, total \\
         G3  & Arable land (\% of land area) \\
         C1 &  Security Apparatus \\
         C2 &  Factionalized Elites \\
         C3 &  Group Grievance \\
         E1 &  Economy \\
         E2 &  Economic Inequality \\
         E3 &  Human Flight and Brain Drain \\
         P1 &  State Legitimacy \\
         P2 &  Public Services \\
         P3 &  Human Rights \\
         S1 &  Demographic Pressures \\
         S2 &  Refugees and IDPs \\
         X1 &  External Intervention \\
         $R_l$ & Arable land (\% of land area) \\
         $R_w$ & Improved water source (\% of population with access) \\
         $\tilde{R}_l$ & Arable land (\% of land area) after standardization \\
         $\tilde{R}_w$ & Improved water source (\% of population with access) \\
        \bottomrule
     \end{tabular}
  \end{center}
\end{table} 

插入公式、编号和引用

插入行内公式

直接使用$符号,举例:

$x+2$

插入整行公式

通过\begin{equation}命令,公式结束时使用\end{equation}

label命令的使用和插入图片、图注和引用中的类似。

\begin{equation}\label{principal components}
    \left\{
       \begin{array}{ll}
         y_1=0.102 \tilde{x}_1+0.099 \tilde{x}_2+\cdots+0.096 \tilde{x}_{11}+0.097 \tilde{x}_{12} \\
         y_2=0.192 \tilde{x}_1+0.286 \tilde{x}_2+\cdots+0.111 \tilde{x}_{11}-0.168 \tilde{x}_{12}
       \end{array}
     \right.
\end{equation}

编号和项目符号

数字型枚举

\begin{enumerate}
  \item I'm A.
  \item I'm B.
  \item I'm C.
  \item I'm D.
\end{enumerate}

无序枚举

\begin{itemize}
  \item I'm A.
  \item I'm B.
  \item I'm C.
  \item I'm D.
\end{itemize}

语法高亮

使用listings宏包

语法高亮需要在起始段包含以下包:

\usepackage{listings} % 语法显示
\usepackage{xcolor} % 使用颜色宏包

如需自定义语法块高亮的行号、字体、颜色、有无阴影框等格式,

\lstset{numbers=left,
numberstyle=\tiny, keywordstyle=\color{blue!70}, commentstyle=\color{red!50!green!50!blue!50},
frame=shadowbox, rulesepcolor=\color{red!20!green!20!blue!20},
escapeinside=``}  %语法高亮格式
  • numbers指定是否有行号以及行号在左边/右边显示;
  • numberstyle指定行号大小;
  • keywordstyle指定关键字的颜色;
  • commentstyle指定普通文本的颜色;
  • rulesepcolor指定注释颜色;
\lstinputlisting[language=Matlab]{./code/L_BP.m}

通过lstinputlisting命令引入代码块,{}中内容是所需显示的代码的路径。language指定高亮语言。

使用minted宏包

需要安装Pygments包

下载地址:Python Package Index](https://pypi.python.org/pypi/Pygments)下载whl包,使用pip install命令安装;

如果安装了pip工具,也可直接输入pip命令

pip install Pygments
修改编译配置

需要在原始的编译命令上,增加--shell-escape选项

如使用的是VS Code,需要修改settings.json文件,增加一个tool以及其对应的recipe:

{
    "name": "xelatex-escape",
    "command": "xelatex",
    "args": [
       "-synctex=1",
       "-interaction=nonstopmode",
       "--shell-escape",
       "-file-line-error",
       "-pdf",
       "%DOC%"
    ]
},

直接使用xelatex-escape的recipe进行编译。

使用方法

首先添加minted宏包

\usepackage[cache=false]{minted}  % 代码高亮

下面是最简单的例子:

\begin{minted}{c++}
int main() {
    printf("hello, world");
    return 0;
}
\end{minted}

minted宏包支持在代码注释中渲染LeTeX公式和Unicode字符,如下:

\begin{minted}[mathescape,
               linenos,
               numbersep=5pt,
               gobble=2,
               frame=lines,
               framesep=2mm]{csharp}
  string title = "This is a Unicode π in the sky"
  /*
  Defined as $\pi=\lim_{n\to\infty}\frac{P_n}{d}$ where $P$ is the perimeter
  of an $n$-sided regular polygon circumscribing a
  circle of diameter $d$.
  */
  const double pi = 3.1415926535
\end{minted}

由于minted支持在高亮的代码中渲染逃逸的latex代码,因此我们不仅仅可以在注释中使用latex代码,也可以直接在代码中使用。

\begin{minted}%
[encoding=utf8,
linenos,
frame=single,
rulecolor=purple!50!black,
texcl=true,
highlightcolor=green!40,
highlightlines={7,9},
]{python3}
#
#authoryear style
#
def formatlabelauthor(bibentry):

    if 'author' in bibentry:
        namelist=bibentry['author'] #\label{line:namelist:author}
    elif 'editor' in bibentry:
        namelist=bibentry['editor'] #\label{line:namelist:editor}
    elif 'translator' in bibentry:
        namelist=bibentry['translator']
    else:
        namelist='Anon'

    return [namelist,namelist]
\end{minted}

作者姓名赋值见第\ref{line:namelist:author}行,编者姓名赋值见\ref{line:namelist:editor}行。
代码文件引入式写法
\inputminted[⟨options⟩]{⟨language⟩}{⟨filename⟩}

例如

\inputminted[encoding=utf8]{Matlab}{./code/L_BP.m}

此处尤其需要注意inputminted命令和lstinputlisting不同的写法

子文件结构化写作

\input{./tex/Appendices}

通过input命令引入所需的tex文件,{}中是tex文件的路径(不包含后缀名.tex)

对于较长的tex文档,建议采用结构化写作的方式

目录自动生成超链接

\usepackage{hyperref}
\hypersetup{pagebackref,colorlinks}
 
% 其中pagebackref实现从参考文献列表反连接到文中引用该文献的位置
% colorlinks实现的是将引用链接用相应的颜色进行标记而不是矩形框进行标记

如不使用colorlinks选项,也可以使用如下命令隐藏超链接的绿色方框

\hypersetup{hidelinks}	  % 隐藏超链接的绿色方框

LaTeX 文档中文字符支持

\usepackage[UTF8, space, hyperref]{ctex}

\usepackage{xeCJK}				% 过时,不推荐

使用Excel插入LaTeX格式表格

安装Excel加载项

excel2latex.xla

注意事项

在使用excel2latex.xla生成的代码时需要引用以下包:

\usepackage{booktabs}
\usepackage{multirow}

使用步骤

  1. 在Excel中添加加载项,将excel2latex.xla文件存放在不会被删除的地方;
  2. Excel表格写好数据、框线画好;
  3. 选中需要复制的表格,点击 加载项 选项卡,复制tex代码,粘贴到对应的tex文件中去。

使用BibTeX引用参考文献

TeX文件中的基本用法

\bibliographystyle{plain}  %表示使用的文献样式标准,即bst文件
\bibliography{ref}    %表示在此处插入参考文献总列表,即bib文件
  • 其中,ref代表引用参考文献存放在ref.bib文件中

  • \bibliography{ref} 语句不能写成\bibliography{ref.bib},即文件扩展名bib一定不能加

  • \bibliographystyle{plain} 语句不能写成\bibliographystyle{plain.bst},即文件扩展名bst一定不能加

涉及的主要文件类型

在使用时,一般会接触到两个文件,bib 和bst两个文件,bib就是你的参考文献数据文件。bst一般由期刊或者杂志提供,设定了参考文献出现在文末的方式,例如设置排序方式、具体字体、字号、加粗、作者名按缩写的方式还是不缩写,标题要不要大写等格式。

bst文件

LaTeX默认提供了几个bst模板,不需要在使用时包含bst文件就可以使用

Style Explaination
plain 按字母的顺序排列,比较次序为作者、年度和标题
unsrt 样式同plain,只是按照引用的先后排序
alpha 用作者名首字母+年份后两位作标号,以字母顺序排序
abbrv 类似plain,将月份全拼改为缩写,更显紧凑
ieeetr 国际电气电子工程师协会期刊样式
acm 美国计算机学会期刊样式
siam 美国工业和应用数学学会期刊样式
apalike 美国心理学学会期刊样式

bib文件

@article{Shannon1948Communication,
  title={Communication Theory of Secrecy Systems},
  author={Shannon, Claude E.},
  journal={Bell System Technical Journal},
  volume={28},
  number={4},
  pages={656–715},
  year={1948},
 abstract={First page of article},
}

紧跟在 @article{ 之后的文字是这个文献的标签id,这个在一个bib文件中必须唯一,因为我们在tex中用\cite{}引用时需要用这个id来引用。如果写重复了,bibTeX在编译时会报错,可以再修改。

TeX 文章插入引用

以下全部以上面给出的bib文件中的Shannon1948Communication引用为例

  1. 使用cite命令

    参考文献1:\cite{Shannon1948Communication}牛逼!
  2. 使用自定义的upcite命令

    参考文献2:\upcite{Shannon1948Communication}牛逼

方法1 参考文献以正文字体字号格式显示(不是上标),需要在起始段引用cite包

\usepackage{cite}	%引用cite包

方法2 参考文献以上标格式显示,但需要在起始段引用cite包以及定义upcite命令

\usepackage{cite}	%引用cite包
\newcommand{\upcite}[1]{{\textsuperscript{\cite{#1}}}}

TeX 文件示例

这是一个最简单、最基本的文献引用示例。

整个TeX的工作文件夹中需包含以下文件:

  • bib文件:myRef.bib
  • bst文件:gbt7714-2005.bst
\documentclass{article}
\usepackage[UTF8, space, hyperref]{ctex}
\usepackage{color}
\usepackage{graphicx}
%\usepackage{amsmath}
\usepackage{cite}
\newcommand{\upcite}[1]{{\textsuperscript{\cite{#1}}}}   %自定义参考文献上标
\hypersetup{hidelinks}                                   %隐藏超链接的绿色方框
\usepackage[colorlinks, linkcolor=red, anchorcolor=blue, citecolor=green]{hyperref} %超链接重新配色

\title{这是一个标题}
\author{李理}
\date{\today}

\begin{document}
\maketitle	%只有输入这行才显示标题

参考文献1:\upcite{Milner1994Communication}牛逼!

参考文献2:\upcite{Shannon1948Communication}逼!

\bibliographystyle{gbt7714-2005}	%使用自定义的参考文献样式
\bibliography{myRef} 

\end{document}

bibTeX 编译过程

tex和bib文件都设置好之后,就可以来编译了,编译分4步。

这里以main.tex文件为例:

  1. xelatex main.tex 编译tex文件,没错误的话会生成aux文件,aux文件包含了引用这些的信息;

  2. bibtex main.aux 根据aux文件中记录的信息来检测bib文件中的相关文献,此时也会检测bib中相关的书写有无错误。有错会提示,没有错误的话会生成bbl文件,bbl里面是本文最刚开头说的直接用thebibliography的引用形式;

    \begin{thebibliography}{10}
            \bibitem xxxx
            \bibitem xxxx
    \end{thebibliography}
  3. xelatex main.tex 再次编译,把参考文献编译进文档中;

  4. xelatex main.tex 三次编译,把交叉引用编译正确。

    整个步骤可以概括为 xelatex->bibtex->xelatex->xelatex 如果中间遗漏某步会出现参考文献引用处为[?],或参考文献目录不显示的错误。

为了方便一步式操作,可以新建一个bat批处理文档如下:

xelatex main.tex
bibtex main.aux
xelatex main.tex
xelatex main.tex

或者直接使用VS Code编译器配置Recipe:xelatex->bibtex->xelatex->xelatex

当然,如文档需要pdflatex 编译,也可将编译步骤改成pdflatex->bibtex->pdflatex->pdflatex

使用VS Code编译器编译TeX文档

安装TeX的发行版

首先,需要安装TeX的发行版

OS TeX Distribution
Windows TeXLive, CTeX
Mac MacTeX
Linux TeXLive

建议Windows首选安装TeXLive,最好不选择CTeX

配置VS Code

进入VS Code插件商店,安装以下插件

LaTeX language support
LaTeX Workshop
latex-formatter

进入VS Code的setting配置面板进入settings.json文件中进行配置,添加以下内容

"latex-workshop.latex.tools": [
        {
            "name": "xelatex",
            "command": "xelatex",
            "args": [
                "-synctex=1",
                "-interaction=nonstopmode",
                "-file-line-error",
                "-pdf",
                "%DOC%"
            ]
        },
        {
            "name": "latexmk",
            "command": "latexmk",
            "args": [
                "-synctex=1",
                "-interaction=nonstopmode",
                "-file-line-error",
                "-pdf",
                "%DOC%"
            ]
        },
        {
            "name": "pdflatex",
            "command": "pdflatex",
            "args": [
                "-synctex=1",
                "-interaction=nonstopmode",
                "-file-line-error",
                "%DOC%"
            ]
        },
        {
            "name": "bibtex",
            "command": "bibtex",
            "args": [
                "%DOCFILE%"
            ]
        }
    ],
    "latex-workshop.latex.recipes": [
        {
            "name": "xelatex",
            "tools": [
                "xelatex"
            ]
        },
        {
            "name": "pdflatex",
            "tools": [
                "pdflatex"
            ]
        },
        {
            "name": "bibtex",
            "tools": [
                "bibtex"
            ]
        },
        {
            "name": "pdflatex -> bibtex -> pdflatex*2",
            "tools": [
                "pdflatex",
                "bibtex",
                "pdflatex",
                "pdflatex"
            ]
        },
        {
            "name": "xelatex -> bibtex -> xelatex*2",
            "tools": [
                "xelatex",
                "bibtex",
                "xelatex",
                "xelatex"
            ]
        }
    ],
    "latex-workshop.view.pdf.viewer": "tab",
    "latex-workshop.latex.clean.fileTypes": [
        "*.synctex.gz",
        "*.aux",
        "*.bbl",
        "*.blg",
        "*.idx",
        "*.ind",
        "*.lof",
        "*.lot",
        "*.out",
        "*.toc",
        "*.acn",
        "*.acr",
        "*.alg",
        "*.glg",
        "*.glo",
        "*.gls",
        "*.ist",
        "*.fls",
        "*.log",
        "*.fdb_latexmk"
        ],

配置完成后,重启VS Code程序,打开一个tex文件,左边栏会出现LaTeX工具箱面板如下图所示:

其中的Recipe是可用的编译方法,比如bibTeX的编译方法就可以选用 pdflatex -> bibtex -> pdflatex*2 或者 xelatex -> bibtex -> xelatex*2,具体采用何种编译方法以使用的LaTeX模版为准,部分情况下xelatex和pdflatex都可编译,但具体字体可能不同

LaTeX面板箱中提供的命令都是在上一步骤settings.json中设置的,如需修改工具箱的配置可以修改settings.json文件。

如上图,Clean up auxiliary files用于删除编译产生的辅助文件,比如 synctex.gz, aux, bbl, blg, idx, ind, lof, lot, out, toc, acn, acr, alg, glg, glo, gls, ist, fls, log, fdb_latexmk文件。一般在编译完成后,使用此功能清理无用文件,然后将最终生成的pdf文件、tex文件等必要文件打包发给其他人

如果将文件拆分为小文件,需要在每个文件的开头指明根文件所在位置,否则只能在根文件中进行编译

%!TEX root = ../paper.tex

在tex文件中指定编译方式

在 Sublime Text 或者 TeX Studio 中,可以在文件的首行指定编译方式(% !TEX program)以及主文档(% !TEX root),VS Code 的 LaTeX Workshop 也把这个功能添加到了其中,使用方法完全一样。% !TEX program% !TEX root 被称为 Magic Command。 示例如下:

% !TEX program = xelatex
\documentclass{article}

\author{L1997i}
\title{Configuration of Visual Studio Code for LaTeX Users}

\begin{document}
\maketitle

Example text.

\end{document}

将上述代码保存为 test.tex,然后使用快捷键 Ctrl+Alt+B,系统会自动选择 xelatex 作为编译方式。如果没有其他问题,就能正常编译。

插入代码片段

LaTeX插入图片太麻烦?那我们打开文件 > 首选项 > 用户代码片段,插入以下代码

"Input a figure": {
        "prefix": "figure",
        "body": [
            "\\begin{figure}[htp]",
            "\t\\centering",
            "\t\\includegraphics[width=13cm]{$1}",
            "\t\\caption{$2}",
            "\t\\label{fig:$3}",
            "\\end{figure}",
            "$0"
        ],
        "description": "Input a figure"
    }

可以按照注释写一些自己的代码段来更快的插入相关模块,$1$2$3等表示可以用Tab键在这些位置间切换,$0表示回车以后的位置。

同时打开文件 > 首选项 > 键盘快捷方式,搜索snippet,给插入代码片段一个诸如ctrl+shift+s的快捷键,这样下次想插入图片时,按下快捷键输入image,敲回车就行了。可以添加诸如表格啊公式啊代码段啊之类的快速输入,在有大量图片需要插入时事半功倍。

使用变量

使用 $name 或者 ${name:default} 可以插入变量的值。如果未设置变量,则会插入其默认值或空字符串。当变量未知(未定义其名称)时,会将插入的变量名称转换为占位符。

VSCode中可以使用以下变量:

1)文档相关:

变量 变量含义
TM_SELECTED_TEXT 当前选定的文本或空字符串
TM_CURRENT_LINE 当前行的内容
TM_CURRENT_WORD 光标下的单词内容或空字符串
TM_LINE_INDEX 基于零索引的行号
TM_LINE_NUMBER 基于单索引的行号
TM_FILENAME 当前文档的文件名
TM_FILENAME_BASE 当前文档没有扩展名的文件名
TM_DIRECTORY 当前文档的目录
TM_FILEPATH 当前文档的完整文件路径
CLIPBOARD 剪贴板的内容
WORKSPACE_NAME 已打开的工作空间或文件夹的名称

2)当前日期和时间:

变量 变量含义
CURRENT_YEAR 当前年份
CURRENT_YEAR_SHORT 当前年份的最后两位数
CURRENT_MONTH 月份为两位数(例如'02')
CURRENT_MONTH_NAME 月份的全名(例如'June')(中文语言对应六月)
CURRENT_MONTH_NAME_SHORT 月份的简称(例如'Jun')(中文语言对应是6月)
CURRENT_DATE 这个月的哪一天
CURRENT_DAY_NAME 当天是星期几(例如'星期一')
CURRENT_DAY_NAME_SHORT 当天是星期几的简称(例如'Mon')(中文对应周一)
CURRENT_HOUR 24小时时钟格式的当前小时
CURRENT_MINUTE 当前分
CURRENT_SECOND 当前秒

3)要插入行或块注释,请遵循当前语言:

变量 变量含义
BLOCK_COMMENT_START 输出:PHP /*或HTML格式<!--
BLOCK_COMMENT_END 输出:PHP */或HTML格式-->
LINE_COMMENT 输出:PHP //或HTML格式

使用Pandoc将markdown转换成tex

配置环境

  • Markdown编辑器
  • Pandoc

使用方法

使用命令行运行,cd进入md文件的位置,然后运行如下命令:

pandoc --from markdown_mmd --to latex LaTeX.md -o LaTeX.tex

如此转换生成的文件对公式、图片、项目编号、文章整体结构和字体加粗、斜体的支持比较好,对代码、表格的支持不好。建议用于单纯书写图文。

每个 LaTeX 用户都应该使用的 9 个宏包

宏包的顺序与其重要性无关,顺序是完全随机的。每节的首行是我调用宏包的常用方式,仅作参考!

amsmath

\usepackage{amsmath}

amsmath 宏包是 AMS(美国数学协会)系列宏包中最重要的宏包,这个宏包引入了一些改进的数学环境。比如:加载 amsmath之后,我们可以使用 align 环境。我所有的行间公式都使用了 align 环境 (或者无编号版的 align* 环境),即便有时候公式不需要对齐。Lars Madsen 在 PracTeX 杂志上有篇文章也鼓励使用 amsmath 宏包的环境,详细参看 Avoid eqnarray!

geometry

\usepackage[a4paper]{geometry}

使用 geometry 宏包来调整页面的页边距非常方便。整个文档默认的页边距可以通过这个宏包的选项来改变(置于\usepackage 之后的方括号内,比如 a4paper),大部分情况下,我使用这个宏包(使用 a4paper 选项)来创建 A4 纸张以及相应的页边距。使用这个宏包,我们也可以改变某个特定页面的页边距,howtoTeX.com 上另外一篇文章介绍了怎么使用 geometry 宏包重新设定文档奇偶页的边距,详情参看 Two-sided LaTeX page margins

graphicx

\usepackage{graphicx}

关于 graphicx 没啥特别的,但是它可能是所有宏包中最重要的宏包,这个宏包引入了插图命令 \includegraphics,我们的文档如果需要插图都将用到它。

nag

\RequirePackage[l2tabu, orthodox]{nag}

事实上,如果你的代码没问题,这个宏包将不会做任何事情。注意:把这个宏包放在你的导言区的第一行(甚至在 \documentclass 之前)。它将会检测你文档中是否使用已经被淘汰了的宏包以及过时的命令,nag 的文档说明可以访问 CTAN-nag

microtype

\usepackage{microtype}

microtype 宏包可以改善了单词、字母的间距。它可能做了很多,但是大部分人察觉不到使用它之后文档的变化。但至少,加载了 microtype 之后,文档看起来更好,也更容易阅读。注意:如果有使用到字体宏包,需要将 microtype 宏包放在它们的后面,因为这个宏包对单词、字母的调整和字体是有关的。

siunitx

\usepackage{siunitx}

siunitx 宏包大大简化了写作科技文的 TeX 命令,科技文写作中很大一部分是单位、数字。这个宏包添加了一些命令,比如 \num命令可以输出我们想要的各种方式的数字形式(比如科学记数法),而 \si 命令用来输出单位。我经常用到的命令是 \SI\SIrange。比如 \SI{10}{\hertz} 输出为 “10Hz”(这能有效避免输入错误,我可能会写成 HZ 或者 hz 而不是 Hz)。\SIrange 命令多一个参数:\SIrange{10}{100}{\hertz} 输出为 “10Hz to 100Hz”。

cleveref

\usepackage{cleveref}

另外一个非常有吸引力的宏包是 cleveref。这个宏包引入了 \cref 命令,当使用这个命令用于交叉引用的时候(而不是 \ref 或者 \eqref),根据引用的不同,它会自动添加一个单词前缀,引用 figure 环境,它会自动添加 “fig.”,而对于 equation 环境,它会自动添加 “eq.”。因此,这是一个用来简化写作的 LaTeX 宏包。之前有篇文章介绍了 cleveref 宏包,在那篇文章中,展示了如何修改引用对象前面的单词(比如 fig,eq),详情参看Automatic, clever references with cleveref

编辑引用名

在使用\cref时,其实我想要让它写成equation.的形式,而不是eq.,在宏包cleveref中也是很容易实现的,将下面的代码写入到导言区中:

\crefname{equation}{equation}{equations}

在命令\crefname{·}{·}{·}中的第一个参数的含义是引用的类型(equation、table、figure、section等),第二个参数包含的单词,当只有一个引用时将会被输出,当有多个引用是第三个参数将会被输出。在中文情况下:第二个参数和第三个参数可以是汉字,如:\crefname{equation}{公式}{公式}

默认的前缀中首字母大写

目前我所知道的,仅仅是fig.eq.等的情况,那么有时我们的引用会是整段的开始,那么英文文章要求首字母必须要大写,此时我们是不是不能使用这个宏包呢?答案是否定的。出于其他种种方面的原因(在原文中并没有提到这些具体的原因),不得不将首字母大写,这样做到底是对还是错?或者这看起来很丑陋,但是不管怎样,你可以使用\Cref{···}代替\cref。实现的效果是:Equation 图片的标签注意:中间并没有使用英文状态下的句号.去连接

多个引用

另外在cleveref宏包的引用时,允许在一个引用命令中同时引用多个不同的公式、图、表等。例如\cref{eq1,eq2},他将会显示eq.(1)and(2),但是这还不是多个引用的全部,当引用不同的环境,比如\cref{fig1,tab2,eq3}时,这个宏包将会自动的打印正确的名字和正确的引用。

hyperref

\usepackage[colorlinks=false, pdfborder={0 0 0}]{hyperref}

hyperref 非常强大,你可以有非常多的可能性,其中最突出的特色是超链接。当引用一幅图的时候,引用与图形形成了链接,当你点击引用的地方,它会跳转到链接的图片处。并且 hyperref 可以让你插入 PDF 元数据到你的最终文档中。注意:作为一个经验法则,你应该在导言区的最后加入这个宏包,在所有宏包之后。也存在少数例外的情况:比如,本文提到的 cleveref 宏包,cleveref宏包应该在 hyperref 之后。更多的例外情况可以参看:pkg load after hyperref

booktabs

 \usepackage{booktabs}

booktabs 宏包可以让我们创建没有竖线分隔的表格,这些分隔线在很多情况下是不必要的,并且很难看。使用 booktabs 宏包创建表格比创建普通 LaTeX 表格更费劲。因此,我专门写了一篇文章,关于怎样使用 booktabs 宏包创建好看的表格,详情参看 create nice tables with booktabs

示例下载

我这里写了一个示例,主要是导言区,在这个示例文件中,上述所有的宏包都加载进去了,Happy TeXingessential-packages-howtotex

使用subfiles文档类和宏包实现子文件独立编译

在书籍、学位论文等大型文档的排版中,往往需要将大文档拆分成子文档,然后用\input\include命令将子加载到主文档中(如main.tex)。

但是,在排版中,往往需要通过“试错法”来对单个子文档,甚至是一个图/表的代码进行不断调试。这就需要不断的编译和测试,虽然可以通过\includeonly命令指定编译文件,但却无法独立编译某一个子文档或是代码片段。为了实现编译子文档或是代码片段的编译,一般需要:

  1. 重新建立一个新文件,然后将主文档中导言区中的内容按需拷贝到新建文件中。
  2. 在新文件中撰写需要的内容,独立编译调试。
  3. 保留\begin{document}\end{document}内的内容,然后用\input\include命令加载到主文档。

显然,这是一个比较繁琐的工作。当内容再次变化,需要调试时,可能还得重复类似的工作。

subfiles.cls文档类和subfiles.sty宏包可以很好地解决这一问题,它们能够在独立提取子文档或是代码片段的基础上,通过共享主文档的导言区,实现独立编译子文档或是代码片段。

使用方法

主控文档

在主控文档main.tex引入subfiles.sty宏包,需要注意的是引入该宏包命令必须是主控文档导言区中的最后一条命令,如:

...
\usepackage{subfiles}
\begin{document}
...

引入宏包后就可以用\subfile命令在主控文件中载入子文档或代码片段,如:

...
\subfile{<subfile name="">}
...

其中,<subfile name="">中可以带有用“/”分割(不能用“\”)的路径名称。

子文档

子文档的撰写与常规文档撰写方式一致,但要求文档类必须是subfiles.cls,如:

\documentclass[<main file="" name="">]{subfiles}
\begin{document}
...
\end{document}
...

其中,<main file="" name="">中可以带有用“/”分割(不能用“\”)的路径名称。

独立编译

使用subfiles.cls文档类和subfiles.sty宏包完成文档组织后,打开主控文档main.tex时,将编译所有的文档内容,而打开子文档时,则仅编译独立编译指定的内容,并共享主控文档main.tex导言区中见容。

排版实例

文档组织

按不同属性在不同子目录中组织文件,是较为非常方便的管理方式,假设文件目录结构如下:

jobname
├── chap01
│&nbsp;&nbsp; ├── chap01.tex
│&nbsp;&nbsp; └── figs
│&nbsp;&nbsp;     └── fig01-01lion.eps
├── chap02
│&nbsp;&nbsp; ├── chap02.tex
│&nbsp;&nbsp; ├── figs
│&nbsp;&nbsp;&nbsp;&nbsp; └── fig02-01frame.png
│&nbsp;&nbsp; └── sec01
│&nbsp;&nbsp;     ├── chap02-01.tex
│&nbsp;&nbsp;     └── figs
│&nbsp;&nbsp;         └── fig02-01-01pdflogo.png
├── figs
├── main.tex
└── tree.txt

文档撰写

一个综合实例撰写方式如下:

主控文档main.tex

\documentclass{ctexbook}
% 导言区,可以在此引入必要的宏包
\usepackage{zhlipsum}
\usepackage{graphicx}
%必须是document环境的前最后一行代码
\usepackage{subfiles}
\begin{document}
  \chapter*{摘要}
  \zhlipsum[1]%
  \subfile{chap01/chap01}%
  \subfile{chap02/chap02}%
  \chapter{结论}
  \zhlipsum[4]%
\end{document}

子文档chap01.tex

\documentclass[../main]{subfiles}
\begin{document}
\chapter{发展历程}
\zhlipsum[2]
\begin{figure}[htp]
  \centering
  \includegraphics[scale=0.6]{figs/fig01-01lion}
  \caption{blalala}
\end{figure}
\end{document}

子文档chap02.tex

\documentclass[../main]{subfiles}
\begin{document}
\chapter{现状分析}
\zhlipsum[3]
\begin{figure}[htp]
  \centering
  \includegraphics[scale=0.6]{figs/fig02-01frame}
  \caption{bbbbbb}
\end{figure}
\subfile{sec01/chap02-01}
\end{document}

子子文档chap02-01.tex

\documentclass[../../main]{subfiles}
\begin{document}
\section{并行计算}
\zhlipsum[6]
\begin{figure}[htp]
  \centering
  \includegraphics[scale=0.3]{figs/fig02-01-01pdflogo}
  \caption{cccccc}
\end{figure}  
\end{document}

在各个文档撰写中,建议使用相对路径,禁止使用绝对路径

这样打开main.tex编译就可以生成完整的结果,分别打开chap01.tex、chap02.tex、chap02-01.tex就可以在共享main.tex导言区的前提下独立编译并进行调试。

使用subfiles文档类和宏包实现子文件独立编译时,一方面可以提高调试中的编译速度,另一方面也可以集中精力在小范围内调试代码,提高解决问题的效率。

有关subfiles文档类和宏包的使用细节,请在命令行通过texdoc subfiles命令查阅其使用手册。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment