
如果你也是那种经常泡在共享服务器上干活的人一定遇到过这种尴尬管理员只给开了一个普通账号装什么软件都得找他输密码偏偏写论文要用的 LaTeX 套装服务器上要么没装要么版本老得连\documentclass{article}都报错。这篇文章记录的就是我在这种“没有 sudo、没有 root、连系统级目录都碰不了”的环境下把一整套 TeX Live 装进自己家目录的完整折腾过程包含安装思路、profile 配置、环境变量、中文字体、宏包管理以及一堆实测踩坑总结覆盖 Linux 共享服务器、高性能计算节点、公司开发机等常见的无管理员权限场景希望能给你省几个小时的蛋疼时间。1. 为什么要在没有 sudo 的机器上折腾 TeX Live1.1 典型场景与需求画像先说清楚这类需求都出现在哪些地方方便你对号入座。最常见的是学校或者研究院的高性能计算集群你用 SSH 登上登录节点手头只有普通用户权限但写课程论文、期刊投稿、做学术海报都得用 LaTeX。第二种场景是公司内部的开发服务器环境统一由运维管控你提工单装一个 texlive-full人家运维可能回复你“请使用我们统一提供的容器镜像”。第三种场景更隐蔽有些老旧的软件运行节点系统是 CentOS 7 甚至更早包管理器里自带的 texlive 还是 2012 年的古早版本ctex宏包和现代字体支持基本等于没有不用新版本根本没法干活。这些场景有几个共同点第一你不能往/usr、/opt这些系统目录里写东西因为权限不够第二你手头的账号虽然是普通用户但是 home 目录容量通常够用一般有几 GB 到几十 GB 的配额第三你至少能访问外网不管是走 HTTP 还是 HTTPS能下载文件就行。只要满足这三点就可以继续往下看了。1.2 三种安装路线的横向对比面对无 sudo 的环境常规选择其实就三条路系统包管理器、官方 install-tl 脚本、容器化方案。我把它们在共享服务器场景下的表现整理成了一张对比表方便你直观感受差别方案是否需要 sudo版本新旧目录受控程度日常更新推荐度apt/dnf/yum 安装 texlive需要通常落后多年全局影响其他用户跟随系统不可控不推荐install-tl 脚本装到 home不需要官方最新版本完全自控tlmgr update随时可升强烈推荐Docker/Singularity 容器视镜像而定可以很新映射目录稍麻烦重建镜像或拉新镜像看场景系统包管理器这条路基本可以放弃且不说你需要 sudo即使有 sudo系统仓库里的 TeX Live 经常被拆成几十个包版本也是冻结的遇到宏包升级问题只能干瞪眼。容器方案在某些集群里可以玩但共享登录节点上 GPU 计算节点不一定允许跑容器而且容器里访问 home 目录的写权限、字体缓存、进程通信都会有一堆琐碎问题。相比之下install-tl 脚本把一切装到$HOME下不碰系统目录不用 sudo版本最新后续还能自己用tlmgr管理宏包是最适合共享服务器个人环境的路子。1.3 为什么官方 install-tl 可以做到“无 sudo”这里解释一个很多初次接触的人会困惑的问题为什么系统软件通常都要 root 权限TeX Live 却可以不用核心原因是 TeX Live 的目录设计从一开始就支持“单用户安装”。传统的 Unix 软件默认把可执行文件丢到/usr/bin把库文件丢到/usr/lib把数据丢到/usr/share这些目录只有 root 能写所以装软件要 sudo。但 TeX Live 的安装器允许你通过配置文件把全部内容重定向到 home 下的任意目录可执行文件、宏包、字体映射、配置缓存全部放在同一个根目录下互相之间用相对路径找到彼此。实际安装时你要做的事就是告诉安装器三个关键信息主目录放在哪选择哪一套宏包集合以及要不要自动修改系统的 shell 配置文件。因为最后一项在无 sudo 环境下也做不了所以我们会显式关掉自动修改等安装完手动把环境变量写进~/.bashrc。整件事的本质就是把一个本来“面向系统”的软件变成“面向用户”的软件这在 TeX Live 里是官方支持的用法不是破解也不是 hack。2. 安装前的准备工作与核心原理解析2.1 你要安装哪些内容scheme 的选择逻辑TeX Live 并不是一个单一体它由引擎pdfTeX、XeTeX、LuaTeX、几千个宏包、字体、文档和帮助文件组成。第一次跑安装器最怕的就是“闭眼 full”。scheme-full会下载超过 6 GB 的内容在共享服务器那种时不时的网络抖动下装到一半断线会非常痛苦而且如果你 home 目录配额只有 10 GB一个 full 装完基本就爆了。我建议第一次先装scheme-small或者scheme-medium。small包含基础引擎和 LaTeX 核心日常写英文短文档完全够用medium会在 small 基础上加入常用宏包包括多语言支持、常见文档类、一部分字体体积在 1 GB 到 2 GB 之间。真正到了期刊模板要求某个冷门宏包的时候再手动用tlmgr install补装速度反而比自己硬啃全量安装快得多。2.2 下载 install-tl 脚本并校验第一步当然是把安装器弄到本地。TeX Live 官网的获取页面提供install-tl-unx.tar.gz这个压缩包里面是一个约 5 MB 的 Perl 脚本和一组配置文件。下载命令很简单cd ~/下载目录 wget https://mirror.ctan.org/systems/texlive/tlnet/install-tl-unx.tar.gz文件很小几秒钟就完事。但下载完不能直接解压强烈建议先做一下校验毕竟这个脚本之后要在你的账号下执行如果被中间人篡改过等于把账号安全拱手送人。校验方式是比对 SHA-512 哈希值sha512sum install-tl-unx.tar.gz官网的 acquite 页面会列出当前版本的哈希值两个值一致再继续。如果网络实在连不上mirror.ctan.org也可以从清华或中科大的镜像站下载路径是/CTAN/systems/texlive/tlnet/install-tl-unx.tar.gz下载完同样校验。这一步不要省尤其是你在公共网络环境下操作的时候。解压命令也很常规tar -xzf install-tl-unx.tar.gz cd install-tl-*进入目录后你就站在了安装器的门口。此时建议先用perl install-tl --help看一眼支持的参数确认一下当前 Perl 版本没问题。绝大多数 Linux 发行版都自带 Perl如果你遇到的是连 Perl 都没有的最小化系统那这条路就走不通得先想办法解决 Perl 的问题但那种情况在你连 sudo 都没有的共享服务器上几乎不会出现。2.3 镜像源设置在无权限环境下的意义安装 TeX Live 最影响体验的就是网络。官方默认的 CTAN 镜像分发机制会自动选一个距离你“较近”的镜像但这个“较近”在服务器环境里常常判断不准有时候它会给你选到欧洲去速度就非常感人。手动指定一个你实测下载速度快的镜像是减少安装失败概率的关键操作。我在这次安装里用的是清华 TUNA 的 TeX Live 镜像地址是https://mirrors.tuna.tsinghua.edu.cn/CTAN/systems/texlive/tlnet中科大的 USTC 镜像也可以https://mirrors.ustc.edu.cn/CTAN/systems/texlive/tlnet阿里云的镜像结构略有不同但同样有效。选镜像的原则很简单先curl -I探一下连通性和响应时间再用wget下载一个镜像上的小文件测速哪个快就用哪个。这个步骤一定要在做完 profile 配置之前做因为安装脚本在执行时会把镜像地址当成一个参数传进去换镜像意味着重新跑安装命令如果中途换源之前下载的部分文件可能作废。2.4 提前规划目录结构与磁盘配额动手之前先检查 home 目录的剩余空间和配额限制df -h ~ du -sh ~如果你有独立的磁盘配额可以用quota -s之类的命令看详细限制。规划目录时我给一个可以稳定复制的结构~/texlive/2024 # 主安装目录包含 bin、texmf-dist 等 ~/texlive/texmf-local # 本地扩展宏包目录 ~/.texlive2024/texmf-var # 运行时可变文件缓存、updmap 输出 ~/.texlive2024/texmf-config # 当前用户的配置文件 ~/texmf # 个人宏包目录对应 TEXMFHOME这样分的逻辑是主程序放~/texlive下便于一眼找到缓存和配置放~/.texlive2024这种隐藏目录里避免污染家目录顶层个人宏包单独放~/texmf以后写自定义.sty文件可以直接丢进去。整个安装完成后你备份环境时只需要打包这几个目录非常干净。3. 用 install-tl 实现无 sudo 安装的完整流程3.1 交互式 vs 非交互式我建议先写 profileinstall-tl 支持两种安装方式纯交互式的文本界面以及通过 profile 文件批量设置的非交互模式。交互式会让你回答一堆问题比如选 scheme、选目录、是否调整 PATH 等在 SSH 终端里可以操作但输错一个选项就得来回翻菜单效率很低。非交互模式则是一次性把选项写进一个文本文件执行perl install-tl -profiletexlive.profile脚本就自动跑完了特别适合后面还要给同事复用、或者过几个月重装一遍的场景。我个人的建议是第一次接触时也不要硬啃交互式直接写 profile 文件。你只需要理解文件里每个变量是什么意思就能完全掌控安装过程。下面我先给出一个可以直接改的完整 profile再逐行拆解它为什么要这么写。3.2 profile 文件逐项拆解与踩坑点这是一个我在无 sudo 环境下实际用过的 profile 文件路径写成你的真实用户主目录不要照抄usernameselected_scheme scheme-small TEXDIR /home/username/texlive/2024 TEXMFLOCAL /home/username/texlive/texmf-local TEXMFSYSCONFIG /home/username/texlive/2024/texmf-config TEXMFSYSVAR /home/username/texlive/2024/texmf-var TEXMFCONFIG /home/username/.texlive2024/texmf-config TEXMFVAR /home/username/.texlive2024/texmf-var TEXMFHOME /home/username/texmf binary_x86_64-linux 1 instopt_adjustpath 0 instopt_adjustrepo 0 tlpdbopt_autobackup 1 tlpdbopt_install_docfiles 0 tlpdbopt_install_srcfiles 0逐项解释一下关键变量。selected_scheme决定了宏包集合这里选了scheme-small如果你想用 medium就改成scheme-medium。TEXDIR是 TeX Live 的主安装目录所有二进制文件、宏包、引擎、字体映射都在它下面必须写成绝对路径并且确保该路径的父目录存在。TEXMFLOCAL是本地管理员宏包目录普通用户装的东西放在这里不会被tlmgr update --all删掉。TEXMFSYSCONFIG和TEXMFSYSVAR本意是系统级配置和变量目录在无 sudo 场景下没有实际系统级的意义但我建议仍然把它们放在TEXDIR下保持相对独立。TEXMFCONFIG和TEXMFVAR则放到~/.texlive2024下这样日常运行时的缓存文件不会占用~/texlive的磁盘空间备份主程序目录时也更轻量。TEXMFHOME就是你个人的宏包仓库以后自己下载的.sty文件、本地自定义类文件都可以丢进这个目录。instopt_adjustpath 1表示自动修改 shell 配置文件这里必须显式写成0因为无 sudo 环境不允许写系统级文件而且自动改的往往是/etc/profile.d之类的全局路径普通用户根本没权限。instopt_adjustrepo同样设为0避免安装器尝试修改 tlmgr 的默认仓库到镜像地址。最后两个tlpdbopt_install_docfiles和tlpdbopt_install_srcfiles我建议设成0也就是不装文档和源码文件这对磁盘紧张的服务器很友好文档随时可以以后用tlmgr install单独补。还要提醒一个容易被忽略的坑TEXDIR路径里如果包含版本号比如/2024一定要和你知道的发行年份对应因为安装器会根据这个路径组织目录结构写错年份会导致后续kpsewhich查找路径错乱。另外TEXMFLOCAL不要和TEXDIR重叠否则tlmgr会报目录冲突。3.3 执行安装tmux 防断线 镜像指定profile 文件配好后执行安装的命令如下nohup perl install-tl -profiletexlive.profile \ -repository https://mirrors.tuna.tsinghua.edu.cn/CTAN/systems/texlive/tlnet \ install.log 21 如果你所在的集群有tmux或者screen我更建议先用tmux new -s tex起一个会话再在会话里跑安装命令这样即使 SSH 断了安装进程也不会被挂断。没有 tmux 就用nohup然后定期tail -f install.log看进度。注意命令里同时传入了-profile和-repository前者控制目录和方案后者指定镜像源两者可以同时使用。安装过程不是一直有滚动日志的有时会卡在某个包下载上几分钟不动这时候不要急先看install.log里最后几行确认一下是在下载大文件还是真的卡死了。我见过不少人是看到日志五分钟没变就 CtrlC 重来的结果前面下载好的缓存全浪费了。另外安装器在下载过程中也会在~/.texlive2024下生成临时缓存装到一半失败也不是世界末日重新跑同样的命令会跳过已下载的部分这点设计得非常贴心。3.4 环境变量配置PATH、MANPATH、INFOPATH安装完成没有任何报错后激动归激动先别急着打开终端敲xelatex。此时系统还找不到这些命令需要手动把环境变量加进去。打开~/.bashrc在文件末尾追加export PATH$HOME/texlive/2024/bin/x86_64-linux:$PATH export MANPATH$HOME/texlive/2024/texmf-dist/doc/man:$MANPATH export INFOPATH$HOME/texlive/2024/texmf-dist/doc/info:$INFOPATH然后执行source ~/.bashrc这里的路径x86_64-linux是 Linux x86_64 架构下的 bin 目录名称如果你的是 ARM 机器对应目录会叫aarch64-linux。在写 PATH 时我特意把 TeX Live 的 bin 目录放在最前面保证当你输入latex时优先命中这个目录里的新版命令而不是系统自带的旧版本。这就是我前面提到过的“无 sudo 也能实现版本隔离”的核心操作。注意一个细节MANPATH里如果原来的变量为空直接拼接可能导致冒号开头语法上没问题不要慌。还有TEXMFHOME这个变量它指向个人宏包目录通常不需要单独设置因为 TeX Live 安装器会把它的默认值编译进texmf.cnf但如果你发现自己写的自定义宏包找不到可以在.bashrc里显式加一句export TEXMFHOME$HOME/texmf。3.5 安装完成后的打怪验证环境变量配置完验证安装最直接的方式是依次执行which xelatex which pdflatex which tlmgr tlmgr --version如果which xelatex输出的路径是/home/username/texlive/2024/bin/x86_64-linux/xelatex说明 PATH 生效了。然后再写一个最小的文档验证编译链路是否正常。创建一个测试文件test.tex内容就四行\documentclass{article} \begin{document} Hello, TeX Live! \end{document}分别编译一下pdflatex test.tex xelatex test.tex两个命令都能顺利生成 PDF没有报 undefined control sequence 这类错误说明安装这关过了。如果这一步失败不要急着怀疑安装有问题先看报错信息里有没有/home/username/texlive/...字样的路径有就说明环境变量已经生效问题多半出在宏包或者字体后面章节会细说。4. 无 sudo 环境下的日常配置与宏包管理4.1 tlmgr普通用户也能轻松管理宏包装好 TeX Live 只是第一步日常写文档最大的需求其实是“缺了某个宏包怎么办”。在有 sudo 的环境里你可能习惯apt install texlive-lang-chinese但无 sudo 环境里你的包管理器就是tlmgr。它工作在自己的家目录里不需要 root也不需要 sudo。查看当前仓库配置tlmgr option repository如果你安装时指定了镜像这里应该输出那个镜像地址。想换源也是同样的命令tlmgr option repository https://mirrors.ustc.edu.cn/CTAN/systems/texlive/tlnet安装宏包tlmgr install ctex tlmgr install subfiles tlmgr install footnotebackref升级全部宏包tlmgr update --all不过我不建议一上来就update --all尤其是你在服务器上用了一个新装的 TeX Live仓库版本和本地版本有差异时一次大更新可能触发部分宏包兼容问题。更稳的做法是先tlmgr update --list看有哪些包需要更新再分批次更新。tlmgr默认会对每个更新包做备份存到tlpkg/backups目录如果某个宏包更新后出问题可以用tlmgr restore 包名回滚。4.2 中文字体配置没有 root 照样能排版中文无 sudo 环境下最容易被卡住的就是中文字体。系统里fc-list :langzh查不到中文字体那 XeLaTeX 编译中文文档时就会爆出一堆 font-not-found 错误。解决思路是在用户目录建字体目录放一套中文字体然后刷新字体缓存。第一步建立用户级字体目录mkdir -p ~/.fonts第二步把字体文件丢进去。如果你手头有思源宋体、思源黑体这类开源中文字体直接拷贝SourceHanSerifSC-Regular.otf到~/.fonts。如果在服务器上没有 GUI可以从镜像站点下载字体压缩包解压后同样放到这个目录。第三步刷新字体缓存fc-cache -fv ~/.fonts fc-list :langzh-cn刷新后如果能列出中文字体说明字体系统已经识别。这段时间很容易踩的坑是fc-cache命令在某些系统上只刷新系统目录需要加上~/.fonts参数否则会摸不着头脑。然后在 LaTeX 文档里使用ctex宏包\documentclass[UTF8]{ctexart} \setCJKmainfont{Noto Serif CJK SC} \begin{document} 你好中文排版。 \end{document}这里\setCJKmainfont里填的字体名要和fc-list :langzh-cn输出的一致我示例里的Noto Serif CJK SC是思源宋体的常见名称如果你装的是别的字体要把名字改成实际的 Family 名。用xelatex编译正常生成 PDF 就说明字体链路通了。4.3 编辑器与编译链路的配合服务器上装好 TeX Live 后你在本机远程编写.tex文件时通常用 VSCode 的 Remote-SSH 连上去再配合 LaTeX Workshop 插件。这样你编辑的仍然是服务器上的文件编译也走服务器上的 TeX Live完全不需要本地再装一套发行版这对统一论文环境非常有帮助。VSCode 的 LaTeX Workshop 默认找latexmk但无 sudo 环境下更推荐直接配一个 XeLaTeX 的方案。在.vscode/settings.json里这样写{ latex-workshop.latex.recipes: [ { name: xelatex, tools: [xelatex] } ], latex-workshop.latex.tools: [ { name: xelatex, command: xelatex, args: [ -synctex1, -interactionnonstopmode, -file-line-error, %DOC% ] } ] }如果文档需要交叉引用和参考文献可以加一道 latexmk 配方把命令改成latexmk -xelatex -synctex1 -interactionnonstopmode -file-line-error %DOC%。这样你按 CtrlS 自动编译双击 PDF 还能从源码跳转体验非常接近本地环境。4.4 常用包装与自定义 texmf 树日常写文档还会遇到一些非标准的宏包比如某个期刊编辑部给的.cls文件或.sty文件。这些宏包最好不要一股脑丢进当前目录里因为时间长了目录会非常乱而且换了项目还得重新拷贝。更规范的做法是丢进TEXMFHOME指向的~/texmf目录。具体目录结构是~/texmf/tex/latex/jarticle/jarticle.cls ~/texmf/tex/latex/mycommon/mystyle.sty存放后执行mktexlsr ~/texmf或者直接跑kpsewhich jarticle.cls验证一下能不能搜到。这个搜索逻辑对没配置过的人有点抽象简单理解就是 TeX 会把TEXMFHOME下的路径当成一个宏包仓库把自己的.sty文件和.cls文件往里一丢再也不用关心项目文件夹里少了哪个文件。5. 常见问题与排查技巧实录5.1 网络导致的安装中断共享服务器的网络稳定性通常一般安装过程中断线是家常便饭。如果你发现 install-tl 跑到一半卡住不动或者日志里冒出一堆Transfer aborted、Connection reset第一反应不是从头再来而是换个更稳的镜像。可以先执行curl -I https://mirrors.tuna.tsinghua.edu.cn/CTAN/systems/texlive/tlnet/确认连通性然后把-repository参数换成这个镜像地址重新跑。install-tl 有断点续传的概念但不同版本细节有差异别指望百分之百续上如果重新跑还是从某个大包开始下载你也不能怪它。好在 TeX Live 每个包都是独立压缩文件已经下载好的包不会重复下载所以多数情况下第二次跑会明显快很多。5.2 命令找不到或版本混淆刚配置好环境变量时最容易遇到的问题就是执行xelatex提示command not found。遇到这种情况先别怀疑安装失败顺序检查三件事第一echo $PATH看里面是否包含~/texlive/2024/bin/x86_64-linux第二确认是否还没有source ~/.bashrc第三如果 source 了还不行用hash -r清理一下 bash 的命令路径缓存因为 bash 会把老的找不到的命令缓存住。还有一种更隐蔽的情况是系统自带了旧版 TeX LivePATH 里系统路径排在前面导致你调用的其实是旧版本。解决办法我在前面强调过把 TeX Live 的 bin 目录放在 PATH 最前面再执行which xelatex如果显示的还是/usr/bin/xelatex说明你 PATH 顺序改错了重新编辑~/.bashrc确保 TeX Live 在前。5.3 宏包缺失与 kpsewhich 排查法编译时最常见的报错是! LaTeX Error: File xxx.sty not found.不要慌张也不要满网搜 xxx.sty直接用官方工具来查。kpsewhich可以告诉你某个文件是否在搜索路径里以及它最终命中哪个文件kpsewhich xxx.sty如果输出为空说明本地确实没有。然后用tlmgr搜索包含这个宏包的集合tlmgr search --global xxx它会列出一堆包含相关文件的包名你再tlmgr install对应的包即可。装完之后再用kpsewhich验证确认路径正确再重新编译。这种排查链路比在论坛里瞎找某个.sty文件的下载地址要可靠得多。5.4 字体相关的坑无 sudo 环境下的字体问题主要集中在两点。一是fc-cache刷新后fc-list :langzh还是看不到字体这时候要检查是不是把字体文件放到了~/.local/share/fonts而不是~/.fonts。不同发行版对这个目录的识别优先级不同最保险的办法是两个目录都建都放一份刷新缓存后肯定能识别。二是 XeLaTeX 编译中文文档报fontspec error: font-not-found这种问题通常出现在ctex宏包默认字体和系统实际字体不一致的情况下。解决办法是在文档开头显式指定中文字体\setCJKmainfont{Noto Serif CJK SC}前提是fc-list :langzh-cn能查到该字体名。如果你压根没装中文字体那优先解决字体安装的问题别在 LaTeX 层面反复折腾。5.5 磁盘配额爆掉的处理共享服务器给普通用户的磁盘配额通常不会太大如果 home 空间快满了TeX Live 的体积马上会变成压力。安装前先规划好用scheme-small或scheme-medium安装后定期清理宏包文档和源码文件。如果已经装了文档可以这样删tlmgr option docfiles 0 tlmgr option srcfiles 0不过这个只影响后续安装之前已有的文档需要手动清理进入~/texlive/2024/texmf-dist/doc和~/texlive/2024/texmf-dist/source把不用的内容删掉。还有一个思路是把整个 TeX Live 目录打包迁移比如tar -czf texlive_backup.tar.gz ~/texlive scp到别的机器新机器解压后重新配置环境变量即可不用重新安装。6. 折腾完之后我的一些体会这套流程我前前后后在四五台不同配置的服务器上执行过最深的感受是真正决定安装成败的往往不是安装器本身而是你对自己用户目录结构的理解以及提前规划和隔离环境的意识。有一个小技巧想分享给你如果你经常需要在多台服务器之间切换可以把上面这份 profile 文件和一段环境变量配置脚本存到自己的 dotfiles 仓库里新服务器上只需要下载 install-tl、把 profile 里的用户名路径替换掉、跑一遍安装整个过程十分钟内就能完成。后续每次写文档缺宏包直接用tlmgr install解决基本不会再被权限问题卡住。LaTeX 这条路一旦在无 sudo 环境里走通你在共享服务器上写论文、做排版、写报告的自由度会提升一个档次。希望你这次也能一次装通少踩几个我不小心踩过的坑。