[CentOS 7] TexLive2017中kpsewhich Bug的修復


使用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.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。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM