MarkdownをコマンドでPDFスライドに変換する

2021-07-24

勉強会などで簡単な説明資料を作りたいとき,PowerPointで資料作成に時間をかけたくないとき,普段のメモからさっとスライドが作れるのが理想です.

Pandoc

無料の文書変換ソフト Pandoc で,様々な文書間の相互変換(一部は一方向の変換)を行えます.

今回は2種類の形式でスライド化してみようと思います.

  • Markdown → PowerPoint
  • Markdown → PDF (Beamer)

Installation

パッケージインストーラをダウンロードして起動するだけです.

Pandoc - Installing pandoc

Markdown to PowerPoint

サンプルとして以下の記事を PowerPoint 形式に変換してみます.

https://blog.mktia.com/discrete-fourier-transform-in-python

terminal

$ pandoc -o test.pptx -f markdown -t pptx --toc path/to/test.md

完成したものが以下のスライドです.--toc オプションをつけることで,目次を出力できます.

一見うまくいっているように見えますが,下の部分が見切れてしまっています.

この記事にはテキストの部分だけでなく数式やソースコードが含まれていましたが,テキスト以外の要素が含まれている場合は出力されたときに画像になってしまうらしく,テキストの文字サイズを変更できないため修正するのは難しいです.

H2 をスライドの区切りとして判断しているため,適宜 H2 を差し込みながら Markdown を書けばうまく生成できます.

Markdown to PDF

Markdown から LaTeX の Beamer を利用してスライド PDF を生成します.

環境構築

LaTeX を使用するための TeX Live インストール手順は以下の記事を参考にしてください.

https://blog.mktia.com/create-environment-to-edit-latex-easily
https://blog.mktia.com/install-tex-on-mac

LaTeX

テンプレート用の TeX ファイルを作成します.

main.tex

\documentclass[dvipdfmx]{beamer}
\usepackage{pxjahyper}
\usepackage{graphicx}
\usepackage{amsmath,amssymb}
\usepackage{bm}

% For math
\usefonttheme{professionalfonts}
\usepackage{txfonts}

% For code
\usepackage{listings}
\lstset{
  numbers=left,
  basicstyle=\ttfamily\tiny,
  breaklines=true
}

\providecommand{\tightlist}{
  \setlength{\itemsep}{0pt}\setlength{\parskip}{0pt}
}
\newcommand{\passthrough}[1]{\lstset{mathescape=false}#1\lstset{mathescape=true}}

% Japanese font to gothic style
\renewcommand{\kanjifamilydefault}{\gtdefault}

\usetheme[
  block=fill,
  progressbar=foot,
  numbering=fraction
]{metropolis}

\begin{document}
  \title{Pythonによる離散フーリエ変換}
  \author{mktia}
  \date{}
  \maketitle
  \input{body}
\end{document}

Markdown を body.tex に変換し,\input の部分に入れることでスライドを作成します.

コマンド

terminal

$ mkdir ~/bin
$ nano ~/bin/md2slide

毎回コマンドを打たなくても良いように簡単なスクリプトを登録しておきます.

ホームディレクトリ下に LaTeX ディレクトリを作成し,一時的なログファイル等はそこに格納しています(最終的に消えますが).

コード部分で言語を指定していると,デフォルトでは Shaded が指定されます.エラーを直すのが面倒なので,--listings オプションで lstlisting を使用しています.

ページ番号が一度で振れなかったため,二度 ptex2pdf しています.

md2slide

#!/bin/bash
pandoc $1 -o body.tex --pdf-engine=lualatex -t beamer --listings
ptex2pdf -u -l -ot "-kanji=utf8 -synctex=1 -file-line-error" main.tex --output-$
ptex2pdf -u -l -ot "-kanji=utf8 -synctex=1 -file-line-error" main.tex --output-$
find ~/LaTeX -not -name "*.tex" -not -name "*.pdf" | xargs rm
cp ~/LaTeX/main.pdf ./main.pdf

exit 0

利用しやすいようにパスを通します.

.zshrc

export PATH="$PATH:$HOME/bin"

実行権限がないため,権限を追加します.

terminal

$ chmod +x ~/bin/md2slide

実行

terminal

$ md2slide path/to/slide.md

実行すればスライドが生成されます(下の例は修正済みのもの).

H2 はスライドのタイトル,H3 はブロックのタイトルになります.PowerPoint と同様にスライドの区切りは H2 になるため,それを考えて Markdown を書く必要があります.

それでも自動生成の LaTeX では文章がスライドの領域をはみ出ることがあるため,body.tex を適宜編集して ptex2pdf で PDF を生成すればいい感じになります.

参考