使用TexLive有一段时间了,从2015到2017,一直运行如常。
最近,想把以前的文档重新编译,却发现不能正常运行,费了好大一番工夫,才终于修复了这个bug,记录如下。
问题描述:编译一个简单的 *.tex 文件时,经常报告系统文件找不到的错误,无论是 pdflatex,latex,xelatex 命令都有类似的错误。
test.tex 全文:
% test.tex
\documentclass{article}
\begin{document}
hello \LaTeX!
\end{document}
用 pdflatex 命令编译报错:
[...]$ pdflatex test.tex
This is pdfTeX, Version 3.14159265-2.6-1.40. (TeX Live ) (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//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. (TeX Live ) (INITEX)
restricted \write18 enabled.
(/usr/local/texlive//texmf-dist/web2c/cp227.tcx)
entering extended mode
(/usr/local/texlive//texmf-dist/tex/latex/latexconfig/pdflatex.ini
! I can't find file `pdftexconfig.tex'.
l. \input pdftexconfig.tex (Press Enter to retry, or Control-D to exit)
Please type another input file name:
! Emergency stop.
l. \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 >& </dev/null' return status 1
mktexfmt [ERROR]: return error due to options --strict
mktexfmt [INFO]: Disabled formats:
mktexfmt [INFO]: Not selected formats:
mktexfmt [INFO]: Failed to build: (pdftex/pdflatex)
mktexfmt [INFO]: Total formats:
mktexfmt [INFO]: exiting with status
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 environment variables, edit by She
export TEXMF=/usr/local/texlive//texmf-dist
export PATH=$PATH:$HOME/.local/bin:$HOME/bin:/usr/local/texlive//bin/x86_64-linux
export MANPATH=/usr/local/texlive//texmf-dist/doc/man:$MANPATH
export INFOPATH=/usr/local/texlive//texmf-dist/doc/info:$INFOPATH
export TEXINPUTS=/usr/local/texlive//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 (-- :: +)
tlmgr using installation: /usr/local/texlive/
TeX Live (http://tug.org/texlive) version 2017 ==================== executables found by searching PATH =================
PATH: /usr/local/texlive//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-/17.4/bin:/home/She/.local/bin:/home/She/bin:/usr/local/texlive//bin/x86_64-linux:/opt/pgi/linux86-/17.4/bin:/home/She/.local/bin:/home/She/bin:/usr/local/texlive//bin/x86_64-linux
kpsewhich: /usr/local/texlive//bin/x86_64-linux/kpsewhich
updmap: /usr/local/texlive//bin/x86_64-linux/updmap
fmtutil: /usr/local/texlive//bin/x86_64-linux/fmtutil
tlmgr: /usr/local/texlive//bin/x86_64-linux/tlmgr
tex: /usr/local/texlive//bin/x86_64-linux/tex
pdftex: /usr/local/texlive//bin/x86_64-linux/pdftex
mktexpk: /usr/local/texlive//bin/x86_64-linux/mktexpk
dvips: /usr/local/texlive//bin/x86_64-linux/dvips
dvipdfmx: /usr/local/texlive//bin/x86_64-linux/dvipdfmx
=========================== active config files ==========================
texmf.cnf: /usr/local/texlive//texmf.cnf
texmf.cnf: /usr/local/texlive//texmf-dist/web2c/texmf.cnf
updmap.cfg: /usr/local/texlive//texmf-dist/web2c/updmap.cfg
fmtutil.cnf: /usr/local/texlive//texmf-dist/web2c/fmtutil.cnf
config.ps: /usr/local/texlive//texmf-dist/dvips/config/config.ps
mktex.cnf: /usr/local/texlive//texmf-dist/web2c/mktex.cnf
pdftexconfig.tex: ============================= font map files =============================
psfonts.map: /usr/local/texlive//texmf-dist/fonts/map/dvips/updmap/psfonts.map
pdftex.map: /usr/local/texlive//texmf-dist/fonts/map/pdftex/updmap/pdftex.map
ps2pk.map: /usr/local/texlive//texmf-dist/fonts/map/dvips/updmap/ps2pk.map
kanjix.map: /usr/local/texlive//texmf-dist/fonts/map/dvipdfmx/updmap/kanjix.map
=========================== kpathsea variables ===========================
TEXMFMAIN=/usr/local/texlive//texmf-dist
TEXMFDIST=/usr/local/texlive//texmf-dist
TEXMFLOCAL=/usr/local/texlive/texmf-local
TEXMFSYSVAR=/usr/local/texlive//texmf-var
TEXMFSYSCONFIG=/usr/local/texlive//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//texmf-dist
SYSTEXMF=/usr/local/texlive//texmf-var:/usr/local/texlive/texmf-local:/usr/local/texlive//texmf-dist
TEXMFDBS={!!/usr/local/texlive/texmf-local,!!/usr/local/texlive//texmf-config,!!/usr/local/texlive//texmf-var,!!/usr/local/texlive//texmf-dist}
WEB2C=/usr/local/texlive//texmf-dist/web2c
TEXPSHEADERS=.:/usr/local/texlive//texmf-dist/{dvips,fonts/{enc,type1,type42,type3}}//
TEXCONFIG=/usr/local/texlive//texmf-dist/dvips//
ENCFONTS=.:/usr/local/texlive//texmf-dist/fonts/enc//
TEXFONTMAPS=.:/usr/local/texlive//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//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 environment variables, edit by She
export PATH=$PATH:$HOME/.local/bin:$HOME/bin:/usr/local/texlive//bin/x86_64-linux
export MANPATH=/usr/local/texlive//texmf-dist/doc/man:$MANPATH
export INFOPATH=/usr/local/texlive//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. (TeX Live ) (preloaded format=pdflatex)
restricted \write18 enabled.
entering extended mode
(./test.tex
LaTeX2e <-->
Babel <3.12> and hyphenation patterns for language(s) loaded.
(/usr/local/texlive//texmf-dist/tex/latex/base/article.cls
Document Class: article // v1.4h Standard LaTeX document class
(/usr/local/texlive//texmf-dist/tex/latex/base/size10.clo)) (./test.aux)
[{/usr/local/texlive//texmf-var/fonts/map/pdftex/updmap/pdftex.map}]
(./test.aux) )</usr/local/texlive//texmf-dist/fonts/type1/public/amsfonts/c
m/cmr10.pfb></usr/local/texlive//texmf-dist/fonts/type1/public/amsfonts/cm/
cmr7.pfb>
Output written on test.pdf ( page, 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 (-- :: +)
tlmgr using installation: /usr/local/texlive/
TeX Live (http://tug.org/texlive) version 2017 ==================== executables found by searching PATH =================
PATH: /usr/local/texlive//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-/17.4/bin:/home/She/.local/bin:/home/She/bin:/usr/local/texlive//bin/x86_64-linux:/opt/pgi/linux86-/17.4/bin:/home/She/.local/bin:/home/She/bin:/usr/local/texlive//bin/x86_64-linux
kpsewhich: /usr/local/texlive//bin/x86_64-linux/kpsewhich
updmap: /usr/local/texlive//bin/x86_64-linux/updmap
fmtutil: /usr/local/texlive//bin/x86_64-linux/fmtutil
tlmgr: /usr/local/texlive//bin/x86_64-linux/tlmgr
tex: /usr/local/texlive//bin/x86_64-linux/tex
pdftex: /usr/local/texlive//bin/x86_64-linux/pdftex
mktexpk: /usr/local/texlive//bin/x86_64-linux/mktexpk
dvips: /usr/local/texlive//bin/x86_64-linux/dvips
dvipdfmx: /usr/local/texlive//bin/x86_64-linux/dvipdfmx
=========================== active config files ==========================
texmf.cnf: /usr/local/texlive//texmf.cnf
texmf.cnf: /usr/local/texlive//texmf-dist/web2c/texmf.cnf
updmap.cfg: /usr/local/texlive//texmf-dist/web2c/updmap.cfg
fmtutil.cnf: /usr/local/texlive//texmf-dist/web2c/fmtutil.cnf
config.ps: /usr/local/texlive//texmf-dist/dvips/config/config.ps
mktex.cnf: /usr/local/texlive//texmf-dist/web2c/mktex.cnf
pdftexconfig.tex: /usr/local/texlive//texmf-dist/tex/generic/tex-ini-files/pdftexconfig.tex
============================= font map files =============================
psfonts.map: /usr/local/texlive//texmf-var/fonts/map/dvips/updmap/psfonts.map
pdftex.map: /usr/local/texlive//texmf-var/fonts/map/pdftex/updmap/pdftex.map
ps2pk.map: /usr/local/texlive//texmf-var/fonts/map/dvips/updmap/ps2pk.map
kanjix.map: /usr/local/texlive//texmf-var/fonts/map/dvipdfmx/updmap/kanjix.map
=========================== kpathsea variables ===========================
TEXMFMAIN=/usr/local/texlive//texmf-dist
TEXMFDIST=/usr/local/texlive//texmf-dist
TEXMFLOCAL=/usr/local/texlive/texmf-local
TEXMFSYSVAR=/usr/local/texlive//texmf-var
TEXMFSYSCONFIG=/usr/local/texlive//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//texmf-config,!!/usr/local/texlive//texmf-var,!!/usr/local/texlive//texmf-dist}
SYSTEXMF=/usr/local/texlive//texmf-var:/usr/local/texlive/texmf-local:/usr/local/texlive//texmf-dist
TEXMFDBS={!!/usr/local/texlive/texmf-local,!!/usr/local/texlive//texmf-config,!!/usr/local/texlive//texmf-var,!!/usr/local/texlive//texmf-dist}
WEB2C={{}/home/She/.texlive2017/texmf-config,/home/She/.texlive2017/texmf-var,/home/She/texmf,!!/usr/local/texlive/texmf-local,!!/usr/local/texlive//texmf-config,!!/usr/local/texlive//texmf-var,!!/usr/local/texlive//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//texmf-config,!!/usr/local/texlive//texmf-var,!!/usr/local/texlive//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//texmf-config,!!/usr/local/texlive//texmf-var,!!/usr/local/texlive//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//texmf-config,!!/usr/local/texlive//texmf-var,!!/usr/local/texlive//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//texmf-config,!!/usr/local/texlive//texmf-var,!!/usr/local/texlive//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//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//texmf-dist/tex/latex/minted/minted.sty
[...]$
(2)通过查看 命令的返回结果来准确判断,各个变量的值必须要准确赋值,而且在最后一行的内容不能为空
[...]$ tlmgr conf
...
=========================== active config files ==========================
...
pdftexconfig.tex: /usr/local/texlive//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//texmf-dist/tex/latex/latexconfig # 这里不能有冲突的系统变量,如有,则需要找到该变量的设置部分,并注释掉它或者删去它
更详细的 Kpathsea 有关的参数设置,可以查看TexLive 的官方说明文档:https://www.tug.org/texlive/doc/texlive-zh-cn/texlive-zh-cn.pdf。