我正在尝试创建一个可以在文本模式之外工作的成对分隔符命令。我无法通过使用 定义新命令来实现这一点\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
。