为什么这不起作用?
\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}