利用pandoc将tex转成html
justaLoli

直接上命令:

1
2
3
4
5
6
pandoc -s input.tex 
--bibliography=refs.bib
--csl=springer-basic-brackets.csl
--citeproc
--katex
-o output.html

如果要直接复制,可以使用下面的单行命令(内容一样)

1
pandoc -s input.tex --bibliography=refs.bib --csl=springer-basic-brackets.csl --citeproc  -o output.html --katex

几点注明:

我在tex文件中使用了biblatex添加了参考文献,这里要使用相关命令正确输出参考文献。

其中refs.bib是bib文件,springer-basic-brackets.csl是引用样式文件,--citeproc参数是为了启用引用功能。

bib文件如果你写了参考文献应该就会有,没有就忽略;如果你写了bib文件,你还需要csl文件以确保参考文献正确显示。有很多csl样式可供选择,可以上网搜索。这里我随便用了一个样式。

需要注意csl文件(如果我没记错)一方面决定结尾参考文献的名字以何种形式显示,另一方面决定引用时的格式。 比如我使用的这个样式,可以让参考文献在引用时呈现[1]这种形式。

最后,--katex参数是为了使用katex渲染公式。还有其它在html文档里面显示公式的方法,不过我个人测试了一下,感觉katex渲染的公式足够好。

还有几点注明:

经过测试,上命令可以生成足够美观的html文档,可满足基本需求,但尚有一些问题:

  • 文中的bib引用[1]不具备跳转到文末的超链接
  • 文中的图片脚注不具备图1的数字编号
  • 图片不支持\subfigure的子图功能
  • 上述只是在我的测试tex文件里面发现的问题,还有诸多语法未测试。

尝试解决

经过和ChatGPT的沟通,可以使用lua脚本解决部分问题。

⚠️警告⚠️:以下lua脚本由ChatGPT生成,不保证鲁棒,且有损坏输出文件的风险(在我使用时已经出现了问题),因此仅供参考,请谨慎使用。

如要使用,需要额外在pandoc命令中添加--lua-filter=filename.lua参数。

解决图片编号问题:

1
2
3
4
5
6
7
8
9
10
11
local image_count = 0

function Figure(elem)
if elem.caption then
image_count = image_count + 1
local caption_text = pandoc.utils.stringify(elem.caption)
local numbered_caption = "图 " .. image_count .. ": " .. caption_text
elem.caption = { pandoc.Str(numbered_caption) }
end
return elem
end

bug:似乎会损坏图片caption里面的cite。

解决引用链接问题:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
function Cite(elem)
local inlines = {}
for i, cit in ipairs(elem.citations) do
local id = "ref-" .. cit.id
local num = pandoc.Str("[" .. i .. "]")
local link = pandoc.Link({num}, "#" .. id, "", {class = "citation"})
table.insert(inlines, link)
end
return pandoc.Span(inlines)
end

function Div(elem)
if elem.classes:includes("references") then
for i, item in ipairs(elem.content) do
if item.t == "Para" then
local id = "ref-" .. item.identifier
item.identifier = id
end
end
end
return elem
end

bug:无法支持多个引用,如\cite{a,b,c}的latex语法,在其它情况运转比较正常。如果在意引用角标的链接问题,可以尝试使用。