Object.create(null)

TypeError: Cannot convert object to primitive value

Markdown モードでの TeX 数式メモ

はてなブログMarkdown モードは便利だけれど, TeX で数式を書こうとすると一部の記号がうまく表示されなかったりするので, とりあえずの対処法をメモしておきます.

TL; DR

  • 文と数式の行を分ける時は <div> を使う
  • インラインでは適宜 [](raw:...) やエスケープを使う

とすると楽.

TeX そのまま

まずは素材本来の味をお楽しみください.

ソース

[tex:
\begin{align}
f(x) &= g(x^2) \\
g(x) &< 1
\end{align}
]

結果

[tex: \begin{align} f(x) &= g(x2) \ g(x) &< 1 \end{align} ]

これを見てもわかりづらいですが, 以下のような問題が発生しています.

  • &< のような HTML 特殊文字&amp;, &lt; になっている
  • ^<sup> を使った上付き文字に置き換えられる
  • \\ は先頭にバックスラッシュをつけたエスケープとして扱われて \ になっている

つまり (どう見ても) これではダメ.

エスケープしてみる

記号の前に \ をつけることで, Markdown の記法としては扱われなくなります.

ソース

[tex:
\begin{align}
f(x) \&= g(x\^2) \\\\
g(x) \&\< 1
\end{align}
]

結果


\begin{align}
f(x) &amp;= g(x^2) \\
g(x) &amp;&lt; 1
\end{align}

上付き文字や改行は直るものの, \&, \< は結局 &, < と同じなので, やはり &amp;, &lt; になってしまいます. これでもダメ.

全体を <pre> で囲んでみる

<pre> で囲んでやると特殊文字もエスケープされなくなります.

ソース

<pre>
[tex:
\begin{align}
f(x) &= g(x^2) \\
g(x) &< 1
\end{align}
]
</pre>

結果

を書きたかったけど色々なものが壊れるので省略.

<pre> 内では記号がそのまま表示されますが, texキーワードリンクになることがあり, こうなると数式としては表示されなくなってしまいます (参考: はてなブログで数式(Markdown) - エフアンダーバー). また, 後に続く部分もリンクがリンクにならなくなったりと微妙.

全体を <div> で囲んでみる

上の記事を読んでみると <div> で囲んでもエスケープされないらしい.

ソース

<div>
[tex:
\begin{align}
f(x) &= g(x^2) \\
g(x) &< 1
\end{align}
]
</div>

結果


\begin{align}
f(x) &= g(x^2) \\
g(x) &< 1
\end{align}

うまくいっているようです.

インラインの場合

めでたく数式が表示されたものの, インラインで数式を書きたい時はこれではうまくいきません.

例えば <div>[tex:f(x) = g(x^2) < 1]</div> のように書くとうまく表示されない.

これの解決方法は,

あたりでしょうか.

ソース

なんと [tex:f(x) = g(x\^2) \lt 1] のように書くとうまくいく.

結果

なんと f(x) = g(x^2) \lt 1 のように書くとうまくいく.

なお, 上に挙げた <div> 内であっても <, > は HTML のタグとして解釈される可能性があるので, \lt, \gt としておくのが無難かもしれません.

[](raw:...) を使う

エスケープすることでインラインでもうまく表示できたわけですが, やはり少々煩雑です. というわけで最終手段として, 疑似プロトコル raw を使って Markdown が加工しないようにしてやります.

ソース

各項 [](raw:[tex:1, x, x^2, x^3, \ldots]) がどうのこうの.

結果

各項 1, x, x^2, x^3, \ldots がどうのこうの.

問題点は, 閉じ括弧 ) があると raw の終了と判断されてしまうことでしょうか. ただし [](raw:...)[tex:...] 内でも使えるので, ) がない部分では [](raw:...) で囲んでやればエスケープが少し楽になります.

ソース

関数 [tex:S(x) = [](raw:\{1, x, x^2, x^3, \ldots\})] がなんとかかんとか.

結果

関数 S(x) = \{1, x, x^2, x^3, \ldots\} がなんとかかんとか.

なお, この方法はインラインでなくても使えるので, 場合によってはこちらを使っても良いかもしれませんね.

まとめ

問題は Markdown の加工やエスケープ処理と TeX の記法がコンフリクトしていることによるものなので, 基本的には全て [](raw:...) で解決できます. ただ, 数式には括弧 () が頻繁に登場するので, 全てにおいて実用的というわけではありません.

個人的には,

  • 文と数式の行を分ける時は <div> を使う
  • インラインでは適宜 [](raw:...) やエスケープを使う

とするのが楽なのではないかと思います.