笔者在overleaf上编译文章一切正常,但上传文章到arxiv时出现类似于如下报错:
一般情况下观察arxiv的编译log,不通过的原因,很多时候都是由于某一行导入了啥package,引起的报错;但是如果没有任何一个具体的报错,只是告诉你XXX.sty not found
,那么很可能是编译器版本的问题。
如上述这个报错,主要是由于arxiv 的latex编译器版本过低,导致tabularray根本无法在内置环境中找到导致的。
截止到目前,arxiv使用的latex编译器版本为2020版,但是像overleaf默认使用的都是最2022新版的tex,这就会导致很多在overleaf上自己能够导入编译成功的package,在arxiv上却not found
。
具体参考overleaf 官方给出的checklist.
解决方案
这里给出两种解决方案:
1. 改用老版本的package
最直接的解决方案,自然就是把一些太新的package注释掉,重新上传。
如果当前的pdf排版依赖于这些package,那么就得考虑用一些老版本的包代替了。
例如,如果你用了
tabularray
排版的表格,那么可以将其替换为tabular
,可以实现接近的排版效果。
按照笔者的经验,一些新的package,肯定能够找到能够用作替代的老版本packages。
只不过这个操作往往非常耗费时间;而且由于向下兼容,那些新package一两行命令能够实现的功能,用一些老packages就会绕很大的圈子,非常麻烦!
优点:
- 从源头解决问题
缺点:
- 极度花费时间
- 不能做到完全地平替很多新pakcages的功能
2. 下载源码
第二种方法更为省力:将那些太新的package的源码(.sty
)下载。然后在项目里倒入本地的.sty
文件。
例如,去从CTAN下载
tabularray.sty
,将文件放到项目目录下,然后再\usepackage{tabularray}
。
但是这种方法也是治标不治本,也并不是所有情况都能奏效。
而且很容易出现,你下载了A包,它依赖于B包;你下载了B包,它又依赖于C、D包。。。然后你可能还得理清楚这些package之间的版本关系。。。
但在某些情况下,比方说依赖的package很少,这还是一个非常有用的方法。
优点:
- 快速、省力
缺点:
- 治标不治本
- 容易出现“连环依赖”,和版本冲突
一些建议
如果你有计划把项目上传arxiv的话,这里给出一些建议:
-
先去官网检查一下arxiv最新的tex编译器的版本是啥(可以去arxiv先尝试随便上传一个文件,看看编译的log)。
-
将自己的本地环境,或者overleaf编译器设置为和arxiv一致,以防后续发生不兼容的问题。
-
在上传arxiv之前,把项目里导入过的一些没用的package全部注释掉,以最大程度降低上传出错的可能性。
-
保持自己tex源码整洁。。至少能够分得清哪些packages是自己后面加的,哪些是conference template本来就自带的(不然就得像笔者一样,一个个试)。。。
参考
- https://github.com/tectonic-typesetting/tectonic/issues/871
- Adding .sty files into tex