unicode-mathとかdiffcoeffとか

:::note info
これは「[TeX & LaTeX Advent Caleandar 2022](https://adventar.org/calendars/7868)」の17日目の記事です。
（16日目は[zr_tex8r](https://qiita.com/zr_tex8r)さんの[一言ツイートネタ](https://twitter.com/zr_tex8r/status/1603520887730290688)、18日目は[CalereSmith](http://circle9tym.blog.fc2.com/)さんの[記事](http://circle9tym.blog.fc2.com/blog-entry-417.html)です。）
:::

## はじめに
筆者は普段このように自分で記事を書くことがない、どこにでもいるLaTeXのライトユーザーなのですが、[今年のアドベントカレンダー](https://adventar.org/calendars/7868)があまり賑わっていないようなので記事を書いてみることにしました。  
とはいえ、ただのライトユーザーに紹介できるような目新しい知識などたかが知れていますよね。というわけで、この記事では[unicode-math](https://www.ctan.org/pkg/unicode-math)と[diffcoeff](https://www.ctan.org/pkg/diffcoeff)の2つのパッケージを紹介してみることにします。なお、筆者は普段LuaLaTeXを利用しているということを先に断っておきます。特に、前者のパッケージは**LuaLaTeXとXeLaTeXにしか対応していない**ので注意してください。（後者はexpl3が使えれば良いそうなので、大抵のエンジンで動作するはずです。）

## unicode-math
### 基本的な使い方
[unicode-math](https://www.ctan.org/pkg/unicode-math)はLuaLaTeX / XeLaTeX用のパッケージで、UCSが定義されている様々な数学記号・数学用英数字の直接入力を可能にし、また出力されたPDFの文字情報も（Unicodeの意味で）より適切なものにしてくれるパッケージです。
「適切な文字情報とは何か」まで言及するとそれだけで記事になりそうなので割愛します。
  
例えば、`\(A\symbfit{x}=𝒃\)`とした場合、出力結果は`𝐴𝒙 = 𝒃`などのようになります。[^1]  
さらに、数式用フォントを簡単に変更できるようになっていて、数式の記述に対応した任意のOpenTypeフォントを利用することができます。数式用フォントの指定時に、書体やコードポイントなどで利用範囲も決められるのですが、詳しいことはドキュメントを参照してください。
基本的にはこれだけなのですが、いくつか注意点があります。

### 注意しなければならないこと
#### パッケージの読み込みについて
unicode-mathを利用する際は、他のパッケージと同様にプリアンブルに`\usepackage{unicode-math}`と記述するだけで良いのですが、ここでいくつか問題があります。  
まず、unicode-mathは競合を回避するため、amsmathよりも**後**に読み込まれる必要があります。（これが満たされていない場合、**自動で**amsmathを読み込みます。）  
さらに、コロン`:`に関するいくつかのコマンドの再定義により、mathtoolsとの競合が生じます。  
これらに関しては十分に留意してください。

#### フォントについて
数式用フォントにしていするためには、そのフォントがOpenType Mathに対応している必要があります。また、適切なコードポイントに対応するグリフが存在しない場合、コンパイル時に警告が行われます。  
特に、**デフォルトで読み込まれるフォントではいくつか非対応の記号がある**点に注意してください。（デフォルトで読み込まれるのはLatin Modern Mathです。）

#### 書体の変更について
単一文字の書体を明示的に変更する際、従来の`\mathxx`ではなく、新たに定義される`\symxx`を<ins>ネストせずに</ins>用いてください。  
（数式の文字ではなくテキストとして変更するときには従来通り`\mathxx`を用いるようです。）

:::note warn
これらの動作の差異に関して詳しく知りたい方は[こちらのシリーズ記事（unicode-math を完全に理解したい話）](https://zrbabbler.hatenablog.com/entry/20180915/1537031499)を参照してください。
:::
:::note info
わかりやすい一般向けの解説記事が公開されました！
[徹底解説！ unicode-mathパッケージでココが変わる](https://qiita.com/zr_tex8r/items/648b024e55126f3ba077)
(2023/01/12 追記)
:::

### その他にできること
ここまでの記述を読んでも、LaTeXライトユーザーのほとんどは「利用して損はなさそうだけど、数式用フォントなんて変えないし、Unicodeの直接入力は面倒だし、Unicode的に正しいとか言われてもよくわからないし、得もないんじゃないの？」と思われることでしょう。  
しかし、unicode-mathを導入することで、**大量の数学記号用コマンドが定義される**という利点があります。[利用可能な記号リスト](http://mirrors.ctan.org/macros/unicodetex/latex/unicode-math/unimath-symbols.pdf)で一覧を見ることができる[^3]のですが、「こんな文字までちゃんと使えるんだ！」というものも多いかと思われます。
それにしても、この表はいつ見ても壮観で、眺めているだけでも楽しいですよね（？）
  
それから、
筆者の中で当たり前になりすぎていてここまで頭から抜けていたことなのですが、
unicode-mathを導入すると、標準では一部のアルファベットにしか対応していなかった黒板太字などの書体にも完全に対応しますし、bmなどのパッケージに頼ることなく太字斜体を記述することができるようになります。  

## diffcoeff
### 使い方
diffcoeffは微分演算子の記述に特化したパッケージです。基本的なコマンドには
- 導関数を記述する`\frac{d#1}{d#2}`と等価な`\diff{#1}{#2}`
- 偏導関数を記述する`\frac{\partial #1}{\partial #2}`と等価な`\diffp{#1}{#2}`
- 微小量`d#1`と等価な`\dl{#1}`
- ヤコビアン`\frac{\partial(#1)}{\partial(#2)}`と等価な`\jacob{#1}{#2}`
の他、これらのように用いることのできる微分演算子を新たに定義するためのコマンドなどが用意されています。[^4]  
また、もちろん高階導関数の記述も可能であり、ドキュメントでは非常に複雑な例として`\diffp[1,m+1,m-1]{F(x,y,z)}{x,y,z}`とすれば $$\frac{\partial^{2m+1}F(x,y,z)}{\partial x\partial y^{m+1}\partial z^{m-1}}$$ と出力されることが紹介されています。

### 以前のバージョン向けの情報
:::note warn
この節の記述は2023/01/10にリリースされたdiffcoeffの（破壊的変更を含む）メジャーバージョンアップで過去のものとなりました。
それ以前のバージョンを利用する（あるいは`\usepackage[<options>]{diffcoeff}[=v4]`による互換性オプションを有効にしている）方のためにそのまま残しておきますが、基本的に読む必要はありません。
(2023/01/12 追記)
:::

<details><summary><strong>以前のバージョン向けの情報</strong></summary>

### 問題点
ところで、diffcoeffには大きな問題点（だと筆者が感じている点）があります。それは、多彩な機能を提供するために、複雑怪奇な隠しオプションが大量に存在してしまっているということです。  
例えば先に挙げた`\diff`コマンドは、`\NewDocumentCommand`による定義では引数が`{ d.. s O{1} o t! >{\TrimSpaces} m t/ m !o }`となっていて、筆者のようなLaTeXライトユーザーにとっては手に負えません。  
幸い、これらのオプションの意味するところは使用例とともにドキュメントで紹介されていますし、ドキュメントを見る限り出番の多そうな`d..`（微分演算子を変更するオプション）などは、これを含めて新たなコマンドを導入してしまえば問題ありません。[^5]  
他にも、`\dl`コマンドは`{ d.. t- m }`を引数として定義されています。これは`\diff`に比べればわかりやすいですね。この第2引数は、微小量とその前の文字との間にある空白を調整するためのオプションで、$-9\leq t\leq 9$を満たす整数値$t$を取ることができます。（デフォルト値は0）  
ところが、このオプションが非常に曲者で、ドキュメントでは様々な場合が想定され、それぞれに対して適切だと思われる値が示されています。
しかも、このオプションを実装するための処理がアレらしく……。


#### 自作の拡張機能
愚痴はさておき、[多重積分等における微小量の表記を簡単にするためのコマンドを実装しました。](https://gist.github.com/Niccori250k/a0708155d8e4e26dc9a58e5fe36e307c)[^2]  
使い方は簡単で、`\mdl[<微分演算子名>]{<list>}[#3][#4]`とするだけです。[^6]引数の書式は具体例を見れば一目瞭然だと思いますが、例えば
- `\mdl{x,y,z}`→`\dl3{x}\dl2{y}\dl2{z}`
- `\mdl{x,y,z,w}[4]`→`\dl4{x}\dl4{y}\dl4{z}\dl4{w}`
- `\mdl{x,y,z,w}[4][3]`→`\dl4{x}\dl3{y}\dl3{z}\dl3{w}`
- `\mdl[p]{x,y,z}`→`\dl.p.3{x}\dl.p.2{y}\dl.p.2{z}`

といったようになります。なお、角括弧によるオプション引数は省略可能ですが、`[#3]`を指定して`[#4]`が省略された場合、`[#4]`は`[#3]`と同じものが指定されたと見做されます。  
また、デフォルトで開けられる空白は、最初の変数が3でそれ以降が2となっていますが、`\setmdlspacing{#1}{#2}`でこれらを変更することもできます。
課題のレポートで必要に迫られて（`\dl`に毎回オプションを渡すのが面倒で）これを作ったのですが、当時はまだ[6日目の記事](https://tairahikaru.github.io/texadvent2022/)の公開前で、`xparse`のドキュメントとにらめっこしながら、第1引数のカンマ区切りリストを実装し、全ての変数についてスペーシングを2にするだけで精一杯だったのですが、たまたま実装方法を思いついてしまったので大改造を施してみました。[^7]  
作法の理解不足によって至らない点が多々ある実装になっていると思われるので、改良案などをお待ちしております。  

</details>

## 終わりに

「LaTeXライトユーザーなのにexpl3に手を出した上に展開制御までする羽目になった……闇が深すぎるよ……
  
**LaTexは簡単です！　軽率に手を出しましょう！**  
実際、筆者は完全独学のLaTeXライトユーザーで、数年かけてzr_tex8rさんを始めとする様々なTeX言語者の良質な記事[^8]を何度も読み返し、パッケージのドキュメントを眺めているうちに、ネット上の情報だけでなんとかここまで辿り着くことができました。  
なので、皆さん、**安心してLaTeXしましょう！！！**[^9]

[^1]: 通常の（立体での）入力が斜体となるか立体となるかはパッケージオプションで変更できます。
<!--[^2]: もしかしなくてもこの解説って記事名も内容もこの記事に由来してますよね。とても嬉しい。-->
[^3]: `texdoc unimath-symbols`でも見られます。
[^4]: 標準で用意された微分演算子もこの機能を用いて定義されていて、例えば偏微分演算子は`p`という名前で定義されています。
[^5]: というかむしろこれが想定されている気がします。実際、ソースファイルを覗いてみると`\diffp`は`\NewDocumentCommand \diffp {} { \diff.p. }`とされています。この`.`で挟まれた部分が第2引数`d..`で、ここに別途定義された微分演算子の名前が入ります。
[^2]:Version 5以降はデフォルトの`\dl`コマンドが`\mdl`のほぼ上位互換となっています。(2023/01/12 追記)
[^6]: 本当はどうにかして全変数に対して`\dl`の機能をフルに使えた方が良いとは思うのですが、力が尽きました。というか、そもそも変数をリストで与える形式にした以上、各々に対してオプションを定義してしまったら、隠しオプションが複雑怪奇であるという問題をもう一度作ってしまうことになってしまいます。
[^7]: 余談のまた余談ですが、実装方法は入浴中に思いつきました。入浴すればアイデアが浮かぶという古来の知恵は伊達じゃないですね。
[^8]: 初心者が読むべき記事をまとめた記事をアドベントカレンダー向けにすべきだった気がしてきました。
[^9]: 
ところで⛄って結局何者なんでしょうか？