htlatex (TeX4HT) 和 cleveref 兼容吗?

htlatex (TeX4HT) 和 cleveref 兼容吗?

简单问题:当我使用cleveref\Cref{}或时,\cref{}我能够编译代码并生成 PDF。当我使用时,htlatex我得到??的是我期望的对象名称和部分编号。

按照 MWE 发现的示例的修改形式 我怎样才能使 cleveref 中的 \cref{foo,bar} 与 htlatex 一起工作?htlatex如下所示,我想弄清楚一起使用和的要求cleveref是什么?我确信在过去几周尝试让它工作时,我偶然发现了成功编译的 html 文件,其中包含或\cref{}命令所需的文本和数字\Cref{},但从未采用稳定可重现的格式。

\documentclass{report}

\ifdefined\HCode
    \usepackage{tex4ht}
    \usepackage[tex4ht]{hyperref}
\else 
    \usepackage{hyperref} 
\fi

\usepackage{etoolbox}

\AtEndPreamble{\usepackage{cleveref}}

\begin{document}
    \section{\label{foo}foo}
    %\cref{bar,baz} - this won't compile but the problem is deeper rooted because cref alone doesn't work.
        %\protect\cref{foo}
        \cref{baz} follows \cref{bar}
    \section{bar}\label{bar}
    \section{baz}\label{baz}
\end{document}

我也尝试过这个例子(稍微修改了一下并加入了解决方案)我怎样才能让 amsthm 和 cleveref 与 htlatex 一起工作?

\documentclass{article}
\usepackage{hyperref}
\usepackage{amsthm}
\AtBeginDocument{\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}

因此,在收集足够的信息来了解为什么这不起作用时,我想知道:

  1. 是否有cleveref类似的选项\usepackage[tex4ht]{hyperref}应该使用

  2. 是否存在已知的错误或兼容性问题 -为什么 htlatex 不能按预期工作?

  3. 是否有一个可以添加到基本且缺失的命令行选项htlatex test.tex(由于参考了我的第二个示例,我对这种可能性表示怀疑。如果这里的解决方案是确保cleveref在序言中最后加载,并且我明显的??出现在实际引用的位置的问题存在,那么我相信它会被跟进。

答案1

我认为你的例子不必要地复杂,这也应该可行:

\documentclass{report}

\usepackage{hyperref} 

\usepackage{cleveref}

\begin{document}
    \section{foo}\label{foo}
    \cref{sec:bar,sec:baz} - this won't compile but the problem is deeper rooted because cref alone doesn't work.
        %\protect\cref{foo}
        \Cref{sec:baz} follows \cref{sec:bar} and \cref{foo}
    \section{bar}\label{sec:bar}
    \section{baz}\label{sec:baz}
\end{document}

cleveref现在做一点技术描述:和的问题tex4htcleveref使用保存的引用类型的信息创建内部引用。此信息保存在宏中\cref@currentlabel,该宏用 声明\protected@edef。这意味着它只在当前组中定义,这不会导致普通 LaTeX 出现问题,但是在 下tex4ht,由于一些重新定义,该宏在组中定义,后来在将信息保存到文件时未定义aux。我们需要用 替换\protected@edef\protected@xdef以便信息在当前组之外可用。

解决方案是为 制作配置文件cleveref。使用时cleveref.4ht会自动包含此文件:tex4htcleveref

\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}
    }%
\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@edef\cref@currentlabel{%
    [\@tempa][\arabic{#2}][\cref@result]%
    \csname p@#2\endcsname\csname the#2\endcsname}}%

将文件放入cleveref.4ht文档目录中。

结果:

在此处输入图片描述

相关内容