From d4b68bb27f42afb8338f35f9fda0c467ec5d8787 Mon Sep 17 00:00:00 2001 From: "Jeffrey H. Kingston" Date: Tue, 14 Sep 2010 19:35:24 +0000 Subject: Lout 3.18. git-svn-id: http://svn.savannah.nongnu.org/svn/lout/trunk@5 9365b830-b601-4143-9ba8-b4a8e2c3339c --- include/README | 18 +- include/blue | 71 + include/bluef | 275 +++ include/book | 11 +- include/bsf.lpg | 1 - include/cprint | 7 +- include/cprintf | 251 +-- include/diag | 286 +++ include/diagf | 6052 ++++++++++++++++++++++++++++++++++++++---------------- include/doc | 9 +- include/dsf | 14 +- include/eiffel | 71 + include/eiffelf | 274 +++ include/eqf | 233 ++- include/langdefs | 1 + include/picture | 9 +- include/progf | 259 +++ include/report | 12 +- include/reportf | 6 +- include/slides | 9 +- include/tblf | 8 +- 21 files changed, 5850 insertions(+), 2027 deletions(-) create mode 100644 include/blue create mode 100644 include/bluef create mode 100644 include/eiffel create mode 100644 include/eiffelf create mode 100644 include/progf (limited to 'include') diff --git a/include/README b/include/README index 0204b0c..dc2cd91 100644 --- a/include/README +++ b/include/README @@ -22,12 +22,17 @@ Setup files (containing mainly lists of options settable by the user) diag The Diag diagram drawing package fig The Fig advanced graphics package (OBSOLETE, use diag) graph The Graph graph drawing package - cprint The cprint C and C++ program printing package pas The Pas Pascal progam printing package modula The Modula Modula-2 progam printing package latin2 The Latin2 (Eastern European characters) package russian The Russian language package + Setup files for program formatting packages (choose any combination): + + cprint C and C++ + eiffel Eiffel + blue Blue + Source files (containing Lout and PostScript source code for the packages) -------------------------------------------------------------------------- @@ -53,9 +58,12 @@ Source files (containing Lout and PostScript source code for the packages) graphf The Graph graph drawing package graphf.etc A file included by graphf graphf.lpg A PostScript prepend file needed by graphf - cprintf The cprint C and C++ program printing package - pasf The Pas Pascal progam printing package - modulaf The Modula Modula-2 progam printing package + progf Programming language formatting (for use by prg2lout) + cprintf C and C++ + eiffelf Eiffel + bluef Blue + pasf Pascal + modulaf Modula-2 latin2.fd Latin2 font definitions file (placeholder file) russian.fd Russian font definitions file (placeholder file) @@ -70,4 +78,4 @@ Miscellaneous Jeffrey H. Kingston -26 May 1999 +26 February 2000 diff --git a/include/blue b/include/blue new file mode 100644 index 0000000..78c5d33 --- /dev/null +++ b/include/blue @@ -0,0 +1,71 @@ +############################################################################### +# # +# Lout setup file for Blue program printing # +# # +# Jeffrey H. Kingston # +# 23 February 2000 # +# # +############################################################################### + + +############################################################################### +# # +# The @SysInclude { bluef } line # +# # +# This line causes Lout to read the definitions for Blue, and should # +# not be touched. # +# # +############################################################################### + +@SysInclude { bluef } + + +############################################################################### +# # +# The @BlueSetup @Use clause # +# # +# To change the default value of any option, delete the # at the start of # +# its line and change the value between braces. # +# # +############################################################################### + +@Use { @BlueSetup + # style { varying @OrIfPlain fixed } # fixed, varying, or symbol + # pipe { } # pipe source through this + + # fixedfont { Courier } # font family if fixed + # fixedstrings { Base } # string face if fixed + # fixedidentifiers { Base } # identifier face if fixed + # fixedcomments { Base } # comment face if fixed + # fixedkeywords { Base } # keyword face if fixed + # fixednumbers { Base } # number face if fixed + # fixedoperators { Base } # operator face if fixed + # fixedsize { -1.0p } # font size if fixed + # fixedline { 1.0vx } # line-space if fixed + # fixedtabin { 8 } # tab interval if fixed + # fixedtabout { 8s } # tab width if fixed + + # varyingfont { } # font family if varying + # varyingstrings { Slope } # string face if varying + # varyingidentifiers { Slope } # identifier face if varying + # varyingcomments { Base } # comment face if varying + # varyingkeywords { Bold } # keyword face if varying + # varyingnumbers { Base } # number face if varying + # varyingoperators { Base } # operator face if varying + # varyingsize { 1.0f } # font size if varying + # varyingline { 1.0vx } # line-space if varying + # varyingtabin { 8 } # tab interval if varying + # varyingtabout { 3f } # tab width if varying + + # symbolfont { } # font family if symbol + # symbolstrings { Slope } # string face if symbol + # symbolidentifiers { Slope } # identifier face if symbol + # symbolcomments { Base } # comment face if symbol + # symbolkeywords { Bold } # keyword face if symbol + # symbolnumbers { Base } # number face if symbol + # symboloperators { Base } # operator face if symbol + # symbolsize { 1.0f } # font size if symbol + # symbolline { 1.0vx } # line-space if symbol + # symboltabin { 8 } # tab interval if symbol + # symboltabout { 3f } # tab width if symbol +} diff --git a/include/bluef b/include/bluef new file mode 100644 index 0000000..5d4a06d --- /dev/null +++ b/include/bluef @@ -0,0 +1,275 @@ + +############################################################################### +# # +# Lout @BlueSetup package for formatting Blue programs # +# # +# Version 2.0 by Jeffrey H. Kingston, February 2000. # +# # +# This package uses a filtered body parameter to convert Blue source # +# code into Lout source. The filter program is prg2lout, which is # +# distributed with Lout and should be compiled and installed wherever # +# Lout itself is. # +# # +############################################################################### + +export @Blue +def @BlueSetup + named style + named @OrIfPlain left x right y + { @BackEnd @Case { PlainText @Yield y else @Yield x } } + { varying @OrIfPlain fixed } # print style + named pipe { } # pipe through this first + + named fixedfont { Courier } # font family if fixed + named fixedstrings { Base } # string face if fixed + named fixedidentifiers { Base } # identifier face if fixed + named fixedcomments { Base } # comment face if fixed + named fixedkeywords { Base } # keyword face if fixed + named fixednumbers { Base } # number face if fixed + named fixedoperators { Base } # operator face if fixed + named fixedsize { -1.0p } # font size if fixed + named fixedline { 1.0vx } # line-space if fixed + named fixedtabin { 8 } # tab interval if fixed + named fixedtabout { 8s } # tab width if fixed + + named varyingfont { } # font family if varying + named varyingstrings { Slope } # string face if varying + named varyingidentifiers { Slope } # identifier face if varying + named varyingcomments { Base } # comment face if varying + named varyingkeywords { Bold } # keyword face if varying + named varyingnumbers { Base } # number face if varying + named varyingoperators { Base } # operator face if varying + named varyingsize { 1.0f } # font size if varying + named varyingline { 1.0vx } # line-space if varying + named varyingtabin { 8 } # tab interval if varying + named varyingtabout { 3f } # tab width if varying + + named symbolfont { } # font family if symbol + named symbolstrings { Slope } # string face if symbol + named symbolidentifiers { Slope } # identifier face if symbol + named symbolcomments { Base } # comment face if symbol + named symbolkeywords { Bold } # keyword face if symbol + named symbolnumbers { Base } # number face if symbol + named symboloperators { Base } # operator face if symbol + named symbolsize { 1.0f } # font size if symbol + named symbolline { 1.0vx } # line-space if symbol + named symboltabin { 8 } # tab interval if symbol + named symboltabout { 3f } # tab width if symbol + +@Begin + + export + + "$>" @S @D @C @K @N @O @A @ST @ED @M + + def @Blue + named style { style } # style + named pipe { pipe } # pipe through this first + named font { dft } # font family + named strings { dft } # string font + named identifiers { dft } # ident. font + named comments { dft } # comment font + named keywords { dft } # keyword font + named numbers { dft } # number font + named operators { dft } # operator font + named size { dft } # font size + named line { dft } # line-space + named tabin { dft } # tab interval + named tabout { dft } # tab width + body @Body # filtered, see below + @Begin + + def @Test # returns x unless x is dft + left x + named iffixed {} + named ifvarying {} + named ifsymbol {} + { + x @Case { + dft @Yield { + style @Case { + fixed @Yield { iffixed } + varying @Yield { ifvarying } + symbol @Yield { ifsymbol } + } + } + else @Yield x + } + } + + def @InitTab + { + tabin @Test + iffixed { fixedtabin } + ifvarying { varyingtabin } + ifsymbol { symboltabin } + } + + def @InitTabWidth + { + tabout @Test + iffixed { fixedtabout } + ifvarying { varyingtabout } + ifsymbol { symboltabout } + } + + def @Filter + { + pipe @Case { + "" @Yield { + "prg2lout -r -lBlue" -i{@FilterIn} -o{@FilterOut} -e{@FilterErr} + -t{@InitTab} -T{@InitTabWidth} + } + else @Yield { + "cat" @FilterIn "|" pipe "|" + "prg2lout -r -lBlue" -o{@FilterOut} + -e{@FilterErr} -t{@InitTab} -T{@InitTabWidth} + } + } + } + + def @InitFontFamily + { + font @Test + iffixed { fixedfont } + ifvarying { varyingfont } + ifsymbol { symbolfont } + } + + def @InitSize + { + size @Test + iffixed { fixedsize } + ifvarying { varyingsize } + ifsymbol { symbolsize } + } + + def @InitLine + { + line @Test + iffixed { fixedline } + ifvarying { varyingline } + ifsymbol { symbolline } + } + + def @S # for formatting strings + right x + { + # "\"" & + strings @Test + iffixed { fixedstrings } + ifvarying { varyingstrings } + ifsymbol { symbolstrings } + @Font x + # & "\"" + } + +# def "`" +# { +# style @Case { +# symbol @Yield { "`" } +# else @Yield { "'" } +# } +# } + + def @D # for formatting identifiers + right x + { + identifiers @Test + iffixed { fixedidentifiers } + ifvarying { varyingidentifiers } + ifsymbol { symbolidentifiers } + @Font x + } + + def @C # for formatting comments + right x + { + comments @Test + iffixed { fixedcomments } + ifvarying { varyingcomments } + ifsymbol { symbolcomments } + @Font x + } + + def @K # for formatting keywords + right x + { + keywords @Test + iffixed { fixedkeywords } + ifvarying { varyingkeywords } + ifsymbol { symbolkeywords } + @Font x + } + + def @N # for formatting numbers + right x + { + numbers @Test + iffixed { fixednumbers } + ifvarying { varyingnumbers } + ifsymbol { symbolnumbers } + @Font x + } + + def @O # for formatting operators + named symb {} + right x + { + operators @Test + iffixed { fixedoperators } + ifvarying { varyingoperators } + ifsymbol { symboloperators } + @Font x + } + + def @A # get characters from the Adobe Symbol font + left sym + right x + { + style @Case { + symbol @Yield { { Symbol Base } @Font @Char sym } + else @Yield { x } + } + } + + def @ST # for formatting asterisks + right x + { + operators @Test + iffixed { fixedoperators } + ifvarying { varyingoperators } + ifsymbol { symboloperators } + @Font "0.5w" @VShift x + } + + def @ED # for formatting larger dots + right x + { + operators @Test + iffixed { fixedoperators } + ifvarying { varyingoperators } + ifsymbol { symboloperators } + @Font @BackEnd @Case { + PlainText @Yield x + else @Yield { "1.2f" @Font "+0.05f" @VShift @O x &"0.05f" } + } + } + + macro "$>" { {} & } + + def @M right x + { + style @Case { + fixed @Yield "-" + varying @Yield { { Symbol Base } @Font @Char minus } + symbol @Yield { { Symbol Base } @Font @Char minus } + } + } + + { @InitFontFamily Base @InitSize } @Font + { @InitLine lines } @Break @Body + + @End @Blue + +@End @BlueSetup diff --git a/include/book b/include/book index 2d28f62..4a8a5a8 100644 --- a/include/book +++ b/include/book @@ -101,9 +101,12 @@ # @TableNumbers { Arabic } # method of numbering tables # @FigureCaptionPos { Below } # Above or Below # @TableCaptionPos { Below } # Above or Below - # @CaptionFont { } # figure, table caption font - # @CaptionBreak { } # figure, table caption break - # @CaptionFormat { @B { number @DotSep @OneCol } } # figure, table caption format + # @FigureCaptionFont { -2p } # figure caption font + # @FigureCaptionBreak { adjust hyphen 1.2fx } # figure caption break + # @FigureCaptionFormat{ {@B { word @NumSep number. &2s }} @Insert caption } + # @TableCaptionFont { -2p } # table caption font + # @TableCaptionBreak { adjust hyphen 1.2fx } # table caption break + # @TableCaptionFormat { {@B { word @NumSep number. &2s }} @Insert caption } # @MakeFigureContents { No } # list of figures at start # @MakeTableContents { No } # list of tables at start # @MakeContents { No } # make contents? Yes or No @@ -254,6 +257,7 @@ # @FigureListWord { figurelist } # word for "List of Figures" # @TableListWord { tablelist } # word for "List of Tables" # @IntroductionWord { introduction } # word for "Introduction" + # @AbbreviationsWord { abbreviations } # word for "Abbreviations" # @ChapterWord { chapter } # word for "Chapter" # @AppendixWord { appendix } # word for "Appendix" # @IndexWord { index } # word for "Index" @@ -304,6 +308,7 @@ # @SubSubSectionGap { 1.5v @OrIfPlain 2f } # between sub-subs. # @SubAppendixGap { 2.0v @OrIfPlain 3f } # between subappendices # @SubSubAppendixGap { 1.5v @OrIfPlain 2f } # between sub-subapps + # @PrefaceInContents { Yes } # add preface to contents # @AbbreviationsInContents { Yes } # add abbreviations to contents # @IntroductionInContents { Yes } # add introduction to contents # @PartInContents { Yes } # add parts to contents diff --git a/include/bsf.lpg b/include/bsf.lpg index 8eb6c02..9183b69 100644 --- a/include/bsf.lpg +++ b/include/bsf.lpg @@ -2,7 +2,6 @@ % width height linethickness louteuro - % draw a Euro symbol of this width and height with this line thickness -% Author: Jeff Kingston, based on code from Andrew Beardsley /louteuro { 20 dict begin /eurothick exch def diff --git a/include/cprint b/include/cprint index d7acb06..e720b22 100644 --- a/include/cprint +++ b/include/cprint @@ -1,9 +1,9 @@ ############################################################################### # # -# Lout setup file for C and C++ program printing # +# Lout setup file for C program printing # # # # Jeffrey H. Kingston # -# 5 February 1999 # +# 23 February 2000 # # # ############################################################################### @@ -12,7 +12,7 @@ # # # The @SysInclude { cprintf } line # # # -# This line causes Lout to read the definitions for C printing, and should # +# This line causes Lout to read the definitions for C, and should # # not be touched. # # # ############################################################################### @@ -31,6 +31,7 @@ @Use { @CPSetup # style { fixed } # fixed, varying, or symbol + # pipe { } # pipe source through this # fixedfont { Courier } # font family if fixed # fixedstrings { Base } # string face if fixed diff --git a/include/cprintf b/include/cprintf index fca806e..311369c 100644 --- a/include/cprintf +++ b/include/cprintf @@ -1,22 +1,25 @@ ############################################################################### # # -# Lout @CPSetup package for formatting C and C++ programs (Version 1.1) # +# Lout @CPSetup package for formatting C programs # # # -# Version 1.0 by Jeffrey H. Kingston, March 1994. # -# Version 1.1 by Jeffrey H. Kingston, November 1998 (name change only) # +# Version 2.0 by Jeffrey H. Kingston, February 2000. # # # -# This package uses a filtered body parameter to convert C and C++ source # -# code into Lout source. The filter program is c2lout which is distributed # -# with Basser Lout Version 3. The list of keywords and tokens is from # -# Stroustrup, 2nd Edition. See "User's Guide to the Lout Document # -# Formatting System" for user information. # +# This package uses a filtered body parameter to convert C source # +# code into Lout source. The filter program is prg2lout, which is # +# distributed with Lout and should be compiled and installed wherever # +# Lout itself is. # # # ############################################################################### export @CP def @CPSetup - named style { fixed } # print style + named style + named @OrIfPlain left x right y + { @BackEnd @Case { PlainText @Yield y else @Yield x } } + { fixed } # print style + + named pipe { } # pipe through this first named fixedfont { Courier } # font family if fixed named fixedstrings { Base } # string face if fixed @@ -58,29 +61,11 @@ def @CPSetup export - "$$" "$>" "`" @L @S @C - - "0" "1" "2" "3" "4" "5" "6" "7" "8" "9" - - "!" "%" "^" "&" "*" "(" ")" "-" "+" "=" "${" "$}" "|" "~" - "[" "]" ";" "'" ":" "<" ">" "?" "," "." "/" - - "->" "++" "--" ".*" "->*" "<<" ">>" "<=" ">=" "==" "!=" "&&" - "||" "*=" "/=" "%=" "+=" "-=" "<<=" ">>=" "&=" "^=" "|=" "::" - - asm continue float new signed try - auto default for operator sizeof typedef - break delete friend private static union - case do goto protected struct unsigned - catch double if public switch virtual - char else inline register template void - class enum int return this volatile - const extern long short throw while - - @EvaluateCp + "$>" @S @D @C @K @N @O @A @ST @ED @M def @CP named style { style } # style + named pipe { pipe } # pipe through this first named font { dft } # font family named strings { dft } # string font named identifiers { dft } # ident. font @@ -131,8 +116,17 @@ def @CPSetup def @Filter { - c2lout -r -i{@FilterIn} -o{@FilterOut} -e{@FilterErr} - -t{@InitTab} -T{@InitTabWidth} + pipe @Case { + "" @Yield { + "prg2lout -r -lC" -i{@FilterIn} -o{@FilterOut} -e{@FilterErr} + -t{@InitTab} -T{@InitTabWidth} + } + else @Yield { + "cat" @FilterIn "|" pipe "|" + "prg2lout -r -lC" -o{@FilterOut} + -e{@FilterErr} -t{@InitTab} -T{@InitTabWidth} + } + } } def @InitFontFamily @@ -159,47 +153,37 @@ def @CPSetup ifsymbol { symbolline } } - def @S # for formatting C strings + def @S # for formatting strings right x { - "\"" & + # "\"" & strings @Test iffixed { fixedstrings } ifvarying { varyingstrings } ifsymbol { symbolstrings } @Font x - & "\"" + # & "\"" } - def "`" - { - style @Case { - symbol @Yield { "`" } - else @Yield { "'" } - } - } +# def "`" +# { +# style @Case { +# symbol @Yield { "`" } +# else @Yield { "'" } +# } +# } - def @L # for formatting C character literals + def @D # for formatting identifiers right x - { - ` & - strings @Test - iffixed { fixedstrings } - ifvarying { varyingstrings } - ifsymbol { symbolstrings } - @Font x - & ' - } - - def @Ident # for formatting C identifiers { identifiers @Test iffixed { fixedidentifiers } ifvarying { varyingidentifiers } ifsymbol { symbolidentifiers } + @Font x } - def @C # for formatting C comments + def @C # for formatting comments right x { comments @Test @@ -209,7 +193,7 @@ def @CPSetup @Font x } - def @K # for formatting C keywords + def @K # for formatting keywords right x { keywords @Test @@ -219,7 +203,7 @@ def @CPSetup @Font x } - def @N # for formatting C numbers + def @N # for formatting numbers right x { numbers @Test @@ -229,7 +213,8 @@ def @CPSetup @Font x } - def @O # for formatting C operators + def @O # for formatting operators + named symb {} right x { operators @Test @@ -249,133 +234,41 @@ def @CPSetup } } - macro "$>" { {} & } - - def "$$" { "#" } - - def "0" { @N "0" } - def "1" { @N "1" } - def "2" { @N "2" } - def "3" { @N "3" } - def "4" { @N "4" } - def "5" { @N "5" } - def "6" { @N "6" } - def "7" { @N "7" } - def "8" { @N "8" } - def "9" { @N "9" } - - def "!" { @O "!" } - def "%" { @O "%" } - def "^" { @O "^" } - def "&" { @O "&" } - def "*" { asteriskmath @A @O "*" } - def "(" { @O "(" } - def ")" { @O ")" } - def "-" { minus @A @O "-" } - def "+" { plus @A @O "+" } - def "=" { equal @A @O "=" } - def "${" { @O "{" } - def "$}" { @O "}" } - def "|" { @O "|" } - def "~" { @O "~" } - def "[" { @O "[" } - def "]" { @O "]" } - def ";" { @O ";" } - def "'" { @O "'" } - def ":" { @O ":" } - def "<" { less @A @O "<" } - def ">" { greater @A @O ">" } - def "?" { @O "?" } - def "," { @O "," } - def "." { @O "." } - def "/" { @O "/" } - def "->" { arrowright @A @O "->" } - def "++" { { + }{ + } } - def "--" { { - }{ - } } - def ".*" { { . }{ * } } - def "->*" { { ->}{ * } } - def "<<" { { < }{ < } } - def ">>" { { > }{ > } } - def "<=" { lessequal @A @O "<=" } - def ">=" { greaterequal @A @O ">=" } - def "==" { { = }{ = } } - def "!=" { notequal @A @O "!=" } - def "&&" { { & }{ & } } - def "||" { { | }{ | } } - def "*=" { { * }{ = } } - def "/=" { { / }{ = } } - def "%=" { { % }{ = } } - def "+=" { { + }{ = } } - def "-=" { { - }{ = } } - def "<<=" { { <<}{ = } } - def ">>=" { { >>}{ = } } - def "&=" { { & }{ = } } - def "^=" { { ^ }{ = } } - def "|=" { { | }{ = } } - def "::" { { : }{ : } } - - def asm { @K "asm" } - def auto { @K "auto" } - def break { @K "break" } - def case { @K "case" } - def catch { @K "catch" } - def char { @K "char" } - def class { @K "class" } - def const { @K "const" } - - def continue { @K "continue" } - def default { @K "default" } - def delete { @K "delete" } - def do { @K "do" } - def double { @K "double" } - def else { @K "else" } - def enum { @K "enum" } - def extern { @K "extern" } - - def float { @K "float" } - def for { @K "for" } - def friend { @K "friend" } - def goto { @K "goto" } - def if { @K "if" } - def inline { @K "inline" } - def int { @K "int" } - def long { @K "long" } - - def new { @K "new" } - def operator { @K "operator" } - def private { @K "private" } - def protected { @K "protected" } - def public { @K "public" } - def register { @K "register" } - def return { @K "return" } - def short { @K "short" } - - def signed { @K "signed" } - def sizeof { @K "sizeof" } - def static { @K "static" } - def struct { @K "struct" } - def switch { @K "switch" } - def template { @K "template" } - def this { @K "this" } - def throw { @K "throw" } + def @ST # for formatting asterisks + right x + { + operators @Test + iffixed { fixedoperators } + ifvarying { varyingoperators } + ifsymbol { symboloperators } + @Font "0.5w" @VShift x + } + + def @ED # for formatting larger dots (not used in C) + right x + { + operators @Test + iffixed { fixedoperators } + ifvarying { varyingoperators } + ifsymbol { symboloperators } + @Font @BackEnd @Case { + PlainText @Yield x + else @Yield { "1.2f" @Font "+0.05f" @VShift @O x &"0.05f" } + } + } - def try { @K "try" } - def typedef { @K "typedef" } - def union { @K "union" } - def unsigned { @K "unsigned" } - def virtual { @K "virtual" } - def void { @K "void" } - def volatile { @K "volatile" } - def while { @K "while" } + macro "$>" { {} & } - def @EvaluateCp right x + def @M right x { - { @InitFontFamily Base } @Font - { @Ident @InitSize } @Font - { @InitLine lines } @Break x + style @Case { + fixed @Yield "-" + varying @Yield { { Symbol Base } @Font @Char minus } + symbol @Yield { { Symbol Base } @Font @Char minus } + } } - { @InitFontFamily Base } @Font { @Ident @InitSize } @Font + { @InitFontFamily Base @InitSize } @Font { @InitLine lines } @Break @Body @End @CP diff --git a/include/diag b/include/diag index b4ffdb2..9289975 100644 --- a/include/diag +++ b/include/diag @@ -32,6 +32,15 @@ @Use { @DiagSetup # save { no } # maxlabels { 200 } + # title { (none) } + # titleformat { Italic @Font @Title //0.7f ||0.35f @Body } + + ############################################################################# + # # + # Node options # + # # + ############################################################################# + # outline { box } # margin { 0.6f } # shadow { 0.4f } @@ -109,6 +118,265 @@ # dlabelangle { } # dlabelctr { } # dlabeladjust { } + + ############################################################################# + # # + # @ANode options # + # # + ############################################################################# + + # aoutline { box } + # amargin { 0.6f } + # ashadow { 0.4f } + # asides { 3 } + # aangle { "dup 180 exch div" } # 180d / sides + # atranslate { } + # aoutlinestyle { solid } + # aoutlinedashlength { 0.2f } + # aoutlinewidth { 0.02f } + # apaint { nopaint } + # afont { } + # abreak { } + # aformat { @Body } + # avalign { ctr } + # avsize { } + # avindent { ctr } + # avstrut { no } + # avmargin { } + # atopmargin { } + # afootmargin { } + # ahalign { ctr } + # ahsize { } + # ahindent { ctr } + # ahstrut { no } + # ahmargin { } + # aleftmargin { } + # arightmargin { } + # anodelabel { } + # anodelabelmargin { 0.2f } + # anodelabelfont { "-2p" } + # anodelabelbreak { ragged nohyphen } + # anodelabelformat { @Body } + # anodelabelpos { } + # anodelabelprox { outside } + # anodelabelangle { horizontal } + # anodelabelctr { no } + # anodelabeladjust { 0 0 } + # aalabel { } + # aalabelmargin { } + # aalabelfont { } + # aalabelbreak { } + # aalabelformat { } + # aalabelpos { NE } + # aalabelprox { } + # aalabelangle { } + # aalabelctr { } + # aalabeladjust { } + # ablabel { } + # ablabelmargin { } + # ablabelfont { } + # ablabelbreak { } + # ablabelformat { } + # ablabelpos { NW } + # ablabelprox { } + # ablabelangle { } + # ablabelctr { } + # ablabeladjust { } + # aclabel { } + # aclabelmargin { } + # aclabelfont { } + # aclabelbreak { } + # aclabelformat { } + # aclabelpos { SW } + # aclabelprox { } + # aclabelangle { } + # aclabelctr { } + # aclabeladjust { } + # adlabel { } + # adlabelmargin { } + # adlabelfont { } + # adlabelbreak { } + # adlabelformat { } + # adlabelpos { SE } + # adlabelprox { } + # adlabelangle { } + # adlabelctr { } + # adlabeladjust { } + + ############################################################################# + # # + # @BNode options # + # # + ############################################################################# + + # boutline { box } + # bmargin { 0.6f } + # bshadow { 0.4f } + # bsides { 3 } + # bangle { "dup 180 exch div" } # 180d / sides + # btranslate { } + # boutlinestyle { solid } + # boutlinedashlength { 0.2f } + # boutlinewidth { 0.02f } + # bpaint { nopaint } + # bfont { } + # bbreak { } + # bformat { @Body } + # bvalign { ctr } + # bvsize { } + # bvindent { ctr } + # bvstrut { no } + # bvmargin { } + # btopmargin { } + # bfootmargin { } + # bhalign { ctr } + # bhsize { } + # bhindent { ctr } + # bhstrut { no } + # bhmargin { } + # bleftmargin { } + # brightmargin { } + # bnodelabel { } + # bnodelabelmargin { 0.2f } + # bnodelabelfont { "-2p" } + # bnodelabelbreak { ragged nohyphen } + # bnodelabelformat { @Body } + # bnodelabelpos { } + # bnodelabelprox { outside } + # bnodelabelangle { horizontal } + # bnodelabelctr { no } + # bnodelabeladjust { 0 0 } + # balabel { } + # balabelmargin { } + # balabelfont { } + # balabelbreak { } + # balabelformat { } + # balabelpos { NE } + # balabelprox { } + # balabelangle { } + # balabelctr { } + # balabeladjust { } + # bblabel { } + # bblabelmargin { } + # bblabelfont { } + # bblabelbreak { } + # bblabelformat { } + # bblabelpos { NW } + # bblabelprox { } + # bblabelangle { } + # bblabelctr { } + # bblabeladjust { } + # bclabel { } + # bclabelmargin { } + # bclabelfont { } + # bclabelbreak { } + # bclabelformat { } + # bclabelpos { SW } + # bclabelprox { } + # bclabelangle { } + # bclabelctr { } + # bclabeladjust { } + # bdlabel { } + # bdlabelmargin { } + # bdlabelfont { } + # bdlabelbreak { } + # bdlabelformat { } + # bdlabelpos { SE } + # bdlabelprox { } + # bdlabelangle { } + # bdlabelctr { } + # bdlabeladjust { } + + ############################################################################# + # # + # @CNode options # + # # + ############################################################################# + + # coutline { box } + # cmargin { 0.6f } + # cshadow { 0.4f } + # csides { 3 } + # cangle { "dup 180 exch div" } # 180d / sides + # ctranslate { } + # coutlinestyle { solid } + # coutlinedashlength { 0.2f } + # coutlinewidth { 0.02f } + # cpaint { nopaint } + # cfont { } + # cbreak { } + # cformat { @Body } + # cvalign { ctr } + # cvsize { } + # cvindent { ctr } + # cvstrut { no } + # cvmargin { } + # ctopmargin { } + # cfootmargin { } + # chalign { ctr } + # chsize { } + # chindent { ctr } + # chstrut { no } + # chmargin { } + # cleftmargin { } + # crightmargin { } + # cnodelabel { } + # cnodelabelmargin { 0.2f } + # cnodelabelfont { "-2p" } + # cnodelabelbreak { ragged nohyphen } + # cnodelabelformat { @Body } + # cnodelabelpos { } + # cnodelabelprox { outside } + # cnodelabelangle { horizontal } + # cnodelabelctr { no } + # cnodelabeladjust { 0 0 } + # calabel { } + # calabelmargin { } + # calabelfont { } + # calabelbreak { } + # calabelformat { } + # calabelpos { NE } + # calabelprox { } + # calabelangle { } + # calabelctr { } + # calabeladjust { } + # cblabel { } + # cblabelmargin { } + # cblabelfont { } + # cblabelbreak { } + # cblabelformat { } + # cblabelpos { NW } + # cblabelprox { } + # cblabelangle { } + # cblabelctr { } + # cblabeladjust { } + # cclabel { } + # cclabelmargin { } + # cclabelfont { } + # cclabelbreak { } + # cclabelformat { } + # cclabelpos { SW } + # cclabelprox { } + # cclabelangle { } + # cclabelctr { } + # cclabeladjust { } + # cdlabel { } + # cdlabelmargin { } + # cdlabelfont { } + # cdlabelbreak { } + # cdlabelformat { } + # cdlabelpos { SE } + # cdlabelprox { } + # cdlabelangle { } + # cdlabelctr { } + # cdlabeladjust { } + + ############################################################################# + # # + # Link options # + # # + ############################################################################# + # path { line } # from { 0, 0 } # to { 1, 1 } @@ -186,8 +454,26 @@ # tolabelangle { parallel } # tolabelctr { no } # tolabeladjust { 0 0 } + + ############################################################################# + # # + # Tree options # + # # + ############################################################################# + # treehsep { 0.5f } # treevsep { 0.5f } # treehindent { ctr } # treevindent { ctr } + + ############################################################################# + # # + # Syntax diagram options # + # # + ############################################################################# + + # syntaxgap { 0.35f } + # syntaxbias { 1.0f } + # syntaxradius { 0.3f } + } diff --git a/include/diagf b/include/diagf index 18b888a..999c82e 100644 --- a/include/diagf +++ b/include/diagf @@ -2,9 +2,10 @@ ############################################################################### # # # Lout @Diag package for drawing diagrams # -# Version 1.0 (July 1996) # +# Version 1.1 (February 2000) # # Jeffrey H. Kingston # # # +# Version 1.0 (July 1996) # # Based on Version 2.0 of the @Fig package (Jeffrey H. Kingston, Dec 1992). # # # ############################################################################### @@ -12,10 +13,27 @@ @SysPrependGraphic { diagf.lpg } @SysInclude { diagf.etc } -export @Diag +############################################################################### +# # +# @DiagSetup symbol # +# # +############################################################################### + +export @Diag @SyntaxDiag def @DiagSetup named save { no } named maxlabels { 200 } + named title { "--titledft--" } + named titleformat + left @Title + right @Body + { Italic @Font @Title //0.7f ||0.35f @Body } + + ########################################################################### + # # + # @Node options of @DiagSetup # + # # + ########################################################################### import @Geometry named outline named margin {} @@ -123,6 +141,348 @@ def @DiagSetup named dlabelctr { } import @Geometry named dlabeladjust { } + ########################################################################### + # # + # @ANode options of @DiagSetup # + # # + ########################################################################### + + import @Geometry named aoutline + named margin {} + named shadow {} + named sides {} + named angle {} + { box } + named amargin { 0.6f } + import @Geometry named ashadow { 0.4f } + import @Geometry named asides { 3 } + import @Geometry named aangle { "dup 180 exch div" } + named atranslate { } + named aoutlinestyle + named solid { "/ldiagsolid" } + named dashed { "/ldiagdashed" } + named cdashed { "/ldiagcdashed" } + named dotted { "/ldiagdotted" } + named noline { "/ldiagnoline" } + { solid } + import @Geometry named aoutlinedashlength { 0.2f } + import @Geometry named aoutlinewidth + named thin { 0.04 ft } + named medium { 0.08 ft } + named thick { 0.12 ft } + { thin } + named apaint { nopaint } + named afont { } + named abreak { } + named aformat right @Body { @Body } + + named avalign { ctr } + named avsize { } + named avindent { ctr } + named avstrut + named no { 0.0f } + named yes { 1.0f } + { no } + named avmargin { } + named atopmargin { } + named afootmargin { } + + named ahalign { ctr } + named ahsize { } + named ahindent { ctr } + named ahstrut + named no { 0.0f } + named yes { 1.0f } + { no } + named ahmargin { } + named aleftmargin { } + named arightmargin { } + + named anodelabel { } + named anodelabelmargin { 0.2f } + named anodelabelfont { -2p } + named anodelabelbreak { ragged nohyphen } + named anodelabelformat right @Body { @Body } + import @Geometry named anodelabelpos{ } + named anodelabelprox { outside } + import @Geometry named anodelabelangle { horizontal } + named anodelabelctr { no } + import @Geometry named anodelabeladjust { 0 0 } + + named aalabel { } + named aalabelmargin { } + named aalabelfont { } + named aalabelbreak { } + named aalabelformat right @Body { } + import @Geometry named aalabelpos { NE } + named aalabelprox { } + import @Geometry named aalabelangle { } + named aalabelctr { } + import @Geometry named aalabeladjust{ } + + named ablabel { } + named ablabelmargin { } + named ablabelfont { } + named ablabelbreak { } + named ablabelformat right @Body { } + import @Geometry named ablabelpos { NW } + named ablabelprox { } + import @Geometry named ablabelangle { } + named ablabelctr { } + import @Geometry named ablabeladjust{ } + + named aclabel { } + named aclabelmargin { } + named aclabelfont { } + named aclabelbreak { } + named aclabelformat right @Body { } + import @Geometry named aclabelpos { SW } + named aclabelprox { } + import @Geometry named aclabelangle { } + named aclabelctr { } + import @Geometry named aclabeladjust{ } + + named adlabel { } + named adlabelmargin { } + named adlabelfont { } + named adlabelbreak { } + named adlabelformat right @Body { } + import @Geometry named adlabelpos { SE } + named adlabelprox { } + import @Geometry named adlabelangle { } + named adlabelctr { } + import @Geometry named adlabeladjust{ } + + ########################################################################### + # # + # @BNode options of @DiagSetup # + # # + ########################################################################### + + import @Geometry named boutline + named margin {} + named shadow {} + named sides {} + named angle {} + { box } + named bmargin { 0.6f } + import @Geometry named bshadow { 0.4f } + import @Geometry named bsides { 3 } + import @Geometry named bangle { "dup 180 exch div" } + named btranslate { } + named boutlinestyle + named solid { "/ldiagsolid" } + named dashed { "/ldiagdashed" } + named cdashed { "/ldiagcdashed" } + named dotted { "/ldiagdotted" } + named noline { "/ldiagnoline" } + { solid } + import @Geometry named boutlinedashlength { 0.2f } + import @Geometry named boutlinewidth + named thin { 0.04 ft } + named medium { 0.08 ft } + named thick { 0.12 ft } + { thin } + named bpaint { nopaint } + named bfont { } + named bbreak { } + named bformat right @Body { @Body } + + named bvalign { ctr } + named bvsize { } + named bvindent { ctr } + named bvstrut + named no { 0.0f } + named yes { 1.0f } + { no } + named bvmargin { } + named btopmargin { } + named bfootmargin { } + + named bhalign { ctr } + named bhsize { } + named bhindent { ctr } + named bhstrut + named no { 0.0f } + named yes { 1.0f } + { no } + named bhmargin { } + named bleftmargin { } + named brightmargin { } + + named bnodelabel { } + named bnodelabelmargin { 0.2f } + named bnodelabelfont { -2p } + named bnodelabelbreak { ragged nohyphen } + named bnodelabelformat right @Body { @Body } + import @Geometry named bnodelabelpos{ } + named bnodelabelprox { outside } + import @Geometry named bnodelabelangle { horizontal } + named bnodelabelctr { no } + import @Geometry named bnodelabeladjust { 0 0 } + + named balabel { } + named balabelmargin { } + named balabelfont { } + named balabelbreak { } + named balabelformat right @Body { } + import @Geometry named balabelpos { NE } + named balabelprox { } + import @Geometry named balabelangle { } + named balabelctr { } + import @Geometry named balabeladjust{ } + + named bblabel { } + named bblabelmargin { } + named bblabelfont { } + named bblabelbreak { } + named bblabelformat right @Body { } + import @Geometry named bblabelpos { NW } + named bblabelprox { } + import @Geometry named bblabelangle { } + named bblabelctr { } + import @Geometry named bblabeladjust{ } + + named bclabel { } + named bclabelmargin { } + named bclabelfont { } + named bclabelbreak { } + named bclabelformat right @Body { } + import @Geometry named bclabelpos { SW } + named bclabelprox { } + import @Geometry named bclabelangle { } + named bclabelctr { } + import @Geometry named bclabeladjust{ } + + named bdlabel { } + named bdlabelmargin { } + named bdlabelfont { } + named bdlabelbreak { } + named bdlabelformat right @Body { } + import @Geometry named bdlabelpos { SE } + named bdlabelprox { } + import @Geometry named bdlabelangle { } + named bdlabelctr { } + import @Geometry named bdlabeladjust{ } + + ########################################################################### + # # + # @CNode options of @DiagSetup # + # # + ########################################################################### + + import @Geometry named coutline + named margin {} + named shadow {} + named sides {} + named angle {} + { box } + named cmargin { 0.6f } + import @Geometry named cshadow { 0.4f } + import @Geometry named csides { 3 } + import @Geometry named cangle { "dup 180 exch div" } + named ctranslate { } + named coutlinestyle + named solid { "/ldiagsolid" } + named dashed { "/ldiagdashed" } + named cdashed { "/ldiagcdashed" } + named dotted { "/ldiagdotted" } + named noline { "/ldiagnoline" } + { solid } + import @Geometry named coutlinedashlength { 0.2f } + import @Geometry named coutlinewidth + named thin { 0.04 ft } + named medium { 0.08 ft } + named thick { 0.12 ft } + { thin } + named cpaint { nopaint } + named cfont { } + named cbreak { } + named cformat right @Body { @Body } + + named cvalign { ctr } + named cvsize { } + named cvindent { ctr } + named cvstrut + named no { 0.0f } + named yes { 1.0f } + { no } + named cvmargin { } + named ctopmargin { } + named cfootmargin { } + + named chalign { ctr } + named chsize { } + named chindent { ctr } + named chstrut + named no { 0.0f } + named yes { 1.0f } + { no } + named chmargin { } + named cleftmargin { } + named crightmargin { } + + named cnodelabel { } + named cnodelabelmargin { 0.2f } + named cnodelabelfont { -2p } + named cnodelabelbreak { ragged nohyphen } + named cnodelabelformat right @Body { @Body } + import @Geometry named cnodelabelpos{ } + named cnodelabelprox { outside } + import @Geometry named cnodelabelangle { horizontal } + named cnodelabelctr { no } + import @Geometry named cnodelabeladjust { 0 0 } + + named calabel { } + named calabelmargin { } + named calabelfont { } + named calabelbreak { } + named calabelformat right @Body { } + import @Geometry named calabelpos { NE } + named calabelprox { } + import @Geometry named calabelangle { } + named calabelctr { } + import @Geometry named calabeladjust{ } + + named cblabel { } + named cblabelmargin { } + named cblabelfont { } + named cblabelbreak { } + named cblabelformat right @Body { } + import @Geometry named cblabelpos { NW } + named cblabelprox { } + import @Geometry named cblabelangle { } + named cblabelctr { } + import @Geometry named cblabeladjust{ } + + named cclabel { } + named cclabelmargin { } + named cclabelfont { } + named cclabelbreak { } + named cclabelformat right @Body { } + import @Geometry named cclabelpos { SW } + named cclabelprox { } + import @Geometry named cclabelangle { } + named cclabelctr { } + import @Geometry named cclabeladjust{ } + + named cdlabel { } + named cdlabelmargin { } + named cdlabelfont { } + named cdlabelbreak { } + named cdlabelformat right @Body { } + import @Geometry named cdlabelpos { SE } + named cdlabelprox { } + import @Geometry named cdlabelangle { } + named cdlabelctr { } + import @Geometry named cdlabeladjust{ } + + ########################################################################### + # # + # @Link options of @DiagSetup # + # # + ########################################################################### + import @Geometry named path named from {} named to {} @@ -236,6 +596,12 @@ def @DiagSetup named tolabelctr { no } import @Geometry named tolabeladjust { 0 0 } + ########################################################################### + # # + # Tree and syntax diagram options of @DiagSetup # + # # + ########################################################################### + named treehsep { 0.5f } named treevsep { 0.5f } named treehindent @@ -249,13 +615,21 @@ def @DiagSetup named foot { 1.0rt } { ctr } + named syntaxgap { 0.35f } + named syntaxbias { 1.0f } + named syntaxradius { 0.3f } { - export "::" @ShowPoints @ShowTags @ShowDirections @CatchTags @Transform - @Tree @HTree + ########################################################################### + # # + # @Diag symbol # + # # + ########################################################################### + + export "::" @ShowPoints @ShowTags @ShowDirections @CatchTags @Transform - @Node + @Node @ANode @BNode @CNode @Box @CurveBox @ShadowBox @Square @Diamond @Polygon @Isosceles @Ellipse @Circle @ArrowHead @SolidArrowHead @OpenArrowHead @HalfOpenArrowHead @@ -273,9 +647,28 @@ def @DiagSetup @DWrapLine @DWrapArrow @UWrapLine @UWrapArrow @DWrapCurve @DWrapCurveArrow @UWrapCurve @UWrapCurveArrow + @Tree @HTree + + @StartRight @StartUp @StartLeft @StartDown + @StartRightRight @StartRightDown + @Skip @XCell @ACell @BCell @CCell + @Sequence @Select @Optional @OptionalDiverted @Diverted + @Loop @LoopOpposite @Repeat @RepeatOpposite @RepeatDiverted + def @Diag named save { save } named maxlabels { maxlabels } + named title { title } + named titleformat + left @Title + right @Body + { @Title titleformat @Body } + + ####################################################################### + # # + # @Node options of @Diag # + # # + ####################################################################### import @Geometry named outline named margin {} @@ -332,6 +725,195 @@ def @DiagSetup named leftmargin { leftmargin } named rightmargin { rightmargin } + ####################################################################### + # # + # @ANode options of @Diag # + # # + ####################################################################### + + import @Geometry named aoutline + named margin {} + named shadow {} + named sides {} + named angle {} + { aoutline + margin { margin } + shadow { shadow } + sides { sides } + angle { angle } + } + named amargin { amargin } + import @Geometry named ashadow { ashadow } + import @Geometry named asides { asides } + import @Geometry named aangle { aangle } + named atranslate { atranslate } + named anodetag { } + named aoutlinestyle + named solid { "/ldiagsolid" } + named dashed { "/ldiagdashed" } + named cdashed { "/ldiagcdashed" } + named dotted { "/ldiagdotted" } + named noline { "/ldiagnoline" } + { aoutlinestyle } + import @Geometry named aoutlinedashlength{ aoutlinedashlength } + import @Geometry named aoutlinewidth + named thin { 0.04 ft } + named medium { 0.08 ft } + named thick { 0.12 ft } + { aoutlinewidth } + named apaint { apaint } + named afont { afont } + named abreak { abreak } + named aformat right @Body { aformat @Body } + named avalign { avalign } + named avsize { avsize } + named avindent { avindent } + named avstrut + named no { 0.0f } + named yes { 1.0f } + { avstrut } + named avmargin { avmargin } + named atopmargin { atopmargin } + named afootmargin { afootmargin } + named ahalign { ahalign } + named ahsize { ahsize } + named ahindent { ahindent } + named ahstrut + named no { 0.0f } + named yes { 1.0f } + { ahstrut } + named ahmargin { ahmargin } + named aleftmargin { aleftmargin } + named arightmargin { arightmargin } + + ####################################################################### + # # + # @BNode options of @Diag # + # # + ####################################################################### + + import @Geometry named boutline + named margin {} + named shadow {} + named sides {} + named angle {} + { boutline + margin { margin } + shadow { shadow } + sides { sides } + angle { angle } + } + named bmargin { bmargin } + import @Geometry named bshadow { bshadow } + import @Geometry named bsides { bsides } + import @Geometry named bangle { bangle } + named btranslate { btranslate } + named bnodetag { } + named boutlinestyle + named solid { "/ldiagsolid" } + named dashed { "/ldiagdashed" } + named cdashed { "/ldiagcdashed" } + named dotted { "/ldiagdotted" } + named noline { "/ldiagnoline" } + { boutlinestyle } + import @Geometry named boutlinedashlength{ boutlinedashlength } + import @Geometry named boutlinewidth + named thin { 0.04 ft } + named medium { 0.08 ft } + named thick { 0.12 ft } + { boutlinewidth } + named bpaint { bpaint } + named bfont { bfont } + named bbreak { bbreak } + named bformat right @Body { bformat @Body } + named bvalign { bvalign } + named bvsize { bvsize } + named bvindent { bvindent } + named bvstrut + named no { 0.0f } + named yes { 1.0f } + { bvstrut } + named bvmargin { bvmargin } + named btopmargin { btopmargin } + named bfootmargin { bfootmargin } + named bhalign { bhalign } + named bhsize { bhsize } + named bhindent { bhindent } + named bhstrut + named no { 0.0f } + named yes { 1.0f } + { bhstrut } + named bhmargin { bhmargin } + named bleftmargin { bleftmargin } + named brightmargin { brightmargin } + + ####################################################################### + # # + # @CNode options of @Diag # + # # + ####################################################################### + + import @Geometry named coutline + named margin {} + named shadow {} + named sides {} + named angle {} + { coutline + margin { margin } + shadow { shadow } + sides { sides } + angle { angle } + } + named cmargin { cmargin } + import @Geometry named cshadow { cshadow } + import @Geometry named csides { csides } + import @Geometry named cangle { cangle } + named ctranslate { ctranslate } + named cnodetag { } + named coutlinestyle + named solid { "/ldiagsolid" } + named dashed { "/ldiagdashed" } + named cdashed { "/ldiagcdashed" } + named dotted { "/ldiagdotted" } + named noline { "/ldiagnoline" } + { coutlinestyle } + import @Geometry named coutlinedashlength{ coutlinedashlength } + import @Geometry named coutlinewidth + named thin { 0.04 ft } + named medium { 0.08 ft } + named thick { 0.12 ft } + { coutlinewidth } + named cpaint { cpaint } + named cfont { cfont } + named cbreak { cbreak } + named cformat right @Body { cformat @Body } + named cvalign { cvalign } + named cvsize { cvsize } + named cvindent { cvindent } + named cvstrut + named no { 0.0f } + named yes { 1.0f } + { cvstrut } + named cvmargin { cvmargin } + named ctopmargin { ctopmargin } + named cfootmargin { cfootmargin } + named chalign { chalign } + named chsize { chsize } + named chindent { chindent } + named chstrut + named no { 0.0f } + named yes { 1.0f } + { chstrut } + named chmargin { chmargin } + named cleftmargin { cleftmargin } + named crightmargin { crightmargin } + + ####################################################################### + # # + # @Link options of @Diag # + # # + ####################################################################### + import @Geometry named path named from {} named to {} @@ -513,6 +1095,12 @@ def @DiagSetup named tolabelctr { tolabelctr } import @Geometry named tolabeladjust { tolabeladjust } + ####################################################################### + # # + # Tree and syntax diagram options of @Diag # + # # + ####################################################################### + named treehsep { treehsep } named treevsep { treevsep } named treehindent @@ -525,9 +1113,19 @@ def @DiagSetup named ctr { 0.5rt } named foot { 1.0rt } { treevindent } + named syntaxgap { syntaxgap } + named syntaxbias { syntaxbias } + named syntaxradius { syntaxradius } body @Body @Begin + + ####################################################################### + # # + # Miscellaneous helper definitions # + # # + ####################################################################### + # Like @Graphic, but affects the graphics state of right parameter def @InnerGraphic left ps @@ -615,6 +1213,12 @@ def @DiagSetup } } + def @ShowMarks right x + { + { "xmark -0.5 cm moveto xmark ysize 0.5 cm add lineto stroke" } @Graphic x + } + + def "::" precedence 33 associativity right @@ -759,6 +1363,13 @@ def @DiagSetup } } + + ####################################################################### + # # + # @DoLabel definition for drawing one label # + # # + ####################################################################### + def @DoLabel named which {} named labeltag { LABEL } @@ -1571,9 +2182,14 @@ def @DiagSetup } + ####################################################################### + # # + # @Node # + # # + ####################################################################### + def @Node import @Geometry named translate -# named to precedence 10 left x right y { x y "ldiagpsub" } named to precedence 10 left x right y { @BackEnd @Case { PostScript @Yield { x y "ldiagpsub" } @@ -1908,1938 +2524,3936 @@ def @DiagSetup } } - macro @@Node { @Node } - macro @Box { @Node outline { box } } - macro @CurveBox { @Node outline { curvebox } } - macro @ShadowBox { @Node outline { shadowbox } } - macro @Square { @Node outline { square } } - macro @Diamond { @Node outline { diamond } } - macro @Polygon { @Node outline { polygon } } - macro @Isosceles { @Node outline { isosceles } } - macro @Ellipse { @Node outline { ellipse } } - macro @Circle { @Node outline { circle } } + ####################################################################### + # # + # @ANode # + # # + ####################################################################### - macro @InsulatedNode { - @Node - topmargin { 0i } - footmargin { 0i } - leftmargin { 0i } - rightmargin { 0i } - alabel {} - blabel {} - clabel {} - dlabel {} - hsize {} - vsize {} - vstrut { no } - hstrut { no } - } + def @ANode + import @Geometry named translate + named to precedence 10 left x right y { + @BackEnd @Case { + PostScript @Yield { x y "ldiagpsub" } + PDF @Yield {""} + } + } + {} + import @Geometry named rotate { 0d } + import @Geometry named outline + named margin {} + named shadow {} + named sides {} + named angle {} + { aoutline + margin { margin } + shadow { shadow } + sides { sides } + angle { angle } + } + named margin { amargin } + import @Geometry named shadow { ashadow } + import @Geometry named sides { asides } + import @Geometry named angle { aangle } + named nodetag { anodetag } + named outlinestyle + named solid { "/ldiagsolid" } + named dashed { "/ldiagdashed" } + named cdashed { "/ldiagcdashed" } + named dotted { "/ldiagdotted" } + named noline { "/ldiagnoline" } + { aoutlinestyle } + import @Geometry named outlinedashlength { aoutlinedashlength} + import @Geometry named outlinewidth + named thin { 0.04 ft } + named medium { 0.08 ft } + named thick { 0.12 ft } + { aoutlinewidth } + named paint { apaint } + named font { afont } + named break { abreak } + named format right @Body { aformat @Body } + named valign { avalign } + named vsize { avsize } + named vindent { avindent } + named vstrut + named no { 0.0f } + named yes { 1.0f } + { avstrut } + named vmargin { avmargin } + named topmargin { atopmargin } + named footmargin { afootmargin } + + named halign { ahalign } + named hsize { ahsize } + named hindent { ahindent } + named hstrut + named no { 0.0f } + named yes { 1.0f } + { ahstrut } + named hmargin { ahmargin } + named leftmargin { aleftmargin } + named rightmargin { arightmargin } + + named nodelabel { anodelabel } + named nodelabelmargin { anodelabelmargin } + named nodelabelfont { anodelabelfont } + named nodelabelbreak { anodelabelbreak } + named nodelabelformat right @Body { anodelabelformat @Body } + import @Geometry named nodelabelpos { anodelabelpos } + named nodelabelprox { anodelabelprox } + import @Geometry named nodelabelangle { anodelabelangle } + named nodelabelctr { anodelabelctr } + import @Geometry named nodelabeladjust { anodelabeladjust } + + named alabel { aalabel } + named alabelmargin { aalabelmargin } + named alabelfont { aalabelfont } + named alabelbreak { aalabelbreak } + named alabelformat right @Body { aalabelformat @Body } + import @Geometry named alabelpos { aalabelpos } + named alabelprox { aalabelprox } + import @Geometry named alabelangle { aalabelangle } + named alabelctr { aalabelctr } + import @Geometry named alabeladjust { aalabeladjust } + + named blabel { ablabel } + named blabelmargin { ablabelmargin } + named blabelfont { ablabelfont } + named blabelbreak { ablabelbreak } + named blabelformat right @Body { ablabelformat @Body } + import @Geometry named blabelpos { ablabelpos } + named blabelprox { ablabelprox } + import @Geometry named blabelangle { ablabelangle } + named blabelctr { ablabelctr } + import @Geometry named blabeladjust { ablabeladjust } + + named clabel { aclabel } + named clabelmargin { aclabelmargin } + named clabelfont { aclabelfont } + named clabelbreak { aclabelbreak } + named clabelformat right @Body { aclabelformat @Body } + import @Geometry named clabelpos { aclabelpos } + named clabelprox { aclabelprox } + import @Geometry named clabelangle { aclabelangle } + named clabelctr { aclabelctr } + import @Geometry named clabeladjust { aclabeladjust } + + named dlabel { adlabel } + named dlabelmargin { adlabelmargin } + named dlabelfont { adlabelfont } + named dlabelbreak { adlabelbreak } + named dlabelformat right @Body { adlabelformat @Body } + import @Geometry named dlabelpos { adlabelpos } + named dlabelprox { adlabelprox } + import @Geometry named dlabelangle { adlabelangle } + named dlabelctr { adlabelctr } + import @Geometry named dlabeladjust { adlabeladjust } - def @SolidArrowHead - named width { arrowwidth } - named length { arrowlength } - named pathwidth { pathwidth } - { - @InsulatedNode - paint { nochange } - outlinestyle { noline } - outlinewidth { pathwidth } - outline { - @BackEnd @Case { - PostScript @Yield { - "ldiagsolidarrowhead" - # 0 0 xsize ysize * 0.5 0 ysize - } - PDF @Yield {} - } + right @Body + { + + def @LabelPos + left x + right y + { + nodelabelpos @Case { + x @Yield y + else @Yield "" } - { - length @Wide width @High - } - } + } - def @OpenArrowHead - named width { arrowwidth } - named length { arrowlength } - named pathwidth { pathwidth } - { - @InsulatedNode - outlinewidth { pathwidth } - outlinestyle { noline } - paint { nochange } - outline { - @BackEnd @Case { - PostScript @Yield { - pathwidth "ldiagopenarrowhead" + def @If + left cond + right x + { + cond @Case { + { yes Yes } @Yield x + else @Yield "" + } + } - # PSW := { 0 0 } - # PNW := { 0 ysize } - # PE := { xsize ysize*0.5 } - # REL := pathwidth atangle { PE angleto PNW + 90d } - # PNA := { 0 ysize*0.5 + pathwidth*0.5 } - # PSA := { 0 ysize*0.5 - pathwidth*0.5 } - # PNI := { - # PNA PNA ++ { xsize 0 } - # PNW ++ REL PE ++ REL ldiaglineintersect - # } - # PSI := PNI -- { 0 pathwidth } - # - # PSW PE PNW PNI PNA PSA PSI PSW - } - PDF @Yield {} - } + + def @Strut right x + { + def vs { 0.5w @VShift { vstrut @High } } + def hs { hstrut @Wide } + + @HContract @VContract { + @HContract @VContract x | vs / hs | } + } + + def @Indent right x { - length @Wide width @High + x @Case { + { top left } @Yield 0.0rt + { ctr } @Yield 0.5rt + { foot right } @Yield 1.0rt + { mctr } @Yield 0.5bx + else @Yield x + } } - } - def @HalfOpenArrowHead - named width { arrowwidth } - named length { arrowlength } - named pathwidth { pathwidth } - { - @InsulatedNode - paint { nochange } - outlinestyle { noline } - outlinewidth { pathwidth } - outline { - @BackEnd @Case { - PostScript @Yield { - pathwidth "ldiaghalfopenarrowhead" + def @VSize right x + { + vsize @Case { + "" @Yield x + else @Yield { vsize @High { /{@Indent vindent} x / } } + } + } - # 0 0 - # xsize ysize * 0.5 - # 0 ysize - # xsize*0.3 ysize*0.5 + pathwidth*0.5 - # 0 ysize*0.5 + pathwidth*0.5 - # 0 ysize*0.5 - pathwidth*0.5 - # xsize*0.3 ysize*0.5 - pathwidth*0.5 - # 0 0 - } - PDF @Yield {} - } + def @HSize right x + { + hsize @Case { + "" @Yield x + else @Yield { hsize @Wide { |{@Indent hindent} x | } } } + } + + def @Align right x { - length @Wide width @High + x @Case { + { top left } @Yield 0.0w + { ctr } @Yield 0.5w + { foot right } @Yield 1.0w + { mark } @Yield "+0i" + else @Yield x + } } - } - def @SolidCurvedArrowHead - named width { arrowwidth } - named length { arrowlength } - named pathwidth { pathwidth } - { - @InsulatedNode - outlinestyle { noline } - paint { nochange } - outlinewidth { pathwidth } - outline { - @BackEnd @Case { - PostScript @Yield { - "ldiagsolidcurvedarrowhead" - # 0 0 - # [0 0 xsize ysize * 0.5 "ldiaglinebetween" - # xsize 0 xsize ysize "ldiaglineintersect" clockwise] - # xsize ysize * 0.5 - # [xsize ysize * 0.5 0 ysize "ldiaglinebetween" - # xsize 0 xsize ysize "ldiaglineintersect" clockwise] - # 0 ysize - } - PDF @Yield {} - } - } + def @ALabel { - length @Wide width @High + @DoLabel + which { "a" } + label { alabel @Else nodelabel } + labelmargin { alabelmargin @Else nodelabelmargin } + labelfont { alabelfont @Else nodelabelfont } + labelbreak { alabelbreak @Else nodelabelbreak } + labelformat { alabelformat @Body @Else nodelabelformat @Body} + labelpos { alabelpos @Else nodelabelpos } + labelprox { alabelprox @Else nodelabelprox } + labelangle { alabelangle @Else nodelabelangle } + labelctr { alabelctr @Else nodelabelctr } + labeladjust { alabeladjust @Else nodelabeladjust } } - } - def @OpenCurvedArrowHead - named width { arrowwidth } - named length { arrowlength } - named pathwidth { pathwidth } - { - @InsulatedNode - outlinestyle { noline } - paint { nochange } - outlinewidth { pathwidth } - outline { - @BackEnd @Case { - PostScript @Yield { - pathwidth "ldiagopencurvedarrowhead" - # LR:= { 0 0 xsize ysize * 0.5 "ldiaglinebetween" - # xsize 0 xsize ysize "ldiaglineintersect" } - # UR:= { xsize ysize * 0.5 0 ysize "ldiaglinebetween" - # xsize 0 xsize ysize "ldiaglineintersect" } - # PW2 := pathwidth * 0.5 - # UMID := { - # 0 ysize * 0.5 + PW2 xsize ysize * 0.5 + PW2 - # {0 ysize} ++ 1f atangle { UR angleto {0 ysize} + 90d } - # { 0 ysize } ldiaglineintersect - # } - # LMID := UMID -- { 0 pathwidth } - # 0 0 - # [LR clockwise] - # xsize ysize * 0.5 - # [UR clockwise] - # 0 ysize - # UMID - # 0 ysize * 0.5 + PW2 - # 0 ysize * 0.5 - PW2 - # LMID - # 0 0 - } - PDF @Yield {} - } - } + def @BLabel { - length @Wide width @High + @DoLabel + which { "b" } + label { blabel @Else nodelabel } + labelmargin { blabelmargin @Else nodelabelmargin } + labelfont { blabelfont @Else nodelabelfont } + labelbreak { blabelbreak @Else nodelabelbreak } + labelformat { blabelformat @Body @Else nodelabelformat @Body} + labelpos { blabelpos @Else nodelabelpos } + labelprox { blabelprox @Else nodelabelprox } + labelangle { blabelangle @Else nodelabelangle } + labelctr { blabelctr @Else nodelabelctr } + labeladjust { blabeladjust @Else nodelabeladjust } } - } - def @HalfOpenCurvedArrowHead - named width { arrowwidth } - named length { arrowlength } - named pathwidth { pathwidth } - { - @InsulatedNode - outlinestyle { noline } - paint { nochange } - outlinewidth { pathwidth } - outline { - @BackEnd @Case { - PostScript @Yield { - pathwidth "ldiaghalfopencurvedarrowhead" - # LR:= { 0 0 xsize ysize * 0.5 "ldiaglinebetween" - # xsize 0 xsize ysize "ldiaglineintersect" } - # UR:= { xsize ysize * 0.5 0 ysize "ldiaglinebetween" - # xsize 0 xsize ysize "ldiaglineintersect" } - # BR:= { 0 0 LR 0 ysize UR "ldiaglineintersect" } - # BRAD := { 0 0 } distance BR - # PW2 := pathwidth * 0.5 - # XDIST := sqrt { BRAD*BRAD - PW2*PW2 } - # UMID := BR ++ { XDIST PW2 } - # LMID := BR ++ { XDIST 0 - PW2 } - # 0 0 - # [LR clockwise] - # xsize ysize * 0.5 - # [UR clockwise] - # 0 ysize - # [BR clockwise ] - # UMID - # 0 ysize * 0.5 + PW2 - # 0 ysize * 0.5 - PW2 - # LMID - # [BR clockwise ] - # 0 0 - } - PDF @Yield {} - } - } + def @CLabel { - length @Wide width @High + @DoLabel + which { "c" } + label { clabel @Else nodelabel } + labelmargin { clabelmargin @Else nodelabelmargin } + labelfont { clabelfont @Else nodelabelfont } + labelbreak { clabelbreak @Else nodelabelbreak } + labelformat { clabelformat @Body @Else nodelabelformat @Body} + labelpos { clabelpos @Else nodelabelpos } + labelprox { clabelprox @Else nodelabelprox } + labelangle { clabelangle @Else nodelabelangle } + labelctr { clabelctr @Else nodelabelctr } + labeladjust { clabeladjust @Else nodelabeladjust } } - } - def @CircleArrowHead - named width { arrowwidth } - named length { arrowlength } - named pathwidth { pathwidth } - { - @InsulatedNode - outlinestyle { noline } - paint { nochange } - outlinewidth { pathwidth } - outline { circle } - { length @Wide length @High } - } + def @DLabel + { + @DoLabel + which { "d" } + label { dlabel @Else nodelabel } + labelmargin { dlabelmargin @Else nodelabelmargin } + labelfont { dlabelfont @Else nodelabelfont } + labelbreak { dlabelbreak @Else nodelabelbreak } + labelformat { dlabelformat @Body @Else nodelabelformat @Body} + labelpos { dlabelpos @Else nodelabelpos } + labelprox { dlabelprox @Else nodelabelprox } + labelangle { dlabelangle @Else nodelabelangle } + labelctr { dlabelctr @Else nodelabelctr } + labeladjust { dlabeladjust @Else nodelabeladjust } + } - def @BoxArrowHead - named width { arrowwidth } - named length { arrowlength } - named pathwidth { pathwidth } - { - @InsulatedNode - outlinestyle { noline } - paint { nochange } - outlinewidth { pathwidth } - outline { box } - { length @Wide width @High } - } + import @Geometry + def @OutLine + { + @BackEnd @Case { + PostScript @Yield { + outline @Case { + box @Yield { "ldiagbox" } + curvebox @Yield { "("margin") ldiagcurvebox" } + shadowbox @Yield { shadow "ldiagshadow ldiagbox" } + square @Yield { "ldiagsquare" } + diamond @Yield { "ldiagdiamond" } + polygon @Yield { sides angle "ldiagpolygon" } + isosceles @Yield { "ldiagisosceles" } + ellipse @Yield { "ldiagellipse" } + circle @Yield { "ldiagcircle" } + else @Yield { + outline + margin { "("margin") ldiagdecodelength" } + shadow { shadow } + sides { sides } + angle { angle } + } + } + } + PDF @Yield {} + } + } - def @ArrowHead - named style { arrowstyle } - named width { arrowwidth } - named length { arrowlength } - named pathwidth { pathwidth } - { - style @Case { - solid @Yield @SolidArrowHead - width { width } length { length } - pathwidth { pathwidth } - halfopen @Yield @HalfOpenArrowHead - width { width } length { length } - pathwidth { pathwidth } - open @Yield @OpenArrowHead - width { width } length { length } - pathwidth { pathwidth } - curvedsolid @Yield @SolidCurvedArrowHead - width { width } length { length } - pathwidth { pathwidth } - curvedhalfopen @Yield @HalfOpenCurvedArrowHead - width { width } length { length } - pathwidth { pathwidth } - curvedopen @Yield @OpenCurvedArrowHead - width { width } length { length } - pathwidth { pathwidth } - circle @Yield @CircleArrowHead - width { width } length { length } - pathwidth { pathwidth } - box @Yield @BoxArrowHead - width { width } length { length } - pathwidth { pathwidth } + def @Value + { + @BackEnd @Case { + PostScript @Yield { + @HContract @VContract + { + { + "ldiagnodebegin [" @OutLine "]" + outlinedashlength "[" outlinestyle "]" + outlinewidth "/ldiag"paint "ldiagnodeend" + "(IN) ldiagpushtagdict" + // + "ldiagpopuptagdict" + } + @Graphic + { + {@Align valign} @VShift {@Align halign} @HShift + @AddMargins + mtop { topmargin @Else vmargin @Else margin } + mfoot { footmargin @Else vmargin @Else margin } + mleft { leftmargin @Else hmargin @Else margin } + mright { rightmargin @Else hmargin @Else margin } + @HSize @VSize @HContract @VContract + font @Font break @Break format @Strut @Body + } + / {alabel @Else nodelabel} @IfNonEmpty @ALabel + / {blabel @Else nodelabel} @IfNonEmpty @BLabel + / {clabel @Else nodelabel} @IfNonEmpty @CLabel + / {dlabel @Else nodelabel} @IfNonEmpty @DLabel + } + } + PDF @Yield {} + } + } + + def @TValue + { + nodetag @Case { + "" @Yield @Value + else @Yield { nodetag:: @Value } + } } - } - def @Link - import @Geometry named path - named from {} - named to {} - named bias {} - named fbias {} - named tbias {} - named radius {} - named xindent {} - named zindent {} - named frompt {} - named topt {} - named arrow {} - named arrowlength {} - { path - from { from } - to { to } - bias { bias } - fbias { fbias } - tbias { tbias } - radius { radius } - xindent { xindent } - zindent { zindent } - frompt { frompt } - topt { topt } - arrow { arrow } - arrowlength { arrowlength } + translate @Case { + "" @Yield @TValue + else @Yield { + @Null & # so that preceding space gets chewed up + @Transform translate { translate } rotate { rotate } @TValue + } + } + } + + + ####################################################################### + # # + # @BNode # + # # + ####################################################################### + + def @BNode + import @Geometry named translate + named to precedence 10 left x right y { + @BackEnd @Case { + PostScript @Yield { x y "ldiagpsub" } + PDF @Yield {""} + } + } + {} + import @Geometry named rotate { 0d } + import @Geometry named outline + named margin {} + named shadow {} + named sides {} + named angle {} + { boutline + margin { margin } + shadow { shadow } + sides { sides } + angle { angle } } - import @Geometry named from { from } - import @Geometry named to { to } - import @Geometry named bias { bias } - import @Geometry named fbias { fbias } - import @Geometry named tbias { tbias } - import @Geometry named radius { radius } - import @Geometry named xindent { xindent } - import @Geometry named zindent { zindent } - import @Geometry named frompt { frompt } - import @Geometry named topt { topt } - named pathstyle + named margin { bmargin } + import @Geometry named shadow { bshadow } + import @Geometry named sides { bsides } + import @Geometry named angle { bangle } + named nodetag { bnodetag } + named outlinestyle named solid { "/ldiagsolid" } named dashed { "/ldiagdashed" } named cdashed { "/ldiagcdashed" } named dotted { "/ldiagdotted" } named noline { "/ldiagnoline" } - { pathstyle } - import @Geometry named pathdashlength { pathdashlength } - import @Geometry named pathwidth + { boutlinestyle } + import @Geometry named outlinedashlength { boutlinedashlength} + import @Geometry named outlinewidth named thin { 0.04 ft } named medium { 0.08 ft } named thick { 0.12 ft } - { pathwidth } - import @Geometry named pathgap - named thin { 0.08 ft } - named medium { 0.16 ft } - named thick { 0.24 ft } - { pathgap } + { boutlinewidth } + named paint { bpaint } + named font { bfont } + named break { bbreak } + named format right @Body { bformat @Body } + named valign { bvalign } + named vsize { bvsize } + named vindent { bvindent } + named vstrut + named no { 0.0f } + named yes { 1.0f } + { bvstrut } + named vmargin { bvmargin } + named topmargin { btopmargin } + named footmargin { bfootmargin } + + named halign { bhalign } + named hsize { bhsize } + named hindent { bhindent } + named hstrut + named no { 0.0f } + named yes { 1.0f } + { bhstrut } + named hmargin { bhmargin } + named leftmargin { bleftmargin } + named rightmargin { brightmargin } + + named nodelabel { bnodelabel } + named nodelabelmargin { bnodelabelmargin } + named nodelabelfont { bnodelabelfont } + named nodelabelbreak { bnodelabelbreak } + named nodelabelformat right @Body { bnodelabelformat @Body } + import @Geometry named nodelabelpos { bnodelabelpos } + named nodelabelprox { bnodelabelprox } + import @Geometry named nodelabelangle { bnodelabelangle } + named nodelabelctr { bnodelabelctr } + import @Geometry named nodelabeladjust { bnodelabeladjust } + + named alabel { balabel } + named alabelmargin { balabelmargin } + named alabelfont { balabelfont } + named alabelbreak { balabelbreak } + named alabelformat right @Body { balabelformat @Body } + import @Geometry named alabelpos { balabelpos } + named alabelprox { balabelprox } + import @Geometry named alabelangle { balabelangle } + named alabelctr { balabelctr } + import @Geometry named alabeladjust { balabeladjust } + + named blabel { bblabel } + named blabelmargin { bblabelmargin } + named blabelfont { bblabelfont } + named blabelbreak { bblabelbreak } + named blabelformat right @Body { bblabelformat @Body } + import @Geometry named blabelpos { bblabelpos } + named blabelprox { bblabelprox } + import @Geometry named blabelangle { bblabelangle } + named blabelctr { bblabelctr } + import @Geometry named blabeladjust { bblabeladjust } + + named clabel { bclabel } + named clabelmargin { bclabelmargin } + named clabelfont { bclabelfont } + named clabelbreak { bclabelbreak } + named clabelformat right @Body { bclabelformat @Body } + import @Geometry named clabelpos { bclabelpos } + named clabelprox { bclabelprox } + import @Geometry named clabelangle { bclabelangle } + named clabelctr { bclabelctr } + import @Geometry named clabeladjust { bclabeladjust } + + named dlabel { bdlabel } + named dlabelmargin { bdlabelmargin } + named dlabelfont { bdlabelfont } + named dlabelbreak { bdlabelbreak } + named dlabelformat right @Body { bdlabelformat @Body } + import @Geometry named dlabelpos { bdlabelpos } + named dlabelprox { bdlabelprox } + import @Geometry named dlabelangle { bdlabelangle } + named dlabelctr { bdlabelctr } + import @Geometry named dlabeladjust { bdlabeladjust } - named arrow { arrow } - named arrowstyle { arrowstyle } - named arrowwidth { arrowwidth } - named arrowlength { arrowlength } + right @Body + { - named linklabel { linklabel } - named linklabelmargin { linklabelmargin } - named linklabelfont { linklabelfont } - named linklabelbreak { linklabelbreak } - named linklabelformat right @Body { linklabelformat @Body } - import @Geometry named linklabelpos { linklabelpos } - named linklabelprox { linklabelprox } - import @Geometry named linklabelangle { linklabelangle } - named linklabelctr { linklabelctr } - import @Geometry named linklabeladjust { linklabeladjust } + def @LabelPos + left x + right y + { + nodelabelpos @Case { + x @Yield y + else @Yield "" + } + } - named xlabel { xlabel } - named xlabelmargin { xlabelmargin } - named xlabelfont { xlabelfont } - named xlabelbreak { xlabelbreak } - named xlabelformat right @Body { xlabelformat @Body } - import @Geometry named xlabelpos { xlabelpos } - named xlabelprox { xlabelprox } - import @Geometry named xlabelangle { xlabelangle } - named xlabelctr { xlabelctr } - import @Geometry named xlabeladjust { xlabeladjust } + def @If + left cond + right x + { + cond @Case { + { yes Yes } @Yield x + else @Yield "" + } + } - named ylabel { ylabel } - named ylabelmargin { ylabelmargin } - named ylabelfont { ylabelfont } - named ylabelbreak { ylabelbreak } - named ylabelformat right @Body { ylabelformat @Body } - import @Geometry named ylabelpos { ylabelpos } - named ylabelprox { ylabelprox } - import @Geometry named ylabelangle { ylabelangle } - named ylabelctr { ylabelctr } - import @Geometry named ylabeladjust { ylabeladjust } - named zlabel { zlabel } - named zlabelmargin { zlabelmargin } - named zlabelfont { zlabelfont } - named zlabelbreak { zlabelbreak } - named zlabelformat right @Body { zlabelformat @Body } - import @Geometry named zlabelpos { zlabelpos } - named zlabelprox { zlabelprox } - import @Geometry named zlabelangle { zlabelangle } - named zlabelctr { zlabelctr } - import @Geometry named zlabeladjust { zlabeladjust } + def @Strut right x + { + def vs { 0.5w @VShift { vstrut @High } } + def hs { hstrut @Wide } - named fromlabel { fromlabel } - named fromlabelmargin { fromlabelmargin } - named fromlabelfont { fromlabelfont } - named fromlabelbreak { fromlabelbreak } - named fromlabelformat right @Body { fromlabelformat @Body } - import @Geometry named fromlabelpos { fromlabelpos } - named fromlabelprox { fromlabelprox } - import @Geometry named fromlabelangle { fromlabelangle } - named fromlabelctr { fromlabelctr } - import @Geometry named fromlabeladjust { fromlabeladjust } + @HContract @VContract { + @HContract @VContract x | vs / hs | + } + } - named tolabel { tolabel } - named tolabelmargin { tolabelmargin } - named tolabelfont { tolabelfont } - named tolabelbreak { tolabelbreak } - named tolabelformat right @Body { tolabelformat @Body } - import @Geometry named tolabelpos { tolabelpos } - named tolabelprox { tolabelprox } - import @Geometry named tolabelangle { tolabelangle } - named tolabelctr { tolabelctr } - import @Geometry named tolabeladjust{ tolabeladjust } + def @Indent right x + { + x @Case { + { top left } @Yield 0.0rt + { ctr } @Yield 0.5rt + { foot right } @Yield 1.0rt + { mctr } @Yield 0.5bx + else @Yield x + } + } - { - def @XLabel + def @VSize right x + { + vsize @Case { + "" @Yield x + else @Yield { vsize @High { /{@Indent vindent} x / } } + } + } + + def @HSize right x + { + hsize @Case { + "" @Yield x + else @Yield { hsize @Wide { |{@Indent hindent} x | } } + } + } + + def @Align right x { - @DoLabel - which { "x" } - label { xlabel @Else linklabel } - labelmargin { xlabelmargin @Else linklabelmargin } - labelfont { xlabelfont @Else linklabelfont } - labelbreak { xlabelbreak @Else linklabelbreak } - labelformat { xlabelformat @Body @Else linklabelformat @Body} - labelpos { xlabelpos @Else linklabelpos } - labelprox { xlabelprox @Else linklabelprox } - labelangle { xlabelangle @Else linklabelangle } - labelctr { xlabelctr @Else linklabelctr } - labeladjust { xlabeladjust @Else linklabeladjust } + x @Case { + { top left } @Yield 0.0w + { ctr } @Yield 0.5w + { foot right } @Yield 1.0w + { mark } @Yield "+0i" + else @Yield x + } } - def @YLabel + def @ALabel { @DoLabel - which { "y" } - label { ylabel @Else linklabel } - labelmargin { ylabelmargin @Else linklabelmargin } - labelfont { ylabelfont @Else linklabelfont } - labelbreak { ylabelbreak @Else linklabelbreak } - labelformat { ylabelformat @Body @Else linklabelformat @Body} - labelpos { ylabelpos @Else linklabelpos } - labelprox { ylabelprox @Else linklabelprox } - labelangle { ylabelangle @Else linklabelangle } - labelctr { ylabelctr @Else linklabelctr } - labeladjust { ylabeladjust @Else linklabeladjust } + which { "a" } + label { alabel @Else nodelabel } + labelmargin { alabelmargin @Else nodelabelmargin } + labelfont { alabelfont @Else nodelabelfont } + labelbreak { alabelbreak @Else nodelabelbreak } + labelformat { alabelformat @Body @Else nodelabelformat @Body} + labelpos { alabelpos @Else nodelabelpos } + labelprox { alabelprox @Else nodelabelprox } + labelangle { alabelangle @Else nodelabelangle } + labelctr { alabelctr @Else nodelabelctr } + labeladjust { alabeladjust @Else nodelabeladjust } } - def @ZLabel + def @BLabel { @DoLabel - which { "z" } - label { zlabel @Else linklabel } - labelmargin { zlabelmargin @Else linklabelmargin } - labelfont { zlabelfont @Else linklabelfont } - labelbreak { zlabelbreak @Else linklabelbreak } - labelformat { zlabelformat @Body @Else linklabelformat @Body} - labelpos { zlabelpos @Else linklabelpos } - labelprox { zlabelprox @Else linklabelprox } - labelangle { zlabelangle @Else linklabelangle } - labelctr { zlabelctr @Else linklabelctr } - labeladjust { zlabeladjust @Else linklabeladjust } + which { "b" } + label { blabel @Else nodelabel } + labelmargin { blabelmargin @Else nodelabelmargin } + labelfont { blabelfont @Else nodelabelfont } + labelbreak { blabelbreak @Else nodelabelbreak } + labelformat { blabelformat @Body @Else nodelabelformat @Body} + labelpos { blabelpos @Else nodelabelpos } + labelprox { blabelprox @Else nodelabelprox } + labelangle { blabelangle @Else nodelabelangle } + labelctr { blabelctr @Else nodelabelctr } + labeladjust { blabeladjust @Else nodelabeladjust } } - def @FromArrow + def @CLabel { - arrow @Case { - { back both } @Yield { - @ArrowHead - style { arrowstyle } - width { arrowwidth } - length { arrowlength } - pathwidth { pathwidth } - } - else @Yield "" - } + @DoLabel + which { "c" } + label { clabel @Else nodelabel } + labelmargin { clabelmargin @Else nodelabelmargin } + labelfont { clabelfont @Else nodelabelfont } + labelbreak { clabelbreak @Else nodelabelbreak } + labelformat { clabelformat @Body @Else nodelabelformat @Body} + labelpos { clabelpos @Else nodelabelpos } + labelprox { clabelprox @Else nodelabelprox } + labelangle { clabelangle @Else nodelabelangle } + labelctr { clabelctr @Else nodelabelctr } + labeladjust { clabeladjust @Else nodelabeladjust } } - def @ToArrow + def @DLabel { - arrow @Case { - { yes forward both } @Yield { - @ArrowHead - style { arrowstyle } - width { arrowwidth } - length { arrowlength } - pathwidth { pathwidth } - } - else @Yield "" - } + @DoLabel + which { "d" } + label { dlabel @Else nodelabel } + labelmargin { dlabelmargin @Else nodelabelmargin } + labelfont { dlabelfont @Else nodelabelfont } + labelbreak { dlabelbreak @Else nodelabelbreak } + labelformat { dlabelformat @Body @Else nodelabelformat @Body} + labelpos { dlabelpos @Else nodelabelpos } + labelprox { dlabelprox @Else nodelabelprox } + labelangle { dlabelangle @Else nodelabelangle } + labelctr { dlabelctr @Else nodelabelctr } + labeladjust { dlabeladjust @Else nodelabeladjust } } import @Geometry - def @LinePath + def @OutLine { - @BackEnd @Case { - PostScript @Yield { - {arrow @FromArrowLength arrowlength} - {arrow @ToArrowLength arrowlength} - "{" from "}" "{" to "}" - xindent zindent "ldiaglinepath" - # FROM :< {from??CTR angleto to??CTR} - # FROM :: from boundaryatangle FROM@ANGLE - # ++ {arrow @FromArrowLength arrowlength}atangle FROM@ANGLE - # TO :< FROM@ANGLE - # TO :: to boundaryatangle { TO@ANGLE - 180d } - # ++ {arrow @ToArrowLength arrowlength} atangle {TO@ANGLE - 180d} - # - # LMID :: FROM ** 0.5 ++ TO ** 0.5 - # LMID :< FROM@ANGLE - # XINDENT := xindent min { FROM distance LMID } - # LFROM :: FROM ++ XINDENT atangle FROM@ANGLE - # LFROM :< FROM@ANGLE - # ZINDENT := zindent min { TO distance LMID } - # LTO :: TO -- ZINDENT atangle FROM@ANGLE - # LTO :< FROM@ANGLE - # - # if cond { direct } - # then { FROM TO } - # else { FROM LFROM LMID LTO TO } + @BackEnd @Case { + PostScript @Yield { + outline @Case { + box @Yield { "ldiagbox" } + curvebox @Yield { "("margin") ldiagcurvebox" } + shadowbox @Yield { shadow "ldiagshadow ldiagbox" } + square @Yield { "ldiagsquare" } + diamond @Yield { "ldiagdiamond" } + polygon @Yield { sides angle "ldiagpolygon" } + isosceles @Yield { "ldiagisosceles" } + ellipse @Yield { "ldiagellipse" } + circle @Yield { "ldiagcircle" } + else @Yield { + outline + margin { "("margin") ldiagdecodelength" } + shadow { shadow } + sides { sides } + angle { angle } + } + } } PDF @Yield {} } } - import @Geometry - def @DoubleLinePath - { - @BackEnd @Case { - PostScript @Yield { - {arrow @FromArrowLength arrowlength} - {arrow @ToArrowLength arrowlength} - "{" from "}" "{" to "}" - xindent zindent pathgap "ldiagdoublelinepath" - # FROM :< {from??CTR angleto to??CTR} - # FROM :: from boundaryatangle FROM@ANGLE - # ++ {arrow @FromArrowLength arrowlength}atangle FROM@ANGLE - # TO :< FROM@ANGLE - # TO :: to boundaryatangle { TO@ANGLE - 180d } - # ++ {arrow @ToArrowLength arrowlength} atangle {TO@ANGLE - 180d} - # - # LMID :: FROM ** 0.5 ++ TO ** 0.5 - # LMID :< FROM@ANGLE - # XINDENT := xindent min { FROM distance LMID } - # LFROM :: FROM ++ XINDENT atangle FROM@ANGLE - # LFROM :< FROM@ANGLE - # ZINDENT := zindent min { TO distance LMID } - # LTO :: TO -- ZINDENT atangle FROM@ANGLE - # LTO :< FROM@ANGLE - # - # if cond { direct } - # then { FROM TO } - # else { FROM LFROM LMID LTO TO } - } - PDF @Yield {} + def @Value + { + @BackEnd @Case { + PostScript @Yield { + @HContract @VContract + { + { + "ldiagnodebegin [" @OutLine "]" + outlinedashlength "[" outlinestyle "]" + outlinewidth "/ldiag"paint "ldiagnodeend" + "(IN) ldiagpushtagdict" + // + "ldiagpopuptagdict" + } + @Graphic + { + {@Align valign} @VShift {@Align halign} @HShift + @AddMargins + mtop { topmargin @Else vmargin @Else margin } + mfoot { footmargin @Else vmargin @Else margin } + mleft { leftmargin @Else hmargin @Else margin } + mright { rightmargin @Else hmargin @Else margin } + @HSize @VSize @HContract @VContract + font @Font break @Break format @Strut @Body + } + / {alabel @Else nodelabel} @IfNonEmpty @ALabel + / {blabel @Else nodelabel} @IfNonEmpty @BLabel + / {clabel @Else nodelabel} @IfNonEmpty @CLabel + / {dlabel @Else nodelabel} @IfNonEmpty @DLabel } - } + } + PDF @Yield {} + } + } - import @Geometry - def @ACurvePath + def @TValue { - @BackEnd @Case { - PostScript @Yield { - {arrow @FromArrowLength arrowlength} - {arrow @ToArrowLength arrowlength} - "{" from "}" "{" to "}" - xindent zindent bias "ldiagacurvepath" - # #B1 := bias max 0.02f - # #B2 := { from??CTR distance to??CTR } * 0.5 - # #BIAS := B1 min B2 - # BIAS := bias max 0.02f - # XMID := from??CTR ** 0.5 ++ to??CTR ** 0.5 - # XTOP := XMID ++ BIAS atangle {from??CTR angleto to??CTR - 90d} - # CTR := { from??CTR XTOP ldiaglinebetween - # to??CTR XTOP ldiaglinebetween ldiaglineintersect } - # FROM :: aabout - # circum { from } - # extra { arrow @FromArrowLength arrowlength } - # centre { CTR } - # FROM :< if cond { from??CTR distance FROM > 0 } - # then { from??CTR angleto FROM } - # else { CTR angleto FROM + 90d } - # TO :: cabout - # circum { to } - # extra { arrow @ToArrowLength arrowlength } - # centre { CTR } - # TO :< if cond { TO distance to??CTR > 0 } - # then { TO angleto to??CTR } - # else { CTR angleto TO + 90d } - # - # RADIUS := CTR distance FROM - # LMID :: CTR ++ RADIUS atangle { - # CTR angleto FROM + - # { {360d + {CTR angleto TO} - {CTR angleto FROM}} mod 360 } / 2 - # } - # LMID :< CTR angleto LMID + 90d - # - # XINDENT := xindent min { FROM distance LMID } - # LFROM :: CTR ++ RADIUS atangle { - # CTR angleto { FROM ++ XINDENT atangle FROM@ANGLE } } - # LFROM :< CTR angleto LFROM + 90d - # ZINDENT := zindent min { TO distance LMID } - # LTO :: CTR ++ RADIUS atangle { - # CTR angleto { TO ++ ZINDENT atangle {TO@ANGLE+180d}}} - # LTO :< CTR angleto LTO + 90d - # - # if cond { direct } - # then { FROM [CTR] TO } - # else { FROM [CTR] LFROM [CTR] LMID [CTR] LTO [CTR] TO } - } - PDF @Yield {} + nodetag @Case { + "" @Yield @Value + else @Yield { nodetag:: @Value } } } - import @Geometry - def @CCurvePath - { - @BackEnd @Case { - PostScript @Yield { - {arrow @FromArrowLength arrowlength} - {arrow @ToArrowLength arrowlength} - "{" from "}" "{" to "}" - xindent zindent bias "ldiagccurvepath" - # #B1 := bias max 0.02f - # #B2 := { from??CTR distance to??CTR } * 0.5 - # #BIAS := B1 min B2 - # BIAS := bias max 0.02f - # XMID := from??CTR ** 0.5 ++ to??CTR ** 0.5 - # XTOP := XMID ++ BIAS atangle {from??CTR angleto to??CTR + 90d} - # CTR := { from??CTR XTOP ldiaglinebetween - # to??CTR XTOP ldiaglinebetween ldiaglineintersect } - # FROM :: cabout - # circum { from } - # extra { arrow @FromArrowLength arrowlength } - # centre { CTR } - # FROM :< if cond { from??CTR distance FROM > 0 } - # then { from??CTR angleto FROM } - # else { CTR angleto FROM - 90d } - # TO :: aabout - # circum { to } - # extra { arrow @ToArrowLength arrowlength } - # centre { CTR } - # TO :< if cond { TO distance to??CTR > 0 } - # then { TO angleto to??CTR } - # else { CTR angleto TO - 90d } - # - # RADIUS := CTR distance FROM - # LMID :: CTR ++ RADIUS atangle { - # CTR angleto TO + - # { {360d + {CTR angleto FROM} - {CTR angleto TO} } mod 360 } / 2 - # } - # LMID :< CTR angleto LMID - 90d - # - # XINDENT := xindent min { FROM distance LMID } - # LFROM :: CTR ++ RADIUS atangle { - # CTR angleto { FROM ++ XINDENT atangle FROM@ANGLE } } - # LFROM :< CTR angleto LFROM - 90d - # ZINDENT := zindent min { TO distance LMID } - # LTO :: CTR ++ RADIUS atangle { - # CTR angleto { TO ++ ZINDENT atangle {TO@ANGLE+180d}}} - # LTO :< CTR angleto LTO - 90d - # - # if cond { direct } - # then { FROM [CTR clockwise] TO } - # else { FROM [CTR clockwise] LFROM [CTR clockwise] - # LMID [CTR clockwise] LTO [CTR clockwise] TO } - } - PDF @Yield {} + translate @Case { + "" @Yield @TValue + else @Yield { + @Null & # so that preceding space gets chewed up + @Transform translate { translate } rotate { rotate } @TValue + } + } + } + + + ####################################################################### + # # + # @CNode # + # # + ####################################################################### + + def @CNode + import @Geometry named translate + named to precedence 10 left x right y { + @BackEnd @Case { + PostScript @Yield { x y "ldiagpsub" } + PDF @Yield {""} + } + } + {} + import @Geometry named rotate { 0d } + import @Geometry named outline + named margin {} + named shadow {} + named sides {} + named angle {} + { coutline + margin { margin } + shadow { shadow } + sides { sides } + angle { angle } + } + named margin { cmargin } + import @Geometry named shadow { cshadow } + import @Geometry named sides { csides } + import @Geometry named angle { cangle } + named nodetag { cnodetag } + named outlinestyle + named solid { "/ldiagsolid" } + named dashed { "/ldiagdashed" } + named cdashed { "/ldiagcdashed" } + named dotted { "/ldiagdotted" } + named noline { "/ldiagnoline" } + { coutlinestyle } + import @Geometry named outlinedashlength { coutlinedashlength} + import @Geometry named outlinewidth + named thin { 0.04 ft } + named medium { 0.08 ft } + named thick { 0.12 ft } + { coutlinewidth } + named paint { cpaint } + named font { cfont } + named break { cbreak } + named format right @Body { cformat @Body } + named valign { cvalign } + named vsize { cvsize } + named vindent { cvindent } + named vstrut + named no { 0.0f } + named yes { 1.0f } + { cvstrut } + named vmargin { cvmargin } + named topmargin { ctopmargin } + named footmargin { cfootmargin } + + named halign { chalign } + named hsize { chsize } + named hindent { chindent } + named hstrut + named no { 0.0f } + named yes { 1.0f } + { chstrut } + named hmargin { chmargin } + named leftmargin { cleftmargin } + named rightmargin { crightmargin } + + named nodelabel { cnodelabel } + named nodelabelmargin { cnodelabelmargin } + named nodelabelfont { cnodelabelfont } + named nodelabelbreak { cnodelabelbreak } + named nodelabelformat right @Body { cnodelabelformat @Body } + import @Geometry named nodelabelpos { cnodelabelpos } + named nodelabelprox { cnodelabelprox } + import @Geometry named nodelabelangle { cnodelabelangle } + named nodelabelctr { cnodelabelctr } + import @Geometry named nodelabeladjust { cnodelabeladjust } + + named alabel { calabel } + named alabelmargin { calabelmargin } + named alabelfont { calabelfont } + named alabelbreak { calabelbreak } + named alabelformat right @Body { calabelformat @Body } + import @Geometry named alabelpos { calabelpos } + named alabelprox { calabelprox } + import @Geometry named alabelangle { calabelangle } + named alabelctr { calabelctr } + import @Geometry named alabeladjust { calabeladjust } + + named blabel { cblabel } + named blabelmargin { cblabelmargin } + named blabelfont { cblabelfont } + named blabelbreak { cblabelbreak } + named blabelformat right @Body { cblabelformat @Body } + import @Geometry named blabelpos { cblabelpos } + named blabelprox { cblabelprox } + import @Geometry named blabelangle { cblabelangle } + named blabelctr { cblabelctr } + import @Geometry named blabeladjust { cblabeladjust } + + named clabel { cclabel } + named clabelmargin { cclabelmargin } + named clabelfont { cclabelfont } + named clabelbreak { cclabelbreak } + named clabelformat right @Body { cclabelformat @Body } + import @Geometry named clabelpos { cclabelpos } + named clabelprox { cclabelprox } + import @Geometry named clabelangle { cclabelangle } + named clabelctr { cclabelctr } + import @Geometry named clabeladjust { cclabeladjust } + + named dlabel { cdlabel } + named dlabelmargin { cdlabelmargin } + named dlabelfont { cdlabelfont } + named dlabelbreak { cdlabelbreak } + named dlabelformat right @Body { cdlabelformat @Body } + import @Geometry named dlabelpos { cdlabelpos } + named dlabelprox { cdlabelprox } + import @Geometry named dlabelangle { cdlabelangle } + named dlabelctr { cdlabelctr } + import @Geometry named dlabeladjust { cdlabeladjust } + + right @Body + { + + def @LabelPos + left x + right y + { + nodelabelpos @Case { + x @Yield y + else @Yield "" } - } + } - import @Geometry - def @BezierPath - { - @BackEnd @Case { - PostScript @Yield { - {arrow @FromArrowLength arrowlength} - {arrow @ToArrowLength arrowlength} - "{" from "}" "{" to "}" - xindent zindent [ frompt ] [ topt ] "ldiagbezierpath" - # FROM :< from??CTR angleto frompt - # FROM :: from boundaryatangle FROM@ANGLE - # ++ {arrow @FromArrowLength arrowlength} atangle FROM@ANGLE - # TO :< topt angleto to??CTR - # TO :: to boundaryatangle { TO@ANGLE + 180d } - # ++ {arrow @ToArrowLength arrowlength} atangle { TO@ANGLE + 180d } - # LFROM :: FROM ++ { xindent atangle FROM@ANGLE } - # LFROM :< FROM@ANGLE - # LTO :: TO ++ zindent atangle { TO@ANGLE + 180d } - # LTO :< TO@ANGLE - # LMID :: { FROM ++ TO ++ frompt ++ topt } ** 0.25 - # FROM [frompt topt] TO - } - PDF @Yield {} + def @If + left cond + right x + { + cond @Case { + { yes Yes } @Yield x + else @Yield "" } - } + } - import @Geometry - def @VHLinePath - { - @BackEnd @Case { - PostScript @Yield { - {arrow @FromArrowLength arrowlength} - {arrow @ToArrowLength arrowlength} - "{" from "}" "{" to "}" - xindent zindent "ldiagvhlinepath" - # CTR := { {xcoord from??CTR} {ycoord to??CTR} } - # FANG := from??CTR angleto CTR - # TANG := to??CTR angleto CTR - # FROM :: from boundaryatangle FANG - # ++ {arrow @FromArrowLength arrowlength} atangle FANG - # FROM :< FANG - # TO :: to boundaryatangle TANG - # ++ {arrow @ToArrowLength arrowlength} atangle TANG - # TO :< TANG + 180d - # FDIST := FROM distance CTR - # TDIST := TO distance CTR - # XINDENT := xindent min FDIST - # ZINDENT := zindent min TDIST - # LFROM :: FROM ++ XINDENT atangle FANG - # LFROM :< FROM@ANGLE - # LTO :: TO ++ ZINDENT atangle TANG - # LTO :< TO@ANGLE - # LMID :: CTR - # LMID :< {1f atangle {FANG + 180d}} angleto - # {1f atangle {TANG + 180d}} - # FROM LFROM LMID LTO TO - } - PDF @Yield {} + + def @Strut right x + { + def vs { 0.5w @VShift { vstrut @High } } + def hs { hstrut @Wide } + + @HContract @VContract { + @HContract @VContract x | vs / hs | + } + } + + def @Indent right x + { + x @Case { + { top left } @Yield 0.0rt + { ctr } @Yield 0.5rt + { foot right } @Yield 1.0rt + { mctr } @Yield 0.5bx + else @Yield x } } - import @Geometry - def @VHCurvePath + def @VSize right x + { + vsize @Case { + "" @Yield x + else @Yield { vsize @High { /{@Indent vindent} x / } } + } + } + + def @HSize right x + { + hsize @Case { + "" @Yield x + else @Yield { hsize @Wide { |{@Indent hindent} x | } } + } + } + + def @Align right x { - @BackEnd @Case { - PostScript @Yield { - {arrow @FromArrowLength arrowlength} - {arrow @ToArrowLength arrowlength} - "{" from "}" "{" to "}" - xindent zindent radius "ldiagvhcurvepath" - # CTR := { {xcoord from??CTR} {ycoord to??CTR} } - # FANG := from??CTR angleto CTR - # TANG := to??CTR angleto CTR - # FROM :: from boundaryatangle FANG - # ++ {arrow @FromArrowLength arrowlength} atangle FANG - # FROM :< FANG - # TO :: to boundaryatangle TANG - # ++ {arrow @ToArrowLength arrowlength} atangle TANG - # TO :< TANG + 180d - # FDIST := FROM distance CTR - # TDIST := TO distance CTR - # RADIUS := radius min FDIST min TDIST - # XINDENT := xindent min { FDIST - RADIUS } - # ZINDENT := zindent min { TDIST - RADIUS } - # LFROM :: FROM ++ XINDENT atangle FANG - # LFROM :< FROM@ANGLE - # LTO :: TO ++ ZINDENT atangle TANG - # LTO :< TO@ANGLE - # FCTR := CTR ++ RADIUS atangle { FROM@ANGLE + 180d } - # TCTR := CTR ++ RADIUS atangle { TO@ANGLE } - # XCTR := CTR ++ RADIUS atangle { FROM@ANGLE + 180d } - # ++ RADIUS atangle { TO@ANGLE } - # LMID :: XCTR ++ RADIUS atangle { XCTR angleto CTR } - # LMID :< FCTR angleto TCTR - # FROM LFROM FCTR - # { FCTR angleto TCTR } quadcase - # 0 { } - # 0-90 { [XCTR clockwise] } - # 90 { } - # 90-180 { [XCTR] } - # 180 { } - # 180-270 { [XCTR clockwise] } - # 270 { } - # 270-360 { [XCTR] } - # TCTR LTO TO - } - PDF @Yield {} + x @Case { + { top left } @Yield 0.0w + { ctr } @Yield 0.5w + { foot right } @Yield 1.0w + { mark } @Yield "+0i" + else @Yield x } } + def @ALabel + { + @DoLabel + which { "a" } + label { alabel @Else nodelabel } + labelmargin { alabelmargin @Else nodelabelmargin } + labelfont { alabelfont @Else nodelabelfont } + labelbreak { alabelbreak @Else nodelabelbreak } + labelformat { alabelformat @Body @Else nodelabelformat @Body} + labelpos { alabelpos @Else nodelabelpos } + labelprox { alabelprox @Else nodelabelprox } + labelangle { alabelangle @Else nodelabelangle } + labelctr { alabelctr @Else nodelabelctr } + labeladjust { alabeladjust @Else nodelabeladjust } + } + + def @BLabel + { + @DoLabel + which { "b" } + label { blabel @Else nodelabel } + labelmargin { blabelmargin @Else nodelabelmargin } + labelfont { blabelfont @Else nodelabelfont } + labelbreak { blabelbreak @Else nodelabelbreak } + labelformat { blabelformat @Body @Else nodelabelformat @Body} + labelpos { blabelpos @Else nodelabelpos } + labelprox { blabelprox @Else nodelabelprox } + labelangle { blabelangle @Else nodelabelangle } + labelctr { blabelctr @Else nodelabelctr } + labeladjust { blabeladjust @Else nodelabeladjust } + } + + def @CLabel + { + @DoLabel + which { "c" } + label { clabel @Else nodelabel } + labelmargin { clabelmargin @Else nodelabelmargin } + labelfont { clabelfont @Else nodelabelfont } + labelbreak { clabelbreak @Else nodelabelbreak } + labelformat { clabelformat @Body @Else nodelabelformat @Body} + labelpos { clabelpos @Else nodelabelpos } + labelprox { clabelprox @Else nodelabelprox } + labelangle { clabelangle @Else nodelabelangle } + labelctr { clabelctr @Else nodelabelctr } + labeladjust { clabeladjust @Else nodelabeladjust } + } + + def @DLabel + { + @DoLabel + which { "d" } + label { dlabel @Else nodelabel } + labelmargin { dlabelmargin @Else nodelabelmargin } + labelfont { dlabelfont @Else nodelabelfont } + labelbreak { dlabelbreak @Else nodelabelbreak } + labelformat { dlabelformat @Body @Else nodelabelformat @Body} + labelpos { dlabelpos @Else nodelabelpos } + labelprox { dlabelprox @Else nodelabelprox } + labelangle { dlabelangle @Else nodelabelangle } + labelctr { dlabelctr @Else nodelabelctr } + labeladjust { dlabeladjust @Else nodelabeladjust } + } + import @Geometry - def @HVLinePath + def @OutLine { - @BackEnd @Case { - PostScript @Yield { - {arrow @FromArrowLength arrowlength} - {arrow @ToArrowLength arrowlength} - "{" from "}" "{" to "}" - xindent zindent "ldiaghvlinepath" - # CTR := { {xcoord to??CTR} {ycoord from??CTR} } - # FANG := from??CTR angleto CTR - # TANG := to??CTR angleto CTR - # FROM :: from boundaryatangle FANG - # ++ {arrow @FromArrowLength arrowlength} atangle FANG - # FROM :< FANG - # TO :: to boundaryatangle TANG - # ++ {arrow @ToArrowLength arrowlength} atangle TANG - # TO :< TANG + 180d - # FDIST := FROM distance CTR - # TDIST := TO distance CTR - # XINDENT := xindent min FDIST - # ZINDENT := zindent min TDIST - # LFROM :: FROM ++ XINDENT atangle FANG - # LFROM :< FROM@ANGLE - # LTO :: TO ++ ZINDENT atangle TANG - # LTO :< TO@ANGLE - # LMID :: CTR - # LMID :< {1f atangle {FANG + 180d}} angleto - # {1f atangle {TANG + 180d}} - # FROM LFROM LMID LTO TO + @BackEnd @Case { + PostScript @Yield { + outline @Case { + box @Yield { "ldiagbox" } + curvebox @Yield { "("margin") ldiagcurvebox" } + shadowbox @Yield { shadow "ldiagshadow ldiagbox" } + square @Yield { "ldiagsquare" } + diamond @Yield { "ldiagdiamond" } + polygon @Yield { sides angle "ldiagpolygon" } + isosceles @Yield { "ldiagisosceles" } + ellipse @Yield { "ldiagellipse" } + circle @Yield { "ldiagcircle" } + else @Yield { + outline + margin { "("margin") ldiagdecodelength" } + shadow { shadow } + sides { sides } + angle { angle } + } + } } PDF @Yield {} } } - import @Geometry - def @HVCurvePath - { - @BackEnd @Case { - PostScript @Yield { - {arrow @FromArrowLength arrowlength} - {arrow @ToArrowLength arrowlength} - "{" from "}" "{" to "}" - xindent zindent radius "ldiaghvcurvepath" - # CTR := { {xcoord to??CTR} {ycoord from??CTR} } - # FANG := from??CTR angleto CTR - # TANG := to??CTR angleto CTR - # FROM :: from boundaryatangle FANG - # ++ {arrow @FromArrowLength arrowlength} atangle FANG - # FROM :< FANG - # TO :: to boundaryatangle TANG - # ++ {arrow @ToArrowLength arrowlength} atangle TANG - # TO :< TANG + 180d - # FDIST := FROM distance CTR - # TDIST := TO distance CTR - # RADIUS := radius min FDIST min TDIST - # XINDENT := xindent min { FDIST - RADIUS } - # ZINDENT := zindent min { TDIST - RADIUS } - # LFROM :: FROM ++ XINDENT atangle FANG - # LFROM :< FROM@ANGLE - # LTO :: TO ++ ZINDENT atangle TANG - # LTO :< TO@ANGLE - # FCTR := CTR ++ RADIUS atangle { FROM@ANGLE + 180d } - # TCTR := CTR ++ RADIUS atangle { TO@ANGLE } - # XCTR := CTR ++ RADIUS atangle { FROM@ANGLE + 180d } - # ++ RADIUS atangle { TO@ANGLE } - # LMID :: XCTR ++ RADIUS atangle { XCTR angleto CTR } - # LMID :< FCTR angleto TCTR - # FROM LFROM FCTR - # { FCTR angleto TCTR } quadcase - # 0 { } - # 0-90 { [XCTR] } - # 90 { } - # 90-180 { [XCTR clockwise] } - # 180 { } - # 180-270 { [XCTR] } - # 270 { } - # 270-360 { [XCTR clockwise] } - # TCTR LTO TO + def @Value + { + @BackEnd @Case { + PostScript @Yield { + @HContract @VContract + { + { + "ldiagnodebegin [" @OutLine "]" + outlinedashlength "[" outlinestyle "]" + outlinewidth "/ldiag"paint "ldiagnodeend" + "(IN) ldiagpushtagdict" + // + "ldiagpopuptagdict" + } + @Graphic + { + {@Align valign} @VShift {@Align halign} @HShift + @AddMargins + mtop { topmargin @Else vmargin @Else margin } + mfoot { footmargin @Else vmargin @Else margin } + mleft { leftmargin @Else hmargin @Else margin } + mright { rightmargin @Else hmargin @Else margin } + @HSize @VSize @HContract @VContract + font @Font break @Break format @Strut @Body + } + / {alabel @Else nodelabel} @IfNonEmpty @ALabel + / {blabel @Else nodelabel} @IfNonEmpty @BLabel + / {clabel @Else nodelabel} @IfNonEmpty @CLabel + / {dlabel @Else nodelabel} @IfNonEmpty @DLabel + } + } + PDF @Yield {} + } + } + + def @TValue + { + nodetag @Case { + "" @Yield @Value + else @Yield { nodetag:: @Value } + } + } + + translate @Case { + "" @Yield @TValue + else @Yield { + @Null & # so that preceding space gets chewed up + @Transform translate { translate } rotate { rotate } @TValue + } + } + } + + + ####################################################################### + # # + # @Box, @CurveBox, and other standard node abbreviations # + # # + ####################################################################### + + macro @@Node { @Node } + macro @Box { @Node outline { box } } + macro @CurveBox { @Node outline { curvebox } } + macro @ShadowBox { @Node outline { shadowbox } } + macro @Square { @Node outline { square } } + macro @Diamond { @Node outline { diamond } } + macro @Polygon { @Node outline { polygon } } + macro @Isosceles { @Node outline { isosceles } } + macro @Ellipse { @Node outline { ellipse } } + macro @Circle { @Node outline { circle } } + + + ####################################################################### + # # + # Arrowheads # + # # + ####################################################################### + + macro @InsulatedNode { + @Node + topmargin { 0i } + footmargin { 0i } + leftmargin { 0i } + rightmargin { 0i } + alabel {} + blabel {} + clabel {} + dlabel {} + hsize {} + vsize {} + vstrut { no } + hstrut { no } + } + + def @SolidArrowHead + named width { arrowwidth } + named length { arrowlength } + named pathwidth { pathwidth } + { + @InsulatedNode + paint { nochange } + outlinestyle { noline } + outlinewidth { pathwidth } + outline { + @BackEnd @Case { + PostScript @Yield { + "ldiagsolidarrowhead" + # 0 0 xsize ysize * 0.5 0 ysize + } + PDF @Yield {} + } + } + { + length @Wide width @High + } + } + + def @OpenArrowHead + named width { arrowwidth } + named length { arrowlength } + named pathwidth { pathwidth } + { + @InsulatedNode + outlinewidth { pathwidth } + outlinestyle { noline } + paint { nochange } + outline { + @BackEnd @Case { + PostScript @Yield { + pathwidth "ldiagopenarrowhead" + + # PSW := { 0 0 } + # PNW := { 0 ysize } + # PE := { xsize ysize*0.5 } + # REL := pathwidth atangle { PE angleto PNW + 90d } + # PNA := { 0 ysize*0.5 + pathwidth*0.5 } + # PSA := { 0 ysize*0.5 - pathwidth*0.5 } + # PNI := { + # PNA PNA ++ { xsize 0 } + # PNW ++ REL PE ++ REL ldiaglineintersect + # } + # PSI := PNI -- { 0 pathwidth } + # + # PSW PE PNW PNI PNA PSA PSI PSW + } + PDF @Yield {} + } + } + { + length @Wide width @High + } + } + + def @HalfOpenArrowHead + named width { arrowwidth } + named length { arrowlength } + named pathwidth { pathwidth } + { + @InsulatedNode + paint { nochange } + outlinestyle { noline } + outlinewidth { pathwidth } + outline { + @BackEnd @Case { + PostScript @Yield { + pathwidth "ldiaghalfopenarrowhead" + + # 0 0 + # xsize ysize * 0.5 + # 0 ysize + # xsize*0.3 ysize*0.5 + pathwidth*0.5 + # 0 ysize*0.5 + pathwidth*0.5 + # 0 ysize*0.5 - pathwidth*0.5 + # xsize*0.3 ysize*0.5 - pathwidth*0.5 + # 0 0 + } + PDF @Yield {} + } + } + { + length @Wide width @High + } + } + + def @SolidCurvedArrowHead + named width { arrowwidth } + named length { arrowlength } + named pathwidth { pathwidth } + { + @InsulatedNode + outlinestyle { noline } + paint { nochange } + outlinewidth { pathwidth } + outline { + @BackEnd @Case { + PostScript @Yield { + "ldiagsolidcurvedarrowhead" + # 0 0 + # [0 0 xsize ysize * 0.5 "ldiaglinebetween" + # xsize 0 xsize ysize "ldiaglineintersect" clockwise] + # xsize ysize * 0.5 + # [xsize ysize * 0.5 0 ysize "ldiaglinebetween" + # xsize 0 xsize ysize "ldiaglineintersect" clockwise] + # 0 ysize + } + PDF @Yield {} + } + } + { + length @Wide width @High + } + } + + def @OpenCurvedArrowHead + named width { arrowwidth } + named length { arrowlength } + named pathwidth { pathwidth } + { + @InsulatedNode + outlinestyle { noline } + paint { nochange } + outlinewidth { pathwidth } + outline { + @BackEnd @Case { + PostScript @Yield { + pathwidth "ldiagopencurvedarrowhead" + # LR:= { 0 0 xsize ysize * 0.5 "ldiaglinebetween" + # xsize 0 xsize ysize "ldiaglineintersect" } + # UR:= { xsize ysize * 0.5 0 ysize "ldiaglinebetween" + # xsize 0 xsize ysize "ldiaglineintersect" } + # PW2 := pathwidth * 0.5 + # UMID := { + # 0 ysize * 0.5 + PW2 xsize ysize * 0.5 + PW2 + # {0 ysize} ++ 1f atangle { UR angleto {0 ysize} + 90d } + # { 0 ysize } ldiaglineintersect + # } + # LMID := UMID -- { 0 pathwidth } + # 0 0 + # [LR clockwise] + # xsize ysize * 0.5 + # [UR clockwise] + # 0 ysize + # UMID + # 0 ysize * 0.5 + PW2 + # 0 ysize * 0.5 - PW2 + # LMID + # 0 0 + } + PDF @Yield {} } - PDF @Yield {} } + { + length @Wide width @High + } + } + + def @HalfOpenCurvedArrowHead + named width { arrowwidth } + named length { arrowlength } + named pathwidth { pathwidth } + { + @InsulatedNode + outlinestyle { noline } + paint { nochange } + outlinewidth { pathwidth } + outline { + @BackEnd @Case { + PostScript @Yield { + pathwidth "ldiaghalfopencurvedarrowhead" + # LR:= { 0 0 xsize ysize * 0.5 "ldiaglinebetween" + # xsize 0 xsize ysize "ldiaglineintersect" } + # UR:= { xsize ysize * 0.5 0 ysize "ldiaglinebetween" + # xsize 0 xsize ysize "ldiaglineintersect" } + # BR:= { 0 0 LR 0 ysize UR "ldiaglineintersect" } + # BRAD := { 0 0 } distance BR + # PW2 := pathwidth * 0.5 + # XDIST := sqrt { BRAD*BRAD - PW2*PW2 } + # UMID := BR ++ { XDIST PW2 } + # LMID := BR ++ { XDIST 0 - PW2 } + # 0 0 + # [LR clockwise] + # xsize ysize * 0.5 + # [UR clockwise] + # 0 ysize + # [BR clockwise ] + # UMID + # 0 ysize * 0.5 + PW2 + # 0 ysize * 0.5 - PW2 + # LMID + # [BR clockwise ] + # 0 0 + } + PDF @Yield {} + } + } + { + length @Wide width @High + } + } + + def @CircleArrowHead + named width { arrowwidth } + named length { arrowlength } + named pathwidth { pathwidth } + { + @InsulatedNode + outlinestyle { noline } + paint { nochange } + outlinewidth { pathwidth } + outline { circle } + { length @Wide length @High } + } + + def @BoxArrowHead + named width { arrowwidth } + named length { arrowlength } + named pathwidth { pathwidth } + { + @InsulatedNode + outlinestyle { noline } + paint { nochange } + outlinewidth { pathwidth } + outline { box } + { length @Wide width @High } + } + + def @ArrowHead + named style { arrowstyle } + named width { arrowwidth } + named length { arrowlength } + named pathwidth { pathwidth } + { + style @Case { + solid @Yield @SolidArrowHead + width { width } length { length } + pathwidth { pathwidth } + halfopen @Yield @HalfOpenArrowHead + width { width } length { length } + pathwidth { pathwidth } + open @Yield @OpenArrowHead + width { width } length { length } + pathwidth { pathwidth } + curvedsolid @Yield @SolidCurvedArrowHead + width { width } length { length } + pathwidth { pathwidth } + curvedhalfopen @Yield @HalfOpenCurvedArrowHead + width { width } length { length } + pathwidth { pathwidth } + curvedopen @Yield @OpenCurvedArrowHead + width { width } length { length } + pathwidth { pathwidth } + circle @Yield @CircleArrowHead + width { width } length { length } + pathwidth { pathwidth } + box @Yield @BoxArrowHead + width { width } length { length } + pathwidth { pathwidth } + } + } + + + ####################################################################### + # # + # @Link # + # # + ####################################################################### + + def @Link + import @Geometry named path + named from {} + named to {} + named bias {} + named fbias {} + named tbias {} + named radius {} + named xindent {} + named zindent {} + named frompt {} + named topt {} + named arrow {} + named arrowlength {} + { path + from { from } + to { to } + bias { bias } + fbias { fbias } + tbias { tbias } + radius { radius } + xindent { xindent } + zindent { zindent } + frompt { frompt } + topt { topt } + arrow { arrow } + arrowlength { arrowlength } + } + import @Geometry named from { from } + import @Geometry named to { to } + import @Geometry named bias { bias } + import @Geometry named fbias { fbias } + import @Geometry named tbias { tbias } + import @Geometry named radius { radius } + import @Geometry named xindent { xindent } + import @Geometry named zindent { zindent } + import @Geometry named frompt { frompt } + import @Geometry named topt { topt } + named pathstyle + named solid { "/ldiagsolid" } + named dashed { "/ldiagdashed" } + named cdashed { "/ldiagcdashed" } + named dotted { "/ldiagdotted" } + named noline { "/ldiagnoline" } + { pathstyle } + import @Geometry named pathdashlength { pathdashlength } + import @Geometry named pathwidth + named thin { 0.04 ft } + named medium { 0.08 ft } + named thick { 0.12 ft } + { pathwidth } + import @Geometry named pathgap + named thin { 0.08 ft } + named medium { 0.16 ft } + named thick { 0.24 ft } + { pathgap } + + named arrow { arrow } + named arrowstyle { arrowstyle } + named arrowwidth { arrowwidth } + named arrowlength { arrowlength } + + named linklabel { linklabel } + named linklabelmargin { linklabelmargin } + named linklabelfont { linklabelfont } + named linklabelbreak { linklabelbreak } + named linklabelformat right @Body { linklabelformat @Body } + import @Geometry named linklabelpos { linklabelpos } + named linklabelprox { linklabelprox } + import @Geometry named linklabelangle { linklabelangle } + named linklabelctr { linklabelctr } + import @Geometry named linklabeladjust { linklabeladjust } + + named xlabel { xlabel } + named xlabelmargin { xlabelmargin } + named xlabelfont { xlabelfont } + named xlabelbreak { xlabelbreak } + named xlabelformat right @Body { xlabelformat @Body } + import @Geometry named xlabelpos { xlabelpos } + named xlabelprox { xlabelprox } + import @Geometry named xlabelangle { xlabelangle } + named xlabelctr { xlabelctr } + import @Geometry named xlabeladjust { xlabeladjust } + + named ylabel { ylabel } + named ylabelmargin { ylabelmargin } + named ylabelfont { ylabelfont } + named ylabelbreak { ylabelbreak } + named ylabelformat right @Body { ylabelformat @Body } + import @Geometry named ylabelpos { ylabelpos } + named ylabelprox { ylabelprox } + import @Geometry named ylabelangle { ylabelangle } + named ylabelctr { ylabelctr } + import @Geometry named ylabeladjust { ylabeladjust } + + named zlabel { zlabel } + named zlabelmargin { zlabelmargin } + named zlabelfont { zlabelfont } + named zlabelbreak { zlabelbreak } + named zlabelformat right @Body { zlabelformat @Body } + import @Geometry named zlabelpos { zlabelpos } + named zlabelprox { zlabelprox } + import @Geometry named zlabelangle { zlabelangle } + named zlabelctr { zlabelctr } + import @Geometry named zlabeladjust { zlabeladjust } + + named fromlabel { fromlabel } + named fromlabelmargin { fromlabelmargin } + named fromlabelfont { fromlabelfont } + named fromlabelbreak { fromlabelbreak } + named fromlabelformat right @Body { fromlabelformat @Body } + import @Geometry named fromlabelpos { fromlabelpos } + named fromlabelprox { fromlabelprox } + import @Geometry named fromlabelangle { fromlabelangle } + named fromlabelctr { fromlabelctr } + import @Geometry named fromlabeladjust { fromlabeladjust } + + named tolabel { tolabel } + named tolabelmargin { tolabelmargin } + named tolabelfont { tolabelfont } + named tolabelbreak { tolabelbreak } + named tolabelformat right @Body { tolabelformat @Body } + import @Geometry named tolabelpos { tolabelpos } + named tolabelprox { tolabelprox } + import @Geometry named tolabelangle { tolabelangle } + named tolabelctr { tolabelctr } + import @Geometry named tolabeladjust{ tolabeladjust } + + { + def @XLabel + { + @DoLabel + which { "x" } + label { xlabel @Else linklabel } + labelmargin { xlabelmargin @Else linklabelmargin } + labelfont { xlabelfont @Else linklabelfont } + labelbreak { xlabelbreak @Else linklabelbreak } + labelformat { xlabelformat @Body @Else linklabelformat @Body} + labelpos { xlabelpos @Else linklabelpos } + labelprox { xlabelprox @Else linklabelprox } + labelangle { xlabelangle @Else linklabelangle } + labelctr { xlabelctr @Else linklabelctr } + labeladjust { xlabeladjust @Else linklabeladjust } + } + + def @YLabel + { + @DoLabel + which { "y" } + label { ylabel @Else linklabel } + labelmargin { ylabelmargin @Else linklabelmargin } + labelfont { ylabelfont @Else linklabelfont } + labelbreak { ylabelbreak @Else linklabelbreak } + labelformat { ylabelformat @Body @Else linklabelformat @Body} + labelpos { ylabelpos @Else linklabelpos } + labelprox { ylabelprox @Else linklabelprox } + labelangle { ylabelangle @Else linklabelangle } + labelctr { ylabelctr @Else linklabelctr } + labeladjust { ylabeladjust @Else linklabeladjust } + } + + def @ZLabel + { + @DoLabel + which { "z" } + label { zlabel @Else linklabel } + labelmargin { zlabelmargin @Else linklabelmargin } + labelfont { zlabelfont @Else linklabelfont } + labelbreak { zlabelbreak @Else linklabelbreak } + labelformat { zlabelformat @Body @Else linklabelformat @Body} + labelpos { zlabelpos @Else linklabelpos } + labelprox { zlabelprox @Else linklabelprox } + labelangle { zlabelangle @Else linklabelangle } + labelctr { zlabelctr @Else linklabelctr } + labeladjust { zlabeladjust @Else linklabeladjust } + } + + def @FromArrow + { + arrow @Case { + { back both } @Yield { + @ArrowHead + style { arrowstyle } + width { arrowwidth } + length { arrowlength } + pathwidth { pathwidth } + } + else @Yield "" + } + } + + def @ToArrow + { + arrow @Case { + { yes forward both } @Yield { + @ArrowHead + style { arrowstyle } + width { arrowwidth } + length { arrowlength } + pathwidth { pathwidth } + } + else @Yield "" + } + } + + import @Geometry + def @LinePath + { + @BackEnd @Case { + PostScript @Yield { + {arrow @FromArrowLength arrowlength} + {arrow @ToArrowLength arrowlength} + "{" from "}" "{" to "}" + xindent zindent "ldiaglinepath" + # FROM :< {from??CTR angleto to??CTR} + # FROM :: from boundaryatangle FROM@ANGLE + # ++ {arrow @FromArrowLength arrowlength}atangle FROM@ANGLE + # TO :< FROM@ANGLE + # TO :: to boundaryatangle { TO@ANGLE - 180d } + # ++ {arrow @ToArrowLength arrowlength} atangle {TO@ANGLE - 180d} + # + # LMID :: FROM ** 0.5 ++ TO ** 0.5 + # LMID :< FROM@ANGLE + # XINDENT := xindent min { FROM distance LMID } + # LFROM :: FROM ++ XINDENT atangle FROM@ANGLE + # LFROM :< FROM@ANGLE + # ZINDENT := zindent min { TO distance LMID } + # LTO :: TO -- ZINDENT atangle FROM@ANGLE + # LTO :< FROM@ANGLE + # + # if cond { direct } + # then { FROM TO } + # else { FROM LFROM LMID LTO TO } + } + PDF @Yield {} + } + } + + import @Geometry + def @DoubleLinePath + { + @BackEnd @Case { + PostScript @Yield { + {arrow @FromArrowLength arrowlength} + {arrow @ToArrowLength arrowlength} + "{" from "}" "{" to "}" + xindent zindent pathgap "ldiagdoublelinepath" + # FROM :< {from??CTR angleto to??CTR} + # FROM :: from boundaryatangle FROM@ANGLE + # ++ {arrow @FromArrowLength arrowlength}atangle FROM@ANGLE + # TO :< FROM@ANGLE + # TO :: to boundaryatangle { TO@ANGLE - 180d } + # ++ {arrow @ToArrowLength arrowlength} atangle {TO@ANGLE - 180d} + # + # LMID :: FROM ** 0.5 ++ TO ** 0.5 + # LMID :< FROM@ANGLE + # XINDENT := xindent min { FROM distance LMID } + # LFROM :: FROM ++ XINDENT atangle FROM@ANGLE + # LFROM :< FROM@ANGLE + # ZINDENT := zindent min { TO distance LMID } + # LTO :: TO -- ZINDENT atangle FROM@ANGLE + # LTO :< FROM@ANGLE + # + # if cond { direct } + # then { FROM TO } + # else { FROM LFROM LMID LTO TO } + } + PDF @Yield {} + } + } + + import @Geometry + def @ACurvePath + { + @BackEnd @Case { + PostScript @Yield { + {arrow @FromArrowLength arrowlength} + {arrow @ToArrowLength arrowlength} + "{" from "}" "{" to "}" + xindent zindent bias "ldiagacurvepath" + # #B1 := bias max 0.02f + # #B2 := { from??CTR distance to??CTR } * 0.5 + # #BIAS := B1 min B2 + # BIAS := bias max 0.02f + # XMID := from??CTR ** 0.5 ++ to??CTR ** 0.5 + # XTOP := XMID ++ BIAS atangle {from??CTR angleto to??CTR - 90d} + # CTR := { from??CTR XTOP ldiaglinebetween + # to??CTR XTOP ldiaglinebetween ldiaglineintersect } + # FROM :: aabout + # circum { from } + # extra { arrow @FromArrowLength arrowlength } + # centre { CTR } + # FROM :< if cond { from??CTR distance FROM > 0 } + # then { from??CTR angleto FROM } + # else { CTR angleto FROM + 90d } + # TO :: cabout + # circum { to } + # extra { arrow @ToArrowLength arrowlength } + # centre { CTR } + # TO :< if cond { TO distance to??CTR > 0 } + # then { TO angleto to??CTR } + # else { CTR angleto TO + 90d } + # + # RADIUS := CTR distance FROM + # LMID :: CTR ++ RADIUS atangle { + # CTR angleto FROM + + # { {360d + {CTR angleto TO} - {CTR angleto FROM}} mod 360 } / 2 + # } + # LMID :< CTR angleto LMID + 90d + # + # XINDENT := xindent min { FROM distance LMID } + # LFROM :: CTR ++ RADIUS atangle { + # CTR angleto { FROM ++ XINDENT atangle FROM@ANGLE } } + # LFROM :< CTR angleto LFROM + 90d + # ZINDENT := zindent min { TO distance LMID } + # LTO :: CTR ++ RADIUS atangle { + # CTR angleto { TO ++ ZINDENT atangle {TO@ANGLE+180d}}} + # LTO :< CTR angleto LTO + 90d + # + # if cond { direct } + # then { FROM [CTR] TO } + # else { FROM [CTR] LFROM [CTR] LMID [CTR] LTO [CTR] TO } + } + PDF @Yield {} + } + } + + import @Geometry + def @CCurvePath + { + @BackEnd @Case { + PostScript @Yield { + {arrow @FromArrowLength arrowlength} + {arrow @ToArrowLength arrowlength} + "{" from "}" "{" to "}" + xindent zindent bias "ldiagccurvepath" + # #B1 := bias max 0.02f + # #B2 := { from??CTR distance to??CTR } * 0.5 + # #BIAS := B1 min B2 + # BIAS := bias max 0.02f + # XMID := from??CTR ** 0.5 ++ to??CTR ** 0.5 + # XTOP := XMID ++ BIAS atangle {from??CTR angleto to??CTR + 90d} + # CTR := { from??CTR XTOP ldiaglinebetween + # to??CTR XTOP ldiaglinebetween ldiaglineintersect } + # FROM :: cabout + # circum { from } + # extra { arrow @FromArrowLength arrowlength } + # centre { CTR } + # FROM :< if cond { from??CTR distance FROM > 0 } + # then { from??CTR angleto FROM } + # else { CTR angleto FROM - 90d } + # TO :: aabout + # circum { to } + # extra { arrow @ToArrowLength arrowlength } + # centre { CTR } + # TO :< if cond { TO distance to??CTR > 0 } + # then { TO angleto to??CTR } + # else { CTR angleto TO - 90d } + # + # RADIUS := CTR distance FROM + # LMID :: CTR ++ RADIUS atangle { + # CTR angleto TO + + # { {360d + {CTR angleto FROM} - {CTR angleto TO} } mod 360 } / 2 + # } + # LMID :< CTR angleto LMID - 90d + # + # XINDENT := xindent min { FROM distance LMID } + # LFROM :: CTR ++ RADIUS atangle { + # CTR angleto { FROM ++ XINDENT atangle FROM@ANGLE } } + # LFROM :< CTR angleto LFROM - 90d + # ZINDENT := zindent min { TO distance LMID } + # LTO :: CTR ++ RADIUS atangle { + # CTR angleto { TO ++ ZINDENT atangle {TO@ANGLE+180d}}} + # LTO :< CTR angleto LTO - 90d + # + # if cond { direct } + # then { FROM [CTR clockwise] TO } + # else { FROM [CTR clockwise] LFROM [CTR clockwise] + # LMID [CTR clockwise] LTO [CTR clockwise] TO } + } + PDF @Yield {} + } + } + + import @Geometry + def @BezierPath + { + @BackEnd @Case { + PostScript @Yield { + {arrow @FromArrowLength arrowlength} + {arrow @ToArrowLength arrowlength} + "{" from "}" "{" to "}" + xindent zindent [ frompt ] [ topt ] "ldiagbezierpath" + # FROM :< from??CTR angleto frompt + # FROM :: from boundaryatangle FROM@ANGLE + # ++ {arrow @FromArrowLength arrowlength} atangle FROM@ANGLE + # TO :< topt angleto to??CTR + # TO :: to boundaryatangle { TO@ANGLE + 180d } + # ++ {arrow @ToArrowLength arrowlength} atangle { TO@ANGLE + 180d } + # LFROM :: FROM ++ { xindent atangle FROM@ANGLE } + # LFROM :< FROM@ANGLE + # LTO :: TO ++ zindent atangle { TO@ANGLE + 180d } + # LTO :< TO@ANGLE + # LMID :: { FROM ++ TO ++ frompt ++ topt } ** 0.25 + # FROM [frompt topt] TO + } + PDF @Yield {} + } + } + + import @Geometry + def @VHLinePath + { + @BackEnd @Case { + PostScript @Yield { + {arrow @FromArrowLength arrowlength} + {arrow @ToArrowLength arrowlength} + "{" from "}" "{" to "}" + xindent zindent "ldiagvhlinepath" + # CTR := { {xcoord from??CTR} {ycoord to??CTR} } + # FANG := from??CTR angleto CTR + # TANG := to??CTR angleto CTR + # FROM :: from boundaryatangle FANG + # ++ {arrow @FromArrowLength arrowlength} atangle FANG + # FROM :< FANG + # TO :: to boundaryatangle TANG + # ++ {arrow @ToArrowLength arrowlength} atangle TANG + # TO :< TANG + 180d + # FDIST := FROM distance CTR + # TDIST := TO distance CTR + # XINDENT := xindent min FDIST + # ZINDENT := zindent min TDIST + # LFROM :: FROM ++ XINDENT atangle FANG + # LFROM :< FROM@ANGLE + # LTO :: TO ++ ZINDENT atangle TANG + # LTO :< TO@ANGLE + # LMID :: CTR + # LMID :< {1f atangle {FANG + 180d}} angleto + # {1f atangle {TANG + 180d}} + # FROM LFROM LMID LTO TO + } + PDF @Yield {} + } + } + + import @Geometry + def @VHCurvePath + { + @BackEnd @Case { + PostScript @Yield { + {arrow @FromArrowLength arrowlength} + {arrow @ToArrowLength arrowlength} + "{" from "}" "{" to "}" + xindent zindent radius "ldiagvhcurvepath" + # CTR := { {xcoord from??CTR} {ycoord to??CTR} } + # FANG := from??CTR angleto CTR + # TANG := to??CTR angleto CTR + # FROM :: from boundaryatangle FANG + # ++ {arrow @FromArrowLength arrowlength} atangle FANG + # FROM :< FANG + # TO :: to boundaryatangle TANG + # ++ {arrow @ToArrowLength arrowlength} atangle TANG + # TO :< TANG + 180d + # FDIST := FROM distance CTR + # TDIST := TO distance CTR + # RADIUS := radius min FDIST min TDIST + # XINDENT := xindent min { FDIST - RADIUS } + # ZINDENT := zindent min { TDIST - RADIUS } + # LFROM :: FROM ++ XINDENT atangle FANG + # LFROM :< FROM@ANGLE + # LTO :: TO ++ ZINDENT atangle TANG + # LTO :< TO@ANGLE + # FCTR := CTR ++ RADIUS atangle { FROM@ANGLE + 180d } + # TCTR := CTR ++ RADIUS atangle { TO@ANGLE } + # XCTR := CTR ++ RADIUS atangle { FROM@ANGLE + 180d } + # ++ RADIUS atangle { TO@ANGLE } + # LMID :: XCTR ++ RADIUS atangle { XCTR angleto CTR } + # LMID :< FCTR angleto TCTR + # FROM LFROM FCTR + # { FCTR angleto TCTR } quadcase + # 0 { } + # 0-90 { [XCTR clockwise] } + # 90 { } + # 90-180 { [XCTR] } + # 180 { } + # 180-270 { [XCTR clockwise] } + # 270 { } + # 270-360 { [XCTR] } + # TCTR LTO TO + } + PDF @Yield {} + } + } + + import @Geometry + def @HVLinePath + { + @BackEnd @Case { + PostScript @Yield { + {arrow @FromArrowLength arrowlength} + {arrow @ToArrowLength arrowlength} + "{" from "}" "{" to "}" + xindent zindent "ldiaghvlinepath" + # CTR := { {xcoord to??CTR} {ycoord from??CTR} } + # FANG := from??CTR angleto CTR + # TANG := to??CTR angleto CTR + # FROM :: from boundaryatangle FANG + # ++ {arrow @FromArrowLength arrowlength} atangle FANG + # FROM :< FANG + # TO :: to boundaryatangle TANG + # ++ {arrow @ToArrowLength arrowlength} atangle TANG + # TO :< TANG + 180d + # FDIST := FROM distance CTR + # TDIST := TO distance CTR + # XINDENT := xindent min FDIST + # ZINDENT := zindent min TDIST + # LFROM :: FROM ++ XINDENT atangle FANG + # LFROM :< FROM@ANGLE + # LTO :: TO ++ ZINDENT atangle TANG + # LTO :< TO@ANGLE + # LMID :: CTR + # LMID :< {1f atangle {FANG + 180d}} angleto + # {1f atangle {TANG + 180d}} + # FROM LFROM LMID LTO TO + } + PDF @Yield {} + } + } + + import @Geometry + def @HVCurvePath + { + @BackEnd @Case { + PostScript @Yield { + {arrow @FromArrowLength arrowlength} + {arrow @ToArrowLength arrowlength} + "{" from "}" "{" to "}" + xindent zindent radius "ldiaghvcurvepath" + # CTR := { {xcoord to??CTR} {ycoord from??CTR} } + # FANG := from??CTR angleto CTR + # TANG := to??CTR angleto CTR + # FROM :: from boundaryatangle FANG + # ++ {arrow @FromArrowLength arrowlength} atangle FANG + # FROM :< FANG + # TO :: to boundaryatangle TANG + # ++ {arrow @ToArrowLength arrowlength} atangle TANG + # TO :< TANG + 180d + # FDIST := FROM distance CTR + # TDIST := TO distance CTR + # RADIUS := radius min FDIST min TDIST + # XINDENT := xindent min { FDIST - RADIUS } + # ZINDENT := zindent min { TDIST - RADIUS } + # LFROM :: FROM ++ XINDENT atangle FANG + # LFROM :< FROM@ANGLE + # LTO :: TO ++ ZINDENT atangle TANG + # LTO :< TO@ANGLE + # FCTR := CTR ++ RADIUS atangle { FROM@ANGLE + 180d } + # TCTR := CTR ++ RADIUS atangle { TO@ANGLE } + # XCTR := CTR ++ RADIUS atangle { FROM@ANGLE + 180d } + # ++ RADIUS atangle { TO@ANGLE } + # LMID :: XCTR ++ RADIUS atangle { XCTR angleto CTR } + # LMID :< FCTR angleto TCTR + # FROM LFROM FCTR + # { FCTR angleto TCTR } quadcase + # 0 { } + # 0-90 { [XCTR] } + # 90 { } + # 90-180 { [XCTR clockwise] } + # 180 { } + # 180-270 { [XCTR] } + # 270 { } + # 270-360 { [XCTR clockwise] } + # TCTR LTO TO + } + PDF @Yield {} + } + } + + import @Geometry + def @LVRLinePath + { + @BackEnd @Case { + PostScript @Yield { + {arrow @FromArrowLength arrowlength} + {arrow @ToArrowLength arrowlength} + "{" from "}" "{" to "}" + xindent zindent bias "ldiaglvrlinepath" + # FROM :: from boundaryatangle 180d + # ++ {arrow @FromArrowLength arrowlength} atangle 180d + # FROM :< 180d + # TO :: to boundaryatangle 180d + # ++ {arrow @ToArrowLength arrowlength} atangle 180d + # TO :< 0d + # XLEFT := {{xcoord FROM} min {xcoord TO}} - bias + # P1 :: { XLEFT ycoord FROM } + # P2 :: { XLEFT ycoord TO } + # VERT := P1 angleto P2 + # P1 :< P1 angleto {P1++{1f atangle 180d}++{1f atangle VERT}} + # P2 :< P2 angleto {P2++{1f atangle 0d} ++{1f atangle VERT}} + # LMID :: P1 ** 0.5 ++ P2 ** 0.5 + # LMID :< VERT + # XINDENT := xindent min {FROM distance P1} + # ZINDENT := zindent min {P2 distance TO} + # LFROM :: FROM -- { XINDENT 0 } + # LFROM :< 180d + # LTO :: TO -- { ZINDENT 0 } + # LTO :< 0d + # FROM LFROM P1 LMID P2 LTO TO + } + PDF @Yield {} + } + } + + import @Geometry + def @LVRCurvePath + { + @BackEnd @Case { + PostScript @Yield { + {arrow @FromArrowLength arrowlength} + {arrow @ToArrowLength arrowlength} + "{" from "}" "{" to "}" + xindent zindent bias radius "ldiaglvrcurvepath" + # FROM :: from boundaryatangle 180d + # ++ {arrow @FromArrowLength arrowlength} atangle 180d + # FROM :< 180d + # TO :: to boundaryatangle 180d + # ++ {arrow @ToArrowLength arrowlength} atangle 180d + # TO :< 0d + # XLEFT := {{xcoord FROM} min {xcoord TO}} - bias + # XP1 := { XLEFT ycoord FROM } + # XP2 := { XLEFT ycoord TO } + # VERT := XP1 angleto XP2 + # LMID :: XP1 ** 0.5 ++ XP2 ** 0.5 + # LMID :< VERT + # XINDENT := xindent min {FROM distance XP1} + # ZINDENT := zindent min {XP2 distance TO} + # LFROM :: FROM -- { XINDENT 0 } + # LFROM :< 180d + # LTO :: TO -- { ZINDENT 0 } + # LTO :< 0d + # RADIUS := radius min { { XP1 distance XP2 } / 2 } + # XP1PRE := XP1 ++ { RADIUS atangle 0d } + # XP1POST := XP1 ++ { RADIUS atangle VERT } + # XP1CTR := XP1PRE ++ { RADIUS atangle VERT } + # P1 :: XP1CTR ++ { RADIUS atangle { XP1CTR angleto XP1 } } + # P1 :< XP1PRE angleto XP1POST + # XP2PRE := XP2 -- { RADIUS atangle VERT } + # XP2POST := XP2 ++ { RADIUS atangle 0d } + # XP2CTR := XP2PRE ++ { RADIUS atangle 0d } + # P2 :: XP2CTR ++ { RADIUS atangle { XP2CTR angleto XP2 } } + # P2 :< XP2PRE angleto XP2POST + # FROM LFROM XP1PRE + # {round VERT} quadcase + # 90 { [XP1CTR clockwise] P1 [XP1CTR clockwise] } + # 270 { [XP1CTR] P1 [XP1CTR] } + # XP1POST LMID XP2PRE + # {round VERT} quadcase + # 90 { [XP2CTR clockwise] P2 [XP2CTR clockwise] } + # 270 { [XP2CTR] P2 [XP2CTR] } + # XP2POST LTO TO + } + PDF @Yield {} + } + } + + import @Geometry + def @RVLLinePath + { + @BackEnd @Case { + PostScript @Yield { + {arrow @FromArrowLength arrowlength} + {arrow @ToArrowLength arrowlength} + "{" from "}" "{" to "}" + xindent zindent bias "ldiagrvllinepath" + # FROM :: from boundaryatangle 0d + # ++ {arrow @FromArrowLength arrowlength} atangle 0d + # FROM :< 0d + # TO :: to boundaryatangle 0d + # ++ {arrow @ToArrowLength arrowlength} atangle 0d + # TO :< 180d + # XRIGHT := {{xcoord FROM} max {xcoord TO}} + bias + # P1 :: { XRIGHT ycoord FROM } + # P2 :: { XRIGHT ycoord TO } + # VERT := P1 angleto P2 + # P1 :< P1 angleto {P1++{1f atangle 0d} ++{1f atangle VERT}} + # P2 :< P2 angleto {P2++{1f atangle 180d}++{1f atangle VERT}} + # LMID :: P1 ** 0.5 ++ P2 ** 0.5 + # LMID :< VERT + # XINDENT := xindent min {FROM distance P1} + # ZINDENT := zindent min {P2 distance TO} + # LFROM :: FROM ++ { XINDENT 0 } + # LFROM :< 0d + # LTO :: TO ++ { ZINDENT 0 } + # LTO :< 180d + # FROM LFROM P1 LMID P2 LTO TO + } + PDF @Yield {} + } + } + + import @Geometry + def @RVLCurvePath + { + @BackEnd @Case { + PostScript @Yield { + {arrow @FromArrowLength arrowlength} + {arrow @ToArrowLength arrowlength} + "{" from "}" "{" to "}" + xindent zindent bias radius "ldiagrvlcurvepath" + # FROM :: from boundaryatangle 0d + # ++ {arrow @FromArrowLength arrowlength} atangle 0d + # FROM :< 0d + # TO :: to boundaryatangle 0d + # ++ {arrow @ToArrowLength arrowlength} atangle 0d + # TO :< 180d + # XRIGHT := {{xcoord FROM} max {xcoord TO}} + bias + # XP1 := { XRIGHT ycoord FROM } + # XP2 := { XRIGHT ycoord TO } + # VERT := XP1 angleto XP2 + # LMID :: XP1 ** 0.5 ++ XP2 ** 0.5 + # LMID :< VERT + # XINDENT := xindent min {FROM distance XP1} + # ZINDENT := zindent min {XP2 distance TO} + # LFROM :: FROM ++ { XINDENT 0 } + # LFROM :< 0d + # LTO :: TO ++ { ZINDENT 0 } + # LTO :< 180d + # RADIUS := radius min { { XP1 distance XP2 } * 0.5 } + # XP1PRE := XP1 ++ { RADIUS atangle 180d } + # XP1POST := XP1 ++ { RADIUS atangle VERT } + # XP1CTR := XP1PRE ++ { RADIUS atangle VERT } + # P1 :: XP1CTR ++ { RADIUS atangle { XP1CTR angleto XP1 } } + # P1 :< XP1PRE angleto XP1POST + # XP2PRE := XP2 -- { RADIUS atangle VERT } + # XP2POST := XP2 ++ { RADIUS atangle 180d } + # XP2CTR := XP2PRE ++ { RADIUS atangle 180d } + # P2 :: XP2CTR ++ { RADIUS atangle { XP2CTR angleto XP2 } } + # P2 :< XP2PRE angleto XP2POST + # FROM LFROM XP1PRE + # {round VERT} quadcase + # 90 { [XP1CTR] P1 [XP1CTR] } + # 270 { [XP1CTR clockwise] P1 [XP1CTR clockwise] } + # XP1POST LMID XP2PRE + # {round VERT} quadcase + # 90 { [XP2CTR] P2 [XP2CTR] } + # 270 { [XP2CTR clockwise] P2 [XP2CTR clockwise] } + # XP2POST LTO TO + } + PDF @Yield {} + } + } + + import @Geometry + def @DWrapLinePath + { + @BackEnd @Case { + PostScript @Yield { + {arrow @FromArrowLength arrowlength} + {arrow @ToArrowLength arrowlength} + "{" from "}" "{" to "}" + xindent zindent bias fbias tbias "ldiagdwraplinepath" + # DIRN := if cond { xcoord from??CTR < xcoord to??CTR } + # then { 180d } else { 0d } + # FROM :: from boundaryatangle DIRN + # ++ {arrow @FromArrowLength arrowlength} atangle DIRN + # FROM :< DIRN + # TO :: to boundaryatangle { DIRN + 180d } + # ++ {arrow @ToArrowLength arrowlength} atangle { DIRN + 180d } + # TO :< DIRN + # P1 :: FROM ++ {fbias max 0} atangle DIRN + # P1 :< if cond { DIRN = 180d } then { 225d } else { -45d } + # P4 :: TO ++ {tbias max 0} atangle { DIRN + 180d } + # P4 :< if cond { DIRN = 180d } then { 135d } else { 45d } + # YC := ycoord { from boundaryatangle 270d } min + # ycoord { to boundaryatangle 270d } + # - { bias max 0 } + # P2 :: { xcoord P1 YC } + # P2 :< P4@ANGLE - 180d + # P3 :: { xcoord P4 YC } + # P3 :< P1@ANGLE - 180d + # XINDENT := xindent min { FROM distance P1 } + # LFROM :: FROM ++ XINDENT atangle DIRN + # LFROM :< FROM@ANGLE + # ZINDENT := zindent min { TO distance P4 } + # LTO :: TO ++ ZINDENT atangle { DIRN + 180d } + # LTO :< TO@ANGLE + # LMID :: P2 ** 0.5 ++ P3 ** 0.5 + # LMID :< DIRN - 180d + # FROM P1 P2 P3 P4 TO + } + PDF @Yield {} + } + } + + import @Geometry + def @DWrapCurvePath + { + @BackEnd @Case { + PostScript @Yield { + {arrow @FromArrowLength arrowlength} + {arrow @ToArrowLength arrowlength} + "{" from "}" "{" to "}" + xindent zindent bias fbias tbias radius "ldiagdwrapcurvepath" + # DIRN := if cond { xcoord from??CTR < xcoord to??CTR } + # then { 180d } else { 0d } + # CLOCK := if cond { xcoord from??CTR < xcoord to??CTR } + # then { anticlockwise } else { clockwise } + # FROM :: from boundaryatangle DIRN + # ++ {arrow @FromArrowLength arrowlength} atangle DIRN + # FROM :< DIRN + # TO :: to boundaryatangle { DIRN + 180d } + # ++ {arrow @ToArrowLength arrowlength} atangle { DIRN + 180d } + # TO :< DIRN + # + # XP1 := FROM ++ {fbias max 0} atangle DIRN + # XP4 := TO ++ {tbias max 0} atangle { DIRN + 180d } + # YC := ycoord { from boundaryatangle 270d } min + # ycoord { to boundaryatangle 270d } + # - { bias max 0 } + # XP2 := { xcoord XP1 YC } + # XP3 := { xcoord XP4 YC } + # + # RP1 := radius min { XP1 distance FROM } min + # { { XP1 distance XP2 } / 2 } + # XP1PRE := XP1 ++ RP1 atangle { XP1 angleto FROM } + # XP1POST := XP1 ++ RP1 atangle { XP1 angleto XP2 } + # XP1CTR := XP1PRE ++ RP1 atangle { XP1 angleto XP2 } + # P1 :: XP1CTR ++ RP1 atangle { XP1CTR angleto XP1 } + # P1 :< XP1CTR angleto P1 + DIRN - 90d + # + # RP2 := radius min { { XP1 distance XP2 } / 2 } + # min { { XP2 distance XP3 } / 2 } + # XP2PRE := XP2 ++ RP2 atangle { XP2 angleto XP1 } + # XP2POST := XP2 ++ RP2 atangle { XP2 angleto XP3 } + # XP2CTR := XP2PRE ++ RP2 atangle { XP2 angleto XP3 } + # P2 :: XP2CTR ++ RP2 atangle { XP2CTR angleto XP2 } + # P2 :< XP2CTR angleto P2 + DIRN - 90d + # + # RP3 := radius min { { XP2 distance XP3 } / 2 } + # min { { XP3 distance XP4 } / 2 } + # XP3PRE := XP3 ++ RP3 atangle { XP3 angleto XP2 } + # XP3POST := XP3 ++ RP3 atangle { XP3 angleto XP4 } + # XP3CTR := XP3PRE ++ RP3 atangle { XP3 angleto XP4 } + # P3 :: XP3CTR ++ RP3 atangle { XP3CTR angleto XP3 } + # P3 :< XP3CTR angleto P3 + DIRN - 90d + # + # RP4 := radius min { { XP4 distance XP3 } / 2 } + # min { XP4 distance TO } + # XP4PRE := XP4 ++ RP4 atangle { XP4 angleto XP3 } + # XP4POST := XP4 ++ RP4 atangle { XP4 angleto TO } + # XP4CTR := XP4PRE ++ RP4 atangle { XP4 angleto TO } + # P4 :: XP4CTR ++ RP4 atangle { XP4CTR angleto XP4 } + # P4 :< XP4CTR angleto P4 + DIRN - 90d + # + # XINDENT := xindent min { FROM distance XP1PRE } + # LFROM :: FROM ++ XINDENT atangle DIRN + # LFROM :< FROM@ANGLE + # + # LMID :: XP2 ** 0.5 ++ XP3 ** 0.5 + # LMID :< DIRN - 180d + # + # ZINDENT := zindent min { TO distance XP4POST } + # LTO :: TO ++ ZINDENT atangle { DIRN + 180d } + # LTO :< TO@ANGLE + # + # FROM LFROM + # XP1PRE [XP1CTR CLOCK] XP1POST + # XP2PRE [XP2CTR CLOCK] XP2POST + # LMID + # XP3PRE [XP3CTR CLOCK] XP3POST + # XP4PRE [XP4CTR CLOCK] XP4POST + # LTO TO + } + PDF @Yield {} + } + } + + import @Geometry + def @UWrapLinePath + { + @BackEnd @Case { + PostScript @Yield { + {arrow @FromArrowLength arrowlength} + {arrow @ToArrowLength arrowlength} + "{" from "}" "{" to "}" + xindent zindent bias fbias tbias "ldiaguwraplinepath" + # DIRN := if cond { xcoord from??CTR < xcoord to??CTR } + # then { 180d } else { 0d } + # FROM :: from boundaryatangle DIRN + # ++ {arrow @FromArrowLength arrowlength} atangle DIRN + # FROM :< DIRN + # TO :: to boundaryatangle { DIRN + 180d } + # ++ {arrow @ToArrowLength arrowlength} atangle { DIRN + 180d } + # TO :< DIRN + # P1 :: FROM ++ {fbias max 0} atangle DIRN + # P1 :< if cond { DIRN = 180d } then { 135d } else { 45d } + # P4 :: TO ++ {tbias max 0} atangle { DIRN + 180d } + # P4 :< if cond { DIRN = 180d } then { 225d } else { -45d } + # YC := ycoord { from boundaryatangle 90d } max + # ycoord { to boundaryatangle 90d } + # + { bias max 0 } + # P2 :: { xcoord P1 YC } + # P2 :< P4@ANGLE - 180d + # P3 :: { xcoord P4 YC } + # P3 :< P1@ANGLE - 180d + # XINDENT := xindent min { FROM distance P1 } + # LFROM :: FROM ++ XINDENT atangle DIRN + # LFROM :< FROM@ANGLE + # ZINDENT := zindent min { TO distance P4 } + # LTO :: TO ++ ZINDENT atangle { DIRN + 180d } + # LTO :< TO@ANGLE + # LMID :: P2 ** 0.5 ++ P3 ** 0.5 + # LMID :< DIRN - 180d + # FROM P1 P2 P3 P4 TO + } + PDF @Yield {} + } + } + + import @Geometry + def @UWrapCurvePath + { + @BackEnd @Case { + PostScript @Yield { + {arrow @FromArrowLength arrowlength} + {arrow @ToArrowLength arrowlength} + "{" from "}" "{" to "}" + xindent zindent bias fbias tbias radius "ldiaguwrapcurvepath" + # DIRN := if cond { xcoord from??CTR < xcoord to??CTR } + # then { 180d } else { 0d } + # CLOCK := if cond { xcoord from??CTR < xcoord to??CTR } + # then { clockwise } else { anticlockwise } + # FROM :: from boundaryatangle DIRN + # ++ {arrow @FromArrowLength arrowlength} atangle DIRN + # FROM :< DIRN + # TO :: to boundaryatangle { DIRN + 180d } + # ++ {arrow @ToArrowLength arrowlength} atangle { DIRN + 180d } + # TO :< DIRN + # + # XP1 := FROM ++ {fbias max 0} atangle DIRN + # XP4 := TO ++ {tbias max 0} atangle { DIRN + 180d } + # YC := ycoord { from boundaryatangle 90d } max + # ycoord { to boundaryatangle 90d } + # + { bias max 0 } + # XP2 := { xcoord XP1 YC } + # XP3 := { xcoord XP4 YC } + # + # RP1 := radius min { XP1 distance FROM } min + # { { XP1 distance XP2 } / 2 } + # XP1PRE := XP1 ++ RP1 atangle { XP1 angleto FROM } + # XP1POST := XP1 ++ RP1 atangle { XP1 angleto XP2 } + # XP1CTR := XP1PRE ++ RP1 atangle { XP1 angleto XP2 } + # P1 :: XP1CTR ++ RP1 atangle { XP1CTR angleto XP1 } + # P1 :< XP1CTR angleto P1 + DIRN + 90d + # + # RP2 := radius min { { XP1 distance XP2 } / 2 } + # min { { XP2 distance XP3 } / 2 } + # XP2PRE := XP2 ++ RP2 atangle { XP2 angleto XP1 } + # XP2POST := XP2 ++ RP2 atangle { XP2 angleto XP3 } + # XP2CTR := XP2PRE ++ RP2 atangle { XP2 angleto XP3 } + # P2 :: XP2CTR ++ RP2 atangle { XP2CTR angleto XP2 } + # P2 :< XP2CTR angleto P2 + DIRN + 90d + # + # RP3 := radius min { { XP2 distance XP3 } / 2 } + # min { { XP3 distance XP4 } / 2 } + # XP3PRE := XP3 ++ RP3 atangle { XP3 angleto XP2 } + # XP3POST := XP3 ++ RP3 atangle { XP3 angleto XP4 } + # XP3CTR := XP3PRE ++ RP3 atangle { XP3 angleto XP4 } + # P3 :: XP3CTR ++ RP3 atangle { XP3CTR angleto XP3 } + # P3 :< XP3CTR angleto P3 + DIRN + 90d + # + # RP4 := radius min { { XP4 distance XP3 } / 2 } + # min { XP4 distance TO } + # XP4PRE := XP4 ++ RP4 atangle { XP4 angleto XP3 } + # XP4POST := XP4 ++ RP4 atangle { XP4 angleto TO } + # XP4CTR := XP4PRE ++ RP4 atangle { XP4 angleto TO } + # P4 :: XP4CTR ++ RP4 atangle { XP4CTR angleto XP4 } + # P4 :< XP4CTR angleto P4 + DIRN + 90d + # + # XINDENT := xindent min { FROM distance XP1PRE } + # LFROM :: FROM ++ XINDENT atangle DIRN + # LFROM :< FROM@ANGLE + # + # LMID :: XP2 ** 0.5 ++ XP3 ** 0.5 + # LMID :< DIRN - 180d + # + # ZINDENT := zindent min { TO distance XP4POST } + # LTO :: TO ++ ZINDENT atangle { DIRN + 180d } + # LTO :< TO@ANGLE + # + # FROM LFROM + # XP1PRE [XP1CTR CLOCK] XP1POST + # XP2PRE [XP2CTR CLOCK] XP2POST + # LMID + # XP3PRE [XP3CTR CLOCK] XP3POST + # XP4PRE [XP4CTR CLOCK] XP4POST + # LTO TO + } + PDF @Yield {} + } + } + + import @Geometry + def @Path + { + path @Case { + line @Yield @LinePath + doubleline @Yield @DoubleLinePath + { acurve curve } @Yield @ACurvePath + ccurve @Yield @CCurvePath + bezier @Yield @BezierPath + vhline @Yield @VHLinePath + vhcurve @Yield @VHCurvePath + hvline @Yield @HVLinePath + hvcurve @Yield @HVCurvePath + lvrline @Yield @LVRLinePath + lvrcurve @Yield @LVRCurvePath + rvlline @Yield @RVLLinePath + rvlcurve @Yield @RVLCurvePath + dwrapline @Yield @DWrapLinePath + dwrapcurve @Yield @DWrapCurvePath + uwrapline @Yield @UWrapLinePath + uwrapcurve @Yield @UWrapCurvePath + else @Yield { + path + from { from } + to { to } + bias { bias } + fbias { fbias } + tbias { tbias } + radius { radius } + xindent { xindent } + zindent { zindent } + frompt { frompt } + topt { topt } + arrow { arrow } + arrowlength { arrowlength } + } + } + } + + def @FromLabel + { + @DoLabel + which { "f" } + label { fromlabel @Else @FromArrow } + labelmargin { fromlabelmargin } + labelfont { fromlabelfont } + labelbreak { fromlabelbreak } + labelformat { fromlabelformat @Body } + labelpos { fromlabelpos } + labelprox { fromlabelprox } + labelangle { fromlabelangle } + labelctr { fromlabelctr } + labeladjust { fromlabeladjust } + } + + def @ToLabel + { + @DoLabel + which { "t" } + label { tolabel @Else @ToArrow } + labelmargin { tolabelmargin } + labelfont { tolabelfont } + labelbreak { tolabelbreak } + labelformat { tolabelformat @Body } + labelpos { tolabelpos } + labelprox { tolabelprox } + labelangle { tolabelangle } + labelctr { tolabelctr } + labeladjust { tolabeladjust } + } + + def @Direct + { + pathstyle @Case { + { "/ldiagsolid" "/ldiagdashed" "/ldiagcdashed" + "/ldiagdotted" "/ldiagnoline" } @Yield 1 + else @Yield 0 + } + } + + @BackEnd @Case { + PostScript @Yield { + + @Null & # so that preceding space gets chewed up + { + @Direct "ldiaglinkbegin [" @Path "]" pathdashlength + "[" pathstyle "]" pathwidth "ldiaglinkend" + } + @Graphic + { + / { fromlabel @Else @FromArrow} @IfNonEmpty @FromLabel + / { xlabel @Else linklabel } @IfNonEmpty @XLabel + / { ylabel @Else linklabel } @IfNonEmpty @YLabel + / { zlabel @Else linklabel } @IfNonEmpty @ZLabel + / { tolabel @Else @ToArrow } @IfNonEmpty @ToLabel + } + + } + PDF @Yield {} + } + } + + + def @ObjectLink + precedence 90 + associativity left + left x + named treehsep { treehsep } + named treevsep { treevsep } + named format + named x {} + named y {} + named insinuatelink {} + named treehsep {} + named treevsep {} + { x | y | insinuatelink } + import @Geometry named path + named from {} + named to {} + named bias {} + named fbias {} + named tbias {} + named radius {} + named xindent {} + named zindent {} + named frompt {} + named topt {} + named arrow {} + named arrowlength {} + { path + from { from } + to { to } + bias { bias } + fbias { fbias } + tbias { tbias } + radius { radius } + xindent { xindent } + zindent { zindent } + frompt { frompt } + topt { topt } + arrow { arrow } + arrowlength { arrowlength } + } + import @Geometry named basefrom { } + import @Geometry named baseto { } + import @Geometry named from { } + import @Geometry named to { } + import @Geometry named bias { bias } + import @Geometry named fbias { fbias } + import @Geometry named tbias { tbias } + import @Geometry named radius { radius } + import @Geometry named xindent { xindent } + import @Geometry named zindent { zindent } + import @Geometry named frompt { frompt } + import @Geometry named topt { topt } + named pathstyle + named solid { "/ldiagsolid" } + named dashed { "/ldiagdashed" } + named cdashed { "/ldiagcdashed" } + named dotted { "/ldiagdotted" } + named noline { "/ldiagnoline" } + { pathstyle } + import @Geometry named pathdashlength { pathdashlength } + import @Geometry named pathwidth + named thin { 0.04 ft } + named medium { 0.08 ft } + named thick { 0.12 ft } + { pathwidth } + import @Geometry named pathgap + named thin { 0.08 ft } + named medium { 0.16 ft } + named thick { 0.24 ft } + { pathgap } + + named arrow { arrow } + named arrowstyle { arrowstyle } + named arrowwidth { arrowwidth } + named arrowlength { arrowlength } + + named linklabel { linklabel } + named linklabelmargin { linklabelmargin } + named linklabelfont { linklabelfont } + named linklabelbreak { linklabelbreak } + named linklabelformat right @Body { linklabelformat @Body } + import @Geometry named linklabelpos { linklabelpos } + named linklabelprox { linklabelprox } + import @Geometry named linklabelangle { linklabelangle } + named linklabelctr { linklabelctr } + import @Geometry named linklabeladjust { linklabeladjust } + + named xlabel { xlabel } + named xlabelmargin { xlabelmargin } + named xlabelfont { xlabelfont } + named xlabelbreak { xlabelbreak } + named xlabelformat right @Body { xlabelformat @Body } + import @Geometry named xlabelpos { xlabelpos } + named xlabelprox { xlabelprox } + import @Geometry named xlabelangle { xlabelangle } + named xlabelctr { xlabelctr } + import @Geometry named xlabeladjust { xlabeladjust } + + named ylabel { ylabel } + named ylabelmargin { ylabelmargin } + named ylabelfont { ylabelfont } + named ylabelbreak { ylabelbreak } + named ylabelformat right @Body { ylabelformat @Body } + import @Geometry named ylabelpos { ylabelpos } + named ylabelprox { ylabelprox } + import @Geometry named ylabelangle { ylabelangle } + named ylabelctr { ylabelctr } + import @Geometry named ylabeladjust { ylabeladjust } + + named zlabel { zlabel } + named zlabelmargin { zlabelmargin } + named zlabelfont { zlabelfont } + named zlabelbreak { zlabelbreak } + named zlabelformat right @Body { zlabelformat @Body } + import @Geometry named zlabelpos { zlabelpos } + named zlabelprox { zlabelprox } + import @Geometry named zlabelangle { zlabelangle } + named zlabelctr { zlabelctr } + import @Geometry named zlabeladjust { zlabeladjust } + + named fromlabel { fromlabel } + named fromlabelmargin { fromlabelmargin } + named fromlabelfont { fromlabelfont } + named fromlabelbreak { fromlabelbreak } + named fromlabelformat right @Body { fromlabelformat @Body } + import @Geometry named fromlabelpos { fromlabelpos } + named fromlabelprox { fromlabelprox } + import @Geometry named fromlabelangle { fromlabelangle } + named fromlabelctr { fromlabelctr } + import @Geometry named fromlabeladjust { fromlabeladjust } + + named tolabel { tolabel } + named tolabelmargin { tolabelmargin } + named tolabelfont { tolabelfont } + named tolabelbreak { tolabelbreak } + named tolabelformat right @Body { tolabelformat @Body } + import @Geometry named tolabelpos { tolabelpos } + named tolabelprox { tolabelprox } + import @Geometry named tolabelangle { tolabelangle } + named tolabelctr { tolabelctr } + import @Geometry named tolabeladjust{ tolabeladjust } + right y + + { + def @From + { + from @Case { + "" @Yield basefrom + else @Yield { basefrom"@"from } + } + } + + def @To + { + to @Case { + "" @Yield baseto + else @Yield { baseto"@"to } + } + } + + format + x { x } + y { y } + treehsep { treehsep } + treevsep { treevsep } + insinuatelink { + @Link + from { @From } + to { @To } + bias { bias } + fbias { fbias } + tbias { tbias } + radius { radius } + xindent { xindent } + zindent { zindent } + frompt { frompt } + topt { topt } + path { path + from { @From } + to { @To } + bias { bias } + fbias { fbias } + tbias { tbias } + radius { radius } + xindent { xindent } + zindent { zindent } + frompt { frompt } + topt { topt } + arrow { arrow } + arrowlength { arrowlength } + } + pathstyle { pathstyle } + pathdashlength { pathdashlength } + pathwidth { pathwidth } + pathgap { pathgap } + arrow { arrow } + arrowstyle { arrowstyle } + arrowwidth { arrowwidth } + arrowlength { arrowlength } + + linklabel { linklabel } + linklabelmargin { linklabelmargin } + linklabelfont { linklabelfont } + linklabelbreak { linklabelbreak } + linklabelformat { linklabelformat @Body } + linklabelpos { linklabelpos } + linklabelprox { linklabelprox } + linklabelangle { linklabelangle } + linklabelctr { linklabelctr } + linklabeladjust { linklabeladjust } + + xlabel { xlabel } + xlabelmargin { xlabelmargin } + xlabelfont { xlabelfont } + xlabelbreak { xlabelbreak } + xlabelformat { xlabelformat @Body } + xlabelpos { xlabelpos } + xlabelprox { xlabelprox } + xlabelangle { xlabelangle } + xlabelctr { xlabelctr } + xlabeladjust { xlabeladjust } + + ylabel { ylabel } + ylabelmargin { ylabelmargin } + ylabelfont { ylabelfont } + ylabelbreak { ylabelbreak } + ylabelformat { ylabelformat @Body } + ylabelpos { ylabelpos } + ylabelprox { ylabelprox } + ylabelangle { ylabelangle } + ylabelctr { ylabelctr } + ylabeladjust { ylabeladjust } + + zlabel { zlabel } + zlabelmargin { zlabelmargin } + zlabelfont { zlabelfont } + zlabelbreak { zlabelbreak } + zlabelformat { zlabelformat @Body } + zlabelpos { zlabelpos } + zlabelprox { zlabelprox } + zlabelangle { zlabelangle } + zlabelctr { zlabelctr } + zlabeladjust { zlabeladjust } + + fromlabel { fromlabel } + fromlabelmargin { fromlabelmargin } + fromlabelfont { fromlabelfont } + fromlabelbreak { fromlabelbreak } + fromlabelformat { fromlabelformat @Body } + fromlabelpos { fromlabelpos } + fromlabelprox { fromlabelprox } + fromlabelangle { fromlabelangle } + fromlabelctr { fromlabelctr } + fromlabeladjust { fromlabeladjust } + + tolabel { tolabel } + tolabelmargin { tolabelmargin } + tolabelfont { tolabelfont } + tolabelbreak { tolabelbreak } + tolabelformat { tolabelformat @Body } + tolabelpos { tolabelpos } + tolabelprox { tolabelprox } + tolabelangle { tolabelangle } + tolabelctr { tolabelctr } + tolabeladjust { tolabeladjust } + } + } + + + ####################################################################### + # # + # Abbreviations for standard link types # + # # + ####################################################################### + + macro @Line { @Link path { line } } + macro @DoubleLine { @Link path { doubleline } } + macro @Arrow { @Link path { line } arrow { yes } } + macro @DoubleArrow { @Link path {doubleline} arrow { yes } } + macro @Curve { @Link path { curve } } + macro @CurveArrow { @Link path { curve } arrow { yes } } + macro @ACurve { @Link path { acurve } } + macro @ACurveArrow { @Link path { acurve } arrow { yes } } + macro @CCurve { @Link path { ccurve } } + macro @CCurveArrow { @Link path { ccurve } arrow { yes } } + + macro @Bezier { @Link path { bezier } } + macro @BezierArrow { @Link path { bezier } arrow { yes } } + + macro @HVLine { @Link path { hvline } } + macro @HVArrow { @Link path { hvline } arrow { yes } } + macro @VHLine { @Link path { vhline } } + macro @VHArrow { @Link path { vhline } arrow { yes } } + macro @HVCurve { @Link path { hvcurve } } + macro @HVCurveArrow { @Link path { hvcurve } arrow { yes } } + macro @VHCurve { @Link path { vhcurve } } + macro @VHCurveArrow { @Link path { vhcurve } arrow { yes } } + + macro @LVRLine { @Link path { lvrline } } + macro @LVRArrow { @Link path { lvrline } arrow { yes } } + macro @RVLLine { @Link path { rvlline } } + macro @RVLArrow { @Link path { rvlline } arrow { yes } } + macro @LVRCurve { @Link path { lvrcurve } } + macro @LVRCurveArrow { @Link path { lvrcurve } arrow { yes } } + macro @RVLCurve { @Link path { rvlcurve } } + macro @RVLCurveArrow { @Link path { rvlcurve } arrow { yes } } + + macro @DWrapLine { @Link path { dwrapline} } + macro @DWrapArrow { @Link path { dwrapline} arrow { yes } } + macro @UWrapLine { @Link path { uwrapline} } + macro @UWrapArrow { @Link path { uwrapline} arrow { yes } } + macro @DWrapCurve { @Link path {dwrapcurve} } + macro @DWrapCurveArrow { @Link path {dwrapcurve} arrow { yes } } + macro @UWrapCurve { @Link path {uwrapcurve} } + macro @UWrapCurveArrow { @Link path {uwrapcurve} arrow { yes } } + + + ####################################################################### + # # + # Tree code. # + # # + ####################################################################### + + export + + @Node @Box @CurveBox @ShadowBox @Square @Diamond + @Polygon @Isosceles @Ellipse @Circle + @LeftSub @ZeroWidthLeftSub @RightSub @ZeroWidthRightSub + @FirstSub @NextSub @StubSub + + def @Tree + named treehindent + named left { 0.0rt } + named ctr { 0.5rt } + named right { 1.0rt } + { treehindent } + body x + { + + macro @TNode { @@Node nodetag { T } } + macro @Node { @TNode } + macro @Box { @TNode outline { box } } + macro @CurveBox { @TNode outline { curvebox } } + macro @ShadowBox { @TNode outline { shadowbox } } + macro @Square { @TNode outline { square } } + macro @Diamond { @TNode outline { diamond } } + macro @Polygon { @TNode outline { polygon } } + macro @Isosceles { @TNode outline { isosceles } } + macro @Ellipse { @TNode outline { ellipse } } + macro @Circle { @TNode outline { circle } } + + def fixroot + precedence 90 + left root + { + |treehindent root } - import @Geometry - def @LVRLinePath + macro @LeftSub { - @BackEnd @Case { - PostScript @Yield { - {arrow @FromArrowLength arrowlength} - {arrow @ToArrowLength arrowlength} - "{" from "}" "{" to "}" - xindent zindent bias "ldiaglvrlinepath" - # FROM :: from boundaryatangle 180d - # ++ {arrow @FromArrowLength arrowlength} atangle 180d - # FROM :< 180d - # TO :: to boundaryatangle 180d - # ++ {arrow @ToArrowLength arrowlength} atangle 180d - # TO :< 0d - # XLEFT := {{xcoord FROM} min {xcoord TO}} - bias - # P1 :: { XLEFT ycoord FROM } - # P2 :: { XLEFT ycoord TO } - # VERT := P1 angleto P2 - # P1 :< P1 angleto {P1++{1f atangle 180d}++{1f atangle VERT}} - # P2 :< P2 angleto {P2++{1f atangle 0d} ++{1f atangle VERT}} - # LMID :: P1 ** 0.5 ++ P2 ** 0.5 - # LMID :< VERT - # XINDENT := xindent min {FROM distance P1} - # ZINDENT := zindent min {P2 distance TO} - # LFROM :: FROM -- { XINDENT 0 } - # LFROM :< 180d - # LTO :: TO -- { ZINDENT 0 } - # LTO :< 0d - # FROM LFROM P1 LMID P2 LTO TO - } - PDF @Yield {} - } + @ObjectLink + basefrom { T } + baseto { L@T } + format { { /treevsep {L::y} } |treehsep x | insinuatelink } } - import @Geometry - def @LVRCurvePath + macro @ZeroWidthLeftSub { - @BackEnd @Case { - PostScript @Yield { - {arrow @FromArrowLength arrowlength} - {arrow @ToArrowLength arrowlength} - "{" from "}" "{" to "}" - xindent zindent bias radius "ldiaglvrcurvepath" - # FROM :: from boundaryatangle 180d - # ++ {arrow @FromArrowLength arrowlength} atangle 180d - # FROM :< 180d - # TO :: to boundaryatangle 180d - # ++ {arrow @ToArrowLength arrowlength} atangle 180d - # TO :< 0d - # XLEFT := {{xcoord FROM} min {xcoord TO}} - bias - # XP1 := { XLEFT ycoord FROM } - # XP2 := { XLEFT ycoord TO } - # VERT := XP1 angleto XP2 - # LMID :: XP1 ** 0.5 ++ XP2 ** 0.5 - # LMID :< VERT - # XINDENT := xindent min {FROM distance XP1} - # ZINDENT := zindent min {XP2 distance TO} - # LFROM :: FROM -- { XINDENT 0 } - # LFROM :< 180d - # LTO :: TO -- { ZINDENT 0 } - # LTO :< 0d - # RADIUS := radius min { { XP1 distance XP2 } / 2 } - # XP1PRE := XP1 ++ { RADIUS atangle 0d } - # XP1POST := XP1 ++ { RADIUS atangle VERT } - # XP1CTR := XP1PRE ++ { RADIUS atangle VERT } - # P1 :: XP1CTR ++ { RADIUS atangle { XP1CTR angleto XP1 } } - # P1 :< XP1PRE angleto XP1POST - # XP2PRE := XP2 -- { RADIUS atangle VERT } - # XP2POST := XP2 ++ { RADIUS atangle 0d } - # XP2CTR := XP2PRE ++ { RADIUS atangle 0d } - # P2 :: XP2CTR ++ { RADIUS atangle { XP2CTR angleto XP2 } } - # P2 :< XP2PRE angleto XP2POST - # FROM LFROM XP1PRE - # {round VERT} quadcase - # 90 { [XP1CTR clockwise] P1 [XP1CTR clockwise] } - # 270 { [XP1CTR] P1 [XP1CTR] } - # XP1POST LMID XP2PRE - # {round VERT} quadcase - # 90 { [XP2CTR clockwise] P2 [XP2CTR clockwise] } - # 270 { [XP2CTR] P2 [XP2CTR] } - # XP2POST LTO TO - } - PDF @Yield {} - } + @ObjectLink + basefrom { T } + baseto { L@T } + format { { /treevsep @ZeroWidth { {L::y} ^|treehsep } } | + x | insinuatelink } } - import @Geometry - def @RVLLinePath + macro @FirstSub { - @BackEnd @Case { - PostScript @Yield { - {arrow @FromArrowLength arrowlength} - {arrow @ToArrowLength arrowlength} - "{" from "}" "{" to "}" - xindent zindent bias "ldiagrvllinepath" - # FROM :: from boundaryatangle 0d - # ++ {arrow @FromArrowLength arrowlength} atangle 0d - # FROM :< 0d - # TO :: to boundaryatangle 0d - # ++ {arrow @ToArrowLength arrowlength} atangle 0d - # TO :< 180d - # XRIGHT := {{xcoord FROM} max {xcoord TO}} + bias - # P1 :: { XRIGHT ycoord FROM } - # P2 :: { XRIGHT ycoord TO } - # VERT := P1 angleto P2 - # P1 :< P1 angleto {P1++{1f atangle 0d} ++{1f atangle VERT}} - # P2 :< P2 angleto {P2++{1f atangle 180d}++{1f atangle VERT}} - # LMID :: P1 ** 0.5 ++ P2 ** 0.5 - # LMID :< VERT - # XINDENT := xindent min {FROM distance P1} - # ZINDENT := zindent min {P2 distance TO} - # LFROM :: FROM ++ { XINDENT 0 } - # LFROM :< 0d - # LTO :: TO ++ { ZINDENT 0 } - # LTO :< 180d - # FROM LFROM P1 LMID P2 LTO TO - } - PDF @Yield {} - } + fixroot // + @ObjectLink + basefrom { T } + baseto { S@T } + format { //treevsep {S::y} | insinuatelink | } } - import @Geometry - def @RVLCurvePath + macro @NextSub { - @BackEnd @Case { - PostScript @Yield { - {arrow @FromArrowLength arrowlength} - {arrow @ToArrowLength arrowlength} - "{" from "}" "{" to "}" - xindent zindent bias radius "ldiagrvlcurvepath" - # FROM :: from boundaryatangle 0d - # ++ {arrow @FromArrowLength arrowlength} atangle 0d - # FROM :< 0d - # TO :: to boundaryatangle 0d - # ++ {arrow @ToArrowLength arrowlength} atangle 0d - # TO :< 180d - # XRIGHT := {{xcoord FROM} max {xcoord TO}} + bias - # XP1 := { XRIGHT ycoord FROM } - # XP2 := { XRIGHT ycoord TO } - # VERT := XP1 angleto XP2 - # LMID :: XP1 ** 0.5 ++ XP2 ** 0.5 - # LMID :< VERT - # XINDENT := xindent min {FROM distance XP1} - # ZINDENT := zindent min {XP2 distance TO} - # LFROM :: FROM ++ { XINDENT 0 } - # LFROM :< 0d - # LTO :: TO ++ { ZINDENT 0 } - # LTO :< 180d - # RADIUS := radius min { { XP1 distance XP2 } * 0.5 } - # XP1PRE := XP1 ++ { RADIUS atangle 180d } - # XP1POST := XP1 ++ { RADIUS atangle VERT } - # XP1CTR := XP1PRE ++ { RADIUS atangle VERT } - # P1 :: XP1CTR ++ { RADIUS atangle { XP1CTR angleto XP1 } } - # P1 :< XP1PRE angleto XP1POST - # XP2PRE := XP2 -- { RADIUS atangle VERT } - # XP2POST := XP2 ++ { RADIUS atangle 180d } - # XP2CTR := XP2PRE ++ { RADIUS atangle 180d } - # P2 :: XP2CTR ++ { RADIUS atangle { XP2CTR angleto XP2 } } - # P2 :< XP2PRE angleto XP2POST - # FROM LFROM XP1PRE - # {round VERT} quadcase - # 90 { [XP1CTR] P1 [XP1CTR] } - # 270 { [XP1CTR clockwise] P1 [XP1CTR clockwise] } - # XP1POST LMID XP2PRE - # {round VERT} quadcase - # 90 { [XP2CTR] P2 [XP2CTR] } - # 270 { [XP2CTR clockwise] P2 [XP2CTR clockwise] } - # XP2POST LTO TO - } - PDF @Yield {} - } + @ObjectLink + basefrom { T } + baseto { S@T } + format { x |treehsep { / {S::y} | insinuatelink | } } } - import @Geometry - def @DWrapLinePath + macro @RightSub + { + @ObjectLink + basefrom { T } + baseto { R@T } + format { x |treehsep { /treevsep {R::y} } | insinuatelink } + } + + macro @ZeroWidthRightSub + { + @ObjectLink + basefrom { T } + baseto { R@T } + format { x | { /treevsep @ZeroWidth { |treehsep {R::y} } } + | insinuatelink } + } + + macro @StubSub + { + @ObjectLink + basefrom { T } + baseto { T } + format { @VContract { |0.5rt x | // |0.5rt + S:: @BoxLabels @CatchTags y | } | insinuatelink } + # path { from S@T@SW S@T@SE to } + path { + P1:: S@SW + P2:: S@SE + FROM:: from boundaryatangle { from??CTR angleto P1 } + TO:: to boundaryatangle { to??CTR angleto P2 } + FROM P1 P2 TO + } + } + + @HContract @VContract x + } + + export + + @Node @Box @CurveBox @ShadowBox @Square @Diamond + @Polygon @Isosceles @Ellipse @Circle + @LeftSub @ZeroWidthLeftSub @RightSub @ZeroWidthRightSub + @FirstSub @NextSub @StubSub + + def @HTree + named treevindent + named top { 0.0rt } + named ctr { 0.5rt } + named foot { 1.0rt } + { treevindent } + body x + { + + macro @TNode { @@Node nodetag { T } } + macro @Node { @TNode } + macro @Box { @TNode outline { box } } + macro @CurveBox { @TNode outline { curvebox } } + macro @ShadowBox { @TNode outline { shadowbox } } + macro @Square { @TNode outline { square } } + macro @Diamond { @TNode outline { diamond } } + macro @Polygon { @TNode outline { polygon } } + macro @Isosceles { @TNode outline { isosceles } } + macro @Ellipse { @TNode outline { ellipse } } + macro @Circle { @TNode outline { circle } } + + def fixroot + precedence 90 + left root { - @BackEnd @Case { - PostScript @Yield { - {arrow @FromArrowLength arrowlength} - {arrow @ToArrowLength arrowlength} - "{" from "}" "{" to "}" - xindent zindent bias fbias tbias "ldiagdwraplinepath" - # DIRN := if cond { xcoord from??CTR < xcoord to??CTR } - # then { 180d } else { 0d } - # FROM :: from boundaryatangle DIRN - # ++ {arrow @FromArrowLength arrowlength} atangle DIRN - # FROM :< DIRN - # TO :: to boundaryatangle { DIRN + 180d } - # ++ {arrow @ToArrowLength arrowlength} atangle { DIRN + 180d } - # TO :< DIRN - # P1 :: FROM ++ {fbias max 0} atangle DIRN - # P1 :< if cond { DIRN = 180d } then { 225d } else { -45d } - # P4 :: TO ++ {tbias max 0} atangle { DIRN + 180d } - # P4 :< if cond { DIRN = 180d } then { 135d } else { 45d } - # YC := ycoord { from boundaryatangle 270d } min - # ycoord { to boundaryatangle 270d } - # - { bias max 0 } - # P2 :: { xcoord P1 YC } - # P2 :< P4@ANGLE - 180d - # P3 :: { xcoord P4 YC } - # P3 :< P1@ANGLE - 180d - # XINDENT := xindent min { FROM distance P1 } - # LFROM :: FROM ++ XINDENT atangle DIRN - # LFROM :< FROM@ANGLE - # ZINDENT := zindent min { TO distance P4 } - # LTO :: TO ++ ZINDENT atangle { DIRN + 180d } - # LTO :< TO@ANGLE - # LMID :: P2 ** 0.5 ++ P3 ** 0.5 - # LMID :< DIRN - 180d - # FROM P1 P2 P3 P4 TO - } - PDF @Yield {} - } + /treevindent root } - import @Geometry - def @DWrapCurvePath + macro @LeftSub { - @BackEnd @Case { - PostScript @Yield { - {arrow @FromArrowLength arrowlength} - {arrow @ToArrowLength arrowlength} - "{" from "}" "{" to "}" - xindent zindent bias fbias tbias radius "ldiagdwrapcurvepath" - # DIRN := if cond { xcoord from??CTR < xcoord to??CTR } - # then { 180d } else { 0d } - # CLOCK := if cond { xcoord from??CTR < xcoord to??CTR } - # then { anticlockwise } else { clockwise } - # FROM :: from boundaryatangle DIRN - # ++ {arrow @FromArrowLength arrowlength} atangle DIRN - # FROM :< DIRN - # TO :: to boundaryatangle { DIRN + 180d } - # ++ {arrow @ToArrowLength arrowlength} atangle { DIRN + 180d } - # TO :< DIRN - # - # XP1 := FROM ++ {fbias max 0} atangle DIRN - # XP4 := TO ++ {tbias max 0} atangle { DIRN + 180d } - # YC := ycoord { from boundaryatangle 270d } min - # ycoord { to boundaryatangle 270d } - # - { bias max 0 } - # XP2 := { xcoord XP1 YC } - # XP3 := { xcoord XP4 YC } - # - # RP1 := radius min { XP1 distance FROM } min - # { { XP1 distance XP2 } / 2 } - # XP1PRE := XP1 ++ RP1 atangle { XP1 angleto FROM } - # XP1POST := XP1 ++ RP1 atangle { XP1 angleto XP2 } - # XP1CTR := XP1PRE ++ RP1 atangle { XP1 angleto XP2 } - # P1 :: XP1CTR ++ RP1 atangle { XP1CTR angleto XP1 } - # P1 :< XP1CTR angleto P1 + DIRN - 90d - # - # RP2 := radius min { { XP1 distance XP2 } / 2 } - # min { { XP2 distance XP3 } / 2 } - # XP2PRE := XP2 ++ RP2 atangle { XP2 angleto XP1 } - # XP2POST := XP2 ++ RP2 atangle { XP2 angleto XP3 } - # XP2CTR := XP2PRE ++ RP2 atangle { XP2 angleto XP3 } - # P2 :: XP2CTR ++ RP2 atangle { XP2CTR angleto XP2 } - # P2 :< XP2CTR angleto P2 + DIRN - 90d - # - # RP3 := radius min { { XP2 distance XP3 } / 2 } - # min { { XP3 distance XP4 } / 2 } - # XP3PRE := XP3 ++ RP3 atangle { XP3 angleto XP2 } - # XP3POST := XP3 ++ RP3 atangle { XP3 angleto XP4 } - # XP3CTR := XP3PRE ++ RP3 atangle { XP3 angleto XP4 } - # P3 :: XP3CTR ++ RP3 atangle { XP3CTR angleto XP3 } - # P3 :< XP3CTR angleto P3 + DIRN - 90d - # - # RP4 := radius min { { XP4 distance XP3 } / 2 } - # min { XP4 distance TO } - # XP4PRE := XP4 ++ RP4 atangle { XP4 angleto XP3 } - # XP4POST := XP4 ++ RP4 atangle { XP4 angleto TO } - # XP4CTR := XP4PRE ++ RP4 atangle { XP4 angleto TO } - # P4 :: XP4CTR ++ RP4 atangle { XP4CTR angleto XP4 } - # P4 :< XP4CTR angleto P4 + DIRN - 90d - # - # XINDENT := xindent min { FROM distance XP1PRE } - # LFROM :: FROM ++ XINDENT atangle DIRN - # LFROM :< FROM@ANGLE - # - # LMID :: XP2 ** 0.5 ++ XP3 ** 0.5 - # LMID :< DIRN - 180d - # - # ZINDENT := zindent min { TO distance XP4POST } - # LTO :: TO ++ ZINDENT atangle { DIRN + 180d } - # LTO :< TO@ANGLE - # - # FROM LFROM - # XP1PRE [XP1CTR CLOCK] XP1POST - # XP2PRE [XP2CTR CLOCK] XP2POST - # LMID - # XP3PRE [XP3CTR CLOCK] XP3POST - # XP4PRE [XP4CTR CLOCK] XP4POST - # LTO TO - } - PDF @Yield {} - } + @ObjectLink + basefrom { T } + baseto { L@T } + format { { |treehsep {L::y} } /treevsep x / insinuatelink } } - import @Geometry - def @UWrapLinePath + macro @ZeroWidthLeftSub { - @BackEnd @Case { - PostScript @Yield { - {arrow @FromArrowLength arrowlength} - {arrow @ToArrowLength arrowlength} - "{" from "}" "{" to "}" - xindent zindent bias fbias tbias "ldiaguwraplinepath" - # DIRN := if cond { xcoord from??CTR < xcoord to??CTR } - # then { 180d } else { 0d } - # FROM :: from boundaryatangle DIRN - # ++ {arrow @FromArrowLength arrowlength} atangle DIRN - # FROM :< DIRN - # TO :: to boundaryatangle { DIRN + 180d } - # ++ {arrow @ToArrowLength arrowlength} atangle { DIRN + 180d } - # TO :< DIRN - # P1 :: FROM ++ {fbias max 0} atangle DIRN - # P1 :< if cond { DIRN = 180d } then { 135d } else { 45d } - # P4 :: TO ++ {tbias max 0} atangle { DIRN + 180d } - # P4 :< if cond { DIRN = 180d } then { 225d } else { -45d } - # YC := ycoord { from boundaryatangle 90d } max - # ycoord { to boundaryatangle 90d } - # + { bias max 0 } - # P2 :: { xcoord P1 YC } - # P2 :< P4@ANGLE - 180d - # P3 :: { xcoord P4 YC } - # P3 :< P1@ANGLE - 180d - # XINDENT := xindent min { FROM distance P1 } - # LFROM :: FROM ++ XINDENT atangle DIRN - # LFROM :< FROM@ANGLE - # ZINDENT := zindent min { TO distance P4 } - # LTO :: TO ++ ZINDENT atangle { DIRN + 180d } - # LTO :< TO@ANGLE - # LMID :: P2 ** 0.5 ++ P3 ** 0.5 - # LMID :< DIRN - 180d - # FROM P1 P2 P3 P4 TO - } - PDF @Yield {} - } + @ObjectLink + basefrom { T } + baseto { L@T } + format { { |treehsep @ZeroWidth { {L::y} ^/treevsep } } / + x / insinuatelink } } - import @Geometry - def @UWrapCurvePath - { - @BackEnd @Case { - PostScript @Yield { - {arrow @FromArrowLength arrowlength} - {arrow @ToArrowLength arrowlength} - "{" from "}" "{" to "}" - xindent zindent bias fbias tbias radius "ldiaguwrapcurvepath" - # DIRN := if cond { xcoord from??CTR < xcoord to??CTR } - # then { 180d } else { 0d } - # CLOCK := if cond { xcoord from??CTR < xcoord to??CTR } - # then { clockwise } else { anticlockwise } - # FROM :: from boundaryatangle DIRN - # ++ {arrow @FromArrowLength arrowlength} atangle DIRN - # FROM :< DIRN - # TO :: to boundaryatangle { DIRN + 180d } - # ++ {arrow @ToArrowLength arrowlength} atangle { DIRN + 180d } - # TO :< DIRN - # - # XP1 := FROM ++ {fbias max 0} atangle DIRN - # XP4 := TO ++ {tbias max 0} atangle { DIRN + 180d } - # YC := ycoord { from boundaryatangle 90d } max - # ycoord { to boundaryatangle 90d } - # + { bias max 0 } - # XP2 := { xcoord XP1 YC } - # XP3 := { xcoord XP4 YC } - # - # RP1 := radius min { XP1 distance FROM } min - # { { XP1 distance XP2 } / 2 } - # XP1PRE := XP1 ++ RP1 atangle { XP1 angleto FROM } - # XP1POST := XP1 ++ RP1 atangle { XP1 angleto XP2 } - # XP1CTR := XP1PRE ++ RP1 atangle { XP1 angleto XP2 } - # P1 :: XP1CTR ++ RP1 atangle { XP1CTR angleto XP1 } - # P1 :< XP1CTR angleto P1 + DIRN + 90d - # - # RP2 := radius min { { XP1 distance XP2 } / 2 } - # min { { XP2 distance XP3 } / 2 } - # XP2PRE := XP2 ++ RP2 atangle { XP2 angleto XP1 } - # XP2POST := XP2 ++ RP2 atangle { XP2 angleto XP3 } - # XP2CTR := XP2PRE ++ RP2 atangle { XP2 angleto XP3 } - # P2 :: XP2CTR ++ RP2 atangle { XP2CTR angleto XP2 } - # P2 :< XP2CTR angleto P2 + DIRN + 90d - # - # RP3 := radius min { { XP2 distance XP3 } / 2 } - # min { { XP3 distance XP4 } / 2 } - # XP3PRE := XP3 ++ RP3 atangle { XP3 angleto XP2 } - # XP3POST := XP3 ++ RP3 atangle { XP3 angleto XP4 } - # XP3CTR := XP3PRE ++ RP3 atangle { XP3 angleto XP4 } - # P3 :: XP3CTR ++ RP3 atangle { XP3CTR angleto XP3 } - # P3 :< XP3CTR angleto P3 + DIRN + 90d - # - # RP4 := radius min { { XP4 distance XP3 } / 2 } - # min { XP4 distance TO } - # XP4PRE := XP4 ++ RP4 atangle { XP4 angleto XP3 } - # XP4POST := XP4 ++ RP4 atangle { XP4 angleto TO } - # XP4CTR := XP4PRE ++ RP4 atangle { XP4 angleto TO } - # P4 :: XP4CTR ++ RP4 atangle { XP4CTR angleto XP4 } - # P4 :< XP4CTR angleto P4 + DIRN + 90d - # - # XINDENT := xindent min { FROM distance XP1PRE } - # LFROM :: FROM ++ XINDENT atangle DIRN - # LFROM :< FROM@ANGLE - # - # LMID :: XP2 ** 0.5 ++ XP3 ** 0.5 - # LMID :< DIRN - 180d - # - # ZINDENT := zindent min { TO distance XP4POST } - # LTO :: TO ++ ZINDENT atangle { DIRN + 180d } - # LTO :< TO@ANGLE - # - # FROM LFROM - # XP1PRE [XP1CTR CLOCK] XP1POST - # XP2PRE [XP2CTR CLOCK] XP2POST - # LMID - # XP3PRE [XP3CTR CLOCK] XP3POST - # XP4PRE [XP4CTR CLOCK] XP4POST - # LTO TO - } - PDF @Yield {} - } + macro @FirstSub + { + fixroot || + @ObjectLink + basefrom { T } + baseto { S@T } + format { ||treehsep { {S::y} / insinuatelink / } } } - import @Geometry - def @Path + macro @NextSub { - path @Case { - line @Yield @LinePath - doubleline @Yield @DoubleLinePath - { acurve curve } @Yield @ACurvePath - ccurve @Yield @CCurvePath - bezier @Yield @BezierPath - vhline @Yield @VHLinePath - vhcurve @Yield @VHCurvePath - hvline @Yield @HVLinePath - hvcurve @Yield @HVCurvePath - lvrline @Yield @LVRLinePath - lvrcurve @Yield @LVRCurvePath - rvlline @Yield @RVLLinePath - rvlcurve @Yield @RVLCurvePath - dwrapline @Yield @DWrapLinePath - dwrapcurve @Yield @DWrapCurvePath - uwrapline @Yield @UWrapLinePath - uwrapcurve @Yield @UWrapCurvePath - else @Yield { - path - from { from } - to { to } - bias { bias } - fbias { fbias } - tbias { tbias } - radius { radius } - xindent { xindent } - zindent { zindent } - frompt { frompt } - topt { topt } - arrow { arrow } - arrowlength { arrowlength } - } - } + @ObjectLink + basefrom { T } + baseto { S@T } + format { x /treevsep { | {S::y} { / insinuatelink / } } } } - def @FromLabel + macro @RightSub { - @DoLabel - which { "f" } - label { fromlabel @Else @FromArrow } - labelmargin { fromlabelmargin } - labelfont { fromlabelfont } - labelbreak { fromlabelbreak } - labelformat { fromlabelformat @Body } - labelpos { fromlabelpos } - labelprox { fromlabelprox } - labelangle { fromlabelangle } - labelctr { fromlabelctr } - labeladjust { fromlabeladjust } + @ObjectLink + basefrom { T } + baseto { R@T } + format { x /treevsep { |treehsep {R::y} } / insinuatelink } } - def @ToLabel + macro @ZeroWidthRightSub { - @DoLabel - which { "t" } - label { tolabel @Else @ToArrow } - labelmargin { tolabelmargin } - labelfont { tolabelfont } - labelbreak { tolabelbreak } - labelformat { tolabelformat @Body } - labelpos { tolabelpos } - labelprox { tolabelprox } - labelangle { tolabelangle } - labelctr { tolabelctr } - labeladjust { tolabeladjust } + @ObjectLink + basefrom { T } + baseto { R@T } + format { x / { |treehsep @ZeroWidth { /treevsep {R::y} } } + / insinuatelink } } - def @Direct + macro @StubSub { - pathstyle @Case { - { "/ldiagsolid" "/ldiagdashed" "/ldiagcdashed" - "/ldiagdotted" "/ldiagnoline" } @Yield 1 - else @Yield 0 + @ObjectLink + basefrom { T } + baseto { T } + format { @VContract { { /0.5rt x / } || { /0.5rt + S:: @BoxLabels @CatchTags y / } } / insinuatelink } + # path { from S@T@SW S@T@SE to } + path { + P1:: S@NE + P2:: S@SE + FROM:: from boundaryatangle { from??CTR angleto P1 } + TO:: to boundaryatangle { to??CTR angleto P2 } + FROM P1 P2 TO + } + } + + @HContract @VContract x + } + + + ####################################################################### + # # + # Syntax diagrams code # + # # + # Helper definitions; also skips # + # # + ####################################################################### + + def pslength right x { "("x") ldiagdecodelength" } + def pssyntaxgap { "("syntaxgap") ldiagdecodelength" } + def pssyntaxbias { "("syntaxbias") ldiagdecodelength" } + def pssyntaxradius { "("syntaxradius") ldiagdecodelength" } + + def @ArrowLeftFrom left direction right pt + { + @Line arrow { direction } from { pt } to { pt -- { pssyntaxgap 0 } } + } + + def @ArrowRightFrom left direction right pt + { + @Line arrow { direction } from { pt } to { pt ++ { pssyntaxgap 0 } } + } + + def @ArrowUpFrom left direction right pt + { + @Line arrow { direction } from { pt } to { pt ++ { 0 pssyntaxgap } } + } + + def @ArrowDownFrom left direction right pt + { + @Line arrow { direction } from { pt } to { pt -- { 0 pssyntaxgap } } + } + + macro @LineLeftFrom { no @ArrowLeftFrom } + macro @LineRightFrom { no @ArrowRightFrom } + macro @LineUpFrom { no @ArrowUpFrom } + macro @LineDownFrom { no @ArrowDownFrom } + + macro @Right { "1p" } + macro @Up { "2p" } + macro @Left { "3p" } + macro @Down { "4p" } + + macro @CurrDirection { @CurrZUnit } + + def @GoRight right x { @Right @ZUnit x } + def @GoUp right x { @Up @ZUnit x } + def @GoLeft right x { @Left @ZUnit x } + def @GoDown right x { @Down @ZUnit x } + + def @GoReverse right x + { + @CurrDirection @Case { + @Right @Yield @GoLeft x + @Up @Yield @GoDown x + @Left @Yield @GoRight x + @Down @Yield @GoUp x + } + } + + + def @LabelMarks right x { + @HContract @VContract @ANode + outline { + NMK:: { xmark ysize } + SMK:: { xmark 0 } + WMK:: { 0 ymark } + EMK:: { xsize ymark } + NW:: { 0 ysize } + SW:: { 0 0 } + SE:: { xsize 0 } + NE:: { xsize ysize } } + font {} + margin { 0c } + vstrut { no } + outlinestyle { noline } + halign { mark } + valign { mark } + x + } + + def @HSkip + { + OX:: @LabelMarks { syntaxgap @Wide {} } + / @Line from { "OX@WMK" } to { "OX@EMK" } + } + + def @VSkip + { + OX:: @LabelMarks { syntaxgap @High {} } + / @Line from { "OX@NMK" } to { "OX@SMK" } + } + + def @Skip + { + @CurrDirection @Case { + { @Left @Right } @Yield @HSkip + { @Up @Down } @Yield @VSkip } + } - @BackEnd @Case { - PostScript @Yield { + def @LRLine right x + { + @HContract @VContract { @HSkip | x | @HSkip } + } - @Null & # so that preceding space gets chewed up - { - @Direct "ldiaglinkbegin [" @Path "]" pathdashlength - "[" pathstyle "]" pathwidth "ldiaglinkend" - } - @Graphic - { - / { fromlabel @Else @FromArrow} @IfNonEmpty @FromLabel - / { xlabel @Else linklabel } @IfNonEmpty @XLabel - / { ylabel @Else linklabel } @IfNonEmpty @YLabel - / { zlabel @Else linklabel } @IfNonEmpty @ZLabel - / { tolabel @Else @ToArrow } @IfNonEmpty @ToLabel + def @UDLine right x + { + @HContract @VContract { @VSkip / x / @VSkip } + } + + + ####################################################################### + # # + # Ordinary starts: @StartRight, @StartUp, @StartLeft, @StartDown # + # # + ####################################################################### + + def @StartRight right x + { + @VContract { + @LabelMarks { + |syntaxgap @GoRight x |syntaxgap + } + / @LineRightFrom WMK + / back @ArrowLeftFrom EMK } + } + def @StartUp right x + { + @VContract { + @LabelMarks { + ^/syntaxgap @GoUp x /syntaxgap + } + / @LineUpFrom SMK + / back @ArrowDownFrom NMK } - PDF @Yield {} - } } + def @StartLeft right x + { + @VContract { + @LabelMarks { + |syntaxgap @GoLeft x |syntaxgap + } + / @LineLeftFrom EMK + / back @ArrowRightFrom WMK + } + } - def @ObjectLink - precedence 90 - associativity left - left x - named treehsep { treehsep } - named treevsep { treevsep } - named format - named x {} - named y {} - named insinuatelink {} - named treehsep {} - named treevsep {} - { x | y | insinuatelink } - import @Geometry named path - named from {} - named to {} - named bias {} - named fbias {} - named tbias {} - named radius {} - named xindent {} - named zindent {} - named frompt {} - named topt {} - named arrow {} - named arrowlength {} - { path - from { from } - to { to } - bias { bias } - fbias { fbias } - tbias { tbias } - radius { radius } - xindent { xindent } - zindent { zindent } - frompt { frompt } - topt { topt } - arrow { arrow } - arrowlength { arrowlength } - } - import @Geometry named basefrom { } - import @Geometry named baseto { } - import @Geometry named from { } - import @Geometry named to { } - import @Geometry named bias { bias } - import @Geometry named fbias { fbias } - import @Geometry named tbias { tbias } - import @Geometry named radius { radius } - import @Geometry named xindent { xindent } - import @Geometry named zindent { zindent } - import @Geometry named frompt { frompt } - import @Geometry named topt { topt } - named pathstyle - named solid { "/ldiagsolid" } - named dashed { "/ldiagdashed" } - named cdashed { "/ldiagcdashed" } - named dotted { "/ldiagdotted" } - named noline { "/ldiagnoline" } - { pathstyle } - import @Geometry named pathdashlength { pathdashlength } - import @Geometry named pathwidth - named thin { 0.04 ft } - named medium { 0.08 ft } - named thick { 0.12 ft } - { pathwidth } - import @Geometry named pathgap - named thin { 0.08 ft } - named medium { 0.16 ft } - named thick { 0.24 ft } - { pathgap } + def @StartDown right x + { + @VContract { + @LabelMarks { + ^/syntaxgap @GoDown x /syntaxgap + } + / @LineDownFrom NMK + / back @ArrowUpFrom SMK + } + } + + + ####################################################################### + # # + # Fancy starts: @StartRightRight, @StartRightDown # + # # + ####################################################################### + + def @StartRightRight + named A {} + named B {} + { + AA:: @LabelMarks { @HSkip & @GoRight A } + //syntaxgap + //syntaxgap + |syntaxgap |syntaxgap |syntaxgap |syntaxgap |syntaxgap |syntaxgap + CC:: @LabelMarks {} + //syntaxgap + //syntaxgap + |syntaxgap |syntaxgap |syntaxgap |syntaxgap |syntaxgap |syntaxgap + BB:: @LabelMarks { @GoRight B & @HSkip } + // @RVLCurve from { AA@EMK } to { CC@WMK } + bias { pssyntaxbias } radius { pssyntaxradius } + // @LVRCurve from { CC@WMK } to { BB@WMK } + bias { pssyntaxbias } radius { pssyntaxradius } + back @ArrowLeftFrom BB@EMK + } + + def @StartRightDown + named A {} + named B {} + { + @HContract @VContract { + / BB:: @LabelMarks |syntaxgap AA::@LabelMarks @GoRight A |syntaxbias + /syntaxgap | | + /syntaxgap | | + } + / @Line from { BB@EMK } to { AA@WMK } + / @RVLCurve from { AA@EMK } to { xcoord AA@EMK pssyntaxgap } + bias { pssyntaxbias } radius { pssyntaxradius } + / @HVCurve from { xcoord AA@EMK pssyntaxgap } to { 0 0 } + bias { pssyntaxbias } radius { pssyntaxradius } + / @GoDown B + / @VSkip + / CC:: @LabelMarks {} + / back @ArrowUpFrom CC@NMK + } - named arrow { arrow } - named arrowstyle { arrowstyle } - named arrowwidth { arrowwidth } - named arrowlength { arrowlength } + + ####################################################################### + # # + # Cells: @XCell, @ACell, @BCell, @CCell # + # # + ####################################################################### - named linklabel { linklabel } - named linklabelmargin { linklabelmargin } - named linklabelfont { linklabelfont } - named linklabelbreak { linklabelbreak } - named linklabelformat right @Body { linklabelformat @Body } - import @Geometry named linklabelpos { linklabelpos } - named linklabelprox { linklabelprox } - import @Geometry named linklabelangle { linklabelangle } - named linklabelctr { linklabelctr } - import @Geometry named linklabeladjust { linklabeladjust } + def @RightCell right x + { + @VContract { + @LabelMarks { + |syntaxgap x |syntaxgap + } + / forward @ArrowRightFrom WMK + / @LineLeftFrom EMK + } + } - named xlabel { xlabel } - named xlabelmargin { xlabelmargin } - named xlabelfont { xlabelfont } - named xlabelbreak { xlabelbreak } - named xlabelformat right @Body { xlabelformat @Body } - import @Geometry named xlabelpos { xlabelpos } - named xlabelprox { xlabelprox } - import @Geometry named xlabelangle { xlabelangle } - named xlabelctr { xlabelctr } - import @Geometry named xlabeladjust { xlabeladjust } + def @LeftCell right x + { + @VContract { + @LabelMarks { + |syntaxgap x |syntaxgap + } + / forward @ArrowLeftFrom EMK + / @LineRightFrom WMK + } + } - named ylabel { ylabel } - named ylabelmargin { ylabelmargin } - named ylabelfont { ylabelfont } - named ylabelbreak { ylabelbreak } - named ylabelformat right @Body { ylabelformat @Body } - import @Geometry named ylabelpos { ylabelpos } - named ylabelprox { ylabelprox } - import @Geometry named ylabelangle { ylabelangle } - named ylabelctr { ylabelctr } - import @Geometry named ylabeladjust { ylabeladjust } + def @DownCell right x + { + @VContract { + @LabelMarks { + ^/syntaxgap x /syntaxgap + } + / forward @ArrowDownFrom NMK + / @LineUpFrom SMK + } + } - named zlabel { zlabel } - named zlabelmargin { zlabelmargin } - named zlabelfont { zlabelfont } - named zlabelbreak { zlabelbreak } - named zlabelformat right @Body { zlabelformat @Body } - import @Geometry named zlabelpos { zlabelpos } - named zlabelprox { zlabelprox } - import @Geometry named zlabelangle { zlabelangle } - named zlabelctr { zlabelctr } - import @Geometry named zlabeladjust { zlabeladjust } + def @UpCell right x + { + @VContract { + @LabelMarks { + ^/syntaxgap x /syntaxgap + } + / forward @ArrowUpFrom SMK + / @LineDownFrom NMK + } + } - named fromlabel { fromlabel } - named fromlabelmargin { fromlabelmargin } - named fromlabelfont { fromlabelfont } - named fromlabelbreak { fromlabelbreak } - named fromlabelformat right @Body { fromlabelformat @Body } - import @Geometry named fromlabelpos { fromlabelpos } - named fromlabelprox { fromlabelprox } - import @Geometry named fromlabelangle { fromlabelangle } - named fromlabelctr { fromlabelctr } - import @Geometry named fromlabeladjust { fromlabeladjust } + def @XCell right x + { + @CurrDirection @Case { + @Right @Yield @RightCell x + @Up @Yield @UpCell x + @Left @Yield @LeftCell x + @Down @Yield @DownCell x + } + } - named tolabel { tolabel } - named tolabelmargin { tolabelmargin } - named tolabelfont { tolabelfont } - named tolabelbreak { tolabelbreak } - named tolabelformat right @Body { tolabelformat @Body } - import @Geometry named tolabelpos { tolabelpos } - named tolabelprox { tolabelprox } - import @Geometry named tolabelangle { tolabelangle } - named tolabelctr { tolabelctr } - import @Geometry named tolabeladjust{ tolabeladjust } - right y + macro @ACell { @XCell @ANode } + macro @BCell { @XCell @BNode } + macro @CCell { @XCell @CNode } + + + ####################################################################### + # # + # @Sequence # + # # + ####################################################################### + + def @Sequence + named A {} + named B {} + named C {} + named D {} + named E {} + named F {} + named G {} + named H {} + named I {} + named J {} + named K {} + named L {} + { - { - def @From - { - from @Case { - "" @Yield basefrom - else @Yield { basefrom"@"from } - } + @CurrDirection @Case { + @Right @Yield + @HContract { A | B | C | D | E | F | G | H | I | J | K | L } + @Up @Yield + @VContract { L / K / J / I / H / G / F / E / D / C / B / A } + @Left @Yield + @HContract { L | K | J | I | H | G | F | E | D | C | B | A } + @Down @Yield + @VContract { A / B / C / D / E / F / G / H / I / J / K / L } } + } - def @To + + ####################################################################### + # # + # @Select and @Optional # + # # + ####################################################################### + + def @Select + named A {} + named B {} + named C {} + named D {} + named E {} + named F {} + named G {} + named H {} + named I {} + named J {} + named K {} + named L {} + { + + def @RLFirstOrMiddle + left label + named i { 0i } + named al { no } + named ar { no } + right x { - to @Case { - "" @Yield baseto - else @Yield { baseto"@"to } - } + {|i @HContract { |syntaxgap label:: @LabelMarks x |syntaxgap }} + // @Line from { label"@WMK" } to { 0 ycoord label"@WMK" } + arrow { al } + // @Line from { label"@EMK" } to { xsize ycoord label"@EMK" } + arrow { ar } } - format - x { x } - y { y } - treehsep { treehsep } - treevsep { treevsep } - insinuatelink { - @Link - from { @From } - to { @To } - bias { bias } - fbias { fbias } - tbias { tbias } - radius { radius } - xindent { xindent } - zindent { zindent } - frompt { frompt } - topt { topt } - path { path - from { @From } - to { @To } - bias { bias } - fbias { fbias } - tbias { tbias } - radius { radius } - xindent { xindent } - zindent { zindent } - frompt { frompt } - topt { topt } - arrow { arrow } - arrowlength { arrowlength } - } - pathstyle { pathstyle } - pathdashlength { pathdashlength } - pathwidth { pathwidth } - pathgap { pathgap } - arrow { arrow } - arrowstyle { arrowstyle } - arrowwidth { arrowwidth } - arrowlength { arrowlength } + def @UDFirstOrMiddle + left label + named i { 0i } + named au { no } + named ad { no } + right x + { + {/i @VContract { /syntaxgap label:: @LabelMarks x /syntaxgap }} + || @Line from { label"@NMK" } to { xcoord label"@NMK" ysize } + arrow { au } + || @Line from { label"@SMK" } to { xcoord label"@SMK" 0 } + arrow { ad } + } - linklabel { linklabel } - linklabelmargin { linklabelmargin } - linklabelfont { linklabelfont } - linklabelbreak { linklabelbreak } - linklabelformat { linklabelformat @Body } - linklabelpos { linklabelpos } - linklabelprox { linklabelprox } - linklabelangle { linklabelangle } - linklabelctr { linklabelctr } - linklabeladjust { linklabeladjust } + def @RLLast + left label + named i { 0i } + named al { no } + named ar { no } + right x + { + {|i @HContract { |syntaxgap label:: @LabelMarks x |syntaxgap }} + // @HVCurve from { label"@WMK" } to { 0 ycoord "AX@WMK" } + arrow { al } bias { pssyntaxbias } radius { pssyntaxradius } + // @HVCurve from { label"@EMK" } to { xsize ycoord "AX@WMK" } + arrow { ar } bias { pssyntaxbias } radius { pssyntaxradius } + } - xlabel { xlabel } - xlabelmargin { xlabelmargin } - xlabelfont { xlabelfont } - xlabelbreak { xlabelbreak } - xlabelformat { xlabelformat @Body } - xlabelpos { xlabelpos } - xlabelprox { xlabelprox } - xlabelangle { xlabelangle } - xlabelctr { xlabelctr } - xlabeladjust { xlabeladjust } + def @UDLast + left label + named i { 0i } + named au { no } + named ad { no } + right x + { + {/i @VContract { /syntaxgap label:: @LabelMarks x /syntaxgap }} + || @VHCurve from { label"@NMK" } to { xcoord "AX@NMK" ysize } + arrow { au } bias { pssyntaxbias } radius { pssyntaxradius } + || @VHCurve from { label"@SMK" } to { xcoord "AX@SMK" 0 } + arrow { ad } bias { pssyntaxbias } radius { pssyntaxradius } + } - ylabel { ylabel } - ylabelmargin { ylabelmargin } - ylabelfont { ylabelfont } - ylabelbreak { ylabelbreak } - ylabelformat { ylabelformat @Body } - ylabelpos { ylabelpos } - ylabelprox { ylabelprox } - ylabelangle { ylabelangle } - ylabelctr { ylabelctr } - ylabeladjust { ylabeladjust } + def @DirectedSelect + named @First left label right x {} + named @Middle left label right x {} + named @Last left label right x {} + named @Join precedence 90 left x right y {} + { - zlabel { zlabel } - zlabelmargin { zlabelmargin } - zlabelfont { zlabelfont } - zlabelbreak { zlabelbreak } - zlabelformat { zlabelformat @Body } - zlabelpos { zlabelpos } - zlabelprox { zlabelprox } - zlabelangle { zlabelangle } - zlabelctr { zlabelctr } - zlabeladjust { zlabeladjust } + def @LastIsA + { + A + } - fromlabel { fromlabel } - fromlabelmargin { fromlabelmargin } - fromlabelfont { fromlabelfont } - fromlabelbreak { fromlabelbreak } - fromlabelformat { fromlabelformat @Body } - fromlabelpos { fromlabelpos } - fromlabelprox { fromlabelprox } - fromlabelangle { fromlabelangle } - fromlabelctr { fromlabelctr } - fromlabeladjust { fromlabeladjust } + def @LastIsB + { + AX @First A + @Join BX @Last B + } - tolabel { tolabel } - tolabelmargin { tolabelmargin } - tolabelfont { tolabelfont } - tolabelbreak { tolabelbreak } - tolabelformat { tolabelformat @Body } - tolabelpos { tolabelpos } - tolabelprox { tolabelprox } - tolabelangle { tolabelangle } - tolabelctr { tolabelctr } - tolabeladjust { tolabeladjust } - } - } + def @LastIsC + { + AX @First A + @Join BX @Middle B + @Join CX @Last C + } - macro @Line { @Link path { line } } - macro @DoubleLine { @Link path { doubleline } } - macro @Arrow { @Link path { line } arrow { yes } } - macro @DoubleArrow { @Link path {doubleline} arrow { yes } } - macro @Curve { @Link path { curve } } - macro @CurveArrow { @Link path { curve } arrow { yes } } - macro @ACurve { @Link path { acurve } } - macro @ACurveArrow { @Link path { acurve } arrow { yes } } - macro @CCurve { @Link path { ccurve } } - macro @CCurveArrow { @Link path { ccurve } arrow { yes } } + def @LastIsD + { + AX @First A + @Join BX @Middle B + @Join CX @Middle C + @Join DX @Last D + } - macro @Bezier { @Link path { bezier } } - macro @BezierArrow { @Link path { bezier } arrow { yes } } + def @LastIsE + { + AX @First A + @Join BX @Middle B + @Join CX @Middle C + @Join DX @Middle D + @Join EX @Last E + } - macro @HVLine { @Link path { hvline } } - macro @HVArrow { @Link path { hvline } arrow { yes } } - macro @VHLine { @Link path { vhline } } - macro @VHArrow { @Link path { vhline } arrow { yes } } - macro @HVCurve { @Link path { hvcurve } } - macro @HVCurveArrow { @Link path { hvcurve } arrow { yes } } - macro @VHCurve { @Link path { vhcurve } } - macro @VHCurveArrow { @Link path { vhcurve } arrow { yes } } + def @LastIsF + { + AX @First A + @Join BX @Middle B + @Join CX @Middle C + @Join DX @Middle D + @Join EX @Middle E + @Join FX @Last F + } - macro @LVRLine { @Link path { lvrline } } - macro @LVRArrow { @Link path { lvrline } arrow { yes } } - macro @RVLLine { @Link path { rvlline } } - macro @RVLArrow { @Link path { rvlline } arrow { yes } } - macro @LVRCurve { @Link path { lvrcurve } } - macro @LVRCurveArrow { @Link path { lvrcurve } arrow { yes } } - macro @RVLCurve { @Link path { rvlcurve } } - macro @RVLCurveArrow { @Link path { rvlcurve } arrow { yes } } + def @UpToF + { + AX @First A + @Join BX @Middle B + @Join CX @Middle C + @Join DX @Middle D + @Join EX @Middle E + @Join FX @Middle F + } - macro @DWrapLine { @Link path { dwrapline} } - macro @DWrapArrow { @Link path { dwrapline} arrow { yes } } - macro @UWrapLine { @Link path { uwrapline} } - macro @UWrapArrow { @Link path { uwrapline} arrow { yes } } - macro @DWrapCurve { @Link path {dwrapcurve} } - macro @DWrapCurveArrow { @Link path {dwrapcurve} arrow { yes } } - macro @UWrapCurve { @Link path {uwrapcurve} } - macro @UWrapCurveArrow { @Link path {uwrapcurve} arrow { yes } } + def @LastIsG + { + @UpToF + @Join GX @Last G + } - export + def @LastIsH + { + @UpToF + @Join GX @Middle G + @Join HX @Last H + } - @Node @Box @CurveBox @ShadowBox @Square @Diamond - @Polygon @Isosceles @Ellipse @Circle - @LeftSub @ZeroWidthLeftSub @RightSub @ZeroWidthRightSub - @FirstSub @NextSub @StubSub + def @LastIsI + { + @UpToF + @Join GX @Middle G + @Join HX @Middle H + @Join IX @Last I + } - def @Tree - named treehindent - named left { 0.0rt } - named ctr { 0.5rt } - named right { 1.0rt } - { treehindent } - body x - { + def @LastIsJ + { + @UpToF + @Join GX @Middle G + @Join HX @Middle H + @Join IX @Middle I + @Join JX @Last J + } - macro @TNode { @@Node nodetag { T } } - macro @Node { @TNode } - macro @Box { @TNode outline { box } } - macro @CurveBox { @TNode outline { curvebox } } - macro @ShadowBox { @TNode outline { shadowbox } } - macro @Square { @TNode outline { square } } - macro @Diamond { @TNode outline { diamond } } - macro @Polygon { @TNode outline { polygon } } - macro @Isosceles { @TNode outline { isosceles } } - macro @Ellipse { @TNode outline { ellipse } } - macro @Circle { @TNode outline { circle } } + def @LastIsK + { + @UpToF + @Join GX @Middle G + @Join HX @Middle H + @Join IX @Middle I + @Join JX @Middle J + @Join KX @Last K + } - def fixroot - precedence 90 - left root - { - |treehindent root + def @LastIsL + { + @UpToF + @Join GX @Middle G + @Join HX @Middle H + @Join IX @Middle I + @Join JX @Middle J + @Join KX @Middle K + @Join LX @Last L + } + + def @TryA { A @Case { {} @Yield @Skip else @Yield @LastIsA } } + def @TryB { B @Case { {} @Yield @TryA else @Yield @LastIsB } } + def @TryC { C @Case { {} @Yield @TryB else @Yield @LastIsC } } + def @TryD { D @Case { {} @Yield @TryC else @Yield @LastIsD } } + def @TryE { E @Case { {} @Yield @TryD else @Yield @LastIsE } } + def @TryF { F @Case { {} @Yield @TryE else @Yield @LastIsF } } + def @TryG { G @Case { {} @Yield @TryF else @Yield @LastIsG } } + def @TryH { H @Case { {} @Yield @TryG else @Yield @LastIsH } } + def @TryI { I @Case { {} @Yield @TryH else @Yield @LastIsI } } + def @TryJ { J @Case { {} @Yield @TryI else @Yield @LastIsJ } } + def @TryK { K @Case { {} @Yield @TryJ else @Yield @LastIsK } } + def @TryL { L @Case { {} @Yield @TryK else @Yield @LastIsL } } + + @TryL } - macro @LeftSub + def @RightSelect { - @ObjectLink - basefrom { T } - baseto { L@T } - format { { /treevsep {L::y} } |treehsep x | insinuatelink } + @LRLine @DirectedSelect + @First { label @RLFirstOrMiddle x } + @Middle { label @RLFirstOrMiddle ar { yes } x } + @Last { label @RLLast ar { yes } x } + @Join { x //syntaxgap y } } - macro @ZeroWidthLeftSub + def @UpSelect { - @ObjectLink - basefrom { T } - baseto { L@T } - format { { /treevsep @ZeroWidth { {L::y} ^|treehsep } } | - x | insinuatelink } + @UDLine @DirectedSelect + @First { label @UDFirstOrMiddle i { 1r } x } + @Middle { label @UDFirstOrMiddle i { 1r } au { yes } x } + @Last { label @UDLast i { 1r } au { yes } x } + @Join { x ||syntaxgap y } } - macro @FirstSub + def @LeftSelect { - fixroot // - @ObjectLink - basefrom { T } - baseto { S@T } - format { //treevsep {S::y} | insinuatelink | } + @LRLine @DirectedSelect + @First { label @RLFirstOrMiddle i { 1r } x } + @Middle { label @RLFirstOrMiddle i { 1r } al { yes } x } + @Last { label @RLLast i { 1r } al { yes } x } + @Join { x //syntaxgap y } } - macro @NextSub + def @DownSelect { - @ObjectLink - basefrom { T } - baseto { S@T } - format { x |treehsep { / {S::y} | insinuatelink | } } + @UDLine @DirectedSelect + @First { label @UDFirstOrMiddle x } + @Middle { label @UDFirstOrMiddle ad { yes } x } + @Last { label @UDLast ad { yes } x } + @Join { x ||syntaxgap y } } - macro @RightSub - { - @ObjectLink - basefrom { T } - baseto { R@T } - format { x |treehsep { /treevsep {R::y} } | insinuatelink } + @CurrDirection @Case { + @Right @Yield @RightSelect + @Up @Yield @UpSelect + @Left @Yield @LeftSelect + @Down @Yield @DownSelect } + } - macro @ZeroWidthRightSub - { - @ObjectLink - basefrom { T } - baseto { R@T } - format { x | { /treevsep @ZeroWidth { |treehsep {R::y} } } - | insinuatelink } + + def @Optional right x + { + @Select A { @Skip } B { x } + } + + + ####################################################################### + # # + # @OptionalDiverted # + # # + ####################################################################### + + def @DownRightOptionalDiverted right x + { + @UDLine { + OX:: @LabelMarks { + |syntaxgap AX:: @LabelMarks @GoRight x |syntaxbias + /syntaxgap + } + / @Line from { "OX@NW" } to { "OX@SW" } + / @Line from { "OX@WMK" } to { "OX@IN@AX@WMK" } + / @RVLCurveArrow from { "OX@IN@AX@EMK" } to { "OX@SW" } + bias { pssyntaxbias } radius { pssyntaxradius } } + } - macro @StubSub - { - @ObjectLink - basefrom { T } - baseto { T } - format { @VContract { |0.5rt x | // |0.5rt - S:: @BoxLabels @CatchTags y | } | insinuatelink } - # path { from S@T@SW S@T@SE to } - path { - P1:: S@SW - P2:: S@SE - FROM:: from boundaryatangle { from??CTR angleto P1 } - TO:: to boundaryatangle { to??CTR angleto P2 } - FROM P1 P2 TO - } + def @UpRightOptionalDiverted right x + { + @UDLine { + OX:: @LabelMarks { + ^/syntaxgap + |syntaxgap AX:: @LabelMarks @GoRight x |syntaxbias + } + / @Line from { "OX@NW" } to { "OX@SW" } + / @Line from { "OX@WMK" } to { "OX@IN@AX@WMK" } + / @RVLCurveArrow from { "OX@IN@AX@EMK" } to { "OX@NW" } + bias { pssyntaxbias } radius { pssyntaxradius } } + } - @HContract @VContract x + def @RightDownOptionalDiverted right x + { + @LRLine { + OX:: @LabelMarks { + { /syntaxgap AX:: @LabelMarks @GoDown x /syntaxbias } + |syntaxgap + } + / @Line from { "OX@NW" } to { "OX@NE" } + / @Line from { "OX@NMK" } to { "OX@IN@AX@NMK" } + / @VHCurve from {"OX@IN@AX@SMK"} to { "OX@SE"--{pssyntaxgap 0} } + bias { pssyntaxbias } radius { pssyntaxradius } + / @HVCurve from { "OX@SE" -- {pssyntaxgap 0} } to { "OX@NE" } + arrow { yes } bias { pssyntaxbias } radius { pssyntaxradius } + } } - export + def @LeftDownOptionalDiverted right x + { + @LRLine { + OX:: @LabelMarks { + ^|syntaxgap + { /syntaxgap AX:: @LabelMarks @GoDown x /syntaxbias } + } + / @Line from { "OX@NW" } to { "OX@NE" } + / @Line from { "OX@NMK" } to { "OX@IN@AX@NMK" } + / @VHCurve from {"OX@IN@AX@SMK"} to { "OX@SW"++{pssyntaxgap 0} } + bias { pssyntaxbias } radius { pssyntaxradius } + / @HVCurve from { "OX@SW" ++ {pssyntaxgap 0} } to { "OX@NW" } + arrow { yes } bias { pssyntaxbias } radius { pssyntaxradius } + } + } - @Node @Box @CurveBox @ShadowBox @Square @Diamond - @Polygon @Isosceles @Ellipse @Circle - @LeftSub @ZeroWidthLeftSub @RightSub @ZeroWidthRightSub - @FirstSub @NextSub @StubSub + def @OptionalDiverted right x + { + @CurrDirection @Case { + @Right @Yield @RightDownOptionalDiverted x + @Up @Yield @UpRightOptionalDiverted x + @Left @Yield @LeftDownOptionalDiverted x + @Down @Yield @DownRightOptionalDiverted x + } + } - def @HTree - named treevindent - named top { 0.0rt } - named ctr { 0.5rt } - named foot { 1.0rt } - { treevindent } - body x + + ####################################################################### + # # + # @Diverted # + # # + ####################################################################### + + def @DownRightDiverted right x { + @UDLine { + OX:: @LabelMarks { + |syntaxgap AX:: @LabelMarks @GoRight x |syntaxbias + ^/syntaxgap + /syntaxgap + } + / @VHCurve from { "OX@NW" } to { "OX@IN@AX@WMK" } + bias { pssyntaxbias } radius { pssyntaxradius } + / @RVLCurve from { "OX@IN@AX@EMK" } + to { xcoord "OX@IN@AX@WMK" ycoord "OX@EMK" } + bias { pssyntaxbias } radius { pssyntaxradius } + / @HVCurve from { xcoord "OX@IN@AX@WMK" ycoord "OX@EMK" } + to { "OX@SW" } bias { pssyntaxbias } radius {pssyntaxradius} + } + } - macro @TNode { @@Node nodetag { T } } - macro @Node { @TNode } - macro @Box { @TNode outline { box } } - macro @CurveBox { @TNode outline { curvebox } } - macro @ShadowBox { @TNode outline { shadowbox } } - macro @Square { @TNode outline { square } } - macro @Diamond { @TNode outline { diamond } } - macro @Polygon { @TNode outline { polygon } } - macro @Isosceles { @TNode outline { isosceles } } - macro @Ellipse { @TNode outline { ellipse } } - macro @Circle { @TNode outline { circle } } + def @UpRightDiverted right x + { + @UDLine { + OX:: @LabelMarks { + ^/syntaxgap + /syntaxgap + |syntaxgap AX:: @LabelMarks @GoRight x |syntaxbias + } + / @VHCurve from { "OX@SW" } to { "OX@IN@AX@WMK" } + bias { pssyntaxbias } radius { pssyntaxradius } + / @RVLCurve from { "OX@IN@AX@EMK" } + to { xcoord "OX@IN@AX@WMK" ycoord "OX@EMK" } + bias { pssyntaxbias } radius { pssyntaxradius } + / @HVCurve from { xcoord "OX@IN@AX@WMK" ycoord "OX@EMK" } + to { "OX@NW" } bias { pssyntaxbias } radius {pssyntaxradius} + } + } - def fixroot - precedence 90 - left root - { - /treevindent root + def @RightDownDiverted right x + { + @LRLine { + OX:: @LabelMarks { + { /syntaxgap AX:: @LabelMarks @GoDown x /syntaxbias } + ^|syntaxgap + |syntaxgap + } + / @HVCurve from { "OX@NW" } to { "OX@IN@AX@NMK" } + bias { pssyntaxbias } radius { pssyntaxradius } + / @VHCurve from { "OX@IN@AX@SMK" } + to { xcoord "OX@IN@AX@EMK" ycoord "OX@SMK" } + bias { pssyntaxbias } radius { pssyntaxradius } + / @HVCurve from { xcoord "OX@IN@AX@EMK" ycoord "OX@SMK" } + to { "OX@IN@AX@EMK" ++ { pssyntaxgap 0 } } + bias { pssyntaxbias } radius {pssyntaxradius} + / @VHCurve from { "OX@IN@AX@EMK" ++ { pssyntaxgap 0 } } + to { "OX@NE" } bias { pssyntaxbias } radius {pssyntaxradius} } + } - macro @LeftSub - { - @ObjectLink - basefrom { T } - baseto { L@T } - format { { |treehsep {L::y} } /treevsep x / insinuatelink } + def @LeftDownDiverted right x + { + @LRLine { + OX:: @LabelMarks { + |syntaxgap + ^|syntaxgap + { /syntaxgap AX:: @LabelMarks @GoDown x /syntaxbias } + } + / @HVCurve from { "OX@NE" } to { "OX@IN@AX@NMK" } + bias { pssyntaxbias } radius { pssyntaxradius } + / @VHCurve from { "OX@IN@AX@SMK" } + to { xcoord "OX@IN@AX@WMK" ycoord "OX@SMK" } + bias { pssyntaxbias } radius { pssyntaxradius } + / @HVCurve from { xcoord "OX@IN@AX@WMK" ycoord "OX@SMK" } + to { "OX@IN@AX@WMK" -- { pssyntaxgap 0 } } + bias { pssyntaxbias } radius {pssyntaxradius} + / @VHCurve from { "OX@IN@AX@WMK" -- { pssyntaxgap 0 } } + to { "OX@NW" } bias { pssyntaxbias } radius {pssyntaxradius} } + } - macro @ZeroWidthLeftSub - { - @ObjectLink - basefrom { T } - baseto { L@T } - format { { |treehsep @ZeroWidth { {L::y} ^/treevsep } } / - x / insinuatelink } + def @Diverted right x + { + @CurrDirection @Case { + @Right @Yield @RightDownDiverted x + @Up @Yield @UpRightDiverted x + @Left @Yield @LeftDownDiverted x + @Down @Yield @DownRightDiverted x } + } - macro @FirstSub - { - fixroot || - @ObjectLink - basefrom { T } - baseto { S@T } - format { ||treehsep { {S::y} / insinuatelink / } } + + ####################################################################### + # # + # @RepeatDiverted # + # # + ####################################################################### + + def @RepeatDiverted right x + { + # this implementation exploits the coincidental similarity + # of @RepeatDiverted to @OptionalDiverted + + @CurrDirection @Case { + @Right @Yield @LeftDownOptionalDiverted x + @Up @Yield @DownRightOptionalDiverted x + @Left @Yield @RightDownOptionalDiverted x + @Down @Yield @UpRightOptionalDiverted x } + } - macro @NextSub + + + ####################################################################### + # # + # @Loop and @Repeat # + # # + ####################################################################### + + def @Loop + named A {} + named B {} + { + def @LeftOrRightLoop + named al { no } + named ar { no } { - @ObjectLink - basefrom { T } - baseto { S@T } - format { x /treevsep { | {S::y} { / insinuatelink / } } } + @LRLine { + @HContract @VContract { OX:: @LabelMarks { + { |syntaxgap AX:: @LabelMarks A |syntaxgap } + //syntaxgap + { |0.5rt BX:: @LabelMarks @GoReverse B |syntaxgap } + } } + / @Line from { "OX@WMK" } to { "OX@IN@AX@WMK" } + / @Line from { "OX@EMK" } to { "OX@IN@AX@EMK" } + / @HVCurve from { "OX@IN@BX@EMK" } to { "OX@EMK" } + arrow { ar } bias {pssyntaxbias} radius {pssyntaxradius} + / @HVCurve from { "OX@IN@BX@WMK" } to { "OX@WMK" } + arrow { al } bias {pssyntaxbias} radius {pssyntaxradius} + } } - macro @RightSub + def @UpOrDownLoop + named au { no } + named ad { no } { - @ObjectLink - basefrom { T } - baseto { R@T } - format { x /treevsep { |treehsep {R::y} } / insinuatelink } + @UDLine { + @HContract @VContract { OX:: @LabelMarks { + { /syntaxgap AX:: @LabelMarks A /syntaxgap } + ||syntaxgap + { /0.5rt BX:: @LabelMarks @GoReverse B /syntaxgap } + } } + / @Line from { "OX@NMK" } to { "OX@IN@AX@NMK" } + / @Line from { "OX@SMK" } to { "OX@IN@AX@SMK" } + / @VHCurve from { "OX@IN@BX@NMK" } to { "OX@NMK" } + arrow { au } bias {pssyntaxbias} radius {pssyntaxradius} + / @VHCurve from { "OX@IN@BX@SMK" } to { "OX@SMK" } + arrow { ad } bias {pssyntaxbias} radius {pssyntaxradius} + } } - macro @ZeroWidthRightSub + @CurrDirection @Case { + @Right @Yield @LeftOrRightLoop al { yes } + @Up @Yield @UpOrDownLoop ad { yes } + @Left @Yield @LeftOrRightLoop ar { yes } + @Down @Yield @UpOrDownLoop au { yes } + } + } + + def @Repeat right x + { + @Loop + A { x } + B { @Skip } + } + + + ####################################################################### + # # + # @LoopOpposite and @RepeatOpposite # + # # + ####################################################################### + + def @LoopOpposite + named A {} + named B {} + { + def @LeftOrRightLoopOpposite + named al { no } + named ar { no } { - @ObjectLink - basefrom { T } - baseto { R@T } - format { x / { |treehsep @ZeroWidth { /treevsep {R::y} } } - / insinuatelink } + @LRLine { + @HContract @VContract { OX:: @LabelMarks { + { |0.5rt BX:: @LabelMarks @GoReverse B |syntaxgap } + ^//syntaxgap + { |syntaxgap AX:: @LabelMarks A |syntaxgap } + } } + / @Line from { "OX@WMK" } to { "OX@IN@AX@WMK" } + / @Line from { "OX@EMK" } to { "OX@IN@AX@EMK" } + / @HVCurve from { "OX@IN@BX@EMK" } to { "OX@EMK" } + arrow { ar } bias {pssyntaxbias} radius {pssyntaxradius} + / @HVCurve from { "OX@IN@BX@WMK" } to { "OX@WMK" } + arrow { al } bias {pssyntaxbias} radius {pssyntaxradius} + } } - macro @StubSub + def @UpOrDownLoopOpposite + named au { no } + named ad { no } { - @ObjectLink - basefrom { T } - baseto { T } - format { @VContract { { /0.5rt x / } || { /0.5rt - S:: @BoxLabels @CatchTags y / } } / insinuatelink } - # path { from S@T@SW S@T@SE to } - path { - P1:: S@NE - P2:: S@SE - FROM:: from boundaryatangle { from??CTR angleto P1 } - TO:: to boundaryatangle { to??CTR angleto P2 } - FROM P1 P2 TO - } + @UDLine { + @HContract @VContract { OX:: @LabelMarks { + { /0.5rt BX:: @LabelMarks @GoReverse B /syntaxgap } + ^||syntaxgap + { /syntaxgap AX:: @LabelMarks A /syntaxgap } + } } + / @Line from { "OX@NMK" } to { "OX@IN@AX@NMK" } + / @Line from { "OX@SMK" } to { "OX@IN@AX@SMK" } + / @VHCurve from { "OX@IN@BX@NMK" } to { "OX@NMK" } + arrow { au } bias {pssyntaxbias} radius {pssyntaxradius} + / @VHCurve from { "OX@IN@BX@SMK" } to { "OX@SMK" } + arrow { ad } bias {pssyntaxbias} radius {pssyntaxradius} + } } - @HContract @VContract x + @CurrDirection @Case { + @Right @Yield @LeftOrRightLoopOpposite al { yes } + @Up @Yield @UpOrDownLoopOpposite ad { yes } + @Left @Yield @LeftOrRightLoopOpposite ar { yes } + @Down @Yield @UpOrDownLoopOpposite au { yes } + } } - @BackEnd @Case { - PostScript @Yield { - { - save @Case { { yes Yes } @Yield "grestore save gsave" else @Yield {} } - maxlabels "ldiagbegin" - // - "ldiagend" - save @Case { { yes Yes } @Yield "restore" else @Yield {} } - } @Graphic @Body - } - PDF @Yield {} + def @RepeatOpposite right x + { + @LoopOpposite + A { x } + B { @Skip } + } + + + ####################################################################### + # # + # Value of whole diagram # + # # + ####################################################################### + + def @DiagValue right x + { + @BackEnd @Case { + PostScript @Yield { + { + save @Case { + { yes Yes } @Yield "grestore save gsave" + else @Yield {} + } + maxlabels "ldiagbegin" + // + "ldiagend" + save @Case { + { yes Yes } @Yield "restore" + else @Yield {} + } + } @Graphic x } + + PDF @Yield {} + } + } + + title @Case { + + "--titledft--" @Yield @DiagValue @Body + + else @Yield { title titleformat @DiagValue @Body } } @End @Diag + + + macro @SyntaxDiag { + @Diag + avalign { mark } + avstrut { yes } + amargin { 0.2f } + aoutline { box } + afont { Italic } + + bvalign { mark } + bvstrut { yes } + bmargin { 0.2f } + boutline { curvebox } + bfont { Bold } + + cvalign { mark } + cvstrut { yes } + cmargin { 0.2f } + coutline { circle } + chsize { 1f } + + arrowlength { 0.4f } + } } diff --git a/include/doc b/include/doc index 7dda601..cf483ef 100644 --- a/include/doc +++ b/include/doc @@ -103,9 +103,12 @@ # @TableNumbers { Arabic } # method of numbering tables # @FigureCaptionPos { Below } # Above or Below # @TableCaptionPos { Below } # Above or Below - # @CaptionFont { } # figure, table caption font - # @CaptionBreak { } # figure, table caption break - # @CaptionFormat { @B { number @DotSep @OneCol } } # figure, table caption format + # @FigureCaptionFont { -2p } # figure caption font + # @FigureCaptionBreak { adjust hyphen 1.2fx } # figure caption break + # @FigureCaptionFormat{ {@B { word @NumSep number. &2s }} @Insert caption } + # @TableCaptionFont { -2p } # table caption font + # @TableCaptionBreak { adjust hyphen 1.2fx } # table caption break + # @TableCaptionFormat { {@B { word @NumSep number. &2s }} @Insert caption } # @MakeFigureContents { No } # list of figures at start # @MakeTableContents { No } # list of tables at start # @MakeContents { No } # make contents? Yes or No diff --git a/include/dsf b/include/dsf index 082c59d..fda93f9 100644 --- a/include/dsf +++ b/include/dsf @@ -96,14 +96,14 @@ def @DocumentSetup named @TableNumbers { Arabic } # method of numbering tables named @FigureCaptionPos { Below } # Above or Below named @TableCaptionPos { Below } # Above or Below - named @FigureCaptionFont { } # figure caption font - named @FigureCaptionBreak { } # figure caption break + named @FigureCaptionFont { -2p } # figure caption font + named @FigureCaptionBreak { adjust hyphen 1.2fx } # figure caption break named @FigureCaptionFormat named word {} named number {} named caption {} - { @B { word @NumSep number. &2s } @Insert caption } - named @TableCaptionFont { } # figure caption font - named @TableCaptionBreak { } # figure caption break + { {@B { word @NumSep number. &2s }} @Insert caption } + named @TableCaptionFont { -2p } # figure caption font + named @TableCaptionBreak { adjust hyphen 1.2fx } # figure caption break named @TableCaptionFormat named word {} named number {} named caption {} - { @B { word @NumSep number. &2s } @Insert caption } + { {@B { word @NumSep number. &2s }} @Insert caption } named @MakeFigureContents { No } # list of figures at start named @MakeTableContents { No } # list of tables at start named @MakeContents { No } # make contents? Yes or No @@ -3425,7 +3425,7 @@ def @DocumentSetup def @NoCite body cite { macro "$" { @NoRef } - def "," precedence 90 left x { x } + def "," precedence 90 left x { x"," } def ";" precedence 90 left x { x";" } @MakeReferences @Case { diff --git a/include/eiffel b/include/eiffel new file mode 100644 index 0000000..a55d5f7 --- /dev/null +++ b/include/eiffel @@ -0,0 +1,71 @@ +############################################################################### +# # +# Lout setup file for Eiffel program printing # +# # +# Jeffrey H. Kingston # +# 23 February 2000 # +# # +############################################################################### + + +############################################################################### +# # +# The @SysInclude { eiffelf } line # +# # +# This line causes Lout to read the definitions for Eiffel, and should # +# not be touched. # +# # +############################################################################### + +@SysInclude { eiffelf } + + +############################################################################### +# # +# The @EiffelSetup @Use clause # +# # +# To change the default value of any option, delete the # at the start of # +# its line and change the value between braces. # +# # +############################################################################### + +@Use { @EiffelSetup + # style { varying @OrIfPlain fixed } # fixed, varying, or symbol + # pipe { } # pipe source through this + + # fixedfont { Courier } # font family if fixed + # fixedstrings { Base } # string face if fixed + # fixedidentifiers { Base } # identifier face if fixed + # fixedcomments { Base } # comment face if fixed + # fixedkeywords { Base } # keyword face if fixed + # fixednumbers { Base } # number face if fixed + # fixedoperators { Base } # operator face if fixed + # fixedsize { -1.0p } # font size if fixed + # fixedline { 1.0vx } # line-space if fixed + # fixedtabin { 8 } # tab interval if fixed + # fixedtabout { 8s } # tab width if fixed + + # varyingfont { } # font family if varying + # varyingstrings { Slope } # string face if varying + # varyingidentifiers { Slope } # identifier face if varying + # varyingcomments { Base } # comment face if varying + # varyingkeywords { Bold } # keyword face if varying + # varyingnumbers { Base } # number face if varying + # varyingoperators { Base } # operator face if varying + # varyingsize { 1.0f } # font size if varying + # varyingline { 1.0vx } # line-space if varying + # varyingtabin { 8 } # tab interval if varying + # varyingtabout { 3f } # tab width if varying + + # symbolfont { } # font family if symbol + # symbolstrings { Slope } # string face if symbol + # symbolidentifiers { Slope } # identifier face if symbol + # symbolcomments { Base } # comment face if symbol + # symbolkeywords { Bold } # keyword face if symbol + # symbolnumbers { Base } # number face if symbol + # symboloperators { Base } # operator face if symbol + # symbolsize { 1.0f } # font size if symbol + # symbolline { 1.0vx } # line-space if symbol + # symboltabin { 8 } # tab interval if symbol + # symboltabout { 3f } # tab width if symbol +} diff --git a/include/eiffelf b/include/eiffelf new file mode 100644 index 0000000..5ba94e1 --- /dev/null +++ b/include/eiffelf @@ -0,0 +1,274 @@ + +############################################################################### +# # +# Lout @EiffelSetup package for formatting Eiffel programs # +# # +# Version 2.0 by Jeffrey H. Kingston, February 2000. # +# # +# This package uses a filtered body parameter to convert Eiffel source # +# code into Lout source. The filter program is prg2lout, which is # +# distributed with Lout and should be compiled and installed wherever # +# Lout itself is. # +# # +############################################################################### + +export @Eiffel +def @EiffelSetup + named style + named @OrIfPlain left x right y + { @BackEnd @Case { PlainText @Yield y else @Yield x } } + { varying @OrIfPlain fixed } # print style + named pipe { } # pipe through this first + + named fixedfont { Courier } # font family if fixed + named fixedstrings { Base } # string face if fixed + named fixedidentifiers { Base } # identifier face if fixed + named fixedcomments { Base } # comment face if fixed + named fixedkeywords { Base } # keyword face if fixed + named fixednumbers { Base } # number face if fixed + named fixedoperators { Base } # operator face if fixed + named fixedsize { -1.0p } # font size if fixed + named fixedline { 1.0vx } # line-space if fixed + named fixedtabin { 8 } # tab interval if fixed + named fixedtabout { 8s } # tab width if fixed + + named varyingfont { } # font family if varying + named varyingstrings { Slope } # string face if varying + named varyingidentifiers { Slope } # identifier face if varying + named varyingcomments { Base } # comment face if varying + named varyingkeywords { Bold } # keyword face if varying + named varyingnumbers { Base } # number face if varying + named varyingoperators { Base } # operator face if varying + named varyingsize { 1.0f } # font size if varying + named varyingline { 1.0vx } # line-space if varying + named varyingtabin { 8 } # tab interval if varying + named varyingtabout { 3f } # tab width if varying + + named symbolfont { } # font family if symbol + named symbolstrings { Slope } # string face if symbol + named symbolidentifiers { Slope } # identifier face if symbol + named symbolcomments { Base } # comment face if symbol + named symbolkeywords { Bold } # keyword face if symbol + named symbolnumbers { Base } # number face if symbol + named symboloperators { Base } # operator face if symbol + named symbolsize { 1.0f } # font size if symbol + named symbolline { 1.0vx } # line-space if symbol + named symboltabin { 8 } # tab interval if symbol + named symboltabout { 3f } # tab width if symbol + +@Begin + + export + + "$>" @S @D @C @K @N @O @A @ST @ED @M + + def @Eiffel + named style { style } # style + named pipe { pipe } # pipe through this first + named font { dft } # font family + named strings { dft } # string font + named identifiers { dft } # ident. font + named comments { dft } # comment font + named keywords { dft } # keyword font + named numbers { dft } # number font + named operators { dft } # operator font + named size { dft } # font size + named line { dft } # line-space + named tabin { dft } # tab interval + named tabout { dft } # tab width + body @Body # filtered, see below + @Begin + + def @Test # returns x unless x is dft + left x + named iffixed {} + named ifvarying {} + named ifsymbol {} + { + x @Case { + dft @Yield { + style @Case { + fixed @Yield { iffixed } + varying @Yield { ifvarying } + symbol @Yield { ifsymbol } + } + } + else @Yield x + } + } + + def @InitTab + { + tabin @Test + iffixed { fixedtabin } + ifvarying { varyingtabin } + ifsymbol { symboltabin } + } + + def @InitTabWidth + { + tabout @Test + iffixed { fixedtabout } + ifvarying { varyingtabout } + ifsymbol { symboltabout } + } + + def @Filter + { + pipe @Case { + "" @Yield { + "prg2lout -r -lEiffel" -i{@FilterIn} -o{@FilterOut} -e{@FilterErr} + -t{@InitTab} -T{@InitTabWidth} + } + else @Yield { + "cat" @FilterIn "|" pipe "|" + "prg2lout -r -lEiffel" -o{@FilterOut} + -e{@FilterErr} -t{@InitTab} -T{@InitTabWidth} + } + } + } + + def @InitFontFamily + { + font @Test + iffixed { fixedfont } + ifvarying { varyingfont } + ifsymbol { symbolfont } + } + + def @InitSize + { + size @Test + iffixed { fixedsize } + ifvarying { varyingsize } + ifsymbol { symbolsize } + } + + def @InitLine + { + line @Test + iffixed { fixedline } + ifvarying { varyingline } + ifsymbol { symbolline } + } + + def @S # for formatting strings + right x + { + # "\"" & + strings @Test + iffixed { fixedstrings } + ifvarying { varyingstrings } + ifsymbol { symbolstrings } + @Font x + # & "\"" + } + +# def "`" +# { +# style @Case { +# symbol @Yield { "`" } +# else @Yield { "'" } +# } +# } + + def @D # for formatting identifiers + right x + { + identifiers @Test + iffixed { fixedidentifiers } + ifvarying { varyingidentifiers } + ifsymbol { symbolidentifiers } + @Font x + } + + def @C # for formatting comments + right x + { + comments @Test + iffixed { fixedcomments } + ifvarying { varyingcomments } + ifsymbol { symbolcomments } + @Font x + } + + def @K # for formatting keywords + right x + { + keywords @Test + iffixed { fixedkeywords } + ifvarying { varyingkeywords } + ifsymbol { symbolkeywords } + @Font x + } + + def @N # for formatting numbers + right x + { + numbers @Test + iffixed { fixednumbers } + ifvarying { varyingnumbers } + ifsymbol { symbolnumbers } + @Font x + } + + def @O # for formatting operators + right x + { + operators @Test + iffixed { fixedoperators } + ifvarying { varyingoperators } + ifsymbol { symboloperators } + @Font x + } + + def @A # get characters from the Adobe Symbol font + left sym + right x + { + style @Case { + symbol @Yield { { Symbol Base } @Font @Char sym } + else @Yield { x } + } + } + + def @ST # for formatting asterisks + right x + { + operators @Test + iffixed { fixedoperators } + ifvarying { varyingoperators } + ifsymbol { symboloperators } + @Font "0.5w" @VShift x + } + + def @ED # for formatting larger dots + right x + { + operators @Test + iffixed { fixedoperators } + ifvarying { varyingoperators } + ifsymbol { symboloperators } + @Font @BackEnd @Case { + PlainText @Yield x + else @Yield { "1.2f" @Font "+0.05f" @VShift @O x &"0.05f" } + } + } + + macro "$>" { {} & } + + def @M right x + { + style @Case { + fixed @Yield "-" + varying @Yield { { Symbol Base } @Font @Char minus } + symbol @Yield { { Symbol Base } @Font @Char minus } + } + } + + { @InitFontFamily Base @InitSize } @Font + { @InitLine lines } @Break @Body + + @End @Eiffel + +@End @EiffelSetup diff --git a/include/eqf b/include/eqf index 4437edf..e03bb3e 100644 --- a/include/eqf +++ b/include/eqf @@ -22,7 +22,7 @@ # # ############################################################################### -export "`" "``" "```" bin rel punct non vctr big +export "`" "``" "```" bin rel punct non vctr big small space exclam universal numbersign existential percent ampersand suchthat parenleft parenright asteriskmath @@ -56,7 +56,8 @@ export "`" "``" "```" bin rel punct non vctr big bracerightbt hbar Re Im partial infty prime nabla surd top bot dbar - triangle backslash forall exists neg circle square + triangle backslash forall exists neg + circle filledcircle square "0" "1" "2" "3" "4" "5" "6" "7" "8" "9" @@ -64,14 +65,14 @@ export "`" "``" "```" bin rel punct non vctr big boplus buplus "+" "-" "+-" "-+" setminus cdot times "*" circ div cap cup uplus - sqcap sqcup triangleleft triangleright wr bigcirc bigtriangleup - bigtriangledown vee wedge oplus ominus otimes oslash odot dagger - daggerdbl amalg + sqcap sqcup triangleleft triangleright + wr bigcirc bigtriangleup bigtriangledown vee wedge oplus ominus + otimes oslash odot dagger daggerdbl amalg "<" ">" "=" "<=" prec preceq "<<" subset subseteq sqsubseteq in vdash smile frown ">=" succ succeq ">>" supset supseteq sqsupseteq ni dashv mid parallel "==" "~" "-~" asymp "~~" - "=~" bowtie propto models doteq perp notsub notin "!=" not + "=~" bowtie propto models doteq trieq perp notsub notin "!=" not "<->" "<--" "-->" up down "<=>" "<==" "==>" dblup dbldown ":" "::" ":=" @@ -98,7 +99,7 @@ export "`" "``" "```" bin rel punct non vctr big nearrow searrow swarrow nwarrow sup sub tsub supp on ton frac half third over from to widefrom wideto - dot dotdot hat tilde vec dyad overbar underbar sqrt root + dot dotdot hat tilde vec dyad overbar underbar sqrt root zroot nextcol above labove cabove rabove mabove matrix pmatrix bmatrix brmatrix fmatrix cmatrix amatrix @@ -164,6 +165,7 @@ def @Eq def punct right x { x ` } def non right x { 0c @YUnit x } def big right x { 1.3f @Font @SpaceGap @Space x } + def small right x { 0.6f @Font @SpaceGap @Space x } def @Base right x { Base @Font x } def @Sym right x { {Symbol Base} @Font x } @@ -460,93 +462,129 @@ def @Eq def exists { existential } def neg { logicalnot } - def circle { @HContract @VContract - @BackEnd @Case { - PostScript @Yield { - { "xsize ysize 2 div moveto" - "xsize 2 div ysize 2 div xsize 2 div 0 360 arc" - "0.04 ft setlinewidth stroke" - } - @Graphic { 0.7f @Wide 0.3f @High ^/ 0.3f @High } - } - PDF @Yield { -# -# VT: draws a counterclockwise 360 degree arc from 0 to +360 degree positions -# (straight right to straight right) with centre = (xsize/2, ysize/2) -# and radius = xsize/2 -# -# implemented as two counterclockwise 180 degree arcs: -# - { - "__mul(0.04, __loutf) w" -# -# start at (xsize, ysize/2) -# the control points are: -# pt1 = (xsize, ysize/2 + (4/3 * xsize/2)) and pt2 = (0, ysize/2 + (4/3 * xsize/2)) -# end at (0, ysize/2) -# - "__xsize __div(__ysize, 2) m" - "__xsize __add(__div(__ysize, 2), __div(__mul(2, __xsize), 3))" # pt1 - "0 __add(__div(__ysize, 2), __div(__mul(2, __xsize), 3))" # pt2 - "0 __div(__ysize, 2) c" # pt3 -# -# start at (0, ysize/2) -# the control points are: -# pt1 = (0, ysize/2 - (4/3 * xsize/2)) and pt2 = (xsize, ysize/2 - (4/3 * xsize/2)) -# end at (xsize, ysize/2) -# - "0 __sub(__div(__ysize, 2), __div(__mul(2, __xsize), 3))" # pt1 - "__xsize __sub(__div(__ysize, 2), __div(__mul(2, __xsize), 3))" # pt2 - "__xsize __div(__ysize, 2) c S" # pt3 - } - @Graphic { 0.7f @Wide 0.3f @High ^/ 0.3f @High } - } - } - } + def circle + { @HContract @VContract @BackEnd @Case { + PostScript @Yield { + { + "xsize ysize 2 div moveto" + "xsize 2 div ysize 2 div xsize 2 div 0 360 arc" + "0.04 ft setlinewidth stroke" + } @Graphic { 0.7f @Wide 0.3f @High ^/ 0.3f @High } + } + PDF @Yield { + # + # VT: draws a counterclockwise 360 degree arc from 0 to +360 + # degree positions (straight right to straight right) with + # centre = (xsize/2, ysize/2) and radius = xsize/2, + # implemented as two counterclockwise 180 degree arcs. + # start at (xsize, ysize/2); the control points are: + # + # pt1 = (xsize, ysize/2 + (4/3 * xsize/2)) + # pt2 = (0, ysize/2 + (4/3 * xsize/2)) + # + # end at (0, ysize/2). Then start at (0, ysize/2); control points + # + # pt1 = (0, ysize/2 - (4/3 * xsize/2)) + # pt2 = (xsize, ysize/2 - (4/3 * xsize/2)) + # + # and end at (xsize, ysize/2). + + { + "__mul(0.04, __loutf) w" + "__xsize __div(__ysize, 2) m" + "__xsize __add(__div(__ysize, 2), __div(__mul(2, __xsize), 3))" + "0 __add(__div(__ysize, 2), __div(__mul(2, __xsize), 3))" + "0 __div(__ysize, 2) c" + "0 __sub(__div(__ysize, 2), __div(__mul(2, __xsize), 3))" + "__xsize __sub(__div(__ysize, 2), __div(__mul(2, __xsize), 3))" + "__xsize __div(__ysize, 2) c S" + } @Graphic { 0.7f @Wide 0.3f @High ^/ 0.3f @High } + } + } + } - def square { @HContract @VContract - @BackEnd @Case { - PostScript @Yield { - { "0 0 moveto xsize 0 lineto xsize ysize lineto" - "0 ysize lineto closepath" - "0.04 ft setlinewidth stroke" - } - @Graphic { 0.6f @Wide 0.3f @High ^/ 0.3f @High } - } - PDF @Yield { - { "__mul(__loutf, 0.04) w" - "0 0 m __xsize 0 l __xsize __ysize l" - "0 __ysize l s" - } - @Graphic { 0.6f @Wide 0.3f @High ^/ 0.3f @High } - } - } - } + def filledcircle + { @HContract @VContract @BackEnd @Case { + PostScript @Yield { + { + "xsize ysize 2 div moveto" + "xsize 2 div ysize 2 div xsize 2 div 0 360 arc" + "0.04 ft setlinewidth fill" + } @Graphic { 0.7f @Wide 0.3f @High ^/ 0.3f @High } + } + PDF @Yield { + # + # JK: I don't know how to fill in PDF, so this doesn't! + # + # VT: draws a counterclockwise 360 degree arc from 0 to +360 + # degree positions (straight right to straight right) with + # centre = (xsize/2, ysize/2) and radius = xsize/2, + # implemented as two counterclockwise 180 degree arcs. + # start at (xsize, ysize/2); the control points are: + # + # pt1 = (xsize, ysize/2 + (4/3 * xsize/2)) + # pt2 = (0, ysize/2 + (4/3 * xsize/2)) + # + # end at (0, ysize/2). Then start at (0, ysize/2); control points + # + # pt1 = (0, ysize/2 - (4/3 * xsize/2)) + # pt2 = (xsize, ysize/2 - (4/3 * xsize/2)) + # + # and end at (xsize, ysize/2). + + { + "__mul(0.04, __loutf) w" + "__xsize __div(__ysize, 2) m" + "__xsize __add(__div(__ysize, 2), __div(__mul(2, __xsize), 3))" + "0 __add(__div(__ysize, 2), __div(__mul(2, __xsize), 3))" + "0 __div(__ysize, 2) c" + "0 __sub(__div(__ysize, 2), __div(__mul(2, __xsize), 3))" + "__xsize __sub(__div(__ysize, 2), __div(__mul(2, __xsize), 3))" + "__xsize __div(__ysize, 2) c S" + } @Graphic { 0.7f @Wide 0.3f @High ^/ 0.3f @High } + } + } + } - def triangle { @HContract @VContract - @BackEnd @Case { - PostScript @Yield { - { "0 0 moveto xsize 0 lineto" - "xsize 2 div ysize lineto closepath" - "0.04 ft setlinewidth stroke" - } - @Graphic - { 0.3f @Wide 0.3f @High ^| ^/ - 0.3f @Wide 0.3f @High - } - } - PDF @Yield { - { "__mul(__loutf, 0.04) w" - "0 0 m __xsize 0 l" - "__div(__xsize, 2) __ysize l s" - } - @Graphic - { 0.3f @Wide 0.3f @High ^| ^/ - 0.3f @Wide 0.3f @High - } - } - } - } + def square + { @HContract @VContract @BackEnd @Case { + PostScript @Yield { + { + "0 0 moveto xsize 0 lineto xsize ysize lineto" + "0 ysize lineto closepath" + "0.04 ft setlinewidth stroke" + } @Graphic { 0.6f @Wide 0.3f @High ^/ 0.3f @High } + } + PDF @Yield { + { + "__mul(__loutf, 0.04) w" + "0 0 m __xsize 0 l __xsize __ysize l" + "0 __ysize l s" + } @Graphic { 0.6f @Wide 0.3f @High ^/ 0.3f @High } + } + } + } + + def triangle + { @HContract @VContract @BackEnd @Case { + PostScript @Yield { + { + "0 0 moveto xsize 0 lineto" + "xsize 2 div ysize lineto closepath" + "0.04 ft setlinewidth stroke" + } @Graphic { 0.3f @Wide 0.3f @High ^| ^/ 0.3f @Wide 0.3f @High } + } + PDF @Yield { + { + "__mul(__loutf, 0.04) w" + "0 0 m __xsize 0 l" + "__div(__xsize, 2) __ysize l s" + } @Graphic { 0.3f @Wide 0.3f @High ^| ^/ 0.3f @Wide 0.3f @High } + } + } + } + + def triangledown { 180d @Rotate triangle } ################################################################### # # @@ -774,6 +812,7 @@ def @Eq def bowtie { rel{non triangleright non triangleleft}} def propto { rel proportional } def models { rel{@Base vctr "|" &0.05fo vctr equal}} + def trieq { rel @OneRow @HContract {&0.5rt small triangle^/0.15f equal}} def doteq { rel @OneRow @HContract {&0.5rt dotmath^/0.15f equal}} def perp { rel perpendicular } @@ -1446,6 +1485,16 @@ def @Eq "" sup x &0io sqrt y } + def zroot + precedence 56 + left x + right y + { + def zsup right x { "+0.3f" @VShift 0.5f @Font @Space x } + + "-0.4f" @HShift { 1w @HShift { zsup x } } &0co sqrt y + } + def above precedence 52 left x diff --git a/include/langdefs b/include/langdefs index ec3ac3a..d23f4fd 100644 --- a/include/langdefs +++ b/include/langdefs @@ -10,6 +10,7 @@ langdef Hungarian Magyar { - . : ! ? .) ?) !) .' !' ?' } langdef Italian Italiano { italian . : ! ? .) ?) !) .' !' ?' } langdef Norwegian Norsk { norweg . : ! ? .) ?) !) .' !' ?' } langdef Polish Polski { polish . : ! ? .) ?) !) .' !' ?' } +langdef Portuguese "Português" { portugal . : ! ? .) ?) !) .' !' ?' } langdef Russian "\362\325\323\323\313\311\312" { russian . : ! ? .) ?) !) .' !' ?' } langdef Slovenian Slovenia Slovenija { slovenia . : ! ? .) ?) !) .' !' ?' } langdef Spanish "Espa\361ol" { spanish . : ! ? .) ?) !) .' !' ?' } diff --git a/include/picture b/include/picture index 55d2f3e..42c5c3f 100644 --- a/include/picture +++ b/include/picture @@ -102,9 +102,12 @@ # @TableNumbers { Arabic } # method of numbering tables # @FigureCaptionPos { Below } # Above or Below # @TableCaptionPos { Below } # Above or Below - # @CaptionFont { } # figure, table caption font - # @CaptionBreak { } # figure, table caption break - # @CaptionFormat { @B { number @DotSep @OneCol } } # figure, table caption format + # @FigureCaptionFont { -2p } # figure caption font + # @FigureCaptionBreak { adjust hyphen 1.2fx } # figure caption break + # @FigureCaptionFormat{ {@B { word @NumSep number. &2s }} @Insert caption } + # @TableCaptionFont { -2p } # table caption font + # @TableCaptionBreak { adjust hyphen 1.2fx } # table caption break + # @TableCaptionFormat { {@B { word @NumSep number. &2s }} @Insert caption } # @MakeFigureContents { No } # list of figures at start # @MakeTableContents { No } # list of tables at start # @MakeContents { No } # make contents? Yes or No diff --git a/include/progf b/include/progf new file mode 100644 index 0000000..5ca3f81 --- /dev/null +++ b/include/progf @@ -0,0 +1,259 @@ + +############################################################################### +# # +# Lout @ProgSetup package for formatting computer programs (Version 1.4) # +# # +# Version 1.0 by Jeffrey H. Kingston, February 2000. # +# Adapted from the original @CPrint package. # +# # +# This package uses a filtered body parameter to convert program source # +# code into Lout source. The filter program is prog2lout, which is # +# distributed with Lout and should be compiled and installed wherever # +# Lout itself is. # +# # +# This package is intended for use by prog2lout's stand-alone mode. # +# If you are adding a new language, a better place to start would be # +# files eiffelf and eiffel rather than progf. # +# # +############################################################################### + +export @Prog +def @ProgSetup + named language { "missing_language" } # programming language + named style + named @OrIfPlain left x right y + { @BackEnd @Case { PlainText @Yield y else @Yield x } } + { varying @OrIfPlain fixed } # print style + named pipe { } # pipe through this first + + named fixedfont { Courier } # font family if fixed + named fixedstrings { Base } # string face if fixed + named fixedidentifiers { Base } # identifier face if fixed + named fixedcomments { Base } # comment face if fixed + named fixedkeywords { Base } # keyword face if fixed + named fixednumbers { Base } # number face if fixed + named fixedoperators { Base } # operator face if fixed + named fixedsize { -1.0p } # font size if fixed + named fixedline { 1.0vx } # line-space if fixed + named fixedtabin { 8 } # tab interval if fixed + named fixedtabout { 8s } # tab width if fixed + + named varyingfont { } # font family if varying + named varyingstrings { Slope } # string face if varying + named varyingidentifiers { Slope } # identifier face if varying + named varyingcomments { Base } # comment face if varying + named varyingkeywords { Bold } # keyword face if varying + named varyingnumbers { Base } # number face if varying + named varyingoperators { Base } # operator face if varying + named varyingsize { 1.0f } # font size if varying + named varyingline { 1.0vx } # line-space if varying + named varyingtabin { 8 } # tab interval if varying + named varyingtabout { 3f } # tab width if varying + + named symbolfont { } # font family if symbol + named symbolstrings { Slope } # string face if symbol + named symbolidentifiers { Slope } # identifier face if symbol + named symbolcomments { Base } # comment face if symbol + named symbolkeywords { Bold } # keyword face if symbol + named symbolnumbers { Base } # number face if symbol + named symboloperators { Base } # operator face if symbol + named symbolsize { 1.0f } # font size if symbol + named symbolline { 1.0vx } # line-space if symbol + named symboltabin { 8 } # tab interval if symbol + named symboltabout { 3f } # tab width if symbol + +@Begin + + export + + "$>" @S @D @C @K @N @O @A @M + + def @Prog + named language { language } # language + named style { style } # style + named pipe { pipe } # pipe through this first + named font { dft } # font family + named strings { dft } # string font + named identifiers { dft } # ident. font + named comments { dft } # comment font + named keywords { dft } # keyword font + named numbers { dft } # number font + named operators { dft } # operator font + named size { dft } # font size + named line { dft } # line-space + named tabin { dft } # tab interval + named tabout { dft } # tab width + body @Body # filtered, see below + @Begin + + def @Test # returns x unless x is dft + left x + named iffixed {} + named ifvarying {} + named ifsymbol {} + { + x @Case { + dft @Yield { + style @Case { + fixed @Yield { iffixed } + varying @Yield { ifvarying } + symbol @Yield { ifsymbol } + } + } + else @Yield x + } + } + + def @InitTab + { + tabin @Test + iffixed { fixedtabin } + ifvarying { varyingtabin } + ifsymbol { symboltabin } + } + + def @InitTabWidth + { + tabout @Test + iffixed { fixedtabout } + ifvarying { varyingtabout } + ifsymbol { symboltabout } + } + + def @Filter + { + pipe @Case { + "" @Yield { + "prog2lout -r -l" language -i{@FilterIn} -o{@FilterOut} -e{@FilterErr} + -t{@InitTab} -T{@InitTabWidth} + } + else @Yield { + "cat" @FilterIn "|" pipe "|" + "prog2lout -r -l" language -o{@FilterOut} + -e{@FilterErr} -t{@InitTab} -T{@InitTabWidth} + } + } + } + + def @InitFontFamily + { + font @Test + iffixed { fixedfont } + ifvarying { varyingfont } + ifsymbol { symbolfont } + } + + def @InitSize + { + size @Test + iffixed { fixedsize } + ifvarying { varyingsize } + ifsymbol { symbolsize } + } + + def @InitLine + { + line @Test + iffixed { fixedline } + ifvarying { varyingline } + ifsymbol { symbolline } + } + + def @S # for formatting strings + right x + { + # "\"" & + strings @Test + iffixed { fixedstrings } + ifvarying { varyingstrings } + ifsymbol { symbolstrings } + @Font x + # & "\"" + } + +# def "`" +# { +# style @Case { +# symbol @Yield { "`" } +# else @Yield { "'" } +# } +# } + + def @D # for formatting identifiers + right x + { + identifiers @Test + iffixed { fixedidentifiers } + ifvarying { varyingidentifiers } + ifsymbol { symbolidentifiers } + @Font x + } + + def @C # for formatting comments + right x + { + comments @Test + iffixed { fixedcomments } + ifvarying { varyingcomments } + ifsymbol { symbolcomments } + @Font x + } + + def @K # for formatting keywords + right x + { + keywords @Test + iffixed { fixedkeywords } + ifvarying { varyingkeywords } + ifsymbol { symbolkeywords } + @Font x + } + + def @N # for formatting numbers + right x + { + numbers @Test + iffixed { fixednumbers } + ifvarying { varyingnumbers } + ifsymbol { symbolnumbers } + @Font x + } + + def @O # for formatting operators + named symb {} + right x + { + operators @Test + iffixed { fixedoperators } + ifvarying { varyingoperators } + ifsymbol { symboloperators } + @Font x + } + + def @A # get characters from the Adobe Symbol font + left sym + right x + { + style @Case { + symbol @Yield { { Symbol Base } @Font @Char sym } + else @Yield { x } + } + } + + macro "$>" { {} & } + + def @M right x + { + style @Case { + fixed @Yield "-" + varying @Yield { { Symbol Base } @Font @Char minus } + symbol @Yield { { Symbol Base } @Font @Char minus } + } + } + + { @InitFontFamily Base @InitSize } @Font + { @InitLine lines } @Break @Body + + @End @Prog + +@End @ProgSetup diff --git a/include/report b/include/report index 01fdcc6..4905980 100644 --- a/include/report +++ b/include/report @@ -107,9 +107,12 @@ # @TableNumbers { Arabic } # method of numbering tables # @FigureCaptionPos { Below } # Above or Below # @TableCaptionPos { Below } # Above or Below - # @CaptionFont { } # figure, table caption font - # @CaptionBreak { } # figure, table caption break - # @CaptionFormat { @B { number @DotSep @OneCol } } # figure, table caption format + # @FigureCaptionFont { -2p } # figure caption font + # @FigureCaptionBreak { adjust hyphen 1.2fx } # figure caption break + # @FigureCaptionFormat{ {@B { word @NumSep number. &2s }} @Insert caption } + # @TableCaptionFont { -2p } # table caption font + # @TableCaptionBreak { adjust hyphen 1.2fx } # table caption break + # @TableCaptionFormat { {@B { word @NumSep number. &2s }} @Insert caption } # @MakeFigureContents { No } # list of figures at start # @MakeTableContents { No } # list of tables at start # @MakeContents { No } # make contents? Yes or No @@ -248,9 +251,10 @@ @Use { @ReportSetup # @CoverSheet { Yes } # make cover sheet - # @DisplayAbstract { No } # abstract full width display # @ContentsSeparate { No } # contents on separate pages # @DateLine { No } # Yes, No, or a date + # @AbstractDisplay { No } # abstract full width display + # @AbstractTitle { dft } # abstract title (dft is @AbstractWord) # @ReferencesBeforeAppendices { No } # references before appendices # @AbstractWord { abstract } # word for "Abstract" # @ContentsWord { contents } # word for "Contents" diff --git a/include/reportf b/include/reportf index f1a62a9..06d45af 100644 --- a/include/reportf +++ b/include/reportf @@ -16,7 +16,7 @@ def @ReportSetup named @CoverSheet { Yes } named @ContentsSeparate { No } named @DateLine { No } - named @AbstractDisplay { Yes } + named @AbstractDisplay { No } named @AbstractTitle { dft } named @ReferencesBeforeAppendices { No } @@ -491,8 +491,8 @@ def @ReportSetup { Start @Runner - //@SectionGap @ContentsPart - //@SectionGap @SectionList @FirstSectionNumber + //@ContentsGap @ContentsPart + //@ContentsGap @SectionList @FirstSectionNumber //@SectionGap @ReferencesBeforeAppendices @Do { @MakeReferences @Do @ReferencesPart } diff --git a/include/slides b/include/slides index 7833f60..f740c84 100644 --- a/include/slides +++ b/include/slides @@ -105,9 +105,12 @@ # @TableNumbers { Arabic } # method of numbering tables # @FigureCaptionPos { Below } # Above or Below # @TableCaptionPos { Below } # Above or Below - # @CaptionFont { } # figure, table caption font - # @CaptionBreak { } # figure, table caption break - # @CaptionFormat { @B { number @DotSep @OneCol } } # figure, table caption format + # @FigureCaptionFont { -2p } # figure caption font + # @FigureCaptionBreak { adjust hyphen 1.2fx } # figure caption break + # @FigureCaptionFormat{ {@B { word @NumSep number. &2s }} @Insert caption } + # @TableCaptionFont { -2p } # table caption font + # @TableCaptionBreak { adjust hyphen 1.2fx } # table caption break + # @TableCaptionFormat { {@B { word @NumSep number. &2s }} @Insert caption } # @MakeFigureContents { No } # list of figures at start # @MakeTableContents { No } # list of tables at start # @MakeContents { No } # make contents? Yes or No diff --git a/include/tblf b/include/tblf index c8f0019..9a2da6e 100644 --- a/include/tblf +++ b/include/tblf @@ -1383,19 +1383,23 @@ def @TblSetup ctr @Yield @OneCol { |"0.5rt" x } right @Yield @OneCol { |"1.0rt" x } mctr @Yield @OneCol { |"0.5bx" x } - "" @Yield @OneCol x + align @Yield @OneCol x else @Yield @OneCol { |i x } } } def @VIndent right x { + # note: the default value "" gives top alignment, + # but that is not a problem because we are by + # default putting in a vertical strut + iv @Case { top @Yield @OneRow { / x } ctr @Yield @OneRow { /"0.5rt" x } foot @Yield @OneRow { /"1.0rt" x } mctr @Yield @OneRow { /"0.5bx" x } - "" @Yield @OneRow x + align @Yield @OneRow x else @Yield @OneRow { /iv x } } } -- cgit