当 biblatex 和 hyperref 包含在类中时,make4ht 会发现错误

当 biblatex 和 hyperref 包含在类中时,make4ht 会发现错误

我创建了以下类文件:

\ProvidesClass{myarticle}[Test class]
\ExecuteOptions{}
\LoadClass{article}
\RequirePackage[backend=biber,style=authoryear]{biblatex}
\PassOptionsToPackage{hyphens}{url}
\RequirePackage[breaklinks=true]{hyperref}

并在下面的文档中使用它:

\documentclass{myarticle}
\title{Test article}
\author{Test}
\begin{document}
\maketitle
Test
\end{document}

编译它时make4ht出现以下错误信息:

[ERROR]   htlatex: Compilation errors in the htlatex run
[ERROR]   htlatex: Filename Line    Message
[ERROR]   htlatex: ./article.tex    8    Package biblatex Error: Patching 'ifthen' package failed.
[ERROR]   htlatex: Compilation errors in the htlatex run

.log 文件的一部分如下:

) (/usr/share/texlive/texmf-dist/tex/generic/tex4ht/html5.4ht
version 2021-01-27-14:11
))

! Package biblatex Error: Patching 'ifthen' package failed.

See the biblatex package documentation for explanation.
Type  H <return>  for immediate help.
 ...

l.8 \begin{document}

问题出在哪里?如何解决或避免?

答案1

这是因为当前版本的make4ht(和htlatex)tex4ht.sty在类加载后加载包。这导致一些 TeX4ht 配置文件未加载,即修补早期包补丁的文件。在您的情况下hyperref-hooks.4htbiblatex-hooks.4ht。这些对于正确支持这些包是必需的。

这是用于加载 TeX4ht 和处理后的 TeX 文件的命令:

Make.latex_command = "${htlatex} --interaction=${interaction} ${latex_par} '\\makeatletter"..
"\\def\\HCode{\\futurelet\\HCode\\HChar}\\def\\HChar{\\ifx\"\\HCode"..
"\\def\\HCode\"##1\"{\\Link##1}\\expandafter\\HCode\\else"..
"\\expandafter\\Link\\fi}\\def\\Link#1.a.b.c.{\\g@addto@macro"..
"\\@documentclasshook{\\RequirePackage[#1,html]{tex4ht}${packages}}"..
"\\let\\HCode\\documentstyle\\def\\documentstyle{\\let\\documentstyle"..
"\\HCode\\expandafter\\def\\csname tex4ht\\endcsname{#1,html}\\def"..
"\\HCode####1{\\documentstyle[tex4ht,}\\@ifnextchar[{\\HCode}{"..
"\\documentstyle[tex4ht]}}}\\makeatother\\HCode ${tex4ht_sty_par}.a.b.c."..
"\\input \"\\detokenize{${tex_file}}\"'"

该代码最初来自htlatex。重要的部分是:

\\g@addto@macro"..
    "\\@documentclasshook{\\RequirePackage[#1,html]{tex4ht}${packages}}

它添加\RequirePackage{tex4ht}\documentclasshook。问题是执行此钩子时为时已晚。如今,我们可以使用新的 LaTeX 钩子机制在加载类之前执行代码。 的开发版本make4ht已经修复了这个问题,但您可以使用构建文件使用它make4ht

Make.latex_command = "${htlatex} --interaction=${interaction} ${latex_par} '\\makeatletter"..
"\\def\\HCode{\\futurelet\\HCode\\HChar}\\def\\HChar{\\ifx\"\\HCode"..
"\\def\\HCode\"##1\"{\\Link##1}\\expandafter\\HCode\\else"..
"\\expandafter\\Link\\fi}\\def\\Link#1.a.b.c.{\\AddToHook"..
"{class/before}{\\RequirePackage[#1,html]{tex4ht}${packages}}"..
"\\let\\HCode\\documentstyle\\def\\documentstyle{\\let\\documentstyle"..
"\\HCode\\expandafter\\def\\csname tex4ht\\endcsname{#1,html}\\def"..
"\\HCode####1{\\documentstyle[tex4ht,}\\@ifnextchar[{\\HCode}{"..
"\\documentstyle[tex4ht]}}}\\makeatother\\HCode ${tex4ht_sty_par}.a.b.c."..
"\\input \"\\detokenize{${tex_file}}\"'"

修改后的代码如下:

\\AddToHook"..
"{class/before}{\\RequirePackage[#1,html]{tex4ht}${packages}}

使用以下方法编译您的文件:

make4ht -e build.lua article.tex

编译时应该不会出现错误。

相关内容