使用TexLive有一段时间了,从2015到2017,一直运行如常。
最近,想把以前的文档重新编译,却发现不能正常运行,费了好大一番工夫,才终于修复了这个bug,记录如下。
问题描述:编译一个简单的 *.tex 文件时,经常报告系统文件找不到的错误,无论是 pdflatex,latex,xelatex 命令都有类似的错误。
test.tex 全文:
% test.tex documentclass{article} egin{document} hello LaTeX! end{document}
用 pdflatex 命令编译报错:
[...]$ pdflatex test.tex This is pdfTeX, Version 3.14159265-2.6-1.40.18 (TeX Live 2017) (preloaded format=pdflatex) restricted write18 enabled. kpathsea: Running mktexfmt pdflatex.fmt mktexfmt: mktexfmt is using the following fmtutil.cnf files (in precedence order): mktexfmt: /usr/local/texlive/2017/texmf-dist/web2c/fmtutil.cnf mktexfmt: mktexfmt is using the following fmtutil.cnf file for writing changes: mktexfmt: /home/She/.texlive2017/texmf-config/web2c/fmtutil.cnf mktexfmt [INFO]: writing formats under /home/She/.texlive2017/texmf-var/web2c mktexfmt [INFO]: --- remaking pdflatex with pdftex mktexfmt: running `pdftex -ini -jobname=pdflatex -progname=pdflatex -translate-file=cp227.tcx *pdflatex.ini' ... This is pdfTeX, Version 3.14159265-2.6-1.40.18 (TeX Live 2017) (INITEX) restricted write18 enabled. (/usr/local/texlive/2017/texmf-dist/web2c/cp227.tcx) entering extended mode (/usr/local/texlive/2017/texmf-dist/tex/latex/latexconfig/pdflatex.ini ! I can't find file `pdftexconfig.tex'. l.2 input pdftexconfig.tex (Press Enter to retry, or Control-D to exit) Please type another input file name: ! Emergency stop. l.2 input pdftexconfig.tex No pages of output. Transcript written on pdflatex.log. mktexfmt [ERROR]: running `pdftex -ini -jobname=pdflatex -progname=pdflatex -translate-file=cp227.tcx *pdflatex.ini >&2 </dev/null' return status 1 mktexfmt [ERROR]: return error due to options --strict mktexfmt [INFO]: Disabled formats: 6 mktexfmt [INFO]: Not selected formats: 43 mktexfmt [INFO]: Failed to build: 1 (pdftex/pdflatex) mktexfmt [INFO]: Total formats: 50 mktexfmt [INFO]: exiting with status 1 I can't find the format file `pdflatex.fmt'!
实际上,上述文件 pdftexconfig.tex 和 pdflatex.fmt 是存在的,它们分别位于 /usr/local/texlive/2017/texmf-dist/tex/generic/tex-ini-files/pdftexconfig.tex 和 /usr/local/texlive/2017/texmf-var/web2c/pdftex/pdflatex.fmt 。
推断这是由于该文件并不在搜索路径内,以致于无法找到它们。接下来就是修复搜索路径的问题。
此时,TexLive 2017 的系统环境变量为
[...]$ cat /etc/profile.d/texlive2017.sh #!/bin/bash # setting for TexLive 2017 environment variables, edit by She export TEXMF=/usr/local/texlive/2017/texmf-dist export PATH=$PATH:$HOME/.local/bin:$HOME/bin:/usr/local/texlive/2017/bin/x86_64-linux export MANPATH=/usr/local/texlive/2017/texmf-dist/doc/man:$MANPATH export INFOPATH=/usr/local/texlive/2017/texmf-dist/doc/info:$INFOPATH export TEXINPUTS=/usr/local/texlive/2017/texmf-dist/tex/latex/latexconfig
相应地,可以看到 kpsewhich 命令并不能搜索到相应的系统文件(这里以 minted.sty 文件为例),而且 TexLive 2017 下 tlmgr 工具的参数设置如下,红色带下划线的文字是我添加的注释:
[...]$ kpsewhich pdflatex.ini /usr/local/texlive/2017/texmf-dist/tex/latex/latexconfig/pdflatex.ini [...]$ kpsewhich --show-path=.sty /usr/local/texlive/2017/texmf-dist/tex/latex/latexconfig [...]$ kpsewhich minted.sty # 这个命令没有返回结果,说明 kpsewhich 的搜索路径设置不当
[...]$
[...]$ tlmgr conf =========================== version information ========================== tlmgr revision 44836 (2017-07-18 01:59:48 +0200) tlmgr using installation: /usr/local/texlive/2017 TeX Live (http://tug.org/texlive) version 2017 ==================== executables found by searching PATH ================= PATH: /usr/local/texlive/2017/bin/x86_64-linux:/usr/lib64/qt-3.3/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:/opt/pgi/linux86-64/17.4/bin:/home/She/.local/bin:/home/She/bin:/usr/local/texlive/2017/bin/x86_64-linux:/opt/pgi/linux86-64/17.4/bin:/home/She/.local/bin:/home/She/bin:/usr/local/texlive/2017/bin/x86_64-linux kpsewhich: /usr/local/texlive/2017/bin/x86_64-linux/kpsewhich updmap: /usr/local/texlive/2017/bin/x86_64-linux/updmap fmtutil: /usr/local/texlive/2017/bin/x86_64-linux/fmtutil tlmgr: /usr/local/texlive/2017/bin/x86_64-linux/tlmgr tex: /usr/local/texlive/2017/bin/x86_64-linux/tex pdftex: /usr/local/texlive/2017/bin/x86_64-linux/pdftex mktexpk: /usr/local/texlive/2017/bin/x86_64-linux/mktexpk dvips: /usr/local/texlive/2017/bin/x86_64-linux/dvips dvipdfmx: /usr/local/texlive/2017/bin/x86_64-linux/dvipdfmx =========================== active config files ========================== texmf.cnf: /usr/local/texlive/2017/texmf.cnf texmf.cnf: /usr/local/texlive/2017/texmf-dist/web2c/texmf.cnf updmap.cfg: /usr/local/texlive/2017/texmf-dist/web2c/updmap.cfg fmtutil.cnf: /usr/local/texlive/2017/texmf-dist/web2c/fmtutil.cnf config.ps: /usr/local/texlive/2017/texmf-dist/dvips/config/config.ps mktex.cnf: /usr/local/texlive/2017/texmf-dist/web2c/mktex.cnf pdftexconfig.tex: ============================= font map files ============================= psfonts.map: /usr/local/texlive/2017/texmf-dist/fonts/map/dvips/updmap/psfonts.map pdftex.map: /usr/local/texlive/2017/texmf-dist/fonts/map/pdftex/updmap/pdftex.map ps2pk.map: /usr/local/texlive/2017/texmf-dist/fonts/map/dvips/updmap/ps2pk.map kanjix.map: /usr/local/texlive/2017/texmf-dist/fonts/map/dvipdfmx/updmap/kanjix.map =========================== kpathsea variables =========================== TEXMFMAIN=/usr/local/texlive/2017/texmf-dist TEXMFDIST=/usr/local/texlive/2017/texmf-dist TEXMFLOCAL=/usr/local/texlive/texmf-local TEXMFSYSVAR=/usr/local/texlive/2017/texmf-var TEXMFSYSCONFIG=/usr/local/texlive/2017/texmf-config TEXMFVAR=/home/She/.texlive2017/texmf-var TEXMFCONFIG=/home/She/.texlive2017/texmf-config TEXMFHOME=/home/She/texmf VARTEXFONTS=/home/She/.texlive2017/texmf-var/fonts TEXMF=/usr/local/texlive/2017/texmf-dist SYSTEXMF=/usr/local/texlive/2017/texmf-var:/usr/local/texlive/texmf-local:/usr/local/texlive/2017/texmf-dist TEXMFDBS={!!/usr/local/texlive/texmf-local,!!/usr/local/texlive/2017/texmf-config,!!/usr/local/texlive/2017/texmf-var,!!/usr/local/texlive/2017/texmf-dist} WEB2C=/usr/local/texlive/2017/texmf-dist/web2c TEXPSHEADERS=.:/usr/local/texlive/2017/texmf-dist/{dvips,fonts/{enc,type1,type42,type3}}// TEXCONFIG=/usr/local/texlive/2017/texmf-dist/dvips// ENCFONTS=.:/usr/local/texlive/2017/texmf-dist/fonts/enc// TEXFONTMAPS=.:/usr/local/texlive/2017/texmf-dist/fonts/map/{kpsewhich,pdftex,dvips,}// ==== kpathsea variables from environment only (ok if no output here) ==== TEXINPUTS=/usr/local/texlive/2017/texmf-dist/tex/latex/latexconfig
[...]$ echo $TEXINPUTS /usr/local/texlive/2017/texmf-dist/tex/latex/latexconfig
[...]$
注意到,minted.sty 文件的默认路径为 /usr/local/texlive/2017/texmf-dist/tex/latex/minted/minted.sty,而 kpsewhich 命令并不能搜索到它,这是因为 kpsewhich 的搜索目录设置不当;tlmgr 命令返回的参数中有两处错误(红色背景所示),一是 pdftexconfig.tex 的位置未指定,二是 $TEXINPUTS 的内容仅由系统的环境变量所指定,而不会使用 TexLive 默认的目录设置(TexLive 专用的树形目录结构 TDS)。特别指出,tlmgr 命令的第二个错误写道:“==== kpathsea variables from environment only (ok if no output here) ====”,以后可以利用这里的输出字段来查询是否定义了冲突的系统变量。
接下来,修改 TexLive 2017 环境变量的设置文件,并且更新 TexLive 的设置。
[...]$ vi ~/Documents/texlive2017.sh #!/bin/bash # setting for TexLive 2017 environment variables, edit by She export PATH=$PATH:$HOME/.local/bin:$HOME/bin:/usr/local/texlive/2017/bin/x86_64-linux export MANPATH=/usr/local/texlive/2017/texmf-dist/doc/man:$MANPATH export INFOPATH=/usr/local/texlive/2017/texmf-dist/doc/info:$INFOPATH [...]$ sudo cp ~/Documents/texlive2017.sh /etc/profile.d/texlive2017.sh
[...]$ source /etc/profile.d/texlive2017.sh
[...]$ sudo texhash
注销,再重新登录。
此时,查询这个变量 $TEXINPUTS 是否有值,再重复之前的 pdflatex 编译工作,可以看到 pdflatex 命令运行正常,可以生成相应的 test.pdf 文件:
[...]$ echo $TEXINPUTS [...]$ pdflatex test.tex This is pdfTeX, Version 3.14159265-2.6-1.40.18 (TeX Live 2017) (preloaded format=pdflatex) restricted write18 enabled. entering extended mode (./test.tex LaTeX2e <2017-04-15> Babel <3.12> and hyphenation patterns for 84 language(s) loaded. (/usr/local/texlive/2017/texmf-dist/tex/latex/base/article.cls Document Class: article 2014/09/29 v1.4h Standard LaTeX document class (/usr/local/texlive/2017/texmf-dist/tex/latex/base/size10.clo)) (./test.aux) [1{/usr/local/texlive/2017/texmf-var/fonts/map/pdftex/updmap/pdftex.map}] (./test.aux) )</usr/local/texlive/2017/texmf-dist/fonts/type1/public/amsfonts/c m/cmr10.pfb></usr/local/texlive/2017/texmf-dist/fonts/type1/public/amsfonts/cm/ cmr7.pfb> Output written on test.pdf (1 page, 19263 bytes). Transcript written on test.log.
而且,tlmgr 工具的参数以及 kpsewhich 查询测试均正常,结果如下:
[...]$ kpsewhich --show-path=.sty .:/home/She/.texlive2017/texmf-config/tex/kpsewhich//:/home/She/.texlive2017/texmf-var/tex/kpsewhich//:/home/She/texmf/tex/kpsewhich//:!!/usr/local/texlive/texmf-local/tex/kpsewhich//:!!/usr/local/texlive/2017/texmf-config/tex/kpsewhich//:!!/usr/local/texlive/2017/texmf-var/tex/kpsewhich//:!!/usr/local/texlive/2017/texmf-dist/tex/kpsewhich//:/home/She/.texlive2017/texmf-config/tex/generic//:/home/She/.texlive2017/texmf-var/tex/generic//:/home/She/texmf/tex/generic//:!!/usr/local/texlive/texmf-local/tex/generic//:!!/usr/local/texlive/2017/texmf-config/tex/generic//:!!/usr/local/texlive/2017/texmf-var/tex/generic//:!!/usr/local/texlive/2017/texmf-dist/tex/generic//:/home/She/.texlive2017/texmf-config/tex///:/home/She/.texlive2017/texmf-var/tex///:/home/She/texmf/tex///:!!/usr/local/texlive/texmf-local/tex///:!!/usr/local/texlive/2017/texmf-config/tex///:!!/usr/local/texlive/2017/texmf-var/tex///:!!/usr/local/texlive/2017/texmf-dist/tex/// [...]$ kpsewhich --show-path=.fmt .:/home/She/.texlive2017/texmf-config/web2c/unsetengine:/home/She/.texlive2017/texmf-var/web2c/unsetengine:/home/She/texmf/web2c/unsetengine:!!/usr/local/texlive/texmf-local/web2c/unsetengine:!!/usr/local/texlive/2017/texmf-config/web2c/unsetengine:!!/usr/local/texlive/2017/texmf-var/web2c/unsetengine:!!/usr/local/texlive/2017/texmf-dist/web2c/unsetengine:/home/She/.texlive2017/texmf-config/web2c:/home/She/.texlive2017/texmf-var/web2c:/home/She/texmf/web2c:!!/usr/local/texlive/texmf-local/web2c:!!/usr/local/texlive/2017/texmf-config/web2c:!!/usr/local/texlive/2017/texmf-var/web2c:!!/usr/local/texlive/2017/texmf-dist/web2c [...]$ which kpsewhich /usr/local/texlive/2017/bin/x86_64-linux/kpsewhich [...]$ kpsewhich minted.sty /usr/local/texlive/2017/texmf-dist/tex/latex/minted/minted.sty [...]$ kpsewhich pdflatex.fmt [...]$ kpsewhich pdflatex.ini /usr/local/texlive/2017/texmf-dist/tex/latex/latexconfig/pdflatex.in
[...]$ tlmgr conf =========================== version information ========================== tlmgr revision 44836 (2017-07-18 01:59:48 +0200) tlmgr using installation: /usr/local/texlive/2017 TeX Live (http://tug.org/texlive) version 2017 ==================== executables found by searching PATH ================= PATH: /usr/local/texlive/2017/bin/x86_64-linux:/usr/lib64/qt-3.3/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:/opt/pgi/linux86-64/17.4/bin:/home/She/.local/bin:/home/She/bin:/usr/local/texlive/2017/bin/x86_64-linux:/opt/pgi/linux86-64/17.4/bin:/home/She/.local/bin:/home/She/bin:/usr/local/texlive/2017/bin/x86_64-linux kpsewhich: /usr/local/texlive/2017/bin/x86_64-linux/kpsewhich updmap: /usr/local/texlive/2017/bin/x86_64-linux/updmap fmtutil: /usr/local/texlive/2017/bin/x86_64-linux/fmtutil tlmgr: /usr/local/texlive/2017/bin/x86_64-linux/tlmgr tex: /usr/local/texlive/2017/bin/x86_64-linux/tex pdftex: /usr/local/texlive/2017/bin/x86_64-linux/pdftex mktexpk: /usr/local/texlive/2017/bin/x86_64-linux/mktexpk dvips: /usr/local/texlive/2017/bin/x86_64-linux/dvips dvipdfmx: /usr/local/texlive/2017/bin/x86_64-linux/dvipdfmx =========================== active config files ========================== texmf.cnf: /usr/local/texlive/2017/texmf.cnf texmf.cnf: /usr/local/texlive/2017/texmf-dist/web2c/texmf.cnf updmap.cfg: /usr/local/texlive/2017/texmf-dist/web2c/updmap.cfg fmtutil.cnf: /usr/local/texlive/2017/texmf-dist/web2c/fmtutil.cnf config.ps: /usr/local/texlive/2017/texmf-dist/dvips/config/config.ps mktex.cnf: /usr/local/texlive/2017/texmf-dist/web2c/mktex.cnf pdftexconfig.tex: /usr/local/texlive/2017/texmf-dist/tex/generic/tex-ini-files/pdftexconfig.tex ============================= font map files ============================= psfonts.map: /usr/local/texlive/2017/texmf-var/fonts/map/dvips/updmap/psfonts.map pdftex.map: /usr/local/texlive/2017/texmf-var/fonts/map/pdftex/updmap/pdftex.map ps2pk.map: /usr/local/texlive/2017/texmf-var/fonts/map/dvips/updmap/ps2pk.map kanjix.map: /usr/local/texlive/2017/texmf-var/fonts/map/dvipdfmx/updmap/kanjix.map =========================== kpathsea variables =========================== TEXMFMAIN=/usr/local/texlive/2017/texmf-dist TEXMFDIST=/usr/local/texlive/2017/texmf-dist TEXMFLOCAL=/usr/local/texlive/texmf-local TEXMFSYSVAR=/usr/local/texlive/2017/texmf-var TEXMFSYSCONFIG=/usr/local/texlive/2017/texmf-config TEXMFVAR=/home/She/.texlive2017/texmf-var TEXMFCONFIG=/home/She/.texlive2017/texmf-config TEXMFHOME=/home/She/texmf VARTEXFONTS=/home/She/.texlive2017/texmf-var/fonts TEXMF={{}/home/She/.texlive2017/texmf-config,/home/She/.texlive2017/texmf-var,/home/She/texmf,!!/usr/local/texlive/texmf-local,!!/usr/local/texlive/2017/texmf-config,!!/usr/local/texlive/2017/texmf-var,!!/usr/local/texlive/2017/texmf-dist} SYSTEXMF=/usr/local/texlive/2017/texmf-var:/usr/local/texlive/texmf-local:/usr/local/texlive/2017/texmf-dist TEXMFDBS={!!/usr/local/texlive/texmf-local,!!/usr/local/texlive/2017/texmf-config,!!/usr/local/texlive/2017/texmf-var,!!/usr/local/texlive/2017/texmf-dist} WEB2C={{}/home/She/.texlive2017/texmf-config,/home/She/.texlive2017/texmf-var,/home/She/texmf,!!/usr/local/texlive/texmf-local,!!/usr/local/texlive/2017/texmf-config,!!/usr/local/texlive/2017/texmf-var,!!/usr/local/texlive/2017/texmf-dist}/web2c TEXPSHEADERS=.:{{}/home/She/.texlive2017/texmf-config,/home/She/.texlive2017/texmf-var,/home/She/texmf,!!/usr/local/texlive/texmf-local,!!/usr/local/texlive/2017/texmf-config,!!/usr/local/texlive/2017/texmf-var,!!/usr/local/texlive/2017/texmf-dist}/{dvips,fonts/{enc,type1,type42,type3}}// TEXCONFIG={{}/home/She/.texlive2017/texmf-config,/home/She/.texlive2017/texmf-var,/home/She/texmf,!!/usr/local/texlive/texmf-local,!!/usr/local/texlive/2017/texmf-config,!!/usr/local/texlive/2017/texmf-var,!!/usr/local/texlive/2017/texmf-dist}/dvips// ENCFONTS=.:{{}/home/She/.texlive2017/texmf-config,/home/She/.texlive2017/texmf-var,/home/She/texmf,!!/usr/local/texlive/texmf-local,!!/usr/local/texlive/2017/texmf-config,!!/usr/local/texlive/2017/texmf-var,!!/usr/local/texlive/2017/texmf-dist}/fonts/enc// TEXFONTMAPS=.:{{}/home/She/.texlive2017/texmf-config,/home/She/.texlive2017/texmf-var,/home/She/texmf,!!/usr/local/texlive/texmf-local,!!/usr/local/texlive/2017/texmf-config,!!/usr/local/texlive/2017/texmf-var,!!/usr/local/texlive/2017/texmf-dist}/fonts/map/{kpsewhich,pdftex,dvips,}// ==== kpathsea variables from environment only (ok if no output here) ====
[...]$
小结:通过以上对比,起码有以下两种方法来查看 TexLive 的搜索路径是否正常:
(1)通过查看 kpsewhich --show-path=.sty 命令的返回结果来判断系统路径是否正常
# 错误的返回结果 [...]$ kpsewhich --show-path=.sty /usr/local/texlive/2017/texmf-dist/tex/latex/latexconfig [...]$ kpsewhich minted.sty [...]$ # 正确的返回结果 [...]$ kpsewhich --show-path=.sty .:/home/She/.texlive2017/texmf-config/tex/kpsewhich//:/home/She/.texlive2017/texmf-var/tex/kpsewhich//:/home/She/texmf/tex/kpsewhich//:!!/usr/local/texlive/texmf-local/tex/kpsewhich//:!!/usr/local/texlive/2017/texmf-config/tex/kpsewhich//:!!/usr/local/texlive/2017/texmf-var/tex/kpsewhich//:!!/usr/local/texlive/2017/texmf-dist/tex/kpsewhich//:/home/She/.texlive2017/texmf-config/tex/generic//:/home/She/.texlive2017/texmf-var/tex/generic//:/home/She/texmf/tex/generic//:!!/usr/local/texlive/texmf-local/tex/generic//:!!/usr/local/texlive/2017/texmf-config/tex/generic//:!!/usr/local/texlive/2017/texmf-var/tex/generic//:!!/usr/local/texlive/2017/texmf-dist/tex/generic//:/home/She/.texlive2017/texmf-config/tex///:/home/She/.texlive2017/texmf-var/tex///:/home/She/texmf/tex///:!!/usr/local/texlive/texmf-local/tex///:!!/usr/local/texlive/2017/texmf-config/tex///:!!/usr/local/texlive/2017/texmf-var/tex///:!!/usr/local/texlive/2017/texmf-dist/tex/// [...]$ kpsewhich minted.sty /usr/local/texlive/2017/texmf-dist/tex/latex/minted/minted.sty
[...]$
(2)通过查看 命令的返回结果来准确判断,各个变量的值必须要准确赋值,而且在最后一行的内容不能为空
[...]$ tlmgr conf ... =========================== active config files ========================== ... pdftexconfig.tex: /usr/local/texlive/2017/texmf-dist/tex/generic/tex-ini-files/pdftexconfig.tex # pdftexconfig.tex的路径必须查询到,否则会出错 ============================= font map files ============================= ... =========================== kpathsea variables =========================== ... ==== kpathsea variables from environment only (ok if no output here) ==== # 这一行之后列出的是冲突的系统变量名,如无,则一切正常;如有,则找到并注释掉它 TEXINPUTS=/usr/local/texlive/2017/texmf-dist/tex/latex/latexconfig # 这里不能有冲突的系统变量,如有,则需要找到该变量的设置部分,并注释掉它或者删去它
更详细的 Kpathsea 有关的参数设置,可以查看TexLive 的官方说明文档:https://www.tug.org/texlive/doc/texlive-zh-cn/texlive-zh-cn.pdf。