用例:用 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}