这是一个大问题。当使用"--interaction=batchmode"
mae4ht 选项来减少终端上打印的内容量时,我发现如果发生编译错误,Make 不会停止并转到下一个文件。只有在使用此选项时才会发生这种情况。
如果没有这个选项,make 就会在出现错误时停止,这正是我想要的。
我比较了pdflatex
使用相同选项时的行为,我发现 pdflatex 确实会向 shell 生成一个错误,并且即使使用此选项也会导致它停止。
我无法在这里使用 makefile 来演示这一点,但我使用了 Linux bash 脚本并set -e
在顶部使用,它表示当其中的一个命令生成错误时停止脚本。然后制作了一个包含错误的坏 tex 文件。然后在脚本中放入 2 个编译命令。因此,人们会期望只有第一个命令运行,而不会运行第二个命令。对吗?这就是 的情况pdflatex
。
但make4ht
它继续运行并执行两个编译命令。这意味着它没有产生错误。
如果我删除“--interaction=batchmode”,那么脚本就会在错误处停止。
这是 MWE。首先是出现错误的 latex 文件foo.tex
\documentclass[letterpaper,12pt,reqno]{amsart}
\begin{document}
%\begin{table}[h]
A
\end{table}
\end{document}
这是build.sh
pdflatex 的。我看到它运行第一个pdflatex
命令而不是第二个命令,这正是我想要的
#!/bin/bash
set -e
# Any subsequent(*) commands which fail will cause the shell script to exit immediately
echo "command which will cause error"
pdflatex -interaction=batchmode foo.tex
echo "If you see this message, then Why did the script not exit??"
echo "This should never get here"
pdflatex -interaction=batchmode foo.tex
现在./build.sh
给出
>./build.sh
command which will cause error
This is pdfTeX, Version 3.141592653-2.6-1.40.24 (TeX Live 2022) (preloaded format=pdflatex)
restricted \write18 enabled.
entering extended mode
>
你看,它只运行一次。(由于使用是可以的,所以屏幕上没有输出-interaction=batchmode
)
现在比较一下 tex4ht 的情况。以下是脚本
#!/bin/bash
set -e
# Any subsequent(*) commands which fail will cause the shell script to exit immediately
echo "command which will cause error"
make4ht -ulm default -a debug foo.tex "mathjax,htm" "-cunihtf -utf8" "" "--interaction=batchmode"
echo "If you see this message, then Why did the script not exit??"
echo "This should never get here"
make4ht -ulm default -a debug foo.tex "mathjax,htm" "-cunihtf -utf8" "" "--interaction=batchmode"
现在
>./build.sh
command which will cause error
[INFO] mkparams: Output dir:
[INFO] mkparams: Compiler: dvilualatex
[INFO] mkparams: Latex options: -jobname='foo' --interaction=batchmode
....
This is LuaTeX, Version 1.15.1 (TeX Live 2023/dev)
restricted system commands enabled.
[INFO] mkutils: Parse LG
[INFO] make4ht-lib: parse_lg process file: foo.htm
[INFO] make4ht-lib: parse_lg process file: foo.htm
[WARNING] domfilter: DOM parsing of foo.htm failed:
[WARNING] domfilter: ...ive/2022/texmf-dist/tex/luatex/luaxml/luaxml-mod-xml.lua:175: Unbalanced Tag (/figure) [char=609]
....
[STATUS] make4ht: Conversion finished
If you see this message, then Why did the script not exit??
This should never get here
[INFO] mkparams: Output dir:
[INFO] mkparams: Compiler: dvilualatex
[INFO] mkparams: Latex options: -jobname='foo' --interaction=batchmode
...
[INFO] mkutils: Parse LG
[INFO] make4ht-lib: parse_lg process file: foo.htm
.....
[STATUS] make4ht: Conversion finished
>
你看,它没有停止!它运行了两次编译命令。当然,如果我删除,"--interaction=batchmode"
那么脚本将在错误处停止。
上述情况导致我的递归 make now 继续运行,即使其中一个文件发生错误,而我却不知道。所以我"--interaction=batchmode"
暂时删除它。
我喜欢使用它,因为它减少了屏幕输出量,使得长时间构建时更容易看到东西。
如何在使用“--interaction=batchmode”dvilualatex 出现错误时让 tex4ht 停止,, like pdflatex does? It seems
这种模式下不会抛出错误?
TL 2022
答案1
您正在使用的-a debug
参数用于调试,而不是常规使用。请改用类似的参数-a warning
。它不会打印 LateX 的完整输出,但会显示所有错误和警告。此外,我会使用该-m draft
参数,因为它只需要运行一次 LaTeX,以节省一些时间。因此,您的构建文件可能如下所示:
#!/bin/bash
set -e
# Any subsequent(*) commands which fail will cause the shell script to exit immediately
echo "command which will cause error"
make4ht -ulm draft -a warning foo.tex "mathjax,htm" "-cunihtf -utf8" "" ""
echo "If you see this message, then Why did the script not exit??"
echo "This should never get here"
make4ht -ulm draft -a warning foo.tex "mathjax,htm" "-cunihtf -utf8" "" ""
它将产生以下输出:
command which will cause error
[ERROR] htlatex: Compilation errors in the htlatex run
[ERROR] htlatex: Filename Line Message
[ERROR] htlatex: ./foo.tex 5 Extra \endgroup.
[ERROR] htlatex: ./foo.tex 5 LaTeX Error: \begin{document} ended by \end{table}.
[ERROR] htlatex: ./foo.tex 5 Extra \endgroup.
[WARNING] domfilter: DOM parsing of foo.htm failed:
[WARNING] domfilter: /home/michal/texmf/scripts/lua/LuaXML/luaxml-mod-xml.lua:175: Unbalanced Tag (/figure) [char=609]
可以看到,出现错误之后就无法继续了。