hyperref 包的 destlabel 选项不能与 htlatex 结合使用

hyperref 包的 destlabel 选项不能与 htlatex 结合使用

这与我的上一个问题。用例仍然相同:我想将文档转换为 HTML,并为生成的 HTML 中的链接赋予永久字符,即使文档结构发生变化也是如此。这允许从外部源链接到生成的 HTML,并且即使我更新生成的 HTML 时这些链接仍有效。

将 Latex 文档转换为 PDF 时,可以使用包destlabel=true的选项来实现这一点hyperref。例如,在以下代码中

\documentclass{book}
\usepackage[destlabel=true]{hyperref}
\begin{document}
\tableofcontents
\listoffigures
\listoftables
\section{First section}\label{first_section}
Reference to the \autoref{first_section}

\begin{figure}[h]
  \caption{My invisible figure}
  \label{invisible_figure}
\end{figure}

Reference to the \autoref{invisible_figure}

\begin{table}
  \caption{My invisible table}
  \label{invisible_table}
\end{table}

Reference to the \autoref{invisible_table}
\end{document}

文本、目录、图片列表等中的链接均使用输入文件中指定的标签。例如,图片列表中的链接指向test.pdf#invisible_figure

但是,当您通过 运行此操作时htlatex test.tex "xhtml,3",相同的链接将变成testse1.html#x5-40011

有没有办法用x5-40011输入文件中的标签内容替换该部分?或者用我能从输入文件中控制的其他内容来赋予它永久字符?

答案1

可以html使用以下方法对文件进行后处理make4ht 过滤器我们可以id在aux文件中找到标签对应的属性:

\newlabel{invisible_figure}{{\rEfLiNK{x5-40011}{\csname :autoref\endcsname{figure}1}}{\rEfLiNK{x5-40011}{\csname :autoref\endcsname{figure}9}}{\rEfLiNK{x5-40011}{\csname :autoref\endcsname{figure}My invisible figure}}{figure.1}{}}

使用make4ht,我们可以使用以下函数来解析aux文件中的标签:

local labels = {} 

Make:add("parseaux", function(params)
  local auxname = params.input .. ".aux"
  for line in io.lines(auxname) do
    line:gsub("newlabel%{([^%}]+)%}%{%{.rEfLiNK%{([^%}]+)", function(label,link)
      -- insert links to table so we can search for labels
      labels[link] = label
    end )
  end
end)

Make:parseaux {} 

gsub函数有一个很有用的功能,它可以使用函数来处理正则表达式匹配,因此我们将在示例中广泛使用它。在此代码片段中,我们只是将标签连同为它们生成的链接一起保存到表中tex4ht

然后我们需要处理所有html文件并替换labels表中保存的链接idhref属性:

local function replace_labels(html)
  -- match element start
  html = html:gsub("<([a-z0-9A-Z]+)(%s+[^%>]-)>", function(element, attr)
    -- process attributes
    local attr = attr:gsub('([a-z]+)%s*=%s*"([^%"]-)"', function(k,v)
       -- process only id or href attributes
       if k=="id" or k == "href" then
         -- support for links with filenames, we are interested only in the part after '#'
         v = v:gsub("([^%#]+)$", function(link)
           local x = labels[link] or link
           return x
         end)
       end
      return string.format('%s="%s"',k,v)
    end)
    return string.format('<%s %s>', element,  attr)
  end)
  return html
end
local process = filter{replace_labels}

Make:match("html$", process)

这是完整的sample.mk4文件:

local filter = require "make4ht-filter"

-- add command for parsing the aux file for labels and corresponding id
-- aux file contains records similar to:
-- \newlabel{first_section}{{\rEfLiNK{x1-40000.1}
local labels = {} 

Make:add("parseaux", function(params)
  local auxname = params.input .. ".aux"
  for line in io.lines(auxname) do
    line:gsub("newlabel%{([^%}]+)%}%{%{.rEfLiNK%{([^%}]+)", function(label,link)
      -- insert links to table so we can search for labels
      labels[link] = label
    end )
  end
end)

if mode=="draft" then
  Make:htlatex()
else
  Make:htlatex()
  Make:htlatex()
  Make:htlatex()
end


Make:parseaux {}

local function replace_labels(html)
  -- match element start
  html = html:gsub("<([a-z0-9A-Z]+)(%s+[^%>]-)>", function(element, attr)
    -- process attributes
    local attr = attr:gsub('([a-z]+)%s*=%s*"([^%"]-)"', function(k,v)
       -- process only id or href attributes
       if k=="id" or k == "href" then
         -- support for links with filenames, we are interested only in the part after '#'
         v = v:gsub("([^%#]+)$", function(link)
           local x = labels[link] or link
           return x
         end)
       end
      return string.format('%s="%s"',k,v)
    end)
    return string.format('<%s %s>', element,  attr)
  end)
  return html
end
local process = filter{replace_labels}

Make:match("html$", process)

使用以下命令编译你的文件:

make4ht -e sample.mk4 filename "3"

结果如下:

 <h3  class="sectionHead"><span  class="titlemark">0.1   </span> <a  
 id="first_section"></a>First section</h3>
<!--l. 8--><p  class="noindent" >Reference to the <a  
href="#first_section">section&#x00A0;0.1</a>
</p>
   <hr  class="figure" /><div  class="figure" 
>
<a  
 id="invisible_figure"></a>
<br  /> <div  class="caption" 
><span  class="id">Figure&#x00A0;1: </span><span   
class="content">My invisible figure</span></div><!--tex4ht:label?: x5-40011 -->
   </div><hr  class="endfigure" />
<!--l. 15--><p  class="indent" >   Reference to the <a  
href="#invisible_figure">Figure&#x00A0;1</a>
</p>
   <div  class="table">
<!--l. 18--><p  class="indent" >   <a  
 id="invisible_table"></a></p><hr  class="float" /><div  class="float" 
>
 <div  class="caption" 
><span  class="id">Table&#x00A0;1: </span><span   
class="content">My invisible table</span></div><!--tex4ht:label?: x5-40021 -->
   </div><hr  class="endfloat" />
   </div>
<!--l. 22--><p  class="indent" >   Reference to the <a  
href="#invisible_table">Table&#x00A0;1</a> </p>

它也适用于文件间链接:

 <div  class="tableofcontents"><span  class="lotToc" >1&#x00A0;<a  
href="samplese1.html#invisible_table">My invisible table</a></span><br  />
   </div>
   <div  class="sectionTOCS">
   &#x00A0;<span  class="sectionToc" >0.1 <a  
href="samplese1.html#first_section">First section</a></span>
   </div>

相关内容