htlatex 留下未定义的引用(“??”链接)但 pdflatex 产生正确的输出

htlatex 留下未定义的引用(“??”链接)但 pdflatex 产生正确的输出

我们有一个大型文档,通过 pdflatex 和 htlatex 运行。pdflatex 输出完全正常。htlatex 输出也正常(它包含所有图像等),除了 一些交叉引用不会创建链接,而只是创建一个“??”,就好像引用未定义一样(但它不能在 tex 源中未定义,因为链接/交叉引用已正确插入 PDF 中)。

这种情况只发生在这份文档中,所以我猜想在 300 页的某个地方存在一些小问题,但我真的不知道从哪里开始查找。(即使是英文翻译也行,而且应该包含完全相同的参考资料,名称也完全相同!)

所以,是否存在已知的模式,即 htlatex 无法解析交叉引用但 pdflatex 可以?

系统:Windows XP 上的 MikTeX 2.6

使用的 pdfLaTex 命令:

pdflatex -output-format=pdf -interaction=nonstopmode myfile.tex
pdflatex -output-format=pdf -interaction=nonstopmode myfile.tex
// Note that the references already work after two pdflatex runs
pdflatex -output-format=pdf -interaction=nonstopmode myfile.tex

使用的 htlatex 命令:(注意,这\"是为了让 MikTeX 的 htlatex.exe 正常运行)

htlatex.exe \"myfile.tex\" \"html,5\" \"\" \"\" \"-interaction=nonstopmode\"

编辑:虽然下面的命令仍然出现在文档中,但进一步的实验表明,直接使用 \namref 或 \autoref 也只会产生??

所有链接的创建方式都相同。它们使用名为 的自定义宏\KShortLink来插入格式化的链接。宏定义如下:

\newcommand{\KShortLink}[1]{\emph{``\nameref{#1}''} (\KLngChapName\ref{#1}\KLngOnPage\pageref{#1})}

其他部分如下:

\newcommand{\KTranslateTable}[3]{
    \iflanguage{ngerman}{
        \newcommand{#1}{#2}
    }{}
    \iflanguage{english}{
        \newcommand{#1}{#3}
    }{}
}

\KTranslateTable{\KLngChapName}{Kapitel\ }{Chapter\ }
\KTranslateTable{\KLngOnPage}{\ auf Seite\ }{\ on page\ }

有趣的是,英文版似乎可以工作,而德文版则只是创建??

答案1

找到问题的关键是系统地减少有问题的文件(在我已经花了 2 个小时试图找出从文档的哪部分开始之后,又花了大约 3 个半小时 - 这就是为什么我在继续分析我的问题之前问了这个问题。)

事实证明,如果您指定任何\hypertarget包含非 ASCII 字符的标签,htlatex(或 tex4ht 或 latex 本身,无论什么)都会完全失效!(有人在标签中使用了变音符号 - ü -。)但是,pdfLaTeX 可以很好地处理包含变音符号的标签!

有趣的是,不仅包含无效字符的链接被搞乱了,而且其他任意链接也一样。(这就是为什么我一开始就找不到标签的原因——因为它破坏了生成的 HTML 文件中 80% 的链接。)

一个小例子,它会用 pdfLaTeX 生成正确的 PDF,但会弄乱 htlatex 的链接:

\documentclass[fontsize=12pt,paper=a4]{scrbook}
\usepackage[T1]{fontenc}
\usepackage[latin10]{inputenc}
\usepackage[ngerman]{babel}
\usepackage{longtable}
\usepackage{hyperref}

\begin{document}
\chapter{One}
\hypertarget{labelOne}{Link Text for One}

Some Text ...

\section{Sec X}
\hypertarget{labelTwö}{Link Text Two}

Lorem Ipsum etc.

\section{The Links}

First \hyperlink{labelTwö}{this links to link number Two} and then 
second \hyperlink{labelOne}{this link to One}.
Done.

\end{document}

日志输出确实包含两条消息。在错误标签之前! LaTeX Error: Missing \begin{document} in '.还有一个。! Missing \endcsname inserted.

相关内容