Hugo 0.122 で TeX/LaTeX 数式表現ができるようになった(いまさら?)

no extension

Hugo 0.122.0 がリリースされた。

今回の目玉機能は $\mathrm{\TeX}$/$\mathrm{\LaTeX}$ 記法による数式表現に対応したことらしい。 えっ,いまさら? あー,いや,そういえば別行立ての数式は shortcode とか使って細工する必要があったな,そういえば。

Hugo で $\mathrm{\TeX}$/$\mathrm{\LaTeX}$ 記法による数式表現に対応するには

  1. サイト設定ファイル hugo.toml (または config.toml) で数式表現用のデリミタ文字列を指定する
  2. 数式変換用のパッケージ(MathJax または KaTeX)を導入する

といった手順が必要。

サイト設定ファイルの内容はこんな感じ。

[markup]
  defaultMarkdownHandler = "goldmark"
  [markup.goldmark]
    [markup.goldmark.extensions]
      [markup.goldmark.extensions.passthrough]
        enable = true
        [markup.goldmark.extensions.passthrough.delimiters]
          block = [['\[', '\]'], ['$$', '$$']]

YAML や JSON で書く場合は Hugo のドキュメントを参照のこと。

KaTeX は使ったことがないが MathJax については以前に記事にしたことがあるので参考にどうぞ。

  1. ちょこっと MathJax: 初期設定
  2. ちょこっと MathJax: 基本的な数式表現
  3. ちょこっと MathJax: インライン数式と別行立て数式
  4. ちょこっと MathJax 番外編: mathcomp パッケージの代替え

これでたとえば

\[
\begin{aligned}
KL(\hat{y} || y) &= \sum_{c=1}^{M}\hat{y}_c \log{\frac{\hat{y}_c}{y_c}} \\
JS(\hat{y} || y) &= \frac{1}{2}(KL(y||\frac{y+\hat{y}}{2}) + KL(\hat{y}||\frac{y+\hat{y}}{2}))
\end{aligned}
\]

と書けば

\[ \begin{aligned} KL(\hat{y} || y) &= \sum_{c=1}^{M}\hat{y}_c \log{\frac{\hat{y}_c}{y_c}} \\ JS(\hat{y} || y) &= \frac{1}{2}(KL(y||\frac{y+\hat{y}}{2}) + KL(\hat{y}||\frac{y+\hat{y}}{2})) \end{aligned} \]

と展開される(筈)

いや,待て。 \[ ... \] って \begin{equation*} ... \end{equation*} と等価だろ。 問題なく処理はされるだろうけど,意味としておかしくないか。

試しに \[ ... \] を外して

\begin{aligned}
KL(\hat{y} || y) &= \sum_{c=1}^{M}\hat{y}_c \log{\frac{\hat{y}_c}{y_c}} \\
JS(\hat{y} || y) &= \frac{1}{2}(KL(y||\frac{y+\hat{y}}{2}) + KL(\hat{y}||\frac{y+\hat{y}}{2}))
\end{aligned}

とすると期待通りには変換しない。 Markdown のパーサが上の記述を丸ごと <p> 要素で囲ってしまうからのようだ。 サイト設定で指定したデリミタ文字列を使った

エネルギーと質量には $$E=mc^2$$ の関係がある。

みたいな記述なら

<p>エネルギーと質量には </p>
$$E=mc^2$$
<p> の関係がある。</p>

などとパーサ側でうまく分離してくれるのだが。

\begin{aligned} ... \end{aligned} のような $\mathrm{\LaTeX}$ 環境を無駄に \[ ... \] で囲むのがどうしても嫌な方は,強制的に <div> 要素で囲って

<div>
\begin{aligned}
KL(\hat{y} || y) &= \sum_{c=1}^{M}\hat{y}_c \log{\frac{\hat{y}_c}{y_c}} \\
JS(\hat{y} || y) &= \frac{1}{2}(KL(y||\frac{y+\hat{y}}{2}) + KL(\hat{y}||\frac{y+\hat{y}}{2}))
\end{aligned}
</div>

とすれば markdown のパーサが生の HTML 記述と解釈しスルーしてくれる1。 私は数式専用の shortcode を作って利用している。

{{< fig-math >}}
\begin{aligned}
KL(\hat{y} || y) &= \sum_{c=1}^{M}\hat{y}_c \log{\frac{\hat{y}_c}{y_c}} \\
JS(\hat{y} || y) &= \frac{1}{2}(KL(y||\frac{y+\hat{y}}{2}) + KL(\hat{y}||\frac{y+\hat{y}}{2}))
\end{aligned}
{{< /fig-math >}}

ブックマーク

参考図書

photo
[改訂第8版]LaTeX2ε美文書作成入門
奥村晴彦 (著), 黒木裕介 (著)
技術評論社 2020-11-14
大型本
4297117126 (ASIN), 9784297117122 (EAN), 4297117126 (ISBN)
評価     

2020年末に第8版が出てたのに気付かなかったよ。可能なら紙の本も買って常に側に置いておくのが吉。版元には PDF 版もある。

reviewed by Spiegel on 2021-09-05 (powered by PA-APIv5)


  1. たとえば \begin{aligned} ... \end{aligned} のような環境をよく使うというのであれば,デリミタとしてサイト設定ファイル(hugo.toml)に指定するのも手である。 ↩︎