KaTeX にて意図した通りに数式が表示されない問題

本サイトゥは,静的サイトゥ・ヂェナレイタである Hugo によつて構築されてをり,数式レンダリングには $\KaTeX$ を用ゐてゐます. この環境下で $\LaTeX$ の記法を用ゐても,意図した通りに数式が表示されない問題が幾度か発生しました.実際に発生した問題のうち,典型的なものを 1 つピク・アプして,解決策と共にご紹介いたします.

以下の式は,本サイトゥの記事「支那剰余定理」の中で記述した数式です:

\begin{aligned}
A / (I_1 \cap \dots \cap I_n) &= A / ((I_1 \cap \dots \cap I_{n-1}) \cap I_n) \\
&= A/((I_1\cdots I_{n-1}) \cap I_n) \\
&\simeq A/(I_1\cdots I_{n-1}) \times A/I_n \\
&= A/(I_1 \cap \dots \cap I_{n-1}) \times A/I_n \\
&\simeq (A/I_1) \times \dots \times (A/I_n)
\end{aligned}

$\LaTeX$ の記法としては問題が無いやうに見えますが,この式の前後を $$ で囲つてみると,次のやうに表示が崩れてしまひます:

$$ \begin{aligned} A / (I_1 \cap \dots \cap I_n) &= A / ((I_1 \cap \dots \cap I_{n-1}) \cap I_n) \
&= A/((I_1\cdots I_{n-1}) \cap I_n) \
&\simeq A/(I_1\cdots I_{n-1}) \times A/I_n \
&= A/(I_1 \cap \dots \cap I_{n-1}) \times A/I_n \
&\simeq (A/I_1) \times \dots \times (A/I_n) \end{aligned} $$

aligned 環境(数式内で複数行表示をするための環境)を含まない数式については正しく表示されることが多いため,改行周りに問題があると考へて検索したところ,以下のやうな情報が見つかりました.

matsueushi | KaTeX で複数行の数式を入力

バックスラッシュを 4 つ重ねた後スペースを置くと改行できる。

なるほど,マークダウンの地の文では, \\ はイスケイプ記号 \ によつてイスケイプされたバクスラシ記号 \ と解釈され,バクスラシ 1 つだけが表示されてしまひます.それと同じことが数式環境の中でも起きてしまつてゐるのでせう.早速,以下のやうに書き換へました:

\begin{aligned}
A / (I_1 \cap \dots \cap I_n) &= A / ((I_1 \cap \dots \cap I_{n-1}) \cap I_n) \\\\ % 行末尾には半角スペイスが必須
&= A/((I_1\cdots I_{n-1}) \cap I_n) \\\\ % 行末尾には半角スペイスが必須
&\simeq A/(I_1\cdots I_{n-1}) \times A/I_n \\\\ % 行末尾には半角スペイスが必須
&= A/(I_1 \cap \dots \cap I_{n-1}) \times A/I_n \\\\ % 行末尾には半角スペイスが必須
&\simeq (A/I_1) \times \dots \times (A/I_n)
\end{aligned}

かうすることで,正しく表示させることができました:

$$ \begin{aligned} A / (I_1 \cap \dots \cap I_n) &= A / ((I_1 \cap \dots \cap I_{n-1}) \cap I_n) \\ &= A/((I_1\cdots I_{n-1}) \cap I_n) \\ &\simeq A/(I_1\cdots I_{n-1}) \times A/I_n \\ &= A/(I_1 \cap \dots \cap I_{n-1}) \times A/I_n \\ &\simeq (A/I_1) \times \dots \times (A/I_n) \end{aligned} $$

バクスラシ 4 つの直後に,半角スペイスを挿入することを忘れないでください.猶,私はエディタとしてヴィヂュアル・ステューディアウ・カウドゥを使つてゐるのですが,その機能で各行末尾の半角スペイスが勝手に削除されてしまつてをり,この段階で暫く詰まりました.私と同じくヴィヂュアル・ステューディアウ・カウドゥを使つてゐる方はエディタの設定を確認してみてください.

参考:VS Code で行末の空白(半角スペース)を自動で削除する (files.trimTrailingWhitespace)|まくろぐ

まとめ

今回行つた解決策をまとめると,以下のやうになります:

かうした問題が起こるのは恐らく,マークダウンのパースが $\KaTeX$ のパースよりも先に走つてしまふことが原因なのでせう.どうにも使ひ辛いのですが,実装上避けられない問題なのかもしれません.

本稿では,応急処置的ではありますが,この問題の解決策を提案いたしました.本稿が,同様の問題でお悩みの方の助けになれば幸ひです.