文件名中允许使用哪些字符?

文件名中允许使用哪些字符?

主文档和输入文件(以及.tex图像等)的文件名中可以​​使用哪些字符?我不是问建议使用哪些字符,而是问用户可能在文件名中使用的所有字符的列表。了解这一点很重要,以便支持文件名相关软件包中的字符(例如currfile,,svn-multi...)。

我可以在这里看到两个用例:

  • 在命令行上,例如使用pdflatex <filename>
    这可能需要单引号和/或\转义命令行 shell 中的特殊字符,但对于 TeX 来说可能再次需要。
  • 在 (La)TeX 内部,例如\input{<filename>}

例如:在 Linux 下使用 TeXLive 2011 的 LaTeX 中,在 (主文档) 文件名中使用%似乎是不可能的。Apdflatex 'test%it.tex'会产生提示,输入后\relax会得到:! I can't find file `test'.。因此,%在这种情况下, 也用作注释字符。

命令行上的文件名似乎还有更多问题,因为我收到以下警告:

# pdflatex 'test$it*gdg!£$^&%_*(){.tex'
warning: test$it*gdg!£$^&%_*(){.tex: Unrecognized variable construct `$^'.

答案1

文件名语法是 TeX-the-program 中少数几个明确依赖于系统的部分之一。

在 texlive(即 web2c tex)中,大多数字符都是允许的(特别是在语法更改为允许"引用名称(包括空格)之后)。当然,这些字符在被视为可能的文件名字符之前会由 TeX 的宏扩展进行解释,因此%和朋友需要特殊处理。

这是test%it.tex在我的 texlive 2010 上输入的(在 Windows 中使用 cygwin bash shell,但我想其他命令行也会类似)

  pdflatex "\begingroup\lccode44=37 \lowercase{\endgroup\input test,it}"

您提到的警告$来自 kpathsea,如其手册中所述

3.3.2 变量扩展 路径元素中的 '$foo' 或 '${foo}' 将被替换为 (1) 环境变量 'foo' 的值(如果已定义);(2) 'texmf.cnf' 中 'foo' 的值(如果已定义);(3) 空字符串。 如果 '$' 后的字符是字母数字或 '_',则变量名由所有连续的此类字符组成。 如果 '$' 后的字符是 '{',则变量名由直到下一个 '}' 的所有内容组成(变量名周围不能嵌套括号)。 否则,Kpathsea 会给出警告并忽略 '$' 及其后跟字符。


您可以使用 tests sch 测试 kpathsea 的处理能力

$ FOO=ZENV tex kps
This is TeX, Version 3.1415926 (Web2C 2010)
(./kps.tex (./a b c.tex
a b c found
) (./ZENV.tex
ZENV found
) )
No pages of output.
Transcript written on kps.log.

这表明你可以从 tex 中引用环境变量,kps.tex 是

\input "a b c.tex"

\catcode`\$=12

\input "$FOO.tex"

\bye

a b c.tex

\immediate\write20{a b c found}

并且 ZENV.tex 是

\immediate\write20{ZENV found}

答案2

如果您尝试前 128/256 个字符以外的字符,情况就会变得有趣;例如,TL​​2011 中的 XeTeX 无法处理 Windows 7 上输入文件名中的 unicode 字符(如“äöüß”)。但这高度依赖于系统。

最好只使用字母数字 ASCII(即 [a-zA-Z0-9])作为文件名,因为这些将总是工作。

相关内容