xparseで条件分岐コマンドを生成 LaTeX

準備

\usepackage{xparse}
\usepackage{mleftright} %あったほうがいい

ドキュメント https://ctan.org/pkg/xparse

leftとrightを楽にしたい

\NewDocumentCommand\ld{}{\left.}
\NewDocumentCommand\rd{}{\right.}
\NewDocumentCommand\alc{}{\mleft\lparen}
\NewDocumentCommand\arc{}{\mright\rparen}

関数に変数を明示したい

\NewDocumentCommand\funct{m}{
    {#1}_{\alc t \arc}
}   %f(t)

積分記号の引数処理を楽にしたい

\NewDocumentCommand\intet{moo}{
    \IfValueTF{#2}{
        \IfValueTF{#3}{
            \int_{#2}^{#3}
        }{
            \int_{#2}
        }
    }{
        \int
    }
    {#1} {\mathrm{d}t}
}

\[
  \intet{\funct{f}}[T]
\]
  • #2があって#3があるなら $ \int $ の上下に引数を入れる
  • #2のみなら $ \int $ の下に引数を入れる
  • #2もないなら $ \int $ のみ

これだと $ \int_T f_{(t)} \mathrm{d}t $ が生成される

微分ry

\NewDocumentCommand\difft{mo}{
    \IfValueT{#2}{\ld}
    \frac{\mathrm{d}}{\mathrm{d}t} {#1}
    \IfValueT{#2}{\right\vert_{#2}}
}

\[
  \difft{x^2}[2] &= 4
\]
  • #2があるなら $ \vert $ と引数のセットをつける
  • #2がないならなし

これだと $ \left. \frac{\mathrm{d}}{\mathrm{d}t} x^2 \right|_2 = 4 $ が生成される

解説

関数

\IfValueTF{}{}\IfValueT{}\IfValueF{}

変数がある時〜!がtrueでない時〜!がfalse
TF{}{}trueの処理とfalseの処理を分けて書ける
それ以外はtruefalseのどちらかの時だけを書ける

\IfNotValueTF{}{}\IfNotValueT{}\IfNotValueF{}

その逆を往く

\IfBooleanValueTF{}{}\IfBooleanValueT{}\IfBooleanValueF{}

\BooleanTrue\BooleanFalseに対応する(後述)

\NewDocumentCommand

コマンド新設置

\NewDocumentCommand\新しい関数の名前{引数のオプション}{処理の中身}

\RenewDocumentCommand

コマンド上書き

\NewDocumentCommand\新しい関数の名前{引数のオプション}{処理の中身}

引数

関数側

最低限は以下のルールを守る

  • 前から#1#2#3…と呼ぶ
  • 念のために{#1}のように前後は{}で囲っておいたほうがいい
  • 定義の中で既に定義された別の関数を用いることができる
    • デフォルトの値にも設定できる
  • 変数に段落(\par動作)も含めたいならオプションの前に+をつけよう
  • コマンドの省略制御は割りと難しいので,使用頻度の高い順に番号を振るのが吉
  • mオプション
    • 入力がなければコンパイルエラー吐いて止まる
    • 要するに普通の引数と同じ
  • oオプション
    • 入力がなければ-NoValue-すなわち変数なしを返す
      • この時に変数を無理矢理に出力すると"-NoValue-"という文字列になる
      • でも"-NoValue-"を入力に渡すと-NoValue-は返されない
    • 入力があれば処理は続行する
  • O{デフォルトの値}オプション
    • 入力がなければデフォルトの値を採用する
    • 入力があれば入力を採用する
  • +bオプション
    • 環境設定的なbegin{}を作るのに重宝する
    • 引数の最後にこれを持ってくることで,以降の文章が全て入力として扱われる
  • sオプション
    • コマンドの後に*を入れてモードを切り替えるのに便利
    • *あれば\BooleanTrue,なければ\BooleanFalse
      • 引数設定の先頭にsがあるなら,このどっちかが必ず変数#1に入る
      • 別に先頭である必要はないが,慣習的に先頭の方がよさそう

本文側

だいたいこんな感じか

  • mオプション
    • \コマンド{引数}の形を取る
    • {}は入力ありと判定される
  • oオプション
    • \コマンド[引数]の形を取る
    • []は入力ありと判定される
  • Oオプション
    • \コマンド[引数]の形を取る
    • []は入力ありと判定される
  • sオプション
    • *の有無に依存する
    • 必ず\BooleanTrue\BooleanFalseのどちらかを返す
  • 省略制御は難しい
    • 例えば関数側で{s m m O{xyz} o o}と指定した時
      • []\BooleanFalse,-NoValue-,-NoValue-,"",-NoValue-,-NoValue-になる
      • {}[][]\BooleanFalse,"",-NoValue-,"","",-NoValue-,になる
    • 要するに引数の型をチェックして前に詰めていく上に「入力なし」を入力できないらしい

これを使う利点

割と楽に2つ以上の引数の省略が可能になる,使い分けが増えることで関数名が節約できる
(デフォルトでは自明に1個までしか省略できない)

意見・要望

積分記号あるじゃないですか,あれって

\[
  \left\int f(x) \right.
\]

的な感じでサイズを調整してくれるとマジで嬉しいんですよね
実際には! Missing delimiter (. inserted).つまり\intは区切り記号(括弧類)じゃないってエラー吐かれるんですが
でもだってほら,微分に使う$\vert$はleftrightできるし,$\int$も対応して欲しいなって

\begin{align} x = a+b \end{align}