![你能从 TeX 内部检测出 TeX 访问的文件的名称是如何编码的吗?](https://linux22.com/image/447247/%E4%BD%A0%E8%83%BD%E4%BB%8E%20TeX%20%E5%86%85%E9%83%A8%E6%A3%80%E6%B5%8B%E5%87%BA%20TeX%20%E8%AE%BF%E9%97%AE%E7%9A%84%E6%96%87%E4%BB%B6%E7%9A%84%E5%90%8D%E7%A7%B0%E6%98%AF%E5%A6%82%E4%BD%95%E7%BC%96%E7%A0%81%E7%9A%84%E5%90%97%EF%BC%9F.png)
这个问题的灵感来自于输入动态生成的文件名这基本上是关于截断给定的文件名/扩展\jobname
两个字符。
在 utf-8 中,字节序列 e0 a3 a9 编码单个字符,即“ARABIC CURLY KASRATAN”。
在拉丁语 1/iso-8859-1 中,相同的字节序列 e0 a3 a9 编码三个字符,即字符“小写字母 a,重音符号”、“英镑符号”、“版权符号”,即 ࣩ。
因此,如果文件的名称由该字节序列组成,不同的 TeX 引擎会对此做出不同的解释:
传统的 8 位编码 TeX 引擎将其解释为文件名由三个字符标记组成。
基于 utf-8 的 TeX 引擎(例如 XeTeX/LuaTeX)将其解释为文件名由单个字符标记组成。
您可以轻松地测试这一点。
假设您在 utf-8 平台上工作,并且有一个 .tex 文件,其名称由“ARABIC CURLY KASRATAN”字符组成。
IE,⟨阿拉伯卷发 KASRATAN⟩.tex,内容如下:
\def\splitchars#1{\ifx\relax#1\else(#1)\expandafter\splitchars\fi}
\message{\expandafter\splitchars\jobname\relax}
\bye
\jobname
即,文件名扩展名/的每个字符都应嵌套在括号中显示。
将 shell 的编码切换为 latin-1/iso-8859-1 时,
使用传统的 TeX 你会得到以下控制台输出:
This is TeX, Version 3.14159265 (TeX Live 2020) (preloaded format=tex) (./^^e0^^a3^^a9.tex (^^e0)(^^a3)(^^a9) ) No pages of output. Transcript written on ^^e0^^a3^^a9.log.
请注意,您有三个括号组,,
(^^e0)(^^a3)(^^a9)
这表明传统引擎假定的扩展\jobname
由三个字符标记组成。(括号内所讨论的字符以 - 符号显示^^
。)使用 XeTeX 或 LuaTeX 您将获得以下控制台输出:
This is LuaTeX, Version 1.12.0 (TeX Live 2020) restricted system commands enabled. (./ࣩ.tex (ࣩ)) warning (pdf backend): no pages of output. Transcript written on ࣩ.log.
请注意,您有一个括号组,
(ࣩ)
表示基于 utf8 的引擎假定的扩展\jobname
由单个字符标记组成。 (当 shell 的编码切换为 latin1/iso-8859-1 时,在括号内,您会看到形成单个 utf-8 字符的字节序列的 latin-1 表示形式。)
因此,如果您想可靠地处理文件名,例如删除最后两个字符,则需要有关该文件名如何编码的信息。
所以问题是:
你能从 TeX 内部检测出 TeX 访问的文件的名称是如何编码的吗?