首先我确定pdflatex可以编译中文文件名的tex文件,没有问题,例如tex源码内容如下
\documentclass[UTF8,hyperref]{ctexart}
\begin{document}
中文
\end{document}
将其保存为名为“中文.tex”的文件并运行
pdflatex 中文.tex
一切都好。
现在,为了加快编译速度,我们按照此链接即编辑一个名为“pre.tex”的文件,其内容如下
\documentclass[UTF8,hyperref]{ctexart}
然后运行
pdflatex -ini -jobname="pre" "&pdflatex pre.tex\dump"
生成一个名为“pre.fmt”的 .fmt 文件
现在,我们在 out tex 源中使用这个预编译的 .fmt 文件,例如
%& pre
\begin{document}
中文
\end{document}
如果我们将其保存为名为“en.tex”的文件,则pdflatex en.tex
运行正常。但如果我们将其保存为名为“中文.tex”的文件,则将pdflatex 中文.tex
显示如下错误
这里出了什么问题?为什么预编译不支持带有中文文件名的 Tex 文件?
我上传了文件“中文.tex”在这里下载
答案1
您可以在此处查看原因
\edef\x{中文.tex}\show\x
\documentclass[UTF8,hyperref]{ctexart}
\edef\x{中文.tex}\show\x
\begin{document}
中文
\end{document}
比较两者\show
最初,这些字节本质上都是惰性的,因此文件名被传递给文件系统并且可以工作,但是在类加载之后,这些字节被激活,并给出了启用的定义排版但这意味着它们会扩展为错误的文件名。
我没有所有的字体来全面测试这一点,但我认为如果你将格式模板更改为
\documentclass[UTF8,hyperref]{ctexart}
% set high chars active at start of job
% After the commandline has been read, but before Tex starts reading the
% file contents, the tokens in \everyjob are run.
% This loop sets every character between 127 and 255 to be catcode 13
% "active" which is the catcode they normally have after inputenc package
% or the ctexart class code.
\everyjob{{\count0=127
\loop
\global\catcode\count0=13
\ifnum\count0<255
\advance\count0 1
\repeat
}}
% set high chars inactive now for filename reading
% This loop sets every character between 127 and 255 to be catcode 12
% "other" which is the normal catcode for punctuation. this means that
% no special interpretation is done and the filename works as in a normal
% format (where high characters are also not active until inputenc or
% similar is loaded.
% Unlike the previous loop which is delayed in \everyjob
% This loop is executed here to make characters safe before the \dump
{\count0=127
\loop
\global\catcode\count0=12
\ifnum\count0<255
\advance\count0 1
\repeat
}
\everyjob
因此,在读取文件名之后,8 位字符直到运行后才处于活动状态。