Markdownでレポートを書いてPDFに変換する

今年で高校生になり、コロナの影響で登校はまだですが課題が配布され5月中に終えなければならなくなりました。

配布された資料を読み、レポートにまとめるのです。

印刷OKらしいのでパソコンでチャチャっとやってしまいましょう!

作戦

Markdownで作成したレポートをPDFに変換、ファミマで印刷して提出します。

環境構築

MarkdownからPDFへの変換にはPandocを使用します。
Pandocは様々な文章フォーマットを相互変換してくれるツールです。

PandocがMarkdownからPDFへ変換する際、内部では一度LaTeXに変換してからPDFへ再変換されます。

そのため、LaTeX環境も必要です。

$ sudo apt install pandoc
$ sudo apt install texlive
$ sudo apt install texlive-lang-cjk

LaTeXとは

LaTeXTeXというマークアップ言語のマクロ体系です。

TeXとはフリーの組版1システムであり、TeXで書かれたソースファイルを処理し、目的のファイルを出力するソフトをTeX処理系と呼びます。

どのLaTeXを使用するか

Markdownから変換されたLaTeX文章は、TeX処理系によってDVI2に変換されPDFへ、または直接PDFへと変換されます。

このTeX処理系は複数存在し、こちらの記事がとても参考になりました。

Pandocでは、使用されるTeX処理系を選択する事が出来ます。
Pandocが対応しているTeX処理系は以下の3つです。

  • pdflatex
  • lualatex
  • xelatex

今回はxelatexを使用します。3

まずLaTeXに入門する必要があるよね

LaTeXについての知識が皆無ではなかなか厳しいので、基礎知識だけでも身に着ける必要があります。

以下にxelatexでコンパイルする事の出来るLaTeX文書を示し、コンパイル方法と解説を行います。

\documentclass[xelatex, ja = standard]{bxjsarticle}

\title{吾輩は猫である}
\author{夏目漱石}

\begin{document}
\maketitle

吾輩は猫である。名前はまだ無い。

どこで生まれたか頓と見当がつかぬ。
何でも薄暗いじめじめした所でニャーニャー泣いていた事だけは記憶している。

\end{document}

このファイルをsource.texとします。

source.texと同じディレクトリで以下のコマンドを実行します。

$ xelatex ./source.tex

これによって、source.pdfというファイルが得られたと思うので、お手持ちのブラウザで確認して見ましょう。

私は以下のような結果が得られました。

f:id:stay_san:20200516161708p:plain

解説

source.texファイルの各行について解説していきます。


以下の行で使用する文章クラスと、文章クラスに渡すオプションを指定しています。

\documentclass[xelatex, ja = standard]{bxjsarticle}

文章クラスについて

文章クラスとは、その文章の種類を決定するものであり、例えば本やスライド、記事などを指定する事が出来ます。

今回はbxjsarticleという文章クラスを指定しています。

この文章クラスはjsarticleというplatex系専用の文章クラスをそれ以外のTeX処理系に対応させたものです。

jsarticleはjarticleという日本語用文章クラスの改良品です。

bxjsarticleを使用する事により、日本語関係の設定を済ませてくれます。

オプションについて

bxjsarticleはオプションとして使用するTeX処理系を選択する必要があります。

今回は処理系にxelatexと日本語の標準設定を選択しています。


この行ではタイトルと著者を設定しています。

\title{吾輩は猫である}
\author{夏目漱石}

TeXコマンドは「\」で始まり、コマンド名の後にオプションを「[]」内に、データを「{}」内に記述します。


文章データを開始します。
\end{document}まで有効です。

\begin{document}

設定したタイトルと著作者を出力します。

\maketitle

文章データ本体です。
様々なTeXコマンドや外部パッケージの提供するコマンドにより装飾を加えることが出来ます。

吾輩は猫である。名前はまだ無い。

どこで生まれたか頓と見当がつかぬ。
何でも薄暗いじめじめした所でニャーニャー泣いていた事だけは記憶している。

文章データを終了します

\end{document}

パッケージ

他のユーザーが作成したマクロなどはパッケージという形態で配布されています。

例えば、LaTeXは所属を表示するコマンドを標準では提供していません。
そこで、それらを提供するパッケージを使用します。

\documentclass[xelatex, ja = standard]{bxjsarticle}
\usepackage{authblk}

\title{吾輩は猫である}
\author{夏目漱石}
\affil{日本}

\begin{document}
\maketitle

吾輩は猫である。名前はまだ無い。

どこで生まれたか頓と見当がつかぬ。
何でも薄暗いじめじめした所でニャーニャー泣いていた事だけは記憶している。

\end{document}

この例では「authblk」というパッケージを取り込むことでaffil文を使用可能にしています。

コンパイル結果は以下の様になりました。

f:id:stay_san:20200516165332p:plain

学校のレポートであれば「n年n組」などが入ります。

MarkdownからPDFへ変換

いよいよです。
と言ってもまだ少しやることがあります。

YAMLメタデータブロック

Markdown中に、ハイフン3つで囲まれた領域をYAMLメタデータブロックと言います。
このメタデータブロック内にはPandocが変換に使用する変数に値を設定する事が出来ます。

具体的には以下のような事が可能です。

---
documentclass: bxjsarticle
classoption:
 - xelatex
 - ja = standard

title: 吾輩は猫である
author: 夏目漱石
---

吾輩は猫である。名前はまだ無い。  

どこで生まれたか頓と見当がつかぬ。  
何でも薄暗いじめじめした所でニャーニャー泣いていた事だけは記憶している。  

この例ではTeXで使用されるタイトルに著者、文章クラスとオプションを指定しています。

これをPDFに変換するにはファイル名をsource.mdとして以下のコマンドを同ディレクトリで実行します。

$ pandoc ./source.md -o ./source.pdf -s --latex-engine=xelatex

YAMLメタデータヘッダの記述方法はYAMLフォーマットに即しています。

YAMLについてはこちらが参考になりました。

メタデータブロックで所属を指定したい

学校のレポートですから「n年n組」は必須です。

メタデータブロックに記述されたデータはPandocが使用するテンプレートというものによって処理されます。

LaTeX系の変換に使用されるテンプレートを見るには以下のコマンドを実行します。

$ pandoc -D latex

このテンプレートをauthblkパッケージを使用するように書き換えればいいのです。

テンプレートの仕様についてはこちらを参考にしました。
テンプレートの改造はこちらを参考(丸パクリ)にしました。

作成したテンプレートをPandocに指定するには --template=file オプションを使用します。

結果として、LaTeXで記述された最初の例と全く同じ結果を出力するMarkdownは以下の様になりました。

---
documentclass: bxjsarticle
classoption:
 - xelatex
 - ja = standard

title: 吾輩は猫である
author:
 - name: 夏目漱石
   affiliation: 日本
---

吾輩は猫である。名前はまだ無い。  

どこで生まれたか頓と見当がつかぬ。  
何でも薄暗いじめじめした所でニャーニャー泣いていた事だけは記憶している。  

PDFへ変換します。

$ pandoc ./source.md -o ./source.pdf -s --template=./template.tex --latex-engine=xelatex

以下のPDFが得られました。

f:id:stay_san:20200516172250p:plain

おわりに

後はレポートを書くだけです。

追記

タブ揃えがやりたくて結局LaTeXそのままで書きました...
あーあ


  1. 文章や図、画像などを配置していく作業の総称

  2. TeX処理系が使用する中間ファイルです

  3. 特に理由なし