tex4ht:cleveref 和 amsthm 不兼容?

tex4ht:cleveref 和 amsthm 不兼容?

我发现 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.stycleveref-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的支持:\refstepcounteramsthmcleveref.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:

在此处输入图片描述

相关内容