这与我的上一个问题。用例仍然相同:我想将文档转换为 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
表中保存的链接id
和href
属性:
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 0.1</a>
</p>
<hr class="figure" /><div class="figure"
>
<a
id="invisible_figure"></a>
<br /> <div class="caption"
><span class="id">Figure 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 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 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 1</a> </p>
它也适用于文件间链接:
<div class="tableofcontents"><span class="lotToc" >1 <a
href="samplese1.html#invisible_table">My invisible table</a></span><br />
</div>
<div class="sectionTOCS">
 <span class="sectionToc" >0.1 <a
href="samplese1.html#first_section">First section</a></span>
</div>