From b118ddb35b0a15f0a1f4868e93ca5833d833f371 Mon Sep 17 00:00:00 2001 From: Hans Hagen Date: Tue, 17 Jul 2012 16:42:00 +0200 Subject: beta 2012.07.17 16:42 --- tex/context/base/cont-new.mkii | 2 +- tex/context/base/cont-new.mkiv | 2 +- tex/context/base/context-version.pdf | Bin 4083 -> 4086 bytes tex/context/base/context-version.png | Bin 106557 -> 106663 bytes tex/context/base/context.mkii | 2 +- tex/context/base/context.mkiv | 2 +- tex/context/base/mult-de.mkii | 1 + tex/context/base/mult-def.lua | 3 + tex/context/base/mult-en.mkii | 1 + tex/context/base/mult-fr.mkii | 1 + tex/context/base/mult-it.mkii | 1 + tex/context/base/mult-nl.mkii | 1 + tex/context/base/mult-pe.mkii | 1 + tex/context/base/mult-ro.mkii | 1 + tex/context/base/page-ins.lua | 38 +++- tex/context/base/page-ins.mkiv | 43 +++-- tex/context/base/page-mix.lua | 11 ++ tex/context/base/s-def-01.mkiv | 2 +- tex/context/base/status-files.pdf | Bin 24333 -> 24372 bytes tex/context/base/status-lua.pdf | Bin 184231 -> 184342 bytes tex/context/base/strc-def.mkiv | 6 +- tex/context/base/strc-not.mkvi | 11 +- tex/context/base/strc-num.lua | 194 ++++++++++++++------- tex/context/base/strc-num.mkiv | 20 ++- tex/context/base/strc-pag.lua | 10 ++ tex/context/base/strc-ren.mkiv | 2 +- tex/context/interface/keys-cs.xml | 1 + tex/context/interface/keys-de.xml | 1 + tex/context/interface/keys-en.xml | 1 + tex/context/interface/keys-fr.xml | 1 + tex/context/interface/keys-it.xml | 1 + tex/context/interface/keys-nl.xml | 1 + tex/context/interface/keys-pe.xml | 1 + tex/context/interface/keys-ro.xml | 1 + tex/generic/context/luatex/luatex-fonts-merged.lua | 2 +- 35 files changed, 263 insertions(+), 102 deletions(-) (limited to 'tex') diff --git a/tex/context/base/cont-new.mkii b/tex/context/base/cont-new.mkii index 9a3834e56..7ec44d2eb 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{2012.07.17 00:23} +\newcontextversion{2012.07.17 16:42} %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 03f998078..4a0b05102 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{2012.07.17 00:23} +\newcontextversion{2012.07.17 16:42} %D This file is loaded at runtime, thereby providing an %D excellent place for hacks, patches, extensions and new diff --git a/tex/context/base/context-version.pdf b/tex/context/base/context-version.pdf index 3268979c2..75a91cef5 100644 Binary files a/tex/context/base/context-version.pdf and b/tex/context/base/context-version.pdf differ diff --git a/tex/context/base/context-version.png b/tex/context/base/context-version.png index 7e7b3e6d5..52f10ed09 100644 Binary files a/tex/context/base/context-version.png and b/tex/context/base/context-version.png differ diff --git a/tex/context/base/context.mkii b/tex/context/base/context.mkii index 8cd630ac1..ea8dbda6b 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{2012.07.17 00:23} +\edef\contextversion{2012.07.17 16:42} %D For those who want to use this: diff --git a/tex/context/base/context.mkiv b/tex/context/base/context.mkiv index 0eb100895..d07eddc07 100644 --- a/tex/context/base/context.mkiv +++ b/tex/context/base/context.mkiv @@ -25,7 +25,7 @@ %D up and the dependencies are more consistent. \edef\contextformat {\jobname} -\edef\contextversion{2012.07.17 00:23} +\edef\contextversion{2012.07.17 16:42} %D For those who want to use this: diff --git a/tex/context/base/mult-de.mkii b/tex/context/base/mult-de.mkii index 6d4e3734a..7ed54524b 100644 --- a/tex/context/base/mult-de.mkii +++ b/tex/context/base/mult-de.mkii @@ -456,6 +456,7 @@ \setinterfacevariable{subforward}{untervorwaerts} \setinterfacevariable{subject}{thema} \setinterfacevariable{subpage}{unterseite} +\setinterfacevariable{subs}{subs} \setinterfacevariable{subsection}{unterabsatz} \setinterfacevariable{subsubject}{unterthema} \setinterfacevariable{subsubsection}{unterunterabsatz} diff --git a/tex/context/base/mult-def.lua b/tex/context/base/mult-def.lua index 89ef990c7..b67ddaf9b 100644 --- a/tex/context/base/mult-def.lua +++ b/tex/context/base/mult-def.lua @@ -15756,6 +15756,9 @@ return { ["pe"]="زیرصفحه", ["ro"]="subpagina", }, + ["subs"]={ + ["en"]="subs", + }, ["subsection"]={ ["cs"]="podsekce", ["de"]="unterabsatz", diff --git a/tex/context/base/mult-en.mkii b/tex/context/base/mult-en.mkii index 6325765e0..9ea02f924 100644 --- a/tex/context/base/mult-en.mkii +++ b/tex/context/base/mult-en.mkii @@ -456,6 +456,7 @@ \setinterfacevariable{subforward}{subforward} \setinterfacevariable{subject}{subject} \setinterfacevariable{subpage}{subpage} +\setinterfacevariable{subs}{subs} \setinterfacevariable{subsection}{subsection} \setinterfacevariable{subsubject}{subsubject} \setinterfacevariable{subsubsection}{subsubsection} diff --git a/tex/context/base/mult-fr.mkii b/tex/context/base/mult-fr.mkii index 6b3acd811..017ac5fd2 100644 --- a/tex/context/base/mult-fr.mkii +++ b/tex/context/base/mult-fr.mkii @@ -456,6 +456,7 @@ \setinterfacevariable{subforward}{sousavance} \setinterfacevariable{subject}{sujet} \setinterfacevariable{subpage}{souspage} +\setinterfacevariable{subs}{subs} \setinterfacevariable{subsection}{soussection} \setinterfacevariable{subsubject}{soussujet} \setinterfacevariable{subsubsection}{soussoussection} diff --git a/tex/context/base/mult-it.mkii b/tex/context/base/mult-it.mkii index c901f1816..235280e60 100644 --- a/tex/context/base/mult-it.mkii +++ b/tex/context/base/mult-it.mkii @@ -456,6 +456,7 @@ \setinterfacevariable{subforward}{sottoavanti} \setinterfacevariable{subject}{argomento} \setinterfacevariable{subpage}{sottopagina} +\setinterfacevariable{subs}{subs} \setinterfacevariable{subsection}{sottocapoverso} \setinterfacevariable{subsubject}{sottoargomento} \setinterfacevariable{subsubsection}{sottosottocapoverso} diff --git a/tex/context/base/mult-nl.mkii b/tex/context/base/mult-nl.mkii index 07165f02c..1315ac931 100644 --- a/tex/context/base/mult-nl.mkii +++ b/tex/context/base/mult-nl.mkii @@ -456,6 +456,7 @@ \setinterfacevariable{subforward}{subvooruit} \setinterfacevariable{subject}{onderwerp} \setinterfacevariable{subpage}{subpagina} +\setinterfacevariable{subs}{subs} \setinterfacevariable{subsection}{subparagraaf} \setinterfacevariable{subsubject}{subonderwerp} \setinterfacevariable{subsubsection}{subsubparagraaf} diff --git a/tex/context/base/mult-pe.mkii b/tex/context/base/mult-pe.mkii index 6f7e245ff..965a95a8b 100644 --- a/tex/context/base/mult-pe.mkii +++ b/tex/context/base/mult-pe.mkii @@ -456,6 +456,7 @@ \setinterfacevariable{subforward}{زیرجلوگرد} \setinterfacevariable{subject}{موضوع} \setinterfacevariable{subpage}{زیرصفحه} +\setinterfacevariable{subs}{subs} \setinterfacevariable{subsection}{زیربخش} \setinterfacevariable{subsubject}{زیرموضوع} \setinterfacevariable{subsubsection}{زیرزیربخش} diff --git a/tex/context/base/mult-ro.mkii b/tex/context/base/mult-ro.mkii index 015603b9b..2468a4251 100644 --- a/tex/context/base/mult-ro.mkii +++ b/tex/context/base/mult-ro.mkii @@ -456,6 +456,7 @@ \setinterfacevariable{subforward}{subavans} \setinterfacevariable{subject}{subiect} \setinterfacevariable{subpage}{subpagina} +\setinterfacevariable{subs}{subs} \setinterfacevariable{subsection}{subsectiune} \setinterfacevariable{subsubject}{subsubiect} \setinterfacevariable{subsubsection}{subsubsectiune} diff --git a/tex/context/base/page-ins.lua b/tex/context/base/page-ins.lua index 1b8b8583b..44de95ea1 100644 --- a/tex/context/base/page-ins.lua +++ b/tex/context/base/page-ins.lua @@ -27,6 +27,13 @@ local report_inserts = logs.reporter("inserts") inserts.stored = inserts.stored or { } -- combining them in one is inefficient in the inserts.data = inserts.data or { } -- bytecode storage pool +local variables = interfaces.variables +local v_page = variables.page +local v_columns = variables.columns +local v_firstcolumn = variables.firstcolumn +local v_lastcolumn = variables.lastcolumn +local v_text = variables.text + storage.register("structures/inserts/stored", inserts.stored, "structures.inserts.stored") local data = inserts.data @@ -37,13 +44,34 @@ for name, specification in next, stored do data[name] = specification end -function inserts.define(specification) - local name = specification.name or "unknown" +function inserts.define(name,specification) + specification.name= name local number = specification.number or 0 data[name] = specification data[number] = specification -- only needed at runtime as this get stored in a bytecode register stored[name] = specification + if not specification.location then + specification.location = v_page + end + return specification +end + +function inserts.setup(name,settings) + local specification = data[name] + for k, v in next, settings do + -- maybe trace change + specification[k] = v + end + return specification +end + +function inserts.setlocation(name,location) -- a practical fast one + data[name].location = location +end + +function inserts.getlocation(name,location) + return data[name].location or v_page end function inserts.getdata(name) -- or number @@ -60,6 +88,8 @@ end -- interface -commands.defineinsertion = inserts.define -commands.insertionnumber = function(name) context(data[name].number or 0) end +commands.defineinsertion = inserts.define +commands.setupinsertion = inserts.setup +commands.setinsertionlocation = inserts.setlocation +commands.insertionnumber = function(name) context(data[name].number or 0) end diff --git a/tex/context/base/page-ins.mkiv b/tex/context/base/page-ins.mkiv index cb952e6e7..11b025ee0 100644 --- a/tex/context/base/page-ins.mkiv +++ b/tex/context/base/page-ins.mkiv @@ -31,6 +31,13 @@ \installcommandhandler \??insertion {insertion} \??insertion +\setupinsertion + [%c!n=\plusone, + %c!distance=\zeropoint, + %c!maxheight=\maxdimen, + %c!factor=\plusthousand, + \c!location=\v!page] + \newcount\currentinsertionnumber % This is a count and not a macro ! \newtoks\t_page_inserts_list @@ -48,22 +55,17 @@ \unexpanded\def\page_inserts_synchronize_registers {\currentinsertionnumber\csname\??insertionnumber\currentinsertion\endcsname} +% for practical reasone we still set these elsewhere but that might chaneg in the future +% +% \global\count\currentinsertionnumber\numexpr\insertionparameter\c!factor/\insertionparameter\c!n\relax +% \global\skip \currentinsertionnumber\insertionparameter\c!distance \relax +% \global\dimen\currentinsertionnumber\insertionparameter\c!maxheight\relax} + \appendtoks \page_inserts_synchronize_registers \to \everysetupinsertion -% \setupinsertion -% [\c!distance=\zeropoint, -% \c!maxheight=\maxdimen, -% \c!factor=\plusthousand] -% -% \unexpanded\def\page_inserts_synchronize_registers -% {\currentinsertionnumber\csname\??insertionnumber\currentinsertion\endcsname -% \global\count\currentinsertionnumber\insertionparameter\c!factor \relax -% \global\skip \currentinsertionnumber\insertionparameter\c!distance \relax -% \global\dimen\currentinsertionnumber\insertionparameter\c!maxheight\relax} - -\unexpanded\def\page_inserts_process#1% +\unexpanded\def\page_inserts_process#1% beware, this addapts currentinsertion ! {\edef\currentinsertion{#1}% \currentinsertionnumber\csname\??insertionnumber\currentinsertion\endcsname \doprocessinsert\currentinsertionnumber} % old method @@ -105,13 +107,7 @@ \else \expandafter\newinsert\csname\??insertionnumber\currentinsertion\endcsname \page_inserts_synchronize_registers - \ctxcommand{defineinsertion - { - name = "\currentinsertion", - number = \number\currentinsertionnumber, - } - }% - % + \ctxcommand{defineinsertion("\currentinsertion",{ number = \number\currentinsertionnumber })}% \t_page_inserts_list\expandafter\expandafter\expandafter {\expandafter\the\expandafter\t_page_inserts_list \expandafter\page_inserts_process\csname\??insertionnumber\currentinsertion\endcsname}% @@ -121,6 +117,15 @@ \fi \to \everydefineinsertion +\appendtoks + \ctxcommand{setupinsertion("\currentinsertion",{ + location = "\insertionparameter\c!location", + })}% +\to \everysetupinsertion + +\unexpanded\def\page_inserts_set_location#1#2% fast one + {\ctxcommand{setinsertionlocation("#1","#2")}} + %D Auxiliary macros: \def\page_insert_insertion_height#1% diff --git a/tex/context/base/page-mix.lua b/tex/context/base/page-mix.lua index 75e013ce4..6b7f88830 100644 --- a/tex/context/base/page-mix.lua +++ b/tex/context/base/page-mix.lua @@ -45,6 +45,7 @@ local variables = interfaces.variables local v_yes = variables.yes local v_global = variables["global"] local v_local = variables["local"] +local v_columns = variables.columns local trace_state = false trackers.register("mixedcolumns.trace", function(v) trace_state = v end) local trace_detail = false trackers.register("mixedcolumns.detail", function(v) trace_detail = v end) @@ -60,6 +61,16 @@ local forcedbreak = -123 -- initializesplitter(specification) -- cleanupsplitter() +-- Inserts complicate matters a lot. In order to deal with them well, we need to +-- distinguish several cases. +-- +-- (1) full page columns: firstcolumn, columns, lastcolumn, page +-- (2) mid page columns : firstcolumn, columns, lastcolumn, page +-- +-- We need to collect: +-- +-- + local function collectinserts(result,nxt,nxtid) local inserts, currentskips, nextskips, inserttotal = { }, 0, 0, 0 while nxt do diff --git a/tex/context/base/s-def-01.mkiv b/tex/context/base/s-def-01.mkiv index 1c8ee9469..49e585bd0 100644 --- a/tex/context/base/s-def-01.mkiv +++ b/tex/context/base/s-def-01.mkiv @@ -4,7 +4,7 @@ \startsetups defaults:frontpart:pagenumbers:roman \defineconversionset[\c!frontpart:\c!pagenumber][][romannumerals] - \setupuserpagenumber[\c!way=\v!byblock] + \setupuserpagenumber[\c!way=\v!by\v!block] \stopsetups \protect diff --git a/tex/context/base/status-files.pdf b/tex/context/base/status-files.pdf index 5fb854019..6f6736e91 100644 Binary files a/tex/context/base/status-files.pdf and b/tex/context/base/status-files.pdf differ diff --git a/tex/context/base/status-lua.pdf b/tex/context/base/status-lua.pdf index 9c7987cca..6499327bd 100644 Binary files a/tex/context/base/status-lua.pdf and b/tex/context/base/status-lua.pdf differ diff --git a/tex/context/base/strc-def.mkiv b/tex/context/base/strc-def.mkiv index bd7c25170..0738bdf29 100644 --- a/tex/context/base/strc-def.mkiv +++ b/tex/context/base/strc-def.mkiv @@ -49,7 +49,7 @@ % \startsetups defaults:frontpart:pagenumbers:roman % \defineconversionset[\c!frontpart:\c!pagenumber][][romannumerals] -% \setupuserpagenumber[\c!way=\v!byblock] +% \setupuserpagenumber[\c!way=\v!by\v!block] % \stopsetups % \definesectionblock @@ -180,7 +180,7 @@ \c!marking=\v!page, \c!header=, \c!style=\tfc, - \c!distance=.75em, + \c!distance=.75\emwidth, \c!before={\blank[2*\v!big]}, \c!after={\blank[2*\v!big]}] @@ -189,7 +189,7 @@ [%\c!align=, %\c!indentnext=\v!no, \c!style=\tfa, - \c!distance=.75em, + \c!distance=.75\emwidth, \c!before={\blank[2*\v!big]}, \c!after=\blank] diff --git a/tex/context/base/strc-not.mkvi b/tex/context/base/strc-not.mkvi index 05bca36ba..a81d3deb9 100644 --- a/tex/context/base/strc-not.mkvi +++ b/tex/context/base/strc-not.mkvi @@ -922,7 +922,7 @@ \unexpanded\def\strc_notes_set_variants {\normalexpanded{\rawprocesscommalist[\noteparameter\c!location]\strc_notes_set_location_step}} -\unexpanded\def\strc_notes_set_location_step#1% +\unexpanded\def\strc_notes_set_location_step#1% the insert related one {\ifcsname\??notelocation#1\endcsname \csname\??notelocation#1\endcsname \fi} @@ -957,6 +957,7 @@ {\setfalse\c_strc_notes_delayed \strc_notes_set_distance \strc_notes_set_columns + \page_inserts_set_location\currentnote\v!page % \setupinsertion[\currentnote][\c!location=\v!page]% \global\count\namedinsertionnumber\currentnote\numexpr\plusthousand/\c_strc_notes_columns\relax \global\dimen\namedinsertionnumber\currentnote\ifnotelimit\dimexpr\noteparameter\c!height*\c_strc_notes_columns\relax\else\maxdimen\fi \global\skip \namedinsertionnumber\currentnote\s_strc_notes_distance} @@ -968,23 +969,27 @@ \ifnum\currentnofcolumns=\zerocount \c_strc_notes_columns\plusone \fi + \page_inserts_set_location\currentnote\v!columns % \setupinsertion[\currentnote][\c!location=\v!columns]% \global\count\namedinsertionnumber\currentnote\numexpr\plusthousand/\c_strc_notes_columns\relax \global\dimen\namedinsertionnumber\currentnote\ifnotelimit\dimexpr\noteparameter\c!height*\c_strc_notes_columns\relax\else\maxdimen\fi \global\skip \namedinsertionnumber\currentnote\s_strc_notes_distance} -\def\strc_notes_set_location_firstcolumn +\def\strc_notes_set_location_somecolumn#whatcolumn% {\setfalse\c_strc_notes_delayed \strc_notes_set_distance \strc_notes_set_columns + \page_inserts_set_location\currentnote#whatcolumn% \setupinsertion[\currentnote][\c!location=#whatcolumn]% \global\count\namedinsertionnumber\currentnote\plusthousand \global\dimen\namedinsertionnumber\currentnote\ifnotelimit\noteparameter\c!height\else\maxdimen\fi \global\skip \namedinsertionnumber\currentnote\s_strc_notes_distance} -\let\strc_notes_set_location_lastcolumn\strc_notes_set_location_firstcolumn +\def\strc_notes_set_location_firstcolumn{\strc_notes_set_location_somecolumn\v!firstcolumn} +\def\strc_notes_set_location_lastcolumn {\strc_notes_set_location_somecolumn\v!lastcolumn } \def\strc_notes_set_location_text % we don't use inserts anyway (e.g. endnotes) {\settrue\c_strc_notes_delayed \ctxlua{structures.notes.setstate("\currentnote","store")}% + \page_inserts_set_location\currentnote\v!text % \setupinsertion[\currentnote][\c!location=\v!text]% \global\count\namedinsertionnumber\currentnote\zerocount \global\dimen\namedinsertionnumber\currentnote\maxdimen \global\skip \namedinsertionnumber\currentnote\zeropoint} diff --git a/tex/context/base/strc-num.lua b/tex/context/base/strc-num.lua index 0715a9e49..3189adacb 100644 --- a/tex/context/base/strc-num.lua +++ b/tex/context/base/strc-num.lua @@ -6,12 +6,13 @@ if not modules then modules = { } end modules ['strc-num'] = { license = "see context related readme files" } --- this will be reimplemented and some more will move to the commands namespace - local format = string.format local next, type = next, type local min, max = math.min, math.max -local texcount = tex.count +local texcount, texsetcount = tex.count, tex.setcount + +-- Counters are managed here. They can have multiple levels which makes it easier to synchronize +-- them. Synchronization is sort of special anyway, as it relates to document structuring. local allocate = utilities.storage.allocate local setmetatableindex = table.setmetatableindex @@ -26,8 +27,23 @@ local counters = structures.counters local documents = structures.documents local variables = interfaces.variables - --- state: start stop none reset +local v_start = variables.start +local v_page = variables.page +local v_reverse = variables.reverse +local v_first = variables.first +local v_next = variables.next +local v_previous = variables.previous +local v_prev = variables.prev +local v_last = variables.last +----- v_no = variables.no +local v_backward = variables.backward +local v_forward = variables.forward +----- v_subs = variables.subs or "subs" + +-- states: start stop none reset + +-- specials are used for counters that are set and incremented in special ways, like +-- pagecounters that get this treatment in the page builder counters.specials = counters.specials or { } local counterspecials = counters.specials @@ -66,54 +82,83 @@ end job.register('structures.counters.collected', tobesaved, initializer, finalizer) -local function constructor(t,s,name,i) -- variables ? - if s == "last" then +local constructor = { -- maybe some day we will provide an installer for more variants + + last = function(t,name,i) local cc = collected[name] - t.stop = (cc and cc[i] and cc[i][t.range]) or 0 -- stop is available for diagnostics purposes only + local stop = (cc and cc[i] and cc[i][t.range]) or 0 -- stop is available for diagnostics purposes only + t.stop = stop if t.offset then - return t.stop - t.step + return stop - t.step else - return t.stop + return stop end - elseif s == "first" then - if t.start > 0 then - return t.start -- brrr + end, + + first = function(t,name,i) + local start = t.start + if start > 0 then + return start -- brrr elseif t.offset then - return t.start + t.step + 1 + return start + t.step + 1 else - return t.start + 1 + return start + 1 end - elseif s == "prev" or s == "previous" then + end, + + prev = function(t,name,i) + return max(t.first,t.number-1) -- todo: step + end, + + previous = function(t,name,i) return max(t.first,t.number-1) -- todo: step - elseif s == "next" then + end, + + next = function(t,name,i) return min(t.last,t.number+1) -- todo: step - elseif s == "backward" then + end, + + backward =function(t,name,i) if t.number - 1 < t.first then return t.last else return t.previous end - elseif s == "forward" then + end, + + forward = function(t,name,i) if t.number + 1 > t.last then return t.first else return t.next end - elseif s == "subs" then + end, + + subs = function(t,name,i) local cc = collected[name] t.subs = (cc and cc[i+1] and cc[i+1][t.range]) or 0 return t.subs - else - return nil -- was 0, but that is fuzzy in testing for e.g. own - end + end, + +} + +local function dummyconstructor(t,name,i) + return nil -- was 0, but that is fuzzy in testing for e.g. own end +setmetatableindex(constructor,function(t,k) + if trace_counters then + report_counters("unknown constructor %q",tostring(k)) + end + return dummyconstructor +end) + local function enhance() for name, cd in next, counterdata do local data = cd.data for i=1,#data do local ci = data[i] - setmetatableindex(ci, function(t,s) return constructor(t,s,name,i) end) + setmetatableindex(ci, function(t,s) return constructor[s](t,name,i) end) end end enhance = nil @@ -126,7 +171,7 @@ local function allocate(name,i) -- can be metatable level = 1, -- block = "", -- todo numbers = nil, - state = variables.start, -- true + state = v_start, -- true data = { }, saved = { }, } @@ -145,7 +190,7 @@ local function allocate(name,i) -- can be metatable offset = false, stop = 0, -- via metatable: last, first, stop only for tracing } - setmetatableindex(ci, function(t,s) return constructor(t,s,name,i) end) + setmetatableindex(ci, function(t,s) return constructor[s](t,name,i) end) cd[i] = ci tobesaved[name][i] = { } else @@ -164,12 +209,12 @@ local function savevalue(name,i) local cs = tobesaved[name][i] local cc = collected[name] if trace_counters then - report_counters("saving value %s of counter named %s",cd.number,name) + report_counters("saving, counter: %s, value: %s",name,cd.number) end local cr = cd.range local old = (cc and cc[i] and cc[i][cr]) or 0 local number = cd.number - if cd.method == variables.page then + if cd.method == v_page then -- we can be one page ahead number = number - 1 end @@ -186,8 +231,8 @@ function counters.define(specification) if name and name ~= "" then -- todo: step local d = allocate(name,1) - d.start = specification.start - d.state = variables.start or "" + d.start = tonumber(specification.start) or 0 + d.state = v_state or "" local counter = specification.counter if counter and counter ~= "" then d.counter = counter -- only for special purposes, cannot be false @@ -202,18 +247,15 @@ end function counters.compact(name,level,onlynumbers) local cd = counterdata[name] ---~ print(name,cd) if cd then local data = cd.data local compact = { } for i=1,level or #data do local d = data[i] ---~ print(name,i,d.number) if d.number ~= 0 then compact[i] = (onlynumbers and d.number) or d end end ---~ print(table.serialize(compact)) return compact end end @@ -246,65 +288,76 @@ function counters.subs(name,n) return counterdata[name].data[n].subs or 0 end -function counters.setvalue(name,tag,value) +local function setvalue(name,tag,value) local cd = counterdata[name] if cd then cd[tag] = value end end +counters.setvalue = setvalue + function counters.setstate(name,value) -- true/false value = variables[value] if value then - counters.setvalue(name,"state",value) + setvalue(name,"state",value) end end function counters.setlevel(name,value) - counters.setvalue(name,"level",value) + setvalue(name,"level",value) end function counters.setoffset(name,value) - counters.setvalue(name,"offset",value) + setvalue(name,"offset",value) end local function synchronize(name,d) local dc = d.counter if dc then if trace_counters then - report_counters("setting counter %s with name %s to %s",dc,name,d.number) + report_counters("synchronize, counter: %s, name: %s, value: %s, action: setting",dc,name,d.number) end - tex.setcount("global",dc,d.number) + texsetcount("global",dc,d.number) end local cs = counterspecials[name] if cs then if trace_counters then - report_counters("invoking special for name %s",name) + report_counters("synchronize, counter: %s, name: %s, action: special",dc,name) end cs() end end -function counters.reset(name,n) +local function reset(name,n) local cd = counterdata[name] if cd then for i=n or 1,#cd.data do local d = cd.data[i] savevalue(name,i) - d.number = d.start or 0 + local number = d.start or 0 + d.number = number d.own = nil + if trace_counters then + report_counters("resetting, name: %s, sub: %s, value: %s",name,i,number) + end synchronize(name,d) end cd.numbers = nil + else end end -function counters.set(name,n,value) +local function set(name,n,value) local cd = counterdata[name] if cd then local d = allocate(name,n) - d.number = value or 0 + local number = value or 0 + d.number = number d.own = nil + if trace_counters then + report_counters("setting, name: %s, value: %s",name,number) + end synchronize(name,d) end end @@ -313,12 +366,19 @@ local function check(name,data,start,stop) for i=start or 1,stop or #data do local d = data[i] savevalue(name,i) - d.number = d.start or 0 + local number = d.start or 0 + d.number = number d.own = nil + if trace_counters then + report_counters("checking, name: %s, sub: %s, value: %s",name,i,number) + end synchronize(name,d) end end +counters.reset = reset +counters.set = set + function counters.setown(name,n,value) local cd = counterdata[name] if cd then @@ -345,7 +405,7 @@ function counters.restart(name,n,newstart,noreset) local d = allocate(name,n) d.start = newstart if not noreset then - counters.reset(name,n) -- hm + reset(name,n) -- hm end end end @@ -367,24 +427,38 @@ end function counters.add(name,n,delta) local cd = counterdata[name] --- inspect(cd) - if cd and (cd.state == variables.start or cd.state == "") then + if cd and (cd.state == v_start or cd.state == "") then local data = cd.data local d = allocate(name,n) d.number = (d.number or d.start or 0) + delta*(d.step or 0) -- d.own = nil local level = cd.level --- print(name,n,delta,level) if not level or level == -1 then -- -1 is signal that we reset manually + if trace_counters then + report_counters("adding, name: %s, level: manually, action: no checking",name) + end elseif level == -2 then -- -2 is signal that we work per text + if trace_counters then + report_counters("adding, name: %s, level: text, action: checking",name) + end check(name,data,n+1) elseif level > 0 then -- within countergroup + if trace_counters then + report_counters("adding, name: %s, level: %s, action: checking within group",name,level) + end check(name,data,n+1) elseif level == 0 then -- happens elsewhere + if trace_counters then + report_counters("adding, name: %s, level: %s, action: no checking",name,level) + end + else + if trace_counters then + report_counters("adding, name: %s, level: unknown, action: no checking",name) + end end synchronize(name,d) return d.number -- not needed @@ -392,19 +466,18 @@ function counters.add(name,n,delta) return 0 end -function counters.check(level) -- not used (yet) +function counters.check(level) for name, cd in next, counterdata do - -- report_counters("%s %s %s",name,cd.level,level) if cd.level == level then if trace_counters then - report_counters("resetting %s at level %s",name,level) + report_counters("resetting, name: %s, level: %s",name,level) end - counters.reset(name) + reset(name) end end end -function counters.get(name,n,key) +local function get(name,n,key) local d = allocate(name,n) d = d and d[key] if not d then @@ -416,8 +489,10 @@ function counters.get(name,n,key) end end +counters.get = get + function counters.value(name,n) -- what to do with own - return counters.get(name,n or 1,'number') or 0 + return get(name,n or 1,'number') or 0 end function counters.converted(name,spec) -- name can be number and reference to storage @@ -431,9 +506,8 @@ function counters.converted(name,spec) -- name can be number and reference to st if cd then local spec = spec or { } local numbers, ownnumbers = { }, { } - local reverse = spec.order == variables.reverse + local reverse = spec.order == v_reverse local kind = spec.type or "number" - local v_first, v_next, v_previous, v_last = variables.first, variables.next, variables.previous, variables.last local data = cd.data for k=1,#data do local v = data[k] @@ -446,7 +520,7 @@ function counters.converted(name,spec) -- name can be number and reference to st vn = v.first elseif kind == v_next then vn = v.next - elseif kind == v_previous then + elseif kind == v_prev or kind == v_previous then vn = v.prev elseif kind == v_last then vn = v.last @@ -498,7 +572,7 @@ function commands.showcounter(name) local data = cd.data for i=1,#data do local d = data[i] - context(" (%s: %s,%s,%s s:%s r:%s)",i,(d.start or 0),d.number or 0,d.last,d.step or 0,d.range or 0) + context(" (%s: %s,%s,%s s:%s r:%s)",i,d.start or 0,d.number or 0,d.last,d.step or 0,d.range or 0) end context("]") end @@ -543,7 +617,7 @@ end --~ return cd, false, "no section data" --~ end --~ -- local preferences ---~ local no = variables.no +--~ local no = v_no --~ if counterspecification and counterspecification.prefix == no then --~ return cd, false, "current spec blocks prefix" --~ end diff --git a/tex/context/base/strc-num.mkiv b/tex/context/base/strc-num.mkiv index 0b8f72e53..2209540ac 100644 --- a/tex/context/base/strc-num.mkiv +++ b/tex/context/base/strc-num.mkiv @@ -19,6 +19,7 @@ % work in progress % to be checked: can we use the command handler code here? +% all settings will move to lua \installcorenamespace{counter} @@ -31,7 +32,7 @@ % \c!prefixstopper=, \c!prefixconnector=., \c!prefixsegments=\autostructureprefixsegments\sharedcounterparameter, - \c!start=0, + \c!start=\zerocount, \c!prefix=\v!yes, \c!state=\v!start] @@ -79,9 +80,10 @@ \def\strc_counters_define_yes[#1][#2]% {\getparameters[\??counter#1][\s!counter=,#2]% counter is for internal purposes + \edef\p_start{\counterparameter{#1}\c!start}% \ctxcommand{definecounter { name = "#1", - start = tonumber("\counterparameter{#1}\c!start") or 0, + start = \ifx\p_start\empty0\else\number\p_start\fi, counter = "\counterparameter{#1}\s!counter", method = "\counterparameter{#1}\c!method", }}% @@ -94,8 +96,12 @@ \unexpanded\def\setupcounter {\dodoubleargument\strc_counters_setup} +% \def\strc_counters_setup[#1][#2]% +% {\getparameters[\??counter#1][\c!start=,#2]% hm, start +% \strc_counters_check_setup{#1}} + \def\strc_counters_setup[#1][#2]% - {\getparameters[\??counter#1][\c!start=,#2]% + {\getparameters[\??counter#1][#2]% no start here \strc_counters_check_setup{#1}} % % % % @@ -119,7 +125,8 @@ % it's a clone \else \edef\currentcounterlevel{\thenamedcounterlevel{#1}}% - \ctxcommand{checkcountersetup("#1",\currentcounterlevel,"\counterparameter{#1}\c!start","\counterparameter{#1}\c!state")}% + \edef\p_start{\counterparameter{#1}\c!start}% + \ctxcommand{checkcountersetup("#1",\currentcounterlevel,\ifx\p_start\empty0\else\number\p_start\fi,"\counterparameter{#1}\c!state")}% \fi} \unexpanded\def\doifcounterelse #1{\ctxcommand{doifelsecounter("\strc_counters_the{#1}")}} @@ -635,9 +642,10 @@ \let\m_strc_counters_last_registered_synchronize\relax \def\strc_counter_setup_using_parameter#1#2% name \someparameter - {\setupcounter + {\edef\p_start{#2\c!start}% + \setupcounter [#1] - [ \c!start=#2\c!start, + [ \c!start=\ifx\p_start\empty0\else\number\p_start\fi, \c!state=#2\c!state, % beware, "" == start \c!way=#2\c!way, % diff --git a/tex/context/base/strc-pag.lua b/tex/context/base/strc-pag.lua index 460d4ff00..e154c4d26 100644 --- a/tex/context/base/strc-pag.lua +++ b/tex/context/base/strc-pag.lua @@ -69,6 +69,9 @@ function pages.save(prefixdata,numberdata) end end +-- We can set th epagenumber but as it only get incremented in the page +-- builder we have to make sure it starts at least at 1. + function counters.specials.userpage() local r = texcount.realpageno if r > 0 then @@ -78,8 +81,15 @@ function counters.specials.userpage() if trace_pages then report_pages("forcing pagenumber of realpage %s to %s",r,t.number) end + return end end + local u = texcount.userpageno + if u == 0 then + report_pages("forcing pagenumber of realpage %s to %s (probably a bug)",r,1) + counter.setvalue("userpage",1) + texcount.userpageno = 1 + end end local function convertnumber(str,n) diff --git a/tex/context/base/strc-ren.mkiv b/tex/context/base/strc-ren.mkiv index ba14bb59f..f22df120f 100644 --- a/tex/context/base/strc-ren.mkiv +++ b/tex/context/base/strc-ren.mkiv @@ -635,8 +635,8 @@ \stopsetups \defineheadalternative - [\v!inmargin] [\v!margin] + [\v!inmargin] % \startsetups[\??headrenderings:\v!vertical:\v!margin] % \directsetup{\??headrenderings:\v!vertical:\v!inmargin} diff --git a/tex/context/interface/keys-cs.xml b/tex/context/interface/keys-cs.xml index 2499ad8db..3a1e12ed3 100644 --- a/tex/context/interface/keys-cs.xml +++ b/tex/context/interface/keys-cs.xml @@ -459,6 +459,7 @@ + diff --git a/tex/context/interface/keys-de.xml b/tex/context/interface/keys-de.xml index 5ba370a6d..a19679f49 100644 --- a/tex/context/interface/keys-de.xml +++ b/tex/context/interface/keys-de.xml @@ -459,6 +459,7 @@ + diff --git a/tex/context/interface/keys-en.xml b/tex/context/interface/keys-en.xml index fa765aa54..264e9086a 100644 --- a/tex/context/interface/keys-en.xml +++ b/tex/context/interface/keys-en.xml @@ -459,6 +459,7 @@ + diff --git a/tex/context/interface/keys-fr.xml b/tex/context/interface/keys-fr.xml index b668bd35c..bd1215a05 100644 --- a/tex/context/interface/keys-fr.xml +++ b/tex/context/interface/keys-fr.xml @@ -459,6 +459,7 @@ + diff --git a/tex/context/interface/keys-it.xml b/tex/context/interface/keys-it.xml index df260ffa4..a4af3e41f 100644 --- a/tex/context/interface/keys-it.xml +++ b/tex/context/interface/keys-it.xml @@ -459,6 +459,7 @@ + diff --git a/tex/context/interface/keys-nl.xml b/tex/context/interface/keys-nl.xml index 5dd2f83dd..7428ac813 100644 --- a/tex/context/interface/keys-nl.xml +++ b/tex/context/interface/keys-nl.xml @@ -459,6 +459,7 @@ + diff --git a/tex/context/interface/keys-pe.xml b/tex/context/interface/keys-pe.xml index 2128680e7..832bb60e6 100644 --- a/tex/context/interface/keys-pe.xml +++ b/tex/context/interface/keys-pe.xml @@ -459,6 +459,7 @@ + diff --git a/tex/context/interface/keys-ro.xml b/tex/context/interface/keys-ro.xml index 915a0c226..8b6aac94e 100644 --- a/tex/context/interface/keys-ro.xml +++ b/tex/context/interface/keys-ro.xml @@ -459,6 +459,7 @@ + diff --git a/tex/generic/context/luatex/luatex-fonts-merged.lua b/tex/generic/context/luatex/luatex-fonts-merged.lua index b92bf2ab3..b6eabbeb4 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 : 07/17/12 00:23:01 +-- merge date : 07/17/12 16:42:27 do -- begin closure to overcome local limits and interference -- cgit v1.2.3