commit 55253368d51752b53f32f5ad4ed16f01d2ac6aee
parent 84ed1fb4fbda6dc4c62a7225d21adeb543d3fb57
Author: Martin Kloeckner <mjkloeckner@gmail.com>
Date: Fri, 11 Jul 2025 19:32:00 -0300
added `guias/complejidad_algoritmica/*`
Diffstat:
4 files changed, 593 insertions(+), 0 deletions(-)
diff --git a/guias/complejidad_algoritmica/fix-math.lua b/guias/complejidad_algoritmica/fix-math.lua
@@ -0,0 +1,64 @@
+-- removes all `$$` surrounding align contexts
+
+function walk_blocks(blocks)
+ local new_blocks = {}
+ for _, blk in ipairs(blocks) do
+ if blk.t == 'Para' then
+ -- Paras can contain inline math elements, so check and replace those as well
+ local new_inlines = {}
+ for _, inline in ipairs(blk.content) do
+ if inline.t == 'Math' and inline.mathtype == 'DisplayMath' then
+ if inline.text:match('^\\begin{align%*?}') then
+ -- Replace inline Math with RawBlock (convert Para to RawBlock)
+ table.insert(new_blocks, pandoc.RawBlock('latex', inline.text))
+ else
+ table.insert(new_inlines, inline)
+ end
+ else
+ table.insert(new_inlines, inline)
+ end
+ end
+ -- Only add the Para if there is still content
+ if #new_inlines > 0 then
+ table.insert(new_blocks, pandoc.Para(new_inlines))
+ end
+
+ elseif blk.t == 'Plain' then
+ -- Similar handling for Plain blocks
+ local new_inlines = {}
+ for _, inline in ipairs(blk.content) do
+ if inline.t == 'Math' and inline.mathtype == 'DisplayMath' then
+ if inline.text:match('^\\begin{align%*?}') then
+ table.insert(new_blocks, pandoc.RawBlock('latex', inline.text))
+ else
+ table.insert(new_inlines, inline)
+ end
+ else
+ table.insert(new_inlines, inline)
+ end
+ end
+ if #new_inlines > 0 then
+ table.insert(new_blocks, pandoc.Plain(new_inlines))
+ end
+
+ elseif blk.t == 'CodeBlock' or blk.t == 'RawBlock' then
+ -- Just keep them as is
+ table.insert(new_blocks, blk)
+
+ elseif blk.t == 'BlockQuote' or blk.t == 'Div' then
+ -- Recurse on nested blocks
+ blk.content = walk_blocks(blk.content)
+ table.insert(new_blocks, blk)
+
+ else
+ -- Other block types just pass through
+ table.insert(new_blocks, blk)
+ end
+ end
+ return new_blocks
+end
+
+function Pandoc(doc)
+ doc.blocks = walk_blocks(doc.blocks)
+ return doc
+end
diff --git a/guias/complejidad_algoritmica/respuestas.md b/guias/complejidad_algoritmica/respuestas.md
@@ -0,0 +1,272 @@
+# Guía complejidad algorítmica
+
+Algoritmos y Estructuras de Datos (CB100) - FIUBA
+Martin Klöckner - [mklockner@fi.uba.ar](mailto:mklockner@fi.uba.ar)
+
+> 1. Un algoritmo divide un problema de tamaño $n$ en dos subproblemas de tamaño
+> $n/2$ con un costo constante en cada paso adicional, obtener la complejidad
+> sabiendo que el costo real $T(n)$ es:
+> $$T(n) = 2T\left(\frac{n}{2}\right) + \Omicron(1)$$
+
+Como la función de costo real $T(n)$ depende de la misma función $T(n)$ pero con
+una entrada menor $n/2$ se trata de un algoritmo recursivo o iterativo. Por el
+método de expansion, el orden se puede calcular como se muestra a continuación:
+
+$$\begin{align}
+T(n) = 2T\left(\frac{n}{2}\right) + \Omicron(1)
+\end{align}$$
+
+Pero $T\left(\frac{n}{2}\right)$ resulta:
+
+$$\begin{align}
+T\left(\frac{n}{2}\right) = 2T\left(\frac{n}{4}\right) +
+\Omicron(1)
+\end{align}$$
+
+Por lo tanto reemplazando $(2)$ en $(1)$ resulta:
+
+$$\begin{align}
+T(n) &= 2\cdotp \left[2T\left(\frac{n}{4}\right) + \Omicron(1)\right] + \Omicron(1) \nonumber\\
+ &= 4T\left(\frac{n}{4}\right) + 2\Omicron(1) + \Omicron(1) \nonumber\\
+ &= 4T\left(\frac{n}{4}\right) + 3\Omicron(1)
+\end{align}$$
+
+Pero de $(1)$ se puede obtener $T\left(\frac{n}{4}\right)$:
+
+$$\begin{align}
+T\left(\frac{n}{4}\right) = 2T\left(\frac{n}{8}\right) + \Omicron(1)
+\end{align}$$
+
+Y reemplazando en la ecuación $(3)$:
+
+$$\begin{align}
+T(n) &= 4\cdotp \left[2T\left(\frac{n}{8}\right) + \Omicron(1)\right] + 2\Omicron(1) + \Omicron(1) \nonumber\\
+ &= 8T\left(\frac{n}{8}\right) + 4\Omicron(1) + 2\Omicron(1) + \Omicron(1)\nonumber\\
+ &= 8T\left(\frac{n}{8}\right) + 7\Omicron(1)
+\end{align}$$
+
+Se puede ver que luego de realizar $k$ veces el mismo procedimiento resulta:
+
+$$\begin{align}
+T(n) = 2^{k}\cdotp T\left(\frac{n}{2^k}\right) + (2^{k}-1)\cdotp \Omicron(1)
+\end{align}$$
+
+Pero las iteraciones se terminan cuando el numero de entradas es $1$, entonces
+en $(6)$:
+
+$$\begin{align}
+\frac{n}{2^k} = 1 \Rightarrow n = 2^k \Rightarrow \boxed{log_{2}(n) = k}
+\end{align}$$
+
+Con $(7)$ en $(6)$ resulta
+
+$$T(n) = n\cdotp T(1) + (n - 1)\cdotp \Omicron(1)$$
+
+De la expresión anterior, suponiendo $T(1) = \Omicron(1)$ y aproximando, resulta
+
+$$\begin{align*}
+T(n) &= n\cdotp \Omicron(1) + (n - 1)\cdotp \Omicron(1) \\
+ &= \Omicron(n) + \Omicron(n) \Rightarrow \boxed{T(n) = \Omicron(n)}
+\end{align*}$$
+
+Es decir la complejidad resulta $\Omicron(n)$. El mismo problema se podría haber
+resuelto utilizando el teorema maestro para la reducción por division, el cual
+en primer lugar dice que dado un algoritmo con función de costo real $T(n)$ de
+la siguiente forma:
+
+$$T(n) =
+\begin{cases}
+\hspace{0.75em} c\cdotp n^{k} & \text{si } 1\leq n < b \\
+\hspace{0.75em} a\cdotp T\left(\frac{n}{b}\right) + c\cdotp n^{k} & \text{si } n \geq b
+\end{cases}$$
+
+La complejidad algorítmica, o la solución de la ecuación de recurrencia $T(n)$
+resulta:
+
+$$T(n) =
+\begin{cases}
+\hspace{0.75em} \Omicron(n^k) & \text{si } a < b^{k} \\
+\hspace{0.75em} \Omicron(n^{k}\cdotp log(n)) & \text{si } a = b^{k} \\
+\hspace{0.75em} \Omicron(n^{log_{b}(a)}) & \text{si } a > b^{k}
+\end{cases}$$
+
+En este caso se tiene que $T(n)$ es
+
+$$T(n) = 2T\left(\frac{n}{2}\right) + \Omicron(1)$$
+
+Y es de la forma
+
+$$a\cdotp T\left(\frac{n}{b}\right) + c\cdotp n^{k}$$
+
+Con $a=2$, $b=2$, $c=1$ y $k=0$. Por lo tanto, la solución de la ecuación de
+recurrencia, o la complejidad sale directamente, siendo esta:
+
+$$T(n) = \Omicron(n^{log_{b}(a)}) = \Omicron(n^{log_{2}(2)}) \Rightarrow \boxed{T(n) = \Omicron(n)}$$
+
+Resultando de igual forma que para la complejidad hallada mediante el método de
+expansión.
+
+> 2. Un algoritmo busca un valor en un array ordenado reduciendo el problema a
+> la mitad en cada paso, con un costo constante para la comparación
+> $$T(n) = T\left(\frac{n}{2}\right) + \Omicron(1)$$
+
+Para obtener la complejidad algorítmica, utilizo el método de expansión:
+
+$$\begin{align}
+T(n) = T\left(\frac{n}{2}\right) + \Omicron(1)
+\end{align}$$
+
+Pero $T\left(\frac{n}{2}\right)$ resulta de reemplazar $n$ por $\frac{n}{2}$ en
+$T(n)$, entonces:
+
+$$\begin{align}
+T\left(\frac{n}{2}\right) = T\left(\frac{n}{4}\right) + \Omicron(1)
+\end{align}$$
+
+Reemplazando $(9)$ en $(8)$ resulta
+
+$$\begin{align}
+T(n) &= T\left(\frac{n}{4}\right) + \Omicron(1) + \Omicron(1) \nonumber\\
+ &= T\left(\frac{n}{4}\right) + 2\Omicron(1)
+\end{align}$$
+
+Realizando una iteración mas reemplazando $n = \frac{n}{4}$ en $(8)$ resulta
+
+$$\begin{align}
+T\left(\frac{n}{4}\right) = T\left(\frac{n}{8}\right) + \Omicron(1)
+\end{align}$$
+
+Y con $(11)$ en $(10)$:
+
+$$\begin{align}
+T(n) &= T\left(\frac{n}{8}\right) + \Omicron(1) + \Omicron(1) + \Omicron(1) \nonumber\\
+ &= T\left(\frac{n}{8}\right) + 3\Omicron(1)
+\end{align}$$
+
+Se puede ver que luego de $k$ veces (o iteraciones) de repetir el procedimiento
+resulta
+
+$$\begin{align}
+T(n) &= T\left(\frac{n}{2^k}\right) + k\cdotp \Omicron(1)
+\end{align}$$
+
+Pero las iteraciones se terminan cuando se llega al caso base, esto es, cuando
+$\frac{n}{2^k} = 1$ entonces:
+
+$$\begin{align}
+\frac{n}{2^k} &= 1 \Rightarrow 2^k = n \Rightarrow \boxed{k = log_{2}(n)}
+\end{align}$$
+
+Reemplazando $(14)$ en $(13)$
+
+$$\begin{align}
+T(n) &= T(1) + log_{2}(n)\cdotp \Omicron(1)
+\end{align}$$
+
+Suponiendo $T(1) = \Omicron(1)$ resulta que
+
+$$\begin{align}
+T(n) &= \Omicron(1) + log_{2}(n)\cdotp \Omicron(1)
+\end{align}$$
+
+Por lo tanto la complejidad algorítmica resulta:
+
+$$\boxed{T(n) = \Omicron(log(n))}$$
+
+De manera análoga utilizando el teorema maestro, la expresión de $T(n)$ es de la
+forma
+
+$$a\cdotp T\left(\frac{n}{b}\right) + c\cdotp n^{k}$$
+
+Con $a = 1$, $b = 2$, $c=1$ y $k=0$, por lo tanto aplicando el teorema maestro
+para la reducción por division resulta que la complejidad es:
+
+$$T(n) = \Omicron(n^{k}\cdotp log(n)) = \Omicron(n^{0}\cdotp log(n))$$
+
+$$\Rightarrow\boxed{T(n) = \Omicron(log(n))}$$
+
+> 3. Un algoritmo suma los elementos de una lista de $n$ números dividiendo la
+> lista en dos partes de igual tamaño.
+> $$T(n) = 2T\left(\frac{n}{2}\right) + \Omicron(n)$$
+
+En este caso aplico el teorema maestro en caso de poder aplicarse primero y
+luego comparo con el método de expansión. Se puede ver que $T(n)$ es de la forma
+
+$$a\cdotp T\left(\frac{n}{b}\right) + c\cdotp n^{k}$$
+
+Con $a=2$, $b=2$, $c=1$ y $k=1$, por lo tanto se puede aplicar el teorema
+maestro y la complejidad algorítmica resulta;
+
+$$T(n) = \Omicron(n^{k}\cdotp log(n)) = \Omicron(n^{1}\cdotp log(n))$$
+
+$$\Rightarrow\boxed{T(n) = \Omicron(n\cdotp log(n))}$$
+
+De manera análoga, utilizando el método de expansion:
+
+$$\begin{align}
+T(n) = 2T\left(\frac{n}{2}\right) + \Omicron(n)
+\end{align}$$
+
+Pero $T\left(\frac{n}{2}\right)$ resulta de reemplazar $n =
+\frac{n}{2}$ en $(17)$, de lo cual resulta
+
+$$\begin{align}
+T\left(\frac{n}{2}\right) = 2T\left(\frac{n}{4}\right) + \Omicron\left(\frac{n}{2}\right)
+\end{align}$$
+
+Entonces de $(18)$ en $(17)$
+
+$$\begin{align}
+T(n) &= 2\cdotp \left[2 T\left(\frac{n}{4}\right) + \Omicron\left(\frac{n}{2}\right)\right] + \Omicron(n) \nonumber \\
+ &= 4\cdotp T\left(\frac{n}{4}\right) + 2\cdotp \Omicron\left(\frac{n}{2}\right) + \Omicron(n) \\
+\end{align}$$
+
+Realizando una iteración más $T\left(\frac{n}{4}\right)$ resulta de reemplazar $n =
+\frac{n}{4}$ en $(17)$, de lo cual resulta
+
+$$\begin{align}
+T\left(\frac{n}{4}\right) = 2T\left(\frac{n}{8}\right) + \Omicron\left(\frac{n}{4}\right)
+\end{align}$$
+
+Y de $(20)$ en $(19)$
+
+$$\begin{align}
+T(n) &= 4\cdotp \left[ 2T\left(\frac{n}{8}\right) +
+ \Omicron\left(\frac{n}{4}\right) \right] + 2\cdotp
+ \Omicron\left(\frac{n}{2}\right) + \Omicron(n) \nonumber \\
+ &= 8\cdotp T\left(\frac{n}{8}\right) +
+ 4\cdotp \Omicron\left(\frac{n}{4}\right) +
+ 2\cdotp \Omicron\left(\frac{n}{2}\right) + \Omicron(n)\\
+\end{align}$$
+
+Es decir, luego de $k$ iteraciones se llega a:
+
+$$\begin{align}
+T(n) &= 2^{k}\cdotp T\left(\frac{n}{2^{k}}\right) +
+ \sum^{k-1}_{i=0} 2^{i} \cdotp \Omicron\left(\frac{n}{2^{i}}\right) \nonumber\\
+ &= 2^{k}\cdotp T\left(\frac{n}{2^{k}}\right) +
+ \sum^{k-1}_{i=0} \Omicron(n) \\
+\end{align}$$
+
+Pero cuando se llega al caso base se cumple:
+
+$$\begin{align}
+\frac{n}{2^{k}} = 1 \Rightarrow 2^{k} = n \Rightarrow\boxed{k = log_{2}(n)}
+\end{align}$$
+
+De $(23)$ en $(22)$:
+
+$$\begin{align*}
+T(n) &= n\cdotp T(1) + \sum^{log_{2}(n-1)}_{i=0} \Omicron(n) \\
+ &= n\cdotp T(1) + log_{2}(n-1) \cdotp \Omicron(n) \\
+ &= \Omicron(n) + \Omicron(n\cdotp log(n))
+\end{align*}$$
+
+El termino dominante de la expresión anterior es $n\cdotp log(n)$ entonces:
+
+$$\Rightarrow\boxed{T(n) = \Omicron(n\cdotp log(n))}$$
+
+La expresión anterior coincide con la complejidad algorítmica hallada mediante
+el método de aplicar el teorema maestro, pero se es evidente que el método de
+expansion en algunos casos se puede volver mucho mas tedioso en comparación a
+aplicar el teorema.
diff --git a/guias/complejidad_algoritmica/respuestas.pdf b/guias/complejidad_algoritmica/respuestas.pdf
Binary files differ.
diff --git a/guias/complejidad_algoritmica/style.tex b/guias/complejidad_algoritmica/style.tex
@@ -0,0 +1,257 @@
+% \documentclass[14pt]{extarticle}
+
+% page setup
+% \usepackage[a4paper,
+% top=2.5cm,
+% bottom=2.5cm,
+% left=2.00cm,
+% right=2.00cm,
+% bmargin=2.50cm]{geometry}
+\usepackage[a4paper,
+ top=2.50cm,
+ bottom=2.50cm,
+ left=2.00cm,
+ right=2.00cm,
+ bmargin=2.00cm]{geometry}
+
+\usepackage{titlesec}
+\usepackage{fontspec}
+\setmainfont{Helvetica}
+
+% right pointing hand
+\usepackage{utfsym}
+
+% make pictures caption font bold and small
+\usepackage[font={footnotesize,bf}]{caption}
+\usepackage{subcaption}
+
+% inline code (backticks in md)
+\linespread{1.10}
+\definecolor{bgcolor}{HTML}{e0e0e0}
+\let\oldtexttt\texttt
+
+\renewcommand{\texttt}[1]{
+ \colorbox{bgcolor}{\oldtexttt{#1}}
+}
+
+% change boldfont bold to extrabold
+% \setmainfont[
+% BoldFont={Inter-ExtraBold}
+% ]{Inter}
+
+% change regular font to light font
+% \setmainfont{Inter light}
+
+\newfontfamily\titlefont{Inter}[
+UprightFont = *-Regular,
+BoldFont = *-ExtraBold,
+Scale = 1.0
+]
+
+\newfontfamily\sectionsfont{Inter}[
+UprightFont = *-Regular,
+BoldFont = *-Bold,
+]
+
+% \setmathfont{Fira Math}
+\setmathfont[Scale=1.0]{Fira Math}
+
+\usepackage{xcolor}
+\definecolor{ugrey}{HTML}{333333}
+
+\titleformat{\section}
+{\color{ugrey}\titlefont\Large\bfseries}
+{\color{ugrey}}
+{0em}
+{}
+
+\titleformat{\subsection}
+{\color{ugrey}\sectionsfont\large\bfseries}
+{\color{ugrey}}
+{0em}
+{}
+
+\titleformat{\subsubsection}
+{\color{ugrey}\sectionsfont\bfseries}
+{\color{ugrey}}
+{0em}
+{}
+
+\titleformat{\paragraph}
+{\color{ugrey}\sectionsfont\bfseries}
+{\color{ugrey}\theparagraph}
+{0em}
+{}
+
+\titleformat{\subparagraph}
+{\color{ugrey}\normalfont\bfseries}
+{\color{ugrey}\theparagraph}
+{0em}
+{}
+
+% spacing: how to read {12pt plus 4pt minus 2pt}
+% 12pt is what we would like the spacing to be
+% plus 4pt means that TeX can stretch it by at most 4pt
+% minus 2pt means that TeX can shrink it by at most 2pt
+%
+% \titlespacing{command}{left spacing}{before spacing}{after spacing}[right]
+
+\titlespacing*{\section}
+{0pt}{2ex plus 1ex minus .2ex}{1.75ex plus .2ex}
+
+\titlespacing*{\subsection}
+{0pt}{1.75ex plus 1ex minus .2ex}{1.5ex plus .2ex}
+
+\titlespacing*{\subsubsection}
+{0pt}{1.5ex plus 1ex minus .2ex}{1.25ex plus .2ex}
+
+\titlespacing*{\paragraph}
+{0pt}{1.5ex plus 1ex minus .2ex}{1.0ex plus .2ex}
+
+\titlespacing*{\subparagraph}
+{0pt}{1.25ex plus 1ex minus .2ex}{1.0ex plus .2ex}
+
+% spacing between formulas and text
+% \usepackage[nodisplayskipstretch]{setspace}
+% \setstretch{1.20}
+
+\setlength{\abovedisplayskip}{0pt}
+\setlength{\belowdisplayskip}{0pt}
+
+\setlength{\abovedisplayshortskip}{0pt}
+\setlength{\belowdisplayshortskip}{0pt}
+
+\setlength{\belowdisplayshortskip}{\belowdisplayskip}
+
+\setlength{\baselineskip}{0pt}
+
+% \usepackage{setspace}
+% \setstretch{1.25}
+
+% \renewcommand{\figurename}{Fig.}
+
+\usepackage{caption}
+\captionsetup{font=normalsize, font=bf, labelfont=bf}
+\captionsetup[sub]{font=small,labelfont=md}
+
+\renewcommand\thesubfigure{\arabic{subfigure}}
+
+\renewcommand{\figurename}{Figura}
+\renewcommand{\tablename}{Tabla}
+
+% \renewcommand{\contentsname}{Índice}
+\renewcommand\contentsname{\vspace*{-45pt}}
+
+% TOC dots separation
+% \renewcommand{\cftdotsep}{10}
+
+% \setlength{\cftsecindent}{0pt}% Remove indent for \section
+% \setlength{\cftsubsecindent}{5pt}% Remove indent for \subsection
+% \setlength{\cftsubsubsecindent}{0pt}% Remove indent for \subsubsec
+
+\setcounter{tocdepth}{4}
+
+\usepackage{titling}
+\renewcommand{\maketitle}{
+ \begin{flushleft}
+ {\bfseries\Huge\thetitle}
+ \vspace{1mm}
+ \end{flushleft}
+ \thispagestyle{empty}
+}
+
+% remove the page number from all the pages that the TOC occupies
+% \addtocontents{toc}{\protect\thispagestyle{empty}}
+
+% add page break after TOC set it to page number 1
+\let\oldtableofcontents\tableofcontents % remember the definition
+\renewcommand\tableofcontents{
+ \oldtableofcontents % use the standard toc
+ \thispagestyle{empty}
+ \pagebreak
+ \setcounter{page}{1}
+}
+
+% Set text color for all document
+% \color{ugrey}
+
+\usepackage[titles]{tocloft}
+\renewcommand{\cftdotsep}{1.5}
+\renewcommand{\cftsetpnumwidth}{1.5}
+\renewcommand{\cftsetrmarg}{1.5}
+
+\usepackage{float}
+\makeatletter
+\def\fps@figure{H}
+\makeatother
+
+% nicer chemical figures
+\usepackage{chemfig}
+
+% change style of quote, see also https://tex.stackexchange.com/a/436253/114857
+\usepackage[most]{tcolorbox}
+
+
+\definecolor{linequote}{RGB}{224,215,188}
+\definecolor{bordercolor}{RGB}{221,221,221}
+% \definecolor{backquote}{RGB}{249,245,233}
+\definecolor{backquote}{RGB}{245,245,245}
+
+% change left border: https://tex.stackexchange.com/a/475716/114857
+% change left margin: https://tex.stackexchange.com/a/457936/114857
+\newtcolorbox{myquote}[1][]{%
+ enhanced,
+ breakable,
+ size=minimal,
+ left=0pt,
+ top=12pt,
+ bottom=12pt,
+ right=12pt,
+ boxrule=1pt,
+ sharp corners=all,
+ colback=backquote,
+ colframe=black,
+ #1}
+
+% redefine quote environment to use the myquote environment, see
+% https://tex.stackexchange.com/a/337587/114857
+\renewenvironment{quote}{\begin{myquote}}{\end{myquote}}
+
+% better fractions
+\usepackage{nicefrac,xfrac}
+
+% surround footnotes number with square brackets and always use numbers (even
+% inside quoted text)
+% https://www.overleaf.com/learn/latex/Footnotes
+\renewcommand*{\thefootnote}{\ [\arabic{footnote}]\ }
+\renewcommand*{\thempfootnote}{\ [\arabic{mpfootnote}]\ }
+
+% space between text and footer
+\setlength\footskip{25pt}
+\setlength{\skip\footins}{12pt}
+
+% align first letter of all the lines in the footnotes
+\usepackage[bottomfloats,belowfloats,hang]{footmisc}
+\setlength{\footnotemargin}{1em}
+
+\newcommand{\unit}[2]{\nicefrac{#1}{#2}}
+
+\usepackage{enumitem}
+\usepackage{amsfonts}
+
+\setlist[itemize,1]{label=$\bullet$}
+\setlist[itemize,2]{label=$\textopenbullet$}
+
+\usepackage{tabularx}
+\usepackage{multirow} % Required for multirows
+\usepackage{colortbl}
+
+% Reduce space around displayed equations safely
+\makeatletter
+\setlength{\abovedisplayskip}{6pt} % space above display math
+\setlength{\belowdisplayskip}{6pt} % space below display math
+\setlength{\abovedisplayshortskip}{4pt} % space above short display math
+\setlength{\belowdisplayshortskip}{4pt} % space below short display math
+
+\setlength{\jot}{4pt} % space between lines in align environments (default ~6pt)
+\makeatother