numbersetsパッケージで\mathbb{R}と書くのをやめる（利用者編）

# はじめに

$\mathrm{\LaTeX}$のパッケージを開発してCTANにアップロードしたので，宣伝がてら日本語の説明記事を執筆します．

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">初CTAN...ども...<a href="https://t.co/NKR71kUpk5">https://t.co/NKR71kUpk5</a></p>&mdash; えぬぬん (@Nmatician) <a href="https://twitter.com/Nmatician/status/1845864821012730246?ref_src=twsrc%5Etfw">October 14, 2024</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

今回の記事はパッケージの利用者向けのガイドです．開発者，およびパッケージ開発に興味のある人向けの話題は含まれていません．私が`expl3`を完全に理解したら（開発者編）が生えるかもしれません．

## 2024/10/19追記

TeX Liveに収録されたようです．やったね！

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">tlmgr info numbersetsで情報来たからちゃんとTeX Liveに入ったとみなしてよさそうだね <a href="https://t.co/lsdduuW3IC">pic.twitter.com/lsdduuW3IC</a></p>&mdash; えぬぬん (@Nmatician) <a href="https://twitter.com/Nmatician/status/1847476029167980804?ref_src=twsrc%5Etfw">October 19, 2024</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 

（追記ここまで）

:::note warn
本記事執筆時点の最新バージョンはv0.2.0です．最初にv0.1.0をリリースした後に破壊的変更が入っているのでうっかりv0.1.0をインストールしてしまった人は注意してください（具体的には`\DeclareNumberSetCommand`コマンドの構文が変更されています）．
:::

:::note warn
既定の設定は，`unicode-math`パッケージの使用を前提としています．
しかし，`unicode-math`パッケージを`numbersets`パッケージ側では読み込まないので，パッケージ利用者がそれぞれの文書で明示的に`unicode-math`パッケージを読み込む必要があります．
一見不便な仕様に見えますが，この特性は`unicode-math`パッケージを使用しない/できない環境下で重要となります．詳しくは[unicode-mathパッケージを使用しない場合](#unicode-mathパッケージを使用しない場合)で説明します．
:::

# `numbersets`パッケージとは

`numbersets`パッケージは，数学における数の集合を記述するためのパッケージです．
数学では，自然数全体の集合や複素数全体の集合といったよく使う集合は特別な書体を割り当てて識別しやすいようにしておくことが多いです．
例えば黒板太字で自然数全体の集合を「$\mathbb{N}$」と書いたり，太字で「$\mathbf{N}$」と書いたりします．

$\mathrm{\LaTeX}$でこれらの集合を記述する場合，`\mathbb{N}`や`\mathbf{N}`のように書くといわれることが多いのですが，これはあまり好ましくありません．`\mathbb`や`\mathbf`からは「黒板太字である」や「太字である」といった「見た目」に関する情報しか伝わらず，本来意図した「自然数全体の集合」という情報が伝わらないからです．ここでは，新しいコマンド`\NaturalNumbers`を

```latex
\NewDocumentCommand\NaturalNumbers{}{\mathbb{N}}
```

のように定義して，本文中では`\NaturalNumbers`のように書くべきでしょう．このようにしておけば，本文中で「自然数全体の集合」という意図がはっきりします．コマンドを定義しておくことの副次的効果として，もし「`\mathbb`ではなく`\mathbf`にしたくなった」といった場合でも，改修個所は定義部分の一か所のみで済みます．すなわち，メンテナンス性の向上という効果があります．

さて，`numbersets`パッケージは，上記のように数の集合を定義して使用する場合の簡易なインターフェースといくつかのプリセットを提供します．具体的には，以下のような機能を提供します：

* 記号に特定の書体を適用し，数の集合を記述するコマンド
* 数の集合を表す新しいコマンドを定義するためのインターフェース
* 新しい書体規則を定義するためのインターフェース
* 上記インターフェースを用いて定義されたいくつかのプリセット

パッケージをすぐに使いたい場合，[パッケージオプション](#パッケージの読み込み)と[プリセット](#数の集合を表すいくつかのプリセット)のみを把握していれば十分です

# パッケージの読み込み

パッケージの読み込みは，普通のパッケージとまったく同様に

```latex
\usepackage{numbersets}
```

とします．パッケージオプション`style`が提供されており，コマンド使用時に適用する書体を変更することができます．`style`は`style=bb`のように`key=value`形式で記述します．
既定で用意されている値は以下の通りです：

| 値 | 意味 | 等価なコマンド |
|:-:|:-:|:-:|
|`bb`|黒板太字|`\symbb`|
|`bfup`|太字の立体|`\symbfup`|
|`bfit`|太字の斜体|`\symbfit`|

パッケージオプションを指定しない場合，既定値として`bb`が選択されます．
パッケージ読み込み時以外では，`\SetupNumberSetsStyleOptions`コマンドを使用して設定することができます：

```latex
% styleの既定値をbfitに変更
\SetupNumberSetsStyleOptions{style=bfit}
```

[新しい書体規則の定義](#新しい書体規則の定義)で述べるように，自分で`style`を定義して使用することができるほか，既存の設定を上書きすることもできます．この特性は`unicode-math`パッケージなしで`numbersets`パッケージを使用する場合に重要となります．

# 基礎となるコマンド

本パッケージにおいて基礎となるコマンドは`\NumberSet`コマンドです．このコマンドの構文は以下に示すとおりです：

```latex
\NumberSetStyle[style=<option>]{<symbol>}
```

`\NumberSet`コマンドは1つのオプション引数と1つの必須引数をもち，その必須引数で与えた記号に対して決められた書体を適用したうえで出力します．
どのような書体が適用されるかはパッケージオプションによって決まるほか，オプション引数で`style=bfup`のように指定することでローカルに指定することもできます．指定できる値はパッケージオプションと同じです．
具体的には以下のように使用します：

```latex
% オプション引数を指定しない場合
\NumberSet{A}

% オプション引数を指定する場合
\NumberSet[style=bfup]{A}
```

このコマンドは「数の集合を表す」という意味では説明的でよい名前のコマンドですが，汎用的であるためその集合がどういう意味を表すことを期待するのかよくわかりません．
プリセットで足りない場合は[新しいコマンドを定義する](#数の集合を表す新しいコマンドの定義)べきです．

# 数の集合を表す新しいコマンドの定義

プリセットに使用したいコマンドがない場合，`\NewDocumentCommand`コマンドを使って単純なエイリアスを作成してもよいのですが，`\DeclareNumberSetCommand`コマンドによって定義することもできます．
使用方法は，定義したいコマンド（制御綴）と使用する記号を以下のように指定します：

```latex
\DeclareNumberSetCommand{<control sequence>}{<symbol>}
```

例えば，四元数全体の集合$\mathbb{H}$を記述するコマンドを定義したい場合，

```latex
\DeclareNumberSetCommand{\Quaternions}{H}
```

と記述します．すると，`\Quaternions`で`\NumberSet{H}`を表すようコマンドが定義されます．
なお，`\DeclareNumberSetCommand`コマンドで定義したコマンドはオプション引数で書体指定もできて

```latex
% 既定の書体を使用する
\Quaternions

% 書体をローカルに指定する
\Quaternions[style=bb]
```

とできます．

:::note warn

（2025/1/12追記）

ローカルにオプションを指定できるため，例えば四元数上の多項式環を意図した以下のような入力はエラーとなります（`X`というオプションが存在しないため）：

```latex
\Quaternions[X]
```

多項式環の入力は，以下のように専用のコマンドを定義するのがよいでしょう：

```latex
% プリアンブル
\NewDocumentCommand{\polynomialring}{mm}{
    #1\mathopen{}\left[#2\right]\mathclose{}
}

% 本文
\polynomialring{\Quaternions}{X}
```

「入力の意図を明示する」という本パッケージの趣旨にも適合する書き方になっています．ちなみに，`\mathopen{}`と`\mathclose{}`で囲んでいるのは`\left`と`\right`に起因する余分なスペースの挿入を抑制するためです．

多項式環をそのまま入力できない問題はGitHubで提起していただいたのですが[^1]，上記事情を鑑みて修正しないこととしました．

なお，以下で述べるプリセットについても同様です．
:::

[^1]: https://github.com/enunun/numbersets/issues/17

# 新しい書体規則の定義

既存の書体オプションでは不足している場合，`\DeclareNumberSetStyle`コマンドで新しい書体規則が定義できます．その構文は以下のようになります：

```latex
\DeclareNumberSetStyle{<style name>}{<command>}
```

最初の引数`<style name>`には定義したい書体規則の名前を，次の引数`<command>`にはその書体規則を適用した場合に実行されるコマンドを記述します．

例えば，「ボールドのサンセリフを使用したい」という場合は

```latex
\DeclareNumberSetStyle{boldsans}{\symbfsfup}
```

とします．
定義した後は，`style=boldsans`のように既定の`bb`, `bfup`, `bfit`とまったく形で使用可能です．

:::note warn
`\DeclareNumberSetStyle`コマンドの引数`command`には単一の制御綴しか使用できません．
すなわち，`\DeclareNumberSetStyle{bbline}{\overline\symbb}`のような指定はサポートされていません．
このような使い方をしたい場合は，まず単一の制御綴としてのエイリアスを作成し，そのエイリアスを`\DeclareNumberSetStyle`コマンドで使用します．

```latex
\NewDocumentCommand\bbline{m}{\overline{\symbb{#1}}}
\DeclareNumberSetStyle{bbline}{\bbline}
```
:::

:::note info
`\DeclareNumberSetStyle`コマンドは`bb`や`bfup`のような既定で用意された書体規則も上書き可能です．
[unicode-mathパッケージを使用しない場合](#unicode-mathパッケージを使用しない場合)は，この特性が役に立ちます．
:::

# `unicode-math`パッケージを使用しない場合

`unocode-math`パッケージを使用しない場合，既定の`bb`や`bfup`等の書体指定はそのままでは正常に動作しません．
そのため，既定値を`\DeclareNumberSetStyle`コマンドで上書きする必要があります．
`amssymb`パッケージと`bm`パッケージを使用する場合の例を示します：

```latex
\usepackage{amssymb}
\usepackage{bm}
\usepackage{numbersets}
\DeclareNumberSetStyle{bb}{\mathbb}
\DeclareNumberSetStyle{bfit}{\bm}
...
% 本文中
% \mathbb{N}と等価
\NumberSet{N}

% \bm{N}と等価
\NumberSet[style=bfit]{N}
```

:::note info
上の例のように，実際に使用する書体指定規則のみ書き換えれば十分です．
上で使用しない`bfup`については書き換えていませんが，問題は生じません．
:::

# 数の集合を表すいくつかのプリセット

[数の集合を表す新しいコマンドの定義](#数の集合を表す新しいコマンドの定義)で述べた`\DeclareNumberSetCommand`を使用して，よく使う数の集合を表すコマンドをあらかじめ定義してあります．

| 集合 | コマンド | 既定値での出力 |
|:-:|:-:|:-:|
|自然数全体の集合| `\NaturalNumbers` | $\mathbb{N}$ |
|整数全体の集合| `\Integers` | $\mathbb{Z}$ |
|有理数全体の集合|`\RationalNumbers` |$\mathbb{Q}$|
|実数全体の集合|`\RealNumbers`|$\mathbb{R}$|
|複素数全体の集合|`\ComplexNumbers`|$\mathbb{C}$|

`\DeclareNumberSetCommand`のところで述べたように，オプション引数によって書体指定できる点も同じです．
これらすべてのコマンドが`\NaturalNumbers[style=bfit]`のようにオプション引数を使った書体のローカル指定をサポートしています．

なお，上で述べたプリセットでは足りない場合は[数の集合を表す新しいコマンドの定義](#数の集合を表す新しいコマンドの定義)で述べた`\DeclareNumberSetCommand`コマンドを使って定義してください．