我发现 tex4ht 不能与 cleveref 和 amsthm 配合使用。我刚刚修改了 HWE一个旧帖子:
\documentclass{article}
\usepackage{hyperref}
\usepackage{amsthm}
\usepackage{cleveref}
\newtheorem{thm}{Theorem}[section]
\newtheorem{rmk}[thm]{Remark}
\begin{document}
\begin{rmk}\label{test}
Test content
\end{rmk}
See the test found in \cref{test}
\end{document}
当我使用 htlatex 编译它时,它会抱怨:
! Argument of \eorem:syle has an extra }.
<inserted text>
\par
l.8 \begin{rmk}
\label{test}
这个答案建议\AtBeginDocument
。但是,\cref
将被错误地渲染为??
。我想知道如何解决这个问题。
答案1
问题是 Cleveref 重新定义了很多其他宏和包,这与 TeX4ht 冲突。它甚至为 添加了可选参数\refstepcounter
,但 TeX4ht 无法正常使用。所以我们需要再次重新定义这些重新定义的宏,并插入 TeX4ht 指令,这些指令对于其引用系统的工作必不可少。
首先,我们需要保留 的原始版本。这需要在加载\refstepcounter
之前完成。TeX4ht 可以使用该文件修改包加载:cleveref.sty
cleveref-hooks.4ht
\let\HyOrg@addtoreset\@addtoreset
% fixes for \refstepcounter
\let\orig:refstepcounter\refstepcounter
\let\orig:@thm\@thm
\:AtEndOfPackage{%
\let\refstepcounter\orig:refstepcounter
\let\@thm\orig:@thm
}
我们基本上重置了 Cleveref 所做的修改。接下来,我们必须在 中添加对可选参数和\refstepcounter
的支持:\refstepcounter
amsthm
cleveref.4ht
% orig:refstepcounter is saved in cleveref-hooks.4ht
\let\cref@old@refstepcounter\orig:refstepcounter%
\def\refstepcounter{%
\@ifnextchar[{\refstepcounter@optarg}{\refstepcounter@noarg}%]
}%
% fix for TeX4ht label mechanism
\def\cref:currentlabel#1{\let\cnt:currentlabel\@currentlabel
\def\:@currentlabel{\ifx \cnt:currentlabel\@currentlabel
\expandafter\the\csname c@#1\endcsname\else \@currentlabel\fi}%
%
\anc:lbl r{#1}%
}
\def\refstepcounter@noarg#1{%
\cref@old@refstepcounter{#1}%
\cref@constructprefix{#1}{\cref@result}%
\@ifundefined{cref@#1@alias}%
{\def\@tempa{#1}}%
{\def\@tempa{\csname cref@#1@alias\endcsname}}%
\protected@xdef\cref@currentlabel{%
[\@tempa][\arabic{#1}][\cref@result]%
\csname p@#1\endcsname\csname the#1\endcsname}
\cref:currentlabel{#1}%
}%
\def\refstepcounter@optarg[#1]#2{%
\cref@old@refstepcounter{#2}%
\cref@constructprefix{#2}{\cref@result}%
\@ifundefined{cref@#1@alias}%
{\def\@tempa{#1}}%
{\def\@tempa{\csname cref@#1@alias\endcsname}}%
\protected@xdef\cref@currentlabel{%
[\@tempa][\arabic{#2}][\cref@result]%
\csname p@#2\endcsname\csname the#2\endcsname}
\cref:currentlabel{#2}%
}%
\ifdefined\@firstoffive\else%
\def\@firstoffive#1#2#3#4#5{#1}
\fi
\def\:tempa#1#2{\bgroup%
\def\rEfLiNK##1##2{\Link{##1}{}}%
\expandafter\expandafter\expandafter\@firstoffive\csname r@#2\endcsname{}{}{}{}{}%
\o:@@@setcref:{#1}{#2}%
\EndLink\egroup%
}%
\HLet\@@@setcref=\:tempa
\@ifpackageloaded{amsthm}{
\let\cref@thmnoarg\@thm%
\def\@thm{\@ifnextchar[{\cref@thmoptarg}{\cref@thmnoarg}}%]
\def\:tempb[#1]#2#3#4{%
% call original amsthm theorem definition, but
% disable \:thm in order to prevent infinite loop
\let\:thm\:gobble
\cref@thmnoarg{#2}%
\o:cref@thmoptarg:[#1]{#2}{#3}{#4}
}%
\HLet\cref@thmoptarg\:tempb
}{}%
\Hinput{cleveref}
\endinput
通过这些修复,编译可以正常工作并创建正确的 HTML: