LaTeX on Server

1 minute read

Published:

文中提到的问题已经解决!

今天尝试在课题组服务器上使用安装好的LaTeX环境。

通过module avail查看可用的模块,发现有TeXLive2021,于是加载模块:module load TeXLive2021

然后在/home/username下创建一个test.tex文件,内容如下:

\documentclass{article}
\begin{document}
First document. This is a simple example, with no 
extra parameters or packages included.
\end{document}

然后在命令行中输入pdflatex test.tex,即可生成test.pdf文件。

为了建立完整的工作流,接下来需要从Overleaf上下载项目,然后上传到服务器上,再编译生成PDF文件。

从Overleaf下载项目

在Overleaf上,点击Project,然后点击Download,选择Download project as zip,即可下载项目。

上传项目到服务器

通过vscode的Remote-SSH插件,可以很方便地将本地的项目上传到服务器上。在此之前先解压下载的文件。

编译生成PDF文件

在服务器上,进入项目文件夹,然后输入pdflatex main.tex,即可生成main.pdf文件。但返回了一个错误:

OK, entering \batchmode

kpathsea: Running mktexpk --mfmode / --bdpi 600 --mag 1+123/600 --dpi 723 uniyou7a
mktexpk: don't know how to create bitmap font for uniyou7a.
mktexpk: perhaps uniyou7a is missing from the map file.
kpathsea: Appending font creation commands to missfont.log.

这是因为缺少字体文件。

另外尝试了xelatex main.tex,也是报错:

LaTeX Warning: Reference `eq:attention' on page 5 undefined on input line 80.

! Undefined control sequence.
l.98 ...\ln{\Big[\frac{\pi(x)}{p(x)}\Big]} = \lang
                                                   \ln{\frac{\pi}{p}} \rang ...

这是因为缺少amsmath包,需要在main.tex文件中添加\usepackage{amsmath}。但main.tex中已经有\usepackage{amsmath},所以应该是缺少其他包。

在Overleaf上编译没有问题,而在服务器上编译输出的pdf文件中,公式和编号都正常,但目录显示不出来。

下面是main.tex包含的包:

\usepackage[authoryear,list, math]{Style/artratex}% document settings
\usepackage{amsmath,amssymb}
\usepackage{mathrsfs} % added by Paul for special meta dataset of datasets letter D
\usepackage[dvipsnames]{xcolor}
\usepackage{multirow}
\usepackage{graphicx}

目录显示不出来的问题,是因为缺少tocloft包,需要在main.tex文件中添加\usepackage{tocloft}

虽然在Overleaf上没有加这个包也能正常显示目录,但我仍然添加了,然后编译,目录显示了,但格式不符合要求。(标题字体太大)

为什么Overleaf上不需要这个包,而服务器上需要呢?答案可能是Overleaf上的tocloft包版本不同,或者Overleaf上的tocloft包已经包含了其他包。

另外,其实不排除我使用的编译器不同,Overleaf上使用的是xelatex,而服务器上使用的是pdflatex

为了解决编译器不同的问题,我安装了LaTeX-in-VSCode插件,它可以给我提供许多编译器的快捷使用方式,但插件无法正常工作,原因是TexLive不在系统路径上,通过which pdflatex查看,发现pdflatex/usr/local/texlive/2021/bin/x86_64-linux/pdflatex,所以需要将/usr/local/texlive/2021/bin/x86_64-linux添加到系统路径上。所用命令是export PATH=$PATH:/usr/local/texlive/2021/bin/x86_64-linux

但没有成功使用这个插件,为了不mess up with PATH,我决定放弃这个插件。

实际上,我还是messed up with PATH,一度导致我的ls, cd之类的命令都无法使用,但export之类的还是可以的,这才让我意识到这些命令的级别不同(export显然更底层), 最后我通过 usr/bin/vim的方式调用vim,成功修改了PATH。

从ucas-thesis的README.md中知道,如果出现了! Undefined control sequence.错误,应该是TexLive版本过低。但我的版本是是TeXLive2021,应该是最新的版本了。

回顾Overleaf上的编译

我重新检查了Overleaf,发现那边也有报错,但是编译出来的PDF文件中,公式和编号都正常,目录也显示出来了。

报错主要是Undefined control sequence,主要是\braket 和\lang \rang命令,可以替换成\left\langle \right\rangle 和\left\lvert \right\rvert。

为了避免去修改,可以在main.tex文件中添加:

\newcommand{\braket}[1]{\left\langle #1 \right\rangle}

就解决了这个问题。

在Overleaf上使用的编译设置是Texlive 2022, XeLaTeX。于是我修改为Texlive 2021, XeLaTeX,编译仍然成功了,说明不是编译器的问题。


目前暂时没有找到很好的方法解决目录消失的问题,目前的效果如图:

空荡荡的目录

正常的效果应是:

正常效果

不过其他方面(包括编号)均完全正常,因此初步完成了本文的目标:在服务器上使用安装好的TexLive环境。

目录的话……之后再放到Overleaf跑一次罢。


2023-04-09 16:11:53

Update:问题解决

今天重新在服务器上load了插件,发现插件提供了这样一个长命令:

xelatex -no-pdf -synctex=1 -interaction=nonstopmode -file-line-error -recorder  "/home/osgood/new_thesis/Thesis.tex"

我果断运行了这段代码,然后发现的确no-pdf,于是我继续再运行了一遍xelatex Thesis.tex,发现得到的pdf有正常的目录!我据此认为第一步的长命令有很大的作用。

但插件仍然无法完全运行,因为会返回错误

xelatex: /lib64/libz.so.1: version `ZLIB_1.2.9' not found (required by /cm/shared/apps/anaconda3-2021.11/lib/./libpng16.so.16)

但这对我来说不是问题了。本文提到的困难完美解决。

接下来就是把这个编译作为脚本自动执行即可。(#TODO 参考make的使用)