カテゴリー別アーカイブ: ツール

PandocでMarkdownファイルをTeXに変換

どうしてもMarkdownでレポートが書きたかったのでメモ。

結論としては、前回よりいい感じに生成できたけど依然として最適解ではない感じです。

ちょっと癖があるので、素直にLaTeXで書くのが一番いいのかもしれません・・・

環境

  • Apple MacBook(Eearly 2016)
  • Windows 10 64bit

インストールしたもの

  • Pandoc (Windows版あったのか・・・)
  • TeX Live/Windows
  • お好みのMarkdownエディタ(私はAtom使ってます)

TeX Liveはイメージファイルからインストールしましたが、Windows 10はデフォルトでisoをマウントできたので追加のツールは必要ありませんでした。

変換対象

ソースコードを含む文章をレポート形式で出力したかったのです。

なるべくソースコードが綺麗に載るように調整を行いました。

変換

まずはMarkdownを書きます。

この記事もMarkdownで書いているので、記事に掲載はできませんが、添付しておきます。

test.md

これをTeXに変換するのですが、その際にpandocのテンプレートを使います。

テンプレートはこちらを参考にして、コードがうまく載るようにカスタマイズします。

ついでに日本語対応っぽい事もしてます。

custom.latex

こちらをcustom.latexというファイル名でMarkdownと同じディレクトリに保存します。

次にコマンドプロンプトで以下を実行します。

pandoc --mathml --listings --template=custom test.md -o test.tex

これでtest.texができると思うので、TeXworks EditorでLuaLaTeXを指定してコンパイルします。

その結果出力されたPDFがこちらになります。

テストレポート

課題

  • 行番号の色を変えたい
  • ソースコードのフォントを変えたい
  • そういえば見出しが付いてない

まだまだ道のりは遠そうです。

完璧な出力を得られるころにはLaTeXマスターになってそう・・・

参考

  • https://tex.stackexchange.com/questions/33685/set-the-font-family-for-lstlisting
  • https://en.wikibooks.org/wiki/LaTeX/Source_Code_Listings
  • http://sky-y.github.io/site-pandoc-jp/users-guide/#templates
  • http://tech.lauritz.me/easy-latex-with-markdown-pandoc/
  • https://texwiki.texjp.org/?TeX%20Live%2FWindows

Mathjaxの数式を中央寄せ・改行

Markdownで数式を書いるとよく改行したくなったり、中央に寄せて書いたりしたくなってくるので、方法をメモ。

中央寄せ

$$ x(t) = \Sigma_{-\infty}^{\infty}C_ne^{+jnw_0t} $$

改行

$X(w) = \int x(t)e^{-jwt}dt \\
 = \int cos(w_0t)e^{-jwt}dt \\
 = \int \frac{e^{iw_0t} + e^{-jw_0t}}{2}e^{-jwt}dt \\
 = \frac{1}{2}\{\int 1dt + \int e^{-j(-w_0-w)t}\}dt$

表示したかったけど、WordpressのMarkdownはMaxhjax対応してないみたいですね・・・

Mathjaxの文法はこのサイトがとても充実していておすすめです。

Markdownの表をTexに出力すると崩れる

Markdownでレポートを書いてTex形式で出力しようの第2弾です。

前回の記事の設定が完了している必要があります。


pandocでPDFに変換する課程で、表が崩れていました。

もととなるMarkdownはこんな感じだとします。

$ cat test.md
# 表

ネタ名|乗ってるもの|ベース|味
:-:|:-:|:-:|:-:
マグロ|魚|米|うまい
かんぱち|魚|米|うまい
サーモン|魚|米|うまい
ぶり|魚|米|うまい
たまご|卵|米|シメに最高

で、texの出力結果はこうなりました。

$ pandoc test.md -o test.tex
$ cat test.tex
\begin{longtable}[c]{@{}cccc@{}}
\toprule
ネタ名 & 乗ってるもの & ベース & 味\tabularnewline
\midrule
\endhead
マグロ & 魚 & 米 & うまい\tabularnewline
かんぱち & 魚 & 米 & うまい\tabularnewline
サーモン & 魚 & 米 & うまい\tabularnewline
ぶり & 魚 & 米 & うまい\tabularnewline
たまご & 卵 & 米 & シメに最高\tabularnewline
\bottomrule
\end{longtable}

これをPDF出力すると、このようになります。

screenshot-from-2016-11-02-11-27-13

表が描画されていませんね。正直Texのことは全くわかりませんが、どうもlongtableを使うのがよくなさそうです。

仕方ないので、最低限の表のフォーマットだけ保持したまま別の表に変更してしまおうと思います。

Pythonでスクリプトを書いてみました。

fix_tables.py

#!/usr/bin/env python3
# -*- coding:utf-8 -*-

import sys

with open(sys.argv[1], "r") as f:
    lines = f.readlines()

newlines = []
table_area = False
for line in lines:
    if line.startswith("\\begin{longtable}"):
        print("table detected")
        table_area = True
        index_pos = line[line.find("[") + 1]
        content_pos = line[line.find("@") + 3:line.rfind("@")]
        newlines.append("\\begin{{tabular}}{{{0}|{1}}}\n".format(index_pos, content_pos))
        continue
    if not table_area:
        newlines.append(line)
        continue
    if line.startswith("\\toprule") or line.startswith("\\endhead") or line.startswith("\\bottomrule"):
        continue
    elif line.startswith("\\midrule"):
        newlines.append("\\hline\n")
    elif line.endswith("\\tabularnewline\n"):
        newlines.append(line.replace("\\tabularnewline\n", "\\\\\n"))
    elif line.startswith("\\end{longtable}"):
        newlines.append("\\end{tabular}\n")
        table_area = False
    else:
        newlines.append(line)

with open(sys.argv[2], "w") as f:
    f.write("".join(newlines))

これでテーブルを直しつつ、PDFに変換してみます。

$ python3 ./fix_tables.py test.tex test2.tex
$ cat test2.tex

\section{表}\label{ux8868}

\begin{tabular}{c|cccc}
ネタ名 & 乗ってるもの & ベース & 味\\
\hline
マグロ & 魚 & 米 & うまい\\
かんぱち & 魚 & 米 & うまい\\
サーモン & 魚 & 米 & うまい\\
ぶり & 魚 & 米 & うまい\\
たまご & 卵 & 米 & シメに最高\\
\end{tabular}

$ pandoc test2.tex -o test.pdf -V documentclass=myltjsarticle --latex-engine=lualatex

表の形式をだいぶ変えましたが、結果的に正常に描画することができるようになりました。

screenshot-from-2016-11-02-11-29-52

Latexの表ってキレイダナー(こなみ

Markdownでレポート執筆

日頃からMarkdownを使っていろいろと書いていると、レポートとかもMarkdownで書きたくなってきますよね。

というわけで、MarkdownでレポートいてTex形式に変換し、PDFに出力するための手順や必要なツールを紹介します。

この記事を参考にさせていただきました。


※追記(2016-11-02)

表が崩れる問題が発覚し、暫定的な対処法を記事にしました。こちらも参考にしてください。

環境

  • ubuntu 16.04 LTS 64bit版

Markdownを書く

まずはレポートの元となるMarkdownを書きます。

私はSublime Text3で以下のプラグインを使ってMarkdownを書いています。

  • OmniMarkupPreviewer
  • Monokai Extended
  • Markdown Extended
  • Table Editor

OmniMarkupPreviewerはMarkdownをブラウザでプレビューでき、リアルタイムで更新してくれるプラグインです。

デフォルトだとCtrl + Alt + O キーでプレビューしてくれます。

数式を書く場合、オプションでmathjaxを有効にしなければなりません。

    "mathjax_enabled": true,

Monokai ExtendedやMarkdown ExtendedはMarkdownのシンタックスハイライトを行うために必要です。

新しいファイルを拡張子.mdで作って、View-Syntax-Markdown-Markdownと選択し、シンタックスハイライトを有効にします。

また、Preference-Color Scheme-Monokai Extended-Monokai Extended Brightと選択し、カラースキームも設定しておきます。

これでMarkdownの編集ができました。プレビューしながらMarkdownを編集します。

PandocやTexをインストール

Pandocやtexのライブラリはaptでインストールできます。すごく重いですが全部入れましょう。

sudo apt-get install pandoc texlive-luatex texlive-latex-recommended \
                     texlive-fonts-recommended texlive-fonts-extra texlive-latex-extra \
                     texlive-lang-japanese texlive-xetex

試行錯誤しながら入れたので、不要なパッケージがあるかもしれません。

もしかしたらtexlive-fullがあれば全て解決する気がしますが、重すぎて入れる気になりませんでした・・・

PandocでPDFに変換

いよいよTexに変換していきます。

まず、Texのスタイルファイルを作成しますが、以下のコマンドを実行します。

$ cp `kpsewhich ltjsarticle.cls` .
$ wget "https://raw.githubusercontent.com/yukpiz/dotfiles/master/latex/ltjsarticle.cls.patch"
$ patch -p0 < ltjsarticle.cls.patch
$ mv ltjsarticle.cls myltjsarticle.cls
$ sudo mktexlsr

このコマンド、最初はうまく行かなかったのですが、適切なパッケージを入れると動くようになりました。

もし kpsewhich ltjsarticle.cls で出力が何も帰ってこないようなら、ltjsarticle.clsはネットから探してくるのも手だと思います。(URL忘れました。すみません・・・)


markdownからtex形式のpdfへの変換は、以下のようなコマンドを使います。

sudo pandoc test.md -o test.pdf -V documentclass=myltjsarticle --latex-engine=lualatex

これでPDFができるのですが、私としては画像の大きさが画面いっぱいになってしまい気になりました。

そこで、シェルスクリプトを書いて少し調節しました。

md2pdf.sh

#!/bin/sh

temp="`basename $1 .md`.tex"

pandoc "${1}" -o "${temp}"
sed -ie s/includegraphics/includegraphics[clip,width=10.0cm]/g "${temp}"
pandoc "${temp}" -o "${2}" -V documentclass=myltjsarticle --latex-engine=lualatex

rm "${temp}"
$ sudo ./md2pdf.sh test.md test.pdf

今後もスタイルの調整を行っていこうと思いますが、もしかしたらltjsarticle.clsでうまいこといじれるかもしれません。

そのへんは今後調査ということで・・・

気をつけること

  • 画像はレポートの最後にまとめて載せないと出力PDFのレイアウトがおかしくなる
  • 大項目は#1つにして構造化しないとPDFのインデックスがおかしくなる
  • コードブロックに数式を書く方法は使えないっぽい($で囲む方は使える)
  • 数式に特殊文字を使うと文字化け
  • その他”〜”の文字は普通に書いてても文字化け
  • 図のキャプションは[]内に書く

おかしくなることも多いので、変換したら確認は必須になりそうですね。。

まとめ

Markdown→Tex→PDFに変換するだけなのに、めちゃめちゃ大変でした・・・

というかTex重すぎですw まぁ、出力はすごく綺麗なので、その辺りはさすがですね。

ただ、やはりMarkdownでレポートを書けるのは大きいですね。複雑な公文を書かない分、非常に楽です。

今後も少しづつ知見を増やして、快適レポート生活を送っていきたいと思います。