Syntax cheat-sheet: permutation of columns

This commit is contained in:
Louis Gesbert 2023-03-01 11:09:08 +01:00
parent 0aa9e0b130
commit 52eeae3319
2 changed files with 317 additions and 206 deletions

View File

@ -18,6 +18,7 @@
\usepackage{minted}
\usepackage[a4paper,landscape,margin=1cm,includehead,headsep=2ex,nofoot]{geometry}
\usepackage{fancyhdr}\usepackage{hyperref}
\usepackage{array}
\usemintedstyle{tango}
@ -169,6 +170,9 @@
{\end{minted}}
\makeatother
\setlength{\columnsep}{15pt}
\setlength{\columnseprule}{.1pt}
\begin{document}
\makeheader{\MakeUppercase{The Catala Syntax} \hspace{2em}\small english version}{v0.8.0}{1}
@ -186,244 +190,261 @@
\begin{multicols}{3}
\newlength\cola
\setlength\cola{\dimexpr .4\columnwidth -2\tabcolsep}
\setlength\cola{\dimexpr .6\columnwidth -2\tabcolsep}
\newlength\colb
\setlength\colb{\dimexpr .6\columnwidth -2\tabcolsep}
\setlength\colb{\dimexpr .4\columnwidth -2\tabcolsep}
\section{Literate programming}
\begin{tabular}{@{}p{\cola}p{\colb}@{}}
Heading & \begin{catala}
\begin{tabular}{@{}p{\cola}>{\slshape}p{\colb}@{}}
\begin{catala}
# Title
### Sub-subtitle
\end{catala}
&
Heading
\\
Code block &
\begin{catala}
```catala
```
\end{catala}
& Code block
\\
Metadata block & \begin{catala}
\begin{catala}
```catala-metadata
```
\end{catala}
& Metadata block
\\
File inclusion & \begin{catala}
\begin{catala}
> Include: foo.catala_en
\end{catala}
& File inclusion
\\
\end{tabular}
\newcommand*\FancyVerbStartString{\PYG{l+s}{```catala}}
\newcommand*\FancyVerbStopString{\PYG{l+s}{```}}
\section{Types and literals}
\section{Literals and types}
\begin{tabular}{@{}p{\cola}p{\colb}@{}}
\begin{catala}
```catala
boolean
```
\end{catala}
&
\begin{catala}
```catala
true false
```
\end{catala}
\\
\begin{catala}
& \begin{catala}
```catala
integer
boolean
```
\end{catala}
&
\\
\begin{catala}
```catala
65536
```
\end{catala}
\\
\begin{catala}
& \begin{catala}
```catala
decimal
integer
```
\end{catala}
& \begin{catala}
\\
\begin{catala}
```catala
65536.262144 37%
```
\end{catala}
\\
\begin{catala}
& \begin{catala}
```catala
money
decimal
```
\end{catala}
&
\\
\begin{catala}
```catala
$1,234,567.89
```
\end{catala}
\\
\begin{catala}
& \begin{catala}
```catala
date
money
```
\end{catala}
&
\\
\begin{catala}
```catala
|2021-01-31|
```
\end{catala}
\\
\begin{catala}
& \begin{catala}
```catala
duration
date
```
\end{catala}
&
\\
\begin{catala}
```catala
254 day 4 month 1 year
```
\end{catala}
\\
\begin{catala}
& \begin{catala}
```catala
collection integer
duration
```
\end{catala}
&
\\
\begin{catala}
```catala
[ 12; 24; 36 ]
```
\end{catala}
\\
\begin{catala}
& \begin{catala}
```catala
decimal depends on money
collection integer
```
\end{catala}
&
\\
\begin{catala}
```catala
f of x equals x / $12.0
```
\end{catala}
\\
\begin{catala}
& \begin{catala}
```catala
Struct1
decimal depends on money
```
\end{catala}
&
\\
\begin{catala}
```catala
Struct1 { -- fld1: 9 -- fld2: false }
```
\end{catala}
\\
\begin{catala}
& \begin{catala}
```catala
Enum1
Struct1
```
\end{catala}
&
\\
\begin{catala}
```catala
Case1 content 12 Case2
```
\end{catala}
& \begin{catala}
```catala
Enum1
```
\end{catala}
\\
\end{tabular}
\section{Expressions}
\begin{tabular}{@{}p{\cola}p{\colb}@{}}
Local definition & \begin{catala}
\begin{tabular}{@{}p{\cola}>{\slshape}p{\colb}@{}}
\begin{catala}
```catala
let x equals 36 - 5 in ...
```
\end{catala}
& Local definition
\\
Pattern matching & \begin{catala}
\begin{catala}
```catala
match expr with pattern
-- Case1 of x: ...
-- Case1 of x : ...
-- Case2 : ...
-- anything : ...
```
\end{catala}
& Pattern matching
\\
Pattern test and optional binding & \begin{catala}
\begin{catala}
```catala
expr with pattern Case1
expr with pattern Case1 of x
and x >= 2
```
\end{catala}
& Pattern test and optional binding
\\
Structure field access & \begin{catala}
\begin{catala}
```catala
struc1.fld2
```
\end{catala}
& Structure field access
\\
Function call & \begin{catala}
\begin{catala}
```catala
f of $44.50
```
\end{catala}
& Function call
\\
Subscope variable & \begin{catala}
\begin{catala}
```catala
sub1.var0
```
\end{catala}
& Subscope variable
\\
Direct scope call & \begin{catala}
\begin{catala}
```catala
output of Scope1
with { -- fld1: 9 -- fld2: true }
```
\end{catala}
& Direct scope call
\\
Conditional & \begin{catala}
\begin{catala}
```catala
if ... then ... else ...
```
\end{catala}
& Conditional
\\
\end{tabular}
\section{Metadata declaration}
\begin{tabular}{@{}p{\cola}p{\colb}@{}}
\begin{tabular}{@{}p{\cola}>{\slshape}p{\colb}@{}}
Structure declaration &
\begin{catala}
```catala
declaration structure Struct1:
data fld1 content integer
data fld2 content boolean
\end{catala}
& Structure declaration
\\
Enumeration declaration & \begin{catala}
\begin{catala}
```catala
declaration enumeration Enum1:
-- Case1 content integer
-- Case2
```
\end{catala}
& Enumeration declaration
\\
Scope declaration & \begin{catala}
\begin{catala}
```catala
declaration scope Scope1:
internal var1 content integer
@ -431,8 +452,9 @@
sub1 scope Scope0
```
\end{catala}
& Scope declaration
\\
Input-output qualifiers & \begin{catala}
\begin{catala}
```catala
internal var1 content ...
output var3 content ...
@ -442,21 +464,23 @@
context output var7 content ...
```
\end{catala}
& Input-output qualifiers
\\
State transitions declaration & \begin{catala}
\begin{catala}
```catala
internal var1 content ...
state before
state after
```
\end{catala}
& State transitions declaration
\\
\end{tabular}
\section{Operators and built-ins}
\begin{tabular}{@{}p{\cola}p{\colb}@{}}
Logical operators & \begin{catala}
\begin{tabular}{@{}p{\cola}>{\slshape}p{\colb}@{}}
\begin{catala}
```catala
not a
a and b
@ -464,16 +488,18 @@
a xor b # exclusive or
```
\end{catala}
& Logical operators
\\
Arithmetic & \begin{catala}
\begin{catala}
```catala
- a
a + b a - b
a * b a / b
```
\end{catala}
& Arithmetic
\\
Comparison &
\begin{catala}
```catala
a = b a != b
@ -481,29 +507,33 @@
a >= b a <= b
```
\end{catala}
& Comparison
\\
Conversions & \begin{catala}
\begin{catala}
```catala
decimal of 44
money of 23.15
```
\end{catala}
& Conversions
\\
Rounding & \begin{catala}
\begin{catala}
```catala
round of $9.99
```
\end{catala}
& Rounding
\\
Date parts & \begin{catala}
\begin{catala}
```catala
get_day of ...
get_month of ...
get_year of ...
```
\end{catala}
& Date parts
\\
Explicitly typed operators &
\begin{catala}
```catala
a +! b # integer
@ -512,6 +542,7 @@
a +^ b # duration
```
\end{catala}
& Explicitly typed operators
\\
\end{tabular}
@ -519,167 +550,191 @@
\section{Scope definition}
\begin{tabular}{@{}p{\cola}p{\colb}@{}}
Scope use & \begin{catala}
\begin{tabular}{@{}p{\cola}>{\slshape}p{\colb}@{}}
\begin{catala}
```catala
scope Scope1: ...
```
\end{catala}
& Scope use
\\
Use-wide condition & \begin{catala}
\begin{catala}
```catala
scope Scope1
under condition var1 >= 2: ...
```
\end{catala}
& Use-wide condition
\\
Unconditional definition & \begin{catala}
\begin{catala}
```catala
definition var1 equals ...
```
\end{catala}
& Unconditional definition
\\
Conditional definition & \begin{catala}
\begin{catala}
```catala
definition var1
under condition ...
consequence equals ...
```
\end{catala}
& Conditional definition
\\
Rule\newline(definition for conditions) & \begin{catala}
\begin{catala}
```catala
rule var2
under condition var1 >= 2
consequence fulfilled
```
\end{catala}
& Rule\newline(definition for conditions)
\\
Negative rule & \begin{catala}
\begin{catala}
```catala
consequence not fulfilled
```
\end{catala}
& Negative rule
\\
Function definition/rule & \begin{catala}
\begin{catala}
```catala
definition f of x equals ...
```
\end{catala}
& Function definition/rule
\\
Labeled definition or rule & \begin{catala}
\begin{catala}
```catala
label lbl1 definition var1 ...
```
\end{catala}
& Labeled definition or rule
\\
Exception to label & \begin{catala}
\begin{catala}
```catala
exception lbl1 definition var1 ...
```
\end{catala}
& Exception to label
\\
Exception to implicit & \begin{catala}
\begin{catala}
```catala
exception definition var1 ...
```
\end{catala}
& Exception to implicit
\\
State definition & \begin{catala}
\begin{catala}
```catala
definition var1
state before
equals ...
```
\end{catala}
& State definition
\\
Assertion & \begin{catala}
\begin{catala}
```catala
assertion ...
```
\end{catala}
& Assertion
\\
\end{tabular}
\section{Collection operations}
\begin{tabular}{@{}p{\cola}p{\colb}@{}}
\begin{tabular}{@{}p{\cola}>{\slshape}p{\colb}@{}}
Presence test & \begin{catala}
\begin{catala}
```catala
coll contains 3
```
\end{catala}
& Presence test
\\
Cardinal & \begin{catala}
\begin{catala}
```catala
number of coll
```
\end{catala}
& Cardinal
\\
Existence test & \begin{catala}
\begin{catala}
```catala
exists x among coll such that x >= 2
```
\end{catala}
& Existence test
\\
For all test & \begin{catala}
\begin{catala}
```catala
for all x among coll we have x >= 2
```
\end{catala}
& For all test
\\
Mapping & \begin{catala}
\begin{catala}
```catala
(x + 2) for x among coll
```
\end{catala}
& Mapping
\\
Filter & \begin{catala}
\begin{catala}
```catala
x among coll such that x >= 2
```
\end{catala}
& Filter
\\
Filter + map & \begin{catala}
\begin{catala}
```catala
(x - 2) for x among coll
such that x >= 2
```
\end{catala}
& Filter + map
\\
Merge & \begin{catala}
\begin{catala}
```catala
coll1 ++ coll2
```
\end{catala}
& Merge
\\
Aggregation & \begin{catala}
\begin{catala}
```catala
sum integer coll
```
\end{catala}
& Aggregation
\\
Count & \begin{catala}
\begin{catala}
```catala
number of coll
```
\end{catala}
& Count
\\
Extremum & \begin{catala}
\begin{catala}
```catala
maximum of coll
or if collection empty then -1
```
\end{catala}
& Extremum
\\
Arg-extremum & \begin{catala}
\begin{catala}
```catala
x among coll
such that (x * x) is minimum
or if collection empty then -1
```
\end{catala}
& Arg-extremum
\\
\end{tabular}

View File

@ -18,6 +18,7 @@
\usepackage{minted}
\usepackage[a4paper,landscape,margin=1cm,includehead,headsep=2ex,nofoot]{geometry}
\usepackage{fancyhdr}\usepackage{hyperref}
\usepackage{array}
\usemintedstyle{tango}
@ -169,6 +170,8 @@
{\end{minted}}
\makeatother
\setlength{\columnseprule}{.1pt}
\begin{document}
\makeheader{\MakeUppercase{La syntaxe de Catala} \hspace{2em}\small version française}{v0.8.0}{1}
@ -186,250 +189,271 @@
\begin{multicols}{3}
\newlength\cola
\setlength\cola{\dimexpr .4\columnwidth -2\tabcolsep}
\setlength\cola{\dimexpr .6\columnwidth -2\tabcolsep}
\newlength\colb
\setlength\colb{\dimexpr .6\columnwidth -2\tabcolsep}
\setlength\colb{\dimexpr .4\columnwidth -2\tabcolsep}
\section{Programmation littéraire}
\begin{tabular}{@{}p{\cola}p{\colb}@{}}
En-têtes & \begin{catala}
\begin{tabular}{@{}p{\cola}>{\slshape}p{\colb}@{}}
\begin{catala}
# Titre
### Sous-sous-titre
\end{catala}
& En-têtes
\\
Référence au journal officiel & \begin{catala}
\begin{catala}
# Article 1 | JORFARTI000012345678
# Article 2 | LEGIARTI000012345678
# Décision 3 | CETATEXT000012345678
\end{catala}
& Référence au journal officiel
\\
Bloc de code &
\begin{catala}
```catala
```
\end{catala}
& Bloc de code
\\
Bloc de métadonnées & \begin{catala}
\begin{catala}
```catala-metadata
```
\end{catala}
& Bloc de métadonnées
\\
Inclusion de fichier & \begin{catala}
\begin{catala}
> Inclusion: foo.catala_en
\end{catala}
& Inclusion de fichier
\\
\end{tabular}
\newcommand*\FancyVerbStartString{\PYG{l+s}{```catala}}
\newcommand*\FancyVerbStopString{\PYG{l+s}{```}}
\section{Types et littéraux}
\section{Littéraux et types}
\begin{tabular}{@{}p{\cola}p{\colb}@{}}
\begin{catala}
```catala
booléen
```
\end{catala}
&
\begin{catala}
```catala
vrai faux
```
\end{catala}
\\
\begin{catala}
& \begin{catala}
```catala
entier
booléen
```
\end{catala}
&
\\
\begin{catala}
```catala
65536
```
\end{catala}
\\
\begin{catala}
& \begin{catala}
```catala
décimal
entier
```
\end{catala}
& \begin{catala}
\\
\begin{catala}
```catala
65536,262144 37%
```
\end{catala}
\\
\begin{catala}
& \begin{catala}
```catala
argent
décimal
```
\end{catala}
&
\\
\begin{catala}
```catala
1 234 567,89€
```
\end{catala}
\\
\begin{catala}
& \begin{catala}
```catala
date
argent
```
\end{catala}
&
\\
\begin{catala}
```catala
|2021-01-31|
```
\end{catala}
\\
\begin{catala}
& \begin{catala}
```catala
durée
date
```
\end{catala}
&
\\
\begin{catala}
```catala
254 jour 4 mois 1 an
```
\end{catala}
\\
\begin{catala}
& \begin{catala}
```catala
collection entier
durée
```
\end{catala}
&
\\
\begin{catala}
```catala
[ 12; 24; 36 ]
```
\end{catala}
\\
\begin{catala}
& \begin{catala}
```catala
décimal dépend de argent
collection entier
```
\end{catala}
&
\\
\begin{catala}
```catala
f de x égale à x / 12,0€
```
\end{catala}
\\
\begin{catala}
& \begin{catala}
```catala
Struct1
décimal dépend de argent
```
\end{catala}
&
\\
\begin{catala}
```catala
Struct1 { -- chp1: 9 -- chp2: faux }
```
\end{catala}
\\
\begin{catala}
& \begin{catala}
```catala
Énum1
Struct1
```
\end{catala}
&
\\
\begin{catala}
```catala
Cas1 contenu 12 Cas2
```
\end{catala}
& \begin{catala}
```catala
Énum1
```
\end{catala}
\\
\end{tabular}
\section{Expressions}
\begin{tabular}{@{}p{\cola}p{\colb}@{}}
Définition locale & \begin{catala}
\begin{tabular}{@{}p{\cola}>{\slshape}p{\colb}@{}}
\begin{catala}
```catala
soit x égale à 36 - 5 dans ...
```
\end{catala}
& Définition locale
\\
Filtrage par motif & \begin{catala}
\begin{catala}
```catala
selon expr sous forme
-- Cas1 de x: ...
-- Cas1 de x : ...
-- Cas2 : ...
-- n'importe quel : ...
```
\end{catala}
& Filtrage par motif
\\
Test de filtrage\newline avec variable optionnelle & \begin{catala}
\begin{catala}
```catala
expr sous forme Cas1
expr sous forme Cas1 de x
et x >= 2
```
\end{catala}
& Test de filtrage\newline avec variable optionnelle
\\
Champ de structure & \begin{catala}
\begin{catala}
```catala
struc1.chp2
```
\end{catala}
& Champ de structure
\\
Appel de fonction & \begin{catala}
\begin{catala}
```catala
f de 44,50€
```
\end{catala}
& Appel de fonction
\\
Var. de sous-ch. d'app. & \begin{catala}
\begin{catala}
```catala
ss_ch1.var0
```
\end{catala}
& Var. de sous-ch. d'app.
\\
Appel direct\newline du champ d'application & \begin{catala}
\begin{catala}
```catala
résultat de ChApp1
avec { -- chp1: 9 -- chp2: vrai }
```
\end{catala}
& Appel direct\newline du champ d'application
\\
Branchement conditionnel & \begin{catala}
\begin{catala}
```catala
si ... alors ... sinon ...
```
\end{catala}
& Branchement conditionnel
\\
\end{tabular}
\section{Déclaration des métadonnées}
\begin{tabular}{@{}p{\cola}p{\colb}@{}}
\begin{tabular}{@{}p{\cola}>{\slshape}p{\colb}@{}}
Déclaration de structure &
\begin{catala}
```catala
déclaration structure Struct1:
donnée chp1 contenu entier
donnée chp2 contenu booléen
\end{catala}
& Déclaration de structure
\\
Déclaration d'énumération & \begin{catala}
\begin{catala}
```catala
déclaration énumération Énum1:
-- Cas1 contenu entier
-- Cas2
```
\end{catala}
& Déclaration d'énumération
\\
Déclaration de champ\newline d'application & \begin{catala}
\begin{catala}
```catala
déclaration champ d'application ChApp1:
interne var1 contenu entier
@ -437,8 +461,9 @@
ss_ch1 champ d'application ChApp0
```
\end{catala}
& Déclaration de champ\newline d'application
\\
Qualificateurs d'entrée-\newline sortie & \begin{catala}
\begin{catala}
```catala
interne var1 contenu ...
résultat var3 contenu ...
@ -448,21 +473,23 @@
contexte résultat var7 contenu ...
```
\end{catala}
& Qualificateurs d'entrée-\newline sortie
\\
Transitions d'état & \begin{catala}
\begin{catala}
```catala
interne var1 contenu ...
état avant
état après
```
\end{catala}
& Transitions d'état
\\
\end{tabular}
\section{Opérations}
\begin{tabular}{@{}p{\cola}p{\colb}@{}}
Opérateurs logiques & \begin{catala}
\begin{tabular}{@{}p{\cola}>{\slshape}p{\colb}@{}}
\begin{catala}
```catala
non a
a et b
@ -470,16 +497,18 @@
a ou bien b # ou exclusif
```
\end{catala}
& Opérateurs logiques
\\
Arithmétique & \begin{catala}
\begin{catala}
```catala
- a
a + b a - b
a * b a / b
```
\end{catala}
& Arithmétique
\\
Comparaisons &
\begin{catala}
```catala
a = b a != b
@ -487,29 +516,32 @@
a >= b a <= b
```
\end{catala}
& Comparaisons
\\
Conversions & \begin{catala}
\begin{catala}
```catala
décimal de 44
argent de 23,15
```
\end{catala}
& Conversions
\\
Arrondis & \begin{catala}
\begin{catala}
```catala
arrondi de 9,99€
```
\end{catala}
& Arrondis
\\
Éléments de dates & \begin{catala}
\begin{catala}
```catala
accès_jour de ...
accès_mois de ...
accès_année de ...
```
\end{catala}
& Éléments de dates
\\
Opérateurs à types\newline explicites &
\begin{catala}
```catala
a +! b # entier
@ -518,6 +550,7 @@
a +^ b # durée
```
\end{catala}
& Opérateurs à types\newline explicites
\\
\end{tabular}
@ -525,167 +558,190 @@
\section{Définition de champ d'application}
\begin{tabular}{@{}p{\cola}p{\colb}@{}}
Utilisation & \begin{catala}
\begin{tabular}{@{}p{\cola}>{\slshape}p{\colb}@{}}
\begin{catala}
```catala
champ d'application ChApp1: ...
```
\end{catala}
& Utilisation
\\
Avec condition générale & \begin{catala}
\begin{catala}
```catala
champ d'application ChApp1
sous condition var1 >= 2: ...
```
\end{catala}
& Avec condition générale
\\
Définition inconditionnelle & \begin{catala}
\begin{catala}
```catala
définition var1 égale à ...
```
\end{catala}
& Définition inconditionnelle
\\
Définition conditionnelle& \begin{catala}
\begin{catala}
```catala
définition var1
sous condition ...
conséquence égale à ...
```
\end{catala}
& Définition conditionnelle
\\
Règle\newline(définition de condition) & \begin{catala}
\begin{catala}
```catala
règle var2
sous condition var1 >= 2
conséquence rempli
```
\end{catala}
& Règle\newline(définition de condition)
\\
Règle négative & \begin{catala}
\begin{catala}
```catala
conséquence non rempli
```
\end{catala}
& Règle négative
\\
Définition de fonction/règle & \begin{catala}
\begin{catala}
```catala
définition f de x égale à ...
```
\end{catala}
& Définition de fonction/règle
\\
Définition/règle étiquetée & \begin{catala}
\begin{catala}
```catala
étiquette étq1 définition var1 ...
```
\end{catala}
& Définition/règle étiquetée
\\
Exc. à définition étiquetée & \begin{catala}
\begin{catala}
```catala
exception étq1 définition var1 ...
```
\end{catala}
& Exc. à définition étiquetée
\\
Exception à implicite & \begin{catala}
\begin{catala}
```catala
exception définition var1 ...
```
\end{catala}
& Exception à implicite
\\
Définition d'états & \begin{catala}
\begin{catala}
```catala
définition var1
état avant
égale à ...
```
\end{catala}
& Définition d'états
\\
Assertion & \begin{catala}
\begin{catala}
```catala
assertion ...
```
\end{catala}
& Assertion
\\
\end{tabular}
\section{Opérations sur les collections}
\begin{tabular}{@{}p{\cola}p{\colb}@{}}
Test de présence& \begin{catala}
\begin{tabular}{@{}p{\cola}>{\slshape}p{\colb}@{}}
\begin{catala}
```catala
coll contient 3
```
\end{catala}
& Test de présence
\\
Cardinal & \begin{catala}
\begin{catala}
```catala
nombre de coll
```
\end{catala}
& Cardinal
\\
Test d'existence & \begin{catala}
\begin{catala}
```catala
existe x parmi coll tel que x >= 2
```
\end{catala}
& Test d'existence
\\
Test pour tous & \begin{catala}
\begin{catala}
```catala
pour tout x parmi coll on a x >= 2
```
\end{catala}
& Test pour tout
\\
Application un-à-un & \begin{catala}
\begin{catala}
```catala
(x + 2) pour x parmi coll
```
\end{catala}
& Application un-à-un
\\
Filtrage & \begin{catala}
\begin{catala}
```catala
x parmi coll tel que x >= 2
```
\end{catala}
& Filtrage
\\
Filtrage + application & \begin{catala}
\begin{catala}
```catala
(x - 2) pour x parmi coll
tel que x >= 2
```
\end{catala}
& Filtrage + application
\\
Réunion & \begin{catala}
\begin{catala}
```catala
coll1 ++ coll2
```
\end{catala}
& Réunion
\\
Aggrégation & \begin{catala}
\begin{catala}
```catala
somme entier coll
```
\end{catala}
& Aggrégation
\\
Comptage & \begin{catala}
\begin{catala}
```catala
nombre de coll
```
\end{catala}
& Comptage
\\
Extremums & \begin{catala}
\begin{catala}
```catala
maximum de coll
ou si collection vide alors -1
```
\end{catala}
& Extremums
\\
Élément selon extremum & \begin{catala}
\begin{catala}
```catala
x parmi coll
tel que (x * x) est minimum
ou si collection vide alors -1
```
\end{catala}
& Élément selon extremum
\\
\end{tabular}