ARMERIA

Rubyと競技プログラミングの話 AtCoderやCodeforcesの問題解説記事が多め。

競プロerのためのはてなTeX記法チートシート

基本から応用(?)までガッツリ書こうかなとも思ったんですが、はてなTeXそのものの解説記事は検索するといっぱい出てくるので、私が競プロ記事でよく使うものを箇条書きのように紹介する記事にしようと思います。

私はMarkdownモードを使っているので、Markdownモードに準じて書いていきます。他モードとは一部エスケープの扱いが異なります。

まずはじめに

はてなTeXは癖が強く、慣れないうちは必ずバグります。慣れてもバグります。

こまめにプレビューを確認しながら書く癖を付けると良いと思います。私もこの記事を書く過程で数十回プレピューを見ています。

TeX記法の使い方

数式表記にしたい範囲を [tex: ] で囲みます。

  • [tex: ax+b] ax+b

個人的な好みとしては前後に半角スペースを入れると少し読みやすいです。

  • (スペースなし)求めたい最小値を xとします。
  • (スペースあり)求めたい最小値を  x とします。

上付き文字・下付き文字

上付き文字は ^ を使い、必ず {} で囲むとよいです。

  • [tex: a^{x}] a^{x}

下付き文字は \_ を使い、必ず {} で囲むとよいです。ただしMarkdownモード以外の場合は _ で良いようです。

  • [tex: a\_{x}] a_{x}

バグらずに上手くパースされるためのテクは他にもいくつかあるようですが、私はこれを使っています。慣れないうちは特に下付き文字の \ を忘れてバグると思います。慣れましょう。

分数

\frac を使います。

  • [tex: \frac{a}{b}] \frac{a}{b}

 \log \min など

TeX環境ではアルファベットは標準で斜体になり、  log のようになります。これでも読めることは読めますが、数式内でアルファベットで表記するいくつかの関数名は \ を付けることで斜体でない形式で表示することができて、そちらのほうが意味が明確になるので望ましいです。

  • [tex: \log N] \log N

例のようにアルファベットが続く場合はスペースが必要です。スペースを空けないと  \logN のようにバグります。

このように使える関数名などは こちら を参考にしてください。はてなTeXではなく一般的なLaTeXの話なので差異があるかもしれません。

競プロでよく使うのは  \min, \max, \log, \gcd, \bmod あたりでしょうか。 \bmod\bmod と書かないと出てこないので注意です。

数学記号

先ほどの  \log などと同様、バックスラッシュで始まるコマンドとして入力できます。リストは こちら を参考に。ギリシャ文字もあります。

  • [tex: \forall] \forall
  • [tex: \alpha] \alpha

不等号

競プロ記事でよく使いますね。

  • [tex: a \lt b] a \lt b
  • [tex: a \le b] a \le b
  • [tex: a \gt b] a \gt b
  • [tex: a \ge b] a \ge b

「less than」「less than or equal to」「greater than」「greater than or equal to」と覚えましょう。

カッコとか囲む系

普通の丸カッコ  () は単に () ですが、 \lbrace\rbrace \lbrack\rbrack は専用のコマンドを使います。

  • [tex: \lbrace a \rbrace] \lbrace a \rbrace
  • [tex: \lbrack a \rbrack] \lbrack a \rbrack

角カッコは [tex: \[a\]] のようにエスケープしても一応  [a] のように表示できますが、左右非対称になってちょっと汚いです。 dp\lbrack i \rbrack\lbrack j \rbrack などをキレイに書く場合はちょっと面倒ですが \lbrack \rbrack を使うとよいです。

また競プロでよく使う切り捨て・切り上げの表記も、同じような記法で書くことができます。

  • [tex: \lfloor a \rfloor] \lfloor a \rfloor
  • [tex: \lceil a \rceil] \lceil a \rceil

二項係数

 _{n}C_{k} 。ピンポイントですが競プロでよく使うので。左側に下付き文字を付けるコマンドではなく、無に下付き文字を付けることで対処します。

[tex: \_{n}C\_{k}] _{n}C_{k}

ビット演算

プログラミングにおけるビット演算の記号は、数式ではそのまま使われないことが多いのでちょっと苦労します。私は数式モードではなく a & b とバッククォートで囲む記法に逃げることが多いですが、一応書くことはできるようです。

  • [tex: a \And b] a \And b
  • [tex: a | b] a | b
  • [tex: a^{\wedge} b] a^{\wedge} b

数式における縦棒は「割り切れる」ことを示す記号として使われることのほうが多いので注意。文脈からORであることが明らかな場合は使っても良いとは思います。

XORは問題文などではよく \oplus を用いて  a \oplus b と書いてあるので、私はそちらを使うことのほうが多いです。

日本語

わざわざ変数に置くのが冗長だなと思った時に、数式内に日本語を直接書いてしまうことがあります。ちょっとフォントが他の文と違って見えますが、普通に読めることが多いです。

[tex: (三角形の面積) = (底辺) \times (高さ) \div 2] (三角形の面積) = (底辺) \times (高さ) \div 2

総和、総積

いわゆるシグマ。

  • [tex: \sum a\_{i}] \sum a_{i}
  • [tex: \prod a\_{i}] \prod a_{i}

これに添え字をつけようとすると  \sum_{i=1}^{N} a_{i} みたいになってごちゃごちゃします。私の場合は  i=1, ..., N の場合など文脈から十分読み取れるだろうと思ったら添字を省略してしまうことが多いです。後述の \displaystyle を使うという手もあります。

\displaystyle を活用する

いままでの記法では、複雑な分数が縦に潰れてしまったり、シグマの添字が見づらかったりします。これを解決するために \displaystyle というものがあります。

  • [tex: \displaystyle \sum\_{i=1}^{N} a\_{i}] \displaystyle \sum_{i=1}^{N} a_{i}
  • [tex: \displaystyle \frac{ax+b}{cy+d}] \displaystyle \frac{ax+b}{cy+d}

私はまだ使ったことがないですが、要所要所で使えると便利だと思います。

おわり

他に何かあれば随時追記していきます。

とりあえずこれだけ書ければ競プロ記事を書くにはあまり困らないと思います。もちろん公式解説のようにガッツリ証明を書く場合などは苦しいかもしれません…その場合は素直にはてな以外で書くことをオススメします。

慣れるまではとにかく仕様との戦いになり、記事の内容とは関係ないところで時間を使うことになると思います。そのため競プロのブログを書く全ての人にオススメできるわけではありませんが…手間をかけた分だけ記事の見た目は良くなるので、興味があれば是非試してみてください。