Mrli
别装作很努力,
因为结局不会陪你演戏。
Contacts:
QQ博客园

学会Latex写作

2020/11/28 计算机基础知识
Word count: 2,212 | Reading time: 10min

首先开始的便是文档定义:

1
2
3
4
5
\documentclass[bachelor]{njupthesis}
% \documentclass[option]{class}
% class有article, proc, minimal, book, slides
% option: a4paper(纸张大小)、10pt(字体大小)、fleqn(行间公式对齐方式)、leqno(行间公式的编号对齐方式)、onecolumn(单栏)、titlepage(文档标题后另起一页)
\end{document}

查看: https://blog.csdn.net/wei_love_2017/article/details/86617235

可以看到这边的documentclass是自定义的,原因是因为这个使用的是郭学长做的毕设latex模板, 因此借此机会也学习下Latex的模板制作, 主要是cls文件的编写

cls文件是什么?

LaTex中常见的文件格式有.tex, .bib, .cls, .sty, .bbl等。

  • .tex文件也就是我们写文档内容的文件;
  • .bib是使用bibligraphy方式导入参考文献时,写参考文献的文档;.bbl是其编译之后形成的文件;
  • .sty是包文件,通常使用\usepackage导;
  • .cls是类文件,通过文档最前面的\documentclass命令导入

cls文件怎么写的?

cls文件可以分为四部分,我暂且分别称之为声明、宏定义、输入数据处理以及其他四部分

  1. 所谓声明,只是说明了编译cls文件需要什么样的TeX格式以及本cls文件可以提供什么内容,基本上是万年不变的,如下:

    1
    2
    \ProvidesClass{resume}[Mylatex] % 其中,[ ]中的内容可以随便填写呀~
    \NeedsTeXFormat{LaTeX2e}
  2. 第二部分,宏定义,这部分内容则是各取所需了,如果有需要,可以在此进行简单的定义,我在此定义了两个\newif,用于判断中文简历和英文简历:

    1
    2
    \newif\ifChinese
    \newif\ifEnglish
  3. 第三部分,处理输入数据,也就是上文提到的\documentclass[a4paer,12pt]{article}中的a4paper和12pt这两条数据

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27

    ```latex
    \DeclareOption{zh}{\Chinesetrue\Englishfalse}
    \DeclareOption{en}{\Chinesefalse\Englishtrue}
    \DeclareOption*{%
    \PassOptionsToClass{\CurrentOption}{article}
    }
    \ProcessOptions\relax
    \LoadClass{article}
    % 对于zh,我进行的操作是将\Chinese这个变量设为true,\English这个变量设为false,以便在后续使用第二部分定义的\if,
    % 第三条语句为将初zh, en之外的其余参数传至article类,供article类进行处理,最后呢,就是加载继承的article类;——如郭学长njupthesis所做的处理为: \LoadClass[12pt, openany, twoside]{book}
    ```

    4. 第四部分,会先导入需要用到的包,之后将上面的零散语句贴上去。在tex文件中,导入包通常使用\usepackage命令,但是在cls中,一般要使用\RequirePackage的方式将其导入,如:

    ```latex
    % Customize the section headers
    \RequirePackage{titlesec}
    % footnote
    \RequirePackage{fancyhdr}
    % Set the margins
    \RequirePackage[margin=0.5in]{geometry}

    \RequirePackage[T1]{fontenc}
    ```

    最后,在.tex文件中通过`\documentclass{Mylatex}`来使用该cls文件即可

查看:【LaTex】cls文件编写和使用入门

\ProvidesClass

1
2
\ProvidesClass{njupthesis}
\LoadClass[12pt, openany, twoside]{book}
  • ProvidesClass为定义出的模板class名
  • LoadClass为documentclass中原先指定的参数

\DeclareOption

1
2
3
4
5
\DeclareOption{bachelor}{
\renewcommand{\chinesedegreename}{本科}
\renewcommand{\chinesebooktitle}{本科生毕业设计(论文)}
\renewcommand{\englishbooktitle}{Bachelor Thesis}
}

关于\documentclass的option设置

\newcommand

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
% 姓名的字体较大,且加粗,实现方式:
\newcommand{\name}[1]{
\huge {\textbf{#1}}
}
% tex中调用方式为: \name{Zhang San}

\newcommand{\wanted}[1]{
\normalsize {\textbf{申请职位:}} #1
% \textbf 为加粗
% \normalsize 为设置常规字号
}

\newcommand{\address}[1]{
\normalsize
\raisebox{-3pt}{\includegraphics[height=#1]{#2}} #3
% \includegraphics 为插图的命令: \includegraphics[选项]{文件}
% \raisebox: 升高或者降低text盒子: \raisebox{上移量}[高度][深度]{文本}
% #1表示要显示图标的高度
% #2表示图标文件完整路径
% #3表示图标后要显示的文字
}
% tex中调用方式为: \address{12pt}{add.png}{Nanjing, China}

\newcommand{\edusubsection}[3]{
\subsection{\textbf{#1} \hfill #2}
% \sunsection 预设了较大的字体
% \hfill 设置弹性长度
\vspace{-4pt}
% \vspace{宽度大小} 设置垂直间距
{\normalfont\normalsize #3}
\vspace{-10pt}
}

最后一个\edusubsection的效果图

分析下语法:\newcommand为自定义命令: \newcommand{<自命名指令>}[<参数个数>][<首参数默认值>]{<具体的定义行为>}

注:

  • 命令只能由字母组成,不用以\end{}结尾
  • 取参数时,从1开始索引

p.s. \renewcommand重新定义已有命令, 语法跟\newcommand相同


\DeclareCaptionFormat

设置题目标题格式

1
2
3
4
5
6
7
8
\DeclareCaptionFormat{algrule}{%
{\@hangfrom{#1#2}%
\doublespacing
\small
\advance\caption@parindent\hangindent
\advance\caption@hangindent\hangindent
\caption@@par#3\par}%
}

\graphicspath

设置图片路径

1
\graphicspath{{./pic/}}

\titleformat

设置各个title格式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
\titleformat{\chapter}[block]
{\centering\fontsize{15pt}{15pt}\selectfont\heiti\thispagestyle{fancy}}{\thechapter}{2pc}{}

\titleformat{\section}[block]
{\fontsize{14pt}{14pt}\selectfont\heiti}
{\thesection}{7pt}{}

\titleformat{\subsection}[block]
{\fontsize{14pt}{14pt}\selectfont\heiti}
{\thesubsection}{7pt}{}

\titleformat{\subsubsection}[block]
{\fontsize{12pt}{12pt}\selectfont\heiti}
{\thesubsubsection}{6pt}{}

\newtheorem

\newtheorem{theorem}{Theorem}[Chapter]

引用

\citing

设置引用

1
当代生活\citing{pedregosa2011scikit}是严肃文学大师的作品。

\bibliography

1
2
\bibliographystyle{IEEEtran}		% 按照IEEEtran.bst的样式引用
\bibliography{cog} % 引用文件制定为cog.bib

\newenvironment

\newenvironment{新环境名称}[参数个数][参数默认值]{开始部分定义}{结束部分定义}\renewenvironment{新环境名称}[参数个数][参数默认值]{开始部分定义}{结束部分定义}

其中参数的用法和\newcommand 相同,最多允许9个参数,顺序使用#1、#2等引用参数。如果没有使用参数,则[0]可以省略。假设myenv环境的调用如下:\begin{myenv}{arg_1}…{arg_k}

则可以在“开始部分定义”中使用#1,…#k来引用参数,这是newenvironment传递参数的方式。需要特别注意的是,newenvironment的参数只有在“开始部分定义”中才能使用,即“结束部分定义”中的代码无法获取参数。因此,如果要在“结束部分定义”中使用新环境的参数,必须在“开始部分定义”中保存到寄存器中,比如通过\newsavebox 和\sbox 等命令。

举例:

先看一个简单的文章“摘要”(Abstract)的例子:假设,摘要的标题—摘要(Abstract)两个字加粗居中显示,正文使用quote格式,完整的示例文件参见2。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
\documentclass{article}
\pagestyle{empty}
\setlength\textwidth{3in}%限制文本宽度使得较少的文字就容易看出断行的效果
\newenvironment{Abstract}{
\begin{center}\normalfont\bfseries Abstract\end{center}
\begin{quote}\par
}%开始部分定义
{\end{quote}}%结束部分定义
\begin{document}
\begin{Abstract}
This abstract explain the approach userd to solve the problems at hand.
\end{Abstract}
Some text following the abstract. Some text following the abstract. Some text following the abstract.
\end{document}

njupthesis

\makecover 封面

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
\newcommand{\makecover}{
\thispagestyle{empty}
\setlength{\extrarowheight}{36pt}
\begin{center}
\fontsize{36pt}{36pt}\selectfont{\heiti 南京邮电大学 \\ 毕{}业{}设{}计(论{}文)\\}
\vspace{2cm}

\begin{tabular}{>{\fontsize{16pt}{16pt}\kaiti}l
>{\centering\arraybackslash\fontsize{15pt}{15pt} \kaiti}
p{11.53cm}}
题\chinesespace\chinesespace 目{}{} & \thetitle \\
\cline{2-2}
专\chinesespace\chinesespace 业{}{} & \themajor \\
\cline{2-2}
学生姓名{}{} & \theauthor \\
\cline{2-2}
班级学号{}{} & {\large \thestudentid} \\
\cline{2-2}
指导老师{}{} & \theadvisor \\
\cline{2-2}
指导单位{}{} & \theschool \\
\cline{2-2}
\end{tabular}

\vspace{5cm}

\fontsize{16pt}{16pt}\selectfont{\kaiti 日期:\quad \thebegindate {} 至\hspace{.5pc} \thefinishdate \\}
\end{center}

\newpage
\thispagestyle{empty}

\noindent

\begin{center}
\fontsize{16pt}{16pt}\selectfont{\heiti
毕业设计(论文)原创性声明
} \\[48bp]
\end{center}

\begin{spacing}{2.0}
郑重声明:所提交的毕业设计(论文),是本人在导师指导下,独立进行研究工作所取得的成果。除文中已注明引用的内容外,本毕业设计(论文)不包含任何其他个人或集体已经发表或撰写过的作品成果。对本研究做出过重要贡献的个人和集体,均已在文中以明确方式标明并表示了谢意。\\ \\

\hspace*{7cm} 论文作者签名:

\hspace*{7cm} 日期:\quad\quad 年\quad\quad 月\quad\quad 日
\end{spacing}


\newpage
\setcounter{page}{0}
\setcounter{pseudopage}{0}
\setlength{\extrarowheight}{5pt}
}

\thesistableofcontents 目录

1
2
3
4
5
6
7
% TODO: 更改目录样式

\newcommand{\thesistableofcontents}{
\pdfbookmark{目录}{toc}
\tableofcontents
\thispagestyle{empty}
}

\thesisappendix 附录

1
2
3
4
5
6
7
8
9
10
11

\newcommand{\thesisappendix}{
\chapter*{附\chinesespace\chinesespace 录}
\setcounter{section}{0}
\addcontentsline{toc}{chapter}{附录}
\markboth{附录}{附录}
\thispagestyle{fancy}
\renewcommand{\theequation}{a-\arabic{equation}}
\renewcommand{\thetable}{a-\arabic{table}}
\renewcommand{\thefigure}{a-\arabic{figure}}
}

\thesisacknowledgement 致谢

1
2
3
4
5
6
7
8
9
\newcommand{\thesisacknowledgement}{
\renewcommand\thesection{\arabic{section}}
\addtocontents{toc}{\protect\setcounter{tocdepth}{0}}
\setcounter{section}{0}
\chapter*{致\chinesespace\chinesespace 谢}
\addcontentsline{toc}{chapter}{致谢}
\markboth{致谢}{致谢}
\thispagestyle{fancy}
}

\thesischapterexordium 章绪论

1
2
3
4
5
6
7
\newcommand{\thesischapterexordium}{
\newpage
\addtocontents{toc}{\protect\setcounter{tocdepth}{2}}
\standardhead
\pagenumbering{arabic}
\setcounter{page}{1}
}

\thesisloadbibliography reference引用

1
2
3
4
5
6
7
8
9
\newcommand{\thesisloadbibliography}[2][]{
\ifthenelse{
\equal{#1}{nocite}
}{
\nocite{*}
}{}
\bibliographystyle{njupthesis}
\bibliography{#2}
}

总结:

  • {}中的大多为具体内容, []中的大多为option选项设置
  • \newcommand{\xxx}相当于一个宏定义替换, 在tex中直接使用指令\xxxx即可;\newenvironment{xxx}{}相对而言复杂一点,在tex中需要用\begin{xxx} ... \end{xxx}

Author: Mrli

Link: https://nymrli.top/2020/11/28/熟悉Latex写作/

Copyright: All articles in this blog are licensed under CC BY-NC-SA 3.0 unless stating additionally.

< PreviousPost
《漫画机器学习入门》大关真之——读书笔记
NextPost >
深度学习+Pytorch学习笔记
CATALOG
  1. 1. cls文件是什么?
  2. 2. cls文件怎么写的?
    1. 2.1. \ProvidesClass
    2. 2.2. \newcommand
    3. 2.3. \DeclareCaptionFormat
    4. 2.4. \graphicspath
    5. 2.5. \titleformat
    6. 2.6. 引用
      1. 2.6.1. \citing
      2. 2.6.2. \bibliography
    7. 2.7. \newenvironment
  3. 3. njupthesis
    1. 3.1. \makecover 封面
    2. 3.2. \thesistableofcontents 目录
    3. 3.3. \thesisappendix 附录
    4. 3.4. \thesisacknowledgement 致谢
    5. 3.5. \thesischapterexordium 章绪论
    6. 3.6. \thesisloadbibliography reference引用
  • 总结: