以下内容使用 编译make4ht
但htlatex
会引发一些错误。我尝试使用 make4ht 处理多个文件并使用xr-hyper
和在它们之间建立链接hyperref
。在某些情况下,我想链接到特定的部分、方程式等,但在其他情况下,我只想链接到文档。为此,我设置了一个典型的文档,如下所示,保存为main.tex
\usepackage{amsmath}
\usepackage{xr-hyper}
%hyperlinks and referencing
\usepackage{hyperref}
\usepackage[capitalize,nameinlink,noabbrev]{cleveref}
\title{Main file}
\begin{document}
\maketitle \label{main file}
\section{First Section}
\begin{equation} \label{equation}
\int f(x) dx
\end{equation}
\end{document}
标题后面的标签的目的是为了可以从其他文件链接到它,而无需指定特定的部分、方程或定理等。在另一个文件中,如果我有类似
\usepackage{amsmath}
\usepackage{xr-hyper}
%hyperlinks and referencing
\usepackage{hyperref}
\usepackage[capitalize,nameinlink,noabbrev]{cleveref}
\externaldocument[main-]{main}
\begin{document}
\hyperref[main-main file]{the main file}
\end{document}
然后htlatex
给出以下形式的错误
[STATUS] make4ht: Conversion started
[STATUS] make4ht: Input file: ref.tex
[ERROR] htlatex: Compilation errors in the htlatex run
[ERROR] htlatex: Filename Line Message
[ERROR] htlatex: ./ref.tex 34 Argument of \xr:rEfLiNK has an extra }.
[ERROR] htlatex: ./ref.tex 34 Paragraph ended before \xr:rEfLiNK was complete.
这不是只有一个文件的问题,即使有错误,生成的输出也符合预期,但在有大量文件相互引用的示例中,错误似乎太多,make4ht 无法处理。 上述示例与 配合得很好pdflatex
。
如果对公式或部分进行标记和引用,而不是在标题后使用标签,则不会出现任何问题。
有没有更好的方法来链接到整个文档,而不是使用页面顶部的标签?我想我上面写的不是最佳实践,因为\label
标题后面实际上没有任何可以引用的内容。
答案1
这并不那么简单。TeX4ht 需要为文档插入标签的目标链接,这通常在分段命令或其他声明交叉引用对象的命令中执行。当您\label
在文档开头使用时,没有调用这样的命令,因此没有目标。另一个问题是,当您使用 Hyperref 时,每个交叉引用都需要分配一些特殊的宏。
我将通过以下方式更改您的主文档:
\documentclass{article}
\usepackage{amsmath}
\usepackage{xr-hyper}
%hyperlinks and referencing
\usepackage{hyperref}
\usepackage[capitalize,nameinlink,noabbrev]{cleveref}
\makeatletter
\newcommand\currentdoc[1]{\edef\@currentlabel{#1}\label{#1}}
\makeatother
\title{Main file}
\begin{document}
\maketitle \currentdoc{main file}
\section{First Section}
\begin{equation} \label{equation}
\int f(x) dx
\end{equation}
\end{document}
如你所见,我把 first 改为\label
。\currentdoc
现在在配置文件中,你可以重新定义此命令以获得 TeX4ht 所需的格式:
\Preamble{xhtml}
\makeatletter
\catcode`\:=11
\renewcommand\currentdoc[1]{%
% the value of \@currentlabel is not important in our case, so we can just use the parameter
\edef\@currentlabel{#1}%
% these two are needed to fix hyperref errors
\gdef\NR:Title{\a:newlabel{#1}}%
\gdef\NR:Type{doc}%
% insert link destination to the document
\AnchorLabel%
% and now you can call label
\label{#1}%
}
\catcode`\:=12
\makeatother
\begin{document}
\EndPreamble
我对代码添加了一些注释,希望它是有意义的。
现在您可以使用以下命令编译主文件:
$ make4ht -c config.cfg main.tex
此后,该main.aux
文件就可以安全地被其他文件包含进去了。