读懂LaTeX中cls文件
cls文件都以
\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{selfbook}[2019/11/11 v0.1 Book Template for Self Use]
\LoadClass{ctexbook}
\RequirePackage{titlesec}
这几行代码开始,其中第一行指定了LaTeX编译器的版本需求。告诉了编译器这个宏包或者说类文件是属于哪个版本的。本文中宏包和类都指.cls文件。
第二行指出了这个宏包的版本修改日期,日期格式必须是代码中所示的那样。\ProvidesClass命令的第一个参数就是cls文件的名字,两个必须一致;第二个参数是可选的,如果给出了第二个参数,则编译器会检查文档所引用的类文件,如果引用的不是最新版本会给出警告,但是一般文档中也不会指出具体的日期,所以作用不大。
第三行给出了该类所继承的父类,一般宏包都是依托于其他宏包编写的。这里给出依托的其他类名,这样我们没有设置格式的其他文章结构都会使用父类默认的格式。
第四行\RequirePackage命令指出该类需要使用的其他宏包,这个宏包和第三行的宏包不太一样,这里的宏包提供了设置格式的功能,第三行的宏包一般是给出了各种设置的格式,如chapter、section等的格式。此外,\RequirePackage保证引用的宏包只被引入一次,类似于C++中的#pragma once。
之后的cls文件中,一般是各种格式的定义。这里记录比较困惑的常见命令格式:
-
\makeatletter
&\makeatother
这两条命令括起来的内容中,@符号是一个普通的字符,不需要转义或者进行其他处理,就和a~z等其他字符一样。这是为了处理一些含有@符号的命令而设计的。 -
\@ifstar
这条命令是为了处理命令中含有*的命令而设计的。例如\newcommand{\mycmd}{\@ifstar{\mycmd@star}{\mycmd@nostar}} \newcommand{\mycmd@nostar}[nostar-num-args]{nostar-body} \newcommand{\mycmd@star}[star-num-args]{star-body}
定义了\mycmd和\mycmd*两个命令,当使用\mycmd时,相当于调用了\mycmd@nostar命令,而使用\mycmd*时,相当于调用了\mycmd@star命令,当然,代码中的\mycmd、\mycmd@nostar、\mycmd@star等命令名称可以自己任意取,当似乎用@符号时,需要使用1中的两条命令包起来。
-
glossaries宏包使用
如果文档中有缩写表、符号表或者术语表的编写需要,可以使用nomencl、glossary、glossaries这三个宏包,其中前两个宏包比较简单,易于使用,但是功能也少,glossaries宏包功能丰富,使用起来也更复杂。\documentclass{ctexbook} \usepackage{glossaries} % 引入glossaries宏包 \makeglossaries % 引入*.glo文件 \newglossaryentry{tm}{ % 新建缩写表项 name={Turing machine}, % 缩写的展开名,可以使用其他命令以设置格式,如加粗、斜体等 description={A model of a machine that computes. The model is simple but can compute anything any existing device can compute. It is the standard model used in Computer Science.}, } \begin{document} Everything begins with the definition of a \gls{tm}. ... \printglossaries % 缩写表将打印在这个位置 \end{document}
上面代码是使用glossaries宏包的一个最简单的例子。在TeXstudio中新建文件,粘贴进这些代码,保存为任意的.tex文件,分别按F5(编译)、F9(调用makeglossaries.exe)、F5(再次构建并预览)即可看到运行得到的pdf文件。我主要编写中文文档,构建使用的是XeLaTeX,需要在texstudio中Options->Build中将Default Compiler更改为XeLaTeX。运行中可能遇到没有perl解释器的问题,报错信息为makeglossaries.exe: The Perl interpreter could not be found.。需要搜索perl,去其官网下载perl解释器并安装。我下载的是ActivePerl-5.28.1.0000-MSWin32-x64-432e1938.msi文件,其他操作系统安装相应版本即可。此外,我测试了安装CTeX-2.9.2.164_Full.exe版本的ctex,当运行makeglossaries.exe时,会提示一大堆警告,大致是说makeglossaries使用了过时的perl语法,但是编译结果是正确的。如果对一大堆警告不爽,可以安装texlive2019.iso(win7 安装texlive2019.iso时可以解压后运行install-tl_windows.bat文件,但必须是管理员身份运行,否则安装会报错。),其对应的makeglossaries版本为4.41,本人测试,没有任何问题,完美输出。如下图:
-
\graphicx
图片处理功能需要的宏包,在texlive2019版本中,图片名中含有中文时导致不识别,报错信息为File `figures/inter中‘ not found. Font shape `TU/STXingkai(0)/bx/n undefined(Font)。实际上图片是存在的,字体也是存在的,将图片中的中文字符删掉重新编译就会正常输出,怀疑可能与编码有关系。另外使用CTeX-2.9.2.164_Full.exe安装的latex版本,图片中含有中文字符可以正常输出。CTeX是TeX的中文套装,包含了中文文档编写的工具及配置,对中文支持比较好,但网上搜索到的版本很老,估计很久没更新了。而texlive怎么配置使其正常支持中文文件名,目前没搜到好的解决方案,如果有人知道,求教。网络上有很多人说有图片但提示图片找不到,可以看看图片路径或名称中是否有中文。