如何控制 tex4ht 用于拆分子小节的 HTML 文件的名称?

如何控制 tex4ht 用于拆分子小节的 HTML 文件的名称?

我正在尝试在单独的子部分中创建指向目标的自己的链接。(我有不能使用 tex4ht 自己的链接的原因,因为在使用单独的文件进行拆分时它不起作用。说来话长。我报告了这个问题,但无法使用 进行更正/修复xr-hyper

接下来,一切都很好地分为subsection级别,因为 tex4ht 使用名称格式insuNNN.htm作为文件名,其中主文档是计数器index.texNNN它会按顺序递增整个文档中有多少个小节。

因此,通过在此级别进行拆分,我能够找出要使用的正确的 HTML 文件名。

当我想在较低级别进行拆分时,会出现问题。在subsubsection级别上。

NNNNtex4ht 由于某种原因,对subsection和 也使用相同的计数器subsubsection

它会不断增加计数器。因此,如果subsection文件中有 10 个insu10.htm,则下一个subsubsection将转到文件insu11.htm

因此,我的程序subsubsection现在无法确定文件名是什么,因为它不知道之前有多少个子部分需要补偿,所以计算错误。

如果 tex4ht 使用了单独的计数器subsubsection,那么就能够找出文件名并添加正确的链接。

请注意,tex4ht 使用inseMMM.htm部分。但使用insuNNN.htm格式来表示子部分以及子子部分文件名。这就是主要问题。

我的问题是,假设我想在subsubsection级别上进行拆分(即 split=5),是否可以告诉 tex4ht 对这个级别使用一个计数器,并且不是与子部分计数器共享吗?

如果是这样,那么我的程序将能够确定正确的文件名并正确地为每个问题添加链接。

这是 MWE

\documentclass{book}

\begin{document}

\ifdefined\HCode 
  see problem \HCode{<a href="insu1.htm#1">1</a>} and problem \HCode{<a href="insu2.htm#2">2</a>}
  and problem \HCode{<a href="insu3.htm#3">3</a>}
\fi 

\chapter{this is chapter 1} 
\section{my first section} 
\subsection{my first subsection}
\subsubsection{my first subsubsection}
\ifdefined\HCode 
\HCode{<a id="1"></a>} 
\fi 
      this is problem 1
   
\section{my first section} 
\subsection{my second subsection}
\subsubsection{my second subsubsection}
\ifdefined\HCode 
\HCode{<a id="2"></a>} 
\fi 

      this is problem 2


\chapter{this is chapter 2} 
\section{my first section}
\subsection{my first subsection}
\subsubsection{my first subsubsection}
\ifdefined\HCode 
\HCode{<a id="3"></a>} 
\fi 

      this is problem 3
   
\end{document}

使用以下方式编译

make4ht -ulm default -a debug index.tex 'htm,5'

现在链接到1关闭了 1,链接2关闭了 2,3现在关闭了 3,依此类推。

例如,到第一个小节的链接insu1.htm应该是insu2.htm因为 texh4t 用于insu1.htm中间的subsection

由于文档非常复杂并且不知道在不同的地方使用了多少个小节来补偿计数器漂移,因此无法在程序中计算出这些偏移量。

但是如果计数器对于每个都是连续的subsubsection,无论subsection它们如何,那么就可以做我想做的事情,我只需有一个全局计数器,每次添加新的子部分时我都会增加它,这将使生活变得简单得多。

是否可以告诉 tex4ht 或修复 tex4ht 使用不同的/唯一的计数器进行subsubsection拆分而不是共享计数器subsection

我认为 tex4ht 应该这样做

inchNNN.htm对于章节(它已经这样做了)

inseNNN.htm对于部分(它已经这样做了)

insuNNN.htm对于小节(它已经这样做了)

insuuNNN.htmsubsubsections这是我建议的新更改)。目前 tex4ht 使用与 相同的文件名格式和计数器subsection

上述更改非常有用,因为它可以更轻松地从外部添加到文档中特定子部分的链接。

TL 2022

答案1

编辑:

TeX4ht 会缩短生成的文件名。它使用 的前两个字符\jobname和节类型的前两个字符。数字后缀附加到这些字符以确保名称唯一。在本例中,\subsection\subsubsection都缩写为su。您可以使用此配置文件将完整的节类型名称保留在文件名中:

\Preamble{xhtml}
\catcode`\:=11
\def\fx:pt#1xxx!*?: {%
   \expandafter\ifx \csname big:#1:\endcsname\relax
         \expandafter\gHAssign\csname big:#1:\endcsname  0  \fi
   \expandafter\gHAdvance\csname big:#1:\endcsname  1
   \edef\big:fn{#1\csname big:#1:\endcsname}}
\catcode`\:=12
\begin{document}
\EndPreamble

这是对内部 TeX4ht 命令的重新定义,用于缩短节类型名称。在此版本中,它仅保留全名。

这些是结果文件名:

./index.htm
./inchapter1.htm
./inchapter2.htm
./insection1.htm
./insection2.htm
./insection3.htm
./insubsection1.htm
./insubsection2.htm
./insubsection3.htm
./insubsubsection1.htm
./insubsubsection2.htm
./insubsubsection3.htm
./insubsubsection4.htm

我还向 TeX4ht 源添加了该cut-fullname选项,因此在 TeX Live 更新后,可以使用以下命令获得相同的效果:

 $ make4ht -ulm default -a debug index.tex 'htm,5,cut-fullname'

原来的:

这个问题的正确解决方法是使用选项sec-filename。它根据当前顶部部分标题命名文件:

 $ make4ht -ulm default -a debug index.tex 'htm,5,sec-filename'

它会生成以下文件:

./index.htm
./myfirstsection.htm
./myfirstsection1.htm
./myfirstsection2.htm
./myfirstsubsection.htm
./myfirstsubsection1.htm
./myfirstsubsubsection.htm
./myfirstsubsubsection1.htm
./mysecondsubsection.htm
./mysecondsubsubsection.htm
./mysecondsubsubsection1.htm
./thisischapter1.htm
./thisischapter2.htm

如您所见,它使用章节标题。它会删除空格和其他非字母数字字符,并且如果已存在同名文件,它会添加数字后缀,以确保文件名唯一。

谢谢您,您不需要在每次添加新部分时更新链接(除非已经有一个同名的链接)。

相关内容