我正在尝试使用 tex4ht(使用 LibreOffice 语法检查器)编译我的论文的一部分。几周前它运行良好,但现在却失败并出现错误:
! Undefined control sequence.
\H@refstepcounter #1->\sf@Hrefstepcounter
{#1}\@ifundefined {c@sub#1}{}{\if@...
l.42 \centering
它似乎与 subfig 包有关。
我在 Ubuntu 11.04 上使用 TeXLive 2010。
这是我加载 hyperref 的方式的 MWE(照片来自这个维基百科文章):
\documentclass[12pt,a4paper,twoside,openright,titlepage,fleqn,headsepline,headinclude,footinclude]{scrbook}
\usepackage{graphicx}
\usepackage{subfig}
\usepackage[unicode=true,bookmarks=true,bookmarksnumbered=false,bookmarksopen=false,breaklinks=false,colorlinks=true]{hyperref}
\usepackage[all]{hypcap}
\begin{document}
\begin{figure}
\centering
\subfloat[Who's that?]{\includegraphics[width=0.45\textwidth]{Einstein_1921_portrait2.jpg}}%
\qquad
\subfloat[Who's that?]{\includegraphics[width=0.45\textwidth]{Einstein_1921_portrait2.jpg}}
\caption{A famous scientist and his twin brother.}
\end{figure}
\end{document}
答案1
据我所知,存在不止一个问题。
正如日志中看到的,hyperref 提前停止了。这意味着很多命令未定义。其中一个现在未定义的命令是,
\H@refstepcounter
因此 subfig 的代码\let\sf@Hrefstepcounter\H@refstepcounter \def\H@refstepcounter#1{%
\makeatletter\let\H@refstepcounter\refstepcounter
失败。通过在序言中使用,可能很容易解决这个问题。caption 没有意识到 hyperref 在测试时已提前停止
\hyper@makecurrent
,而 hyperref 的 tex4ht 样式 (hyperref.4ht) 对其进行了定义。因此 caption 假设存在命令 (measuring@true
),但这些命令实际上是未定义的。
我想不出一个合理的方法来解决这个问题。在这两种情况下,我认为使用内部的其他包的命令不应该假设它们存在,而应该实际测试其存在性——名称总是有可能发生变化的。
答案2
看起来子图和氢化物与 TeX4ht 不兼容。如果我加载子图改为(改为\subfloat
)\subfigure
并删除对氢化物,文档编译。