I'm trying to define a flexible "delimiter styling" command. I tried it in a package, and \str_case:nnF
returned Undefined Control Sequence
, whereas using \str_case:nnn
went further and caused a different problem, which seemed to be related to the command itself. So I moved it into the document, getting the following code:
\documentclass[a4paper]{report}
\usepackage{amsthm,xparse}
\ExplSyntaxOn
\newcommand{\delim}[3][lr]{
\str_case:nnF { #1 }
{
{ b }{\def\lsize{\big}\def\rsize{\big}}
{ B }{\def\lsize{\Big}\def\rsize{\Big}}
{ x }{\def\lsize{\bigg}\def\rsize{\bigg}}
{ X }{\def\lsize{\Bigg}\def\rsize{\Bigg}}
{ lr }{\def\lsize{\left}\def\rsize{\right}}
{ bB }{\def\lsize{\big}\def\rsize{\Big}}
{ Bb }{\def\lsize{\Big}\def\rsize{\big}}
{ xb }{\def\lsize{\bigg}\def\rsize{\big}}
{ xB }{\def\lsize{\bigg}\def\rsize{\Big}}
{ bx }{\def\lsize{\big}\def\rsize{\bigg}}
{ Bx }{\def\lsize{\Big}\def\rsize{\bigg}}
{ bX }{\def\lsize{\big}\def\rsize{\Bigg}}
{ BX }{\def\lsize{\Big}\def\rsize{\Bigg}}
{ xX }{\def\lsize{\bigg}\def\rsize{\Bigg}}
{ Xb }{\def\lsize{\Bigg}\def\rsize{\big}}
{ XB }{\def\lsize{\Bigg}\def\rsize{\Big}}
{ Xx }{\def\lsize{\Bigg}\def\rsize{\bigg}}
}
\str_case:nnF { #2 }
{
{ s }{\def\ldel{[}\def\rdel{]}}
{ r }{\def\ldel{(}\def\rdel{)}}
{ b }{\def\ldel{\lbrace}\def\rdel{\rbrace}}
{ v }{\def\ldel{|}\def\rdel{|}}
{ a }{\def\ldel{\langle}\def\rdel{\rangle}}
{ dv }{\def\ldel{\|}\def\rdel{\|}}
{ rs }{\def\ldel{(}\def\rdel{]}}
{ sr }{\def\ldel{[}\def\rdel{)}}
{ rb }{\def\ldel{(}\def\rdel{\rbrace}}
{ sb }{\def\ldel{[}\def\rdel{\rbrace}}
{ br }{\def\ldel{\lbrace}\def\rdel{)}}
{ bs }{\def\ldel{\lbrace}\def\rdel{]}}
{ ra }{\def\ldel{(}\def\rdel{\rangle}}
{ sa }{\def\ldel{[}\def\rdel{\rangle}}
{ ba }{\def\ldel{\lbrace}\def\rdel{\rangle}}
{ ar }{\def\ldel{\langle}\def\rdel{)}}
{ as }{\def\ldel{\langle}\def\rdel{]}}
{ ab }{\def\ldel{\langle}\def\rdel{\rbrace}}
{ rv }{\def\ldel{(}\def\rdel{|}}
{ sv }{\def\ldel{[}\def\rdel{|}}
{ bv }{\def\ldel{\lbrace}\def\rdel{|}}
{ av }{\def\ldel{\langle}\def\rdel{|}}
{ vr }{\def\ldel{|}\def\rdel{)}}
{ vs }{\def\ldel{|}\def\rdel{]}}
{ vb }{\def\ldel{|}\def\rdel{\rbrace}}
{ va }{\def\ldel{|}\def\rdel{\rangle}}
{ rdv }{\def\ldel{(}\def\rdel{\|}}
{ sdv }{\def\ldel{[}\def\rdel{\|}}
{ bdv }{\def\ldel{\lbrace}\def\rdel{\|}}
{ adv }{\def\ldel{\langle}\def\rdel{\|}}
{ vdv }{\def\ldel{|}\def\rdel{\|}}
{ dvr }{\def\ldel{\|}\def\rdel{)}}
{ dvs }{\def\ldel{\|}\def\rdel{]}}
{ dvb }{\def\ldel{\|}\def\rdel{\rbrace}}
{ dva }{\def\ldel{\|}\def\rdel{\rangle}}
{ dvv }{\def\ldel{\|}\def\rdel{|}}
{ lr }{\def\ldel{(}\def\rdel{\@empty}}
{ rr }{\def\ldel{)}\def\rdel{\@empty}}
{ ls }{\def\ldel{[}\def\rdel{\@empty}}
{ rs }{\def\ldel{]}\def\rdel{\@empty}}
{ lb }{\def\ldel{\lbrace}\def\rdel{\@empty}}
{ rb }{\def\ldel{\rbrace}\def\rdel{\@empty}}
{ la }{\def\ldel{\langle}\def\rdel{\@empty}}
{ ra }{\def\ldel{\rangle}\def\rdel{\@empty}}
{ ov }{\def\ldel{|}\def\rdel{\@empty}}
{ odv }{\def\ldel{\|}\def\rdel{\@empy}}
{ ssi }{\def\ldel{[}\def\rdel{\mathclose{[}}}
{ sis }{\def\ldel{\mathopen{]}}\def\rdel{]}}
{ sisi }{\def\ldel{\mathopen{]}}\def\rdel{\mathclose{[}}}
}
\ifx\rdel\@empty
\lsize\ldel
\else
\lsize\ldel #3 \rsize\rdel
\fi
}
\ExplSyntaxOff
%\ignopt{greek}
\begin{document}
$$\delim[lr]{r}{\fr{a}{b}}$$
\end{document}
And then the strangest thing happened:
./delim_attempt.tex:3: Undefined control sequence.
<recently read> \ExplSyntaxOn
l.3 \ExplSyntaxOn
And I'm like, "WHAT????" How is that possible?
Update:
Having taken the comments below into account, I corrected [r]
to {r}
, loaded xparse
, and updated Expl
, meaning \str_case:nnF
now works. So the code has been changed accordingly. Btw suspecting the spaces might be troublesome I tried removing them (e.g. { lr }
->{lr}
), and the wrong typesetting of the code above is still there. That is, as it is, the code gives:
./delim_attempt.tex:87: Undefined control sequence.
\\delim ...\@empty\lsize \ldel \else \lsize \ldel
#3\rsize \rdel \fi
l.87 $$\delim[lr]{r}{\frac{a}{b}}
$$
and by commenting the \lsize\ldel #3 \rsize\rdel
in the \else
branch, I get to typeset:
rsrbvadvrssrrbsbbrbsrasabaarasabrvsvbvavvrvsvbvardvsdvbdvadvvdvdvrdvsdvbdvadvvlrrrlsrslbrblaraovod
which of course simpy isn't what I want.
xparse
) so the commands are not defined – David Carlisle Apr 17 '14 at 15:50\str_case:nnn
: we renamed this a while ago to\str_case:nnF
, so if you don't have the latter you've got an out-of-datel3kernel
. – Joseph Wright♦ Apr 17 '14 at 16:00\lsize\ldel #3 \rsize\rdel
causes the given code to typeset to[srbvadvrssrrbsbbrbsrasabaarasabrvsvbvavvrvsvbvardvsdvbdvadvvdvdvrdvsdvbdvadvvlrrrlsrslbrblaraovod
, even with{r}
, as if the cases were interpreted as text to be typeset. Am I misusing the\str_case:nnn
? And @Joseph Wright how long was this "while"? No because I updated my TeX distribution around New Year's Day 2014. Anyway if it's been "renamed" as such it should function in the same way, so I'll just use\str_case:nnn
. – MickG Apr 17 '14 at 16:03\newcommand{\delim}[3][lr]{
so\delim
has one optional argument and 2 mandatory ones so in\delim[lr][r
the optional argument islr
#2
is[
and#3
isr
I suspect you want to use xparse declarations to define a command with 2 optional arguments? – David Carlisle Apr 17 '14 at 16:08{r}
. Let me edit the question. – MickG Apr 17 '14 at 16:23