![htlatex 留下未定义的引用(“??”链接)但 pdflatex 产生正确的输出](https://linux22.com/image/232167/htlatex%20%E7%95%99%E4%B8%8B%E6%9C%AA%E5%AE%9A%E4%B9%89%E7%9A%84%E5%BC%95%E7%94%A8%EF%BC%88%E2%80%9C%3F%3F%E2%80%9D%E9%93%BE%E6%8E%A5%EF%BC%89%E4%BD%86%20pdflatex%20%E4%BA%A7%E7%94%9F%E6%AD%A3%E7%A1%AE%E7%9A%84%E8%BE%93%E5%87%BA.png)
我们有一个大型文档,通过 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.