How can I subdivide in cases with square brackets?
I mean I want to write:
⌈ 2_i if ...
rank (q, l) = | 2_i + 1 if ...
⌊ ....
with square brackets, not braces.
How can I subdivide in cases with square brackets?
I mean I want to write:
⌈ 2_i if ...
rank (q, l) = | 2_i + 1 if ...
⌊ ....
with square brackets, not braces.
You could patch the cases environment, the way Thorsten showed or using the etoolbox package and \patchcmd. However, it could be better to preserve the original cases environment and to define a new one for that purpose. Here is a way, very similar to the original definition, but also using \lbrack instead of \lbrace, I calles the new environment sqcases:
\documentclass{article}
\usepackage{amsmath}
\DeclareMathOperator{\rank}{rank}
\makeatletter
\newenvironment{sqcases}{%
\matrix@check\sqcases\env@sqcases
}{%
\endarray\right.%
}
\def\env@sqcases{%
\let\@ifnextchar\new@ifnextchar
\left\lbrack
\def\arraystretch{1.2}%
\array{@{}l@{\quad}l@{}}%
}
\makeatother
\begin{document}
\[
\rank(q, l) = \begin{sqcases}
2_i & \text{if \ldots} \\
2_i+1 & \text{if \ldots}
\end{sqcases}
\]
\end{document}

Though it looks a bit complicated, it's very straightforward: I took the original cases definition of amsmath.sty, wrote sqcases instead and replaced \lbrace by \lbrack. I had to use \makeatletter and \makeatother because of the @ symbol in the original amsmath commands.
For completeness, heres the way using patching:
\usepackage{etoolbox}
\makeatletter
\patchcmd{\env@cases}{\lbrace}{\lbrack}
\makeatother
After loading etoolbox, the respective internal amsmath macro is changed to use \lbrack instead of \lbrace. It's a bit hazardous to patch internal commands, but it's a quick way and may even work after changes in amsmath while our new definition could become different to cases then. At least it's good to know such methods.
In addition to the answers above I would like to present another comprehensible solution to the problem.
\begin{align}
\left[
\begin{array}{ll}
x = 1 & a > 0 \\
x = 2 & \text{otherwise}
\end{array}
\right .
\end{align}
{ll}.
– barbara beeton
Nov 05 '20 at 22:26
It only requires a slight modification.
\documentclass{article}
\usepackage{amsmath}
\makeatletter
\def\env@cases{%
\let\@ifnextchar\new@ifnextchar
\left\lbrack
\def\arraystretch{1.2}%
\array{@{}l@{\quad}l@{}}%
}
\makeatother
\begin{document}
\[
\begin{cases}
0 \\ 1 \\ 2
\end{cases}
\]
\end{document}
This is the original code from amsmath where only \lbrace has been replaced by \lbrack.
amsmath and then copy the \makeatoletter ...\makeatother part to your preamble.
– Caramdir
Feb 26 '11 at 22:59
A Plain "extension" to support such constructs:
\catcode`@=11
\def\caseswithdelim#1#2{\left#1\,\vcenter{\normalbaselines\m@th
\ialign{\strut$##\hfil$&\quad##\hfil\crcr#2\crcr}}\right.}% you might like it without the \strut
\catcode`@=12
%
\def\bcases#1{\caseswithdelim[{#1}}
\def\vcases#1{\caseswithdelim|{#1}}
%
$$\displaylines{
rank (q,l) = \cases{2_i& if $\ldots$\cr 2_i + 1&if $\ldots$\cr\ldots} \cr
rank (q,l) = \bcases{2_i& if $\ldots$\cr 2_i + 1&if $\ldots$\cr\ldots} \cr
rank (q,l) = \vcases{2_i& if $\ldots$\cr 2_i + 1&if $\ldots$\cr\ldots}
}$$\bye
