summaryrefslogtreecommitdiff
path: root/tex
diff options
context:
space:
mode:
Diffstat (limited to 'tex')
-rw-r--r--tex/context/base/anch-pgr.mkiv3
-rw-r--r--tex/context/base/anch-pos.lua131
-rw-r--r--tex/context/base/anch-pos.mkiv68
-rw-r--r--tex/context/base/back-exp.lua7
-rw-r--r--tex/context/base/cont-new.mkii2
-rw-r--r--tex/context/base/cont-new.mkiv2
-rw-r--r--tex/context/base/context-version.pdfbin4096 -> 4093 bytes
-rw-r--r--tex/context/base/context-version.pngbin105901 -> 105634 bytes
-rw-r--r--tex/context/base/context.mkii2
-rw-r--r--tex/context/base/context.mkiv3
-rw-r--r--tex/context/base/core-uti.lua2
-rw-r--r--tex/context/base/file-job.mkvi22
-rw-r--r--tex/context/base/file-mod.lua2
-rw-r--r--tex/context/base/font-con.lua62
-rw-r--r--tex/context/base/font-ctx.lua18
-rw-r--r--tex/context/base/font-ext.lua22
-rw-r--r--tex/context/base/font-otn.lua111
-rw-r--r--tex/context/base/lpdf-ano.lua15
-rw-r--r--tex/context/base/lxml-css.lua23
-rw-r--r--tex/context/base/lxml-tex.lua12
-rw-r--r--tex/context/base/m-flow.lua69
-rw-r--r--tex/context/base/m-flow.mkvi14
-rw-r--r--tex/context/base/meta-pdh.mkiv10
-rw-r--r--tex/context/base/mlib-pps.lua6
-rw-r--r--tex/context/base/mult-aux.mkiv9
-rw-r--r--tex/context/base/mult-low.lua5
-rw-r--r--tex/context/base/node-aux.lua2
-rw-r--r--tex/context/base/node-tra.lua21
-rw-r--r--tex/context/base/page-txt.mkiv2
-rw-r--r--tex/context/base/s-fnt-21.mkiv2
-rw-r--r--tex/context/base/s-fnt-26.mkiv10
-rw-r--r--tex/context/base/s-fnt-35.mkiv341
-rw-r--r--tex/context/base/status-files.pdfbin23992 -> 23935 bytes
-rw-r--r--tex/context/base/status-lua.pdfbin163154 -> 163355 bytes
-rw-r--r--tex/context/base/strc-lst.mkiv1
-rw-r--r--tex/context/base/strc-ref.lua2
-rw-r--r--tex/context/base/syst-aux.mkiv2
-rw-r--r--tex/context/base/task-ini.lua2
-rw-r--r--tex/context/base/typo-cln.lua8
-rw-r--r--tex/context/base/typo-itc.lua214
-rw-r--r--tex/context/base/typo-itc.mkvi62
-rw-r--r--tex/context/base/typo-mar.lua146
-rw-r--r--tex/context/base/typo-mar.mkiv76
-rw-r--r--tex/context/base/util-sto.lua12
-rw-r--r--tex/generic/context/luatex/luatex-fonts-merged.lua175
45 files changed, 1319 insertions, 379 deletions
diff --git a/tex/context/base/anch-pgr.mkiv b/tex/context/base/anch-pgr.mkiv
index af99602c7..19cc43e0e 100644
--- a/tex/context/base/anch-pgr.mkiv
+++ b/tex/context/base/anch-pgr.mkiv
@@ -65,7 +65,8 @@
\appendtoks \presetpositionanchors \to \beforeeverypage
\appendtoks \presetpositionanchors \to \aftereverypage
-% todo: change with each page size change
+% todo: change with each page size change .. can be made more efficient
+% as some values are the same
\def\registerpageposition#1% this one is flushed first !
{\ifpositioning\ifcase\realpageno\or
diff --git a/tex/context/base/anch-pos.lua b/tex/context/base/anch-pos.lua
index f94ed2e9a..dcecf3c79 100644
--- a/tex/context/base/anch-pos.lua
+++ b/tex/context/base/anch-pos.lua
@@ -14,14 +14,17 @@ more efficient.</p>
-- to be considered: store as numbers instead of string
-- maybe replace texsp by our own converter (stay at the lua end)
+-- eventually mp will have large numbers so we can use sp there too
local tostring = tostring
local concat, format, gmatch = table.concat, string.format, string.gmatch
local lpegmatch = lpeg.match
local allocate, mark = utilities.storage.allocate, utilities.storage.mark
-local texsp = tex.sp
+local texsp, texcount = tex.sp, tex.count
----- texsp = string.todimen -- because we cache this is much faster but no rounding
+local pts = number.pts
+
local collected = allocate()
local tobesaved = allocate()
@@ -32,24 +35,43 @@ local jobpositions = {
job.positions = jobpositions
-_ptbs_, _pcol_ = tobesaved, collected -- global
-
-local dx, dy, nx, ny = "0pt", "0pt", 0, 0
+_plib_ = jobpositions
local function initializer()
tobesaved = jobpositions.tobesaved
collected = jobpositions.collected
- _ptbs_ = tobesaved -- global
- _pcol_ = collected -- global
- -- local p = collected["page:0"] -- page:1
- -- if p then
- -- dx, nx = p[2] or "0pt", 0
- -- dy, ny = p[3] or "0pt", 0
- -- end
end
job.register('job.positions.collected', tobesaved, initializer)
+function jobpositions.setraw(name,val)
+ tobesaved[name] = val
+end
+
+function jobpositions.setdim(name,wd,ht,dp,plus) -- will be used when we move to sp allover
+ if plus then
+ tobesaved[name] = { texcount.realpageno, pdf.h, pdf.v, wd, ht, dp, plus }
+ elseif w then
+ tobesaved[name] = { texcount.realpageno, pdf.h, pdf.v, wd, ht, dp }
+ else
+ tobesaved[name] = { texcount.realpageno, pdf.h, pdf.v }
+ end
+end
+
+function jobpositions.setall(name,p,x,y,wd,ht,dp,plus) -- will be used when we move to sp allover
+ if plus then
+ tobesaved[name] = { p, x, y, wd, ht, dp, plus }
+ elseif w then
+ tobesaved[name] = { p, x, y, wd, ht, dp }
+ else
+ tobesaved[name] = { p, x, y }
+ end
+end
+
+-- _praw_ = jobpositions.setraw
+-- _pdim_ = jobpositions.setdim
+-- _pall_ = jobpositions.setall
+
function jobpositions.copy(target,source)
collected[target] = collected[source] or tobesaved[source]
end
@@ -58,10 +80,14 @@ function jobpositions.replace(name,...)
collected[name] = {...}
end
+function jobpositions.v(id,default)
+ return collected[id] or tobesaved[id] or default
+end
+
function jobpositions.page(id)
local jpi = collected[id] or tobesaved[id]
if jpi then
- return texsp(jpi[1])
+ return jpi[1]
else
return 0
end
@@ -70,7 +96,7 @@ end
function jobpositions.x(id)
local jpi = collected[id] or tobesaved[id]
if jpi then
- return texsp(jpi[2]) - nx
+ return jpi[2]
else
return 0
end
@@ -78,44 +104,28 @@ end
function jobpositions.y(id)
local jpi = collected[id] or tobesaved[id]
- if jpi then
- return texsp(jpi[3]) - ny
- else
- return 0
- end
+ return jpi and jpi[3] or 0
end
function jobpositions.width(id)
local jpi = collected[id] or tobesaved[id]
- if jpi then
- return texsp(jpi[4])
- else
- return 0
- end
+ return jpi and jpi[4] or 0
end
function jobpositions.height(id)
local jpi = collected[id] or tobesaved[id]
- if jpi then
- return texsp(jpi[5])
- else
- return 0
- end
+ return jpi and jpi[5] or 0
end
function jobpositions.depth(id)
local jpi = collected[id] or tobesaved[id]
- if jpi then
- return texsp(jpi[6])
- else
- return 0
- end
+ return jpi and jpi[6] or 0
end
function jobpositions.xy(id)
local jpi = collected[id] or tobesaved[id]
if jpi then
- return texsp(jpi[2]) - nx, texsp(jpi[3]) - ny
+ return jpi[2], jpi[3]
else
return 0, 0
end
@@ -124,7 +134,7 @@ end
function jobpositions.lowerleft(id)
local jpi = collected[id] or tobesaved[id]
if jpi then
- return texsp(jpi[2]) - nx, texsp(jpi[3]) - texsp(jpi[6]) - ny
+ return jpi[2], jpi[3] - jpi[6]
else
return 0, 0
end
@@ -133,7 +143,7 @@ end
function jobpositions.lowerright(id)
local jpi = collected[id] or tobesaved[id]
if jpi then
- return texsp(jpi[2]) + texsp(jpi[4]) - nx, texsp(jpi[3]) - texsp(jpi[6]) - ny
+ return jpi[2] + jpi[4], jpi[3] - jpi[6]
else
return 0, 0
end
@@ -142,7 +152,7 @@ end
function jobpositions.upperright(id)
local jpi = collected[id] or tobesaved[id]
if jpi then
- return texsp(jpi[2]) + texsp(jpi[4]) - nx, texsp(jpi[3]) + texsp(jpi[5]) - ny
+ return jpi[2] + jpi[4], jpi[3] + jpi[5]
else
return 0, 0
end
@@ -151,7 +161,7 @@ end
function jobpositions.upperleft(id)
local jpi = collected[id] or tobesaved[id]
if jpi then
- return texsp(jpi[2]) - nx, texsp(jpi[3]) + texsp(jpi[5]) - ny
+ return jpi[2], jpi[3] + jpi[5]
else
return 0, 0
end
@@ -160,7 +170,7 @@ end
function jobpositions.position(id)
local jpi = collected[id] or tobesaved[id]
if jpi then
- return texsp(jpi[1]), texsp(jpi[2]), texsp(jpi[3]), texsp(jpi[4]), texsp(jpi[5]), texsp(jpi[6])
+ return jpi[1], jpi[2], jpi[3], jpi[4], jpi[5], jpi[6]
else
return 0, 0, 0, 0, 0, 0
end
@@ -176,11 +186,11 @@ function jobpositions.extra(id,n,default) -- assume numbers
split = lpegmatch(splitter,jpi[7])
jpi[0] = split
end
- return texsp(split[n]) or default
+ return texsp(split[n]) or default -- watch the texsp here
end
end
-local function overlapping(one,two,overlappingmargin)
+local function overlapping(one,two,overlappingmargin) -- hm, strings so this is wrong .. texsp
one = collected[one] or tobesaved[one]
two = collected[two] or tobesaved[two]
if one and two and one[1] == two[1] then
@@ -252,50 +262,37 @@ end
function commands.MPx(id)
local jpi = collected[id] or tobesaved[id]
local x = jpi and jpi[2]
- if x then
- if nx == 0 then
- context(x)
- else
- context('\\the\\dimexpr%s-%s\\relax',x,dx)
- end
- else
- context('0pt')
- end
+ context(x and pts(x) or '0pt')
end
function commands.MPy(id)
local jpi = collected[id] or tobesaved[id]
local y = jpi and jpi[3]
- if y then
- if ny == 0 then
- context(y)
- else
- context('\\the\\dimexpr%s-%s\\relax',y,dy)
- end
- else
- context('0pt')
- end
+ context(y and pts(y) or '0pt')
end
function commands.MPw(id)
local jpi = collected[id] or tobesaved[id]
- context(jpi and jpi[4] or '0pt')
+ local w = jpi and jpi[4]
+ context(w and pts(w) or '0pt')
end
function commands.MPh(id)
local jpi = collected[id] or tobesaved[id]
- context(jpi and jpi[5] or '0pt')
+ local h = jpi and jpi[5]
+ context(h and pts(h) or '0pt')
end
function commands.MPd(id)
local jpi = collected[id] or tobesaved[id]
- context(jpi and jpi[6] or '0pt')
+ local d = jpi and jpi[6]
+ context(d and pts(d) or '0pt')
end
function commands.MPxy(id)
local jpi = collected[id] or tobesaved[id]
if jpi then
- context('(%s-%s,%s-%s)',jpi[2],dx,jpi[3],dy)
+ context('(%s,%s)',pts(jpi[2]),pts(jpi[3]))
else
context('(0,0)')
end
@@ -304,7 +301,7 @@ end
function commands.MPll(id)
local jpi = collected[id] or tobesaved[id]
if jpi then
- context('(%s-%s,%s-%s-%s)',jpi[2],dx,jpi[3],jpi[6],dy)
+ context('(%s,%s)',pts(jpi[2]),pts(jpi[3]-jpi[6]))
else
context('(0,0)')
end
@@ -313,7 +310,7 @@ end
function commands.MPlr(id)
local jpi = collected[id] or tobesaved[id]
if jpi then
- context('(%s+%s-%s,%s-%s-%s)',jpi[2],jpi[4],dx,jpi[3],jpi[6],dy)
+ context('(%s,%s)',pts(jpi[2]+jpi[4]),pts(jpi[3]-jpi[6]))
else
context('(0,0)')
end
@@ -322,7 +319,7 @@ end
function commands.MPur(id)
local jpi = collected[id] or tobesaved[id]
if jpi then
- context('(%s+%s-%s,%s+%s-%s)',jpi[2],jpi[4],dx,jpi[3],jpi[5],dy)
+ context('(%s,%s)',pts(jpi[2]+jpi[4]),pts(jpi[3]+jpi[5]))
else
context('(0,0)')
end
@@ -331,7 +328,7 @@ end
function commands.MPul(id)
local jpi = collected[id] or tobesaved[id]
if jpi then
- context('(%s-%s,%s+%s-%s)',jpi[2],dx,jpi[3],jpi[5],dy)
+ context('(%s,%s)',pts(jpi[2]),pts(jpi[3]+jpi[5]))
else
context('(0,0)')
end
diff --git a/tex/context/base/anch-pos.mkiv b/tex/context/base/anch-pos.mkiv
index 2893e5e2c..45585cf03 100644
--- a/tex/context/base/anch-pos.mkiv
+++ b/tex/context/base/anch-pos.mkiv
@@ -106,31 +106,41 @@
%D method is implemented in a special driver. If needed, the
%D driver can fall back on the following macros.
-\def\dolazysaveposition #1#2#3#4{\normalexpanded{\ctxlatelua{_ptbs_['#1']={#2,"#3","#4"}}}}
-\def\dolazysavepositionwhd #1#2#3#4#5#6#7{\normalexpanded{\ctxlatelua{_ptbs_['#1']={#2,"#3","#4","#5","#6","#7"}}}}
-\def\dolazysavepositionplus#1#2#3#4#5#6#7#8{\normalexpanded{\ctxlatelua{_ptbs_['#1']={#2,"#3","#4","#5","#6","#7","#8"}}}}
-\def\dosaveposition #1#2#3#4{\normalexpanded{\ctxlua {_ptbs_['#1']={#2,"#3","#4"}}}}
-\def\dosavepositionwhd #1#2#3#4#5#6#7{\normalexpanded{\ctxlua {_ptbs_['#1']={#2,"#3","#4","#5","#6","#7"}}}}
-\def\dosavepositionplus #1#2#3#4#5#6#7#8{\normalexpanded{\ctxlua {_ptbs_['#1']={#2,"#3","#4","#5","#6","#7","#8"}}}}
-
-\def\lastsavedpositionx {\the\dimexpr\pdflastxpos\scaledpoint\relax}
-\def\lastsavedpositiony {\the\dimexpr\pdflastypos\scaledpoint\relax}
-\let\savecurrentposition\pdfsavepos
-
-\def\dosetposition#1% will become commands.setposition
- {\savecurrentposition
- \normalexpanded{\ctxlatelua{_ptbs_['#1']={%
- \noexpand\realfolio,"\noexpand\lastsavedpositionx","\noexpand\lastsavedpositiony"}}}}
-
-\def\dosetpositionwhd#1#2#3#4%
- {\savecurrentposition
- \normalexpanded{\ctxlatelua{_ptbs_['#1']={%
- \noexpand\realfolio,"\noexpand\lastsavedpositionx","\noexpand\lastsavedpositiony","#2","#3","#4"}}}}
-
-\def\dosetpositionplus#1#2#3#4#5%
- {\savecurrentposition
- \normalexpanded{\ctxlatelua{_ptbs_['#1']={%
- \noexpand\realfolio,"\noexpand\lastsavedpositionx","\noexpand\lastsavedpositiony","#2","#3","#4","#5"}}}}
+% \def\dolazysaveposition #1#2#3#4{\normalexpanded{\ctxlatelua{_ptbs_['#1']={#2,"#3","#4"}}}}
+% \def\dolazysavepositionwhd #1#2#3#4#5#6#7{\normalexpanded{\ctxlatelua{_ptbs_['#1']={#2,"#3","#4","#5","#6","#7"}}}}
+% \def\dolazysavepositionplus#1#2#3#4#5#6#7#8{\normalexpanded{\ctxlatelua{_ptbs_['#1']={#2,"#3","#4","#5","#6","#7","#8"}}}}
+% \def\dosaveposition #1#2#3#4{\normalexpanded{\ctxlua {_ptbs_['#1']={#2,"#3","#4"}}}}
+% \def\dosavepositionwhd #1#2#3#4#5#6#7{\normalexpanded{\ctxlua {_ptbs_['#1']={#2,"#3","#4","#5","#6","#7"}}}}
+% \def\dosavepositionplus #1#2#3#4#5#6#7#8{\normalexpanded{\ctxlua {_ptbs_['#1']={#2,"#3","#4","#5","#6","#7","#8"}}}}
+%
+% \def\lastsavedpositionx {\the\dimexpr\pdflastxpos\scaledpoint\relax}
+% \def\lastsavedpositiony {\the\dimexpr\pdflastypos\scaledpoint\relax}
+% \let\savecurrentposition\pdfsavepos
+%
+% \def\dosetposition#1% will become commands.setposition
+% {\savecurrentposition
+% \normalexpanded{\ctxlatelua{_ptbs_['#1']={%
+% \noexpand\realfolio,"\noexpand\lastsavedpositionx","\noexpand\lastsavedpositiony"}}}}
+%
+% \def\dosetpositionwhd#1#2#3#4%
+% {\savecurrentposition
+% \normalexpanded{\ctxlatelua{_ptbs_['#1']={%
+% \noexpand\realfolio,"\noexpand\lastsavedpositionx","\noexpand\lastsavedpositiony","#2","#3","#4"}}}}
+%
+% \def\dosetpositionplus#1#2#3#4#5%
+% {\savecurrentposition
+% \normalexpanded{\ctxlatelua{_ptbs_['#1']={%
+% \noexpand\realfolio,"\noexpand\lastsavedpositionx","\noexpand\lastsavedpositiony","#2","#3","#4","#5"}}}}
+
+\def\dosaveposition #1#2#3#4{\normalexpanded{\ctxlua {_plib_.setall("#1",#2,#3,#4)}}}
+\def\dosavepositionwhd #1#2#3#4#5#6#7{\normalexpanded{\ctxlua {_plib_.setall("#1",#2,#3,#4,#5,#6,#7)}}}
+\def\dosavepositionplus#1#2#3#4#5#6#7#8{\normalexpanded{\ctxlua {_plib_.setall("#1",#2,#3,#4,#5,#6,#7,"#8")}}}
+
+\def\dosetposition #1{\normalexpanded{\ctxlatelua{_plib_.setdim("#1")}}}
+\def\dosetpositionwhd #1#2#3#4{\normalexpanded{\ctxlatelua{_plib_.setdim("#1","#2","#3","#4")}}}
+\def\dosetpositionplus #1#2#3#4#5{\normalexpanded{\ctxlatelua{_plib_.setdim("#1","#2","#3","#4","#5")}}}
+
+% % %
\let\dosetpositionpapersize\gobbletwoarguments
@@ -155,11 +165,6 @@
\def\replacepospxywhd#1#2#3#4#5#6#7{\ctxcommand{replacepospxywhd('#1',\number#2,"\the\dimexpr#3\relax","\the\dimexpr#4\relax","\the\dimexpr#5\relax","\the\dimexpr#6\relax","\the\dimexpr#7\relax")}}
-%D For postprocessing purposes, we save the number of
-%D positions.
-
-\newcount\currentpositions % current number of positions
-
%D The next switch can be used to communicate a special
%D situation. Positioning and associated actions can be
%D executed any time. However, in for instance backgrounds
@@ -241,8 +246,7 @@
{\ifpositioning \else
\global\positioningtrue
\dosetpositionpapersize\printpaperwidth\printpaperheight
- \fi
- \global\advance\currentpositions\plusone}
+ \fi}
\def\setpositiononly#1%
{\iftrialtypesetting
diff --git a/tex/context/base/back-exp.lua b/tex/context/base/back-exp.lua
index 11ed26366..1f5aefb86 100644
--- a/tex/context/base/back-exp.lua
+++ b/tex/context/base/back-exp.lua
@@ -309,6 +309,7 @@ local styletemplate = [[
font-style : %s ;
font-variant : %s ;
font-weight : %s ;
+ font-family : %s ;
color : %s ;
}]]
@@ -349,7 +350,11 @@ local function allusedstyles(xmlfile)
local s = xml.css.fontspecification(data.style)
local c = xml.css.colorspecification(data.color)
result[#result+1] = format(styletemplate,element,detail,
- s.style or "inherit",s.variant or "inherit",s.weight or "inherit",c or "inherit")
+ s.style or "inherit",
+ s.variant or "inherit",
+ s.weight or "inherit",
+ s.family or "inherit",
+ c or "inherit")
end
end
return concat(result,"\n\n")
diff --git a/tex/context/base/cont-new.mkii b/tex/context/base/cont-new.mkii
index 92b424e29..49df33cd1 100644
--- a/tex/context/base/cont-new.mkii
+++ b/tex/context/base/cont-new.mkii
@@ -11,7 +11,7 @@
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.
-\newcontextversion{2011.10.08 11:42}
+\newcontextversion{2011.10.12 10:14}
%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/cont-new.mkiv b/tex/context/base/cont-new.mkiv
index 30e4d1da5..bf51178c4 100644
--- a/tex/context/base/cont-new.mkiv
+++ b/tex/context/base/cont-new.mkiv
@@ -11,7 +11,7 @@
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.
-\newcontextversion{2011.10.08 11:42}
+\newcontextversion{2011.10.12 10:14}
%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-version.pdf b/tex/context/base/context-version.pdf
index be97edf8e..291952221 100644
--- a/tex/context/base/context-version.pdf
+++ b/tex/context/base/context-version.pdf
Binary files differ
diff --git a/tex/context/base/context-version.png b/tex/context/base/context-version.png
index f004e888a..3359f9548 100644
--- a/tex/context/base/context-version.png
+++ b/tex/context/base/context-version.png
Binary files differ
diff --git a/tex/context/base/context.mkii b/tex/context/base/context.mkii
index b1a490767..4636d7a4e 100644
--- a/tex/context/base/context.mkii
+++ b/tex/context/base/context.mkii
@@ -20,7 +20,7 @@
%D your styles an modules.
\edef\contextformat {\jobname}
-\edef\contextversion{2011.10.08 11:42}
+\edef\contextversion{2011.10.12 10:14}
%D For those who want to use this:
diff --git a/tex/context/base/context.mkiv b/tex/context/base/context.mkiv
index 6bfecdbc8..509e457b0 100644
--- a/tex/context/base/context.mkiv
+++ b/tex/context/base/context.mkiv
@@ -20,7 +20,7 @@
%D your styles an modules.
\edef\contextformat {\jobname}
-\edef\contextversion{2011.10.08 11:42}
+\edef\contextversion{2011.10.12 10:14}
%D For those who want to use this:
@@ -321,6 +321,7 @@
\loadmarkfile{typo-cln}
\loadmarkfile{typo-spa}
\loadmarkfile{typo-krn}
+\loadmkvifile{typo-itc}
\loadmarkfile{typo-dir}
\loadmarkfile{typo-brk}
\loadmarkfile{typo-cap}
diff --git a/tex/context/base/core-uti.lua b/tex/context/base/core-uti.lua
index ca699d297..dc341334f 100644
--- a/tex/context/base/core-uti.lua
+++ b/tex/context/base/core-uti.lua
@@ -34,7 +34,7 @@ local report_jobcontrol = logs.reporter("jobcontrol")
job = job or { }
local job = job
-job.version = 1.15
+job.version = 1.16
-- some day we will implement loading of other jobs and then we need
-- job.jobs
diff --git a/tex/context/base/file-job.mkvi b/tex/context/base/file-job.mkvi
index 3270d9511..6f26d26d7 100644
--- a/tex/context/base/file-job.mkvi
+++ b/tex/context/base/file-job.mkvi
@@ -235,4 +235,26 @@
\def\stopenvironmentindeed
{\signalendofinput\v!project}
+%D Relatively new (might move as it depends on setups):
+
+\unexpanded\def\startdocument % todo: dostarttagged\t!document
+ {\dosingleargument\start_document}
+
+\unexpanded\def\start_document[#settings]%
+ {\setvariables[document][#settings]%
+ \starttext
+ \documentvariable\c!before}
+
+\unexpanded\def\stopdocument % todo: dostoptagged\t!document
+ {\documentvariable\c!after
+ \stoptext}
+
+\def\documentvariable#1%
+ {\getvariable{document}{#1}}
+
+\setvariables
+ [document]
+ [\c!before=\directsetup{document:start},
+ \c!after=\directsetup{document:stop}]
+
\protect \endinput
diff --git a/tex/context/base/file-mod.lua b/tex/context/base/file-mod.lua
index 4d1c9aadf..2dce38bad 100644
--- a/tex/context/base/file-mod.lua
+++ b/tex/context/base/file-mod.lua
@@ -20,7 +20,7 @@ at the <l n='tex'/> side.</p>
local format, concat, tonumber = string.format, table.concat, tonumber
-local trace_modules = false trackers.register("modules.loading", function(v) trace_modules = v end)
+local trace_modules = false trackers.register("modules.loading", function(v) trace_modules = v end)
local report_modules = logs.reporter("resolvers","modules")
diff --git a/tex/context/base/font-con.lua b/tex/context/base/font-con.lua
index 18123ed1e..5352977ee 100644
--- a/tex/context/base/font-con.lua
+++ b/tex/context/base/font-con.lua
@@ -26,30 +26,30 @@ local report_defining = logs.reporter("fonts","defining")
<p>Here we only implement a few helper functions.</p>
--ldx]]--
-local fonts = fonts
-local constructors = { }
-fonts.constructors = constructors
-local handlers = { }
-fonts.handlers = handlers
+local fonts = fonts
+local constructors = { }
+fonts.constructors = constructors
+local handlers = { }
+fonts.handlers = handlers
-local specifiers = fonts.specifiers
-local contextsetups = specifiers.contextsetups
-local contextnumbers = specifiers.contextnumbers
+local specifiers = fonts.specifiers
+local contextsetups = specifiers.contextsetups
+local contextnumbers = specifiers.contextnumbers
-local allocate = utilities.storage.allocate
-local setmetatableindex = table.setmetatableindex
+local allocate = utilities.storage.allocate
+local setmetatableindex = table.setmetatableindex
-- will be directives
-constructors.dontembed = allocate()
-constructors.mathactions = { }
-constructors.autocleanup = true
-constructors.namemode = "fullpath" -- will be a function
+constructors.dontembed = allocate()
+constructors.mathactions = { }
+constructors.autocleanup = true
+constructors.namemode = "fullpath" -- will be a function
-constructors.version = 1.01
-constructors.cache = containers.define("fonts", "constructors", constructors.version, false)
+constructors.version = 1.01
+constructors.cache = containers.define("fonts", "constructors", constructors.version, false)
-constructors.privateoffset = 0xF0000 -- 0x10FFFF
+constructors.privateoffset = 0xF0000 -- 0x10FFFF
-- This might become an interface;
@@ -406,6 +406,26 @@ function constructors.scale(tfmdata,specification)
target.mathparameters = nil -- nop
end
--
+ local italickey = "italic"
+ if hasmath then
+ if properties.no_mathitalics then
+ italickey = "italic_correction" -- context specific trickery
+ if trace_defining then
+ report_defining("math italics disabled for: name '%s', fullname: '%s', filename: '%s'",
+ name or "noname",fullname or "nofullname",filename or "nofilename")
+ end
+ end
+ autoitalic = false -- new
+ else
+ if properties.no_textitalics then
+ italickey = "italic_correction" -- context specific trickery
+ if trace_defining then
+ report_defining("text italics disabled for: name '%s', fullname: '%s', filename: '%s'",
+ name or "noname",fullname or "nofullname",filename or "nofilename")
+ end
+ end
+ end
+ --
local sharedkerns = { }
--
for unicode, character in next, characters do
@@ -501,16 +521,16 @@ function constructors.scale(tfmdata,specification)
chr.right_protruding = protrusionfactor*width*vr
end
end
- -- todo: hasitalic
+ --
if autoitalic then
local vi = description.italic or (description.boundingbox[3] - description.width + autoitalic)
if vi and vi ~= 0 then
- chr.italic = vi*hdelta
+ chr[italickey] = vi*hdelta
end
elseif hasitalic then
local vi = description.italic or character.italic -- why character
if vi and vi ~= 0 then
- chr.italic = vi*hdelta
+ chr[italickey] = vi*hdelta
end
end
-- to be tested
@@ -1128,7 +1148,7 @@ function constructors.collectprocessors(what,tfmdata,features,trace,report)
end
end
end
- else
+ elseif trace then
report("no feature processors for mode %s for font %s",
mode or 'unknown', tfmdata.properties.fullname or 'unknown')
end
diff --git a/tex/context/base/font-ctx.lua b/tex/context/base/font-ctx.lua
index 7b5b5fd10..9a92cadec 100644
--- a/tex/context/base/font-ctx.lua
+++ b/tex/context/base/font-ctx.lua
@@ -108,10 +108,11 @@ setmetatableindex(fontdata, function(t,k) return nulldata end)
local chardata = allocate() -- chardata
local parameters = allocate()
-local csnames = allocate() -- namedata
local quaddata = allocate()
local markdata = allocate()
-local xheightdata = allocate() -- xheightdata
+local xheightdata = allocate()
+local csnames = allocate() -- namedata
+local italicsdata = allocate()
hashes.characters = chardata
hashes.parameters = parameters
@@ -119,6 +120,7 @@ hashes.quads = quaddata
hashes.marks = markdata
hashes.xheights = xheightdata
hashes.csnames = csnames
+hashes.italics = italicsdata
setmetatableindex(chardata, function(t,k)
local characters = fontdata[k].characters
@@ -153,6 +155,18 @@ setmetatableindex(xheightdata, function(t,k)
return quad
end)
+setmetatableindex(italicsdata, function(t,k)
+ local properties = fontdata[k].properties
+ local italics = properties and properties.italic_correction
+ if italics then
+ italics = chardata[k]
+ else
+ italics = false
+ end
+ t[k] = italics
+ return italics
+end)
+
-- this cannot be a feature initializer as there is no auto namespace
-- so we never enter the loop then; we can store the defaults in the tma
-- file (features.gpos.mkmk = 1 etc)
diff --git a/tex/context/base/font-ext.lua b/tex/context/base/font-ext.lua
index 598cfb2cb..a76d73ad9 100644
--- a/tex/context/base/font-ext.lua
+++ b/tex/context/base/font-ext.lua
@@ -529,6 +529,28 @@ registerafmfeature {
}
}
+local function initializenotextitalics(tfmdata,value)
+ tfmdata.properties.no_textitalics = value
+end
+
+registerotffeature {
+ name = "notextitalics",
+ description = "don't pass text italic correction to tex",
+ initializers = {
+ base = initializenotextitalics,
+ node = initializenotextitalics,
+ }
+}
+
+registerafmfeature {
+ name = "notextitalics",
+ description = "don't pass text italic correction to tex",
+ initializers = {
+ base = initializenotextitalics,
+ node = initializenotextitalics,
+ }
+}
+
-- slanting
local function initializeslant(tfmdata,value)
diff --git a/tex/context/base/font-otn.lua b/tex/context/base/font-otn.lua
index 914a7dee9..beb3ae740 100644
--- a/tex/context/base/font-otn.lua
+++ b/tex/context/base/font-otn.lua
@@ -445,7 +445,7 @@ local function alternative_glyph(start,alternatives,kind,chainname,chainlookupna
return choice, value
end
-local function multiple_glyphs(start,multiple)
+local function multiple_glyphs(start,multiple) -- marks ?
local nofmultiples = #multiple
if nofmultiples > 0 then
start.char = multiple[1]
@@ -957,7 +957,7 @@ single lookup case. The efficiency of the replacements can be improved by deleti
as less as needed but that would also make the code even more messy.</p>
--ldx]]--
-local function delete_till_stop(start,stop,ignoremarks)
+local function delete_till_stop(start,stop,ignoremarks) -- keeps start
local n = 1
if start == stop then
-- done
@@ -986,10 +986,6 @@ match.</p>
function chainprocs.gsub_single(start,stop,kind,chainname,currentcontext,lookuphash,currentlookup,chainlookupname,chainindex)
-- todo: marks ?
---~ if not chainindex then
---~ delete_till_stop(start,stop) -- ,currentlookup.flags[1]
---~ stop = start
---~ end
local current = start
local subtables = currentlookup.subtables
if #subtables > 1 then
@@ -1035,7 +1031,7 @@ the match.</p>
--ldx]]--
function chainprocs.gsub_multiple(start,stop,kind,chainname,currentcontext,lookuphash,currentlookup,chainlookupname)
- delete_till_stop(start,stop) -- we can assume that marks are to be deleted
+ delete_till_stop(start,stop) -- we could pass ignoremarks as #3 ..
local startchar = start.char
local subtables = currentlookup.subtables
local lookupname = subtables[1]
@@ -1565,37 +1561,41 @@ local function show_skip(kind,chainname,char,ck,class)
end
local function normal_handle_contextchain(start,kind,chainname,contexts,sequence,lookuphash)
- -- local rule, lookuptype, sequence, f, l, lookups = ck[1], ck[2] ,ck[3], ck[4], ck[5], ck[6]
- local flags, done = sequence.flags, false
- local skipmark, skipligature, skipbase = flags[1], flags[2], flags[3]
- local someskip = skipmark or skipligature or skipbase -- could be stored in flags for a fast test (hm, flags could be false !)
- local markclass = sequence.markclass -- todo, first we need a proper test
- local skipped = false
+ -- local rule, lookuptype, sequence, f, l, lookups = ck[1], ck[2] ,ck[3], ck[4], ck[5], ck[6]
+ local flags = sequence.flags
+ local done = false
+ local skipmark = flags[1]
+ local skipligature = flags[2]
+ local skipbase = flags[3]
+ local someskip = skipmark or skipligature or skipbase -- could be stored in flags for a fast test (hm, flags could be false !)
+ local markclass = sequence.markclass -- todo, first we need a proper test
+ local skipped = false
for k=1,#contexts do
- local match, current, last = true, start, start
- local ck = contexts[k]
- local seq = ck[3]
- local s = #seq
+ local match = true
+ local current = start
+ local last = start
+ local ck = contexts[k]
+ local seq = ck[3]
+ local s = #seq
-- f..l = mid string
if s == 1 then
-- never happens
match = current.id == glyph_code and current.subtype<256 and current.font == currentfont and seq[1][current.char]
else
- -- todo: better space check (maybe check for glue)
+ -- maybe we need a better space check (maybe check for glue or category or combination)
+ -- we cannot optimize for n=2 because there can be disc nodes
local f, l = ck[4], ck[5]
-- current match
- if f == 1 and f == l then
+ if f == 1 and f == l then -- current only
-- already a hit
- match = true
- else
+ -- match = true
+ else -- before/current/after | before/current | current/after
-- no need to test first hit (to be optimized)
- local n = f + 1
- last = last.next
- -- we cannot optimize for n=2 because there can be disc nodes
- -- if not someskip and n == l then
- -- -- n=2 and no skips then faster loop
- -- match = last and last.id == glyph_code and last.subtype<256 and last.font == currentfont and seq[n][last.char]
- -- else
+ if f == l then -- new, else last out of sync (f is > 1)
+ -- match = true
+ else
+ local n = f + 1
+ last = last.next
while n <= l do
if last then
local id = last.id
@@ -1617,24 +1617,29 @@ local function normal_handle_contextchain(start,kind,chainname,contexts,sequence
end
n = n + 1
else
- match = false break
+ match = false
+ break
end
else
- match = false break
+ match = false
+ break
end
else
- match = false break
+ match = false
+ break
end
- elseif id == disc_code then -- what to do with kerns?
+ elseif id == disc_code then
last = last.next
else
- match = false break
+ match = false
+ break
end
else
- match = false break
+ match = false
+ break
end
end
- -- end
+ end
end
-- before
if match and f > 1 then
@@ -1658,26 +1663,31 @@ local function normal_handle_contextchain(start,kind,chainname,contexts,sequence
elseif seq[n][char] then
n = n -1
else
- match = false break
+ match = false
+ break
end
else
- match = false break
+ match = false
+ break
end
else
- match = false break
+ match = false
+ break
end
elseif id == disc_code then
-- skip 'm
elseif seq[n][32] then
n = n -1
else
- match = false break
+ match = false
+ break
end
prev = prev.prev
elseif seq[n][32] then -- somehat special, as zapfino can have many preceding spaces
n = n -1
else
- match = false break
+ match = false
+ break
end
end
elseif f == 2 then
@@ -1685,7 +1695,8 @@ local function normal_handle_contextchain(start,kind,chainname,contexts,sequence
else
for n=f-1,1 do
if not seq[n][32] then
- match = false break
+ match = false
+ break
end
end
end
@@ -1713,26 +1724,31 @@ local function normal_handle_contextchain(start,kind,chainname,contexts,sequence
elseif seq[n][char] then
n = n + 1
else
- match = false break
+ match = false
+ break
end
else
- match = false break
+ match = false
+ break
end
else
- match = false break
+ match = false
+ break
end
elseif id == disc_code then
-- skip 'm
elseif seq[n][32] then -- brrr
n = n + 1
else
- match = false break
+ match = false
+ break
end
current = current.next
elseif seq[n][32] then
n = n + 1
else
- match = false break
+ match = false
+ break
end
end
elseif s-l == 1 then
@@ -1740,7 +1756,8 @@ local function normal_handle_contextchain(start,kind,chainname,contexts,sequence
else
for n=l+1,s do
if not seq[n][32] then
- match = false break
+ match = false
+ break
end
end
end
diff --git a/tex/context/base/lpdf-ano.lua b/tex/context/base/lpdf-ano.lua
index fe48613a9..0769296c8 100644
--- a/tex/context/base/lpdf-ano.lua
+++ b/tex/context/base/lpdf-ano.lua
@@ -429,8 +429,11 @@ function specials.page(var,actions)
if type(p) == "function" then -- double
p = p()
else
- p = tonumber(references.realpageofpage(tonumber(o)))
+ p = references.realpageofpage(tonumber(p))
end
+ -- if p then
+ -- var.r = p
+ -- end
end
return link(nil,nil,nil,p or var.operation,actions)
end
@@ -454,9 +457,15 @@ function specials.userpage(var,actions)
else
local p = var.r
if not p then -- todo: call special from reference code
- p = tonumber(references.realpageofpage(var.operation))
+ p = var.operation
+ if p then -- no function and special check here. only numbers
+ p = references.realpageofpage(tonumber(p))
+ end
+ -- if p then
+ -- var.r = p
+ -- end
end
- return link(nil,nil,nil,p,actions)
+ return link(nil,nil,nil,p or var.operation,actions)
end
end
diff --git a/tex/context/base/lxml-css.lua b/tex/context/base/lxml-css.lua
index e88c3a4a1..cf946daf7 100644
--- a/tex/context/base/lxml-css.lua
+++ b/tex/context/base/lxml-css.lua
@@ -94,11 +94,24 @@ css.padding = padding
-- context("%ssp",padding(str,pixel,hsize,exheight,emwidth))
-- end
-local pattern = Cf( Ct("") * Cg(
- Cc("style") * (C("italic") + C("oblique"))
- + Cc("variant") * C("smallcaps")
- + Cc("weight") * C("bold")
- + P(1)
+local pattern = Cf( Ct("") * (
+ Cg(
+ Cc("style") * (
+ C("italic")
+ + C("oblique")
+ + C("slanted") / "oblique"
+ )
+ + Cc("variant") * (
+ (C("smallcaps") + C("caps")) / "small-caps"
+ )
+ + Cc("weight") *
+ C("bold")
+ + Cc("family") * (
+ (C("mono") + C("type")) / "monospace" -- just ignore the "space(d)"
+ + (C("sansserif") + C("sans")) / "sans-serif" -- match before serif
+ + C("serif")
+ )
+ ) + P(1)
)^0 , rawset)
function css.fontspecification(str)
diff --git a/tex/context/base/lxml-tex.lua b/tex/context/base/lxml-tex.lua
index 0dd85a808..e77736b43 100644
--- a/tex/context/base/lxml-tex.lua
+++ b/tex/context/base/lxml-tex.lua
@@ -966,14 +966,20 @@ end
local function command(collected,cmd,otherwise)
local n = collected and #collected
if n and n > 0 then
- for c=1,n do
+ local wildcard = find(cmd,"%*")
+ for c=1,n do -- maybe optimize for n=1
local e = collected[c]
local ix = e.ix
+ local name = e.name
if not ix then
- lxml.addindex(e.name,false,true)
+ lxml.addindex(name,false,true)
ix = e.ix
end
- contextsprint(ctxcatcodes,"\\xmlw{",cmd,"}{",e.name,"::",ix,"}")
+ if wildcard then
+ contextsprint(ctxcatcodes,"\\xmlw{",(gsub(cmd,"%*",e.tg)),"}{",name,"::",ix,"}")
+ else
+ contextsprint(ctxcatcodes,"\\xmlw{",cmd,"}{",name,"::",ix,"}")
+ end
end
elseif otherwise then
contextsprint(ctxcatcodes,"\\xmlw{",otherwise,"}{#1}")
diff --git a/tex/context/base/m-flow.lua b/tex/context/base/m-flow.lua
index 9efa7a121..62d31c197 100644
--- a/tex/context/base/m-flow.lua
+++ b/tex/context/base/m-flow.lua
@@ -30,19 +30,19 @@ local defaults = {
dot = "",
},
shape = { -- FLOS
- rulethickness = 65435,
+ rulethickness = 65436,
default = "",
framecolor = "green",
backgroundcolor = "yellow",
},
focus = { -- FLOF
- rulethickness = 65435,
+ rulethickness = 65436,
framecolor = "red",
backgroundcolor = "yellow",
},
line = { -- FLOL
- rulethickness = 65435,
- radius = 65435,
+ rulethickness = 65436,
+ radius = 65436,
color = "blue",
corner = "",
dash = "",
@@ -102,17 +102,6 @@ table.setmetatableindex(validshapes,function(t,k)
return v
end)
-local replacements = {
- ["0"] = "a", ["1"] = "b", ["2"] = "c", ["3"] = "d", ["4"] = "e",
- ["5"] = "f", ["6"] = "g", ["7"] = "h", ["8"] = "i", ["9"] = "j",
-}
-
-local function cleanname(str)
- str = gsub(str,"[0-9]",replacements)
- str = gsub(str,"[^a-zA-Z]","_")
- return str
-end
-
local charts = { }
local data, hash, temp, last_x, last_y, name
@@ -373,17 +362,20 @@ local function process_cells(chart,xoffset,yoffset)
local shapedata = validshapes[shape]
context("flow_begin_sub_chart ;")
if shapedata.kind == "line" then
- context("flow_shape_line_color := \\MPcolor{%s} ;", settings.line.color)
- context("flow_shape_fill_color := \\MPcolor{%s} ;", settings.line.color)
- context("flow_shape_line_width := %s ; ", points(settings.line.rulethickness))
+ local linesettings = settings.line
+ context("flow_shape_line_color := \\MPcolor{%s} ;", linesettings.color)
+ context("flow_shape_fill_color := \\MPcolor{%s} ;", linesettings.backgroundcolor)
+ context("flow_shape_line_width := %s ; ", points(linesettingsrulethickness))
elseif hasfocus then -- doifcommonelse{FLOWcell,FLOWfocus}@@FLOWfocus
- context("flow_shape_line_color := \\MPcolor{%s} ;", settings.focus.framecolor)
- context("flow_shape_fill_color := \\MPcolor{%s} ;", settings.focus.backgroundcolor)
- context("flow_shape_line_width := %s ; ", points(settings.focus.rulethickness))
+ local focussettings = settings.focus
+ context("flow_shape_line_color := \\MPcolor{%s} ;", focussettings.framecolor)
+ context("flow_shape_fill_color := \\MPcolor{%s} ;", focussettings.backgroundcolor)
+ context("flow_shape_line_width := %s ; ", points(focussettings.rulethickness))
else
- context("flow_shape_line_color := \\MPcolor{%s} ;", settings.shape.framecolor)
- context("flow_shape_fill_color := \\MPcolor{%s} ;", settings.shape.backgroundcolor)
- context("flow_shape_line_width := %s ; " , points(settings.shape.rulethickness))
+ local shapesettings = settings.shape
+ context("flow_shape_line_color := \\MPcolor{%s} ;", shapesettings.framecolor)
+ context("flow_shape_fill_color := \\MPcolor{%s} ;", shapesettings.backgroundcolor)
+ context("flow_shape_line_width := %s ; " , points(shapesettings.rulethickness))
end
context("bodyfontsize := 10pt ;") -- todo
context("flow_peepshape := false ;") -- todo
@@ -416,18 +408,19 @@ local function process_connections(chart,xoffset,yoffset)
local otherx, othery, location = othercell.x, othercell.y, connection.location
if otherx > 0 and othery > 0 and cellx > 0 and celly > 0 and connection.location then
-- move to setter
- local what_cell, where_cell, what_other, where_other = match(location,"([%+%-pm]-)([lrtb])([%+%-pm]-)([lrtb])")
+ local what_cell, where_cell, what_other, where_other = match(location,"([%+%-pm]-)([lrtb]),?([%+%-pm]-)([lrtb])")
local what_cell = what [what_cell] or 0
local what_other = what [what_other] or 0
local where_cell = where[where_cell] or "left"
local where_other = where[where_other] or "right"
- context("flow_smooth := %s ;", settings.line.corner == variables.round and "true" or "false")
- context("flow_dashline := %s ;", settings.line.dash == variables.yes and "true" or "false")
- context("flow_arrowtip := %s ;", settings.line.arrow == variables.yes and "true" or "false")
- context("flow_touchshape := %s ;", settings.line.offset == variables.none and "true" or "false")
+ local linesettings = settings.line
+ context("flow_smooth := %s ;", linesettings.corner == variables.round and "true" or "false")
+ context("flow_dashline := %s ;", linesettings.dash == variables.yes and "true" or "false")
+ context("flow_arrowtip := %s ;", linesettings.arrow == variables.yes and "true" or "false")
+ context("flow_touchshape := %s ;", linesettings.offset == variables.none and "true" or "false")
context("flow_dsp_x := %s ; flow_dsp_y := %s ;",connection.dx or 0, connection.dy or 0)
- context("flow_connection_line_color := green ;",chart.settings.line.color)
- context("flow_connection_line_width := 2pt ;",points(chart.settings.line.rulethickness))
+ context("flow_connection_line_color := \\MPcolor{%s} ;",linesettings.color)
+ context("flow_connection_line_width := 2pt ;",points(linesettings.rulethickness))
context("flow_connect_%s_%s(%s,%s,%s) (%s,%s,%s) ;",where_cell,where_other,cellx,celly,what_cell,otherx,othery,what_other)
context("flow_dsp_x := 0 ; flow_dsp_y := 0 ;")
end
@@ -544,10 +537,10 @@ local function makechart(chart)
local gridwidth = shapewidth + 2*settings.chart.dx
local shapeheight = settings.chart.height
local gridheight = shapeheight + 2*settings.chart.dy
- context("flow_grid_width := %s ;", points(gridwidth))
- context("flow_grid_height := %s ;", points(gridheight))
- context("flow_shape_width := %s ;", points(shapewidth))
- context("flow_shape_height := %s ;", points(shapeheight))
+ context("flow_grid_width := %s ;", points(gridwidth))
+ context("flow_grid_height := %s ;", points(gridheight))
+ context("flow_shape_width := %s ;", points(shapewidth))
+ context("flow_shape_height := %s ;", points(shapeheight))
--
local radius = settings.line.radius
local rulethickness = settings.line.rulethickness
@@ -562,10 +555,10 @@ local function makechart(chart)
radius = dy
end
end
- context("flow_connection_line_width := %s ;", points(rulethickness))
+ context("flow_connection_line_width := %s ;", points(rulethickness))
context("flow_connection_smooth_size := %s ;", points(radius))
- context("flow_connection_arrow_size := %s ;", points(radius))
- context("flow_connection_dash_size := %s ;", points(radius))
+ context("flow_connection_arrow_size := %s ;", points(radius))
+ context("flow_connection_dash_size := %s ;", points(radius))
--
local offset = settings.chart.offset -- todo: pass string
if offset == variables.none or offset == variables.overlay or offset == "" then
diff --git a/tex/context/base/m-flow.mkvi b/tex/context/base/m-flow.mkvi
index c0c08059b..425d7e490 100644
--- a/tex/context/base/m-flow.mkvi
+++ b/tex/context/base/m-flow.mkvi
@@ -28,18 +28,6 @@
\unprotect
-\ifdefined \installsimplecommandhandler \else
-
- \unexpanded\def\installsimplecommandhandler#1#2#3% no define
- {\installparameterhandler {#1}{#2}%
- \installparameterhashhandler{#1}{#2}%
- \installparametersethandler {#1}{#2}%
- \installrootparameterhandler{#1}{#2}%
- \installsetuphandler {#1}{#2}%
- \installattributehandler {#1}{#2}}
-
-\fi
-
% todo: figure out a nice way to define the lot: share current and
% support current as name (nb: we need to set parent then)
@@ -175,6 +163,7 @@
line = {
rulethickness = \number\dimexpr\FLOWlineparameter\c!rulethickness,
radius = \number\dimexpr\FLOWlineparameter\c!radius,
+ color = "\FLOWlineparameter\c!color",
corner = "\FLOWlineparameter\c!corner",
dash = "\FLOWlineparameter\c!dash",
arrow = "\FLOWlineparameter\c!arrow",
@@ -221,6 +210,7 @@
line = {
rulethickness = \number\dimexpr\FLOWlineparameter\c!rulethickness,
radius = \number\dimexpr\FLOWlineparameter\c!radius,
+ color = "\FLOWlineparameter\c!color",
corner = "\FLOWlineparameter\c!corner",
dash = "\FLOWlineparameter\c!dash",
arrow = "\FLOWlineparameter\c!arrow",
diff --git a/tex/context/base/meta-pdh.mkiv b/tex/context/base/meta-pdh.mkiv
index 677b40aec..30402c6ea 100644
--- a/tex/context/base/meta-pdh.mkiv
+++ b/tex/context/base/meta-pdh.mkiv
@@ -652,16 +652,6 @@
%D \setMPlayer [test] [somepos-2] {Whatever we need there!}
%D \stoptyping
-% \defineMPspecial{50} % x y width height label
-% {\dosavepositionwhd
-% {\gMPs5}%
-% {0}%
-% {\the\dimexpr-\MPllx\onebasepoint+\gMPs1\onebasepoint\relax}
-% {\the\dimexpr\gMPs2\onebasepoint-\scratchdimen+\MPury\onebasepoint\relax}% scratchdimen ?
-% {\the\dimexpr\gMPs3\onebasepoint\relax}%
-% {\the\dimexpr\gMPs4\onebasepoint\relax}%
-% {0pt}}
-
\startMPinitializations
mp_shade_version := 2 ;
\stopMPinitializations
diff --git a/tex/context/base/mlib-pps.lua b/tex/context/base/mlib-pps.lua
index ca3bbaa75..85352d8fc 100644
--- a/tex/context/base/mlib-pps.lua
+++ b/tex/context/base/mlib-pps.lua
@@ -468,7 +468,7 @@ local do_begin_fig = "; beginfig(1) ; "
local do_end_fig = "; endfig ;"
local do_safeguard = ";"
-function metapost.texttextsdata()
+function metapost.textextsdata()
local t, nt, n = { }, 0, 0
for n, box in next, textexts do
if box then
@@ -573,7 +573,7 @@ function metapost.graphic_extra_pass(askedfig)
metapost.process(current_format, {
wrappit and do_begin_fig or "",
no_trial_run,
- concat(metapost.texttextsdata()," ;\n"),
+ concat(metapost.textextsdata()," ;\n"),
current_initializations,
do_safeguard,
current_graphic,
@@ -753,7 +753,7 @@ local function tx_analyze(object,prescript) -- todo: hash content and reuse them
s = format("\\colored[c=%f,m=%f,y=%f,k=%f]%s",c[1],c[2],c[3],c[4],s)
end
end
- context.MPLIBsettext(tx_number,s)
+ context.MPLIBsettext(tx_number,s) -- combine colored in here, saves call
metapost.multipass = true
end
end
diff --git a/tex/context/base/mult-aux.mkiv b/tex/context/base/mult-aux.mkiv
index e19db2481..ea4337809 100644
--- a/tex/context/base/mult-aux.mkiv
+++ b/tex/context/base/mult-aux.mkiv
@@ -274,6 +274,15 @@
\installswitchsetuphandler {#1}{#2}%
\installattributehandler {#1}{#2}}
+\unexpanded\def\installsimplecommandhandler#1#2#3% no define (experiment)
+ {\installparameterhandler {#1}{#2}%
+ \installparameterhashhandler{#1}{#2}%
+ \installparametersethandler {#1}{#2}%
+ \installrootparameterhandler{#1}{#2}%
+ \installsetuphandler {#1}{#2}%
+ \installattributehandler {#1}{#2}}
+
+
\unexpanded\def\installnamespace#1%
{\setvalue{????#1}{@@@@#1}}
diff --git a/tex/context/base/mult-low.lua b/tex/context/base/mult-low.lua
index d76010e07..3b581061e 100644
--- a/tex/context/base/mult-low.lua
+++ b/tex/context/base/mult-low.lua
@@ -46,7 +46,7 @@ return {
"startcomponent", "stopcomponent", "component",
"startproduct", "stopproduct", "product",
"startproject", "stopproject", "project",
- "starttext", "stoptext",
+ "starttext", "stoptext", "startdocument", "stopdocument", "documentvariable",
"startmodule", "stopmodule", "usemodule",
},
["helpers"] = {
@@ -61,6 +61,7 @@ return {
--
"htdp",
"unvoidbox",
+ "vfilll",
--
"scratchcounter", "globalscratchcounter",
"scratchdimen", "globalscratchdimen",
@@ -88,6 +89,7 @@ return {
"doifdimensionelse", "doifnumberelse",
"doifcommonelse", "doifcommon", "doifnotcommon",
"doifinstring", "doifnotinstring", "doifinstringelse",
+ "doifassignmentelse",
--
"tracingall", "tracingnone", "loggingall",
--
@@ -141,5 +143,6 @@ return {
--
"startnointerference", "stopnointerference",
--
+ "strut", "setstrut", "strutbox", "strutht", "strutdp", "strutwd",
}
}
diff --git a/tex/context/base/node-aux.lua b/tex/context/base/node-aux.lua
index df62dda27..fc5b8ff9c 100644
--- a/tex/context/base/node-aux.lua
+++ b/tex/context/base/node-aux.lua
@@ -6,6 +6,8 @@ if not modules then modules = { } end modules ['node-aux'] = {
license = "see context related readme files"
}
+-- todo: n1 .. n2 : __concat metatable
+
local type, tostring = type, tostring
local nodes, node = nodes, node
diff --git a/tex/context/base/node-tra.lua b/tex/context/base/node-tra.lua
index 5012095b3..3b5b1d018 100644
--- a/tex/context/base/node-tra.lua
+++ b/tex/context/base/node-tra.lua
@@ -643,15 +643,32 @@ local bpfactor = number.dimenfactors.bp
local stripper = lpeg.patterns.stripzeros
local points = function(n)
- return lpegmatch(stripper,format("%.5fpt",n*ptfactor))
+ if not n or n == 0 then
+ return "0pt"
+ else
+ return lpegmatch(stripper,format("%.5fpt",n*ptfactor))
+ end
end
local basepoints = function(n)
- return lpegmatch(stripper,format("%.5fbp",n*bpfactor))
+ if not n or n == 0 then
+ return "0bp"
+ else
+ return lpegmatch(stripper,format("%.5fbp",n*bpfactor))
+ end
+end
+
+local pts = function(n)
+ if not n or n == 0 then
+ return "0pt"
+ else
+ return format("%.5fpt",n*ptfactor)
+ end
end
number.points = points
number.basepoints = basepoints
+number.pts = pts
--~ function nodes.thespec(s)
--~ local stretch_order = s.stretch_order
diff --git a/tex/context/base/page-txt.mkiv b/tex/context/base/page-txt.mkiv
index 012f1acf0..57f391f7c 100644
--- a/tex/context/base/page-txt.mkiv
+++ b/tex/context/base/page-txt.mkiv
@@ -446,6 +446,8 @@
\calculatehsizes
\swapmargins
\vskip\dimexpr\headerheight+\headerdistance+\layoutparameter\c!textdistance\relax
+ \dontleavehmode
+ % \dosetanchor{text}% failed experiment
\hbox to \makeupwidth
{\bgroup
\swapmargins
diff --git a/tex/context/base/s-fnt-21.mkiv b/tex/context/base/s-fnt-21.mkiv
index 3e1bf0ad3..a48854679 100644
--- a/tex/context/base/s-fnt-21.mkiv
+++ b/tex/context/base/s-fnt-21.mkiv
@@ -1,4 +1,4 @@
-D \module
+%D \module
%D [ file=s-fnt-20,
%D version=2009.01.10,
%D title=\CONTEXT\ Style File,
diff --git a/tex/context/base/s-fnt-26.mkiv b/tex/context/base/s-fnt-26.mkiv
index b8da09533..904091f06 100644
--- a/tex/context/base/s-fnt-26.mkiv
+++ b/tex/context/base/s-fnt-26.mkiv
@@ -71,4 +71,12 @@
\def\showgoodiesfeaturesets #1{\ctxlua{document.show_goodies_featuresets ("#1")}}
\def\showgoodiescolorschemes#1{\ctxlua{document.show_goodies_colorschemes("#1")}}
-\endinput
+\continueifinputfile{s-fnt-26.mkiv}
+
+\starttext
+
+ \showgoodiesstylistics {husayni}
+ \showgoodiesfeaturesets {husayni}
+ \showgoodiescolorschemes{husayni}
+
+\stoptext
diff --git a/tex/context/base/s-fnt-35.mkiv b/tex/context/base/s-fnt-35.mkiv
new file mode 100644
index 000000000..157d3062c
--- /dev/null
+++ b/tex/context/base/s-fnt-35.mkiv
@@ -0,0 +1,341 @@
+%D \module
+%D [ file=s-fnt-35,
+%D version=2011.10.10,
+%D title=\CONTEXT\ Style File,
+%D subtitle=Feature List,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+% we already have a way to show character tables
+
+\startluacode
+
+-- the table will move to a font-* file
+
+moduledata.fonts = moduledata.fonts or { }
+
+local digits = {
+ dflt = {
+ dflt = "1234567890 1/2",
+ },
+}
+
+local punctuation = {
+ dflt = {
+ dflt = ". , : ; ? !",
+ },
+}
+
+local symbols = {
+ dflt = {
+ dflt = "@ # $ % & * () [] {} <> + - = / |",
+ },
+}
+
+local uppercase = {
+ latn = {
+ dflt = "ABCDEFGHIJKLMNOPQRSTUVWXYZ",
+ },
+ grek = {
+ dftl = "ΑΒΓΔΕΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩ",
+ },
+ cyrl= {
+ dflt = "АБВГДЕЖЗИІЙКЛМНОПРСТУФХЦЧШЩЪЫЬѢЭЮЯѲ"
+ },
+}
+
+local lowercase = {
+ latn = {
+ dftl = "abcdefghijklmnopqrstuvwxyz",
+ },
+ grek = {
+ dftl = "αβγδεηθικλμνξοπρστυφχψω",
+ },
+ cyrl= {
+ dflt = "абвгдежзиійклмнопрстуфхцчшщъыьѣэюяѳ"
+ },
+}
+
+local samples = {
+ digits = digits,
+ punctuation = punctuation,
+ symbols = symbols,
+ uppercase = uppercase,
+ lowercase = lowercase,
+}
+
+fonts.tracers.samples = samples
+
+table.setmetatableindex(uppercase, function(t,k) return rawget(t,"latn") end)
+table.setmetatableindex(lowercase, function(t,k) return rawget(t,"latn") end)
+table.setmetatableindex(digits, function(t,k) return rawget(t,"dflt") end)
+table.setmetatableindex(symbols, function(t,k) return rawget(t,"dflt") end)
+table.setmetatableindex(punctuation, function(t,k) return rawget(t,"dflt") end)
+
+table.setmetatableindex(uppercase.latn, function(t,k) return rawget(t,"dflt") end)
+table.setmetatableindex(uppercase.grek, function(t,k) return rawget(t,"dflt") end)
+table.setmetatableindex(uppercase.cyrl, function(t,k) return rawget(t,"dflt") end)
+
+table.setmetatableindex(lowercase.latn, function(t,k) return rawget(t,"dflt") end)
+table.setmetatableindex(lowercase.grek, function(t,k) return rawget(t,"dflt") end)
+table.setmetatableindex(lowercase.cyrl, function(t,k) return rawget(t,"dflt") end)
+
+table.setmetatableindex(digits.dflt, function(t,k) return rawget(t,"dflt") end)
+table.setmetatableindex(symbols.dflt, function(t,k) return rawget(t,"dflt") end)
+table.setmetatableindex(punctuation.dflt, function(t,k) return rawget(t,"dflt") end)
+
+fonts.constructors.keys = {
+ properties = {
+ encodingbytes = "number",
+ embedding = "number",
+ cidinfo = "table",
+ format = "string",
+ fontname = "string",
+ fullname = "string",
+ filename = "filename",
+ psname = "string",
+ name = "string",
+ virtualized = "boolean",
+ italic_correction = "boolean",
+ auto_italic_correction = "boolean",
+ no_stackmath = "boolean",
+ noglyphnames = "boolean",
+ mode = "string",
+ has_math = "boolean",
+ no_math_italics = "boolean",
+ no_text_italics = "boolean",
+ finalized = "boolean",
+ },
+ parameters = {
+ mathsize = "scaledpoints",
+ scriptpercentage = "float",
+ scriptscriptpercentage = "float",
+ units = "cardinal",
+ designsize = "basepoints",
+ expansion = "table",
+ protrusion = "table",
+ expand_factor = "float",
+ slant_factor = "float",
+ factor = "float",
+ hfactor = "float",
+ vfactor = "float",
+ size = "scaledpoints",
+ units = "scaledpoints",
+ scaledpoints = "scaledpoints",
+ slant = "float",
+ space = "scaledpoints",
+ space_stretch = "scaledpoints",
+ space_shrink = "scaledpoints",
+ x_height = "scaledpoints",
+ quad = "scaledpoints",
+ extra_space = "scaledpoints",
+ ascender = "scaledpoints",
+ descender = "scaledpoints",
+ },
+}
+
+-- parameters.expansion = {
+-- stretch = tfmdata.stretch or 0,
+-- shrink = tfmdata.shrink or 0,
+-- step = tfmdata.step or 0,
+-- auto = tfmdata.auto_expand or false,
+-- }
+-- parameters.protrusion = {
+-- auto = auto_protrude
+-- }
+
+local function showtable(t,keys)
+ if t then
+ context.starttabulate { "|Tl|Tl|" }
+ for k, v in table.sortedhash(keys) do
+ context.NC()
+ context(k)
+ context.NC()
+ local tk = t[k]
+ if not tk then
+ context("<unset>")
+ elseif v == "filename" then
+ context(file.basename(tk))
+ elseif v == "boolean" then
+ context(tostring(tk or false))
+ elseif v == "scaledpoints" or v == "basepoints" then
+ context(number.points(tk))
+ elseif v == "table" then
+ -- todo
+ context("<table>")
+ else
+ context(tostring(tk))
+ end
+ context.NC()
+ context.NR()
+ end
+ context.stoptabulate()
+ end
+end
+
+function moduledata.fonts.show_properties()
+ local tfmdata = fonts.hashes.identifiers[font.current()]
+ showtable(tfmdata.properties,fonts.constructors.keys.properties)
+end
+
+function moduledata.fonts.show_parameters()
+ local tfmdata = fonts.hashes.identifiers[font.current()]
+ showtable(tfmdata.parameters,fonts.constructors.keys.parameters)
+end
+
+function moduledata.fonts.show_positional_features()
+ local tfmdata = fonts.hashes.identifiers[font.current()]
+ local resources = tfmdata.resources
+ if resources then
+ local features = resources.features
+ if features then
+ local gpos = features.gpos
+ if gpos and next(gpos) then
+ context.starttabulate { "|Tl|Tl|Tlp|" }
+ for feature, scripts in table.sortedpairs(gpos) do
+ for script, languages in table.sortedpairs(scripts) do
+ context.NC()
+ context(feature)
+ context.NC()
+ context(script)
+ context.NC()
+ context(table.concat(table.sortedkeys(languages)," "))
+ context.NC()
+ context.NR()
+ end
+ end
+ context.stoptabulate()
+ else
+ context("no entries")
+ context.par()
+ end
+ end
+ end
+end
+
+local dynamics = true
+
+function moduledata.fonts.show_substitution_features()
+ local tfmdata = fonts.hashes.identifiers[font.current()]
+ local resources = tfmdata.resources
+ if resources then
+ local features = resources.features
+ if features then
+ local gsub = features.gsub
+ if gsub then
+ local makes_sense = { }
+ for feature, scripts in table.sortedpairs(gsub) do
+ for script, languages in table.sortedpairs(scripts) do
+ for language in table.sortedpairs(languages) do
+ local tag = string.format("dummy-%s-%s-%s",feature,script,language)
+ local fnt = string.format("file:%s*%s",file.basename(tfmdata.properties.filename),tag)
+ context.definefontfeature (
+ { tag },
+ {
+ mode = "node",
+ script = script,
+ language = language,
+ [feature] = "yes"
+ }
+ )
+ if not dynamics then
+ context.definefont( { fnt }, { fnt } )
+ end
+ makes_sense[#makes_sense+1] = {
+ feature = feature,
+ tag = tag,
+ script = script,
+ language = language,
+ fontname = fnt,
+ }
+ end
+ end
+ end
+ if #makes_sense > 0 then
+ context.starttabulate { "|Tl|Tl|Tl|p|" }
+ for i=1,#makes_sense do
+ local data = makes_sense[i]
+ local script = data.script
+ local language = data.language
+ context.NC()
+ context(data.feature)
+ context.NC()
+ context(script)
+ context.NC()
+ context(language)
+ context.NC()
+ if not dynamics then
+ context.startfont { data.fontname }
+ else
+ context.addff(data.tag)
+ end
+ context.verbatim(samples.lowercase [script][language]) context.par()
+ context.verbatim(samples.uppercase [script][language]) context.par()
+ context.verbatim(samples.digits [script][language]) context.par()
+ context.verbatim(samples.punctuation[script][language])
+ context.verbatim(samples.symbols [script][language])
+ if not dynamics then
+ context.stopfont()
+ end
+ context.NC()
+ context.NR()
+ end
+ context.stoptabulate()
+ else
+ context("no entries")
+ context.par()
+ end
+ end
+ end
+ end
+end
+
+function moduledata.fonts.show_a_lot(title)
+
+ if title == "" then title = false end
+
+ if title then
+ context.starttitle { title = title }
+ end
+
+ context.startsubject { title = "Properties" }
+ moduledata.fonts.show_properties()
+ context.stopsubject()
+
+ context.startsubject { title = "Parameters" }
+ moduledata.fonts.show_parameters()
+ context.stopsubject()
+
+ context.startsubject { title = "Positional features" }
+ moduledata.fonts.show_positional_features()
+ context.stopsubject()
+
+ context.startsubject { title = "Substitution features" }
+ moduledata.fonts.show_substitution_features()
+ context.stopsubject()
+
+ if title then
+ context.stoptitle()
+ end
+
+end
+
+\stopluacode
+
+% todo: make a mtxrun --script --font <name> option
+
+\continueifinputfile{s-fnt-35.mkiv}
+
+\usemodule[art-01]
+
+\setupbodyfont
+ [cambria]
+
+\starttext
+ \ctxlua{moduledata.fonts.show_a_lot("Cambria")}
+\stoptext
diff --git a/tex/context/base/status-files.pdf b/tex/context/base/status-files.pdf
index ad5015f08..533df1129 100644
--- a/tex/context/base/status-files.pdf
+++ b/tex/context/base/status-files.pdf
Binary files differ
diff --git a/tex/context/base/status-lua.pdf b/tex/context/base/status-lua.pdf
index 6ecca0352..3ce4e99c2 100644
--- a/tex/context/base/status-lua.pdf
+++ b/tex/context/base/status-lua.pdf
Binary files differ
diff --git a/tex/context/base/strc-lst.mkiv b/tex/context/base/strc-lst.mkiv
index ec09b3b2d..d24a8b2f5 100644
--- a/tex/context/base/strc-lst.mkiv
+++ b/tex/context/base/strc-lst.mkiv
@@ -390,7 +390,6 @@
\dostructurelistinject[#1][\c!type=userdata][#2]%
\fi}}
-
\def\dowritetolist[#1][#2]#3#4% we can overload location
{\doif{\namedlistparameter{#1}\c!state}\v!start
{\ifsecondargument
diff --git a/tex/context/base/strc-ref.lua b/tex/context/base/strc-ref.lua
index da0549bb9..f83301b4e 100644
--- a/tex/context/base/strc-ref.lua
+++ b/tex/context/base/strc-ref.lua
@@ -1770,7 +1770,7 @@ end
local plist, nofrealpages
-local function realpageofpage(p)
+local function realpageofpage(p) -- the last one counts !
if not plist then
local pages = structures.pages.collected
nofrealpages = #pages
diff --git a/tex/context/base/syst-aux.mkiv b/tex/context/base/syst-aux.mkiv
index 3ef9acaaa..f73f4436c 100644
--- a/tex/context/base/syst-aux.mkiv
+++ b/tex/context/base/syst-aux.mkiv
@@ -3240,6 +3240,8 @@
\egroup
+\unexpanded\def\texdefinition#1{\csname\ifcsname#1\endcsname#1\else donothing\fi\endcsname}
+
% This is a first variant, more might be added:
\def\starttexcode{\unprotect}
diff --git a/tex/context/base/task-ini.lua b/tex/context/base/task-ini.lua
index c3122aee0..b044e8c6a 100644
--- a/tex/context/base/task-ini.lua
+++ b/tex/context/base/task-ini.lua
@@ -41,6 +41,7 @@ appendaction("processors", "fonts", "nodes.handlers.stripping")
appendaction("processors", "lists", "typesetters.spacings.handler") -- disabled
appendaction("processors", "lists", "typesetters.kerns.handler") -- disabled
appendaction("processors", "lists", "typesetters.digits.handler") -- disabled (after otf handling)
+appendaction("processors", "lists", "typesetters.italics.handler") -- disabled (after otf/kern handling)
appendaction("shipouts", "normalizers", "nodes.handlers.cleanuppage") -- disabled
appendaction("shipouts", "normalizers", "typesetters.alignments.handler")
@@ -99,6 +100,7 @@ disableaction("processors", "typesetters.directions.handler")
disableaction("processors", "languages.words.check")
disableaction("processors", "typesetters.spacings.handler")
disableaction("processors", "typesetters.kerns.handler")
+disableaction("processors", "typesetters.italics.handler")
disableaction("processors", "nodes.handlers.stripping")
disableaction("shipouts", "typesetters.alignments.handler")
diff --git a/tex/context/base/typo-cln.lua b/tex/context/base/typo-cln.lua
index a8542c1a1..e36575bce 100644
--- a/tex/context/base/typo-cln.lua
+++ b/tex/context/base/typo-cln.lua
@@ -1,6 +1,6 @@
-if not modules then modules = { } end modules ['typo-cap'] = {
+if not modules then modules = { } end modules ['typo-cln'] = {
version = 1.001,
- comment = "companion to typo-cap.mkiv",
+ comment = "companion to typo-cln.mkiv",
author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
copyright = "PRAGMA ADE / ConTeXt Development Team",
license = "see context related readme files"
@@ -15,8 +15,8 @@ local utfbyte = utf.byte
local trace_cleaners = false trackers.register("typesetters.cleaners", function(v) trace_cleaners = v end)
local trace_autocase = false trackers.register("typesetters.cleaners.autocase",function(v) trace_autocase = v end)
-local report_cleaners = logs.reporters("nodes","cleaners")
-local report_autocase = logs.reporters("nodes","autocase")
+local report_cleaners = logs.reporter("nodes","cleaners")
+local report_autocase = logs.reporter("nodes","autocase")
typesetters.cleaners = typesetters.cleaners or { }
local cleaners = typesetters.cleaners
diff --git a/tex/context/base/typo-itc.lua b/tex/context/base/typo-itc.lua
new file mode 100644
index 000000000..9cf4de8cd
--- /dev/null
+++ b/tex/context/base/typo-itc.lua
@@ -0,0 +1,214 @@
+if not modules then modules = { } end modules ['typo-itc'] = {
+ version = 1.001,
+ comment = "companion to typo-itc.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local utfchar = utf.char
+
+local trace_italics = false trackers.register("typesetters.italics", function(v) trace_italics = v end)
+
+local report_italics = logs.reporter("nodes","italics")
+
+typesetters.italics = typesetters.italics or { }
+local italics = typesetters.italics
+
+local nodecodes = nodes.nodecodes
+local glyph_code = nodecodes.glyph
+local kern_code = nodecodes.kern
+local glue_code = nodecodes.glue
+
+local tasks = nodes.tasks
+
+local insert_node_after = node.insert_after
+local delete_node = nodes.delete
+local has_attribute = node.has_attribute
+
+local texattribute = tex.attribute
+local a_italics = attributes.private("italics")
+local unsetvalue = attributes.unsetvalue
+
+----- new_correction = nodes.pool.fontkern
+----- new_correction = nodes.pool.fontkern
+local new_correction = nodes.pool.glue
+
+local points = number.points
+
+local fonthashes = fonts.hashes
+local fontdata = fonthashes.identifiers
+local chardata = fonthashes.characters
+local italicsdata = fonthashes.italics
+
+local forcedvariant = false
+
+function typesetters.italics.forcevariant(variant)
+ forcedvariant = variant
+end
+
+-- we could delay the calculations in the font scaler to here:
+--
+-- local description = descdata[char]
+-- local vi = description.italic or (description.boundingbox[3] - description.width + properties[font].auto_italic_correction)
+-- if vi and vi ~= 0 then
+-- italic = vi*parameters[font].hfactor
+-- end
+--
+-- this saves us quite entries in the characters table
+
+local function process(namespace,attribute,head)
+ local done = false
+ local italic = 0
+ local lastfont = nil
+ local lastattr = nil
+ local previous = nil
+ local prevchar = nil
+ local current = head
+ local inserted = nil
+ while current do
+ local id = current.id
+ if id == glyph_code then
+ local font = current.font
+ local char = current.char
+ local data = italicsdata[font]
+ if font ~= lastfont then
+ if italic ~= 0 then
+ if data then
+ if trace_italics then
+ report_italics("ignoring %s between italic %s and italic %s",points(italic),utfchar(prevchar),utfchar(char))
+ end
+ else
+ if trace_italics then
+ report_italics("inserting %s between italic %s and regular %s",points(italic),utfchar(prevchar),utfchar(char))
+ end
+ insert_node_after(head,previous,new_correction(italic),new_correction(italic))
+ done = true
+ end
+ elseif inserted and data then
+ if trace_italics then
+ report_italics("deleting last correction before %s",utfchar(char))
+ end
+ delete_node(head,inserted)
+ end
+ end
+ if data then
+ local attr = forcedvariant or has_attribute(current,attribute)
+ if attr and attr > 0 then
+ local cd = data[char]
+ italic = cd.italic or cd.italic_correction
+ if not italic then
+ italic = 0
+ elseif italic ~= 0 then
+ lastfont = font
+ lastattr = attr
+ previous = current
+ prevchar = char
+ end
+ else
+ italic = 0
+ end
+ else
+ italic = 0
+ end
+ inserted = nil
+ elseif id == kern_code then
+ inserted = nil
+ italic = 0
+ elseif id == glue_code then
+ if italic ~= 0 then
+ if trace_italics then
+ report_italics("inserting %s between italic %s and glue",points(italic),utfchar(prevchar))
+ end
+ inserted = new_correction(italic)
+ insert_node_after(head,previous,inserted)
+ italic = 0
+ done = true
+ end
+ elseif italic ~= 0 then
+ if trace_italics then
+ report_italics("inserting %s between italic %s and whatever",points(italic),utfchar(prevchar))
+ end
+ inserted = nil
+ insert_node_after(head,previous,new_correction(italic),new_correction(italic))
+ italic = 0
+ done = true
+ end
+ current = current.next
+ end
+ if italic ~= 0 and lastattr > 1 then -- more control is needed here
+ if trace_italics then
+ report_italics("inserting %s between italic %s and end of list",points(italic),utfchar(prevchar))
+ end
+ insert_node_after(head,previous,new_correction(italic),new_correction(italic))
+ done = true
+ end
+ return head, done
+end
+
+local enable
+
+enable = function()
+ tasks.enableaction("processors","typesetters.italics.handler")
+ if trace_italics then
+ report_italics("enabling italics")
+ end
+ enable = false
+end
+
+function italics.set(n)
+ if enable then
+ enable()
+ end
+ texattribute[a_italics] = n
+end
+
+function italics.reset()
+ texattribute[a_italics] = unsetvalue
+end
+
+italics.handler = nodes.installattributehandler {
+ name = "italics",
+ namespace = italics,
+ processor = process,
+}
+
+local variables = interfaces.variables
+local settings_to_hash = utilities.parsers.settings_to_hash
+
+function commands.setupitaliccorrection(option) -- no grouping !
+ if enable then
+ enable()
+ end
+ local options = settings_to_hash(option)
+ local variant = unsetvalue
+ if options[variables.text] then
+ variant = 1
+ elseif options[variables.always] then
+ variant = 2
+ end
+ if options[variables.global] then
+ forcevariant = variant
+ texattribute[a_italics] = unsetvalue
+ else
+ forcevariant = false
+ texattribute[a_italics] = variant
+ end
+ if trace_italics then
+ report_italics("force: %s, variant: %s",tostring(forcevariant),tostring(variant ~= unsetvalue and variant))
+ end
+end
+
+-- for manuals:
+
+local stack = { }
+
+function commands.pushitaliccorrection()
+ table.insert(stack,{forcevariant, texattribute[a_italics] })
+end
+
+function commands.popitaliccorrection()
+ local top = table.remove(stack)
+ forcevariant = top[1]
+ texattribute[a_italics] = top[2]
+end
diff --git a/tex/context/base/typo-itc.mkvi b/tex/context/base/typo-itc.mkvi
new file mode 100644
index 000000000..471b905b4
--- /dev/null
+++ b/tex/context/base/typo-itc.mkvi
@@ -0,0 +1,62 @@
+%D \module
+%D [ file=typo-itc,
+%D version=2011.10.08,
+%D title=\CONTEXT\ Typesetting Macros,
+%D subtitle=Italic Correction,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Typesetting Macros / Italics Corrections}
+
+\unprotect
+
+%D The brave might try:
+%D
+%D \starttyping
+%D \definefontfeature[default][default][itlc=yes,notextitalics=yes]
+%D \setupitaliccorrection[global,always]
+%D \stoptyping
+
+\registerctxluafile{typo-itc}{1.001}
+
+\definesystemattribute[italics][public]
+
+% \let\/=/
+% \let\emphasiscorrection\donothing
+
+\ifdefined \normalitaliccorrection \else
+ \let\normalitaliccorrection\italiccorrection
+\fi
+
+\unexpanded\def\italiccorrection
+ {\ifnum\attribute\italicsattribute<\plusone\normalitaliccorrection\fi}
+
+\let\/\italicscorrection
+
+% 1 = end of word
+% 2 = end of word and end of a list
+
+\unexpanded\def\setitaliccorrection[#code]% rather low level (might go away)
+ {\ctxlua{typesetters.italics.set(\number#code)}}
+
+\unexpanded\def\resetitaliccorrection% rather low level (might go away)
+ {\ctxlua{typesetters.italics.reset()}}
+
+% global : no attributes, just always (faster and less memory)
+% text : only text
+% always : text and boxes
+% none : -
+
+\unexpanded\def\setupitaliccorrection[#settings]%
+ {\ctxcommand{setupitaliccorrection("#settings")}}
+
+\appendtoks
+ \attribute\italicsattribute\attributeunsetvalue
+\to \everymathematics
+
+\protect \endinput
diff --git a/tex/context/base/typo-mar.lua b/tex/context/base/typo-mar.lua
index 8b25d95f9..431523154 100644
--- a/tex/context/base/typo-mar.lua
+++ b/tex/context/base/typo-mar.lua
@@ -13,6 +13,66 @@ if not modules then modules = { } end modules ['typo-mar'] = {
-- using margin data then as also vertical spacing kicks in
-- * floating margin data, with close-to-call anchoring
+-- -- experiment (does not work, too much interference)
+--
+-- local pdfprint = pdf.print
+-- local format = string.format
+--
+-- anchors = anchors or { }
+--
+-- local whatever = { }
+-- local factor = (7200/7227)/65536
+--
+-- function anchors.set(tag)
+-- whatever[tag] = { pdf.h, pdf.v }
+-- end
+--
+-- function anchors.reset(tag)
+-- whatever[tag] = nil
+-- end
+--
+-- function anchors.startmove(tag,how)
+-- local w = whatever[tag]
+-- if not w then
+-- -- error
+-- elseif how == "horizontal" or how == "h" then
+-- pdfprint("page",format(" q 1 0 0 1 %s 0 cm ", (w[1] - pdf.h) * factor))
+-- elseif how == "vertical" or how == "v" then
+-- pdfprint("page",format(" q 1 0 0 1 0 %s cm ", (w[2] - pdf.v) * factor))
+-- else
+-- pdfprint("page",format(" q 1 0 0 1 %s %s cm ", (w[1] - pdf.h) * factor, (w[2] - pdf.v) * factor))
+-- end
+-- end
+--
+-- function anchors.stopmove(tag)
+-- local w = whatever[tag]
+-- if not w then
+-- -- error
+-- else
+-- pdfprint("page"," Q ")
+-- end
+-- end
+--
+-- local latelua = nodes.pool.latelua
+--
+-- function anchors.node_set(tag)
+-- return latelua(format("anchors.set(%q)",tag))
+-- end
+--
+-- function anchors.node_reset(tag)
+-- return latelua(format("anchors.reset(%q)",tag))
+-- end
+--
+-- function anchors.node_start_move(tag,how)
+-- return latelua(format("anchors.startmove(%q,%q)",tag,how))
+-- end
+--
+-- function anchors.node_stop_move(tag)
+-- return latelua(format("anchors.stopmove(%q)",tag))
+-- end
+
+-- so far
+
local format = string.format
local insert, remove = table.insert, table.remove
local setmetatable, next = setmetatable, next
@@ -84,6 +144,7 @@ local nodepool = nodes.pool
local new_kern = nodepool.kern
local new_stretch = nodepool.stretch
local new_usernumber = nodepool.usernumber
+local new_latelua = nodepool.latelua
local texcount = tex.count
local texdimen = tex.dimen
@@ -150,14 +211,25 @@ local defaults = {
local enablelocal, enableglobal -- forward reference (delayed initialization)
+-- local function showstore(store,banner)
+-- if #store == 0 then
+-- report_margindata("%s: nothing stored",banner)
+-- else
+-- for i=1,#store do
+-- local si =store[i]
+-- report_margindata("%s: stored at %s: %s => %s",banner,i,si.name or "no name",nodes.toutf(si.box.list))
+-- end
+-- end
+-- end
+
local function showstore(store,banner)
- if #store == 0 then
- report_margindata("%s: nothing stored",banner)
- else
- for i=1,#store do
+ if next(store) then
+ for i, si in table.sortedpairs(store) do
local si =store[i]
report_margindata("%s: stored at %s: %s => %s",banner,i,si.name or "no name",nodes.toutf(si.box.list))
end
+ else
+ report_margindata("%s: nothing stored",banner)
end
end
@@ -195,11 +267,21 @@ function margins.save(t)
showstore(store,"before ")
end
if name and name ~= "" then
- for i=#store,1,-1 do
- local si = store[i]
- if si.name == name then
- local s = remove(store,i)
- free_node_list(s.box)
+ if inlinestore then -- todo: inline store has to be done differently (not sparse)
+ local t = table.sortedkeys(store) for j=#t,1,-1 do local i = t[i]
+ local si = store[i]
+ if si.name == name then
+ local s = remove(store,i)
+ free_node_list(s.box)
+ end
+ end
+ else
+ for i=#store,1,-1 do
+ local si = store[i]
+ if si.name == name then
+ local s = remove(store,i)
+ free_node_list(s.box)
+ end
end
end
if trace_marginstack then
@@ -253,7 +335,7 @@ end
-- When the prototype inner/outer code that was part of this proved to be
-- okay it was moved elsewhere.
-local status, nofstatus = { }, 0
+local status, nofstatus, anchors = { }, 0, 0
local function realign(current,candidate)
local location = candidate.location
@@ -285,6 +367,7 @@ local function realign(current,candidate)
if leftpage then
leftdistance, rightdistance = rightdistance, leftdistance
end
+
if location == v_left then
delta = hoffset + width + leftdistance + leftdelta
elseif location == v_right then
@@ -302,15 +385,31 @@ local function realign(current,candidate)
delta = -hoffset - hsize - rightdistance + rightdelta
end
end
+
-- we assume that list is a hbox, otherwise we had to take the whole current
-- in order to get it right
+
current.width = 0
---~ delta = delta + hsize
- current.list = hpack_nodes(link_nodes(new_kern(-delta),current.list,new_kern(delta)))
- current.width = 0
- if trace_margindata then
- report_margindata("realigned: %s, location: %s, margin: %s",candidate.n,location,margin)
+
+ if candidate.inline then -- this mess is needed for alignments (combinations)
+ anchors = anchors + 1
+ local anchor = new_latelua(format("_plib_.setraw('_md_:%s',pdf.h)",anchors))
+ local blob_x = job.positions.v("_md_:"..anchors) or 0
+ local text_x = job.positions.x("text:"..tex.count.realpageno) or 0
+ local move_x = text_x - blob_x
+ delta = delta - move_x
+ current.list = hpack_nodes(link_nodes(anchor,new_kern(-delta),current.list,new_kern(delta)))
+ if trace_margindata then
+ report_margindata("realigned: %s, location: %s, margin: %s, move: %s",candidate.n,location,margin,number.points(move_x))
+ end
+ else
+ current.list = hpack_nodes(link_nodes(new_kern(-delta),current.list,new_kern(delta)))
+ if trace_margindata then
+ report_margindata("realigned: %s, location: %s, margin: %s",candidate.n,location,margin)
+ end
end
+
+ current.width = 0
end
local function realigned(current,a)
@@ -468,7 +567,7 @@ local function flushed(scope,parent) -- current is hlist
local location = locations[l]
local store = displaystore[category][location][scope]
while true do
- local candidate = remove(store,1)
+ local candidate = remove(store,1) -- brr, local stores are sparse
if candidate then -- no vpack, as we want to realign
head = inject(parent,head,candidate) -- maybe return applied offset
done = true
@@ -534,11 +633,15 @@ function margins.localhandler(head,group)
end
end
-function margins.globalhandler(head,group)
+function margins.globalhandler(head,group) -- check group
--~ print(group)
- if conditionals.inhibitmargindata then
+ if conditionals.inhibitmargindata or nofstored == 0 then
return head, false
- elseif nofstored > 0 and group == "hmode_par" then
+ elseif group == "hmode_par" then
+ return handler("global",head,group)
+ elseif group == "vmode_par" then -- experiment (for alignments)
+ return handler("global",head,group)
+ elseif group == "box" then -- experiment (for alignments)
return handler("global",head,group)
else
return head, false
@@ -583,6 +686,9 @@ function margins.finalhandler(head)
end
end
+-- Somehow the vbox builder (in combinations) gets pretty confused and decides to
+-- go horizontal. So this needs more testing.
+
prependaction("finalizers", "lists", "typesetters.margins.localhandler")
prependaction("vboxbuilders", "normalizers", "typesetters.margins.localhandler")
prependaction("mvlbuilders", "normalizers", "typesetters.margins.globalhandler")
@@ -595,7 +701,7 @@ disableaction("shipouts", "typesetters.margins.finalhandler")
enablelocal = function()
enableaction("finalizers", "typesetters.margins.localhandler")
- enableaction("vboxbuilders", "typesetters.margins.localhandler")
+ -- enableaction("vboxbuilders", "typesetters.margins.localhandler")
enableaction("shipouts", "typesetters.margins.finalhandler")
enablelocal = nil
end
diff --git a/tex/context/base/typo-mar.mkiv b/tex/context/base/typo-mar.mkiv
index 269ab83a1..99ed1ac0d 100644
--- a/tex/context/base/typo-mar.mkiv
+++ b/tex/context/base/typo-mar.mkiv
@@ -136,27 +136,41 @@
\newconditional\inhibitmargindata % This one is used at the Lua end!
\newtoks \everymargindatacontent % Later on we will set this one.
-\unexpanded\def\margindata[#name]%
- {\setfalse\inhibitmargindata % flushing afterwards
- \begingroup
- %\settrue\inhibitmargindata % no flushing in here
- \def\currentmargindata{#name}%
- \let\currentmarginframed\currentmargindata
- \dodoubleempty\domargindata}
-
\appendtoks
\settrue\inhibitmargindata
\to \everyforgetall
-% option test -> ruled
-
\appendtoks
\forgetall
\tf
\deactivatecolor
\to \everymargindatacontent
-\unexpanded\def\domargindata[#dataparameters][#textparameters]#content%
+% trialtypesetting: no need for margin stuff while trialing as
+% is has no dimensions
+
+\unexpanded\def\margindata
+ {\iftrialtypesetting
+ \expandafter\nomargindata
+ \else
+ \expandafter\domargindata
+ \fi}
+
+\def\nomargindata[#name]%
+ {\dodoubleempty\donomargindata}
+
+\def\domargindata[#name]%
+ {\setfalse\inhibitmargindata % flushing afterwards
+ \begingroup
+ %\settrue\inhibitmargindata % no flushing in here
+ \def\currentmargindata{#name}%
+ \let\currentmarginframed\currentmargindata
+ \dodoubleempty\dodomargindata}
+
+\unexpanded\def\donomargindata[#dataparameters][#textparameters]#content%
+ {}
+
+\unexpanded\def\dodomargindata[#dataparameters][#textparameters]#content%
{\iffirstargument
\setupcurrentmargindata[#dataparameters]%
\fi
@@ -192,22 +206,25 @@
\let\currentmarginfirstheight\empty
\else
\dosetraggedcommand{\margindataparameter\c!align}%
- \setbox\nextbox\hbox \bgroup\vtop \bgroup % hbox is needed
- \the\everymargindatacontent
- \dosetmargindataattributes\c!style\c!color
- \hsize\currentmargindatawidth
- \raggedcommand
- \ifx\currentmargindatastrut\empty \else
- \dosetupstrut[\currentmargindatastrut]%
- \fi
- \begstrut\margindataparameter\c!command{#content}\endstrut
- \egroup \egroup
+ % hbox is always needed
+ \vtop \bgroup
+ \the\everymargindatacontent
+ \dosetmargindataattributes\c!style\c!color
+ \hsize\currentmargindatawidth
+ \raggedcommand
+ \ifx\currentmargindatastrut\empty \else
+ \dosetupstrut[\currentmargindatastrut]%
+ \fi
+ \begstrut\margindataparameter\c!command{#content}\endstrut
+ \egroup
+ \egroup
\edef\currentmarginfirstheight{true}%
\fi
\fi
\dostoptagged
\fi
\ifdone
+ \initializenextposition % we use positions at the lua end
\ctxlua{typesetters.margins.save{
\c!location = "\margindataparameter\c!location",
\c!method = "\margindataparameter\c!method",
@@ -229,7 +246,7 @@
\c!align = "\margindataparameter\c!align",
\c!line = "\margindataparameter\c!line",
\c!stack = "\margindataparameter\c!stack",
- \c!number = \number\nextbox
+ \c!number = \number\nextbox,
}}%
\else
\ctxlua{typesetters.margins.save{
@@ -345,4 +362,19 @@
\let\setupinmargin\setupmargindata % only partial (no framed)
+% begin of experimental code (will move)
+%
+% \dosetanchor{x}test \dostarthanchoring{x}\llap{crap}\dostophanchoring{x}test test test
+% test \dostarthanchoring{text}\llap{crap}\dostophanchoring{text}test test test
+
+% \def\dosetanchor #1{\dontleavehmode\latelua{anchors.set("#1")}}
+% \def\doresetanchor #1{\dontleavehmode\latelua{anchors.reset("#1")}}
+% \def\doresetanchornow #1{\directlua{anchors.reset("#1")}}
+% \def\dostartanchoring #1{\dontleavehmode\latelua{anchors.startmove("#1")}}
+% \def\dostopanchoring #1{\dontleavehmode\latelua{anchors.stopmove("#1")}}
+% \def\dostarthanchoring#1{\dontleavehmode\latelua{anchors.startmove("#1","h")}}
+% \def\dostartvanchoring#1{\dontleavehmode\latelua{anchors.startmove("#1","v")}}
+% \let\dostophanchoring \dostopanchoring
+% \let\dostopvanchoring \dostopanchoring
+
\protect \endinput
diff --git a/tex/context/base/util-sto.lua b/tex/context/base/util-sto.lua
index 4c0052f0e..052e472cf 100644
--- a/tex/context/base/util-sto.lua
+++ b/tex/context/base/util-sto.lua
@@ -98,13 +98,13 @@ end
-- table namespace ?
-local function f_empty() return "" end -- t,k
-local function f_self(t,k) t[k] = k return k end
-local function f_ignore() end -- t,k,v
+local function f_empty () return "" end -- t,k
+local function f_self (t,k) t[k] = k return k end
+local function f_ignore() end -- t,k,v
-local t_empty = { __index = empty }
-local t_self = { __index = self }
-local t_ignore = { __newindex = ignore }
+local t_empty = { __index = f_empty }
+local t_self = { __index = f_self }
+local t_ignore = { __newindex = f_ignore }
function table.setmetatableindex(t,f)
local m = getmetatable(t)
diff --git a/tex/generic/context/luatex/luatex-fonts-merged.lua b/tex/generic/context/luatex/luatex-fonts-merged.lua
index 7156e0a00..7d2846b28 100644
--- a/tex/generic/context/luatex/luatex-fonts-merged.lua
+++ b/tex/generic/context/luatex/luatex-fonts-merged.lua
@@ -1,6 +1,6 @@
-- merged file : luatex-fonts-merged.lua
-- parent file : luatex-fonts.lua
--- merge date : 10/08/11 11:42:24
+-- merge date : 10/12/11 10:14:56
do -- begin closure to overcome local limits and interference
@@ -3184,30 +3184,30 @@ local report_defining = logs.reporter("fonts","defining")
<p>Here we only implement a few helper functions.</p>
--ldx]]--
-local fonts = fonts
-local constructors = { }
-fonts.constructors = constructors
-local handlers = { }
-fonts.handlers = handlers
+local fonts = fonts
+local constructors = { }
+fonts.constructors = constructors
+local handlers = { }
+fonts.handlers = handlers
-local specifiers = fonts.specifiers
-local contextsetups = specifiers.contextsetups
-local contextnumbers = specifiers.contextnumbers
+local specifiers = fonts.specifiers
+local contextsetups = specifiers.contextsetups
+local contextnumbers = specifiers.contextnumbers
-local allocate = utilities.storage.allocate
-local setmetatableindex = table.setmetatableindex
+local allocate = utilities.storage.allocate
+local setmetatableindex = table.setmetatableindex
-- will be directives
-constructors.dontembed = allocate()
-constructors.mathactions = { }
-constructors.autocleanup = true
-constructors.namemode = "fullpath" -- will be a function
+constructors.dontembed = allocate()
+constructors.mathactions = { }
+constructors.autocleanup = true
+constructors.namemode = "fullpath" -- will be a function
-constructors.version = 1.01
-constructors.cache = containers.define("fonts", "constructors", constructors.version, false)
+constructors.version = 1.01
+constructors.cache = containers.define("fonts", "constructors", constructors.version, false)
-constructors.privateoffset = 0xF0000 -- 0x10FFFF
+constructors.privateoffset = 0xF0000 -- 0x10FFFF
-- This might become an interface;
@@ -3564,6 +3564,26 @@ function constructors.scale(tfmdata,specification)
target.mathparameters = nil -- nop
end
--
+ local italickey = "italic"
+ if hasmath then
+ if properties.no_mathitalics then
+ italickey = "italic_correction" -- context specific trickery
+ if trace_defining then
+ report_defining("math italics disabled for: name '%s', fullname: '%s', filename: '%s'",
+ name or "noname",fullname or "nofullname",filename or "nofilename")
+ end
+ end
+ autoitalic = false -- new
+ else
+ if properties.no_textitalics then
+ italickey = "italic_correction" -- context specific trickery
+ if trace_defining then
+ report_defining("text italics disabled for: name '%s', fullname: '%s', filename: '%s'",
+ name or "noname",fullname or "nofullname",filename or "nofilename")
+ end
+ end
+ end
+ --
local sharedkerns = { }
--
for unicode, character in next, characters do
@@ -3659,16 +3679,16 @@ function constructors.scale(tfmdata,specification)
chr.right_protruding = protrusionfactor*width*vr
end
end
- -- todo: hasitalic
+ --
if autoitalic then
local vi = description.italic or (description.boundingbox[3] - description.width + autoitalic)
if vi and vi ~= 0 then
- chr.italic = vi*hdelta
+ chr[italickey] = vi*hdelta
end
elseif hasitalic then
local vi = description.italic or character.italic -- why character
if vi and vi ~= 0 then
- chr.italic = vi*hdelta
+ chr[italickey] = vi*hdelta
end
end
-- to be tested
@@ -4286,7 +4306,7 @@ function constructors.collectprocessors(what,tfmdata,features,trace,report)
end
end
end
- else
+ elseif trace then
report("no feature processors for mode %s for font %s",
mode or 'unknown', tfmdata.properties.fullname or 'unknown')
end
@@ -8640,7 +8660,7 @@ local function alternative_glyph(start,alternatives,kind,chainname,chainlookupna
return choice, value
end
-local function multiple_glyphs(start,multiple)
+local function multiple_glyphs(start,multiple) -- marks ?
local nofmultiples = #multiple
if nofmultiples > 0 then
start.char = multiple[1]
@@ -9152,7 +9172,7 @@ single lookup case. The efficiency of the replacements can be improved by deleti
as less as needed but that would also make the code even more messy.</p>
--ldx]]--
-local function delete_till_stop(start,stop,ignoremarks)
+local function delete_till_stop(start,stop,ignoremarks) -- keeps start
local n = 1
if start == stop then
-- done
@@ -9181,10 +9201,6 @@ match.</p>
function chainprocs.gsub_single(start,stop,kind,chainname,currentcontext,lookuphash,currentlookup,chainlookupname,chainindex)
-- todo: marks ?
---~ if not chainindex then
---~ delete_till_stop(start,stop) -- ,currentlookup.flags[1]
---~ stop = start
---~ end
local current = start
local subtables = currentlookup.subtables
if #subtables > 1 then
@@ -9230,7 +9246,7 @@ the match.</p>
--ldx]]--
function chainprocs.gsub_multiple(start,stop,kind,chainname,currentcontext,lookuphash,currentlookup,chainlookupname)
- delete_till_stop(start,stop) -- we can assume that marks are to be deleted
+ delete_till_stop(start,stop) -- we could pass ignoremarks as #3 ..
local startchar = start.char
local subtables = currentlookup.subtables
local lookupname = subtables[1]
@@ -9760,37 +9776,41 @@ local function show_skip(kind,chainname,char,ck,class)
end
local function normal_handle_contextchain(start,kind,chainname,contexts,sequence,lookuphash)
- -- local rule, lookuptype, sequence, f, l, lookups = ck[1], ck[2] ,ck[3], ck[4], ck[5], ck[6]
- local flags, done = sequence.flags, false
- local skipmark, skipligature, skipbase = flags[1], flags[2], flags[3]
- local someskip = skipmark or skipligature or skipbase -- could be stored in flags for a fast test (hm, flags could be false !)
- local markclass = sequence.markclass -- todo, first we need a proper test
- local skipped = false
+ -- local rule, lookuptype, sequence, f, l, lookups = ck[1], ck[2] ,ck[3], ck[4], ck[5], ck[6]
+ local flags = sequence.flags
+ local done = false
+ local skipmark = flags[1]
+ local skipligature = flags[2]
+ local skipbase = flags[3]
+ local someskip = skipmark or skipligature or skipbase -- could be stored in flags for a fast test (hm, flags could be false !)
+ local markclass = sequence.markclass -- todo, first we need a proper test
+ local skipped = false
for k=1,#contexts do
- local match, current, last = true, start, start
- local ck = contexts[k]
- local seq = ck[3]
- local s = #seq
+ local match = true
+ local current = start
+ local last = start
+ local ck = contexts[k]
+ local seq = ck[3]
+ local s = #seq
-- f..l = mid string
if s == 1 then
-- never happens
match = current.id == glyph_code and current.subtype<256 and current.font == currentfont and seq[1][current.char]
else
- -- todo: better space check (maybe check for glue)
+ -- maybe we need a better space check (maybe check for glue or category or combination)
+ -- we cannot optimize for n=2 because there can be disc nodes
local f, l = ck[4], ck[5]
-- current match
- if f == 1 and f == l then
+ if f == 1 and f == l then -- current only
-- already a hit
- match = true
- else
+ -- match = true
+ else -- before/current/after | before/current | current/after
-- no need to test first hit (to be optimized)
- local n = f + 1
- last = last.next
- -- we cannot optimize for n=2 because there can be disc nodes
- -- if not someskip and n == l then
- -- -- n=2 and no skips then faster loop
- -- match = last and last.id == glyph_code and last.subtype<256 and last.font == currentfont and seq[n][last.char]
- -- else
+ if f == l then -- new, else last out of sync (f is > 1)
+ -- match = true
+ else
+ local n = f + 1
+ last = last.next
while n <= l do
if last then
local id = last.id
@@ -9812,24 +9832,29 @@ local function normal_handle_contextchain(start,kind,chainname,contexts,sequence
end
n = n + 1
else
- match = false break
+ match = false
+ break
end
else
- match = false break
+ match = false
+ break
end
else
- match = false break
+ match = false
+ break
end
- elseif id == disc_code then -- what to do with kerns?
+ elseif id == disc_code then
last = last.next
else
- match = false break
+ match = false
+ break
end
else
- match = false break
+ match = false
+ break
end
end
- -- end
+ end
end
-- before
if match and f > 1 then
@@ -9853,26 +9878,31 @@ local function normal_handle_contextchain(start,kind,chainname,contexts,sequence
elseif seq[n][char] then
n = n -1
else
- match = false break
+ match = false
+ break
end
else
- match = false break
+ match = false
+ break
end
else
- match = false break
+ match = false
+ break
end
elseif id == disc_code then
-- skip 'm
elseif seq[n][32] then
n = n -1
else
- match = false break
+ match = false
+ break
end
prev = prev.prev
elseif seq[n][32] then -- somehat special, as zapfino can have many preceding spaces
n = n -1
else
- match = false break
+ match = false
+ break
end
end
elseif f == 2 then
@@ -9880,7 +9910,8 @@ local function normal_handle_contextchain(start,kind,chainname,contexts,sequence
else
for n=f-1,1 do
if not seq[n][32] then
- match = false break
+ match = false
+ break
end
end
end
@@ -9908,26 +9939,31 @@ local function normal_handle_contextchain(start,kind,chainname,contexts,sequence
elseif seq[n][char] then
n = n + 1
else
- match = false break
+ match = false
+ break
end
else
- match = false break
+ match = false
+ break
end
else
- match = false break
+ match = false
+ break
end
elseif id == disc_code then
-- skip 'm
elseif seq[n][32] then -- brrr
n = n + 1
else
- match = false break
+ match = false
+ break
end
current = current.next
elseif seq[n][32] then
n = n + 1
else
- match = false break
+ match = false
+ break
end
end
elseif s-l == 1 then
@@ -9935,7 +9971,8 @@ local function normal_handle_contextchain(start,kind,chainname,contexts,sequence
else
for n=l+1,s do
if not seq[n][32] then
- match = false break
+ match = false
+ break
end
end
end