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の表ってキレイダナー(こなみ

シェアする

  • このエントリーをはてなブックマークに追加

フォローする