1 介绍
在我们使用 LaTeX 的过程中,经常会创建一些我们自己的 .sty
和 .cls
文件。本文介绍了如何设置 texlive 的搜索路径,使其能够搜索到我们自定义的包或者类文件。本文主要参考了 Where do I place my own .sty or .cls files,to make them available to all my .tex files? 和 How to register my own packages or classes in a separate drive to TeX Live installation? .
如果我们编写的包或者类只使用一次,只需要将其放置到使用这些包或者类的 .tex
文件所在的目录下即可。这是一种比较简单的方法,在包或类仅复用几次的情况下,将其粘贴到对应的 .tex
文件所在目录都是不错的选择。但是如果我们需要多次复用这些包(类)或者这些包(类)仍在开发中需要不断的修改。这种方法就十分不合理了,因为每次包(类)的更新都需要手动的修改所有文件。
下面提供的方法能够让 LaTeX 像使用标准包一样找到我们自定义的包(类)。本教程使用的操作系统为 Win10.使用的 LaTex 环境为 texlive2018 和 TeXstudio 2.12.10.在 linux 下的操作步骤和本文类似,只是对应的目录稍有不同。
2 一种简单的方法
在 cmd 命令行中输入下面命令查看文件搜索的家目录。
kpsewhich -var-value=TEXMFHOME
我这里显示为 C:/Users/10091/texmf
。接下来对应的创建目录 C:\Users\10091\texmf\tex\latex
。一般情况下后三级目录是不存在的需要我们手动创建。创建完毕之后,我们将自己编写的 .sty
和 .cls
文件放到该目录下即可。当然在该目录下创建更多目录也是允许的,比如创建 C:\Users\10091\texmf\tex\latex\mysty
文件夹用来放置文件类,创建 C:\Users\10091\texmf\tex\latex\mycls
文件夹用来放置包。
放置完毕后,我们可以在命令行中输入下面命令来检查一下 LaTeX 是否能找到对应的包(类)。
kpsewhich 文件名.sty(.cls)
如这里我创建了名为 ldbox.sty
的包放置到 mysty 文件夹下,输入 kpsewhich ldbox.sty
时就会输出 C:\Users\10091\texmf\tex\latex\mysty\ldbox.sty
。
3 详细的配置方法
3.1 添加包(类)搜索路径
上面我们给出了一种较为快速的添加自定义包(类)的方法。本质上是将我们的自定义文件放置到 LaTeX 搜索目录下,而不是添加额外的搜索路径。下面将较为详细的介绍 texlive 搜索路径的配置过程。
texlive 有两个配置文件,一个是全局配置文件一个是用户配置文件,可以通过输入下面命令查看配置文件的所在位置。
kpsewhich -a texmf.cnf
我这里显示内容如下:
d:/software3/texlive/2018/texmf.cnf
d:/software3/texlive/2018/texmf-dist/web2c/texmf.cnf
其中第一个是用户配置文件,用来保存用户的个人配置。第二个是全局配置文件,全局配置文件在更新时会丢失所有的配置,因此不建议修改全局配置文件而是修改个人配置。
首先查看全局配置文件,这里我们关心其中的两个变量 TEXMF
和 TEXMFLOCAL
。TEXMF
变量保存了所有的搜索路径。该变量的在文中定义如下:
TEXMF = {...,$TEXMFHOME,!!$TEXMFLOCAL,...}
可以看到 TEXMF
变量包含了 TEXMFLOCAL
和上一节我们提到的 TEXMFHOME
。同样的我们也可以在命令行中 kpsewhich -var-value=变量名
来查看 TEXMF
和 TEXMFLOCAL
变量的值。
由于 TEXMF
变量包含了 TEXMFLOCAL
变量,所以这里我们在用户配置文件中定义 TEXMFLOCAL
变量即可。我这里定义 TEXMFLOCAL
如下:
TEXMFLOCAL=D:/software3/texlive/myLib
如果需要添加多个搜索路径的话,使用,
分割。且结尾不包含逗号和反斜杠,如:
TEXMFLOCAL=D:/software3/texlive/myLib,d:/myTexLib2
同样在搜索目录下创建 tex/latex
目录,然后将自定义的包(类)放到该目录下。
注意:LaTeX 只搜索设定目录中 text/latex
子路径下的包(类)文件。对应这里为 D:/software3/texlive/myLib/tex/latex
。
然后在命令行输入下面命令来更新包(类)数据库:
texhash
这一点和上一节不同,上一节中我们直接将文件放到对应文件夹中即可,并不需要输入更新命令。
最后同样可以输入 kpsewhich 文件名.sty(.cls)
来验证是否能够找到对应的自定义包(类)。
下图给出了上面提到的几个命令及其运行结果:
3.2 添加资源文件搜索路径
有时候我们在编写自定义的文档类时会使用到一些图片,如给首页添加一张背景图片或添加 logo 到页眉中。这些图片应该放置什么地方呢?如果我们使用模板时是将模板放置到.tex
文件夹下(本文的方法一),则这些图片和普通的.tex
文件调用图片放置到相同目录下即可。
如果我们使用上面的方法二和方法三来添加自定义文档类时,则只需要将其放置在搜索路劲下的 tex/latex/文档类所在文件夹/resources
文件夹下即可(文档类指的是.cls
后缀的文件)。我这里对应的路径为:
D:\software3\texlive\myLib\tex\latex\obit\resources
即使是添加了资源,也应该使用 texhash
命令来更新数据库。更多关于 TEX 目录结构(TEX Directory Structure 简称TDS)可以参考 How to write a LaTeX package that bundles not only .sty and .cls files but also some logos in .pdf or .eps formats? 的回答以及文档 A Directory Structure for TEX Files。
4 总结
在 texlive 中使用自定义的包(类)一共有三种方法:
- 直接将自定义的包(类)放置到需要使用的
.tex
所在文件夹下。最为简单但局限性很大。 - 将自定义的包(类)放置到预定义的目录(
TEXMFHOME
)下。这种方法无需更新数据库,较为简单且局限性较小。 - 将自定义的包(类)放置到自定义的目录(通过
TEXMFLOCAL
指定)下。除了要放置文件外,还需要手动更新数据库。该方法灵活性很高。