在最近(上周)LaTeX 更新之后,在 LuaTeX 中输入无扩展名的文件会失败。
解决方法LuaLaTeX、tcolorbox 与列表库和无扩展名文件的错误不再起作用,如以下 MWE 所示:
\documentclass{minimal}
\usepackage{listings}
\begin{document}
\lstinputlisting{{test}}
\end{document}
编译失败并显示以下错误消息:
! Package Listings Error: File `{test}(.tex)' not found.
当恢复 LaTeX 更新时,它可以编译成功。
我可以给我的文件添加一个虚假的扩展名但是我宁愿不这样做。
LaTeX 更新后,有没有办法用 LuaTeX 输入无扩展名的文件?
答案1
以下解决方法使没有额外括号的版本在 luatex 和 pdftex 中工作
\documentclass{minimal}
\usepackage{listings}
\makeatletter
\ifx\directlua\@undefined\else
\long\def \IfFileExists@#1#2#3{%
\openin\@inputcheck{#1}%
\ifeof\@inputcheck
\ifx\input@path\@undefined
\def\reserved@a{#3}%
\else
\def\reserved@a{\@iffileonpath{#1}{#2}{#3}}%
\fi
\else
\closein\@inputcheck
\edef\@filef@und{#1 }%
\def\reserved@a{#2}%
\fi
\reserved@a}
\long\def\@iffileonpath#1{%
\let\reserved@a\@secondoftwo
\expandafter\@tfor\expandafter\reserved@b\expandafter
:\expandafter=\input@path\do{%
\openin\@inputcheck{\reserved@b#1}%
\ifeof\@inputcheck\else
\edef\@filef@und{\reserved@b#1 }%
\let\reserved@a\@firstoftwo%
\closein\@inputcheck
\@break@tfor
\fi}%
\reserved@a}
\fi
\makeatother
\begin{document}
\lstinputlisting{test}
\end{document}
这是一个非答案,为了收集可能的更改以使其再次工作,该示例可以简化为这个测试文件
如果当前目录中有一个文件test
(我的只有文本hello
),那么这个纯文本
\newread\tst
\openin\tst=test
\ifeof\tst
\show Y\else \show N
\fi
\bye
与 texlive 2019 luatex
$ luatex cc245
This is LuaTeX, Version 1.10.0 (TeX Live 2019)
restricted system commands enabled.
(./cc245.tex
> the letter Y.
使用 texlive 2019 pdftex
$ pdftex cc245
This is pdfTeX, Version 3.14159265-2.6-1.40.20 (TeX Live 2019) (preloaded format=pdftex)
restricted \write18 enabled.
entering extended mode
(./cc245.tex
> the letter N.
这不是 luatex 最近的改变,2017 年 luatex 也生产
$ /usr/local/texlive/2017/bin/x86_64-cygwin/luatex cc245
This is LuaTeX, Version 1.0.4 (TeX Live 2017)
restricted system commands enabled.
(./cc245.tex
> the letter Y.
但是尽管这里的行为不同,旧的乳胶代码或多或少意外地最终包含了该文件,但新的代码看到ifeof为真,因此不会加载该文件。
我们现在可能可以检测到这一点,我们可以看到这种行为,但我现在无法建议立即修复。
此版本在 luatex 中的工作方式相同(并指出在 latex 中获得一致行为的方法)
\newread\tst
\ifx\directlua\undefined
\openin\tst=test
\else
\openin\tst={test}
\fi
\ifeof\tst
\show Y\else \show N
\fi
\bye