2014-11-18 ,

org-mode文書をHTMLでエクスポートするときにLaTeX部分をMathMLへ変換する

先日の修正をdefadviceの形に直した。HTMLエクスポート時にMathjaxを使わずに直接MathMLでエクスポートする。

;; org-html-mathml-export.el

;; 次の二つの関数はhtmlエクスポート時にlatex部分をhtmlへ変換する。
;; - org-html-latex-environment
;; - org-html-latex-fragment
;; この関数において、processing-typeがmathmlのときはmathjaxのときと同じように
;; org-html-format-latexを呼び出すようにする。
;; org-html-format-latexはorg-format-latexを呼び出す。
;; org-format-latexはprocessing-typeがmathmlのときorg-format-latex-as-mathmlを呼び出す。

(defadvice org-html-latex-environment
  (around org-html-latex-environment--html-mathml
          (latex-environment contents info)
          activate)
  (setq ad-return-value
        (let ((processing-type (plist-get info :with-latex)))
          (case processing-type
            ((mathml)
             (let ((org-format-latex-as-mathml-format 'mathml))
               (org-html-format-latex
                (org-remove-indentation
                 (org-element-property :value latex-environment)) ;;latex-frag
                'mathml
                info)))
            ((t)
             ad-do-it)))))

(defadvice org-html-latex-fragment
  (around org-html-latex-fragment--html-mathml
          (latex-fragment contents info)
          activate)

  (setq ad-return-value
        (let ((processing-type (plist-get info :with-latex)))
          (case processing-type
            ((mathml)
             (let ((org-format-latex-as-mathml-format 'mathml))
               (org-html-format-latex
                (org-element-property :value latex-fragment) ;;latex-frag
                'mathml
                info)))
            ((t)
             ad-do-it)))))


(defvar org-format-latex-as-mathml-format 'link
  "org-format-latex-as-mathml関数がどのような形式の文字列を返すかどうかを指定する変数。'linkのときMathMLファイルへのリンクを返す。'mathmlのときMathMLの文字列自体を返す(XMLヘッダー無し)。")

;;
;; org-format-latex-as-mathmlはLaTeX表記をMathMLへ変換する。
;; OpenDocumentエクスポートの時はファイルへのリンクへ変換する。
;; HTMLエクスポートの時はMathMLそのものへ変換する。
;;

(defadvice org-format-latex-as-mathml
  (around org-format-latex-as-mathml--html-mathml
          (latex-frag latex-frag-type prefix &optional dir)
          activate)

  (setq ad-return-value
        (if (eq org-format-latex-as-mathml-format 'mathml)
            (org-format-latex-as-mathml-not-file latex-frag latex-frag-type prefix dir)
          ad-do-it)))

(defun org-format-latex-as-mathml-not-file (latex-frag latex-frag-type
                                                       prefix &optional dir)
  "Use `org-create-math-formula' but check local cache first."
  (let* ((print-length nil) (print-level nil) ;;必要?
         (mathml (org-create-math-formula latex-frag)))

    ;; Successful conversion.  Return the MathML.
    (if mathml
        (progn
          ;; Erase XML header
          (if (eql (string-match "^<\\?xml [^>]+>" mathml) 0)
              (setq mathml (replace-match "" t t mathml)))
          ;; Erase all line breaks
          (setq mathml (replace-regexp-in-string "[\n\r]" "" mathml))

          ;; Add props
          (org-add-props
              mathml

              (list 'org-latex-src (replace-regexp-in-string "\"" "" latex-frag)
                    'org-latex-src-embed-type (if latex-frag-type
                                                  'paragraph 'character))))
      ;; Failed conversion.  Return the LaTeX fragment verbatim
      latex-frag)))

使い方:

  • これを適当な場所でloadする。
  • mathtoweb.jarをダウンロードして適当な所に置く。
  • 変数をカスタマイズする。
    • org-latex-to-mathml-convert-command を "java -jar %j -unicode -force -df %o %I"
    • org-latex-to-mathml-jar-file を "(ファイルを置いた場所)/mathtoweb.jar"
  • org文書の #+OPTIONS:tex:mathml を書き加える。

Org2Blogでこれを使うなら:

  • org2blog/wp-use-wp-latex を nil にする。

Pingback / Trackback