diff options
author | Marius <mariausol@gmail.com> | 2011-10-26 16:20:15 +0300 |
---|---|---|
committer | Marius <mariausol@gmail.com> | 2011-10-26 16:20:15 +0300 |
commit | c0e8f19d4913755e53cfc8658cc4f91230e4d351 (patch) | |
tree | c6254d1b7532cba7cb51bcf79402302324a7e7bb /tex | |
parent | a5d21303302bf6d9b36b4f83cf2117a7afc6bf23 (diff) | |
download | context-c0e8f19d4913755e53cfc8658cc4f91230e4d351.tar.gz |
beta 2011.10.26 15:10
Diffstat (limited to 'tex')
32 files changed, 926 insertions, 932 deletions
diff --git a/tex/context/base/back-exp.lua b/tex/context/base/back-exp.lua index dd6e13515..4fd5aa32d 100644 --- a/tex/context/base/back-exp.lua +++ b/tex/context/base/back-exp.lua @@ -2131,10 +2131,12 @@ local function cleanxhtmltree(xmltree) for e in xml.collected(xmltree,"link") do local at = e.at local href - if at.url then + if at.location then + href = "#" .. gsub(at.location,":","_") + elseif at.url then href = at.url - elseif at.location then - at.href = "#" .. gsub(at.location,":","_") + elseif at.file then + href = at.file end if href then wrapper.at.href = href diff --git a/tex/context/base/cont-new.mkii b/tex/context/base/cont-new.mkii index ce7f33086..f3d979a4b 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.24 21:26} +\newcontextversion{2011.10.26 15:10} %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 9d7f08092..94e082a36 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.24 21:26} +\newcontextversion{2011.10.26 15:10} %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 Binary files differindex 71af8f3f7..2f6eed468 100644 --- a/tex/context/base/context-version.pdf +++ b/tex/context/base/context-version.pdf diff --git a/tex/context/base/context-version.png b/tex/context/base/context-version.png Binary files differindex c1279e9d8..7ef6208ce 100644 --- a/tex/context/base/context-version.png +++ b/tex/context/base/context-version.png diff --git a/tex/context/base/context.mkii b/tex/context/base/context.mkii index caa1f36f2..d489e30b6 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.24 21:26} +\edef\contextversion{2011.10.26 15:10} %D For those who want to use this: diff --git a/tex/context/base/context.mkiv b/tex/context/base/context.mkiv index d7a74fcf7..76056b772 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.24 21:26} +\edef\contextversion{2011.10.26 15:10} %D For those who want to use this: diff --git a/tex/context/base/font-con.lua b/tex/context/base/font-con.lua index 75d90f136..93567cb2d 100644 --- a/tex/context/base/font-con.lua +++ b/tex/context/base/font-con.lua @@ -7,6 +7,8 @@ if not modules then modules = { } end modules ['font-con'] = { } +-- some names of table entries will be changed (no _) + local utf = unicode.utf8 local next, tostring, rawget = next, tostring, rawget @@ -51,7 +53,80 @@ constructors.cache = containers.define("fonts", "constructors", constr constructors.privateoffset = 0xF0000 -- 0x10FFFF --- This might become an interface; +-- Some experimental helpers (handy for tracing): + +constructors.keys = { + properties = { + encodingbytes = "number", + embedding = "number", + cidinfo = { + }, + 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 = "scalespoints", + expansion = { + stretch = "integerscale", -- might become float + shrink = "integerscale", -- might become float + step = "integerscale", -- might become float + auto = "boolean", + }, + protrusion = { + auto = "boolean", + }, + 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", + }, + description = { + width = "basepoints", + height = "basepoints", + depth = "basepoints", + boundingbox = { }, + }, + character = { + width = "scaledpoints", + height = "scaledpoints", + depth = "scaledpoints", + italic = "scaledpoints", + }, + +} + +-- This might become an interface: local designsizes = allocate() constructors.designsizes = designsizes diff --git a/tex/context/base/font-otf.lua b/tex/context/base/font-otf.lua index cab6fae2b..cb309a39f 100644 --- a/tex/context/base/font-otf.lua +++ b/tex/context/base/font-otf.lua @@ -12,6 +12,8 @@ if not modules then modules = { } end modules ['font-otf'] = { -- to_table -> totable -- ascent descent +-- more checking against low level calls of functions + local utf = unicode.utf8 local utfbyte = utf.byte diff --git a/tex/context/base/font-otn.lua b/tex/context/base/font-otn.lua index beb3ae740..af8264939 100644 --- a/tex/context/base/font-otn.lua +++ b/tex/context/base/font-otn.lua @@ -399,6 +399,11 @@ local function toligature(kind,lookupname,start,stop,char,markflag,discfound) -- start = start.next end end + -- we do need components in funny kerning mode but maybe I can better reconstruct then + -- as we do have the font components info available; removing components makes the + -- previous code much simpler + -- + -- flush_node_list(head.components) return head end end diff --git a/tex/context/base/font-tra.mkiv b/tex/context/base/font-tra.mkiv index 8344b7658..0f16dbc43 100644 --- a/tex/context/base/font-tra.mkiv +++ b/tex/context/base/font-tra.mkiv @@ -50,6 +50,7 @@ {\begingroup \tttf\language\minusone \veryraggedright + \forgetparindent \hangindent1em \hangafter\plusone \dontleavehmode\hbox{\detokenize{#1}}\removeunwantedspaces @@ -67,7 +68,10 @@ {\ctxlua{nodes.tracers.steppers.features()}} \def\showotfsteps - {\dontleavehmode\bgroup\tttf \language\minusone features: \showotfstepfeatures\egroup + {\begingroup + \veryraggedright + \forgetparindent + \dontleavehmode\bgroup\tttf \language\minusone features: \showotfstepfeatures\egroup \blank \dontleavehmode\bgroup\tttf result:\egroup \blank @@ -84,14 +88,17 @@ \blank \startlinecorrection \ruledhbox % can be mode - \bgroup\resetallattributes\showotfstepglyphs\recurselevel\egroup % reset is new, we don't want additional processing + \bgroup\resetallattributes\showotfstepglyphs\recurselevel\egroup % reset is new, we don't want additional processing \stoplinecorrection - \blank}} + \blank}% + \endgroup} \unexpanded\def\startotfsample {\enabletrackers[*otf.sample]% beware, kind of global \startotfcollecting - \begingroup} + \begingroup + \veryraggedright + \forgetparindent} \unexpanded\def\stopotfsample {\endgroup @@ -104,6 +111,8 @@ \def\showotfcomposition#1#2#3% {font*features at size}, rl=-1, text {\begingroup + \veryraggedright + \forgetparindent \setupcolors[\c!state=\v!start]% can be option \startotfsample \global\setbox\otfcompositionbox\hbox{\definedfont[#1]\ifnum#2<0 \textdir TRT\else\ifnum#2>0 \textdir TLT\fi\fi\relax#3}% diff --git a/tex/context/base/m-chart.lua b/tex/context/base/m-chart.lua index 943e6be63..0000d28e5 100644 --- a/tex/context/base/m-chart.lua +++ b/tex/context/base/m-chart.lua @@ -711,6 +711,8 @@ local function getchart(settings) if miny == 0 or y > maxy then maxy = y end end end +-- print("1>",x,y,nx,ny) +-- print("2>",minx, miny, maxx, maxy) -- check of window should be larger (maybe autofocus + nx/ny?) if autofocus then -- x and y are ignored @@ -725,15 +727,16 @@ local function getchart(settings) minx = x end if y and y > 0 then - minx = y + miny = y end if nx and nx > 0 then maxx = minx + nx - 1 end if ny and ny > 0 then - miny = miny + ny - 1 + maxy = miny + ny - 1 end end +-- print("3>",minx, miny, maxx, maxy) -- local nx = maxx - minx + 1 local ny = maxy - miny + 1 diff --git a/tex/context/base/node-ini.lua b/tex/context/base/node-ini.lua index a27efe0cf..0ed17a1b5 100644 --- a/tex/context/base/node-ini.lua +++ b/tex/context/base/node-ini.lua @@ -94,6 +94,12 @@ local skipcodes = allocate { [18] = "thickmuskip", } +local penaltycodes = allocate { -- unfortunately not used + [ 0] = "userpenalty", +} + +table.setmetatableindex(penaltycodes,function(t,k) return "userpenalty" end) -- not used anyway + local noadcodes = allocate { [ 0] = "ord", [ 1] = "opdisplaylimits", @@ -158,25 +164,27 @@ end local nodecodes = simplified(node.types()) local whatcodes = simplified(node.whatsits()) -skipcodes = allocate(swapped(skipcodes, skipcodes )) -noadcodes = allocate(swapped(noadcodes, noadcodes )) -nodecodes = allocate(swapped(nodecodes, nodecodes )) -whatcodes = allocate(swapped(whatcodes, whatcodes )) -listcodes = allocate(swapped(listcodes, listcodes )) -glyphcodes = allocate(swapped(glyphcodes,glyphcodes)) -kerncodes = allocate(swapped(kerncodes, kerncodes )) -mathcodes = allocate(swapped(mathcodes, mathcodes )) -fillcodes = allocate(swapped(fillcodes, fillcodes )) - -nodes.skipcodes = skipcodes nodes.gluecodes = skipcodes -- more official -nodes.noadcodes = noadcodes -nodes.nodecodes = nodecodes -nodes.whatcodes = whatcodes nodes.whatsitcodes = whatcodes -- more official -nodes.listcodes = listcodes -nodes.glyphcodes = glyphcodes -nodes.kerncodes = kerncodes -nodes.mathcodes = mathcodes -nodes.fillcodes = fillcodes +skipcodes = allocate(swapped(skipcodes, skipcodes )) +noadcodes = allocate(swapped(noadcodes, noadcodes )) +nodecodes = allocate(swapped(nodecodes, nodecodes )) +whatcodes = allocate(swapped(whatcodes, whatcodes )) +listcodes = allocate(swapped(listcodes, listcodes )) +glyphcodes = allocate(swapped(glyphcodes, glyphcodes)) +kerncodes = allocate(swapped(kerncodes, kerncodes )) +penaltycodes = allocate(swapped(penaltycodes, penaltycodes )) +mathcodes = allocate(swapped(mathcodes, mathcodes )) +fillcodes = allocate(swapped(fillcodes, fillcodes )) + +nodes.skipcodes = skipcodes nodes.gluecodes = skipcodes -- more official +nodes.noadcodes = noadcodes +nodes.nodecodes = nodecodes +nodes.whatcodes = whatcodes nodes.whatsitcodes = whatcodes -- more official +nodes.listcodes = listcodes +nodes.glyphcodes = glyphcodes +nodes.kerncodes = kerncodes +nodes.penaltycodes = kerncodes +nodes.mathcodes = mathcodes +nodes.fillcodes = fillcodes listcodes.row = listcodes.alignment listcodes.column = listcodes.alignment diff --git a/tex/context/base/page-mis.lua b/tex/context/base/page-mis.lua index 21c122fa2..d32eb8a00 100644 --- a/tex/context/base/page-mis.lua +++ b/tex/context/base/page-mis.lua @@ -23,7 +23,15 @@ local function flush(page) end local function setnextpage() - tex.setcount("global","postponed_page_blocks_next_page",next(cache) and sortedkeys(cache)[1] or -1) + local n = next(cache) and sortedkeys(cache)[1] + if not n then + n = 0 -- nothing in the cache + elseif n == 0 then + n = -1 -- generic buffer (0) + elseif n > 0 then + -- upcoming page (realpageno) + end + tex.setcount("global","postponed_page_blocks_next_page",n) end function commands.flushpostponedblocks(page) diff --git a/tex/context/base/page-mis.mkiv b/tex/context/base/page-mis.mkiv index 808f42aa6..d3c1e5051 100644 --- a/tex/context/base/page-mis.mkiv +++ b/tex/context/base/page-mis.mkiv @@ -207,21 +207,23 @@ \restoreglobalbodyfont % otherwise problems inside split verbatim \ctxcommand{flushpostponedblocks()}% \relax - \doflushfloats % new but potential dangerous - \egroup} + \doflushfloats % new but potential dangerous, maybe we need a classification + \egroup} % of blocks: with and without flush \def\doflushpostponedblocks {\ifinpostponing % probably a nested flush \else\ifnum\postponed_page_blocks_next_page=\zerocount + % nothing in cache + \else\ifnum\postponed_page_blocks_next_page<\zerocount + % generic cache \postponed_page_block_flush - %\doflushpostponedblocks \else\ifnum\postponed_page_blocks_next_page>\realpageno - % not yet + % future content \else + % pending content \postponed_page_block_flush - %\doflushpostponedblocks - \fi\fi\fi} + \fi\fi\fi\fi} \def\doflushpostponedcontent % called in page-one {\bgroup diff --git a/tex/context/base/page-one.mkiv b/tex/context/base/page-one.mkiv index 6156ab8b1..b1ee82302 100644 --- a/tex/context/base/page-one.mkiv +++ b/tex/context/base/page-one.mkiv @@ -50,12 +50,14 @@ \ifdim\oldvsize=\vsize % let's assume that the layout didn't change \else - \bgroup - \global\oldvsize\vsize - \advance\vsize-\topinserted - \advance\vsize-\botinserted - \global\pagegoal\vsize - \egroup + \global\oldvsize\vsize + \global\pagegoal\dimexpr\vsize-\topinserted-\botinserted\relax +% \bgroup +% \global\oldvsize\vsize +% \advance\vsize-\topinserted +% \advance\vsize-\botinserted +% \global\pagegoal\vsize +% \egroup \fi \fi} @@ -354,7 +356,7 @@ \dofloatscollect\s!text{\hsize}{1em}% %% no longer (interferes with footnotes): %% - %% \OTRONEsetvsize / test 2011.06.24.001 + %% \OTRONEsetvsize % test 2011.06.24.001 %% \global\setbox\floatbox\hbox to \hsize {\hfil diff --git a/tex/context/base/s-abr-01.tex b/tex/context/base/s-abr-01.tex index a180876a5..a0d8ba2ca 100644 --- a/tex/context/base/s-abr-01.tex +++ b/tex/context/base/s-abr-01.tex @@ -179,6 +179,7 @@ \logo [OVF] {ovf} \logo [PASCAL] {Pascal} \logo [PCTEX] {pc\TeX} +\logo [PFA] {pfa} \logo [PFB] {pfb} \logo [PDF] {pdf} \logo [PDFETEX] {pdfe\TeX} diff --git a/tex/context/base/s-fnt-20.mkiv b/tex/context/base/s-fnt-20.mkiv index 5ea740c0a..a78f62555 100644 --- a/tex/context/base/s-fnt-20.mkiv +++ b/tex/context/base/s-fnt-20.mkiv @@ -138,3 +138,23 @@ {\getvariable{otftracker}{sample}} \stoptext \stopsetups + +\continueifinputfile{s-fnt-20.mkiv} + +\usemodule[art-01] + +\setupbodyfont +% [cambria] + [dejavu] + +\starttext + +\setvariables + [otftracker] + [font=Serif, + size=48pt, + figure=, + title=Feature Check, + sample={affiliation}] + +\stoptext diff --git a/tex/context/base/s-fnt-35.mkiv b/tex/context/base/s-fnt-35.mkiv deleted file mode 100644 index 157d3062c..000000000 --- a/tex/context/base/s-fnt-35.mkiv +++ /dev/null @@ -1,341 +0,0 @@ -%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/s-fonts-tables.lua b/tex/context/base/s-fonts-tables.lua new file mode 100644 index 000000000..856a34cd8 --- /dev/null +++ b/tex/context/base/s-fonts-tables.lua @@ -0,0 +1,288 @@ +if not modules then modules = { } end modules ['s-fonts-tables'] = { + version = 1.001, + comment = "companion to s-fonts-tables.mkiv", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + +local setmetatableindex = table.setmetatableindex +local sortedhash = table.sortedhash +local sortedkeys = table.sortedkeys +local format = string.format +local concat = table.concat + +moduledata.fonts = moduledata.fonts or { } +moduledata.fonts.tracers = moduledata.fonts.tracers or { } +moduledata.fonts.tracers.tables = moduledata.fonts.tracers.tables or { } + +local tabletracers = moduledata.fonts.tracers.tables + +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, +} + +tabletracers.samples = samples + +setmetatableindex(uppercase, function(t,k) return rawget(t,"latn") end) +setmetatableindex(lowercase, function(t,k) return rawget(t,"latn") end) +setmetatableindex(digits, function(t,k) return rawget(t,"dflt") end) +setmetatableindex(symbols, function(t,k) return rawget(t,"dflt") end) +setmetatableindex(punctuation, function(t,k) return rawget(t,"dflt") end) + +setmetatableindex(uppercase.latn, function(t,k) return rawget(t,"dflt") end) +setmetatableindex(uppercase.grek, function(t,k) return rawget(t,"dflt") end) +setmetatableindex(uppercase.cyrl, function(t,k) return rawget(t,"dflt") end) + +setmetatableindex(lowercase.latn, function(t,k) return rawget(t,"dflt") end) +setmetatableindex(lowercase.grek, function(t,k) return rawget(t,"dflt") end) +setmetatableindex(lowercase.cyrl, function(t,k) return rawget(t,"dflt") end) + +setmetatableindex(digits.dflt, function(t,k) return rawget(t,"dflt") end) +setmetatableindex(symbols.dflt, function(t,k) return rawget(t,"dflt") end) +setmetatableindex(punctuation.dflt, function(t,k) return rawget(t,"dflt") end) + +local function typeset(t,keys,nesting,prefix) + if t then + if not prefix then + context.starttabulate { "|Tl|Tl|" } + end + for k, v in sortedhash(keys) do + if type(v) ~= "table" then + context.NC() + if prefix then + context("%s.%s",prefix,k) + else + context(k) + end + 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 == "basepoints" then + context("%sbp",tk) + elseif v == "scaledpoints" then + context(number.points(tk)) + elseif v == "table" then + context("<table>") + else -- if v == "integerscale" then + context(tostring(tk)) + end + context.NC() + context.NR() + elseif nesting == false then + context("<table>") + else -- true or nil + typeset(t[k],v,nesting,k) + end + end + if not prefix then + context.stoptabulate() + end + end +end + +tabletracers.typeset = typeset + +function tabletracers.properties(nesting) + local tfmdata = fonts.hashes.identifiers[font.current()] + typeset(tfmdata.properties,fonts.constructors.keys.properties,nesting) +end + +function tabletracers.parameters(nesting) + local tfmdata = fonts.hashes.identifiers[font.current()] + typeset(tfmdata.parameters,fonts.constructors.keys.parameters,nesting) +end + +function tabletracers.positionalfeatures() + 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 sortedhash(gpos) do + for script, languages in sortedhash(scripts) do + context.NC() + context(feature) + context.NC() + context(script) + context.NC() + context(concat(sortedkeys(languages)," ")) + context.NC() + context.NR() + end + end + context.stoptabulate() + else + context("no entries") + context.par() + end + end + end +end + +local dynamics = true + +function tabletracers.substitutionfeatures() + 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 sortedhash(gsub) do + for script, languages in sortedhash(scripts) do + for language in sortedhash(languages) do + local tag = format("dummy-%s-%s-%s",feature,script,language) + local fnt = 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 tabletracers.all(settings) -- not interfaced + + if type(settings) == "string" then + settings = utilities.parsers.settings_to_hash(settings) + end + + local title = settings and settings.title or "" + + if title == "" then title = false end + + if title then + context.starttitle { title = title } + end + + context.startsubject { title = "Properties" } + tabletracers.properties() + context.stopsubject() + + context.startsubject { title = "Parameters" } + tabletracers.parameters() + context.stopsubject() + + context.startsubject { title = "Positional features" } + tabletracers.positionalfeatures() + context.stopsubject() + + context.startsubject { title = "Substitution features" } + tabletracers.substitutionfeatures() + context.stopsubject() + + if title then + context.stoptitle() + end + +end diff --git a/tex/context/base/s-fonts-tables.mkiv b/tex/context/base/s-fonts-tables.mkiv new file mode 100644 index 000000000..efe1500fb --- /dev/null +++ b/tex/context/base/s-fonts-tables.mkiv @@ -0,0 +1,30 @@ +%D \module +%D [ file=s-fonts-tables, +%D version=2011.10.10, +%D title=\CONTEXT\ Style File, +%D subtitle=Basic Font Data Tables, +%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. + +% todo: make a mtxrun --script --font <name> option + +\registerctxluafile{s-fonts-tables}{} + +\def\ModuleFontsTracersTablesAll[#1]% + {\ctxlua{moduledata.fonts.tracers.tables.all("#1")}} + +\continueifinputfile{s-fonts-tables.mkiv} + +\usemodule[art-01] + +\setupbodyfont + [cambria] + +\starttext + \ModuleFontsTracersTablesAll[title=Cambria] +\stoptext diff --git a/tex/context/base/s-mod-01.mkiv b/tex/context/base/s-mod-01.mkiv index 2feeaad77..cca0e96e7 100644 --- a/tex/context/base/s-mod-01.mkiv +++ b/tex/context/base/s-mod-01.mkiv @@ -162,13 +162,6 @@ {\blank \endgroup} -\doifnotmode {nocode} { % \startmode ... \stopmode fails in the module documentation - - \unexpanded\def\startdefinition{\gobbleuntil\stopdefinition} - \unexpanded\def\stopdefinition {} - -} - \definetyping [PL] [\c!option=PL] \definetyping [JV] [\c!option=JV] \definetyping [MP] [\c!option=MP] @@ -185,35 +178,34 @@ \c!distance=\leftmargindistance, \c!align=\v!flushright] -\unexpanded\def\dodomodulemarginstuff[#1]#2% - {\def\docommand##1% - {\indent\hbox - {\ifx#2\relax - \index{##1}% - \else - \index{#2{##1}}% - \fi - #2{\doboundtext{##1}{\leftmarginwidth}{..}}}% - \endgraf}% - \processcommalist[#1]\docommand} - -\unexpanded\def\modulemarginstuff#1[#2]% to be renamed - {\def\domodulemarginstuff##1##2% - {\margintitle[#2]% - {\switchtobodyfont[\v!small]% - \dodomodulemarginstuff[##1]#1% - \processcommalist[##2]\index}}% - \dodoublegroupempty\domodulemarginstuff} - -\unexpanded\def\complexmacros {\modulemarginstuff\tex } -\unexpanded\def\complexextras {\modulemarginstuff\relax} -\unexpanded\def\complexelements{\modulemarginstuff\someelement} +% This will be cleaned up. + +\unexpanded\def\domodulemarginstuff#1#2% + {\marginstuff + {\ifx#1\relax + \index{#2}% + \else + \index{#1{#2}}% + \fi + #1{\doboundtext{#2}{\leftmarginwidth}{..}}}} + +\unexpanded\def\modulemarginstuff#1#2% to be renamed + {\processcommalist[#2]{\domodulemarginstuff#1}} + +\definemargindata + [marginstuff] + [left] + [stack=yes, + hoffset=2em, + style=\ttxx] + +\unexpanded\def\macros {\modulemarginstuff\tex } +\unexpanded\def\extras {\modulemarginstuff\relax} +\unexpanded\def\elements{\modulemarginstuff\someelement} \unexpanded\def\someelement#1{\type{<#1>}} -\definecomplexorsimpleempty\macros -\definecomplexorsimpleempty\extras -\definecomplexorsimpleempty\elements +% [index]{command} % \macros{a,b} % \macros{a,b}{b} @@ -344,10 +336,17 @@ % modes +\doifmode {nocode} { % \startmode ... \stopmode fails in the module documentation + + \unexpanded\def\startdefinition{\gobbleuntil\stopdefinition} + \unexpanded\def\stopdefinition {} + +} + \doifmode {nocolor} { - \setupcolors - [\c!conversion=\v!always] + \setupcolors + [\c!conversion=\v!always] } diff --git a/tex/context/base/spac-ali.mkiv b/tex/context/base/spac-ali.mkiv index ffc1f2434..b7418bd0b 100644 --- a/tex/context/base/spac-ali.mkiv +++ b/tex/context/base/spac-ali.mkiv @@ -17,7 +17,8 @@ \registerctxluafile{spac-ali}{1.001} -\definesystemattribute[realign][public] +\definesystemattribute[realign] [public] % might be combined with the next one +\definesystemattribute[alignstate][public] % will make a single attributes for several states \unexpanded\def\resetrealignsignal{\attribute\realignattribute\attributeunsetvalue} \unexpanded\def\signalinnerrealign{\ctxcommand{setrealign(2)}} @@ -318,6 +319,9 @@ \newconstant\raggedstatus % normal left center right +% \unexpanded\def\setalignstateattribute % unexpanded ! +% {\attribute\alignstateattribute\ifcase\raggedstatus\attributeunsetvalue\else\raggedstatus\fi} + \def\leftraggedness {2\bodyfontsize} \def\rightraggedness {2\bodyfontsize} \def\middleraggedness {6\bodyfontsize} @@ -368,6 +372,7 @@ \def\dosetraggedskips#1#2#3#4#5#6#7% {\raggedstatus#1\relax + \attribute\alignstateattribute\ifcase\raggedstatus\attributeunsetvalue\else\raggedstatus\fi \leftskip 1\leftskip \!!plus#2\relax % zie: Tex By Topic 8.1.3 \rightskip 1\rightskip\!!plus#3\relax % zie: Tex By Topic 8.1.3 \spaceskip #4\relax @@ -375,6 +380,10 @@ \parfillskip\zeropoint\!!plus#6\relax \parindent #7\relax} +\appendtoks + \attribute\alignstateattribute\attributeunsetvalue +\to \everyforgetall + % \def\notragged% % {\setraggedskips{0}{0em}{0em}{0em}{0em}{1fil}{\parindent}} diff --git a/tex/context/base/spac-chr.lua b/tex/context/base/spac-chr.lua index 9771ad2e8..add46c4d0 100644 --- a/tex/context/base/spac-chr.lua +++ b/tex/context/base/spac-chr.lua @@ -8,6 +8,9 @@ if not modules then modules = { } end modules ['spac-chr'] = { local byte, lower = string.byte, string.lower +-- to be redone: characters will become tagged spaces instead as then we keep track of +-- spaceskip etc + trace_characters = false trackers.register("typesetters.characters", function(v) trace_characters = v end) report_characters = logs.reporter("typesetting","characters") @@ -15,6 +18,7 @@ report_characters = logs.reporter("typesetting","characters") local nodes, node = nodes, node local set_attribute = node.set_attribute +local has_attribute = node.has_attribute local insert_node_after = node.insert_after local remove_node = nodes.remove -- ! nodes @@ -25,7 +29,11 @@ local new_penalty = nodepool.penalty local new_glue = nodepool.glue local nodecodes = nodes.nodecodes +local skipcodes = nodes.skipcodes local glyph_code = nodecodes.glyph +local glue_code = nodecodes.glue + +local space_skip_code = skipcodes["spaceskip"] local chardata = characters.data @@ -38,6 +46,7 @@ local fontparameters = fonts.hashes.parameters local fontcharacters = fonts.hashes.characters local a_character = attributes.private("characters") +local a_alignstate = attributes.private("alignstate") local c_zero = byte('0') local c_period = byte('.') @@ -64,6 +73,7 @@ end local function inject_nobreak_space(unicode,head,current,space,spacestretch,spaceshrink) local attr = current.attr + local next = current.next head, current = insert_node_after(head,current,new_penalty(10000)) head, current = insert_node_after(head,current,new_glue(space,spacestretch,spaceshrink)) current.attr = attr @@ -73,9 +83,18 @@ end local methods = { - [0x00A0] = function(head,current) -- nobreakspace + -- The next one uses an attribute assigned to the character but still we + -- don't have the 'local' value. + + [0x00A0] = function(head,current) local para = fontparameters[current.font] - return inject_nobreak_space(0x00A0,head,current,para.space,para.spacestretch,para.spaceshrink) + if has_attribute(current,a_alignstate) == 1 then -- flushright + head, current = inject_nobreak_space(0x00A0,head,current,para.space,0,0) + current.subtype = space_skip_code + else + head, current = inject_nobreak_space(0x00A0,head,current,para.space,para.spacestretch,para.spaceshrink) + end + return head, current end, [0x2000] = function(head,current) -- enquad @@ -145,7 +164,8 @@ function characters.handler(head) local done = false while current do local next = current.next - if current.id == glyph_code then + local id = current.id + if id == glyph_code then local char = current.char local method = methods[char] if method then diff --git a/tex/context/base/spac-chr.mkiv b/tex/context/base/spac-chr.mkiv index 1e7943ea1..e2ed12522 100644 --- a/tex/context/base/spac-chr.mkiv +++ b/tex/context/base/spac-chr.mkiv @@ -19,8 +19,44 @@ \definesystemattribute[characters][public] -\edef\nobreakspace {\utfchar{"00A0}} +%D The nobreakspace is special as it needs to keep track of the space being +%D flexible. Another option is to use space (glue) nodes and tag them as characters +%D instead. No big deal but takes a moment of coding. So, as a prelude we +%D tag the nobreakspace only. Interesting is that it also fits better in the +%D tagging mechanism. +%D +%D But we need to do some checking as from then on we no longer can compare +%D them in a string. So this needs thinking. Not that we can compare the +%D nobreakspace now anyway. + +% \unexpanded\def\specialspacecharacter#1{\begingroup\attribute\charactersattribute#1\ \endgroup} +% +% \unexpanded\edef\nobreakspace {\specialspacecharacter{"00A0}} % 1 = left +% \unexpanded\edef\ideographicspace {\specialspacecharacter{"2000}} +% \unexpanded\edef\ideographichalffillspace{\specialspacecharacter{"2001}} +% \unexpanded\edef\twoperemspace {\specialspacecharacter{"2002}} +% \unexpanded\edef\threeperemspace {\specialspacecharacter{"2004}} +% \unexpanded\edef\fourperemspace {\specialspacecharacter{"2005}} +% \unexpanded\edef\sixperemspace {\specialspacecharacter{"2006}} +% \unexpanded\edef\figurespace {\specialspacecharacter{"2007}} +% \unexpanded\edef\punctuationspace {\specialspacecharacter{"2008}} +% \unexpanded\edef\breakablethinspace {\specialspacecharacter{"2009}} +% \unexpanded\edef\hairspace {\specialspacecharacter{"200A}} +% \unexpanded\edef\zerowidthspace {\specialspacecharacter{"200B}} +% \unexpanded\edef\zwnj {\specialspacecharacter{"200C}} +% \unexpanded\edef\zwj {\specialspacecharacter{"200D}} +% \unexpanded\edef\narrownobreakspace {\specialspacecharacter{"202F}} + +% This does not work as spaceskip is only inserted in the case of raggedleft +% and we need to be able to figure out all of them. Which makes me wonder ... +% can't we just always set spaceskip to some value? + +% Making them active is also not an option unless we do that in every +% catcode vector. + +% \nobreakspace {\begingroup\setalignstateattribute\utfchar{"00A0}\endgroup} % 1 = left +\edef\nobreakspace {\utfchar{"00A0}} \edef\ideographicspace {\utfchar{"2000}} \edef\ideographichalffillspace{\utfchar{"2001}} \edef\twoperemspace {\utfchar{"2002}} @@ -34,7 +70,6 @@ \edef\zerowidthspace {\utfchar{"200B}} \edef\zwnj {\utfchar{"200C}} \edef\zwj {\utfchar{"200D}} - \edef\narrownobreakspace {\utfchar{"202F}} %edef\zerowidthnobreakspace {\utfchar{"FEFF}} @@ -45,7 +80,7 @@ % unexpanded as otherwise we need to intercept / cleanup a lot -\unexpanded\edef~{\utfchar{"00A0}} +\unexpanded\def~{\nobreakspace} % Goodies: diff --git a/tex/context/base/spac-hor.mkiv b/tex/context/base/spac-hor.mkiv index 88374e497..e3496e923 100644 --- a/tex/context/base/spac-hor.mkiv +++ b/tex/context/base/spac-hor.mkiv @@ -370,9 +370,9 @@ {\letcatcodecommand \ctxcatcodes \tildeasciicode \fixedspace} \appendtoks - \let~\space - \let\ \space -\to\simplifiedcommands + \let~\space + \let\ \space +\to \simplifiedcommands \unexpanded\def\removeunwantedspaces {\ifhmode diff --git a/tex/context/base/status-files.pdf b/tex/context/base/status-files.pdf Binary files differindex 0d023d90e..f2006bb38 100644 --- a/tex/context/base/status-files.pdf +++ b/tex/context/base/status-files.pdf diff --git a/tex/context/base/status-lua.pdf b/tex/context/base/status-lua.pdf Binary files differindex 31d2db8db..5fb64b64f 100644 --- a/tex/context/base/status-lua.pdf +++ b/tex/context/base/status-lua.pdf diff --git a/tex/context/base/strc-ref.lua b/tex/context/base/strc-ref.lua index 213caf30d..f141af982 100644 --- a/tex/context/base/strc-ref.lua +++ b/tex/context/base/strc-ref.lua @@ -1683,7 +1683,7 @@ end filters.section = { } -function filters.section.number(data,what,prefixspec) +local function filternumber(data,what,prefixspec) if data then local numberdata = data.numberdata if numberdata then @@ -1697,15 +1697,22 @@ function filters.section.number(data,what,prefixspec) end end +filters.section.number = filternumber filters.section.title = filters.generic.title filters.section.page = filters.generic.page filters.section.default = filters.section.number -filters.note = { default = filters.generic.number } -filters.formula = { default = filters.generic.number } -filters.float = { default = filters.generic.number } -filters.description = { default = filters.generic.number } -filters.item = { default = filters.generic.number } +-- filters.note = { default = filters.generic.number } +-- filters.formula = { default = filters.generic.number } +-- filters.float = { default = filters.generic.number } +-- filters.description = { default = filters.generic.number } +-- filters.item = { default = filters.generic.number } + +setmetatableindex(filters, function(t,k) + local v = { default = filternumber } -- not copy as it might be extended differently + t[k] = v + return v +end) -- function references.sectiontitle(n) -- helpers.sectiontitle(lists.collected[tonumber(n) or 0]) diff --git a/tex/context/base/supp-vis.mkiv b/tex/context/base/supp-vis.mkiv index 460020306..18f6262d2 100644 --- a/tex/context/base/supp-vis.mkiv +++ b/tex/context/base/supp-vis.mkiv @@ -232,8 +232,6 @@ \fi -\ifx\contextversion\undefined \def~{\normalpenalty\!!tenthousand\ } \fi - %D \macros %D {makeruledbox} %D diff --git a/tex/context/base/syst-aux.mkiv b/tex/context/base/syst-aux.mkiv index 513d8761b..011e25e48 100644 --- a/tex/context/base/syst-aux.mkiv +++ b/tex/context/base/syst-aux.mkiv @@ -39,6 +39,9 @@ %D Some of the macros here are used in the bibliography module. They %D will be moved to a separate syst module some once the bib module %D is made \MKIV. +%D +%D The original files contain previous implementations and notes about +%D performance. This file will be stripped down in due time. \unprotect @@ -165,20 +168,20 @@ \let\@@expanded\empty % always long and global (less restores) -\long\def\expanded#1% - {\long\xdef\@@expanded{\noexpand#1}\@@expanded} +\def\expanded#1% + {\xdef\@@expanded{\noexpand#1}\@@expanded} -\long\def\startexpanded#1\stopexpanded % see x-fo for example - {\long\xdef\@@expanded{#1}\@@expanded} +\def\startexpanded#1\stopexpanded % see x-fo for example + {\xdef\@@expanded{#1}\@@expanded} %D Recent \TEX's have a primitive \expanded % not yet as we need to adapt ##'s in calls % -% \long\def\expanded#1% +% \def\expanded#1% % {\normalexpanded{\noexpand#1}} % -% \long\def\startexpanded#1\stopexpanded +% \def\startexpanded#1\stopexpanded % {\normalexpanded{#1}} %D \macros @@ -187,16 +190,16 @@ %D The next set of macros just do nothing, except that they %D get rid of a number of arguments. -\long\def\gobbleoneargument #1{} -\long\def\gobbletwoarguments #1#2{} -\long\def\gobblethreearguments#1#2#3{} -\long\def\gobblefourarguments #1#2#3#4{} -\long\def\gobblefivearguments #1#2#3#4#5{} -\long\def\gobblesixarguments #1#2#3#4#5#6{} -\long\def\gobblesevenarguments#1#2#3#4#5#6#7{} -\long\def\gobbleeightarguments#1#2#3#4#5#6#7#8{} -\long\def\gobbleninearguments #1#2#3#4#5#6#7#8#9{} -\long\def\gobbletenarguments #1{\gobbleninearguments} +\def\gobbleoneargument #1{} +\def\gobbletwoarguments #1#2{} +\def\gobblethreearguments#1#2#3{} +\def\gobblefourarguments #1#2#3#4{} +\def\gobblefivearguments #1#2#3#4#5{} +\def\gobblesixarguments #1#2#3#4#5#6{} +\def\gobblesevenarguments#1#2#3#4#5#6#7{} +\def\gobbleeightarguments#1#2#3#4#5#6#7#8{} +\def\gobbleninearguments #1#2#3#4#5#6#7#8#9{} +\def\gobbletenarguments #1{\gobbleninearguments} \def\gobbleoneoptional [#1]{} \def\gobbletwooptionals [#1][#2]{} @@ -229,7 +232,7 @@ %D {\localnext} because we don't want clashes with \type %D {\next}. -\long\def\doifnextcharelse#1#2#3% #1 should not be {} ! +\unexpanded\def\doifnextcharelse#1#2#3% #1 should not be {} ! {\let\charactertoken=#1% = needed here \def\!!stringa{#2}% \def\!!stringb{#3}% @@ -259,7 +262,7 @@ \let\next_optional_character_token=[ -\long\def\doifnextoptionalelse#1#2% +\unexpanded\def\doifnextoptionalelse#1#2% {\def\next_optional_command_yes{#1}% \def\next_optional_command_nop{#2}% \let\if_next_blank_space_token\iffalse @@ -281,7 +284,7 @@ \let\next_bgroup_character_token\bgroup -\long\def\doifnextbgroupelse#1#2% +\unexpanded\def\doifnextbgroupelse#1#2% {\def\next_bgroup_command_yes{#1}% \def\next_bgroup_command_nop{#2}% \let\if_next_blank_space_token\iffalse @@ -303,7 +306,7 @@ \let\next_parenthesis_character_token( -\long\def\doifnextparenthesiselse#1#2% +\unexpanded\def\doifnextparenthesiselse#1#2% {\def\next_parenthesis_command_yes{#1}% \def\next_parenthesis_command_nop{#2}% \let\if_next_blank_space_token\iffalse @@ -325,7 +328,7 @@ %D The next one is handy in predictable situations: -\long\def\doiffastoptionalcheckelse#1#2% +\unexpanded\def\doiffastoptionalcheckelse#1#2% {\def\next_optional_command_yes{#1}% \def\next_optional_command_nop{#2}% \let\if_next_blank_space_token\iffalse % not needed @@ -462,53 +465,27 @@ % % use a real if like \ifcsname#1\endcsname\else instead -\ifdefined\suppressifcsnameerror - - \suppressifcsnameerror\plusone - - \def\doifundefinedelse#1% - {\ifcsname#1\endcsname - \expandafter\secondoftwoarguments\else\expandafter\firstoftwoarguments - \fi} - - \def\doifdefinedelse#1% - {\ifcsname#1\endcsname - \expandafter\firstoftwoarguments\else\expandafter\secondoftwoarguments - \fi} - - \def\doifundefined#1% - {\ifcsname#1\endcsname - \expandafter\gobbleoneargument\else\expandafter\firstofoneargument - \fi} - - \def\doifdefined#1% - {\ifcsname#1\endcsname - \expandafter\firstofoneargument\else\expandafter\gobbleoneargument - \fi} - -\else - - \def\doifundefinedelse#1% - {\ifcsname\detokenize\expandafter{\normalexpanded{#1}}\endcsname - \expandafter\secondoftwoarguments\else\expandafter\firstoftwoarguments - \fi} +\suppressifcsnameerror\plusone - \def\doifdefinedelse#1% - {\ifcsname\detokenize\expandafter{\normalexpanded{#1}}\endcsname - \expandafter\firstoftwoarguments\else\expandafter\secondoftwoarguments - \fi} +\def\doifundefinedelse#1% + {\ifcsname#1\endcsname + \expandafter\secondoftwoarguments\else\expandafter\firstoftwoarguments + \fi} - \def\doifundefined#1% - {\ifcsname\detokenize\expandafter{\normalexpanded{#1}}\endcsname - \expandafter\gobbleoneargument\else\expandafter\firstofoneargument - \fi} +\def\doifdefinedelse#1% + {\ifcsname#1\endcsname + \expandafter\firstoftwoarguments\else\expandafter\secondoftwoarguments + \fi} - \def\doifdefined#1% - {\ifcsname\detokenize\expandafter{\normalexpanded{#1}}\endcsname - \expandafter\firstofoneargument\else\expandafter\gobbleoneargument - \fi} +\def\doifundefined#1% + {\ifcsname#1\endcsname + \expandafter\gobbleoneargument\else\expandafter\firstofoneargument + \fi} -\fi +\def\doifdefined#1% + {\ifcsname#1\endcsname + \expandafter\firstofoneargument\else\expandafter\gobbleoneargument + \fi} %D \macros %D {letbeundefined} @@ -537,7 +514,7 @@ %D was due to this grouping subtilities. We therefore decided %D to use \type{\begingroup} instead of \type{\bgroup}. -\def\doifalldefinedelse#1% +\unexpanded\def\doifalldefinedelse#1% {\begingroup \donetrue \processcommalist[#1]\do_if_all_defined_else @@ -572,7 +549,7 @@ %D \doifelse {string1} {string2} {then ...}{else ...} %D \stoptyping -\long\def\doif#1#2% +\def\doif#1#2% {\edef\!!stringa{#1}% \edef\!!stringb{#2}% \ifx\!!stringa\!!stringb @@ -581,7 +558,7 @@ \expandafter\gobbleoneargument \fi} -\long\def\doifnot#1#2% +\def\doifnot#1#2% {\edef\!!stringa{#1}% \edef\!!stringb{#2}% \ifx\!!stringa\!!stringb @@ -590,7 +567,7 @@ \expandafter\firstofoneargument \fi} -\long\def\doifelse#1#2% +\def\doifelse#1#2% {\edef\!!stringa{#1}% \edef\!!stringb{#2}% \ifx\!!stringa\!!stringb @@ -612,7 +589,7 @@ %D %D This time, the string is not expanded. -\long\def\doifemptyelse#1% +\def\doifemptyelse#1% {\def\!!stringa{#1}% \ifx\!!stringa\empty \expandafter\firstoftwoarguments @@ -620,7 +597,7 @@ \expandafter\secondoftwoarguments \fi} -\long\def\doifempty#1% +\def\doifempty#1% {\def\!!stringa{#1}% \ifx\!!stringa\empty \expandafter\firstofoneargument @@ -628,7 +605,7 @@ \expandafter\gobbleoneargument \fi} -\long\def\doifnotempty#1% +\def\doifnotempty#1% {\def\!!stringa{#1}% \ifx\!!stringa\empty \expandafter\gobbleoneargument @@ -678,15 +655,15 @@ \def\right_optional_bracket{]} -\long\def\do_quit_if_item_in_set_else#1],\relax{\firstoftwoarguments} -\long\def\do_quit_if_item_in_set #1],\relax{\firstofoneargument} -\long\def\do_quit_if_item_not_in_set #1],\relax{\gobbleoneargument} +\def\do_quit_if_item_in_set_else#1],\relax{\firstoftwoarguments} +\def\do_quit_if_item_in_set #1],\relax{\firstofoneargument} +\def\do_quit_if_item_not_in_set #1],\relax{\gobbleoneargument} -\long\def\re_do_if_in_set_else{\expandafter\do_check_if_item_in_set_else\!!stringb,],\relax} -\long\def\re_do_if_in_set {\expandafter\do_check_if_item_in_set \!!stringb,],\relax} -\long\def\re_do_if_not_in_set {\expandafter\do_check_if_item_not_in_set \!!stringb,],\relax} +\def\re_do_if_in_set_else{\expandafter\do_check_if_item_in_set_else\!!stringb,],\relax} +\def\re_do_if_in_set {\expandafter\do_check_if_item_in_set \!!stringb,],\relax} +\def\re_do_if_not_in_set {\expandafter\do_check_if_item_not_in_set \!!stringb,],\relax} -\long\def\doifinsetelse#1% make this two step too +\def\doifinsetelse#1% make this two step too {\edef\!!stringa{#1}% \ifx\!!stringa\empty \expandafter\thirdofthreearguments @@ -694,7 +671,7 @@ \expandafter\do_if_in_set_else \fi} -\long\def\do_if_in_set_else#1% +\def\do_if_in_set_else#1% {\edef\!!stringb{#1}% \ifx\!!stringb\empty \expandafter\secondoftwoarguments @@ -702,7 +679,7 @@ \expandafter\re_do_if_in_set_else \fi} -\long\def\doifinset#1% +\def\doifinset#1% {\edef\!!stringa{#1}% \ifx\!!stringa\empty \expandafter\gobbletwoarguments @@ -710,7 +687,7 @@ \expandafter\do_if_in_set \fi} -\long\def\do_if_in_set#1% +\def\do_if_in_set#1% {\edef\!!stringb{#1}% \ifx\!!stringb\empty \expandafter\gobbleoneargument @@ -718,7 +695,7 @@ \expandafter\re_do_if_in_set \fi} -\long\def\doifnotinset#1% +\def\doifnotinset#1% {\edef\!!stringa{#1}% \ifx\!!stringa\empty \expandafter\secondoftwoarguments @@ -726,7 +703,7 @@ \expandafter\do_if_not_in_set \fi} -\long\def\do_if_not_in_set#1% +\def\do_if_not_in_set#1% {\edef\!!stringb{#1}% \ifx\!!stringb\empty \expandafter\firstofoneargument @@ -828,7 +805,7 @@ % !9yes=\doifcommonelse{,a,}{,,,a,}{yes}{nop} % !9yes=\doifcommonelse{,,a,}{,,,a,}{yes}{nop} -\long\def\do_quit_if_common_else#1],\relax#2],\relax{\firstoftwoarguments} +\def\do_quit_if_common_else#1],\relax#2],\relax{\firstoftwoarguments} \def\do_check_if_common_else_one#1,#2% {\edef\!!stringc{#1}% @@ -953,7 +930,7 @@ \def\do_process_comma_list#1]#2% {\global\advance\commalevel \plusone - \long\expandafter\def\csname\s!next\the\commalevel\endcsname##1,% + \expandafter\def\csname\s!next\the\commalevel\endcsname##1,% {#2{##1}\do_process_comma_item}% \expandafter\do_do_process_comma_item\gobbleoneargument#1,]\relax \global\advance\commalevel \minusone } @@ -1027,7 +1004,7 @@ %D \def\command[#1]{... #1 ...} %D \stoptyping -\def\processcommalistwithparameters[#1]#2% +\unexpanded\def\processcommalistwithparameters[#1]#2% {\def\do_process_comma_list_with_parameters##1{#2[##1]}% \processcommalist[#1]\do_process_comma_list_with_parameters} @@ -1036,12 +1013,12 @@ %D %D Two more: -\long\unexpanded\def\startprocesscommalist[#1]#2\stopprocesscommalist - {\long\def\currentcommalistcommand##1{\def\currentcommalistitem{##1}#2}% +\unexpanded\def\startprocesscommalist[#1]#2\stopprocesscommalist + {\def\currentcommalistcommand##1{\def\currentcommalistitem{##1}#2}% \processcommalist[#1]\currentcommalistcommand} -\long\unexpanded\def\startprocesscommacommand[#1]#2\stopprocesscommacommand - {\long\def\currentcommalistcommand##1{\def\currentcommalistitem{##1}#2}% +\unexpanded\def\startprocesscommacommand[#1]#2\stopprocesscommacommand + {\def\currentcommalistcommand##1{\def\currentcommalistitem{##1}#2}% \normalexpanded{\processcommalist[#1]}\currentcommalistcommand} %D \macros @@ -1189,7 +1166,7 @@ {#1% \let\nexttoken#4% \global\advance\commalevel \plusone - \long\expandafter\def\csname\s!next\the\commalevel\endcsname##1,% + \expandafter\def\csname\s!next\the\commalevel\endcsname##1,% {#3{##1}\do_process_comma_item}% \do_do_process_comma_item#4#5,]\relax \global\advance\commalevel\minusone @@ -1271,7 +1248,7 @@ % replaces prev \unexpanded\def\do_if_in_string_else#1#2% ##2 can be {abc} - {\long\expandafter\def\expandafter\do_do_if_in_string_else + {\expandafter\def\expandafter\do_do_if_in_string_else \expandafter##\expandafter1#1##2##3\war{\unless\if##2@}% expand #1 here \expandafter\do_do_if_in_string_else\normalexpanded{#2#1}@@\war} % expand #2 here @@ -1289,7 +1266,7 @@ %D expansion. \unexpanded\def\do_if_in_csname_else#1#2% - {\long\def\do_do_if_in_csname_else##1#1##2##3\war + {\def\do_do_if_in_csname_else##1#1##2##3\war {\unless\if##2@}% \expandafter\do_do_if_in_csname_else#2#1@@\war} @@ -1317,7 +1294,7 @@ %D \type{\getal} and \type{\the\count...}. This macro is a %D rather dirty one. -\long\def\doifnumberelse#1% does not accept counters (fully expandable) +\def\doifnumberelse#1% does not accept counters (fully expandable) {\ifcase0\ifcase1#1\or\or\or\or\or\or\or\or\or\else1\fi\space \expandafter\secondoftwoarguments \else @@ -1621,7 +1598,7 @@ \def\xdogetparameters#1]% {\xprocesscommaitem#1,],\@relax@} -\long\def\xprocesscommaitem#1,#2% #2 takes space before , +\def\xprocesscommaitem#1,#2% #2 takes space before , {\if,#1,% dirty trick for testing #1=empty \expandafter\xprocesscommaitem \else\if]#1% @@ -1686,12 +1663,12 @@ \unexpanded\def\processassignmentcommand[#1]% {\normalexpanded{\processassignmentlist[#1]}} -\long\unexpanded\def\startprocessassignmentlist[#1]#2\stopprocessassignmentlist - {\long\def\currentassignmentlistcommand##1##2{\def\currentassignmentlistkey{##1}\def\currentassignmentlistvalue{##2}#2}% +\unexpanded\def\startprocessassignmentlist[#1]#2\stopprocessassignmentlist + {\def\currentassignmentlistcommand##1##2{\def\currentassignmentlistkey{##1}\def\currentassignmentlistvalue{##2}#2}% \processassignmentlist[#1]\currentassignmentlistcommand} -\long\unexpanded\def\startprocessassignmentcommand[#1]#2\stopprocessassignmentcommand - {\long\def\currentassignmentlistcommand##1##2{\def\currentassignmentlistkey{##1}\def\currentassignmentlistvalue{##2}#2}% +\unexpanded\def\startprocessassignmentcommand[#1]#2\stopprocessassignmentcommand + {\def\currentassignmentlistcommand##1##2{\def\currentassignmentlistkey{##1}\def\currentassignmentlistvalue{##2}#2}% \normalexpanded{\processassignmentlist[#1]}\currentassignmentlistcommand} %D \macros{currentvalue} @@ -1791,7 +1768,7 @@ %D By using \type{\docopyvalue} we've prepared this command %D for use in a multi||lingual environment. -\def\copyparameters[#1]#2[#3]#4[#5]% +\unexpanded\def\copyparameters[#1]#2[#3]#4[#5]% {\doifnot{#1}{#3} {\def\docopyparameter{\docopyvalue{#1}{#3}}% ##1 \processcommalist[#5]\docopyparameter}} @@ -2045,169 +2022,6 @@ \def\noshowargumenterror {\let\expectedarguments\noexpectedarguments} -% \long\def\dogetargument#1#2#3#4% -% {\let\charactertoken=#1% -% \def\!!stringa{\noshowargumenterror#3\dodogetargument}% -% \def\!!stringb{\doshowargumenterror#4\dodogetargument#1#2}% -% \futurelet\nexttoken\inspect_next_character} - -% \def\getsingleempty#1#2#3% -% {\def\dodogetargument% -% {#3}% -% \dogetargument#1#2\firstargumenttrue\firstargumentfalse} - -% \def\getdoubleempty#1#2#3% -% {\def\dodogetargument#1##1#2% -% {\def\dodogetargument% -% {#3#1{##1}#2}% -% \dogetargument#1#2\secondargumenttrue\secondargumentfalse}% -% \dogetargument#1#2\firstargumenttrue\firstargumentfalse} - -% \def\gettripleempty#1#2#3% -% {\def\dodogetargument#1##1#2% -% {\def\dodogetargument#1####1#2% -% {\def\dodogetargument% -% {#3#1{##1}#2% -% #1{####1}#2}% -% \dogetargument#1#2\thirdargumenttrue\thirdargumentfalse}% -% \dogetargument#1#2\secondargumenttrue\secondargumentfalse}% -% \dogetargument#1#2\firstargumenttrue\firstargumentfalse} - -% \def\getquadrupleempty#1#2#3% -% {\def\dodogetargument#1##1#2% -% {\def\dodogetargument#1####1#2% -% {\def\dodogetargument#1########1#2% -% {\def\dodogetargument% -% {#3#1{##1}#2% -% #1{####1}#2% -% #1{########1}#2}% -% \dogetargument#1#2\fourthargumenttrue\fourthargumentfalse}% -% \dogetargument#1#2\thirdargumenttrue\thirdargumentfalse}% -% \dogetargument#1#2\secondargumenttrue\secondargumentfalse}% -% \dogetargument#1#2\firstargumenttrue\firstargumentfalse} - -% \def\getquintupleempty#1#2#3% -% {\def\dodogetargument#1##1#2% -% {\def\dodogetargument#1####1#2% -% {\def\dodogetargument#1########1#2% -% {\def\dodogetargument#1################1#2% -% {\def\dodogetargument% -% {#3#1{##1}#2% -% #1{####1}#2% -% #1{########1}#2% -% #1{################1}#2}% -% \dogetargument#1#2\fifthargumenttrue\fifthargumentfalse}% -% \dogetargument#1#2\fourthargumenttrue\fourthargumentfalse}% -% \dogetargument#1#2\thirdargumenttrue\thirdargumentfalse}% -% \dogetargument#1#2\secondargumenttrue\secondargumentfalse}% -% \dogetargument#1#2\firstargumenttrue\firstargumentfalse} - -% \def\getsixtupleempty#1#2#3% -% {\def\dodogetargument#1##1#2% -% {\def\dodogetargument#1####1#2% -% {\def\dodogetargument#1########1#2% -% {\def\dodogetargument#1################1#2% -% {\def\dodogetargument#1################################1#2% -% {\def\dodogetargument% -% {#3#1{##1}#2% -% #1{####1}#2% -% #1{########1}#2% -% #1{################1}#2% -% #1{################################1}#2}% -% \dogetargument#1#2\sixthargumenttrue\sixthargumentfalse}% -% \dogetargument#1#2\fifthargumenttrue\fifthargumentfalse}% -% \dogetargument#1#2\fourthargumenttrue\fourthargumentfalse}% -% \dogetargument#1#2\thirdargumenttrue\thirdargumentfalse}% -% \dogetargument#1#2\secondargumenttrue\secondargumentfalse}% -% \dogetargument#1#2\firstargumenttrue\firstargumentfalse} - -% \def\getseventupleempty#1#2#3% -% {\def\dodogetargument#1##1#2% -% {\def\dodogetargument#1####1#2% -% {\def\dodogetargument#1########1#2% -% {\def\dodogetargument#1################1#2% -% {\def\dodogetargument#1################################1#2% -% {\def\dodogetargument#1################################% -% ################################1#2% -% {\def\dodogetargument% -% {#3#1{##1}#2% -% #1{####1}#2% -% #1{########1}#2% -% #1{################1}#2% -% #1{################################1}#2% -% #1{################################% -% ################################1}#2}% -% \dogetargument#1#2\seventhargumenttrue\seventhargumentfalse}% -% \dogetargument#1#2\sixthargumenttrue\sixthargumentfalse}% -% \dogetargument#1#2\fifthargumenttrue\fifthargumentfalse}% -% \dogetargument#1#2\fourthargumenttrue\fourthargumentfalse}% -% \dogetargument#1#2\thirdargumenttrue\thirdargumentfalse}% -% \dogetargument#1#2\secondargumenttrue\secondargumentfalse}% -% \dogetargument#1#2\firstargumenttrue\firstargumentfalse} - -% \def\dosingleempty {\getsingleempty []} -% \def\dodoubleempty {\getdoubleempty []} -% \def\dotripleempty {\gettripleempty []} -% \def\doquadrupleempty {\getquadrupleempty []} -% \def\doquintupleempty {\getquintupleempty []} -% \def\dosixtupleempty {\getsixtupleempty []} -% \def\doseventupleempty{\getseventupleempty[]} - -%D Because some of these are called quite often, we will now -%D replace the more general version by alternatives tuned for -%D speed. - -% \def\dosingleempty#1% we can make dedicated doifnextoptional's -% {\noshowargumenterror % \relax % prevents lookahead, brr -% \doifnextoptionalelse -% {\firstargumenttrue#1}% -% {\dosinglefakeempty#1}} -% -% \def\dosinglefakeempty#1% -% {\firstargumentfalse#1[]} -% -% \def\dodoubleempty#1% -% {\noshowargumenterror % \relax % prevents lookahead, brr -% \doifnextoptionalelse -% {\dodoubletestempty#1}% -% {\dodoublefakeempty#1}} -% -% \def\dodoublefakeempty#1% -% {\firstargumentfalse\secondargumentfalse#1[][]} -% -% \long\def\dodoubletestempty#1[#2]% -% {\firstargumenttrue -% \doifnextoptionalelse -% {\secondargumenttrue #1[{#2}]}% -% {\secondargumentfalse#1[{#2}][]}} -% -% \def\dotripleempty#1% -% {\noshowargumenterror % \relax % prevents lookahead, brr -% \doifnextoptionalelse -% {\dotripletestempty#1}% -% {\dotriplefakeempty#1}} -% -% \def\dotriplefakeempty#1% -% {\firstargumentfalse\secondargumentfalse\thirdargumentfalse#1[][][]} -% -% \long\def\dotripletestempty#1[#2]% -% {\firstargumenttrue -% \doifnextoptionalelse -% {\dotripletestemptyx #1[{#2}]}% -% {\secondargumentfalse -% \thirdargumentfalse #1[{#2}][][]}} -% -% \long\def\dotripletestemptyx#1[#2][#3]% -% {\secondargumenttrue -% \doifnextoptionalelse -% {\thirdargumenttrue #1[{#2}][{#3}]}% -% {\thirdargumentfalse#1[{#2}][{#3}][]}} - -%D We can obey following spaces with a bit more code. - -% 0.172 0.187 new (per 10000) -% 0.156 0.140 old (per 10000) -% % \def\test[#1]{(#1)} % % \dosingleempty\test[] xxx\par @@ -2228,7 +2042,7 @@ %D Single: -\def\dosingleempty#1% +\unexpanded\def\dosingleempty#1% {\noshowargumenterror \doifnextoptionalelse {\firstargumenttrue#1}% @@ -2240,13 +2054,13 @@ %D Double -\def\dodoubleempty#1% +\unexpanded\def\dodoubleempty#1% {\noshowargumenterror \doifnextoptionalelse {\dodoubleemptyYESone#1}% {\dodoubleemptyNOPone#1}} -\long\def\dodoubleemptyYESone#1[#2]% +\def\dodoubleemptyYESone#1[#2]% {\firstargumenttrue \doifnextoptionalelse {\secondargumenttrue#1[{#2}]}% @@ -2270,19 +2084,19 @@ % Three -\def\dotripleempty#1% +\unexpanded\def\dotripleempty#1% {\noshowargumenterror \doifnextoptionalelse {\dotripleemptyYESone#1}% {\dotripleemptyNOPone#1}} -\long\def\dotripleemptyYESone#1[#2]% +\def\dotripleemptyYESone#1[#2]% {\firstargumenttrue \doifnextoptionalelse {\dotripleemptyYEStwo#1{#2}}% {\dotripleemptyNOPtwo#1{#2}}} -\long\def\dotripleemptyYEStwo#1#2[#3]% +\def\dotripleemptyYEStwo#1#2[#3]% {\secondargumenttrue \doifnextoptionalelse {\thirdargumenttrue#1[{#2}][{#3}]}% @@ -2318,25 +2132,25 @@ %D Four: -\def\doquadrupleempty#1% +\unexpanded\def\doquadrupleempty#1% {\noshowargumenterror \doifnextoptionalelse {\doquadrupleemptyYESone#1}% {\doquadrupleemptyNOPone#1}} -\long\def\doquadrupleemptyYESone#1[#2]% +\def\doquadrupleemptyYESone#1[#2]% {\firstargumenttrue \doifnextoptionalelse {\doquadrupleemptyYEStwo#1{#2}}% {\doquadrupleemptyNOPtwo#1{#2}}} -\long\def\doquadrupleemptyYEStwo#1#2[#3]% +\def\doquadrupleemptyYEStwo#1#2[#3]% {\secondargumenttrue \doifnextoptionalelse {\doquadrupleemptyYESthree#1{#2}{#3}}% {\doquadrupleemptyNOPthree#1{#2}{#3}}} -\long\def\doquadrupleemptyYESthree#1#2#3[#4]% +\def\doquadrupleemptyYESthree#1#2#3[#4]% {\thirdargumenttrue \doifnextoptionalelse {\fourthargumenttrue#1[{#2}][{#3}][{#4}]}% @@ -2385,31 +2199,31 @@ %D Five: -\def\doquintupleempty#1% +\unexpanded\def\doquintupleempty#1% {\noshowargumenterror \doifnextoptionalelse {\doquintupleemptyYESone#1}% {\doquintupleemptyNOPone#1}} -\long\def\doquintupleemptyYESone#1[#2]% +\def\doquintupleemptyYESone#1[#2]% {\firstargumenttrue \doifnextoptionalelse {\doquintupleemptyYEStwo#1{#2}}% {\doquintupleemptyNOPtwo#1{#2}}} -\long\def\doquintupleemptyYEStwo#1#2[#3]% +\def\doquintupleemptyYEStwo#1#2[#3]% {\secondargumenttrue \doifnextoptionalelse {\doquintupleemptyYESthree#1{#2}{#3}}% {\doquintupleemptyNOPthree#1{#2}{#3}}} -\long\def\doquintupleemptyYESthree#1#2#3[#4]% +\def\doquintupleemptyYESthree#1#2#3[#4]% {\thirdargumenttrue \doifnextoptionalelse {\doquintupleemptyYESfour#1{#2}{#3}{#4}}% {\doquintupleemptyNOPfour#1{#2}{#3}{#4}}} -\long\def\doquintupleemptyYESfour#1#2#3#4[#5]% +\def\doquintupleemptyYESfour#1#2#3#4[#5]% {\fourthargumenttrue \doifnextoptionalelse {\fifthargumenttrue#1[{#2}][{#3}][{#4}][{#5}]}% @@ -2472,37 +2286,37 @@ %D Six -\def\dosixtupleempty#1% +\unexpanded\def\dosixtupleempty#1% {\noshowargumenterror \doifnextoptionalelse {\dosixtupleemptyYESone#1} {\dosixtupleemptyNOPone#1}} -\long\def\dosixtupleemptyYESone#1[#2]% +\def\dosixtupleemptyYESone#1[#2]% {\firstargumenttrue \doifnextoptionalelse {\dosixtupleemptyYEStwo#1{#2}}% {\dosixtupleemptyNOPtwo#1{#2}}} -\long\def\dosixtupleemptyYEStwo#1#2[#3]% +\def\dosixtupleemptyYEStwo#1#2[#3]% {\secondargumenttrue \doifnextoptionalelse {\dosixtupleemptyYESthree#1{#2}{#3}}% {\dosixtupleemptyNOPthree#1{#2}{#3}}} -\long\def\dosixtupleemptyYESthree#1#2#3[#4]% +\def\dosixtupleemptyYESthree#1#2#3[#4]% {\thirdargumenttrue \doifnextoptionalelse {\dosixtupleemptyYESfour#1{#2}{#3}{#4}}% {\dosixtupleemptyNOPfour#1{#2}{#3}{#4}}} -\long\def\dosixtupleemptyYESfour#1#2#3#4[#5]% +\def\dosixtupleemptyYESfour#1#2#3#4[#5]% {\fourthargumenttrue \doifnextoptionalelse {\dosixtupleemptyYESfive#1{#2}{#3}{#4}{#5}}% {\dosixtupleemptyNOPfive#1{#2}{#3}{#4}{#5}}} -\long\def\dosixtupleemptyYESfive#1#2#3#4#5[#6]% +\def\dosixtupleemptyYESfive#1#2#3#4#5[#6]% {\fifthargumenttrue \doifnextoptionalelse {\sixthargumenttrue#1[{#2}][{#3}][{#4}][{#5}][{#6}]}% @@ -2580,43 +2394,43 @@ %D Seven: -\def\doseventupleempty#1% +\unexpanded\def\doseventupleempty#1% {\noshowargumenterror \doifnextoptionalelse {\doseventupleemptyYESone#1}% {\doseventupleemptyNOPone#1}} -\long\def\doseventupleemptyYESone#1[#2]% +\def\doseventupleemptyYESone#1[#2]% {\firstargumenttrue \doifnextoptionalelse {\doseventupleemptyYEStwo#1{#2}}% {\doseventupleemptyNOPtwo#1{#2}}} -\long\def\doseventupleemptyYEStwo#1#2[#3]% +\def\doseventupleemptyYEStwo#1#2[#3]% {\secondargumenttrue \doifnextoptionalelse {\doseventupleemptyYESthree#1{#2}{#3}}% {\doseventupleemptyNOPthree#1{#2}{#3}}} -\long\def\doseventupleemptyYESthree#1#2#3[#4]% +\def\doseventupleemptyYESthree#1#2#3[#4]% {\thirdargumenttrue \doifnextoptionalelse {\doseventupleemptyYESfour#1{#2}{#3}{#4}}% {\doseventupleemptyNOPfour#1{#2}{#3}{#4}}} -\long\def\doseventupleemptyYESfour#1#2#3#4[#5]% +\def\doseventupleemptyYESfour#1#2#3#4[#5]% {\fourthargumenttrue \doifnextoptionalelse {\doseventupleemptyYESfive#1{#2}{#3}{#4}{#5}}% {\doseventupleemptyNOPfive#1{#2}{#3}{#4}{#5}}} -\long\def\doseventupleemptyYESfive#1#2#3#4#5[#6]% +\def\doseventupleemptyYESfive#1#2#3#4#5[#6]% {\fifthargumenttrue \doifnextoptionalelse {\doseventupleemptyYESsix#1{#2}{#3}{#4}{#5}{#6}}% {\doseventupleemptyNOPsix#1{#2}{#3}{#4}{#5}{#6}}} -\long\def\doseventupleemptyYESsix#1#2#3#4#5#6[#7]% +\def\doseventupleemptyYESsix#1#2#3#4#5#6[#7]% {\sixthargumenttrue \doifnextoptionalelse {\seventhargumenttrue#1[{#2}][{#3}][{#4}][{#5}][{#6}][{#7}]}% @@ -2764,13 +2578,13 @@ %D but changed into more versatile (more object oriented) ones %D using the \type{\get..argument} commands. -\def\complexorsimple#1% +\unexpanded\def\complexorsimple#1% {% \relax % prevents lookahead, brrr \doifnextoptionalelse {\firstargumenttrue \csname\s!complex\strippedcsname#1\endcsname} {\firstargumentfalse\csname\s!simple \strippedcsname#1\endcsname}} -\def\complexorsimpleempty#1% +\unexpanded\def\complexorsimpleempty#1% {% \relax % prevents lookahead, brrr \doifnextoptionalelse {\firstargumenttrue \csname\s!complex\strippedcsname#1\endcsname} @@ -2961,32 +2775,32 @@ %D used to select arguments. Their names explain their %D functionality. -\long\def\firstofoneargument #1{#1} +\def\firstofoneargument #1{#1} -\long\def\firstoftwoarguments #1#2{#1} -\long\def\secondoftwoarguments #1#2{#2} +\def\firstoftwoarguments #1#2{#1} +\def\secondoftwoarguments #1#2{#2} -\long\def\firstofthreearguments #1#2#3{#1} -\long\def\secondofthreearguments #1#2#3{#2} -\long\def\thirdofthreearguments #1#2#3{#3} +\def\firstofthreearguments #1#2#3{#1} +\def\secondofthreearguments #1#2#3{#2} +\def\thirdofthreearguments #1#2#3{#3} -\long\def\firstoffourarguments #1#2#3#4{#1} -\long\def\secondoffourarguments #1#2#3#4{#2} -\long\def\thirdoffourarguments #1#2#3#4{#3} -\long\def\fourthoffourarguments #1#2#3#4{#4} +\def\firstoffourarguments #1#2#3#4{#1} +\def\secondoffourarguments #1#2#3#4{#2} +\def\thirdoffourarguments #1#2#3#4{#3} +\def\fourthoffourarguments #1#2#3#4{#4} -\long\def\firstoffivearguments #1#2#3#4#5{#1} -\long\def\secondoffivearguments #1#2#3#4#5{#2} -\long\def\thirdoffivearguments #1#2#3#4#5{#3} -\long\def\fourthoffivearguments #1#2#3#4#5{#4} -\long\def\fifthoffivearguments #1#2#3#4#5{#5} +\def\firstoffivearguments #1#2#3#4#5{#1} +\def\secondoffivearguments #1#2#3#4#5{#2} +\def\thirdoffivearguments #1#2#3#4#5{#3} +\def\fourthoffivearguments #1#2#3#4#5{#4} +\def\fifthoffivearguments #1#2#3#4#5{#5} -\long\def\firstofsixarguments #1#2#3#4#5#6{#1} -\long\def\secondofsixarguments#1#2#3#4#5#6{#2} -\long\def\thirdofsixarguments #1#2#3#4#5#6{#3} -\long\def\fourthofsixarguments#1#2#3#4#5#6{#4} -\long\def\fifthofsixarguments #1#2#3#4#5#6{#5} -\long\def\sixthofsixarguments #1#2#3#4#5#6{#6} +\def\firstofsixarguments #1#2#3#4#5#6{#1} +\def\secondofsixarguments#1#2#3#4#5#6{#2} +\def\thirdofsixarguments #1#2#3#4#5#6{#3} +\def\fourthofsixarguments#1#2#3#4#5#6{#4} +\def\fifthofsixarguments #1#2#3#4#5#6{#5} +\def\sixthofsixarguments #1#2#3#4#5#6{#6} %D \macros %D {globalletempty,letempty, @@ -3558,9 +3372,9 @@ \def\@@irecurse{@@ir@@} % ecurse} % stepper \def\@@arecurse{@@ar@@} % ecurse} % action -\long\def\dostepwiserecurse#1#2#3#4% can be made faster by postponing #4 +\def\dostepwiserecurse#1#2#3#4% can be made faster by postponing #4 {\global\advance\outerrecurse \plusone - \long\global\expandafter\def\csname\@@arecurse\recursedepth\endcsname{#4}% + \global\expandafter\def\csname\@@arecurse\recursedepth\endcsname{#4}% \global\expandafter\let\csname\@@irecurse\recursedepth\endcsname\recurselevel \ifnum#3>0\relax \ifnum#2<#1\relax @@ -3580,7 +3394,7 @@ \fi \fi\normalexpanded{\nextrecurse{\number#1}{\number#2}{\number#3}}} -\long\def\dodostepwiserecurse#1#2#3% from to step +\def\dodostepwiserecurse#1#2#3% from to step {\ifnum#1>#2\relax \expandafter\nodostepwiserecurse \else @@ -3594,7 +3408,7 @@ \unexpanded\def\redostepwiserecurse {\expandrecursecontent\dodostepwiserecurse} -\long\unexpanded\def\dodostepwisereverse#1#2#3% from to step +\unexpanded\def\dodostepwisereverse#1#2#3% from to step {\ifnum#1<#2\relax \expandafter\nodostepwiserecurse \else @@ -3640,7 +3454,7 @@ %D Because the simple case is used often, we implement it %D more efficiently: -\long\unexpanded\def\dorecurse#1% +\unexpanded\def\dorecurse#1% {\ifcase#1\relax \expandafter\gobbletwoarguments \or @@ -3649,13 +3463,13 @@ \expandafter\xdorecurse \fi{#1}} -\long\unexpanded\def\xdorecurse#1#2% +\unexpanded\def\xdorecurse#1#2% {\global\advance\outerrecurse \plusone - \long\expandafter\gdef\csname\@@arecurse\recursedepth\endcsname{#2}% + \expandafter\gdef\csname\@@arecurse\recursedepth\endcsname{#2}% \global\expandafter\let\csname\@@irecurse\recursedepth\endcsname\recurselevel \expandafter\dodorecurse\expandafter1\expandafter{\number#1}} -\long\unexpanded\def\ydorecurse#1#2% +\unexpanded\def\ydorecurse#1#2% {\global\advance\outerrecurse \plusone \global\expandafter\let\csname\@@irecurse\recursedepth\endcsname\recurselevel \let\recurselevel\!!plusone @@ -3663,7 +3477,7 @@ \expandafter\let\expandafter\recurselevel\csname\@@irecurse\recursedepth\endcsname \global\advance\outerrecurse \minusone} -\long\unexpanded\def\dodorecurse#1#2% from to +\unexpanded\def\dodorecurse#1#2% from to {\ifnum#1>#2\relax \expandafter\nodorecurse \else @@ -3671,7 +3485,7 @@ \doubleexpandafter\redorecurse \fi\expandafter{\the\numexpr\recurselevel+\plusone\relax}{#2}} -\long\unexpanded\def\dodorecurse#1#2% from to +\unexpanded\def\dodorecurse#1#2% from to {\ifnum#1>#2\relax \expandafter\nodorecurse \else @@ -3707,14 +3521,14 @@ \let\endofloop\donothing -\unexpanded\long\def\doloop#1% +\unexpanded\def\doloop#1% {\global\advance\outerrecurse \plusone - \long\expandafter\gdef\csname\@@arecurse\recursedepth\endcsname{#1}% + \expandafter\gdef\csname\@@arecurse\recursedepth\endcsname{#1}% \global\expandafter\let\csname\@@irecurse\recursedepth\endcsname\recurselevel \let\endofloop\dodoloop \dodoloop1} % no \plusone else \recurselevel wrong -\unexpanded\long\def\dodoloop#1% +\unexpanded\def\dodoloop#1% {\def\recurselevel{#1}% \expandafter\redoloop\expandafter{\the\numexpr\recurselevel+\plusone\relax}} @@ -3729,7 +3543,7 @@ \unexpanded\def\exitloop % \exitloop quits at end {\let\endofloop\nodoloop} -\long\unexpanded\def\exitloopnow#1\endofloop % \exitloopnow quits directly +\unexpanded\def\exitloopnow#1\endofloop % \exitloopnow quits directly {\nodoloop} %D The loop is executed at least once, so beware of situations @@ -3774,24 +3588,24 @@ {\csname\@@arecurse\recursedepth\expandafter\expandafter\expandafter\endcsname \expandafter\expandafter\expandafter{\expandafter\recurselevel\expandafter}\expandafter{\recursedepth}} -\long\unexpanded\def\xdorecurse#1#2% +\unexpanded\def\xdorecurse#1#2% {\global\advance\outerrecurse \plusone - \long\global\expandafter\def\csname\@@arecurse\recursedepth\endcsname##1##2{#2}% + \global\expandafter\def\csname\@@arecurse\recursedepth\endcsname##1##2{#2}% \global\expandafter\let\csname\@@irecurse\recursedepth\endcsname\recurselevel \expandafter\dodorecurse\expandafter1\expandafter{\number#1}} -\long\unexpanded\def\ydorecurse#1#2% +\unexpanded\def\ydorecurse#1#2% {\global\advance\outerrecurse \plusone \global\expandafter\let\csname\@@irecurse\recursedepth\endcsname\recurselevel \let\recurselevel\!!plusone - \long\global\expandafter\def\csname\@@arecurse\recursedepth\endcsname##1##2{#2}% + \global\expandafter\def\csname\@@arecurse\recursedepth\endcsname##1##2{#2}% \expandrecursecontent \expandafter\let\expandafter\recurselevel\csname\@@irecurse\recursedepth\endcsname \global\advance\outerrecurse \minusone} -\long\unexpanded\def\dostepwiserecurse#1#2#3#4% can be made faster by postponing #4 +\unexpanded\def\dostepwiserecurse#1#2#3#4% can be made faster by postponing #4 {\global\advance\outerrecurse \plusone - \long\global\expandafter\def\csname\@@arecurse\recursedepth\endcsname##1##2{#4}% + \global\expandafter\def\csname\@@arecurse\recursedepth\endcsname##1##2{#4}% \global\expandafter\let\csname\@@irecurse\recursedepth\endcsname\recurselevel \ifnum#3>0\relax \ifnum#2<#1\relax @@ -3811,45 +3625,18 @@ \fi \fi\normalexpanded{\nextrecurse{\number#1}{\number#2}{\number#3}}} -\long\unexpanded\def\doloop#1% +\unexpanded\def\doloop#1% {\global\advance\outerrecurse \plusone - \long\global\expandafter\def\csname\@@arecurse\recursedepth\endcsname##1##2{#1}% + \global\expandafter\def\csname\@@arecurse\recursedepth\endcsname##1##2{#1}% \global\expandafter\let\csname\@@irecurse\recursedepth\endcsname\recurselevel \let\endofloop\dodoloop \dodoloop1} % no \plusone else \recurselevel wrong -% EXPERIMENT - % faster -% \long\unexpanded\def\dostepwiserecurse#1#2#3#4% can be made faster by postponing #4 -% {\global\advance\outerrecurse \plusone -% \long\global\expandafter\def\csname\@@arecurse\recursedepth\endcsname##1##2{#4}% -% \global\expandafter\let\csname\@@irecurse\recursedepth\endcsname\recurselevel -% \ifnum#3>\zerocount -% \ifnum#2<#1\relax -% \let\nextrecurse\exitstepwiserecurse -% \else -% \let\nextrecurse\dodostepwiserecurse -% \fi -% \else -% \ifnum#3<\zerocount -% \ifnum#1<#2\relax -% \let\nextrecurse\exitstepwiserecurse -% \else -% \let\nextrecurse\dodostepwisereverse -% \fi -% \else -% \let\nextrecurse\exitstepwiserecurse -% \fi -% \fi -% \normalexpanded{\nextrecurse{\number#1}{\number#2}{\number#3}}} - -% slightly faster - -\long\unexpanded\def\dostepwiserecurse#1#2#3#4% can be made faster by postponing #4 +\unexpanded\def\dostepwiserecurse#1#2#3#4% can be made faster by postponing #4 {\global\advance\outerrecurse \plusone - \long\global\expandafter\def\csname\@@arecurse\recursedepth\endcsname##1##2{#4}% + \global\expandafter\def\csname\@@arecurse\recursedepth\endcsname##1##2{#4}% \global\expandafter\let\csname\@@irecurse\recursedepth\endcsname\recurselevel \csname @swr% \ifnum#3>\zerocount @@ -3865,9 +3652,9 @@ % quite okay too, but untested % -% \long\def\dostepwiserecurse#1#2#3#4% can be made faster by postponing #4 +% \def\dostepwiserecurse#1#2#3#4% can be made faster by postponing #4 % {\global\advance\outerrecurse \plusone -% \long\global\expandafter\def\csname\@@arecurse\recursedepth\endcsname##1##2{#4}% +% \global\expandafter\def\csname\@@arecurse\recursedepth\endcsname##1##2{#4}% % \global\expandafter\let\csname\@@irecurse\recursedepth\endcsname\recurselevel % \normalexpanded % {\ifnum#3>\zerocount @@ -3950,30 +3737,6 @@ \expandafter\let\expandafter\recursestring\csname\@@irecurse\recursedepth\endcsname \global\advance\outerrecurse\minusone} -% D This alternative looks a bit different and uses a -% D pseudo counter. When this macro is nested, we have to use -% D different counters. This time we use keywords. -% D -% D \starttyping -% D \def\alfa{2} \def\beta{100} \def\gamma{3} -% D -% D \for \n=55 \to 100 \step 1 \do {... \n ...} -% D \for \n=\alfa \to \beta \step \gamma \do {... \n ...} -% D \for \n=\n \to 120 \step 1 \do {... \n ...} -% D \for \n=120 \to 100 \step -3 \do {... \n ...} -% D \for \n=55 \to 100 \step 2 \do {... \n ...} -% D \stoptyping -% D -% D Only in the third example we need to predefine \type{\n}. -% D The use of \type{\od} as a dilimiter would have made nested -% D use more problematic. -% -% obsolete: -% -% \def\for#1=#2\to#3\step#4\do#5% -% {\dostepwiserecurse{#2}{#3}{#4} -% {\let#1\recurselevel#5\let#1\recurselevel}} - %D \macros %D {newevery,everyline,EveryLine,EveryPar} %D @@ -4118,9 +3881,9 @@ %D \doifassignmentelse {...} {then ...} {else ...} %D \stoptyping -\long\def\docheckifassignmentelse#1=#2#3\@end@{\if#2@}% +\def\docheckifassignmentelse#1=#2#3\@end@{\if#2@}% -\long\def\doifassignmentelse#1% +\def\doifassignmentelse#1% {\expandafter\docheckifassignmentelse\detokenize{#1}=@@\@end@ \expandafter\secondoftwoarguments \else @@ -4147,16 +3910,16 @@ %D something I found out when primitives like \type %D {\jobname} were fed (or something undefined). -\long\def\convertargument#1\to#2{\dodoglobal\edef#2{\detokenize{#1}}} -\long\def\convertcommand #1\to#2{\dodoglobal\edef#2{\expandafter\detokenize\expandafter{#1}}} % hm, only second is also ok +\def\convertargument#1\to#2{\dodoglobal\edef#2{\detokenize{#1}}} +\def\convertcommand #1\to#2{\dodoglobal\edef#2{\expandafter\detokenize\expandafter{#1}}} % hm, only second is also ok -\long\def\defconvertedargument #1#2{\edef#1{\detokenize{#2}}} -\long\def\defconvertedcommand #1#2{\edef#1{\detokenize\expandafter{#2}}} -\long\def\edefconvertedargument#1#2{\edef#1{#2}% +\def\defconvertedargument #1#2{\edef#1{\detokenize{#2}}} +\def\defconvertedcommand #1#2{\edef#1{\detokenize\expandafter{#2}}} +\def\edefconvertedargument#1#2{\edef#1{#2}% \edef#1{\detokenize\expandafter{#1}}} -\long\def\gdefconvertedargument#1#2{\xdef#1{\detokenize{#2}}} -\long\def\gdefconvertedcommand #1#2{\xdef#1{\detokenize\expandafter{#2}}} -\long\def\xdefconvertedargument#1#2{\xdef#1{#2}% +\def\gdefconvertedargument#1#2{\xdef#1{\detokenize{#2}}} +\def\gdefconvertedcommand #1#2{\xdef#1{\detokenize\expandafter{#2}}} +\def\xdefconvertedargument#1#2{\xdef#1{#2}% \xdef#1{\detokenize\expandafter{#1}}} %D When you try to convert a primitive command, you'll find @@ -4263,7 +4026,7 @@ %D In examples~2 and~3 both arguments equal, in~1 and~4 %D they differ. -\long\def\ConvertToConstant#1#2#3% +\def\ConvertToConstant#1#2#3% {\edef\!!stringa{\expandafter\detokenize\expandafter{#2}}% \edef\!!stringb{\expandafter\detokenize\expandafter{#3}}% #1{\!!stringa}{\!!stringb}} @@ -4363,7 +4126,7 @@ %D results in: \type{\message{Hello world!}}. \def\dograbuntil#1#2% - {\long\def\next##1#1{#2{##1}}\next} + {\def\next##1#1{#2{##1}}\next} \def\grabuntil#1% {\expandafter\dograbuntil\expandafter{\csname#1\endcsname}} @@ -4390,11 +4153,11 @@ %D is related to these commands. This one simply throws away %D everything preceding \type{\command}. -\long\def\processbetween#1#2% +\def\processbetween#1#2% {\setvalue{\s!start#1}{\grabuntil{\s!stop#1}{#2}}} \def\gobbleuntil#1% - {\long\def\next##1#1{}\next} + {\def\next##1#1{}\next} \def\gobbleuntilrelax#1\relax {} @@ -4406,7 +4169,7 @@ %D \stoptyping \def\processuntil#1% - {\long\def\next##1#1{##1}\next} + {\def\next##1#1{##1}\next} %D \macros %D {groupedcommand} @@ -4476,23 +4239,23 @@ %D extra \type{\bgroup}||\type{\egroup} is needed to keep %D \type{\AfterGroup} both into sight and local. -\long\def\HandleGroup#1#2% +\def\HandleGroup#1#2% {\bgroup - \long\def\BeforeGroup{\bgroup#1\bgroup\aftergroup\AfterGroup}% - \long\def\AfterGroup {#2\egroup\egroup}% + \def\BeforeGroup{\bgroup#1\bgroup\aftergroup\AfterGroup}% + \def\AfterGroup {#2\egroup\egroup}% \afterassignment\BeforeGroup \let\next=} -\long\def\HandleSimpleGroup#1#2% no inner group (so no kerning interference) +\def\HandleSimpleGroup#1#2% no inner group (so no kerning interference) {\bgroup - %long\def\BeforeGroup{\bgroup#1\aftergroup\AfterGroup}% interferes - \long\def\BeforeGroup{\bgroup\aftergroup\AfterGroup#1}% - \long\def\AfterGroup {#2\egroup}% + %def\BeforeGroup{\bgroup#1\aftergroup\AfterGroup}% interferes + \def\BeforeGroup{\bgroup\aftergroup\AfterGroup#1}% + \def\AfterGroup {#2\egroup}% \afterassignment\BeforeGroup \let\next=} -% \long\def\HandleNoGroup#1#2% -% {\long\def\AfterGroup{#2\egroup}% +% \def\HandleNoGroup#1#2% +% {\def\AfterGroup{#2\egroup}% % \bgroup\aftergroup\AfterGroup#1} \def\HandleNoGroup % retrofit into mkii @@ -4502,12 +4265,12 @@ \expandafter\HandleNoGroupB \fi} -\long\def\HandleNoGroupA#1#2% - {\long\def\AfterGroup{#2\endgroup}% +\def\HandleNoGroupA#1#2% + {\def\AfterGroup{#2\endgroup}% \begingroup\aftergroup\AfterGroup#1} -\long\def\HandleNoGroupB#1#2% - {\long\def\AfterGroup{#2\egroup}% +\def\HandleNoGroupB#1#2% + {\def\AfterGroup{#2\egroup}% \bgroup\aftergroup\AfterGroup#1} %D I considered it a nuisance that @@ -4522,10 +4285,10 @@ %D line||ending token is treated as a blank space. So the final %D implementation became: -\long\unexpanded\def\groupedcommand#1#2% +\unexpanded\def\groupedcommand#1#2% {\doifnextbgroupelse{\HandleGroup{#1}{#2}}{\HandleNoGroup{#1}{#2}}} -\long\unexpanded\def\simplegroupedcommand#1#2% +\unexpanded\def\simplegroupedcommand#1#2% {\doifnextbgroupelse{\HandleSimpleGroup{#1}{#2}}{\HandleNoGroup{#1}{#2}}} %D Users should be aware of the fact that grouping can @@ -4746,10 +4509,10 @@ \def\dorepeatwithcommand[#1]% {\dodorepeatwithcommand#1*\empty*\relax} -\long\def\dodorepeatwithcommand#1*#2#3*#4\relax#5% +\def\dodorepeatwithcommand#1*#2#3*#4\relax#5% {\ifx#2\empty\redorepeatwithcommand[#1]#5\else\dododorepeatwithcommand{#1}{#2}{#3}#5\fi} -\long\def\dododorepeatwithcommand#1#2#3#4% +\def\dododorepeatwithcommand#1#2#3#4% {\ifx#2\empty % redundant but gives cleaner extensions #4{#1}% \else\ifnum#1<\zerocount @@ -4773,7 +4536,7 @@ %D \gdef\redorepeatwithcommand[#1]% %D {\redodorepeatwithcommand#1*\empty*\relax} %D -%D \long\gdef\redodorepeatwithcommand#1*#2#3*#4\relax#5% +%D \gdef\redodorepeatwithcommand#1*#2#3*#4\relax#5% %D {\dododorepeatwithcommand{#1}{#2}{#3}#5} %D %D \egroup @@ -4796,7 +4559,7 @@ %D are macros. This save some unneeded expansion. %D %D \starttyping -%D \long\def\doifstringinstringelse#1#2% +%D \def\doifstringinstringelse#1#2% %D {\do_if_in_string_else#1#2% %D \expandafter\firstoftwoarguments %D \else @@ -4813,8 +4576,8 @@ \expandafter\firstoftwoarguments \fi} -\long\def\doifstringinstringelse#1#2% - {\long\expandafter\def\expandafter\p!doifstringinstringelse\expandafter##\expandafter1#1##2##3\war +\def\doifstringinstringelse#1#2% + {\expandafter\def\expandafter\p!doifstringinstringelse\expandafter##\expandafter1#1##2##3\war {\pp!doifstringinstringelse##2}% \expandafter\expandafter\expandafter\p!doifstringinstringelse\expandafter#2#1@@\war} @@ -4849,20 +4612,20 @@ \def\dodoprependtoks {\dodoglobal\@@toks\doubleexpandafter{\expandafter\the\expandafter\@@scratchtoks\the\@@toks}} -\long\def\doappendtoks#1\to#2% +\def\doappendtoks#1\to#2% {\def\@@toks{#2}% \@@scratchtoks\expandafter{\gobbleoneargument#1}\dodoappendtoks} -\long\def\doprependtoks#1\to#2% +\def\doprependtoks#1\to#2% {\def\@@toks{#2}% \@@scratchtoks\expandafter{\gobbleoneargument#1}\dodoprependtoks} -\long\def\doappendtoksonce#1\to#2% +\def\doappendtoksonce#1\to#2% {\def\@@toks{#2}% \@@scratchtoks\expandafter{\gobbleoneargument#1}% \doifintokselse\@@scratchtoks\@@toks\donothing\dodoappendtoks} -\long\def\doprependtoksonce#1\to#2% +\def\doprependtoksonce#1\to#2% {\def\@@toks{#2}% \@@scratchtoks\expandafter{\gobbleoneargument#1}% \doifintokselse\@@scratchtoks\@@toks\donothing\dodoprependtoks} @@ -5411,40 +5174,7 @@ %D tokens per call. Anyone familiar with the not||values %D ones, can derive their meaning from the definitions. - \def\doifvalue#1{\doif {\csname#1\endcsname}} - \def\doifnotvalue#1{\doifnot {\csname#1\endcsname}} - \def\doifelsevalue#1{\doifelse{\csname#1\endcsname}} - - \def\doifnothing#1{\doif {#1}{}} - \def\doifsomething#1{\doifnot {#1}{}} - \def\doifelsenothing#1{\doifelse{#1}{}} - - \def\doifvaluenothing#1{\doif {\csname#1\endcsname}{}} - \def\doifvaluesomething#1{\doifnot {\csname#1\endcsname}{}} -\def\doifelsevaluenothing#1{\doifelse{\csname#1\endcsname}{}} - -%D Faster but spoiling inheritance (copying parameters): -%D -%D \starttyping -%D \def\doifelsevaluesomething#1#2#3% -%D {\expandafter\ifx\csname#1\endcsname\empty#3\else#2\fi} -%D -%D \def\doifvaluesomething#1#2% -%D {\expandafter\ifx\csname#1\endcsname\empty\else#2\fi} -%D -%D \def\doifvaluenothing#1#2% -%D {\expandafter\ifx\csname#1\endcsname\empty#2\fi} -%D \stoptyping -%D -%D Slightly more efficient: - - \def\doifnothing{\doif \empty} - \def\doifsomething{\doifnot \empty} -\def\doifelsenothing{\doifelse\empty} - -%D The somewhat faster alternatives are: - -\long\def\doifvalue#1#2% +\def\doifvalue#1#2% {\edef\!!stringa{\csname#1\endcsname}\edef\!!stringb{#2}% \ifx\!!stringa\!!stringb \expandafter\firstofoneargument @@ -5452,7 +5182,7 @@ \expandafter\gobbleoneargument \fi} -\long\def\doifnotvalue#1#2% +\def\doifnotvalue#1#2% {\edef\!!stringa{\csname#1\endcsname}\edef\!!stringb{#2}% \ifx\!!stringa\!!stringb \expandafter\gobbleoneargument @@ -5460,7 +5190,7 @@ \expandafter\firstofoneargument \fi} -\long\def\doifelsevalue#1#2% +\def\doifelsevalue#1#2% {\edef\!!stringa{\csname#1\endcsname}\edef\!!stringb{#2}% \ifx\!!stringa\!!stringb \expandafter\firstoftwoarguments @@ -5468,7 +5198,7 @@ \expandafter\secondoftwoarguments \fi} -\long\def\doifnothing#1% +\def\doifnothing#1% {\edef\!!stringa{#1}% \ifx\!!stringa\empty \expandafter\firstofoneargument @@ -5476,7 +5206,7 @@ \expandafter\gobbleoneargument \fi} -\long\def\doifsomething#1% +\def\doifsomething#1% {\edef\!!stringa{#1}% \ifx\!!stringa\empty \expandafter\gobbleoneargument @@ -5484,7 +5214,7 @@ \expandafter\firstofoneargument \fi} -\long\def\doifelsenothing#1% +\def\doifelsenothing#1% {\edef\!!stringa{#1}% \ifx\!!stringa\empty \expandafter\firstoftwoarguments @@ -5492,7 +5222,7 @@ \expandafter\secondoftwoarguments \fi} -\long\def\doifsomethingelse#1% +\def\doifsomethingelse#1% {\edef\!!stringa{#1}% \ifx\!!stringa\empty \expandafter\secondoftwoarguments @@ -5500,7 +5230,7 @@ \expandafter\firstoftwoarguments \fi} -\long\def\doifvaluenothing#1% +\def\doifvaluenothing#1% {\edef\!!stringa{\csname#1\endcsname}% \ifx\!!stringa\empty \expandafter\firstofoneargument @@ -5508,7 +5238,7 @@ \expandafter\gobbleoneargument \fi} -\long\def\doifvaluesomething#1% +\def\doifvaluesomething#1% {\edef\!!stringa{\csname#1\endcsname}% \ifx\!!stringa\empty \expandafter\gobbleoneargument @@ -5516,7 +5246,7 @@ \expandafter\firstofoneargument \fi} -\long\def\doifelsevaluenothing#1% +\def\doifelsevaluenothing#1% {\edef\!!stringa{\csname#1\endcsname}% \ifx\!!stringa\empty \expandafter\firstoftwoarguments @@ -5769,7 +5499,7 @@ \def\p!doifsomespaceelse#1 #2#3\war{\if\noexpand#2@} -\long\def\doifsomespaceelse#1% % #2#3% +\def\doifsomespaceelse#1% % #2#3% {\p!doifsomespaceelse#1 @ @\war % #3\else#2\fi} \expandafter\secondoftwoarguments \else @@ -5892,7 +5622,7 @@ %D \processlist(){=>}\docommand(a=>b=>c=>d) %D \stoptyping -\long\def\processlist#1#2#3#4% no blank skipping ! +\def\processlist#1#2#3#4% no blank skipping ! {\def\doprocesslist##1#2% {\def\dodoprocesslist####1####2#3% {\ifx#2####1% @@ -5951,7 +5681,7 @@ \escapechar\minusone \dountexsomething} -\long\def\dountexsomething#1#2\to#3% +\def\dountexsomething#1#2\to#3% {\doglobal#1#2\to\untexedargument \endgroup \let#3\untexedargument} @@ -6128,7 +5858,7 @@ %D Consider for instance the macro for which I originally %D wrote this token handler. -\long\def\splitofftokens#1\from#2\to#3% slow but hardly used +\def\splitofftokens#1\from#2\to#3% slow but hardly used {\ifnum#1>\zerocount \scratchcounter#1\relax \def\dosplitofftokens##1% @@ -6178,7 +5908,7 @@ \def\dohandletokens % \nexthandledtoken is part of interface {\futurelet\nexthandledtoken\dodohandletokens} -\long\def\handletokens#1\with#2% +\def\handletokens#1\with#2% {\gdef\dododohandletokens{#2}% permits more complex #2's \dohandletokens#1\end} @@ -6194,7 +5924,7 @@ \def\dodohandletokensone * % {\dododohandletokens{ }\dohandletokens} -\long\def\dodohandletokenstwo *#1% +\def\dodohandletokenstwo *#1% {\dododohandletokens{#1}\dohandletokens} %D This macro is tested on: @@ -6316,8 +6046,8 @@ {\begingroup\expandafter\doprocesscontent\csname#1\endcsname} \def\doprocesscontent#1#2#3% - {\long\def\doprocesscontent##1#1% - {\endgroup\long\def#2{##1}#3}% + {\def\doprocesscontent##1#1% + {\endgroup\def#2{##1}#3}% \doprocesscontent} %D \macros @@ -7029,12 +6759,12 @@ % The following macros are used in XML handling. -\long\setvalue{@u@s@"}#1#2"{#2} \long\setvalue{@g@s@"}#1#2"{\scratchtoks{#2}} -\long\setvalue{@u@s@'}#1#2'{#2} \long\setvalue{@g@s@'}#1#2'{\scratchtoks{#2}} -\long\setvalue{@u@s@ }#1#2 {#2} \long\setvalue{@g@s@ }#1#2 {\scratchtoks{#2}} +\setvalue{@u@s@"}#1#2"{#2} \setvalue{@g@s@"}#1#2"{\scratchtoks{#2}} +\setvalue{@u@s@'}#1#2'{#2} \setvalue{@g@s@'}#1#2'{\scratchtoks{#2}} +\setvalue{@u@s@ }#1#2 {#2} \setvalue{@g@s@ }#1#2 {\scratchtoks{#2}} -\long\def\unstringed#1{\csname\ifcsname @u@s@#1\endcsname @u@s@#1\else\s!empty\fi\endcsname#1} -\long\def\grabstring#1{\csname\ifcsname @g@s@#1\endcsname @g@s@#1\else\s!empty\fi\endcsname#1} +\def\unstringed#1{\csname\ifcsname @u@s@#1\endcsname @u@s@#1\else\s!empty\fi\endcsname#1} +\def\grabstring#1{\csname\ifcsname @g@s@#1\endcsname @g@s@#1\else\s!empty\fi\endcsname#1} \def\dowithgrabbedstring#1% {\def\@@dowithgrabbedstring{#1}% @@ -7061,8 +6791,8 @@ \fi \@@ifequal#2\@@and} -\long\def\@@if@@equal@@true #1\@@then#2#3{#2} -\long\def\@@if@@equal@@false#1\@@then#2#3{#3} +\def\@@if@@equal@@true #1\@@then#2#3{#2} +\def\@@if@@equal@@false#1\@@then#2#3{#3} \def\appended#1#2#3{\expandafter#1\expandafter#2\expandafter{#2#3}} \def\appendvalue #1{\expandafter\appended\expandafter \def\csname#1\endcsname} diff --git a/tex/generic/context/luatex/luatex-fonts-merged.lua b/tex/generic/context/luatex/luatex-fonts-merged.lua index 659046520..917c3939d 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/24/11 21:26:54 +-- merge date : 10/26/11 15:10:36 do -- begin closure to overcome local limits and interference @@ -3172,6 +3172,8 @@ if not modules then modules = { } end modules ['font-con'] = { } +-- some names of table entries will be changed (no _) + local utf = unicode.utf8 local next, tostring, rawget = next, tostring, rawget @@ -3216,7 +3218,80 @@ constructors.cache = containers.define("fonts", "constructors", constr constructors.privateoffset = 0xF0000 -- 0x10FFFF --- This might become an interface; +-- Some experimental helpers (handy for tracing): + +constructors.keys = { + properties = { + encodingbytes = "number", + embedding = "number", + cidinfo = { + }, + 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 = "scalespoints", + expansion = { + stretch = "integerscale", -- might become float + shrink = "integerscale", -- might become float + step = "integerscale", -- might become float + auto = "boolean", + }, + protrusion = { + auto = "boolean", + }, + 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", + }, + description = { + width = "basepoints", + height = "basepoints", + depth = "basepoints", + boundingbox = { }, + }, + character = { + width = "scaledpoints", + height = "scaledpoints", + depth = "scaledpoints", + italic = "scaledpoints", + }, + +} + +-- This might become an interface: local designsizes = allocate() constructors.designsizes = designsizes @@ -5113,6 +5188,8 @@ if not modules then modules = { } end modules ['font-otf'] = { -- to_table -> totable -- ascent descent +-- more checking against low level calls of functions + local utf = unicode.utf8 local utfbyte = utf.byte @@ -8628,6 +8705,11 @@ local function toligature(kind,lookupname,start,stop,char,markflag,discfound) -- start = start.next end end + -- we do need components in funny kerning mode but maybe I can better reconstruct then + -- as we do have the font components info available; removing components makes the + -- previous code much simpler + -- + -- flush_node_list(head.components) return head end end |