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とは
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というファイルが得られたと思うので、お手持ちのブラウザで確認して見ましょう。
私は以下のような結果が得られました。
解説
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文を使用可能にしています。
コンパイル結果は以下の様になりました。
学校のレポートであれば「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フォーマットに即しています。
メタデータブロックで所属を指定したい
学校のレポートですから「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が得られました。
おわりに
後はレポートを書くだけです。
追記
タブ揃えがやりたくて結局LaTeXそのままで書きました...
あーあ