diff options
author | Karl Berry <karl@freefriends.org> | 2010-01-12 01:51:25 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2010-01-12 01:51:25 +0000 |
commit | 692e44b74537cef74af1a4b12f28de5a9a21ca43 (patch) | |
tree | 43e57a7a3b4e8dbbf9a94eb5bfac1999a03e0776 /Master/texmf-dist | |
parent | fbb62bc0c2f3b0ff5d46e784a6f95f2d22dd3f63 (diff) |
drv 0.95 (11jan10)
git-svn-id: svn://tug.org/texlive/trunk@16678 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist')
16 files changed, 4352 insertions, 726 deletions
diff --git a/Master/texmf-dist/doc/metapost/drv/README b/Master/texmf-dist/doc/metapost/drv/README index 31246497d23..05bd4192cf0 100644 --- a/Master/texmf-dist/doc/metapost/drv/README +++ b/Master/texmf-dist/doc/metapost/drv/README @@ -1,11 +1,11 @@ -drv.mp - derivation trees with MetaPost -version 0.94 +drv - derivation trees with MetaPost +version 0.95 Licence lppl Description -drv.mp is a set of MetaPost macros for typesetting derivation trees (such as +drv 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. diff --git a/Master/texmf-dist/doc/metapost/drv/doc/drv-guide.mp b/Master/texmf-dist/doc/metapost/drv/doc/drv-guide.mp index 8c5e207cafe..515cb68a6c7 100644 --- a/Master/texmf-dist/doc/metapost/drv/doc/drv-guide.mp +++ b/Master/texmf-dist/doc/metapost/drv/doc/drv-guide.mp @@ -1,6 +1,6 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % -% Structure of a MetaPost file using drv.mp +% Structure of a MetaPost file using drv % 1. Preamble % input drv; % verbatimtex %&latex @@ -63,6 +63,9 @@ verbatimtex %&latex %\usepackage{fourier} % Utopia & Fourier math %\usepackage[utopia]{mathdesign} % Utopia & Math Design math +\newcommand{\limp}{\thinspace{\multimapinv}\thinspace} +\newcommand{\rimp}{\thinspace{\multimap}\thinspace} + \begin{document} etex; @@ -73,6 +76,11 @@ etex; % % +% Uncomment the following line to experiment the radial mode. +% drv_radial_mode on; +% + +% % title page % @@ -233,6 +241,12 @@ dcl 0 () ("f", 1) "A", "\vdash", "B"; draw drv_tree; endfig; +beginfig(141) +dcl 0 () ("f", 1) "A\vdash B"; +dcl 1 (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"; @@ -273,11 +287,26 @@ draw drv_tree; endfig; vardef auxbox[]= - ((sub_min_x[@], ypart iln[ccl[@]].c+iln[ccl[@]].hg)-- - (sub_min_x[@], sub_max_y[@])-- - (sub_max_x[@], sub_max_y[@])-- - (sub_max_x[@], ypart iln[ccl[@]].c+iln[ccl[@]].hg)-- - cycle) shifted (0, min_clr_scl*min_clr[drv_sty]/2) + if drv_radialmode_on: + save l_ngl, r_ngl, min_rad, max_rad, tnum; + numeric l_ngl, r_ngl, min_rad, max_rad, tnum; + l_ngl:=ngl_part sub_lmost_ppt[@]; + r_ngl:=ngl_part sub_rmost_ppt[@]; + tnum:=if bot_jdg[@]: - fi 1; + min_rad:=iln[ccl[@]].rad+iln[ccl[@]].hg+min_clr_scl*min_clr[drv_sty]/2; + max_rad:=sub_max_rad[@]+min_clr_scl*min_clr[drv_sty]/2; + ((dir l_ngl) scaled min_rad--(dir l_ngl) scaled max_rad + {dir (l_ngl+tnum*90)} .. {dir (r_ngl+tnum*90)} + (dir r_ngl) scaled max_rad--(dir r_ngl) scaled min_rad + {dir (r_ngl-tnum*90)} .. {dir (l_ngl-tnum*90)} + cycle) shifted jdg[@].org + else: + ((sub_min_x[@], ypart iln[ccl[@]].c+iln[ccl[@]].hg)-- + (sub_min_x[@], sub_max_y[@])-- + (sub_max_x[@], sub_max_y[@])-- + (sub_max_x[@], ypart iln[ccl[@]].c+iln[ccl[@]].hg)-- + cycle) shifted (0, min_clr_scl*min_clr[drv_sty]/2) + fi enddef; beginfig(162) @@ -1041,7 +1070,7 @@ 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 background withpen drv_pen scaled 2; draw iln[0] withcolor (1, 0, 0); endfig; @@ -1081,7 +1110,7 @@ endfig; % a fraction % -drv_math_style (drv, "\textstyle"); +drv_font_size "\huge"; drv_scale (jgm, 0); beginfig(400) @@ -1090,7 +1119,7 @@ dcl 1 (0) ("", 1) "\delta"; draw drv_tree; endfig; -drv_math_style (drv, "\displaystyle"); +drv_font_size "\normalsize"; drv_scale (jgm, 1); % @@ -1171,16 +1200,16 @@ endfig; % 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)) ("", _); +jgm 0 "a"; + jgm 1 "b"; + jgm 2 "cccccc"; + jgm 3 "ddd"; + jgm 4 "eeeeeeeee"; +nfr 0 (1, MVD 4 (5, "", "F", r, 4)) ("", _); + nfr 1 (MVD 2 (2, "G", "", l, 3), 3) ("", _); + nfr 2 () ("", _); + nfr 3 () ("", _); + nfr 4 () ("", _); draw drv_tree; endfig; @@ -1371,12 +1400,20 @@ endfig; 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.}"; +jgm 2 "\text{You may check that"& + if drv_radialmode_on: + " the angle between the two dots above is 45$^\circ$.}" + else: + " the distance between the two dots above is 5 cm.}" + fi; NFR 0 () ("", "", "", "", _, _, _); NFR 1 () ("", "", "", "", _, _, _); NFR 2 (0, 1) ("", "", "", "", 3, _, _); % caution: 3 -xpart jdg[1].c=xpart jdg[0].c+5cm; +if drv_radialmode_on: + jdg[1].lng=jdg[0].rng-45; +else: + xpart jdg[1].c=xpart jdg[0].c+5cm; +fi draw drv_tree; endfig; @@ -1391,8 +1428,13 @@ 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; +if drv_radialmode_on: + sbj[1][1].cng=sbj[0][1].cng; + sbj[2][1].cng=sbj[1][1].cng; +else: + xpart sbj[1][1].c=xpart sbj[0][1].c; + xpart sbj[2][1].c=xpart sbj[1][1].c; +fi draw drv_tree; endfig; @@ -1403,8 +1445,13 @@ 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; +if drv_radialmode_on: + sbj[1][1].lng=sbj[0][1].rng; + sbj[2][1].lng=sbj[1][1].rng; +else: + xpart sbj[1][1].l=xpart sbj[0][1].r; + xpart sbj[2][1].l=xpart sbj[1][1].r; +fi draw drv_tree; endfig; @@ -1427,6 +1474,326 @@ draw drv_tree; endfig; % +% derivation forests +% + +beginfig(530) +% first tree +dcl 10 () ("", _) "a"; +% second tree +dcl 20 (21, 22) ("", _) "d"; + dcl 21 () ("", _) "b"; + dcl 22 () ("", _) "c"; +draw drv_tree; +endfig; + +beginfig(531) +% first tree +dcl 10 () ("", _) "a"; +% second tree +dcl 20 (21, 22) ("", _) "d"; + dcl 21 () ("", _) "b"; + dcl 22 () ("", _) "c"; +% relative positionning +if drv_radialmode_on: + jdg[10].rad=jdg[22].rad; +else: + ypart jdg[10].c=ypart jdg[22].c; +fi +draw drv_tree; +endfig; + +beginfig(532) +% first tree +dcl 10 () ("", _) "a"; +% second tree +dcl 20 (21, 22) ("", _) "d"; + dcl 21 () ("", _) "b"; + dcl 22 () ("", _) "c"; +% relative positionning +if drv_radialmode_on: + iln[10].rng=iln[20].lng; +else: + xpart iln[10].r=xpart iln[20].l; +fi +draw drv_tree; +endfig; + +% +% drv_root +% + +beginfig(533) +% first tree +dcl 10 () ("", _) "a"; +% second tree +dcl 20 (21, 22) ("", _) "d"; + dcl 21 () ("", _) "b"; + dcl 22 () ("", _) "c"; +drv_root (20, t); % root at top! +draw drv_tree; +endfig; + +drv_left_delimiter "\downarrow"; +drv_right_delimiter "\uparrow"; + +beginfig(540) +% first tree +jgm 10 "A\vdash D"; +Nfr 10 (11, 14) ("\circ", "h\circ (g\circ f)", "", 1); + dcl 11 (12, 13) ("\circ", 1) "A\vdash C"; + dcl 12 () ("f", 2) "A\vdash B"; + dcl 13 () ("g", 3) "B\vdash C"; + dcl 14 () ("h", 4) "C\vdash D"; +% second tree +jgm 20 "\phantom{A\vdash D}"; +Nfr 20 (21, 22) ("\circ", "", "(h\circ g)\circ f", 1); + dcl 21 () ("f", 2) "A\vdash B"; + dcl 22 (23, 24) ("\circ", 1) "B\vdash D"; + dcl 23 () ("g", 3) "B\vdash C"; + dcl 24 () ("h", 4) "C\vdash D"; +drv_root (20, t); % root at top! +% overlapping +jdg[10].c=jdg[20].c; +draw drv_tree; +endfig; + +drv_left_delimiter "\lbrace"; +drv_right_delimiter "\rbrace"; + +% +% drv_radial_mode +% + +drv_radial_mode on; + +beginfig(550) +dcl 0 () ("f", 2) "A\vdash B"; +dcl 1 () ("g", 3) "B\vdash C"; +dcl 2 () ("h", 4) "C\vdash D"; +dcl 3 (1, 2) ("\circ", 1) "B\vdash D"; +dcl 4 (0, 3) ("\circ", 1) "A\vdash D"; +draw drv_tree; +endfig; + +drv_roots_position t; + +beginfig(551) +dcl 0 () ("f", 2) "A\vdash B"; +dcl 1 () ("g", 3) "B\vdash C"; +dcl 2 () ("h", 4) "C\vdash D"; +dcl 3 (1, 2) ("\circ", 1) "B\vdash D"; +dcl 4 (0, 3) ("\circ", 1) "A\vdash D"; +draw drv_tree; +endfig; + +drv_roots_position b; +drv_radial_mode off; + +beginfig(552) +dcl 0 () ("f", 2) "A\vdash B"; +dcl 1 () ("g", 3) "B\vdash C"; +dcl 2 () ("h", 4) "C\vdash D"; +dcl 3 (1, 2) ("\circ", 1) "B\vdash D"; +dcl 4 (0, 3) ("\circ", 1) "A\vdash D"; +draw drv_tree; +endfig; + +drv_roots_position t; + +beginfig(553) +dcl 0 () ("f", 2) "A\vdash B"; +dcl 1 () ("g", 3) "B\vdash C"; +dcl 2 () ("h", 4) "C\vdash D"; +dcl 3 (1, 2) ("\circ", 1) "B\vdash D"; +dcl 4 (0, 3) ("\circ", 1) "A\vdash D"; +draw drv_tree; +endfig; + +drv_roots_position b; + +% +% drv_scale (crv, ); +% + +drv_radial_mode on; +drv_scale (crv, 0.5); + +beginfig(560) +dcl 0 () ("f", 2) "A\vdash B"; +dcl 1 () ("g", 3) "B\vdash C"; +dcl 2 (0, 1) ("\circ", 1) "A\vdash C"; +draw drv_tree; +endfig; + +drv_scale (crv, 1); + +beginfig(561) +dcl 0 () ("f", 2) "A\vdash B"; +dcl 1 () ("g", 3) "B\vdash C"; +dcl 2 (0, 1) ("\circ", 1) "A\vdash C"; +draw drv_tree; +endfig; + +drv_scale (crv, 2); + +beginfig(562) +dcl 0 () ("f", 2) "A\vdash B"; +dcl 1 () ("g", 3) "B\vdash C"; +dcl 2 (0, 1) ("\circ", 1) "A\vdash C"; +draw drv_tree; +endfig; + +drv_scale (crv, 4); + +beginfig(563) +dcl 0 () ("f", 2) "A\vdash B"; +dcl 1 () ("g", 3) "B\vdash C"; +dcl 2 (0, 1) ("\circ", 1) "A\vdash C"; +draw drv_tree; +endfig; + +drv_scale (crv, 1); +drv_radial_mode off; + +% +% drv_azimuth +% + +drv_radial_mode on; +drv_azimuth 120; + +beginfig(570) +dcl 0 () ("f", 2) "A\vdash B"; +dcl 1 () ("g", 3) "B\vdash C"; +dcl 2 (0, 1) ("\circ", 1) "A\vdash C"; +draw drv_tree; +endfig; + +drv_azimuth 90; + +beginfig(571) +dcl 0 () ("f", 2) "A\vdash B"; +dcl 1 () ("g", 3) "B\vdash C"; +dcl 2 (0, 1) ("\circ", 1) "A\vdash C"; +draw drv_tree; +endfig; + +drv_azimuth 60; + +beginfig(572) +dcl 0 () ("f", 2) "A\vdash B"; +dcl 1 () ("g", 3) "B\vdash C"; +dcl 2 (0, 1) ("\circ", 1) "A\vdash C"; +draw drv_tree; +endfig; + +drv_azimuth 90; +drv_radial_mode off; + +% +% Size matters - Part 3 +% + +drv_radial_mode on; + +beginfig(580) +dcl 0 () ("", 0) "\textsc{Size matters -- Part 3}"; +dcl 1 (0) ("", 1) "\text{How could this very long judgment fit on the page"& + " without being desperately bent into a circle arc ?}"; +draw drv_tree; +endfig; + +drv_radial_mode off; + +% +% User specified junction and alignment styles +% + +drv_radial_mode on; + +beginfig(590) % "\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 +sbj[1][1].cng=sbj[0][1].cng; +sbj[2][1].cng=sbj[1][1].cng; +draw drv_tree; +endfig; + +beginfig(591) % "\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 +sbj[1][1].lng=sbj[0][1].rng; +sbj[2][1].lng=sbj[1][1].rng; +draw drv_tree; +endfig; + +drv_radial_mode off; + +% +% example - triple unit +% + +string id, Llimp, Rlimp, Lrimp, Rrimp; +id:="\text{id}"; +Llimp:="\overset{\multimapinv}{\eta}"; +Rlimp:="\overset{\multimapinv}{\varepsilon}"; +Lrimp:="\overset{\multimap}{\eta}"; +Rrimp:="\overset{\multimap}{\varepsilon}"; + +beginfig(600) +jgm 10 "1\limp(a\rimp 1)\otimes\bigl(1\limp(a\rimp 1)\bigr)\rimp 1\vdash 1"; + jgm 11 "1\limp(a\rimp 1)\vdash 1\limp(a\rimp 1)"; + jgm 12 "1\limp(a\rimp 1)\otimes a\rimp 1\vdash 1"; + jgm 13 "a\rimp 1\vdash a\rimp 1"; + jgm 14 "a\otimes a\rimp 1\vdash 1"; + jgm 15 "a\vdash a"; + jgm 16 "1\vdash 1"; + jgm 17 "1\vdash 1"; + jgm 18 "1\vdash 1"; +nfr 10 (11, 18) (Lrimp, 1); + nfr 11 (12) (Rlimp, 1); + nfr 12 (13, 17) (Llimp, 1); + nfr 13 (14) (Rrimp, 1); + nfr 14 (15, 16) (Lrimp, 1); + nfr 15 () (id, 1); + nfr 16 () (id, 1); + nfr 17 () (id, 1); + nfr 18 () (id, 1); +draw drv_tree; +endfig; + +beginfig(601) +jgm 20 "1\limp(a\rimp 1)\otimes\bigl(1\limp(a\rimp 1)\bigr)\rimp 1\vdash 1"; + jgm 21 "\bigl(1\limp(a\rimp 1)\bigr)\rimp 1\vdash a\rimp 1"; + jgm 22 "a\otimes\bigl(1\limp(a\rimp 1)\bigr)\rimp 1\vdash 1"; + jgm 23 "a\vdash 1\limp(a\rimp 1)"; + jgm 24 "a\otimes a\rimp 1\vdash 1"; + jgm 25 "a\vdash a"; + jgm 26 "1\vdash 1"; + jgm 27 "1\vdash 1"; + jgm 28 "1\vdash 1"; +nfr 20 (21, 28) (Llimp, 1); + nfr 21 (22) (Rrimp, 1); + nfr 22 (23, 27) (Lrimp, 1); + nfr 23 (24) (Rlimp, 1); + nfr 24 (25, 26) (Lrimp, 1); + nfr 25 () (id, 1); + nfr 26 () (id, 1); + nfr 27 () (id, 1); + nfr 28 () (id, 1); +draw drv_tree; +endfig; + +% % example - Restall % @@ -1438,7 +1805,7 @@ Land1:="\wedge L_1"; Land2:="\wedge L_2"; Rand:="\wedge R"; -beginfig(530) +beginfig(610) 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"; @@ -1455,12 +1822,12 @@ jgm 0 "p\wedge(q\vee(r_1\wedge r_2))\vdash p\wedge(q\vee(r_1\wedge 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 3 (bxd 4) (Land2, 1); % fig. 611 -> nfr 3 (mvd 4 (1, 3)) + nfr 4 (5, 7) (Lor, 1); % fig. 611 -> 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 7 (bxd 8) (Ror2, 1); % fig. 611 -> nfr 7 (mvd 8 (1, 3)) + nfr 8 (9, 11) (Rand, 1); % fig. 611 -> Nfr nfr 9 (10) (Land1, 1); nfr 10 () ("", 0); nfr 11 (12) (Land2, 1); @@ -1470,7 +1837,7 @@ fill drv_bbox 8 withcolor (236, 211, 185)/255; draw drv_tree; endfig; -beginfig(531) +beginfig(611) 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"; @@ -1514,7 +1881,7 @@ vardef mix[]= "\textit{mix}("&(decimal @)&")" enddef; -beginfig(540) +beginfig(620) 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"; @@ -1577,13 +1944,14 @@ drv_scale (prm, 1); drv_math_style (ilb, "\textstyle"); drv_labels_position (ilb, l); drv_scale (clr, 1.5); +drv_axis_reference jdg; string neg, par, otm; neg:="^\bot"; par:="\mathbin{\bindnasrepma}"; % from stmaryrd.sty otm:="\otimes"; -beginfig(550) +beginfig(630) % 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, ")", ")"; @@ -1631,10 +1999,10 @@ draw sbj[4][4].c {down} .. sbj[4][4].c shifted (0, -num_hg); drawoptions (); -draw drv_tree; % fig. 551 -> draw jdg[4]; +draw drv_tree; % fig. 631 -> draw jdg[4]; endfig; -beginfig(551) +beginfig(631) % 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, ")", ")"; @@ -1682,15 +2050,16 @@ draw sbj[4][4].c {down} .. sbj[4][4].c shifted (0, -num_hg); drawoptions (); -draw jdg[4]; % fig. 550 -> draw drv_tree; +draw jdg[4]; % fig. 630 -> draw drv_tree; endfig; drv_math_style (ilb, "\scriptstyle"); drv_labels_position (ilb, r); drv_scale (clr, 1); +drv_axis_reference iln; % -% a continued fraction +% example - a continued fraction % drv_math_style (ilb, "\textstyle"); @@ -1700,9 +2069,7 @@ drv_labels_position (ilb, l); drv_roots_position t; drv_box_mode on; -drv_font_size "\normalsize"; - -beginfig(560) +beginfig(640) dcl 0 (1) ("1+", 1) "a"; dcl 1 (2) ("2+", 1) "b"; dcl 2 (3) ("3+", 1) "c"; diff --git a/Master/texmf-dist/doc/metapost/drv/doc/drv-guide.tex b/Master/texmf-dist/doc/metapost/drv/doc/drv-guide.tex index 02d0f8376c0..6f2fff63c77 100644 --- a/Master/texmf-dist/doc/metapost/drv/doc/drv-guide.tex +++ b/Master/texmf-dist/doc/metapost/drv/doc/drv-guide.tex @@ -40,16 +40,24 @@ \usepackage{fancyvrb} \fvset{fontsize=\small} \usepackage{color} -\definecolor{myblue}{rgb}{0,0,.5} +\definecolor{myblue}{rgb}{.0,.0,.5} +\definecolor{mygrey}{rgb}{.75,.75,.75} \usepackage{hyperref} \hypersetup{colorlinks=true} \hypersetup{citecolor=myblue} \hypersetup{linkcolor=myblue} \hypersetup{urlcolor=myblue} -\hypersetup{pdftitle={drv.mp - derivation trees with MetaPost}} +\hypersetup{pdftitle={drv - derivation trees with MetaPost}} \hypersetup{pdfauthor={Laurent M\'ehats}} - +\hypersetup{pdfkeywords={% +derivation trees, +proof trees, +deduction trees, +sequent proofs, +natural deduction, +latex, +metapost}} % Picture inclusion macro: \drv % % \drv includes a picture file in such a way that the baseline of the included @@ -71,16 +79,18 @@ \newcommand{\tbs}{\textbackslash} \newcommand{\resplap}{\llap{\textrm{\emph{resp. }}}} -\title{\texttt{drv.mp}\\ +\title{\texttt{drv}\\ derivation trees with \MP% -\thanks{You don't need to know \MP\ to use this package.}\\ +\thanks{Available on +\href{http://www.ctan.org/tex-archive/graphics/metapost/contrib/macros/drv/} +{CTAN}. 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.) +\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?subject=[drv 0.94]} +{\small\href{mailto:laurent.mehats@gmail.com?subject=[drv 0.95]} {\texttt{laurent.mehats@gmail.com}}}} -\date{documented version: 0.94} +\date{documented version: 0.95} \pagestyle{myheadings} \renewcommand{\sectionmark}[1]{% @@ -103,7 +113,7 @@ Last update: \today.}}} \section{Usage\label{sec-usage}} % % -\subsection{Structure of a \MP\ file using \texttt{drv.mp}% +\subsection{Structure of a \MP\ file using \texttt{drv}% \label{sec-structure}} % % @@ -120,7 +130,7 @@ Last update: \today.}}} \begin{Verbatim}[commandchars=\\\{\}] \param{optional \texttt{drv} tunings} beginfig(\param{index}) - \param{judgment \& inference declarations} + \param{judgment and inference declarations} draw drv_tree; \param{optional extra \MP\ code} endfig; @@ -143,14 +153,14 @@ You have to run \emph{at least twice} \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} +first run \MP\ collects the \LaTeX\ code generated by \texttt{drv} 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 +\texttt{drv}/\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 @@ -164,11 +174,11 @@ 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} +\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 +However \texttt{drv} 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 @@ -189,10 +199,10 @@ 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}} +\section{Judgment and inference declarations\label{sec-declarations}} % % -\subsection{\texttt{jgm} \& \texttt{nfr}\label{sec-jgm-nfr}} +\subsection{\texttt{jgm} and \texttt{nfr}\label{sec-jgm-nfr}} % % \texttt{jgm \param{nat} \param{str list}}\\ @@ -210,15 +220,15 @@ The code for \texttt{\tbs{}drv} was suggested by Josselin \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). +conclusion is the index \param{nat} judgment (you can declare a judgment +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} +\paragraph{First example\label{fig-110}} % % %\begin{multicols}{2} @@ -435,7 +445,8 @@ draw drv_tree; endfig; beginfig(141) -dcl 0 () ("f", 1) "A", "\vdash", "B"; +dcl 0 () ("f", 1) "A\vdash B"; +dcl 1 (0) ("f", 1) "A", "\vdash", "B"; draw drv_tree; endfig; \end{Verbatim} @@ -472,7 +483,7 @@ endfig; \end{gather*} % % -\subsection{\texttt{bxd} \& \texttt{mvd}\label{sec-bxd-mvd}} +\subsection{\texttt{bxd} and \texttt{mvd}\label{sec-bxd-mvd}} % % \paragraph{\texttt{bxd}} @@ -559,7 +570,7 @@ endfig; %\texttt{drv\_path\_style} macro (see~\S~\ref{sec-path-style}). % % -\subsection{Sub-tree delimiters \& labels\label{sec-sub-tree}} +\subsection{Sub-tree delimiters and labels\label{sec-sub-tree}} % % \paragraph{\texttt{Nfr}} @@ -579,14 +590,15 @@ enables the typesetting of delimiters.\\[1ex] {\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. +\texttt{""} then \texttt{Nfr} behaves exactly the same way as \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) @@ -676,7 +688,7 @@ endfig; % % \texttt{drv} tuning macros set the parameters according to which derivation -trees are typeset. All these macros have to be called outside figure +trees are typeset. You have to call these macros \emph{outside} figure environments (delimited by ``\texttt{beginfig(\param{index})}, \texttt{endfig;}'' pairs). % @@ -860,7 +872,7 @@ determines the math-style of numerators and denominators. \subsection{\texttt{drv\_junction\_style}\label{sec-junction-style}} % % -This macro sets the default way the premises of an inference have to be +This macro sets the default way the premises of an inference are horizontally joined.\\[1ex] \texttt{drv\_junction\_style \param{id}}\\ \begin{tabular}{ll} @@ -886,7 +898,7 @@ horizontally joined.\\[1ex] \subsection{\texttt{drv\_alignment\_style}\label{sec-alignment-style}} % % -This macro sets the default way a judgment has to be horizontally aligned +This macro sets the default way a judgment is horizontally aligned relatively to its premises.\\[1ex] \texttt{drv\_alignment\_style \param{id}}\\ \begin{tabular}{ll} @@ -986,15 +998,15 @@ taking optional label arguments (see~\S~\ref{sec-labels}). % % 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 +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 + {\tt jdg}&root judgment math axis \end{tabular} \end{tabular} \begin{gather*} @@ -1006,7 +1018,7 @@ 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}% +\subsection{\texttt{drv\_left\_delimiter} and \texttt{drv\_right\_delimiter}% \label{sec-delimiters}} % % @@ -1088,11 +1100,11 @@ typeset as& \subsection{\texttt{drv\_fraction\_mode}\label{sec-fraction-mode}} % % -\nopagebreak\parbox{\textwidth}{\texttt{drv.mp} typesets derivation trees in +\nopagebreak\parbox{\textwidth}{\texttt{drv} 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}, +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}, +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 @@ -1144,30 +1156,29 @@ 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}} +\section{Pictures, bounding boxes and math axis\label{sec-pictures}} % % -\subsection{\texttt{drv\_freeze} \& \texttt{drv\_tree}} +\subsection{\texttt{drv\_freeze} and \texttt{drv\_tree}} % % -\texttt{drv.mp} composes derivation trees with respect to judgment and +\texttt{drv} 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 +This is usually done by \texttt{drv\_tree} which is 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 +\texttt{drv} 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 +(see~\cite{jackowski06,knuth84}). In particular, \texttt{drv} 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. +you use. As an example, compare the following fractions (the first one is +composed by \texttt{drv} while the second one is composed by the standard +\texttt{\tbs{}frac} command).\\[1ex]\mbox{}{\hfill% +\drv{drv-guide.400}\quad{\huge$\displaystyle\frac{\gamma}{\delta}$}\hfill} % % \subsection{\texttt{drv\_bbox}\label{sec-bbox}} @@ -1177,9 +1188,10 @@ command. \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. +``\texttt{drv\_bbox \param{nat}}'' returns a \MP\ closed path +(see~\cite[Section~4]{hobby09}) standing for 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"; @@ -1189,7 +1201,8 @@ dcl 0 (1, 5) ("", _) "a"; dcl 3 () ("", _) "d"; dcl 4 () ("", _) "e"; dcl 5 () ("", _) "f"; -fill drv_bbox 1 withcolor (255, 230, 205)/255; % rgb color +fill drv_bbox 1 withcolor (255, 230, 205)/255;\textrm{\emph{ + % rgb color}} draw drv_tree; endfig; \end{Verbatim} @@ -1201,14 +1214,15 @@ endfig; \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} locally overrides \texttt{drv\_axis\_reference} (see +\S~\ref{sec-axis-reference}), allowing you to explicitly set +the math axis of a tree once it has been drawn.\\[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 jdg}&judgment math axis\\ {\tt dlm}&delimiter axis \end{tabular}\\ \param{nat}& reference index @@ -1224,6 +1238,7 @@ drv_axis (iln, 0); endfig; \end{Verbatim} \begin{gather*} +\frac{\qquad}{}\textit{ math axis }\frac{\qquad}{} \drv{drv-guide.420}\frac{\qquad}{}\text{ resp. }\frac{\qquad}{} \drv{drv-guide.421}\frac{\qquad}{}\text{ resp. }\frac{\qquad}{} \drv{drv-guide.422} @@ -1235,7 +1250,7 @@ Notice that \texttt{drv\_axis} is irrelevant if you don't use the \section{Low level inference declaration macros\label{sec-low-level}} % % -\subsection{\texttt{NFR}, \texttt{DCL} \& \texttt{MVD}\label{sec-NFR-DCL-MVD}} +\subsection{\texttt{NFR}, \texttt{DCL} and \texttt{MVD}\label{sec-NFR-DCL-MVD}} % % \paragraph{\texttt{NFR}} @@ -1247,8 +1262,8 @@ 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})} +(\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\\ @@ -1327,30 +1342,29 @@ endfig; 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})}\\ +(\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 1}& alignment style identifier ({\tt l}, {\tt c} or {\tt r})\\ \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)) ("", _); +jgm 0 "a"; + jgm 1 "b"; + jgm 2 "cccccc"; + jgm 3 "ddd"; + jgm 4 "eeeeeeeee"; +nfr 0 (1, MVD 4 (5, "", "F", r, 4)) ("", _); + nfr 1 (MVD 2 (2, "G", "", l, 3), 3) ("", _); + nfr 2 () ("", _); + nfr 3 () ("", _); + nfr 4 () ("", _); draw drv_tree; endfig; \end{Verbatim} @@ -1450,8 +1464,8 @@ specify labels at your option.\\[1ex] \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 1}& alignment style identifier ({\tt l}, {\tt c} + or {\tt r})\\ \param{id 2}& phantom steps path-style identifier ({\tt0}, {\tt1}, {\tt2}, {\tt3}, {\tt4}, {\tt5}, {\tt6} or {\tt\_}) \end{tabular}\\[1ex] @@ -1478,7 +1492,7 @@ 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}. +As an example, 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); @@ -1533,7 +1547,7 @@ endfig; 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. +the right of the component math axis. \begin{gather*} \begin{array}{cc} \text{components}&\text{central points}\\[1ex] @@ -1547,11 +1561,11 @@ the right of the component math-axis. % 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 +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 +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 +math axis relatively to the axis of an inference line below it. Depths are negative while heights are positive. \begin{Verbatim} beginfig(470) @@ -1569,8 +1583,9 @@ endfig; \subsection{\texttt{drv\_styled}\label{sec-styled}} % % -\texttt{drv\_styled} allows you to draw \MP\ paths using \texttt{drv.mp} -path-styles.\\[1ex] +\texttt{drv\_styled} allows you to draw \MP\ paths +%(see~\cite[Section~4]{hobby09}) +using \texttt{drv} path-styles.\\[1ex] \texttt{\param{path} drv\_styled \param{id}}\\ \begin{tabular}{ll} \param{path}& \MP\ path expression\\ @@ -1605,11 +1620,11 @@ endfig; \end{gather*} % % -\subsection{User specified junction \& alignment styles +\subsection{User specified junction and alignment styles (tricky)\label{sec-user-specified}} % % -\texttt{drp.mp} composes derivation trees by stating geometrical constraints to +\texttt{drv} 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 @@ -1619,7 +1634,7 @@ 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} +You can prevent \texttt{drv} 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 @@ -1675,6 +1690,7 @@ xpart sbj[2][1].c=xpart sbj[1][1].c; draw drv_tree; endfig; \end{Verbatim} +\label{fig-510} \begin{gather*} \drv{drv-guide.510}\quad\text{resp.}\quad\drv{drv-guide.511} \end{gather*} @@ -1713,12 +1729,15 @@ Lutz \textsc{Stra\ss{}burger}. % % \appendix -\section{Debugging\label{sec-debugging}} +\section{Debugging and proofing\label{sec-debugging}} +% +% +\subsection*{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 +the first run then it comes from the \texttt{drv}/\MP\ code. If you get an error on the second run then it comes from the \LaTeX\ code. % % @@ -1728,7 +1747,7 @@ error on the second run then it comes from the \LaTeX\ code. (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 +an inconsistency that \texttt{drv} can detect. In such a case the explanation should be quite understandable. \begin{multicols}{2} \begin{Verbatim}[numbers=left,firstnumber=46] @@ -1768,38 +1787,331 @@ part of the \LaTeX\ code is faulty but unfortunately not where to find it in \texttt{\param{jobname}.mp}. % % -\section{Gallery\label{sec-gallery}} +\subsection*{Proofing} % % -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). +Recall that 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}}. In addition, +\texttt{drv} generates a \LaTeX\ file \texttt{\param{jobname}-proof.tex} +that contains a copy of the \LaTeX\ preamble in \texttt{\param{jobname}.mp} +and includes each \texttt{\param{jobname}.\param{index}}% +\footnote{To \MP\ users: proof file generation does not take +\texttt{outputtemplate} into account yet.} +picture file using the \texttt{\tbs{}drv} inclusion command, together with +some information about its text size, math style and math axis. As an example, +regarding the first figure on page~\pageref{fig-110}, processing +\texttt{drv-guide-proof.tex} produces:\\[1ex] +\texttt{drv-guide.110} + (\verb+\normalsize+, \verb+\displaystyle+) + {\normalsize + \[\displaystyle + \frac{\quad}{}\drv{drv-guide.110}\frac{\quad}{} + \]} % % +\section{Derivation forests\label{sec-forests}} +% +% +You may declare several derivation trees within a single figure environment. +Then trees are drawn from left to right in the order their roots are +declared, and in such a way that: root judgments are horizontally aligned; the +distance between two trees is the same as the distance between two +non-interleaving premises (and thus is affected by \texttt{drv\_scale}, see +\S~\ref{sec-scale}). +\begin{multicols}{2} +\begin{Verbatim} +beginfig(530) +% first tree +dcl 10 () ("", _) "a"; +% second tree +dcl 20 (21, 22) ("", _) "d"; + dcl 21 () ("", _) "b"; + dcl 22 () ("", _) "c"; +draw drv_tree; +endfig; +\end{Verbatim} +\columnbreak + \begin{gather*} +\textcolor{mygrey}{\frac{\quad}{}\textit{math axis}\frac{\quad}{}} \drv{drv-guide.530} \end{gather*} +\end{multicols} +\noindent You can however state constraints (horizontal or vertical, at your +option) specifying the relative positioning of trees before +\texttt{drv\_freeze} is called. +\begin{multicols}{2} +\begin{Verbatim}[commandchars=\\\{\}] +beginfig(531) +% first tree +dcl 10 () ("", _) "a"; +% second tree +dcl 20 (21, 22) ("", _) "d"; + dcl 21 () ("", _) "b"; + dcl 22 () ("", _) "c"; +% relative positionning +ypart jdg[10].c=ypart jdg[22].c; +\resplap{}xpart iln[10].r=xpart iln[20].l; +draw drv_tree; +endfig; +\end{Verbatim} +\columnbreak + \begin{gather*} +\textcolor{mygrey}{\frac{\quad}{}\textit{math axis}\frac{\quad}{}} \drv{drv-guide.531} \end{gather*} +\begin{gather*} +\textcolor{mygrey}{\frac{\quad}{}\textit{math axis}\frac{\quad}{}} +\drv{drv-guide.532} +\end{gather*} +\end{multicols} +\noindent Notice that the math axis of a forest is set according to +\texttt{drv\_axis\_reference} (see \S~\ref{sec-axis-reference}) relatively to +the first declared root (you can override this behaviour by using +\texttt{drv\_axis}, see \S~\ref{sec-axis}). +% +% +\subsection*{\texttt{drv\_root}} +% +% +\texttt{drv\_root} locally overrides \texttt{drv\_roots\_position} (see +\S~\ref{sec-roots-position}), allowing you to explicitly set +the position of a root.\\[1ex] +\texttt{drv\_root (\param{nat}, \param{id})}\\ +\begin{tabular}{ll} +\param{nat}& root index\\ +\param{id}& position identifier ({\tt t} or {\tt b})\\ +& \begin{tabular}{ll} + {\tt t}&top\\ + {\tt b}&bottom + \end{tabular} +\end{tabular} +\begin{multicols}{2} +\begin{Verbatim} +beginfig(533) +% first tree +dcl 10 () ("", _) "a"; +% second tree +dcl 20 (21, 22) ("", _) "d"; + dcl 21 () ("", _) "b"; + dcl 22 () ("", _) "c"; +drv_root (20, t); % root at top! +draw drv_tree; +endfig; +\end{Verbatim} +\columnbreak + +\begin{gather*} +\textcolor{mygrey}{\frac{\quad}{}\textit{math axis}\frac{\quad}{}} +\drv{drv-guide.533} +\end{gather*} +\end{multicols} +\noindent Then again, you can state constraints specifying the relative +positioning (e.g., the overlapping) of trees before \texttt{drv\_freeze} is +called\label{code-overlapping}. +\begin{Verbatim} +drv_left_delimiter "\downarrow"; +drv_right_delimiter "\uparrow"; + +beginfig(540) +% first tree +jgm 10 "A\vdash D"; +Nfr 10 (11, 14) ("\circ", "h\circ (g\circ f)", "", 1); + dcl 11 (12, 13) ("\circ", 1) "A\vdash C"; + dcl 12 () ("f", 2) "A\vdash B"; + dcl 13 () ("g", 3) "B\vdash C"; + dcl 14 () ("h", 4) "C\vdash D"; +% second tree +jgm 20 "\phantom{A\vdash D}"; % hidden judgment +Nfr 20 (21, 22) ("\circ", "", "(h\circ g)\circ f", 1); + dcl 21 () ("f", 2) "A\vdash B"; + dcl 22 (23, 24) ("\circ", 1) "B\vdash D"; + dcl 23 () ("g", 3) "B\vdash C"; + dcl 24 () ("h", 4) "C\vdash D"; +drv_root (20, t); % root at top! +% overlapping +jdg[10].c=jdg[20].c; +draw drv_tree; +endfig; +\end{Verbatim} +(The resulting figure is in Appendix~\ref{sec-gallery} on +page~\pageref{fig-overlapping}.) +% +% +\section{Radial mode (beta version)\label{sec-radial}} +% +% +A few more tuning macros (see~\S~\ref{sec-tunings}) are available that allow +you to manipulate \emph{radial} trees rather than ``linear'' ones. +% +% +\subsection*{\texttt{drv\_radial\_mode}} +% +% +\texttt{drv\_radial\_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.550}& +\drv{drv-guide.552}&\\[4ex] +\drv{drv-guide.551}& +\drv{drv-guide.553}& +\end{array} +\end{gather*} +% +% +\subsection*{\texttt{drv\_scale (crv, {\rm ---})}} +% +% +\texttt{drv\_scale (crv, \param{float})}\\ +\begin{tabular}{lll} +{\tt crv}& scale identifier\\ +\param{float}&scale value&\default[: 1] +\end{tabular} +% +% +\begin{gather*} +\begin{array}{*{4}{@{}>{\centering}p{.25\textwidth}}@{}l@{}} +\texttt{0.5}& +\texttt{1}& +\texttt{2}& +\texttt{4}&\\[1ex] +\drv{drv-guide.560}& +\drv{drv-guide.561}& +\drv{drv-guide.562}& +\drv{drv-guide.563}& +\end{array} +\end{gather*} +% +% +\enlargethispage{1.75\baselineskip}% +\subsection*{\texttt{drv\_azimuth}} +% +% +\texttt{drv\_azimuth \param{float}}\\ +\begin{tabular}{lll} +\param{float}&azimuth degree&\default[: 90] +\end{tabular} +% +% +\begin{gather*} +\begin{array}{*{3}{@{}>{\centering}p{.33\textwidth}}@{}l@{}} +\texttt{120}& +\texttt{90}& +\texttt{60}&\\[1ex] +\drv{drv-guide.570}& +\drv{drv-guide.571}& +\drv{drv-guide.572}& +\end{array} +\end{gather*} +The azimuth of a derivation tree is that of the central point of its root +judgment. Notice that both \texttt{drv\_scale (crv, {\rm ---})} and +\texttt{drv\_azimuth} are irrelevant when not in radial mode. +% +% +\begin{gather*} +\drv{drv-guide.580} +\end{gather*} +% +% +\subsection*{User specified junction and alignment styles (tricky)} +% +% +When in radial mode, \texttt{drv} composes derivation trees by stating +\emph{angular} constraints rather than horizontal ones. To this end, three +distinguished angles are associated with each component \param{cpn}, namely +\texttt{\param{cpn}.lng}, \texttt{\param{cpn}.cng} and \texttt{\param{cpn}.rng} +that refer to the relative angles of \texttt{\param{cpn}.l}, +\texttt{\param{cpn}.c} and \texttt{\param{cpn}.r} respectively. (Radial +constraints are essentially the same as vertical ones; however, each component +comes also with a radius \texttt{\param{cpn}.rad} and an origin point +\texttt{\param{cpn}.org}.) + +You can prevent \texttt{drv} from stating angular 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}). +Then again, you have to state your own constraints. As an example, compare the +code below with the one for figure~510 on page~\pageref{fig-510}. +% +% +\begin{Verbatim}[commandchars=\\\{\}] +beginfig(590) % "\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 +sbj[1][1].cng=sbj[0][1].cng; +\resplap{}sbj[1][1].lng=sbj[0][1].rng; +sbj[2][1].cng=sbj[1][1].cng; +\resplap{}sbj[2][1].lng=sbj[1][1].rng; +draw drv_tree; +endfig; +\end{Verbatim} +\begin{gather*} +\drv{drv-guide.590}\quad\text{resp.}\quad\drv{drv-guide.591} +\end{gather*} +% +% +\section{Gallery\label{sec-gallery}} +% +% +Here are two simple derivation trees (figures~600,~601). +\begin{gather*} +\drv{drv-guide.600}\quad +\drv{drv-guide.601} +\end{gather*} +% +% +Here are the \texttt{drv} version of a derivation tree found +in~\cite[p.~57]{restall06} and an alternative for it (figures~610,~611). +\begin{gather*} +\drv{drv-guide.610} +\end{gather*} +\begin{gather*} +\drv{drv-guide.611} +\end{gather*} +% +% +Here are overlapping trees with opposite directions (figure~540, code on +page~\pageref{code-overlapping}). +\begin{gather*} +\drv{drv-guide.540}\label{fig-overlapping} +\end{gather*} % % -Here is the \texttt{drv.mp} version of a derivation tree found -in~\cite[p.~86]{roegel02} (figure~540). +Here is the \texttt{drv} version of a derivation tree found +in~\cite[p.~86]{roegel02} (figure~620). \begin{gather*} -\drv{drv-guide.540} +\drv{drv-guide.620} \end{gather*} % % -Here are the \texttt{drv.mp} versions of derivations trees found -in~\cite[p.~50]{lutz06} (figures~550,~551). +Here are the \texttt{drv} versions of derivation trees found +in~\cite[p.~50]{lutz06} (figures~630,~631). \begin{gather*} -\drv{drv-guide.550}\quad\to\quad\drv{drv-guide.551} +\drv{drv-guide.630}\quad\to\quad\drv{drv-guide.631} \end{gather*} % % -Here is a continued fraction composed by \texttt{drv.mp} (figure~560). +Here is a continued fraction (figure~640). \begin{gather*} -\drv{drv-guide.560} +\drv{drv-guide.640} \end{gather*} % % @@ -1858,7 +2170,7 @@ metapost/contrib/macros/metaobj/}{\texttt{metaobj.mp}} \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}); +(Peter M\o ller \textsc{Neergaard} and Arne John \textsc{Glenstrup}); \item \href{http://www.utdallas.edu/~hamlen/projects.html} {\texttt{trfrac.sty}} @@ -1869,6 +2181,6 @@ metapost/contrib/macros/metaobj/}{\texttt{metaobj.mp}} (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. +``\href{http://www.logicmatters.net/latex-for-logicians/} +{\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 index 69f2f9f72c7..a5791649f82 100644 --- a/Master/texmf-dist/doc/metapost/drv/doc/drv.mp +++ b/Master/texmf-dist/doc/metapost/drv/doc/drv.mp @@ -1,5 +1,5 @@ -%% drv.mp 0.94 -%% Copyright 2009 Laurent M\'ehats +%% drv 0.95 +%% Copyright 2010 Laurent M\'ehats % % This work may be distributed and/or modified under the % conditions of the LaTeX Project Public License, either version 1.3 @@ -16,6 +16,9 @@ % % This work consists of the file drv.mp +newinternal drv_version; +drv_version:=0.95; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % @@ -142,8 +145,9 @@ % <str> LaTeX math-style command % % drv_scale (<id>, <float>) -% <id> scale identifier (clr, prm, jdg or ilb) +% <id> scale identifier (clr, crv, prm, jdg or ilb) % clr nice explanation soon (see examples) +% crv nice explanation soon (see examples) % prm nice explanation soon (see examples) % jdg nice explanation soon (see examples) % ilb nice explanation soon (see examples) @@ -217,6 +221,15 @@ % on % off % +% drv_radial_mode <id> +% <id> status identifier (on or off) +% on +% off +% +% drv_azimuth <float> +% <float> azimuth degree +% +% % * Derivation tree pictures % ========================== % @@ -234,6 +247,12 @@ % <path> MetaPost path expression % <id> path style identifier (0, 1, 2, 3, 4, 5 or 6) % +% drv_root (<nat>, <id>) +% <nat> root index +% <id> position identifier (t or b) +% t top +% b bottom +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -250,9 +269,8 @@ vardef drv_format (expr str, fst_len, nxt_len, dbl_pcs)= % 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; + save str_len, sub_len, aux_len, chr_rnk, occ_num, aux_str, chr; 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; @@ -315,6 +333,8 @@ vardef drv_errmessage expr str= errmessage drv_format (drv_context&str, 77, 79, false); enddef; +drv_message "version "&decimal drv_version&"."; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % @@ -488,11 +508,23 @@ picture tt_dgt[][]; 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_fontdimen[] expr font= - save dim_pct; + save dim_pct, dim_str; picture dim_pct; - dim_pct:=drv_tex[0] ("\rule{\the\fontdimen"&(decimal @)&font&"}{0bp}"); - width dim_pct + string dim_str; + dim_pct:=drv_tex[0] ("\mbox{\the\fontdimen"&(decimal @)&font&"}"); + dim_str:="0"; + for tok within dim_pct: + dim_str:=dim_str&(textpart tok); + endfor + scantokens dim_str enddef; vardef drv_font_size expr size_str= @@ -530,11 +562,11 @@ vardef drv_font_size expr size_str= 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] "\,"; + sp_pct:=drv_tex[mth_sty] "\thinspace"; thn_sp[mth_sty]:=width sp_pct; - sp_pct:=drv_tex[mth_sty] "\>"; + sp_pct:=drv_tex[mth_sty] "\medspace"; med_sp[mth_sty]:=width sp_pct; - sp_pct:=drv_tex[mth_sty] "\;"; + sp_pct:=drv_tex[mth_sty] "\thickspace"; thk_sp[mth_sty]:=width sp_pct; pdt_pct:=drv_tex[mth_sty] "\ldotp"; pdt_hg[mth_sty]:=height pdt_pct; @@ -588,6 +620,7 @@ vardef drv_box text STR= expandafter pair scantokens str.r; expandafter numeric scantokens str.hg; expandafter numeric scantokens str.dp; + drv_arc str; endfor enddef; @@ -606,6 +639,119 @@ enddef; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % +% drv-arcs +% + +vardef drv_arc text STR= + for str=STR: + expandafter numeric scantokens str.rad; + expandafter numeric scantokens str.lng; + expandafter numeric scantokens str.cng; + expandafter numeric scantokens str.rng; + expandafter pair scantokens str.org; + endfor +enddef; + +vardef arc_init @# (expr pct, ngl)= + @#:=pct; + @#.rng-@#.lng=ngl; + @#.cng=(@#.lng+@#.rng)/2; +enddef; + +vardef arc_freeze @#= + @#:=@# rotated @#.lng shifted @#.org; + @#.l:=(dir @#.lng) scaled @#.rad shifted @#.org; + @#.c:=(dir @#.cng) scaled @#.rad shifted @#.org; + @#.r:=(dir @#.rng) scaled @#.rad shifted @#.org; +enddef; + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Polar coordinates, angles & text torsion +% + +vardef rad_part expr ppt= + xpart ppt +enddef; + +vardef ngl_part expr ppt= + ypart ppt +enddef; + +vardef minrad (expr ppt_a, ppt_b)= + min (rad_part ppt_a, rad_part ppt_b) +enddef; + +% "tnum" (turning number) argument: +% -1: clockwise +% 1: counterclockwise + +vardef lmost_ppt (expr ppt_a, ppt_b) expr tnum= + if tnum*(ngl_part ppt_a)<tnum*(ngl_part ppt_b): + ppt_a + else: + ppt_b + fi +enddef; + +vardef rmost_ppt (expr ppt_a, ppt_b) expr tnum= + if tnum*(ngl_part ppt_a)>tnum*(ngl_part ppt_b): + ppt_a + else: + ppt_b + fi +enddef; + +vardef arc_angle (expr rad, arc_len) expr tnum= + if rad>0: + save pth; + path pth; + pth:=fullcircle scaled (2*rad); + tnum*(angle point (arctime arc_len of pth) of pth) + else: + 0 + fi +enddef; + +vardef circ_path (expr rad, ngl) expr tnum= + save pth; + path pth; + pth:=if tnum=-1: reverse fi fullcircle scaled (2*rad); + subpath (0, directiontime (dir (ngl+tnum*90)) of pth) of pth +enddef; + +vardef text_arc (expr pct, rad) expr tnum= + save arc_pct, tok_str, tok_trn, tok_ngl, hlf_wd, chr_pct; + picture arc_pct, chr_pct; + numeric tok_ngl, hlf_wd; + string tok_str; + arc_pct:=nullpicture; + for tok within pct: + transform tok_trn; + tok_str:=textpart tok; + (0, 0) transformed tok_trn=(0, 0); + (0, 1) transformed tok_trn=(xypart tok, yypart tok); + (1, 0) transformed tok_trn=(xxpart tok, yxpart tok); + tok_ngl:=arc_angle (rad, xpart tok) tnum; + for chr_rnk=0 upto (length tok_str-1): + chr_pct:=substring (chr_rnk, chr_rnk+1) of tok_str infont (fontpart tok) + transformed tok_trn; + hlf_wd:=(width chr_pct)/2; + tok_ngl:=tok_ngl+arc_angle (rad, hlf_wd) tnum; + addto arc_pct also chr_pct + shifted (-hlf_wd, 0) + rotated (tok_ngl+tnum*90) + shifted ((dir tok_ngl) scaled (rad-tnum*(ypart tok))); + tok_ngl:=tok_ngl+arc_angle (rad, hlf_wd) tnum; + endfor + endfor + arc_pct +enddef; + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % beginfig & endfig % @@ -637,14 +783,17 @@ vardef drv_beginfig= % iln_sty[i] inference line style % l_prm[i] leftmost `graphical' premise index % r_prm[i] rightmost `graphical' premise index + % bot_jdg[i] boolean % numeric prm_num[], prm[][], ccl[]; numeric jct_sty[]; string alg_sty[]; numeric iln_sty[]; numeric l_prm[], r_prm[]; + boolean bot_jdg[]; % % nfr_min_x[i] inference minimal x + % nfr_lmost_ppt[i] inference leftmost polar point % l_dlb[i] left delimiter label drv-box % l_dlm[i] left delimiter drv-box % l_ilb[i] left label drv-box @@ -653,22 +802,31 @@ vardef drv_beginfig= % r_dlm[i] right delimiter drv-box % r_dlb[i] right delimiter label drv-box % nfr_max_x[i] inference maximal x + % nfr_rmost_ppt[i] inference rightmost polar point % numeric nfr_min_x[]; + pair nfr_lmost_ppt[]; drv_box "l_dlb[]", "l_dlm[]", "l_ilb[]"; drv_box "iln[]"; drv_box "r_ilb[]", "r_dlm[]", "r_dlb[]"; numeric nfr_max_x[]; + pair nfr_rmost_ppt[]; % % Sub-trees % % sub_min_x[i] sub-tree minimal x + % sub_lmost_ppt[i] sub-tree leftmost polar point % sub_max_x[i] sub-tree maximal x + % sub_rmost_ppt[i] sub-tree rightmost polar point % sub_min_y[i] sub-tree minimal y + % sub_min_rad[i] sub-tree minimal radius % sub_max_y[i] sub-tree maximal y + % sub_max_rad[i] sub-tree maximal radius % boxed[i] boolean % numeric sub_min_x[], sub_max_x[], sub_min_y[], sub_max_y[]; + pair sub_lmost_ppt[], sub_rmost_ppt[]; + numeric sub_min_rad[], sub_max_rad[]; boolean boxed[]; % % Pen initialization @@ -953,8 +1111,8 @@ vardef NFR[] (text PRM) (expr lilb, rilb, ldlb, rdlb) % % PRM: list of premise indices % - save prm_rnk; - numeric prm_rnk; + save prm_rnk, root_rnk; + numeric prm_rnk, root_rnk; prm_rnk:=0; for prm_idx=PRM: if prm_idx=@: @@ -971,8 +1129,6 @@ vardef NFR[] (text PRM) (expr lilb, rilb, ldlb, rdlb) % % roots list update % - save root_rnk; - numeric root_rnk; root_rnk:=0; forever: exitif root[root_rnk]=prm_idx; @@ -1324,24 +1480,46 @@ string drv_rdlm_str; % right delimiter LaTeX code % 2. Macros % -vardef minmax_y[]=( - if drv_bot_roots: +vardef min_y[]= + if bot_jdg[@]: if known ccl[@]: ypart jdg[@].c-num_hg+iln_hg[(iln_sty[ccl[@]])] +min_clr_scl*min_clr[drv_sty]/2 else: sub_min_y[@]-min_clr_scl*min_clr[drv_sty] - fi, + fi + else: + sub_min_y[@]-min_clr_scl*min_clr[drv_sty] + fi +enddef; + +vardef max_y[]= + if bot_jdg[@]: sub_max_y[@]+min_clr_scl*min_clr[drv_sty] else: - sub_min_y[@]-min_clr_scl*min_clr[drv_sty], if known ccl[@]: ypart jdg[@].c-den_dp+iln_dp[(iln_sty[ccl[@]])] -min_clr_scl*min_clr[drv_sty]/2 else: sub_max_y[@]+min_clr_scl*min_clr[drv_sty] fi - fi) + fi +enddef; + +vardef min_rad[]= + if known ccl[@]: + if bot_jdg[@]: + jdg[@].rad-num_hg+iln_hg[(iln_sty[ccl[@]])] + else: + jdg[@].rad+den_dp-iln_dp[(iln_sty[ccl[@]])] + fi+min_clr_scl*min_clr[drv_sty]/2 + else: + sub_min_rad[@]-min_clr_scl*min_clr[drv_sty] + fi +enddef; + +vardef max_rad[]= + sub_max_rad[@]+min_clr_scl*min_clr[drv_sty] enddef; vardef delim @# expr dlm_len= @@ -1394,6 +1572,10 @@ boolean drv_boxmode_on; % boolean drv_fractionmode_on; % string drv_axis_ref; % +boolean drv_radialmode_on; % +numeric crv_scl; % +numeric azimuth_ngl; % + % % 2. Macros % @@ -1410,7 +1592,7 @@ vardef fraction_inference[]= and drv_fractionmode_on enddef; -vardef drv_check_root[]= +vardef drv_bot_check[]= if unknown jdg[@]: drv_errhelp "An index must be used to declare a both a judgment and an"& " inference."; @@ -1425,29 +1607,56 @@ vardef drv_check_root[]= save i_sty, prm_idx; numeric i_sty, prm_idx; i_sty:=iln_sty[@]; + bot_jdg[@]:=true; for prm_rnk=0 upto prm_num[@]-1: prm_idx:=prm[@][prm_rnk]; - drv_check_root[prm_idx]; + drv_bot_check[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 + num_hg:=max (num_hg, + iln_hg[i_sty]+min_clr_scl*min_clr[drv_sty]-jdg[prm_idx].dp); 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 + den_dp:=min (den_dp, + iln_dp[i_sty]-min_clr_scl*min_clr[drv_sty]-jdg[@].hg); + fi + if unknown boxed[@]: + boxed[@]:=drv_boxmode_on; + fi + fi +enddef; + +vardef drv_top_check[]= + 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[@]; + bot_jdg[@]:=false; + for prm_rnk=0 upto prm_num[@]-1: + prm_idx:=prm[@][prm_rnk]; + drv_top_check[prm_idx]; + % + % numerators and denominators clearances + % The TEXbook, Appendix G, Rule 15d. + % + den_dp:=min (den_dp, + iln_dp[i_sty]-min_clr_scl*min_clr[drv_sty]-jdg[prm_idx].hg); + endfor + if not fraction_inference[@]: + num_hg:=max (num_hg, + iln_hg[i_sty]+min_clr_scl*min_clr[drv_sty]-jdg[@].dp); fi if unknown boxed[@]: boxed[@]:=drv_boxmode_on; @@ -1455,24 +1664,42 @@ vardef drv_check_root[]= fi enddef; +vardef drv_root (expr idx) (suffix pos_sfx)= + save root_idx; + numeric root_idx; + root_idx:=idx; + forever: + exitif unknown ccl[root_idx]; + root_idx:=ccl[root_idx]; + endfor + if idx<>root_idx: + drv_message "warning, "&(decimal idx)&" is not a root index"& + " (the actual root index is "&(decimal root_idx)&")."; + fi + bot_jdg[root_idx]:=check_position_bot (pos_sfx) (drv_bot_roots); +enddef; + vardef drv_check= if root_num=0: drv_errhelp "Well ..."; drv_errmessage "no inference has been declared"; else: - save root_idx; + save root_idx, root_str; numeric root_idx; - root_idx:=root[0]; - drv_check_root[root_idx]; + string root_str; + for root_rnk=0 upto root_num-1: + root_idx:=root[root_rnk]; + if unknown bot_jdg[root_idx]: + bot_jdg[root_idx]:=drv_bot_roots; + fi + if bot_jdg[root_idx]: + drv_bot_check[root_idx]; + else: + drv_top_check[root_idx]; + fi + root_str:=if root_rnk>0: root_str&", "& fi decimal root_idx; + endfor if root_num>1: - save root_str; - string root_str; - root_str:=decimal root_idx; - for root_rnk=1 upto root_num-1: - root_idx:=root[root_rnk]; - drv_check_root[root_idx]; - root_str:=root_str&", "&(decimal root_idx); - endfor drv_message "warning, multiple root indices ("&root_str&")."; fi fi @@ -1483,11 +1710,11 @@ enddef; % Building % -vardef drv_build_root[]= +vardef drv_lin_build[]= % % orientation % - if drv_bot_roots: + if bot_jdg[@]: ypart iln[@].c=ypart jdg[@].c-den_dp; sub_min_y[@]:=ypart jdg[@].c+jdg[@].dp; sub_max_y[@]:= @@ -1498,8 +1725,8 @@ vardef drv_build_root[]= fi; for prm_rnk=0 upto prm_num[@]-1: ypart jdg[prm[@][prm_rnk]].c=ypart iln[@].c+num_hg; - drv_build_root[prm[@][prm_rnk]]; - sub_max_y[@]:=max(sub_max_y[@], sub_max_y[prm[@][prm_rnk]]); + drv_lin_build[prm[@][prm_rnk]]; + sub_max_y[@]:=max (sub_max_y[@], sub_max_y[prm[@][prm_rnk]]); endfor else: ypart iln[@].c=ypart jdg[@].c-num_hg; @@ -1512,18 +1739,16 @@ vardef drv_build_root[]= sub_max_y[@]:=ypart jdg[@].c+jdg[@].hg; for prm_rnk=0 upto prm_num[@]-1: ypart jdg[prm[@][prm_rnk]].c=ypart iln[@].c+den_dp; - drv_build_root[prm[@][prm_rnk]]; - sub_min_y[@]:=min(sub_min_y[@], sub_min_y[prm[@][prm_rnk]]); + drv_lin_build[prm[@][prm_rnk]]; + sub_min_y[@]:=min (sub_min_y[@], sub_min_y[prm[@][prm_rnk]]); endfor fi % % premises junction (from left to right) % - for prm_rnk=1 upto prm_num[@]-1: - save l_lmost, l_rmost, r_lmost, r_rmost; - save l_max_x, r_min_x, min_skp; - numeric l_lmost, l_rmost, r_lmost, r_rmost; - numeric l_max_x, r_min_x, min_skp[]; + save l_lmost, l_rmost, r_lmost, r_rmost, l_max_x, r_min_x, min_skp; + numeric l_lmost, l_rmost, r_lmost, r_rmost, l_max_x, r_min_x, min_skp[]; + for prm_rnk=1 upto prm_num[@]-1: l_lmost:=prm[@][0]; l_rmost:=prm[@][prm_rnk-1]; r_lmost:=prm[@][prm_rnk]; @@ -1537,9 +1762,9 @@ vardef drv_build_root[]= l_rmost:=r_prm[l_rmost]; r_lmost:=l_prm[r_lmost]; r_rmost:=r_prm[r_rmost]; - l_max_x:=max(l_max_x, nfr_max_x[l_rmost]); - r_min_x:=min(r_min_x, nfr_min_x[r_lmost]); - min_skp[0]:=min(min_skp[0], nfr_min_x[r_lmost]-nfr_max_x[l_rmost]); + l_max_x:=max (l_max_x, nfr_max_x[l_rmost]); + r_min_x:=min (r_min_x, nfr_min_x[r_lmost]); + min_skp[0]:=min (min_skp[0], nfr_min_x[r_lmost]-nfr_max_x[l_rmost]); endfor min_skp[1]:=r_min_x-l_max_x; if known r_prm[l_rmost]: @@ -1583,8 +1808,8 @@ vardef drv_build_root[]= elseif alg_sty[@]="r": xpart jdg[@].r=r_xref; fi - nfr_min_x[@]:=min(xpart jdg[@].l, l_xref); - nfr_max_x[@]:=max(xpart jdg[@].r, r_xref); + nfr_min_x[@]:=min (xpart jdg[@].l, l_xref); + nfr_max_x[@]:=max (xpart jdg[@].r, r_xref); fi % % inference line @@ -1612,14 +1837,14 @@ vardef drv_build_root[]= if known l_ilb[@]: l_ilb[@].r=iln[@].l shifted (-ilb_skp_scl*ilb_skp[drv_sty], 0); nfr_min_x[@]:=xpart l_ilb[@].l; - sub_min_y[@]:=min(sub_min_y[@], ypart l_ilb[@].c+l_ilb[@].dp); - sub_max_y[@]:=max(sub_max_y[@], ypart l_ilb[@].c+l_ilb[@].hg); + sub_min_y[@]:=min (sub_min_y[@], ypart l_ilb[@].c+l_ilb[@].dp); + sub_max_y[@]:=max (sub_max_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); nfr_max_x[@]:=xpart r_ilb[@].r; - sub_min_y[@]:=min(sub_min_y[@], ypart r_ilb[@].c+r_ilb[@].dp); - sub_max_y[@]:=max(sub_max_y[@], ypart r_ilb[@].c+r_ilb[@].hg); + sub_min_y[@]:=min (sub_min_y[@], ypart r_ilb[@].c+r_ilb[@].dp); + sub_max_y[@]:=max (sub_max_y[@], ypart r_ilb[@].c+r_ilb[@].hg); fi % % phantom steps @@ -1628,29 +1853,29 @@ vardef drv_build_root[]= save bot_y, top_y, phm_pct; numeric bot_y, top_y; picture phm_pct; - if drv_bot_roots: - bot_y:=xpart minmax_y[@]+min_clr_scl*min_clr[drv_sty]/2; - top_y:=xpart minmax_y[tgt[@]]; + if bot_jdg[@]: + bot_y:=min_y[@]+min_clr_scl*min_clr[drv_sty]/2; + top_y:=min_y[tgt[@]]; else: - bot_y:=ypart minmax_y[tgt[@]]; - top_y:=ypart minmax_y[@]-min_clr_scl*min_clr[drv_sty]/2; + bot_y:=max_y[tgt[@]]; + top_y:=max_y[@]-min_clr_scl*min_clr[drv_sty]/2; fi phm_pct:=((0, (bot_y-top_y)/2)--(0, (top_y-bot_y)/2)) drv_styled phm_sty[@]; box_init phm[@] (phm_pct shifted ((width phm_pct)/2, 0)); phm[@].c=(xpart jdg[@].c, (top_y+bot_y)/2); - nfr_min_x[@]:=min(nfr_min_x[@], xpart phm[@].l); - nfr_max_x[@]:=max(nfr_max_x[@], xpart phm[@].r); + nfr_min_x[@]:=min (nfr_min_x[@], xpart phm[@].l); + nfr_max_x[@]:=max (nfr_max_x[@], xpart phm[@].r); % % phantom steps labels % if known l_plb[@]: l_plb[@].r=phm[@].l shifted (-plb_skp[drv_sty], 0); - nfr_min_x[@]:=min(nfr_min_x[@], xpart l_plb[@].l); + nfr_min_x[@]:=min (nfr_min_x[@], xpart l_plb[@].l); fi if known r_plb[@]: r_plb[@].l=phm[@].r shifted ( plb_skp[drv_sty], 0); - nfr_max_x[@]:=max(nfr_max_x[@], xpart r_plb[@].r); + nfr_max_x[@]:=max (nfr_max_x[@], xpart r_plb[@].r); fi fi % @@ -1659,28 +1884,26 @@ vardef drv_build_root[]= sub_min_x[@]:=nfr_min_x[@]; sub_max_x[@]:=nfr_max_x[@]; for prm_rnk=0 upto prm_num[@]-1: - sub_min_x[@]:=min(sub_min_x[@], sub_min_x[prm[@][prm_rnk]]); - sub_max_x[@]:=max(sub_max_x[@], sub_max_x[prm[@][prm_rnk]]); + sub_min_x[@]:=min (sub_min_x[@], sub_min_x[prm[@][prm_rnk]]); + sub_max_x[@]:=max (sub_max_x[@], sub_max_x[prm[@][prm_rnk]]); endfor % % delimiters % if known l_dlb[@] or known r_dlb[@]: - save mmy, min_y, max_y; - numeric min_y, max_y; - pair mmy; - mmy:=minmax_y[@]; - min_y:=xpart mmy; - max_y:=ypart mmy; + save miny, maxy; + numeric miny, maxy; + miny:=min_y[@]; + maxy:=max_y[@]; if known l_dlb[@]: - box_init l_dlm[@] (delim l (max_y-min_y)); - l_dlm[@].r=(sub_min_x[@], (max_y+min_y)/2); + box_init l_dlm[@] (delim l (maxy-miny)); + l_dlm[@].r=(sub_min_x[@], (maxy+miny)/2); l_dlb[@].r=l_dlm[@].l; sub_min_x[@]:=xpart l_dlb[@].l; fi if known r_dlb[@]: - box_init r_dlm[@] (delim r (max_y-min_y)); - r_dlm[@].l=(sub_max_x[@], (max_y+min_y)/2); + box_init r_dlm[@] (delim r (maxy-miny)); + r_dlm[@].l=(sub_max_x[@], (maxy+miny)/2); r_dlb[@].l=r_dlm[@].r; sub_max_x[@]:=xpart r_dlb[@].r; fi @@ -1707,13 +1930,372 @@ vardef drv_build_root[]= fi enddef; +vardef drv_rad_build[]= + for sbj_rnk=0 upto (sbj_num[@]-1): + sbj[@][sbj_rnk].rad=jdg[@].rad; + sbj[@][sbj_rnk].org=jdg[@].org; + endfor + % + % orientation + % + if bot_jdg[@]: + iln[@].rad=jdg[@].rad-den_dp; + iln[@].org=jdg[@].org; + sub_min_rad[@]:=jdg[@].rad+jdg[@].dp; + sub_max_rad[@]:= + if iln_sty[@]=0: + jdg[@].rad+jdg[@].hg + else: + iln[@].rad+iln_hg[iln_sty[@]] + fi; + for prm_rnk=0 upto prm_num[@]-1: + jdg[prm[@][prm_rnk]].rad=iln[@].rad+num_hg; + jdg[prm[@][prm_rnk]].org=iln[@].org; + drv_rad_build[prm[@][prm_rnk]]; + sub_max_rad[@]:=max (sub_max_rad[@], sub_max_rad[prm[@][prm_rnk]]); + endfor + else: + iln[@].rad=jdg[@].rad+num_hg; + iln[@].org=jdg[@].org; + sub_min_rad[@]:=jdg[@].rad-jdg[@].hg; + sub_max_rad[@]:= + if iln_sty[@]=0: + jdg[@].rad-jdg[@].dp + else: + iln[@].rad-iln_dp[iln_sty[@]] + fi; + for prm_rnk=0 upto prm_num[@]-1: + jdg[prm[@][prm_rnk]].rad=iln[@].rad-den_dp; + jdg[prm[@][prm_rnk]].org=iln[@].org; + drv_rad_build[prm[@][prm_rnk]]; + sub_max_rad[@]:=max (sub_max_rad[@], sub_max_rad[prm[@][prm_rnk]]); + endfor; + fi + % + % inference labels + % + if known l_ilb[@]: + l_ilb[@].rad=iln[@].rad; + l_ilb[@].org=iln[@].org; + sub_max_rad[@]:=max (sub_max_rad[@], + l_ilb[@].rad if bot_jdg[@]: +l_ilb[@].hg else: -l_ilb[@].dp fi); + fi + if known r_ilb[@]: + r_ilb[@].rad=iln[@].rad; + r_ilb[@].org=iln[@].org; + sub_max_rad[@]:=max (sub_max_rad[@], + r_ilb[@].rad if bot_jdg[@]: +r_ilb[@].hg else: -r_ilb[@].dp fi); + fi + % + % phantom steps + % + if known tgt[@]: + save src_rad, tgt_rad; + numeric src_rad, tgt_rad; + src_rad:=min_rad[@]+min_clr_scl*min_clr[drv_sty]/2; + tgt_rad:=min_rad[tgt[@]]; + phm[@].rad=(src_rad+tgt_rad)/2; + phm[@].org=jdg[@].org; + % + % phantom steps labels + % + if known l_plb[@]: + l_plb[@].rad=phm[@].rad; + l_plb[@].org=phm[@].org; + fi + if known r_plb[@]: + r_plb[@].rad=phm[@].rad; + r_plb[@].org=phm[@].org; + fi + fi + % + % delimiters + % + if known l_dlb[@] or known r_dlb[@]: + save minr, maxr; + numeric minr, maxr; + minr:=min_rad[@]; + maxr:=max_rad[@]; + if known l_dlb[@]: + l_dlm[@].rad=(minr+maxr)/2; + l_dlb[@].rad=l_dlm[@].rad; + l_dlb[@].org=l_dlm[@].org=jdg[@].org; + fi + if known r_dlb[@]: + r_dlm[@].rad=(minr+maxr)/2; + r_dlb[@].rad=r_dlm[@].rad; + r_dlb[@].org=r_dlm[@].org=jdg[@].org; + fi + fi +enddef; + +vardef drv_ngl_build[]= + for prm_rnk=0 upto prm_num[@]-1: + drv_ngl_build[prm[@][prm_rnk]]; + endfor + save tnum; + numeric tnum; + tnum:=if bot_jdg[@]: - fi 1; % turning number + % + % judgment arc + % + save jdg_pct, jdg_ngl; + picture jdg_pct; + numeric jdg_ngl; + jdg_pct:=nullpicture; + jdg_ngl:=0; + for sbj_rnk=0 upto (sbj_num[@]-1): + arc_init sbj[@][sbj_rnk] + (text_arc (sbj[@][sbj_rnk], sbj[@][sbj_rnk].rad) tnum, + arc_angle (sbj[@][sbj_rnk].rad, width sbj[@][sbj_rnk]) tnum); + if sbj_rnk>0: % non mandatory test + sbj[@][sbj_rnk-1].rng=sbj[@][sbj_rnk].lng;% irrelevant if rnk=0 + fi + addto jdg_pct also sbj[@][sbj_rnk] rotated jdg_ngl; + jdg_ngl:=jdg_ngl+sbj[@][sbj_rnk].rng-sbj[@][sbj_rnk].lng; + endfor + arc_init jdg[@] (jdg_pct, jdg_ngl); + if sbj_num[@]>0: % non mandatory test + jdg[@].lng=sbj[@][0].lng; % irrelevant if sbj_num=0 + fi + % + % premises junction (from left to right) + % + save l_lmost, l_rmost, r_lmost, r_rmost, l_rmost_ppt, r_lmost_ppt, ppt_skp; + numeric l_lmost, l_rmost, r_lmost, r_rmost; + pair l_rmost_ppt, r_lmost_ppt, ppt_skp[]; + for prm_rnk=1 upto prm_num[@]-1: + l_lmost:=prm[@][0]; + l_rmost:=prm[@][prm_rnk-1]; + r_lmost:=prm[@][prm_rnk]; + r_rmost:=prm[@][prm_rnk]; + l_rmost_ppt:=nfr_rmost_ppt[l_rmost]; + r_lmost_ppt:=nfr_lmost_ppt[r_lmost]; + ppt_skp[0]:=(minrad (l_rmost_ppt, r_lmost_ppt), + (ngl_part r_lmost_ppt)-(ngl_part l_rmost_ppt)); + forever: + exitif (unknown r_prm[l_rmost]) or (unknown l_prm[r_lmost]); + l_lmost:=l_prm[l_lmost]; + l_rmost:=r_prm[l_rmost]; + r_lmost:=l_prm[r_lmost]; + r_rmost:=r_prm[r_rmost]; + l_rmost_ppt:=rmost_ppt (l_rmost_ppt, nfr_rmost_ppt[l_rmost]) tnum; + r_lmost_ppt:=lmost_ppt (r_lmost_ppt, nfr_lmost_ppt[r_lmost]) tnum; + ppt_skp[0]:=rmost_ppt (ppt_skp[0], (minrad (l_rmost_ppt, r_lmost_ppt), + (ngl_part r_lmost_ppt)-(ngl_part l_rmost_ppt))) tnum; + endfor + ppt_skp[1]:=(minrad (l_rmost_ppt, r_lmost_ppt), + (ngl_part r_lmost_ppt)-(ngl_part l_rmost_ppt)); + if known r_prm[l_rmost]: + r_prm[r_rmost]:=r_prm[l_rmost]; + l_rmost_ppt:=sub_rmost_ppt[l_rmost]; + elseif known l_prm[r_lmost]: + l_prm[l_lmost]:=l_prm[r_lmost]; + r_lmost_ppt:=sub_lmost_ppt[r_lmost]; + fi + ppt_skp[2]:=(minrad (l_rmost_ppt, r_lmost_ppt), + (ngl_part r_lmost_ppt)-(ngl_part l_rmost_ppt)); + if jct_sty[@]<3: + (ngl_part ppt_skp[jct_sty[@]])= + arc_angle(rad_part ppt_skp[jct_sty[@]], + prm_skp_scl*prm_skp[drv_sty]) tnum; + fi + endfor + % + % judgment alignment + % + if prm_num[@]=0: + nfr_lmost_ppt[@]:=(jdg[@].rad, jdg[@].lng); + nfr_rmost_ppt[@]:=(jdg[@].rad, jdg[@].rng); + else: + l_prm[@]:=prm[@][0]; + r_prm[@]:=prm[@][prm_num[@]-1]; + save l_ngl_ref, r_ngl_ref; + numeric l_ngl_ref, r_ngl_ref; + l_ngl_ref= + if boxed[l_prm[@]]: + ngl_part sub_lmost_ppt[l_prm[@]] + else: + jdg[l_prm[@]].lng + fi; + r_ngl_ref= + if boxed[r_prm[@]]: + ngl_part sub_rmost_ppt[r_prm[@]] + else: + jdg[r_prm[@]].rng + fi; + if alg_sty[@]="l": + jdg[@].lng=l_ngl_ref; + elseif alg_sty[@]="c": + jdg[@].cng=(l_ngl_ref+r_ngl_ref)/2; + elseif alg_sty[@]="r": + jdg[@].rng=r_ngl_ref; + fi + nfr_lmost_ppt[@]:=( + jdg[@].rad, + tnum*min (tnum*jdg[@].lng, tnum*l_ngl_ref)); + nfr_rmost_ppt[@]:=( + jdg[@].rad, + tnum*max (tnum*jdg[@].rng, tnum*r_ngl_ref)); + fi + % + % inference line + % + save iln_ngl; + numeric iln_ngl; + iln_ngl:=2*(arc_angle(iln[@].rad, + jdg_skp_scl*jdg_skp[jdg_sty[drv_sty]]) tnum) + +(ngl_part nfr_rmost_ppt[@]) + -(ngl_part nfr_lmost_ppt[@]); + arc_init iln[@] + ((circ_path (iln[@].rad, iln_ngl) tnum) drv_styled iln_sty[@], iln_ngl); + iln[@].hg=iln_hg[iln_sty[@]]; + iln[@].dp=iln_dp[iln_sty[@]]; + iln[@].cng=((ngl_part nfr_lmost_ppt[@])+(ngl_part nfr_rmost_ppt[@]))/2; + if iln_sty[@]>0: + nfr_lmost_ppt[@]:=(iln[@].rad, iln[@].lng); + nfr_rmost_ppt[@]:=(iln[@].rad, iln[@].rng); + fi + % + % inference labels + % + if known l_ilb[@]: + arc_init l_ilb[@]( + text_arc (l_ilb[@], l_ilb[@].rad) tnum, + arc_angle (l_ilb[@].rad, width l_ilb[@]) tnum); + l_ilb[@].rng=iln[@].lng + -arc_angle (l_ilb[@].rad, ilb_skp_scl*ilb_skp[drv_sty]) tnum; + nfr_lmost_ppt[@]:=(l_ilb[@].rad, l_ilb[@].lng); + fi + if known r_ilb[@]: + arc_init r_ilb[@]( + text_arc (r_ilb[@], r_ilb[@].rad) tnum, + arc_angle (r_ilb[@].rad, width r_ilb[@]) tnum); + r_ilb[@].lng=iln[@].rng + +arc_angle (r_ilb[@].rad, ilb_skp_scl*ilb_skp[drv_sty]) tnum; + nfr_rmost_ppt[@]:=(r_ilb[@].rad, r_ilb[@].rng); + fi + % + % phantom steps + % + if known tgt[@]: + save phm_pct, src_rad, tgt_rad; + picture phm_pct; + numeric src_rad, tgt_rad; + src_rad:=min_rad[@]+min_clr_scl*min_clr[drv_sty]/2; + tgt_rad:=min_rad[tgt[@]]; + phm_pct:=((0, (src_rad-tgt_rad)/2)--(0, (tgt_rad-src_rad)/2)) + drv_styled phm_sty[@]; + arc_init phm[@] ( + phm_pct + rotated (tnum*90+arc_angle (phm[@].rad, (width phm_pct)/2) tnum) + shifted ((dir 0) scaled phm[@].rad), + arc_angle (phm[@].rad, width phm_pct) tnum); + phm[@].cng=jdg[@].cng; + nfr_lmost_ppt[@]:=lmost_ppt (nfr_lmost_ppt[@], + (phm[@].rad, phm[@].lng)) tnum; + nfr_rmost_ppt[@]:=rmost_ppt (nfr_rmost_ppt[@], + (phm[@].rad, phm[@].rng)) tnum; + % + % phantom steps labels + % + if known l_plb[@]: + arc_init l_plb[@]( + text_arc (l_plb[@], l_plb[@].rad) tnum, + arc_angle (l_plb[@].rad, width l_plb[@]) tnum); + l_plb[@].rng=phm[@].lng + -arc_angle (l_plb[@].rad, plb_skp[drv_sty]) tnum; + nfr_lmost_ppt[@]:= + lmost_ppt(nfr_lmost_ppt[@], (l_plb[@].rad, l_plb[@].lng)) tnum; + fi + if known r_plb[@]: + arc_init r_plb[@]( + text_arc (r_plb[@], r_plb[@].rad) tnum, + arc_angle (r_plb[@].rad, width r_plb[@]) tnum); + r_plb[@].lng=phm[@].rng + +arc_angle (r_plb[@].rad, plb_skp[drv_sty]) tnum; + nfr_rmost_ppt[@]:= + rmost_ppt(nfr_rmost_ppt[@], (r_plb[@].rad, r_plb[@].rng)) tnum; + fi + fi + % + % sub_lmost_ppt & sub_rmost_ppt + % + sub_lmost_ppt[@]:=nfr_lmost_ppt[@]; + sub_rmost_ppt[@]:=nfr_rmost_ppt[@]; + for prm_rnk=0 upto prm_num[@]-1: + sub_lmost_ppt[@]:= + lmost_ppt (sub_lmost_ppt[@], sub_lmost_ppt[prm[@][prm_rnk]]) tnum; + sub_rmost_ppt[@]:= + rmost_ppt (sub_rmost_ppt[@], sub_rmost_ppt[prm[@][prm_rnk]]) tnum; + endfor + % + % delimiters + % + if known l_dlb[@] or known r_dlb[@]: + save dlm_pct, minr, maxr; + picture dlm_pct; + numeric minr, maxr; + minr:=min_rad[@]; + maxr:=max_rad[@]; + if known l_dlb[@]: + dlm_pct:=delim l (maxr-minr); + arc_init l_dlm[@] ( + dlm_pct + rotated (tnum*90+arc_angle (l_dlm[@].rad, (width dlm_pct)/2) tnum) + shifted ((dir 0) scaled l_dlm[@].rad), + arc_angle (l_dlm[@].rad, width dlm_pct) tnum); + l_dlm[@].rng=ngl_part sub_lmost_ppt[@]; + arc_init l_dlb[@]( + text_arc (l_dlb[@], l_dlb[@].rad) tnum, + arc_angle (l_dlb[@].rad, width l_dlb[@]) tnum); + l_dlb[@].rng=l_dlm[@].lng; + sub_lmost_ppt[@]:= (l_dlb[@].rad, l_dlb[@].lng); + fi + if known r_dlb[@]: + dlm_pct:=delim r (maxr-minr); + arc_init r_dlm[@] ( + dlm_pct + rotated (tnum*90+arc_angle (r_dlm[@].rad, (width dlm_pct)/2) tnum) + shifted ((dir 0) scaled r_dlm[@].rad), + arc_angle (r_dlm[@].rad, width dlm_pct) tnum); + r_dlm[@].lng=ngl_part sub_rmost_ppt[@]; + arc_init r_dlb[@]( + text_arc (r_dlb[@], r_dlb[@].rad) tnum, + arc_angle (r_dlb[@].rad, width r_dlb[@]) tnum); + r_dlb[@].lng=r_dlm[@].rng; + sub_rmost_ppt[@]:=(r_dlb[@].rad, r_dlb[@].rng); + fi + fi + if (known l_dlb[@]) or boxed[@]: + save idx; + numeric idx; + idx:=@; + forever: + nfr_lmost_ppt[idx]:=sub_lmost_ppt[@]; + exitif unknown l_prm[idx]; + idx:=l_prm[idx]; + endfor + fi + if (known r_dlb[@]) or boxed[@]: + save idx; + numeric idx; + idx:=@; + forever: + nfr_rmost_ppt[idx]:=sub_rmost_ppt[@]; + exitif unknown r_prm[idx]; + idx:=r_prm[idx]; + endfor + fi +enddef; + % % Freezing % -vardef drv_freeze_root[]= +vardef drv_box_freeze[]= for prm_rnk=0 upto prm_num[@]-1: - drv_freeze_root[prm[@][prm_rnk]]; + drv_box_freeze[prm[@][prm_rnk]]; endfor for sbj_rnk=0 upto sbj_num[@]-1: box_freeze sbj[@][sbj_rnk]; @@ -1728,22 +2310,60 @@ vardef drv_freeze_root[]= endfor enddef; +vardef drv_arc_freeze[]= + for prm_rnk=0 upto prm_num[@]-1: + drv_arc_freeze[prm[@][prm_rnk]]; + endfor + for sbj_rnk=0 upto sbj_num[@]-1: + arc_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[@]: + arc_freeze sfx[@]; + fi + endfor +enddef; + vardef drv_freeze= if not drv_checked: drv_check; fi - save root_idx; - numeric root_idx; - for root_rnk=0 upto root_num-1: - root_idx:=root[root_rnk]; - drv_build_root[root_idx]; + save root_idx, tnum; + numeric root_idx, tnum; + % + % first root + % + root_idx:=root[0]; + if drv_radialmode_on: + drv_rad_build[root_idx]; + if unknown jdg[root_idx].rad: + jdg[root_idx].rad=10(num_hg-den_dp)/crv_scl; + fi + drv_ngl_build[root_idx]; + tnum:=if bot_jdg[root_idx]: - fi 1; % turning number + if unknown jdg[root_idx].cng: + jdg[root_idx].cng=-tnum*azimuth_ngl; + fi + if unknown jdg[root_idx].org: + % + % default math axis + % + jdg[root_idx].org= + (dir -jdg[root_idx].cng) scaled (tnum*axis_hg[drv_sty]+ + if drv_axis_ref="iln": + iln[root_idx].rad + else: % drv_axis_ref="jdg" + jdg[root_idx].rad + fi); + fi + drv_arc_freeze[root_idx]; + else: + drv_lin_build[root_idx]; if unknown xpart jdg[root_idx].c: - if root_rnk=0: - xpart jdg[root_idx].c=0; - else: - sub_min_x[root_idx]=sub_max_x[root[root_rnk-1]] - +prm_skp_scl*prm_skp[drv_sty]; - fi + xpart jdg[root_idx].c=0; fi if unknown ypart jdg[root_idx].c: % @@ -1755,8 +2375,64 @@ vardef drv_freeze= ypart jdg[root_idx].c=axis_hg[drv_sty]; fi fi - drv_freeze_root[root_idx]; - endfor + drv_box_freeze[root_idx]; + fi + % + % other roots + % + if drv_radialmode_on: + save l_rmost_rad, l_rmost_ngl, r_lmost_rad, r_lmost_ngl; + numeric l_rmost_rad, l_rmost_ngl, r_lmost_rad, r_lmost_ngl; + for root_rnk=1 upto root_num-1: + root_idx:=root[root_rnk]; + drv_rad_build[root_idx]; + if unknown jdg[root_idx].rad: + jdg[root_idx].rad=10(num_hg-den_dp)/crv_scl; + fi + drv_ngl_build[root_idx]; + tnum:=if bot_jdg[root_idx]: - fi 1; % turning number + l_rmost_rad:=rad_part sub_rmost_ppt[root[root_rnk-1]]; + l_rmost_ngl:=ngl_part sub_rmost_ppt[root[root_rnk-1]]; + r_lmost_rad:=rad_part sub_lmost_ppt[root_idx]; + r_lmost_ngl:=ngl_part sub_lmost_ppt[root_idx]; + if unknown jdg[root_idx].cng: + r_lmost_ngl=l_rmost_ngl+ + if bot_jdg[root_idx]=bot_jdg[root[root_rnk-1]]: + arc_angle (min (r_lmost_rad, l_rmost_rad), + prm_skp_scl*prm_skp[drv_sty]) tnum + else: + 180 + fi; + fi + if unknown jdg[root_idx].org: + jdg[root_idx].org= + if bot_jdg[root_idx]=bot_jdg[root[root_rnk-1]]: + jdg[root[root_rnk-1]].org + else: + (dir l_rmost_ngl) + scaled jdg[root[root_rnk-1]].rad + shifted jdg[root[root_rnk-1]].org + shifted ((dir (l_rmost_ngl-tnum*90)) + scaled (prm_skp_scl*prm_skp[drv_sty])) + shifted ((dir l_rmost_ngl) scaled jdg[root_idx].rad) + fi; + fi + drv_arc_freeze[root_idx]; + endfor + else: + for root_rnk=1 upto root_num-1: + root_idx:=root[root_rnk]; + drv_lin_build[root_idx]; + if unknown xpart jdg[root_idx].c: + sub_min_x[root_idx]=sub_max_x[root[root_rnk-1]] + +prm_skp_scl*prm_skp[drv_sty]; + fi + if unknown ypart jdg[root_idx].c: + ypart jdg[root_idx].c=ypart jdg[root[root_rnk-1]].c; + fi + drv_box_freeze[root_idx]; + endfor + fi drv_frozen:=true; enddef; @@ -1870,32 +2546,57 @@ vardef drv_tree= 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: - sub_min_x[@] - fi-jdg_skp_scl*jdg_skp[jdg_sty[drv_sty]]; - max_x:= - if known r_dlm[@].l: - xpart l_dlm[@].l - else: - sub_max_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 + if drv_radialmode_on: + save l_ngl, r_ngl, tnum; + numeric l_ngl, r_ngl, tnum; + tnum:=if bot_jdg[@]: - fi 1; % turning number + l_ngl:= + if known l_dlm[@].rng: + l_dlm[@].rng-arc_angle + (l_dlm[@].rad, jdg_skp_scl*jdg_skp[jdg_sty[drv_sty]]) tnum + else: + (ngl_part sub_lmost_ppt[@])-arc_angle + (rad_part sub_lmost_ppt[@], + jdg_skp_scl*jdg_skp[jdg_sty[drv_sty]]) tnum + fi; + r_ngl:= + if known r_dlm[@].lng: + r_dlm[@].lng+arc_angle + (r_dlm[@].rad, jdg_skp_scl*jdg_skp[jdg_sty[drv_sty]]) tnum + else: + (ngl_part sub_rmost_ppt[@])+arc_angle + (rad_part sub_rmost_ppt[@], + jdg_skp_scl*jdg_skp[jdg_sty[drv_sty]]) tnum + fi; + (circ_path(max_rad[@], r_ngl-l_ngl) tnum-- + reverse circ_path(min_rad[@], r_ngl-l_ngl) tnum-- + cycle) rotated l_ngl shifted jdg[@].org + else: + save minx, maxx, miny, maxy; + numeric minx, maxx, maxy, miny; + minx:= + if known l_dlm[@].r: + xpart l_dlm[@].r + else: + sub_min_x[@] + fi-jdg_skp_scl*jdg_skp[jdg_sty[drv_sty]]; + maxx:= + if known r_dlm[@].l: + xpart l_dlm[@].l + else: + sub_max_x[@] + fi+jdg_skp_scl*jdg_skp[jdg_sty[drv_sty]]; + miny:=min_y[@]; + maxy:=max_y[@]; + (minx, miny)-- + (minx, maxy)-- + (maxx, maxy)-- + (maxx, miny)-- + cycle + fi enddef; vardef mth_axis @# (suffix ref_sfx) (expr idx)= @@ -1986,6 +2687,25 @@ vardef check_position_left (suffix pos_sfx) (expr default)= fi enddef; +vardef check_position_bot (suffix pos_sfx) (expr default)= + save pos_str; + string pos_str; + pos_str:=str pos_sfx; + if pos_str="t": + false + elseif pos_str="b": + true + else: + begingroup + drv_errhelp "Valid identifiers are"& + " t (top) and"& + " b (bottom)."; + drv_errmessage (pos_str&" is not a valid root position identifier"); + default + endgroup + fi +enddef; + vardef check_mode_on (suffix status_sfx) (expr default)= save status_str; string status_str; @@ -2027,7 +2747,7 @@ vardef drv_math_style (suffix typ_sfx) (expr sty_str)= else: forsuffixes sfx=scantokens (typ_str&"_sty"): for idx=0 upto 3: - sfx[idx]:=min(idx+sty_idx, 3); + sfx[idx]:=min (idx+sty_idx, 3); endfor endfor fi @@ -2046,12 +2766,15 @@ vardef drv_scale (suffix scl_sfx) (expr scl)= jdg_skp_scl:=scl; elseif (scl_str="ilb") or (scl_str="lbl"): % "lbl" is deprecated ilb_skp_scl:=scl; + elseif scl_str="crv": + crv_scl:=scl; else: drv_errhelp "Valid identifiers are"& " clr,"& " prm,"& - " jdg and"& - " ilb."; + " jdg,"& + " ilb and"& + " crv."; drv_errmessage (scl_str&" is not a valid scale identifier"); fi enddef; @@ -2104,19 +2827,7 @@ vardef drv_labels_position text ARG= 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 + drv_bot_roots:=check_position_bot (pos_sfx) (drv_bot_roots); enddef; vardef drv_axis_reference suffix ref_sfx= @@ -2161,6 +2872,14 @@ vardef drv_proof_mode suffix status_sfx= drv_proofmode_on:=check_mode_on (status_sfx, drv_proofmode_on); enddef; +vardef drv_radial_mode suffix status_sfx= + drv_radialmode_on:=check_mode_on (status_sfx, drv_radialmode_on); +enddef; + +vardef drv_azimuth expr ngl= + azimuth_ngl:=ngl; +enddef; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % @@ -2192,6 +2911,10 @@ drv_box_mode off; drv_fraction_mode on; drv_proof_mode off; +drv_radial_mode off; +drv_scale (crv, 1); +drv_azimuth 90; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % diff --git a/Master/texmf-dist/doc/metapost/drv/doc/makefile b/Master/texmf-dist/doc/metapost/drv/doc/makefile index ce2f2b8c6cf..05796563275 100644 --- a/Master/texmf-dist/doc/metapost/drv/doc/makefile +++ b/Master/texmf-dist/doc/metapost/drv/doc/makefile @@ -2,6 +2,8 @@ MAIN= drv-guide $(MAIN).pdf: $(MAIN).ps ps2pdf $(MAIN).ps + pdfopt $(MAIN).pdf $(MAIN)-opt.pdf + mv $(MAIN)-opt.pdf $(MAIN).pdf $(MAIN).ps: $(MAIN).tex $(MAIN)-delayed.mp latex $(MAIN) diff --git a/Master/texmf-dist/doc/metapost/drv/doc/readme.txt b/Master/texmf-dist/doc/metapost/drv/doc/readme.sh index 66f2719391a..e9d55e741d5 100644 --- a/Master/texmf-dist/doc/metapost/drv/doc/readme.txt +++ b/Master/texmf-dist/doc/metapost/drv/doc/readme.sh @@ -1,4 +1,5 @@ -# In order to compile the sources and to get a pdf file, use `make' or: +# In order to compile the sources and to get a pdf file, +# use `make' or `./readme.sh' or: # 1. run metapost THREE TIMES: mpost drv-guide.mp diff --git a/Master/texmf-dist/doc/metapost/drv/drv-guide.pdf b/Master/texmf-dist/doc/metapost/drv/drv-guide.pdf Binary files differindex 8b1cf44c736..6f16b8ecd87 100644 --- a/Master/texmf-dist/doc/metapost/drv/drv-guide.pdf +++ b/Master/texmf-dist/doc/metapost/drv/drv-guide.pdf diff --git a/Master/texmf-dist/doc/metapost/drv/sample/drv.mp b/Master/texmf-dist/doc/metapost/drv/sample/drv.mp index 69f2f9f72c7..a5791649f82 100644 --- a/Master/texmf-dist/doc/metapost/drv/sample/drv.mp +++ b/Master/texmf-dist/doc/metapost/drv/sample/drv.mp @@ -1,5 +1,5 @@ -%% drv.mp 0.94 -%% Copyright 2009 Laurent M\'ehats +%% drv 0.95 +%% Copyright 2010 Laurent M\'ehats % % This work may be distributed and/or modified under the % conditions of the LaTeX Project Public License, either version 1.3 @@ -16,6 +16,9 @@ % % This work consists of the file drv.mp +newinternal drv_version; +drv_version:=0.95; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % @@ -142,8 +145,9 @@ % <str> LaTeX math-style command % % drv_scale (<id>, <float>) -% <id> scale identifier (clr, prm, jdg or ilb) +% <id> scale identifier (clr, crv, prm, jdg or ilb) % clr nice explanation soon (see examples) +% crv nice explanation soon (see examples) % prm nice explanation soon (see examples) % jdg nice explanation soon (see examples) % ilb nice explanation soon (see examples) @@ -217,6 +221,15 @@ % on % off % +% drv_radial_mode <id> +% <id> status identifier (on or off) +% on +% off +% +% drv_azimuth <float> +% <float> azimuth degree +% +% % * Derivation tree pictures % ========================== % @@ -234,6 +247,12 @@ % <path> MetaPost path expression % <id> path style identifier (0, 1, 2, 3, 4, 5 or 6) % +% drv_root (<nat>, <id>) +% <nat> root index +% <id> position identifier (t or b) +% t top +% b bottom +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -250,9 +269,8 @@ vardef drv_format (expr str, fst_len, nxt_len, dbl_pcs)= % 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; + save str_len, sub_len, aux_len, chr_rnk, occ_num, aux_str, chr; 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; @@ -315,6 +333,8 @@ vardef drv_errmessage expr str= errmessage drv_format (drv_context&str, 77, 79, false); enddef; +drv_message "version "&decimal drv_version&"."; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % @@ -488,11 +508,23 @@ picture tt_dgt[][]; 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_fontdimen[] expr font= - save dim_pct; + save dim_pct, dim_str; picture dim_pct; - dim_pct:=drv_tex[0] ("\rule{\the\fontdimen"&(decimal @)&font&"}{0bp}"); - width dim_pct + string dim_str; + dim_pct:=drv_tex[0] ("\mbox{\the\fontdimen"&(decimal @)&font&"}"); + dim_str:="0"; + for tok within dim_pct: + dim_str:=dim_str&(textpart tok); + endfor + scantokens dim_str enddef; vardef drv_font_size expr size_str= @@ -530,11 +562,11 @@ vardef drv_font_size expr size_str= 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] "\,"; + sp_pct:=drv_tex[mth_sty] "\thinspace"; thn_sp[mth_sty]:=width sp_pct; - sp_pct:=drv_tex[mth_sty] "\>"; + sp_pct:=drv_tex[mth_sty] "\medspace"; med_sp[mth_sty]:=width sp_pct; - sp_pct:=drv_tex[mth_sty] "\;"; + sp_pct:=drv_tex[mth_sty] "\thickspace"; thk_sp[mth_sty]:=width sp_pct; pdt_pct:=drv_tex[mth_sty] "\ldotp"; pdt_hg[mth_sty]:=height pdt_pct; @@ -588,6 +620,7 @@ vardef drv_box text STR= expandafter pair scantokens str.r; expandafter numeric scantokens str.hg; expandafter numeric scantokens str.dp; + drv_arc str; endfor enddef; @@ -606,6 +639,119 @@ enddef; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % +% drv-arcs +% + +vardef drv_arc text STR= + for str=STR: + expandafter numeric scantokens str.rad; + expandafter numeric scantokens str.lng; + expandafter numeric scantokens str.cng; + expandafter numeric scantokens str.rng; + expandafter pair scantokens str.org; + endfor +enddef; + +vardef arc_init @# (expr pct, ngl)= + @#:=pct; + @#.rng-@#.lng=ngl; + @#.cng=(@#.lng+@#.rng)/2; +enddef; + +vardef arc_freeze @#= + @#:=@# rotated @#.lng shifted @#.org; + @#.l:=(dir @#.lng) scaled @#.rad shifted @#.org; + @#.c:=(dir @#.cng) scaled @#.rad shifted @#.org; + @#.r:=(dir @#.rng) scaled @#.rad shifted @#.org; +enddef; + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Polar coordinates, angles & text torsion +% + +vardef rad_part expr ppt= + xpart ppt +enddef; + +vardef ngl_part expr ppt= + ypart ppt +enddef; + +vardef minrad (expr ppt_a, ppt_b)= + min (rad_part ppt_a, rad_part ppt_b) +enddef; + +% "tnum" (turning number) argument: +% -1: clockwise +% 1: counterclockwise + +vardef lmost_ppt (expr ppt_a, ppt_b) expr tnum= + if tnum*(ngl_part ppt_a)<tnum*(ngl_part ppt_b): + ppt_a + else: + ppt_b + fi +enddef; + +vardef rmost_ppt (expr ppt_a, ppt_b) expr tnum= + if tnum*(ngl_part ppt_a)>tnum*(ngl_part ppt_b): + ppt_a + else: + ppt_b + fi +enddef; + +vardef arc_angle (expr rad, arc_len) expr tnum= + if rad>0: + save pth; + path pth; + pth:=fullcircle scaled (2*rad); + tnum*(angle point (arctime arc_len of pth) of pth) + else: + 0 + fi +enddef; + +vardef circ_path (expr rad, ngl) expr tnum= + save pth; + path pth; + pth:=if tnum=-1: reverse fi fullcircle scaled (2*rad); + subpath (0, directiontime (dir (ngl+tnum*90)) of pth) of pth +enddef; + +vardef text_arc (expr pct, rad) expr tnum= + save arc_pct, tok_str, tok_trn, tok_ngl, hlf_wd, chr_pct; + picture arc_pct, chr_pct; + numeric tok_ngl, hlf_wd; + string tok_str; + arc_pct:=nullpicture; + for tok within pct: + transform tok_trn; + tok_str:=textpart tok; + (0, 0) transformed tok_trn=(0, 0); + (0, 1) transformed tok_trn=(xypart tok, yypart tok); + (1, 0) transformed tok_trn=(xxpart tok, yxpart tok); + tok_ngl:=arc_angle (rad, xpart tok) tnum; + for chr_rnk=0 upto (length tok_str-1): + chr_pct:=substring (chr_rnk, chr_rnk+1) of tok_str infont (fontpart tok) + transformed tok_trn; + hlf_wd:=(width chr_pct)/2; + tok_ngl:=tok_ngl+arc_angle (rad, hlf_wd) tnum; + addto arc_pct also chr_pct + shifted (-hlf_wd, 0) + rotated (tok_ngl+tnum*90) + shifted ((dir tok_ngl) scaled (rad-tnum*(ypart tok))); + tok_ngl:=tok_ngl+arc_angle (rad, hlf_wd) tnum; + endfor + endfor + arc_pct +enddef; + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % beginfig & endfig % @@ -637,14 +783,17 @@ vardef drv_beginfig= % iln_sty[i] inference line style % l_prm[i] leftmost `graphical' premise index % r_prm[i] rightmost `graphical' premise index + % bot_jdg[i] boolean % numeric prm_num[], prm[][], ccl[]; numeric jct_sty[]; string alg_sty[]; numeric iln_sty[]; numeric l_prm[], r_prm[]; + boolean bot_jdg[]; % % nfr_min_x[i] inference minimal x + % nfr_lmost_ppt[i] inference leftmost polar point % l_dlb[i] left delimiter label drv-box % l_dlm[i] left delimiter drv-box % l_ilb[i] left label drv-box @@ -653,22 +802,31 @@ vardef drv_beginfig= % r_dlm[i] right delimiter drv-box % r_dlb[i] right delimiter label drv-box % nfr_max_x[i] inference maximal x + % nfr_rmost_ppt[i] inference rightmost polar point % numeric nfr_min_x[]; + pair nfr_lmost_ppt[]; drv_box "l_dlb[]", "l_dlm[]", "l_ilb[]"; drv_box "iln[]"; drv_box "r_ilb[]", "r_dlm[]", "r_dlb[]"; numeric nfr_max_x[]; + pair nfr_rmost_ppt[]; % % Sub-trees % % sub_min_x[i] sub-tree minimal x + % sub_lmost_ppt[i] sub-tree leftmost polar point % sub_max_x[i] sub-tree maximal x + % sub_rmost_ppt[i] sub-tree rightmost polar point % sub_min_y[i] sub-tree minimal y + % sub_min_rad[i] sub-tree minimal radius % sub_max_y[i] sub-tree maximal y + % sub_max_rad[i] sub-tree maximal radius % boxed[i] boolean % numeric sub_min_x[], sub_max_x[], sub_min_y[], sub_max_y[]; + pair sub_lmost_ppt[], sub_rmost_ppt[]; + numeric sub_min_rad[], sub_max_rad[]; boolean boxed[]; % % Pen initialization @@ -953,8 +1111,8 @@ vardef NFR[] (text PRM) (expr lilb, rilb, ldlb, rdlb) % % PRM: list of premise indices % - save prm_rnk; - numeric prm_rnk; + save prm_rnk, root_rnk; + numeric prm_rnk, root_rnk; prm_rnk:=0; for prm_idx=PRM: if prm_idx=@: @@ -971,8 +1129,6 @@ vardef NFR[] (text PRM) (expr lilb, rilb, ldlb, rdlb) % % roots list update % - save root_rnk; - numeric root_rnk; root_rnk:=0; forever: exitif root[root_rnk]=prm_idx; @@ -1324,24 +1480,46 @@ string drv_rdlm_str; % right delimiter LaTeX code % 2. Macros % -vardef minmax_y[]=( - if drv_bot_roots: +vardef min_y[]= + if bot_jdg[@]: if known ccl[@]: ypart jdg[@].c-num_hg+iln_hg[(iln_sty[ccl[@]])] +min_clr_scl*min_clr[drv_sty]/2 else: sub_min_y[@]-min_clr_scl*min_clr[drv_sty] - fi, + fi + else: + sub_min_y[@]-min_clr_scl*min_clr[drv_sty] + fi +enddef; + +vardef max_y[]= + if bot_jdg[@]: sub_max_y[@]+min_clr_scl*min_clr[drv_sty] else: - sub_min_y[@]-min_clr_scl*min_clr[drv_sty], if known ccl[@]: ypart jdg[@].c-den_dp+iln_dp[(iln_sty[ccl[@]])] -min_clr_scl*min_clr[drv_sty]/2 else: sub_max_y[@]+min_clr_scl*min_clr[drv_sty] fi - fi) + fi +enddef; + +vardef min_rad[]= + if known ccl[@]: + if bot_jdg[@]: + jdg[@].rad-num_hg+iln_hg[(iln_sty[ccl[@]])] + else: + jdg[@].rad+den_dp-iln_dp[(iln_sty[ccl[@]])] + fi+min_clr_scl*min_clr[drv_sty]/2 + else: + sub_min_rad[@]-min_clr_scl*min_clr[drv_sty] + fi +enddef; + +vardef max_rad[]= + sub_max_rad[@]+min_clr_scl*min_clr[drv_sty] enddef; vardef delim @# expr dlm_len= @@ -1394,6 +1572,10 @@ boolean drv_boxmode_on; % boolean drv_fractionmode_on; % string drv_axis_ref; % +boolean drv_radialmode_on; % +numeric crv_scl; % +numeric azimuth_ngl; % + % % 2. Macros % @@ -1410,7 +1592,7 @@ vardef fraction_inference[]= and drv_fractionmode_on enddef; -vardef drv_check_root[]= +vardef drv_bot_check[]= if unknown jdg[@]: drv_errhelp "An index must be used to declare a both a judgment and an"& " inference."; @@ -1425,29 +1607,56 @@ vardef drv_check_root[]= save i_sty, prm_idx; numeric i_sty, prm_idx; i_sty:=iln_sty[@]; + bot_jdg[@]:=true; for prm_rnk=0 upto prm_num[@]-1: prm_idx:=prm[@][prm_rnk]; - drv_check_root[prm_idx]; + drv_bot_check[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 + num_hg:=max (num_hg, + iln_hg[i_sty]+min_clr_scl*min_clr[drv_sty]-jdg[prm_idx].dp); 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 + den_dp:=min (den_dp, + iln_dp[i_sty]-min_clr_scl*min_clr[drv_sty]-jdg[@].hg); + fi + if unknown boxed[@]: + boxed[@]:=drv_boxmode_on; + fi + fi +enddef; + +vardef drv_top_check[]= + 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[@]; + bot_jdg[@]:=false; + for prm_rnk=0 upto prm_num[@]-1: + prm_idx:=prm[@][prm_rnk]; + drv_top_check[prm_idx]; + % + % numerators and denominators clearances + % The TEXbook, Appendix G, Rule 15d. + % + den_dp:=min (den_dp, + iln_dp[i_sty]-min_clr_scl*min_clr[drv_sty]-jdg[prm_idx].hg); + endfor + if not fraction_inference[@]: + num_hg:=max (num_hg, + iln_hg[i_sty]+min_clr_scl*min_clr[drv_sty]-jdg[@].dp); fi if unknown boxed[@]: boxed[@]:=drv_boxmode_on; @@ -1455,24 +1664,42 @@ vardef drv_check_root[]= fi enddef; +vardef drv_root (expr idx) (suffix pos_sfx)= + save root_idx; + numeric root_idx; + root_idx:=idx; + forever: + exitif unknown ccl[root_idx]; + root_idx:=ccl[root_idx]; + endfor + if idx<>root_idx: + drv_message "warning, "&(decimal idx)&" is not a root index"& + " (the actual root index is "&(decimal root_idx)&")."; + fi + bot_jdg[root_idx]:=check_position_bot (pos_sfx) (drv_bot_roots); +enddef; + vardef drv_check= if root_num=0: drv_errhelp "Well ..."; drv_errmessage "no inference has been declared"; else: - save root_idx; + save root_idx, root_str; numeric root_idx; - root_idx:=root[0]; - drv_check_root[root_idx]; + string root_str; + for root_rnk=0 upto root_num-1: + root_idx:=root[root_rnk]; + if unknown bot_jdg[root_idx]: + bot_jdg[root_idx]:=drv_bot_roots; + fi + if bot_jdg[root_idx]: + drv_bot_check[root_idx]; + else: + drv_top_check[root_idx]; + fi + root_str:=if root_rnk>0: root_str&", "& fi decimal root_idx; + endfor if root_num>1: - save root_str; - string root_str; - root_str:=decimal root_idx; - for root_rnk=1 upto root_num-1: - root_idx:=root[root_rnk]; - drv_check_root[root_idx]; - root_str:=root_str&", "&(decimal root_idx); - endfor drv_message "warning, multiple root indices ("&root_str&")."; fi fi @@ -1483,11 +1710,11 @@ enddef; % Building % -vardef drv_build_root[]= +vardef drv_lin_build[]= % % orientation % - if drv_bot_roots: + if bot_jdg[@]: ypart iln[@].c=ypart jdg[@].c-den_dp; sub_min_y[@]:=ypart jdg[@].c+jdg[@].dp; sub_max_y[@]:= @@ -1498,8 +1725,8 @@ vardef drv_build_root[]= fi; for prm_rnk=0 upto prm_num[@]-1: ypart jdg[prm[@][prm_rnk]].c=ypart iln[@].c+num_hg; - drv_build_root[prm[@][prm_rnk]]; - sub_max_y[@]:=max(sub_max_y[@], sub_max_y[prm[@][prm_rnk]]); + drv_lin_build[prm[@][prm_rnk]]; + sub_max_y[@]:=max (sub_max_y[@], sub_max_y[prm[@][prm_rnk]]); endfor else: ypart iln[@].c=ypart jdg[@].c-num_hg; @@ -1512,18 +1739,16 @@ vardef drv_build_root[]= sub_max_y[@]:=ypart jdg[@].c+jdg[@].hg; for prm_rnk=0 upto prm_num[@]-1: ypart jdg[prm[@][prm_rnk]].c=ypart iln[@].c+den_dp; - drv_build_root[prm[@][prm_rnk]]; - sub_min_y[@]:=min(sub_min_y[@], sub_min_y[prm[@][prm_rnk]]); + drv_lin_build[prm[@][prm_rnk]]; + sub_min_y[@]:=min (sub_min_y[@], sub_min_y[prm[@][prm_rnk]]); endfor fi % % premises junction (from left to right) % - for prm_rnk=1 upto prm_num[@]-1: - save l_lmost, l_rmost, r_lmost, r_rmost; - save l_max_x, r_min_x, min_skp; - numeric l_lmost, l_rmost, r_lmost, r_rmost; - numeric l_max_x, r_min_x, min_skp[]; + save l_lmost, l_rmost, r_lmost, r_rmost, l_max_x, r_min_x, min_skp; + numeric l_lmost, l_rmost, r_lmost, r_rmost, l_max_x, r_min_x, min_skp[]; + for prm_rnk=1 upto prm_num[@]-1: l_lmost:=prm[@][0]; l_rmost:=prm[@][prm_rnk-1]; r_lmost:=prm[@][prm_rnk]; @@ -1537,9 +1762,9 @@ vardef drv_build_root[]= l_rmost:=r_prm[l_rmost]; r_lmost:=l_prm[r_lmost]; r_rmost:=r_prm[r_rmost]; - l_max_x:=max(l_max_x, nfr_max_x[l_rmost]); - r_min_x:=min(r_min_x, nfr_min_x[r_lmost]); - min_skp[0]:=min(min_skp[0], nfr_min_x[r_lmost]-nfr_max_x[l_rmost]); + l_max_x:=max (l_max_x, nfr_max_x[l_rmost]); + r_min_x:=min (r_min_x, nfr_min_x[r_lmost]); + min_skp[0]:=min (min_skp[0], nfr_min_x[r_lmost]-nfr_max_x[l_rmost]); endfor min_skp[1]:=r_min_x-l_max_x; if known r_prm[l_rmost]: @@ -1583,8 +1808,8 @@ vardef drv_build_root[]= elseif alg_sty[@]="r": xpart jdg[@].r=r_xref; fi - nfr_min_x[@]:=min(xpart jdg[@].l, l_xref); - nfr_max_x[@]:=max(xpart jdg[@].r, r_xref); + nfr_min_x[@]:=min (xpart jdg[@].l, l_xref); + nfr_max_x[@]:=max (xpart jdg[@].r, r_xref); fi % % inference line @@ -1612,14 +1837,14 @@ vardef drv_build_root[]= if known l_ilb[@]: l_ilb[@].r=iln[@].l shifted (-ilb_skp_scl*ilb_skp[drv_sty], 0); nfr_min_x[@]:=xpart l_ilb[@].l; - sub_min_y[@]:=min(sub_min_y[@], ypart l_ilb[@].c+l_ilb[@].dp); - sub_max_y[@]:=max(sub_max_y[@], ypart l_ilb[@].c+l_ilb[@].hg); + sub_min_y[@]:=min (sub_min_y[@], ypart l_ilb[@].c+l_ilb[@].dp); + sub_max_y[@]:=max (sub_max_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); nfr_max_x[@]:=xpart r_ilb[@].r; - sub_min_y[@]:=min(sub_min_y[@], ypart r_ilb[@].c+r_ilb[@].dp); - sub_max_y[@]:=max(sub_max_y[@], ypart r_ilb[@].c+r_ilb[@].hg); + sub_min_y[@]:=min (sub_min_y[@], ypart r_ilb[@].c+r_ilb[@].dp); + sub_max_y[@]:=max (sub_max_y[@], ypart r_ilb[@].c+r_ilb[@].hg); fi % % phantom steps @@ -1628,29 +1853,29 @@ vardef drv_build_root[]= save bot_y, top_y, phm_pct; numeric bot_y, top_y; picture phm_pct; - if drv_bot_roots: - bot_y:=xpart minmax_y[@]+min_clr_scl*min_clr[drv_sty]/2; - top_y:=xpart minmax_y[tgt[@]]; + if bot_jdg[@]: + bot_y:=min_y[@]+min_clr_scl*min_clr[drv_sty]/2; + top_y:=min_y[tgt[@]]; else: - bot_y:=ypart minmax_y[tgt[@]]; - top_y:=ypart minmax_y[@]-min_clr_scl*min_clr[drv_sty]/2; + bot_y:=max_y[tgt[@]]; + top_y:=max_y[@]-min_clr_scl*min_clr[drv_sty]/2; fi phm_pct:=((0, (bot_y-top_y)/2)--(0, (top_y-bot_y)/2)) drv_styled phm_sty[@]; box_init phm[@] (phm_pct shifted ((width phm_pct)/2, 0)); phm[@].c=(xpart jdg[@].c, (top_y+bot_y)/2); - nfr_min_x[@]:=min(nfr_min_x[@], xpart phm[@].l); - nfr_max_x[@]:=max(nfr_max_x[@], xpart phm[@].r); + nfr_min_x[@]:=min (nfr_min_x[@], xpart phm[@].l); + nfr_max_x[@]:=max (nfr_max_x[@], xpart phm[@].r); % % phantom steps labels % if known l_plb[@]: l_plb[@].r=phm[@].l shifted (-plb_skp[drv_sty], 0); - nfr_min_x[@]:=min(nfr_min_x[@], xpart l_plb[@].l); + nfr_min_x[@]:=min (nfr_min_x[@], xpart l_plb[@].l); fi if known r_plb[@]: r_plb[@].l=phm[@].r shifted ( plb_skp[drv_sty], 0); - nfr_max_x[@]:=max(nfr_max_x[@], xpart r_plb[@].r); + nfr_max_x[@]:=max (nfr_max_x[@], xpart r_plb[@].r); fi fi % @@ -1659,28 +1884,26 @@ vardef drv_build_root[]= sub_min_x[@]:=nfr_min_x[@]; sub_max_x[@]:=nfr_max_x[@]; for prm_rnk=0 upto prm_num[@]-1: - sub_min_x[@]:=min(sub_min_x[@], sub_min_x[prm[@][prm_rnk]]); - sub_max_x[@]:=max(sub_max_x[@], sub_max_x[prm[@][prm_rnk]]); + sub_min_x[@]:=min (sub_min_x[@], sub_min_x[prm[@][prm_rnk]]); + sub_max_x[@]:=max (sub_max_x[@], sub_max_x[prm[@][prm_rnk]]); endfor % % delimiters % if known l_dlb[@] or known r_dlb[@]: - save mmy, min_y, max_y; - numeric min_y, max_y; - pair mmy; - mmy:=minmax_y[@]; - min_y:=xpart mmy; - max_y:=ypart mmy; + save miny, maxy; + numeric miny, maxy; + miny:=min_y[@]; + maxy:=max_y[@]; if known l_dlb[@]: - box_init l_dlm[@] (delim l (max_y-min_y)); - l_dlm[@].r=(sub_min_x[@], (max_y+min_y)/2); + box_init l_dlm[@] (delim l (maxy-miny)); + l_dlm[@].r=(sub_min_x[@], (maxy+miny)/2); l_dlb[@].r=l_dlm[@].l; sub_min_x[@]:=xpart l_dlb[@].l; fi if known r_dlb[@]: - box_init r_dlm[@] (delim r (max_y-min_y)); - r_dlm[@].l=(sub_max_x[@], (max_y+min_y)/2); + box_init r_dlm[@] (delim r (maxy-miny)); + r_dlm[@].l=(sub_max_x[@], (maxy+miny)/2); r_dlb[@].l=r_dlm[@].r; sub_max_x[@]:=xpart r_dlb[@].r; fi @@ -1707,13 +1930,372 @@ vardef drv_build_root[]= fi enddef; +vardef drv_rad_build[]= + for sbj_rnk=0 upto (sbj_num[@]-1): + sbj[@][sbj_rnk].rad=jdg[@].rad; + sbj[@][sbj_rnk].org=jdg[@].org; + endfor + % + % orientation + % + if bot_jdg[@]: + iln[@].rad=jdg[@].rad-den_dp; + iln[@].org=jdg[@].org; + sub_min_rad[@]:=jdg[@].rad+jdg[@].dp; + sub_max_rad[@]:= + if iln_sty[@]=0: + jdg[@].rad+jdg[@].hg + else: + iln[@].rad+iln_hg[iln_sty[@]] + fi; + for prm_rnk=0 upto prm_num[@]-1: + jdg[prm[@][prm_rnk]].rad=iln[@].rad+num_hg; + jdg[prm[@][prm_rnk]].org=iln[@].org; + drv_rad_build[prm[@][prm_rnk]]; + sub_max_rad[@]:=max (sub_max_rad[@], sub_max_rad[prm[@][prm_rnk]]); + endfor + else: + iln[@].rad=jdg[@].rad+num_hg; + iln[@].org=jdg[@].org; + sub_min_rad[@]:=jdg[@].rad-jdg[@].hg; + sub_max_rad[@]:= + if iln_sty[@]=0: + jdg[@].rad-jdg[@].dp + else: + iln[@].rad-iln_dp[iln_sty[@]] + fi; + for prm_rnk=0 upto prm_num[@]-1: + jdg[prm[@][prm_rnk]].rad=iln[@].rad-den_dp; + jdg[prm[@][prm_rnk]].org=iln[@].org; + drv_rad_build[prm[@][prm_rnk]]; + sub_max_rad[@]:=max (sub_max_rad[@], sub_max_rad[prm[@][prm_rnk]]); + endfor; + fi + % + % inference labels + % + if known l_ilb[@]: + l_ilb[@].rad=iln[@].rad; + l_ilb[@].org=iln[@].org; + sub_max_rad[@]:=max (sub_max_rad[@], + l_ilb[@].rad if bot_jdg[@]: +l_ilb[@].hg else: -l_ilb[@].dp fi); + fi + if known r_ilb[@]: + r_ilb[@].rad=iln[@].rad; + r_ilb[@].org=iln[@].org; + sub_max_rad[@]:=max (sub_max_rad[@], + r_ilb[@].rad if bot_jdg[@]: +r_ilb[@].hg else: -r_ilb[@].dp fi); + fi + % + % phantom steps + % + if known tgt[@]: + save src_rad, tgt_rad; + numeric src_rad, tgt_rad; + src_rad:=min_rad[@]+min_clr_scl*min_clr[drv_sty]/2; + tgt_rad:=min_rad[tgt[@]]; + phm[@].rad=(src_rad+tgt_rad)/2; + phm[@].org=jdg[@].org; + % + % phantom steps labels + % + if known l_plb[@]: + l_plb[@].rad=phm[@].rad; + l_plb[@].org=phm[@].org; + fi + if known r_plb[@]: + r_plb[@].rad=phm[@].rad; + r_plb[@].org=phm[@].org; + fi + fi + % + % delimiters + % + if known l_dlb[@] or known r_dlb[@]: + save minr, maxr; + numeric minr, maxr; + minr:=min_rad[@]; + maxr:=max_rad[@]; + if known l_dlb[@]: + l_dlm[@].rad=(minr+maxr)/2; + l_dlb[@].rad=l_dlm[@].rad; + l_dlb[@].org=l_dlm[@].org=jdg[@].org; + fi + if known r_dlb[@]: + r_dlm[@].rad=(minr+maxr)/2; + r_dlb[@].rad=r_dlm[@].rad; + r_dlb[@].org=r_dlm[@].org=jdg[@].org; + fi + fi +enddef; + +vardef drv_ngl_build[]= + for prm_rnk=0 upto prm_num[@]-1: + drv_ngl_build[prm[@][prm_rnk]]; + endfor + save tnum; + numeric tnum; + tnum:=if bot_jdg[@]: - fi 1; % turning number + % + % judgment arc + % + save jdg_pct, jdg_ngl; + picture jdg_pct; + numeric jdg_ngl; + jdg_pct:=nullpicture; + jdg_ngl:=0; + for sbj_rnk=0 upto (sbj_num[@]-1): + arc_init sbj[@][sbj_rnk] + (text_arc (sbj[@][sbj_rnk], sbj[@][sbj_rnk].rad) tnum, + arc_angle (sbj[@][sbj_rnk].rad, width sbj[@][sbj_rnk]) tnum); + if sbj_rnk>0: % non mandatory test + sbj[@][sbj_rnk-1].rng=sbj[@][sbj_rnk].lng;% irrelevant if rnk=0 + fi + addto jdg_pct also sbj[@][sbj_rnk] rotated jdg_ngl; + jdg_ngl:=jdg_ngl+sbj[@][sbj_rnk].rng-sbj[@][sbj_rnk].lng; + endfor + arc_init jdg[@] (jdg_pct, jdg_ngl); + if sbj_num[@]>0: % non mandatory test + jdg[@].lng=sbj[@][0].lng; % irrelevant if sbj_num=0 + fi + % + % premises junction (from left to right) + % + save l_lmost, l_rmost, r_lmost, r_rmost, l_rmost_ppt, r_lmost_ppt, ppt_skp; + numeric l_lmost, l_rmost, r_lmost, r_rmost; + pair l_rmost_ppt, r_lmost_ppt, ppt_skp[]; + for prm_rnk=1 upto prm_num[@]-1: + l_lmost:=prm[@][0]; + l_rmost:=prm[@][prm_rnk-1]; + r_lmost:=prm[@][prm_rnk]; + r_rmost:=prm[@][prm_rnk]; + l_rmost_ppt:=nfr_rmost_ppt[l_rmost]; + r_lmost_ppt:=nfr_lmost_ppt[r_lmost]; + ppt_skp[0]:=(minrad (l_rmost_ppt, r_lmost_ppt), + (ngl_part r_lmost_ppt)-(ngl_part l_rmost_ppt)); + forever: + exitif (unknown r_prm[l_rmost]) or (unknown l_prm[r_lmost]); + l_lmost:=l_prm[l_lmost]; + l_rmost:=r_prm[l_rmost]; + r_lmost:=l_prm[r_lmost]; + r_rmost:=r_prm[r_rmost]; + l_rmost_ppt:=rmost_ppt (l_rmost_ppt, nfr_rmost_ppt[l_rmost]) tnum; + r_lmost_ppt:=lmost_ppt (r_lmost_ppt, nfr_lmost_ppt[r_lmost]) tnum; + ppt_skp[0]:=rmost_ppt (ppt_skp[0], (minrad (l_rmost_ppt, r_lmost_ppt), + (ngl_part r_lmost_ppt)-(ngl_part l_rmost_ppt))) tnum; + endfor + ppt_skp[1]:=(minrad (l_rmost_ppt, r_lmost_ppt), + (ngl_part r_lmost_ppt)-(ngl_part l_rmost_ppt)); + if known r_prm[l_rmost]: + r_prm[r_rmost]:=r_prm[l_rmost]; + l_rmost_ppt:=sub_rmost_ppt[l_rmost]; + elseif known l_prm[r_lmost]: + l_prm[l_lmost]:=l_prm[r_lmost]; + r_lmost_ppt:=sub_lmost_ppt[r_lmost]; + fi + ppt_skp[2]:=(minrad (l_rmost_ppt, r_lmost_ppt), + (ngl_part r_lmost_ppt)-(ngl_part l_rmost_ppt)); + if jct_sty[@]<3: + (ngl_part ppt_skp[jct_sty[@]])= + arc_angle(rad_part ppt_skp[jct_sty[@]], + prm_skp_scl*prm_skp[drv_sty]) tnum; + fi + endfor + % + % judgment alignment + % + if prm_num[@]=0: + nfr_lmost_ppt[@]:=(jdg[@].rad, jdg[@].lng); + nfr_rmost_ppt[@]:=(jdg[@].rad, jdg[@].rng); + else: + l_prm[@]:=prm[@][0]; + r_prm[@]:=prm[@][prm_num[@]-1]; + save l_ngl_ref, r_ngl_ref; + numeric l_ngl_ref, r_ngl_ref; + l_ngl_ref= + if boxed[l_prm[@]]: + ngl_part sub_lmost_ppt[l_prm[@]] + else: + jdg[l_prm[@]].lng + fi; + r_ngl_ref= + if boxed[r_prm[@]]: + ngl_part sub_rmost_ppt[r_prm[@]] + else: + jdg[r_prm[@]].rng + fi; + if alg_sty[@]="l": + jdg[@].lng=l_ngl_ref; + elseif alg_sty[@]="c": + jdg[@].cng=(l_ngl_ref+r_ngl_ref)/2; + elseif alg_sty[@]="r": + jdg[@].rng=r_ngl_ref; + fi + nfr_lmost_ppt[@]:=( + jdg[@].rad, + tnum*min (tnum*jdg[@].lng, tnum*l_ngl_ref)); + nfr_rmost_ppt[@]:=( + jdg[@].rad, + tnum*max (tnum*jdg[@].rng, tnum*r_ngl_ref)); + fi + % + % inference line + % + save iln_ngl; + numeric iln_ngl; + iln_ngl:=2*(arc_angle(iln[@].rad, + jdg_skp_scl*jdg_skp[jdg_sty[drv_sty]]) tnum) + +(ngl_part nfr_rmost_ppt[@]) + -(ngl_part nfr_lmost_ppt[@]); + arc_init iln[@] + ((circ_path (iln[@].rad, iln_ngl) tnum) drv_styled iln_sty[@], iln_ngl); + iln[@].hg=iln_hg[iln_sty[@]]; + iln[@].dp=iln_dp[iln_sty[@]]; + iln[@].cng=((ngl_part nfr_lmost_ppt[@])+(ngl_part nfr_rmost_ppt[@]))/2; + if iln_sty[@]>0: + nfr_lmost_ppt[@]:=(iln[@].rad, iln[@].lng); + nfr_rmost_ppt[@]:=(iln[@].rad, iln[@].rng); + fi + % + % inference labels + % + if known l_ilb[@]: + arc_init l_ilb[@]( + text_arc (l_ilb[@], l_ilb[@].rad) tnum, + arc_angle (l_ilb[@].rad, width l_ilb[@]) tnum); + l_ilb[@].rng=iln[@].lng + -arc_angle (l_ilb[@].rad, ilb_skp_scl*ilb_skp[drv_sty]) tnum; + nfr_lmost_ppt[@]:=(l_ilb[@].rad, l_ilb[@].lng); + fi + if known r_ilb[@]: + arc_init r_ilb[@]( + text_arc (r_ilb[@], r_ilb[@].rad) tnum, + arc_angle (r_ilb[@].rad, width r_ilb[@]) tnum); + r_ilb[@].lng=iln[@].rng + +arc_angle (r_ilb[@].rad, ilb_skp_scl*ilb_skp[drv_sty]) tnum; + nfr_rmost_ppt[@]:=(r_ilb[@].rad, r_ilb[@].rng); + fi + % + % phantom steps + % + if known tgt[@]: + save phm_pct, src_rad, tgt_rad; + picture phm_pct; + numeric src_rad, tgt_rad; + src_rad:=min_rad[@]+min_clr_scl*min_clr[drv_sty]/2; + tgt_rad:=min_rad[tgt[@]]; + phm_pct:=((0, (src_rad-tgt_rad)/2)--(0, (tgt_rad-src_rad)/2)) + drv_styled phm_sty[@]; + arc_init phm[@] ( + phm_pct + rotated (tnum*90+arc_angle (phm[@].rad, (width phm_pct)/2) tnum) + shifted ((dir 0) scaled phm[@].rad), + arc_angle (phm[@].rad, width phm_pct) tnum); + phm[@].cng=jdg[@].cng; + nfr_lmost_ppt[@]:=lmost_ppt (nfr_lmost_ppt[@], + (phm[@].rad, phm[@].lng)) tnum; + nfr_rmost_ppt[@]:=rmost_ppt (nfr_rmost_ppt[@], + (phm[@].rad, phm[@].rng)) tnum; + % + % phantom steps labels + % + if known l_plb[@]: + arc_init l_plb[@]( + text_arc (l_plb[@], l_plb[@].rad) tnum, + arc_angle (l_plb[@].rad, width l_plb[@]) tnum); + l_plb[@].rng=phm[@].lng + -arc_angle (l_plb[@].rad, plb_skp[drv_sty]) tnum; + nfr_lmost_ppt[@]:= + lmost_ppt(nfr_lmost_ppt[@], (l_plb[@].rad, l_plb[@].lng)) tnum; + fi + if known r_plb[@]: + arc_init r_plb[@]( + text_arc (r_plb[@], r_plb[@].rad) tnum, + arc_angle (r_plb[@].rad, width r_plb[@]) tnum); + r_plb[@].lng=phm[@].rng + +arc_angle (r_plb[@].rad, plb_skp[drv_sty]) tnum; + nfr_rmost_ppt[@]:= + rmost_ppt(nfr_rmost_ppt[@], (r_plb[@].rad, r_plb[@].rng)) tnum; + fi + fi + % + % sub_lmost_ppt & sub_rmost_ppt + % + sub_lmost_ppt[@]:=nfr_lmost_ppt[@]; + sub_rmost_ppt[@]:=nfr_rmost_ppt[@]; + for prm_rnk=0 upto prm_num[@]-1: + sub_lmost_ppt[@]:= + lmost_ppt (sub_lmost_ppt[@], sub_lmost_ppt[prm[@][prm_rnk]]) tnum; + sub_rmost_ppt[@]:= + rmost_ppt (sub_rmost_ppt[@], sub_rmost_ppt[prm[@][prm_rnk]]) tnum; + endfor + % + % delimiters + % + if known l_dlb[@] or known r_dlb[@]: + save dlm_pct, minr, maxr; + picture dlm_pct; + numeric minr, maxr; + minr:=min_rad[@]; + maxr:=max_rad[@]; + if known l_dlb[@]: + dlm_pct:=delim l (maxr-minr); + arc_init l_dlm[@] ( + dlm_pct + rotated (tnum*90+arc_angle (l_dlm[@].rad, (width dlm_pct)/2) tnum) + shifted ((dir 0) scaled l_dlm[@].rad), + arc_angle (l_dlm[@].rad, width dlm_pct) tnum); + l_dlm[@].rng=ngl_part sub_lmost_ppt[@]; + arc_init l_dlb[@]( + text_arc (l_dlb[@], l_dlb[@].rad) tnum, + arc_angle (l_dlb[@].rad, width l_dlb[@]) tnum); + l_dlb[@].rng=l_dlm[@].lng; + sub_lmost_ppt[@]:= (l_dlb[@].rad, l_dlb[@].lng); + fi + if known r_dlb[@]: + dlm_pct:=delim r (maxr-minr); + arc_init r_dlm[@] ( + dlm_pct + rotated (tnum*90+arc_angle (r_dlm[@].rad, (width dlm_pct)/2) tnum) + shifted ((dir 0) scaled r_dlm[@].rad), + arc_angle (r_dlm[@].rad, width dlm_pct) tnum); + r_dlm[@].lng=ngl_part sub_rmost_ppt[@]; + arc_init r_dlb[@]( + text_arc (r_dlb[@], r_dlb[@].rad) tnum, + arc_angle (r_dlb[@].rad, width r_dlb[@]) tnum); + r_dlb[@].lng=r_dlm[@].rng; + sub_rmost_ppt[@]:=(r_dlb[@].rad, r_dlb[@].rng); + fi + fi + if (known l_dlb[@]) or boxed[@]: + save idx; + numeric idx; + idx:=@; + forever: + nfr_lmost_ppt[idx]:=sub_lmost_ppt[@]; + exitif unknown l_prm[idx]; + idx:=l_prm[idx]; + endfor + fi + if (known r_dlb[@]) or boxed[@]: + save idx; + numeric idx; + idx:=@; + forever: + nfr_rmost_ppt[idx]:=sub_rmost_ppt[@]; + exitif unknown r_prm[idx]; + idx:=r_prm[idx]; + endfor + fi +enddef; + % % Freezing % -vardef drv_freeze_root[]= +vardef drv_box_freeze[]= for prm_rnk=0 upto prm_num[@]-1: - drv_freeze_root[prm[@][prm_rnk]]; + drv_box_freeze[prm[@][prm_rnk]]; endfor for sbj_rnk=0 upto sbj_num[@]-1: box_freeze sbj[@][sbj_rnk]; @@ -1728,22 +2310,60 @@ vardef drv_freeze_root[]= endfor enddef; +vardef drv_arc_freeze[]= + for prm_rnk=0 upto prm_num[@]-1: + drv_arc_freeze[prm[@][prm_rnk]]; + endfor + for sbj_rnk=0 upto sbj_num[@]-1: + arc_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[@]: + arc_freeze sfx[@]; + fi + endfor +enddef; + vardef drv_freeze= if not drv_checked: drv_check; fi - save root_idx; - numeric root_idx; - for root_rnk=0 upto root_num-1: - root_idx:=root[root_rnk]; - drv_build_root[root_idx]; + save root_idx, tnum; + numeric root_idx, tnum; + % + % first root + % + root_idx:=root[0]; + if drv_radialmode_on: + drv_rad_build[root_idx]; + if unknown jdg[root_idx].rad: + jdg[root_idx].rad=10(num_hg-den_dp)/crv_scl; + fi + drv_ngl_build[root_idx]; + tnum:=if bot_jdg[root_idx]: - fi 1; % turning number + if unknown jdg[root_idx].cng: + jdg[root_idx].cng=-tnum*azimuth_ngl; + fi + if unknown jdg[root_idx].org: + % + % default math axis + % + jdg[root_idx].org= + (dir -jdg[root_idx].cng) scaled (tnum*axis_hg[drv_sty]+ + if drv_axis_ref="iln": + iln[root_idx].rad + else: % drv_axis_ref="jdg" + jdg[root_idx].rad + fi); + fi + drv_arc_freeze[root_idx]; + else: + drv_lin_build[root_idx]; if unknown xpart jdg[root_idx].c: - if root_rnk=0: - xpart jdg[root_idx].c=0; - else: - sub_min_x[root_idx]=sub_max_x[root[root_rnk-1]] - +prm_skp_scl*prm_skp[drv_sty]; - fi + xpart jdg[root_idx].c=0; fi if unknown ypart jdg[root_idx].c: % @@ -1755,8 +2375,64 @@ vardef drv_freeze= ypart jdg[root_idx].c=axis_hg[drv_sty]; fi fi - drv_freeze_root[root_idx]; - endfor + drv_box_freeze[root_idx]; + fi + % + % other roots + % + if drv_radialmode_on: + save l_rmost_rad, l_rmost_ngl, r_lmost_rad, r_lmost_ngl; + numeric l_rmost_rad, l_rmost_ngl, r_lmost_rad, r_lmost_ngl; + for root_rnk=1 upto root_num-1: + root_idx:=root[root_rnk]; + drv_rad_build[root_idx]; + if unknown jdg[root_idx].rad: + jdg[root_idx].rad=10(num_hg-den_dp)/crv_scl; + fi + drv_ngl_build[root_idx]; + tnum:=if bot_jdg[root_idx]: - fi 1; % turning number + l_rmost_rad:=rad_part sub_rmost_ppt[root[root_rnk-1]]; + l_rmost_ngl:=ngl_part sub_rmost_ppt[root[root_rnk-1]]; + r_lmost_rad:=rad_part sub_lmost_ppt[root_idx]; + r_lmost_ngl:=ngl_part sub_lmost_ppt[root_idx]; + if unknown jdg[root_idx].cng: + r_lmost_ngl=l_rmost_ngl+ + if bot_jdg[root_idx]=bot_jdg[root[root_rnk-1]]: + arc_angle (min (r_lmost_rad, l_rmost_rad), + prm_skp_scl*prm_skp[drv_sty]) tnum + else: + 180 + fi; + fi + if unknown jdg[root_idx].org: + jdg[root_idx].org= + if bot_jdg[root_idx]=bot_jdg[root[root_rnk-1]]: + jdg[root[root_rnk-1]].org + else: + (dir l_rmost_ngl) + scaled jdg[root[root_rnk-1]].rad + shifted jdg[root[root_rnk-1]].org + shifted ((dir (l_rmost_ngl-tnum*90)) + scaled (prm_skp_scl*prm_skp[drv_sty])) + shifted ((dir l_rmost_ngl) scaled jdg[root_idx].rad) + fi; + fi + drv_arc_freeze[root_idx]; + endfor + else: + for root_rnk=1 upto root_num-1: + root_idx:=root[root_rnk]; + drv_lin_build[root_idx]; + if unknown xpart jdg[root_idx].c: + sub_min_x[root_idx]=sub_max_x[root[root_rnk-1]] + +prm_skp_scl*prm_skp[drv_sty]; + fi + if unknown ypart jdg[root_idx].c: + ypart jdg[root_idx].c=ypart jdg[root[root_rnk-1]].c; + fi + drv_box_freeze[root_idx]; + endfor + fi drv_frozen:=true; enddef; @@ -1870,32 +2546,57 @@ vardef drv_tree= 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: - sub_min_x[@] - fi-jdg_skp_scl*jdg_skp[jdg_sty[drv_sty]]; - max_x:= - if known r_dlm[@].l: - xpart l_dlm[@].l - else: - sub_max_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 + if drv_radialmode_on: + save l_ngl, r_ngl, tnum; + numeric l_ngl, r_ngl, tnum; + tnum:=if bot_jdg[@]: - fi 1; % turning number + l_ngl:= + if known l_dlm[@].rng: + l_dlm[@].rng-arc_angle + (l_dlm[@].rad, jdg_skp_scl*jdg_skp[jdg_sty[drv_sty]]) tnum + else: + (ngl_part sub_lmost_ppt[@])-arc_angle + (rad_part sub_lmost_ppt[@], + jdg_skp_scl*jdg_skp[jdg_sty[drv_sty]]) tnum + fi; + r_ngl:= + if known r_dlm[@].lng: + r_dlm[@].lng+arc_angle + (r_dlm[@].rad, jdg_skp_scl*jdg_skp[jdg_sty[drv_sty]]) tnum + else: + (ngl_part sub_rmost_ppt[@])+arc_angle + (rad_part sub_rmost_ppt[@], + jdg_skp_scl*jdg_skp[jdg_sty[drv_sty]]) tnum + fi; + (circ_path(max_rad[@], r_ngl-l_ngl) tnum-- + reverse circ_path(min_rad[@], r_ngl-l_ngl) tnum-- + cycle) rotated l_ngl shifted jdg[@].org + else: + save minx, maxx, miny, maxy; + numeric minx, maxx, maxy, miny; + minx:= + if known l_dlm[@].r: + xpart l_dlm[@].r + else: + sub_min_x[@] + fi-jdg_skp_scl*jdg_skp[jdg_sty[drv_sty]]; + maxx:= + if known r_dlm[@].l: + xpart l_dlm[@].l + else: + sub_max_x[@] + fi+jdg_skp_scl*jdg_skp[jdg_sty[drv_sty]]; + miny:=min_y[@]; + maxy:=max_y[@]; + (minx, miny)-- + (minx, maxy)-- + (maxx, maxy)-- + (maxx, miny)-- + cycle + fi enddef; vardef mth_axis @# (suffix ref_sfx) (expr idx)= @@ -1986,6 +2687,25 @@ vardef check_position_left (suffix pos_sfx) (expr default)= fi enddef; +vardef check_position_bot (suffix pos_sfx) (expr default)= + save pos_str; + string pos_str; + pos_str:=str pos_sfx; + if pos_str="t": + false + elseif pos_str="b": + true + else: + begingroup + drv_errhelp "Valid identifiers are"& + " t (top) and"& + " b (bottom)."; + drv_errmessage (pos_str&" is not a valid root position identifier"); + default + endgroup + fi +enddef; + vardef check_mode_on (suffix status_sfx) (expr default)= save status_str; string status_str; @@ -2027,7 +2747,7 @@ vardef drv_math_style (suffix typ_sfx) (expr sty_str)= else: forsuffixes sfx=scantokens (typ_str&"_sty"): for idx=0 upto 3: - sfx[idx]:=min(idx+sty_idx, 3); + sfx[idx]:=min (idx+sty_idx, 3); endfor endfor fi @@ -2046,12 +2766,15 @@ vardef drv_scale (suffix scl_sfx) (expr scl)= jdg_skp_scl:=scl; elseif (scl_str="ilb") or (scl_str="lbl"): % "lbl" is deprecated ilb_skp_scl:=scl; + elseif scl_str="crv": + crv_scl:=scl; else: drv_errhelp "Valid identifiers are"& " clr,"& " prm,"& - " jdg and"& - " ilb."; + " jdg,"& + " ilb and"& + " crv."; drv_errmessage (scl_str&" is not a valid scale identifier"); fi enddef; @@ -2104,19 +2827,7 @@ vardef drv_labels_position text ARG= 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 + drv_bot_roots:=check_position_bot (pos_sfx) (drv_bot_roots); enddef; vardef drv_axis_reference suffix ref_sfx= @@ -2161,6 +2872,14 @@ vardef drv_proof_mode suffix status_sfx= drv_proofmode_on:=check_mode_on (status_sfx, drv_proofmode_on); enddef; +vardef drv_radial_mode suffix status_sfx= + drv_radialmode_on:=check_mode_on (status_sfx, drv_radialmode_on); +enddef; + +vardef drv_azimuth expr ngl= + azimuth_ngl:=ngl; +enddef; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % @@ -2192,6 +2911,10 @@ drv_box_mode off; drv_fraction_mode on; drv_proof_mode off; +drv_radial_mode off; +drv_scale (crv, 1); +drv_azimuth 90; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % diff --git a/Master/texmf-dist/doc/metapost/drv/sample/makefile b/Master/texmf-dist/doc/metapost/drv/sample/makefile index ab57ffe9ace..18f01e9eecb 100644 --- a/Master/texmf-dist/doc/metapost/drv/sample/makefile +++ b/Master/texmf-dist/doc/metapost/drv/sample/makefile @@ -2,9 +2,12 @@ MAIN= coq-sample $(MAIN).pdf: $(MAIN).ps ps2pdf $(MAIN).ps + pdfopt $(MAIN).pdf $(MAIN)-opt.pdf + mv $(MAIN)-opt.pdf $(MAIN).pdf $(MAIN).ps: $(MAIN).tex $(MAIN)-delayed.mp latex $(MAIN) + latex $(MAIN) dvips -t unknown $(MAIN) -o $(MAIN)-proof.pdf: $(MAIN)-proof.ps diff --git a/Master/texmf-dist/doc/metapost/drv/sample/readme.txt b/Master/texmf-dist/doc/metapost/drv/sample/readme.sh index b0c3c91b5e5..65e275906e9 100644 --- a/Master/texmf-dist/doc/metapost/drv/sample/readme.txt +++ b/Master/texmf-dist/doc/metapost/drv/sample/readme.sh @@ -1,10 +1,12 @@ -# In order to compile the sources and to get a pdf file, use `make' or: +# In order to compile the sources and to get a pdf file, +# use `make' or `./readme.sh' or: # 1. run metapost TWICE: mpost coq-sample.mp mpost coq-sample.mp -# 2. run latex (once): +# 2. run latex (twice): +latex coq-sample.tex latex coq-sample.tex # 3. run dvips (once): diff --git a/Master/texmf-dist/doc/metapost/drv/template/drv.mp b/Master/texmf-dist/doc/metapost/drv/template/drv.mp index 69f2f9f72c7..a5791649f82 100644 --- a/Master/texmf-dist/doc/metapost/drv/template/drv.mp +++ b/Master/texmf-dist/doc/metapost/drv/template/drv.mp @@ -1,5 +1,5 @@ -%% drv.mp 0.94 -%% Copyright 2009 Laurent M\'ehats +%% drv 0.95 +%% Copyright 2010 Laurent M\'ehats % % This work may be distributed and/or modified under the % conditions of the LaTeX Project Public License, either version 1.3 @@ -16,6 +16,9 @@ % % This work consists of the file drv.mp +newinternal drv_version; +drv_version:=0.95; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % @@ -142,8 +145,9 @@ % <str> LaTeX math-style command % % drv_scale (<id>, <float>) -% <id> scale identifier (clr, prm, jdg or ilb) +% <id> scale identifier (clr, crv, prm, jdg or ilb) % clr nice explanation soon (see examples) +% crv nice explanation soon (see examples) % prm nice explanation soon (see examples) % jdg nice explanation soon (see examples) % ilb nice explanation soon (see examples) @@ -217,6 +221,15 @@ % on % off % +% drv_radial_mode <id> +% <id> status identifier (on or off) +% on +% off +% +% drv_azimuth <float> +% <float> azimuth degree +% +% % * Derivation tree pictures % ========================== % @@ -234,6 +247,12 @@ % <path> MetaPost path expression % <id> path style identifier (0, 1, 2, 3, 4, 5 or 6) % +% drv_root (<nat>, <id>) +% <nat> root index +% <id> position identifier (t or b) +% t top +% b bottom +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -250,9 +269,8 @@ vardef drv_format (expr str, fst_len, nxt_len, dbl_pcs)= % 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; + save str_len, sub_len, aux_len, chr_rnk, occ_num, aux_str, chr; 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; @@ -315,6 +333,8 @@ vardef drv_errmessage expr str= errmessage drv_format (drv_context&str, 77, 79, false); enddef; +drv_message "version "&decimal drv_version&"."; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % @@ -488,11 +508,23 @@ picture tt_dgt[][]; 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_fontdimen[] expr font= - save dim_pct; + save dim_pct, dim_str; picture dim_pct; - dim_pct:=drv_tex[0] ("\rule{\the\fontdimen"&(decimal @)&font&"}{0bp}"); - width dim_pct + string dim_str; + dim_pct:=drv_tex[0] ("\mbox{\the\fontdimen"&(decimal @)&font&"}"); + dim_str:="0"; + for tok within dim_pct: + dim_str:=dim_str&(textpart tok); + endfor + scantokens dim_str enddef; vardef drv_font_size expr size_str= @@ -530,11 +562,11 @@ vardef drv_font_size expr size_str= 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] "\,"; + sp_pct:=drv_tex[mth_sty] "\thinspace"; thn_sp[mth_sty]:=width sp_pct; - sp_pct:=drv_tex[mth_sty] "\>"; + sp_pct:=drv_tex[mth_sty] "\medspace"; med_sp[mth_sty]:=width sp_pct; - sp_pct:=drv_tex[mth_sty] "\;"; + sp_pct:=drv_tex[mth_sty] "\thickspace"; thk_sp[mth_sty]:=width sp_pct; pdt_pct:=drv_tex[mth_sty] "\ldotp"; pdt_hg[mth_sty]:=height pdt_pct; @@ -588,6 +620,7 @@ vardef drv_box text STR= expandafter pair scantokens str.r; expandafter numeric scantokens str.hg; expandafter numeric scantokens str.dp; + drv_arc str; endfor enddef; @@ -606,6 +639,119 @@ enddef; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % +% drv-arcs +% + +vardef drv_arc text STR= + for str=STR: + expandafter numeric scantokens str.rad; + expandafter numeric scantokens str.lng; + expandafter numeric scantokens str.cng; + expandafter numeric scantokens str.rng; + expandafter pair scantokens str.org; + endfor +enddef; + +vardef arc_init @# (expr pct, ngl)= + @#:=pct; + @#.rng-@#.lng=ngl; + @#.cng=(@#.lng+@#.rng)/2; +enddef; + +vardef arc_freeze @#= + @#:=@# rotated @#.lng shifted @#.org; + @#.l:=(dir @#.lng) scaled @#.rad shifted @#.org; + @#.c:=(dir @#.cng) scaled @#.rad shifted @#.org; + @#.r:=(dir @#.rng) scaled @#.rad shifted @#.org; +enddef; + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Polar coordinates, angles & text torsion +% + +vardef rad_part expr ppt= + xpart ppt +enddef; + +vardef ngl_part expr ppt= + ypart ppt +enddef; + +vardef minrad (expr ppt_a, ppt_b)= + min (rad_part ppt_a, rad_part ppt_b) +enddef; + +% "tnum" (turning number) argument: +% -1: clockwise +% 1: counterclockwise + +vardef lmost_ppt (expr ppt_a, ppt_b) expr tnum= + if tnum*(ngl_part ppt_a)<tnum*(ngl_part ppt_b): + ppt_a + else: + ppt_b + fi +enddef; + +vardef rmost_ppt (expr ppt_a, ppt_b) expr tnum= + if tnum*(ngl_part ppt_a)>tnum*(ngl_part ppt_b): + ppt_a + else: + ppt_b + fi +enddef; + +vardef arc_angle (expr rad, arc_len) expr tnum= + if rad>0: + save pth; + path pth; + pth:=fullcircle scaled (2*rad); + tnum*(angle point (arctime arc_len of pth) of pth) + else: + 0 + fi +enddef; + +vardef circ_path (expr rad, ngl) expr tnum= + save pth; + path pth; + pth:=if tnum=-1: reverse fi fullcircle scaled (2*rad); + subpath (0, directiontime (dir (ngl+tnum*90)) of pth) of pth +enddef; + +vardef text_arc (expr pct, rad) expr tnum= + save arc_pct, tok_str, tok_trn, tok_ngl, hlf_wd, chr_pct; + picture arc_pct, chr_pct; + numeric tok_ngl, hlf_wd; + string tok_str; + arc_pct:=nullpicture; + for tok within pct: + transform tok_trn; + tok_str:=textpart tok; + (0, 0) transformed tok_trn=(0, 0); + (0, 1) transformed tok_trn=(xypart tok, yypart tok); + (1, 0) transformed tok_trn=(xxpart tok, yxpart tok); + tok_ngl:=arc_angle (rad, xpart tok) tnum; + for chr_rnk=0 upto (length tok_str-1): + chr_pct:=substring (chr_rnk, chr_rnk+1) of tok_str infont (fontpart tok) + transformed tok_trn; + hlf_wd:=(width chr_pct)/2; + tok_ngl:=tok_ngl+arc_angle (rad, hlf_wd) tnum; + addto arc_pct also chr_pct + shifted (-hlf_wd, 0) + rotated (tok_ngl+tnum*90) + shifted ((dir tok_ngl) scaled (rad-tnum*(ypart tok))); + tok_ngl:=tok_ngl+arc_angle (rad, hlf_wd) tnum; + endfor + endfor + arc_pct +enddef; + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % beginfig & endfig % @@ -637,14 +783,17 @@ vardef drv_beginfig= % iln_sty[i] inference line style % l_prm[i] leftmost `graphical' premise index % r_prm[i] rightmost `graphical' premise index + % bot_jdg[i] boolean % numeric prm_num[], prm[][], ccl[]; numeric jct_sty[]; string alg_sty[]; numeric iln_sty[]; numeric l_prm[], r_prm[]; + boolean bot_jdg[]; % % nfr_min_x[i] inference minimal x + % nfr_lmost_ppt[i] inference leftmost polar point % l_dlb[i] left delimiter label drv-box % l_dlm[i] left delimiter drv-box % l_ilb[i] left label drv-box @@ -653,22 +802,31 @@ vardef drv_beginfig= % r_dlm[i] right delimiter drv-box % r_dlb[i] right delimiter label drv-box % nfr_max_x[i] inference maximal x + % nfr_rmost_ppt[i] inference rightmost polar point % numeric nfr_min_x[]; + pair nfr_lmost_ppt[]; drv_box "l_dlb[]", "l_dlm[]", "l_ilb[]"; drv_box "iln[]"; drv_box "r_ilb[]", "r_dlm[]", "r_dlb[]"; numeric nfr_max_x[]; + pair nfr_rmost_ppt[]; % % Sub-trees % % sub_min_x[i] sub-tree minimal x + % sub_lmost_ppt[i] sub-tree leftmost polar point % sub_max_x[i] sub-tree maximal x + % sub_rmost_ppt[i] sub-tree rightmost polar point % sub_min_y[i] sub-tree minimal y + % sub_min_rad[i] sub-tree minimal radius % sub_max_y[i] sub-tree maximal y + % sub_max_rad[i] sub-tree maximal radius % boxed[i] boolean % numeric sub_min_x[], sub_max_x[], sub_min_y[], sub_max_y[]; + pair sub_lmost_ppt[], sub_rmost_ppt[]; + numeric sub_min_rad[], sub_max_rad[]; boolean boxed[]; % % Pen initialization @@ -953,8 +1111,8 @@ vardef NFR[] (text PRM) (expr lilb, rilb, ldlb, rdlb) % % PRM: list of premise indices % - save prm_rnk; - numeric prm_rnk; + save prm_rnk, root_rnk; + numeric prm_rnk, root_rnk; prm_rnk:=0; for prm_idx=PRM: if prm_idx=@: @@ -971,8 +1129,6 @@ vardef NFR[] (text PRM) (expr lilb, rilb, ldlb, rdlb) % % roots list update % - save root_rnk; - numeric root_rnk; root_rnk:=0; forever: exitif root[root_rnk]=prm_idx; @@ -1324,24 +1480,46 @@ string drv_rdlm_str; % right delimiter LaTeX code % 2. Macros % -vardef minmax_y[]=( - if drv_bot_roots: +vardef min_y[]= + if bot_jdg[@]: if known ccl[@]: ypart jdg[@].c-num_hg+iln_hg[(iln_sty[ccl[@]])] +min_clr_scl*min_clr[drv_sty]/2 else: sub_min_y[@]-min_clr_scl*min_clr[drv_sty] - fi, + fi + else: + sub_min_y[@]-min_clr_scl*min_clr[drv_sty] + fi +enddef; + +vardef max_y[]= + if bot_jdg[@]: sub_max_y[@]+min_clr_scl*min_clr[drv_sty] else: - sub_min_y[@]-min_clr_scl*min_clr[drv_sty], if known ccl[@]: ypart jdg[@].c-den_dp+iln_dp[(iln_sty[ccl[@]])] -min_clr_scl*min_clr[drv_sty]/2 else: sub_max_y[@]+min_clr_scl*min_clr[drv_sty] fi - fi) + fi +enddef; + +vardef min_rad[]= + if known ccl[@]: + if bot_jdg[@]: + jdg[@].rad-num_hg+iln_hg[(iln_sty[ccl[@]])] + else: + jdg[@].rad+den_dp-iln_dp[(iln_sty[ccl[@]])] + fi+min_clr_scl*min_clr[drv_sty]/2 + else: + sub_min_rad[@]-min_clr_scl*min_clr[drv_sty] + fi +enddef; + +vardef max_rad[]= + sub_max_rad[@]+min_clr_scl*min_clr[drv_sty] enddef; vardef delim @# expr dlm_len= @@ -1394,6 +1572,10 @@ boolean drv_boxmode_on; % boolean drv_fractionmode_on; % string drv_axis_ref; % +boolean drv_radialmode_on; % +numeric crv_scl; % +numeric azimuth_ngl; % + % % 2. Macros % @@ -1410,7 +1592,7 @@ vardef fraction_inference[]= and drv_fractionmode_on enddef; -vardef drv_check_root[]= +vardef drv_bot_check[]= if unknown jdg[@]: drv_errhelp "An index must be used to declare a both a judgment and an"& " inference."; @@ -1425,29 +1607,56 @@ vardef drv_check_root[]= save i_sty, prm_idx; numeric i_sty, prm_idx; i_sty:=iln_sty[@]; + bot_jdg[@]:=true; for prm_rnk=0 upto prm_num[@]-1: prm_idx:=prm[@][prm_rnk]; - drv_check_root[prm_idx]; + drv_bot_check[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 + num_hg:=max (num_hg, + iln_hg[i_sty]+min_clr_scl*min_clr[drv_sty]-jdg[prm_idx].dp); 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 + den_dp:=min (den_dp, + iln_dp[i_sty]-min_clr_scl*min_clr[drv_sty]-jdg[@].hg); + fi + if unknown boxed[@]: + boxed[@]:=drv_boxmode_on; + fi + fi +enddef; + +vardef drv_top_check[]= + 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[@]; + bot_jdg[@]:=false; + for prm_rnk=0 upto prm_num[@]-1: + prm_idx:=prm[@][prm_rnk]; + drv_top_check[prm_idx]; + % + % numerators and denominators clearances + % The TEXbook, Appendix G, Rule 15d. + % + den_dp:=min (den_dp, + iln_dp[i_sty]-min_clr_scl*min_clr[drv_sty]-jdg[prm_idx].hg); + endfor + if not fraction_inference[@]: + num_hg:=max (num_hg, + iln_hg[i_sty]+min_clr_scl*min_clr[drv_sty]-jdg[@].dp); fi if unknown boxed[@]: boxed[@]:=drv_boxmode_on; @@ -1455,24 +1664,42 @@ vardef drv_check_root[]= fi enddef; +vardef drv_root (expr idx) (suffix pos_sfx)= + save root_idx; + numeric root_idx; + root_idx:=idx; + forever: + exitif unknown ccl[root_idx]; + root_idx:=ccl[root_idx]; + endfor + if idx<>root_idx: + drv_message "warning, "&(decimal idx)&" is not a root index"& + " (the actual root index is "&(decimal root_idx)&")."; + fi + bot_jdg[root_idx]:=check_position_bot (pos_sfx) (drv_bot_roots); +enddef; + vardef drv_check= if root_num=0: drv_errhelp "Well ..."; drv_errmessage "no inference has been declared"; else: - save root_idx; + save root_idx, root_str; numeric root_idx; - root_idx:=root[0]; - drv_check_root[root_idx]; + string root_str; + for root_rnk=0 upto root_num-1: + root_idx:=root[root_rnk]; + if unknown bot_jdg[root_idx]: + bot_jdg[root_idx]:=drv_bot_roots; + fi + if bot_jdg[root_idx]: + drv_bot_check[root_idx]; + else: + drv_top_check[root_idx]; + fi + root_str:=if root_rnk>0: root_str&", "& fi decimal root_idx; + endfor if root_num>1: - save root_str; - string root_str; - root_str:=decimal root_idx; - for root_rnk=1 upto root_num-1: - root_idx:=root[root_rnk]; - drv_check_root[root_idx]; - root_str:=root_str&", "&(decimal root_idx); - endfor drv_message "warning, multiple root indices ("&root_str&")."; fi fi @@ -1483,11 +1710,11 @@ enddef; % Building % -vardef drv_build_root[]= +vardef drv_lin_build[]= % % orientation % - if drv_bot_roots: + if bot_jdg[@]: ypart iln[@].c=ypart jdg[@].c-den_dp; sub_min_y[@]:=ypart jdg[@].c+jdg[@].dp; sub_max_y[@]:= @@ -1498,8 +1725,8 @@ vardef drv_build_root[]= fi; for prm_rnk=0 upto prm_num[@]-1: ypart jdg[prm[@][prm_rnk]].c=ypart iln[@].c+num_hg; - drv_build_root[prm[@][prm_rnk]]; - sub_max_y[@]:=max(sub_max_y[@], sub_max_y[prm[@][prm_rnk]]); + drv_lin_build[prm[@][prm_rnk]]; + sub_max_y[@]:=max (sub_max_y[@], sub_max_y[prm[@][prm_rnk]]); endfor else: ypart iln[@].c=ypart jdg[@].c-num_hg; @@ -1512,18 +1739,16 @@ vardef drv_build_root[]= sub_max_y[@]:=ypart jdg[@].c+jdg[@].hg; for prm_rnk=0 upto prm_num[@]-1: ypart jdg[prm[@][prm_rnk]].c=ypart iln[@].c+den_dp; - drv_build_root[prm[@][prm_rnk]]; - sub_min_y[@]:=min(sub_min_y[@], sub_min_y[prm[@][prm_rnk]]); + drv_lin_build[prm[@][prm_rnk]]; + sub_min_y[@]:=min (sub_min_y[@], sub_min_y[prm[@][prm_rnk]]); endfor fi % % premises junction (from left to right) % - for prm_rnk=1 upto prm_num[@]-1: - save l_lmost, l_rmost, r_lmost, r_rmost; - save l_max_x, r_min_x, min_skp; - numeric l_lmost, l_rmost, r_lmost, r_rmost; - numeric l_max_x, r_min_x, min_skp[]; + save l_lmost, l_rmost, r_lmost, r_rmost, l_max_x, r_min_x, min_skp; + numeric l_lmost, l_rmost, r_lmost, r_rmost, l_max_x, r_min_x, min_skp[]; + for prm_rnk=1 upto prm_num[@]-1: l_lmost:=prm[@][0]; l_rmost:=prm[@][prm_rnk-1]; r_lmost:=prm[@][prm_rnk]; @@ -1537,9 +1762,9 @@ vardef drv_build_root[]= l_rmost:=r_prm[l_rmost]; r_lmost:=l_prm[r_lmost]; r_rmost:=r_prm[r_rmost]; - l_max_x:=max(l_max_x, nfr_max_x[l_rmost]); - r_min_x:=min(r_min_x, nfr_min_x[r_lmost]); - min_skp[0]:=min(min_skp[0], nfr_min_x[r_lmost]-nfr_max_x[l_rmost]); + l_max_x:=max (l_max_x, nfr_max_x[l_rmost]); + r_min_x:=min (r_min_x, nfr_min_x[r_lmost]); + min_skp[0]:=min (min_skp[0], nfr_min_x[r_lmost]-nfr_max_x[l_rmost]); endfor min_skp[1]:=r_min_x-l_max_x; if known r_prm[l_rmost]: @@ -1583,8 +1808,8 @@ vardef drv_build_root[]= elseif alg_sty[@]="r": xpart jdg[@].r=r_xref; fi - nfr_min_x[@]:=min(xpart jdg[@].l, l_xref); - nfr_max_x[@]:=max(xpart jdg[@].r, r_xref); + nfr_min_x[@]:=min (xpart jdg[@].l, l_xref); + nfr_max_x[@]:=max (xpart jdg[@].r, r_xref); fi % % inference line @@ -1612,14 +1837,14 @@ vardef drv_build_root[]= if known l_ilb[@]: l_ilb[@].r=iln[@].l shifted (-ilb_skp_scl*ilb_skp[drv_sty], 0); nfr_min_x[@]:=xpart l_ilb[@].l; - sub_min_y[@]:=min(sub_min_y[@], ypart l_ilb[@].c+l_ilb[@].dp); - sub_max_y[@]:=max(sub_max_y[@], ypart l_ilb[@].c+l_ilb[@].hg); + sub_min_y[@]:=min (sub_min_y[@], ypart l_ilb[@].c+l_ilb[@].dp); + sub_max_y[@]:=max (sub_max_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); nfr_max_x[@]:=xpart r_ilb[@].r; - sub_min_y[@]:=min(sub_min_y[@], ypart r_ilb[@].c+r_ilb[@].dp); - sub_max_y[@]:=max(sub_max_y[@], ypart r_ilb[@].c+r_ilb[@].hg); + sub_min_y[@]:=min (sub_min_y[@], ypart r_ilb[@].c+r_ilb[@].dp); + sub_max_y[@]:=max (sub_max_y[@], ypart r_ilb[@].c+r_ilb[@].hg); fi % % phantom steps @@ -1628,29 +1853,29 @@ vardef drv_build_root[]= save bot_y, top_y, phm_pct; numeric bot_y, top_y; picture phm_pct; - if drv_bot_roots: - bot_y:=xpart minmax_y[@]+min_clr_scl*min_clr[drv_sty]/2; - top_y:=xpart minmax_y[tgt[@]]; + if bot_jdg[@]: + bot_y:=min_y[@]+min_clr_scl*min_clr[drv_sty]/2; + top_y:=min_y[tgt[@]]; else: - bot_y:=ypart minmax_y[tgt[@]]; - top_y:=ypart minmax_y[@]-min_clr_scl*min_clr[drv_sty]/2; + bot_y:=max_y[tgt[@]]; + top_y:=max_y[@]-min_clr_scl*min_clr[drv_sty]/2; fi phm_pct:=((0, (bot_y-top_y)/2)--(0, (top_y-bot_y)/2)) drv_styled phm_sty[@]; box_init phm[@] (phm_pct shifted ((width phm_pct)/2, 0)); phm[@].c=(xpart jdg[@].c, (top_y+bot_y)/2); - nfr_min_x[@]:=min(nfr_min_x[@], xpart phm[@].l); - nfr_max_x[@]:=max(nfr_max_x[@], xpart phm[@].r); + nfr_min_x[@]:=min (nfr_min_x[@], xpart phm[@].l); + nfr_max_x[@]:=max (nfr_max_x[@], xpart phm[@].r); % % phantom steps labels % if known l_plb[@]: l_plb[@].r=phm[@].l shifted (-plb_skp[drv_sty], 0); - nfr_min_x[@]:=min(nfr_min_x[@], xpart l_plb[@].l); + nfr_min_x[@]:=min (nfr_min_x[@], xpart l_plb[@].l); fi if known r_plb[@]: r_plb[@].l=phm[@].r shifted ( plb_skp[drv_sty], 0); - nfr_max_x[@]:=max(nfr_max_x[@], xpart r_plb[@].r); + nfr_max_x[@]:=max (nfr_max_x[@], xpart r_plb[@].r); fi fi % @@ -1659,28 +1884,26 @@ vardef drv_build_root[]= sub_min_x[@]:=nfr_min_x[@]; sub_max_x[@]:=nfr_max_x[@]; for prm_rnk=0 upto prm_num[@]-1: - sub_min_x[@]:=min(sub_min_x[@], sub_min_x[prm[@][prm_rnk]]); - sub_max_x[@]:=max(sub_max_x[@], sub_max_x[prm[@][prm_rnk]]); + sub_min_x[@]:=min (sub_min_x[@], sub_min_x[prm[@][prm_rnk]]); + sub_max_x[@]:=max (sub_max_x[@], sub_max_x[prm[@][prm_rnk]]); endfor % % delimiters % if known l_dlb[@] or known r_dlb[@]: - save mmy, min_y, max_y; - numeric min_y, max_y; - pair mmy; - mmy:=minmax_y[@]; - min_y:=xpart mmy; - max_y:=ypart mmy; + save miny, maxy; + numeric miny, maxy; + miny:=min_y[@]; + maxy:=max_y[@]; if known l_dlb[@]: - box_init l_dlm[@] (delim l (max_y-min_y)); - l_dlm[@].r=(sub_min_x[@], (max_y+min_y)/2); + box_init l_dlm[@] (delim l (maxy-miny)); + l_dlm[@].r=(sub_min_x[@], (maxy+miny)/2); l_dlb[@].r=l_dlm[@].l; sub_min_x[@]:=xpart l_dlb[@].l; fi if known r_dlb[@]: - box_init r_dlm[@] (delim r (max_y-min_y)); - r_dlm[@].l=(sub_max_x[@], (max_y+min_y)/2); + box_init r_dlm[@] (delim r (maxy-miny)); + r_dlm[@].l=(sub_max_x[@], (maxy+miny)/2); r_dlb[@].l=r_dlm[@].r; sub_max_x[@]:=xpart r_dlb[@].r; fi @@ -1707,13 +1930,372 @@ vardef drv_build_root[]= fi enddef; +vardef drv_rad_build[]= + for sbj_rnk=0 upto (sbj_num[@]-1): + sbj[@][sbj_rnk].rad=jdg[@].rad; + sbj[@][sbj_rnk].org=jdg[@].org; + endfor + % + % orientation + % + if bot_jdg[@]: + iln[@].rad=jdg[@].rad-den_dp; + iln[@].org=jdg[@].org; + sub_min_rad[@]:=jdg[@].rad+jdg[@].dp; + sub_max_rad[@]:= + if iln_sty[@]=0: + jdg[@].rad+jdg[@].hg + else: + iln[@].rad+iln_hg[iln_sty[@]] + fi; + for prm_rnk=0 upto prm_num[@]-1: + jdg[prm[@][prm_rnk]].rad=iln[@].rad+num_hg; + jdg[prm[@][prm_rnk]].org=iln[@].org; + drv_rad_build[prm[@][prm_rnk]]; + sub_max_rad[@]:=max (sub_max_rad[@], sub_max_rad[prm[@][prm_rnk]]); + endfor + else: + iln[@].rad=jdg[@].rad+num_hg; + iln[@].org=jdg[@].org; + sub_min_rad[@]:=jdg[@].rad-jdg[@].hg; + sub_max_rad[@]:= + if iln_sty[@]=0: + jdg[@].rad-jdg[@].dp + else: + iln[@].rad-iln_dp[iln_sty[@]] + fi; + for prm_rnk=0 upto prm_num[@]-1: + jdg[prm[@][prm_rnk]].rad=iln[@].rad-den_dp; + jdg[prm[@][prm_rnk]].org=iln[@].org; + drv_rad_build[prm[@][prm_rnk]]; + sub_max_rad[@]:=max (sub_max_rad[@], sub_max_rad[prm[@][prm_rnk]]); + endfor; + fi + % + % inference labels + % + if known l_ilb[@]: + l_ilb[@].rad=iln[@].rad; + l_ilb[@].org=iln[@].org; + sub_max_rad[@]:=max (sub_max_rad[@], + l_ilb[@].rad if bot_jdg[@]: +l_ilb[@].hg else: -l_ilb[@].dp fi); + fi + if known r_ilb[@]: + r_ilb[@].rad=iln[@].rad; + r_ilb[@].org=iln[@].org; + sub_max_rad[@]:=max (sub_max_rad[@], + r_ilb[@].rad if bot_jdg[@]: +r_ilb[@].hg else: -r_ilb[@].dp fi); + fi + % + % phantom steps + % + if known tgt[@]: + save src_rad, tgt_rad; + numeric src_rad, tgt_rad; + src_rad:=min_rad[@]+min_clr_scl*min_clr[drv_sty]/2; + tgt_rad:=min_rad[tgt[@]]; + phm[@].rad=(src_rad+tgt_rad)/2; + phm[@].org=jdg[@].org; + % + % phantom steps labels + % + if known l_plb[@]: + l_plb[@].rad=phm[@].rad; + l_plb[@].org=phm[@].org; + fi + if known r_plb[@]: + r_plb[@].rad=phm[@].rad; + r_plb[@].org=phm[@].org; + fi + fi + % + % delimiters + % + if known l_dlb[@] or known r_dlb[@]: + save minr, maxr; + numeric minr, maxr; + minr:=min_rad[@]; + maxr:=max_rad[@]; + if known l_dlb[@]: + l_dlm[@].rad=(minr+maxr)/2; + l_dlb[@].rad=l_dlm[@].rad; + l_dlb[@].org=l_dlm[@].org=jdg[@].org; + fi + if known r_dlb[@]: + r_dlm[@].rad=(minr+maxr)/2; + r_dlb[@].rad=r_dlm[@].rad; + r_dlb[@].org=r_dlm[@].org=jdg[@].org; + fi + fi +enddef; + +vardef drv_ngl_build[]= + for prm_rnk=0 upto prm_num[@]-1: + drv_ngl_build[prm[@][prm_rnk]]; + endfor + save tnum; + numeric tnum; + tnum:=if bot_jdg[@]: - fi 1; % turning number + % + % judgment arc + % + save jdg_pct, jdg_ngl; + picture jdg_pct; + numeric jdg_ngl; + jdg_pct:=nullpicture; + jdg_ngl:=0; + for sbj_rnk=0 upto (sbj_num[@]-1): + arc_init sbj[@][sbj_rnk] + (text_arc (sbj[@][sbj_rnk], sbj[@][sbj_rnk].rad) tnum, + arc_angle (sbj[@][sbj_rnk].rad, width sbj[@][sbj_rnk]) tnum); + if sbj_rnk>0: % non mandatory test + sbj[@][sbj_rnk-1].rng=sbj[@][sbj_rnk].lng;% irrelevant if rnk=0 + fi + addto jdg_pct also sbj[@][sbj_rnk] rotated jdg_ngl; + jdg_ngl:=jdg_ngl+sbj[@][sbj_rnk].rng-sbj[@][sbj_rnk].lng; + endfor + arc_init jdg[@] (jdg_pct, jdg_ngl); + if sbj_num[@]>0: % non mandatory test + jdg[@].lng=sbj[@][0].lng; % irrelevant if sbj_num=0 + fi + % + % premises junction (from left to right) + % + save l_lmost, l_rmost, r_lmost, r_rmost, l_rmost_ppt, r_lmost_ppt, ppt_skp; + numeric l_lmost, l_rmost, r_lmost, r_rmost; + pair l_rmost_ppt, r_lmost_ppt, ppt_skp[]; + for prm_rnk=1 upto prm_num[@]-1: + l_lmost:=prm[@][0]; + l_rmost:=prm[@][prm_rnk-1]; + r_lmost:=prm[@][prm_rnk]; + r_rmost:=prm[@][prm_rnk]; + l_rmost_ppt:=nfr_rmost_ppt[l_rmost]; + r_lmost_ppt:=nfr_lmost_ppt[r_lmost]; + ppt_skp[0]:=(minrad (l_rmost_ppt, r_lmost_ppt), + (ngl_part r_lmost_ppt)-(ngl_part l_rmost_ppt)); + forever: + exitif (unknown r_prm[l_rmost]) or (unknown l_prm[r_lmost]); + l_lmost:=l_prm[l_lmost]; + l_rmost:=r_prm[l_rmost]; + r_lmost:=l_prm[r_lmost]; + r_rmost:=r_prm[r_rmost]; + l_rmost_ppt:=rmost_ppt (l_rmost_ppt, nfr_rmost_ppt[l_rmost]) tnum; + r_lmost_ppt:=lmost_ppt (r_lmost_ppt, nfr_lmost_ppt[r_lmost]) tnum; + ppt_skp[0]:=rmost_ppt (ppt_skp[0], (minrad (l_rmost_ppt, r_lmost_ppt), + (ngl_part r_lmost_ppt)-(ngl_part l_rmost_ppt))) tnum; + endfor + ppt_skp[1]:=(minrad (l_rmost_ppt, r_lmost_ppt), + (ngl_part r_lmost_ppt)-(ngl_part l_rmost_ppt)); + if known r_prm[l_rmost]: + r_prm[r_rmost]:=r_prm[l_rmost]; + l_rmost_ppt:=sub_rmost_ppt[l_rmost]; + elseif known l_prm[r_lmost]: + l_prm[l_lmost]:=l_prm[r_lmost]; + r_lmost_ppt:=sub_lmost_ppt[r_lmost]; + fi + ppt_skp[2]:=(minrad (l_rmost_ppt, r_lmost_ppt), + (ngl_part r_lmost_ppt)-(ngl_part l_rmost_ppt)); + if jct_sty[@]<3: + (ngl_part ppt_skp[jct_sty[@]])= + arc_angle(rad_part ppt_skp[jct_sty[@]], + prm_skp_scl*prm_skp[drv_sty]) tnum; + fi + endfor + % + % judgment alignment + % + if prm_num[@]=0: + nfr_lmost_ppt[@]:=(jdg[@].rad, jdg[@].lng); + nfr_rmost_ppt[@]:=(jdg[@].rad, jdg[@].rng); + else: + l_prm[@]:=prm[@][0]; + r_prm[@]:=prm[@][prm_num[@]-1]; + save l_ngl_ref, r_ngl_ref; + numeric l_ngl_ref, r_ngl_ref; + l_ngl_ref= + if boxed[l_prm[@]]: + ngl_part sub_lmost_ppt[l_prm[@]] + else: + jdg[l_prm[@]].lng + fi; + r_ngl_ref= + if boxed[r_prm[@]]: + ngl_part sub_rmost_ppt[r_prm[@]] + else: + jdg[r_prm[@]].rng + fi; + if alg_sty[@]="l": + jdg[@].lng=l_ngl_ref; + elseif alg_sty[@]="c": + jdg[@].cng=(l_ngl_ref+r_ngl_ref)/2; + elseif alg_sty[@]="r": + jdg[@].rng=r_ngl_ref; + fi + nfr_lmost_ppt[@]:=( + jdg[@].rad, + tnum*min (tnum*jdg[@].lng, tnum*l_ngl_ref)); + nfr_rmost_ppt[@]:=( + jdg[@].rad, + tnum*max (tnum*jdg[@].rng, tnum*r_ngl_ref)); + fi + % + % inference line + % + save iln_ngl; + numeric iln_ngl; + iln_ngl:=2*(arc_angle(iln[@].rad, + jdg_skp_scl*jdg_skp[jdg_sty[drv_sty]]) tnum) + +(ngl_part nfr_rmost_ppt[@]) + -(ngl_part nfr_lmost_ppt[@]); + arc_init iln[@] + ((circ_path (iln[@].rad, iln_ngl) tnum) drv_styled iln_sty[@], iln_ngl); + iln[@].hg=iln_hg[iln_sty[@]]; + iln[@].dp=iln_dp[iln_sty[@]]; + iln[@].cng=((ngl_part nfr_lmost_ppt[@])+(ngl_part nfr_rmost_ppt[@]))/2; + if iln_sty[@]>0: + nfr_lmost_ppt[@]:=(iln[@].rad, iln[@].lng); + nfr_rmost_ppt[@]:=(iln[@].rad, iln[@].rng); + fi + % + % inference labels + % + if known l_ilb[@]: + arc_init l_ilb[@]( + text_arc (l_ilb[@], l_ilb[@].rad) tnum, + arc_angle (l_ilb[@].rad, width l_ilb[@]) tnum); + l_ilb[@].rng=iln[@].lng + -arc_angle (l_ilb[@].rad, ilb_skp_scl*ilb_skp[drv_sty]) tnum; + nfr_lmost_ppt[@]:=(l_ilb[@].rad, l_ilb[@].lng); + fi + if known r_ilb[@]: + arc_init r_ilb[@]( + text_arc (r_ilb[@], r_ilb[@].rad) tnum, + arc_angle (r_ilb[@].rad, width r_ilb[@]) tnum); + r_ilb[@].lng=iln[@].rng + +arc_angle (r_ilb[@].rad, ilb_skp_scl*ilb_skp[drv_sty]) tnum; + nfr_rmost_ppt[@]:=(r_ilb[@].rad, r_ilb[@].rng); + fi + % + % phantom steps + % + if known tgt[@]: + save phm_pct, src_rad, tgt_rad; + picture phm_pct; + numeric src_rad, tgt_rad; + src_rad:=min_rad[@]+min_clr_scl*min_clr[drv_sty]/2; + tgt_rad:=min_rad[tgt[@]]; + phm_pct:=((0, (src_rad-tgt_rad)/2)--(0, (tgt_rad-src_rad)/2)) + drv_styled phm_sty[@]; + arc_init phm[@] ( + phm_pct + rotated (tnum*90+arc_angle (phm[@].rad, (width phm_pct)/2) tnum) + shifted ((dir 0) scaled phm[@].rad), + arc_angle (phm[@].rad, width phm_pct) tnum); + phm[@].cng=jdg[@].cng; + nfr_lmost_ppt[@]:=lmost_ppt (nfr_lmost_ppt[@], + (phm[@].rad, phm[@].lng)) tnum; + nfr_rmost_ppt[@]:=rmost_ppt (nfr_rmost_ppt[@], + (phm[@].rad, phm[@].rng)) tnum; + % + % phantom steps labels + % + if known l_plb[@]: + arc_init l_plb[@]( + text_arc (l_plb[@], l_plb[@].rad) tnum, + arc_angle (l_plb[@].rad, width l_plb[@]) tnum); + l_plb[@].rng=phm[@].lng + -arc_angle (l_plb[@].rad, plb_skp[drv_sty]) tnum; + nfr_lmost_ppt[@]:= + lmost_ppt(nfr_lmost_ppt[@], (l_plb[@].rad, l_plb[@].lng)) tnum; + fi + if known r_plb[@]: + arc_init r_plb[@]( + text_arc (r_plb[@], r_plb[@].rad) tnum, + arc_angle (r_plb[@].rad, width r_plb[@]) tnum); + r_plb[@].lng=phm[@].rng + +arc_angle (r_plb[@].rad, plb_skp[drv_sty]) tnum; + nfr_rmost_ppt[@]:= + rmost_ppt(nfr_rmost_ppt[@], (r_plb[@].rad, r_plb[@].rng)) tnum; + fi + fi + % + % sub_lmost_ppt & sub_rmost_ppt + % + sub_lmost_ppt[@]:=nfr_lmost_ppt[@]; + sub_rmost_ppt[@]:=nfr_rmost_ppt[@]; + for prm_rnk=0 upto prm_num[@]-1: + sub_lmost_ppt[@]:= + lmost_ppt (sub_lmost_ppt[@], sub_lmost_ppt[prm[@][prm_rnk]]) tnum; + sub_rmost_ppt[@]:= + rmost_ppt (sub_rmost_ppt[@], sub_rmost_ppt[prm[@][prm_rnk]]) tnum; + endfor + % + % delimiters + % + if known l_dlb[@] or known r_dlb[@]: + save dlm_pct, minr, maxr; + picture dlm_pct; + numeric minr, maxr; + minr:=min_rad[@]; + maxr:=max_rad[@]; + if known l_dlb[@]: + dlm_pct:=delim l (maxr-minr); + arc_init l_dlm[@] ( + dlm_pct + rotated (tnum*90+arc_angle (l_dlm[@].rad, (width dlm_pct)/2) tnum) + shifted ((dir 0) scaled l_dlm[@].rad), + arc_angle (l_dlm[@].rad, width dlm_pct) tnum); + l_dlm[@].rng=ngl_part sub_lmost_ppt[@]; + arc_init l_dlb[@]( + text_arc (l_dlb[@], l_dlb[@].rad) tnum, + arc_angle (l_dlb[@].rad, width l_dlb[@]) tnum); + l_dlb[@].rng=l_dlm[@].lng; + sub_lmost_ppt[@]:= (l_dlb[@].rad, l_dlb[@].lng); + fi + if known r_dlb[@]: + dlm_pct:=delim r (maxr-minr); + arc_init r_dlm[@] ( + dlm_pct + rotated (tnum*90+arc_angle (r_dlm[@].rad, (width dlm_pct)/2) tnum) + shifted ((dir 0) scaled r_dlm[@].rad), + arc_angle (r_dlm[@].rad, width dlm_pct) tnum); + r_dlm[@].lng=ngl_part sub_rmost_ppt[@]; + arc_init r_dlb[@]( + text_arc (r_dlb[@], r_dlb[@].rad) tnum, + arc_angle (r_dlb[@].rad, width r_dlb[@]) tnum); + r_dlb[@].lng=r_dlm[@].rng; + sub_rmost_ppt[@]:=(r_dlb[@].rad, r_dlb[@].rng); + fi + fi + if (known l_dlb[@]) or boxed[@]: + save idx; + numeric idx; + idx:=@; + forever: + nfr_lmost_ppt[idx]:=sub_lmost_ppt[@]; + exitif unknown l_prm[idx]; + idx:=l_prm[idx]; + endfor + fi + if (known r_dlb[@]) or boxed[@]: + save idx; + numeric idx; + idx:=@; + forever: + nfr_rmost_ppt[idx]:=sub_rmost_ppt[@]; + exitif unknown r_prm[idx]; + idx:=r_prm[idx]; + endfor + fi +enddef; + % % Freezing % -vardef drv_freeze_root[]= +vardef drv_box_freeze[]= for prm_rnk=0 upto prm_num[@]-1: - drv_freeze_root[prm[@][prm_rnk]]; + drv_box_freeze[prm[@][prm_rnk]]; endfor for sbj_rnk=0 upto sbj_num[@]-1: box_freeze sbj[@][sbj_rnk]; @@ -1728,22 +2310,60 @@ vardef drv_freeze_root[]= endfor enddef; +vardef drv_arc_freeze[]= + for prm_rnk=0 upto prm_num[@]-1: + drv_arc_freeze[prm[@][prm_rnk]]; + endfor + for sbj_rnk=0 upto sbj_num[@]-1: + arc_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[@]: + arc_freeze sfx[@]; + fi + endfor +enddef; + vardef drv_freeze= if not drv_checked: drv_check; fi - save root_idx; - numeric root_idx; - for root_rnk=0 upto root_num-1: - root_idx:=root[root_rnk]; - drv_build_root[root_idx]; + save root_idx, tnum; + numeric root_idx, tnum; + % + % first root + % + root_idx:=root[0]; + if drv_radialmode_on: + drv_rad_build[root_idx]; + if unknown jdg[root_idx].rad: + jdg[root_idx].rad=10(num_hg-den_dp)/crv_scl; + fi + drv_ngl_build[root_idx]; + tnum:=if bot_jdg[root_idx]: - fi 1; % turning number + if unknown jdg[root_idx].cng: + jdg[root_idx].cng=-tnum*azimuth_ngl; + fi + if unknown jdg[root_idx].org: + % + % default math axis + % + jdg[root_idx].org= + (dir -jdg[root_idx].cng) scaled (tnum*axis_hg[drv_sty]+ + if drv_axis_ref="iln": + iln[root_idx].rad + else: % drv_axis_ref="jdg" + jdg[root_idx].rad + fi); + fi + drv_arc_freeze[root_idx]; + else: + drv_lin_build[root_idx]; if unknown xpart jdg[root_idx].c: - if root_rnk=0: - xpart jdg[root_idx].c=0; - else: - sub_min_x[root_idx]=sub_max_x[root[root_rnk-1]] - +prm_skp_scl*prm_skp[drv_sty]; - fi + xpart jdg[root_idx].c=0; fi if unknown ypart jdg[root_idx].c: % @@ -1755,8 +2375,64 @@ vardef drv_freeze= ypart jdg[root_idx].c=axis_hg[drv_sty]; fi fi - drv_freeze_root[root_idx]; - endfor + drv_box_freeze[root_idx]; + fi + % + % other roots + % + if drv_radialmode_on: + save l_rmost_rad, l_rmost_ngl, r_lmost_rad, r_lmost_ngl; + numeric l_rmost_rad, l_rmost_ngl, r_lmost_rad, r_lmost_ngl; + for root_rnk=1 upto root_num-1: + root_idx:=root[root_rnk]; + drv_rad_build[root_idx]; + if unknown jdg[root_idx].rad: + jdg[root_idx].rad=10(num_hg-den_dp)/crv_scl; + fi + drv_ngl_build[root_idx]; + tnum:=if bot_jdg[root_idx]: - fi 1; % turning number + l_rmost_rad:=rad_part sub_rmost_ppt[root[root_rnk-1]]; + l_rmost_ngl:=ngl_part sub_rmost_ppt[root[root_rnk-1]]; + r_lmost_rad:=rad_part sub_lmost_ppt[root_idx]; + r_lmost_ngl:=ngl_part sub_lmost_ppt[root_idx]; + if unknown jdg[root_idx].cng: + r_lmost_ngl=l_rmost_ngl+ + if bot_jdg[root_idx]=bot_jdg[root[root_rnk-1]]: + arc_angle (min (r_lmost_rad, l_rmost_rad), + prm_skp_scl*prm_skp[drv_sty]) tnum + else: + 180 + fi; + fi + if unknown jdg[root_idx].org: + jdg[root_idx].org= + if bot_jdg[root_idx]=bot_jdg[root[root_rnk-1]]: + jdg[root[root_rnk-1]].org + else: + (dir l_rmost_ngl) + scaled jdg[root[root_rnk-1]].rad + shifted jdg[root[root_rnk-1]].org + shifted ((dir (l_rmost_ngl-tnum*90)) + scaled (prm_skp_scl*prm_skp[drv_sty])) + shifted ((dir l_rmost_ngl) scaled jdg[root_idx].rad) + fi; + fi + drv_arc_freeze[root_idx]; + endfor + else: + for root_rnk=1 upto root_num-1: + root_idx:=root[root_rnk]; + drv_lin_build[root_idx]; + if unknown xpart jdg[root_idx].c: + sub_min_x[root_idx]=sub_max_x[root[root_rnk-1]] + +prm_skp_scl*prm_skp[drv_sty]; + fi + if unknown ypart jdg[root_idx].c: + ypart jdg[root_idx].c=ypart jdg[root[root_rnk-1]].c; + fi + drv_box_freeze[root_idx]; + endfor + fi drv_frozen:=true; enddef; @@ -1870,32 +2546,57 @@ vardef drv_tree= 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: - sub_min_x[@] - fi-jdg_skp_scl*jdg_skp[jdg_sty[drv_sty]]; - max_x:= - if known r_dlm[@].l: - xpart l_dlm[@].l - else: - sub_max_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 + if drv_radialmode_on: + save l_ngl, r_ngl, tnum; + numeric l_ngl, r_ngl, tnum; + tnum:=if bot_jdg[@]: - fi 1; % turning number + l_ngl:= + if known l_dlm[@].rng: + l_dlm[@].rng-arc_angle + (l_dlm[@].rad, jdg_skp_scl*jdg_skp[jdg_sty[drv_sty]]) tnum + else: + (ngl_part sub_lmost_ppt[@])-arc_angle + (rad_part sub_lmost_ppt[@], + jdg_skp_scl*jdg_skp[jdg_sty[drv_sty]]) tnum + fi; + r_ngl:= + if known r_dlm[@].lng: + r_dlm[@].lng+arc_angle + (r_dlm[@].rad, jdg_skp_scl*jdg_skp[jdg_sty[drv_sty]]) tnum + else: + (ngl_part sub_rmost_ppt[@])+arc_angle + (rad_part sub_rmost_ppt[@], + jdg_skp_scl*jdg_skp[jdg_sty[drv_sty]]) tnum + fi; + (circ_path(max_rad[@], r_ngl-l_ngl) tnum-- + reverse circ_path(min_rad[@], r_ngl-l_ngl) tnum-- + cycle) rotated l_ngl shifted jdg[@].org + else: + save minx, maxx, miny, maxy; + numeric minx, maxx, maxy, miny; + minx:= + if known l_dlm[@].r: + xpart l_dlm[@].r + else: + sub_min_x[@] + fi-jdg_skp_scl*jdg_skp[jdg_sty[drv_sty]]; + maxx:= + if known r_dlm[@].l: + xpart l_dlm[@].l + else: + sub_max_x[@] + fi+jdg_skp_scl*jdg_skp[jdg_sty[drv_sty]]; + miny:=min_y[@]; + maxy:=max_y[@]; + (minx, miny)-- + (minx, maxy)-- + (maxx, maxy)-- + (maxx, miny)-- + cycle + fi enddef; vardef mth_axis @# (suffix ref_sfx) (expr idx)= @@ -1986,6 +2687,25 @@ vardef check_position_left (suffix pos_sfx) (expr default)= fi enddef; +vardef check_position_bot (suffix pos_sfx) (expr default)= + save pos_str; + string pos_str; + pos_str:=str pos_sfx; + if pos_str="t": + false + elseif pos_str="b": + true + else: + begingroup + drv_errhelp "Valid identifiers are"& + " t (top) and"& + " b (bottom)."; + drv_errmessage (pos_str&" is not a valid root position identifier"); + default + endgroup + fi +enddef; + vardef check_mode_on (suffix status_sfx) (expr default)= save status_str; string status_str; @@ -2027,7 +2747,7 @@ vardef drv_math_style (suffix typ_sfx) (expr sty_str)= else: forsuffixes sfx=scantokens (typ_str&"_sty"): for idx=0 upto 3: - sfx[idx]:=min(idx+sty_idx, 3); + sfx[idx]:=min (idx+sty_idx, 3); endfor endfor fi @@ -2046,12 +2766,15 @@ vardef drv_scale (suffix scl_sfx) (expr scl)= jdg_skp_scl:=scl; elseif (scl_str="ilb") or (scl_str="lbl"): % "lbl" is deprecated ilb_skp_scl:=scl; + elseif scl_str="crv": + crv_scl:=scl; else: drv_errhelp "Valid identifiers are"& " clr,"& " prm,"& - " jdg and"& - " ilb."; + " jdg,"& + " ilb and"& + " crv."; drv_errmessage (scl_str&" is not a valid scale identifier"); fi enddef; @@ -2104,19 +2827,7 @@ vardef drv_labels_position text ARG= 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 + drv_bot_roots:=check_position_bot (pos_sfx) (drv_bot_roots); enddef; vardef drv_axis_reference suffix ref_sfx= @@ -2161,6 +2872,14 @@ vardef drv_proof_mode suffix status_sfx= drv_proofmode_on:=check_mode_on (status_sfx, drv_proofmode_on); enddef; +vardef drv_radial_mode suffix status_sfx= + drv_radialmode_on:=check_mode_on (status_sfx, drv_radialmode_on); +enddef; + +vardef drv_azimuth expr ngl= + azimuth_ngl:=ngl; +enddef; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % @@ -2192,6 +2911,10 @@ drv_box_mode off; drv_fraction_mode on; drv_proof_mode off; +drv_radial_mode off; +drv_scale (crv, 1); +drv_azimuth 90; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % diff --git a/Master/texmf-dist/doc/metapost/drv/template/makefile b/Master/texmf-dist/doc/metapost/drv/template/makefile index 239bbc6a46e..33507213d54 100644 --- a/Master/texmf-dist/doc/metapost/drv/template/makefile +++ b/Master/texmf-dist/doc/metapost/drv/template/makefile @@ -2,11 +2,11 @@ MAIN= template $(MAIN).pdf: $(MAIN).ps ps2pdf $(MAIN).ps + pdfopt $(MAIN).pdf $(MAIN)-opt.pdf + mv $(MAIN)-opt.pdf $(MAIN).pdf $(MAIN).ps: $(MAIN).tex $(MAIN)-delayed.mp latex $(MAIN) - latex $(MAIN) - latex $(MAIN) dvips $(MAIN) -o $(MAIN)-proof.pdf: $(MAIN)-proof.ps diff --git a/Master/texmf-dist/doc/metapost/drv/template/readme.txt b/Master/texmf-dist/doc/metapost/drv/template/readme.sh index be277b760a8..6aae46abd1b 100644 --- a/Master/texmf-dist/doc/metapost/drv/template/readme.txt +++ b/Master/texmf-dist/doc/metapost/drv/template/readme.sh @@ -1,13 +1,12 @@ -# In order to compile the sources and to get a pdf file, use `make' or: +# In order to compile the sources and to get a pdf file, +# use `make' or `./readme.sh' 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 +# 2. run latex (once): latex template.tex # 3. run dvips (once): diff --git a/Master/texmf-dist/doc/metapost/drv/template/template.mp b/Master/texmf-dist/doc/metapost/drv/template/template.mp index 0875f9df042..019c8f12da7 100644 --- a/Master/texmf-dist/doc/metapost/drv/template/template.mp +++ b/Master/texmf-dist/doc/metapost/drv/template/template.mp @@ -1,6 +1,6 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % -% Structure of a MetaPost file using drv.mp +% Structure of a MetaPost file using drv % 1. Preamble % input drv; % verbatimtex %&latex @@ -97,6 +97,9 @@ etex; % drv_box_mode off; % drv_fraction_mode on; % drv_proof_mode off; +% drv_radial_mode off; +% drv_scale (crv, 1); +% drv_azimuth 90; beginfig(100) jgm 0 "\Gamma, \Delta, \Theta, \Pi, \Upsilon\vdash F"; @@ -122,6 +125,46 @@ nfr 0 (1, 2) ("\text{cut}", 1); draw drv_tree; endfig; +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(110) +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; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % diff --git a/Master/texmf-dist/doc/metapost/drv/template/template.tex b/Master/texmf-dist/doc/metapost/drv/template/template.tex index 687c45778b3..6b11487ae59 100644 --- a/Master/texmf-dist/doc/metapost/drv/template/template.tex +++ b/Master/texmf-dist/doc/metapost/drv/template/template.tex @@ -49,7 +49,12 @@ \makeatother \begin{document} +\paragraph{First example} \begin{gather*} -\frac{\qquad}{}\drv{template.100}\frac{\qquad}{} +\drv{template.100} +\end{gather*} +\paragraph{Second example} +\begin{gather*} +\drv{template.110} \end{gather*} \end{document} diff --git a/Master/texmf-dist/metapost/drv/drv.mp b/Master/texmf-dist/metapost/drv/drv.mp index 69f2f9f72c7..a5791649f82 100644 --- a/Master/texmf-dist/metapost/drv/drv.mp +++ b/Master/texmf-dist/metapost/drv/drv.mp @@ -1,5 +1,5 @@ -%% drv.mp 0.94 -%% Copyright 2009 Laurent M\'ehats +%% drv 0.95 +%% Copyright 2010 Laurent M\'ehats % % This work may be distributed and/or modified under the % conditions of the LaTeX Project Public License, either version 1.3 @@ -16,6 +16,9 @@ % % This work consists of the file drv.mp +newinternal drv_version; +drv_version:=0.95; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % @@ -142,8 +145,9 @@ % <str> LaTeX math-style command % % drv_scale (<id>, <float>) -% <id> scale identifier (clr, prm, jdg or ilb) +% <id> scale identifier (clr, crv, prm, jdg or ilb) % clr nice explanation soon (see examples) +% crv nice explanation soon (see examples) % prm nice explanation soon (see examples) % jdg nice explanation soon (see examples) % ilb nice explanation soon (see examples) @@ -217,6 +221,15 @@ % on % off % +% drv_radial_mode <id> +% <id> status identifier (on or off) +% on +% off +% +% drv_azimuth <float> +% <float> azimuth degree +% +% % * Derivation tree pictures % ========================== % @@ -234,6 +247,12 @@ % <path> MetaPost path expression % <id> path style identifier (0, 1, 2, 3, 4, 5 or 6) % +% drv_root (<nat>, <id>) +% <nat> root index +% <id> position identifier (t or b) +% t top +% b bottom +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -250,9 +269,8 @@ vardef drv_format (expr str, fst_len, nxt_len, dbl_pcs)= % 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; + save str_len, sub_len, aux_len, chr_rnk, occ_num, aux_str, chr; 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; @@ -315,6 +333,8 @@ vardef drv_errmessage expr str= errmessage drv_format (drv_context&str, 77, 79, false); enddef; +drv_message "version "&decimal drv_version&"."; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % @@ -488,11 +508,23 @@ picture tt_dgt[][]; 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_fontdimen[] expr font= - save dim_pct; + save dim_pct, dim_str; picture dim_pct; - dim_pct:=drv_tex[0] ("\rule{\the\fontdimen"&(decimal @)&font&"}{0bp}"); - width dim_pct + string dim_str; + dim_pct:=drv_tex[0] ("\mbox{\the\fontdimen"&(decimal @)&font&"}"); + dim_str:="0"; + for tok within dim_pct: + dim_str:=dim_str&(textpart tok); + endfor + scantokens dim_str enddef; vardef drv_font_size expr size_str= @@ -530,11 +562,11 @@ vardef drv_font_size expr size_str= 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] "\,"; + sp_pct:=drv_tex[mth_sty] "\thinspace"; thn_sp[mth_sty]:=width sp_pct; - sp_pct:=drv_tex[mth_sty] "\>"; + sp_pct:=drv_tex[mth_sty] "\medspace"; med_sp[mth_sty]:=width sp_pct; - sp_pct:=drv_tex[mth_sty] "\;"; + sp_pct:=drv_tex[mth_sty] "\thickspace"; thk_sp[mth_sty]:=width sp_pct; pdt_pct:=drv_tex[mth_sty] "\ldotp"; pdt_hg[mth_sty]:=height pdt_pct; @@ -588,6 +620,7 @@ vardef drv_box text STR= expandafter pair scantokens str.r; expandafter numeric scantokens str.hg; expandafter numeric scantokens str.dp; + drv_arc str; endfor enddef; @@ -606,6 +639,119 @@ enddef; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % +% drv-arcs +% + +vardef drv_arc text STR= + for str=STR: + expandafter numeric scantokens str.rad; + expandafter numeric scantokens str.lng; + expandafter numeric scantokens str.cng; + expandafter numeric scantokens str.rng; + expandafter pair scantokens str.org; + endfor +enddef; + +vardef arc_init @# (expr pct, ngl)= + @#:=pct; + @#.rng-@#.lng=ngl; + @#.cng=(@#.lng+@#.rng)/2; +enddef; + +vardef arc_freeze @#= + @#:=@# rotated @#.lng shifted @#.org; + @#.l:=(dir @#.lng) scaled @#.rad shifted @#.org; + @#.c:=(dir @#.cng) scaled @#.rad shifted @#.org; + @#.r:=(dir @#.rng) scaled @#.rad shifted @#.org; +enddef; + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Polar coordinates, angles & text torsion +% + +vardef rad_part expr ppt= + xpart ppt +enddef; + +vardef ngl_part expr ppt= + ypart ppt +enddef; + +vardef minrad (expr ppt_a, ppt_b)= + min (rad_part ppt_a, rad_part ppt_b) +enddef; + +% "tnum" (turning number) argument: +% -1: clockwise +% 1: counterclockwise + +vardef lmost_ppt (expr ppt_a, ppt_b) expr tnum= + if tnum*(ngl_part ppt_a)<tnum*(ngl_part ppt_b): + ppt_a + else: + ppt_b + fi +enddef; + +vardef rmost_ppt (expr ppt_a, ppt_b) expr tnum= + if tnum*(ngl_part ppt_a)>tnum*(ngl_part ppt_b): + ppt_a + else: + ppt_b + fi +enddef; + +vardef arc_angle (expr rad, arc_len) expr tnum= + if rad>0: + save pth; + path pth; + pth:=fullcircle scaled (2*rad); + tnum*(angle point (arctime arc_len of pth) of pth) + else: + 0 + fi +enddef; + +vardef circ_path (expr rad, ngl) expr tnum= + save pth; + path pth; + pth:=if tnum=-1: reverse fi fullcircle scaled (2*rad); + subpath (0, directiontime (dir (ngl+tnum*90)) of pth) of pth +enddef; + +vardef text_arc (expr pct, rad) expr tnum= + save arc_pct, tok_str, tok_trn, tok_ngl, hlf_wd, chr_pct; + picture arc_pct, chr_pct; + numeric tok_ngl, hlf_wd; + string tok_str; + arc_pct:=nullpicture; + for tok within pct: + transform tok_trn; + tok_str:=textpart tok; + (0, 0) transformed tok_trn=(0, 0); + (0, 1) transformed tok_trn=(xypart tok, yypart tok); + (1, 0) transformed tok_trn=(xxpart tok, yxpart tok); + tok_ngl:=arc_angle (rad, xpart tok) tnum; + for chr_rnk=0 upto (length tok_str-1): + chr_pct:=substring (chr_rnk, chr_rnk+1) of tok_str infont (fontpart tok) + transformed tok_trn; + hlf_wd:=(width chr_pct)/2; + tok_ngl:=tok_ngl+arc_angle (rad, hlf_wd) tnum; + addto arc_pct also chr_pct + shifted (-hlf_wd, 0) + rotated (tok_ngl+tnum*90) + shifted ((dir tok_ngl) scaled (rad-tnum*(ypart tok))); + tok_ngl:=tok_ngl+arc_angle (rad, hlf_wd) tnum; + endfor + endfor + arc_pct +enddef; + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % beginfig & endfig % @@ -637,14 +783,17 @@ vardef drv_beginfig= % iln_sty[i] inference line style % l_prm[i] leftmost `graphical' premise index % r_prm[i] rightmost `graphical' premise index + % bot_jdg[i] boolean % numeric prm_num[], prm[][], ccl[]; numeric jct_sty[]; string alg_sty[]; numeric iln_sty[]; numeric l_prm[], r_prm[]; + boolean bot_jdg[]; % % nfr_min_x[i] inference minimal x + % nfr_lmost_ppt[i] inference leftmost polar point % l_dlb[i] left delimiter label drv-box % l_dlm[i] left delimiter drv-box % l_ilb[i] left label drv-box @@ -653,22 +802,31 @@ vardef drv_beginfig= % r_dlm[i] right delimiter drv-box % r_dlb[i] right delimiter label drv-box % nfr_max_x[i] inference maximal x + % nfr_rmost_ppt[i] inference rightmost polar point % numeric nfr_min_x[]; + pair nfr_lmost_ppt[]; drv_box "l_dlb[]", "l_dlm[]", "l_ilb[]"; drv_box "iln[]"; drv_box "r_ilb[]", "r_dlm[]", "r_dlb[]"; numeric nfr_max_x[]; + pair nfr_rmost_ppt[]; % % Sub-trees % % sub_min_x[i] sub-tree minimal x + % sub_lmost_ppt[i] sub-tree leftmost polar point % sub_max_x[i] sub-tree maximal x + % sub_rmost_ppt[i] sub-tree rightmost polar point % sub_min_y[i] sub-tree minimal y + % sub_min_rad[i] sub-tree minimal radius % sub_max_y[i] sub-tree maximal y + % sub_max_rad[i] sub-tree maximal radius % boxed[i] boolean % numeric sub_min_x[], sub_max_x[], sub_min_y[], sub_max_y[]; + pair sub_lmost_ppt[], sub_rmost_ppt[]; + numeric sub_min_rad[], sub_max_rad[]; boolean boxed[]; % % Pen initialization @@ -953,8 +1111,8 @@ vardef NFR[] (text PRM) (expr lilb, rilb, ldlb, rdlb) % % PRM: list of premise indices % - save prm_rnk; - numeric prm_rnk; + save prm_rnk, root_rnk; + numeric prm_rnk, root_rnk; prm_rnk:=0; for prm_idx=PRM: if prm_idx=@: @@ -971,8 +1129,6 @@ vardef NFR[] (text PRM) (expr lilb, rilb, ldlb, rdlb) % % roots list update % - save root_rnk; - numeric root_rnk; root_rnk:=0; forever: exitif root[root_rnk]=prm_idx; @@ -1324,24 +1480,46 @@ string drv_rdlm_str; % right delimiter LaTeX code % 2. Macros % -vardef minmax_y[]=( - if drv_bot_roots: +vardef min_y[]= + if bot_jdg[@]: if known ccl[@]: ypart jdg[@].c-num_hg+iln_hg[(iln_sty[ccl[@]])] +min_clr_scl*min_clr[drv_sty]/2 else: sub_min_y[@]-min_clr_scl*min_clr[drv_sty] - fi, + fi + else: + sub_min_y[@]-min_clr_scl*min_clr[drv_sty] + fi +enddef; + +vardef max_y[]= + if bot_jdg[@]: sub_max_y[@]+min_clr_scl*min_clr[drv_sty] else: - sub_min_y[@]-min_clr_scl*min_clr[drv_sty], if known ccl[@]: ypart jdg[@].c-den_dp+iln_dp[(iln_sty[ccl[@]])] -min_clr_scl*min_clr[drv_sty]/2 else: sub_max_y[@]+min_clr_scl*min_clr[drv_sty] fi - fi) + fi +enddef; + +vardef min_rad[]= + if known ccl[@]: + if bot_jdg[@]: + jdg[@].rad-num_hg+iln_hg[(iln_sty[ccl[@]])] + else: + jdg[@].rad+den_dp-iln_dp[(iln_sty[ccl[@]])] + fi+min_clr_scl*min_clr[drv_sty]/2 + else: + sub_min_rad[@]-min_clr_scl*min_clr[drv_sty] + fi +enddef; + +vardef max_rad[]= + sub_max_rad[@]+min_clr_scl*min_clr[drv_sty] enddef; vardef delim @# expr dlm_len= @@ -1394,6 +1572,10 @@ boolean drv_boxmode_on; % boolean drv_fractionmode_on; % string drv_axis_ref; % +boolean drv_radialmode_on; % +numeric crv_scl; % +numeric azimuth_ngl; % + % % 2. Macros % @@ -1410,7 +1592,7 @@ vardef fraction_inference[]= and drv_fractionmode_on enddef; -vardef drv_check_root[]= +vardef drv_bot_check[]= if unknown jdg[@]: drv_errhelp "An index must be used to declare a both a judgment and an"& " inference."; @@ -1425,29 +1607,56 @@ vardef drv_check_root[]= save i_sty, prm_idx; numeric i_sty, prm_idx; i_sty:=iln_sty[@]; + bot_jdg[@]:=true; for prm_rnk=0 upto prm_num[@]-1: prm_idx:=prm[@][prm_rnk]; - drv_check_root[prm_idx]; + drv_bot_check[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 + num_hg:=max (num_hg, + iln_hg[i_sty]+min_clr_scl*min_clr[drv_sty]-jdg[prm_idx].dp); 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 + den_dp:=min (den_dp, + iln_dp[i_sty]-min_clr_scl*min_clr[drv_sty]-jdg[@].hg); + fi + if unknown boxed[@]: + boxed[@]:=drv_boxmode_on; + fi + fi +enddef; + +vardef drv_top_check[]= + 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[@]; + bot_jdg[@]:=false; + for prm_rnk=0 upto prm_num[@]-1: + prm_idx:=prm[@][prm_rnk]; + drv_top_check[prm_idx]; + % + % numerators and denominators clearances + % The TEXbook, Appendix G, Rule 15d. + % + den_dp:=min (den_dp, + iln_dp[i_sty]-min_clr_scl*min_clr[drv_sty]-jdg[prm_idx].hg); + endfor + if not fraction_inference[@]: + num_hg:=max (num_hg, + iln_hg[i_sty]+min_clr_scl*min_clr[drv_sty]-jdg[@].dp); fi if unknown boxed[@]: boxed[@]:=drv_boxmode_on; @@ -1455,24 +1664,42 @@ vardef drv_check_root[]= fi enddef; +vardef drv_root (expr idx) (suffix pos_sfx)= + save root_idx; + numeric root_idx; + root_idx:=idx; + forever: + exitif unknown ccl[root_idx]; + root_idx:=ccl[root_idx]; + endfor + if idx<>root_idx: + drv_message "warning, "&(decimal idx)&" is not a root index"& + " (the actual root index is "&(decimal root_idx)&")."; + fi + bot_jdg[root_idx]:=check_position_bot (pos_sfx) (drv_bot_roots); +enddef; + vardef drv_check= if root_num=0: drv_errhelp "Well ..."; drv_errmessage "no inference has been declared"; else: - save root_idx; + save root_idx, root_str; numeric root_idx; - root_idx:=root[0]; - drv_check_root[root_idx]; + string root_str; + for root_rnk=0 upto root_num-1: + root_idx:=root[root_rnk]; + if unknown bot_jdg[root_idx]: + bot_jdg[root_idx]:=drv_bot_roots; + fi + if bot_jdg[root_idx]: + drv_bot_check[root_idx]; + else: + drv_top_check[root_idx]; + fi + root_str:=if root_rnk>0: root_str&", "& fi decimal root_idx; + endfor if root_num>1: - save root_str; - string root_str; - root_str:=decimal root_idx; - for root_rnk=1 upto root_num-1: - root_idx:=root[root_rnk]; - drv_check_root[root_idx]; - root_str:=root_str&", "&(decimal root_idx); - endfor drv_message "warning, multiple root indices ("&root_str&")."; fi fi @@ -1483,11 +1710,11 @@ enddef; % Building % -vardef drv_build_root[]= +vardef drv_lin_build[]= % % orientation % - if drv_bot_roots: + if bot_jdg[@]: ypart iln[@].c=ypart jdg[@].c-den_dp; sub_min_y[@]:=ypart jdg[@].c+jdg[@].dp; sub_max_y[@]:= @@ -1498,8 +1725,8 @@ vardef drv_build_root[]= fi; for prm_rnk=0 upto prm_num[@]-1: ypart jdg[prm[@][prm_rnk]].c=ypart iln[@].c+num_hg; - drv_build_root[prm[@][prm_rnk]]; - sub_max_y[@]:=max(sub_max_y[@], sub_max_y[prm[@][prm_rnk]]); + drv_lin_build[prm[@][prm_rnk]]; + sub_max_y[@]:=max (sub_max_y[@], sub_max_y[prm[@][prm_rnk]]); endfor else: ypart iln[@].c=ypart jdg[@].c-num_hg; @@ -1512,18 +1739,16 @@ vardef drv_build_root[]= sub_max_y[@]:=ypart jdg[@].c+jdg[@].hg; for prm_rnk=0 upto prm_num[@]-1: ypart jdg[prm[@][prm_rnk]].c=ypart iln[@].c+den_dp; - drv_build_root[prm[@][prm_rnk]]; - sub_min_y[@]:=min(sub_min_y[@], sub_min_y[prm[@][prm_rnk]]); + drv_lin_build[prm[@][prm_rnk]]; + sub_min_y[@]:=min (sub_min_y[@], sub_min_y[prm[@][prm_rnk]]); endfor fi % % premises junction (from left to right) % - for prm_rnk=1 upto prm_num[@]-1: - save l_lmost, l_rmost, r_lmost, r_rmost; - save l_max_x, r_min_x, min_skp; - numeric l_lmost, l_rmost, r_lmost, r_rmost; - numeric l_max_x, r_min_x, min_skp[]; + save l_lmost, l_rmost, r_lmost, r_rmost, l_max_x, r_min_x, min_skp; + numeric l_lmost, l_rmost, r_lmost, r_rmost, l_max_x, r_min_x, min_skp[]; + for prm_rnk=1 upto prm_num[@]-1: l_lmost:=prm[@][0]; l_rmost:=prm[@][prm_rnk-1]; r_lmost:=prm[@][prm_rnk]; @@ -1537,9 +1762,9 @@ vardef drv_build_root[]= l_rmost:=r_prm[l_rmost]; r_lmost:=l_prm[r_lmost]; r_rmost:=r_prm[r_rmost]; - l_max_x:=max(l_max_x, nfr_max_x[l_rmost]); - r_min_x:=min(r_min_x, nfr_min_x[r_lmost]); - min_skp[0]:=min(min_skp[0], nfr_min_x[r_lmost]-nfr_max_x[l_rmost]); + l_max_x:=max (l_max_x, nfr_max_x[l_rmost]); + r_min_x:=min (r_min_x, nfr_min_x[r_lmost]); + min_skp[0]:=min (min_skp[0], nfr_min_x[r_lmost]-nfr_max_x[l_rmost]); endfor min_skp[1]:=r_min_x-l_max_x; if known r_prm[l_rmost]: @@ -1583,8 +1808,8 @@ vardef drv_build_root[]= elseif alg_sty[@]="r": xpart jdg[@].r=r_xref; fi - nfr_min_x[@]:=min(xpart jdg[@].l, l_xref); - nfr_max_x[@]:=max(xpart jdg[@].r, r_xref); + nfr_min_x[@]:=min (xpart jdg[@].l, l_xref); + nfr_max_x[@]:=max (xpart jdg[@].r, r_xref); fi % % inference line @@ -1612,14 +1837,14 @@ vardef drv_build_root[]= if known l_ilb[@]: l_ilb[@].r=iln[@].l shifted (-ilb_skp_scl*ilb_skp[drv_sty], 0); nfr_min_x[@]:=xpart l_ilb[@].l; - sub_min_y[@]:=min(sub_min_y[@], ypart l_ilb[@].c+l_ilb[@].dp); - sub_max_y[@]:=max(sub_max_y[@], ypart l_ilb[@].c+l_ilb[@].hg); + sub_min_y[@]:=min (sub_min_y[@], ypart l_ilb[@].c+l_ilb[@].dp); + sub_max_y[@]:=max (sub_max_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); nfr_max_x[@]:=xpart r_ilb[@].r; - sub_min_y[@]:=min(sub_min_y[@], ypart r_ilb[@].c+r_ilb[@].dp); - sub_max_y[@]:=max(sub_max_y[@], ypart r_ilb[@].c+r_ilb[@].hg); + sub_min_y[@]:=min (sub_min_y[@], ypart r_ilb[@].c+r_ilb[@].dp); + sub_max_y[@]:=max (sub_max_y[@], ypart r_ilb[@].c+r_ilb[@].hg); fi % % phantom steps @@ -1628,29 +1853,29 @@ vardef drv_build_root[]= save bot_y, top_y, phm_pct; numeric bot_y, top_y; picture phm_pct; - if drv_bot_roots: - bot_y:=xpart minmax_y[@]+min_clr_scl*min_clr[drv_sty]/2; - top_y:=xpart minmax_y[tgt[@]]; + if bot_jdg[@]: + bot_y:=min_y[@]+min_clr_scl*min_clr[drv_sty]/2; + top_y:=min_y[tgt[@]]; else: - bot_y:=ypart minmax_y[tgt[@]]; - top_y:=ypart minmax_y[@]-min_clr_scl*min_clr[drv_sty]/2; + bot_y:=max_y[tgt[@]]; + top_y:=max_y[@]-min_clr_scl*min_clr[drv_sty]/2; fi phm_pct:=((0, (bot_y-top_y)/2)--(0, (top_y-bot_y)/2)) drv_styled phm_sty[@]; box_init phm[@] (phm_pct shifted ((width phm_pct)/2, 0)); phm[@].c=(xpart jdg[@].c, (top_y+bot_y)/2); - nfr_min_x[@]:=min(nfr_min_x[@], xpart phm[@].l); - nfr_max_x[@]:=max(nfr_max_x[@], xpart phm[@].r); + nfr_min_x[@]:=min (nfr_min_x[@], xpart phm[@].l); + nfr_max_x[@]:=max (nfr_max_x[@], xpart phm[@].r); % % phantom steps labels % if known l_plb[@]: l_plb[@].r=phm[@].l shifted (-plb_skp[drv_sty], 0); - nfr_min_x[@]:=min(nfr_min_x[@], xpart l_plb[@].l); + nfr_min_x[@]:=min (nfr_min_x[@], xpart l_plb[@].l); fi if known r_plb[@]: r_plb[@].l=phm[@].r shifted ( plb_skp[drv_sty], 0); - nfr_max_x[@]:=max(nfr_max_x[@], xpart r_plb[@].r); + nfr_max_x[@]:=max (nfr_max_x[@], xpart r_plb[@].r); fi fi % @@ -1659,28 +1884,26 @@ vardef drv_build_root[]= sub_min_x[@]:=nfr_min_x[@]; sub_max_x[@]:=nfr_max_x[@]; for prm_rnk=0 upto prm_num[@]-1: - sub_min_x[@]:=min(sub_min_x[@], sub_min_x[prm[@][prm_rnk]]); - sub_max_x[@]:=max(sub_max_x[@], sub_max_x[prm[@][prm_rnk]]); + sub_min_x[@]:=min (sub_min_x[@], sub_min_x[prm[@][prm_rnk]]); + sub_max_x[@]:=max (sub_max_x[@], sub_max_x[prm[@][prm_rnk]]); endfor % % delimiters % if known l_dlb[@] or known r_dlb[@]: - save mmy, min_y, max_y; - numeric min_y, max_y; - pair mmy; - mmy:=minmax_y[@]; - min_y:=xpart mmy; - max_y:=ypart mmy; + save miny, maxy; + numeric miny, maxy; + miny:=min_y[@]; + maxy:=max_y[@]; if known l_dlb[@]: - box_init l_dlm[@] (delim l (max_y-min_y)); - l_dlm[@].r=(sub_min_x[@], (max_y+min_y)/2); + box_init l_dlm[@] (delim l (maxy-miny)); + l_dlm[@].r=(sub_min_x[@], (maxy+miny)/2); l_dlb[@].r=l_dlm[@].l; sub_min_x[@]:=xpart l_dlb[@].l; fi if known r_dlb[@]: - box_init r_dlm[@] (delim r (max_y-min_y)); - r_dlm[@].l=(sub_max_x[@], (max_y+min_y)/2); + box_init r_dlm[@] (delim r (maxy-miny)); + r_dlm[@].l=(sub_max_x[@], (maxy+miny)/2); r_dlb[@].l=r_dlm[@].r; sub_max_x[@]:=xpart r_dlb[@].r; fi @@ -1707,13 +1930,372 @@ vardef drv_build_root[]= fi enddef; +vardef drv_rad_build[]= + for sbj_rnk=0 upto (sbj_num[@]-1): + sbj[@][sbj_rnk].rad=jdg[@].rad; + sbj[@][sbj_rnk].org=jdg[@].org; + endfor + % + % orientation + % + if bot_jdg[@]: + iln[@].rad=jdg[@].rad-den_dp; + iln[@].org=jdg[@].org; + sub_min_rad[@]:=jdg[@].rad+jdg[@].dp; + sub_max_rad[@]:= + if iln_sty[@]=0: + jdg[@].rad+jdg[@].hg + else: + iln[@].rad+iln_hg[iln_sty[@]] + fi; + for prm_rnk=0 upto prm_num[@]-1: + jdg[prm[@][prm_rnk]].rad=iln[@].rad+num_hg; + jdg[prm[@][prm_rnk]].org=iln[@].org; + drv_rad_build[prm[@][prm_rnk]]; + sub_max_rad[@]:=max (sub_max_rad[@], sub_max_rad[prm[@][prm_rnk]]); + endfor + else: + iln[@].rad=jdg[@].rad+num_hg; + iln[@].org=jdg[@].org; + sub_min_rad[@]:=jdg[@].rad-jdg[@].hg; + sub_max_rad[@]:= + if iln_sty[@]=0: + jdg[@].rad-jdg[@].dp + else: + iln[@].rad-iln_dp[iln_sty[@]] + fi; + for prm_rnk=0 upto prm_num[@]-1: + jdg[prm[@][prm_rnk]].rad=iln[@].rad-den_dp; + jdg[prm[@][prm_rnk]].org=iln[@].org; + drv_rad_build[prm[@][prm_rnk]]; + sub_max_rad[@]:=max (sub_max_rad[@], sub_max_rad[prm[@][prm_rnk]]); + endfor; + fi + % + % inference labels + % + if known l_ilb[@]: + l_ilb[@].rad=iln[@].rad; + l_ilb[@].org=iln[@].org; + sub_max_rad[@]:=max (sub_max_rad[@], + l_ilb[@].rad if bot_jdg[@]: +l_ilb[@].hg else: -l_ilb[@].dp fi); + fi + if known r_ilb[@]: + r_ilb[@].rad=iln[@].rad; + r_ilb[@].org=iln[@].org; + sub_max_rad[@]:=max (sub_max_rad[@], + r_ilb[@].rad if bot_jdg[@]: +r_ilb[@].hg else: -r_ilb[@].dp fi); + fi + % + % phantom steps + % + if known tgt[@]: + save src_rad, tgt_rad; + numeric src_rad, tgt_rad; + src_rad:=min_rad[@]+min_clr_scl*min_clr[drv_sty]/2; + tgt_rad:=min_rad[tgt[@]]; + phm[@].rad=(src_rad+tgt_rad)/2; + phm[@].org=jdg[@].org; + % + % phantom steps labels + % + if known l_plb[@]: + l_plb[@].rad=phm[@].rad; + l_plb[@].org=phm[@].org; + fi + if known r_plb[@]: + r_plb[@].rad=phm[@].rad; + r_plb[@].org=phm[@].org; + fi + fi + % + % delimiters + % + if known l_dlb[@] or known r_dlb[@]: + save minr, maxr; + numeric minr, maxr; + minr:=min_rad[@]; + maxr:=max_rad[@]; + if known l_dlb[@]: + l_dlm[@].rad=(minr+maxr)/2; + l_dlb[@].rad=l_dlm[@].rad; + l_dlb[@].org=l_dlm[@].org=jdg[@].org; + fi + if known r_dlb[@]: + r_dlm[@].rad=(minr+maxr)/2; + r_dlb[@].rad=r_dlm[@].rad; + r_dlb[@].org=r_dlm[@].org=jdg[@].org; + fi + fi +enddef; + +vardef drv_ngl_build[]= + for prm_rnk=0 upto prm_num[@]-1: + drv_ngl_build[prm[@][prm_rnk]]; + endfor + save tnum; + numeric tnum; + tnum:=if bot_jdg[@]: - fi 1; % turning number + % + % judgment arc + % + save jdg_pct, jdg_ngl; + picture jdg_pct; + numeric jdg_ngl; + jdg_pct:=nullpicture; + jdg_ngl:=0; + for sbj_rnk=0 upto (sbj_num[@]-1): + arc_init sbj[@][sbj_rnk] + (text_arc (sbj[@][sbj_rnk], sbj[@][sbj_rnk].rad) tnum, + arc_angle (sbj[@][sbj_rnk].rad, width sbj[@][sbj_rnk]) tnum); + if sbj_rnk>0: % non mandatory test + sbj[@][sbj_rnk-1].rng=sbj[@][sbj_rnk].lng;% irrelevant if rnk=0 + fi + addto jdg_pct also sbj[@][sbj_rnk] rotated jdg_ngl; + jdg_ngl:=jdg_ngl+sbj[@][sbj_rnk].rng-sbj[@][sbj_rnk].lng; + endfor + arc_init jdg[@] (jdg_pct, jdg_ngl); + if sbj_num[@]>0: % non mandatory test + jdg[@].lng=sbj[@][0].lng; % irrelevant if sbj_num=0 + fi + % + % premises junction (from left to right) + % + save l_lmost, l_rmost, r_lmost, r_rmost, l_rmost_ppt, r_lmost_ppt, ppt_skp; + numeric l_lmost, l_rmost, r_lmost, r_rmost; + pair l_rmost_ppt, r_lmost_ppt, ppt_skp[]; + for prm_rnk=1 upto prm_num[@]-1: + l_lmost:=prm[@][0]; + l_rmost:=prm[@][prm_rnk-1]; + r_lmost:=prm[@][prm_rnk]; + r_rmost:=prm[@][prm_rnk]; + l_rmost_ppt:=nfr_rmost_ppt[l_rmost]; + r_lmost_ppt:=nfr_lmost_ppt[r_lmost]; + ppt_skp[0]:=(minrad (l_rmost_ppt, r_lmost_ppt), + (ngl_part r_lmost_ppt)-(ngl_part l_rmost_ppt)); + forever: + exitif (unknown r_prm[l_rmost]) or (unknown l_prm[r_lmost]); + l_lmost:=l_prm[l_lmost]; + l_rmost:=r_prm[l_rmost]; + r_lmost:=l_prm[r_lmost]; + r_rmost:=r_prm[r_rmost]; + l_rmost_ppt:=rmost_ppt (l_rmost_ppt, nfr_rmost_ppt[l_rmost]) tnum; + r_lmost_ppt:=lmost_ppt (r_lmost_ppt, nfr_lmost_ppt[r_lmost]) tnum; + ppt_skp[0]:=rmost_ppt (ppt_skp[0], (minrad (l_rmost_ppt, r_lmost_ppt), + (ngl_part r_lmost_ppt)-(ngl_part l_rmost_ppt))) tnum; + endfor + ppt_skp[1]:=(minrad (l_rmost_ppt, r_lmost_ppt), + (ngl_part r_lmost_ppt)-(ngl_part l_rmost_ppt)); + if known r_prm[l_rmost]: + r_prm[r_rmost]:=r_prm[l_rmost]; + l_rmost_ppt:=sub_rmost_ppt[l_rmost]; + elseif known l_prm[r_lmost]: + l_prm[l_lmost]:=l_prm[r_lmost]; + r_lmost_ppt:=sub_lmost_ppt[r_lmost]; + fi + ppt_skp[2]:=(minrad (l_rmost_ppt, r_lmost_ppt), + (ngl_part r_lmost_ppt)-(ngl_part l_rmost_ppt)); + if jct_sty[@]<3: + (ngl_part ppt_skp[jct_sty[@]])= + arc_angle(rad_part ppt_skp[jct_sty[@]], + prm_skp_scl*prm_skp[drv_sty]) tnum; + fi + endfor + % + % judgment alignment + % + if prm_num[@]=0: + nfr_lmost_ppt[@]:=(jdg[@].rad, jdg[@].lng); + nfr_rmost_ppt[@]:=(jdg[@].rad, jdg[@].rng); + else: + l_prm[@]:=prm[@][0]; + r_prm[@]:=prm[@][prm_num[@]-1]; + save l_ngl_ref, r_ngl_ref; + numeric l_ngl_ref, r_ngl_ref; + l_ngl_ref= + if boxed[l_prm[@]]: + ngl_part sub_lmost_ppt[l_prm[@]] + else: + jdg[l_prm[@]].lng + fi; + r_ngl_ref= + if boxed[r_prm[@]]: + ngl_part sub_rmost_ppt[r_prm[@]] + else: + jdg[r_prm[@]].rng + fi; + if alg_sty[@]="l": + jdg[@].lng=l_ngl_ref; + elseif alg_sty[@]="c": + jdg[@].cng=(l_ngl_ref+r_ngl_ref)/2; + elseif alg_sty[@]="r": + jdg[@].rng=r_ngl_ref; + fi + nfr_lmost_ppt[@]:=( + jdg[@].rad, + tnum*min (tnum*jdg[@].lng, tnum*l_ngl_ref)); + nfr_rmost_ppt[@]:=( + jdg[@].rad, + tnum*max (tnum*jdg[@].rng, tnum*r_ngl_ref)); + fi + % + % inference line + % + save iln_ngl; + numeric iln_ngl; + iln_ngl:=2*(arc_angle(iln[@].rad, + jdg_skp_scl*jdg_skp[jdg_sty[drv_sty]]) tnum) + +(ngl_part nfr_rmost_ppt[@]) + -(ngl_part nfr_lmost_ppt[@]); + arc_init iln[@] + ((circ_path (iln[@].rad, iln_ngl) tnum) drv_styled iln_sty[@], iln_ngl); + iln[@].hg=iln_hg[iln_sty[@]]; + iln[@].dp=iln_dp[iln_sty[@]]; + iln[@].cng=((ngl_part nfr_lmost_ppt[@])+(ngl_part nfr_rmost_ppt[@]))/2; + if iln_sty[@]>0: + nfr_lmost_ppt[@]:=(iln[@].rad, iln[@].lng); + nfr_rmost_ppt[@]:=(iln[@].rad, iln[@].rng); + fi + % + % inference labels + % + if known l_ilb[@]: + arc_init l_ilb[@]( + text_arc (l_ilb[@], l_ilb[@].rad) tnum, + arc_angle (l_ilb[@].rad, width l_ilb[@]) tnum); + l_ilb[@].rng=iln[@].lng + -arc_angle (l_ilb[@].rad, ilb_skp_scl*ilb_skp[drv_sty]) tnum; + nfr_lmost_ppt[@]:=(l_ilb[@].rad, l_ilb[@].lng); + fi + if known r_ilb[@]: + arc_init r_ilb[@]( + text_arc (r_ilb[@], r_ilb[@].rad) tnum, + arc_angle (r_ilb[@].rad, width r_ilb[@]) tnum); + r_ilb[@].lng=iln[@].rng + +arc_angle (r_ilb[@].rad, ilb_skp_scl*ilb_skp[drv_sty]) tnum; + nfr_rmost_ppt[@]:=(r_ilb[@].rad, r_ilb[@].rng); + fi + % + % phantom steps + % + if known tgt[@]: + save phm_pct, src_rad, tgt_rad; + picture phm_pct; + numeric src_rad, tgt_rad; + src_rad:=min_rad[@]+min_clr_scl*min_clr[drv_sty]/2; + tgt_rad:=min_rad[tgt[@]]; + phm_pct:=((0, (src_rad-tgt_rad)/2)--(0, (tgt_rad-src_rad)/2)) + drv_styled phm_sty[@]; + arc_init phm[@] ( + phm_pct + rotated (tnum*90+arc_angle (phm[@].rad, (width phm_pct)/2) tnum) + shifted ((dir 0) scaled phm[@].rad), + arc_angle (phm[@].rad, width phm_pct) tnum); + phm[@].cng=jdg[@].cng; + nfr_lmost_ppt[@]:=lmost_ppt (nfr_lmost_ppt[@], + (phm[@].rad, phm[@].lng)) tnum; + nfr_rmost_ppt[@]:=rmost_ppt (nfr_rmost_ppt[@], + (phm[@].rad, phm[@].rng)) tnum; + % + % phantom steps labels + % + if known l_plb[@]: + arc_init l_plb[@]( + text_arc (l_plb[@], l_plb[@].rad) tnum, + arc_angle (l_plb[@].rad, width l_plb[@]) tnum); + l_plb[@].rng=phm[@].lng + -arc_angle (l_plb[@].rad, plb_skp[drv_sty]) tnum; + nfr_lmost_ppt[@]:= + lmost_ppt(nfr_lmost_ppt[@], (l_plb[@].rad, l_plb[@].lng)) tnum; + fi + if known r_plb[@]: + arc_init r_plb[@]( + text_arc (r_plb[@], r_plb[@].rad) tnum, + arc_angle (r_plb[@].rad, width r_plb[@]) tnum); + r_plb[@].lng=phm[@].rng + +arc_angle (r_plb[@].rad, plb_skp[drv_sty]) tnum; + nfr_rmost_ppt[@]:= + rmost_ppt(nfr_rmost_ppt[@], (r_plb[@].rad, r_plb[@].rng)) tnum; + fi + fi + % + % sub_lmost_ppt & sub_rmost_ppt + % + sub_lmost_ppt[@]:=nfr_lmost_ppt[@]; + sub_rmost_ppt[@]:=nfr_rmost_ppt[@]; + for prm_rnk=0 upto prm_num[@]-1: + sub_lmost_ppt[@]:= + lmost_ppt (sub_lmost_ppt[@], sub_lmost_ppt[prm[@][prm_rnk]]) tnum; + sub_rmost_ppt[@]:= + rmost_ppt (sub_rmost_ppt[@], sub_rmost_ppt[prm[@][prm_rnk]]) tnum; + endfor + % + % delimiters + % + if known l_dlb[@] or known r_dlb[@]: + save dlm_pct, minr, maxr; + picture dlm_pct; + numeric minr, maxr; + minr:=min_rad[@]; + maxr:=max_rad[@]; + if known l_dlb[@]: + dlm_pct:=delim l (maxr-minr); + arc_init l_dlm[@] ( + dlm_pct + rotated (tnum*90+arc_angle (l_dlm[@].rad, (width dlm_pct)/2) tnum) + shifted ((dir 0) scaled l_dlm[@].rad), + arc_angle (l_dlm[@].rad, width dlm_pct) tnum); + l_dlm[@].rng=ngl_part sub_lmost_ppt[@]; + arc_init l_dlb[@]( + text_arc (l_dlb[@], l_dlb[@].rad) tnum, + arc_angle (l_dlb[@].rad, width l_dlb[@]) tnum); + l_dlb[@].rng=l_dlm[@].lng; + sub_lmost_ppt[@]:= (l_dlb[@].rad, l_dlb[@].lng); + fi + if known r_dlb[@]: + dlm_pct:=delim r (maxr-minr); + arc_init r_dlm[@] ( + dlm_pct + rotated (tnum*90+arc_angle (r_dlm[@].rad, (width dlm_pct)/2) tnum) + shifted ((dir 0) scaled r_dlm[@].rad), + arc_angle (r_dlm[@].rad, width dlm_pct) tnum); + r_dlm[@].lng=ngl_part sub_rmost_ppt[@]; + arc_init r_dlb[@]( + text_arc (r_dlb[@], r_dlb[@].rad) tnum, + arc_angle (r_dlb[@].rad, width r_dlb[@]) tnum); + r_dlb[@].lng=r_dlm[@].rng; + sub_rmost_ppt[@]:=(r_dlb[@].rad, r_dlb[@].rng); + fi + fi + if (known l_dlb[@]) or boxed[@]: + save idx; + numeric idx; + idx:=@; + forever: + nfr_lmost_ppt[idx]:=sub_lmost_ppt[@]; + exitif unknown l_prm[idx]; + idx:=l_prm[idx]; + endfor + fi + if (known r_dlb[@]) or boxed[@]: + save idx; + numeric idx; + idx:=@; + forever: + nfr_rmost_ppt[idx]:=sub_rmost_ppt[@]; + exitif unknown r_prm[idx]; + idx:=r_prm[idx]; + endfor + fi +enddef; + % % Freezing % -vardef drv_freeze_root[]= +vardef drv_box_freeze[]= for prm_rnk=0 upto prm_num[@]-1: - drv_freeze_root[prm[@][prm_rnk]]; + drv_box_freeze[prm[@][prm_rnk]]; endfor for sbj_rnk=0 upto sbj_num[@]-1: box_freeze sbj[@][sbj_rnk]; @@ -1728,22 +2310,60 @@ vardef drv_freeze_root[]= endfor enddef; +vardef drv_arc_freeze[]= + for prm_rnk=0 upto prm_num[@]-1: + drv_arc_freeze[prm[@][prm_rnk]]; + endfor + for sbj_rnk=0 upto sbj_num[@]-1: + arc_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[@]: + arc_freeze sfx[@]; + fi + endfor +enddef; + vardef drv_freeze= if not drv_checked: drv_check; fi - save root_idx; - numeric root_idx; - for root_rnk=0 upto root_num-1: - root_idx:=root[root_rnk]; - drv_build_root[root_idx]; + save root_idx, tnum; + numeric root_idx, tnum; + % + % first root + % + root_idx:=root[0]; + if drv_radialmode_on: + drv_rad_build[root_idx]; + if unknown jdg[root_idx].rad: + jdg[root_idx].rad=10(num_hg-den_dp)/crv_scl; + fi + drv_ngl_build[root_idx]; + tnum:=if bot_jdg[root_idx]: - fi 1; % turning number + if unknown jdg[root_idx].cng: + jdg[root_idx].cng=-tnum*azimuth_ngl; + fi + if unknown jdg[root_idx].org: + % + % default math axis + % + jdg[root_idx].org= + (dir -jdg[root_idx].cng) scaled (tnum*axis_hg[drv_sty]+ + if drv_axis_ref="iln": + iln[root_idx].rad + else: % drv_axis_ref="jdg" + jdg[root_idx].rad + fi); + fi + drv_arc_freeze[root_idx]; + else: + drv_lin_build[root_idx]; if unknown xpart jdg[root_idx].c: - if root_rnk=0: - xpart jdg[root_idx].c=0; - else: - sub_min_x[root_idx]=sub_max_x[root[root_rnk-1]] - +prm_skp_scl*prm_skp[drv_sty]; - fi + xpart jdg[root_idx].c=0; fi if unknown ypart jdg[root_idx].c: % @@ -1755,8 +2375,64 @@ vardef drv_freeze= ypart jdg[root_idx].c=axis_hg[drv_sty]; fi fi - drv_freeze_root[root_idx]; - endfor + drv_box_freeze[root_idx]; + fi + % + % other roots + % + if drv_radialmode_on: + save l_rmost_rad, l_rmost_ngl, r_lmost_rad, r_lmost_ngl; + numeric l_rmost_rad, l_rmost_ngl, r_lmost_rad, r_lmost_ngl; + for root_rnk=1 upto root_num-1: + root_idx:=root[root_rnk]; + drv_rad_build[root_idx]; + if unknown jdg[root_idx].rad: + jdg[root_idx].rad=10(num_hg-den_dp)/crv_scl; + fi + drv_ngl_build[root_idx]; + tnum:=if bot_jdg[root_idx]: - fi 1; % turning number + l_rmost_rad:=rad_part sub_rmost_ppt[root[root_rnk-1]]; + l_rmost_ngl:=ngl_part sub_rmost_ppt[root[root_rnk-1]]; + r_lmost_rad:=rad_part sub_lmost_ppt[root_idx]; + r_lmost_ngl:=ngl_part sub_lmost_ppt[root_idx]; + if unknown jdg[root_idx].cng: + r_lmost_ngl=l_rmost_ngl+ + if bot_jdg[root_idx]=bot_jdg[root[root_rnk-1]]: + arc_angle (min (r_lmost_rad, l_rmost_rad), + prm_skp_scl*prm_skp[drv_sty]) tnum + else: + 180 + fi; + fi + if unknown jdg[root_idx].org: + jdg[root_idx].org= + if bot_jdg[root_idx]=bot_jdg[root[root_rnk-1]]: + jdg[root[root_rnk-1]].org + else: + (dir l_rmost_ngl) + scaled jdg[root[root_rnk-1]].rad + shifted jdg[root[root_rnk-1]].org + shifted ((dir (l_rmost_ngl-tnum*90)) + scaled (prm_skp_scl*prm_skp[drv_sty])) + shifted ((dir l_rmost_ngl) scaled jdg[root_idx].rad) + fi; + fi + drv_arc_freeze[root_idx]; + endfor + else: + for root_rnk=1 upto root_num-1: + root_idx:=root[root_rnk]; + drv_lin_build[root_idx]; + if unknown xpart jdg[root_idx].c: + sub_min_x[root_idx]=sub_max_x[root[root_rnk-1]] + +prm_skp_scl*prm_skp[drv_sty]; + fi + if unknown ypart jdg[root_idx].c: + ypart jdg[root_idx].c=ypart jdg[root[root_rnk-1]].c; + fi + drv_box_freeze[root_idx]; + endfor + fi drv_frozen:=true; enddef; @@ -1870,32 +2546,57 @@ vardef drv_tree= 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: - sub_min_x[@] - fi-jdg_skp_scl*jdg_skp[jdg_sty[drv_sty]]; - max_x:= - if known r_dlm[@].l: - xpart l_dlm[@].l - else: - sub_max_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 + if drv_radialmode_on: + save l_ngl, r_ngl, tnum; + numeric l_ngl, r_ngl, tnum; + tnum:=if bot_jdg[@]: - fi 1; % turning number + l_ngl:= + if known l_dlm[@].rng: + l_dlm[@].rng-arc_angle + (l_dlm[@].rad, jdg_skp_scl*jdg_skp[jdg_sty[drv_sty]]) tnum + else: + (ngl_part sub_lmost_ppt[@])-arc_angle + (rad_part sub_lmost_ppt[@], + jdg_skp_scl*jdg_skp[jdg_sty[drv_sty]]) tnum + fi; + r_ngl:= + if known r_dlm[@].lng: + r_dlm[@].lng+arc_angle + (r_dlm[@].rad, jdg_skp_scl*jdg_skp[jdg_sty[drv_sty]]) tnum + else: + (ngl_part sub_rmost_ppt[@])+arc_angle + (rad_part sub_rmost_ppt[@], + jdg_skp_scl*jdg_skp[jdg_sty[drv_sty]]) tnum + fi; + (circ_path(max_rad[@], r_ngl-l_ngl) tnum-- + reverse circ_path(min_rad[@], r_ngl-l_ngl) tnum-- + cycle) rotated l_ngl shifted jdg[@].org + else: + save minx, maxx, miny, maxy; + numeric minx, maxx, maxy, miny; + minx:= + if known l_dlm[@].r: + xpart l_dlm[@].r + else: + sub_min_x[@] + fi-jdg_skp_scl*jdg_skp[jdg_sty[drv_sty]]; + maxx:= + if known r_dlm[@].l: + xpart l_dlm[@].l + else: + sub_max_x[@] + fi+jdg_skp_scl*jdg_skp[jdg_sty[drv_sty]]; + miny:=min_y[@]; + maxy:=max_y[@]; + (minx, miny)-- + (minx, maxy)-- + (maxx, maxy)-- + (maxx, miny)-- + cycle + fi enddef; vardef mth_axis @# (suffix ref_sfx) (expr idx)= @@ -1986,6 +2687,25 @@ vardef check_position_left (suffix pos_sfx) (expr default)= fi enddef; +vardef check_position_bot (suffix pos_sfx) (expr default)= + save pos_str; + string pos_str; + pos_str:=str pos_sfx; + if pos_str="t": + false + elseif pos_str="b": + true + else: + begingroup + drv_errhelp "Valid identifiers are"& + " t (top) and"& + " b (bottom)."; + drv_errmessage (pos_str&" is not a valid root position identifier"); + default + endgroup + fi +enddef; + vardef check_mode_on (suffix status_sfx) (expr default)= save status_str; string status_str; @@ -2027,7 +2747,7 @@ vardef drv_math_style (suffix typ_sfx) (expr sty_str)= else: forsuffixes sfx=scantokens (typ_str&"_sty"): for idx=0 upto 3: - sfx[idx]:=min(idx+sty_idx, 3); + sfx[idx]:=min (idx+sty_idx, 3); endfor endfor fi @@ -2046,12 +2766,15 @@ vardef drv_scale (suffix scl_sfx) (expr scl)= jdg_skp_scl:=scl; elseif (scl_str="ilb") or (scl_str="lbl"): % "lbl" is deprecated ilb_skp_scl:=scl; + elseif scl_str="crv": + crv_scl:=scl; else: drv_errhelp "Valid identifiers are"& " clr,"& " prm,"& - " jdg and"& - " ilb."; + " jdg,"& + " ilb and"& + " crv."; drv_errmessage (scl_str&" is not a valid scale identifier"); fi enddef; @@ -2104,19 +2827,7 @@ vardef drv_labels_position text ARG= 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 + drv_bot_roots:=check_position_bot (pos_sfx) (drv_bot_roots); enddef; vardef drv_axis_reference suffix ref_sfx= @@ -2161,6 +2872,14 @@ vardef drv_proof_mode suffix status_sfx= drv_proofmode_on:=check_mode_on (status_sfx, drv_proofmode_on); enddef; +vardef drv_radial_mode suffix status_sfx= + drv_radialmode_on:=check_mode_on (status_sfx, drv_radialmode_on); +enddef; + +vardef drv_azimuth expr ngl= + azimuth_ngl:=ngl; +enddef; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % @@ -2192,6 +2911,10 @@ drv_box_mode off; drv_fraction_mode on; drv_proof_mode off; +drv_radial_mode off; +drv_scale (crv, 1); +drv_azimuth 90; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % |