考虑以下文件main.tex
和xyz.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
也可以正常工作。