はやし雑記

はやしです


LaTeXをwordに変換する(多分これが一番きれいに変換できる)

アドベントカレンダーの時期だけど、特に所属している団体とか何も無いので普通の記事です。

LaTeXをwordに変換する方法を色々と模索して、多分一番良さそうな方法を見つけたので書いておく。 もっといい方法があれば教えてください。

多分、LaTeXをwordにするのに一番一般的な方法は PDFで吐き出したやつをwordで読み込むやつだと思うが、 この方法だと数式が崩れたり、なんか色々崩れたりであれなので、 pandocを使って変換した。

ただ、pandocでの変換も完全ではないので、panflute を使って無理やりなんとかした。

panflute はpythonでpandocのフィルターが書けるやつです。 github.com

今回作ったやつのリポジトリはこれです。

https://github.com/hayashikun/latex2docxgithub.com

使い方は、cloneして、pandocの-dオプションで config.yml を指定する。 自分はoverleafで書いたlatexをgithubに同期していて、そのgitリポジトリにlatex2docxをsubmoduleとして追加している。

$ git submodule add git@github.com:hayashikun/latex2docx.git latex2docx
$ ls
figures  latex2docx  main.tex  references.bib
$ pandoc -d latex2docx/config.yml
document.docx  figures  latex2docx  main.tex  references.bib

-d オプションはそれなりに新しいpandocじゃないと動かないので、必要であれば新しいのをインストールする必要がある。 pandoc-crossref も使っています。

pandoc-crossrefciteproc のフィルターを通す前に pre_filter を、後に post_filter を通した。

https://github.com/hayashikun/latex2docx/blob/master/pre_filter.py

pre_filter では、以下のfilterを通した。

  • replace: \Im\mathrm{Im} の変換など (physics packageを使っているが、反映されないので)
  • aligned_block: で align を良い感じになるように
  • extract_eq_label: で数式番号が正しく出るように

https://github.com/hayashikun/latex2docx/blob/master/post_filter.py

post_filter では、以下のfilterを通した。

  • make_index: で数式のインデックスを作る
  • update_eq_label: で数式インデックスに合わせて番号を振る

かなりadhocな対応で、自分のlatexファイルが正しく変換されるようにということだけを考えてfilterを書いた。

panflute はbreakpointなどを張りながらデバッグしたりする方法がわからず、結構面倒だった。 print などで標準出力に吐くとそれがfilterの出力になって後ろのfilterとかでエラーになってしまうので、 エラー出力に吐いてデバッグした。

Appendix

Haskell & Pandocをインストールする

Macだとbrewで最新版がインストールできるが、WSL Ubuntuとかだと自分で入れないと最新のものが入らない。 apt install だとインストールできるPandocのバージョンは2.5だが、2.8より上じゃないと -d オプションは使えないので、自分でインストールする必要がある。

今回改めてWSL Ubuntu上でこれをやるために、Haskellを入れてPandocを入れた。

# Install ghcup & Haskell
$ curl --proto '=https' --tlsv1.2 -sSf https://get-ghcup.haskell.org | sh

# Install pandoc
$ cabal new-update
$ cabal new-install pandoc pandoc-crossref

www.haskell.org

もし、 /usr/bin/ld.gold: error: cannot find -lgmp というエラーが出たら、

$ sudo apt install libgmp-dev

とする。