上下文
考虑包含以下文件的目录
$ ls
1.tex '2 2.tex' "3 '' 3.tex" '4 "" 4.tex'
所有这些文件都包含以下内容
$ cat 1.tex
\documentclass{article}
\begin{document} a \end{document}
以下命令的输出可以证明这一点
$ sha512sum 1.tex '2 2.tex' "3 '' 3.tex" '4 "" 4.tex' | awk '{print $1}' | uniq | wc -l
1
我可以分别编译和1.tex
执行以下命令2.tex
3 ''.tex
$ pdflatex 1.tex >/dev/null && echo $?
0
$ pdflatex '2 2.tex' >/dev/null && echo $?
0
$ pdflatex "3 '' 3.tex" >/dev/null && echo $?
0
但是,我找不到编译的方法4 "" 4.tex
。我尝试了以下方法
$ pdflatex '4 "" 4.tex'
$ pdflatex "4 \"\" 4.tex"
$ pdflatex 4\ \"\"\ 4.tex
全部显示以下内容(█
代表光标所在的位置)
$ pdflatex '4 "" 4.tex'
This is pdfTeX, Version 3.14159265-2.6-1.40.20 (TeX Live 2019) (preloaded format=pdflatex)
restricted \write18 enabled.
entering extended mode
! I can't find file `"4 4.tex"'.
<*> "4 4.tex"
(Press Enter to retry, or Control-D to exit)
Please type another input file name: █
问题
有什么方法可以pdflatex
编译名称包含双引号字符的文件?
我从未发现过.tex
名称包含双引号字符的文件,但我只是想找出导致这种行为的原因。
其他背景信息
这个问题与我使用的 shell 无关,原因如下
原因 1
我创建了以下脚本并将 shebang 设置为bash
,zsh
和 ,dash
这样我就可以看到不同 shell 上的行为。所有都显示了上面显示的输出。因此,这不仅发生在 ,zsh
也发生在 和bash
,dash
所以这不是一个依赖于 shell 的问题。
$ cat main.sh
#!/bin/zsh
pdflatex '4 "" 4.tex'
pdflatex "4 \"\" 4.tex"
pdflatex 4\ \"\"\ 4.tex
原因 2
考虑具有以下内容的 C++ 源文件
$ cat 'my "" file.cpp'
int main() {
return 123;
}
$
我可以使用以下命令编译并执行它
$ g++ 'my "" file.cpp' && ./a.out
$ echo $?
123
因此,我们可以得出结论,我使用的 shell 能够解析包含该"
字符的文件名,因为至少有一个程序接受这些参数,这可以证明这一点。
答案1
基于 web2c 的 tex 实现无法访问名称中带有双引号的文件。双引号仅用于引用文件名中的空格。
texdoc web2c
第 3.5.4 节规定:
文件名中的双引号 (
"
) 字符将被忽略;无法读取名称包含 . 的文件"
。