diff options
Diffstat (limited to 'tex')
164 files changed, 8253 insertions, 8067 deletions
diff --git a/tex/context/base/anch-pgr.mkiv b/tex/context/base/anch-pgr.mkiv index 046a161e5..45843c76d 100644 --- a/tex/context/base/anch-pgr.mkiv +++ b/tex/context/base/anch-pgr.mkiv @@ -69,18 +69,22 @@ \appendtoks \presetpositionanchors \to \aftereverypage % todo: change with each page size change .. can be made more efficient -% as some values are the same +% as some values are the same .. this one can (at some point) be used +% to provide correction for imposition -\def\registerpageposition#1% this one is flushed first ! +\def\doregisterpageposition#1% + {\setbox#1\hbox{\hpos\pageanchor{\box#1}}} + +\def\registerpageposition#1% this one is flushed first ! ... can't we avoid this one {\ifpositioning\ifcase\realpageno\or \ifdim\printpaperheight=\paperheight \ifdim\printpaperwidth=\paperwidth % not needed, \else - \setbox#1\hbox{\hpos\pageanchor{\box#1}}% + \doregisterpageposition{#1}% \fi \else - \setbox#1\hbox{\hpos\pageanchor{\box#1}}% + \doregisterpageposition{#1}% \fi \fi\fi} @@ -597,10 +601,10 @@ \def\textbackgroundoverlay#1% {\iflocalpositioning\v!local\else\v!text\fi#1} -\newcounter\localpositionnumber +\newcount\localpositionnumber \def\MPanchornumber - {\iflocalpositioning\localpositionnumber\else\the\realpageno\fi} + {\iflocalpositioning\the\localpositionnumber\else\the\realpageno\fi} %D So far for the trickery. @@ -738,92 +742,28 @@ \carryoverpar\egroup} \unexpanded\def\starttextbackgroundmanual - {\dostartattributes{\??td\currenttextbackground}\c!style\c!color\empty + {\begingroup + \dousestylehashparameter{\??td\currenttextbackground}\c!style + \dousecolorhashparameter{\??td\currenttextbackground}\c!color \fpos\currentparbackground\ignorespaces} \unexpanded\def\stoptextbackgroundmanual {\tpos\currentparbackground - \dostopattributes} + \endgroup} \def\dostarttextbackgroundtxt {\ifvmode \dontleavehmode \fi - \dostartattributes{\??td\currenttextbackground}\c!style\c!color\empty + \begingroup + \dousestylehashparameter{\??td\currenttextbackground}\c!style + \dousecolorhashparameter{\??td\currenttextbackground}\c!color \fpos\currentparbackground\ignorespaces} \def\dostoptextbackgroundtxt {\tpos\currentparbackground - \dostopattributes} + \endgroup} \newskip\textbackgroundskip -% \def\dostarttextbackgroundpar -% {\endgraf % new -% \textbackgroundparameter\c!before -% \noindent -% \ifgridsnapping -% \doassignsomeskip\textbackgroundparameter\c!topoffset\to\textbackgroundskip -% \ifdim\textbackgroundskip>\zeropoint -% \struttedbox{\hbox{\raise\textbackgroundskip\hbox{\fpos\currentparbackground}}}% -% \else -% \fpos\currentparbackground -% \fi -% \else -% \fpos\currentparbackground -% \fi -% \bgroup -% \endgraf % we need a vertical nobreak - 29/06/2004 -% \nobreak \vskip-\lineheight \nobreak -% \ifgridsnapping \else -% \doassignsomeskip\textbackgroundparameter\c!topoffset\to\textbackgroundskip -% \ifdim\textbackgroundskip>\zeropoint -% \kern\textbackgroundskip\nobreak -% \fi -% \fi -% \dosetleftskipadaption{\textbackgroundparameter\c!leftoffset}% -% \advance\leftskip\leftskipadaption -% \dosetleftskipadaption{\textbackgroundparameter\c!rightoffset}% -% \advance\rightskip\leftskipadaption -% % new -% \dosetraggedcommand{\textbackgroundparameter\c!align}% -% \raggedcommand -% % -% \dostartattributes{\??td\currenttextbackground}\c!style\c!color\empty -% \nowhitespace -% \nobreak % new per 23/04/2006 (else potential break when whitespace) -% \seteffectivehsize -% \doinhibitblank % \blank[\v!disable]% new -% \par} - -% \def\dostoptextbackgroundpar -% {\par -% \removelastskip % new -% \dostopattributes -% \doassignsomeskip\textbackgroundparameter\c!bottomoffset\to\textbackgroundskip -% \ifdim\lastskip>\zeropoint -% \advance\textbackgroundskip-\lastskip -% \fi -% \ifgridsnapping \else \ifdim\textbackgroundskip>\zeropoint -% \kern\textbackgroundskip\nobreak -% \fi \fi -% \nobreak \vskip-\dimexpr\lineheight+\parskip\relax \nobreak -% %\nobreak \vskip-\lineheight \nobreak \nowhitespace % does not work -% \egroup -% \bgroup \forgeteverypar % NOT REALLY NEEDED, SAVES HASH/MEM -% \nobreak \noindent \strut \hfill \kern\zeropoint -% \doassignsomeskip\textbackgroundparameter\c!bottomoffset\to\textbackgroundskip -% \ifgridsnapping % experimental, pascal (todo: topoffset in same way) -% \ifdim\textbackgroundskip>\zeropoint -% \struttedbox\plusone{\hbox{\lower\textbackgroundskip\hbox{\tpos\currentparbackground}}}% -% \else -% \tpos\currentparbackground -% \fi -% \else -% \tpos\currentparbackground -% \fi -% \egroup -% \endgraf % new -% \textbackgroundparameter\c!after} - \def\dostarttextbackgroundpar {\endgraf % new \textbackgroundparameter\c!before @@ -858,7 +798,9 @@ \dosetraggedcommand{\textbackgroundparameter\c!align}% \raggedcommand % - \dostartattributes{\??td\currenttextbackground}\c!style\c!color\empty + %\begingroup + \dousestylehashparameter{\??td\currenttextbackground}\c!style + \dousecolorhashparameter{\??td\currenttextbackground}\c!color \nowhitespace \nobreak % new per 23/04/2006 (else potential break when whitespace) \seteffectivehsize @@ -868,7 +810,7 @@ \def\dostoptextbackgroundpar {\par \removelastskip % new - \dostopattributes + %\endgroup \doassignsomeskip\textbackgroundparameter\c!bottomoffset\to\textbackgroundskip \ifdim\lastskip>\zeropoint \advance\textbackgroundskip-\lastskip diff --git a/tex/context/base/attr-lay.mkiv b/tex/context/base/attr-lay.mkiv index 293122f42..7dd0e35b9 100644 --- a/tex/context/base/attr-lay.mkiv +++ b/tex/context/base/attr-lay.mkiv @@ -74,27 +74,27 @@ % layout components are implemented rather directly (speed) -\def\doinitializelayoutcomponent#1#2% +\def\doinitializelayoutcomponent#1% {\ctxcommand{defineviewerlayer{% this will move to the lua end i.e be merged with register - tag = "#1:#2", - title = "#1 #2", + tag = "#1", + title = "#1", % todo: auto remove : visible = "\v!start", editable = "\v!yes", printable = "\v!yes" }}% - \edef\layoutcomponentboxattribute{attr \viewerlayerattribute \ctxlua{tex.write(attributes.viewerlayers.register('#1:#2',true))}\relax}% - \expandafter\glet\csname\??ly>#1:#2\endcsname\layoutcomponentboxattribute} + \edef\layoutcomponentboxattribute{attr \viewerlayerattribute \ctxlua{tex.write(attributes.viewerlayers.register('#1',true))}\relax}% + \expandafter\glet\csname\??ly>#1\endcsname\layoutcomponentboxattribute} -\def\dosetlayoutcomponentattribute#1#2% make this faster - {\expandafter\let\expandafter\layoutcomponentboxattribute\csname\??ly>#1:#2\endcsname +\def\dosetlayoutcomponentattribute#1% make this faster + {\expandafter\let\expandafter\layoutcomponentboxattribute\csname\??ly>#1\endcsname \ifx\layoutcomponentboxattribute\relax - \doinitializelayoutcomponent{#1}{#2}% get rid of { } + \doinitializelayoutcomponent{#1}% get rid of { } \fi} \def\doresetlayoutcomponentattribute {\let\layoutcomponentboxattribute\empty} -\let\setlayoutcomponentattribute \gobbletwoarguments +\let\setlayoutcomponentattribute \gobbleoneargument \let\resetlayoutcomponentattribute\relax \let\layoutcomponentboxattribute \empty diff --git a/tex/context/base/back-exp.lua b/tex/context/base/back-exp.lua index 750b26fe1..fd3d4eb1b 100644 --- a/tex/context/base/back-exp.lua +++ b/tex/context/base/back-exp.lua @@ -1200,8 +1200,7 @@ function extras.tabulate(result,element,detail,n,fulltag,di) local content = false for i=1,#did do local d = did[i].data - local c = d and d.content - if c and #c > 0 then + if d and #d > 0 and d[1].content then content = true break end @@ -1847,15 +1846,18 @@ local function collectresults(head,list) -- is last used (we also have currentat local c = n.char if last ~= at then local tl = taglist[at] - if trace_export then - report_export("%s<!-- processing glyph %s (tag %s) -->",spaces[currentdepth],utfchar(c),at) - end +-- if trace_export then +-- report_export("%s<!-- processing glyph %s (tag %s) -->",spaces[currentdepth],utfchar(c),at) +-- end pushcontent() currentnesting = tl currentparagraph = has_attribute(n,a_taggedpar) currentattribute = at last = at pushentry(currentnesting) + if trace_export then + report_export("%s<!-- processing glyph %s (tag %s) -->",spaces[currentdepth],utfchar(c),at) + end -- We need to intercept this here; maybe I will also move this -- to a regular setter at the tex end. local r = has_attribute(n,a_reference) @@ -1951,52 +1953,91 @@ local function collectresults(head,list) -- is last used (we also have currentat collectresults(n.replace,nil) elseif id == glue_code then -- we need to distinguish between hskips and vskips - local subtype = n.subtype - if subtype == userskip_code then - local ca = has_attribute(n,a_characters) - if ca then - if ca == 0 then - -- skip this one ... already converted special character (node-acc) - else - local a = has_attribute(n,a_tagged) - if somespace[currentcontent[nofcurrentcontent]] then - if trace_export then - report_export("%s<!-- removing space -->",spaces[currentdepth]) - end - nofcurrentcontent = nofcurrentcontent - 1 + local ca = has_attribute(n,a_characters) + if ca == 0 then + -- skip this one ... already converted special character (node-acc) + elseif ca then + local a = has_attribute(n,a_tagged) + if a then + local c = specialspaces[ca] + if last ~= a then + local tl = taglist[a] + if trace_export then + report_export("%s<!-- processing space glyph U+%05X (tag %s) case 1 -->",spaces[currentdepth],ca,a) end - if last ~= a then - pushcontent() - last = a - currentnesting = taglist[last] + pushcontent() + currentnesting = tl + currentparagraph = has_attribute(n,a_taggedpar) + currentattribute = a + last = a + pushentry(currentnesting) + -- no reference check (see above) + elseif last then + local ap = has_attribute(n,a_taggedpar) + if ap ~= currentparagraph then + pushcontent(format("new paragraph (%s -> %s)",tostring(currentparagraph),tostring(ap))) pushentry(currentnesting) currentattribute = last + currentparagraph = ap end - nofcurrentcontent = nofcurrentcontent + 1 - currentcontent[nofcurrentcontent] = specialspaces[ca] -- utfchar(ca) if trace_export then - report_export("%s<!-- adding special space/glue (tag %s => %s) -->",spaces[currentdepth],last,a) + report_export("%s<!-- processing space glyph U+%05X (tag %s) case 2 -->",spaces[currentdepth],ca,last) end end - elseif n.spec.width > threshold then - if last and not somespace[currentcontent[nofcurrentcontent]] then + -- if somespace[currentcontent[nofcurrentcontent]] then + -- if trace_export then + -- report_export("%s<!-- removing space -->",spaces[currentdepth]) + -- end + -- nofcurrentcontent = nofcurrentcontent - 1 + -- end + nofcurrentcontent = nofcurrentcontent + 1 + currentcontent[nofcurrentcontent] = c + end + else + local subtype = n.subtype + if subtype == userskip_code then + if n.spec.width > threshold then + if last and not somespace[currentcontent[nofcurrentcontent]] then + local a = has_attribute(n,a_tagged) + if a == last then + if trace_export then + report_export("%s<!-- injecting spacing 5a -->",spaces[currentdepth]) + end + nofcurrentcontent = nofcurrentcontent + 1 + currentcontent[nofcurrentcontent] = " " + elseif a then + -- e.g LOGO<space>LOGO + if trace_export then + report_export("%s<!-- processing glue > threshold (tag %s => %s) -->",spaces[currentdepth],last,a) + end + pushcontent() + if trace_export then + report_export("%s<!-- injecting spacing 5b -->",spaces[currentdepth]) + end + last = a + nofcurrentcontent = nofcurrentcontent + 1 + currentcontent[nofcurrentcontent] = " " + currentnesting = taglist[last] + pushentry(currentnesting) + currentattribute = last + end + end + end + elseif subtype == spaceskip_code or subtype == xspaceskip_code then + if not somespace[currentcontent[nofcurrentcontent]] then local a = has_attribute(n,a_tagged) if a == last then if trace_export then - report_export("%s<!-- injecting spacing 5a -->",spaces[currentdepth]) + report_export("%s<!-- injecting spacing 7 (stay in element) -->",spaces[currentdepth]) end nofcurrentcontent = nofcurrentcontent + 1 currentcontent[nofcurrentcontent] = " " - elseif a then - -- e.g LOGO<space>LOGO - if trace_export then - report_export("%s<!-- processing glue > threshold (tag %s => %s) -->",spaces[currentdepth],last,a) - end - pushcontent() + else if trace_export then - report_export("%s<!-- injecting spacing 5b -->",spaces[currentdepth]) + report_export("%s<!-- injecting spacing 7 (end of element) -->",spaces[currentdepth]) end last = a + pushcontent() nofcurrentcontent = nofcurrentcontent + 1 currentcontent[nofcurrentcontent] = " " currentnesting = taglist[last] @@ -2004,57 +2045,28 @@ local function collectresults(head,list) -- is last used (we also have currentat currentattribute = last end end - end - elseif subtype == spaceskip_code or subtype == xspaceskip_code then - if not somespace[currentcontent[nofcurrentcontent]] then - local a = has_attribute(n,a_tagged) - if a == last then - if trace_export then - report_export("%s<!-- injecting spacing 7 (stay in element) -->",spaces[currentdepth]) - end - nofcurrentcontent = nofcurrentcontent + 1 - currentcontent[nofcurrentcontent] = " " - else - if trace_export then - report_export("%s<!-- injecting spacing 7 (end of element) -->",spaces[currentdepth]) - end - last = a - pushcontent() - nofcurrentcontent = nofcurrentcontent + 1 - currentcontent[nofcurrentcontent] = " " - currentnesting = taglist[last] - pushentry(currentnesting) - currentattribute = last - end - end - elseif id == kern_code then - local kern = n.kern - if kern > 0 then - local limit = threshold - if p and p.id == glyph_code then - limit = fontquads[p.font] / 4 - end - if kern > limit then - if last and not somespace[currentcontent[nofcurrentcontent]] then + elseif subtype == rightskip_code then + -- a line + if nofcurrentcontent > 0 then + local r = currentcontent[nofcurrentcontent] + if r == hyphen then + if not keephyphens then + nofcurrentcontent = nofcurrentcontent - 1 + end + elseif not somespace[r] then local a = has_attribute(n,a_tagged) if a == last then - if not somespace[currentcontent[nofcurrentcontent]] then - if trace_export then - report_export("%s<!-- injecting spacing 8 (%s) -->",spaces[currentdepth],topoints(kern,true)) - end - nofcurrentcontent = nofcurrentcontent + 1 - currentcontent[nofcurrentcontent] = " " + if trace_export then + report_export("%s<!-- injecting spacing 1 (end of line, stay in element) -->",spaces[currentdepth]) end - elseif a then - -- e.g LOGO<space>LOGO + nofcurrentcontent = nofcurrentcontent + 1 + currentcontent[nofcurrentcontent] = " " + else if trace_export then - report_export("%s<!-- processing kern, threshold %s, tag %s => %s -->",spaces[currentdepth],topoints(limit,true),last,a) + report_export("%s<!-- injecting spacing 1 (end of line, end of element) -->",spaces[currentdepth]) end last = a pushcontent() - if trace_export then - report_export("%s<!-- injecting spacing 9 (%s) -->",spaces[currentdepth],topoints(kern,true)) - end nofcurrentcontent = nofcurrentcontent + 1 currentcontent[nofcurrentcontent] = " " currentnesting = taglist[last] @@ -2063,29 +2075,40 @@ local function collectresults(head,list) -- is last used (we also have currentat end end end + elseif subtype == parfillskip_code then + -- deal with paragaph endings (crossings) elsewhere and we quit here + -- as we don't want the rightskip space addition + return end - elseif subtype == rightskip_code then - -- a line - if nofcurrentcontent > 0 then - local r = currentcontent[nofcurrentcontent] - if r == hyphen then - if not keephyphens then - nofcurrentcontent = nofcurrentcontent - 1 - end - elseif not somespace[r] then + end + elseif id == kern_code then + local kern = n.kern + if kern > 0 then + local limit = threshold + if p and p.id == glyph_code then + limit = fontquads[p.font] / 4 + end + if kern > limit then + if last and not somespace[currentcontent[nofcurrentcontent]] then local a = has_attribute(n,a_tagged) if a == last then - if trace_export then - report_export("%s<!-- injecting spacing 1 (end of line, stay in element) -->",spaces[currentdepth]) + if not somespace[currentcontent[nofcurrentcontent]] then + if trace_export then + report_export("%s<!-- injecting spacing 8 (%s) -->",spaces[currentdepth],topoints(kern,true)) + end + nofcurrentcontent = nofcurrentcontent + 1 + currentcontent[nofcurrentcontent] = " " end - nofcurrentcontent = nofcurrentcontent + 1 - currentcontent[nofcurrentcontent] = " " - else + elseif a then + -- e.g LOGO<space>LOGO if trace_export then - report_export("%s<!-- injecting spacing 1 (end of line, end of element) -->",spaces[currentdepth]) + report_export("%s<!-- processing kern, threshold %s, tag %s => %s -->",spaces[currentdepth],topoints(limit,true),last,a) end last = a pushcontent() + if trace_export then + report_export("%s<!-- injecting spacing 9 (%s) -->",spaces[currentdepth],topoints(kern,true)) + end nofcurrentcontent = nofcurrentcontent + 1 currentcontent[nofcurrentcontent] = " " currentnesting = taglist[last] @@ -2094,10 +2117,6 @@ local function collectresults(head,list) -- is last used (we also have currentat end end end - elseif subtype == parfillskip_code then - -- deal with paragaph endings (crossings) elsewhere and we quit here - -- as we don't want the rightskip space addition - return end end p = n diff --git a/tex/context/base/back-exp.mkiv b/tex/context/base/back-exp.mkiv index 217e32513..f891224e4 100644 --- a/tex/context/base/back-exp.mkiv +++ b/tex/context/base/back-exp.mkiv @@ -28,7 +28,7 @@ \definesystemattribute[taggedpar][public] -\def\setelementexporttag +\unexpanded\def\setelementexporttag {\dotripleargument\dosetelementexporttag} \def\dosetelementexporttag @@ -38,8 +38,8 @@ \expandafter\expandafter\expandafter\dosetelementexporttagb \fi\fi} -\def\dosetelementexporttaga[#1][#2][#3]{\taggedctxcommand{settagproperty("#1","#2","#3")}} -\def\dosetelementexporttagb[#1][#2][#3]{\taggedctxcommand{settagproperty("#1","export","#2")}} +\unexpanded\def\dosetelementexporttaga[#1][#2][#3]{\taggedctxcommand{settagproperty("#1","#2","#3")}} +\unexpanded\def\dosetelementexporttagb[#1][#2][#3]{\taggedctxcommand{settagproperty("#1","export","#2")}} % todo: no need for calls when trialtypesetting @@ -67,50 +67,50 @@ \to \everytabulatepar % tricky, maybe this should be neverypar \appendtoks - \def\dotagTABLEcell {\taggedctxcommand{settagtablecell(\number\tablecellrows,\number\tablecellcolumns,\number\raggedstatus)}}% - \def\dotagTABLEsignal{\char\zerocount}% brrr, we need to tag empty cells (unless we start numbering) + \unexpanded\def\dotagTABLEcell {\taggedctxcommand{settagtablecell(\number\tablecellrows,\number\tablecellcolumns,\number\raggedstatus)}}% + \unexpanded\def\dotagTABLEsignal{\char\zerocount}% brrr, we need to tag empty cells (unless we start numbering) \to \everyenableelements \appendtoks - \def\dotagtabulatecell {\taggedctxcommand{settagtabulatecell(\number\tabulatealign)}}% - \def\dotagtabulatesignal{\dontleavehmode\char\zerocount\ignorespaces}% + \unexpanded\def\dotagtabulatecell {\taggedctxcommand{settagtabulatecell(\number\tabulatealign)}}% + \unexpanded\def\dotagtabulatesignal{\dontleavehmode\char\zerocount\ignorespaces}% \to \everyenableelements \appendtoks - \def\dotagsynonym{\taggedctxcommand{settagsynonym("\currentsynonym","\currentsynonymtag")}}% + \unexpanded\def\dotagsynonym{\taggedctxcommand{settagsynonym("\currentsynonym","\currentsynonymtag")}}% \to \everyenableelements \appendtoks % frozen and assumed global per highlight class - \def\dotaghighlight{\taggedctxcommand{settaghighlight("\currenthighlight","\highlightparameter\c!style",\number\attribute\colorattribute)}}% + \unexpanded\def\dotaghighlight{\taggedctxcommand{settaghighlight("\currenthighlight","\highlightparameter\c!style",\number\attribute\colorattribute)}}% \to \everyenableelements \appendtoks % we can have differently scaled images - \def\dotagfigure{\taggedctxcommand{settagfigure("\figurefileoriginal","\figurefilepage",\number\dimexpr\figurewidth,\number\dimexpr\figureheight)}}% + \unexpanded\def\dotagfigure{\taggedctxcommand{settagfigure("\figurefileoriginal","\figurefilepage",\number\dimexpr\figurewidth,\number\dimexpr\figureheight)}}% \to \everyenableelements \appendtoks %\def\dotagcombination{\taggedctxcommand{settagcombination(\combinationparameter\c!nx,\combinationparameter\c!ny)}}% - \def\dotagcombination{\taggedctxcommand{settagcombination(\number\horcombination,\number\totcombination)}}% + \unexpanded\def\dotagcombination{\taggedctxcommand{settagcombination(\number\horcombination,\number\totcombination)}}% \to \everyenableelements \appendtoks - \def\dotagsorting{\taggedctxcommand{settagsorting("\currentsorting","\currentsortingtag")}}% + \unexpanded\def\dotagsorting{\taggedctxcommand{settagsorting("\currentsorting","\currentsortingtag")}}% \to \everyenableelements \appendtoks - \def\dotagsetparcounter{\global\advance\tagparcounter\plusone\attribute\taggedparattribute\tagparcounter}% + \unexpanded\def\dotagsetparcounter{\global\advance\tagparcounter\plusone\attribute\taggedparattribute\tagparcounter}% \to \everyenableelements \appendtoks - \def\dotagsetitemgroup{\taggedctxcommand{settagitemgroup("\currentitemgroup",\ifconditional\packlistitem true\else false\fi,"\currentitemsymbol")}}% + \unexpanded\def\dotagsetitemgroup{\taggedctxcommand{settagitemgroup("\currentitemgroup",\ifconditional\packlistitem true\else false\fi,"\currentitemsymbol")}}% \to \everyenableelements \appendtoks - \def\dotagsetdescription{\taggedctxcommand{settagdescription("\currentdescription",\currentdescriptionnumberentry)}}% + \unexpanded\def\dotagsetdescription{\taggedctxcommand{settagdescription("\currentdescription",\currentdescriptionnumberentry)}}% \to \everyenableelements \appendtoks - \def\dotagsetnotesymbol{\taggedctxcommand{settagdescriptionsymbol("\currentnote",\currentnotenumber)}}% + \unexpanded\def\dotagsetnotesymbol{\taggedctxcommand{settagdescriptionsymbol("\currentnote",\currentnotenumber)}}% \to \everyenableelements \appendtoks diff --git a/tex/context/base/bibl-bib.mkiv b/tex/context/base/bibl-bib.mkiv index 760338f39..6144015ad 100644 --- a/tex/context/base/bibl-bib.mkiv +++ b/tex/context/base/bibl-bib.mkiv @@ -527,24 +527,29 @@ \edef\currentbibtexsession{#1}% \let\currentlist\currentbibtexsession \setuplist[\currentbibtexsession][\c!criterium=\v!previous,#2] - \doifelsenothing{\namedlistparameter\currentbibtexsession\c!title} - {\systemsuppliedchapter[\currentbibtexsession]{\headtext{\currentbibtexsession}}} - {\normalexpanded{\systemsuppliedchapter[\currentbibtexsession]{\namedlistparameter\currentbibtexsession\c!title}}}% - \dodoplacebibtexpublications} + \edef\currentbibtexsessiontitle{\namedlistparameter\currentbibtexsession\c!title}% + \ifx\currentbibtexsessiontitle\empty + \normalexpanded{\startnamedsection[\v!chapter][\c!reference=\currentbibtexsession,\c!title={\headtext{\currentbibtexsession}}]}% + \else + \normalexpanded{\startnamedsection[\v!chapter][\c!reference=\currentbibtexsession,\c!title={\currentbibtexsessiontitle}]}% + \fi + \dodoplacebibtexpublications + \stopnamedsection + \endgroup} \def\doplacebibtexpublications[#1][#2]% {\begingroup \edef\currentbibtexsession{#1}% \let\currentlist\currentbibtexsession \setuplist[\currentbibtexsession][\c!criterium=\v!previous,#2]% - \dodoplacebibtexpublications} + \dodoplacebibtexpublications + \endgroup} \def\dodoplacebibtexpublications {\determinelistcharacteristics[\currentbibtexsession]% \the\everysetupbibtexlistplacement \forgetall \typesetbibtexlist - \endgroup \global\advance\bibtexblock\plusone} \setvalue{\??pb:\c!numbering:\v!short}#1% todo var s -> short tag diff --git a/tex/context/base/bibl-tra.mkiv b/tex/context/base/bibl-tra.mkiv index c00847ae2..d3336ecf2 100644 --- a/tex/context/base/bibl-tra.mkiv +++ b/tex/context/base/bibl-tra.mkiv @@ -814,12 +814,16 @@ \def\docompletepublications[#1]% {\begingroup -% \setuplist[pubs][\c!criterium=\v!previous,#1] - \setuplist[pubs][#1] - \doifelsenothing{\publicationlistparameter\c!title} - {\systemsuppliedchapter[pubs]{\headtext{pubs}}} - {\normalexpanded{\systemsuppliedchapter[pubs]{\publicationlistparameter\c!title}}}% - \dodoplacepublications} + \setuplist[pubs][#1]% + \edef\currentbibtexsessiontitle{\publicationlistparameter\c!title}% + \ifx\currentbibtexsessiontitle\empty + \normalexpanded{\startnamedsection[\v!chapter][\c!reference=pubs,\c!title={\headtext{pubs}}]}% + \else + \normalexpanded{\startnamedsection[\v!chapter][\c!reference=pubs,\c!title={\currentbibtexsessiontitle}]}% + \fi + \dodoplacepublications + \stopnamedsection + \endgroup} %D And the portion with the entries only. @@ -830,9 +834,9 @@ \def\doplacepublications[#1]% {\begingroup -% \setuplist[pubs][\c!criterium=\v!previous,#1]% \setuplist[pubs][#1]% - \dodoplacepublications} + \dodoplacepublications + \endgroup} \def\dodoplacepublications {\determinelistcharacteristics[pubs]% @@ -842,7 +846,6 @@ \inpublisttrue \typesetpubslist \inpublistfalse - \endgroup \global\advance\bibtexblock\plusone} %D \subsubject{What's in a publication} diff --git a/tex/context/base/buff-ver.lua b/tex/context/base/buff-ver.lua index bf486045a..e35545605 100644 --- a/tex/context/base/buff-ver.lua +++ b/tex/context/base/buff-ver.lua @@ -340,8 +340,8 @@ local function hack(pattern) return Cs(pattern * Cc(signal)) end -local split_processor = structures.processors.split -local apply_processor = structures.processors.apply +local split_processor = typesetters.processors.split +local apply_processor = typesetters.processors.apply -- function visualizers.registerescapepattern(name,before,after,normalmethod,escapemethod,processor) -- local escapepattern = escapepatterns[name] diff --git a/tex/context/base/buff-ver.mkiv b/tex/context/base/buff-ver.mkiv index 7ceb90954..8b9c98a28 100644 --- a/tex/context/base/buff-ver.mkiv +++ b/tex/context/base/buff-ver.mkiv @@ -67,7 +67,7 @@ \def\firststageinitializetype {\let\obeylines\ignorelines \ignorehyphens % default - \dosettypeattributes\c!style\c!color + \usetypestyleandcolor\c!style\c!color \setcatcodetable\vrbcatcodes} \let\doverbatimsetlinemargin\relax @@ -98,7 +98,7 @@ \def\firststageinitializetyping {\switchtobodyfont[\typingparameter\c!bodyfont]% \docheckverbatimmargins - \dosettypingattributes\c!style\c!color + \usetypingstyleandcolor\c!style\c!color \doifsomething{\typingparameter\c!align}{\setupalign[\typingparameter\c!align]}% \ignorehyphens} % default @@ -383,7 +383,7 @@ \let\normaltextmat\mat \let\normaltextdis\dis -\def\astype{\groupedcommand{\dosettypeattributes\c!style\c!color}{}} +\def\astype{\groupedcommand{\usetypestyleandcolor\c!style\c!color}{}} %D The basic display verbatim commands are defined in an %D indirect way. As we will see, they are a specific case of a diff --git a/tex/context/base/char-act.mkiv b/tex/context/base/char-act.mkiv index f791ba9e2..472bf89ae 100644 --- a/tex/context/base/char-act.mkiv +++ b/tex/context/base/char-act.mkiv @@ -38,7 +38,7 @@ \def\obeyedspace {\ifprocessingverbatim\hbox{ }\else\space\fi} \def\obeyedtab {\obeyedspace} \def\obeyedline {\par} -\def\obeyedpage {\vfill\eject} +\def\obeyedpage {\page_otr_fill_and_eject_page} %D \macros %D {controlspace,setcontrolspaces} diff --git a/tex/context/base/char-def.lua b/tex/context/base/char-def.lua index ec9a7b134..7ca6f4f70 100644 --- a/tex/context/base/char-def.lua +++ b/tex/context/base/char-def.lua @@ -458,7 +458,7 @@ characters.data={ description="SOLIDUS", direction="cs", linebreak="sy", - mathclass="binary", + mathclass="ord", mathsymbol=0x2044, unicodeslot=0x002F, }, @@ -56864,7 +56864,7 @@ characters.data={ linebreak="is", mathspec={ { - class="binary", + class="ord", name="slash", }, { @@ -63198,8 +63198,16 @@ characters.data={ description="LEFT CEILING", direction="on", linebreak="al", - mathclass="open", - mathname="lceiling", + mathspec = { + { + class="open", + name="lceil", + }, + { + class="open", + name="lceiling", + } + }, mirror=0x2309, unicodeslot=0x2308, }, @@ -63208,8 +63216,16 @@ characters.data={ description="RIGHT CEILING", direction="on", linebreak="al", - mathclass="close", - mathname="rceiling", + mathspec = { + { + class="close", + name="rceil", + }, + { + class="close", + name="rceiling", + } + }, mirror=0x2308, unicodeslot=0x2309, }, diff --git a/tex/context/base/chem-str.lua b/tex/context/base/chem-str.lua index 02bfcf737..ac7176bf1 100644 --- a/tex/context/base/chem-str.lua +++ b/tex/context/base/chem-str.lua @@ -17,7 +17,7 @@ local report_chemistry = logs.reporter("chemistry") local format, gmatch, match, lower, gsub = string.format, string.gmatch, string.match, string.lower, string.gsub local concat, insert, remove = table.concat, table.insert, table.remove -local processor_tostring = structures.processors.tostring +local processor_tostring = typesetters.processors.tostring local lpegmatch = lpeg.match local settings_to_array = utilities.parsers.settings_to_array diff --git a/tex/context/base/chem-str.mkiv b/tex/context/base/chem-str.mkiv index 6b460b513..998ff942a 100644 --- a/tex/context/base/chem-str.mkiv +++ b/tex/context/base/chem-str.mkiv @@ -82,14 +82,14 @@ \def\dodefinechemicalsymbol[#1][#2]% {\setvalue{\??cm::#1}{#2}} -\def\chemicalsymbol[#1]% +\unexpanded\def\chemicalsymbol[#1]% {\getvalue{\??cm::#1}} % size (small medium big) -\def\dosetchemicaltext - {\dosetfontattribute \??cm\c!style - \dosetcolorattribute\??cm\c!color} +\unexpanded\def\dosetchemicaltext + {\dousestyleparameter\@cmstyle + \dousecolorparameter\@cmcolor} \edef\chemicaltoplocation{t} \edef\chemicalbotlocation{b} diff --git a/tex/context/base/colo-ini.mkiv b/tex/context/base/colo-ini.mkiv index 14db85e2d..411ff9fbb 100644 --- a/tex/context/base/colo-ini.mkiv +++ b/tex/context/base/colo-ini.mkiv @@ -151,8 +151,6 @@ \unexpanded\def\graycolor [#1]{\groupedcommand{\dosetcolormodel{gray}\doactivatecolor{#1}}{}} \unexpanded\def\colored [#1]{\groupedcommand{\definecolor[@colored@][#1]\doactivatecolor{@colored@}}{}} \unexpanded\def\fastcolored [#1]#2{\begingroup\dodefinefastcolor[@colored@][#1]\doactivatecolor{@colored@}#2\endgroup} -\unexpanded\def\predefinecolor [#1]{\flushatshipout{\hbox{\color[#1]{}}}} -\unexpanded\def\predefineindexcolor[#1]{\flushatshipout{\hbox{\color[#1]{}}}} % some of this will go away @@ -163,7 +161,6 @@ \unexpanded\def\raster [#1]{\groupedcommand{\dosetrastercolor{#1}}{}} \unexpanded\def\faststartcolor [#1]{\doactivatecolor{#1}} \unexpanded\def\faststopcolor {} -\unexpanded\def\dosetcolorattribute#1#2{\ifcsname#1#2\endcsname\doactivatecolor{\csname#1#2\endcsname}\fi} \def\getcolorattributevalue#1#2% color macro (obsolete again, we have a better method) {\begingroup @@ -765,18 +762,39 @@ \letvalueempty{(cs:-} \letvalueempty{(ts:-} -\def\doactivatecolor#1% : in currentpalet, maybe not, ugly (some day at the lua end) - {\def\currentcolorname{#1}% - \ifcsname(cs:\currentpalet#1)\endcsname - \csname(cs:\currentpalet#1)\endcsname - \csname(ts:\currentpalet#1)\endcsname - \else\ifcsname(cs:#1)\endcsname - \csname(cs:#1)\endcsname - \csname(ts:#1)\endcsname +\unexpanded\def\doactivatecolor#1% : in currentpalet, maybe not, ugly (some day at the lua end) + {\edef\currentcolorname{#1}% + \ifcsname(cs:\currentpalet\currentcolorname)\endcsname + \csname(cs:\currentpalet\currentcolorname)\endcsname + \csname(ts:\currentpalet\currentcolorname)\endcsname + \else\ifcsname(cs:\currentcolorname)\endcsname + \csname(cs:\currentcolorname)\endcsname + \csname(ts:\currentcolorname)\endcsname \fi\fi} \let\normaldoactivatecolor\doactivatecolor +% new: + +\let\dousecolorparameter\doactivatecolor + +\unexpanded\def\dousecolorhashparameter#1#2% + {\ifcsname#1#2\endcsname + \expandafter\dousecolorparameter\csname#1#2\endcsname + \fi} + +\unexpanded\def\dousecurrentcolorparameter + {\let\currentcolorname\currentcolorparameter % maybe only when success + \ifcsname(cs:\currentpalet\currentcolorparameter)\endcsname + \csname(cs:\currentpalet\currentcolorparameter)\endcsname + \csname(ts:\currentpalet\currentcolorparameter)\endcsname + \else\ifcsname(cs:\currentcolorparameter)\endcsname + \csname(cs:\currentcolorparameter)\endcsname + \csname(ts:\currentcolorparameter)\endcsname + \fi\fi} + +\let\dosetcolorattribute\dousecolorhashparameter % for a while + % if it becomes a bottleneck we can set up a more complex system with one shared % attribute for colorspace, color and transparency % diff --git a/tex/context/base/cont-fil.mkii b/tex/context/base/cont-fil.mkii index a6276a482..e05d8eac4 100644 --- a/tex/context/base/cont-fil.mkii +++ b/tex/context/base/cont-fil.mkii @@ -121,4 +121,7 @@ \definefilesynonym [mml] [mathml] \definefilesynonym [cml] [chemml] +\definefilesynonym [letter] [cor-01] +\definefilesynonym [memo] [cor-02] + \endinput diff --git a/tex/context/base/cont-fil.mkiv b/tex/context/base/cont-fil.mkiv index b6d716237..02288a701 100644 --- a/tex/context/base/cont-fil.mkiv +++ b/tex/context/base/cont-fil.mkiv @@ -93,4 +93,7 @@ \definefilesynonym [mml] [mathml] \definefilesynonym [cml] [chemml] +\definefilesynonym [letter] [cor-01] +\definefilesynonym [memo] [cor-02] + \endinput diff --git a/tex/context/base/cont-new.mkii b/tex/context/base/cont-new.mkii index 6124778a6..a6a4c706b 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.11.29 23:11} +\newcontextversion{2011.12.13 15:17} %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 f141e451f..cd8855bd9 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.11.29 23:11} +\newcontextversion{2011.12.13 15:17} %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 3a029c70b..4663b5c72 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 84c8ee74e..6d51beecd 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 caae9f255..7467753ba 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.11.29 23:11} +\edef\contextversion{2011.12.13 15:17} %D For those who want to use this: diff --git a/tex/context/base/context.mkiv b/tex/context/base/context.mkiv index 0cb59b556..a4b567738 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.11.29 23:11} +\edef\contextversion{2011.12.13 15:17} %D For those who want to use this: @@ -203,12 +203,13 @@ \loadmarkfile{lxml-ini} \loadmarkfile{lxml-sor} +\loadmkvifile{typo-prc} + \loadmarkfile{strc-ini} \loadmarkfile{strc-tag} \loadmarkfile{strc-doc} \loadmarkfile{strc-num} \loadmarkfile{strc-mar} -\loadmarkfile{strc-prc} \loadmarkfile{strc-sbe} \loadmarkfile{strc-lst} \loadmarkfile{strc-sec} @@ -236,19 +237,26 @@ \loadmarkfile{pack-obj} -\loadmarkfile{strc-itm} +\loadmkvifile{strc-itm} \loadmarkfile{strc-des} \loadmarkfile{strc-syn} \loadmarkfile{core-sys} +\loadmarkfile{page-var} \loadmarkfile{page-ini} +\loadmarkfile{page-fac} +\loadmarkfile{page-brk} +\loadmarkfile{page-col} +\loadmarkfile{page-inf} +\loadmarkfile{page-grd} \loadmarkfile{page-flt} \loadmarkfile{page-bck} \loadmarkfile{page-not} \loadmarkfile{page-one} \loadmarkfile{page-lay} -\loadmarkfile{page-txt} +\loadmkvifile{page-box} +\loadmkvifile{page-txt} \loadmarkfile{page-sid} \loadmkvifile{strc-flt} diff --git a/tex/context/base/core-def.mkiv b/tex/context/base/core-def.mkiv index 9022044d7..3a07980cc 100644 --- a/tex/context/base/core-def.mkiv +++ b/tex/context/base/core-def.mkiv @@ -43,7 +43,8 @@ \appendtoks \initializemainlanguage \to \everyjob %appendtoks \MPLIBregister \to \everyjob \appendtoks \xmlinitialize \to \everyjob -\appendtoks \newbackgroundfalse \to \everyjob % global +\appendtoks \setfalse\c_page_backgrounds_new \to \everyjob +\appendtoks \setfalse\c_page_backgrounds_some \to \everyjob \appendtoks \initializepagecounters \to \everyjob \appendtoks \directsetup{*runtime:options} \to \everyjob % we could erase them afterwards % order can change \appendtoks \directsetup{*runtime:modules} \to \everyjob % we could erase them afterwards % order can change diff --git a/tex/context/base/core-mis.mkiv b/tex/context/base/core-mis.mkiv index 34222a39e..93f3d2061 100644 --- a/tex/context/base/core-mis.mkiv +++ b/tex/context/base/core-mis.mkiv @@ -321,7 +321,9 @@ {\!!widtha\alhsize \divide\!!widtha \alnsize} {\!!widtha\paragraphcellmeter\alcounter\c!width}% - \dostartattributes{\??al\currentparagraph\number\alcounter}\c!style\c!color\empty + \begingroup + \dousestylehashparameter{\??al\currentparagraph\number\alcounter}\c!style + \dousecolorhashparameter{\??al\currentparagraph\number\alcounter}\c!color \doifelse{\paragraphcellmeter\alcounter\c!height}\v!fit {\setbox\scratchbox\vtop} {\setbox\scratchbox\vtop to \paragraphcellmeter\alcounter\c!height}% @@ -361,7 +363,7 @@ \wd\scratchbox\!!widtha \fi \box\scratchbox - \dostopattributes + \endgroup \ifnum\alcounter<\paragraphparameter\c!n\relax \@EA\doparagraphcell \else @@ -837,7 +839,9 @@ \pushmacro\checkindentation \doifsomething{\delimitedtextparameter\c!indenting} % WS {\setupindenting[\delimitedtextparameter\c!indenting]}% - \dostartattributes{\??ci\currentdelimitedtext}\c!style\c!color\empty + \begingroup + \dousestylehashparameter{\??ci\currentdelimitedtext}\c!style + \dousecolorhashparameter{\??ci\currentdelimitedtext}\c!color \leftdelimitedtextmark \ignorespaces} @@ -845,7 +849,7 @@ {\removeunwantedspaces \removelastskip \rightdelimitedtextmark - \dostopattributes + \begingroup \popmacro\checkindentation \dodostopdelimitedtextpar \delimitedtextparameter\c!after @@ -856,14 +860,16 @@ \def\dostartdelimitedtexttxt {\let\dostopdelimitedtext\dostopdelimitedtexttxt - \dostartattributes{\??ci\currentdelimitedtext}\c!style\c!color\empty + \begingroup + \dousestylehashparameter{\??ci\currentdelimitedtext}\c!style + \dousecolorhashparameter{\??ci\currentdelimitedtext}\c!color \dohandleleftdelimitedtext\c!left \ignorespaces} \def\dostopdelimitedtexttxt {\removeunwantedspaces \dohandlerightdelimitedtext\c!right - \dostopattributes} + \endgroup} \unexpanded\def\stopdelimitedtext {\dostopdelimitedtext @@ -1025,9 +1031,9 @@ \def\doattributeddelimited {\groupedcommand {\dostarttagged\t!delimited\currentdelimitedtext - \dostartattributes{\??ci\currentdelimitedtext}\c!style\c!color} - {\dostopattributes - \dostoptagged + \dousestylehashparameter{\??ci\currentdelimitedtext}\c!style + \dousecolorhashparameter{\??ci\currentdelimitedtext}\c!color} + {\dostoptagged \popdelimitedtext}} \def\dofontdrivendelimited @@ -1661,11 +1667,14 @@ \definepairedbox[\v!legend] -%D Goody: +%D Goody (to be reconsidered): + +\newsystemmode{combination} +\newsystemmode{pairedbox} \appendtoks - \global\resetsystemmode{combination}% - \global\resetsystemmode{pairedbox}% + \global\resetsystemmode{combination}% + \global\resetsystemmode{pairedbox}% \to \everyinsidefloat % todo: \startcombination \startcomb \stopcomb ... @@ -1779,10 +1788,10 @@ {\ifx\nexttoken\egroup \else % the next box is empty \hsize\wd0 \setupalign[\combinationparameter\c!align]% - \dostartattributes{\??co\currentcombination}\c!style\c!color\empty + \dousestylehashparameter{\??co\currentcombination}\c!style + \dousecolorhashparameter{\??co\currentcombination}\c!color \bgroup \aftergroup\endstrut - \aftergroup\dostopattributes \aftergroup\egroup \begstrut \fi}% diff --git a/tex/context/base/core-sys.mkiv b/tex/context/base/core-sys.mkiv index 247aa3b52..bfacd3c48 100644 --- a/tex/context/base/core-sys.mkiv +++ b/tex/context/base/core-sys.mkiv @@ -202,7 +202,7 @@ \def\currentstartstop{#1}% \startstopparameter\c!commands \dostarttagged\t!construct\currentstartstop - \dosetstartstopattributes\c!style\c!color} + \usestartstopstyleandcolor\c!style\c!color} \unexpanded\def\dostartstop_stop#1% {\dostoptagged @@ -214,7 +214,7 @@ {\def\currentstartstop{#1}% \startstopparameter\c!commands % will become setups \dostarttagged\t!construct\currentstartstop - \dosetstartstopattributes\c!style\c!color} + \usestartstopstyleandcolor\c!style\c!color} {\def\currentstartstop{#1}% \dostoptagged \startstopparameter\c!inbetween}} @@ -231,7 +231,7 @@ {\dontleavehmode\groupedcommand % otherwise wrong par number in tags {\def\currenthighlight{#1}% \dostarttagged\t!highlight\currenthighlight - \dosethighlightattributes\c!style\c!color + \usehighlightstyleandcolor\c!style\c!color \dotaghighlight} {\dostoptagged}} diff --git a/tex/context/base/core-var.mkiv b/tex/context/base/core-var.mkiv index bcad4abba..0d9e3ee1c 100644 --- a/tex/context/base/core-var.mkiv +++ b/tex/context/base/core-var.mkiv @@ -235,19 +235,8 @@ %D Add-ons: -\let\setlayoutcomponentattribute \gobbletwoarguments +\let\setlayoutcomponentattribute \gobbleoneargument \let\resetlayoutcomponentattribute\relax \let\layoutcomponentboxattribute \empty - -%D Concepts: - -\newconstant\conceptmode - -\def\doifconcepttracing - {\ifnum\conceptmode>\plustwo - \expandafter\firstofoneargument - \else - \expandafter\gobbleoneargument - \fi} \protect \endinput diff --git a/tex/context/base/file-job.mkvi b/tex/context/base/file-job.mkvi index 7f2c5b2fa..43179e156 100644 --- a/tex/context/base/file-job.mkvi +++ b/tex/context/base/file-job.mkvi @@ -172,12 +172,12 @@ \def\processedfile {\ctxcommand{processedfile()}} \def\processedfiles {\ctxcommand{processedfiles()}} -\unexpanded\def\loadtexfile [#name]{\cxtcommand{usetexfile("#name")}} +\unexpanded\def\loadtexfile [#name]{\ctxcommand{usetexfile("#name")}} \unexpanded\def\loadluafile [#name]{\ctxcommand{useluafile("#name")}} \unexpanded\def\loadcldfile [#name]{\ctxcommand{usecldfile("#name")}} \unexpanded\def\loadanyfile [#name]{\ctxcommand{useanyfile("#name")}} -\unexpanded\def\loadtexfileonce [#name]{\cxtcommand{usetexfile("#name",true)}} +\unexpanded\def\loadtexfileonce [#name]{\ctxcommand{usetexfile("#name",true)}} \unexpanded\def\loadluafileonce [#name]{\ctxcommand{useluafile("#name",true)}} \unexpanded\def\loadcldfileonce [#name]{\ctxcommand{usecldfile("#name",true)}} \unexpanded\def\loadanyfileonce [#name]{\ctxcommand{useanyfile("#name",true)}} diff --git a/tex/context/base/font-ctx.lua b/tex/context/base/font-ctx.lua index f58893c7d..6a7e0f5d3 100644 --- a/tex/context/base/font-ctx.lua +++ b/tex/context/base/font-ctx.lua @@ -112,10 +112,13 @@ commands.resetnullfont = definers.resetnullfont setmetatableindex(fontdata, function(t,k) return nulldata end) +-- we might make an font-hsh.lua + local chardata = allocate() -- chardata local descriptions = allocate() local parameters = allocate() local properties = allocate() +local resources = allocate() local quaddata = allocate() local markdata = allocate() local xheightdata = allocate() @@ -126,6 +129,7 @@ hashes.characters = chardata hashes.descriptions = descriptions hashes.parameters = parameters hashes.properties = properties +hashes.resources = resources hashes.quads = quaddata hashes.marks = markdata hashes.xheights = xheightdata @@ -156,6 +160,14 @@ setmetatableindex(properties, function(t,k) return properties end) +setmetatableindex(resources, function(t,k) + local shared = fontdata[k].shared + local rawdata = shared and shared.rawdata + local resources = rawdata and rawdata.resources + t[k] = resources or false -- better than resolving each time + return resources +end) + setmetatableindex(quaddata, function(t,k) local parameters = parameters[k] local quad = parameters and parameters.quad or 0 @@ -207,68 +219,138 @@ local privatefeatures = { anum = true, } -local function modechecker(tfmdata,features,mode) -- we cannot adapt features as they are shared! - if trace_features then - report_features(serialize(features,"used")) - end - local rawdata = tfmdata.shared.rawdata - local resources = rawdata and rawdata.resources - local script = features.script - if script == "auto" then - local latn = false - for g, list in next, resources.features do - for f, scripts in next, list do - if privatefeatures[f] then - -- skip - elseif scripts.dflt then - script = "dflt" - break - elseif scripts.latn then - latn = true - end +-- local function modechecker(tfmdata,features,mode) -- we cannot adapt features as they are shared! +-- if trace_features then +-- report_features(serialize(features,"used")) +-- end +-- local rawdata = tfmdata.shared.rawdata +-- local resources = rawdata and rawdata.resources +-- local script = features.script +-- if script == "auto" then +-- local latn = false +-- for g, list in next, resources.features do +-- for f, scripts in next, list do +-- if privatefeatures[f] then +-- -- skip +-- elseif scripts.dflt then +-- script = "dflt" +-- break +-- elseif scripts.latn then +-- latn = true +-- end +-- end +-- end +-- if script == "auto" then +-- script = latn and "latn" or "dflt" +-- end +-- features.script = script +-- if trace_automode then +-- report_defining("auto script mode: using script '%s' in font '%s'",script,file.basename(tfmdata.properties.name)) +-- end +-- end +-- if mode == "auto" then +-- local sequences = resources.sequences +-- if sequences and #sequences > 0 then +-- local script = features.script or "dflt" +-- local language = features.language or "dflt" +-- for feature, value in next, features do +-- if value then +-- local found = false +-- for i=1,#sequences do +-- local sequence = sequences[i] +-- local features = sequence.features +-- if features then +-- local scripts = features[feature] +-- if scripts then +-- local languages = scripts[script] +-- if languages and languages[language] then +-- if found then +-- -- more than one lookup +-- if trace_automode then +-- report_defining("forcing node mode in font %s for feature %s, script %s, language %s (multiple lookups)",file.basename(tfmdata.properties.name),feature,script,language) +-- end +-- features.mode = "node" +-- return "node" +-- elseif needsnodemode[sequence.type] then +-- if trace_automode then +-- report_defining("forcing node mode in font %s for feature %s, script %s, language %s (no base support)",file.basename(tfmdata.properties.name),feature,script,language) +-- end +-- features.mode = "node" +-- return "node" +-- else +-- -- at least one lookup +-- found = true +-- end +-- end +-- end +-- end +-- end +-- end +-- end +-- end +-- return "base" +-- else +-- return mode +-- end +-- end + +local function checkedscript(tfmdata,resources,features) + local latn = false + local script = false + for g, list in next, resources.features do + for f, scripts in next, list do + if privatefeatures[f] then + -- skip + elseif scripts.dflt then + script = "dflt" + break + elseif scripts.latn then + latn = true end end - if script == "auto" then - script = latn and "latn" or "dflt" - end - features.script = script - if trace_automode then - report_defining("auto script mode: using script '%s' in font '%s'",script,file.basename(tfmdata.properties.name)) - end end - if mode == "auto" then - local sequences = resources.sequences - if sequences and #sequences > 0 then - local script = features.script or "dflt" - local language = features.language or "dflt" - for feature, value in next, features do - if value then - local found = false - for i=1,#sequences do - local sequence = sequences[i] - local features = sequence.features - if features then - local scripts = features[feature] - if scripts then - local languages = scripts[script] - if languages and languages[language] then - if found then - -- more than one lookup - if trace_automode then - report_defining("forcing node mode in font %s for feature %s, script %s, language %s (multiple lookups)",file.basename(tfmdata.properties.name),feature,script,language) - end - features.mode = "node" - return "node" - elseif needsnodemode[sequence.type] then - if trace_automode then - report_defining("forcing node mode in font %s for feature %s, script %s, language %s (no base support)",file.basename(tfmdata.properties.name),feature,script,language) - end - features.mode = "node" - return "node" - else - -- at least one lookup - found = true + if not script then + script = latn and "latn" or "dflt" + end + if trace_automode then + report_defining("auto script mode: using script '%s' in font '%s'",script,file.basename(tfmdata.properties.name)) + end + features.script = script + return script +end + +local function checkedmode(tfmdata,resources,features) + local sequences = resources.sequences + if sequences and #sequences > 0 then + local script = features.script or "dflt" + local language = features.language or "dflt" + for feature, value in next, features do + if value then + local found = false + for i=1,#sequences do + local sequence = sequences[i] + local features = sequence.features + if features then + local scripts = features[feature] + if scripts then + local languages = scripts[script] + if languages and languages[language] then + if found then + -- more than one lookup + if trace_automode then + report_defining("forcing node mode in font %s for feature %s, script %s, language %s (multiple lookups)",file.basename(tfmdata.properties.name),feature,script,language) + end + features.mode = "node" + return "node" + elseif needsnodemode[sequence.type] then + if trace_automode then + report_defining("forcing node mode in font %s for feature %s, script %s, language %s (no base support)",file.basename(tfmdata.properties.name),feature,script,language) end + features.mode = "node" + return "node" + else + -- at least one lookup + found = true end end end @@ -276,10 +358,32 @@ local function modechecker(tfmdata,features,mode) -- we cannot adapt features as end end end - return "base" + end + features.mode = "base" -- new, or is this wrong? + return "base" +end + +definers.checkedscript = checkedscript +definers.checkedmode = checkedmode + +local function modechecker(tfmdata,features,mode) -- we cannot adapt features as they are shared! + if trace_features then + report_features(serialize(features,"used")) + end + local rawdata = tfmdata.shared.rawdata + local resources = rawdata and rawdata.resources + local script = features.script + if resources then + if script == "auto" then + script = checkedscript(tfmdata,resources,features) + end + if mode == "auto" then + mode = checkedmode(tfmdata,resources,features) + end else - return mode + report_features("missing resources for font''%s'",file.basename(tfmdata.properties.name)) end + return mode end registerotffeature { diff --git a/tex/context/base/font-ini.mkiv b/tex/context/base/font-ini.mkiv index 57fd53854..9ccad32d3 100644 --- a/tex/context/base/font-ini.mkiv +++ b/tex/context/base/font-ini.mkiv @@ -3510,7 +3510,7 @@ \unexpanded\def\definealternativestyle {\dotripleempty\dodefinealternativestyle} -\unexpanded\def\definestyle{\definealternativestyle} % later redefined +\let\definestyle\definealternativestyle % later redefined %D Maybe too geneneric, but probably ok is the following. (Maybe one %D day we will use a dedicated grouped command for styles.) @@ -3565,58 +3565,15 @@ %D \type{\noconvertfont}. In nested calls, we can restore the %D conversion by saying \type{\redoconvertfont}. -% subtle ... \expandafter is needed else problems with lookahead caps -% -% this will be cleaned up -% -% beware: p!defined can contain crap like \edef crap {...} and such -% so we need to pass #1 as well .. no longer needed in luatex - -% \def\@@dodoconvertfont{\csname\@letter@ \p!defined\expandafter\endcsname\gobbleoneargument} -% \def\@@donoconvertfont{\csname\@noletter@\p!defined\endcsname} -% \def\@@redoconvertfont{\csname \p!defined\expandafter\endcsname\gobbleoneargument} -% -% \unexpanded\def\dodoconvertfont#1% #2% we need the protection -% {\edef\p!defined{#1}% -% \ifx\p!defined\empty\else -% \@EA\dododoconvertfont -% \fi{#1}} -% -% \def\dododoconvertfont % #1 (detokenize no longer needed in luatex) -% {\ifcsname\@letter@\detokenize\@EA{\p!defined}\endcsname -% \expandafter\@@dodoconvertfont -% \else\ifcsname\detokenize\@EA{\p!defined}\endcsname -% \doubleexpandafter\@@redoconvertfont -% \else -% \doubleexpandafter\firstofoneargument -% \fi\fi} % {#1} -% -% \let\doconvertfont\dodoconvertfont -% -% \unexpanded\def\noconvertfont#1% #2% -% {\edef\p!defined{#1}% -% \ifx\p!defined\empty -% \else -% \@EA\nononoconvertfont -% \fi} -% -% \def\nononoconvertfont -% {\ifcsname\@noletter@\detokenize\@EA{\p!defined}\endcsname -% \@EA\@@donoconvertfont -% \fi} -% -% %D Extras: -% -% \unexpanded\def\dontconvertfont{\let\doconvertfont\noconvertfont} -% \unexpanded\def\redoconvertfont{\let\doconvertfont\dodoconvertfont} - %D These commands are not grouped! Grouping is most probably %D done by the calling macro's and would lead to unnecessary %D overhead. \unexpanded\def\doconvertfont#1% #2% we need the protection {\edef\currentconvertfont{#1}% - \ifx\currentconvertfont\empty \else + \ifx\currentconvertfont\empty + %\expandafter\firstofoneargument + \else \expandafter\dodoconvertfont \fi} @@ -3635,6 +3592,32 @@ \unexpanded\def\dontconvertfont{\currentalternativestyleindex\plustwo} \unexpanded\def\redoconvertfont{\currentalternativestyleindex\plusone} +%D The new one: + +\unexpanded\def\dousestyleparameter#1% + {\edef\currentstyleparameter{#1}% + \ifx\currentstyleparameter\empty\else + \expandafter\dousecurrentstyleparameter + \fi} + +\unexpanded\def\dousestylehashparameter#1#2% + {\ifcsname#1#2\endcsname + \expandafter\dousestyleparameter\csname#1#2\endcsname + \fi} + +\unexpanded\def\dousecurrentstyleparameter % empty check outside here + {\edef\detokenizedstyleparameter{\detokenize\expandafter{\currentstyleparameter}}% + \settrue\fontattributeisset % reset is done elsewhere + \ifcsname\??ft:as:\detokenizedstyleparameter\endcsname + \csname\??ft:as:\detokenizedstyleparameter\endcsname + \else\ifcsname\detokenizedstyleparameter\endcsname + \csname\detokenizedstyleparameter\endcsname + \else + \currentstyleparameter + \fi\fi} + +\let\dosetfontattribute\dousestylehashparameter % for a while + %D \macros %D {em,emphasistypeface,emphasisboldface} %D @@ -4447,84 +4430,80 @@ \def\removemissingcharacters{\ctxcommand{removemissingcharacters}} %D New commands (not yet interfaced): - -% \def\style[#1]% for inline usage, like \color -% {\groupedcommand{\ifcsname#1\endcsname\csname#1\endcsname\else\definedfont[#1]\fi}{}} -% -% \unexpanded\def\startstyle[#1]% -% {\begingroup -% \ifcsname#1\endcsname\csname#1\endcsname\else\definedfont[#1]\fi} -% -% \unexpanded\def\stopstyle -% {\endgroup} +%D +%D \startbuffer +%D \definestyle[one][style=bold,color=darkblue] +%D +%D test \one{test} test +%D test \style[one]{test} test +%D test \style[color=red]{test} test +%D test \style[Serif at 20pt]{test} test +%D \stopbuffer +%D +%D \typebuffer \startlines \getbuffer \stoplines % definitions .. no tagging here -\def\definestyle - {\dotripleargument\dodefinestyle} - -\def\dodefinestyle[#1][#2][#3]% - {\doifassignmentelse{#2}\dododefinestyle\definealternativestyle[#1][#2][#3]} +\installcommandhandler \??cf {style} \??cf -\def\dododefinestyle[#1][#2][#3]% no commalist and for the moment #3 is ignored - {\getparameters[\??cf:#1][\c!style=,\c!color=,#2]% - \setuvalue{\e!start#1}{\begingroup\dostartattributes{\??cf:#1}\c!style\c!color}% - \setuvalue{\e!stop #1}{\dostopattributes\endgroup}% - \setuvalue {#1}{\groupedcommand{\dostartattributes{\??cf:#1}\c!style\c!color}\dostopattributes}} +\appendtoks + \letvalue{\??cf\currentstyle\s!check}\relax + \setuevalue{\e!start\currentstyle}{\begingroup\use_defined_style{\currentstyle}}% + \setuevalue{\e!stop \currentstyle}{\endgroup}% + \setuevalue {\currentstyle}{\groupedcommand{\use_defined_style{\currentstyle}}{}}% +\to \everydefinestyle -\def\setupstyle - {\dotripleargument\dosetupstyle} +\unexpanded\def\use_defined_style#1% + {\edef\currentstyle{#1}% + \usestylestyleandcolor\c!style\c!color} -\def\dosetupstyle[#1][#2][#3]% no commalist and for the moment #3 is ignored - {\ifcsname\??cf:#1\c!style\endcsname - \getparameters[\??cf:#1][#2]% - \else - \getparameters[\??cf:#1][\c!style=,\c!color=,#2]% so we define but without commands (todo for all define related things) - \fi} +\unexpanded\def\use_generic_style#1% + {\getparameters[\??cf][\c!style=,\c!color=,#1]% + \dousestyleparameter\@@cfstyle + \dousecolorparameter\@@cfcolor} % commands \unexpanded\def\style[#1]% - {\csname\ifcsname#1\endcsname n\else\ifcsname\??cf:#1\c!style\endcsname c\else d\fi\fi ostyle\endcsname{#1}} - -\def\nostyle#1{\csname#1\endcsname} -\def\costyle#1{\groupedcommand{\dostartattributes{\??cf:#1}\c!style\c!color}\dostopattributes} -\def\dostyle#1{\doifassignmentelse{#1}\dostyleassignment\dostyledirect{#1}} - -\def\dostyleassignment#1% - {\groupedcommand - {\getparameters[\??cf][\c!style=,\c!color=,#1]% - \dostartattributes\??cf\c!style\c!color} - {\dostopattributes}} + {\csname style_% + \ifcsname#1\endcsname + nop% + \else\ifcsname\??cf#1\s!check\endcsname + use% + \else + yes% + \fi\fi + \endcsname{#1}} -\def\dostyledirect#1% - {\groupedcommand - {\definedfont[#1]} - {}} +\def\style_nop #1{\csname#1\endcsname} +\def\style_use #1{\groupedcommand{\use_defined_style{#1}}{}} +\def\style_yes #1{\doifassignmentelse{#1}\style_assignment\style_direct{#1}} +\def\style_assignment#1{\groupedcommand{\use_generic_style{#1}}{}} +\def\style_direct #1{\groupedcommand{\definedfont[#1]}{}} % environments \unexpanded\def\startstyle[#1]% {\begingroup - \csname\ifcsname#1\endcsname n\else\ifcsname\??cf:#1\c!style\endcsname c\else d\fi\fi ostyless\endcsname{#1}} + \csname start_style_% + \ifcsname#1\endcsname + nop% + \else\ifcsname\??cf#1\s!check\endcsname + use% + \else + yes% + \fi\fi + \endcsname{#1}} \unexpanded\def\stopstyle - {\dostopstyle - \endgroup + {\endgroup \autoinsertnextspace} % will be configurable, maybe also in \definestartstop -\def\nostyless#1{\let\dostopstyle\donothing\csname#1\endcsname} -\def\costyless#1{\let\dostopstyle\dostopattributes\dostartattributes{\??cf:#1}\c!style\c!color} -\def\dostyless#1{\doifassignmentelse{#1}\dostylessassignment\dostylessdirect{#1}} - -\def\dostylessassignment#1% - {\let\dostopstyle\dostopattributes - \getparameters[\??cf][\c!style,\c!color=,#1]% - \dostartattributes\??cf\c!style\c!color} - -\def\dostylessdirect#1% - {\let\dostopstyle\donothing - \definedfont[#1]\relax} +\def\start_style_nop #1{\csname#1\endcsname} +\def\start_style_use #1{\use_defined_style{#1}} +\def\start_style_yes #1{\doifassignmentelse{#1}\start_style_assignment\start_style_direct{#1}} +\def\start_style_assignment#1{\usegenericstyle{#1}} +\def\start_style_direct #1{\definedfont[#1]\relax} %D Still experimental (might even go away). diff --git a/tex/context/base/font-otd.lua b/tex/context/base/font-otd.lua index 501eff41b..ebd487959 100644 --- a/tex/context/base/font-otd.lua +++ b/tex/context/base/font-otd.lua @@ -17,11 +17,14 @@ local report_process = logs.reporter("fonts","otf process") local fonts = fonts local otf = fonts.handlers.otf -local fontdata = fonts.hashes.identifiers +local hashes = fonts.hashes local definers = fonts.definers local constructors = fonts.constructors local specifiers = fonts.specifiers +local fontdata = hashes.identifiers +----- fontresources = hashes.resources -- not yet defined + local contextsetups = specifiers.contextsetups local contextnumbers = specifiers.contextnumbers local contextmerged = specifiers.contextmerged @@ -32,7 +35,7 @@ local otffeatures = fonts.constructors.newfeatures("otf") local registerotffeature = otffeatures.register local fontdynamics = { } -fonts.hashes.dynamics = fontdynamics +hashes.dynamics = fontdynamics local a_to_script = { } local a_to_language = { } @@ -49,6 +52,10 @@ function otf.setdynamics(font,attribute) local dynamics = fontdynamics[font] local script = features.script or 'dflt' local language = features.language or 'dflt' + if script == "auto" then + -- checkedscript and resources are defined later so we cannot shortcut them + script = definers.checkedscript(fontdata[font],hashes.resources[font],features) + end local ds = dynamics[script] -- can be metatable magic (less testing) if not ds then ds = { } diff --git a/tex/context/base/font-otf.lua b/tex/context/base/font-otf.lua index 924e9a69c..03376f94b 100644 --- a/tex/context/base/font-otf.lua +++ b/tex/context/base/font-otf.lua @@ -1002,6 +1002,20 @@ local g_directions = { gpos_reversecontextchain = -1, } +-- Research by Khaled Hosny has demonstrated that the font loader merges +-- regular and AAT features and that these can interfere (especially because +-- we dropped checking for valid features elsewhere. So, we just check for +-- the special flag and drop the feature if such a tag is found. + +local function supported(features) + for i=1,#features do + if features[i].ismac then + return false + end + end + return true +end + actions["reorganize subtables"] = function(data,filename,raw) local resources = data.resources local sequences = { } @@ -1014,69 +1028,72 @@ actions["reorganize subtables"] = function(data,filename,raw) if dw then for k=1,#dw do local gk = dw[k] - local typ = gk.type - local chain = g_directions[typ] or 0 - local subtables = gk.subtables - if subtables then - local t = { } - for s=1,#subtables do - t[s] = subtables[s].name + local features = gk.features + if features and supported(features) then + local typ = gk.type + local chain = g_directions[typ] or 0 + local subtables = gk.subtables + if subtables then + local t = { } + for s=1,#subtables do + t[s] = subtables[s].name + end + subtables = t end - subtables = t - end - local flags, markclass = gk.flags, nil - if flags then - local t = { -- forcing false packs nicer - (flags.ignorecombiningmarks and "mark") or false, - (flags.ignoreligatures and "ligature") or false, - (flags.ignorebaseglyphs and "base") or false, - flags.r2l or false, - } - markclass = flags.mark_class - if markclass then - markclass = resources.markclasses[markclass] + local flags, markclass = gk.flags, nil + if flags then + local t = { -- forcing false packs nicer + (flags.ignorecombiningmarks and "mark") or false, + (flags.ignoreligatures and "ligature") or false, + (flags.ignorebaseglyphs and "base") or false, + flags.r2l or false, + } + markclass = flags.mark_class + if markclass then + markclass = resources.markclasses[markclass] + end + flags = t end - flags = t - end - -- - local name = gk.name - -- - local features = gk.features - if features then - -- scripts, tag, ismac - local f = { } - for i=1,#features do - local df = features[i] - local tag = strip(lower(df.tag)) - local ft = f[tag] if not ft then ft = {} f[tag] = ft end - local dscripts = df.scripts - for i=1,#dscripts do - local d = dscripts[i] - local languages = d.langs - local script = strip(lower(d.script)) - local fts = ft[script] if not fts then fts = {} ft[script] = fts end - for i=1,#languages do - fts[strip(lower(languages[i]))] = true + -- + local name = gk.name + -- + local features = gk.features + if features then + -- scripts, tag, ismac + local f = { } + for i=1,#features do + local df = features[i] + local tag = strip(lower(df.tag)) + local ft = f[tag] if not ft then ft = {} f[tag] = ft end + local dscripts = df.scripts + for i=1,#dscripts do + local d = dscripts[i] + local languages = d.langs + local script = strip(lower(d.script)) + local fts = ft[script] if not fts then fts = {} ft[script] = fts end + for i=1,#languages do + fts[strip(lower(languages[i]))] = true + end end end + sequences[#sequences+1] = { + type = typ, + chain = chain, + flags = flags, + name = name, + subtables = subtables, + markclass = markclass, + features = f, + } + else + lookups[name] = { + type = typ, + chain = chain, + flags = flags, + subtables = subtables, + markclass = markclass, + } end - sequences[#sequences+1] = { - type = typ, - chain = chain, - flags = flags, - name = name, - subtables = subtables, - markclass = markclass, - features = f, - } - else - lookups[name] = { - type = typ, - chain = chain, - flags = flags, - subtables = subtables, - markclass = markclass, - } end end end diff --git a/tex/context/base/grph-fil.lua b/tex/context/base/grph-fil.lua index 0856f5b08..da7441288 100644 --- a/tex/context/base/grph-fil.lua +++ b/tex/context/base/grph-fil.lua @@ -12,6 +12,8 @@ local trace_run = false trackers.register("graphic.runfile",function(v) trace_r local report_run = logs.reporter("graphics","run") +-- this code will move + local allocate = utilities.storage.allocate local collected = allocate() @@ -33,17 +35,20 @@ job.register('job.files.collected', tobesaved, initializer) jobfiles.forcerun = false -function jobfiles.run(name,command) +function jobfiles.run(name,action) local oldchecksum = collected[name] local newchecksum = file.checksum(name) if jobfiles.forcerun or not oldchecksum or oldchecksum ~= newchecksum then if trace_run then report_run("processing file, changes in '%s', processing forced",name) end - if command and command ~= "" then - os.execute(command) + local a = type(action) + if a == "function" then + a(name) + elseif a == "string" and action ~= "" then + os.execute(a) else - report_run("processing file, no command given for processing '%s'",name) + report_run("processing file, no action given for processing '%s'",name) end elseif trace_run then report_run("processing file, no changes in '%s', not processed",name) @@ -51,6 +56,8 @@ function jobfiles.run(name,command) tobesaved[name] = newchecksum end +-- + function jobfiles.context(name,options) if type(name) == "table" then local result = { } diff --git a/tex/context/base/l-file.lua b/tex/context/base/l-file.lua index bf05e2c64..48f6a39fe 100644 --- a/tex/context/base/l-file.lua +++ b/tex/context/base/l-file.lua @@ -226,7 +226,7 @@ end --~ variant. After some skyping we got it sort of compatible with the old --~ one. After that the anchoring to currentdir was added in a better way. --~ Of course there are some optimizations too. Finally we had to deal with ---~ windows drive prefixes and thinsg like sys://. +--~ windows drive prefixes and things like sys://. function file.collapsepath(str,anchor) if anchor and not find(str,"^/") and not find(str,"^%a:") then @@ -254,7 +254,7 @@ function file.collapsepath(str,anchor) if element == '.' then -- do nothing elseif element == '..' then - local n = i -1 + local n = i - 1 while n > 0 do local element = oldelements[n] if element ~= '..' and element ~= '.' then diff --git a/tex/context/base/l-lpeg.lua b/tex/context/base/l-lpeg.lua index 9fb22e1b5..25d48ee75 100644 --- a/tex/context/base/l-lpeg.lua +++ b/tex/context/base/l-lpeg.lua @@ -600,7 +600,7 @@ end -- For the moment here, but it might move to utilities. Beware, we need to -- have the longest keyword first, so 'aaa' comes beforte 'aa' which is why we --- loop back from the end. +-- loop back from the end cq. prepend. local sort, fastcopy, sortedkeys = table.sort, table.fastcopy, table.sortedkeys -- dependency! @@ -620,13 +620,13 @@ function lpeg.append(list,pp,delayed,checked) elseif delayed then -- hm, it looks like the lpeg parser resolves anyway local keys = sortedkeys(list) if p then - for i=#keys,1,-1 do + for i=1,#keys,1 do local k = keys[i] local v = list[k] p = P(k)/list + p end else - for i=#keys,1,-1 do + for i=1,#keys do local k = keys[i] local v = list[k] if p then @@ -642,7 +642,7 @@ function lpeg.append(list,pp,delayed,checked) elseif checked then -- problem: substitution gives a capture local keys = sortedkeys(list) - for i=#keys,1,-1 do + for i=1,#keys do local k = keys[i] local v = list[k] if p then @@ -661,7 +661,7 @@ function lpeg.append(list,pp,delayed,checked) end else local keys = sortedkeys(list) - for i=#keys,1,-1 do + for i=1,#keys do local k = keys[i] local v = list[k] if p then @@ -674,6 +674,9 @@ function lpeg.append(list,pp,delayed,checked) return p end +-- inspect(lpeg.append({ a = "1", aa = "1", aaa = "1" } ,nil,true)) +-- inspect(lpeg.append({ ["degree celsius"] = "1", celsius = "1", degree = "1" } ,nil,true)) + -- function lpeg.exact_match(words,case_insensitive) -- local pattern = concat(words) -- if case_insensitive then diff --git a/tex/context/base/luat-mac.lua b/tex/context/base/luat-mac.lua index 5189759a5..7287692fc 100644 --- a/tex/context/base/luat-mac.lua +++ b/tex/context/base/luat-mac.lua @@ -112,7 +112,7 @@ local poplocal = always / pop local declaration = variable / set local identifier = variable / get -local argument = leftbrace * ((identifier + (1-rightbrace))^0) * rightbrace +local argument = P { leftbrace * ((identifier + V(1) + (1 - leftbrace - rightbrace))^0) * rightbrace } local function matcherror(str,pos) report_macros("runaway definition at: %s",sub(str,pos-30,pos)) @@ -250,6 +250,7 @@ end -- print(macros.preprocessed([[\def\test#oeps{test:#{oeps}}]])) -- print(macros.preprocessed([[\def\test#{oeps:1}{test:#{oeps:1}}]])) -- print(macros.preprocessed([[\def\test#{oeps}{test:#oeps}]])) +-- print(macros.preprocessed([[\def\x[#a][#b][#c]{\setvalue{\y{#a}\z{#b}}{#c}}]])) -- print(macros.preprocessed([[\def\test#{oeps}{test:#oeps \halign{##\cr #oeps\cr}]])) -- print(macros.preprocessed([[\def\test#{oeps}{test:#oeps \halign{##\cr #oeps\cr}}]])) -- print(macros.preprocessed([[% test diff --git a/tex/context/base/lxml-aux.lua b/tex/context/base/lxml-aux.lua index 560ef557d..4bcac4520 100644 --- a/tex/context/base/lxml-aux.lua +++ b/tex/context/base/lxml-aux.lua @@ -18,6 +18,7 @@ local xml = xml local xmlconvert, xmlcopy, xmlname = xml.convert, xml.copy, xml.name local xmlinheritedconvert = xml.inheritedconvert local xmlapplylpath = xml.applylpath +local xmlfilter = xml.filter local type, setmetatable, getmetatable = type, setmetatable, getmetatable local insert, remove, fastcopy, concat = table.insert, table.remove, table.fastcopy, table.concat @@ -167,7 +168,7 @@ local function xmltoelement(whatever,root) end local element if type(whatever) == "string" then - element = xmlinheritedconvert(whatever,root) + element = xmlinheritedconvert(whatever,root) -- beware, not really a root else element = whatever -- we assume a table end @@ -273,32 +274,39 @@ end local function inject_element(root,pattern,whatever,prepend) local element = root and xmltoelement(whatever,root) local collected = element and xmlapplylpath(root,pattern) - if collected then - for c=1,#collected do - local e = collected[c] - local r = e.__p__ - local d, k, rri = r.dt, e.ni, r.ri - local edt = (rri and d[rri].dt) or (d and d[k] and d[k].dt) - if edt then - local be, af - local cp = copiedelement(element,e) - if prepend then - be, af = cp, edt - else - be, af = edt, cp - end - local bn = #be - for i=1,#af do - bn = bn + 1 - be[bn] = af[i] - end - if rri then - r.dt[rri].dt = be - else - d[k].dt = be - end - redo_ni(d) + local function inject_e(e) + local r = e.__p__ + local d, k, rri = r.dt, e.ni, r.ri + local edt = (rri and d[rri].dt) or (d and d[k] and d[k].dt) + if edt then + local be, af + local cp = copiedelement(element,e) + if prepend then + be, af = cp, edt + else + be, af = edt, cp + end + local bn = #be + for i=1,#af do + bn = bn + 1 + be[bn] = af[i] end + if rri then + r.dt[rri].dt = be + else + d[k].dt = be + end + redo_ni(d) + end + end + if not collected then + -- nothing + elseif collected.tg then + -- first or so + inject_e(collected) + else + for c=1,#collected do + inject_e(collected[c]) end end end @@ -306,16 +314,23 @@ end local function insert_element(root,pattern,whatever,before) -- todo: element als functie local element = root and xmltoelement(whatever,root) local collected = element and xmlapplylpath(root,pattern) - if collected then + local function insert_e(e) + local r = e.__p__ + local d, k = r.dt, e.ni + if not before then + k = k + 1 + end + insert(d,k,copiedelement(element,r)) + redo_ni(d) + end + if not collected then + -- nothing + elseif collected.tg then + -- first or so + insert_e(collected) + else for c=1,#collected do - local e = collected[c] - local r = e.__p__ - local d, k = r.dt, e.ni - if not before then - k = k + 1 - end - insert(d,k,copiedelement(element,r)) - redo_ni(d) + insert_e(collected[c]) end end end @@ -618,3 +633,49 @@ xml.remap_tag = xml.remaptag obsolete.remap_tag xml.remap_name = xml.remapname obsolete.remap_name = xml.remapname xml.remap_namespace = xml.remapnamespace obsolete.remap_namespace = xml.remapnamespace +-- new (probably ok) + +function xml.cdata(e) + if e then + local dt = e.dt + if dt and #dt == 1 then + local first = dt[1] + return first.tg == "@cd@" and first.dt[1] or "" + end + end + return "" +end + +function xml.finalizers.xml.cdata(collected) + if collected then + local e = collected[1] + if e then + local dt = e.dt + if dt and #dt == 1 then + local first = dt[1] + return first.tg == "@cd@" and first.dt[1] or "" + end + end + end + return "" +end + +function xml.insertcomment(e,str,n) -- also insertcdata + table.insert(e.dt,n or 1,{ + tg = "@cm@", + ns = "", + special = true, + at = { }, + dt = { str }, + }) +end + +function xml.setcdata(e,str) -- also setcomment + e.dt = { { + tg = "@cd@", + ns = "", + special = true, + at = { }, + dt = { str }, + } } +end diff --git a/tex/context/base/lxml-tab.lua b/tex/context/base/lxml-tab.lua index 5b841e218..2d99577b6 100644 --- a/tex/context/base/lxml-tab.lua +++ b/tex/context/base/lxml-tab.lua @@ -774,11 +774,13 @@ end xml.convert = xmlconvert -function xml.inheritedconvert(data,xmldata) +function xml.inheritedconvert(data,xmldata) -- xmldata is parent local settings = xmldata.settings - settings.parent_root = xmldata -- to be tested + if settings then + settings.parent_root = xmldata -- to be tested + end -- settings.no_root = true - local xc = xmlconvert(data,settings) + local xc = xmlconvert(data,settings) -- hm, we might need to locate settings -- xc.settings = nil -- xc.entities = nil -- xc.special = nil diff --git a/tex/context/base/lxml-xml.lua b/tex/context/base/lxml-xml.lua index d87ad8b1b..7ecb69196 100644 --- a/tex/context/base/lxml-xml.lua +++ b/tex/context/base/lxml-xml.lua @@ -164,7 +164,7 @@ end local function text(collected) -- hybrid if collected then -- no # test here ! - local e = collected[1] or collected + local e = collected[1] or collected -- why fallback to element, how about cdata return e and xmltotext(e) or "" else return "" @@ -334,7 +334,7 @@ function xml.raw(id,pattern) end end -function xml.text(id,pattern) +function xml.text(id,pattern) -- brrr either content or element (when cdata) if pattern then -- return text(xmlfilter(id,pattern)) local collected = xmlfilter(id,pattern) diff --git a/tex/context/base/m-database.mkiv b/tex/context/base/m-database.mkiv index 80ae75258..370045d4b 100644 --- a/tex/context/base/m-database.mkiv +++ b/tex/context/base/m-database.mkiv @@ -22,34 +22,6 @@ \def\c!quotechar {quotechar} \def\c!commentchar {commentchar} -% \def\????db{@@@@db} -% -% \installparameterhandler \????db {database} -% \installcommandhandler \????db {database} \????db % #3 == defaultroot -% \installattributehandler \????db {database} -% -% or: -% -% \installnamespace{db} \installcommandhandler\????db{database}\????db -% -% \appendtoks -% \getparameters -% [\????db\currentdatabase] -% [\c!separator={,}, -% \c!quotechar=, -% \c!commentchar=, -% \c!setups=, -% \c!before=, -% \c!after=, -% \c!first=, -% \c!last=, -% \c!left=, -% \c!right=, -% \c!command=]% -% \to \everypresetdatabase -% -% or: - \definenamespace [db] [type=module, diff --git a/tex/context/base/math-act.lua b/tex/context/base/math-act.lua index 061da0519..cc058bf60 100644 --- a/tex/context/base/math-act.lua +++ b/tex/context/base/math-act.lua @@ -50,6 +50,9 @@ local how = { function mathematics.scaleparameters(target,original) if not target.properties.math_is_scaled then +-- print("\n",target.properties.fontname) +-- print(original.mathparameters.DisplayOperatorMinHeight) +-- print(target.mathparameters.DisplayOperatorMinHeight) local mathparameters = target.mathparameters if mathparameters and next(mathparameters) then local parameters = target.parameters @@ -59,16 +62,21 @@ function mathematics.scaleparameters(target,original) for name, value in next, mathparameters do local h = how[name] if h == "unscaled" then - mathparameters[name] = value + -- kept elseif h == "horizontal" then - mathparameters[name] = value * hfactor + value = value * hfactor elseif h == "vertical"then - mathparameters[name] = value * vfactor + value = value * vfactor else - mathparameters[name] = value * factor + value = value * factor end +-- if name == "DisplayOperatorMinHeight" then +-- report_math("f: %s, p: %s, h: %s, b: %s, a: %s",target.properties.fontname,name,h or "scaled",mathparameters[name],value) +-- end + mathparameters[name] = value end end +-- print(mathparameters.DisplayOperatorMinHeight) target.properties.math_is_scaled = true end end diff --git a/tex/context/base/math-ali.mkiv b/tex/context/base/math-ali.mkiv index 9efd948a2..9e2837cc2 100644 --- a/tex/context/base/math-ali.mkiv +++ b/tex/context/base/math-ali.mkiv @@ -15,11 +15,20 @@ \unprotect -% todo: \aligntab -% todo: less code (more efficient) +% helpers .. will move + +\def\doxxdoubleempty#1#2% + {\ifx#2[\expandafter\dodoxxdoubleempty\else\expandafter\noxxdoubleempty\fi#1#2} + +\def\dodoxxdoubleempty#1[#2]#3% + {\ifx#3[\else\expandafter\nonoxxdoubleempty\fi#1[#2]#3} + +\def\noxxdoubleempty #1{#1[][]} +\def\nonoxxdoubleempty#1[#2]{#1[#2][]} %D The code here has been moved from other files. Beware: the \MKII\ and -%D \MKIV\ code is not gathered in files with the same name. +%D \MKIV\ code is not gathered in files with the same name. In the +%D meantime this code has been adapted to \MKIV\ but mnore is possible. %D \macros %D {definemathalignment, setupmathalignment, startmathalignment} @@ -29,31 +38,24 @@ % n>1 #### needed, strange # interaction in recurse -\def\presetdisplaymath{\displ@y} % some day i will relocate the plain stuff +\def\presetdisplaymath{\displ@y} -\def\buildeqalign +\def\math_build_eqalign {\scratchtoks\emptytoks \dorecurse{\mathalignmentparameter\c!m} {\ifnum\recurselevel>\plusone - \appendtoks - \tabskip\mathalignmentparameter\c!distance&\tabskip\zeropoint - \to\scratchtoks + %\appendtoks + % \tabskip\mathalignmentparameter\c!distance&\tabskip\zeropoint + %\to\scratchtoks + \scratchtoks\expandafter{\the\scratchtoks\tabskip\mathalignmentparameter\c!distance&\tabskip\zeropoint}% \fi \normalexpanded{\scratchtoks{\the\scratchtoks\the\!!toksa}}% \dorecurse{\numexpr\mathalignmentparameter\c!n-\plusone\relax} {\normalexpanded{\scratchtoks{\the\scratchtoks\the\!!toksb}}}}% \normalexpanded{\scratchtoks{\the\scratchtoks\the\!!toksc}}} -\def\forgetalign - {\tabskip\zeropoint\everycr\emptytoks} - -\let\firstineqalign\empty -\let\nextineqalign \empty -\let\leftofeqalign \empty -\let\rightofeqalign\empty - -\def\mathineqalign#1{$\forgetalign\displaystyle{{}#1{}}$} -\def\textineqalign#1{$\forgetalign#1$} +\def\math_math_in_eqalign#1{$\tabskip\zeropoint\everycr\emptytoks\displaystyle{{}#1{}}$} +\def\math_text_in_eqalign#1{$\tabskip\zeropoint\everycr\emptytoks#1$} \def\eqalign#1% why no halign here, probably because of displaywidth {\emptyhbox\,\vcenter @@ -66,65 +68,65 @@ \setnewconstant\eqalignmode\plusone -\def\preparereqalignno - {\!!toksa{\strut\firstineqalign\hfil\leftofeqalign\span\mathineqalign{##}\rightofeqalign\tabskip\zeropoint}% - \!!toksb{&\nextineqalign\leftofeqalign\span\mathineqalign{##}\rightofeqalign\tabskip\zeropoint}% +\def\math_prepare_r_eqalign_no + {\!!toksa{\strut\math_first_in_eqalign\hfil\math_left_of_equalign\span\math_math_in_eqalign{##}\math_right_of_eqalign\tabskip\zeropoint}% + \!!toksb{&\math_next_in_eqalign\math_left_of_equalign\span\math_math_in_eqalign{##}\math_right_of_eqalign\tabskip\zeropoint}% \ifnum\mathraggedstatus=\plusone - \!!toksc{\hfil&\span\textineqalign{##}\tabskip\zeropoint}% + \!!toksc{\hfil&\span\math_text_in_eqalign{##}\tabskip\zeropoint}% \else\ifnum\mathraggedstatus=\plusthree - \!!toksc{\hfil\tabskip\zeropoint\!!plus 1\!!fill&\span\textineqalign{##}\tabskip\zeropoint}% + \!!toksc{\hfil\tabskip\zeropoint\!!plus 1\!!fill&\span\math_text_in_eqalign{##}\tabskip\zeropoint}% \else - \!!toksc{\hfil\tabskip\centering&\llap{\span\textineqalign{##}}\tabskip\zeropoint}% + \!!toksc{\hfil\tabskip\centering&\llap{\span\math_text_in_eqalign{##}}\tabskip\zeropoint}% \fi\fi \global\mathnumberstatus\zerocount - \buildeqalign + \math_build_eqalign \presetdisplaymath \tabskip\centering} -\def\prepareleqalignno - {\!!toksa{\strut\firstineqalign\hfil\leftofeqalign\span\mathineqalign{##}\rightofeqalign\tabskip\zeropoint}% - \!!toksb{&\nextineqalign\leftofeqalign\span\mathineqalign{##}\rightofeqalign\tabskip\zeropoint}% +\def\math_prepare_l_eqalign_no + {\!!toksa{\strut\math_first_in_eqalign\hfil\math_left_of_equalign\span\math_math_in_eqalign{##}\math_right_of_eqalign\tabskip\zeropoint}% + \!!toksb{&\math_next_in_eqalign\math_left_of_equalign\span\math_math_in_eqalign{##}\math_right_of_eqalign\tabskip\zeropoint}% % problem: number is handled after rest and so ends up in the margin \ifnum\mathraggedstatus=\plusone - \!!toksc{\hfil&\kern-\displaywidth\rlap{\span\textineqalign{##}}\tabskip\displaywidth}% + \!!toksc{\hfil&\kern-\displaywidth\rlap{\span\math_text_in_eqalign{##}}\tabskip\displaywidth}% \else\ifnum\mathraggedstatus=\plusthree - \!!toksc{\hfil\tabskip\zeropoint\!!plus 1\!!fill&\kern-\displaywidth\span\mrlap{\span\textineqalign{##}}\tabskip\displaywidth}% + \!!toksc{\hfil\tabskip\zeropoint\!!plus 1\!!fill&\kern-\displaywidth\span\math_rlap{\span\math_text_in_eqalign{##}}\tabskip\displaywidth}% \else - \!!toksc{\hfil\tabskip\centering&\kern-\displaywidth\rlap{\span\textineqalign{##}}\tabskip\displaywidth}% + \!!toksc{\hfil\tabskip\centering&\kern-\displaywidth\rlap{\span\math_text_in_eqalign{##}}\tabskip\displaywidth}% \fi\fi \global\mathnumberstatus\zerocount - \buildeqalign + \math_build_eqalign \presetdisplaymath \tabskip\centering} -\def\dobotheqalignno#1#2% +\def\math_both_eqalign_no#1#2% {\ifmmode \displ@y % \let\doplaceformulanumber\relax % strange hack \vcenter\bgroup - \let\finishalignno\egroup + \let\math_finish_eqalign_no\egroup \else - \let\finishalignno\relax + \let\math_finish_eqalign_no\relax \fi #1% \halign \ifcase\eqalignmode \or to \displaywidth \fi \@EA {\the\scratchtoks\crcr#2\crcr}% - \finishalignno} + \math_finish_eqalign_no} -\def\dobothaligneqalignno#1% +\def\math_both_eqalign_no_aligned#1% {\ifmmode \displ@y \global\mathnumberstatus\plusone \ifcase\mathraggedstatus - \def\finishalignno{\crcr\egroup}% + \def\math_finish_eqalign_no{\crcr\egroup}% \else % we're in a mathbox \vcenter\bgroup - \def\finishalignno{\crcr\egroup\egroup}% + \def\math_finish_eqalign_no{\crcr\egroup\egroup}% \fi \fi #1% \halign \ifcase\eqalignmode \or to \displaywidth \fi \@EA \bgroup\the\scratchtoks\crcr} -\def\mrlap#1% +\def\math_rlap#1% {\setbox\scratchbox\hbox{#1}% \ifdim\wd\scratchbox>\mathnumbercorrection \xdef\mathnumbercorrection{\the\wd\scratchbox}% @@ -132,30 +134,23 @@ \box\scratchbox \global\mathnumberstatus\plustwo} -% \def\dobothaligneqalignno#1% -% {\ifmmode -% \displ@y -% \global\mathnumberstatus\plusone -% we're in a mathbox -% \vcenter\bgroup -% \def\finishalignno{\crcr\egroup\egroup}% -% \else -% \def\finishalignno{\crcr\egroup}% -% \fi -% #1% -% \halign \ifcase\eqalignmode \or to \displaywidth \fi \@EA \bgroup\the\scratchtoks\crcr} - -\def\reqalignno {\dobotheqalignno \preparereqalignno} -\def\leqalignno {\dobotheqalignno \prepareleqalignno} -\def\alignreqalignno{\dobothaligneqalignno\preparereqalignno} -\def\alignleqalignno{\dobothaligneqalignno\prepareleqalignno} -\def\finishalignno {\crcr\egroup} - -\let \equalignno \reqalignno -\let\aligneqalignno\alignreqalignno +\def\math_handle_eqalign_no_r_normal {\math_both_eqalign_no_normal \math_prepare_r_eqalign_no} +\def\math_handle_eqalign_no_l_normal {\math_both_eqalign_no_normal \math_prepare_l_eqalign_no} +\def\math_handle_eqalign_no_r_aligned{\math_both_eqalign_no_aligned\math_prepare_r_eqalign_no} +\def\math_handle_eqalign_no_l_aligned{\math_both_eqalign_no_aligned\math_prepare_l_eqalign_no} +\def\math_finish_eqalign_no {\crcr\egroup} + +\let \reqalignno \math_handle_eqalign_no_r_normal +\let \leqalignno \math_handle_eqalign_no_l_normal +\let\alignreqalignno \math_handle_eqalign_no_r_aligned +\let\alignleqalignno \math_handle_eqalign_no_l_aligned +\let \equalignno \math_handle_eqalign_no_r_normal +\let \aligneqalignno \math_handle_eqalign_no_r_aligned %D Here we implement the user interface part. We start with basic math alignments: +\newcount\c_math_eqalign_column + \newtoks \everymathalignment \def\math_alignment_NR_indeed[#1][#2]% @@ -185,7 +180,7 @@ \let\NR\math_alignment_NR \to \everymathalignment -\def\math_alignment_start#1% +\unexpanded\def\math_alignment_start#1% {\edef\currentmathalignment{#1}% \dosingleempty\math_alignment_start_indeed} @@ -195,25 +190,25 @@ \setupmathalignment[\currentmathalignment][#1]% \fi \the\everymathalignment - \eqaligncolumn\zerocount + \c_math_eqalign_column\zerocount \processcommacommand [\mathalignmentparameter\c!align] - {\advance\eqaligncolumn\plusone\doseteqaligncolumn}% takes argument - \global\eqaligncolumn\plusone + {\advance\c_math_eqalign_column\plusone\doseteqaligncolumn}% takes argument + \global\c_math_eqalign_column\plusone \dostarttagged\t!math\empty \dostarttagged\t!mathtable\currentmathalignment \numberedeqalign} \def\math_alignment_stop - {\finishalignno + {\math_finish_eqalign_no \dostoptagged \dostoptagged} \installcommandhandler \??eq {mathalignment} \??eq \appendtoks - \setevalue{\e!start\currentmathalignment}{\noexpand\math_alignment_start{\currentmathalignment}}% - \setevalue{\e!stop \currentmathalignment}{\noexpand\math_alignment_stop}% + \setuevalue{\e!start\currentmathalignment}{\math_alignment_start{\currentmathalignment}}% + \setvalue {\e!stop \currentmathalignment}{\math_alignment_stop}% \to \everydefinemathalignment \setupmathalignment @@ -224,59 +219,37 @@ \definemathalignment[align] % default case (this is what amstex users expect) \definemathalignment[\v!mathalignment] % prefered case (this is cleaner, less clashing) -% helpers - \def\numberedeqalign - {\doifelse{\formulaparameter\c!location}\v!left\alignleqalignno\alignreqalignno} - -\def\doxxdoubleempty#1#2% - {\ifx#2[\expandafter\dodoxxdoubleempty\else\expandafter\noxxdoubleempty\fi#1#2} + {\doifelse{\formulaparameter\c!location}\v!left + \math_handle_eqalign_no_l_aligned + \math_handle_eqalign_no_r_aligned} -\def\dodoxxdoubleempty#1[#2]#3% - {\ifx#3[\else\expandafter\nonoxxdoubleempty\fi#1[#2]#3} - -\def\noxxdoubleempty #1{#1[][]} -\def\nonoxxdoubleempty#1[#2]{#1[#2][]} - -\newcount\eqaligncolumn - -\def\firstineqalign - {\global\eqaligncolumn\plusone +\def\math_first_in_eqalign + {\global\c_math_eqalign_column\plusone \dostarttagged\t!mathtablerow \empty \dostarttagged\t!mathtablecell\empty} -\def\nextineqalign - {\global\advance\eqaligncolumn\plusone +\def\math_next_in_eqalign + {\global\advance\c_math_eqalign_column\plusone \dostoptagged % finish cell \dostarttagged\t!mathtablecell\empty} -% \def\leftofeqalign {\getvalue{\??eq:\v!left :\number\eqaligncolumn}} -% \def\rightofeqalign{\getvalue{\??eq:\v!right:\number\eqaligncolumn}} - -% \def\doseteqaligncolumn#1% we could just add to the preamble (as with other alignments) -% {\letvalueempty{\??eq:\v!left :\number\eqaligncolumn}% -% \letvalueempty{\??eq:\v!right:\number\eqaligncolumn}% -% \doif{#1}\v!left {\letvalue{\??eq:\v!right:\number\eqaligncolumn}\hfill}% -% \doif{#1}\v!right {\letvalue{\??eq:\v!left :\number\eqaligncolumn}\hfill}% -% \doif{#1}\v!middle{\letvalue{\??eq:\v!right:\number\eqaligncolumn}\hfill -% \letvalue{\??eq:\v!left :\number\eqaligncolumn}\hfill}} - -\def\leftofeqalign - {\ifcsname\??eq::a::\number\eqaligncolumn\endcsname - \ifcase\csname\??eq::a::\number\eqaligncolumn\endcsname\or +\def\math_left_of_equalign + {\ifcsname\??eq::a::\number\c_math_eqalign_column\endcsname + \ifcase\csname\??eq::a::\number\c_math_eqalign_column\endcsname\or \relax \or \hfill \or \hfill \fi \fi} -\def\rightofeqalign - {\ifcsname\??eq::a::\number\eqaligncolumn\endcsname - \ifcase\csname\??eq::a::\number\eqaligncolumn\endcsname\or +\def\math_right_of_eqalign + {\ifcsname\??eq::a::\number\c_math_eqalign_column\endcsname + \ifcase\csname\??eq::a::\number\c_math_eqalign_column\endcsname\or \hfill \or \relax \or \hfill \fi \fi} \def\doseteqaligncolumn#1% we could just add to the preamble (as with other alignments) - {\expandafter\let\csname\??eq::a::\number\eqaligncolumn\expandafter\endcsname + {\expandafter\let\csname\??eq::a::\number\c_math_eqalign_column\expandafter\endcsname \csname\??eq::a::\ifcsname\??eq::a::#1\endcsname#1\else\v!normal\fi\endcsname} \letvalue{\??eq::a::\v!normal}\zerocount @@ -284,10 +257,7 @@ \letvalue{\??eq::a::\v!right }\plustwo \letvalue{\??eq::a::\v!middle}\plusthree -\def\dodoalignNC - {\gdef\doalignNC##1{&##1}} - -\def\doalignNR[#1][#2]% +\def\math_align_NR_generic[#1][#2]% {\donestedformulanumber{#1}{#2}\crcr} %D \starttyping @@ -426,20 +396,7 @@ %D %D Another wish \unknown -\unexpanded\def\setupmathcases - {\dodoubleempty\dosetupmathcases} - -\def\dosetupmathcases[#1][#2]% - {\ifsecondargument - \getparameters[\??ce#1][#2]% - \else - \getparameters[\??ce][#1]% - \fi} - -\let\currentmathcases\empty - -\def\mathcasesparameter#1% - {\executeifdefined{\??ce\currentmathcases#1}{\executeifdefined{\??ce#1}\empty}} +\installcommandhandler \??ce {mathcases} \??ce \setupmathcases [\c!distance=1em, @@ -447,52 +404,54 @@ \c!left={\left\{\,}, \c!right={\right.}] -\def\dodocasesNC - {\gdef\docasesNC{\endmath&}} - -\let\docasesNR\doalignNR +\appendtoks + \setuevalue{\e!start\currentmathcases}{\math_cases_start{\currentmathcases}}% + \setvalue {\e!stop \currentmathcases}{\math_cases_stop}% +\to \everydefinemathcases -\def\dostartmathcases[#1][#2]% +\unexpanded\def\math_cases_start#1% {\begingroup \edef\currentmathcases{#1}% - \doifassignmentelse{#2}{\setupmathcases[#1][#2]}\donothing + \dosingleempty\math_cases_start_indeed} + +\unexpanded\def\math_cases_start_indeed[#1]% + {\iffirstargument + \setupcurrentmathcases[#1]% + \fi \mathcasesparameter\c!left \vcenter\bgroup - \pushmacro\docasesNC + \pushmacro\math_cases_NC \let\endmath\relax - \def\NC{\docasesNC}% - \def\MC{\docasesNC\ifmmode\else$\def\endmath{$}\fi}% - \global\let\docasesNC\dodocasesNC - \def\NR{\unskip\endmath&\global\let\docasesNC\dodocasesNC\doxxdoubleempty\docasesNR}% + \def\NC{\math_cases_NC}% + \def\MC{\math_cases_NC\ifmmode\else$\def\endmath{$}\fi}% + \global\let\math_cases_NC\math_cases_NC_indeed + \def\NR{\unskip\endmath&\global\let\math_cases_NC\math_cases_NC_indeed\doxxdoubleempty\math_cases_NR}% \normalbaselines \mathsurround\zeropoint \everycr\emptytoks \tabskip\zeropoint - \global\eqaligncolumn\plusone + \global\c_math_eqalign_column\plusone \halign\bgroup $\mathcasesparameter\c!style##$\hfil &\hskip\mathcasesparameter\c!distance\relax - \popmacro\docasesNC##\hfil + \popmacro\math_cases_NC##\hfil &\hskip\mathcasesparameter\c!numberdistance\relax \let\formuladistance\!!zeropoint - \span\textineqalign{##}% + \span\math_text_in_eqalign{##}% \crcr} % todo: number -\def\dostopmathcases +\def\math_cases_stop {\crcr \egroup - \popmacro\docasesNC + \popmacro\math_cases_NC \egroup \mathcasesparameter\c!right \endgroup} -\unexpanded\def\definemathcases - {\dodoubleempty\dodefinemathcases} +\def\math_cases_NC_indeed + {\gdef\math_cases_NC{\endmath&}} -\def\dodefinemathcases[#1]% [#2]% - {\setvalue{\e!start#1}{\dodoubleempty\dostartmathcases[#1]}% - \setvalue{\e!stop #1}{\dostopmathcases}% - \setupmathcases[#1]}% [#2] +\let\math_cases_NR\math_align_NR_generic \definemathcases[cases] \definemathcases[\v!mathcases] @@ -542,20 +501,7 @@ %D %D Yet another one \unknown -\unexpanded\def\setupmathmatrix - {\dodoubleempty\dosetupmathmatrix} - -\def\dosetupmathmatrix[#1][#2]% - {\ifsecondargument - \getparameters[\??mx#1][#2]% - \else - \getparameters[\??mx][#1]% - \fi} - -\let\currentmathmatrix\empty - -\def\mathmatrixparameter#1% - {\executeifdefined{\??mx\currentmathmatrix#1}{\executeifdefined{\??mx#1}\empty}} +\installcommandhandler \??mk {mathmatrix} \??mk \setupmathmatrix [\c!distance=1em, @@ -563,127 +509,22 @@ \c!right=, \c!align=\v!middle] -\def\dosetmatrixcolumn#1% hh: todo: \definematrixalign - {\letvalue{\??eq:\v!left :\number\eqaligncolumn}\hfil - \letvalue{\??eq:\v!right:\number\eqaligncolumn}\hfil - \doif{#1}\v!left {\letvalue{\??eq:\v!left :\number\eqaligncolumn}\relax - \letvalue{\??eq:\v!right:\number\eqaligncolumn}\hfil}% - \doif{#1}\v!right {\letvalue{\??eq:\v!left :\number\eqaligncolumn}\hfil - \letvalue{\??eq:\v!right:\number\eqaligncolumn}\relax }% - \doif{#1}\v!middle{\letvalue{\??eq:\v!left :\number\eqaligncolumn}\hfil - \letvalue{\??eq:\v!right:\number\eqaligncolumn}\hfil}} - -\def\buildmathmatrix % beware: etex only - {\scratchtoks\emptytoks - \normalexpanded{\scratchtoks{\the\scratchtoks\the\!!toksa}}% - \dorecurse{\numexpr\scratchcounter-\plusone\relax} - {\normalexpanded{\scratchtoks{\the\scratchtoks\the\!!toksb}}}% - \normalexpanded{\scratchtoks{\the\scratchtoks\the\!!toksc}}} - -\def\preparemathmatrix - {\!!toksa{\strut \firstineqalign\leftofeqalign \span - \textineqalign{\mathmatrixparameter\c!style ##}\rightofeqalign}% - \!!toksb{&\hskip\mathmatrixparameter\c!distance - \nextineqalign\leftofeqalign \span - \textineqalign{\mathmatrixparameter\c!style ##}\rightofeqalign}% - \!!toksc{&&\hskip\mathmatrixparameter\c!distance - \leftofeqalign \span - \textineqalign{\mathmatrixparameter\c!style ##}\rightofeqalign}% - \buildmathmatrix - \halign \@EA \bgroup\the\scratchtoks \crcr} - -\unexpanded\def\definemathmatrix - {\dodoubleempty\dodefinemathmatrix} - -\def\dodefinemathmatrix[#1]% [#2]% - {\setuvalue{\e!start#1}{\dodoubleempty\dostartmathmatrix[#1]}% - \setvalue {\e!stop #1}{\dostopmathmatrix}% no u else lookahead problem - \setupmathmatrix[#1]}% [#2] - -\definemathmatrix[matrix] -\definemathmatrix[\v!mathmatrix] - -\unexpanded\def\dodomatrixNC - {\gdef\domatrixNC{\endmath&}} - -\def\installmathmatrixhandler#1#2% - {\setvalue{\??mx:#1}{#2}} - -% First alternative: -% -% \def\processlowhighmathmatrix#1% -% {\def\mathmatrixleft -% {\setbox\nextbox} -% \def\mathmatrixright -% {#1.5\dimexpr\nextboxdp-\nextboxht\relax -% \hbox{$\mathmatrixparameter\c!left -% \vcenter{\unvbox\nextbox}% -% \mathmatrixparameter\c!right$}}% -% \let\mathmatrixbox\vbox} -% -% \installmathmatrixhandler\v!high {\processlowhighmathmatrix\raise} -% \installmathmatrixhandler\v!low {\processlowhighmathmatrix\lower} -% -% \installmathmatrixhandler\v!top {\processlowhighmathmatrix\raise} -% \installmathmatrixhandler\v!bottom{\processlowhighmathmatrix\lower} -% -% \installmathmatrixhandler\v!lohi -% {\def\mathmatrixleft {\mathmatrixparameter\c!left}% -% \def\mathmatrixright{\mathmatrixparameter\c!right}% -% \let\mathmatrixbox\vcenter} -% -% An alternative -% -% \let\mathmatrixleft \empty -% \let\mathmatrixright\empty -% -% \def\processlowhighmathmatrix#1% -% {\dowithnextbox -% {#1.5\dimexpr\nextboxdp-\nextboxht\relax -% \hbox{$\mathmatrixparameter\c!left -% \vcenter{\unvbox\nextbox}% -% \mathmatrixparameter\c!right$}}% -% \vbox} -% -% \def\processlohimathmatrix -% {\dowithnextbox -% {\mathmatrixparameter\c!left -% \vcenter{\unvbox\nextbox}% -% \mathmatrixparameter\c!right}% -% \vbox} -% -% \installmathmatrixhandler\v!high {\def\mathmatrixbox{\processlowhighmathmatrix\raise}} -% \installmathmatrixhandler\v!low {\def\mathmatrixbox{\processlowhighmathmatrix\lower}} -% \installmathmatrixhandler\v!top {\def\mathmatrixbox{\processlowhighmathmatrix\raise}} -% \installmathmatrixhandler\v!bottom{\def\mathmatrixbox{\processlowhighmathmatrix\lower}} -% \installmathmatrixhandler\v!lohi {\let\mathmatrixbox \processlohimathmatrix} -% -% Final version - -\let\mathmatrixleft \empty % experimental hook -\let\mathmatrixright\empty % experimental hook - -\def\processlowhighmathmatrix#1#2% - {\dowithnextbox - {\scratchdimen\dimexpr(\nextboxdp-\nextboxht)/2 \ifcase#2\or+\mathaxisheight\textfont2\fi\relax - \ifcase#1\relax\or\lower\scratchdimen\or\or\raise\scratchdimen\fi - \hbox{$\mathmatrixparameter\c!left - \vcenter{\unvbox\nextbox}% - \mathmatrixparameter\c!right$}}% - \vbox} - -\installmathmatrixhandler\v!top {\def\mathmatrixbox{\processlowhighmathmatrix\plusthree\plusone }} -\installmathmatrixhandler\v!high {\def\mathmatrixbox{\processlowhighmathmatrix\plusthree\zerocount}} -\installmathmatrixhandler\v!lohi {\def\mathmatrixbox{\processlowhighmathmatrix\plustwo \zerocount}} -\installmathmatrixhandler\v!low {\def\mathmatrixbox{\processlowhighmathmatrix\plusone \zerocount}} -\installmathmatrixhandler\v!bottom{\def\mathmatrixbox{\processlowhighmathmatrix\plusone \plusone }} +\appendtoks + \setuevalue{\e!start\currentmathmatrix}{\math_matrix_start{\currentmathmatrix}}% + \setvalue {\e!stop \currentmathmatrix}{\math_matrix_stop}% no u else lookahead problem +\to \everydefinemathmatrix -\def\dostartmathmatrix[#1][#2]% +\unexpanded\def\math_matrix_start#1% {\begingroup \edef\currentmathmatrix{#1}% - \doifassignmentelse{#2}{\setupmathmatrix[#1][#2]}\donothing + \dosingleempty\math_matrix_start_indeed} + +\unexpanded\def\math_matrix_start_indeed[#1]% + {\iffirstargument + \setupcurrentmathmatrix[#1]% + \fi \emptyhbox - \executeifdefined{\??mx:\mathmatrixparameter\c!location}{\getvalue{\??mx:\v!lohi}}% + \math_matrix_handler_apply \mathmatrixleft \mathmatrixbox\bgroup \pushmacro\domatrixNC @@ -696,13 +537,15 @@ \mathsurround\zeropoint \everycr\emptytoks \tabskip\zeropoint - \eqaligncolumn\zerocount - \processcommacommand[\mathmatrixparameter\c!align]{\advance\eqaligncolumn\plusone\dosetmatrixcolumn}% - \scratchcounter=\ifnum\eqaligncolumn>\zerocount \eqaligncolumn \else \plusone \fi - \global\eqaligncolumn\plusone - \preparemathmatrix } % uses scratchcounter + \c_math_eqalign_column\zerocount + \processcommacommand + [\mathmatrixparameter\c!align] + {\advance\c_math_eqalign_column\plusone\doseteqaligncolumn}% was \dosetmatrixcolumn + \scratchcounter=\ifnum\c_math_eqalign_column>\zerocount \c_math_eqalign_column \else \plusone \fi + \global\c_math_eqalign_column\plusone + \math_matrix_prepare} -\def\dostopmathmatrix +\def\math_matrix_stop {\crcr \mathstrut\crcr \noalign{\kern-\baselineskip}% @@ -712,6 +555,57 @@ \mathmatrixright \endgroup} +\definemathmatrix[matrix] +\definemathmatrix[\v!mathmatrix] + +\def\math_matrix_prepare + {\!!toksa{\strut\math_first_in_eqalign\math_left_of_equalign\span + \math_text_in_eqalign{\mathmatrixparameter\c!style##}\math_right_of_eqalign}% + \!!toksb{&\hskip\mathmatrixparameter\c!distance + \math_next_in_eqalign\math_left_of_equalign\span + \math_text_in_eqalign{\mathmatrixparameter\c!style##}\math_right_of_eqalign}% + \!!toksc{&&\hskip\mathmatrixparameter\c!distance + \math_left_of_equalign\span + \math_text_in_eqalign{\mathmatrixparameter\c!style##}\math_right_of_eqalign}% + \scratchtoks\emptytoks + \normalexpanded{\scratchtoks{\the\scratchtoks\the\!!toksa}}% + \dorecurse{\numexpr\scratchcounter-\plusone\relax} + {\normalexpanded{\scratchtoks{\the\scratchtoks\the\!!toksb}}}% + \normalexpanded{\scratchtoks{\the\scratchtoks\the\!!toksc}}% + \halign \@EA \bgroup\the\scratchtoks \crcr} + +\unexpanded\def\dodomatrixNC + {\gdef\domatrixNC{\endmath&}} + +\def\installmathmatrixhandler#1#2% + {\setvalue{\??mx:h:#1}{#2}} + +\let\mathmatrixleft \empty % experimental hook +\let\mathmatrixright\empty % experimental hook + +\def\math_matrix_process#1#2% + {\dowithnextbox + {\scratchdimen\dimexpr(\nextboxdp-\nextboxht)/2 \ifcase#2\or+\mathaxisheight\textfont2\fi\relax + \ifcase#1\relax\or\lower\scratchdimen\or\or\raise\scratchdimen\fi + \hbox{$\mathmatrixparameter\c!left + \vcenter{\unvbox\nextbox}% + \mathmatrixparameter\c!right$}}% + \vbox} + +\installmathmatrixhandler\v!top {\def\mathmatrixbox{\math_matrix_process\plusthree\plusone }} +\installmathmatrixhandler\v!high {\def\mathmatrixbox{\math_matrix_process\plusthree\zerocount}} +\installmathmatrixhandler\v!lohi {\def\mathmatrixbox{\math_matrix_process\plustwo \zerocount}} +\installmathmatrixhandler\v!low {\def\mathmatrixbox{\math_matrix_process\plusone \zerocount}} +\installmathmatrixhandler\v!bottom{\def\mathmatrixbox{\math_matrix_process\plusone \plusone }} +\installmathmatrixhandler\v!normal{\def\mathmatrixbox{\math_matrix_process\plustwo \zerocount}} % lohi + +\def\math_matrix_handler_apply + {\csname\??mx:h:\ifcsname\??mx:h:\mathmatrixparameter\c!location\endcsname + \mathmatrixparameter\c!location + \else + \v!normal + \fi\endcsname} + %D \startbuffer %D \placeformula \startformula[-] \startmatrix %D \NC 1 \NC x \NC a \NR @@ -847,62 +741,21 @@ %D The intertext commands have to be expandable (in aligment lookahead) so %D we cannot use \type {\unexpanded}. -\let\stopintertext\relax - \def\startintertext#1\stopintertext - {\noalign{\dointertext{#1}}} + {\noalign{\math_intertext{#1}}} + +\let\stopintertext\relax \def\intertext#1% - {\noalign{\dointertext{#1}}} + {\noalign{\math_intertext{#1}}} -\unexpanded\def\dointertext#1% +\unexpanded\def\math_intertext#1% {\penalty\postdisplaypenalty \afterdisplayspace \vbox{\forgetall\noindent#1\par}% \penalty\predisplaypenalty \beforedisplayspace} -% \macros -% {substack} -% -% Preliminary code: -% -% \starttyping -% \startformula -% \sum_{% -% \startsubstack -% i = 1 \NR -% i \neq n \NR -% i \neq m -% \stopsubstack -% }a_i -% \stopformula -% \stoptyping -% -% \unexpanded\def\startsubstack -% {\begingroup -% \emptyhbox -% \vcenter\bgroup -% \pushmacro\domatrixNC -% \let\stopmathmode\relax -% \def\NC{\domatrixNC}% -% \def\MC{\domatrixNC\startmathmode}% -% \global\let\domatrixNC\dodomatrixNC -% \def\NR -% {\stopmathmode -% \global\let\domatrixNC\dodomatrixNC -% \crcr\noalign{\nointerlineskip}}% -% \mathsurround\zeropoint -% \everycr\emptytoks -% \halign\bgroup\hfil$\scriptstyle\mathstrut##$\hfil\crcr} -% -% \unexpanded\def\stopsubstack -% {\crcr -% \egroup -% \popmacro\domatrixNC -% \egroup -% \endgroup} - %D \macros %D {substack} %D @@ -953,7 +806,7 @@ \everycr\emptytoks \halign\bgroup\hfil$\scriptstyle##$\hfil\crcr} -\unexpanded\def\stopsubstack +\def\stopsubstack {\crcr \egroup \egroup @@ -968,12 +821,12 @@ \ifx\mathparentwd\undefined \newdimen\mathparentwd \fi -\let\normalbordermatrix\bordermatrix +\let\normalbordermatrix\bordermatrix % move that code to here instead \def\bordermatrix {\begingroup \setbox\scratchbox\hbox{\mr\char"239C}% - \global\mathparentwd\wd\scratchbox\relax + \global\mathparentwd\wd\scratchbox \endgroup \normalbordermatrix} @@ -1003,11 +856,11 @@ %D Use these macros sparingly. Remember, \TEX\ was designed for %D mathematics, so there is usually a proper method for typesetting %D common math notation. +%D +%D These macros are a cleaner version of \type {\binrel@} and +%D \type {\binrel@@} macros in \AMSTEX\ packages. -%D These macros are a clearer version of \type{\binrel@} and -%D \type{\binrel@@} macros in \AMSTEX\ packages. - -\def\preparebinrel#1% +\def\math_binrel_apply#1% {\begingroup \setbox\scratchbox\hbox {\thinmuskip 0mu @@ -1016,48 +869,46 @@ \setbox\scratchbox\hbox{$#1\mathsurround\zeropoint$}% \kern-\wd\scratchbox ${}#1{}\mathsurround\zeropoint$}% - \normalexpanded - {\endgroup - \let\noexpand\currentbinrel - \ifdim\wd\scratchbox<\zeropoint - \mathbin - \else\ifdim\wd\scratchbox>\zeropoint - \mathrel - \else - \relax - \fi\fi}} + \ifdim\wd\scratchbox<\zeropoint + \endgroup + \expandafter\mathbin + \else\ifdim\wd\scratchbox>\zeropoint + \endgroup + \expandafter\expandafter\expandafter\mathrel + \else + \endgroup + \expandafter\expandafter\expandafter\firstofoneargument + \fi\fi} \unexpanded\def\overset#1#2% - {\preparebinrel{#2}% - \currentbinrel{\mathop{\kern\zeropoint#2}\limits\normalsuperscript{#1}}} + {\math_binrel_apply{#2}{\mathop{\kern\zeropoint#2}\limits\normalsuperscript{#1}}} \unexpanded\def\underset#1#2% - {\preparebinrel{#2}% - \currentbinrel{\mathop{\kern\zeropoint#2}\limits\normalsubscript{#1}}} + {\math_binrel_apply{#2}{\mathop{\kern\zeropoint#2}\limits\normalsubscript {#1}}} %D The following code comes from \type {math-str.mkiv}. - +%D %D Here we implement a basic math alignment mechanism. Numbers %D are also handled. The macros \type {\startinnermath} and %D \type {\stopinnermath} can be overloaded in specialized %D modules. \unexpanded\def\startinnermath - {\getvalue{\e!start\??fm\formulaparameter\c!align}} + {\csname\??fm:\e!start:\formulaparameter\c!align\endcsname} \unexpanded\def\stopinnermath - {\getvalue{\e!stop \??fm\formulaparameter\c!align}} + {\csname\??fm:\e!stop :\formulaparameter\c!align\endcsname} \def\mathinnerstrut {\doif{\formulaparameter\c!strut}\v!yes\strut} -\long\unexpanded\def\defineinnermathhandler#1#2#3% - {\setvalue{\e!start\??fm#1}{#2}% - \setvalue{\e!stop \??fm#1}{#3}} +\unexpanded\def\defineinnermathhandler#1#2#3% + {\setvalue{\??fm:\e!start:#1}{#2}% + \setvalue{\??fm:\e!stop :#1}{#3}} \newif\iftracemath -\def\mathhbox +\def\math_hbox {\iftracemath\ruledhbox\else\hbox\fi} \newconstant\mathraggedstatus % normal left center right @@ -1065,40 +916,47 @@ \let\mathnumbercorrection\!!zeropoint +\let\math_the_r_eq_no\empty +\let\math_the_l_eq_no\empty + \unexpanded\def\startmathbox#1% {\hsize\displaywidth \global\mathnumberstatus\plusone \mathraggedstatus#1\relax \let\mathnumbercorrection\!!zeropoint - \global\let\@eqno \empty \def\eqno {\gdef\@eqno }% - \global\let\@leqno\empty \def\leqno{\gdef\@leqno}% + \global\let\math_the_r_eq_no\empty + \global\let\math_the_l_eq_no\empty + \def\reqno{\gdef\math_the_r_eq_no}% + \def\leqno{\gdef\math_the_l_eq_no}% + \let\eqno\reqno % added - \let\normalreqno\eqno + \let\normalreqno\reqno \let\normalleqno\leqno + \let\normaleqno \eqno % added \doplaceformulanumber - \setbox\scratchbox\mathhbox to \displaywidth\bgroup + \setbox\scratchbox\math_hbox to \displaywidth\bgroup \mathinnerstrut $% \displaystyle \ifcase\mathraggedstatus\or\hfill\or\hfill\fi} -\def\llappedmathno +\def\math_box_llapped_math_no {\ifcase\mathraggedstatus\or - \@eqno + \math_the_r_eq_no \or - \llap{\@eqno}% + \llap{\math_the_r_eq_no}% \or - \llap{\@eqno}% + \llap{\math_the_r_eq_no}% \fi} -\def\rlappedmathno +\def\math_box_rlapped_math_no {\ifcase\mathraggedstatus\or - \rlap{\@leqno}% + \rlap{\math_the_l_eq_no}% \or - \rlap{\@leqno}% + \rlap{\math_the_l_eq_no}% \or - \@leqno + \math_the_l_eq_no \fi} \unexpanded\def\stopmathbox @@ -1116,21 +974,21 @@ \ifcase\mathnumberstatus \box\scratchbox \or - \ifx\@leqno\empty - \ifx\@eqno\empty + \ifx\math_the_l_eq_no\empty + \ifx\math_the_r_eq_no\empty \box\scratchbox \else \ifdone - \vbox{\box\scratchbox\hbox to \displaywidth{\hss\llappedmathno}}% + \vbox{\box\scratchbox\hbox to \displaywidth{\hss\math_box_llapped_math_no}}% \else - \hss\box\scratchbox\llappedmathno % hss makes room for number + \hss\box\scratchbox\math_box_llapped_math_no % hss makes room for number \fi \fi \else \ifdone - \vbox{\hbox to \displaywidth{\rlappedmathno\hss}\box\scratchbox}% + \vbox{\hbox to \displaywidth{\math_box_rlapped_math_no\hss}\box\scratchbox}% \else - \rlappedmathno\box\scratchbox\hss % hss makes room for number + \math_box_rlapped_math_no\box\scratchbox\hss % hss makes room for number \fi \fi \or diff --git a/tex/context/base/math-dim.lua b/tex/context/base/math-dim.lua index 00b766dc2..d245bfb3a 100644 --- a/tex/context/base/math-dim.lua +++ b/tex/context/base/math-dim.lua @@ -124,7 +124,7 @@ end function mathematics.dimensions(dimens) -- beware, dimens get spoiled if dimens.SpaceAfterScript then - dimens.SubscriptShiftDownWithSuperscript = dimens.SubscriptShiftDown * 1.5 + dimens.SubscriptShiftDownWithSuperscript = dimens.SubscriptShiftDown * 1.5 -- move this one return table.fastcopy(dimens), { } elseif dimens.AxisHeight or dimens.axis_height then local t = { } diff --git a/tex/context/base/math-pln.mkiv b/tex/context/base/math-pln.mkiv index cdbc400a1..1f846d5ac 100644 --- a/tex/context/base/math-pln.mkiv +++ b/tex/context/base/math-pln.mkiv @@ -206,7 +206,7 @@ \ifx\mfunction\undefined \def\mfunction#1{\mathbin{\rm#1}} \fi -\def\bmod +\unexpanded\def\bmod {\nonscript \mskip-\medmuskip \mkern5mu @@ -216,12 +216,12 @@ \nonscript \mskip-\medmuskip} -\def\pmod#1% +\unexpanded\def\pmod#1% {\allowbreak \mkern18mu (\mfunction{mod}\,\,#1)} -\def\cases#1% +\unexpanded\def\cases#1% {\left\{% \,% \vcenter @@ -230,7 +230,7 @@ \ialign{$##\hfil$&\quad##\hfil\crcr#1\crcr}}% \right.} -\def\matrix#1% +\unexpanded\def\matrix#1% {\emptyhbox \,% \vcenter @@ -240,14 +240,14 @@ #1\crcr\mathstrut\crcr\noalign{\kern-\baselineskip}}}% \,} -\def\pmatrix#1% +\unexpanded\def\pmatrix#1% {\left(\matrix{#1}\right)} \newdimen\mathparentwd % \setbox0=\hbox{\tenex B} \mathparentwd=\wd0 % width of the big left ( -\def\bordermatrix#1% +\unexpanded\def\bordermatrix#1% {\begingroup \mathsurround\zeropoint \setbox\zerocount\vbox @@ -275,7 +275,7 @@ % \advance\baselineskip\dimen@ % \advance\lineskiplimit\dimen@} -\def\openup +\unexpanded\def\openup {\afterassignment\doopenup\scratchdimen=} \def\doopenup @@ -287,7 +287,7 @@ \def\displayopenupvalue{.25\bodyfontsize} -\def\eqalign#1% +\unexpanded\def\eqalign#1% {\emptyhbox \,% \vcenter @@ -302,14 +302,14 @@ {\tabskip\zeroskip \everycr{}} -\def\displaylines#1% +\unexpanded\def\displaylines#1% {\displ@y \tabskip\zeroskip \halign {\hbox to \displaywidth{$\@lign\hfil\displaystyle##\hfil$}\crcr #1\crcr}} -\def\eqalignno#1% +\def\eqalignno#1% \unexpanded (needs testing in alignments) {\displ@y \tabskip\centering \halign to \displaywidth @@ -318,7 +318,7 @@ &\llap{$\@lign##$}\tabskip\zeroskip\crcr #1\crcr}} -\def\leqalignno#1% +\def\leqalignno#1% \unexpanded (needs testing in alignments) {\displ@y \tabskip\centering \halign to \displaywidth diff --git a/tex/context/base/meta-ini.mkiv b/tex/context/base/meta-ini.mkiv index ad4bd768b..9ce75364a 100644 --- a/tex/context/base/meta-ini.mkiv +++ b/tex/context/base/meta-ini.mkiv @@ -49,30 +49,30 @@ \def\startMPdefinitions {\dosinglegroupempty\dostartMPdefinitions} -\long\def\dostartMPdefinitions#1#2\stopMPdefinitions +\def\dostartMPdefinitions#1#2\stopMPdefinitions {\edef\currentMPgraphicinstance{#1}% \ifx\currentMPgraphicinstance\empty \let\currentMPgraphicinstance\defaultMPgraphicinstance \fi \global\MPinstancetoks\expandafter{\the\MPinstancetoks#2}} -\long\def\startMPextensions#1\stopMPextensions +\def\startMPextensions#1\stopMPextensions {\global\MPextensions\expandafter{\the\MPextensions#1}} -\long\def\startMPinitializations#1\stopMPinitializations +\def\startMPinitializations#1\stopMPinitializations {\global\MPinitializations\expandafter{\the\MPinitializations#1}} -\long\def\startMPinclusions +\def\startMPinclusions {\dosingleempty\dostartMPinclusions} -\long\def\dostartMPinclusions[#1]#2\stopMPinclusions +\def\dostartMPinclusions[#1]#2\stopMPinclusions {\doifnot{#1}{+}{\global\MPuserinclusions\emptytoks}% \global\MPuserinclusions\expandafter{\the\MPuserinclusions#2}} \def\MPinclusions {\dosingleempty\doMPinclusions} -\long\def\doMPinclusions[#1]#2% +\def\doMPinclusions[#1]#2% {\doifnot{#1}{+}{\global\MPuserinclusions\emptytoks}% \global\MPuserinclusions\expandafter{\the\MPuserinclusions#2}} @@ -162,7 +162,7 @@ {\global\MPinstancetoks\emptytoks \endgroup} -\unexpanded\long\def\processMPgraphic#1% todo: extensions and inclusions outside beginfig +\unexpanded\def\processMPgraphic#1% todo: extensions and inclusions outside beginfig {\dostartcurrentMPgraphic \forgetall \setbox\MPgraphicbox\hbox\bgroup % ; added 20100901 (as in mkii) @@ -229,29 +229,29 @@ \def\startMPdrawing {\dosingleempty\dostartMPdrawing} -\long\def\dostartMPdrawing[#1]#2\stopMPdrawing +\def\dostartMPdrawing[#1]#2\stopMPdrawing {\relax \bgroup \enableincludeMPgraphics \presetMPdefinitions % in case #2 has measures - \doifelse{#1}{-}{\convertargument#2\to\asciia}{\long\def\asciia{#2}}% - \long\xdef\MPdrawingdata{\MPdrawingdata\asciia}% + \doifelse{#1}{-}{\convertargument#2\to\asciia}{\def\asciia{#2}}% + \xdef\MPdrawingdata{\MPdrawingdata\asciia}% \egroup} \let\stopMPdrawing\relax -\long\def\MPdrawing#1% +\def\MPdrawing#1% {\relax \bgroup \enableincludeMPgraphics \presetMPdefinitions - \long\xdef\MPdrawingdata{\MPdrawingdata#1}% + \xdef\MPdrawingdata{\MPdrawingdata#1}% \egroup} \let\stopMPclip\relax -\long\def\startMPclip#1#2\stopMPclip % todo: store at the lua end or just store less - {\long\setgvalue{MPC:#1}{#2}} +\def\startMPclip#1#2\stopMPclip % todo: store at the lua end or just store less + {\setgvalue{MPC:#1}{#2}} \def\grabMPclippath#1#2#3#4#5% #5 is alternative {\begingroup @@ -454,7 +454,7 @@ \xdef\MPury{#5}% \hbox{\forcecolorhack\getobject{MP}{#1}}} % else no proper color intent -\long\def\handleuniqueMPgraphic#1#2#3% +\def\handleuniqueMPgraphic#1#2#3% {\begingroup \def\@@meta{#1:}% \extendMPoverlaystamp{#2}% incl prepare @@ -467,11 +467,11 @@ \getvalue{\@@MPG\overlaystamp:#1}% \endgroup} -\long\unexpanded\def\startuniqueMPgraphic +\unexpanded\def\startuniqueMPgraphic {\dodoublegroupempty\dostartuniqueMPgraphic} -\long\def\dostartuniqueMPgraphic#1#2#3\stopuniqueMPgraphic% - {\long\setgvalue{\@@MPG#1}{\handleuniqueMPgraphic{#1}{#2}{#3}}} +\def\dostartuniqueMPgraphic#1#2#3\stopuniqueMPgraphic% + {\setgvalue{\@@MPG#1}{\handleuniqueMPgraphic{#1}{#2}{#3}}} \unexpanded\def\uniqueMPgraphic {\dodoublegroupempty\douniqueMPgraphic} @@ -484,7 +484,7 @@ \let\stopuniqueMPcode \relax % so that we can use it in \expanded -\long\def\handleuseMPgraphic#1#2#3% +\def\handleuseMPgraphic#1#2#3% {\begingroup \def\@@meta{#1:}% \prepareMPvariables{#2}% @@ -492,22 +492,22 @@ \processMPgraphic{#3}% \endgroup} -\long\unexpanded\def\startuseMPgraphic +\unexpanded\def\startuseMPgraphic {\dodoublegroupempty\dostartuseMPgraphic} -\long\def\dostartuseMPgraphic#1#2#3\stopuseMPgraphic - {\long\setgvalue{\@@MPG#1}{\handleuseMPgraphic{#1}{#2}{#3}}} +\def\dostartuseMPgraphic#1#2#3\stopuseMPgraphic + {\setgvalue{\@@MPG#1}{\handleuseMPgraphic{#1}{#2}{#3}}} -\long\unexpanded\def\startusableMPgraphic % redundant but handy +\unexpanded\def\startusableMPgraphic % redundant but handy {\dodoublegroupempty\dostartusableMPgraphic} -\long\def\dostartusableMPgraphic#1#2#3\stopusableMPgraphic - {\long\setgvalue{\@@MPG#1}{\handleuseMPgraphic{#1}{#2}{#3}}} +\def\dostartusableMPgraphic#1#2#3\stopusableMPgraphic + {\setgvalue{\@@MPG#1}{\handleuseMPgraphic{#1}{#2}{#3}}} \let\stopuseMPgraphic \relax % so that we can use it in \expanded \let\stopusableMPgraphic \relax % so that we can use it in \expanded -\long\def\handlereusableMPgraphic#1#2#3% +\def\handlereusableMPgraphic#1#2#3% {\begingroup \def\@@meta{#1:}% \prepareMPvariables{#2}% @@ -518,11 +518,11 @@ \getvalue{\@@MPG#1}% \endgroup} -\long\unexpanded\def\startreusableMPgraphic +\unexpanded\def\startreusableMPgraphic {\dodoublegroupempty\dostartreusableMPgraphic} -\long\def\dostartreusableMPgraphic#1#2#3\stopreusableMPgraphic - {\long\setgvalue{\@@MPG#1}{\handlereusableMPgraphic{#1}{#2}{#3}}} +\def\dostartreusableMPgraphic#1#2#3\stopreusableMPgraphic + {\setgvalue{\@@MPG#1}{\handlereusableMPgraphic{#1}{#2}{#3}}} \let\stopreusableMPgraphic \relax % so that we can use it in \expanded @@ -557,12 +557,12 @@ \def\overlaypagestamp {\MPpageprefix\overlaywidth:\overlayheight:\overlaydepth:\MPcolor\overlaycolor:\MPcolor\overlaylinecolor} -\long\unexpanded\def\startuniqueMPpagegraphic +\unexpanded\def\startuniqueMPpagegraphic {\dodoublegroupempty\dostartuniqueMPpagegraphic} -\long\def\dostartuniqueMPpagegraphic#1#2#3\stopuniqueMPpagegraphic - {\long\setgvalue{\@@MPG o:#1}{\handleuniqueMPgraphic{o:#1}{#2}{#3}}% - \long\setgvalue{\@@MPG e:#1}{\handleuniqueMPgraphic{e:#1}{#2}{#3}}} +\def\dostartuniqueMPpagegraphic#1#2#3\stopuniqueMPpagegraphic + {\setgvalue{\@@MPG o:#1}{\handleuniqueMPgraphic{o:#1}{#2}{#3}}% + \setgvalue{\@@MPG e:#1}{\handleuniqueMPgraphic{e:#1}{#2}{#3}}} \unexpanded\def\uniqueMPpagegraphic {\dodoublegroupempty\douniqueMPpagegraphic} @@ -692,7 +692,7 @@ \def\startMPenvironment % second arg gobbles spaces, so that reset gives \emptytoks {\dodoubleempty\dostartMPenvironment} -\long\def\dostartMPenvironment[#1][#2]#3\stopMPenvironment +\def\dostartMPenvironment[#1][#2]#3\stopMPenvironment {\doif{#1}\s!reset\resetMPenvironment % reset mp toks \doif{#1}\v!global{#3}% % use in main doc too \doif{#1}+{#3}% % use in main doc too @@ -776,7 +776,7 @@ \def\startMPrun {\dosinglegroupempty\dostartMPrun} -\long\def\dostartMPrun#1#2\stopMPrun +\def\dostartMPrun#1#2\stopMPrun {\iffirstargument \startuseMPgraphic{#1}#2\stopuseMPgraphic \else @@ -845,7 +845,7 @@ \def\@@MPT{@MPT@} \def\forceMPTEXgraphic - {\long\def\checkMPTEXgraphic##1{\global\MPTEXgraphictrue}} + {\def\checkMPTEXgraphic##1{\global\MPTEXgraphictrue}} \def\setMPtext#1#2% todo : #1 must be made : safe {%\forceMPTEXgraphic @@ -998,7 +998,7 @@ %D \macros %D {startMPcolor} -\long\unexpanded\def\startMPcolor#1\stopMPcolor +\unexpanded\def\startMPcolor#1\stopMPcolor {\writestatus \m!metapost % eventually this placeholder will go away {\string\startMPcolor...\stopMPcolor\space is obsolete,\space use \string\defineintermediatecolor\space instead}} @@ -1077,7 +1077,7 @@ %D %D \typebuffer \getbuffer -\def\usestaticMPfigure +\unexpanded\def\usestaticMPfigure {\dodoubleempty\dousestaticMPfigure} \def\dousestaticMPfigure[#1][#2]% @@ -1090,11 +1090,11 @@ \unexpanded\def\startstaticMPfigure#1#2\stopstaticMPfigure {\startreusableMPgraphic{\@@MPG#1@S@}#2\stopreusableMPgraphic} -\long\unexpanded\def\startstaticMPgraphic +\unexpanded\def\startstaticMPgraphic {\dodoublegroupempty\dostartstaticMPgraphic} -\long\def\dostartstaticMPgraphic#1#2#3\stopstaticMPgraphic - {\long\setgvalue{\@@MPG#1@S@}{\handlereusableMPgraphic{#1}{#2}{#3}}} +\def\dostartstaticMPgraphic#1#2#3\stopstaticMPgraphic + {\setgvalue{\@@MPG#1@S@}{\handlereusableMPgraphic{#1}{#2}{#3}}} %D New: diff --git a/tex/context/base/meta-pag.mkiv b/tex/context/base/meta-pag.mkiv index 60f7d7830..19051e872 100644 --- a/tex/context/base/meta-pag.mkiv +++ b/tex/context/base/meta-pag.mkiv @@ -97,7 +97,7 @@ %D zero (overlay). \appendtoks - \freezeMPpagelayout + \freezeMPpagelayout \to \everybeforepagebody %D By freezing these value every graphic, we can use layout @@ -105,9 +105,9 @@ %D has. \prependtoks - \calculatereducedvsizes % this is really needed - \freezeMPpagelayout - \freezeMPlayout % to be used grouped + \calculatereducedvsizes % this is really needed + \freezeMPpagelayout + \freezeMPlayout % to be used grouped \to \everyMPgraphic %D The next feature provides information about for instance @@ -137,6 +137,8 @@ % optimaliseren voor herhaling +\newif\iftracetextareas + \def\registerMPtextarea#1% {\ifpositioning \bgroup diff --git a/tex/context/base/mult-aux.mkiv b/tex/context/base/mult-aux.mkiv index 453661d19..24b1aa6c5 100644 --- a/tex/context/base/mult-aux.mkiv +++ b/tex/context/base/mult-aux.mkiv @@ -25,18 +25,18 @@ %D \unprotect %D \def\????aa{@@@@aa} %D -%D \installparameterhandler \????aa {whatever} -%D \installsetuphandler \????aa {whatever} -%D \installdefinehandler \????aa {whatever} \????aa % #3 == defaultroot -%D \installattributehandler \????aa {whatever} +%D \installparameterhandler \????aa {whatever} +%D \installsetuphandler \????aa {whatever} +%D \installdefinehandler \????aa {whatever} \????aa % #3 == defaultroot +%D \installfontandcolorhandler\????aa {whatever} %D -%D % \installcommandhandler \????aa {whatever} \????aa +%D % \installcommandhandler \????aa {whatever} \????aa %D \protect %D %D % \whateverparameter \c!test %D % \whateverparameterhash \c!test %D % \namedwhateverparameter \mycurrentwhatever \c!test -%D % \dosetwhateverattributes \c!style \c!color +%D % \dosetwhateverstyleandcolor \c!style \c!color %D % \everydefinewhatever (sets \currentwhatever) %D % \everypresetwhatever (can be used to reset parameters as we can redefine) %D % \everysetupwhatever (sets \currentwhatever) @@ -64,12 +64,71 @@ % todo: add (relaxed) postsetup and postdefine hooks, just after the everys -\unexpanded\def\doinstallparameterhandler#1#2#3#4#5#6#7#8#9% - {\ifx#2\relax\let#2\empty\fi - \def#3##1{\csname#4{#1#2}{##1}\endcsname}% +% Start of experimental code: especially tables can have many assignments +% and although most time is spent in the typesetting anyway, we can squeeze +% out a little bit. Of course having 500 rows of 50 columns each with some +% setting does not happen that often. One should keep in mind that in the +% average document having some 500 assignments is no exception but there we're +% talking of neglectable runtime for them. Of course in the definitions below +% there is no real gain, only in the generated \setup* commands. Another +% situation with many assignments is \XML\ where we can pass attributes +% and normally don't do testing of them making sense. +% +% \testfeatureonce{100000}{\getparameters[bla][a=111,b=222,c=333]}% 1.669s +% \testfeatureonce{100000}{\get_parameters{bla} [a=111,b=222,c=333]}% 1.529s +% \testfeatureonce{100000}{\def\current_parameter_namespace{bla}\get_parameters_indeed[a=111,b=222,c=333]}% 1.466s +% +% \get_parameter {...} [...] +% \def\current_parameter_namespace{...} \get_parameter_indeed[...] + +\def\get_parameters#1[#2% + {\if\noexpand#2]% + \expandafter\gobbleoneargument + \else + \def\current_parameter_namespace{#1}% + \expandafter\get_parameters_indeed + \fi#2} + +% \def\get_parameters#1% we can assume that the test already happened +% {\def\current_parameter_namespace{#1}% +% \get_parameters_indeed} + +\def\get_parameters_indeed#1]% namespace already set + {\get_parameters_item#1,],\@relax@} + +\def\get_parameters_item#1,#2% #2 takes space before , + {\if,#1,% dirty trick for testing #1=empty + \expandafter\get_parameters_item + \else\if]#1% + \doubleexpandafter\gobbleoneargument + \else + \get_parameters_assign#1==\empty\@relax@ + \doubleexpandafter\get_parameters_item + \fi\fi#2} + +\def\get_parameters_error#1#2#3% + {\showassignerror{#2}{\the\inputlineno\space(#1)}} + +\def\get_parameters_assign#1=#2=#3#4\@relax@ + {\ifx\empty#1\empty + \expandafter\get_parameters_error + \else\ifx#3\empty + \doubleexpandafter\get_parameters_error + \else + \doubleexpandafter\dosetvalue + \fi\fi + \current_parameter_namespace{#1}{#2}} + +% End of experimental code. + +\unexpanded\def\doinstallparameterhandler#1#2#3#4#5#6#7#8#9% inlining \csname*\endcsname is more efficient (#3 and #6 only) + {\ifx#2\relax\let#2\empty\fi % it is hardly faster but produces less expansion tracing + %\def#3##1{\csname#4{#1#2}{##1}\endcsname}% + \def#3##1{\csname\ifcsname#1#2:##1\endcsname#1#2:##1\else\expandafter#5\csname#1#2:\s!parent\endcsname{##1}\fi\endcsname}% \def#4##1##2{\ifcsname##1:##2\endcsname##1:##2\else\expandafter#5\csname##1:\s!parent\endcsname{##2}\fi}% \def#5##1##2{\ifx##1\relax\s!empty\else#4{##1}{##2}\fi}% is {} needed around ##1 ? - \def#6##1##2{\csname#4{#1##1}{##2}\endcsname}% + %\def#6##1##2{\csname#4{#1##1}{##2}\endcsname}% + \def#6##1##2{\csname\ifcsname#1##1:##2\endcsname#1##1:##2\else\expandafter#5\csname#1##1:\s!parent\endcsname{##2}\fi\endcsname}% \def#7##1{\detokenize\expandafter\expandafter\expandafter{\csname#1#2:##1\endcsname}}% always root, no backtrack \def#8##1{\csname\ifcsname#1#2:##1\endcsname#1#2:##1\else\s!empty\fi\endcsname}% \def#9##1{\csname#1#2:##1\endcsname}} @@ -106,7 +165,7 @@ \def#6{#1#2:}% \def#7##1{#1##1:}% \def#8{\ifx#2\empty\else\ifcsname#1#2:\s!parent\endcsname\else\expandafter\let\csname#1#2:\s!parent\endcsname#1\fi\fi}% - \def#9##1{\expandafter\edef\csname#1##1:\s!parent\endcsname{#1#2}}} + \unexpanded\def#9##1{\expandafter\edef\csname#1##1:\s!parent\endcsname{#1#2}}} \unexpanded\def\installparameterhashhandler#1#2% @@ -147,26 +206,32 @@ \expandafter\noexpand\csname let#2parameter\endcsname \expandafter\noexpand\csname reset#2parameter\endcsname}} -\unexpanded\def\doinstallattributehandler#1#2#3#4% +\let\dousecurrentstyleparameter\relax +\let\dousecurrentcolorparameter\relax + +\let\currentstyleparameter\empty +\let\currentcolorparameter\empty + +\unexpanded\def\doinstallstyleandcolorhandler#1#2#3#4% {\unexpanded\def#2##1##2% style color - {\edef\fontattributehash {#1{##1}}% this name is public - \edef\colorattributehash{#1{##2}}% this name is public - \ifx\fontattributehash \empty\else\dosetfontattribute \fontattributehash {##1}\fi - \ifx\colorattributehash\empty\else\dosetcolorattribute\colorattributehash{##2}\fi}% + {\edef\currentstyleparameter{#1{##1}}% this name is public + \edef\currentcolorparameter{#1{##2}}% this name is public + \ifx\currentstyleparameter\empty\else\dousecurrentstyleparameter\fi + \ifx\currentcolorparameter\empty\else\dousecurrentcolorparameter\fi}% \unexpanded\def#3##1% style - {\edef\fontattributehash {#1{##1}}% this name is public - \ifx\fontattributehash \empty\else\dosetfontattribute \fontattributehash {##1}\fi}% + {\edef\currentstyleparameter{#1{##1}}% this name is public + \ifx\currentstyleparameter\empty\else\dousecurrentstyleparameter\fi}% \unexpanded\def#4##1% color - {\edef\colorattributehash{#1{##1}}% this name is public - \ifx\colorattributehash\empty\else\dosetcolorattribute\colorattributehash{##1}\fi}} + {\edef\currentcolorparameter{#1{##1}}% this name is public + \ifx\currentcolorparameter\empty\else\dousecurrentcolorparameter\fi}} -\unexpanded\def\installattributehandler#1#2% +\unexpanded\def\installstyleandcolorhandler#1#2% {\normalexpanded - {\doinstallattributehandler - \expandafter\noexpand\csname #2parameterhash\endcsname - \expandafter\noexpand\csname doset#2attributes\endcsname - \expandafter\noexpand\csname doset#2fontattribute\endcsname - \expandafter\noexpand\csname doset#2colorattribute\endcsname}} + {\doinstallstyleandcolorhandler + \expandafter\noexpand\csname #2parameter\endcsname + \expandafter\noexpand\csname use#2styleandcolor\endcsname % maybe an alias use#2styleandcolorparameters + \expandafter\noexpand\csname use#2styleparameter\endcsname + \expandafter\noexpand\csname use#2colorparameter\endcsname}} \let\definehandlerparent\empty @@ -181,16 +246,20 @@ \the#6% predefine \ifthirdargument \edef#8{##2}% - \getparameters[#1#4:][\s!parent=#1##2,##3]% + % \getparameters[#1#4:][\s!parent=#1##2,##3]% + \get_parameters{#1#4:}[\s!parent=#1##2,##3]% \else\ifsecondargument \doifassignmentelse{##2} {\let#8\empty - \getparameters[#1#4:][\s!parent=#3,##2]} + % \getparameters[#1#4:][\s!parent=#3,##2]} + \get_parameters{#1#4:}[\s!parent=#3,##2]} {\edef#8{##2}% - \getparameters[#1#4:][\s!parent=#1##2]}% + % \getparameters[#1#4:][\s!parent=#1##2]}% + \get_parameters{#1#4:}[\s!parent=#1##2]}% \else \let#8\empty - \getparameters[#1#4:][\s!parent=#3]% + % \getparameters[#1#4:][\s!parent=#3]% + \get_parameters{#1#4:}[\s!parent=#3]% \fi\fi \the#7% \let#4\saveddefinewhatever}} @@ -210,19 +279,22 @@ \unexpanded\def\doinstallsetuphandler#1#2#3#4#5#6% {\ifx#3\relax\let#3\empty\fi \unexpanded\def#2{\dodoubleempty#4}% - \unexpanded\def#6{\getparameters[#1#3:]}% no every ! don't change it + % \unexpanded\def#6{\getparameters[#1#3:]}% no every ! don't change it + \unexpanded\def#6{\get_parameters{#1#3:}}% no every ! don't change it \newtoks#5% \def#4[##1][##2]% maybe helper {\let\savedsetupwhatever#3% \ifsecondargument \def\docommand####1% we will have a simple one as well {\edef#3{####1}% - \getparameters[#1#3:][##2]% + % \getparameters[#1#3:][##2]% + \get_parameters{#1#3:}[##2]% \the#5}% \processcommalist[##1]\docommand \else \let#3\empty - \getparameters[#1:][##1]% + % \getparameters[#1:][##1]% + \get_parameters{#1:}[##1]% \the#5% \fi \let#3\savedsetupwhatever}} @@ -240,20 +312,23 @@ \unexpanded\def\doinstallswitchsetuphandler#1#2#3#4#5#6% {\ifx#3\relax\let#3\empty\fi \unexpanded\def#2{\dodoubleempty#4}% - \unexpanded\def#6{\getparameters[#1#3:]}% + % \unexpanded\def#6{\getparameters[#1#3:]}% + \unexpanded\def#6{\get_parameters{#1#3:}}% \newtoks#5% \def#4[##1][##2]% maybe helper {\ifsecondargument % no commalist here \let\savedsetupwhatever#3% \edef#3{##1}% - \getparameters[#1#3:][##2]% + % \getparameters[#1#3:][##2]% + \get_parameters{#1#3:}[##2]% \the#5% \let#3\savedsetupwhatever \else\iffirstargument \doifassignmentelse{##1} {\let\savedsetupwhatever#3% \let#3\empty - \getparameters[#1:][##1]% + % \getparameters[#1:][##1]% + \get_parameters{#1:}[##1]% \the#5% \let#3\savedsetupwhatever} {\edef#3{##1}% this will catch reset @@ -276,25 +351,29 @@ \unexpanded\def\doinstallautosetuphandler#1#2#3#4#5#6% {\ifx#3\relax\let#3\empty\fi \unexpanded\def#2{\dotripleempty#4}% - \unexpanded\def#6{\getparameters[#1#3:]}% + % \unexpanded\def#6{\getparameters[#1#3:]}% + \unexpanded\def#6{\get_parameters{#1#3:}}% \newtoks#5% \def#4[##1][##2][##3]% {\let\savedsetupwhatever#3% \ifthirdargument \def\docommand####1% {\edef#3{####1}% - \getparameters[#1#3:][\s!parent=#1##2,##3]% + % \getparameters[#1#3:][\s!parent=#1##2,##3]% + \get_parameters{#1#3:}[\s!parent=#1##2,##3]% \the#5}% \processcommalist[##1]\docommand \else\ifsecondargument \def\docommand####1% {\edef#3{####1}% - \getparameters[#1#3:][##2]% + % \getparameters[#1#3:][##2]% + \get_parameters{#1#3:}[##2]% \the#5}% \processcommalist[##1]\docommand \else \let#3\empty - \getparameters[#1:][##1]% + % \getparameters[#1:][##1]% + \get_parameters{#1:}[##1]% \the#5% \fi\fi \let#3\savedsetupwhatever}} @@ -309,7 +388,7 @@ \expandafter\noexpand\csname everysetup#2\endcsname \expandafter\noexpand\csname setupcurrent#2\endcsname}} -\def\installbasicparameterhandler#1#2% +\unexpanded\def\installbasicparameterhandler#1#2% {\installparameterhandler {#1}{#2}% \installparameterhashhandler{#1}{#2}% \installparametersethandler {#1}{#2}% @@ -319,24 +398,24 @@ {\installbasicparameterhandler{#1}{#2}% \installdefinehandler {#1}{#2}{#3}% \installsetuphandler {#1}{#2}% - \installattributehandler {#1}{#2}} + \installstyleandcolorhandler {#1}{#2}} \unexpanded\def\installswitchcommandhandler#1#2#3% \??self name \??parent (can be \??self) {\installbasicparameterhandler{#1}{#2}% \installdefinehandler {#1}{#2}{#3}% \installswitchsetuphandler {#1}{#2}% - \installattributehandler {#1}{#2}} + \installstyleandcolorhandler {#1}{#2}} \unexpanded\def\installautocommandhandler#1#2#3% automatically defined cloned setups {\installbasicparameterhandler{#1}{#2}% \installdefinehandler {#1}{#2}{#3}% \installautosetuphandler {#1}{#2}% - \installattributehandler {#1}{#2}} + \installstyleandcolorhandler {#1}{#2}} -\unexpanded\def\installsimplecommandhandler#1#2#3% no define (experiment) +\unexpanded\def\installsimplecommandhandler#1#2#3% no define (experiment) - use \check*parent when defining {\installbasicparameterhandler{#1}{#2}% \installsetuphandler {#1}{#2}% - \installattributehandler {#1}{#2}} + \installstyleandcolorhandler {#1}{#2}} \unexpanded\def\installnamespace#1% {\setvalue{????#1}{@@@@#1}} @@ -394,8 +473,8 @@ \def\doshowparentchain#1% {#1 => % - \ifcsname#1\s!parent\endcsname - \expandafter\doshowparentchain\csname#1\s!parent\endcsname + \ifcsname#1:\s!parent\endcsname + \expandafter\doshowparentchain\csname#1:\s!parent\endcsname \fi} \def\showparentchain#1#2% diff --git a/tex/context/base/mult-de.mkii b/tex/context/base/mult-de.mkii index bfddfb0d9..01c98ef8b 100644 --- a/tex/context/base/mult-de.mkii +++ b/tex/context/base/mult-de.mkii @@ -1166,7 +1166,7 @@ \setinterfacecommand{defineframedtext}{definiereumrahmtertext} \setinterfacecommand{definehbox}{definierehbox} \setinterfacecommand{definehead}{definiereueberschrift} -\setinterfacecommand{defineindenting}{definiereeinzug} +\setinterfacecommand{defineindentedtext}{defineindentedtext} \setinterfacecommand{defineinmargin}{defineinmargin} \setinterfacecommand{defineinteractionmenu}{definiereinteraktionsmenue} \setinterfacecommand{defineitemgroup}{defineitemgroup} @@ -1477,7 +1477,7 @@ \setinterfacecommand{setupheads}{stelleueberschriftenein} \setinterfacecommand{setupheadtext}{stelleueberschrifttextein} \setinterfacecommand{setuphyphenmark}{stellebindestrichein} -\setinterfacecommand{setupindentations}{stelleeinzuegein} +\setinterfacecommand{setupindentedtext}{setupindentedtext} \setinterfacecommand{setupindenting}{stelleeinziehenein} \setinterfacecommand{setupinmargin}{stelleinmarginalieein} \setinterfacecommand{setupinteraction}{stelleinteraktionein} diff --git a/tex/context/base/mult-def.lua b/tex/context/base/mult-def.lua index 7dab4eaa6..74d2584ac 100644 --- a/tex/context/base/mult-def.lua +++ b/tex/context/base/mult-def.lua @@ -920,15 +920,9 @@ return { ["pe"]="تعریفسر", ["ro"]="definesteantet", }, - ["defineindenting"]={ - ["cs"]="definujodsazovani", - ["de"]="definiereeinzug", - ["en"]="defineindenting", - ["fr"]="definitcompoalinea", - ["it"]="definiscirientro", - ["nl"]="doorspringen", - ["pe"]="تعریفتورفتگی", - ["ro"]="definestealiat", + ["defineindentedtext"]={ + ["en"]="defineindentedtext", + ["nl"]="definieeringesprongentext", }, ["defineinmargin"]={ ["cs"]="defineinmargin", @@ -4030,15 +4024,9 @@ return { ["pe"]="بارگذارینشانهشکستن", ["ro"]="seteazaliniesilabe", }, - ["setupindentations"]={ - ["cs"]="nastavodsazeni", - ["de"]="stelleeinzuegein", - ["en"]="setupindentations", - ["fr"]="reglealineas", - ["it"]="impostarientri", - ["nl"]="steldoorspringenin", - ["pe"]="بارگذاریتورفتگیها", - ["ro"]="seteazaaliniate", + ["setupindentedtext"]={ + ["en"]="setupindentedtext", + ["nl"]="stelingesprongentextin", }, ["setupindenting"]={ ["cs"]="nastavodsazovani", diff --git a/tex/context/base/mult-en.mkii b/tex/context/base/mult-en.mkii index 587b82b78..9610c4b13 100644 --- a/tex/context/base/mult-en.mkii +++ b/tex/context/base/mult-en.mkii @@ -1166,7 +1166,7 @@ \setinterfacecommand{defineframedtext}{defineframedtext} \setinterfacecommand{definehbox}{definehbox} \setinterfacecommand{definehead}{definehead} -\setinterfacecommand{defineindenting}{defineindenting} +\setinterfacecommand{defineindentedtext}{defineindentedtext} \setinterfacecommand{defineinmargin}{defineinmargin} \setinterfacecommand{defineinteractionmenu}{defineinteractionmenu} \setinterfacecommand{defineitemgroup}{defineitemgroup} @@ -1477,7 +1477,7 @@ \setinterfacecommand{setupheads}{setupheads} \setinterfacecommand{setupheadtext}{setupheadtext} \setinterfacecommand{setuphyphenmark}{setuphyphenmark} -\setinterfacecommand{setupindentations}{setupindentations} +\setinterfacecommand{setupindentedtext}{setupindentedtext} \setinterfacecommand{setupindenting}{setupindenting} \setinterfacecommand{setupinmargin}{setupinmargin} \setinterfacecommand{setupinteraction}{setupinteraction} diff --git a/tex/context/base/mult-fr.mkii b/tex/context/base/mult-fr.mkii index 6be307377..62593922e 100644 --- a/tex/context/base/mult-fr.mkii +++ b/tex/context/base/mult-fr.mkii @@ -1166,7 +1166,7 @@ \setinterfacecommand{defineframedtext}{defineframedtext} \setinterfacecommand{definehbox}{definithbox} \setinterfacecommand{definehead}{definittete} -\setinterfacecommand{defineindenting}{definitcompoalinea} +\setinterfacecommand{defineindentedtext}{defineindentedtext} \setinterfacecommand{defineinmargin}{definitdansmarge} \setinterfacecommand{defineinteractionmenu}{definitmenuinteraction} \setinterfacecommand{defineitemgroup}{defineitemgroup} @@ -1477,7 +1477,7 @@ \setinterfacecommand{setupheads}{regletetes} \setinterfacecommand{setupheadtext}{regletextetete} \setinterfacecommand{setuphyphenmark}{reglemarquagehyphenation} -\setinterfacecommand{setupindentations}{reglealineas} +\setinterfacecommand{setupindentedtext}{setupindentedtext} \setinterfacecommand{setupindenting}{reglecomposeenalinea} \setinterfacecommand{setupinmargin}{regledansmarge} \setinterfacecommand{setupinteraction}{regleinteraction} diff --git a/tex/context/base/mult-ini.mkiv b/tex/context/base/mult-ini.mkiv index bb7e5b514..658716e31 100644 --- a/tex/context/base/mult-ini.mkiv +++ b/tex/context/base/mult-ini.mkiv @@ -373,10 +373,12 @@ \def\nostartmessages#1#2\stopmessages {\egroup} -\def\setinterfacemessage#1#2#3% +\unexpanded\def\setinterfacemessage#1#2#3% {\ifcsname\m!prefix!#1\endcsname\else\setgvalue{\m!prefix!#1}{#1}\fi \ctxlua{interfaces.setmessage("#1","#2",\!!bs#3\!!es)}} +\let\stopmessages\relax + \unexpanded\def\setmessagetext #1#2{\edef\currentmessagetext{\cldcontext{interfaces.getmessage("#1","#2")}}} \unexpanded\def\getmessage #1#2{\cldcontext{interfaces.getmessage("#1","#2")}} @@ -408,14 +410,14 @@ \let\normalshowmessage\showmessage -\def\showwarning +\unexpanded\def\showwarning {\ifshowwarnings \expandafter\showmessage \else \expandafter\gobblethreearguments \fi} -\def\showmessage +\unexpanded\def\showmessage {\ifshowmessages \expandafter\normalshowmessage \else @@ -435,22 +437,22 @@ %D interface. (We no longer need the link back to the main %D internal interface.) -\def\doresetvalue #1#2{\dosetvalue{#1}{#2}{}} -\def\doignorevalue#1#2#3{\dosetvalue{#1}{#2}{}} +\unexpanded\def\doresetvalue #1#2{\dosetvalue{#1}{#2}{}} +\unexpanded\def\doignorevalue#1#2#3{\dosetvalue{#1}{#2}{}} -\def\doletvalue #1#2{\@EA \let\csname#1#2\endcsname} -\def\dosetvalue #1#2{\@EA \def\csname#1#2\endcsname} -\def\dosetevalue #1#2{\@EA\edef\csname#1#2\endcsname} -\def\dosetgvalue #1#2{\@EA\gdef\csname#1#2\endcsname} -\def\dosetxvalue #1#2{\@EA\xdef\csname#1#2\endcsname} -\def\docopyvalue#1#2#3{\@EA \def\csname#1#3\@EA\endcsname\@EA{\csname#2#3\endcsname}} +\unexpanded\def\doletvalue #1#2{\@EA \let\csname#1#2\endcsname} +\unexpanded\def\dosetvalue #1#2{\@EA \def\csname#1#2\endcsname} +\unexpanded\def\dosetevalue #1#2{\@EA\edef\csname#1#2\endcsname} +\unexpanded\def\dosetgvalue #1#2{\@EA\gdef\csname#1#2\endcsname} +\unexpanded\def\dosetxvalue #1#2{\@EA\xdef\csname#1#2\endcsname} +\unexpanded\def\docopyvalue#1#2#3{\@EA \def\csname#1#3\@EA\endcsname\@EA{\csname#2#3\endcsname}} %D We can now redefine some messages that will be %D introduced in the multi||lingual system module. -\def\showassignerror #1#2{\showmessage\m!check1{#1,#2}\waitonfatalerror} -\def\showargumenterror#1#2{\showmessage\m!check2{#1,#2}\waitonfatalerror} -\def\showdefinederror #1#2{\showmessage\m!check3{#1,#2}\waitonfatalerror} +\unexpanded\def\showassignerror #1#2{\showmessage\m!check1{#1,#2}\waitonfatalerror} +\unexpanded\def\showargumenterror#1#2{\showmessage\m!check2{#1,#2}\waitonfatalerror} +\unexpanded\def\showdefinederror #1#2{\showmessage\m!check3{#1,#2}\waitonfatalerror} %D \CONTEXT\ is a parameter driven package. This means that %D users instruct the system by means of variables, values and @@ -708,11 +710,11 @@ % temporary mkiv hack (we can best just store the whole table in memory) -\def\setinterfaceconstant#1#2% +\unexpanded\def\setinterfaceconstant#1#2% {\ctxlua{interfaces.setconstant("#1","#2")}% \setvalue{\c!prefix!#1}{#1}} -\def\setinterfacevariable#1#2% +\unexpanded\def\setinterfacevariable#1#2% {\ctxlua{interfaces.setvariable("#1","#2")}% \setvalue{\v!prefix!#1}{#2}} @@ -741,7 +743,7 @@ %D problem, because we just define two elements. When no second %D part is needed, we use a \type{-}: -\def\setinterfaceelement#1#2% +\unexpanded\def\setinterfaceelement#1#2% {\ctxlua{interfaces.setelement("#1","#2")}% \ifcsname\e!prefix!#1\endcsname \doifnotvalue{\e!prefix!#1}{#2}{\setvalue{\e!prefix!#1}{#2}}% @@ -749,7 +751,7 @@ \setvalue{\e!prefix!#1}{#2}% \fi} -\def\setinterfacecommand#1#2% +\unexpanded\def\setinterfacecommand#1#2% {\doifnot{#1}{#2}{\@EA\def\csname#2\@EA\endcsname\@EA{\csname#1\endcsname}}}% or just \let ? %D We just ignore these: diff --git a/tex/context/base/mult-it.mkii b/tex/context/base/mult-it.mkii index 371a3bb00..de04a8ede 100644 --- a/tex/context/base/mult-it.mkii +++ b/tex/context/base/mult-it.mkii @@ -1166,7 +1166,7 @@ \setinterfacecommand{defineframedtext}{definiscitestoincorniciato} \setinterfacecommand{definehbox}{definiscihbox} \setinterfacecommand{definehead}{definiscitesta} -\setinterfacecommand{defineindenting}{definiscirientro} +\setinterfacecommand{defineindentedtext}{defineindentedtext} \setinterfacecommand{defineinmargin}{defineinmargin} \setinterfacecommand{defineinteractionmenu}{definiscimenuinterazione} \setinterfacecommand{defineitemgroup}{defineitemgroup} @@ -1477,7 +1477,7 @@ \setinterfacecommand{setupheads}{impostateste} \setinterfacecommand{setupheadtext}{impostatestointestazioni} \setinterfacecommand{setuphyphenmark}{impostasegnosillabazione} -\setinterfacecommand{setupindentations}{impostarientri} +\setinterfacecommand{setupindentedtext}{setupindentedtext} \setinterfacecommand{setupindenting}{impostarientro} \setinterfacecommand{setupinmargin}{impostainmargine} \setinterfacecommand{setupinteraction}{impostainterazione} diff --git a/tex/context/base/mult-low.lua b/tex/context/base/mult-low.lua index 4c7421568..87581d70f 100644 --- a/tex/context/base/mult-low.lua +++ b/tex/context/base/mult-low.lua @@ -74,7 +74,7 @@ return { "scratchtoks", "globalscratchtoks", "scratchbox", "globalscratchbox", -- - "scratchwidth", "scratchheight", "scratchdepth", + "scratchwidth", "scratchheight", "scratchdepth", "scratchoffset", -- "scratchcounterone", "scratchcountertwo", "scratchcounterthree", "scratchdimenone", "scratchdimentwo", "scratchdimenthree", diff --git a/tex/context/base/mult-nl.mkii b/tex/context/base/mult-nl.mkii index 2484ea818..1cc2a7dd3 100644 --- a/tex/context/base/mult-nl.mkii +++ b/tex/context/base/mult-nl.mkii @@ -1166,7 +1166,7 @@ \setinterfacecommand{defineframedtext}{definieerkadertekst} \setinterfacecommand{definehbox}{definieerhbox} \setinterfacecommand{definehead}{definieerkop} -\setinterfacecommand{defineindenting}{doorspringen} +\setinterfacecommand{defineindentedtext}{definieeringesprongentext} \setinterfacecommand{defineinmargin}{definieerinmarge} \setinterfacecommand{defineinteractionmenu}{definieerinteractiemenu} \setinterfacecommand{defineitemgroup}{definieeritemgroep} @@ -1477,7 +1477,7 @@ \setinterfacecommand{setupheads}{stelkoppenin} \setinterfacecommand{setupheadtext}{stelkoptekstin} \setinterfacecommand{setuphyphenmark}{stelkoppeltekenin} -\setinterfacecommand{setupindentations}{steldoorspringenin} +\setinterfacecommand{setupindentedtext}{stelingesprongentextin} \setinterfacecommand{setupindenting}{stelinspringenin} \setinterfacecommand{setupinmargin}{stelinmargein} \setinterfacecommand{setupinteraction}{stelinteractiein} diff --git a/tex/context/base/mult-pe.mkii b/tex/context/base/mult-pe.mkii index 1ea8fe86a..9244557a8 100644 --- a/tex/context/base/mult-pe.mkii +++ b/tex/context/base/mult-pe.mkii @@ -1166,7 +1166,7 @@ \setinterfacecommand{defineframedtext}{تعریفمتنقالبی} \setinterfacecommand{definehbox}{تعریفجعبهافقی} \setinterfacecommand{definehead}{تعریفسر} -\setinterfacecommand{defineindenting}{تعریفتورفتگی} +\setinterfacecommand{defineindentedtext}{defineindentedtext} \setinterfacecommand{defineinmargin}{تعریفدرونحاشیه} \setinterfacecommand{defineinteractionmenu}{تعریفمنویپانل} \setinterfacecommand{defineitemgroup}{تعریفگروهآیتم} @@ -1477,7 +1477,7 @@ \setinterfacecommand{setupheads}{بارگذاریسرها} \setinterfacecommand{setupheadtext}{بارگذاریمتنسر} \setinterfacecommand{setuphyphenmark}{بارگذارینشانهشکستن} -\setinterfacecommand{setupindentations}{بارگذاریتورفتگیها} +\setinterfacecommand{setupindentedtext}{setupindentedtext} \setinterfacecommand{setupindenting}{بارگذاریتورفتگی} \setinterfacecommand{setupinmargin}{بارگذاریدرونحاشیه} \setinterfacecommand{setupinteraction}{بارگذاریپانل} diff --git a/tex/context/base/mult-ro.mkii b/tex/context/base/mult-ro.mkii index 8cd97a261..89a4af4f8 100644 --- a/tex/context/base/mult-ro.mkii +++ b/tex/context/base/mult-ro.mkii @@ -1166,7 +1166,7 @@ \setinterfacecommand{defineframedtext}{definestetextinconjurat} \setinterfacecommand{definehbox}{definestehbox} \setinterfacecommand{definehead}{definesteantet} -\setinterfacecommand{defineindenting}{definestealiat} +\setinterfacecommand{defineindentedtext}{defineindentedtext} \setinterfacecommand{defineinmargin}{defineinmargin} \setinterfacecommand{defineinteractionmenu}{definestemeniuinteractiune} \setinterfacecommand{defineitemgroup}{defineitemgroup} @@ -1477,7 +1477,7 @@ \setinterfacecommand{setupheads}{seteazatitluri} \setinterfacecommand{setupheadtext}{seteazatexttitlu} \setinterfacecommand{setuphyphenmark}{seteazaliniesilabe} -\setinterfacecommand{setupindentations}{seteazaaliniate} +\setinterfacecommand{setupindentedtext}{setupindentedtext} \setinterfacecommand{setupindenting}{seteazaaliniat} \setinterfacecommand{setupinmargin}{seteazamarginal} \setinterfacecommand{setupinteraction}{seteazainteractiunea} diff --git a/tex/context/base/mult-sys.mkiv b/tex/context/base/mult-sys.mkiv index 051b32ded..5ae28db77 100644 --- a/tex/context/base/mult-sys.mkiv +++ b/tex/context/base/mult-sys.mkiv @@ -643,7 +643,7 @@ \definesystemvariable {pc} % PageComment \definesystemvariable {pe} % PagEhandler \definesystemvariable {pf} % ProFiel -\definesystemvariable {pg} % KoppelPagina +%definesystemvariable {pg} % \definesystemvariable {ph} % ParagrapH \definesystemvariable {pl} % PLaats \definesystemvariable {pn} % PaginaNummer @@ -725,13 +725,16 @@ \definesystemvariable {wl} % WidgetLabel \definesystemvariable {wc} % WidgetContent \definesystemvariable {wt} % WidgetTotal -\definesystemvariable {ws} % WidgetStack +\definesystemvariable {ws} % WidgetStack (not used) \definesystemvariable {wh} % WidgetHelp \definesystemvariable {wp} % WidgetPopuphelp +\definesystemvariable {wz} % whitespace \definesystemvariable {xm} % xml (mkiv) \definesystemvariable {xp} % XML Processing \definesystemvariable {xy} % schaal -\definesystemvariable {za} % ZetspiegelAanpassing +\definesystemvariable {za} % layout adapt % ZetspiegelAanpassing +\definesystemvariable {zc} % columns +\definesystemvariable {zo} % otr %D Next we define some language independant one letter %D variables and keywords. (should become s!) diff --git a/tex/context/base/node-rul.mkiv b/tex/context/base/node-rul.mkiv index 0567a9f29..b093521f9 100644 --- a/tex/context/base/node-rul.mkiv +++ b/tex/context/base/node-rul.mkiv @@ -125,7 +125,7 @@ {\edef\currentbar{#1}% \advance\csname\??on:#1:c\endcsname\plusone % local ? \scratchcounter\csname\??on:#1:c\endcsname - \dosetbarattributes\c!foregroundstyle\c!foregroundcolor + \usebarstyleandcolor\c!foregroundstyle\c!foregroundcolor \attribute\ruledattribute\numexpr 1000*\scratchcounter +\csname\??on#1\ifcsname\??on#1:\number\scratchcounter\s!parent\endcsname:\number\scratchcounter\fi:a\endcsname @@ -266,7 +266,7 @@ \scratchcounter\csname\??ra:#1:c\endcsname \attribute\shiftedattribute\numexpr1000*\scratchcounter +\csname\??ra#1\ifcsname\??ra#1:\number\scratchcounter\s!parent\endcsname:\number\scratchcounter\fi:a\endcsname - \dosetshiftattributes\c!style\c!color + \useshiftstyleandcolor\c!style\c!color \dosetupisolatedalign{\shiftparameter\c!align}} \unexpanded\def\doshifted#1% diff --git a/tex/context/base/pack-bck.mkvi b/tex/context/base/pack-bck.mkvi index c783a17d8..db7cd7bee 100644 --- a/tex/context/base/pack-bck.mkvi +++ b/tex/context/base/pack-bck.mkvi @@ -152,7 +152,7 @@ \ifcase\backgroundsplitmode % no split \backgroundparameter\c!after \else % some split - \vfill\eject % geen \page ! + \page_otr_fill_and_eject_page % no \page ! \fi \else \page diff --git a/tex/context/base/pack-box.mkiv b/tex/context/base/pack-box.mkiv index 9fab9c434..a7a025a15 100644 --- a/tex/context/base/pack-box.mkiv +++ b/tex/context/base/pack-box.mkiv @@ -297,10 +297,11 @@ \setcollector [caption][#1] {\getparameters[\??du][#2]% - \dosetfontattribute\??du\c!style\setupinterlinespace + \dousestyleparameter\@@dustyle + \setupinterlinespace \framed % watch the special setting of kader/overlay - [\c!frame=\v!overlay,#2] - {\doattributes\??du\c!style\c!color{#3}}}% + [\c!frame=\v!overlay,\c!foregroundcolor=\@@ducolor,\c!foregroundstyle=\@@dustyle,#2] + {#3}}% \composedcollector{caption}% \egroup}% \hbox} @@ -342,10 +343,11 @@ [caption] [#1] {\getparameters[\??du][#2]% - \dosetfontattribute\??du\c!style\setupinterlinespace + \dousestyleparameter\@@dustyle + \setupinterlinespace \framed - [\c!frame=\v!overlay,,#2] - {\doattributes\??du\c!style\c!color{#3}}}% + [\c!frame=\v!overlay,\c!foregroundcolor=\@@ducolor,\c!foregroundstyle=\@@dustyle,#2] + {#3}}% \egroup \framed [\c!offset=\v!overlay, @@ -603,8 +605,8 @@ {\forgetall \hsize\@@lxwidth \expanded{\setupalign[\@@lxalign]}% - \dosetfontattribute\??lx\c!style} - {\setlayer[#1][#2]{\strut\color[\@@lxcolor]{\flushnextbox}}% + \dousestyleparameter\@@lxstyle} + {\setlayer[#1][#2]{\strut\dousecolorparameter\@@lxcolor\flushnextbox}% \egroup}% \vtop} diff --git a/tex/context/base/pack-lyr.mkiv b/tex/context/base/pack-lyr.mkiv index f812586ce..69cce43cb 100644 --- a/tex/context/base/pack-lyr.mkiv +++ b/tex/context/base/pack-lyr.mkiv @@ -501,7 +501,7 @@ \if!!donec\box\else\copy\fi\layerbox % sorry for the delay due to copying \fi % todo: method=offset => overlayoffset right/down (handy for backgrounds with offset) - \doifoverlayelse{#2}{\setlayoutcomponentattribute\v!layer{#2}}\resetlayoutcomponentattribute + \doifoverlayelse{#2}{\setlayoutcomponentattribute{\v!layer:#2}}\resetlayoutcomponentattribute \iftracelayers \ruledvbox \else \vbox \fi \if!!donea to \overlayheight \fi \layoutcomponentboxattribute {\hbox \if!!donea to \overlaywidth \fi {\edef\@@currentlayerpageposition{\csname\??ll#2\realfolio\c!position\endcsname}% diff --git a/tex/context/base/pack-mis.mkvi b/tex/context/base/pack-mis.mkvi index f7c506b8e..289b1232c 100644 --- a/tex/context/base/pack-mis.mkvi +++ b/tex/context/base/pack-mis.mkvi @@ -62,7 +62,7 @@ \flushnextbox \placementparameter\c!right}% \ifinsidefloat \else - \addlocalbackgroundtobox\nextbox + \page_backgrounds_add_local_to_box\nextbox \fi \ifgridsnapping \doifinset{\placementparameter\c!margin}{\v!standard,\v!yes}\noindent % unchecked diff --git a/tex/context/base/pack-rul.mkiv b/tex/context/base/pack-rul.mkiv index 80196c098..4c33e44c0 100644 --- a/tex/context/base/pack-rul.mkiv +++ b/tex/context/base/pack-rul.mkiv @@ -307,7 +307,7 @@ \long\def\executedefinedoverlay#1#2% {\bgroup - \setlayoutcomponentattribute\v!overlay{#1}% + \setlayoutcomponentattribute{\v!overlay:#1}% \edef\overlaywidth {\the\frameddimenwd\space}% \edef\overlayheight{\the\dimexpr\frameddimenht+\frameddimendp\relax\space}% \edef\overlaydepth {\the\frameddimendp\space}% @@ -424,7 +424,7 @@ \ifx\component\empty \resetlayoutcomponentattribute \else - \setlayoutcomponentattribute\v!background\component + \setlayoutcomponentattribute{\v!background:\component}% \fi \let\foregroundbox\normalforegroundbox \hbox \layoutcomponentboxattribute to \backgroundwidth % width in case 'foreground' is used as overlay @@ -716,12 +716,12 @@ %D Here is another fast one: -\def\localbackgroundframed#1#2#3#4% tag box wd ht - {\setbox#2\vbox\bgroup - \doinitializeframed{\??ma#1}% - \expandafter\def\csname\??ma#1\c!component\endcsname{#1}% - \expandafter\def\csname\??ma#1\c!width \endcsname{#3}% - \expandafter\def\csname\??ma#1\c!height \endcsname{#4}% +\def\localbackgroundframed#1#2#3#4#5% namespace location box wd ht + {\setbox#3\vbox\bgroup + \doinitializeframed{#1#2}% watch out! am used here + \expandafter\def\csname#1#2\c!component\endcsname{#2}% + % \expandafter\def\csname#1#2\c!width \endcsname{#4}% + % \expandafter\def\csname#1#2\c!height \endcsname{#5}% \!!framedframeoffset\framedparameter\c!frameoffset \edef\@@framedbackgroundoffset{\framedparameter\c!backgroundoffset}% \ifx\@@framedbackgroundoffset\v!frame @@ -729,7 +729,9 @@ \else \!!framedbackgroundoffset\@@framedbackgroundoffset \fi - \setbox\framebox\box#2% + \setbox\framebox\box#3% + \wd\framebox#4% + \ht\framebox#5% \dp\framebox\zeropoint \edef\framedbackground {\framedparameter\c!background}% \edef\framedrulethickness{\framedparameter\c!rulethickness}% @@ -780,11 +782,11 @@ \def\doframedparentparameter#1#2{\ifx#1\relax\doframedrootparameter#2\else\doframedparameter#1{#2}\fi} \def\doframedrootparameter #1{\ifcsname\??oi#1\endcsname\??oi#1\else\s!empty\fi} -\def\dosetframedattributes#1#2% style color - {\edef\fontattributehash {\framedparameterhash#1}% - \edef\colorattributehash{\framedparameterhash#2}% - \ifx\fontattributehash \empty\else\dosetfontattribute \fontattributehash #1\fi - \ifx\colorattributehash\empty\else\dosetcolorattribute\colorattributehash#2\fi} +\def\useframedstyleandcolor#1#2% style color + {\edef\currentstyleparameter{\framedparameter#1}% + \edef\currentcolorparameter{\framedparameter#2}% + \ifx\currentstyleparameter\empty\else\dousestyleparameter\currentstyleparameter\fi + \ifx\currentcolorparameter\empty\else\dousecolorparameter\currentcolorparameter\fi} \def\frameddimension#1{\the\dimexpr\framedparameter{#1}\relax} @@ -957,8 +959,8 @@ % new, experimental dirty hook \framedparameter\c!extras % to get the right spacing - \edef\fontattributehash{\framedparameterhash\c!foregroundstyle}% - \ifx\fontattributehash\empty\else\dosetfontattribute\fontattributehash\c!foregroundstyle\fi + \edef\!!framedforegroundstyle{\framedparameter\c!foregroundstyle}% + \ifx\!!framedforegroundstyle\empty\else\dousestyleparameter\!!framedforegroundstyle\fi % beware, both the frame and background offset can be overruled % \edef\doframedsetups{\framedparameter\c!setups}% @@ -1749,8 +1751,8 @@ \def\framedforgetall{\forgetall} \def\setframedforegroundcolor - {\edef\colorattributehash{\framedparameterhash\c!foregroundcolor}% - \ifx\colorattributehash\empty\else\dosetcolorattribute\colorattributehash\c!foregroundcolor\fi} + {\edef\!!framedforegroundcolor{\framedparameter\c!foregroundcolor}% + \ifx\!!framedforegroundcolor\empty\else\dousecolorparameter\!!framedforegroundcolor\fi} \def\doformatboxSomeFormat {\vbox to \!!framedheight @@ -2826,8 +2828,7 @@ \doif{\framedtextparameter\c!depthcorrection}\v!on\doftstartdepthcorrection \doinhibitblank % \blank[\v!disable]% plaatst signal \setupindenting[\framedtextparameter\c!indenting]% - %\doconvertfont{\framedtextparameter\c!style}\empty} %%%%% todo: attr setter - \dosetframedtextattributes\c!style\c!color} + \useframedtextstyleandcolor\c!style\c!color} %D The \type {none} option is handy for nested usage, as %D in the presentation styles, where we don't want @@ -2860,7 +2861,7 @@ \def\checkframedtext % messy dependency {\ifinsidefloat \localhsize\hsize - \else\ifdim\sidefloatvsize>\zeropoint % will be proper handle + \else\ifdim\d_page_sides_vsize>\zeropoint % also possible: \c_page_sides_checks_done>\zeropoint % \strut % rather clean way to invoke the sidefloat OTR % \setbox0=\lastbox % and get the widths set, so from now on we % \setlocalhsize % can have framed texts alongside sidefloats @@ -2935,7 +2936,7 @@ \blank[\v!disable]% \let\\=\endgraf \framedtextparameter\c!inner - \dosetframedtextattributes\c!style\c!color + \useframedtextstyleandcolor\c!style\c!color \bgroup \aftergroup\docloseframedtext \let\next=} @@ -3088,11 +3089,19 @@ \dimen6\dimexpr-.5ex+.5\linewidth\relax \doifsomething{#1} {\doifelse\@@tllocation\v!inmargin - {\llap{\doattributes\??tl\c!style\c!color{#1}\hskip\leftmargindistance}} + {\llap + {\dousestyleparameter\@tlstyle + \dousecolorparameter\@tlcolor + #1% + \hskip\leftmargindistance}} {\color[\@@tlrulecolor] {\vrule\!!height\dimen4\!!depth\dimen6\!!width\@@tlwidth}% \hbox spread 2\dimexpr\@@tldistance\relax - {\hss\doattributes\??tl\c!style\c!color{\strut#1}\hss}}}% + {\hss + \dousestyleparameter\@tlstyle + \dousecolorparameter\@tlcolor + \strut#1% + \hss}}}% \color[\@@tlrulecolor] {\leaders\hrule\!!height\dimen4\!!depth\dimen6\hfill}}% \ht\scratchbox\strutht @@ -3218,9 +3227,10 @@ {\hbox} {\hbox to \@@ilwidth}}% \bgroup - \doattributes\??il\c!style\c!color{\strut#2\hfill\@@ilseparator}% - \hskip\@@ildistance - \egroup}% + \dousestyleparameter\@@ilstyle + \dousecolorparameter\@@ilcolor + \strut#2\hfill\@@ilseparator\hskip\@@ildistance + \egroup}% %\hangindent=\wd0\relax % tzt hang=yes,n %\parindent=\hangindent %\box0\relax @@ -3229,7 +3239,9 @@ #4% \doifsomething{#3} {\kern\@@ildistance - \doattributes\??il\c!style\c!color{#3\strut}}% + \dousestyleparameter\@@ilstyle + \dousecolorparameter\@@ilcolor + #3\strut}% \endgroup \endgraf \@@ilafter} diff --git a/tex/context/base/page-app.mkiv b/tex/context/base/page-app.mkiv index b85132870..e2a249531 100644 --- a/tex/context/base/page-app.mkiv +++ b/tex/context/base/page-app.mkiv @@ -45,8 +45,8 @@ \c!location=\v!middle] \appendtoks - \setuevalue{\e!start\currentfittingpage}{\startfittingpage[\currentfittingpage]}% - \setuevalue{\e!stop \currentfittingpage}{\stopfittingpage}% + \setuevalue{\e!start\currentfittingpage}{\startfittingpage[\currentfittingpage]}% + \setuevalue{\e!stop \currentfittingpage}{\stopfittingpage}% \to \everydefinefittingpage \unexpanded\def\startfittingpage @@ -56,6 +56,7 @@ {\page % this is kind of tricky! there can be preceding page refs \autostarttext \bgroup % resulting in a zero height page; test fig-make ! + \setupinterlinespace[\v!top=0]% no topskip \def\currentfittingpage{#1}% \dontcomplain % runs under current page regime, i.e. page variables passed to mp @@ -148,17 +149,17 @@ %D maybe I should support stream=yes in framed. \unexpanded\def\startTEXstream - {\dosingleempty\dostartTEXstream} + {\dosingleempty\start_TEX_stream} -\def\dostartTEXstream[#1]% old code, to be redone +\def\start_TEX_stream[#1]% old code, to be redone {\page - \defineoutputstream[tex]% - \enableoutputstream[tex]% - \unexpanded\def\stopTEXstream - {\disableoutputstream - \startTEXpage - \outputstreamunvbox[tex]% - \stopTEXpage}} + \enableoutputstream[tex]} + +\unexpanded\def\stopTEXstream + {\disableoutputstream + \startTEXpage + \outputstreamunvbox[tex]% + \stopTEXpage} %D Application pages, a quick \MKIV\ hack: @@ -169,7 +170,7 @@ \def\TEXapplicationfilename{\jobname-texapplication.tex} -\def\stopTEXapplication +\unexpanded\def\stopTEXapplication {\savebuffer[\thedefinedbuffer{TEXapplication}][\TEXapplicationfilename]% \typesetfile[TEXapplication][\TEXapplicationfilename]\relax} @@ -181,9 +182,9 @@ %D \stoptyping \unexpanded\def\startpagefigure - {\dodoubleempty\dostartpagefigure} + {\dodoubleempty\start_page_figure} -\def\dostartpagefigure[#1][#2]% +\def\start_page_figure[#1][#2]% {\bgroup \getparameters[\??ex][\c!offset=\v!overlay,#2]% \startTEXpage[\c!offset=\@@exoffset]% @@ -194,9 +195,9 @@ \egroup} \def\pagefigure - {\dodoubleempty\dopagefigure} + {\dodoubleempty\page_figure} -\def\dopagefigure[#1][#2]% - {\dostartpagefigure[#1][#2]\stoppagefigure} +\def\page_figure[#1][#2]% + {\start_page_figure[#1][#2]\stoppagefigure} \protect \endinput diff --git a/tex/context/base/page-bck.mkiv b/tex/context/base/page-bck.mkiv index 2608ee828..164549d9d 100644 --- a/tex/context/base/page-bck.mkiv +++ b/tex/context/base/page-bck.mkiv @@ -11,29 +11,12 @@ %C therefore copyrighted by \PRAGMA. See mreadme.pdf for %C details. -\writestatus{loading}{ConTeXt Page Macros / Backgrounds} +% todo: ma:r:c -% todo \fastlocalframed -> \localbackgroundframed +\writestatus{loading}{ConTeXt Page Macros / Backgrounds} \unprotect -%D \macros -%D {recalculatebackgrounds} -%D -%D We use a couple of switches so that we can minimize the -%D amount of background calculations. The main switch is set -%D by the recalculate directive. -%D -%D \starttyping -%D \recalculatebackgrounds -%D \stoptyping -%D -%D Other modules may not directly set the switches -%D themselves. - -\newif\ifnewbackground -\newif\ifsomebackground - %D For special purposes, users can question the \type %D {*background} mode. This mode is only available when %D typesetting the pagebody. @@ -42,63 +25,103 @@ %D \startmode[*background] ... %D \stoptyping +\newconditional\c_page_backgrounds_new +\newconditional\c_page_backgrounds_new_right +\newconditional\c_page_backgrounds_new_left +\newconditional\c_page_backgrounds_some + \appendtoks - \ifsomebackground \ifnewbackground \setsystemmode\v!background \fi \fi + \ifconditional\c_page_backgrounds_some + \ifconditional\c_page_backgrounds_new + \setsystemmode\v!background + \fi + \fi \to \everybeforepagebody -%D \macros -%D {addmainbackground, addtextbackground, -%D addpagebackground, addprintbackground} -%D -%D Apart from the previously mentioned directive, the -%D interface between this module and the other modules -%D is made up by four macros that add background to parts of -%D the layout. -%D -%D \starttyping -%D \addmainbackground <box> -%D \addtextbackground <box> -%D \addpagebackground <box> -%D \addprintbackground <box> -%D \stoptyping - -%D To minimize calculations, we keep track of the state of the -%D background of each area. A previous implementation did -%D check each call to the background calculation macro, but -%D using an intermediate usage flag instead of testing each -%D time saves about 3\% on a run with a couple of backgrounds. -%D (On the 824 pages maps bibliography runtime went down from -%D 309 to 299 seconds.) +%D We keep calculations and checks to a minimum and also +%D try to minimize the amount of tracing due to expansion. \let\currentotrbackground\empty -\def\@@docheckbackground#1#2% - {\ifcsname\currentotrbackground#1\endcsname - \edef\!!stringa{\csname\currentotrbackground#1\endcsname}\ifx\!!stringa#2\!!doneatrue\fi +\def\page_backgrounds_set_yes{\expandafter\let\csname\currentotrbackground\endcsname\relax } +\def\page_backgrounds_set_nop{\expandafter\let\csname\currentotrbackground\endcsname\undefined} + +\def\page_backgrounds_check_background + {\ifcsname\currentotrbackground\c!background\endcsname + \edef\page_background_temp{\csname\currentotrbackground\c!background\endcsname}% + \ifx\page_background_temp\empty + \expandafter\expandafter\expandafter\page_backgrounds_check_frame + \else + \page_backgrounds_set_yes + \fi + \else + \expandafter\page_backgrounds_check_frame \fi} -\def\@@nocheckbackground#1#2% - {\ifcsname\currentotrbackground#1\endcsname - \edef\!!stringa{\csname\currentotrbackground#1\endcsname}\ifx\!!stringa#2\else\!!doneatrue\fi +\def\page_backgrounds_check_frame + {\ifcsname\currentotrbackground\c!frame\endcsname + \edef\page_background_temp{\csname\currentotrbackground\c!frame\endcsname}% + \ifx\page_background_temp\v!on + \page_backgrounds_set_yes + \else + \expandafter\expandafter\expandafter\page_backgrounds_check_leftframe + \fi + \else + \expandafter\page_backgrounds_check_leftframe \fi} -\def\checkbackground#1% here we need an \ifempty primitive - {\edef\currentotrbackground{\??ma#1}% - \begingroup - \!!doneafalse - \if!!donea\else\@@nocheckbackground\c!background \empty - \if!!donea\else\@@docheckbackground\c!frame \v!on - \if!!donea\else\@@nocheckbackground\c!foregroundcolor\empty - \if!!donea\else\@@docheckbackground\c!leftframe \v!on - \if!!donea\else\@@docheckbackground\c!rightframe \v!on - \if!!donea\else\@@docheckbackground\c!topframe \v!on - \if!!donea\else\@@docheckbackground\c!bottomframe \v!on \fi\fi\fi\fi\fi\fi\fi - \if!!donea - \endgroup\expandafter\let\csname\currentotrbackground\endcsname\relax +\def\page_backgrounds_check_leftframe + {\ifcsname\currentotrbackground\c!leftframe\endcsname + \edef\page_background_temp{\csname\currentotrbackground\c!leftframe\endcsname}% + \ifx\page_background_temp\v!on + \page_backgrounds_set_yes + \else + \expandafter\expandafter\expandafter\page_backgrounds_check_rightframe + \fi \else - \endgroup\expandafter\let\csname\currentotrbackground\endcsname\undefined + \expandafter\page_backgrounds_check_rightframe \fi} +\def\page_backgrounds_check_rightframe + {\ifcsname\currentotrbackground\c!rightframe\endcsname + \edef\page_background_temp{\csname\currentotrbackground\c!rightframe\endcsname}% + \ifx\page_background_temp\v!on + \page_backgrounds_set_yes + \else + \expandafter\expandafter\expandafter\page_backgrounds_check_topframe + \fi + \else + \expandafter\page_backgrounds_check_topframe + \fi} + +\def\page_backgrounds_check_topframe + {\ifcsname\currentotrbackground\c!topframe\endcsname + \edef\page_background_temp{\csname\currentotrbackground\c!topframe\endcsname}% + \ifx\page_background_temp\v!on + \page_backgrounds_set_yes + \else + \expandafter\expandafter\expandafter\page_backgrounds_check_bottomframe + \fi + \else + \expandafter\page_backgrounds_check_bottomframe + \fi} + +\def\page_backgrounds_check_bottomframe + {\ifcsname\currentotrbackground\c!bottomframe\endcsname + \edef\page_background_temp{\csname\currentotrbackground\c!bottomframe\endcsname}% + \ifx\page_background_temp\v!on + \page_backgrounds_set_yes + \else + \page_backgrounds_set_nop + \fi + \else + \page_backgrounds_set_nop + \fi} + +\def\page_backgrounds_check#1% + {\edef\currentotrbackground{\??ma#1}% + \page_backgrounds_check_background} + \def\ifsomebackgroundfound#1% {\ifcsname\??ma#1\endcsname} @@ -120,31 +143,35 @@ %D macro. This means that all normal frame and overlay %D features can be used. -\def\addsomebackground#1#2#3#4% area box width height / zero test added - {\ifsomebackgroundfound#1\ifdim#3>\zeropoint\ifdim#4>\zeropoint - \ifcsname\??ma#1\c!setups\endcsname % to be done - \doprocesslocalsetups{\csname\??ma#1\c!setups\endcsname}% should not produce funny spaces ! +\def\page_backgrounds_add_to_box#1#2#3#4% area box width height / zero test added + {\ifcsname\??ma#1\endcsname + \ifdim#3>\zeropoint + \ifdim#4>\zeropoint + \ifcsname\??ma#1\c!setups\endcsname % to be done + \doprocesslocalsetups{\csname\??ma#1\c!setups\endcsname}% should not produce funny spaces ! + \fi + \localbackgroundframed\??ma{#1}{#2}{#3}{#4}% + \fi \fi - \localbackgroundframed{#1}{#2}{#3}{#4}% - \fi\fi\fi} + \fi} %D There are quite some backgrounds. At the bottom layer, %D there is the {\em paper} background. This one is only %D used for special purposes, like annotations to documents. -\def\addprintbackground#1% - {\addsomebackground\v!paper#1\printpaperwidth\printpaperheight} +\def\page_backgrounds_add_to_print#1% + {\page_backgrounds_add_to_box\v!paper#1\printpaperwidth\printpaperheight} %D The page backgrounds can be put behind the {\em left %D page}, the {\em right page} or {\em each page}. As with %D the paper background, these are calculated on each page. -\def\addpagebackground#1% +\def\page_backgrounds_add_to_paper#1% {\doifbothsidesoverruled - {\addsomebackground\v!rightpage#1\paperwidth\paperheight} - {\addsomebackground\v!rightpage#1\paperwidth\paperheight} - {\addsomebackground\v!leftpage #1\paperwidth\paperheight}% - \addsomebackground\v!page #1\paperwidth\paperheight} + {\page_backgrounds_add_to_box\v!rightpage#1\paperwidth\paperheight} + {\page_backgrounds_add_to_box\v!rightpage#1\paperwidth\paperheight} + {\page_backgrounds_add_to_box\v!leftpage #1\paperwidth\paperheight}% + \page_backgrounds_add_to_box\v!page#1\paperwidth\paperheight} %D Then there are the 25 areas that make up the layout: {\em %D top, header, text, footer, bottom} times {\em left edge, @@ -155,28 +182,17 @@ \newbox\leftbackground \newbox\rightbackground -\def\addmainbackground#1% todo: dimension spec - {\ifcase\pageornamentstate - \ifsomebackground - \ifnewbackground \setbackgroundboxes \fi - \setbox#1\vbox - {\offinterlineskip - \doifmarginswapelse{\copy\leftbackground}{\copy\rightbackground}% - \box#1}% - \fi - \fi} - %D Finaly there is an aditional {\em text} background, again %D useful for special purposes only. This one is calculated %D each time. The hidden backgrounds are not meant for users! -\newconditional\hiddenbackgroundenabled +\newconditional\c_page_backgrounds_hidden_enabled -\def\addtextbackground#1% - {\ifconditional\hiddenbackgroundenabled - \addsomebackground\v!hidden#1\makeupwidth\textheight % mine ! +\def\page_backgrounds_add_to_text#1% + {\ifconditional\c_page_backgrounds_hidden_enabled + \page_backgrounds_add_to_box\v!hidden#1\makeupwidth\textheight % mine ! \fi - \addsomebackground\v!text#1\makeupwidth\textheight} + \page_backgrounds_add_to_box\v!text#1\makeupwidth\textheight} %D The next couple of macros implement the area backgrounds. %D As said, these are cached in dedicated boxes. The offsets @@ -190,50 +206,56 @@ %D background at the same time since something may have %D changed halfway a page. -\newconditional\newrightbackground -\newconditional\newleftbackground +%D Margin swapping has been simplified: see mkii code in case of +%D regression. Calculation is delayed till the page anyway so the +%D state is known. -\def\recalculatebackgrounds - {\global\newbackgroundtrue} +\def\recalculatebackgrounds % will be renamed + {\global\settrue\c_page_backgrounds_new} -\def\setbackgroundboxes - {\ifnewbackground - \dosetbackgroundboxesr +\def\page_backgrounds_set_boxes + {\ifconditional\c_page_backgrounds_new + \page_backgrounds_set_boxes_r \fi - \doifbothsides\dosetbackgroundboxesa\dosetbackgroundboxesb\dosetbackgroundboxesc - \ifx\@@mastate\v!repeat\else\global\newbackgroundfalse\fi} + \doifbothsides + \page_backgrounds_set_boxes_a + \page_backgrounds_set_boxes_b + \page_backgrounds_set_boxes_c + \ifx\@@mastate\v!repeat\else + \global\setfalse\c_page_backgrounds_new + \fi} -\def\dosetbackgroundboxesr - {\global\settrue\newrightbackground - \global\settrue\newleftbackground +\def\page_backgrounds_set_boxes_r + {\global\settrue\c_page_backgrounds_new_right + \global\settrue\c_page_backgrounds_new_left \global\setbox\leftbackground\emptybox \global\setbox\rightbackground\emptybox} -\def\dosetbackgroundboxesa - {\ifconditional\newleftbackground +\def\page_backgrounds_set_boxes_a + {\ifconditional\c_page_backgrounds_new_left % \showmessage\m!layouts8\empty - \setbackgroundbox\leftbackground\relax - \global\setfalse\newleftbackground - \global\setfalse\newrightbackground + \page_backgrounds_set_box\leftbackground % \conditionalfalse + \global\setfalse\c_page_backgrounds_new_left + \global\setfalse\c_page_backgrounds_new_right \fi} -\def\dosetbackgroundboxesb - {\ifconditional\newleftbackground +\def\page_backgrounds_set_boxes_b + {\ifconditional\c_page_backgrounds_new_left % \showmessage\m!layouts8\empty - \setbackgroundbox\leftbackground\relax - \global\setfalse\newleftbackground + \page_backgrounds_set_box\leftbackground % \conditionalfalse + \global\setfalse\c_page_backgrounds_new_left \fi} -\def\dosetbackgroundboxesc - {\ifconditional\newrightbackground +\def\page_backgrounds_set_boxes_c + {\ifconditional\c_page_backgrounds_new_right % \showmessage\m!layouts8\empty - \setbackgroundbox\rightbackground\doswapmargins - \global\setfalse\newrightbackground + \page_backgrounds_set_box\rightbackground % \conditionaltrue + \global\setfalse\c_page_backgrounds_new_right \fi} -\def\addmainbackground#1% todo: dimension spec - {\ifsomebackground - \setbackgroundboxes +\def\page_backgrounds_add_to_main#1% todo: dimension spec + {\ifconditional\c_page_backgrounds_some + \page_backgrounds_set_boxes \setbox#1\vbox {\offinterlineskip \doifmarginswapelse{\copy\leftbackground}{\copy\rightbackground}% @@ -243,34 +265,61 @@ \newdimen\pagebackgroundhoffset % THESE WILL BECOME OBSOLETE \newdimen\pagebackgroundvoffset \newdimen\pagebackgrounddepth -\newdimen\pagebackgroundoffset - -\def\setbackgroundoffsets % used in menus (we can use ifcsname's here) - {\ifsomebackground \ifnewbackground - \global\pagebackgroundhoffset\zeropoint - \global\pagebackgroundvoffset\zeropoint - \global\pagebackgrounddepth \zeropoint - \doifsomebackgroundelse{\v!text\v!text}\donetrue\donefalse - \ifdone\else\doifsomebackgroundelse\v!text\donetrue\donothing\fi - \ifdone - \begingroup - \scratchdimen\csname\??ma\v!page\c!offset\endcsname - \doifsomebackgroundelse{\v!top\v!text}\donothing - {\doifsomebackgroundelse{\v!bottom\v!text}\donothing - {\global\pagebackgroundhoffset\scratchdimen}}% - \doifsomebackgroundelse{\v!text\v!rightedge}\donothing - {\doifsomebackgroundelse{\v!text\v!leftedge}\donothing - {\global\pagebackgroundvoffset\scratchdimen - \global\pagebackgrounddepth\csname\??ma\v!page\c!depth\endcsname}}% - \endgroup - \fi +\newdimen\pagebackgroundcompensation + +\newdimen\pagebackgroundoffset % used elsewhere + +\def\page_backgrounds_set_offsets % used in menus (we can use ifcsname's here) + {\ifconditional\c_page_backgrounds_some \ifconditional\c_page_backgrounds_new + \page_backgrounds_set_offsets_indeed % indirect, less tracing \fi \fi} -\appendtoks \setbackgroundoffsets \to \everybeforepagebody +\def\page_backgrounds_set_offsets_indeed + {\ifcsname\??ma\v!text\v!text\endcsname + \page_backgrounds_set_offsets_yes + \else\ifcsname\??ma\v!text\endcsname + \page_backgrounds_set_offsets_yes + \else + \page_backgrounds_set_offsets_nop + \fi\fi} + +\def\page_backgrounds_set_offsets_nop + {\global\pagebackgroundhoffset \zeropoint + \global\pagebackgroundvoffset \zeropoint + \global\pagebackgrounddepth \zeropoint + \global\pagebackgroundcompensation\zeropoint} + +\def\page_backgrounds_set_offsets_yes + {\global\pagebackgroundcompensation\csname\??ma\v!page\c!offset\endcsname\relax + \ifzeropt\pagebackgroundcompensation + \page_backgrounds_set_offsets_nop + \else + \ifcsname\??ma\v!top\v!text\endcsname + \global\pagebackgroundhoffset\zeropoint + \else\ifcsname\??ma\v!bottom\v!text\endcsname + \global\pagebackgroundhoffset\zeropoint + \else + \global\pagebackgroundhoffset\pagebackgroundcompensation + \fi\fi + \ifcsname\??ma\v!text\v!rightedge\endcsname + \global\pagebackgroundvoffset\zeropoint + \global\pagebackgrounddepth \zeropoint + \else\ifcsname\??ma\v!text\v!leftedge\endcsname + \global\pagebackgroundvoffset\zeropoint + \global\pagebackgrounddepth \zeropoint + \else + \global\pagebackgroundvoffset\pagebackgroundcompensation + \global\pagebackgrounddepth \csname\??ma\v!page\c!depth\endcsname\relax + \fi\fi + \fi} + +\appendtoks + \page_backgrounds_set_offsets +\to \everybeforepagebody \newconditional\swapbackgroundmargins \settrue\swapbackgroundmargins -\def\setbackgroundbox#1#2% +\def\page_backgrounds_set_box#1% #2% {\global\setbox#1\vbox {\dontcomplain \swapmargins @@ -281,60 +330,95 @@ \fi \calculatereducedvsizes \offinterlineskip - #2\relax + % \ifconditional#2\relax + % \doswapmargins % hm, this one gets nilled in \swapmargins anyway + % \fi \vskip\dimexpr-\topheight-\topdistance\relax - \dodopagebodybackground\v!top\topheight + \ifdim\topheight>\zeropoint + \page_backgrounds_set_box_column\v!top\topheight + \fi \vskip\topdistance - \dodopagebodybackground\v!header\headerheight + \ifdim\headerheight>\zeropoint + \page_backgrounds_set_box_column\v!header\headerheight + \fi \vskip\headerdistance - \dodopagebodybackground\v!text\textheight + \ifdim\textheight>\zeropoint + \page_backgrounds_set_box_column\v!text\textheight + \fi \vskip\footerdistance - \dodopagebodybackground\v!footer\footerheight + \ifdim\footerheight>\zeropoint + \page_backgrounds_set_box_column\v!footer\footerheight + \fi \vskip\bottomdistance - \dodopagebodybackground\v!bottom\bottomheight + \ifdim\bottomheight>\zeropoint + \page_backgrounds_set_box_column\v!bottom\bottomheight + \fi \vfilll}% \smashbox#1} -\def\dodopagebodybackground#1#2% maybe helper - {\ifdim#2>\zeropoint % added, faster - \setbox\scratchbox\vbox to #2 - \bgroup\hbox\bgroup - % \swapmargins - \goleftonpage - \dododopagebodybackground\leftedgewidth #2#1\v!leftedge - \hskip\leftedgedistance - \dododopagebodybackground\leftmarginwidth #2#1\v!leftmargin - \hskip\leftmargindistance - \dododopagebodybackground\makeupwidth #2#1\v!text - \hskip\rightmargindistance - \dododopagebodybackground\rightmarginwidth#2#1\v!rightmargin - \hskip\rightedgedistance - \dododopagebodybackground\rightedgewidth #2#1\v!rightedge - \egroup\egroup - \wd\scratchbox\zeropoint - \box\scratchbox\relax - \fi} - -\def\dododopagebodybackground#1#2#3#4% width height pos pos % maybe helper - {\ifsomebackgroundfound{#3#4}% - \ifdim#2>\zeropoint\relax - \ifdim#1>\zeropoint\relax - \ifcsname\??ma#3#4\c!setups\endcsname % to be done - \doprocesslocalsetups{\csname\??ma#3#4\c!setups\endcsname}% should not produce funny spaces ! +\def\page_backgrounds_set_box_column#1#2% maybe helper + {\setbox\scratchbox\vbox to #2 + \bgroup\hbox\bgroup + \goleftonpage + \ifdim\leftedgewidth>\zeropoint + \ifcsname\??ma#1\v!leftedge\endcsname + \page_backgrounds_set_box_cell#1\v!leftedge\leftedgewidth#2% + \else + \hskip\leftedgewidth \fi - \fastlocalframed - [\??ma#3#4]% - [\c!component=#3-#4]% - {\vbox to #2{\vss\hbox to#1{\hss\csname\??ma#3#4\c!command\endcsname\hss}\vss}}% + \fi + \hskip\leftedgedistance + \ifdim\leftmarginwidth>\zeropoint + \ifcsname\??ma#1\v!leftmargin\endcsname + \page_backgrounds_set_box_cell#1\v!leftmargin\leftmarginwidth#2% + \else + \hskip\leftmarginwidth + \fi + \fi + \hskip\leftmargindistance + \ifcsname\??ma#1\v!text\endcsname + \page_backgrounds_set_box_cell#1\v!text\makeupwidth#2% \else - \hskip#1% + \hskip\makeupwidth \fi - \else - \hskip#1% - \fi - \else - \hskip#1% - \fi} + \hskip\rightmargindistance + \ifdim\rightmarginwidth>\zeropoint + \ifcsname\??ma#1\v!rightmargin\endcsname + \page_backgrounds_set_box_cell#1\v!rightmargin\rightmarginwidth#2% + \else + \hskip\rightmarginwidth + \fi + \fi + \hskip\rightedgedistance + \ifdim\rightedgewidth>\zeropoint + \ifcsname\??ma#1\v!rightedge\endcsname + \page_backgrounds_set_box_cell#1\v!rightedge\rightedgewidth#2% + \else + \hskip\rightedgewidth + \fi + \fi + \egroup\egroup + \wd\scratchbox\zeropoint + \box\scratchbox\relax} + +% \def\page_backgrounds_set_box_cell#1#2#3#4% width height pos pos % maybe helper +% {\ifcsname\??ma#1#2\c!setups\endcsname % to be done +% \doprocesslocalsetups{\csname\??ma#1#2\c!setups\endcsname}% should not produce funny spaces ! +% \fi +% \fastlocalframed % can we avoid boxes here? +% [\??ma#1#2]% +% [\c!component=#1:#2]% +% {\vbox to #4{\vss\hbox to#3{\hss\csname\??ma#1#2\c!command\endcsname\hss}\vss}}} + +\def\page_backgrounds_set_box_cell#1#2#3#4% pos pos width height + {\begingroup + \ifcsname\??ma#1#2\c!setups\endcsname + \doprocesslocalsetups{\csname\??ma#1#2\c!setups\endcsname}% should not produce funny spaces ! + \fi + \setbox\scratchbox\hbox{\csname\??ma#1#2\c!command\endcsname}% + \localbackgroundframed\??ma{#1#2}\scratchbox#3#4% + \box\scratchbox + \endgroup} %D The background mechanism is quite demanding in terms or %D resources. We used to delay these definitions till runtime @@ -352,30 +436,22 @@ %D Because the number of arguments runs from one to three, %D we need to check for it. +\newtoks\everybackgroundssetup + \unexpanded\def\setupbackgrounds - {\dotripleempty\dosetupbackgrounds} + {\dotripleempty\page_backgrounds_setup} -\def\dosetupbackgrounds[#1][#2][#3]% +\def\page_backgrounds_setup[#1][#2][#3]% {\ifthirdargument - \global\somebackgroundtrue - \def\docommand##1% - {\doifinsetelse{##1}{\v!paper,\v!page,\v!leftpage,\v!rightpage} - {\getparameters[\??ma##1][#3]\checkbackground{##1}} - {\def\dodocommand####1{\getparameters[\??ma##1####1][#3]\checkbackground{##1####1}}% - \processcommalist[#2]\dodocommand}}% - \processcommalist[#1]\docommand + \page_backgrounds_setup_double{#1}{#2}{#3}% \else\ifsecondargument - \global\somebackgroundtrue - \doifcommonelse{#1}{\v!text,\v!hidden,\v!paper,\v!page,\v!leftpage,\v!rightpage} - {\def\docommand##1{\getparameters[\??ma##1][#2]\checkbackground{##1}}% - \processcommalist[#1]\docommand}% - {\setupbackgrounds - [#1]% - [\v!leftedge,\v!leftmargin,\v!text,\v!rightmargin,\v!rightedge]% - [#2]}% + \page_backgrounds_setup_single{#1}{#2}% \else\iffirstargument - \getparameters[\??ma][#1]% + \page_backgrounds_setup_basics{#1}% \fi\fi\fi + \the\everybackgroundssetup} + +\appendtoks \doifelsevalue{\??ma\v!page\c!offset}\v!overlay {\global\pageoffset\zeropoint} {\global\pageoffset\csname\??ma\v!page\c!offset\endcsname}% @@ -383,13 +459,42 @@ \global\pagebackgroundoffset\pageoffset \global\pagebackgrounddepth\pagedepth \doifelse\@@mastate\v!stop - {\global\newbackgroundfalse} - {\global\newbackgroundtrue }} + {\global\setfalse\c_page_backgrounds_new} + {\global\settrue \c_page_backgrounds_new}% +\to \everybackgroundssetup + +\def\v_page_backgrounds_double_set{\v!paper,\v!page,\v!leftpage,\v!rightpage} +\def\v_page_backgrounds_single_set{\v!text,\v!hidden,\v!paper,\v!page,\v!leftpage,\v!rightpage} +\def\v_page_backgrounds_common_set{\v!leftedge,\v!leftmargin,\v!text,\v!rightmargin,\v!rightedge} + +\def\page_backgrounds_setup_double#1#2#3% + {\global\settrue\c_page_backgrounds_some + \def\docommand##1% + {\doifinsetelse{##1}\v_page_backgrounds_double_set + {\page_backgrounds_setup_and_check{##1}{#3}} + {\def\dodocommand####1{\page_backgrounds_setup_and_check{##1####1}{#3}}% + \processcommalist[#2]\dodocommand}}% + \processcommalist[#1]\docommand} + +\def\page_backgrounds_setup_single#1#2% + {\global\settrue\c_page_backgrounds_some + \doifcommonelse{#1}\v_page_backgrounds_single_set + {\def\docommand##1{\page_backgrounds_setup_and_check{##1}{#2}}% + \processcommalist[#1]\docommand}% + {\page_backgrounds_setup_double{#1}\v_page_backgrounds_common_set{#2}}} + +\def\page_backgrounds_setup_basics#1% + {\getparameters[\??ma][#1]} + +\def\page_backgrounds_setup_and_check#1#2% tag settings + {\edef\currentotrbackground{\??ma#1}% + \getparameters[\currentotrbackground][#2]% + \page_backgrounds_check_background} %D Each areas (currently there are $1+3+25+1=30$ of them) %D has its own low level framed object associated. -\def\installsomebackground#1#2{\inheritlocalframed[\??ma#1#2][\??od]} +\unexpanded\def\installsomebackground#1#2{\inheritlocalframed[\??ma#1#2][\??od]} \installsomebackground \v!paper \empty \installsomebackground \v!page \empty @@ -446,19 +551,19 @@ % spread-2 .. spread+2 achter spread -> spread (repeat 2 times) \def\enablehiddenbackground - {\global\settrue\hiddenbackgroundenabled - \global\somebackgroundtrue + {\global\settrue\c_page_backgrounds_hidden_enabled + \global\settrue\c_page_backgrounds_some \recalculatebackgrounds} \def\disablehiddenbackground - {\global\setfalse\hiddenbackgroundenabled} + {\global\setfalse\c_page_backgrounds_hidden_enabled} -\def\hiddenbackground +\def\hiddenbackgroundlist {\v!text-2,\v!text-1,\v!foreground,\v!text+1,\v!text+2} \setupbackgrounds [\v!hidden] - [\c!background=\hiddenbackground] + [\c!background=\hiddenbackgroundlist] % The next series is used in local (for instance floating) % backgrounds. @@ -468,9 +573,9 @@ \getparameters [\??ma\v!local] [\c!component=local, - \c!background=\localbackground] + \c!background=\localbackgroundlist] -\def\localbackground +\def\localbackgroundlist {\v!local-2,\v!local-1,\v!foreground,\v!local+1,\v!local+2} \defineoverlay[\v!local-2][\positionoverlay{\v!local-2}] @@ -478,17 +583,23 @@ \defineoverlay[\v!local+1][\positionoverlay{\v!local+1}] \defineoverlay[\v!local+2][\positionoverlay{\v!local+2}] -\def\addlocalbackgroundtobox - {\ifconditional\hiddenbackgroundenabled - \expandafter\doaddlocalbackground +\def\page_backgrounds_add_local_to_box + {\ifconditional\c_page_backgrounds_hidden_enabled + \expandafter\page_backgrounds_add_local_to_box_indeed \else - \resetglobal \expandafter\gobbleoneargument + \expandafter\gobbleoneargument \fi} -\def\doaddlocalbackground#1% - {\dodoglobal\setbox#1\hbox{\fastlocalframed[\??ma\v!local][]{\registerMPlocaltextarea{\box#1}}}% - \resetglobal % redundant - \doglobal\increment\localpositionnumber\relax} % afterwards ! +% \def\page_backgrounds_add_local_to_box_indeed#1% +% {\setbox#1\hbox{\fastlocalframed[\??ma\v!local][]{\registerMPlocaltextarea{\box#1}}}% +% \global\advance\localpositionnumber\plusone} % afterwards ! + +\def\page_backgrounds_add_local_to_box_indeed#1% patch yet unchecked, \doglobal support is gone + {\scratchwidth \wd#1% + \scratchheight\ht#1% + \setbox#1\hbox{\registerMPlocaltextarea{\box#1}}% + \setbox#1\hbox{\localbackgroundframed\??ma\v!local#1\scratchwidth\scratchheight}% + \global\advance\localpositionnumber\plusone} % afterwards ! % Test how previous macro behaves with depth: % @@ -503,6 +614,6 @@ %D Because we haven't really set up backgrounds yet, we set %D the main efficiency switch to false. -\somebackgroundfalse +\setfalse\c_page_backgrounds_some \protect \endinput diff --git a/tex/context/base/page-box.mkvi b/tex/context/base/page-box.mkvi new file mode 100644 index 000000000..145f2192b --- /dev/null +++ b/tex/context/base/page-box.mkvi @@ -0,0 +1,322 @@ +%D \module +%D [ file=page-box, +%D version=2011.12.05, % moved from other page-* files +%D title=\CONTEXT\ Page Macros, +%D subtitle=Page Boxing, +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +\writestatus{loading}{ConTeXt Page Macros / Boxing} + +\unprotect + +%D The often two step approach (_indeed) saves skippign tokens +%D which is nicer for tracing. + +%D Centering the paper area on the print area is determined +%D by the \type {top}, \type {bottom}, \type {left} and \type +%D {right} parameters. + +\def\page_boxes_apply_center#box% we could test for a difference (saves packing) + {\printpaperwidth \v_page_target_scale\printpaperwidth \relax + \printpaperheight\v_page_target_scale\printpaperheight\relax + \ifdim\printpaperheight>\ht#box\relax + \page_boxes_apply_center_indeed#box% + \else\ifdim\printpaperwidth>\wd#box\relax + \page_boxes_apply_center_indeed#box% + \fi\fi} + +\def\page_boxes_apply_center_indeed_l_r#box% + {\v_page_target_left + \v_page_target_left_fill + \box#box% + \v_page_target_right_fill + \v_page_target_right} + +\def\page_boxes_apply_center_indeed_r_l#box% + {\v_page_target_right + \v_page_target_right_fill + \box#box% + \v_page_target_left_fill + \v_page_target_left} + +\def\page_boxes_apply_center_indeed#box% we could test for a difference (saves packing) + {\setbox#box\vbox to \printpaperheight + {\v_page_target_top + \v_page_target_top_fill + \hbox to \printpaperwidth + {\ifconditional\c_page_target_print_doublesided + \doifbothsides + {\page_boxes_apply_center_indeed_l_r#box}% + {\page_boxes_apply_center_indeed_l_r#box}% + {\page_boxes_apply_center_indeed_r_l#box}% + \else + \page_boxes_apply_center_indeed_l_r#box% + \fi}% + \par + \v_page_target_bottom_fill + \v_page_target_bottom}} + +\def\page_boxes_apply_offset % #box + {\ifdim\topoffset=\zeropoint + \ifdim\backoffset=\zeropoint + \doubleexpandafter\gobbleoneargument + \else + \doubleexpandafter\page_boxes_apply_offset_indeed + \fi + \else + \expandafter\page_boxes_apply_offset_indeed + \fi} + +\def\page_boxes_apply_offset_indeed#box% + {\scratchwidth \wd#box% + \scratchheight\ht#box% + \scratchdepth \dp#box% + \setbox#box\vbox + {\offinterlineskip + \vskip\topoffset + \hskip\doifbothsides\backoffset\backoffset{-\backoffset}% + \box#box}% + \wd#box\scratchwidth + \ht#box\scratchheight + \dp#box\scratchdepth} + +\def\page_boxes_apply_replicate + {\ifnum\layoutparameter\c!nx>\plusone + \expandafter\page_boxes_apply_replicate_indeed + \else\ifnum\layoutparameter\c!ny>\plusone + \doubleexpandafter\page_boxes_apply_replicate_indeed + \else + \doubleexpandafter\gobbleoneargument + \fi\fi} + +\def\page_boxes_apply_replicate_indeed#box% + {\setbox#box\vbox + {\offinterlineskip + \dorecurse{\layoutparameter\c!ny} + {\hbox{\dorecurse{\layoutparameter\c!nx}{\copy#box\hskip\layoutparameter\c!dx}\unskip}% + \vskip\layoutparameter\c!dy} + \unskip}} + +\def\page_boxes_apply_orientate_paper#box% + {\ifnum\number\c_page_target_paper_orientation\number\c_page_target_paper_reverse>\zerocount + \page_boxes_apply_orientate_indeed\c_page_target_paper_orientation\c_page_target_paper_reverse{#box}% + \fi} + +\def\page_boxes_apply_orientate_print#box% + {\ifnum\number\c_page_target_print_orientation\number\c_page_target_print_reverse>\zerocount + \page_boxes_apply_orientate_indeed\c_page_target_print_orientation\c_page_target_print_reverse{#box}% + \fi} + +\def\page_boxes_apply_orientate_indeed#odd#even#box% + {\setbox#box\vbox + {\edef\somerotation{\number\ifdoublesided\ifodd\realpageno#odd\else#even\fi\else##odd\fi}% + \dorotatebox\somerotation\hbox{\box#box}}} + +\def\page_boxes_apply_mirror#box% + {\setbox#box\vbox{\domirrorbox\vbox{\box#box}}} + +\def\page_boxes_apply_mirror_paper#box{\ifconditional\c_page_target_paper_mirror\page_boxes_apply_mirror{#box}\fi} +\def\page_boxes_apply_mirror_print#box{\ifconditional\c_page_target_print_mirror\page_boxes_apply_mirror{#box}\fi} + +\let\page_boxes_apply_negate\negatecolorbox + +\def\page_boxes_apply_negate_print#box% + {\ifconditional\c_page_target_print_negate + \page_boxes_apply_negate#box% + \else\ifconditional\c_page_target_paper_negate + \page_boxes_apply_negate#box% + \fi\fi} + +\def\page_boxes_apply_scale#box% + {\edef\tmp_currentlayout_scale{\layoutparameter\c!scale}% + \ifdim\tmp_currentlayout_scale\points=\onepoint + \edef\tmp_currentlayout_sx{\layoutparameter\c!sx}% + \edef\tmp_currentlayout_sy{\layoutparameter\c!sy}% + \ifdim\tmp_currentlayout_sx\points=\onepoint + \ifdim\layoutparameter\c!sy\points=\onepoint + % no scaling done (and no copying either) + \else + \page_boxes_apply_scale_indeed\tmp_currentlayout_sx\tmp_currentlayout_sy{#box}% + \fi + \else + \page_boxes_apply_scale_indeed\tmp_currentlayout_sx\tmp_currentlayout_sy{#box}% + \fi + \else + \page_boxes_apply_scale_indeed\tmp_currentlayout_scale\tmp_currentlayout_scale{#box}% + \fi} + +\def\page_boxes_apply_scale_indeed#sx#sy#box% + {\setbox#box\vbox{\scale[\c!sx=#sx,\c!sy=#sy]{\box#box}}% can be a fast one + \paperwidth #sx\paperwidth + \paperheight#sy\paperheight} + +% \setuppagenumbering[alternative=doublesided] +% \setupcolors[state=start] +% \setuppapersize[A4][A4,oversized] +% \setuplayout[location=middle,clipoffset=5mm] +% \setupbackgrounds +% [page] +% [frame=on,rulethickness=1mm, +% backgroundoffset=10mm,background=color,backgroundcolor=red] +% \starttext \dorecurse{10}{\input tufte \par} \stoptext + +\newconditional\c_page_boxes_clip_print \settrue\c_page_boxes_clip_print + +\def\page_boxes_apply_clip_print_left % box + {\ifconditional\c_page_boxes_clip_print + \expandafter\page_boxes_apply_clip_print_indeed\expandafter\conditionalfalse + \else + \expandafter\gobbleoneargument + \fi} + +\def\page_boxes_apply_clip_print_right % box + {\ifconditional\c_page_boxes_clip_print + \expandafter\page_boxes_apply_clip_print_indeed\expandafter\conditionaltrue + \else + \expandafter\gobbleoneargument + \fi} + +\def\page_boxes_apply_clip_print_indeed#right#box% can be made more efficient, see other clipper + {\scratchoffset\pagebackgroundoffset % can be zero which is valid % maybe another variable + \scratchwidth \wd#box% + \scratchheight\ht#box% + \scratchdepth \dp#box% + \setbox#box\hbox + {\advance\scratchheight\dimexpr\scratchdepth+2\scratchoffset\relax + \advance\scratchwidth \scratchoffset + \ifconditional#right\relax + \scratchdimen-\scratchoffset + \hskip\scratchdimen + \else + \scratchdimen\zeropoint + \fi + \lower\scratchoffset\hbox + {\clip + [\c!hoffset=\scratchdimen, + \c!voffset=-\scratchoffset, + \c!width=\scratchwidth, + \c!height=\scratchheight]% + {\box#box}}}% + \wd#box\scratchwidth + \ht#box\scratchheight + \dp#box\scratchdepth} + +\def\page_boxes_apply_clip_paper + {\scratchoffset\layoutparameter\c!clipoffset\relax + \ifdim\scratchoffset>\zeropoint + \expandafter\page_boxes_apply_clip_paper_indeed + \else + \expandafter\gobbleoneargument + \fi} + +\def\page_boxes_apply_clip_paper_indeed#box% + {\scratchwidth \wd#box% + \scratchheight\ht#box% + \scratchdepth \dp#box% + \setbox#box\hbox + {\advance\scratchheight\dimexpr\scratchdepth+2\scratchoffset\relax + \advance\scratchwidth \scratchoffset + \doifbothsides + {\advance\scratchwidth\scratchoffset + \scratchdimen-\scratchoffset + \hskip\scratchdimen}% + {\scratchdimen\zeropoint} + {\scratchdimen-\scratchoffset + \hskip\scratchdimen}% + \lower\scratchoffset\hbox + {\clip + [\c!hoffset=\scratchdimen, + \c!voffset=-\scratchoffset, + \c!width=\scratchwidth, + \c!height=\scratchheight]% + {\box#box}}}% + \wd#box\scratchwidth + \ht#box\scratchheight + \dp#box\scratchdepth} + +% nearly always some displacement so no speedup test needed + +\def\page_boxes_apply_offsets#1% + {\setbox#1\vbox to \paperheight + {\hsize\paperwidth + \vskip\topspace + \doifbothsides + {\hskip\backspace} + {\hskip\backspace} + {\hskip\dimexpr\paperwidth-\backspace-\makeupwidth\relax}% + \box#1}% + \dp#1\zeropoint} + +% \let\page_boxes_apply_clip_paper \gobbleoneargument +% \let\page_boxes_apply_clip_print_left \gobbleoneargument +% \let\page_boxes_apply_clip_print_right\gobbleoneargument + +%D This is rather specialized: + +\newconditional\c_page_areas_enabled +\newbox \b_page_areas_registered + +\def\enabletextarearegistration + {\global\settrue\c_page_areas_enabled} + +\def\page_areas_registered_box + {\ifconditional\c_page_areas_enabled + \expandafter\page_areas_registered_box_indeed + \else + \expandafter\page_areas_registered_box_forget + \fi} + +\def\page_areas_registered_box_forget#1#2#3% #1=lower-dp #2=correct-ht #3=box + {\box#3} + +\def\page_areas_registered_box_indeed#1#2#3% #1=lower-dp #2=correct-ht #3=box + {\hbox\bgroup + \ifx\registerMPtextarea\undefined \else + \setbox\b_page_areas_registered\emptyhbox + \wd\b_page_areas_registered\wd#3% + \ht\b_page_areas_registered\ht#3% + \dp\b_page_areas_registered\dp#3% + \ifcase#1\or % 1 + \setbox\b_page_areas_registered\hbox{\lower\strutdp\box\b_page_areas_registered}% + \fi + \ifcase#2\or % 1 + \setbox\b_page_areas_registered\hbox{\raise\topskip\hbox{\lower\strutht\box\b_page_areas_registered}}% + \dp\b_page_areas_registered\strutdp + \fi + \dp\b_page_areas_registered\strutdp % needed + \setbox\b_page_areas_registered\hbox + {\registerMPtextarea{\box\b_page_areas_registered}}% + \smashbox\b_page_areas_registered + \box\b_page_areas_registered + \fi + \box#3% + \egroup} + +\def\page_areas_register_direct#1% + {\xypos{pbd:\realfolio:b}% we could save bytes by only saving the y + \endgraf + \begingroup + \scratchdimen\dimexpr\MPy{pbd:\realfolio:b}-\MPy{pbd:\realfolio:e}\relax + \setbox\scratchbox\emptyhbox + \wd\scratchbox\makeupwidth + \ht\scratchbox\scratchdimen + \vsmash{\page_areas_registered_box00\scratchbox}% + \endgroup + #1% + \endgraf + \xypos{pbd:\realfolio:e}} + +\def\page_areas_register_boxed#1% + {\begingroup + \setbox\scratchbox\vbox{#1}% + \wd\scratchbox\makeupwidth % somehow a space creeps in + \vbox{\page_areas_registered_box00\scratchbox}% + \endgroup} + +\protect \endinput diff --git a/tex/context/base/page-brk.mkiv b/tex/context/base/page-brk.mkiv new file mode 100644 index 000000000..0ee720662 --- /dev/null +++ b/tex/context/base/page-brk.mkiv @@ -0,0 +1,393 @@ +%D \module +%D [ file=page-brk, % moved from page-ini +%D version=2011.12.07, % 2000.10.20, +%D title=\CONTEXT\ Page Macros, +%D subtitle=Breaks, +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +\writestatus{loading}{ConTeXt Page Macros / Breaks} + +\unprotect + +\ifdefined\resetcurrentstructuremarkswithpage \else \let\resetcurrentstructuremarkswithpage\relax \fi +\ifdefined\noheaderandfooterlines \else \let\noheaderandfooterlines \relax \fi + +%D Page breaks. + +% \definepagebreak +% [chapter] +% [yes,header,right] +% +% \setuphead +% [chapter] +% [page=chapter, +% header=empty, +% footer=chapter] +% +% \definepagebreak % untested +% [lastpage] +% [left,{empty,right},{empty,left}] + +% public page handler, beware: definepage already in use (core-ref) +% +% \definepagebreak[instance][forsure] +% \definepagebreak[forsure][yes,+4] + +\newconditional\c_page_breaks_enabled \settrue\c_page_breaks_enabled +\newcount \c_page_breaks_prevpage + +\newtoks\everybeforepagebreak +\newtoks\everyafterpagebreak + +\let\page_breaks_current_option \empty +\let\page_breaks_current_options\empty + +\def\page_breaks_handle#1% + {\edef\page_breaks_current_options{#1}% handy for tracing + \processcommacommand[\page_breaks_current_options]\page_breaks_handle_indeed} + +\def\page_breaks_handle_indeed#1% + {\edef\page_breaks_current_option{#1}% can be used in handler + \ifcsname\??pe:\page_breaks_current_option\endcsname + \csname\??pe:\page_breaks_current_option\endcsname + \else\ifcsname\??pe::\page_breaks_current_option\endcsname + \expandafter\page_breaks_handle\csname\??pe::\page_breaks_current_option\endcsname + \else + \csname\??pe:\s!unknown\endcsname + \fi\fi} + +\def\page_breaks_handle_direct#1% + {\csname\??pe:#1\endcsname} + +\def\installpagebreakhandler#1#2% low level definer + {\setvalue{\??pe:#1}{#2}} + +\unexpanded\def\definepagebreak + {\dodoubleargument\page_breaks_define} + +\def\page_breaks_define[#1][#2]% + {\setvalue{\??pe::#1}{#2}} + +\unexpanded\def\pagebreak + {\dosingleempty\page_breaks_process} + +\let\page\pagebreak + +\appendtoks + \flushnotes +\to \everybeforepagebreak + +\def\page_breaks_process[#1]% so, page ornaments are reset after a pagebreak command, unless set + {\par % always before group so that we clear hangs etc (as in side floats) + \ifvmode % extra check + \begingroup + \the\everybeforepagebreak + \c_page_breaks_prevpage\realpageno + \ifcase\pageornamentstate \or + % disable reset after shipout + \global\pageornamentstate\plustwo + \fi + \iffirstargument % or if empty i.e. [] + \page_breaks_handle{#1}% + \else % so, no pagebreak when \pagebreak[] ! ! ! + \page_breaks_handle_direct\v!yes + \fi + \relax + \ifnum\c_page_breaks_prevpage<\realpageno + \global\pageornamentstate\zerocount + \fi + \the\everyafterpagebreak + \endgroup + \fi} + +\def\resetpagebreak % used elsewhere too + {\global\settrue\c_page_breaks_enabled} + +\def\simplifypagebreak % to be used grouped ! + {\def\page_breaks_process[##1]{\goodbreak}} + +\def\disablepagebreaks % to be used grouped ! + {\def\page_breaks_process[##1]{}} + +\installpagebreakhandler \s!dummy + {\page_otr_flush_all_floats + \gotonextpage + \page_otr_insert_dummy_page} + +\installpagebreakhandler \v!frame + {\page + \begingroup + \showframe + \page[\v!empty] + \endgroup} + +\installpagebreakhandler \s!unknown + {\doifinstringelse{+}\page_breaks_current_option + {\page_otr_flush_all_floats + \gotonextpage + \dorecurse\page_breaks_current_option\page_otr_insert_dummy_page} + {\doifnumberelse\page_breaks_current_option + {\page_otr_flush_all_floats + \gotonextpage + \doloop + {\ifnum\userpageno<\page_breaks_current_option\relax + \page_otr_insert_dummy_page + \else + \exitloop + \fi}} + {}}} + +\installpagebreakhandler \s!default + {} % do nothing if empty + +\installpagebreakhandler \v!reset + {% better not: \global\pageornamentstate\zerocount + \resetpagebreak} + +\installpagebreakhandler \v!disable + {\global\setfalse\c_page_breaks_enabled} + +\installpagebreakhandler \v!yes + {\ifconditional\c_page_breaks_enabled + \page_otr_flush_all_floats + \gotonextpage + \ifinsidecolumns % this will move to MUL + \page_otr_eject_page % otherwise sometimes no change + \fi + \fi} + +\installpagebreakhandler \v!makeup + {\ifconditional\c_page_breaks_enabled + \page_otr_fill_and_eject_page + \fi} + +\installpagebreakhandler \v!blank + {\ifcase\pageornamentstate + \global\pageornamentstate\plusone + \fi} + +\installpagebreakhandler \v!no + {\ifconditional\c_page_breaks_enabled + \dosomebreak\nobreak + \fi} + +\installpagebreakhandler \v!preference + {\ifconditional\c_page_breaks_enabled + \ifinsidecolumns % this will move to MUL + \dosomebreak\goodbreak + \else + \testpage[3][\zeropoint]% + \fi + \fi} + +\installpagebreakhandler \v!bigpreference + {\ifconditional\c_page_breaks_enabled + \ifinsidecolumns % this will move to MUL + \dosomebreak\goodbreak + \else + \testpage[5][\zeropoint]% + \fi + \fi} + +% \installpagebreakhandler \v!empty {} % defined in page-txt.mkiv +% \installpagebreakhandler \v!header{} % defined in page-txt.mkiv +% \installpagebreakhandler \v!footer{} % defined in page-txt.mkiv +% \installpagebreakhandler \v!left {} % defined in page-txt.mkiv + +\installpagebreakhandler \v!right + {\page_otr_flush_all_floats + \gotonextpageX % will become \gotonextpage + \doifbothsidesoverruled{}{}{\resetcurrentstructuremarkswithpage\page_otr_insert_dummy_page}} + +\installpagebreakhandler \v!even + {\page + \doifoddpageelse{\resetcurrentstructuremarkswithpage\page_otr_insert_dummy_page}\donothing} + +\installpagebreakhandler \v!odd + {\page + \doifoddpageelse\donothing{\resetcurrentstructuremarkswithpage\page_otr_insert_dummy_page}} + +\installpagebreakhandler \v!quadruple % not yet ok inside columnsets + {\ifdoublesided + \ifnum\numexpr\realpageno/4\relax=\numexpr\realpageno/2\relax\else + \page_breaks_handle_direct\v!yes + \page_breaks_handle_direct\v!empty + \page_breaks_handle_direct\v!empty + \fi + \fi} + +\installpagebreakhandler \v!last + {\page_otr_flush_all_floats + \gotonextpageX % will become \gotonextpage + \relax + \doifbothsidesoverruled + {\page_facings_flush}% hm + {} + {\noheaderandfooterlines + \page_otr_insert_dummy_page}% + \filluparrangedpages} + +\installpagebreakhandler \v!lastpage % handy for backpage preceded by empty pages + {\page_breaks_handle_direct\v!yes + \ifdoublesided + \page_breaks_handle_direct\v!left + \page_breaks_handle_direct\v!empty + \page_breaks_handle_direct\v!empty + \fi} + +\installpagebreakhandler \v!start {\global\settrue \c_otr_shipout_enabled} +\installpagebreakhandler \v!stop {\global\setfalse\c_otr_shipout_enabled} + +% Column breaks. + +\newtoks\everybeforecolumnbreak +\newtoks\everyaftercolumnbreak + +\let\page_breaks_columns_current_option \empty +\let\page_breaks_columns_current_options\empty + +\def\page_breaks_columns_handle#1% + {\edef\page_breaks_columns_current_options{#1}% + \processcommacommand[#1]\page_breaks_columns_handle_indeed} + +\def\page_breaks_columns_handle_indeed#1% + {\edef\page_breaks_columns_current_option{#1}% + \ifcsname\??cn:\OTRidentifier:\page_breaks_columns_current_option\endcsname + \csname\??cn:\OTRidentifier:\page_breaks_columns_current_option\endcsname + \else\ifcsname\??cn::\page_breaks_columns_current_option\endcsname + \expandafter\csname\page_breaks_columns_handle\??cn::\page_breaks_columns_current_option\endcsname + \else + \csname\??cn:\OTRidentifier:\s!unknown\endcsname + \fi\fi} + +\def\page_breaks_columns_handle_direct#1% + {\csname\??cn:\OTRidentifier:#1\endcsname} + +\def\installcolumnbreakhandler#1#2#3% #1=otr-id #2=tag #3=action + {\setvalue{\??cn:#1:#2}{#3}} + +\unexpanded\def\definecolumnbreak + {\dodoubleargument\page_break_columns_define} + +\def\page_break_columns_define[#1][#2]% + {\setvalue{\??cn::#1}{#2}} + +\unexpanded\def\columnbreak + {\dosingleempty\page_breaks_columns_process} + +\let\column\columnbreak + +\def\page_breaks_columns_process[#1]% so, page ornaments are reset after a pagebreak command, unless set + {\begingroup + \the\everybeforecolumnbreak + \iffirstargument + \page_breaks_columns_handle{#1}% + \else + \page_breaks_columns_handle_direct\v!yes + \fi + \relax + \the\everyaftercolumnbreak + \endgroup} + +%D Test page breaks. + +\newdimen \d_page_tests_test +\newconstant\c_page_tests_mode + +\newconstant\testpagemethod % todo: \testnewpage[method=,lines=,voffset=] +\newconstant\testpagetrigger + +\unexpanded\def\testpage {\c_page_tests_mode\plusone \dodoubleempty\page_tests_test} % +\unexpanded\def\testpageonly{\c_page_tests_mode\plustwo \dodoubleempty\page_tests_test} % no penalties added to the mvl +\unexpanded\def\testpagesync{\c_page_tests_mode\plusthree\dodoubleempty\page_tests_test} % force sync + +\def\page_tests_test[#1][#2]% don't change, only add more methods + {\relax % needed before \if + \ifconditional\c_page_breaks_enabled + % new from here + \ifcase\testpagetrigger + \endgraf + \or\ifvmode + \dosomebreak\allowbreak + \else % indeed? + \vadjust{\allowbreak}% + \endgraf + \fi\fi + % till here + \ifdim\pagegoal<\maxdimen \relax + \ifdim\pagetotal<\pagegoal \relax + \d_page_tests_test\dimexpr + #1\lineheight + +\pagetotal + \ifdim\lastskip<\parskip+\parskip\fi + \ifthirdargument+#2\fi + \relax + \ifcase\testpagemethod + \ifdim\d_page_tests_test>.99\pagegoal + \penalty-\!!tenthousand\relax + \fi + \or + \ifdim\dimexpr\d_page_tests_test-\pagegoal\relax>-\lineheight + \penalty-\!!tenthousand\relax + \fi + \or + \getnoflines\pagegoal + \ifdim\dimexpr\d_page_tests_test-\noflines\lineheight\relax>-\lineheight + \penalty-\!!tenthousand\relax + \fi + \or % same as 0 but more accurate + \ifdim\dimexpr\d_page_tests_test-10\scaledpoint\relax>\pagegoal + \penalty-\!!tenthousand\relax + \fi + \fi + \else\ifnum\c_page_tests_mode=\plusthree + \page_tests_flush_so_far + \fi\fi + \else\ifnum\c_page_tests_mode=\plusone + \goodbreak + \fi\fi + \else + \endgraf + \fi} + +\def\page_tests_flush_so_far + {\endgraf + \ifdim\pagetotal>\pagegoal + \ifdim\dimexpr\pagetotal-\pageshrink\relax>\pagegoal + \goodbreak + \else + \page + \fi + \fi} + +%D Test column breaks. + +\def\testcolumn + {\dodoubleempty\page_tests_columns_test} + +\def\page_tests_columns_test[#1][#2]% + {\endgraf + \ifdim\pagegoal<\maxdimen + \ifdim\pagetotal<\pagegoal + \d_page_tests_test\dimexpr + \pagegoal + -\pagetotal + \ifdim\lastskip<\parskip+\parskip\fi + \ifsecondargument+#2\fi + \relax + \getrawnoflines\d_page_tests_test % (raw) + \ifnum#1>\noflines + \column + \fi + \else + \penalty-\plustenthousand % (untested) + \fi + \fi} + +\protect \endinput diff --git a/tex/context/base/page-col.mkiv b/tex/context/base/page-col.mkiv new file mode 100644 index 000000000..50a05d351 --- /dev/null +++ b/tex/context/base/page-col.mkiv @@ -0,0 +1,156 @@ +%D \module +%D [ file=page-col, % moved from page-ini +%D version=2011.12.07, % 2000.10.20, +%D title=\CONTEXT\ Page Macros, +%D subtitle=Column Helpers, +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +\writestatus{loading}{ConTeXt Page Macros / Column Helpers} + +%D Here we implement a coouple of helpers for dealing with +%D columns. For the moment we keep the names. + +\unprotect + +%D The next two registers can be used to store pre column +%D material as well as footnotes or so. + +\newbox\precolumnbox \newdimen\precolumnboxheight +\newbox\postcolumnbox \newdimen\postcolumnboxheight + +%D We reserve a counter for the number of columns as well as +%D the current column. Both are not to be changed by users! + +\newcount\nofcolumns \nofcolumns = 1 +\newcount\mofcolumns \mofcolumns = 1 + +\setnewconstant\maxnofcolumns 50 +\setnewconstant\allocatednofcolumns 0 + +%D The next dimensions reports the final column height + +\newdimen\finalcolumnheights +\newcount\finalcolumnlines + +%D This register can be used as a temporary storage for page +%D content. + +\newbox\restofpage + +%D A few more (some might go away): + +\newif\ifintermediatefootnotes +\newif\ifcarryoverfootnotes %\carryoverfootnotestrue +\newif\iflastcolumnfootnotes %\lastcolumnfootnotestrue +\newif\ifbalancecolumns %\balancecolumnstrue +\newif\ifbalancetoheight %\balancetoheighttrue +\newif\ifforcecolumngrid \forcecolumngridtrue +\newif\ifstretchcolumns \stretchcolumnsfalse +\newif\ifinheritcolumns \inheritcolumnsfalse +\newif\ifheightencolumns \heightencolumnsfalse + +\newif\ifbalancingcolumns +\newif\ifcollectingcontent +\newif\ifcolumnoverflow + +\newdimen\intercolumnwidth +\newdimen\localcolumnwidth +\newdimen\savedpagetotal + +\newconstant\columndirection % 0:lr 1:rl + +\def\minbalancetoplines {1} +\def\minfreecolumnlines {2} + +\newif\ifrecentercolumnbox \recentercolumnboxtrue +\newif\ifrerecentercolumnbox \rerecentercolumnboxtrue +\newif\ifpackcolumnfloats \packcolumnfloatstrue + +%D During initialization the temporary boxes are allocated. +%D This enables us to use as much columns as we want, without +%D exhausting the pool of boxes too fast. We could have packed +%D them in one box, but we've got enough boxes. +%D +%D Two sets of boxes are declared, the txtboxes are used for +%D the text, the topboxes are for moved column floats. + +\def\initializecolumns#1% + {\ifnum#1>\maxnofcolumns + \showmessage\m!columns1\maxnofcolumns + \nofcolumns\maxnofcolumns + \else + \nofcolumns#1\relax + \fi + \ifnum\nofcolumns>\allocatednofcolumns + \dorecurse\nofcolumns + {\ifnum\recurselevel>\allocatednofcolumns\relax + % \newbox\next \letgvalue{\??zc-\recurselevel-t}=\next + \expandafter\newbox\csname\??zc-\recurselevel-t\endcsname % text + \expandafter\newbox\csname\??zc-\recurselevel-f\endcsname % foot + \expandafter\newbox\csname\??zc-\recurselevel-h\endcsname % top insert + \expandafter\newbox\csname\??zc-\recurselevel-l\endcsname % top insert + \fi}% + \global\allocatednofcolumns\nofcolumns + \fi} + +\def\firstcolumnbox {\columntextbox\plusone} +\def\currentcolumnbox {\columntextbox\mofcolumns} +\def\lastcolumnbox {\columntextbox\nofcolumns} + +\def\firsttopcolumnbox {\columntopbox \plusone} +\def\currenttopcolumnbox {\columntopbox \mofcolumns} +\def\lasttopcolumnbox {\columntopbox \nofcolumns} + +\def\columntextbox #1{\csname\??zc-\number#1-t\endcsname} +\def\columnfootbox #1{\csname\??zc-\number#1-f\endcsname} +\def\columntopbox #1{\csname\??zc-\number#1-h\endcsname} +\def\columnbotbox #1{\csname\??zc-\number#1-l\endcsname} + +\def\columnsettextbox {\global\setbox\columntextbox} +\def\columnsetfootbox {\global\setbox\columnfootbox} +\def\columnsettopbox {\global\setbox\columntopbox} +\def\columnsetbotbox {\global\setbox\columnbotbox} + +\def\columngettextbox {\copy\columntextbox} +\def\columngetfootbox {\copy\columnfootbox} +\def\columngettopbox {\copy\columntopbox} +\def\columngetbotbox {\copy\columnbotbox} + +\def\columnerasetextboxes{\dorecurse\allocatednofcolumns{\columnsettextbox\recurselevel\emptybox}} +\def\columnerasefootboxes{\dorecurse\allocatednofcolumns{\columnsetfootbox\recurselevel\emptybox}} +\def\columnerasetopboxes {\dorecurse\allocatednofcolumns{\columnsettopbox \recurselevel\emptybox}} +\def\columnerasebotboxes {\dorecurse\allocatednofcolumns{\columnsetbotbox \recurselevel\emptybox}} + +%D Without going in details we present two macro's which handle +%D the columns. The action which is transfered by the the first +%D and only parameter can do something with \type +%D {\currentcolumnbox}. In case of the mid columns, \type +%D {\firstcolumnbox} and \type {\lastcolumnbox} are handled +%D outside these macro's. + +\def\dohandlecolumn#1% + {\mofcolumns\recurselevel + \let\currentcolumn\recurselevel + #1\relax} + +\def\dohandleallcolumns#1% + {\dorecurse\nofcolumns{\dohandlecolumn{#1}}} + +\def\dohandlerevcolumns#1% + {\dostepwiserecurse\nofcolumns\plusone\minusone{\dohandlecolumn{#1}}} + +\def\dohandlemidcolumns#1% + {\dohandleallcolumns + {\ifnum\recurselevel>\plusone + \ifnum\recurselevel<\nofcolumns + \dohandlecolumn{#1}% + \fi + \fi}} + +\protect \endinput diff --git a/tex/context/base/page-fac.mkiv b/tex/context/base/page-fac.mkiv new file mode 100644 index 000000000..fef1cd5ac --- /dev/null +++ b/tex/context/base/page-fac.mkiv @@ -0,0 +1,77 @@ +%D \module +%D [ file=page-fac, % moved from page-ini +%D version=2011.12.07, % 2000.10.20, +%D title=\CONTEXT\ Page Macros, +%D subtitle=Facing Pages, +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +\writestatus{loading}{ConTeXt Page Macros / Facing Pages} + +\unprotect + +%D \macros +%D {setupoppositeplacing,startopposite} +%D +%D \starttyping +%D \starttext +%D test \startopposite \blackrule[width=3cm,height=4cm] \stopopposite test +%D test \startopposite \blackrule[width=3cm,height=4cm] \stopopposite test +%D \stoptext +%D \stoptyping + +\newbox\b_page_facings_content + +\unexpanded\def\setupoppositeplacing + {\dodoubleargument\getparameters[\??np]} + +\unexpanded\def\startopposite + {\dowithnextboxcontent + {\hsize\makeupwidth}% + {\global\setbox\b_page_facings_content\vbox + {\ifvoid\b_page_facings_content + \@@npbefore + \else + \@@npinbetween + \unvbox\b_page_facings_content + \fi + \box\nextbox}}% + \vbox\bgroup} + +\unexpanded\def\stopopposite + {\egroup} + +\def\page_facings_finish + {\ifvoid\b_page_facings_content\else + \global\setbox\b_page_facings_content\vbox to \makeupheight + {\unvbox\b_page_facings_content + \@@npafter + \vss}% + \fi} + +\def\page_facings_flush + {\doif\@@npstate\v!start + {\ifvoid\b_page_facings_content\else + \ifnum\realpageno>\plusone + \begingroup + \pageornamentstate\plusone % tricky + \page_facings_finish + \page_boxes_shipout{\page_boxes_constructed_page\box\b_page_facings_content}% + \endgroup + \else + \global\setbox\b_page_facings_content\emptybox + \fi + \fi}} + +\setupoppositeplacing + [\c!state=\v!start, + \c!before=, + \c!inbetween=\blank, + \c!after=] + +\protect \endinput diff --git a/tex/context/base/page-flt.mkiv b/tex/context/base/page-flt.mkiv index 0a44ce992..29de9acd4 100644 --- a/tex/context/base/page-flt.mkiv +++ b/tex/context/base/page-flt.mkiv @@ -209,33 +209,14 @@ {\doifnotinset\v!high\floatspecification\vfill \box\floatbox \doifnotinset\v!low\floatspecification\vfill}% - \vfill\eject} - -% \def\doflushpagefloats -% {\doifoddpageelse -% {\ifnum\nofstackedfloatsincategory\s!rightpage>\zerocount -% \doflushsomepagefloat\s!rightpage -% \else\ifnum\nofstackedfloatsincategory\s!page>\zerocount -% \doflushsomepagefloat\s!page -% \else\ifnum\nofstackedfloatsincategory\s!leftpage>\zerocount -% \emptyhbox\vfill\eject -% %\doflushsomepagefloat\s!leftpage -% \fi\fi\fi} -% {\ifnum\nofstackedfloatsincategory\s!leftpage>\zerocount -% \doflushsomepagefloat\s!leftpage -% \else\ifnum\nofstackedfloatsincategory\s!page>\zerocount -% \doflushsomepagefloat\s!page -% \else\ifnum\nofstackedfloatsincategory\s!rightpage>\zerocount -% \emptyhbox\vfill\eject -% %\doflushsomepagefloat\s!rightpage -% \fi\fi\fi}} + \page_otr_fill_and_eject_page} \def\doflushpagefloats {\edef\checkedpagefloat{\ctxcommand{checkedpagefloat()}}% (true) for packed \ifx\checkedpagefloat\empty % nothing \else\ifx\checkedpagefloat\v!empty - \emptyhbox\vfill\eject + \emptyhbox \page_otr_fill_and_eject_page % why not dummy_page \else \doflushsomepagefloat\checkedpagefloat \fi\fi} diff --git a/tex/context/base/page-flw.mkiv b/tex/context/base/page-flw.mkiv index b896a9598..9afacf584 100644 --- a/tex/context/base/page-flw.mkiv +++ b/tex/context/base/page-flw.mkiv @@ -53,8 +53,7 @@ \bgroup \unvbox\textflowcollector{#1}% \hsize\textflowparameter{#1}\c!width - \doifsomething{\textflowparameter{#1}\c!style}% - {\doconvertfont{\textflowparameter{#1}\c!style}}% + \dousestyleparameter{\textflowparameter{#1}\c!style}% \unexpanded\def\stoptextflow{\endgraf\egroup}} {\let\stoptextflow\relax}} diff --git a/tex/context/base/page-grd.mkiv b/tex/context/base/page-grd.mkiv new file mode 100644 index 000000000..e882978ca --- /dev/null +++ b/tex/context/base/page-grd.mkiv @@ -0,0 +1,85 @@ +%D \module +%D [ file=page-grd, % moved from page-ini +%D version=2011.12.07, % 2000.10.20, +%D title=\CONTEXT\ Page Macros, +%D subtitle=Grids, +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +\writestatus{loading}{ConTeXt Page Macros / Grids} + +\unprotect + +\definepalet + [layout] + [grid=red, + page=green] + +\newconstant\c_page_grids_location +\newconstant\c_page_grids_line_mode +\newconstant\c_page_grids_lineno_mode + +\unexpanded\def\showgrid + {\dosingleempty\page_grids_show} + +\def\page_grids_show[#1]% + {\c_page_grids_location \plusone % downward compatible default + \c_page_grids_line_mode \plusone + \c_page_grids_lineno_mode\plusone + \processallactionsinset + [#1]% + [ \v!reset=>\c_page_grids_location \zerocount, + \v!bottom=>\c_page_grids_location \plusone, + \v!top=>\c_page_grids_location \plustwo, + \v!none=>\c_page_grids_line_mode \zerocount, + \v!all=>\c_page_grids_line_mode \plusone, + \v!lines=>\c_page_grids_line_mode \plustwo, + \v!frame=>\c_page_grids_line_mode \plusthree, + \v!nonumber=>\c_page_grids_lineno_mode\zerocount, + \v!right=>\c_page_grids_lineno_mode\plusone, + \v!left=>\c_page_grids_lineno_mode\plustwo, + \v!outer=>\c_page_grids_lineno_mode\plusthree]% + \ifcase\c_page_grids_location + \let\page_grids_add_to_box\gobbleoneargument + \else % 1=bottom 2=top + \let\page_grids_add_to_box\page_grids_add_to_box_indeed + \fi} + +% if really needed for speed we can cache the grid + +\let\page_grids_add_to_box\gobbleoneargument + +\def\page_grids_add_to_box_indeed#1% to be checked for color and layer ..... use mp + {\startcolor[layout:grid]% + \gridboxlinemode \c_page_grids_line_mode + \gridboxlinenomode\c_page_grids_lineno_mode + \setgridbox\scratchbox\makeupwidth\textheight % todo: check color + \global\setbox#1\hbox % global ? + {\ifcase\c_page_grids_location\or\or\box#1\hskip-\makeupwidth\fi + \begingroup % color + \ifcase\layoutcolumns\else + \gray + \setlayoutcomponentattribute{\v!grid:\v!columns}% + \hbox \layoutcomponentboxattribute to \makeupwidth + {\dorecurse\layoutcolumns + {\hskip\layoutcolumnwidth + \ifnum\recurselevel<\layoutcolumns + \vrule + \!!height\ht\scratchbox + \!!depth\dp\scratchbox + \!!width\layoutcolumndistance + \fi}}% + \hskip-\makeupwidth + \fi + \setlayoutcomponentattribute{\v!grid:\v!lines}% + \hbox \layoutcomponentboxattribute{\box\scratchbox}% + \endgroup + \ifcase\c_page_grids_location\or\hskip-\makeupwidth\box#1\fi}% + \stopcolor} + +\protect \endinput diff --git a/tex/context/base/page-imp.mkiv b/tex/context/base/page-imp.mkiv index b320eae03..fcfe43e34 100644 --- a/tex/context/base/page-imp.mkiv +++ b/tex/context/base/page-imp.mkiv @@ -17,89 +17,6 @@ \unprotect -% todo: impose a la mkiv (us elua specification tables) - -% sizing bug: -% -% \setuppapersize[A4][A4,landscape] \setuparranging[2UP] \showframe -% -% \starttext \dorecurse{10}{\input tufte \par} \stoptext - -\newif\ifclipprintbox \clipprintboxtrue % todo: conditional -%newif\ifclippagebox \clippageboxtrue - -\def\clippedprintbox#1#2% can be made more efficient, see other clipper - {\ifclipprintbox - \!!widthc \pagebackgroundoffset - \!!widtha \dimexpr\paperwidth + \!!widthc\relax - \!!heighta\dimexpr\paperheight+2\!!widthc\relax - \setbox#2\vbox to \paperheight{\vfill\box#2}% - \ht#2\paperheight - \wd#2\paperwidth - \setbox#2\vbox - {\framed - [\c!offset=\!!widthc,\c!strut=\v!no,\c!frame=\v!off] - {\box#2}}% - \setbox#2\hbox to \paperwidth - {\ifcase#1\relax - \!!widthb\zeropoint - \hskip-\!!widthc - \else - \!!widthb\!!widthc - \fi - \lower\!!widthc\hbox - {\clip - [\c!width=\!!widtha,\c!height=\!!heighta, - \c!hoffset=\!!widthb,\c!voffset=\zeropoint] - {\box#2}}}% - \wd#2\paperwidth - \ht#2\paperheight - \fi - \box#2\relax} - -\let\clippagebox \gobbleoneargument -\let\clipprintbox\gobbleoneargument - -% \setuppagenumbering[alternative=doublesided] -% \setupcolors[state=start] -% \setuppapersize[A4][A4,oversized] -% \setuplayout[location=middle,clipoffset=5mm] -% \setupbackgrounds -% [page] -% [frame=on,rulethickness=1mm, -% backgroundoffset=10mm,background=color,backgroundcolor=red] -% \starttext \dorecurse{10}{\input tufte \par} \stoptext - -\def\clippagebox % skip fast over false - {\ifdim\layoutparameter\c!clipoffset>\zeropoint - \expandafter\doclippagebox - \else - \expandafter\gobbleoneargument - \fi} - -\def\doclippagebox#1% - {\!!widtha \wd#1% - \!!heighta\ht#1% - \!!deptha \dp#1% - \setbox#1\hbox - {\!!widthb\layoutparameter\c!clipoffset - \advance\!!heighta\dimexpr\!!deptha+2\!!widthb\relax - \advance\!!widtha \!!widthb - \doifbothsides - {\advance\!!widtha\!!widthb \!!widthc-\!!widthb \hskip\!!widthc}% - {\!!widthc\zeropoint} - {\!!widthc-\!!widthb \hskip\!!widthc}% - \lower\!!widthb\hbox - {\clip - [\c!hoffset=\!!widthc, - \c!voffset=-\!!widthb, - \c!width=\!!widtha, - \c!height=\!!heighta]% - {\box#1}}}% - \wd#1\!!widtha - \ht#1\!!heighta - \dp#1\!!deptha} - %D \macros %D {starttextdata} %D @@ -118,12 +35,6 @@ \prependtoks \flushtextdata \to \everylastshipout -\def\installpagehandler#1#2% % a handler takes one argument: something to be boxed - {\setgvalue{\??pp:\c!method:#1}##1{#2{##1}}} % and shipped out (don't depend on the exact package) - -\installpagehandler\v!normal - {\ifarrangingpages\expandafter\actualarrange\else\expandafter\actualshipout\fi} - % Problem: we need to apply the finalizers to a to be shipped out page (as % we can have positioning involved). However, we can also add stuff in the % imposition, like cropmarks. Fortunately we do that with metapost so @@ -140,35 +51,75 @@ \newconstant \whichpagetoshipout % 0=all 1=odd 2=even \newbox \shipoutscratchbox -\newbox \postponedcontent \setnewconstant\shipoutfinalizemethod\plusone % this will be default (we will have two finalizers) -\def\myshipout#1% - {\beforeshipout % voor de pagebody dus ! - \dontshowcomposition - \dontcomplain +\def\installpagehandler#1#2% % a handler takes one argument: something to be boxed + {\setgvalue{\??pp:h:#1}##1{#2{##1}}} % and shipped out (don't depend on the exact package) + +\def\page_shipouts_handle + {\csname\??pp:h:\ifcsname\??pp:h:\v_page_target_method\endcsname + \v_page_target_method + \else + \v!none + \fi\endcsname} + +\installpagehandler\v!normal + {\ifarrangingpages + \expandafter\page_shipouts_arrange + \else + \expandafter\page_shipouts_normal + \fi} + +\installpagehandler\v!none + {\page_shipouts_ignore} + +\def\page_boxes_shipout#1% or: \page_shipouts_apply + {\dontshowcomposition % redundant + \dontcomplain % redundant + \the\everybeforeshipout \ifcase\shipoutfinalizemethod - \executeifdefined{\??pp:\c!method:\@@ppmethod}\gobbleoneargument{#1}% + \page_shipouts_handle{#1}% \else \setbox\shipoutscratchbox\hbox{#1}% just in case there are objects there, hook for testing (will go away) \finalizeshipoutbox\shipoutscratchbox - \executeifdefined{\??pp:\c!method:\@@ppmethod}\gobbleoneargument{\box\shipoutscratchbox}% + \page_shipouts_handle{\box\shipoutscratchbox}% \fi - \setnextrealpageno - \aftershipout} - -\def\flushatshipout - {\dowithnextbox - {\global\setbox\postponedcontent\hbox to \zeropoint - {%\hskip-\maxdimen % niet hier, gaat mis in acrobat (clipt) - \unhbox\postponedcontent\unhbox\nextbox}% was \box - \global\postponedcontent\zeropoint - \global\postponedcontent\zeropoint - \global\postponedcontent\zeropoint}% - \hbox} - -\def\actualshipout#1% todo: less callbacks, #1 will go away + \the\everyaftershipout + \setnextrealpageno} + +\def\page_shipouts_ignore#1% + {\begingroup + \message + {[\ifarrangingpages arranged \fi page + \ifarrangingpages\the\arrangeno\else\the\realpageno\fi\normalspace + not flushed]}% + \setbox\scratchbox\hbox{#1}% + \deadcycles\zerocount + \endgroup} + +\def\page_otr_flush_every_stuff % this will become obsolete ... was backend related + {\begingroup + \setbox\scratchbox\hbox + {% before the main one ! + \ifcase\realfolio \or + \the\everyfirstshipout + \global\everyfirstshipout\emptytoks + \fi + % the main one + \the\everyshipout\relax + % always last (and after the main one) + \ifnum\realpageno=\lastpage\relax + \the\everylastshipout + \global\everylastshipout\emptytoks + \fi}% + \smashbox\scratchbox + \box\scratchbox + \endgroup} + +\newdimen\d_page_shipouts_offset \d_page_shipouts_offset=-1in + +\def\page_shipouts_normal#1% {\global\advance\shippedoutpages\plusone % this is not resource safe! \ifx\pagestoshipout\empty @@ -182,55 +133,29 @@ \donetrue \fi \else % testen, aangepast / expanded nodig ? - \normalexpanded{\noexpand\doifinsetelse{\the\shippedoutpages}{\pagestoshipout}}% + \normalexpanded{\doifinsetelse{\the\shippedoutpages}{\pagestoshipout}}% \donetrue\donefalse \fi \ifdone - \begingroup + \setbox\shipoutscratchbox\hbox{#1}% \ifcase\shipoutfinalizemethod - \setbox\shipoutscratchbox\hbox{#1}% \finalizeshipoutbox\shipoutscratchbox \fi - \setbox\scratchbox\hbox - {% before the main one ! - \ifcase\realfolio \or - \the\everyfirstshipout - \global\everyfirstshipout\emptytoks - \fi - % the main one - \the\everyshipout\relax - % always last (and after the main one) - \ifnum\realpageno=\lastpage\relax - \the\everylastshipout - \global\everylastshipout\emptytoks - \fi}% - \smashbox\scratchbox - \shipout\vbox + \normalshipout\vbox {\offinterlineskip - \scratchdimen-1in % to be done in luatex: zero that one - \vskip\scratchdimen - \hskip\scratchdimen - \hbox % \setbox0=\box.. is nicer - {\box\scratchbox - \ifvoid\postponedcontent\else\box\postponedcontent\fi % evt ver naar links ! - \ifcase\shipoutfinalizemethod - \box\shipoutscratchbox - \else - \hbox{#1}% - \fi}}% - \endgroup + \vskip\d_page_shipouts_offset + \hskip\d_page_shipouts_offset + \hbox + {\page_otr_flush_every_stuff + \page_otr_flush_special_content + \box\shipoutscratchbox}}% \else - \message - {[\ifarrangingpages arranged \fi page - \ifarrangingpages\the\arrangeno\else\the\realpageno\fi\normalspace - not flushed]}% - \setbox0\hbox{#1}% - \deadcycles\zerocount + \page_shipouts_ignore{#1}% \fi} -\def\actualarrange#1% - {\setbox0\hbox{#1}% - \pusharrangedpage0% +\def\page_shipouts_arrange#1% + {\setbox\scratchbox\hbox{#1}% + \pusharrangedpage\scratchbox \deadcycles\zerocount} %D We need a couple of boxes for duplex printing \unknown @@ -257,17 +182,17 @@ \newcount\arrangedpageX \arrangedpageX\plusone \newcount\arrangedpageY \arrangedpageY\plusone -\def\calculatepaperoffsets#1% - {\global\paperoffset\getvalue{\??pp#1\c!offset}% +\def\pages_paper_set_offsets + {\global\paperoffset\v_page_target_offset \global\advance\paperwidth -2\dimexpr\paperoffset/\arrangedpageX\relax \global\advance\paperheight-2\dimexpr\paperoffset/\arrangedpageY\relax} \def\doinstallarrangedoption#1#2% - {\setvalue{\??pp=>#1}{#2}} + {\setvalue{\??pp:o:#1}{#2}} \def\doinstalledarrangedoption#1% - {\ifcsname\??pp=>#1\endcsname - \csname\??pp=>#1\endcsname + {\ifcsname\??pp:o:#1\endcsname + \csname\??pp:o:#1\endcsname \else \checkinstalledpagearrangement{#1}% this installs the arranger \fi} @@ -334,10 +259,13 @@ \fi} \def\installpagearrangement #1 % will lchange, no space - {\setgvalue{\??pp\??pp#1}} + {\setgvalue{\??pp:a:#1}} \def\checkinstalledpagearrangement#1% can be empty: aaa,,bbb - {\executeifdefined{\??pp\??pp#1}\donothing} + {\executeifdefined{\??pp:a:#1}\donothing} + +\let\poparrangedpages\relax +\let\pusharrangedpage\relax \def\dosetuparrangement#1#2#3#4#5#6#7#8% {\global\arrangedpageX #1% @@ -407,7 +335,7 @@ \ifcase\scratchcounter\else \advance\scratchcounter \plusone \dostepwiserecurse\scratchcounter\arrangedpageT\plusone - {\noheaderandfooterlines\ejectdummypage}% + {\noheaderandfooterlines\page_otr_insert_dummy_page}% \fi \fi} @@ -427,7 +355,7 @@ \def\pagecutmarksymbol{\the\arrangeno}} \def\outputarrangedbox#1% - {\bgroup + {\begingroup \forgetall % somehow we're back and need to redo this \gotonextarrangepage \ifnum\arrangedrotationO\arrangedrotationE>\zerocount @@ -443,15 +371,24 @@ \fi}% \fi \ifconditional\arrangedmirrorstate - \setbox#1\vbox{\domirrorbox\vbox{\box#1}}% + \page_boxes_apply_mirror{#1}% \fi \ifconditional\arrangednegatestate - \negatecolorbox{#1}% + \page_boxes_apply_negate{#1}% \fi - \finishpagebox#1% - \ifconditional\arrangedbackgroundstate\addprintbackground#1\fi - \actualshipout{\box#1}% - \egroup} + \page_marks_add_more #1% + \page_boxes_apply_center #1% + \page_boxes_apply_mirror_print #1% + \page_boxes_apply_orientate_print#1% + \page_boxes_apply_offset #1% + \page_boxes_apply_negate_print #1% + % + \ifconditional\arrangedbackgroundstate + \page_backgrounds_add_to_print#1% + \fi + % + \page_shipouts_normal{\box#1}% + \endgroup} %D The format file can be 16K smaller when we postpone the %D real arrangments. Some day ... @@ -604,13 +541,13 @@ {\splitoffarrangedpagesTWO \ifconditional\arrangedswapstate \global\setbox\arrangedpageA\hbox - {\clippedprintbox\zerocount\arrangedpageA - \clippedprintbox\plusone \arrangedpageB}% + {\page_boxes_apply_clip_print_left \arrangedpageA\box\arrangedpageA + \page_boxes_apply_clip_print_right\arrangedpageB\box\arrangedpageB}% \setfalse\arrangedswapstate \else \global\setbox\arrangedpageA\hbox - {\clippedprintbox\zerocount\arrangedpageB - \clippedprintbox\plusone \arrangedpageA}% + {\page_boxes_apply_clip_print_left \arrangedpageB\box\arrangedpageB + \page_boxes_apply_clip_print_right\arrangedpageA\box\arrangedpageA}% \settrue\arrangedswapstate \fi \ht\arrangedpageA\paperheight @@ -1141,22 +1078,30 @@ {\advancearrangedpageN \global\advance\arrangedpageM\plusone \reportarrangedpage\arrangedpageN - \global\setbox\arrangedpageB\hbox \ifdim\@@ppwidth>\zeropoint to \@@ppwidth \fi + \global\setbox\arrangedpageB\hbox \ifdim\v_page_target_width>\zeropoint to \v_page_target_width \fi {\ifvoid\arrangedpageB\else \unhbox\arrangedpageB - \ifdim\@@ppdx>\zeropoint \else \hss\fi - \hskip\@@ppdx - \ifdim\@@ppdx>\zeropoint \else \hss\fi + \ifdim\v_page_target_dx>\zeropoint + \hskip\v_page_target_dx + \else + \hss + \hskip\v_page_target_dx + \hss + \fi \fi \box#1}% \ifnum\arrangedpageM<\arrangedpageX\else - \global\setbox\arrangedpageA\vbox \ifdim\@@ppheight>\zeropoint to \@@ppheight \fi + \global\setbox\arrangedpageA\vbox \ifdim\v_page_target_height>\zeropoint to \v_page_target_height \fi {\offinterlineskip \ifvoid\arrangedpageA\else \unvbox\arrangedpageA - \ifdim\@@ppdy>\zeropoint \else \vss\fi - \vskip\@@ppdy - \ifdim\@@ppdy>\zeropoint \else \vss\fi + \ifdim\v_page_target_dy>\zeropoint + \vskip\v_page_target_dy + \else + \vss + \vskip\v_page_target_dy + \vss + \fi \fi \box\arrangedpageB}% \global\arrangedpageM\zerocount @@ -1175,19 +1120,42 @@ \fi} \installpagearrangement XY - {\dosetuparrangement\@@ppnx\@@ppny\@@ppxy\!!zerocount\!!zerocount + {\dosetuparrangement + \v_page_target_nx + \v_page_target_ny + \v_page_target_xy + \zerocount + \zerocount \pusharrangedpageXY\poparrangedpagesXY\relax} %D A crazy definition, don't guess who pushed me for the landscape option. +\def\page_imposition_xy_height + {\dimexpr + \dimexpr + \v_page_target_height + -\numexpr\v_page_target_ny-1\relax\v_page_target_dy + \relax + /\v_page_target_ny + \relax} + +\def\page_imposition_xy_width + {\dimexpr + \dimexpr + \v_page_target_width + -\numexpr\v_page_target_nx-1\relax\v_page_target_dx + \relax + /\v_page_target_nx + \relax} + \definepapersize [XY] - [\c!height=\dimexpr\dimexpr\@@ppheight-\numexpr\@@ppny-1\relax\dimexpr\@@ppdy\relax\relax/\@@ppny\relax, - \c!width =\dimexpr\dimexpr\@@ppwidth -\numexpr\@@ppnx-1\relax\dimexpr\@@ppdx\relax\relax/\@@ppnx\relax] + [\c!height=\page_imposition_xy_height, + \c!width =\page_imposition_xy_width] \setuppaper - [\c!width =\dimexpr\printpaperwidth -2\dimexpr\@@ppbackspace\relax\relax, - \c!height=\dimexpr\printpaperheight-2\dimexpr\@@pptopspace \relax\relax] + [\c!width =\dimexpr\printpaperwidth -2\v_page_target_backspace\relax, + \c!height=\dimexpr\printpaperheight-2\v_page_target_topspace \relax] % \definepageshift[test][horizontal][10pt,20pt,30pt,40pt,50pt] % \definepageshift[test][vertical] [10pt,20pt,30pt,40pt,50pt] @@ -1205,52 +1173,68 @@ % #1=name #2=horizontal|vertical #3=shiftlist \unexpanded\def\definepageshift - {\dotripleargument\dodefinepageshift} + {\dotripleargument\page_boxes_define_shift} -\def\dodefinepageshift[#1][#2][#3]% +\def\page_boxes_define_shift[#1][#2][#3]% {\setvalue{\??pt#2:#1}{#3}} -\letempty\hpageshifts \newcount\nofhpageshifts -\letempty\vpageshifts \newcount\nofvpageshifts +\let\page_boxes_h_shifts\empty +\let\page_boxes_v_shifts\empty -\def\dogetpageshift#1#2#3% #1=\dimenx #2=\xpageshifts #3=\nofxpageshifts - {\ifx#2\empty % we could do this in lua - #1\zeropoint - \else +\newcount\c_page_boxes_h_shifts +\newcount\c_page_boxes_v_shifts + +\newdimen\d_page_boxes_h_shifts +\newdimen\d_page_boxes_v_shifts + +\let\page_boxes_apply_shift_print\gobbleoneargument +\let\page_boxes_apply_shift_paper\gobbleoneargument + +\def\page_boxes_filter_shift#1#2#3% #1=\dimenx #2=\xpageshifts #3=\nofxpageshifts + {#1\zeropoint + \ifx#2\empty \else \global\advance#3\plusone \getfromcommacommand[#2][#3]% \ifx\commalistelement\empty \global#3\plusone % we cycle \getfromcommacommand[#2][#3]% \fi - \ifx\commalistelement\empty - #1\zeropoint - \else - #1=\commalistelement - \donetrue + \ifx\commalistelement\empty \else + #1\commalistelement \fi \fi} -\def\shiftpagebox#1% - {\donefalse - \dogetpageshift{\dimen0}\hpageshifts\nofhpageshifts - \dogetpageshift{\dimen2}\vpageshifts\nofvpageshifts - \ifdone % see also layout offsets, maybe \movebox - \edef\next{\wd#1\the\wd#1\ht#1\the\ht#1\dp#1\the\dp#1}% - \setbox#1\vbox - {\offinterlineskip\vskip\dimen2\hskip\dimen0\box#1}% - \next +\def\page_boxes_apply_shift#1% + {\page_boxes_filter_shift\d_page_boxes_h_shifts\page_boxes_h_shifts\c_page_boxes_h_shifts + \page_boxes_filter_shift\d_page_boxes_v_shifts\page_boxes_v_shifts\c_page_boxes_v_shifts + \ifzeropt\d_page_boxes_h_shifts + \ifzeropt\d_page_boxes_v_shifts + % nothing to shift + \else + \page_boxes_apply_shift_indeed#1% + \fi + \else + \page_boxes_apply_shift_indeed#1% \fi} +\def\page_boxes_apply_shift_indeed#1% + {\edef\next{\wd#1\the\wd#1\ht#1\the\ht#1\dp#1\the\dp#1}% + \setbox#1\vbox + {\offinterlineskip + \vskip\d_page_boxes_v_shifts + \hskip\d_page_boxes_h_shifts + \box#1}% + \next} + \unexpanded\def\setuppageshift - {\dotripleempty\dosetuppageshift} - -\def\dosetuppageshift[#1][#2][#3]% page|paper horizontal vertical - {\ifthirdargument % paper=arrange - \edef\hpageshifts{\ifcsname\??pt\v!horizontal:#2\endcsname\csname\??pt\v!horizontal:#2\endcsname\fi}% - \edef\vpageshifts{\ifcsname\??pt\v!vertical :#3\endcsname\csname\??pt\v!vertical :#3\endcsname\fi}% - \doifelse{#1}\v!page {\let\shiftprintpagebox\shiftpagebox}{\let\shiftprintpagebox\gobbleoneargument}% - \doifelse{#1}\v!paper{\let\shiftpaperpagebox\shiftpagebox}{\let\shiftpaperpagebox\gobbleoneargument}% + {\dotripleempty\page_boxes_setup_shift} + +\def\page_boxes_setup_shift[#1][#2][#3]% page|paper horizontal vertical + {\ifthirdargument % paper=arrange + \edef\page_boxes_h_shifts{\ifcsname\??pt\v!horizontal:#2\endcsname\csname\??pt\v!horizontal:#2\endcsname\fi}% + \edef\page_boxes_v_shifts{\ifcsname\??pt\v!vertical :#3\endcsname\csname\??pt\v!vertical :#3\endcsname\fi}% + \doifelse{#1}\v!page {\let\page_boxes_apply_shift_print\page_boxes_apply_shift}{\let\page_boxes_apply_shift_print\gobbleoneargument}% + \doifelse{#1}\v!paper{\let\page_boxes_apply_shift_paper\page_boxes_apply_shift}{\let\page_boxes_apply_shift_paper\gobbleoneargument}% \else\ifsecondargument \doifinsetelse{#1}{\v!page,\v!paper} {\setuppageshift[#1][#2][#2]} @@ -1259,5 +1243,4 @@ \setuppageshift[\v!page][#1][#1]% \fi\fi\fi} - \protect \endinput diff --git a/tex/context/base/page-inf.mkiv b/tex/context/base/page-inf.mkiv new file mode 100644 index 000000000..41e3520c8 --- /dev/null +++ b/tex/context/base/page-inf.mkiv @@ -0,0 +1,104 @@ +%D \module +%D [ file=page-inf, % moved from page-ini +%D version=2011.12.07, % 2000.10.20, +%D title=\CONTEXT\ Page Macros, +%D subtitle=Tracing Info, +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +\writestatus{loading}{ConTeXt Page Macros / Tracing Info} + +% this needs a real cleanup .. will be a more detailed list + +\unprotect + +\newtoks\everyresetversion +\newtoks\everysetupversion + +\let\currentversioninfo\empty + +\def\setupversion + {\dosingleargument\page_info_setup} + +\let\version\setupversion + +\let\page_info_add_to_box\gobbleoneargument + +\def\page_info_setup[#1]% + {\the\everyresetversion + \ifcsname\??ly:v:#1\endcsname + \edef\currentversioninfo{#1}% + \let\page_info_add_to_box\page_info_add_to_box_indeed + \else + \let\currentversioninfo\empty + \let\page_info_add_to_box\gobbleoneargument + \fi + \the\everysetupversion} + +\unexpanded\def\place_info_place_info % at the bottom of the page + {\csname\??ly:v:\currentversioninfo\endcsname} + +\unexpanded\def\installversioninfo#1#2% + {\setvalue{\??ly:v:#1}{#2}} + +\unexpanded\def\includeversioninfo#1% + {\csname\??ly:v:#1\endcsname} + +\installversioninfo\v!concept + {\vskip\!!sixpoint + \hbox to \makeupwidth + {\infofont + \v!concept:\space\currentdate + \hss + \page_adapts_status_info}} + +\installversioninfo\v!file + {\vskip\!!sixpoint + \hbox to \makeupwidth + {\infofont + \getmessage\m!system{27}:\space\currentdate\space + \donefalse + \ifx\currentproject \empty \else \space\v!project :\space\currentproject \space \donetrue \fi + \ifx\currentproduct \empty \else \space\v!product :\space\currentproduct \space \donetrue \fi + \ifx\currentcomponent\empty \else \space\v!component:\space\currentcomponent\space \donetrue \fi + \ifdone \else \space\v!file :\space\jobname \space \fi + \hss + \page_adapts_status_info}} + +\installversioninfo\v!temporary + {\includeversioninfo\v!file} + +\appendtoks + \overfullrule\zeropoint +\to \everyresetversion + +\appendtoks + \ifx\currentversioninfo\v!temporary + \overfullrule5\points + \fi +\to \everysetupversion + +\newbox\b_page_versions + +\def\page_info_add_to_box_indeed#1% + {\scratchdimen\wd#1% + \setbox\b_page_versions\vbox to \ht#1% + {\vfill + \settexthoffset + \hsize\dimexpr\scratchdimen-2\texthoffset\relax + \hskip\texthoffset % brrrr + \vbox to \zeropoint{\vss\place_info_place_info}% + \vskip\bodyfontsize}% + \dp\b_page_versions\zeropoint + \wd\b_page_versions\scratchdimen + \setbox#1\hbox{\box#1\hskip-\scratchdimen\box\b_page_versions}} + +\setupversion % resets + [\v!final] + +\protect \endinput diff --git a/tex/context/base/page-ini.mkiv b/tex/context/base/page-ini.mkiv index c9bd05775..8cb146505 100644 --- a/tex/context/base/page-ini.mkiv +++ b/tex/context/base/page-ini.mkiv @@ -25,177 +25,93 @@ %D mechanism use a different way of looping over columns. \unprotect - -\def\m!otr{otr} - -% \setnewconstant\normalpagebox 255 % already set - -\newbox\pagebox - -\ifx\recalculatelayout\undefined - - \let \recalculatelayout \relax - -\fi - -\ifx\recalculatebackgrounds\undefined - - \let \recalculatebackgrounds \relax - \let \addmainbackground \gobbleoneargument % <box> - \let \addtextbackground \gobbleoneargument % <box> - \let \addpagebackground \gobbleoneargument % <box> - \let \addprintbackground \gobbleoneargument % <box> - \let \addstatusinfo \gobbleoneargument % <box> - -\fi -\ifx\realpageno\undefined - - \countdef\realpageno = 0 \realpageno = 1 - \countdef\userpageno = 1 \userpageno = 1 - \countdef\subpageno = 2 \subpageno = 0 % !! - \countdef\arrangeno = 3 \arrangeno = 0 % !! - - \let\pageno\userpageno - -\fi - -\ifx\realfolio\undefined +\def\m!otr{otr} - \def\realfolio{\the\realpageno} +\newbox \pagebox +\newcount \nofshipouts -\fi +\newconstant\c_page_otr_eject_penalty \c_page_otr_eject_penalty -\plustenthousand +\newconstant\c_page_otr_super_penalty \c_page_otr_super_penalty -\plustwentythousand -\newcount\nofshipouts +\let\ejectpenalty\c_page_otr_eject_penalty % for old times sake \appendtoks - \global\advance\nofshipouts\plusone + \global\advance\nofshipouts\plusone \to \everyaftershipout -% principle: -% -% multiple otr's -% -% (1) single column, simple routine (old one) -% (2) multi column, collect and split routine (old one) -% (3) multi column, page by page (new one, needed for taco) -% (4) single column, spread handling (for fun) -% (5) multi column, page by page, spread handling (as challenge) -% -% common components -% -% (1) float placement -% (2) float flushing -% (3) page body building -% (4) ... -% -% ort -% -% + balancing -% - mixed / one / multi / balancetofit -% + backgrounds -% + pre / post -% + distances / heights -% + ragged / baseline / normal -% - pos sync -% - last page -% -% - itemize / subtexts -> old mechanism -% -% floats -% -% - top / bottom / side / page / column / spead -% - flush / packed flush / current page / next page / area -% -% footnotes -% -% + carry over pre column / local to column -% + last column / pre last column / each column -% - multiple classes -% - area / page / end -% -% areas -% -% - top / bottom / mid in spread -% -% IMPORTANT -% -% switchtobodyfont in between ivm top - -% floats: -% -% tricky in balancing mode, a la huidige multi columns - -% \ifx\dosetuplayout\undefined % overloaded in page-lay ! -% \unexpanded\def\setuplayout{\dodoubleempty\getparameters[\??ly]} -% \fi - \ifx\mkprocesscolumncontents\undefined\let\mkprocesscolumncontents\gobbleoneargument\fi \ifx\mkprocesspagecontents \undefined\let\mkprocesspagecontents \gobbleoneargument\fi \ifx\mkprocessboxcontents \undefined\let\mkprocessboxcontents \gobbleoneargument\fi - -\def\normalejectpenalty{-\plustenthousand } \let\ejectpenalty\normalejectpenalty -\def\normalsuperpenalty{-\plustwentythousand} \let\superpenalty\normalsuperpenalty - -%D In case we're not running \ETEX, we need to bypass a -%D couple of primitives. - -% ONE = single column -% MUL = multi column -% SET = columns sets -\def\@@OTR{OTR} +%D As we have several fundamentally different output routines +%D available we need commands that adapt themselves to the +%D current output routine. Such commands are implemented +%D in the respective modules and prefixed: +%D +%D \starttabulate[|T|T|] +%D \NC OTRONE \NC single column \NC \NR +%D \NC OTRMUL \NC multi column \NC \NR +%D \NC OTRSET \NC columns sets \NC \NR +%D \stoptabulate +%D +%D The following macros are not to be changed by users: -\let\OTRdefault\empty +\let\OTRidentifier\empty % public +\let\OTRdefault \empty % public +\let\OTRunknown \empty +\def\OTRprefix {OTR} -% obsolete +%D We keep a list of registered commands so that we can +%D bind them when we switch to a specific routine. -\def\installotr#1% andere naam, beter \connectotr of zo - {\def\OTRidentifier{#1}} +\newtoks\t_page_otr_registered_commands -\def\OTRcommand#1% - {\csname\@@OTR - \ifcsname\@@OTR\OTRidentifier\expandafter\gobbleoneargument\string#1\endcsname - \OTRidentifier - \else\ifcsname\@@OTR\OTRdefault\expandafter\gobbleoneargument\string#1\endcsname % fallback - \OTRdefault +\def\registerotrcommand#1% + {\t_page_otr_registered_commands\expandafter + {\the\t_page_otr_registered_commands + \page_otr_with_command#1}} + +\def\page_otr_preset_command#1% + {\expandafter\let\expandafter#1\csname\OTRprefix + \ifcsname\OTRprefix\OTRidentifier\expandafter\gobbleoneargument\string#1\endcsname + \OTRidentifier % dedicated + \else\ifcsname\OTRprefix\OTRdefault\expandafter\gobbleoneargument\string#1\endcsname + \OTRdefault % fallback + \else + \s!unknown % dummy \fi\fi \expandafter\gobbleoneargument\string#1\endcsname} -\def\activateotr#1#2% +\def\page_otr_activate#1#2% {\def\OTRidentifier{#1}% - \def\OTRdefault {#2}} + \def\OTRdefault {#2}% + \let\page_otr_with_command\page_otr_preset_command + \the\t_page_otr_registered_commands} -% variant that does a preset: +\appendtoks + \page_otr_activate{ONE}\empty +\to \everydump -\newtoks\registeredotrcommands +%D The next commands is a direct call to a specific command but is +%D normally only used if one wants to call a command inside another +%D one or for the main (not triggered) outputroutines. -\def\registerotrcommand#1% - {\appendtoks\dowithotrcommand#1\to\registeredotrcommands} - -\def\dopresetotrcommand#1% - {\expandafter\let\expandafter#1\csname\@@OTR - \ifcsname\@@OTR\OTRidentifier\expandafter\gobbleoneargument\string#1\endcsname - \OTRidentifier - \else\ifcsname\@@OTR\OTRdefault\expandafter\gobbleoneargument\string#1\endcsname % fallback - \OTRdefault +\def\OTRcommand#1% + {\csname\OTRprefix + \ifcsname\OTRprefix\OTRidentifier\expandafter\gobbleoneargument\string#1\endcsname + \OTRidentifier % dedicated + \else\ifcsname\OTRprefix\OTRdefault\expandafter\gobbleoneargument\string#1\endcsname + \OTRdefault % fallback + \else + \s!unknown % dummy \fi\fi \expandafter\gobbleoneargument\string#1\endcsname} -\def\activateotr#1#2% - {\def\OTRidentifier{#1}% - \def\OTRdefault {#2}% - \let\dowithotrcommand\dopresetotrcommand - \the\registeredotrcommands} - -\appendtoks - \activateotr{ONE}{}% -\to\everydump - %D The initialization of the \type {\hsize} and \type {\vsize} -%D depends on the OTR used. +%D depends on the OTR used, as do some other commands. -% todo: \registerotrcommand\output, is a toks +% These definitions will move to where they are introduced. \registerotrcommand\setvsize \registerotrcommand\sethsize @@ -216,588 +132,251 @@ \registerotrcommand\setfloathsize -% wrong, will be redone -% -% \registerotrcommand\someherefloat -% \registerotrcommand\somefixdfloat -% \registerotrcommand\somepagefloat -% \registerotrcommand\sometopsfloat -% \registerotrcommand\somebotsfloat -% \registerotrcommand\somesidefloat +% \registerotrcommand\_specific_final_side_float_output % todo -% beter een \installotr#1 met #1 = macro en auto test - -\newif \iftraceotr -\newif \ifinotr -\newtoks \mainoutput -\newcount\otrlevel +%registerotrcommand\someherefloat % not ok this way +%registerotrcommand\somefixdfloat % not ok this way +%registerotrcommand\somepagefloat % not ok this way +%registerotrcommand\sometopsfloat % not ok this way +%registerotrcommand\somebotsfloat % not ok this way +%registerotrcommand\somesidefloat % not ok this way % When issuing two \par\penalty-\plustenthousand's, only the first -% triggers the otr; obscure feature or optimization? +% triggers the otr. Is this an obscure feature or an optimization? + +\newif \iftraceotr % will change +\newif \ifinotr % might change -\newcount\outputcounter \outputcounter=-100010 % -10010 +\newcount\c_page_otf_trigger_penalty \c_page_otf_trigger_penalty=-100010 % -10010 -\def\doinvokeoutput +\unexpanded\def\page_otr_trigger {\iftraceotr - \expandafter\dodotracedoutput + \expandafter\page_otr_trigger_traced \else - \expandafter\dodoinvokeoutput + \expandafter\page_otr_trigger_normal \fi} -\def\doshowoutputmessage#1#2#3% - {\writestatus\m!otr{#1 #2 \number#3}} - -\def\dodoinvokeoutput#1% - {\bgroup\par\penalty#1\egroup} - -\def\dodotracedoutput#1% - {\doshowoutputmessage+{traced}{#1/\the\outputpenalty}% - \writestatus\m!otr{c:\number\mofcolumns,v:\the\vsize,g:\the\pagegoal,t:\the\pagetotal}% - \dodoinvokeoutput{#1}% - \writestatus\m!otr{c:\number\mofcolumns,v:\the\vsize,g:\the\pagegoal,t:\the\pagetotal}% - \doshowoutputmessage-{traced}{#1/\the\outputpenalty}} - -\def\installoutput#1#2% \invoke \action - {\global\advance\outputcounter\minusone - \edef#1{\noexpand\doinvokeoutput{\number\outputcounter}}% - \setvalue{\@@OTR\number\outputcounter}{#2}} - -\def\invoketracedoutputroutine - {\doshowoutputmessage+{trying}\outputpenalty - \ifcsname\@@OTR\the\outputpenalty\endcsname - \doshowoutputmessage+{special}\outputpenalty - \csname\@@OTR\the\outputpenalty\endcsname - \doshowoutputmessage-{special}\outputpenalty +\def\page_otr_message_b#1#2% + {\writestatus\m!otr{+ #1 \number#1}} + +\def\page_otr_message_e#1#2% + {\writestatus\m!otr{- #1 \number#2}} + +\def\page_otr_message_s + {\writestatus\m!otr{c:\number\mofcolumns,v:\the\vsize,g:\the\pagegoal,t:\the\pagetotal}} + +\def\page_otr_trigger_normal#1% + {\begingroup\par\penalty#1\endgroup} + +\def\page_otr_trigger_traced#1% + {\page_otr_message_b{traced}{#1}% + \page_otr_message_s + \page_otr_trigger_normal{#1}% + \page_otr_message_s + \page_otr_message_e{traced}{#1}} + +\def\installoutputroutine#1#2% \invoke \action + {\global\advance\c_page_otf_trigger_penalty\minusone + \edef#1{\page_otr_trigger{\number\c_page_otf_trigger_penalty}}% + \setvalue{\??zo\number\c_page_otf_trigger_penalty}{#2}} + +\def\page_otr_triggered_output_routine_traced + {\page_otr_message_b{trying}\outputpenalty + \ifcsname\??zo\the\outputpenalty\endcsname + \page_otr_message_b{special}\outputpenalty + \csname\??zo\the\outputpenalty\endcsname + \page_otr_message_e{special}\outputpenalty \else - \doshowoutputmessage+{normal}\outputpenalty - \the\OTRcommand\output - \doshowoutputmessage-{normal}\outputpenalty + \page_otr_message_b{normal}\outputpenalty + \the\OTRcommand\output % currently a toks but this will become a normal command + \page_otr_message_e{normal}\outputpenalty \fi - \doshowoutputmessage-{trying}\outputpenalty} + \page_otr_message_e{trying}\outputpenalty} -\def\invokenormaloutputroutine - {\ifcsname\@@OTR\the\outputpenalty\endcsname - \csname\@@OTR\the\outputpenalty\endcsname +\def\page_otr_triggered_output_routine_normal + {\ifcsname\??zo\the\outputpenalty\endcsname + \csname\??zo\the\outputpenalty\endcsname \else \the\OTRcommand\output \fi} -\def\invokeoutputroutine +\def\page_otr_triggered_output_routine {\iftraceotr - \expandafter\invoketracedoutputroutine + \expandafter\page_otr_triggered_output_routine_traced \else - \expandafter\invokenormaloutputroutine + \expandafter\page_otr_triggered_output_routine_normal \fi} -\mainoutput{\invokeoutputroutine} - %D Some hooks: -\def\setoutputroutine#1% - {\global\output{\inotrtrue\the\everybeforeoutput#1\the\everyafteroutput}} +\def\page_otf_set_engine_output_routine#1% + {\global\output + {\inotrtrue + \the\everybeforeoutput + #1\relax + \the\everyafteroutput}} -\setoutputroutine{\the\mainoutput} - -\ifx\pagediscards\undefined \let\pagediscards\relax \fi +\page_otf_set_engine_output_routine{\page_otr_triggered_output_routine} -\installoutput\synchronizeoutput % maybe add pagediscards +\installoutputroutine\synchronizeoutput {\ifvoid\normalpagebox\else \unvbox\normalpagebox - \pagediscards % maybe not needed ? + \pagediscards \fi} -\installoutput\discardpage +\installoutputroutine\discardpage {\setbox\scratchbox\box\normalpagebox} - -%D In order to force consistent use of variables, we -%D predefine a lot of them here. - -%D The next two registers can be used to store pre column -%D material as well as footnotes or so. - -\newbox\precolumnbox \newdimen\precolumnboxheight -\newbox\postcolumnbox \newdimen\postcolumnboxheight - -%D We reserve a counter for the number of columns as well as -%D the current column. Both are not to be changed by users! -\newcount\nofcolumns \nofcolumns = 1 -\newcount\mofcolumns \mofcolumns = 1 - -\setnewconstant\maxnofcolumns 50 -\setnewconstant\allocatednofcolumns 0 - -%D The next dimensions reports the final column height - -\newdimen\finalcolumnheights -\newcount\finalcolumnlines - -%D During initialization the temporary boxes are allocated. -%D This enables us to use as much columns as we want, without -%D exhausting the pool of boxes too fast. We could have packed -%D them in one box, but we've got enough boxes. -%D -%D Two sets of boxes are declared, the txtboxes are used for -%D the text, the topboxes are for moved column floats. - -\def\@col@{@col@} - -\def\initializecolumns#1% - {\ifnum#1>\maxnofcolumns - \showmessage\m!columns1\maxnofcolumns - \nofcolumns\maxnofcolumns - \else - \nofcolumns#1\relax +\def\page_otr_trigger_output_routine + {\par + \ifvmode + \penalty\c_page_otr_eject_penalty \fi - \ifnum\nofcolumns>\allocatednofcolumns - \dorecurse\nofcolumns - {\ifnum\recurselevel>\allocatednofcolumns\relax - % \newbox\next \letgvalue{\@col@-\recurselevel-t}=\next - \@EA\newbox\csname\@col@-\recurselevel-t\endcsname % text - \@EA\newbox\csname\@col@-\recurselevel-f\endcsname % foot - \@EA\newbox\csname\@col@-\recurselevel-h\endcsname % top insert - \@EA\newbox\csname\@col@-\recurselevel-l\endcsname % top insert - \fi}% - \global\allocatednofcolumns\nofcolumns - \fi} - -\def\firstcolumnbox {\columntextbox\plusone} -\def\currentcolumnbox {\columntextbox\mofcolumns} -\def\lastcolumnbox {\columntextbox\nofcolumns} - -\def\firsttopcolumnbox {\columntopbox \plusone} -\def\currenttopcolumnbox{\columntopbox \mofcolumns} -\def\lasttopcolumnbox {\columntopbox \nofcolumns} - -\def\columntextbox#1{\csname\@col@-\number#1-t\endcsname} -\def\columnfootbox#1{\csname\@col@-\number#1-f\endcsname} -\def\columntopbox #1{\csname\@col@-\number#1-h\endcsname} -\def\columnbotbox #1{\csname\@col@-\number#1-l\endcsname} - -\def\columnsettextbox{\global\setbox\columntextbox} -\def\columnsetfootbox{\global\setbox\columnfootbox} -\def\columnsettopbox {\global\setbox\columntopbox} -\def\columnsetbotbox {\global\setbox\columnbotbox} - -\def\columngettextbox{\copy\columntextbox} -\def\columngetfootbox{\copy\columnfootbox} -\def\columngettopbox {\copy\columntopbox} -\def\columngetbotbox {\copy\columnbotbox} - -\def\columnerasetextboxes{\dorecurse\allocatednofcolumns{\columnsettextbox\recurselevel\emptybox}} -\def\columnerasefootboxes{\dorecurse\allocatednofcolumns{\columnsetfootbox\recurselevel\emptybox}} -\def\columnerasetopboxes {\dorecurse\allocatednofcolumns{\columnsettopbox \recurselevel\emptybox}} -\def\columnerasebotboxes {\dorecurse\allocatednofcolumns{\columnsetbotbox \recurselevel\emptybox}} - -%D Without going in details we present two macro's which handle -%D the columns. The action which is transfered by the the first -%D and only parameter can do something with \type -%D {\currentcolumnbox}. In case of the mid columns, \type -%D {\firstcolumnbox} and \type {\lastcolumnbox} are handled -%D outside these macro's. - -\def\dohandlecolumn#1% - {\mofcolumns\recurselevel - \let\currentcolumn\recurselevel - #1\relax} - -\def\dohandleallcolumns#1% - {\dorecurse\nofcolumns{\dohandlecolumn{#1}}} - -\def\dohandlerevcolumns#1% - {\dostepwiserecurse\nofcolumns\plusone\minusone{\dohandlecolumn{#1}}} - -\def\dohandlemidcolumns#1% - {\dohandleallcolumns - {\ifnum\recurselevel>\plusone - \ifnum\recurselevel<\nofcolumns - \dohandlecolumn{#1}% - \fi - \fi}} - -%D This register can be used as a temporary storage for page -%D content. - -\newbox\restofpage - -%D Features. - -\newif\ifintermediatefootnotes -\newif\ifcarryoverfootnotes %\carryoverfootnotestrue -\newif\iflastcolumnfootnotes %\lastcolumnfootnotestrue -\newif\ifbalancecolumns %\balancecolumnstrue -\newif\ifbalancetoheight %\balancetoheighttrue -\newif\ifforcecolumngrid \forcecolumngridtrue -\newif\ifstretchcolumns \stretchcolumnsfalse -\newif\ifinheritcolumns \inheritcolumnsfalse -\newif\ifheightencolumns \heightencolumnsfalse - -\newif\ifbalancingcolumns -\newif\ifcollectingcontent -\newif\ifcolumnoverflow - -\newdimen\intercolumnwidth -\newdimen\localcolumnwidth -\newdimen\savedpagetotal - -\newconstant\columndirection % 0:lr 1:rl - -\def\minbalancetoplines {1} -\def\minfreecolumnlines {2} - -\newif\ifrecentercolumnbox \recentercolumnboxtrue -\newif\ifrerecentercolumnbox \rerecentercolumnboxtrue -\newif\ifpackcolumnfloats \packcolumnfloatstrue - -\newbox\collectedpagefloats -\newbox\collectedleftpagefloats -\newbox\collectedrightpagefloats + \resetpagebreak} -%D The \type {\ifdim} test is needed, because otherwise the -%D last line of a text end up on top of the baseline instead of -%D on the baseline, as is the case with preceding pages. -%D Also, a \type {\vfil} better than a \type {\vfill}. +\def\page_otr_fill_and_eject_page + {\par + \ifvmode + \vfill + \penalty\c_page_otr_eject_penalty + \fi + \resetpagebreak} -% to be replaced by \page[now] \page[final] / merged +\def\page_otr_eject_page + {\par + \ifvmode + \ifdim\pagetotal>\pagegoal \else + \normalvfil + \fi + \penalty\c_page_otr_eject_penalty + \fi + \resetpagebreak} -% \def\eject {\par\penalty-\plustenthousand } % == {\par\break} % plain -% \def\supereject {\par\penalty-\plustwentythousand} % also plain +\def\page_otr_eject_page_and_flush_inserts % can be an installed one + {\par + \ifvmode + \ifdim\pagetotal>\pagegoal \else + \normalvfil + \fi + \penalty\c_page_otr_super_penalty + \fi + \resetpagebreak} -\def\eject {\par\ifvmode\penalty\ejectpenalty\fi\resetpagebreak} % == {\par\break} % plain -\def\supereject {\par\ifvmode\penalty\superpenalty\fi\resetpagebreak} % also plain +\def\page_otr_check_for_pending_inserts + {\ifnum\outputpenalty>\c_page_otr_super_penalty \else + \ifnum\insertpenalties>\zerocount + % something is being held over so we force a new page + \page_otr_force_another_page + \fi + \fi} -\def\doejectpage {\par\ifvmode\ifdim\pagetotal>\pagegoal\else\normalvfil\fi\fi} % pg set to \textheight -\def\ejectpage {\doejectpage\eject} -\def\superejectpage{\doejectpage\supereject} +\def\page_otr_force_another_page + {% we should actually remove the dummy line in the otr + \hbox to \hsize{} + \kern-\topskip + \nobreak + \vfill + \penalty\c_page_otr_super_penalty + \resetpagebreak} -\ifx\bye\undefined \def\bye{\par\vfill\supereject\end} \fi % plain tex command +\unexpanded\def\bye + {\writestatus\m!system{Sorry, you're not done yet, so no goodbye!}} % floats -\def\ejectinsert +\def\page_otr_flush_all_floats {%\flushnotes already done - \bgroup -\ifsomefloatwaiting - \noftopfloats\plusthousand - \nofbotfloats\zerocount - % this is needed in case a float that has been stored - % ends up at the current page; this border case occurs when - % the calculated room is 'eps' smaller that the room available - % when just flushing; so now we have (maybe optional): - \pagebaselinecorrection % hm, needs checking, not needed when no floats - % alas, this is tricky but needed (first surfaced in prikkels) - \doflushfloats -\fi - \egroup} + \ifsomefloatwaiting + \begingroup + \noftopfloats\plusthousand + \nofbotfloats\zerocount + % this is needed in case a float that has been stored + % ends up at the current page; this border case occurs when + % the calculated room is 'eps' smaller that the room available + % when just flushing; so now we have (maybe optional): + \pagebaselinecorrection % hm, needs checking, not needed when no floats + % alas, this is tricky but needed (first surfaced in prikkels) + \doflushfloats + \endgroup + \fi} -\def\ejectdummypage - {\endgraf \ifvmode - \ejectinsert +\def\page_otr_insert_dummy_page + {\par + \ifvmode + \page_otr_flush_all_floats \fixedspace \vfill \gotonextpage \fi} -\def\beforefinaloutput - {} - -\def\afterfinaloutput - {%\forgetall +\def\finaloutput#1#2% + {\forgetall + \page_boxes_shipout{\page_boxes_constructed_page#1#2}% \hbox removed \vskip\zeropoint\relax \ifvoid\normalpagebox \else \unvbox\normalpagebox \penalty\outputpenalty \fi % not really needed, replaced by \flushsavedfloats - \ifnum\outputpenalty>\superpenalty \else % better use a proper otr signal - \dosupereject - \fi + \page_otr_check_for_pending_inserts % but does not hurt either (we're still in the otr!) \inpagebodytrue % needed for enabling \blank ! \flushsavedfloats % was \dosetbothinserts; only otr one ! - \setvsize} % this is needed for interacting components, like floats and multicolumns - -\def\dofinaloutput#1#2% \vbox: prevents spurious spaces in every..pagebody - {\forgetall - \beforefinaloutput - \the\everybeforeshipout % brrr not in shipout - \the\pageboundsettings - \myshipout{\hbox{\vbox{\dopagebody#1#2}}}% is this hbox needed - \the\everyaftershipout - \afterfinaloutput} - -\def\donofinaloutput#1#2% - {\forgetall - \beforefinaloutput - \the\everybeforeshipout - \message{[-\the\realpageno]}% - \setbox\scratchbox\hbox{\dopagebody#1#2}% - \deadcycles\zerocount - \setnextrealpageno - \the\everyaftershipout - \afterfinaloutput} - -% beware: \ifprocessingpages is in use - -\ifdefined\doflushspread\else \let\doflushspread\relax \fi % todo - -\def\finaloutput#1#2% - {\ifprocessingpages - \ifpageselected - \@EAEAEA\dofinaloutput - \else - \@EAEAEA\donofinaloutput - \fi - \else - \ifpageselected - \@EAEAEA\donofinaloutput - \else - \@EAEAEA\dofinaloutput - \fi - \fi#1#2% - \resetselectiepagina + \setvsize % this is needed for interacting components, like floats and multicolumns \doincrementpageboundcounters % should hook into an every - \checkpagedimensions - \ifnum\outputpenalty>\superpenalty \else - \dosupereject - \fi + \page_adapts_synchronize + \page_otr_check_for_pending_inserts \doflushspread - \doflushpostponedcontent} + \page_postponed_blocks_flush} -\def\dooutput - {\finaloutput\unvbox\normalpagebox} +% Can't we get rid of this hackery? It's used in some widgets +% stuff so probably not. -\maxdeadcycles=1000 +\newbox\d_page_otr_special -% this needs a real cleanup - -\def\doplaceversiontext#1#2% - {\doifsomething{#2} - {\defconvertedcommand\ascii{#2}% - \space#1:\space\ascii\space - \!!doneatrue}} - -\unexpanded\def\placeversioninfo % nog engels maken - {\ifcase\conceptmode - % 0 : nothing - \or - % 1 : simple - \vskip\!!sixpoint - \hbox to \makeupwidth - {\infofont - \v!concept:\space\currentdate - \hss\reportpagedimensions}% - \else - % 2/3 : extensive - \vskip\!!sixpoint - \hbox to \makeupwidth - {\infofont - \getmessage\m!system{27}:\space\currentdate\space - \doplaceversiontext\v!project \currentproject - \doplaceversiontext\v!product \currentproduct - \doplaceversiontext\v!component\currentcomponent - \if!!donea\else\space\v!file:\space\jobname\fi - \hss\reportpagedimensions}% +\def\page_otr_flush_special_content + {\ifvoid\d_page_otr_special \else + \box\d_page_otr_special \fi} -% tot hier +\def\page_otr_add_special_content + {\dowithnextbox\page_otr_add_special_content_indeed\hbox} -\def\doversion[#1]% - {\conceptmode\zerocount - \overfullrule\zeropoint - \processaction % \v!final=> - [#1] - [ \v!concept=>\conceptmode\plusone, % simple banner - \v!file=>\conceptmode\plustwo, % full banner - \v!temporary=>\conceptmode\plusthree % full banner plus - \overfullrule5\points]} % info in the margin +\def\page_otr_add_special_content_indeed + {\wd\nextbox\zeropoint + \ht\nextbox\zeropoint + \dp\nextbox\zeropoint + \global\setbox\d_page_otr_special\hbox + {%\hskip-\maxdimen % not here, fails in acrobat (clips) + \box\d_page_otr_special\box\nextbox}}% was \unhbox, is now box again -\def\version - {\dosingleargument\doversion} +\let\flushatshipout\page_otr_add_special_content -\def\addstatusinfo - {\ifcase\conceptmode - \@EA\gobbleoneargument - \else - \@EA\doaddstatusinfo - \fi} +% \def\dooutput{\finaloutput\unvbox\normalpagebox} -\def\doaddstatusinfo#1% - {\setbox#1\vbox to \paperheight - {\vsmashbox#1\box#1% - \offinterlineskip - \vskip\topspace - \hsize\paperwidth - %\hfill\hbox{\placetestinfo\hskip.5cm}\vss % obsolete - \settexthoffset\hskip\texthoffset % brrrr - \vbox to 1cm{\vss\placeversioninfo\vss}}} - -\def\dotestinfo#1#2#3% - {\ifinpagebody\else\ifnum\conceptmode=\plusthree - \begingroup - \defconvertedcommand\ascii{#3}% - \xdef\extratestinfo - {#2\space\ascii}% - \gdef\totaltestinfo - {\global\setbox#1\vbox - {\unvbox#1\relax - \infofont \setupinterlinespace - \hbox - {\strut - \expanded{\doboundtext{\extratestinfo}{12em}{..}}% - \quad}}}% - \endgroup - \ifinner - \aftergroup\totaltestinfo - \else - \totaltestinfo - \fi - \fi\fi} - -\version[\v!final] - -% bewaren tvb documentatie -% -% \hbox to \hsize -% {\en -% \switchnaarkorps[5pt]% -% \emergencystretch2em -% \dimen0=\baselineskip -% \baselineskip=\dimen0 plus 1pt -% \hsize=.2\hsize -% \vsize=2\hsize -% \ruledvbox to \vsize{\input tufte \par}\hss -% \ruledvbox to \vsize{\input tufte \par\kern-\prevdepth}\hss -% \ruledvbox to \vsize{\input tufte \par\kern0pt}\hss -% \ruledvbox to \vsize{\input tufte \par\vfill}\hss -% \ruledvbox to \vsize{\input tufte \par\kern-\prevdepth\vfill}} -% -% \hbox to \hsize -% {\en -% \switchnaarkorps[5pt]% -% \emergencystretch2em -% \dimen0=\baselineskip -% \baselineskip=\dimen0 plus 1pt -% \hsize=.18\hsize -% \vsize=2.5\hsize -% \setbox0=\vbox{\input tufte\relax}% -% \ruledvbox to \vsize{\unvcopy0}\hss -% \ruledvbox to \vsize{\unvcopy0\kern-\dp0}\hss -% \ruledvbox to \vsize{\unvcopy0\kern0pt}\hss -% \ruledvbox to \vsize{\unvcopy0\vfill}\hss -% \ruledvbox to \vsize{\unvcopy0\kern-\dp0\vfill}} +\maxdeadcycles=1000 \newtoks\afterpage \newtoks\aftereverypage \newtoks\beforepage \newtoks\beforeeverypage -\newconstant\showgridstate - -\unexpanded\def\showgrid - {\dosingleempty\doshowgrid} - -\def\doshowgrid[#1]% - {\showgridstate \plusone % downward compatible default - \gridboxlinemode \plusone - \gridboxlinenomode\plusone - \processallactionsinset - [#1]% - [ \v!reset=>\showgridstate \zerocount, - \v!bottom=>\showgridstate \plusone, - \v!top=>\showgridstate \plustwo, - \v!none=>\gridboxlinemode \zerocount, - \v!all=>\gridboxlinemode \plusone, - \v!lines=>\gridboxlinemode \plustwo, - \v!frame=>\gridboxlinemode \plusthree, - \v!nonumber=>\gridboxlinenomode\zerocount, - \v!right=>\gridboxlinenomode\plusone, - \v!left=>\gridboxlinenomode\plustwo, - \v!outer=>\gridboxlinenomode\plusthree]% - \ifcase\showgridstate - \let\addtextgridlayer\gobbleoneargument - \else % 1=bottom 2=top - \let\addtextgridlayer\doaddtextgridlayer - \fi} - -\definepalet - [layout] - [grid=red, - page=green] - -% if really needed for speed we can cache the grid - -\let\addtextgridlayer\gobbleoneargument - -\def\doaddtextgridlayer#1% to be checked for color and layer - {\startcolor[layout:grid]% - \setgridbox\scratchbox\makeupwidth\textheight % todo: check color - \global\setbox#1\hbox - {\ifcase\showgridstate\or\or\box#1\hskip-\makeupwidth\fi - \bgroup % color - \ifcase\layoutcolumns\else - \gray - \setlayoutcomponentattribute\v!grid\v!columns - \hbox \layoutcomponentboxattribute to \makeupwidth - {\dorecurse\layoutcolumns - {\hskip\layoutcolumnwidth - \ifnum\recurselevel<\layoutcolumns - \vrule - \!!height\ht\scratchbox - \!!depth\dp\scratchbox - \!!width\layoutcolumndistance - \fi}}% - \hskip-\makeupwidth - \fi - \setlayoutcomponentattribute\v!grid\v!lines - \hbox \layoutcomponentboxattribute{\box\scratchbox}% - \egroup - \ifcase\showgridstate\or\hskip-\makeupwidth\box#1\fi}% - \stopcolor} - -\def\buildpagebox#1% - {\setbox#1\vbox to \paperheight - {\hsize\paperwidth - \vskip\topspace - \doifbothsides - {\hskip\backspace} - {\hskip\backspace} - {\hskip\paperwidth \hskip-\backspace \hskip-\makeupwidth}% - \box#1}% - \dp#1\zeropoint} - -% \newif\ifpagebodyornaments \pagebodyornamentstrue -% -% \appendtoks -% \global\pagebodyornamentstrue -% \to \everyaftershipout - -\newif\ifarrangingpages \arrangingpagesfalse +\newif\ifarrangingpages \arrangingpagesfalse \newconstant\pageornamentstate % 0=on 1=one-off 2=always-off -\def\pagebodyornamentstrue {\pageornamentstate\zerocount} % for a while -\def\pagebodyornamentsfalse{\pageornamentstate\plusone} % for a while - \appendtoks - \ifcase\pageornamentstate\or - \pageornamentstate\zerocount - \fi + \ifcase\pageornamentstate \or + \pageornamentstate\zerocount + \fi \to \everyaftershipout -\let\poparrangedpages\relax -\let\pusharrangedpage\relax - -\ifdefined\shiftprintpagebox \else - \let\shiftprintpagebox\gobbleoneargument - \let\shiftpaperpagebox\gobbleoneargument -\fi +% Mark synchronization -\ifdefined\registerpageposition \else - \let\registerpageposition\gobbleoneargument -\fi +\newconditional\page_marks_building_successive_pages \settrue\page_marks_building_successive_pages -\newif\ifsavepagebody \newbox\savedpagebody +\def\page_marks_synchronize_page#1% box + {\dosynchronizemarking[\v!page][#1][\ifconditional\page_marks_building_successive_pages\v!keep\fi]} -\def\docolumnpagebodymarks#1#2#3#4% first last column box +\def\page_marks_synchronize_column#1#2#3#4% first last column box {\ifnum#3=#1\relax \dosynchronizemarking[\number#3,\v!column:\number#3,\v!first,\v!column:\v!first][#4][]% \else\ifnum#3=#2\relax @@ -806,700 +385,131 @@ \dosynchronizemarking[\number#3,\v!column:\number#3 ][#4][]% \fi\fi} -% tricky ... we need to retain the last mark +% Page body building -\newconditional\buildingsuccessivepages \settrue\buildingsuccessivepages +\newconditional\c_page_boxes_save_page_body +\newbox \b_page_boxes_saved_page_body -% \starttext -% \dorecurse{3} { -% \startchapter[title=Chapter #1] -% \input tufte -% \dorecurse{4}{\placefigure{Number ##1}{\externalfigure[cow][height=9cm]}} -% \stopchapter -% } -% \stoptext - -\def\buildpagebody#1#2% - {\ifsavepagebody\global\setbox\savedpagebody\fi - \vbox - {%\forgetall % igv problemen, check: \boxmaxdepth\maxdimen +\def\page_boxes_constructed_page_body#1#2% + {\ifconditional\c_page_boxes_save_page_body \global\setbox\b_page_boxes_saved_page_body \fi \vbox \bgroup \boxmaxdepth\maxdimen % new \dontcomplain - % marks get done here - \dosynchronizemarking[\v!page][#2][\ifconditional\buildingsuccessivepages\v!keep\fi]% #2 box - % the following plugin uses and sets pagebox; beware: this - % will change and is for my (hh) personal experiments .. takes two - % arguments - \constructpagecontent#1#2% - % the finishing touch + \page_marks_synchronize_page{#2}% we could consider doing this for \pagebox (needs testting) + \page_boxes_construct_content#1#2% % this one fills pagebox + \page_backgrounds_add_to_main \pagebox + \page_boxes_apply_offsets \pagebox + \page_info_add_to_box \pagebox \ifcase\pageornamentstate - \addpagebackground \pagebox + \page_backgrounds_add_to_paper \pagebox \fi - \registerpageposition\pagebox + \registerpageposition \pagebox \ifarrangingpages - \shiftpaperpagebox \pagebox % \v!paper + \page_boxes_apply_shift_paper \pagebox % \v!paper \else - \clippagebox \pagebox - \page_marks_add_page \pagebox - \replicatepagebox \pagebox - \scalepagebox \pagebox - \mirrorpaperbox \pagebox - \orientpaperbox \pagebox - \page_marks_add_more \pagebox - \centerpagebox \pagebox - \addprintbackground \pagebox - \mirrorprintbox \pagebox - \orientprintbox \pagebox - \shiftprintpagebox \pagebox % \v!page - \offsetprintbox \pagebox - \negateprintbox \pagebox + \page_boxes_apply_clip_paper \pagebox + \page_marks_add_page \pagebox + \page_boxes_apply_replicate \pagebox + \page_boxes_apply_scale \pagebox + \page_boxes_apply_mirror_paper \pagebox + \page_boxes_apply_orientate_paper \pagebox + \page_marks_add_more \pagebox + \page_boxes_apply_center \pagebox + \page_backgrounds_add_to_print \pagebox + \page_boxes_apply_mirror_print \pagebox + \page_boxes_apply_orientate_print \pagebox + \page_boxes_apply_shift_print \pagebox % \v!page + \page_boxes_apply_offset \pagebox + \page_boxes_apply_negate_print \pagebox \fi - \box\pagebox}% - \ifsavepagebody\copy\savedpagebody\fi} - -\ifx\page_marks_add_page\undefined \let\page_marks_add_page\gobbleoneargument \fi -\ifx\page_marks_add_more\undefined \let\page_marks_add_more\gobbleoneargument \fi - -% \setvalue{\??ly\c!method\v!normal}#1#2% -% {\setbox\pagebox\vbox -% {\offinterlineskip -% \ifcase\pageornamentstate -% \bgroup % else footnotes get inconsistent font/baseline -% % color/style attributes -% \offinterlineskip -% \gettextboxes -% \egroup -% \fi -% \getmainbox#1#2}% including footnotes -% \ifcase\pageornamentstate -% \addmainbackground \pagebox -% \fi -% \buildpagebox \pagebox -% \addstatusinfo \pagebox} - -\ifx\constructnormalpagecontent\undefined - - \def\constructnormalpagecontent#1#2% - {\setbox\pagebox\vbox - {\offinterlineskip - \gettextboxes - \getmainbox#1#2}% including footnotes - \addmainbackground\pagebox - \buildpagebox\pagebox - \addstatusinfo\pagebox} - -\fi - -\ifx\constructpagecontent\undefined - \let\constructpagecontent\constructnormalpagecontent % will be overloaded -\fi - -\def\finishpagebox#1% - {\ifarrangingpages - \page_marks_add_more#1% - \centerpagebox #1% - \mirrorprintbox #1% - \orientprintbox #1% - \offsetprintbox #1% - \negateprintbox #1% - \fi} - + \box\pagebox + \egroup \ifconditional\c_page_boxes_save_page_body \copy\b_page_boxes_saved_page_body \fi} + \appendtoks \restoreouterspacing \to \everybeforepagebody \appendtoks \restoreglobalbodyfont \to \everybeforepagebody %appendtoks \restoreouterspacing \to \everybeforepagebody -\ifx\nestednewbox\undefined \newbox\nestednextbox \fi - -\prependtoks \let\nextbox\nestednextbox \to \everybeforepagebody - -\def\dopagebody#1#2% - {\the\everybeforepagebody - \starttextproperties -% \setnextsubpageno % nog eens: als in pagina (tbv standaard opmaak) - \dontshowboxes % dan hier blokkeren en verderop resetten -% \shipoutfacingpage - \checkmarginblocks - \the\beforeeverypage - \normalexpanded{\global\beforepage\emptytoks\the\beforepage}% \scratchtoks\beforepage\global\beforepage\emptytoks\the\scratchtoks % was \flushtoks\beforepage - \inpagebodytrue\buildpagebody#1#2% - \normalexpanded{\global\afterpage \emptytoks\the\afterpage }% \scratchtoks\afterpage \global\afterpage \emptytoks\the\scratchtoks % was \flushtoks\afterpage - \the\aftereverypage - \resetpagebreak - %updatelistreferences % now in aftereverypage - \resetlayouttextlines % will go to \aftereverypage - \stoptextproperties - \the\everyafterpagebody} - -\newtoks\pageboundsettings - -% \prependtoks \initializepaper \to \pageboundsettings - -% not here - -\newif\ifpagebreakdisabled \pagebreakdisabledfalse - -\newconstant\testpagemethod % todo: \testnewpage[method=,lines=,voffset=] -\newconstant\testpagetrigger - -\def\testpage {\dotripleempty\dotestpage[\plusone ]} % -\def\testpageonly{\dotripleempty\dotestpage[\plustwo ]} % no penalties added to the mvl -\def\testpagesync{\dotripleempty\dotestpage[\plusthree]} % force sync - -\def\dotestpage[#1][#2][#3]% don't change, only add more methods - {\relax % needed before \if - \ifpagebreakdisabled - \endgraf - \else - % new from here - \ifcase\testpagetrigger - \endgraf - \or - \ifvmode - \dosomebreak\allowbreak - \else % indeed? - \vadjust{\allowbreak}% - \endgraf - \fi - \fi - % till here - \ifdim\pagegoal<\maxdimen \relax - \ifdim\pagetotal<\pagegoal \relax - \scratchdimen\lineheight - \multiply\scratchdimen#2\relax - \advance\scratchdimen \pagetotal - \ifdim\lastskip<\parskip - \advance\scratchdimen \parskip - \fi - \ifthirdargument - \advance\scratchdimen#3\relax - \fi - \ifcase\testpagemethod - \ifdim\scratchdimen>.99\pagegoal - \penalty-\!!tenthousand\relax - \fi - \or - \advance\scratchdimen-\pagegoal - \ifdim\scratchdimen>-\lineheight - \penalty-\!!tenthousand\relax - \fi - \or - \getnoflines\pagegoal - \advance\scratchdimen-\noflines\lineheight \relax - \ifdim\scratchdimen>-\lineheight - \penalty-\!!tenthousand\relax - \fi - \or % same as 0 but more accurate - \advance\scratchdimen-10\s!sp\relax - \ifdim\scratchdimen>\pagegoal - \penalty-\!!tenthousand\relax - \fi - \fi - \else - \ifnum#1=\plusthree - \flushpagesofar - \fi - \fi - \else - \ifnum#1=\plusone\goodbreak\fi - \fi - \fi} - -\def\flushpagesofar - {\endgraf - \ifdim\pagetotal>\pagegoal - \ifdim\dimexpr\pagetotal-\pageshrink\relax>\pagegoal - \goodbreak % \penalty0 - \else - \page - \fi - \else - \fi} - -\def\testcolumn - {\dodoubleempty\dotestcolumn} - -\def\dotestcolumn[#1][#2]% - {%\relax % needed before \if ! - \endgraf - \ifdim\pagegoal<\maxdimen \ifdim\pagetotal<\pagegoal % \relax - \scratchdimen\pagegoal - \advance\scratchdimen-\pagetotal - \ifdim\lastskip<\parskip - \advance\scratchdimen \parskip - \fi - \ifsecondargument - \advance\scratchdimen#2% - \fi - \getrawnoflines\scratchdimen % raw ! - % \message{[\number#1>\number\noflines ?}\wait - \ifnum#1>\noflines - \column - \fi - \else - \penalty-\!!tenthousand % untested ! ! \column - \fi \fi} - -\ifdefined\resetcurrentstructuremarkswithpage \else - \let\resetcurrentstructuremarkswithpage\relax -\fi - -\def\page{\pagebreak} % the short form of \pagebreak (mult-com one) - -\def\resetpagebreak - {\global\pagebreakdisabledfalse} - -\def\simplifypagebreak - {\def\dopagebreak[##1]{\goodbreak}} - -\def\disablepagebreaks - {\def\dopagebreak[##1]{}} - -\def\executepagebreakhandler#1% - {\edef\@@pagespecification{#1}% - \ifcsname\??pe:\@@pagespecification\endcsname - \csname\??pe:\@@pagespecification\endcsname - \else\ifcsname\??pe::\@@pagespecification\endcsname - \executepagebreakhandlers{\csname\??pe::\@@pagespecification\endcsname}% - \else - \csname\??pe:\s!unknown\endcsname - \fi\fi} - -\long\def\installpagebreakhandler#1#2% - {\long\setvalue{\??pe:#1}{#2}} - -\unexpanded\def\pagebreak - {\dosingleempty\dopagebreak} - -\def\dopagebreak[#1]% so, page ornaments are reset after a pagebreak command, unless set - {\bgroup - \flushnotes - \edef\prevrealpageno{\the\realpageno}% - \ifcase\pageornamentstate \or - % disable reset after shipout - \global\pageornamentstate\plustwo - \fi - \iffirstargument % or if empty i.e. [] - \executepagebreakhandlers{#1}% - \else % so, no pagebreak when \pagebreak[] ! ! ! - \executepagebreakhandler\v!yes - \fi - \ifnum\prevrealpageno<\realpageno - % there must have been a reason why i added the ifcase - % but it fails on tests/mkiv/pages/ornaments-001.tex - % as WS found out so we have to wait till the next side - % effect shows up - % \ifcase\pageornamentstate\or - \global\pageornamentstate\zerocount - % \fi - \fi +\ifdefined\nestednewbox \else \newbox\nestednextbox \fi % hm, still needed? + +\prependtoks + \let\nextbox\nestednextbox +\to \everybeforepagebody + +\def\page_boxes_constructed_page#1#2% + {\vbox\bgroup % intercept spurious spaces + \the\everybeforepagebody + \starttextproperties + \dontshowboxes + \checkmarginblocks + \the\beforeeverypage + \normalexpanded{\global\beforepage\emptytoks\the\beforepage}% + \inpagebodytrue + \page_boxes_constructed_page_body#1#2% + \normalexpanded{\global\afterpage \emptytoks\the\afterpage }% + \the\aftereverypage + \resetpagebreak + \resetlayouttextlines % will go to \aftereverypage + \stoptextproperties + \the\everyafterpagebody \egroup} -\def\executepagebreakhandlers#1% - {\processcommacommand[#1]\executepagebreakhandler} - -\installpagebreakhandler \s!dummy - {\ejectinsert - \gotonextpage - \ejectdummypage} - -\installpagebreakhandler \v!frame - {\page\bgroup\showframe\page[\v!empty]\egroup} - -\installpagebreakhandler \s!unknown - {\doifinstringelse{+}\@@pagespecification - {\ejectinsert - \gotonextpage - \dorecurse\@@pagespecification\ejectdummypage} - {\doifnumberelse\@@pagespecification - {\ejectinsert - \gotonextpage - \doloop - {\ifnum\userpageno<\@@pagespecification\relax - \ejectdummypage - \else - \exitloop - \fi}} - {}}} - -\installpagebreakhandler \s!default - {} % do nothing if empty - -\installpagebreakhandler \v!reset - {% better not: \global\pageornamentstate\zerocount - \resetpagebreak} - -\installpagebreakhandler \v!disable - {\global\pagebreakdisabledtrue} - -\installpagebreakhandler \v!yes - {\ifpagebreakdisabled\else - \ejectinsert - \gotonextpage - \ifinsidecolumns % this will move to MUL - \ejectpage % anders soms geen overgang - \fi - \fi} - -\installpagebreakhandler \v!makeup % ?? - {\ifpagebreakdisabled\else - \eject - \fi} - -\installpagebreakhandler \v!blank - {\ifcase\pageornamentstate - \global\pageornamentstate\plusone - \fi} - -\installpagebreakhandler \v!no - {\ifpagebreakdisabled\else - \dosomebreak\nobreak - \fi} +%D Shipout control. -\installpagebreakhandler \v!preference - {\ifpagebreakdisabled\else - \ifinsidecolumns % this will move to MUL - \dosomebreak\goodbreak - \else - \testpage[3][\zeropoint]% - \fi - \fi} - -\installpagebreakhandler \v!bigpreference - {\ifpagebreakdisabled\else - \ifinsidecolumns % this will move to MUL - \dosomebreak\goodbreak - \else - \testpage[5][\zeropoint]% - \fi - \fi} - -\installpagebreakhandler \v!empty - {\ejectinsert - \gotonextpage - \doifnotvalue{\??tk\v!header\c!state}\v!stop{\setupheader[\c!state=\v!empty]}% - \doifnotvalue{\??tk\v!footer\c!state}\v!stop{\setupfooter[\c!state=\v!empty]}% - \ejectdummypage} - -\installpagebreakhandler \v!left - {\ejectinsert - \gotonextpageX % will become \gotonextpage - \doifbothsidesoverruled{}{\resetcurrentstructuremarkswithpage\ejectdummypage}{}} - -\installpagebreakhandler \v!right - {\ejectinsert - \gotonextpageX % will become \gotonextpage - \doifbothsidesoverruled{}{}{\resetcurrentstructuremarkswithpage\ejectdummypage}} - -\installpagebreakhandler \v!even - {\page - \doifoddpageelse{\resetcurrentstructuremarkswithpage\ejectdummypage}\donothing} - -\installpagebreakhandler \v!odd - {\page - \doifoddpageelse\donothing{\resetcurrentstructuremarkswithpage\ejectdummypage}} - -\installpagebreakhandler \v!quadruple % not yet ok inside columnsets - {\ifdoublesided - \!!counta\realpageno - \!!countb\realpageno - \divide\!!counta 4 - \divide\!!countb 2 - \ifnum\!!counta=\!!countb - \else - \executepagebreakhandler\v!yes - \executepagebreakhandler\v!empty - \executepagebreakhandler\v!empty - \fi - \fi} +\newconditional\c_otr_shipout_enabled \settrue\c_otr_shipout_enabled -\installpagebreakhandler \v!last - {\ejectinsert - \gotonextpageX % will become \gotonextpage - \relax - \doifbothsidesoverruled - {\shipoutfacingpage} - {} - {\noheaderandfooterlines \ejectdummypage}% - \filluparrangedpages} - -\installpagebreakhandler \v!lastpage % handy for backpage preceded by empty pages - {\executepagebreakhandler\v!yes - \ifdoublesided - \executepagebreakhandler\v!left - \executepagebreakhandler\v!empty - \executepagebreakhandler\v!empty +\def\page_otr_shipout + {\ifconditional\c_otr_shipout_enabled + \expandafter\page_otr_shipout_yes + \else + \expandafter\page_otr_shipout_nop \fi} -\installpagebreakhandler \v!start - {\globallet\shipout\normalshipout} - -\installpagebreakhandler \v!stop - {\globallet\shipout\noshipout} - -% nb: \executepagebreakhandler\v!hoofd in other ones +\let\page_otr_shipout_yes\normalshipout -\installpagebreakhandler \v!header - {\doifnotvalue{\??tk\v!header\c!state}\v!stop{\setupheader[\c!state=\v!empty]}} - -\installpagebreakhandler \v!footer - {\doifnotvalue{\??tk\v!footer\c!state}\v!stop{\setupfooter[\c!state=\v!empty]}} - -% \definepagebreak -% [chapter] -% [yes,header,right] -% -% \setuphead -% [chapter] -% [page=chapter, -% header=empty, -% footer=chapter] -% -% \definepagebreak % untested -% [lastpage] -% [left,{empty,right},{empty,left}] - -% public page handler, beware: definepage already in use (core-ref) -% -% \definepagebreak[instance][forsure] -% \definepagebreak[forsure][yes,+4] - -\unexpanded\def\definepagebreak - {\dodoubleargument\dodefinepagebreak} - -\def\dodefinepagebreak[#1][#2]% non recursive, meant for simple mappings - {\setvalue{\??pe::#1}{#2}} - -\long\def\installcolumnbreakhandler#1#2#3% #1=otr-id #2=tag - {\long\setvalue{\??cn:#1:#2}{#3}} - -\unexpanded\def\definecolumnbreak - {\dodoubleargument\dodefinecolumnbreak} - -\def\dodefinecolumnbreak[#1][#2]% non recursive, meant for simple mappings - {\setvalue{\??cn::#1}{#2}} - -%\def\columnbreak -% {\dosingleempty\docolumnbreak} -% -%\def\docolumnbreak[#1]% -% {\expanded{\nextcolumn[\executeifdefined{\??cn::#1}{#1}]}} - -\definecomplexorsimple\columnbreak - -\def\simplecolumnbreak - {\executecolumnbreakhandler\v!yes} - -\def\complexcolumnbreak[#1]% if empty, do nothing and avoid processing - {\doifsomething{#1}{\executecolumnbreakhandlers{#1}}} - -\def\executecolumnbreakhandlers#1% - {\processcommacommand[#1]\executecolumnbreakhandler} - -\def\executecolumnbreakhandler#1% here no commalist - {\edef\@@columnspecification{#1}% - \doifdefinedelse{\??cn:\OTRidentifier:\@@columnspecification} - {\getvalue{\??cn:\OTRidentifier:\@@columnspecification}} - {\doifdefinedelse{\??cn::\@@columnspecification} - {\executecolumnbreakhandlers{\getvalue{\??cn::\@@columnspecification}}} - {\getvalue{\??cn:\OTRidentifier:\s!unknown}}}} - -%let\nextcolumn\columnbreak -\let\column \columnbreak - -% We don't want spurious last pages (due to left over marks): - -\def\noshipout - {\writestatus\m!system{ignoring further shipouts}% +\unexpanded\def\page_otr_shipout_nop + {\writestatus\m!system{ignoring shipout of real page \the\realpageno}% \global\advance\realpageno\minusone % else no flush of resources \dowithnextbox{\deadcycles\zerocount}} -% \def\doignorerestoftext -% {\ifarrangingpages \else \ifnum\textlevel>\zerocount \else -% \globallet\shipout\noshipout -% \fi \fi} -% -% better: - -\def\doignorerestoftext - {\ifarrangingpages \else \ifnum\textlevel=\plusone - \globallet\shipout\noshipout - \fi \fi} - -\let\ignorerestoftext\donothing - -\prependtoks % only ignore in a symmetrical doc - \globallet\ignorerestoftext\doignorerestoftext -\to \everystarttext - -% \appendtoks -% \ignorerestoftext -% \to \everylastshipout - -\newif\ifpageselected \pageselectedtrue -\newif\ifselectingpages \selectingpagesfalse -\newif\ifprocessingpages\processingpagestrue - -\let\pageselection \empty -\let\currentpageselection\empty -\let\aftershipout \relax -\let\beforeshipout \relax - -\def\dodobeforeshipout#1% - {\global\let\beforeshipout\relax - \csname\??pg#1\c!before\endcsname} - -\def\dobeforeshipout - {\doifsomething\currentpageselection - {\processcommacommand[\currentpageselection]\dodobeforeshipout}} - -\def\dododoaftershipout#1% - {\global\let\aftershipout\relax - \global\let\currentpageselection\empty - \csname\??pg#1\c!after\endcsname} - -\def\dodoaftershipout#1% - {\doifelsevalue{\??pg#1\c!option}\v!doublesided - {\doifbothsidesoverruled - {\dododoaftershipout{#1}} - {\dododoaftershipout{#1}} - {}} - {\dododoaftershipout{#1}}} - -\def\doaftershipout - {\doifsomething\currentpageselection - {\processcommacommand[\currentpageselection]\dodoaftershipout}} - -\def\docouplepage[#1][#2]% - {\getparameters - [\??pg] - [\c!before=, - \c!after=, - \c!option=, - #2]% - \def\docommand##1% - {\getparameters - [\??pg##1] - [\c!before=\@@pgbefore, - \c!after=\@@pgafter, - \c!option=\@@pgoption]}% - \processcommalist[#1]\docommand}% - -\def\couplepage - {\dodoubleargument\docouplepage} - -\def\doprocesspage[#1][#2]% - {\processaction - [#2] - [\v!yes=>\global\processingpagestrue, - \v!no=>\global\processingpagesfalse]% - \gdef\pageselection{#1}% - \global\selectingpagestrue - \global\pageselectedfalse} - -\def\processpage - {\dodoubleargument\doprocesspage} - -\def\resetselectiepagina - {\ifselectingpages - \doifbothsidesoverruled{\global\pageselectedfalse}{}{\global\pageselectedfalse}% - \fi} - -\newif\ifregistertextareas -\newif\iftracetextareas - -\newbox\registertextbox - -% \def\registeredtextarea#1#2#3% #1=lower-dp #2=correct-ht #3=box -% {\hbox{\box#3}} - -\def\enabletextarearegistration{\global\registertextareastrue} - -\def\registeredtextarea#1#2#3% #1=lower-dp #2=correct-ht #3=box - {\hbox\bgroup - \ifregistertextareas \ifx\registerMPtextarea\undefined \else - \setbox\registertextbox\emptyhbox - \wd\registertextbox\wd#3% - \ht\registertextbox\ht#3% - \dp\registertextbox\dp#3% - \ifcase#1\or % 1 - \setbox\registertextbox\hbox{\lower\strutdp\box\registertextbox}% - \fi - \ifcase#2\or % 1 - \setbox\registertextbox\hbox{\raise\topskip\hbox{\lower\strutht\box\registertextbox}}% - \dp\registertextbox\strutdp - \fi - \dp\registertextbox\strutdp % needed - %\setbox\registertextbox\hbox - % {\iftracetextareas\gray\boxrulewidth2pt\ruledhbox\fi - % {\registerMPtextarea{\box\registertextbox}}}% - \setbox\registertextbox\hbox - {\registerMPtextarea{\box\registertextbox}}% - \smashbox\registertextbox - \box\registertextbox - \fi \fi - \box#3% - \egroup} +% \let\shipout\page_otr_shipout_nop % we don't support direct user \shipouts (weird: this does not work, bug?) -%D \macros -%D {setupoppositeplacing,startopposite} +%D The \type {\processpage} command has become obsolete. It's original +%D purpose was to flush only parts of a document but nowadays we have +%D project structure and modes. This is just one of those very early +%D features that no longer makes sense. %D -%D \starttyping -%D \starttext -%D test \startopposite \blackrule[width=3cm,height=4cm] \stopopposite test -%D test \startopposite \blackrule[width=3cm,height=4cm] \stopopposite test -%D \stoptext -%D \stoptyping - -% Moved from page-mar.tex, made english, cleaned up, but still to be -% redesigned - -\newbox\facingpage - -\unexpanded\def\setupoppositeplacing - {\dodoubleargument\getparameters[\??np]} - -\unexpanded\def\startopposite - {\dowithnextboxcontent - {\hsize\makeupwidth}% - {\global\setbox\facingpage\vbox - {\ifvoid\facingpage - \@@npbefore - \else - \@@npinbetween - \unvbox\facingpage - \fi - \box\nextbox}}% - \vbox\bgroup} - -\unexpanded\def\stopopposite - {\egroup} - -\def\finishfacingpage - {\ifvoid\facingpage\else - \global\setbox\facingpage\vbox to \makeupheight - {\unvbox\facingpage - \@@npafter - \vss}% - \fi} - -\def\shipoutfacingpage - {\doif\@@npstate\v!start - {\ifvoid\facingpage\else - \ifnum\realpageno>\plusone - \bgroup - \pageornamentstate\plusone - \finishfacingpage - \myshipout{\buildpagebody\box\facingpage}% - \egroup - \else - \global\setbox\facingpage\emptybox - \fi - \fi}} - -\setupoppositeplacing - [\c!state=\v!start, - \c!before=, - \c!inbetween=\blank, - \c!after=] +%D The \type {\couplepage} command has become obsolete. It's original +%D purpose was to provide hooks for printer directives (like choosing +%D different paper trays). \protect \endinput + +% bewaren tvb documentatie +% +% \hbox to \hsize +% {\en +% \switchnaarkorps[5pt]% +% \emergencystretch2em +% \dimen0=\baselineskip +% \baselineskip=\dimen0 plus 1pt +% \hsize=.2\hsize +% \vsize=2\hsize +% \ruledvbox to \vsize{\input tufte \par}\hss +% \ruledvbox to \vsize{\input tufte \par\kern-\prevdepth}\hss +% \ruledvbox to \vsize{\input tufte \par\kern0pt}\hss +% \ruledvbox to \vsize{\input tufte \par\vfill}\hss +% \ruledvbox to \vsize{\input tufte \par\kern-\prevdepth\vfill}} +% +% \hbox to \hsize +% {\en +% \switchnaarkorps[5pt]% +% \emergencystretch2em +% \dimen0=\baselineskip +% \baselineskip=\dimen0 plus 1pt +% \hsize=.18\hsize +% \vsize=2.5\hsize +% \setbox0=\vbox{\input tufte\relax}% +% \ruledvbox to \vsize{\unvcopy0}\hss +% \ruledvbox to \vsize{\unvcopy0\kern-\dp0}\hss +% \ruledvbox to \vsize{\unvcopy0\kern0pt}\hss +% \ruledvbox to \vsize{\unvcopy0\vfill}\hss +% \ruledvbox to \vsize{\unvcopy0\kern-\dp0\vfill}} diff --git a/tex/context/base/page-lay.mkiv b/tex/context/base/page-lay.mkiv index 66ea7b79a..68337b937 100644 --- a/tex/context/base/page-lay.mkiv +++ b/tex/context/base/page-lay.mkiv @@ -24,13 +24,6 @@ \unprotect -%D First we get rid of the funny \TEX\ offset defaults of one -%D inch by setting them to zero (actually this is already done -%D elsewhere but it's good to notice). - -\voffset \zeropoint -\hoffset \zeropoint - %D The dimensions related to layout areas are represented by %D real dimensions. @@ -75,10 +68,10 @@ %D The next series of dimensions are complemented by left %D and rights ones. -\newdimen \margindistance -\newdimen \edgedistance -\newdimen \marginwidth -\newdimen \edgewidth +\newdimen\margindistance +\newdimen\edgedistance +\newdimen\marginwidth +\newdimen\edgewidth %D Because a distance does not really makes sense when there %D is no area, we use a zero distance in case there is no @@ -86,17 +79,17 @@ %D The horizontal distances are: -\newdimen \leftedgedistance -\newdimen \rightedgedistance -\newdimen \leftmargindistance -\newdimen \rightmargindistance +\newdimen\leftedgedistance +\newdimen\rightedgedistance +\newdimen\leftmargindistance +\newdimen\rightmargindistance %D The vertical distances are: -\newdimen \topdistance -\newdimen \headerdistance -\newdimen \footerdistance -\newdimen \bottomdistance +\newdimen\topdistance +\newdimen\headerdistance +\newdimen\footerdistance +\newdimen\bottomdistance %D We need to calculate the extra distances: @@ -123,16 +116,15 @@ \appendtoks \ifx\currentlayout\v!reset - \let\currentlayout\empty - \letlayoutparameter\c!state\v!normal % global ? + \let\currentlayout\empty + \letlayoutparameter\c!state\v!normal % global ? \fi \globallet\currentlayout\currentlayout \to \everysetuplayout \appendtoks - \recalculatelayout - \dochecknextlayout - \presetcenterpagebox + \pages_layouts_synchronize + \page_layouts_check_next \to \everysetuplayout \def\doiflayoutdefinedelse#1% @@ -144,7 +136,7 @@ \def\layoutdistance#1#2{\ifdim\zeropoint<#1#2\else\zeropoint\fi} -\def\setlayoutdimensions +\def\page_layouts_set_dimensions {\global\naturalmarginwidth \layoutparameter\c!margin \global\naturaledgewidth \layoutparameter\c!edge \global\naturalmargindistance \layoutparameter\c!margindistance @@ -173,7 +165,7 @@ \global\bottomdistance \layoutdistance\bottomheight \naturalbottomdistance } -\def\setlayoutdistances % local in \setreducedvsize +\def\page_layouts_set_distances % local in \setreducedvsize {\headerdistance\layoutdistance\headerheight\naturalheaderdistance \footerdistance\layoutdistance\footerheight\naturalfooterdistance} @@ -192,7 +184,10 @@ \def\outerspacewidth {\rightorleftpageaction\cutspace\backspace} \def\innerspacewidth {\rightorleftpageaction\backspace\cutspace} -\newtoks\extralayoutcalculations \def\calculatelayoutextras{\the\extralayoutcalculations} +\newtoks\extralayoutcalculations + +\def\page_layouts_calculate_extras + {\the\extralayoutcalculations} \newtoks\everyswapmargins % watch the order ! @@ -212,6 +207,9 @@ \swapmacros\innersidetotal \outersidetotal \to \everyswapmargins +%D The papersize macros have a long history and we don't want +%D to change the commands so they keep looking a bit complex. + %D \macros %D {definepapersize} %D @@ -221,41 +219,7 @@ %D which case the second argument is an assignment. %D %D \showsetup{definepapersize} - -\unexpanded\def\definepapersize - {\dodoubleempty\dodefinepapersize} - -\unexpanded\def\definepapersize - {\dotripleempty\dodefinepapersize} - -\def\dodefinepapersize[#1][#2][#3]% - {\ifsecondargument - \doifsomething{#1} % to be sure - {\doifassignmentelse{#2} - {\getparameters - [\??pp#1]% geen \c!scale, scheelt hash ruimte - [\c!width=\@@ppwidth,\c!height=\@@ppheight,\c!offset=\@@ppoffset,#2]} - {\setvalue{\??pp:1:#1}{#2}% - \setvalue{\??pp:2:#1}{#3}}}% - \else - \getparameters[\??pp][#1]% - \setuppapersize % hm. this will freeze ! - \fi} - -%D For the moment we need to fake this macro. - -\ifx\setuppapersize\undefined - \let\setuppapersize\relax -\fi - -%D We set the defaults to the dimensions of an A4 sheet of -%D paper. - -\definepapersize - [\c!width=210mm, - \c!height=297mm, - \c!offset=\zeropoint] - +%D %D Yet undocumented, let's see if it gets noticed. %D %D \starttyping @@ -276,7 +240,7 @@ %D Page 6. \page %D \stoptext %D \stoptyping - +%D %D \macros %D {setuppaper,setuppapersize} %D @@ -288,122 +252,270 @@ %D We keep track of these features with the following %D variables. -\newconditional\papermirror \newconditional\printmirror -\newconstant \paperorientation \newconstant \printorientation -\newconstant \paperreverse \newconstant \printreverse -\newconditional\paperlandscape \newconditional\printlandscape - \newconditional\printnegatecolors - \newconditional\printdoublesided +\installcommandhandler \??pp {layouttarget} \??pp % so this is a sort of mix, not really a user command / maybe switch handler + +\newconditional\c_page_target_paper_mirror +\newconstant \c_page_target_paper_orientation +\newconstant \c_page_target_paper_reverse +\newconditional\c_page_target_paper_landscape +\newconditional\c_page_target_paper_negate + +\newconditional\c_page_target_print_mirror +\newconstant \c_page_target_print_orientation +\newconstant \c_page_target_print_reverse +\newconditional\c_page_target_print_landscape +\newconditional\c_page_target_print_negate +\newconditional\c_page_target_print_doublesided + +\let\v_page_target_left_fill \relax +\let\v_page_target_right_fill \relax +\let\v_page_target_top_fill \relax +\let\v_page_target_bottom_fill\relax + +\let\papersize \empty +\let\printpapersize\empty + +\def\v_page_target_top {\namedlayouttargetparameter\papersize\c!top } +\def\v_page_target_bottom {\namedlayouttargetparameter\papersize\c!bottom} +\def\v_page_target_left {\namedlayouttargetparameter\papersize\c!left } +\def\v_page_target_right {\namedlayouttargetparameter\papersize\c!right } +\def\v_page_target_method {\rootlayouttargetparameter \c!method} +\def\v_page_target_scale {\rootlayouttargetparameter \c!scale } +\def\v_page_target_nx {\numexpr\rootlayouttargetparameter \c!nx \relax} +\def\v_page_target_ny {\numexpr\rootlayouttargetparameter \c!ny \relax} +\def\v_page_target_dx {\dimexpr\rootlayouttargetparameter \c!dx \relax} +\def\v_page_target_dy {\dimexpr\rootlayouttargetparameter \c!dy \relax} +\def\v_page_target_width {\dimexpr\rootlayouttargetparameter \c!width \relax} +\def\v_page_target_height {\dimexpr\rootlayouttargetparameter \c!height \relax} +\def\v_page_target_topoffset{\dimexpr\rootlayouttargetparameter \c!topoffset\relax} +\def\v_page_target_backspace{\dimexpr\rootlayouttargetparameter \c!backspace\relax} +\def\v_page_target_offset {\dimexpr\rootlayouttargetparameter \c!offset \relax} + +\def\v_page_target_xy {\numexpr\v_page_target_nx*\v_page_target_ny\relax} + +% Normally we will not use this command directly but for now it +% works out okay. In th efuture we might use more of the related +% commands. + +\setuplayouttarget + [% these are rather special + \c!nx=1, + \c!ny=1, + \c!dx=\zeropoint, + \c!dy=\zeropoint, + \c!topspace=\zeropoint, + \c!backspace=\zeropoint, + \c!width=\zeropoint, + \c!height=\zeropoint, + % + \c!method=\v!normal, + \c!option=\v!max, + \c!alternative=\v!normal, + % + \c!scale=1, + \c!offset=\zeropoint, + % + \c!top=, + \c!bottom=, + \c!left=, + \c!right=, + % + \c!location=] + +% \definepapersize[name][A4][A3] +% \definepapersize[name][settings] -\let\papersize\empty \let\printpapersize\empty +\unexpanded\def\definepapersize + {\dotripleempty\define_paper_size} -\def\paperscale{1} +\def\define_paper_size[#1][#2][#3]% + {\edef\currentlayouttarget{#1}% + \ifx\currentlayouttarget\empty + % invalid target + \else + \doifassignmentelse{#2} + {\definelayouttarget[#1][#2]} + {\setevalue{\??pp:1:#1}{#2}% + \setevalue{\??pp:2:#1}{#3}}% + \fi} -\unexpanded\def\setuppaper[#1]% - {\getparameters[\??pp][\c!paper=,\c!page=,#1]% - \edef\@@ppxy{\the\numexpr\@@ppnx*\@@ppny\relax}% - \doifelsenothing\@@pppage - {\doifelsenothing\@@pppaper - {} % {\setuppapersize} % added, removed, no need for, too tricky, mag-01 (fixed by freezing pp's) - {\dodosetuppapersize[\papersize][\@@pppaper]}} - {\doifelsenothing\@@pppaper - {\dodosetuppapersize[\@@pppage][\printpapersize]} - {\dodosetuppapersize[\@@pppage][\@@pppaper]}}} +\appendtoks + \letvalue{\??pp:c:\currentlayouttarget}\relax +\to \everydefinelayouttarget + +\def\page_paper_the_paper_size#1{\ifcsname\??pp:1:#1\endcsname\csname\??pp:1:#1\endcsname\else#1\fi} +\def\page_paper_the_print_size#1{\ifcsname\??pp:2:#1\endcsname\csname\??pp:2:#1\endcsname\else#1\fi} + +% \setuppaper [page=A4,paper=A3] % the k/v variant, changes the current page mapping +% \setuppapersize[A4][a=b,c=d] % the k/v variant, changes nothing, just settings +% \setuppapersize[A4][A3] % changes the current page mapping + +\let\page_paper_reinstate\relax +\let\page_paper_restore \relax \unexpanded\def\setuppapersize - {\dodoubleempty\dosetuppapersize} - -\def\dosetuppapersize[#1][#2]% - {\doifassignmentelse{#1} - {\setuppaper[#1]} - {\doifelsenothing{#2} - {\expanded{\dodosetuppapersize - [\executeifdefined{\??pp:1:#1}{#1}]% - [\executeifdefined{\??pp:2:#1}{#1}]}} - {\doifassignmentelse{#2} - {\getparameters[\??pp\executeifdefined{\??pp:1:#1}{#1}][#2]} - {\expanded{\dodosetuppapersize - [\executeifdefined{\??pp:1:#1}{#1}]% - [\executeifdefined{\??pp:1:#2}{#2}]}}}}} - -\let\reinstatepapersize\relax - -\def\adaptpapersize - {\global\let\reinstatepapersize\restorepapersize + {\dodoubleempty\setup_paper_size} + +\unexpanded\def\setup_paper_size[#1][#2]% + {\iffirstargument + \doifassignmentelse{#1} + {\setup_paper_size_settings[#1]} + {\doifassignmentelse{#2} + {\setup_paper_size_settings_by_name[#1][#2]} + {\setup_paper_size_change_size[#1][#2]}}% + \else + \page_paper_restore + \fi} + +\unexpanded\def\setup_paper_size_settings[#1]% + {\let\currentlayouttarget\empty + \setupcurrentlayouttarget[#1]% + \edef\tmp_layouttarget_paper{\page_paper_the_paper_size{\layouttargetparameter\c!page }}% + \edef\tmp_layouttarget_print{\page_paper_the_print_size{\layouttargetparameter\c!paper}}% + \ifx\tmp_layouttarget_paper\empty + % forget about it + \else + \ifx\tmp_layouttarget_print\empty + \let\tmp_layouttarget_print\tmp_layouttarget_paper + \fi + \pages_paper_set_current[\tmp_layouttarget_paper][\tmp_layouttarget_print]% + \fi + \letlayouttargetparameter\c!page \papersize + \letlayouttargetparameter\c!paper\printpapersize} + +\unexpanded\def\setup_paper_size_settings_by_name[#1][#2]% + {\def\currentlayouttarget{\page_paper_the_paper_size{#1}}% + \setuplayouttarget[#2]} + +\unexpanded\def\setup_paper_size_change_size[#1][#2]% + {\doifelsenothing{#2} + {\pages_paper_set_current[#1][#1]} + {\pages_paper_set_current[#1][#2]}} + +\let\setuppaper\setup_paper_size_settings + +\unexpanded\def\adaptpapersize + {\global\let\page_paper_reinstate\page_paper_reinstate_indeed \setuppapersize} +\unexpanded\def\page_paper_reinstate_indeed + {\page_paper_restore + \global\let\page_paper_reinstate\relax} + \appendtoks - \reinstatepapersize - \global\let\reinstatepapersize\relax + \page_paper_reinstate \to \everyaftershipout -\def\dodosetuppapersize[#1][#2]% - {\ifsecondargument - \expanded{\dododosetuppapersize[#1][#2]}% - \calculatehsizes - \calculatevsizes - \recalculatebackgrounds - \recalculatelayout - \else\iffirstargument - \setuppapersize[#1][#2]% - \else\ifx\papersize\undefined\else - \restorepapersize - \fi\fi\fi} - -% dimen freeze is a bit tricky, but catches local redundant calls -% with values where e.g width is defined in terms of \paperwidth - -\def\dododosetuppapersize[#1][#2]% - {\xdef\restorepapersize{\noexpand\setuppapersize[#1][#2]}% - \dosetuppaperorientation{#1}\paperlandscape\paperorientation\paperreverse\papermirror - \dosetuppaperorientation{#2}\printlandscape\printorientation\printreverse\printmirror - \def\docommand##1% - {\doifsomething{##1}{\doifdefined{\??pp##1\c!width} - {\global\paperwidth \getvalue{\??pp##1\c!width}% - \global\paperheight\getvalue{\??pp##1\c!height}% - \ifinpagebody - \setevalue{\??pp##1\c!height}{\the\paperheight}% - \setevalue{\??pp##1\c!width }{\the\paperwidth }% - \fi - \calculatepaperoffsets{##1}% - \xdef\papersize{##1}}}}% - \processcommacommand[#1]\docommand - \doifdefinedelse{\??pp#1\c!scale} - {\edef\paperscale{\getvalue{\??pp#1\c!scale}}} - {\edef\paperscale{1}}% - \def\docommand##1% - {\doifsomething{##1}{\doifdefined{\??pp##1\c!width} - {\global\printpaperwidth \getvalue{\??pp##1\c!width}% - \global\printpaperheight\getvalue{\??pp##1\c!height}% - \ifinpagebody - \setevalue{\??pp##1\c!height}{\the\printpaperheight}% - \setevalue{\??pp##1\c!width }{\the\printpaperwidth}% - \fi - \xdef\printpapersize{##1}}}}% - \processcommacommand[#2]\docommand - \global\setdimentoatleast\paperwidth \onepoint - \global\setdimentoatleast\paperheight \onepoint - \global\setdimentoatleast\printpaperwidth \onepoint - \global\setdimentoatleast\printpaperheight\onepoint - \ifconditional\paperlandscape +\unexpanded\def\page_paper_set_restore#1#2% + {\xdef\page_paper_restore{\pages_paper_set_current_indeed[#1][#2]}} + +\unexpanded\def\pages_paper_set_current[#1][#2]% + {\normalexpanded{\pages_paper_set_current_indeed + [\page_paper_the_paper_size{#1}]% + [\page_paper_the_print_size{#2}]}} + +\setvalue{\??pp:1:\v!reset }{\global\setfalse\c_page_target_paper_landscape + \global\setfalse\c_page_target_paper_mirror + \global\setfalse\c_page_target_paper_negate + \global\c_page_target_paper_orientation\uprotationangle + \global\c_page_target_paper_reverse \uprotationangle} +\setvalue{\??pp:1:\v!landscape }{\global\settrue\c_page_target_paper_landscape} +\setvalue{\??pp:1:\v!mirrored }{\global\settrue\c_page_target_paper_mirror} +\setvalue{\??pp:1:\v!negative }{\global\settrue\c_page_target_paper_negate} +\setvalue{\??pp:1:\v!rotated }{\global\c_page_target_paper_orientation\rightrotatioangle + \global\c_page_target_paper_reverse \leftrotatioangle} +\setvalue{\??pp:1:\number\rightrotatioangle}{\global\c_page_target_paper_orientation\rightrotatioangle + \global\c_page_target_paper_reverse \leftrotatioangle} +\setvalue{\??pp:1:\number\downrotatioangle }{\global\c_page_target_paper_orientation\downrotatioangle + \global\c_page_target_paper_reverse \zerocount} +\setvalue{\??pp:1:\number\leftrotatioangle }{\global\c_page_target_paper_orientation\leftrotatioangle + \global\c_page_target_paper_reverse \rightrotatioangle} + +\setvalue{\??pp:1:\v!reset }{\global\setfalse\c_page_target_print_landscape + \global\setfalse\c_page_target_print_mirror + \global\setfalse\c_page_target_print_negate + \global\c_page_target_print_orientation\uprotationangle + \global\c_page_target_print_reverse \uprotationangle} +\setvalue{\??pp:2:\v!landscape }{\global\settrue\c_page_target_print_landscape} +\setvalue{\??pp:2:\v!mirrored }{\global\settrue\c_page_target_print_mirror} +\setvalue{\??pp:2:\v!negative }{\global\settrue\c_page_target_print_negate} +\setvalue{\??pp:2:\v!rotated }{\global\c_page_target_print_orientation\rightrotatioangle + \global\c_page_target_print_reverse \leftrotatioangle} +\setvalue{\??pp:2:\number\rightrotatioangle}{\global\c_page_target_print_orientation\rightrotatioangle + \global\c_page_target_print_reverse \leftrotatioangle} +\setvalue{\??pp:2:\number\downrotatioangle }{\global\c_page_target_print_orientation\downrotatioangle + \global\c_page_target_print_reverse \zerocount} +\setvalue{\??pp:2:\number\leftrotatioangle }{\global\c_page_target_print_orientation\leftrotatioangle + \global\c_page_target_print_reverse \rightrotatioangle} + +\def\pages_paper_handle_page_option #1{\ifcsname\??pp:1:#1\endcsname\csname\??pp:1:#1\endcsname\fi} +\def\pages_paper_handle_print_option#1{\ifcsname\??pp:2:#1\endcsname\csname\??pp:2:#1\endcsname\fi} + +\unexpanded\def\pages_paper_identify_target#1% + {\ifcsname\??pp:c:#1\endcsname + \edef\currentlayouttarget{#1}% + \fi} + +\unexpanded\def\pages_paper_set_current_indeed[#1][#2]% + {\edef\tmp_pages_asked_paper{\v!reset,#1}% can be the restores + \edef\tmp_pages_asked_print{\v!reset,#2}% + % + \page_paper_set_restore\tmp_pages_asked_paper\tmp_pages_asked_print + % + % locate page target + \let\currentlayouttarget\empty + \processcommacommand[\tmp_pages_asked_paper]\pages_paper_identify_target + \ifx\currentlayouttarget\empty + \let\currentlayouttarget\currentpage + \fi + \global\let\papersize\currentlayouttarget + \processcommacommand[\tmp_pages_asked_paper]\pages_paper_handle_page_option + \global\paperwidth \layouttargetparameter\c!width \relax + \global\paperheight\layouttargetparameter\c!height\relax + \ifdim\paperwidth<\onepoint + \global\paperwidth\onepoint + \fi + \ifdim\paperheight<\onepoint + \global\paperheight\onepoint + \fi + \ifconditional\c_page_target_paper_landscape \doglobal\swapdimens\paperwidth\paperheight \fi - \ifconditional\printlandscape - \doglobal\swapdimens\printpaperwidth\printpaperheight + \ifinpagebody % local freeze + \normalexpanded{\setlayouttargetparemeter\c!height{\the\paperheight}}% + \normalexpanded{\setlayouttargetparemeter\c!width {\the\paperwidth }}% + \fi + % + \pages_paper_set_offsets + % locate paper target + \processcommacommand[\tmp_pages_asked_print]\pages_paper_identify_target + \global\let\printpapersize\currentlayouttarget + \processcommacommand[\tmp_pages_asked_print]\pages_paper_handle_print_option + \global\printpaperwidth \layouttargetparameter\c!width \relax + \global\printpaperheight\layouttargetparameter\c!height\relax + \ifdim\printpaperwidth<\onepoint + \global\printpaperwidth\paperwidth + \fi + \ifdim\printpaperheight<\onepoint + \global\printpaperheight\paperheight + \fi + \ifconditional\c_page_target_print_landscape + \globalswapdimens\printpaperwidth\printpaperheight \fi % this check can be confusing, so we've added the possibility % to bypass this test: \setuppapersize[option=fit] - \doif\@@ppoption\v!max % \v!fit is - {\bgroup + \edef\tmp_pages_asked_option{\rootlayouttargetparameter\c!option}% + \ifx\tmp_pages_asked_option\v!max % \v!fit is + \begingroup % we need to pre-swap else we get the wrong paper size - \ifnum\paperorientation=\rightrotatioangle + \ifnum\c_page_target_paper_orientation=\rightrotatioangle \swapdimens\paperwidth\paperheight - \else\ifnum\paperorientation=\leftrotatioangle + \else\ifnum\c_page_target_paper_orientation=\leftrotatioangle \swapdimens\paperwidth\paperheight \fi\fi - \ifnum\printorientation=\rightrotatioangle + \ifnum\c_page_target_print_orientation=\rightrotatioangle \swapdimens\printpaperwidth\printpaperheight - \else\ifnum\printorientation=\leftrotatioangle + \else\ifnum\c_page_target_print_orientation=\leftrotatioangle \swapdimens\printpaperwidth\printpaperheight \fi\fi \ifdim\paperheight>\printpaperheight @@ -414,54 +526,25 @@ \global\printpaperwidth\paperwidth \writestatus\m!system{print width forced to paper width}% \fi - \egroup}} - -\def\dosetuppaperorientation#1#2#3#4#5% - {\global\setfalse#2% - \global\setfalse#5% - \global#3\uprotationangle - \global#4\uprotationangle - \global\setfalse\printnegatecolors - \processallactionsinset - [#1] - [ \v!landscape=>\global\settrue#2, - \v!mirrored=>\global\settrue#5, - \v!rotated=>\global#3\rightrotatioangle - \global#4\leftrotatioangle, - \v!negative=>\global\settrue\printnegatecolors, - 90=>\global#3\rightrotatioangle - \global#4\leftrotatioangle, - 180=>\global#3\downrotatioangle - \global#4\zerocount, - 270=>\global#3\leftrotatioangle - \global#4\rightrotatioangle]} - -\ifx\calculatepaperoffsets\undefined - - \def\calculatepaperoffsets#1% - {\scratchdimen\getvalue{\??pp#1\c!offset}% - \global\advance\paperwidth -2\scratchdimen - \global\advance\paperheight-2\scratchdimen} - -\fi - -\let\restorepapersize\relax + \endgroup + \fi + %\writestatus{layout target}{(\the\paperwidth,\the\paperheight) -> (\the\printpaperwidth,\the\printpaperheight)}% + \pages_layouts_synchronize} -\ifx\setups\undefined \unexpanded\def\setups[#1]{\setdefaultpenalties} \fi +\ifx\pages_paper_set_offsets\undefined -% \newtoks \everybeforelayout \relax -% \newtoks \everyafterlayout \relax + \def\pages_paper_set_offsets % will move + {\global\paperoffset\v_page_target_offset + \global\advance\paperwidth -2\paperoffset + \global\advance\paperheight-2\paperoffset} -\def\recalculatelayout - {\doifsomething{\layoutparameter\c!page\layoutparameter\c!paper} - {\expanded{\dododosetuppapersize[\layoutparameter\c!page][\layoutparameter\c!paper]}}% - \dorecalculatelayout} +\fi -\ifdefined\docheckgridsnapping \else \let\docheckgridsnapping\relax \fi +\ifdefined\setups \else \unexpanded\def\setups[#1]{\setdefaultpenalties} \fi % still needed? +\ifdefined\docheckgridsnapping \else \let\docheckgridsnapping\relax \fi -\def\dorecalculatelayout - {%\the\everybeforelayout - \setups[\layoutparameter\c!preset]% +\def\pages_layouts_synchronize + {\setups[\layoutparameter\c!preset]% \global\leftmarginwidth \layoutparameter\c!leftmargin \global\rightmarginwidth\layoutparameter\c!rightmargin \global\leftedgewidth \layoutparameter\c!leftedge @@ -472,43 +555,45 @@ \global\topheight \layoutparameter\c!top \global\backspace \layoutparameter\c!backspace \global\topspace \layoutparameter\c!topspace - \setlayoutdimensions % the rest of the `dimensions' + \page_layouts_set_dimensions \docheckgridsnapping \doprocesslocalsetups{\layoutparameter\c!setups}% depends on gridsnapping ! \simplesetupwhitespace \simplesetupblank \setupinterlinespace[\v!reset]% \synchronizegloballinespecs - \global\cutspace\layoutparameter\c!cutspace - \relax - \doifelse{\layoutparameter\c!width}\v!middle - {\ifdim\cutspace=\zeropoint - \global\cutspace\backspace - \fi - \global\makeupwidth\dimexpr\paperwidth-\backspace-\cutspace\relax} - {\doifelse{\layoutparameter\c!width}\v!fit - {\ifdim\cutspace=\zeropoint - \global\cutspace\backspace - \fi - \global\makeupwidth\dimexpr\paperwidth-\cutspace\relax - \scratchdimen\dimexpr\backspace - -\leftedgewidth -\leftedgedistance - -\leftmarginwidth-\leftmargindistance\relax - \ifdim\scratchdimen<\zeropoint - \scratchdimen\zeropoint - \fi - \global\advance\makeupwidth\dimexpr - -\rightmargindistance-\rightmarginwidth - -\rightedgedistance -\rightedgewidth - -\scratchdimen\relax} - {\global\makeupwidth\layoutparameter\c!width\relax - \ifdim\cutspace=\zeropoint - \global\cutspace\dimexpr\paperwidth-\makeupwidth-\backspace\relax - % \else - % A kind of inconsistent specification, but used - % in for instance s-pre-19.tex; the cutspace is - % used only for determining some kind of right - % margin; don't use this in doublesided mode - \fi}}% + \global\cutspace\layoutparameter\c!cutspace\relax + \edef\layout_parameter_width{\layoutparameter\c!width}% + \ifx\layout_parameter_width\v!middle + \ifdim\cutspace=\zeropoint + \global\cutspace\backspace + \fi + \global\makeupwidth\dimexpr\paperwidth-\backspace-\cutspace\relax + \else\ifx\layout_parameter_width\v!fit + \ifdim\cutspace=\zeropoint + \global\cutspace\backspace + \fi + \global\makeupwidth\dimexpr\paperwidth-\cutspace\relax + \scratchdimen\dimexpr\backspace + -\leftedgewidth -\leftedgedistance + -\leftmarginwidth-\leftmargindistance\relax + \ifdim\scratchdimen<\zeropoint + \scratchdimen\zeropoint + \fi + \global\advance\makeupwidth\dimexpr + -\rightmargindistance-\rightmarginwidth + -\rightedgedistance -\rightedgewidth + -\scratchdimen\relax + \else + \global\makeupwidth\layout_parameter_width\relax + \ifdim\cutspace=\zeropoint + \global\cutspace\dimexpr\paperwidth-\makeupwidth-\backspace\relax + % \else + % A kind of inconsistent specification, but used + % in for instance s-pre-19.tex; the cutspace is + % used only for determining some kind of right + % margin; don't use this in doublesided mode + \fi + \fi\fi \scratchdimen\layoutparameter\c!bottomspace\relax %\ifdim\scratchdimen=\zeropoint % \scratchdimen\topspace @@ -516,27 +601,30 @@ \global\bottomspace\layoutparameter\c!bottomspace\relax \global\layoutlines0\number\layoutparameter\c!lines\relax % may be empty \ifcase\layoutlines - \doifelse{\layoutparameter\c!height}\v!middle - {\ifdim\bottomspace=\zeropoint - \global\bottomspace\topspace - \fi - \global\makeupheight\dimexpr\paperheight-\topspace-\bottomspace\relax} - {\doifelse{\layoutparameter\c!height}\v!fit - {\ifdim\bottomspace=\zeropoint - \global\bottomspace\topspace - \fi - \global\makeupheight\dimexpr\paperheight-\bottomspace\relax - \scratchdimen\dimexpr\topspace-\topheight-\topdistance\relax - \ifdim\scratchdimen<\zeropoint - \scratchdimen\zeropoint - \fi - \global\advance\makeupheight\dimexpr-\bottomdistance-\bottomheight-\scratchdimen\relax} - {\global\makeupheight\layoutparameter\c!height\relax - \ifdim\bottomspace=\zeropoint - \global\bottomspace\dimexpr\paperheight-\makeupheight-\topspace\relax - \else - % inconsistent specification - \fi}}% + \edef\layout_parameter_height{\layoutparameter\c!height}% + \ifx\layout_parameter_height\v!middle + \ifdim\bottomspace=\zeropoint + \global\bottomspace\topspace + \fi + \global\makeupheight\dimexpr\paperheight-\topspace-\bottomspace\relax + \else\ifx\layout_parameter_height\v!fit + \ifdim\bottomspace=\zeropoint + \global\bottomspace\topspace + \fi + \global\makeupheight\dimexpr\paperheight-\bottomspace\relax + \scratchdimen\dimexpr\topspace-\topheight-\topdistance\relax + \ifdim\scratchdimen<\zeropoint + \scratchdimen\zeropoint + \fi + \global\advance\makeupheight\dimexpr-\bottomdistance-\bottomheight-\scratchdimen\relax + \else + \global\makeupheight\layoutparameter\c!height\relax + \ifdim\bottomspace=\zeropoint + \global\bottomspace\dimexpr\paperheight-\makeupheight-\topspace\relax + % \else + % inconsistent specification + \fi + \fi\fi \else % beware, when the bodyfont changes (switched) this will change as well; implementing % a global lineheight is tricky: should we take the bodyfont interlinespace or the one set @@ -546,39 +634,47 @@ \layoutparameter\c!lines\lineheight-\strutheight+\topskip+ \headerdistance+\headerheight+\footerdistance+\footerheight\relax \fi - \backoffset\layoutparameter\c!horoffset - \topoffset \layoutparameter\c!veroffset - \global\setdimentoatleast\makeupwidth\onepoint - \global\setdimentoatleast\makeupheight \onepoint - % \checkcurrentlayout % here ? - % \the\everyafterlayout - \calculatelayoutextras + \backoffset\layoutparameter\c!horoffset\relax + \topoffset \layoutparameter\c!veroffset\relax + \ifdim\makeupwidth<\onepoint + \global\makeupwidth\onepoint + \fi + \ifdim\makeupheight<\onepoint + \global\makeupheight\onepoint + \fi + % \page_layouts_check_next % here ? + \page_layouts_calculate_extras + \page_target_check_centering \calculatehsizes \calculatevsizes - \calculatepseudocolumns + \page_layouts_check_pseudo_columns \recalculatebackgrounds} -\def\calculatepseudocolumns +\def\page_layouts_check_pseudo_columns {\global\layoutcolumns\layoutparameter\c!columns \global\layoutcolumndistance\layoutparameter\c!columndistance \global\layoutcolumnwidth\dimexpr\makeupwidth-\layoutcolumns\layoutcolumndistance+\layoutcolumndistance\relax - \global\divide\layoutcolumnwidth\layoutcolumns - \dorecurse\layoutcolumns - {\setxvalue{\??ly:c:\recurselevel}% - {\the\numexpr\recurselevel-\plusone\relax\dimexpr\layoutcolumnwidth+\layoutcolumndistance\relax}}} + \ifnum\layoutcolumns>\plusone + \global\divide\layoutcolumnwidth\layoutcolumns + \dorecurse\layoutcolumns\page_layouts_check_pseudo_column + \fi} -%\dorecurse\layoutcolumns -% {\setxvalue{\??ly:c:\recurselevel}{\the\dimexpr -% (\numexpr(\recurselevel-1)\dimexpr(\layoutcolumnwidth+\layoutcolumndistance))}} +\def\page_layouts_check_pseudo_column + {\setxvalue{\??ly:c:\recurselevel}% + {\the\numexpr\recurselevel-\plusone\relax\dimexpr\layoutcolumnwidth+\layoutcolumndistance\relax}} + +\letvalue{\??ly:c:0}\zeropoint \def\layoutcolumnoffset#1% - {\executeifdefined{\??ly:c:#1}\zeropoint} + {\csname\??ly:c:\ifcsname\??ly:c:#1\endcsname#1\else0\fi\endcsname} -\def\checklayout - {\ifdim\makeupheight=\layoutlines\lineheight \else \recalculatelayout \fi} +\def\pages_layouts_synchronize_at_start + {\ifdim\makeupheight=\layoutlines\lineheight \else % weird check + \pages_layouts_synchronize + \fi} \appendtoks - \checklayout + \pages_layouts_synchronize_at_start % still needed? \to \everystarttext % document: @@ -587,48 +683,60 @@ % % \startstandardmakeup[page=blank] ... \stopstandardmakeup -\def\changetolayout#1% +\ifdefined\lastpage \else \let\lastpage\!!plusone \fi + +\def\page_layouts_change#1% {%\writestatus\m!layouts{changing to layout #1}% \xdef\currentlayout{#1}% - \recalculatelayout} + \pages_layouts_synchronize} -\def\checkcurrentoddlayout - {\ifcsname\namedlayouthash\v!odd\c!state\endcsname - \doif{\namedlayoutparameter\v!odd\c!state}\v!start{\changetolayout\v!odd}% - \fi} +\let\changetolayout\page_layouts_change % also public + +\def\v_real_page_normal {\the\realpageno} +\def\v_real_page_reverse{-\the\realpageno} -\def\checkcurrentevenlayout - {\ifcsname\namedlayouthash\v!even\c!state\endcsname - \doif{\namedlayoutparameter\v!even\c!state}\v!start{\changetolayout\v!even}% +\def\v_real_page_odd_or_even + {\ifodd\pagenoshift + \ifodd\realpageno\v!even\else\v!odd \fi + \else + \ifodd\realpageno\v!odd \else\v!even\fi \fi} -\ifx\lastpage\undefined - \def\lastpage{1} -\fi +\let\v_real_page_current\v!current -\def\reverserealfolio - {\ifnum\lastpage>\plusone - \ifnum\lastpage=\realfolio - \v!last - \else\ifnum\plusone=\realfolio - \v!first - \else - \the\numexpr\realfolio-\lastpage\relax - \fi\fi +\def\v_real_page_named + {\ifnum\lastpage=\realpageno + \v!last + \else\ifnum\plusone=\realpageno + \v!first \else - \!!zerocount - \fi} + \s!unknown + \fi\fi} -\def\checkcurrentlayout % public and used in naw, so keep this name - {\ifcsname\namedlayouthash\realfolio\c!state\endcsname - \doif{\namedlayoutparameter\realfolio\c!state}\v!start{\changetolayout\realfolio}% - \else\ifcsname\namedlayouthash\reverserealfolio\c!state\endcsname - \doif{\namedlayoutparameter\reverserealfolio\c!state}\v!start{\changetolayout\reverserealfolio}% - \else\ifcsname\namedlayouthash\v!current\c!state\endcsname - \changetolayout\v!current % no start test ? +\def\page_layouts_check_default_indeed#1% + {\doif{\namedlayoutparameter#1\c!state}\v!start{\page_layouts_change{#1}}} + +\def\page_layouts_check_default + {\ifcsname\namedlayouthash\v_real_page_normal \c!state\endcsname \page_layouts_check_default_indeed\v_real_page_normal \else + \ifcsname\namedlayouthash\v_real_page_reverse \c!state\endcsname \page_layouts_check_default_indeed\v_real_page_revers \else + \ifcsname\namedlayouthash\v_real_page_named \c!state\endcsname \page_layouts_check_default_indeed\v_real_page_named \else + \ifcsname\namedlayouthash\v_real_page_current \c!state\endcsname \page_layouts_check_default_indeed\v_real_page_current \else + \ifcsname\namedlayouthash\v_real_page_odd_or_even\c!state\endcsname \page_layouts_check_default_indeed\v_real_page_odd_or_even\fi\fi\fi\fi\fi} + +\def\installlayoutmethod#1#2% + {\setgvalue{\??ly:m:#1}{#2}} + +\installlayoutmethod\v!default{\page_layouts_check_default} +\installlayoutmethod\v!normal {\page_layouts_check_default} + +\def\page_layouts_check_next + {\csname\??ly:m:\ifcsname\??ly:m:\layoutparameter\c!method\endcsname + \layoutparameter\c!method \else - \doifoddpageelse\checkcurrentoddlayout\checkcurrentevenlayout - \fi\fi\fi} + \v!normal + \fi\endcsname} + +\let\checkcurrentlayout\page_layouts_check_next % public and used in naw, so this synonym will stay % inheritance % @@ -660,311 +768,166 @@ % \dorecurse{20} {\input knuth \endgraf \input tufte \endgraf} % \stoptext -%appendtoks \checkcurrentlayout \to \everyaftershipout % no -\appendtoks \checkcurrentlayout \to \everystarttext +% Because we want to keep the set parameters as they are we use some +% helpers to communicate between the several page building related +% mechanism. -\appendtoks - \dochecknextlayout -\to \everyaftershipout - -% \def\dochecknextlayout -% {\ifx\currentlayout\v!current -% % prevent redundant calculations -% \else -% \globallet\currentlayout\empty -% \global\letbeundefined{\??ly\v!current\c!state}% -% \checkcurrentlayout -% \fi} -% -% this breaks after a standardmakeup - -\def\dochecknextlayout{\checkcurrentlayout} +\appendtoks \page_layouts_check_next \to \everystarttext +\appendtoks \page_layouts_check_next \to \everyaftershipout \newconditional\c_page_layouts_location_is_set \def\page_layouts_location_reset {\setfalse\c_page_layouts_location_is_set - \let\v_page_layouts_location_left_fill \relax - \let\v_page_layouts_location_right_fill \relax - \let\v_page_layouts_location_top_fill \relax - \let\v_page_layouts_location_bottom_fill\relax} - -\page_layouts_location_reset + \let\v_page_target_left_fill \relax + \let\v_page_target_right_fill \relax + \let\v_page_target_top_fill \relax + \let\v_page_target_bottom_fill\relax} \setvalue{\??ly:\c!location:\v!right }{\settrue\c_page_layouts_location_is_set - \let\v_page_layouts_location_left_fill \hss} + \let\v_page_target_left_fill \hss} \setvalue{\??ly:\c!location:\v!left }{\settrue\c_page_layouts_location_is_set - \let\v_page_layouts_location_right_fill \hss} + \let\v_page_target_right_fill \hss} \setvalue{\??ly:\c!location:\v!bottom }{\settrue\c_page_layouts_location_is_set - \let\v_page_layouts_location_top_fill \vss} + \let\v_page_target_top_fill \vss} \setvalue{\??ly:\c!location:\v!top }{\settrue\c_page_layouts_location_is_set - \let\v_page_layouts_location_bottom_fill\vss} + \let\v_page_target_bottom_fill\vss} \setvalue{\??ly:\c!location:\v!middle }{\settrue\c_page_layouts_location_is_set - \let\v_page_layouts_location_left_fill \hss - \let\v_page_layouts_location_right_fill \hss - \let\v_page_layouts_location_top_fill \vss - \let\v_page_layouts_location_bottom_fill\vss} + \let\v_page_target_left_fill \hss + \let\v_page_target_right_fill \hss + \let\v_page_target_top_fill \vss + \let\v_page_target_bottom_fill\vss} \setvalue{\??ly:\c!location:\empty }{\setfalse\c_page_layouts_location_is_set % default also signal to scrn_ - \let\v_page_layouts_location_right_fill \hss - \let\v_page_layouts_location_bottom_fill\hss} -\setvalue{\??ly:\c!location:\v!doublesided}{\settrue\printdoublesided} -\setvalue{\??ly:\c!location:\v!singlesided}{\setfalse\printdoublesided} + \let\v_page_target_right_fill \hss + \let\v_page_target_bottom_fill\hss} +\setvalue{\??ly:\c!location:\v!doublesided}{\settrue \c_page_target_print_doublesided} +\setvalue{\??ly:\c!location:\v!singlesided}{\setfalse\c_page_target_print_doublesided} -\def\dopresetcenterpagebox#1% +\def\page_target_check_centering_indeed#1% {\ifcsname\??ly:\c!location:#1\endcsname\csname\??ly:\c!location:#1\endcsname\fi} -\def\presetcenterpagebox - {\setfalse\printdoublesided +\unexpanded\def\page_target_check_centering + {\setfalse\c_page_target_print_doublesided \page_layouts_location_reset - \processcommacommand[\layoutparameter\c!location]\dopresetcenterpagebox} + \processcommacommand[\layoutparameter\c!location]\page_target_check_centering_indeed} % installers -\def\installlayoutmethod#1#2% - {\setgvalue{\??ly:\c!method:#1}{#2}} - -\installlayoutmethod\v!default - {\checkcurrentlayout} - -\installlayoutmethod\v!normal - {\checkcurrentlayout} - -\def\dochecknextlayout - {\executeifdefined - {\??ly:\c!method:\layoutparameter\c!method} - {\getvalue{\??ly:\c!method:\v!normal}}} - \def\installlayoutalternative#1#2% - {\setgvalue{\??ly:\c!alternative:#1}{#2}} + {\setgvalue{\??ly:a:#1}{#2}} -\def\constructnormalpagecontent#1#2% redefined +\def\page_boxes_construct_content_default#1#2% #1 and #2 will become variables {\setbox\pagebox\vbox {\offinterlineskip - \begingroup - \dosetlayoutattributes\c!style\c!color + \begingroup % needed ? + \uselayoutstyleandcolor\c!style\c!color \offinterlineskip \gettextboxes \endgroup - \getmainbox#1#2}% including footnotes - \addmainbackground\pagebox - \buildpagebox\pagebox - \addstatusinfo\pagebox} - -\installlayoutalternative\v!normal - {\constructnormalpagecontent} - -\def\constructpagecontent % overload - {\executeifdefined - {\??ly:\c!alternative:\layoutparameter\c!alternative}% - {\getvalue{\??ly:\c!alternative:\v!normal}}} - -\let\@@zaheight\!!zeropoint - -\def\dopushpagedimensions - {\xdef\oldtextheight {\the\textheight }% - \xdef\oldfooterheight{\the\footerheight}% - \global\let\@@zaheight\@@zaheight} - -\def\dopoppagedimensions - {\global\textheight \oldtextheight - \global\footerheight\oldfooterheight - \recalculatelayout - \global\let\pushpagedimensions\dopushpagedimensions - \global\let\poppagedimensions\relax} - -\let\poppagedimensions \relax -\let\pushpagedimensions\dopushpagedimensions - -% Elke \csname ... \endcsname wordt ook aangemaakt, dus ook -% in een test met \doifdefined. Bij veel bladzijden kan dit -% te veel macro's kosten. Vandaar de set \adaptedpages. Het -% kost tijd, maar scheelt macro's. - -\let\adaptedpages\empty - -\def\adaptpagedimensions - {\ifx\adaptedpages\empty\else - \adaptpagedimensionsindeed - \fi} + \getmainbox#1#2}}% including footnotes -\def\adaptpagedimensionsindeed - {\rawdoifinset\realfolio\adaptedpages - {\removefromcommalist\realfolio\adaptedpages - \getvalue{\??za\realfolio}% - \letbeundefined{\??za\realfolio}}} +\installlayoutalternative\v!default{\page_boxes_construct_content_default} +\installlayoutalternative\v!normal {\page_boxes_construct_content_default} -\def\checkpagedimensions - {\poppagedimensions - \adaptpagedimensions} +\def\page_boxes_construct_content + {\csname\??ly:a:\ifcsname\??ly:a:\layoutparameter\c!alternative\endcsname + \layoutparameter\c!alternative + \else + \v!normal + \fi\endcsname} -\def\reportpagedimensions - {\ifx\poppagedimensions\relax \else - \space\the\dimexpr\@@zaheight\relax\space-\space - \fi - \realfolio} +%D \macros +%D {adaptlayout} -\def\dodoadaptlayout[#1]% - {\getparameters[\??za][\c!height=,\c!lines=0,#1]% - \pushpagedimensions - \ifcase\@@zalines\relax - \showmessage\m!layouts1{\@@zaheight,\realfolio}% +\newdimen\page_adepts_pushed_text_height +\newdimen\page_adepts_pushed_footer_height +\newdimen\page_adepts_height + +\unexpanded\def\adaptlayout + {\dodoubleempty\page_adapts_layout} + +\def\page_adapts_layout[#1][#2]% + {\ifsecondargument + \processcommalist[#1]{\page_adapts_layout_register{#2}}% + \page_adapts_check \else - \showmessage\m!layouts1{\@@zalines\space\v!lines,\realfolio}% - \def\@@zaheight{\@@zalines\openlineheight}% - \fi + \page_adapts_layout_indeed{#1}% + \fi} + +\def\page_adapts_layout_register#1#2% + {\setgvalue{\??za:#2}{\page_adapts_layout_indeed{#1}}} + +\def\page_adapts_layout_indeed#1% + {\getparameters[\??za][\c!height=\zeropoint,\c!lines=0,#1]% + \page_adepts_push \doifelse\@@zaheight\v!max - {\balancedimensions\textheight\footerheight\footerheight} - {\balancedimensions\textheight\footerheight\@@zaheight}% - \ifdim\footerheight<\zeropoint - \global\advance\textheight \footerheight - \global\footerheight\zeropoint - \global\xdef\@@zaheight{\layoutparameter\c!footer\space(\v!max)}% - \fi + {\global\page_adepts_height\footerheight} + {\global\page_adepts_height\dimexpr + \ifnum\@@zalines=\zerocount + \@@zaheight + \else + \@@zalines\openlineheight + \fi + \relax + \ifdim\page_adepts_height>\footerheight + \global\page_adepts_height\footerheight + \fi} + \global\advance\textheight \page_adepts_height + \global\advance\footerheight-\page_adepts_height + \showmessage\m!layouts1{\the\page_adepts_height,\the\realpageno}% + % this will become a better one (do we need insert correction?) \setvsize - \global\pagegoal\vsize % nog corrigeren voor insertions ? + \global\pagegoal\vsize + % \recalculatebackgrounds - \global\let\pushpagedimensions\relax - \global\let\poppagedimensions\dopoppagedimensions} + \global\let\page_adepts_push\relax + \global\let\page_adepts_pop\page_adepts_pop_indeed} -\def\doadaptlayout[#1][#2]% - {\doifelsenothing{#2} - {\dodoadaptlayout[#1]} - {\def\docommand##1% - {\addtocommalist{##1}\adaptedpages - \setgvalue{\??za##1}{\dodoadaptlayout[#2]}}% - \processcommalist[#1]\docommand - \adaptpagedimensions}} - -\def\adaptlayout - {\dodoubleempty\doadaptlayout} - -\unexpanded\def\startlayout[#1]% - {\page - \pushmacro\currentlayout - \doiflayoutdefinedelse{#1}{\setuplayout[#1]}\donothing} % {\setuplayout[\currentlayout]}} - -\unexpanded\def\stoplayout - {\page - \popmacro\currentlayout - \setuplayout[\currentlayout]} - - -% describe interface - -%D Centering the paper area on the print area is determined -%D by the \type {top}, \type {bottom}, \type {left} and \type -%D {right} parameters. - -\def\centerpagebox#1% we could test for a difference (saves packing) - {\printpaperwidth \paperscale\printpaperwidth - \printpaperheight\paperscale\printpaperheight - \ifdim\printpaperheight>\ht#1\relax - \donetrue - \else\ifdim\printpaperwidth>\wd#1\relax - \donetrue - \else - \donefalse - \fi\fi - \ifdone - \setbox#1\vbox to \printpaperheight - {\@@pptop - \v_page_layouts_location_top_fill - \hbox to \printpaperwidth - {\ifconditional\printdoublesided - \doifbothsides - {\@@ppleft \v_page_layouts_location_left_fill \box#1\v_page_layouts_location_right_fill\@@ppright}% - {\@@ppleft \v_page_layouts_location_left_fill \box#1\v_page_layouts_location_right_fill\@@ppright}% - {\@@ppright\v_page_layouts_location_right_fill\box#1\v_page_layouts_location_left_fill \@@ppleft }% - \else - \@@ppleft \v_page_layouts_location_left_fill \box#1\v_page_layouts_location_right_fill\@@ppright - \fi}% - \par - \v_page_layouts_location_bottom_fill - \@@ppbottom}% +\def\page_adapts_check + {\ifcsname\??za:\the\realpageno\endcsname + \page_adapts_check_indeed \fi} -\def\offsetprintbox#1% - {\ifdim\topoffset=\zeropoint % \relax - \ifdim\backoffset=\zeropoint - \donefalse - \else - \donetrue - \fi - \else - \donetrue - \fi - \ifdone - \edef\next{\wd#1\the\wd#1\ht#1\the\ht#1\dp#1\the\dp#1}% - \setbox#1\vbox - {\offinterlineskip - \vskip\topoffset - \hskip\doifbothsides\backoffset\backoffset{-\backoffset}% - \box#1}% - \next - \fi} +\def\page_adapts_check_indeed + {\getvalue{\??za:\the\realpageno}% + \letvalue{\??za:\the\realpageno}\relax} -\def\replicatepagebox#1% - {\ifnum\layoutparameter\c!nx>\plusone - \donetrue - \else\ifnum\layoutparameter\c!ny>\plusone - \donetrue - \else - \donefalse - \fi\fi - \ifdone - \setbox#1\vbox - {\offinterlineskip - \dorecurse{\layoutparameter\c!ny} - {\hbox{\dorecurse{\layoutparameter\c!nx}{\copy#1\hskip\layoutparameter\c!dx}\unskip}% - \vskip\layoutparameter\c!dy} - \unskip}% - \fi} +\def\page_adepts_push_indeed + {\global\page_adepts_pushed_text_height \textheight + \global\page_adepts_pushed_footer_height\footerheight} -\def\orientpagebodybox#1#2#3% - {\ifnum\number#1\number#2>\zerocount - \setbox#3\vbox - {\edef\somerotation{\number\ifdoublesided\ifodd\realpageno#1\else#2\fi\else#1\fi}% - \dorotatebox\somerotation\hbox{\box#3}}% - \fi} +\def\page_adepts_pop_indeed + {\global\textheight \page_adepts_pushed_text_height + \global\footerheight\page_adepts_pushed_footer_height + \pages_layouts_synchronize + \global\let\page_adepts_push\page_adepts_push_indeed + \global\let\page_adepts_pop\relax} -\def\orientpaperbox{\orientpagebodybox\paperorientation\paperreverse} -\def\orientprintbox{\orientpagebodybox\printorientation\printreverse} +\let\page_adepts_pop \relax +\let\page_adepts_push\page_adepts_push_indeed -\def\mirrorpagebodybox#1#2% - {\ifconditional#1\relax - \setbox#2\vbox{\domirrorbox\vbox{\box#2}}% - \fi} +\unexpanded\def\page_adapts_synchronize % used elsewhere + {\page_adepts_pop + \page_adapts_check} -\def\mirrorpaperbox{\mirrorpagebodybox\papermirror} -\def\mirrorprintbox{\mirrorpagebodybox\printmirror} - -\def\scalepagebox#1% - {\edef\tmp_currentlayout_scale{\layoutparameter\c!scale}% - \ifdim\tmp_currentlayout_scale\points=\onepoint - \edef\tmp_currentlayout_sx{\layoutparameter\c!sx}% - \edef\tmp_currentlayout_sy{\layoutparameter\c!sy}% - \ifdim\tmp_currentlayout_sx\points=\onepoint - \ifdim\layoutparameter\c!sy\points=\onepoint - % no scaling done (and no copying either) - \else - \doscalepagebox{#1}\tmp_currentlayout_sx\tmp_currentlayout_sy - \fi - \else - \doscalepagebox{#1}\tmp_currentlayout_sx\tmp_currentlayout_sy - \fi - \else - \doscalepagebox{#1}\tmp_currentlayout_scale\tmp_currentlayout_scale - \fi} +\def\page_adapts_status_info % used elsewhere + {\ifx\page_adepts_pop\relax \else + \space(adept: \the\page_adepts_height)\space + \fi + \the\realpageno} + +%D \macros +%D {startlayout,stoplayout} -\def\doscalepagebox#1#2#3% - {\setbox#1\vbox{\scale[\c!sx=#2,\c!sy=#3]{\box#1}}% - \paperwidth #2\paperwidth - \paperheight#3\paperheight} +\unexpanded\def\startlayout[#1]% + {\page + \pushmacro\currentlayout + \doiflayoutdefinedelse{#1}{\setuplayout[#1]}\donothing} % {\setuplayout[\currentlayout]}} -\def\negateprintbox#1% - {\ifconditional\printnegatecolors - \negatecolorbox{#1}% - \fi} +\unexpanded\def\stoplayout + {\page + \popmacro\currentlayout + \setuplayout[\currentlayout]} % NOG EENS NAGAAN WANNEER NU GLOBAL EN WANNEER NIET @@ -977,25 +940,10 @@ \def\globalcompensatevsizeheader{\global\advance\textheight-\dimexpr\headerheight+\headerdistance\relax} \def\globalcompensatevsizefooter{\global\advance\textheight-\dimexpr\footerheight+\footerdistance\relax} -\def\compensatevsizeheaderzero{\headerheight\zeropoint\setlayoutdistances} -\def\compensatevsizefooterzero{\footerheight\zeropoint\setlayoutdistances} +\def\compensatevsizeheaderzero{\headerheight\zeropoint\page_layouts_set_distances} +\def\compensatevsizefooterzero{\footerheight\zeropoint\page_layouts_set_distances} -\def\calculatevsizes - {\textheight\makeupheight - \doifelselayoutsomeline\v!header\compensatevsizeheader\donothing - \doifelselayoutsomeline\v!footer\compensatevsizefooter\donothing - \setvsizemodes - \resetglobal - \setvsize} - -\def\calculateglobalvsizes - {\global\textheight\makeupheight - \doifelselayoutsomeline\v!header\globalcompensatevsizeheader\donothing - \doifelselayoutsomeline\v!footer\globalcompensatevsizefooter\donothing - \setvsizemodes - \setvsize} - -\def\setvsizemodes +\def\page_layouts_set_modes {\ifzeropt\headerheight \resetsystemmode\v!header \else @@ -1007,7 +955,22 @@ \setsystemmode\v!footer \fi} -\def\calculatereducedvsizes +\def\calculatevsizes % name will change + {\textheight\makeupheight + \doifelselayoutsomeline\v!header\compensatevsizeheader\donothing + \doifelselayoutsomeline\v!footer\compensatevsizefooter\donothing + \page_layouts_set_modes + \resetglobal + \setvsize} + +\def\calculateglobalvsizes % name will change + {\global\textheight\makeupheight + \doifelselayoutsomeline\v!header\globalcompensatevsizeheader\donothing + \doifelselayoutsomeline\v!footer\globalcompensatevsizefooter\donothing + \page_layouts_set_modes + \setvsize} + +\def\calculatereducedvsizes % name will change {\textheight\makeupheight \doifelselayoutsomeline\v!header\compensatevsizeheader\compensatevsizeheaderzero \doifelselayoutsomeline\v!footer\compensatevsizefooter\compensatevsizefooterzero} @@ -1020,25 +983,28 @@ \def\compensatedinnermakeupmargin {\dimexpr\ifconditional\innermakeupcompensation+\innermakeupmargin\else\zeropoint\fi\relax} -\def\freezetextwidth % \makeupwidth may be set to \textwidth - {\textwidth\makeupwidth % which is a tricky but valid value - \doifsomething{\layoutparameter\c!textwidth} - {\textwidth\layoutparameter\c!textwidth}% % local +\def\freezetextwidth % name will change % \makeupwidth may be set to \textwidth + {\textwidth\makeupwidth % which is a tricky but valid value + \edef\tmp_currentlayout_text_width {\layoutparameter\c!textwidth }% + \edef\tmp_currentlayout_text_margin{\layoutparameter\c!textmargin}% + \ifx\tmp_currentlayout_text_width\empty \else + \textwidth\tmp_currentlayout_text_width % local + \fi \global\innermakeupwidth\textwidth - \doifelsenothing{\layoutparameter\c!textmargin} - {\global\innermakeupmargin\zeropoint} - {\global\innermakeupmargin\layoutparameter\c!textmargin}% - \global\advance\innermakeupwidth-\dimexpr\innermakeupmargin+\innermakeupmargin\relax - \advance\textwidth-\dimexpr\innermakeupmargin+\innermakeupmargin\relax} % local + \ifx\tmp_currentlayout_text_margin\empty + \global\innermakeupmargin\zeropoint + \else + \global\innermakeupmargin\tmp_currentlayout_text_margin\relax + \fi + \scratchdimen\dimexpr\innermakeupmargin+\innermakeupmargin\relax + \global\advance\innermakeupwidth-\scratchdimen + \advance\textwidth-\scratchdimen} % local -\def\calculatehsizes +\def\calculatehsizes % name will change {\freezetextwidth \sethsize} - -% De onderstaande macro voert commando's uit, afhankelijk van -% het karakter van het paginanummer. -% -% \doifoddpageelse{then-commando}{else-commando} + +% The next few are better off in page-ini.mkiv %D When we start at an even page, we need to swap the layout %D differently. We cannot adapt the real page number, since @@ -1048,6 +1014,8 @@ % We could use nested if here plus some \@EAEAEA's but but the % next variant has less expansion which is nicer in tracing. +% #single #left #right + \def\doifoddpageelse {\ifodd\pagenoshift\expandafter\doifoddpageelseyes \else\expandafter\doifoddpageelsenop \fi} \def\doifoddpageelseyes{\ifodd\realpageno \expandafter\secondoftwoarguments\else\expandafter\firstoftwoarguments \fi} \def\doifoddpageelsenop{\ifodd\realpageno \expandafter\firstoftwoarguments \else\expandafter\secondoftwoarguments\fi} @@ -1079,7 +1047,7 @@ \newdimen\texthoffset -\def\settexthoffset +\def\settexthoffset % name will change {\texthoffset\doifbothsides\backspace\backspace{\dimexpr\paperwidth-\backspace-\makeupwidth\relax}} % The next hack is too tricky as we may shipout more pages: @@ -1106,16 +1074,16 @@ % \freezepagestatechecks % \to \everybeforeshipout -\def\goleftonpage +\def\goleftonpage % name will change {\hskip-\dimexpr\leftmargindistance+\leftmarginwidth+\leftedgedistance+\leftedgewidth\relax} \def\doifmarginswapelse#1#2% {\doifbothsides{#1}{#1}{#2}} -\def\swapmargins +\def\swapmargins % name will change {\doifmarginswapelse\relax\doswapmargins} -\def\doswapmargins +\def\doswapmargins % name will change {\let\swapmargins \relax % to prevent local swapping \let\doswapmargins\relax % to prevent local swapping \the\everyswapmargins} @@ -1178,15 +1146,15 @@ %D versions. \unexpanded\def\startlocallayout - {\globalpushmacro\restorepapersize + {\globalpushmacro\page_paper_restore \globalpushmacro\currentlayout} \unexpanded\def\stoplocallayout {\globalpopmacro\currentlayout - \globalpopmacro\restorepapersize - \restorepapersize - \setuplayout} - + \globalpopmacro\page_paper_restore + \page_paper_restore + \setuplayout\relax} + %D \macros %D {showprint, showframe, showlayout, showsetups} %D @@ -1218,26 +1186,6 @@ %D since they could change while going to a new page, %D depending on the current font setting. -\setuppaper % (size) % only used in XY imposition - [\c!width=\zeropoint, - \c!height=\zeropoint, - \c!topspace=\zeropoint, - \c!backspace=\zeropoint, - \c!dx=\zeropoint, - \c!dy=\zeropoint, - \c!nx=1, - \c!ny=1, - \c!alternative=\v!normal, - \c!method=\v!normal] - -\setuppapersize - [\c!option=\v!max, - \c!top=, - \c!bottom=, - \c!left=, - \c!right=, - \c!location=] - \setuplayout [ \c!topspace=.08417508418\paperheight, % 2.5cm \c!top=\zeropoint, diff --git a/tex/context/base/page-lin.mkiv b/tex/context/base/page-lin.mkiv index e70a8148d..4996ad2b1 100644 --- a/tex/context/base/page-lin.mkiv +++ b/tex/context/base/page-lin.mkiv @@ -176,11 +176,14 @@ \fi \mksetuptextlinenumbering} +% some day commandhandler + \def\linenumberparameter#1% {\csname\??rn\ifcsname\??rn\currentlinenumbering#1\endcsname\currentlinenumbering\fi#1\endcsname} -\def\linenumberattributes - {\doattributes{\??rn\ifcsname\??rn\currentlinenumbering\c!style\endcsname\currentlinenumbering\fi}} +\unexpanded\def\dolinenumberattributes#1#2% + {\dousestyleparameter{\linenumberparameter#1}% + \dousecolorparameter{\linenumberparameter#2}} \setuplinenumbering [\c!conversion=\v!numbers, @@ -459,11 +462,11 @@ \ifconditional\faketextlinenumber % we need to reserve space \else - \linenumberattributes\c!style\c!color - {\linenumberparameter\c!command - {\linenumberparameter\c!left - \convertnumber{\linenumberparameter\c!conversion}{#3}% - \linenumberparameter\c!right}}% + \dolinenumberattributes\c!style\c!color + \linenumberparameter\c!command + {\linenumberparameter\c!left + \convertnumber{\linenumberparameter\c!conversion}{#3}% + \linenumberparameter\c!right}% \fi \ifcase\linenumberlocation \hss % middle diff --git a/tex/context/base/page-mak.mkvi b/tex/context/base/page-mak.mkvi index 114a84734..e4899f948 100644 --- a/tex/context/base/page-mak.mkvi +++ b/tex/context/base/page-mak.mkvi @@ -99,7 +99,7 @@ \forgetall % else indented flush \dontcomplain \global\setbox\page_makeup_box\vbox to \makeupparameter\c!height \bgroup - \dosetmakeupattributes\c!style\c!color + \usemakeupstyleandcolor\c!style\c!color \hsize\makeupparameter\c!width \setupalign[\makeupparameter\c!align]% \doprocesslocalsetups{\makeupparameter\c!setups}% lua(..),xml(...,..),tex(..) @@ -107,30 +107,10 @@ \let\stopmakeup\page_makeup_stop_yes} \unexpanded\def\page_makeup_stop_yes - {\endgraf - \makeupparameter\c!bottom - \egroup - \ifprocessingpages % this will be redone anyway (is this needed at all?) - \ifpageselected - \page_makeup_flush_box - \else - \page_makeup_wipe_box - \fi - \else - \ifpageselected - \page_makeup_wipe_box - \else - \page_makeup_flush_box - \fi - \fi - \ifselectingpages - \global\pageselectedfalse - \fi + {\endgraf + \makeupparameter\c!bottom \egroup - \stoplayout} % includes \page - -\def\page_makeup_flush_box - {\pushpagestate % new + \pushpagestate % new \makeupparameter\c!before \relax % to be sure we don't enter the \if \ifdim\ht\page_makeup_box>\vsize @@ -145,10 +125,9 @@ \ifdoublesided \ifodd\realpageno \else \getvalue{\??do::\c!doublesided::\makeupparameter\c!doublesided}% \fi \fi - \poppagestate} % new - -\def\page_makeup_wipe_box - {\global\box\page_makeup_box\emptybox} + \poppagestate % new + \egroup + \stoplayout} % includes \page \setvalue{\??do::\c!doublesided::\v!yes}% {\emptyhbox @@ -171,8 +150,6 @@ \setuptext [\c!state=\makeupparameter\c!textstate]% \setupbottom[\c!state=\makeupparameter\c!bottomstate]% \setuptop [\c!state=\makeupparameter\c!topstate]% - % this is needed, but no \setuplayout here; fails in texexec --fig=c - %\recalculatelayout \to \page_makeup_every_setup %D The standard page template is defined as follows: @@ -220,6 +197,10 @@ [\v!page] [] +\definemakeup + [\v!middle] + [\v!standard] + % \definelayout[standard] % \definelayout[text] diff --git a/tex/context/base/page-mar.mkiv b/tex/context/base/page-mar.mkiv index 7a091c485..07296f832 100644 --- a/tex/context/base/page-mar.mkiv +++ b/tex/context/base/page-mar.mkiv @@ -291,13 +291,13 @@ {\decrement\margincontentlines \dorecurse\margincontentlines{\savedstrut\endgraf\nointerlineskip}% ! savedstrut \@@imbefore - \dostartattributes{\??im\margincontenttag}\c!style\c!color\empty - \dosetupstrut[\margincontentstrut]% was: \setstrut % yes or no - \dostarttagged\t!margintextblock\currentmargincontent % margincontenttag - \begstrut#3\endstrut\endgraf - \dostoptagged - \xdef\margincontentstrutheight{\the\strutht}% so that it's known outside the framed - \dostopattributes + \dousestylehashparameter{\??im\margincontenttag}\c!style + \dousecolorhashparameter{\??im\margincontenttag}\c!color + \dosetupstrut[\margincontentstrut]% was: \setstrut % yes or no + \dostarttagged\t!margintextblock\currentmargincontent % margincontenttag + \begstrut#3\endstrut\endgraf + \dostoptagged + \xdef\margincontentstrutheight{\the\strutht}% so that it's known outside the framed \@@imafter}% \global \naturalmargincontentheight\ht\scratchbox \global\advance\naturalmargincontentheight\dp\scratchbox diff --git a/tex/context/base/page-mbk.mkvi b/tex/context/base/page-mbk.mkvi index 24f0913b8..7e13bb1b1 100644 --- a/tex/context/base/page-mbk.mkvi +++ b/tex/context/base/page-mbk.mkvi @@ -90,7 +90,7 @@ \marginblockparameter\c!inbetween \fi \setupalign[\marginblockparameter\c!align]% - \dosetfloatcaptionattributes\c!style\c!color + \usemarginblockstyleandcolor\c!style\c!color \begstrut \ignorespaces} @@ -104,7 +104,7 @@ {\showmessage\m!layouts5\empty \marginblockparameter\c!before \bgroup - \dosetfloatcaptionattributes\c!style\c!color} + \usemarginblockstyleandcolor\c!style\c!color} \def\stop_margin_block_nop {\egroup diff --git a/tex/context/base/page-mis.lua b/tex/context/base/page-mis.lua index d32eb8a00..d220d0a9e 100644 --- a/tex/context/base/page-mis.lua +++ b/tex/context/base/page-mis.lua @@ -31,7 +31,7 @@ local function setnextpage() elseif n > 0 then -- upcoming page (realpageno) end - tex.setcount("global","postponed_page_blocks_next_page",n) + tex.setcount("global","page_postponed_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 5ab96f0f8..507ab9a2b 100644 --- a/tex/context/base/page-mis.mkiv +++ b/tex/context/base/page-mis.mkiv @@ -45,24 +45,24 @@ %D we keep a local cache, especially as we can flush per page. \newif \ifinpostponing % prevents nesting -\newcount\postponed_page_blocks_next_page % set at the lua end +\newcount\page_postponed_blocks_next_page % set at the lua end \unexpanded\setvalue{\e!start\v!postponing}% {\bgroup \obeylines - \doifnextoptionalelse{\egroup\postponed_page_block_start}{\egroup\postponed_page_block_start[0]}} + \doifnextoptionalelse{\egroup\page_postponed_blocks_start}{\egroup\page_postponed_blocks_start[0]}} \unexpanded\setvalue{\e!stop\v!postponing}% {\ctxcommand{registerpostponedblock("\currentpostponedpage")}\relax} -\def\postponed_page_block_start[#1]% +\def\page_postponed_blocks_start[#1]% {\edef\currentpostponedpage{#1}% \dostartbuffer[postponedblock][\e!start\v!postponing][\e!stop\v!postponing]} % officially we should flush again after a flush as there can be new future pages % but that will be looked into when we run into it -\unexpanded\def\postponed_page_block_flush +\unexpanded\def\page_postponed_blocks_flush {\bgroup \inpostponingtrue % for old times sake \global\pagetotal\zeropoint % here? still needed? (was after flush pagefloats) @@ -76,28 +76,28 @@ \doflushfloats % new but potential dangerous, maybe we need a classification \egroup} % of blocks: with and without flush -\def\doflushpostponedblocks +\def\page_postponed_blocks_flush_indeed {\ifinpostponing % probably a nested flush - \else\ifnum\postponed_page_blocks_next_page=\zerocount + \else\ifnum\page_postponed_blocks_next_page=\zerocount % nothing in cache - \else\ifnum\postponed_page_blocks_next_page<\zerocount + \else\ifnum\page_postponed_blocks_next_page<\zerocount % generic cache - \postponed_page_block_flush - \else\ifnum\postponed_page_blocks_next_page>\realpageno + \page_postponed_blocks_flush + \else\ifnum\page_postponed_blocks_next_page>\realpageno % future content \else % pending content - \postponed_page_block_flush + \page_postponed_blocks_flush \fi\fi\fi\fi} -\def\doflushpostponedcontent % called in page-one - {\bgroup +\def\page_postponed_blocks_flush + {\begingroup \setsystemmode\v!postponing \the\everytopofpage %\flushrestfloats \doflushpagefloats - \doflushpostponedblocks - \egroup} + \page_postponed_blocks_flush_indeed + \endgroup} \protect \endinput diff --git a/tex/context/base/page-mrk.mkiv b/tex/context/base/page-mrk.mkiv index babf7f776..d1552dcfd 100644 --- a/tex/context/base/page-mrk.mkiv +++ b/tex/context/base/page-mrk.mkiv @@ -51,7 +51,7 @@ \stopuseMPgraphic \def\page_marks_add_color - {\setlayoutcomponentattribute\v!print\v!color + {\setlayoutcomponentattribute{\v!print:\v!color}% \setbox\scratchbox\hbox \layoutcomponentboxattribute\bgroup \uniqueMPgraphic {print:color}% @@ -62,7 +62,7 @@ \hskip-\scratchwidth\box\scratchbox} \def\page_marks_add_marking - {\setlayoutcomponentattribute\v!print\v!marking + {\setlayoutcomponentattribute{\v!print:\v!marking}% \setbox\scratchbox\hbox \layoutcomponentboxattribute\bgroup \uniqueMPgraphic {print:marking}% @@ -73,7 +73,7 @@ \hskip-\scratchwidth\box\scratchbox} \def\page_marks_add_lines - {\setlayoutcomponentattribute\v!print\v!lines + {\setlayoutcomponentattribute{\v!print:\v!lines}% \setbox\scratchbox\hbox \layoutcomponentboxattribute\bgroup \uniqueMPgraphic {print:lines}% @@ -85,7 +85,7 @@ \hskip-\scratchwidth\box\scratchbox} \def\page_marks_add_number - {\setlayoutcomponentattribute\v!print\v!number + {\setlayoutcomponentattribute{\v!print:\v!number}% \setbox\scratchbox\hbox \layoutcomponentboxattribute\bgroup \useMPgraphic {print:number}% @@ -194,70 +194,3 @@ [\c!marking=\v!off] \protect \endinput - -% We keep the old code for while. - -% \def\pagecutmarksymbol {\the\realpageno} -% \def\pagecutmarklength {.5cm} -% \let\pagecutmarktoptext \empty -% \let\pagecutmarkbottomtext \empty -% \def\pagecutmarkoffset {.5\dimexpr\pagecutmarklength\relax} -% -% \def\extrapagecutmarkbottomtext -% {\rlap{\jobname}\hfill\currentdate\space-\space\currenttime\hfill\llap{\realfolio}} -% -% \def\makepagecutbox % #1 -% {\let\cutmarksymbol \pagecutmarksymbol -% \let\cutmarklength \pagecutmarklength -% \let\cutmarktoptext \pagecutmarktoptext -% \let\cutmarkbottomtext\pagecutmarkbottomtext -% \let\cutmarkhoffset \pagecutmarkoffset -% \let\cutmarkvoffset \pagecutmarkoffset -% \makecutbox} -% -% \newcount\currentpagebox % will be used in more places -% -% \def\installpagecutmark #1#2{\setvalue{\??ly:n:\c!marking:#1}{#2}} -% \def\installpagecolormark#1#2{\setvalue{\??ly:c:\c!marking:#1}{#2}} -% -% % \def\addpagecolormarks{\expandcheckedcsname{\??ly:c:\c!marking:}{\layoutparameter\c!marking}\s!unknown} -% % \def\addpagecutmarks {\expandcheckedcsname{\??ly:n:\c!marking:}{\layoutparameter\c!marking}\s!unknown} -% -% \def\addpagecutmarks#1% only at outer when nx/ny > 0 -% {\ifcsname\??ly:n:\c!marking:\layoutparameter\c!marking\endcsname -% \currentpagebox#1\relax -% \csname\??ly:n:\c!marking:\layoutparameter\c!marking\endcsname -% \fi} -% -% \def\addpagecolormarks#1% -% {\ifcsname\??ly:c:\c!marking:\layoutparameter\c!marking\endcsname -% \currentpagebox#1\relax -% \ifnum\horizontalcutmarks>\plustwo \def\colormarkoffset{\plusfour}\fi -% \ifnum\verticalcutmarks >\plustwo \def\colormarkoffset{\plusfour}\fi -% \csname\??ly:c:\c!marking:\layoutparameter\c!marking\endcsname -% \fi} -% -% \installpagecutmark\v!on -% {\makepagecutbox\currentpagebox} -% -% \installpagecutmark\v!page -% {\makepagecutbox\currentpagebox} -% -% \installpagecutmark\v!empty -% {\let\pagecutmarksymbol\empty -% \let\pagecutmarktoptext\empty -% \let\pagecutmarkbottomtext\empty -% \makepagecutbox\currentpagebox} -% -% \installpagecutmark\v!text -% {\let\pagecutmarksymbol\empty -% \let\pagecutmarkbottomtext\extrapagecutmarkbottomtext -% \makepagecutbox\currentpagebox} -% -% \installpagecolormark\v!color -% {\makepagecutbox\currentpagebox % maybe move this elsewhere -% \colormarkbox\currentpagebox} -% -% \installpagecolormark\v!screen % obsolete (all \v!screen will be removed) -% {\makepagecutbox\currentpagebox % maybe move this elsewhere -% \rastermarkbox\currentpagebox} diff --git a/tex/context/base/page-mul.mkiv b/tex/context/base/page-mul.mkiv index 5dfe47c3d..f00dec89b 100644 --- a/tex/context/base/page-mul.mkiv +++ b/tex/context/base/page-mul.mkiv @@ -43,21 +43,13 @@ \newtoks \OTRMULoutput \def\OTRMULgotonextpage - {\ejectpage} + {\page_otr_eject_page} \def\OTRMULgotonextpageX % will become obsolete - {\superejectpage} + {\page_otr_eject_page_and_flush_inserts} % check \count<insert> multiplications -% some day try this in balancing routine -% -% \ifdim\pagetotal>\pagegoal -% \eject -% \else -% \goodbreak -% \fi - %D The following macro's implement a multi||column output %D routine. The original implementation was based on Donald %D Knuth's implementation, which was adapted by Craig Platt to @@ -229,7 +221,8 @@ %D always work. \def\ejectcolumn - {\goodbreak\showmessage\m!columns2\empty} + {\goodbreak + \showmessage\m!columns2\empty} %D The next macro should never be called so let's deal with it. %D There were several solutions to these kind of errors. First @@ -445,16 +438,16 @@ \global\singlecolumnout\output % hm %\global\output{\global\setbox\precolumnbox\vbox{\unvbox\normalpagebox}}% %\global\output{\global\setbox\precolumnbox\vbox{\dotopinsertions\unvbox\normalpagebox}}% - \setoutputroutine{\global\setbox\precolumnbox\vbox{\dotopinsertions\unvbox\normalpagebox}}% - \eject % no \holdinginserts=1, can make footnote disappear ! + \page_otf_set_engine_output_routine{\global\setbox\precolumnbox\vbox{\dotopinsertions\unvbox\normalpagebox}}% + \page_otr_trigger_output_routine % no \holdinginserts=1, can make footnote disappear ! \global\precolumnboxheight\ht\precolumnbox %\global\output{\continuousmulticolumnsout}% - \setoutputroutine{\continuousmulticolumnsout}% + \page_otf_set_engine_output_routine{\continuousmulticolumnsout}% \setcolumnfloats \dohandleallcolumns {\global\setbox\currenttopcolumnbox\emptybox}% \checkbegincolumnfootnotes - \activateotr{MUL}{ONE}% todo ! ! ! ! + \page_otr_activate{MUL}{ONE}% todo ! ! ! ! \let\sethsize\setcolumnhsize \let\setvsize\setcolumnvsize \sethsize @@ -495,20 +488,18 @@ \ifbalancecolumns \ifnum\multicolumnendsyncmethod=\plusone %\global\output{\continuousmulticolumnsout}% - \setoutputroutine{\continuousmulticolumnsout}% + \page_otf_set_engine_output_routine{\continuousmulticolumnsout}% \goodbreak \fi %\global\output{\balancedmulticolumnsout}% - \setoutputroutine{\balancedmulticolumnsout}% + \page_otf_set_engine_output_routine{\balancedmulticolumnsout}% \else \goodbreak \fi - \eject % the prevdepth is important, try e.g. toclist in + \page_otr_trigger_output_routine % the prevdepth is important, try e.g. toclist in \prevdepth\zeropoint % columns before some noncolumned text text - %\global\output\singlecolumnout - \setoutputroutine{\singlecolumnout}% - %\global\output{\the\mainoutput}% % % % % todo - \setoutputroutine{\the\mainoutput}% % % % % todo + \page_otf_set_engine_output_routine{\singlecolumnout}% + \page_otf_set_engine_output_routine{\page_otr_triggered_output_routine}% \ifvoid\precolumnbox\else \unvbox\precolumnbox \fi @@ -605,7 +596,7 @@ \dohandleallcolumns {\mkprocesscolumncontents\currentcolumnbox}% \dohandleallcolumns - {\docolumnpagebodymarks\plusone\nofcolumns\mofcolumns\currentcolumnbox}% + {\page_marks_synchronize_column\plusone\nofcolumns\mofcolumns\currentcolumnbox}% \postprocesscolumns \dohandleallcolumns % \hbox i.v.m. \showcomposition {\global\setbox\currentcolumnbox\hbox to \localcolumnwidth @@ -715,8 +706,12 @@ \vskip-\scratchdimen}% \scratchdimen\noflines\openlineheight \advance\scratchdimen-\openstrutdepth +\ifgridsnapping + % quick hack (at least it works with itemize) +\else \advance\scratchdimen-\openlineheight \advance\scratchdimen\topskip +\fi \ht\columnpagebox\scratchdimen \dp\columnpagebox\openstrutdepth % end of mess @@ -1165,7 +1160,7 @@ \global\setbox\firstcolumnbox\vbox{\unvbox0}% \fi %\global\output{\balancingerror}% - \setoutputroutine{\balancingerror}% + \page_otf_set_engine_output_routine{\balancingerror}% \b@selinebottomtrue % forces depth in separation rule \flushcolumnedpage\plusone \multicolumnseject @@ -1173,7 +1168,7 @@ \def\multicolumnseject {%\ifdim\pagetotal>\textheight - % \eject % new, but wrong as fails on mixed-001.tex (wrong pagetotal at this point) + % \page_otr_trigger_output_routine % new, but wrong as fails on mixed-001.tex (wrong pagetotal at this point) %\else \allowbreak }%\fi} diff --git a/tex/context/base/page-one.mkiv b/tex/context/base/page-one.mkiv index b1ee82302..cc65a7267 100644 --- a/tex/context/base/page-one.mkiv +++ b/tex/context/base/page-one.mkiv @@ -20,15 +20,15 @@ % OTRONE: basic single column -\activateotr{ONE}{} % the default one +\page_otr_activate{ONE}\empty % the default otr \newtoks\OTRONEoutput \def\OTRONEgotonextpage - {\ejectpage} + {\page_otr_eject_page} \def\OTRONEgotonextpageX % will become obsolete - {\superejectpage} + {\page_otr_eject_page_and_flush_inserts} \def\OTRONEsethsize {\global\hsize\textwidth} @@ -61,10 +61,10 @@ \fi \fi} -% can we avoind the extra vboxing here? +% can we avoid the extra vboxing here? -\def\OTRONEregisteredtextarea#1% - {\ifregistertextareas +\def\OTRONEregisteredtextarea#1% obsolete + {\ifconditional\c_page_areas_enabled \setbox0\vbox{#1}% \wd0\makeupwidth % somehow a space creeps in \vbox{\registeredtextarea000}% @@ -72,115 +72,109 @@ #1% \fi} -\def\doOTRONEregisteredtextareaA#1% - {\ifregistertextareas - \xypos{pbd:\realfolio:b}% we could save bytes by only saving the y - \endgraf - \begingroup - \scratchdimen\dimexpr\MPy{pbd:\realfolio:b}-\MPy{pbd:\realfolio:e}\relax - \setbox\scratchbox\emptyhbox - \wd\scratchbox\makeupwidth - \ht\scratchbox\scratchdimen - \vsmash{\registeredtextarea00\scratchbox}% - \endgroup - #1% - \endgraf - \xypos{pbd:\realfolio:e}% +% 1 = partial page, 2 = whole page, 3 = partial page + +\setnewconstant\kindofpagetextareas\plustwo + +\def\OTRONEregisteredtextareaA + {\ifconditional\c_page_areas_enabled + \expandafter\OTRONEregisteredtextareaAindeed \else - #1% + \expandafter\firstofoneargument \fi} -\def\doOTRONEregisteredtextareaB#1% - {\ifregistertextareas - \setbox0\vbox{#1}% - \wd0\makeupwidth % somehow a space creeps in - \vbox{\registeredtextarea000}% +\def\OTRONEregisteredtextareaB + {\ifconditional\c_page_areas_enabled + \expandafter\OTRONEregisteredtextareaBindeed \else - #1% + \expandafter\firstofoneargument \fi} -\let\OTRONEregisteredtextareaA\firstofoneargument -\let\OTRONEregisteredtextareaB\firstofoneargument - -% 1 = partial page, 2 = whole page, 3 = partial page - -\setnewconstant\kindofpagetextareas\plustwo +\def\OTRONEregisteredtextareaAindeed + {\ifcase\kindofpagetextareas + \expandafter\firstofoneargument + \or % partial page (experimental) + \expandafter\page_areas_register_direct + \or % whole page (default) + \expandafter\firstofoneargument + \or % partial page (only works well with no stretch!) + \expandafter\page_areas_register_boxed + \fi} -\def\OTRONEdopagecontents#1#2% \box<n> \unvbox<n> - {\bgroup % niet breedte zetten, kan fractie zijn! - % - \donetrue\processnotes{\dochecknote\ifbottomnotes\else\donefalse\fi}% - \ifcase\kindofpagetextareas +\def\OTRONEregisteredtextareaBindeed + {\ifcase\kindofpagetextareas + \expandafter\firstofoneargument \or % partial page (experimental) - \let\OTRONEregisteredtextareaA\doOTRONEregisteredtextareaA + \expandafter\firstofoneargument \or % whole page (default) - \let\OTRONEregisteredtextareaB\doOTRONEregisteredtextareaB + \expandafter\page_areas_register_boxed \or % partial page (only works well with no stretch!) - \let\OTRONEregisteredtextareaA\doOTRONEregisteredtextareaB - \fi - % - \setbox0\vbox \ifdone to \textheight \fi - {\edef\currentpagedepth{\the\dp#2}% still to be derived from #1 + \expandafter\firstofoneargument + \fi} + +\newdimen\d_page_one_natural_depth + +\def\OTRONEdopagecontents#1#2% \box<n> \unvbox<n> % this one will be redone (checked) + {\bgroup + \notes_check_if_bottom_present + \setbox0\vbox \ifconditional\c_notes_bottom_present to \textheight \fi + {\d_page_one_natural_depth\dp#2\relax \dotopinsertions + \OTRONEregisteredtextareaA{#1#2}% \ifgridsnapping - \OTRONEregisteredtextareaA{#1#2}% - \vskip-\currentpagedepth\vskip\openstrutdepth + \vskip\dimexpr\openstrutdepth-\d_page_one_natural_depth\relax \prevdepth\openstrutdepth \dobotinsertions \vfil \else\ifr@ggedbottom - \OTRONEregisteredtextareaA{#1#2}% - \vskip-\currentpagedepth\vskip\openstrutdepth + \vskip\dimexpr\openstrutdepth-\d_page_one_natural_depth\relax \prevdepth\openstrutdepth \dobotinsertions \vfil \else\ifb@selinebottom - \OTRONEregisteredtextareaA{#1#2}% - \kern-\currentpagedepth\kern\maxdepth + \kern\dimexpr\maxdepth-\d_page_one_natural_depth\relax \dobotinsertions \else - \OTRONEregisteredtextareaA{#1#2}% - \dobotinsertions % added + \dobotinsertions \fi\fi\fi - \fakepagenotes}% was \fakenotes, but wrong! (check with \setupalign[height]) - % we could use the local snapper hier - \ifdone + \fakepagenotes}% + \ifconditional\c_notes_bottom_present \ifgridsnapping - \ifcase\layoutlines % todo: make macro of this + \ifcase\layoutlines \getrawnoflines\textheight \else \noflines\layoutlines - \fi - \advance\noflines \minusone - \scratchdimen\noflines\lineheight - \advance\scratchdimen \topskip + \fi + \advance\noflines\minusone + \scratchoffset\dimexpr\noflines\lineheight+\topskip\relax \else - \scratchdimen\ht0 + \scratchoffset\ht0 \fi \else - \scratchdimen\zeropoint + \scratchoffset\zeropoint \fi - % \setbox2\hbox - {\checksinglecolumnfootnotes - \lower\scratchdimen + {\checksinglecolumnfootnotes % why this check? + \lower\scratchoffset \vbox{\placebottomnotes}}% \smashbox2% % needed here - \ifdone - \ht0\zeropoint - \fi \OTRONEregisteredtextareaB {\vbox to \textheight - {\box0 - \box2 - \ifdone \else\vfill\fi}}% + {\ifconditional\c_notes_bottom_present + \ht0\zeropoint + \box0 + \box2 + \else + \box0 + \box2 + \vfill + \fi}}% \egroup} \def\OTRONEfinalsidefloatoutput {\finaloutput\unvbox\normalpagebox} -\OTRONEoutput - {\sidefloatoutput} +\OTRONEoutput{\page_sides_output_routine} % this will become a command %D Insertions @@ -197,7 +191,7 @@ \ifdim\totaltopinserted>\zeropoint\relax \ifdim\dimexpr\rootfloatparameter\c!nlines\lineheight+\totaltopinserted\relax>\textheight \showmessage\m!floatblocks8{\rootfloatparameter\c!nlines}% - \vfilll\eject + \page_otr_fill_and_eject_page % was tripple: vfilll \fi \fi \fi @@ -429,48 +423,8 @@ \doinsertfloatinfo \dohandlenextfloatindent} -% \def\OTRONEsomefixdfloat % [#1] -% {\docheckiffloatfits -% \ifroomforfloat\else -% \goodbreak -% \fi -% \showmessage\m!floatblocks9\empty -% \someherefloat} % [#1] -% -% better: -% -% \dorecurse{50} -% {[before normal] \input thuan -% \placefigure{normal}{\framed[height=1cm,width=8cm]{}} -% \placefigure{normal}{\framed[height=2cm,width=8cm]{}} -% [before force] \input thuan -% \placefigure[force]{force}{\framed[height=8cm,width=8cm]{}}} - \setnewconstant\fixedfloatmethod\plusthree -% \def\OTRONEsomefixdfloat % [#1] -% {\docheckiffloatfits -% \ifroomforfloat\else -% \ifzeropt\pagetotal -% % let's assume that there is room -% \else -% \ifcase\fixedfloatmethod -% % disabled -% \or % 1 (old method) -% \goodbreak -% \or % 2 (safe method) -% \page -% \or % 3 (keeps in stream) -% \vskip\textheight -% \vskip-\textheight -% \or % 4 (also keeps in place) -% \dosomebreak\nobreak -% \fi -% \fi -% \fi -% \showmessage\m!floatblocks9\empty -% \someherefloat} % [#1] - \def\OTRONEsomefixdfloat % [#1] {% there is (in mkii) no good way to prevent a break % so better fail than mess, we can get loose from @@ -483,8 +437,6 @@ \someelsefloat[\v!here]% \else %\checkwaitingfloats{#1}% - \def\logsidefloat - {\doinsertfloatinfo}% \setbox\floatbox\vbox{\box\floatbox}% \wd\floatbox\floatwidth \processfirstactioninset diff --git a/tex/context/base/page-par.mkiv b/tex/context/base/page-par.mkiv index e1096fdf8..26e306ef5 100644 --- a/tex/context/base/page-par.mkiv +++ b/tex/context/base/page-par.mkiv @@ -34,7 +34,10 @@ \def\dodoshowparagraphnumber {\global\advance\internalparagraphnumber \plusone \inleftmargin % \tf normalizes em - {\tf{\doattributes\??ph\c!style\c!color{\the\internalparagraphnumber}}% + {\tf + \dousestyleparameter\@phstyle + \dousecolorparameter\@phcolor + \the\internalparagraphnumber \kern\@@phdistance}} \def\doshowparagraphnumberA diff --git a/tex/context/base/page-plg.mkiv b/tex/context/base/page-plg.mkiv index d008dfb1d..0921682c4 100644 --- a/tex/context/base/page-plg.mkiv +++ b/tex/context/base/page-plg.mkiv @@ -11,7 +11,7 @@ %C therefore copyrighted by \PRAGMA. See mreadme.pdf for %C details. -\ifx\pageareabox\undefined \else \endinput \fi +% \ifx\pageareabox\undefined \else \endinput \fi \writestatus{loading}{ConTeXt Page Macros / Extra Page Building} @@ -110,7 +110,7 @@ \unprotect -\def\constructmakeuppagecontent#1#2% +\def\page_boxes_construct_content_makeup#1#2% {\setbox\pagebox\hbox {\vbox to \textheight {\offinterlineskip @@ -137,40 +137,39 @@ \ht\pagebox\paperheight \dp\pagebox\zeropoint} -\installlayoutalternative\v!makeup - {\constructmakeuppagecontent} +\installlayoutalternative\v!makeup{\page_boxes_construct_content_makeup} \newbox\pageareabox \def\pagearea - {\dotripleempty\dopagearea} + {\dotripleempty\page_area} -\def\dopagearea[#1][#2][#3]% +\def\page_area[#1][#2][#3]% {\ifthirdargument \doifelse{#3}\v!left - {\dodopagearea{#1}{#2}\c!lefttext} + {\page_area_indeed{#1}{#2}\c!lefttext} {\doifelse{#3}\v!right - {\dodopagearea{#1}{#2}\c!righttext} - {\dodopagearea{#1}{#2}\c!middletext}}% + {\page_area_indeed{#1}{#2}\c!righttext} + {\page_area_indeed{#1}{#2}\c!middletext}}% \else\ifsecondargument \doifbothsidesoverruled - {\dodopagearea{#1}{#2}\c!righttext} - {\dodopagearea{#1}{#2}\c!righttext} - {\dodopagearea{#1}{#2}\c!lefttext }% + {\page_area_indeed{#1}{#2}\c!righttext} + {\page_area_indeed{#1}{#2}\c!righttext} + {\page_area_indeed{#1}{#2}\c!lefttext }% \else \doif{#1}\v!text % copy due to trial runs in TABLE {\iftrialtypesetting \copy\pagebox \else \localpositioningfalse - \addtextbackground\pagebox - \addtextgridlayer\pagebox + \page_backgrounds_add_to_text\pagebox + \page_grids_add_to_box\pagebox \box\pagebox \fi}% \fi\fi} -\def\dodopagearea#1#2#3% - {\setbox\pageareabox\vbox{\getvalue{\??tk#1#2#3}}% +\def\page_area_indeed#1#2#3% + {\setbox\pageareabox\vbox{\getspecificlayouttext{#1}{#2}{#3}}% \ifsomebackgroundfound{#1#2}% \iftrialtypesetting \box\pageareabox @@ -188,13 +187,18 @@ % to be done nicely (proper namespacing) -\setvalue{\??ly\c!method:\v!leftpage }{\getvalue{\??ly\c!method:\v!page}} -\setvalue{\??ly\c!method:\v!rightpage}{\getvalue{\??ly\c!method:\v!page}} +\setvalue{\??ly:m:\v!leftpage }{\csname\??ly:m:\v!page\endcsname} +\setvalue{\??ly:m:\v!rightpage}{\csname\??ly:m:\v!page\endcsname} -\long\unexpanded\def\startpagelayout - {\bgroup\catcode\endoflineasciicode\ignorecatcode\dostartpagelayout} +\unexpanded\def\startpagelayout + {\bgroup + \catcode\endoflineasciicode\ignorecatcode + \start_page_layout} -\long\def\dostartpagelayout[#1]#2\stoppagelayout - {\egroup\long\setvalue{\??ly\c!method:#1}{#2}} +\let\stoppagelayout\relax + +\def\start_page_layout[#1]#2\stoppagelayout + {\egroup + \setvalue{\??ly:m:#1}{#2}} \protect \endinput diff --git a/tex/context/base/page-set.mkiv b/tex/context/base/page-set.mkiv index 0796dbb2b..9777e433b 100644 --- a/tex/context/base/page-set.mkiv +++ b/tex/context/base/page-set.mkiv @@ -437,7 +437,7 @@ \vss \fi}% \wd\scratchbox\localcolumnwidth % \textwidth - \docolumnpagebodymarks{#1}{#2}\recurselevel\scratchbox + \page_marks_synchronize_column{#1}{#2}\recurselevel\scratchbox \ifcase\columndirection \hskip\OTRSETgetparameter\c!distance\recurselevel\box\scratchbox \else @@ -572,7 +572,8 @@ \def\OTRSETsetvsize % snap per sectie (gap here?) {\ifcollectingcontent \else % can be assigndimen -\OTRSETskipstart % not that well tested + \OTRSETsetcolumnmaxcells % layout can be changed + \OTRSETskipstart % not that well tested \OTRSETcheckinsert % added \OTRSETsetfreecells\mofcolumns\columnfirstcell \ifsomefreecolumncells @@ -625,8 +626,8 @@ % \egroup % \fi % % brrr: -% \ejectinsert -% \ejectpage +% \page_otr_flush_all_floats +% \page_otr_eject_page % \OTRSETsynchronizehsize} % no \OTRSETsethsize, can be mid smaller (like tabulate) % % \installcolumnbreakhandler {SET} \v!forceer @@ -654,8 +655,8 @@ \installcolumnbreakhandler {SET} \v!local {\OTRSETcolumnhbreak - \ejectinsert - \ejectpage % brrr + \page_otr_flush_all_floats + \page_otr_eject_page % no \OTRSETsethsize, can be mid smaller (like tabulate) % also, this one should be executed at the outer level % (setting hsize inside otr does not work) @@ -670,8 +671,8 @@ {\OTRSETcolumnhbreak \edef\savedmofcolumns{\the\mofcolumns}% \edef\savedrealpageno{\the\realpageno}% - \ejectinsert - \ejectpage % brrr + \page_otr_flush_all_floats + \page_otr_eject_page \doloop {\ifnum\savedmofcolumns=\mofcolumns \ifnum\savedrealpageno=\realpageno @@ -688,14 +689,14 @@ {\expanded{\OTRSETgotocolumn[\@@columnspecification]}} \installcolumnbreakhandler {SET} \v!page - {\vfill\eject % \doejectpage\eject + {\page_otr_fill_and_eject_page \OTRSETgotonextpage} \newtoks\OTRSETeverystartofcolumn \newbox\OTRSETsavedfootnotes -% \installoutput\OTRSETflushtextsofar % spacing goes wrong +% \installoutputroutine\OTRSETflushtextsofar % spacing goes wrong %\def\OTRSETflushtextsofar % {\ifvoid\normalpagebox \else @@ -734,7 +735,7 @@ \newskip\lastskipinotr -\installoutput\doOTRSETflushtextsofar % experimental +\installoutputroutine\doOTRSETflushtextsofar % experimental {\ifvoid\normalpagebox\else \scratchdimen\dp\normalpagebox \setbox\scratchbox\vbox @@ -816,7 +817,7 @@ \doOTRSETsetgridcells {\copy\placeholderboxf} \mofcolumns\columnfirstcell\plusone\noflines - {\registeredtextarea1\columnfirstcell\scratchbox}% == \hbox / tricky htcorr == \columnfirstcell + {\page_areas_registered_box1\columnfirstcell\scratchbox}% == \hbox / tricky htcorr == \columnfirstcell \global\columnlastcell\columnfirstcell \global\advance\columnlastcell \noflines \global\lastcolumnlastcell\columnlastcell @@ -1489,7 +1490,7 @@ \definecolumnset[\s!default][\c!n=2] % fallback \def\OTRSETgotonextpage - {\vfill\eject + {\page_otr_fill_and_eject_page \relax\ifnum\mofcolumns>\plusone \OTRSETgotocolumn[\v!last]% \ifnum\mofcolumns>\plusone @@ -1515,7 +1516,7 @@ \def\doOTRSETgotoCOLUMN#1% {\ifnum\mofcolumns=#1\else - \vfill\eject % \doejectpage\eject + \page_otr_fill_and_eject_page \doloop {\ifnum\mofcolumns=#1\relax \exitloop \else \OTRSETdummycolumn @@ -1594,8 +1595,7 @@ \def\OTRSETdummycolumn {\verticalstrut \vskip-\struttotal - \vfill - \eject} + \page_otr_fill_and_eject_page} \newcounter\columnsetlevel \let\currentcolumnset\empty @@ -1615,7 +1615,7 @@ \globallet\columnsetpage\!!plusone \def\currentcolumnset{#2}% \insidecolumnstrue % will be different flag in addition - \activateotr{SET}{ONE}% andere naam, activate or so + \page_otr_activate{SET}{ONE}% andere naam, activate or so \doifelsenothing{#1} {\globallet\OTRSETlist\s!default} {\xdef\OTRSETlist{#1}}% @@ -1719,7 +1719,7 @@ % inhibit flush of floats ! % todo: nothing if no footnotes, else empty page \dostepwiserecurse\mofcolumns\nofcolumns\plusone - {\vskip-\struttotal\verticalstrut\vfill\eject}% + {\vskip-\struttotal\verticalstrut\page_otr_fill_and_eject_page}% \else \ifnum\mofcolumns>\plusone \donetrue @@ -1734,8 +1734,7 @@ \else % probably todo \fi - \vfill - \eject + \page_otr_fill_and_eject_page % brr, may result in empty page after nicely fit text % or if left, then lost of first column only text \ifnum\mofcolumns>\plusone @@ -1794,10 +1793,13 @@ \fi}% \OTRSETchecksidefloat} +\def\OTRSETsetcolumnmaxcells + {\getrawnoflines\textheight\xdef\columnmaxcells{\the\noflines}} + \def\OTRSETinitializefeatures {% number of lines % new: raw - \getrawnoflines\textheight\xdef\columnmaxcells{\the\noflines}% + \OTRSETsetcolumnmaxcells % direction \doifelsevalue{\??mc\OTRSETidentifier\c!direction}\v!right {\columndirection\zerocount} @@ -1823,7 +1825,7 @@ \ifx\lastskipinotr\undefined \newskip\lastskipinotr \fi -\installoutput\OTRSETflushpreposttext +\installoutputroutine\OTRSETflushpreposttext {\global\setbox\precolumnbox\vbox {\unvbox\normalpagebox \global\lastskipinotr\lastskip}% @@ -1907,7 +1909,7 @@ \ifcase\columnsetlevel\relax \mofcolumns\plusone \OTRSETinitializecolumns - \OTRSETassignwidths + \OTRSETassignwidths % already done \OTRSETsethsize \fi \!!counta#2\!!countb#3\docalculatecolumnsetspan @@ -2030,7 +2032,7 @@ \advance\dimen0 \totaltopinserted\relax \ifdim\dimen0>\textheight % \vsize %%%%%%%%% \textheight \showmessage\m!floatblocks8{\rootfloatparameter\c!nlines}% - \vfilll\eject + \page_otr_fill_and_eject_page % was triple: vfilll \fi \fi \fi diff --git a/tex/context/base/page-sid.mkiv b/tex/context/base/page-sid.mkiv index 8900608ab..efea19e70 100644 --- a/tex/context/base/page-sid.mkiv +++ b/tex/context/base/page-sid.mkiv @@ -15,24 +15,6 @@ \unprotect -% problem: when too small, side effects; we need to determine the -% shift earlier so that we can act when shift < size -% -% \definefloat[edgefigure] -% \setupfloat -% [edgefigure] -% [rightmargindistance=-\rightmargintotal, -% leftmargindistance=-\rightmargintotal, -% default=outer] -% \starttext -% \placeedgefigure{}{\framed[width=12cm]{}} \input tufte -% \placeedgefigure{}{\framed[width=5cm]{}} \input tufte -% \placeedgefigure{}{\framed[width=4cm]{}} \input tufte -% \placeedgefigure{}{\framed[width=2cm]{}} \input tufte -% \stoptext - -% todo: dimexpr an dnumexpr - % These macro deal with side floats. We started with Daniel % Comenetz macros as published in TUGBoat Volume 14 (1993), % No.\ 1: Anchored Figures at Either Margin. I extended and @@ -40,76 +22,67 @@ % messy module. Therefore, this module badly needs an update % because it's now a mixture of old and new macros. -% afhankelijke variabelen +% Interesting cases where it goes wrong: % -% \overgap vervangen door \floatsidetopskip -% \sidegap vervangen door \floatsideskip -% \undergap vervangen door \floatsidebottomskip +% \placefigure[left]{}{} \dorecurse{3}{\input ward } {\par} \input ward % -% \prskp vervangen door \ctxparskip +% Here we get an unwanted carried over hangindent and parindent. A +% solution is to associate it with the local par node instead. This +% is something to discuss with Taco as it could be a new luatex +% feature: explicitly set par properties. -% toegevoegde macro's/aanroepen -% -% \logsidefloat : loginformatie -% \flushsidefloats : nodig voor koppen +% Maybe I should just rewrite the lot. -% recente wijzigingen: -% -% namen aangepast: \float... enz. i.p.v. \pic - -% Pas op: \EveryPar{\EveryPar{}\margetitel{whatever}} -% \plaatsfiguur[links]{}{} moet goed gaan. In dat geval -% begint de tekst terecht wat lager. - -\newdimen\sidefloatheight % includes the topskip -\newdimen\sidefloatwidth -\newdimen\sidefloathsize -\newdimen\sidefloatshift -\newdimen\sidefloatextrashift -\newdimen\sidefloatvsize \def\nofloatvsize{-1pt } -\newdimen\sidefloatprogress -\newdimen\sidefloatpagetotal - -\newbox\floatbottom - -\newcount\sidefloatsidelines -\newcount\sidefloatlinesdone - -% 1 = backspace -% 2 = leftedge -% 3 = leftmargin -% 4 = leftside -% 5 = rightside -% 6 = rightmargin -% 7 = rightedge -% 8 = cutspace - -\newconstant\sidefloattype - -\def\backspacefloat {\global\sidefloattype1 \putsidefloat} -\def\leftedgefloat {\global\sidefloattype2 \putsidefloat} -\def\leftmarginfloat {\global\sidefloattype3 \putsidefloat} -\def\leftfloat {\global\sidefloattype4 \putsidefloat} -\def\rightfloat {\global\sidefloattype5 \putsidefloat} -\def\rightmarginfloat {\global\sidefloattype6 \putsidefloat} -\def\rightedgefloat {\global\sidefloattype7 \putsidefloat} -\def\cutspacefloat {\global\sidefloattype8 \putsidefloat} - -\let\marginfloat \cutspacefloat - -\newif\ifroomforfloat -\newif\iffloatshort -\newif\iffloatflag -\newif\iffloatrighteqo -\newif\iffloatlefteqo - -\newdimen\sidefloatleftskip -\newdimen\sidefloatrightskip -\newdimen\sidefloatmaximum - -\def\checksidefloatshift +\newdimen \d_page_sides_height % includes the topskip +\newdimen \d_page_sides_width +\newdimen \d_page_sides_hsize +\newdimen \d_page_sides_vsize +\newdimen \d_page_sides_vsize_reset \d_page_sides_vsize_reset -\onepoint % signal (could be a chardef) +\newdimen \d_page_sides_progress +\newdimen \d_page_sides_page_total +\newdimen \d_page_sides_saved_depth + +\newbox \b_page_sides_bottom + +\newcount \c_page_sides_lines_done +\newcount \c_page_sides_checks_done +\newcount \c_page_sides_n_of_lines +\newconstant \c_page_sides_float_type + +\newconditional \c_page_sides_short +\newconditional \c_page_sides_flag + +\newconditional \c_page_sides_r_eq % messy, needs checking anyway +\newconditional \c_page_sides_l_eq % messy, needs checking anyway + +\newif \ifroomforfloat % shared (will change) +\newif \iftracesidefloats % public (might change) + +\newdimen \sidefloatshift % public +\newdimen \sidefloatextrashift % public +\newdimen \sidefloatleftskip % public +\newdimen \sidefloatrightskip % public +\newdimen \sidefloatmaximum % public + +\def\backspacefloat {\global\c_page_sides_float_type\plusone \page_sides_handle_float} +\def\leftedgefloat {\global\c_page_sides_float_type\plustwo \page_sides_handle_float} +\def\leftmarginfloat {\global\c_page_sides_float_type\plusthree\page_sides_handle_float} +\def\leftfloat {\global\c_page_sides_float_type\plusfour \page_sides_handle_float} +\def\rightfloat {\global\c_page_sides_float_type\plusfive \page_sides_handle_float} +\def\rightmarginfloat{\global\c_page_sides_float_type\plussix \page_sides_handle_float} +\def\rightedgefloat {\global\c_page_sides_float_type\plusseven\page_sides_handle_float} +\def\cutspacefloat {\global\c_page_sides_float_type\pluseight\page_sides_handle_float} + +\let\marginfloat \cutspacefloat + +\let\logsidefloat \relax + +\def\page_sides_insert_info + {\doinsertfloatinfo} + +\def\page_sides_apply_horizontal_shift {\ifdim\sidefloatmaximum>\zeropoint - \ifcase\sidefloattype + \ifcase\c_page_sides_float_type % invalid \or % backspace @@ -148,12 +121,27 @@ \or % cutspace \fi + \fi + \ifdim\sidefloatshift=\zeropoint \relax + \ifnum\c_page_sides_float_type=\plusfour + \global\advance\sidefloatshift\sidefloatextrashift + \global\sidefloatextrashift\zeropoint + \else\ifnum\c_page_sides_float_type=\plusfive + \global\advance\sidefloatshift\sidefloatextrashift + \global\sidefloatextrashift\zeropoint + \fi\fi + \else + \ifnum\c_page_sides_float_type<\plusfour + \global\c_page_sides_float_type\plusfour + \else\ifnum\c_page_sides_float_type>\plusfive + \global\c_page_sides_float_type\plusfive + \fi\fi \fi} -\def\setsidefloatskips +\def\page_sides_set_skips {\global\sidefloatrightskip\zeropoint \global\sidefloatleftskip \zeropoint - \ifcase\sidefloattype + \ifcase\c_page_sides_float_type \or % backspace \global\sidefloatleftskip\dimexpr +\rightorleftpageaction \backspace \cutspace @@ -194,298 +182,229 @@ \ifdim\sidefloatrightskip>\zeropoint \doglobal\advance\sidefloatrightskip\rightskip \fi \ifdim\sidefloatleftskip >\zeropoint \doglobal\advance\sidefloatleftskip \leftskip \fi} -% eq is still crap - -\ifx\normalleqno\undefined - - \let\floatrighteqo=\eqno - \let\floatleftleqo=\leqno - -\else - - \let\floatrighteqo=\normaleqno - \let\floatleftleqo=\normalleqno - -\fi - -% Watch it even more! In inner, gaat't mis omdat daar -% pagetotal enz niet zijn aangepast. Inner kan overigens niet -% betrouwbaar worden getest! - -\newif\iftracesidefloats - -\def\flushsidefloats +\def\page_sides_flush_floats {\par - \!!heighta\sidefloatvsize - \advance\!!heighta -\pagetotal - \ifnum\!!heighta>\zeropoint - \global\advance\sidefloatvsize -\sidefloatbottomskip - \ifdim\!!heighta>\zeropoint - \bgroup - \let\flushsidefloats\relax - \forgetall - \doloop - {\strut - \iftracesidefloats - \color[darkgray]% - {\baselinerulefalse - \boxrulewidth.5\points - \ruledhbox{\strut\kern\sidefloatwidth}}% - \fi - \par - \!!heighta\sidefloatvsize - \advance\!!heighta -\pagetotal - \ifdim\!!heighta>\zeropoint - \ifnum\recurselevel>\plushundred - \exitloop - \fi - \else - \exitloop - \fi}% - \egroup - \ifdim\parskip>\zeropoint - \ifdim\sidefloatbottomskip>\parskip - \nowhitespace - \vskip\sidefloatbottomskip - \fi - \fi - \else\ifdim\sidefloatbottomskip>\parskip - \vskip\sidefloatbottomskip - \fi\fi + \ifnum\dimexpr\d_page_sides_vsize-\pagetotal\relax>\zeropoint + \page_sides_flush_floats_indeed \fi - % not entirely the same as \forgetsidefloats - \global\sidefloatvsize\nofloatvsize - % \global\sidefloatsidelines\zerocount % no, we flush before a side float - \global\floatshortfalse % so this will get lost % also here if used at all \global\holdinginserts\zerocount - \global\floatflagfalse} + \global\d_page_sides_vsize\d_page_sides_vsize_reset + \global\setfalse\c_page_sides_short + \global\setfalse\c_page_sides_flag} + +\def\page_sides_flush_floats_indeed + {\global\advance\d_page_sides_vsize-\sidefloatbottomskip + \begingroup + \let\page_sides_flush_floats\relax + \forgetall + \doloop + {\strut + \iftracesidefloats + \color[darkgray]% + {\baselinerulefalse + \boxrulewidth.5\points + \ruledhbox{\strut\kern\d_page_sides_width}}% + \fi + \par + \ifdim\dimexpr\d_page_sides_vsize-\pagetotal\relax>\zeropoint + \ifnum\recurselevel>\plushundred % safeguard, sort of deadcycles + \exitloop + \fi + \else + \exitloop + \fi}% + \endgroup + \ifdim\parskip>\zeropoint % why this test ? + \ifdim\sidefloatbottomskip>\parskip + \nowhitespace + \vskip\sidefloatbottomskip + \fi + \fi} -\def\dochecksidefloatafterpar - {\dochecksidefloat +\def\page_sides_check_floats_after_par + {\page_sides_check_floats_indeed \ifdim\oldpagetotal=\pagetotal \else - \global\let\checksidefloat\dochecksidefloat - \flushsidefloats - \global\sidefloatsidelines\zerocount % here ! + \global\let\page_sides_check_floats\page_sides_check_floats_indeed + \page_sides_flush_floats + \global\c_page_sides_n_of_lines\zerocount % here ! \fi} -\def\flushsidefloatsafterpar +\def\page_sides_flush_floats_after_par {\xdef\oldpagetotal{\the\pagetotal}% - \global\let\checksidefloat\dochecksidefloatafterpar} + \global\let\page_sides_check_floats\page_sides_check_floats_after_par} -\def\forgetsidefloats - {\global\sidefloatvsize\nofloatvsize - \global\sidefloatsidelines\zerocount +\def\page_sides_forget_floats + {\global\d_page_sides_vsize\d_page_sides_vsize_reset + \global\c_page_sides_n_of_lines\zerocount % also here if used at all \global\holdinginserts\zerocount - \global\floatshortfalse - \global\floatflagfalse} - -\let\logsidefloat=\relax - -\def\pushpenalties % needed ? and right - {\widowpenalty\plusone - \clubpenalty\plustwo - \brokenpenalty\plusone - \let\pushpenalties\relax - \edef\poppenalties - {\widowpenalty \the\widowpenalty - \clubpenalty \the\clubpenalty - \brokenpenalty\the\brokenpenalty - \let\poppenalties\relax}} - -% shouldn;t that be: + \global\setfalse\c_page_sides_short + \global\setfalse\c_page_sides_flag} + +\let\page_otr_sides_pop_penalties \relax +\let\page_otr_sides_push_penalties\relax + +% \def\page_otr_sides_push_penalties % needed ? and right +% {\widowpenalty\plusone +% \clubpenalty\plustwo +% \brokenpenalty\plusone +% \let\page_otr_sides_push_penalties\relax +% \edef\page_otr_sides_pop_penalties +% {\widowpenalty \the\widowpenalty +% \clubpenalty \the\clubpenalty +% \brokenpenalty\the\brokenpenalty +% \let\page_otr_sides_pop_penalties\relax}} +% +% shouldn't that be: % -% \def\pushpenalties % needed? -% {\let\pushpenalties\relax -% \edef\poppenalties +% \def\page_otr_sides_push_penalties % needed? +% {\let\page_otr_sides_push_penalties\relax +% \edef\page_otr_sides_pop_penalties % {\widowpenalty \the\widowpenalty % \clubpenalty \the\clubpenalty % \brokenpenalty\the\brokenpenalty -% \let\poppenalties\relax}% +% \let\page_otr_sides_pop_penalties\relax}% % \widowpenalty\plusone % \clubpenalty\plustwo % \brokenpenalty\plusone} -\let\poppenalties=\relax - -\def\restorepenalties - {\ifnum\outputpenalty=\!!tenthousand\else +\def\page_sides_restore_output_penalty + {\ifnum\outputpenalty=\plustenthousand \else \penalty\outputpenalty \fi} -\def\sidefloatoutput - {\iffloatshort - \unvbox\normalpagebox - \setbox\floatbottom\lastbox - \ifdim\wd\floatbottom>\sidefloathsize - \penalty-201 - \box\floatbottom - \else - \ifvoid\floatbottom +\def\page_sides_output_routine + {\ifconditional\c_page_sides_short + \page_sides_output_routine_yes + \else + \page_sides_output_routine_nop + \fi} + +\def\page_sides_output_routine_nop + {\finalsidefloatoutput % indirect call + \global\d_page_sides_vsize\d_page_sides_vsize_reset + \global\c_page_sides_n_of_lines\zerocount + % we can end up in fig lock, so \global\holdinginserts\zerocount here too ? + \page_otr_sides_pop_penalties} + +\def\page_sides_output_routine_yes % we need to rework this ... add pagediscards and such + {\unvbox\normalpagebox + \setbox\b_page_sides_bottom\lastbox + \ifdim\wd\b_page_sides_bottom>\d_page_sides_hsize + \penalty-201 + \box\b_page_sides_bottom + \else\ifvoid\b_page_sides_bottom + \else + \page_sides_restore_left_indent + \ifdim\wd\b_page_sides_bottom<\d_page_sides_hsize + \parskip\zeropoint + %\noindent + \ifinner\else\vadjust{\penalty\minusone}\fi + \ifconditional\c_page_sides_l_eq + \global\setfalse\c_page_sides_l_eq \else - \restoreleftindent - \ifdim\wd\floatbottom<\sidefloathsize - \parskip\zeropoint - %\noindent - \ifinner\else\vadjust{\penalty\minusone}\fi - \iffloatlefteqo - \global\floatlefteqofalse - \else - \global\advance\sidefloathsize -\wd\floatbottom - \iffloatrighteqo - \global\floatrighteqofalse - \else - \global\divide\sidefloathsize \plustwo - \fi - \hskip\sidefloathsize - \fi + \global\advance\d_page_sides_hsize -\wd\b_page_sides_bottom + \ifconditional\c_page_sides_r_eq + \global\setfalse\c_page_sides_r_eq + \else + \global\divide\d_page_sides_hsize \plustwo \fi - \box\floatbottom - \restorepenalties + \hskip\d_page_sides_hsize \fi \fi - % why was this \global\holdinginserts\zerocount - \global\floatshortfalse - \else - \finalsidefloatoutput % new - \global\sidefloatvsize\nofloatvsize - \global\sidefloatsidelines\zerocount - % we can end up in fig lock, so \global\holdinginserts\zerocount here too ? - \poppenalties - \fi} - -\def\finalsidefloatoutput% new - {\finaloutput\unvbox\normalpagebox} + \box\b_page_sides_bottom + \page_sides_restore_output_penalty + \fi\fi + % why was this \global\holdinginserts\zerocount + \global\setfalse\c_page_sides_short} -\def\restoreleftindent - {\relax \ifnum\sidefloattype>4 \else +\def\page_sides_restore_left_indent + {\relax + \ifnum\c_page_sides_float_type>\plusfour \else \parskip\zeropoint % here ? - \ifdim\sidefloatwidth>\zeropoint % new, see prikkels + \ifdim\d_page_sides_width>\zeropoint % new, see prikkels \noindent - \ifinner\else\vadjust{\penalty\minusone}\fi - \hskip\sidefloatwidth\relax + \ifinner \else + \vadjust{\penalty\minusone}% + \fi + \hskip\d_page_sides_width\relax %\else % we have a margin or edge float \fi \fi} -\ifx\normaleqno\undefined - - \def\normaleqno - {\iffloatshort - \global\floatrighteqotrue - \fi - \floatrighteqo} - -\else - - \def\eqno - {\iffloatshort - \global\floatrighteqotrue - \fi - \floatrighteqo} - -\fi - -% externfiguur -> grid =ja|hoogte|diepte|halveregel|passend -> helemaal in details -% stelplaatsblokin -> zijuitlijnen=hoogte|diepte|regel|halveregel|grid -> halveregel in 'details' - -% replacement for below +% The clean way: % -% \global\setbox\floatbox\hbox % no \hskip, but \kern here -% {\ifcase\sidefloattype -% \vbox{#1}% -% \or % 1 -% \hskip\sidefloatleftshift -% \hskip\sidefloatshift -% \vbox{#1}% -% \kern-\sidefloatextrashift -% \or % 2 -% \hskip\sidefloatshift -% \vbox{#1}% -% \kern-\sidefloatextrashift -% \or % 3 -% \hskip\sidefloatshift -% \vbox{#1}% -% \kern-\sidefloatextrashift -% \or % 4 -% \hskip\sidefloatleftshift -% \hskip\sidefloatshift -% \vbox{#1\removedepth}% -% \kern-\sidefloatextrashift -% \or % 5 -% \hskip-\sidefloatextrashift -% \vbox{#1}% -% \kern\sidefloatshift -% \kern\sidefloatrightshift -% \or % 6 -% \hskip-\sidefloatextrashift -% \vbox{#1}% -% \kern\sidefloatshift -% \or % 7 -% \hskip-\sidefloatextrashift -% \vbox{#1}% -% \kern\sidefloatshift -% \or % 8 -% \hskip-\sidefloatextrashift -% \vbox{#1}% -% \kern\sidefloatshift -% \kern\sidefloatrightshift -% \fi}% +% \global\setbox\floatbox\hbox % no \hskip, but \kern here +% {\ifcase\c_page_sides_float_type +% \vbox{#1}% +% \or % 1 +% \hskip\sidefloatleftshift +% \hskip\sidefloatshift +% \vbox{#1}% +% \kern-\sidefloatextrashift +% \or % 2 +% \hskip\sidefloatshift +% \vbox{#1}% +% \kern-\sidefloatextrashift +% \or % 3 +% \hskip\sidefloatshift +% \vbox{#1}% +% \kern-\sidefloatextrashift +% \or % 4 +% \hskip\sidefloatleftshift +% \hskip\sidefloatshift +% \vbox{#1\removedepth}% +% \kern-\sidefloatextrashift +% \or % 5 +% \hskip-\sidefloatextrashift +% \vbox{#1}% +% \kern\sidefloatshift +% \kern\sidefloatrightshift +% \or % 6 +% \hskip-\sidefloatextrashift +% \vbox{#1}% +% \kern\sidefloatshift +% \or % 7 +% \hskip-\sidefloatextrashift +% \vbox{#1}% +% \kern\sidefloatshift +% \or % 8 +% \hskip-\sidefloatextrashift +% \vbox{#1}% +% \kern\sidefloatshift +% \kern\sidefloatrightshift +% \fi} % -% keep this ^ +% The compact way: -\def\repositionsidefloat#1% +\def\page_sides_relocate_float#1% {\global\setbox\floatbox\hbox % no \hskip, but \kern here - {\ifnum\sidefloattype=\plusfour + {\ifnum\c_page_sides_float_type=\plusfour \hskip\sidefloatleftshift - \else\ifnum\sidefloattype=\plusone + \else\ifnum\c_page_sides_float_type=\plusone \hskip\sidefloatleftshift \fi\fi - \ifnum\sidefloattype>\plusfour + \ifnum\c_page_sides_float_type>\plusfour \hskip-\sidefloatextrashift \else \hskip\sidefloatshift \fi \vbox{#1\ifnum\sidefloatalign=\plusfour \removedepth\fi}% - \ifnum\sidefloattype>\plusfour + \ifnum\c_page_sides_float_type>\plusfour \kern\sidefloatshift \else \kern-\sidefloatextrashift \fi - \ifnum\sidefloattype=8 + \ifnum\c_page_sides_float_type=\pluseight \kern\sidefloatrightshift - \else\ifnum\sidefloattype=\plusfive + \else\ifnum\c_page_sides_float_type=\plusfive \kern\sidefloatrightshift \fi\fi}} -\def\putsidefloat#1% grid (4) is rather experimental - {\par - \whitespace - % moved here dec 2001 - {\everypar\emptytoks\forgetall\verticalstrut\vskip-\struttotal}% moved - \checksidefloatshift - \ifdim\sidefloatshift=\zeropoint \relax - \ifnum\sidefloattype=\plusfour - \global\advance\sidefloatshift\sidefloatextrashift - \global\sidefloatextrashift\zeropoint - \else\ifnum\sidefloattype=\plusfive - \global\advance\sidefloatshift\sidefloatextrashift - \global\sidefloatextrashift\zeropoint - \fi\fi - \else - \ifnum\sidefloattype<\plusfour - \global\sidefloattype\plusfour - \else\ifnum\sidefloattype>\plusfive - \global\sidefloattype\plusfive - \fi\fi - \fi - \previoussidefloat - \stallsidefloat - \repositionsidefloat{#1}% - \ifnum\sidefloatalign=\plusfour +\def\page_sides_apply_vertical_shift + {\ifnum\sidefloatalign=\plusfour \getnoflines{\ht\floatbox}% - \scratchdimen\noflines\lineheight - \advance\scratchdimen-\strutdepth + \scratchdimen\dimexpr\noflines\lineheight-\strutdepth\relax \getrawnoflines\sidefloattopskip \advance\scratchdimen\noflines\lineheight % todo: maybe rounding problem here @@ -498,9 +417,9 @@ \global\sidefloattopskip\zeropoint \fi \scratchdimen - \ifnum\sidefloattype<\plusfour + \ifnum\c_page_sides_float_type<\plusfour \sidefloattopskip - \else\ifnum\sidefloattype>\plusfive + \else\ifnum\c_page_sides_float_type>\plusfive \sidefloattopskip \else \zeropoint @@ -521,101 +440,38 @@ \advance\scratchdimen\strutheight \fi % new - \global\sidefloatlinesdone\zerocount - \ifnum\sidefloatsidelines>\zerocount - \advance\scratchdimen\sidefloatsidelines\lineheight + \global\c_page_sides_lines_done\zerocount + \ifnum\c_page_sides_n_of_lines>\zerocount + \advance\scratchdimen\c_page_sides_n_of_lines\lineheight \fi - % new - \global\setbox\floatbox\hbox + \global\setbox\floatbox\hbox % why extra box {\vbox {\vskip\scratchdimen \nointerlineskip \box\floatbox \ifnum\sidefloatalign=\plusfive \vskip-\lineheight \fi}}% - \ifnum\sidefloattype<\plusfour + \ifnum\c_page_sides_float_type<\plusfour \global\sidefloattopskip\zeropoint - \else\ifnum\sidefloattype>\plusfive + \else\ifnum\c_page_sides_float_type>\plusfive \global\sidefloattopskip\zeropoint \fi\fi - \global\sidefloatdownshift\zeropoint - \measuresidefloat - \ifroomforfloat \else - \vfill\eject % inline \tosssidefloat - \measuresidefloat - \stallsidefloat - \fi - \setsidefloat} - -\def\progresssidefloat - {\sidefloatprogress\sidefloatvsize - \advance\sidefloatprogress-\iffloatflag\sidefloatpagetotal\global\floatflagfalse\else\pagetotal\fi} - -\def\measuresidefloat - {\global\floatflagtrue - \global\sidefloatpagetotal \pagetotal % global - \ifnum\sidefloattype<\plusfour - \global \sidefloatwidth \zeropoint - \else\ifnum\sidefloattype>\plusfive - \global \sidefloatwidth \zeropoint - \else - \global \sidefloatwidth \wd\floatbox - \global\advance\sidefloatwidth \floatsideskip - \fi\fi - \ifdim\sidefloatwidth<\zeropoint - \global\sidefloatwidth\zeropoint - \fi - \global \sidefloathsize \hsize - \global\advance\sidefloathsize -\sidefloatwidth - \global \sidefloatheight \ht\floatbox - \global\advance\sidefloatheight \dp\floatbox - \global\advance\sidefloatheight \sidefloattopskip - \global \sidefloatvsize \sidefloatheight - \global\advance\sidefloatvsize \sidefloatpagetotal - \dimen0\sidefloatvsize - \dimen2\pagegoal - \relax - \ifcase\sidefloatmethod - % method 0 : raw - \or - % method 1 : safe - \dimen2 .99\pagegoal - \or - % method 2 : tight - \advance\dimen0 -\onepoint - \fi - \relax % really needed ! ! ! ! - \ifdim\dimen0>\dimen2 - \global\roomforfloatfalse - \else - \dimen0=\pagegoal - \advance\dimen0 -\sidefloatvsize - \ifdim\dimen0<\sidefloatbottomskip - \global\advance\sidefloatvsize \dimen0 - \global\floatshorttrue - \pushpenalties - % why was this \global\holdinginserts\plusone - \else - \global\advance\sidefloatvsize \sidefloatbottomskip - \global\floatshortfalse - \fi - \global\roomforfloattrue - \fi} + \global\sidefloatdownshift\zeropoint} -\def\setsidefloat% nilling everypar saves time and redudant pos's +\def\page_sides_place_float % nilling everypar saves time and redudant pos's {% removed here dec 2001 % {\everypar\emptytoks\forgetall\verticalstrut\vskip-\struttotal}% - \ifnum\sidefloattype=\plusfour \kern\sidefloattopskip \fi - \ifnum\sidefloattype=\plusfive \kern\sidefloattopskip \fi - \edef\presidefloatdepth{\the\prevdepth}% + \ifnum\c_page_sides_float_type=\plusfour \kern\sidefloattopskip \fi + \ifnum\c_page_sides_float_type=\plusfive \kern\sidefloattopskip \fi + \d_page_sides_saved_depth\prevdepth \nointerlineskip \bgroup \everypar\emptytoks \parskip\zeropoint - \setsidefloatskips - \logsidefloat + \page_sides_set_skips + \page_sides_insert_info \relax -\lefttoright % \textdir TLT\relax % or \ifconditional\displaylefttoright below (more work) - \ifcase\sidefloattype + \lefttoright % \textdir TLT\relax % or \ifconditional\displaylefttoright below (more work) + \ifcase\c_page_sides_float_type % invalid \or % backspace \noindent\llap{\rlap{\box\floatbox}\hskip\sidefloatleftskip}\hfill @@ -636,161 +492,259 @@ \fi \egroup \par -\ifgridsnapping - \getrawnoflines\sidefloatheight - \sidefloatheight=\noflines\lineheight -\fi - \kern-\sidefloatheight + \ifgridsnapping + \getrawnoflines\d_page_sides_height + \d_page_sides_height=\noflines\lineheight + \fi + \kern-\d_page_sides_height \penalty10001 % oeps, this will change \normalbaselines - \prevdepth\presidefloatdepth + \prevdepth\d_page_sides_saved_depth % \noindent - \resetsidefloatparagraph + \page_sides_check_floats_reset \ignorespaces} % not really needed - -\newcount\sidefloatparagraph -\def\iffirstsidefloatparagraph - {\ifcase\sidefloatparagraph\or} +\def\page_sides_analyse_progress + {\d_page_sides_progress\d_page_sides_vsize + \ifconditional\c_page_sides_flag + \advance\d_page_sides_progress-\d_page_sides_page_total + \global\setfalse\c_page_sides_flag + \else + \advance\d_page_sides_progress-\pagetotal + \fi} -% without sidefloat lines -% -% \def\setsidefloatparagraph -% {%\advance\sidefloatprogress \sidefloatbottomskip -% %\!!counta\sidefloatprogress -% \scratchdimen\sidefloatprogress -% \advance\scratchdimen \strutht -% \advance\scratchdimen -\roundingeps % new, needed in prikkels, prevent rounding errors -% \!!counta\scratchdimen -% \divide\!!counta \baselineskip -% \ifnum\!!counta>0 -% \hangindent \ifnum\sidefloattype>4 -\fi\sidefloatwidth -% \hangafter-\!!counta -% \fi -% \global\advance\sidefloatparagraph \plusone -% \iftracesidefloats -% \hskip-\sidefloatwidth -% \color[darkgray]% -% {\vrule\!!height.5\points\!!depth.5\points\!!width\sidefloatwidth -% %\hskip-.25\bodyfontsize\showstruts\strut\hskip.25\bodyfontsize}% -% \llap{\showstruts\strut\hskip.25\bodyfontsize}}% -% \fi} +\def\page_sides_analyse_space + {\global\settrue\c_page_sides_flag + \global\d_page_sides_page_total \pagetotal % global + \ifnum\c_page_sides_float_type<\plusfour + \global\d_page_sides_width \zeropoint + \else\ifnum\c_page_sides_float_type>\plusfive + \global\d_page_sides_width\zeropoint + \else + \global\d_page_sides_width\dimexpr\wd\floatbox+\floatsideskip\relax + \fi\fi + \ifdim\d_page_sides_width<\zeropoint + \global\d_page_sides_width\zeropoint + \fi + \global\d_page_sides_hsize \dimexpr\hsize-\d_page_sides_width\relax + \global\d_page_sides_height\dimexpr\ht\floatbox+\dp\floatbox+\sidefloattopskip\relax + \global\d_page_sides_vsize \dimexpr\d_page_sides_height+\d_page_sides_page_total\relax + \dimen0\d_page_sides_vsize + \dimen2\pagegoal + \relax + \ifcase\sidefloatmethod + % method 0 : raw + \or + % method 1 : safe + \dimen2 .99\pagegoal + \or + % method 2 : tight + \advance\dimen0 -\onepoint + \fi + \relax % really needed ! ! ! ! + \ifdim\dimen0>\dimen2 + \global\roomforfloatfalse + \else + \ifdim\dimexpr\pagegoal-\d_page_sides_vsize\relax<\sidefloatbottomskip + \global\advance\d_page_sides_vsize \dimen0 + \global\settrue\c_page_sides_short + \page_otr_sides_push_penalties + % why was this \global\holdinginserts\plusone + \else + \global\advance\d_page_sides_vsize \sidefloatbottomskip + \global\setfalse\c_page_sides_short + \fi + \global\roomforfloattrue + \fi} + +\def\page_sides_prepare_space + {\par + \whitespace + \begingroup + \everypar\emptytoks + \forgetall + \verticalstrut + \vskip-\struttotal + \endgroup} + +\def\page_sides_handle_float#1% grid (4) is rather experimental + {\page_sides_prepare_space + \page_sides_apply_horizontal_shift + \page_sides_check_previous_float + \page_sides_inject_dummy_lines + \page_sides_relocate_float{#1}% + \page_sides_apply_vertical_shift + \page_sides_analyse_space + \ifroomforfloat \else + \page_otr_fill_and_eject_page + \page_sides_analyse_space + \page_sides_inject_dummy_lines + \fi + \page_sides_place_float} + +\def\page_sides_check_floats_indeed + {\page_sides_analyse_progress + \ifdim\d_page_sides_progress>\zeropoint + \page_sides_check_floats_set + \else + \page_sides_check_floats_reset + \fi + \parskip\ctxparskip} + +\let\page_sides_check_floats\page_sides_check_floats_indeed -\def\setsidefloatparagraph - {%\advance\sidefloatprogress \sidefloatbottomskip - %\!!counta\sidefloatprogress - \scratchdimen\sidefloatprogress - \advance\scratchdimen \strutht - \advance\scratchdimen -\roundingeps % new, needed in prikkels, prevent rounding errors +\def\iffirstsidefloatparagraph + {\ifcase\c_page_sides_checks_done\or} + +\def\page_sides_check_floats_set + {\scratchdimen\dimexpr\d_page_sides_progress+\strutht-\roundingeps\relax \!!counta\scratchdimen \divide\!!counta \baselineskip\relax - \ifnum\!!counta>0 - % new from here - \ifcase\sidefloatsidelines\else - \ifcase\sidefloatlinesdone - \global\sidefloatlinesdone\!!counta + \ifnum\!!counta>\zerocount + % new from here (needs test case, old code) + \ifcase\c_page_sides_n_of_lines + \else + \ifcase\c_page_sides_lines_done + \global\c_page_sides_lines_done\!!counta \else - \scratchcounter\sidefloatlinesdone + \scratchcounter\c_page_sides_lines_done \advance\scratchcounter-\!!counta - \global\advance\sidefloatsidelines-\scratchcounter + \global\advance\c_page_sides_n_of_lines-\scratchcounter \fi \fi - \ifnum\sidefloatsidelines>\zerocount + % hm, when do we get the parshape branch? needs testing + \ifnum\c_page_sides_n_of_lines>\zerocount \scratchtoks\emptytoks - \scratchcounter\sidefloatsidelines - \scratchdimen\hsize - \advance\scratchdimen-\sidefloatwidth - \dorecurse\sidefloatsidelines + \scratchcounter\c_page_sides_n_of_lines + \scratchdimen\dimexpr\hsize-\d_page_sides_width\relax + \dorecurse\c_page_sides_n_of_lines {\appendtoks \zeropoint \hsize \to \scratchtoks}% - \ifnum\!!counta>\sidefloatsidelines - \advance\!!counta -\sidefloatsidelines\relax + \ifnum\!!counta>\c_page_sides_n_of_lines + \advance\!!counta -\c_page_sides_n_of_lines\relax \advance\scratchcounter\!!counta - \dorecurse\!!counta - {\ifnum\sidefloattype>\plusfour - \appendtoks \zeropoint \scratchdimen \to \scratchtoks + \dorecurse\!!counta % weird, shouldn't that be scratchcounter + {\ifnum\c_page_sides_float_type>\plusfour + \appendtoks \zeropoint \scratchdimen \to \scratchtoks \else - \appendtoks \sidefloatwidth \scratchdimen \to \scratchtoks + \appendtoks \d_page_sides_width\scratchdimen \to \scratchtoks \fi}% \fi - \advance\scratchcounter \plusone - \parshape \scratchcounter \the\scratchtoks \zeropoint \hsize\relax + \parshape + \numexpr\scratchcounter+\plusone\relax + \the\scratchtoks % \scratchcounter + \zeropoint \hsize % \plusone + \relax \else % new till here - \hangindent \ifnum\sidefloattype>\plusfour -\fi\sidefloatwidth + \hangindent \ifnum\c_page_sides_float_type>\plusfour -\fi\d_page_sides_width \hangafter-\!!counta \fi \fi - \global\advance\sidefloatparagraph \plusone + \global\advance\c_page_sides_checks_done \plusone \iftracesidefloats - \hskip-\sidefloatwidth + \hskip-\d_page_sides_width \color[darkgray]% - {\vrule\!!height.5\points\!!depth.5\points\!!width\sidefloatwidth - %\hskip-.25\bodyfontsize\showstruts\strut\hskip.25\bodyfontsize}% + {\vrule\!!height.5\points\!!depth.5\points\!!width\d_page_sides_width \llap{\showstruts\strut\hskip.25\bodyfontsize}}% \fi} -\def\resetsidefloatparagraph - {\global\sidefloatparagraph\zerocount} +\def\page_sides_check_floats_reset + {\global\c_page_sides_checks_done\zerocount} -\def\dochecksidefloat - {\progresssidefloat - \ifdim\sidefloatprogress>\zeropoint - \setsidefloatparagraph - \else - \resetsidefloatparagraph - \fi - \parskip\ctxparskip} +\def\page_sides_synchronize_floats + {\ifinner \else + \page_sides_check_floats + \fi} -\let\checksidefloat\dochecksidefloat +\def\page_sides_check_previous_float + {\page_sides_analyse_progress + \ifdim\d_page_sides_progress>\zeropoint \relax + \ifconditional\c_page_sides_short + \global\setfalse\c_page_sides_short + \page_otr_fill_and_eject_page + \else + \kern\d_page_sides_progress + \fi + \fi} -\def\synchronizesidefloats - {\ifinner \else \checksidefloat \fi} +\def\page_sides_inject_dummy_lines + {\scratchcounter\pageshrink + \divide\scratchcounter \baselineskip + \advance\scratchcounter \plusone + \parskip\zeropoint + \dorecurse\scratchcounter{\hbox to \hsize{}}% + \kern-\scratchcounter\baselineskip + \penalty\zerocount} + +% Display math +% +% If we need this, it will be redone but redefining +% these macros does not really work out in the current +% situation. +% +% \ifx\normalleqno\undefined +% +% \let\floatrighteqo=\eqno +% \let\floatleftleqo=\leqno +% +% \else +% +% \let\floatrighteqo=\normaleqno +% \let\floatleftleqo=\normalleqno +% +% \fi +% +% \ifx\normaleqno\undefined +% +% \def\normaleqno +% {\ifconditional\c_page_sides_short +% \global\settrue\c_page_sides_r_eq +% \fi +% \floatrighteqo} +% +% \else +% +% \def\eqno +% {\ifconditional\c_page_sides_short +% \global\settrue\c_page_sides_r_eq +% \fi +% \floatrighteqo} +% +% \fi + +\def\adjustsidefloatdisplaylines + {\aftergroup\page_sides_adjust_display_lines} -\def\doadjustsidefloatdisplaylines +\def\page_sides_adjust_display_lines {\par - % not in mkiv: \vskip-\parskip \noindent \ignorespaces} -\def\adjustsidefloatdisplaylines - {\aftergroup\doadjustsidefloatdisplaylines} - -\def\previoussidefloat - {\progresssidefloat - \ifdim\sidefloatprogress>\zeropoint \relax - \iffloatshort - \global\floatshortfalse - \vfill\eject % inline \tosssidefloat - \else - \kern\sidefloatprogress - \fi - \fi} +% We need to hook it into the other otr's. This code will be adapted +% once we rename the callers. -\def\stallsidefloat - {\!!counta\pageshrink - \divide\!!counta \baselineskip - \advance\!!counta \plusone - \parskip\zeropoint - \dorecurse\!!counta{\line{}}% - \kern-\!!counta\baselineskip - \penalty\zerocount } +% \def as they can be redefined! -% We need to hook it into the other otr's. This code will move. +\def\checksidefloat {\page_sides_check_floats} +\def\flushsidefloats {\page_sides_flush_floats} +\def\flushsidefloatsafterpar{\page_sides_flush_floats_after_par} +\def\forgetsidefloats {\page_sides_forget_floats} +\def\synchronizesidefloats {\page_sides_synchronize_floats} -\let\OTRONEflushsidefloats \flushsidefloats -\let\OTRONEsynchronizesidefloats\synchronizesidefloats +\let\OTRONEflushsidefloats \page_sides_flush_floats +\let\OTRONEsynchronizesidefloats\page_sides_synchronize_floats % page-set % % \let\OTRSETflushsidefloats \forgetsidefloats % \let\OTRSETsynchronizesidefloats\forgetsidefloats - +% % page-mul % % \let\OTRMULflushsidefloats \forgetsidefloats % \let\OTRMULsynchronizesidefloats\forgetsidefloats -\registerotrcommand\synchronizesidefloats % \def\synchronizesidefloats{\OTRcommand\synchronizesidefloats} -\registerotrcommand\flushsidefloats % \def\flushsidefloats {\OTRcommand\flushsidefloats} +\registerotrcommand\synchronizesidefloats +\registerotrcommand\flushsidefloats \protect \endinput diff --git a/tex/context/base/page-spr.mkiv b/tex/context/base/page-spr.mkiv index 6035f992a..33bd6ff16 100644 --- a/tex/context/base/page-spr.mkiv +++ b/tex/context/base/page-spr.mkiv @@ -26,7 +26,7 @@ \def\normalsettextpagecontent#1#2#3% #2 and #3 will disappear {\setbox#1\hbox - {\setlayoutcomponentattribute\v!page\v!text + {\setlayoutcomponentattribute{\v!page:\v!text}% \vbox \layoutcomponentboxattribute to \textheight {\offinterlineskip \freezetextwidth diff --git a/tex/context/base/page-txt.mkiv b/tex/context/base/page-txt.mkiv deleted file mode 100644 index 57f391f7c..000000000 --- a/tex/context/base/page-txt.mkiv +++ /dev/null @@ -1,801 +0,0 @@ -%D \module -%D [ file=page-txt, % copied from main-001, -%D version=1997.03.31, -%D title=\CONTEXT\ Page Macros, -%D subtitle=Texts, -%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. - -% where we can do some mkiv cleanup - -% \setuplayouttext in manual - -\writestatus{loading}{ConTeXt Page Macros / Texts} - -\unprotect - -%D Interfacing between this and other modules is handled by -%D the following macros. The current state of a text line -%D (header, footer, etc.) is checked by: -%D -%D \starttyping -%D \resetlayouttextlines -%D \stoptyping -%D -%D The main text box is finished by the following macro: -%D -%D \starttyping -%D \getmainbox <box> <\vbox|\unvbox> -%D \stoptyping -%D -%D The text lines are collected with: -%D -%D \starttyping -%D \gettextboxes -%D \stoptyping -%D -%D It is possible to extens the default content of the text -%D areas by appending content to the following token list -%D registers: - -\newtoks\toptextcontent \newtoks\leftedgetextcontent -\newtoks\headertextcontent \newtoks\leftmargintextcontent -\newtoks\footertextcontent \newtoks\rightmargintextcontent -\newtoks\bottomtextcontent \newtoks\rightedgetextcontent - -\newtoks\texttextcontent - -%D \macros -%D {setuptop, setupheader, setuptext, -%D setupfooter, setupbottom} -%D -%D The macros in this module sometimes look a bit more complicated -%D than needed, which is a direct result of the fact that their -%D ancestors are quite old and upward compatibility is a must. -%D -%D \showsetup{setuptop} -%D \showsetup{setupheader} -%D \showsetup{setuptext} -%D \showsetup{setupfooter} -%D \showsetup{setupbottom} - -\unexpanded\def\setuplayouttext - {\dotripleempty\dosetuplayouttext} - -\def\dosetuplayouttext[#1][#2][#3]% beware, non global - {\ifthirdargument - \getparameters[\??tk#1#2][#3]% - \else - %\getparameters[\??tk#1\v!text][#2]% - \edef\previoustextstate{\csname\??tk#1\c!state\endcsname}% - \getparameters[\??tk#1][#2]% - \edef\currenttextstate{\csname\??tk#1\c!state\endcsname}% - \ifx\currenttextstate\previoustextstate - % no change in state - \else - %\checkcurrentlayout % no - % speed optimization (calculating backgrounds takes time) - \doifcommon{\previoustextstate,\currenttextstate}{\v!high,\v!none} - {\calculatevsizes - \recalculatebackgrounds}% - \fi - \fi} - -\unexpanded\def\setuptop {\dotripleempty\dosetuplayouttext[\v!top]} -\unexpanded\def\setupheader {\dotripleempty\dosetuplayouttext[\v!header]} -\unexpanded\def\setuptext {\dotripleempty\dosetuplayouttext[\v!text]} -\unexpanded\def\setupfooter {\dotripleempty\dosetuplayouttext[\v!footer]} -\unexpanded\def\setupbottom {\dotripleempty\dosetuplayouttext[\v!bottom]} - -%D \macros -%D {noheaderandfooterlines,notopandbottomlines} -%D -%D Although not really needed, the following shortcuts -%D sometimes come in handy. -%D -%D \showsetup{noheaderandfooterlines} -%D \showsetup{notopandbottomlines} - -\def\noheaderandfooterlines - {\setupheader[\c!state=\v!empty]% - \setupfooter[\c!state=\v!empty]} - -\def\notopandbottomlines - {\setuptop [\c!state=\v!empty]% - \setupbottom[\c!state=\v!empty]} - -%D \macros -%D {setuptoptexts, setupheadertexts, setuptexttexts, -%D setupfootertexts, setupbottomtexts} -%D -%D The next macros take one or more arguments. The exact setup -%D depends on the number of arguments. Although not that -%D intuitive, the current scheme evolved out of the original. -%D When margin and edge texts as well as middle texts showed -%D up, the current odd|/|even scheme surfaced. -%D -%D \showsetup{setuptoptexts} -%D \showsetup{setupheadertexts} -%D \showsetup{setuptexttexts} -%D \showsetup{setupfootertexts} -%D \showsetup{setupbottomtexts} - -\unexpanded\def\setuptoptexts {\dosixtupleempty\dosetuptexts[\v!top ]} -\unexpanded\def\setupheadertexts {\dosixtupleempty\dosetuptexts[\v!header ]} -\unexpanded\def\setuptexttexts {\dosixtupleempty\dosetuptexts[\v!text ]} -\unexpanded\def\setupfootertexts {\dosixtupleempty\dosetuptexts[\v!footer ]} -\unexpanded\def\setupbottomtexts {\dosixtupleempty\dosetuptexts[\v!bottom ]} - -%D The left, right and center variables can also be set -%D directly using the previously discussed macros. - -\def\dosetuptexts[#1][#2][#3][#4][#5][#6]% - {\ifsixthargument - \setvalue{\??tk#1#2\c!lefttext}% - {\dodoubletexts{#1}{#2}% - {\c!leftstyle \c!leftcolor \c!leftwidth }{#3}% - {\c!rightstyle\c!rightcolor\c!rightwidth}{#6}}% - \setvalue{\??tk#1#2\c!righttext}% - {\dodoubletexts{#1}{#2}% - {\c!rightstyle\c!rightcolor\c!rightwidth}{#4}% - {\c!leftstyle \c!leftcolor \c!leftwidth }{#5}}% - \else\iffifthargument - \setvalue{\??tk#1\v!text\c!lefttext}% - {\dodoubletexts{#1}\v!text - {\c!leftstyle \c!leftcolor \c!leftwidth }{#2}% - {\c!rightstyle\c!rightcolor\c!rightwidth}{#5}}% - \setvalue{\??tk#1\v!text\c!righttext}% - {\dodoubletexts{#1}\v!text - {\c!rightstyle\c!rightcolor\c!rightwidth}{#3}% - {\c!leftstyle \c!leftcolor \c!leftwidth }{#4}}% - \else\iffourthargument - \setvalue{\??tk#1#2\c!lefttext}% - {\dodoubletexts{#1}{#2} - {\c!leftstyle\c!leftcolor\c!leftwidth}{#3}% - {\c!leftstyle\c!leftcolor\c!leftwidth}{#3}}% - \setvalue{\??tk#1#2\c!righttext}% - {\dodoubletexts{#1}{#2} - {\c!rightstyle\c!rightcolor\c!rightwidth}{#4}% - {\c!rightstyle\c!rightcolor\c!rightwidth}{#4}}% - \else\ifthirdargument - \setvalue{\??tk#1\v!text\c!lefttext}% - {\dodoubletexts{#1}\v!text - {\c!leftstyle\c!leftcolor\c!leftwidth}{#2}% - {\c!leftstyle\c!leftcolor\c!leftwidth}{#2}}% - \setvalue{\??tk#1\v!text\c!righttext}% - {\dodoubletexts{#1}\v!text - {\c!rightstyle\c!rightcolor\c!rightwidth}{#3}% - {\c!rightstyle\c!rightcolor\c!rightwidth}{#3}}% - \else\ifsecondargument % new - \letvalueempty{\??tk#1\v!text\c!lefttext}% - \letvalueempty{\??tk#1\v!text\c!righttext}% - \setvalue{\??tk#1\v!text\c!middletext}{\dosingletexts{#1}\v!text\c!style\c!color\c!width{#2}}% - \else - \dosixtupleempty\dosetuptexts[#1][\v!text ][][][][]% - \dosixtupleempty\dosetuptexts[#1][\v!margin][][][][]% - \dosixtupleempty\dosetuptexts[#1][\v!edge ][][][][]% - \fi\fi\fi\fi\fi} - -%D Left and right texts are swapped on odd and even pages, but -%D only when double sided typesetting is enabled. - -\def\dodoubletexts{\doifoddpageelse\dodoubletextsodd\dodoubletextseven} - -\def\dodoubletextsodd #1#2#3#4#5#6{\dosingletexts{#1}{#2}#3{#4}} % #3 => provides three arguments -\def\dodoubletextseven#1#2#3#4#5#6{\dosingletexts{#1}{#2}#5{#6}} % #5 => provides three arguments - -%D The next macro will be cleaned up and made less messy and -%D dependent. - -\unexpanded\def\placetextlinestrut#1% - {\doifvalue{#1\c!strut}\v!yes{\setstrut\strut}} - -\def\dosingletexts#1#2#3#4#5#6% - {\bgroup - \defconvertedargument\ascii{#6}% no longer \defconvertedargument, this also does not permit \v!pagenumber (i.e. v!) - \ifx\ascii\empty\else - \dostartattributes{\??tk#1#2}#3#4\empty - \placetextlinestrut{\??tk#1}% here ! - \doifelsemarking\ascii - {\dolimitatetexts{\??tk#1#2#5}{\getmarking[\ascii][\v!first]}}% - {\ifcsname\??tk->\ascii\endcsname - \csname\??tk->\ascii\endcsname - \else - % #6{}{}{} -> {} needed for macros that look - % ahead, like \uniqueMPgraphic - \ignorecrlf\dolimitatetexts{\??tk#1#2#5}{#6{}{}{}}% - \fi}% - \dostopattributes - \fi - \egroup} - -\setvalue{\??tk->\v!pagenumber}{\placelocationpagenumber} -\setvalue{\??tk->\v!date }{\currentdate} - -%D When specified, the texts are automatically limited in -%D length. - -\def\dolimitatetexts#1#2% - {\doifelsevaluenothing{#1}{#2}{\limitatetext{#2}{\csname#1\endcsname}{\unknown}}} - -%D The placement of text is hooked into the token lists -%D associated to the area at hand. - -\appendtoks \placelayouttextline\v!top \topheight \to \toptextcontent -\appendtoks \placelayouttextline\v!header\headerheight \to \headertextcontent -\appendtoks \placelayouttextline\v!text \textheight \to \texttextcontent -\appendtoks \placelayouttextline\v!footer\footerheight \to \footertextcontent -\appendtoks \placelayouttextline\v!bottom\bottomheight \to \bottomtextcontent - -%D Texts can be disabled, moved up and ignored, depending in -%D the \type {status} variable. This is handled by the next -%D couple of macros. - -% \def\settextlinestatus#1% -% {\edef\textlinestatus{\csname\??tk#1\c!state\endcsname}} - -\def\settextlinestatus#1% - {\ifcase0\csname\??tk#1\c!n\endcsname\relax - \edef\textlinestatus{\csname\??tk#1\c!state\endcsname}% - \else - \setxvalue{\??tk#1\c!n}{\the\numexpr\csname\??tk#1\c!n\endcsname-1}% - \let\textlinestatus\v!stop - \fi} - -\appendtoks - \doifinset\v!header\floatspecification{\setxvalue{\??tk\v!header\c!n}{1}}% - \doifinset\v!footer\floatspecification{\setxvalue{\??tk\v!footer\c!n}{1}}% -\to \everybeforeflushedpagefloat - -\def\resettextlinestatus#1% postpone - {\expandafter\gdef\csname\??tk#1\s!reset\endcsname{\global\expandafter\let\csname\??tk#1\c!state\endcsname\v!normal}} - -\unexpanded\def\placelayouttextline#1% #2 - {\settextlinestatus#1% - \csname\??tk::\ifcsname\??tk::\textlinestatus\endcsname\textlinestatus\else\s!unknown\fi\endcsname#1} % {#2} - -\def\doifelselayouttextline#1% shown or not - {\edef\!!stringa{\csname\??tk#1\c!state\endcsname}% - \ifx\!!stringa\v!normal - \@EA\firstoftwoarguments - \else\ifx\!!stringa\v!start - \@EAEAEA\firstoftwoarguments - \else - \@EAEAEA\secondoftwoarguments - \fi\fi} - -\def\doifelselayoutsomeline#1% present or not - {\edef\!!stringa{\csname\??tk#1\c!state\endcsname}% - \ifx\!!stringa\v!none - \@EA\secondoftwoarguments - \else\ifx\!!stringa\v!high - \@EAEAEA\secondoftwoarguments - \else - \@EAEAEA\firstoftwoarguments - \fi\fi} - -% \doplacelayouttextline does the actual placement (when a non-zero height) - -\newconditional\resyncaftertextline - -% there is no need for {#1} etc since we use symbolic names - -\setvalue{\??tk::\v!normal}{\doplacelayouttextline} -\setvalue{\??tk::\empty }{\doplacelayouttextline} - -\setvalue{\??tk::\v!none }#1#2{} -\setvalue{\??tk::\v!stop }#1#2{} - -\setvalue{\??tk::\v!high}#1#2% - {\global\settrue\resyncaftertextline - \resettextlinestatus#1} - -\setvalue{\??tk::\v!empty}#1#2% - {\resettextlinestatus#1} - -\setvalue{\??tk::\v!start}#1#2% - {\resettextlinestatus#1% - \doplacelayouttextline#1#2} - -\setvalue{\??tk::\v!nomarking}#1#2% - {\bgroup - \resettextlinestatus#1% - \settrue\inhibitgetmarking - \let\dogetmarking\nogetmarking % obsolete in new marking mechanism - \doplacelayouttextline#1#2% - \egroup} - -\setvalue{\??tk::\s!unknown}#1#2% - {\global\settrue\resyncaftertextline - \bgroup % new - \resettextlinestatus#1% - \csname\??tk#1\textlinestatus\endcsname - \csname\??tk#1\v!text \textlinestatus\endcsname - \csname\??tk#1\v!margin\textlinestatus\endcsname - \csname\??tk#1\v!edge \textlinestatus\endcsname - \doplacelayouttextline#1#2% - \egroup} - -%D The following macro has to be called after a page -%D is flushed. - -\def\resetlayouttextline#1% - {\csname\??tk#1\s!reset\endcsname - \global\expandafter\let\csname\??tk#1\s!reset\endcsname\relax} - -\def\resetlayouttextlines - {\resetlayouttextline\v!top - \resetlayouttextline\v!header - \resetlayouttextline\v!text - \resetlayouttextline\v!footer - \resetlayouttextline\v!bottom - \ifconditional\resyncaftertextline - \calculateglobalvsizes - \recalculatebackgrounds - \global\setfalse\resyncaftertextline - \fi} - -% \settext[header][text][middle][xxx][yyy] - -\def\settextcontent - {\doquintupleempty\dosettextcontent} - -\def\dosettextcontent[#1][#2][#3][#4][#5]% header text middle text/text - {\iffifthargument - \setvalue{\??tk#1#2\executeifdefined{:\c!text:#3:}\c!middletext}% - {\dodoubletexts{\??tk#1}{#2}% - {\c!leftstyle \c!leftcolor \c!leftwidth }{#4}% - {\c!rightstyle\c!rightcolor\c!rightwidth}{#5}}% - \else\iffourthargument - \setvalue{\??tk#1#2\executeifdefined{:\c!text:#3:}\c!middletext}% - {\dodoubletexts{\??tk#1}{#2}% - {\c!leftstyle \c!leftcolor \c!leftwidth }{#4}% - {\c!rightstyle\c!rightcolor\c!rightwidth}{#4}}% - \else\ifthirdargument - \setvalue{\??tk#1#2\c!middletext}% - {\dodoubletexts{\??tk#1}{#2}% - {\c!leftstyle \c!leftcolor \c!leftwidth }{#3}% - {\c!rightstyle\c!rightcolor\c!rightwidth}{#3}}% - \fi\fi\fi} - -\def\resettextcontent - {\dotripleempty\doresettextcontent} - -\def\doresettextcontent[#1][#2][#3]% header text middle - {\ifthirdargument - \letvalueempty{\??tk#1#2\executeifdefined{:\c!text:#3:}\c!middletext}% - \else\ifsecondargument - \letvalueempty{\??tk#1#2\c!lefttext}% - \letvalueempty{\??tk#1#2\c!middletext}% - \letvalueempty{\??tk#1#2\c!righttext}% - \fi\fi} - -\let\settext \settextcontent % downward compatibility -\let\resettext\resettextcontent % downward compatibility - -\letvalue{:\c!middle:\c!text:}\c!middletext -\letvalue{:\c!left :\c!text:}\c!lefttext -\letvalue{:\c!right :\c!text:}\c!righttext - -%D The next series of macros is not that easy to read, -%D because they hook into the main page building macros. By -%D using token list registers for the text content, we can -%D easily hook in other code, like menu generators. -%D -%D Beware: the token lists are always expanded, also when the -%D height of an area is zero. This is because reset actions can -%D be part of them. - -\newbox\scratchpagebox - -% \newbox\collectedprepagecontent % only for delayed stuff - -% \def\flushcollectedpagecontent -% {\ifvoid\collectedprepagecontent \else -% \smashbox\collectedprepagecontent -% \box\collectedprepagecontent -% \fi} - -% \def\delaytillpageisflushhed#1% -% {\global\setbox\collectedprepagecontent\hbox -% {\ifvoid\collectedprepagecontent \else -% \unhbox\collectedprepagecontent -% \fi % ignore and remove not really needed -% \ignorespaces#1\removeunwantedspaces}} - -\def\gettextboxes - {\ifcase\pageornamentstate - \dogettextboxes - \fi} - -\def\dogettextboxes - {\setbox\scratchpagebox\vbox - {\dontcomplain - \calculatereducedvsizes - \swapmargins - \offinterlineskip -% \flushcollectedpagecontent - \vskip\dimexpr-\topheight-\topdistance\relax - \the\toptextcontent - \vskip\dimexpr\topheight+\topdistance\relax - \the\headertextcontent - \vskip\dimexpr\headerheight+\headerdistance\relax - \placepositionanchors - \vskip-\textheight - \the\texttextcontent - \vskip\textheight - \the\everyendoftextbody - \vskip\footerdistance - \the\footertextcontent - \vskip\dimexpr\footerheight+\bottomdistance\relax - \the\bottomtextcontent - \vskip\bottomheight - \vfilll}% - \smashbox\scratchpagebox - \box\scratchpagebox} - -\def\getmainbox#1#2% - {\setbox\scratchpagebox\vbox - {\offinterlineskip % na \paginaletter ! - \calculatereducedvsizes - \calculatehsizes - \swapmargins - \vskip\dimexpr\headerheight+\headerdistance+\layoutparameter\c!textdistance\relax - \dontleavehmode - % \dosetanchor{text}% failed experiment - \hbox to \makeupwidth - {\bgroup - \swapmargins - \goleftonpage - \ifdim\leftedgewidth>\zeropoint - \the\leftedgetextcontent - \hskip\leftedgewidth - \fi - \hskip\leftedgedistance - \ifdim\leftmarginwidth>\zeropoint - \the\leftmargintextcontent - \hskip\leftmarginwidth - \fi - \hskip\leftmargindistance - \egroup - \mkprocesspagecontents{#2}% - \settextpagecontent\scratchpagebox{#1}{#2}% - \addtextbackground\scratchpagebox - \addtextgridlayer\scratchpagebox - \box\scratchpagebox - \bgroup - \hskip\rightmargindistance - \ifdim\rightmarginwidth>\zeropoint - \the\rightmargintextcontent - \hskip\rightmarginwidth - \fi - \hskip\rightedgedistance - \ifdim\rightedgewidth>\zeropoint - \the\rightedgetextcontent - \hskip\rightedgewidth - \fi - \egroup - \hss}}% - \smashbox\scratchpagebox - \box\scratchpagebox} - -%D The main text area has to be combined with some additional -%D (tracing) information. - -% will be stored as normal and overloaded in page-lyr and later in -% page-spr we overload the the stored version .. evenatually i will -% clear up the experimental mess - -\def\settextpagecontent#1#2#3% #2 and #3 will disappear - {\setbox#1\hbox to \makeupwidth - {\hss % so don't change this - \setlayoutcomponentattribute\v!page\v!text - \vbox \layoutcomponentboxattribute to \textheight - {\offinterlineskip - \freezetextwidth - \hsize\textwidth % local variant of \sethsize - \boxmaxdepth\maxdepth - \noindent % content can be < \hsize - \dopagecontents#2#3}% - \hss}% - \dp#1\zeropoint} - -%D The placement of a whole line is handled by the next two -%D macros. These are hooked into the general purpose token -%D list registers mentioned before. - -\def\ignoredlinebreak{\unskip\space\ignorespaces} - -\def\doplacelayouttextline#1#2% - {\let\currentlayouttextline#1% - \ifdim#2>\zeropoint\relax % prevents pagenumbers when zero height - \doplacelayouttextlineindeed{#2}% - \fi} - -\def\doplacelayouttextlineindeed#1% - {\goleftonpage - \hbox - {\setbox\scratchpagebox\vbox to #1 - {\vsize#1\relax - \normalbaselines - \let\\\ignoredlinebreak - \let\crlf\ignoredlinebreak - \csname\??tk\currentlayouttextline\c!before\endcsname - \doifbothsidesoverruled\dodoplacelayouttextlineright\dodoplacelayouttextlineright\dodoplacelayouttextlineleft - \csname\??tk\currentlayouttextline\c!after\endcsname - \kern\zeropoint}% keep the \dp, beware of \vtops, never change this! - \dp\scratchpagebox\zeropoint - \box\scratchpagebox}% - \vskip-#1\relax} - -\def\dodoplacelayouttextlineright{\dodoplacelayouttextline\c!lefttext \c!middletext\c!righttext\zerocount\plusone} -\def\dodoplacelayouttextlineleft {\dodoplacelayouttextline\c!righttext\c!middletext\c!lefttext \plusone\zerocount} - -\def\dodoplacelayouttextline#1#2#3#4#5% \hsize toegevoegd, \hss's niet meer wijzigen - {\hbox - {\ifdim\leftedgewidth>\zeropoint - \dododoplacelayouttextline\leftedgewidth\currentlayouttextline\v!edge{\thelayoutleftedgeline#1}% - \hskip\leftedgedistance - \fi - \ifdim\leftmarginwidth>\zeropoint - \dododoplacelayouttextline\leftmarginwidth\currentlayouttextline\v!margin{\thelayoutleftmarginline#1#4}% - \hskip\leftmargindistance - \fi - \ifdim\makeupwidth>\zeropoint - \dododoplacelayouttextline\makeupwidth\currentlayouttextline\v!text{\thelayouttextline#1#2#3#4#5}% - \fi - \ifdim\rightmarginwidth>\zeropoint - \hskip\rightmargindistance - \dododoplacelayouttextline\rightmarginwidth\currentlayouttextline\v!margin{\thelayoutrightmarginline#3#5}% - \fi - \ifdim\rightedgewidth>\zeropoint - \hskip\rightedgedistance - \dododoplacelayouttextline\rightedgewidth\currentlayouttextline\v!edge{\thelayoutrightedgeline#3}% - \fi}} - -\def\thelayoutleftedgeline#1% - {\hss\csname\??tk\currentlayouttextline\v!edge#1\endcsname}% - -\def\thelayoutrightedgeline#1% - {\csname\??tk\currentlayouttextline\v!edge#1\endcsname\hss} - -\def\thelayoutleftmarginline#1#2% - {\hbox to \leftmarginwidth{\hss\csname\??tk\currentlayouttextline\v!margin#1\endcsname}% - \hskip-\leftmarginwidth - \hbox to \leftmarginwidth{\hss\ifcase#2\or\csname\??tk\currentlayouttextline\v!margin\c!margintext\endcsname\fi}} - -\def\thelayoutrightmarginline#1#2% - {\hbox to \rightmarginwidth{\csname\??tk\currentlayouttextline\v!margin#1\endcsname\hss}% - \hskip-\rightmarginwidth - \hbox to \rightmarginwidth{\ifcase#2\or\csname\??tk\currentlayouttextline\v!margin\c!margintext\endcsname\fi\hss}} - -\def\thelayoutedgetextline{\csname\??tk\currentlayouttextline\v!text\c!marginedgetext\endcsname} - -\def\thelayouttextline#1#2#3#4#5% - {\hbox to \makeupwidth{\ifcase#4\or\@@nmpre\thelayoutedgetextline\fi\csname\??tk\currentlayouttextline\v!text#1\endcsname\hss}% - \hskip-\makeupwidth - \hbox to \makeupwidth{\hss\csname\??tk\currentlayouttextline\v!text#2\endcsname\hss}% - \hskip-\makeupwidth - \hbox to \makeupwidth{\hss\csname\??tk\currentlayouttextline\v!text#3\endcsname\ifcase#5\or\@@nmpos\thelayoutedgetextline\fi}} - -\def\dododoplacelayouttextline#1#2#3#4% - {\vbox % to \vsize - {\hsize#1\relax - \csname\??tk#2#3\c!before\endcsname - \setlayoutcomponentattribute#2#3% - \hbox \layoutcomponentboxattribute to #1{#4}% - \csname\??tk#2#3\c!after\endcsname}} - -%D Although it is far better to use backgrounds for this -%D purpose, one can add a rule in the following way. This -%D method makes the rules disappear in case of an empty text -%D line. Consider this a feature. -%D -%D \starttyping -%D \setupheadertexts[left][right] -%D -%D \setupheader[text][after=\hrule,style=bold] -%D -%D \starttext -%D \input tufte \page -%D \setupheader[state=empty] -%D \input tufte \page -%D \stoptext -%D \stoptyping - -%D The next twosome will be done differently (using an -%D existing auxiliary macro). - -% \def\@@nmpre#1{\setbox0\hbox{#1}\ifdim\wd0=\zeropoint\else\unhbox0\tfskip\fi} -% \def\@@nmpos#1{\setbox0\hbox{#1}\ifdim\wd0=\zeropoint\else\tfskip\unhbox0\fi} - -% cleaner -% -% \def\@@nmpre#1{\doiftext{#1}{{#1}\tfskip}} -% \def\@@nmpos#1{\doiftext{#1}{\tfskip{#1}}} -% -% newer -% -% \def\@@nmprepos#1#2#3#4#5% -% {\doifelsenothing\@@nmwidth -% {\doiftext{#5}{#1{#5}#2}} -% {\doiftext{#5}{\hbox to \@@nmwidth{#3{#5}#4}}}} -% -% \def\@@nmpre{\@@nmprepos\empty\tfskip\relax\hss} -% \def\@@nmpos{\@@nmprepos\tfskip\empty\hss\relax} -% -% faster - -\def\@@nmpre#1% - {\begingroup - \setbox\scratchbox\normalhbox{\settrialtypesetting\ignorespaces#1\removeunwantedspaces}% - \ifzeropt\wd\scratchbox\else - \doifelsenothing\@@nmwidth - {\box\scratchbox\tfskip} - {\hbox to \@@nmwidth{\box\scratchbox\hss}}% - \fi - \endgroup} - -\def\@@nmpos#1% - {\begingroup - \setbox\scratchbox\normalhbox{\settrialtypesetting\ignorespaces#1\removeunwantedspaces}% - \ifzeropt\wd\scratchbox\else - \doifelsenothing\@@nmwidth - {\tfskip\box\scratchbox} - {\hbox to \@@nmwidth{\hss\box\scratchbox}}% - \fi - \endgroup} - -%D This code will move to \type {page-flt.tex}. - -\appendtoks \placerightmarginblock \hskip-\rightmarginwidth \to \rightmargintextcontent -\appendtoks \placeleftmarginblock \hskip-\leftmarginwidth \to \leftmargintextcontent - -%D The next hook will later be used for keeping track of -%D positions, i.e.\ it will provide a proper (page -%D dependent) reference point. - -\ifx\undefined\placepositionanchors - \unexpanded\def\placepositionanchors{\vskip\textheight} -\fi - -%D \macros -%D {definetext} -%D -%D Some macros ago, we implemented the \type {status} option -%D \type {unknown}. This one is used to take care of -%D symbolic texts handlers. -%D -%D \showsetup{definetext} -%D -%D The next example demonstrates how we can use this -%D mechanism to provide page (event) dependent text lines. -%D -%D \starttyping -%D \definetext[chapter][footer][pagenumber] -%D \setuphead[chapter][header=high,footer=chapter] -%D \setupheadertexts[pagenumber] -%D \setupfootertexts[left][right] -%D \chapter{eerste} \dorecurse{20}{\input tufte \relax} -%D \chapter{tweede} \dorecurse{20}{\input tufte \relax} -%D \stoptyping - -\unexpanded\def\definetext - {\doseventupleempty\dodefinetext} - -\def\dodefinetext[#1][#2][#3][#4][#5][#6][#7]% - {\ifseventhargument - \setvalue{\??tk#2#3#1}{\dosixtupleempty\dosetuptexts[#2][#3][#4][#5][#6][#7]}% - \else\ifsixthargument - \setvalue{\??tk #2#1}{\dosixtupleempty\dosetuptexts[#2][#3][#4][#5][#6]}% - \else\iffifthargument - \setvalue{\??tk#2#3#1}{\dosixtupleempty\dosetuptexts[#2][#3][#4][#5]}% - \else\iffourthargument - \setvalue{\??tk #2#1}{\dosixtupleempty\dosetuptexts[#2][#3][#4]}% - \else - \setvalue{\??tk #2#1}{\dosixtupleempty\dosetuptexts[#2][#3]}% - \fi\fi\fi\fi} - -%D The rest of this file is dedicated to setting up the -%D texts. This code is not that impressive. - -\setupheadertexts [\v!text] [] [] -\setupheadertexts [\v!margin] [] [] -\setupheadertexts [\v!edge] [] [] - -\setupfootertexts [\v!text] [] [] -\setupfootertexts [\v!margin] [] [] -\setupfootertexts [\v!edge] [] [] - -\setuptexttexts [\v!text] [] [] -\setuptexttexts [\v!margin] [] [] -\setuptexttexts [\v!edge] [] [] - -\setupbottomtexts [\v!text] [] [] -\setupbottomtexts [\v!margin] [] [] -\setupbottomtexts [\v!edge] [] [] - -\setuptoptexts [\v!text] [] [] -\setuptoptexts [\v!margin] [] [] -\setuptoptexts [\v!edge] [] [] - -% alternative -% -% \def\resetlayouttekst% -% {\dodoubleempty\doresetlayouttekst} -% -% \def\doresetlayouttekst[#1][#2]% -% {\ifsecondargument -% \dodoresetlayouttekst[#1][#2]% -% \else -% \dodoresetlayouttekst[#1][\v!tekst]% -% \fi} -% -% \def\dodoresetlayouttekst[#1][#2]% -% {...} -% -% \def\docommand#1% -% {\resetlayouttekst[#1][\v!tekst]% -% \resetlayouttekst[#1][\v!marge]% -% \resetlayouttekst[#1][\v!rand]} - -%D We combine a lot of similar settings in a macro that -%D we will later dispose. - -\def\dodocommand[#1][#2]% - {\getparameters - [\??tk#1#2] - [%\c!state=\v!normal, % moved - \c!before=,% both global and local are used - \c!after=,% both global and local are used - \c!strut=,% the local one, not (yet) used - \c!style=\csname\??tk#1\c!style\endcsname,% hm, got lost - \c!color=\csname\??tk#1\c!color\endcsname,% hm, got lost - \c!lefttext=, - \c!middletext=, - \c!righttext=, - \c!marginedgetext=, - \c!margintext=, - \c!width=]% - \inheritparameter[\??tk#1#2][\c!leftstyle ][\c!style ]% - \inheritparameter[\??tk#1#2][\c!rightstyle][\c!style ]% - \inheritparameter[\??tk#1#2][\c!leftcolor ][\c!color ]% - \inheritparameter[\??tk#1#2][\c!rightcolor][\c!color ]% - \inheritparameter[\??tk#1#2][\c!leftwidth ][\c!width]% - \inheritparameter[\??tk#1#2][\c!rightwidth][\c!width]} - -\def\docommand#1% - {\dodocommand[#1][\v!text]% - \dodocommand[#1][\v!margin]% - \dodocommand[#1][\v!edge]} - -\docommand\v!top -\docommand\v!header -\docommand\v!footer -\docommand\v!text -\docommand\v!bottom - -\let\docommand \relax -\let\dodocommand\relax - -%D While the header and footer lines are moved away from the -%D main text, the top and bottom lines are centered. - -\setuptop [\c!state=\v!normal,\c!n=0,\c!before=\vss,\c!after=\vss,\c!strut=] -\setupheader[\c!state=\v!normal,\c!n=0,\c!before=, \c!after=\vss,\c!strut=\v!yes] -\setuptext [\c!state=\v!normal,\c!n=0,\c!before=\vss,\c!after=\vss,\c!strut=] -\setupfooter[\c!state=\v!normal,\c!n=0,\c!before=\vss,\c!after=, \c!strut=\v!yes] -\setupbottom[\c!state=\v!normal,\c!n=0,\c!before=\vss,\c!after=\vss,\c!strut=] - -\setuptop [\c!style=,\c!color=] -\setupheader[\c!style=,\c!color=] -\setuptext [\c!style=,\c!color=] -\setupfooter[\c!style=,\c!color=] -\setupbottom[\c!style=,\c!color=] - -\protect \endinput diff --git a/tex/context/base/page-txt.mkvi b/tex/context/base/page-txt.mkvi new file mode 100644 index 000000000..7d89f7d8e --- /dev/null +++ b/tex/context/base/page-txt.mkvi @@ -0,0 +1,922 @@ +% macros=mkvi + +%D \module +%D [ file=page-txt, % copied from main-001, +%D version=1997.03.31, +%D title=\CONTEXT\ Page Macros, +%D subtitle=Texts, +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +\writestatus{loading}{ConTeXt Page Macros / Texts} + +\unprotect + +\newtoks\toptextcontent \newtoks\leftedgetextcontent +\newtoks\headertextcontent \newtoks\leftmargintextcontent +\newtoks\footertextcontent \newtoks\rightmargintextcontent +\newtoks\bottomtextcontent \newtoks\rightedgetextcontent + +\newtoks\texttextcontent + +%D \macros +%D {setuptop, setupheader, setuptext, +%D setupfooter, setupbottom} +%D +%D The macros in this module sometimes look a bit more complicated +%D than needed, which is a direct result of the fact that their +%D ancestors are quite old and upward compatibility is a must. +%D +%D \showsetup{setuptop} +%D \showsetup{setupheader} +%D \showsetup{setuptext} +%D \showsetup{setupfooter} +%D \showsetup{setupbottom} + +\installcommandhandler \??tk {layoutelement} \??tk + +% \appendtoks +% \resetlayoutelementparameter\c!lefttext % resolves better +% \resetlayoutelementparameter\c!middletext +% \resetlayoutelementparameter\c!righttext +% \to \everydefinelayoutelement + +\definelayoutelement[\v!top ] +\definelayoutelement[\v!header] +\definelayoutelement[\v!text ] +\definelayoutelement[\v!footer] +\definelayoutelement[\v!bottom] + +\definelayoutelement[\v!top :\v!text] [\v!text] [\c!lefttext=,\c!middletext=,\c!righttext=] +\definelayoutelement[\v!header:\v!text] [\v!text] [\c!lefttext=,\c!middletext=,\c!righttext=] +\definelayoutelement[\v!text :\v!text] [\v!text] [\c!lefttext=,\c!middletext=,\c!righttext=] +\definelayoutelement[\v!footer:\v!text] [\v!text] [\c!lefttext=,\c!middletext=,\c!righttext=] +\definelayoutelement[\v!bottom:\v!text] [\v!text] [\c!lefttext=,\c!middletext=,\c!righttext=] + +\definelayoutelement[\v!top :\v!margin][\v!margin][\c!lefttext=,\c!middletext=,\c!righttext=] +\definelayoutelement[\v!header:\v!margin][\v!margin][\c!lefttext=,\c!middletext=,\c!righttext=] +\definelayoutelement[\v!text :\v!margin][\v!margin][\c!lefttext=,\c!middletext=,\c!righttext=] +\definelayoutelement[\v!footer:\v!margin][\v!margin][\c!lefttext=,\c!middletext=,\c!righttext=] +\definelayoutelement[\v!bottom:\v!margin][\v!margin][\c!lefttext=,\c!middletext=,\c!righttext=] + +\definelayoutelement[\v!top :\v!edge] [\v!edge] [\c!lefttext=,\c!middletext=,\c!righttext=] +\definelayoutelement[\v!header:\v!edge] [\v!edge] [\c!lefttext=,\c!middletext=,\c!righttext=] +\definelayoutelement[\v!text :\v!edge] [\v!edge] [\c!lefttext=,\c!middletext=,\c!righttext=] +\definelayoutelement[\v!footer:\v!edge] [\v!edge] [\c!lefttext=,\c!middletext=,\c!righttext=] +\definelayoutelement[\v!bottom:\v!edge] [\v!edge] [\c!lefttext=,\c!middletext=,\c!righttext=] + +\unexpanded\def\setuplayouttext + {\dotripleempty\setup_layout_text} + +\def\setup_layout_text[#vertical][#horizontal][#settings]% + {\ifthirdargument + \setuplayoutelement[#vertical:#horizontal][#settings]% + \else + \setuplayoutelement[#vertical][#horizontal]% + \fi} + +\appendtoks + \ifx\currentlayoutelement\empty\else + \synchronize_current_layout_element\currentlayoutelement % brr, can be vertical:horizontal + \fi +\to \everysetuplayoutelement + +\def\reset_layout_element_status#vertical% + {\expandafter\gdef\csname\??tk:r:#vertical\endcsname{\set_layout_element_status_normal#vertical}} + +\def\set_layout_element_status_normal#vertical% + {\global\expandafter\let\csname\namedlayoutelementhash#vertical\c!state\endcsname\v!normal + \global\expandafter\let\csname\??tk:r:#vertical\endcsname\relax + \synchronize_current_layout_element{#vertical}} + +\def\synchronize_current_layout_element#vertical% + {\xdef\previoustextstate{\getvalue{\??tk:x:#vertical}}% + \edef\currenttextstate {\namedlayoutelementparameter{#vertical}\c!state}% + %\writestatus{>>}{[#vertical:\currenttextstate/\previoustextstate]}% + \ifx\currenttextstate\previoustextstate \else + \synchronize_current_layout_element_indeed{#vertical}% + \fi} + +\def\synchronize_current_layout_element_indeed#vertical% + {\ifx\currenttextstate \v!high \calculatevsizes\recalculatebackgrounds \else + \ifx\previoustextstate\v!high \calculatevsizes\recalculatebackgrounds \else + \ifx\currenttextstate \v!none \calculatevsizes\recalculatebackgrounds \else + \ifx\previoustextstate\v!none \calculatevsizes\recalculatebackgrounds \fi\fi\fi\fi + \letgvalue{\??tk:x:#vertical}\currenttextstate} + +\unexpanded\def\setuptop {\dotripleempty\setup_layout_text[\v!top ]} +\unexpanded\def\setupheader{\dotripleempty\setup_layout_text[\v!header]} +\unexpanded\def\setuptext {\dotripleempty\setup_layout_text[\v!text ]} +\unexpanded\def\setupfooter{\dotripleempty\setup_layout_text[\v!footer]} +\unexpanded\def\setupbottom{\dotripleempty\setup_layout_text[\v!bottom]} + +%D \macros +%D {noheaderandfooterlines,notopandbottomlines} +%D +%D Although not really needed, the following shortcuts +%D sometimes come in handy. +%D +%D \showsetup{noheaderandfooterlines} +%D \showsetup{notopandbottomlines} + +\def\noheaderandfooterlines + {\setuplayoutelement[\v!header][\c!state=\v!empty]% + \setuplayoutelement[\v!footer][\c!state=\v!empty]} + +\def\notopandbottomlines + {\setuplayoutelement[\v!top ][\c!state=\v!empty]% + \setuplayoutelement[\v!bottom][\c!state=\v!empty]} + +%D \macros +%D {setuptoptexts, setupheadertexts, setuptexttexts, +%D setupfootertexts, setupbottomtexts} +%D +%D The next macros take one or more arguments. The exact setup +%D depends on the number of arguments. Although not that +%D intuitive, the current scheme evolved out of the original. +%D When margin and edge texts as well as middle texts showed +%D up, the current odd|/|even scheme surfaced. +%D +%D \showsetup{setuptoptexts} +%D \showsetup{setupheadertexts} +%D \showsetup{setuptexttexts} +%D \showsetup{setupfootertexts} +%D \showsetup{setupbottomtexts} + +\unexpanded\def\setuptoptexts {\dosixtupleempty\setup_texts[\v!top ]} +\unexpanded\def\setupheadertexts{\dosixtupleempty\setup_texts[\v!header ]} +\unexpanded\def\setuptexttexts {\dosixtupleempty\setup_texts[\v!text ]} +\unexpanded\def\setupfootertexts{\dosixtupleempty\setup_texts[\v!footer ]} +\unexpanded\def\setupbottomtexts{\dosixtupleempty\setup_texts[\v!bottom ]} + +% todo: \setuplayoutelementtext + +% An alternative approach is to have more variables but that does not +% make the code less complex (probably more). + +\def\setup_texts[#vertical][#horizontal][#a][#b][#c][#d]% + {\ifsixthargument + \edef\currentlayoutelement{#vertical:#horizontal}% + \setlayoutelementparameter\c!lefttext + {\process_layout_element_double + \c!leftstyle \c!leftcolor \c!leftwidth {#a}% + \c!rightstyle\c!rightcolor\c!rightwidth{#d}}% + \setlayoutelementparameter\c!righttext + {\process_layout_element_double + \c!rightstyle\c!rightcolor\c!rightwidth{#b}% + \c!leftstyle \c!leftcolor \c!leftwidth {#c}}% + \else\iffifthargument + \edef\currentlayoutelement{#vertical:\v!text}% + \setlayoutelementparameter\c!lefttext + {\process_layout_element_double + \c!leftstyle \c!leftcolor \c!leftwidth {#horizontal}% + \c!rightstyle\c!rightcolor\c!rightwidth{#c}}% + \setlayoutelementparameter\c!righttext + {\process_layout_element_double + \c!rightstyle\c!rightcolor\c!rightwidth{#a}% + \c!leftstyle \c!leftcolor \c!leftwidth {#b}}% + \else\iffourthargument + \edef\currentlayoutelement{#vertical:#horizontal}% + \doifelsenothing{\detokenize{#a}} + {\resetlayoutelementparameter\c!lefttext} + {\setlayoutelementparameter\c!lefttext + {\process_layout_element_double + \c!leftstyle\c!leftcolor\c!leftwidth{#a}% + \c!leftstyle\c!leftcolor\c!leftwidth{#a}}}% + \doifelsenothing{\detokenize{#b}} + {\resetlayoutelementparameter\c!righttext} + {\setlayoutelementparameter\c!righttext + {\process_layout_element_double + \c!rightstyle\c!rightcolor\c!rightwidth{#b}% + \c!rightstyle\c!rightcolor\c!rightwidth{#b}}}% + \else\ifthirdargument + \edef\currentlayoutelement{#vertical:\v!text}% + \doifelsenothing{\detokenize{#horizontal}} + {\resetlayoutelementparameter\c!lefttext} + {\setlayoutelementparameter\c!lefttext + {\process_layout_element_double + \c!leftstyle\c!leftcolor\c!leftwidth{#horizontal}% + \c!leftstyle\c!leftcolor\c!leftwidth{#horizontal}}}% + \doifelsenothing{\detokenize{#a}} + {\resetlayoutelementparameter\c!righttext} + {\setlayoutelementparameter\c!righttext + {\process_layout_element_double + \c!rightstyle\c!rightcolor\c!rightwidth{#a}% + \c!rightstyle\c!rightcolor\c!rightwidth{#a}}}% + \else\ifsecondargument + \edef\currentlayoutelement{#vertical:\v!text}% + \resetlayoutelementparameter\c!lefttext + \resetlayoutelementparameter\c!righttext + \doifelsenothing{\detokenize{#horizontal}} + {\resetlayoutelementparameter\c!middletext} + {\setlayoutelementparameter\c!middletext + {\process_layout_element_single\c!style\c!color\c!width{#horizontal}}}% + \else + \edef\currentlayoutelement{#vertical:\v!text}% + \resetlayoutelementparameter\c!lefttext + \resetlayoutelementparameter\c!righttext + \resetlayoutelementparameter\c!middletext + \edef\currentlayoutelement{#vertical:\v!margin}% + \resetlayoutelementparameter\c!lefttext + \resetlayoutelementparameter\c!righttext + \resetlayoutelementparameter\c!middletext + \edef\currentlayoutelement{#vertical:\v!edge}% + \resetlayoutelementparameter\c!lefttext + \resetlayoutelementparameter\c!righttext + \resetlayoutelementparameter\c!middletext + \fi\fi\fi\fi\fi} + +% \def\setup_texts[#vertical][#horizontal][#a][#b][#c][#d]% +% {\ifsixthargument +% \edef\currentlayoutelement{#vertical:#horizontal}% +% \setlayoutelementparameter\c!lefttext +% {\process_layout_element_double +% \c!leftstyle \c!leftcolor \c!leftwidth {#a}% +% \c!rightstyle\c!rightcolor\c!rightwidth{#d}}% +% \setlayoutelementparameter\c!righttext +% {\process_layout_element_double +% \c!rightstyle\c!rightcolor\c!rightwidth{#b}% +% \c!leftstyle \c!leftcolor \c!leftwidth {#c}}% +% \else\iffifthargument +% \sixthargumenttrue +% \setup_texts[#vertical][\v!text][#horizontal][#a][#b][#c]% +% \else\iffourthargument +% \edef\currentlayoutelement{#vertical:#horizontal}% +% \doifelsenothing{\detokenize{#a}} +% {\resetlayoutelementparameter\c!lefttext} +% {\setlayoutelementparameter\c!lefttext +% {\process_layout_element_double +% \c!leftstyle\c!leftcolor\c!leftwidth{#a}% +% \c!leftstyle\c!leftcolor\c!leftwidth{#a}}}% +% \doifelsenothing{\detokenize{#b}} +% {\resetlayoutelementparameter\c!righttext} +% {\setlayoutelementparameter\c!righttext +% {\process_layout_element_double +% \c!rightstyle\c!rightcolor\c!rightwidth{#b}% +% \c!rightstyle\c!rightcolor\c!rightwidth{#b}}}% +% \else\ifthirdargument +% \fourthargumenttrue +% \setup_texts[#vertical][\v!text][#horizontal][#horizontal][][]% +% \else\ifsecondargument +% \edef\currentlayoutelement{#vertical:\v!text}% +% \resetlayoutelementparameter\c!lefttext +% \resetlayoutelementparameter\c!righttext +% \doifelsenothing{\detokenize{#horizontal}} +% {\resetlayoutelementparameter\c!middletext} +% {\setlayoutelementparameter\c!middletext +% {\process_layout_element_single\c!style\c!color\c!width{#horizontal}}}% +% \else +% \edef\currentlayoutelement{#vertical:\v!text}% +% \resetlayoutelementparameter\c!lefttext +% \resetlayoutelementparameter\c!righttext +% \resetlayoutelementparameter\c!middletext +% \edef\currentlayoutelement{#vertical:\v!margin}% +% \resetlayoutelementparameter\c!lefttext +% \resetlayoutelementparameter\c!righttext +% \resetlayoutelementparameter\c!middletext +% \edef\currentlayoutelement{#vertical:\v!edge}% +% \resetlayoutelementparameter\c!lefttext +% \resetlayoutelementparameter\c!righttext +% \resetlayoutelementparameter\c!middletext +% \fi\fi\fi\fi\fi} + +%D Left and right texts are swapped on odd and even pages, but +%D only when double sided typesetting is enabled. + +\unexpanded\def\process_layout_element_double + {\doifoddpageelse + \process_layout_element_double_odd + \process_layout_element_double_even} + +\def\process_layout_element_double_odd #lstyle#lstyle#lwidth#lcontent#rstyle#rcolor#rwidth#rcontent% + {\process_layout_element_single#lstyle#lstyle#lwidth{#lcontent}} + +\def\process_layout_element_double_even#lstyle#lstyle#lwidth#lcontent#rstyle#rcolor#rwidth#rcontent% + {\process_layout_element_single#rstyle#rcolor#rwidth{#rcontent}} + +%D The next macro will be cleaned up and made less messy and +%D dependent. + +\unexpanded\def\process_layout_element_single#style#color#width#content% + {\edef\layout_element_content{\detokenize{#content}}% + \ifx\layout_element_content\empty + % should not happen too often + \else + \process_layout_element_single_indeed#style#color#width{#content}% + \fi} + +\setvalue{\??tk:s:\v!yes}{\setstrut\strut} % maybe more variants + +\def\process_layout_element_single_indeed#style#color#width#content% + {\begingroup + \uselayoutelementstyleandcolor#style#color% + \csname\??tk:s:\layoutelementparameter\c!strut\endcsname + \ifcsname\??tk:p:\layout_element_content\endcsname + \csname\??tk:p:\layout_element_content\endcsname + \else + \edef\currentlayoutelementwidth{\layoutelementparameter#width}% + \ifx\currentlayoutelementwidth\empty + \expandafter\process_layout_element_single_normal + \else + \expandafter\process_layout_element_single_limited + \fi{#content}% + \fi + \endgroup} + +% {}{}{} prevents lookahead issues ... this will go away + +\def\process_layout_element_single_normal#content% + {\doifelsemarking\layout_element_content + {\getmarking[\layout_element_content][\v!first]} + {\ignorecrlf#content{}{}{}}} + +\def\process_layout_element_single_limited#content% + {\doifelsemarking\ascii + {\limitatetext{\getmarking[\layout_element_content][\v!first]}\currentlayoutelementwidth\unknown} + {\ignorecrlf\limitatetext{#content{}{}{}}\currentlayoutelementwidth\unknown}} + +\setvalue{\??tk:p:\v!pagenumber}{\place_layout_page_number} +\setvalue{\??tk:p:\v!date }{\currentdate} + +%D When specified, the texts are automatically limited in +%D length. + +\def\limitate_layout_element_text#width% + {\edef\currentlayoutelementwidth{\layoutelementparameter#width}% + \ifx\currentlayoutelementwidth\empty + \expandafter\firstofoneargument + \else + \expandafter\limitate_layout_element_text_indeed + \fi} + +\def\limitate_layout_element_text_indeed#content% + {\limitatetext{#content}\currentlayoutelementwidth\unknown} + +%D The placement of text is hooked into the token lists +%D associated to the area at hand. + +\appendtoks \place_layout_text_line\v!top \topheight \to \toptextcontent +\appendtoks \place_layout_text_line\v!header\headerheight \to \headertextcontent +\appendtoks \place_layout_text_line\v!text \textheight \to \texttextcontent +\appendtoks \place_layout_text_line\v!footer\footerheight \to \footertextcontent +\appendtoks \place_layout_text_line\v!bottom\bottomheight \to \bottomtextcontent + +%D Texts can be disabled, moved up and ignored, depending in +%D the \type {status} variable. This is handled by the next +%D couple of macros. + +\newcount\layout_element_state_n + +\def\set_layout_element_status#vertical% + {\layout_element_state_n=0\namedlayoutelementparameter#vertical\c!n\relax + \ifcase\layout_element_state_n + \edef\textlinestatus{\namedlayoutelementparameter#vertical\c!state}% + \else + \setxvalue{\namedlayoutelementhash#vertical\c!n}{\the\numexpr\layout_element_state_n+\minusone}% + \let\textlinestatus\v!stop + \fi} + +\appendtoks + \doifinset\v!header\floatspecification{\setxvalue{\namedlayoutelementhash\v!header\c!n}{1}}% + \doifinset\v!footer\floatspecification{\setxvalue{\namedlayoutelementhash\v!footer\c!n}{1}}% +\to \everybeforeflushedpagefloat + +\unexpanded\def\place_layout_text_line#vertical% + {\set_layout_element_status#vertical% + \csname\??tk:l:\ifcsname\??tk:l:\textlinestatus\endcsname\textlinestatus\else\s!unknown\fi\endcsname#vertical} + +\unexpanded\def\doifelselayouttextline#vertical% shown or not + {\edef\currentlayoutelementstate{\namedlayoutelementparameter{#vertical}\c!state}% + \ifx\currentlayoutelementstate\v!normal + \expandafter\firstoftwoarguments + \else\ifx\currentlayoutelementstate\v!start + \doubleexpandafter\firstoftwoarguments + \else + \doubleexpandafter\secondoftwoarguments + \fi\fi} + +\unexpanded\def\doifelselayoutsomeline#vertical% present or not + {\edef\currentlayoutelementstate{\namedlayoutelementparameter{#vertical}\c!state}% + \ifx\currentlayoutelementstate\v!none + \expandafter\secondoftwoarguments + \else\ifx\currentlayoutelementstate\v!high + \doubleexpandafter\secondoftwoarguments + \else + \doubleexpandafter\firstoftwoarguments + \fi\fi} + +\newconditional\resyncaftertextline + +\setvalue{\??tk:l:\v!normal}{\place_layout_text_line_indeed} +\setvalue{\??tk:l:\empty }{\place_layout_text_line_indeed} + +\letvalue{\??tk:l:\v!none}\gobbletwoarguments +\letvalue{\??tk:l:\v!stop}\gobbletwoarguments + +\setvalue{\??tk:l:\v!high}#vertical#height% + {\global\settrue\resyncaftertextline + \reset_layout_element_status#vertical} + +\setvalue{\??tk:l:\v!empty}#vertical#height% + {\reset_layout_element_status#vertical} + +\setvalue{\??tk:l:\v!start}#vertical#height% + {\reset_layout_element_status#vertical% + \place_layout_text_line_indeed#vertical#height} + +\setvalue{\??tk:l:\v!nomarking}#vertical#height% + {\bgroup + \reset_layout_element_status#vertical% + \settrue\inhibitgetmarking + \let\dogetmarking\nogetmarking % obsolete in new marking mechanism + \place_layout_text_line_indeed#vertical#height% + \egroup} + +\setvalue{\??tk:l:\s!unknown}#vertical#height% + {\global\settrue\resyncaftertextline + \begingroup % new + \reset_layout_element_status#vertical% + \csname\namedlayoutelementhash#vertical\textlinestatus\endcsname + \csname\namedlayoutelementhash#vertical\v!text \textlinestatus\endcsname + \csname\namedlayoutelementhash#vertical\v!margin\textlinestatus\endcsname + \csname\namedlayoutelementhash#vertical\v!edge \textlinestatus\endcsname + \place_layout_text_line_indeed#vertical#height% + \endgroup} + +%D The following macro has to be called after a page +%D is flushed. + +\def\resetlayouttextlines % public + {\csname\??tk:r:\v!top \endcsname + \csname\??tk:r:\v!header\endcsname + \csname\??tk:r:\v!text \endcsname + \csname\??tk:r:\v!footer\endcsname + \csname\??tk:r:\v!bottom\endcsname + \ifconditional\resyncaftertextline + \calculateglobalvsizes + \recalculatebackgrounds + \global\setfalse\resyncaftertextline + \fi} + +% \settext[header][text][middle][xxx][yyy] + +\def\settextcontent + {\doquintupleempty\set_text_content} + +\def\set_text_content[#vertical][#horizontal][#one][#two][#three]% header text middle text/text + {\iffifthargument + \setvalue{\namedlayoutelementhash{#vertical:#horizontal}\executeifdefined{\??tk:c:\c!text:#one}\c!middletext}% + {\process_layout_element_double + \c!leftstyle \c!leftcolor \c!leftwidth {#two}% + \c!rightstyle\c!rightcolor\c!rightwidth{#three}}% + \else\iffourthargument + \setvalue{\namedlayoutelementhash{#vertical:#horizontal}\executeifdefined{\??tk:c:\c!text:#one}\c!middletext}% + {\process_layout_element_double + \c!leftstyle \c!leftcolor \c!leftwidth {#two}% + \c!rightstyle\c!rightcolor\c!rightwidth{#two}}% + \else\ifthirdargument + \setvalue{\namedlayoutelementhash{#vertical:#horizontal}\c!middletext}% + {\process_layout_element_double + \c!leftstyle \c!leftcolor \c!leftwidth {#one}% + \c!rightstyle\c!rightcolor\c!rightwidth{#one}}% + \fi\fi\fi} + +\def\resettextcontent + {\dotripleempty\reset_text_content} + +\def\reset_text_content[#vertical][#horizontal][#tag]% header text middle + {\edef\currentlayoutelement{#vertical:#horizontal}% + \ifthirdargument + \letvalueempty{\layoutelementhash\executeifdefined{\??tk:c:\c!text:#tag}\c!middletext}% + \else\ifsecondargument + \resetlayoutelementparameter\c!lefttext + \resetlayoutelementparameter\c!middletext + \resetlayoutelementparameter\c!righttext + \fi\fi} + +\letvalue{\??tk:c:\c!middle:\c!text}\c!middletext +\letvalue{\??tk:c:\c!left :\c!text}\c!lefttext +\letvalue{\??tk:c:\c!right :\c!text}\c!righttext + +%D The placement of a whole line is handled by the next two +%D macros. These are hooked into the general purpose token +%D list registers mentioned before. + +\def\ignoredlinebreak{\unskip\space\ignorespaces} + +\def\place_layout_text_line_indeed#vertical#height% + {\let\currentlayouttextline#vertical% + \ifdim#height>\zeropoint\relax % prevents pagenumbers when zero height + \place_layout_text_line_left_or_right{#height}% + \fi} + +\def\place_layout_text_line_left_or_right#height% + {\goleftonpage +% \hbox{% + \setbox\layout_element_box\vbox to #height + {\vsize#height\relax + \normalbaselines + \let\\\ignoredlinebreak + \let\crlf\ignoredlinebreak + \namedlayoutelementparameter\currentlayouttextline\c!before + \doifbothsidesoverruled + \place_layout_text_line_right + \place_layout_text_line_right + \place_layout_text_line_left + \namedlayoutelementparameter\currentlayouttextline\c!after + \kern\zeropoint}% keep the \dp, beware of \vtops, never change this! + \dp\layout_element_box\zeropoint + \box\layout_element_box +% }% + \vskip-#height\relax} + +\let\extra_at_margin_left \plusone +\let\extra_at_margin_right\plustwo + +\let\place_layout_extra_text_left \relax % historic +\let\place_layout_extra_text_right\relax % historic + +\def\place_layout_text_line_right + {\hbox + {\ifdim\leftedgewidth>\zeropoint + \place_left_edge_layout_element\c!lefttext + \fi + \ifdim\leftmarginwidth>\zeropoint + \place_left_margin_layout_element\c!lefttext\extra_at_margin_left + \fi + \ifdim\makeupwidth>\zeropoint + \place_text_body_layout_element\c!lefttext\c!middletext\c!righttext\extra_at_margin_left + \fi + \ifdim\rightmarginwidth>\zeropoint + \place_right_margin_layout_element\c!righttext\extra_at_margin_left + \fi + \ifdim\rightedgewidth>\zeropoint + \place_right_edge_layout_element\c!lefttext + \fi}} + +\def\place_layout_text_line_left + {\hbox + {\ifdim\leftedgewidth>\zeropoint + \place_left_edge_layout_element\c!righttext + \fi + \ifdim\leftmarginwidth>\zeropoint + \place_left_margin_layout_element\c!righttext\extra_at_margin_right + \fi + \ifdim\makeupwidth>\zeropoint + \place_text_body_layout_element\c!righttext\c!middletext\c!lefttext\extra_at_margin_right + \fi + \ifdim\rightmarginwidth>\zeropoint + \place_right_margin_layout_element\c!lefttext\extra_at_margin_right + \fi + \ifdim\rightedgewidth>\zeropoint + \place_right_edge_layout_element\c!righttext + \fi}} + +\def\place_left_edge_layout_element#parameter% + {\edef\currentlayoutelement{\currentlayouttextline:\v!edge}% + \place_left_edge_layout_element_indeed\leftedgewidth + {\hss\layoutelementparameter#parameter}% + \hskip\leftedgedistance} + +\def\place_left_margin_layout_element#parameter#extrastate% + {\edef\currentlayoutelement{\currentlayouttextline:\v!margin}% + \place_left_edge_layout_element_indeed\leftmarginwidth + {\hbox to \leftmarginwidth{\hss\layoutelementparameter#parameter}% + \ifnum#extrastate=\extra_at_margin_left + \hskip-\leftmarginwidth + \hbox to \leftmarginwidth{\hss\layoutelementparameter\c!margintext}% + \fi}% + \hskip\leftmargindistance} + +\def\place_text_body_layout_element#left#middle#right#extrastate% + {\edef\currentlayoutelement{\currentlayouttextline:\v!text}% + \place_left_edge_layout_element_indeed\makeupwidth + {\hbox to \makeupwidth{\ifnum#extrastate=\extra_at_margin_left\place_layout_extra_text_left\fi\layoutelementparameter#left\hss}% + \hskip-\makeupwidth + \hbox to \makeupwidth{\hss\layoutelementparameter#middle\hss}% + \hskip-\makeupwidth + \hbox to \makeupwidth{\hss\layoutelementparameter#right\ifnum#extrastate=\extra_at_margin_right\place_layout_extra_text_right\fi}}} + +\def\place_right_margin_layout_element#parameter#extrastate% + {\edef\currentlayoutelement{\currentlayouttextline:\v!margin}% + \hskip\rightmargindistance + \place_left_edge_layout_element_indeed\rightmarginwidth + {\hbox to \rightmarginwidth{\layoutelementparameter#parameter\hss}% + \ifnum#extrastate=\extra_at_margin_right + \hskip-\rightmarginwidth + \hbox to \rightmarginwidth{\layoutelementparameter\c!margintext\hss}% + \fi}} + +\def\place_right_edge_layout_element#parameter% + {\edef\currentlayoutelement{\currentlayouttextline:\v!edge}% + \hskip\rightedgedistance + \place_left_edge_layout_element_indeed\rightedgewidth + {\layoutelementparameter#parameter\hss}} + +\def\place_left_edge_layout_element_indeed#width#content% + {\vbox % to \vsize + {\hsize#1\relax + \layoutelementparameter\c!before + \setlayoutcomponentattribute\currentlayoutelement + \hbox \layoutcomponentboxattribute to #width{#content}% + \layoutelementparameter\c!after}} + +%D Although it is far better to use backgrounds for this +%D purpose, one can add a rule in the following way. This +%D method makes the rules disappear in case of an empty text +%D line. Consider this a feature. +%D +%D \starttyping +%D \setupheadertexts[left][right] +%D +%D \setupheader[text][after=\hrule,style=bold] +%D +%D \starttext +%D \input tufte \page +%D \setupheader[state=empty] +%D \input tufte \page +%D \stoptext +%D \stoptyping + +%D This code will move to \type {page-flt.tex}. + +\appendtoks \placerightmarginblock \hskip-\rightmarginwidth \to \rightmargintextcontent +\appendtoks \placeleftmarginblock \hskip-\leftmarginwidth \to \leftmargintextcontent + +%D The next hook will later be used for keeping track of +%D positions, i.e.\ it will provide a proper (page +%D dependent) reference point. + +\ifx\undefined\placepositionanchors + \unexpanded\def\placepositionanchors{\vskip\textheight} +\fi + +%D \macros +%D {definetext} +%D +%D Some macros ago, we implemented the \type {status} option +%D \type {unknown}. This one is used to take care of +%D symbolic texts handlers. +%D +%D \showsetup{definetext} +%D +%D The next example demonstrates how we can use this +%D mechanism to provide page (event) dependent text lines. +%D +%D \starttyping +%D \definetext[chapter][footer][pagenumber] +%D \setuphead[chapter][header=high,footer=chapter] +%D \setupheadertexts[pagenumber] +%D \setupfootertexts[left][right] +%D \chapter{eerste} \dorecurse{20}{\input tufte \relax} +%D \chapter{tweede} \dorecurse{20}{\input tufte \relax} +%D \stoptyping + +\unexpanded\def\definetext + {\doseventupleempty\define_text} + +\def\define_text[#tag][#vertical][#horizontal][#a][#b][#c][#d]% + {\ifseventhargument + \setvalue{\namedlayoutelementhash{#vertical:#horizontal}#tag}% + {\dosixtupleempty\setup_texts[#vertical][#horizontal][#a][#b][#c][#d]}% + \else\ifsixthargument + \setvalue{\namedlayoutelementhash{#vertical}#tag}% + {\dosixtupleempty\setup_texts[#vertical][#horizontal][#a][#b][#c]}% + \else\iffifthargument + \setvalue{\namedlayoutelementhash{#vertical:#horizontal}#tag}% + {\dosixtupleempty\setup_texts[#vertical][#horizontal][#a][#b]}% + \else\iffourthargument + \setvalue{\namedlayoutelementhash{#vertical}#tag}% + {\dosixtupleempty\setup_texts[#vertical][#horizontal][#a]}% + \else + \setvalue{\namedlayoutelementhash{#vertical}#tag}% + {\dosixtupleempty\setup_texts[#vertical][#horizontal]}% + \fi\fi\fi\fi} + +%D A few more page breakers: + +\installpagebreakhandler \v!empty + {\page_otr_flush_all_floats + \gotonextpage + \doifnot{\namedlayoutelementparameter\v!header\c!state}\v!stop{\setuplayoutelement[\v!header][\c!state=\v!empty]}% + \doifnot{\namedlayoutelementparameter\v!footer\c!state}\v!stop{\setuplayoutelement[\v!footer][\c!state=\v!empty]}% + \page_otr_insert_dummy_page} + +\installpagebreakhandler \v!header + {\doifnot{\namedlayoutelementparameter\v!header\c!state}\v!stop{\setuplayoutelement[\c!state=\v!empty]}} + +\installpagebreakhandler \v!footer + {\doifnot{\namedlayoutelementparameter\v!footer\c!state}\v!stop{\setuplayoutelement[\c!state=\v!empty]}} + +%D While the header and footer lines are moved away from the +%D main text, the top and bottom lines are centered. + +\setuplayoutelement[\v!top ][\c!state=\v!normal,\c!n=0,\c!before=\vss,\c!after=\vss,\c!strut=] +\setuplayoutelement[\v!header][\c!state=\v!normal,\c!n=0,\c!before=, \c!after=\vss,\c!strut=\v!yes] +\setuplayoutelement[\v!text ][\c!state=\v!normal,\c!n=0,\c!before=\vss,\c!after=\vss,\c!strut=] +\setuplayoutelement[\v!footer][\c!state=\v!normal,\c!n=0,\c!before=\vss,\c!after=, \c!strut=\v!yes] +\setuplayoutelement[\v!bottom][\c!state=\v!normal,\c!n=0,\c!before=\vss,\c!after=\vss,\c!strut=] + +%D Moved here from strc-pag: + +% We reset a previous location but only when it has a pagenumber +% associated. This is a rather messy test but better than the MkII +% way where we use states and keep settings. + +\let\layout_page_number_location \relax +\let\layout_page_number_location_v\relax +\let\layout_page_number_location_h\relax +\let\layout_page_number_location_x\relax + +\def\place_layout_page_number % also elsewhere .. beware, not \unexpanded else + {\placelocationpagenumber} % test below fails + +\def\reset_layout_page_number_location + {\ifx\layout_page_number_location_v\relax\else + \edef\currentlayoutelement{\layout_page_number_location_v:\layout_page_number_location_h}% + \edef\previous_page_number_locator{\detokenizedlayoutelementparameter\layout_page_number_location_x}% + \doif{\meaning\previous_page_number_locator}{\meaning\place_layout_page_number} + {\resetlayoutelementparameter\layout_page_number_location_x}% + \fi} + +\def\set_layout_page_number_location + {\edef\currentlayoutelement{\layout_page_number_location_v:\layout_page_number_location_h}% + \letlayoutelementparameter\layout_page_number_location_x\place_layout_page_number + \ifx\layout_page_number_location_x\c!marginedgetext + \let\place_layout_extra_text_left \place_layout_page_number_left + \let\place_layout_extra_text_right\place_layout_page_number_right + \else + \let\place_layout_extra_text_left \relax + \let\place_layout_extra_text_right\relax + \fi} + +\def\identify_layout_page_number_location + {\let\layout_page_number_location_v\v!footer + \let\layout_page_number_location_h\v!text + \let\layout_page_number_location_x\c!middletext + \processallactionsinset[\@@nmlocation] + [ \v!header=>\let\layout_page_number_location_v\v!header, + \v!footer=>\let\layout_page_number_location_v\v!footer, + \v!middle=>\let\layout_page_number_location_h\v!text + \let\layout_page_number_location_x\c!middletext, + \v!left=>\let\layout_page_number_location_h\v!text + \let\layout_page_number_location_x\c!lefttext, + \v!right=>\let\layout_page_number_location_h\v!text + \let\layout_page_number_location_x\c!righttext, + \v!inleft=>\let\layout_page_number_location_h\v!margin + \let\layout_page_number_location_x\c!lefttext, + \v!inright=>\let\layout_page_number_location_h\v!margin + \let\layout_page_number_location_x\c!righttext, + \v!inmargin=>\let\layout_page_number_location_h\v!margin + \def\layout_page_number_location_x{\ifdoublesided\c!margintext\else\c!righttext\fi}, + \v!margin=>\let\layout_page_number_location_h\v!margin + \def\layout_page_number_location_x{\ifdoublesided\c!margintext\else\c!righttext\fi}, + \v!atmargin=>\let\layout_page_number_location_h\v!text + \let\layout_page_number_location_x\c!marginedgetext, + \v!marginedge=>\let\layout_page_number_location_h\v!text + \let\layout_page_number_location_x\c!marginedgetext]} + +\unexpanded\def\dosetpagenumberlocation + {\ifx\@@nmlocation\layout_page_number_location + % unchanged + \else + \let\layout_page_number_location\@@nmlocation + \reset_layout_page_number_location + \ifx\@@nmlocation\empty + % set otherwise + \else + \identify_layout_page_number_location + \set_layout_page_number_location + \fi + \fi} + +\def\place_layout_page_number_left % historic + {\begingroup + \setbox\scratchbox\normalhbox{\ignorespaces\layoutelementparameter\c!marginedgetext\removeunwantedspaces}% + \ifzeropt\wd\scratchbox\else + \doifelsenothing\@@nmwidth + {\box\scratchbox\tfskip} + {\hbox to \@@nmwidth{\box\scratchbox\hss}}% + \fi + \endgroup} + +\def\place_layout_page_number_right % historic + {\begingroup + \setbox\scratchbox\normalhbox{\ignorespaces\layoutelementparameter\c!marginedgetext\removeunwantedspaces}% + \ifzeropt\wd\scratchbox\else + \doifelsenothing\@@nmwidth + {\tfskip\box\scratchbox} + {\hbox to \@@nmwidth{\hss\box\scratchbox}}% + \fi + \endgroup} + +\dosetpagenumberlocation + +% will go to page-box.mkiv + +% the next macros will be redone (less boxing) + +\newbox\layout_element_box + +\def\gettextboxes % will become \place_layout_elements + {\ifcase\pageornamentstate + \place_layout_elements_indeed + \fi} + +\def\place_layout_elements_indeed + {\setbox\layout_element_box\vbox + {\dontcomplain + \calculatereducedvsizes + \swapmargins + \offinterlineskip + \vskip\dimexpr-\topheight-\topdistance\relax + \the\toptextcontent + \vskip\dimexpr\topheight+\topdistance\relax + \the\headertextcontent + \vskip\dimexpr\headerheight+\headerdistance\relax + \placepositionanchors + \vskip-\textheight + \the\texttextcontent + \vskip\textheight + \the\everyendoftextbody + \vskip\footerdistance + \the\footertextcontent + \vskip\dimexpr\footerheight+\bottomdistance\relax + \the\bottomtextcontent + \vskip\bottomheight + \vfilll}% + \smashbox\layout_element_box + \box\layout_element_box} + +\def\getmainbox#1#2% + {\setbox\layout_element_box\vbox + {\offinterlineskip + \calculatereducedvsizes + \calculatehsizes + \swapmargins + \vskip\dimexpr\headerheight+\headerdistance+\layoutparameter\c!textdistance\relax + \dontleavehmode + \hbox to \makeupwidth + {\bgroup + \swapmargins + \goleftonpage + \ifdim\leftedgewidth>\zeropoint + \the\leftedgetextcontent + \hskip\leftedgewidth + \fi + \hskip\leftedgedistance + \ifdim\leftmarginwidth>\zeropoint + \the\leftmargintextcontent + \hskip\leftmarginwidth + \fi + \hskip\leftmargindistance + \egroup + \mkprocesspagecontents{#2}% + \settextpagecontent\layout_element_box{#1}{#2}% + \page_backgrounds_add_to_text\layout_element_box + \page_grids_add_to_box\layout_element_box + \box\layout_element_box + \bgroup + \hskip\rightmargindistance + \ifdim\rightmarginwidth>\zeropoint + \the\rightmargintextcontent + \hskip\rightmarginwidth + \fi + \hskip\rightedgedistance + \ifdim\rightedgewidth>\zeropoint + \the\rightedgetextcontent + \hskip\rightedgewidth + \fi + \egroup + \hss}}% + \smashbox\layout_element_box + \box\layout_element_box} + +%D The main text area has to be combined with some additional +%D (tracing) information. + +% will be stored as normal and overloaded in page-lyr and later in +% page-spr we overload the the stored version .. evenatually i will +% clear up the experimental mess + +\def\settextpagecontent#1#2#3% #2 and #3 will disappear + {\setbox#1\hbox to \makeupwidth + {\hss % so don't change this + \setlayoutcomponentattribute{\v!page:\v!text}% + \vbox \layoutcomponentboxattribute to \textheight + {\offinterlineskip + \freezetextwidth + \hsize\textwidth % local variant of \sethsize + \boxmaxdepth\maxdepth + \noindent % content can be < \hsize + \dopagecontents#2#3}% + \hss}% + \dp#1\zeropoint} + +\protect \endinput + diff --git a/tex/context/base/page-var.mkiv b/tex/context/base/page-var.mkiv new file mode 100644 index 000000000..1c7fd5b25 --- /dev/null +++ b/tex/context/base/page-var.mkiv @@ -0,0 +1,20 @@ +%D \module +%D [ file=page-var, +%D version=2011.12.05, % moved from other page-* files +%D title=\CONTEXT\ Page Macros, +%D subtitle=Variables, +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +\writestatus{loading}{ConTeXt Page Macros / Variables} + +\unprotect + +% just for temporary moved variables + +\protect \endinput diff --git a/tex/context/base/phys-dim.lua b/tex/context/base/phys-dim.lua index 9b9b59372..c47821b1c 100644 --- a/tex/context/base/phys-dim.lua +++ b/tex/context/base/phys-dim.lua @@ -79,6 +79,8 @@ local padding = P("=") local plus = P("+") local minus = P("-") local space = P(" ") +local lparent = P("(") +local rparent = P(")") local digits = digit^1 @@ -286,6 +288,7 @@ local long_units = { -- other non-SI units (Table 8) Bar = "bar", + Hg = "mercury", -- ["Millimetre Of Mercury"] = [[mmHg]], Angstrom = "angstrom", -- strictly Ångström ["Nautical Mile"] = "nauticalmile", @@ -443,7 +446,7 @@ local short_suffixes = { -- maybe just raw digit match local symbol_units = { Degrees = "degree", Degree = "degree", - Deg = "degree", + -- Deg = "degree", ["°"] = "degree", ArcMinute = "arcminute", ["′"] = "arcminute", -- 0x2032 @@ -457,6 +460,7 @@ local symbol_units = { local packaged_units = { Micron = "micron", + mmHg = "millimetermercury", } -- rendering: @@ -471,8 +475,10 @@ local unitsS = context.unitsS local unitsO = context.unitsO local unitsN = context.unitsN local unitsC = context.unitsC +local unitsQ = context.unitsQ local unitsNstart = context.unitsNstart local unitsNstop = context.unitsNstop +local unitsNspace = context.unitsNspace local labels = languages.data.labels @@ -531,6 +537,8 @@ labels.units = { ohm = { labels = { en = [[Ω]] } }, -- 0x2126 \textohm siemens = { labels = { en = [[S]] } }, weber = { labels = { en = [[Wb]] } }, + mercury = { labels = { en = [[Hg]] } }, + millimetermercury = { labels = { en = [[mmHg]] } }, -- connected tesla = { labels = { en = [[T]] } }, henry = { labels = { en = [[H]] } }, celsius = { labels = { en = [[\checkedtextcelsius]] } }, -- 0x2103 @@ -553,7 +561,6 @@ labels.units = { atomicmassunit = { labels = { en = [[u]] } }, astronomicalunit = { labels = { en = [[ua]] } }, bar = { labels = { en = [[bar]] } }, --- ["Millimetre Of Mercury"] = { labels = { en = [[mmHg]] } }, angstrom = { labels = { en = [[Å]] } }, -- strictly Ångström nauticalmile = { labels = { en = [[M]] } }, barn = { labels = { en = [[b]] } }, @@ -727,8 +734,10 @@ local function update_parsers() -- todo: don't remap utf sequences -- nothing = Cc(""), somespace = somespace, - nospace = (1-somespace)^0, - ignore = P(-1), + nospace = (1-somespace)^1, -- was 0 + -- ignore = P(-1), + -- + qualifier = Cs(V("somespace") * (lparent/"") * (1-rparent)^1 * (rparent/"")), -- somesymbol = V("somespace") * (p_symbol/dimsym) @@ -736,9 +745,9 @@ local function update_parsers() -- todo: don't remap utf sequences somepackaged = V("somespace") * (V("packaged") / dimpre) * V("somespace"), - someunknown = V("somespace") - * (V("nospace")/unitsU) - * V("somespace"), + -- someunknown = V("somespace") + -- * (V("nospace")/unitsU) + -- * V("somespace"), -- combination = V("longprefix") * V("longunit") -- centi meter + V("nothing") * V("longunit") @@ -752,36 +761,45 @@ local function update_parsers() -- todo: don't remap utf sequences + (V("longsuffix") * V("combination")) / dimspu + (V("combination") * (V("shortsuffix") + V("nothing"))) / dimpus ) + * (V("qualifier") / unitsQ)^-1 * V("somespace"), operator = V("somespace") * ((V("longoperator") + V("shortoperator")) / dimop) * V("somespace"), - snippet = V("somesymbol") - * V("dimension") - + V("dimension") + snippet = V("dimension") + V("somesymbol"), - unit = V("snippet")^1 - * (V("operator") * V("snippet"))^-1 -- V("snippet")^1 ? - + V("somesymbol") - + V("somepackaged") - + V("someunknown") - + V("ignore"), + unit = ( + V("snippet") + * (V("operator") * V("snippet"))^0 + + V("somepackaged") + )^1, } --- lpeg.print(unitparser) -- 20111127: 2384 long - local number = lpeg.patterns.number + -- local number = lpeg.patterns.number local number = Cs( P("$") * (1-P("$"))^1 * P("$") + P([[\m{]]) * (1-P("}"))^1 * P("}") + (1-R("az","AZ")-P(" "))^1 -- todo: catch { } -- not ok ) / unitsN - local p_c_unitdigitparser = (Cc(nil)/unitsNstart) * p_c_dparser * (Cc(nil)/unitsNstop) -- - local c_p_unitdigitparser = (Cc(nil)/unitsNstart) * c_p_dparser * (Cc(nil)/unitsNstop) -- + local start = Cc(nil) / unitsNstart + local stop = Cc(nil) / unitsNstop + local space = Cc(nil) / unitsNspace + + local p_c_combinedparser = P { "start", + number = start * dleader * (p_c_dparser + number) * stop, + rule = V("number")^-1 * unitparser, + space = space, + start = V("rule") * (V("space") * V("rule"))^0 + V("number") + } - local p_c_combinedparser = dleader * (p_c_unitdigitparser + number)^-1 * unitparser - local c_p_combinedparser = dleader * (c_p_unitdigitparser + number)^-1 * unitparser + local c_p_combinedparser = P { "start", + number = start * dleader * (c_p_dparser + number) * stop, + rule = V("number")^-1 * unitparser, + space = space, + start = V("rule") * (V("space") * V("rule"))^0 + V("number") + } return p_c_combinedparser, c_p_combinedparser end @@ -798,10 +816,15 @@ function commands.unit(str,p_c) p_c_parser, c_p_parser = update_parsers() dirty = false end + local ok if p_c == v_reverse then - matchlpeg(p_c_parser,str) + ok = matchlpeg(p_c_parser,str) else - matchlpeg(c_p_parser,str) + ok = matchlpeg(c_p_parser,str) + end + if not ok then + report_units("unable to parse: %s",str) + context(str) end end diff --git a/tex/context/base/phys-dim.mkiv b/tex/context/base/phys-dim.mkiv index b31d746ba..a82badb91 100644 --- a/tex/context/base/phys-dim.mkiv +++ b/tex/context/base/phys-dim.mkiv @@ -13,7 +13,7 @@ \registerctxluafile{phys-dim}{} -% todo: optional space between 'connected' symbols +% TAGGING NEEDS CHECKING ... WILL DO WHEN PARSER IS OK \unprotect @@ -170,9 +170,9 @@ \unexpanded\def\digitsseparatorspace{\hphantom{.}} \unexpanded\def\digitssignspace {\hphantom{\digitsminus}} \unexpanded\def\digitshighspace {\hphantom{\digitspositive}} -\unexpanded\def\digitspower {\digits_raised} -\unexpanded\def\digitspowerplus #1{\digits_raised{\digitsplus#1}} -\unexpanded\def\digitspowerminus #1{\digits_raised{\digitsminus#1}} +\unexpanded\def\digitspower #1{\times10\digits_raised{#1}} +\unexpanded\def\digitspowerplus #1{\times10\digits_raised{\digitsplus#1}} +\unexpanded\def\digitspowerminus #1{\times10\digits_raised{\digitsminus#1}} \unexpanded\def\digitsdigit #1{#1} \unexpanded\def\normaldigitscommasymbol {,} @@ -380,12 +380,13 @@ {\setvalue{\??un:2:#1}{#2}} \unexpanded\def\dounitsspace - {\edef\currentunitsspace{\unitparameter\c!space}% + {\unskip % weird, why is unskip needed + \edef\currentunitsspace{\unitparameter\c!space}% \csname\??un:2:% \ifcsname\??un:2:\currentunitsspace\endcsname\currentunitsspace\else\v!normal\fi \endcsname} -\installunitsspace\v!normal {\unitsbigspace} +\installunitsspace\v!normal {\unitsmediumspace} \installunitsspace\v!big {\unitsbigspace} \installunitsspace\v!medium {\unitsmediumspace} \installunitsspace\v!small {\unitssmallspace} @@ -411,7 +412,7 @@ \let\operatorlanguage\unitlanguage \the\everyunits %\removeunwantedspaces % not ok yet - \dosetunitattributes\c!style\c!color + \useunitstyleandcolor\c!style\c!color \edef\currentunitsalternative{\unitparameter\c!alternative}% \ifmmode \ifx\currentunitsalternative\v!text @@ -470,22 +471,45 @@ {\ctxcommand{unit(\!!bs\detokenize{#1}\!!es,"\unitparameter\c!order")}} \unexpanded\def\unitsPUS#1#2#3{\units_next\prefixtext{#1}\unittext{#2}\unitsraise{\suffixtext{#3}}\c_units_state\plusone} % suffix -\unexpanded\def\unitsPU #1#2{\units_next\prefixtext{#1}\unittext{#2}\c_units_state\plusthree} % unit +\unexpanded\def\unitsPU #1#2{\units_next\prefixtext{#1}\unittext{#2}\c_units_state\plusthree} % unit \unexpanded\def\unitsPS #1#2{\units_next\prefixtext{#1}\unitsraise{\suffixtext{#2}}\c_units_state\plusone} % suffix \unexpanded\def\unitsUS #1#2{\units_next\unittext{#1}\unitsraise{\suffixtext{#2}}\c_units_state\plusone} % suffix -\unexpanded\def\unitsP #1{\units_next\prefixtext{#1}1\c_units_state\plusfour} % prefix -\unexpanded\def\unitsU #1{\units_next\unittext{#1}\c_units_state\plusthree} % unit +\unexpanded\def\unitsP #1{\units_next\prefixtext{#1}1\c_units_state\plusfour} % prefix +\unexpanded\def\unitsU #1{\units_next\unittext{#1}\c_units_state\plusthree} % unit \unexpanded\def\unitsS #1{\units_start{}\unitsraise{\suffixtext{#1}}\c_units_state\plusone} % suffix -\unexpanded\def\unitsO #1{\units_start\operatortext{#1}\c_units_state\plustwo} % operator -\unexpanded\def\unitsN #1{\units_start#1\c_units_state\plusfive} % number -\unexpanded\def\unitsC #1{\removeunwantedspaces\unittext{#1}\c_units_state\plussix} % connected +\unexpanded\def\unitsO #1{\units_start\operatortext{#1}\c_units_state\plustwo} % operator +\unexpanded\def\unitsN #1{\units_start#1\c_units_state\plusfive} % number +\unexpanded\def\unitsC #1{\removeunwantedspaces\unittext{#1}\c_units_state\plussix} % connected +\unexpanded\def\unitsQ #1{\removeunwantedspaces\unitslower{#1}\c_units_state\zerocount} % + +% Fonts can have a celsius and lack a fahrenheit symbol and as we want +% to be consistent so we check for the counterparts as well. It's slow +% but ok. Of course we could go virtual instead. + +\def\text_fallback_prime {\textacute} +\def\text_fallback_doubleprime{\textacute\kern-.25em\textacute} +\def\text_fallback_celsius {°C} +\def\text_fallback_fahrenheit {°F} + +\unexpanded\def\checkedtextprime + {\iffontchar\font"2032\relax\iffontchar\font"2033\relax + ′\else\text_fallback_prime\fi\else\text_fallback_prime + \fi} + +\unexpanded\def\checkedtextdoubleprime + {\iffontchar\font"2033\relax\iffontchar\font"2032\relax + ″\else\text_fallback_doubleprime\fi\else\text_fallback_doubleprime + \fi} -% hm, textacute also not present in some fonts +\unexpanded\def\checkedtextcelsius + {\iffontchar\font"2103\relax\iffontchar\font"2109\relax + ℉\else\text_fallback_celsius\fi\else\text_fallback_celsius + \fi} -\unexpanded\def\checkedtextprime {\iffontchar\font"2032′\else\textacute\fi} -\unexpanded\def\checkedtextdoubleprime{\iffontchar\font"2033″\else\textacute\kern-.25em\textacute\fi} -\unexpanded\def\checkedtextcelsius {\iffontchar\font"2103℃\else °C\fi} -\unexpanded\def\checkedtextfahrenheit {\iffontchar\font"2109℉\else °F\fi} +\unexpanded\def\checkedtextfahrenheit + {\iffontchar\font"2109\relax\iffontchar\font"2103\relax + ℉\else\text_fallback_fahrenheit\fi\else\text_fallback_fahrenheit + \fi} \setelementnature[unit] [mixed] \setelementnature[quantity][mixed] @@ -507,6 +531,9 @@ \fi \c_units_state\plusfive} +\unexpanded\def\unitsNspace + {\space} + \unexpanded\def\unitsN#1% {\unitsNstart#1\unitsNstop} diff --git a/tex/context/base/ppchtex.mkiv b/tex/context/base/ppchtex.mkiv index 33a20fb68..c5993d234 100644 --- a/tex/context/base/ppchtex.mkiv +++ b/tex/context/base/ppchtex.mkiv @@ -3396,11 +3396,11 @@ RT##3##4##5=>\processchemicaltextelement{RN}{##3##4##5}{#1}{0}{}, drawoptions (\chemicalattributes) ; \stopMPdrawing} -\def\@@dochemicalcolor - {\doifsomething\@@chemicalcolor{\color[\@@chemicalcolor]}} +\unexpanded\def\@@dochemicalcolor + {\dousecolorparameter\@@chemicalcolor} -\def\@@dochemicalstyle - {\doconvertfont\@@chemicalstyle} +\unexpanded\def\@@dochemicalstyle + {\dousestyleparameter\@@chemicalstyle} \setupchemical [\c!rulethickness=\linewidth, diff --git a/tex/context/base/s-fnt-10.mkiv b/tex/context/base/s-fnt-10.mkiv index a104e6b7d..0d4a608a4 100644 --- a/tex/context/base/s-fnt-10.mkiv +++ b/tex/context/base/s-fnt-10.mkiv @@ -135,7 +135,7 @@ end \page \egroup} -% \doifnotmode{demo} {\endinput} +\doifnotmode{demo} {\endinput} \starttext diff --git a/tex/context/base/s-pre-50.tex b/tex/context/base/s-pre-50.tex index 03c612779..ff3e48631 100644 --- a/tex/context/base/s-pre-50.tex +++ b/tex/context/base/s-pre-50.tex @@ -76,7 +76,7 @@ %D Trick. Nowadays we can use streams. -\installoutput\FlushStep +\installoutputroutine\FlushStep {\StartStep\unvbox\normalpagebox\StopStep} %D Demo. diff --git a/tex/context/base/scrn-but.mkvi b/tex/context/base/scrn-but.mkvi index 693996d8a..1a5d0f0f6 100644 --- a/tex/context/base/scrn-but.mkvi +++ b/tex/context/base/scrn-but.mkvi @@ -812,41 +812,33 @@ \unexpanded\def\scrn_menu_leftedge {\hbox to \leftedgewidth \bgroup \hsize\leftedgewidth - %\csname\??tk\v!leftedge\c!left\endcsname \settrue\scrn_menu_zerodimensions \scrn_menu_insert\v!left - %\csname\??tk\v!leftedge\c!right\endcsname \egroup \hskip-\leftedgewidth} \unexpanded\def\scrn_menu_rightedge {\hbox to \rightedgewidth \bgroup \hsize\rightedgewidth - %\csname\??tk\v!rightedge\c!left\endcsname \settrue\scrn_menu_zerodimensions \scrn_menu_insert\v!right - %\csname\??tk\v!rightedge\c!right\endcsname \egroup \hskip-\rightedgewidth} -\unexpanded\def\scrn_menu_top % uses \??tk +\unexpanded\def\scrn_menu_top {\vbox to \topheight \bgroup \vsize\topheight - %\csname\??tk\v!top\c!before\endcsname \settrue\scrn_menu_zerodimensions \scrn_menu_insert\v!top - %\csname\??tk\v!top\c!after\endcsname \kern\zeropoint \egroup \vskip-\topheight} -\unexpanded\def\scrn_menu_bottom % uses \??tk +\unexpanded\def\scrn_menu_bottom {\vbox to \bottomheight \bgroup \vsize\bottomheight - %\csname\??tk\v!bottom\c!before\endcsname \settrue\scrn_menu_zerodimensions \scrn_menu_insert\v!bottom - %\csname\??tk\v!bottom\c!after\endcsname \kern\zeropoint \egroup \vskip-\bottomheight} diff --git a/tex/context/base/scrn-fld.mkvi b/tex/context/base/scrn-fld.mkvi index 02cf5afca..00c5ff36e 100644 --- a/tex/context/base/scrn-fld.mkvi +++ b/tex/context/base/scrn-fld.mkvi @@ -110,7 +110,7 @@ \the\everysetupforms} \appendtoks - \ctxcommand{setformsmethod("@@frmethod")}% + \ctxcommand{setformsmethod("\@@frmethod")}% \to \everysetupforms \setupforms @@ -128,10 +128,8 @@ \def\scrn_symbols_preset_indeed#tag% {\doifobjectfoundelse{SYM}{#tag} {} - {\settightobject{SYM}{#tag}\hbox{\symbol[#tag]}% - \flushatshipout - {\setbox0\hbox{\hskip-\maxdimen\getobject{SYM}{#tag}}% - \smashbox0\box0}}} + {\settightobject{SYM}{#tag}\hbox{\symbol[#tag]}% % todo: set this as immediate xform + \page_otr_add_special_content{\hskip-\maxdimen\getobject{SYM}{#tag}}}} % and then force it into the file \let\dosetfieldsymbol\scrn_symbols_preset_indeed @@ -140,7 +138,7 @@ \unexpanded\def\definedefaultsymbols % used ? {\definesymbol[defaultyes][\mathematics{\times}]% - \definesymbol[defaultno ][\mathematics{\cdot }]} + \definesymbol[defaultno] [\mathematics{\cdot }]} % \def\resetfieldsymbol[#tag]% for experimental usage only % {\resetobject{SYM}{#tag}} @@ -219,7 +217,7 @@ \ifx\currentfieldbackgroundcolor\empty\else \getcolorattributevalue\currentfieldbackgroundcolor\currentfieldbackgroundcolorvalue \fi - \dosetfieldbodyattributes\c!style\c!color + \usefieldbodystyleandcolor\c!style\c!color \ctxcommand{insertfield("\currentfieldbody", { title = "\currentfieldbody", width = \number\dimexpr\fieldbodyparameter\c!width \relax, @@ -944,14 +942,14 @@ \getinteractionmenuparameter \inheritedinteractionmenuframed \setinteractionmenuparameter - \dosetinteractionmenuattributes} + \useinteractionmenustyleandcolor} \def\scrn_rollbutton_symbol_b {\scrn_rollbutton_symbol_indeed \getbuttonparameter \inheritedbuttonframed \setbuttonparameter - \dosetbuttonattributes} + \usebuttonstyleandcolor} \def\scrn_rollbutton[#tag][#settings]#text[#reference]% {\dontleavehmode @@ -991,14 +989,14 @@ \fitfield[rollbutton:\number\scrn_rollbutton_n_button]% \egroup} -\unexpanded\def\scrn_rollbutton_symbol_indeed#getparameter#inheritedframed#setparameter#dosetattributes#what#text% +\unexpanded\def\scrn_rollbutton_symbol_indeed#getparameter#inheritedframed#setparameter#usestyleandcolor#what#text% {\definecolor[rollover][rollover:#what]% \doifelse{#what}{n}% ? {\doifelse{#getparameter\c!alternative}\v!hidden\phantom\hbox}\hbox {#setparameter\c!framecolor {rollover}% #setparameter\c!backgroundcolor{rollover}% #setparameter\c!color {rollover}% - #inheritedframed{#dosetattributes\c!style\c!color{#text}}}} + #inheritedframed{#usestyleandcolor\c!style\c!color{#text}}}} %D We plug into the menu system diff --git a/tex/context/base/scrn-ini.mkvi b/tex/context/base/scrn-ini.mkvi index 3c8ef1321..a5a50cddd 100644 --- a/tex/context/base/scrn-ini.mkvi +++ b/tex/context/base/scrn-ini.mkvi @@ -122,27 +122,27 @@ {\ifnum\referencepagestate=\plusone \edef\askedcontrastcolor{\interactionparameter\c!contrastcolor}% \ifx\askedcontrastcolor\empty - \dosetinteractioncolorattribute\c!color + \useinteractioncolorparameter\c!color \else - \dosetinteractioncolorattribute\c!contrastcolor + \useinteractioncolorparameter\c!contrastcolor \fi \else % we could just set and if > 0 set again - \dosetinteractioncolorattribute\c!color + \useinteractioncolorparameter\c!color \fi} \def\setlocationfont % not grouped ! - {\dosetinteractionfontattribute\c!style} + {\useinteractionstyleparameter\c!style} \def\setlocationattributes % not grouped ! {\ifnum\referencepagestate=\plusone \edef\askedcontrastcolor{\interactionparameter\c!contrastcolor}% \ifx\askedcontrastcolor\empty - \dosetinteractionattributes\c!style\c!color + \useinteractionstyleandcolor\c!style\c!color \else - \dosetinteractionattributes\c!style\c!contrastcolor + \useinteractionstyleandcolor\c!style\c!contrastcolor \fi \else % we could just set and if > 0 set again - \dosetinteractionattributes\c!style\c!color + \useinteractionstyleandcolor\c!style\c!color \fi} \def\setlocationcolorspec#1% \resolver diff --git a/tex/context/base/spac-chr.lua b/tex/context/base/spac-chr.lua index 430996ffd..b8a428aaf 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 +-- beware: attribute copying is bugged ... there will be a proper luatex helper +-- for this + -- to be redone: characters will become tagged spaces instead as then we keep track of -- spaceskip etc @@ -21,6 +24,7 @@ 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 +local copy_node_list = node.copy_list local nodepool = nodes.pool local tasks = nodes.tasks @@ -56,28 +60,38 @@ local function inject_quad_space(unicode,head,current,fraction) if fraction ~= 0 then fraction = fraction * fontparameters[current.font].quad end - head, current = insert_node_after(head,current,new_glue(fraction)) - current.attr = attr - set_attribute(current,a_character,unicode) + local glue = new_glue(fraction) +-- glue.attr = copy_node_list(attr) + glue.attr = attr +current.attr = nil + set_attribute(glue,a_character,unicode) + head, current = insert_node_after(head,current,glue) return head, current end local function inject_char_space(unicode,head,current,parent) local attr = current.attr local char = fontcharacters[current.font][parent] - head, current = insert_node_after(head,current,new_glue(char and char.width or fontparameters[current.font].space)) - current.attr = attr - set_attribute(current,a_character,unicode) + local glue = new_glue(char and char.width or fontparameters[current.font].space) +-- glue.attr = copy_node_list(current.attr) + glue.attr = current.attr +current.attr = nil + set_attribute(glue,a_character,unicode) + head, current = insert_node_after(head,current,glue) return head, current 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 - set_attribute(current,a_character,unicode) + local glue = new_glue(space,spacestretch,spaceshrink) + local penalty = new_penalty(10000) +-- glue.attr = copy_node_list(attr) + glue.attr = attr +current.attr = nil +-- penalty.attr = attr + set_attribute(glue,a_character,unicode) + head, current = insert_node_after(head,current,penalty) + head, current = insert_node_after(head,current,glue) return head, current end diff --git a/tex/context/base/spac-def.mkiv b/tex/context/base/spac-def.mkiv index 9c9bdf687..32978076f 100644 --- a/tex/context/base/spac-def.mkiv +++ b/tex/context/base/spac-def.mkiv @@ -15,25 +15,33 @@ \unprotect +\newconstant\c_spac_default_tolerance \c_spac_default_tolerance 1500 + \def\forgeteverypar {\everypar{\the\neverypar}} +% worth trying: +% +% \def\forgeteverypar +% {\everypar\neverypar} + \def\forgetparindent {\forgeteverypar \indentfirstparagraphtrue % recently added - \let\currentindentation\v!none \ctxparindent\zeropoint - \parindent\zeropoint\relax} + \parindent\zeropoint + \let\currentindentation\v!none} \def\forgetparskip - {\let\currentwhitespace\v!none - \ctxparskip\zeropoint - \parskip\zeropoint\relax} + {\ctxparskip\zeropoint + \parskip\zeropoint + \let\currentwhitespace\v!none} \def\forgetbothskips - {\tolerance1500 + {\tolerance\c_spac_default_tolerance \leftskip\zeropoint - \rightskip\zeropoint\relax} + \rightskip\zeropoint + \relax} \def\forgetspacing {\emergencystretch\zeropoint} diff --git a/tex/context/base/spac-fnt.mkiv b/tex/context/base/spac-fnt.mkiv index ada7c2efc..873641929 100644 --- a/tex/context/base/spac-fnt.mkiv +++ b/tex/context/base/spac-fnt.mkiv @@ -13,94 +13,25 @@ \writestatus{loading}{ConTeXt Spacing Macros / Fonts} -%D For historic reasons here, will move and/or disappear: +%D For historic reasons we keep the following around but +%D they are no longer that relevant for \MKIV. The name of +%D this module is somewhat weird, but it happened that these +%D macros were defined in a larger one with the same name. \unprotect -\newconditional \parbasedattributes % this will change .. old mkii stuff - -\def\finishparbasedattributes - {\ifconditional\parbasedattributes - \setfalse\parbasedattributes - \par - \fi} - -\def\dostopparbasedattributes - {\settrue\parbasedattributes - \dostopattributes} - -\let\dostopattributes\relax % in case these commands end up in an edef - -\unexpanded\def\@@dostopattributes - {\stopcolor - \finishparbasedattributes - \endgroup} - -\unexpanded\def\@@nostopattributes - {\finishparbasedattributes - \endgroup} - \unexpanded\def\doattributes#1#2#3#4% - {\dostartattributes{#1}{#2}{#3}{#4}\dostopattributes} - -% An even faster \ETEX\ version: - -\unexpanded\def\dostartattributes#1#2#3% {\begingroup % geen \bgroup, anders in mathmode lege \hbox - \ifincolor - \ifcsname#1#3\endcsname - \let\dostopattributes\@@dostopattributes - \faststartcolor[\csname#1#3\endcsname]% - \else - \let\dostopattributes\@@nostopattributes - \fi - \else - \let\dostopattributes\@@nostopattributes - \fi - \ifcsname#1#2\endcsname - % \@EAEAEA\doconvertfont\@EA\@EA\csname#1#2\endcsname - \@EA\doconvertfont\csname#1#2\@EA\endcsname - \fi} - -\unexpanded\def\@@dostopattributes - {\faststopcolor - \finishparbasedattributes - \endgroup} - -\unexpanded\def\@@nostopattributes - {\finishparbasedattributes + \dousestylehashparameter{#1}{#2}% + \dousecolorhashparameter{#1}{#3}% + #4% \endgroup} -%D Bonus macro, see core-sec.tex - -\newconditional\fontattributeisset - -\unexpanded\def\dosetfontattribute#1#2% - {\ifcsname#1#2\endcsname - \settrue\fontattributeisset % reset is done elsewhere - \@EA\doconvertfont\csname#1#2\@EA\endcsname - \fi\empty} - -%D Since this happens a lot, and sometimes large arguments -%D are passed in \type {#4}, we just copy some code: - -\unexpanded\def\doattributes#1#2#3#4% +\unexpanded\def\dostartattributes#1#2#3#4% nothing is done with #4 any longer {\begingroup % geen \bgroup, anders in mathmode lege \hbox - \ifincolor - \ifcsname#1#3\endcsname - \let\dostopattributes\@@dostopattributes - \faststartcolor[\csname#1#3\endcsname]% - \else - \let\dostopattributes\endgroup - \fi - \else - \let\dostopattributes\endgroup - \fi - \ifcsname#1#2\endcsname - % \@EAEAEA\doconvertfont\@EA\@EA\csname#1#2\endcsname - \@EA\doconvertfont\csname#1#2\@EA\endcsname - \fi - {#4}% - \dostopattributes} + \dousestylehashparameter{#1}{#2}% + \dousecolorhashparameter{#1}{#3}} + +\let\dostopattributes\endgroup \protect \endinput diff --git a/tex/context/base/spac-hor.mkiv b/tex/context/base/spac-hor.mkiv index e3496e923..2e5884325 100644 --- a/tex/context/base/spac-hor.mkiv +++ b/tex/context/base/spac-hor.mkiv @@ -47,7 +47,7 @@ \definecomplexorsimple\setupindenting -\def\complexsetupindenting[#1]% +\unexpanded\def\complexsetupindenting[#1]% {\edef\currentindenting{#1}% \ifx\currentindenting\empty \else \doapplycurrentindenting diff --git a/tex/context/base/spac-ver.mkiv b/tex/context/base/spac-ver.mkiv index 6cd435e8b..c43e49853 100644 --- a/tex/context/base/spac-ver.mkiv +++ b/tex/context/base/spac-ver.mkiv @@ -17,7 +17,7 @@ \registerctxluafile{spac-ver}{1.001} -\newskip\blankskip \blankskip=\bigskipamount +\newskip\blankskip \blankskip=\bigskipamount \def\skipfactor {.75} \def\skipgluefactor{.25} @@ -92,15 +92,15 @@ \dosetupspecifiedinterlinespaceindeed} \def\dosetupspecifiedinterlinespaceindeed - {\edef\strutheightfactor {\interlinespaceparameter\c!height}% - \edef\strutdepthfactor {\interlinespaceparameter\c!depth}% + {\edef\strutheightfactor {\interlinespaceparameter\c!height }% + \edef\strutdepthfactor {\interlinespaceparameter\c!depth }% \edef\minimumstrutheight {\interlinespaceparameter\c!minheight}% - \edef\minimumstrutdepth {\interlinespaceparameter\c!mindepth}% - \edef\minimumlinedistance{\interlinespaceparameter\c!distance}% - \edef\normallineheight {\interlinespaceparameter\c!line}% - \edef\topskipfactor {\interlinespaceparameter\c!top}% - \edef\maxdepthfactor {\interlinespaceparameter\c!bottom}% - \edef\baselinegluefactor {\interlinespaceparameter\c!stretch}% + \edef\minimumstrutdepth {\interlinespaceparameter\c!mindepth }% + \edef\minimumlinedistance{\interlinespaceparameter\c!distance }% + \edef\normallineheight {\interlinespaceparameter\c!line }% + \edef\topskipfactor {\interlinespaceparameter\c!top }% + \edef\maxdepthfactor {\interlinespaceparameter\c!bottom }% + \edef\baselinegluefactor {\interlinespaceparameter\c!stretch }% % often topskip does more bad than good, so: \ifx\topskipfactor\v!height \let\topskipfactor\strutheightfactor @@ -140,8 +140,8 @@ \let\setrelativeinterlinespace\relax -\newtoks \everysetupglobalinterlinespace -\newtoks \everysetuplocalinterlinespace +\newtoks\everysetupglobalinterlinespace +\newtoks\everysetuplocalinterlinespace \def\interlinespaceparameter #1{\csname\dointerlinespaceparameter{\??it\currentinterlinespace}#1\endcsname} \def\dointerlinespaceparameter #1#2{\ifcsname#1#2\endcsname#1#2\else\expandafter\dointerlinespaceparentparameter\csname#1\s!parent\endcsname#2\fi} @@ -227,19 +227,27 @@ \definecomplexorsimple\setupinterlinespace -\def\removelastskip % a redefinition of plain +\def\removelastskip {\ifvmode\ifdim\lastskip=\zeropoint\else\vskip-\lastskip\fi\fi} -\def\doifoutervmode#1% - {\ifvmode\ifinner\else#1\fi\fi} +\def\doifoutervmode + {\ifvmode + \ifinner + \doubleexpandafter\gobbleoneargument + \else + \doubleexpandafter\firstofoneargument + \fi + \else + \expandafter\gobbleoneargument + \fi} \def\dosomebreak#1% {\doifoutervmode {\scratchskip\lastskip \removelastskip - %\leavevmode\type{#1}% #1\relax - \ifdim\scratchskip=\zeropoint % else interference with footnotes + \ifdim\scratchskip=\zeropoint + % avoid interference with footnotes \else \vskip\scratchskip \fi}} @@ -252,88 +260,11 @@ \ifhmode\endgraf\fi \ifvmode\nointerlineskip\vskip#1\relax\fi} -\ifx\smallskip\undefined - - \def\smallskip{\vskip\smallskipamount} - \def\medskip {\vskip\medskipamount} - \def\bigskip {\vskip\bigskipamount} - -\fi - -\ifx\allowbreak\undefined - - \def\break {\penalty\ifhmode-\plustenthousand\else\ejectpenalty\fi} - \def\nobreak {\penalty \plustenthousand} - \def\allowbreak{\penalty \zeropoint} - \def\filbreak {\par\vfil\penalty-200\vfilneg} - \def\goodbreak {\par\penalty-500 } - -\fi - -%D Made slightly more readable: - -\ifx\vglue\undefined - - \def\vglue {\afterassignment\dovglue\scratchskip=} - \def\hglue {\afterassignment\dohglue\scratchskip=} - \def\topglue{\nointerlineskip\vglue-\topskip\vglue} - - \def\dovglue - {\par - \scratchdimen\prevdepth - \hrule\!!height\zeropoint - \nobreak - \vskip\scratchskip - \prevdepth\scratchdimen} - - \def\dohglue - {\dontleavehmode % \leavevmode - \scratchcounter\spacefactor - \vrule\!!width\zeropoint - \nobreak - \hskip\scratchskip - \spacefactor\scratchcounter} - -\fi - -\ifx\eject\undefined - - \def\eject{\par\break} - -\fi - -\ifx\supereject\undefined +\unexpanded\def\smallskip{\vskip\smallskipamount} +\unexpanded\def\medskip {\vskip\medskipamount} +\unexpanded\def\bigskip {\vskip\bigskipamount} - \def\supereject{\par\penalty\superpenalty} - -\fi - -\ifx\dosupereject\undefined - - \def\dosupereject - {\ifnum\insertpenalties>\zerocount % something is being held over - \line{} - \kern-\topskip - \nobreak - \vfill\supereject - \fi} - -\fi - -%D We adapt plain's \type {\removelastskip} a bit: - -\ifx\removelastskip\undefined - - \def\removelastskip - {\ifvmode \ifdim\lastskip=\zeropoint \else - \vskip-\lastskip - \fi \fi} - -\fi - -\ifx\smallbreak\undefined - -\def\smallbreak +\unexpanded\def\smallbreak {\par \ifdim\lastskip<\smallskipamount \removelastskip @@ -341,7 +272,7 @@ \smallskip \fi} -\def\medbreak +\unexpanded\def\medbreak {\par \ifdim\lastskip<\medskipamount \removelastskip @@ -349,7 +280,7 @@ \medskip \fi} -\def\bigbreak +\unexpanded\def\bigbreak {\par \ifdim\lastskip<\bigskipamount \removelastskip @@ -357,18 +288,49 @@ \bigskip \fi} -\fi - +\unexpanded\def\break {\penalty-\plustenthousand} % can be hmode or vmode +\unexpanded\def\nobreak {\penalty \plustenthousand} % can be hmode or vmode +\unexpanded\def\allowbreak{\penalty \zeropoint} % can be hmode or vmode +\unexpanded\def\goodbreak {\par\penalty-500\relax} % forces vmode +\unexpanded\def\filbreak {\par\vfil\penalty-200\vfilneg} % forces vmode + +%D Made slightly more readable: + +\unexpanded\def\vglue {\afterassignment\spacing_vglue_indeed\scratchskip=} +\unexpanded\def\hglue {\afterassignment\spacing_hglue_indeed\scratchskip=} +\unexpanded\def\topglue{\nointerlineskip\vglue-\topskip\vglue} + +\def\spacing_vglue_indeed + {\par + \scratchdimen\prevdepth + \hrule\!!height\zeropoint + \nobreak + \vskip\scratchskip + \prevdepth\scratchdimen} + +\def\spacing_hglue_indeed + {\dontleavehmode % \leavevmode + \scratchcounter\spacefactor + \vrule\!!width\zeropoint + \nobreak + \hskip\scratchskip + \spacefactor\scratchcounter} + +%D We adapt plain's \type {\removelastskip} a bit: + +\unexpanded\def\removelastskip % also in supp-box + {\ifvmode\ifzeropt\lastskip\else\vskip-\lastskip\fi\fi} + \newskip\ctxparskip \ctxparskip\zeropoint \newconditional \flexiblewhitespace \settrue\flexiblewhitespace -\def\currentwhitespace {\zeropoint} +\def\currentwhitespace{\zeropoint} \definecomplexorsimple\setupwhitespace \def\simplesetupwhitespace - {\doifnot\currentwhitespace\v!none\dosetupwhitespace} + {\doifnot\currentwhitespace\v!none\spacing_setup_whitespace} \def\complexsetupwhitespace[#1]% {\edef\nextcurrentwhitespace{#1}% @@ -376,67 +338,52 @@ \simplesetupwhitespace \else \let\currentwhitespace\nextcurrentwhitespace - \dosetupwhitespace + \spacing_setup_whitespace \fi} \newconstant\baselinegridmode % option in layout / 1=permit_half_lines -\def\dosetupwhitespace % quick test for no list - {\ifcsname\??ws\??ws\currentwhitespace\endcsname - \csname\??ws\??ws\currentwhitespace\endcsname +\def\spacing_setup_whitespace % quick test for no list + {\ifcsname\??wz:\currentwhitespace\endcsname + \csname\??wz:\currentwhitespace\endcsname \else - \expandafter\processcommalist\expandafter[\currentwhitespace]\dowhitespacemethod % can be raw + \expandafter\processcommalist\expandafter[\currentwhitespace]\spacing_setup_whitespace_method % can be raw \fi\relax \ifgridsnapping - \setfalse\flexiblewhitespace - \ifdim\ctxparskip>\zeropoint - \ctxparskip - \ifcase\baselinegridmode - \baselineskip % normal ! ! ! ! !! - \or - \ifdim\scratchdimen=\baselineskip % maybe range - \baselineskip % normal ! ! ! ! !! - \else - \numexpr\ctxparskip/\dimexpr.5\lineheight\relax\relax\dimexpr.5\lineheight\relax - \fi - \else - \baselineskip % normal ! ! ! ! !! - \fi - \fi + \spacing_setup_whitespace_grid \else - \ifconditional\flexiblewhitespace \else \ctxparskip1\ctxparskip \fi + \spacing_setup_whitespace_normal \fi \parskip\ctxparskip} -\def\dodosetupwhitespace - {\ifgridsnapping - \setfalse\flexiblewhitespace +\def\spacing_setup_whitespace_normal + {\ifconditional\flexiblewhitespace \else \ctxparskip1\ctxparskip - \ifdim\ctxparskip>\zeropoint + \fi} + +\def\spacing_setup_whitespace_grid + {\setfalse\flexiblewhitespace + \ifdim\ctxparskip>\zeropoint + \ctxparskip \ifcase\baselinegridmode - \ctxparskip\baselineskip % normal ! ! ! ! !! + \baselineskip % normal ! ! ! ! !! \or \ifdim\scratchdimen=\baselineskip % maybe range - \ctxparskip\baselineskip % normal ! ! ! ! !! + \baselineskip % normal ! ! ! ! !! \else - \ctxparskip\numexpr\ctxparskip/\dimexpr.5\lineheight\relax\relax\dimexpr.5\lineheight\relax + \numexpr\ctxparskip/\dimexpr.5\lineheight\relax\relax\dimexpr.5\lineheight\relax \fi \else - \ctxparskip\baselineskip % normal ! ! ! ! !! + \baselineskip % normal ! ! ! ! !! \fi - \fi - \else - \ifconditional\flexiblewhitespace \else \ctxparskip1\ctxparskip \fi - \fi - \parskip\ctxparskip} - -\definesystemvariable {ws} % whitespace + \fi} -\unexpanded\def\definewhitespacemethod[#1]#2{\setvalue{\??ws\??ws#1}{#2}} +\unexpanded\def\definewhitespacemethod[#1]#2{\setvalue{\??wz:#1}{#2}} \definewhitespacemethod [\v!fix] {} \definewhitespacemethod [\v!fixed] {\setfalse\flexiblewhitespace} -\definewhitespacemethod [\v!flexible] {\settrue\flexiblewhitespace} +\definewhitespacemethod [\v!flexible] {\settrue \flexiblewhitespace} + \definewhitespacemethod [\v!line] {\ctxparskip \baselineskip} \definewhitespacemethod [\v!halfline] {\ctxparskip.5\baselineskip} \definewhitespacemethod [\v!none] {\ctxparskip \zeropoint} @@ -444,13 +391,22 @@ \definewhitespacemethod [\v!medium] {\ctxparskip \medskipamount} \definewhitespacemethod [\v!small] {\ctxparskip \smallskipamount} -\definewhitespacemethod [\s!default] {\simplesetupwhitespace} % {\stelwitruimteopnieuwin} +\definewhitespacemethod [\s!default] {\simplesetupwhitespace} -\def\dowhitespacemethod#1% - {\ifcsname\??ws\??ws#1\endcsname\csname\??ws\??ws#1\endcsname\else\ctxparskip#1\fi\relax} +\def\spacing_setup_whitespace_method#1% + {\ifcsname\??wz:#1\endcsname + \csname\??wz:#1\endcsname + \else + \ctxparskip#1\fi + \relax} -\def\nowhitespace{\vspacing[\v!nowhite]} -\def\whitespace {\vspacing[\v!white]} +% \definewhitespacemethod [\s!unknown] {\ctxparskip\commalistelement\relax} +% +% \def\spacing_setup_whitespace_method#1% +% {\csname\??wz:\ifcsname\??wz:#1\endcsname#1\else\s!unknown\endcsname\relax} + +\unexpanded\def\nowhitespace{\vspacing[\v!nowhite]} +\unexpanded\def\whitespace {\vspacing[\v!white]} % De onderstaande macro handelt ook de situatie dat er geen % tekst tussen \start ... \stop is geplaatst. Daartoe wordt de @@ -461,9 +417,9 @@ \newcount\packeddepth \unexpanded\def\startpacked - {\dosingleempty\dostartpacked} + {\dosingleempty\spacing_start_packed} -\def\dostartpacked[#1]% nesting afvangen +\def\spacing_start_packed[#1]% nesting afvangen {\global\advance\packeddepth\plusone \par \ifnum\packeddepth=\plusone \ifvmode @@ -519,16 +475,16 @@ \doaroundlinecorrection \egroup} -\def\correctwhitespace +\unexpanded\def\correctwhitespace {\dowithnextbox {\startbaselinecorrection \flushnextbox \stopbaselinecorrection}% \vbox} - -\def\verticalstrut {\normalvbox{\hsize\zeropoint\forgetall\strut}} -\def\horizontalstrut{\normalhbox {\strut}} - + +\unexpanded\def\verticalstrut {\normalvbox{\hsize\zeropoint\forgetall\strut}} +\unexpanded\def\horizontalstrut{\normalhbox {\strut}} + % Hieronder volgen enkele instellingen en macro's ten behoeve % van de interlinie en \strut. De waarden 2.8, 0.07, 0.72 en % 0.28 zijn ooit eens ontleend aan INRS-TEX en moeten wellicht @@ -581,15 +537,15 @@ \def\baselinefactor {2.8} \def\baselinegluefactor {0} -\def\minimumstrutheight {0pt} -\def\minimumstrutdepth {0pt} +\def\minimumstrutheight {\zeropoint} +\def\minimumstrutdepth {\zeropoint} \def\normallineheight {\baselinefactor ex} \def\minimumlinedistance {\lineskip} -\def\strutheight {0pt} -\def\strutdepth {0pt} -\def\strutwidth {0pt} +\def\strutheight {\zeropoint} +\def\strutdepth {\zeropoint} +\def\strutwidth {\zeropoint} \let\spacingfactor \plusone @@ -599,19 +555,15 @@ \def\systemtopskipfactor {\topskipfactor} \def\systemmaxdepthfactor {\maxdepthfactor} -\ifdefined\globalbodyfontsize\else - \newdimen\globalbodyfontsize - \globalbodyfontsize=12pt +\ifdefined\globalbodyfontsize \else + \newdimen\globalbodyfontsize + \globalbodyfontsize=12pt \fi -\ifdefined\normalizedbodyfontsize\else - \def\normalizedbodyfontsize{12pt} +\ifdefined\normalizedbodyfontsize \else + \def\normalizedbodyfontsize{12pt} \fi -% door een \dimen. Dit is geen probleem omdat (1) de default -% korpsgrootte 12pt is en (2) de fonts nog niet geladen zijn -% en de instellingen bij het laden nogmaals plaatsvinden. - \def\topskipcorrection {\simpletopskipcorrection \vskip-\struttotal @@ -624,14 +576,14 @@ \vskip-\openstrutheight \fi} -\def\settopskip % the extra test is needed for the lbr family +\unexpanded\def\settopskip % the extra test is needed for the lbr family {\topskip\systemtopskipfactor\globalbodyfontsize \ifgridsnapping \else \ifr@ggedbottom\!!plus5\globalbodyfontsize\fi \fi -\ifgridsnapping - \topskip\zeropoint -\fi + \ifgridsnapping + \topskip\zeropoint + \fi \relax % the skip \topskipgap\topskip \advance\topskipgap -\openstrutheight\relax @@ -639,21 +591,21 @@ \ifdim\topskip<\minimumstrutheight \topskip\minimumstrutheight\relax \fi - \else + \else \ifdim\topskip<\strutheightfactor\openlineheight \topskip\strutheightfactor\openlineheight\relax \fi - \fi} + \fi} -\def\setmaxdepth +\unexpanded\def\setmaxdepth {\maxdepth\systemmaxdepthfactor\globalbodyfontsize} -\def\normalbaselines +\unexpanded\def\normalbaselines {\baselineskip \normalbaselineskip \lineskip \normallineskip \lineskiplimit\normallineskiplimit} -\def\setnormalbaselines +\unexpanded\def\setnormalbaselines {\ifdim\normallineheight>\zeropoint \lineheight\normallineheight \fi @@ -678,13 +630,10 @@ \fi \normallineskip\minimumlinedistance\relax % \onepoint\relax \normallineskiplimit\zeropoint\relax - \normalbaselines - %\dosetupgridsnapping - } + \normalbaselines} -\def\spacing#1% +\unexpanded\def\spacing#1% {\ifgridsnapping - %\ifdim#1\points=\onepoint\else\showmessage\m!layouts{11}{\withoutpt\the\dimexpr#1\points\relax}\fi \let\spacingfactor\plusone \else \edef\spacingfactor{#1}% @@ -722,15 +671,11 @@ % % \def\strut{\relax\ifmmode\copy\else\unhcopy\fi\strutbox} -\ifx\strutbox\undefined - - \newbox\strutbox +\newbox\strutbox - \setbox\strutbox\normalhbox{\vrule height8.5pt depth3.5pt width\zeropoint} +\setbox\strutbox\normalhbox{\vrule height8.5pt depth3.5pt width\zeropoint} % just a start - \def\strut{\relax\ifmmode\copy\else\unhcopy\fi\strutbox} - -\fi +\def\strut{\relax\ifmmode\copy\else\unhcopy\fi\strutbox} \let\normalstrut\strut @@ -791,13 +736,13 @@ %D Handy for math (used in mathml): -\def\charhtstrut +\unexpanded\def\charhtstrut {\begingroup \setcharstrut{GJY}% \vrule\!!width\zeropoint\!!depth\zeropoint\!!height\strutht \endgroup} -\def\chardpstrut +\unexpanded\def\chardpstrut {\begingroup \setcharstrut{gjy}% \vrule\!!width\zeropoint\!!depth\strutdp\!!height\zeropoint @@ -810,31 +755,49 @@ \newdimen\tempstrutdimen -\def\dosetstrut +% \unexpanded\def\dosetstrut +% {\let\strut\normalstrut +% \tempstrutdimen\dimexpr\strutht+\strutdp-\lineheight\relax +% \ifabsnum\tempstrutdimen<\plustwo +% % compensate rounding error /- 1sp to avoid too many +% % 1sp baselineskips in for instance verbatim +% \strutht\dimexpr\strutht-\tempstrutdimen\relax +% \fi +% \edef\strutheight{\the\strutht}% maybe better \number\strutht sp +% \edef\strutdepth {\the\strutdp}% +% \ifdim\strutwidth=\zeropoint +% \dosetstruthide +% \else +% \dosetstrutvide +% \fi +% \struttotal\dimexpr\strutht+\strutdp\relax} + +\unexpanded\def\dosetstrut {\let\strut\normalstrut - \tempstrutdimen\dimexpr\strutht+\strutdp-\lineheight\relax - \ifabsnum\tempstrutdimen<\plustwo - % compensate rounding error /- 1sp to avoid too many - % 1sp baselineskips in for instance verbatim - \strutht\dimexpr\strutht-\tempstrutdimen\relax + \ifabsnum\dimexpr\strutht+\strutdp-\lineheight\relax<\plustwo + % compensate rounding error /- 1sp to avoid too many + % 1sp baselineskips in for instance verbatim + \strutht\dimexpr\lineheight-\strutdp\relax + \struttotal\lineheight + \else + \struttotal\dimexpr\strutht+\strutdp\relax \fi - \edef\strutheight{\the\strutht}% maybe better \number\strutht sp + \edef\strutheight{\the\strutht}% \edef\strutdepth {\the\strutdp}% \ifdim\strutwidth=\zeropoint \dosetstruthide \else \dosetstrutvide - \fi - \struttotal\dimexpr\strutht+\strutdp\relax} + \fi} -\def\dosetstruthide +\unexpanded\def\dosetstruthide {\setbox\strutbox\normalhbox {\vrule \!!width \zeropoint \!!height\strutht \!!depth \strutdp}} -\def\dosetstrutvide +\unexpanded\def\dosetstrutvide {\setbox\strutbox\normalhbox {\normalhbox to \zeropoint {% \hss % new, will be option @@ -852,12 +815,12 @@ \newbox\emptystrutbox \setbox\emptystrutbox\emptyhbox -\def\dosetstruthide +\unexpanded\def\dosetstruthide {\setbox\strutbox\copy\emptystrutbox \ht\strutbox\strutht \dp\strutbox\strutdp} -\def\strut{\relax\dontleavehmode\copy\strutbox} % still callbacks for \hbox{\strut} +\unexpanded\def\strut{\relax\dontleavehmode\copy\strutbox} % still callbacks for \hbox{\strut} \let\normalstrut\strut @@ -893,7 +856,7 @@ \def\showstruts {\setteststrut \settestcrlf} - + \def\setteststrut {\def\strutwidth{.8pt}% \setstrut} @@ -917,7 +880,7 @@ \newsignal\strutsignal \setfalse\sigstruts -\def\begstrut +\unexpanded\def\begstrut {\relax\ifcase\strutht\else \ifconditional\sigstruts \noindent\horizontalstrut @@ -932,11 +895,14 @@ \expandafter \ignorespaces \fi} -\def\endstrut +\unexpanded\def\endstrut {\relax\ifhmode\ifcase\strutht\else \ifconditional\sigstruts \ifdim\lastskip=\strutsignal - \unskip\unskip\unpenalty\setbox\scratchbox\lastbox + \unskip + \unskip + \unpenalty + \setbox\scratchbox\lastbox \else \normalpenalty\plustenthousand \normalhskip\zeropoint @@ -1040,11 +1006,6 @@ \leavevmode \fi\fi} -% We stellen enkele penalties anders in dan Plain TEX: -% -% \widowpenalty=\defaultwidowpenalty\relax -% \clubpenalty =\defaultclubpenalty \relax - \def\resetpenalties#1% {\ifdefined#1% #1\minusone @@ -1410,7 +1371,7 @@ {\setbox\nextbox#1% {\hbox {\hbox to \zeropoint - {\setlayoutcomponentattribute\v!grid\v!test + {\setlayoutcomponentattribute{\v!grid:\v!test}% \color[grid:#2]{\ruledhbox \layoutcomponentboxattribute {\fakebox\nextbox}}% \hss}% \flushnextbox}}} @@ -1810,7 +1771,7 @@ \whitespace \dostarttagged\t!lines\currentlines \begingroup - \dosetlinesattributes\c!style\c!color + \uselinesstyleandcolor\c!style\c!color \setupindenting[\linesparameter\c!indenting]% \setupalign[\linesparameter\c!align]% \typesettinglinestrue diff --git a/tex/context/base/status-files.pdf b/tex/context/base/status-files.pdf Binary files differindex 3b3b029d1..0bdc57a12 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 93d4231cb..4cc70bb77 100644 --- a/tex/context/base/status-lua.pdf +++ b/tex/context/base/status-lua.pdf diff --git a/tex/context/base/strc-blk.mkiv b/tex/context/base/strc-blk.mkiv index b8f8c6b3a..bb9e7563e 100644 --- a/tex/context/base/strc-blk.mkiv +++ b/tex/context/base/strc-blk.mkiv @@ -71,8 +71,8 @@ \doblocksetups\currentblock \let\doblocksetups\gobbleoneargument \namedblockparameter\currentblock\c!before - \dosetfontattribute{\??tb\currentblock}\c!style - \dosetcolorattribute{\??tb\currentblock}\c!color + \dousestylehashparameter{\??tb\currentblock}\c!style + \dousecolorhashparameter{\??tb\currentblock}\c!color \namedblockparameter\currentblock\c!inner \ignorespaces} diff --git a/tex/context/base/strc-des.mkiv b/tex/context/base/strc-des.mkiv index 18467fb41..cd2cbc12f 100644 --- a/tex/context/base/strc-des.mkiv +++ b/tex/context/base/strc-des.mkiv @@ -105,11 +105,11 @@ \def\dodescriptionparentparameterhash#1#2% {\ifx#1\relax\else\dodescriptionparameterhash#1#2\fi} -\def\dosetdescriptionattributes#1#2% style color - {\edef\fontattributehash {\descriptionparameterhash#1}% - \edef\colorattributehash{\descriptionparameterhash#2}% - \ifx\fontattributehash \empty\else\dosetfontattribute \fontattributehash #1\fi - \ifx\colorattributehash\empty\else\dosetcolorattribute\colorattributehash#2\fi} +\def\usedescriptionstyleandcolor#1#2% style color + {\edef\currentstyleparameter{\descriptionparameter#1}% + \edef\currentcolorparameter{\descriptionparameter#2}% + \ifx\currentstyleparameter\empty\else\dousestyleparameter\currentstyleparameter\fi + \ifx\currentcolorparameter\empty\else\dousecolorparameter\currentcolorparameter\fi} % typesetting code @@ -392,7 +392,7 @@ \dorechecknextindentation} \def\@@dodescription - {\dosetdescriptionattributes\c!style\c!color + {\usedescriptionstyleandcolor\c!style\c!color \ignorespaces} % starters: @@ -455,10 +455,6 @@ % % % % % % % % % % % % -% helpers - -% todo: \dosetfontattributewithhash \descriptionparameterhash\c!headstyle - % setup descriptions \unexpanded\def\setupdescriptions @@ -474,6 +470,50 @@ \def\dodosetupdescriptions[#1]% [#2]% {\getparameters[\??dd#1]} % [#2]} +\setupdescriptions + [\c!location=\v!left, + \c!headstyle=\v!bold, + \c!titlestyle=\v!bold, + \c!style=\v!normal, + \c!color=, + \c!headcolor=, + \c!titlecolor=, + %\c!width=8em, + %\c!distance=0pt, + \c!titledistance=0.5em, + \c!hang=, + \c!sample=, + \c!align=, + \c!headalign=, + \c!margin=\v!no, + \c!before=\blank, + \c!inbetween=\blank, + \c!after=\blank, + \c!indentnext=\v!yes, + \c!indenting=\v!never, + \c!titleleft=(, + \c!titleright=), + \c!closesymbol=, + \c!closecommand=\wordright, + \c!display=\v!yes, + \c!command=, + \c!titlecommand=] + +\setupdescriptions + [\c!expansion=\v!no, + \c!xmlsetup=, + \s!catcodes=, + \c!saveinlist=\v!yes] + +\setupdescriptions + [\c!width=7em, + \c!distance=1em] + +\setupdescriptions[\c!width:\c!top=\localhsize] % undocumented, only width and distance +% \setupdescriptions[\c!width:\c!left=7em,\c!distance=1em] +% \setupdescriptions[\c!width:\c!right=7em,\c!distance=1em] +% \setupdescriptions[\c!width:\v!hanging=\v!fit] % yes or no + % define descriptions \unexpanded\def\definedescription @@ -544,7 +584,7 @@ \def\@@dodescriptiontext {\begingroup - \dosetdescriptionattributes\c!headstyle\c!headcolor + \usedescriptionstyleandcolor\c!headstyle\c!headcolor \the\everydescription \descriptionparameter\c!command{\strut\descriptionparameter\c!text\ignorespaces\@@dododescriptiontext}% probably incomplete \endgroup} @@ -566,6 +606,24 @@ \getparameters[\??dn][#1]% \fi} +\setupenumerations + [\c!location=\v!top, + \c!text=, + \c!way=\v!by\v!text, + \c!prefix=\v!no, + \c!prefixconnector=., + \c!starter=, + \c!stopper=, + \c!number=\v!yes, % else description + \c!start=0, + \s!parent=\??dd] + +\setupenumerations + [\c!expansion=\v!no, + \c!xmlsetup=, + \s!catcodes=, + \c!saveinlist=\v!yes] + % define enumerations \unexpanded\def\defineenumeration @@ -711,7 +769,7 @@ \def\doenumerationfullnumber#1% text, title (used in notes) .. todo {\begingroup - \dosetdescriptionattributes\c!headstyle\c!headcolor + \usedescriptionstyleandcolor\c!headstyle\c!headcolor \the\everyenumeration \descriptionparameter\c!command{\strut#1}% \endgroup} @@ -720,7 +778,7 @@ {\doif{\descriptionparameter\c!title}\v!yes {\doifsomething\@@dodoenumerationtext {\begingroup - \dosetdescriptionattributes\c!titlestyle\c!titlecolor + \usedescriptionstyleandcolor\c!titlestyle\c!titlecolor \hskip\descriptionparameter\c!titledistance \descriptionparameter\c!titlecommand {\descriptionparameter\c!titleleft @@ -1005,143 +1063,112 @@ \descriptionparameter\c!before \begingroup \doincrementsubstructurecounter[\currentdescriptionnumber][\currentdescriptionlevel]% - \dosetdescriptionattributes\c!headstyle\c!headcolor + \usedescriptionstyleandcolor\c!headstyle\c!headcolor \executeifdefined{\??db:\c!location:\descriptionparameter\c!location}{\descriptionparameter\c!command}{\dodocurrentlabelnumber[#1]}% \endgroup \descriptionparameter\c!after} - -% to be reimplmented - -\unexpanded\def\setupindentations - {\dodoubleempty\dosetupindentations} -\def\dosetupindentations[#1][#2]% - {\ifsecondargument - \dodoubleargumentwithset\dodosetupindentations[#1][#2]% - \else - \dodosetupindentations[][#1]% - \fi} +\setuplabels + [\s!parent=\??dn] -\def\dodosetupindentations[#1][#2]% - {\getparameters[\??ds#1][#2]} +%D \macros +%D {defineindentedtext, +%D setupindentedtext} +%D +%D Ok, we keep it but with a different command as it all looks too +%D much like indentation and indenting. We also assume start/stop +%D usage or some explicit par. -\unexpanded\def\defineindenting - {\dodoubleargumentwithset\dodefineindenting} +\installcommandhandler \??ds {indentedtext} \??ds -\def\dodefineindenting[#1][#2]% - {\copyparameters[\??ds#1][\??ds] - [\c!text,\c!separator,\c!width,\c!style,\c!color, - \c!headstyle,\c!sample,\c!before,\c!after,\c!distance]% - \getparameters[\??ds#1][#2]% - \setuvalue {#1}{\dododefineindenting{#1}{0}{1}}% - \setuvalue {\v!sub#1}{\dododefineindenting{#1}{1}{2}}% - \setuvalue{\v!sub\v!sub#1}{\dododefineindenting{#1}{2}{3}}} +%D \startbuffer +%D \defineindentedtext[one][text=one] +%D \defineindentedtext[two][text=two] +%D +%D \one test test \par +%D \subone test test \par +%D \subtwo test test \par +%D \subsubone test test \par +%D +%D \startone +%D test test +%D \startone +%D test test +%D \startone +%D test test +%D \stopone +%D \starttwo +%D test test +%D \startone +%D test test +%D \stopone +%D \stoptwo +%D \stopone +%D \stopone +%D \stopbuffer +%D +%D \typebuffer \getbuffer -\def\dododefineindenting#1#2#3% +\appendtoks + \setuevalue {\e!start\currentindentedtext}{\start_indented_text{\currentindentedtext}\indented_text_nesting}% + \setuevalue {\e!stop \currentindentedtext}{\stop_indented_text}% + % to be avoided ... might go away + \setuevalue {\currentindentedtext}{\indented_text{\currentindentedtext}{0}}% + \setuevalue {\v!sub\currentindentedtext}{\indented_text{\currentindentedtext}{1}}% + \setuevalue{\v!sub\v!sub\currentindentedtext}{\indented_text{\currentindentedtext}{2}}% +\to \everydefineindentedtext + +\newcount\indented_text_nesting +\newdimen\indented_text_width + +\unexpanded\def\start_indented_text#1#2% {\par - \getvalue{\??ds#1\c!before}% \begingroup - \doifvaluenothing{\??ds#1\c!sample} - {\setvalue{\??ds#1\c!sample}{\getvalue{\??ds#1\c!text}}}% + \indented_text_nesting#2\relax + \edef\currentindentedtext{#1}% + \indentedtextparameter\c!before + \doifnothing{\indentedtextparameter\c!sample} + {\setindentedtextparameter\c!sample{\indentedtextparameter\c!text}}% \assignwidth - {\descriptionsheadwidth} - {\getvalue{\??ds#1\c!width}} - {\doattributes - {\??ds#1}\c!headstyle\c!headcolor - {\getvalue{\??ds#1\c!sample}% - \spr{\getvalue{\??ds#1\c!separator}}}} - {\getvalue{\??ds#1\c!distance}}% - \advance\descriptionsheadwidth \getvalue{\??ds#1\c!distance}% - \setbox\scratchbox\hbox to \descriptionsheadwidth - {\doattributes - {\??ds#1}\c!headstyle\c!headcolor - {\strut - \getvalue{\??ds#1\c!text}% - \hss - \spr{\getvalue{\??ds#1\c!separator}}% - \hskip\getvalue{\??ds#1\c!distance}}}% + {\indented_text_width} + {\indentedtextparameter\c!width} + {\useindentedtextstyleandcolor\c!headstyle\c!headcolor + \indentedtextparameter\c!sample + \spr{\indentedtextparameter\c!separator}} + {\indentedtextparameter\c!distance}% + \advance\indented_text_width \indentedtextparameter\c!distance + \setbox\scratchbox\hbox to \indented_text_width + {\useindentedtextstyleandcolor\c!headstyle\c!headcolor + \strut + \indentedtextparameter\c!text + \hss + \spr{\indentedtextparameter\c!separator}% + \hskip\indentedtextparameter\c!distance}% \parindent\zeropoint - \hskip#2\descriptionsheadwidth\indent\box\scratchbox - \hangindent#3\descriptionsheadwidth - \doattributes{\??ds#1}\c!style\c!color\empty - \AfterPar{\endgroup\getvalue{\??ds#1\c!after}}% must be redone - \GetPar} - -\setupdescriptions - [\c!location=\v!left, - \c!headstyle=\v!bold, - \c!titlestyle=\v!bold, - \c!style=\v!normal, - \c!color=, - \c!headcolor=, - \c!titlecolor=, - \c!width=8em, - \c!distance=0pt, - \c!titledistance=0.5em, - \c!hang=, - \c!sample=, - \c!align=, - \c!headalign=, - \c!margin=\v!no, - \c!before=\blank, - \c!inbetween=\blank, - \c!after=\blank, - \c!indentnext=\v!yes, - \c!indenting=\v!never, - \c!titleleft=(, - \c!titleright=), - \c!closesymbol=, - \c!closecommand=\wordright, - \c!display=\v!yes, - \c!command=, - \c!titlecommand=] - -% way=bychapter,prefix=yes,prefixsegments=2:2 - -\setupenumerations - [\c!location=\v!top, - \c!text=, - \c!way=\v!by\v!text, - \c!prefix=\v!no, - \c!prefixconnector=., - \c!starter=, - \c!stopper=, - \c!number=\v!yes, % else description - \c!start=0, - \s!parent=\??dd] - -\setupdescriptions - [\c!expansion=\v!no, - \c!xmlsetup=, - \s!catcodes=, - \c!saveinlist=\v!yes] - -\setupenumerations - [\c!expansion=\v!no, - \c!xmlsetup=, - \s!catcodes=, - \c!saveinlist=\v!yes] - -\setupdescriptions - [\c!width=7em, - \c!distance=1em] - -\setupdescriptions[\c!width:\c!top=\localhsize] % undocumented, only width and distance -% \setupdescriptions[\c!width:\c!left=7em,\c!distance=1em] -% \setupdescriptions[\c!width:\c!right=7em,\c!distance=1em] + \hskip\indented_text_nesting\indented_text_width + \advance\indented_text_nesting\plusone + \dontleavehmode\box\scratchbox + \hangindent\indented_text_nesting\indented_text_width + \useindentedtextstyleandcolor\c!style\c!color} + +\unexpanded\def\stop_indented_text + {\indentedtextparameter\c!after + \par + \endgroup} +\let\stopindentedtext\stop_indented_text -\setuplabels - [\s!parent=\??dn] +\unexpanded\def\indented_text#1#2#3\par % no longer clever grabpar trickery + {\start_indented_text{#1}{#2}#3\stop_indented_text} -\setupindentations +\setupindentedtext [\c!style=\v!normal, \c!headstyle=\v!normal, - \c!color=, - \c!headcolor=, + %\c!color=, + %\c!headcolor=, \c!width=\v!fit, \c!text=\unknown, - \c!sample=, + %\c!sample=, \c!before=\blank, \c!after=\blank, \c!distance=1em, diff --git a/tex/context/base/strc-doc.lua b/tex/context/base/strc-doc.lua index dec017d6b..14726b7aa 100644 --- a/tex/context/base/strc-doc.lua +++ b/tex/context/base/strc-doc.lua @@ -35,8 +35,8 @@ local lists = structures.lists local counters = structures.counters local sets = structures.sets local tags = structures.tags -local processors = structures.processors +local processors = typesetters.processors local applyprocessor = processors.apply local startapplyprocessor = processors.startapply local stopapplyprocessor = processors.stopapply diff --git a/tex/context/base/strc-flt.mkvi b/tex/context/base/strc-flt.mkvi index 939cb2736..b38642eee 100644 --- a/tex/context/base/strc-flt.mkvi +++ b/tex/context/base/strc-flt.mkvi @@ -17,6 +17,8 @@ \unprotect +% Less globals! + %D This module is being converted into a mkvi one. %D %D - rename macros @@ -204,7 +206,8 @@ \unexpanded\def\thecurrentfloatnumbersuffix {\doifsomething{\floatcaptionparameter\c!suffix} {\floatcaptionparameter\c!suffixseparator - \floatcaptionparameter\c!suffix}} + \floatcaptionparameter\c!suffix + \floatcaptionparameter\c!suffixstopper}} \unexpanded\def\thecurrentfloatnumber {\ifnofloatcaption \else \ifnofloatnumber \else @@ -268,10 +271,10 @@ \noindent \gdef\lastcaptiontag{\strut\thecurrentfloatnumber}% was xdef ... needs checking \begingroup - \dosetfloatcaptionattributes\c!style\c!color + \usefloatcaptionstyleandcolor\c!style\c!color \ifnofloatnumber \else - \hbox{\dosetfloatcaptionattributes\c!headstyle\c!headcolor\strut\thecurrentfloatnumber}% + \hbox{\usefloatcaptionstyleandcolor\c!headstyle\c!headcolor\strut\thecurrentfloatnumber}% \ifnofloatcaption \else \ifemptyfloatcaption \else \doifelsenothing{\floatcaptionparameter\c!spaceinbetween} {\scratchskip\floatcaptionparameter\c!distance\relax @@ -283,7 +286,7 @@ \global\float_caption_height\zeropoint \global\float_caption_depth \zeropoint \else - \dosetfloatcaptionattributes\c!textstyle\c!textcolor + \usefloatcaptionstyleandcolor\c!textstyle\c!textcolor \global\float_caption_height\strutheight \global\float_caption_depth \strutdepth \begstrut\thecurrentfloatcaption\endstrut\endgraf @@ -322,7 +325,8 @@ % {\doprocesslocalsetups{\floatcaptionparameter\c!setups}\relax} \def\check_float_caption_content - {\ifnofloatcaption \else + {\ifnofloatcaption + \else \setbox\float_caption_box\hbox {\settrialtypesetting \notesenabledfalse @@ -394,6 +398,11 @@ \fi \let\currentfloatcaption\currentfloat} +\def\float_reset_variables + {\global\emptyfloatcaptionfalse + \global\nofloatcaptionfalse + \global\nofloatnumberfalse} + % place \unexpanded\def\float_place#tag% @@ -404,7 +413,8 @@ \dodoubleempty\float_place_indeed} \def\float_place_indeed[#location][#reference]#caption% - {\edef\floatlocation{#location}% + {\float_reset_variables + \edef\floatlocation{#location}% \ifx\floatlocation\empty \edef\floatlocation{\floatparameter\c!default}% beware of a clash between alignment locations \fi @@ -431,7 +441,8 @@ \dosingleempty\float_start_place_indeed} \def\float_start_place_indeed[#settings]% tricky ... saved not ok yet - {\edef\savedfloatlocation{\floatcaptionparameter\c!location}% + {\float_reset_variables + \edef\savedfloatlocation{\floatcaptionparameter\c!location}% \setupcurrentfloatcaption[\c!location=,\c!reference=,\c!title=,\c!marking=,\c!list=,\c!bookmark=,#settings]% \edef\floatlocation{\floatcaptionparameter\c!location}% \setupcurrentfloatcaption[\c!location=\savedfloatlocation]% @@ -637,7 +648,7 @@ {\global\nofloatcaptiontrue} {\global\nofloatcaptionfalse}% \doif{\floatcaptionparameter\c!number}\v!none % new - {\global\nofloatcaptiontrue}% + {\global\nofloatcaptiontrue}% \ifemptyfloatcaption \ifnofloatnumber \global\nofloatcaptiontrue \fi \fi} @@ -1180,15 +1191,15 @@ \or % automatic \ifnofloatcaption \prepare_no_float_caption - \doglobal\addlocalbackgroundtobox\floatbox + \page_backgrounds_add_local_to_box\floatbox % was \doglobal but not needed \else % todo: installable maken, variant/method=auto vs macro \prepare_page_float_caption - \addlocalbackgroundtobox\float_content_box + \page_backgrounds_add_local_to_box\float_content_box \setbox\float_caption_box\hbox {\floatcaptionparameter\c!command{\box\float_caption_box}}% \moveboxontogrid\float_caption_box{\floatcaptionparameter\c!grid}\float_caption_height - \addlocalbackgroundtobox\float_caption_box + \page_backgrounds_add_local_to_box\float_caption_box \build_float_box \fi \or % semi automatic @@ -1701,7 +1712,7 @@ \dontcomplain %\showcomposition \setbox\float_content_box\vbox{\borderedfloatbox}% - \addlocalbackgroundtobox\float_content_box % no \doglobal + \page_backgrounds_add_local_to_box\float_content_box \ifnofloatcaption \global\setbox\floatbox\vbox{\box\float_content_box}% \else @@ -1709,7 +1720,7 @@ \prepare_side_float_caption \setbox\float_caption_box\hbox{\floatcaptionparameter\c!command{\box\float_caption_box}}% \moveboxontogrid\float_caption_box{\floatcaptionparameter\c!grid}\float_caption_height - \addlocalbackgroundtobox\float_caption_box % no \doglobal + \page_backgrounds_add_local_to_box\float_caption_box \build_side_float_box \fi \egroup} @@ -1768,7 +1779,6 @@ \doifnotinset\v!margin\floatlocation % gaat namelijk nog fout {\setbox\floatbox\vbox {\parindent\zeropoint - \doifconcepttracing{\inleftmargin{\framed{\infofont\the\totalnoffloats}}}% \box\floatbox}}% \wd\floatbox\floatwidth \ifdim\dimexpr\floatheight+\lineheight\relax<\textheight \else @@ -1780,9 +1790,9 @@ \fi} \newcounter\noxfloatlocations - -\def\dooutput{\sidefloatoutput} % redefinition of \dooutput - + +% \def\dooutput{\sidefloatoutput} % redefinition of \dooutput + \definefloat [\v!figure] [\v!figures] diff --git a/tex/context/base/strc-ini.lua b/tex/context/base/strc-ini.lua index fd25f7d45..923d35f6d 100644 --- a/tex/context/base/strc-ini.lua +++ b/tex/context/base/strc-ini.lua @@ -20,21 +20,21 @@ but it does not make sense to store all processdata. ]]-- -local format, concat, match = string.format, table.concat, string.match +local format, concat = string.format, table.concat local count = tex.count -local type, next, tonumber, tostring = type, next, tonumber, tostring -local lpegmatch, patterns, P, C, Cs = lpeg.match, lpeg.patterns, lpeg.P, lpeg.C, lpeg.Cs +local type, next, tonumber = type, next, tonumber local settings_to_array, settings_to_hash = utilities.parsers.settings_to_array, utilities.parsers.settings_to_hash local allocate = utilities.storage.allocate -local ctxcatcodes = tex.ctxcatcodes -local xmlcatcodes = tex.xmlcatcodes -local notcatcodes = tex.notcatcodes -local txtcatcodes = tex.txtcatcodes +local ctxcatcodes = tex.ctxcatcodes +local xmlcatcodes = tex.xmlcatcodes +local notcatcodes = tex.notcatcodes +local txtcatcodes = tex.txtcatcodes -local trace_processors = false trackers.register("structures.processors", function(v) trace_processors = v end) +local trace_processors = false +local report_processors = logs.reporter("processors","structure") -local report_processors = logs.reporter("structure","processors") +trackers.register("typesetters.processors", function(v) trace_processors = v end) -- -- -- namespace -- -- -- @@ -51,7 +51,6 @@ structures.registers = structures.registers or { } structures.references = structures.references or { } structures.lists = structures.lists or { } structures.helpers = structures.helpers or { } -structures.processors = structures.processors or { } structures.documents = structures.documents or { } structures.notes = structures.notes or { } structures.descriptions = structures.descriptions or { } @@ -67,6 +66,8 @@ structures.synonyms = structures.synonyms or { } --~ table.print(structures) +local processors = typesetters.processors + -- -- -- specials -- -- -- -- we can store information and get back a reference; this permits @@ -220,122 +221,6 @@ end end end --- -- -- processors -- -- -- syntax: processor->data ... not ok yet - -local processors = structures.processors - -local registered = { } - -function processors.register(p) - registered[p] = true -end - -function processors.reset(p) - registered[p] = nil -end - ---~ local splitter = lpeg.splitat("->",true) -- also support => - -local becomes = P('->') -local processor = (1-becomes)^1 -local splitter = C(processor) * becomes * Cs(patterns.argument + patterns.content) - -function processors.split(str) - local p, s = lpegmatch(splitter,str) - if registered[p] then - return p, s - else - return false, str - end -end - ---~ function processors.sprint(catcodes,str,fnc,...) -- not ok: mixed ---~ local p, s = lpegmatch(splitter,str) ---~ local code ---~ if registered[p] then ---~ code = format("\\applyprocessor{%s}{%s}",p,(fnc and fnc(s,...)) or s) ---~ else ---~ code = (fnc and fnc(str,...)) or str ---~ end ---~ if trace_processors then ---~ report_processors("cct: %s, seq: %s",catcodes,code) ---~ end ---~ context.sprint(catcodes,code) -- was: texsprint(catcodes,code) ---~ end - -function processors.apply(p,s) - local str = p - if s == nil then - p, s = lpegmatch(splitter,p) - end - if p and registered[p] then - if trace_processors then - report_processors("known: %s, argument: %s",p,s or "") - end - context.applyprocessor(p,s) - elseif s then - if trace_processors then - report_processors("unknown: %s, argument: %s",p or "?",s) - end - context(s) - elseif str then - if trace_processors then - report_processors("direct: %s",str) - end - context(str) - end -end - -function processors.startapply(p,s) - local str = p - if s == nil then - p, s = lpegmatch(splitter,p) - end - if p and registered[p] then - if trace_processors then - report_processors("start: %s",p or "?") - end - context.applyprocessor(p) - context("{") - return s - elseif p then - if trace_processors then - report_processors("start: %s (unknown)",p) - end - context.firstofoneargument() - context("{") - return s - else - if trace_processors then - report_processors("start: ? (unset)") - end - context.firstofoneargument() - context("{") - return str - end -end - -function processors.stopapply() - context("}") - if trace_processors then - report_processors("stop") - end -end - -function processors.tostring(str) - local p, s = lpegmatch(splitter,str) - if registered[p] then - return format("\\applyprocessor{%s}{%s}",p,s) - else - return str - end -end - -function processors.stripped(str) - local p, s = lpegmatch(splitter,str) - return s or str -end - -- -- -- sets -- -- -- local sets = structures.sets @@ -409,7 +294,4 @@ end -- interface -commands.definestructureset = sets.define - -commands.registerstructureprocessor = processors.register -commands.resetstructureprocessor = processors.reset +commands.definestructureset = sets.define diff --git a/tex/context/base/strc-itm.mkiv b/tex/context/base/strc-itm.mkiv deleted file mode 100644 index c2ccfa493..000000000 --- a/tex/context/base/strc-itm.mkiv +++ /dev/null @@ -1,1451 +0,0 @@ -%D \module -%D [ file=strc-itm, -%D version=2008.10.20, -%D title=\CONTEXT\ Structure Macros, -%D subtitle=Itemgroups, -%D author=Hans Hagen, -%D date=\currentdate, -%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}] -%C -%C This module is part of the \CONTEXT\ macro||package and is -%C therefore copyrighted by \PRAGMA. See mreadme.pdf for -%C details. - -\writestatus{loading}{ConTeXt Structure Macros / Itemgroups} - -\registerctxluafile{strc-itm}{1.001} - -% this will be reimplemented: \startitem ... \stopitem will be the main macros and -% \item will then call them - -\unprotect - -\newconditional\sublistitem \setfalse\sublistitem -\newconditional\symbollistitem \setfalse\symbollistitem -\newconditional\headlistitem \setfalse\headlistitem -\newconditional\introlistitem \setfalse\introlistitem -\newconditional\randomizeitems \setfalse\randomizeitems -\newconditional\autointrolistitem \setfalse\autointrolistitem -\newconditional\optimizelistitem \settrue \optimizelistitem -\newconditional\packlistitem \setfalse\packlistitem -\newconditional\paragraphlistitem \setfalse\paragraphlistitem -\newconditional\textlistitem \setfalse\textlistitem -\newconditional\firstlistitem \setfalse\firstlistitem -\newconditional\beforelistitem \setfalse\beforelistitem -\newconditional\afterlistitem \setfalse\afterlistitem -\newconditional\nowhitelistitem \setfalse\nowhitelistitem -\newconditional\joinedlistitem \setfalse\joinedwhitelistitem -\newconditional\reverselistitem \setfalse\reverselistitem -\newconditional\continuelistitems \setfalse\continuelistitems -\newconditional\fittinglistitems \setfalse\fittinglistitems -\newconditional\indentedfirstlistitem \setfalse\indentedfirstlistitem -\newconditional\inlinelistitem \setfalse\inlinelistitem - -\newcount\noflists -\newcount\currentnoflists -\newcount\noflistelements -\newcount\itemcolumndepth -\newcount\itemdepth -% \newcount\maxitemdepth \maxitemdepth=6 - -\newdimen\itemgrouplistwidth -\newdimen\itemgroupaskedwidth -\newbox \itemgroupitembox - -\def\currentitemgroupcounter{itemgroup:\currentitemgroup} - -\let\currentitemlevel \!!zerocount -\let\currentitemgroup \empty -\let\currentnofitems \!!zerocount -\def\currentitemnumber {\dorawsubstructurecounter[\currentitemgroupcounter][\currentitemlevel]} -\let\currentrepeatstart \empty - -\def\dolistreference - {\iftrialtypesetting \else % no need for different treatment of \continuelistitems - \ctxcommand{registeritemgroup("\currentitemgroup",\number\noflistelements,"\getitemparameter\currentitemlevel\c!maxwidth")}% - \fi} - -\def\checkcurrentnofitems % we could do this at the lua end and save a call (i.e. will be dimen and counter) - {\edef\currentnofitems {\ctxcommand{nofitems("\currentitemgroup",\number\currentnoflists)}}% - \edef\currentitemmaxwidth{\ctxcommand{maxitemwidth("\currentitemgroup",\number\currentnoflists)}\scaledpoint}} - -% todo: \dodosetreference -> \dostructurecountercomponent (to be checked) - -\def\dohandleitemreference % we will make a decent number helper - {\ifx\currentitemreference \empty \else -\iftrialtypesetting \else - \setnextinternalreference - \ctxlua {structures.references.setandgetattribute("\s!full", "\referenceprefix","\currentitemreference", - { - metadata = { - kind = "item",% ? - catcodes = \the\catcodetable, - xmlroot = \ifx\currentreferencecoding\s!xml "\xmldocument" \else nil \fi, % only useful when text - }, - references = { - internal = \nextinternalreference, - section = structures.sections.currentid(), - }, - prefixdata = structures.helpers.simplify { - prefix = "\structurecounterparameter\currentitemgroupcounter\c!prefix", - separatorset = "\structurecounterparameter\currentitemgroupcounter\c!prefixseparatorset", - conversion = \!!bs\structurecounterparameter\currentitemgroupcounter\c!prefixconversion\!!es, - conversionset = "\structurecounterparameter\currentitemgroupcounter\c!prefixconversionset", - set = "\structurecounterparameter\currentitemgroupcounter\c!prefixset", - segments = "\structurecounterparameter\currentitemgroupcounter\c!prefixsegments", - % segments = "\askedprefixsegments", - connector = \!!bs\structurecounterparameter\currentitemgroupcounter\c!prefixconnector\!!es, - }, - numberdata = structures.helpers.simplify { - numbers = structures.counters.compact("\currentitemgroupcounter",nil,true), - separatorset = "\structurecounterparameter\currentitemgroupcounter\c!numberseparatorset", - conversion = "\structurecounterparameter\currentitemgroupcounter\c!numberconversion", - conversionset = "\structurecounterparameter\currentitemgroupcounter\c!numberconversionset", - % for the moment no stopper, we need to make references configurable first - % stopper = \!!bs\structurecounterparameter\currentitemgroupcounter\c!numberstopper\!!es, - segments = "\structurecounterparameter\currentitemgroupcounter\c!numbersegments", - }, - }) - }% - \xdef\currentitemattribute{\number\lastdestinationattribute}% - \begingroup\attribute\destinationattribute\currentitemattribute\kern\zeropoint\endgroup % todo, apply attribute to symbol -\fi - \fi} - -% \startitemize[n,packed] -% \item test \item test \item test -% \stopitemize -% -% \startitemize[n,packed,reverse] -% \item test \item test \item test -% \stopitemize -% -% \startitemize[n,packed,reverse] \item test \item test \stopitemize -% \startitemize[continue] -% \item test \startitemize[n,packed] \item test \item test \stopitemize -% \item test -% \item test -% \stopitemize -% \startitemize[continue] \item test \stopitemize -% -% \startitemize[n,packed] \item test \item test \stopitemize -% \startitemize[continue] \item test \stopitemize -% \startitemize[continue] \item test \stopitemize - -\def\itemparameter #1#2{\csname\doitemparameter{\??op\currentitemgroup#1}#2\endcsname} -\def\itemparameterhash#1#2{\doitemparameterhash {\??op\currentitemgroup#1}#2} - - -\def\doitemparameter #1#2{\ifcsname#1#2\endcsname#1#2\else\expandafter\doitemparentparameter \csname#1\s!parent\endcsname#2\fi} -\def\doitemparameterhash#1#2{\ifcsname#1#2\endcsname #1\else\expandafter\doitemparentparameterhash\csname#1\s!parent\endcsname#2\fi} - -\def\doitemparentparameter #1#2{\ifx#1\relax\s!empty\else\doitemparameter #1#2\fi} -\def\doitemparentparameterhash#1#2{\ifx#1\relax \else\doitemparameterhash#1#2\fi} - -\def\dosetitemattributes#1#2#3% style color - {\edef\fontattributehash {\itemparameterhash#1#2}% - \edef\colorattributehash{\itemparameterhash#1#3}% - \ifx\fontattributehash \empty\else\dosetfontattribute \fontattributehash #2\fi - \ifx\colorattributehash\empty\else\dosetcolorattribute\colorattributehash#3\fi} - -\def\setitemparameter #1#2{\@EA \def\csname\??op\currentitemgroup#1#2\endcsname} % #3 -> {#3} -\def\esetitemparameter#1#2{\@EA\edef\csname\??op\currentitemgroup#1#2\endcsname} % #3 -> {#3} -\def\xsetitemparameter#1#2{\@EA\xdef\csname\??op\currentitemgroup#1#2\endcsname} % #3 -> {#3} -\def\letitemparameter #1#2{\@EA \let\csname\??op\currentitemgroup#1#2\endcsname} -\let\getitemparameter \itemparameter - -\def\@@globalitemsymbol #1{\??op\currentitemgroup\c!symbol\s!global#1} -\def\@@localitemsymbol #1{\??op\currentitemgroup\c!symbol\s!local #1} -\def\@@currentitemsymbol#1{\??op\currentitemgroup\c!symbol #1} - -\def\@@itemcounter{\s!itemcount\currentitemgroup} - -% \def\doitembreak#1{\ifconditional\optimizelistitem\ifconditional\textlistitem\else\dosomebreak#1\fi\fi} -% -% \def\allowitembreak {\doitembreak\allowbreak} -% \def\noitembreak {\doitembreak\nobreak} -% \def\itembreakspecial {\doitembreak\itembreak} -% \def\noitembreakspecial{\doitembreak\itemnobreak} -% -% \def\itembreak {\flushnotes\penalty-5\relax} % -10 -% \def\itemnobreak{\flushnotes\penalty+5\ifinsidecolumns\else00\fi\relax} % +5 - -\definevspacing[\v!item @0] [penalty:0] % allow -\definevspacing[\v!item @10000] [penalty:10000] % no -\definevspacing[\v!item @-5] [penalty:-5] -\definevspacing[\v!item @5] [penalty:5] -\definevspacing[\v!item @500] [penalty:500] - -\def\doitembreak#1{\ifconditional\optimizelistitem\ifconditional\textlistitem\else#1\fi\fi} - -\def\allowitembreak {\doitembreak\itembreakallow} -\def\noitembreak {\doitembreak\itembreakno} -\def\itembreakspecial {\doitembreak\itembreak} -\def\noitembreakspecial{\doitembreak\itemnobreak} - -\def\itembreakallow{\vspacing[\v!item @0]} -\def\itembreakno {\vspacing[\v!item @10000]} -\def\itembreak {\flushnotes\vspacing[\v!item @-5]} -\def\itemnobreak {\flushnotes\ifinsidecolumns\vspacing[\v!item @5]\else\vspacing[\v!item @500]\fi} - -% cool but wrong: -% -% \def\initializeitemgrouplevel#1% -% {\ifcsname\??op\currentitemgroup#1\s!parent\endcsname -% % ok -% \else\ifnum#1>\plusone -% \setevalue{\??op\currentitemgroup#1\s!parent}{\??op\currentitemgroup\the\numexpr#1-1\relax}% -% \else -% \setevalue{\??op\currentitemgroup#1\s!parent}{\??op\currentitemgroup}% -% \fi\fi} -% -% so we have: - -\def\initializeitemgrouplevel#1% - {\ifcsname\??op\currentitemgroup\number#1\s!parent\endcsname - % ok - \else - \setxvalue{\??op\currentitemgroup \c!levels}{\number#1}% - \setxvalue{\??op\currentitemgroup\number#1\s!parent}{\??op\currentitemgroup}% - \fi} - -\let\currentitemconversionset\empty -\def\currentitemsymbol {n} - -\unexpanded\def\defineitemgroup - {\dotripleempty\dodefineitemgroup} - -\def\dodefineitemgroup[#1][#2][#3]% todo: clone - {\doifsomething{#1} - {\pushmacro\currentitemgroup - \def\currentitemgroup{#1}% - \setuvalue{\e!start#1}{\startitemgroup[#1]}% - \setuvalue{\e!stop#1}{\stopitemgroup}% - \setuvalue{\e!setup#1\e!endsetup}{\setupitemgroup[#1]}% for old times sake - \doifelsenothing{#2} - {\getparameters[\??op#1][\s!parent=\??oo,#3]}% - {\doifassignmentelse{#2} - {\getparameters[\??op#1][\s!parent=\??oo,#2]}% - {\getparameters[\??op#1][\s!parent=\??op#2,#3]}}% - \dorecurse{\itemparameter\empty\c!levels}{\initializeitemgrouplevel\recurselevel}% - \definestructurecounter[itemgroup:#1]% - \definestructureconversionset[itemgroup:#1][\currentitemconversionset][\currentitemsymbol]% - \popmacro\currentitemgroup}} - -\newtoks\everysetupitemgroup - -\unexpanded\def\setupitemgroups % [#1] - {\dodoubleargument\getparameters[\??oo]} % [#1] - -\def\packitems - {\ifcase\currentitemlevel \else \settrue\packlistitem \fi} - -\def\dosetupitemgroupvariable[#1]% [#2]% niveau instellingen - {\doifelsenothing{#1} - {\getparameters[\??op\currentitemgroup\currentitemlevel]}% - {\getparameters[\??op\currentitemgroup#1]}} - -\def\dosetupitemgroupconstant#1% - {\global\setitemparameter\currentitemlevel\c!maxwidth{0}% - \processcommacommand[#1]\dodosetupitemgroupconstant} % expansion of #2 is handy for xml - -\def\dodosetupitemgroupconstant#1% - {\edef\itemgroupconstantvalue{#1}% - \ifx\itemgroupconstantvalue\empty\else - \splitstring\itemgroupconstantvalue\at*\to\itemgroupfirst\and\itemgroupsecond - \ifx\itemgroupsecond\empty - \let\itemgroupsecond\itemgroupfirst - \let\itemgroupfirst\!!plusone - \fi - \ifcsname\??op:::\itemgroupsecond\endcsname\csname\??op:::\itemgroupsecond\endcsname\fi - \fi} - -\setvalue{\??op:::\v!packed }{\packitems} -\setvalue{\??op:::\v!intro }{\settrue\introlistitem} % here? not set to false -\setvalue{\??op:::\v!autointro}{\settrue\autointrolistitem} -\setvalue{\??op:::\v!broad }{\ifx\itemgroupfirst\empty\def\itemgroupfirst{1}\fi - \letitemparameter\currentitemlevel\c!factor\itemgroupfirst} -\setvalue{\??op:::\v!text }{\settrue\textlistitem - \settrue\inlinelistitem - \settrue\joinedlistitem - \packitems} -\setvalue{\??op:::\v!columns }{\packitems} -\setvalue{\??op:::\v!before }{\settrue\beforelistitem} -\setvalue{\??op:::\v!after }{\settrue\afterlistitem} -\setvalue{\??op:::\v!nowhite }{\settrue\nowhitelistitem} -\setvalue{\??op:::\v!margin }{\setitemparameter\currentitemlevel\c!width{-2em}} % signal -\setvalue{\??op:::\v!inmargin }{\setitemparameter\currentitemlevel\c!width{-2em}} % signal -\setvalue{\??op:::\v!atmargin }{\doifnot\currentitemlevel{1}{\setitemparameter\currentitemlevel\c!width{0em}}} % signal -\setvalue{\??op:::\v!intext }{\settrue\inlinelistitem} -\setvalue{\??op:::\v!loose }{\setfalse\optimizelistitem} -\setvalue{\??op:::\v!fit }{\settrue\fittinglistitems} -\setvalue{\??op:::\v!nofit }{\setfalse\fittinglistitems} -\setvalue{\??op:::\v!paragraph}{\settrue\paragraphlistitem - \packitems} -\setvalue{\??op:::\v!joinedup }{\settrue\joinedlistitem - \packitems} -\setvalue{\??op:::\v!serried }{\edef\itemgroupfirst{-\ifx\itemgroupfirst\empty1\else\itemgroupfirst\fi}% - \letitemparameter\currentitemlevel\c!factor\itemgroupfirst} -\setvalue{\??op:::\v!stopper }{\letitemparameter\currentitemlevel\c!placestopper\v!yes} % keep {} -\setvalue{\??op:::\v!unpacked }{\setfalse\packlistitem} -\setvalue{\??op:::\v!repeat }{\settrue\repeatlistitem} -\setvalue{\??op:::\v!reverse }{\settrue\reverselistitem} -\setvalue{\??op:::\v!standard }{\dosetupstandarditemgroup\currentitemlevel} - -\def\dosetupstandarditemgroup#1% - {\getparameters - [\??op\currentitemgroup#1] - [\c!width=1.5em,\c!factor=0,\c!distance=.5em,\c!inner=,\c!factor=0, - \c!beforehead=,\c!afterhead=\blank,\c!before=\blank,\c!inbetween=\blank,\c!after=\blank]} - -% \def\packeditemspacing{\empty} - -% \setupwhitespace[big] -% \starttext -% test \startitemize[joinedup] \item test \item test \stopitemize test \par -% test \startitemize[joinedup,nowhite] \item test \item test \stopitemize test \par -% test \startitemize[joinedup,nowhite,before] \item test \item test \stopitemize test \par -% test \startitemize[joinedup,nowhite,after] \item test \item test \stopitemize test \par -% \stoptext - -\ifdefined\dotagsetitemgroup \else \let\dotagsetitemgroup\relax \fi - -\def\itembeforecommand - {\ifconditional\nowhitelistitem - \ifconditional\beforelistitem - \ifcase\currentitemlevel\or\getitemparameter\currentitemlevel\c!before\fi - \else - \nowhitespace - \fi - \else\ifconditional\joinedlistitem - % \empty - \else - \getitemparameter\currentitemlevel\c!before - \fi\fi - \dostarttagged\t!itemgroup\currentitemgroup - \dotagsetitemgroup} - -\def\itemaftercommand - {\dostoptagged - \ifconditional\nowhitelistitem - \ifconditional\afterlistitem - \ifcase\currentitemlevel\or\getitemparameter\currentitemlevel\c!after\fi - \else - \nowhitespace - \fi - \else\ifconditional\joinedlistitem - % \empty - \else - \getitemparameter\currentitemlevel\c!after - \fi\fi} - -\def\iteminbetweencommand - {\ifconditional\nowhitelistitem - \nowhitespace - \else\ifconditional\joinedlistitem - % \empty - \else - \getitemparameter\currentitemlevel\c!inbetween - \fi\fi} - -\def\itembeforeheadcommand - {\ifconditional\nowhitelistitem - \nowhitespace - \else\ifconditional\joinedlistitem - % \empty - \else - \getitemparameter\currentitemlevel\c!beforehead - \fi\fi} - -\def\itemafterheadcommand - {\ifconditional\nowhitelistitem - \nowhitespace - \else\ifconditional\joinedlistitem - % \empty - \else - \getitemparameter\currentitemlevel\c!afterhead - \fi\fi} - -\unexpanded\def\dododododosetupitemgroup[#1][#2]% prevent expansion below - {\doifassignmentelse{#2}% - {\dosetupitemgroupvariable[#1][#2]}% - {\setitemparameter{#1}\c!option{#2}}}% - -\def\dodododosetupitemgroup[#1][#2]% - {\doifsomething{#2} - {\doifelse{#1}\v!each - {\dorecurse{\itemparameter\empty\c!levels}{\normalexpanded{\dododododosetupitemgroup[\recurselevel]}[#2]}} - {\normalexpanded{\dododododosetupitemgroup[#1]}[#2]}}} - -\def\dododosetupitemgroup[#1][#2]% - {\doifelsenothing{#2} - {\doifsomething{#1} - {\ifcase\currentitemlevel\relax - \dodododosetupitemgroup[\v!each][#1]% - \else - \dodododosetupitemgroup[\currentitemlevel][#1]% - \fi}}% - {\doifelsenothing{#1} - {\ifcase\currentitemlevel\relax - \dodododosetupitemgroup[\v!each][#2]% - \else - \dodododosetupitemgroup[\currentitemlevel][#2]% - \fi} - {\dodododosetupitemgroup[#1][#2]}}} - -\def\dodosetupitemgroup[#1][#2][#3][#4]% - {\pushmacro\currentitemgroup - \def\currentitemgroup{#1}% - \dododosetupitemgroup[#2][#3]% - \doifsomething{#4}{\dododosetupitemgroup[#2][#4]}% - \the\everysetupitemgroup - \popmacro\currentitemgroup} - -\def\dosetupitemgroup[#1][#2][#3][#4]% - {\def\docommand##1{\dodosetupitemgroup[##1][#2][#3][#4]}% - \processcommalist[#1]\docommand} - -\unexpanded\def\setupitemgroup - {\doquadrupleempty\dosetupitemgroup} - -\def\doadvanceitem - {\ifconditional\sublistitem\else\ifconditional\symbollistitem\else - \doincrementsubstructurecounter[\currentitemgroupcounter][\currentitemlevel]% - \fi\fi} - -\def\setitemlevel#1% - {\ifnum\currentitemlevel>\zerocount - \settrue\firstlistitem - \ifconditional\continuelistitems\else - \dorestartsubstructurecounter[\currentitemgroupcounter][\currentitemlevel]{\the\numexpr\getitemparameter\currentitemlevel\c!start-1\relax}% - \fi - \fi} - -\unexpanded\def\actualitemnumber - {\ifconditional\repeatlistitem - \ifcase\currentitemlevel - % skip - \or - \doactualitemnumber % this could become an option - \else - \doactualitemnumber - \fi - \else - \doactualitemnumber - \fi} - -\def\doactualitemnumber - {\begingroup - \setupstructurecounter - [\currentitemgroupcounter] - [%\c!prefix=\v!no, - \c!prefix=\getitemparameter\currentitemlevel\c!prefix, - \c!prefixstopper=\getitemparameter\currentitemlevel\c!prefixstopper, - \c!prefixseparatorset=\getitemparameter\currentitemlevel\c!prefixseparatorset, - \c!prefixconversion=\getitemparameter\currentitemlevel\c!prefixconversion, - \c!prefixconversionset=\getitemparameter\currentitemlevel\c!prefixseparatorset, - \c!prefixset=\getitemparameter\currentitemlevel\c!prefixset, - \c!prefixsegments=\getitemparameter\currentitemlevel\c!prefixsegments, - \c!prefixconnector=\getitemparameter\currentitemlevel\c!prefixconnector, - \c!criterium=\getitemparameter\currentitemlevel\c!criterium, - \c!numberorder=\ifconditional\reverselistitem\v!reverse\else\v!normal\fi, - \c!numberstopper=\expdoif{\getitemparameter\currentitemlevel\c!placestopper}\v!yes{\getitemparameter\currentitemlevel\c!stopper}, - %\c!numberseparatorset=, - \c!numberconversionset=itemgroup:\currentitemgroup, - %\c!numberconversion=\currentitemsymbol, - \c!numbersegments=\ifx\currentrepeatstart\empty\else\currentrepeatstart:\fi\number\currentitemlevel]% - \convertedstructurecounter[\currentitemgroupcounter]% [\number\currentitemlevel]% - \dohandleitemreference - \endgroup} - -\def\unknownitemsymbol{?} - -\def\setitemmark#1% % en pas op: resets \docommand ; todo: conversionset - {\doifsymboldefinedelse{#1} - {\edef\currentitemsymbol{#1}% - \setxvalue{\@@globalitemsymbol\currentitemlevel}{\currentitemsymbol}% - \setgvalue{\@@localitemsymbol \currentitemlevel}{\unknownitemsymbol}% - \def\listitem{\symbol[\currentitemsymbol]}% - \let\@@opsymbol\empty}% - {\doifconversiondefinedelse{#1} - {\edef\currentitemsymbol{#1}% - \setxvalue{\@@globalitemsymbol\currentitemlevel}{\currentitemsymbol}% - \setgvalue{\@@localitemsymbol\currentitemlevel }{\actualitemnumber }% - \def\listitem - {\ifconditional\textlistitem - % maybe block stopper here, but one can as well clone an - % itemgroup then - \getitemparameter\currentitemlevel\c!lefttext - \getvalue{\@@localitemsymbol\currentitemlevel}% - \getitemparameter\currentitemlevel\c!righttext - \else - \getitemparameter\currentitemlevel\c!left - \getvalue{\@@localitemsymbol\currentitemlevel}% - \getitemparameter\currentitemlevel\c!right - \fi}% - \let\@@opsymbol\empty}% - {}}} - -% \def\calculatelistwidth#1% distance deals with 'broad' -% {\itemgrouplistwidth\getitemparameter#1\c!distance\relax -% \ifnum\getitemparameter#1\c!factor>\zerocount -% \ifdim\itemgrouplistwidth=\zeropoint \itemgrouplistwidth=.5em\fi -% \fi -% \multiply\itemgrouplistwidth \getitemparameter#1\c!factor -% \advance \itemgrouplistwidth \getitemparameter#1\c!width\relax} - -\def\calculatelistwidth#1% - {\ifdim\currentitemmaxwidth>\zeropoint - \itemgrouplistwidth\currentitemmaxwidth - \else\ifnum\getitemparameter#1\c!factor>\zerocount - \itemgrouplistwidth\getitemparameter#1\c!step\relax - \ifdim\itemgrouplistwidth=\zeropoint \itemgrouplistwidth=.5em\fi - \multiply\itemgrouplistwidth \getitemparameter#1\c!factor - \advance\itemgrouplistwidth\getitemparameter#1\c!width\relax - \else - \itemgrouplistwidth\getitemparameter#1\c!width\relax - \fi\fi - \advance\itemgrouplistwidth\getitemparameter#1\c!distance\relax} - -% The next conditionals deal with \item \startitemgroup. It -% looks like a hack to skip back, but that way we preserve -% the indentation and bullet placement. It's a rather -% untested feature. - -\newconditional\concatnextitem \setfalse\concatnextitem -\newconditional\autoconcatnextitem \settrue \autoconcatnextitem -\newsignal \itemsignal - -\unexpanded\def\startitemgroup - {\dotripleempty\dostartitemgroup} - -\def\dostartitemgroup[#1][#2][#3]% - {\bgroup - \ifnum\currentitemlevel=\zerocount - \def\currentitemgroup{#1}% no nested mixing of itemgroups - \fi - \ifthirdargument - \dodostartitemgroup[#2][#3]% - \else - \doifassignmentelse{#2} - {\dodostartitemgroup[][#2]} - {\dodostartitemgroup[#2][]}% - \fi} - -\def\dodostartitemgroup[#1]% [#2]% - {\relax % prevents lookahead - \global\advance\itemdepth\plusone - \initializeitemgrouplevel\itemdepth - \xdef\currentitemlevel{\number\itemdepth}% - \edef\itemgroupoptions{\getitemparameter\currentitemlevel\c!option}% - \ifx\itemgroupoptions\empty - \edef\itemgroupoptions{#1}% - \else - \doifsomething{#1}{\edef\itemgroupoptions{\itemgroupoptions,#1}}% - \fi - \normalexpanded{\noexpand\redostartitemgroup[\itemgroupoptions]}}% [#2] - -\let\startcollectitems\relax -\let\stopcollectitems \relax - -%D A nice example of a plugin: -%D -%D \startbuffer -%D \startitemize[a,random,packed] -%D \startitem first \stopitem \startitem second \stopitem -%D \startitem third \stopitem \startitem fourth \stopitem -%D \stopitemize -%D -%D \startitemize[a,random,packed] -%D \startitem first \stopitem \startitem second \stopitem -%D \startitem third \stopitem \startitem fourth \stopitem -%D \stopitemize -%D -%D \startitemize[a,packed] -%D \startitem first \stopitem \startitem second \stopitem -%D \startitem third \stopitem \startitem fourth \stopitem -%D \stopitemize -%D \stopbuffer -%D -%D \typebuffer \getbuffer - -% better collectitems als conditional and a real plugin mechanism (some day) - -\@EA\long\@EA\def\@EA\collectitemgroupitem\@EA#\@EA1\csname\e!stop\v!item\endcsname - {\increment\itemcollectcounter - \long\setvalue{\v!item*\itemcollectcounter}{\startitemgroupitem#1\stopitemgroupitem}} - -\def\flushcollecteditems - {\ifconditional\randomizeitems - \getrandomnumber\itemcollectcounternow\plusone\itemcollectcounter - \else - \increment\itemcollectcounternow - \fi - \doifdefined{\v!item*\itemcollectcounternow} - {\getvalue{\v!item*\itemcollectcounternow}% - \letbeundefined{\v!item*\itemcollectcounternow}% - \increment\itemcollectcounterdone}% - \ifnum\itemcollectcounterdone<\itemcollectcounter\relax - \expandafter\flushcollecteditems - \fi} - -\unexpanded\def\stopcollectitems - {\ifconditional\randomizeitems - \newcounter\itemcollectcounterdone - \ifnum\itemcollectcounter>\zerocount - \@EAEAEA\flushcollecteditems - \fi - \fi} - -\unexpanded\def\startcollectitems - {\ifconditional\randomizeitems - \newcounter\itemcollectcounter - \letvalue{\e!start\v!item}\collectitemgroupitem - \fi} - -%D End of plugin. - -\ifx\startcolumns\undefined \unexpanded\def\startcolumns[#1]{} \fi -\ifx\stopcolumns \undefined \let\stopcolumns\relax \fi - -\def\dosetsymalign#1% hm, we should use one of the core-spa macros or make a helper - {\processaction - [#1] - [ \v!flushleft=>\let\symalignleft\relax, - \v!right=>\let\symalignleft\relax, - \v!flushright=>\let\symalignleft\hfill, - \v!left=>\let\symalignleft\hfill, - \v!middle=>\let\symalignleft\hfil, - \v!center=>\let\symalignleft\hfil]} - -\let\currentitemindenting\empty - -\def\redostartitemgroup[#1][#2]% - {\setfalse\inlinelistitem % new, no indent (leftskip) - \setfalse\concatnextitem % new, concat - \setfalse\txtlistitem - \ifhmode - \ifconditional\autoconcatnextitem % new, concat - \ifdim\lastskip=\itemsignal % new, concat - \settrue\concatnextitem % new, concat - \fi % new, concat - \fi % new, concat - \ifconditional\textlistitem\else\doifnotinset\v!text{#1}\par\fi % suboptimal - \fi - \begingroup - % new where, ok or not / we should integrate random, intro, continue here - % beware, the following no longer inherit from the previous level, is this ok? - \setfalse\reverselistitem - \setfalse\introlistitem - \setfalse\autointrolistitem - \setfalse\beforelistitem - \setfalse\afterlistitem - \setfalse\nowhitelistitem - \setfalse\randomizeitems - % - \doifinsetelse\v!intro {#1}{\settrue\introlistitem }{\setfalse\introlistitem }% - \doifinsetelse\v!random {#1}{\settrue\randomizeitems }{\setfalse\randomizeitems }% - \doifinsetelse\v!continue{#1}{\settrue\continuelistitems}{\setfalse\continuelistitems}% - % == \doifinsetelse\v!intro{#1}\settrue\setfalse\introlistitem -\iftrialtypesetting - \savestructurecounter[\currentitemgroupcounter]%[\currentitemlevel]% todo: per level -\fi - \global\advance\noflists\plusone - \currentnoflists\noflists - \noflistelements\zerocount - \setfalse\headlistitem - \setfalse\sublistitem - \setfalse\symbollistitem - \let\marsymbol\relax - \globallet\doitemdestination\empty - \let\symsymbol\empty - \let\symalignleft\relax - \the\itemgroupcommands - \checkcurrentnofitems - % \getitemparameter\currentitemlevel\empty - \let\listitem\empty % ** start value - \doifelsenothing{#1} % iffirstargument - {\edef\@@opsymbol{\noexpand\getitemparameter\currentitemlevel\noexpand\c!symbol}% - \letgvalueempty{\@@globalitemsymbol\currentitemlevel}% - \global\letitemparameter\currentitemlevel\v!continue\empty - \dosetupitemgroupvariable[\currentitemlevel][#2]} - {\dosetupitemgroupconstant{#1}% - \dosetupitemgroupvariable[\currentitemlevel][#2]% - \ifconditional\continuelistitems - \edef\@@opsymbol{\executeifdefined{\@@globalitemsymbol\currentitemlevel}{\currentitemlevel}}% - \getitemparameter\currentitemlevel\v!continue - \else - \edef\@@opsymbol{\noexpand\getitemparameter\currentitemlevel\noexpand\c!symbol}% - \global\setitemparameter\currentitemlevel\v!continue - {\dosetupitemgroupconstant{#1}% - \dosetupitemgroupvariable[\currentitemlevel][#2]}% - \fi - \def\docommand##1% \setitemmark resets \docommand - {\doifnot{##1}{0}{\setitemmark{##1}}}% - % \processcommalist[#1,\@@opsymbol]\docommand - \processcommalist[#1]\docommand}% ** preset sequence or provided sequence - % moved to here, after settings - \ifnum\currentitemlevel=\plusone % NIEUW - \doadaptleftskip {\getitemparameter\currentitemlevel\c!margin}% - \doadaptleftskip {\getitemparameter\currentitemlevel\c!leftmargin}% - \doadaptrightskip{\getitemparameter\currentitemlevel\c!rightmargin}% - \fi - \dosetraggedcommand{\getitemparameter\currentitemlevel\c!align}\raggedcommand - \dosetsymalign{\getitemparameter\currentitemlevel\c!symalign}% - %\doifsomething{\getitemparameter\currentitemlevel\c!indenting} - % {\normalexpanded{\noexpand\setupindenting[\v!reset,\v!yes,\getitemparameter\currentitemlevel\c!indenting]}}% - % {\normalexpanded{\noexpand\setupindenting[\getitemparameter\currentitemlevel\c!indenting]}}% - % - \edef\currentitemindenting{\getitemparameter\currentitemlevel\c!indenting}% - % - \setitemlevel{#1}% moved to here - \ifx\listitem\empty - \setitemmark\@@opsymbol % ** default value - \ifx\listitem\empty - \edef\currentitemsymbol{\currentitemlevel}% ** fall back - \fi - \fi - \ifconditional\autointrolistitem\ifnum\prevgraf<3 - \settrue\introlistitem - \fi\fi - \ifconditional\paragraphlistitem - \ifnum\currentitemlevel>\plusone - \letitemparameter\currentitemlevel\c!inbetween\empty - \fi - \fi - \ifconditional\packlistitem - \letitemparameter\currentitemlevel\c!inbetween\empty - \fi - \doifinset\v!columns{#1}% - {\ifinsidecolumns\else\ifcase\itemcolumndepth - \global\itemcolumndepth\currentitemlevel\relax - \itembeforecommand - \processfirstactioninset - [#1] - [ \v!one=>\setitemparameter\currentitemlevel\c!n{1}, - \v!two=>\setitemparameter\currentitemlevel\c!n{2}, - \v!three=>\setitemparameter\currentitemlevel\c!n{3}, - \v!four=>\setitemparameter\currentitemlevel\c!n{4}, - \v!five=>\setitemparameter\currentitemlevel\c!n{5}, - \s!unknown=>\@EA\!!counta\getitemparameter\currentitemlevel\c!n]% - \startcolumns - [\c!n=\getitemparameter\currentitemlevel\c!n, - \c!height=, - \c!rule=\v!off, - \c!balance=\v!yes, - \c!align=\v!no]% - \fi\fi}% - \ifconditional\fittinglistitems - \ifdim\currentitemmaxwidth>\zeropoint - \esetitemparameter\currentitemlevel\c!width{\currentitemmaxwidth}% - \fi - \fi - \calculatelistwidth\currentitemlevel - \ifdim\itemgrouplistwidth>\zeropoint\relax - \ifconditional\inlinelistitem\else - \advance\leftskip\itemgrouplistwidth\relax - \fi - \fi - \ifx\currentrepeatstart\empty - \let\currentitemconversionset\currentitemsymbol - \else - \edef\currentitemconversionset{\currentitemconversionset,\currentitemsymbol}% - \fi - \startcollectitems} - -% test / example -% -% \startnarrower[left] \startcolumns[n=3] \startitemize -% \item \input ward \item \input ward \item \input ward -% \stopitemize \stopcolumns\stopnarrower \blank -% -% \startnarrower[left] \startitemize[columns,three] -% \item \input ward \item \input ward \item \input ward -% \stopitemize \stopnarrower \blank -% -% \setupitemize[leftmargin=1.5em] \startitemize[columns,three] -% \item \input ward \item \input ward \item \input ward -% \stopitemize \blank - -\def\dorestoreitemgroup - {\restorestructurecounter[\currentitemgroupcounter]% [\currentitemlevel]% todo: per level - \global\advance\noflists\minusone - \currentnoflists\noflists} - -\unexpanded\def\stopitemgroup - {\stopcollectitems - \ifconditional\textlistitem - \removeunwantedspaces\space\ignorespaces - \else - \par - \fi - \dolistreference - \ifconditional\firstlistitem - \else - \dostoptagged - \dostoptagged - \endgroup - \fi % toegevoegd, eerste \som opent groep - \ifnum\itemcolumndepth=\currentitemlevel\relax - \stopcolumns - \global\itemcolumndepth\zerocount - \itemaftercommand - \dontrechecknextindentation - \else - \ifnum\currentitemlevel=\plusone - \allowitembreak - \itemaftercommand - \checknextindentation[\getitemparameter\currentitemlevel\c!indentnext]% - \else - % nieuw, not yet nobreak handling - \ifcase\autoitemgroupspacing - \itemaftercommand - \or - \itemaftercommand - \fi - \dontrechecknextindentation - \fi - \fi - % new test, needed in sidefloats (surfaced in volker's proceedings) -\iftrialtypesetting - \dorestoreitemgroup -\fi - \ifconditional\textlistitem % else forgotten - \endgroup - \global\advance\itemdepth-\plusone - \xdef\currentitemlevel{\number\itemdepth}% - \egroup - \else - \endgroup - \global\advance\itemdepth-\plusone - \xdef\currentitemlevel{\number\itemdepth}% - \egroup - \par - \fi - \dorechecknextindentation} - -\newtoks\itemgroupcommands -\newtoks\itemgroupfinalizer - -\def\itemgroupitem - {\the\itemgroupfinalizer - \doitemgroupitem} - -\def\itemgroupnoitem - {\the\itemgroupfinalizer - \doitemgroupnoitem} - -\def\itemgroupbutton[#1]% - {\the\itemgroupfinalizer - \gdef\doitemdestination{#1}% - \itemgroupitem} - -\def\itemgroupdummy - {\the\itemgroupfinalizer - \itemgroupsymbol{\strut}\strut} - -\def\itemgroupsubitem - {\the\itemgroupfinalizer - \settrue\sublistitem - \itemgroupitem} - -\def\itemgroupsymbol#1% - {\the\itemgroupfinalizer - \def\symsymbol{#1}% - \settrue\symbollistitem - \itemgroupitem} - -\def\itemgroupedge#1% - {\the\itemgroupfinalizer - \itemgroupsymbol - {\calculatelistwidth\currentitemlevel - \hbox to \itemgrouplistwidth - {#1\hskip\getitemparameter\currentitemlevel\c!distance}}} - -\def\itemgrouphead - {\the\itemgroupfinalizer - \settrue\headlistitem\doitemgrouphead} - -\def\itemgroupitems - {\the\itemgroupfinalizer - \dosingleempty\doitemgroupitems} - -\def\doitemgroupitems[#1]% - {\itemgroupedge - {\dorecurse{0\getitemparameter\currentitemlevel\c!items}{\listitem\hss}% - \unskip}} - -\def\itemgroupmargin#1% - {\the\itemgroupfinalizer - \def\marsymbol - {\llap - {\dosetitemattributes\currentitemlevel\c!marstyle\c!marcolor{#1}% - \hskip\leftskip\hskip\leftmargindistance}}% - \itemgroupitem} - -% beware, we don't group (yet) as we want to keep the left/right skip -% -% \startitemize -% \startitem \stopitem -% some intermediate text that will properly indent -% \startitem \stopitem -% \stopitem -% -% so we need to keep that property - -\appendtoks - \let\item \itemgroupitem - \let\noitem\itemgroupnoitem - \let\itm \itemgroupitem - \let\but \itemgroupbutton - \let\nop \itemgroupdummy -\to \itemgroupcommands - -\ifx\currentinterface \v!english \else - - \appendtoks - \letvalue\v!item\itemgroupitem - \letvalue\v!sub \itemgroupsubitem - \letvalue\v!sym \itemgroupsymbol - \letvalue\v!ran \itemgroupedge - \letvalue\v!head\itemgrouphead - \letvalue\v!its \itemgroupitems - \letvalue\v!mar \itemgroupmargin - \to \itemgroupcommands - -\fi - -\let\startitemgroupitem\itemgroupitem - -\def\stopitemgroupitem - {\ifconditional\textlistitem - % nothing - \else - \endgraf - \fi} - -\def\startitemgroupitemhead#1% - {\itemgrouphead#1\par} - -\def\stopitemgroupitemhead - {\ifconditional\textlistitem - % to be tested - \else - \endgraf - \fi} - -\appendtoks - \let\startitem\startitemgroupitem - \let\stopitem \stopitemgroupitem - \let\starthead\startitemgroupitemhead - \let\stophead \stopitemgroupitemhead -\to \itemgroupcommands - -\ifx\currentinterface \v!english \else - - \appendtoks % can be sped up by \csname if needed - \letvalue{\e!start\v!item}\startitemgroupitem - \letvalue{\e!stop \v!item}\stopitemgroupitem - \letvalue{\e!start\v!head}\startitemgroupitemhead - \letvalue{\e!stop \v!head}\stopitemgroupitemhead - \to \itemgroupcommands - -\fi - -\appendtoks - \let\startspecialitem\startspecialitemgroupitem - \let\stopspecialitem \stopspecialitemgroupitem -\to \itemgroupcommands - -\unexpanded\def\startspecialitemgroupitem[#1]% - {\csname\??op:\e!start:\ifcsname#1\endcsname #1\else\v!item\fi\endcsname} - -\unexpanded\def\stopspecialitemgroupitem - {\stopitemgroupitem} - -\letvalue{\??op:\e!start:\v!item}\itemgroupitem -\letvalue{\??op:\e!start:\v!sub }\itemgroupsubitem -\letvalue{\??op:\e!start:\v!sym }\itemgroupsymbol -\letvalue{\??op:\e!start:\v!ran }\itemgroupedge -\letvalue{\??op:\e!start:\v!its }\itemgroupitems -\letvalue{\??op:\e!start:\v!mar }\itemgroupmargin - -% \startitemize -% \starthead {xx} test \stophead -% \startitem test \stopitem -% \startitem test \stopitem -% \stopitemize - -% Sometimes the user demands get pretty weird: -% -% \startitemize -% \item test -% \item test -% \headsym{xx} test \par test -% \stopitemize - -% aligned items -% -% \startitemize[n,fit,broad][itemalign=flushright] -% \dorecurse{100}{\item The first item.} -% \stopitemize -% -% \setupitemgroup[itemize][each][fit] -% \setupitemgroup[itemize][each][distance=.5em,factor=1,itemalign=flushright] -% -% \startitemize[n] -% \dorecurse{100}{\item The first item.} -% \stopitemize - -\appendtoks \let\headsym \itemgroupheadsym \to \itemgroupcommands - -\def\itemgroupheadsym#1% - {\def\symsymbol{#1}% - \settrue\symbollistitem - \settrue\headlistitem - \doitemgrouphead} - -% \defineitemgroup[gbitemize] -% \setupitemgroup[gbitemize][each][headstyle=bold] - -% \startgbitemize -% \txt{italian} some italians like this kind of cross||breed between -% an itemize and a description -% \txt{sicilians} i wonder how many sicilian mathematicians do a thesis -% on the math involved in predicting the next big bang of the vulcano -% \stopgbitemize - -\appendtoks \letvalue\v!txt\itemgrouptext \to \itemgroupcommands - -\newconditional\txtlistitem \setfalse\txtlistitem - -\def\itemgrouptext#1% - {\def\symsymbol{#1}% - \settrue\symbollistitem - \settrue\txtlistitem - \itemgroupitem} - -\def\dodotxtitem - {\scratchdimen\wd\itemgroupitembox - \advance \scratchdimen \getitemparameter\currentitemlevel\c!distance\relax - \ifdim\scratchdimen>\itemgrouplistwidth - \advance\scratchdimen -\itemgrouplistwidth - \else - \scratchdimen\zeropoint - \fi - \llap{\hbox to \itemgrouplistwidth{\ifconditional\sublistitem\llap{+\enspace}\fi\box\itemgroupitembox\hss}}% was: \hfill - \hskip\scratchdimen} - -\def\optimizelistitemsbreak - {\ifcase\itemcolumndepth \ifconditional\optimizelistitem - \ifcase \currentnofitems \else - \ifnum\currentnofitems=\plusthree - \ifnum\noflistelements>\plusone - \noitembreakspecial - \fi - \else\ifnum\currentnofitems>\plusthree - \ifnum\noflistelements=\plustwo - \ifconditional\introlistitem - \noitembreak - \else - \noitembreakspecial - \fi - \else\ifnum\currentnofitems=\noflistelements\relax - \noitembreakspecial - \else\ifnum\noflistelements>\plustwo - \itembreakspecial - \else - \ifconditional\introlistitem\else\itembreakspecial\fi - \fi\fi\fi - \fi\fi - \fi - \fi\fi} - -\def\dodosubitem - {\ifconditional\sublistitem\llap{+\enspace}\fi} - -\def\dodolapitem - {\llap - {\hbox to \itemgrouplistwidth - {\dodosubitem - \symalignleft - \box\itemgroupitembox % can already have a forced widt, only factor handled here - \hfil - \hskip\getitemparameter\currentitemlevel\c!distance}}} - -\def\dolistitem % evt aantal items opslaan per niveau, scheelt zoeken - {\ifconditional\textlistitem - % begin of item - \else - \par - \fi - \advance\noflistelements\plusone - \optimizelistitemsbreak - \setfalse\indentedfirstlistitem - \ifx\currentitemindenting\empty \else - \normalexpanded{\noexpand\setupindenting[\v!reset,\v!yes,\currentitemindenting]}% - \doifnot{\getitemparameter\currentitemlevel\c!alignsymbol}\v!yes - {\ifindentfirstparagraph\settrue\indentedfirstlistitem\fi}% - \fi - \dontleavehmode - \ifconditional\indentedfirstlistitem - \hskip-\parindent - \fi - \setbox\itemgroupitembox\hbox - {\ifconditional\headlistitem - \ifconditional\symbollistitem - \dosetitemattributes\currentitemlevel\c!symstyle\c!symcolor{\symsymbol}% - \else - \dosetitemattributes\currentitemlevel\c!headstyle\c!headcolor{\listitem}% - \fi - \else - \ifconditional\symbollistitem - \dosetitemattributes\currentitemlevel\c!symstyle\c!symcolor{\symsymbol}% - \else - \dosetitemattributes\currentitemlevel\c!style\c!color{\listitem}% - \fi - \fi}% - \doifsomething\doitemdestination - {\setbox\itemgroupitembox\hbox{\directgotobox{\box\itemgroupitembox}[\doitemdestination]}}% - \itemgroupaskedwidth\getitemparameter\currentitemlevel\c!width\relax - \ifconditional\fittinglistitems - \ifdim\wd\itemgroupitembox>\getitemparameter\currentitemlevel\c!maxwidth sp\relax - \xsetitemparameter\currentitemlevel\c!maxwidth{\number\wd\itemgroupitembox}% - \fi - \ifdim\currentitemmaxwidth>\zeropoint - \setbox\itemgroupitembox\simplealignedbox - {\dimexpr\currentitemmaxwidth+\getitemparameter\currentitemlevel\c!distance\relax} - {\getitemparameter\currentitemlevel\c!itemalign} - {\box\itemgroupitembox\hskip\getitemparameter\currentitemlevel\c!distance}% - \fi - \else\ifdim\itemgroupaskedwidth>\zeropoint - \doifsomething{\getitemparameter\currentitemlevel\c!itemalign} - {\setbox\itemgroupitembox\simplealignedbox - {\dimexpr\itemgroupaskedwidth+\getitemparameter\currentitemlevel\c!distance\relax} - {\getitemparameter\currentitemlevel\c!itemalign} - {\box\itemgroupitembox\hskip\getitemparameter\currentitemlevel\c!distance}}% - \fi\fi - \globallet\doitemdestination\empty - % new, prevents loops when symbol is (not yet found) graphic - \ht\itemgroupitembox\strutheight - \dp\itemgroupitembox\strutdepth - % so that content differs per run (esp mp graphics afterwards) - \checkforrepeatedlistitem - \ifdim\itemgroupaskedwidth<\zeropoint\relax - \llap{\ifconditional\sublistitem\llap{+\enspace}\fi\box\itemgroupitembox\hskip\leftmargindistance}% - \else - \ifdim\itemgroupaskedwidth=\zeropoint\relax - \calculatelistwidth1% - \else - \calculatelistwidth\currentitemlevel - \fi - \ifconditional\textlistitem - \hbox{\ifconditional\sublistitem+\enspace\fi\box\itemgroupitembox\hskip\interwordspace}\nobreak - \else\ifconditional\inlinelistitem - \hbox to \itemgrouplistwidth{\ifconditional\sublistitem\llap{+\enspace}\fi\box\itemgroupitembox\hss}% was: \hfill - \else\ifconditional\txtlistitem - \dodotxtitem - \else - \dodolapitem - \fi\fi\fi - \fi - \setevalue{\@@currentitemsymbol\currentitemlevel}% - {\getvalue{\@@localitemsymbol\currentitemlevel}}% still problems with \uchar ? - %{\noexpand\getvalue{\@@localitemsymbol\currentitemlevel}}% no, spoils subrefs - \setfalse\headlistitem - \setfalse\sublistitem - \setfalse\symbollistitem - \EveryPar{\ignorespaces}% needed ? - \ifconditional\indentedfirstlistitem - \hskip\parindent - \fi - \ignorespaces} - -% For Wolfgang Schuster - -% \startitemize[n,repeat] -% \noitem \startitemize[a] \item Item 1.a. \item Item 1.b. \stopitemize -% \noitem \startitemize[a] \item Item 2.a. \item Item 2.b. \stopitemize -% \stopitemize - -\def\donolistitem % reduced \dolistitem - {\advance\noflistelements\plusone - \setbox\itemgroupitembox\hbox - {\dosetitemattributes\currentitemlevel\c!style\c!color{\listitem}}% - \checkforrepeatedlistitem - \ignorespaces} - -\def\doitemgroupnoitem - {\let\currentitemreference\empty - \doadvanceitem\donolistitem} - -% For Frank Grieshaber and Mojca Miklavec: - -\newconditional\repeatlistitem - -\def\checkforrepeatedlistitem - {\ifconditional\repeatlistitem - \ifx\currentrepeatstart\empty - \let\currentrepeatstart\currentitemlevel - \fi - \setbox\itemgroupitembox\hbox to \wd\itemgroupitembox{\hskip-\itemgroupaskedwidth\box\itemgroupitembox}% what a hack ! - \fi} - -% \startbuffer -% \item -% \startitemize[n] -% \item item 1.1 -% \item item 1.2 -% \startitemize[n] \item item 1.2.1 \item item 1.2.2 \stopitemize -% \item item 1.3 -% \stopitemize -% \item -% \startitemize[n] \item item 2.1 \item item 2.2 \stopitemize -% \item item 3 -% \startitemize[n] \item item 3.1 \item item 3.2 \stopitemize -% \item -% \startitemize[n] \item item 4.1 \item item 4.2 \stopitemize -% \stopbuffer -% -% \startitemize[n,repeat,6*broad,packed] \getbuffer \stopitemize \blank[3*big] -% \startitemize[n,repeat,packed] \getbuffer \stopitemize \blank[3*big] -% \setupitemize[each][atmargin][width=3em] -% \startitemize[n,repeat,packed] \getbuffer \stopitemize - -\setnewconstant\autoitemgroupspacing\plustwo % 0 = voor/na, 1=tussen als geen voor 2=(prev)tussen=old/normal - -% todo: assume startitem ... stopitem and do an autostopitem .. cleaner for -% elements - -\def\complexdoitemgroupitem[#1]% - {\def\currentitemreference{#1}% - \ifconditional\textlistitem - % begin of item - \else - \par - \fi - \ifconditional\concatnextitem % new, concat - \noitembreak % new, concat - \fi % new, concat - \doadvanceitem - \ifconditional\firstlistitem - \setfalse\firstlistitem - \begingroup - \ifcase\currentitemlevel - \or % 1 - \ifcase\itemcolumndepth - \ifconditional\introlistitem\noitembreak\fi - \itembeforecommand - \ifconditional\introlistitem\noitembreak\fi - \fi - \else % 2 en hoger - \ifconditional\paragraphlistitem \else - \edef\previtemlevel{\the\numexpr\currentitemlevel-1}% - \ifcase\autoitemgroupspacing\relax % nieuw - \itembeforecommand - \or - \doifelsenothing\itembeforecommand\itembeforecommand{\getitemparameter\previtemlevel\c!inbetween}% - \else - \getitemparameter\previtemlevel\c!inbetween - \fi - \fi - \fi - \else -\dostoptagged -\dostoptagged - \ifconditional\textlistitem % was bugged: \inlinelistitem - \ifhmode - % WS: make the distance between items customizable, think about better default values -> see itemize-1.tex - \normalexpanded{\doassigntextitemdistance{\getitemparameter\currentitemlevel\c!textdistance}}% HH: moved out and made configurable (sort of) - \removeunwantedspaces\hskip\textitemdistance\relax - \fi - \else - \iteminbetweencommand - \fi - \fi - \ifconditional\concatnextitem - \vskip-\dimexpr\lastskip+\lineheight\relax - \nobreak - \fi -\dostarttagged\t!item\empty -\dostarttagged\t!itemtag\empty - \dolistitem -\dostoptagged - \relax - \ifconditional\packlistitem - \setupwhitespace[\v!none]% - \fi - \getitemparameter\currentitemlevel\c!inner - \marsymbol - \let\marsymbol\relax -\dostarttagged\t!itemcontent\empty - \strut % added 11-08-99 - \setfalse\concatnextitem % new, concat - \nobreak % else problems with intext items - \hskip\itemsignal % new, concat - \getitemparameter\currentitemlevel\c!command} % \defaultitemcommand - -% \startitemize[text][space=medium] -% \item one \item two \item three -% \stopitemize - -\setvalue{\??op:\??op:\c!textdistance:\v!none}% - {\def\textitemdistance{\zeropoint}} - -\def\doassigngiventextitemdistance#1% - {\assignvalue - {#1}% - \textitemdistance - {.5\interwordspace\!!plus.5\emwidth}% - {\interwordspace \!!plus \emwidth}% - {\emwidth \!!plus \interwordstretch\!!minus\interwordshrink}} - -\unexpanded\def\doassigntextitemdistance#1% - {\ifcsname\??op:\??op:\c!textdistance:#1\endcsname - \csname\??op:\??op:\c!textdistance:#1\endcsname - \else - \doassigngiventextitemdistance{#1}% - \fi} - -\def\defaultitemcommand - {\EveryPar{\ignorespaces}% needed ? - \ignorespaces} - -% For Giuseppe "Oblomov" Bilotta, inspired on a suggestion by Taco -% Hoekwater. -% -% \def\MyItemCommand#1{{\bf#1}\quad} -% \setupitemgroup[itemize][command=\MyItemCommand] -% -% \startitemize -% \item {test} is this okay? -% \item {test} is this okay? -% \item {test} is this okay? -% \stopitemize - -% \def\complexitem[#1]#2\par % todo: no two pass data -% {\startitemgroup[#1]% -% \complexdoitemgroupitem[]\begstrut#2\endstrut\par -% \stopitemgroup} - -\def\complexitem[#1]#2\par - {\doifsomethingelse{#1}{\startitemgroup[#1]}{\startitemgroup[\v!itemize]}% - \startitem#2\stopitem - \stopitemgroup} - -\setvalue{\e!start\v!item}% - {\startitemgroup[\v!itemize]\startitem - \setvalue{\e!stop \v!item}{\endgraf\stopitemgroup}} % inside, else overloaded - -\definecomplexorsimpleempty\item -\definecomplexorsimpleempty\doitemgroupitem - -% the next solution accepts \head test \type{x{x}x} test ... - -\let\doenditemhead\relax - -\def\complexdoitemgrouphead[#1]% beter in \complexdosom hangen met een if - {\ifconditional\firstlistitem\else\allowitembreak\fi - \ifconditional\packlistitem\else\itembeforeheadcommand\fi - \ifconditional\firstlistitem\ifconditional\introlistitem\else\ifcase\currentitemlevel % incr in \complexdosom - \allowitembreak - \fi\fi\fi - \complexdoitemgroupitem[#1]% - \bgroup - \dosetitemattributes\currentitemlevel\c!headstyle\c!headcolor\empty - \ignorespaces - \itemgroupfinalizer{\enditemhead}% - \let\par\enditemhead} % brrrr but simple anyway - -\def\enditemhead - {\removeunwantedspaces - \egroup - \ifconditional\textlistitem - \space\ignorespaces - \else - \par - \fi - \noitembreak - \ifconditional\packlistitem\else\itemafterheadcommand\fi - \noitembreak - \noindentation} - -\definecomplexorsimpleempty\head -\definecomplexorsimpleempty\doitemgrouphead - -\def\sym#1% - {\noindent - \begingroup - \setbox\scratchbox\hbox{\settrialtypesetting#1}% - \setbox\scratchbox\hbox - \ifdim\wd\scratchbox<1em to 1.5\else spread 1\fi em{#1\hfil}% - \normalexpanded{\box\scratchbox\endgroup\hangindent\the\wd\scratchbox}% - \ignorespaces} - -\setupitemgroups - [\c!margin=\zeropoint, - \c!leftmargin=\zeropoint, - \c!rightmargin=\zeropoint, - \c!indentnext=\v!yes, - \c!width=1.5em, - \c!factor=0, - \c!distance=.5em, - %\c!align=\v!normal, % definitely not \v!normal, see mails and - %\c!align=, % debug reports of David A & Patrick G on context list - %\c!symalign=, - %\c!color=, - %\c!indenting=, % untouched if empty - %\c!style=, - \c!marstyle=\c!type, % \c! ??? - %\c!symstyle=, - %\c!headstyle=, - %\c!marcolor=, - %\c!symcolor=, - %\c!headcolor=, - %\c!beforehead=, - \c!afterhead=\blank, - \c!before=\blank, - \c!inbetween=\blank, - \c!after=\blank, - %\c!stopper=., - \c!placestopper=\v!yes, - \c!stopper=., - %\c!inner=, - \c!n=2, - \c!items=4, - \c!levels=10, - \c!lefttext=(, - \c!righttext=), - \c!start=1, - \c!criterium=\v!all, % permits 0 and negative numbers - %\c!option=, - \c!textdistance=\v!big, - \c!command=\defaultitemcommand, - \c!indenting=\v!next, - %\c!alignsymbol=v!no, - \c!symbol=\currentitemlevel] - -% new: - -\setupitemgroups - [\c!step=.5em, % deals with broad - \c!distance=\zeropoint] - -\setupitemgroups - [\c!prefix=\v!no, -% \c!prefixstopper=., -% \c!prefixseparatorset=, -% \c!prefixconversion=, -% \c!prefixconversionset=, -% \c!prefixset=, -% \c!prefixsegments=1:100, - \c!prefixconnector=., - % - \c!numberseparatorset=, - \c!numberconversionset=, - \c!numberstopper=., - \c!numbersegments=1] - -\defineitemgroup [\v!itemize] - -\protect \endinput diff --git a/tex/context/base/strc-itm.mkvi b/tex/context/base/strc-itm.mkvi new file mode 100644 index 000000000..b92fc031a --- /dev/null +++ b/tex/context/base/strc-itm.mkvi @@ -0,0 +1,1514 @@ +%D \module +%D [ file=strc-itm, +%D version=2008.10.20, +%D title=\CONTEXT\ Structure Macros, +%D subtitle=Itemgroups, +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +\writestatus{loading}{ConTeXt Structure Macros / Itemgroups} + +\registerctxluafile{strc-itm}{1.001} + +% todo: check breaks +% todo: check grouping + +% \startitemize[n,packed] +% \item test \item test \item test +% \stopitemize +% +% \startitemize[n,packed,reverse] +% \item test \item test \item test +% \stopitemize +% +% \startitemize[n,packed,reverse] \item test \item test \stopitemize +% \startitemize[continue] +% \item test \startitemize[n,packed] \item test \item test \stopitemize +% \item test +% \item test +% \stopitemize +% \startitemize[continue] \item test \stopitemize +% +% \startitemize[n,packed] \item test \item test \stopitemize +% \startitemize[continue] \item test \stopitemize +% \startitemize[continue] \item test \stopitemize +% +% \setupwhitespace[big] +% \starttext +% test \startitemize[joinedup] \item test \item test \stopitemize test \par +% test \startitemize[joinedup,nowhite] \item test \item test \stopitemize test \par +% test \startitemize[joinedup,nowhite,before] \item test \item test \stopitemize test \par +% test \startitemize[joinedup,nowhite,after] \item test \item test \stopitemize test \par +% \stoptext +% +% test / example +% +% \startnarrower[left] \startcolumns[n=3] \startitemize +% \item \input ward \item \input ward \item \input ward +% \stopitemize \stopcolumns\stopnarrower \blank +% +% \startnarrower[left] \startitemize[columns,three] +% \item \input ward \item \input ward \item \input ward +% \stopitemize \stopnarrower \blank +% +% \setupitemize[leftmargin=1.5em] \startitemize[columns,three] +% \item \input ward \item \input ward \item \input ward +% \stopitemize \blank +% +% beware, we don't group (yet) as we want to keep the left/right skip +% +% \startitemize +% \startitem \stopitem +% some intermediate text that will properly indent +% \startitem \stopitem +% \stopitem +% +% so we need to keep that property +% +% \startitemize +% \starthead {xx} test \stophead +% \startitem test \stopitem +% \startitem test \stopitem +% \stopitemize +% +% Sometimes the user demands get pretty weird: +% +% \startitemize +% \item test +% \item test +% \headsym{xx} test \par test +% \stopitemize +% +% aligned items +% +% \startitemize[n,fit,broad][itemalign=flushright] +% \dorecurse{100}{\item The first item.} +% \stopitemize +% +% \setupitemgroup[itemize][each][fit] +% \setupitemgroup[itemize][each][distance=.5em,factor=1,itemalign=flushright] +% +% \startitemize[n] +% \dorecurse{100}{\item The first item.} +% \stopitemize +% +% \defineitemgroup[gbitemize] +% \setupitemgroup[gbitemize][each][headstyle=bold] +% +% \startgbitemize +% \txt{italian} some italians like this kind of cross||breed between +% an itemize and a description +% \txt{sicilians} i wonder how many sicilian mathematicians do a thesis +% on the math involved in predicting the next big bang of the vulcano +% \stopgbitemize +% +% \startitemize[n,repeat] +% \noitem \startitemize[a] \item Item 1.a. \item Item 1.b. \stopitemize +% \noitem \startitemize[a] \item Item 2.a. \item Item 2.b. \stopitemize +% \stopitemize +% +% \startbuffer +% \item +% \startitemize[n] +% \item item 1.1 +% \item item 1.2 +% \startitemize[n] \item item 1.2.1 \item item 1.2.2 \stopitemize +% \item item 1.3 +% \stopitemize +% \item +% \startitemize[n] \item item 2.1 \item item 2.2 \stopitemize +% \item item 3 +% \startitemize[n] \item item 3.1 \item item 3.2 \stopitemize +% \item +% \startitemize[n] \item item 4.1 \item item 4.2 \stopitemize +% \stopbuffer +% +% \startitemize[n,repeat,6*broad,packed] \getbuffer \stopitemize \blank[3*big] +% \startitemize[n,repeat,packed] \getbuffer \stopitemize \blank[3*big] +% \setupitemize[each][atmargin][width=3em] +% \startitemize[n,repeat,packed] \getbuffer \stopitemize +% +% todo: assume startitem ... stopitem and do an autostopitem .. cleaner for +% elements +% +% \startitemize[text][space=medium] +% \item one \item two \item three +% \stopitemize +% +% For Giuseppe "Oblomov" Bilotta, inspired on a suggestion by Taco +% Hoekwater. +% +% \def\MyItemCommand#1{{\bf#1}\quad} +% \setupitemgroup[itemize][command=\MyItemCommand] +% +% \startitemize +% \item {test} is this okay? +% \item {test} is this okay? +% \item {test} is this okay? +% \stopitemize + +\unprotect + +\newconditional\c_itemgroups_sub +\newconditional\c_itemgroups_head +\newconditional\c_itemgroups_intro +\newconditional\c_itemgroups_randomize +\newconditional\c_itemgroups_auto_intro +\newconditional\c_itemgroups_pack +\newconditional\c_itemgroups_paragraph +\newconditional\c_itemgroups_text +\newconditional\c_itemgroups_text_saved +\newconditional\c_itemgroups_first +\newconditional\c_itemgroups_before +\newconditional\c_itemgroups_after +\newconditional\c_itemgroups_nowhite +\newconditional\c_itemgroups_joined +\newconditional\c_itemgroups_reverse +\newconditional\c_itemgroups_continue +\newconditional\c_itemgroups_fitting +\newconditional\c_itemgroups_indented_first +\newconditional\c_itemgroups_inline +\newconditional\c_itemgroups_columns +\newconditional\c_itemgroups_concat +\newconditional\c_itemgroups_txt +\newconditional\c_itemgroups_repeat + +% 0 = before/after +% 1 = between unless before +% 2 = between + +\newconstant \c_itemgroups_spacing_mode \c_itemgroups_spacing_mode\plustwo +\newconditional\c_itemgroups_optimize \settrue\c_itemgroups_optimize +\newconditional\c_itemgroups_auto_concat \settrue\c_itemgroups_auto_concat + +\newsignal \d_itemgroups_signal + +\newbox \b_itemgroups + +\newdimen \d_itemgroups_list_width +\newdimen \d_itemgroups_asked_width + +\newdimen \d_itemgroups_max_width % multipass +\newcount \c_itemgroups_max_items % multipass + +\newcount \c_itemgroups_n_of_lists +\newcount \c_itemgroups_n_of_items +\newcount \c_itemgroups_nesting +\newcount \c_itemgroups_column_depth + +\def \v_itemgroups_counter {itemgroup:\currentparentitemgroup} + +\let \m_itemgroups_repeat_start \empty +\let \m_itemgroups_conversion_set \empty +\def \m_itemgroups_item_symbol {n} +\def \v_itemgroups_unknown_symbol {?} + +\let \m_itemgroups_indenting \empty +\let \m_itemgroups_destination \empty + +\let \currentitemlevel \!!zerocount % public +\def \currentnofitems {\the\c_itemgroups_max_items} +\def \currentitemnumber {\dorawsubstructurecounter[\v_itemgroups_counter][\currentitemlevel]} % public + +\newtoks \itemgroupcommands % maybe public + +\def\itemgroups_register_status + {\iftrialtypesetting \else + \ctxcommand{registeritemgroup("\currentitemgroup",\number\c_itemgroups_n_of_items,"\itemgroupparameter\c!maxwidth")}% + \fi} + +\def\itemgroups_check_n_of_items % we could do this at the lua end and save a call (i.e. will be dimen and counter) + {\c_itemgroups_max_items\ctxcommand{nofitems("\currentitemgroup",\number\c_itemgroups_n_of_lists)}\relax + \d_itemgroups_max_width\ctxcommand{maxitemwidth("\currentitemgroup",\number\c_itemgroups_n_of_lists)}\scaledpoint + \edef\currentnofitems{\the\c_itemgroups_max_items}} + +% todo: \dodosetreference -> \dostructurecountercomponent (to be checked) + +\def\itemgroups_insert_reference % we will make a decent number helper + {\iftrialtypesetting \else \ifx\currentitemreference \empty \else + \itemgroups_insert_reference_indeed + \fi \fi} + +\def\itemgroups_insert_reference_indeed + {\setnextinternalreference + \ctxlua {structures.references.setandgetattribute("\s!full", "\referenceprefix","\currentitemreference", + { + metadata = { + kind = "item",% ? + catcodes = \the\catcodetable, + xmlroot = \ifx\currentreferencecoding\s!xml "\xmldocument" \else nil \fi, % only useful when text + }, + references = { + internal = \nextinternalreference, + section = structures.sections.currentid(), + }, + prefixdata = structures.helpers.simplify { + prefix = "\structurecounterparameter\v_itemgroups_counter\c!prefix", + separatorset = "\structurecounterparameter\v_itemgroups_counter\c!prefixseparatorset", + conversion = \!!bs\structurecounterparameter\v_itemgroups_counter\c!prefixconversion\!!es, + conversionset = "\structurecounterparameter\v_itemgroups_counter\c!prefixconversionset", + set = "\structurecounterparameter\v_itemgroups_counter\c!prefixset", + segments = "\structurecounterparameter\v_itemgroups_counter\c!prefixsegments", + % segments = "\askedprefixsegments", + connector = \!!bs\structurecounterparameter\v_itemgroups_counter\c!prefixconnector\!!es, + }, + numberdata = structures.helpers.simplify { + numbers = structures.counters.compact("\v_itemgroups_counter",nil,true), + separatorset = "\structurecounterparameter\v_itemgroups_counter\c!numberseparatorset", + conversion = "\structurecounterparameter\v_itemgroups_counter\c!numberconversion", + conversionset = "\structurecounterparameter\v_itemgroups_counter\c!numberconversionset", + % for the moment no stopper, we need to make references configurable first + % stopper = \!!bs\structurecounterparameter\v_itemgroups_counter\c!numberstopper\!!es, + segments = "\structurecounterparameter\v_itemgroups_counter\c!numbersegments", + }, + }) + }% + \xdef\currentitemattribute{\number\lastdestinationattribute}% + \begingroup + \attribute\destinationattribute\currentitemattribute + \kern\zeropoint % signal + \endgroup} + +%D Defining and setup: + +\installcommandhandler \??op {itemgroup} \??op + +\let\setupitemgroups\setupitemgroup + +\appendtoks + \setuevalue{\e!start\currentitemgroup}{\startitemgroup[\currentitemgroup]}% + \setuevalue{\e!stop \currentitemgroup}{\stopitemgroup}% + \setuevalue{\e!setup\currentitemgroup\e!endsetup}{\setupitemgroup[\currentitemgroup]}% obsolete +% \let\currentparentitemgroup\currentitemgroup +% \definestructurecounter[\v_itemgroups_counter]% +% \definestructureconversionset[\v_itemgroups_counter][\m_itemgroups_conversion_set][\m_itemgroups_item_symbol]% +\to \everydefineitemgroup + +%D Global states + +\def\itemgroups_store_continue_state#options#settings% + {\setxvalue{\??op:o:\currentitemgroup}{\itemgroups_process_options{#options}}% + \setgvalue{\??op:s:\currentitemgroup}{\setupcurrentitemgroup [#settings]}} + +\def\itemgroups_fetch_continue_state + {\getvalue{\??op:o:\currentitemgroup}% + \getvalue{\??op:s:\currentitemgroup}} + +\def\itemgroups_reset_continue_state + {\letgvalue{\??op:o:\currentitemgroup}\relax + \letgvalue{\??op:s:\currentitemgroup}\relax} + +\definevspacing[\v!item @0] [penalty:0] % allow +\definevspacing[\v!item @10000] [penalty:10000] % no +\definevspacing[\v!item @-5] [penalty:-5] +\definevspacing[\v!item @5] [penalty:5] +\definevspacing[\v!item @500] [penalty:500] + +\def\itemgroups_insert_break_when_needed#break% + {\ifconditional\c_itemgroups_optimize + \ifconditional\c_itemgroups_text \else + #break\relax + \fi + \fi} + +\def\itemgroups_insert_breakallow {\itemgroups_insert_break_when_needed\itemgroups_insert_breakallow_indeed} +\def\itemgroups_insert_breakno {\itemgroups_insert_break_when_needed\itemgroups_insert_breakno_indeed } +\def\itemgroups_insert_break {\itemgroups_insert_break_when_needed\itemgroups_insert_break_indeed } +\def\itemgroups_insert_nobreak {\itemgroups_insert_break_when_needed\itemgroups_insert_nobreak_indeed } + +\def\itemgroups_insert_breakallow_indeed{\vspacing[\v!item @0]} +\def\itemgroups_insert_breakno_indeed {\vspacing[\v!item @10000]} +\def\itemgroups_insert_break_indeed {\flushnotes + \vspacing[\v!item @-5]} +\def\itemgroups_insert_nobreak_indeed {\flushnotes + \ifinsidecolumns + \vspacing[\v!item @5]% + \else + \vspacing[\v!item @500]% + \fi} + +\unexpanded\def\itemgroups_process_options#options% + {\processcommacommand[#options]\itemgroups_process_option} % expansion of options is handy for xml + +\def\itemgroups_process_option#option% + {\edef\itemgroupconstantvalue{#option}% + \ifx\itemgroupconstantvalue\empty\else + \splitstring\itemgroupconstantvalue\at*\to\itemgroupfirst\and\itemgroupsecond + \ifx\itemgroupsecond\empty + \let\itemgroupsecond\itemgroupfirst + \let\itemgroupfirst\!!plusone + \fi + \ifcsname\??op:k:\itemgroupsecond\endcsname + \csname\??op:k:\itemgroupsecond\endcsname + \else + \itemgroups_set_symbol\itemgroupconstantvalue + \fi + \fi} + +\def\itemgroups_process_set_option_pack + {\ifcase\c_itemgroups_nesting \else + \settrue\c_itemgroups_pack + \fi} + +\setvalue{\??op:k:\!!zerocount}{} % ignore 0 +\setvalue{\??op:k:\v!packed }{\itemgroups_process_set_option_pack} +\setvalue{\??op:k:\v!intro }{\settrue\c_itemgroups_intro} % here? not set to false +\setvalue{\??op:k:\v!autointro}{\settrue\c_itemgroups_auto_intro} +\setvalue{\??op:k:\v!broad }{\ifx\itemgroupfirst\empty + \let\itemgroupfirst\!!plusone + \fi + \letitemgroupparameter\c!factor\itemgroupfirst} +\setvalue{\??op:k:\v!text }{\settrue\c_itemgroups_text + \settrue\c_itemgroups_inline + \settrue\c_itemgroups_joined + \itemgroups_process_set_option_pack} +\setvalue{\??op:k:\v!columns }{\itemgroups_process_set_option_pack} +\setvalue{\??op:k:\v!before }{\settrue\c_itemgroups_before} +\setvalue{\??op:k:\v!after }{\settrue\c_itemgroups_after} +\setvalue{\??op:k:\v!nowhite }{\settrue\c_itemgroups_nowhite} +\setvalue{\??op:k:\v!margin }{\setitemgroupparameter\c!width{-2em}} % signal +\setvalue{\??op:k:\v!inmargin }{\setitemgroupparameter\c!width{-2em}} % signal +\setvalue{\??op:k:\v!atmargin }{\ifnum\c_itemgroups_nesting>\plusone + \setitemgroupparameter\c!width{0em}% + \fi} % signal +\setvalue{\??op:k:\v!intext }{\settrue\c_itemgroups_inline} +\setvalue{\??op:k:\v!loose }{\setfalse\c_itemgroups_optimize} +\setvalue{\??op:k:\v!fit }{\settrue\c_itemgroups_fitting} +\setvalue{\??op:k:\v!nofit }{\setfalse\c_itemgroups_fitting} +\setvalue{\??op:k:\v!paragraph}{\settrue\c_itemgroups_paragraph + \itemgroups_process_set_option_pack} +\setvalue{\??op:k:\v!joinedup }{\settrue\c_itemgroups_joined + \itemgroups_process_set_option_pack} +\setvalue{\??op:k:\v!serried }{\edef\itemgroupfirst{-\ifx\itemgroupfirst\empty1\else\itemgroupfirst\fi}% + \letitemgroupparameter\c!factor\itemgroupfirst} +\setvalue{\??op:k:\v!stopper }{\letitemgroupparameter\c!placestopper\v!yes} % keep {} +\setvalue{\??op:k:\v!unpacked }{\setfalse\c_itemgroups_pack} +\setvalue{\??op:k:\v!repeat }{\settrue\c_itemgroups_repeat} +\setvalue{\??op:k:\v!reverse }{\settrue\c_itemgroups_reverse} +\setvalue{\??op:k:\v!columns }{\settrue\c_itemgroups_columns} +\setvalue{\??op:k:\v!one }{\letitemgroupparameter\c!n\plusone} +\setvalue{\??op:k:\v!two }{\letitemgroupparameter\c!n\plustwo} +\setvalue{\??op:k:\v!three }{\letitemgroupparameter\c!n\plusthree} +\setvalue{\??op:k:\v!four }{\letitemgroupparameter\c!n\plusfour} +\setvalue{\??op:k:\v!five }{\letitemgroupparameter\c!n\plusfive} +\setvalue{\??op:k:\v!standard }{\setupcurrentitemgroup + [\c!width=1.5em,\c!factor=0,\c!distance=.5em,\c!inner=,\c!factor=0,% + \c!beforehead=,\c!afterhead=\blank,% + \c!before=\blank,\c!inbetween=\blank,\c!after=\blank]} + +\def\itemgroups_initialize_local + {\setfalse\c_itemgroups_inline + \setfalse\c_itemgroups_concat + \setfalse\c_itemgroups_txt + % + \setfalse\c_itemgroups_reverse + \setfalse\c_itemgroups_intro + \setfalse\c_itemgroups_auto_intro + \setfalse\c_itemgroups_before + \setfalse\c_itemgroups_after + \setfalse\c_itemgroups_nowhite + \setfalse\c_itemgroups_randomize + \setfalse\c_itemgroups_intro + \setfalse\c_itemgroups_continue + % this will be a constant + \setfalse\c_itemgroups_head + \setfalse\c_itemgroups_sub + \setfalse\c_itemgroups_columns + % to be checked + \let\m_itemgroups_destination\empty + \let\itemgroups_used_symbol\empty % ** start value + \let\itemgroups_margin_symbol\empty + \let\itemgroups_extra_symbol\empty + % + \global\letitemgroupparameter\c!maxwidth\!!zerocount + } + +\setvalue{\??op:1:\v!intro }{\settrue\c_itemgroups_intro } +\setvalue{\??op:1:\v!random }{\settrue\c_itemgroups_randomize} +\setvalue{\??op:1:\v!continue}{\settrue\c_itemgroups_continue } + +\def\itemgroups_preset_stage_one#options% + {\processcommacommand[#options]\itemgroups_preset_stage_one_indeed} + +\def\itemgroups_preset_stage_one_indeed#option% + {\ifcsname\??op:1:#option\endcsname + \csname\??op:1:#option\endcsname + \fi} + +\ifdefined\dotagsetitemgroup \else \let\dotagsetitemgroup\relax \fi + +\def\itemgroups_tag_start_group + {\dostarttagged\t!itemgroup\currentitemgroup + \dotagsetitemgroup} + +\def\itemgroups_tag_stop_group + {\dostoptagged} + +\def\itemgroups_before_command + {\ifconditional\c_itemgroups_nowhite + \ifconditional\c_itemgroups_before + \ifcase\c_itemgroups_nesting\or\itemgroupparameter\c!before\fi + \else + \nowhitespace + \fi + \else\ifconditional\c_itemgroups_joined + % \empty + \else + \itemgroupparameter\c!before + \fi\fi} + +\def\itemgroups_after_command + {\ifconditional\c_itemgroups_nowhite + \ifconditional\c_itemgroups_after + \ifcase\c_itemgroups_nesting\or\itemgroupparameter\c!after\fi + \else + \nowhitespace + \fi + \else\ifconditional\c_itemgroups_joined + % \empty + \else + \itemgroupparameter\c!after + \fi\fi} + +\def\itemgroups_between_command + {\ifconditional\c_itemgroups_nowhite + \nowhitespace + \else\ifconditional\c_itemgroups_joined + % \empty + \else + \itemgroupparameter\c!inbetween + \fi\fi} + +\def\itemgroups_before_head_command + {\ifconditional\c_itemgroups_nowhite + \nowhitespace + \else\ifconditional\c_itemgroups_joined + % \empty + \else + \itemgroupparameter\c!beforehead + \fi\fi} + +\def\itemgroups_after_head_command + {\ifconditional\c_itemgroups_nowhite + \nowhitespace + \else\ifconditional\c_itemgroups_joined + % \empty + \else + \itemgroupparameter\c!afterhead + \fi\fi} + +% compatible setup command: + +\let\normal_setup_itemgroup\setupitemgroup + +\unexpanded\def\setupitemgroup + {\doquadrupleempty\itemgroups_setup} + +\def\itemgroups_setup[#category][#levels][#options][#settings]% category level|each options|settings settings|options + {\edef\itemgroups_setup_what{#levels}% + \iffourthargument + \ifx\itemgroups_setup_what\v!each + \itemgroups_setup_each{#category}{#options}% + \itemgroups_setup_each{#category}{#settings}% + \else + \itemgroups_setup_list{#levels}{#category}{#options}% + \itemgroups_setup_list{#levels}{#category}{#settings}% + \fi + \else\ifthirdargument + \ifx\itemgroups_setup_what\v!each + \itemgroups_setup_each{#category}{#options}% + \else + \itemgroups_setup_list{#levels}{#category}{#options}% + \fi + \else\ifsecondargument + \itemgroups_setup_each{#category}{#levels}% + \else + \normal_setup_itemgroup[#category]% == settings + \fi\fi\fi} + +% can be made a bit faster + +\def\itemgroups_setup_each#category#whatever% + {\doifassignmentelse{#whatever} + {\normal_setup_itemgroup[#category][#whatever]} + {\normal_setup_itemgroup[#category][\c!option={#whatever}]}} + +\def\itemgroups_setup_list_level_a#category#whatever#level% + {\normal_setup_itemgroup[#category:#level][\c!option={#whatever}]} + +\def\itemgroups_setup_list_level_b#category#whatever#level% + {\normal_setup_itemgroup[#category:#level][#whatever]} + +\def\itemgroups_setup_list#subcategories#category#whatever% + {\doifassignmentelse{#whatever} + {\processcommalist[#subcategories]{\itemgroups_setup_list_level_a{#category}{#whatever}}} + {\processcommalist[#subcategories]{\itemgroups_setup_list_level_b{#category}{#whatever}}}} + +\def\itemgroups_increment_item_counter + {\ifconditional\c_itemgroups_sub \else \ifx\itemgroups_extra_symbol\empty + \doincrementsubstructurecounter[\v_itemgroups_counter][\currentitemlevel]% + \fi\fi} + +\unexpanded\def\itemgroups_insert_item_counter + {\ifconditional\c_itemgroups_repeat + \ifcase\c_itemgroups_nesting + % skip + \or + \itemgroups_insert_item_counter_indeed % this could become an option + \else + \itemgroups_insert_item_counter_indeed + \fi + \else + \itemgroups_insert_item_counter_indeed + \fi} + +\def\itemgroups_insert_item_counter_indeed + {\begingroup + \setupstructurecounter + [\v_itemgroups_counter] + [%\c!prefix=\v!no, + \c!prefix=\itemgroupparameter\c!prefix, + \c!prefixstopper=\itemgroupparameter\c!prefixstopper, + \c!prefixseparatorset=\itemgroupparameter\c!prefixseparatorset, + \c!prefixconversion=\itemgroupparameter\c!prefixconversion, + \c!prefixconversionset=\itemgroupparameter\c!prefixseparatorset, + \c!prefixset=\itemgroupparameter\c!prefixset, + \c!prefixsegments=\itemgroupparameter\c!prefixsegments, + \c!prefixconnector=\itemgroupparameter\c!prefixconnector, + \c!criterium=\itemgroupparameter\c!criterium, + \c!numberorder=\ifconditional\c_itemgroups_reverse\v!reverse\else\v!normal\fi, + \c!numberstopper=\expdoif{\itemgroupparameter\c!placestopper}\v!yes{\itemgroupparameter\c!stopper}, + %\c!numberseparatorset=, + \c!numberconversionset=itemgroup:\currentparentitemgroup, + %\c!numberconversion=\m_itemgroups_item_symbol, + \c!numbersegments=\ifx\m_itemgroups_repeat_start\empty\else\m_itemgroups_repeat_start:\fi\currentitemlevel]% + \convertedstructurecounter[\v_itemgroups_counter]% [\number\currentitemlevel]% + \itemgroups_insert_reference + \endgroup} + +\def\itemgroups_set_symbol#symbol% + {\edef\itemgroups_tmp_symbol{#symbol}% + \ifx\itemgroups_tmp_symbol\empty \else + \doifsymboldefinedelse\itemgroups_tmp_symbol + \itemgroups_set_symbol_symbol + {\doifconversiondefinedelse\itemgroups_tmp_symbol + \itemgroups_set_symbol_conversion + \donothing}% + \fi} + +\def\itemgroups_set_symbol_symbol + {\let\m_itemgroups_item_symbol\itemgroups_tmp_symbol + \itemgroups_store_global_symbol\m_itemgroups_item_symbol + \itemgroups_store_local_symbol\v_itemgroups_unknown_symbol + \let\itemgroups_used_symbol\itemgroups_set_symbol_symbol_item + \let\itemgroups_asked_symbol\empty} + +\def\itemgroups_set_symbol_conversion + {\let\m_itemgroups_item_symbol\itemgroups_tmp_symbol + \itemgroups_store_global_symbol\m_itemgroups_item_symbol + \itemgroups_store_local_symbol\itemgroups_insert_item_counter + \let\itemgroups_used_symbol\itemgroups_set_symbol_conversion_item + \let\itemgroups_asked_symbol\empty} + +\def\itemgroups_set_symbol_symbol_item + {\symbol[\m_itemgroups_item_symbol]} + +\def\itemgroups_set_symbol_conversion_item + {\ifconditional\c_itemgroups_text + % maybe block stopper here, but one can as well clone an itemgroup then + \itemgroupparameter\c!lefttext + \itemgroups_fetch_local_symbol + \itemgroupparameter\c!righttext + \else + \itemgroupparameter\c!left + \itemgroups_fetch_local_symbol + \itemgroupparameter\c!right + \fi} + +\def\itemgroups_calculate_list_width#level% + {\let\savedcurrentitemgroup\currentitemgroup + \edef\currentitemgroup{\currentparentitemgroup:\number#level}% + \ifdim\d_itemgroups_max_width>\zeropoint + \d_itemgroups_list_width\d_itemgroups_max_width + \else\ifnum\itemgroupparameter\c!factor>\zerocount + \d_itemgroups_list_width\itemgroupparameter\c!step\relax + \ifdim\d_itemgroups_list_width=\zeropoint \d_itemgroups_list_width=.5em\fi + \multiply\d_itemgroups_list_width \itemgroupparameter\c!factor + \advance\d_itemgroups_list_width\itemgroupparameter\c!width\relax + \else + \d_itemgroups_list_width\itemgroupparameter\c!width\relax + \fi\fi + \advance\d_itemgroups_list_width\itemgroupparameter\c!distance\relax + \let\currentitemgroup\savedcurrentitemgroup} + +\unexpanded\def\startitemgroup + {\dotripleempty\itemgroups_start} + +\def\itemgroups_start[#category][#options][#settings]% + {\begingroup % (1) + \def\currentitemgroup{#category}% no nested mixing of itemgroups + \let\currentparentitemgroup\currentitemgroup + \global\advance\c_itemgroups_nesting\plusone + \def\currentitemlevel{\number\c_itemgroups_nesting}% + \normalexpanded{\chaintocurrentitemgroup{\currentparentitemgroup:\currentitemlevel}}% + \edef\currentitemgroup{\currentparentitemgroup:\currentitemlevel}% + % + \ifthirdargument + \itemgroups_start_indeed[#options][#settings]% + \else\ifsecondargument + \doifassignmentelse{#options} + {\itemgroups_start_indeed[][#options]} + {\itemgroups_start_indeed[#options][]}% + \else + \itemgroups_start_indeed[][]% + \fi\fi} + +\def\itemgroups_start_indeed[#options][#settings]% + {\edef\itemgroupoptions{\itemgroupparameter\c!option}% + \edef\itemgroupextraoptions{#options}% + \ifx\itemgroupoptions\empty + \let\itemgroupoptions\itemgroupextraoptions + \else\ifx\itemgroupextraoptions\empty + % ok + \else + \edef\itemgroupoptions{\itemgroupoptions,\itemgroupextraoptions}% + \fi\fi + \redostartitemgroup{#settings}} + +\let\startcollectitems\relax +\let\stopcollectitems \relax + +\ifdefined\startcolumns \else \unexpanded\def\startcolumns[#settings]{} \fi +\ifdefined\stopcolumns \else \unexpanded\def\stopcolumns {} \fi + +\letvalue{\??op:a:\v!flushleft }\relax +\letvalue{\??op:a:\v!right }\relax +\letvalue{\??op:a:\v!flushright}\hfill +\letvalue{\??op:a:\v!left }\hfill +\letvalue{\??op:a:\v!middle }\hfil +\letvalue{\??op:a:\v!center }\hfil + +\def\itemgroups_left_sym_filler + {\csname\??op:a:\itemgroupparameter\c!symalign\endcsname} + +% symbols + states + +\def\itemgroups_store_global_symbol#symbol% + {\letgvalue{\??op:g:\currentitemlevel}#symbol} + +\def\itemgroups_store_local_symbol#symbol% + {\letgvalue{\??op:l:\currentitemlevel}#symbol} + +\def\itemgroups_fetch_global_symbol + {\getvalue{\??op:g:\currentitemlevel}} + +\def\itemgroups_fetch_local_symbol + {\getvalue{\??op:l:\currentitemlevel}} + +\def\itemgroups_setup_symbol_default + {\edef\itemgroups_asked_symbol{\itemgroupparameter\c!symbol}% + \itemgroups_store_global_symbol\empty} + +\def\itemgroups_setup_symbol_continue + {\ifcsname\??op:g:\currentitemlevel\endcsname + \let\itemgroups_asked_symbol\itemgroups_fetch_global_symbol + \else + \let\itemgroups_asked_symbol\currentitemlevel + \fi} + +\def\itemgroups_setup_symbol_asked + {\edef\itemgroups_asked_symbol{\itemgroupparameter\c!symbol}} + +\unexpanded\def\redostartitemgroup#settings% k/v + {\begingroup % (2) + \the\itemgroupcommands + \let\c_itemgroups_text_saved\c_itemgroups_text + \itemgroups_initialize_local + \itemgroups_preset_stage_one\itemgroupoptions + \ifhmode + \ifconditional\c_itemgroups_auto_concat + \ifdim\lastskip=\d_itemgroups_signal + \settrue\c_itemgroups_concat + \fi + \fi + \ifconditional\c_itemgroups_text_saved \else + \ifconditional\c_itemgroups_text \else + \par + \fi + \fi + \fi + \iftrialtypesetting + \savestructurecounter[\v_itemgroups_counter]% + \fi + \global\advance\c_itemgroups_n_of_lists\plusone + \c_itemgroups_n_of_items\zerocount + \itemgroups_check_n_of_items + \ifx\itemgroupoptions\empty + \itemgroups_setup_symbol_default + \itemgroups_reset_continue_state + \setupcurrentitemgroup[#settings]% + \else + \itemgroups_process_options\itemgroupoptions + \setupcurrentitemgroup[#settings]% + \ifconditional\c_itemgroups_continue + \itemgroups_setup_symbol_continue + \itemgroups_fetch_continue_state + \else + \itemgroups_setup_symbol_asked + \itemgroups_store_continue_state\itemgroupoptions{#settings}% + \fi + \fi + \ifnum\c_itemgroups_nesting=\plusone % NIEUW + \doadaptleftskip {\itemgroupparameter\c!margin}% + \doadaptleftskip {\itemgroupparameter\c!leftmargin}% + \doadaptrightskip{\itemgroupparameter\c!rightmargin}% + \fi + \dosetraggedcommand{\itemgroupparameter\c!align}\raggedcommand + \edef\m_itemgroups_indenting{\itemgroupparameter\c!indenting}% + \ifnum\c_itemgroups_nesting>\zerocount + \settrue\c_itemgroups_first + \ifconditional\c_itemgroups_continue \else + \dorestartsubstructurecounter + [\v_itemgroups_counter]% + [\currentitemlevel]% + {\the\numexpr\itemgroupparameter\c!start-\plusone\relax}% + \fi + \fi + \ifx\itemgroups_used_symbol\empty + \itemgroups_set_symbol\itemgroups_asked_symbol % ** default value + \ifx\itemgroups_used_symbol\empty + \let\m_itemgroups_item_symbol\currentitemlevel % ** fall back + \fi + \fi + \ifconditional\c_itemgroups_auto_intro\ifnum\prevgraf<\plusthree + \settrue\c_itemgroups_intro + \fi\fi + \ifconditional\c_itemgroups_paragraph + \ifnum\c_itemgroups_nesting>\plusone + \letitemgroupparameter\c!inbetween\empty + \fi + \fi + \ifconditional\c_itemgroups_pack + \letitemgroupparameter\c!inbetween\empty + \fi + \ifconditional\c_itemgroups_columns + \ifinsidecolumns\else\ifcase\c_itemgroups_column_depth + \global\c_itemgroups_column_depth\c_itemgroups_nesting % global ? + \itemgroups_before_command + \itemgroups_tag_start_group + \itemgroups_start_columns + \fi\fi + \fi + \ifconditional\c_itemgroups_fitting + \ifdim\d_itemgroups_max_width>\zeropoint + \letitemgroupparameter\c!width\d_itemgroups_max_width + \fi + \fi + \itemgroups_calculate_list_width\c_itemgroups_nesting + \ifdim\d_itemgroups_list_width>\zeropoint\relax + \ifconditional\c_itemgroups_inline\else + \advance\leftskip\d_itemgroups_list_width\relax + \fi + \fi + \ifx\m_itemgroups_repeat_start\empty + \let\m_itemgroups_conversion_set\m_itemgroups_item_symbol + \else + \edef\m_itemgroups_conversion_set{\m_itemgroups_conversion_set,\m_itemgroups_item_symbol}% + \fi + \d_itemgroups_asked_width\itemgroupparameter\c!width\relax + \startcollectitems} + +\def\itemgroups_start_columns + {\startcolumns + [\c!n=\itemgroupparameter\c!n, + \c!height=, + \c!rule=\v!off, + \c!balance=\v!yes, + \c!align=\v!no]} + +\def\itemgroups_stop_columns + {\stopcolumns} + +\unexpanded\def\stopitemgroup + {\stopcollectitems + \ifconditional\c_itemgroups_text + \removeunwantedspaces + \space + \ignorespaces + \else + \par + \fi + \itemgroups_register_status + \ifconditional\c_itemgroups_first \else + \dostoptagged + \dostoptagged + % \endgroup % (3) + \fi + \ifnum\c_itemgroups_column_depth=\c_itemgroups_nesting\relax + \itemgroups_stop_columns + \global\c_itemgroups_column_depth\zerocount % global ? + \itemgroups_tag_stop_group + \itemgroups_after_command + \dontrechecknextindentation + \else\ifnum\c_itemgroups_nesting=\plusone + \itemgroups_insert_breakallow + \itemgroups_tag_stop_group + \itemgroups_after_command + \checknextindentation[\itemgroupparameter\c!indentnext]% + \else + % nieuw, not yet nobreak handling + \itemgroups_tag_stop_group + \ifcase\c_itemgroups_spacing_mode + \itemgroups_after_command + \or + \itemgroups_after_command + \fi + \dontrechecknextindentation + \fi\fi + % new test, needed in sidefloats (surfaced in volker's proceedings) + \iftrialtypesetting + \restorestructurecounter[\v_itemgroups_counter]% + \global\advance\c_itemgroups_n_of_lists\minusone + \fi + \global\advance\c_itemgroups_nesting\minusone + \xdef\currentitemlevel{\number\c_itemgroups_nesting}% + \endgroup % (2) + \endgroup % (1) + \ifconditional\c_itemgroups_text \else + \par % hm, already done + \fi + \dorechecknextindentation} + +% The items. + +\unexpanded\def\startitemgroupitem + {\dosingleempty\itemgroups_start_item} + +\def\itemgroups_start_item_first + {\setfalse\c_itemgroups_first + % \begingroup % (3) + \ifcase\c_itemgroups_nesting + % 0 + \or + \itemgroups_start_item_first_one % 1 + \else + \itemgroups_start_item_first_two % 2+ + \fi} + +\def\itemgroups_start_item_first_one + {\ifcase\c_itemgroups_column_depth + \ifconditional\c_itemgroups_intro\itemgroups_insert_breakno\fi + \itemgroups_before_command + \itemgroups_tag_start_group + \ifconditional\c_itemgroups_intro\itemgroups_insert_breakno\fi + \fi} + +\def\itemgroups_start_item_first_two + {\ifconditional\c_itemgroups_paragraph\else + \edef\previtemlevel{\the\numexpr\c_itemgroups_nesting-\plusone}% + \ifcase\c_itemgroups_spacing_mode + \itemgroups_before_command + \or + \doifelsenothing\itemgroups_before_command % should possibly expand to empty + {\nameditemgroupparameter{\currentparentitemgroup:\previtemlevel}\c!inbetween}% + \itemgroups_before_command + \else + \nameditemgroupparameter{\currentparentitemgroup:\previtemlevel}\c!inbetween + \fi + \itemgroups_tag_start_group + \fi} + +\def\itemgroups_start_item_next + {\dostoptagged % ok? what do we stop here? + \dostoptagged % ok? what do we stop here? + \ifconditional\c_itemgroups_text + \ifhmode + % WS: make the distance between items customizable, think about better default values -> see itemize-1.tex + \itemgroups_set_text_item_distance% HH: moved out and made configurable (sort of) + \removeunwantedspaces + \hskip\textitemdistance\relax + \fi + \else + \itemgroups_between_command + \fi} + +\unexpanded\def\itemgroups_start_item[#reference]% we can reuse more + {\def\currentitemreference{#reference}% + \ifconditional\c_itemgroups_text + % begin of item + \else + \par + \fi + \ifconditional\c_itemgroups_concat + \itemgroups_insert_breakno + \fi + \itemgroups_increment_item_counter + \ifconditional\c_itemgroups_first + \itemgroups_start_item_first + \else + \itemgroups_start_item_next + \fi + \ifconditional\c_itemgroups_concat + \vskip-\dimexpr\lastskip+\lineheight\relax + \nobreak + \setfalse\c_itemgroups_concat + \fi + \dostarttagged\t!item\empty + \dostarttagged\t!itemtag\empty + \itemgroups_insert_item + \dostoptagged + \ifconditional\c_itemgroups_pack + \setupwhitespace[\v!none]% + \fi + \itemgroupparameter\c!inner % will become obsolete (better use setups) + \itemgroups_margin_symbol + \let\itemgroups_margin_symbol\relax + \dostarttagged\t!itemcontent\empty + \strut + \nobreak % else problems with intext items + \hskip\d_itemgroups_signal % concat + \itemgroupparameter\c!command} + +\unexpanded\def\stopitemgroupitem + {\ifconditional\c_itemgroups_text + % nothing + \else + \endgraf + \fi} + +\unexpanded\def\startitemgrouphead + {\dosingleempty\itemgroups_start_head} + +\unexpanded\def\itemgroups_start_head[#reference]% + {\ifconditional\c_itemgroups_first \else + \itemgroups_insert_breakallow + \fi + \ifconditional\c_itemgroups_pack \else + \itemgroups_before_head_command + \fi + \ifconditional\c_itemgroups_first + \ifconditional\c_itemgroups_intro \else + \ifcase\c_itemgroups_nesting + \itemgroups_insert_breakallow + \fi + \fi + \fi + \itemgroups_start_item[#reference]% + \groupedcommand\itemgroups_start_head_indeed\itemgroups_stop_head_indeed} + +\unexpanded\def\stopitemgrouphead + {\stopitemgroupitem} + +\unexpanded\def\itemgroups_start_head_indeed + {\useitemgroupstyleandcolor\c!headstyle\c!headcolor\ignorespaces} + +\unexpanded\def\itemgroups_stop_head_indeed + {\removeunwantedspaces + \ifconditional\c_itemgroups_text + \space + \ignorespaces + \else + \par + \fi + \itemgroups_insert_breakno + \ifconditional\c_itemgroups_pack\else\itemgroups_after_head_command\fi + \itemgroups_insert_breakno + \noindentation} + +% Simple commands. + +\unexpanded\def\itemgroups_start_do_item + {\startitemgroupitem} + +\unexpanded\def\itemgroups_start_no_item % ? + {\startitemgroupitem} + +\unexpanded\def\itemgroups_start_button[#destination]% + {\edef\m_itemgroups_destination{#destination}% + \startitemgroupitem} + +\unexpanded\def\itemgroups_start_symbol#text% + {\def\itemgroups_extra_symbol{#text}% + \startitemgroupitem} + +\unexpanded\def\itemgroups_start_dummy + {\itemgroups_start_symbol\strut\strut} + +\unexpanded\def\itemgroups_start_subitem + {\settrue\c_itemgroups_sub + \startitemgroupitem} + +\unexpanded\def\itemgroups_start_edge#text% + {\itemgroups_start_symbol + {\itemgroups_calculate_list_width\c_itemgroups_nesting + \hbox to \d_itemgroups_list_width + {#text\hskip\itemgroupparameter\c!distance}}} + +\unexpanded\def\itemgroups_start_margin#text% + {\def\itemgroups_margin_symbol + {\llap + {\begingroup + \useitemgroupstyleandcolor\c!marstyle\c!marcolor + #text% keep em/ex local + \endgroup + \hskip\dimexpr\leftskip+\leftmargindistance\relax}}% + \startitemgroupitem} + +\unexpanded\def\itemgroups_start_text#text% + {\def\itemgroups_extra_symbol{#text}% + \settrue\c_itemgroups_txt + \startitemgroupitem} + +\unexpanded\def\itemgroup_start_head + {\settrue\c_itemgroups_head + \startitemgrouphead} + +\unexpanded\def\itemgroups_start_items + {\dosingleempty\itemgroups_start_items} + +\unexpanded\def\itemgroups_start_items[#whatever]% something got lost + {\itemgroups_start_edge + {\dorecurse{0\itemgroupparameter\c!items}{\itemgroups_used_symbol\hss}% + \unskip}} + +\unexpanded\def\startspecialitemgroupitem[#name]% + {\csname\??op:\e!start:\ifcsname#name\endcsname#name\else\v!item\fi\endcsname} + +\unexpanded\def\stopspecialitemgroupitem + {\stopitemgroupitem} + +\letvalue{\??op:\e!start:\v!item}\itemgroups_start_do_item +\letvalue{\??op:\e!start:\v!sub }\itemgroups_start_subitem +\letvalue{\??op:\e!start:\v!sym }\itemgroups_start_symbol +\letvalue{\??op:\e!start:\v!ran }\itemgroups_start_edge +\letvalue{\??op:\e!start:\v!its }\itemgroups_start_items +\letvalue{\??op:\e!start:\v!mar }\itemgroups_start_margin + +\def\optimizelistitemsbreak + {\ifcase\c_itemgroups_column_depth \ifconditional\c_itemgroups_optimize + \ifcase \c_itemgroups_max_items \else + \ifnum\c_itemgroups_max_items=\plusthree + \ifnum\c_itemgroups_n_of_items>\plusone + \itemgroups_insert_nobreak + \fi + \else\ifnum\c_itemgroups_max_items>\plusthree + \ifnum\c_itemgroups_n_of_items=\plustwo + \ifconditional\c_itemgroups_intro + \itemgroups_insert_breakno + \else + \itemgroups_insert_nobreak + \fi + \else\ifnum\c_itemgroups_max_items=\c_itemgroups_n_of_items\relax + \itemgroups_insert_nobreak + \else\ifnum\c_itemgroups_n_of_items>\plustwo + \itemgroups_insert_break + \else + \ifconditional\c_itemgroups_intro\else\itemgroups_insert_break\fi + \fi\fi\fi + \fi\fi + \fi + \fi\fi} + +\def\itemgroups_handle_text_item + {\scratchdimen\wd\b_itemgroups + \advance \scratchdimen \itemgroupparameter\c!distance\relax + \ifdim\scratchdimen>\d_itemgroups_list_width + \advance\scratchdimen -\d_itemgroups_list_width + \else + \scratchdimen\zeropoint + \fi + \llap{\hbox to \d_itemgroups_list_width{\ifconditional\c_itemgroups_sub\llap{+\enspace}\fi\box\b_itemgroups\hss}}% was: \hfill + \hskip\scratchdimen} + +\def\itemgroups_handle_lapped_item_positive + {\llap + {\hbox to \d_itemgroups_list_width + {\ifconditional\c_itemgroups_sub + \llap{+\enspace}% + \fi + \itemgroups_left_sym_filler + \box\b_itemgroups % can already have a forced widt, only factor handled here + \hfil + \hskip\itemgroupparameter\c!distance}}} + +\def\itemgroups_handle_lapped_item_negative + {\llap + {\ifconditional\c_itemgroups_sub + \llap{+\enspace}% + \fi + \box\b_itemgroups + \hskip\leftmargindistance}} + +\def\itemgroups_handle_groups_text_item + {\hbox + {\ifconditional\c_itemgroups_sub + +\enspace + \fi + \box\b_itemgroups + \hskip\interwordspace}% + \nobreak} + +\def\itemgroups_handle_groups_inline_item + {\hbox to \d_itemgroups_list_width + {\ifconditional\c_itemgroups_sub + \llap{+\enspace}% + \fi + \box\b_itemgroups + \hss}} % was: \hfill + +\unexpanded\def\itemgroups_start_head_sym#text% + {\def\itemgroups_extra_symbol{#text}% + \settrue\c_itemgroups_head + \itemgroups_start_head} + +\def\itemgroups_make_symbol_box + {\setbox\b_itemgroups\hbox + {\ifconditional\c_itemgroups_head + \ifx\itemgroups_extra_symbol\empty + \useitemgroupstyleandcolor\c!headstyle\c!headcolor + \itemgroups_used_symbol + \else + \useitemgroupstyleandcolor\c!symstyle\c!symcolor + \itemgroups_extra_symbol + \let\itemgroups_extra_symbol\empty + \fi + \else + \ifx\itemgroups_extra_symbol\empty + \useitemgroupstyleandcolor\c!style\c!color + \itemgroups_used_symbol + \else + \useitemgroupstyleandcolor\c!symstyle\c!symcolor + \itemgroups_extra_symbol + \let\itemgroups_extra_symbol\empty + \fi + \fi}} + +\def\itemgroups_make_fitting_box + {\ifdim\wd\b_itemgroups>\itemgroupparameter\c!maxwidth\scaledpoint\relax % brr, sp + \normalexpanded{\global\setitemgroupparameter{\c!maxwidth}{\number\wd\b_itemgroups}}% + \fi + \ifdim\d_itemgroups_max_width>\zeropoint + \setbox\b_itemgroups\simplealignedbox + {\dimexpr\d_itemgroups_max_width+\itemgroupparameter\c!distance\relax} + {\itemgroupparameter\c!itemalign} + {\box\b_itemgroups\hskip\itemgroupparameter\c!distance}% + \fi} + +\def\itemgroups_make_aligned_box + {\doifsomething{\itemgroupparameter\c!itemalign} + {\setbox\b_itemgroups\simplealignedbox + {\dimexpr\d_itemgroups_asked_width+\itemgroupparameter\c!distance\relax} + {\itemgroupparameter\c!itemalign} + {\box\b_itemgroups\hskip\itemgroupparameter\c!distance}}} + +\def\itemgroups_make_destination_box + {\iftrialtypesetting \else \ifx\m_itemgroups_destination\empty \else + \setbox\b_itemgroups\hbox{\directgotobox{\box\b_itemgroups}[\m_itemgroups_destination]}% + \fi\fi} + +\def\itemgroups_check_indenting + {\setfalse\c_itemgroups_indented_first + \ifx\m_itemgroups_indenting\empty \else + \normalexpanded{\setupindenting[\v!reset,\v!yes,\m_itemgroups_indenting]}% + \ifindentfirstparagraph + \doifnot{\itemgroupparameter\c!alignsymbol}\v!yes + {\settrue\c_itemgroups_indented_first}% + \fi + \fi} + +\def\itemgroups_check_for_repeated + {\ifconditional\c_itemgroups_repeat + \ifx\m_itemgroups_repeat_start\empty + \let\m_current_itemgroups_start\currentitemlevel + \fi + \setbox\b_itemgroups\hbox to \wd\b_itemgroups + {\hskip-\d_itemgroups_asked_width + \box\b_itemgroups}% what a hack ! + \fi} + +\def\itemgroups_insert_item + {\ifconditional\c_itemgroups_text + % begin of item + \else + \par + \fi + \advance\c_itemgroups_n_of_items\plusone + \optimizelistitemsbreak + \itemgroups_check_indenting + \dontleavehmode + \ifconditional\c_itemgroups_indented_first + \hskip-\parindent + \fi + \itemgroups_make_symbol_box + \itemgroups_make_destination_box + \ifconditional\c_itemgroups_fitting + \itemgroups_make_fitting_box + \else\ifdim\d_itemgroups_asked_width>\zeropoint + \itemgroups_make_aligned_box + \fi\fi + \let\m_itemgroups_destination\empty + \ht\b_itemgroups\strutheight % just in case a symbols is not yet available in + \dp\b_itemgroups\strutdepth % the current run (more a mkii mp side artifact) + \itemgroups_check_for_repeated + \ifdim\d_itemgroups_asked_width<\zeropoint\relax + \itemgroups_handle_lapped_item_negative + \else + \ifdim\d_itemgroups_asked_width=\zeropoint\relax + \itemgroups_calculate_list_width\plusone + \else + \itemgroups_calculate_list_width\c_itemgroups_nesting + \fi + \ifconditional\c_itemgroups_text + \itemgroups_handle_groups_text_item + \else\ifconditional\c_itemgroups_inline + \itemgroups_handle_groups_inline_item + \else\ifconditional\c_itemgroups_txt + \itemgroups_handle_text_item + \else + \itemgroups_handle_lapped_item_positive + \fi\fi\fi + \fi + \setfalse\c_itemgroups_head + \setfalse\c_itemgroups_sub + \ifconditional\c_itemgroups_indented_first + \hskip\parindent + \fi + \ignorespaces} + +\def\itemgroups_start_item_nop + {\let\currentitemreference\empty + \itemgroups_increment_item_counter + \advance\c_itemgroups_n_of_items\plusone + \setbox\b_itemgroups\hbox + {\useitemgroupstyleandcolor\c!style\c!color + \itemgroups_used_symbol}% + \itemgroups_check_for_repeated + \ignorespaces} + +\setvalue{\??op:d:\c!textdistance:\v!none}% + {\let\m_itemgroups_text_distance\zeropoint} + +\unexpanded\def\itemgroups_set_text_item_distance + {\edef\m_itemgroups_text_distance{\itemgroupparameter\c!textdistance}% + \ifx\m_itemgroups_text_distance\empty + % + \else\ifcsname\??op:d:\c!textdistance:\m_itemgroups_text_distance\endcsname + \csname\??op:d:\c!textdistance:\m_itemgroups_text_distance\endcsname + \else + \itemgroups_set_text_item_distance_indeed + \fi\fi} + +\def\itemgroups_set_text_item_distance_indeed + {\assignvalue + \m_itemgroups_text_distance + \m_itemgroups_text_distance + {.5\interwordspace\!!plus.5\emwidth}% + {\interwordspace \!!plus \emwidth}% + {\emwidth \!!plus \interwordstretch\!!minus\interwordshrink}} + +\unexpanded\def\itemgroups_default_command + {\EveryPar{\ignorespaces}% needed ? + \ignorespaces} + +%D Special case: + +\unexpanded\def\itemgroups_head#text\par + {\startitemgrouphead{#text}} + +%D The local commands: + +\appendtoks + \let\item \itemgroups_start_do_item + \let\noitem \itemgroups_start_no_item + \let\itm \itemgroups_start_do_item + \let\but \itemgroups_start_button + \let\nop \itemgroups_start_dummy + \let\txt \itemgroups_start_text + \let\head \itemgroups_head + \let\headsym \itemgroups_start_head_sym + \let\starthead \startitemgrouphead + \let\startitem \startitemgroupitem + \let\stopitem \stopitemgroupitem + \let\starthead \startitemgrouphead + \let\stophead \stopitemgroupitemhead + \let\startspecialitem\startspecialitemgroupitem + \let\stopspecialitem \stopspecialitemgroupitem +\to \itemgroupcommands + +\ifx\currentinterface \v!english \else + + \appendtoks + \expandafter\let\csname\v!item \endcsname\itemgroups_start_do_item + \expandafter\let\csname\v!sub \endcsname\itemgroups_start_subitem + \expandafter\let\csname\v!sym \endcsname\itemgroups_start_symbol + \expandafter\let\csname\v!ran \endcsname\itemgroups_start_edge + \expandafter\let\csname\v!head \endcsname\itemgroups_head + \expandafter\let\csname\v!its \endcsname\itemgroups_start_items + \expandafter\let\csname\v!mar \endcsname\itemgroups_start_margin + \expandafter\let\csname\v!txt \endcsname\itemgroups_start_text + \expandafter\let\csname\e!start\v!item\endcsname\startitemgroupitem + \expandafter\let\csname\e!stop \v!item\endcsname\stopitemgroupitem + \expandafter\let\csname\e!start\v!head\endcsname\startitemgrouphead + \expandafter\let\csname\e!stop \v!head\endcsname\stopitemgrouphead + \to \itemgroupcommands + +\fi + +%D A nice example of a plugin: +%D +%D \startbuffer +%D \startitemize[a,random,packed] +%D \startitem first \stopitem \startitem second \stopitem +%D \startitem third \stopitem \startitem fourth \stopitem +%D \stopitemize +%D +%D \startitemize[a,random,packed] +%D \startitem first \stopitem \startitem second \stopitem +%D \startitem third \stopitem \startitem fourth \stopitem +%D \stopitemize +%D +%D \startitemize[a,packed] +%D \startitem first \stopitem \startitem second \stopitem +%D \startitem third \stopitem \startitem fourth \stopitem +%D \stopitemize +%D \stopbuffer +%D +%D \typebuffer \getbuffer + +% better collectitems als conditional and a real plugin mechanism (some day) + +\newcount\c_itemgroups_collected_stored +\newcount\c_itemgroups_collected_done +\newcount\c_itemgroups_collected_current + +\@EA\def\@EA\itemgroups_collected_store\@EA#\@EA1\csname\e!stop\v!item\endcsname % use grabuntil + {\advance\c_itemgroups_collected_stored\plusone + \setvalue{\??op:x:\number\c_itemgroups_collected_stored}{\startitemgroupitem#1\stopitemgroupitem}} + +\def\itemgroups_collected_flush + {\ifconditional\c_itemgroups_randomize + \getrandomcount\c_itemgroups_collected_current\plusone\c_itemgroups_collected_stored + \else + \advance\c_itemgroups_collected_current\plusone + \fi + \doifdefined{\??op:x:\number\c_itemgroups_collected_current} + {\getvalue{\??op:x:\number\c_itemgroups_collected_current}% + \letbeundefined{\??op:x:\number\c_itemgroups_collected_current}% + \advance\c_itemgroups_collected_done\plusone}% + \ifnum\c_itemgroups_collected_done<\c_itemgroups_collected_stored + \expandafter\itemgroups_collected_flush + \fi} + +\unexpanded\def\stopcollectitems + {\ifconditional\c_itemgroups_randomize + \c_itemgroups_collected_done \zerocount + \c_itemgroups_collected_current\zerocount + \ifnum\c_itemgroups_collected_stored>\zerocount + \doubleexpandafter\itemgroups_collected_flush + \fi + \fi} + +\unexpanded\def\startcollectitems + {\ifconditional\c_itemgroups_randomize + \c_itemgroups_collected_stored\zerocount + \letvalue{\e!start\v!item}\itemgroups_collected_store + \fi} + +%D Left-overs: + +\unexpanded\def\item + {\itemgroups_item_alone} + +\def\itemgroups_item_alone[#category]#text\par + {\doifsomethingelse{#category}{\startitemgroup[#category]}{\startitemgroup[\v!itemize]}% + \startitem#text\stopitem + \stopitemgroup} + +\unexpanded\def\head + {\itemgroups_head_alone} + +\def\itemgroups_head_alone[#category]#head\par#body\par + {\doifsomethingelse{#category}{\startitemgroup[#category]}{\startitemgroup[\v!itemize]}% + \starthead{#head}#body\stophead + \stopitemgroup} + +\setuvalue{\e!start\v!item}% + {\startitemgroup[\v!itemize]% + \startitemgroupitem + \setuvalue{\e!stop\v!item}{\stopitemgroupitem\stopitemgroup}} + +% \def\sym#text% +% {\noindent +% \begingroup +% \setbox\scratchbox\hbox{\settrialtypesetting#text}% +% \setbox\scratchbox\hbox\ifdim\wd\scratchbox<1em to 1.5\else spread 1\fi em{#text\hfil}% +% \normalexpanded{\box\scratchbox\endgroup\hangindent\the\wd\scratchbox}% +% \ignorespaces} + +%D End of plugin. + +\setupitemgroup + [\c!margin=\zeropoint, + \c!leftmargin=\zeropoint, + \c!rightmargin=\zeropoint, + \c!indentnext=\v!yes, + \c!width=1.5em, + \c!factor=0, + %\c!distance=.5em, % is now: + \c!step=.5em, % deals with broad + \c!distance=\zeropoint, + %\c!align=\v!normal, % definitely not \v!normal ! + %\c!symalign=, + %\c!color=, + %\c!indenting=, % untouched if empty + %\c!style=, + \c!marstyle=\v!type, + %\c!symstyle=, + %\c!headstyle=, + %\c!marcolor=, + %\c!symcolor=, + %\c!headcolor=, + %\c!beforehead=, + \c!afterhead=\blank, + \c!before=\blank, + \c!inbetween=\blank, + \c!after=\blank, + %\c!stopper=., + \c!placestopper=\v!yes, + \c!stopper=., + %\c!inner=, + \c!n=2, + \c!items=4, + \c!levels=10, + \c!lefttext=(, + \c!righttext=), + \c!start=1, + \c!criterium=\v!all, % permits 0 and negative numbers + %\c!option=, + \c!textdistance=\v!big, + \c!command=\itemgroups_default_command, + \c!indenting=\v!next, + %\c!alignsymbol=v!no, + \c!symbol=\currentitemlevel, + \c!prefix=\v!no, + %\c!prefixstopper=., + %\c!prefixseparatorset=, + %\c!prefixconversion=, + %\c!prefixconversionset=, + %\c!prefixset=, + %\c!prefixsegments=1:100, + \c!prefixconnector=., + \c!numberseparatorset=, + \c!numberconversionset=, + \c!numberstopper=., + \c!numbersegments=1] + +\defineitemgroup + [\v!itemize] + +\protect \endinput diff --git a/tex/context/base/strc-lst.mkiv b/tex/context/base/strc-lst.mkiv index eb7b699a2..6d7622a6a 100644 --- a/tex/context/base/strc-lst.mkiv +++ b/tex/context/base/strc-lst.mkiv @@ -25,9 +25,9 @@ \installframedcommandhandler \??li {list} \??li -\def\donestedlistattributes#1#2% will change - {\dosetlistattributes#1#2% - \ifx\colorattributehash\empty \else +\def\usenestedliststyleandcolor#1#2% will change + {\useliststyleandcolor#1#2% + \ifx\currentcolorparameter\empty \else \resetinteractionparameter\c!color \resetinteractionparameter\c!contrastcolor \fi} @@ -434,12 +434,13 @@ \setsystemmode \v!list \fi} -\unexpanded\def\systemsuppliedchapter {\getvalue{\v!chapter}} % brrr -\unexpanded\def\systemsuppliedtitle {\getvalue{\v!title}} % brrr +\unexpanded\def\systemsuppliedchapter {\getvalue{\v!chapter}} % obsolete +\unexpanded\def\systemsuppliedtitle {\getvalue{\v!title}} % obsolete \def\dodocompletelist[#1][#2][#3]% enkelvoud, meervoud, instellingen - {\normalexpanded{\systemsuppliedtitle[#2]{\noexpand\headtext{#2}}}% expansion needed for v! vs french ! - \doplacelist[#1][#3]} + {\normalexpanded{\startnamedsection[\v!title][\c!title=\headtext{#2},\c!reference=#2]}% + \doplacelist[#1][#3]% + \stopnamedsection} \def\docompletelist[#1][#2]% {\dodocompletelist[#1][#1][#2]} @@ -636,17 +637,17 @@ \domakelistelement\v!all{#2}\hbox {\doif{\listparameter\c!headnumber}\v!yes {\domakelistelement\v!sectionnumber{#2}\hbox - {\donestedlistattributes\c!numberstyle\c!numbercolor + {\usenestedliststyleandcolor\c!numberstyle\c!numbercolor {\listparameter\c!numbercommand{\currentlistsymbol}}}}% \domakelistelement\v!text{#2}\hbox - {\donestedlistattributes\c!textstyle\c!textcolor + {\usenestedliststyleandcolor\c!textstyle\c!textcolor {\let\\=\newlineinlist \dontconvertfont \listparameter\c!textcommand{#4}}}% \doif{\listparameter\c!pagenumber}\v!yes {\doifsomething{#5} {\domakelistelement\v!pagenumber{#2}\hbox - {\donestedlistattributes\c!pagestyle\c!pagecolor + {\usenestedliststyleandcolor\c!pagestyle\c!pagecolor {\listparameter\c!pagecommand{#5}}}}}}}% #8}% \listparameter\c!after} @@ -691,12 +692,12 @@ \hsize\localhsize \hbox to \hsize {\forgetall - \dosetlistattributes\c!style\c!color + \useliststyleandcolor\c!style\c!color \!!widthb\hsize \doifelse{\listparameter\c!headnumber}\v!yes {\setbox2\hbox \ifdim\!!widtha>\zeropoint to \!!widtha \fi {\domakelistelement\v!sectionnumber{#2}\hbox - {\donestedlistattributes\c!numberstyle\c!numbercolor + {\usenestedliststyleandcolor\c!numberstyle\c!numbercolor {\listparameter\c!numbercommand{\currentlistsymbol}}% \hfill}}} {\!!widtha\zeropoint @@ -708,7 +709,7 @@ {\hbox \ifdim\listwidth>\zeropoint to \listwidth\fi {\hfill \domakelistelement\v!pagenumber{#2}\hbox - {\donestedlistattributes\c!pagestyle\c!pagecolor + {\usenestedliststyleandcolor\c!pagestyle\c!pagecolor {\listparameter\c!pagecommand{#5}}}}}}}% \vbox {\hsize\!!widthb @@ -743,7 +744,7 @@ \hskip\dimen2 \domakelistelement\v!text{#2}\firstofoneargument {\bgroup - \donestedlistattributes\c!textstyle\c!textcolor + \usenestedliststyleandcolor\c!textstyle\c!textcolor {\let\\=\newlineinlist \dontconvertfont %\listparameter\c!textcommand{#4}}% @@ -808,7 +809,7 @@ {\doif{\listparameter\c!pagenumber}\v!yes {\doifsomething{#5} {\domakelistelement\v!pagenumber{#2}\hbox - {\donestedlistattributes\c!pagestyle\c!pagecolor + {\usenestedliststyleandcolor\c!pagestyle\c!pagecolor {\listparameter\c!pagecommand{#5}}}}}}% %% \domakelistelement\v!all{#2}\firstofoneargument{% \doif{\listparameter\c!headnumber}\v!yes @@ -819,7 +820,7 @@ \hbox {\listparameter\c!left \domakelistelement\v!sectionnumber{#2}\hbox - {\donestedlistattributes\c!numberstyle\c!numbercolor + {\usenestedliststyleandcolor\c!numberstyle\c!numbercolor {\listparameter\c!numbercommand{\currentlistsymbol}}}% \listparameter\c!right \hskip.5em}% @@ -827,7 +828,7 @@ \fi}% \tolerance3500 % niet zomaar veranderen %% \domakelistelement\v!text{#2}\firstofoneargument{% - \donestedlistattributes\c!textstyle\c!textcolor + \usenestedliststyleandcolor\c!textstyle\c!textcolor {\let\\=\newlineinlist \dontconvertfont %\listparameter\c!textcommand{#4}}% @@ -874,7 +875,7 @@ \domakelistelement\v!all{#4}{#2}% {\let\\=\newlineinlist #1% in case E nils the strut (still needed?) - \dosetlistattributes\c!style\c!color + \usesetliststyleandcolor\c!style\c!color \ignorespaces\dontconvertfont\setstrut \begstrut \limitatedlistentry{#6}% @@ -962,8 +963,9 @@ \dosetlistmode} \def\docompletecombinedlist[#1][#2]% - {\normalexpanded{\systemsuppliedtitle[#1]{\noexpand\headtext{#1}}}% expansion due to v! vs french ! - \doplacecombinedlist[#1][#2]} + {\normalexpanded{\startnamedsection[\v!title][\c!title={\headtext{#1}},\c!reference=#1]}% + \doplacecombinedlist[#1][#2]% + \stopnamedsection} % lists that have a number/title are kind of generic and can share code @@ -1001,56 +1003,5 @@ segments = "\listparameter\c!numbersegments", } )}% \dostoptagged} - -% new and yet undocumented (used in cocoa qa), temporarily disabled in mkiv -% -% \setupremaininglistlength -% [left=\hss nog~,right=~ingangen] -% -% \resetremaininglistlength -% [section][settings] -% -% \placelist -% [section] -% [before=\showremaininglistlength] -% -% \dorecurse{100}{\section{hans}} -% -% \definesystemvariable {ll} % ListLength -% -% \unexpanded\def\setupremaininglistlength[#1]% -% {\getparameters[\??ll][#1]% -% \globallet\listlengthcounter\!!zerocount} -% -% \setupremaininglistlength -% [\c!left=\hss,\c!right=,\c!number=\v!yes, -% \c!before=\blank,\c!after=\page, -% \c!style=\v!smallnormal,\c!color=] -% -% \def\resetremaininglistlength -% {\dodoubleempty\doresetremaininglistlength} -% -% \def\doresetremaininglistlength[#1][#2]% -% {\determinelistcharacteristics[#1][#2]% -% \xdef\listlengthcounter{\number\utilitylistlength}} -% -% \def\showremaininglistlength -% {\bgroup -% \ifnum\listlengthcounter>\plusone -% \setbox\scratchbox\vbox -% {\@@llbefore\par\horizontalstrut\par\horizontalstrut\par\@@llafter}% -% \scratchdimen\pagetotal -% \advance\scratchdimen \ht\scratchbox -% \advance\scratchdimen \dp\scratchbox -% \ifdim\scratchdimen>\pagegoal -% \@@llbefore -% \nobreak\hbox to \hsize -% {\doifnot\@@llnumber\v!yes{\let\listlengthcounter\empty}% -% \doattributes\??ll\c!style\c!color{\@@llleft\listlengthcounter\@@llright}} -% \@@llafter -% \fi -% \fi -% \doglobal\decrement\listlengthcounter\relax -% \egroup} \protect \endinput diff --git a/tex/context/base/strc-mar.mkiv b/tex/context/base/strc-mar.mkiv index a1160c73a..5ae23ac75 100644 --- a/tex/context/base/strc-mar.mkiv +++ b/tex/context/base/strc-mar.mkiv @@ -48,18 +48,6 @@ \def\domarkingparameter #1#2{\ifcsname#1#2\endcsname#1#2\else\expandafter\domarkingparentparameter\csname#1\s!parent\endcsname#2\fi} \def\domarkingparentparameter#1#2{\ifx#1\relax\s!empty\else\domarkingparameter#1#2\fi} -% \def\markingparameterhash #1{\domarkingparameterhash{\??mk\currentmarking}#1} -% \def\domarkingparameterhash #1#2{\ifcsname#1#2\endcsname#1\else\expandafter\domarkingparentparameterhash\csname#1\s!parent\endcsname#2\fi} -% \def\domarkingparentparameterhash#1#2{\ifx#1\relax\else\domarkingparameterhash#1#2\fi} -% -% \def\detokenizedmarkingparameter#1{\detokenize\expandafter\expandafter\expandafter{\csname\??mk\currentmarking#1\endcsname}} -% -% \def\dosetmarkingattributes#1#2% style color -% {\edef\fontattributehash {\markingparameterhash#1}% -% \edef\colorattributehash{\markingparameterhash#2}% -% \ifx\fontattributehash \empty\else\dosetfontattribute \fontattributehash #1\fi -% \ifx\colorattributehash\empty\else\dosetcolorattribute\colorattributehash#2\fi} - \newconditional\inhibitgetmarking \newconditional\inhibitsetmarking \newtoks \everymarking diff --git a/tex/context/base/strc-mat.mkiv b/tex/context/base/strc-mat.mkiv index a782e292f..095afb0bb 100644 --- a/tex/context/base/strc-mat.mkiv +++ b/tex/context/base/strc-mat.mkiv @@ -210,7 +210,7 @@ {\rm % nodig ? \doif{\formulaparameter\c!location}\v!right{\hskip\formulaparameter\c!distance}% \formulaparameter\c!numbercommand - {\dosetformulaattributes\c!numberstyle\c!numbercolor + {\useformulastyleandcolor\c!numberstyle\c!numbercolor \strut \formulaparameter\c!left \namedtaggedlabeltexts diff --git a/tex/context/base/strc-not.mkiv b/tex/context/base/strc-not.mkiv index a1aec9ab5..e026a5986 100644 --- a/tex/context/base/strc-not.mkiv +++ b/tex/context/base/strc-not.mkiv @@ -98,7 +98,7 @@ {\def\doprocesssomenote##1{\edef\currentnote{##1}\let\currentdescription\currentnote#1}% \the\tobeprocessednotes} -%D Notes have their own paremater handlers. The complication here +%D Notes have their own parameter handlers. The complication here %D is that we use descriptions to typeset the note, so we have several %D resolvers. @@ -119,11 +119,11 @@ \def\detokenizednoteparameter#1{\detokenize\expandafter\expandafter\expandafter{\csname\??vn#1\endcsname}} -\def\dosetnoteattributes#1#2% style color - {\edef\fontattributehash {\noteparameterhash#1}% - \edef\colorattributehash{\noteparameterhash#2}% - \ifx\fontattributehash \empty\else\dosetfontattribute \fontattributehash #1\fi - \ifx\colorattributehash\empty\else\dosetcolorattribute\colorattributehash#2\fi} +\def\usenotestyleandcolor#1#2% style color + {\edef\currentstyleparameter{\noteparameter#1}% + \edef\currentcolorparameter{\noteparameter#2}% + \ifx\currentstyleparameter\empty\else\dousestyleparameter\currentstyleparameter\fi + \ifx\currentcolorparameter\empty\else\dousecolorparameter\currentcolorparameter\fi} \def\setnoteparameter#1{\dosetvalue{\??vn\currentnote}{#1}} @@ -507,17 +507,18 @@ \global\skip\currentnoteins\ht\scratchbox \endgroup} -% \def\checknotes % no longer needed -% {\processnotes\dochecknote} -% -% \def\checknotedistances -% {\processnotes\dosetnotedistance} -% -% fails but not that much needed anyway: -% -% \appendtoks -% \checknotedistances -% \to \everyglobalbodyfont +%D A fast checker for bottom notes being used: + +\newconditional\c_notes_bottom_present + +\def\notes_check_if_bottom_present_indeed + {\ifnum\noteparameter\s!notepos=\plustwo + \settrue\c_notes_bottom_present + \fi} + +\def\notes_check_if_bottom_present + {\setfalse\c_notes_bottom_present + \processnotes{\ifconditional\c_notes_bottom_present\else\notes_check_if_bottom_present_indeed\fi}} % D When \type{n} exceeds~1, footnotes are typeset in % D multi||columns, using the algoritm presented on page~397 @@ -794,13 +795,13 @@ \def\docurrentnoteenumerationfullnumber {\noteparameter\c!numbercommand - {\dosetnoteattributes\c!numberstyle\c!numbercolor + {\usenotestyleandcolor\c!numberstyle\c!numbercolor \ctxlua{structures.notes.number("\currentnote",\currentdescriptionnumberentry)}% \domovednote\currentdescription\currentdescriptionnumberentry\v!nextpage\v!previouspage}} \def\docurrentnoteenumerationsymbol {\noteparameter\c!numbercommand - {\dosetnoteattributes\c!numberstyle\c!numbercolor + {\usenotestyleandcolor\c!numberstyle\c!numbercolor \descriptionparameter\c!symbol \domovednote\currentdescription\currentdescriptionnumberentry\v!nextpage\v!previouspage}} @@ -933,7 +934,7 @@ \egroup} \def\dodonotesymbol#1% - {\noteparameter\c!textcommand{\dosetnoteattributes\c!textstyle\c!textcolor#1}} + {\noteparameter\c!textcommand{\usenotestyleandcolor\c!textstyle\c!textcolor#1}} %D Normally footnotes are saved as inserts that are called upon %D as soon as the pagebody is constructed. The footnote @@ -1331,15 +1332,6 @@ %D \neverypar {...\postponenotes} %D \stoptyping %D -%D and -%D -%D \starttyping -%D \def\ejectinsert% -%D {... -%D \flushnotes -%D ...} -%D \stoptyping -%D %D We can use \type{\neverypar} because in most commands %D sensitive to footnote gobbling we disable \type{\everypar} %D in favor for \type{\neverypar}. In fact, this footnote diff --git a/tex/context/base/strc-pag.lua b/tex/context/base/strc-pag.lua index 95851d1f0..460d4ff00 100644 --- a/tex/context/base/strc-pag.lua +++ b/tex/context/base/strc-pag.lua @@ -19,7 +19,6 @@ local structures = structures local helpers = structures.helpers local sections = structures.sections local pages = structures.pages -local processors = structures.processors local sets = structures.sets local counters = structures.counters @@ -28,6 +27,7 @@ local counterdata = counters.data local variables = interfaces.variables local context = context +local processors = typesetters.processors local applyprocessor = processors.apply local startapplyprocessor = processors.startapply local stopapplyprocessor = processors.stopapply diff --git a/tex/context/base/strc-pag.mkiv b/tex/context/base/strc-pag.mkiv index bd8308096..8a6f463e4 100644 --- a/tex/context/base/strc-pag.mkiv +++ b/tex/context/base/strc-pag.mkiv @@ -316,12 +316,17 @@ \trackingmarginnotesfalse \fi \fi + \recalculatebackgrounds \dosetpagenumberlocation \to \everysetuppagenumbering -\appendtoks - \ifdefined \recalculatebackgrounds \recalculatebackgrounds \fi -\to \everysetuppagenumbering +\ifdefined \recalculatebackgrounds \else + \let\recalculatebackgrounds\relax +\fi + +\ifdefined \dosetpagenumberlocation \else + \let\dosetpagenumberlocation\relax +\fi \def\flushfinallayoutpage {\doifsomething\@@nmpage{\doifnot\@@nmpage\v!no{\page[\@@nmpage]}}} @@ -329,42 +334,6 @@ % The numbered location handler is there because we need to be downward % compatible. So, in fact there can be multiple handlers active at the % same time, but only the current one does something. -% -% thsi code might move to page-txt - -\newcount\currentpagenumberlocation - -\def\dosetpagenumberlocation - {\advance\currentpagenumberlocation\plusone - \ifx\@@nmlocation\empty \else - \let\@@pagenumbervlocation\v!footer - \let\@@pagenumberhlocation\v!text - \let\@@pagenumberxlocation\c!middletext - \normalexpanded{\noexpand\processallactionsinset[\@@nmlocation]} - [ \v!header=>\let\@@pagenumbervlocation\v!header, - \v!footer=>\let\@@pagenumbervlocation\v!footer, - \v!middle=>\let\@@pagenumberhlocation\v!text \let\@@pagenumberxlocation\c!middletext, - \v!left=>\let\@@pagenumberhlocation\v!text \let\@@pagenumberxlocation\c!lefttext, - \v!right=>\let\@@pagenumberhlocation\v!text \let\@@pagenumberxlocation\c!righttext, - \v!inleft=>\let\@@pagenumberhlocation\v!margin\let\@@pagenumberxlocation\c!lefttext, - \v!inright=>\let\@@pagenumberhlocation\v!margin\let\@@pagenumberxlocation\c!righttext, - \v!inmargin=>\let\@@pagenumberhlocation\v!margin\def\@@pagenumberxlocation{\ifdoublesided\c!margintext\else\c!righttext\fi}, - \v!margin=>\let\@@pagenumberhlocation\v!margin\def\@@pagenumberxlocation{\ifdoublesided\c!margintext\else\c!righttext\fi}, - \v!atmargin=>\let\@@pagenumberhlocation\v!text \let\@@pagenumberxlocation\c!marginedgetext, - \v!marginedge=>\let\@@pagenumberhlocation\v!text \let\@@pagenumberxlocation\c!marginedgetext]% - \normalexpanded{\noexpand\setspecificlayouttext - {\@@pagenumbervlocation}{\@@pagenumberhlocation}{\@@pagenumberxlocation}% - {\noexpand\doplacepagenumberatlocation{\number\currentpagenumberlocation}}}% - \fi} - -\def\setspecificlayouttext#1#2#3#4{\setvalue{\??tk#1#2#3}{#4}} % weird place - -\appendtoks - \dosetpagenumberlocation -\to \everyinitializepagecounters - -\def\doplacepagenumberatlocation#1% - {\ifnum#1=\currentpagenumberlocation\relax\expandafter\placelocationpagenumber\fi} % Rendering: @@ -372,7 +341,11 @@ {\ifnum\userpagenumberstate=\plustwo \ifnum\overallpagenumberstate=\plusone \doif\@@nmstrut\v!yes\strut - \@@nmcommand{\doattributes\??nm\c!style\c!color{\@@nmleft\labeltexts\v!pagenumber{\prefixedpagenumber}\@@nmright}}% + \begingroup + \dousestyleparameter\@@nmstyle + \dousecolorparameter\@@nmcolor + \@@nmcommand{\@@nmleft\labeltexts\v!pagenumber{\prefixedpagenumber}\@@nmright}% + \endgroup \fi \fi} diff --git a/tex/context/base/strc-prc.lua b/tex/context/base/strc-prc.lua deleted file mode 100644 index b1a1fb0a9..000000000 --- a/tex/context/base/strc-prc.lua +++ /dev/null @@ -1,9 +0,0 @@ -if not modules then modules = { } end modules ['strc-prc'] = { - version = 1.001, - comment = "companion to strc-prc.mkiv", - author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", - copyright = "PRAGMA ADE / ConTeXt Development Team", - license = "see context related readme files" -} - --- code will move from strc-ini to here diff --git a/tex/context/base/strc-ref.mkvi b/tex/context/base/strc-ref.mkvi index dfb31d066..b80016e52 100644 --- a/tex/context/base/strc-ref.mkvi +++ b/tex/context/base/strc-ref.mkvi @@ -995,11 +995,11 @@ \edef\currentreferenceformattype {\referenceformatparameter\c!type }% \edef\currentreferenceformatsetups {\referenceformatparameter\c!setups }% \edef\currentreferenceformatautocase{\referenceformatparameter\c!autocase}% - \dosetreferenceformatattributes \c!style \c!color - \ifx\fontattributehash\empty \else + \usereferenceformatstyleandcolor\c!style\c!color + \ifx\currentstyleparameter\empty \else \resetinteractionparameter\c!style \fi - \ifx\colorattributehash\empty \else + \ifx\currentcolorparameter\empty \else \resetinteractionparameter\c!contrastcolor \resetinteractionparameter\c!color \fi @@ -1358,8 +1358,8 @@ \unexpanded\def\url[#label]% move \hyphenatedurl to lua end (is already lua) {\dontleavehmode \begingroup - \dosetfontattribute\??ur\c!style - \dosetcolorattribute\??ur\c!color + \dousestyleparameter\@@urstyle + \dousecolorparameter\@@urcolor \hyphenatedurl{\ctxcommand{geturl("#label")}}% \endgroup} @@ -1397,8 +1397,8 @@ {#content} \def\dofromurlliteral#content% called at the lua end - {\dosetfontattribute \??ur\c!style - \dosetcolorattribute\??ur\c!color + {\dousestyleparameter\@@urstyle + \dousecolorparameter\@@urcolor \hyphenatedurl{#content}} \let\dofromfiledescription\dofromurldescription @@ -1441,8 +1441,8 @@ \def\program[#name]% incompatible, more consistent, hardy used anyway {\dontleavehmode \begingroup - \dosetfontattribute\??pr\c!style - \dosetcolorattribute\??pr\c!color + \dousestyleparameter\@@prstyle + \dousecolorparameter\@@prcolor \ctxlua{structures.references.programs.get("#name","\@@pralternative","\@@prspace")}% \endgroup} diff --git a/tex/context/base/strc-reg.lua b/tex/context/base/strc-reg.lua index 523309a5f..6da58345b 100644 --- a/tex/context/base/strc-reg.lua +++ b/tex/context/base/strc-reg.lua @@ -24,13 +24,13 @@ local helpers = structures.helpers local sections = structures.sections local documents = structures.documents local pages = structures.pages -local processors = structures.processors local references = structures.references local mappings = sorters.mappings local entries = sorters.entries local replacements = sorters.replacements +local processors = typesetters.processors local splitprocessor = processors.split local variables = interfaces.variables diff --git a/tex/context/base/strc-reg.mkiv b/tex/context/base/strc-reg.mkiv index 4871b40ce..35f764a75 100644 --- a/tex/context/base/strc-reg.mkiv +++ b/tex/context/base/strc-reg.mkiv @@ -46,7 +46,9 @@ % \index[pageclass::] {textclass::entry} % \index[pageclass::key]{textclass::entry} -%D Parameters: +%D Parameters ... we set up levels so we need a slightly different command handler here .. okay, we +%D can use the childs for that ... but then we need to tweak the name in order to distinguis: +%D register -> register:1 (i.e. prefix) \let\currentregister\empty @@ -63,11 +65,11 @@ \def\doregisterparentparameter #1#2{\ifx#1\relax\s!empty\else\doregisterparameter #1{#2}\fi} \def\doregisterparentparameterhash#1#2{\ifx#1\relax \else\doregisterparameterhash#1{#2}\fi} -\def\dosetregisterattributes#1#2% style color - {\edef\fontattributehash {\registerparameterhash#1}% - \edef\colorattributehash{\registerparameterhash#2}% - \ifx\fontattributehash \empty\else\dosetfontattribute \fontattributehash #1\fi - \ifx\colorattributehash\empty\else\dosetcolorattribute\colorattributehash#2\fi} +\def\useregisterstyleandcolor#1#2% style color + {\edef\currentstyleparameter{\registerparameter#1}% + \edef\currentcolorparameter{\registerparameter#2}% + \ifx\currentstyleparameter\empty\else\dousestyleparameter\currentstyleparameter\fi + \ifx\currentcolorparameter\empty\else\dousecolorparameter\currentcolorparameter\fi} %D Setup: @@ -538,10 +540,10 @@ {\iffirstargument \begingroup \edef\currentregister{#1}% - % the expansion is needed because we don't want \v!'s in the tuo file (french) - \normalexpanded{\systemsuppliedchapter[\currentregister]{\noexpand\headtext{\currentregister}}}% + \normalexpanded{\startnamedsection[\v!chapter][\c!title={\headtext{\currentregister}},reference=\currentregister]}% \placeregister[\currentregister][#2]% \page[\v!yes]% + \stopnamedsection \endgroup \fi} @@ -597,7 +599,7 @@ {\registerparameter\c!before % bugged, why does leftskip gets set: \vskip\lineheight\goodbreak\vskip-\lineheight \begingroup - \dosetregisterattributes\c!style\c!color + \useregisterstyleandcolor\c!style\c!color \dontleavehmode \strut \iflocation @@ -614,7 +616,7 @@ \setvalue{\??id:\c!indicator:b}#1% will be shared with a {\registerparameter\c!before \begingroup - \dosetregisterattributes\c!style\c!color + \useregisterstyleandcolor\c!style\c!color \dontleavehmode \strut \iflocation @@ -651,7 +653,7 @@ {\endgraf \begingroup \dostarttagged\t!registerentries\empty - \dosetregisterattributes\c!textstyle\c!textcolor + \useregisterstyleandcolor\c!textstyle\c!textcolor \advance\leftskip\numexpr#1-1\relax\dimexpr\registerparameter\c!distance\relax \hangindent\registerparameter\c!distance\hangafter\plusone} @@ -676,7 +678,7 @@ {\begingroup \dostarttagged\t!registerpages\empty \setfalse\registerpagedone - \dosetregisterattributes\c!pagestyle\c!pagecolor} + \useregisterstyleandcolor\c!pagestyle\c!pagecolor} \unexpanded\def\stopregisterpages {\dostoptagged @@ -687,7 +689,7 @@ \begingroup \setfalse\registerpagedone \dostarttagged\t!registerpage\empty - \dosetregisterattributes\c!pagestyle\c!pagecolor} + \useregisterstyleandcolor\c!pagestyle\c!pagecolor} \unexpanded\def\stopregisterseewords {\dostoptagged diff --git a/tex/context/base/strc-ren.mkiv b/tex/context/base/strc-ren.mkiv index b212f5b39..c08db36d5 100644 --- a/tex/context/base/strc-ren.mkiv +++ b/tex/context/base/strc-ren.mkiv @@ -31,37 +31,37 @@ \edef\askedheadinterlinespace{\headparameter\c!interlinespace}% \ifx\askedheadinterlinespace\empty % here the interline space is only set when style sets no space - \setfalse\fontattributeisset + \setfalse\fontattributeisset % use the currentfontparameter state instead \setfalse\interlinespaceisset - \dosetheadattributes\c!style\c!color + \useheadstyleandcolor\c!style\c!color \ifconditional\fontattributeisset \ifconditional\interlinespaceisset \else \setupinterlinespace \fi \fi - \setfalse\fontattributeisset \dosetheadattributes#1#2% + \setfalse\fontattributeisset \useheadstyleandcolor#1#2% \ifconditional\fontattributeisset \ifconditional\interlinespaceisset \else \setupinterlinespace \fi \fi \else % here the set interline space overloads any other set space in the style \setfalse\fontattributeisset - \dosetheadattributes\c!style\c!color + \useheadstyleandcolor\c!style\c!color \ifconditional\fontattributeisset \dosetupcheckedinterlinespace\askedheadinterlinespace \fi \setfalse\fontattributeisset - \dosetheadattributes#1#2% + \useheadstyleandcolor#1#2% \ifconditional\fontattributeisset \dosetupcheckedinterlinespace\askedheadinterlinespace \fi \fi \else \setfalse\fontattributeisset - \dosetheadattributes\c!style\c!color + \useheadstyleandcolor\c!style\c!color \ifconditional\fontattributeisset \setupspacing \fi \setfalse\fontattributeisset - \dosetheadattributes#1#2% + \useheadstyleandcolor#1#2% \ifconditional\fontattributeisset \setupspacing \fi @@ -154,7 +154,7 @@ \setbox\sectionheadbox\ifvertical\vbox\else\hbox\fi \headreferenceattributes {\dosetlocalgridsnapping{\headparameter\c!internalgrid}% \doresettructureheadnumbercontent - \dosetheadfontattribute\c!style + \useheadstyleparameter\c!style \setinlineheadreferenceattributes \headparameter\c!command{}{\doplaceheadtextcomponent\getheadtitle}}% \fi @@ -171,7 +171,7 @@ \docheckheadreference \setbox\sectionheadbox\ifvertical\vbox\else\hbox\fi \headreferenceattributes {\dosetlocalgridsnapping{\headparameter\c!internalgrid}% - \dosetheadfontattribute\c!style + \useheadstyleparameter\c!style \setinlineheadreferenceattributes \headparameter\c!command{\doplaceheadnumbercomponent\getheadnumber}{\doplaceheadtextcomponent\getheadtitle}}% \fi @@ -296,9 +296,9 @@ \edef\currentheadgridsnapping{\headparameter\c!grid}% \ifconditional\headisdisplay \ifx\currentheadgridsnapping\empty\else - \dosetheadattributes\c!style\c!color + \useheadstyleandcolor\c!style\c!color \setupinterlinespace - \dosetheadattributes\c!textstyle\c!textcolor + \useheadstyleandcolor\c!textstyle\c!textcolor \setupinterlinespace \fi \fi diff --git a/tex/context/base/strc-rsc.lua b/tex/context/base/strc-rsc.lua index aa969569a..a90f577e3 100644 --- a/tex/context/base/strc-rsc.lua +++ b/tex/context/base/strc-rsc.lua @@ -104,8 +104,8 @@ references.splitcomponent = splitcomponent -- test code: -- inspect(splitreference([[component:::inner]])) --- print(splitprefix([[component:::inner]])) --- print(splitprefix([[component:inner]])) +-- inspect(splitprefix([[component:::inner]])) +-- inspect(splitprefix([[component:inner]])) -- inspect(splitreference([[ ]])) -- inspect(splitreference([[ inner ]])) diff --git a/tex/context/base/strc-sec.mkiv b/tex/context/base/strc-sec.mkiv index 1747031fc..7216bf162 100644 --- a/tex/context/base/strc-sec.mkiv +++ b/tex/context/base/strc-sec.mkiv @@ -131,6 +131,20 @@ {\setevalue\currenthead{\dohandleheadnop[\currenthead]}}% \to \everysetuphead +\let\currentnamedsection\empty + +\unexpanded\def\startnamedsection + {\dotripleempty\startnamedsection} + +\def\dostartnamedsection[#1]% [#2][#3] + {\pushmacro\currentnamedsection + \edef\currentnamedsection{#1}% + \dostarthead[#1]} % [#2][#3] + +\unexpanded\def\stopnamedsection + {\normalexpanded{\dostophead[\currentnamedsection]}% + \popmacro\currentnamedsection} + % structure sections (the parents of chapter etc) \let\firstsectionname\empty @@ -336,6 +350,8 @@ {\setfalse\headisdisplay} {\settrue \headisdisplay}} +\newmode\v!sectionnumber + \def\dosettructureheadnumbercontent {\setsystemmode \v!sectionnumber \settrue\headshownumber} % why ? @@ -361,7 +377,7 @@ % {\normalexpanded{\noexpand\setmarking[\currenthead]{\currentstructurelistnumber}}} \unexpanded\def\setheadmarking % li:: so that we can use \marking[section]{Taco needed this} - {\normalexpanded{\noexpand\setmarking[\currenthead]{li::\currentstructurelistnumber}}} + {\normalexpanded{\setmarking[\currenthead]{li::\currentstructurelistnumber}}} \let\deepstructurenumbercommand\relax \let\deepstructuretitlecommand \relax @@ -433,8 +449,8 @@ \unexpanded\def\setupheadcomponentfont#1#2% {\dontconvertfont - \dosetheadattributes\c!style\c!color - \dosetheadattributes#1#2% + \useheadstyleandcolor\c!style\c!color + \useheadstyleandcolor#1#2% \setupinterlinespace} \fi diff --git a/tex/context/base/strc-syn.mkiv b/tex/context/base/strc-syn.mkiv index 571eccd8e..7a9d5d3dd 100644 --- a/tex/context/base/strc-syn.mkiv +++ b/tex/context/base/strc-syn.mkiv @@ -51,35 +51,9 @@ \globallet#3\s!tex \fi} -\let\currentsynonym\empty +\installsimplecommandhandler \??sm {synonym} \??sm -\def\synonymparameter #1{\csname\dosynonymparameter{\??sm\currentsynonym}#1\endcsname} -\def\synonymparameterhash#1{\dosynonymparameterhash {\??sm\currentsynonym}#1} - -\def\dosynonymparameter #1#2{\ifcsname#1#2\endcsname#1#2\else\expandafter\dosynonymparentparameter \csname#1\s!parent\endcsname#2\fi} -\def\dosynonymparameterhash#1#2{\ifcsname#1#2\endcsname #1\else\expandafter\dosynonymparentparameterhash\csname#1\s!parent\endcsname#2\fi} - -\def\dosynonymparentparameter #1#2{\ifx#1\relax\s!empty\else\dosynonymparameter #1#2\fi} -\def\dosynonymparentparameterhash#1#2{\ifx#1\relax \else\dosynonymparameterhash#1#2\fi} - -\unexpanded\def\dosetsynonymattributes#1#2% style color - {\edef\fontattributehash {\synonymparameterhash#1}% - \edef\colorattributehash{\synonymparameterhash#2}% - \ifx\fontattributehash \empty\else\dosetfontattribute \fontattributehash #1\fi - \ifx\colorattributehash\empty\else\dosetcolorattribute\colorattributehash#2\fi} - -\newtoks\everysetupsynonyms - -\unexpanded\def\setupsynonyms - {\dodoubleargument\dosetupsynonyms} - -\def\dosetupsynonyms[#1][#2]% - {\ifsecondargument - \getparameters[\??sm#1][#2]% - \else - \getparameters[\??sm][#1]% - \fi - \the\everysetupsynonyms} +\let\setupsynonyms\setupsynonym \setupsynonyms [\c!state=\v!start, @@ -106,7 +80,8 @@ {\doquadrupleempty\dodefinesynonyms} \def\dodefinesynonyms[#1][#2][#3][#4]% name plural \meaning \use - {\iffourthargument + {\edef\currentsynonym{#1}% + \iffourthargument \unexpanded\def#4##1{\doinsertsynonym{#1}{##1}}% name tag \ifthirdargument \unexpanded\def#3##1{\doinsertsynonymmeaning{#1}{##1}}% \meaning @@ -118,10 +93,10 @@ \fi \setuvalue{#1}{\definesynonym[\v!yes][#1]}% \name \fi - \getparameters[\??sm#1][\s!parent=\??sm,\s!single={#1},\s!multi={#2}]% + \checksynonymparent + \setupcurrentsynonym[\s!single={#1},\s!multi={#2}]% \presetheadtext[#2=\Word{#2}]% changes the \if...argument - %\ctxlua{structures.synonyms.define('#1')}% - \setvalue{\e!setup #2\e!endsetup}{\dodoubleargument\getparameters[\??sm#1]}% to be obsolete + \setvalue{\e!setup #2\e!endsetup}{\setupsynonym[#1]}% obsolete definition \setvalue{\e!place \e!listof#2}{\placelistofsynonyms[#1]}% accepts extra argument \setvalue{\e!complete\e!listof#2}{\completelistofsynonyms[#1]}} @@ -167,7 +142,7 @@ \unexpanded\def\doinsertsynonymmeaning#1#2% name tag {\begingroup \def\currentsynonym{#1}% - \dosetsynonymattributes\c!textstyle\c!textcolor + \usesynonymstyleandcolor\c!textstyle\c!textcolor \synonymparameter\c!textcommand{\ctxlua{structures.synonyms.meaning("#1","#2")}}% \endgroup} @@ -177,7 +152,7 @@ \def\currentsynonymtag{#2}% \dostarttagged\t!synonym\currentsynonym \dotagsynonym - \dosetsynonymattributes\c!synonymstyle\c!synonymcolor + \usesynonymstyleandcolor\c!synonymstyle\c!synonymcolor \synonymparameter\c!synonymcommand{\ctxlua{structures.synonyms.synonym("#1","#2")}}% \dostoptagged \normalexpanded{\endgroup\synonymparameter\c!next}} @@ -200,8 +175,6 @@ \c!inbetween=\synonymparameter\c!inbetween, \c!after=\synonymparameter\c!after, \c!indentnext=\synonymparameter\c!indentnext, -% \c!headstyle=\synonymparameter\c!headstyle, -% \c!headcolor=\synonymparameter\c!headcolor, \c!headstyle=\synonymparameter\c!textstyle, \c!headcolor=\synonymparameter\c!textcolor, \c!style=, @@ -221,9 +194,10 @@ \def\docompletelistofsynonyms[#1][#2]% {\edef\currentsynonym{#1}% - \normalexpanded{\systemsuppliedchapter[#1]{\noexpand\headtext{\synonymparameter\s!multi}}}% + \normalexpanded{\startnamedsection[\v!chapter][\c!title={\headtext{\synonymparameter\s!multi}},\c!reference=#1]}% \doplacelistofsynonyms[#1][#2]% - \page[\v!yes]} + \page + \stopnamedsection} \let\startsynonymoutput \relax \let\stopsynonymoutput \relax @@ -231,41 +205,11 @@ \let\stopsynonymsection \relax \unexpanded\def\synonymentry#1#2#3#4% -% {\syndef{\dosetsynonymattributes\c!textstyle\c!textcolor#2}#3\par} -% {\startsyndef{#2}#3\stopsyndef} {\syndef{#3}#4\par} - -\let\currentsorting\empty - -% we can share if we also have synonymprefix = so - -\def\sortingparameter #1{\csname\dosortingparameter{\??so\currentsorting}#1\endcsname} -\def\sortingparameterhash#1{\dosortingparameterhash {\??so\currentsorting}#1} -\def\dosortingparameter #1#2{\ifcsname#1#2\endcsname#1#2\else\expandafter\dosortingparentparameter \csname#1\s!parent\endcsname#2\fi} -\def\dosortingparameterhash#1#2{\ifcsname#1#2\endcsname #1\else\expandafter\dosortingparentparameterhash\csname#1\s!parent\endcsname#2\fi} +%D Sorting (a simplified version of synonym). -\def\dosortingparentparameter #1#2{\ifx#1\relax\s!empty\else\dosortingparameter #1#2\fi} -\def\dosortingparentparameterhash#1#2{\ifx#1\relax \else\dosortingparameterhash#1#2\fi} - -\def\dosetsortingattributes#1#2% style color - {\edef\fontattributehash {\sortingparameterhash#1}% - \edef\colorattributehash{\sortingparameterhash#2}% - \ifx\fontattributehash \empty\else\dosetfontattribute \fontattributehash #1\fi - \ifx\colorattributehash\empty\else\dosetcolorattribute\colorattributehash#2\fi} - -\newtoks\everysetupsorting - -\unexpanded\def\setupsorting - {\dodoubleargument\dosetupsorting} - -\def\dosetupsorting[#1][#2]% - {\ifsecondargument - \getparameters[\??so#1][#2]% - \else - \getparameters[\??so][#1]% - \fi - \the\everysetupsorting} +\installsimplecommandhandler \??so {sorting} \??so \setupsorting [\c!state=\v!start, @@ -284,7 +228,8 @@ % if #3=\relax or \v!none, then no command but still protected \def\dodefinesorting[#1][#2][#3]% - {\ifthirdargument + {\edef\currentsorting{#1}% + \ifthirdargument \doifnot{#3}\v!none {\ifx#3\relax \else \unexpanded\def#3##1{\doinsertsort{#1}{##1}}% @@ -293,10 +238,10 @@ \else \setuvalue{#1}{\definesort[\v!yes][#1]}% \fi - \getparameters[\??so#1][\s!parent=\??so,\s!multi={#2}]% + \checksortingparent + \setupcurrentsorting[\s!multi={#2}]% \presetheadtext[#2=\Word{#2}]% after \ifthirdargument -) - %\ctxlua{structures.synonyms.define('#1')}% - \setvalue{\e!setup #2\e!endsetup}{\dodoubleargument\getparameters[\??so#1]}% to be obsolete + \setvalue{\e!setup #2\e!endsetup}{\setupsorting[#1]}% obsolete definition \setvalue{\e!place \e!listof#2}{\placelistofsorts[#1]}% \setvalue{\e!complete\e!listof#2}{\completelistofsorts[#1]}} @@ -338,7 +283,7 @@ \def\currentsortingtag{#2}% \dostarttagged\t!sorting\currentsorting \dotagsorting - \dosetsortingattributes\c!style\c!color + \usesortingstyleandcolor\c!style\c!color \ctxlua{structures.synonyms.synonym("#1","#2")}% \dostoptagged \normalexpanded{\endgroup\sortingparameter\c!next}} @@ -374,9 +319,10 @@ \def\docompletelistofsorts[#1][#2]% {\edef\currentsorting{#1}% - \normalexpanded{\systemsuppliedchapter[#1]{\noexpand\headtext{\sortingparameter\s!multi}}}% + \normalexpanded{\startnamedsection[\v!chapter][\c!title={\headtext{\sortingparameter\s!multi}},\c!reference=#1]}% \doplacelistofsorts[#1][#2]% - \page[\v!yes]} + \page + \stopnamedsection} \let\startsortingoutput \relax \let\stopsortingoutput \relax @@ -385,42 +331,8 @@ \def\sortingentry#1#2#3#4% #4 is meaning but empty here {\doifelsenothing{\sortingparameter\c!command} - {\begingroup\dosetsortingattributes\c!style\c!color#3\endgroup\par} % todo + {\begingroup\usesortingstyleandcolor\c!style\c!color#3\endgroup\par} % todo {\sortingparameter\c!command{#1}{#2}{#3}}} - -%D Here we define a support macro that can sort simple comma -%D separated lists. It's a multi-list variant of a prototype -%D written by Taco. - -% \def\mkloadsortedlist#1% class -% {\bgroup -% \getvalue{\s!set#1}% -% \ctxlua{structures.synonyms.process('#1')}% -% \getvalue{\s!reset#1}% -% \egroup} - -% \def\processlistofsorts[#1]% -% {\mkloadsortedlist{#1}} - -% \newcounter\nofsortedalphalists - -% \def\sortalphacommacommand#1% -% {\begingroup -% \doglobal\increment\nofsortedalphalists -% \edef\currentsortedalphalist{alpha:\nofsortedalphalists}% -% \definesorting[\currentsortedalphalist][\currentsortedalphalist]% -% \processcommacommand[#1]{\getvalue\currentsortedalphalist}% -% \global\let\sortedcommalist\empty -% \def\makesortedlist##1{\doglobal\appendtocommalist{##1}\sortedcommalist}% -% \setupsorting[\currentsortedalphalist][\c!criterium=\v!all,\c!command=\makesortedlist]% -% \processlistofsorts[\currentsortedalphalist]% -% \endgroup -% \dodoglobal\let#1\sortedcommalist} - -% \starttext -% \def\whatever{a,b,q,d,r,f} \sortalphacommacommand\whatever \whatever \endgraf -% \def\whatever{ax,bx,qx,dx,rx,fx} \sortalphacommacommand\whatever \whatever \endgraf -% \stoptext %D Presets. @@ -436,17 +348,6 @@ \definesorting [\v!logo] [\v!logos] - % no [\logogram] - -% As we now have \unit in the core, this now happens in m-units: -% -% \definesynonyms -% [\v!unit] -% [\v!units] -% [\unitmeaning] -% -% \setupsynonyms -% [\v!unit] -% [\c!synonymcommand=\dimension] +% [\logogram] % no \protect \endinput diff --git a/tex/context/base/strc-tag.mkiv b/tex/context/base/strc-tag.mkiv index 335065c8b..7c4042348 100644 --- a/tex/context/base/strc-tag.mkiv +++ b/tex/context/base/strc-tag.mkiv @@ -142,11 +142,11 @@ \definesystemattribute[tagged][public] \definesystemattribute[image] [public] -\def\setelementbackendtag{\dodoubleargument\dosetelementbackendtag} -\def\setelementnature {\dodoubleargument\dosetelementnature} +\unexpanded\def\setelementbackendtag{\dodoubleargument\dosetelementbackendtag} +\unexpanded\def\setelementnature {\dodoubleargument\dosetelementnature} -\def\dosetelementbackendtag[#1][#2]{\ctxcommand{settagproperty("#1","backend","#2")}} -\def\dosetelementnature [#1][#2]{\ctxcommand{settagproperty("#1","nature", "#2")}} +\unexpanded\def\dosetelementbackendtag[#1][#2]{\ctxcommand{settagproperty("#1","backend","#2")}} +\unexpanded\def\dosetelementnature [#1][#2]{\ctxcommand{settagproperty("#1","nature", "#2")}} % todo: indirect macro for trialtypesetting @@ -165,11 +165,11 @@ \unexpanded\def\dodostopelement {\ctxcommand{stoptag()}} +% beware: making this one unexpanded spoils tables (noalign problem) + \unexpanded\def\nonostartelement[#1][#2]{} \unexpanded\def\nonostopelement {} -% beware: making this one unexpanded spoils tables (noalign problem) - \def\dodostarttagged{\iftrialtypesetting\expandafter\nododostarttagged\else\expandafter\dododostarttagged\fi} \def\dodostoptagged {\iftrialtypesetting\expandafter\nododostoptagged \else\expandafter\dododostoptagged \fi} @@ -185,26 +185,28 @@ \def\nododostarttagged#1#2{} \def\nododostoptagged {} +% end of beware + \newtoks\everysetupstructure -\def\setupstructure[#1]% +\unexpanded\def\setupstructure[#1]% {\getparameters[\??el][#1]% \the\everysetupstructure} -\def\doenableelements +\unexpanded\def\doenableelements {\setuplanguage[\s!default][\s!righthyphenchar="AD]% for the moment here \let\startelement\dostartelement \let\stopelement \dostopelement} -\def\dodisableelements +\unexpanded\def\dodisableelements {\let\startelement\renostartelement \let\stopelement \nonostopelement} -\def\doenabletagged +\unexpanded\def\doenabletagged {\let\dostarttagged\dodostarttagged \let\dostoptagged \dodostoptagged } -\def\dodisabletagged +\unexpanded\def\dodisabletagged {\let\dostarttagged\nododostarttagged \let\dostoptagged \nododostoptagged } @@ -248,14 +250,19 @@ \dostoptagged \to \everystoptext +\appendtoks + \dodisableelements + \dodisabletagged +\to \everypagebody + % \doifinelementelse{structure:section} {yes} {no} % \doifinelementelse{structure:chapter} {yes} {no} % \doifinelementelse{division:*-structure:chapter} {yes} {no} -\def\doifinelementelse#1% +\unexpanded\def\doifinelementelse#1% {\ctxcommand{testcase(structures.atlocation("#1"))}} -\def\taggedlabeltexts#1#2#3% experimental: label, numberdetail, numbercontent +\unexpanded\def\taggedlabeltexts#1#2#3% experimental: label, numberdetail, numbercontent {\begingroup \dostarttagged\t!label{#1}% \labeltexts{#1}% @@ -267,7 +274,7 @@ \dostoptagged \endgroup} -\def\namedtaggedlabeltexts#1#2#3#4#5% experimental: labeltag label numbertag numberdetail numbercontent +\unexpanded\def\namedtaggedlabeltexts#1#2#3#4#5% experimental: labeltag label numbertag numberdetail numbercontent {\begingroup \dostarttagged{#1}{#2}% \labeltexts{#2}% @@ -298,7 +305,7 @@ %D \stoptext %D \stoptyping -\def\settaggedmetadata[#1]% +\unexpanded\def\settaggedmetadata[#1]% {\ctxlua{structures.tags.registermetadata(\!!bs#1\!!es)}} \protect diff --git a/tex/context/base/supp-box.mkiv b/tex/context/base/supp-box.mkiv index a874ae43b..f261bbb9b 100644 --- a/tex/context/base/supp-box.mkiv +++ b/tex/context/base/supp-box.mkiv @@ -2328,7 +2328,6 @@ {\dorecurse5{\unskip\unkern\unpenalty}} \unexpanded\def\removelastskip % \ifvmode the plain tex one \fi -% {\ifvmode\ifdim\lastskip=\zeropoint\else\vskip-\lastskip\fi\fi} {\ifvmode\ifzeropt\lastskip\else\vskip-\lastskip\fi\fi} %D \macros @@ -2381,8 +2380,8 @@ %D New: -\def\setdimentoatleast#1#2% - {\ifdim#1>\zeropoint\else#1=#2\fi} +\def\setdimentoatleast#1#2{\ifdim#1>\zeropoint\else#1=#2\fi} +\def\setdimentoatmost #1#2{\ifdim#1>#2\relax \else#1=#2\fi} %D And even rawer: diff --git a/tex/context/base/supp-mat.mkiv b/tex/context/base/supp-mat.mkiv index 9049472bd..e4cfd13e5 100644 --- a/tex/context/base/supp-mat.mkiv +++ b/tex/context/base/supp-mat.mkiv @@ -61,29 +61,32 @@ \let\startdmath \Ustartdisplaymath % obsolete, less safe \let\stopdmath \Ustopmath % obsolete, less safe -\long\def\mathematics#1{\relax \ifmmode#1\else\normalstartimath#1\normalstopimath\fi} -\long\def\displaymath#1{\noindent \ifmmode#1\else\normalstartdmath#1\normalstopdmath\fi} -\long\def\inlinemath #1{\dontleavehmode\ifmmode#1\else\normalstartimath#1\normalstopimath\fi} +\unexpanded\def\mathematics#1{\relax \ifmmode#1\else\normalstartimath#1\normalstopimath\fi} +\unexpanded\def\displaymath#1{\noindent \ifmmode#1\else\normalstartdmath#1\normalstopdmath\fi} +\unexpanded\def\inlinemath #1{\dontleavehmode\ifmmode#1\else\normalstartimath#1\normalstopimath\fi} +\unexpanded\def\textmath #1{\dontleavehmode\ifmmode#1\else\begingroup\everymath\emptytoks\normalstartimath#1\normalstopimath\endgroup\fi} % \mathsurround\zeropoint \let\m\mathematics % unexpanded? \let\stopmathmode\relax -\unexpanded\def\startmathmode % cannot be used nested - {\relax\ifmmode - \let\stopmathmode\relax - \else - \normalstartimath\let\stopmathmode\normalstopimath - \fi} +% \unexpanded\def\startmathmode % cannot be used nested +% {\relax\ifmmode +% \let\stopmathmode\relax +% \else +% \normalstartimath\let\stopmathmode\normalstopimath +% \fi} \unexpanded\def\startmathmode % nested variant {\relax\ifmmode - \begingroup\let\stopmathmode\endgroup + \begingroup + \let\stopmathmode\endgroup \else - \normalstartimath\let\stopmathmode\normalstopimath + \normalstartimath + \let\stopmathmode\normalstopimath \fi} -\def\nomathematics#1% +\unexpanded\def\nomathematics#1% {\relax\ifmmode\hbox{#1}\else#1\fi} \let\math\mathematics diff --git a/tex/context/base/symb-imp-mis.mkiv b/tex/context/base/symb-imp-mis.mkiv index 1037ba542..d2657512f 100644 --- a/tex/context/base/symb-imp-mis.mkiv +++ b/tex/context/base/symb-imp-mis.mkiv @@ -16,17 +16,18 @@ %D We predefine some common symbols and conversions that will %D be understood by many commands. The \type {\mathematics} %D is no longer needed, although only math fonts might have -%D these symbols. +%D these symbols. The \type {\textmath} macro is twice as +%D efficient. \definesymbol [\v!none] [] -\definesymbol [bullet] [\mathematics{\bullet}] -\definesymbol [dash] [\mathematics{-}] -\definesymbol [star] [\mathematics{\star}] -\definesymbol [triangle] [\mathematics{\triangleright}] -\definesymbol [circle] [\mathematics{\circ}] -\definesymbol [square] [\mathematics{\square}] -\definesymbol [diamond] [\mathematics{\diamond}] +\definesymbol [bullet] [\textmath\bullet] +\definesymbol [dash] [\textmath-] +\definesymbol [star] [\textmath\star] +\definesymbol [triangle] [\textmath\triangleright] +\definesymbol [circle] [\textmath\circ] +\definesymbol [square] [\textmath\square] +\definesymbol [diamond] [\textmath\diamond] % I'm not sure about this ... I dislike the small bullet. So we provide % it as variant: \type {\setupsymbolset[text]}. Also, we want to be @@ -49,9 +50,9 @@ \stopsymbolset -\definesymbol [smallcircle] [\hbox{\raise.1ex\hbox{\mathematics{\scriptscriptstyle\bigcirc}}}] -\definesymbol [medcircle] [\hbox{\raise.1ex\hbox{\mathematics{\scriptstyle \bigcirc}}}] -\definesymbol [bigcircle] [\mathematics{\bigcirc}] +\definesymbol [smallcircle] [\hbox{\raise.1ex\hbox{\textmath{\scriptscriptstyle\bigcirc}}}] +\definesymbol [medcircle] [\hbox{\raise.1ex\hbox{\textmath{\scriptstyle \bigcirc}}}] +\definesymbol [bigcircle] [\textmath{\bigcirc}] \definesymbol [1] [\symbol{bullet}] \definesymbol [2] [\symbol{dash}] diff --git a/tex/context/base/symb-ini.mkiv b/tex/context/base/symb-ini.mkiv index 182840ed5..c58429074 100644 --- a/tex/context/base/symb-ini.mkiv +++ b/tex/context/base/symb-ini.mkiv @@ -84,13 +84,16 @@ \newif\ifnosymbol \newtoks\everysymbol \def\dodosymbol#1#2% \relax's prevent lookahead problems - {\nosymbolfalse{\the\everysymbol\csname\??ss:#1:#2\endcsname\relax}\relax} + {\nosymbolfalse + \begingroup + \the\everysymbol + \csname\??ss:#1:#2\endcsname\relax + \endgroup} \letvalue{\??ss:}\firstofoneargument \def\directsymbol#1#2% no \relax, there can be an argument, see lists - {%\executeifdefined{\??ss:#1:#2}\firstofoneargument} - \csname\??ss:\ifcsname\??ss:#1:#2\endcsname#1:#2\fi\endcsname} + {\csname\??ss:\ifcsname\??ss:#1:#2\endcsname#1:#2\fi\endcsname} % We support both: % @@ -109,11 +112,15 @@ \secondargumentfalse \donormalsymbol[#3][]} +% \doifinsymbolset{#1}{#2}{\dodosymbol{#1}{#2}} + \def\donormalsymbol[#1][#2]% {\nosymboltrue \ifsecondargument \edef\currentsymbol{#2}% - \doifinsymbolset{#1}{#2}{\dodosymbol{#1}{#2}}% + \ifcsname\??ss:#1:#2\endcsname + \dodosymbol{#1}{#2}% + \fi \else \edef\currentsymbol{#1}% \fi @@ -124,13 +131,23 @@ \fi \fi} +% \doifinsymbolset{#1}\currentsymbol{\dodosymbol{#1}\currentsymbol} + \def\fetchsymbol#1% {\ifnosymbol - \doifinsymbolset{#1}\currentsymbol{\dodosymbol{#1}\currentsymbol}% + \ifcsname\??ss:#1:\currentsymbol\endcsname + \dodosymbol{#1}\currentsymbol + \fi \fi} +% \doifinsymbolsetelse\empty{#1}{\dodosymbol\empty}\firstofoneargument{#1}} + \def\redosymbol#1% - {\doifinsymbolsetelse\empty{#1}{\dodosymbol\empty}\firstofoneargument{#1}} + {\ifcsname\??ss::#1\endcsname + \dodosymbol\empty{#1}% + \else + #1% + \fi} %D \macros %D {definefiguresymbol} diff --git a/tex/context/base/syst-aux.lua b/tex/context/base/syst-aux.lua index a585ed8b2..7fd25d6ab 100644 --- a/tex/context/base/syst-aux.lua +++ b/tex/context/base/syst-aux.lua @@ -6,12 +6,47 @@ if not modules then modules = { } end modules ['syst-aux'] = { license = "see context related readme files" } +local settings_to_array = utilities.parsers.settings_to_array +local concat = table.concat + +local setvalue = context.setvalue + function commands.getfirstcharacter(str) local first, rest = utf.match(str,"(.?)(.*)$") - context.setvalue("firstcharacter",first) - context.setvalue("remainingcharacters",rest) + setvalue("firstcharacter",first) + setvalue("remainingcharacters",rest) end function commands.doiffirstcharelse(chr,str) commands.doifelse(utf.sub(str,1,1) == chr) end + +-- function commands.addtocommalist(list,item) +-- if list == "" then +-- context(item) +-- else +-- context("%s,%s",list,item) -- using tex.print is some 10% faster +-- end +-- end +-- +-- function commands.removefromcommalist(list,item) +-- if list == "" then +-- context(item) +-- else +-- -- okay, using a proper lpeg is probably faster +-- -- we could also check for #l = 1 +-- local l = settings_to_array(list) +-- local t, n = { } +-- for i=1,#l do +-- if l[i] ~= item then +-- n = n + 1 +-- t[n] = item +-- end +-- end +-- if n == 0 then +-- context(item) +-- else +-- context(concat(list,",")) +-- end +-- end +-- end diff --git a/tex/context/base/syst-aux.mkiv b/tex/context/base/syst-aux.mkiv index 74887a3bb..598813275 100644 --- a/tex/context/base/syst-aux.mkiv +++ b/tex/context/base/syst-aux.mkiv @@ -14,9 +14,11 @@ %D Some of the macros will move to syst-obs as they might become %D obsolete once we've redone the bibliography module. Of course %D the handy helpers will stay. - -% no longs -% more unexpanded +%D +%D There are some references to \LUA\ variants here but these concern +%D (often old) experiments, moved from local test modules to here, +%D cleaned up, but not really used. After all it's not that urgent +%D and replacing helpers is a delicate process. Don't depend on it. \registerctxluafile{syst-aux}{1.001} @@ -685,7 +687,7 @@ \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} -\def\doifinsetelse#1% make this two step too +\unexpanded\def\doifinsetelse#1% make this two step too {\edef\!!stringa{#1}% \ifx\!!stringa\empty \expandafter\thirdofthreearguments @@ -701,7 +703,7 @@ \expandafter\re_do_if_in_set_else \fi} -\def\doifinset#1% +\unexpanded\def\doifinset#1% {\edef\!!stringa{#1}% \ifx\!!stringa\empty \expandafter\gobbletwoarguments @@ -717,7 +719,7 @@ \expandafter\re_do_if_in_set \fi} -\def\doifnotinset#1% +\unexpanded\def\doifnotinset#1% {\edef\!!stringa{#1}% \ifx\!!stringa\empty \expandafter\secondoftwoarguments @@ -877,9 +879,9 @@ {\def\do_common_check{\expandafter\do_check_if_common_else_two\!!stringb,],\relax}% \expandafter\do_check_if_common_else_one\!!stringa,],\relax} -\def\doifcommonelse{\do_do_if_common_else\firstoftwoarguments\secondoftwoarguments} -\def\doifcommon {\do_do_if_common_else\firstofoneargument \gobbleoneargument } -\def\doifnotcommon {\do_do_if_common_else\gobbleoneargument \firstofoneargument } +\unexpanded\def\doifcommonelse{\do_do_if_common_else\firstoftwoarguments\secondoftwoarguments} +\unexpanded\def\doifcommon {\do_do_if_common_else\firstofoneargument \gobbleoneargument } +\unexpanded\def\doifnotcommon {\do_do_if_common_else\gobbleoneargument \firstofoneargument } %D \macros %D {processcommalist,processcommacommand,quitcommalist, @@ -3311,8 +3313,8 @@ % maybe reserve special zero and plusone -\def\settrue #1{\let#1\zerocount} -\def\setfalse#1{\let#1\plusone} +\unexpanded\def\settrue #1{\let#1\zerocount} +\unexpanded\def\setfalse#1{\let#1\plusone } \let\newconditional\setfalse \let\ifconditional \ifcase @@ -4887,30 +4889,30 @@ %D %D The faster alternatives are: -\def\appendtocommalist#1#2% +\unexpanded\def\appendtocommalist#1#2% {\dodoglobal\edef#2{\ifx#2\empty\else#2,\fi#1}} -\def\prependtocommalist#1#2% +\unexpanded\def\prependtocommalist#1#2% {\dodoglobal\edef#2{#1\ifx#2\empty\else,#2\fi}} -\def\addtocommalist#1#2% {item} \cs +\unexpanded\def\addtocommalist#1#2% {item} \cs {\rawdoifinsetelse{#1}#2\resetglobal {\dodoglobal\edef#2{\ifx#2\empty\else#2,\fi#1}}} -\def\pretocommalist#1#2% {item} \cs +\unexpanded\def\pretocommalist#1#2% {item} \cs {\rawdoifinsetelse{#1}#2\resetglobal {\dodoglobal\edef#2{#1\ifx#2\empty\else,#2\fi}}} -\def\robustdoifinsetelse#1#2% +\unexpanded\def\robustdoifinsetelse#1#2% {\edef\!!stringa{\detokenize\expandafter{\normalexpanded{#1}}}% \edef\!!stringb{\detokenize\expandafter{\normalexpanded{#2}}}% \rawdoifinsetelse\!!stringa\!!stringb} -\def\robustaddtocommalist#1#2% {item} \cs +\unexpanded\def\robustaddtocommalist#1#2% {item} \cs {\robustdoifinsetelse{#1}#2\resetglobal {\dodoglobal\edef#2{\ifx#2\empty\else#2,\fi#1}}} -\def\robustpretocommalist#1#2% {item} \cs +\unexpanded\def\robustpretocommalist#1#2% {item} \cs {\robustdoifinsetelse{#1}#2\resetglobal {\dodoglobal\edef#2{#1\ifx#2\empty\else,#2\fi}}} @@ -4924,7 +4926,7 @@ \def\bcleanedupcommalist#1#2\relax{\if#1,\else#1\fi#2} \def\acleanedupcommalist#1,,#2\relax{#1} -\def\removefromcommalist#1#2% to be sped up +\unexpanded\def\removefromcommalist#1#2% to be sped up {\rawdoifinsetelse{#1}#2% {\normalexpanded{\noexpand\xsplitstring\noexpand#2{#1}}% \dodoglobal\edef#2% @@ -4935,6 +4937,12 @@ \fi}} \resetglobal} +% \unexpanded\def\addtocommalist#1#2% upto 3 times slower +% {\dodoglobal\edef#2{\ctxcommand{addtocommalist(\!!bs#1\!!es,\!!bs#2\!!es)}}} +% +% \unexpanded\def\removefromcommalist#1#2% faster and more robust +% {\dodoglobal\edef#2{\ctxcommand{addtocommalist(\!!bs#1\!!es,\!!bs#2\!!es)}}} + %D \macros %D {substituteincommalist} %D @@ -5100,16 +5108,23 @@ \def\numberofpoints #1{\the\numexpr\dimexpr#1\relax/\maxcard\relax} %D \macros -%D {swapdimens,swapcounts,swapmacros} +%D {swapdimens,swapcounts,swapmacros, +%D globalswapdimens,globalswapcounts,globalswapmacros} %D %D Simple but effective are the next two macros. There name -%D exactly states their purpose. The \type{\scratchdimen} and -%D \type{\!!stringa} can only be swapped when being the first -%D argument. +%D exactly states their purpose. -\def\swapdimens#1#2{\scratchdimen #1\redoglobal #1#2\dodoglobal #2\scratchdimen} -\def\swapcounts#1#2{\scratchcounter#1\redoglobal #1#2\dodoglobal #2\scratchcounter} -\def\swapmacros#1#2{\let\!!stringa #1\redoglobal\let#1#2\dodoglobal\let#2\!!stringa} +\newdimen\swapped_dimen +\newcount\swapped_count +\let \swapped_macro\relax + +\unexpanded\def\swapdimens#1#2{\swapped_dimen #1\relax#1#2\relax#2\swapped_dimen} +\unexpanded\def\swapcounts#1#2{\swapped_count #1\relax#1#2\relax#2\swapped_count} +\unexpanded\def\swapmacros#1#2{\let\swapped_macro#1\let #1#2\let #2\swapped_macro} + +\unexpanded\def\globalswapdimens#1#2{\swapped_dimen #1\global #1#2\global #2\swapped_dimen} +\unexpanded\def\globalswapcounts#1#2{\swapped_count #1\global #1#2\global #2\swapped_count} +\unexpanded\def\globalswapmacros#1#2{\let\swapped_macro#1\global\let#1#2\global\let#2\swapped_macro} %D \macros %D {pushmacro,popmacro} @@ -5533,55 +5548,55 @@ \expandafter\firstoftwoarguments \fi} -%D \macros -%D {adaptdimension,balancedimensions} -%D -%D Again we introduce some macros that are closely related to -%D an interface aspect of \CONTEXT. The first command can be -%D used to adapt a \DIMENSION. -%D -%D \starttyping -%D \adaptdimension {dimension} {value} -%D \stoptyping -%D -%D When the value is preceed by a \type{+} or minus, the -%D dimension is advanced accordingly, otherwise it gets the -%D value. - -\def\doadaptdimension#1#2\\#3\\% - {\if#1+% - \dodoglobal\advance - \else\if#1-% - \dodoglobal\advance - \else - \dodoglobal - \fi\fi - #3 #1#2\relax} - -\def\adaptdimension#1#2% - {\expandafter\doadaptdimension#2\\#1\\} - -%D A second command takes two \DIMENSIONS. Both are adapted, -%D depending on the sign of the given value. -%D maat. This time we take the value as it is, and don't look -%D explicitly at the preceding sign. -%D -%D \starttyping -%D \balancedimensions {dimension 1} {dimension 2} {value} -%D \stoptyping -%D -%D When a positive value is given, the first dimension is -%D incremented, the second ond is decremented. A negative value -%D has the opposite result. - -\def\balancedimensions#1#2#3% - {\scratchdimen#3\relax - \redoglobal\advance#1 \scratchdimen - \dodoglobal\advance#2 -\scratchdimen} - -%D Both commands can be preceded by \type{\doglobal}. Here we -%D use \type{\redo} first, because \type{\dodo} resets the -%D global character. +% %D \macros +% %D {adaptdimension,balancedimensions} +% %D +% %D Again we introduce some macros that are closely related to +% %D an interface aspect of \CONTEXT. The first command can be +% %D used to adapt a \DIMENSION. +% %D +% %D \starttyping +% %D \adaptdimension {dimension} {value} +% %D \stoptyping +% %D +% %D When the value is preceed by a \type{+} or minus, the +% %D dimension is advanced accordingly, otherwise it gets the +% %D value. +% +% \def\doadaptdimension#1#2\\#3\\% +% {\if#1+% +% \dodoglobal\advance +% \else\if#1-% +% \dodoglobal\advance +% \else +% \dodoglobal +% \fi\fi +% #3 #1#2\relax} +% +% \def\adaptdimension#1#2% +% {\expandafter\doadaptdimension#2\\#1\\} +% +% %D A second command takes two \DIMENSIONS. Both are adapted, +% %D depending on the sign of the given value. +% %D maat. This time we take the value as it is, and don't look +% %D explicitly at the preceding sign. +% %D +% %D \starttyping +% %D \balancedimensions {dimension 1} {dimension 2} {value} +% %D \stoptyping +% %D +% %D When a positive value is given, the first dimension is +% %D incremented, the second ond is decremented. A negative value +% %D has the opposite result. +% +% \def\balancedimensions#1#2#3% +% {\scratchdimen#3\relax +% \redoglobal\advance#1 \scratchdimen +% \dodoglobal\advance#2 -\scratchdimen} +% +% %D Both commands can be preceded by \type{\doglobal}. Here we +% %D use \type{\redo} first, because \type{\dodo} resets the +% %D global character. %D \macros %D {processseparatedlist} @@ -6718,7 +6733,7 @@ \newcount\featuretest -\def\testfeature#1#2% +\unexpanded\def\testfeature#1#2% {\def\dotestfeature {\advance\featuretest \plusone \ifnum\featuretest>#1\else#2\expandafter\dotestfeature\fi}% @@ -6734,11 +6749,14 @@ \wait \egroup} -\def\showtimer#1% +\unexpanded\def\showtimer#1% {\writestatus{runtime}{\elapsedseconds\space s / #1}} -\def\testfeatureonce#1#2% - {\let\wait\relax\testfeature{#1}{#2}\end} +\unexpanded\def\testfeatureonce#1#2% + {\begingroup + \let\wait\relax + \testfeature{#1}{#2}% + \endgroup} %D \macros %D {freezedimenmacro} diff --git a/tex/context/base/syst-ini.mkiv b/tex/context/base/syst-ini.mkiv index 46f08854c..df18f5307 100644 --- a/tex/context/base/syst-ini.mkiv +++ b/tex/context/base/syst-ini.mkiv @@ -331,13 +331,14 @@ \newbox \scratchboxone \newbox \scratchboxtwo \newbox \scratchboxthree %D \macros -%D {scratchwidth, scratchheight, scratchdepth} +%D {scratchwidth, scratchheight, scratchdepth, scratchoffset} %D %D A few more scratch dimensions: \newdimen\scratchwidth \newdimen\scratchheight \newdimen\scratchdepth +\newdimen\scratchoffset %D More allocations: @@ -825,25 +826,25 @@ % new after 1.10, watch the change in prefix -\bindprimitive quitvmode ptexquitvmode -\bindprimitive noligatures ptexnoligatures -\bindprimitive setrandomseed ptexsetrandomseed -\bindprimitive uniformdeviate ptexuniformdeviate +% \bindprimitive quitvmode ptexquitvmode +% \bindprimitive noligatures ptexnoligatures +% \bindprimitive setrandomseed ptexsetrandomseed +% \bindprimitive uniformdeviate ptexuniformdeviate -\bindprimitive quitvmode pdfquitvmode -\bindprimitive noligatures pdfnoligatures -\bindprimitive setrandomseed pdfsetrandomseed -\bindprimitive uniformdeviate pdfuniformdeviate +% \bindprimitive quitvmode pdfquitvmode +% \bindprimitive noligatures pdfnoligatures +% \bindprimitive setrandomseed pdfsetrandomseed +% \bindprimitive uniformdeviate pdfuniformdeviate -\bindprimitive resettimer pdfresettimer -\bindprimitive elapsedtime pdfelapsedtime +% \bindprimitive resettimer pdfresettimer +% \bindprimitive elapsedtime pdfelapsedtime % new per 1.40 -\bindprimitive ifprimitive ifpdfprimitive -\bindprimitive primitive pdfprimitive -\bindprimitive ifabsdim ifpdfabsdim -\bindprimitive ifabsnum ifpdfabsnum +% \bindprimitive ifprimitive ifpdfprimitive +% \bindprimitive primitive pdfprimitive +% \bindprimitive ifabsdim ifpdfabsdim +% \bindprimitive ifabsnum ifpdfabsnum \ifnum\texengine=\xetexengine \else % this test might disappear some day diff --git a/tex/context/base/tabl-ltb.mkiv b/tex/context/base/tabl-ltb.mkiv index 44f1d2c14..91bca6262 100644 --- a/tex/context/base/tabl-ltb.mkiv +++ b/tex/context/base/tabl-ltb.mkiv @@ -245,29 +245,10 @@ \hbox \ifcase\linetablemode \or to\scratchdimen \fi \bgroup \ifcase\alignmentswitch\hss\or\hss\fi \fi - \dostartattributes{\??lec\number\linetablecolumn}\c!style\c!color\empty + \dousestylehashparameter{\??lec\number\linetablecolumn}\c!style + \dousecolorhashparameter{\??lec\number\linetablecolumn}\c!color \begstrut \ignorespaces} -% \unexpanded\def\stoplinetablecell -% {\unskip \endstrut -% \dostopattributes -% \ifcase\linetablemode -% \endgraf -% \else -% \ifcase\alignmentswitch\else\hss\fi -% \fi -% \egroup -% \hskip\linetablecparameter\c!rightoffset -% \egroup -% \iflinetablepreroll -% \box\scratchbox -% \else -% \doif{\linetablecparameter\c!background}\v!color -% {\backgroundline[\linetablecparameter\c!backgroundcolor]}% -% {\box\scratchbox}% -% \fi -% \egroup} - \newconditional\linetableautoheight \settrue\linetableautoheight \unexpanded\def\stoplinetablecell @@ -299,44 +280,6 @@ \fi \egroup} -% \unexpanded\def\stoplinetablecell -% {\unskip \endstrut -% \dostopattributes -% \ifcase\linetablemode -% \endgraf -% \else -% \ifcase\alignmentswitch\else\hss\fi -% \fi -% \egroup -% \hskip\linetablecparameter\c!rightoffset -% \egroup -% \iflinetablepreroll -% \box\scratchbox -% \else -% \doifelse{\linetablecparameter\c!background}\v!color -% {\ifconditional\linetableautoheight -% % \hbox{\blackrule -% % [ \c!color=\linetablecparameter\c!backgroundcolor, -% % \c!height=\linetablerparameter{x\c!height}, -% % \c!depth=\linetablerparameter{x\c!depth}, -% % \c!width=\wd\scratchbox]% -% % \hskip-\wd\scratchbox\box\scratchbox}% -% \dp\scratchbox\linetablerparameter{x\c!depth}% -% \ht\scratchbox\linetablerparameter{x\c!height}% -% \framed -% [\c!offset=\v!overlay, -% \c!frameoffset=.5\linewidth, -% \c!leftframe=\v!off,\c!rightframe=\v!off, -% \c!background=\v!color, -% \c!backgroundcolor=\linetablecparameter\c!backgroundcolor% -% ]{\box\scratchbox}% -% \else -% \backgroundline[\linetablecparameter\c!backgroundcolor]{\box\scratchbox}% -% \fi}% -% {\box\scratchbox}% -% \fi -% \egroup} - \def\savelinetablepart {\global\setbox\tablebox\linetablepart \ifnum\linetablepart=\zerocount @@ -391,15 +334,14 @@ \unexpanded\def\startlinetablepart {\global\linetablesubcol\zerocount \setbox\scratchbox\hbox\bgroup - \doconvertfont{\linetablerparameter\c!style}% - \startcolor[\linetablerparameter\c!color]% + \dousestyleparameter{\linetablerparameter\c!style}% + \dousecolorparameter{\linetablerparameter\c!color}% \ignorespaces} \unexpanded\def\stoplinetablepart {\ifnum\linetablepart>\zerocount \unskip \unskip % remove last intercolumn skip (distance+fill) \fi - \stopcolor \egroup \iflinetablepreroll \else \ifcase\linetablepart diff --git a/tex/context/base/tabl-ntb.mkiv b/tex/context/base/tabl-ntb.mkiv index aa44e7942..fa1e121f1 100644 --- a/tex/context/base/tabl-ntb.mkiv +++ b/tex/context/base/tabl-ntb.mkiv @@ -131,7 +131,7 @@ \def\bTBLCELL % why not \doinhibitblank {\inhibitblank \dotagTABLEcell - \doconvertfont\tbltblstyle\empty + \dousestyleparameter\tbltblstyle \everypar{\tbltblleft\delayedbegstrut}} \def\eTBLCELL diff --git a/tex/context/base/tabl-xtb.lua b/tex/context/base/tabl-xtb.lua index b753560c6..2dd53accd 100644 --- a/tex/context/base/tabl-xtb.lua +++ b/tex/context/base/tabl-xtb.lua @@ -212,14 +212,14 @@ function xtables.set_reflow_width() local fixedcolumns = data.fixedcolumns local fixedrows = data.fixedrows if dimensionstate == 1 then -if width > fixedcolumns[c] then -- how about a span here? - fixedcolumns[c] = width -end + if width > fixedcolumns[c] then -- how about a span here? + fixedcolumns[c] = width + end elseif dimensionstate == 2 then fixedrows[r] = height elseif dimensionstate == 3 then - fixedrows[r] = width - fixedcolumns[c] = height + fixedrows[r] = height -- width + fixedcolumns[c] = width -- height else -- probably something frozen, like an image -- we could parse the list if width <= data.criterium_h and height >= data.criterium_v then if width > fixedcolumns[c] then -- how about a span here? diff --git a/tex/context/base/trac-log.lua b/tex/context/base/trac-log.lua index fb3a7a6f7..c1d890276 100644 --- a/tex/context/base/trac-log.lua +++ b/tex/context/base/trac-log.lua @@ -403,6 +403,7 @@ local real, user, sub function logs.start_page_number() real, user, sub = texcount.realpageno, texcount.userpageno, texcount.subpageno +-- real, user, sub = 0, 0, 0 end local timing = false diff --git a/tex/context/base/type-lucidanova.mkiv b/tex/context/base/type-lucidanova.mkiv index 2b2c2af0e..b0b080839 100644 --- a/tex/context/base/type-lucidanova.mkiv +++ b/tex/context/base/type-lucidanova.mkiv @@ -15,57 +15,53 @@ \starttypescriptcollection[lucidanova] - \starttypescript [\s!math] [lucidanova] - \definefontsynonym [MathRoman] [\s!file:LucidaMath.otf] [\s!features=\s!math\mathsizesuffix,\s!goodies=lucidanova-math] - \definefontsynonym [MathRomanBold] [\s!file:LucidaMath-Demi.otf] [\s!features=\s!math\mathsizesuffix,\s!goodies=lucidanova-math] + \starttypescript [\s!math] [lucidanova,lucidaot,otlucida] + \definefontsynonym [MathRoman] [\s!file:LucidaBrightMathOT.otf] [\s!features=\s!math\mathsizesuffix,\s!goodies=lucidanova-math] + \definefontsynonym [MathRomanBold] [\s!file:LucidaBrightMathOT-Demi.otf] [\s!features=\s!math\mathsizesuffix,\s!goodies=lucidanova-math] \stoptypescript - \starttypescript [\s!serif] [lucidanova] - \definefontsynonym [\s!Serif] [\s!file:LucidaBright.otf] - \definefontsynonym [\s!SerifBold] [\s!file:LucidaBright-Demi.otf] - \definefontsynonym [\s!SerifItalic] [\s!file:LucidaBright-Italic.otf] - \definefontsynonym [\s!SerifBoldItalic] [\s!file:LucidaBright-DemiItalic.otf] + \starttypescript [\s!serif] [lucidanova,lucidaot,otlucida] + \definefontsynonym [\s!Serif] [\s!file:LucidaBrightOT.otf] + \definefontsynonym [\s!SerifBold] [\s!file:LucidaBrightOT-Demi.otf] + \definefontsynonym [\s!SerifItalic] [\s!file:LucidaBrightOT-Italic.otf] + \definefontsynonym [\s!SerifBoldItalic] [\s!file:LucidaBrightOT-DemiItalic.otf] \definefontsynonym [\s!SerifSlanted] [\s!SerifItalic] \definefontsynonym [\s!SerifBoldSlanted] [\s!SerifBoldItalic] \stoptypescript - \starttypescript [\s!sans] [lucidanova] - \definefontsynonym [\s!Sans] [\s!file:LucidaSans.otf] - \definefontsynonym [\s!SansBold] [\s!file:LucidaSans-Bold.otf] - \definefontsynonym [\s!SansItalic] [\s!file:LucidaSans-Oblique.otf] - \definefontsynonym [\s!SansBoldItalic] [\s!file:LucidaSans-BoldOblique.otf] + \starttypescript [\s!sans] [lucidanova,lucidaot,otlucida] + \definefontsynonym [\s!Sans] [\s!file:LucidaSansOT.otf] + \definefontsynonym [\s!SansBold] [\s!file:LucidaSansOT-Bold.otf] + \definefontsynonym [\s!SansItalic] [\s!file:LucidaSansOT-Oblique.otf] + \definefontsynonym [\s!SansBoldItalic] [\s!file:LucidaSansOT-BoldOblique.otf] \definefontsynonym [\s!SansSlanted] [\s!MonoItalic] \definefontsynonym [\s!SansBoldSlanted] [\s!MonoBoldItalic] \stoptypescript - \starttypescript [\s!mono] [lucidanova] - \definefontsynonym [\s!Mono] [\s!file:LucidaSansTypewriter.otf] - \definefontsynonym [\s!MonoBold] [\s!file:LucidaSansTypewriter-Bold.otf] - \definefontsynonym [\s!MonoItalic] [\s!file:LucidaSansTypewriter-Oblique.otf] - \definefontsynonym [\s!MonoBoldItalic] [\s!file:LucidaSansTypewriter-BoldOblique.otf] + \starttypescript [\s!mono] [lucidanova,lucidaot,otlucida] + \definefontsynonym [\s!Mono] [\s!file:LucidaSansTypewriterOT.otf] + \definefontsynonym [\s!MonoBold] [\s!file:LucidaSansTypewriterOT-Bold.otf] + \definefontsynonym [\s!MonoItalic] [\s!file:LucidaSansTypewriterOT-Oblique.otf] + \definefontsynonym [\s!MonoBoldItalic] [\s!file:LucidaSansTypewriterOT-BoldOblique.otf] \definefontsynonym [\s!MonoSlanted] [\s!MonoItalic] \definefontsynonym [\s!MonoBoldSlanted] [\s!MonoBoldItalic] \stoptypescript - \starttypescript [handwriting] [lucidanova] + \starttypescript [handwriting] [lucidanova,lucidaot,otlucida] \definefontsynonym [LucidaHandwriting] [\s!name:LucidaHandwriting-Italic] \definefontsynonym [Handwriting] [LucidaHandwriting] \stoptypescript - \starttypescript [lucidanova] + \starttypescript [lucidanova,lucidaot,otlucida] %\loadfontgoodies[lucidanova-math] - \definetypeface [lucidanova] [rm] [\s!serif] [lucidanova] [\s!default] [\s!features=\s!default] - \definetypeface [lucidanova] [ss] [\s!sans] [lucidanova] [\s!default] [\s!features=\s!default] - \definetypeface [lucidanova] [tt] [\s!mono] [lucidanova] [\s!default] [\s!features=\s!none] - \definetypeface [lucidanova] [mm] [\s!math] [lucidanova] [\s!default] + \definetypeface [\typescriptone] [rm] [\s!serif] [lucidanova] [\s!default] [\s!features=\s!default] + \definetypeface [\typescriptone] [ss] [\s!sans] [lucidanova] [\s!default] [\s!features=\s!default] + \definetypeface [\typescriptone] [tt] [\s!mono] [lucidanova] [\s!default] [\s!features=\s!none] + \definetypeface [\typescriptone] [mm] [\s!math] [lucidanova] [\s!default] + % for the moment here: + \setupmathrendering[\typescriptone][it=italic] \stoptypescript - % for the moment here: - - \setupmathrendering - [lucidanova] - [it=italic] - \stoptypescriptcollection \endinput diff --git a/tex/context/base/typo-ini.lua b/tex/context/base/typo-ini.lua index 40fe7dfaa..c45d29664 100644 --- a/tex/context/base/typo-ini.lua +++ b/tex/context/base/typo-ini.lua @@ -7,3 +7,5 @@ if not modules then modules = { } end modules ['typo-ini'] = { } -- nothing yet + +typesetters = typesetters or { } diff --git a/tex/context/base/typo-mar.mkiv b/tex/context/base/typo-mar.mkiv index c9218ace2..9bbf2a214 100644 --- a/tex/context/base/typo-mar.mkiv +++ b/tex/context/base/typo-mar.mkiv @@ -187,7 +187,7 @@ \ifcsname\currentmarginframedhash\s!parent\endcsname \setbox\nextbox\hbox \currentmarginreference \bgroup \the\everymargindatacontent - \dosetmargindataattributes\c!style\c!color + \usemargindatastyleandcolor\c!style\c!color \setupcurrentmarginframed[\c!location=\v!normal,#textparameters]% \inheritedmarginframedframed\bgroup \ifx\currentmargindatastrut\empty \else @@ -202,7 +202,7 @@ \ifx\currentmargindatawidth\empty \setbox\nextbox\hbox \currentmarginreference \bgroup \the\everymargindatacontent - \dosetmargindataattributes\c!style\c!color + \usemargindatastyleandcolor\c!style\c!color \ifx\currentmargindatastrut\empty \else \dosetupstrut[\currentmargindatastrut]% \fi @@ -214,7 +214,7 @@ \setbox\nextbox\hbox \currentmarginreference \bgroup \vtop \bgroup \the\everymargindatacontent - \dosetmargindataattributes\c!style\c!color + \usemargindatastyleandcolor\c!style\c!color \hsize\currentmargindatawidth \raggedcommand \ifx\currentmargindatastrut\empty \else diff --git a/tex/context/base/typo-par.mkiv b/tex/context/base/typo-par.mkiv index 196585324..fa0f71117 100644 --- a/tex/context/base/typo-par.mkiv +++ b/tex/context/base/typo-par.mkiv @@ -49,7 +49,7 @@ %D \placeinitial \input ward \par \input ward \placeinitial \input tufte %D \stoptyping -\installsimplecommandhandler \??dc {initial} +\installsimplecommandhandler \??dc {initial} \??dc \appendtoks \checkinitialparent % this might become automatic @@ -78,7 +78,7 @@ \begingroup \edef\currentinitial{#1}% \begingroup - \dosetinitialcolorattribute\c!color + \useinitialcolorparameter\c!color \ctxlua{typesetters.paragraphs.droppers.set { location = "\initialparameter\c!location", enabled = true, @@ -95,7 +95,7 @@ \begingroup \doifelsenothing{\initialparameter\c!style} {\definedfont[\initialparameter\s!font]} - {\initialparameter\c!style}% + {\useinitialstyleparameter\c!style}% \ctxlua{typesetters.paragraphs.droppers.freeze()}% \endgroup \endgroup diff --git a/tex/context/base/typo-prc.lua b/tex/context/base/typo-prc.lua new file mode 100644 index 000000000..bb965ff66 --- /dev/null +++ b/tex/context/base/typo-prc.lua @@ -0,0 +1,126 @@ +if not modules then modules = { } end modules ['typo-prc'] = { + version = 1.001, + comment = "companion to typo-prc.mkiv", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + +-- moved from strc-ini.lua + + +local format = string.format +local lpegmatch, patterns, P, C, Cs = lpeg.match, lpeg.patterns, lpeg.P, lpeg.C, lpeg.Cs + +-- processors: syntax: processor->data ... not ok yet + +typesetters.processors = typesetters.processors or { } +local processors = typesetters.processors + +local trace_processors = false +local report_processors = logs.reporter("processors") +local registered = { } + +trackers.register("typesetters.processors", function(v) trace_processors = v end) + +function processors.register(p) + registered[p] = true +end + +function processors.reset(p) + registered[p] = nil +end + +--~ local splitter = lpeg.splitat("->",true) -- also support => + +local becomes = P('->') +local processor = (1-becomes)^1 +local splitter = C(processor) * becomes * Cs(patterns.argument + patterns.content) + +function processors.split(str) + local p, s = lpegmatch(splitter,str) + if registered[p] then + return p, s + else + return false, str + end +end + +function processors.apply(p,s) + local str = p + if s == nil then + p, s = lpegmatch(splitter,p) + end + if p and registered[p] then + if trace_processors then + report_processors("known: %s, argument: %s",p,s or "") + end + context.applyprocessor(p,s) + elseif s then + if trace_processors then + report_processors("unknown: %s, argument: %s",p or "?",s) + end + context(s) + elseif str then + if trace_processors then + report_processors("direct: %s",str) + end + context(str) + end +end + +function processors.startapply(p,s) + local str = p + if s == nil then + p, s = lpegmatch(splitter,p) + end + if p and registered[p] then + if trace_processors then + report_processors("start: %s",p or "?") + end + context.applyprocessor(p) + context("{") + return s + elseif p then + if trace_processors then + report_processors("start: %s (unknown)",p) + end + context.firstofoneargument() + context("{") + return s + else + if trace_processors then + report_processors("start: ? (unset)") + end + context.firstofoneargument() + context("{") + return str + end +end + +function processors.stopapply() + context("}") + if trace_processors then + report_processors("stop") + end +end + +function processors.tostring(str) + local p, s = lpegmatch(splitter,str) + if registered[p] then + return format("\\applyprocessor{%s}{%s}",p,s) + else + return str + end +end + +function processors.stripped(str) + local p, s = lpegmatch(splitter,str) + return s or str +end + +-- interface + +commands.registerstructureprocessor = processors.register +commands.resetstructureprocessor = processors.reset + diff --git a/tex/context/base/strc-prc.mkiv b/tex/context/base/typo-prc.mkvi index a9bab1c18..3bb743b8b 100644 --- a/tex/context/base/strc-prc.mkiv +++ b/tex/context/base/typo-prc.mkvi @@ -1,5 +1,5 @@ %D \module -%D [ file=strc-prc, +%D [ file=typo-prc, %D version=2008.10.20, %D title=\CONTEXT\ Structure Macros, %D subtitle=Processors, @@ -11,9 +11,9 @@ %C therefore copyrighted by \PRAGMA. See mreadme.pdf for %C details. -\writestatus{loading}{ConTeXt Structure Macros / Processors} +\writestatus{loading}{ConTeXt Typesetting Macros / Processors} -\registerctxluafile{strc-prc}{1.001} +\registerctxluafile{typo-prc}{1.001} \unprotect @@ -44,41 +44,46 @@ %D Valid keys for defining a processor are \type {style}, \type {color}, \type {left}, %D \type {right}, and \type {command} (the given command takes one argument). -\unexpanded\def\defineprocessor - {\dodoubleargument\dodefineprocessor} +\installcommandhandler \??po {processor} \??po -\def\dodefineprocessor[#1][#2]% - {\ifsecondargument - \letbeundefined{\??po#1\c!command}% - \ctxcommand{registerstructureprocessor("#1")}% - \getparameters[\??po#1][\c!style=,\c!color=,\c!left=,\c!right=,#2]% - \else - \letbeundefined{\??po#1\c!style}% - \ctxcommand{resetstructureprocessor("#1")}% - \fi} +\appendtoks + \letvalue{\??po\currentprocessor\s!check}\relax + \ctxcommand{registerstructureprocessor("\currentprocessor")}% global, but it permits using processor that are yet undefined +\to \everydefineprocessor %D The following command can be used by users but normally it will be %D invoked behind the screens. After all, processor prefixes need to -%D be split off first. +%D be split off first. At the \LUA\ end we do check for a processor +%D being registered anyway. -\unexpanded\def\applyprocessor#1% - {\ifcsname\??po#1\c!style\endcsname - \expandafter\dodoapplyprocessor +\unexpanded\def\applyprocessor#tag% + {\def\currentprocessor{#tag}% + \ifcsname\??po\currentprocessor\s!check\endcsname + \expandafter\apply_processor \else - \expandafter\secondoftwoarguments - \fi{#1}} + \expandafter\firstofoneargument + \fi} + +\def\apply_processor + {\doifelse{\processorparameter\c!state}\v!stop + \firstofoneargument + \apply_processor_indeed} -\def\dodoapplyprocessor#1#2% +\def\apply_processor_indeed#content% {\begingroup - \dostartattributes{\??po#1}\c!style\c!color - \csname\??po#1\c!left\endcsname - \ifcsname\??po#1\c!command\endcsname - \csname\??po#1\c!command\endcsname{#2}% - \else - #2% - \fi - \csname\??po#1\c!right\endcsname - \dostopattributes + \useprocessorstyleandcolor\c!style\c!color + \processorparameter\c!left + \processorparameter\c!command{#content}% + \processorparameter\c!right \endgroup} +%D \startbuffer +%D \defineprocessor[first] [style=bold] +%D \defineprocessor[last] [first] [color=red] +%D +%D \applyprocessor{first}{hans} \applyprocessor{last}{hagen} +%D \stopbuffer +%D +%D \typebuffer \start \blank \getbuffer \blanl \stop + \protect \endinput diff --git a/tex/context/base/xtag-exp.mkii b/tex/context/base/xtag-exp.mkii index 60345677d..9ecfcc5b1 100644 --- a/tex/context/base/xtag-exp.mkii +++ b/tex/context/base/xtag-exp.mkii @@ -13,6 +13,8 @@ \writestatus{loading}{ConTeXt XML Macros / Expansion} +\ifnum\texengine=\luatexengine \endinput \fi + \unprotect %D Files diff --git a/tex/context/interface/cont-cs.xml b/tex/context/interface/cont-cs.xml index 0128912b6..bd7dadddf 100644 --- a/tex/context/interface/cont-cs.xml +++ b/tex/context/interface/cont-cs.xml @@ -3275,9 +3275,9 @@ </cd:arguments> </cd:command> - <cd:command name="setupindentations" file="core-des.tex"> + <cd:command name="setupindentedtext" file="strc-des.tex"> <cd:sequence> - <cd:string value="nastavodsazeni"/> + <cd:string value="setupindentedtext"/> </cd:sequence> <cd:arguments> <cd:keywords n="1" optional="yes" list="yes"> @@ -3316,16 +3316,16 @@ </cd:arguments> </cd:command> - <cd:command name="defineindenting" file="core-des.tex"> + <cd:command name="defineindentedtext" file="strc-des.tex"> <cd:sequence> - <cd:string value="definujodsazovani"/> + <cd:string value="defineindentedtext"/> </cd:sequence> <cd:arguments> <cd:keywords n="1"> <cd:constant type="cd:name"/> </cd:keywords> <cd:assignments n="2" list="yes"> - <cd:inherit name="nastavodsazeni" n="2"/> + <cd:inherit name="setupindentedtext" n="2"/> </cd:assignments> </cd:arguments> </cd:command> diff --git a/tex/context/interface/cont-de.xml b/tex/context/interface/cont-de.xml index 00acf3d2a..7b120082e 100644 --- a/tex/context/interface/cont-de.xml +++ b/tex/context/interface/cont-de.xml @@ -3275,9 +3275,9 @@ </cd:arguments> </cd:command> - <cd:command name="setupindentations" file="core-des.tex"> + <cd:command name="setupindentedtext" file="strc-des.tex"> <cd:sequence> - <cd:string value="stelleeinzuegein"/> + <cd:string value="setupindentedtext"/> </cd:sequence> <cd:arguments> <cd:keywords n="1" optional="yes" list="yes"> @@ -3316,16 +3316,16 @@ </cd:arguments> </cd:command> - <cd:command name="defineindenting" file="core-des.tex"> + <cd:command name="defineindentedtext" file="strc-des.tex"> <cd:sequence> - <cd:string value="definiereeinzug"/> + <cd:string value="defineindentedtext"/> </cd:sequence> <cd:arguments> <cd:keywords n="1"> <cd:constant type="cd:name"/> </cd:keywords> <cd:assignments n="2" list="yes"> - <cd:inherit name="stelleeinzuegein" n="2"/> + <cd:inherit name="setupindentedtext" n="2"/> </cd:assignments> </cd:arguments> </cd:command> diff --git a/tex/context/interface/cont-en.xml b/tex/context/interface/cont-en.xml index 0d017867c..a20ac37da 100644 --- a/tex/context/interface/cont-en.xml +++ b/tex/context/interface/cont-en.xml @@ -3275,9 +3275,9 @@ </cd:arguments> </cd:command> - <cd:command name="setupindentations" file="core-des.tex"> + <cd:command name="setupindentedtext" file="strc-des.tex"> <cd:sequence> - <cd:string value="setupindentations"/> + <cd:string value="setupindentedtext"/> </cd:sequence> <cd:arguments> <cd:keywords n="1" optional="yes" list="yes"> @@ -3316,16 +3316,16 @@ </cd:arguments> </cd:command> - <cd:command name="defineindenting" file="core-des.tex"> + <cd:command name="defineindentedtext" file="strc-des.tex"> <cd:sequence> - <cd:string value="defineindenting"/> + <cd:string value="defineindentedtext"/> </cd:sequence> <cd:arguments> <cd:keywords n="1"> <cd:constant type="cd:name"/> </cd:keywords> <cd:assignments n="2" list="yes"> - <cd:inherit name="setupindentations" n="2"/> + <cd:inherit name="setupindentedtext" n="2"/> </cd:assignments> </cd:arguments> </cd:command> diff --git a/tex/context/interface/cont-fr.xml b/tex/context/interface/cont-fr.xml index 195a9a603..bfb5c82f4 100644 --- a/tex/context/interface/cont-fr.xml +++ b/tex/context/interface/cont-fr.xml @@ -3275,9 +3275,9 @@ </cd:arguments> </cd:command> - <cd:command name="setupindentations" file="core-des.tex"> + <cd:command name="setupindentedtext" file="strc-des.tex"> <cd:sequence> - <cd:string value="reglealineas"/> + <cd:string value="setupindentedtext"/> </cd:sequence> <cd:arguments> <cd:keywords n="1" optional="yes" list="yes"> @@ -3316,16 +3316,16 @@ </cd:arguments> </cd:command> - <cd:command name="defineindenting" file="core-des.tex"> + <cd:command name="defineindentedtext" file="strc-des.tex"> <cd:sequence> - <cd:string value="definitcompoalinea"/> + <cd:string value="defineindentedtext"/> </cd:sequence> <cd:arguments> <cd:keywords n="1"> <cd:constant type="cd:name"/> </cd:keywords> <cd:assignments n="2" list="yes"> - <cd:inherit name="reglealineas" n="2"/> + <cd:inherit name="setupindentedtext" n="2"/> </cd:assignments> </cd:arguments> </cd:command> diff --git a/tex/context/interface/cont-it.xml b/tex/context/interface/cont-it.xml index 315cf2023..2ede93e69 100644 --- a/tex/context/interface/cont-it.xml +++ b/tex/context/interface/cont-it.xml @@ -3275,9 +3275,9 @@ </cd:arguments> </cd:command> - <cd:command name="setupindentations" file="core-des.tex"> + <cd:command name="setupindentedtext" file="strc-des.tex"> <cd:sequence> - <cd:string value="impostarientri"/> + <cd:string value="setupindentedtext"/> </cd:sequence> <cd:arguments> <cd:keywords n="1" optional="yes" list="yes"> @@ -3316,16 +3316,16 @@ </cd:arguments> </cd:command> - <cd:command name="defineindenting" file="core-des.tex"> + <cd:command name="defineindentedtext" file="strc-des.tex"> <cd:sequence> - <cd:string value="definiscirientro"/> + <cd:string value="defineindentedtext"/> </cd:sequence> <cd:arguments> <cd:keywords n="1"> <cd:constant type="cd:name"/> </cd:keywords> <cd:assignments n="2" list="yes"> - <cd:inherit name="impostarientri" n="2"/> + <cd:inherit name="setupindentedtext" n="2"/> </cd:assignments> </cd:arguments> </cd:command> diff --git a/tex/context/interface/cont-nl.xml b/tex/context/interface/cont-nl.xml index 6be62c459..f60efa79e 100644 --- a/tex/context/interface/cont-nl.xml +++ b/tex/context/interface/cont-nl.xml @@ -3275,9 +3275,9 @@ </cd:arguments> </cd:command> - <cd:command name="setupindentations" file="core-des.tex"> + <cd:command name="setupindentedtext" file="strc-des.tex"> <cd:sequence> - <cd:string value="steldoorspringenin"/> + <cd:string value="stelingesprongentextin"/> </cd:sequence> <cd:arguments> <cd:keywords n="1" optional="yes" list="yes"> @@ -3316,16 +3316,16 @@ </cd:arguments> </cd:command> - <cd:command name="defineindenting" file="core-des.tex"> + <cd:command name="defineindentedtext" file="strc-des.tex"> <cd:sequence> - <cd:string value="doorspringen"/> + <cd:string value="definieeringesprongentext"/> </cd:sequence> <cd:arguments> <cd:keywords n="1"> <cd:constant type="cd:name"/> </cd:keywords> <cd:assignments n="2" list="yes"> - <cd:inherit name="steldoorspringenin" n="2"/> + <cd:inherit name="stelingesprongentextin" n="2"/> </cd:assignments> </cd:arguments> </cd:command> diff --git a/tex/context/interface/cont-pe.xml b/tex/context/interface/cont-pe.xml index d138017db..b4e221171 100644 --- a/tex/context/interface/cont-pe.xml +++ b/tex/context/interface/cont-pe.xml @@ -3275,9 +3275,9 @@ </cd:arguments> </cd:command> - <cd:command name="setupindentations" file="core-des.tex"> + <cd:command name="setupindentedtext" file="strc-des.tex"> <cd:sequence> - <cd:string value="بارگذاریتورفتگیها"/> + <cd:string value="setupindentedtext"/> </cd:sequence> <cd:arguments> <cd:keywords n="1" optional="yes" list="yes"> @@ -3316,16 +3316,16 @@ </cd:arguments> </cd:command> - <cd:command name="defineindenting" file="core-des.tex"> + <cd:command name="defineindentedtext" file="strc-des.tex"> <cd:sequence> - <cd:string value="تعریفتورفتگی"/> + <cd:string value="defineindentedtext"/> </cd:sequence> <cd:arguments> <cd:keywords n="1"> <cd:constant type="cd:name"/> </cd:keywords> <cd:assignments n="2" list="yes"> - <cd:inherit name="بارگذاریتورفتگیها" n="2"/> + <cd:inherit name="setupindentedtext" n="2"/> </cd:assignments> </cd:arguments> </cd:command> diff --git a/tex/context/interface/cont-ro.xml b/tex/context/interface/cont-ro.xml index daaac6183..1dbc8fb85 100644 --- a/tex/context/interface/cont-ro.xml +++ b/tex/context/interface/cont-ro.xml @@ -3275,9 +3275,9 @@ </cd:arguments> </cd:command> - <cd:command name="setupindentations" file="core-des.tex"> + <cd:command name="setupindentedtext" file="strc-des.tex"> <cd:sequence> - <cd:string value="seteazaaliniate"/> + <cd:string value="setupindentedtext"/> </cd:sequence> <cd:arguments> <cd:keywords n="1" optional="yes" list="yes"> @@ -3316,16 +3316,16 @@ </cd:arguments> </cd:command> - <cd:command name="defineindenting" file="core-des.tex"> + <cd:command name="defineindentedtext" file="strc-des.tex"> <cd:sequence> - <cd:string value="definestealiat"/> + <cd:string value="defineindentedtext"/> </cd:sequence> <cd:arguments> <cd:keywords n="1"> <cd:constant type="cd:name"/> </cd:keywords> <cd:assignments n="2" list="yes"> - <cd:inherit name="seteazaaliniate" n="2"/> + <cd:inherit name="setupindentedtext" n="2"/> </cd:assignments> </cd:arguments> </cd:command> diff --git a/tex/context/interface/keys-cs.xml b/tex/context/interface/keys-cs.xml index 8d16ac92c..9a8c04170 100644 --- a/tex/context/interface/keys-cs.xml +++ b/tex/context/interface/keys-cs.xml @@ -1178,7 +1178,7 @@ <cd:command name='defineframedtext' value='definujoramovanytext'/> <cd:command name='definehbox' value='definujhbox'/> <cd:command name='definehead' value='definujnadpis'/> - <cd:command name='defineindenting' value='definujodsazovani'/> + <cd:command name='defineindentedtext' value='defineindentedtext'/> <cd:command name='defineinmargin' value='defineinmargin'/> <cd:command name='defineinteractionmenu' value='definujinterakcnimenu'/> <cd:command name='defineitemgroup' value='defineitemgroup'/> @@ -1489,7 +1489,7 @@ <cd:command name='setupheads' value='nastavnadpisy'/> <cd:command name='setupheadtext' value='nastavtexthlavicky'/> <cd:command name='setuphyphenmark' value='nastavdelitko'/> - <cd:command name='setupindentations' value='nastavodsazeni'/> + <cd:command name='setupindentedtext' value='setupindentedtext'/> <cd:command name='setupindenting' value='nastavodsazovani'/> <cd:command name='setupinmargin' value='nastavmarginalie'/> <cd:command name='setupinteraction' value='nastavinterakci'/> diff --git a/tex/context/interface/keys-de.xml b/tex/context/interface/keys-de.xml index d07188d44..17afd73d0 100644 --- a/tex/context/interface/keys-de.xml +++ b/tex/context/interface/keys-de.xml @@ -1178,7 +1178,7 @@ <cd:command name='defineframedtext' value='definiereumrahmtertext'/> <cd:command name='definehbox' value='definierehbox'/> <cd:command name='definehead' value='definiereueberschrift'/> - <cd:command name='defineindenting' value='definiereeinzug'/> + <cd:command name='defineindentedtext' value='defineindentedtext'/> <cd:command name='defineinmargin' value='defineinmargin'/> <cd:command name='defineinteractionmenu' value='definiereinteraktionsmenue'/> <cd:command name='defineitemgroup' value='defineitemgroup'/> @@ -1489,7 +1489,7 @@ <cd:command name='setupheads' value='stelleueberschriftenein'/> <cd:command name='setupheadtext' value='stelleueberschrifttextein'/> <cd:command name='setuphyphenmark' value='stellebindestrichein'/> - <cd:command name='setupindentations' value='stelleeinzuegein'/> + <cd:command name='setupindentedtext' value='setupindentedtext'/> <cd:command name='setupindenting' value='stelleeinziehenein'/> <cd:command name='setupinmargin' value='stelleinmarginalieein'/> <cd:command name='setupinteraction' value='stelleinteraktionein'/> diff --git a/tex/context/interface/keys-en.xml b/tex/context/interface/keys-en.xml index ea942caf1..f256cf061 100644 --- a/tex/context/interface/keys-en.xml +++ b/tex/context/interface/keys-en.xml @@ -1178,7 +1178,7 @@ <cd:command name='defineframedtext' value='defineframedtext'/> <cd:command name='definehbox' value='definehbox'/> <cd:command name='definehead' value='definehead'/> - <cd:command name='defineindenting' value='defineindenting'/> + <cd:command name='defineindentedtext' value='defineindentedtext'/> <cd:command name='defineinmargin' value='defineinmargin'/> <cd:command name='defineinteractionmenu' value='defineinteractionmenu'/> <cd:command name='defineitemgroup' value='defineitemgroup'/> @@ -1489,7 +1489,7 @@ <cd:command name='setupheads' value='setupheads'/> <cd:command name='setupheadtext' value='setupheadtext'/> <cd:command name='setuphyphenmark' value='setuphyphenmark'/> - <cd:command name='setupindentations' value='setupindentations'/> + <cd:command name='setupindentedtext' value='setupindentedtext'/> <cd:command name='setupindenting' value='setupindenting'/> <cd:command name='setupinmargin' value='setupinmargin'/> <cd:command name='setupinteraction' value='setupinteraction'/> diff --git a/tex/context/interface/keys-fr.xml b/tex/context/interface/keys-fr.xml index b2f025ea8..02e8a1acf 100644 --- a/tex/context/interface/keys-fr.xml +++ b/tex/context/interface/keys-fr.xml @@ -1178,7 +1178,7 @@ <cd:command name='defineframedtext' value='defineframedtext'/> <cd:command name='definehbox' value='definithbox'/> <cd:command name='definehead' value='definittete'/> - <cd:command name='defineindenting' value='definitcompoalinea'/> + <cd:command name='defineindentedtext' value='defineindentedtext'/> <cd:command name='defineinmargin' value='definitdansmarge'/> <cd:command name='defineinteractionmenu' value='definitmenuinteraction'/> <cd:command name='defineitemgroup' value='defineitemgroup'/> @@ -1489,7 +1489,7 @@ <cd:command name='setupheads' value='regletetes'/> <cd:command name='setupheadtext' value='regletextetete'/> <cd:command name='setuphyphenmark' value='reglemarquagehyphenation'/> - <cd:command name='setupindentations' value='reglealineas'/> + <cd:command name='setupindentedtext' value='setupindentedtext'/> <cd:command name='setupindenting' value='reglecomposeenalinea'/> <cd:command name='setupinmargin' value='regledansmarge'/> <cd:command name='setupinteraction' value='regleinteraction'/> diff --git a/tex/context/interface/keys-it.xml b/tex/context/interface/keys-it.xml index 20b8670d0..7e5108f5c 100644 --- a/tex/context/interface/keys-it.xml +++ b/tex/context/interface/keys-it.xml @@ -1178,7 +1178,7 @@ <cd:command name='defineframedtext' value='definiscitestoincorniciato'/> <cd:command name='definehbox' value='definiscihbox'/> <cd:command name='definehead' value='definiscitesta'/> - <cd:command name='defineindenting' value='definiscirientro'/> + <cd:command name='defineindentedtext' value='defineindentedtext'/> <cd:command name='defineinmargin' value='defineinmargin'/> <cd:command name='defineinteractionmenu' value='definiscimenuinterazione'/> <cd:command name='defineitemgroup' value='defineitemgroup'/> @@ -1489,7 +1489,7 @@ <cd:command name='setupheads' value='impostateste'/> <cd:command name='setupheadtext' value='impostatestointestazioni'/> <cd:command name='setuphyphenmark' value='impostasegnosillabazione'/> - <cd:command name='setupindentations' value='impostarientri'/> + <cd:command name='setupindentedtext' value='setupindentedtext'/> <cd:command name='setupindenting' value='impostarientro'/> <cd:command name='setupinmargin' value='impostainmargine'/> <cd:command name='setupinteraction' value='impostainterazione'/> diff --git a/tex/context/interface/keys-nl.xml b/tex/context/interface/keys-nl.xml index c78377078..896d30984 100644 --- a/tex/context/interface/keys-nl.xml +++ b/tex/context/interface/keys-nl.xml @@ -1178,7 +1178,7 @@ <cd:command name='defineframedtext' value='definieerkadertekst'/> <cd:command name='definehbox' value='definieerhbox'/> <cd:command name='definehead' value='definieerkop'/> - <cd:command name='defineindenting' value='doorspringen'/> + <cd:command name='defineindentedtext' value='definieeringesprongentext'/> <cd:command name='defineinmargin' value='definieerinmarge'/> <cd:command name='defineinteractionmenu' value='definieerinteractiemenu'/> <cd:command name='defineitemgroup' value='definieeritemgroep'/> @@ -1489,7 +1489,7 @@ <cd:command name='setupheads' value='stelkoppenin'/> <cd:command name='setupheadtext' value='stelkoptekstin'/> <cd:command name='setuphyphenmark' value='stelkoppeltekenin'/> - <cd:command name='setupindentations' value='steldoorspringenin'/> + <cd:command name='setupindentedtext' value='stelingesprongentextin'/> <cd:command name='setupindenting' value='stelinspringenin'/> <cd:command name='setupinmargin' value='stelinmargein'/> <cd:command name='setupinteraction' value='stelinteractiein'/> diff --git a/tex/context/interface/keys-pe.xml b/tex/context/interface/keys-pe.xml index 88b4f56ae..af0e47992 100644 --- a/tex/context/interface/keys-pe.xml +++ b/tex/context/interface/keys-pe.xml @@ -1178,7 +1178,7 @@ <cd:command name='defineframedtext' value='تعریفمتنقالبی'/> <cd:command name='definehbox' value='تعریفجعبهافقی'/> <cd:command name='definehead' value='تعریفسر'/> - <cd:command name='defineindenting' value='تعریفتورفتگی'/> + <cd:command name='defineindentedtext' value='defineindentedtext'/> <cd:command name='defineinmargin' value='تعریفدرونحاشیه'/> <cd:command name='defineinteractionmenu' value='تعریفمنویپانل'/> <cd:command name='defineitemgroup' value='تعریفگروهآیتم'/> @@ -1489,7 +1489,7 @@ <cd:command name='setupheads' value='بارگذاریسرها'/> <cd:command name='setupheadtext' value='بارگذاریمتنسر'/> <cd:command name='setuphyphenmark' value='بارگذارینشانهشکستن'/> - <cd:command name='setupindentations' value='بارگذاریتورفتگیها'/> + <cd:command name='setupindentedtext' value='setupindentedtext'/> <cd:command name='setupindenting' value='بارگذاریتورفتگی'/> <cd:command name='setupinmargin' value='بارگذاریدرونحاشیه'/> <cd:command name='setupinteraction' value='بارگذاریپانل'/> diff --git a/tex/context/interface/keys-ro.xml b/tex/context/interface/keys-ro.xml index c4061a5c4..a4cb10529 100644 --- a/tex/context/interface/keys-ro.xml +++ b/tex/context/interface/keys-ro.xml @@ -1178,7 +1178,7 @@ <cd:command name='defineframedtext' value='definestetextinconjurat'/> <cd:command name='definehbox' value='definestehbox'/> <cd:command name='definehead' value='definesteantet'/> - <cd:command name='defineindenting' value='definestealiat'/> + <cd:command name='defineindentedtext' value='defineindentedtext'/> <cd:command name='defineinmargin' value='defineinmargin'/> <cd:command name='defineinteractionmenu' value='definestemeniuinteractiune'/> <cd:command name='defineitemgroup' value='defineitemgroup'/> @@ -1489,7 +1489,7 @@ <cd:command name='setupheads' value='seteazatitluri'/> <cd:command name='setupheadtext' value='seteazatexttitlu'/> <cd:command name='setuphyphenmark' value='seteazaliniesilabe'/> - <cd:command name='setupindentations' value='seteazaaliniate'/> + <cd:command name='setupindentedtext' value='setupindentedtext'/> <cd:command name='setupindenting' value='seteazaaliniat'/> <cd:command name='setupinmargin' value='seteazamarginal'/> <cd:command name='setupinteraction' value='seteazainteractiunea'/> diff --git a/tex/generic/context/luatex/luatex-fonts-merged.lua b/tex/generic/context/luatex/luatex-fonts-merged.lua index 5686a4177..1783ecfbb 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 : 11/29/11 23:11:46 +-- merge date : 12/13/11 15:17:15 do -- begin closure to overcome local limits and interference @@ -1697,7 +1697,7 @@ end -- For the moment here, but it might move to utilities. Beware, we need to -- have the longest keyword first, so 'aaa' comes beforte 'aa' which is why we --- loop back from the end. +-- loop back from the end cq. prepend. local sort, fastcopy, sortedkeys = table.sort, table.fastcopy, table.sortedkeys -- dependency! @@ -1717,13 +1717,13 @@ function lpeg.append(list,pp,delayed,checked) elseif delayed then -- hm, it looks like the lpeg parser resolves anyway local keys = sortedkeys(list) if p then - for i=#keys,1,-1 do + for i=1,#keys,1 do local k = keys[i] local v = list[k] p = P(k)/list + p end else - for i=#keys,1,-1 do + for i=1,#keys do local k = keys[i] local v = list[k] if p then @@ -1739,7 +1739,7 @@ function lpeg.append(list,pp,delayed,checked) elseif checked then -- problem: substitution gives a capture local keys = sortedkeys(list) - for i=#keys,1,-1 do + for i=1,#keys do local k = keys[i] local v = list[k] if p then @@ -1758,7 +1758,7 @@ function lpeg.append(list,pp,delayed,checked) end else local keys = sortedkeys(list) - for i=#keys,1,-1 do + for i=1,#keys do local k = keys[i] local v = list[k] if p then @@ -1771,6 +1771,9 @@ function lpeg.append(list,pp,delayed,checked) return p end +-- inspect(lpeg.append({ a = "1", aa = "1", aaa = "1" } ,nil,true)) +-- inspect(lpeg.append({ ["degree celsius"] = "1", celsius = "1", degree = "1" } ,nil,true)) + -- function lpeg.exact_match(words,case_insensitive) -- local pattern = concat(words) -- if case_insensitive then @@ -2175,7 +2178,7 @@ end --~ variant. After some skyping we got it sort of compatible with the old --~ one. After that the anchoring to currentdir was added in a better way. --~ Of course there are some optimizations too. Finally we had to deal with ---~ windows drive prefixes and thinsg like sys://. +--~ windows drive prefixes and things like sys://. function file.collapsepath(str,anchor) if anchor and not find(str,"^/") and not find(str,"^%a:") then @@ -2203,7 +2206,7 @@ function file.collapsepath(str,anchor) if element == '.' then -- do nothing elseif element == '..' then - local n = i -1 + local n = i - 1 while n > 0 do local element = oldelements[n] if element ~= '..' and element ~= '.' then @@ -6330,6 +6333,20 @@ local g_directions = { gpos_reversecontextchain = -1, } +-- Research by Khaled Hosny has demonstrated that the font loader merges +-- regular and AAT features and that these can interfere (especially because +-- we dropped checking for valid features elsewhere. So, we just check for +-- the special flag and drop the feature if such a tag is found. + +local function supported(features) + for i=1,#features do + if features[i].ismac then + return false + end + end + return true +end + actions["reorganize subtables"] = function(data,filename,raw) local resources = data.resources local sequences = { } @@ -6342,69 +6359,72 @@ actions["reorganize subtables"] = function(data,filename,raw) if dw then for k=1,#dw do local gk = dw[k] - local typ = gk.type - local chain = g_directions[typ] or 0 - local subtables = gk.subtables - if subtables then - local t = { } - for s=1,#subtables do - t[s] = subtables[s].name - end - subtables = t - end - local flags, markclass = gk.flags, nil - if flags then - local t = { -- forcing false packs nicer - (flags.ignorecombiningmarks and "mark") or false, - (flags.ignoreligatures and "ligature") or false, - (flags.ignorebaseglyphs and "base") or false, - flags.r2l or false, - } - markclass = flags.mark_class - if markclass then - markclass = resources.markclasses[markclass] - end - flags = t - end - -- - local name = gk.name - -- local features = gk.features - if features then - -- scripts, tag, ismac - local f = { } - for i=1,#features do - local df = features[i] - local tag = strip(lower(df.tag)) - local ft = f[tag] if not ft then ft = {} f[tag] = ft end - local dscripts = df.scripts - for i=1,#dscripts do - local d = dscripts[i] - local languages = d.langs - local script = strip(lower(d.script)) - local fts = ft[script] if not fts then fts = {} ft[script] = fts end - for i=1,#languages do - fts[strip(lower(languages[i]))] = true + if features and supported(features) then + local typ = gk.type + local chain = g_directions[typ] or 0 + local subtables = gk.subtables + if subtables then + local t = { } + for s=1,#subtables do + t[s] = subtables[s].name + end + subtables = t + end + local flags, markclass = gk.flags, nil + if flags then + local t = { -- forcing false packs nicer + (flags.ignorecombiningmarks and "mark") or false, + (flags.ignoreligatures and "ligature") or false, + (flags.ignorebaseglyphs and "base") or false, + flags.r2l or false, + } + markclass = flags.mark_class + if markclass then + markclass = resources.markclasses[markclass] + end + flags = t + end + -- + local name = gk.name + -- + local features = gk.features + if features then + -- scripts, tag, ismac + local f = { } + for i=1,#features do + local df = features[i] + local tag = strip(lower(df.tag)) + local ft = f[tag] if not ft then ft = {} f[tag] = ft end + local dscripts = df.scripts + for i=1,#dscripts do + local d = dscripts[i] + local languages = d.langs + local script = strip(lower(d.script)) + local fts = ft[script] if not fts then fts = {} ft[script] = fts end + for i=1,#languages do + fts[strip(lower(languages[i]))] = true + end end end + sequences[#sequences+1] = { + type = typ, + chain = chain, + flags = flags, + name = name, + subtables = subtables, + markclass = markclass, + features = f, + } + else + lookups[name] = { + type = typ, + chain = chain, + flags = flags, + subtables = subtables, + markclass = markclass, + } end - sequences[#sequences+1] = { - type = typ, - chain = chain, - flags = flags, - name = name, - subtables = subtables, - markclass = markclass, - features = f, - } - else - lookups[name] = { - type = typ, - chain = chain, - flags = flags, - subtables = subtables, - markclass = markclass, - } end end end |