diff options
25 files changed, 529 insertions, 286 deletions
diff --git a/tex/context/base/context-version.pdf b/tex/context/base/context-version.pdf Binary files differindex 6158e4aee..f9ca424c5 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 1b1cacf07..9d7298d86 100644 --- a/tex/context/base/context-version.png +++ b/tex/context/base/context-version.png diff --git a/tex/context/base/context.mkiv b/tex/context/base/context.mkiv index 279920315..847b6d460 100644 --- a/tex/context/base/context.mkiv +++ b/tex/context/base/context.mkiv @@ -23,7 +23,7 @@ %D up and the dependencies are more consistent. \edef\contextformat {\jobname} -\edef\contextversion{2012.06.26 10:59} +\edef\contextversion{2012.06.27 14:37} %D For those who want to use this: @@ -150,12 +150,12 @@ \loadmarkfile{supp-box} %loadmarkfile{supp-vis} % replaced by trac-vis -\loadmarkfile{supp-fun} % close to obsolete +%loadmarkfile{supp-fun} % mostly replaced \loadmarkfile{supp-ran} \loadmarkfile{supp-mat} \loadmarkfile{spac-cha} -\loadmarkfile{supp-num} % replaced +%loadmarkfile{supp-num} % obsolete \loadmarkfile{typo-ini} @@ -349,6 +349,7 @@ \loadmarkfile{font-uni} \loadmkvifile{font-col} \loadmkvifile{font-gds} +\loadmkvifile{font-aux} \loadmarkfile{lxml-css} diff --git a/tex/context/base/core-var.mkiv b/tex/context/base/core-var.mkiv index 26559f246..854c07867 100644 --- a/tex/context/base/core-var.mkiv +++ b/tex/context/base/core-var.mkiv @@ -59,8 +59,12 @@ \newtoks \everyforgetall \newtoks \everycleanupfeatures -\def\cleanupfeatures{\the\everycleanupfeatures} -\def\forgetall {\the\everyforgetall} +\unexpanded\def\cleanupfeatures{\the\everycleanupfeatures} +\unexpanded\def\forgetall {\the\everyforgetall} + +\appendtoks + \everypar\emptytoks % pretty important +\to \everyforgetall %D Page building: diff --git a/tex/context/base/font-aux.mkvi b/tex/context/base/font-aux.mkvi new file mode 100644 index 000000000..50cc4a258 --- /dev/null +++ b/tex/context/base/font-aux.mkvi @@ -0,0 +1,101 @@ +%D \module +%D [ file=font-gds, +%D version=2012.06.26, +%D title=\CONTEXT\ Font Support, +%D subtitle=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 Font Support / Helpers} + +%D Here we collect code moved from other files, like some of the +%D support modules. + +\unprotect + +%D \macros +%D {normalizefontheight,normalizefontwidth,normalizedfontsize} +%D +%D Next we introduce some font manipulation macros. When we +%D want to typeset some text spread in a well defined area, it +%D can be considered bad practice to manipulate character and +%D word spacing. In such situations the next few macros can be +%D of help: +%D +%D \starttyping +%D \normalizefontheight \name {sample text} {height} {font} +%D \normalizefontwidth \name {sample text} {width} {font} +%D \stoptyping +%D +%D Consider for instance: +%D +%D \startbuffer[a] +%D \NormalizeFontHeight \TempFont {X} {2\baselineskip} {Serif} +%D \stopbuffer +%D +%D \startbuffer[b] +%D \ruledhbox{\TempFont To Be Or Not To Be} +%D \stopbuffer +%D +%D \typebuffer[a,b] \getbuffer[a] +%D +%D This shows up as: +%D +%D \startlinecorrection +%D \ruledhbox{\getbuffer[b]} +%D \stoplinecorrection +%D +%D The horizontal counterpart is: +%D +%D \startbuffer[a] +%D \NormalizeFontWidth \TempFont {This Line Fits} {\hsize} {Serif} +%D \stopbuffer +%D +%D \startbuffer[b] +%D \ruledhbox{\TempFont This Line Fits} +%D \stopbuffer +%D +%D \typebuffer[a,b] \getbuffer[a] +%D +%D This gives: +%D +%D \startlinecorrection +%D \ruledhbox{\getbuffer[b]} +%D \stoplinecorrection +%D +%D The calculated font scale is avaliable in \type {\normalizedfontsize}. + +\unexpanded\def\font_helpers_normalize_size#what#cs#text#width#specification% + {\bgroup + \setbox\scratchbox\hbox{\definedfont[#specification at 10pt]#text}% + \normalexpanded{\egroup\edef\noexpand\normalizedfontsize + {\the\dimexpr\ifdim\wd\scratchbox>\zeropoint + \luaexpr{\number\dimexpr10pt\relax*\number\dimexpr#width\relax/\number#what\scratchbox}\scaledpoint + \else + \bodyfontsize + \fi\relax}}% + \definefont[\strippedcsname#cs][#specification at \normalizedfontsize]} + +\def\NormalizedFontSize{\bodyfontsize} + +\unexpanded\def\normalizefontwidth {\font_helpers_normalize_size\wd} +\unexpanded\def\normalizefontheight{\font_helpers_normalize_size\ht} +\unexpanded\def\normalizefontdepth {\font_helpers_normalize_size\dp} +\unexpanded\def\normalizefontline {\font_helpers_normalize_size\htdp} + +\unexpanded\def\widthspanningtext #text#width#specification{\hbox{\normalizefontwidth \temp{#text}{#width}{#specification}\temp#text}} +\unexpanded\def\heightspanningtext#text#width#specification{\hbox{\normalizefontheight\temp{#text}{#width}{#specification}\temp#text}} +\unexpanded\def\depthspanningtext #text#width#specification{\hbox{\normalizefontdepth \temp{#text}{#width}{#specification}\temp#text}} +\unexpanded\def\linespanningtext #text#width#specification{\hbox{\normalizefontline \temp{#text}{#width}{#specification}\temp#text}} + +\let\NormalizeFontHeight \normalizefontheight +\let\NormalizeFontWidth \normalizefontwidth +\let\WidthSpanningText \widthspanningtext +\def\TheNormalizedFontSize{\normalizefontsize} + +\protect \endinput diff --git a/tex/context/base/font-pre.mkiv b/tex/context/base/font-pre.mkiv index e5999df14..8288ef412 100644 --- a/tex/context/base/font-pre.mkiv +++ b/tex/context/base/font-pre.mkiv @@ -178,6 +178,7 @@ \definecolor[trace:m][m=.75,t=.5,a=1] \definecolor[trace:y][y=.75,t=.5,a=1] \definecolor[trace:s][s=.75,t=.5,a=1] +\definecolor[trace:o][r=1,g=.6,b=.1,t=.5,a=1] \definecolor[trace:dr][r=.75,t=.75,a=1] \definecolor[trace:dg][g=.75,t=.75,a=1] @@ -186,6 +187,7 @@ \definecolor[trace:dm][m=.75,t=.75,a=1] \definecolor[trace:dy][y=.75,t=.75,a=1] \definecolor[trace:ds][s=.75,t=.75,a=1] +\definecolor[trace:do][r=1,g=.6,b=.1,t=.75,a=1] %D Now we're up to some definitions. diff --git a/tex/context/base/font-set.mkvi b/tex/context/base/font-set.mkvi index 8e4044267..c5450a152 100644 --- a/tex/context/base/font-set.mkvi +++ b/tex/context/base/font-set.mkvi @@ -121,7 +121,7 @@ \unexpanded\def\font_preloads_fourth_stage {\begingroup %ifzeropt\fontcharwd\font\number`!\relax - \setbox\scratchbox\hbox{context}% + \setbox\scratchbox\hbox{checking fonts}% \ifzeropt\wd\scratchbox \writeline \writestatus\m!fonts{!! No bodyfont has been defined and no defaults have been}% diff --git a/tex/context/base/grph-epd.mkiv b/tex/context/base/grph-epd.mkiv index 26c07e731..f8e7461c2 100644 --- a/tex/context/base/grph-epd.mkiv +++ b/tex/context/base/grph-epd.mkiv @@ -22,7 +22,7 @@ \defineoverlay[system:graphics:epdf][\directsetup{system:graphics:epdf}] \startsetups system:graphics:epdf - \ctxlua{figures.mergegoodies("\externalfigureparameter\c!interaction")}% + \ctxlua{figures.mergegoodies("\externalfiguresparameter\c!interaction")}% \reference[\figurereference]{}% todo: dest area \stopsetups @@ -39,7 +39,7 @@ \appendtoks \iflocation - \doif\figurefiletype{pdf}{\doifnot{\externalfigureparameter\c!interaction}\v!none\grph_epdf_add_overlay}% + \doif\figurefiletype{pdf}{\doifnot{\externalfiguresparameter\c!interaction}\v!none\grph_epdf_add_overlay}% \fi \to \externalfigurepostprocessors diff --git a/tex/context/base/lpdf-ren.lua b/tex/context/base/lpdf-ren.lua index 29b78313f..6ffdf8110 100644 --- a/tex/context/base/lpdf-ren.lua +++ b/tex/context/base/lpdf-ren.lua @@ -108,6 +108,7 @@ end local pdfln, pdfld = { }, { } local textlayers, hidelayers, videlayers = pdfarray(), pdfarray(), pdfarray() local pagelayers, pagelayersreference, cache = nil, nil, { } +local alphabetic = { } local specifications = { } local initialized = { } @@ -152,6 +153,7 @@ local function useviewerlayer(name) -- move up so that we can use it as local cache[#cache+1] = { dn, dd } pdfld[tag] = dr textlayers[#textlayers+1] = nr + alphabetic[tag] = nr if specification.visible == v_start then videlayers[#videlayers+1] = nr else @@ -188,11 +190,16 @@ local function flushtextlayers() pdfflushobject(ci[1],ci[2]) end if textlayers and #textlayers > 0 then -- we can group them if needed, like: layout + local sortedlayers = { } + for k, v in table.sortedhash(alphabetic) do + sortedlayers[#sortedlayers+1] = v -- maybe do a proper numeric sort as well + end local d = pdfdictionary { OCGs = textlayers, D = pdfdictionary { Name = "Document", - Order = (viewerlayers.hasorder and textlayers) or nil, + -- Order = (viewerlayers.hasorder and textlayers) or nil, + Order = (viewerlayers.hasorder and sortedlayers) or nil, ON = videlayers, OFF = hidelayers, BaseState = pdf_on, diff --git a/tex/context/base/supp-fun.mkiv b/tex/context/base/m-oldfun.mkiv index 33bee0306..1c5a1d29d 100644 --- a/tex/context/base/supp-fun.mkiv +++ b/tex/context/base/m-oldfun.mkiv @@ -1,5 +1,5 @@ %D \module -%D [ file=supp-fun, +%D [ file=m-oldfun, % was: supp-fun %D version=1995.10.10, %D title=\CONTEXT\ Support Macros, %D subtitle=Fun Stuff, @@ -119,7 +119,7 @@ \let\globaldropcaps\global % will be an option, but on by default -\def\localdropcaps{\let\globaldropcaps\relax} +\unexpanded\def\localdropcaps{\let\globaldropcaps\relax} \chardef\DroppedStatus = 0 % 0=done 1=starting 2=doing 3=error \chardef\DropMode = 0 % 1 == marginhang @@ -128,7 +128,7 @@ \let\keeplinestogether\gobbleoneargument \fi -\def\DroppedCaps#1#2#3#4#5#6#7% does not yet handle accented chars +\unexpanded\def\DroppedCaps#1#2#3#4#5#6#7% does not yet handle accented chars {\defconvertedargument\asciia{#7}% \defconvertedcommand \asciib{\DroppedString}% \doifinstringelse\asciia\asciib @@ -222,10 +222,10 @@ \newcount\lastprevgraf \newcount\droppedlines -\def\CheckDroppedCaps +\unexpanded\def\CheckDroppedCaps {\global\lastprevgraf\prevgraf} -\def\AutoDroppedCaps % will be proper core stuff since it +\unexpanded\def\AutoDroppedCaps % will be proper core stuff since it {\globaldropcaps\chardef\DroppedStatus\plusone \global\lastprevgraf\zerocount \global\droppedlines\zerocount @@ -234,10 +234,10 @@ \let\AutoDroppedNext\relax \ifx\AutoDroppedCapsCommand\undefined - \def\AutoDroppedCapsCommand{\NiceDroppedCaps{}{SerifBold}{.125em}{3}} + \unexpanded\def\AutoDroppedCapsCommand{\NiceDroppedCaps{}{SerifBold}{.125em}{3}} \fi -\def\doAutoDroppedCaps +\unexpanded\def\doAutoDroppedCaps {\ifcase\DroppedStatus % done \let\next\relax \or % starting @@ -287,7 +287,7 @@ %D the second command scales the font to a nice 2.5 times the %D line height, a value that gives a pleasant grayness. -\def\DoLineDroppedCaps#1#2#3#4#5% compensation command font offset lines +\unexpanded\def\DoLineDroppedCaps#1#2#3#4#5% compensation command font offset lines {\scratchcounter#5% \advance\scratchcounter \minusone \scratchdimen\scratchcounter\baselineskip @@ -296,10 +296,10 @@ \DroppedCaps{#2}{#3}\TheNormalizedFontSize{#4} {\scratchcounter\baselineskip}{#5}} -\def\LineDroppedCaps% command font offset lines +\unexpanded\def\LineDroppedCaps% command font offset lines {\DoLineDroppedCaps{\strutht}} -\def\NiceDroppedCaps% command font offset lines +\unexpanded\def\NiceDroppedCaps% command font offset lines {\DoLineDroppedCaps{.5\baselineskip}} %D \macros @@ -337,7 +337,7 @@ %D with that. A workaround is rather trivial but obscures the %D principles used. -\def\TreatFirstLine#1#2#3#4% before, after, first, next +\unexpanded\def\TreatFirstLine#1#2#3#4% before, after, first, next {\leavevmode \bgroup \forgetall @@ -428,7 +428,7 @@ %D \getbuffer complete we also offer a very simple one %D character alternative, that is not that hard to understand: -\def\TreatFirstCharacter#1#2% command, character +\unexpanded\def\TreatFirstCharacter#1#2% command, character {{#1{#2}}} %D A previous paragraph started with: @@ -440,7 +440,7 @@ %D %D The next hack deals with vertical stacking. -\def\StackCharacters#1#2#3#4% sequence vsize vskip command +\unexpanded\def\StackCharacters#1#2#3#4% sequence vsize vskip command {\vbox #2 {\forgetall \baselineskip\zeropoint @@ -531,10 +531,10 @@ %D %D These are implemented using an auxilliary macro: -\def\NormalizeFontHeight{\NormalizeFontSize\ht} -\def\NormalizeFontWidth {\NormalizeFontSize\wd} +\unexpanded\def\NormalizeFontHeight{\NormalizeFontSize\ht} +\unexpanded\def\NormalizeFontWidth {\NormalizeFontSize\wd} -\def\NormalizeFontSize#1#2#3#4#5% +\unexpanded\def\NormalizeFontSize#1#2#3#4#5% {\bgroup \dimen0=#4% #4 can be \ht0 or so \setbox0\hbox{\definedfont[#5 at 5pt]#3}% 10pt @@ -557,7 +557,7 @@ %D Extra: -\def\WidthSpanningText#1#2#3% text width font +\unexpanded\def\WidthSpanningText#1#2#3% text width font {\hbox{\NormalizeFontWidth\temp{#1}{#2}{#3}\temp\the\everydefinedfont#1}} %D Consider for instance: @@ -642,7 +642,7 @@ % #1 width #2 height #3 font #4 size #5 step #6 interlinie #7 text -\long\def\FittingText#1#2#3#4#5#6#7% +\unexpanded\def\FittingText#1#2#3#4#5#6#7% {\bgroup \forgetall \dontcomplain @@ -681,11 +681,9 @@ \unvbox\scratchbox \egroup} -%D New: - % \font width gap font spec text -\def\NormalizeFontWidthSpread#1#2#3#4#5#6% +\unexpanded\def\NormalizeFontWidthSpread#1#2#3#4#5#6% {\global\setfalse\NFSpread \scratchdimen#3% \scratchdimen-.5\scratchdimen @@ -704,10 +702,10 @@ \definefont[\strippedcsname#1][#4 #5]% \fi} -\def\SpreadGapText#1#2% +\unexpanded\def\SpreadGapText#1#2% {{\def\+{\kern#1}#2}} -\def\GapText#1#2#3#4#5% width distance font spec title +\unexpanded\def\GapText#1#2#3#4#5% width distance font spec title {\bgroup \NormalizeFontWidthSpread\DummyFont{#1}{#2}{#3}{#4}{#5}% \DummyFont\setupspacing\SpreadGapText{#2}{#5}\endgraf diff --git a/tex/context/base/supp-num.mkiv b/tex/context/base/m-oldnum.mkiv index be0df026d..efc0af472 100644 --- a/tex/context/base/supp-num.mkiv +++ b/tex/context/base/m-oldnum.mkiv @@ -1,5 +1,5 @@ %D \module -%D [ file=supp-num, +%D [ file=m-oldnum, % was: supp-num %D version=1998.05.15, %D title=\CONTEXT\ Support Macros, %D subtitle=Numbers, diff --git a/tex/context/base/mult-dim.mkvi b/tex/context/base/mult-dim.mkvi index 0889b411e..bad7af713 100644 --- a/tex/context/base/mult-dim.mkvi +++ b/tex/context/base/mult-dim.mkvi @@ -35,6 +35,7 @@ \installcorenamespace{dimensionnormal} \setvalue{\??dimensionnormal \v!none }#value#dimension#small#medium#big{#dimension\zeropoint} +\setvalue{\??dimensionnormal \empty }#value#dimension#small#medium#big{#dimension\zeropoint} \setvalue{\??dimensionnormal \v!small }#value#dimension#small#medium#big{#dimension=#small\relax} \setvalue{\??dimensionnormal \v!medium}#value#dimension#small#medium#big{#dimension=#medium\relax} \setvalue{\??dimensionnormal \v!big }#value#dimension#small#medium#big{#dimension=#big\relax} diff --git a/tex/context/base/node-fin.lua b/tex/context/base/node-fin.lua index dadbf80d3..84032c22d 100644 --- a/tex/context/base/node-fin.lua +++ b/tex/context/base/node-fin.lua @@ -699,26 +699,26 @@ local function stacker(namespace,attribute,head,default) -- no triggering, no in end elseif id == hlist_code or id == vlist_code then local content = current.list - if content then - if nslistwise then - local a = has_attribute(current,attribute) - if a and attrib ~= a and nslistwise[a] then -- viewerlayer - local p = attrib - attrib, done = a, true - head = insert_node_before(head,current,copy_node(nsdata[a])) - current.list = stacker(namespace,attribute,content,attrib) - head, current = insert_node_after(head,current,copy_node(nsnone)) - attrib = p - else - local ok = false - current.list, ok = stacker(namespace,attribute,content,attrib) - done = done or ok - end + if not content then + -- skip + elseif nslistwise then + local a = has_attribute(current,attribute) + if a and attrib ~= a and nslistwise[a] then -- viewerlayer + local p = attrib + attrib, done = a, true + head = insert_node_before(head,current,copy_node(nsdata[a])) + current.list = stacker(namespace,attribute,content,attrib) + head, current = insert_node_after(head,current,copy_node(nsnone)) + attrib = p else local ok = false - current.list, ok = stacker(namespace,attribute,content,default) + current.list, ok = stacker(namespace,attribute,content,attrib) done = done or ok end + else + local ok = false + current.list, ok = stacker(namespace,attribute,content,default) + done = done or ok end end previous = current diff --git a/tex/context/base/spac-ali.mkiv b/tex/context/base/spac-ali.mkiv index 57806b6f2..0afbe313b 100644 --- a/tex/context/base/spac-ali.mkiv +++ b/tex/context/base/spac-ali.mkiv @@ -651,6 +651,10 @@ \let\forgetragged \spac_align_set_horizontal_none +\appendtoks + \spac_align_set_horizontal_none +\to \everyforgetall + % Box commands. \unexpanded\def\ibox#1#2#3% diff --git a/tex/context/base/spac-def.mkiv b/tex/context/base/spac-def.mkiv index 4cd7b1d1c..ea537aea7 100644 --- a/tex/context/base/spac-def.mkiv +++ b/tex/context/base/spac-def.mkiv @@ -13,47 +13,13 @@ \writestatus{loading}{ConTeXt Spacing Macros / Definitions} -% todo: move resetters to other modules +% Ideally these definitions should be moved to where they first appear and +% this will happen at some point. \unprotect -\unexpanded\def\forgeteverypar - {\everypar{\the\neverypar}} - -% worth trying: -% -% \unexpanded\def\forgeteverypar -% {\everypar\neverypar} - -\unexpanded\def\forgetparskip - {\s_spac_whitespace_parskip\zeropoint - \parskip\zeropoint - \let\v_spac_whitespace_current\v!none} - -\unexpanded\def\forgetbothskips - {\leftskip\zeropoint - \rightskip\zeropoint - \relax} - -\unexpanded\def\forgethorizontalstretch - {\emergencystretch\zeropoint} - -\unexpanded\def\forgetverticalstretch - {\spacing\plusone} - -\newif\ifforgotten % rather good signal for inner - -% This will become better: several resetters that do all in once as currently there is -% redundant code. - -\appendtoks \forgottentrue \to \everyforgetall -\appendtoks \forgetragged \to \everyforgetall -\appendtoks \forgetparskip \to \everyforgetall -\appendtoks \forgetparindent \to \everyforgetall -\appendtoks \forgetbothskips \to \everyforgetall -\appendtoks \forgethorizontalstretch \to \everyforgetall % needed in pagebody -\appendtoks \forgetverticalstretch \to \everyforgetall % needed in otr -\appendtoks \everypar\emptytoks \to \everyforgetall % indeed! +% maybe \everysynchronizeglobalspacing +% maybe \everysynchronizelocalspacing \appendtoks \forgetverticalstretch \to \everybodyfont \appendtoks \presetnormallineheight \to \everybodyfont @@ -67,26 +33,17 @@ \appendtoks \synchronizespacecodes \to \everybodyfont % not needed, frozen factors \appendtoks \setrelativeinterlinespace \to \everybodyfont +% why exception + \appendtoks \updateraggedskips \to \everyfontswitch % under test -\prependtoks \let\par\normalpar \to \everybeforepagebody % see \fillinline (was endgraf) -\appendtoks \synchronizespacecodes \to \everydefinedfont % not needed, frozen factors -\setupwhitespace - [\v!none] +% maybe more -\indenting - [\v!never] +\prependtoks \let\par\normalpar \to \everybeforepagebody % see \fillinline (was endgraf) -\setupindenting - [\v!none] +% needs checking: -\setupblank - [\v!big] % alternatively [\v!standard] - -\defineblank[\v!default] [\v!big] % todo: needs to adapt to \setupblank -\defineblank[\v!before] [\v!default] % but we need to avoid circular references -\defineblank[\v!inbetween][\v!default] % then -\defineblank[\v!after] [\v!before] +\appendtoks \synchronizespacecodes \to \everydefinedfont % not needed, frozen factors \setupinterlinespace [\c!minheight=\zeropoint, % only special purpose @@ -99,12 +56,8 @@ \c!line=2.8\exheight, \c!stretch=\zerocount] -\setupnarrower - [\c!before=\endgraf, - \c!after=\endgraf, - \c!left=1.5\emwidth, - \c!right=1.5\emwidth, - \c!middle=1.5\emwidth] +\setupblank + [\v!big] \setuptolerance [\v!horizontal,\v!verystrict] @@ -119,4 +72,10 @@ \setupspacing [\v!packed] +\indenting + [\v!never] + +\setupindenting + [\v!none] + \protect \endinput diff --git a/tex/context/base/spac-grd.mkiv b/tex/context/base/spac-grd.mkiv index 487521f6c..cf350fdb6 100644 --- a/tex/context/base/spac-grd.mkiv +++ b/tex/context/base/spac-grd.mkiv @@ -15,37 +15,38 @@ \writestatus{loading}{ConTeXt Spacing Macros / Grid Snapping} -% buff-ver.mkiv: halfline spacing -% strc-mat.mkiv: configure math grid (new code needed) -% page-one.mkiv: to be checked -% page-mul.mkiv: to be checked and redone -% page-sid.mkiv: to be checked -% page-set.mkiv: to be checked -% strc-not.mkiv: to be checked -% strc-ren.mkiv: to be checked -% strc-flt.mkiv: to be checked (captions, probably top/bottom) -% core-mis.mkiv: to be checked (placement, probbaly harmless) - \unprotect -%D Helpers: +%D A rather crappy macro that we need to avoid and as such it will probably +%D disappear: + +\installcorenamespace{lastnodepusher} \let\poplastnode\relax -\def\pushlastnode - {\ifdim\lastskip=\zeropoint - \ifnum\lastpenalty=\zerocount - \ifnum\lastkern=\zerocount - \let\poplastnode\relax - \else - \edef\poplastnode{\kern\the\lastkern\relax}\kern-\lastkern % untested - \fi +\unexpanded\def\pushlastnode + {\csname\??lastnodepusher + \ifcsname\??lastnodepusher\the\lastnodetype\endcsname + \the\lastnodetype \else - \edef\poplastnode{\penalty\the\lastpenalty\relax}\nobreak % untested + \s!unknown \fi - \else - \edef\poplastnode{\vskip\the\lastskip\relax}\vskip-\lastskip % \removelastskip - \fi} + \endcsname} + +\setvalue{\??lastnodepusher\number\kernnodecode}% + {\unexpanded\edef\poplastnode{\kern\the\lastkern\relax}% + \kern-\lastkern} + +\setvalue{\??lastnodepusher\number\gluenodecode}% + {\unexpanded\edef\poplastnode{\vskip\the\lastskip\relax}% + \vskip-\lastskip} + +\setvalue{\??lastnodepusher\number\penaltynodecode}% + {\unexpanded\edef\poplastnode{\penalty\the\lastpenalty\relax}% + \nobreak} + +\setvalue{\??lastnodepusher\s!unknown}% + {\let\poplastnode\relax} %D Moved from supp-box: @@ -133,6 +134,8 @@ % \startlinecorrection \framed{xxx} \stoplinecorrection % \input ward \par +% to be redone: + \unexpanded\def\dotopbaselinecorrection{\expandafter\blank\expandafter[\the\d_spac_lines_correction_before]} \unexpanded\def\dobotbaselinecorrection{\expandafter\blank\expandafter[\the\d_spac_lines_correction_after ]} diff --git a/tex/context/base/spac-hor.mkiv b/tex/context/base/spac-hor.mkiv index 47665e8b5..49187a6ad 100644 --- a/tex/context/base/spac-hor.mkiv +++ b/tex/context/base/spac-hor.mkiv @@ -34,7 +34,7 @@ \unexpanded\def\setupindenting {\doifnextoptionalelse\spac_indentation_setup_options\spac_indentation_setup_size} -\def\spac_indentation_setup_size +\unexpanded\def\spac_indentation_setup_size {\assigndimension\v_spac_indentation_current\d_spac_indentation_par{1\emwidth}{1.5\emwidth}{2\emwidth}} \let\synchronizeindenting\spac_indentation_setup_size @@ -286,6 +286,17 @@ \parindent\zeropoint \let\v_spac_indentation_current\v!none} +\appendtoks + \forgetparindent +\to \everyforgetall + +\unexpanded\def\forgethorizontalstretch + {\emergencystretch\zeropoint} + +\appendtoks + \forgethorizontalstretch +\to \everyforgetall % needed in pagebody + %D Helper: \unexpanded\def\softbreak @@ -479,8 +490,6 @@ \unexpanded\def\tfskip {\begingroup\tf\hskip\emwidth\endgroup} \unexpanded\def\dotfskip#1{\begingroup\tf\hskip #1\endgroup} % used elsewhere -% needs a proper \definenarrower or installnarrower -% % maybe we should hash the analysis \installcorenamespace{narrower} @@ -617,6 +626,24 @@ \unexpanded\def\doadaptleftskip #1{\dosetleftskipadaption {#1}\advance\leftskip \leftskipadaption } \unexpanded\def\doadaptrightskip#1{\dosetrightskipadaption{#1}\advance\rightskip\rightskipadaption} +\unexpanded\def\forgetbothskips + {\leftskip\zeropoint + \rightskip\zeropoint + \relax} + +\appendtoks + \forgetbothskips +\to \everyforgetall + +\unexpanded\def\forgetparskip + {\s_spac_whitespace_parskip\zeropoint + \parskip\zeropoint + \let\v_spac_whitespace_current\v!none} + +\appendtoks + \forgetparskip +\to \everyforgetall + %D Tolerance (can also be set with align): \installcorenamespace{tolerancemethods} diff --git a/tex/context/base/spac-ver.mkiv b/tex/context/base/spac-ver.mkiv index 66d55a57a..e404dc9ef 100644 --- a/tex/context/base/spac-ver.mkiv +++ b/tex/context/base/spac-ver.mkiv @@ -414,6 +414,10 @@ \parskip\zeropoint \let\v_spac_whitespace_current\v!none} +\appendtoks + \forgetparskip +\to \everyforgetall + % \installwhitespacemethod \s!unknown {\s_spac_whitespace_parskip\commalistelement\relax} % % \def\spac_whitespace_setup_method#1% @@ -422,6 +426,9 @@ \unexpanded\def\nowhitespace{\vspacing[\v!nowhite]} \unexpanded\def\whitespace {\vspacing[\v!white]} +\setupwhitespace + [\v!none] + % Packed: % todo: when packed blocks blank, we need to enable forced @@ -748,6 +755,13 @@ \setnormalbaselines \setstrut} +\unexpanded\def\forgetverticalstretch % \forgetspacing + {\spacing\plusone} + +\appendtoks + \forgetverticalstretch +\to \everyforgetall % needed in otr + %D Sometimes one needs to freeze the interlinespacing %D %D \starttyping @@ -885,7 +899,7 @@ \def\spac_struts_set_vide {\setbox\strutbox\hbox - {\hbox to \zeropoint + {\spac_struts_vide_hbox to \zeropoint {% \hss % new, will be option \vrule \!!width \strutwidth @@ -893,6 +907,8 @@ \!!depth \strutdp \hss}}} +\let\spac_struts_vide_hbox\hbox % overloaded in trac-vis.mkiv + %D The dimen \type {\struttotal} holds the exact size of the %D strut; occasionally a one scaled point difference can show %D up with the lineheight. @@ -1728,17 +1744,6 @@ \let\synchronizevspacing\setupvspacing_nop -% used both - -\unexpanded\def\inhibitblank - {\vspacing[\v!disable]} % can be made faster - -\let\doinhibitblank\inhibitblank % keep this command, used in styles - -\let\setupblank \setupvspacing -\let\blank \vspacing -\let\synchronizeblank\synchronizevspacing - % category:4 is default % this interface might change (into an \install, buw we will then keep this one hidden) @@ -1788,12 +1793,27 @@ \dorecurse{10} % todo: other values < 4000 {\normalexpanded{\definevspacing[\v!samepage-\recurselevel][penalty:\the\numexpr4000+250*\recurselevel\relax]}} +\definevspacing[\v!default] [\v!big] % todo: needs to adapt to \setupblank +\definevspacing[\v!before] [\v!default] % but we need to avoid circular references +\definevspacing[\v!inbetween][\v!default] % then +\definevspacing[\v!after] [\v!before] + +\setupvspacing + [\v!big] % alternatively [\v!standard] + %D Maybe at some point we will differ between \type {\vspacing} and %D \type {\blank} (we needed the first one while playing with the %D new code). -\let\blank \vspacing +\unexpanded\def\inhibitblank + {\vspacing[\v!disable]} % can be made faster + +\let\doinhibitblank\inhibitblank % keep this command, used in styles + \let\defineblank \definevspacing +\let\setupblank \setupvspacing +\let\blank \vspacing +\let\synchronizeblank \synchronizevspacing \let\defineblankmethod\definevspacingamount %D The following command is for Wolfgang. It has to be used with diff --git a/tex/context/base/status-files.pdf b/tex/context/base/status-files.pdf Binary files differindex 08010c8b9..d72c1e335 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 8b8f0f3dc..fd57767c1 100644 --- a/tex/context/base/status-lua.pdf +++ b/tex/context/base/status-lua.pdf diff --git a/tex/context/base/status-mkiv.lua b/tex/context/base/status-mkiv.lua index aa5aa4d20..5240b43d4 100644 --- a/tex/context/base/status-mkiv.lua +++ b/tex/context/base/status-mkiv.lua @@ -74,7 +74,7 @@ return { { filename = "syst-aux", marktype = "mkiv", - status = "okay", + status = "unknown", comment = "will be better protected" }, { @@ -283,12 +283,12 @@ return { -- status = "unknown", -- comment = "will become a module (and part will stay in the core)", -- }, - { - filename = "supp-fun", - marktype = "mkiv", - status = "unknown", - comment = "will be integrated elsewhere", - }, + -- { + -- filename = "supp-fun", + -- marktype = "mkiv", + -- status = "unknown", + -- comment = "will be integrated elsewhere", + -- }, { filename = "supp-ran", marktype = "mkiv", @@ -300,12 +300,12 @@ return { status = "okay", comment = "will be moved to the math-* modules", }, - { - filename = "supp-num", - marktype = "mkiv", - status = "obsolete", - comment = "replaced by units", - }, + -- { + -- filename = "supp-num", + -- marktype = "mkiv", + -- status = "obsolete", + -- comment = "replaced by units", + -- }, { filename = "typo-ini", marktype = "mkiv", @@ -595,7 +595,7 @@ return { { filename = "spac-lin", marktype = "mkiv", - status = "unknown", + status = "okay", comment = "could be improved if needed" }, { @@ -618,6 +618,7 @@ return { filename = "spac-grd", marktype = "mkiv", status = "unknown", + comment = "needs thinking and redoing", }, { filename = "anch-pos", @@ -1075,6 +1076,11 @@ return { status = "okay", }, { + filename = "font-aux", + marktype = "mkvi", + status = "okay", + }, + { filename = "lxml-css", marktype = "mkiv", status = "okay", diff --git a/tex/context/base/supp-mat.mkiv b/tex/context/base/supp-mat.mkiv index bc26611ae..21871e80d 100644 --- a/tex/context/base/supp-mat.mkiv +++ b/tex/context/base/supp-mat.mkiv @@ -52,31 +52,26 @@ \let\normalstopimath \Ustopmath \let\normalstartdmath \Ustartdisplaymath \let\normalstopdmath \Ustopmath + \def\normalmathaligntab{&} % \let\normalmathaligntab\aligntab does to work well in a let to & (a def works ok) -\let\normalsuper \Usuperscript % obsolete -\let\normalsuber \Usubscript % obsolete -\let\startimath \Ustartmath % obsolete, less safe -\let\stopimath \Ustopmath % obsolete, less safe -\let\startdmath \Ustartdisplaymath % obsolete, less safe -\let\stopdmath \Ustopmath % obsolete, less safe +\let\normalsuper \Usuperscript % obsolete +\let\normalsuber \Usubscript % obsolete + +\let\startimath \Ustartmath +\let\stopimath \Ustopmath +\let\startdmath \Ustartdisplaymath +\let\stopdmath \Ustopmath \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\m\mathematics \let\stopmathmode\relax -% \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 @@ -128,7 +123,8 @@ \def\dimensionhalfspace {\,} \unexpanded\def\dimension#1% - {\def\dodimensionsignal{\kern\dimensionsignal}% + {\pushmacro\dodimensionsignal + \gdef\dodimensionsignal{\kern\dimensionsignal}% \ifdim\lastskip=\zeropoint\relax \ifdim\lastkern=\zeropoint\relax \ifmmode @@ -144,70 +140,16 @@ \else \unskip\mathematics{\dimensionhalfspace\dimensionhalfspace\dimensiontypeface#1}% \fi - \dodimensionsignal} + \dodimensionsignal + \popmacro\dodimensionsignal} \unexpanded\def\nodimension#1% {\unskip#1\global\let\dodimensionsignal\relax} -% %D \macros -% %D {super, suber} -% %D -% %D \TEX\ uses \type{^} and \type{_} for entering super- and -% %D subscript mode. We want however a bit more control than -% %D normally provided, and therefore provide \type {\super} -% %D and \type{\suber} (\type {\sub} is already taken). -% -% \global\let\normalsuper=\normalsuperscript % will become obsolete -% \global\let\normalsuber=\normalsubscript % will become obsolete -% -% \newcount\supersubmode -% -% \newevery\everysupersub \EverySuperSub -% -% \appendtoks \advance\supersubmode\plusone \to \everysupersub -% -% \def\super#1{\normalsuperscript{\the\everysupersub#1}} -% \def\suber#1{\normalsubscript {\the\everysupersub#1}} -% -% %D \macros -% %D {enablesupsub} -% %D -% %D We can let \type {^} and \type {_} act like \type {\super} -% %D and \type {\suber} by saying \type {\enablesupsub}. -% -% \bgroup -% \catcode\circumflexasciicode\activecatcode -% \catcode\underscoreasciicode\activecatcode -% \gdef\enablesupsub -% {\catcode\circumflexasciicode\activecatcode -% \catcode\underscoreasciicode\activecatcode -% \def^{\ifmmode\expandafter\super\else\expandafter\normalsuper\fi}% -% \def_{\ifmmode\expandafter\suber\else\expandafter\normalsuber\fi}} -% \egroup -% -% %D \macros -% %D {restoremathstyle} -% %D -% %D We can pick up the current math style by calling \type -% %D {\restoremathstyle}. -% -% \def\restoremathstyle -% {\ifmmode -% \ifcase\supsubmode -% \textstyle -% \or -% \scriptstyle -% \else -% \scriptscriptstyle -% \fi -% \fi} - %D \macros %D {cramped} %D -%D \TEX provides no primitive to force in cramped math mode. Here is -%D a macro that does so. It is based on a solution by Don Knuth (\useurl -%D {http://www.ctan.org/tex-archive/digests/tex-implementors/042}). +%D Cramped math: %D %D \startbuffer %D \ruledhbox{$\left\{{x^2\over y^2}\right\}$} @@ -305,7 +247,7 @@ % experiment, not yet to be used -% \def\displaybreak +% \unexpanded\def\displaybreak % {\ifhmode % \removeunwantedspaces % \ifcase\raggedstatus\hfill\fi diff --git a/tex/context/base/syst-aux.mkiv b/tex/context/base/syst-aux.mkiv index 8a791e900..824754a77 100644 --- a/tex/context/base/syst-aux.mkiv +++ b/tex/context/base/syst-aux.mkiv @@ -3747,7 +3747,7 @@ \expandafter\appendtoks\expandafter\the\csname t\strippedcsname#1\endcsname\to #1% \csname t\strippedcsname#1\endcsname} -\def\newevery#1#2% +\unexpanded\def\newevery#1#2% {\ifx#1\everypar\else\newtoks#1\fi% we test for redefinition elsewhere \ifx#2\relax\else\ifdefined#2\else \expandafter\newtoks\csname t\strippedcsname#1\endcsname @@ -3763,6 +3763,9 @@ \newevery \neverypar \NeveryPar +\unexpanded\def\forgeteverypar + {\everypar{\the\neverypar}} + %D Which we're going to use indeed! When the second argument %D equals \type {\relax}, the first token list is created %D unless it is already defined. diff --git a/tex/context/base/trac-vis.lua b/tex/context/base/trac-vis.lua index aff044921..556dc1347 100644 --- a/tex/context/base/trac-vis.lua +++ b/tex/context/base/trac-vis.lua @@ -24,6 +24,9 @@ local format = string.format -- with full visualization enabled. In practice this will never happen -- unless one is demoing. +-- We could use pdf literals and re stream codes but it's not worth the +-- trouble because we would end up in color etc mess. + -- todo: global switch (so no attributes) -- todo: maybe also xoffset, yoffset of glyph -- todo: inline concat (more efficient) @@ -32,10 +35,12 @@ local nodecodes = nodes.nodecodes local disc_code = nodecodes.disc local kern_code = nodecodes.kern local glyph_code = nodecodes.glyph +local disc_code = nodecodes.disc local hlist_code = nodecodes.hlist local vlist_code = nodecodes.vlist local glue_code = nodecodes.glue local penalty_code = nodecodes.penalty +local whatsit_code = nodecodes.whatsit local kerncodes = nodes.kerncodes local font_kern_code = kerncodes.fontkern @@ -60,7 +65,9 @@ local free_node = node.free local free_node_list = node.flush_list local has_attribute = node.has_attribute local set_attribute = node.set_attribute +local unset_attribute = node.unset_attribute local insert_before = node.insert_before +local insert_after = node.insert_after local fast_hpack = nodes.fasthpack local tex_attribute = tex.attribute @@ -105,28 +112,39 @@ local bit = number.bit local setbit = number.setbit local clearbit = number.clearbit -local trace_hbox -- 1 -local trace_vbox -- 2 -local trace_kern -- 4 -local trace_glue -- 8 -local trace_penalty -- 16 -local trace_fontkern -- 32 +local trace_hbox +local trace_vbox +local trace_vtop +local trace_kern +local trace_glue +local trace_penalty +local trace_fontkern +local trace_strut +local trace_whatsit local report_visualize = logs.reporter("visualize") local modes = { - hbox = 1, - vbox = 2, - kern = 4, - glue = 8, - penalty = 16, - fontkern = 32, + hbox = 1, + vbox = 2, + vtop = 4, + kern = 8, + glue = 16, + penalty = 32, + fontkern = 64, + strut = 128, + whatsit = 256, + glyph = 512, } +local makeup_modes = { "hbox", "vbox", "vtop", "kern", "glue", "penalty" } +local all_modes = { "hbox", "vbox", "vtop", "kern", "glue", "penalty", "fontkern", "whatsit", "glyph" } + local usedfont, exheight, emwidth -local l_penalty, l_glue, l_kern, l_fontkern, l_hbox, l_vbox +local l_penalty, l_glue, l_kern, l_fontkern, l_hbox, l_vbox, l_vtop, l_strut, l_whatsit, l_glyph local enabled = false +local layers = { } function visualizers.setfont(id) usedfont = id or current_font() @@ -138,17 +156,15 @@ local function setvisual(n,a,what) -- this will become more efficient when we ha if not n or n == "reset" then return unsetvalue elseif n == "makeup" then - a = setvisual("hbox",a) - a = setvisual("vbox",a) - a = setvisual("kern",a) - a = setvisual("glue",a) - a = setvisual("penalty",a) + for i=1,#makeup_modes do + a = setvisual(makeup_modes[i],a) + end elseif n == "all" then if what == false then return unsetvalue else - for k, v in next, modes do - a = setvisual(k,a) + for i=1,#all_modes do + a = setvisual(all_modes[i],a) end end else @@ -176,7 +192,6 @@ local function setvisual(n,a,what) -- this will become more efficient when we ha -- we use a narrow monospaced font visualizers.setfont(fonts.definers.define { name = "lmmonoltcond10regular", size = tex.sp("4pt") }) end - local layers = { } for mode, value in next, modes do local tag = format("v_%s",mode) attributes.viewerlayers.define { @@ -188,12 +203,16 @@ local function setvisual(n,a,what) -- this will become more efficient when we ha } layers[mode] = attributes.viewerlayers.register(tag,true) end - l_penalty = layers.penalty + l_hbox = layers.hbox + l_vbox = layers.vbox + l_vtop = layers.vtop l_glue = layers.glue l_kern = layers.kern + l_penalty = layers.penalty l_fontkern = layers.fontkern - l_hbox = layers.hbox - l_vbox = layers.vbox + l_strut = layers.strut + l_whatsit = layers.whatsit + l_glyph = layers.glyph nodes.tasks.enableaction("shipouts","nodes.visualizers.handler") report_visualize("enabled") enabled = true @@ -205,7 +224,12 @@ function visualizers.setvisual(n) tex_attribute[a_visual] = setvisual(n,tex_attribute[a_visual]) end +function visualizers.setlayer(n) + tex_attribute[a_layer] = layers[n] or unsetvalue +end + commands.setvisual = visualizers.setvisual +commands.setlayer = visualizers.setlayer function commands.visual(n) context(setvisual(n,0)) @@ -230,6 +254,7 @@ local c_text = "trace:s" local c_space = "trace:y" local c_skip_a = "trace:c" local c_skip_b = "trace:m" +local c_glyph = "trace:o" local c_positive_d = "trace:db" local c_negative_d = "trace:dr" @@ -238,6 +263,7 @@ local c_text_d = "trace:ds" local c_space_d = "trace:dy" local c_skip_a_d = "trace:dc" local c_skip_b_d = "trace:dm" +local c_glyph_d = "trace:do" local function sometext(str,layer,color) local text = fast_hpack_string(str,usedfont) @@ -291,15 +317,29 @@ local function fontkern(head,current) info.depth = 0 f_cache[kern] = info end - head, current = insert_before(head,current,copy_list(info)) - return head, current.next + head = insert_before(head,current,copy_list(info)) + return head, current end --- cache baseline +local w_cache = { } + +local function whatsit(head,current) + local what = current.subtype + local info = w_cache[what] + if info then + -- print("hit whatsit") + else + local info = sometext(format("W:%s",what),usedfont) + set_attribute(info,a_layer,l_whatsit) + w_cache[what] = info + end + head, current = insert_after(head,current,copy_list(info)) + return head, current +end local b_cache -local function ruledbox(head, current, vertical) +local function ruledbox(head,current,vertical,layer) local wd = current.width if wd ~= 0 then local ht, dp = current.height, current.depth @@ -348,10 +388,13 @@ local function ruledbox(head, current, vertical) info.width = 0 info.height = 0 info.depth = 0 - set_attribute(info,a_layer,vertical and l_vbox or l_hbox) + set_attribute(info,a_layer,layer) local info = concat_nodes { - info, +-- info, +-- current, current, + new_kern(-wd), + info, } info = fast_hpack(info) if vertical then @@ -375,6 +418,59 @@ local function ruledbox(head, current, vertical) end end +local function ruledglyph(head,current) + local wd = current.width + if wd ~= 0 then + local ht, dp = current.height, current.depth + local next, prev = current.next, current.prev + current.next, current.prev = nil, nil + local linewidth = .05 * emwidth + local baseline + if dp ~= 0 and ht ~= 0 then + baseline = new_rule(wd-2*linewidth,linewidth,0) + end + local doublelinewidth = 2*linewidth + local info = concat_nodes { + new_rule(linewidth,ht,dp), + new_rule(wd-doublelinewidth,-dp+linewidth,dp), + new_rule(linewidth,ht,dp), + new_kern(-wd+linewidth), + new_rule(wd-doublelinewidth,ht,-ht+linewidth), + new_kern(-wd+doublelinewidth), + baseline, + } + setlistcolor(info,c_glyph) + setlisttransparency(info,c_glyph_d) + info = fast_hpack(info) + info.width = 0 + info.height = 0 + info.depth = 0 + set_attribute(info,a_layer,l_glyph) + local info = concat_nodes { + current, + new_kern(-wd), + info, + } + info = fast_hpack(info) + info.width = wd + if next then + info.next = next + next.prev = info + end + if prev then + info.prev = prev + prev.next = info + end + if head == current then + return info, info + else + return head, info + end + else + return head, current + end +end + local g_cache = { } local tags = { @@ -494,10 +590,14 @@ end local function visualize(head,vertical) local trace_hbox = false local trace_vbox = false + local trace_vtop = false local trace_kern = false local trace_glue = false local trace_penalty = false local trace_fontkern = false + local trace_strut = false + local trace_whatsit = false + local trace_glyph = false local current = head local prev_trace_fontkern = nil local attr = unsetvalue @@ -509,21 +609,50 @@ local function visualize(head,vertical) if not a then trace_hbox = false trace_vbox = false + trace_vtop = false trace_kern = false trace_glue = false trace_penalty = false trace_fontkern = false + trace_strut = false + trace_whatsit = false + trace_glyph = false else - trace_hbox = hasbit(a,1) - trace_vbox = hasbit(a,2) - trace_kern = hasbit(a,4) - trace_glue = hasbit(a,8) - trace_penalty = hasbit(a,16) - trace_fontkern = hasbit(a,32) + trace_hbox = hasbit(a, 1) + trace_vbox = hasbit(a, 2) + trace_vtop = hasbit(a, 4) + trace_kern = hasbit(a, 8) + trace_glue = hasbit(a, 16) + trace_penalty = hasbit(a, 32) + trace_fontkern = hasbit(a, 64) + trace_strut = hasbit(a,128) + trace_whatsit = hasbit(a,256) + trace_glyph = hasbit(a,512) end attr = a end - if id == kern_code then + if trace_strut then + set_attribute(current,a_layer,l_strut) + elseif id == glyph_code then + if trace_glyph then + head, current = ruledglyph(head,current) + end + elseif id == disc_code then + if trace_glyph then + local pre = current.pre + if pre then + current.pre = ruledglyph(pre,pre) + end + local post = current.post + if post then + current.post = ruledglyph(post,post) + end + local replace = current.replace + if replace then + current.replace = ruledglyph(replace,replace) + end + end + elseif id == kern_code then local subtype = current.subtype -- tricky ... we don't copy the trace attribute in node-inj (yet) if subtype == font_kern_code or has_attribute(current,a_fontkern) then @@ -538,7 +667,7 @@ local function visualize(head,vertical) elseif id == glue_code then local content = current.leader if content then - current.leaders = visualize(content,false) + current.leader = visualize(content,false) elseif trace_glue then head, current = ruledglue(head,current,vertical) end @@ -556,15 +685,21 @@ local function visualize(head,vertical) current.list = visualize(content,false) end if trace_hbox then - head, current = ruledbox(head,current,false) + head, current = ruledbox(head,current,false,l_hbox) end elseif id == vlist_code then local content = current.list if content then current.list = visualize(content,true) end - if trace_vbox then - head, current = ruledbox(head,current,true) + if trace_vtop then + head, current = ruledbox(head,current,true,l_vtop) + elseif trace_vbox then + head, current = ruledbox(head,current,true,l_vbox) + end + elseif id == whatsit_code then + if trace_whatsit then + head, current = whatsit(head,current) end end current = current.next @@ -586,30 +721,37 @@ local function freed(cache) end local function cleanup() - local hf, ng, np, nk + local hf, ng, np, nk, nw nf, f_cache = freed(f_cache) ng, g_cache = freed(g_cache) np, p_cache = freed(p_cache) nk, k_cache = freed(k_cache) + nw, w_cache = freed(w_cache) if b_cache then free_node_list(b_cache) b_cache = nil end - -- report_visualize("cache: %s fontkerns, %s skips, %s penalties, %s kerns",nf,ng,np,nk) + -- report_visualize("cache: %s fontkerns, %s skips, %s penalties, %s kerns, %s whatsits",nf,ng,np,nk,nw) end function visualizers.handler(head) if usedfont then starttiming(visualizers) + -- local l = tex_attribute[a_layer] + -- local v = tex_attribute[a_visual] + -- tex_attribute[a_layer] = unsetvalue + -- tex_attribute[a_visual] = unsetvalue head = visualize(head) --- cleanup() + -- tex_attribute[a_layer] = l + -- tex_attribute[a_visual] = v + -- -- cleanup() stoptiming(visualizers) end return head, false end -function nodes.visualizers.box(n) - tex.box[n].list = nodes.visualizers.handler(tex.box[n].list) +function visualizers.box(n) + tex.box[n].list = visualizers.handler(tex.box[n].list) end statistics.register("visualization time",function() diff --git a/tex/context/base/trac-vis.mkiv b/tex/context/base/trac-vis.mkiv index 256c648fc..ed24edf92 100644 --- a/tex/context/base/trac-vis.mkiv +++ b/tex/context/base/trac-vis.mkiv @@ -41,13 +41,27 @@ %D We only provide box visualizers as they can come in handy for testing %D macros. In due time we will move some of the m-visual code here too. +\let\syst_visualizers_hbox\hbox +\let\syst_visualizers_vbox\vbox +\let\syst_visualizers_vtop\vtop -\unexpanded\def\ruledhbox{\hbox attr \visualattribute \ctxcommand{visual("hbox")} } -\unexpanded\def\ruledvbox{\vbox attr \visualattribute \ctxcommand{visual("vbox")} } -\unexpanded\def\ruledvtop{\vtop attr \visualattribute \ctxcommand{visual("vbox")} } +\unexpanded\def\ruledhbox{\syst_visualizers_hbox attr \visualattribute \ctxcommand{visual("hbox")} } +\unexpanded\def\ruledvbox{\syst_visualizers_vbox attr \visualattribute \ctxcommand{visual("vbox")} } +\unexpanded\def\ruledvtop{\syst_visualizers_vtop attr \visualattribute \ctxcommand{visual("vtop")} } % special case \unexpanded\def\showmakeup - {\ctxcommand{setvisual("makeup")} } + {\ctxcommand{setvisual("makeup")}% + \let\normalvtop\ruledvtop + \let\vtop \ruledvtop} + +\unexpanded\def\showallmakeup + {\ctxcommand{setvisual("all")}% + \let\normalvtop\ruledvtop + \let\vtop \ruledvtop + \showstruts} + +\unexpanded\def\showglyphs + {\ctxcommand{setvisual("glyph")}} \unexpanded\def\setvisualizerfont {\dosingleempty\syst_visualizers_setfont} @@ -58,6 +72,15 @@ \ctxlua{nodes.visualizers.setfont()}% \endgroup} +%D Overload: + +% \def\spac_struts_vide_hbox +% {\hbox attr \visualattribute \ctxcommand{visual("strut")} } + +\def\spac_struts_vide_hbox + {\edef\spac_struts_vide_hbox{\hbox attr \visualattribute \ctxcommand{visual("strut")} }% + \spac_struts_vide_hbox} + %D We keep this one: \unexpanded\def\dontinterfere |