当文件丢失时,如何让 \InputIfFileExists 强制结束编译并显示描述性错误消息?

当文件丢失时,如何让 \InputIfFileExists 强制结束编译并显示描述性错误消息?

下面的消息告诉我,Process exited normally尽管没有任何名为 的文件,但输出的 PDF 文件已损坏dummy

因此,我需要出现编译停止错误,并显示有关缺少输入文件的消息。

\documentclass{article}
\begin{document}
    \InputIfFileExists{dummy}{}{}
\end{document}

为什么我无法在日志文件中获取预期的以下消息?

错误:缺少文件:dummy

\documentclass{article}
\begin{document}
    \InputIfFileExists{dummy}{}{%
        % https://tex.stackexchange.com/a/377312/2288
        % https://tex.stackexchange.com/a/383190/2288
        \typeout{Error: Missing file: #1}
        \ExitDueToUndefinedControlSequence
    }
\end{document}

答案1

\documentclass{article}

\makeatletter
\newcommand{\thereisnosuchfile}{%
  \@latex@error{No file to input}{The file you asked for doesn't exist}%
}
\makeatother

\begin{document}

\InputIfFileExists{dummy}{}{\thereisnosuchfile}

\input{dummy}

\end{document}

有什么区别?第一种情况不需要输入其他文件名。而第二种情况,只要按回车键就可以输入空.tex文件并退出循环。

! LaTeX Error: No file to input.

See the LaTeX manual or LaTeX Companion for explanation.
Type  H <return>  for immediate help.
 ...                                              
                                                  
l.10 ...tIfFileExists{dummy}{}{\thereisnosuchfile}
                                                  
? 

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

Type X to quit or <RETURN> to proceed,
or enter new name. (Default extension: tex)

Enter file name: <<hit return>>
(/usr/local/texlive/2020/texmf-dist/tex/latex/tools/.tex File ignored)

\stop如果在定义的末尾添加\thereisnosuchfile,则 LaTeX 运行将在按回车键后停止。

一个expl3版本:

\documentclass{article}

\ExplSyntaxOn
\NewDocumentCommand{\saferinput}{m}
 {
  \file_if_exist_input:nF { #1 } { \msg_error:nnn { diaa } { no-file } { #1 } }
 }
\msg_new:nnnn { diaa } { no-file }
 { No~file~'#1' }
 { The~file~'#1'~you~asked~for~does~not~exist }
\ExplSyntaxOff

\begin{document}

\saferinput{dummy}

\end{document}

控制台输出

! Package diaa Error: No file 'dummy'

For immediate help type H <return>.
 ...                                              
                                                  
l.15 \saferinput{dummy}
                       
? h

The file 'dummy' you asked for does not exist

? 

相关内容