summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2014-02-03 23:46:24 +0000
committerKarl Berry <karl@freefriends.org>2014-02-03 23:46:24 +0000
commit91933032894054038bc811d9f2445da230661faa (patch)
treebd5219dc5c6f50211d03757206e8feab37655ada
parent5b1c9fe4a8686f1d474467ad220e0714515d2a73 (diff)
perfectcut (3feb14)
git-svn-id: svn://tug.org/texlive/trunk@32861 c570f23f-e606-0410-a88d-b1316a301751
-rw-r--r--Master/texmf-dist/doc/latex/perfectcut/README47
-rw-r--r--Master/texmf-dist/doc/latex/perfectcut/perfectcut.pdfbin0 -> 97135 bytes
-rw-r--r--Master/texmf-dist/doc/latex/perfectcut/perfectcut.tex255
-rw-r--r--Master/texmf-dist/tex/latex/perfectcut/perfectcut.sty404
-rwxr-xr-xMaster/tlpkg/bin/tlpkg-ctan-check2
-rw-r--r--Master/tlpkg/tlpsrc/collection-latexextra.tlpsrc1
-rw-r--r--Master/tlpkg/tlpsrc/perfectcut.tlpsrc0
7 files changed, 708 insertions, 1 deletions
diff --git a/Master/texmf-dist/doc/latex/perfectcut/README b/Master/texmf-dist/doc/latex/perfectcut/README
new file mode 100644
index 00000000000..26e1f502afd
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/perfectcut/README
@@ -0,0 +1,47 @@
+perfectcut.sty
+
+This package defines the command \perfectcut#1#2 which displays a
+bracket <#1||#2>. Its effect is to determine the size of the bracket
+depending on the number of nested \perfectcut (regardless of the
+contents). It is intended for use:
+- In proof theory, for term notations of sequent calculus,
+- In computer science, for the modeling of abstract machines.
+
+This package also offers a reimplementation of \big, \bigg, etc. into
+arbitrary-size variants.
+
+
+Release notes:
+
+ 1.9 02/14: added \perfectcut,\perfectbra,\perfectket; fixed bug with graphicx
+ not being included; publication on CTAN
+ 1.8 01/14: added documentation (no new feature)
+ 1.7 11/13: added \cutangleouterskip
+ 1.6 10/13: new commands \cutbraprimitive and \cutketprimitive
+ 1.5 09/13: possible to disable mathstyle (option nomathstyle, see
+ the warning below)
+ 1.4 08/13: possible to choose between \vert\vert and \Vert (option realVert)
+ (\cutinterbarskip is used only with the former)
+ 1.3 08/13: fixes the alignment of angles with the math axis
+ 1.2 06/13: first public release
+
+
+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.
+The latest version of this license is in:
+ http://www.latex-project.org/lppl.txt
+and version 1.3 or later is part of all distributions of LaTeX version
+2005/12/01 or later.
+
+The work consists in the files "perfectcut.sty", "perfectcut.tex" and
+the derived files.
+
+This work has the LPPL maintenance status `maintained'.
+The Current Maintainer of this work is Guillaume Munch-Maccagnoni.
+
+
diff --git a/Master/texmf-dist/doc/latex/perfectcut/perfectcut.pdf b/Master/texmf-dist/doc/latex/perfectcut/perfectcut.pdf
new file mode 100644
index 00000000000..ce9750140b9
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/perfectcut/perfectcut.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/latex/perfectcut/perfectcut.tex b/Master/texmf-dist/doc/latex/perfectcut/perfectcut.tex
new file mode 100644
index 00000000000..7744bd007ed
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/perfectcut/perfectcut.tex
@@ -0,0 +1,255 @@
+%%% perfectcut.sty documentation
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%
+%%% 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.
+%%%
+\documentclass[12pt,a4paper,british]{scrartcl}
+\usepackage[T1]{fontenc}
+\usepackage[latin9]{inputenc}
+\setcounter{secnumdepth}{1}
+\usepackage{babel}
+\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}
+\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}
+
+\title{\texttt{perfectcut.sty} documentation}
+\author{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}
+\maketitle
+
+\section{Use}
+
+This package supplies the following commands:
+
+\begin{center}
+\begin{tabular}{ll}
+\toprule
+Command & Produces\tabularnewline
+\midrule
+\texttt{\textbackslash{}perfectcut\{\#1\}\{\#2\}} & $\perfectcut{\#1}{\#2}$\tabularnewline
+\texttt{\textbackslash{}perfectbra\{\#1\}} & $\perfectbra{\#1}$\tabularnewline
+\texttt{\textbackslash{}perfectket\{\#1\}} & $\perfectket{\#1}$\tabularnewline
+\bottomrule
+\end{tabular}
+\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.)
+
+If the package causes errors see the option \texttt{nomathstyle} below.
+
+
+\section{Example}
+
+\def\mt{\tilde{\mu}}
+
+
+\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}
+
+\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}}
+\]
+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'}
+\]
+%
+\end{minipage}}
+\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}
+
+\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:
+\[
+\cut t{\mt x.\cut u{\mt y.\cut ve}}=\cut u{\mt y.\cut t{\mt x.\cut ve}}
+\]
+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'}
+\]
+%
+\end{minipage}}
+\end{center}
+
+
+\section{Options}
+
+
+\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.
+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}
+manual.
+
+If you want to disable the loading of \texttt{mathstyle}, use the
+\texttt{nomathstyle} option. With the \texttt{nomathstyle} option,
+the style is set to \texttt{\textbackslash{}cutstyle}, which you must
+ define by hand to be \texttt{\textbackslash{}displaystyle}, \texttt{\textbackslash{}textstyle
+}(default), \texttt{\textbackslash{}scriptstyle}, \texttt{\textbackslash{}scriptscriptstyle}.
+This means that cuts in subscripts and superscripts do not have the
+proper size unless \texttt{\textbackslash{}cutstyle }is redefined.
+
+
+\subsection{Option \texttt{realVert}}
+
+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.
+
+
+\subsection{Customisation}
+
+The following mu-skips can be redefined in your preamble:
+
+\begin{center}
+\begin{tabular}{ll}
+\toprule
+Command & Defines\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
+\bottomrule
+\end{tabular}
+\end{center}
+
+\noindent (1 mu equals $\tfrac{1}{18}$-th 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.
+
+\begin{center}
+\begin{tabular}{lll}
+\toprule
+Command & Example & \tabularnewline
+\midrule
+\multicolumn{3}{l}{\emph{\#1-th size of delimiter \#2}}\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]
+\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
+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}
+
+
+\subsection{Exemple with \texttt{\textbackslash{}nthleft}}
+
+\texttt{\footnotesize{\textbackslash{}nthleft0(\textbackslash{}nthleft1(\textbackslash{}nthleft2(\textbackslash{}nthleft3(\textbackslash{}nthleft4(\textbackslash{}nthleft5(}}{\footnotesize \par}
+
+\[
+\nthleft0(\nthleft1(\nthleft2(\nthleft3(\nthleft4(\nthleft5(
+\]
+
+
+
+\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}
+
+\[
+(\big(\Big(\bigg(\Bigg(
+\]
+Note: \texttt{\textbackslash{}big}\texttt{\footnotesize{ }}starts
+at at size 2 in some fonts.
+
+
+\section{License}
+
+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 \texttt{README}
+file.
+\end{document}
diff --git a/Master/texmf-dist/tex/latex/perfectcut/perfectcut.sty b/Master/texmf-dist/tex/latex/perfectcut/perfectcut.sty
new file mode 100644
index 00000000000..036750b09fd
--- /dev/null
+++ b/Master/texmf-dist/tex/latex/perfectcut/perfectcut.sty
@@ -0,0 +1,404 @@
+%%% perfectcut.sty
+%%%%%%%%%%%%%%%%%%%
+%%%
+%%% 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.
+%%%
+%%%
+\ProvidesPackage{perfectcut}[02/02/2014 Perfect Cut v1.9]
+%%% Option processing
+\newif\ifcut@mathstyle@
+\cut@mathstyle@true
+\newif\ifcut@realVert@
+\cut@realVert@false
+\DeclareOption{nomathstyle}{\cut@mathstyle@false}
+\let\cutstyle\textstyle
+\DeclareOption{realVert}{\cut@realVert@true}
+\ProcessOptions*
+%%% End option processing
+\RequirePackage{amsmath}
+\RequirePackage{graphicx}
+\RequirePackage{calc}
+\newmuskip\cutangleskip
+\newmuskip\cutbarskip
+\newmuskip\cutinterbarskip
+\newmuskip\cutangleouterskip
+\newif\ifcutdebug
+%%%
+\newcommand{\cutprimitive}[2]{\cut@{#1}{#2}}
+\newcommand{\cutbraprimitive}[1]{\cut@bra{#1}}
+\newcommand{\cutketprimitive}[1]{\cut@ket{#1}}
+\let\perfectcut\cutprimitive
+\let\perfectbra\cutbraprimitive
+\let\perfectket\cutketprimitive
+%%% The following variables can be redefined in your preamble
+\cutbarskip=5.0mu plus 8.0mu minus 2.0mu
+\cutangleskip=0.0mu plus 8mu minus 1.0mu
+\cutangleouterskip=0.0mu plus 8mu minus 0.0mu
+\cutinterbarskip=0.8mu plus 0mu minus 0mu
+\cutdebugfalse%print the size after each \rangle?
+%%%
+%%%\nthleft{4}\langle ==> fourth size of \langle; begins at 0
+\newcommand{\nthleft}[2]{\cut@nthldelim{#1}{#2}}
+%%%same for right and middle
+\newcommand{\nthright}[2]{\cut@nthrdelim{#1}{#2}}
+\newcommand{\nthmiddle}[2]{\cut@nthmdelim{#1}{#2}}
+%%%\lenleft{3mm}\langle ===> \langle of size at least 3mm
+%%%in math mode it is preferable to use math units such as 10mu,...
+%%%however only regular units are implemented now.
+\newcommand{\lenleft}[2]{\cut@lengthldelim{#1}#2}
+%%%same for right and middle
+\newcommand{\lenright}[2]{\cut@lengthrdelim{#1}#2}
+\newcommand{\lenmiddle}[2]{\cut@lengthmdelim{#1}#2}
+%%%\reallenleft{3mm}\langle ===> \langle of size 3mm by resizing the
+%%%closest glyph
+\newcommand{\reallenleft}[2]{\cut@reallengthldelim{#1}{#2}}
+%%%same for right and middle
+\newcommand{\reallenright}[2]{\cut@reallengthrdelim{#1}{#2}}
+\newcommand{\reallenmiddle}[2]{\cut@reallengthmdelim{#1}{#2}}
+
+% setting up mathstyle
+\ifcut@mathstyle@
+ \RequirePackage{mathstyle}
+ \def\currentcutstyle{\currentmathstyle}
+\else
+ \def\currentcutstyle{\cutstyle}
+\fi
+
+%setting up realVert
+\ifcut@realVert@
+ \def\cut@bar{\cut@Vert}
+\else
+ \def\cut@bar{\cut@vert}
+\fi
+
+\newcommand{\cut@setshortfall}[1]{%
+ \skip0=\delimitershortfall%
+ \global\delimitershortfall=-0.1pt%that's the trick to get perfect growth
+ \count0=\delimiterfactor%
+ \global\delimiterfactor=901\relax%
+ \hbox{$\m@th\currentcutstyle#1$}%
+ \global\delimitershortfall=\skip0%
+ \global\delimiterfactor=\count0%
+}
+
+\newcommand{\cut@nextrdelim}[2]{%
+ \left.\hspace{-\nulldelimiterspace}\vphantom{#2}\right#1%
+}
+\newcommand{\cut@nextldelim}[2]{%
+ \left#1\vphantom{#2}\hspace{-\nulldelimiterspace}\right.%
+}
+\newcommand{\cut@nextmdelim}[2]{%
+ \left.\hspace{-\nulldelimiterspace}\middle#1\vphantom{#2}\hspace{-\nulldelimiterspace}\right.%
+}
+
+\newcommand{\cut@lengthldelim}[2]{\cut@setshortfall{\cut@nextldelim#2{\rule[-0.101pt]{0pt}{#1}}}}
+\newcommand{\cut@lengthrdelim}[2]{\cut@setshortfall{\cut@nextrdelim#2{\rule[-0.101pt]{0pt}{#1}}}}
+\newcommand{\cut@lengthmdelim}[2]{\cut@setshortfall{\cut@nextmdelim#2{\rule[-0.101pt]{0pt}{#1}}}}
+\newcommand{\cut@reallengthldelim}[2]{\cut@resizetoheight{#1}{\cut@lengthldelim{#1}{#2}}}
+\newcommand{\cut@reallengthrdelim}[2]{\cut@resizetoheight{#1}{\cut@lengthrdelim{#1}{#2}}}
+\newcommand{\cut@reallengthmdelim}[2]{\cut@resizetoheight{#1}{\cut@lengthmdelim{#1}{#2}}}
+
+%\newcommand{\cut@nextrangle}[1]{%
+% \left.\hspace{-\nulldelimiterspace}\vphantom{#1}\right\rangle%
+%}
+\newcommand{\cut@nextrangle}[1]{\cut@nextrdelim{\rangle}{#1}}
+
+%\newcommand{\cut@nextlangle}[1]{%
+% \left\langle\vphantom{#1}\hspace{-\nulldelimiterspace}\right.%
+%}
+\newcommand{\cut@nextlangle}[1]{\cut@nextldelim{\langle}{#1}}
+
+\newcommand{\cut@iter}[2]{%
+ \ifcase#1%
+ #2{\cdot} % 0 = smallest. This dot is here to prevent a
+ % bug regarding vertical positioning.
+ \else%
+ \count0=#1%
+ \advance\count0 -1\relax%
+ \expandafter#2{\expandafter\cut@iter{\the\count0}#2}%
+ \fi%
+}
+
+\newcommand{\cut@primitive}[2]{%
+ %resetting shortfall
+ \cut@setshortfall{\cut@iter#2#1}%
+}
+
+%%%\cut@nthdelim{n}{delim}{f}
+\newcommand{\cut@nthdelim}[3]{
+ \def\cut@tempnextdelim{#3{#2}}%
+ \cut@primitive\cut@tempnextdelim{#1}%
+}
+\newcommand{\cut@nthldelim}[2]{\cut@nthdelim{#1}{#2}{\cut@nextldelim}}
+\newcommand{\cut@nthrdelim}[2]{\cut@nthdelim{#1}{#2}{\cut@nextrdelim}}
+\newcommand{\cut@nthmdelim}[2]{\cut@nthdelim{#1}{#2}{\cut@nextmdelim}}
+
+\newcommand{\cut@langleprimitive}[1]{\cut@primitive\cut@nextlangle{#1}}
+\newcommand{\cut@rangleprimitive}[1]{\cut@primitive\cut@nextrangle{#1}}
+%\newcommand{\cut@langleprimitive}[1]{\cut@nthldelim{#1}{\langle}}
+%\newcommand{\cut@rangleprimitive}[1]{\cut@nthrdelim{#1}{\rangle}}
+
+\newcommand{\cut@vertprimitiveunscaled}[1]{\cut@nthmdelim{#1}\vert}%\hbox{$\m@th\mathord{|}$}
+
+\newcommand{\cut@Vertprimitiveunscaled}[1]{\cut@nthmdelim{#1}\Vert}
+
+\newsavebox\cut@boxi
+\newsavebox\cut@boxj
+
+\newcommand{\cut@resizetoheight}[2]{%
+ \resizebox{!}{#1}{\hbox{$\m@th\currentcutstyle#2$}}%
+}
+
+\newcommand{\cut@resizetoheightof}[2]{%
+ \sbox{\cut@boxi}{$\m@th\currentcutstyle#1$}%
+ \sbox{\cut@boxj}{$\m@th\currentcutstyle#2$}%
+ \raisebox{-\dp\cut@boxi}{%
+ \resizebox{\width}{\ht\cut@boxi+\dp\cut@boxi}{%
+ \raisebox{\dp\cut@boxj}{\usebox{\cut@boxj}}%
+ }%
+ }
+}
+
+\newcommand{\cut@vertprimitive}[1]{%
+\setbox0=\hbox{%
+ $\m@th\currentcutstyle%
+ \cut@resizetoheightof{\cut@langleprimitive{#1}}{\cut@vertprimitiveunscaled{#1}}%
+ $}%
+\dimen0=\wd0
+\def\cut@unspace{%removing the margins around the bar
+ \kern -.5\dimen0%
+ \mkern.75mu%
+}%
+\cut@unspace%
+\copy0%
+\cut@unspace%
+\mspace{\cutinterbarskip}%
+\penalty \the\binoppenalty\relax%
+\cut@unspace%
+\box0%
+\cut@unspace%
+}
+
+\newcommand{\cut@halfvertprimitive}[1]{%
+\cut@resizetoheightof{\cut@langleprimitive{#1}}{\cut@vertprimitiveunscaled{#1}}%
+}
+
+\newcommand{\cut@Vertprimitive}[1]{%
+\mkern-3.26mu%
+\cut@resizetoheightof{\cut@langleprimitive{#1}}{\cut@Vertprimitiveunscaled{#1}}%
+\mkern-3.26mu%
+}
+
+
+\newcommand{\cut@langle}[1]{%
+ \edef\cut@n{\expandafter\the#1}%
+ %yes, i'm turning the integer into tokens to do call-by-value
+ \cut@langleprimitive{\cut@n}%
+}
+
+\newcommand{\cut@rangle}[1]{%
+ \edef\cut@n{\expandafter\the#1}%
+ \cut@rangleprimitive{\cut@n}%
+ \ifcutdebug^\cut@n\else\fi%
+}
+
+\newcommand{\cut@vert}[1]{%
+ \edef\cut@n{\expandafter\the#1}%
+ \cut@vertprimitive{\cut@n}%
+}
+
+\newcommand{\cut@halfvert}[1]{%
+ \edef\cut@n{\expandafter\the#1}%
+ \cut@halfvertprimitive{\cut@n}%
+}
+
+\newcommand{\cut@Vert}[1]{%
+ \edef\cut@n{\expandafter\the#1}%
+ \cut@Vertprimitive{\cut@n}%
+}
+
+\newcommand{\cut@angles}[1]{\cut@langle{#1}\cut@vert{#1}\cut@rangle{#1}}
+
+%%% now the main algorithm
+
+\newcounter{cut@depth}
+
+\newcommand{\cut@testangles}{%
+ \setcounter{cut@depth}{0}%
+ \def\cut@d{%
+ \cut@angles{\value{cut@depth}}%
+ \stepcounter{cut@depth}%
+ }
+ \cut@d\cut@d\cut@d\cut@d\cut@d\cut@d\cut@d
+}
+
+\newcommand{\cut@testssstyle}{\scriptscriptstyle{\cut@testangles}}
+\newcommand{\cut@testsstyle}{\scriptstyle{\cut@testangles}}
+\newcommand{\cut@testnormal}{\textstyle{\cut@testangles}}
+
+\newcommand{\cut@testsize}[1]{
+{#1 \[ \mathrm{\f@size\,pt:} \begin{array}{l}
+ \cut@testnormal{}\\
+ \cut@testsstyle{}\\
+ \cut@testssstyle{}
+ \end{array}\]}
+}
+
+\newcommand{\cut@test}{
+\cut@testsize{\Large}
+\cut@testsize{\large}
+\cut@testsize{}
+\cut@testsize{\small}
+\cut@testsize{\footnotesize}
+\cut@testsize{\scriptsize}
+\cut@testsize{\tiny}
+}
+
+% lengths with names of the form \cut@height{depth}
+\newcommand{\cut@localheight}{cut@height\thecut@depth}
+\newcommand{\cut@newlocalheightcounter}{%
+ \@ifundefined{c@\cut@localheight}{\newcounter{\cut@localheight}}{}
+}
+
+% boxes with names of the form \cut@savebox{num}@{depth}
+\newcommand{\cut@localsavebox}[1]{cut@savebox#1@\thecut@depth}
+\newcommand{\cut@newlocalsavebox}[1]{%
+ \@ifundefined{\cut@localsavebox{#1}}{%
+ \expandafter\newsavebox\csname\cut@localsavebox{#1}\endcsname%
+ }{}%
+}
+
+\newcounter{cut@finalheight}
+
+\newsavebox\cut@boxleft
+\newsavebox\cut@boxright
+
+\newcommand{\cut@}[2]{%
+ \setcounter{cut@finalheight}{0}%
+ {%
+ \addtocounter{cut@depth}{1}%
+ %defining variables
+ \cut@newlocalheightcounter%
+ \cut@newlocalsavebox{0}%
+ \cut@newlocalsavebox{1}%
+ %computing recursively
+ \setcounter{\cut@localheight}{-1}%
+ \expandafter\sbox\csname\cut@localsavebox{0}\endcsname%
+ {$\m@th\currentcutstyle#1$}%
+ \expandafter\sbox\csname\cut@localsavebox{1}\endcsname%
+ {$\m@th\currentcutstyle#2$}%
+ \addtocounter{\cut@localheight}{1}%
+ %exporting values outside the local scope
+ \setcounter{cut@finalheight}{\value{\cut@localheight}}%
+ \global\sbox\cut@boxleft%
+ {\expandafter\usebox\csname\cut@localsavebox{0}\endcsname}%
+ \global\sbox\cut@boxright%
+ {\expandafter\usebox\csname\cut@localsavebox{1}\endcsname}%
+ \addtocounter{cut@depth}{-1}%
+ }%
+ \@ifundefined{c@\cut@localheight}{}{%
+ \ifnum\value{cut@finalheight}>\value{\cut@localheight}%
+ \setcounter{\cut@localheight}{\value{cut@finalheight}}%
+ \fi%
+ }%end @ifundefined
+ \mspace{\cutangleouterskip}%
+ {\cut@langle{\value{cut@finalheight}}}%
+ \mspace{\cutangleskip}%
+ \usebox{\cut@boxleft}%
+ \mspace{\cutbarskip}%
+ {\cut@bar{\value{cut@finalheight}}}%
+ \mspace{\cutbarskip}%
+ \usebox{\cut@boxright}%
+ \mspace{\cutangleskip}%
+ {\cut@rangle{\value{cut@finalheight}}}%
+ \mspace{\cutangleouterskip}%
+}
+
+\newcommand{\cut@bra}[1]{%
+ \setcounter{cut@finalheight}{0}%
+ {%
+ \addtocounter{cut@depth}{1}%
+ %defining variables
+ \cut@newlocalheightcounter%
+ \cut@newlocalsavebox{0}%
+ %\cut@newlocalsavebox{1}%
+ %computing recursively
+ \setcounter{\cut@localheight}{-1}%
+ \expandafter\sbox\csname\cut@localsavebox{0}\endcsname%
+ {$\m@th\currentcutstyle#1$}%
+ %\expandafter\sbox\csname\cut@localsavebox{1}\endcsname%
+ % {$\m@th\currentcutstyle#2$}%
+ \addtocounter{\cut@localheight}{1}%
+ %exporting values outside the local scope
+ \setcounter{cut@finalheight}{\value{\cut@localheight}}%
+ \global\sbox\cut@boxleft%
+ {\expandafter\usebox\csname\cut@localsavebox{0}\endcsname}%
+ %\global\sbox\cut@boxright%
+ % {\expandafter\usebox\csname\cut@localsavebox{1}\endcsname}%
+ \addtocounter{cut@depth}{-1}%
+ }%
+ \@ifundefined{c@\cut@localheight}{}{%
+ \ifnum\value{cut@finalheight}>\value{\cut@localheight}%
+ \setcounter{\cut@localheight}{\value{cut@finalheight}}%
+ \fi%
+ }%end @ifundefined
+ \mspace{\cutangleouterskip}%
+ {\cut@langle{\value{cut@finalheight}}}%
+ \mspace{\cutangleskip}%
+ \usebox{\cut@boxleft}%
+ \mspace{\cutbarskip}%
+ \mkern-3.26mu%
+ {\cut@halfvert{\value{cut@finalheight}}}%
+ \mspace{\cutangleouterskip}%
+ %\mspace{\cutbarskip}%
+ %\usebox{\cut@boxright}%
+ %\mspace{\cutangleskip}%
+ %\cut@rangle{\value{cut@finalheight}}%
+}
+
+\newcommand{\cut@ket}[1]{%
+ \setcounter{cut@finalheight}{0}%
+ {%
+ \addtocounter{cut@depth}{1}%
+ %defining variables
+ \cut@newlocalheightcounter%
+ \cut@newlocalsavebox{0}%
+ %\cut@newlocalsavebox{1}%
+ %computing recursively
+ \setcounter{\cut@localheight}{-1}%
+ \expandafter\sbox\csname\cut@localsavebox{0}\endcsname%
+ {$\m@th\currentcutstyle#1$}%
+ %\expandafter\sbox\csname\cut@localsavebox{1}\endcsname%
+ % {$\m@th\currentcutstyle#2$}%
+ \addtocounter{\cut@localheight}{1}%
+ %exporting values outside the local scope
+ \setcounter{cut@finalheight}{\value{\cut@localheight}}%
+ \global\sbox\cut@boxleft%
+ {\expandafter\usebox\csname\cut@localsavebox{0}\endcsname}%
+ %\global\sbox\cut@boxright%
+ % {\expandafter\usebox\csname\cut@localsavebox{1}\endcsname}%
+ \addtocounter{cut@depth}{-1}%
+ }%
+ \@ifundefined{c@\cut@localheight}{}{%
+ \ifnum\value{cut@finalheight}>\value{\cut@localheight}%
+ \setcounter{\cut@localheight}{\value{cut@finalheight}}%
+ \fi%
+ }%end @ifundefined
+ %\cut@langle{\value{cut@finalheight}}%
+ %\mspace{\cutangleskip}%
+ %\usebox{\cut@boxleft}%
+ %\mspace{\cutbarskip}%
+ \mspace{\cutangleouterskip}%
+ {\cut@halfvert{\value{cut@finalheight}}}%
+ \mkern-3.26mu%
+ \mspace{\cutbarskip}%
+ \usebox{\cut@boxleft}%right}%
+ \mspace{\cutangleskip}%
+ {\cut@rangle{\value{cut@finalheight}}}%
+ \mspace{\cutangleouterskip}%
+}
diff --git a/Master/tlpkg/bin/tlpkg-ctan-check b/Master/tlpkg/bin/tlpkg-ctan-check
index a87bd68d47d..18fd0206e47 100755
--- a/Master/tlpkg/bin/tlpkg-ctan-check
+++ b/Master/tlpkg/bin/tlpkg-ctan-check
@@ -354,7 +354,7 @@ my @TLP_working = qw(
pdf14
pdf-trans pdfcomment pdfcprot pdfcrop pdfjam pdfmarginpar
pdfpages pdfscreen pdfslide pdfsync pdftex-def pdftricks pdftricks2 pdfx
- pecha pedigree-perl perception perltex
+ pecha pedigree-perl perception perfectcut perltex
permute persian-bib persian-modern
petiteannonce petri-nets pfarrei
pgf pgf-blur pgf-soroban pgf-umlsd pgfgantt pgfkeyx pgfmolbio
diff --git a/Master/tlpkg/tlpsrc/collection-latexextra.tlpsrc b/Master/tlpkg/tlpsrc/collection-latexextra.tlpsrc
index c106ea81c17..35c013c44d9 100644
--- a/Master/tlpkg/tlpsrc/collection-latexextra.tlpsrc
+++ b/Master/tlpkg/tlpsrc/collection-latexextra.tlpsrc
@@ -625,6 +625,7 @@ depend pdfsync
depend pdfwin
depend pdfx
depend pecha
+depend perfectcut
depend perltex
depend permute
depend petiteannonce
diff --git a/Master/tlpkg/tlpsrc/perfectcut.tlpsrc b/Master/tlpkg/tlpsrc/perfectcut.tlpsrc
new file mode 100644
index 00000000000..e69de29bb2d
--- /dev/null
+++ b/Master/tlpkg/tlpsrc/perfectcut.tlpsrc