I want to define some commands declaring paired delimiters using the mathtools
package in LaTeX. For example, \paren{...}
should result in \left(...\right)
, whereas \paren[Big]{...}
should give \Bigl(...\Bigr)
.
The command \DeclarePairedDelimiter
almost does the job, but I would have to write \paren*{...}
instead of \paren{...}
in order to get \left(...\right)
. So I added the following macro to my preamble:
\usepackage{mathtools}
\usepackage{ifthen}
...
\makeatletter
\newcommand{\DeclarePairedDelimiterY}[3]{%
\expandafter\DeclarePairedDelimiter\csname#1Temp\endcsname{#2}{#3}
\expandafter\newcommand\csname#1\endcsname[2][leftright]{%
\ifthenelse{\equal{##1}{leftright}}%
{\csname#1Temp*\endcsname{##2}}%
{%
\ifthenelse{\equal{##1}{normal}}{\csname#1Temp\endcsname{##2}}{}%
\ifthenelse{\equal{##1}{big}}{\csname#1Temp\endcsname[\big]{##2}}{}%
\ifthenelse{\equal{##1}{Big}}{\csname#1Temp\endcsname[\Big]{##2}}{}%
\ifthenelse{\equal{##1}{bigg}}{\csname#1Temp\endcsname[\bigg]{##2}}{}%
\ifthenelse{\equal{##1}{Bigg}}{\csname#1Temp\endcsname[\Bigg]{##2}}{}%
}%
}%
}
\makeatother
This means, there is an additional command, e.g. \parenTemp
, which is defined by the macro \DeclarePairedDelimiter
. The desired commands, e.g. \paren
, are then given by
\DeclarePairedDelimiterY{paren}{(}{)}
\DeclarePairedDelimiterY{brac}{[}{]}
\DeclarePairedDelimiterY{set}{\{}{\}}
\DeclarePairedDelimiterY{abs}{\lvert}{\rvert}
\DeclarePairedDelimiterY{norm}{\lVert}{\rVert}
While the forms \paren[big]{...}
, \abs[Bigg]{...}
etc. are working, \paren{...}
just gives ...
instead of \left(...\right)
. So the error in the code is probably in the line
{\csname#1Temp*\endcsname{##2}}%
which is supposed to expand as \#1Temp*{##2}
, e.g. \parenTemp*{##2}
.
Do you have an idea what is going wrong?
EDIT: Thanks to @Tsuyoshi Ito's answer and this piece of information, I was able to optimize the above code:
\usepackage{mathtools}
\usepackage{etextools}
\usepackage{ifthen}
...
\makeatletter
\newcommand{\DeclarePairedDelimiterCase}[2]{%
\newcommand#1[1][]{%
\ifthenelse{\equal{##1}{normal}}%
{#2}%
{%
\ifthenelse{\equal{##1}{big}\OR\equal{##1}{Big}\OR\equal{##1}{bigg}\OR\equal{##1}{Bigg}}%
{\expandnext{#2[}{\csname##1\endcsname}]}%
{#2*}% % standard case using \left and \right
}%
}%
}
\newcommand{\DeclarePairedDelimiterY}[4][Temp]{%
\expandafter\DeclarePairedDelimiter\csname#2#1\endcsname{#3}{#4}%
\expandnext{\expandnext{\DeclarePairedDelimiterCase}{\csname#2\endcsname}}{\csname#2#1\endcsname}%
}
\newcommand{\DeclarePairedDelimiterXY}[6][Temp]{%
\expandafter\DeclarePairedDelimiterX\csname#2#1\endcsname[#3]{#4}{#5}{#6}%
\expandnext{\expandnext{\DeclarePairedDelimiterCase}{\csname#2\endcsname}}{\csname#2#1\endcsname}%
}
\makeatother
This new version has the following advantages:
- Users may choose the suffix of the "temporary" command on their own; default: Temp.
- Supports both
\DeclarePairedDelimiter
AND\DeclarePairedDelimiterX
.
Usage:
\DeclarePairedDelimiterY{name}{leftDelim}{rightDelim}
instead of\DeclarePairedDelimiter{\name}{leftDelim}{rightDelim}
\DeclarePairedDelimiterXY{name}{N_args}{leftDelim}{rightDelim}{code}
instead of\DeclarePairedDelimiterX{\name}[N_args]{leftDelim}{rightDelim}{code}
Note that the old version returned {}
if \name
was called with a misspelled optional argument. Instead, the new version then gives the "\left...\right
-case".