本質的に \DeclarePairedDelimiter (`mathtools` から) を '\ensuremath' するにはどうすればよいですか?

本質的に \DeclarePairedDelimiter (`mathtools` から) を '\ensuremath' するにはどうすればよいですか?

テキスト モード以外で機能する、ペアの区切り文字コマンドを作成しようとしています。 を使用して新しいコマンドを定義するだけではこれを実現できなかったため、代わりにと\ensuremathを使用しました。ただし、コード (以下に示す) は期待どおりに実行されません。これを実現する方法をご存知の方はいませんか? (コマンドがまたはそのバリエーションとによって定義される方が望ましいです。)\ifmmode\@ifstar\DeclarePairedDelimiter\DeclarePairedDelimiterX\DeclarePairedDelimiterXPP

のようなコードに頼るのはよくない習慣だと考えられていることは承知しています\ensuremathが、私は主にTeXnical の学習体験のためにこれを行っています。

\documentclass[12pt, reqno]{amsart}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{xparse}
\usepackage{mathtools}
\usepackage[version=3]{mhchem}

\makeatletter
\DeclarePairedDelimiterXPP{\conctext}[1]{\(}{\lbrack}{\rbrack}{\)}{\ce{#1}}
\DeclarePairedDelimiterX{\concmath}[1]{\lbrack}{\rbrack}{\ce{#1}}
\newcommand{\conc}{\ifmmode \@ifstar\concmath*\concmath
                    \else   \@ifstar\conctext*\conctext
                    \fi
}
\makeatother
\begin{document}
The molarity is calculated from \conc{NaOH}, \conc{H3O+}, and \conc{OH-}.
\end{document}

答え1

よりシンプルなアプローチxparse:

\documentclass[12pt, reqno]{amsart}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{xparse}
\usepackage{mathtools}
\usepackage[version=3]{mhchem}

\DeclarePairedDelimiter{\cebrack}{[}{]}
\NewDocumentCommand{\conc}{sO{}m}{%
  \IfBooleanTF{#1}
   {\ensuremath{\cebrack*{\ce{#3}}}}
   {\ensuremath{\cebrack[#2]{\ce{#3}}}}%
}

\begin{document}
The molarity is calculated from \conc{NaOH}, \conc{H3O+}, and \conc{OH-}.

Test: \conc{H3O+}, \conc*{H3O+}, \conc[\big]{H3O+}, \conc[\Big]{H3O+}.

Test: $\conc{H3O+}, \conc*{H3O+}, \conc[\big]{H3O+}, \conc[\Big]{H3O+}$.

\end{document}

ここに画像の説明を入力してください

ちなみに、これは私の意見では、 の正当な使用法です\ensuremath

関連情報