各种常见发行版中文件名的精确语法是什么?
这与三个原语相关:
\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 在某处写道这段代码是依赖于系统的,但您上面描述的是“明智”的做法,远比其他依赖于系统的选项要好得多。
这并不一定意味着该过程产生的文件名对于操作系统来说是有效的,但我认为这是一个不同的问题。