2016-12-13 9 views
1

HaskellにPandoc JSON filterと書いてあります。これは、LaTeXの表示を外部アプリケーションでSVGに変換するはずですが、インラインLaTeXの数値は内部でpandocによってMathMLに変換する必要があります。デフォルトのMathML変換を模倣したPandocフィルタ

最初のSVGビットが正常に動作しています。それは私に問題を与えている標準pandocの動作を模倣すべきMathMLビットです。

Hackageを参照すると、the texMathToMathML code example(下記参照)が見つかりました。この関数はEither String Elementを返します。

しかし、私が必要とするものはを返す関数tex2mml(下記参照)です。 これを達成するために、何をtex2mmlの定義に追加する必要がありますか?

tex2mml latex = texMathToMathML DisplayInline latex 

私がインストールされ、次のpandoc 1.16.0.2のパッケージで(X)UbuntuのLTS 16.04上でこれをやっている:ここで

$ sudo apt install pandoc libghc-pandoc-prof 

私がこれまでに得たものの抜粋です。

#!/usr/bin/env runhaskell 

import Text.Pandoc.JSON 
import Control.Applicative ((<$>)) 
import Text.TeXMath (writeMathML, readTeX, DisplayType(DisplayInline)) 
import Text.XML.Light (Element) 


texMathToMathML :: DisplayType -> String -> Either String Element 
texMathToMathML dt s = writeMathML dt <$> readTeX s 


tex2mml :: String -> IO String 
tex2mml latex = texMathToMathML DisplayInline latex 


main :: IO() 
main = toJSONFilter tex2math 
    where tex2math (Math (DisplayMath) latex) = do 
      svg <- tex2svg latex 
      return (Math (DisplayMath) (svg)) 

     tex2math (Math (InlineMath) latex) = do 
      mml <- tex2mml latex 
      return (Math (InlineMath) (mml)) 

     tex2math other = return other 

私は絶対的なハスケルの初心者ですので、私と一緒にいてください。 コードの改善のための提案は歓迎されます。

+1

"問題を引き起こしている標準的なpandocの動作を模倣するのはMathMLビットです。" - >それをそのまま残して、フィルタを実行した後にPandocに処理させてみませんか? –

+1

@SergioCorreia MathJaxを使ってSVGを生成するには、 '--mathml'ではなく' --jsmath'で 'pandoc'を実行します。 –

+1

@SergioCorreia私は二重チェックしました。確かに、 'pandoc'は、[' ToJSONFilter'](https://hackage.haskell.org/package/pandoc-pandoc-pandroid.php)を公開するために、その[数学変換](http://pandoc.org/MANUAL.html#math)_prior_を実行します。 types-1.16.1.1/docs/Text-Pandoc-JSON.html)。私が知る限り、以下の解決策がそこに到達する唯一の方法です。 –

答えて

2

確かに私はPandocと問題領域に精通していないんだけど、正しくはtex2mml関数の目的を理解するならば、私は、これはあなたが望むものを達成すべきであると考えている:

import Control.Applicative ((<$>)) 
import Text.Pandoc.JSON 
import Text.TeXMath 
     (writeMathML, readTeX, DisplayType(DisplayInline)) 
import Text.XML.Light (Element,showElement) 

texMathToMathML :: DisplayType -> String -> Either String Element 
texMathToMathML dt s = writeMathML dt <$> readTeX s 

tex2mml :: String -> String 
tex2mml latex = either id showElement (texMathToMathML DisplayInline latex) 

-- actual definition of tex2svg goes here 
tex2svg = undefined 

main :: IO() 
main = toJSONFilter tex2math 
    where 
    tex2math :: Inline -> IO Inline 
    tex2math (Math DisplayMath latex) = do 
     svg <- tex2svg latex 
     return (Math DisplayMath svg) 
    tex2math (Math InlineMath latex) = return (Math InlineMath (tex2mml latex)) 
    tex2math other = return other 

私は精査しeither機能を使用しています変換の結果texMathToMathML - 失敗した場合はエラーが返されます(id)、成功の場合showElement関数を使用してElementをXML文字列表現に変換します。

あなたがより明確にすることを発見した場合これはまた、パターンマッチングを使用して書き換えることができます計算は、それはIOモナドに埋め込まれている必要はありません純粋であり、そしてその結果がまっすぐに渡すことができたよう

tex2mml :: String -> String 
tex2mml latex = case texMathToMathML DisplayInline latex of 
    Left err -> err 
    Right xml -> showElement xml 

Mathコンストラクタ。

Text.XML.Light.Outputモジュールには、XML文字列をきれいに印刷したい場合や、出力にXMLドキュメントヘッダーを含める場合もあります。

+0

優秀な説明と絶妙な答え!私はそれから多くを学んだ。 –

関連する問題