|
前言
本文总结了一下本地使用LaTeX前的准备工作,主要包括概念理解与macOS上的环境配置,以方便自己随时能捡起来。如果想跳过这些直接上手,线上版的Overleaf将是不错的选择。
我期望看完本文后,你将
- 形成概念框架,知道需要了解什么,以及去哪里进一步了解
- 不再感觉操作黑箱,并拥有一定的定制化能力
- (如果你是mac用户)直接开始编写第一个.tex文件
不过本文是笔者作为初学者的学习笔记分享,希望谨慎参考,如有阙漏,还请谅解。
概念轰炸
如果我提到“latex”,我有可能是指LaTeX语言作为TeX语言的宏,也可能是在指它的某个发行版,也可能是指编译器latex。与此同时,还有很多带有“tex”(一般读作“tech”)的名称也容易彼此混淆,所以本章先将它们梳理清楚。
排版系统(Document Preparation Systems)
排版系统包含<语言,宏>,是一组事先约定好的关键字集,其中宏(macros)是在底层语言上的进一步封装,比如成语可以类比为汉语的宏。
TeX、LaTeX、ConTeXt等都可以被称作排版系统,这个语境强调的是关键字的约定。其中TeX只包含“元指令”,自由但十分繁琐晦涩;而LaTeX是在TeX基础上封装了若干常用的宏,它们不那么自由但容易上手。
LaTeX的前一个版本为LaTeX2.09,当前版本为LaTeX2e,epsilon意为在2版本之后,但距离3版本还遥遥无期。值得一提的是,排版系统的新旧概念与快速迭代的程序不同,LaTeX2e这个“最新版”诞生于1994年。
关于LaTeX项目,可以在官网找到各种帮助文档(链接),也可以在英文版wikibooks找到超级无敌事无巨细的电子书(链接),它们尤其是后者是我进一步学习的首选。但如果仅仅查阅简单语法的话,我十分推荐《不太简短的LaTeX2e介绍》(链接),英文版为The Not So Shot Introduction to LaTeX2e(链接),下文将其简称为lshort。
注意lshort有很多版本,目前最新的是2021年版。下载的发行版中应该会附带,至少TeX Live与MacTeX是这样。
发行版(Distributions)
发行版包含<引擎,字体,宏包>,是使用排版系统的软件套装。其中引擎(Engines)是核心,负责“代码+字体+宏包->可打印文件”这一过程。
特别地,LaTeX的发行版有TeX Live、MacTeX、MiKTeX。
TeX Live | 跨平台 | MacTeX | 主要面向macOS | MiKTeX | 主要面向Windows | 这些发行版的官网外观可能比较简陋,但其实文档都很完整。以我选择的TeX Live为例,目前只需要读标准文档(链接)中的安装方法。
另外,如果你已经下载、配置好了TeX Live,也可以在命令行直接打开lshort的英文或中文版。
% texdoc lshort
% texdoc lshort-zh-cn引擎(Engines)
引擎也就是编译器,负责将你的源代码转化为可打印文件,同时还需要你提供自己用到的字体和宏包,不过在发行版中已经打包好了。
可打印文件主要有.dvi与.pdf,TeX编译器主要有tex、pdftex、xetex、luatex等。类似地,如果名称为**latex,则是LaTeX的编译器。(但是我找到二进制文件latex与tex,发现latex的原身就是tex,我现在还不理解为什么调用后会有区别。)
tex, latex | 输出dvi文件 | pdftex, pdflatex | 输出pdf文件 | xetex, xelatex | 对字体与符号的支持更强大 | luatex, lualatex | 字体(Fonts)
这里我还没弄懂。但根据我有限的了解,字体的坑似乎很深,且普通用户根本不需要了解。
宏包(Packages)
宏包是包含额外LaTeX指令的文件,不过从某种程度上讲,LaTeX本身就是一个宏包。
发行版中会自带一些宏包,例如amsmath等。很多都是可选项,安装时可以选择动态下载以节省空间。但为了省心,我个人建议一次性下载。
如果有特殊需求,也可以到CTAN平台(链接)寻找你需要的第三方包,例如绘制棋盘、乐谱、化学式等。与宏包相关的文件必须严格按照规则存放,所以有专门包管理器来负责下载、卸载,例如TeX Live的包管理器是tlmgr。
我的工具选择(跨平台)
概念介绍结束,下面进入正题。
使用LaTeX,原则上只需要下载发行版,就可以在命令行里写论文了。但有没有一种方法,让写论文还能享受到图形界面、代码补全、双向定位、版本控制等特性呢?可以,这就需要配备合适的代码编辑器、预览器了。它们之间的大致关系如下图所示。

在工具的选择上,我的第一需要是通用、跨平台,不追求对专业人士最高效,只追求例外情形最少。于是我果断选了一个至少不会错的方案:TeX Live + vs code + Zotero(沿用的文献管理器) + Viewer(vs code插件或系统自带的预览器)。最主要的选择是前两个,接下来我会说我的理由。
如果想选择不同的工具,wiki电子书(链接)的2.3-2.5节列举了许多其他选择,不过可能有些老旧了,酌情参考。 TeX Live
如上文介绍中提到的,TeX Live面向全平台,如果我未来某个时候需要在集群或者PC上使用,那么操作也差不多。由于是Linux用户的首选,它在许多教程中也是默认选择。
MacTeX类似于某种TeX Live plus,对macOS有更多支持,我以后可能会尝试。
vs code
vs code社区大、轻量、可拓展性强,这意味着原则上你可以用它做任何事情,并且比较容易获得帮助。不过最最重要的还是跨平台,它可以远程登录集群,同时其他操作都不需要变。
对于各种代码相关的任务,会有人推荐各种不同的编辑器,但我现在尽量在把所有事情都放到vs code做。尽管有时学习成本比较陡峭,需要弄懂原理,但长远来看我不后悔。因为其他编辑器或者IDE基本只是多做了一些自动化,不懂原理的话还是可能出问题,懂了的话本质上都一样。
Zotero(沿用)
这里继续选择它算是一种沿用。如果原先就没有文献管理的需要,那这里也可以跳过。
Viewer(自带)
意思就是不额外下载预览器。可以使用vs code插件里自带的,具备双向定位功能,也可以空格呼出系统自带的。这些对我入门级使用已经足够了,如果要更换也等有明确需求再说。
下载并配置工具(macOS)
其实关键配置只有两步:1)把三行代码复制到bash_profile里完成Tex Live配置;2)把一揽子代码复制到setting.json里完成vs code配置。但我打算多说几句,希望把做了什么说清楚。
TeX Live
1&2 下载并安装
下载可以选择挂梯从官网下,也可以选择清华镜像(链接),得到的是texlive.iso虚拟光驱。在清华源的检索方法是:CTAN社区 -> TeX Live系统 -> image镜像。
打开虚拟光驱可以看到一个名为install-tl的可执行文件,这就是安装器。双击运行,按照默认方式安装。这时候考虑清楚什么包更有用是不太现实的,而且安装完再进行包管理可能会出现更多问题,所以我不打算考虑节省空间。
TeX Live主体会被安装到/usr/local/texlive,这一点符合规范,但是为了允许同时存在多个版本,TeX Live的子目录结构会有所不同。
更加定制化的安装方式,可以参考TeX Live官方文档(链接)。 3 配置环境变量
这时在终端查询tex引擎版本
% tex --version 会发现报错了,这是因为没有找到名为tex的程序,还需要配置所谓的“环境变量”。环境变量有很多,最主要的是“PATH”,它们类似于你的“视野”,而配置环境变量则是让路径下的文件可以被“看到”。
为直观感受这一点,可以打开Finder,按下cmd+shift+G,输入/usr/local/texlive进入TeX Live的主目录、然后依次进入.../20**/bin/**-darwin文件夹(星号取决于下载的版本),在这里可以看到很多可执行文件

其中就有上文提到的tex、pdftex、xetex等引擎。不管未来使用什么软件,本质上都是在终端调用这些引擎。
而在终端打印一下环境变量PATH
% echo $PATH会发现其中并不包括这条路径,这就是为什么之前终端找不到tex引擎。现在不妨把它添加进去(下面以我的路径为例,记得换成自己的)
% PATH=/usr/local/texlive/2022/bin/universal-darwin:$PATH export PATH在输入路径时,可以直接把**-darwin文件夹拖进来避免出错。这时再次输入
% tex --version就可以成功得到tex引擎的版本了。
不过这只是临时添加,重启终端后PATH就会恢复原状。为了修改环境变量的默认值,需要打开Finder,按“cmd+shift+G”输入“~”进入用户路径,按“cmd+shift+句号”显示隐藏文件,打开名为“.bash_profile”的文件,把以下命令添加进去(其中第一行是关键,后两行是为了一些手册文件能被找到)
PATH=/usr/local/texlive/2022/bin/universal-darwin:$PATH export PATH
MANPATH=/usr/local/texlive/2022/bin/universal-darwin/doc/man:$MANPATH export MANPATH
INFOPATH=/usr/local/texlive/2022/bin/universal-darwin/doc/info:$INFOPATH export INFOPATH保存后重启终端,PATH中依旧保留了目标路径,这意味着环境变量就配置好了。这一步一般用vim完成,但这里暂且不涉及它。
我参考的是TeX Live官方文档(链接)3.4.1节中Unix的配置方式,在macOS中仅略有不同。 vs code
1 下载插件
假设已经下载了vs code本体。在左侧活动栏(Activity Bar)找到插件项,搜索并下载LaTeX Workshop插件,注意看准是哪个

下载完成后,打开一个.tex文件,活动栏中就会自动出现一个TEX项。展开commands可以看到各种操作

其中最常用的就是
- 编译(Build),快捷键cmd+opt+B
- 定位(Navigate),快捷键cmd+opt+J
- 反向定位,快捷键cmd+click
2 配置插件
插件目前并不确定如何完成这些操作,也就是说还需要进行配置。
我对“配置”的粗浅理解是:为了让vs code自动在终端输入命令、可视化输出结果,所需要完成的提前约定。
首先,在vs code界面按下“cmd+shift+P”打开命令板(command palette)——这将会经常用到——搜索“User Settings”,可以看到两个可选项,一个是打开设置界面,另一个则是打开名叫settings的.json文件,我们选择后者。

如果没有经过任何配置,那么应当看到文件中只有两个孤零零的大括号。接下来所有的配置条目应该都被写在中间,并且由逗号隔开,这是json的语法要求。在settings文件中,我们可以预设所有vs code插件的行为,这等价于在设置界面中逐条修改,但只会更方便。
先展示两条基本配置。
{
&#34;latex-workshop.latex.tools&#34;: [ // 编译工具列表
{ // 工具一:
&#34;name&#34;: &#34;pdflatex&#34;, // 名称
&#34;command&#34;: &#34;pdflatex&#34;, // 命令
&#34;args&#34;: [ // 参数列表
&#34;-synctex=1&#34;,
&#34;-interaction=nonstopmode&#34;,
&#34;-file-line-error&#34;,
&#34;%DOCFILE%&#34;
]
},
// 编译工具二(以下省略)
],
&#34;latex-workshop.latex.recipes&#34;: [ // 编译方案列表
{ // 方案一:
&#34;name&#34;: &#34;pdflatex&#34;, // 名称
&#34;tools&#34;: [ // 使用的工具列表
&#34;pdflatex&#34;
]
},
// 方案二(以下省略)
],
}它们造成的影响是:一个名为pdflatex的编译方案将会在commands栏中出现

执行这个方案将使用一次名为pdflatex的编译工具,而使用这个工具相当于在终端执行含参命令
% pdflatex CURR_FILE.tex -synctex=1 -interaction=nonstopmode -file-line-error %DOCFILE%这样一来,插件就明确知道该如何编译了。现在再按下快捷键“cmd+opt+B”,插件将自动调用pdflatex引擎,以约定的方式编译出pdf文件。
接下来再来看几条锦上添花的配置。
{
// 默认的编译链方案为“首个”
// 可选项:first, lastUsed
&#34;latex-workshop.latex.recipe.default&#34;: &#34;first&#34;,
// 永不自动编译
// 可选项:onFileChange, onSave, never
&#34;latex-workshop.latex.autoBuild.run&#34;: &#34;never&#34;,
// 永不清理辅助文件
// 可选项:onBuilt, onFailed, never
&#34;latex-workshop.latex.autoClean.run&#34;: &#34;never&#34;,
// 自动填充
&#34;latex-workshop.intellisense.package.enabled&#34;: true,
// 反向定位
&#34;latex-workshop.view.pdf.internal.synctex.keybinding&#34;: &#34;double-click&#34;,
// 弹出error
&#34;latex-workshop.message.error.show&#34;: true,
// 弹出warning
&#34;latex-workshop.message.warning.show&#34;: true,
}这些关系都不大,可以随意尝试,也可以阅读插件的文档以探索更多可能。我猜测有些设置或许会影响编译速度,所以打算留个心思。另外,这么多注释其实是不必要的,只要悬停鼠标即可看到所有信息。
好了,现在是时候把完整版放出来了。
不过事先申明一下,我参考的是下面这位答主,然后按照自己的喜好进行了微调,比如把编译和清理都交给手动选择。
{
&#34;latex-workshop.latex.recipe.default&#34;: &#34;first&#34;, // use which recipe
&#34;latex-workshop.latex.autoBuild.run&#34;: &#34;never&#34;, // when auto build
&#34;latex-workshop.latex.autoClean.run&#34;: &#34;never&#34;, // when auto clean
&#34;latex-workshop.intellisense.package.enabled&#34;: true, // whether auto fill
&#34;latex-workshop.view.pdf.internal.synctex.keybinding&#34;: &#34;double-click&#34;, // how to reverse synctex
&#34;latex-workshop.message.error.show&#34;: true, // pop error
&#34;latex-workshop.message.warning.show&#34;: true, // pop warning
&#34;latex-workshop.latex.tools&#34;: [
{
&#34;name&#34;: &#34;xelatex&#34;,
&#34;command&#34;: &#34;xelatex&#34;,
&#34;args&#34;: [
&#34;-synctex=1&#34;,
&#34;-interaction=nonstopmode&#34;,
&#34;-file-line-error&#34;,
&#34;%DOCFILE%&#34;
]
},
{
&#34;name&#34;: &#34;pdflatex&#34;,
&#34;command&#34;: &#34;pdflatex&#34;,
&#34;args&#34;: [
&#34;-synctex=1&#34;,
&#34;-interaction=nonstopmode&#34;,
&#34;-file-line-error&#34;,
&#34;%DOCFILE%&#34;
]
},
{
&#34;name&#34;: &#34;bibtex&#34;,
&#34;command&#34;: &#34;bibtex&#34;,
&#34;args&#34;: [
&#34;%DOCFILE%&#34;
]
},
{
&#34;name&#34;: &#34;latexmk&#34;,
&#34;command&#34;: &#34;latexmk&#34;,
&#34;args&#34;: [
&#34;-synctex=1&#34;,
&#34;-interaction=nonstopmode&#34;,
&#34;-file-line-error&#34;,
&#34;-pdf&#34;,
&#34;-outdir=%OUTDIR%&#34;,
&#34;%DOCFILE%&#34;
]
},
],
&#34;latex-workshop.latex.recipes&#34;: [
{
&#34;name&#34;: &#34;xelatex&#34;,
&#34;tools&#34;: [
&#34;xelatex&#34;
]
},
{
&#34;name&#34;: &#34;pdflatex&#34;,
&#34;tools&#34;: [
&#34;pdflatex&#34;
]
},
{
&#34;name&#34;: &#34;bibtex&#34;,
&#34;tools&#34;: [
&#34;bibtex&#34;
]
},
{
&#34;name&#34;: &#34;latexmk&#34;,
&#34;tools&#34;: [
&#34;latexmk&#34;
]
},
{
&#34;name&#34;: &#34;xelatex -> bibtex -> xelatex*2&#34;,
&#34;tools&#34;: [
&#34;xelatex&#34;,
&#34;bibtex&#34;,
&#34;xelatex&#34;,
&#34;xelatex&#34;
]
},
{
&#34;name&#34;: &#34;pdflatex -> bibtex -> pdflatex*2&#34;,
&#34;tools&#34;: [
&#34;pdflatex&#34;,
&#34;bibtex&#34;,
&#34;pdflatex&#34;,
&#34;pdflatex&#34;
]
},
],
&#34;latex-workshop.latex.clean.fileTypes&#34;: [
&#34;*.aux&#34;,
&#34;*.bbl&#34;,
&#34;*.blg&#34;,
&#34;*.idx&#34;,
&#34;*.ind&#34;,
&#34;*.lof&#34;,
&#34;*.lot&#34;,
&#34;*.out&#34;,
&#34;*.toc&#34;,
&#34;*.acn&#34;,
&#34;*.acr&#34;,
&#34;*.alg&#34;,
&#34;*.glg&#34;,
&#34;*.glo&#34;,
&#34;*.gls&#34;,
&#34;*.ist&#34;,
&#34;*.fls&#34;,
&#34;*.log&#34;,
&#34;*.fdb_latexmk&#34;
],
}注意到有的方案里使用了四次工具,看起来很奇怪。这好像是因为(出于某种我尚不理解的原因)LaTeX需要二次编译才能调整好pdf中跟跳转有关的东西,例如目录、交叉引用、文献等,所以在插入文献后还要再用两次latex引擎。原则上你用一百次都可以,只是比较花时间。与此同时latexmk引擎又格外特殊,可以做到一次性完成所有工作,所以没有这种需要。
再补充一句,关于什么时候清理辅助文件、什么时候用什么工具链,这些设置对速度的影响要留个心思,未来需要性能的时候回过头来看看,我有空也会了解一下。总之,如果把vs code当作黑箱来用,复制粘贴不知从哪来的配置,那几乎肯定远远比不上专业人士打包的IDE黑箱。我喜欢的是vs code的自由,遇到特殊需求再回到IDE,那时候IDE就是我的提线木偶,而不是反过来。
好了好了,我不多扯了,现在只要把这些内容复制粘贴到settings文件中,一时半会就再也不用理它了。
如果复制完了,那么恭喜!现在编译实现了自动化,最后再复习一下常用操作
- 编译(cmd+opt+B)
- 定位(cmd+opt+J)
- 反向定位(cmd+click)
就可以用LaTeX写文章了。
第三方包
我前面推荐一次性下载,也是因为这个包管理我还没弄明白。我遇到了找不到包的问题,而且是很正规的包,这个还没有解决。但因为只是下着玩,所以我就先搁置这个问题了,只能祝你好运吧。
基本操作并不复杂,但LaTeX包的分发貌似不如python那样规范。
tlmgr install <package>
tlmgr uninstall <package>
tlmgr list更多关于自动和手动下载,可以参考wiki电子书(链接)3.1-3.2节。 编写第一个tex文件
基本框架如下,细节语法还请自学(为方便阅读,我一般会限制一下宽度):
% ----------------------------------------------------------------------
% MAX WIDTH 72|
% HALF WIDTH 36|
\documentclass[]{article}
% Document Classes:
% article, proc, minimal, report, book, slides
% Document Class Options:
% 10/11/12pt, a4paper, letterpaper,
% fleqn, leqno, one/two columns, one/twoside, ...
\usepackage[]{}
% Some of the Packages Distributed with LaTeX:
% doc, exscale, fontenc, ifthen, latexsym,
% makeidx, syntonly, inputenc
\pagestyle{plain}
% The Predefined Page Styles of LaTeX:
% plain, headings, empty
\author{Nemo}
\title{First \LaTeX{} File}
\date{2023}
\begin{document}
\maketitle
Say hi to \LaTeXe.
\end{document}编译后的效果:

可以尝试添加点实际内容:
\documentclass[]{article}
\usepackage[]{amsmath, xeCJK} % in distribution
\author{Nemo}
\title{First \LaTeX{} File}
\date{2023}
\begin{document}
\maketitle
\tableofcontents
\section{Schrödinger Equation}
\begin{equation*}
i \hbar \frac{\partial}{\partial t} \psi = H \psi
\end{equation*}
\section{前赤壁赋}
\begin{verse}
客亦知夫水与月乎?\\
逝者如斯,而未尝往也;\\
盈虚者如彼,而卒莫消长也。
\end{verse}
\end{document}编译后的效果:
 |
|