使用 tex4ht 在 HTML 中创建永久链接

使用 tex4ht 在 HTML 中创建永久链接

用例:用 LaTeX 编写的开发人员指南的 HTML 版本和 HTML 中的知识库文章,它们应该能够链接到开发人员指南 HTML 版本中的某个部分、图表、代码片段等。

当开发人员指南更新(例如插入新部分)时,知识库文章中的链接仍应指向正确的条目。

更具体地说,考虑以下输入

\documentclass{book}
\usepackage{hyperref}

\begin{document}
\tableofcontents

\section{First}\label{sec:first}
A first section \autoref{sec:first}.

\section{Second}\label{sec:second}
A second section \autoref{sec:second}.

\end{document}

使用命令将其转换为 HTMLhtlatex test.tex "xhtml,3,frames"会生成以下文件:

  • 第一部分:testse1.html
  • 第二部分:testse2.html

如果我现在插入一个部分

\documentclass{book}
\usepackage{hyperref}

\begin{document}
\tableofcontents

\section{First}\label{sec:first}
A first section \autoref{sec:first}.

\section{Inserted}\label{sec:inserted}
An inserted section \autoref{sec:inserted}

\section{Second}\label{sec:second}
A second section \autoref{sec:second}.

\end{document}

并使用相同命令再次处理,文件testse2.html突然包含“插入”部分,而不再包含“第二”部分。指向“第二”部分的链接必须突然指向testse3.html

该问题不仅适用于页面,也适用于现有页面中的锚点(例如链接到特定图形或代码片段)。

  • 有没有办法配置文件名以匹配\label源文件中使用的文件名
  • 有没有办法以某种方式转储一些输出,使生成的文件和锚点与\label输入文件中使用的 s 相匹配。然后我可能会使用此输出引入可充当“永久链接”的中间链接,或任何其他后处理步骤。
  • 是否有其他机制可以解决这个问题?

答案1

正如 Ulrike 所说,您可以使用,但我会在过程中使用一些自动化,而且,直接在文档中\NextFile插入宏不是一个好主意:tex4ht

\documentclass{book}
\usepackage{hyperref}
\usepackage{mysection}

\begin{document}
%\tableofcontents

\mysection{First}{sec:first}
A first section \autoref{sec:first}. But more interesting stuff is in \autoref{sec:second}

\mysection{Inserted}{sec:inserted}
An inserted section \autoref{sec:inserted}

\mysection{Second}{sec:second}
A second section \autoref{sec:second}.

\end{document}

\mysection命令将\label自动插入,并允许使用命名文件。它在mysection.sty包中定义如下:

\ProvidesPackage{mysection}

\newcommand\mysection[2]{%
    \section{#1}%
  \label{#2}%
}
\endinput

更有趣的是文件mysection.4ht,其中重新定义命令来声明下一个文件名:

\RequirePackage{xstring}
\let\my:section\mysection

\def\strip:sec#1:#2@{#1-#2}
\renewcommand\mysection[2]{%
  \edef\my:label{\detokenize{#2}}
  \edef\my:colon{\detokenize{:}}
  \StrSubstitute\my:label{\my:colon}{-}[\temp]
  \NextFile{\temp.html}
\my:section{#1}{#2}%
}

因为\label包含:字符,这在网络上的文件名中是非法的,所以我们需要用一些安全的东西来替换它,例如-。我们需要使用\detokenize命令,因为文件:中的 catcode 已经更改.4ht

在此处输入图片描述

答案2

您可以使用\NextFile强制下一个文件的名称:

\documentclass{book}
\usepackage{hyperref}
\begin{document}
\tableofcontents

\section{First}\label{sec:first}
A first section \autoref{sec:first}.

\NextFile{secinserted}
\section{Inserted}\label{sec:inserted}
An inserted section \autoref{sec:inserted}


\section{Second}\label{sec:second}
A second section \autoref{sec:second}.
\end{document}

相关内容