tex4ht
根据剪切级别,可以选择在 html 页面之间创建交叉链接。
当前交叉链接可以创建下一个/上一个/上一个...按钮,并有几个选项可以自定义它们。
我想知道是否有可能 - 而不是这些交叉链接 - 将导航显示为“树”,仅显示当前分支。
例如,假设我们有以下文档结构
文档 - 目录
第 1 章 - 概述
第 1.1 节 - 简介
第 2 章 - 软件
第 2.1 节 - 驱动程序
2.1.1 小节-以太网驱动程序
2.1.2 小节-USB 驱动程序
它tex4ht
用于生成按小节级别拆分的 HTML 页面。
当查看“以太网驱动程序”页面时,我想在顶部看到:
文档 > 2. 软件 > 2.1 驱动程序 > 2.1.1 以太网驱动程序
每个项目都是相关页面的链接。
是否有任何标准方法可以使用 tex4ht 来完成此操作,或者我应该计划进行一些后期处理来手动构建它?
答案1
在 中没有标准方法可以做到这一点tex4ht
,但可以使用一些技巧来实现。尝试以下配置文件:
\Preamble{xhtml}
% \TocAt{likechapter,chapter,likesection,section,likesubsubsection,subsection}
\makeatletter
\def\getsection#1{
\expandafter\def\csname toc#1\endcsname##1##2##3{
\edef\@tempa{##1}
\edef\@tempb{\csname the#1\endcsname}
\ifx\@tempb\@tempa \textgreater ##1\ ##2\fi}
}
\makeatother
\def\resetsections{%
\def\doTocEntry{\ifx\tempa\@empty\fi}
\def\tocpart{}
\def\toclikepart{}
\def\tocchapter{}
\def\toclikechapter{}
\def\tocsection{}
\def\toclikesection{}
\def\tocsubsection{}
\def\toclikesection{}
}
\def\breadcrumbs{%
\bgroup\resetsections\getsection{chapter}\getsection{part}\getsection{section}\getsection{subsection}%
\HCode{<a href="\jobname.html">Main</a>}\IfFileExists{\jobname.4ct}{\input{\jobname.4ct}}{}
\egroup%
}
\Configure{crosslinks*}{}
\Configure{crosslinks+}{\ifvmode\IgnorePar\fi\EndP\HCode{<div class="breadcrumbs">}\breadcrumbs\IgnorePar\HCode{</div>}}{}{}{}
\begin{document}
\EndPreamble
我们使用擦除默认crosslinks
定义,然后我们在配置中\Configure{crosslinks*}{}
请求调用\breadcrumbs
宏。crosslinks+
\breadcrumbs
宏有点 hacking。我们利用由 生成的 TOC 文件tex4ht
,该文件名为\jobname.4ct
。它看起来像这样:
\expandafter\ifx\csname doTocEntry\endcsname\relax \expandafter\endinput\fi
\doTocEntry\tocchapter{1}{\csname a:TocLink\endcsname{2}{x2-10001}{QQ2-2-1}{Overview}}{3}\relax
\doTocEntry\tocsection{1.1}{\csname a:TocLink\endcsname{3}{x3-20001.1}{QQ2-3-2}{Introduction}}{3}\relax
\doTocEntry\tocchapter{2}{\csname a:TocLink\endcsname{4}{x4-30002}{QQ2-4-3}{Software}}{7}\relax
\doTocEntry\tocsection{2.1}{\csname a:TocLink\endcsname{5}{x5-40002.1}{QQ2-5-4}{Drivers}}{7}\relax
\doTocEntry\tocsubsection{2.1.1}{\csname a:TocLink\endcsname{6}{x6-50002.1.1}{QQ2-6-5}{Ethernet driver}}{7}\relax
\doTocEntry\tocsubsection{2.1.2}{\csname a:TocLink\endcsname{7}{x7-60002.1.2}{QQ2-7-6}{USB driver}}{8}\relax
\par
我们调用宏\resetsections
,在其中我们声明可能包含在文件中的.4ct
不执行任何操作的宏,然后使用\getsection
,我们请求测试包含的chapter
、section
和subsection
是否等于当前分段数。如果相等,则打印它们。
示例文件:
\documentclass{book}
\begin{document}
\part{Documentation}
\chapter{Overview}
\section{Introduction}
\chapter{Software}
\section{Drivers}
\subsection{Ethernet driver}
\subsection{USB driver}
hello world
\end{document}
结果: