パッケージにおけるマクロ定義用マクロの使い分け
\defか、それとも\newcommandか\providecommandか\DeclareRobustCommandか、はたまた\NewDocumentCommandか\ProvideDocumentCommandか\DeclareDocumentCommandか
パッケージを書かれた経験のある方に質問です。
件名の通りなのですが、パッケージでのマクロ定義に以下のどれを使うのが適切なのかよくわからない場合があり、皆様の「使い分け方」をご教示いただきたいです。
・ \def
・ \newcommand
・ \providecommand
・ \DeclareRobustCommand
・ \NewDocumentCommand
・ \ProvideDocumentCommand
・ \DeclareDocumentCommand
など
各マクロの挙動の差異自体は概ね把握していますが、パッケージでマクロの定義をする場合の使い分け方がうまく理解できておらず、ぜひアドバイスを頂きたいです。
背景
背景としましては、研究室の後輩向けに、各種レポートや卒論、修論、博論等の論文など用のスタイルファイル(とその説明書)を作っているのですが、特に「少なくとも自分は知らないが、既存のパッケージで提供されているかもしれない」ような名前の新たなマクロを定義する際、どれを使うべきか悩んでいます。
当然、既存のパッケージで提供されていることが知られているマクロ名、例えば、\ruby のような名前であれば当然provide~系で定義すべきでしょうが…
「既存のパッケージで提供されていると聞いたことはないけど、名前がシンプルなので被る可能性も否定しきれない」というような名前の場合はどうすべきなのでしょうか。
※例えば、\figref のような名前です。
無難にnew~系で定義して、被っていることがわかるようにするべきなのかなとも思いましたが、後輩にはLaTeX初心者が多く、エラーはなるべく出したくないのが本心です。
そこで、
・ 被るということは、恐らく入れた他のパッケージで提供されているマクロの方を使用したいケースが多いであろうと予想し、こちらはprovide~系で定義する
とも考えましたが、万が一意図せず他のパッケージを入れていた場合、「説明書にあるマクロを使ったら違う出力になった」のような問題も出てきそうです。
とはいえ、
・ こちらが意図しない挙動を防ぐべく、\defやdeclare~系で半ば強引に定義してしまう
というのもやや危険に感じてしまいます。
また、各分類のマクロ(new~系やprovide~系)のいずれかに決めたとしても、例えばprovide~系であれば
・ \providecommand
と
・ \ProvideDocumentCommand
のどちらを使用すべきかも迷います。当然xparseの\ProvideDocumentCommandでしかできない(ないし\ProvideDocumentCommandの方が実装が容易な)ケースなら迷わず\ProvideDocumentCommandを使用しますが、「どっちでも書ける」ような場合はどちらを使えばよいものなのでしょうか。
基本的に~DocumentCommandで統一して構わないでしょうか。
総括
私も初心者に毛が生えた程度であり、また他人が使うパッケージを書くのは初めてなため、煮詰まってしまっています。
ちょっとしたアドバイスでも十二分にありがたいので、上のような状況の場合
・ new~系・provide~系・declare~系のどれを採用すべきか
・ 標準のマクロ定義用マクロと、xparseの~DocumentCommandの使い分け
の2点について、いずれかだけでも構いませんので、是非ともご教示お願いいたします。