Marp のマイナー機能いろいろ
ここでは、 "Marp の作者自ら" 、Marp の『あんまり使われてなさそうなマイナー機能』や『Tips・テクニック』を随時紹介します。
Marp のメジャーな機能はいろいろな方が紹介してくださっているので、ここでは割愛。
# <!--fit-->
(Fitting header)
<h1>
〜<h6>
に相当する各見出しの中に <!-- fit -->
コメントが含まれていると、その見出しは画面全体に拡大されます。
# 普通の見出し
# <!--fit--> 画面全体に拡大
Deckset の # [fit]
と同等ですが、HTMLコメントを使用している点が異なります。
ドキュメント
暫定ドキュメント もあります。
Marpit フレームワークを直接使用している開発者向けの注意
Fitting header は Marp Core の機能なので、Marpit フレームワーク を直接使用している場合は使えません。
Marpit フレームワークは、「ブラウザのコンテキストに依存せずに、再現性のある表示を実現する」ことを目的としたフレームワークですので、ブラウザ側の JavaScript に依存する拡大縮小処理が必要な機能は、 Marp Core に実装されています。
<!--fit-->
で高橋メソッド
見出しでページを区切る headingDivider
ディレクティブ を組み合わせると、 高橋メソッド のスライドも簡単に書けます。
---
# 中央寄せしてくれるテーマを使う
theme: uncover
headingDivider: 1
---
# <!--fit--> 高橋<br />メソッド
# <!--fit--> 特徴
# <!--fit--> 巨大な<br />文字
# <!--fit--> 簡潔な<br />言葉
<br>
は、Marp ツールの HTML 設定を許可しなくても使えるタグなので、気兼ねなく使って大丈夫です。
アニメーション
一般的なシーンでは、プレゼンテーションにおけるアニメーションは悪手になることが多いと考えているので、Marp では積極的にサポートされていません。
ただし、アニメーションの使用が充分に効果的で、いざ必要となった場合は、CSS でアニメーションを定義できます。
animate.css
を使用する
スライドの各要素に手っ取り早くアニメーションを適用するなら、ライブラリの力を借りると良いでしょう。
---
theme: uncover
# インラインスタイルで animate.css を読み込む
style: '@import url(https://cdnjs.cloudflare.com/ajax/libs/animate.css/4.1.1/animate.min.css)'
---
<div class="animate__animated animate__fadeInDown animate__slow">
# アニメーション
</div>
<div class="animate__animated animate__fadeInDown animate__delay-2s">
animate.css を使うとカンタン
</div>
アニメーションは、 "HTML 形式に出力した際に、ページを切り替えて表示したタイミングで再生" されます。
ライブラリの使用方法や、他のアニメーションのプリセットなどは、 animate.css のドキュメント を参照してください。
@keyframes
を定義して使用する
自分で CSS を書く場合、 HTML タグを許可しなくても使えます。
---
theme: uncover
---
# アニメーション
自分で CSS 書いちゃうもんね
<style scoped>
@keyframes slide-down {
from {
opacity: 0;
transform: translateY(-100px);
}
}
h1 {
animation: slide-down 1s ease-in-out 0s 1 both;
}
p {
animation: slide-down 1s ease-in-out 1s 1 both;
}
</style>
---
...
トランジション(ページ切り替え効果)
Marp CLI でデフォルトで使用される HTML テンプレートでは transition
ディレクティブが定義されます。これにより、エクスポートした HTML でトランジション(ページ切り替え効果)を使用することができます。
Marp の VS Code 拡張機能も、エクスポートに Marp CLI を使いますので、同じようにトランジションを使用できます。
Marpit フレームワーク、Marp Coreを直接使用している開発者向けの注意
トランジションは Marp CLI で使われる HTML 出力で定義された機能なので、Marpit や Marp Core を直接使用している場合は使用できません。これらのライブラリにおいては、『ページ切り替えなどのUIに関わる機能』はスコープ外です。
使い方
transition
ディレクティブを定義します。以下の Markdown は、全ページの切り替えでフェード効果を付与します。
---
transition: fade
---
# First page
---
# Second page
他のディレクティブ (paginate
, header
など) と同じように、単一ページの画面遷移のみを設定する場合は、アンダースコア付きの _transition
ディレクティブを使用できます。
---
transition: fade
---
次スライドへの遷移時はフェード
---
<!-- transition: cover -->
次スライドへの遷移時はカバー
---
<!-- _transition: none -->
次スライドへの遷移時は効果なし
---
次スライドへの遷移時はカバーに戻る
---
...
トランジションの種類
Marp CLI に組み込まれている、合計 33種類 のトランジションを使用できます。 ドキュメント を参照してください。
例
cube | reveal | swoosh | wipe |
これらはあくまで一部です。
遷移時間
Marp CLI 組み込みのトランジションの持続時間は、いずれも 0.5 秒 です。
変更する場合は、 transition
ディレクティブの定義で、スペースの後に持続時間を記入します。(例: 0.5s
2s
500ms
など)
<!-- transition: fade 1s -->
カスタムトランジション
満足のいくトランジションが無い場合は、自分で好きな動きのトランジションを作ることができます。Markdown のインラインスタイルや、カスタムテーマで定義することができます。
アニメーションを定義するときと同じように @keyframes
を使用し、 Marp で決められたルールに沿った名前のキーフレーム[1]を定義してください。
---
transition: triangle
---
<style>
@keyframes marp-incoming-transition-triangle {
from { clip-path: polygon(0% 0%, 0% 0%, 0% 0%); }
to { clip-path: polygon(0% 0%, 200% 0%, 0% 200%); }
}
@keyframes marp-incoming-transition-backward-triangle {
from { clip-path: polygon(100% 100%, 100% 100%, 100% 100%); }
to { clip-path: polygon(-100% 100%, 100% -100%, 100% 100%); }
}
</style>
# カスタムトランジション
---
<!-- _class: invert -->
# カスタムトランジション
以下のブログ記事で、ステップ・バイ・ステップでその方法を解説しています。
ドキュメントはこちら。
このスクラップで詳しく説明すると長大になりそうなので、いずれ日本語訳するかも。
-
正規表現なら
/^marp(-incoming|-outgoing)?-transition(-backward)?-(.+)$/
↩︎
モーフィング
トランジション中に、PowerPoint の変形アニメーション (Morph) や、Keynote の Magic Move のような 『スライド間をまたがる動き』(モーフィング) をつけることができます。
①の画像がモーフィングしている様子
View Transition API で定義されている CSS プロパティ view-transition-name
を画像などの要素に付けます。
---
theme: gaia
transition: fade
---
<style>
/* ⬇️ ①の画像を "one" という名前でモーフィング可能に設定 ⬇️ */
img[alt="1"] {
view-transition-name: one;
contain: layout;
}
/* ①②③の画像の共通設定 */
img:is([alt="1"], [alt="2"], [alt="3"]) {
height: 64px;
position: relative;
top: -0.1em;
vertical-align: middle;
width: 64px;
}
</style>
# Today's topics
- ![1](https://icongr.am/material/numeric-1-circle.svg?color=666666) Introduction
- ![2](https://icongr.am/material/numeric-2-circle.svg?color=666666) Features
- ![3](https://icongr.am/material/numeric-3-circle.svg?color=666666) Conclusion
---
<!-- _class: lead -->
![1 w:256 h:256](https://icongr.am/material/numeric-1-circle.svg?color=ff9900)
# Introduction
---
# ![1](https://icongr.am/material/numeric-1-circle.svg?color=666666) Introduction
Marp is an open-sourced Markdown presentation ecosystem.
It provides a writing experience of presentation slides by Markdown.
トランジション効果のついたページ遷移の前後で、同じ view-transition-name
がついた要素 (今回の場合は "①" の画像) は、自動的にモーフィングアニメーションになります。
View Transition API について説明している拙作の記事はこちら。
カスタムテーマのサイズプリセット
Marp Core のテーマシステム (Marpit フレームワークから拡張) は、カスタムテーマ上で サイズプリセット を定義することができます。
/**
* @theme custom-theme
* @size 16:9 1280px 720px
* @size 4:3 960px 720px
* @size 16:10 1280px 800px
* @size uwide 1680px 720px
*/
section {
/* デフォルトのサイズは section 要素で設定 */
width: 1280px
height: 720px;
}
CSS のメタデータコメントとして、 @size [名前] [横幅] [縦幅]
を定義してください。定義したサイズは、 Markdown 側で size
グローバルディレクティブで設定できます。
---
theme: custom-theme
size: uwide
---
# ウルトラワイドモニター用の比率
Marpit フレームワークを直接使用している開発者向けの注意(+小話)
サイズプリセットや、 size
グローバルディレクティブは Marp Core の機能なので、Marpit フレームワーク を直接使用している場合は使えません。
Marpit フレームワークのテーマシステムは、テーマ定義の複雑化を避けるため、 "1テーマ1サイズ" を基本として設計されました。
当初、Marp Core でもこのルールを維持するつもりでしたが、主に 旧 Marp ユーザーからの根強い機能要望に折れ、サイズプリセット機能と共に size
ディレクティブを復活させたという経緯があります。
サイズプリセット別のデザイン調整
サイズプリセットが選択されると、スライドを示す各 section
要素に data-size
属性 が付与されます。
特定のサイズに合わせたデザインにするために CSS を微調整する際は、 属性セレクター section[data-size="xxx"]
を使用します。
/**
* @theme custom-theme
* @size 4:3 960px 720px
*/
section {
width: 1280px;
height: 720px;
/* 16:9 の余白 */
padding: 36px 64px;
}
section[data-size="4:3"] {
/* 4:3 の時は、周囲の余白も 4:3 に合わせる */
padding: 36px 48px;
}
h1 {
font-size: 40px;
}
section[data-size="4:3"] h1 {
/* 4:3 の時は、h1 見出しも少し小さめに */
font-size: 30px;
}
@container
)
CSS コンテナークエリー (
最近のバージョンの Marp であれば、各スライドの section
要素は CSS コンテナーになっているため、 @container
で特定の横幅・縦幅を条件にスタイルをあてることもできます。
h1 {
font-size: 40px
}
/* 4:3 で設定された横幅以下の時だけ適用 */
@container (width <= 960px) {
h1 {
font-size: 30px
}
}
コンテナークエリーの長さ単位
スライド要素 section
がコンテナーなので、子孫要素に対しては、以下の長さの単位を使用することもできます。
-
1cqw
: スライド幅(パディングを除く)の 1% -
1cqh
: スライド高さ(パディングを除く)の 1% -
1cqmin
: cqw または cqh のどちらか小さい方 -
1cqmax
: cqw または cqh のどちらか大きい方
h1 {
/* スライド幅(パディングを除く)の 4% に設定 */
font-size: 4cqw;
}
これらの単位は @container
の中でなくても使用できます。
透かし(ウォーターマーク)
section::before
に対して content
で要素を生成することで、透かし(ウォーターマーク)を実現することができます。
テキスト透かし
<style>
section::before {
content: '社外秘';
position: absolute;
left: 50%;
top: 50%;
font-size: 40cqmin;
font-weight: bold;
color: red;
white-space: nowrap;
transform: translate(-50%, -50%) rotate(-45deg);
opacity: 0.25;
}
</style>
# 人事について
![bg right](https://images.unsplash.com/photo-1523287562758-66c7fc58967f?crop=entropy&cs=tinysrgb&fit=crop&fm=jpg&h=720&ixid=MnwxfDB8MXxyYW5kb218MHx8YnVzaW5lc3N8fHx8fHwxNzExODI2OTkx&ixlib=rb-4.0.3&q=80&utm_campaign=api-credit&utm_medium=referral&utm_source=unsplash_source&w=640)
画像透かし
section::before {
content: url('https://marp.app/assets/marp.svg');
position: absolute;
left: 50px;
bottom: 30px;
width: 200px;
opacity: 0.5;
}
section::before
の利点は、分割背景画像 ![bg right]()
にも干渉できることです。
分割背景は隔離された専用の領域が作られるため、通常は干渉できませんが、section::before
と section::after
(ページ番号) で生成された要素は唯一干渉できます。
Marp から編集可能な PPTX を生成
Marp CLI (およびそれを使う Marp for VS Code) は Marp スライドを PPTX にエクスポートすることができます。
これは PowerPoint や Keynote のようなスライドツールの発表者ツールを使用して発表するなど、発表に有用なツールを使えるようにするためのエクスポート機能です。PPTX は各ページの背景画像としてレンダリングされるため、内容の編集はできません。
しかし、一度 PDF にエクスポートしてから、PDF を PPTX に変換 すれば、変換後も編集可能になります。
よく質問されることなので、基本的にはココのよくある質問に書いてある通りですが、未だチラホラ「PPTXが編集できない!」と言われるので、こちらでも言及しておきます。
PDF → PPTX
Adobe Acrobat を持っていれば PPTX に変換できますが、持っていなくても以下の無料の Adobe 公式サービスで変換できます。
他にも変換サービスは数多ありますが、信頼性を考えると基本的には Adobe で良いでしょう。
比較表
Marp → PPTX | Marp → PDF → PPTX | |
---|---|---|
内容の編集 | ✖ できない | ✅ できる |
見た目の再現性 | ✅ 100% | △ 劣化の可能性あり |
発表者ノート | ✅ 含む | ✖ 含まない |
使用しているテーマ・フォント・スタイルによっては、変換後の結果が激しく劣化する可能性があります。
Marp の売りは「編集中のプレビューの見た目と、最終出力の見た目がちゃんと同じ」という部分なので、見た目が変わると困る!という方も多いと思われます。
再現性を重視したいのであれば、内容の編集ができない通常の PPTX 変換を使いましょう。Marp と PPTX でドキュメントの二重管理を避ける意味でも、Marp で完結することをお勧めします。