解析文件名

解析文件名

各种常见发行版中文件名的精确语法是什么?

这与三个原语相关:

  • \input<filename>\@@input在 LaTeX 中重命名)
  • \openin<4-bit number><equals><filename>
  • \openout<4-bit number><equals><filename>

其中<4-bit number>是 0 到 15 之间的整数,是任意数量的空格,后跟可选的显式 catcode-other=标记。

使用 TeX Live 2011 进行测试,我发现:标记会逐个完全展开(就像 TeX 中的其他地方一样,使用程序get_x_token)。如果找到的标记是显式的或隐式字符标记,则 catcode 将被忽略,字符将附加到正在构建的文件名中。任何 catcode 中的空格都会结束文件名并被吞噬。任何不可扩展的非字符标记都会结束文件名并保留。

例子:

\makeatletter
\def\test{test}
\tracingall        % To see when spaces occur.
\openin4=\test     % Opens "test.tex"
\openin4=\bgroup \test \space \space % Opens "{test.tex", one space left.
\openin4=test\@sptoken \space        % Opens "test.tex", one space left.
\openin4="test \space test"          % Opens "test test.tex" in some distributions.

剩下的一个微妙之处是,由于\input是可扩展的,而\openin\openout不是,因此当它们作为表格单元格的第一个标记出现时,它们的行为略有不同。但那是另一个故事。

答案1

似乎不可能有任何地方的 TeX 发行版表现不同,因为即使 Knuth 在某处写道这段代码是依赖于系统的,但您上面描述的是“明智”的做法,远比其他依赖于系统的选项要好得多。

这并不一定意味着该过程产生的文件名对于操作系统来说是有效的,但我认为这是一个不同的问题。

相关内容