最近更新 LaTeX 后,使用 LuaTeX 输入无扩展名的文件失败

最近更新 LaTeX 后,使用 LuaTeX 输入无扩展名的文件失败

在最近(上周)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

相关内容