AMPに対応したHUGOサイトに数式を載せる
HUGOで構築され、AMPに対応したWebサイトで、エラーなく数式を表示する方法を紹介します。
2022年3月17日追記
2022年現在ではGoogle検索におけるAMPの優位性はなく、AMPページに数式を載せようと四苦八苦するくらいならAMPに対応しない、という選択もあると思います。 画像のサイズを明記するなど、AMPで必須とされているものは確かに高速化につながっていると思います。 しかし全て完璧にしなければならず、そのための対応コストは大きいです。
ここでは簡単に、2022年版の数式の載せ方を紹介します。
まず、Shortcodesを作成します。
以下の内容で、通常用のmath.html
、AMPページ用のmath.amp.html
を作成してください。
math.html
{{- if .Get 0 -}}
\( {{ .Inner }} \)
{{- else -}}
\[ {{ .Inner }} \]
{{- end -}}
math.amp.html
<amp-mathml layout="container" {{ if .Get 0 }} inline {{ end }} data-formula="\( {{ .Inner }} \)"></amp-mathml>
次に、数式表示用のライブラリを読み込みます。
.HasShortcode "math"
は、math
というShortcodesが使われていれば真、使われいなければ偽を返します。
これで数式が使われいるときだけライブラリを読み込めるようになります。
以下では、math
というShortcodesが使われているときだけKaTeXというライブラリを読み込むコードの例です。
|
|
Shortcodesの使い方を紹介します。
1行全体を使って数式を表示するには、以下のようにします。
{{< math >}} x = \frac{-b \pm \sqrt{b^2 - 4ac}}{2a} {{< /math >}}
文中(インライン)に表示するには、以下のようにinline
を書き加えます。
{{< math inline >}} x = \frac{-b \pm \sqrt{b^2 - 4ac}}{2a} {{< /math >}}
概要
ここでは、大まかな流れを説明します。 実際の方法を見たい方は次の章 からご覧ください。
通常のページとAMPのページではさまざまな差があり、AMPの方が制約が厳しいです。 AMPでは、ごく限られた一部のJavaScriptしか使えないというのが、大きな問題になります。
以下が構築の流れです。
- 通常ページとAMPページでテンプレートを分け、それぞれライブラリを読み込む
- 通常ページとAMPページごとにShortcodesを作成
- 数式を表示したい記事のフロントマターの設定
- Shortcodesを用いて数式の表示
通常ページとAMPページ
通常ページとAMPページでは、異なる対応をします。 これは、AMPでは一部のJavaScriptしか使えず、広く使われている数式表示ライブラリを使えないからです。
フロントマターによってライブラリの読み込みを判断
フロントマターとは、記事ファイル上部にある各種設定が書かれている部分のことです。
フロントマターにMath
パラメータを設定し、この値に応じて、ライブラリを読み込むか否かを判断します。
これは、数式が使われてない記事を表示するときに、数式表示ライブラリを読み込むのを防ぐためです。
AMPの仕様では、不要なコンポーネントを読み込むとエラーになります。
使用しないのに数式表示ライブラリを読み込むとエラーとなるため、このような対応をします。
Shortcodesの使用
Shortcodesとは、部品のようなものです。 必要に応じて値を渡すことができ、記事中でShortcodesを置いたところにShortcodesの処理結果が埋め込まれます。
通常ページとAMPページで用いるライブラリが違うと、インライン表示(文に混ぜる)と単独表示(?)の指定などが異なります。 そのため、記事中のShortcodesで数式とともに表示方法の指定をすれば、Shortcodes側で処理をするようにします。
この記事では、このブログで使用しているRobust というテーマに沿って説明します。
ライブラリの読み込み
通常ページとAMPページでは、使用するライブラリ(コンポーネント)が異なります。
通常ページ
通常ページでは、Webサイトで数式を表示するために広く使われている、MathJax を使用します。
まず、themes\hugo_theme_robust\layouts\_default\baseof.html
をlayouts\_default\baseof.html
にコピーします。
このファイルは、Webページの土台のようなものです。
次に、コピーしたbaseof.html
ファイルのヘッダー(<head>
~</head>
で囲まれている部分)のどこかに、以下のコードを貼り付けます。
|
|
AMPページ
AMPページでは、MathJaxなどのJavaScriptを使用できません。 その代わりに、「amp-mathml 」という数式を表示するためのコンポーネントが提供されています。
まず、themes\hugo_theme_robust\layouts\_default\baseof.amp.html
をlayouts\_default\baseof.amp.html
にコピーします。
このファイルは、AMPページにおいてbaseof.html
の代わりになるものです。
次に、コピーしたbaseof.amp.html
ファイルのヘッダーのどこかに、以下のコードを貼り付けます。
|
|
Shortcodesの作成
通常ページ
layouts\shortcodes\math.html
というファイルを作成し、以下のコードを貼り付けます。
|
|
AMPページ
layouts\shortcodes\math.amp.html
というファイルを作成し、以下のコードを貼り付けます。
|
|
フロントマターの設定
フロントマターのどこかに、数式を表示したい記事ではmath: true
という記述を加えます。
数式を表示しない記事ではmath: false
という記述を加えるか、何も記述をしません。
必要に応じてthemes\hugo_theme_robust\archetypes\default.md
をarchetypes\default.md
にコピーし、フロントマターにmath: false
と加えておくと、簡単に数式を表示するか否かを切り替えられて便利だと思います。
以下が、数式を表示する記事のフロントマターの例です。 いろいろな書き方があるので、ご自身のフロントマターの書き方に合わせてください。
|
|
数式の記述
Shortcodesを用いて数式を埋め込みます。
表示結果は、この記事のAMP版 でもご確認ください。
インライン表示にするか否かは、inline
パラメータを読み取っています。
インライン表示にしたければinline="true"
、1行表示ならinline=""
を指定します。
この辺は、もっと良い方法があるかもしれません。
インライン表示
インライン表示の場合は、記事中に例えば次のように書きます1。
今回は、{{< math formula="ax^2 + bx + c = 0" inline="true" >}}という式について解説します。
すると、結果は次のようになります。
今回は、\( ax^2 + bx + c = 0 \)という式について解説します。
1行表示
数式を1行で表示する場合は、例えば次のように書きます。
次に、二次方程式の解の公式を示す。{{< math formula="x = \frac{-b \pm \sqrt{b^2 - 4ac}}{2a}" inline="" >}}
すると、結果は次のようになります。
次に、二次方程式の解の公式を示す。\[ x = \frac{-b \pm \sqrt{b^2 - 4ac}}{2a} \]
これで、記事中に数式を表示できるようになりました。
-
この部分は、
{{</* math formula="ax^2 + bx + c = 0" inline="true" */>}}
のように書いて、エスケープしました。 ↩︎