修改 htlatex 的 html 输出

修改 htlatex 的 html 输出

当 latex 图形转换为 html 时,htlatex 会生成如下标记:

 <a id="x3-3021r4"></a> 
 <p class="noindent" >
 <img src="sampleImage.png" alt="PIC"/>
 </p>
 <div class="caption">
    <span class="id">Abbildung&#x00A0;7:</span>
    <span class="content">Sample Image</span>
 </div>

是否有可能,例如通过配置文件中的钩子和参数,以这样的方式改变输出,使得生成的标记代码如下所示?

<a id="x3-3021r4" href="/sampleImage.png" title="Sample Image"> 
   <img src="/sampleImage.png" alt="PIC"/>
</a>
</p>
<div class="caption">
  <span class="id">Abbildung&#x00A0;7:</span>
  <span class="content">Sample Image</span>
</div>

问候,克里斯

编辑:添加了 MWE 并修改了所需的输出(锚点还应包含带有标题内容的“标题”属性,并且图像路径应以斜杠开头)

\documentclass{article}
\usepackage[ngerman]{babel}
\usepackage[latin1]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[final]{graphicx}
\begin{document}
\begin{figure}
\centering
\includegraphics{sampleImage.png}
\caption{My sample image}
\label{fig:mysampleimage}
\end{figure}
\end{document}   

代码编译如下:

htlatex.bat src.tex "html"

答案1

这个问题比看上去要复杂得多。似乎标签插入于figure环境插入的,但我找不到如何以您想要的方式配置它。在这种情况下,我建议使用制作4小时过滤功能。make4ht是简化使用的简单构建工具tex4ht

过滤器是修改输出的 lua 函数。对于你的情况,它可能是这样的 make 文件src.mk4

local filter = require "make4ht-filter"

local atoim = function(s)
  local id = nil
  return s:gsub("<([%a/]+)(%s*)([^>]-)>", function(tag, space, par)
    if tag == "a" then 
      id = par:match("^id=[\"']([^\"^']+)[\"']")
      if id then return '' end
    elseif tag=='/a' and id then
       return ''
    elseif id then
      par = 'id="'..id..'"'
      id = nil
    end 
    return '<'..tag ..space .. par..'>'
  end
  )
end
local process = filter{"cleanspan", "fixligatures", "hruletohr", atoim}
Make:htlatex()
Make:htlatex()
Make:match("html$",process)

现在你可以使用

make4ht src

atoim所有标签都用函数进行处理,<a id="something"></a>丢弃并id保存值,id然后插入到下面的元素中。

生成的 html 如下所示:

<!--l. 10--><p id="x1-21"><img 
src="sampleImage.png" alt="PIC"  
 />
<br /> </p>

请注意,id属性可以放在任何元素上,它将为超链接提供目标,没有必要使用<a id


编辑

对于您的用例,必须使用更复杂的功能。也许有知识的人xslt 会找到更优雅的解决方案:-)。

local filter = require "make4ht-filter"

local atoim = function(s)
  local id = nil
  local used_id = {}
  local captions = {}
  local tag_patt = "<([%a/]+)(%s*)([^>]-)>"
  local attr_pat = "%s*=%s*[\"']([^\"^']+)[\"']"
  s:gsub('<span class="content">(.-)</span></div><%!%-%-tex4ht%:label%?: (.-) %-%->', function(caption,id)
   captions[id]=caption
  end)
  local r1 =  s:gsub(tag_patt, function(tag, space, par)
    if tag == "a" then 
      id = par:match("^id"..attr_pat)--=[\"']([^\"^']+)[\"']")
    elseif id and tag == "img" then
      used_id[id] = true
      local src = par:match("src"..attr_pat) 
      local name = captions[id] or ""
      local img =  string.format('<a href="%s" id="%s" title="%s"><img %s></a>', src, id, name, par)
      id = nil
      return img
    end 
    return '<'..tag ..space .. par..'>'
  end
  )
  local a = false
  return r1:gsub(tag_patt, function(tag, space, par)
    if tag == "a" then
      local id = par:match("id"..attr_pat)
      if id and used_id[id] then
        used_id[id] = nil
        a = true
        return ""
      end
    elseif tag == "/a" and a then
      a = false
      return ""
    end
    return '<'..tag ..space .. par..'>'
  end
  )
end
local process = filter{"cleanspan", "fixligatures", "hruletohr", atoim}
Make:htlatex()
Make:htlatex()
Make:match("html$",process)

使用三遍方法,第一遍我们找到给定 id 的标题,第二遍标签id<a>在 img 周围创建元素,最后一遍,我们删除旧<a>元素

生成的 html:

<!--l. 9--><p class="noindent" ><a href="sampleImage.png" id="x1-21" title="My sample image"><img src="sampleImage.png" alt="PIC"  
 /></a>
<br /> </p>

相关内容