我刚刚惊讶地发现,如果一个 TeX 文件的~
名称中有一个波浪符号,xelatex
则pdflatex
拒绝编译它:
$ cat te\~st.tex
\documentclass{article}
\begin{document}
Hello.
\end{document}
$ pdflatex te\~st.tex
This is pdfTeX, Version 3.141592653-2.6-1.40.22 (TeX Live 2022/dev/Debian) (preloaded format=pdflatex)
restricted \write18 enabled.
entering extended mode
! I can't find file `te'.
<to be read again>
\protect
<*> te~
st.tex
(Press Enter to retry, or Control-D to exit)
Please type another input file name:
同时,尽管波浪号没有以任何方式转义,但此文件仍可编译成功:
% test.tex
\documentclass{article}
\begin{document}
\input{hell~o.tex}
\end{document}
这是一个错误吗?简单的编译名称中带有波浪号的文件的方法?
我想使用波浪号来提高可读性,就像 一样arithmetic-1~natural-numbers.tex
。
我在 Linux Mint 21.1 上使用 TeXLive 2021。
答案1
呼唤
pdflatex name
与在提示符下调用pdflatex
并指定相同。name
**
文件名将不加改变地传递给 TeX 解释器(~
不会经过 shell 扩展为主目录名),并且将应用 TeX 的常规规则。在提示符下指定标记**
(几乎)与执行
\input name
(原语\input
)并且 TeX 遵循其规则,即进行完整的标记扩展,直到找到不是字符的东西。 在您的例子中,~
扩展为
\nobreakspace{}
进而
\protect\nobreakspace•{}
(其中•
代表名称中的尾随空格)。由于此时\protect
为\relax
,因此文件名确定为te
。
您需要~
在 TeX 级别保护其不被扩展,这可以通过多种方式实现:
pdflatex te\\string~st
pdflatex 'te\string~st'
pdflatex '\input{\detokenize{te~st}}'
pdflatex '\input{\unexpanded{te~st}}'
您可能想要编写一个pdflatex
使用“奇怪”文件名运行的 shell 脚本(或其他引擎)。