如何使用Pandoc将带有mathjax的HTML转换为Latex?

时间:2012-07-05 05:00:24

标签: html latex mathjax pandoc

我有一些带有MathJax方程的HTML文档,我想将它们转换为Latex,然后转换为pdf。我想用Pandoc。

但是,Pandoc将$替换为\$,并使用\替换公式中的\textbackslash{}

是否有可能让Pandoc将MathJax公式从HTML传递到Latex?

2 个答案:

答案 0 :(得分:13)

使用最新版本的pandoc(1.12.2),您可以这样做:

pandoc -f html+tex_math_dollars+tex_math_single_backslash -t latex

好多了!如果您不想转换由\(\)分隔的数学,只需执行

pandoc -f html+tex_math_dollars -t latex

答案 1 :(得分:9)

这不是一件容易的事。如果您只使用$$$作为数学分隔符,并假设您的文档不包含$的任何其他用途,那么这是一个应该有效的解决方案。 (如果你不能假设,你可以尝试调整perl正则表达式。)

第1步:安装Haskell Platform,如果您还没有安装,请安装pandoc'获得pandoc库。 (如果您使用二进制安装程序安装了pandoc,则只有可执行文件,而不是Haskell库。)

第2步:现在编写一个小的Haskell脚本 - 我们将其命名为fixmath.hs:

import Text.Pandoc

main = toJsonFilter fixmath

fixmath :: Block -> Block
fixmath = bottomUp fixmathBlock . bottomUp fixmathInline

fixmathInline :: Inline -> Inline
fixmathInline (RawInline "html" ('<':'!':'-':'-':'M':'A':'T':'H':xs)) =
  RawInline "tex" $ take (length xs - 3) xs
fixmathInline x = x

fixmathBlock :: Block -> Block
fixmathBlock (RawBlock "html" ('<':'!':'-':'-':'M':'A':'T':'H':xs)) =
  RawBlock "tex" $ take (length xs - 3) xs
fixmathBlock x = x

编译:

ghc --make fixmath.hs

这将为您提供可执行文件fixmath。现在,假设您的输入文件是input.html,以下命令应该将其转换为乳胶并且数学完整,将结果放在output.html中:

cat input.html | \
perl -0pe 's/(\$\$?[^\$]+\$\$?)/\<!--MATH$1-->/gm' | \
pandoc -s --parse-raw -f html -t json | \
./fixmath | \
pandoc -f json -t latex -s > output.tex

第一部分是perl one-liner,它将您的数学位置放在标有&#34; MATH&#34;的特殊HTML注释中。第二部分将HTML解析为与文档对应的Pandoc数据结构的JSON表示。然后fixmath转换此结构,将特殊HTML注释更改为原始LaTeX块和内联。 (有关解释,请参阅Scripting with pandoc。)最后,我们将JSON转换回LaTeX。