Skip to content

LaTeX

基本概念

  • LaTeX 是一种排版格式
  • 排版引擎pdflatexxelatexlualatex 可以将 .tex 编译成 .pdf 文件。
  • 使用各种宏包为 LaTeX 添加更多功能,如 amsmath 包提供数学公式增强、graphicx 包提供图片功能。
  • TeX Live 是一个 LaTeX 文档生成系统,把各种引擎和宏包都打包起来了。

命令和环境

  • LaTeX 命令有以下两种结构:
    1. 反斜杠开头及其后的一串字母,以任意非字母符号(空格、数字、标点)为界限:\begin
    2. 反斜杠及其后单个非字母字符\$
    3. 注意:命令大小写敏感,如 \LaTeX
    4. 形式 1 的命令忽略其后所有空格,如需引入空格请在命令后加{}或插入\(代表一个空格):\TeX{}
    5. 命令参数
      • []:可选参数
      • {}:必选参数
      • *:可选的效果
      • 单字符作为参数可不加 {}:如 \frac{1}{2} 可写为 \frac12
  • 环境
    • 环境让一些效果在局部生效或生成特殊的文档元素
    • 一对 \begin{}[]{}\end{} 组成一个环境。
    • 有些命令对其后所有内容产生作用,若需限制作用范围需要分组{},组中的命令作用范围限制在组内(在后文讲解字体时会提到)。

简单语法

内容包括 LaTeX 文档的基本结构、基本语法、注释、字体(粗体、斜体 \textit、下划线、强调 \emph)、图片(图片路径 \graphicspath{{path1/}}、插入图片 \includegraphics、标题、标签和引用)、列表、数学公式(行内、展示模式)、段落和换行、摘要、章和节、表格 tabulartable、TOC(目录 \tableofcontents)、

值得提醒的是,在 LaTeX 中,展示模式的公式不推荐使用 $$ 标记,简单的请使用 \[ 标记,多行等复杂公式请使用公式环境如 displaymathequation。换行与段落的不同也应当注意,换行后仍停留在同一段落中。

字符

  1. 空格和分段

  2. 连续的多个空白字符视为一个空格

  3. 换行符视为一个空格
  4. 多个空行视为一个空行
  5. \par行末分段

  6. 特殊字符

  7. # $ % & { } _ ^ ~ \

  8. 注意:\\是手动换行,\应当使用\textbackslash
  9. 西文排版中的连字现象

  10. 西文标点

  11. 单引号`和'输入

  12. 双引号``和''输入
  13. 其实,中西文引号使用 Unicode 中同一码位
  14. 连字号-、短破折号--(数字)、长破折号---(单词)
  15. 省略号\dots
  16. 其他文本符号 \(\P{} \S{} \copyright{} \pounds{} \textregistered{} \texttrademark{}\)

  17. 断行断页

  18. ~输入一个不会断行的空格(用于人名、图标名等)

  19. 断行:并非另起一段\\[length](可用于表格、公式)\newline(文本)
  20. 断页:\newpage(双栏中另起一栏),\clearpage

基础组件

封面 Cover

\clearpage
%% temporary titles
% command to provide stretchy vertical space in proportion
\newcommand\nbvspace[1][3]{\vspace*{\stretch{#1}}}
% allow some slack to avoid under/overfull boxes
\newcommand\nbstretchyspace{\spaceskip0.5em plus 0.25em minus 0.25em}
% To improve spacing on titlepages
\newcommand{\nbtitlestretch}{\spaceskip0.6em}
\pagestyle{empty}
\begin{center}
\bfseries
\nbvspace[1]
\Huge
{\nbtitlestretch\huge
Main Title}

\nbvspace[1]
\normalsize

Prject No. \\
Some information 
\nbvspace[1]
\small BY\\
\Large Author\\[0.5em]
\footnotesize Student ID: \\
Teacher: 

\nbvspace[2]

Accomplished on \today \\
\nbvspace[3]
\normalsize

Made\\
\large
With \LaTeX
\nbvspace[1]
\end{center}

页边距 Margin

LaTeX 默认页边距较大,常用窄边距设置如下:

\usepackage{geometry}
 \geometry{
 a4paper,
 total={170mm,257mm},
 left=20mm,
 top=20mm,
 }

首行缩进 Indent

\usepackage{indentfirst}

引用 Reference

要按国标 GB/T 7714-2015 规定,则在导言区设置:

\usepackage{gbt7714}
\bibliographystyle{gbt7714-numerical}

即可。

表格 Table

表格对齐

导言区新建列类型:

\newcolumntype{R}[1]{>{\RaggedLeft\arraybackslash}p{#1}}

正文:

\begin{table}[h!]
    \begin{tabular}{R{1.5cm} R{2.5cm} p{5cm} p{4cm}}
        \toprule
        类型        & 标识符          & 参数                            & 描述           \\
        \midrule
        void&OutputData&(char *fileName)&向指定文件输出数据      \\
        \bottomrule
    \end{tabular}
\end{table}

三线表

三线表可以使用 booktabs 宏包,三条线分别是 \toprule\midrule\bottomrule

%preamble \usepackage{booktabs}
\begin{table}[h!]
    \begin{tabular}{llll}
        \toprule
        1 & 2 & 3 & 4\\
        \midrule
        1 & 2 & 3 & 4\\
        1 & 2 & 3 & 4\\
        \bottomrule
    \end{tabular}
\end{table}

跨页表格

复杂的单元格边框

Info

一般使用 hhlinemakecell 宏包。请自行查阅文档。

代码相关

代码清单 Code List

在导言区加入以下设置:

\usepackage{listings}
\usepackage{xcolor}
\definecolor{codegreen}{rgb}{0,0.6,0}
\definecolor{codegray}{rgb}{0.5,0.5,0.5}
\definecolor{codepurple}{rgb}{0.58,0,0.82}
\definecolor{backcolour}{rgb}{0.95,0.95,0.92}
\lstdefinestyle{mystyle}{
    backgroundcolor=\color{backcolour},
    commentstyle=\color{codegreen},
    keywordstyle=\color{magenta},
    numberstyle=\tiny\color{codegray},
    stringstyle=\color{codepurple},
    basicstyle=\ttfamily\footnotesize,
    breakatwhitespace=false,
    breaklines=true,
    captionpos=b,
    keepspaces=true,
    numbers=left,
    numbersep=5pt,
    showspaces=false,
    showstringspaces=false,
    showtabs=false,
    tabsize=2
}
\lstset{style=mystyle}

在正文中使用 lstlisting 环境,指定语言和描述:

\begin{lstlisting}[language=Python, caption=Python example]
import numpy as np

def incmatrix(genl1,genl2):
    m = len(genl1)
    n = len(genl2)
    M = None #to become the incidence matrix
    VT = np.zeros((n*m,1), int)  #dummy variable

    #compute the bitwise xor matrix
    M1 = bitxormatrix(genl1)
    M2 = np.triu(bitxormatrix(genl2),1)

    for i in range(m-1):
        for j in range(i+1, m):
            [r,c] = np.where(M2 == M1[i,j])
            for k in range(len(r)):
                VT[(i)*n + r[k]] = 1;
                VT[(i)*n + c[k]] = 1;
                VT[(j)*n + r[k]] = 1;
                VT[(j)*n + c[k]] = 1;

                if M is None:
                    M = np.copy(VT)
                else:
                    M = np.concatenate((M, VT), 1)

                VT = np.zeros((n*m,1), int)

    return M
\end{lstlisting}

或者从外部文件中导入代码:

\lstinputlisting[language=Octave]{BitXorMatrix.m}

算法描述 Algorithm

一般使用 algorithm2e 宏包,配置 linesnumberedruled 选项能显示行号和类似三线表的边框。

导言区:

\usepackage[linesnumbered, ruled]{algorithm2e}
%% This declares a command \Comment
%% The argument will be surrounded by /* ... */
\SetKwComment{Comment}{/* }{ */}

正文:

\begin{algorithm}
\caption{An algorithm with caption}\label{alg:two}
\KwData{$n \geq 0$}
\KwResult{$y = x^n$}
$y \gets 1$\;
$X \gets x$\;
$N \gets n$\;
\While{$N \neq 0$}{
  \eIf{$N$ is even}{
    $X \gets X \times X$\;
    $N \gets \frac{N}{2}$ \Comment*[r]{This is a comment}
  }{\If{$N$ is odd}{
      $y \gets y \times X$\;
      $N \gets N - 1$\;
    }
  }
}
\end{algorithm}

可以在 algorithm 环境中使用 captionref 等命令。环境中的每一行(除了 {} 表示的块的开始和结尾)都需要以 \; 结尾。

特殊组件

流程图 Flow Chart

导言区新建基本组件:

\usepackage{tikz}
\usetikzlibrary{shapes.geometric, arrows}

\tikzstyle{startstop} = [rectangle, rounded corners, 
minimum width=3cm, 
minimum height=1cm,
text centered, 
draw=black, 
fill=red!30]

\tikzstyle{io} = [trapezium, 
trapezium stretches=true, % A later addition
trapezium left angle=70, 
trapezium right angle=110, 
minimum width=3cm, 
minimum height=1cm, text centered, 
draw=black, fill=blue!30]

\tikzstyle{process} = [rectangle, 
minimum width=3cm, 
minimum height=1cm, 
text centered, 
text width=3cm, 
draw=black, 
fill=orange!30]

\tikzstyle{decision} = [diamond, 
minimum width=3cm, 
minimum height=1cm, 
text centered, 
draw=black, 
fill=green!30]
\tikzstyle{arrow} = [thick,->,>=stealth]

正文:

\begin{tikzpicture}[node distance=2cm]

\node (start) [startstop] {Start};
\node (in1) [io, below of=start] {Input};
\node (pro1) [process, below of=in1] {Process 1};
\node (dec1) [decision, below of=pro1, yshift=-0.5cm] {Decision 1};

\node (pro2a) [process, below of=dec1, yshift=-0.5cm] {Process 2a
text text text text
text text text 
text text text};

\node (pro2b) [process, right of=dec1, xshift=2cm] {Process 2b};
\node (out1) [io, below of=pro2a] {Output};
\node (stop) [startstop, below of=out1] {Stop};

\draw [arrow] (start) -- (in1);
\draw [arrow] (in1) -- (pro1);
\draw [arrow] (pro1) -- (dec1);
\draw [arrow] (dec1) -- node[anchor=east] {yes} (pro2a);
\draw [arrow] (dec1) -- node[anchor=south] {no} (pro2b);
\draw [arrow] (pro2b) |- (pro1);
\draw [arrow] (pro2a) -- (out1);
\draw [arrow] (out1) -- (stop);

\end{tikzpicture}

散点图 Scatter Plot

一个例子:

% Preamble: \pgfplotsset{width=7cm,compat=1.18}
\begin{tikzpicture}
\begin{axis}
    \addplot [
        scatter,
        only marks,
        point meta=explicit symbolic,
        scatter/classes={
            a={mark=square*,blue},
            b={mark=triangle*,red},
            c={mark=o,draw=black}% <-- don't add comma
        },
    ] table [meta=label] {
        x      y        label
        0.1    0.15     a
        0.45   0.27     c
        0.02   0.17     a
        0.06   0.1      a
        0.9    0.5      b
        0.5    0.3      c
        0.85   0.52     b
        0.12   0.05     a
        0.73   0.45     b
        0.53   0.25     c
        0.76   0.5      b
        0.55   0.32     c
    };
\end{axis}
\end{tikzpicture}