見出し画像

Markdownのスライド作成:Marp

1.概要

 Markdown形式でスライド(プレゼンテーション)資料を作成するオープンソースソフトウェアであるMarp(Markdown Presentation Ecosystem)を紹介します。

1-1.Markdownとは

 Markdownは、プレーンテキストのテキスト文書にフォーマット要素を追加するために使用できる軽量のマークアップ言語です。2004年にジョン・グルーバーによって作成されたMarkdownは、今や世界で最も人気のあるマークアップ言語の1つです。

1-2.Marpの概要

 Marp(Markdown Presentation Ecosystem)はMardownからスライドを作成する機能を含むエコシステムであり、日本人の服部雄輝さんが開発されました。
 多くの機能を含み、詳細は「the awesome list of Marp」の通りです。

 仲でもMarpitはMarpのMarkdownエンジン部分となります。

画像
図 Marpファミリー

1-3.Marpの機能

 機能としては下記の通りです。

  1. マークダウン記法(CommonMark準拠)したスライド作成

    • 拡張機能で画像・数式・自動拡大なども利用可

    • LaTeX記法をサポートしており、数式表示もできる

  2. Directivesや構文規則(syntax)のサポート

  3. ビルドインテーマやCSS:既定テーマ(default, gaia, uncover)で美しくプレゼンでき、独自CSSで見た目を細かく調整可能

  4. 出力機能:編集後はHTML、PDF、PowerPoint(PPTX)等にエクスポート可

  5. 公式ツールの提供:Marpエコシステムは多くのツールセットがある

  6. Pluggable architecture

  7. 完全なオープンソース:MITライセンス

画像

2.環境構築

 Marpの使用方法は何種類か用意されています。

  • Marp for VS Code:VS Codeの拡張機能

  • Marp CLI:CLI(コマンドラインツール)で使用

  • Marp Core:コアエンジンを使用した公式のMarpツール

  • Marpit framework:Marpit (independented from Marp)はMarkdownとCSSをHTML/CSSで構成されたスライドに変換

2-1.Marp for VS Code

 事前にVS Codeはインストールしておきます。

 VS Codeの拡張機能(Ctrl+Shift+x)で「Marp for VS Code」をインストールします。これだけで準備は完了です。

画像

2-2.任意設定:pptxファイルの編集(α版)

 初期設定ではmarpで出力したPowerPointファイルは編集できません。編集可能なファイルを作成する場合は下記が必要です。
※2025年5月現在では試験段階機能のため、データの欠損リスクがあります

  1. LibreOfficeのインストール

  2. VS Codeの設定変更

【LibreOfficeのインストール】
 編集可能なpptx出力にはLibreOfficeImpressが必要です。そのため事前にLibreOfficeをインストールします。

【VS Codeの設定変更】
 設定(Ctrl+,)から”marp editable”と入力すると「Markdown › Marp › Pptx: Editable」があるので"on"か”smart”に変更します。

画像

 参考として(後述する)marpとして認識されたファイルであれば出力用ボタンの「Open Extension Settings」から探すことも可能です。

画像

3.Quickstart

 「Marp for VS Code」とその他記事を参照しながら、VS Codeでmarpを触ってみます。

3-1.ファイル作成

 Marpでファイルを作成する場合、Markdown形式のファイル(拡張子md)の頭に"marp: true"のヘッダーを記載することでMarpが使用できます。

 コマンドパレット(Ctrl+Shift+P)から”marp:”と打てば、"marp: true"が記載済みのファイルが作成されます。

画像
[test.md]
---
marp: true
---

 marpで認識されると下記機能が使用可能です。

  • プレビュー画面:資料の状態を別画面で確認

  • 出力機能:スライドとしてファイルを出力

画像

 プレビューでは①Markdown形式※、②スライド形式の2パターンで確認できます。イメージは下図の通りです。
※こちらはMarpの機能ではなくQuatroの影響かもしれません。

画像

3-2.ディレクティブ設定

 Marp にはテーマやページ番号、ヘッダー、フッターなどのスライド要素を制御するための 「ディレクティブ(Directives)」 と呼ばれる拡張構文があり、下記2つがあります。

  • グローバルディレクティブ:スライド全体に影響する設定

  • ローカルディレクティブ:1 枚のスライドだけに適用される設定

    • 基本的に設定後は後段のページに適用される

    • Spot directives:接頭辞として"_"をつけると1ページのみとなる

 3-2-1.Global directives

 全ページに適用されるグローバルディレクティブを追加していきます。

  1. theme:設定すると背景色が変更されます

    • gaiaはクリーム色っぽい感じ

  2. size:スライドのサイズ指定

    • 指定しなくても問題なし

    • 「16:9(1280x720)」と「4:3(1024x768)」の2つから選択

    • math:数式のレンダーを設定

  3. headingDivider:指定された見出しレベルの前にスライドページを分割するように指示

<メタデータ>

  • title:タイトル

  • author:作成者

  • description:サブタイトル

[test.md]
---
marp: true
theme: gaia
size: 16:9
math: katex
title: タイトル(Global)
author: KIYO(Global)
description: 説明(Global) 
---
画像

 PDF化してプロパティを確認するとファイルのメタデータとして追加した内容が確認できました。

画像

 3-2-2.Local directives

 指定したページに適用されローカルディレクティブを追加します。次のスライドに明示的な設定が無い限り前のスライドから継承されます。ただし接頭辞に"_"をつけることで指定ページのみに適用することが可能です。記法は下記のとおりです。

【記法】

  • 最初の水平線---に記載

    • 最初に記載するため全ページに指定可能

  • <!-- <directive>: <値>-->:

    • 指定ページにピンポイントで記載しやすい

【Local Directives一覧】

  1. paginate: trueに設定してページネーションを表示

  2. header: ヘッダーのコンテンツを指定

  3. footer:フッターのコンテンツを指定

  4. class: 現在のスライドにHTMLクラスを設定

  5. color:テキストの色を設定

  6. backgroundColor: 背景色を設定

 記法を変えて何個か記載してみました。ページ番号やヘッダー/フッターの追加が確認できました。
 文字色は赤色に変更しておりますが、次で確認します。

[test.md]
---
marp: true
theme: gaia
size: 16:9
math: katex
title: タイトル(Global)
author: KIYO(Global)
description: 説明(Global)
#ローカルディレクティブ
paginate: true
color: #ff0000
---
<!-- 
footer: フッター 
header: ヘッダー
-->
画像

3-3.テキストの追加

 記法はマークダウン記法(CommonMark準拠)のため、Markdownを参照します。下記参照しながら見出し、リンク、箇条書き、番号付き箇条書きを記載してみました。

画像
https://commonmark.org/help/

 テキストが確認できました。またローカルディレクティブで指定した赤色も確認できました。

[test.md]
---
marp: true
theme: gaia
size: 16:9
math: katex
title: タイトル(Global)
author: KIYO(Global)
description: 説明(Global)
#ローカルディレクティブ
paginate: true
color: #ff0000
---
<!-- 
footer: フッター 
header: ヘッダー
-->

# 見出し1
## 見出し2
### 見出し3

通常のテキスト

[作成ノート(+予定)一覧 by KIYO](https://note.com/kiyo_ai_note/n/nd49cc7237ceb)

* 箇条書き1
* 箇条書き2
1. 番号付きリスト1
2. 番号付きリスト2
画像

3-4.ページ追加(改行)

 ページ追加は「水平線---」を追加するだけです。練習として下記追加しました。

  • spot directives:このページだけ背景を白に変更

  • 数式:TeX/LaTeXで数式記載

    • $:インライン表示

    • $$:ブロック表示

  • 画像:Markdownで画像を追加

[test.md]
~省略(同上)~

---
<!-- 
_backgroundColor: #fff
-->

$$
f(x) = \frac{1}{\sqrt{2\pi\sigma^2}} e^{-\frac{(x-\mu)^2}{2\sigma^2}}
$$

![Image](https://assets.st-note.com/img/1661919379413-vE07W5wCwS.jpg?width=2000&height=2000&fit=bounds&quality=85)
画像

3-5.他の機能を試す

 簡単に追加できる物も試してみます。なおほとんどがMarpの機能ではなくMarkdown記法に準じているだけです。

  1. 見出しを1行に収める

  2. 画像の位置・サイズ変更

  3. コードブロック:`(バッククォート)を追加

  4. 絵文字追加

[test.md]
~省略(同上)~

---
<!-- 見出しを行に収める -->
## あああああああああああ
## <!--fit--> ああああああああああああああああああ

<!-- コードブロック -->
(`---`) (`test`) 
<!-- 絵文字 -->
:satisfied: :smile: :angry: :scream: :dog: :cat: :pig: :monkey_face: :tiger: :bear: :koala: :penguin: :frog: :octopus: :fish: :whale2: :snail: :turtle:
<!-- 画像を右寄せし、サイズを指定 -->
![bg right 50%](https://assets.st-note.com/img/1661919379413-vE07W5wCwS.jpg?width=2000&height=2000&fit=bounds&quality=85)


```
# Slide 1

$$
f(x) = \frac{1}{\sqrt{2\pi\sigma^2}} e^{-\frac{(x-\mu)^2}{2\sigma^2}}
$$
---
# Slide 2
文字も書ける
```
画像

3-6.出力

 出力ボタンを押し「Export Slide Deck」を選択すると名前を付けて保存できます。PDFを選択するとスライドがPDFで出力されました。

画像

 結果は下記の通りです。

4.ガイド

 詳細な使用方法を学習していきます。内容はMarp-GitHubのGuideを参照しました。

4-1.ディレクティブ(Directive)

 Marp にはテーマやページ番号、ヘッダー、フッターなどのスライド要素を制御するための 「ディレクティブ(Directives)」 と呼ばれる拡張構文があり、ディレクティブは2種類あります。

【グローバルディレクティブ】
 スライド全体に影響する設定(例: theme, size)。同じグローバルディレクティブを複数回設定した場合、後に書かれた値が優先されます。

  • theme:スライド全体のテーマ名を指定

  • style:テーマを微調整するための CSS を直接記述

  • headingDivider:見出し区切りオプション

  • size:テーマが提供するスライドサイズを指定

  • math:数式描画ライブラリを選択

  • title:スライド全体のタイトル

  • author:著者

  • description:スライドの説明

  • keywords:カンマ区切りのキーワード

  • urlHTML :出力時の正規 URL

  • image:Open Graph 用画像 URL(HTML 出力時)

  • marp:VS Code で Marp 機能を有効化するか

【ローカルディレクティブ】
 1 枚のスライドだけに適用される設定(例: paginate, header, footer)。
 ローカルディレクティブは、次のスライドに明示的な設定が無い限り前のスライドから継承されます。ただし接頭辞に"_"をつけることで指定ページのみに適用(spot directives)することが可能です。

  • paginate:true にするとページ番号を表示

    • タイトルスライドだけ番号をスキップする場合、paginate の定義を 2 枚目以降に置く、またはタイトルスライドで _paginate: false を指定

  • header:スライドのヘッダーを設定

  • footer:スライドのフッターを設定

  • class:<section> 要素に付与する HTML class 属性

  • backgroundColor:スライドの background-color スタイル

  • backgroundImage:スライドの background-image スタイル

  • backgroundPosition:スライドの background-position スタイル

  • backgroundRepeat:スライドの background-repeat スタイル

  • backgroundSize:スライドの background-size スタイル

  • color:スライドの文字色 (color スタイル)

4-2.ヘッダーの自動調整機能

  • 見出し (#, ## …) の直後に <!--fit--> を書くと、文字サイズを自動縮小して見出し行を 1 行に収める。

  • headingDivider と併用すると、1 行に収まるスライドを 1 見出し=1 スライドで量産できる。

4-3.フラグメントリスト

Marpは、断片化されたリスト(インクリメンタルリストまたはビルドとも呼ばれる)を示すために、いくつかの珍しいリストマーカーを使用します。

フラグメントリストは、HTMLにエクスポートする場合にのみ使用できます。PDFやPPTXにエクスポートすると、フラグメントリストは通常のリストとしてレンダリングされます。

4-4.ヘッディング・ディバイダー

heading divider ディレクティブは指定されたレベルの見出しの前に自動的にスライドの区切りを追加するようにMarpに指示します。このディレクティブは既存のMarkdownドキュメントをスライドに変換するときに特に便利です。

4-5.スライドの書き方

 以下の通り。

  • ページ区切り:水平線 ---

  • 先頭のスライドにはタイトルを書き、次の --- 以降に内容を追加

  • marp: true をフロントマターに書くと VS Code でプレビューが有効化

  • <!--コメント--> はスピーカーノートとして使える

4-6.画像拡張記法

 以下の通り。

画像

4-7.数式のレンダリング

  MarpはMathJax(あるいはKaTeX)を使って数式をレンダリングします。
 グローバルディレクティブの"math"にレンダリングツールを記載すれば設定できます。

4-8.テーマ作成

 HTMLやCSSでテーマ作成が可能。

5.応用編(Marp)

 体裁を整えるための微調整やTipsが多くあります。
※使いながら適時記載予定

 細やかな体裁を調整する機能はMarpにはまだ実装されていないため、必要に応じてHTMLやCSSを使用して調整します。

5-1.画像の追加・加工

 Marpでは画像の追加が可能です。

  1. 画像の表示

  2. 画像サイズ変更

  3. フィルター

  4. 背景画像

  5. 複数の背景 (Marpitの高度な背景)

  6. 分割背景

  7. フッターやヘッダーに画像(logoなど)を表示

【画像表示】
 シンプルに画像を表示する場合は下記の通り。

!["画像の説明文"](<画像のファイルパス>)

【test.md】
![konan.JPG](./konan.JPG)
画像

【画像サイズの指定】
 画像サイズをPixel単位で指定するのは下記の通り。

![width:<ピクセル数>px height:<ピクセル数>px(<画像のファイルパス>)

【test.md】
![width:200px height:200px](./konan.JPG)
画像

【フィルター】
 画像サイズにフィルターをかけるのは下記の通り。

  • blur:ぼかし

  • blur sepia:セピアのぼかし

  • opacity:透明度

  • grayscale:グレースケール

![<フィルターの種類>:<割合>](<画像のファイルパス>)

【test.md】
![blur:10px](./konan.JPG)
画像

【test.md】
![blur sepia:50%](./konan.JPG)
画像
【test.md】
![opacity:50%](./konan.JPG)
画像
【test.md】
![grayscale:50%](./konan.JPG)
画像

【背景画像】
 スライドの背景に画像を設定するには、画像の構文にbgキーワードを追加します。背景画像にも透かしやグレースケール追加も可能です。

![bg](<画像のファイルパス>)

【test.md】
![bg](./konan.JPG)
画像
【test.md】
![bg](https://picsum.photos/1200/800)
画像

【複数の背景 (Marpitの高度な背景)】
 Marpitの高度な背景機能を使うと、1つのスライドに複数の背景画像を重ねて表示できます。これは画像を連続して記述することで実現します。

【test.md】
![bg](./konan.JPG)![bg grayscale:50%](./konan.JPG)![bg blur:10px](./konan.JPG)
画像

 verticalキーワードを追加すると、背景の配置方向を縦方向に変更できます。

【test.md】
![bg](./konan.JPG)![bg grayscale:50%](./konan.JPG)![bg blur:10px](./konan.JPG)
画像

【分割背景】
 Decksetのような分割背景を実現するには、bgキーワードに加えてleftまたはrightキーワードを使います。これにより、スライドの一部を背景画像用に確保できます。

【test.md】
![bg left](./konan.JPG)
画像

 本機能で下記のようなスライドが簡単に作れます。

【test.md】
![bg right](https://picsum.photos/800/600)

## スライドコンテンツ

ここにメインのコンテンツを記述します。
画像が右側に表示されます。
画像

【フッターやヘッダーに画像(logoなど)を表示】
 フッターやヘッダーに画像(ロゴなど)を直接表示する機能はMarpでみつけきれませんでした。
 代わりにCSSで背景画像として設定したり、Markdownに直接HTMLタグを埋め込んだりする方法を利用していきます。CSSは不慣れなので、HTMLタグを直接いれてみました。
※実装は生成AIに依頼

【test.md】
# スライドタイトル

フッターを画像で表示
- カスタムテーマのCSSでロゴを設定
- Markdownファイル内の<style>タグでロゴを設定

<style scoped>
section::after { /* フッターの擬似要素として ::after を使用 */
  content: "";
  display: block;
  position: absolute;
  bottom: 0; /* スライド下端にぴったり配置 */
  left: 0;   /* スライド左端にぴったり配置 */
  width: 100%; /* スライドの全幅 */
  height: 100px; /* フッターとして表示したい画像の高さ */
  background-image: url('https://picsum.photos/800/600'); /* 👈 ここをあなたの画像のURLまたは相対パスに置き換えてください */
  background-size: cover; /* 要素全体に画像が広がるように調整 */
  background-position: center bottom; /* 画像の表示位置を調整 (中央下部) */
  background-repeat: no-repeat;
  z-index: 10; /* 他のコンテンツより前面に表示 */
}

/* 画像がコンテンツに被らないように、必要であればスライドのpaddingを調整 */
section {
  padding-bottom: 120px; /* 画像の高さ+αで調整 */
}
</style>
画像

5-2.文字のサイズ・色調整

 文字をプレゼン資料内に収めたり、強調したりするための構文を紹介します。

6.学習用

 他に触ってみた内容を紹介します。

6-1.シンタックスハイライト

 Markdownの機能ですが、HTMLやPythonのような言語を埋め込む時に、シンタックスハイライト(色を付けて綺麗に表示)が可能です。
※Marp自体はMarkdownをスライドに変換するツールのためPythonを実行はできません。

 埋め込みは```(バッククォート)の後に言語名を記載します。結果は下記の通りであり、コードが綺麗に表示されました。

[test.md]
---
marp: true
author: KIYO
math: mathjax
---

<style>
section {
  padding: 0px 20px 20px 20px; /* スライド全体の余白を調整 
}
</style>

# Python埋め込みテスト
## 正規分布
$$
_f(x | \mu, \sigma^2) = \frac{1}{\sqrt{2\pi \sigma^2}} e^{-\frac{(x-\mu)^2}{2\sigma^2}}
$$

<details>
<summary>Pythonコードを表示/非表示</summary>

```python
import math
import numpy as np
import matplotlib.pyplot as plt

def normal_dist(x, mu, sigma):
    output = 1 / (math.sqrt(2 * math.pi * sigma**2))) * math.exp(-((x - mu)**2) / (2 * sigma**2)
    return output

mu = 0 # 平均
sigma = 1 # 標準偏差
x = np.linspace(-3, 3, 100)示範囲を平均と標準偏差に合わせる
y = normal_dist(x, mu, sigma)
```
</details>
画像

6-2.ロゴをつける

 スライドの指定場所に画像を埋め込むこともできるため、ロゴを付けることが出来ます。下記記事参考にしながら作成してみました(AIで作成)。

[marp_log.md]
---
marp: true
theme: gaia
---

<style>
header::after {
  content: "";
  display: block;
  position: absolute;
  right: 25px; 
  top: 10px; 
  width: 250px;
  height: 80px;
  background: url("https://raw.githubusercontent.com/marp-team/marp/master/marp.png") no-repeat center;
  background-size: contain;
}
</style>

<!-- header: " " -->
# Marpスライドのロゴ表示

## ロゴ配置方法
ヘッダー右上にロゴを配置するには、`::after`疑似要素とCSSを利用します。

---

<!-- header: " " -->
## 実装コードとイメージ
**実装イメージ:** ヘッダーにロゴが表示されます。
(通常、ヘッダーにテキストがある場合はそれと共に表示されます)
```css
/* ヘッダー右上にロゴを配置 */
header::after {
  content: "";
  display: block;
  position: absolute;
  right: 25px; 
  top: 10px; 
  width: 250px;
  height: 80px;
  background: url("https://raw.githubusercontent.com/marp-team/marp/master/marp.png") no-repeat center;
  background-size: contain;
}
```



---
<!-- header: " " -->
## CSS解説とまとめ

*   `header::after`: ロゴ表示用のコンテナを生成。
*   `position: absolute; right: 25px; top: 10px;`: 右上に配置。
*   `width: 250px; height: 80px;`: ロゴサイズを指定。
*   `background`: ロゴ画像を指定し、表示方法を調整。
    *   `url(...)`: 画像パス(今回はMarpチームのロゴURL)。
    *   `no-repeat center`: 画像を中央に1つだけ表示。
    *   `background-size: contain;`: アスペクト比を保ちつつフィット。

 現状のthemaがgaiaになっておりますがこれを削除するとロゴも消えます。Gaiaテーマに依存せずにヘッダーとロゴを表示するために、header 要素に直接スタイルを適用します。
 フロントマターから theme: gaia を削除し、<style> タグ内に header 要素自体にスタイルを追加してみましたが、なんかこれじゃない感(上の余白が空きすぎ)がでました。
 多分CSSとかちゃんといじったらできると思いますが、結構手間なので他の人の記事を待ちます。

[marp_logo2.md]
---
marp: true
---

<style>
header {
  height: 80px; /* ヘッダーの高さをロゴの高さに合わせる */
  position: relative; /* ロゴの絶対配置の基準とする */
}

header::after {
  content: "";
  display: block;
  position: absolute;
  right: 25px; 
  top: 0; /* ロゴをヘッダーの上端に配置 */
  width: 250px;
  height: 80px;
  background: url("https://raw.githubusercontent.com/marp-team/marp/master/marp.png") no-repeat center;
  background-size: contain;
}
</style>

<!-- header: " " -->
# Marpスライドのロゴ表示

## ロゴ配置方法
ヘッダー右上にロゴを配置するには、`::after`疑似要素とCSSを利用します。

---

<!-- header: " " -->
## 実装コードとイメージ
**実装イメージ:** ヘッダーにロゴが表示されます。
(通常、ヘッダーにテキストがある場合はそれと共に表示されます)
```css
/* ヘッダー右上に企業ロゴを配置 */
header::after {
  content: "";
  display: block;
  position: absolute;
  right: 25px; 
  top: 0; /* ロゴをヘッダーの上端に配置 */
  width: 250px;
  height: 80px;
  background: url("https://raw.githubusercontent.com/marp-team/marp/master/marp.png") no-repeat center;
  background-size: contain;
}
```

---
<!-- header: " " -->
## CSS解説とまとめ

*   `header::after`: ロゴ表示用のコンテナを生成。
*   `position: absolute; right: 25px; top: 0;`: 右上に配置。
*   `width: 250px; height: 80px;`: ロゴサイズを指定。
*   `background`: ロゴ画像を指定し、表示方法を調整。
    *   `url(...)`: 画像パス(今回はMarpチームのロゴURL)。
    *   `no-repeat center`: 画像を中央に1つだけ表示。
    *   `background-size: contain;`: アスペクト比を保ちつつフィット。


参考資料

別添1:Marp/Marpit

別添2:技術ブログ

別添3:Markdown

別添4:その他

あとがき

 あくまで「テキストでサクッとつくる」というところがよいけど、微調整とかファイルのベースを作る(後は手で修正)って所までやろうとすると学習コストが跳ね上がりそう。
 ただ、説明資料とかはめちゃめちゃ使えそうなのでつかってみたい

 


いいなと思ったら応援しよう!

ピックアップされています

自分用

  • 27本

コメント

コメントするには、 ログイン または 会員登録 をお願いします。
普段は製造業で企画/開発/設計しております。記事はプログラミング・機械学習、IoT関係の記事をメインで作成し、なるべく1つの記事で知りたいことを網羅していきます。内容は学術的より実装・アウトプット(ほしくなるもの)を重視して作成しています。 面白そうな仕事があればやりたいです!
Markdownのスライド作成:Marp|KIYO
word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word

mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1