アドベントカレンダーの時期だけど、特に所属している団体とか何も無いので普通の記事です。
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-crossref
と citeproc
のフィルターを通す前に 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
とする。