aboutsummaryrefslogtreecommitdiffstats
path: root/include
diff options
context:
space:
mode:
authorJeffrey H. Kingston <jeff@it.usyd.edu.au>2010-09-14 20:41:31 +0000
committerJeffrey H. Kingston <jeff@it.usyd.edu.au>2010-09-14 20:41:31 +0000
commit3c59753b94d0425e7ddcc4b57b11dfb283d0c144 (patch)
treed405802ec35c185908c71f0fbedc3a237758b665 /include
parentf7f41daa27e7ccff0aa184cc81e80b9c96e3d761 (diff)
downloadlout-3c59753b94d0425e7ddcc4b57b11dfb283d0c144.tar.gz
Lout 3.36.
git-svn-id: http://svn.savannah.nongnu.org/svn/lout/trunk@41 9365b830-b601-4143-9ba8-b4a8e2c3339c
Diffstat (limited to 'include')
-rw-r--r--include/README2
-rw-r--r--include/bsf47
-rw-r--r--include/dsf8
-rw-r--r--include/haskellf24
-rw-r--r--include/math30
-rw-r--r--include/mathf2114
-rw-r--r--include/save_bsf1826
7 files changed, 4033 insertions, 18 deletions
diff --git a/include/README b/include/README
index 01d9bf9..45266eb 100644
--- a/include/README
+++ b/include/README
@@ -19,6 +19,7 @@ Setup files (containing mainly lists of options settable by the user)
diag Diag diagram drawing package
eq Eq equation formatting package
+ math Math, an alternative equation formatting package
graph Graph graph drawing package
latin2 Latin2 (Eastern European characters) package
pie Pie pie graph drawing package
@@ -58,6 +59,7 @@ Source files containing Lout and PostScript source code for the packages
diagf.etc A file included by diagf
diagf.lpg A PostScript prepend file needed by diagf
eqf Eq equation formatting package
+ mathf Math, an alternative equation formatting package
graphf Graph graph drawing package
graphf.etc A file included by graphf
graphf.lpg A PostScript prepend file needed by graphf
diff --git a/include/bsf b/include/bsf
index 2c472a2..b2ca24a 100644
--- a/include/bsf
+++ b/include/bsf
@@ -295,6 +295,26 @@ def @BasicSetup
###########################################################################
# #
+ # x @Dft y #
+ # #
+ # This returns x unless its value is "dft", in which case it returns y. #
+ # Useful for defaulting the value of one parameter to another. #
+ # #
+ ###########################################################################
+
+ def @Dft
+ left x
+ right y
+ {
+ x @Case {
+ dft @Yield y
+ else @Yield x
+ }
+ }
+
+
+ ###########################################################################
+ # #
# @Pipe, @PipeVerbatim, and @PipeRawVerbatim #
# #
###########################################################################
@@ -1349,10 +1369,11 @@ def @BasicSetup
# #
###########################################################################
- export @Tag val
+ export @Tag val display_val
def @NumDispCounterMarker
named @Tag {}
named val {}
+ named display_val {}
{
@Null
}
@@ -1363,16 +1384,24 @@ def @BasicSetup
}
def @NumDispCounterIncrement
+ named @BypassNumber { "dft" }
right tag
{
- @NumDispCounterMarker&&preceding @Tagged tag
- @NumDispCounterMarker val { @NumDispNum tag }
- @NumberMarker @Tag { tag } @Value { @NumDispNum tag }
+ def @DisplayNumber
+ {
+ @BypassNumber @Dft { @NumDispNum tag }
+ }
+
+ @NumDispCounterMarker&&preceding @Tagged tag
+ # @NumDispCounterMarker val { @NumDispNum tag }
+ # @NumberMarker @Tag { tag } @Value { @NumDispNum tag }
+ @NumDispCounterMarker val { @NumDispNum tag } display_val { @DisplayNumber }
+ @NumberMarker @Tag { tag } @Value { @DisplayNumber }
}
def @NN
{
- @NumDispCounterMarker&&preceding @Open { @DisplayNumStyle val }
+ @NumDispCounterMarker&&preceding @Open { @DisplayNumStyle display_val }
}
def @Do
@@ -1409,10 +1438,12 @@ def @BasicSetup
def @NDisp into { @DispPlace&&preceding }
named @Tag {}
+ named @BypassNumber { "dft" }
right x
{
@OneRow {
- @NumDispCounterIncrement @Tag
+ # @NumDispCounterIncrement @Tag
+ @NumDispCounterIncrement @BypassNumber { @BypassNumber } @Tag
@PageMark @Tag
^//
@OneRow x
@@ -1427,10 +1458,12 @@ def @BasicSetup
def @ANDisp into { @AlignedPlace&&preceding }
named @Tag {}
+ named @BypassNumber { "dft" }
right x
{
@OneRow {
- @NumDispCounterIncrement @Tag
+ # @NumDispCounterIncrement @Tag
+ @NumDispCounterIncrement @BypassNumber { @BypassNumber } @Tag
@PageMark @Tag
^/
@OneRow x
diff --git a/include/dsf b/include/dsf
index dc757a1..ae05e7d 100644
--- a/include/dsf
+++ b/include/dsf
@@ -5189,7 +5189,13 @@ def @DocumentSetup
def @LongNum
{
numbers @Then {
- initiallanguage @Language { word @NumSep @ShortNum }
+ # initiallanguage @Language { word @NumSep @ShortNum }
+ @ShortNum @Case {
+ "" @Yield { } # numberless: don't produce `word'
+ else @Yield {
+ initiallanguage @Language { word @NumSep @ShortNum }
+ }
+ }
}
}
diff --git a/include/haskellf b/include/haskellf
index b1064a1..26f4cac 100644
--- a/include/haskellf
+++ b/include/haskellf
@@ -1,12 +1,16 @@
###############################################################################
# #
-# Lout @HaskellSetup package for formatting Haskell programs #
+# Lout @HaskellSetup package for formatting Haskell programs #
# #
# Version 1.0 #
# Thorsten Seitz #
# 17 December 2001 #
# #
+# Version 1.1 (bug fixes) #
+# Gabor Greif #
+# 29 June 2007 #
+# #
# This package uses a filtered body parameter to convert program source #
# code into Lout source. The filter program is prg2lout, which is #
# distributed with Lout and should be compiled and installed wherever #
@@ -33,7 +37,7 @@ def @HaskellSetup
named fixedtabin { 4 } # tab interval
named fixedtabout { 4s } # tab width
- named fixedbraces { Base } # braces face
+ named fixedbraces { Base } # braces face
named fixedidentifiers { Base } # identifier face
named fixedkeywords { Base } # keyword face
named fixedoperators { Base } # operator face
@@ -42,8 +46,8 @@ def @HaskellSetup
named fixedcomments { Base } # comment face
named fixedlinenumbers { Base } # line numbers face
- named fixedleftbracesformat right @Body { @Body } # left braces format
- named fixedrightbracesformat right @Body { @Body } # right braces format
+ named fixedleftbracesformat right @Body { @Body } # left braces format
+ named fixedrightbracesformat right @Body { @Body } # right braces format
named fixedidentifiersformat right @Body { @Body } # identifier format
named fixedkeywordsformat right @Body { @Body } # keyword format
named fixedoperatorsformat right @Body { @Body } # operators format
@@ -61,7 +65,7 @@ def @HaskellSetup
named varyingtabin { 4 } # tab interval
named varyingtabout { 1.5f } # tab width
- named varyingbraces { Base } # braces face
+ named varyingbraces { Base } # braces face
named varyingidentifiers { Slope } # identifier face
named varyingkeywords { Bold } # keyword face
named varyingoperators { Base } # operator face
@@ -70,8 +74,8 @@ def @HaskellSetup
named varyingcomments { Base } # comment face
named varyinglinenumbers { Base } # line numbers face
- named varyingleftbracesformat right @Body { @Body } # left braces format
- named varyingrightbracesformat right @Body { @Body } # right braces format
+ named varyingleftbracesformat right @Body { @Body } # left braces format
+ named varyingrightbracesformat right @Body { @Body } # right braces format
named varyingidentifiersformat right @Body { @Body } # identifier format
named varyingkeywordsformat right @Body { @Body } # keyword format
named varyingoperatorsformat right @Body { @Body } # operators format
@@ -89,10 +93,10 @@ def @HaskellSetup
named symboltabin { 4 } # tab interval
named symboltabout { 1.7f } # tab width
- named symbolbraces { Base } # braces face
+ named symbolbraces { Base } # braces face
named symbolidentifiers { Slope } # identifier face
named symbolkeywords { Bold } # keyword face
- named symboloperators { Symbol Base } # operator face
+ named symboloperators { Slope } # operator face
named symbolnumbers { Base } # number face
named symbolstrings { Slope } # string face
named symbolcomments { Base } # comment face
@@ -395,7 +399,7 @@ def @HaskellSetup
def @PC # for formatting comments
right x
{
- @PCnoDelim { "{"@Symb minus{x}@Symb minus"}" }
+ @PCnoDelim { "{"{@Symb minus}x{@Symb minus}"}" }
}
diff --git a/include/math b/include/math
new file mode 100644
index 0000000..707178c
--- /dev/null
+++ b/include/math
@@ -0,0 +1,30 @@
+###############################################################################
+# #
+# Lout setup file for equation formatting, based on `eq'. #
+# #
+# Jeffrey H. Kingston #
+# 5 February 1999 #
+# #
+# Ludovic Courtès #
+# June 2007 #
+# #
+###############################################################################
+
+
+###############################################################################
+# #
+# The @SysInclude { mathf } line #
+# #
+# This line causes Lout to read the definitions for equations, and should #
+# not be touched. #
+# #
+###############################################################################
+
+@SysInclude { mathf }
+
+
+###############################################################################
+# #
+# This package does not offer default options that can be changed. #
+# #
+###############################################################################
diff --git a/include/mathf b/include/mathf
new file mode 100644
index 0000000..8c395fd
--- /dev/null
+++ b/include/mathf
@@ -0,0 +1,2114 @@
+
+###############################################################################
+# #
+# Lout @Math package for equation formatting, based on @Eq. #
+# #
+# @Eq revision history: #
+# #
+# Version 1.0 by Jeffrey H. Kingston, December 1990. #
+# Version 2.0 by Jeffrey H. Kingston, 22 December 1992. #
+# Version 3.0 by Jeffrey H. Kingston and Robert Marsa, March 1996. #
+# #
+# @Math revision history: #
+# #
+# Version 1.0 by Ludovic Courtès, June 2007. #
+# #
+# See "Eq - a Lout package for typesetting mathematics" for user #
+# information. Acknowledgement: the @Eq language is based closely on #
+# the Eqn language of B. W. Kernighan and L. L. Cherry; the spacing rules #
+# are similar to those of the TeX system by D. E. Knuth. #
+# #
+# Version 4.0 makes use of `@SetContext' and `@GetContext' (introduced in #
+# Basser Lout 3.34) to better honor the typesetting conventions outlined by #
+# Knuth. #
+# #
+###############################################################################
+
+export "`" "``" "```" bin rel punct non vctr big small
+
+ space exclam universal numbersign existential percent
+ ampersand suchthat parenleft parenright asteriskmath
+ plus comma minus period slash zero one two three four
+ five six seven eight nine colon semicolon less equal
+ greater question congruent Alpha Beta Chi Delta Epsilon
+ Phi Gamma Eta Iota thetaone Kappa Lambda Mu Nu Omicron
+ Pi Theta Rho Sigma Tau Upsilon sigmaone Omega Xi Psi Zeta
+ bracketleft therefore bracketright perpendicular underscore
+ radicalex alpha beta chi delta epsilon phi gamma eta iota
+ phione kappa lambda mu nu omicron pi theta rho sigma tau
+ upsilon omegaone omega xi psi zeta braceleft bar braceright
+ similar Upsilonone minute lessequal fraction infinity florin
+ club diamond heart spade arrowboth arrowleft arrowup
+ arrowright arrowdown degree plusminus second greaterequal
+ multiply proportional partialdiff bullet divide notequal
+ equivalence approxequal ellipsis arrowvertex arrowhorizex
+ carriagereturn aleph Ifraktur Rfraktur weierstrass
+ circlemultiply circleplus emptyset intersection union
+ propersuperset reflexsuperset notsubset propersubset
+ reflexsubset element notelement angle gradient registerserif
+ copyrightserif trademarkserif product radical dotmath
+ logicalnot logicaland logicalor arrowdblboth arrowdblleft
+ arrowdblup arrowdblright arrowdbldown lozenge angleleft
+ registersans copyrightsans trademarksans summation parenlefttp
+ parenleftex parenleftbt bracketlefttp bracketleftex
+ bracketleftbt bracelefttp braceleftmid braceleftbt braceex
+ angleright integral integraltp integralex integralbt
+ parenrighttp parenrightex parenrightbt bracketrighttp
+ bracketrightex bracketrightbt bracerighttp bracerightmid
+ bracerightbt
+
+ hbar Re Im partial infty prime nabla surd top bot dbar
+ triangle backslash forall exists neg
+ circle filledcircle square
+
+ "0" "1" "2" "3" "4" "5" "6" "7" "8" "9"
+
+ sum prod coprod int oint bcap bcup bvee bwedge bodot botimes
+ 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
+
+ "<" ">" "=" "<=" prec preceq "<<" subset subseteq sqsubseteq
+ in vdash smile frown ">=" succ succeq ">>" supset supseteq
+ sqsupseteq ni dashv mid parallel "==" "~" "-~" asymp "~~"
+ "=~" bowtie propto models doteq trieq perp notsub notin "!=" not
+ "<->" "<--" "-->" up down "<=>" "<==" "==>" dblup dbldown
+ ":" "::" ":="
+
+ lpar blpar rpar brpar lbrack blbrack rbrack brbrack lbrace blbrace
+ rbrace brbrace lfloor blfloor rfloor brfloor lceil blceil
+ rceil brceil langle blangle rangle brangle
+
+ ";" "," col
+
+ "!" "?" "%" "(" ")" "[" "]"
+
+ arccos arcsin arctan arg cos cosh cot coth csc deg det dim exp
+ gcd hom inf ker lg lim liminf limsup ln log max min Pr sec sin
+ sinh supr tan tanh mod ldots cdots vdots ddots del grad
+ "..." ",...," "'" "''" "'''" "''''" empty
+
+ triangleup triangledown
+
+ leftarrow longleftarrow dblleftarrow dbllongleftarrow
+ rightarrow longrightarrow dblrightarrow dbllongrightarrow
+ leftrightarrow longleftrightarrow dblleftrightarrow dbllongleftrightarrow
+ mapsto longmapsto hookleftarrow hookrightarrow leadsto
+ leftharpoonup rightharpoonup leftharpoondown rightharpoondown
+ rightleftharpoons
+ uparrow dbluparrow downarrow dbldownarrow updownarrow dblupdownarrow
+ nearrow searrow swarrow nwarrow
+
+ sup sub tsub supp on ton frac half third over
+ atop below wideatop widebelow
+ dot dotdot hat tilde vec dyad overbar underbar sqrt root zroot
+ matrix pmatrix bmatrix brmatrix fmatrix cmatrix amatrix
+
+ @SuperScriptStyle @SubScriptStyle
+ @NumeratorStyle @DenominatorStyle
+ @SquareRootStyle
+
+def @Math
+ named symbolfont { Symbol Base }
+ named basefont { Times Base }
+ named initialstyle { "display" }
+ named initiallycramped { "No" }
+ named initialspace { separate 0.05f }
+ body @Body
+@Begin
+
+
+ ###################################################################
+ # #
+ # Context-sensitive format changes. #
+ # #
+ # Equation formatting (according to Knuth) demands changes in #
+ # the appearance of equations depending on context. Knuth #
+ # distinguishes four major styles (the TeXbook, Ch. 17): #
+ # #
+ # display style (formulas displayed on lines by themselves) #
+ # text style (formulas embedded in the text) #
+ # script style (formulas used as superscripts or subscripts) #
+ # scriptscript (second-order superscripts or subscripts) #
+ # #
+ # Each style has its own font size and spacing rules. #
+ # #
+ # Additionally, each of these styles can be ``cramped'', #
+ # meaning that exponents are not raised as much. #
+ # #
+ ###################################################################
+
+ macro @CurrStyleVar { "EqCurrStyle" }
+ macro @CrampedVar { "EqCramped?" }
+
+ def @CurrStyle { @GetContext @CurrStyleVar }
+ def @Cramped { @GetContext @CrampedVar }
+
+ def @EqDebug
+ {
+ # Uncomment the following line to get debugging information.
+ #{ { Helvetica Base 0.7f } @Font @CurrStyle } |0.2f
+ @Null
+ }
+
+ def @WithStyle
+ named style { "display" }
+ named cramped { "No" }
+ right x
+ {
+ def @NewFontSize
+ {
+ @CurrStyle @Case {
+ "scriptscript" @Yield 1.0f # can't be smaller
+ "script" @Yield {
+ style @Case {
+ "script" @Yield 1.0f
+ else @Yield 0.8f } }
+ "text" @Yield {
+ style @Case {
+ "text" @Yield 1.0f
+ else @Yield 0.7f } }
+ "display" @Yield {
+ style @Case {
+ # display and text styles yield the same font size
+ { "display" "text" } @Yield 1.0f
+ else @Yield 0.7f } }
+ }
+ }
+
+
+ #{ Helvetica Base 0.4f } @Font { @CurrStyle -> style } |0.2f
+ @NewFontSize @Font
+ { @CurrStyleVar @Yield style } @SetContext {
+ { @CrampedVar @Yield cramped } @SetContext {
+ # FIXME: Space is not properly inherited, hence this
+ # `@Space' invocation.
+ { @EqDebug initialspace @Space x }
+ }
+ }
+ }
+
+ def @CurrSuperScriptGap
+ {
+ @Cramped @Case {
+ "Yes" @Yield 0.23fk
+ "No" @Yield 0.35fk
+ }
+ }
+
+ def @SubScriptGap { 0.35fk }
+
+
+ ###################################################################
+ # #
+ # Spacing rules. #
+ # #
+ ###################################################################
+
+ # Space around relational operators.
+ def @CurrRelSpaceGap
+ {
+ @CurrStyle @Case {
+ { "display" "text" } @Yield 0.300fe
+ else @Yield 0.030ce
+ }
+ }
+
+ # Space around binary operators.
+ def @CurrBinarySpaceGap
+ {
+ @CurrStyle @Case {
+ { "display" "text" } @Yield 0.240fe
+ else @Yield 0.024ce
+ }
+ }
+
+ # Space around punctuation marks, including matrix braces.
+ def @CurrPunctSpaceGap
+ {
+ @CurrStyle @Case {
+ { "display" "text" } @Yield 0.180fe
+ else @Yield 0.018ce
+ }
+ }
+
+ def "`" { &@CurrPunctSpaceGap }
+ def "``" { &@CurrBinarySpaceGap }
+ def "```" { &@CurrRelSpaceGap }
+ def bin left l named op { "binop" } right r
+ { l &@CurrBinarySpaceGap op &@CurrBinarySpaceGap r }
+ def rel left l named op { "relop" } right r
+ { l &@CurrRelSpaceGap op &@CurrRelSpaceGap r }
+ def punct left l named symbol { "punct" } right r
+ { l &0.0ce symbol &@CurrPunctSpaceGap r }
+
+ # Gap above/below math expressions (see, e.g., `to' and `from').
+ def @AboveGap { 0.15f }
+ def @BelowGap { 0.15f }
+
+ def @SkewGap { 0.05f }
+ def @ColGap { 0.8f }
+ def @RowGap { 0.5f }
+
+
+ ###################################################################
+ # #
+ # Major styles: scripts, fractions, and square roots. #
+ # #
+ ###################################################################
+
+ def @ScriptStyle
+ named level { "sup" }
+ right script
+ {
+ @WithStyle
+ style { @CurrStyle @Case {
+ { "display" "text" } @Yield "script"
+ { "script" "scriptscript" } @Yield "scriptscript" } }
+ cramped { level @Case {
+ "sub" @Yield "Yes"
+ "sup" @Yield @Cramped } }
+ { script }
+ }
+
+ def @SuperScriptStyle right superscript
+ {
+ @ScriptStyle level { "sup" } superscript
+ }
+
+ def @SubScriptStyle right subscript
+ {
+ @ScriptStyle level { "sub" } subscript
+ }
+
+
+ def @FractionStyle
+ named level { "numerator" }
+ right x
+ {
+ @WithStyle
+ style { @CurrStyle @Case {
+ "display" @Yield "text"
+ "text" @Yield "script"
+ { "script" "scriptscript" } @Yield "scriptscript" } }
+ cramped { level @Case {
+ "numerator" @Yield @Cramped
+ "denominator" @Yield "Yes"} }
+ { x }
+ }
+
+ def @NumeratorStyle right x
+ {
+ @FractionStyle level { "numerator" } x
+ }
+
+ def @DenominatorStyle right x
+ {
+ @FractionStyle level { "denominator" } x
+ }
+
+ def @SquareRootStyle right x
+ {
+ @WithStyle style { @CurrStyle } cramped { "Yes" } x
+ }
+
+
+ ###################################################################
+ # #
+ # Utilities: `big', `small', `@HLine', etc. #
+ # #
+ ###################################################################
+
+ # XXX: Certainly not the best way to implement `non'.
+ def non right x { { @CurrStyleVar @Yield "script" } @SetContext x }
+ def big right x { 1.3f @Font x }
+ def small right x { 0.6f @Font x }
+
+ def @Base right x { basefont @Font x }
+ def @Sym right x { symbolfont @Font x }
+
+ def @HLine
+ named line { @BackEnd @Case { PostScript @Yield { "0.05 ft setlinewidth" } PDF @Yield { "__mul(__loutf, 0.05) w" } } }
+ {
+ @BackEnd @Case {
+ PostScript @Yield {
+ { "0 0 moveto xsize 0 lineto" line "stroke" } @Graphic {}
+ }
+ PDF @Yield { # note re-arrangement of commands (setlinewidth (='w') not allowed in a path)
+ { line "0 0 m __xsize 0 l s" } @Graphic {}
+ }
+ }
+ }
+
+ def @VLine
+ {
+ @BackEnd @Case {
+ PostScript @Yield {
+ "0 0 moveto 0 ysize lineto 0.05 ft setlinewidth stroke" @Graphic {}
+ }
+ PDF @Yield {
+ "__mul(__loutf, 0.05) w 0 0 m 0 __ysize l s" @Graphic {}
+ }
+ }
+ }
+
+ def vctr
+ right x
+ {
+ 0.5w @VShift x
+ }
+
+ def @Strut right x
+ {
+ @OneCol { x | @OneRow { 0.5f @High ^/ 0.5f @High } }
+ }
+
+ ###################################################################
+ # #
+ # Full names #
+ # #
+ # These symbols and their names are taken directly from the #
+ # Adobe Systems Inc. Symbol font (see PostScript Language #
+ # Reference Manual, pp. 256-257). The only differences are: #
+ # #
+ # Adobe: theta1 Eq: thetaone #
+ # sigma1 sigmaone #
+ # phi1 phione #
+ # omega1 omegaone #
+ # #
+ # These were needed since Lout identifiers do not have digits. #
+ # #
+ ###################################################################
+
+ def space { @Sym @Char "space" }
+ def exclam { @Sym @Char "exclam" }
+ def universal { @Sym @Char "universal" }
+ def numbersign { @Sym @Char "numbersign" }
+ def existential { @Sym @Char "existential" }
+ def percent { @Sym @Char "percent" }
+ def ampersand { @Sym @Char "ampersand" }
+ def suchthat { @Sym @Char "suchthat" }
+ def parenleft { @Sym @Char "parenleft" }
+ def parenright { @Sym @Char "parenright" }
+ def asteriskmath { @Sym @Char "asteriskmath" }
+ def plus { @Sym @Char "plus" }
+ def comma { @Sym @Char "comma" }
+ def minus { @Sym @Char "minus" }
+ def period { @Sym @Char "period" }
+ def slash { @Sym @Char "slash" }
+ def zero { @Sym @Char "zero" }
+ def one { @Sym @Char "one" }
+ def two { @Sym @Char "two" }
+ def three { @Sym @Char "three" }
+ def four { @Sym @Char "four" }
+ def five { @Sym @Char "five" }
+ def six { @Sym @Char "six" }
+ def seven { @Sym @Char "seven" }
+ def eight { @Sym @Char "eight" }
+ def nine { @Sym @Char "nine" }
+ def colon { @Sym @Char "colon" }
+ def semicolon { @Sym @Char "semicolon" }
+ def less { @Sym @Char "less" }
+ def equal { @Sym @Char "equal" }
+ def greater { @Sym @Char "greater" }
+ def question { @Sym @Char "question" }
+ def congruent { @Sym @Char "congruent" }
+ def Alpha { @Sym @Char "Alpha" }
+ def Beta { @Sym @Char "Beta" }
+ def Chi { @Sym @Char "Chi" }
+ def Delta { @Sym @Char "Delta" }
+ def Epsilon { @Sym @Char "Epsilon" }
+ def Phi { @Sym @Char "Phi" }
+ def Gamma { @Sym @Char "Gamma" }
+ def Eta { @Sym @Char "Eta" }
+ def Iota { @Sym @Char "Iota" }
+ def thetaone { @Sym @Char "thetaone" }
+ def Kappa { @Sym @Char "Kappa" }
+
+ def Lambda { @Sym @Char "Lambda" }
+ def Mu { @Sym @Char "Mu" }
+ def Nu { @Sym @Char "Nu" }
+ def Omicron { @Sym @Char "Omicron" }
+ def Pi { @Sym @Char "Pi" }
+ def Theta { @Sym @Char "Theta" }
+ def Rho { @Sym @Char "Rho" }
+ def Sigma { @Sym @Char "Sigma" }
+ def Tau { @Sym @Char "Tau" }
+ def Upsilon { @Sym @Char "Upsilon" }
+ def sigmaone { @Sym @Char "sigmaone" }
+ def Omega { @Sym @Char "Omega" }
+ def Xi { @Sym @Char "Xi" }
+ def Psi { @Sym @Char "Psi" }
+ def Zeta { @Sym @Char "Zeta" }
+ def bracketleft { @Sym @Char "bracketleft" }
+ def therefore { @Sym @Char "therefore" }
+ def bracketright { @Sym @Char "bracketright" }
+ def perpendicular { @Sym @Char "perpendicular" }
+ def underscore { @Sym @Char "underscore" }
+ def radicalex { @Sym @Char "radicalex" }
+ def alpha { @Sym @Char "alpha" }
+ def beta { @Sym @Char "beta" }
+ def chi { @Sym @Char "chi" }
+ def delta { @Sym @Char "delta" }
+ def epsilon { @Sym @Char "epsilon" }
+ def phi { @Sym @Char "phi" }
+ def gamma { @Sym @Char "gamma" }
+ def eta { @Sym @Char "eta" }
+ def iota { @Sym @Char "iota" }
+ def phione { @Sym @Char "phione" }
+ def kappa { @Sym @Char "kappa" }
+ def lambda { @Sym @Char "lambda" }
+ def mu { @Sym @Char "mu" }
+ def nu { @Sym @Char "nu" }
+
+ def omicron { @Sym @Char "omicron" }
+ def pi { @Sym @Char "pi" }
+ def theta { @Sym @Char "theta" }
+ def rho { @Sym @Char "rho" }
+ def sigma { @Sym @Char "sigma" }
+ def tau { @Sym @Char "tau" }
+ def upsilon { @Sym @Char "upsilon" }
+ def omegaone { @Sym @Char "omegaone" }
+ def omega { @Sym @Char "omega" }
+ def xi { @Sym @Char "xi" }
+ def psi { @Sym @Char "psi" }
+ def zeta { @Sym @Char "zeta" }
+ def braceleft { @Sym @Char "braceleft" }
+ def bar { @Sym @Char "bar" }
+ def braceright { @Sym @Char "braceright" }
+ def similar { @Sym @Char "similar" }
+ def Upsilonone { @Sym @Char "Upsilonone" }
+ def minute { @Sym @Char "minute" }
+ def lessequal { @Sym @Char "lessequal" }
+ def fraction { @Sym @Char "fraction" }
+ # For Adobe Symbol, `infinity' used to be "1.2f @Font { ... }"
+ def infinity { @Sym @Char "infinity" }
+ def florin { @Sym @Char "florin" }
+ def club { @Sym @Char "club" }
+ def diamond { @Sym @Char "diamond" }
+ def heart { @Sym @Char "heart" }
+ def spade { @Sym @Char "spade" }
+ def arrowboth { @Sym @Char "arrowboth" }
+ def arrowleft { @Sym @Char "arrowleft" }
+ def arrowup { @Sym @Char "arrowup" }
+ def arrowright { @Sym @Char "arrowright" }
+ def arrowdown { @Sym @Char "arrowdown" }
+ def degree { @Sym @Char "degree" }
+ def plusminus { @Sym @Char "plusminus" }
+ def second { @Sym @Char "second" }
+ def greaterequal { @Sym @Char "greaterequal" }
+
+ def multiply { @Sym @Char "multiply" }
+ def proportional { @Sym @Char "proportional" }
+ def partialdiff { @Sym @Char "partialdiff" }
+ def bullet { @Sym @Char "bullet" }
+ def divide { @Sym @Char "divide" }
+ def notequal { @Sym @Char "notequal" }
+ def equivalence { @Sym @Char "equivalence" }
+ def approxequal { @Sym @Char "approxequal" }
+ def ellipsis { @Sym @Char "ellipsis" }
+ def arrowvertex { @Sym @Char "arrowvertex" }
+ def arrowhorizex { @Sym @Char "arrowhorizex" }
+ def carriagereturn { @Sym @Char "carriagereturn" }
+ def aleph { @Sym @Char "aleph" }
+ def Ifraktur { @Sym @Char "Ifraktur" }
+ def Rfraktur { @Sym @Char "Rfraktur" }
+ def weierstrass { @Sym @Char "weierstrass" }
+ def circlemultiply { @Sym @Char "circlemultiply" }
+ def circleplus { @Sym @Char "circleplus" }
+ def emptyset { @Sym @Char "emptyset" }
+ def intersection { @Sym @Char "intersection" }
+ def union { @Sym @Char "union" }
+ def propersuperset { @Sym @Char "propersuperset" }
+ def reflexsuperset { @Sym @Char "reflexsuperset" }
+ def notsubset { @Sym @Char "notsubset" }
+ def propersubset { @Sym @Char "propersubset" }
+ def reflexsubset { @Sym @Char "reflexsubset" }
+ def element { @Sym @Char "element" }
+ def notelement { @Sym @Char "notelement" }
+ def angle { @Sym @Char "angle" }
+ def gradient { @Sym @Char "gradient" }
+ def registerserif { @Sym @Char "registerserif" }
+ def copyrightserif { @Sym @Char "copyrightserif" }
+ def trademarkserif { @Sym @Char "trademarkserif" }
+ def product { @Sym @Char "product" }
+ def radical { @Sym @Char "radical" }
+ def dotmath { @Sym @Char "dotmath" }
+
+ def @PureDot # dot with no extra space
+ {
+ @HContract { &0io 0.4w @HShift dotmath }
+ }
+
+ def logicalnot { @Sym @Char "logicalnot" }
+ def logicaland { @Sym @Char "logicaland" }
+ def logicalor { @Sym @Char "logicalor" }
+ def arrowdblboth { @Sym @Char "arrowdblboth" }
+ def arrowdblleft { @Sym @Char "arrowdblleft" }
+ def arrowdblup { @Sym @Char "arrowdblup" }
+ def arrowdblright { @Sym @Char "arrowdblright" }
+ def arrowdbldown { @Sym @Char "arrowdbldown" }
+ def lozenge { @Sym @Char "lozenge" }
+ def angleleft { @Sym @Char "angleleft" }
+ def registersans { @Sym @Char "registersans" }
+ def copyrightsans { @Sym @Char "copyrightsans" }
+ def trademarksans { @Sym @Char "trademarksans" }
+ def summation { @Sym @Char "summation" }
+ def parenlefttp { @Sym @Char "parenlefttp" }
+ def parenleftex { @Sym @Char "parenleftex" }
+ def parenleftbt { @Sym @Char "parenleftbt" }
+ def bracketlefttp { @Sym @Char "bracketlefttp" }
+ def bracketleftex { @Sym @Char "bracketleftex" }
+ def bracketleftbt { @Sym @Char "bracketleftbt" }
+ def bracelefttp { @Sym @Char "bracelefttp" }
+ def braceleftmid { @Sym @Char "braceleftmid" }
+ def braceleftbt { @Sym @Char "braceleftbt" }
+ def braceex { @Sym @Char "braceex" }
+ def angleright { @Sym @Char "angleright" }
+ def integral { @Sym @Char "integral" }
+ def integraltp { @Sym @Char "integraltp" }
+ def integralex { @Sym @Char "integralex" }
+ def integralbt { @Sym @Char "integralbt" }
+ def parenrighttp { @Sym @Char "parenrighttp" }
+ def parenrightex { @Sym @Char "parenrightex" }
+ def parenrightbt { @Sym @Char "parenrightbt" }
+ def bracketrighttp { @Sym @Char "bracketrighttp" }
+ def bracketrightex { @Sym @Char "bracketrightex" }
+ def bracketrightbt { @Sym @Char "bracketrightbt" }
+ def bracerighttp { @Sym @Char "bracerighttp" }
+ def bracerightmid { @Sym @Char "bracerightmid" }
+ def bracerightbt { @Sym @Char "bracerightbt" }
+
+
+ ###################################################################
+ # #
+ # Short names #
+ # #
+ # These symbols, their names, and their spacing, are based on #
+ # the list in Appendix F of Donald E. Knuth's The TeXBook. #
+ # #
+ # Group 1 (lowercase Greek letters): see full names above #
+ # Group 2 (uppercase Greek letters): see full names above #
+ # Group 3 (calligraphic capitals): not provided by Eq #
+ # #
+ ###################################################################
+
+ ###################################################################
+ # #
+ # Group 4 (miscellaneous Ord symbols) #
+ # #
+ # Not all of Knuth's symbols are available. The four suits #
+ # (heartsuit, etc.), have definitions above. #
+ # #
+ ###################################################################
+
+ def hbar { @OneCol { &0.1f @Base "-" ^/0.25fo h } }
+ def Re { Rfraktur }
+ def Im { Ifraktur }
+ def partial { partialdiff }
+ def infty { infinity }
+ def prime { minute }
+ #def emptyset { defined above }
+ def nabla { gradient }
+ def surd { radical }
+ def top { 180d @Rotate perpendicular }
+ def bot { perpendicular }
+ def dbar { @Base "||" }
+ #def angle { defined above }
+ def backslash { "\\" }
+ def forall { universal }
+ 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.
+ # 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 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 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 }
+ }
+ }
+ }
+
+
+ ###################################################################
+ # #
+ # Layout primitives. #
+ # #
+ ###################################################################
+
+ def atop
+ precedence 73
+ associativity left
+ left x
+ named gap { @BelowGap }
+ named skew { 0c }
+ right y
+ {
+ @HContract @VContract
+ { |0.5rt x
+ //gap |0.5rt &skew y
+ }
+ }
+
+ def below
+ precedence 73
+ associativity left
+ left x
+ named gap { @AboveGap }
+ named skew { 0c }
+ right y
+ {
+ @HContract @VContract
+ { |0.5rt &skew y
+ ^//gap |0.5rt x
+ }
+ }
+
+ def wideatop
+ precedence 73
+ associativity left
+ left x
+ named gap { @BelowGap }
+ right y
+ {
+ @HContract @VContract
+ {
+ x //gap @HScale y
+ }
+ }
+
+ def widebelow
+ precedence 73
+ associativity left
+ left x
+ named gap { @AboveGap }
+ right y
+ {
+ @HContract @VContract
+ {
+ @HScale y ^//gap x
+ }
+ }
+
+ ###################################################################
+ # #
+ # Operator Precedence #
+ # #
+ # We use the precedence illustrated by the following macros #
+ # for the various operator groups. I.e., exponentiation and #
+ # square root precede multiplication and division, which in #
+ # turn precede addition and substraction, etc. #
+ # See http://en.wikipedia.org/wiki/Order_of_operations . #
+ # #
+ ###################################################################
+
+ macro @PunctuationPrec { 13 }
+
+ macro @EqualityPrec { 23 }
+ macro @OrderingPrec { 33 }
+ macro @AdditionPrec { 43 }
+ macro @MultiplicationPrec { 53 }
+ macro @DivisionPrec { 54 }
+ macro @ExponentPrec { 63 }
+ macro @FactorialPrec { 73 }
+
+
+ ###################################################################
+ # #
+ # Group 6 ("Large" operators) #
+ # #
+ # Layout of large operators differs in several ways, depending #
+ # on whether they are in display mode or not. #
+ # #
+ # 1. The operator itself is larger in display mode. We #
+ # achieve this by automatically prepending `big' to the #
+ # operator's symbol when in display mode. #
+ # #
+ # 2. The "bounds" of these operators (i.e., `from' and `to') #
+ # are set as limits (i.e., above and below the operator #
+ # symbol) when in display mode, and displayed to the #
+ # right of the symbol otherwise. Integrations are an #
+ # exception (the only exception?). #
+ # #
+ # See ``The TeXbook'', Chapter 17. #
+ # #
+ ###################################################################
+
+ def largeoperator
+ precedence 58
+ named symbol { "largeop" }
+ named from { "" }
+ named to { "" }
+ named limits { "Yes" } # whether to set `from' and `to' as limits
+ {
+ def @NoLimitsBody {
+ 0.5w @VShift {
+ 1.0w @VShift @OneRow {
+ { | 0.3w @VShift @SuperScriptStyle to }
+ ^/0.0fo { 0w @VShift symbol | }
+ }
+
+ /0.0fo
+
+ { | 0.7w @VShift @SubScriptStyle from }
+ }
+ |{ @CurrPunctSpaceGap }
+ }
+
+ def @LimitsBody {
+ symbol atop { @SuperScriptStyle from }
+ below { @SubScriptStyle to }
+ }
+
+ limits @Case {
+ { "Yes" "yes" } @Yield @LimitsBody
+ { "No" "no" } @Yield @NoLimitsBody
+ }
+ }
+
+ def simplelargeoperator
+ named symbol { "simplelargeop" }
+ named limits { "Auto" }
+ named from { }
+ named to { }
+ {
+ largeoperator symbol { @CurrStyle @Case {
+ "display" @Yield { big symbol }
+ else @Yield symbol } }
+ limits { limits @Case {
+ "Auto" @Yield {
+ @CurrStyle @Case {
+ "display" @Yield "Yes"
+ else @Yield "No" } }
+ else @Yield limits } }
+ from { from }
+ to { to }
+ }
+
+ def sum named from { } named to { } named limits { "Auto" }
+ { simplelargeoperator symbol { summation } limits { limits }
+ from { from } to { to } }
+ def prod named from { } named to { } named limits { "Auto" }
+ { simplelargeoperator symbol { product } limits { limits }
+ from { from } to { to } }
+ def coprod named from { } named to { } named limits { "Auto" }
+ { simplelargeoperator symbol { 180d @Rotate vctr product }
+ limits { limits }
+ from { from } to { to } }
+ def bcap named from { } named to { } named limits { "Auto" }
+ { simplelargeoperator symbol { intersection } limits { limits }
+ from { from } to { to } }
+ def bcup named from { } named to { } named limits { "Auto" }
+ { simplelargeoperator symbol { union } limits { limits }
+ from { from } to { to } }
+ def bvee named from { } named to { } named limits { "Auto" }
+ { simplelargeoperator symbol { logicalor } limits { limits }
+ from { from } to { to } }
+ def bwedge named from { } named to { } named limits { "Auto" }
+ { simplelargeoperator symbol { logicaland } limits { limits }
+ from { from } to { to } }
+ def bodot named from { } named to { } named limits { "Auto" }
+ { simplelargeoperator symbol { & @HContract {
+ circle /0io &0.5rt @PureDot } }
+ limits { limits }
+ from { from } to { to } }
+ def botimes named from { } named to { } named limits { "Auto" }
+ { simplelargeoperator symbol { circlemultiply } limits { limits }
+ from { from } to { to } }
+ def boplus named from { } named to { } named limits { "Auto" }
+ { simplelargeoperator symbol { circleplus } limits { limits }
+ from { from } to { to } }
+ def buplus named from { } named to { } named limits { "Auto" }
+ { simplelargeoperator symbol { & @HContract {
+ &0.5rt 0.7f @Font plus
+ ^/0.2fo union } }
+ limits { limits }
+ from { from } to { to } }
+
+ ###################################################################
+ # #
+ # Integrations are slightly different in that, according to #
+ # Knuth (Chapter 17, p. 144), ``superscripts and subscripts #
+ # are not set as limits, even in display style''. Still, as #
+ # in TeX, we let users the possibility to override this. #
+ # #
+ ###################################################################
+
+ def integration
+ named symbol { "integration" }
+ named limits { "No" }
+ named from { }
+ named to { }
+ {
+ largeoperator symbol { @CurrStyle @Case {
+ "display" @Yield { big symbol }
+ else @Yield symbol } }
+ limits { limits }
+ from { from }
+ to { to }
+ }
+
+ def int
+ named limits { "No" }
+ named from { }
+ named to { }
+ {
+ integration symbol { vctr integral }
+ limits { limits }
+ from { from }
+ to { to }
+ }
+
+ def oint
+ named limits { "No" }
+ named from { }
+ named to { }
+ {
+ integration symbol { @OneCol { vctr degree |0.015fo int } }
+ limits { limits }
+ from { from }
+ to { to }
+ }
+
+
+
+ ###################################################################
+ # #
+ # Group 7 (binary operations) #
+ # #
+ # All of Knuth's symbols are available except \star, \diamond #
+ # and \bullet; a few have been given more mnemonic names. #
+ # #
+ ###################################################################
+
+ def "+" precedence @AdditionPrec left l right r
+ { l bin op { plus } r }
+ def "-" precedence @AdditionPrec left l right r
+ { l bin op { minus } r }
+ def "+-" precedence @AdditionPrec left l right r
+ { l bin op { plusminus } r }
+ def "-+" precedence @AdditionPrec left l right r
+ { l bin op { 180d @Rotate plusminus } r }
+ def setminus precedence @AdditionPrec left l right r
+ { l bin op { backslash } r }
+ def cdot precedence @AdditionPrec left l right r
+ { l bin op { dotmath } r }
+ def times precedence @MultiplicationPrec left l right r
+ { l bin op { multiply } r }
+ def "*" precedence @MultiplicationPrec left l right r
+ { l bin op { asteriskmath } r }
+ #def diamond { name used above }
+ def circ precedence @MultiplicationPrec left l right r
+ { l bin op { circle } r }
+ #def bullet { name used above }
+ def div precedence @DivisionPrec left l right r
+ { l bin op { divide } r }
+ def cap precedence @MultiplicationPrec left l right r
+ { l bin op { intersection } r }
+ def cup precedence @MultiplicationPrec left l right r
+ { l bin op { union } r }
+ def uplus precedence @MultiplicationPrec left l right r
+ { l
+ bin op { @OneRow @HContract { &0.5rt 0.7f @Font plus ^/0.2fo union} }
+ r }
+
+ def sqcap precedence @MultiplicationPrec left l right r
+ { l
+ bin op { @HContract @VContract
+ @BackEnd @Case {
+ PostScript @Yield {
+ { "0 0 moveto 0 ysize lineto xsize ysize lineto"
+ "xsize 0 lineto"
+ "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 0 __ysize l __xsize __ysize l"
+ "__xsize 0 l s"
+ }
+ @Graphic
+ { 0.3f @Wide 0.3f @High ^| ^/
+ 0.3f @Wide 0.3f @High
+ }
+ }
+ }
+ }
+ r }
+
+ def sqcup { 180d @Rotate sqcap }
+ def triangleleft left l right r
+ { l bin op { "90d" @Rotate 0.8f @Font triangle } r }
+ def triangleright left l right r
+ { l bin op { "-90d" @Rotate 0.8f @Font triangle } r }
+ def wr left l right r
+ { l bin op { vctr {90d @Rotate similar } } r }
+ def bigcirc left l right r
+ { l bin op { 1.2f @Font circle} r }
+ def bigtriangleup left l right r
+ { l bin op { 1.2f @Font triangle } r }
+ def bigtriangledown left l right r
+ { l bin op { 180d @Rotate 1.2f @Font triangle } r }
+ def vee left l right r
+ { l bin op { logicalor } r }
+ def wedge left l right r
+ { l bin op { logicaland } r }
+ def oplus left l right r
+ { l bin op { circleplus } r }
+ def ominus left l right r
+ { l bin op { @OneRow @HContract { circle /0io &0.5rt minus } } r }
+ def otimes left l right r
+ { l bin op { circlemultiply } r }
+ def oslash left l right r
+ { l
+ bin op { `vctr 60d @Rotate @HContract {circle /0io &0.5rt minus`} }
+ r }
+ def odot left l right r
+ { l bin op { @OneRow @HContract {circle /0io &0.5rt @PureDot } } r }
+ def dagger left l right r
+ { l bin op { @Base @Char "dagger" } r }
+ def daggerdbl left l right r
+ { l bin op { @Base @Char "daggerdbl" } r }
+ def amalg left l right r
+ { l bin op { 180d @Rotate vctr product } r }
+
+ ###################################################################
+ # #
+ # Group 8 (relations) #
+ # #
+ # All Knuth's operators are available, but many have been #
+ # given different, more mnemonic names. Also included is #
+ # a not operator for negating the relations. #
+ # #
+ ###################################################################
+
+ def "<" precedence @OrderingPrec left l right r
+ { l rel op { less } r }
+ def ">" precedence @OrderingPrec left l right r
+ { l rel op { greater } r }
+ def "=" precedence @EqualityPrec left l right r
+ { l rel op { equal } r }
+ def "<=" precedence @OrderingPrec left l right r
+ { l rel op { lessequal } r }
+ def prec left l right r
+ { l
+ rel op { 0.45f @Font "-90d"
+ @Rotate { parenrighttp ^| parenlefttp } }
+ r }
+ def preceq { rel { @OneRow non prec /0.1f minus } }
+ def "<<" precedence @OrderingPrec left l right r
+ { l rel op { less less } r }
+ def subset precedence @OrderingPrec left l right r
+ { l rel op { propersubset } r }
+ def subseteq precedence @OrderingPrec left l right r
+ { l rel op { reflexsubset } r }
+ def sqsubseteq precedence @OrderingPrec left l right r
+ { l
+ rel op { @HContract @VContract
+ @BackEnd @Case {
+ PostScript @Yield {
+ { { "xsize 0 moveto"
+ "0 0 lineto"
+ "0 ysize lineto"
+ "xsize ysize lineto"
+ "0.04 ft setlinewidth stroke"
+ }
+ @Graphic
+ { 0.5f @Wide 0.25f @High ^/
+ 0.25f @High
+ }
+ /0.1f minus
+ }
+ }
+ PDF @Yield {
+ { { "__mul(__loutf, 0.04) w"
+ "__xsize 0 m"
+ "0 0 l"
+ "0 __ysize l"
+ "__xsize __ysize l s"
+ }
+ @Graphic
+ { 0.5f @Wide 0.25f @High ^/
+ 0.25f @High
+ }
+ /0.1f minus
+ }
+ }
+ }
+ }
+ r }
+
+ def in precedence @OrderingPrec left l right r
+ { l rel op { element } r }
+ def vdash precedence @OrderingPrec left l right r
+ { l rel op { vctr {"-90d" @Rotate perpendicular} } r }
+ def smile precedence @OrderingPrec left l right r
+ { l rel op { vctr 90d @Rotate parenleft } r }
+ def frown precedence @OrderingPrec left l right r
+ { l rel op { vctr 90d @Rotate parenright } r }
+
+ def ">=" precedence @OrderingPrec left l right r
+ { l rel op { greaterequal } r }
+ def succ precedence @OrderingPrec left l right r
+ { l
+ rel op { 0.45f @Font 90d @Rotate
+ { parenrighttp ^| parenlefttp } }
+ r }
+ def succeq precedence @OrderingPrec left l right r
+ { l rel op { @OneRow non succ /0.1f minus } r }
+ def ">>" precedence @OrderingPrec left l right r
+ { l rel op { greater greater } r }
+ def supset precedence @OrderingPrec left l right r
+ { l rel op { propersuperset } r }
+ def supseteq precedence @OrderingPrec left l right r
+ { l rel op { reflexsuperset } r }
+ def sqsupseteq precedence @OrderingPrec left l right r
+ { l
+ rel op { @HContract @VContract
+ @BackEnd @Case {
+ PostScript @Yield {
+ { { "0 0 moveto xsize 0 lineto"
+ "xsize ysize lineto"
+ "0 ysize lineto"
+ "0.04 ft setlinewidth stroke"
+ }
+ @Graphic
+ { 0.5f @Wide 0.25f @High ^/
+ 0.25f @High
+ }
+ /0.1f minus
+ }
+ }
+ PDF @Yield {
+ { { "__mul(__loutf, 0.04) w"
+ "0 0 m __xsize 0 l"
+ "__xsize __ysize l"
+ "0 __ysize l s"
+ }
+ @Graphic
+ { 0.5f @Wide 0.25f @High ^/
+ 0.25f @High
+ }
+ /0.1f minus
+ }
+ }
+ }
+ }
+ r }
+ def ni precedence @OrderingPrec left l right r
+ { l rel op { 180d @Rotate element } r }
+ def dashv precedence @OrderingPrec left l right r
+ { l rel op { vctr {90d @Rotate perpendicular} } r }
+ def mid precedence @OrderingPrec left l right r
+ { l rel op { @Base "|" } r }
+ def parallel precedence @OrderingPrec left l right r
+ { l rel op { @Base "||" } r }
+
+ def "==" precedence @EqualityPrec left l right r
+ { l rel op { equivalence } r }
+ def "~" precedence @EqualityPrec left l right r
+ { l rel op { similar } r }
+ def "-~" precedence @EqualityPrec left l right r
+ { l rel op { @OneRow{similar^/0.07f/0.07f minus} } r }
+ def asymp precedence @EqualityPrec left l right r
+ { l
+ rel op { 0.7f @Font @OneRow
+ { 90d @Rotate parenleft ^/0.008f
+ /0.008f 90d @Rotate parenright } }
+ r }
+ def "~~" precedence @EqualityPrec left l right r
+ { l rel op { approxequal } r }
+ def "=~" precedence @EqualityPrec left l right r
+ { l rel op { congruent } r }
+ def bowtie precedence @EqualityPrec left l right r
+ { l rel op { non triangleright non triangleleft } r }
+ def propto precedence @EqualityPrec left l right r
+ { l rel op { proportional } r }
+ def models precedence @EqualityPrec left l right r
+ { l rel op { @Base vctr "|" &0.05fo vctr equal } r }
+ def trieq precedence @EqualityPrec left l right r
+ { l
+ rel op { @OneRow @HContract {&0.5rt small triangle^/0.15f equal} }
+ r }
+ def doteq precedence @EqualityPrec left l right r
+ { l
+ rel op { @OneRow @HContract { &0.5rt dotmath^/0.15f equal } }
+ r }
+ def perp precedence @EqualityPrec left l right r
+ { l rel op { perpendicular } r }
+
+ def notsub precedence @OrderingPrec left l right r
+ { l rel op { notsubset } r }
+ def notin precedence @OrderingPrec left l right r
+ { l rel op { notelement } r }
+ def "!=" precedence @EqualityPrec left l right r
+ { l rel op { notequal } r }
+
+ def "<->" left l right r
+ { l rel op { arrowboth } r }
+ def "<--" left l right r
+ { l rel op { arrowleft } r }
+ def "-->" left l right r
+ { l rel op { arrowright } r }
+ def up left l right r
+ { l rel op { arrowup } r }
+ def down left l right r
+ { l rel op { arrowdown } r }
+ def "<=>" left l right r
+ { l rel op { arrowdblboth } r }
+ def "<==" left l right r
+ { l rel op { arrowdblleft } r }
+ def "==>" left l right r
+ { l rel op { arrowdblright } r }
+ def dblup left l right r
+ { l rel op { arrowdblup } r }
+ def dbldown left l right r
+ { l rel op { arrowdbldown } r }
+
+ def ":" left l right r
+ { l rel op { colon } r }
+ def "::" left l right r
+ { l rel op { @OneCol {colon ` colon} } r }
+ def ":=" left l right r
+ { l rel op { colon{ //0.05fo equal } } r }
+
+ def not right x { @HContract {@OneCol x /0co &0.5rt slash}}
+
+
+ ###################################################################
+ # #
+ # Groups 11 and 12 - openings and closings. #
+ # #
+ ###################################################################
+
+ def lpar { parenleft }
+ def rpar { parenright }
+ def lbrack { bracketleft }
+ def rbrack { bracketright }
+ def lbrace { braceleft }
+ def rbrace { braceright }
+ def lfloor { ` "-0.15f" @VShift bracketleftbt }
+ def rfloor { "-0.15f" @VShift bracketrightbt ` }
+ def lceil { ` "-0.1f" @VShift bracketlefttp }
+ def rceil { "-0.1f" @VShift bracketrighttp ` }
+ def langle { angleleft }
+ def rangle { angleright }
+
+ def blpar { @OneRow {parenlefttp ^/ parenleftex / parenleftbt } }
+ def brpar { @OneRow {parenrighttp ^/ parenrightex / parenrightbt } }
+ def blbrack { @OneRow {bracketlefttp ^/ bracketleftex / bracketleftbt } }
+ def brbrack { @OneRow {bracketrighttp ^/ bracketrightex / bracketrightbt} }
+ def blbrace { @OneRow {bracelefttp ^/ braceleftmid / braceleftbt } }
+ def brbrace { @OneRow {bracerighttp ^/ bracerightmid / bracerightbt } }
+ def blfloor { @OneRow {bracketleftex ^/ bracketleftex / bracketleftbt } }
+ def brfloor { @OneRow {bracketrightex ^/ bracketrightex / bracketrightbt} }
+ def blceil { @OneRow {bracketlefttp ^/ bracketleftex / bracketleftex } }
+ def brceil { @OneRow {bracketrighttp ^/ bracketrightex / bracketrightex} }
+ def blangle { @HContract @VContract
+ @BackEnd @Case {
+ PostScript @Yield {
+ { "xsize 0 moveto"
+ "0 ysize 2 div lineto"
+ "xsize ysize lineto"
+ "0.04 ft setlinewidth stroke"
+ }
+ @Graphic { 0.5f @Wide 2f @High ^/ 2f @High }
+ }
+ PDF @Yield {
+ { "__mul(__loutf, 0.04) w"
+ "__xsize 0 m"
+ "0 __div(__ysize, 2) l"
+ "__xsize __ysize l S"
+ }
+ @Graphic { 0.5f @Wide 2f @High ^/ 2f @High }
+ }
+ }
+ }
+ def brangle { @HContract @VContract
+ @BackEnd @Case {
+ PostScript @Yield {
+ { "0 0 moveto"
+ "xsize ysize 2 div lineto"
+ "0 ysize lineto"
+ "0.04 ft setlinewidth stroke"
+ }
+ @Graphic { 0.5f @Wide 2f @High ^/ 2f @High }
+ }
+ PDF @Yield {
+ { "__mul(__loutf, 0.04) w"
+ "0 0 m"
+ "__xsize __div(__ysize, 2) l"
+ "0 __ysize l S"
+ }
+ @Graphic { 0.5f @Wide 2f @High ^/ 2f @High }
+ }
+ }
+ }
+
+
+ ###################################################################
+ # #
+ # Group 13 - punctuation. #
+ # #
+ ###################################################################
+
+ def ";" precedence @PunctuationPrec left l right r
+ { l punct symbol { semicolon } r }
+ def "," precedence @PunctuationPrec left l right r
+ { l punct symbol { comma } r }
+ def col precedence @PunctuationPrec left l right r
+ { l punct symbol { colon } r }
+
+
+ ###################################################################
+ # #
+ # Additional short symbols (Knuth p. 132) #
+ # #
+ ###################################################################
+
+ def "!" { exclam }
+ def "?" { question }
+ def "%" { percent }
+ def "(" { parenleft }
+ def ")" { parenright }
+ def "[" { bracketleft }
+ def "]" { bracketright }
+
+
+ ###################################################################
+ # #
+ # Common mathematical functions (from Knuth p. 162). #
+ # mod is included, since @Rel mod is easily typed if needed. #
+ # #
+ ###################################################################
+
+ def arccos { @Base "arccos" }
+ def arcsin { @Base "arcsin" }
+ def arctan { @Base "arctan" }
+ def arg { @Base "arg" }
+ def cos { @Base "cos" }
+ def cosh { @Base "cosh" }
+ def cot { @Base "cot" }
+ def coth { @Base "coth" }
+ def csc { @Base "csc" }
+ def deg { @Base "deg" }
+ def det { @Base "det" }
+ def dim { @Base "dim" }
+ def exp { @Base "exp" }
+ def gcd { @Base "gcd" }
+ def hom { @Base "hom" }
+ def inf { @Base "inf" }
+ def ker { @Base "ker" }
+ def lg { @Base "lg" }
+ def lim { @Base "lim" }
+ def liminf { @OneCol { @Base "lim" ` @Base "inf" } }
+ def limsup { @OneCol { @Base "lim" ` @Base "sup" } }
+ def ln { @Base "ln" }
+ def log { @Base "log" }
+ def max { @Base "max" }
+ def min { @Base "min" }
+ def Pr { @Base "Pr" }
+ def sec { @Base "sec" }
+ def sin { @Base "sin" }
+ def sinh { @Base "sinh" }
+ def supr { @Base "sup" }
+ def tan { @Base "tan" }
+ def tanh { @Base "tanh" }
+ def mod { @Base "mod" }
+
+
+ ###################################################################
+ # #
+ # Arrow symbols. #
+ # #
+ ###################################################################
+
+ def leftarrow { arrowleft }
+ def longleftarrow { { 1.6 1 } @Scale arrowleft }
+ def dblleftarrow { arrowdblleft }
+ def dbllongleftarrow { { 1.6 1 } @Scale arrowdblleft }
+ def rightarrow { arrowright }
+ def longrightarrow { { 1.6 1 } @Scale arrowright }
+ def dblrightarrow { arrowdblright }
+ def dbllongrightarrow { { 1.6 1 } @Scale arrowdblright }
+ def leftrightarrow { arrowboth }
+ def longleftrightarrow { { 1.6 1 } @Scale arrowboth }
+ def dblleftrightarrow { arrowdblboth }
+ def dbllongleftrightarrow { { 1.6 1 } @Scale arrowdblboth }
+
+ def mapsto
+ {
+ @HContract @VContract {
+ @BackEnd @Case {
+ PostScript @Yield {
+ "0 ymark 0.16 ft sub moveto 0 ymark 0.16 ft add lineto stroke"
+ @Graphic arrowright
+ }
+ PDF @Yield {
+ "0 __sub(__ymark, __mul(__loutf, 0.16)) m 0 __add(__ymark, __mul(__loutf, 0.16)) l S"
+ @Graphic arrowright
+ }
+ }
+ }
+ }
+
+ def longmapsto
+ {
+ @HContract @VContract {
+ @BackEnd @Case {
+ PostScript @Yield {
+ "0 ymark 0.16 ft sub moveto 0 ymark 0.16 ft add lineto stroke"
+ @Graphic { { 1.6 1 } @Scale arrowright }
+ }
+ PDF @Yield {
+ "0 __sub(__ymark, __mul(__loutf, 0.16)) m 0 __add(__ymark, __mul(__loutf, 0.16)) l S"
+ @Graphic { { 1.6 1 } @Scale arrowright }
+ }
+ }
+ }
+ }
+
+ def hookleftarrow
+ {
+ @HContract @VContract {
+ @BackEnd @Case {
+
+ PostScript @Yield {
+ "xsize ymark moveto xsize ymark 0.1 ft add 0.1 ft -90 90 arc stroke"
+ @Graphic leftarrow
+ }
+
+ PDF @Yield {
+#
+# VT: draws a counterclockwise 180 degree arc from -90 to +90 degree positions
+# (straight down to straight up) with centre = (xsize, ymark + 0.1 ft)
+# and radius = 0.1 ft
+#
+# the control points therefore are:
+# pt1 = (xsize + (4/3 * 0.1 ft), ymark) and pt2 = (xsize + (4/3 * 0.1 ft), ymark + 0.2 ft)
+#
+ {
+ "__xsize __ymark m" # pt0
+ "__add(__xsize, __div(__mul(0.4, __loutf), 3)) __ymark" # pt1
+ "__add(__xsize, __div(__mul(0.4, __loutf), 3)) __add(__ymark, __mul(0.2, __loutf))" # pt2
+ "__xsize __add(__ymark, __mul(0.2, __loutf)) c S" # pt3
+ }
+ @Graphic leftarrow
+ }
+
+ }
+ }
+ }
+
+ def hookrightarrow
+ {
+ @HContract @VContract {
+ @BackEnd @Case {
+
+ PostScript @Yield {
+ "0 ymark moveto 0 0.1 ft ymark add 0.1 ft -90 90 arcn stroke"
+ @Graphic rightarrow
+ }
+
+ PDF @Yield {
+#
+# VT: draws a clockwise 180 degree arc from -90 to +90 degree positions
+# (straight down to straight up) with centre = (0, ymark + 0.1 ft)
+# and radius = 0.1 ft
+#
+# the control points therefore are:
+# pt1 = (-4/3 * 0.1 ft, ymark) and pt2 = (-4/3 * 0.1 ft, ymark + 0.2 ft)
+#
+ {
+ "0 __ymark m" # pt0
+ "__div(__mul(-0.4, __loutf), 3) __ymark" # pt1
+ "__div(__mul(-0.4, __loutf), 3) __add(__ymark, __mul(0.2, __loutf))" # pt2
+ "0 __add(__ymark, __mul(0.2, __loutf)) c S" # pt3
+ }
+ @Graphic rightarrow
+ }
+
+ }
+ }
+ }
+
+ def @ClipToSize right x
+ {
+ @HContract @VContract
+ @BackEnd @Case {
+ PostScript @Yield {
+ {
+ "grestore newpath 0 0 moveto xsize 0 lineto xsize ysize lineto"
+ "0 ysize lineto closepath clip gsave"
+ } @Graphic x
+ }
+ PDF @Yield {
+ "Q n 0 0 __xsize __ysize re W n q" @Graphic x
+ }
+ }
+ }
+
+ def @ClipAboveMark
+ left amount
+ right x
+ {
+ @ClipToSize { ^//{{amount}o} x }
+ }
+
+ def @ClipBelowMark
+ left amount
+ right x
+ {
+ @ClipToSize { x //{{amount}o} }
+ }
+
+ def leftharpoonup
+ {
+ 0.04f @ClipBelowMark leftarrow
+ }
+
+ def rightharpoonup
+ {
+ 0.04f @ClipBelowMark rightarrow
+ }
+
+ def leftharpoondown
+ {
+ 0.02f @ClipAboveMark leftarrow
+ }
+
+ def rightharpoondown
+ {
+ 0.02f @ClipAboveMark rightarrow
+ }
+
+ def rightleftharpoons
+ {
+ @HContract @VContract {
+ rightharpoonup
+ ^//0.1fo
+ //0.1fo
+ leftharpoondown
+ }
+ }
+
+ def leadsto { @HContract { similar &0.4fo arrowright } }
+
+ def uparrow { arrowup }
+ def dbluparrow { arrowdblup }
+ def downarrow { arrowdown }
+ def dbldownarrow { arrowdbldown }
+ def updownarrow { @HContract { arrowup &0io arrowdown } }
+ def dblupdownarrow { @VContract { arrowdblup ^//0.2fo arrowdbldown } }
+ def nearrow { 0.5w @VShift 0.5w @HShift 45d @Rotate arrowright }
+ def searrow { 0.5w @VShift 0.5w @HShift 315d @Rotate arrowright }
+ def swarrow { 0.5w @VShift 0.5w @HShift 225d @Rotate arrowright }
+ def nwarrow { 0.5w @VShift 0.5w @HShift 135d @Rotate arrowright }
+
+
+ ###################################################################
+ # #
+ # Other symbols taken from TeX. #
+ # #
+ ###################################################################
+
+ def ldots { . &0.3f . &0.3f . }
+ def cdots { dotmath &0.3f dotmath &0.3f dotmath }
+ def vdots { @OneRow { dotmath ^/0.3f dotmath /0.3f dotmath } }
+ def ddots { @OneCol @OneRow
+ { dotmath
+ ^/0.3f |0.3f dotmath
+ /0.3f | |0.3f dotmath
+ }
+ }
+
+
+ ###################################################################
+ # #
+ # Symbols taken from eqn (Kernighan and Cherry 1975). #
+ # #
+ ###################################################################
+
+ def del { gradient }
+ def grad { gradient }
+ def "..." { ellipsis }
+ def ",...," { , ellipsis ``` , }
+ def "'" { minute }
+ def "''" { minute minute }
+ def "'''" { minute minute minute }
+ def "''''" { minute minute minute minute }
+ def empty { emptyset }
+
+
+
+ ###################################################################
+ # #
+ # Miscellaneous #
+ # #
+ ###################################################################
+
+ def triangleup { 0.8f @Font triangle }
+ def triangledown { 180d @Rotate 0.8f @Font triangle }
+
+ ###################################################################
+ # #
+ # Symbols with parameters. #
+ # #
+ # These symbols are essentially those of eqn, with some #
+ # changes and additions. #
+ # #
+ ###################################################################
+
+ def @OrDefault
+ left l
+ right r
+ {
+ l @Case {
+ "dft" @Yield r
+ else @Yield l
+ }
+ }
+
+ def sup
+ precedence @FactorialPrec
+ associativity left
+ left x
+ named gap { "dft" }
+ right y
+ {
+ @HContract @VContract
+ { | @SuperScriptStyle y
+ ^/{ gap @OrDefault @CurrSuperScriptGap } x
+ }
+ }
+
+ def sub
+ precedence 72
+ associativity left
+ left x
+ named gap { @SubScriptGap }
+ right y
+ {
+ @HContract @VContract
+ {
+ "." @KernShrink x
+ /gap | @SubScriptStyle y
+ }
+ }
+
+ def tsub
+ precedence 72
+ associativity left
+ left x
+ named gap { @SubScriptGap }
+ right y
+ {
+ @HContract @VContract
+ {
+ x
+ /gap | &0io 0.2f @HShift @SubScriptStyle y
+ }
+ }
+
+ def supp
+ precedence @FactorialPrec
+ associativity left
+ left x
+ named gap { "dft" }
+ right y
+ {
+ @HContract @VContract
+ {
+ { ^/{ gap @OrDefault @CurrSuperScriptGap } x
+ /{ gap @OrDefault @CurrSuperScriptGap } }
+ | y
+ }
+ }
+
+ def on
+ precedence 74
+ associativity left
+ left x
+ right y
+ {
+ { @SuperScriptStyle x } ^/ /
+ { @SubScriptStyle y }
+ }
+
+ def ton
+ precedence 74
+ associativity left
+ left x
+ right y
+ {
+ @SuperScriptStyle x ^/ /
+ &0io 0.3f @HShift @SubScriptStyle y
+ }
+
+ def frac
+ precedence @DivisionPrec
+ associativity left
+ left x
+ named gap { 0.2f }
+ right y
+ {
+ @HContract @VContract
+ { 1w @VShift { @SuperScriptStyle { x } /gap }
+ | fraction &0io
+ | 0w @VShift { |gap @SubScriptStyle { y } }
+ }
+ }
+
+ def half { 1 frac 2 }
+ def third { 1 frac 3 }
+
+ def over
+ precedence @DivisionPrec
+ associativity left
+ left x
+ named gap { "dft" }
+ named belowgap { "dft" }
+ right y
+ {
+ def @AboveLineGap
+ {
+ gap @Case {
+ "dft" @Yield {
+ @CurrStyle @Case {
+ "display" @Yield 0.20f
+ else @Yield 0.10f
+ }
+ }
+ else @Yield gap
+ }
+ }
+
+ def @BelowLineGap
+ {
+ belowgap @Case {
+ "dft" @Yield {
+ @CurrStyle @Case {
+ "display" @Yield 0.15f
+ else @Yield 0.09f
+ }
+ }
+ else @Yield belowgap
+ }
+ }
+
+ @HContract @VContract
+ { |0.5rt @OneCol @NumeratorStyle x
+ ^//@AboveLineGap @HLine
+ //@BelowLineGap |0.5rt @OneCol @DenominatorStyle @Strut y
+ }
+ }
+
+
+ def dot
+ precedence @FactorialPrec
+ left x
+ named gap { @AboveGap }
+ {
+ x below gap { gap } skew { @SkewGap } .
+ }
+
+ def dotdot
+ precedence @FactorialPrec
+ left x
+ named gap { @AboveGap }
+ {
+ x below gap { gap } skew { @SkewGap } ..
+ }
+
+ def hat
+ precedence @FactorialPrec
+ left x
+ named gap { @AboveGap }
+ {
+ x below gap { gap } skew { @SkewGap } @Base "^"
+ }
+
+ def tilde
+ precedence @FactorialPrec
+ left x
+ named gap { @AboveGap }
+ {
+ x below gap { gap } skew { @SkewGap } @Base "~"
+ }
+
+ def vec
+ precedence @FactorialPrec
+ left x
+ named gap { @AboveGap }
+ {
+ x below gap { gap } skew { @SkewGap } arrowright
+ }
+
+ def dyad
+ precedence @FactorialPrec
+ left x
+ named gap { @AboveGap }
+ {
+ x below gap { gap } skew { @SkewGap } arrowboth
+ }
+
+ def overbar
+ precedence @FactorialPrec
+ left x
+ named gap { @AboveGap }
+ {
+ { @WithStyle style { @CurrStyle } cramped { "Yes" } x }
+ widebelow gap { gap } minus
+ }
+
+ def underbar
+ precedence @FactorialPrec
+ left x
+ named gap { @BelowGap }
+ {
+ x wideatop gap { gap } minus
+ }
+
+ def sqrt
+ precedence @ExponentPrec
+ named gap { @AboveGap }
+ right x
+ {
+ @BackEnd @Case {
+ PostScript @Yield {
+ @HContract @VContract
+ {
+ @VScale surd | @OneRow
+ {
+ @HLine line { "0.03 ft setlinewidth 2 setlinecap" }
+ ^//gap |gap @SquareRootStyle @Strut x # //gap
+ }
+ }
+ }
+ PDF @Yield {
+ @HContract @VContract
+ {
+#
+# VT: this PDF is correct but it renders badly in Acrobat (?problem
+# with scaling by fractional factors)
+# In other words, the @VScale value comes through correctly but it
+# looks ugly; GhostScript's translation actually expands the
+# "draw surd" instruction into raw moveto's and lineto's which
+# it presumably gets from the font's definition of the glyph!
+#
+ @VScale surd | @OneRow
+ {
+ @HLine line { "__mul(__loutf, 0.03) w 2 J" }
+ ^//gap |gap @SquareRootStyle @Strut x # //gap
+ }
+ }
+ }
+ }
+ }
+
+ def root
+ precedence @ExponentPrec
+ left x
+ right y
+ {
+ "" sup x &0io sqrt y
+ }
+
+ def zroot
+ precedence @ExponentPrec
+ left x
+ right y
+ {
+ def zsup right x { "+0.3f" @VShift 0.5f @Font x }
+
+ "-0.4f" @HShift { 1w @HShift { zsup x } } &0co sqrt y
+ }
+
+ export row axisrow col lcol ccol rcol mcol
+ def matrix
+ precedence 100
+ named gap { @CurrBinarySpaceGap }
+ named strut
+ named no { }
+ named No { }
+ named yes { 0.5f }
+ named Yes { 0.5f }
+ { No }
+ named atleft {}
+ named atright {}
+ named userow { No }
+ named shiftdelim { Yes }
+ body x
+ {
+ def @Strut
+ {
+ strut @Case {
+ "" @Yield {}
+ else @Yield { @OneRow { strut @High ^/ strut @High } }
+ }
+ }
+
+ def newrow
+ precedence 50
+ associativity left
+ left x
+ right y
+ {
+ x @Case {
+ "" @Yield { y | @Strut }
+ else @Yield { x /@RowGap y | @Strut }
+ }
+ }
+
+ macro row { newrow "" }
+
+ def newaxisrow
+ precedence 50
+ associativity left
+ left x
+ right y
+ {
+ x @Case {
+ "" @Yield { y | @Strut }
+ else @Yield { x ^/@RowGap y | @Strut }
+ }
+ }
+
+ macro axisrow { newaxisrow "" }
+
+ def col
+ precedence 52
+ associativity left
+ left x
+ named indent { 0.5rt }
+ right y
+ {
+ x @Case {
+ "" @Yield { &indent @OneCol y }
+ else @Yield { x |@ColGap &indent @OneCol y }
+ }
+ }
+
+ def lcol
+ precedence 52
+ associativity left
+ left x
+ right y
+ {
+ x col indent { 0i } y
+ }
+
+ def ccol
+ precedence 52
+ associativity left
+ left x
+ right y
+ {
+ x col indent { 0.5rt } y
+ }
+
+ def rcol
+ precedence 52
+ associativity left
+ left x
+ right y
+ {
+ x col indent { 1rt } y
+ }
+
+ def mcol
+ precedence 52
+ associativity left
+ left x
+ right y
+ {
+ x @Case {
+ "" @Yield { @OneCol y }
+ else @Yield { x |@ColGap @OneCol y }
+ }
+ }
+
+ def delim right x
+ {
+ x @Case
+ {
+ "" @Yield @Null
+ else @Yield
+ {
+ shiftdelim @Case {
+ { Yes yes } @Yield { @VScale x }
+ else @Yield { @VCover x }
+ }
+ }
+ }
+ }
+
+ @HContract @VContract {
+ delim atleft &@CurrPunctSpaceGap
+ userow @Case {
+ {Yes yes} @Yield @HContract @VContract {^//gap @OneRow x //gap}
+ else @Yield vctr @HContract @VContract { //gap x //gap }
+ }
+ &@CurrPunctSpaceGap delim atright
+ }
+ }
+
+ macro pmatrix { matrix atleft { "1.5f" @Font ( } atright { "1.5f" @Font ) }}
+ macro bmatrix { matrix atleft { blbrack } atright { brbrack } }
+ macro brmatrix { matrix atleft { blbrace } atright { brbrace } }
+ macro fmatrix { matrix atleft { blfloor } atright { brfloor } }
+ macro cmatrix { matrix atleft { blceil } atright { brceil } }
+ macro amatrix { matrix atleft { blangle } atright { brangle } }
+
+
+ ###################################################################
+ # #
+ # Group 5 (digits) #
+ # #
+ ###################################################################
+
+ def "0" { zero }
+ def "1" { one }
+ def "2" { two }
+ def "3" { three }
+ def "4" { four }
+ def "5" { five }
+ def "6" { six }
+ def "7" { seven }
+ def "8" { eight }
+ def "9" { nine }
+
+
+
+ basefont @Font
+ { Slope xheight2mark nostrut } @Font { initialspace } @Space
+ { @CurrStyleVar @Yield initialstyle } @SetContext {
+ { @CrampedVar @Yield initiallycramped } @SetContext {
+ @Body
+ }
+ }
+
+@End @Math
+
+# In-line equations.
+macro @M { @HContract @VContract @Math initialstyle { "text" } }
diff --git a/include/save_bsf b/include/save_bsf
new file mode 100644
index 0000000..40e15f7
--- /dev/null
+++ b/include/save_bsf
@@ -0,0 +1,1826 @@
+
+###############################################################################
+# #
+# Lout @BasicSetup package #
+# #
+# Jeffrey H. Kingston #
+# #
+# This package contains basic symbols used widely throughout many #
+# documents, for font changes, particular characters, standard words in #
+# the current language, date and time, paragraphs, lists, colours, #
+# rules, and boxes. #
+# #
+###############################################################################
+
+@SysInclude { lengths } # @PSLengths
+@SysInclude { coltex } # @ColourCommand and @TextureCommand
+@SysPrependGraphic { bsf.lpg } # rules, boxes, margin note setup
+
+
+###############################################################################
+# #
+# The following symbols are defined outside @BasicSetup so that #
+# they can be invoked when setting its parameters in the @Use clause. #
+# #
+###############################################################################
+
+def @OrIfPlain
+ precedence 80
+ left x
+ right y
+{
+ @BackEnd @Case {
+ PlainText @Yield y
+ else @Yield x
+ }
+}
+
+###########################################################################
+# #
+# @Colour, @Color #
+# #
+###########################################################################
+
+def @Colour @Color left col right y { {@ColourCommand col} @SetColour y }
+
+
+###########################################################################
+# #
+# @ColouredUnderline, @ColoredUnderline #
+# #
+###########################################################################
+
+def @ColouredUnderline @ColoredUnderline left col right y {
+ {@ColourCommand col} @SetUnderlineColour @Underline y
+}
+
+
+###########################################################################
+# #
+# @Texture #
+# #
+###########################################################################
+
+
+def @Texture
+ left type
+ named scale { 1 }
+ named hscale { 1 }
+ named vscale { 1 }
+ import @PSLengths named angle { 0d }
+ import @PSLengths named hshift { 0i }
+ import @PSLengths named vshift { 0i }
+ import @PSLengths named width { "dft" }
+ import @PSLengths named height { "dft" }
+ import @PSLengths named gap { "dft" }
+ import @PSLengths named radius { "dft" }
+ import @PSLengths named linewidth { "dft" }
+ named font { "dft" }
+ import @PSLengths named size { "dft" }
+ named value { "dft" }
+ right x
+{
+ { type @TextureCommand
+ scale { scale }
+ hscale { hscale }
+ vscale { vscale }
+ angle { angle }
+ hshift { hshift }
+ vshift { vshift }
+ width { width }
+ height { height }
+ gap { gap }
+ radius { radius }
+ linewidth { linewidth }
+ font { font }
+ size { size }
+ value { value }
+ } @SetTexture x
+}
+
+
+###############################################################################
+# #
+# Symbols exported by @BasicSetup. #
+# #
+###############################################################################
+
+export
+
+ @InitialFont @InitialBreak @InitialOutdent @InitialSpace @InitialLanguage
+ @InitialColour @OptimizePages @HeadingFont
+ @ParaGap @ParaIndent @DisplayGap @DisplayIndent @DefaultIndent
+ @DisplayNumStyle @WideIndent @VeryWideIndent
+ @ListGap @ListIndent @ListRightIndent
+ @ListLabelWidth @ListLabelRight @ListLabelRightGap @ListFont @ListBreak
+ @NumberSeparator
+
+ @Pipe @PipeVerbatim @PipeRawVerbatim
+
+ @Word @Roman @UCRoman @Alpha @UCAlpha @FnBullets @FnSymbols
+ @Months @ShortMonths @WeekDays @ShortWeekDays
+ @TwelveHours @ShortHours @MeriDiems @ShortMeriDiems
+
+ @Sym @Ding @R @I @B @BI @S @F @II
+ "~" "~~" "``" "''" ",," "--" "---" "..."
+
+ @Bullet @ParSym @SectSym @Dagger @DaggerDbl @CDot @Sterling @Yen @Florin
+ @Star @Degree @Minute @Second @Multiply @Divide @Lozenge @Register
+ @CopyRight @TradeMark @Euro
+
+ @Date @Time @DateTimeFormat @DropCapTwo @DropCapThree @Centre @Right
+ @NoDotSep @NoDotJoin @Join @Sep @DotSep @ColonSep @DotJoin @DashJoin
+ @NumSep @VStrut @ZeroWidth @ZeroHeight @OverStrike @Sup @Sub @HClip @VClip
+ @FullWidthRule @LocalWidthRule @Box @CurveBox @ShadowBox @BoundaryMarks
+ @NumberMarker @NumberOf @TitleMarker @TitleOf
+ @PageMarker @PageMark @NoLinkPageMark @PageOf @CrossLink @ExternalLink
+
+ @BeginDisplayCounter
+
+ @Heading "^" "&-" @If @Not @And @Or @True
+ @PP @LP @LLP @DP @LOP @NP @CNP
+
+ @BeginAlignedDisplays
+ @EndAlignedDisplays
+
+ @Display
+ @LeftDisplay
+ @IndentedDisplay
+ @QuotedDisplay
+ @CentredDisplay
+ @RightDisplay
+ @AlignedDisplay
+ @LeftAlignedDisplay
+ @IndentedAlignedDisplay
+ @QuotedAlignedDisplay
+ @CentredAlignedDisplay
+ @RightAlignedDisplay
+ @NumberedDisplay
+ @LeftNumberedDisplay
+ @IndentedNumberedDisplay
+ @QuotedNumberedDisplay
+ @CentredNumberedDisplay
+ @RightNumberedDisplay
+ @AlignedNumberedDisplay
+ @LeftAlignedNumberedDisplay
+ @IndentedAlignedNumberedDisplay
+ @QuotedAlignedNumberedDisplay
+ @CentredAlignedNumberedDisplay
+ @RightAlignedNumberedDisplay
+
+ @RawDisplay
+ @RawLeftDisplay
+ @RawIndentedDisplay
+ @RawQuotedDisplay
+ @RawCentredDisplay
+ @RawRightDisplay
+ @RawAlignedDisplay
+ @RawLeftAlignedDisplay
+ @RawIndentedAlignedDisplay
+ @RawQuotedAlignedDisplay
+ @RawCentredAlignedDisplay
+ @RawRightAlignedDisplay
+ @RawNumberedDisplay
+ @RawLeftNumberedDisplay
+ @RawIndentedNumberedDisplay
+ @RawQuotedNumberedDisplay
+ @RawCentredNumberedDisplay
+ @RawRightNumberedDisplay
+ @RawAlignedNumberedDisplay
+ @RawLeftAlignedNumberedDisplay
+ @RawIndentedAlignedNumberedDisplay
+ @RawQuotedAlignedNumberedDisplay
+ @RawCentredAlignedNumberedDisplay
+ @RawRightAlignedNumberedDisplay
+
+ @ListItem
+ @ParagraphItem
+ @ListInterruptItem
+ @ListNewPage
+ @DropListItem
+ @TagItem
+ @DropTagItem
+
+ @EndList
+ @RawEndList
+
+ @RawList
+ @RawLeftList
+ @RawIndentedList
+ @RawQuotedList
+ @RawCentredList @RawCenteredList
+ @RawNumberedList
+ @RawParenNumberedList
+ @RawRomanList
+ @RawParenRomanList
+ @RawUCRomanList
+ @RawParenUCRomanList
+ @RawAlphaList
+ @RawParenAlphaList
+ @RawUCAlphaList
+ @RawParenUCAlphaList
+ @RawBulletList
+ @RawStarList
+ @RawDashList
+ @RawTaggedList
+ @RawWideTaggedList
+ @RawVeryWideTaggedList
+
+ @List
+ @LeftList
+ @IndentedList
+ @QuotedList
+ @CentredList @CenteredList
+ @NumberedList
+ @ParenNumberedList
+ @RomanList
+ @ParenRomanList
+ @UCRomanList
+ @ParenUCRomanList
+ @AlphaList
+ @ParenAlphaList
+ @UCAlphaList
+ @ParenUCAlphaList
+ @BulletList
+ @StarList
+ @DashList
+ @TaggedList
+ @WideTaggedList
+ @VeryWideTaggedList
+
+
+###############################################################################
+# #
+# The @BasicSetup package. #
+# #
+###############################################################################
+
+def @BasicSetup
+ named @InitialFont { Times Base 12p } # initial font
+ named @InitialBreak { {adjust 1.20fx hyphen} @OrIfPlain
+ {ragged 1fx nohyphen} } # initial break
+ named @InitialOutdent { 2f @OrIfPlain 4s } # initial outdent
+ named @InitialSpace { lout } # initial space style
+ named @InitialLanguage{ English } # initial language
+ named @InitialColour { black } # initial colour
+ named @OptimizePages { No } # optimize page breaks?
+ named @HeadingFont { Bold } # font for @Heading
+ named @FixedWidthFont { Courier Base -1p } # font for @F
+ named @ParaGap { 1.3vx @OrIfPlain 1f } # gap between paragraphs
+ named @ParaIndent { 2.0f @OrIfPlain 5s } # first-line indent for @PP
+ named @DisplayGap { 1.0v @OrIfPlain 1f } # gap above, below displays
+ named @DisplayIndent { 2.0f @OrIfPlain 5s } # @IndentedDisplay indent
+ named @DefaultIndent { 0.5rt } # @Display indent
+ named @DisplayNumStyle
+ right num { (num) } # display number style
+ named @WideIndent { 4.0f @OrIfPlain 10s } # @WideTaggedList indent
+ named @VeryWideIndent { 8.0f @OrIfPlain 20s } # @VeryWideTaggedList indent
+ named @ListOuterGap { 1.0v @OrIfPlain 1f } # gap before, after list
+ named @ListGap { 1.0v @OrIfPlain 1f } # gap between list items
+ named @ListIndent { 0s } # indent of list items
+ named @ListRightIndent{ 0s } # right indent of list items
+ named @ListLabelWidth { 2.0f @OrIfPlain 5s } # width allowed for list tags
+ named @ListLabelRight { No } # right align label
+ named @ListLabelRightGap { 2s } # right align gap
+ named @ListFont { } # font style of list item
+ named @ListBreak { } # break style of list item
+ named @NumberSeparator{ . } # separates numbers like 2.3.7
+ import @BasicSetup
+ named @CrossLinkFormat
+ right @Body { @Body } # format for cross links
+ import @BasicSetup
+ named @ExternalLinkFormat
+ right @Body { @Body } # format for external links
+@Begin
+
+ ###########################################################################
+ # #
+ # x @Dft y #
+ # #
+ # This returns x unless its value is "dft", in which case it returns y. #
+ # Useful for defaulting the value of one parameter to another. #
+ # #
+ ###########################################################################
+
+ def @Dft
+ left x
+ right y
+ {
+ x @Case {
+ dft @Yield y
+ else @Yield x
+ }
+ }
+
+
+ ###########################################################################
+ # #
+ # @Pipe, @PipeVerbatim, and @PipeRawVerbatim #
+ # #
+ ###########################################################################
+
+ def @Pipe
+ left command
+ right x
+ {
+ def @Filter { "cat" @FilterIn "|" command ">" @FilterOut }
+
+ x
+ }
+
+ def @PipeVerbatim
+ left command
+ right x
+ {
+ def @Filter {
+ "(echo @Verbatim @Begin ; (cat" @FilterIn "|" command "); echo @End @Verbatim ) >" @FilterOut }
+
+ x
+ }
+
+ def @PipeRawVerbatim
+ left command
+ right x
+ {
+ def @Filter {
+ "(echo @RawVerbatim @Begin ; (cat" @FilterIn "|" command "); echo @End @Verbatim ) >" @FilterOut }
+
+ x
+ }
+
+
+ ###########################################################################
+ # #
+ # @Sym, @Ding font symbols, and miscellaneous special characters. #
+ # #
+ ###########################################################################
+
+ def @Sym right x { { Symbol Base } @Font @Char x }
+ def @Ding right x { { Dingbats Base } @Font @Char x }
+
+ def @R right x { Base @Font x }
+ def @I right x { Slope @Font x }
+ def @B right x { Bold @Font x }
+ def @BI right x { BoldSlope @Font x }
+ def @S right x { smallcaps @Font x }
+ def @F right x { @FixedWidthFont @Font x }
+
+ def @II
+ right x
+ {
+ { @CurrFace @Case {
+ Bold @Yield BoldSlope
+ else @Yield Slope
+ } } @Font x
+ }
+
+ def "~" left x right y { x &1su y }
+ def "~~" left x right y { x &2s y }
+
+ def "``" { @Char "quotedblleft" @OrIfPlain "``" }
+ def "''" { @Char "quotedblright" @OrIfPlain "''" }
+ def ",," { @Char "quotedblbase" @OrIfPlain ",," }
+ def "--" { @Char "endash" @OrIfPlain "--" }
+ def "---" { @Char "emdash" @OrIfPlain "---"}
+ def "..." { @Char "ellipsis" @OrIfPlain "..."}
+ def @Bullet { @Char "bullet" @OrIfPlain "o" }
+ def @ParSym { @Char "paragraph" @OrIfPlain "P" }
+ def @SectSym { @Char "section" @OrIfPlain "$" }
+ def @Dagger { @Char "dagger" @OrIfPlain "+" }
+ def @DaggerDbl { @Char "daggerdbl" @OrIfPlain "++" }
+ def @CDot { @Char "periodcentered" @OrIfPlain "." }
+ def @Sterling { @Char "sterling" @OrIfPlain "&" }
+ def @Yen { @Char "yen" @OrIfPlain "Y" }
+ def @Florin { @Char "florin" @OrIfPlain "f" }
+
+ def @Star { @Sym "asteriskmath" @OrIfPlain "*" }
+ def @Degree { @Sym "degree" @OrIfPlain "o" }
+ def @Minute { @Sym "minute" @OrIfPlain "'" }
+ def @Second { @Sym "second" @OrIfPlain "''" }
+ def @Multiply { @Sym "multiply" @OrIfPlain "x" }
+ def @Divide { @Sym "divide" @OrIfPlain "/" }
+ def @Lozenge { @Sym "lozenge" @OrIfPlain "O" }
+ def @Register { @Sym "registersans" @OrIfPlain "R" }
+ def @CopyRight { @Sym "copyrightsans" @OrIfPlain "C" }
+ def @TradeMark { @Sym "trademarksans" @OrIfPlain "TM" }
+
+ def @Euro
+ {
+ @BackEnd @Case {
+
+ PostScript @Yield {
+ 0.65w @VShift @VContract @HContract
+ "xsize ysize ysize 0.07 mul louteuro" @Graphic {
+ 0.7f @High 0.735f @Wide
+ }
+ }
+
+ PDF @Yield { EUR }
+
+ PlainText @Yield { EUR }
+ }
+ }
+
+
+ ###########################################################################
+ # #
+ # Symbols stored in the "standard" database #
+ # #
+ # @Word language-spacific words such as Chapter, etc. #
+ # @Roman lower case Roman numerals i, ii, ... , cc #
+ # @UCRoman upper case Roman numerals I, II, ... , CC #
+ # @Alpha lower case Roman alphabet a, b, ... , z #
+ # @UCAlpha upper case Roman alphabet A, B, ... , Z #
+ # @FnBullets bullets as footnote markers #
+ # @FnSymbols traditional footnote symbols asterisk, dagger, etc. #
+ # @Months months of the year: January, ... , December #
+ # @ShortMonths months of the year, abbreviated: Jan, ..., Dec #
+ # @WeekDays days of the week: Sunday, ... , Saturday #
+ # @ShortWeekDays days of the week, abbreviated: Sun, ... , Sat #
+ # @TwelveHours hours, from 1 to 12 #
+ # @ShortHours hours, from 0 to 23 #
+ # @DateTimeFormat format of results of @Date and @Time #
+ # #
+ ###########################################################################
+
+ def @Word left @Tag right @Val { @Val }
+ def @Roman left @Tag right @Val { @Val }
+ def @UCRoman left @Tag right @Val { @Val }
+ def @Alpha left @Tag right @Val { @Val }
+ def @UCAlpha left @Tag right @Val { @Val }
+ def @FnBullets left @Tag right @Val { @Val }
+ def @FnSymbols left @Tag right @Val { @Val }
+ def @Months left @Tag right @Val { @Val }
+ def @ShortMonths left @Tag right @Val { @Val }
+ def @WeekDays left @Tag right @Val { @Val }
+ def @ShortWeekDays left @Tag right @Val { @Val }
+ def @TwelveHours left @Tag right @Val { @Val }
+ def @ShortHours left @Tag right @Val { @Val }
+ def @MeriDiems left @Tag right @Val { @Val }
+ def @ShortMeriDiems left @Tag right @Val { @Val }
+
+ export @Value
+ def @DateTimeFormat left @Tag
+ named @Value
+ named @Year {}
+ named @ShortYear {}
+ named @Month {}
+ named @ShortMonth {}
+ named @MonthNum {}
+ named @Day {}
+ named @ShortDay {}
+ named @DayNum {}
+ named @MeriDiem {}
+ named @ShortMeriDiem {}
+ named @Hour {}
+ named @TwelveHour {}
+ named @ShortHour {}
+ named @Minute {}
+ named @Second {}
+ {}
+ {}
+
+ @SysDatabase @Word @Roman @UCRoman @Alpha @UCAlpha @FnBullets @FnSymbols
+ @Months @ShortMonths @WeekDays @ShortWeekDays @TwelveHours
+ @ShortHours @MeriDiems @ShortMeriDiems @DateTimeFormat
+ { standard }
+
+
+ ###########################################################################
+ # #
+ # @Date and @Time: the date and time now. #
+ # #
+ ###########################################################################
+
+ def @Date
+ named @Format
+ named @Year { @Moment&&now @Open { {@Century}@Year }}
+ named @ShortYear { @Moment&&now @Open { @Year }}
+ named @Month { @Moment&&now @Open { @Months&&@Month }}
+ named @ShortMonth { @Moment&&now @Open { @ShortMonths&&@Month }}
+ named @MonthNum { @Moment&&now @Open { @Month }}
+ named @Day { @Moment&&now @Open { @WeekDays&&@WeekDay }}
+ named @ShortDay { @Moment&&now @Open { @ShortWeekDays&&@WeekDay}}
+ named @DayNum { @Moment&&now @Open { @Day }}
+ named @MeriDiem { @Moment&&now @Open { @MeriDiems&&@Hour }}
+ named @ShortMeriDiem{ @Moment&&now @Open { @ShortMeriDiems&&@Hour }}
+ named @Hour { @Moment&&now @Open { @Hour }}
+ named @TwelveHour { @Moment&&now @Open { @TwelveHours&&@Hour }}
+ named @ShortHour { @Moment&&now @Open { @ShortHours&&@Hour }}
+ named @Minute { @Moment&&now @Open { @Minute }}
+ named @Second { @Moment&&now @Open { @Second }}
+ {
+ @DateTimeFormat&&date @Open { @Value
+ @Year { @Year }
+ @ShortYear { @ShortYear }
+ @Month { @Month }
+ @ShortMonth { @ShortMonth }
+ @MonthNum { @MonthNum }
+ @Day { @Day }
+ @ShortDay { @ShortDay }
+ @DayNum { @DayNum }
+ @MeriDiem { @MeriDiem }
+ @ShortMeriDiem { @ShortMeriDiem }
+ @Hour { @Hour }
+ @TwelveHour { @TwelveHour }
+ @ShortHour { @ShortHour }
+ @Minute { @Minute }
+ @Second { @Second }
+ }
+ }
+ { @Format }
+
+ def @Time
+ named @Format
+ named @Year { @Moment&&now @Open { {@Century}@Year }}
+ named @ShortYear { @Moment&&now @Open { @Year }}
+ named @Month { @Moment&&now @Open { @Months&&@Month }}
+ named @ShortMonth { @Moment&&now @Open { @ShortMonths&&@Month }}
+ named @MonthNum { @Moment&&now @Open { @Month }}
+ named @Day { @Moment&&now @Open { @WeekDays&&@WeekDay }}
+ named @ShortDay { @Moment&&now @Open { @ShortWeekDays&&@WeekDay}}
+ named @DayNum { @Moment&&now @Open { @Day }}
+ named @MeriDiem { @Moment&&now @Open { @MeriDiems&&@Hour }}
+ named @ShortMeriDiem{ @Moment&&now @Open { @ShortMeriDiems&&@Hour }}
+ named @Hour { @Moment&&now @Open { @Hour }}
+ named @TwelveHour { @Moment&&now @Open { @TwelveHours&&@Hour }}
+ named @ShortHour { @Moment&&now @Open { @ShortHours&&@Hour }}
+ named @Minute { @Moment&&now @Open { @Minute }}
+ named @Second { @Moment&&now @Open { @Second }}
+ {
+ @DateTimeFormat&&time @Open { @Value
+ @Year { @Year }
+ @ShortYear { @ShortYear }
+ @Month { @Month }
+ @ShortMonth { @ShortMonth }
+ @MonthNum { @MonthNum }
+ @Day { @Day }
+ @ShortDay { @ShortDay }
+ @DayNum { @DayNum }
+ @MeriDiem { @MeriDiem }
+ @ShortMeriDiem { @ShortMeriDiem }
+ @Hour { @Hour }
+ @TwelveHour { @TwelveHour }
+ @ShortHour { @ShortHour }
+ @Minute { @Minute }
+ @Second { @Second }
+ }
+ }
+ { @Format }
+
+
+ ###########################################################################
+ # #
+ # @DropCapTwo and @DropCapThree #
+ # #
+ ###########################################################################
+
+ def @DropCapTwo
+ left y
+ named height { 1.5v }
+ right x
+ {
+ def @ParPlace { @Galley }
+ def @EndParPlace { @Galley }
+
+ def @LineList
+ {
+ @PAdjust @ParPlace
+ //1vx @LineList
+ }
+
+ def @ParGalley horizontally into { @ParPlace&&preceding }
+ right x
+ {
+ x
+ }
+
+ def @EndPar force into { @EndParPlace&&following } { @Null }
+
+ def @Cap
+ {
+ -0.25f @VShift 1.0w @VShift {
+ -90d @Rotate height @Wide @Scale 90d @Rotate y
+ }
+ }
+
+ |1s @PAdjust @ParPlace
+ /1vo @Cap @ParGalley {x & @EndPar &1rt } | @PAdjust @ParPlace
+ //1vx @LineList
+ // @EndParPlace
+ }
+
+ def @DropCapThree
+ left y
+ named height { 2.5v }
+ right x
+ {
+ def @ParPlace { @Galley }
+ def @EndParPlace { @Galley }
+
+ def @LineList
+ {
+ @PAdjust @ParPlace
+ //1vx @LineList
+ }
+
+ def @ParGalley force horizontally into { @ParPlace&&preceding }
+ right x
+ {
+ x
+ }
+
+ def @EndPar force into { @EndParPlace&&following } { @Null }
+
+ def @Cap
+ {
+ -0.25f @VShift 1.0w @VShift {
+ -90d @Rotate height @Wide @Scale 90d @Rotate y
+ }
+ }
+
+ |1s @PAdjust @ParPlace
+ /1vo @ParGalley { x & @EndPar &1rt } | @PAdjust @ParPlace
+ /1vo @Cap | @PAdjust @ParPlace
+ //1vx @LineList
+ // @EndParPlace
+ }
+
+
+ ###########################################################################
+ # #
+ # @Centre, @Center, @Right, @NoDotSep, @NoDotJoin, @DotSep, #
+ # @ColonSep, @DotJoin, @DashJoin, @NumSep #
+ # #
+ ###########################################################################
+
+ macro @Centre @Center { |0.5rt @HContract }
+
+ def @Right
+ precedence 50
+ left x
+ right y
+ { x |1.0rt @OneCol { 2f @Wide {} | y } }
+
+ def @NoDotSep left x right y
+ {
+ x @Case {
+ {} @Yield y
+ else @Yield {
+ y @Case {
+ {} @Yield x
+ else @Yield { x |2s y }
+ }
+ }
+ }
+ }
+
+ def @NoDotJoin left x right y
+ {
+ x @Case {
+ {} @Yield y
+ else @Yield {
+ y @Case {
+ {} @Yield x
+ else @Yield { x{y} }
+ }
+ }
+ }
+ }
+
+ def @DotSep left x right y
+ {
+ x @Case {
+ {} @Yield y
+ else @Yield {
+ y @Case {
+ {} @Yield x
+ else @Yield { x. |2s y }
+ }
+ }
+ }
+ }
+
+ def @ColonSep left x right y
+ {
+ x @Case {
+ {} @Yield y
+ else @Yield {
+ y @Case {
+ {} @Yield x
+ else @Yield { x: |2s y }
+ }
+ }
+ }
+ }
+
+ def @DotJoin left x right y
+ {
+ x @Case {
+ {} @Yield y
+ else @Yield {
+ y @Case {
+ {} @Yield x
+ else @Yield { x.y }
+ }
+ }
+ }
+ }
+
+ def @DashJoin left x right y
+ {
+ x @Case {
+ {} @Yield y
+ else @Yield {
+ y @Case {
+ {} @Yield x
+ else @Yield { x--y }
+ }
+ }
+ }
+ }
+
+ def @NumSep left x right y
+ {
+ x @Case {
+ {} @Yield y
+ else @Yield {
+ y @Case {
+ {} @Yield x
+ else @Yield {
+ @CurrLang @Case {
+ Hungarian @Yield { y. x }
+ else @Yield { x y }
+ }
+ }
+ }
+ }
+ }
+ }
+
+
+ ###########################################################################
+ # #
+ # @VStrut, @ZeroWidth, @ZeroHeight #
+ # #
+ ###########################################################################
+
+
+ def @VStrut
+ named above { 0.5f }
+ named below { 0.5f }
+ right x
+ {
+ x &0iu @VContract { above @High ^/ below @High }
+ }
+
+
+ def @ZeroWidth right x { @HContract { |0io x |0io } }
+
+ def @ZeroHeight right x { @VContract { /0io x /0io } }
+
+
+ ###########################################################################
+ # #
+ # @OverStrike, @Sup and @Sub #
+ # #
+ ###########################################################################
+
+ def @OverStrike left x right y
+ {
+ @OneRow { @HContract @VContract x /0io @HContract @VContract y }
+ }
+
+ def @Sup
+ left x
+ named gap { 0.40fk }
+ right y
+ {
+ @HContract @VContract
+ {
+ | 0.7f @Font y ^/gap x
+ }
+ }
+
+ def @Sub
+ left x
+ named gap { 0.40fk }
+ right y
+ {
+ @HContract @VContract
+ {
+ x /gap | 0.7f @Font y
+ }
+ }
+
+
+ ###########################################################################
+ # #
+ # @HClip and @VClip #
+ # #
+ ###########################################################################
+
+ def @HClip
+ named shift { 0.0 }
+ right x
+ {
+ { "newpath 0 0 moveto xsize 0 lineto xsize ysize lineto 0 ysize lineto"
+ "closepath clip gsave" // "grestore" } @Graphic
+ {
+ |{{shift}"rt"} @ZeroWidth {{shift}"w"} @HShift x |
+ }
+ }
+
+ def @VClip
+ named shift { 0.0 }
+ right x
+ {
+ { "newpath 0 0 moveto xsize 0 lineto xsize ysize lineto 0 ysize lineto"
+ "closepath clip gsave" // "grestore" } @Graphic
+ {
+ /{{shift}"rt"} @ZeroHeight {{shift}"w"} @VShift x /
+ }
+ }
+
+
+ ###########################################################################
+ # #
+ # @AddPaint, @StrokeCommand #
+ # #
+ ###########################################################################
+
+ def @AddPaint
+ left col
+ right texture
+ {
+ col @Case {
+ none @Yield ""
+ nochange @Yield {
+ @BackEnd @Case {
+ PostScript @Yield { "gsave" texture "fill grestore" }
+ PDF @Yield { "q f Q" }
+ PlainText @Yield { "" }
+ }
+ }
+ else @Yield {
+ @BackEnd @Case {
+ PostScript @Yield {"gsave" @ColourCommand col texture "fill grestore"}
+ PDF @Yield { "q" @ColourCommand col "f Q" }
+ PlainText @Yield { "" }
+ }
+ }
+ }
+ }
+
+ def @StrokeCommand right linewidth
+ {
+ @BackEnd @Case {
+ PostScript @Yield {
+ linewidth @Case {
+ "" @Yield { "stroke" }
+ none @Yield { }
+ else @Yield { linewidth "setlinewidth stroke" }
+ }
+ }
+ PDF @Yield {
+ linewidth @Case {
+ "" @Yield { "S" }
+ none @Yield { }
+ else @Yield { linewidth "w S" }
+ }
+ }
+ else @Yield ""
+ }
+ }
+
+
+
+ ###########################################################################
+ # #
+ # @FullWidthRule, @Box, @CurveBox, and @ShadowBox #
+ # #
+ ###########################################################################
+
+ def @FullWidthRule
+ import @PSLengths named linewidth {}
+ {
+ @BackEnd @Case {
+
+ PostScript @Yield @HExpand {
+ { "LoutRule" @StrokeCommand linewidth } @Graphic { 0.5p @High }
+ }
+
+ PDF @Yield @HExpand {
+ { "0 0 m __xsize 0 l" @StrokeCommand linewidth } @Graphic { 0.5p @High }
+ }
+
+ PlainText @Yield { "-" @PlainGraphic 1f @High }
+ }
+ }
+
+ def @LocalWidthRule
+ import @PSLengths named linewidth {}
+ {
+ @BackEnd @Case {
+
+ PostScript @Yield {
+ { "LoutRule" @StrokeCommand linewidth } @Graphic { 0.5p @High }
+ }
+
+ PDF @Yield {
+ { "0 0 m __xsize 0 l" @StrokeCommand linewidth } @Graphic { 0.5p @High }
+ }
+
+ PlainText @Yield { "-" @PlainGraphic 1f @High }
+ }
+ }
+
+ def @Box
+ named margin { 0.3f }
+ import @PSLengths named linewidth {}
+ named paint { none }
+ import @TextureImport named texture {}
+ right x
+ {
+ @BackEnd @Case {
+
+ PostScript @Yield @VContract @HContract 0c @HShift {
+ {"LoutBox" paint @AddPaint texture @StrokeCommand linewidth }
+ @Graphic
+ { ^/margin ^|margin 0c @HShift @OneRow x |margin /margin }
+ }
+
+ PDF @Yield @VContract @HContract 0c @HShift {
+ { "0 0 m __xsize 0 l __xsize __ysize l 0 __ysize l h"
+ paint @AddPaint texture @StrokeCommand linewidth } @Graphic
+ { ^/margin ^|margin 0c @HShift @OneRow x |margin /margin }
+ }
+
+ PlainText @Yield @VContract @HContract 0c @HShift {
+ ^/margin ^|margin 0c @HShift @OneRow x |margin /margin
+ }
+ }
+ }
+
+ def @CurveBox
+ named margin { 0.3f }
+ import @PSLengths named linewidth {}
+ named paint { none }
+ import @TextureImport named texture {}
+ right x
+ {
+ def @PDFStuff
+ {
+ "__xmark 0 m"
+ "__sub(__xsize, __xmark) 0 l"
+ "__sub(__xsize, __div(__mul(11, __xmark), 24)) 0"
+ "__xsize __div(__mul(11, __xmark), 24)"
+ "__xsize __xmark c"
+ "__xsize __sub(__ysize, __xmark) l"
+ "__xsize __sub(__ysize, __div(__mul(11, __xmark), 24))"
+ "__sub(__xsize, __div(__mul(11, __xmark), 24)) __ysize"
+ "__sub(__xsize, __xmark) __ysize c"
+ "__xmark __ysize l"
+ "__div(__mul(11, __xmark), 24) __ysize"
+ "0 __sub(__ysize, __div(__mul(11, __xmark), 24))"
+ "0 __sub(__ysize, __xmark) c"
+ "0 __xmark l"
+ "0 __div(__mul(11, __xmark), 24)"
+ "__div(__mul(11, __xmark), 24) 0"
+ "__xmark 0 c"
+ "h"
+ paint @AddPaint texture @StrokeCommand linewidth
+ }
+
+ @VContract @HContract 0c @HShift @BackEnd @Case {
+
+ PostScript @Yield {
+ {"LoutCurveBox" paint @AddPaint texture @StrokeCommand linewidth }
+ @Graphic
+ { ^/margin ^|margin 0c @HShift @OneRow x |margin /margin }
+ }
+
+ PlainText @Yield {
+ ^/margin ^|margin 0c @HShift @OneRow x |margin /margin
+ }
+
+ PDF @Yield {
+ @PDFStuff @Graphic
+ { ^/margin ^|margin 0c @HShift @OneRow x |margin /margin }
+ }
+ }
+ }
+
+ def @ShadowBox
+ named margin { 0.3f }
+ import @PSLengths named linewidth {}
+ named paint { none }
+ import @TextureImport named texture {}
+ named shadow { 0.2f }
+ right x
+ {
+ @VContract @HContract 0c @HShift @BackEnd @Case {
+
+ PostScript @Yield {
+ "LoutShadowBox fill" @Graphic
+ { ^/shadow ^|shadow 0c @HShift
+ @Box
+ margin {margin}
+ paint {paint}
+ texture { texture }
+ linewidth {linewidth} x
+ |shadow /shadow
+ }
+ }
+
+ PlainText @Yield {
+ ^/shadow ^|shadow 0c @HShift
+ @Box
+ margin { margin }
+ paint { paint }
+ texture { texture }
+ linewidth {linewidth} x
+ |shadow /shadow
+ }
+
+ PDF @Yield {
+ {
+ "__mul(__xmark, 2) 0 m __xsize 0 l"
+ "__xsize __sub(__ysize, __mul(__xmark, 2)) l"
+ "__sub(__xsize, __xmark) __sub(__ysize, __mul(__xmark, 2)) l"
+ "__sub(__xsize, __xmark) __xmark l"
+ "__mul(__xmark, 2) __xmark l h f"
+ }
+ @Graphic
+ { ^/shadow ^|shadow 0c @HShift
+ @Box
+ margin { margin }
+ paint { paint }
+ texture { texture }
+ linewidth { linewidth } x
+ |shadow /shadow
+ }
+ }
+ }
+ }
+
+
+ ###########################################################################
+ # #
+ # @BoundaryMarks #
+ # #
+ ###########################################################################
+
+ def @BoundaryMarks
+ import @PSLengths named linewidth { 0.2p }
+ import @PSLengths named length { 0.5c }
+ import @PSLengths named gap { 0.5c }
+ import @PSLengths named lout { 0c }
+ import @PSLengths named rout { 0c }
+ import @PSLengths named uout { 0c }
+ import @PSLengths named dout { 0c }
+ {
+ def @UpStroke { "0" gap "rmoveto" "0" length "rlineto" }
+ def @DownStroke { "0" gap "neg" "rmoveto" "0" length "neg rlineto" }
+ def @LeftStroke { gap "neg" "0" "rmoveto" length "neg" "0 rlineto" }
+ def @RightStroke { gap "0" "rmoveto" length "0 rlineto" }
+
+ def @LLSpot { lout "neg" dout "neg" moveto }
+ def @LRSpot { xsize rout "add" dout "neg" moveto }
+ def @ULSpot { lout "neg" ysize uout "add" moveto }
+ def @URSpot { xsize rout "add" ysize uout "add" moveto }
+
+ def @PDFStuff {
+ "__sub(-"gap", "lout") __sub(0, "dout") m "
+ "__sub(__sub(-"gap", "lout"), "length") __sub(0, "dout") l"
+ "__sub(0, "lout") __sub(-"gap", "dout") m "
+ "__sub(0, "lout") __sub(__sub(-"gap", "dout"), "length") l"
+ "__add(__xsize,"rout") __sub(-"gap", "dout") m "
+ "__add(__xsize,"rout") __sub(__sub(-"gap", "dout"), "length") l"
+ "__add(__add(__xsize,"rout"),"gap") __sub(0, "dout") m "
+ "__add(__add(__add(__xsize,"rout"),"gap"),"length") __sub(0, "dout") l"
+ " __sub(__sub(0, "lout"), "gap") __add(__ysize, "uout") m "
+ "__sub(__sub(__sub(0, "lout"), "gap"), "length") __add(__ysize, "uout") l"
+ "__sub(0, "lout") __add(__add(__ysize, "uout"), "gap") m "
+ "__sub(0, "lout") __add(__add(__add(__ysize, "uout"), "gap"), "length") l"
+ " __add(__add(__xsize, "rout"), "gap") __add(__ysize, "uout") m "
+ "__add(__add(__add(__xsize, "rout"), "gap"), "length") __add(__ysize, "uout") l"
+ "__add(__xsize, "rout") __add(__add(__ysize, "uout"), "gap") m "
+ "__add(__xsize, "rout") __add(__add(__add(__ysize, "uout"), "gap"), "length") l"
+
+ linewidth "w S"
+ }
+
+ @BackEnd @Case {
+
+ PostScript @Yield {
+ {
+ @LLSpot @LeftStroke
+ @LLSpot @DownStroke
+ @LRSpot @DownStroke
+ @LRSpot @RightStroke
+ @ULSpot @LeftStroke
+ @ULSpot @UpStroke
+ @URSpot @RightStroke
+ @URSpot @UpStroke
+
+ linewidth "setlinewidth stroke"
+ } @Graphic {}
+ }
+
+ PlainText @Yield ""
+
+ PDF @Yield { @PDFStuff @Graphic {} }
+ }
+ }
+
+ ##########################################################################
+ # #
+ # @NumberMarker, @NumberOf, @TitleMarker, @TitleOf, #
+ # @PageMark, @PageOf, @CrossLink, @ExternalLink #
+ # #
+ # NB the default value ?? is desperately important for unsorted #
+ # reference lists numbered by first appearance (@NumberOf @Tag), #
+ # because it is the special sort key value that prevents merging, #
+ # hence allowing all the references to be printed even though #
+ # their sort keys are all ?? initially. #
+ # #
+ ##########################################################################
+
+ export @Tag @Value
+ def @NumberMarker
+ named @Tag {}
+ named @Value { "??" }
+ {
+ @Null
+ }
+
+ def @NumberOf
+ right tag
+ {
+ @NumberMarker&&tag @Open { @Value }
+ }
+
+
+ export @Tag @Value
+ def @TitleMarker
+ named @Tag {}
+ named @Value { "??" }
+ {
+ @Null
+ }
+
+ def @TitleOf
+ right tag
+ {
+ @TitleMarker&&tag @Open { @Value }
+ }
+
+
+ export num rawnum @Tag
+ def @PageMarker
+ named @Tag {}
+ named num {}
+ named rawnum {}
+ {
+ @PageLabel num
+ }
+
+ def @PageMark
+ right tag
+ {
+ tag @LinkDest @Null & @PageMarker&&preceding @Tagged tag
+ }
+
+ def @NoLinkPageMark
+ right tag
+ {
+ @PageMarker&&preceding @Tagged tag
+ }
+
+ def @PageOf
+ right tag
+ {
+ @PageMarker&&tag @Open { num }
+ }
+
+ def @CrossLink
+ left tag
+ named @Format right @Body { @CrossLinkFormat @Body }
+ right obj
+ {
+ @HContract @VContract {
+ tag @LinkSource @Format obj
+ }
+ }
+
+ def @ExternalLink
+ left tag
+ named @Format right @Body { @ExternalLinkFormat @Body }
+ right obj
+ {
+ @HContract @VContract {
+ tag @URLLink @Format obj
+ }
+ }
+
+
+ ###########################################################################
+ # #
+ # @Join and @Sep #
+ # #
+ # Join two objects together with @NumberSeparator, unless one is #
+ # empty in which case just return the other. #
+ # #
+ ###########################################################################
+
+ def @Join left x right y
+ {
+ x @Case {
+ {} @Yield y
+ else @Yield {
+ y @Case {
+ {} @Yield x
+ else @Yield { x{@NumberSeparator}y }
+ }
+ }
+ }
+ }
+
+ def @Sep left x right y
+ {
+ x @Case {
+ {} @Yield y
+ else @Yield {
+ y @Case {
+ {} @Yield x
+ else @Yield { x{@NumberSeparator} |2s y }
+ }
+ }
+ }
+ }
+
+
+ ###########################################################################
+ # #
+ # Miscellaneous. #
+ # #
+ ###########################################################################
+
+ def @Heading right x { ragged @Break @HeadingFont @Font x }
+ def "^" { {} ^& {} }
+ def "&-" left x right y { x &0ch y }
+
+
+ ###########################################################################
+ # #
+ # @If @Not @And @Or @True #
+ # #
+ # Used in databases to make optional fields format nicely. #
+ # #
+ ###########################################################################
+
+ def @If
+ precedence 97
+ left x
+ right y
+ {
+ y @Case {
+ {} @Yield @Null
+ else @Yield { @Null{x} }
+ }
+ }
+
+ def @Not
+ precedence 100
+ right y
+ {
+ y @Case {
+ {} @Yield "*"
+ else @Yield ""
+ }
+ }
+
+ def @And
+ precedence 99
+ left x
+ right y
+ {
+ x @Case {
+ {} @Yield {}
+ else @Yield y
+ }
+ }
+
+ def @Or
+ precedence 98
+ left x
+ right y
+ {
+ x @Case {
+ {} @Yield y
+ else @Yield x
+ }
+ }
+
+ def @True { "*" }
+
+
+ ###########################################################################
+ # #
+ # Paragraphs. #
+ # #
+ ###########################################################################
+
+ macro @PP { //@ParaGap @ParaIndent @Wide &{0i} }
+ macro @LP { //{@ParaGap} }
+ macro @LLP { //{1vx} }
+ macro @DP { //{@DisplayGap} }
+ macro @LOP { //{@ListOuterGap} }
+ macro @NP { //{1.1b} }
+ macro @CNP { // 3.2v @High //0io //{} }
+
+
+ ###########################################################################
+ # #
+ # Beginning and ending of aligned displays. #
+ # #
+ ###########################################################################
+
+ def @APlace { @Galley }
+ def @EndAlignedPlace { @Galley }
+ def @AlignedPlace { @Galley }
+
+ def @BAligned into { @APlace&&preceding }
+ {
+ def @AlignedList { @AlignedPlace /1.1b @AlignedList }
+
+ //1.1b @AlignedList
+ // @EndAlignedPlace
+ }
+
+ macro @BAD @BeginAlignedDisplays { // @APlace | @BAligned }
+ def @EAD @EndAlignedDisplays force into { @EndAlignedPlace&&preceding } {}
+
+
+ ###########################################################################
+ # #
+ # New code for numbered displays that will cross section boundaries #
+ # #
+ ###########################################################################
+
+ export @Tag val
+ def @NumDispCounterMarker
+ named @Tag {}
+ named val {}
+ {
+ @Null
+ }
+
+ def @NumDispNum right tag
+ {
+ @NumDispCounterMarker&&tag @Open { @Next val }
+ }
+
+ def @NumDispCounterIncrement
+ named @BypassNumber { "dft" }
+ right tag
+ {
+ def @DisplayNumber
+ {
+ @BypassNumber @Dft { @NumDispNum tag }
+ }
+
+ @NumDispCounterMarker&&preceding @Tagged tag
+ # @NumDispCounterMarker val { @NumDispNum tag }
+ # @NumberMarker @Tag { tag } @Value { @NumDispNum tag }
+ @NumDispCounterMarker val { @DisplayNumber }
+ @NumberMarker @Tag { tag } @Value { @DisplayNumber }
+ }
+
+ def @NN
+ {
+ @NumDispCounterMarker&&preceding @Open { @DisplayNumStyle val }
+ }
+
+ def @Do
+ left x
+ right y
+ {
+ x @Case {
+ { No None } @Yield @Null
+ else @Yield y
+ }
+ }
+
+ def @BeginDisplayCounter
+ left condition
+ right prefix
+ {
+ condition @Do @NumDispCounterMarker val { prefix @Join 0 }
+ }
+
+
+ ###########################################################################
+ # #
+ # Galleys that carry displays to their places. #
+ # #
+ ###########################################################################
+
+ def @DispPlace { @Galley }
+
+ def @Disp into { @DispPlace&&preceding }
+ right x
+ {
+ x
+ }
+
+ def @NDisp into { @DispPlace&&preceding }
+ named @Tag {}
+ named @BypassNumber { "dft" }
+ right x
+ {
+ @OneRow {
+ @NumDispCounterIncrement @Tag
+ # @NumDispCounterIncrement @BypassNumber { @BypassNumber } @Tag
+ @PageMark @Tag
+ ^//
+ @OneRow x
+ }
+ }
+
+ def @ADisp into { @AlignedPlace&&preceding }
+ right x
+ {
+ x
+ }
+
+ def @ANDisp into { @AlignedPlace&&preceding }
+ named @Tag {}
+ named @BypassNumber { "dft" }
+ right x
+ {
+ @OneRow {
+ @NumDispCounterIncrement @Tag
+ # @NumDispCounterIncrement @BypassNumber { @BypassNumber } @Tag
+ @PageMark @Tag
+ ^/
+ @OneRow x
+ }
+ }
+
+
+ ###########################################################################
+ # #
+ # Displays and raw displays. #
+ # #
+ ###########################################################################
+
+ macro @G { |@DefaultIndent }
+ macro @LG { | }
+ macro @IG { |@DisplayIndent }
+ macro @CG { |0.5rt }
+ macro @RG { |1.0rt }
+ macro @QR { @DisplayIndent @Wide { |1rt @NN } }
+ macro @DX { @DispPlace }
+ macro @DY { @Disp }
+ macro @AX { @APlace }
+ macro @AY { @ADisp }
+ macro @NY { @NDisp }
+ macro @MY { @ANDisp }
+
+ macro @D @Display { @DP @G @DX | @DP // @DY }
+ macro @LD @LeftDisplay { @DP @LG @DX | @DP // @DY }
+ macro @ID @IndentedDisplay { @DP @IG @DX | @DP // @DY }
+ macro @QD @QuotedDisplay { @DP @IG @DX @IG @DP // @DY }
+ macro @CD @CentredDisplay
+ @CenteredDisplay { @DP @CG @DX | @DP // @DY }
+ macro @RightDisplay { @DP @RG @DX | @DP // @DY }
+
+
+ macro @AD @AlignedDisplay { @DP @G @AX | @DP // @AY }
+ macro @LAD @LeftAlignedDisplay { @DP @LG @AX | @DP // @AY }
+ macro @IAD @IndentedAlignedDisplay { @DP @IG @AX | @DP // @AY }
+ macro @QAD @QuotedAlignedDisplay { @DP @IG @AX @IG @DP // @AY }
+ macro @CAD @CentredAlignedDisplay
+ @CenteredAlignedDisplay { @DP @CG @AX | @DP // @AY }
+ macro @RightAlignedDisplay { @DP @RG @AX | @DP // @AY }
+
+ macro @ND @NumberedDisplay { @DP @G @DX |1rt @NN @DP // @NY }
+ macro @LND @LeftNumberedDisplay { @DP @LG @DX |1rt @NN @DP // @NY }
+ macro @IND @IndentedNumberedDisplay { @DP @IG @DX |1rt @NN @DP // @NY }
+ macro @QND @QuotedNumberedDisplay { @DP @IG @DX |1rt @QR @DP // @NY }
+ macro @CND @CentredNumberedDisplay
+ @CenteredNumberedDisplay { @DP @CG @DX |1rt @NN @DP // @NY }
+ macro @RightNumberedDisplay { @DP @RG @DX |1rt @NN @DP // @NY }
+
+ macro @AND @AlignedNumberedDisplay { @DP @G @AX |1rt @NN @DP // @MY }
+ macro @LAND @LeftAlignedNumberedDisplay { @DP @LG @AX |1rt @NN @DP // @MY }
+ macro @IAND @IndentedAlignedNumberedDisplay{ @DP @IG @AX |1rt @NN @DP // @MY }
+ macro @QAND @QuotedAlignedNumberedDisplay { @DP @IG @AX |1rt @QR @DP // @MY }
+ macro @CAND @CentredAlignedNumberedDisplay
+ @CenteredAlignedNumberedDisplay{ @DP @CG @AX |1rt @NN @DP // @MY }
+ macro @RightAlignedNumberedDisplay { @DP @RG @AX |1rt @NN @DP // @MY }
+
+
+ macro @RD @RawDisplay { @G @DX | // @DY }
+ macro @RLD @RawLeftDisplay { @LG @DX | // @DY }
+ macro @RID @RawIndentedDisplay { @IG @DX | // @DY }
+ macro @RQD @RawQuotedDisplay { @IG @DX @IG | // @DY }
+ macro @RCD @RawCentredDisplay
+ @RawCenteredDisplay { @CG @DX | | // @DY }
+ macro @RRD @RawRightDisplay { @RG @DX | // @DY }
+
+
+ macro @RAD @RawAlignedDisplay { @G @AX | // @AY }
+ macro @RLAD @RawLeftAlignedDisplay { @LG @AX | // @AY }
+ macro @RIAD @RawIndentedAlignedDisplay { @IG @AX | // @AY }
+ macro @RQAD @RawQuotedAlignedDisplay { @IG @AX @IG | // @AY }
+ macro @RCAD @RawCentredAlignedDisplay
+ @RawCenteredAlignedDisplay { @CG @AX | // @AY }
+ macro @RRAD @RawRightAlignedDisplay { @RG @AX | // @AY }
+
+ macro @RND @RawNumberedDisplay { @G @DX |1rt @NN // @NY }
+ macro @RLND @RawLeftNumberedDisplay { @LG @DX |1rt @NN // @NY }
+ macro @RIND @RawIndentedNumberedDisplay { @IG @DX |1rt @NN // @NY }
+ macro @RQND @RawQuotedNumberedDisplay { @IG @DX |1rt @QR // @NY }
+ macro @RCND @RawCentredNumberedDisplay
+ @RawCenteredNumberedDisplay { @CG @DX |1rt @NN // @NY }
+ macro @RRND @RawRightNumberedDisplay { @RG @DX |1rt @NN // @NY }
+
+ macro @RAND @RawAlignedNumberedDisplay { @G @AX |1rt @NN // @MY }
+ macro @RLAND @RawLeftAlignedNumberedDisplay { @LG @AX |1rt @NN // @MY }
+ macro @RIAND @RawIndentedAlignedNumberedDisplay { @IG @AX |1rt @NN // @MY }
+ macro @RQAND @RawQuotedAlignedNumberedDisplay { @IG @AX |1rt @QR // @MY }
+ macro @RCAND @RawCentredAlignedNumberedDisplay
+ @RawCenteredAlignedNumberedDisplay { @CG @AX |1rt @NN // @MY }
+ macro @RRAND @RawRightAlignedNumberedDisplay{ @RG @AX |1rt @NN // @MY }
+
+
+ ###########################################################################
+ # #
+ # Lists and raw lists. #
+ # #
+ ###########################################################################
+
+
+ def @ItemPlace { @Galley }
+ def @ParagraphItemPlace { @Galley }
+ def @InterruptItemPlace { @Galley }
+ def @NewPageItemPlace { @Galley }
+ def @TagPlace { @Galley }
+ def @EndListPlace { @Galley }
+
+ def @RawList
+ named style right num { num }
+ named type right num { num }
+ named gap { @ListGap }
+ named indent { @ListIndent }
+ named itemindent { 0c }
+ named rightindent { @ListRightIndent }
+ named labelwidth { @ListLabelWidth }
+ named labelright { @ListLabelRight }
+ named labelrightgap { @ListLabelRightGap }
+ named start { 1 }
+ named font { @ListFont }
+ named break { @ListBreak }
+ named colnum { 1 }
+ named colgap { 1.0c }
+ named colheight { 5.0c }
+ {
+ def @MakeList right num
+ {
+ def @NormalItem
+ {
+ def @Align right x
+ {
+ labelright @Case {
+ { Yes yes } @Yield { labelwidth @Wide { |1rt @OneCol { x |labelrightgap } } }
+ else @Yield x
+ }
+ }
+
+ |indent
+ labelwidth @Wide {
+ # @NumberMarker @Value {style num} {style num} &0io
+ # @NumberMarker @Value {num} {style type num} &0io
+ @NumberMarker @Value {type num} {@Align style type num} &0io
+ }
+ |itemindent break @Break font @Font @ItemPlace |rightindent
+ //gap @MakeList @NotRevealed @Next num
+ }
+
+ def @ParagraphItem
+ {
+ @NumberMarker @Value {num} {style type num} &0io
+ |indent break @Break font @Font @ParagraphItemPlace |rightindent
+ //gap @MakeList @NotRevealed @Next num
+ }
+
+ def @InterruptItem
+ {
+ @InterruptItemPlace
+ //gap @MakeList @NotRevealed num
+ }
+
+ def @NewPageItem
+ {
+ @NewPageItemPlace
+ //1.1b @MakeList @NotRevealed num
+ }
+
+ @OneOf
+ {
+ @NormalItem
+ @ParagraphItem
+ @InterruptItem
+ @NewPageItem
+ }
+ }
+
+ def @ListGalleyPlace { @Galley }
+
+ def @ListGalley into { @ListGalleyPlace&&preceding }
+ {
+ @MakeList start // @EndListPlace
+ }
+
+ def @ColPieceTwo
+ {
+ colheight @High 500c @Wide @ListGalleyPlace ||colgap
+ colheight @High 500c @Wide @ListGalleyPlace @NotRevealed
+ }
+
+ def @ColPieceThree
+ {
+ colheight @High 500c @Wide @ListGalleyPlace ||colgap
+ colheight @High 500c @Wide @ListGalleyPlace @NotRevealed ||colgap
+ colheight @High 500c @Wide @ListGalleyPlace @NotRevealed
+ }
+
+ def @ColPieceFour
+ {
+ colheight @High 500c @Wide @ListGalleyPlace ||colgap
+ colheight @High 500c @Wide @ListGalleyPlace @NotRevealed ||colgap
+ colheight @High 500c @Wide @ListGalleyPlace @NotRevealed ||colgap
+ colheight @High 500c @Wide @ListGalleyPlace @NotRevealed
+ }
+
+ def @ColPieceFive
+ {
+ colheight @High 500c @Wide @ListGalleyPlace ||colgap
+ colheight @High 500c @Wide @ListGalleyPlace @NotRevealed ||colgap
+ colheight @High 500c @Wide @ListGalleyPlace @NotRevealed ||colgap
+ colheight @High 500c @Wide @ListGalleyPlace @NotRevealed ||colgap
+ colheight @High 500c @Wide @ListGalleyPlace @NotRevealed
+ }
+
+ colnum @Case
+ {
+ 1 @Yield @ListGalleyPlace
+ 2 @Yield @ColPieceTwo
+ 3 @Yield @ColPieceThree
+ 4 @Yield @ColPieceFour
+ 5 @Yield @ColPieceFive
+ else @Yield @ListGalleyPlace
+ }
+ //
+ @ListGalley
+ }
+
+ def listitem into { @ItemPlace&&preceding }
+ named @Tag {}
+ right x
+ {
+ @NumberMarker&&preceding @Tagged @Tag
+ // x
+ // @PageMark @Tag # weird placement, but @PageMark is definite now
+ }
+
+ def paragraphitem
+ named @Tag {}
+ named style right tag { @ParaIndent @Wide & tag. &2s }
+ right x
+ {
+
+ def sendparagraphitem into { @ParagraphItemPlace&&preceding }
+ named tag { @Tag }
+ {
+ @NumberMarker&&preceding @Tagged @Tag
+ // { style @NumberMarker&&@Tag @Open { @Value } } @Insert x
+ // @PageMark @Tag
+ }
+
+ sendparagraphitem
+ }
+
+ def droplistitem into { @ItemPlace&&preceding }
+ named @Tag {}
+ right x
+ {
+ @NumberMarker&&preceding @Tagged @Tag
+ // @PageMark @Tag
+ //1vx x
+ }
+
+ def tagitem into { @ItemPlace&&preceding }
+ named tag {}
+ right x
+ {
+ def sendtag into { @TagPlace&&preceding } { tag }
+
+ sendtag // x
+ }
+
+ def droptagitem into { @ItemPlace&&preceding }
+ named tag {}
+ right x
+ {
+ def sendtag into { @TagPlace&&preceding } { tag }
+
+ sendtag // //1vxu x
+ }
+
+ def endlist force into { @EndListPlace&&preceding } {}
+
+ def listnewpage into { @NewPageItemPlace&&preceding } {}
+
+ def listinterruptitem into { @InterruptItemPlace&&preceding }
+ right x
+ {
+ x
+ }
+
+
+ macro @LI @ListItem { // listitem }
+ macro @PI @ParagraphItem { // paragraphitem }
+ macro @LII @ListInterruptItem { // listinterruptitem }
+ macro @LNP @ListNewPage { // listnewpage }
+ macro @DLI @DropListItem { // droplistitem }
+ macro @TI @TagItem { // tagitem tag }
+ macro @DTI @DropTagItem { // droptagitem tag }
+ macro @REL @RawEndList { // & endlist // }
+ macro @EL @EndList { // & endlist @LOP }
+
+
+ macro @RLL @RawLeftList { @RawList style {}
+ labelwidth { 0c } }
+ macro @RIL @RawIndentedList { @RawList style {} }
+ macro @RQL @RawQuotedList { @RawList style {}
+ rightindent {@DisplayIndent}}
+ macro @RCL @RawCentredList { @RawList style {}
+ labelwidth {0c}
+ itemindent {0.5rt} }
+ macro @RawCenteredList { @RawCentredList }
+ macro @RNL @RawNumberedList { @RawList style { num. } }
+ macro @RPNL @RawParenNumberedList { @RawList style { (num) } }
+ macro @RRL @RawRomanList { @RawList type { @Roman&&num }
+ style { num. } }
+ macro @RPRL @RawParenRomanList { @RawList type { @Roman&&num }
+ style { (num) } }
+ macro @RUCRL @RawUCRomanList { @RawList type { @UCRoman&&num }
+ style { num. } }
+ macro @RPUCRL @RawParenUCRomanList { @RawList type { @UCRoman&&num }
+ style { (num) } }
+ macro @RAL @RawAlphaList { @RawList type { @Alpha&&num }
+ style { num. } }
+ macro @RPAL @RawParenAlphaList { @RawList type { @Alpha&&num }
+ style { (num) } }
+ macro @RUCAL @RawUCAlphaList { @RawList type { @UCAlpha&&num }
+ style { num. } }
+ macro @RPUCAL @RawParenUCAlphaList { @RawList type { @UCAlpha&&num }
+ style { (num) } }
+ macro @RBL @RawBulletList { @RawList style { @Bullet } }
+ macro @RSL @RawStarList { @RawList style { @Star } }
+ macro @RDL @RawDashList { @RawList style { -- } }
+ macro @RTL @RawTaggedList { @RawList type { @TagPlace } }
+ macro @RWTL @RawWideTaggedList { @RawList type { @TagPlace }
+ labelwidth { @WideIndent } }
+ macro @RVWTL @RawVeryWideTaggedList{ @RawList type { @TagPlace }
+ labelwidth { @VeryWideIndent } }
+
+
+ macro @L @List { @LOP @RawList }
+ macro @LL @LeftList { @LOP @RawLeftList }
+ macro @IL @IndentedList { @LOP @RawIndentedList }
+ macro @QL @QuotedList { @LOP @RawQuotedList }
+ macro @CL @CentredList { @LOP @RawCentredList }
+ macro @CenteredList { @LOP @RawCenteredList }
+ macro @NL @NumberedList { @LOP @RawNumberedList }
+ macro @PNL @ParenNumberedList { @LOP @RawParenNumberedList }
+ macro @RL @RomanList { @LOP @RawRomanList }
+ macro @PRL @ParenRomanList { @LOP @RawParenRomanList }
+ macro @UCRL @UCRomanList { @LOP @RawUCRomanList }
+ macro @PUCRL @ParenUCRomanList { @LOP @RawParenUCRomanList }
+ macro @AL @AlphaList { @LOP @RawAlphaList }
+ macro @PAL @ParenAlphaList { @LOP @RawParenAlphaList }
+ macro @UCAL @UCAlphaList { @LOP @RawUCAlphaList }
+ macro @PUCAL @ParenUCAlphaList { @LOP @RawParenUCAlphaList }
+ macro @BL @BulletList { @LOP @RawBulletList }
+ macro @SL @StarList { @LOP @RawStarList }
+ macro @DL @DashList { @LOP @RawDashList }
+ macro @TL @TaggedList { @LOP @RawTaggedList }
+ macro @WTL @WideTaggedList { @LOP @RawWideTaggedList }
+ macro @VWTL @VeryWideTaggedList { @LOP @RawVeryWideTaggedList }
+
+@End @BasicSetup