♾️

Unicode数式記号の入力を簡単にするVSCode拡張を作った

2024/12/13に公開

最近作って公開したVSCode拡張を紹介しつつ、Unicodeにある数式記号についての話を少しする記事です。

https://marketplace.visualstudio.com/items?itemName=ho-oto.mathematical-symbols

https://github.com/ho-oto/mathematical-symbols

概要

現在のUnicodeには驚くほどたくさんの数学記号が収録されています。

https://en.wikipedia.org/wiki/Mathematical_operators_and_symbols_in_Unicode

たとえばLaTeXでunicode-mathパッケージを使用すれば、作成したPDFの数式をUnicodeとしてコピーすることができたりします。

コードの中で直接Unicode数学記号を使うことができる例も増えてきました。有名なのはJuliaで、数多くのUnicode数式記号をコード中でそのままの意味で使うことができます。例えばJuliaにおいてはそのままexclusive orを表す2項演算子になっています。

julia> false  false
false

julia> true  true
false

julia> true  false
true

その他、最近流行りの組版システムTypstでもUnicode数学記号を用いて数式を記述することができます。

Unicode数学記号を使って数式を記述する際に問題になるのは、大量にある記号をどうやって快適に入力するか、という点です。先述したJuliaではREPLやエディタにおいて\<コマンド>と入力した後にtabキーを使用することでLaTeXコマンドを使った記号入力が可能です(\otimes<tab>など)。

自分はこの方式の入力に慣れているので、VSCodeでMarkdownやTypstを書いているときも同じような方式の入力を使いたいところです。これを実現する拡張機能はすでにいくつか存在するのですが、メンテが止まっていたり、細かい挙動が好みじゃないなどして困っていました。

https://marketplace.visualstudio.com/items?itemName=GuidoTapia2.unicode-math-vscode

VSCodeの拡張機能は作ったことがありませんでしたが、上に挙げた拡張機能のコードを軽く眺めてみるとそこまで難しくなさそうに見えたので、自分好みのものをゼロから作ってみました。

特徴

収録記号の厳選とエイリアス

Wikipediaのページを見てもらえると分かりますが、Unicodeに収録されている数学記号にはめったに使われない変な記号も沢山存在しています。unicode-mathではこれらにもコマンド名が割り当てられているので、既存の拡張機能ではこれらの文字すべての入力に対応していることが多いです。

しかし、滅多に使用しないコマンドが大量に存在することは、例えばエディタ上に補完候補を表示するときなどにノイズになります。

今回作成した拡張では、独断と偏見により対応する記号を厳選し、その分それぞれの記号に対して短縮形やエイリアスを多く用意する方針を取りました。矢印や不等号などは膨大な数が存在するので、かなりをリストラしました。

一覧は以下のファイルにあります。使用頻度の高いギリシャ文字には\alαなどの短縮系を多く登録しています。\x×(times)、\=>などのアスキーアートベースのエイリアスも導入しています。一部はAsciiMathと同じですが、全てを取り入れているわけではありません。

https://github.com/ho-oto/mathematical-symbols/blob/main/src/data.ts

Typstのような組版システムで使う場合はそちらのコマンドも普通に使える筈なので、入力できない文字が必要になればそちらを使えば良いでしょう。

一括変換

ボールド、イタリック、筆記体、フラクトゥールなどへの変換は、\b;abc<tab>𝐚𝐛𝐜のようにセミコロンでスタイルと文字列を区切ることで一括で行うことができます。\bba<tab>𝕒\itA<tab>𝐴のような文字単位のコマンドも使うことができます。

使えるスタイルの一覧はREADMEを確認してください。

上付き、下付き文字への変換も\^abc<tab> or \abc^<tab>ᵃᵇᶜ\_abc<tab> or \abc_<tab>₀₁₂のように一括で行えます。ただし、一部の上付き文字や下付き文字はそもそもUnicodeに存在しないので変換されませんが...(アルファベット全部入れようというプロポーザルを準備している人たちがいましたが、ここ数年音沙汰がなさそうで悲しいです)

また、コマンドを,で区切ることでまとめて変換することができます(\alpha,b;foo,_x,gamma<tab> -> α𝐟𝐨𝐨ₓγ)。毎回tabを押して変換してからバックスラッシュを入力するより1タイプ節約できます。

否定

Unicodeの結合文字によって\a!<tab>のように斜線の引かれた文字が入力できます。合成済み文字が存在する場合はそちらが入力されます。

ちなみに、Typstは現状で結合文字をサポートしていないようです。結合文字を使ったa⃗とかとかを使えると嬉しいのですが...

まとめ

数式入力に困っている人は是非使ってみてください。

俺の分野でよく使うX記号が入ってない!という意見があれば教えてください。一応使用例がどの程度ありそうかをググりつつ厳選したつもりですが...

ちなみにVSCodeの拡張機能作ったのもTypeScriptをちゃんと書いたのも初めてでしたが、この分野は本当にChatGPTが強くて助かりました。

Discussion