diff options
Diffstat (limited to 'Master/texmf-dist/doc/latex/perfectcut/perfectcut.tex')
-rw-r--r-- | Master/texmf-dist/doc/latex/perfectcut/perfectcut.tex | 297 |
1 files changed, 205 insertions, 92 deletions
diff --git a/Master/texmf-dist/doc/latex/perfectcut/perfectcut.tex b/Master/texmf-dist/doc/latex/perfectcut/perfectcut.tex index 7744bd007ed..64b2421f9c2 100644 --- a/Master/texmf-dist/doc/latex/perfectcut/perfectcut.tex +++ b/Master/texmf-dist/doc/latex/perfectcut/perfectcut.tex @@ -3,7 +3,7 @@ %%% %%% Author: Guillaume Munch-Maccagnoni %%% http://www.pps.univ-paris-diderot.fr/~munch/ -%%% +%%% %%% This work may be distributed and/or modified under the conditions of %%% the LaTeX Project Public License, either version 1.3 of this license %%% or (at your option) any later version. Refer to the README file. @@ -12,40 +12,45 @@ \usepackage[T1]{fontenc} \usepackage[latin9]{inputenc} \setcounter{secnumdepth}{1} +\setcounter{tocdepth}{1} \usepackage{babel} +\usepackage{array} \usepackage{booktabs} \usepackage{calc} \usepackage{amsmath} \usepackage[unicode=true]{hyperref} - -\makeatletter - \usepackage{perfectcut} -%% NewTXtext with a bugfix -\let\orig@makefnmark=\@makefnmark -\usepackage{newtxtext} -\let\@makefnmark=\orig@makefnmark -%%End of bugfix - -\usepackage[T1]{fontenc} -\usepackage{newtxmath} +\usepackage{stix} \renewcommand*\ttdefault{txtt} \usepackage[oldstyle,lining,scale=0.97]{sourcesanspro} \usepackage[protrusion=true,expansion=true,tracking=false,kerning=true,spacing=true]{microtype} -\makeatother - \begin{document} +\global\long\def\cut#1#2{\perfectcut{#1}{#2}} +\global\long\def\mt{\bar{\mu}} + \title{\texttt{perfectcut.sty} documentation} -\author{Guillaume Munch-Maccagnoni% + + +\author{\noindent {\large{}Guillaume Munch-Maccagnoni}% \thanks{\protect\href{http://www.pps.univ-paris-diderot.fr/~munch/}{http://www.pps.univ-paris-diderot.fr/$\sim$munch/}% }} -\date{January 31st 2014} + + +\date{2nd November 2014} + \maketitle + +\tableofcontents{} + + \section{Use} + +\paragraph{Original use} + This package supplies the following commands: \begin{center} @@ -57,87 +62,183 @@ Command & Produces\tabularnewline \texttt{\textbackslash{}perfectbra\{\#1\}} & $\perfectbra{\#1}$\tabularnewline \texttt{\textbackslash{}perfectket\{\#1\}} & $\perfectket{\#1}$\tabularnewline \bottomrule +\end{tabular}\quad{}% +\begin{tabular}{ll} +\toprule +Command & Produces\tabularnewline +\midrule +\texttt{\textbackslash{}perfectcase\{\#1\}} & $\perfectcase{\#1}{\#2}$\tabularnewline +\texttt{\textbackslash{}perfectbrackets\{\#1\}} & $\perfectbrackets{\#1}$\tabularnewline +\texttt{\textbackslash{}perfectparens\{\#1\}} & $\perfectparens{\#1}$\tabularnewline +\bottomrule \end{tabular} -\end{center} +\par\end{center} -The effect of the commands is to determine the size of the brackets -depending on the number of nested \texttt{\textbackslash{}perfectcut} -(regardless of the contents). It is intended for use: -\begin{itemize} -\item In proof theory, for term notations of sequent calculus, -\item In computer science, for the modeling of abstract machines. -\end{itemize} -It could also be adapted for any visually similar effects as an alternative -to \texttt{\textbackslash{}left}, \texttt{\textbackslash{}right} and -\texttt{\textbackslash{}middle}. (You can contact the author.) +The effect of these commands is to let the delimiters grow according +to the number of nested \texttt{\textbackslash{}perfect}\texttt{\emph{command}}s +(regardless of the size of contents). The package is originally intended +for solving a notational issue regarding the representation of abstract-machine-like +calculi in proof theory and computer science. -If the package causes errors see the option \texttt{nomathstyle} below. +\paragraph{General use} + +The package also defines \texttt{\textbackslash{}perfectunary} and +\texttt{\textbackslash{}perfectbinary} for defining custom delimiters +that behave similarly to the above ones. These commands should be considered when +facing the need of nested delimiters that consistently grow regardless +of the contents. (See ``Advanced Use''.)\medskip{} + + +If the package causes incompatibility errors, refer to the option +\texttt{nomathstyle} below. -\section{Example} -\def\mt{\tilde{\mu}} +\section{Example} -\noindent \texttt{\footnotesize{The following states the commutativity -of a strong monad:}}~\\ -\texttt{\footnotesize{\textbackslash{}def\textbackslash{}mt\{\textbackslash{}tilde\{\textbackslash{}mu\}\}}}~\\ -\texttt{\footnotesize{\textbackslash{}{[}}}~\\ -\texttt{\footnotesize{\textbackslash{}cut t\{\textbackslash{}mt x.\textbackslash{}cut -u\{\textbackslash{}mt y.\textbackslash{}cut ve\}\}}}~\\ -\texttt{\footnotesize{=\textbackslash{}cut u\{\textbackslash{}mt y.\textbackslash{}cut -t\{\textbackslash{}mt x.\textbackslash{}cut ve\}\}}}~\\ -\texttt{\footnotesize{\textbackslash{}{]}}}~\\ -\texttt{\footnotesize{The following states the idempotency of an adjunction: }}~\\ -\texttt{\footnotesize{\textbackslash{}{[}}}~\\ -\texttt{\footnotesize{\textbackslash{}cut t\{\textbackslash{}mt x.\textbackslash{}cut\{\textbackslash{}mu\textbackslash{}alpha.\textbackslash{}cut -ue\}\{e'\}\}}}~\\ -\texttt{\footnotesize{=\textbackslash{}cut\{\textbackslash{}mu\textbackslash{}alpha.\textbackslash{}cut -t\{\textbackslash{}mt x.\textbackslash{}cut ue\}\}\{e'\}}}~\\ -\texttt{\footnotesize{\textbackslash{}{]}}}{\footnotesize \par} \subsection{Using \texttt{perfectcut.sty}} -\noindent \texttt{\footnotesize{\textbackslash{}usepackage\{perfectcut\}}}~\\ -\texttt{\footnotesize{\textbackslash{}let\textbackslash{}cut\textbackslash{}perfectcut}}{\footnotesize \par} +\global\long\def\cut#1#2{\cutprimitive{#1}{#2}} + + +\noindent \texttt{\footnotesize{}\textbackslash{}usepackage\{perfectcut\}}~\\ +\texttt{\footnotesize{}\textbackslash{}let\textbackslash{}cut\textbackslash{}perfectcut}{\footnotesize \par} \begin{center} -\framebox{\begin{minipage}[t]{0.8\columnwidth}% -\let\cut\perfectcut -The following states the commutativity of a strong monad: -\[ -\cut t{\mt x.\cut u{\mt y.\cut ve}}=\cut u{\mt y.\cut t{\mt x.\cut ve}} -\] +\fbox{\begin{minipage}[t]{0.8\columnwidth}% The following states the idempotency of an adjunction: \[ \cut t{\mt x.\cut{\mu\alpha.\cut ue}{e'}}=\cut{\mu\alpha.\cut t{\mt x.\cut ue}}{e'} \] -% + + +The following states the commutativity of a strong monad: +\[ +\cut t{\mt x.\cut u{\mt y.\cut ve}}=\cut u{\mt y.\cut t{\mt x.\cut ve}} +\] +Using \texttt{\textbackslash{}underline} to mark redexes: +\begin{align*} + & \delta(V,x.y,x.y)\\ + & =\mu{\star}.\cut V{\perfectcase{\mt x.\underline{\cut y{\star}}}{\mt x.\underline{\cut y{\star}}}}\\ + & =\mu{\star}.\cut V{\underline{\perfectcase{\mt x.\cut{\iota_{1}(x)}{\mt z.\cut y{\star}}}{\mt x.\cut{\iota_{2}(x)}{\mt z.\cut y{\star}}}}}\\ + & =\mu{\star}.\cut V{\underline{\mt z.}\cut y{\star}}\\ + & =\mu{\star}.\cut y{\star}=y +\end{align*} + % \end{minipage}} -\end{center} +\par\end{center} \subsection{Using \texttt{\textbackslash{}left}, \texttt{\textbackslash{}middle} and \texttt{\textbackslash{}right} instead} -\noindent \texttt{\footnotesize{\textbackslash{}renewcommand\{\textbackslash{}cut\}{[}2{]}\{\textbackslash{}left\textbackslash{}langle -\#1\textbackslash{}middle|\textbackslash{}mkern-2mu\textbackslash{}middle|\#2\textbackslash{}right\textbackslash{}rangle\}}}{\footnotesize \par} +\global\long\def\fakecut#1#2{\left\langle #1\middle|\mkern-2mu\middle|#2\right\rangle } + + +\noindent \texttt{\footnotesize{}\textbackslash{}renewcommand\{\textbackslash{}cut\}{[}2{]}\{\textbackslash{}left\textbackslash{}langle +\#1\textbackslash{}middle|\textbackslash{}mkern-2mu\textbackslash{}middle|\#2\textbackslash{}right\textbackslash{}rangle\}}{\footnotesize \par} \begin{center} -\framebox{\begin{minipage}[t]{0.8\columnwidth}% -\newcommand{\cut}[2]{\left\langle #1\middle|\mkern-2mu\middle|#2\right\rangle} -The following states the commutativity of a strong monad: +\fbox{\parbox[t]{0.8\columnwidth}{% +The following states the idempotency of an adjunction: \[ -\cut t{\mt x.\cut u{\mt y.\cut ve}}=\cut u{\mt y.\cut t{\mt x.\cut ve}} +\fakecut t{\mt x.\fakecut{\mu\alpha.\fakecut ue}{e'}}=\fakecut{\mu\alpha.\fakecut t{\mt x.\fakecut ue}}{e'} \] -The following states the idempotency of an adjunction: + + +The following states the commutativity of a strong monad: \[ -\cut t{\mt x.\cut{\mu\alpha.\cut ue}{e'}}=\cut{\mu\alpha.\cut t{\mt x.\cut ue}}{e'} +\fakecut t{\mt x.\fakecut u{\mt y.\fakecut ve}}=\fakecut u{\mt y.\fakecut t{\mt x.\fakecut ve}} \] + + +Using \texttt{\textbackslash{}underline} to mark redexes: +\begin{align*} + & \delta(V,x.y,x.y)\\ + & =\mu{\star}.\fakecut V{\left[\mt x.\underline{\fakecut y{\star}}\middle|\mt x.\underline{\fakecut y{\star}}\right]}\\ + & =\mu{\star}.\fakecut V{\underline{\left[\mt x.\fakecut{\iota_{1}(x)}{\mt z.\fakecut y{\star}}\middle|\mt x.\fakecut{\iota_{2}(x)}{\mt z.\fakecut y{\star}}\right]}}\\ + & =\mu{\star}.\fakecut V{\underline{\mt z.}\fakecut y{\star}}\\ + & =\mu{\star}.\fakecut y{\star}=y +\end{align*} % -\end{minipage}} -\end{center} +}} +\par\end{center} + +As we can see, the legibility of the above rendering is hampered by +multiple issues: the delimiters grow inconsistently, vertical bars +have the wrong size, accents or underlines uselessly make the delimiters +grow, and the spacing could be improved. The package is designed to +fix these issues. + + +\section{Advanced use} + +The package lets you define your own growing delimiters. Let us first +stress that the size of these delimiters is entirely determined by +the number of nestings and is insensitive to the size of the contents. +If you need the size of the contents to be taken into account then +it is probably sufficient to use \texttt{\textbackslash{}left} and +\texttt{\textbackslash{}right} while tweaking \texttt{\textbackslash{}delimitershortfall} +and \texttt{\textbackslash{}delimiterfactor}. + + +\subsection{Example} + +The following displays a set $\{\#1\mid\#2\}$ with delimiters appropriately +sized if there are other \texttt{\textbackslash{}perfectcommands} +inside \texttt{\#1} and \texttt{\#2}.\medskip{} + + +\texttt{\footnotesize{}\textbackslash{}def\textbackslash{}Set\#1\#2\{\textbackslash{}perfectbinary\{IncreaseHeight\}\textbackslash{}\{|\textbackslash{}\}\{\#1\textbackslash{}mathrel\{\}\}\{\textbackslash{}mathrel\{\}\#2\}\}}{\footnotesize \par} + +\texttt{\footnotesize{}\textbackslash{}{[}\textbackslash{}Set\{\textbackslash{}perfectparens\{a\}\}\{\textbackslash{}perfectparens\{b\}\}\textbackslash{}{]}}{\footnotesize \par} + +\def\Set#1#2{\perfectbinary{IncreaseHeight}\{|\}{#1\mathrel{}}{\mathrel{}#2}} + +\[ +\fbox{\ensuremath{\Set{\perfectparens{a}}{\perfectparens{b}}}} +\] + + + +\subsection{Custom delimiters} +\begin{description} +\item [{\texttt{\textbackslash{}perfectunary\#1\#2\#3\#4}}] Displays \texttt{\#2} +\texttt{\#4} \texttt{\#3} where \texttt{\#2} and \texttt{\#3} are +delimiters. The delimiters grow according to \texttt{\#1} which must +be one of \texttt{IncreaseHeight}, \texttt{CurrentHeight}, or \texttt{CurrentHeightPlusOne}. +\item [{\texttt{\textbackslash{}perfectbinary\#1\#2\#3\#4\#5\#6}}] Displays +\texttt{\#2} \texttt{\#5} \texttt{\#3} \texttt{\#6} \texttt{\#4} where +\texttt{\#2}, \texttt{\#3} and \texttt{\#4} are delimiters. The delimiters +grow according to \texttt{\#1} which must be one of \texttt{IncreaseHeight}, +\texttt{CurrentHeight}, or \texttt{CurrentHeightPlusOne}. +\end{description} + +\subsection{Stock delimiters} + +The stock commands behave as follow: + +\begin{center} +\begin{tabular}{>{\raggedright}p{11em}lll} +\toprule +Command & Produces & Growth & Inserts skips\tabularnewline +\midrule +\texttt{\textbackslash{}perfectcut\{\#1\}\{\#2\}} & $\perfectcut{\#1}{\#2}$ & \texttt{IncreaseHeight} & Yes\tabularnewline +\texttt{\textbackslash{}perfectbra\{\#1\}} & $\perfectbra{\#1}$ & \texttt{IncreaseHeight} & Yes\tabularnewline +\texttt{\textbackslash{}perfectket\{\#1\}} & $\perfectket{\#1}$ & \texttt{IncreaseHeight} & Yes\tabularnewline +\texttt{\textbackslash{}perfectcase\{\#1\}} & $\perfectcase{\#1}{\#2}$ & \texttt{CurrentHeightPlusOne} & Yes\tabularnewline +\texttt{\textbackslash{}perfectbrackets\{\#1\}} & $\perfectbrackets{\#1}$ & \texttt{CurrentHeightPlusOne} & Only inside\tabularnewline +\texttt{\textbackslash{}perfectparens\{\#1\}} & $\perfectparens{\#1}$ & \texttt{CurrentHeight} & Only inside\tabularnewline +\texttt{\textbackslash{}perfectunary\{\#1\}}~\\ +\texttt{~\{\#2\}\{\#3\}\{\#4\}} & $\#2\,\#4\,\#3$ & \#1 & No\tabularnewline +\texttt{\textbackslash{}perfectbinary\{\#1\}}~\\ +\texttt{~\{\#2\}\{\#3\}\{\#4\}\{\#5\}\{\#6\}} & $\#2\,\#5\,\#3\,\#6\,\#4$ & \#1 & No\tabularnewline +\bottomrule +\end{tabular} +\par\end{center} \section{Options} @@ -146,8 +247,8 @@ The following states the idempotency of an adjunction: \subsection{Option \texttt{nomathstyle}} The use of \texttt{\textbackslash{}currentmathstyle} from the package -\texttt{mathstyle }prevents the exponential blowup in recursions -that would occur if we used \texttt{\textbackslash{}mathpalette} instead. +\texttt{mathstyle} prevents the exponential blowup in recursions that +would occur if we used \texttt{\textbackslash{}mathpalette} instead. To record the \texttt{\textbackslash{}currentmath\-style}, \texttt{mathstyle} redefines many primitives and is therefore a source of incompatibilities. If you run into such issues, please refer to the \texttt{mathstyle} @@ -167,8 +268,16 @@ proper size unless \texttt{\textbackslash{}cutstyle }is redefined. With the option \texttt{realVert}, the double bars are obtained with the \texttt{\textbackslash{}Vert} command. Without it, two \texttt{\textbackslash{}vert} symbols are used and their spacing is controlled with \texttt{\textbackslash{}cutinterbarskip}. -In addition, without \texttt{realVert}, a penalty is added for better -line breaks. +But, if \texttt{realVert} is not activated, then a penalty (\texttt{binoppenalty}) +is added, such that $\cut{\mu\alpha.\cut ab}{\mt x.\cut cd}$ splits +across lines. + + +\subsection{Option \texttt{fixxits}} + +For some reason that the author was unable to identify, the vertical +alignment is wrong with the Opentype XITS math font with XeTeX. The +option \texttt{fixxits} fixes this behaviour. \subsection{Customisation} @@ -178,29 +287,28 @@ The following mu-skips can be redefined in your preamble: \begin{center} \begin{tabular}{ll} \toprule -Command & Defines\tabularnewline +Command & Defines the spacing...\tabularnewline \midrule -\texttt{\textbackslash{}cutbarskip=5.0mu plus 8mu minus 2.0mu} & spacing around bars\tabularnewline -\texttt{\textbackslash{}cutangleskip=0.0mu plus 8mu minus 1.0mu} & spacing around angles (inside)\tabularnewline -\texttt{\textbackslash{}cutangleouterskip=0.0mu plus 8mu minus 0mu} & spacing around angles (outside)\tabularnewline -\texttt{\textbackslash{}cutinterbarskip=0.8mu plus 0mu minus 0mu} & spacing between bars\tabularnewline +\texttt{\textbackslash{}cutbarskip=5.0mu plus 8mu minus 2.0mu} & around bars\tabularnewline +\texttt{\textbackslash{}cutangleskip=0.0mu plus 8mu minus 1.0mu} & around delimiters (inside)\tabularnewline +\texttt{\textbackslash{}cutangleouterskip=0.0mu plus 8mu minus 0mu} & around delimiters (outside)\tabularnewline +\texttt{\textbackslash{}cutinterbarskip=0.8mu plus 0mu minus 0mu} & between bars (excl. \texttt{realVert})\tabularnewline \bottomrule \end{tabular} -\end{center} +\par\end{center} -\noindent (1 mu equals $\tfrac{1}{18}$-th of an em in the current -math font.) +\noindent (1 mu equals $1/18$ of an em in the current math font.) \section{Reimplementation of fixed-size delimiters} In addition, I provide the following corrections and generalisations of \texttt{\textbackslash{}big},\texttt{\textbackslash{}bigg}, etc. -Why not using the latter? Because both the plain \TeX{} -and the \texttt{amsmath} versions are incorrect when changing math -font, font size, math style or \texttt{\textbackslash{}delimitershortfall}. -Moreover, Opentype math fonts in particular offer more sizes. We -want a robust solution. +Why not using the latter? Because both the plain \TeX{} and the \texttt{amsmath} +versions can be incorrect when changing the math font, the font size, +the math style or \texttt{\textbackslash{}delimitershortfall}. Moreover, +Opentype math fonts sometimes offer more than five sizes. For this +package we need a robust solution. \begin{center} \begin{tabular}{lll} @@ -211,39 +319,44 @@ Command & Example & \tabularnewline \texttt{\textbackslash{}nthleft\{\#1\}\{\#2\} } & \texttt{\textbackslash{}nthleft\{2\}(} & $\nthleft{2}($\tabularnewline\addlinespace[0.1em] \texttt{\textbackslash{}nthmiddle\{\#1\}\{\#2\}} & \texttt{\textbackslash{}nthmiddle\{2\}\textbackslash{}Vert} & $\nthmiddle{2}\Vert$\tabularnewline\addlinespace[0.1em] \texttt{\textbackslash{}nthright\{\#1\}\{\#2\}} & \texttt{\textbackslash{}nthright\{2\})} & $\nthright{2})$\tabularnewline\addlinespace[0.1em] -\multicolumn{1}{l}{\emph{delimiter \#2 of length at least \#1}} & & \tabularnewline\addlinespace[0.1em] +\multicolumn{1}{l}{\emph{delimiter \#2 of height at least \#1}} & & \tabularnewline\addlinespace[0.1em] \texttt{\textbackslash{}lenleft\{\#1\}\{\#2\}} & \texttt{\textbackslash{}lenleft\{3.2mm\}{[}} & $\lenleft{3mm}[$\tabularnewline\addlinespace[0.1em] \texttt{\textbackslash{}lenmiddle\{\#1\}\{\#2\}} & \texttt{\textbackslash{}lenmiddle\{3.2mm\}|} & $\lenmiddle{3mm}|$\tabularnewline\addlinespace[0.1em] \texttt{\textbackslash{}lenright\{\#1\}\{\#2\}} & \texttt{\textbackslash{}lenright\{3.2mm\}{]}} & $\lenright{3mm}]$\tabularnewline\addlinespace[0.1em] -\multicolumn{3}{l}{\emph{delimiter \#2 of length exactly \#1 obtained by scaling the +\multicolumn{3}{l}{\emph{delimiter \#2 of height exactly \#1 obtained by scaling the above one}}\tabularnewline\addlinespace[0.1em] \texttt{\textbackslash{}reallenleft\{\#1\}\{\#2\}} & \texttt{\textbackslash{}reallenleft\{3.2mm\}{[}} & $\reallenleft{3mm}[$\tabularnewline\addlinespace[0.1em] \texttt{\textbackslash{}reallenmiddle\{\#1\}\{\#2\}} & \texttt{\textbackslash{}reallenmiddle\{3.2mm\}|} & $\reallenmiddle{3mm}|$\tabularnewline\addlinespace[0.1em] \texttt{\textbackslash{}reallenright\{\#1\}\{\#2\}} & \texttt{\textbackslash{}reallenright\{3.2mm\}{]}} & $\reallenright{3mm}]$\tabularnewline \bottomrule \end{tabular} -\end{center} +\par\end{center} -\subsection{Exemple with \texttt{\textbackslash{}nthleft}} +\subsection{Example with \texttt{\textbackslash{}nthleft}} -\texttt{\footnotesize{\textbackslash{}nthleft0(\textbackslash{}nthleft1(\textbackslash{}nthleft2(\textbackslash{}nthleft3(\textbackslash{}nthleft4(\textbackslash{}nthleft5(}}{\footnotesize \par} +\texttt{\footnotesize{}\textbackslash{}nrthleft0{[}\textbackslash{}nthleft1{[}\textbackslash{}nthleft2{[}\textbackslash{}nthleft3{[}\textbackslash{}nthleft4{[}\textbackslash{}nthleft5{[}\textbackslash{}nthleft6{[}}{\footnotesize \par} \[ -\nthleft0(\nthleft1(\nthleft2(\nthleft3(\nthleft4(\nthleft5( +\nthleft0(\nthleft1(\nthleft2(\nthleft3(\nthleft4(\nthleft5(\nthleft6( \] \subsection{Example with \texttt{\textbackslash{}big},\texttt{\textbackslash{}Big},\texttt{\textbackslash{}bigg},\texttt{\textbackslash{}Bigg}} -\texttt{\footnotesize{(\textbackslash{}big(\textbackslash{}Big(\textbackslash{}bigg(\textbackslash{}Bigg(}}{\footnotesize \par} +\texttt{\footnotesize{}{[}\textbackslash{}big{[}\textbackslash{}Big{[}\textbackslash{}bigg{[}\textbackslash{}Bigg{[}}{\footnotesize \par} \[ (\big(\Big(\bigg(\Bigg( \] -Note: \texttt{\textbackslash{}big}\texttt{\footnotesize{ }}starts -at at size 2 in some fonts. +The above uses the \texttt{\textbackslash{}big} commands from the +\texttt{amsmath} package. The \texttt{amsmath} package corrects issues +with the original \TeX{} commands, but I could still notice inconsistencies, +such as \texttt{\textbackslash{}big} starting at size 2, under some +font combinations. \texttt{\textbackslash{}nthleft}, \texttt{\textbackslash{}nthright} +and \texttt{\textbackslash{}nthmiddle} are implemented in a more robust +way. \section{License} |