📕

【Marp】MarkdownをA4テキストにする方法

に公開

Markdownを「ちゃんと」A4にしよう

本記事では、Markdownで発表スライドを作るツールであるMarpを用いて、A4スライドを作る方法について述べます。A4サイズのスライドがそのままA4テキストとして使えるという算段です。

前置き:Markdownの特徴おさらい

Markdownとは便利なもので、「簡単な記法で整ったテキストを作成できる」点で非常に優れています。

Markdownの良い所

Markdownよりも整ったテキストを作る手段は数多あります。最も有名なのは、MicrosoftWordでしょう。また、マークアップ言語であるHTMLも、Web開発を主として世界的に普及し、利用されています。

しかし、Wordには専用のアプリケーションが必要な他、バージョンや環境の違いによって、表示が崩れることがあります。一方HTMLは然程環境に左右されないものの、記述が複雑になりがちです。

HTMLで書く表の例
<table>
  <thead>
    <tr>
      <th>用紙サイズ</th>
      <th>寸法 (幅 × 高さ / mm)</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>A0</td>
      <td>841 × 1189</td>
    </tr>
    <tr>
      <td>A1</td>
      <td>594 × 841</td>
    </tr>
    <tr>
      <td>A2</td>
      <td>420 × 594</td>
    </tr>
    <tr>
      <td>A3</td>
      <td>297 × 420</td>
    </tr>
    <tr>
      <td>A4</td>
      <td >210 × 297</td>
    </tr>
  </tbody>
</table>

上のHTMLをブラウザーで表示すると、あまりにも簡素過ぎる表が出来上がります。

簡素な表


その点Markdownは、メモ帳などでテキストファイルを作成するだけです。記述も簡単です。表を書く際に、この違いは顕著になります。

Markdownで書く表の例
|用紙サイズ|寸法 (幅 × 高さ / mm)|
|:-|:-|
|A0|841 × 1189|
|A1|594 × 841|
|A2|420 × 594|
|A3|297 × 420|
|A4|210 × 297|

上のテキストは下のように表示されます。

用紙サイズ 寸法 (幅 × 高さ / mm)
A0 841 × 1189
A1 594 × 841
A2 420 × 594
A3 297 × 420
A4 210 × 297

メモ帳の場合
メモ帳で表示した場合
左上のはみ出た線のようなものはカーソル

Markdownの弱点

環境に左右されづらく記述も簡単という、良いとこどりのようなMarkdownですが、書籍で言うページという概念がありません。Wordには辛うじて改ページ機能がありますが、Markdownにそのようなものはありません。

つまり、Markdownだけでは本当の意味でのA4テキストは作れないと、そう言えるのではないでしょうか。

明確なページの区切りがありませんから、思いがけぬことが原因でページが崩壊するおそれがあります。そうなっては、テキストとして粗悪だと評されてしまうこともあるでしょう。

表示が崩れる例
表がたった一行のみページを跨いでいる

個人のレベルであれば、特段気にならないという方もあるでしょう。しかし仕事で人に見せられたテキストがこの出来栄えだったならどうでしょう、粗雑さを感じてしまうのではないでしょうか。

始めからMarkdownなんて使わなければ良かったのに

折角工夫したところに斯くも辛辣な言葉は、言いたくも、言われたくもないでしょう。

本題:MarpA4ページを作る

Marpは、Markdownの記法を応用して発表スライドを作るものです。要は、PowerPointのようなものです。

スライドを作るものですから、スライド一枚一枚が完全に別のページになります。つまり、Markdownには無かった、ページの概念を導入できるのです。

通常はA4ではない

発表スライドがA4で作られることはほぼないように、Marpで作られるスライドもまたA4ではありません。

通常のMarpスライド

A4にするには

Markdown同様、MarpにはCSSを適用することができます。つまり、CSSでスライドの縦横比をA4にすれば、A4スライドができあがります。しかしMarpCSSを適用するには、少々設定が必要です。

\huge{\frak{1}}. Marp for VSCodeの場合

Marpと言えば、VSCodeの拡張機能である「Marp for VSCode」を使っている方も多いのではないでしょうか。以前投稿した下の記事ですが、私のものにしては珍しく2000回以上表示されているとのことで、或る程度の関心があるのだと感じています。

https://zenn.dev/link/articles/3aafed215725e9

\tt{1}. Marpの設定を開く

Marpのアイコン→Open Extension Settingsを選択すると、Marpの設定が開かれます。

Marpのアイコンを選択

Open Extension Settings

\tt{2}. テーマを設定する

Markdown › Marp: Themesという項目がありますので、ここにテーマとなるCSSファイルの所在を記します。

Themes

CSSファイルは自分で作成するところですが、GitHubにて公開されているファイルがありますので、先ずはそちらを紹介します。

https://github.com/pn11/marp-A4-theme

このREADME.mdによれば、https://raw.githubusercontent.com/pn11/marp-A4-theme/main/themes/A4.cssというリンクをMarkdown › Marp: Themesに設定すれば良いとのことです。「項目の追加」にURLを貼付してOKすれば、下のようになります。

ThemeにURLを設定

\tt{3}. テーマを使用する

先のREADME.mdを見ると、設定後はMarp側でこのように記載せよとあります。

抜粋:<https://github.com/pn11/marp-A4-theme>
---
marp: true
theme: A4
---

このA4というのは、テーマの名前です。A4.cssというファイル名と一致していますが、厳密には、ファイル名とテーマ名とは関係ありません。

これでテーマが適用され、スライドがA4サイズになります。

A4になったスライド

しかし、確かにA4にはなったものの、これを見ると表題が不適当に改行されていたり、左右の余白がやや大きすぎたりと、細かな箇所を調整しなければならないように見えます。

\tt{4}. カスタムテーマを作成する

今使用したのは既製のCSSファイルでしたから、作成するテキストに応じたCSSファイルを作ってみましょう。

自分で書く前に、先ほど使用したCSSの内容を見てみます。

https://github.com/pn11/marp-A4-theme/blob/main/themes/A4.css


第一に目に入るのは、このコメントです。

/* @theme A4 */

一見して唯のコメントですが、Marpit(Marpで発表スライドを生成している張本人)のドキュメントによれば、これは「Metadata」というものであり、省略してはならないそうです。このメタデータに記載した名称が、先述のテーマ名となります

https://marpit.marp.app/theme-css?id=metadata

メタデータの次に@import 'default';と記載して、Marp標準のテーマを読み込んで踏襲しています。これにより、この後に記述する内容は、標準のテーマを上書きすることになります。


A4の寸法
section {
  width: 210mm;
  height: 297mm;
}

sectionに縦横の大きさを記載することで、スライドの大きさを変更することができます。A4の寸法である「横 210 ㎜、縦 297 ㎜ 」に設定することで、スライドがA4になっているのです。

後のh2h3などは見出し、pは段落、liはリストについて定義しています。これらの記述を適宜変更・追加すれば、作成する内容に合ったデザインになります。

取り敢えず、表題が収まる程度にCSSを記述しました。

CustomA4.css
/* @theme CustomA4 */

@import 'default';

section {
  width: 210mm;
  height: 297mm;
  padding: 40px; /* 余白の調整 */
}

h1 {
    font-size: 35px;
}

p {
    font-size: 22px;
}

\tt{5}. カスタムテーマを適用する

先ほど設定のMarkdown › Marp: ThemesURLを記載したのと同様に、CSSファイルの所在を記載すれば、テーマとして使用できるようになります。

⋯そのはずなのですが、ユーザー単位の設定に絶対パスで記載したところ、適用されませんでした。そこで、ワークスペース単位での設定に記載します。

ワークスペースでテーマ設定
「ユーザー」ではなく「ワークスペース」で設定するため、相対パス

ワークスペース単位での設定が有効になると、.vscodeという隠しフォルダーと共に、設定ファイルが作成されます。この設定内容は、他のフォルダーを開いている際には適用されません。

これで、カスタムテーマが適用されました。表題が一行に収まり、左右の余白が小さくなりました。右の余白が大きく見えますが、句点の影響で改行されているためで、本来の領域は確り左右均等になっています。

調整後
段落の方は一文毎に改行してある

\tt{6}. スライドに変換する

スライドへの変換に特別なことは必要ありません。通常の16:9スライドの場合と同じ手順で変換することができます。設定を開いた時のように、下のコマンドパレットを表示します。但し今回は、Export Slide Deckとあるのを選択します。

Export Slide Deck
Export Slide Deckを選択する

標準の設定では、この操作でPDFへと変換されるようになっています。

PDF以外にもHTMLPNGなど、複数のファイル型式に変換することができます。変換型式は設定から変更できます。

Export Type
Export Typeを変更する

註書きしたように、PDFへの変換には失敗することがあるため、まずはHTMLに変換するのが無難でしょう。

プレゼン型式
発表者ツールも使える(右)

MarpにはMarpitという仕組みが備わっているため、Markdownを発表スライドという別物に変換できているのです。このMarpitの持つ大きな特徴として、HTMLに変換しても単なるファイルになるのではなく、「発表機能を備えたHTMLファイルが出来上がる」点が挙げられるでしょう。PowerPointのような発表者ツールも使えるので、その気があればA4テキストをそのままプレゼンテーションで使用することもできるのです。うれしいですね。

\huge{\frak{2}}. Marp CLIの場合(ややエンジニア向)

https://github.com/marp-team/marp-cli

Marp CLIを導入すれば、コマンドmarpを使うことができます。sample.mdというファイルがあるならば、次のコマンドでHTMLに変換されます。わざわざ設定を開いて、変換型式をPDFからHTMLに変更するような手間はありません。

convert to HTML
marp --html sample.md

コマンドで変換できるということは、「AIエージェントにスライドの作成から変換までを任せることができ、自動化できる」ということです。AIに一任したいなら、VSCodeではなくこちらのMarp CLIを使うとよいでしょう。

なお、MarpCSSファイルの記述に関する内容は、Marp for VSCodeの項にて既に述べたものとして、本項では省略します。

\tt{0}. Node.jsが使える環境を用意する

端から主題を離れるような手順が入ります。Marp CLIを使う方法がエンジニア向というのは、大方このためです。

エンジニアの諸賢であれば、既にNode.jsなどインストールしてあるとか、少し調べれば直ぐにインストールできるとか、さほど苦労する作業ではないはずです。しかし非エンジニアにとって、Node.jsをインストールすることは案外難しいものだと思います。

詳しい手順は主旨から乖離するため述べませんが、本記事ではクラウドサービスや仮想環境を推奨します。

クラウドサービスではこれらが無料でお薦めです。

  • Google Cloud Shell
    Googleアカウントがあれば、直ぐに自分専用のクラウド環境が使えるようになります。この環境には、始めからNode.jsが備わっています。
  • GitHub Codespaces
    GitHubアカウントを作る必要があったり、動作が遅かったりするものの、上と同様無料で手軽に使えるクラウド環境です。

環境を汚したくないエンジニアの方には、CondaPixiで仮想環境を作る方法がお薦めです。

Pixiを使った例
PS C:\⋯\A4> pixi init
Created C:\⋯\A4\pixi.toml
PS C:\⋯\A4> pixi add nodejs    
Added nodejs >=26.2.0,<26.3
PS C:\⋯\A4> pixi shell
(A4) PS C:\⋯\A4> npm -v
11.13.0

\tt{1}. Marp CLIをインストールする

https://github.com/marp-team/marp-cli#use-nodejs

Node.jsには、Node Package Manager(npm)というものがあります。これによってMarp CLIをインストールします。

local installation(推奨)
npm install --save-dev @marp-team/marp-cli
Pixiを使ったインストール例
(A4) PS C:\⋯\A4> npm install --save-dev @marp-team/marp-cli
npm warn deprecated mathjax-full@3.2.2: Version 4 replaces this package with the scoped package @mathjax/src

added 153 packages in 14s

19 packages are looking for funding
  run `npm fund` for details
npm notice
npm notice New minor version of npm available! 11.13.0 -> 11.15.0
npm notice Changelog: https://github.com/npm/cli/releases/tag/v11.15.0
npm notice To update run: npm install -g npm@11.15.0
npm notice

Node Package Managerでインストールしたものは、Node Package eXecuter(npx)で実行します。そのため、npx marpとしないとエラーになる点に注意しましょう。

バージョンを表示するコマンド
npx marp --version
Pixiを使った実行例
(A4) PS C:\⋯\A4> marp
marp: The term 'marp' is not recognized as a name of a cmdlet, function, script file, or executable program.
Check the spelling of the name, or if a path was included, verify that the path is correct and try again.
(A4) PS C:\⋯\A4> npx marp --version
@marp-team/marp-cli v4.4.0 (w/ @marp-team/marp-core v4.3.0)

単にmarpと入力した場合には、長いエラーメッセージが表示されています。それに対し、npx marpと入力した場合には、正しくコマンドとして認識され、バージョン情報が表示されています。

\tt{2}. CSSファイルを指定するには

VSCode同様、カスタムテーマを使うにはCSSファイルを指定する必要があります。Marp CLIの場合、次のようにオプションを記載するだけでよく、設定を変更するような手間はありません。

sample.mdcustom_theme.cssというファイル名だった場合、このようになります。

HTMLに変換する例(npxは省略)
marp --html sample.md --theme custom_theme.css

\tt{3}. HTMLに変換する

Pixiを使った変換例
(A4) PS C:\⋯\A4> npx marp --html .\HowToMakeSlideA4.md --theme .\CustomA4.css   
[  INFO ] Converting 1 markdown...
[  INFO ] HowToMakeSlideA4.md => HowToMakeSlideA4.html

以上がMarp CLIによる主な手順です。

\tt{Q}. inline CSSではだめなのか

Marpに限らずMarkdownファイルでは、CSSを直接記述することもできます。特にMarpでは、インラインCSSと言って次のような記述が可能です。

inline CSS
左右余白なし、フォント変更、フォントサイズ変更

画像の例
---
marp: true
style: |
    section {
        padding: 0px;
        font-size: 80px;
        font-family: "Georgia";
    }
---

# Marp × CSS

管理のしやすさという観点では、単一ファイルの中にMarpCSSが混在しているのは、あまり好ましくありません。しかしもっと根本的な理由から、CSSファイルに分離しています。

inline CSSでサイズ変更した場合
スライド自体はA4になっているが、それを表示できていない

私の環境では、いくら試しても上の画像のような状態になりました。
スライドには確かにCSSによる変更が適用されており、A4になっています。しかしスライドを表示する枠は16:9のままで、スライドの下部が隠れてしまっています。それだけでなく、スライドの無い右側の空間が表示されたままになっています。この現象は、HTML等に変換してもそのままです。

見切れたままのスライド

このような理由から、CSSファイルを別に用意して、カスタムテーマとして使用する必要があったのです。

A4にしてみて気になったこと

Marpの(テーマの)特徴として、文章などのコンテンツは全て上下方向に中央寄せになっています。

ページ比較
上下中央寄せになっている

この特徴は発表スライドとしては都合好いものでしたが、テキストとしては不格好に感じられます。しかし厳密には、この事象はCSSによって定義されたものなので、カスタムテーマの記述次第でどうにかできるのかもしれません。

Discussion