\DeclarePairedDelimiter(`mathtools`에서)를 본질적으로 '\ensuremath'하려면 어떻게 해야 합니까?

\DeclarePairedDelimiter(`mathtools`에서)를 본질적으로 '\ensuremath'하려면 어떻게 해야 합니까?

텍스트 모드 외부에서 작동하는 쌍으로 된 구분 기호 명령을 만들려고 합니다. 로 새 명령을 정의하는 것만으로는 이 작업을 수행할 수 없었기 때문에 대신 and를 \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.

관련 정보