\DeclarePairedDelimiter 与 \left 和 \right

\DeclarePairedDelimiter 与 \left 和 \right

为什么这不起作用?

\documentclass{article}
\usepackage{mathtools}
\usepackage{amsmath}
\begin{document}
 \newcommand{\DeclareAutoPairedDelimiter}[3]{\DeclarePairedDelimiter{#1}{\left#2}{\right#3}}
 \DeclareAutoPairedDelimiter{\p}{(}{)}  % but works fine if I say \DeclarePairedDelimiter
 $\p{2} \p*{4}$
\end{document}

我得到的错误是

./Test.tex:7: Extra }, or forgotten \right
./Test.tex:7: Missing } inserted
./Test.tex:7: Missing delimiter (. inserted)
./Test.tex:7: Missing delimiter (. inserted)
./Test.tex:7: Extra }, or forgotten \right
./Test.tex:7: Missing } inserted

答案1

这是行不通的,因为

\DeclarePairedDelimiter{\p}{\left(}{\right)}

是错的。

你可能想要类似的东西

\newcommand{\DeclareAutoPairedDelimiter}[3]{%
  \expandafter\DeclarePairedDelimiter\csname Auto\string#1\endcsname{#2}{#3}%
  \DeclareRobustCommand{#1}{\csname Auto\string#1\endcsname*}}

您似乎认同普遍持有的观点,认为总是添加\left\right是好的。但事实并非如此。

一个完整的示例,具有更为强大的版本,可以避免可能出现的问题\escapechar

\documentclass{article}
\usepackage{mathtools}

\newcommand{\DeclareAutoPairedDelimiter}[3]{%
  \expandafter\DeclarePairedDelimiter\csname Auto\string#1\endcsname{#2}{#3}%
  \begingroup\edef\x{\endgroup
    \noexpand\DeclareRobustCommand{\noexpand#1}{%
      \expandafter\noexpand\csname Auto\string#1\endcsname*}}%
  \x}

\DeclareAutoPairedDelimiter{\p}{(}{)}

\show\p

\begin{document}
\[
\p{\frac{a}{b}}
\]
\end{document}

相关内容