texlive[72665] Master/texmf-dist: prooftrees (26oct24)
commits+karl at tug.org
commits+karl at tug.org
Sat Oct 26 22:16:19 CEST 2024
Revision: 72665
https://tug.org/svn/texlive?view=revision&revision=72665
Author: karl
Date: 2024-10-26 22:16:18 +0200 (Sat, 26 Oct 2024)
Log Message:
-----------
prooftrees (26oct24)
Modified Paths:
--------------
trunk/Master/texmf-dist/doc/latex/prooftrees/manifest.txt
trunk/Master/texmf-dist/doc/latex/prooftrees/prooftrees.pdf
trunk/Master/texmf-dist/doc/latex/prooftrees/prooftrees.tex
trunk/Master/texmf-dist/doc/latex/prooftrees/prooftrees_biber.bib
trunk/Master/texmf-dist/tex/latex/prooftrees/prooftrees.sty
Added Paths:
-----------
trunk/Master/texmf-dist/doc/latex/prooftrees/README.md
Removed Paths:
-------------
trunk/Master/texmf-dist/doc/latex/prooftrees/README
Deleted: trunk/Master/texmf-dist/doc/latex/prooftrees/README
===================================================================
--- trunk/Master/texmf-dist/doc/latex/prooftrees/README 2024-10-26 20:12:09 UTC (rev 72664)
+++ trunk/Master/texmf-dist/doc/latex/prooftrees/README 2024-10-26 20:16:18 UTC (rev 72665)
@@ -1,39 +0,0 @@
-%% Copyright 2019 Clea F. Rees
-%
-% 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.
-%
-% This work has the LPPL maintenance status `maintained'.
-%
-% The Current Maintainer of this work is Clea F. Rees.
-%
-% This work consists of all files listed in manifest.txt.
-
-This package supports drawing tableaux (proof trees) of the kind often used in
-introductory logic classes, especially those aimed at students without strong
-mathemtical backgrounds. Hodges (1991) is one example of a text which uses
-this system. When teaching such a system it is especially useful to annotate
-the tree with line numbers, justifications and explanations of branch
-closures.
-
-prooftrees provides a single environment, prooftree, and a variety of tools
-for annotating, customising and highlighting such trees. A cross-referencing
-system is provided for trees which cite line numbers in justifications for
-proof lines or branch closures.
-
-prooftrees is based on Forest and, hence, TikZ. The package requires version
-2.1+ of Forest for expected results and will not work with version 1.
-
-The author is certain that some of her beliefs are false, but sure that her
-belief that prooftrees has bugs is not among them.
-
-Clea F. Rees
-ReesC21 <at> cardiff <dot> ac <dot> uk
-2019/09/30
-
-vim: set nospell:
Added: trunk/Master/texmf-dist/doc/latex/prooftrees/README.md
===================================================================
--- trunk/Master/texmf-dist/doc/latex/prooftrees/README.md (rev 0)
+++ trunk/Master/texmf-dist/doc/latex/prooftrees/README.md 2024-10-26 20:16:18 UTC (rev 72665)
@@ -0,0 +1,66 @@
+$Id: README.md 10529 2024-10-25 21:19:36Z cfrees $
+
+# prooftrees
+
+A LaTeX package for drawing logical tableaux.
+
+## Licence
+
+Copyright 2016-2024 Clea F. Rees
+
+This work may be distributed and/or modified under the
+conditions of the LaTeX Project Public License, either version 1.3c
+of this license or (at your option) any later version.
+The latest version of this license is in
+https://www.latex-project.org/lppl.txt
+and version 1.3c or later is part of all distributions of LaTeX
+version 2008-05-04 or later.
+
+This work has the LPPL maintenance status `maintained'.
+
+The Current Maintainer of this work is Clea F. Rees.
+
+This file may only be distributed together with a copy of the package
+prooftrees. You may however distribute the package prooftrees without
+such generated files.
+
+This work consists of all files listed in manifest.txt.
+
+## Features
+
+This package supports drawing tableaux (proof trees) of the kind often used in
+introductory logic classes, especially those aimed at students without strong
+mathemtical backgrounds. Hodges (1991) is one example of a text which uses
+this system. When teaching such a system it is especially useful to annotate
+the tree with line numbers, justifications and explanations of branch
+closures.
+
+prooftrees provides a single environment - either prooftree or tableau - and a
+variety of tools for annotating, customising and highlighting such trees. A
+cross-referencing system is provided for trees which cite line numbers in
+justifications for proof lines or branch closures.
+
+prooftrees is based on Forest and, hence, TikZ. The package requires version
+2.1+ of Forest for expected results and will not work with version 1.
+
+Version 0.9 adds out-of-the-box support for externalisation of tableaux using
+memoize.
+
+## Code Repositories
+
+Code for the package is hosted at
+ https://codeberg.org/cfr/prooftrees
+For convenience, the repository is mirrored at
+ https://github.com/cfr42/prooftrees
+
+## Contact Details
+
+Bug reports, feature requests etc. should be filed at
+ https://codeberg.org/cfr/prooftrees/issues
+
+
+Clea F. Rees
+Version 0.9
+2024-10-25
+
+vim: et:tw=80:
Property changes on: trunk/Master/texmf-dist/doc/latex/prooftrees/README.md
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Modified: trunk/Master/texmf-dist/doc/latex/prooftrees/manifest.txt
===================================================================
--- trunk/Master/texmf-dist/doc/latex/prooftrees/manifest.txt 2024-10-26 20:12:09 UTC (rev 72664)
+++ trunk/Master/texmf-dist/doc/latex/prooftrees/manifest.txt 2024-10-26 20:16:18 UTC (rev 72665)
@@ -1,7 +1,14 @@
-Copyright 2023 Clea F. Rees
+# Manifest for prooftrees
-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.
+Copyright (C) 2016-2024 Clea F. Rees
+This work may be distributed and/or modified under the conditions of the LaTeX
+Project Public License, either version 1.3c of this license or (at your option)
+any later version. The latest version of this license is in
+ https://www.latex-project.org/lppl.txt
+and version 1.3 or later is part of all distributions of LaTeX version
+2008-05-04 or later.
+
This work has the LPPL maintenance status `maintained'.
The Current Maintainer of this work is Clea F. Rees.
@@ -8,11 +15,40 @@
This work consists of all files listed in manifest.txt.
-prooftrees.sty
-prooftrees.tex
-prooftrees_biber.bib
-manifest.txt
-README
+This file was automatically generated by `l3build manifest`.
-Derived files:
-prooftrees.pdf
+## Source files
+
+
+### Package files
+
+
+* manifest.txt
+* README.md
+* prooftrees_biber.bib
+* prooftrees.sty
+* prooftrees.tex
+
+### Development files
+
+
+* build.lua
+* manifest.lua
+* tag.lua
+* config-mem.lua
+* prooftrees-memoize-t1.lvt
+* prooftrees-memoize-t1.tlg
+* prooftrees-conflicts-t1.lvt
+* prooftrees-egs.lvt
+* prooftrees-conflicts-t1.tlg
+* prooftrees-egs.luatex.tlg
+* prooftrees-egs.pdftex.tlg
+* prooftrees-egs.xetex.tlg
+
+
+## Derived files
+
+
+### Typeset documentation
+
+* prooftrees.pdf
Modified: trunk/Master/texmf-dist/doc/latex/prooftrees/prooftrees.pdf
===================================================================
(Binary files differ)
Modified: trunk/Master/texmf-dist/doc/latex/prooftrees/prooftrees.tex
===================================================================
--- trunk/Master/texmf-dist/doc/latex/prooftrees/prooftrees.tex 2024-10-26 20:12:09 UTC (rev 72664)
+++ trunk/Master/texmf-dist/doc/latex/prooftrees/prooftrees.tex 2024-10-26 20:16:18 UTC (rev 72665)
@@ -1,26 +1,36 @@
-%% Copyright 2023 Clea F. Rees
-%
-% 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.
-%
-% This work has the LPPL maintenance status `maintained'.
-%
-% The Current Maintainer of this work is Clea F. Rees.
-%
-% This work consists of all files listed in manifest.txt.
+\iffalse
+%% Copyright 2016-2024 Clea F. Rees
%%
+%% This work may be distributed and/or modified under the
+%% conditions of the LaTeX Project Public License, either version 1.3c
+%% of this license or (at your option) any later version.
+%% The latest version of this license is in
+%% https://www.latex-project.org/lppl.txt
+%% and version 1.3c or later is part of all distributions of LaTeX
+%% version 2008-05-04 or later.
+%%
+%% This work has the LPPL maintenance status `maintained'.
+%%
+%% The Current Maintainer of this work is Clea F. Rees.
+%%
+%% This file may only be distributed together with a copy of the package
+%% prooftrees.
+%%
+%% This work consists of all files listed in manifest.txt.
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% arara: pdflatex: { synctex: true, shell: false }
+% arara: biber
+% arara: makeindex
+% arara: pdflatex: { synctex: true, shell: false }
+% arara: pdflatex: { synctex: true, shell: false }
% biber --output_format=bibtex --output_resolve prooftrees.bcf to generate .bib for upload
% sed -i '/1977/s/DATE/YEAR'
-%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\fi
\pdfminorversion=7
\RequirePackage{svn-prov}
-\ProvidesFileSVN{$Id: prooftrees.tex 9582 2023-06-18 01:00:05Z cfrees $}[v0.8 \revinfo]
+\ProvidesFileSVN{$Id: prooftrees.tex 10525 2024-10-24 06:31:34Z cfrees $}[v0.9 \revinfo]
\GetFileInfoSVN*
\let\prooftreesdocversion\fileversion
\let\prooftreesdocbase\filebase
@@ -28,8 +38,30 @@
\let\prooftreesdocdate\filedate
% BEGIN preamble
\documentclass[10pt,british,a4paper,doc2]{ltxdoc}
-\usepackage{babel,geometry,pageslts,fancyhdr,enumitem}
-\usepackage[utf8]{inputenc}
+\usepackage[extract=python]{memoize}
+\mmzset{%
+ prefix={memos/},
+ include context in ccmemo,
+ auto=\cref{multiref},
+ auto=\Cref{multiref},
+ auto=\labelcref{multiref},
+ auto=\cpageref{multiref},
+ auto=\labelcpageref{multiref},
+ auto=\namecref{ref},
+ auto=\nameCref{ref},
+ auto=\namecrefs{ref},
+ auto=\nameCrefs{ref},
+ auto=\lcnamecrefs{ref},
+ auto=\lcnamecrefs{ref},
+ auto=\crefrange{refrange},
+ auto=\cpagerefrange{refrange},
+ auto=\Cpagerefrange{refrange},
+ mkdir,
+}
+% \CodelineIndex
+% \RecordChanges
+% \EnableCrossrefs
+\usepackage{babel,geometry,fancyhdr,enumitem}
\usepackage{csquotes}
\MakeAutoQuote{‘}{’}
\MakeAutoQuote*{“}{”}
@@ -41,7 +73,7 @@
\bibliography{prooftrees_biber.bib}% generate for upload (gweler uchod)
\usepackage{etoolbox,verbatim,parskip,changepage,titling,makeidx}
\usepackage[dvipsnames,svgnames,rgb,x11names]{xcolor}
-\usepackage{prooftrees}
+\usepackage[tableaux]{prooftrees}
\usepackage{mathtools,turnstile,pifont}
\newcommand*{\fycheck}{\text{\ding{52}}}
\newcommand*{\fycross}{\text{\ding{56}}}
@@ -60,7 +92,12 @@
},
}
\usepackage{tcolorbox}
-\tcbuselibrary{listings,xparse,breakable}% if you use skins, you need to disable externalisation for boxes which use the relevant options - gweler nodiadau/tex/tex.se/tcolorbox-coursepacket-exp.tex
+\tcbuselibrary{listingsutf8}% if you use skins, you need to disable externalisation for boxes which use the relevant options - gweler nodiadau/tex/tex.se/tcolorbox-coursepacket-exp.tex
+%%%%%%%%%%%%%%%%
+% Sašo Živanović: https://github.com/sasozivanovic/memoize/issues/31#issuecomment-2424700001
+\csappto{tcb at shield@@externalize}{\ifdefined\memoizefalse\memoizefalse\fi}
+\tcbset{shield externalize}
+%%%%%%%%%%%%%%%%
\usepackage[%
loadHyperref=true,
createIndexEntries=false,
@@ -83,7 +120,7 @@
\raggedleft\PrintDescribeMacro{#1}\par
\PrintLabelName[\macrolabelfont]{\macrolabelname}%
}%
- \expandafter\prooftrees at index{\macrolabelname}{\protect\verb \protect #1}\@esphack\ignorespaces}
+ \expandafter\prooftrees at index{\macrolabelname}{\protect\ttfamily\protect\string\protect#1}\@esphack\ignorespaces}
\renewcommand*\Describe at Env[1]{\endgroup
\marginpar{%
\raggedleft\PrintDescribeMacro{#1}\par
@@ -106,7 +143,7 @@
\renewcommand*\do[1]{\ifcyntafun ##1\else\\##1\fi\cyntafunfalse}%
\cyntafuntrue
\marginpar{%
- \raggedleft\PrintDescribeMacro{ % peid â dileu'r gwagle hwn!!
+ \raggedleft\PrintDescribeMacro{ % paid â dileu'r gwagle hwn!!
\expandafter\docsvlist{#2}%
}\par
\PrintLabelName[\macrolabelfont]{\csname #1labelname\endcsname}%
@@ -184,6 +221,16 @@
commentstyle=\color{doc at commentcolor},
frame=none,
}
+\lstdefinestyle{lstsrc}{%
+ style=lstDemoStyleLaTeXCode,
+ stringstyle=\color{doc at stringcolor},
+ keywordstyle=\color{doc at keywordcolor},
+ commentstyle=\color{doc at commentcolor},
+ texcsstyle=\color{doc at keywordcolor},
+ frame=none,
+ numbers=left,
+ moretexcs={forestset,linenumberstyle,ifcsname,ProcessOptions,DeclareOption,ProvidesPackageSVN,bracketset,NewDocumentEnvironment,ExplSyntaxOn,mmzset,ExplSyntaxOff,forest,prooftrees at enw,foresteregister,foresteoption,forestregister,forestoption,PackageError,PackageWarning,PassOptionsToPackage,CurrentOption, at ifpackageloaded,endforest,draw},
+}
\geometry{headheight=12pt,marginparwidth=45mm,hmarginratio=4:1,vscale=.8,hscale=.7,verbose}
\newlength\tewadjust
\setlength\tewadjust{\marginparwidth+\marginparsep-\paperwidth+\textwidth+\oddsidemargin+1in}
@@ -269,20 +316,83 @@
Version \prooftreesdocversion{} \prooftreesdocinfo
\end{center}%
}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\ExplSyntaxOn
+% \NewDocumentCommand \ivals { +m }
+% {
+% {
+% \clist_if_empty:nF { #1 }
+% {
+% \normalfont
+% \itshape
+% < \clist_use:nn { #1 } { >\texttt{,} ~ < } >
+% }
+% }
+% }
+\keys_define:nn { prooftrees / doc }
+{
+ unknown .code:n = {
+ \cs_if_free:cT { \l_keys_key_str }
+ {
+ \tl_gset:cn { \l_keys_key_str } { #1 }
+ }
+ },
+}
+\NewDocumentCommand \prooftreesdocset { +m }
+{
+ \keys_set:nn { prooftrees / doc } { #1 }
+}
+\ExplSyntaxOff
+\prooftreesdocset{%
+ bug={\href{https://codeberg.org/cfr/prooftrees/issues}{\textsc{bugtracker}}},
+ codeberg={\href{https://codeberg.org/cfr/prooftrees}{\textsc{codeberg}}},
+ github={\href{https://github.com/cfr42/prooftrees}{\textsc{github}}},
+ ctan={\href{https://ctan.org/}{\textsc{ctan}}},
+}
+% \newcommand*{\lpack}[1]{\textsf{#1}}
+\title{\filebase}
+\author{Clea F. Rees\thanks{%
+ Bug tracker:
+ \href{https://codeberg.org/cfr/prooftrees/issues}{\url{codeberg.org/cfr/prooftrees/issues}}
+ \textbar{} Code:
+ \href{https://codeberg.org/cfr/prooftrees}{\url{codeberg.org/cfr/prooftrees}}
+ \textbar{} Mirror:
+ \href{https://github.com/cfr42/prooftrees}{\url{github.com/cfr42/prooftrees}}%
+}}
+% \date{\fileversion~\filedate}
+\date{\prooftreesdocdate}%
+\title{\prooftreesdocbase}%
+\ExplSyntaxOn
+\hook_gput_code:nnn {shipout/lastpage} {.}
+{
+ \property_record:nn {t:lastpage}{abspage,page,pagenum}
+}
+\cs_new_protected_nopar:Npn \lastpage
+{
+ \property_ref:nn {t:lastpage}{page}
+}
+% \NewDocumentCommand \plarg {+m} {{\ttfamily (\ivals{#1})}}
+\ExplSyntaxOff
+% \NewDocumentCommand \istable{m}{\texttt{= \{}\ivals{#1}\texttt{\}}\par\noindent}
+% \NewDocumentCommand \isstring{m}{\texttt{= ''}\meta{#1}\texttt{''}\par\noindent}
+% \definecolor{strawberry}{rgb}{1.000,0.000,0.502}
+% \definecolor{blueberry}{rgb}{0.000,0.000,1.000}
+% \definecolor{moss}{rgb}{0.000,0.502,0.251}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\pagestyle{fancy}
\fancyhf{}
\fancyhf[lh]{\textit{\leftmark}}
\fancyhf[rh]{\textit{\rightmark}}
-\fancyhf[cf]{\textit{--- \thepage{} of \lastpageref*{LastPage} ---}}
+\fancyhf[cf]{\textit{--- \thepage{} of \lastpage{} ---}}
\fancypagestyle{fancyplain}{%
\fancyhf{}%
\fancyhf[lh]{\textit{\leftmark}}%
\renewcommand*\headrulewidth{0pt}%
- \fancyhf[cf]{\textit{--- \thepage{} of \lastpageref*{LastPage} ---}}}
+ \fancyhf[cf]{\textit{--- \thepage{} of \lastpage{} ---}}}
\fancypagestyle{plain}{%
\fancyhf{}%
\renewcommand*\headrulewidth{0pt}%
- \fancyhf[cf]{\textit{--- \thepage{} of \lastpageref*{LastPage} ---}}}
+ \fancyhf[cf]{\textit{--- \thepage{} of \lastpage{} ---}}}
\patchcmd{\sectionmark}{\MakeUppercase}{}{\typeout{sectionmark patched OK!}}{\typeout{sectionmark patch failed!}}
\patchcmd{\tableofcontents}{\MakeUppercase}{}{\typeout{sectionmark patched OK!}}{\typeout{sectionmark patch failed!}}
\patchcmd{\tableofcontents}{\MakeUppercase\contentsname}{}{\typeout{sectionmark patched OK!}}{\typeout{sectionmark patch failed!}}
@@ -297,9 +407,6 @@
% END preamble
\begin{document}
-\title{\prooftreesdocbase}%
-\author{Clea F. Rees\texorpdfstring{\thanks{reesc21 <at> cardiff <dot> ac <dot> uk}}{}}%
-\date{\prooftreesdocdate}%
\newgeometry{headheight=12pt,scale=.8,marginparwidth=0pt,marginparsep=0pt}%
\savegeometry{safonol}%
\setlength\tewadjust{\marginparwidth+\marginparsep}%
@@ -309,8 +416,9 @@
\bigskip
\begin{abstract}
- \noindent \keyname[pkg]{\pkg{prooftrees}} is a \LaTeXe{} package, based on \keyname[pkg]{\pkg{forest}}, designed to support the typesetting of proof trees in styles sometimes used in teaching introductory logic courses, especially those aimed at students without a strong background in mathematics.
+ \noindent \keyname[pkg]{\pkg{prooftrees}} is a \LaTeXe{} package, based on \keyname[pkg]{\pkg{forest}}, designed to support the typesetting of logical tableaux --- ‘proof trees’ or ‘truth trees’ --- in styles sometimes used in teaching introductory logic courses, especially those aimed at students without a strong background in mathematics.
One textbook which uses proofs of this kind is \textcite{hodges-logic}.
+ Like \pkg{forest}, \pkg{prooftrees} supports \keyname[pkg]{\pkg{memoize}} out-of-the-box.
\end{abstract}
\bigskip
@@ -318,7 +426,7 @@
\begin{adjustwidth}{-3em}{-5em}
\centering
\begin{minipage}[t]{.475\linewidth}
- \begin{prooftree}
+ \begin{tableau}
{
to prove={S \liff \lnot T, T \liff \lnot R \sststile{\mathcal{L}}{} S \liff R},
highlight format={text=WildStrawberry},
@@ -387,10 +495,10 @@
]
]
]
- \end{prooftree}%
+ \end{tableau}%
\end{minipage}\hfill
\begin{minipage}[t]{.525\linewidth}
- \begin{prooftree}
+ \begin{tableau}
{
to prove={(\exists x)((\forall y)(Py \Rightarrow (x = y)) \cdot Px) \sststile{\mathcal{L}_1}{} (\exists x)(\forall y)(Py \Leftrightarrow (x = y))},
line no sep=.35em,
@@ -441,7 +549,7 @@
]
]
]
- \end{prooftree}%
+ \end{tableau}%
\end{minipage}%
\end{adjustwidth}
\end{figure}
@@ -512,7 +620,7 @@
The code for a \pkg{prooftrees} proof tree is shown in \cref{ptdefaults}, together with the output obtained using the default settings.
\begin{codcoeden}*[label=ptdefaults]{\pkg{prooftrees}: default settings}
-\begin{prooftree}
+\begin{tableau}
{
to prove={\{P \vee (Q \vee \lnot R), P \lif \lnot R, Q \lif \lnot R\} \sststile{}{} \lnot R}
}
@@ -528,7 +636,7 @@
[\lnot Q, close={:!u,!c}]
[\lnot R, close={:not conc,!c}, just={$\lif$ Elim:last premise}]]
[\lnot R, close={:not conc,!c}, move by=1, just={$\vee$ Elim:!u}]]]]]]
-\end{prooftree}
+\end{tableau}
\end{codcoeden}
More extensive configuration can be achieved by utilising \pkg{forest} \autocite{saso-forest-manual} and/or \TikZ{} \autocite{tantau-tikz-pgf-manual} directly.
A sample of supported proof tree styles are shown in \cref{sample}.
@@ -537,7 +645,7 @@
\thispagestyle{plain}%
\begin{coeden}[label=sample, floatplacement={!bp}, grow to left by=3em, grow to right by=3em]{\pkg{prooftrees}: sample output}
\centering
- \begin{prooftree}
+ \begin{tableau}
{
to prove={\{ P \lor (Q \lor \lnot R), P \lif \lnot R, Q \lif \lnot R \} \sststile{}{} \lnot R},
line no sep=.35em,
@@ -566,9 +674,9 @@
]
]
]
- \end{prooftree}\hfill
+ \end{tableau}\hfill
{\renewcommand*\linenumberstyle[1]{#1)}%
- \begin{prooftree}
+ \begin{tableau}
{
close with={\ensuremath{\ast}},
just format={text=gray, font=\itshape},
@@ -602,9 +710,9 @@
]
]
]
- \end{prooftree}}
+ \end{tableau}}
- \begin{prooftree}
+ \begin{tableau}
{
not line numbering,
single branches,
@@ -636,8 +744,8 @@
]
]
]
- \end{prooftree}%
- \hfill\begin{prooftree}
+ \end{tableau}%
+ \hfill\begin{tableau}
{
to prove={\{ P \lor (Q \lor \lnot R), P \lif \lnot R, Q \lif \lnot R \} \therefore \lnot R},
close with={\ensuremath{\times}},
@@ -668,9 +776,9 @@
]
]
]
- \end{prooftree}
+ \end{tableau}
- \begin{prooftree}
+ \begin{tableau}
{
to prove={(\exists x)(Lx \lor Mx) \sststile{}{} (\exists x) Lx \lor (\exists x) Mx},
highlight format={text=blue!50!cyan},
@@ -695,8 +803,8 @@
]
]
]
- \end{prooftree}%
- \hfill\begin{prooftree}
+ \end{tableau}%
+ \hfill\begin{tableau}
{
for tree={%
plain content,
@@ -717,7 +825,7 @@
]
]
]
- \end{prooftree}
+ \end{tableau}
\end{coeden}
% END sec:raisondetre
@@ -730,7 +838,7 @@
\begin{itemize}
\item All derivation rules yield equal numbers of \wff{}s on all branches.
\begin{center}
- \begin{prooftree}
+ \begin{tableau}
{
not line numbering,
for tree={plain content},
@@ -740,7 +848,7 @@
[\wff[\wff[\wff]][\wff[\wff, label={[text=Green3]right:{\fycheck}}]]]
[\wff[\wff][\wff[\wff, label={[text=red]right:{\fycross}}]]]
[\wff[\wff[\wff]][\wff[\phantom{\wff}, label={[text=red]right:{\fycross}}]]]
- \end{prooftree}
+ \end{tableau}
\end{center}
If $\mathcal{L}$ fails to satisfy this condition, \pkg{prooftrees} is likely to violate the requirements of affected derivation rules by splitting branches ‘mid-inference’.
\item No derivation rule yields \wff{}s on more than two branches.
@@ -780,17 +888,17 @@
and we would like to typeset the entailment established by our proof at the top of the tree.
Then we should begin like this:
\begin{latexcode}
-\begin{prooftree}
+\begin{tableau}
{
to prove={(\exists x)((\forall y)(Py \lif x = y) \land Px) \sststile{}{} (\exists x)(\forall y)(Py \liff x = y)}
}
-\end{prooftree}
+\end{tableau}
\end{latexcode}
That is all the preamble we want, so we move onto consider the \meta{tree specification}.
\pkg{forest} uses square brackets to specify trees' structures.
To typeset a proof, think of it as consisting of nested trees, trunks upwards, and work from the outside in and the trunks down (\cref{nythod}).
\begin{coeden}[label=nythod]{Nested structure of proof tree}
-\begin{prooftree}
+\begin{tableau}
{
to prove={(\exists x)((\forall y)(Py \lif x = y) \land Px) \sststile{}{} (\exists x)(\forall y)(Py \liff x = y)},
just sep*=3,
@@ -900,7 +1008,7 @@
]
]
]
-\end{prooftree}
+\end{tableau}
\end{coeden}
Starting with the outermost tree \nyth*{} and the topmost trunk, we replace the \bocsnyth{} with square brackets and enter the first \wff{} inside, adding \verb|just=Pr.| for the justification on the right and \verb|checked=a| so that the line will be marked as discharged with $a$ substituted for $x$.
@@ -908,13 +1016,13 @@
(Technically, it is the node rather than the line which is named, but, for our purposes, this doesn't matter.
\pkg{forest} will create a name if we don't specify one, but it will not necessarily be one we would have chosen for ease of use!)
\begin{latexcode}
-\begin{prooftree}
+\begin{tableau}
{
to prove={(\exists x)((\forall y)(Py \lif x = y) \land Px) \sststile{}{} (\exists x)(\forall y)(Py \liff x = y)}
}
[{(\exists x)((\forall y)(Py \lif x = y) \land Px)}, checked=a, just=Pr., name=pr
]
-\end{prooftree}
+\end{tableau}
\end{latexcode}
We can refer to this line later as \verb|pr|.
@@ -923,7 +1031,7 @@
Again, we add the justification with \keyname[foptautotoks]{just}, but we use \verb|subs=a| rather than \verb|checked=a| as we want to mark substitution of $a$ for $x$ without discharging the line.
Again, we use \keyname*[fopttoks]{name} so that we can refer to the line later as \verb|neg conc|.
\begin{latexcode}
-\begin{prooftree}
+\begin{tableau}
{
to prove={(\exists x)((\forall y)(Py \lif x = y) \land Px) \sststile{}{} (\exists x)(\forall y)(Py \liff x = y)}
}
@@ -931,7 +1039,7 @@
[{\lnot (\exists x)(\forall y)(Py \liff x = y)}, subs=a, just=Conc.~neg., name=neg conc
]
]
-\end{prooftree}
+\end{tableau}
\end{latexcode}
Turning to tree \nyth*{}, we again note that its \bocsnyth{} is nested within the previous two, so the square brackets for its \wff{} need to be nested within those for the previous \wff{}s.
@@ -941,7 +1049,7 @@
We could write this as \verb|just=1 $\exists\elim$|, but instead we use the name we assigned earlier with the referencing feature provided by \pkg{prooftrees}.
To do this, we put the reference, \verb|pr| \emph{after} the rest of the justification, separating the two parts by a colon i.e.~\verb|$\exists\elim$:pr| and allow \pkg{prooftrees} to figure out the correct number.
\begin{latexcode}
-\begin{prooftree}
+\begin{tableau}
{
to prove={(\exists x)((\forall y)(Py \lif x = y) \land Px) \sststile{}{} (\exists x)(\forall y)(Py \liff x = y)}
}
@@ -951,7 +1059,7 @@
]
]
]
-\end{prooftree}
+\end{tableau}
\end{latexcode}
Continuing in the same way, we surround each of the \wff{}s for \nyth*{}, \nyth*{}, \nyth*{} and \nyth*{} within square brackets nested within those surrounding the previous \wff{} since each of the trees is nested within the previous one.
@@ -961,7 +1069,7 @@
\verb|!u| refers to the current line's parent line --- in this case, \verb|{(\forall y)(Py \lif a = y) \land Pa}, checked, just=$\exists\elim$:pr|.
\verb|!uu| refers to the current line's parent line's parent line and so on.
\begin{latexcode}
-\begin{prooftree}
+\begin{tableau}
{
to prove={(\exists x)((\forall y)(Py \lif x = y) \land Px) \sststile{}{} (\exists x)(\forall y)(Py \liff x = y)}
}
@@ -979,7 +1087,7 @@
]
]
]
-\end{prooftree}
+\end{tableau}
\end{latexcode}
Reaching \nyth*{}, things get a little more complex since we now have not one, but \emph{two} \bocsnyth{} nested within \nyth[7].
@@ -986,7 +1094,7 @@
This means that we need \emph{two} sets of square brackets for \nyth{} --- one for each of its two trees.
Again, both of these should be nested within the square brackets for \nyth[7] but neither should be nested within the other because the trees for the two branches at \nyth{} are distinct.
\begin{latexcode}
-\begin{prooftree}
+\begin{tableau}
{
to prove={(\exists x)((\forall y)(Py \lif x = y) \land Px) \sststile{}{} (\exists x)(\forall y)(Py \liff x = y)}
}
@@ -1008,7 +1116,7 @@
]
]
]
-\end{prooftree}
+\end{tableau}
\end{latexcode}
At this point, we need to work separately or in parallel on each of our two branches since each constitutes its own tree.
@@ -1015,7 +1123,7 @@
Turning to trees \nyth*{}, each needs to be nested within the relevant tree \nyth[8], since each \bocsnyth{} is nested within the applicable branch's tree.
Hence, we nest square brackets for each of the \wff{}s at \nyth{} within the previous set.
\begin{latexcode}
-\begin{prooftree}
+\begin{tableau}
{
to prove={(\exists x)((\forall y)(Py \lif x = y) \land Px) \sststile{}{} (\exists x)(\forall y)(Py \liff x = y)}
}
@@ -1041,7 +1149,7 @@
]
]
]
-\end{prooftree}
+\end{tableau}
\end{latexcode}
We only have one tree \nyth*{} as there is no corresponding tree in the left-hand branch.
@@ -1054,7 +1162,7 @@
In either case, we again surrounding the argument with curly brackets to protect the comma.
\verb|!c| refers to the current line --- something useful in many close annotations, but not helpful in specifying non-circular justifications.
\begin{latexcode}
-\begin{prooftree}
+\begin{tableau}
{
to prove={(\exists x)((\forall y)(Py \lif x = y) \land Px) \sststile{}{} (\exists x)(\forall y)(Py \liff x = y)}
}
@@ -1082,13 +1190,13 @@
]
]
]
-\end{prooftree}
+\end{tableau}
\end{latexcode}
This completes the main right-hand branch of the tree and we can focus solely on the remaining left-hand one.
Tree \nyth*{} is straightforward --- we just need to nest it within the left-hand tree \nyth[9].
\begin{latexcode}
-\begin{prooftree}
+\begin{tableau}
{
to prove={(\exists x)((\forall y)(Py \lif x = y) \land Px) \sststile{}{} (\exists x)(\forall y)(Py \liff x = y)}
}
@@ -1118,7 +1226,7 @@
]
]
]
-\end{prooftree}
+\end{tableau}
\end{latexcode}
At this point, the main left-hand branch itself branches, so we have two trees \nyth*{}.
@@ -1125,7 +1233,7 @@
Treating this in the same way as the earlier branch at \nyth[8], we use two sets of square brackets nested within those for tree \nyth{}, but with neither nested within the other.
Since we also want to mark the leftmost branch as closed, we add \verb|close={:to Pb or not to Pb,!c}| in the same way as before.
\begin{latexcode}
-\begin{prooftree}
+\begin{tableau}
{
to prove={(\exists x)((\forall y)(Py \lif x = y) \land Px) \sststile{}{} (\exists x)(\forall y)(Py \liff x = y)}
}
@@ -1159,12 +1267,12 @@
]
]
]
-\end{prooftree}
+\end{tableau}
\end{latexcode}
We complete our initial specification by nesting \nyth*{} within the appropriate tree \nyth[12], again marking closure appropriately.
\begin{latexcode}
-\begin{prooftree}
+\begin{tableau}
{
to prove={(\exists x)((\forall y)(Py \lif x = y) \land Px) \sststile{}{} (\exists x)(\forall y)(Py \liff x = y)}
}
@@ -1200,12 +1308,12 @@
]
]
]
-\end{prooftree}
+\end{tableau}
\end{latexcode}
Compiling our code, we find that the line numbering is not quite right:
-\begin{prooftree}
+\begin{tableau}
{
to prove={(\exists x)((\forall y)(Py \lif x = y) \land Px) \sststile{}{} (\exists x)(\forall y)(Py \liff x = y)}
}
@@ -1241,7 +1349,7 @@
]
]
]
-\end{prooftree}
+\end{tableau}
\pkg{prooftrees} warns us about this:
\begin{latexcode}
@@ -1258,7 +1366,7 @@
\end{latexcode}
giving us the following code:
\begin{latexcode}
-\begin{prooftree}
+\begin{tableau}
{
to prove={(\exists x)((\forall y)(Py \lif x = y) \land Px) \sststile{}{} (\exists x)(\forall y)(Py \liff x = y)}
}
@@ -1294,11 +1402,11 @@
]
]
]
-\end{prooftree}
+\end{tableau}
\end{latexcode}
which produces our desired result:
-\begin{prooftree}
+\begin{tableau}
{
to prove={(\exists x)((\forall y)(Py \lif x = y) \land Px) \sststile{}{} (\exists x)(\forall y)(Py \liff x = y)}
}
@@ -1334,7 +1442,7 @@
]
]
]
-\end{prooftree}
+\end{tableau}
% END sec:ee
@@ -1393,7 +1501,7 @@
Detailed documentation is provided in \cref{sec:ops} and \cref{sec:macros}.
\forestset{declare count register={cau},cau'=0}
-\begin{prooftree}
+\begin{tableau}
{
to prove={proof statement},
for tree={%
@@ -1472,7 +1580,7 @@
\end{scope}
}
[[[[][]]]][[[[[]][[[]]]][[]]]]]]]
-\end{prooftree}
+\end{tableau}
% END sec:anatomy
@@ -1916,6 +2024,54 @@
% END sec:macros
+\section{Memoization}\label{sec:memoize}
+% BEGIN sec:memoize
+
+Tableaux created by \pkg{prooftrees} cannot, in general, be externalised with \TikZ's \keyname[pkg]{\pkg{external}} library.
+Since \keyname[pkg]{\pkg{pgf}}/\TikZ{}, in general, and \pkg{prooftrees}, in particular, can be rather slow to compile, this is a serious issue.
+If you only have a two or three small tableaux, the compilation time will be negligible.
+But if you have large, complex proofs or many smaller ones, compilation time will quickly become excessive.
+
+Version 0.9 does not cure the disease, but it does offer an extremely effective remedy for the condition.
+While it does not make \pkg{prooftrees} any faster, it supports the \keyname[pkg]{\pkg{memoize}} package developed by \pkg{forest}'s author, Sašo Živanović \autocite*{saso-memoize-manual}.
+Memoization is faster, more secure, more robust and easier to use than \TikZ's externalisation.
+\begin{description}
+ \item[It is faster.] It does not require separate compilations for each memoized object, so it is comparatively fast even when memoizing.
+ \item[It is more secure.] It requires only restricted shell-escape, which almost all \TeX{} installations enable by default, so it is considerably more secure and can be utilised even where shell-escape is disabled.
+ \item[It is more robust.] It can successfully memoize code which defeats all ordinary mortals' attempts to externalize with the older \TikZ{} library.
+ \item[It is easier to use.] It requires less configuration and less intervention.
+ For example, it detects problematic code and aborts memoization automatically in many cases in which \TikZ's \pkg{external} would either cause a compilation error or silently produce nonsense output, forcing the user to manually disable the process for relevant code.
+\end{description}
+
+There is always a ‘but’, but this is a pretty small ‘but’ as ‘but’s go.
+\begin{description}
+ \item[But installation requires slightly more work.] To reap the full benefits, you want to use either the \texttt{perl} or the \texttt{python} ‘extraction’ method.
+ There is a third method, which does not require any special installation, but this lacks several of the advantages explained above and is not recommended.
+
+ If you use \TeX{} Live, you have \texttt{perl} already, but you may need to install a couple of libraries.
+ \texttt{python} is not a prerequisite for \TeX{} Live but, if you happen to have it installed, you will probably only need an additional library to use this method.
+
+ See \citetitle{saso-memoize-manual} \autocite{saso-memoize-manual} for further details.
+\end{description}
+
+Once you have the prerequisites setup, all you need do is load \pkg{memoize} \emph{before} \pkg{prooftrees}.
+
+\begin{latexcode}
+\usepackage[extraction method=perl]{memoize}% or python
+\usepackage{prooftrees}
+\end{latexcode}
+
+After a single compilation, your document will have expanded to include extra pages.
+At this point, it will look pretty weird.
+After the next compilation, your document will return to its normal self, the only difference being the speed with which it does so as all your memoized tableaux will simply be included, as opposed to recompiled.
+Only when you alter the code for a tableau, delete the generated files, disable memoization or explicitly request it will the proof be recompiled.
+
+Memoization is compatible with both \pkg{prooftrees}'s cross-referencing system and \LaTeXe's cross-references, but the latter require an additional compilation.
+In general, if a document element takes $n$ compilations to stabilise, it will take $n+1$ compilations to complete the memoization process.
+See \citetitle{saso-memoize-manual} \autocite{saso-memoize-manual} for details.
+
+% END sec:memoize
+
\section{Compatibility}\label{sec:compat}
% BEGIN sec:compat
@@ -1933,6 +2089,13 @@
\section{Version History}\label{sec:hanes}
% BEGIN sec:hanes
+\subsection{0.9}\label{subsec:0.9}
+% BEGIN subsec:0.9
+Add support for \pkg{memoize} and utilise for documentation.
+
+Use \cs{NewDocumentEnvironment}, removing direct dependency on \pkg{environ}.
+% END subsec:0.9
+
\subsection{0.8}
Add previously unnoticed dependency on \pkg{amstext}.
Attempt to fix straying closure symbols evident in documentation and a \TeX\ SE question\footnote{\url{https://tex.stackexchange.com/q/619314/}.}
@@ -1948,7 +2111,7 @@
The main point of this option is to allow automatic moves to be switched off if one teaches students to first apply all available non-branching rules for the tableau as a whole, as opposed to all non-branching rules for the sub-tree.
The automatic algorithm is consistent with the latter, but not former, approach.
The algorithm favours compact trees, which are more likely to fit on \pkg{beamer} slides.
-Switching the algorithm off permits users to specify exactly how things should or should not be move.
+Switching the algorithm off permits users to specify exactly how things should or should not be moved.
Thanks to Peter Smith for prompting this.
Fix bug reported at \href{https://tex.stackexchange.com/q/479263/39222}{tex.stackexchange.com/q/479263/39222}.
@@ -2001,10 +2164,25 @@
% END sec:hanes
\printbibliography
-\clearpage
\loadgeometry{safonol}%
\fancyheadoffset[lh]{0pt}%
+
\printindex
+
+\onecolumn
+\appendix
+
+\section{Implementation}\label{sec:imp}
+
+{%
+ % \makeatletter
+ % \def\@xobeysp{\leavevmode\penalty100\ }%
+ % \makeatother
+ % \verbatiminput{prooftrees.sty}%
+}
+\lstinputlisting[style=lstsrc,numbers=left,inputencoding=utf8/latin1]{prooftrees.sty}
+
+
\end{document}
Modified: trunk/Master/texmf-dist/doc/latex/prooftrees/prooftrees_biber.bib
===================================================================
--- trunk/Master/texmf-dist/doc/latex/prooftrees/prooftrees_biber.bib 2024-10-26 20:12:09 UTC (rev 72664)
+++ trunk/Master/texmf-dist/doc/latex/prooftrees/prooftrees_biber.bib 2024-10-26 20:16:18 UTC (rev 72665)
@@ -31,3 +31,12 @@
TITLE = {Forest: A {PGF}/Ti\mkbibemph{k}{Z}-Based Package for Drawing Linguistic Trees},
}
+ at MANUAL{saso-memoize-manual,
+ AUTHOR = ZIVANOVIC-SASO,
+ URL = {https://www.ctan.org/pkg/memoize},
+ DATE = {2023-10-10},
+ EDITION = {1.0.0},
+ KEYWORDS = {TeX,LaTeX,PGF,TikZ,Forest,Memoize},
+ TITLE = {Memoize},
+}
+
Modified: trunk/Master/texmf-dist/tex/latex/prooftrees/prooftrees.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/prooftrees/prooftrees.sty 2024-10-26 20:12:09 UTC (rev 72664)
+++ trunk/Master/texmf-dist/tex/latex/prooftrees/prooftrees.sty 2024-10-26 20:16:18 UTC (rev 72665)
@@ -1,23 +1,26 @@
-%% Copyright 2020 Clea F. Rees
-%
-% 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.
-%
-% This work has the LPPL maintenance status `maintained'.
-%
-% The Current Maintainer of this work is Clea F. Rees.
-%
-% This work consists of all files listed in manifest.txt.
+%% Copyright 2016-2024 Clea F. Rees
%%
+%% This work may be distributed and/or modified under the
+%% conditions of the LaTeX Project Public License, either version 1.3c
+%% of this license or (at your option) any later version.
+%% The latest version of this license is in
+%% https://www.latex-project.org/lppl.txt
+%% and version 1.3c or later is part of all distributions of LaTeX
+%% version 2008-05-04 or later.
+%%
+%% This work has the LPPL maintenance status `maintained'.
+%%
+%% The Current Maintainer of this work is Clea F. Rees.
+%%
+%% This file may only be distributed together with a copy of the package
+%% prooftrees.
+%%
+%% This work consists of all files listed in manifest.txt.
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\NeedsTeXFormat{LaTeX2e}
\RequirePackage{svn-prov}
-\ProvidesPackageSVN{$Id: prooftrees.sty 9103 2022-04-02 04:28:09Z cfrees $}[v0.8 \revinfo]
-\RequirePackage{etoolbox}
+\ProvidesPackageSVN{$Id: prooftrees.sty 10522 2024-10-23 16:31:08Z cfrees $}[v0.9 \revinfo]
% define \prooftrees at enw to hold the name of the environment
% default is to name the environment prooftree, this ensures backwards compatibility
\newcommand*\prooftrees at enw{prooftree}
@@ -27,7 +30,12 @@
\DeclareOption{tableau}{\renewcommand*\prooftrees at enw{tableau}}
\DeclareOption*{\PassOptionsToPackage{\CurrentOption}{forest}}
% if \prooftree is not yet defined, set the name to prooftree; otherwise, use tableau to avoid conflict with bussproofs (which uses 'prooftree' rather than 'bussproof' as one might expect)
-\ifundef\prooftree{\renewcommand*\prooftrees at enw{prooftree}}{\renewcommand*\prooftrees at enw{tableau}}
+\ifcsname prooftree\endcsname
+ \renewcommand*\prooftrees at enw{tableau}%
+\else
+ \renewcommand*\prooftrees at enw{prooftree}%
+\fi
+% \ifundef\prooftree{\renewcommand*\prooftrees at enw{prooftree}}{\renewcommand*\prooftrees at enw{tableau}}
% let users override the default prooftree in case they need to load bussproofs later
\ProcessOptions
\RequirePackage{forest}[2016/12/04]
@@ -457,7 +465,7 @@
}{},
where={%
>{O _O< O &&}{grouped}{1}{level}{proof tree rhifo}%
- }{% this searches for certain kinds of structural asymmetry in the tree and attempts to move lines appropriately in such cases - the algorithm is intended to be relatively conservative (not in the sense of 'cautious' or 'safe' but in the sense of 'reflection of the overlapping consensus of reasonable users' / 'what would be rationally agreed behind the prooftrees veil of ignorance'; apologies for the inconvenience if you are an unreasonable user)
+ }{% this searches for certain kinds of structural asymmetry in the tree and attempts to move lines appropriately in such cases - the algorithm is intended to be relatively conservative (not in the sense of 'cautious' or 'safe' but in the sense of 'reflection of the overlapping consensus of reasonable users' / 'what would be rationally agreed behind the prooftrees veil of ignorance'; however, I should have realised I actually had 'the overlapping concensus of reasonable Beamer users' in mind rather than 'the overlapping consensus of reasonable users', so there is now an option to turn it off;apologies if this comment previously misclassified you as 'unreasonable'; apologies for the inconvenience if you are an unreasonable user)
not tempboola,
for root/.process={Ow1}{level}{%
for level={##1}{%
@@ -867,9 +875,9 @@
},
},
}
-\environbodyname\prooftreebody
+% \environbodyname\prooftreebody
\bracketset{action character=@}
-\NewEnviron{\prooftrees at enw}[1]{% \forest/\endforest from egreg's answer at http://tex.stackexchange.com/a/229608/
+\NewDocumentEnvironment{\prooftrees at enw}{ m +b }{% \forest/\endforest from egreg's answer at http://tex.stackexchange.com/a/229608/
\forest
(%
stages={% customised definition of stages - we don't use any custom stages, but we do use several custom keylists, where the processing order of these is critical
@@ -896,7 +904,26 @@
)%
proof tree,% apply the proof tree style, which sets keylists from both forest's defaults and our custom additions
#1,% insert user's preamble, empty or otherwise - this allows the user both to override our defaults (e.g. by setting a non-empty proof statement or a custom format for line numbers) and to customise the tree using forest's facilities in the usual way - BUT customisations of the latter kind may or may not be effective, may or may not have undesirable - not to say chaotic - consequences, and may or may not cause compilation failures (structural changes, in particular, should be avoided completely)
- [, name=proof statement @\prooftreebody]%
- \endforest}
+ [, name=proof statement @#2]%
+ \endforest
+}{}
+
+\ExplSyntaxOn
+\cs_new_protected_nopar:Npn \__prooftrees_memoize:n #1
+{
+ \mmzset{
+ auto = { #1 } { memoize },
+ }
+}
+\cs_generate_variant:Nn \__prooftrees_memoize:n { V }
+\hook_gput_code:nnn { begindocument / before } { . }
+{% paid â memoize bussproofs prooftree ...
+ \@ifpackageloaded{memoize}{
+ \__prooftrees_memoize:V \prooftrees at enw
+ }{}
+}
+\ExplSyntaxOff
+
\endinput
%% end prooftrees.sty
+
More information about the tex-live-commits
mailing list.