使用 pdfTeX 编译以下代码:
\documentclass{article}
\begin{document}
1 \pdffilesize{XITS-Regular.otf} \par
2 \pdffilesize{/usr/local/texlive/2020/texmf-dist/fonts/opentype/public/xits/XITS-Regular.otf} \par
3 \pdffilesize{book.cls} \par
\end{document}
它给
1
2 270496
3 23147
在 XeTeX 中,该\filesize
命令给出相同的结果。为什么XITS-Regular.otf
找不到\(pdf)filesize
?有没有关于可以搜索哪些文件的说明?
实际上我使用 LaTeX3\file_if_exist:nTF
来检查某些东西是否存在。\file_if_exist:nTF {XITS-Regular.otf}
转到错误的分支所以我认为这是由于\pdffilesize
原语造成的。
答案1
该命令使用与 以及\pdffilesize
相同的搜索路径。\input
\file_if_exist:nTF
但是,您可以使用以下命令在整个 TeX 树中进行搜索kpsewhich
:
\everyeof{\noexpand}\endlinechar=-1
\pdffilesize{\input|"kpsewhich XITS-Regular.otf" }
\bye
使用 TeX Live 2020,同样可以
\everyeof{\noexpand}\endlinechar=-1
\pdffilesize{\input{|"kpsewhich XITS-Regular.otf"}}
\bye
对于 LaTeX,使用\@@input
。
这将打印 270496。
\input
这是如何工作的?当传递给(原始文件)的文件名以 开头|
时,TeX 引擎 (除了不使用扩展名的 “Knuth TeX”) 将其解释为 “管道”。
文件名的其余部分应该是用双引号括起来的 shell 命令;TeX 运行被暂停,shell 命令被执行,将其输出传送到 TeX,然后恢复其工作。
它本质上与$(command arguments)
Bash shell 中的机制相同。
有些命令kpsewhich
被视为“安全”,因此它们在“受限 shell 逃逸”下执行,默认情况下启用此功能。完整列表如下
bibtex bibtex8 extractbb gregorio kpsewhich
makeindex repstopdf r-mpost texosquery-jre8
可以运行其他 shell 命令,但需要启用-shell-escape
。