From f23cb4ae64dc24ea24aaa2d1fdf049756063cfff Mon Sep 17 00:00:00 2001
From: Hans Hagen <pragma@wxs.nl>
Date: Tue, 13 Apr 2010 16:57:00 +0200
Subject: beta 2010.04.13 16:57

---
 tex/context/base/cont-new.tex     |   2 +-
 tex/context/base/context.tex      |   2 +-
 tex/context/base/font-ctx.lua     |  15 ++-
 tex/context/base/font-gds.lua     |   4 +-
 tex/context/base/font-ini.mkiv    |  40 +++---
 tex/context/base/math-ini.mkiv    |  26 +---
 tex/context/base/math-vfu.lua     | 257 +++++++++++++++++++-------------------
 tex/context/base/type-otf.mkiv    |   5 +
 tex/context/base/type-siz.mkiv    |   2 +
 tex/context/base/x-mathml.mkiv    |   4 -
 tex/context/fonts/symbol-math.lfg |  17 +++
 11 files changed, 188 insertions(+), 186 deletions(-)
 create mode 100644 tex/context/fonts/symbol-math.lfg

(limited to 'tex')

diff --git a/tex/context/base/cont-new.tex b/tex/context/base/cont-new.tex
index 5ecae9c44..39f4b7e48 100644
--- a/tex/context/base/cont-new.tex
+++ b/tex/context/base/cont-new.tex
@@ -11,7 +11,7 @@
 %C therefore copyrighted by \PRAGMA. See mreadme.pdf for
 %C details.
 
-\newcontextversion{2010.04.10 13:44}
+\newcontextversion{2010.04.13 16:57}
 
 %D This file is loaded at runtime, thereby providing an
 %D excellent place for hacks, patches, extensions and new
diff --git a/tex/context/base/context.tex b/tex/context/base/context.tex
index 7d0a30568..34cd917bc 100644
--- a/tex/context/base/context.tex
+++ b/tex/context/base/context.tex
@@ -20,7 +20,7 @@
 %D your styles an modules.
 
 \edef\contextformat {\jobname}
-\edef\contextversion{2010.04.10 13:44}
+\edef\contextversion{2010.04.13 16:57}
 
 %D For those who want to use this:
 
diff --git a/tex/context/base/font-ctx.lua b/tex/context/base/font-ctx.lua
index 95a02265e..ef02f925c 100644
--- a/tex/context/base/font-ctx.lua
+++ b/tex/context/base/font-ctx.lua
@@ -489,7 +489,7 @@ fonts.get_digit_width = fonts.set_digit_width
 
 -- soon to be obsolete:
 
-local loaded = { -- prevent loading
+local loaded = { -- prevent double loading
   ["original-base.map"     ] = true,
   ["original-ams-base.map" ] = true,
   ["original-ams-euler.map"] = true,
@@ -504,8 +504,19 @@ function fonts.map.loadfile(name)
     end
 end
 
+local loaded = { -- prevent double loading
+}
+
 function fonts.map.loadline(how,line)
-    pdf.mapline(how .. " " .. line)
+    if line then
+        how = how .. " " .. line
+    elseif how == "" then
+        how = "= " .. line
+    end
+    if not loaded[how] then
+        pdf.mapline(how)
+        loaded[how] = true
+    end
 end
 
 function fonts.map.reset()
diff --git a/tex/context/base/font-gds.lua b/tex/context/base/font-gds.lua
index 601e139ee..cace12509 100644
--- a/tex/context/base/font-gds.lua
+++ b/tex/context/base/font-gds.lua
@@ -272,12 +272,12 @@ local function initialize(goodies)
     end
     if mapfiles then
         for i=1,#mapfiles do
-            pdf.mapfile(mapfiles[i]) -- todo: backend function
+            fonts.map.loadfile(mapfiles[i]) -- todo: backend function
         end
     end
     if maplines then
         for i=1,#maplines do
-            pdf.mapline(maplines[i]) -- todo: backend function
+            fonts.map.loadline(maplines[i]) -- todo: backend function
         end
     end
 end
diff --git a/tex/context/base/font-ini.mkiv b/tex/context/base/font-ini.mkiv
index 5ceeb70a9..02d793bc1 100644
--- a/tex/context/base/font-ini.mkiv
+++ b/tex/context/base/font-ini.mkiv
@@ -536,6 +536,21 @@
 \appendtoks
     \ifcase\boldmathmode\or\dosetmathfamily\mbfam\c!mb\fi
 \to \mathstrategies
+
+% \chardef\msfam\plustwo % math symbol
+%
+% \def\c!ms{ms}
+%
+% \unexpanded\def\ms{\ifmmode\fam\plustwo\else\setcurrentfontalternative\c!ms\fi}
+%
+% \chardef\symbolmathmode\zerocount
+%
+% \def\enablesymbolmath {\chardef\symbolmathmode\plusone  }
+% \def\disablesymbolmath{\chardef\symbolmathmode\zerocount}
+%
+% \appendtoks
+%     \ifcase\symbolmathmode\or\dosetmathfamily\msfam\c!ms\fi
+% \to \mathstrategies
 
 %D All used styles, like rm, ss and tt, are saved in a comma
 %D separated list. Appart from practical limitations one can
@@ -2616,29 +2631,6 @@
    \checkfontnamecombinations
    \setcurrentfontstyle\normalizedbodyfontsize}
 
-%D The previous macros show that it's is not always
-%D neccessary to define the whole bunch of fonts, take for
-%D instance the sequence:
-%D
-%D \starttyping
-%D \setupbodyfont
-%D   [ams]
-%D
-%D \definebodyfont [24pt] [mm]
-%D   [ma=msam10 at 24pt,
-%D    mb=msbm10 at 24pt]
-%D
-%D \switchtobodyfont
-%D   [24pt]
-%D
-%D This is a 24pt $\blacktriangleleft$
-%D \stoptyping
-%D
-%D Here we didn't define the 24 point bodyfont environment, so
-%D it's defined automatically. Of course one can always use the
-%D \TEX\ primitive \type{\font} to switch to whatever font
-%D needed.
-
 %D When asking for a complete font switch, for instance from 10
 %D to 12~points, the next macro does the job. First we
 %D normalize the size, next we define the current range of
@@ -2669,7 +2661,7 @@
 %D and/or options defined in files, for example:
 %D
 %D \starttyping
-%D \setupbodyfont[cmr,ams,12pt,roman]
+%D \setupbodyfont[modern,12pt,roman]
 %D \stoptyping
 %D
 %D This command affects the document as a whole: text, headers
diff --git a/tex/context/base/math-ini.mkiv b/tex/context/base/math-ini.mkiv
index d4be17ded..08c2e1604 100644
--- a/tex/context/base/math-ini.mkiv
+++ b/tex/context/base/math-ini.mkiv
@@ -136,15 +136,7 @@
 %D \macros
 %D   {boldsymbol}
 %D
-%D The math definition is inspired by amsmath.
-%D
-%D \startbuffer
-%D \definetypeface [boldmath] [mm] [boldmath] [latin-modern] [modern] [encoding=texnansi]
-%D
-%D $a \times b$ $a \boldsymbol{\times} b$
-%D \stopbuffer
-%D
-%D \typebuffer \start \getbuffer \stop
+%D To be done.
 
 \let\mathboldsymbol\relax % yet unsupported, will be
 
@@ -219,23 +211,7 @@
 \def\definemathsymbol        {\dosixtupleempty\dodefinemathsymbol}
 \def\dodefinemathsymbol      [#1][#2][#3][#4][#5][#6]{}
 \def\definemathcharacter     {\dosixtupleempty\dodefinemathcharacter}
-\def\redefinemathcharacter   {\dosixtupleempty\dodefinemathcharacter}
 \def\dodefinemathcharacter   [#1][#2][#3][#4][#5][#6]{}
-\def\startmathcollection     [#1]{}
-\def\setmathcollection       #1{}
-\def\stopmathcollection      {}
-\def\startrawmathcollection  {}
-\def\stoprawmathcollection   {}
-\def\setmathtoks             {}
-\let\currentmathcollection   \s!default
-\let\nomathcollection        \s!default
-\let\mathcollection          \s!default
-\def\enablemathcollection    [#1]{}
-\def\usemathcollection       {\dodoubleempty\dousemathcollection}
-\def\dousemathcollection     [#1][#2]{}
-\let\mathclass               \nomathcollection
-\let\autoenablemathcollection\relax
-\def\resetmathcollection     [#1]{}
 
 \def\definemathcommand
   {\dotripleempty\dodefinemathcommand}
diff --git a/tex/context/base/math-vfu.lua b/tex/context/base/math-vfu.lua
index 6097fbecb..5023e6b4d 100644
--- a/tex/context/base/math-vfu.lua
+++ b/tex/context/base/math-vfu.lua
@@ -24,8 +24,7 @@ fonts.vf.math.optional = false
 
 local push, pop, back = { "push" }, { "pop" }, { "slot", 1, 0x2215 }
 
-local function negate(main,unicode,basecode)
-    local characters = main.characters
+local function negate(main,characters,id,size,unicode,basecode)
     if not characters[unicode] then
         local basechar = characters[basecode]
         if basechar then
@@ -54,8 +53,7 @@ end
 --~ \Umathchardef\bracelu="0 "1 "FF07C
 --~ \Umathchardef\braceru="0 "1 "FF07D
 
-local function brace(main,unicode,first,rule,left,right,rule,last)
-    local characters = main.characters
+local function brace(main,characters,id,size,unicode,first,rule,left,right,rule,last)
     if not characters[unicode] then
         characters[unicode] = {
             horiz_variants = {
@@ -70,24 +68,25 @@ local function brace(main,unicode,first,rule,left,right,rule,last)
     end
 end
 
-local function arrow(main,unicode,arrow,minus,isleft)
-    if isleft then
-        t = {
-            { extender = 0, glyph = arrow },
-            { extender = 1, glyph = minus  },
-        }
-    else
-        t = {
-            { extender = 0, glyph = minus },
-            { extender = 1, glyph = arrow },
-        }
+local function arrow(main,characters,id,size,unicode,arrow,minus,isleft)
+    if characters[unicode] then
+        if isleft then
+            t = {
+                { extender = 0, glyph = arrow },
+                { extender = 1, glyph = minus  },
+            }
+        else
+            t = {
+                { extender = 0, glyph = minus },
+                { extender = 1, glyph = arrow },
+            }
+        end
+    --~     main.characters[unicode] = { horiz_variants = t }
+        characters[unicode].horiz_variants = t
     end
---~     main.characters[unicode] = { horiz_variants = t }
-    main.characters[unicode].horiz_variants = t
 end
 
-local function parent(main,unicode,first,rule,last)
-    local characters = main.characters
+local function parent(main,characters,id,size,unicode,first,rule,last)
     if not characters[unicode] then
         characters[unicode] = {
             horiz_variants = {
@@ -101,13 +100,13 @@ end
 
 local push, pop, step = { "push" }, { "pop" }, 0.2 -- 0.1 is nicer but gives larger files
 
-local function make(main,id,size,n,m)
-    local characters = main.characters
-    local xu = main.parameters.x_height + 0.3*size
-    local xd = 0.3*size
-    local old, upslot, dnslot, uprule, dnrule = 0xFF000+n, 0xFF100+n, 0xFF200+n, 0xFF300+m, 0xFF400+m
+local function make(main,characters,id,size,n,m)
+    local old = 0xFF000+n
     local c = characters[old]
     if c then
+        local upslot, dnslot, uprule, dnrule = 0xFF100+n, 0xFF200+n, 0xFF300+m, 0xFF400+m
+        local xu = main.parameters.x_height + 0.3*size
+        local xd = 0.3*size
         local w, h, d = c.width, c.height, c.depth
         local thickness = h - d
         local rulewidth = step*size -- we could use an overlap
@@ -128,127 +127,131 @@ local function make(main,id,size,n,m)
     end
 end
 
-local function minus(main,id,size,unicode)
-    local characters = main.characters
-    local mu = size/18
+local function minus(main,characters,id,size,unicode)
     local minus = characters[0x002D]
-    local width = minus.width - 5*mu
-    characters[unicode] = {
-        width = width, height = minus.height, depth = minus.depth,
-        commands = { push, { "right", -3*mu }, { "slot", id, 0x002D }, pop }
-    }
+    if minus then
+        local mu = size/18
+        local width = minus.width - 5*mu
+        characters[unicode] = {
+            width = width, height = minus.height, depth = minus.depth,
+            commands = { push, { "right", -3*mu }, { "slot", id, 0x002D }, pop }
+        }
+    end
 end
 
-local function dots(main,id,size,unicode)
-    local characters = main.characters
+local function dots(main,characters,id,size,unicode)
     local c = characters[0x002E]
-    local w, h, d = c.width, c.height, c.depth
-    local mu = size/18
-    local right3mu  = { "right", 3*mu }
-    local right1mu  = { "right", 1*mu }
-    local up1size   = { "down", -.1*size }
-    local up4size   = { "down", -.4*size }
-    local up7size   = { "down", -.7*size }
-    local right2muw = { "right", 2*mu + w }
-    local slot = { "slot", id, 0x002E }
-    if unicode == 0x22EF then
-        local c = characters[0x022C5]
-        if c then
-            local w, h, d = c.width, c.height, c.depth
-            local slot = { "slot", id, 0x022C5 }
+    if c then
+        local w, h, d = c.width, c.height, c.depth
+        local mu = size/18
+        local right3mu  = { "right", 3*mu }
+        local right1mu  = { "right", 1*mu }
+        local up1size   = { "down", -.1*size }
+        local up4size   = { "down", -.4*size }
+        local up7size   = { "down", -.7*size }
+        local right2muw = { "right", 2*mu + w }
+        local slot = { "slot", id, 0x002E }
+        if unicode == 0x22EF then
+            local c = characters[0x022C5]
+            if c then
+                local w, h, d = c.width, c.height, c.depth
+                local slot = { "slot", id, 0x022C5 }
+                characters[unicode] = {
+                    width = 3*w + 2*3*mu, height = h, depth = d,
+                    commands = { push, slot, right3mu, slot, right3mu, slot, pop }
+                }
+            end
+        elseif unicode == 0x22EE then
+            -- weird height !
+            characters[unicode] = {
+                width = w, height = h+(1.4)*size, depth = 0,
+                commands = { push, push, slot, pop, up4size, push, slot, pop, up4size, slot, pop }
+            }
+        elseif unicode == 0x22F1 then
+            characters[unicode] = {
+                width = 3*w + 6*size/18, height = 1.5*size, depth = 0,
+                commands = {
+                    push,
+                        right1mu,
+                        push, up7size, slot, pop,
+                        right2muw,
+                        push, up4size, slot, pop,
+                        right2muw,
+                        push, up1size, slot, pop,
+                        right1mu,
+                    pop
+                }
+            }
+        elseif unicode == 0x22F0 then
+            characters[unicode] = {
+                width = 3*w + 6*size/18, height = 1.5*size, depth = 0,
+                commands = {
+                    push,
+                        right1mu,
+                        push, up1size, slot, pop,
+                        right2muw,
+                        push, up4size, slot, pop,
+                        right2muw,
+                        push, up7size, slot, pop,
+                        right1mu,
+                    pop
+                }
+            }
+        else
             characters[unicode] = {
                 width = 3*w + 2*3*mu, height = h, depth = d,
                 commands = { push, slot, right3mu, slot, right3mu, slot, pop }
             }
         end
-    elseif unicode == 0x22EE then
-        -- weird height !
-        characters[unicode] = {
-            width = w, height = h+(1.4)*size, depth = 0,
-            commands = { push, push, slot, pop, up4size, push, slot, pop, up4size, slot, pop }
-        }
-    elseif unicode == 0x22F1 then
-        characters[unicode] = {
-            width = 3*w + 6*size/18, height = 1.5*size, depth = 0,
-            commands = {
-                push,
-                    right1mu,
-                    push, up7size, slot, pop,
-                    right2muw,
-                    push, up4size, slot, pop,
-                    right2muw,
-                    push, up1size, slot, pop,
-                    right1mu,
-                pop
-            }
-        }
-    elseif unicode == 0x22F0 then
-        characters[unicode] = {
-            width = 3*w + 6*size/18, height = 1.5*size, depth = 0,
-            commands = {
-                push,
-                    right1mu,
-                    push, up1size, slot, pop,
-                    right2muw,
-                    push, up4size, slot, pop,
-                    right2muw,
-                    push, up7size, slot, pop,
-                    right1mu,
-                pop
-            }
-        }
-    else
-        characters[unicode] = {
-            width = 3*w + 2*3*mu, height = h, depth = d,
-            commands = { push, slot, right3mu, slot, right3mu, slot, pop }
-        }
     end
 end
 
-local function vertbar(main,id,size,parent,scale,unicode)
-    local characters = main.characters
+local function vertbar(main,characters,id,size,parent,scale,unicode)
     local cp = characters[parent]
-    local sc = scale * size
-    local pc = { "slot", id, parent }
-    characters[unicode] = {
-        width    = cp.width,
-        height   = cp.height + sc,
-        depth    = cp.depth + sc,
-        commands = {
-            push, { "down", -sc }, pc, pop,
-            push, { "down",  sc }, pc, pop,
-                                   pc,
-        },
-        next = cp.next -- can be extensible
-    }
-    cp.next = unicode
+    if cp then
+        local sc = scale * size
+        local pc = { "slot", id, parent }
+        characters[unicode] = {
+            width    = cp.width,
+            height   = cp.height + sc,
+            depth    = cp.depth + sc,
+            commands = {
+                push, { "down", -sc }, pc, pop,
+                push, { "down",  sc }, pc, pop,
+                                       pc,
+            },
+            next = cp.next -- can be extensible
+        }
+        cp.next = unicode
+    end
 end
 
 function fonts.vf.math.alas(main,id,size)
+    local characters = main.characters
     for i=0x7A,0x7D do
-        make(main,id,size,i,1)
+        make(main,characters,id,size,i,1)
     end
-    brace (main,0x23DE,0xFF17A,0xFF301,0xFF17D,0xFF17C,0xFF301,0xFF17B)
-    brace (main,0x23DF,0xFF27C,0xFF401,0xFF27B,0xFF27A,0xFF401,0xFF27D)
-    parent(main,0x23DC,0xFF17A,0xFF301,0xFF17B)
-    parent(main,0x23DD,0xFF27C,0xFF401,0xFF27D)
-    negate(main,0x2260,0x003D)
-    dots(main,id,size,0x2026) -- ldots
-    dots(main,id,size,0x22EE) -- vdots
-    dots(main,id,size,0x22EF) -- cdots
-    dots(main,id,size,0x22F1) -- ddots
-    dots(main,id,size,0x22F0) -- udots
-    minus(main,id,size,0xFF501)
-    arrow(main,0x2190,0xFE190,0xFF501,true) -- left
-    arrow(main,0x2192,0xFE192,0xFF501,false) -- right
-    vertbar(main,id,size,0x0007C,0.10,0xFF601) -- big  : 0.85 bodyfontsize
-    vertbar(main,id,size,0xFF601,0.30,0xFF602) -- Big  : 1.15 bodyfontsize
-    vertbar(main,id,size,0xFF602,0.30,0xFF603) -- bigg : 1.45 bodyfontsize
-    vertbar(main,id,size,0xFF603,0.30,0xFF604) -- Bigg : 1.75 bodyfontsize
-    vertbar(main,id,size,0x02225,0.10,0xFF605)
-    vertbar(main,id,size,0xFF605,0.30,0xFF606)
-    vertbar(main,id,size,0xFF606,0.30,0xFF607)
-    vertbar(main,id,size,0xFF607,0.30,0xFF608)
+    brace  (main,characters,id,size,0x23DE,0xFF17A,0xFF301,0xFF17D,0xFF17C,0xFF301,0xFF17B)
+    brace  (main,characters,id,size,0x23DF,0xFF27C,0xFF401,0xFF27B,0xFF27A,0xFF401,0xFF27D)
+    parent (main,characters,id,size,0x23DC,0xFF17A,0xFF301,0xFF17B)
+    parent (main,characters,id,size,0x23DD,0xFF27C,0xFF401,0xFF27D)
+    negate (main,characters,id,size,0x2260,0x003D)
+    dots   (main,characters,id,size,0x2026) -- ldots
+    dots   (main,characters,id,size,0x22EE) -- vdots
+    dots   (main,characters,id,size,0x22EF) -- cdots
+    dots   (main,characters,id,size,0x22F1) -- ddots
+    dots   (main,characters,id,size,0x22F0) -- udots
+    minus  (main,characters,id,size,0xFF501)
+    arrow  (main,characters,id,size,0x2190,0xFE190,0xFF501,true) -- left
+    arrow  (main,characters,id,size,0x2192,0xFE192,0xFF501,false) -- right
+    vertbar(main,characters,id,size,0x0007C,0.10,0xFF601) -- big  : 0.85 bodyfontsize
+    vertbar(main,characters,id,size,0xFF601,0.30,0xFF602) -- Big  : 1.15 bodyfontsize
+    vertbar(main,characters,id,size,0xFF602,0.30,0xFF603) -- bigg : 1.45 bodyfontsize
+    vertbar(main,characters,id,size,0xFF603,0.30,0xFF604) -- Bigg : 1.75 bodyfontsize
+    vertbar(main,characters,id,size,0x02225,0.10,0xFF605)
+    vertbar(main,characters,id,size,0xFF605,0.30,0xFF606)
+    vertbar(main,characters,id,size,0xFF606,0.30,0xFF607)
+    vertbar(main,characters,id,size,0xFF607,0.30,0xFF608)
 end
 
 local unique = 0 -- testcase: \startTEXpage \math{!\text{-}\text{-}\text{-}} \stopTEXpage
diff --git a/tex/context/base/type-otf.mkiv b/tex/context/base/type-otf.mkiv
index 3d41371b7..f2dcb71fe 100644
--- a/tex/context/base/type-otf.mkiv
+++ b/tex/context/base/type-otf.mkiv
@@ -24,6 +24,11 @@
 
 \unprotect
 
+% \starttypescript [math] [modern,computer-modern,latin-modern]
+%     \definefontsynonym[MathSymbol][MathSymbol-Regular@symbol-math]
+%     \loadfontgoodies[symbol-math]
+% \stoptypescript
+
 \starttypescriptcollection[latinmodern]
 
     %D The names have changed (again) ... but I will not change the symbolic names
diff --git a/tex/context/base/type-siz.mkiv b/tex/context/base/type-siz.mkiv
index 734c262b5..fb06267d4 100644
--- a/tex/context/base/type-siz.mkiv
+++ b/tex/context/base/type-siz.mkiv
@@ -218,6 +218,8 @@
 
 \stoptypescript
 
+% ms=MathSymbol sa 1
+
 \starttypescript [math] [modern,computer-modern,latin-modern] [size]
 
   \definebodyfont [12pt] [mm] [mr=LMMathRoman12-Regular sa 1, mb=LMMathRoman12-Bold sa 1]
diff --git a/tex/context/base/x-mathml.mkiv b/tex/context/base/x-mathml.mkiv
index a32009f06..b7865a3c3 100644
--- a/tex/context/base/x-mathml.mkiv
+++ b/tex/context/base/x-mathml.mkiv
@@ -550,10 +550,6 @@
     \xmlsetup{#1}{mml:cn:polar}
 \stopxmlsetups
 
-% \doif\MMLcnalternative\v!b{\redefinemathcharacter [.][ord][mi]["3B]\relax}%
-%
-% todo: number function from mmp
-
 % helpers ci
 
 \startxmlsetups mml:cn:default
diff --git a/tex/context/fonts/symbol-math.lfg b/tex/context/fonts/symbol-math.lfg
new file mode 100644
index 000000000..d37a3b1ee
--- /dev/null
+++ b/tex/context/fonts/symbol-math.lfg
@@ -0,0 +1,17 @@
+return {
+    name = "symbol-math",
+    version = "1.00",
+    comment = "Goodies that complement symbol math.",
+    author = "Hans Hagen",
+    copyright = "ConTeXt development team",
+    mathematics = {
+        mapfiles = {
+            "mkiv-base.map",
+        },
+        virtuals = {
+            ["symbol-math"] = {
+                { name = "rsfs10", features = "virtualmath", main = true }, -- tfm name needed
+            },
+        }
+    }
+}
-- 
cgit v1.2.3