如何编译名称中带有波浪符号(`~`)的文件?

如何编译名称中带有波浪符号(`~`)的文件?

我刚刚惊讶地发现,如果一个 TeX 文件的~名称中有一个波浪符号,xelatexpdflatex拒绝编译它:

$ 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 脚本(或其他引擎)。

相关内容