扩展:\input 参数在 Windows 和 Linux 上的处理方式不同

扩展:\input 参数在 Windows 和 Linux 上的处理方式不同

考虑以下文件main.texxyz.tex

% main.tex
\documentclass{article}
\begin{document}
\newcommand\abc{XYZ.tex}
\input{\MakeLowercase{\abc}}
\end{document}

% xyz.tex (all lowercase letters)
Hey, it works!

LaTeXingmain.tex在 Windows 下可以工作(甚至无需将文件名小写即可工作,因为文件名不区分大小写),而在 Linux 下,它会给出错误

! LaTeX Error: File `MakeLowercase {XYZ.tex}' not found.

问题:为什么它在 Windows 下可以工作,尽管\MakeLowercase它不可​​扩展?我们难道不应该期望在不同操作系统上的行为相同吗?在两种情况下如何才能以相同的方式处理宏?

(我知道如何实现将文件名小写化的效果,例如使用\explower帖子中的可扩展地更改字母大小写并在 \csname 内使用,无需包

答案1

以下是我的机器上发生的情况(具有区分大小写的文件系统)。

使用 TL 2022似乎可以工作,但我不会依赖它。

TeX Live 2022

! LaTeX Error: File `xyz.tex' not found.

TeX Live 2021

! LaTeX Error: File `MakeLowercase {XYZ.tex}' not found.

TeX Live 2020

挂起

TeX Live 2019

! Missing endcsname inserted.
<to be read again>
                   protect
l.4 \input{\MakeLowercase{\abc}}

TeX Live 2018 及更早版本

! Illegal parameter number in definition of \@filef@und.
<to be read again>

l.4 \input{\MakeLowercase{\abc}}

使用最近的 LaTeX:

\documentclass{article}

\ExplSyntaxOn

\NewDocumentCommand{\lowercaseinput}{m}
 {
  \file_input:e { \str_lowercase:e { #1 } }
 }
\cs_generate_variant:Nn \file_input:n { e }
\cs_generate_variant:Nn \str_lowercase:n { e }

\ExplSyntaxOff


\begin{document}

\newcommand\abc{XYZ.tex}

\lowercaseinput{\abc}

\renewcommand\abc{XÝŽ.tex}

\lowercaseinput{\abc}

\end{document}

请注意,这也适用于(大多数)UTF-8 字符。控制台将显示

! LaTeX Error: File 'xyz.tex' not found.

! LaTeX Error: File 'xýž.tex' not found.

答案2

我们可以看到 LaTeX 宏每年都在变化。但是 TeX 基元保持不变。您可以通过 TeX 基元解决问题\lowercase

\lowercase \expandafter{\expandafter\input \expandafter{\abc}}

如果有的话\def\abc{XYX.tex},上面的命令将转换为

\input {xyz.tex}

Win 系统对文件名的访问不区分大小写(?),因此它\lowercase也可以正常工作。

相关内容