summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/doc/metapost/drv
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2009-09-20 23:33:29 +0000
committerKarl Berry <karl@freefriends.org>2009-09-20 23:33:29 +0000
commit44bb8968da104e49b3765b18aa54f62870f88c39 (patch)
tree01f02e9f18b677e666821adaa29621489e2d14a5 /Master/texmf-dist/doc/metapost/drv
parent2c20e449c234f30eb26e3cbbd9cd48b281842a37 (diff)
new mpost package drv 0.93 (20sep09)
git-svn-id: svn://tug.org/texlive/trunk@15388 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/doc/metapost/drv')
-rw-r--r--Master/texmf-dist/doc/metapost/drv/README21
-rw-r--r--Master/texmf-dist/doc/metapost/drv/doc/drv-guide.mp1727
-rw-r--r--Master/texmf-dist/doc/metapost/drv/doc/drv-guide.tex1864
-rw-r--r--Master/texmf-dist/doc/metapost/drv/doc/drv.mp2245
-rw-r--r--Master/texmf-dist/doc/metapost/drv/doc/makefile46
-rw-r--r--Master/texmf-dist/doc/metapost/drv/doc/readme.txt17
-rw-r--r--Master/texmf-dist/doc/metapost/drv/drv-guide.pdfbin0 -> 176166 bytes
-rw-r--r--Master/texmf-dist/doc/metapost/drv/sample/coq-sample.mp101
-rw-r--r--Master/texmf-dist/doc/metapost/drv/sample/coq-sample.tex258
-rw-r--r--Master/texmf-dist/doc/metapost/drv/sample/drv.mp2245
-rw-r--r--Master/texmf-dist/doc/metapost/drv/sample/makefile47
-rw-r--r--Master/texmf-dist/doc/metapost/drv/sample/readme.txt14
-rw-r--r--Master/texmf-dist/doc/metapost/drv/template/drv.mp2245
-rw-r--r--Master/texmf-dist/doc/metapost/drv/template/makefile46
-rw-r--r--Master/texmf-dist/doc/metapost/drv/template/readme.txt17
-rw-r--r--Master/texmf-dist/doc/metapost/drv/template/template.mp131
-rw-r--r--Master/texmf-dist/doc/metapost/drv/template/template.tex55
17 files changed, 11079 insertions, 0 deletions
diff --git a/Master/texmf-dist/doc/metapost/drv/README b/Master/texmf-dist/doc/metapost/drv/README
new file mode 100644
index 00000000000..e5d287c876f
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/drv/README
@@ -0,0 +1,21 @@
+drv.mp - derivation trees with MetaPost
+version 0.93
+
+Licence
+lppl
+
+Description
+drv.mp is a set of MetaPost macros for typesetting derivation trees (such as
+used in sequent calculus, type inference, programming language semantics...)
+NO MetaPost knowledge is needed to use these macros.
+
+Contents
+drv.mp the main file
+drv-guide.pdf a user guide attempt
+doc/ the sources for drv-guide.pdf
+sample/ an example of use in conjunction with the beamer class
+template/ a basic set of files for your own tries
+README this file
+
+Any feedback is welcome.
+laurent.mehats@gmail.com
diff --git a/Master/texmf-dist/doc/metapost/drv/doc/drv-guide.mp b/Master/texmf-dist/doc/metapost/drv/doc/drv-guide.mp
new file mode 100644
index 00000000000..ab6b41675e2
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/drv/doc/drv-guide.mp
@@ -0,0 +1,1727 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Structure of a MetaPost file using drv.mp
+% 1. Preamble
+% input drv;
+% verbatimtex %&latex
+% <LaTeX preamble>
+% \begin{document}
+% etex;
+% 2. Figures
+% <optional drv tunings>
+% beginfig(<index>)
+% <judgment & inference declarations>
+% draw drv_tree;
+% <optional extra MetaPost code>
+% endfig;
+% 3. Postamble
+% end
+%
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% 1. Preamble
+%
+
+input drv;
+
+verbatimtex %&latex
+
+% Any piece of code related to font selection in the preamble of
+% `drv-guide.tex' (document class, font package, font selection commands ...)
+% should be reported here.
+
+\documentclass[twoside,11pt]{article}
+\usepackage[T1]{fontenc}
+\usepackage{amsmath}
+\usepackage{amssymb}
+\usepackage{stmaryrd}
+
+% Choose your favourite fonts combination (if available).
+% See "http://ctan.tug.org/tex-archive/info/Free_Math_Font_Survey".
+%
+%\usepackage{cmbright} % CM text & CM Bright math
+%\usepackage{ccfonts,eulervm} % Concrete text & Euler math
+%\usepackage{ccfonts} % Concrete text & math
+%\usepackage[math]{iwona} % Iwona text & math
+%\usepackage[math]{kurier} % Kurier text & math
+%\usepackage[math]{anttor} % Antykwa Torunska text & math
+%\usepackage{kmath,kerkis} % Kerkis text & math
+%\usepackage{fouriernc} % New Century Schoolbook & Fourier math
+%\usepackage{pxfonts} % Palatino & pxfonts math
+%\usepackage{mathpazo} % Palatino & Pazo math
+%\usepackage{mathpple} % Palatino & Euler math
+\usepackage[varg]{txfonts} % Times & txfonts math
+%\usepackage{mathtime} % Times & Belleek math
+%\usepackage{mathptmx} % Times & Symbol math
+%\usepackage{mbtimes} % Omega Serif text & Omega math
+%\usepackage{arev} % Arev Sans text with Arev math
+%\usepackage[charter]{mathdesign} % Bitstream Charter & Math Design math
+%\usepackage{comicsans} % Comic Sans text & math
+%\usepackage[garamond]{mathdesign} % Garamond & Math Design math
+%\usepackage{fourier} % Utopia & Fourier math
+%\usepackage[utopia]{mathdesign} % Utopia & Math Design math
+
+\begin{document}
+etex;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% 2. Figures
+%
+
+%
+% title page
+%
+
+beginfig(100)
+jgm 0 "\Gamma, \Delta, \Theta, \Pi, \Upsilon\vdash F";
+ jgm 1 "\Pi\vdash (A\to D)\to E";
+ jgm 2 "\Gamma, \Delta, \Theta, (A\to D)\to E, \Upsilon\vdash F";
+ jgm 3 "\Gamma, \Delta, \Theta\vdash A\to D";
+ jgm 4 "A, \Gamma, \Delta, \Theta\vdash D";
+ jgm 5 "A, \Gamma, \Delta\vdash B\wedge C";
+ jgm 6 "A, \Gamma\vdash B";
+ jgm 7 "\Delta\vdash C";
+ jgm 8 "B\wedge C, \Theta\vdash D";
+ jgm 9 "E, \Upsilon\vdash F";
+nfr 0 (1, 2) ("\text{cut}", 1);
+ nfr 1 () ("\pi", 4);
+ nfr 2 (3, 9) ("\to_L", 1);
+ nfr 3 (4) ("\to_R", 1);
+ nfr 4 (5, 8) ("\text{cut}", 1);
+ nfr 5 (6, 7) ("\wedge_R", 1);
+ nfr 6 () ("\gamma", 2);
+ nfr 7 () ("\delta", 1);
+ nfr 8 () ("\theta", 3);
+ nfr 9 () ("\upsilon", 2);
+draw drv_tree;
+endfig;
+
+%
+% first example
+%
+
+beginfig(110)
+jgm 0 "A\vdash B";
+jgm 1 "B\vdash C";
+jgm 2 "A\vdash C";
+nfr 0 () ("f", 1);
+nfr 1 () ("g", 1);
+nfr 2 (0, 1) ("\circ", 1);
+draw drv_tree;
+endfig;
+
+%
+% sub-judgments
+%
+
+beginfig(111)
+jgm 0 "A", "\vdash", "B";
+nfr 0 () ("f", 1);
+draw drv_tree;
+endfig;
+
+
+%
+% inference line styles
+%
+
+beginfig(120)
+jgm 0 "\text{none}";
+jgm 1 "\text{simple}";
+jgm 2 "\text{double}";
+jgm 3 "\text{dotted}";
+jgm 4 "\text{dashed}";
+jgm 5 "\text{waved}";
+jgm 6 "\text{\TeX-dotted}";
+jgm 7 "\text{default}";
+nfr 0 ( ) ("\leftarrow 0", 0);
+nfr 1 (0) ("\leftarrow 1", 1);
+nfr 2 (1) ("\leftarrow 2", 2);
+nfr 3 (2) ("\leftarrow 3", 3);
+nfr 4 (3) ("\leftarrow 4", 4);
+nfr 5 (4) ("\leftarrow 5", 5);
+nfr 6 (5) ("\leftarrow 6", 6);
+nfr 7 (6) ("\leftarrow\_", _);
+draw drv_tree;
+endfig;
+
+%
+% declarations order
+%
+
+beginfig(130)
+% preorder declarations
+jgm 0 "0";
+ jgm 1 "00";
+ jgm 2 "000";
+ jgm 3 "001";
+ jgm 4 "002";
+ jgm 5 "01";
+ jgm 6 "010";
+ jgm 7 "011";
+ jgm 8 "012";
+ jgm 9 "02";
+ jgm 10 "020";
+ jgm 11 "021";
+ jgm 12 "022";
+nfr 0 (1, 5, 9) ("a", _);
+ nfr 1 (2, 3, 4) ("b", _);
+ nfr 2 () ("c", _);
+ nfr 3 () ("d", _);
+ nfr 4 () ("e", _);
+ nfr 5 (6, 7, 8) ("f", _);
+ nfr 6 () ("g", _);
+ nfr 7 () ("h", _);
+ nfr 8 () ("i", _);
+ nfr 9 (10, 11, 12) ("j", _);
+ nfr 10 () ("k", _);
+ nfr 11 () ("l", _);
+ nfr 12 () ("m", _);
+draw drv_tree;
+endfig;
+
+beginfig(131)
+% postorder declarations
+ jgm 0 "000";
+ jgm 1 "001";
+ jgm 2 "002";
+ jgm 3 "00";
+ jgm 4 "010";
+ jgm 5 "011";
+ jgm 6 "012";
+ jgm 7 "01";
+ jgm 8 "020";
+ jgm 9 "021";
+ jgm 10 "022";
+ jgm 11 "02";
+jgm 12 "0";
+ nfr 0 () ("a", _);
+ nfr 1 () ("b", _);
+ nfr 2 () ("c", _);
+ nfr 3 (0, 1, 2) ("d", _);
+ nfr 4 () ("e", _);
+ nfr 5 () ("f", _);
+ nfr 6 () ("g", _);
+ nfr 7 (4, 5, 6) ("h", _);
+ nfr 8 () ("i", _);
+ nfr 9 () ("j", _);
+ nfr 10 () ("k", _);
+ nfr 11 (8, 9, 10) ("l", _);
+nfr 12 (3, 7, 11) ("m", _);
+draw drv_tree;
+endfig;
+
+%
+% dcl
+%
+
+beginfig(140)
+dcl 0 () ("f", 1) "A\vdash B";
+dcl 1 () ("g", 1) "B\vdash C";
+dcl 2 (0, 1) ("\circ", 1) "A\vdash C";
+draw drv_tree;
+endfig;
+
+beginfig(141)
+dcl 0 () ("f", 1) "A", "\vdash", "B";
+draw drv_tree;
+endfig;
+
+beginfig(150)
+dcl 0 (1, 5, 9) ("a", _) "0";
+ dcl 1 (2, 3, 4) ("b", _) "00";
+ dcl 2 () ("c", _) "000";
+ dcl 3 () ("d", _) "001";
+ dcl 4 () ("e", _) "002";
+ dcl 5 (6, 7, 8) ("f", _) "01";
+ dcl 6 () ("g", _) "010";
+ dcl 7 () ("h", _) "011";
+ dcl 8 () ("i", _) "012";
+ dcl 9 (10, 11, 12) ("j", _) "02";
+ dcl 10 () ("k", _) "020";
+ dcl 11 () ("l", _) "021";
+ dcl 12 () ("m", _) "022";
+draw drv_tree;
+endfig;
+
+%
+% bxd
+%
+
+beginfig(160)
+dcl 0 (1, 4) ("", _) "a";
+ dcl 1 (2) ("", _) "a";
+ dcl 2 (3) ("", _) "a";
+ dcl 3 () ("", _) "aaaaaaa";
+ dcl 4 () ("", _) "aaaaa";
+draw drv_tree;
+endfig;
+
+beginfig(161)
+dcl 0 (bxd 1, 4) ("", _) "a";
+ dcl 1 (2) ("", _) "a";
+ dcl 2 (3) ("", _) "a";
+ dcl 3 () ("", _) "aaaaaaa";
+ dcl 4 () ("", _) "aaaaa";
+draw drv_tree;
+endfig;
+
+vardef auxbox[]=
+ ((smin_x[@], ypart iln[ccl[@]].c+iln[ccl[@]].hg)--
+ (smin_x[@], smax_y[@])--
+ (smax_x[@], smax_y[@])--
+ (smax_x[@], ypart iln[ccl[@]].c+iln[ccl[@]].hg)--
+ cycle) shifted (0, min_clr_scl*min_clr[drv_sty]/2)
+enddef;
+
+beginfig(162)
+dcl 0 (bxd 1, 4) ("", _) "a";
+ dcl 1 (2) ("", _) "a";
+ dcl 2 (3) ("", _) "a";
+ dcl 3 () ("", _) "aaaaaaa";
+ dcl 4 () ("", _) "aaaaa";
+draw drv_tree;
+draw auxbox[1] withcolor (1, 0, 0);
+endfig;
+
+%
+% mvd
+%
+
+beginfig(170)
+jgm 1 "aaa";
+jgm 2 "bbb";
+jgm 3 "ccc";
+jgm 4 "d";
+nfr 1 () ("", _);
+nfr 2 () ("", _);
+nfr 3 () ("", _);
+nfr 4 (mvd 1 (2, 3), 2, 3) ("", _);
+draw drv_tree;
+endfig;
+
+beginfig(171)
+jgm 1 "aaa";
+jgm 2 "bbb";
+jgm 3 "ccc";
+jgm 4 "d";
+nfr 1 () ("", _);
+nfr 2 () ("", _);
+nfr 3 () ("", _);
+nfr 4 (1, mvd 2 (2, 4), 3) ("", _);
+draw drv_tree;
+endfig;
+
+beginfig(172)
+jgm 1 "aaa";
+jgm 2 "bbb";
+jgm 3 "ccc";
+jgm 4 "d";
+nfr 1 () ("", _);
+nfr 2 () ("", _);
+nfr 3 () ("", _);
+nfr 4 (1, 2, mvd 3 (2, 6)) ("", _);
+draw drv_tree;
+endfig;
+
+beginfig(180)
+jgm 0 "\textsc{Size matters -- Part 1}";
+jgm 1 "\text{Here is a rather long judgment"& % string concatenation
+ " that I don't want to shorten.}";
+jgm 2 "\text{Will the derivation tree fit on the page?}";
+jgm 3 "\text{It does.}";
+nfr 0 () ("", 0);
+nfr 1 (0) ("", 1);
+nfr 2 () ("", 1);
+nfr 3 (mvd 1 (2, 3), 2) ("", 1);
+draw drv_tree;
+endfig;
+
+%
+% Nfr
+%
+
+beginfig(190)
+jgm 0 "a";
+jgm 1 "b";
+jgm 2 "c";
+jgm 3 "d";
+Nfr 0 () ("0", "", "", _);
+Nfr 1 () ("1", "", "", _);
+Nfr 2 (0, 1) ("2", "E", "", _);
+Nfr 3 (2) ("3", "", "F", _);
+draw drv_tree;
+endfig;
+
+%
+% Dcl
+%
+
+beginfig(200)
+Dcl 0 () ("", "", "", _) "a";
+Dcl 1 (0) ("", "", "B", _) "c";
+Dcl 2 () ("", "", "", _) "d";
+Dcl 3 (1, 2) ("", "E", "", _) "f";
+draw drv_tree;
+endfig;
+
+%
+% Mvd
+%
+
+beginfig(210)
+jgm 1 "aaa";
+jgm 2 "bbb";
+jgm 3 "ccc";
+nfr 1 () ("", _);
+nfr 2 () ("", _);
+nfr 3 (Mvd 1 (2, "d", "", 3), 2) ("", _);
+draw drv_tree;
+endfig;
+
+%
+% drv_font_size
+%
+
+drv_font_size "\tiny";
+
+beginfig(220)
+jgm 1 "a";
+jgm 2 "b";
+jgm 3 "c";
+nfr 1 () ("1", 1);
+nfr 2 () ("2", 1);
+Nfr 3 (1, 2) ("3", "4", "", 1);
+draw drv_tree;
+endfig;
+
+drv_font_size "\small";
+
+beginfig(221)
+jgm 1 "a";
+jgm 2 "b";
+jgm 3 "c";
+nfr 1 () ("1", 1);
+nfr 2 () ("2", 1);
+Nfr 3 (1, 2) ("3", "4", "", 1);
+draw drv_tree;
+endfig;
+
+drv_font_size "\Large";
+
+beginfig(222)
+jgm 1 "a";
+jgm 2 "b";
+jgm 3 "c";
+nfr 1 () ("1", 1);
+nfr 2 () ("2", 1);
+Nfr 3 (1, 2) ("3", "4", "", 1);
+draw drv_tree;
+endfig;
+
+drv_font_size "\normalsize";
+
+%
+% drv_math_style (drv, );
+%
+
+beginfig(230)
+jgm 1 "a";
+jgm 2 "b";
+jgm 3 "c";
+nfr 1 () ("1", 1);
+nfr 2 () ("2", 1);
+Nfr 3 (1, 2) ("3", "4", "", 1);
+draw drv_tree;
+endfig;
+
+drv_math_style (drv, "\textstyle");
+
+beginfig(231)
+jgm 1 "a";
+jgm 2 "b";
+jgm 3 "c";
+nfr 1 () ("1", 1);
+nfr 2 () ("2", 1);
+Nfr 3 (1, 2) ("3", "4", "", 1);
+draw drv_tree;
+endfig;
+
+drv_math_style (drv, "\scriptstyle");
+
+beginfig(232)
+jgm 1 "a";
+jgm 2 "b";
+jgm 3 "c";
+nfr 1 () ("1", 1);
+nfr 2 () ("2", 1);
+Nfr 3 (1, 2) ("3", "4", "", 1);
+draw drv_tree;
+endfig;
+
+drv_math_style (drv, "\displaystyle");
+
+%
+% drv_math_style (jdg, );
+%
+
+drv_math_style (jdg, "\displaystyle");
+
+beginfig(240)
+jgm 1 "\bigwedge_{i\in I} A_i";
+jgm 2 "b";
+jgm 3 "c";
+nfr 1 () ("1", 1);
+nfr 2 () ("2", 1);
+Nfr 3 (1, 2) ("3", "4", "", 1);
+draw drv_tree;
+endfig;
+
+drv_math_style (jdg, "\textstyle");
+
+beginfig(241)
+jgm 1 "\bigwedge_{i\in I} A_i";
+jgm 2 "b";
+jgm 3 "c";
+nfr 1 () ("1", 1);
+nfr 2 () ("2", 1);
+Nfr 3 (1, 2) ("3", "4", "", 1);
+draw drv_tree;
+endfig;
+
+drv_math_style (jdg, "\scriptstyle");
+
+beginfig(242)
+jgm 1 "\bigwedge_{i\in I} A_i";
+jgm 2 "b";
+jgm 3 "c";
+nfr 1 () ("1", 1);
+nfr 2 () ("2", 1);
+Nfr 3 (1, 2) ("3", "4", "", 1);
+draw drv_tree;
+endfig;
+
+drv_math_style (jdg, "\textstyle");
+
+%
+% drv_math_style (ilb, );
+%
+
+drv_math_style (ilb, "\textstyle");
+
+beginfig(250)
+jgm 1 "a";
+jgm 2 "b";
+jgm 3 "c";
+nfr 1 () ("1", 1);
+nfr 2 () ("2", 1);
+nfr 3 (1, 2) ("3", 1);
+draw drv_tree;
+endfig;
+
+drv_math_style (ilb, "\scriptstyle");
+
+beginfig(251)
+jgm 1 "a";
+jgm 2 "b";
+jgm 3 "c";
+nfr 1 () ("1", 1);
+nfr 2 () ("2", 1);
+nfr 3 (1, 2) ("3", 1);
+draw drv_tree;
+endfig;
+
+drv_math_style (ilb, "\scriptscriptstyle");
+
+beginfig(252)
+jgm 1 "a";
+jgm 2 "b";
+jgm 3 "c";
+nfr 1 () ("1", 1);
+nfr 2 () ("2", 1);
+nfr 3 (1, 2) ("3", 1);
+draw drv_tree;
+endfig;
+
+drv_math_style (ilb, "\scriptstyle");
+
+%
+% drv_scale (clr, );
+%
+
+drv_scale (clr, 0);
+
+beginfig(260)
+dcl 1 () ("", 1) "\Bigl(a\Bigr)";
+dcl 2 (1) ("", 1) "a";
+draw drv_tree;
+endfig;
+
+drv_scale (clr, 1);
+
+beginfig(261)
+dcl 1 () ("", 1) "\Bigl(a\Bigr)";
+dcl 2 (1) ("", 1) "a";
+draw drv_tree;
+endfig;
+
+drv_scale (clr, 2.5);
+
+beginfig(262)
+dcl 1 () ("", 1) "\Bigl(a\Bigr)";
+dcl 2 (1) ("", 1) "a";
+draw drv_tree;
+endfig;
+
+drv_scale (clr, 4);
+
+beginfig(263)
+dcl 1 () ("", 1) "\Bigl(a\Bigr)";
+dcl 2 (1) ("", 1) "a";
+draw drv_tree;
+endfig;
+
+drv_scale (clr, 1);
+
+%
+% drv_scale (prm, );
+%
+
+drv_scale (prm, 0);
+
+beginfig(270)
+dcl 1 () ("", 1) "a";
+dcl 2 () ("", 1) "a";
+dcl 3 (1, 2) ("", 1) "a";
+draw drv_tree;
+endfig;
+
+drv_scale (prm, 1);
+
+beginfig(271)
+dcl 1 () ("", 1) "a";
+dcl 2 () ("", 1) "a";
+dcl 3 (1, 2) ("", 1) "a";
+draw drv_tree;
+endfig;
+
+drv_scale (prm, 2.5);
+
+beginfig(272)
+dcl 1 () ("", 1) "a";
+dcl 2 () ("", 1) "a";
+dcl 3 (1, 2) ("", 1) "a";
+draw drv_tree;
+endfig;
+
+drv_scale (prm, 4);
+
+beginfig(273)
+dcl 1 () ("", 1) "a";
+dcl 2 () ("", 1) "a";
+dcl 3 (1, 2) ("", 1) "a";
+draw drv_tree;
+endfig;
+
+drv_scale (prm, 1);
+
+%
+% drv_scale (jgm, );
+%
+
+drv_scale (jgm, 0);
+
+beginfig(280)
+dcl 1 () ("", 1) "a";
+dcl 2 () ("", 1) "a";
+dcl 3 (1, 2) ("", 1) "a";
+draw drv_tree;
+endfig;
+
+drv_scale (jgm, 1);
+
+beginfig(281)
+dcl 1 () ("", 1) "a";
+dcl 2 () ("", 1) "a";
+dcl 3 (1, 2) ("", 1) "a";
+draw drv_tree;
+endfig;
+
+drv_scale (jgm, 2.5);
+
+beginfig(282)
+dcl 1 () ("", 1) "a";
+dcl 2 () ("", 1) "a";
+dcl 3 (1, 2) ("", 1) "a";
+draw drv_tree;
+endfig;
+
+drv_scale (jgm, 4);
+
+beginfig(283)
+dcl 1 () ("", 1) "a";
+dcl 2 () ("", 1) "a";
+dcl 3 (1, 2) ("", 1) "a";
+draw drv_tree;
+endfig;
+
+drv_scale (jgm, 1);
+
+%
+% drv_scale (ilb, );
+%
+
+drv_scale (ilb, 0);
+
+beginfig(290)
+dcl 1 () ("b", 1) "a";
+dcl 2 () ("b", 1) "a";
+dcl 3 (1, 2) ("b", 1) "a";
+draw drv_tree;
+endfig;
+
+drv_scale (ilb, 1);
+
+beginfig(291)
+dcl 1 () ("b", 1) "a";
+dcl 2 () ("b", 1) "a";
+dcl 3 (1, 2) ("b", 1) "a";
+draw drv_tree;
+endfig;
+
+drv_scale (ilb, 2.5);
+
+beginfig(292)
+dcl 1 () ("b", 1) "a";
+dcl 2 () ("b", 1) "a";
+dcl 3 (1, 2) ("b", 1) "a";
+draw drv_tree;
+endfig;
+
+drv_scale (ilb, 4);
+
+beginfig(293)
+dcl 1 () ("b", 1) "a";
+dcl 2 () ("b", 1) "a";
+dcl 3 (1, 2) ("b", 1) "a";
+draw drv_tree;
+endfig;
+
+drv_scale (ilb, 1);
+
+%
+% drv_junction_style
+%
+
+path azerty[];
+
+drv_junction_style 0;
+
+beginfig(300)
+dcl 1 () ("", 1) "aaaaaaaaaaaa";
+dcl 2 (1) ("", 1) "a";
+dcl 3 (2) ("", 1) "a";
+dcl 4 (3) ("", 1) "a";
+dcl 5 (4) ("", 1) "aaaaaa";
+dcl 6 () ("", 1) "aaaaaa";
+dcl 7 (6) ("", 1) "a";
+dcl 8 (7) ("", 1) "a";
+dcl 9 (5, 8) ("", 1) "a";
+draw drv_tree;
+endfig;
+
+drv_junction_style 1;
+
+beginfig(301)
+dcl 1 () ("", 1) "aaaaaaaaaaaa";
+dcl 2 (1) ("", 1) "a";
+dcl 3 (2) ("", 1) "a";
+dcl 4 (3) ("", 1) "a";
+dcl 5 (4) ("", 1) "aaaaaa";
+dcl 6 () ("", 1) "aaaaaa";
+dcl 7 (6) ("", 1) "a";
+dcl 8 (7) ("", 1) "a";
+dcl 9 (5, 8) ("", 1) "a";
+draw drv_tree;
+draw auxbox[8] withcolor .9(1, 1, 1);
+endfig;
+
+drv_junction_style 2;
+
+beginfig(302)
+dcl 1 () ("", 1) "aaaaaaaaaaaa";
+dcl 2 (1) ("", 1) "a";
+dcl 3 (2) ("", 1) "a";
+dcl 4 (3) ("", 1) "a";
+dcl 5 (4) ("", 1) "aaaaaa";
+dcl 6 () ("", 1) "aaaaaa";
+dcl 7 (6) ("", 1) "a";
+dcl 8 (7) ("", 1) "a";
+dcl 9 (5, 8) ("", 1) "a";
+draw drv_tree;
+draw auxbox[5] withcolor .9(1, 1, 1);
+draw auxbox[8] withcolor .9(1, 1, 1);
+endfig;
+
+drv_junction_style 1;
+
+%
+% drv_alignment_style
+%
+
+drv_alignment_style l;
+
+beginfig(310)
+dcl 1 () ("", 1) "a";
+dcl 2 () ("", 1) "a";
+dcl 3 (1, 2) ("", 1) "a";
+dcl 4 () ("", 1) "a";
+dcl 5 () ("", 1) "a";
+dcl 6 (4, 5) ("", 1) "a";
+dcl 7 (3, 6) ("", 1) "a";
+draw drv_tree;
+endfig;
+
+drv_alignment_style c;
+
+beginfig(311)
+dcl 1 () ("", 1) "a";
+dcl 2 () ("", 1) "a";
+dcl 3 (1, 2) ("", 1) "a";
+dcl 4 () ("", 1) "a";
+dcl 5 () ("", 1) "a";
+dcl 6 (4, 5) ("", 1) "a";
+dcl 7 (3, 6) ("", 1) "a";
+draw drv_tree;
+endfig;
+
+drv_alignment_style r;
+
+beginfig(312)
+dcl 1 () ("", 1) "a";
+dcl 2 () ("", 1) "a";
+dcl 3 (1, 2) ("", 1) "a";
+dcl 4 () ("", 1) "a";
+dcl 5 () ("", 1) "a";
+dcl 6 (4, 5) ("", 1) "a";
+dcl 7 (3, 6) ("", 1) "a";
+draw drv_tree;
+endfig;
+
+drv_alignment_style c;
+
+%
+% drv_labels_position
+%
+
+drv_labels_position l;
+
+beginfig(320)
+dcl 1 () ("b", 1) "a";
+dcl 2 () ("b", 1) "a";
+dcl 3 (1, 2) ("b", 1) "a";
+draw drv_tree;
+endfig;
+
+drv_labels_position r;
+
+beginfig(321)
+dcl 1 () ("b", 1) "a";
+dcl 2 () ("b", 1) "a";
+dcl 3 (1, 2) ("b", 1) "a";
+draw drv_tree;
+endfig;
+
+%
+% drv_roots_position
+%
+
+drv_roots_position t;
+
+beginfig(330)
+dcl 1 () ("", 1) "a";
+dcl 2 () ("", 1) "a";
+dcl 3 (1, 2) ("", 1) "a";
+dcl 4 () ("", 1) "a";
+dcl 5 () ("", 1) "a";
+dcl 6 (4, 5) ("", 1) "a";
+dcl 7 (3, 6) ("", 1) "a";
+draw drv_tree;
+drv_axis (iln, 3);
+endfig;
+
+drv_roots_position b;
+
+beginfig(331)
+dcl 1 () ("", 1) "a";
+dcl 2 () ("", 1) "a";
+dcl 3 (1, 2) ("", 1) "a";
+dcl 4 () ("", 1) "a";
+dcl 5 () ("", 1) "a";
+dcl 6 (4, 5) ("", 1) "a";
+dcl 7 (3, 6) ("", 1) "a";
+draw drv_tree;
+endfig;
+
+%
+% drv_axis_reference
+%
+
+beginfig(340)
+dcl 1 () ("", 1) "a";
+dcl 2 () ("", 1) "a";
+dcl 3 (1, 2) ("", 1) "a";
+draw drv_tree;
+endfig;
+
+drv_axis_reference jdg;
+
+beginfig(341)
+dcl 1 () ("", 1) "a";
+dcl 2 () ("", 1) "a";
+dcl 3 (1, 2) ("", 1) "a";
+draw drv_tree;
+endfig;
+
+drv_axis_reference iln;
+
+%
+% drv_left_delimiter
+%
+
+drv_left_delimiter "(";
+
+beginfig(350)
+dcl 1 () ("", 1) "a";
+Dcl 2 (1) ("", "", "B", 1) "c";
+dcl 3 () ("", 1) "d";
+Dcl 4 (2, 3) ("", "E", "", 1) "f";
+draw drv_tree;
+endfig;
+
+drv_left_delimiter "\lfloor";
+
+beginfig(351)
+dcl 1 () ("", 1) "a";
+Dcl 2 (1) ("", "", "B", 1) "c";
+dcl 3 () ("", 1) "d";
+Dcl 4 (2, 3) ("", "E", "", 1) "f";
+draw drv_tree;
+endfig;
+
+drv_left_delimiter ".";
+
+beginfig(352)
+dcl 1 () ("", 1) "a";
+Dcl 2 (1) ("", "", "B", 1) "c";
+dcl 3 () ("", 1) "d";
+Dcl 4 (2, 3) ("", "E", "", 1) "f";
+draw drv_tree;
+endfig;
+
+drv_left_delimiter "\lbrace";
+
+%
+% drv_right_delimiter
+%
+
+drv_right_delimiter "\rangle";
+
+beginfig(360)
+dcl 1 () ("", 1) "a";
+Dcl 2 (1) ("", "", "B", 1) "c";
+dcl 3 () ("", 1) "d";
+Dcl 4 (2, 3) ("", "E", "", 1) "f";
+draw drv_tree;
+endfig;
+
+drv_right_delimiter "\uparrow";
+
+beginfig(361)
+dcl 1 () ("", 1) "a";
+Dcl 2 (1) ("", "", "B", 1) "c";
+dcl 3 () ("", 1) "d";
+Dcl 4 (2, 3) ("", "E", "", 1) "f";
+draw drv_tree;
+endfig;
+
+drv_right_delimiter ".";
+
+beginfig(362)
+dcl 1 () ("", 1) "a";
+Dcl 2 (1) ("", "", "B", 1) "c";
+dcl 3 () ("", 1) "d";
+Dcl 4 (2, 3) ("", "E", "", 1) "f";
+draw drv_tree;
+endfig;
+
+drv_right_delimiter "\rbrace";
+
+%
+% drv_box_mode
+%
+
+drv_box_mode on;
+
+beginfig(370)
+dcl 0 () ("", 1) "aaaaa";
+dcl 1 () ("", 1) "aaaaaaa";
+dcl 2 (1) ("", 1) "a";
+dcl 3 (2) ("", 1) "a";
+dcl 4 (0, 3) ("", 1) "a";
+draw drv_tree;
+endfig;
+
+beginfig(371)
+dcl 0 () ("", 1) "aaaaa";
+dcl 1 () ("", 1) "aaaaaaa";
+dcl 2 (1) ("", 1) "a";
+dcl 3 (2) ("", 1) "a";
+dcl 4 (0, 3) ("", 1) "a";
+draw drv_tree;
+for idx=0, 1, 2, 3:
+ draw auxbox[idx] withcolor (1, 0, 0);
+endfor
+endfig;
+
+drv_box_mode off;
+
+beginfig(372)
+dcl 0 () ("", 1) "aaaaa";
+dcl 1 () ("", 1) "aaaaaaa";
+dcl 2 (1) ("", 1) "a";
+dcl 3 (2) ("", 1) "a";
+dcl 4 (0, 3) ("", 1) "a";
+draw drv_tree;
+endfig;
+
+%
+% drv_fraction_mode
+%
+
+beginfig(380)
+jgm 0 "\overbrace{A, \Gamma\vdash B}";
+jgm 1 "B, \Delta\vdash C";
+jgm 2 "A, \Gamma, \Delta\vdash C";
+jgm 3 "\Gamma, \Delta\vdash A\to C";
+nfr 0 () ("", 0);
+nfr 1 () ("", 1);
+nfr 2 (0, 1) ("\text{cut}", 1);
+nfr 3 (2) ("\to_R", 1);
+draw drv_tree;
+endfig;
+
+drv_fraction_mode off;
+
+beginfig(381)
+jgm 0 "\overbrace{A, \Gamma\vdash B}";
+jgm 1 "B, \Delta\vdash C";
+jgm 2 "A, \Gamma, \Delta\vdash C";
+jgm 3 "\Gamma, \Delta\vdash A\to C";
+nfr 0 () ("", 0);
+nfr 1 () ("", 1);
+nfr 2 (0, 1) ("\text{cut}", 1);
+nfr 3 (2) ("\to_R", 1);
+draw drv_tree;
+endfig;
+
+drv_fraction_mode on;
+
+beginfig(382)
+jgm 0 "\overbrace{A, \Gamma\vdash B}";
+jgm 1 "B, \Delta\vdash C";
+jgm 2 "A, \Gamma, \Delta\vdash C";
+jgm 3 "\Gamma, \Delta\vdash A\to C";
+nfr 0 () ("", 1);
+nfr 1 () ("", 1);
+nfr 2 (0, 1) ("\text{cut}", 1);
+nfr 3 (2) ("\to_R", 1);
+draw drv_tree;
+unfill bbox iln[0];
+draw iln[0] withcolor (1, 0, 0);
+endfig;
+
+%
+% drv_proof_mode
+%
+
+drv_proof_mode on;
+
+beginfig(390)
+jgm 0 "A", "\vdash", "A";
+jgm 1 "B", "\vdash", "B";
+jgm 2 "A", ",", "A", "\multimap", "B", "\vdash", "B";
+jgm 3 "A", "\multimap", "B", "\vdash", "A", "\multimap", "B";
+nfr 0 () ("1", 1);
+nfr 1 () ("1", 1);
+nfr 2 (0, 1) ("\multimap_{L}", 1);
+nfr 3 (2) ("\multimap_{R}", 1);
+draw drv_tree;
+endfig;
+
+drv_proof_mode off;
+
+beginfig(391)
+jgm 0 "A", "\vdash", "A";
+jgm 1 "B", "\vdash", "B";
+jgm 2 "A", ",", "A", "\multimap", "B", "\vdash", "B";
+jgm 3 "A", "\multimap", "B", "\vdash", "A", "\multimap", "B";
+nfr 0 () ("1", 1);
+nfr 1 () ("1", 1);
+nfr 2 (0, 1) ("\multimap_{L}", 1);
+nfr 3 (2) ("\multimap_{R}", 1);
+draw drv_tree;
+endfig;
+
+%
+% a fraction
+%
+
+drv_math_style (drv, "\textstyle");
+drv_scale (jgm, 0);
+
+beginfig(400)
+dcl 0 ( ) ("", 0) "\gamma";
+dcl 1 (0) ("", 1) "\delta";
+draw drv_tree;
+endfig;
+
+drv_math_style (drv, "\displaystyle");
+drv_scale (jgm, 1);
+
+%
+% drv_bbox
+%
+
+beginfig(410)
+dcl 0 (1, 5) ("", _) "a";
+ dcl 1 (2, 3, 4) ("", _) "b";
+ dcl 2 () ("", _) "c";
+ dcl 3 () ("", _) "d";
+ dcl 4 () ("", _) "e";
+ dcl 5 () ("", _) "f";
+fill drv_bbox 1 withcolor (255, 230, 205)/255; % rgb color
+draw drv_tree;
+endfig;
+
+beginfig(411)
+dcl 0 (bxd 1, 5) ("", _) "a";
+ dcl 1 (2, 3, 4) ("", _) "b";
+ dcl 2 () ("", _) "c";
+ dcl 3 () ("", _) "d";
+ dcl 4 () ("", _) "e";
+ dcl 5 () ("", _) "f";
+fill drv_bbox 1 withcolor (255, 230, 205)/255; % rgb color
+draw drv_tree;
+endfig;
+
+%
+% drv_axis
+%
+
+beginfig(420)
+Dcl 0 ( ) ("", "", "", _) "a";
+Dcl 1 (0) ("", "{}", "", _) "b";
+draw drv_tree;
+drv_axis (iln, 0);
+endfig;
+
+beginfig(421)
+Dcl 0 ( ) ("", "", "", _) "a";
+Dcl 1 (0) ("", "{}", "", _) "b";
+draw drv_tree;
+drv_axis (jdg, 1);
+endfig;
+
+beginfig(422)
+Dcl 0 ( ) ("", "", "", _) "a";
+Dcl 1 (0) ("", "{}", "", _) "b";
+draw drv_tree;
+drv_axis (dlm, 1);
+endfig;
+
+%
+% NFR
+%
+
+beginfig(430)
+jgm 0 "a";
+NFR 0 () ("1", "2", "3", "4", _, _, _);
+draw drv_tree;
+endfig;
+
+%
+% DCL
+%
+
+beginfig(440)
+DCL 0 () ("1", "", "", "", _, _, _) "a";
+DCL 1 () ("", "2", "", "", _, _, _) "b";
+DCL 2 (0, 1) ("", "", "3", "", _, _, _) "c";
+DCL 3 (2) ("", "", "", "4", _, _, _) "d";
+draw drv_tree;
+endfig;
+
+%
+% MVD
+%
+
+beginfig(450)
+jgm 0 "aaaaaa";
+jgm 1 "aaa";
+jgm 2 "a";
+jgm 3 "aaaaaaaaa";
+jgm 4 "a";
+nfr 0 () ("", _);
+NFR 1 () ("", "", "", "", _, _, _);
+nfr 2 (MVD 0 (2, "A", "", l, 3), 1) ("", _);
+nfr 3 () ("", _);
+nfr 4 (2, MVD 3 (5, "", "A", r, 4)) ("", _);
+draw drv_tree;
+endfig;
+
+beginfig(460)
+jgm 0 "\textsc{Size matters -- Part 2}";
+jgm 1 "\text{Here is an even longer judgment"&
+ " that I don't want to shorten either.}";
+jgm 2 "\text{This time I'm pretty sure that the"&
+ " derivation tree won't fit on the page.}";
+jgm 3 "\text{It does! Amazing.}";
+nfr 0 () ("", 0);
+nfr 1 (0) ("", 1);
+nfr 2 () ("", 1);
+nfr 3 (MVD 1 (2, "", "", l, 3), 2) ("", 1);
+draw drv_tree;
+endfig;
+
+%
+% Components and central points
+%
+
+drv_font_size "\large";
+
+beginfig(470) % components
+DCL 6 () ("", "", "", "", _, _, 0) "0";
+DCL 7 (6) ("(1)", "(2)", "(3)", "(4)", _, _, 1) "A", "B";
+drv_freeze; % usually called by drv_tree
+draw jdg[6]; % judgment 0
+draw sbj[7][0] withcolor (0, 0, 1); % sub-judgment A
+draw sbj[7][1] withcolor (0, 1, 0); % sub-judgment B
+draw l_ilb[7] withcolor (0, 1, 1); % left inference label (1)
+draw r_ilb[7] withcolor (1, 0, 0); % right inference label (2)
+draw l_dlb[7] withcolor (1, 0, 1); % left delimiter label (3)
+draw r_dlb[7] withcolor (1, 1, 0); % right delimiter label (4)
+draw l_dlm[7]; % left delimiter
+draw iln[7]; % inference line
+draw r_dlm[7]; % right delimiter
+endfig;
+
+beginfig(471) % central points
+DCL 6 () ("", "", "", "", _, _, 0) "0";
+DCL 7 (6) ("(1)", "(2)", "(3)", "(4)", _, _, 1) "A", "B";
+pickup pencircle scaled 2.5;
+draw drv_tree withcolor .75(1, 1, 1);
+draw jdg[6].c; % judgment 0
+draw sbj[7][0].c withcolor (0, 0, 1); % sub-judgment A
+draw sbj[7][1].c withcolor (0, 1, 0); % sub-judgment B
+draw l_ilb[7].c withcolor (0, 1, 1); % left inference label (1)
+draw r_ilb[7].c withcolor (1, 0, 0); % right inference label (2)
+draw l_dlb[7].c withcolor (1, 0, 1); % left delimiter label (3)
+draw r_dlb[7].c withcolor (1, 1, 0); % right delimiter label (4)
+draw l_dlm[7].c; % left delimiter
+draw iln[7].c; % inference line
+draw r_dlm[7].c; % right delimiter
+endfig;
+
+drv_font_size "\normalsize";
+
+%
+% Dimensions
+%
+
+vardef aux_drawdblarrow expr pth=
+save ah;
+path ah;
+ah:=ahlength*(dir (180-ahangle/2))--(0, 0)--
+ ahlength*(dir (180+ahangle/2));
+if direction infinity of pth<>(0, 0):
+ draw pth;
+ draw ah rotated (angle (direction infinity of pth))
+ shifted (point infinity of pth);
+ draw ah rotated (180+angle (direction -infinity of pth))
+ shifted (point -infinity of pth);
+fi
+enddef;
+
+drv_box
+ "jdg_ma[]",
+ "jdg_cp[]",
+ "jdg_hg[]",
+ "jdg_dp[]",
+ "iln_cp[]",
+ "n_hg",
+ "d_dp";
+for idx=0, 1:
+ box_init jdg_ma[idx](mth_tex[1]"\textit{math axis}");
+ box_init jdg_cp[idx](mth_tex[2]"\texttt{jdg["&decimal idx&"].c}");
+ box_init jdg_hg[idx](mth_tex[1]"\texttt{jdg["&decimal idx&"].hg}");
+ box_init jdg_dp[idx](mth_tex[1]"\texttt{jdg["&decimal idx&"].dp}");
+ box_init iln_cp[idx](mth_tex[2]"\texttt{iln["&decimal idx&"].c}");
+endfor
+box_init n_hg(mth_tex[1]"\texttt{num\_hg}");
+box_init d_dp(mth_tex[1]"\texttt{den\_dp}");
+
+drv_font_size "\fontsize{95}{0}";
+
+beginfig(480)
+dcl 0 () ("", 0) "\gamma";
+dcl 1 (0) ("", 1) "\delta";
+draw drv_tree withcolor .75*background;
+interim linejoin:=beveled;
+interim ahangle:=60;
+lref[0]:=xpart iln[1].l-20pt;
+lref[1]:=xpart iln[1].l-10pt;
+lref[2]:=xpart iln[1].l-25pt;
+rref[0]:=xpart iln[1].r+20pt;
+rref[1]:=xpart iln[1].r+10pt;
+rref[2]:=xpart iln[1].r+25pt;
+for idx=0, 1:
+ forsuffixes sfx=l, c ,r:
+ draw jdg[idx].sfx withpen pencircle scaled 2.5;
+ endfor
+ lx[idx]:=xpart jdg[idx].l;
+ rx[idx]:=xpart jdg[idx].r;
+ ty[idx]:=ypart jdg[idx].c+jdg[idx].hg;
+ cy[idx]:=ypart jdg[idx].c;
+ by[idx]:=ypart jdg[idx].c+jdg[idx].dp;
+ for pth=
+ (lx[idx], ty[idx])--(rref[0], ty[idx]),
+ (lref[0], cy[idx])--(rref[0], cy[idx]),
+ (lx[idx], by[idx])--(rref[0], by[idx]),
+ (lx[idx], ty[idx])--(lx[idx], by[idx]),
+ (rx[idx], ty[idx])--(rx[idx], by[idx]):
+ draw pth dashed evenly scaled .5;
+ endfor
+ for pth=
+ (rref[1], ty[idx])--(rref[1], cy[idx]),
+ (rref[1], cy[idx])--(rref[1], by[idx]):
+ aux_drawdblarrow pth;
+ endfor
+ jdg_ma[idx].r=(lref[2], cy[idx]);
+ jdg_cp[idx].c=jdg[idx].c shifted (0, -7.5pt);
+ jdg_hg[idx].l=(rref[2], (ty[idx]+cy[idx])/2);
+ jdg_dp[idx].l=(rref[2], (cy[idx]+by[idx])/2);
+ forsuffixes sfx=jdg_ma, jdg_cp, jdg_hg, jdg_dp:
+ box_freeze sfx[idx];
+ draw sfx[idx];
+ endfor
+endfor
+draw iln[1].c withpen pencircle scaled 2.5;
+iln_cp[1].c=iln[1].c shifted (0, -7.5pt);
+box_freeze iln_cp[1];
+draw iln_cp[1];
+iln_y:=ypart iln[1].c;
+draw (lref[0], iln_y)--(rref[0], iln_y) dashed evenly scaled .5;
+aux_drawdblarrow (lref[1], cy[0])--(lref[1], iln_y);
+aux_drawdblarrow (lref[1], iln_y)--(lref[1], cy[1]);
+n_hg.r=(lref[2], (cy[0]+iln_y)/2);
+d_dp.r=(lref[2], (iln_y+cy[1])/2);
+forsuffixes sfx=n_hg, d_dp:
+ box_freeze sfx;
+ draw sfx;
+endfor
+endfig;
+
+drv_font_size "\normalsize";
+
+%
+% drv_styled
+%
+
+beginfig(490)
+jgm 4 "A", "\vdash", "A";
+jgm 5 "B", "\vdash", "B";
+jgm 6 "A", ",", "A", "\multimap", "B", "\vdash", "B";
+jgm 7 "A", "\multimap", "B", "\vdash", "A", "\multimap", "B";
+nfr 4 () ("1", _);
+nfr 5 () ("1", _);
+nfr 6 (4, 5) ("\multimap_{L}", _);
+nfr 7 (6) ("\multimap_{R}", _);
+drv_freeze;
+draw (sbj[7][2].c shifted (0, -num_hg) ..
+ sbj[7][2].c {up} ..
+ sbj[6][4].c ..
+ sbj[5][0].c .. tension 1.05 ..
+ sbj[5][2].c ..
+ sbj[6][6].c ..
+ sbj[7][6].c {down} ..
+ sbj[7][6].c shifted (0, -num_hg))
+drv_styled 2 withcolor (1, 0, 0);
+draw drv_tree;
+endfig;
+
+%
+% ``User specified'' junction style
+%
+
+beginfig(500)
+jgm 0 "{\cdot}";
+jgm 1 "{\cdot}";
+jgm 2 "\text{You may check that the distance"&
+ " between the two dots above is 5 cm.}";
+NFR 0 () ("", "", "", "", _, _, _);
+NFR 1 () ("", "", "", "", _, _, _);
+NFR 2 (0, 1) ("", "", "", "", 3, _, _); % caution: 3
+xpart jdg[1].c=xpart jdg[0].c+5cm;
+draw drv_tree;
+endfig;
+
+%
+% ``User specified'' alignment style
+%
+
+beginfig(510) % "\vdash":
+jgm 0 "B, A, \Gamma", "\vdash", "C"; % sbj[0][1]
+jgm 1 "A, \Gamma", "\vdash", "B\multimap C"; % sbj[1][1]
+jgm 2 "\Gamma", "\vdash", "A\multimap(B\multimap C)"; % sbj[2][1]
+NFR_opt 0 () () () (_, _, 0);
+NFR_opt 1 (0) ("\multimap_R") () (_, u, 1); % caution: u
+NFR_opt 2 (1) ("\multimap_R") () (_, u, 1); % caution: u
+xpart sbj[1][1].c=xpart sbj[0][1].c;
+xpart sbj[2][1].c=xpart sbj[1][1].c;
+draw drv_tree;
+endfig;
+
+beginfig(511) % "\vdash":
+jgm 0 "B, A, \Gamma", "\vdash", "C"; % sbj[0][1]
+jgm 1 "A, \Gamma", "\vdash", "B\multimap C"; % sbj[1][1]
+jgm 2 "\Gamma", "\vdash", "A\multimap(B\multimap C)"; % sbj[2][1]
+NFR_opt 0 () () () (_, _, 0);
+NFR_opt 1 (0) ("\multimap_R") () (_, u, 1); % caution: u
+NFR_opt 2 (1) ("\multimap_R") () (_, u, 1); % caution: u
+xpart sbj[1][1].l=xpart sbj[0][1].r;
+xpart sbj[2][1].l=xpart sbj[1][1].r;
+draw drv_tree;
+endfig;
+
+%
+% debugging
+%
+
+beginfig(520)
+jgm 0 "A\vdash B";
+jgm 1 "B\vdash C";
+jgm 2 "A\vdash C";
+jgm 3 "C\vdash D";
+jgm 4 "A\vdash D";
+nfr 0 () ("f", _);
+nfr 1 () ("g", _);
+nfr 2 (0, 1) ("\circ", _);
+nfr 3 () ("h", _);
+nfr 4 (2, 3) ("\circ", _);
+draw drv_tree;
+endfig;
+
+%
+% example - Restall
+%
+
+string Lor, Ror[], Land[], Rand;
+Lor:="\vee L";
+Ror1:="\vee R_1";
+Ror2:="\vee R_2";
+Land1:="\wedge L_1";
+Land2:="\wedge L_2";
+Rand:="\wedge R";
+
+beginfig(530)
+jgm 0 "p\wedge(q\vee(r_1\wedge r_2))\vdash p\wedge(q\vee(r_1\wedge r_2))";
+ jgm 1 "p\wedge(q\vee(r_1\wedge r_2))\vdash p";
+ jgm 2 "p\vdash p";
+ jgm 3 "p\wedge(q\vee(r_1\wedge r_2))\vdash q\vee(r_1\wedge r_2)";
+ jgm 4 "q\vee(r_1\wedge r_2)\vdash q\vee(r_1\wedge r_2)";
+ jgm 5 "q\vdash q\vee(r_1\wedge r_2)";
+ jgm 6 "q\vdash q";
+ jgm 7 "r_1\wedge r_2\vdash q\vee(r_1\wedge r_2)";
+ jgm 8 "r_1\wedge r_2\vdash r_1\wedge r_2";
+ jgm 9 "r_1\wedge r_2\vdash r_1";
+ jgm 10 "r_1\vdash r_1";
+ jgm 11 "r_1\wedge r_2\vdash r_2";
+ jgm 12 "r_2\vdash r_2";
+nfr 0 (1, 3) (Rand, 1);
+ nfr 1 (2) (Land1, 1);
+ nfr 2 () ("", 0);
+ nfr 3 (bxd 4) (Land2, 1); % fig. 531 -> nfr 3 (mvd 4 (1, 3))
+ nfr 4 (5, 7) (Lor, 1); % fig. 531 -> Nfr
+ nfr 5 (6) (Ror1, 1);
+ nfr 6 () ("", 0);
+ nfr 7 (bxd 8) (Ror2, 1); % fig. 531 -> nfr 7 (mvd 8 (1, 3))
+ nfr 8 (9, 11) (Rand, 1); % fig. 531 -> Nfr
+ nfr 9 (10) (Land1, 1);
+ nfr 10 () ("", 0);
+ nfr 11 (12) (Land2, 1);
+ nfr 12 () ("", 0);
+fill drv_bbox 4 withcolor (255, 230, 205)/255;
+fill drv_bbox 8 withcolor (236, 211, 185)/255;
+draw drv_tree;
+endfig;
+
+beginfig(531)
+jgm 0 "p\wedge(q\vee(r_1\wedge r_2))\vdash p\wedge(q\vee(r_1\wedge r_2))";
+ jgm 1 "p\wedge(q\vee(r_1\wedge r_2))\vdash p";
+ jgm 2 "p\vdash p";
+ jgm 3 "p\wedge(q\vee(r_1\wedge r_2))\vdash q\vee(r_1\wedge r_2)";
+ jgm 4 "q\vee(r_1\wedge r_2)\vdash q\vee(r_1\wedge r_2)";
+ jgm 5 "q\vdash q\vee(r_1\wedge r_2)";
+ jgm 6 "q\vdash q";
+ jgm 7 "r_1\wedge r_2\vdash q\vee(r_1\wedge r_2)";
+ jgm 8 "r_1\wedge r_2\vdash r_1\wedge r_2";
+ jgm 9 "r_1\wedge r_2\vdash r_1";
+ jgm 10 "r_1\vdash r_1";
+ jgm 11 "r_1\wedge r_2\vdash r_2";
+ jgm 12 "r_2\vdash r_2";
+nfr 0 (1, 3) (Rand, 1);
+ nfr 1 (2) (Land1, 1);
+ nfr 2 () ("", 0);
+ nfr 3 (mvd 4 (1, 3)) (Land2, 1);
+ Nfr 4 (5, 7) (Lor, "\text{Id\,}_{q\vee(r_1\wedge r_2)}", "", 1);
+ nfr 5 (6) (Ror1, 1);
+ nfr 6 () ("", 0);
+ nfr 7 (mvd 8 (1, 3)) (Ror2, 1);
+ Nfr 8 (9, 11) (Rand, "\text{Id\,}_{r_1\wedge r_2}", "", 1);
+ nfr 9 (10) (Land1, 1);
+ nfr 10 () ("", 0);
+ nfr 11 (12) (Land2, 1);
+ nfr 12 () ("", 0);
+fill drv_bbox 4 withcolor (255, 230, 205)/255;
+fill drv_bbox 8 withcolor (236, 211, 185)/255;
+draw drv_tree;
+endfig;
+
+%
+% example - Roegel
+%
+
+drv_junction_style 0;
+drv_scale (jdg, 0.85);
+drv_scale (prm, 0.85);
+
+vardef mix[]=
+ "\textit{mix}("&(decimal @)&")"
+enddef;
+
+beginfig(540)
+jgm 0 "\Gamma_A, \Gamma'\vdash\Delta, \Delta'_A";
+ jgm 1 "\Gamma_A, \Gamma', \Gamma_A, \Gamma', \Gamma_A, \Gamma'\vdash"&
+ "\Delta, \Delta'_A, \Delta, \Delta'_A, \Delta, \Delta'_A";
+ jgm 2 "\Gamma_A, \Gamma', \Gamma_A\vdash"& % a space character is
+ " C, \Delta, \Delta'_A, \Delta, \Delta'_A"; % needed before 'C'!
+ jgm 3 "\Gamma_A, \Gamma'\vdash B, C, \Delta, \Delta'_A";
+ jgm 4 "\Gamma, B\vee C\vdash \Delta";
+ jgm 5 "\Gamma, B\vdash \Delta";
+ jgm 6 "\Pi_1";
+ jgm 7 "\Gamma, C\vdash \Delta";
+ jgm 8 "\Pi_2";
+ jgm 9 "\Gamma'\vdash B, C, \Delta'";
+ jgm 10 "\Pi_3";
+ jgm 11 "\Gamma_A, \Gamma', B\vdash\Delta, \Delta'_A";
+ jgm 12 "\Gamma, B\vdash \Delta";
+ jgm 13 "\Pi_1";
+ jgm 14 "\Gamma'\vdash B\vee C, \Delta'";
+ jgm 15 "\Gamma'\vdash B, C, \Delta'";
+ jgm 16 "\Pi_3";
+ jgm 17 "\Gamma_A, \Gamma', C\vdash\Delta, \Delta'_A";
+ jgm 18 "\Gamma, C\vdash \Delta";
+ jgm 19 "\Pi_2";
+ jgm 20 "\Gamma'\vdash B\vee C, \Delta'";
+ jgm 21 "\Gamma'\vdash B, C, \Delta'";
+ jgm 22 "\Pi_3";
+nfr 0 (1) ("\text{contr$_g$, contr$_d$}", 1);
+ nfr 1 (2, 17) (mix5, 1);
+ nfr 2 (mvd 3 (5, 6), 11) (mix3 , 1);
+ nfr 3 (4, 9) (mix1, 1);
+ nfr 4 (5, 7) ("\vee_g", 1);
+ nfr 5 (mvd 6 (1, 6)) ("", 0);
+ nfr 6 () ("", 0);
+ nfr 7 (mvd 8 (1, 6)) ("", 0);
+ nfr 8 () ("", 0);
+ nfr 9 (mvd 10 (1, 6)) ("", 0);
+ nfr 10 () ("", 0);
+ nfr 11 (12, 14) ("", 1);
+ nfr 12 (mvd 13 (1, 6)) ("", 0);
+ nfr 13 () ("", 0);
+ nfr 14 (15) ("", 1);
+ nfr 15 (mvd 16 (1, 6)) ("", 0);
+ nfr 16 () ("", 0);
+ nfr 17 (18, 20) (mix4, 1);
+ nfr 18 (mvd 19 (1, 6)) ("", 0);
+ nfr 19 () ("", 0);
+ nfr 20 (21) ("\vee_d", 1);
+ nfr 21 (mvd 22 (1, 6)) ("", 0);
+ nfr 22 () ("", 0);
+draw drv_tree;
+endfig;
+
+drv_junction_style 1;
+drv_scale (jdg, 1);
+drv_scale (prm, 1);
+
+%
+% example - Lutz
+%
+
+drv_math_style (ilb, "\textstyle");
+drv_labels_position (ilb, l);
+drv_scale (clr, 1.5);
+
+string neg, par, otm;
+neg:="^\bot";
+par:="\mathbin{\bindnasrepma}"; % from stmaryrd.sty
+otm:="\otimes";
+
+beginfig(550)
+ % 0 1 2 3 4 5 6 7 8 9
+jgm 0 "a", neg, par, "a";
+jgm 1 "a", neg, par, "(", "a", otm, "(", "a", par, "a", neg, ")", ")";
+jgm 2 "a", neg, par, "(", "a", otm, "a", ")", par, "a", neg;
+jgm 3 "a", neg, par, "(", "a", otm, "a", ")", par, "(",
+ "(", "a", par, "a", neg, ")", otm, "a", neg, ")";
+jgm 4 "a", neg, par, "(", "a", otm, "a", ")", par, "a",
+ par, "(", "a", neg, otm, "a", neg, ")";
+nfr 0 ( ) ("\textsf{id}", 1);
+nfr 1 (0) ("\textsf{id}", 1);
+nfr 2 (1) ("\textsf{s}", 1);
+nfr 3 (2) ("\textsf{id}", 1);
+nfr 4 (3) ("\textsf{s}", 1);
+drv_freeze;
+drawoptions (withpen drv_pen scaled 2 withcolor (255, 94, 94)/255);
+draw
+ sbj[4][12].c shifted (0, -num_hg) .. {up}
+ sbj[4][12].c ..
+ sbj[3][13].c .. tension .9 ..
+ sbj[3][11].c ..
+ sbj[4][9].c {down} ..
+ sbj[4][9].c shifted (0, -num_hg);
+draw
+ sbj[4][15].c shifted (0, -num_hg) .. {up}
+ sbj[4][15].c ..
+ sbj[3][17].c .. tension 1.2 ..
+ sbj[2][9].c ..
+ sbj[1][9].c {up} .. tension 1.5.. {down}
+ sbj[1][7].c ..
+ sbj[2][6].c .. tension 1.2 ..
+ sbj[3][6].c ..
+ sbj[4][6].c {down} ..
+ sbj[4][6].c shifted (0, -num_hg);
+draw
+ sbj[4][0].c shifted (0, -num_hg) .. {up}
+ sbj[4][0].c ..
+ sbj[3][0].c .. tension 1.2 ..
+ sbj[2][0].c ..
+ sbj[1][0].c .. tension 1.2 ..
+ sbj[0][0].c {up} .. tension 1.8.. {down}
+ sbj[0][3].c .. tension 1.2 ..
+ sbj[1][4].c ..
+ sbj[2][4].c .. tension 1.2 ..
+ sbj[3][4].c ..
+ sbj[4][4].c {down} ..
+ sbj[4][4].c shifted (0, -num_hg);
+drawoptions ();
+draw drv_tree; % fig. 551 -> draw jdg[4];
+endfig;
+
+beginfig(551)
+ % 0 1 2 3 4 5 6 7 8 9
+jgm 0 "a", neg, par, "a";
+jgm 1 "a", neg, par, "(", "a", otm, "(", "a", par, "a", neg, ")", ")";
+jgm 2 "a", neg, par, "(", "a", otm, "a", ")", par, "a", neg;
+jgm 3 "a", neg, par, "(", "a", otm, "a", ")", par, "(",
+ "(", "a", par, "a", neg, ")", otm, "a", neg, ")";
+jgm 4 "a", neg, par, "(", "a", otm, "a", ")", par, "a",
+ par, "(", "a", neg, otm, "a", neg, ")";
+nfr 0 ( ) ("\textsf{id}", 1);
+nfr 1 (0) ("\textsf{id}", 1);
+nfr 2 (1) ("\textsf{s}", 1);
+nfr 3 (2) ("\textsf{id}", 1);
+nfr 4 (3) ("\textsf{s}", 1);
+drv_freeze;
+drawoptions (withpen drv_pen scaled 2 withcolor (255, 94, 94)/255);
+draw
+ sbj[4][12].c shifted (0, -num_hg) .. {up}
+ sbj[4][12].c ..
+ sbj[3][13].c .. tension .9 ..
+ sbj[3][11].c ..
+ sbj[4][9].c {down} ..
+ sbj[4][9].c shifted (0, -num_hg);
+draw
+ sbj[4][15].c shifted (0, -num_hg) .. {up}
+ sbj[4][15].c ..
+ sbj[3][17].c .. tension 1.2 ..
+ sbj[2][9].c ..
+ sbj[1][9].c {up} .. tension 1.5.. {down}
+ sbj[1][7].c ..
+ sbj[2][6].c .. tension 1.2 ..
+ sbj[3][6].c ..
+ sbj[4][6].c {down} ..
+ sbj[4][6].c shifted (0, -num_hg);
+draw
+ sbj[4][0].c shifted (0, -num_hg) .. {up}
+ sbj[4][0].c ..
+ sbj[3][0].c .. tension 1.2 ..
+ sbj[2][0].c ..
+ sbj[1][0].c .. tension 1.2 ..
+ sbj[0][0].c {up} .. tension 1.8.. {down}
+ sbj[0][3].c .. tension 1.2 ..
+ sbj[1][4].c ..
+ sbj[2][4].c .. tension 1.2 ..
+ sbj[3][4].c ..
+ sbj[4][4].c {down} ..
+ sbj[4][4].c shifted (0, -num_hg);
+drawoptions ();
+draw jdg[4]; % fig. 550 -> draw drv_tree;
+endfig;
+
+drv_math_style (ilb, "\scriptstyle");
+drv_labels_position (ilb, r);
+drv_scale (clr, 1);
+
+%
+% a continued fraction
+%
+
+drv_math_style (ilb, "\textstyle");
+drv_scale (jdg, 0);
+drv_scale (ilb, 0);
+drv_labels_position (ilb, l);
+drv_roots_position t;
+drv_box_mode on;
+
+drv_font_size "\normalsize";
+
+beginfig(560)
+dcl 0 (1) ("1+", 1) "a";
+dcl 1 (2) ("2+", 1) "b";
+dcl 2 (3) ("3+", 1) "c";
+dcl 3 (4) ("4+", 1) "d";
+dcl 4 ( ) ("", 0) "\cdots";
+draw drv_tree;
+endfig;
+
+drv_math_style (ilb, "\scriptstyle");
+drv_scale (jdg, 1);
+drv_scale (ilb, 1);
+drv_labels_position (ilb, r);
+drv_roots_position b;
+drv_box_mode off;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% 3. Postamble
+%
+
+end
diff --git a/Master/texmf-dist/doc/metapost/drv/doc/drv-guide.tex b/Master/texmf-dist/doc/metapost/drv/doc/drv-guide.tex
new file mode 100644
index 00000000000..48a7644a517
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/drv/doc/drv-guide.tex
@@ -0,0 +1,1864 @@
+% Any piece of code related to font selection in the following preamble
+% (document class, font package, font selection commands ...) should be
+% reported in `drv-guide.mp'.
+
+\documentclass[twoside,11pt]{article}
+\usepackage[T1]{fontenc}
+\usepackage{amsmath}
+\usepackage{amssymb}
+\usepackage{stmaryrd}
+
+% Choose your favourite fonts combination (if available).
+% See "http://ctan.tug.org/tex-archive/info/Free_Math_Font_Survey".
+%
+%\usepackage{cmbright} % CM text & CM Bright math
+%\usepackage{ccfonts,eulervm} % Concrete text & Euler math
+%\usepackage{ccfonts} % Concrete text & math
+%\usepackage[math]{iwona} % Iwona text & math
+%\usepackage[math]{kurier} % Kurier text & math
+%\usepackage[math]{anttor} % Antykwa Torunska text & math
+%\usepackage{kmath,kerkis} % Kerkis text & math
+%\usepackage{fouriernc} % New Century Schoolbook & Fourier math
+%\usepackage{pxfonts} % Palatino & pxfonts math
+%\usepackage{mathpazo} % Palatino & Pazo math
+%\usepackage{mathpple} % Palatino & Euler math
+\usepackage[varg]{txfonts} % Times & txfonts math
+%\usepackage{mathtime} % Times & Belleek math
+%\usepackage{mathptmx} % Times & Symbol math
+%\usepackage{mbtimes} % Omega Serif text & Omega math
+%\usepackage{arev} % Arev Sans text with Arev math
+%\usepackage[charter]{mathdesign} % Bitstream Charter & Math Design math
+%\usepackage{comicsans} % Comic Sans text & math
+%\usepackage[garamond]{mathdesign} % Garamond & Math Design math
+%\usepackage{fourier} % Utopia & Fourier math
+%\usepackage[utopia]{mathdesign} % Utopia & Math Design math
+
+\usepackage{mflogo}
+\usepackage{array}
+\usepackage{multicol}
+\raggedcolumns
+\usepackage{fancyvrb}
+\fvset{fontsize=\small}
+\usepackage{color}
+\definecolor{myblue}{rgb}{0,0,.5}
+
+\usepackage{hyperref}
+\hypersetup{colorlinks=true}
+\hypersetup{citecolor=myblue}
+\hypersetup{linkcolor=myblue}
+\hypersetup{urlcolor=myblue}
+\hypersetup{pdftitle={drv.mp - derivation trees with MetaPost}}
+\hypersetup{pdfauthor={Laurent M\'ehats}}
+
+% Picture inclusion macro: \drv
+%
+% \drv includes a picture file in such a way that the baseline of the included
+% picture coincides with the baseline of the inclusion point. The code for \drv
+% was suggested by Josselin Noirel on the fr.comp.text.tex usenet group.
+
+\usepackage{graphicx}
+\makeatletter
+\def\Gin@def@bp#1\relax#2#3{\gdef#2{#3}}
+\newsavebox{\graphicsbox}
+\newcommand*{\drv}[1]{%
+\sbox{\graphicsbox}{\includegraphics{#1}}%
+\raisebox{\Gin@lly bp}%
+{\usebox{\graphicsbox}}}
+\makeatother
+
+\newcommand{\param}[1]{\textrm{\textit{$\langle$#1\/$\rangle$}}}
+\newcommand{\default}[1][]{\emph{$*$ default#1 $*$}}
+\newcommand{\tbs}{\textbackslash}
+\newcommand{\resplap}{\llap{\textrm{\emph{resp. }}}}
+
+\title{\texttt{drv.mp}\\
+derivation trees with \MP%
+\thanks{You don't need to know \MP\ to use this package.}\\
+{\small almost a user's guide%
+\thanks{Feel free to improve! (E.g. by correcting the poor English.)
+Last update: \today.}}}
+\author{Laurent \textsc{M\'ehats}\\
+{\small\href{mailto:laurent.mehats@gmail.com}
+{\texttt{laurent.mehats@gmail.com}}}}
+\date{documented version: 0.93}
+
+\pagestyle{myheadings}
+\renewcommand{\sectionmark}[1]{%
+\markboth{\upshape\sc#1}{}}
+\renewcommand{\subsectionmark}[1]{%
+\markright{\upshape\thesubsection\quad#1}}
+
+\begin{document}
+\maketitle
+%
+%
+\begin{gather*}
+\drv{drv-guide.100}
+\end{gather*}
+%
+%
+\tableofcontents
+%
+%
+\section{Usage\label{sec-usage}}
+%
+%
+\subsection{Structure of a \MP\ file using \texttt{drv.mp}%
+\label{sec-structure}}
+%
+%
+\begin{description}
+\item[Preamble]\
+ \begin{Verbatim}[commandchars=\\\{\}]
+ input drv;
+ verbatimtex %&latex
+ \param{\LaTeX\ preamble}
+ \texttt{\tbs{}begin\{document\}}
+ etex;
+ \end{Verbatim}
+\item[Figures]\
+ \begin{Verbatim}[commandchars=\\\{\}]
+ \param{optional \texttt{drv} tunings}
+ beginfig(\param{index})
+ \param{judgment \& inference declarations}
+ draw drv_tree;
+ \param{optional extra \MP\ code}
+ endfig;
+ \end{Verbatim}
+\item[Postamble]\
+ \begin{Verbatim}
+ end
+ \end{Verbatim}
+\end{description}
+For each ``\texttt{beginfig(\param{index})}, \texttt{endfig;}'' pair in a file
+\texttt{\param{jobname}.mp}, \MP\ generates an Encapsulated PostScript file
+\texttt{\param{jobname}.\param{index}}.
+%
+%
+\subsection{Running \MP\label{sec-running}}
+%
+%
+You have to run \emph{at least twice}
+\begin{center}
+\texttt{mpost \param{jobname}.mp}
+\end{center}
+(once more if you use sub-tree delimiters, see~\S~\ref{sec-sub-tree}). On the
+first run \MP\ collects the \LaTeX\ code generated by \texttt{drv.mp}
+declaration macros and writes it to the file
+\texttt{\param{jobname}-delayed.mp}. On the second run \MP\ preprocesses the
+\LaTeX\ code in \texttt{\param{jobname}-delayed.mp} and then typesets the
+derivation trees.
+
+If you get an error on the first run then it comes from the
+\texttt{drv.mp}/\MP\ code. If you get an error on the second run then it comes
+from the \LaTeX\ code. In both cases, correct the error (see
+Appendix~\ref{sec-debugging}), delete \texttt{\param{jobname}-delayed.mp} and
+run ``\texttt{mpost \param{jobname}.mp}'' twice again (a \texttt{makefile} can
+do that for you).
+%
+%
+\subsection{\LaTeX\ inclusion commands\label{sec-inclusion}}
+%
+%
+Encapsulated PostScript files \texttt{\param{jobname}.\param{index}} generated
+by \MP\ can be included in \LaTeX\ documents using the
+\texttt{\tbs{}includegraphics\{\param{jobname}.\param{index}\}}
+command from the \texttt{graphicx.sty} (or \texttt{graphics.sty}) package%
+\footnote{You may get standalone picture files (e.g. transparent \textsc{png}
+for inclusion in a webpage) from each \texttt{\param{jobname}.\param{index}}
+file as described in Appendix~\ref{sec-standalone}.}.
+
+However \texttt{drv.mp} provides ways to set the baseline of
+derivation tree pictures (see~\S~\ref{sec-axis-reference}
+ and~\S~\ref{sec-axis}). Then I suggest using the following
+\texttt{\tbs{}drv\{\param{jobname}.\param{index}\}} command which is
+such that the baseline of the included picture coincides with the baseline of
+the inclusion point.
+\begin{Verbatim}
+\usepackage{graphicx}
+\makeatletter
+\def\Gin@def@bp#1\relax#2#3{\gdef#2{#3}}
+\newsavebox{\graphicsbox}
+\newcommand*{\drv}[1]{%
+\sbox{\graphicsbox}{\includegraphics{#1}}%
+\raisebox{\Gin@lly bp}%
+{\usebox{\graphicsbox}}}
+\makeatother
+\end{Verbatim}
+The code for \texttt{\tbs{}drv} was suggested by Josselin
+\textsc{Noirel} on the \texttt{fr.comp.text.tex} Usenet group.
+%
+%
+\section{Judgment \& inference declarations\label{sec-declarations}}
+%
+%
+\subsection{\texttt{jgm} \& \texttt{nfr}\label{sec-jgm-nfr}}
+%
+%
+\texttt{jgm \param{nat} \param{str list}}\\
+\begin{tabular}{ll}
+\param{nat}& judgment index\\
+\param{str list}& sub-judgments \emph{math-mode} \LaTeX\ code
+\end{tabular}\\[1ex]
+\texttt{nfr \param{nat} (\param{nat list}) (\param{str}, \param{id})}\\
+\begin{tabular}{ll}
+\param{nat}& inference index\\
+\param{nat list}& list of premise indices\\
+\param{str}& inference label \emph{math-mode} \LaTeX\ code\\
+\param{id}& inference line style identifier ({\tt0}, {\tt1},
+ {\tt2}, {\tt3}, {\tt4}, {\tt5}, {\tt6} or {\tt\_})
+\end{tabular}\\[1ex]
+``\texttt{jgm} \param{nat}'' declares a judgment which index is
+\param{nat} while ``\texttt{nfr} \param{nat}'' declares an inference which
+conclusion is the index \param{nat} judgment (a judgment may be declared before
+or after the corresponding inference, no matter).
+
+A premise index \param{nat} refers to the sub-tree ending with the index
+\param{nat} judgment. A list of premise indices may be arbitrary long.
+%
+%
+\begin{multicols}{2}
+\paragraph{First example}
+%
+%
+%\begin{multicols}{2}
+\begin{Verbatim}
+beginfig(110)
+jgm 0 "A\vdash B";
+jgm 1 "B\vdash C";
+jgm 2 "A\vdash C";
+nfr 0 () ("f", 1);
+nfr 1 () ("g", 1);
+nfr 2 (0, 1) ("\circ", 1);
+draw drv_tree;
+endfig;
+\end{Verbatim}
+\columnbreak
+
+\begin{gather*}
+\drv{drv-guide.110}
+\end{gather*}
+\end{multicols}
+%
+%
+\paragraph{Sub-judgments}
+%
+%
+\begin{multicols}{2}
+\begin{Verbatim}
+beginfig(111)
+jgm 0 "A", "\vdash", "B";
+nfr 0 () ("f", 1);
+draw drv_tree;
+endfig;
+\end{Verbatim}
+\columnbreak
+
+\begin{gather*}
+\drv{drv-guide.111}
+\end{gather*}
+\end{multicols}
+\noindent
+The outputs induced by
+\begin{center}
+\texttt{jgm 0 "A\tbs{}vdash B";}\qquad and\qquad
+\texttt{jgm 0 "A", "\tbs{}vdash", "B";}
+\end{center}
+are the same. Using the latter declaration, you can manipulate sub-judgments
+independently from each-other (see \S~\ref{sec-components}).
+%
+%
+\paragraph{Inference line styles}
+%
+%
+\begin{multicols}{2}
+\begin{Verbatim}
+beginfig(120)
+jgm 0 "\text{none}";
+jgm 1 "\text{simple}";
+jgm 2 "\text{double}";
+jgm 3 "\text{dotted}";
+jgm 4 "\text{dashed}";
+jgm 5 "\text{waved}";
+jgm 6 "\text{\TeX-dotted}";
+jgm 7 "\text{default}";
+nfr 0 ( ) ("\leftarrow 0", 0);
+nfr 1 (0) ("\leftarrow 1", 1);
+nfr 2 (1) ("\leftarrow 2", 2);
+nfr 3 (2) ("\leftarrow 3", 3);
+nfr 4 (3) ("\leftarrow 4", 4);
+nfr 5 (4) ("\leftarrow 5", 5);
+nfr 6 (5) ("\leftarrow 6", 6);
+nfr 7 (6) ("\leftarrow\_", _);
+draw drv_tree;
+endfig;
+\end{Verbatim}
+\columnbreak
+
+\begin{gather*}
+\drv{drv-guide.120}
+\end{gather*}
+\end{multicols}
+\noindent
+The default inference line style is set by the \texttt{drv\_path\_style} macro
+(see \S~\ref{sec-path-style}).
+%
+%
+\paragraph{Declarations order}
+%
+%
+Declarations may occur in any order.
+\begin{multicols}{2}
+\begin{Verbatim}
+beginfig(130)
+% preorder declarations
+jgm 0 "0";
+ jgm 1 "00";
+ jgm 2 "000";
+ jgm 3 "001";
+ jgm 4 "002";
+ jgm 5 "01";
+ jgm 6 "010";
+ jgm 7 "011";
+ jgm 8 "012";
+ jgm 9 "02";
+ jgm 10 "020";
+ jgm 11 "021";
+ jgm 12 "022";
+nfr 0 (1, 5, 9) ("a", _);
+ nfr 1 (2, 3, 4) ("b", _);
+ nfr 2 () ("c", _);
+ nfr 3 () ("d", _);
+ nfr 4 () ("e", _);
+ nfr 5 (6, 7, 8) ("f", _);
+ nfr 6 () ("g", _);
+ nfr 7 () ("h", _);
+ nfr 8 () ("i", _);
+ nfr 9 (10, 11, 12) ("j", _);
+ nfr 10 () ("k", _);
+ nfr 11 () ("l", _);
+ nfr 12 () ("m", _);
+draw drv_tree;
+endfig;
+\end{Verbatim}
+\columnbreak
+\begin{Verbatim}
+beginfig(131)
+% postorder declarations
+ jgm 0 "000";
+ jgm 1 "001";
+ jgm 2 "002";
+ jgm 3 "00";
+ jgm 4 "010";
+ jgm 5 "011";
+ jgm 6 "012";
+ jgm 7 "01";
+ jgm 8 "020";
+ jgm 9 "021";
+ jgm 10 "022";
+ jgm 11 "02";
+jgm 12 "0";
+ nfr 0 () ("a", _);
+ nfr 1 () ("b", _);
+ nfr 2 () ("c", _);
+ nfr 3 (0, 1, 2) ("d", _);
+ nfr 4 () ("e", _);
+ nfr 5 () ("f", _);
+ nfr 6 () ("g", _);
+ nfr 7 (4, 5, 6) ("h", _);
+ nfr 8 () ("i", _);
+ nfr 9 () ("j", _);
+ nfr 10 () ("k", _);
+ nfr 11 (8, 9, 10) ("l", _);
+nfr 12 (3, 7, 11) ("m", _);
+draw drv_tree;
+endfig;
+\end{Verbatim}
+\end{multicols}
+\begin{gather*}
+\drv{drv-guide.130}\tag{130}\\[1ex]
+\drv{drv-guide.131}\tag{131}
+\end{gather*}
+%
+%
+\paragraph{Code for the title page derivation tree}
+%
+%
+\begin{Verbatim}
+beginfig(100)
+jgm 0 "\Gamma, \Delta, \Theta, \Pi, \Upsilon\vdash F";
+ jgm 1 "\Pi\vdash (A\to D)\to E";
+ jgm 2 "\Gamma, \Delta, \Theta, (A\to D)\to E, \Upsilon\vdash F";
+ jgm 3 "\Gamma, \Delta, \Theta\vdash A\to D";
+ jgm 4 "A, \Gamma, \Delta, \Theta\vdash D";
+ jgm 5 "A, \Gamma, \Delta\vdash B\wedge C";
+ jgm 6 "A, \Gamma\vdash B";
+ jgm 7 "\Delta\vdash C";
+ jgm 8 "B\wedge C, \Theta\vdash D";
+ jgm 9 "E, \Upsilon\vdash F";
+nfr 0 (1, 2) ("\text{cut}", 1);
+ nfr 1 () ("\pi", 4);
+ nfr 2 (3, 9) ("\to_L", 1);
+ nfr 3 (4) ("\to_R", 1);
+ nfr 4 (5, 8) ("\text{cut}", 1);
+ nfr 5 (6, 7) ("\wedge_R", 1);
+ nfr 6 () ("\gamma", 2);
+ nfr 7 () ("\delta", 1);
+ nfr 8 () ("\theta", 3);
+ nfr 9 () ("\upsilon", 2);
+draw drv_tree;
+endfig;
+\end{Verbatim}
+%
+%
+\subsection{\texttt{dcl}\label{sec-dcl}}
+%
+%
+\texttt{dcl} enables the simultaneous declarations of a judgment and of the
+corresponding inference:
+%\begin{center}
+``\texttt{dcl \param{nat} (\param{nat list})
+(\param{str}, \param{id}) \param{str list}}''
+%\end{center}
+is a shorthand for
+``\texttt{jgm \param{nat} \param{str list}; nfr \param{nat} (\param{nat list})
+(\param{str}, \param{id})}''.
+\begin{multicols}{2}
+\begin{Verbatim}
+beginfig(140)
+dcl 0 () ("f", 1) "A\vdash B";
+dcl 1 () ("g", 1) "B\vdash C";
+dcl 2 (0, 1) ("\circ", 1) "A\vdash C";
+draw drv_tree;
+endfig;
+
+beginfig(141)
+dcl 0 () ("f", 1) "A", "\vdash", "B";
+draw drv_tree;
+endfig;
+\end{Verbatim}
+\columnbreak
+
+\begin{gather*}
+\drv{drv-guide.140}
+\end{gather*}
+\vfill
+\begin{gather*}
+\drv{drv-guide.141}
+\end{gather*}
+\end{multicols}
+\begin{Verbatim}
+beginfig(150)
+dcl 0 (1, 5, 9) ("a", _) "0";
+ dcl 1 (2, 3, 4) ("b", _) "00";
+ dcl 2 () ("c", _) "000";
+ dcl 3 () ("d", _) "001";
+ dcl 4 () ("e", _) "002";
+ dcl 5 (6, 7, 8) ("f", _) "01";
+ dcl 6 () ("g", _) "010";
+ dcl 7 () ("h", _) "011";
+ dcl 8 () ("i", _) "012";
+ dcl 9 (10, 11, 12) ("j", _) "02";
+ dcl 10 () ("k", _) "020";
+ dcl 11 () ("l", _) "021";
+ dcl 12 () ("m", _) "022";
+draw drv_tree;
+endfig;
+\end{Verbatim}
+\begin{gather*}
+\drv{drv-guide.150}
+\end{gather*}
+%
+%
+\subsection{\texttt{bxd} \& \texttt{mvd}\label{sec-bxd-mvd}}
+%
+%
+\paragraph{\texttt{bxd}}
+%
+%
+A premise index \param{nat} can be replaced with ``\texttt{bxd \param{nat}}''
+so that the whole sub-tree ending with the index \param{nat} judgment behaves
+as if it was enclosed within a box.
+\begin{Verbatim}[commandchars=\\\{\}]
+beginfig(160)
+dcl 0 (1, 4) ("", _) "a";
+\resplap{}dcl 0 (bxd 1, 4) ("", _) "a";
+ dcl 1 (2) ("", _) "a";
+ dcl 2 (3) ("", _) "a";
+ dcl 3 () ("", _) "aaaaaaa";
+ dcl 4 () ("", _) "aaaaa";
+draw drv_tree;
+endfig;
+\end{Verbatim}
+\begin{gather*}
+\drv{drv-guide.160}\quad\text{resp.}\quad
+\drv{drv-guide.161}\quad\text{typeset as}\quad
+\drv{drv-guide.162}
+\end{gather*}
+%
+%
+\paragraph{\texttt{mvd}}
+%
+%
+A premise index \param{nat 1} in an inference declaration can be replaced with
+``\texttt{mvd \param{nat 1} (\param{nat 2}, \param{id})}'' so as to declare
+\param{nat 2} ``phantom'' inference steps starting from the index \param{nat 1}
+judgment. The ``phantom'' inference steps are intended to be drawn as
+a path using the path-style \param{id}.\\[1ex]
+\texttt{mvd \param{nat 1} (\param{nat 2}, \param{id})}\\
+\begin{tabular}{ll}
+\param{nat 1}& index of the origin judgment\\
+\param{nat 2}& number of phantom steps\\
+\param{id}& phantom steps path-style identifier ({\tt0}, {\tt1}, {\tt2},
+ {\tt3}, {\tt4}, {\tt5}, {\tt6} or {\tt\_})
+\end{tabular}
+\begin{multicols}{2}
+\begin{Verbatim}[commandchars=\\\{\}]
+beginfig(170)
+jgm 1 "aaa";
+jgm 2 "bbb";
+jgm 3 "ccc";
+jgm 4 "d";
+nfr 1 () ("", _);
+nfr 2 () ("", _);
+nfr 3 () ("", _);
+nfr 4 (mvd 1 (2, 3), 2, 3) ("", _);
+\resplap{}nfr 4 (1, mvd 2 (2, 4), 3) ("", _);
+\resplap{}nfr 4 (1, 2, mvd 3 (2, 6)) ("", _);
+draw drv_tree;
+endfig;
+\end{Verbatim}
+\columnbreak
+\begin{gather*}
+\drv{drv-guide.170}\\[1ex]
+\drv{drv-guide.171}\\[1ex]
+\drv{drv-guide.172}
+\end{gather*}
+\end{multicols}
+\begin{Verbatim}[commandchars=\\\{\}]
+beginfig(180)
+jgm 0 "\tbs{}textsc\{Size matters -- Part 1\}";
+jgm 1 "\tbs{}text\{Here is a rather long judgment"&\textrm{\emph{
+ % string concatenation}}
+ " that I don't want to shorten.\}";
+jgm 2 "\tbs{}text\{Will the derivation tree fit on the page?\}";
+jgm 3 "\tbs{}text\{It does.\}";
+nfr 0 () ("", 0);
+nfr 1 (0) ("", 1);
+nfr 2 () ("", 1);
+nfr 3 (mvd 1 (2, 3), 2) ("", 1);
+draw drv_tree;
+endfig;
+\end{Verbatim}
+\begin{gather*}
+\drv{drv-guide.180}
+\end{gather*}
+%The default phantom steps path-style ``''is set by the
+%\texttt{drv\_path\_style} macro (see~\S~\ref{sec-path-style}).
+%
+%
+\subsection{Sub-tree delimiters \& labels\label{sec-sub-tree}}
+%
+%
+\paragraph{\texttt{Nfr}}
+%
+%
+The \texttt{Nfr} declaration macro is an alternative for \texttt{nfr} that
+enables the typesetting of delimiters.\\[1ex]
+\texttt{Nfr \param{nat} (\param{nat list})
+(\param{str 1}, \param{str 2}, \param{str 3}, \param{id})}\\
+\begin{tabular}{ll}
+\param{nat}& inference index\\
+\param{nat list}& list of premise indices\\
+\param{str 1}& inference label \emph{math-mode} \LaTeX\ code\\
+\param{str 2}& left delimiter label \emph{math-mode} \LaTeX\ code\\
+\param{str 3}& right delimiter label \emph{math-mode} \LaTeX\ code\\
+\param{id}& inference line style identifier ({\tt0}, {\tt1},
+ {\tt2}, {\tt3}, {\tt4}, {\tt5}, {\tt6} or {\tt\_})
+\end{tabular}\\[1ex]
+If both \param{str 2} and \param{str 3} are the empty string
+\texttt{""} then \texttt{Nfr} behaves exactly like \texttt{nfr}. However, if
+\param{str 2} is a non-empty string then a delimiter is placed to the left of
+the sub-tree ending with the index \param{nat} judgment and \param{str 2} is
+attached to it as a label. The same way, if \param{str 3} is a non-empty
+string then a delimiter is placed to the right of the sub-tree ending with the
+index \param{nat} judgment and \param{str 3} is attached to it as a label. Both
+\param{str 2} and \param{str 3} may be non-empty strings. You may use
+\texttt{"\{\}"} as a string argument to get a delimiter without a label.
+\begin{multicols}{2}
+\begin{Verbatim}
+beginfig(190)
+jgm 0 "a";
+jgm 1 "b";
+jgm 2 "c";
+jgm 3 "d";
+Nfr 0 () ("0", "", "", _);
+Nfr 1 () ("1", "", "", _);
+Nfr 2 (0, 1) ("2", "E", "", _);
+Nfr 3 (2) ("3", "", "F", _);
+draw drv_tree;
+endfig;
+\end{Verbatim}
+\columnbreak
+
+\begin{gather*}
+\drv{drv-guide.190}
+\end{gather*}
+\end{multicols}
+%
+%
+\paragraph{\texttt{Dcl}}
+%
+%
+The \texttt{Dcl} declaration macro is a shorthand for \texttt{jgm} and
+\texttt{Nfr} in the same way as \texttt{dcl} is a shorthand for \texttt{jgm}
+and \texttt{nfr}.
+\begin{multicols}{2}
+\begin{Verbatim}
+beginfig(200)
+Dcl 0 () ("", "", "", _) "a";
+Dcl 1 (0) ("", "", "B", _) "c";
+Dcl 2 () ("", "", "", _) "d";
+Dcl 3 (1, 2) ("", "E", "", _) "f";
+draw drv_tree;
+endfig;
+\end{Verbatim}
+\columnbreak
+
+\begin{gather*}
+\drv{drv-guide.200}
+\end{gather*}
+\end{multicols}
+%
+%
+\paragraph{\texttt{Mvd}}
+%
+%
+The \texttt{Mvd} macro is an alternative for \texttt{mvd} that enables the
+attachment of labels to phantom steps paths.\\[1ex]
+\texttt{Mvd \param{nat 1}
+(\param{nat 2}, \param{str 1}, \param{str 2}, \param{id})}\\
+\begin{tabular}{ll}
+\param{nat 1}& index of the origin judgment\\
+\param{nat 2}& number of phantom steps\\
+\param{str 1}& left label \emph{math-mode} \LaTeX\ code\\
+\param{str 2}& right label \emph{math-mode} \LaTeX\ code\\
+\param{id}& phantom steps path-style identifier ({\tt0}, {\tt1}, {\tt2},
+ {\tt3}, {\tt4}, {\tt5}, {\tt6} or {\tt\_})
+\end{tabular}\\[1ex]
+If \param{str 1} is a non-empty string then it is attached as a label to the
+left of the phantom steps path. The same way, if \param{str 2} is a non-empty
+string then it is attached as a label to the right of the phantom steps path.
+Both \param{str 1} and \param{str 2} may be non-empty strings.
+\begin{multicols}{2}
+\begin{Verbatim}
+beginfig(210)
+jgm 1 "aaa";
+jgm 2 "bbb";
+jgm 3 "ccc";
+nfr 1 () ("", _);
+nfr 2 () ("", _);
+nfr 3 (Mvd 1 (2, "d", "", 3), 2) ("", _);
+draw drv_tree;
+endfig;
+\end{Verbatim}
+\columnbreak
+
+\begin{gather*}
+\drv{drv-guide.210}
+\end{gather*}
+\end{multicols}
+%
+%
+\section{\texttt{drv} tunings\label{sec-tunings}}
+%
+%
+\texttt{drv} tuning macros set the parameters according to which derivation
+trees are typeset. All these macros have to be called outside figure
+environments (delimited by ``\texttt{beginfig(\param{index})},
+\texttt{endfig;}'' pairs).
+%
+%
+\begin{multicols}{2}
+\subsection{\texttt{drv\_font\_size}\label{sec-font-size}}
+%
+%
+\texttt{drv\_font\_size \param{str}}\\
+\begin{tabular}{ll}
+\param{str}& \LaTeX\ font-size command\\
+& \begin{tabular}{l}
+ \texttt{"\tbs{}tiny"}\\
+ \texttt{"\tbs{}scriptsize"}\\
+ \texttt{"\tbs{}footnotesize"}\\
+ \texttt{"\tbs{}small"}\\
+ \texttt{"\tbs{}normalsize"}\rlap{\quad\default}\\
+ \texttt{"\tbs{}large"}\\
+ \texttt{"\tbs{}Large"}\\
+ etc.
+ \end{tabular}
+\end{tabular}
+\columnbreak
+\begin{gather*}
+\texttt{"\tbs{}tiny"}\\
+\drv{drv-guide.220}\\
+\texttt{"\tbs{}small"}\\
+\drv{drv-guide.221}\\
+\texttt{"\tbs{}Large"}\\
+\drv{drv-guide.222}
+\end{gather*}
+\end{multicols}
+%
+%
+\subsection{\texttt{drv\_math\_style}\label{sec-math-style}}
+%
+%
+\texttt{drv\_math\_style (\param{id}, \param{str})}\\
+\begin{tabular}{ll}
+\param{id}& component identifier ({\tt drv}, {\tt jdg}, {\tt ilb},
+ {\tt dlb} or {\tt plb})\\
+& \begin{tabular}{lll}
+ {\tt drv}& derivation trees&
+ \default[ style: \texttt{"\tbs{}displaystyle"}]\\
+ {\tt jdg}& judgments&
+ \default[ style: \texttt{"\tbs{}textstyle"}]\\
+ {\tt ilb}& inference labels&
+ \default[ style: \texttt{"\tbs{}scriptstyle"}]\\
+ {\tt dlb}& delimiter labels&
+ \default[ style: \texttt{"\tbs{}textstyle"}]\\
+ {\tt plb}& phantom steps labels&
+ \default[ style: \texttt{"\tbs{}textstyle"}]
+ \end{tabular}\\
+\param{str}& \LaTeX\ math-style command
+\end{tabular}\\[1ex]
+%
+%
+``\texttt{drv\_math\_style (drv, {\rm ---});}''
+\begin{gather*}
+\begin{array}{*{3}{@{}>{\centering}p{.33\textwidth}}@{}l@{}}
+\texttt{"\tbs{}displaystyle"}&
+\texttt{"\tbs{}textstyle"}&
+\texttt{"\tbs{}scriptstyle"}&\\[1ex]
+\drv{drv-guide.230}&
+\drv{drv-guide.231}&
+\drv{drv-guide.232}&
+\end{array}
+\end{gather*}
+%
+%
+``\texttt{drv\_math\_style (jdg, {\rm ---});}''
+\begin{gather*}
+\begin{array}{*{3}{@{}>{\centering}p{.33\textwidth}}@{}l@{}}
+\texttt{"\tbs{}displaystyle"}&
+\texttt{"\tbs{}textstyle"}&
+\texttt{"\tbs{}scriptstyle"}&\\[1ex]
+\drv{drv-guide.240}&
+\drv{drv-guide.241}&
+\drv{drv-guide.242}&
+\end{array}
+\end{gather*}
+%
+%
+``\texttt{drv\_math\_style (ilb, {\rm ---});}''
+\begin{gather*}
+\begin{array}{*{3}{@{}>{\centering}p{.33\textwidth}}@{}l@{}}
+\texttt{"\tbs{}textstyle"}&
+\texttt{"\tbs{}scriptstyle"}&
+\texttt{"\tbs{}scriptscriptstyle"}&\\[1ex]
+\drv{drv-guide.250}&
+\drv{drv-guide.251}&
+\drv{drv-guide.252}&
+\end{array}
+\end{gather*}
+Notice that the math-style of derivation trees determines the math-style of
+judgments (and of labels) in the same way as the math-style of fractions
+determines the math-style of numerators and denominators.
+%
+%
+\subsection{\texttt{drv\_scale}\label{sec-scale}}
+%
+%
+\texttt{drv\_scale (\param{id}, \param{float})}\\
+\begin{tabular}{ll}
+\param{id}& scale identifier ({\tt clr}, {\tt prm}, {\tt jdg} or
+ {\tt ilb})\\
+& \begin{tabular}{lll}
+ {\tt clr}&nice explanation soon
+ (see examples)&\default[ scale: 1]\\
+ {\tt prm}&nice explanation soon
+ (see examples)&\default[ scale: 1]\\
+ {\tt jdg}&nice explanation soon
+ (see examples)&\default[ scale: 1]\\
+ {\tt ilb}&nice explanation soon
+ (see examples)&\default[ scale: 1]
+ \end{tabular}\\
+\param{float}&scale value
+\end{tabular}\\[1ex]
+%
+%
+``\texttt{drv\_scale (clr, {\rm ---});}''
+\begin{gather*}
+\begin{array}{*{4}{@{}>{\centering}p{.25\textwidth}}@{}l@{}}
+\texttt{0}&
+\texttt{1}&
+\texttt{2.5}&
+\texttt{4}&\\[1ex]
+\drv{drv-guide.260}&
+\drv{drv-guide.261}&
+\drv{drv-guide.262}&
+\drv{drv-guide.263}&
+\end{array}
+\end{gather*}
+%
+%
+``\texttt{drv\_scale (prm, {\rm ---});}''
+\begin{gather*}
+\begin{array}{*{4}{@{}>{\centering}p{.25\textwidth}}@{}l@{}}
+\texttt{0}&
+\texttt{1}&
+\texttt{2.5}&
+\texttt{4}&\\[1ex]
+\drv{drv-guide.270}&
+\drv{drv-guide.271}&
+\drv{drv-guide.272}&
+\drv{drv-guide.273}&
+\end{array}
+\end{gather*}
+%
+%
+``\texttt{drv\_scale (jgm, {\rm ---});}''
+\begin{gather*}
+\begin{array}{*{4}{@{}>{\centering}p{.25\textwidth}}@{}l@{}}
+\texttt{0}&
+\texttt{1}&
+\texttt{2.5}&
+\texttt{4}&\\[1ex]
+\drv{drv-guide.280}&
+\drv{drv-guide.281}&
+\drv{drv-guide.282}&
+\drv{drv-guide.283}&
+\end{array}
+\end{gather*}
+%
+%
+``\texttt{drv\_scale (ilb, {\rm ---});}''
+\begin{gather*}
+\begin{array}{*{4}{@{}>{\centering}p{.25\textwidth}}@{}l@{}}
+\texttt{0}&
+\texttt{1}&
+\texttt{2.5}&
+\texttt{4}&\\[1ex]
+\drv{drv-guide.290}&
+\drv{drv-guide.291}&
+\drv{drv-guide.292}&
+\drv{drv-guide.293}&
+\end{array}
+\end{gather*}
+%
+%
+\subsection{\texttt{drv\_junction\_style}\label{sec-junction-style}}
+%
+%
+This macro sets the default way the premises of an inference have to be
+horizontally joined.\\[1ex]
+\texttt{drv\_junction\_style \param{id}}\\
+\begin{tabular}{ll}
+\param{id}&junction style identifier ({\tt 0}, {\tt 1} or {\tt 2})\\
+& \begin{tabular}{ll}
+ {\tt 0}&``fully-interlacing''\\
+ {\tt 1}&``semi-interlacing''\quad\default\\
+ {\tt 2}&``non-interlacing''
+ \end{tabular}
+\end{tabular}
+\begin{gather*}
+\begin{array}{*{3}{@{}>{\centering}p{.33\textwidth}}@{}l@{}}
+\texttt{0}&
+\texttt{1}&
+\texttt{2}&\\[1ex]
+\drv{drv-guide.300}&
+\drv{drv-guide.301}&
+\drv{drv-guide.302}&
+\end{array}
+\end{gather*}
+%
+%
+\subsection{\texttt{drv\_alignment\_style}\label{sec-alignment-style}}
+%
+%
+This macro sets the default way a judgment has to be horizontally aligned
+relatively to its premises.\\[1ex]
+\texttt{drv\_alignment\_style \param{id}}\\
+\begin{tabular}{ll}
+\param{id}& alignment style identifier ({\tt l}, {\tt c} or {\tt r})\\
+& \begin{tabular}{ll}
+ {\tt l}&left\\
+ {\tt c}&centered\quad\default\\
+ {\tt r}&right
+ \end{tabular}
+\end{tabular}
+\begin{gather*}
+\begin{array}{*{3}{@{}>{\centering}p{.33\textwidth}}@{}l@{}}
+\texttt{l}&
+\texttt{c}&
+\texttt{r}&\\[1ex]
+\drv{drv-guide.310}&
+\drv{drv-guide.311}&
+\drv{drv-guide.312}&
+\end{array}
+\end{gather*}
+%
+%
+\subsection{\texttt{drv\_path\_style}\label{sec-path-style}}
+%
+%
+\texttt{drv\_path\_style (\param{id 1}, \param{id 2})}\\
+\begin{tabular}{ll}
+\param{id 1}& path-type identifier ({\tt iln} or {\tt phm})\\
+& \begin{tabular}{lll}
+ {\tt iln} &inference lines&\default[ style: {\tt1}]\\
+ {\tt phm} &phantom steps paths&\default[ style: {\tt3}]
+ \end{tabular}\\
+\param{id 2}& path-style identifier ({\tt0}, {\tt1}, {\tt2}, {\tt3}, {\tt4},
+ {\tt5} or {\tt6})
+\end{tabular}
+%
+%
+\subsection{\texttt{drv\_labels\_position}\label{sec-labels-position}}
+%
+%
+\texttt{drv\_labels\_position (\param{id 1}, \param{id 2})}\\
+\begin{tabular}{ll}
+\param{id 1}& label-type identifier ({\tt ilb}, {\tt plb} or {\tt dlb})\\
+& \begin{tabular}{lll}
+ {\tt ilb} &inference labels&
+ \default[ position: {\tt r}]\\
+ {\tt dlb} &delimiter labels&
+ \default[ position: {\tt l}]\\
+ {\tt plb} &phantom steps labels&
+ \default[ position: {\tt l}]
+ \end{tabular}\\
+\param{id 2}& position identifier ({\tt l} or {\tt r})\\
+& \begin{tabular}{ll}
+ {\tt l}&left\\
+ {\tt r}&right
+ \end{tabular}
+\end{tabular}\\[1ex]
+``\texttt{drv\_labels\_position (ilb, {\rm ---});}''
+\begin{gather*}
+\begin{array}{*{2}{@{}>{\centering}p{.24\textwidth}}@{}l@{}}
+{\tt l}&{\tt r}&\\[1ex]
+\drv{drv-guide.320}&
+\drv{drv-guide.321}&
+\end{array}
+\end{gather*}
+\enlargethispage{.25\baselineskip}%
+Setting a default position for delimiter labels (thus for delimiters) and for
+phantom steps labels may be useful in conjunction with declaration macros
+taking optional label arguments (see~\S~\ref{sec-labels}).
+%
+%
+\begin{multicols}{2}
+\subsection{\texttt{drv\_roots\_position}\label{sec-roots-position}}
+%
+%
+%\begin{multicols}{2}
+\texttt{drv\_roots\_position \param{id}}\\
+\begin{tabular}{ll}
+\param{id}& position identifier ({\tt t} or {\tt b})\\
+& \begin{tabular}{ll}
+ {\tt t}&top\\
+ {\tt b}&bottom\quad\default
+ \end{tabular}
+\end{tabular}
+\columnbreak
+
+\begin{gather*}
+\begin{array}{*{2}{@{}>{\centering}p{.24\textwidth}}@{}l@{}}
+\drv{drv-guide.330}&
+\drv{drv-guide.331}&
+\end{array}
+\end{gather*}
+\end{multicols}
+%
+%
+\subsection{\texttt{drv\_axis\_reference}\label{sec-axis-reference}}
+%
+%
+The baseline of derivation tree pictures is set in such a way that their
+math-axis coincides either with the axis of their root inference line or with
+the math-axis of their root judgment according to the default behaviour set by
+\texttt{drv\_axis\_reference}.\\[1ex]
+\texttt{drv\_axis\_reference \param{id}}\\
+\begin{tabular}{ll}
+\param{id}& reference identifier ({\tt iln} or {\tt jdg})\\
+& \begin{tabular}{lll}
+ {\tt iln}&root inference line axis&\default\\
+ {\tt jdg}&root judgment math-axis
+ \end{tabular}
+\end{tabular}
+\begin{gather*}
+\frac{\qquad}{}\textit{math axis}\frac{\qquad}{}
+\drv{drv-guide.340}\frac{\qquad}{}
+\drv{drv-guide.341}\frac{\qquad}{}
+\end{gather*}
+Notice that \texttt{drv\_axis\_reference} is irrelevant if you don't use the
+\texttt{\tbs{}drv} inclusion command (see \S~\ref{sec-inclusion}).
+%
+%
+\subsection{\texttt{drv\_left\_delimiter} \& \texttt{drv\_right\_delimiter}%
+\label{sec-delimiters}}
+%
+%
+\texttt{drv\_left\_delimiter \param{str}}\\
+\begin{tabular}{ll}
+\param{str}& left delimiter math-mode \LaTeX\ code\\
+& \begin{tabular}{llll}
+ \texttt{"("}& $($\\
+ \texttt{"["}& $[$\\
+ \texttt{"\tbs{}lbrace"}& $\lbrace$&\default\\
+ \texttt{"\tbs{}langle"}& $\langle$\\
+ etc.
+ \end{tabular}
+\end{tabular}\\[1ex]
+\texttt{drv\_right\_delimiter \param{str}}\\
+\begin{tabular}{ll}
+\param{str}& right delimiter math-mode \LaTeX\ code\\
+& \begin{tabular}{llll}
+ \texttt{")"}& $)$\\
+ \texttt{"]"}& $]$\\
+ \texttt{"\tbs{}rbrace"}& $\rbrace$&\default\\
+ \texttt{"\tbs{}rangle"}& $\rangle$\\
+ etc.
+ \end{tabular}
+\end{tabular}\\[1ex]
+``\texttt{drv\_left\_delimiter {\rm ---};}''
+\begin{gather*}
+\begin{array}{*{3}{@{}>{\centering}p{.33\textwidth}}@{}l@{}}
+\texttt{"("}&
+\texttt{"\tbs{}lfloor"}&
+\texttt{"."}&\\[1ex]
+\drv{drv-guide.350}&
+\drv{drv-guide.351}&
+\drv{drv-guide.352}&
+\end{array}
+\end{gather*}
+``\texttt{drv\_right\_delimiter {\rm ---};}''
+\begin{gather*}
+\begin{array}{*{3}{@{}>{\centering}p{.33\textwidth}}@{}l@{}}
+\texttt{"\tbs{}rangle"}&
+\texttt{"\tbs{}uparrow"}&
+\texttt{"."}&\\[1ex]
+\drv{drv-guide.360}&
+\drv{drv-guide.361}&
+\drv{drv-guide.362}&
+\end{array}
+\end{gather*}
+%
+%
+\subsection{\texttt{drv\_box\_mode}\label{sec-box-mode}}
+%
+%
+When in ``box mode'', derivation trees are typeset in such a way that all
+sub-trees behave as if they were enclosed within boxes (that is as if all
+premise indices were prefixed with \texttt{bxd},
+see~\S~\ref{sec-bxd-mvd}).\\[1ex]
+%
+%
+\texttt{drv\_box\_mode \param{id}}\\
+\begin{tabular}{ll}
+\param{id}& status identifier ({\tt on} or {\tt off})\\
+& \begin{tabular}{ll}
+ {\tt on}\\
+ {\tt off}&\default
+ \end{tabular}
+\end{tabular}
+\begin{gather*}
+\begin{array}{*{3}{@{}>{\centering}p{.33\textwidth}}@{}l@{}}
+\texttt{on}&
+typeset as&
+\texttt{off}&\\[1ex]
+\drv{drv-guide.370}&
+\drv{drv-guide.371}&
+\drv{drv-guide.372}&
+\end{array}
+\end{gather*}
+%
+%
+\subsection{\texttt{drv\_fraction\_mode}\label{sec-fraction-mode}}
+%
+%
+\nopagebreak\parbox{\textwidth}{\texttt{drv.mp} typesets derivation trees in
+such a way that: the distance from the axis of an inference line to the
+math-axis of a judgment above it is always the same (\texttt{num\_hg},
+see~\S~\ref{sec-components}); the distance from the axis of an inference line
+to the math-axis of a judgment below it is always the same (\texttt{den\_dp},
+see~\S~\ref{sec-components}). When in ``fraction mode'', if roots are at bottom
+then the height of leaf judgments above which there is no inference line is
+ignored (the depth of root judgments is always ignored); if roots are at top
+then the depth of leaf judgments below which there is no inference line is
+ignored (the height of root judgments is always ignored). This mode may cause
+overlaps when used in conjunction with
+interlacing junction-styles (\texttt{0} and \texttt{1}).}\\[1ex]
+\texttt{drv\_fraction\_mode \param{id}}\\
+\begin{tabular}{ll}
+\param{id}& status identifier ({\tt on} or {\tt off})\\
+& \begin{tabular}{ll}
+ {\tt on}&\default\\
+ {\tt off}
+ \end{tabular}
+\end{tabular}
+\begin{gather*}
+\begin{array}{*{3}{@{}>{\centering}p{.33\textwidth}}@{}l@{}}
+\texttt{on}&
+\texttt{off}&
+typeset as&\\[1ex]
+\drv{drv-guide.380}&
+\drv{drv-guide.381}&
+\drv{drv-guide.382}&
+\end{array}
+\end{gather*}
+%
+%
+\subsection{\texttt{drv\_proof\_mode}\label{sec-proof-mode}}
+%
+%
+\texttt{drv\_proof\_mode \param{id}}\\
+\begin{tabular}{ll}
+\param{id}& status identifier ({\tt on} or {\tt off})\\
+& \begin{tabular}{ll}
+ {\tt on}\\
+ {\tt off}&\default
+ \end{tabular}
+\end{tabular}
+\begin{gather*}
+\begin{array}{*{2}{@{}>{\centering}p{.5\textwidth}}@{}l@{}}
+\texttt{on}&
+\texttt{off}&\\[1ex]
+\drv{drv-guide.390}&
+\drv{drv-guide.391}&
+\end{array}\\[1ex]
+\end{gather*}
+Red numbers (resp. dots) refer to judgment indices (resp. central points,
+see~\S~\ref{sec-components}) while blue numbers (resp. dots) refer to
+sub-judgment indices (resp. central points, see~\S~\ref{sec-components}).
+%
+%
+\section{Pictures, bounding boxes and math-axis\label{sec-pictures}}
+%
+%
+\subsection{\texttt{drv\_freeze} \& \texttt{drv\_tree}}
+%
+%
+\texttt{drv.mp} composes derivation trees with respect to judgment and
+inference declarations only once the \texttt{drv\_freeze} macro is called.
+This is usually done by \texttt{drv\_tree} which is actually a macro that
+returns a picture. You may however call \texttt{drv\_freeze} yourself if you
+have no need for the whole derivation tree picture that \texttt{drv\_tree}
+would otherwise return (Section~\ref{sec-components} illustrates such a
+situation).
+
+\texttt{drv.mp} composes derivation trees essentially according to the
+algorithm for composing fractions described in Appendix~G of the {\TeX}book
+(see~\cite{jackowski06,knuth84}). In particular, \texttt{drv.mp} uses
+``\texttt{\tbs{}fontdimen}'' parameters so that the derivation tree pictures
+it generates should integrate smoothly within any document, whatever the fonts
+you use. As an example (when using the ``\texttt{drv\_scale (jgm, 0);}''
+tuning) \drv{drv-guide.400} should look the same as
+$\frac{\gamma}{\delta}$. The first fraction is composed by \texttt{drv.mp}
+while the second one is composed by the standard \texttt{\tbs{}frac}
+command.
+%
+%
+\subsection{\texttt{drv\_bbox}\label{sec-bbox}}
+%
+%
+\texttt{drv\_bbox \param{nat}}\\
+\begin{tabular}{ll}
+\param{nat}& sub-tree root index
+\end{tabular}\\[1ex]
+``\texttt{drv\_bbox \param{nat}}'' returns a \MP\ path expression representing
+the bounding box of the sub-tree ending with the index \param{nat} judgment.
+\texttt{drv\_bbox} calls \texttt{drv\_freeze} if necessary.
+\begin{Verbatim}[commandchars=\\\{\}]
+beginfig(410)
+dcl 0 (1, 5) ("", _) "a";
+\resplap{}dcl 0 (bxd 1, 5) ("", _) "a";
+ dcl 1 (2, 3, 4) ("", _) "b";
+ dcl 2 () ("", _) "c";
+ dcl 3 () ("", _) "d";
+ dcl 4 () ("", _) "e";
+ dcl 5 () ("", _) "f";
+fill drv_bbox 1 withcolor (255, 230, 205)/255; % rgb color
+draw drv_tree;
+endfig;
+\end{Verbatim}
+\begin{gather*}
+\drv{drv-guide.410}\quad\text{resp.}\quad\drv{drv-guide.411}
+\end{gather*}
+%
+%
+\subsection{\texttt{drv\_axis}\label{sec-axis}}
+%
+%
+\texttt{drv\_axis} allows you set the math-axis of a derivation tree with
+respect to a particular inference, judgment or sub-tree.\\[1ex]
+\texttt{drv\_axis (\param{id}, \param{nat})}\\
+\begin{tabular}{ll}
+\param{id}& reference type identifier ({\tt iln}, {\tt jdg} or {\tt dlm})\\
+& \begin{tabular}{ll}
+ {\tt iln}&inference line axis\\
+ {\tt jdg}&judgment math-axis\\
+ {\tt dlm}&delimiter axis
+ \end{tabular}\\
+\param{nat}& reference index
+\end{tabular}
+\begin{Verbatim}[commandchars=\\\{\}]
+beginfig(420)
+Dcl 0 ( ) ("", "", "", _) "a";
+Dcl 1 (0) ("", "{}", "", _) "b";
+draw drv_tree;
+drv_axis (iln, 0);
+\resplap{}drv_axis (jdg, 1);
+\resplap{}drv_axis (dlm, 1);
+endfig;
+\end{Verbatim}
+\begin{gather*}
+\drv{drv-guide.420}\frac{\qquad}{}\text{ resp. }\frac{\qquad}{}
+\drv{drv-guide.421}\frac{\qquad}{}\text{ resp. }\frac{\qquad}{}
+\drv{drv-guide.422}
+\end{gather*}
+Notice that \texttt{drv\_axis} is irrelevant if you don't use the
+\texttt{\tbs{}drv} inclusion command.% (see \S~\ref{sec-inclusion}).
+%
+%
+\section{Low level inference declaration macros\label{sec-low-level}}
+%
+%
+\subsection{\texttt{NFR}, \texttt{DCL} \& \texttt{MVD}\label{sec-NFR-DCL-MVD}}
+%
+%
+\paragraph{\texttt{NFR}}
+%
+%
+\enlargethispage{.05\baselineskip}%
+The \texttt{NFR} declaration macro is the lowest level one. It allows you to
+specify all the labels and styles of an inference.\\[1ex]
+\texttt{NFR
+\param{nat}
+(\param{nat\;list})
+(\param{str~1},\;\param{str~2},\;\param{str~3},\;\param{str~4})
+(\param{id~1},\;\param{id~2},\;\param{id~3})}
+\begin{tabular}{ll}
+\param{nat}& inference index\\
+\param{nat list}& list of premise indices\\
+\param{str 1}& left inference label \emph{math-mode} \LaTeX\ code\\
+\param{str 2}& right inference label \emph{math-mode} \LaTeX\ code\\
+\param{str 3}& left delimiter label \emph{math-mode} \LaTeX\ code\\
+\param{str 4}& right delimiter label \emph{math-mode} \LaTeX\ code\\
+\param{id 1}& junction style identifier ({\tt0}, {\tt1}, {\tt2},
+ {\tt3} or {\tt\_})\\
+& \begin{tabular}{ll}
+ {\tt0}&fully-interlacing\\
+ {\tt1}&semi-interlacing\\
+ {\tt2}&non-interlacing\\
+ {\tt3}&user specified (tricky,
+ see~\S~\ref{sec-user-specified})\\
+ {\tt\_}&default (set by \texttt{drv\_junction\_style},
+ see~\S~\ref{sec-junction-style})
+ \end{tabular}\\
+\param{id 2}& alignment style identifier ({\tt l}, {\tt c}, {\tt r},
+ {\tt u} or {\tt\_})\\
+& \begin{tabular}{ll}
+ {\tt l}&left\\
+ {\tt c}&centered\\
+ {\tt r}&right\\
+ {\tt u}&user specified (tricky,
+ see~\S~\ref{sec-user-specified})\\
+ {\tt\_}&default (set by \texttt{drv\_alignment\_style},
+ see~\S~\ref{sec-alignment-style})
+ \end{tabular}\\
+\param{id 3}& inference line style identifier ({\tt0}, {\tt1},
+ {\tt2}, {\tt3}, {\tt4}, {\tt5}, {\tt6} or {\tt\_})
+\end{tabular}
+\begin{multicols}{3}
+\begin{Verbatim}
+beginfig(430)
+jgm 0 "a";
+NFR 0 () ("1", "2", "3", "4", _, _, _);
+draw drv_tree;
+endfig;
+\end{Verbatim}
+\columnbreak\ \columnbreak
+
+\begin{gather*}
+\drv{drv-guide.430}
+\end{gather*}
+\end{multicols}
+%
+%
+\paragraph{\texttt{DCL}}
+%
+%
+The \texttt{DCL} declaration macro is a shorthand for \texttt{jgm} and
+\texttt{NFR} in the same way as \texttt{dcl} is a shorthand for \texttt{jgm}
+and \texttt{nfr}.
+\begin{multicols}{3}
+\begin{Verbatim}
+beginfig(440)
+DCL 0 () ("1", "", "", "", _, _, _) "a";
+DCL 1 () ("", "2", "", "", _, _, _) "b";
+DCL 2 (0, 1) ("", "", "3", "", _, _, _) "c";
+DCL 3 (2) ("", "", "", "4", _, _, _) "d";
+draw drv_tree;
+endfig;
+\end{Verbatim}
+\columnbreak\ \columnbreak
+
+\begin{gather*}
+\drv{drv-guide.440}
+\end{gather*}
+\end{multicols}
+%
+%
+\paragraph{\texttt{MVD}}
+%
+%
+The \texttt{MVD} macro is a generalization of \texttt{Mvd} that allows you to
+specify the alignment style of phantom inferences.\\[1ex]
+\texttt{MVD \param{nat 1}
+(\param{nat 2}, \param{str 1}, \param{str 2}, \param{id 1} \param{id 2})}\\
+\begin{tabular}{ll}
+\param{nat 1}& index of the origin judgment\\
+\param{nat 2}& number of phantom steps\\
+\param{str 1}& left label \emph{math-mode} \LaTeX\ code\\
+\param{str 2}& right label \emph{math-mode} \LaTeX\ code\\
+\param{id 1}& alignment style identifier ({\tt l}, {\tt c}, {\tt r}, {\tt u}
+ or {\tt\_})\\
+\param{id 2}& phantom steps path-style identifier ({\tt0}, {\tt1}, {\tt2},
+ {\tt3}, {\tt4}, {\tt5}, {\tt6} or {\tt\_})
+\end{tabular}
+\begin{multicols}{3}
+\begin{Verbatim}
+beginfig(450)
+jgm 0 "aaaaaa";
+jgm 1 "aaa";
+jgm 2 "a";
+jgm 3 "aaaaaaaaa";
+jgm 4 "a";
+nfr 0 () ("", _);
+NFR 1 () ("", "", "", "", _, _, _);
+nfr 2 (MVD 0 (2, "A", "", l, 3), 1) ("", _);
+nfr 3 () ("", _);
+nfr 4 (2, MVD 3 (5, "", "A", r, 4)) ("", _);
+draw drv_tree;
+endfig;
+\end{Verbatim}
+\columnbreak\ \columnbreak
+
+\begin{gather*}
+\drv{drv-guide.450}
+\end{gather*}
+\end{multicols}
+\pagebreak
+\begin{Verbatim}
+beginfig(460)
+jgm 0 "\textsc{Size matters -- Part 2}";
+jgm 1 "\text{Here is an even longer judgment"&
+ " that I don't want to shorten either.}";
+jgm 2 "\text{This time I'm pretty sure that the"&
+ " derivation tree won't fit on the page.}";
+jgm 3 "\text{It does! Amazing.}";
+nfr 0 () ("", 0);
+nfr 1 (0) ("", 1);
+nfr 2 () ("", 1);
+nfr 3 (MVD 1 (2, "", "", l, 3), 2) ("", 1);
+draw drv_tree;
+endfig;
+\end{Verbatim}
+\begin{gather*}
+\drv{drv-guide.460}
+\end{gather*}
+%
+%
+\subsection{Optional labels\label{sec-labels}}
+%
+%
+\paragraph{\texttt{NFR\_opt}}
+%
+%
+The \texttt{NFR\_opt} declaration macro is an alternative for \texttt{NFR}
+that lets you specify labels at your option.\\[1ex]
+\texttt{NFR\_opt
+\param{nat}
+(\param{nat list})
+(\param{str list 1})
+(\param{str list 2})
+(\param{id 1}, \param{id 2}, \param{id 3})}
+\begin{tabular}{ll}
+\param{nat}& inference index\\
+\param{nat list}& list of premise indices\\
+\param{str list 1}& list of inference labels \emph{math-mode}
+ \LaTeX\ code\\
+\param{str list 2}& list of delimiter labels \emph{math-mode}
+ \LaTeX\ code\\
+\param{id 1}& junction style identifier ({\tt0}, {\tt1}, {\tt2},
+ {\tt3} or {\tt\_})\\
+\param{id 2}& alignment style identifier ({\tt l}, {\tt c}, {\tt r},
+ {\tt u} or {\tt\_})\\
+\param{id 3}& inference line style identifier ({\tt0}, {\tt1},
+ {\tt2}, {\tt3}, {\tt4}, {\tt5}, {\tt6} or {\tt\_})
+\end{tabular}\\[1ex]
+%
+%
+The list \param{str list 1} may contain zero, one or two
+strings specifying inference labels. If no label is specified then no label
+is attached to the inference line. If two labels are specified then the first
+one is attached to the left and the second one to the right. Finally, if one
+label only is specified then it is attached either to the left or to the right
+of the inference line depending on the default inference labels position set by
+\texttt{drv\_labels\_position} (see~\S~\ref{sec-labels-position}).
+
+The same way, \param{str list 2} may contain zero, one or two strings
+specifying delimiter labels. If one label only is specified then it is attached
+to a delimiter placed either to the left or to the right of the sub-tree ending
+with the index \param{nat} judgment depending on the default delimiter labels
+position set by \texttt{drv\_labels\_position}.
+
+As an example, ``\texttt{nfr \param{nat} (\param{nat list})
+(\param{str}, \param{id})}'' behaves exactly the same way as
+``\texttt{NFR\_opt \param{nat} (\param{nat list}) (\param{str}) ()
+(\_, \_, \param{id})}''.
+%
+%
+\paragraph{\texttt{DCL\_opt}}
+%
+%
+The \texttt{DCL\_opt} declaration macro is a shorthand for \texttt{jgm} and
+\texttt{NFR\_opt} in the same way as \texttt{DCL} is a shorthand for
+\texttt{jgm} and \texttt{NFR}.
+%
+%
+\paragraph{\texttt{MVD\_opt}}
+%
+%
+The \texttt{MVD\_opt} macro is an alternative for \texttt{MVD} that lets you
+specify labels at your option.\\[1ex]
+\texttt{MVD\_opt \param{nat 1} (\param{nat 2})
+(\param{str list}) (\param{id 1} \param{id 2})}\\
+\begin{tabular}{ll}
+\param{nat 1}& index of the origin judgment\\
+\param{nat 2}& number of phantom steps\\
+\param{str list}& list of labels \emph{math-mode} \LaTeX\ code\\
+\param{id 1}& alignment style identifier ({\tt l}, {\tt c}, {\tt r}
+ or {\tt u})\\
+\param{id 2}& phantom steps path-style identifier ({\tt0}, {\tt1},
+ {\tt2}, {\tt3}, {\tt4}, {\tt5}, {\tt6} or {\tt\_})
+\end{tabular}\\[1ex]
+The list \param{str list} may contain zero, one or two
+strings specifying labels. If one label only is specified then it is attached
+either to the left or to the right of the phantom steps path depending on the
+default phantom steps labels position set by
+\texttt{drv\_labels\_position} (see~\S~\ref{sec-labels-position}).
+%
+%
+\subsection{User defined declaration macros (tricky)\label{sec-user-defined}}
+%
+%
+Here are the \MP\ headers for \texttt{NFR}, \texttt{MVD}, \texttt{NFR\_opt} and
+\texttt{MVD\_opt}.
+\begin{Verbatim}[commandchars=\\\{\}]
+NFR[](text PRM)(expr lilb, \!rilb, \!ldlb, \!rdlb)(suffix jsty, \!asty, \!isty)
+MVD[](expr num, lplb, rplb)(suffix asty, psty)
+NFR_opt[](text PRM)(text ILB)(text DLB)(suffix jsty, asty, isty)
+MVD_opt[](expr num)(text PLB)(suffix asty, psty)
+\end{Verbatim}
+``\texttt{[]}'' in the header of a macro indicates that this macro expects a
+numeric argument referred to as ``\texttt{@}'' in its body.
+``\texttt{text}'', ``\texttt{expr}'' and ``\texttt{suffix}'' specify argument
+types (see~\cite[Section 10]{hobby09}). You may use \texttt{NFR}, \texttt{MVD},
+\texttt{NFR\_opt} and \texttt{MVD\_opt} to define your own declaration macros.
+Here are possible definitions for \texttt{Nfr} and \texttt{Mvd}.
+\begin{Verbatim}
+vardef Nfr[](text PRM)(expr ilb, ldlb, rdlb)(suffix isty)=
+ NFR_opt[@](PRM)(ilb)(ldlb, rdlb)(_, _, isty);
+enddef;
+\end{Verbatim}
+\begin{Verbatim}
+vardef Mvd[](expr num, lplb, rplb)(suffix psty)=
+ MVD[@](num, lplb, rplb, _, psty) % Mvd returns an index, no `;'!
+enddef;
+\end{Verbatim}
+%
+%
+\section{Inside derivation trees\label{sec-inside}}
+%
+%
+\subsection{Components, distinguished points and
+dimensions\label{sec-components}}
+%
+%
+\paragraph{Components}
+%
+%
+Once \texttt{drv\_freeze} has been called, all the components of a derivation
+tree are accessible independently from each-other.
+%
+%
+\begin{Verbatim}
+beginfig(470) % components
+DCL 6 () ("", "", "", "", _, _, 0) "0";
+DCL 7 (6) ("(1)", "(2)", "(3)", "(4)", _, _, 1) "A", "B";
+drv_freeze; % usually called by drv_tree
+draw jdg[6]; % judgment 0
+draw sbj[7][0] withcolor (0, 0, 1); % sub-judgment A
+draw sbj[7][1] withcolor (0, 1, 0); % sub-judgment B
+draw l_ilb[7] withcolor (0, 1, 1); % left inference label (1)
+draw r_ilb[7] withcolor (1, 0, 0); % right inference label (2)
+draw l_dlb[7] withcolor (1, 0, 1); % left delimiter label (3)
+draw r_dlb[7] withcolor (1, 1, 0); % right delimiter label (4)
+draw l_dlm[7]; % left delimiter
+draw iln[7]; % inference line
+draw r_dlm[7]; % right delimiter
+endfig;
+\end{Verbatim}
+%\begin{gather*}
+%\drv{drv-guide.470}\qquad\drv{drv-guide.471}
+%\end{gather*}
+%
+%
+\paragraph{Distinguished points}
+%
+%
+Three distinguished points are associated with each component \param{cpn},
+namely \texttt{\param{cpn}.l}, \texttt{\param{cpn}.c} and
+\texttt{\param{cpn}.r} that lie respectively to the left, at the center and to
+the right of the component math-axis.
+\begin{gather*}
+\begin{array}{cc}
+\text{components}&\text{central points}\\[1ex]
+\drv{drv-guide.470}&\drv{drv-guide.471}
+\end{array}
+\end{gather*}
+%
+%
+\paragraph{Dimensions}
+%
+%
+Two dimensions are associated with each component \param{cpn}, a depth
+\texttt{\param{cpn}.dp} and a height \texttt{\param{cpn}.hg} that both are
+relative to the component math-axis. Two overall dimensions are associated with
+each derivation tree, \texttt{den\_dp} and \texttt{num\_hg}. The former
+refers to the depth of a judgment math-axis relatively to the axis of an
+inference line above it while the latter refers to the height of a judgment
+math-axis relatively to the axis of an inference line below it. Depths are
+negative while heights are positive.
+\begin{Verbatim}
+beginfig(470)
+dcl 0 () ("", 0) "\gamma";
+dcl 1 (0) ("", 1) "\delta";
+draw drv_tree;
+endfig;
+\end{Verbatim}
+(The picture below may look weird if you don't use scalable fonts.)
+\begin{gather*}
+\drv{drv-guide.480}
+\end{gather*}
+%
+%
+\subsection{\texttt{drv\_styled}\label{sec-styled}}
+%
+%
+\texttt{drv\_styled} allows you to draw \MP\ paths using \texttt{drv.mp}
+path-styles.\\[1ex]
+\texttt{\param{path} drv\_styled \param{id}}\\
+\begin{tabular}{ll}
+\param{path}& \MP\ path expression\\
+\param{id}& path style identifier ({\tt0}, {\tt1}, {\tt2}, {\tt3},
+ {\tt4}, {\tt5} or {\tt6})
+\end{tabular}
+\begin{Verbatim}
+beginfig(490)
+jgm 4 "A", "\vdash", "A";
+jgm 5 "B", "\vdash", "B";
+jgm 6 "A", ",", "A", "\multimap", "B", "\vdash", "B";
+jgm 7 "A", "\multimap", "B", "\vdash", "A", "\multimap", "B";
+nfr 4 () ("1", _);
+nfr 5 () ("1", _);
+nfr 6 (4, 5) ("\multimap_{L}", _);
+nfr 7 (6) ("\multimap_{R}", _);
+drv_freeze;
+draw (sbj[7][2].c shifted (0, -num_hg) ..
+ sbj[7][2].c {up} ..
+ sbj[6][4].c ..
+ sbj[5][0].c .. tension 1.05 ..
+ sbj[5][2].c ..
+ sbj[6][6].c ..
+ sbj[7][6].c {down} ..
+ sbj[7][6].c shifted (0, -num_hg))
+drv_styled 2 withcolor (1, 0, 0);
+draw drv_tree;
+endfig;
+\end{Verbatim}
+\begin{gather*}
+\drv{drv-guide.490}
+\end{gather*}
+%
+%
+\subsection{User specified junction \& alignment styles
+(tricky)\label{sec-user-specified}}
+%
+%
+\texttt{drp.mp} composes derivation trees by stating geometrical constraints to
+be solved by \MP. These constraints express how the components of a derivation
+tree must be arranged with respect to each-other. In the example about
+dimensions (see above), such a constraint could be that the vertical
+distance from
+\texttt{iln[1].c} to \texttt{jdg[0].c} has to be \texttt{num\_hg}, which could
+be \emph{stated} in the \MP\ syntax as
+``\texttt{ypart jdg[0].c=ypart iln[1].c+num\_hg}'' (this is \emph{not} an
+affectation).
+
+You can prevent \texttt{drp.mp} from stating \emph{horizontal}
+constraints about premises junction or judgments alignment by using the
+junction style~\texttt{3} or the alignment style~\texttt{u} of the \texttt{NFR}
+and \texttt{NFR\_opt} macros
+(see~\S~\ref{sec-NFR-DCL-MVD},~\ref{sec-labels}). In such cases, you have
+to state your own constraints. All the constraints related to a derivation tree
+must be stated \emph{before} \texttt{drv\_freeze} is called. \MP\ will complain
+if the constraints you state are insufficient, redundant or inconsistent.
+%
+%
+\paragraph{User specified junction style}
+%
+%
+The \emph{horizontal} constraints you state should express how the premises
+of the inference have to be joined.
+\begin{Verbatim}
+beginfig(500)
+jgm 0 "{\cdot}";
+jgm 1 "{\cdot}";
+jgm 2 "\text{You may check that the distance"&
+ " between the two dots above is 5 cm.}";
+NFR 0 () ("", "", "", "", _, _, _);
+NFR 1 () ("", "", "", "", _, _, _);
+NFR 2 (0, 1) ("", "", "", "", 3, _, _); % caution: 3
+xpart jdg[1].c=xpart jdg[0].c+5cm;
+draw drv_tree;
+endfig;
+\end{Verbatim}
+\begin{gather*}
+\drv{drv-guide.500}
+\end{gather*}
+%
+%
+\paragraph{User specified alignment style}
+The \emph{horizontal} constraints you state should express how the inferred
+judgment has to be aligned with respect to its premises.
+%
+%
+\begin{Verbatim}[commandchars=\\\{\}]
+beginfig(510) % "\tbs{}vdash":
+jgm 0 "B, A, \tbs{}Gamma", "\tbs{
+}vdash", "C"; % sbj[0][1]
+jgm 1 "A, \tbs{}Gamma", "\tbs{
+}vdash", "B\tbs{}multimap C"; % sbj[1][1]
+jgm 2 "\tbs{}Gamma", "\tbs{
+}vdash", "A\tbs{}multimap(B\tbs{}multimap C)"; % sbj[2][1]
+NFR_opt 0 () () () (_, _, 0);
+NFR_opt 1 (0) ("\tbs{}multimap_{R}") () (_, u, 1); % caution: u
+NFR_opt 2 (1) ("\tbs{}multimap_{R}") () (_, u, 1); % caution: u
+xpart sbj[1][1].c=xpart sbj[0][1].c;
+\resplap{}xpart sbj[1][1].l=xpart sbj[0][1].r;
+xpart sbj[2][1].c=xpart sbj[1][1].c;
+\resplap{}xpart sbj[2][1].l=xpart sbj[1][1].r;
+draw drv_tree;
+endfig;
+\end{Verbatim}
+\begin{gather*}
+\drv{drv-guide.510}\quad\text{resp.}\quad\drv{drv-guide.511}
+\end{gather*}
+%
+%
+\addcontentsline{toc}{section}{References}
+%
+%
+\begin{thebibliography}{1}
+\bibitem{hobby09}
+John~D. \textsc{Hobby}.
+\href{http://tug.org/docs/metapost/mpman.pdf}
+{\emph{A User's Manual for \MP}}, 2009
+\bibitem{jackowski06}
+Bogus{\l}aw \textsc{Jackowski}.
+\href{http://tug.org/TUGboat/Articles/tb27-1/tb86jackowski.pdf}
+{\emph{Appendix G illuminated}}. \emph{TUGboat}, 27(1):83--90, 2006.
+\bibitem{knuth84}
+Donald~E. \textsc{Knuth}.
+\emph{The {\TeX}book}.
+Addison-Wesley, 1984.
+\bibitem{restall06}
+Greg \textsc{Restall}.
+\href{http://consequently.org/papers/ptp.pdf}
+{\emph{Proof Theory and Philosophy}}. Book in progress, 2006.
+\bibitem{roegel02}
+Denis \textsc{Roegel}.
+\href{http://www.ctan.org/get/graphics/metapost/contrib/macros/%
+metaobj/doc/momanual.pdf}{\emph{The MetaObj tutorial and reference manual}},
+2002.
+\bibitem{lutz06}
+Lutz \textsc{Stra\ss{}burger}.
+\href{http://www.lix.polytechnique.fr/~lutz/papers/RR-6013.pdf}
+{\emph{Proof Nets and the Identity of Proofs}}. \textsc{Inria}, 2006.
+\end{thebibliography}
+%
+%
+\appendix
+\section{Debugging\label{sec-debugging}}
+%
+%
+Recall that you have to run ``\texttt{mpost \param{jobname}.mp}'' \emph{at
+least twice} (once more if you use sub-tree delimiters). If you get an error on
+the first run then it comes from the \texttt{drv.mp}/\MP\ code. If you get an
+error on the second run then it comes from the \LaTeX\ code.
+%
+%
+\paragraph{Error on the first run}
+\MP\ behaves essentially as \TeX/\LaTeX\ when it finds and error
+(see~\cite[Debugging]{hobby09}). It stops, ``explains'' the error in some way
+(look for the line starting with an exclamation mark \texttt{!}), shows some
+lines of context, and asks you what to do next (answer \texttt{h} to get some
+help or \texttt{x} to terminate the run). If you're lucky, the error comes from
+an inconsistency that \texttt{drv.mp} can detect. In such a case the
+explanation should be quite understandable.
+\begin{multicols}{2}
+\begin{Verbatim}[numbers=left,firstnumber=46]
+beginfig(520)
+jgm 0 "A\vdash B";
+jgm 1 "B\vdash C";
+jgm 2 "A\vdash C";
+jgm 3 "C\vdash D";
+jgm 4 "A\vdash D";
+nfr 0 () ("f", _);
+nfr 1 () ("g", _);
+nfr 2 (0, 1) ("\circ", _);
+nfr 3 () ("h", _);
+nfr 4 (0, 3) ("\circ", _);
+draw drv_tree;
+endfig;
+\end{Verbatim}
+\columnbreak
+\MP\ error message.
+\begin{Verbatim}[commandchars=\\\{\}]
+! drv (fig. 520): 0 has been used
+already as a premise index for
+inference declaration 2.
+\param{error context}
+l.56 nfr 4 (0, 3) ("{\tbs}circ", 1)
+ ;
+?
+\end{Verbatim}
+\end{multicols}
+%
+%
+\paragraph{Error on the second run}
+\MP\ fails to preprocess the \LaTeX\ code in
+\texttt{\param{jobname}-delayed.mp} and suggests that you ``\texttt{see
+mpxerr.log}'' which is a regular \LaTeX\ log-file. This file shows you which
+part of the \LaTeX\ code is faulty but unfortunately not where to find it in
+\texttt{\param{jobname}.mp}.
+%
+%
+\section{Gallery\label{sec-gallery}}
+%
+%
+Here are the \texttt{drv.mp} version of a derivation tree found
+in~\cite[p.~57]{restall06} and an alternative for it (figures~530,~531).
+%
+%
+\begin{gather*}
+\drv{drv-guide.530}
+\end{gather*}
+\begin{gather*}
+\drv{drv-guide.531}
+\end{gather*}
+%
+%
+Here is the \texttt{drv.mp} version of a derivation tree found
+in~\cite[p.~86]{roegel02} (figure~540).
+\begin{gather*}
+\drv{drv-guide.540}
+\end{gather*}
+%
+%
+Here are the \texttt{drv.mp} versions of derivations trees found
+in~\cite[p.~50]{lutz06} (figures~550,~551).
+\begin{gather*}
+\drv{drv-guide.550}\quad\to\quad\drv{drv-guide.551}
+\end{gather*}
+%
+%
+Here is a continued fraction composed by \texttt{drv.mp} (figure~560).
+\begin{gather*}
+\drv{drv-guide.560}
+\end{gather*}
+%
+%
+\section{Standalone picture files\label{sec-standalone}}
+%
+%
+Given a PostScript file \texttt{\param{jobname}.\param{index}} generated by
+\MP, you may get a standalone \textsc{pdf} file (with embedded fonts)
+\texttt{\param{jobname}-\param{index}.pdf} by running
+\begin{center}
+\texttt{mptopdf \param{jobname}.\param{index}}
+\end{center}
+(\texttt{mptopdf} should be part of your \TeX\ distribution). Next you may
+get a standalone \textsc{ps} file \texttt{\param{jobname}-\param{index}.ps} by
+running
+\begin{center}
+\texttt{pdftops \param{jobname}-\param{index}.pdf}
+\end{center}
+(\texttt{pdftops} is part of the Xpdf software package). Finally you may get a
+standalone \emph{transparent} \textsc{png} file
+\texttt{\param{jobname}-\param{index}.png} by running
+\begin{center}
+\texttt{convert \param{jobname}-\param{index}.ps
+\param{jobname}-\param{index}.png}
+\end{center}
+(\texttt{convert} is part of the ImageMagick software package). Notice that you
+can run \texttt{convert} on \texttt{\param{jobname}-\param{index}.pdf} but then
+the \textsc{png} file you get is not transparent.
+%
+%
+\section{Related packages\label{sec-related}}
+%
+%
+\begin{itemize}
+\item
+\href{http://math.ucsd.edu/~sbuss/ResearchWeb/bussproofs/}
+{\texttt{bussproofs.sty}}
+(Samuel R. \textsc{Buss});
+\item
+\href{http://research.nii.ac.jp/~tatsuta/proof-sty.html}
+{\texttt{proof.sty}}
+(Makoto \textsc{Tatsuta});
+\item
+\href{http://www.paultaylor.eu/proofs/index.html}
+{\texttt{prooftree.sty}}
+(Paul \textsc{Taylor});
+\item
+the \texttt{Ptree} constructor from
+\href{http://tug.ctan.org/tex-archive/graphics/%
+metapost/contrib/macros/metaobj/}{\texttt{metaobj.mp}}
+(Denis \textsc{Roegel}, see~\cite{roegel02});
+\item
+\href{http://tug.ctan.org/tex-archive/macros/latex/contrib/semantic/}
+{\texttt{semantic.sty}}
+(Peter M\o ller \textsc{Neergaard} \& Arne John \textsc{Glenstrup});
+\item
+\href{http://alessio.guglielmi.name/res/vl/}
+{\texttt{virginialake.sty}}
+(Alessio \textsc{Guglielmi}).
+\end{itemize}
+Some of these are described on Peter \textsc{Smith}'s
+``\href{http://www.phil.cam.ac.uk/teaching_staff/Smith/logicmatters/%
+latexforlogician.html}{\LaTeX\ for Logicians}'' webpage.
+\end{document}
diff --git a/Master/texmf-dist/doc/metapost/drv/doc/drv.mp b/Master/texmf-dist/doc/metapost/drv/doc/drv.mp
new file mode 100644
index 00000000000..5eb38396144
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/drv/doc/drv.mp
@@ -0,0 +1,2245 @@
+%% drv.mp 0.93
+%% Copyright 2009 Laurent M\'ehats
+%
+% 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 Laurent M\'ehats.
+% <laurent.mehats@gmail.com>
+%
+% This work consists of the file drv.mp
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% User's macros summary
+%
+%
+% * Judgment & inference declarations
+% ===================================
+%
+% jgm <nat> <str list>
+% <nat> judgment index
+% <str list> sub-judgments math-mode LaTeX code
+%
+% nfr <nat> (<nat list>) (<str>, <id>)
+% <nat> inference index
+% <nat list> list of premise indices
+% <str> inference label math-mode LaTeX code
+% <id> inference line style identifier
+% (0, 1, 2, 3, 4, 5, 6 or _)
+% 0 none
+% 1 simple
+% 2 double
+% 3 dotted
+% 4 dashed
+% 5 waved
+% 6 TeX-dotted
+% _ default (set by drv_path_style)
+%
+% mvd <nat 1> (<nat 2>, <id>)
+% <nat 1> index of the origin judgment
+% <nat 2> number of phantom steps
+% <id> phantom steps path-style identifier
+% (0, 1, 2, 3, 4, 5, 6 or _)
+%
+% Nfr <nat> (<nat list>) (<str 1>, <str 2>, <str 3>, <id>)
+% <nat> inference index
+% <nat list> list of premise indices
+% <str 1> inference label math-mode LaTeX code
+% <str 2> left delimiter label math-mode LaTeX code
+% <str 3> right delimiter label math-mode LaTeX code
+% <id> inference line style identifier
+% (0, 1, 2, 3, 4, 5, 6 or _)
+%
+% Mvd <nat 1> (<nat 2>, <str 1>, <str 2>, <id>)
+% <nat 1> index of the origin judgment
+% <nat 2> number of phantom steps
+% <str 1> left label math-mode LaTeX code
+% <str 2> right label math-mode LaTeX code
+% <id> phantom steps path-style identifier
+% (0, 1, 2, 3, 4, 5, 6 or _)
+%
+% NFR <nat> (<nat list>) (<str 1>, <str 2>, <str 3>, <str 4>)
+% (<id 1>, <id 2>, <id 3>)
+% <nat> inference index
+% <nat list> list of premise indices
+% <str 1> left inference label math-mode LaTeX code
+% <str 2> right inference label math-mode LaTeX code
+% <str 3> left delimiter label math-mode LaTeX code
+% <str 4> right delimiter label math-mode LaTeX code
+% <id 1> junction style identifier (0, 1, 2, 3 or _)
+% 0 fully-interlacing
+% 1 semi-interlacing
+% 2 non-interlacing
+% 3 user specified (tricky)
+% _ default (set by drv_junction_style)
+% <id 2> alignment style identifier (l, c, r, u or _)
+% l left
+% c centered
+% r right
+% u user specified (tricky)
+% _ default (set by drv_alignment_style)
+% <id 3> inference line style identifier
+% (0, 1, 2, 3, 4, 5, 6 or _)
+%
+% MVD <nat 1> (<nat 2>, <str 1>, <str 2>, <id 1> <id 2>)
+% <nat 1> index of the origin judgment
+% <nat 2> number of phantom steps
+% <str 1> left label math-mode LaTeX code
+% <str 2> right label math-mode LaTeX code
+% <id 1> alignment style identifier (l, c, r, u or _)
+% <id 2> phantom steps path-style identifier
+% (0, 1, 2, 3, 4, 5, 6 or _)
+%
+% NFR_opt <nat> (<nat list>) (<str list 1>) (<str list 2>)
+% (<id 1>, <id 2>, <id 3>)
+% <nat> inference index
+% <nat list> list of premise indices
+% <str list 1> list of inference labels math-mode LaTeX code
+% <str list 2> list of delimiter labels math-mode LaTeX code
+% <id 1> junction style identifier (0, 1, 2, 3 or _)
+% <id 2> alignment style identifier (l, c, r, u or _)
+% <id 3> inference line style identifier
+% (0, 1, 2, 3, 4, 5, 6 or _)
+%
+% MVD_opt <nat 1> (<nat 2>) (<str list>) (<id 1> <id 2>)
+% <nat 1> index of the origin judgment
+% <nat 2> number of phantom steps
+% <str list> list of labels math-mode LaTeX code
+% <id 1> alignment style identifier (l, c, r or u)
+% <id 2> phantom steps path-style identifier
+% (0, 1, 2, 3, 4, 5, 6 or _)
+%
+% * Tunings
+% =========
+%
+% drv_font_size <str>
+% <str> LaTeX font-size command
+% "\tiny"
+% "\scriptsize"
+% "\footnotesize"
+% "\small"
+% "\normalsize"
+% "\large"
+% "\Large"
+% etc.
+%
+% drv_math_style (<id>, <str>)
+% <id> component identifier (drv, jdg, ilb, dlb or plb)
+% drv derivation trees
+% jdg judgments
+% ilb inference labels
+% dlb delimiter labels
+% plb phantom steps labels
+% <str> LaTeX math-style command
+%
+% drv_scale (<id>, <float>)
+% <id> scale identifier (clr, prm, jdg or ilb)
+% clr nice explanation soon (see examples)
+% prm nice explanation soon (see examples)
+% jdg nice explanation soon (see examples)
+% ilb nice explanation soon (see examples)
+% <float> scale value
+%
+% drv_junction_style <id>
+% <id> junction style identifier (0, 1 or 2)
+% 0 ``fully-interlacing''
+% 1 ``semi-interlacing''
+% 2 ``non-interlacing''
+%
+% drv_alignment_style <id>
+% <id> alignment style identifier (l, c or r)
+% l left
+% c centered
+% r right
+%
+% drv_path_style (<id 1>, <id 2>)
+% <id 1> path-type identifier (iln or phm)
+% iln inference lines
+% phm phantom steps paths
+% <id 2> path-style identifier (0, 1, 2, 3, 4, 5 or 6)
+%
+% drv_labels_position (<id 1>, <id 2>)
+% <id 1> label-type identifier (ilb, plb or dlb)
+% ilb inference labels
+% dlb delimiter labels
+% plb phantom steps labels
+% <id 2> position identifier (l or r)
+% l left
+% r right
+%
+% drv_roots_position <id>
+% <id> position identifier (t or b)
+% t top
+% b bottom
+%
+% drv_axis_reference <id>
+% <id> reference identifier (iln or jdg)
+% iln root inference line axis
+% jdg root judgment math-axis
+%
+% drv_left_delimiter <str>
+% <str> left delimiter math-mode LaTeX code
+% "(" $($
+% "[" $[$
+% "\lbrace" $\lbrace$
+% "\langle" $\langle$
+% etc.
+%
+% drv_right_delimiter <str>
+% <str> right delimiter math-mode LaTeX code
+% ")"
+% "]"
+% "\rbrace"
+% "\rangle"
+% etc.
+%
+% drv_box_mode <id>
+% <id> status identifier (on or off)
+% on
+% off
+%
+% drv_fraction_mode <id>
+% <id> status identifier (on or off)
+% on
+% off
+%
+% drv_proof_mode <id>
+% <id> status identifier (on or off)
+% on
+% off
+%
+% * Derivation tree pictures
+% ==========================
+%
+% drv_bbox <nat>
+% <nat> sub-tree root index
+%
+% drv_axis (<id>, <nat>)
+% <id> reference type identifier (iln, jdg or dlm)
+% iln inference line axis
+% jdg judgment math-axis
+% dlm delimiter axis
+% <nat> reference index
+%
+% <path> drv_styled <id>
+% <path> MetaPost path expression
+% <id> path style identifier (0, 1, 2, 3, 4, 5 or 6)
+%
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% MetaPost messages formatting
+%
+
+% drv_format prevents messages from being automatically cut into lines every
+% 79 characters: if possible, a word which would otherwise be cut is 'pushed'
+% to the following line by inserting space characters before it.
+
+vardef drv_format (expr str, fst_len, nxt_len, dbl_pcs)=
+ % str: the message to be formatted
+ % fst_len: first line length
+ % nxt_len: following lines length
+ % dbl_pcs (boolean): occurrences of the percent character must be doubled
+ save str_len, sub_len, aux_len, chr_rnk, occ_num;
+ numeric str_len, sub_len, aux_len, chr_rnk, occ_num;
+ save aux_str, chr;
+ string aux_str, chr;
+ str_len:=length str;
+ sub_len:=0;
+ chr_rnk:=0;
+ occ_num:=0;
+ aux_len:=0;
+ aux_str:="";
+ forever:
+ exitif (chr_rnk=fst_len) or (chr_rnk=str_len);
+ chr:=substring (chr_rnk, chr_rnk+1) of str;
+ aux_str:=aux_str&chr;
+ if chr=" ":
+ sub_len:=chr_rnk+1;
+ aux_len:=sub_len+occ_num;
+ elseif (chr="%") and dbl_pcs:
+ aux_str:=aux_str&"%";
+ occ_num:=occ_num+1;
+ fi
+ chr_rnk:=chr_rnk+1;
+ endfor
+ if chr_rnk=fst_len:
+ begingroup
+ if sub_len=0:
+ sub_len:=fst_len;
+ aux_len:=sub_len+occ_num;
+ fi
+ substring (0, aux_len) of aux_str&
+ for idx=sub_len+1 upto fst_len:
+ " "&
+ endfor
+ drv_format (substring (sub_len, str_len) of str,
+ nxt_len, nxt_len, dbl_pcs)
+ endgroup
+ else:
+ aux_str
+ fi
+enddef;
+
+boolean drv_inside_fig;
+drv_inside_fig:=false;
+
+vardef drv_context=
+ "drv"&if drv_inside_fig: " (fig. "&decimal charcode&")"&fi ": "
+enddef;
+
+vardef drv_message expr str=
+ message drv_format (drv_context&str, 79, 79, false);
+enddef;
+
+vardef drv_errhelp expr str=
+ % Occurrences of the percent character must be doubled: errhelp makes single
+ % single occurrences behave as newline characters (this is inherited from
+ % MetaFont).
+ errhelp drv_format (str, 79, 79, true);
+enddef;
+
+vardef drv_errmessage expr str=
+ % errmessage inserts the 2-characters string "! " before its argument.
+ % Hence 77 as a first line length argument.
+ errmessage drv_format (drv_context&str, 77, 79, false);
+enddef;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Delayed LaTeX processing
+%
+
+picture tex_pct[];
+string delayed_tex_file;
+delayed_tex_file:=jobname&"-delayed.mp";
+
+%
+% reading LaTeX picture definitions
+%
+
+boolean drv_nullpicture;
+drv_nullpicture:=true;
+
+string readfrom_str;
+readfrom_str:=readfrom delayed_tex_file;
+if readfrom_str<>EOF:
+ closefrom delayed_tex_file;
+ drv_message ("reading `"&delayed_tex_file&"' LateX picture definitions.");
+ batchmode;
+ scantokens ("input "&delayed_tex_file);
+ errorstopmode;
+ drv_message "done.";
+ drv_nullpicture:=false;
+fi
+
+%
+% copying LaTeX preamble
+%
+
+vardef drv_read (expr search_str) (suffix accum_str)=
+ save readfrom_str, readfrom_substr;
+ string readfrom_str, readfrom_substr;
+ accum_str:="";
+ forever:
+ readfrom_str:=readfrom jobname;
+ readfrom_substr:=substring (0, length search_str) of readfrom_str;
+ exitif (readfrom_substr=search_str) or (readfrom_str=EOF);
+ accum_str:=accum_str&readfrom_str&char(10);
+ endfor
+ if readfrom_str=EOF:
+ closefrom jobname;
+ drv_errhelp ("`"&jobname&".mp' should contain a line starting with "&
+ ditto&search_str&ditto&".");
+ drv_errmessage (ditto&search_str&ditto&" is missing");
+ fi
+enddef;
+
+string tex_preamble_str[];
+% tex_preamble_str[0] from "verbatimtex %&latex" to "\begin{document}"
+% tex_preamble_str[1] from "\begin{document}" to "etex;"
+
+drv_message ("reading `"&jobname&".mp' LateX preamble.");
+ drv_read ("verbatimtex %&latex", tex_preamble_str[0]);
+ drv_read ("\begin{document}", tex_preamble_str[0]);
+ drv_read ("etex;", tex_preamble_str[1]);
+ closefrom jobname;
+ write
+ "%"&char(10)&
+ "% AUTOMATICALLY GENERATED BY DRV.MP - DO NOT MODIFY."&char(10)&
+ "%"&char(10)&char(10)&
+ "verbatimtex %&latex"&char(10)&
+ tex_preamble_str[0]&
+ "\begin{document}"&char(10)&
+ tex_preamble_str[1]&
+ "etex;"
+ to delayed_tex_file;
+drv_message "done.";
+
+%
+% writing LaTeX picture definitions
+%
+
+numeric tex_pct_idx;
+tex_pct_idx:=0;
+
+% Math style indices: 0, 1, 2, 3
+string mth_sty_str[];
+mth_sty_str[0]:="\displaystyle";
+mth_sty_str[1]:="\textstyle";
+mth_sty_str[2]:="\scriptstyle";
+mth_sty_str[3]:="\scriptscriptstyle";
+
+string drv_fontsize;
+
+vardef drv_tex[] expr tex_str=
+ % @: math style index
+ % tex_str: math mode LaTeX code
+ save def_str, pct;
+ string def_str;
+ picture pct;
+ def_str:="btex{"&drv_fontsize&"$"&mth_sty_str[@]&"{}"&tex_str&"{}$}etex;";
+ write "tex_pct["&(decimal tex_pct_idx)&"]:="&def_str to delayed_tex_file;
+ pct:=
+ if known tex_pct[tex_pct_idx]:
+ tex_pct[tex_pct_idx]
+ else:
+ nullpicture
+ fi;
+ tex_pct_idx:=tex_pct_idx+1;
+ pct
+enddef;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% MetaPost shorthands
+%
+
+vardef depth expr pct=
+ ypart llcorner pct
+enddef;
+
+vardef height expr pct=
+ ypart urcorner pct
+enddef;
+
+vardef width expr pct=
+ xpart urcorner pct-xpart llcorner pct
+enddef;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Font-specific parameters
+%
+
+%
+% em[s] width of an m (s: mathstyle index)
+% ex[s] height of an x
+% axis_hg[s] height of the mathematical axis
+% num_bl_hg[s] height of a numerator baseline w.r.t. the fraction bar axis
+% den_bl_dp[s] depth of a denominator baseline w.r.t. the fraction bar axis
+% rul_thk[s] default rule thickness
+%
+
+numeric em[], ex[], axis_hg[], num_bl_hg[], den_bl_dp[], rul_thk[];
+
+%
+% thn_sp[s] thin space, usually 1em/6
+% med_sp[s] medium space, usually 2em/9
+% thk_sp[s] thick space, usually 5em/18
+%
+
+numeric thn_sp[], med_sp[], thk_sp[];
+
+%
+% pdt_hg[s] height of a punctuation ldot
+% pdt_wd[s] width of a punctuation ldot
+%
+
+numeric pdt_hg[], pdt_wd[];
+
+%
+% tt_dgt[s][i] typewriter typeface digits (i ranges from 0 to 9)
+%
+
+picture tt_dgt[][];
+
+%
+% min_clr[s] minimal clearance between a numerator
+% or a denominator and the fraction bar
+% prm_skp[s] <nice explanation>
+% jdg_skp[s] <nice explanation>
+% ilb_skp[s] <nice explanation>
+% plb_skp[s] <nice explanation>
+%
+
+numeric min_clr[], prm_skp[], jdg_skp[], ilb_skp[], plb_skp[];
+
+vardef drv_fontdimen[] expr font=
+ save dim_pct;
+ picture dim_pct;
+ dim_pct:=drv_tex[0] ("\rule{\the\fontdimen"&(decimal @)&font&"}{0bp}");
+ width dim_pct
+enddef;
+
+vardef drv_font_size expr size_str=
+ save pdt_pct, sp_pct;
+ picture pdt_pct, sp_pct;
+ drv_fontsize:=size_str;
+ write char(10)&"% font-specific parameters ("&drv_fontsize&")"&char(10)
+ to delayed_tex_file;
+ ex[0]:=drv_fontdimen[5] "\textfont2";
+ ex[1]:=drv_fontdimen[5] "\textfont2";
+ ex[2]:=drv_fontdimen[5] "\scriptfont2";
+ ex[3]:=drv_fontdimen[5] "\scriptscriptfont2";
+ em[0]:=drv_fontdimen[6] "\textfont2";
+ em[1]:=drv_fontdimen[6] "\textfont2";
+ em[2]:=drv_fontdimen[6] "\scriptfont2";
+ em[3]:=drv_fontdimen[6] "\scriptscriptfont2";
+ rul_thk[0]:=drv_fontdimen[8] "\textfont3";
+ rul_thk[1]:=drv_fontdimen[8] "\textfont3";
+ rul_thk[2]:=drv_fontdimen[8] "\scriptfont3";
+ rul_thk[3]:=drv_fontdimen[8] "\scriptscriptfont3";
+ axis_hg[0]:=drv_fontdimen[22] "\textfont2";
+ axis_hg[1]:=drv_fontdimen[22] "\textfont2";
+ axis_hg[2]:=drv_fontdimen[22] "\scriptfont2";
+ axis_hg[3]:=drv_fontdimen[22] "\scriptscriptfont2";
+ num_bl_hg[0]:=(drv_fontdimen[8] "\textfont2")-axis_hg[0];
+ num_bl_hg[1]:=(drv_fontdimen[9] "\textfont2")-axis_hg[1];
+ num_bl_hg[2]:=(drv_fontdimen[9] "\scriptfont2")-axis_hg[2];
+ num_bl_hg[3]:=(drv_fontdimen[9] "\scriptscriptfont2")-axis_hg[3];
+ den_bl_dp[0]:=-(drv_fontdimen[11] "\textfont2")-axis_hg[0];
+ den_bl_dp[1]:=-(drv_fontdimen[12] "\textfont2")-axis_hg[1];
+ den_bl_dp[2]:=-(drv_fontdimen[12] "\scriptfont2")-axis_hg[2];
+ den_bl_dp[3]:=-(drv_fontdimen[12] "\scriptscriptfont2")-axis_hg[3];
+ min_clr[0]:=3*rul_thk[0]; % The TEXbook,
+ min_clr[1]:=1*rul_thk[1]; % Appendix G,
+ min_clr[2]:=1*rul_thk[2]; % Rule 15d.
+ min_clr[3]:=1*rul_thk[3]; %
+ for mth_sty:=0 upto 3:
+ sp_pct:=drv_tex[mth_sty] "\,";
+ thn_sp[mth_sty]:=width sp_pct;
+ sp_pct:=drv_tex[mth_sty] "\>";
+ med_sp[mth_sty]:=width sp_pct;
+ sp_pct:=drv_tex[mth_sty] "\;";
+ thk_sp[mth_sty]:=width sp_pct;
+ pdt_pct:=drv_tex[mth_sty] "\ldotp";
+ pdt_hg[mth_sty]:=height pdt_pct;
+ pdt_wd[mth_sty]:=width pdt_pct;
+ for dgt=0 upto 9:
+ tt_dgt[mth_sty][dgt]:=drv_tex[mth_sty] "\texttt{"&(decimal dgt)&"}";
+ endfor
+ prm_skp[mth_sty]:=3*med_sp[mth_sty]; % arbitrary
+ jdg_skp[mth_sty]:=thn_sp[mth_sty]; % arbitrary
+ ilb_skp[mth_sty]:=thn_sp[mth_sty]; % arbitrary
+ plb_skp[mth_sty]:=thk_sp[mth_sty]; % arbitrary
+ endfor
+enddef;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Math-related parameters & macros
+%
+
+%
+% Math styles
+% drv_sty derivation trees
+% jdg_sty[drv_sty] judgments
+% ilb_sty[drv_sty] inference labels
+% dlb_sty[drv_sty] delimiter labels
+% plb_sty[drv_sty] phantom steps labels
+%
+
+numeric drv_sty, jdg_sty[], ilb_sty[], dlb_sty[], plb_sty[];
+
+%
+% Math-axis centered LaTeX pictures
+%
+
+vardef mth_tex[] expr tex_str=
+ (drv_tex[@] tex_str) shifted (0, -axis_hg[@])
+enddef;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% drv-boxes
+%
+
+vardef drv_box text STR=
+ for str=STR:
+ expandafter picture scantokens str;
+ expandafter pair scantokens str.l;
+ expandafter pair scantokens str.c;
+ expandafter pair scantokens str.r;
+ expandafter numeric scantokens str.hg;
+ expandafter numeric scantokens str.dp;
+ endfor
+enddef;
+
+vardef box_init @# (expr pct)=
+ @#:=pct;
+ @#.r-@#.l=(width pct, 0);
+ @#.c=(@#.l+@#.r)/2;
+ @#.hg:=height pct;
+ @#.dp:=depth pct;
+enddef;
+
+vardef box_freeze @#=
+ @#:=@# shifted @#.l;
+enddef;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% beginfig & endfig
+%
+
+%
+% drv_beginfig: figure initialization
+%
+
+pen drv_pen;
+
+vardef drv_beginfig=
+ %
+ % Judgments
+ %
+ % jdg[i] judgment drv-box
+ % sbj_num[i] number of sub-judgments
+ % sbj[i][j] sub-judgment drv-box (j ranges from 0 to sbj_num[i]-1)
+ %
+ drv_box "jdg[]";
+ numeric sbj_num[];
+ drv_box "sbj[][]";
+ %
+ % Inferences
+ %
+ % prm_num[i] number of premises
+ % prm[i][j] premise index (j ranges from 0 to prm_num[i]-1)
+ % ccl[i] conclusion index
+ % jct_sty[i] junction style
+ % alg_sty[i] alignment style
+ % iln_sty[i] inference line style
+ % l_prm[i] leftmost `graphical' premise index
+ % r_prm[i] rightmost `graphical' premise index
+ %
+ numeric prm_num[], prm[][], ccl[];
+ numeric jct_sty[];
+ string alg_sty[];
+ numeric iln_sty[];
+ numeric l_prm[], r_prm[];
+ %
+ % imin_x[i] inference minimal x
+ % l_dlb[i] left delimiter label drv-box
+ % l_dlm[i] left delimiter drv-box
+ % l_ilb[i] left label drv-box
+ % iln[i] inference line drv-box
+ % r_ilb[i] right label drv-box
+ % r_dlm[i] right delimiter drv-box
+ % r_dlb[i] right delimiter label drv-box
+ % imax_x[i] inference maximal x
+ %
+ numeric imin_x[];
+ drv_box "l_dlb[]", "l_dlm[]", "l_ilb[]";
+ drv_box "iln[]";
+ drv_box "r_ilb[]", "r_dlm[]", "r_dlb[]";
+ numeric imax_x[];
+ %
+ % Sub-trees
+ %
+ % smin_x[i] sub-tree minimal x
+ % smax_x[i] sub-tree maximal x
+ % smin_y[i] sub-tree minimal y
+ % smax_y[i] sub-tree maximal y
+ % boxed[i] boolean
+ %
+ numeric smin_x[], smax_x[], smin_y[], smax_y[];
+ boolean boxed[];
+ %
+ % Pen initialization
+ %
+ drv_pen:=pencircle scaled rul_thk[drv_sty];
+ %
+ % num_hg height of a numerator axis w.r.t. the fraction bar axis
+ % den_dp depth of a denominator axis w.r.t. the fraction bar axis
+ % iln_hg[s] height of a style s inference line
+ % iln_dp[s] depth of a style s inference line
+ %
+ numeric num_hg, den_dp, iln_hg[], iln_dp[];
+ num_hg:=num_bl_hg[drv_sty]+axis_hg[jdg_sty[drv_sty]];
+ den_dp:=den_bl_dp[drv_sty]+axis_hg[jdg_sty[drv_sty]];
+ picture iln_pct;
+ for sty=0 upto 6:
+ iln_pct:=((0, 0)--(10, 0)) drv_styled sty;
+ iln_hg[sty]:=height iln_pct;
+ iln_dp[sty]:=depth iln_pct;
+ endfor
+ %
+ % Derivation trees
+ %
+ % root_num number of roots
+ % root[i] root index (i ranges from 0 to root_num-1)
+ % drv_built boolean
+ % drv_frozen boolean
+ %
+ numeric root_num, root[];
+ boolean drv_checked, drv_built, drv_frozen;
+ root_num:=0;
+ drv_checked:=false;
+ drv_built:=false;
+ drv_frozen:=false;
+ %
+ % Phantom steps
+ %
+ % phm_idx phantom inferences index
+ % src[i] base phantom judgment index (in case of an origin judgment)
+ % tgt[i] origin judgment index (in case of a base phantom judgment)
+ % phm_sty[i] phantom steps style
+ % l_plb[i] left phantom steps label drv-box (in case of a base
+ % phantom judgment)
+ % phm[i] phantom steps drv-box (in case of a base phantom
+ % judgment)
+ % r_plb[i] right phantom steps label drv-box (in case of a base
+ % phantom judgment)
+ %
+ numeric phm_idx, src[], tgt[], phm_sty[];
+ phm_idx:=0;
+ drv_box "l_plb[]", "phm[]", "r_plb[]";
+ %
+ % Proof pictures
+ %
+ % jdg_prf[i] judgment index drv-box
+ % sbj_prf[i][j] sub-judgment index drv-box (j ranges from 0 to
+ % sbj_num[i]-1)
+ %
+ drv_box "jdg_prf[]", "sbj_prf[][]";
+ %
+ % Info
+ %
+ write char(10)&"% fig. "&(decimal charcode)&char(10) to delayed_tex_file;
+ drv_inside_fig:=true; % context: inside a figure
+enddef;
+
+extra_beginfig:=extra_beginfig&"drv_beginfig;";
+
+%
+% drv_endfig: proof-file generation
+%
+
+string proof_file;
+proof_file:=jobname&"-proof.tex";
+
+% TODO: taking outputtemplate into account.
+vardef output_file[]=
+ jobname&"."&(decimal @)
+enddef;
+
+string buf_str;
+buf_str:=
+ "%"&char(10)&
+ "% AUTOMATICALLY GENERATED BY DRV.MP."&char(10)&
+ "%"&char(10)&char(10)&
+ tex_preamble_str[0]&
+ "\usepackage{graphicx}"&char(10)&
+ "\makeatletter"&char(10)&
+ "\def\Gin@def@bp#1\relax#2#3{\gdef#2{#3}}"&char(10)&
+ "\newsavebox{\graphicsbox}"&char(10)&
+ "\newcommand*{\drv}[1]{%"&char(10)&
+ "\sbox{\graphicsbox}{\includegraphics{#1}}%"&char(10)&
+ "\raisebox{\Gin@lly bp}%"&char(10)&
+ "{\usebox{\graphicsbox}}}"&char(10)&
+ "\makeatother"&char(10)&char(10)&
+ "\newcount\h"&char(10)&
+ "\newcount\m"&char(10)&
+ "\h=\time"&char(10)&
+ "\divide\h 60"&char(10)&
+ "\m=-\h"&char(10)&
+ "\multiply\m 60"&char(10)&
+ "\advance\m\time"&char(10)&
+ "\def\hm{\number\h:\ifnum\m<10{}0\fi\number\m}"&char(10)&char(10)&
+ "\newcommand{\mathaxis}{\frac{\quad}{}}"&char(10)&char(10)&
+ "\begin{document}"&char(10)&
+ tex_preamble_str[1]&
+ "\noindent\today\ at \hm\medskip"&char(10)&char(10)&"\noindent";
+
+vardef drv_endfig=
+ drv_inside_fig:=false; % context: outside a figure
+ buf_str:=buf_str&char(10)&
+ "\texttt{"&output_file[charcode]&"}"&char(10)&
+ " (\verb+"&drv_fontsize&"+, \verb+"&(mth_sty_str[drv_sty])&"+)"&char(10)&
+ " {"&drv_fontsize&char(10)&
+ " \["&(mth_sty_str[drv_sty])&char(10)&
+ " \mathaxis\drv{"&output_file[charcode]&"}\mathaxis"&char(10)&
+ " \]}\\";
+ write EOF to proof_file; % erases the previous content
+ write buf_str&char(10)&"\end{document}" to proof_file;
+ write EOF to proof_file;
+ if drv_nullpicture:
+ draw btex{\tt drv}: run {\tt mpost} again.etex withcolor (1, 0, 0);
+ fi
+enddef;
+
+extra_endfig:="drv_endfig;"&extra_endfig;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Judgment declarations
+%
+
+vardef jgm[] text SUB=
+ % @: judgment index
+ % SUB: list of `sub-judgments' (pictures or strings)
+ if @<0:
+ drv_errhelp "An judgment index can not be negative.";
+ drv_errmessage (decimal @)&" is negative";
+ elseif known jdg[@]:
+ drv_errhelp "An index can be used only once to declare a judgment.";
+ drv_errmessage (decimal @)&" has been used already as a judgment index";
+ else:
+ save jdg_pct, sbj_pct, jdg_wd, sbj_rnk;
+ picture jdg_pct, sbj_pct;
+ numeric jdg_wd, sbj_rnk;
+ jdg_pct:=nullpicture;
+ jdg_wd:=0;
+ sbj_rnk:=0;
+ for sub=SUB:
+ sbj_pct:=
+ if picture sub:
+ sub
+ elseif sub<>"":
+ mth_tex[jdg_sty[drv_sty]] sub
+ else:
+ nullpicture
+ fi;
+ box_init sbj[@][sbj_rnk] (sbj_pct);
+ if sbj_rnk>0:
+ sbj[@][sbj_rnk-1].r=sbj[@][sbj_rnk].l;
+ fi
+ addto jdg_pct also sbj_pct shifted (jdg_wd, 0);
+ jdg_wd:=width jdg_pct;
+ sbj_rnk:=sbj_rnk+1;
+ endfor
+ sbj_num[@]:=sbj_rnk;
+ box_init jdg[@] (jdg_pct);
+ if sbj_num[@]>0:
+ jdg[@].l=sbj[@][0].l;
+ jdg[@].r=sbj[@][sbj_num[@]-1].r;
+ fi
+ fi
+enddef;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Inference declarations
+%
+
+vardef check_junction_style (suffix sty_sfx) (expr default)=
+ save sty_str;
+ string sty_str;
+ sty_str:=str sty_sfx;
+ if (sty_str="0")
+ or (sty_str="1")
+ or (sty_str="2")
+ or (sty_str="3"):
+ sty_sfx
+ elseif (sty_str="_"):
+ default
+ else:
+ begingroup
+ drv_errhelp "Valid identifiers are"&
+ " 0 (fully-interlacing),"&
+ " 1 (semi-interlacing),"&
+ " 2 (non-interlacing),"&
+ " 3 (user specified) and"&
+ " _ (default).";
+ drv_errmessage sty_str&" is not a valid junction style identifier";
+ default
+ endgroup
+ fi
+enddef;
+
+vardef check_alignment_style (suffix sty_sfx) (expr default)=
+ save sty_str;
+ string sty_str;
+ sty_str:=str sty_sfx;
+ if (sty_str="l")
+ or (sty_str="c")
+ or (sty_str="r")
+ or (sty_str="u"):
+ sty_str
+ elseif (sty_str="_"):
+ default
+ else:
+ begingroup
+ drv_errhelp "Valid identifiers are"&
+ " l (none),"&
+ " c (simple),"&
+ " r (double),"&
+ " u (dotted) and"&
+ " _ (default).";
+ drv_errmessage sty_str&" is not a valid alignment style identifier";
+ default
+ endgroup
+ fi
+enddef;
+
+vardef check_path_style (suffix sty_sfx) (expr default)=
+ save sty_str;
+ string sty_str;
+ sty_str:=str sty_sfx;
+ if (sty_str="0")
+ or (sty_str="1")
+ or (sty_str="2")
+ or (sty_str="3")
+ or (sty_str="4")
+ or (sty_str="5")
+ or (sty_str="6"):
+ sty_sfx
+ elseif (sty_str="_"):
+ default
+ else:
+ begingroup
+ drv_errhelp "Valid identifiers are"&
+ " 0 (none),"&
+ " 1 (simple),"&
+ " 2 (double),"&
+ " 3 (dotted),"&
+ " 4 (dashed),"&
+ " 5 (waved),"&
+ " 6 (TeX-dotted) and"&
+ " _ (default).";
+ drv_errmessage sty_str&" is not a valid path style identifier";
+ default
+ endgroup
+ fi
+enddef;
+
+vardef opt_init[] @# expr arg=
+ if picture arg:
+ if arg<>nullpicture:
+ box_init @# (arg);
+ fi
+ elseif arg<>"":
+ box_init @# (mth_tex[@] arg);
+ fi
+enddef;
+
+vardef NFR[] (text PRM) (expr lilb, rilb, ldlb, rdlb)
+ (suffix j_sty, a_sty, i_sty)=
+ %
+ % @: inference index
+ %
+ if known prm_num[@]:
+ drv_errhelp "An index can be used only once to declare an inference.";
+ drv_errmessage (decimal @)&" has been used already as an inference index";
+ else:
+ %
+ % PRM: list of premise indices
+ %
+ save prm_rnk;
+ numeric prm_rnk;
+ prm_rnk:=0;
+ for prm_idx=PRM:
+ if prm_idx=@:
+ drv_errhelp "An inference index can not be used"&
+ " as one of its own premise indices.";
+ drv_errmessage "the inference index "&(decimal prm_idx)&
+ " is used as one of its own premise indices";
+ elseif known ccl[prm_idx]:
+ drv_errhelp "An index can be used only once as a premise index.";
+ drv_errmessage (decimal prm_idx)&" has been used already as a"&
+ " premise index for inference declaration "&(decimal ccl[prm_idx]);
+ else:
+ if known prm_num[prm_idx]:
+ %
+ % roots list update
+ %
+ save root_idx;
+ numeric root_idx;
+ root_idx:=0;
+ forever:
+ exitif root[root_idx]=prm_idx;
+ root_idx:=root_idx+1;
+ endfor
+ forever:
+ exitif root_idx=root_num-1;
+ root[root_idx]:=root[root_idx+1];
+ root_idx:=root_idx+1;
+ endfor
+ root_num:=root_num-1;
+ fi
+ ccl[prm_idx]:=@;
+ prm[@][prm_rnk]:=prm_idx;
+ prm_rnk:=prm_rnk+1;
+ fi
+ endfor
+ prm_num[@]:=prm_rnk;
+ if known ccl[@]:
+ %
+ % cycle detection
+ %
+ save ccl_idx, ccl_str;
+ numeric ccl_idx;
+ string ccl_str;
+ ccl_idx:=@;
+ ccl_str:=decimal ccl_idx;
+ forever:
+ ccl_idx:=ccl[ccl_idx];
+ if ccl_idx>=0:
+ ccl_str:=(decimal ccl_idx)&", "&ccl_str;
+ fi
+ exitif (unknown ccl[ccl_idx]) or (ccl_idx=@);
+ endfor
+ if ccl_idx=@:
+ drv_errhelp "Inferences declarations can not be cyclic.";
+ drv_errmessage "inference declaration "&(decimal @)&" creates a"&
+ " cycle of inferences (indices "&ccl_str&" from conclusions to"&
+ " premises)";
+ fi
+ else:
+ root[root_num]:=@;
+ root_num:=root_num+1;
+ fi
+ %
+ % lilb, rilb: inference labels
+ %
+ opt_init[ilb_sty[drv_sty]] l_ilb[@] lilb;
+ opt_init[ilb_sty[drv_sty]] r_ilb[@] rilb;
+ %
+ % ldlb, rdlb: delimiter labels
+ %
+ opt_init[dlb_sty[drv_sty]] l_dlb[@] ldlb;
+ opt_init[dlb_sty[drv_sty]] r_dlb[@] rdlb;
+ %
+ % j_sty, a_sty and i_sty: junction, alignment and inference styles
+ %
+ jct_sty[@]:=check_junction_style (j_sty, drv_jct_sty);
+ alg_sty[@]:=check_alignment_style (a_sty, drv_alg_sty);
+ iln_sty[@]:=check_path_style (i_sty, drv_iln_sty);
+ if drv_boxmode_on:
+ boxed[@]:=true;
+ fi
+ fi
+enddef;
+
+vardef DCL[] (text PRM) (expr lilb, rilb, ldlb, rdlb)
+ (suffix j_sty, a_sty, i_sty) text SUB=
+ NFR[@] (PRM) (lilb, rilb, ldlb, rdlb, j_sty, a_sty, i_sty);
+ jgm[@] SUB;
+enddef;
+
+vardef MVD[] (expr inf_num, lplb, rplb) (suffix a_sty, p_sty)=
+ if inf_num<1:
+ drv_errhelp "The minimal value is 1.";
+ drv_errmessage (decimal inf_num)&" is not a valid number of inference"&
+ " steps";
+ else:
+ save aux_idx, aux_sty, phm_jdg;
+ numeric aux_idx, aux_sty;
+ picture phm_jdg;
+ aux_sty:=check_path_style (p_sty, drv_phm_sty);
+ phm_jdg:=nullpicture;
+ setbounds phm_jdg to (0, 0)--(iln_hg[aux_sty]-iln_dp[aux_sty], 0)--cycle;
+ aux_idx:=@;
+ for i=1 upto inf_num:
+ phm_idx:=phm_idx-1;
+ box_init jdg[phm_idx] (phm_jdg);
+ sbj_num[phm_idx]:=0;
+ NFR[phm_idx] (aux_idx) ("", "", "", "", 0, a_sty, 0);
+ aux_idx:=phm_idx;
+ endfor
+ src[@]:=phm_idx;
+ tgt[phm_idx]:=@;
+ phm_sty[phm_idx]:=aux_sty;
+ %
+ % lplb, rplb: phantom steps labels
+ %
+ opt_init[plb_sty[drv_sty]] l_plb[phm_idx] lplb;
+ opt_init[plb_sty[drv_sty]] r_plb[phm_idx] rplb;
+ phm_idx
+ fi
+enddef;
+
+vardef bxd[]=
+ boxed[@]:=true;
+ @
+enddef;
+
+%
+% Optional labels & shorthands
+%
+
+numeric drv_jct_sty; % default junction style
+string drv_alg_sty; % default junction style
+numeric drv_iln_sty; % default inference line path-style
+numeric drv_phm_sty; % default phantom steps path-style
+
+boolean drv_left_ilb; % inference labels on the left
+boolean drv_left_dlb; % delimiter labels (hence delimiters) on the left
+boolean drv_left_plb; % phantom steps labels on the left
+
+vardef arg_type expr arg=
+ if picture arg:
+ "picture"
+ else:
+ "string"
+ fi
+enddef;
+
+vardef opt_lbls @# (text LBL) expr left_lbls=
+ save lbl_num, fst_lbl, snd_lbl;
+ numeric lbl_num;
+ lbl_num:=0;
+ for lbl=LBL:
+ if lbl_num=0:
+ scantokens (arg_type lbl) fst_lbl;
+ fst_lbl:=lbl;
+ elseif lbl_num=1:
+ scantokens (arg_type lbl) snd_lbl;
+ snd_lbl:=lbl;
+ else:
+ drv_errhelp "At most two labels can be specified:"&
+ " a left one and a right one.";
+ drv_errmessage "more than two labels have been specified";
+ fi
+ lbl_num:=lbl_num+1;
+ endfor
+ if lbl_num=0:
+ string @#.l;
+ string @#.r;
+ @#.l:="";
+ @#.r:="";
+ elseif lbl_num=1:
+ if left_lbls:
+ scantokens (arg_type fst_lbl) @#.l;
+ string @#.r;
+ @#.l:=fst_lbl;
+ @#.r:="";
+ else:
+ string @#.l;
+ scantokens (arg_type fst_lbl) @#.r;
+ @#.l:="";
+ @#.r:=fst_lbl;
+ fi
+ else:
+ scantokens (arg_type fst_lbl) @#.l;
+ scantokens (arg_type snd_lbl) @#.r;
+ @#.l:=fst_lbl;
+ @#.r:=snd_lbl;
+ fi
+enddef;
+
+vardef NFR_opt[] (text PRM) (text ILB) (text DLB)
+ (suffix j_sty, a_sty, i_sty)=
+ opt_lbls ilb (ILB) drv_left_ilb;
+ opt_lbls dlb (DLB) drv_left_dlb;
+ NFR[@] (PRM) (ilb.l, ilb.r, dlb.l, dlb.r, j_sty, a_sty, i_sty);
+enddef;
+
+vardef DCL_opt[] (text PRM) (text ILB) (text DLB)
+ (suffix j_sty, a_sty, i_sty) text SUB=
+ NFR_opt[@] (PRM) (ILB) (DLB) (j_sty, a_sty, i_sty);
+ jgm[@] SUB;
+enddef;
+
+vardef MVD_opt[] (expr inf_num) (text PLB) (suffix a_sty, p_sty)=
+ opt_lbls plb (PLB) drv_left_plb;
+ MVD[@] (inf_num, plb.l, plb.r, a_sty, p_sty)
+enddef;
+
+% Nfr, Dcl & Mvd
+
+vardef Nfr[] (text PRM) (expr ilb, ldlb, rdlb) (suffix i_sty)=
+ NFR_opt[@] (PRM) (ilb) (ldlb, rdlb) (_, _, i_sty);
+enddef;
+
+vardef Dcl[] (text PRM) (expr ilb, ldlb, rdlb) (suffix i_sty) text SUB=
+ Nfr[@] (PRM) (ilb, ldlb, rdlb, i_sty);
+ jgm[@] SUB;
+enddef;
+
+vardef Mvd[] (expr inf_num, lplb, rplb) (suffix p_sty)=
+ MVD[@] (inf_num, lplb, rplb, _, p_sty)
+enddef;
+
+% nfr, dcl & mvd
+
+vardef nfr[] (text PRM) (expr ilb) (suffix i_sty)=
+ NFR_opt[@] (PRM) (ilb) () (_, _, i_sty);
+enddef;
+
+vardef dcl[] (text PRM) (expr ilb) (suffix i_sty) text SUB=
+ nfr[@] (PRM) (ilb, i_sty);
+ jgm[@] SUB;
+enddef;
+
+vardef mvd[] (expr inf_num) (suffix p_sty)=
+ MVD_opt[@] (inf_num) () (_, p_sty)
+enddef;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Pictured paths
+%
+
+vardef dotted_aux (expr pth, dot_wd, dots_dist)=
+ save pth_len, pct;
+ numeric pth_len;
+ picture pct;
+ pth_len:=arclength pth;
+ pct:=nullpicture;
+ if dots_dist>0:
+ stp_num:=round ((pth_len-dot_wd)/dots_dist);
+ if stp_num>0:
+ stp_len:=(pth_len-dot_wd)/stp_num;
+ addto pct doublepath pth dashed dashpattern (on 0 off stp_len)
+ shifted (dot_wd/2, 0) withpen pencircle scaled dot_wd;
+ fi
+ fi
+ pct
+enddef;
+
+primarydef pth dotted wd_dist=
+ dotted_aux(pth, xpart wd_dist, ypart wd_dist)
+enddef;
+
+vardef expanded_aux (expr pth, scl, dir, stp_len)=
+ save pth_len, aux_len;
+ numeric pth_len, aux_len;
+ pth_len:=arclength pth;
+ if (stp_len>0) and (pth_len>stp_len):
+ aux_len:=pth_len/(pth_len div stp_len);
+ point arctime 0 of pth of pth shifted
+ (unitvector direction arctime 0 of pth of pth
+ rotated dir scaled scl)..
+ {direction arctime 0 of pth of pth}
+ for i=aux_len step aux_len until pth_len-aux_len:
+ point arctime i of pth of pth shifted
+ (unitvector direction arctime i of pth of pth
+ rotated dir scaled scl)
+ {direction arctime i of pth of pth}..
+ endfor
+ point arctime pth_len of pth of pth shifted
+ (unitvector direction arctime pth_len of pth of pth
+ rotated dir scaled scl)
+ {direction arctime pth_len of pth of pth}
+ else:
+ pth
+ fi
+enddef;
+
+primarydef pth expanded scl_dir_len=
+ expanded_aux (pth,
+ redpart scl_dir_len, greenpart scl_dir_len, bluepart scl_dir_len)
+enddef;
+
+vardef waved_aux (expr pth, amp)=
+ save pth_len, mid;
+ numeric pth_len, mid;
+ pth_len:=arclength pth;
+ if (amp>0) and (pth_len>2(1+sqrt 5)*amp):
+ mid:=pth_len/(2(pth_len div (2(1+sqrt 5)*amp)));
+ point arctime 0 of pth of pth shifted
+ (unitvector direction arctime 0 of pth of pth
+ rotated -90 scaled amp)
+ {direction arctime 0 of pth of pth}
+ for i=mid step 2mid until pth_len:
+ ..point arctime i of pth of pth shifted
+ (unitvector direction arctime i of pth of pth
+ rotated 90 scaled amp)
+ {direction arctime i of pth of pth}
+ ..point arctime i+mid of pth of pth shifted
+ (unitvector direction arctime i+mid of pth of pth
+ rotated -90 scaled amp)
+ {direction arctime i+mid of pth of pth}
+ endfor
+ else:
+ pth
+ fi
+enddef;
+
+primarydef pth waved amp=
+ waved_aux(pth, amp)
+enddef;
+
+vardef drv_styled_aux[] expr pth=
+ save sty_idx, pth_len, pct;
+ numeric sty_idx, pth_len;
+ picture pct;
+ sty_idx:=check_path_style (@, 1);
+ pth_len:=arclength pth;
+ pct:=nullpicture;
+ if sty_idx=1:
+ interim linecap:=butt;
+ addto pct doublepath pth withpen drv_pen;
+ elseif sty_idx=2:
+ interim linecap:=butt;
+ addto pct doublepath pth
+ expanded (1.25rul_thk[drv_sty], 90, rul_thk[drv_sty])
+ withpen drv_pen;
+ addto pct doublepath pth
+ expanded (1.25rul_thk[drv_sty], -90, rul_thk[drv_sty])
+ withpen drv_pen;
+ elseif sty_idx=3:
+ addto pct also pth dotted (rul_thk[drv_sty], 2rul_thk[drv_sty]);
+ elseif sty_idx=4:
+ if rul_thk[drv_sty]>0:
+ interim linecap:=butt;
+ save dsh_num, dsh_len;
+ numeric dsh_num, dsh_len;
+ dsh_num:=round(pth_len/(3rul_thk[drv_sty]));
+ dsh_len:=
+ if odd dsh_num:
+ pth_len/dsh_num
+ else:
+ pth_len/(dsh_num+1)
+ fi;
+ addto pct doublepath pth dashed dashpattern(on dsh_len off dsh_len)
+ withpen drv_pen;
+ fi
+ elseif sty_idx=5:
+ interim linecap:=butt;
+ addto pct doublepath pth
+ waved 1.25rul_thk[drv_sty] withpen drv_pen;
+ elseif (sty_idx=6) and (pth_len>0):
+ addto pct also pth dotted (pdt_hg[drv_sty], pdt_wd[drv_sty]);
+ fi
+ pct
+enddef;
+
+primarydef pth drv_styled sty=
+ drv_styled_aux[sty] pth
+enddef;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Delimiters
+%
+
+%
+% 1. Global parameters
+%
+
+string drv_l_dlm; % left delimiter LaTeX code
+string drv_r_dlm; % right delimiter LaTeX code
+
+%
+% 2. Macros
+%
+
+vardef minmax_y[]=(
+ if drv_bot_roots:
+ if known ccl[@]:
+ ypart jdg[@].c-num_hg+iln_hg[(iln_sty[ccl[@]])]
+ +min_clr_scl*min_clr[drv_sty]/2
+ else:
+ smin_y[@]-min_clr_scl*min_clr[drv_sty]
+ fi,
+ smax_y[@]+min_clr_scl*min_clr[drv_sty]
+ else:
+ smin_y[@]-min_clr_scl*min_clr[drv_sty],
+ if known ccl[@]:
+ ypart jdg[@].c-den_dp-iln_hg[(iln_sty[ccl[@]])]
+ -min_clr_scl*min_clr[drv_sty]/2
+ else:
+ smax_y[@]+min_clr_scl*min_clr[drv_sty]
+ fi
+ fi)
+enddef;
+
+vardef delim @# expr dlm_len=
+ save rule_str, dlm_str, dlm_pct, dlm_dp;
+ string rule_str, dlm_str;
+ picture dlm_pct;
+ numeric dlm_dp;
+ rule_str:="\rule{0bp}{"&(decimal(dlm_len/2+axis_hg[drv_sty]))&"bp}";
+ dlm_str:=
+ if str @#="l":
+ "\left"&drv_l_dlm&rule_str&"\right."
+ else:
+ "\left."&rule_str&"\right"&drv_r_dlm
+ fi;
+ dlm_pct:=mth_tex[drv_sty] dlm_str;
+ dlm_dp:=depth dlm_pct;
+ if dlm_dp=0:
+ nullpicture
+ else:
+ begingroup
+ setbounds dlm_pct to
+ (xpart llcorner dlm_pct, dlm_dp)
+ --(xpart ulcorner dlm_pct, -dlm_dp)
+ --(xpart urcorner dlm_pct, -dlm_dp)
+ --(xpart lrcorner dlm_pct, dlm_dp)
+ --cycle;
+ dlm_pct yscaled (dlm_len/(2*height dlm_pct))
+ endgroup
+ fi
+enddef;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Checking, building, freezing (very inefficient, to be improved)
+%
+
+%
+% 1. Global parameters
+%
+
+numeric min_clr_scl; %
+numeric prm_skp_scl; %
+numeric jdg_skp_scl; %
+numeric ilb_skp_scl; %
+numeric plb_skp_scl; %
+
+boolean drv_bot_roots; %
+boolean drv_boxmode_on; %
+boolean drv_fractionmode_on; %
+string drv_axis_ref; %
+
+%
+% 2. Macros
+%
+
+%
+% Checking
+%
+
+vardef fraction_inference[]=
+ (prm_num[@]=0)
+ and (iln_sty[@]=0)
+ and (unknown l_ilb[@])
+ and (unknown r_ilb[@])
+ and drv_fractionmode_on
+enddef;
+
+vardef drv_check_root[]=
+ if unknown jdg[@]:
+ drv_errhelp "An index must be used to declare a both a judgment and an"&
+ " inference.";
+ drv_errmessage (decimal @)&" has been used as an inference index but not"&
+ " as a judgment index";
+ elseif unknown prm_num[@]:
+ drv_errhelp "An index must be used to declare a both a judgment and an"&
+ " inference.";
+ drv_errmessage (decimal @)&" has been used as a judgment index but not"&
+ " as an inference index";
+ else:
+ save i_sty, prm_idx;
+ numeric i_sty, prm_idx;
+ i_sty:=iln_sty[@];
+ for prm_rnk=0 upto prm_num[@]-1:
+ prm_idx:=prm[@][prm_rnk];
+ drv_check_root[prm_idx];
+ %
+ % numerators and denominators clearances
+ % The TEXbook, Appendix G, Rule 15d.
+ %
+ if drv_bot_roots:
+ num_hg:=max(num_hg,
+ iln_hg[i_sty]+min_clr_scl*min_clr[drv_sty]-jdg[prm_idx].dp);
+ else:
+ den_dp:=min(den_dp,
+ iln_dp[i_sty]-min_clr_scl*min_clr[drv_sty]-jdg[prm_idx].hg);
+ fi
+ endfor
+ if not fraction_inference[@]:
+ if drv_bot_roots:
+ den_dp:=min(den_dp,
+ iln_dp[i_sty]-min_clr_scl*min_clr[drv_sty]-jdg[@].hg);
+ else:
+ num_hg:=max(num_hg,
+ iln_hg[i_sty]+min_clr_scl*min_clr[drv_sty]-jdg[@].dp);
+ fi
+ fi
+ if unknown boxed[@]:
+ boxed[@]:=false;
+ fi
+ fi
+enddef;
+
+vardef drv_check=
+ if root_num=0:
+ drv_errhelp "Well ...";
+ drv_errmessage "no inference has been declared";
+ else:
+ save root_idx;
+ numeric root_idx;
+ root_idx:=root[0];
+ drv_check_root[root_idx];
+ if root_num>1:
+ save root_str;
+ string root_str;
+ root_str:=decimal root_idx;
+ for idx=1 upto root_num-1:
+ root_idx:=root[idx];
+ drv_check_root[root_idx];
+ root_str:=root_str&", "&(decimal root_idx);
+ endfor
+ drv_message "warning, multiple root indices ("&root_str&").";
+ fi
+ fi
+ drv_checked:=true;
+enddef;
+
+%
+% Building
+%
+
+vardef drv_build_root[]=
+ %
+ % premises junction (from left to right)
+ %
+ for prm_rnk=0 upto prm_num[@]-1:
+ drv_build_root[prm[@][prm_rnk]];
+ if prm_rnk>0:
+ save ll_idx, lr_idx, rl_idx, rr_idx;
+ save lmax_x, rmin_x, min_skp;
+ numeric ll_idx, lr_idx, rl_idx, rr_idx;
+ numeric lmax_x, rmin_x, min_skp;
+ ypart jdg[prm[@][prm_rnk-1]].c=ypart jdg[prm[@][prm_rnk]].c;
+ ll_idx:=prm[@][0];
+ lr_idx:=prm[@][prm_rnk-1];
+ rl_idx:=prm[@][prm_rnk];
+ rr_idx:=prm[@][prm_rnk];
+ lmax_x:=imax_x[lr_idx];
+ rmin_x:=imin_x[rl_idx];
+ min_skp[0]:=rmin_x-lmax_x;
+ forever:
+ exitif (unknown r_prm[lr_idx]) or (unknown l_prm[rl_idx]);
+ ll_idx:=l_prm[ll_idx];
+ lr_idx:=r_prm[lr_idx];
+ rl_idx:=l_prm[rl_idx];
+ rr_idx:=r_prm[rr_idx];
+ lmax_x:=max(lmax_x, imax_x[lr_idx]);
+ rmin_x:=min(rmin_x, imin_x[rl_idx]);
+ min_skp[0]:=min(min_skp[0], imin_x[rl_idx]-imax_x[lr_idx]);
+ endfor
+ min_skp[1]:=rmin_x-lmax_x;
+ if known r_prm[lr_idx]:
+ r_prm[rr_idx]:= r_prm[lr_idx];
+ lmax_x:=smax_x[lr_idx];
+ elseif known l_prm[rl_idx]:
+ l_prm[ll_idx]:=l_prm[rl_idx];
+ rmin_x:=smin_x[rl_idx];
+ fi
+ min_skp[2]:=rmin_x-lmax_x;
+ if jct_sty[@]<3:
+ min_skp[jct_sty[@]]=prm_skp_scl*prm_skp[drv_sty];
+ fi
+ fi
+ endfor
+ if prm_num[@]>0:
+ l_prm[@]:=prm[@][0];
+ r_prm[@]:=prm[@][prm_num[@]-1];
+ fi
+ %
+ % judgment alignment
+ %
+ if prm_num[@]=0:
+ imin_x[@]:=xpart jdg[@].l-jdg_skp_scl*jdg_skp[jdg_sty[drv_sty]];
+ imax_x[@]:=xpart jdg[@].r+jdg_skp_scl*jdg_skp[jdg_sty[drv_sty]];
+ else:
+ save l_xref, r_xref;
+ l_xref=
+ if boxed[prm[@][0]]:
+ smin_x[prm[@][0]]
+ else:
+ xpart jdg[prm[@][0]].l
+ fi;
+ r_xref=
+ if boxed[prm[@][prm_num[@]-1]]:
+ smax_x[prm[@][prm_num[@]-1]]
+ else:
+ xpart jdg[prm[@][prm_num[@]-1]].r
+ fi;
+ if alg_sty[@]="l":
+ xpart jdg[@].l=l_xref;
+ elseif alg_sty[@]="c":
+ xpart jdg[@].c=(l_xref+r_xref)/2;
+ elseif alg_sty[@]="r":
+ xpart jdg[@].r=r_xref;
+ fi
+ imin_x[@]:=min(xpart jdg[@].l, l_xref)
+ -jdg_skp_scl*jdg_skp[jdg_sty[drv_sty]];
+ imax_x[@]:=max(xpart jdg[@].r, r_xref)
+ +jdg_skp_scl*jdg_skp[jdg_sty[drv_sty]];
+ fi
+ %
+ % inference line
+ %
+ save iln_wd, iln_pct;
+ numeric iln_wd;
+ picture iln_pct;
+ iln_wd:=imax_x[@]-imin_x[@];
+ iln_pct:=((0, 0)--(iln_wd, 0)) drv_styled iln_sty[@];
+ setbounds iln_pct to
+ (0, ypart llcorner iln_pct)
+ --(0, ypart ulcorner iln_pct)
+ --(iln_wd, ypart ulcorner iln_pct)
+ --(iln_wd, ypart llcorner iln_pct)
+ --cycle; % ! `linecap:=butt' and `linecap:=squared' -> same bounding box !
+ box_init iln[@] (iln_pct);
+ xpart iln[@].c=(imin_x[@]+imax_x[@])/2;
+ %
+ % orientation, smin_y & smax_y
+ %
+ if drv_bot_roots:
+ ypart iln[@].c=ypart jdg[@].c-den_dp;
+ smin_y[@]:=ypart jdg[@].c+jdg[@].dp;
+ smax_y[@]:=
+ if iln_sty[@]=0:
+ ypart jdg[@].c+jdg[@].hg
+ else:
+ ypart iln[@].c+iln[@].hg
+ fi;
+ if prm_num[@]>0:
+ ypart iln[@].c=ypart jdg[prm[@][0]].c-num_hg;
+ for prm_rnk=0 upto prm_num[@]-1:
+ smax_y[@]:=max(smax_y[@], smax_y[prm[@][prm_rnk]]);
+ endfor;
+ fi
+ else:
+ ypart iln[@].c=ypart jdg[@].c-num_hg;
+ smin_y[@]:=
+ if iln_sty[@]=0:
+ ypart jdg[@].c+jdg[@].dp
+ else:
+ ypart iln[@].c+iln[@].dp
+ fi;
+ smax_y[@]:=ypart jdg[@].c+jdg[@].hg;
+ if prm_num[@]>0:
+ ypart iln[@].c=ypart jdg[prm[@][0]].c-den_dp;
+ for prm_rnk=0 upto prm_num[@]-1:
+ smin_y[@]:=min(smin_y[@], smin_y[prm[@][prm_rnk]]);
+ endfor;
+ fi
+ fi
+ %
+ % inference labels
+ %
+ if known l_ilb[@]:
+ l_ilb[@].r=iln[@].l shifted (-ilb_skp_scl*ilb_skp[drv_sty], 0);
+ imin_x[@]:=xpart l_ilb[@].l;
+ smin_y[@]:=min(smin_y[@], ypart l_ilb[@].c+l_ilb[@].dp);
+ smax_y[@]:=max(smax_y[@], ypart l_ilb[@].c+l_ilb[@].hg);
+ fi
+ if known r_ilb[@]:
+ r_ilb[@].l=iln[@].r shifted (ilb_skp_scl*ilb_skp[drv_sty], 0);
+ imax_x[@]:=xpart r_ilb[@].r;
+ smin_y[@]:=min(smin_y[@], ypart r_ilb[@].c+r_ilb[@].dp);
+ smax_y[@]:=max(smax_y[@], ypart r_ilb[@].c+r_ilb[@].hg);
+ fi
+ %
+ % phantom steps
+ %
+ if known tgt[@]:
+ save phm_pth, phm_pct;
+ path phm_pth;
+ picture phm_pct;
+ save top_y, mid_y, bot_y;
+ numeric top_y, bot_y;
+ if drv_bot_roots:
+ bot_y:=xpart minmax_y[@]+min_clr_scl*min_clr[drv_sty]/2;
+ top_y:=xpart minmax_y[tgt[@]];
+ else:
+ bot_y:=ypart minmax_y[tgt[@]];
+ top_y:=ypart minmax_y[@]-min_clr_scl*min_clr[drv_sty]/2;
+ fi
+ mid_y:=(top_y+bot_y)/2;
+ phm_pth:=(0, (bot_y-top_y)/2)--(0, (top_y-bot_y)/2);
+ phm_pct:=phm_pth drv_styled phm_sty[@];
+ box_init phm[@] (phm_pct shifted ((width phm_pct)/2, 0));
+ phm[@].c=(xpart jdg[@].c, mid_y);
+ imin_x[@]:=min(imin_x[@], xpart phm[@].l);
+ imax_x[@]:=max(imax_x[@], xpart phm[@].r);
+ %
+ % phantom steps labels
+ %
+ if known l_plb[@]:
+ l_plb[@].r=phm[@].l shifted (-plb_skp[drv_sty], 0);
+ imin_x[@]:=min(imin_x[@], xpart l_plb[@].l);
+ fi
+ if known r_plb[@]:
+ r_plb[@].l=phm[@].r shifted ( plb_skp[drv_sty], 0);
+ imax_x[@]:=max(imax_x[@], xpart r_plb[@].r);
+ fi
+ fi
+ %
+ % smin_x & smax_x
+ %
+ smin_x[@]:=imin_x[@];
+ smax_x[@]:=imax_x[@];
+ for prm_rnk=0 upto prm_num[@]-1:
+ smin_x[@]:=min(smin_x[@], smin_x[prm[@][prm_rnk]]);
+ smax_x[@]:=max(smax_x[@], smax_x[prm[@][prm_rnk]]);
+ endfor
+ %
+ % delimiters
+ %
+ if known l_dlb[@] or known r_dlb[@]:
+ save idx, mmy, min_y, max_y;
+ numeric idx, min_y, max_y;
+ pair mmy;
+ mmy:=minmax_y[@];
+ min_y:=xpart mmy;
+ max_y:=ypart mmy;
+ if known l_dlb[@]:
+ box_init l_dlm[@] (delim l (max_y-min_y));
+ l_dlm[@].r=(smin_x[@], (max_y+min_y)/2);
+ l_dlb[@].r=l_dlm[@].l;
+ smin_x[@]:=xpart l_dlb[@].l;
+ fi
+ if known r_dlb[@]:
+ box_init r_dlm[@] (delim r (max_y-min_y));
+ r_dlm[@].l=(smax_x[@], (max_y+min_y)/2);
+ r_dlb[@].l=r_dlm[@].r;
+ smax_x[@]:=xpart r_dlb[@].r;
+ fi
+ fi
+ if (known l_dlb[@]) or boxed[@]:
+ idx:=@;
+ forever:
+ imin_x[idx]:=smin_x[@];
+ exitif unknown l_prm[idx];
+ idx:=l_prm[idx];
+ endfor
+ fi
+ if (known r_dlb[@]) or boxed[@]:
+ idx:=@;
+ forever:
+ imax_x[idx]:=smax_x[@];
+ exitif unknown r_prm[idx];
+ idx:=r_prm[idx];
+ endfor
+ fi
+enddef;
+
+vardef drv_build=
+ if not drv_checked:
+ drv_check;
+ fi
+ for idx=0 upto root_num-1:
+ drv_build_root[root[idx]];
+ endfor
+ drv_built:=true;
+enddef;
+
+%
+% Freezing
+%
+
+vardef drv_freeze_root[]=
+ for prm_rnk=0 upto prm_num[@]-1:
+ drv_freeze_root[prm[@][prm_rnk]];
+ endfor
+ for sbj_rnk=0 upto sbj_num[@]-1:
+ box_freeze sbj[@][sbj_rnk];
+ endfor
+ forsuffixes sfx=
+ iln, jdg, phm,
+ l_dlb, l_dlm, l_ilb, l_plb,
+ r_dlb, r_dlm, r_ilb, r_plb:
+ if known sfx[@]:
+ box_freeze sfx[@];
+ fi
+ endfor
+enddef;
+
+vardef drv_freeze=
+ if not drv_built:
+ drv_build;
+ fi
+ save root_idx;
+ numeric root_idx;
+ root_idx:=root[0];
+ if unknown iln[root_idx].c:
+ %
+ % default math axis
+ %
+ if drv_axis_ref="iln":
+ iln[root_idx].c=(0, axis_hg[drv_sty]);
+ else: % drv_axis_ref="jdg"
+ jdg[root_idx].c=(0, axis_hg[drv_sty]);
+ fi
+ drv_freeze_root[root_idx];
+ fi
+ for idx=1 upto root_num-1:
+ root_idx:=root[idx];
+ if unknown iln[root_idx].c:
+ smin_x[root_idx]=smax_x[root[idx-1]]+prm_skp_scl*prm_skp[drv_sty];
+ ypart iln[root_idx].c=ypart iln[root[idx-1]].c;
+ fi
+ drv_freeze_root[root_idx];
+ endfor
+ drv_frozen:=true;
+enddef;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Derivation tree pictures
+%
+
+%
+% 1. Global parameters
+%
+
+boolean drv_proofmode_on; %
+color prf_clr; %
+color jdg_clr; %
+color sbj_clr; %
+
+prf_clr:=.75background; % arbitrary
+jdg_clr:=red; % arbitrary
+sbj_clr:=blue; % arbitrary
+
+%
+% 2. Macros
+%
+
+vardef drv_tree_addto @# (expr idx) text draw_options=
+ for prm_rnk=0 upto prm_num[idx]-1:
+ drv_tree_addto @# (prm[idx][prm_rnk]) draw_options;
+ endfor
+ forsuffixes sfx=
+ jdg, phm,
+ l_dlb, l_dlm, l_ilb, l_plb,
+ r_dlb, r_dlm, r_ilb, r_plb:
+ if known sfx[idx]:
+ addto @# also sfx[idx] draw_options;
+ fi
+ endfor
+ if iln_sty[idx]>0:
+ addto @# also iln[idx] draw_options;
+ fi
+enddef;
+
+vardef tt_nat[] expr nat= % typewriter typeface naturals
+ save nat_aux, nat_pct_wd, dgt_num, nat_pct;
+ numeric nat_aux, nat_pct_wd, dgt_num;
+ picture nat_pct;
+ nat_aux:=abs nat;
+ nat_pct:=nullpicture;
+ nat_pct_wd:=0;
+ dgt_num:=1;
+ forever:
+ exitif nat_aux div (10**dgt_num)=0;
+ dgt_num:=dgt_num+1;
+ endfor
+ for rnk:=1 upto dgt_num:
+ addto nat_pct also tt_dgt[@][nat_aux div (10**(dgt_num-rnk))]
+ shifted (nat_pct_wd, 0);
+ nat_pct_wd:=width nat_pct;
+ nat_aux:=nat_aux mod (10**(dgt_num-rnk));
+ endfor
+ nat_pct shifted (0, -axis_hg[@])
+enddef;
+
+vardef prf_tree_addto @# expr idx=
+ for prm_rnk=0 upto prm_num[idx]-1:
+ prf_tree_addto @# (prm[idx][prm_rnk]);
+ endfor
+ if idx>=0:
+ box_init jdg_prf[idx] (tt_nat[2] idx);
+ jdg_prf[idx].r=jdg[idx].l;
+ box_freeze jdg_prf[idx];
+ addto @# also jdg_prf[idx] withcolor jdg_clr;
+ addto @# doublepath jdg[idx].c withcolor jdg_clr
+ withpen pencircle scaled (2*pdt_hg[drv_sty]);
+ fi
+ for sbj_rnk=0 upto sbj_num[idx]-1:
+ box_init sbj_prf[idx][sbj_rnk] (tt_nat[3] sbj_rnk);
+ if odd sbj_rnk:
+ sbj_prf[idx][sbj_rnk].c shifted (0, sbj_prf[idx][sbj_rnk].hg)=
+ sbj[idx][sbj_rnk].c
+ shifted (0, -den_dp-min_clr_scl*min_clr[drv_sty]/2);
+ else:
+ sbj_prf[idx][sbj_rnk].c shifted (0, sbj_prf[idx][sbj_rnk].dp)=
+ sbj[idx][sbj_rnk].c
+ shifted (0, -num_hg+min_clr_scl*min_clr[drv_sty]/2);
+ fi
+ box_freeze sbj_prf[idx][sbj_rnk];
+ addto @# also sbj_prf[idx][sbj_rnk] withcolor sbj_clr;
+ addto @# doublepath sbj[idx][sbj_rnk].c withcolor sbj_clr
+ withpen pencircle scaled pdt_hg[drv_sty];
+ endfor
+enddef;
+
+vardef drv_tree=
+ save pct;
+ picture pct;
+ pct:=nullpicture;
+ if not drv_frozen:
+ drv_freeze;
+ fi
+ for root_idx=0 upto root_num-1:
+ if drv_proofmode_on:
+ drv_tree_addto pct (root[root_idx]) withcolor prf_clr;
+ prf_tree_addto pct (root[root_idx]);
+ else:
+ drv_tree_addto pct (root[root_idx]);
+ fi
+ endfor
+ pct
+enddef;
+
+vardef drv_bbox[]=
+ save min_x, max_x, mmy, min_y, max_y;
+ pair mmy;
+ numeric min_x, max_x, max_y, min_y;
+ if not drv_frozen:
+ drv_freeze;
+ fi
+ min_x:=
+ if known l_dlm[@].r:
+ xpart l_dlm[@].r
+ else:
+ smin_x[@]
+ fi-jdg_skp_scl*jdg_skp[jdg_sty[drv_sty]];
+ max_x:=
+ if known r_dlm[@].l:
+ xpart l_dlm[@].l
+ else:
+ smax_x[@]
+ fi+jdg_skp_scl*jdg_skp[jdg_sty[drv_sty]];
+ mmy:=minmax_y[@];
+ min_y:=xpart mmy;
+ max_y:=ypart mmy;
+ (min_x, min_y)--
+ (min_x, max_y)--
+ (max_x, max_y)--
+ (max_x, min_y)--
+ cycle
+enddef;
+
+vardef mth_axis @# (suffix ref_sfx) (expr idx)=
+ if not drv_frozen:
+ drv_freeze;
+ fi
+ if unknown prm_num[idx]:
+ drv_errhelp "An index must be used to declare an inference before it is"&
+ " used to set the math axis of a picture.";
+ drv_errmessage "no inference has been declared using index "&(decimal idx);
+ else:
+ save ref_str, yref;
+ string ref_str;
+ numeric yref;
+ ref_str:=str ref_sfx;
+ if ref_str="iln":
+ yref:=ypart iln[idx].c;
+ elseif ref_str="jdg":
+ yref:=ypart jdg[idx].c;
+ elseif ref_str="dlm":
+ if known l_dlm[idx]:
+ yref:=ypart l_dlm[idx].c;
+ elseif known r_dlm[idx]:
+ yref:=ypart r_dlm[idx].c;
+ else:
+ drv_errhelp "Well ...";
+ drv_errmessage "no delimiter is attached to inference "&(decimal idx);
+ fi
+ else:
+ drv_errhelp "Valid identifiers are"&
+ " iln (inference line axis),"&
+ " jdg (judgment math-axis) and"&
+ " dlm (delimiter axis).";
+ drv_errmessage (ref_str&" is not a valid reference type identifier");
+ fi
+ if known yref:
+ @#:=@# shifted (0, axis_hg[drv_sty]-yref);
+ fi
+ fi
+enddef;
+
+vardef drv_axis (suffix ref) (expr idx)=
+ mth_axis currentpicture (ref, idx);
+enddef;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Tunings
+%
+
+vardef check_math_style (expr sty_str, default)=
+ if sty_str="\displaystyle":
+ 0
+ elseif sty_str="\textstyle":
+ 1
+ elseif sty_str="\scriptstyle":
+ 2
+ elseif sty_str="\scriptscriptstyle":
+ 3
+ else:
+ begingroup
+ drv_errhelp "Valid commands are"&
+ " \displaystyle,"&
+ " \textstyle,"&
+ " \scriptstyle and"&
+ " \scriptscriptstyle.";
+ drv_errmessage (sty_str&" is not a valid math-style command");
+ default
+ endgroup
+ fi
+enddef;
+
+vardef check_position_left (suffix pos_sfx) (expr default)=
+ save pos_str;
+ string pos_str;
+ pos_str:=str pos_sfx;
+ if (pos_str="l"):
+ true
+ elseif (pos_str="r"):
+ false
+ else:
+ begingroup
+ drv_errhelp "Valid identifiers are l (left) and r (right).";
+ drv_errmessage (pos_str&" is not a valid label position identifier");
+ default
+ endgroup
+ fi
+enddef;
+
+vardef check_mode_on (suffix status_sfx) (expr default)=
+ save status_str;
+ string status_str;
+ status_str:=str status_sfx;
+ if status_str="on":
+ true
+ elseif status_str="off":
+ false
+ else:
+ begingroup
+ drv_errhelp "Possible identifiers are on and off";
+ drv_errmessage (status_str&" is not a valid status identifier");
+ default
+ endgroup
+ fi
+enddef;
+
+vardef drv_math_style (suffix typ_sfx) (expr sty_str)=
+ save typ_str, sty_idx;
+ string typ_str;
+ numeric sty_idx;
+ typ_str:=str typ_sfx;
+ if (typ_str<>"drv")
+ and (typ_str<>"jdg")
+ and (typ_str<>"ilb")
+ and (typ_str<>"dlb")
+ and (typ_str<>"plb"):
+ drv_errhelp "Valid identifiers are"&
+ " drv (derivation tree),"&
+ " jdg (judgment),"&
+ " ilb (inference label),"&
+ " dlb (delimiter label) and"&
+ " plb (phantom steps label).";
+ drv_errmessage (sty_str&" is not a valid component identifier");
+ else:
+ sty_idx:=check_math_style (sty_str, 0);
+ if typ_str="drv":
+ drv_sty:=sty_idx;
+ else:
+ forsuffixes sfx=scantokens (typ_str&"_sty"):
+ for idx=0 upto 3:
+ sfx[idx]:=min(idx+sty_idx, 3);
+ endfor
+ endfor
+ fi
+ fi
+enddef;
+
+vardef drv_scale (suffix scl_sfx) (expr scl)=
+ save scl_str;
+ string scl_str;
+ scl_str:=str scl_sfx;
+ if scl_str="clr":
+ min_clr_scl:=scl;
+ elseif scl_str="prm":
+ prm_skp_scl:=scl;
+ elseif (scl_str="jdg") or (scl_str="jgm"): % "jgm" is deprecated
+ jdg_skp_scl:=scl;
+ elseif (scl_str="ilb") or (scl_str="lbl"): % "lbl" is deprecated
+ ilb_skp_scl:=scl;
+ else:
+ drv_errhelp "Valid identifiers are"&
+ " clr,"&
+ " prm,"&
+ " jdg and"&
+ " ilb.";
+ drv_errmessage (scl_str&" is not a valid scale identifier");
+ fi
+enddef;
+
+vardef drv_junction_style suffix sty_sfx=
+ drv_jct_sty:=check_junction_style (sty_sfx, drv_jct_sty);
+enddef;
+
+vardef drv_alignment_style suffix sty_sfx=
+ drv_alg_sty:=check_alignment_style (sty_sfx, drv_alg_sty);
+enddef;
+
+vardef drv_path_style (suffix typ_sfx, sty_sfx)=
+ save typ_str;
+ string typ_str;
+ typ_str:=str typ_sfx;
+ if typ_str="iln":
+ drv_iln_sty:=check_path_style (sty_sfx, drv_iln_sty);
+ elseif typ_str="phm":
+ drv_phm_sty:=check_path_style (sty_sfx, drv_phm_sty);
+ else:
+ drv_errhelp "Valid identifiers are"&
+ " iln (inference line) and"&
+ " phm (phantom steps path).";
+ drv_errmessage (typ_str&" is not a valid path-type identifier");
+ fi
+enddef;
+
+vardef drv_labels_position_aux (suffix typ_sfx, pos_sfx)=
+ save typ_str, idt_str, pos_str;
+ string typ_str, idt_str, pos_str;
+ typ_str:=str typ_sfx;
+ if typ_str="ilb":
+ drv_left_ilb:=check_position_left (pos_sfx, drv_left_ilb);
+ elseif typ_str="dlb":
+ drv_left_dlb:=check_position_left (pos_sfx, drv_left_dlb);
+ elseif typ_str="plb":
+ drv_left_plb:=check_position_left (pos_sfx, drv_left_plb);
+ else:
+ drv_errhelp "Valid identifiers are"&
+ " ilb (inference label),"&
+ " dlb (delimiter label) and"&
+ " plb (phantom steps label).";
+ drv_errmessage (typ_str&" is not a valid label-type identifier");
+ fi
+enddef;
+
+vardef drv_labels_position text ARG=
+ drv_labels_position_aux if pair ARG: ARG else: (ilb, ARG) fi;
+enddef;
+
+vardef drv_roots_position suffix pos_sfx=
+ save pos_str;
+ string pos_str;
+ pos_str:=str pos_sfx;
+ if pos_str="t":
+ drv_bot_roots:=false;
+ elseif pos_str="b":
+ drv_bot_roots:=true;
+ else:
+ drv_errhelp "Valid identifiers are"&
+ " t (top) and"&
+ " b (bottom).";
+ drv_errmessage (pos_str&" is not a valid root position identifier");
+ fi
+enddef;
+
+vardef drv_axis_reference suffix ref_sfx=
+ save ref_str;
+ string ref_str;
+ ref_str:=str ref_sfx;
+ if (ref_str<>"iln") and (ref_str<>"jdg"):
+ drv_errhelp "Valid identifiers are iln (inference line axis) and"&
+ " jdg (judgment math-axis).";
+ drv_errmessage (ref_str&" is not a valid reference identifier");
+ else:
+ drv_axis_ref:=ref_str;
+ fi
+enddef;
+
+vardef drv_delimiter (suffix pos_sfx) (expr dlm_str)=
+ if check_position_left (pos_sfx, true):
+ drv_l_dlm:=dlm_str;
+ else:
+ drv_r_dlm:=dlm_str;
+ fi
+enddef;
+
+vardef drv_left_delimiter expr dlm_str=
+ drv_delimiter (l, dlm_str);
+enddef;
+
+vardef drv_right_delimiter expr dlm_str=
+ drv_delimiter (r, dlm_str);
+enddef;
+
+vardef drv_box_mode suffix status_sfx=
+ drv_boxmode_on:=check_mode_on (status_sfx, drv_boxmode_on);
+enddef;
+
+vardef drv_fraction_mode suffix status_sfx=
+ drv_fractionmode_on:=check_mode_on (status_sfx, drv_fractionmode_on);
+enddef;
+
+vardef drv_proof_mode suffix status_sfx=
+ drv_proofmode_on:=check_mode_on (status_sfx, drv_proofmode_on);
+enddef;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Default settings
+%
+
+drv_font_size "\normalsize";
+drv_math_style (drv, "\displaystyle");
+drv_math_style (jdg, "\textstyle");
+drv_math_style (ilb, "\scriptstyle");
+drv_math_style (dlb, "\textstyle");
+drv_math_style (plb, "\textstyle");
+drv_scale (clr, 1);
+drv_scale (prm, 1);
+drv_scale (jdg, 1);
+drv_scale (ilb, 1);
+drv_junction_style 1;
+drv_alignment_style c;
+drv_path_style (iln, 1);
+drv_path_style (phm, 3);
+drv_labels_position (ilb, r);
+drv_labels_position (dlb, l);
+drv_labels_position (plb, l);
+drv_roots_position b;
+drv_axis_reference iln;
+drv_left_delimiter "\lbrace";
+drv_right_delimiter "\rbrace";
+drv_box_mode off;
+drv_fraction_mode on;
+drv_proof_mode off;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% LaTeX inclusion macro
+%
+% \drv includes a picture file in such a way that the baseline of the included
+% picture coincides with the baseline of the inclusion point. The code for \drv
+% was suggested by Josselin Noirel on the fr.comp.text.tex usenet group.
+%
+% \usepackage{graphicx}
+% \makeatletter
+% \def\Gin@def@bp#1\relax#2#3{\gdef#2{#3}}
+% \newsavebox{\graphicsbox}
+% \newcommand*{\drv}[1]{%
+% \sbox{\graphicsbox}{\includegraphics{#1}}%
+% \raisebox{\Gin@lly bp}%
+% {\usebox{\graphicsbox}}}
+% \makeatother
diff --git a/Master/texmf-dist/doc/metapost/drv/doc/makefile b/Master/texmf-dist/doc/metapost/drv/doc/makefile
new file mode 100644
index 00000000000..ce2f2b8c6cf
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/drv/doc/makefile
@@ -0,0 +1,46 @@
+MAIN= drv-guide
+
+$(MAIN).pdf: $(MAIN).ps
+ ps2pdf $(MAIN).ps
+
+$(MAIN).ps: $(MAIN).tex $(MAIN)-delayed.mp
+ latex $(MAIN)
+ latex $(MAIN)
+ latex $(MAIN)
+ dvips $(MAIN) -o
+
+$(MAIN)-proof.pdf: $(MAIN)-proof.ps
+ ps2pdf $(MAIN)-proof.ps
+
+$(MAIN)-proof.ps: $(MAIN)-delayed.mp
+ latex $(MAIN)-proof
+ dvips $(MAIN)-proof -o
+
+$(MAIN)-delayed.mp: $(MAIN).mp
+ $(RM) $(MAIN)-delayed.mp
+ mpost $(MAIN)
+ mpost $(MAIN)
+ mpost $(MAIN)
+
+.SILENT clean:
+ $(RM) drv.mpx
+ $(RM) $(MAIN).[0-9]*
+ $(RM) $(MAIN).aux
+ $(RM) $(MAIN).dvi
+ $(RM) $(MAIN).log
+ $(RM) $(MAIN).nav
+ $(RM) $(MAIN).out
+ $(RM) $(MAIN).toc
+ $(RM) $(MAIN)-delayed.mp
+ $(RM) $(MAIN)-delayed.mpx
+ $(RM) $(MAIN)-proof.aux
+ $(RM) $(MAIN)-proof.dvi
+ $(RM) $(MAIN)-proof.log
+ $(RM) $(MAIN)-proof.tex
+ $(RM) $(MAIN)-proof.toc
+
+cleanall: clean
+ $(RM) $(MAIN).pdf
+ $(RM) $(MAIN).ps
+ $(RM) $(MAIN)-proof.pdf
+ $(RM) $(MAIN)-proof.ps
diff --git a/Master/texmf-dist/doc/metapost/drv/doc/readme.txt b/Master/texmf-dist/doc/metapost/drv/doc/readme.txt
new file mode 100644
index 00000000000..66f2719391a
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/drv/doc/readme.txt
@@ -0,0 +1,17 @@
+# In order to compile the sources and to get a pdf file, use `make' or:
+
+# 1. run metapost THREE TIMES:
+mpost drv-guide.mp
+mpost drv-guide.mp
+mpost drv-guide.mp
+
+# 2. run latex (three times):
+latex drv-guide.tex
+latex drv-guide.tex
+latex drv-guide.tex
+
+# 3. run dvips (once):
+dvips drv-guide.dvi -o
+
+# 4. run ps2pdf (once):
+ps2pdf drv-guide.ps
diff --git a/Master/texmf-dist/doc/metapost/drv/drv-guide.pdf b/Master/texmf-dist/doc/metapost/drv/drv-guide.pdf
new file mode 100644
index 00000000000..ab7d917ba9e
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/drv/drv-guide.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/metapost/drv/sample/coq-sample.mp b/Master/texmf-dist/doc/metapost/drv/sample/coq-sample.mp
new file mode 100644
index 00000000000..c10dc3972c4
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/drv/sample/coq-sample.mp
@@ -0,0 +1,101 @@
+input drv;
+
+verbatimtex %&latex
+
+% Any piece of code related to font selection in the preambule of
+% `coq-sample.tex' (document class, font package, font selection commands ...)
+% should be reported here.
+
+\documentclass[8pt]{beamer}
+\usepackage[T1]{fontenc}
+\usepackage{amsmath}
+\usepackage[varg]{txfonts}
+\newcommand{\var}{\text{Var}}
+\newcommand{\app}{\text{App}}
+\newcommand{\lam}{\text{Lam}}
+\begin{document}
+etex;
+
+drv_font_size "\small";
+drv_labels_position l;
+
+for index=0 upto 6:
+ beginfig(index)
+ jgm 0 "\vdash", "(P\to(Q\to R))\to(Q\to(P\to R))";
+ jgm 1 "P\to(Q\to R)\vdash", "Q\to(P\to R)";
+ jgm 2 "P\to(Q\to R), Q\vdash", "P\to R";
+ jgm 3 "P\to(Q\to R), Q, P\vdash", "R";
+ jgm 4 "P\to(Q\to R), Q, P\vdash", "Q\to R";
+ jgm 5 "P\to(Q\to R), Q, P\vdash", "P\to(Q\to R)";
+ jgm 6 "P\to(Q\to R), Q, P\vdash", "P";
+ jgm 7 "P\to(Q\to R), Q, P\vdash", "Q";
+ nfr 0 (1) ("\lam", 1);
+ nfr 1 (2) ("\lam", 1);
+ nfr 2 (3) ("\lam", 1);
+ nfr 3 (4, 7) ("\app", 1);
+ nfr 4 (5, 6) ("\app", 1);
+ nfr 5 () ("\var", 1);
+ nfr 6 () ("\var", 1);
+ nfr 7 () ("\var", 1);
+ setbounds currentpicture to drv_bbox 0;
+ % All the pictures will have the same bounding box
+ % as the complete derivation tree.
+ draw sbj[0][0];
+ if index=0:
+ draw sbj[0][1] withcolor blue;
+ else:
+ draw sbj[0][1];
+ draw iln[0];
+ draw l_ilb[0];
+ draw sbj[1][0];
+ if index=1:
+ draw sbj[1][1] withcolor blue;
+ else:
+ draw sbj[1][1];
+ draw iln[1];
+ draw l_ilb[1];
+ draw sbj[2][0];
+ if index=2:
+ draw sbj[2][1] withcolor blue;
+ else:
+ draw sbj[2][1];
+ draw iln[2];
+ draw l_ilb[2];
+ draw sbj[3][0];
+ if index=3:
+ draw sbj[3][1] withcolor blue;
+ else:
+ draw sbj[3][1];
+ draw iln[3];
+ draw l_ilb[3];
+ draw jdg[4];
+ draw iln[4];
+ draw l_ilb[4];
+ draw jdg[5];
+ draw iln[5];
+ draw l_ilb[5];
+ draw sbj[6][0];
+ draw sbj[7][0];
+ if index=4:
+ draw sbj[6][1] withcolor blue;
+ draw sbj[7][1] withcolor blue;
+ else:
+ draw sbj[6][1];
+ draw iln[6];
+ draw l_ilb[6];
+ if index=5:
+ draw sbj[7][1] withcolor blue;
+ else:
+ draw sbj[7][1];
+ draw iln[7];
+ draw l_ilb[7];
+ fi
+ fi
+ fi
+ fi
+ fi
+ fi
+ endfig;
+endfor
+
+end
diff --git a/Master/texmf-dist/doc/metapost/drv/sample/coq-sample.tex b/Master/texmf-dist/doc/metapost/drv/sample/coq-sample.tex
new file mode 100644
index 00000000000..d572ef3e7b0
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/drv/sample/coq-sample.tex
@@ -0,0 +1,258 @@
+% Any piece of code related to font selection in the following preambule
+% (document class, font package, font selection commands ...) should be
+% reported in `coq-sample.mp'.
+
+\documentclass[8pt]{beamer}
+\usetheme{Warsaw}
+
+\usepackage[T1]{fontenc}
+\usepackage{amsmath}
+\usepackage[varg]{txfonts}
+
+\usepackage{graphicx}
+\makeatletter
+\def\Gin@def@bp#1\relax#2#3{\gdef#2{#3}}
+\newsavebox{\graphicsbox}
+\newcommand*{\drv}[1]{%
+\sbox{\graphicsbox}{\includegraphics{#1}}%
+\raisebox{\Gin@lly bp}%
+{\usebox{\graphicsbox}}}
+\makeatother
+
+\title{Une construction de preuve en logique minimale}
+\institute{INF462 -- Master S\&T Informatique -- Bordeaux 1}
+\date{}
+
+\begin{document}
+
+\begin{frame}
+\titlepage
+\end{frame}
+
+\ttfamily
+\itshape
+\small
+
+\begin{frame}
+\begin{block}{}
+%
+% coq-tex output
+%
+\begin{overlayarea}{\textwidth}{.5\textheight}
+\only<1>{%
+ \textup{Coq~{<}~Variables~P~Q~R~:~Prop.}\\
+ P~is~assumed\\
+ Q~is~assumed\\
+ R~is~assumed\\
+ \medskip
+ \textup{%
+ Coq~{<}~Lemma~imp\_perm~:~(P~-{>}~(Q~-{>}~R))~-{>}~(Q~-{>}~(P~-{>}~R)).}\\
+ 1~subgoal\\
+ ~~\\
+ ~~P~:~Prop\\
+ ~~Q~:~Prop\\
+ ~~R~:~Prop\\
+ ~~============================\\
+ ~~~\textcolor{blue}{(P~-{>}~Q~-{>}~R)~-{>}~Q~-{>}~P~-{>}~R}\\
+ \medskip
+ \textup{Coq~{<}~Proof.}\\
+ \medskip
+ \textup{Coq~{<}}}
+\only<2>{%
+ \textup{Coq~{<}~Variables~P~Q~R~:~Prop.}\\
+ P~is~assumed\\
+ Q~is~assumed\\
+ R~is~assumed\\
+ \medskip
+ \textup{%
+ Coq~{<}~Lemma~imp\_perm~:~(P~-{>}~(Q~-{>}~R))~-{>}~(Q~-{>}~(P~-{>}~R)).}\\
+ 1~subgoal\\
+ ~~\\
+ ~~P~:~Prop\\
+ ~~Q~:~Prop\\
+ ~~R~:~Prop\\
+ ~~============================\\
+ ~~~\textcolor{blue}{(P~-{>}~Q~-{>}~R)~-{>}~Q~-{>}~P~-{>}~R}\\
+ \medskip
+ \textup{Coq~{<}~Proof.}\\
+ \medskip
+ \textup{Coq~{<}~~~intro~H.}}
+\only<3>{%
+ \textup{Coq~{<}~~~intro~H.}\\
+ 1~subgoal\\
+ ~~\\
+ ~~P~:~Prop\\
+ ~~Q~:~Prop\\
+ ~~R~:~Prop\\
+ ~~H~:~P~-{>}~Q~-{>}~R\\
+ ~~============================\\
+ ~~~\textcolor{blue}{Q~-{>}~P~-{>}~R}\\
+ \medskip
+ \textup{Coq~{<}}}
+\only<4>{%
+ \textup{Coq~{<}~~~intro~H.}\\
+ 1~subgoal\\
+ ~~\\
+ ~~P~:~Prop\\
+ ~~Q~:~Prop\\
+ ~~R~:~Prop\\
+ ~~H~:~P~-{>}~Q~-{>}~R\\
+ ~~============================\\
+ ~~~\textcolor{blue}{Q~-{>}~P~-{>}~R}\\
+ \medskip
+ \textup{Coq~{<}~~~intro~q.}}
+\only<5>{%
+ \textup{Coq~{<}~~~intro~q.}\\
+ 1~subgoal\\
+ ~~\\
+ ~~P~:~Prop\\
+ ~~Q~:~Prop\\
+ ~~R~:~Prop\\
+ ~~H~:~P~-{>}~Q~-{>}~R\\
+ ~~q~:~Q\\
+ ~~============================\\
+ ~~~\textcolor{blue}{P~-{>}~R}\\
+ \medskip
+ \textup{Coq~{<}}}
+\only<6>{%
+ \textup{Coq~{<}~~~intro~q.}\\
+ 1~subgoal\\
+ ~~\\
+ ~~P~:~Prop\\
+ ~~Q~:~Prop\\
+ ~~R~:~Prop\\
+ ~~H~:~P~-{>}~Q~-{>}~R\\
+ ~~q~:~Q\\
+ ~~============================\\
+ ~~~\textcolor{blue}{P~-{>}~R}\\
+ \medskip
+ \textup{Coq~{<}~~~intro~p.}}
+\only<7>{%
+ \textup{Coq~{<}~~~intro~p.}\\
+ 1~subgoal\\
+ ~~\\
+ ~~P~:~Prop\\
+ ~~Q~:~Prop\\
+ ~~R~:~Prop\\
+ ~~H~:~P~-{>}~Q~-{>}~R\\
+ ~~q~:~Q\\
+ ~~p~:~P\\
+ ~~============================\\
+ ~~~\textcolor{blue}{R}\\
+ \medskip
+ \textup{Coq~{<}}}
+\only<8>{%
+ \textup{Coq~{<}~~~intro~p.}\\
+ 1~subgoal\\
+ ~~\\
+ ~~P~:~Prop\\
+ ~~Q~:~Prop\\
+ ~~R~:~Prop\\
+ ~~H~:~P~-{>}~Q~-{>}~R\\
+ ~~q~:~Q\\
+ ~~p~:~P\\
+ ~~============================\\
+ ~~~\textcolor{blue}{R}\\
+ \medskip
+ \textup{Coq~{<}~~~apply~H.}}
+\only<9>{%
+ \textup{Coq~{<}~~~apply~H.}\\
+ 2~subgoals\\
+ ~~\\
+ ~~P~:~Prop\\
+ ~~Q~:~Prop\\
+ ~~R~:~Prop\\
+ ~~H~:~P~-{>}~Q~-{>}~R\\
+ ~~q~:~Q\\
+ ~~p~:~P\\
+ ~~============================\\
+ ~~~\textcolor{blue}{P}\\
+ subgoal~2~is:\\
+ ~\textcolor{blue}{Q}\\
+ \medskip
+ \textup{Coq~{<}}}
+\only<10>{%
+ \textup{Coq~{<}~~~apply~H.}\\
+ 2~subgoals\\
+ ~~\\
+ ~~P~:~Prop\\
+ ~~Q~:~Prop\\
+ ~~R~:~Prop\\
+ ~~H~:~P~-{>}~Q~-{>}~R\\
+ ~~q~:~Q\\
+ ~~p~:~P\\
+ ~~============================\\
+ ~~~\textcolor{blue}{P}\\
+ subgoal~2~is:\\
+ ~\textcolor{blue}{Q}\\
+ \medskip
+ \textup{Coq~{<}~~~assumption.}}
+\only<11>{%
+ \textup{Coq~{<}~~~assumption.}\\
+ 1~subgoal\\
+ ~~\\
+ ~~P~:~Prop\\
+ ~~Q~:~Prop\\
+ ~~R~:~Prop\\
+ ~~H~:~P~-{>}~Q~-{>}~R\\
+ ~~q~:~Q\\
+ ~~p~:~P\\
+ ~~============================\\
+ ~~~\textcolor{blue}{Q}\\
+ \medskip
+ \textup{Coq~{<}}}
+\only<12>{%
+ \textup{Coq~{<}~~~assumption.}\\
+ 1~subgoal\\
+ ~~\\
+ ~~P~:~Prop\\
+ ~~Q~:~Prop\\
+ ~~R~:~Prop\\
+ ~~H~:~P~-{>}~Q~-{>}~R\\
+ ~~q~:~Q\\
+ ~~p~:~P\\
+ ~~============================\\
+ ~~~\textcolor{blue}{Q}\\
+ \medskip
+ \textup{Coq~{<}~~~assumption.}}
+\only<13>{%
+ \textup{Coq~{<}~~~assumption.}\\
+ Proof~completed.\\
+ \medskip
+ \textup{Coq~{<}}}
+\only<14>{%
+ \textup{Coq~{<}~~~assumption.}\\
+ Proof~completed.\\
+ \medskip
+ \textup{Coq~{<}~Qed.}}
+\only<15>{%
+ \textup{Coq~{<}~Qed.}\\
+ intro~H.\\
+ intro~q.\\
+ intro~p.\\
+ apply~H.\\
+ assumption.\\
+ assumption.\\
+ imp\_perm~is~defined\\
+ \medskip
+ \textup{Coq~{<}~}}
+\end{overlayarea}
+\end{block}
+\begin{block}{}
+%
+% derivation tree
+%
+\begin{overprint}
+\begin{gather*}
+\only<1-2> {\drv{coq-sample.0}}
+\only<3-4> {\drv{coq-sample.1}}
+\only<5-6> {\drv{coq-sample.2}}
+\only<7-8> {\drv{coq-sample.3}}
+\only<9-10> {\drv{coq-sample.4}}
+\only<11-12> {\drv{coq-sample.5}}
+\only<13-15> {\drv{coq-sample.6}}
+\end{gather*}
+\end{overprint}
+\end{block}
+\end{frame}
+\end{document}
diff --git a/Master/texmf-dist/doc/metapost/drv/sample/drv.mp b/Master/texmf-dist/doc/metapost/drv/sample/drv.mp
new file mode 100644
index 00000000000..5eb38396144
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/drv/sample/drv.mp
@@ -0,0 +1,2245 @@
+%% drv.mp 0.93
+%% Copyright 2009 Laurent M\'ehats
+%
+% 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 Laurent M\'ehats.
+% <laurent.mehats@gmail.com>
+%
+% This work consists of the file drv.mp
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% User's macros summary
+%
+%
+% * Judgment & inference declarations
+% ===================================
+%
+% jgm <nat> <str list>
+% <nat> judgment index
+% <str list> sub-judgments math-mode LaTeX code
+%
+% nfr <nat> (<nat list>) (<str>, <id>)
+% <nat> inference index
+% <nat list> list of premise indices
+% <str> inference label math-mode LaTeX code
+% <id> inference line style identifier
+% (0, 1, 2, 3, 4, 5, 6 or _)
+% 0 none
+% 1 simple
+% 2 double
+% 3 dotted
+% 4 dashed
+% 5 waved
+% 6 TeX-dotted
+% _ default (set by drv_path_style)
+%
+% mvd <nat 1> (<nat 2>, <id>)
+% <nat 1> index of the origin judgment
+% <nat 2> number of phantom steps
+% <id> phantom steps path-style identifier
+% (0, 1, 2, 3, 4, 5, 6 or _)
+%
+% Nfr <nat> (<nat list>) (<str 1>, <str 2>, <str 3>, <id>)
+% <nat> inference index
+% <nat list> list of premise indices
+% <str 1> inference label math-mode LaTeX code
+% <str 2> left delimiter label math-mode LaTeX code
+% <str 3> right delimiter label math-mode LaTeX code
+% <id> inference line style identifier
+% (0, 1, 2, 3, 4, 5, 6 or _)
+%
+% Mvd <nat 1> (<nat 2>, <str 1>, <str 2>, <id>)
+% <nat 1> index of the origin judgment
+% <nat 2> number of phantom steps
+% <str 1> left label math-mode LaTeX code
+% <str 2> right label math-mode LaTeX code
+% <id> phantom steps path-style identifier
+% (0, 1, 2, 3, 4, 5, 6 or _)
+%
+% NFR <nat> (<nat list>) (<str 1>, <str 2>, <str 3>, <str 4>)
+% (<id 1>, <id 2>, <id 3>)
+% <nat> inference index
+% <nat list> list of premise indices
+% <str 1> left inference label math-mode LaTeX code
+% <str 2> right inference label math-mode LaTeX code
+% <str 3> left delimiter label math-mode LaTeX code
+% <str 4> right delimiter label math-mode LaTeX code
+% <id 1> junction style identifier (0, 1, 2, 3 or _)
+% 0 fully-interlacing
+% 1 semi-interlacing
+% 2 non-interlacing
+% 3 user specified (tricky)
+% _ default (set by drv_junction_style)
+% <id 2> alignment style identifier (l, c, r, u or _)
+% l left
+% c centered
+% r right
+% u user specified (tricky)
+% _ default (set by drv_alignment_style)
+% <id 3> inference line style identifier
+% (0, 1, 2, 3, 4, 5, 6 or _)
+%
+% MVD <nat 1> (<nat 2>, <str 1>, <str 2>, <id 1> <id 2>)
+% <nat 1> index of the origin judgment
+% <nat 2> number of phantom steps
+% <str 1> left label math-mode LaTeX code
+% <str 2> right label math-mode LaTeX code
+% <id 1> alignment style identifier (l, c, r, u or _)
+% <id 2> phantom steps path-style identifier
+% (0, 1, 2, 3, 4, 5, 6 or _)
+%
+% NFR_opt <nat> (<nat list>) (<str list 1>) (<str list 2>)
+% (<id 1>, <id 2>, <id 3>)
+% <nat> inference index
+% <nat list> list of premise indices
+% <str list 1> list of inference labels math-mode LaTeX code
+% <str list 2> list of delimiter labels math-mode LaTeX code
+% <id 1> junction style identifier (0, 1, 2, 3 or _)
+% <id 2> alignment style identifier (l, c, r, u or _)
+% <id 3> inference line style identifier
+% (0, 1, 2, 3, 4, 5, 6 or _)
+%
+% MVD_opt <nat 1> (<nat 2>) (<str list>) (<id 1> <id 2>)
+% <nat 1> index of the origin judgment
+% <nat 2> number of phantom steps
+% <str list> list of labels math-mode LaTeX code
+% <id 1> alignment style identifier (l, c, r or u)
+% <id 2> phantom steps path-style identifier
+% (0, 1, 2, 3, 4, 5, 6 or _)
+%
+% * Tunings
+% =========
+%
+% drv_font_size <str>
+% <str> LaTeX font-size command
+% "\tiny"
+% "\scriptsize"
+% "\footnotesize"
+% "\small"
+% "\normalsize"
+% "\large"
+% "\Large"
+% etc.
+%
+% drv_math_style (<id>, <str>)
+% <id> component identifier (drv, jdg, ilb, dlb or plb)
+% drv derivation trees
+% jdg judgments
+% ilb inference labels
+% dlb delimiter labels
+% plb phantom steps labels
+% <str> LaTeX math-style command
+%
+% drv_scale (<id>, <float>)
+% <id> scale identifier (clr, prm, jdg or ilb)
+% clr nice explanation soon (see examples)
+% prm nice explanation soon (see examples)
+% jdg nice explanation soon (see examples)
+% ilb nice explanation soon (see examples)
+% <float> scale value
+%
+% drv_junction_style <id>
+% <id> junction style identifier (0, 1 or 2)
+% 0 ``fully-interlacing''
+% 1 ``semi-interlacing''
+% 2 ``non-interlacing''
+%
+% drv_alignment_style <id>
+% <id> alignment style identifier (l, c or r)
+% l left
+% c centered
+% r right
+%
+% drv_path_style (<id 1>, <id 2>)
+% <id 1> path-type identifier (iln or phm)
+% iln inference lines
+% phm phantom steps paths
+% <id 2> path-style identifier (0, 1, 2, 3, 4, 5 or 6)
+%
+% drv_labels_position (<id 1>, <id 2>)
+% <id 1> label-type identifier (ilb, plb or dlb)
+% ilb inference labels
+% dlb delimiter labels
+% plb phantom steps labels
+% <id 2> position identifier (l or r)
+% l left
+% r right
+%
+% drv_roots_position <id>
+% <id> position identifier (t or b)
+% t top
+% b bottom
+%
+% drv_axis_reference <id>
+% <id> reference identifier (iln or jdg)
+% iln root inference line axis
+% jdg root judgment math-axis
+%
+% drv_left_delimiter <str>
+% <str> left delimiter math-mode LaTeX code
+% "(" $($
+% "[" $[$
+% "\lbrace" $\lbrace$
+% "\langle" $\langle$
+% etc.
+%
+% drv_right_delimiter <str>
+% <str> right delimiter math-mode LaTeX code
+% ")"
+% "]"
+% "\rbrace"
+% "\rangle"
+% etc.
+%
+% drv_box_mode <id>
+% <id> status identifier (on or off)
+% on
+% off
+%
+% drv_fraction_mode <id>
+% <id> status identifier (on or off)
+% on
+% off
+%
+% drv_proof_mode <id>
+% <id> status identifier (on or off)
+% on
+% off
+%
+% * Derivation tree pictures
+% ==========================
+%
+% drv_bbox <nat>
+% <nat> sub-tree root index
+%
+% drv_axis (<id>, <nat>)
+% <id> reference type identifier (iln, jdg or dlm)
+% iln inference line axis
+% jdg judgment math-axis
+% dlm delimiter axis
+% <nat> reference index
+%
+% <path> drv_styled <id>
+% <path> MetaPost path expression
+% <id> path style identifier (0, 1, 2, 3, 4, 5 or 6)
+%
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% MetaPost messages formatting
+%
+
+% drv_format prevents messages from being automatically cut into lines every
+% 79 characters: if possible, a word which would otherwise be cut is 'pushed'
+% to the following line by inserting space characters before it.
+
+vardef drv_format (expr str, fst_len, nxt_len, dbl_pcs)=
+ % str: the message to be formatted
+ % fst_len: first line length
+ % nxt_len: following lines length
+ % dbl_pcs (boolean): occurrences of the percent character must be doubled
+ save str_len, sub_len, aux_len, chr_rnk, occ_num;
+ numeric str_len, sub_len, aux_len, chr_rnk, occ_num;
+ save aux_str, chr;
+ string aux_str, chr;
+ str_len:=length str;
+ sub_len:=0;
+ chr_rnk:=0;
+ occ_num:=0;
+ aux_len:=0;
+ aux_str:="";
+ forever:
+ exitif (chr_rnk=fst_len) or (chr_rnk=str_len);
+ chr:=substring (chr_rnk, chr_rnk+1) of str;
+ aux_str:=aux_str&chr;
+ if chr=" ":
+ sub_len:=chr_rnk+1;
+ aux_len:=sub_len+occ_num;
+ elseif (chr="%") and dbl_pcs:
+ aux_str:=aux_str&"%";
+ occ_num:=occ_num+1;
+ fi
+ chr_rnk:=chr_rnk+1;
+ endfor
+ if chr_rnk=fst_len:
+ begingroup
+ if sub_len=0:
+ sub_len:=fst_len;
+ aux_len:=sub_len+occ_num;
+ fi
+ substring (0, aux_len) of aux_str&
+ for idx=sub_len+1 upto fst_len:
+ " "&
+ endfor
+ drv_format (substring (sub_len, str_len) of str,
+ nxt_len, nxt_len, dbl_pcs)
+ endgroup
+ else:
+ aux_str
+ fi
+enddef;
+
+boolean drv_inside_fig;
+drv_inside_fig:=false;
+
+vardef drv_context=
+ "drv"&if drv_inside_fig: " (fig. "&decimal charcode&")"&fi ": "
+enddef;
+
+vardef drv_message expr str=
+ message drv_format (drv_context&str, 79, 79, false);
+enddef;
+
+vardef drv_errhelp expr str=
+ % Occurrences of the percent character must be doubled: errhelp makes single
+ % single occurrences behave as newline characters (this is inherited from
+ % MetaFont).
+ errhelp drv_format (str, 79, 79, true);
+enddef;
+
+vardef drv_errmessage expr str=
+ % errmessage inserts the 2-characters string "! " before its argument.
+ % Hence 77 as a first line length argument.
+ errmessage drv_format (drv_context&str, 77, 79, false);
+enddef;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Delayed LaTeX processing
+%
+
+picture tex_pct[];
+string delayed_tex_file;
+delayed_tex_file:=jobname&"-delayed.mp";
+
+%
+% reading LaTeX picture definitions
+%
+
+boolean drv_nullpicture;
+drv_nullpicture:=true;
+
+string readfrom_str;
+readfrom_str:=readfrom delayed_tex_file;
+if readfrom_str<>EOF:
+ closefrom delayed_tex_file;
+ drv_message ("reading `"&delayed_tex_file&"' LateX picture definitions.");
+ batchmode;
+ scantokens ("input "&delayed_tex_file);
+ errorstopmode;
+ drv_message "done.";
+ drv_nullpicture:=false;
+fi
+
+%
+% copying LaTeX preamble
+%
+
+vardef drv_read (expr search_str) (suffix accum_str)=
+ save readfrom_str, readfrom_substr;
+ string readfrom_str, readfrom_substr;
+ accum_str:="";
+ forever:
+ readfrom_str:=readfrom jobname;
+ readfrom_substr:=substring (0, length search_str) of readfrom_str;
+ exitif (readfrom_substr=search_str) or (readfrom_str=EOF);
+ accum_str:=accum_str&readfrom_str&char(10);
+ endfor
+ if readfrom_str=EOF:
+ closefrom jobname;
+ drv_errhelp ("`"&jobname&".mp' should contain a line starting with "&
+ ditto&search_str&ditto&".");
+ drv_errmessage (ditto&search_str&ditto&" is missing");
+ fi
+enddef;
+
+string tex_preamble_str[];
+% tex_preamble_str[0] from "verbatimtex %&latex" to "\begin{document}"
+% tex_preamble_str[1] from "\begin{document}" to "etex;"
+
+drv_message ("reading `"&jobname&".mp' LateX preamble.");
+ drv_read ("verbatimtex %&latex", tex_preamble_str[0]);
+ drv_read ("\begin{document}", tex_preamble_str[0]);
+ drv_read ("etex;", tex_preamble_str[1]);
+ closefrom jobname;
+ write
+ "%"&char(10)&
+ "% AUTOMATICALLY GENERATED BY DRV.MP - DO NOT MODIFY."&char(10)&
+ "%"&char(10)&char(10)&
+ "verbatimtex %&latex"&char(10)&
+ tex_preamble_str[0]&
+ "\begin{document}"&char(10)&
+ tex_preamble_str[1]&
+ "etex;"
+ to delayed_tex_file;
+drv_message "done.";
+
+%
+% writing LaTeX picture definitions
+%
+
+numeric tex_pct_idx;
+tex_pct_idx:=0;
+
+% Math style indices: 0, 1, 2, 3
+string mth_sty_str[];
+mth_sty_str[0]:="\displaystyle";
+mth_sty_str[1]:="\textstyle";
+mth_sty_str[2]:="\scriptstyle";
+mth_sty_str[3]:="\scriptscriptstyle";
+
+string drv_fontsize;
+
+vardef drv_tex[] expr tex_str=
+ % @: math style index
+ % tex_str: math mode LaTeX code
+ save def_str, pct;
+ string def_str;
+ picture pct;
+ def_str:="btex{"&drv_fontsize&"$"&mth_sty_str[@]&"{}"&tex_str&"{}$}etex;";
+ write "tex_pct["&(decimal tex_pct_idx)&"]:="&def_str to delayed_tex_file;
+ pct:=
+ if known tex_pct[tex_pct_idx]:
+ tex_pct[tex_pct_idx]
+ else:
+ nullpicture
+ fi;
+ tex_pct_idx:=tex_pct_idx+1;
+ pct
+enddef;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% MetaPost shorthands
+%
+
+vardef depth expr pct=
+ ypart llcorner pct
+enddef;
+
+vardef height expr pct=
+ ypart urcorner pct
+enddef;
+
+vardef width expr pct=
+ xpart urcorner pct-xpart llcorner pct
+enddef;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Font-specific parameters
+%
+
+%
+% em[s] width of an m (s: mathstyle index)
+% ex[s] height of an x
+% axis_hg[s] height of the mathematical axis
+% num_bl_hg[s] height of a numerator baseline w.r.t. the fraction bar axis
+% den_bl_dp[s] depth of a denominator baseline w.r.t. the fraction bar axis
+% rul_thk[s] default rule thickness
+%
+
+numeric em[], ex[], axis_hg[], num_bl_hg[], den_bl_dp[], rul_thk[];
+
+%
+% thn_sp[s] thin space, usually 1em/6
+% med_sp[s] medium space, usually 2em/9
+% thk_sp[s] thick space, usually 5em/18
+%
+
+numeric thn_sp[], med_sp[], thk_sp[];
+
+%
+% pdt_hg[s] height of a punctuation ldot
+% pdt_wd[s] width of a punctuation ldot
+%
+
+numeric pdt_hg[], pdt_wd[];
+
+%
+% tt_dgt[s][i] typewriter typeface digits (i ranges from 0 to 9)
+%
+
+picture tt_dgt[][];
+
+%
+% min_clr[s] minimal clearance between a numerator
+% or a denominator and the fraction bar
+% prm_skp[s] <nice explanation>
+% jdg_skp[s] <nice explanation>
+% ilb_skp[s] <nice explanation>
+% plb_skp[s] <nice explanation>
+%
+
+numeric min_clr[], prm_skp[], jdg_skp[], ilb_skp[], plb_skp[];
+
+vardef drv_fontdimen[] expr font=
+ save dim_pct;
+ picture dim_pct;
+ dim_pct:=drv_tex[0] ("\rule{\the\fontdimen"&(decimal @)&font&"}{0bp}");
+ width dim_pct
+enddef;
+
+vardef drv_font_size expr size_str=
+ save pdt_pct, sp_pct;
+ picture pdt_pct, sp_pct;
+ drv_fontsize:=size_str;
+ write char(10)&"% font-specific parameters ("&drv_fontsize&")"&char(10)
+ to delayed_tex_file;
+ ex[0]:=drv_fontdimen[5] "\textfont2";
+ ex[1]:=drv_fontdimen[5] "\textfont2";
+ ex[2]:=drv_fontdimen[5] "\scriptfont2";
+ ex[3]:=drv_fontdimen[5] "\scriptscriptfont2";
+ em[0]:=drv_fontdimen[6] "\textfont2";
+ em[1]:=drv_fontdimen[6] "\textfont2";
+ em[2]:=drv_fontdimen[6] "\scriptfont2";
+ em[3]:=drv_fontdimen[6] "\scriptscriptfont2";
+ rul_thk[0]:=drv_fontdimen[8] "\textfont3";
+ rul_thk[1]:=drv_fontdimen[8] "\textfont3";
+ rul_thk[2]:=drv_fontdimen[8] "\scriptfont3";
+ rul_thk[3]:=drv_fontdimen[8] "\scriptscriptfont3";
+ axis_hg[0]:=drv_fontdimen[22] "\textfont2";
+ axis_hg[1]:=drv_fontdimen[22] "\textfont2";
+ axis_hg[2]:=drv_fontdimen[22] "\scriptfont2";
+ axis_hg[3]:=drv_fontdimen[22] "\scriptscriptfont2";
+ num_bl_hg[0]:=(drv_fontdimen[8] "\textfont2")-axis_hg[0];
+ num_bl_hg[1]:=(drv_fontdimen[9] "\textfont2")-axis_hg[1];
+ num_bl_hg[2]:=(drv_fontdimen[9] "\scriptfont2")-axis_hg[2];
+ num_bl_hg[3]:=(drv_fontdimen[9] "\scriptscriptfont2")-axis_hg[3];
+ den_bl_dp[0]:=-(drv_fontdimen[11] "\textfont2")-axis_hg[0];
+ den_bl_dp[1]:=-(drv_fontdimen[12] "\textfont2")-axis_hg[1];
+ den_bl_dp[2]:=-(drv_fontdimen[12] "\scriptfont2")-axis_hg[2];
+ den_bl_dp[3]:=-(drv_fontdimen[12] "\scriptscriptfont2")-axis_hg[3];
+ min_clr[0]:=3*rul_thk[0]; % The TEXbook,
+ min_clr[1]:=1*rul_thk[1]; % Appendix G,
+ min_clr[2]:=1*rul_thk[2]; % Rule 15d.
+ min_clr[3]:=1*rul_thk[3]; %
+ for mth_sty:=0 upto 3:
+ sp_pct:=drv_tex[mth_sty] "\,";
+ thn_sp[mth_sty]:=width sp_pct;
+ sp_pct:=drv_tex[mth_sty] "\>";
+ med_sp[mth_sty]:=width sp_pct;
+ sp_pct:=drv_tex[mth_sty] "\;";
+ thk_sp[mth_sty]:=width sp_pct;
+ pdt_pct:=drv_tex[mth_sty] "\ldotp";
+ pdt_hg[mth_sty]:=height pdt_pct;
+ pdt_wd[mth_sty]:=width pdt_pct;
+ for dgt=0 upto 9:
+ tt_dgt[mth_sty][dgt]:=drv_tex[mth_sty] "\texttt{"&(decimal dgt)&"}";
+ endfor
+ prm_skp[mth_sty]:=3*med_sp[mth_sty]; % arbitrary
+ jdg_skp[mth_sty]:=thn_sp[mth_sty]; % arbitrary
+ ilb_skp[mth_sty]:=thn_sp[mth_sty]; % arbitrary
+ plb_skp[mth_sty]:=thk_sp[mth_sty]; % arbitrary
+ endfor
+enddef;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Math-related parameters & macros
+%
+
+%
+% Math styles
+% drv_sty derivation trees
+% jdg_sty[drv_sty] judgments
+% ilb_sty[drv_sty] inference labels
+% dlb_sty[drv_sty] delimiter labels
+% plb_sty[drv_sty] phantom steps labels
+%
+
+numeric drv_sty, jdg_sty[], ilb_sty[], dlb_sty[], plb_sty[];
+
+%
+% Math-axis centered LaTeX pictures
+%
+
+vardef mth_tex[] expr tex_str=
+ (drv_tex[@] tex_str) shifted (0, -axis_hg[@])
+enddef;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% drv-boxes
+%
+
+vardef drv_box text STR=
+ for str=STR:
+ expandafter picture scantokens str;
+ expandafter pair scantokens str.l;
+ expandafter pair scantokens str.c;
+ expandafter pair scantokens str.r;
+ expandafter numeric scantokens str.hg;
+ expandafter numeric scantokens str.dp;
+ endfor
+enddef;
+
+vardef box_init @# (expr pct)=
+ @#:=pct;
+ @#.r-@#.l=(width pct, 0);
+ @#.c=(@#.l+@#.r)/2;
+ @#.hg:=height pct;
+ @#.dp:=depth pct;
+enddef;
+
+vardef box_freeze @#=
+ @#:=@# shifted @#.l;
+enddef;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% beginfig & endfig
+%
+
+%
+% drv_beginfig: figure initialization
+%
+
+pen drv_pen;
+
+vardef drv_beginfig=
+ %
+ % Judgments
+ %
+ % jdg[i] judgment drv-box
+ % sbj_num[i] number of sub-judgments
+ % sbj[i][j] sub-judgment drv-box (j ranges from 0 to sbj_num[i]-1)
+ %
+ drv_box "jdg[]";
+ numeric sbj_num[];
+ drv_box "sbj[][]";
+ %
+ % Inferences
+ %
+ % prm_num[i] number of premises
+ % prm[i][j] premise index (j ranges from 0 to prm_num[i]-1)
+ % ccl[i] conclusion index
+ % jct_sty[i] junction style
+ % alg_sty[i] alignment style
+ % iln_sty[i] inference line style
+ % l_prm[i] leftmost `graphical' premise index
+ % r_prm[i] rightmost `graphical' premise index
+ %
+ numeric prm_num[], prm[][], ccl[];
+ numeric jct_sty[];
+ string alg_sty[];
+ numeric iln_sty[];
+ numeric l_prm[], r_prm[];
+ %
+ % imin_x[i] inference minimal x
+ % l_dlb[i] left delimiter label drv-box
+ % l_dlm[i] left delimiter drv-box
+ % l_ilb[i] left label drv-box
+ % iln[i] inference line drv-box
+ % r_ilb[i] right label drv-box
+ % r_dlm[i] right delimiter drv-box
+ % r_dlb[i] right delimiter label drv-box
+ % imax_x[i] inference maximal x
+ %
+ numeric imin_x[];
+ drv_box "l_dlb[]", "l_dlm[]", "l_ilb[]";
+ drv_box "iln[]";
+ drv_box "r_ilb[]", "r_dlm[]", "r_dlb[]";
+ numeric imax_x[];
+ %
+ % Sub-trees
+ %
+ % smin_x[i] sub-tree minimal x
+ % smax_x[i] sub-tree maximal x
+ % smin_y[i] sub-tree minimal y
+ % smax_y[i] sub-tree maximal y
+ % boxed[i] boolean
+ %
+ numeric smin_x[], smax_x[], smin_y[], smax_y[];
+ boolean boxed[];
+ %
+ % Pen initialization
+ %
+ drv_pen:=pencircle scaled rul_thk[drv_sty];
+ %
+ % num_hg height of a numerator axis w.r.t. the fraction bar axis
+ % den_dp depth of a denominator axis w.r.t. the fraction bar axis
+ % iln_hg[s] height of a style s inference line
+ % iln_dp[s] depth of a style s inference line
+ %
+ numeric num_hg, den_dp, iln_hg[], iln_dp[];
+ num_hg:=num_bl_hg[drv_sty]+axis_hg[jdg_sty[drv_sty]];
+ den_dp:=den_bl_dp[drv_sty]+axis_hg[jdg_sty[drv_sty]];
+ picture iln_pct;
+ for sty=0 upto 6:
+ iln_pct:=((0, 0)--(10, 0)) drv_styled sty;
+ iln_hg[sty]:=height iln_pct;
+ iln_dp[sty]:=depth iln_pct;
+ endfor
+ %
+ % Derivation trees
+ %
+ % root_num number of roots
+ % root[i] root index (i ranges from 0 to root_num-1)
+ % drv_built boolean
+ % drv_frozen boolean
+ %
+ numeric root_num, root[];
+ boolean drv_checked, drv_built, drv_frozen;
+ root_num:=0;
+ drv_checked:=false;
+ drv_built:=false;
+ drv_frozen:=false;
+ %
+ % Phantom steps
+ %
+ % phm_idx phantom inferences index
+ % src[i] base phantom judgment index (in case of an origin judgment)
+ % tgt[i] origin judgment index (in case of a base phantom judgment)
+ % phm_sty[i] phantom steps style
+ % l_plb[i] left phantom steps label drv-box (in case of a base
+ % phantom judgment)
+ % phm[i] phantom steps drv-box (in case of a base phantom
+ % judgment)
+ % r_plb[i] right phantom steps label drv-box (in case of a base
+ % phantom judgment)
+ %
+ numeric phm_idx, src[], tgt[], phm_sty[];
+ phm_idx:=0;
+ drv_box "l_plb[]", "phm[]", "r_plb[]";
+ %
+ % Proof pictures
+ %
+ % jdg_prf[i] judgment index drv-box
+ % sbj_prf[i][j] sub-judgment index drv-box (j ranges from 0 to
+ % sbj_num[i]-1)
+ %
+ drv_box "jdg_prf[]", "sbj_prf[][]";
+ %
+ % Info
+ %
+ write char(10)&"% fig. "&(decimal charcode)&char(10) to delayed_tex_file;
+ drv_inside_fig:=true; % context: inside a figure
+enddef;
+
+extra_beginfig:=extra_beginfig&"drv_beginfig;";
+
+%
+% drv_endfig: proof-file generation
+%
+
+string proof_file;
+proof_file:=jobname&"-proof.tex";
+
+% TODO: taking outputtemplate into account.
+vardef output_file[]=
+ jobname&"."&(decimal @)
+enddef;
+
+string buf_str;
+buf_str:=
+ "%"&char(10)&
+ "% AUTOMATICALLY GENERATED BY DRV.MP."&char(10)&
+ "%"&char(10)&char(10)&
+ tex_preamble_str[0]&
+ "\usepackage{graphicx}"&char(10)&
+ "\makeatletter"&char(10)&
+ "\def\Gin@def@bp#1\relax#2#3{\gdef#2{#3}}"&char(10)&
+ "\newsavebox{\graphicsbox}"&char(10)&
+ "\newcommand*{\drv}[1]{%"&char(10)&
+ "\sbox{\graphicsbox}{\includegraphics{#1}}%"&char(10)&
+ "\raisebox{\Gin@lly bp}%"&char(10)&
+ "{\usebox{\graphicsbox}}}"&char(10)&
+ "\makeatother"&char(10)&char(10)&
+ "\newcount\h"&char(10)&
+ "\newcount\m"&char(10)&
+ "\h=\time"&char(10)&
+ "\divide\h 60"&char(10)&
+ "\m=-\h"&char(10)&
+ "\multiply\m 60"&char(10)&
+ "\advance\m\time"&char(10)&
+ "\def\hm{\number\h:\ifnum\m<10{}0\fi\number\m}"&char(10)&char(10)&
+ "\newcommand{\mathaxis}{\frac{\quad}{}}"&char(10)&char(10)&
+ "\begin{document}"&char(10)&
+ tex_preamble_str[1]&
+ "\noindent\today\ at \hm\medskip"&char(10)&char(10)&"\noindent";
+
+vardef drv_endfig=
+ drv_inside_fig:=false; % context: outside a figure
+ buf_str:=buf_str&char(10)&
+ "\texttt{"&output_file[charcode]&"}"&char(10)&
+ " (\verb+"&drv_fontsize&"+, \verb+"&(mth_sty_str[drv_sty])&"+)"&char(10)&
+ " {"&drv_fontsize&char(10)&
+ " \["&(mth_sty_str[drv_sty])&char(10)&
+ " \mathaxis\drv{"&output_file[charcode]&"}\mathaxis"&char(10)&
+ " \]}\\";
+ write EOF to proof_file; % erases the previous content
+ write buf_str&char(10)&"\end{document}" to proof_file;
+ write EOF to proof_file;
+ if drv_nullpicture:
+ draw btex{\tt drv}: run {\tt mpost} again.etex withcolor (1, 0, 0);
+ fi
+enddef;
+
+extra_endfig:="drv_endfig;"&extra_endfig;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Judgment declarations
+%
+
+vardef jgm[] text SUB=
+ % @: judgment index
+ % SUB: list of `sub-judgments' (pictures or strings)
+ if @<0:
+ drv_errhelp "An judgment index can not be negative.";
+ drv_errmessage (decimal @)&" is negative";
+ elseif known jdg[@]:
+ drv_errhelp "An index can be used only once to declare a judgment.";
+ drv_errmessage (decimal @)&" has been used already as a judgment index";
+ else:
+ save jdg_pct, sbj_pct, jdg_wd, sbj_rnk;
+ picture jdg_pct, sbj_pct;
+ numeric jdg_wd, sbj_rnk;
+ jdg_pct:=nullpicture;
+ jdg_wd:=0;
+ sbj_rnk:=0;
+ for sub=SUB:
+ sbj_pct:=
+ if picture sub:
+ sub
+ elseif sub<>"":
+ mth_tex[jdg_sty[drv_sty]] sub
+ else:
+ nullpicture
+ fi;
+ box_init sbj[@][sbj_rnk] (sbj_pct);
+ if sbj_rnk>0:
+ sbj[@][sbj_rnk-1].r=sbj[@][sbj_rnk].l;
+ fi
+ addto jdg_pct also sbj_pct shifted (jdg_wd, 0);
+ jdg_wd:=width jdg_pct;
+ sbj_rnk:=sbj_rnk+1;
+ endfor
+ sbj_num[@]:=sbj_rnk;
+ box_init jdg[@] (jdg_pct);
+ if sbj_num[@]>0:
+ jdg[@].l=sbj[@][0].l;
+ jdg[@].r=sbj[@][sbj_num[@]-1].r;
+ fi
+ fi
+enddef;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Inference declarations
+%
+
+vardef check_junction_style (suffix sty_sfx) (expr default)=
+ save sty_str;
+ string sty_str;
+ sty_str:=str sty_sfx;
+ if (sty_str="0")
+ or (sty_str="1")
+ or (sty_str="2")
+ or (sty_str="3"):
+ sty_sfx
+ elseif (sty_str="_"):
+ default
+ else:
+ begingroup
+ drv_errhelp "Valid identifiers are"&
+ " 0 (fully-interlacing),"&
+ " 1 (semi-interlacing),"&
+ " 2 (non-interlacing),"&
+ " 3 (user specified) and"&
+ " _ (default).";
+ drv_errmessage sty_str&" is not a valid junction style identifier";
+ default
+ endgroup
+ fi
+enddef;
+
+vardef check_alignment_style (suffix sty_sfx) (expr default)=
+ save sty_str;
+ string sty_str;
+ sty_str:=str sty_sfx;
+ if (sty_str="l")
+ or (sty_str="c")
+ or (sty_str="r")
+ or (sty_str="u"):
+ sty_str
+ elseif (sty_str="_"):
+ default
+ else:
+ begingroup
+ drv_errhelp "Valid identifiers are"&
+ " l (none),"&
+ " c (simple),"&
+ " r (double),"&
+ " u (dotted) and"&
+ " _ (default).";
+ drv_errmessage sty_str&" is not a valid alignment style identifier";
+ default
+ endgroup
+ fi
+enddef;
+
+vardef check_path_style (suffix sty_sfx) (expr default)=
+ save sty_str;
+ string sty_str;
+ sty_str:=str sty_sfx;
+ if (sty_str="0")
+ or (sty_str="1")
+ or (sty_str="2")
+ or (sty_str="3")
+ or (sty_str="4")
+ or (sty_str="5")
+ or (sty_str="6"):
+ sty_sfx
+ elseif (sty_str="_"):
+ default
+ else:
+ begingroup
+ drv_errhelp "Valid identifiers are"&
+ " 0 (none),"&
+ " 1 (simple),"&
+ " 2 (double),"&
+ " 3 (dotted),"&
+ " 4 (dashed),"&
+ " 5 (waved),"&
+ " 6 (TeX-dotted) and"&
+ " _ (default).";
+ drv_errmessage sty_str&" is not a valid path style identifier";
+ default
+ endgroup
+ fi
+enddef;
+
+vardef opt_init[] @# expr arg=
+ if picture arg:
+ if arg<>nullpicture:
+ box_init @# (arg);
+ fi
+ elseif arg<>"":
+ box_init @# (mth_tex[@] arg);
+ fi
+enddef;
+
+vardef NFR[] (text PRM) (expr lilb, rilb, ldlb, rdlb)
+ (suffix j_sty, a_sty, i_sty)=
+ %
+ % @: inference index
+ %
+ if known prm_num[@]:
+ drv_errhelp "An index can be used only once to declare an inference.";
+ drv_errmessage (decimal @)&" has been used already as an inference index";
+ else:
+ %
+ % PRM: list of premise indices
+ %
+ save prm_rnk;
+ numeric prm_rnk;
+ prm_rnk:=0;
+ for prm_idx=PRM:
+ if prm_idx=@:
+ drv_errhelp "An inference index can not be used"&
+ " as one of its own premise indices.";
+ drv_errmessage "the inference index "&(decimal prm_idx)&
+ " is used as one of its own premise indices";
+ elseif known ccl[prm_idx]:
+ drv_errhelp "An index can be used only once as a premise index.";
+ drv_errmessage (decimal prm_idx)&" has been used already as a"&
+ " premise index for inference declaration "&(decimal ccl[prm_idx]);
+ else:
+ if known prm_num[prm_idx]:
+ %
+ % roots list update
+ %
+ save root_idx;
+ numeric root_idx;
+ root_idx:=0;
+ forever:
+ exitif root[root_idx]=prm_idx;
+ root_idx:=root_idx+1;
+ endfor
+ forever:
+ exitif root_idx=root_num-1;
+ root[root_idx]:=root[root_idx+1];
+ root_idx:=root_idx+1;
+ endfor
+ root_num:=root_num-1;
+ fi
+ ccl[prm_idx]:=@;
+ prm[@][prm_rnk]:=prm_idx;
+ prm_rnk:=prm_rnk+1;
+ fi
+ endfor
+ prm_num[@]:=prm_rnk;
+ if known ccl[@]:
+ %
+ % cycle detection
+ %
+ save ccl_idx, ccl_str;
+ numeric ccl_idx;
+ string ccl_str;
+ ccl_idx:=@;
+ ccl_str:=decimal ccl_idx;
+ forever:
+ ccl_idx:=ccl[ccl_idx];
+ if ccl_idx>=0:
+ ccl_str:=(decimal ccl_idx)&", "&ccl_str;
+ fi
+ exitif (unknown ccl[ccl_idx]) or (ccl_idx=@);
+ endfor
+ if ccl_idx=@:
+ drv_errhelp "Inferences declarations can not be cyclic.";
+ drv_errmessage "inference declaration "&(decimal @)&" creates a"&
+ " cycle of inferences (indices "&ccl_str&" from conclusions to"&
+ " premises)";
+ fi
+ else:
+ root[root_num]:=@;
+ root_num:=root_num+1;
+ fi
+ %
+ % lilb, rilb: inference labels
+ %
+ opt_init[ilb_sty[drv_sty]] l_ilb[@] lilb;
+ opt_init[ilb_sty[drv_sty]] r_ilb[@] rilb;
+ %
+ % ldlb, rdlb: delimiter labels
+ %
+ opt_init[dlb_sty[drv_sty]] l_dlb[@] ldlb;
+ opt_init[dlb_sty[drv_sty]] r_dlb[@] rdlb;
+ %
+ % j_sty, a_sty and i_sty: junction, alignment and inference styles
+ %
+ jct_sty[@]:=check_junction_style (j_sty, drv_jct_sty);
+ alg_sty[@]:=check_alignment_style (a_sty, drv_alg_sty);
+ iln_sty[@]:=check_path_style (i_sty, drv_iln_sty);
+ if drv_boxmode_on:
+ boxed[@]:=true;
+ fi
+ fi
+enddef;
+
+vardef DCL[] (text PRM) (expr lilb, rilb, ldlb, rdlb)
+ (suffix j_sty, a_sty, i_sty) text SUB=
+ NFR[@] (PRM) (lilb, rilb, ldlb, rdlb, j_sty, a_sty, i_sty);
+ jgm[@] SUB;
+enddef;
+
+vardef MVD[] (expr inf_num, lplb, rplb) (suffix a_sty, p_sty)=
+ if inf_num<1:
+ drv_errhelp "The minimal value is 1.";
+ drv_errmessage (decimal inf_num)&" is not a valid number of inference"&
+ " steps";
+ else:
+ save aux_idx, aux_sty, phm_jdg;
+ numeric aux_idx, aux_sty;
+ picture phm_jdg;
+ aux_sty:=check_path_style (p_sty, drv_phm_sty);
+ phm_jdg:=nullpicture;
+ setbounds phm_jdg to (0, 0)--(iln_hg[aux_sty]-iln_dp[aux_sty], 0)--cycle;
+ aux_idx:=@;
+ for i=1 upto inf_num:
+ phm_idx:=phm_idx-1;
+ box_init jdg[phm_idx] (phm_jdg);
+ sbj_num[phm_idx]:=0;
+ NFR[phm_idx] (aux_idx) ("", "", "", "", 0, a_sty, 0);
+ aux_idx:=phm_idx;
+ endfor
+ src[@]:=phm_idx;
+ tgt[phm_idx]:=@;
+ phm_sty[phm_idx]:=aux_sty;
+ %
+ % lplb, rplb: phantom steps labels
+ %
+ opt_init[plb_sty[drv_sty]] l_plb[phm_idx] lplb;
+ opt_init[plb_sty[drv_sty]] r_plb[phm_idx] rplb;
+ phm_idx
+ fi
+enddef;
+
+vardef bxd[]=
+ boxed[@]:=true;
+ @
+enddef;
+
+%
+% Optional labels & shorthands
+%
+
+numeric drv_jct_sty; % default junction style
+string drv_alg_sty; % default junction style
+numeric drv_iln_sty; % default inference line path-style
+numeric drv_phm_sty; % default phantom steps path-style
+
+boolean drv_left_ilb; % inference labels on the left
+boolean drv_left_dlb; % delimiter labels (hence delimiters) on the left
+boolean drv_left_plb; % phantom steps labels on the left
+
+vardef arg_type expr arg=
+ if picture arg:
+ "picture"
+ else:
+ "string"
+ fi
+enddef;
+
+vardef opt_lbls @# (text LBL) expr left_lbls=
+ save lbl_num, fst_lbl, snd_lbl;
+ numeric lbl_num;
+ lbl_num:=0;
+ for lbl=LBL:
+ if lbl_num=0:
+ scantokens (arg_type lbl) fst_lbl;
+ fst_lbl:=lbl;
+ elseif lbl_num=1:
+ scantokens (arg_type lbl) snd_lbl;
+ snd_lbl:=lbl;
+ else:
+ drv_errhelp "At most two labels can be specified:"&
+ " a left one and a right one.";
+ drv_errmessage "more than two labels have been specified";
+ fi
+ lbl_num:=lbl_num+1;
+ endfor
+ if lbl_num=0:
+ string @#.l;
+ string @#.r;
+ @#.l:="";
+ @#.r:="";
+ elseif lbl_num=1:
+ if left_lbls:
+ scantokens (arg_type fst_lbl) @#.l;
+ string @#.r;
+ @#.l:=fst_lbl;
+ @#.r:="";
+ else:
+ string @#.l;
+ scantokens (arg_type fst_lbl) @#.r;
+ @#.l:="";
+ @#.r:=fst_lbl;
+ fi
+ else:
+ scantokens (arg_type fst_lbl) @#.l;
+ scantokens (arg_type snd_lbl) @#.r;
+ @#.l:=fst_lbl;
+ @#.r:=snd_lbl;
+ fi
+enddef;
+
+vardef NFR_opt[] (text PRM) (text ILB) (text DLB)
+ (suffix j_sty, a_sty, i_sty)=
+ opt_lbls ilb (ILB) drv_left_ilb;
+ opt_lbls dlb (DLB) drv_left_dlb;
+ NFR[@] (PRM) (ilb.l, ilb.r, dlb.l, dlb.r, j_sty, a_sty, i_sty);
+enddef;
+
+vardef DCL_opt[] (text PRM) (text ILB) (text DLB)
+ (suffix j_sty, a_sty, i_sty) text SUB=
+ NFR_opt[@] (PRM) (ILB) (DLB) (j_sty, a_sty, i_sty);
+ jgm[@] SUB;
+enddef;
+
+vardef MVD_opt[] (expr inf_num) (text PLB) (suffix a_sty, p_sty)=
+ opt_lbls plb (PLB) drv_left_plb;
+ MVD[@] (inf_num, plb.l, plb.r, a_sty, p_sty)
+enddef;
+
+% Nfr, Dcl & Mvd
+
+vardef Nfr[] (text PRM) (expr ilb, ldlb, rdlb) (suffix i_sty)=
+ NFR_opt[@] (PRM) (ilb) (ldlb, rdlb) (_, _, i_sty);
+enddef;
+
+vardef Dcl[] (text PRM) (expr ilb, ldlb, rdlb) (suffix i_sty) text SUB=
+ Nfr[@] (PRM) (ilb, ldlb, rdlb, i_sty);
+ jgm[@] SUB;
+enddef;
+
+vardef Mvd[] (expr inf_num, lplb, rplb) (suffix p_sty)=
+ MVD[@] (inf_num, lplb, rplb, _, p_sty)
+enddef;
+
+% nfr, dcl & mvd
+
+vardef nfr[] (text PRM) (expr ilb) (suffix i_sty)=
+ NFR_opt[@] (PRM) (ilb) () (_, _, i_sty);
+enddef;
+
+vardef dcl[] (text PRM) (expr ilb) (suffix i_sty) text SUB=
+ nfr[@] (PRM) (ilb, i_sty);
+ jgm[@] SUB;
+enddef;
+
+vardef mvd[] (expr inf_num) (suffix p_sty)=
+ MVD_opt[@] (inf_num) () (_, p_sty)
+enddef;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Pictured paths
+%
+
+vardef dotted_aux (expr pth, dot_wd, dots_dist)=
+ save pth_len, pct;
+ numeric pth_len;
+ picture pct;
+ pth_len:=arclength pth;
+ pct:=nullpicture;
+ if dots_dist>0:
+ stp_num:=round ((pth_len-dot_wd)/dots_dist);
+ if stp_num>0:
+ stp_len:=(pth_len-dot_wd)/stp_num;
+ addto pct doublepath pth dashed dashpattern (on 0 off stp_len)
+ shifted (dot_wd/2, 0) withpen pencircle scaled dot_wd;
+ fi
+ fi
+ pct
+enddef;
+
+primarydef pth dotted wd_dist=
+ dotted_aux(pth, xpart wd_dist, ypart wd_dist)
+enddef;
+
+vardef expanded_aux (expr pth, scl, dir, stp_len)=
+ save pth_len, aux_len;
+ numeric pth_len, aux_len;
+ pth_len:=arclength pth;
+ if (stp_len>0) and (pth_len>stp_len):
+ aux_len:=pth_len/(pth_len div stp_len);
+ point arctime 0 of pth of pth shifted
+ (unitvector direction arctime 0 of pth of pth
+ rotated dir scaled scl)..
+ {direction arctime 0 of pth of pth}
+ for i=aux_len step aux_len until pth_len-aux_len:
+ point arctime i of pth of pth shifted
+ (unitvector direction arctime i of pth of pth
+ rotated dir scaled scl)
+ {direction arctime i of pth of pth}..
+ endfor
+ point arctime pth_len of pth of pth shifted
+ (unitvector direction arctime pth_len of pth of pth
+ rotated dir scaled scl)
+ {direction arctime pth_len of pth of pth}
+ else:
+ pth
+ fi
+enddef;
+
+primarydef pth expanded scl_dir_len=
+ expanded_aux (pth,
+ redpart scl_dir_len, greenpart scl_dir_len, bluepart scl_dir_len)
+enddef;
+
+vardef waved_aux (expr pth, amp)=
+ save pth_len, mid;
+ numeric pth_len, mid;
+ pth_len:=arclength pth;
+ if (amp>0) and (pth_len>2(1+sqrt 5)*amp):
+ mid:=pth_len/(2(pth_len div (2(1+sqrt 5)*amp)));
+ point arctime 0 of pth of pth shifted
+ (unitvector direction arctime 0 of pth of pth
+ rotated -90 scaled amp)
+ {direction arctime 0 of pth of pth}
+ for i=mid step 2mid until pth_len:
+ ..point arctime i of pth of pth shifted
+ (unitvector direction arctime i of pth of pth
+ rotated 90 scaled amp)
+ {direction arctime i of pth of pth}
+ ..point arctime i+mid of pth of pth shifted
+ (unitvector direction arctime i+mid of pth of pth
+ rotated -90 scaled amp)
+ {direction arctime i+mid of pth of pth}
+ endfor
+ else:
+ pth
+ fi
+enddef;
+
+primarydef pth waved amp=
+ waved_aux(pth, amp)
+enddef;
+
+vardef drv_styled_aux[] expr pth=
+ save sty_idx, pth_len, pct;
+ numeric sty_idx, pth_len;
+ picture pct;
+ sty_idx:=check_path_style (@, 1);
+ pth_len:=arclength pth;
+ pct:=nullpicture;
+ if sty_idx=1:
+ interim linecap:=butt;
+ addto pct doublepath pth withpen drv_pen;
+ elseif sty_idx=2:
+ interim linecap:=butt;
+ addto pct doublepath pth
+ expanded (1.25rul_thk[drv_sty], 90, rul_thk[drv_sty])
+ withpen drv_pen;
+ addto pct doublepath pth
+ expanded (1.25rul_thk[drv_sty], -90, rul_thk[drv_sty])
+ withpen drv_pen;
+ elseif sty_idx=3:
+ addto pct also pth dotted (rul_thk[drv_sty], 2rul_thk[drv_sty]);
+ elseif sty_idx=4:
+ if rul_thk[drv_sty]>0:
+ interim linecap:=butt;
+ save dsh_num, dsh_len;
+ numeric dsh_num, dsh_len;
+ dsh_num:=round(pth_len/(3rul_thk[drv_sty]));
+ dsh_len:=
+ if odd dsh_num:
+ pth_len/dsh_num
+ else:
+ pth_len/(dsh_num+1)
+ fi;
+ addto pct doublepath pth dashed dashpattern(on dsh_len off dsh_len)
+ withpen drv_pen;
+ fi
+ elseif sty_idx=5:
+ interim linecap:=butt;
+ addto pct doublepath pth
+ waved 1.25rul_thk[drv_sty] withpen drv_pen;
+ elseif (sty_idx=6) and (pth_len>0):
+ addto pct also pth dotted (pdt_hg[drv_sty], pdt_wd[drv_sty]);
+ fi
+ pct
+enddef;
+
+primarydef pth drv_styled sty=
+ drv_styled_aux[sty] pth
+enddef;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Delimiters
+%
+
+%
+% 1. Global parameters
+%
+
+string drv_l_dlm; % left delimiter LaTeX code
+string drv_r_dlm; % right delimiter LaTeX code
+
+%
+% 2. Macros
+%
+
+vardef minmax_y[]=(
+ if drv_bot_roots:
+ if known ccl[@]:
+ ypart jdg[@].c-num_hg+iln_hg[(iln_sty[ccl[@]])]
+ +min_clr_scl*min_clr[drv_sty]/2
+ else:
+ smin_y[@]-min_clr_scl*min_clr[drv_sty]
+ fi,
+ smax_y[@]+min_clr_scl*min_clr[drv_sty]
+ else:
+ smin_y[@]-min_clr_scl*min_clr[drv_sty],
+ if known ccl[@]:
+ ypart jdg[@].c-den_dp-iln_hg[(iln_sty[ccl[@]])]
+ -min_clr_scl*min_clr[drv_sty]/2
+ else:
+ smax_y[@]+min_clr_scl*min_clr[drv_sty]
+ fi
+ fi)
+enddef;
+
+vardef delim @# expr dlm_len=
+ save rule_str, dlm_str, dlm_pct, dlm_dp;
+ string rule_str, dlm_str;
+ picture dlm_pct;
+ numeric dlm_dp;
+ rule_str:="\rule{0bp}{"&(decimal(dlm_len/2+axis_hg[drv_sty]))&"bp}";
+ dlm_str:=
+ if str @#="l":
+ "\left"&drv_l_dlm&rule_str&"\right."
+ else:
+ "\left."&rule_str&"\right"&drv_r_dlm
+ fi;
+ dlm_pct:=mth_tex[drv_sty] dlm_str;
+ dlm_dp:=depth dlm_pct;
+ if dlm_dp=0:
+ nullpicture
+ else:
+ begingroup
+ setbounds dlm_pct to
+ (xpart llcorner dlm_pct, dlm_dp)
+ --(xpart ulcorner dlm_pct, -dlm_dp)
+ --(xpart urcorner dlm_pct, -dlm_dp)
+ --(xpart lrcorner dlm_pct, dlm_dp)
+ --cycle;
+ dlm_pct yscaled (dlm_len/(2*height dlm_pct))
+ endgroup
+ fi
+enddef;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Checking, building, freezing (very inefficient, to be improved)
+%
+
+%
+% 1. Global parameters
+%
+
+numeric min_clr_scl; %
+numeric prm_skp_scl; %
+numeric jdg_skp_scl; %
+numeric ilb_skp_scl; %
+numeric plb_skp_scl; %
+
+boolean drv_bot_roots; %
+boolean drv_boxmode_on; %
+boolean drv_fractionmode_on; %
+string drv_axis_ref; %
+
+%
+% 2. Macros
+%
+
+%
+% Checking
+%
+
+vardef fraction_inference[]=
+ (prm_num[@]=0)
+ and (iln_sty[@]=0)
+ and (unknown l_ilb[@])
+ and (unknown r_ilb[@])
+ and drv_fractionmode_on
+enddef;
+
+vardef drv_check_root[]=
+ if unknown jdg[@]:
+ drv_errhelp "An index must be used to declare a both a judgment and an"&
+ " inference.";
+ drv_errmessage (decimal @)&" has been used as an inference index but not"&
+ " as a judgment index";
+ elseif unknown prm_num[@]:
+ drv_errhelp "An index must be used to declare a both a judgment and an"&
+ " inference.";
+ drv_errmessage (decimal @)&" has been used as a judgment index but not"&
+ " as an inference index";
+ else:
+ save i_sty, prm_idx;
+ numeric i_sty, prm_idx;
+ i_sty:=iln_sty[@];
+ for prm_rnk=0 upto prm_num[@]-1:
+ prm_idx:=prm[@][prm_rnk];
+ drv_check_root[prm_idx];
+ %
+ % numerators and denominators clearances
+ % The TEXbook, Appendix G, Rule 15d.
+ %
+ if drv_bot_roots:
+ num_hg:=max(num_hg,
+ iln_hg[i_sty]+min_clr_scl*min_clr[drv_sty]-jdg[prm_idx].dp);
+ else:
+ den_dp:=min(den_dp,
+ iln_dp[i_sty]-min_clr_scl*min_clr[drv_sty]-jdg[prm_idx].hg);
+ fi
+ endfor
+ if not fraction_inference[@]:
+ if drv_bot_roots:
+ den_dp:=min(den_dp,
+ iln_dp[i_sty]-min_clr_scl*min_clr[drv_sty]-jdg[@].hg);
+ else:
+ num_hg:=max(num_hg,
+ iln_hg[i_sty]+min_clr_scl*min_clr[drv_sty]-jdg[@].dp);
+ fi
+ fi
+ if unknown boxed[@]:
+ boxed[@]:=false;
+ fi
+ fi
+enddef;
+
+vardef drv_check=
+ if root_num=0:
+ drv_errhelp "Well ...";
+ drv_errmessage "no inference has been declared";
+ else:
+ save root_idx;
+ numeric root_idx;
+ root_idx:=root[0];
+ drv_check_root[root_idx];
+ if root_num>1:
+ save root_str;
+ string root_str;
+ root_str:=decimal root_idx;
+ for idx=1 upto root_num-1:
+ root_idx:=root[idx];
+ drv_check_root[root_idx];
+ root_str:=root_str&", "&(decimal root_idx);
+ endfor
+ drv_message "warning, multiple root indices ("&root_str&").";
+ fi
+ fi
+ drv_checked:=true;
+enddef;
+
+%
+% Building
+%
+
+vardef drv_build_root[]=
+ %
+ % premises junction (from left to right)
+ %
+ for prm_rnk=0 upto prm_num[@]-1:
+ drv_build_root[prm[@][prm_rnk]];
+ if prm_rnk>0:
+ save ll_idx, lr_idx, rl_idx, rr_idx;
+ save lmax_x, rmin_x, min_skp;
+ numeric ll_idx, lr_idx, rl_idx, rr_idx;
+ numeric lmax_x, rmin_x, min_skp;
+ ypart jdg[prm[@][prm_rnk-1]].c=ypart jdg[prm[@][prm_rnk]].c;
+ ll_idx:=prm[@][0];
+ lr_idx:=prm[@][prm_rnk-1];
+ rl_idx:=prm[@][prm_rnk];
+ rr_idx:=prm[@][prm_rnk];
+ lmax_x:=imax_x[lr_idx];
+ rmin_x:=imin_x[rl_idx];
+ min_skp[0]:=rmin_x-lmax_x;
+ forever:
+ exitif (unknown r_prm[lr_idx]) or (unknown l_prm[rl_idx]);
+ ll_idx:=l_prm[ll_idx];
+ lr_idx:=r_prm[lr_idx];
+ rl_idx:=l_prm[rl_idx];
+ rr_idx:=r_prm[rr_idx];
+ lmax_x:=max(lmax_x, imax_x[lr_idx]);
+ rmin_x:=min(rmin_x, imin_x[rl_idx]);
+ min_skp[0]:=min(min_skp[0], imin_x[rl_idx]-imax_x[lr_idx]);
+ endfor
+ min_skp[1]:=rmin_x-lmax_x;
+ if known r_prm[lr_idx]:
+ r_prm[rr_idx]:= r_prm[lr_idx];
+ lmax_x:=smax_x[lr_idx];
+ elseif known l_prm[rl_idx]:
+ l_prm[ll_idx]:=l_prm[rl_idx];
+ rmin_x:=smin_x[rl_idx];
+ fi
+ min_skp[2]:=rmin_x-lmax_x;
+ if jct_sty[@]<3:
+ min_skp[jct_sty[@]]=prm_skp_scl*prm_skp[drv_sty];
+ fi
+ fi
+ endfor
+ if prm_num[@]>0:
+ l_prm[@]:=prm[@][0];
+ r_prm[@]:=prm[@][prm_num[@]-1];
+ fi
+ %
+ % judgment alignment
+ %
+ if prm_num[@]=0:
+ imin_x[@]:=xpart jdg[@].l-jdg_skp_scl*jdg_skp[jdg_sty[drv_sty]];
+ imax_x[@]:=xpart jdg[@].r+jdg_skp_scl*jdg_skp[jdg_sty[drv_sty]];
+ else:
+ save l_xref, r_xref;
+ l_xref=
+ if boxed[prm[@][0]]:
+ smin_x[prm[@][0]]
+ else:
+ xpart jdg[prm[@][0]].l
+ fi;
+ r_xref=
+ if boxed[prm[@][prm_num[@]-1]]:
+ smax_x[prm[@][prm_num[@]-1]]
+ else:
+ xpart jdg[prm[@][prm_num[@]-1]].r
+ fi;
+ if alg_sty[@]="l":
+ xpart jdg[@].l=l_xref;
+ elseif alg_sty[@]="c":
+ xpart jdg[@].c=(l_xref+r_xref)/2;
+ elseif alg_sty[@]="r":
+ xpart jdg[@].r=r_xref;
+ fi
+ imin_x[@]:=min(xpart jdg[@].l, l_xref)
+ -jdg_skp_scl*jdg_skp[jdg_sty[drv_sty]];
+ imax_x[@]:=max(xpart jdg[@].r, r_xref)
+ +jdg_skp_scl*jdg_skp[jdg_sty[drv_sty]];
+ fi
+ %
+ % inference line
+ %
+ save iln_wd, iln_pct;
+ numeric iln_wd;
+ picture iln_pct;
+ iln_wd:=imax_x[@]-imin_x[@];
+ iln_pct:=((0, 0)--(iln_wd, 0)) drv_styled iln_sty[@];
+ setbounds iln_pct to
+ (0, ypart llcorner iln_pct)
+ --(0, ypart ulcorner iln_pct)
+ --(iln_wd, ypart ulcorner iln_pct)
+ --(iln_wd, ypart llcorner iln_pct)
+ --cycle; % ! `linecap:=butt' and `linecap:=squared' -> same bounding box !
+ box_init iln[@] (iln_pct);
+ xpart iln[@].c=(imin_x[@]+imax_x[@])/2;
+ %
+ % orientation, smin_y & smax_y
+ %
+ if drv_bot_roots:
+ ypart iln[@].c=ypart jdg[@].c-den_dp;
+ smin_y[@]:=ypart jdg[@].c+jdg[@].dp;
+ smax_y[@]:=
+ if iln_sty[@]=0:
+ ypart jdg[@].c+jdg[@].hg
+ else:
+ ypart iln[@].c+iln[@].hg
+ fi;
+ if prm_num[@]>0:
+ ypart iln[@].c=ypart jdg[prm[@][0]].c-num_hg;
+ for prm_rnk=0 upto prm_num[@]-1:
+ smax_y[@]:=max(smax_y[@], smax_y[prm[@][prm_rnk]]);
+ endfor;
+ fi
+ else:
+ ypart iln[@].c=ypart jdg[@].c-num_hg;
+ smin_y[@]:=
+ if iln_sty[@]=0:
+ ypart jdg[@].c+jdg[@].dp
+ else:
+ ypart iln[@].c+iln[@].dp
+ fi;
+ smax_y[@]:=ypart jdg[@].c+jdg[@].hg;
+ if prm_num[@]>0:
+ ypart iln[@].c=ypart jdg[prm[@][0]].c-den_dp;
+ for prm_rnk=0 upto prm_num[@]-1:
+ smin_y[@]:=min(smin_y[@], smin_y[prm[@][prm_rnk]]);
+ endfor;
+ fi
+ fi
+ %
+ % inference labels
+ %
+ if known l_ilb[@]:
+ l_ilb[@].r=iln[@].l shifted (-ilb_skp_scl*ilb_skp[drv_sty], 0);
+ imin_x[@]:=xpart l_ilb[@].l;
+ smin_y[@]:=min(smin_y[@], ypart l_ilb[@].c+l_ilb[@].dp);
+ smax_y[@]:=max(smax_y[@], ypart l_ilb[@].c+l_ilb[@].hg);
+ fi
+ if known r_ilb[@]:
+ r_ilb[@].l=iln[@].r shifted (ilb_skp_scl*ilb_skp[drv_sty], 0);
+ imax_x[@]:=xpart r_ilb[@].r;
+ smin_y[@]:=min(smin_y[@], ypart r_ilb[@].c+r_ilb[@].dp);
+ smax_y[@]:=max(smax_y[@], ypart r_ilb[@].c+r_ilb[@].hg);
+ fi
+ %
+ % phantom steps
+ %
+ if known tgt[@]:
+ save phm_pth, phm_pct;
+ path phm_pth;
+ picture phm_pct;
+ save top_y, mid_y, bot_y;
+ numeric top_y, bot_y;
+ if drv_bot_roots:
+ bot_y:=xpart minmax_y[@]+min_clr_scl*min_clr[drv_sty]/2;
+ top_y:=xpart minmax_y[tgt[@]];
+ else:
+ bot_y:=ypart minmax_y[tgt[@]];
+ top_y:=ypart minmax_y[@]-min_clr_scl*min_clr[drv_sty]/2;
+ fi
+ mid_y:=(top_y+bot_y)/2;
+ phm_pth:=(0, (bot_y-top_y)/2)--(0, (top_y-bot_y)/2);
+ phm_pct:=phm_pth drv_styled phm_sty[@];
+ box_init phm[@] (phm_pct shifted ((width phm_pct)/2, 0));
+ phm[@].c=(xpart jdg[@].c, mid_y);
+ imin_x[@]:=min(imin_x[@], xpart phm[@].l);
+ imax_x[@]:=max(imax_x[@], xpart phm[@].r);
+ %
+ % phantom steps labels
+ %
+ if known l_plb[@]:
+ l_plb[@].r=phm[@].l shifted (-plb_skp[drv_sty], 0);
+ imin_x[@]:=min(imin_x[@], xpart l_plb[@].l);
+ fi
+ if known r_plb[@]:
+ r_plb[@].l=phm[@].r shifted ( plb_skp[drv_sty], 0);
+ imax_x[@]:=max(imax_x[@], xpart r_plb[@].r);
+ fi
+ fi
+ %
+ % smin_x & smax_x
+ %
+ smin_x[@]:=imin_x[@];
+ smax_x[@]:=imax_x[@];
+ for prm_rnk=0 upto prm_num[@]-1:
+ smin_x[@]:=min(smin_x[@], smin_x[prm[@][prm_rnk]]);
+ smax_x[@]:=max(smax_x[@], smax_x[prm[@][prm_rnk]]);
+ endfor
+ %
+ % delimiters
+ %
+ if known l_dlb[@] or known r_dlb[@]:
+ save idx, mmy, min_y, max_y;
+ numeric idx, min_y, max_y;
+ pair mmy;
+ mmy:=minmax_y[@];
+ min_y:=xpart mmy;
+ max_y:=ypart mmy;
+ if known l_dlb[@]:
+ box_init l_dlm[@] (delim l (max_y-min_y));
+ l_dlm[@].r=(smin_x[@], (max_y+min_y)/2);
+ l_dlb[@].r=l_dlm[@].l;
+ smin_x[@]:=xpart l_dlb[@].l;
+ fi
+ if known r_dlb[@]:
+ box_init r_dlm[@] (delim r (max_y-min_y));
+ r_dlm[@].l=(smax_x[@], (max_y+min_y)/2);
+ r_dlb[@].l=r_dlm[@].r;
+ smax_x[@]:=xpart r_dlb[@].r;
+ fi
+ fi
+ if (known l_dlb[@]) or boxed[@]:
+ idx:=@;
+ forever:
+ imin_x[idx]:=smin_x[@];
+ exitif unknown l_prm[idx];
+ idx:=l_prm[idx];
+ endfor
+ fi
+ if (known r_dlb[@]) or boxed[@]:
+ idx:=@;
+ forever:
+ imax_x[idx]:=smax_x[@];
+ exitif unknown r_prm[idx];
+ idx:=r_prm[idx];
+ endfor
+ fi
+enddef;
+
+vardef drv_build=
+ if not drv_checked:
+ drv_check;
+ fi
+ for idx=0 upto root_num-1:
+ drv_build_root[root[idx]];
+ endfor
+ drv_built:=true;
+enddef;
+
+%
+% Freezing
+%
+
+vardef drv_freeze_root[]=
+ for prm_rnk=0 upto prm_num[@]-1:
+ drv_freeze_root[prm[@][prm_rnk]];
+ endfor
+ for sbj_rnk=0 upto sbj_num[@]-1:
+ box_freeze sbj[@][sbj_rnk];
+ endfor
+ forsuffixes sfx=
+ iln, jdg, phm,
+ l_dlb, l_dlm, l_ilb, l_plb,
+ r_dlb, r_dlm, r_ilb, r_plb:
+ if known sfx[@]:
+ box_freeze sfx[@];
+ fi
+ endfor
+enddef;
+
+vardef drv_freeze=
+ if not drv_built:
+ drv_build;
+ fi
+ save root_idx;
+ numeric root_idx;
+ root_idx:=root[0];
+ if unknown iln[root_idx].c:
+ %
+ % default math axis
+ %
+ if drv_axis_ref="iln":
+ iln[root_idx].c=(0, axis_hg[drv_sty]);
+ else: % drv_axis_ref="jdg"
+ jdg[root_idx].c=(0, axis_hg[drv_sty]);
+ fi
+ drv_freeze_root[root_idx];
+ fi
+ for idx=1 upto root_num-1:
+ root_idx:=root[idx];
+ if unknown iln[root_idx].c:
+ smin_x[root_idx]=smax_x[root[idx-1]]+prm_skp_scl*prm_skp[drv_sty];
+ ypart iln[root_idx].c=ypart iln[root[idx-1]].c;
+ fi
+ drv_freeze_root[root_idx];
+ endfor
+ drv_frozen:=true;
+enddef;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Derivation tree pictures
+%
+
+%
+% 1. Global parameters
+%
+
+boolean drv_proofmode_on; %
+color prf_clr; %
+color jdg_clr; %
+color sbj_clr; %
+
+prf_clr:=.75background; % arbitrary
+jdg_clr:=red; % arbitrary
+sbj_clr:=blue; % arbitrary
+
+%
+% 2. Macros
+%
+
+vardef drv_tree_addto @# (expr idx) text draw_options=
+ for prm_rnk=0 upto prm_num[idx]-1:
+ drv_tree_addto @# (prm[idx][prm_rnk]) draw_options;
+ endfor
+ forsuffixes sfx=
+ jdg, phm,
+ l_dlb, l_dlm, l_ilb, l_plb,
+ r_dlb, r_dlm, r_ilb, r_plb:
+ if known sfx[idx]:
+ addto @# also sfx[idx] draw_options;
+ fi
+ endfor
+ if iln_sty[idx]>0:
+ addto @# also iln[idx] draw_options;
+ fi
+enddef;
+
+vardef tt_nat[] expr nat= % typewriter typeface naturals
+ save nat_aux, nat_pct_wd, dgt_num, nat_pct;
+ numeric nat_aux, nat_pct_wd, dgt_num;
+ picture nat_pct;
+ nat_aux:=abs nat;
+ nat_pct:=nullpicture;
+ nat_pct_wd:=0;
+ dgt_num:=1;
+ forever:
+ exitif nat_aux div (10**dgt_num)=0;
+ dgt_num:=dgt_num+1;
+ endfor
+ for rnk:=1 upto dgt_num:
+ addto nat_pct also tt_dgt[@][nat_aux div (10**(dgt_num-rnk))]
+ shifted (nat_pct_wd, 0);
+ nat_pct_wd:=width nat_pct;
+ nat_aux:=nat_aux mod (10**(dgt_num-rnk));
+ endfor
+ nat_pct shifted (0, -axis_hg[@])
+enddef;
+
+vardef prf_tree_addto @# expr idx=
+ for prm_rnk=0 upto prm_num[idx]-1:
+ prf_tree_addto @# (prm[idx][prm_rnk]);
+ endfor
+ if idx>=0:
+ box_init jdg_prf[idx] (tt_nat[2] idx);
+ jdg_prf[idx].r=jdg[idx].l;
+ box_freeze jdg_prf[idx];
+ addto @# also jdg_prf[idx] withcolor jdg_clr;
+ addto @# doublepath jdg[idx].c withcolor jdg_clr
+ withpen pencircle scaled (2*pdt_hg[drv_sty]);
+ fi
+ for sbj_rnk=0 upto sbj_num[idx]-1:
+ box_init sbj_prf[idx][sbj_rnk] (tt_nat[3] sbj_rnk);
+ if odd sbj_rnk:
+ sbj_prf[idx][sbj_rnk].c shifted (0, sbj_prf[idx][sbj_rnk].hg)=
+ sbj[idx][sbj_rnk].c
+ shifted (0, -den_dp-min_clr_scl*min_clr[drv_sty]/2);
+ else:
+ sbj_prf[idx][sbj_rnk].c shifted (0, sbj_prf[idx][sbj_rnk].dp)=
+ sbj[idx][sbj_rnk].c
+ shifted (0, -num_hg+min_clr_scl*min_clr[drv_sty]/2);
+ fi
+ box_freeze sbj_prf[idx][sbj_rnk];
+ addto @# also sbj_prf[idx][sbj_rnk] withcolor sbj_clr;
+ addto @# doublepath sbj[idx][sbj_rnk].c withcolor sbj_clr
+ withpen pencircle scaled pdt_hg[drv_sty];
+ endfor
+enddef;
+
+vardef drv_tree=
+ save pct;
+ picture pct;
+ pct:=nullpicture;
+ if not drv_frozen:
+ drv_freeze;
+ fi
+ for root_idx=0 upto root_num-1:
+ if drv_proofmode_on:
+ drv_tree_addto pct (root[root_idx]) withcolor prf_clr;
+ prf_tree_addto pct (root[root_idx]);
+ else:
+ drv_tree_addto pct (root[root_idx]);
+ fi
+ endfor
+ pct
+enddef;
+
+vardef drv_bbox[]=
+ save min_x, max_x, mmy, min_y, max_y;
+ pair mmy;
+ numeric min_x, max_x, max_y, min_y;
+ if not drv_frozen:
+ drv_freeze;
+ fi
+ min_x:=
+ if known l_dlm[@].r:
+ xpart l_dlm[@].r
+ else:
+ smin_x[@]
+ fi-jdg_skp_scl*jdg_skp[jdg_sty[drv_sty]];
+ max_x:=
+ if known r_dlm[@].l:
+ xpart l_dlm[@].l
+ else:
+ smax_x[@]
+ fi+jdg_skp_scl*jdg_skp[jdg_sty[drv_sty]];
+ mmy:=minmax_y[@];
+ min_y:=xpart mmy;
+ max_y:=ypart mmy;
+ (min_x, min_y)--
+ (min_x, max_y)--
+ (max_x, max_y)--
+ (max_x, min_y)--
+ cycle
+enddef;
+
+vardef mth_axis @# (suffix ref_sfx) (expr idx)=
+ if not drv_frozen:
+ drv_freeze;
+ fi
+ if unknown prm_num[idx]:
+ drv_errhelp "An index must be used to declare an inference before it is"&
+ " used to set the math axis of a picture.";
+ drv_errmessage "no inference has been declared using index "&(decimal idx);
+ else:
+ save ref_str, yref;
+ string ref_str;
+ numeric yref;
+ ref_str:=str ref_sfx;
+ if ref_str="iln":
+ yref:=ypart iln[idx].c;
+ elseif ref_str="jdg":
+ yref:=ypart jdg[idx].c;
+ elseif ref_str="dlm":
+ if known l_dlm[idx]:
+ yref:=ypart l_dlm[idx].c;
+ elseif known r_dlm[idx]:
+ yref:=ypart r_dlm[idx].c;
+ else:
+ drv_errhelp "Well ...";
+ drv_errmessage "no delimiter is attached to inference "&(decimal idx);
+ fi
+ else:
+ drv_errhelp "Valid identifiers are"&
+ " iln (inference line axis),"&
+ " jdg (judgment math-axis) and"&
+ " dlm (delimiter axis).";
+ drv_errmessage (ref_str&" is not a valid reference type identifier");
+ fi
+ if known yref:
+ @#:=@# shifted (0, axis_hg[drv_sty]-yref);
+ fi
+ fi
+enddef;
+
+vardef drv_axis (suffix ref) (expr idx)=
+ mth_axis currentpicture (ref, idx);
+enddef;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Tunings
+%
+
+vardef check_math_style (expr sty_str, default)=
+ if sty_str="\displaystyle":
+ 0
+ elseif sty_str="\textstyle":
+ 1
+ elseif sty_str="\scriptstyle":
+ 2
+ elseif sty_str="\scriptscriptstyle":
+ 3
+ else:
+ begingroup
+ drv_errhelp "Valid commands are"&
+ " \displaystyle,"&
+ " \textstyle,"&
+ " \scriptstyle and"&
+ " \scriptscriptstyle.";
+ drv_errmessage (sty_str&" is not a valid math-style command");
+ default
+ endgroup
+ fi
+enddef;
+
+vardef check_position_left (suffix pos_sfx) (expr default)=
+ save pos_str;
+ string pos_str;
+ pos_str:=str pos_sfx;
+ if (pos_str="l"):
+ true
+ elseif (pos_str="r"):
+ false
+ else:
+ begingroup
+ drv_errhelp "Valid identifiers are l (left) and r (right).";
+ drv_errmessage (pos_str&" is not a valid label position identifier");
+ default
+ endgroup
+ fi
+enddef;
+
+vardef check_mode_on (suffix status_sfx) (expr default)=
+ save status_str;
+ string status_str;
+ status_str:=str status_sfx;
+ if status_str="on":
+ true
+ elseif status_str="off":
+ false
+ else:
+ begingroup
+ drv_errhelp "Possible identifiers are on and off";
+ drv_errmessage (status_str&" is not a valid status identifier");
+ default
+ endgroup
+ fi
+enddef;
+
+vardef drv_math_style (suffix typ_sfx) (expr sty_str)=
+ save typ_str, sty_idx;
+ string typ_str;
+ numeric sty_idx;
+ typ_str:=str typ_sfx;
+ if (typ_str<>"drv")
+ and (typ_str<>"jdg")
+ and (typ_str<>"ilb")
+ and (typ_str<>"dlb")
+ and (typ_str<>"plb"):
+ drv_errhelp "Valid identifiers are"&
+ " drv (derivation tree),"&
+ " jdg (judgment),"&
+ " ilb (inference label),"&
+ " dlb (delimiter label) and"&
+ " plb (phantom steps label).";
+ drv_errmessage (sty_str&" is not a valid component identifier");
+ else:
+ sty_idx:=check_math_style (sty_str, 0);
+ if typ_str="drv":
+ drv_sty:=sty_idx;
+ else:
+ forsuffixes sfx=scantokens (typ_str&"_sty"):
+ for idx=0 upto 3:
+ sfx[idx]:=min(idx+sty_idx, 3);
+ endfor
+ endfor
+ fi
+ fi
+enddef;
+
+vardef drv_scale (suffix scl_sfx) (expr scl)=
+ save scl_str;
+ string scl_str;
+ scl_str:=str scl_sfx;
+ if scl_str="clr":
+ min_clr_scl:=scl;
+ elseif scl_str="prm":
+ prm_skp_scl:=scl;
+ elseif (scl_str="jdg") or (scl_str="jgm"): % "jgm" is deprecated
+ jdg_skp_scl:=scl;
+ elseif (scl_str="ilb") or (scl_str="lbl"): % "lbl" is deprecated
+ ilb_skp_scl:=scl;
+ else:
+ drv_errhelp "Valid identifiers are"&
+ " clr,"&
+ " prm,"&
+ " jdg and"&
+ " ilb.";
+ drv_errmessage (scl_str&" is not a valid scale identifier");
+ fi
+enddef;
+
+vardef drv_junction_style suffix sty_sfx=
+ drv_jct_sty:=check_junction_style (sty_sfx, drv_jct_sty);
+enddef;
+
+vardef drv_alignment_style suffix sty_sfx=
+ drv_alg_sty:=check_alignment_style (sty_sfx, drv_alg_sty);
+enddef;
+
+vardef drv_path_style (suffix typ_sfx, sty_sfx)=
+ save typ_str;
+ string typ_str;
+ typ_str:=str typ_sfx;
+ if typ_str="iln":
+ drv_iln_sty:=check_path_style (sty_sfx, drv_iln_sty);
+ elseif typ_str="phm":
+ drv_phm_sty:=check_path_style (sty_sfx, drv_phm_sty);
+ else:
+ drv_errhelp "Valid identifiers are"&
+ " iln (inference line) and"&
+ " phm (phantom steps path).";
+ drv_errmessage (typ_str&" is not a valid path-type identifier");
+ fi
+enddef;
+
+vardef drv_labels_position_aux (suffix typ_sfx, pos_sfx)=
+ save typ_str, idt_str, pos_str;
+ string typ_str, idt_str, pos_str;
+ typ_str:=str typ_sfx;
+ if typ_str="ilb":
+ drv_left_ilb:=check_position_left (pos_sfx, drv_left_ilb);
+ elseif typ_str="dlb":
+ drv_left_dlb:=check_position_left (pos_sfx, drv_left_dlb);
+ elseif typ_str="plb":
+ drv_left_plb:=check_position_left (pos_sfx, drv_left_plb);
+ else:
+ drv_errhelp "Valid identifiers are"&
+ " ilb (inference label),"&
+ " dlb (delimiter label) and"&
+ " plb (phantom steps label).";
+ drv_errmessage (typ_str&" is not a valid label-type identifier");
+ fi
+enddef;
+
+vardef drv_labels_position text ARG=
+ drv_labels_position_aux if pair ARG: ARG else: (ilb, ARG) fi;
+enddef;
+
+vardef drv_roots_position suffix pos_sfx=
+ save pos_str;
+ string pos_str;
+ pos_str:=str pos_sfx;
+ if pos_str="t":
+ drv_bot_roots:=false;
+ elseif pos_str="b":
+ drv_bot_roots:=true;
+ else:
+ drv_errhelp "Valid identifiers are"&
+ " t (top) and"&
+ " b (bottom).";
+ drv_errmessage (pos_str&" is not a valid root position identifier");
+ fi
+enddef;
+
+vardef drv_axis_reference suffix ref_sfx=
+ save ref_str;
+ string ref_str;
+ ref_str:=str ref_sfx;
+ if (ref_str<>"iln") and (ref_str<>"jdg"):
+ drv_errhelp "Valid identifiers are iln (inference line axis) and"&
+ " jdg (judgment math-axis).";
+ drv_errmessage (ref_str&" is not a valid reference identifier");
+ else:
+ drv_axis_ref:=ref_str;
+ fi
+enddef;
+
+vardef drv_delimiter (suffix pos_sfx) (expr dlm_str)=
+ if check_position_left (pos_sfx, true):
+ drv_l_dlm:=dlm_str;
+ else:
+ drv_r_dlm:=dlm_str;
+ fi
+enddef;
+
+vardef drv_left_delimiter expr dlm_str=
+ drv_delimiter (l, dlm_str);
+enddef;
+
+vardef drv_right_delimiter expr dlm_str=
+ drv_delimiter (r, dlm_str);
+enddef;
+
+vardef drv_box_mode suffix status_sfx=
+ drv_boxmode_on:=check_mode_on (status_sfx, drv_boxmode_on);
+enddef;
+
+vardef drv_fraction_mode suffix status_sfx=
+ drv_fractionmode_on:=check_mode_on (status_sfx, drv_fractionmode_on);
+enddef;
+
+vardef drv_proof_mode suffix status_sfx=
+ drv_proofmode_on:=check_mode_on (status_sfx, drv_proofmode_on);
+enddef;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Default settings
+%
+
+drv_font_size "\normalsize";
+drv_math_style (drv, "\displaystyle");
+drv_math_style (jdg, "\textstyle");
+drv_math_style (ilb, "\scriptstyle");
+drv_math_style (dlb, "\textstyle");
+drv_math_style (plb, "\textstyle");
+drv_scale (clr, 1);
+drv_scale (prm, 1);
+drv_scale (jdg, 1);
+drv_scale (ilb, 1);
+drv_junction_style 1;
+drv_alignment_style c;
+drv_path_style (iln, 1);
+drv_path_style (phm, 3);
+drv_labels_position (ilb, r);
+drv_labels_position (dlb, l);
+drv_labels_position (plb, l);
+drv_roots_position b;
+drv_axis_reference iln;
+drv_left_delimiter "\lbrace";
+drv_right_delimiter "\rbrace";
+drv_box_mode off;
+drv_fraction_mode on;
+drv_proof_mode off;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% LaTeX inclusion macro
+%
+% \drv includes a picture file in such a way that the baseline of the included
+% picture coincides with the baseline of the inclusion point. The code for \drv
+% was suggested by Josselin Noirel on the fr.comp.text.tex usenet group.
+%
+% \usepackage{graphicx}
+% \makeatletter
+% \def\Gin@def@bp#1\relax#2#3{\gdef#2{#3}}
+% \newsavebox{\graphicsbox}
+% \newcommand*{\drv}[1]{%
+% \sbox{\graphicsbox}{\includegraphics{#1}}%
+% \raisebox{\Gin@lly bp}%
+% {\usebox{\graphicsbox}}}
+% \makeatother
diff --git a/Master/texmf-dist/doc/metapost/drv/sample/makefile b/Master/texmf-dist/doc/metapost/drv/sample/makefile
new file mode 100644
index 00000000000..ab57ffe9ace
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/drv/sample/makefile
@@ -0,0 +1,47 @@
+MAIN= coq-sample
+
+$(MAIN).pdf: $(MAIN).ps
+ ps2pdf $(MAIN).ps
+
+$(MAIN).ps: $(MAIN).tex $(MAIN)-delayed.mp
+ latex $(MAIN)
+ dvips -t unknown $(MAIN) -o
+
+$(MAIN)-proof.pdf: $(MAIN)-proof.ps
+ ps2pdf $(MAIN)-proof.ps
+
+$(MAIN)-proof.ps: $(MAIN)-delayed.mp
+ latex $(MAIN)-proof
+ dvips -t unknown $(MAIN)-proof -o
+
+$(MAIN)-delayed.mp: $(MAIN).mp
+ $(RM) $(MAIN)-delayed.mp
+ mpost $(MAIN)
+ mpost $(MAIN)
+
+.SILENT clean:
+ $(RM) drv.mpx
+ $(RM) $(MAIN).[0-9]*
+ $(RM) $(MAIN).aux
+ $(RM) $(MAIN).dvi
+ $(RM) $(MAIN).log
+ $(RM) $(MAIN).nav
+ $(RM) $(MAIN).out
+ $(RM) $(MAIN).snm
+ $(RM) $(MAIN).toc
+ $(RM) $(MAIN)-delayed.mp
+ $(RM) $(MAIN)-delayed.mpx
+ $(RM) $(MAIN)-proof.aux
+ $(RM) $(MAIN)-proof.dvi
+ $(RM) $(MAIN)-proof.log
+ $(RM) $(MAIN)-proof.nav
+ $(RM) $(MAIN)-proof.out
+ $(RM) $(MAIN)-proof.snm
+ $(RM) $(MAIN)-proof.tex
+ $(RM) $(MAIN)-proof.toc
+
+cleanall: clean
+ $(RM) $(MAIN).pdf
+ $(RM) $(MAIN).ps
+ $(RM) $(MAIN)-proof.pdf
+ $(RM) $(MAIN)-proof.ps
diff --git a/Master/texmf-dist/doc/metapost/drv/sample/readme.txt b/Master/texmf-dist/doc/metapost/drv/sample/readme.txt
new file mode 100644
index 00000000000..b0c3c91b5e5
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/drv/sample/readme.txt
@@ -0,0 +1,14 @@
+# In order to compile the sources and to get a pdf file, use `make' or:
+
+# 1. run metapost TWICE:
+mpost coq-sample.mp
+mpost coq-sample.mp
+
+# 2. run latex (once):
+latex coq-sample.tex
+
+# 3. run dvips (once):
+dvips coq-sample.dvi -o
+
+# 4. run ps2pdf (once):
+ps2pdf coq-sample.ps
diff --git a/Master/texmf-dist/doc/metapost/drv/template/drv.mp b/Master/texmf-dist/doc/metapost/drv/template/drv.mp
new file mode 100644
index 00000000000..5eb38396144
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/drv/template/drv.mp
@@ -0,0 +1,2245 @@
+%% drv.mp 0.93
+%% Copyright 2009 Laurent M\'ehats
+%
+% 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 Laurent M\'ehats.
+% <laurent.mehats@gmail.com>
+%
+% This work consists of the file drv.mp
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% User's macros summary
+%
+%
+% * Judgment & inference declarations
+% ===================================
+%
+% jgm <nat> <str list>
+% <nat> judgment index
+% <str list> sub-judgments math-mode LaTeX code
+%
+% nfr <nat> (<nat list>) (<str>, <id>)
+% <nat> inference index
+% <nat list> list of premise indices
+% <str> inference label math-mode LaTeX code
+% <id> inference line style identifier
+% (0, 1, 2, 3, 4, 5, 6 or _)
+% 0 none
+% 1 simple
+% 2 double
+% 3 dotted
+% 4 dashed
+% 5 waved
+% 6 TeX-dotted
+% _ default (set by drv_path_style)
+%
+% mvd <nat 1> (<nat 2>, <id>)
+% <nat 1> index of the origin judgment
+% <nat 2> number of phantom steps
+% <id> phantom steps path-style identifier
+% (0, 1, 2, 3, 4, 5, 6 or _)
+%
+% Nfr <nat> (<nat list>) (<str 1>, <str 2>, <str 3>, <id>)
+% <nat> inference index
+% <nat list> list of premise indices
+% <str 1> inference label math-mode LaTeX code
+% <str 2> left delimiter label math-mode LaTeX code
+% <str 3> right delimiter label math-mode LaTeX code
+% <id> inference line style identifier
+% (0, 1, 2, 3, 4, 5, 6 or _)
+%
+% Mvd <nat 1> (<nat 2>, <str 1>, <str 2>, <id>)
+% <nat 1> index of the origin judgment
+% <nat 2> number of phantom steps
+% <str 1> left label math-mode LaTeX code
+% <str 2> right label math-mode LaTeX code
+% <id> phantom steps path-style identifier
+% (0, 1, 2, 3, 4, 5, 6 or _)
+%
+% NFR <nat> (<nat list>) (<str 1>, <str 2>, <str 3>, <str 4>)
+% (<id 1>, <id 2>, <id 3>)
+% <nat> inference index
+% <nat list> list of premise indices
+% <str 1> left inference label math-mode LaTeX code
+% <str 2> right inference label math-mode LaTeX code
+% <str 3> left delimiter label math-mode LaTeX code
+% <str 4> right delimiter label math-mode LaTeX code
+% <id 1> junction style identifier (0, 1, 2, 3 or _)
+% 0 fully-interlacing
+% 1 semi-interlacing
+% 2 non-interlacing
+% 3 user specified (tricky)
+% _ default (set by drv_junction_style)
+% <id 2> alignment style identifier (l, c, r, u or _)
+% l left
+% c centered
+% r right
+% u user specified (tricky)
+% _ default (set by drv_alignment_style)
+% <id 3> inference line style identifier
+% (0, 1, 2, 3, 4, 5, 6 or _)
+%
+% MVD <nat 1> (<nat 2>, <str 1>, <str 2>, <id 1> <id 2>)
+% <nat 1> index of the origin judgment
+% <nat 2> number of phantom steps
+% <str 1> left label math-mode LaTeX code
+% <str 2> right label math-mode LaTeX code
+% <id 1> alignment style identifier (l, c, r, u or _)
+% <id 2> phantom steps path-style identifier
+% (0, 1, 2, 3, 4, 5, 6 or _)
+%
+% NFR_opt <nat> (<nat list>) (<str list 1>) (<str list 2>)
+% (<id 1>, <id 2>, <id 3>)
+% <nat> inference index
+% <nat list> list of premise indices
+% <str list 1> list of inference labels math-mode LaTeX code
+% <str list 2> list of delimiter labels math-mode LaTeX code
+% <id 1> junction style identifier (0, 1, 2, 3 or _)
+% <id 2> alignment style identifier (l, c, r, u or _)
+% <id 3> inference line style identifier
+% (0, 1, 2, 3, 4, 5, 6 or _)
+%
+% MVD_opt <nat 1> (<nat 2>) (<str list>) (<id 1> <id 2>)
+% <nat 1> index of the origin judgment
+% <nat 2> number of phantom steps
+% <str list> list of labels math-mode LaTeX code
+% <id 1> alignment style identifier (l, c, r or u)
+% <id 2> phantom steps path-style identifier
+% (0, 1, 2, 3, 4, 5, 6 or _)
+%
+% * Tunings
+% =========
+%
+% drv_font_size <str>
+% <str> LaTeX font-size command
+% "\tiny"
+% "\scriptsize"
+% "\footnotesize"
+% "\small"
+% "\normalsize"
+% "\large"
+% "\Large"
+% etc.
+%
+% drv_math_style (<id>, <str>)
+% <id> component identifier (drv, jdg, ilb, dlb or plb)
+% drv derivation trees
+% jdg judgments
+% ilb inference labels
+% dlb delimiter labels
+% plb phantom steps labels
+% <str> LaTeX math-style command
+%
+% drv_scale (<id>, <float>)
+% <id> scale identifier (clr, prm, jdg or ilb)
+% clr nice explanation soon (see examples)
+% prm nice explanation soon (see examples)
+% jdg nice explanation soon (see examples)
+% ilb nice explanation soon (see examples)
+% <float> scale value
+%
+% drv_junction_style <id>
+% <id> junction style identifier (0, 1 or 2)
+% 0 ``fully-interlacing''
+% 1 ``semi-interlacing''
+% 2 ``non-interlacing''
+%
+% drv_alignment_style <id>
+% <id> alignment style identifier (l, c or r)
+% l left
+% c centered
+% r right
+%
+% drv_path_style (<id 1>, <id 2>)
+% <id 1> path-type identifier (iln or phm)
+% iln inference lines
+% phm phantom steps paths
+% <id 2> path-style identifier (0, 1, 2, 3, 4, 5 or 6)
+%
+% drv_labels_position (<id 1>, <id 2>)
+% <id 1> label-type identifier (ilb, plb or dlb)
+% ilb inference labels
+% dlb delimiter labels
+% plb phantom steps labels
+% <id 2> position identifier (l or r)
+% l left
+% r right
+%
+% drv_roots_position <id>
+% <id> position identifier (t or b)
+% t top
+% b bottom
+%
+% drv_axis_reference <id>
+% <id> reference identifier (iln or jdg)
+% iln root inference line axis
+% jdg root judgment math-axis
+%
+% drv_left_delimiter <str>
+% <str> left delimiter math-mode LaTeX code
+% "(" $($
+% "[" $[$
+% "\lbrace" $\lbrace$
+% "\langle" $\langle$
+% etc.
+%
+% drv_right_delimiter <str>
+% <str> right delimiter math-mode LaTeX code
+% ")"
+% "]"
+% "\rbrace"
+% "\rangle"
+% etc.
+%
+% drv_box_mode <id>
+% <id> status identifier (on or off)
+% on
+% off
+%
+% drv_fraction_mode <id>
+% <id> status identifier (on or off)
+% on
+% off
+%
+% drv_proof_mode <id>
+% <id> status identifier (on or off)
+% on
+% off
+%
+% * Derivation tree pictures
+% ==========================
+%
+% drv_bbox <nat>
+% <nat> sub-tree root index
+%
+% drv_axis (<id>, <nat>)
+% <id> reference type identifier (iln, jdg or dlm)
+% iln inference line axis
+% jdg judgment math-axis
+% dlm delimiter axis
+% <nat> reference index
+%
+% <path> drv_styled <id>
+% <path> MetaPost path expression
+% <id> path style identifier (0, 1, 2, 3, 4, 5 or 6)
+%
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% MetaPost messages formatting
+%
+
+% drv_format prevents messages from being automatically cut into lines every
+% 79 characters: if possible, a word which would otherwise be cut is 'pushed'
+% to the following line by inserting space characters before it.
+
+vardef drv_format (expr str, fst_len, nxt_len, dbl_pcs)=
+ % str: the message to be formatted
+ % fst_len: first line length
+ % nxt_len: following lines length
+ % dbl_pcs (boolean): occurrences of the percent character must be doubled
+ save str_len, sub_len, aux_len, chr_rnk, occ_num;
+ numeric str_len, sub_len, aux_len, chr_rnk, occ_num;
+ save aux_str, chr;
+ string aux_str, chr;
+ str_len:=length str;
+ sub_len:=0;
+ chr_rnk:=0;
+ occ_num:=0;
+ aux_len:=0;
+ aux_str:="";
+ forever:
+ exitif (chr_rnk=fst_len) or (chr_rnk=str_len);
+ chr:=substring (chr_rnk, chr_rnk+1) of str;
+ aux_str:=aux_str&chr;
+ if chr=" ":
+ sub_len:=chr_rnk+1;
+ aux_len:=sub_len+occ_num;
+ elseif (chr="%") and dbl_pcs:
+ aux_str:=aux_str&"%";
+ occ_num:=occ_num+1;
+ fi
+ chr_rnk:=chr_rnk+1;
+ endfor
+ if chr_rnk=fst_len:
+ begingroup
+ if sub_len=0:
+ sub_len:=fst_len;
+ aux_len:=sub_len+occ_num;
+ fi
+ substring (0, aux_len) of aux_str&
+ for idx=sub_len+1 upto fst_len:
+ " "&
+ endfor
+ drv_format (substring (sub_len, str_len) of str,
+ nxt_len, nxt_len, dbl_pcs)
+ endgroup
+ else:
+ aux_str
+ fi
+enddef;
+
+boolean drv_inside_fig;
+drv_inside_fig:=false;
+
+vardef drv_context=
+ "drv"&if drv_inside_fig: " (fig. "&decimal charcode&")"&fi ": "
+enddef;
+
+vardef drv_message expr str=
+ message drv_format (drv_context&str, 79, 79, false);
+enddef;
+
+vardef drv_errhelp expr str=
+ % Occurrences of the percent character must be doubled: errhelp makes single
+ % single occurrences behave as newline characters (this is inherited from
+ % MetaFont).
+ errhelp drv_format (str, 79, 79, true);
+enddef;
+
+vardef drv_errmessage expr str=
+ % errmessage inserts the 2-characters string "! " before its argument.
+ % Hence 77 as a first line length argument.
+ errmessage drv_format (drv_context&str, 77, 79, false);
+enddef;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Delayed LaTeX processing
+%
+
+picture tex_pct[];
+string delayed_tex_file;
+delayed_tex_file:=jobname&"-delayed.mp";
+
+%
+% reading LaTeX picture definitions
+%
+
+boolean drv_nullpicture;
+drv_nullpicture:=true;
+
+string readfrom_str;
+readfrom_str:=readfrom delayed_tex_file;
+if readfrom_str<>EOF:
+ closefrom delayed_tex_file;
+ drv_message ("reading `"&delayed_tex_file&"' LateX picture definitions.");
+ batchmode;
+ scantokens ("input "&delayed_tex_file);
+ errorstopmode;
+ drv_message "done.";
+ drv_nullpicture:=false;
+fi
+
+%
+% copying LaTeX preamble
+%
+
+vardef drv_read (expr search_str) (suffix accum_str)=
+ save readfrom_str, readfrom_substr;
+ string readfrom_str, readfrom_substr;
+ accum_str:="";
+ forever:
+ readfrom_str:=readfrom jobname;
+ readfrom_substr:=substring (0, length search_str) of readfrom_str;
+ exitif (readfrom_substr=search_str) or (readfrom_str=EOF);
+ accum_str:=accum_str&readfrom_str&char(10);
+ endfor
+ if readfrom_str=EOF:
+ closefrom jobname;
+ drv_errhelp ("`"&jobname&".mp' should contain a line starting with "&
+ ditto&search_str&ditto&".");
+ drv_errmessage (ditto&search_str&ditto&" is missing");
+ fi
+enddef;
+
+string tex_preamble_str[];
+% tex_preamble_str[0] from "verbatimtex %&latex" to "\begin{document}"
+% tex_preamble_str[1] from "\begin{document}" to "etex;"
+
+drv_message ("reading `"&jobname&".mp' LateX preamble.");
+ drv_read ("verbatimtex %&latex", tex_preamble_str[0]);
+ drv_read ("\begin{document}", tex_preamble_str[0]);
+ drv_read ("etex;", tex_preamble_str[1]);
+ closefrom jobname;
+ write
+ "%"&char(10)&
+ "% AUTOMATICALLY GENERATED BY DRV.MP - DO NOT MODIFY."&char(10)&
+ "%"&char(10)&char(10)&
+ "verbatimtex %&latex"&char(10)&
+ tex_preamble_str[0]&
+ "\begin{document}"&char(10)&
+ tex_preamble_str[1]&
+ "etex;"
+ to delayed_tex_file;
+drv_message "done.";
+
+%
+% writing LaTeX picture definitions
+%
+
+numeric tex_pct_idx;
+tex_pct_idx:=0;
+
+% Math style indices: 0, 1, 2, 3
+string mth_sty_str[];
+mth_sty_str[0]:="\displaystyle";
+mth_sty_str[1]:="\textstyle";
+mth_sty_str[2]:="\scriptstyle";
+mth_sty_str[3]:="\scriptscriptstyle";
+
+string drv_fontsize;
+
+vardef drv_tex[] expr tex_str=
+ % @: math style index
+ % tex_str: math mode LaTeX code
+ save def_str, pct;
+ string def_str;
+ picture pct;
+ def_str:="btex{"&drv_fontsize&"$"&mth_sty_str[@]&"{}"&tex_str&"{}$}etex;";
+ write "tex_pct["&(decimal tex_pct_idx)&"]:="&def_str to delayed_tex_file;
+ pct:=
+ if known tex_pct[tex_pct_idx]:
+ tex_pct[tex_pct_idx]
+ else:
+ nullpicture
+ fi;
+ tex_pct_idx:=tex_pct_idx+1;
+ pct
+enddef;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% MetaPost shorthands
+%
+
+vardef depth expr pct=
+ ypart llcorner pct
+enddef;
+
+vardef height expr pct=
+ ypart urcorner pct
+enddef;
+
+vardef width expr pct=
+ xpart urcorner pct-xpart llcorner pct
+enddef;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Font-specific parameters
+%
+
+%
+% em[s] width of an m (s: mathstyle index)
+% ex[s] height of an x
+% axis_hg[s] height of the mathematical axis
+% num_bl_hg[s] height of a numerator baseline w.r.t. the fraction bar axis
+% den_bl_dp[s] depth of a denominator baseline w.r.t. the fraction bar axis
+% rul_thk[s] default rule thickness
+%
+
+numeric em[], ex[], axis_hg[], num_bl_hg[], den_bl_dp[], rul_thk[];
+
+%
+% thn_sp[s] thin space, usually 1em/6
+% med_sp[s] medium space, usually 2em/9
+% thk_sp[s] thick space, usually 5em/18
+%
+
+numeric thn_sp[], med_sp[], thk_sp[];
+
+%
+% pdt_hg[s] height of a punctuation ldot
+% pdt_wd[s] width of a punctuation ldot
+%
+
+numeric pdt_hg[], pdt_wd[];
+
+%
+% tt_dgt[s][i] typewriter typeface digits (i ranges from 0 to 9)
+%
+
+picture tt_dgt[][];
+
+%
+% min_clr[s] minimal clearance between a numerator
+% or a denominator and the fraction bar
+% prm_skp[s] <nice explanation>
+% jdg_skp[s] <nice explanation>
+% ilb_skp[s] <nice explanation>
+% plb_skp[s] <nice explanation>
+%
+
+numeric min_clr[], prm_skp[], jdg_skp[], ilb_skp[], plb_skp[];
+
+vardef drv_fontdimen[] expr font=
+ save dim_pct;
+ picture dim_pct;
+ dim_pct:=drv_tex[0] ("\rule{\the\fontdimen"&(decimal @)&font&"}{0bp}");
+ width dim_pct
+enddef;
+
+vardef drv_font_size expr size_str=
+ save pdt_pct, sp_pct;
+ picture pdt_pct, sp_pct;
+ drv_fontsize:=size_str;
+ write char(10)&"% font-specific parameters ("&drv_fontsize&")"&char(10)
+ to delayed_tex_file;
+ ex[0]:=drv_fontdimen[5] "\textfont2";
+ ex[1]:=drv_fontdimen[5] "\textfont2";
+ ex[2]:=drv_fontdimen[5] "\scriptfont2";
+ ex[3]:=drv_fontdimen[5] "\scriptscriptfont2";
+ em[0]:=drv_fontdimen[6] "\textfont2";
+ em[1]:=drv_fontdimen[6] "\textfont2";
+ em[2]:=drv_fontdimen[6] "\scriptfont2";
+ em[3]:=drv_fontdimen[6] "\scriptscriptfont2";
+ rul_thk[0]:=drv_fontdimen[8] "\textfont3";
+ rul_thk[1]:=drv_fontdimen[8] "\textfont3";
+ rul_thk[2]:=drv_fontdimen[8] "\scriptfont3";
+ rul_thk[3]:=drv_fontdimen[8] "\scriptscriptfont3";
+ axis_hg[0]:=drv_fontdimen[22] "\textfont2";
+ axis_hg[1]:=drv_fontdimen[22] "\textfont2";
+ axis_hg[2]:=drv_fontdimen[22] "\scriptfont2";
+ axis_hg[3]:=drv_fontdimen[22] "\scriptscriptfont2";
+ num_bl_hg[0]:=(drv_fontdimen[8] "\textfont2")-axis_hg[0];
+ num_bl_hg[1]:=(drv_fontdimen[9] "\textfont2")-axis_hg[1];
+ num_bl_hg[2]:=(drv_fontdimen[9] "\scriptfont2")-axis_hg[2];
+ num_bl_hg[3]:=(drv_fontdimen[9] "\scriptscriptfont2")-axis_hg[3];
+ den_bl_dp[0]:=-(drv_fontdimen[11] "\textfont2")-axis_hg[0];
+ den_bl_dp[1]:=-(drv_fontdimen[12] "\textfont2")-axis_hg[1];
+ den_bl_dp[2]:=-(drv_fontdimen[12] "\scriptfont2")-axis_hg[2];
+ den_bl_dp[3]:=-(drv_fontdimen[12] "\scriptscriptfont2")-axis_hg[3];
+ min_clr[0]:=3*rul_thk[0]; % The TEXbook,
+ min_clr[1]:=1*rul_thk[1]; % Appendix G,
+ min_clr[2]:=1*rul_thk[2]; % Rule 15d.
+ min_clr[3]:=1*rul_thk[3]; %
+ for mth_sty:=0 upto 3:
+ sp_pct:=drv_tex[mth_sty] "\,";
+ thn_sp[mth_sty]:=width sp_pct;
+ sp_pct:=drv_tex[mth_sty] "\>";
+ med_sp[mth_sty]:=width sp_pct;
+ sp_pct:=drv_tex[mth_sty] "\;";
+ thk_sp[mth_sty]:=width sp_pct;
+ pdt_pct:=drv_tex[mth_sty] "\ldotp";
+ pdt_hg[mth_sty]:=height pdt_pct;
+ pdt_wd[mth_sty]:=width pdt_pct;
+ for dgt=0 upto 9:
+ tt_dgt[mth_sty][dgt]:=drv_tex[mth_sty] "\texttt{"&(decimal dgt)&"}";
+ endfor
+ prm_skp[mth_sty]:=3*med_sp[mth_sty]; % arbitrary
+ jdg_skp[mth_sty]:=thn_sp[mth_sty]; % arbitrary
+ ilb_skp[mth_sty]:=thn_sp[mth_sty]; % arbitrary
+ plb_skp[mth_sty]:=thk_sp[mth_sty]; % arbitrary
+ endfor
+enddef;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Math-related parameters & macros
+%
+
+%
+% Math styles
+% drv_sty derivation trees
+% jdg_sty[drv_sty] judgments
+% ilb_sty[drv_sty] inference labels
+% dlb_sty[drv_sty] delimiter labels
+% plb_sty[drv_sty] phantom steps labels
+%
+
+numeric drv_sty, jdg_sty[], ilb_sty[], dlb_sty[], plb_sty[];
+
+%
+% Math-axis centered LaTeX pictures
+%
+
+vardef mth_tex[] expr tex_str=
+ (drv_tex[@] tex_str) shifted (0, -axis_hg[@])
+enddef;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% drv-boxes
+%
+
+vardef drv_box text STR=
+ for str=STR:
+ expandafter picture scantokens str;
+ expandafter pair scantokens str.l;
+ expandafter pair scantokens str.c;
+ expandafter pair scantokens str.r;
+ expandafter numeric scantokens str.hg;
+ expandafter numeric scantokens str.dp;
+ endfor
+enddef;
+
+vardef box_init @# (expr pct)=
+ @#:=pct;
+ @#.r-@#.l=(width pct, 0);
+ @#.c=(@#.l+@#.r)/2;
+ @#.hg:=height pct;
+ @#.dp:=depth pct;
+enddef;
+
+vardef box_freeze @#=
+ @#:=@# shifted @#.l;
+enddef;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% beginfig & endfig
+%
+
+%
+% drv_beginfig: figure initialization
+%
+
+pen drv_pen;
+
+vardef drv_beginfig=
+ %
+ % Judgments
+ %
+ % jdg[i] judgment drv-box
+ % sbj_num[i] number of sub-judgments
+ % sbj[i][j] sub-judgment drv-box (j ranges from 0 to sbj_num[i]-1)
+ %
+ drv_box "jdg[]";
+ numeric sbj_num[];
+ drv_box "sbj[][]";
+ %
+ % Inferences
+ %
+ % prm_num[i] number of premises
+ % prm[i][j] premise index (j ranges from 0 to prm_num[i]-1)
+ % ccl[i] conclusion index
+ % jct_sty[i] junction style
+ % alg_sty[i] alignment style
+ % iln_sty[i] inference line style
+ % l_prm[i] leftmost `graphical' premise index
+ % r_prm[i] rightmost `graphical' premise index
+ %
+ numeric prm_num[], prm[][], ccl[];
+ numeric jct_sty[];
+ string alg_sty[];
+ numeric iln_sty[];
+ numeric l_prm[], r_prm[];
+ %
+ % imin_x[i] inference minimal x
+ % l_dlb[i] left delimiter label drv-box
+ % l_dlm[i] left delimiter drv-box
+ % l_ilb[i] left label drv-box
+ % iln[i] inference line drv-box
+ % r_ilb[i] right label drv-box
+ % r_dlm[i] right delimiter drv-box
+ % r_dlb[i] right delimiter label drv-box
+ % imax_x[i] inference maximal x
+ %
+ numeric imin_x[];
+ drv_box "l_dlb[]", "l_dlm[]", "l_ilb[]";
+ drv_box "iln[]";
+ drv_box "r_ilb[]", "r_dlm[]", "r_dlb[]";
+ numeric imax_x[];
+ %
+ % Sub-trees
+ %
+ % smin_x[i] sub-tree minimal x
+ % smax_x[i] sub-tree maximal x
+ % smin_y[i] sub-tree minimal y
+ % smax_y[i] sub-tree maximal y
+ % boxed[i] boolean
+ %
+ numeric smin_x[], smax_x[], smin_y[], smax_y[];
+ boolean boxed[];
+ %
+ % Pen initialization
+ %
+ drv_pen:=pencircle scaled rul_thk[drv_sty];
+ %
+ % num_hg height of a numerator axis w.r.t. the fraction bar axis
+ % den_dp depth of a denominator axis w.r.t. the fraction bar axis
+ % iln_hg[s] height of a style s inference line
+ % iln_dp[s] depth of a style s inference line
+ %
+ numeric num_hg, den_dp, iln_hg[], iln_dp[];
+ num_hg:=num_bl_hg[drv_sty]+axis_hg[jdg_sty[drv_sty]];
+ den_dp:=den_bl_dp[drv_sty]+axis_hg[jdg_sty[drv_sty]];
+ picture iln_pct;
+ for sty=0 upto 6:
+ iln_pct:=((0, 0)--(10, 0)) drv_styled sty;
+ iln_hg[sty]:=height iln_pct;
+ iln_dp[sty]:=depth iln_pct;
+ endfor
+ %
+ % Derivation trees
+ %
+ % root_num number of roots
+ % root[i] root index (i ranges from 0 to root_num-1)
+ % drv_built boolean
+ % drv_frozen boolean
+ %
+ numeric root_num, root[];
+ boolean drv_checked, drv_built, drv_frozen;
+ root_num:=0;
+ drv_checked:=false;
+ drv_built:=false;
+ drv_frozen:=false;
+ %
+ % Phantom steps
+ %
+ % phm_idx phantom inferences index
+ % src[i] base phantom judgment index (in case of an origin judgment)
+ % tgt[i] origin judgment index (in case of a base phantom judgment)
+ % phm_sty[i] phantom steps style
+ % l_plb[i] left phantom steps label drv-box (in case of a base
+ % phantom judgment)
+ % phm[i] phantom steps drv-box (in case of a base phantom
+ % judgment)
+ % r_plb[i] right phantom steps label drv-box (in case of a base
+ % phantom judgment)
+ %
+ numeric phm_idx, src[], tgt[], phm_sty[];
+ phm_idx:=0;
+ drv_box "l_plb[]", "phm[]", "r_plb[]";
+ %
+ % Proof pictures
+ %
+ % jdg_prf[i] judgment index drv-box
+ % sbj_prf[i][j] sub-judgment index drv-box (j ranges from 0 to
+ % sbj_num[i]-1)
+ %
+ drv_box "jdg_prf[]", "sbj_prf[][]";
+ %
+ % Info
+ %
+ write char(10)&"% fig. "&(decimal charcode)&char(10) to delayed_tex_file;
+ drv_inside_fig:=true; % context: inside a figure
+enddef;
+
+extra_beginfig:=extra_beginfig&"drv_beginfig;";
+
+%
+% drv_endfig: proof-file generation
+%
+
+string proof_file;
+proof_file:=jobname&"-proof.tex";
+
+% TODO: taking outputtemplate into account.
+vardef output_file[]=
+ jobname&"."&(decimal @)
+enddef;
+
+string buf_str;
+buf_str:=
+ "%"&char(10)&
+ "% AUTOMATICALLY GENERATED BY DRV.MP."&char(10)&
+ "%"&char(10)&char(10)&
+ tex_preamble_str[0]&
+ "\usepackage{graphicx}"&char(10)&
+ "\makeatletter"&char(10)&
+ "\def\Gin@def@bp#1\relax#2#3{\gdef#2{#3}}"&char(10)&
+ "\newsavebox{\graphicsbox}"&char(10)&
+ "\newcommand*{\drv}[1]{%"&char(10)&
+ "\sbox{\graphicsbox}{\includegraphics{#1}}%"&char(10)&
+ "\raisebox{\Gin@lly bp}%"&char(10)&
+ "{\usebox{\graphicsbox}}}"&char(10)&
+ "\makeatother"&char(10)&char(10)&
+ "\newcount\h"&char(10)&
+ "\newcount\m"&char(10)&
+ "\h=\time"&char(10)&
+ "\divide\h 60"&char(10)&
+ "\m=-\h"&char(10)&
+ "\multiply\m 60"&char(10)&
+ "\advance\m\time"&char(10)&
+ "\def\hm{\number\h:\ifnum\m<10{}0\fi\number\m}"&char(10)&char(10)&
+ "\newcommand{\mathaxis}{\frac{\quad}{}}"&char(10)&char(10)&
+ "\begin{document}"&char(10)&
+ tex_preamble_str[1]&
+ "\noindent\today\ at \hm\medskip"&char(10)&char(10)&"\noindent";
+
+vardef drv_endfig=
+ drv_inside_fig:=false; % context: outside a figure
+ buf_str:=buf_str&char(10)&
+ "\texttt{"&output_file[charcode]&"}"&char(10)&
+ " (\verb+"&drv_fontsize&"+, \verb+"&(mth_sty_str[drv_sty])&"+)"&char(10)&
+ " {"&drv_fontsize&char(10)&
+ " \["&(mth_sty_str[drv_sty])&char(10)&
+ " \mathaxis\drv{"&output_file[charcode]&"}\mathaxis"&char(10)&
+ " \]}\\";
+ write EOF to proof_file; % erases the previous content
+ write buf_str&char(10)&"\end{document}" to proof_file;
+ write EOF to proof_file;
+ if drv_nullpicture:
+ draw btex{\tt drv}: run {\tt mpost} again.etex withcolor (1, 0, 0);
+ fi
+enddef;
+
+extra_endfig:="drv_endfig;"&extra_endfig;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Judgment declarations
+%
+
+vardef jgm[] text SUB=
+ % @: judgment index
+ % SUB: list of `sub-judgments' (pictures or strings)
+ if @<0:
+ drv_errhelp "An judgment index can not be negative.";
+ drv_errmessage (decimal @)&" is negative";
+ elseif known jdg[@]:
+ drv_errhelp "An index can be used only once to declare a judgment.";
+ drv_errmessage (decimal @)&" has been used already as a judgment index";
+ else:
+ save jdg_pct, sbj_pct, jdg_wd, sbj_rnk;
+ picture jdg_pct, sbj_pct;
+ numeric jdg_wd, sbj_rnk;
+ jdg_pct:=nullpicture;
+ jdg_wd:=0;
+ sbj_rnk:=0;
+ for sub=SUB:
+ sbj_pct:=
+ if picture sub:
+ sub
+ elseif sub<>"":
+ mth_tex[jdg_sty[drv_sty]] sub
+ else:
+ nullpicture
+ fi;
+ box_init sbj[@][sbj_rnk] (sbj_pct);
+ if sbj_rnk>0:
+ sbj[@][sbj_rnk-1].r=sbj[@][sbj_rnk].l;
+ fi
+ addto jdg_pct also sbj_pct shifted (jdg_wd, 0);
+ jdg_wd:=width jdg_pct;
+ sbj_rnk:=sbj_rnk+1;
+ endfor
+ sbj_num[@]:=sbj_rnk;
+ box_init jdg[@] (jdg_pct);
+ if sbj_num[@]>0:
+ jdg[@].l=sbj[@][0].l;
+ jdg[@].r=sbj[@][sbj_num[@]-1].r;
+ fi
+ fi
+enddef;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Inference declarations
+%
+
+vardef check_junction_style (suffix sty_sfx) (expr default)=
+ save sty_str;
+ string sty_str;
+ sty_str:=str sty_sfx;
+ if (sty_str="0")
+ or (sty_str="1")
+ or (sty_str="2")
+ or (sty_str="3"):
+ sty_sfx
+ elseif (sty_str="_"):
+ default
+ else:
+ begingroup
+ drv_errhelp "Valid identifiers are"&
+ " 0 (fully-interlacing),"&
+ " 1 (semi-interlacing),"&
+ " 2 (non-interlacing),"&
+ " 3 (user specified) and"&
+ " _ (default).";
+ drv_errmessage sty_str&" is not a valid junction style identifier";
+ default
+ endgroup
+ fi
+enddef;
+
+vardef check_alignment_style (suffix sty_sfx) (expr default)=
+ save sty_str;
+ string sty_str;
+ sty_str:=str sty_sfx;
+ if (sty_str="l")
+ or (sty_str="c")
+ or (sty_str="r")
+ or (sty_str="u"):
+ sty_str
+ elseif (sty_str="_"):
+ default
+ else:
+ begingroup
+ drv_errhelp "Valid identifiers are"&
+ " l (none),"&
+ " c (simple),"&
+ " r (double),"&
+ " u (dotted) and"&
+ " _ (default).";
+ drv_errmessage sty_str&" is not a valid alignment style identifier";
+ default
+ endgroup
+ fi
+enddef;
+
+vardef check_path_style (suffix sty_sfx) (expr default)=
+ save sty_str;
+ string sty_str;
+ sty_str:=str sty_sfx;
+ if (sty_str="0")
+ or (sty_str="1")
+ or (sty_str="2")
+ or (sty_str="3")
+ or (sty_str="4")
+ or (sty_str="5")
+ or (sty_str="6"):
+ sty_sfx
+ elseif (sty_str="_"):
+ default
+ else:
+ begingroup
+ drv_errhelp "Valid identifiers are"&
+ " 0 (none),"&
+ " 1 (simple),"&
+ " 2 (double),"&
+ " 3 (dotted),"&
+ " 4 (dashed),"&
+ " 5 (waved),"&
+ " 6 (TeX-dotted) and"&
+ " _ (default).";
+ drv_errmessage sty_str&" is not a valid path style identifier";
+ default
+ endgroup
+ fi
+enddef;
+
+vardef opt_init[] @# expr arg=
+ if picture arg:
+ if arg<>nullpicture:
+ box_init @# (arg);
+ fi
+ elseif arg<>"":
+ box_init @# (mth_tex[@] arg);
+ fi
+enddef;
+
+vardef NFR[] (text PRM) (expr lilb, rilb, ldlb, rdlb)
+ (suffix j_sty, a_sty, i_sty)=
+ %
+ % @: inference index
+ %
+ if known prm_num[@]:
+ drv_errhelp "An index can be used only once to declare an inference.";
+ drv_errmessage (decimal @)&" has been used already as an inference index";
+ else:
+ %
+ % PRM: list of premise indices
+ %
+ save prm_rnk;
+ numeric prm_rnk;
+ prm_rnk:=0;
+ for prm_idx=PRM:
+ if prm_idx=@:
+ drv_errhelp "An inference index can not be used"&
+ " as one of its own premise indices.";
+ drv_errmessage "the inference index "&(decimal prm_idx)&
+ " is used as one of its own premise indices";
+ elseif known ccl[prm_idx]:
+ drv_errhelp "An index can be used only once as a premise index.";
+ drv_errmessage (decimal prm_idx)&" has been used already as a"&
+ " premise index for inference declaration "&(decimal ccl[prm_idx]);
+ else:
+ if known prm_num[prm_idx]:
+ %
+ % roots list update
+ %
+ save root_idx;
+ numeric root_idx;
+ root_idx:=0;
+ forever:
+ exitif root[root_idx]=prm_idx;
+ root_idx:=root_idx+1;
+ endfor
+ forever:
+ exitif root_idx=root_num-1;
+ root[root_idx]:=root[root_idx+1];
+ root_idx:=root_idx+1;
+ endfor
+ root_num:=root_num-1;
+ fi
+ ccl[prm_idx]:=@;
+ prm[@][prm_rnk]:=prm_idx;
+ prm_rnk:=prm_rnk+1;
+ fi
+ endfor
+ prm_num[@]:=prm_rnk;
+ if known ccl[@]:
+ %
+ % cycle detection
+ %
+ save ccl_idx, ccl_str;
+ numeric ccl_idx;
+ string ccl_str;
+ ccl_idx:=@;
+ ccl_str:=decimal ccl_idx;
+ forever:
+ ccl_idx:=ccl[ccl_idx];
+ if ccl_idx>=0:
+ ccl_str:=(decimal ccl_idx)&", "&ccl_str;
+ fi
+ exitif (unknown ccl[ccl_idx]) or (ccl_idx=@);
+ endfor
+ if ccl_idx=@:
+ drv_errhelp "Inferences declarations can not be cyclic.";
+ drv_errmessage "inference declaration "&(decimal @)&" creates a"&
+ " cycle of inferences (indices "&ccl_str&" from conclusions to"&
+ " premises)";
+ fi
+ else:
+ root[root_num]:=@;
+ root_num:=root_num+1;
+ fi
+ %
+ % lilb, rilb: inference labels
+ %
+ opt_init[ilb_sty[drv_sty]] l_ilb[@] lilb;
+ opt_init[ilb_sty[drv_sty]] r_ilb[@] rilb;
+ %
+ % ldlb, rdlb: delimiter labels
+ %
+ opt_init[dlb_sty[drv_sty]] l_dlb[@] ldlb;
+ opt_init[dlb_sty[drv_sty]] r_dlb[@] rdlb;
+ %
+ % j_sty, a_sty and i_sty: junction, alignment and inference styles
+ %
+ jct_sty[@]:=check_junction_style (j_sty, drv_jct_sty);
+ alg_sty[@]:=check_alignment_style (a_sty, drv_alg_sty);
+ iln_sty[@]:=check_path_style (i_sty, drv_iln_sty);
+ if drv_boxmode_on:
+ boxed[@]:=true;
+ fi
+ fi
+enddef;
+
+vardef DCL[] (text PRM) (expr lilb, rilb, ldlb, rdlb)
+ (suffix j_sty, a_sty, i_sty) text SUB=
+ NFR[@] (PRM) (lilb, rilb, ldlb, rdlb, j_sty, a_sty, i_sty);
+ jgm[@] SUB;
+enddef;
+
+vardef MVD[] (expr inf_num, lplb, rplb) (suffix a_sty, p_sty)=
+ if inf_num<1:
+ drv_errhelp "The minimal value is 1.";
+ drv_errmessage (decimal inf_num)&" is not a valid number of inference"&
+ " steps";
+ else:
+ save aux_idx, aux_sty, phm_jdg;
+ numeric aux_idx, aux_sty;
+ picture phm_jdg;
+ aux_sty:=check_path_style (p_sty, drv_phm_sty);
+ phm_jdg:=nullpicture;
+ setbounds phm_jdg to (0, 0)--(iln_hg[aux_sty]-iln_dp[aux_sty], 0)--cycle;
+ aux_idx:=@;
+ for i=1 upto inf_num:
+ phm_idx:=phm_idx-1;
+ box_init jdg[phm_idx] (phm_jdg);
+ sbj_num[phm_idx]:=0;
+ NFR[phm_idx] (aux_idx) ("", "", "", "", 0, a_sty, 0);
+ aux_idx:=phm_idx;
+ endfor
+ src[@]:=phm_idx;
+ tgt[phm_idx]:=@;
+ phm_sty[phm_idx]:=aux_sty;
+ %
+ % lplb, rplb: phantom steps labels
+ %
+ opt_init[plb_sty[drv_sty]] l_plb[phm_idx] lplb;
+ opt_init[plb_sty[drv_sty]] r_plb[phm_idx] rplb;
+ phm_idx
+ fi
+enddef;
+
+vardef bxd[]=
+ boxed[@]:=true;
+ @
+enddef;
+
+%
+% Optional labels & shorthands
+%
+
+numeric drv_jct_sty; % default junction style
+string drv_alg_sty; % default junction style
+numeric drv_iln_sty; % default inference line path-style
+numeric drv_phm_sty; % default phantom steps path-style
+
+boolean drv_left_ilb; % inference labels on the left
+boolean drv_left_dlb; % delimiter labels (hence delimiters) on the left
+boolean drv_left_plb; % phantom steps labels on the left
+
+vardef arg_type expr arg=
+ if picture arg:
+ "picture"
+ else:
+ "string"
+ fi
+enddef;
+
+vardef opt_lbls @# (text LBL) expr left_lbls=
+ save lbl_num, fst_lbl, snd_lbl;
+ numeric lbl_num;
+ lbl_num:=0;
+ for lbl=LBL:
+ if lbl_num=0:
+ scantokens (arg_type lbl) fst_lbl;
+ fst_lbl:=lbl;
+ elseif lbl_num=1:
+ scantokens (arg_type lbl) snd_lbl;
+ snd_lbl:=lbl;
+ else:
+ drv_errhelp "At most two labels can be specified:"&
+ " a left one and a right one.";
+ drv_errmessage "more than two labels have been specified";
+ fi
+ lbl_num:=lbl_num+1;
+ endfor
+ if lbl_num=0:
+ string @#.l;
+ string @#.r;
+ @#.l:="";
+ @#.r:="";
+ elseif lbl_num=1:
+ if left_lbls:
+ scantokens (arg_type fst_lbl) @#.l;
+ string @#.r;
+ @#.l:=fst_lbl;
+ @#.r:="";
+ else:
+ string @#.l;
+ scantokens (arg_type fst_lbl) @#.r;
+ @#.l:="";
+ @#.r:=fst_lbl;
+ fi
+ else:
+ scantokens (arg_type fst_lbl) @#.l;
+ scantokens (arg_type snd_lbl) @#.r;
+ @#.l:=fst_lbl;
+ @#.r:=snd_lbl;
+ fi
+enddef;
+
+vardef NFR_opt[] (text PRM) (text ILB) (text DLB)
+ (suffix j_sty, a_sty, i_sty)=
+ opt_lbls ilb (ILB) drv_left_ilb;
+ opt_lbls dlb (DLB) drv_left_dlb;
+ NFR[@] (PRM) (ilb.l, ilb.r, dlb.l, dlb.r, j_sty, a_sty, i_sty);
+enddef;
+
+vardef DCL_opt[] (text PRM) (text ILB) (text DLB)
+ (suffix j_sty, a_sty, i_sty) text SUB=
+ NFR_opt[@] (PRM) (ILB) (DLB) (j_sty, a_sty, i_sty);
+ jgm[@] SUB;
+enddef;
+
+vardef MVD_opt[] (expr inf_num) (text PLB) (suffix a_sty, p_sty)=
+ opt_lbls plb (PLB) drv_left_plb;
+ MVD[@] (inf_num, plb.l, plb.r, a_sty, p_sty)
+enddef;
+
+% Nfr, Dcl & Mvd
+
+vardef Nfr[] (text PRM) (expr ilb, ldlb, rdlb) (suffix i_sty)=
+ NFR_opt[@] (PRM) (ilb) (ldlb, rdlb) (_, _, i_sty);
+enddef;
+
+vardef Dcl[] (text PRM) (expr ilb, ldlb, rdlb) (suffix i_sty) text SUB=
+ Nfr[@] (PRM) (ilb, ldlb, rdlb, i_sty);
+ jgm[@] SUB;
+enddef;
+
+vardef Mvd[] (expr inf_num, lplb, rplb) (suffix p_sty)=
+ MVD[@] (inf_num, lplb, rplb, _, p_sty)
+enddef;
+
+% nfr, dcl & mvd
+
+vardef nfr[] (text PRM) (expr ilb) (suffix i_sty)=
+ NFR_opt[@] (PRM) (ilb) () (_, _, i_sty);
+enddef;
+
+vardef dcl[] (text PRM) (expr ilb) (suffix i_sty) text SUB=
+ nfr[@] (PRM) (ilb, i_sty);
+ jgm[@] SUB;
+enddef;
+
+vardef mvd[] (expr inf_num) (suffix p_sty)=
+ MVD_opt[@] (inf_num) () (_, p_sty)
+enddef;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Pictured paths
+%
+
+vardef dotted_aux (expr pth, dot_wd, dots_dist)=
+ save pth_len, pct;
+ numeric pth_len;
+ picture pct;
+ pth_len:=arclength pth;
+ pct:=nullpicture;
+ if dots_dist>0:
+ stp_num:=round ((pth_len-dot_wd)/dots_dist);
+ if stp_num>0:
+ stp_len:=(pth_len-dot_wd)/stp_num;
+ addto pct doublepath pth dashed dashpattern (on 0 off stp_len)
+ shifted (dot_wd/2, 0) withpen pencircle scaled dot_wd;
+ fi
+ fi
+ pct
+enddef;
+
+primarydef pth dotted wd_dist=
+ dotted_aux(pth, xpart wd_dist, ypart wd_dist)
+enddef;
+
+vardef expanded_aux (expr pth, scl, dir, stp_len)=
+ save pth_len, aux_len;
+ numeric pth_len, aux_len;
+ pth_len:=arclength pth;
+ if (stp_len>0) and (pth_len>stp_len):
+ aux_len:=pth_len/(pth_len div stp_len);
+ point arctime 0 of pth of pth shifted
+ (unitvector direction arctime 0 of pth of pth
+ rotated dir scaled scl)..
+ {direction arctime 0 of pth of pth}
+ for i=aux_len step aux_len until pth_len-aux_len:
+ point arctime i of pth of pth shifted
+ (unitvector direction arctime i of pth of pth
+ rotated dir scaled scl)
+ {direction arctime i of pth of pth}..
+ endfor
+ point arctime pth_len of pth of pth shifted
+ (unitvector direction arctime pth_len of pth of pth
+ rotated dir scaled scl)
+ {direction arctime pth_len of pth of pth}
+ else:
+ pth
+ fi
+enddef;
+
+primarydef pth expanded scl_dir_len=
+ expanded_aux (pth,
+ redpart scl_dir_len, greenpart scl_dir_len, bluepart scl_dir_len)
+enddef;
+
+vardef waved_aux (expr pth, amp)=
+ save pth_len, mid;
+ numeric pth_len, mid;
+ pth_len:=arclength pth;
+ if (amp>0) and (pth_len>2(1+sqrt 5)*amp):
+ mid:=pth_len/(2(pth_len div (2(1+sqrt 5)*amp)));
+ point arctime 0 of pth of pth shifted
+ (unitvector direction arctime 0 of pth of pth
+ rotated -90 scaled amp)
+ {direction arctime 0 of pth of pth}
+ for i=mid step 2mid until pth_len:
+ ..point arctime i of pth of pth shifted
+ (unitvector direction arctime i of pth of pth
+ rotated 90 scaled amp)
+ {direction arctime i of pth of pth}
+ ..point arctime i+mid of pth of pth shifted
+ (unitvector direction arctime i+mid of pth of pth
+ rotated -90 scaled amp)
+ {direction arctime i+mid of pth of pth}
+ endfor
+ else:
+ pth
+ fi
+enddef;
+
+primarydef pth waved amp=
+ waved_aux(pth, amp)
+enddef;
+
+vardef drv_styled_aux[] expr pth=
+ save sty_idx, pth_len, pct;
+ numeric sty_idx, pth_len;
+ picture pct;
+ sty_idx:=check_path_style (@, 1);
+ pth_len:=arclength pth;
+ pct:=nullpicture;
+ if sty_idx=1:
+ interim linecap:=butt;
+ addto pct doublepath pth withpen drv_pen;
+ elseif sty_idx=2:
+ interim linecap:=butt;
+ addto pct doublepath pth
+ expanded (1.25rul_thk[drv_sty], 90, rul_thk[drv_sty])
+ withpen drv_pen;
+ addto pct doublepath pth
+ expanded (1.25rul_thk[drv_sty], -90, rul_thk[drv_sty])
+ withpen drv_pen;
+ elseif sty_idx=3:
+ addto pct also pth dotted (rul_thk[drv_sty], 2rul_thk[drv_sty]);
+ elseif sty_idx=4:
+ if rul_thk[drv_sty]>0:
+ interim linecap:=butt;
+ save dsh_num, dsh_len;
+ numeric dsh_num, dsh_len;
+ dsh_num:=round(pth_len/(3rul_thk[drv_sty]));
+ dsh_len:=
+ if odd dsh_num:
+ pth_len/dsh_num
+ else:
+ pth_len/(dsh_num+1)
+ fi;
+ addto pct doublepath pth dashed dashpattern(on dsh_len off dsh_len)
+ withpen drv_pen;
+ fi
+ elseif sty_idx=5:
+ interim linecap:=butt;
+ addto pct doublepath pth
+ waved 1.25rul_thk[drv_sty] withpen drv_pen;
+ elseif (sty_idx=6) and (pth_len>0):
+ addto pct also pth dotted (pdt_hg[drv_sty], pdt_wd[drv_sty]);
+ fi
+ pct
+enddef;
+
+primarydef pth drv_styled sty=
+ drv_styled_aux[sty] pth
+enddef;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Delimiters
+%
+
+%
+% 1. Global parameters
+%
+
+string drv_l_dlm; % left delimiter LaTeX code
+string drv_r_dlm; % right delimiter LaTeX code
+
+%
+% 2. Macros
+%
+
+vardef minmax_y[]=(
+ if drv_bot_roots:
+ if known ccl[@]:
+ ypart jdg[@].c-num_hg+iln_hg[(iln_sty[ccl[@]])]
+ +min_clr_scl*min_clr[drv_sty]/2
+ else:
+ smin_y[@]-min_clr_scl*min_clr[drv_sty]
+ fi,
+ smax_y[@]+min_clr_scl*min_clr[drv_sty]
+ else:
+ smin_y[@]-min_clr_scl*min_clr[drv_sty],
+ if known ccl[@]:
+ ypart jdg[@].c-den_dp-iln_hg[(iln_sty[ccl[@]])]
+ -min_clr_scl*min_clr[drv_sty]/2
+ else:
+ smax_y[@]+min_clr_scl*min_clr[drv_sty]
+ fi
+ fi)
+enddef;
+
+vardef delim @# expr dlm_len=
+ save rule_str, dlm_str, dlm_pct, dlm_dp;
+ string rule_str, dlm_str;
+ picture dlm_pct;
+ numeric dlm_dp;
+ rule_str:="\rule{0bp}{"&(decimal(dlm_len/2+axis_hg[drv_sty]))&"bp}";
+ dlm_str:=
+ if str @#="l":
+ "\left"&drv_l_dlm&rule_str&"\right."
+ else:
+ "\left."&rule_str&"\right"&drv_r_dlm
+ fi;
+ dlm_pct:=mth_tex[drv_sty] dlm_str;
+ dlm_dp:=depth dlm_pct;
+ if dlm_dp=0:
+ nullpicture
+ else:
+ begingroup
+ setbounds dlm_pct to
+ (xpart llcorner dlm_pct, dlm_dp)
+ --(xpart ulcorner dlm_pct, -dlm_dp)
+ --(xpart urcorner dlm_pct, -dlm_dp)
+ --(xpart lrcorner dlm_pct, dlm_dp)
+ --cycle;
+ dlm_pct yscaled (dlm_len/(2*height dlm_pct))
+ endgroup
+ fi
+enddef;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Checking, building, freezing (very inefficient, to be improved)
+%
+
+%
+% 1. Global parameters
+%
+
+numeric min_clr_scl; %
+numeric prm_skp_scl; %
+numeric jdg_skp_scl; %
+numeric ilb_skp_scl; %
+numeric plb_skp_scl; %
+
+boolean drv_bot_roots; %
+boolean drv_boxmode_on; %
+boolean drv_fractionmode_on; %
+string drv_axis_ref; %
+
+%
+% 2. Macros
+%
+
+%
+% Checking
+%
+
+vardef fraction_inference[]=
+ (prm_num[@]=0)
+ and (iln_sty[@]=0)
+ and (unknown l_ilb[@])
+ and (unknown r_ilb[@])
+ and drv_fractionmode_on
+enddef;
+
+vardef drv_check_root[]=
+ if unknown jdg[@]:
+ drv_errhelp "An index must be used to declare a both a judgment and an"&
+ " inference.";
+ drv_errmessage (decimal @)&" has been used as an inference index but not"&
+ " as a judgment index";
+ elseif unknown prm_num[@]:
+ drv_errhelp "An index must be used to declare a both a judgment and an"&
+ " inference.";
+ drv_errmessage (decimal @)&" has been used as a judgment index but not"&
+ " as an inference index";
+ else:
+ save i_sty, prm_idx;
+ numeric i_sty, prm_idx;
+ i_sty:=iln_sty[@];
+ for prm_rnk=0 upto prm_num[@]-1:
+ prm_idx:=prm[@][prm_rnk];
+ drv_check_root[prm_idx];
+ %
+ % numerators and denominators clearances
+ % The TEXbook, Appendix G, Rule 15d.
+ %
+ if drv_bot_roots:
+ num_hg:=max(num_hg,
+ iln_hg[i_sty]+min_clr_scl*min_clr[drv_sty]-jdg[prm_idx].dp);
+ else:
+ den_dp:=min(den_dp,
+ iln_dp[i_sty]-min_clr_scl*min_clr[drv_sty]-jdg[prm_idx].hg);
+ fi
+ endfor
+ if not fraction_inference[@]:
+ if drv_bot_roots:
+ den_dp:=min(den_dp,
+ iln_dp[i_sty]-min_clr_scl*min_clr[drv_sty]-jdg[@].hg);
+ else:
+ num_hg:=max(num_hg,
+ iln_hg[i_sty]+min_clr_scl*min_clr[drv_sty]-jdg[@].dp);
+ fi
+ fi
+ if unknown boxed[@]:
+ boxed[@]:=false;
+ fi
+ fi
+enddef;
+
+vardef drv_check=
+ if root_num=0:
+ drv_errhelp "Well ...";
+ drv_errmessage "no inference has been declared";
+ else:
+ save root_idx;
+ numeric root_idx;
+ root_idx:=root[0];
+ drv_check_root[root_idx];
+ if root_num>1:
+ save root_str;
+ string root_str;
+ root_str:=decimal root_idx;
+ for idx=1 upto root_num-1:
+ root_idx:=root[idx];
+ drv_check_root[root_idx];
+ root_str:=root_str&", "&(decimal root_idx);
+ endfor
+ drv_message "warning, multiple root indices ("&root_str&").";
+ fi
+ fi
+ drv_checked:=true;
+enddef;
+
+%
+% Building
+%
+
+vardef drv_build_root[]=
+ %
+ % premises junction (from left to right)
+ %
+ for prm_rnk=0 upto prm_num[@]-1:
+ drv_build_root[prm[@][prm_rnk]];
+ if prm_rnk>0:
+ save ll_idx, lr_idx, rl_idx, rr_idx;
+ save lmax_x, rmin_x, min_skp;
+ numeric ll_idx, lr_idx, rl_idx, rr_idx;
+ numeric lmax_x, rmin_x, min_skp;
+ ypart jdg[prm[@][prm_rnk-1]].c=ypart jdg[prm[@][prm_rnk]].c;
+ ll_idx:=prm[@][0];
+ lr_idx:=prm[@][prm_rnk-1];
+ rl_idx:=prm[@][prm_rnk];
+ rr_idx:=prm[@][prm_rnk];
+ lmax_x:=imax_x[lr_idx];
+ rmin_x:=imin_x[rl_idx];
+ min_skp[0]:=rmin_x-lmax_x;
+ forever:
+ exitif (unknown r_prm[lr_idx]) or (unknown l_prm[rl_idx]);
+ ll_idx:=l_prm[ll_idx];
+ lr_idx:=r_prm[lr_idx];
+ rl_idx:=l_prm[rl_idx];
+ rr_idx:=r_prm[rr_idx];
+ lmax_x:=max(lmax_x, imax_x[lr_idx]);
+ rmin_x:=min(rmin_x, imin_x[rl_idx]);
+ min_skp[0]:=min(min_skp[0], imin_x[rl_idx]-imax_x[lr_idx]);
+ endfor
+ min_skp[1]:=rmin_x-lmax_x;
+ if known r_prm[lr_idx]:
+ r_prm[rr_idx]:= r_prm[lr_idx];
+ lmax_x:=smax_x[lr_idx];
+ elseif known l_prm[rl_idx]:
+ l_prm[ll_idx]:=l_prm[rl_idx];
+ rmin_x:=smin_x[rl_idx];
+ fi
+ min_skp[2]:=rmin_x-lmax_x;
+ if jct_sty[@]<3:
+ min_skp[jct_sty[@]]=prm_skp_scl*prm_skp[drv_sty];
+ fi
+ fi
+ endfor
+ if prm_num[@]>0:
+ l_prm[@]:=prm[@][0];
+ r_prm[@]:=prm[@][prm_num[@]-1];
+ fi
+ %
+ % judgment alignment
+ %
+ if prm_num[@]=0:
+ imin_x[@]:=xpart jdg[@].l-jdg_skp_scl*jdg_skp[jdg_sty[drv_sty]];
+ imax_x[@]:=xpart jdg[@].r+jdg_skp_scl*jdg_skp[jdg_sty[drv_sty]];
+ else:
+ save l_xref, r_xref;
+ l_xref=
+ if boxed[prm[@][0]]:
+ smin_x[prm[@][0]]
+ else:
+ xpart jdg[prm[@][0]].l
+ fi;
+ r_xref=
+ if boxed[prm[@][prm_num[@]-1]]:
+ smax_x[prm[@][prm_num[@]-1]]
+ else:
+ xpart jdg[prm[@][prm_num[@]-1]].r
+ fi;
+ if alg_sty[@]="l":
+ xpart jdg[@].l=l_xref;
+ elseif alg_sty[@]="c":
+ xpart jdg[@].c=(l_xref+r_xref)/2;
+ elseif alg_sty[@]="r":
+ xpart jdg[@].r=r_xref;
+ fi
+ imin_x[@]:=min(xpart jdg[@].l, l_xref)
+ -jdg_skp_scl*jdg_skp[jdg_sty[drv_sty]];
+ imax_x[@]:=max(xpart jdg[@].r, r_xref)
+ +jdg_skp_scl*jdg_skp[jdg_sty[drv_sty]];
+ fi
+ %
+ % inference line
+ %
+ save iln_wd, iln_pct;
+ numeric iln_wd;
+ picture iln_pct;
+ iln_wd:=imax_x[@]-imin_x[@];
+ iln_pct:=((0, 0)--(iln_wd, 0)) drv_styled iln_sty[@];
+ setbounds iln_pct to
+ (0, ypart llcorner iln_pct)
+ --(0, ypart ulcorner iln_pct)
+ --(iln_wd, ypart ulcorner iln_pct)
+ --(iln_wd, ypart llcorner iln_pct)
+ --cycle; % ! `linecap:=butt' and `linecap:=squared' -> same bounding box !
+ box_init iln[@] (iln_pct);
+ xpart iln[@].c=(imin_x[@]+imax_x[@])/2;
+ %
+ % orientation, smin_y & smax_y
+ %
+ if drv_bot_roots:
+ ypart iln[@].c=ypart jdg[@].c-den_dp;
+ smin_y[@]:=ypart jdg[@].c+jdg[@].dp;
+ smax_y[@]:=
+ if iln_sty[@]=0:
+ ypart jdg[@].c+jdg[@].hg
+ else:
+ ypart iln[@].c+iln[@].hg
+ fi;
+ if prm_num[@]>0:
+ ypart iln[@].c=ypart jdg[prm[@][0]].c-num_hg;
+ for prm_rnk=0 upto prm_num[@]-1:
+ smax_y[@]:=max(smax_y[@], smax_y[prm[@][prm_rnk]]);
+ endfor;
+ fi
+ else:
+ ypart iln[@].c=ypart jdg[@].c-num_hg;
+ smin_y[@]:=
+ if iln_sty[@]=0:
+ ypart jdg[@].c+jdg[@].dp
+ else:
+ ypart iln[@].c+iln[@].dp
+ fi;
+ smax_y[@]:=ypart jdg[@].c+jdg[@].hg;
+ if prm_num[@]>0:
+ ypart iln[@].c=ypart jdg[prm[@][0]].c-den_dp;
+ for prm_rnk=0 upto prm_num[@]-1:
+ smin_y[@]:=min(smin_y[@], smin_y[prm[@][prm_rnk]]);
+ endfor;
+ fi
+ fi
+ %
+ % inference labels
+ %
+ if known l_ilb[@]:
+ l_ilb[@].r=iln[@].l shifted (-ilb_skp_scl*ilb_skp[drv_sty], 0);
+ imin_x[@]:=xpart l_ilb[@].l;
+ smin_y[@]:=min(smin_y[@], ypart l_ilb[@].c+l_ilb[@].dp);
+ smax_y[@]:=max(smax_y[@], ypart l_ilb[@].c+l_ilb[@].hg);
+ fi
+ if known r_ilb[@]:
+ r_ilb[@].l=iln[@].r shifted (ilb_skp_scl*ilb_skp[drv_sty], 0);
+ imax_x[@]:=xpart r_ilb[@].r;
+ smin_y[@]:=min(smin_y[@], ypart r_ilb[@].c+r_ilb[@].dp);
+ smax_y[@]:=max(smax_y[@], ypart r_ilb[@].c+r_ilb[@].hg);
+ fi
+ %
+ % phantom steps
+ %
+ if known tgt[@]:
+ save phm_pth, phm_pct;
+ path phm_pth;
+ picture phm_pct;
+ save top_y, mid_y, bot_y;
+ numeric top_y, bot_y;
+ if drv_bot_roots:
+ bot_y:=xpart minmax_y[@]+min_clr_scl*min_clr[drv_sty]/2;
+ top_y:=xpart minmax_y[tgt[@]];
+ else:
+ bot_y:=ypart minmax_y[tgt[@]];
+ top_y:=ypart minmax_y[@]-min_clr_scl*min_clr[drv_sty]/2;
+ fi
+ mid_y:=(top_y+bot_y)/2;
+ phm_pth:=(0, (bot_y-top_y)/2)--(0, (top_y-bot_y)/2);
+ phm_pct:=phm_pth drv_styled phm_sty[@];
+ box_init phm[@] (phm_pct shifted ((width phm_pct)/2, 0));
+ phm[@].c=(xpart jdg[@].c, mid_y);
+ imin_x[@]:=min(imin_x[@], xpart phm[@].l);
+ imax_x[@]:=max(imax_x[@], xpart phm[@].r);
+ %
+ % phantom steps labels
+ %
+ if known l_plb[@]:
+ l_plb[@].r=phm[@].l shifted (-plb_skp[drv_sty], 0);
+ imin_x[@]:=min(imin_x[@], xpart l_plb[@].l);
+ fi
+ if known r_plb[@]:
+ r_plb[@].l=phm[@].r shifted ( plb_skp[drv_sty], 0);
+ imax_x[@]:=max(imax_x[@], xpart r_plb[@].r);
+ fi
+ fi
+ %
+ % smin_x & smax_x
+ %
+ smin_x[@]:=imin_x[@];
+ smax_x[@]:=imax_x[@];
+ for prm_rnk=0 upto prm_num[@]-1:
+ smin_x[@]:=min(smin_x[@], smin_x[prm[@][prm_rnk]]);
+ smax_x[@]:=max(smax_x[@], smax_x[prm[@][prm_rnk]]);
+ endfor
+ %
+ % delimiters
+ %
+ if known l_dlb[@] or known r_dlb[@]:
+ save idx, mmy, min_y, max_y;
+ numeric idx, min_y, max_y;
+ pair mmy;
+ mmy:=minmax_y[@];
+ min_y:=xpart mmy;
+ max_y:=ypart mmy;
+ if known l_dlb[@]:
+ box_init l_dlm[@] (delim l (max_y-min_y));
+ l_dlm[@].r=(smin_x[@], (max_y+min_y)/2);
+ l_dlb[@].r=l_dlm[@].l;
+ smin_x[@]:=xpart l_dlb[@].l;
+ fi
+ if known r_dlb[@]:
+ box_init r_dlm[@] (delim r (max_y-min_y));
+ r_dlm[@].l=(smax_x[@], (max_y+min_y)/2);
+ r_dlb[@].l=r_dlm[@].r;
+ smax_x[@]:=xpart r_dlb[@].r;
+ fi
+ fi
+ if (known l_dlb[@]) or boxed[@]:
+ idx:=@;
+ forever:
+ imin_x[idx]:=smin_x[@];
+ exitif unknown l_prm[idx];
+ idx:=l_prm[idx];
+ endfor
+ fi
+ if (known r_dlb[@]) or boxed[@]:
+ idx:=@;
+ forever:
+ imax_x[idx]:=smax_x[@];
+ exitif unknown r_prm[idx];
+ idx:=r_prm[idx];
+ endfor
+ fi
+enddef;
+
+vardef drv_build=
+ if not drv_checked:
+ drv_check;
+ fi
+ for idx=0 upto root_num-1:
+ drv_build_root[root[idx]];
+ endfor
+ drv_built:=true;
+enddef;
+
+%
+% Freezing
+%
+
+vardef drv_freeze_root[]=
+ for prm_rnk=0 upto prm_num[@]-1:
+ drv_freeze_root[prm[@][prm_rnk]];
+ endfor
+ for sbj_rnk=0 upto sbj_num[@]-1:
+ box_freeze sbj[@][sbj_rnk];
+ endfor
+ forsuffixes sfx=
+ iln, jdg, phm,
+ l_dlb, l_dlm, l_ilb, l_plb,
+ r_dlb, r_dlm, r_ilb, r_plb:
+ if known sfx[@]:
+ box_freeze sfx[@];
+ fi
+ endfor
+enddef;
+
+vardef drv_freeze=
+ if not drv_built:
+ drv_build;
+ fi
+ save root_idx;
+ numeric root_idx;
+ root_idx:=root[0];
+ if unknown iln[root_idx].c:
+ %
+ % default math axis
+ %
+ if drv_axis_ref="iln":
+ iln[root_idx].c=(0, axis_hg[drv_sty]);
+ else: % drv_axis_ref="jdg"
+ jdg[root_idx].c=(0, axis_hg[drv_sty]);
+ fi
+ drv_freeze_root[root_idx];
+ fi
+ for idx=1 upto root_num-1:
+ root_idx:=root[idx];
+ if unknown iln[root_idx].c:
+ smin_x[root_idx]=smax_x[root[idx-1]]+prm_skp_scl*prm_skp[drv_sty];
+ ypart iln[root_idx].c=ypart iln[root[idx-1]].c;
+ fi
+ drv_freeze_root[root_idx];
+ endfor
+ drv_frozen:=true;
+enddef;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Derivation tree pictures
+%
+
+%
+% 1. Global parameters
+%
+
+boolean drv_proofmode_on; %
+color prf_clr; %
+color jdg_clr; %
+color sbj_clr; %
+
+prf_clr:=.75background; % arbitrary
+jdg_clr:=red; % arbitrary
+sbj_clr:=blue; % arbitrary
+
+%
+% 2. Macros
+%
+
+vardef drv_tree_addto @# (expr idx) text draw_options=
+ for prm_rnk=0 upto prm_num[idx]-1:
+ drv_tree_addto @# (prm[idx][prm_rnk]) draw_options;
+ endfor
+ forsuffixes sfx=
+ jdg, phm,
+ l_dlb, l_dlm, l_ilb, l_plb,
+ r_dlb, r_dlm, r_ilb, r_plb:
+ if known sfx[idx]:
+ addto @# also sfx[idx] draw_options;
+ fi
+ endfor
+ if iln_sty[idx]>0:
+ addto @# also iln[idx] draw_options;
+ fi
+enddef;
+
+vardef tt_nat[] expr nat= % typewriter typeface naturals
+ save nat_aux, nat_pct_wd, dgt_num, nat_pct;
+ numeric nat_aux, nat_pct_wd, dgt_num;
+ picture nat_pct;
+ nat_aux:=abs nat;
+ nat_pct:=nullpicture;
+ nat_pct_wd:=0;
+ dgt_num:=1;
+ forever:
+ exitif nat_aux div (10**dgt_num)=0;
+ dgt_num:=dgt_num+1;
+ endfor
+ for rnk:=1 upto dgt_num:
+ addto nat_pct also tt_dgt[@][nat_aux div (10**(dgt_num-rnk))]
+ shifted (nat_pct_wd, 0);
+ nat_pct_wd:=width nat_pct;
+ nat_aux:=nat_aux mod (10**(dgt_num-rnk));
+ endfor
+ nat_pct shifted (0, -axis_hg[@])
+enddef;
+
+vardef prf_tree_addto @# expr idx=
+ for prm_rnk=0 upto prm_num[idx]-1:
+ prf_tree_addto @# (prm[idx][prm_rnk]);
+ endfor
+ if idx>=0:
+ box_init jdg_prf[idx] (tt_nat[2] idx);
+ jdg_prf[idx].r=jdg[idx].l;
+ box_freeze jdg_prf[idx];
+ addto @# also jdg_prf[idx] withcolor jdg_clr;
+ addto @# doublepath jdg[idx].c withcolor jdg_clr
+ withpen pencircle scaled (2*pdt_hg[drv_sty]);
+ fi
+ for sbj_rnk=0 upto sbj_num[idx]-1:
+ box_init sbj_prf[idx][sbj_rnk] (tt_nat[3] sbj_rnk);
+ if odd sbj_rnk:
+ sbj_prf[idx][sbj_rnk].c shifted (0, sbj_prf[idx][sbj_rnk].hg)=
+ sbj[idx][sbj_rnk].c
+ shifted (0, -den_dp-min_clr_scl*min_clr[drv_sty]/2);
+ else:
+ sbj_prf[idx][sbj_rnk].c shifted (0, sbj_prf[idx][sbj_rnk].dp)=
+ sbj[idx][sbj_rnk].c
+ shifted (0, -num_hg+min_clr_scl*min_clr[drv_sty]/2);
+ fi
+ box_freeze sbj_prf[idx][sbj_rnk];
+ addto @# also sbj_prf[idx][sbj_rnk] withcolor sbj_clr;
+ addto @# doublepath sbj[idx][sbj_rnk].c withcolor sbj_clr
+ withpen pencircle scaled pdt_hg[drv_sty];
+ endfor
+enddef;
+
+vardef drv_tree=
+ save pct;
+ picture pct;
+ pct:=nullpicture;
+ if not drv_frozen:
+ drv_freeze;
+ fi
+ for root_idx=0 upto root_num-1:
+ if drv_proofmode_on:
+ drv_tree_addto pct (root[root_idx]) withcolor prf_clr;
+ prf_tree_addto pct (root[root_idx]);
+ else:
+ drv_tree_addto pct (root[root_idx]);
+ fi
+ endfor
+ pct
+enddef;
+
+vardef drv_bbox[]=
+ save min_x, max_x, mmy, min_y, max_y;
+ pair mmy;
+ numeric min_x, max_x, max_y, min_y;
+ if not drv_frozen:
+ drv_freeze;
+ fi
+ min_x:=
+ if known l_dlm[@].r:
+ xpart l_dlm[@].r
+ else:
+ smin_x[@]
+ fi-jdg_skp_scl*jdg_skp[jdg_sty[drv_sty]];
+ max_x:=
+ if known r_dlm[@].l:
+ xpart l_dlm[@].l
+ else:
+ smax_x[@]
+ fi+jdg_skp_scl*jdg_skp[jdg_sty[drv_sty]];
+ mmy:=minmax_y[@];
+ min_y:=xpart mmy;
+ max_y:=ypart mmy;
+ (min_x, min_y)--
+ (min_x, max_y)--
+ (max_x, max_y)--
+ (max_x, min_y)--
+ cycle
+enddef;
+
+vardef mth_axis @# (suffix ref_sfx) (expr idx)=
+ if not drv_frozen:
+ drv_freeze;
+ fi
+ if unknown prm_num[idx]:
+ drv_errhelp "An index must be used to declare an inference before it is"&
+ " used to set the math axis of a picture.";
+ drv_errmessage "no inference has been declared using index "&(decimal idx);
+ else:
+ save ref_str, yref;
+ string ref_str;
+ numeric yref;
+ ref_str:=str ref_sfx;
+ if ref_str="iln":
+ yref:=ypart iln[idx].c;
+ elseif ref_str="jdg":
+ yref:=ypart jdg[idx].c;
+ elseif ref_str="dlm":
+ if known l_dlm[idx]:
+ yref:=ypart l_dlm[idx].c;
+ elseif known r_dlm[idx]:
+ yref:=ypart r_dlm[idx].c;
+ else:
+ drv_errhelp "Well ...";
+ drv_errmessage "no delimiter is attached to inference "&(decimal idx);
+ fi
+ else:
+ drv_errhelp "Valid identifiers are"&
+ " iln (inference line axis),"&
+ " jdg (judgment math-axis) and"&
+ " dlm (delimiter axis).";
+ drv_errmessage (ref_str&" is not a valid reference type identifier");
+ fi
+ if known yref:
+ @#:=@# shifted (0, axis_hg[drv_sty]-yref);
+ fi
+ fi
+enddef;
+
+vardef drv_axis (suffix ref) (expr idx)=
+ mth_axis currentpicture (ref, idx);
+enddef;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Tunings
+%
+
+vardef check_math_style (expr sty_str, default)=
+ if sty_str="\displaystyle":
+ 0
+ elseif sty_str="\textstyle":
+ 1
+ elseif sty_str="\scriptstyle":
+ 2
+ elseif sty_str="\scriptscriptstyle":
+ 3
+ else:
+ begingroup
+ drv_errhelp "Valid commands are"&
+ " \displaystyle,"&
+ " \textstyle,"&
+ " \scriptstyle and"&
+ " \scriptscriptstyle.";
+ drv_errmessage (sty_str&" is not a valid math-style command");
+ default
+ endgroup
+ fi
+enddef;
+
+vardef check_position_left (suffix pos_sfx) (expr default)=
+ save pos_str;
+ string pos_str;
+ pos_str:=str pos_sfx;
+ if (pos_str="l"):
+ true
+ elseif (pos_str="r"):
+ false
+ else:
+ begingroup
+ drv_errhelp "Valid identifiers are l (left) and r (right).";
+ drv_errmessage (pos_str&" is not a valid label position identifier");
+ default
+ endgroup
+ fi
+enddef;
+
+vardef check_mode_on (suffix status_sfx) (expr default)=
+ save status_str;
+ string status_str;
+ status_str:=str status_sfx;
+ if status_str="on":
+ true
+ elseif status_str="off":
+ false
+ else:
+ begingroup
+ drv_errhelp "Possible identifiers are on and off";
+ drv_errmessage (status_str&" is not a valid status identifier");
+ default
+ endgroup
+ fi
+enddef;
+
+vardef drv_math_style (suffix typ_sfx) (expr sty_str)=
+ save typ_str, sty_idx;
+ string typ_str;
+ numeric sty_idx;
+ typ_str:=str typ_sfx;
+ if (typ_str<>"drv")
+ and (typ_str<>"jdg")
+ and (typ_str<>"ilb")
+ and (typ_str<>"dlb")
+ and (typ_str<>"plb"):
+ drv_errhelp "Valid identifiers are"&
+ " drv (derivation tree),"&
+ " jdg (judgment),"&
+ " ilb (inference label),"&
+ " dlb (delimiter label) and"&
+ " plb (phantom steps label).";
+ drv_errmessage (sty_str&" is not a valid component identifier");
+ else:
+ sty_idx:=check_math_style (sty_str, 0);
+ if typ_str="drv":
+ drv_sty:=sty_idx;
+ else:
+ forsuffixes sfx=scantokens (typ_str&"_sty"):
+ for idx=0 upto 3:
+ sfx[idx]:=min(idx+sty_idx, 3);
+ endfor
+ endfor
+ fi
+ fi
+enddef;
+
+vardef drv_scale (suffix scl_sfx) (expr scl)=
+ save scl_str;
+ string scl_str;
+ scl_str:=str scl_sfx;
+ if scl_str="clr":
+ min_clr_scl:=scl;
+ elseif scl_str="prm":
+ prm_skp_scl:=scl;
+ elseif (scl_str="jdg") or (scl_str="jgm"): % "jgm" is deprecated
+ jdg_skp_scl:=scl;
+ elseif (scl_str="ilb") or (scl_str="lbl"): % "lbl" is deprecated
+ ilb_skp_scl:=scl;
+ else:
+ drv_errhelp "Valid identifiers are"&
+ " clr,"&
+ " prm,"&
+ " jdg and"&
+ " ilb.";
+ drv_errmessage (scl_str&" is not a valid scale identifier");
+ fi
+enddef;
+
+vardef drv_junction_style suffix sty_sfx=
+ drv_jct_sty:=check_junction_style (sty_sfx, drv_jct_sty);
+enddef;
+
+vardef drv_alignment_style suffix sty_sfx=
+ drv_alg_sty:=check_alignment_style (sty_sfx, drv_alg_sty);
+enddef;
+
+vardef drv_path_style (suffix typ_sfx, sty_sfx)=
+ save typ_str;
+ string typ_str;
+ typ_str:=str typ_sfx;
+ if typ_str="iln":
+ drv_iln_sty:=check_path_style (sty_sfx, drv_iln_sty);
+ elseif typ_str="phm":
+ drv_phm_sty:=check_path_style (sty_sfx, drv_phm_sty);
+ else:
+ drv_errhelp "Valid identifiers are"&
+ " iln (inference line) and"&
+ " phm (phantom steps path).";
+ drv_errmessage (typ_str&" is not a valid path-type identifier");
+ fi
+enddef;
+
+vardef drv_labels_position_aux (suffix typ_sfx, pos_sfx)=
+ save typ_str, idt_str, pos_str;
+ string typ_str, idt_str, pos_str;
+ typ_str:=str typ_sfx;
+ if typ_str="ilb":
+ drv_left_ilb:=check_position_left (pos_sfx, drv_left_ilb);
+ elseif typ_str="dlb":
+ drv_left_dlb:=check_position_left (pos_sfx, drv_left_dlb);
+ elseif typ_str="plb":
+ drv_left_plb:=check_position_left (pos_sfx, drv_left_plb);
+ else:
+ drv_errhelp "Valid identifiers are"&
+ " ilb (inference label),"&
+ " dlb (delimiter label) and"&
+ " plb (phantom steps label).";
+ drv_errmessage (typ_str&" is not a valid label-type identifier");
+ fi
+enddef;
+
+vardef drv_labels_position text ARG=
+ drv_labels_position_aux if pair ARG: ARG else: (ilb, ARG) fi;
+enddef;
+
+vardef drv_roots_position suffix pos_sfx=
+ save pos_str;
+ string pos_str;
+ pos_str:=str pos_sfx;
+ if pos_str="t":
+ drv_bot_roots:=false;
+ elseif pos_str="b":
+ drv_bot_roots:=true;
+ else:
+ drv_errhelp "Valid identifiers are"&
+ " t (top) and"&
+ " b (bottom).";
+ drv_errmessage (pos_str&" is not a valid root position identifier");
+ fi
+enddef;
+
+vardef drv_axis_reference suffix ref_sfx=
+ save ref_str;
+ string ref_str;
+ ref_str:=str ref_sfx;
+ if (ref_str<>"iln") and (ref_str<>"jdg"):
+ drv_errhelp "Valid identifiers are iln (inference line axis) and"&
+ " jdg (judgment math-axis).";
+ drv_errmessage (ref_str&" is not a valid reference identifier");
+ else:
+ drv_axis_ref:=ref_str;
+ fi
+enddef;
+
+vardef drv_delimiter (suffix pos_sfx) (expr dlm_str)=
+ if check_position_left (pos_sfx, true):
+ drv_l_dlm:=dlm_str;
+ else:
+ drv_r_dlm:=dlm_str;
+ fi
+enddef;
+
+vardef drv_left_delimiter expr dlm_str=
+ drv_delimiter (l, dlm_str);
+enddef;
+
+vardef drv_right_delimiter expr dlm_str=
+ drv_delimiter (r, dlm_str);
+enddef;
+
+vardef drv_box_mode suffix status_sfx=
+ drv_boxmode_on:=check_mode_on (status_sfx, drv_boxmode_on);
+enddef;
+
+vardef drv_fraction_mode suffix status_sfx=
+ drv_fractionmode_on:=check_mode_on (status_sfx, drv_fractionmode_on);
+enddef;
+
+vardef drv_proof_mode suffix status_sfx=
+ drv_proofmode_on:=check_mode_on (status_sfx, drv_proofmode_on);
+enddef;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Default settings
+%
+
+drv_font_size "\normalsize";
+drv_math_style (drv, "\displaystyle");
+drv_math_style (jdg, "\textstyle");
+drv_math_style (ilb, "\scriptstyle");
+drv_math_style (dlb, "\textstyle");
+drv_math_style (plb, "\textstyle");
+drv_scale (clr, 1);
+drv_scale (prm, 1);
+drv_scale (jdg, 1);
+drv_scale (ilb, 1);
+drv_junction_style 1;
+drv_alignment_style c;
+drv_path_style (iln, 1);
+drv_path_style (phm, 3);
+drv_labels_position (ilb, r);
+drv_labels_position (dlb, l);
+drv_labels_position (plb, l);
+drv_roots_position b;
+drv_axis_reference iln;
+drv_left_delimiter "\lbrace";
+drv_right_delimiter "\rbrace";
+drv_box_mode off;
+drv_fraction_mode on;
+drv_proof_mode off;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% LaTeX inclusion macro
+%
+% \drv includes a picture file in such a way that the baseline of the included
+% picture coincides with the baseline of the inclusion point. The code for \drv
+% was suggested by Josselin Noirel on the fr.comp.text.tex usenet group.
+%
+% \usepackage{graphicx}
+% \makeatletter
+% \def\Gin@def@bp#1\relax#2#3{\gdef#2{#3}}
+% \newsavebox{\graphicsbox}
+% \newcommand*{\drv}[1]{%
+% \sbox{\graphicsbox}{\includegraphics{#1}}%
+% \raisebox{\Gin@lly bp}%
+% {\usebox{\graphicsbox}}}
+% \makeatother
diff --git a/Master/texmf-dist/doc/metapost/drv/template/makefile b/Master/texmf-dist/doc/metapost/drv/template/makefile
new file mode 100644
index 00000000000..239bbc6a46e
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/drv/template/makefile
@@ -0,0 +1,46 @@
+MAIN= template
+
+$(MAIN).pdf: $(MAIN).ps
+ ps2pdf $(MAIN).ps
+
+$(MAIN).ps: $(MAIN).tex $(MAIN)-delayed.mp
+ latex $(MAIN)
+ latex $(MAIN)
+ latex $(MAIN)
+ dvips $(MAIN) -o
+
+$(MAIN)-proof.pdf: $(MAIN)-proof.ps
+ ps2pdf $(MAIN)-proof.ps
+
+$(MAIN)-proof.ps: $(MAIN)-delayed.mp
+ latex $(MAIN)-proof
+ dvips $(MAIN)-proof -o
+
+$(MAIN)-delayed.mp: $(MAIN).mp
+ $(RM) $(MAIN)-delayed.mp
+ mpost $(MAIN)
+ mpost $(MAIN)
+ mpost $(MAIN)
+
+.SILENT clean:
+ $(RM) drv.mpx
+ $(RM) $(MAIN).[0-9]*
+ $(RM) $(MAIN).aux
+ $(RM) $(MAIN).dvi
+ $(RM) $(MAIN).log
+ $(RM) $(MAIN).nav
+ $(RM) $(MAIN).out
+ $(RM) $(MAIN).toc
+ $(RM) $(MAIN)-delayed.mp
+ $(RM) $(MAIN)-delayed.mpx
+ $(RM) $(MAIN)-proof.aux
+ $(RM) $(MAIN)-proof.dvi
+ $(RM) $(MAIN)-proof.log
+ $(RM) $(MAIN)-proof.tex
+ $(RM) $(MAIN)-proof.toc
+
+cleanall: clean
+ $(RM) $(MAIN).pdf
+ $(RM) $(MAIN).ps
+ $(RM) $(MAIN)-proof.pdf
+ $(RM) $(MAIN)-proof.ps
diff --git a/Master/texmf-dist/doc/metapost/drv/template/readme.txt b/Master/texmf-dist/doc/metapost/drv/template/readme.txt
new file mode 100644
index 00000000000..be277b760a8
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/drv/template/readme.txt
@@ -0,0 +1,17 @@
+# In order to compile the sources and to get a pdf file, use `make' or:
+
+# 1. run metapost THREE TIMES:
+mpost template.mp
+mpost template.mp
+mpost template.mp
+
+# 2. run latex (three times):
+latex template.tex
+latex template.tex
+latex template.tex
+
+# 3. run dvips (once):
+dvips template.dvi -o
+
+# 4. run ps2pdf (once):
+ps2pdf template.ps
diff --git a/Master/texmf-dist/doc/metapost/drv/template/template.mp b/Master/texmf-dist/doc/metapost/drv/template/template.mp
new file mode 100644
index 00000000000..0875f9df042
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/drv/template/template.mp
@@ -0,0 +1,131 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Structure of a MetaPost file using drv.mp
+% 1. Preamble
+% input drv;
+% verbatimtex %&latex
+% <LaTeX preamble>
+% \begin{document}
+% etex;
+% 2. Figures
+% <optional drv tunings>
+% beginfig(<index>)
+% <judgment & inference declarations>
+% draw drv_tree;
+% <optional extra MetaPost code>
+% endfig;
+% 3. Postamble
+% end
+%
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% 1. Preamble
+%
+
+input drv;
+
+verbatimtex %&latex
+
+% Any piece of code related to font selection in the preamble of
+% `template.tex' (document class, font package, font selection commands ...)
+% should be reported here.
+
+\documentclass[twoside,11pt]{article}
+\usepackage[T1]{fontenc}
+\usepackage{amsmath}
+\usepackage{amssymb}
+
+% Choose your favourite fonts combination (if available).
+% See "http://ctan.tug.org/tex-archive/info/Free_Math_Font_Survey".
+%
+%\usepackage{cmbright} % CM text & CM Bright math
+%\usepackage{ccfonts,eulervm} % Concrete text & Euler math
+%\usepackage{ccfonts} % Concrete text & math
+%\usepackage[math]{iwona} % Iwona text & math
+%\usepackage[math]{kurier} % Kurier text & math
+%\usepackage[math]{anttor} % Antykwa Torunska text & math
+%\usepackage{kmath,kerkis} % Kerkis text & math
+%\usepackage{fouriernc} % New Century Schoolbook & Fourier math
+%\usepackage{pxfonts} % Palatino & pxfonts math
+%\usepackage{mathpazo} % Palatino & Pazo math
+%\usepackage{mathpple} % Palatino & Euler math
+\usepackage[varg]{txfonts} % Times & txfonts math
+%\usepackage{mathtime} % Times & Belleek math
+%\usepackage{mathptmx} % Times & Symbol math
+%\usepackage{mbtimes} % Omega Serif text & Omega math
+%\usepackage{arev} % Arev Sans text with Arev math
+%\usepackage[charter]{mathdesign} % Bitstream Charter & Math Design math
+%\usepackage{comicsans} % Comic Sans text & math
+%\usepackage[garamond]{mathdesign} % Garamond & Math Design math
+%\usepackage{fourier} % Utopia & Fourier math
+%\usepackage[utopia]{mathdesign} % Utopia & Math Design math
+
+\begin{document}
+etex;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% 2. Figures
+%
+
+% Default settings
+%
+% drv_font_size "\normalsize";
+% drv_math_style (drv, "\displaystyle");
+% drv_math_style (jdg, "\textstyle");
+% drv_math_style (ilb, "\scriptstyle");
+% drv_math_style (dlb, "\textstyle");
+% drv_math_style (plb, "\textstyle");
+% drv_scale (clr, 1);
+% drv_scale (prm, 1);
+% drv_scale (jdg, 1);
+% drv_scale (ilb, 1);
+% drv_junction_style 1;
+% drv_alignment_style c;
+% drv_path_style (iln, 1);
+% drv_path_style (phm, 3);
+% drv_labels_position (ilb, r);
+% drv_labels_position (dlb, l);
+% drv_labels_position (plb, l);
+% drv_roots_position b;
+% drv_axis_reference iln;
+% drv_left_delimiter "\lbrace";
+% drv_right_delimiter "\rbrace";
+% drv_box_mode off;
+% drv_fraction_mode on;
+% drv_proof_mode off;
+
+beginfig(100)
+jgm 0 "\Gamma, \Delta, \Theta, \Pi, \Upsilon\vdash F";
+ jgm 1 "\Pi\vdash (A\to D)\to E";
+ jgm 2 "\Gamma, \Delta, \Theta, (A\to D)\to E, \Upsilon\vdash F";
+ jgm 3 "\Gamma, \Delta, \Theta\vdash A\to D";
+ jgm 4 "A, \Gamma, \Delta, \Theta\vdash D";
+ jgm 5 "A, \Gamma, \Delta\vdash B\wedge C";
+ jgm 6 "A, \Gamma\vdash B";
+ jgm 7 "\Delta\vdash C";
+ jgm 8 "B\wedge C, \Theta\vdash D";
+ jgm 9 "E, \Upsilon\vdash F";
+nfr 0 (1, 2) ("\text{cut}", 1);
+ nfr 1 () ("\pi", 4);
+ nfr 2 (3, 9) ("\to_L", 1);
+ nfr 3 (4) ("\to_R", 1);
+ nfr 4 (5, 8) ("\text{cut}", 1);
+ nfr 5 (6, 7) ("\wedge_R", 1);
+ nfr 6 () ("\gamma", 2);
+ nfr 7 () ("\delta", 1);
+ nfr 8 () ("\theta", 3);
+ nfr 9 () ("\upsilon", 2);
+draw drv_tree;
+endfig;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% 3. Postamble
+%
+
+end
diff --git a/Master/texmf-dist/doc/metapost/drv/template/template.tex b/Master/texmf-dist/doc/metapost/drv/template/template.tex
new file mode 100644
index 00000000000..687c45778b3
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/drv/template/template.tex
@@ -0,0 +1,55 @@
+% Any piece of code related to font selection in the following preamble
+% (document class, font package, font selection commands ...) should be
+% reported in `template.mp'.
+
+\documentclass[twoside,11pt]{article}
+\usepackage[T1]{fontenc}
+\usepackage{amsmath}
+\usepackage{amssymb}
+
+% Choose your favourite fonts combination (if available).
+% See "http://ctan.tug.org/tex-archive/info/Free_Math_Font_Survey".
+%
+%\usepackage{cmbright} % CM text & CM Bright math
+%\usepackage{ccfonts,eulervm} % Concrete text & Euler math
+%\usepackage{ccfonts} % Concrete text & math
+%\usepackage[math]{iwona} % Iwona text & math
+%\usepackage[math]{kurier} % Kurier text & math
+%\usepackage[math]{anttor} % Antykwa Torunska text & math
+%\usepackage{kmath,kerkis} % Kerkis text & math
+%\usepackage{fouriernc} % New Century Schoolbook & Fourier math
+%\usepackage{pxfonts} % Palatino & pxfonts math
+%\usepackage{mathpazo} % Palatino & Pazo math
+%\usepackage{mathpple} % Palatino & Euler math
+\usepackage[varg]{txfonts} % Times & txfonts math
+%\usepackage{mathtime} % Times & Belleek math
+%\usepackage{mathptmx} % Times & Symbol math
+%\usepackage{mbtimes} % Omega Serif text & Omega math
+%\usepackage{arev} % Arev Sans text with Arev math
+%\usepackage[charter]{mathdesign} % Bitstream Charter & Math Design math
+%\usepackage{comicsans} % Comic Sans text & math
+%\usepackage[garamond]{mathdesign} % Garamond & Math Design math
+%\usepackage{fourier} % Utopia & Fourier math
+%\usepackage[utopia]{mathdesign} % Utopia & Math Design math
+
+% Picture inclusion macro: \drv
+%
+% \drv includes a picture file in such a way that the baseline of the included
+% picture coincides with the baseline of the inclusion point. The code for \drv
+% was suggested by Josselin Noirel on the fr.comp.text.tex usenet group.
+
+\usepackage{graphicx}
+\makeatletter
+\def\Gin@def@bp#1\relax#2#3{\gdef#2{#3}}
+\newsavebox{\graphicsbox}
+\newcommand*{\drv}[1]{%
+\sbox{\graphicsbox}{\includegraphics{#1}}%
+\raisebox{\Gin@lly bp}%
+{\usebox{\graphicsbox}}}
+\makeatother
+
+\begin{document}
+\begin{gather*}
+\frac{\qquad}{}\drv{template.100}\frac{\qquad}{}
+\end{gather*}
+\end{document}