make4ht 多个文件超链接问题,文件顶部有标签

make4ht 多个文件超链接问题,文件顶部有标签

以下内容使用 编译make4hthtlatex会引发一些错误。我尝试使用 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文件就可以安全地被其他文件包含进去了。

相关内容