Marp
Marp は markdown 形式でプレゼンテーションを作成できるソフトウエアです。Markdown で記述したスライドをブラウザ上で描画したり PDF に出力したりできます。
その性質上、万人向けのツールではないところがあります *1。しかし、以下のようなニーズに対してはとても素晴らしいツールだと思います:
- WYSIWYG エディタにマウスで格闘するより、テキストエディタを使いたい
- Git と相性の良い、テキストベースのフォーマットで書きたい
- 一つの markdown のファイルからプレゼンテーションもドキュメントも生成したい
筆者は既に社内外や個人で複数のスライドを Marp で作成しており、非常に便利なツールで助かっています。
実際に 私が Speaker Deck で公開しているスライド は 2018 年以降 Marp で全て作成しています。数百名の方向けの登壇発表などでも特に不自由もなく利用できています。
このように便利なツールなのですが、Marp Next (Marp CLI) を使い始めるまでの手順がまとまった資料があまりなかったため、分かる範囲でまとめてみました。
この記事の想定読者レベル
- markdown 記法に抵抗がない
- フロントエンド系の開発環境や node.js に詳しくはないが、コマンドライン環境の基本的な操作はできる
- フロントエンドに詳しい方は @marp-team/marp-cli の README 等を見ながら好きな方法でセットアップすればよいと思います
- 本稿では node.js 等に詳しくない読者を想定して書いています (Marp の布教のために)
Marp Next (Marp CLI) と旧 Marp について
Marp には旧・初代 Marp と、次世代の Marp (Marp Next, Marp CLI, Marp Core)があり、両者は互換性のない別実装です。
詳しくは Marp の作者の方の Qiita 記事 に書かれていますが、要するに
- 旧 "Marp" : デスクトップアプリケーション (開発停止)
- Marp Next (Marp CLI, Marp Core) : 新規に作られた実装
のようです。
検索して出てくる情報は旧 Marp が多いので、注意して読んだほうが良いです。
旧 Marp についてはすでに情報が多くある & 開発停止しているので、ここでは Marp Next にフォーカスします。
Marp Next のインタフェースについて
https://github.com/marp-team/marp によると、以下のインタフェースがあるようです:
- Marp CLI : コマンドラインツール (2019/05 時点で ver 0.9.2)
- Marp Web : PWA 形式の web アプリ (2019/05 時点では demo 段階)
- Marp Desktop : 旧 Marp と同じくデスクトップアプリケーション。まだ無い。
現時点では Marp CLI が実質上唯一の選択肢です。CLI という名前ですが、筆者の感覚としてはスライド作成に十分な機能が備わっています (後述)。
Marp CLI を使う流れ
色々なやりかたが可能ですが、こだわりが無ければ以下のような流れが良いと思います:
- node.js をインストールしていないならば、最新の node.js をインストールする (
yarn
コマンドもセットで入る) - ディレクトリを作成し、後述のような
package.json
ファイルを作成する yarn install
コマンドを実行し、package.json
で指定したバージョンの Marp CLI をインストールする- Marp CLI を使って、ブラウザでプレビューしたり PDF 生成したりする (後述)
marp-cli の README では npx
コマンドで起動できるともありますが、実際は上記の方が実用的です *2。
Marp CLI のための package.json
package.json
は JavaScript のプロジェクト定義ファイルのようなものです。といって、Marp CLI を使う目的では以下のような記述で十分です:
{ "name": "my-slide", "version": "1.0.0", "main": "index.js", "author": "作者名", "license": "UNLICENSED", "private": true, "scripts": { "dev": "marp --html --server .", "build": "marp --html --pdf --allow-local-files --title 'スライドのタイトル' slide.md -o ./slide.pdf" }, "dependencies": { "@marp-team/marp-cli": "^0.7.0" } }
もしソースを公開する予定があるならば license
部分は見直してください。
上記の package.json
で今回の用途で重要なのは以下の 2 点だけです:
dependencies
の@marp-team/marp-cli
- 上記の例では 0.7.0 ですが、https://www.npmjs.com/package/@marp-team/marp-cli にある最新バージョンを使うのがよいでしょう
^0.7.1
と書いた場合、0.8 未満かつ 0.7.1 以上のバージョンが使われます
scripts
にあるコマンドの記述- これらは
yarn dev
,yarn build
などとして呼び出すことができます - 中身は shell script です (リダイレクトなども使えます), ただし
dependencies
で指定したmarp
コマンドにパスが通った状態で使えます
- これらは
yarn install
で Marp CLI をインストール
yarn install
(または単に yarn
) コマンドを実行すると、 dependencies
で指定したものがインストールされます。つまり Marp CLI がインストールされます。
ただし、システム全体にインストールされるのではなく、 package.json
と同じディレクトリに node_modules
というディレクトリが作成され、その下にインストールされます。それによって以下のようなメリットがあります:
- プレゼンテーションごとに異なるバージョンの
marp
(や marp の依存ライブラリ)を利用できる- Marp やそれが依存する JavaScript ライブラリは開発が活発ですし、過去に作ったスライドを最新版で開いたら変なことに...という事態を回避する意味で重要です
- package.json と同じ階層の
node_modules
以下に配置されるだけなので、管理者権限が不要 & システムの環境が汚れる心配もない
Git を使う場合、 node_modules/
は .gitignore
に指定した方が良いです。
スライドを markdown で作成
Marp Next のスライドは例えば以下のようになります:
--- theme: default paginate: true footer: スライドのフッター --- ## Marp Next プレゼンテーション --- # スライドのタイトル 本文 本文 --- ## スライドのタイトル - もちろん箇条書きもできる - 箇条書き - 絵文字も使える :+1:
---
でページ区切りする以外は、ほぼ普通の Markdown ではないでしょうか。
先頭にある theme
などを指定している部分は Directive という機能で、スライドの全ページを制御しています。<!-- _paginate: false -->
などとすることでスライドごとに制御することも出来ます。
詳細な仕様は今後のバージョンアップ等で変わる可能性があるので深く触れないですが、 marp-team/marpit のドキュメントを参照すると良いでしょう。
スライドをプレビュー
Marp CLI には web サーバーとして動作する機能があり、その web サーバーにアクセスすることでブラウザで閲覧することができます。Markdown そのものではなく、聴衆に見せるためのスライドの状態で見えるため、プレビュー機能として使えます。
"scripts": { "dev": "marp --html --server ." }
package.json
の上記の記述があれば、 yarn dev
コマンドによって marp を --server
モードで起動できます。うまくいけば http://localhost:8080/
が利用可能である旨のメッセージが出ると思います。
その URL にブラウザでアクセスすることで、スライドを閲覧することができます。
この機能の優れている点として、markdown を上書き保存すると自動で再読込みされ、しかもブラウザ側も自動でリロードされます。なので、スライドを編集する際はこの機能を使うと便利でしょう。
なお、package.json
の記述にある --html
オプションは無くても良いですが、その場合は Markdown 中に HTML を埋め込むことができないので、細かな書式制御などは困難になります。
スライドを PDF に変換
"scripts": { "build": "marp --html --pdf --allow-local-files --title 'スライドのタイトル' slide.md -o ./slide.pdf" }
package.json
の上記の記述があれば、 yarn build
コマンドによって slide.md
(先程書いた markdown のファイル名)が読み込まれ、slide.pdf
が出力されます。あとは全画面表示に対応する PDF ビューワーを使うことでプレゼンできます。
留意点として、 --allow-local-files
オプションを付与しないかぎり画像などの外部ファイルを markdown から参照できません。自分で書いている(スライドに出してはいけないファイルを読み込んだりはしていないと信用できる)スライドを扱うならば --allow-local-files
オプションは付けておいたほうが良いでしょう。
なお、 yarn marp --help
コマンドで marp コマンドの help を参照できます。他に利用可能なオプションなどはそちらを参照してください。
アスペクト比 4:3 のプロジェクタへの対応
Marp CLI には いくつかのテーマが built-in で入っている のですが、いずれもサイズが 16:9 比になっています。スライドの縦横比はテーマごとに決まっている仕様なので、このままですと 4:3 のプロジェクタの環境では困ったことになります。今でも貸し会議室などの設備によっては 4:3 のことがあるので...。
そこで 4:3 に対応するテーマを使うことになるのですが、実は以下のようにすると簡単に対応できます。
まず、Marp の built-in テーマを拡張するテーマの定義 CSS を書きます:
@import-theme 'default'; section { /* section 要素が各スライドのルート要素であり、この要素のサイズを調整することでスライドの大きさを調整できる */ width: 1024px; height: 768px; }
@import-theme
というのは Marp 固有の記法で、これによって Marp が認識しているテーマを import できます (ここでは default
テーマを import している)。
そして、marp コマンドの引数に --theme theme.css
などと指定して上記の CSS を読み込ませることで、指定したとおりのサイズのスライドで出力されるようになります。
この点以外ではハマりどころは無かったのですが、もし思い出したら適宜記載します。
Enjoy markdown life
このように、markdown やコマンドラインにさえ抵抗がなければ、Marp は便利に使えるプレゼンテーションツールです。ぜひ使ってみてはいかがでしょうか。
We are hiring!!!
弊社エムスリーはインターネット技術を用いて医療に関わるコストを少しでも減らし、より多くの人を健康にすることがミッションです。なのでスライドの作成のようなタスクであっても、エンジニアリングの工夫によって生産性を向上することは歓迎です (とはいえ、もちろん PowerPoint / Keynote 派の方も多くおります)。この記事(or 他の記事も)を読んで興味を持った方はぜひ下記リンクよりご応募ください!
*1:Slack ですら「大多数のユーザーのニーズに対応する」ために Markdown 記法をあえて採用していないぐらいです: https://get.slack.help/hc/ja/articles/202288908
*2:主な理由: npx で毎回起動すると遅い点, dependencies でのバージョン指定はしておいたほうが良い点, package.json の scripts にコマンドを記述しておいたほうがシンプルである点