我怎樣才能本質上“\ensuremath”一個\DeclarePairedDelimiter(來自“mathtools”)?

我怎樣才能本質上“\ensuremath”一個\DeclarePairedDelimiter(來自“mathtools”)?

我正在嘗試創建一個可以在文字模式之外工作的配對分隔符號命令。我無法簡單地透過使用 定義新命令來完成此任務\ensuremath,因此我求助於使用\ifmmodeand\@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

相關內容