diff options
Diffstat (limited to 'tex')
50 files changed, 2282 insertions, 1205 deletions
diff --git a/tex/context/base/anch-bar.mkiv b/tex/context/base/anch-bar.mkiv index 9f9770fb6..c7c6190be 100644 --- a/tex/context/base/anch-bar.mkiv +++ b/tex/context/base/anch-bar.mkiv @@ -58,7 +58,9 @@ \installcommandhandler \??sidebar {sidebar} \??sidebar \newcount\c_anch_sidebars_n -\newdimen\c_anch_sidebars_distance +\newcount\c_anch_sidebars_current % local +\newdimen\d_anch_sidebars_distance +\newcount\c_anch_sidebars_level % \setupMPvariables % [mpos:sidebar] @@ -67,24 +69,60 @@ % distance=5pt] \setupsidebar - [\c!rulethickness=2pt, + [\c!rulethickness=\dimexpr\bodyfontsize/6\relax, % 2pt default \c!rulecolor=\s!black, \c!alternative=0, - \c!topoffset=0pt, - \c!bottomoffset=0pt, - \c!distance=.5\bodyfontsize] + \c!topoffset=\zeropoint, + \c!bottomoffset=\zeropoint, + \c!distance=.5\bodyfontsize, + \c!level=, + \c!leftmargindistance=\zeropoint] \let\setupsidebars\setupsidebar \unexpanded\def\startsidebar {\dosingleempty\anch_sidebars_start} -\def\anch_sidebars_start[#1]% +\unexpanded\def\startsidebar + {\dodoubleempty\anch_sidebars_start} + +\def\anch_sidebars_start[#1][#2]% {\bgroup - \def\currentsidebar{#1}% \dontleavehmode + \advance\c_anch_sidebars_level\plusone \global\advance\c_anch_sidebars_n\plusone - \advance\c_anch_sidebars_distance\sidebarparameter\c!distance + \c_anch_sidebars_current\c_anch_sidebars_n\relax % relax needed + \doifassignmentelse{#1} + {\edef\currentsidebar{\the\c_anch_sidebars_level}% + \checksidebarparent + \setupcurrentsidebar[#1]} + {\def\currentsidebar{#1}% + \setupcurrentsidebar[#2]}% + \scratchdistance\sidebarparameter\c!distance\relax + \edef\m_level{\sidebarparameter\c!level}% + \ifx\m_level\empty + \ifnum\c_anch_sidebars_level=\plusone + \scratchdimen\sidebarparameter\c!leftmargindistance\relax + \ifdim\scratchdimen=\zeropoint + \advance\d_anch_sidebars_distance\scratchdistance\relax + \else + \d_anch_sidebars_distance\scratchdimen + \fi + \else + \advance\d_anch_sidebars_distance\scratchdistance\relax + \fi + \else + \ifnum\m_level=\plusone + \scratchdimen\sidebarparameter\c!leftmargindistance\relax + \ifdim\scratchdimen=\zeropoint + \advance\d_anch_sidebars_distance\scratchdistance\relax + \else + \d_anch_sidebars_distance\scratchdimen + \fi + \else + \d_anch_sidebars_distance\dimexpr\scratchdimen+\numexpr\m_level-\plusone\relax\dimexpr\scratchdistance\relax\relax + \fi + \fi \startpositionoverlay{text-1}% \normalexpanded{\setMPpositiongraphicrange % maybe expand in definition {b:sidebar:\the\c_anch_sidebars_n}% @@ -94,15 +132,17 @@ linewidth=\sidebarparameter\c!rulethickness, linecolor=\sidebarparameter\c!rulecolor, alternative=\sidebarparameter\c!alternative, - topoffset=\sidebarparameter\c!topoffset, - bottomoffset=\sidebarparameter\c!bottomoffset, - distance=\the\c_anch_sidebars_distance}}% + topoffset=\the\dimexpr\sidebarparameter\c!topoffset, + bottomoffset=\the\dimexpr\sidebarparameter\c!bottomoffset, + distance=\the\d_anch_sidebars_distance}% + }% \stoppositionoverlay - \bpos{sidebar:\the\c_anch_sidebars_n}} + \bpos{sidebar:\the\c_anch_sidebars_current}% + \ignorespaces} \unexpanded\def\stopsidebar {\removelastspace - \epos{sidebar:\the\c_anch_sidebars_n} + \epos{sidebar:\the\c_anch_sidebars_current} \carryoverpar\egroup} %D Let's keep this nice and simple (okay, we could pass the 6 variables in @@ -121,49 +161,73 @@ \MPpositiongraphic{mpos:sidebar}{}% \stopMPpositionmethod -%D We now reimplement the margin rules handler defined in -%D \type {core-rul}: +%D We now reimplement the \MKII\ margin rules handler in a more +%D modern way. %D -%D \setupmarginrules[level=5] +%D \setupmarginrules +%D [rulecolor=darkred, +%D rulethickness=2pt] %D -%D \startmarginrule[1] -%D First we set the level at~5. Next we typeset this first -%D paragraph as a level~1 one. As expected no rule show up. -%D \stopmarginrule +%D \setupmarginrules % sidebar +%D [2] +%D [rulecolor=darkblue] %D -%D \startmarginrule[5] -%D The second paragraph is a level~5 one. As we can see here, -%D the marginal rule gets a width according to its level. +%D \startmarginrule[1] +%D \input ward +%D \startmarginrule[2] +%D \input ward +%D \startmarginrule[3] +%D \input ward +%D \startmarginrule[level=6,rulecolor=darkgreen] +%D \input ward +%D \stopmarginrule +%D \input ward +%D \stopmarginrule +%D \input ward +%D \stopmarginrule +%D \input ward %D \stopmarginrule %D -%D \startmarginrule[8] -%D It will of course be no surprise that this third paragraph -%D has a even thicker margin rule. This behavior can be -%D overruled by specifying the width explictly. -%D \stopmarginrule +%D Compared to the old mechanism we now can pass settings too. \definesidebar [\v!margin] - [\c!rulethickness=\@@karulethickness, - \c!distance=\dimexpr\leftmargindistance-\@@karulethickness/2\relax] + [\c!leftmargindistance=\dimexpr\leftmargindistance+\sidebarparameter\c!rulethickness/2\relax] -\definecomplexorsimple\startmarginrule +\dorecurse{5}{\definesidebar[\v!margin:#1][\v!margin]} % let's be nice and predefine 5 levels -\def\simplestartmarginrule - {\complexstartmarginrule[1]} +\unexpanded\def\setupmarginrule + {\dodoubleargument\anch_marginrules_setup} -\def\complexstartmarginrule[#1]% - {\bgroup - \ifnum#1<\@@kalevel\relax - \let\stopmarginrule\egroup +\def\anch_marginrules_setup[#1][#2]% + {\ifsecondargument + \setupsidebar[\v!margin:#1][#2]% \else - \def\@@kadefaultwidth{#1}% - \let\stopmarginrule\dostopmarginrule - \normalexpanded{\startsidebar[\v!margin]}% why expanded + \setupsidebar[\v!margin][#1]% \fi} -\def\dostopmarginrule - {\stopsidebar - \egroup} +\let\setupmarginrules\setupmarginrule + +\unexpanded\def\startmarginrule + {\dosingleempty\anch_marginrules_start} + +\unexpanded\def\startmarginrule + {\dosingleempty\anch_marginrules_start} + +\def\anch_marginrules_start[#1]% pretty inefficient checking + {\edef\m_anch_marginrules_kind{#1}% + \ifx\m_anch_marginrules_kind\empty + \anch_sidebars_start[\v!margin][]% + \else + \doifassignmentelse\m_anch_marginrules_kind + {\anch_sidebars_start[\v!margin][#1]}% + {\anch_marginrules_check{#1}% + \anch_sidebars_start[\v!margin:#1][\c!level=#1]}% + \fi} + +\def\anch_marginrules_check#1% + {\doifnotcommandhandler\??sidebar{\v!margin:#1}{\definesidebar[\v!margin:#1][\v!margin]}} + +\let\stopmarginrule\stopsidebar \protect \endinput diff --git a/tex/context/base/anch-bck.mkvi b/tex/context/base/anch-bck.mkvi index 8f22d8a6d..79e42dc0a 100644 --- a/tex/context/base/anch-bck.mkvi +++ b/tex/context/base/anch-bck.mkvi @@ -298,7 +298,7 @@ \endgraf % new \textbackgroundparameter\c!after} -\unexpanded\def\checkpositionoverlays +\unexpanded\def\checkpositionoverlays % overloads \relax in anch-pgr {\ifproductionrun \enabletextarearegistration \enablehiddenbackground diff --git a/tex/context/base/anch-pgr.mkiv b/tex/context/base/anch-pgr.mkiv index 38e0ff0af..130116bc7 100644 --- a/tex/context/base/anch-pgr.mkiv +++ b/tex/context/base/anch-pgr.mkiv @@ -33,7 +33,7 @@ \installcorenamespace{positionaction} \installcorenamespace{positioncleanup} -\unexpanded\def\dosetpositionaction#1% +\unexpanded\def\anch_positions_set_action#1% {\expandafter\gdef\csname\??positionaction#1\endcsname} % nicely gobbles spaces \unexpanded\def\doifpositionaction#1% @@ -111,7 +111,7 @@ {\begingroup \edef\currentpositionanchor {\ifx\currentpositionoverlay\empty#3\else\currentpositionoverlay::\MPanchoridentifier\fi}% - \normalexpanded{\dosetpositionaction{\currentpositionanchor}{\noexpand\getvalue{\??positioncleanup\currentpositionanchor}}}% + \normalexpanded{\anch_positions_set_action{\currentpositionanchor}{\noexpand\getvalue{\??positioncleanup\currentpositionanchor}}}% \let#1\relax \ifcsname\??positioncleanup\currentpositionanchor\endcsname \setxvalue{\??positioncleanup\currentpositionanchor}% @@ -140,9 +140,6 @@ \fi \fi\fi} -% \def\anch_positions_register_page_indeed#1% -% {\setbox#1\hbox{\hpos\pageanchor{\box#1}}} - \def\anch_positions_register_page_indeed#1% maybe like text {\ifvbox#1\setbox#1\hbox{\box#1}\fi \anch_make_page_box{#1}} @@ -218,7 +215,6 @@ %D \typebuffer[graphic] \def\MPanchoridentifier{mpa} % {mp-anchor} -%def\MPoverlayposprefix{MO::} % not used %D The rest of the definitions concerning such overlays may %D look complicated, @@ -237,8 +233,8 @@ \def\textbackgroundoverlay#1{\v!text#1} \def\MPanchornumber {\the\realpageno} -\def\positionoverlay % the test prevents too many redundant positions - {\ifpositioning % in (not used) text* position layers +\unexpanded\def\positionoverlay % the test prevents too many redundant positions + {\ifpositioning % in (not used) text* position layers \expandafter\anch_positions_overlay_indeed \else % also \iftrialtypesetting test here? \expandafter\gobbleoneargument @@ -269,7 +265,7 @@ \box\scratchbox \vfill}} -\def\positionregionoverlay % shares regions +\unexpanded\def\positionregionoverlay % shares regions {\ifpositioning \expandafter\anch_positions_region_overlay_indeed \else % also \iftrialtypesetting test here? @@ -308,9 +304,15 @@ \expandafter\anch_positions_overlay_start_yes \fi} +\let\stoppositionoverlay\relax + \def\anch_positions_overlay_start_nop#1\stoppositionoverlay {} +\ifdefined\checkpositionoverlays \else \let\checkpositionoverlays\relax \fi + +\let\currentpositionoverlay\empty + \def\anch_positions_overlay_start_yes#1% {\checkpositionoverlays \edef\currentpositionoverlay{#1}} @@ -318,9 +320,11 @@ \unexpanded\def\stoppositionoverlay {\let\currentpositionoverlay\empty} +% needs checking if still needed +% % \def\resetpositionoverlay#1% -% {\dosetpositionaction{#1::\MPanchoridentifier::}{}} - +% {\anch_positions_set_action{#1::\MPanchoridentifier::}{}} +% % \def\handlepositionboxes#1#2#3% % {\handlepositionaction\dohandlepositionboxes\with{#1}{#2}{#3}\on{#2}} % @@ -332,15 +336,15 @@ % \appendtoks % \let\dohandlepositionboxes\doinsertpositionboxes % was handle ? % \to \everyinsertpositionaction - -\def\docleanpositionboxes#1#2#3% pos tag setups - {\ifnum\MPp{#1}<\realpageno \else - \noexpand \dohandlepositionboxes{#1}{#2}{#3}% reinsert - \fi} - -\appendtoks - \let\dohandlepositionboxes\docleanpositionboxes -\to \everycleanpositionaction +% +% \def\docleanpositionboxes#1#2#3% pos tag setups +% {\ifnum\MPp{#1}<\realpageno \else +% \noexpand \dohandlepositionboxes{#1}{#2}{#3}% reinsert +% \fi} +% +% \appendtoks +% \let\dohandlepositionboxes\docleanpositionboxes +% \to \everycleanpositionaction %D A position graphic is a normal (non||reused) \METAPOST\ %D graphic, used immediately, with zero dimensions, so that a @@ -350,7 +354,7 @@ \installcorenamespace{positionmethod} %installcorenamespace{graphicvariable} -\newbox\positiongraphicbox +\newbox\b_anch_positions_graphic \def\startMPpositiongraphic % id setups {\dodoublegroupempty\anch_positions_meta_graphic_start} @@ -375,7 +379,7 @@ \startMPcode#3\stopMPcode \endgroup} -\def\MPpositiongraphic +\unexpanded\def\MPpositiongraphic {\dodoublegroupempty\anch_positions_meta_graphic_direct} \def\anch_positions_meta_graphic_direct#1% tag setups @@ -402,9 +406,9 @@ \anch_positions_meta_graphic_prepare \obeyMPboxorigin % do we also set the size ? when needed this must be done in mp ... might change \def\anch_positions_meta_graphic_direct{\anch_positions_meta_graphic_nested{#3}}% takes two extra arguments - \setbox\positiongraphicbox\hbox{\ignorespaces\csname#1#2\endcsname\removelastspace}% - \smashbox\positiongraphicbox - \box\positiongraphicbox + \setbox\b_anch_positions_graphic\hbox{\ignorespaces\csname#1#2\endcsname\removelastspace}% + \smashbox\b_anch_positions_graphic + \box\b_anch_positions_graphic \endgroup} \def\anch_positions_meta_graphic_nested#1#2#3% nesting used in prikkels / pascal (might go away) @@ -422,73 +426,72 @@ %D Simple one position graphics. -\def\setMPpositiongraphic - {\dotriplegroupempty\dosetMPpositiongraphic} +\unexpanded\def\setMPpositiongraphic + {\dotriplegroupempty\anch_positions_meta_graphic_set} -\def\dosetMPpositiongraphic#1#2#3% pos tag vars +\def\anch_positions_meta_graphic_set#1#2#3% pos tag vars {\ifx\currentpositionoverlay\empty - \dosetpositionaction{#1}{\MPpositiongraphic{#2}{#3}}% + \anch_positions_set_action{#1}{\MPpositiongraphic{#2}{#3}}% \else % silly can be one - \handlepositiongraphics{#1}{#2}{#3}% + \anch_positions_meta_graphic_handle{#1}{#2}{#3}% \fi} -\def\handlepositiongraphics#1#2#3% combine with boxes - {\handlepositionaction\dohandleMPpositiongraphic\with{#1}{#2}{#3}\on{#2}} +\def\anch_positions_meta_graphic_handle#1#2#3% combine with boxes + {\handlepositionaction\anch_positions_meta_graphic_handle_indeed\with{#1}{#2}{#3}\on{#2}} -\def\doinsertMPpositiongraphic#1#2#3% pos tag setups +\def\anch_positions_meta_graphic_insert#1#2#3% pos tag setups {\ifnum\MPp{#1}=\realpageno\relax % extra saveguard \def\currentposition{#1}\MPpositiongraphic{#2}{#3}% \fi} \appendtoks - \let\dohandleMPpositiongraphic\doinsertMPpositiongraphic + \let\anch_positions_meta_graphic_handle_indeed\anch_positions_meta_graphic_insert \to \everyinsertpositionaction -\def\docleanMPpositiongraphic#1#2#3% pos tag setups +\def\anch_positions_meta_graphic_cleanup#1#2#3% pos tag setups {\ifnum\MPp{#1}<\realpageno \else - \noexpand\dohandleMPpositiongraphic{#1}{#2}{#3}% + \noexpand\anch_positions_meta_graphic_handle_indeed{#1}{#2}{#3}% \fi} \appendtoks - \let\dohandleMPpositiongraphic\docleanMPpositiongraphic + \let\anch_positions_meta_graphic_handle_indeed\anch_positions_meta_graphic_cleanup \to \everycleanpositionaction %D Graphics that span two positions (beware, does not cross pages). \unexpanded\def\setMPpositiongraphicrange - {\doquadruplegroupempty\dosetMPpositiongraphicrange} + {\doquadruplegroupempty\anch_positions_meta_graphic_set_range} -\def\dosetMPpositiongraphicrange#1#2#3#4% bpos epos tag vars +\def\anch_positions_meta_graphic_set_range#1#2#3#4% bpos epos tag vars {\ifx\currentpositionoverlay\empty - \dosetpositionaction{#1}{\MPpositiongraphic{#3}{#4}}% + \anch_positions_set_action{#1}{\MPpositiongraphic{#3}{#4}}% \else - \handlepositiongraphicsrange{#1}{#2}{#3}{#4}% + \anch_positions_meta_graphic_handle_range{#1}{#2}{#3}{#4}% \fi} -\def\handlepositiongraphicsrange#1#2#3#4% - {\handlepositionaction\dohandleMPpositiongraphicrange\with{#1}{#2}{#3}{#4}\on{#2}} +\def\anch_positions_meta_graphic_handle_range#1#2#3#4% + {\handlepositionaction\anch_positions_meta_graphic_handle_range_indeed\with{#1}{#2}{#3}{#4}\on{#2}} -\def\doinsertMPpositiongraphicrange#1#2#3#4% pos pos tag setups +\def\anch_positions_meta_graphic_insert_range#1#2#3#4% pos pos tag setups {\ctxcommand{doifelserangeonpage("#1","#2",\number\realpageno)}% - {%\writestatus{YES}{#1/#2 => #3}% - \def\currentposition{#1}% + {\def\currentposition{#1}% \MPpositiongraphic{#3}{#4}}% - {}}%\writestatus{NOP}{#1/#2 = #3}}} + {}} \appendtoks - \let\dohandleMPpositiongraphicrange\doinsertMPpositiongraphicrange + \let\anch_positions_meta_graphic_handle_range_indeed\anch_positions_meta_graphic_insert_range \to \everyinsertpositionaction -\def\docleanMPpositiongraphicrange#1#2#3#4% pos tag setups +\def\anch_positions_meta_graphic_cleanup_range#1#2#3#4% pos tag setups {\ifnum\MPp{#2}<\realpageno \else - \noexpand \dohandleMPpositiongraphicrange{#1}{#2}{#3}{#4}% + \noexpand \anch_positions_meta_graphic_handle_range_indeed{#1}{#2}{#3}{#4}% \fi} \appendtoks - \let\dohandleMPpositiongraphicrange\docleanMPpositiongraphicrange + \let\anch_positions_meta_graphic_handle_range_indeed\anch_positions_meta_graphic_cleanup_range \to \everycleanpositionaction -\let\dohandleMPpositiongraphicrange\gobblefourarguments +\let\anch_positions_meta_graphic_handle_range_indeed\gobblefourarguments % Helpers: diff --git a/tex/context/base/anch-tab.mkiv b/tex/context/base/anch-tab.mkiv index 4bdaa2ef9..1b90d2476 100644 --- a/tex/context/base/anch-tab.mkiv +++ b/tex/context/base/anch-tab.mkiv @@ -350,13 +350,13 @@ \def\remappositionframed#1#2% from to {\copyposition{b:#1}{b:#2}% \copyposition{e:#1}{e:#2}% - \dosetpositionaction{b:#2}{\dopositionaction{b:#1}}} + \anch_positions_set_action{b:#2}{\dopositionaction{b:#1}}} \unexpanded\def\definepositionframed {\dodoubleargument\dodefinepositionframed} \def\dodefinepositionframed[#1][#2]% - {\dosetpositionaction{b:#1}{\dopositionframed[#1][#2]}} + {\anch_positions_set_action{b:#1}{\dopositionframed[#1][#2]}} \unexpanded\def\positionframed {\bgroup diff --git a/tex/context/base/bibl-tra.mkiv b/tex/context/base/bibl-tra.mkiv index 3531703ad..7cef23d88 100644 --- a/tex/context/base/bibl-tra.mkiv +++ b/tex/context/base/bibl-tra.mkiv @@ -1484,8 +1484,6 @@ %D And some defaults are loaded from bibl-apa: -\def\c!monthconversion{monthconversion} % todo - \setuppublications [\c!monthconversion=, \c!alternative=apa, diff --git a/tex/context/base/cont-new.mkii b/tex/context/base/cont-new.mkii index 52c3f024d..550e96d39 100644 --- a/tex/context/base/cont-new.mkii +++ b/tex/context/base/cont-new.mkii @@ -11,7 +11,7 @@ %C therefore copyrighted by \PRAGMA. See mreadme.pdf for %C details. -\newcontextversion{2012.06.22 13:11} +\newcontextversion{2012.06.25 14:10} %D This file is loaded at runtime, thereby providing an %D excellent place for hacks, patches, extensions and new diff --git a/tex/context/base/cont-new.mkiv b/tex/context/base/cont-new.mkiv index f902d6937..dfa96f3ec 100644 --- a/tex/context/base/cont-new.mkiv +++ b/tex/context/base/cont-new.mkiv @@ -11,7 +11,7 @@ %C therefore copyrighted by \PRAGMA. See mreadme.pdf for %C details. -\newcontextversion{2012.06.22 13:11} +\newcontextversion{2012.06.25 14:10} %D This file is loaded at runtime, thereby providing an %D excellent place for hacks, patches, extensions and new diff --git a/tex/context/base/context-version.pdf b/tex/context/base/context-version.pdf Binary files differindex 1e567e2f1..f40eac204 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 742fef507..3c16bda9e 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 3fa3c60f7..a44f68a57 100644 --- a/tex/context/base/context.mkii +++ b/tex/context/base/context.mkii @@ -20,7 +20,7 @@ %D your styles an modules. \edef\contextformat {\jobname} -\edef\contextversion{2012.06.22 13:11} +\edef\contextversion{2012.06.25 14:10} %D For those who want to use this: diff --git a/tex/context/base/context.mkiv b/tex/context/base/context.mkiv index 380a52d6d..b29e5511f 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.22 13:11} +\edef\contextversion{2012.06.25 14:10} %D For those who want to use this: @@ -107,9 +107,10 @@ \loadmarkfile{mult-ini} \loadmarkfile{mult-sys} +\loadmarkfile{mult-aux} \loadmarkfile{mult-def} \loadmarkfile{mult-chk} -\loadmarkfile{mult-aux} +%loadmarkfile{mult-aux} % moved up \loadmkvifile{mult-dim} \loadmarkfile{cldf-int} % interface @@ -148,7 +149,7 @@ \loadmarkfile{supp-box} -\loadmarkfile{supp-vis} +%loadmarkfile{supp-vis} % replaced by trac-vis \loadmarkfile{supp-fun} % close to obsolete \loadmarkfile{supp-ran} @@ -347,7 +348,7 @@ \loadmarkfile{font-tra} \loadmarkfile{font-uni} \loadmkvifile{font-col} -\loadmarkfile{font-gds} +\loadmkvifile{font-gds} \loadmarkfile{lxml-css} @@ -355,6 +356,8 @@ \loadmarkfile{blob-ini} % not to be used, we only use a helper +\loadmarkfile{trac-vis} + \loadmarkfile{typo-cln} \loadmarkfile{typo-spa} \loadmarkfile{typo-krn} @@ -419,7 +422,7 @@ \loadmarkfile{core-fnt} \loadmarkfile{node-rul} -\loadmarkfile{font-sol} % font solutions +\loadmkvifile{font-sol} % font solutions \loadmkvifile{strc-not} \loadmkvifile{strc-lnt} diff --git a/tex/context/base/font-gds.mkiv b/tex/context/base/font-gds.mkvi index 2305a0edd..d4760a470 100644 --- a/tex/context/base/font-gds.mkiv +++ b/tex/context/base/font-gds.mkvi @@ -37,8 +37,8 @@ \definesystemattribute[colorscheme][public] -\unexpanded\def\loadfontgoodies[#1]% - {\ctxcommand{loadfontgoodies("#1")}} +\unexpanded\def\loadfontgoodies[#filename]% + {\ctxcommand{loadfontgoodies("#filename")}} \unexpanded\def\setfontcolorscheme % will move to the lua end {\ctxcommand{enablefontcolorschemes()}% diff --git a/tex/context/base/font-pre.mkiv b/tex/context/base/font-pre.mkiv index 141bfd2ff..e5999df14 100644 --- a/tex/context/base/font-pre.mkiv +++ b/tex/context/base/font-pre.mkiv @@ -171,6 +171,22 @@ \definecolor[font:mark][r=.75,b=.75] % [m=.75] \definecolor[font:rest][g=.75,b=.75] % [c=.75] +\definecolor[trace:r][r=.75,t=.5,a=1] +\definecolor[trace:g][g=.75,t=.5,a=1] +\definecolor[trace:b][b=.75,t=.5,a=1] +\definecolor[trace:c][c=.75,t=.5,a=1] +\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:dr][r=.75,t=.75,a=1] +\definecolor[trace:dg][g=.75,t=.75,a=1] +\definecolor[trace:db][b=.75,t=.75,a=1] +\definecolor[trace:dc][c=.75,t=.75,a=1] +\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] + %D Now we're up to some definitions. \definebodyfontenvironment diff --git a/tex/context/base/font-sol.mkiv b/tex/context/base/font-sol.mkvi index d2808feb2..b40e37ced 100644 --- a/tex/context/base/font-sol.mkiv +++ b/tex/context/base/font-sol.mkvi @@ -93,8 +93,8 @@ })} \to \everydefinefontsolution -\unexpanded\def\setfontsolution[#1]% just one - {\edef\currentfontsolution{#1}% +\unexpanded\def\setfontsolution[#solution]% just one + {\edef\currentfontsolution{#solution}% \ctxcommand{setfontsolution("\currentfontsolution",{ method = "\fontsolutionparameter\c!method", criterium = "\fontsolutionparameter\c!criterium", diff --git a/tex/context/base/grph-fig.mkiv b/tex/context/base/grph-fig.mkiv index 6935ebe7e..55264dd0c 100644 --- a/tex/context/base/grph-fig.mkiv +++ b/tex/context/base/grph-fig.mkiv @@ -11,350 +11,198 @@ %C therefore copyrighted by \PRAGMA. See mreadme.pdf for %C details. -% ex => ef with proper parent - -\writestatus{loading}{ConTeXt Graphic Macros / Figure Handling} - \unprotect -\installcorenamespace{externalfigureinstance} -\installcorenamespace{externalfigurecollection} - -\newtoks\everysetupexternalfigures % todo: command handler - -\unexpanded\def\setupexternalfigures - {\dosingleempty\dosetupexternalfigures} - -\def\dosetupexternalfigures[#1]% - {\getparameters[\??ef][#1]% local settings - \getparameters[\??ex][#1]% global settings - \the \everysetupexternalfigures} - -\appendtoks - \setfigurepathlist % the path may be used elsewhere too (as in x-res-04) -\to \everysetupexternalfigures - -\appendtoks - \ctxcommand{setfigurelookuporder("\@@exorder")}% -\to \everysetupexternalfigures - -\presetlocalframed[\??ef] +%D Used in the styledesign manual: +% +% beware in mkiv we don't have the typeset- prefix +% +% \setbuffer[typeset-b]\endbuffer +% \setbuffer[typeset-a]\endbuffer +% +% todo: +% +% \appendtoks \setbuffer[typeset-b]\endbuffer\to \everystarttext +% \appendtoks \setbuffer[typeset-a]\endbuffer\to \everystarttext -\newconditional\externalfigurelevel % true=background false=normal -\newconditional\externalfigureflush % true=place false=ignore +\newcount\c_grph_buffers_n -\setfalse\externalfigurelevel -\settrue \externalfigureflush +\let\m_grph_buffers_filename\empty -\def\doplaceexternalfigure[#1][#2][#3][#4][#5]% - {\doifsomething{#2}% catches \defineexternalfigure dummies - {\ifcsname\??externalfigureinstance#2\endcsname - \doifelse{#1}{#2} - {\dodoplaceexternalfigure[#1][#2][#3][#4][#5]} - {\getvalue{\??externalfigureinstance#2}[#5]}% - \else - \dodoplaceexternalfigure[#1][#2][#3][#4][#5]% - \fi}} +\unexpanded\def\typesetbuffer + {\dodoubleempty\grph_buffers_typeset} -\ifdefined\dotagfigure \else \let\dotagfigure\relax \fi +\def\grph_buffers_typeset[#1][#2]% beware: this will mix up the mp graphics + {\ifsecondargument + \grph_buffers_typeset_indeed[#1][#2]% + \else\iffirstargument + \doifassignmentelse{#1} + {\grph_buffers_typeset_indeed[\jobname][#1]}% + {\grph_buffers_typeset_indeed[#1][]}% + \else + \grph_buffers_typeset_indeed[\jobname][] + \fi\fi} -\def\dodoplaceexternalfigure[#1][#2][#3][#4][#5]% +\def\grph_buffers_typeset_indeed[#1][#2]% we could use the via files {\bgroup - \dostarttagged\t!image\empty - \let\textunderscore\letterunderscore % {\string _} % space needed as _ is now letter in unprotected mode - \calculateexternalfigure[][#1][#2][#3][#4][#5]% [] is dummy dwcomp - \dotagfigure - \naturalvbox attr \imageattribute 2 {\box\foundexternalfigure}% - \dostoptagged + \global\advance\c_grph_buffers_n\plusone + \edef\m_grph_buffers_filename{\jobname-buffer-\the\c_grph_buffers_n}% + \ctxcommand{runbuffer("\m_grph_buffers_filename.tmp","#1",true)}% + \externalfigure[\m_grph_buffers_filename.pdf][#2]% \egroup} -\def\externalfigurereplacement#1#2#3% - {\normalexpanded{\localframed - [\??ef] - [\c!width=\figurewidth, - \c!height=\figureheight, - \c!background=\v!color, - \c!backgroundcolor=missingfigurecolor, - \c!frame=\@@efframe]}% we need to expand this in order to prevent a loop - {\tt\tfxx \nohyphens - name: \expanded{\verbatimstring{#1}}\\% - file: \expanded{\verbatimstring{#2}}\\% - state: \expanded{\verbatimstring{#3}}}} - -\definecolor[missingfigurecolor][s=.8] - -\def\externalfigureplaceholder#1#2#3% - {\localframed - [\??ef] - [\c!width=#2, - \c!height=#3, - \c!frame=\v!on]% - {\tt\tfxx \nohyphens - name: \expanded{\verbatimstring{#1}}\\% - state: \expanded{\verbatimstring{placeholder}}}} - -% new: more convenient/efficient than -% -% \use..[a][a][setting] \externalfigure[b][a] -% -% is equivalent to: -% -% \def..[a][setting] \externalfigure[b][a] -% -% see x-res modules for usage: +% For manuals and such: % -% \defineexternalfigure[name][settings] - -\unexpanded\def\defineexternalfigure - {\dodoubleargument\dodefineexternalfigure} - -\def\dodefineexternalfigure[#1][#2]% - {\setvalue{\??externalfigureinstance#1}{\doplaceexternalfigure[#1][][][#2]}} - -% \useexternalfigure[alpha][koe] -% \useexternalfigure[beta] [koe] [breedte=1cm] -% \useexternalfigure[gamma][koe][alpha] -% \useexternalfigure[delta][koe][alpha][breedte=2cm] +% \definetypesetting [name] [options] [settings-a] % -% volle breedte: \externalfigure[koe] \par -% 3cm breed: \externalfigure[koe] [breedte=3cm] \par -% volle breedte: \externalfigure[alpha] \par -% 1cm breed: \externalfigure[beta] \par -% volle breedte: \externalfigure[gamma] \par -% 2cm breed: \externalfigure[delta] \par -% 4cm breed: \externalfigure[beta] [breedte=4cm] \par -% 5cm breed: \externalfigure[gamma][breedte=5cm] \par - -% \defineexternalfigure[a][width=10cm] -% \defineexternalfigure[b][width=5cm] -% \externalfigure[cow][a] -% \externalfigure[cow][b][height=8cm] - -% \useexternalfigure[x][cow][width=10cm,height=1cm] -% \externalfigure[x] -% \externalfigure[x][width=3cm] +% \typesetfile [name] [file] [settings-b] +% \typesetfile [file] [options] [settings-b] +% \typesetfile [file] [settings-b] +% \typesetfile [file] % -% [label] [filename] -% [label] [filename] [parent] -% [label] [filename] [parent] [settings] -% [label] [filename] [settings] - -\def\useexternalfigure - {\doquadrupleempty\douseexternalfigure} - -\def\douseexternalfigure[#1][#2][#3][#4]% - {\doifelsenothing{#1} - {\doifsomething{#2} - {\doifassignmentelse{#3} - {\dodouseexternalfigure{#2}{#2}{#3}{#4}} - {\dodouseexternalfigure{#2}{#2}{}{#4}}}} - {\doifelsenothing{#2} - {\doifassignmentelse{#3} - {\dodouseexternalfigure{#1}{#1}{}{#3}} - {\dodouseexternalfigure{#1}{#1}{#3}{#4}}} - {\doifassignmentelse{#3} - {\dodouseexternalfigure{#1}{#2}{}{#3}} - {\dodouseexternalfigure{#1}{#2}{#3}{#4}}}}} - -\def\dodouseexternalfigure#1#2#3#4% - {\setvalue{\??externalfigureinstance#1}{\doplaceexternalfigure[#1][#2][#3][#4]}% - \doanalyzeexternalfigurecollection[#2][#4]} - -\newconditional\inexternalfigurecollection -\newdimen\xexternalfigurecollectionminwidth -\newdimen\xexternalfigurecollectionmaxwidth -\newdimen\xexternalfigurecollectionminheight -\newdimen\xexternalfigurecollectionmaxheight - -\def\doanalyzeexternalfigurecollection[#1][#2]% - {\ifconditional\inexternalfigurecollection - \setfalse\inexternalfigurecollection - \getfiguredimensions[#1][#2]% - \settrue\inexternalfigurecollection - \scratchdimen\naturalfigurewidth - \ifdim\scratchdimen>\xexternalfigurecollectionmaxwidth \xexternalfigurecollectionmaxwidth \scratchdimen \fi - \ifdim\scratchdimen<\xexternalfigurecollectionminwidth \xexternalfigurecollectionminwidth \scratchdimen \fi - \scratchdimen\naturalfigureheight - \ifdim\scratchdimen>\xexternalfigurecollectionmaxheight \xexternalfigurecollectionmaxheight\scratchdimen \fi - \ifdim\scratchdimen<\xexternalfigurecollectionminheight \xexternalfigurecollectionminheight\scratchdimen \fi - \fi} - -\unexpanded\def\startexternalfigurecollection[#1]% - {\begingroup - \def\currentexternalfigurecollection{#1}% - \settrue\inexternalfigurecollection - \xexternalfigurecollectionminwidth \maxdimen - \xexternalfigurecollectionmaxwidth \zeropoint - \xexternalfigurecollectionminheight\maxdimen - \xexternalfigurecollectionmaxheight\zeropoint} - -\unexpanded\def\stopexternalfigurecollection - {\setxvalue{\??externalfigurecollection\currentexternalfigurecollection:\c!minwidth }{\the\xexternalfigurecollectionminwidth }% - \setxvalue{\??externalfigurecollection\currentexternalfigurecollection:\c!maxwidth }{\the\xexternalfigurecollectionmaxwidth }% - \setxvalue{\??externalfigurecollection\currentexternalfigurecollection:\c!minheight}{\the\xexternalfigurecollectionminheight}% - \setxvalue{\??externalfigurecollection\currentexternalfigurecollection:\c!maxheight}{\the\xexternalfigurecollectionmaxheight}% - \endgroup} - -\def\externalfigurecollectionparameter#1#2% - {\csname - \ifcsname\??externalfigurecollection#1:#2\endcsname - \??externalfigurecollection#1:#2% - \else - \s!empty - \fi - \endcsname} - -\def\externalfigurecollectionminwidth #1{\externalfigurecollectionparameter{#1}\c!minwidth } -\def\externalfigurecollectionmaxwidth #1{\externalfigurecollectionparameter{#1}\c!maxwidth } -\def\externalfigurecollectionminheight#1{\externalfigurecollectionparameter{#1}\c!minheight} -\def\externalfigurecollectionmaxheight#1{\externalfigurecollectionparameter{#1}\c!maxheight} - -\let\efcparameter\externalfigurecollectionparameter -\let\efcminwidth \externalfigurecollectionminwidth -\let\efcmaxwidth \externalfigurecollectionmaxwidth -\let\efcminheight\externalfigurecollectionminheight -\let\efcmaxheight\externalfigurecollectionmaxheight - -% \startexternalfigurecollection[name] -% \useexternalfigure[cow] [cow.pdf] -% \useexternalfigure[mill][mill.png] -% \stopexternalfigurecollection +% \enabletrackers[files.run] % \starttext -% \bTABLE -% \bTR -% \bTD \externalfigure[cow] [height=\externalfigurecollectionmaxheight{name}] \eTD -% \bTD \externalfigure[mill][height=\externalfigurecollectionmaxheight{name}] \eTD -% \eTR -% \eTABLE +% \typesetfile[oepsoeps.tex][width=10cm,frame=on] % \stoptext -\def\dosetefparameters#1#2#3% parent_id use_settings current_settings - {\doifelsenothing{#1} % inherit from parent - {\getparameters[\??ef][#2,#3]} - {\ifcsname\??externalfigureinstance#1\endcsname - \pushmacro\doplaceexternalfigure - \def\doplaceexternalfigure[##1][##2][##3][##4]{\getparameters[\??ef][##4,#2,#3]}% - \getvalue{\??externalfigureinstance#1}% - \popmacro\doplaceexternalfigure - \else - \getparameters[\??ef][#2,#3]% - \fi}} - -\unexpanded\def\externalfigure - {\dotripleempty\doexternalfigure} - -\def\doexternalfigure[#1][#2][#3]% [label][file][settings] | [file][settings] | [file][parent][settings] - {\bgroup % also catched #1 == empty ... scales nicer now - \ifcsname\??externalfigureinstance#1\endcsname - \doifassignmentelse{#2} - {\getvalue{\??externalfigureinstance#1}[#2]}% - {\getvalue{\??externalfigureinstance#1}[#3]}% - \else - \useexternalfigure[\s!dummy][#1][#2][#3]% - \getvalue{\??externalfigureinstance\s!dummy}[]% [] is dummy arg 5 - \fi - \globallet\currentresourcecomment\empty - \egroup} - -\def\resourcecomment#1% - {\gdef\currentresourcecomment{#1}} +\installcorenamespace{typesettingfile} -\unexpanded\def\startresourcecomment#1\stopresourcecomment - {\gdef\currentresourcecomment{#1}} +\unexpanded\def\definetypesetting{\dotripleempty\grph_typesetting_define} +\unexpanded\def\typesetfile {\dotripleempty\grph_typesetting_process} -\let\currentresourcecomment\empty +\def\grph_typesetting_define[#1][#2][#3]% <name> options settings-a + {\doifsomething{#1}{\setuvalue{\??typesettingfile#1}{\grph_typesetting_process_indeed{#2}{#3}}}} -\unexpanded\def\showexternalfigures % maybe run time command is better, but no core-run, unless figs-run ... - {%\writestatus\m!system{for \string\showexternalfigures\space see \truefilename{x-res-20}.tex} - \usemodule[res-20]% - \showexternalfigures} % so for the moment we do it this way +\def\grph_typesetting_process[#1][#2][#3]% <name> filename settings-b | filename options settings + {\ifcsname\??typesettingfile#1\endcsname + \csname\??typesettingfile#1\endcsname{#2}{#3}% + \else\ifthirdargument % filename options settings + \grph_typesetting_process_indeed{#2}{#3}{#1}{}% + \else\ifsecondargument % filename settings + \grph_typesetting_process_indeed{}{#2}{#1}{}% + \fi\fi\fi} -\unexpanded\def\overlayfigure#1% - {\externalfigure[#1][\c!width=\overlaywidth,\c!height=\overlayheight]} +\def\grph_typesetting_process_indeed#1#2#3#4% options settings-a filename settings-b + {\begingroup + \edef\m_typesetting_name{\cldcontext{job.files.context("#3","#1")}}% + \ifx\m_typesetting_name\empty \else + \expanded{\externalfigure[\m_typesetting_name]}[#2,#4]% + \fi + \endgroup} -%D Whatever +%D Whatever ... hardly used ... but historic ... needs checking ... +%D will probably become m-fig-nn.mkiv .. or I will extend it cq. clean +%D it up when I needed it. After all, it's documented in old manuals. -\newbox\colorbarbox +\newcount\c_grph_steps_reference +\newdimen\d_grph_steps_x +\newdimen\d_grph_steps_y +\newbox \b_grph_steps_colorbar -\unexpanded\def\makecolorbar[#1]% - {\def\docommand##1% - {\color[##1] - {\blackrule - [\c!width=2\emwidth, - \c!height=\exheight, - \c!depth=\zeropoint]}% - \endgraf}% - \global\setbox\colorbarbox\vbox - {\forgetall - \processcommalist[#1]\docommand}% - \global\setbox\colorbarbox\vbox - {\hskip2em\box\colorbarbox}% - \wd\colorbarbox\zeropoint} +\let\placestopfigure\relax \unexpanded\def\placestartfigure[#1][#2][#3]#4\placestopfigure[#5]% {\hbox - {\setbox0\hbox + {\setbox\scratchbox\hbox {\useexternalfigure[\s!dummy][#2][#3,#5]% \externalfigure[\s!dummy]}% - \calculateefsteps + \grph_steps_calculate \startpositioning - \def\referring(##1,##2)##3(##4,##5)##6[##7]% - {\position(##1,##2){\efgoto(##4,##5){\@@exframes}[##7]}}% - \def\marking(##1,##2)##3(##4,##5)##6[##7]% - {\position(##1,##2){\efthisis(##4,##5){\@@exframes}[##7]}}% - \def\remark{\efnocomment}% - \def\colorbar##1[##2]{}% - \position(0,0){\box0}% + \let\referring\grph_steps_one_referring + \let\marking \grph_steps_one_marking + \let\remark \grph_steps_one_remark + \let\colorbar \grph_steps_one_colorbar + \position(0,0){\box\scratchbox}% \linewidth\onepoint \setuppositioning [\c!unit=pt, - \c!xscale=\withoutpt\the\efxsteps, - \c!yscale=\withoutpt\the\efysteps, + \c!xscale=\withoutpt\the\d_grph_steps_x, + \c!yscale=\withoutpt\the\d_grph_steps_y, \c!factor=1]% \ignorespaces#4% - \def\referring(##1,##2)##3(##4,##5)##6[##7]% - {}% - \let\marking\referring - \def\remark{\efcomment\v!no}% - \def\colorbar##1[##2]{\makecolorbar[##2]}% + \let\referring\grph_steps_two_referring + \let\marking \grph_steps_two_marking + \let\remark \grph_steps_two_remark + \let\colorbar \grph_steps_two_colorbar \ignorespaces#4% \stoppositioning - \box\colorbarbox}} + \ifvoid\b_grph_steps_colorbar\else\box\b_grph_steps_colorbar\fi}} % not really needed -\def\dodostartfigure[#1][#2][#3]#4\stopfigure - {\doifelse\v!test\@@exoption +\unexpanded\def\grph_steps_one_referring(#1,#2)#3(#4,#5)#6[#7]% + {\position(#1,#2){\grph_steps_goto(#4,#5){\externalfiguresparameter\c!frames}[#7]}} + +\unexpanded\def\grph_steps_one_marking(#1,#2)#3(#4,#5)#6[#7]% + {\position(#1,#2){\grph_steps_this_is(#4,#5){\externalfiguresparameter\c!frames}[#7]}} + +\unexpanded\def\grph_steps_one_remark(#1,#2)#3(#4,#5)% (x,y)(h,b)[...]{tekst} + {\def\grph_steps_no_comment_indeed[##1]##2{}% + \dosingleempty\grph_steps_no_comment_indeed} + +\unexpanded\def\grph_steps_one_colorbar#1[#2]% + {} + +\unexpanded\def\grph_steps_two_referring(#1,#2)#3(#4,#5)#6[#7]% + {} + +\let\grph_steps_two_marking\grph_steps_two_referring + +\unexpanded\def\grph_steps_two_remark + {\grph_steps_comment\v!no} + +\unexpanded\def\grph_steps_two_colorbar#1[#2] + {\begingroup + \global\setbox\b_grph_steps_colorbar\vbox + {\forgetall + \processcommalist[#2]\grph_colorbar_make_step}% + \global\setbox\b_grph_steps_colorbar\vbox + {\hskip2\emwidth\box\b_grph_steps_colorbar}% + \global\wd\b_grph_steps_colorbar\zeropoint + \endgroup} + +\unexpanded\def\grph_colorbar_make_step#1% + {\blackrule[\c!color=#1,\c!width=2\emwidth,\c!height=\exheight,\c!depth=\zeropoint]% + \endgraf} + +\unexpanded\def\startfigure % could be done nicer + {\grabuntil{\e!stop\v!figure}\grph_steps_figure_process} + +\let\stopfigure\relax + +\def\grph_steps_figure_process#1% + {\dotripleargument\grph_steps_figure_process_indeed#1\stopfigure} + +\def\grph_steps_figure_process_indeed[#1][#2][#3]#4\stopfigure + {\doifelse{\externalfiguresparameter\c!option}\v!test {\teststartfigure[#1][#2][#3]#4\teststopfigure - \let\@@exframes\v!on} - {\let\@@exframes\v!off}% + \letexternalfiguresparameter\c!frames\v!on} + {\letexternalfiguresparameter\c!frames\v!off}% \setvalue{\??externalfigureinstance#1}% - {\dosingleempty{\placestartfigure[#1][#2][#3]#4\placestopfigure}}% - }% no longer \doifundefined{#1}{\setvalue{#1}{\getexternalfigure{#1}}}} + {\dosingleempty{\placestartfigure[#1][#2][#3]#4\placestopfigure}}} -% De onderstaande macro mag niet zondermeer worden aangepast -% en is afgestemd op gebruik in de handleiding. +\let\teststopfigure\relax -\def\teststartfigure[#1][#2][#3]#4\teststopfigure% +\unexpanded\def\teststartfigure[#1][#2][#3]#4\teststopfigure {\begingroup - \setbox0\hbox + \setbox\scratchbox\hbox {\useexternalfigure[\s!dummy][#2][\c!wfactor=\v!max]% \externalfigure[\s!dummy]}% - \def\referring{\efmark}% - \def\marking{\efmark}% - \def\remark{\efcomment\v!yes}% - \def\colorbar##1[##2]{}% - \efreference\zerocount + \let\referring\grph_steps_three_referring + \let\marking \grph_steps_three_marking + \let\remark \grph_steps_three_remark + \let\colorbar \grph_steps_three_colorbar + \c_grph_steps_reference\zerocount \setbox0\vbox - {\hsize240pt + {\hsize240\points \startpositioning - \calculateefsteps + \grph_steps_calculate \position(0,0) - {\box0}% + {\box\scratchbox}% \position(0,0) {\basegrid - [\c!nx=\@@exxmax, - \c!dx=\withoutpt\the\efxsteps, - \c!ny=\@@exymax, - \c!dy=\withoutpt\the\efysteps, + [\c!nx=\externalfiguresparameter\c!xmax, + \c!dx=\withoutpt\the\d_grph_steps_x, + \c!ny=\externalfiguresparameter\c!ymax, + \c!dy=\withoutpt\the\d_grph_steps_y, \c!xstep=1, \c!ystep=1, \c!scale=1, @@ -362,18 +210,18 @@ \c!unit=pt]}% \setuppositioning [\c!unit=pt, - \c!xscale=\withoutpt\the\efxsteps, - \c!yscale=\withoutpt\the\efysteps, + \c!xscale=\withoutpt\the\d_grph_steps_x, + \c!yscale=\withoutpt\the\d_grph_steps_y, \c!factor=1]% \linewidth\onepoint \ignorespaces#4\relax \stoppositioning \vfill}% - \efreference\zerocount - \def\referring{\eftext{$\rightarrow$}}% - \def\marking{\eftext{$\leftarrow$}}% - \def\remark{\efnocomment}% - \def\colorbar##1[##2]{}% + \c_grph_steps_reference\zerocount + \let\referring\grph_steps_four_referring + \let\marking \grph_steps_four_marking + \let\remark \grph_steps_four_remark + \let\colorbar \grph_steps_four_colorbar \setbox2\vbox {{\tfa\doifelsenothing{#1}{#2}{#1}} \blank @@ -385,166 +233,149 @@ \ht0\ht2 \fi \hbox - {\hskip3em - \vtop{\vskip12pt\box0\vskip6pt}% - \vtop{\vskip12pt\box2\vskip6pt}}% + {\hskip3\emwidth + \vtop{\vskip12\points\box0\vskip6\points}% + \vtop{\vskip12\points\box2\vskip6\points}}% \endgroup} -\def\dodostartfigure[#1][#2][#3]#4\stopfigure - {\doifelse\v!test\@@exoption - {\teststartfigure[#1][#2][#3]#4\teststopfigure - \let\@@exframe\v!on} - {\let\@@exframe\v!off}% - \setvalue{\??externalfigureinstance#1}% - {\def\next{\placestartfigure[#1][#2][#3]#4\placestopfigure}% - \dosingleempty\next}% - }% no longer: \doifundefined{#1}{\setvalue{#1}{\getexternalfigure{#1}}}} +\unexpanded\def\grph_steps_three_referring(#1,#2)#3(#4,#5)#6[#7]% + {\advance\c_grph_steps_reference\plusone + \position(#1,#2) + {\hbox{\the\c_grph_steps_reference}}% + \position(#1,#2) + {\gotosomeinternal\s!vwb{#7}\realfolio + {\grph_steps_marker(#4,#5)\v!on{\thisissomeinternal\s!vwa{#7}}}}} -\long\def\dostartfigure#1% - {\dotripleargument\dodostartfigure#1\stopfigure} +\unexpanded\def\grph_steps_three_remark + {\grph_steps_comment\v!yes} -\unexpanded\def\startfigure - {\grabuntil{\e!stop\v!figure}\dostartfigure} - -%D NEW: used in styledesign manual +\let\grph_steps_three_marking \grph_steps_three_referring +\let\grph_steps_three_colorbar\grph_steps_one_colorbar -% beware in mkiv we don't have the typeset- prefix -% -% \setbuffer[typeset-b]\endbuffer -% \setbuffer[typeset-a]\endbuffer -% -% todo: -% -% \appendtoks \setbuffer[typeset-b]\endbuffer\to \everystarttext -% \appendtoks \setbuffer[typeset-a]\endbuffer\to \everystarttext +\unexpanded\def\grph_steps_four_referring + {\grph_steps_text{$\rightarrow$}} -\newcount\noftypesetbuffers +\unexpanded\def\grph_steps_four_marking + {\grph_steps_text{$\leftarrow$}} -\def\typesetbuffer - {\dodoubleempty\dotypesetbuffer} +\let\grph_steps_four_remark \grph_steps_one_remark +\let\grph_steps_four_colorbar\grph_steps_one_colorbar -\def\dotypesetbuffer[#1][#2]% beware: this will mix up the mp graphics - {\ifsecondargument - \dodotypesetbuffer[#1][#2]% - \else\iffirstargument - \doifassignmentelse{#1} - {\dodotypesetbuffer[\jobname][#1]}% - {\dodotypesetbuffer[#1][]}% +% Helpers: + +\def\grph_steps_calculate + {\ifnum0\externalfiguresparameter\c!xmax=\zerocount + \ifnum0\externalfiguresparameter\c!ymax=\zerocount + \setexternalfiguresparameter\c!ymax{24}% + \fi + \d_grph_steps_y\figureheight + \divide\d_grph_steps_y \externalfiguresparameter\c!ymax + \d_grph_steps_x\d_grph_steps_y + \scratchdimen\figurewidth + \advance\scratchdimen\d_grph_steps_y + \divide \scratchdimen\d_grph_steps_y + \setexternalfiguresparameter\c!xmax{\number\scratchdimen}% \else - \dodotypesetbuffer[\jobname][] - \fi\fi} + \d_grph_steps_x\figurewidth \divide\d_grph_steps_x \externalfiguresparameter\c!xmax\relax + \d_grph_steps_y\figureheight \divide\d_grph_steps_y \externalfiguresparameter\c!ymax\relax + \fi} -\def\dodotypesetbuffer[#1][#2]% +\def\grph_steps_comment#1(#2,#3)#4(#5,#6)% {kader}(x,y)(h,b)[...]{tekst} + {\def\grph_steps_comment_indeed[##1]##2% + {\position(#2,#3)% + {\setnostrut + \framed + [\c!width=#5\d_grph_steps_x, + \c!height=#6\d_grph_steps_y, + \c!offset=\v!none, + \c!frame=#1, + ##1]% + {##2}}}% + \dosingleempty\grph_steps_comment_indeed} + +% \def\grph_steps_figure#1% +% {\position(0,0){\getvalue{#1}}} + +\def\grph_steps_goto(#1,#2)#3[#4]% (h,b)kader[ref] + {\gotobox{\vbox{\grph_steps_area(#1,#2)#3{}}}[#4]} + +\def\grph_steps_text#1(#2,#3)#4(#5,#6)#7[#8]% + {\advance\c_grph_steps_reference\plusone + \hbox + {\quad + \thisissomeinternal\s!vwb + {#8}% + \gotosomeinternal\s!vwa{#8}\realfolio + {\hbox to 1.5em{\the\c_grph_steps_reference\presetgoto\hfill}}% + \quad#1 (#2,#3) (#5,#6) [#8]\hfill}% + \endgraf} + +\def\grph_steps_this_is(#1,#2)#3[#4]% + {\grph_steps_area(#1,#2){#3}{\pagereference[#4]}} + +\def\grph_steps_area(#1,#2)#3#4% (h,b){kader}{tekst} {\bgroup - \global\advance\noftypesetbuffers\plusone - \edef\bufferfilename{\jobname-buffer-\the\noftypesetbuffers}% - \ctxcommand{runbuffer("\bufferfilename.tmp","#1",true)}% - \externalfigure[\bufferfilename.pdf][#2]% + \setnostrut + \framed + [\c!width=#1\d_grph_steps_x, + \c!height=#2\d_grph_steps_y, + \c!offset=\zeropoint, + \c!frame=#3] + {#4}% \egroup} -\def\dodotypesetbufferindeed#1% - {} +\def\grph_steps_marker(#1,#2)#3#4% (h,b){kader}{tekst} + {\framed + [\c!width=#1\d_grph_steps_x, + \c!height=#2\d_grph_steps_y, + \c!offset=\v!none, + \c!frame=#3]% + {#4}} + +\protect \endinput -% for me only (manuals and such) +% \startbuffer +% \definecolor [blue] [c=1,m=.38,y=0,k=.64] +% \definecolor [yellow] [c=0,m=.28,y=1,k=.06] % -% \definetypesetting [name] [options] [settings-a] +% \definespotcolor [blue-100] [blue] [p=1] +% \definespotcolor [yellow-100] [yellow] [p=1] % -% \typesetfile [name] [file] [settings-b] -% \typesetfile [file] [options] [settings-b] -% \typesetfile [file] [settings-b] -% \typesetfile [file] +% \definemultitonecolor [combicolor] [blue=.12,yellow=.28] [c=.1,m=.1,y=.3,k=.1] % -% \enabletrackers[files.run] -% \starttext -% \typesetfile[oepsoeps.tex][width=10cm,frame=on] -% \stoptext - -\installcorenamespace{typesettingfile} - -\unexpanded\def\definetypesetting{\dotripleempty\dodefinetypesetting} -\unexpanded\def\typesetfile {\dotripleempty\dotypesetfile} - -\def\dodefinetypesetting[#1][#2][#3]% <name> options settings-a - {\doifsomething{#1}{\setvalue{\??typesettingfile#1}{\dodotypesetfile{#2}{#3}}}} - -\def\dotypesetfile[#1][#2][#3]% <name> filename settings-b | filename options settings - {\ifcsname\??typesettingfile#1\endcsname - \csname\??typesettingfile#1\endcsname{#2}{#3}% - \else\ifthirdargument % filename options settings - \dodotypesetfile{#2}{#3}{#1}{}% - \else\ifsecondargument % filename settings - \dodotypesetfile{}{#2}{#1}{}% - \fi\fi\fi} - -\def\dodotypesetfile#1#2#3#4% options settings-a filename settings-b - {\edef\typesetfilename{\ctxlua{tex.write(job.files.context("#3","#1"))}}% - \expanded{\externalfigure[\typesetfilename]}[#2,#4]} - -\setupexternalfigures - [\c!option=, - \c!object=\v!yes, % we only check for no - \c!reset=\v!no, - \c!interaction=\v!none, - \c!maxwidth=\@@efwidth, - \c!maxheight=\@@efheight, - \c!bodyfont=\bodyfontsize, - \c!directory=, - \c!radius=.5\bodyfontsize, - \c!corner=\v!rectangular, - \c!frame=\v!off, - \c!background=, % new - \c!splitcolor=\s!white, - \c!order=, - \c!conversion=, - \c!resolution=, - \c!prefix=, - \c!cache=, -% \c!grid=, - \c!equalwidth=, - \c!equalheight=, - \c!location={\v!local,\v!global}] - -\setupexternalfigures - [\c!frames=\v!off, - \c!ymax=24, - \c!xmax=] - -\useexternalfigure - [buffer] [\jobname.buffer] [\c!object=\v!no] - -\protect \endinput - -% alternative for positioning - -% \definelayer[figure][width=\overlaywidth,height=\overlayheight] -% \defineoverlay[figure][{\directsetup{figure}\tightlayer[figure]}] - -% \setupcolors[state=start] - -% \starttext - -% \startsetups figure -% \setlayerframed[figure][preset=rightbottom,x=.25\layerwidth,y=.25\layerheight]{HERE} -% \setlayerframed[figure][preset=leftbottom, x=.15\layerwidth,y=.35\layerheight]{THERE} -% \stopsetups - -% \externalfigure[cow][background={foreground,figure},width=4cm,height=8cm] - -% \startsetups figure -% \setlayerframed[figure][preset=righttop,x=.25\layerwidth,y=.25\layerheight]{MORE} -% \setlayerframed[figure][preset=middle,foregroundcolor=green]{EVEN MORE} -% \stopsetups - -% \externalfigure[cow][background={foreground,figure},width=14cm,height=2cm] - -% \defineexternalfigure[whatever][background={foreground,figure}] - -% \startsetups figure -% \setlayerframed[figure][preset=righttop,x=.25\layerwidth,y=.25\layerheight]{\red MORE} -% \setlayerframed[figure][preset=middle,foregroundcolor=green]{EVEN MORE} -% \stopsetups - -% \externalfigure[cow][whatever][width=14cm,height=4cm] - -% \stoptext - +% \definemultitonecolor [combicolor-b] [blue=1] [c=1,m=.38,y=0,k=.64] % force multitone +% \definemultitonecolor [combicolor-y] [yellow=1] [c=0,m=.28,y=1,k=.06] % force multitone +% +% \useexternalfigure[demo-a][mill.png] [object=no,width=.2\textwidth] +% \useexternalfigure[demo-b][hacker-bw.jpg][object=no,width=.2\textwidth] +% +% \startbaselinecorrection \startcombination[4*1] +% {\externalfigure[demo-a]} {no color} +% {\externalfigure[demo-a][color=combicolor]} {indexed duotone} +% {\externalfigure[demo-a][color=combicolor-b]} {spot color} +% {\externalfigure[demo-a][color=combicolor-y]} {spot color} +% \stopcombination \stopbaselinecorrection +% +% \startbaselinecorrection \startcombination[4*1] +% {\externalfigure[demo-b]} {no color} +% {\externalfigure[demo-b][color=combicolor]} {indexed duotone} +% {\externalfigure[demo-b][color=combicolor-b]} {spot color} +% {\externalfigure[demo-b][color=combicolor-y]} {spot color} +% \stopcombination \stopbaselinecorrection +% +% \startbaselinecorrection \startcombination[4*1] +% {\externalfigure[demo-a]} {no color} +% {\externalfigure[demo-a][color=combicolor]} {indexed duotone} +% {\externalfigure[demo-a][color=blue-100]} {spot color} +% {\externalfigure[demo-a][color=yellow-100]} {spot color} +% \stopcombination \stopbaselinecorrection +% +% \startbaselinecorrection \startcombination[4*1] +% {\externalfigure[demo-b]} {no color} +% {\externalfigure[demo-b][color=combicolor]} {indexed duotone} +% {\externalfigure[demo-b][color=blue-100]} {spot color} +% {\externalfigure[demo-b][color=yellow-100]} {spot color} +% \stopcombination \stopbaselinecorrection +% \stopbuffer +% +% \getbuffer \typebuffer diff --git a/tex/context/base/grph-inc.mkiv b/tex/context/base/grph-inc.mkiv index 633130ea9..8c191e05e 100644 --- a/tex/context/base/grph-inc.mkiv +++ b/tex/context/base/grph-inc.mkiv @@ -13,14 +13,6 @@ \writestatus{loading}{ConTeXt Graphic Macros / Figure Inclusion} -%D todo: -%D -%D - color conversion -%D - alternative images -%D - a few more obscure things - -% use framedcommandhandler - \registerctxluafile{grph-inc}{1.001} \registerctxluafile{grph-fil}{1.001} \registerctxluafile{grph-u3d}{1.001} % this will change @@ -28,25 +20,263 @@ \unprotect -%D The following registers are used (if only to be downward compatible). +%D Including graphics is complicated by the fact that we need to locate them first, +%D optionally manipulate them and scale then next. Lookups are to be done as efficient +%D as possible and inclusion of the data might happens only once. In \MKIV\ much of this +%D is delegated to the \LUA\ end. There is nor so much less code as in \MKII\ but it's +%D more powerful, flexible, pluggable and some of the extended functionality has been +%D moved from modules to the core. The overall functionality is rather stable and has +%D not changed much over the years. + +\ifdefined\dotagfigure \else \let\dotagfigure\relax \fi + +\installcorenamespace{externalfigures} +\installcorenamespace{externalfigureinstance} +\installcorenamespace{externalfigurecollection} + +\installframedcommandhandler \??externalfigures {externalfigures} \??externalfigures + +\setupexternalfigures[% we really need the defaults + \c!method =, + \c!label =, + \c!size =, + \c!conversion =, + \c!resolution =, + \c!prefix =, + \c!cache =, + \c!page =\zerocount, + \c!display =, + \c!mask =, + \c!preset =\v!yes, + \c!split =, + \c!color =, + \c!symbol =\v!no, + \c!controls =\v!no, + \c!resources =, + \c!preview =\v!no + \c!repeat =\v!no + \c!foregroundcolor=, + \c!interaction =\v!none, + \c!hfactor =, + \c!wfactor =, + \c!factor =, + \c!maxwidth =\externalfiguresparameter\c!width, + \c!maxheight =\externalfiguresparameter\c!height, + \c!xscale =, + \c!yscale =, + \c!scale =, + \c!sx =1, + \c!sy =1, + \c!width =, + \c!height =, + \c!lines =, + \c!grid =, + \c!bodyfont =\bodyfontsize, + \c!object =\v!yes, + \c!corner =\v!rectangular, + \c!frame =\v!off, + \c!option =, + \c!reset =\v!no, + \c!directory =, + \c!radius =.5\bodyfontsize, + \c!background =, + \c!splitcolor =\s!white, + \c!order =, + \c!equalwidth =, + \c!equalheight =, + \c!location ={\v!local,\v!global}, + \c!frames =\v!off, + \c!ymax =24, + \c!xmax =, + ] + +%D Defining figures. + +\newcount\c_grph_include_nesting + +\newtoks \everyexternalfigureresets % for the moment still public +\newtoks \everyexternalfigurechecks % for the moment still public + +% \useexternalfigure[alpha][koe] +% \useexternalfigure[beta] [koe] [breedte=1cm] +% \useexternalfigure[gamma][koe][alpha] +% \useexternalfigure[delta][koe][alpha][breedte=2cm] +% +% volle breedte: \externalfigure[koe] \par +% 3cm breed: \externalfigure[koe] [breedte=3cm] \par +% volle breedte: \externalfigure[alpha] \par +% 1cm breed: \externalfigure[beta] \par +% volle breedte: \externalfigure[gamma] \par +% 2cm breed: \externalfigure[delta] \par +% 4cm breed: \externalfigure[beta] [breedte=4cm] \par +% 5cm breed: \externalfigure[gamma][breedte=5cm] \par +% +% \defineexternalfigure[a][width=10cm] +% \defineexternalfigure[b][width=5cm] +% \externalfigure[cow][a] +% \externalfigure[cow][b][height=8cm] +% +% \useexternalfigure[x][cow][width=10cm,height=1cm] +% \externalfigure[x] +% \externalfigure[x][width=3cm] +% +% [label] [filename] +% [label] [filename] [parent] +% [label] [filename] [parent] [settings] +% [label] [filename] [settings] +% +% new: more convenient/efficient than +% +% \use..[a][a][setting] \externalfigure[b][a] +% +% is equivalent to: +% +% \def..[a][setting] \externalfigure[b][a] +% +% see x-res modules for usage: +% +% \defineexternalfigure[name][settings] + +\unexpanded\def\defineexternalfigure + {\dodoubleargument\grph_include_define} + +\def\grph_include_define[#1][#2]% + {\setvalue{\??externalfigureinstance#1}{\grph_include_use[#1][][][#2]}} + +\def\useexternalfigure + {\doquadrupleempty\grph_include_use} + +\def\grph_include_use[#1][#2][#3][#4]% + {\doifelsenothing{#1} + {\doifsomething{#2} + {\doifassignmentelse{#3} + {\grph_include_use_indeed{#2}{#2}{#3}{#4}} + {\grph_include_use_indeed{#2}{#2}{}{#4}}}} + {\doifelsenothing{#2} + {\doifassignmentelse{#3} + {\grph_include_use_indeed{#1}{#1}{}{#3}} + {\grph_include_use_indeed{#1}{#1}{#3}{#4}}} + {\doifassignmentelse{#3} + {\grph_include_use_indeed{#1}{#2}{}{#3}} + {\grph_include_use_indeed{#1}{#2}{#3}{#4}}}}} + +\def\grph_include_use_indeed#1#2#3#4% + {\setvalue{\??externalfigureinstance#1}{\grph_include_place[#1][#2][#3][#4]}% + \grph_include_analyze_collection[#2][#4]} + +\def\grph_include_place[#1][#2][#3][#4][#5]% + {\doifsomething{#2}% catches \defineexternalfigure dummies + {\ifcsname\??externalfigureinstance#2\endcsname + \doifelse{#1}{#2} + {\grph_include_place_indeed[#1][#2][#3][#4][#5]} + {\csname\??externalfigureinstance#2\endcsname[#5]}% + \else + \grph_include_place_indeed[#1][#2][#3][#4][#5]% + \fi}} -\newbox \foundexternalfigure -\newif \ifskipexternalfigures -\newtoks \everyexternalfigureresets -\newtoks \everyexternalfigurechecks -\newtoks \externalfigurepostprocessors +\def\grph_include_place_indeed[#1][#2][#3][#4][#5]% + {\bgroup + \advance\c_grph_include_nesting\plusone + \edef\currentexternalfigures{\the\c_grph_include_nesting}% + \checkexternalfiguresparent % each inherits from the root + % + \dostarttagged\t!image\empty + % + \let\textunderscore\letterunderscore % {\string _} % space needed as _ is now letter in unprotected mode (probably no longer needed) + % + \dontcomplain + \restorecatcodes + \forgetall + % + \the\everyexternalfigureresets + % + \doifelsenothing{#3} % inherit from parent ... needs checking + {\setupcurrentexternalfigures[#4,#5]} + {\ifcsname\??externalfigureinstance#3\endcsname + \pushmacro\grph_include_place + \def\grph_include_place[##1][##2][##3][##4]{\setupcurrentexternalfigures[##4,#4,#5]}% + \csname\??externalfigureinstance#3\endcsname + \popmacro\grph_include_place + \else + \setupcurrentexternalfigures[#4,#5]% + \fi}% + % + \the\everyexternalfigurechecks + % + \ctxlua{figures.push { + name = "#2", + label = "#1", % todo: \@eflabel + page = "\externalfiguresparameter\c!page", + size = "\externalfiguresparameter\c!size", + object = "\externalfiguresparameter\c!object", + prefix = "\externalfiguresparameter\c!prefix", + cache = "\externalfiguresparameter\c!cache", + format = "\externalfiguresparameter\c!method", + preset = "\externalfiguresparameter\c!prefix", + controls = "\externalfiguresparameter\c!controls", + resources = "\externalfiguresparameter\c!resources", + preview = "\externalfiguresparameter\c!preview", + display = "\externalfiguresparameter\c!display", + mask = "\externalfiguresparameter\c!mask", + conversion = "\externalfiguresparameter\c!conversion", + resolution = "\externalfiguresparameter\c!resolution", + color = "\internalspotcolorparent{\externalfiguresparameter\c!color}", % hack is needed + ["repeat"] = "\externalfiguresparameter\c!repeat", + width = "\externalfiguresparameter\c!width", % can be crap + height = "\externalfiguresparameter\c!height", % can be crap + } }% + \ctxlua{figures.identify()}% + % also mode: checkpresense only + \ifconditional\c_grph_include_test_only + \ifcase\figurestatus \else + \ctxlua{figures.check()}% + \ctxlua{figures.dummy()}% + \ctxlua{figures.scale()}% + \ctxlua{figures.done()}% + \fi + \grph_include_set_mode + \else + \ifcase\figurestatus + \ctxlua{figures.dummy()}% + \ctxlua{figures.scale()}% + \else + \ctxlua{figures.check()}% + \ctxlua{figures.include()}% + \ctxlua{figures.scale()}% + \fi + \ctxlua{figures.done()}% + \grph_include_set_mode + \grph_include_finalize + \fi + \ctxlua{figures.pop()}% + % + \dotagfigure + \naturalvbox attr \imageattribute 2 {\box\foundexternalfigure}% + \dostoptagged + \egroup} -\def\resetfigurevariables {\the\everyexternalfigureresets} -\def\checkfigurevariables {\the\everyexternalfigurechecks} +%D Scaling: -%D Historic feature: +\let\dowithfigure\relax % name might change (into a proper hook) -\appendtoks - \global\let\externalfigurelog\empty -\to \everyexternalfigureresets +\unexpanded\def\doscalefigure % used at lua end + {\global\setbox\foundexternalfigure\vbox{\scale[\v!figure]{\dowithfigure{\box\foundexternalfigure}}}} -\let\runutilityfiletrue \relax \let\runutilityfilefalse \relax -\let\consultutilityfiletrue\relax \let\consultutilityfilefalse\relax +\definescale % some day we will inherit + [\v!figure] + [\c!hfactor =\externalfiguresparameter\c!hfactor, + \c!wfactor =\externalfiguresparameter\c!wfactor, + \c!factor =\externalfiguresparameter\c!factor, + \c!maxwidth =\externalfiguresparameter\c!maxwidth , + \c!maxheight=\externalfiguresparameter\c!maxheight, + \c!xscale =\externalfiguresparameter\c!xscale, + \c!yscale =\externalfiguresparameter\c!yscale, + \c!scale =\externalfiguresparameter\c!scale, + \c!sx =\externalfiguresparameter\c!sx, + \c!sy =\externalfiguresparameter\c!sy, + \c!width =\externalfiguresparameter\c!width, + \c!height =\externalfiguresparameter\c!height, + \c!lines =\externalfiguresparameter\c!lines] %D You can register additional suffixes with the following command: %D @@ -57,19 +287,22 @@ %D \stoptyping \unexpanded\def\definegraphictypesynonym - {\dodoubleargument\dodefinegraphictypesynonym} + {\dodoubleargument\grph_include_set_type_synonym} -\def\dodefinegraphictypesynonym[#1][#2]% +\def\grph_include_set_type_synonym[#1][#2]% {\ctxlua{figures.registersuffix("#1","#2")}} %D Additional paths can be installed with the regular setup command. The next %D macro picks up the list. -\def\setfigurepathlist - {\ctxlua{figures.setpaths("\@@exlocation",\!!bs\@@exdirectory\!!es)}} +\unexpanded\def\setfigurepathlist + {\ctxlua{figures.setpaths("\externalfiguresparameter\c!location",\!!bs\externalfiguresparameter\c!directory\!!es)}} %D Variables: +\newbox \foundexternalfigure +\newtoks\externalfigurepostprocessors + \def\defaultfigurewidth {8\lineheight} \def\defaultfigureheight {6\lineheight} @@ -112,209 +345,95 @@ \let\figurescalexscale \figurexscale \let\figurescaleyscale \figureyscale +%D The main command: + +\unexpanded\def\externalfigure + {\dotripleempty\grph_include_set_type_synonym} + +\def\grph_include_set_type_synonym[#1][#2][#3]% [label][file][settings] | [file][settings] | [file][parent][settings] + {\bgroup % also catched #1 == empty ... scales nicer now + \ifcsname\??externalfigureinstance#1\endcsname + \doifassignmentelse{#2} + {\csname\??externalfigureinstance#1\endcsname[#2]}% + {\csname\??externalfigureinstance#1\endcsname[#3]}% + \else + \useexternalfigure[\s!dummy][#1][#2][#3]% + \csname\??externalfigureinstance\s!dummy\endcsname[]% [] is dummy arg 5 + \fi + \egroup} + +%D Calculating: + +% \enabletrackers[figures.conversion] +% \externalfigure[demo.svg] +% \externalfigure[demo.svg][conversion=png] + +%D The following registers are used (if only to be downward compatible). + +\newconditional\c_grph_include_skip +\newconditional\c_grph_include_test_only +\newconditional\c_grph_include_level \setfalse\c_grph_include_level % true=background false=normal +\newconditional\c_grph_include_flush \settrue \c_grph_include_flush % true=place false=ignore + +\newsystemmode\v!figure + +\def\grph_include_set_mode + {\ifcase\figurestatus + \global\resetsystemmode\v!figure % todo, also: \v!resource + \else + \global\setsystemmode \v!figure % todo, also: \v!resource + \fi} + \appendtoks - \ctxlua { % figures.defaultwidth .. why not dimen - figures.setpaths("\@@exlocation","\@@exdirectory") ; + \ctxlua { % figures.defaultwidth .. maybe a dimen some day + figures.setpaths("\externalfiguresparameter\c!location","\externalfiguresparameter\c!directory") ; figures.defaultwidth = \number\dimexpr\defaultfigurewidth \relax ; figures.defaultheight = \number\dimexpr\defaultfigureheight\relax ; figures.boxnumber = \number\foundexternalfigure ; }% \to \everyexternalfigureresets -%D In some situations we need to make sure that the figure related variables -%D are reset. This is especially important when we are nesting. Is this still -%D needed in \MKIV. - -\def\resetexternalfigures - {\let\@@efoption \empty % \let\@@efprefix\empty - \let\@@efmaxwidth \empty % \let\@@efcache \empty - \let\@@efmaxheight \empty % \let\@@efframe \v!off - \let\@@efforegroundcolor\empty - \let\@@efcolor \empty - \let\@@efconversion \empty - \let\@@efbackground \empty - \let\@@efresolution \empty} - -\appendtoks \resetexternalfigures \to \everyoverlay -\appendtoks \resetexternalfigures \to \everybeforepagebody % not really needed - -\def\resetfigureusersettings % if we use a command handler we can simply define a new instance - {% - \let\@@efmethod \empty - \let\@@eflabel \empty - \let\@@efsize \empty - \let\@@efconversion\@@exconversion - \let\@@efresolution\@@exresolution - \let\@@efprefix \@@exprefix - \let\@@efcache \@@excache - \let\@@efpage \!!zerocount - \let\@@efobject \@@exobject - \let\@@efdisplay \empty - \let\@@efmask \empty - % - \let\@@efpreset \v!yes - \let\@@efsplit \empty - \let\@@efcolor \empty - % - \let\@@efsymbol \v!no - % - \let\@@efcontrols \v!no - \let\@@efresources \empty - \let\@@efpreview \v!no - \let\@@efrepeat \v!no - % - \let\@@efforegroundcolor\empty - % - \let\@@efinteraction\@@exinteraction - % - \let\@@efhfactor \empty - \let\@@efwfactor \empty - \let\@@effactor \empty - \let\@@efmaxwidth \@@exmaxwidth - \let\@@efmaxheight \@@exmaxheight - \let\@@efxscale \empty - \let\@@efyscale \empty - \let\@@efscale \empty - \let\@@efsx \!!plusone - \let\@@efsy \!!plusone - \let\@@efwidth \empty - \let\@@efheight \empty - \let\@@eflines \empty - \let\@@efgrid \empty} - -\resetfigureusersettings - -\appendtoks - \resetfigureusersettings -\to \everyexternalfigureresets - -\def\checkfigureusersettings - {% old features - \doif\@@exoption\v!frame - {\let\@@efframe\v!on}% - \doif\@@exoption\v!empty - {\skipexternalfigurestrue - \let\@@efframe\v!off}% - \doifsomething\@@efwidth {\doifdimensionelse\@@efwidth {\edef\@@efwidth {\the\dimexpr\@@efwidth }}\donothing}% - \doifsomething\@@efheight{\doifdimensionelse\@@efheight{\edef\@@efheight{\the\dimexpr\@@efheight}}\donothing}% - % fake color in gray bitmaps, assumes that - % a transparent color is used - \doifsomething\@@efforegroundcolor - {\def\@@efbackground{\v!foreground,\v!color}% - \def\@@efbackgroundcolor{\@@efforegroundcolor}}} - \appendtoks - \checkfigureusersettings + \edef\p_option{\externalfiguresparameter\c!option}% + \ifx\p_option\v!frame + \setfalse\c_grph_include_skip + \letexternalfiguresparameter\c!frame\v!on + \else\ifx\p_option\v!empty + \settrue\c_grph_include_skip + \letexternalfiguresparameter\c!frame\v!off + \else + \setfalse\c_grph_include_skip + \fi\fi + % fake color in gray bitmaps, assumes that + % a transparent color is used + \edef\p_foregroundcolor{\externalfiguresparameter\c!foregroundcolor}% + \ifx\p_foregroundcolor\empty \else + \setexternalfiguresparameter\c!background{\v!foreground,\v!color}% + \letexternalfiguresparameter\c!backgroundcolor\p_foregroundcolor + \fi \to \everyexternalfigurechecks %D Internal graphics are handled at the \TEX\ end: -\def\doprocesstexlikefigure#1% retrofit into mkii +\def\grph_include_process_tex#1% {\global\setbox\foundexternalfigure\vbox\framed [\c!strut=\v!no,\c!align=\v!normal,\c!frame=\v!off, \c!offset=\v!overlay,\c!width=\v!fit,\c!height=\v!fit] {\blank[\v!disable]#1\endgraf\removelastskip}} % disable should stay here! -\def\doprocessmpslikefigure#1% retrofit into mkii +\def\grph_include_process_mps#1% retrofit into mkii {\global\setbox\foundexternalfigure\vbox{\convertMPtoPDF{#1}11}} -\def\doprocesscldlikefigure#1% +\def\grph_include_process_cld#1% {\global\setbox\foundexternalfigure\vbox{\cldprocessfile{#1}}} -\def\docheckfigurebuffer #1{\doprocesstexlikefigure{\getbuffer[#1]}} -\def\docheckfiguretex #1{\doprocesstexlikefigure{\input{#1}}} -\def\docheckfigurecld #1{\doprocesscldlikefigure{#1}} % we can always add cldrun -\def\docheckfiguremps #1{\doprocessmpslikefigure{#1}} -\def\docheckfiguremprun #1#2{\doprocesstexlikefigure{\useMPrun{#1}{#2}}} - -% \def\doscalefigure -% {\global\setbox\foundexternalfigure\vbox{\doscalebox\??ef{\dowithfigure{\box\foundexternalfigure}}}} - -\def\doscalefigure - {\global\setbox\foundexternalfigure\vbox{\scale[\v!figure]{\dowithfigure{\box\foundexternalfigure}}}} - -% quick hack: chaining \??ef via \s!parent happens when this is also a commandhandler - -\definescale - [\v!figure] - [\c!hfactor =\@@efhfactor , - \c!wfactor =\@@efwfactor , - \c!factor =\@@effactor , - \c!maxwidth =\@@efmaxwidth , - \c!maxheight=\@@efmaxheight, - \c!xscale =\@@efxscale , - \c!yscale =\@@efyscale , - \c!scale =\@@efscale , - \c!sx =\@@efsx , - \c!sy =\@@efsy , - \c!width =\@@efwidth , - \c!height =\@@efheight , - \c!lines =\@@eflines ] - -\newconditional\testexternalfigureonly - -% \enabletrackers[figures.conversion] -% \externalfigure[demo.svg] -% \externalfigure[demo.svg][conversion=png] +\unexpanded\def\docheckfigurebuffer #1{\grph_include_process_tex{\getbuffer[#1]}} % used al lua end +\unexpanded\def\docheckfiguretex #1{\grph_include_process_tex{\input{#1}}} % used al lua end +\unexpanded\def\docheckfigurecld #1{\grph_include_process_cld{#1}} % used al lua end +\unexpanded\def\docheckfiguremps #1{\grph_include_process_mps{#1}} % used al lua end +\unexpanded\def\docheckfiguremprun #1#2{\grph_include_process_tex{\useMPrun{#1}{#2}}} % used al lua end -\unexpanded\def\calculateexternalfigure[#1][#2][#3][#4][#5][#6]% \cmd label filename parent_id preset current - {\dontcomplain - \restorecatcodes - \forgetall - \resetfigurevariables - \dosetefparameters{#4}{#5}{#6}% - \checkfigurevariables -% \begingroup -% \color[\@@efcolor]{\xdef\globcolorattr{\internalspotcolorname}} -% \endgroup - \ctxlua{figures.push { - name = "#3", - label = "#2", % todo: \@eflabel - page = "\@@efpage", - size = "\@@efsize", - object = "\@@efobject", - prefix = "\@@efprefix", - cache = "\@@efcache", - format = "\@@efmethod", - preset = "\@@efprefix", - controls = "\@@efcontrols", - resources = "\@@efresources", - preview = "\@@efpreview", - display = "\@@efdisplay", - mask = "\@@efmask", - conversion = "\@@efconversion", - resolution = "\@@efresolution", - color = "\internalspotcolorparent\@@efcolor", % hack is needed - ["repeat"] = "\@@efrepeat", - width = "\@@efwidth", % can be crap - height = "\@@efheight", % can be crap - } }% - \ctxlua{figures.identify()}% - % also mode: checkpresense only - \ifconditional\testexternalfigureonly - \ifcase\figurestatus \else - \ctxlua{figures.check()}% - \ctxlua{figures.dummy()}% - \ctxlua{figures.scale()}% - \ctxlua{figures.done()}% - \fi - \signalexternalfigure - \else - \ifcase\figurestatus - \ctxlua{figures.dummy()}% - \ctxlua{figures.scale()}% - \else - \ctxlua{figures.check()}% - \ctxlua{figures.include()}% - \ctxlua{figures.scale()}% - \fi - \ctxlua{figures.done()}% - \signalexternalfigure - \finishexternalfigure - \fi - \ctxlua{figures.pop()}} - -\def\relocateexternalfigure % easier here than in lua +\unexpanded\def\relocateexternalfigure % easier here than in lua {\global\setbox\foundexternalfigure\vbox to \ht\foundexternalfigure\bgroup \vss \ht\foundexternalfigure\zeropoint @@ -324,33 +443,24 @@ \egroup \egroup} -\newsystemmode\v!figure - -\def\signalexternalfigure % global (dup call to status) - {\ifcase\figurestatus - \global\resetsystemmode\v!figure % todo, also: \v!resource - \else - \global\setsystemmode \v!figure % todo, also: \v!resource - \fi} - \unexpanded\def\startfoundexternalfigure#1#2% ht wd {\global\setbox\foundexternalfigure\vbox to #2\bgroup\vss\hbox to #1\bgroup} \unexpanded\def\stopfoundexternalfigure {\hss\egroup\egroup} -\def\emptyfoundexternalfigure +\unexpanded\def\emptyfoundexternalfigure % sort of obsolete {\startfoundexternalfigure\defaultfigurewidth\defaultfigureheight \stopfoundexternalfigure} -\def\finishexternalfigure % here we use \figurevariables +\def\grph_include_finalize {\global\setbox\foundexternalfigure\vbox {\ifcase\figurestatus - \let\@@efframe\v!on + \letexternalfiguresparameter\c!frame\v!on \fi - \ifconditional\externalfigureflush - \ifconditional\externalfigurelevel % probably background - \ifskipexternalfigures + \ifconditional\c_grph_include_flush + \ifconditional\c_grph_include_level % probably background + \ifconditional\c_grph_include_skip % nothing \fakebox\foundexternalfigure \else\ifcase\figurestatus @@ -361,28 +471,29 @@ \fi\fi \else \iftrialtypesetting \else \feedbackexternalfigure \fi - \settrue\externalfigurelevel - \ifskipexternalfigures + \settrue\c_grph_include_level + \ifconditional\c_grph_include_skip \ifcase\figurestatus - \externalfigurereplacement\figurelabel\figurefileoriginal{unknown}% + \grph_include_replacement\figurelabel\figurefileoriginal{unknown}% \else - \externalfigurereplacement\figurelabel\figurefullname{skipped}% + \grph_include_replacement\figurelabel\figurefullname{skipped}% \fi \else\ifcase\figurestatus - \externalfigurereplacement\figurelabel\figurefileoriginal{unknown}% + \grph_include_replacement\figurelabel\figurefileoriginal{unknown}% \else \the\externalfigurepostprocessors - \doifelse\@@efreset\v!yes - {\wd\foundexternalfigure\figurewidth - \ht\foundexternalfigure\figureheight - \dp\foundexternalfigure\zeropoint - \box\foundexternalfigure} - {\localframed % should also be applied to high res ! - [\??ef] - [\c!offset=\v!overlay, - \c!width=\figurewidth, - \c!height=\figureheight] - {\vfilll\box\foundexternalfigure}}% + \edef\p_reset{\externalfiguresparameter\c!reset}% + \ifx\p_reset\v!yes + \wd\foundexternalfigure\figurewidth + \ht\foundexternalfigure\figureheight + \dp\foundexternalfigure\zeropoint + \box\foundexternalfigure + \else + \letexternalfiguresparameter\c!offset\v!overlay + \letexternalfiguresparameter\c!width \figurewidth + \letexternalfiguresparameter\c!height\figureheight + \inheritedexternalfiguresframed{\vfilll\box\foundexternalfigure}% + \fi \fi\fi \fi \else @@ -390,35 +501,17 @@ \iftrialtypesetting \else \feedbackexternalfigure \fi \fi}} -\ifx\externalfigurereplacement\undefined\let\externalfigurereplacement\gobblethreearguments\fi -\ifx\externalfigureplaceholder\undefined\let\externalfigureplaceholder\gobblethreearguments\fi +\let\feedbackexternalfigure\relax % hook -\let\feedbackexternalfigure\relax % \gobblefourarguments -\let\dowithfigure \relax +\unexpanded\def\getfiguredimensions + {\dodoubleempty\grph_include_get_dimensions} -\def\getfiguredimensions - {\dodoubleempty\dogetfiguredimensions} - -\def\dogetfiguredimensions[#1][#2]% +\def\grph_include_get_dimensions[#1][#2]% {\startnointerference - \settrue\testexternalfigureonly + \settrue\c_grph_include_test_only \externalfigure[#1][#2,\c!display=,\c!mask=,\c!object=\v!no]% \stopnointerference} -\let\getfiguredimensionsonly\getfiguredimensions - -% \unexpanded\def\doiffigureelse#1% -% {\getfiguredimensions[#1]% so data is available ! -% \ifdim\figurewidth=\zeropoint % todo: \figurestatus -% \expandafter\secondoftwoarguments -% \else -% \expandafter\firstoftwoarguments -% \fi} - -% \unexpanded\def\doiffigureelse#1% just low level call -% {\getfiguredimensions[#1]% so data is available ! ... grouped so status is local -% \doifmodeelse{*\v!figure}\firstoftwoarguments\secondoftwoarguments} % mode is set global - \unexpanded\def\doiffigureelse#1% {\getfiguredimensions[#1]% so data is available ! \ifcase\figurestatus @@ -427,74 +520,150 @@ \expandafter\firstoftwoarguments \fi} -\def\registerexternalfigure % no placement, handy for preprocessing - {\dotripleempty\doregisterexternalfigure} +% No placement, handy for preprocessing: -\def\doregisterexternalfigure[#1][#2][#3]% +\unexpanded\def\registerexternalfigure + {\dotripleempty\grph_include_register} + +\def\grph_include_register[#1][#2][#3]% {\startnointerference - \testexternalfigureonly - \setfalse\externalfigureflush % == test ? - \externalfigure[#1][#2][#3]% or \doexternalfigure + \c_grph_include_test_only + \setfalse\c_grph_include_flush % == test ? + \externalfigure[#1][#2][#3]% or \externalfigure[#1][#2,\c!display=,\c!mask=,\c!object=\v!no]% \stopnointerference} -% helpers (will be replaced when xforms are accessible at the lua end) +% Helpers (will be replaced when xforms are accessible at the lua end) -\def\dosetfigureobject#1% +\unexpanded\def\dosetfigureobject#1% {\setobject{FIG}{#1}\vbox{\box\foundexternalfigure}} -\def\doboxfigureobject#1% +\unexpanded\def\doboxfigureobject#1% {\global\setbox\foundexternalfigure\vbox{\getobject{FIG}{#1}}} % probably one vbox too many -% figurebases +% Figure bases -\def\usefigurebase[#1]% +\unexpanded\def\usefigurebase[#1]% {\ctxlua{figures.bases.use("#1")}} -\protect \endinput +\appendtoks + \setfigurepathlist % the path may be used elsewhere too (as in x-res-04) +\to \everysetupexternalfigures -% \startbuffer -% \definecolor [blue] [c=1,m=.38,y=0,k=.64] -% \definecolor [yellow] [c=0,m=.28,y=1,k=.06] -% -% \definespotcolor [blue-100] [blue] [p=1] -% \definespotcolor [yellow-100] [yellow] [p=1] -% -% \definemultitonecolor [combicolor] [blue=.12,yellow=.28] [c=.1,m=.1,y=.3,k=.1] -% -% \definemultitonecolor [combicolor-b] [blue=1] [c=1,m=.38,y=0,k=.64] % force multitone -% \definemultitonecolor [combicolor-y] [yellow=1] [c=0,m=.28,y=1,k=.06] % force multitone -% -% \useexternalfigure[demo-a][mill.png] [object=no,width=.2\textwidth] -% \useexternalfigure[demo-b][hacker-bw.jpg][object=no,width=.2\textwidth] -% -% \startbaselinecorrection \startcombination[4*1] -% {\externalfigure[demo-a]} {no color} -% {\externalfigure[demo-a][color=combicolor]} {indexed duotone} -% {\externalfigure[demo-a][color=combicolor-b]} {spot color} -% {\externalfigure[demo-a][color=combicolor-y]} {spot color} -% \stopcombination \stopbaselinecorrection -% -% \startbaselinecorrection \startcombination[4*1] -% {\externalfigure[demo-b]} {no color} -% {\externalfigure[demo-b][color=combicolor]} {indexed duotone} -% {\externalfigure[demo-b][color=combicolor-b]} {spot color} -% {\externalfigure[demo-b][color=combicolor-y]} {spot color} -% \stopcombination \stopbaselinecorrection -% -% \startbaselinecorrection \startcombination[4*1] -% {\externalfigure[demo-a]} {no color} -% {\externalfigure[demo-a][color=combicolor]} {indexed duotone} -% {\externalfigure[demo-a][color=blue-100]} {spot color} -% {\externalfigure[demo-a][color=yellow-100]} {spot color} -% \stopcombination \stopbaselinecorrection -% -% \startbaselinecorrection \startcombination[4*1] -% {\externalfigure[demo-b]} {no color} -% {\externalfigure[demo-b][color=combicolor]} {indexed duotone} -% {\externalfigure[demo-b][color=blue-100]} {spot color} -% {\externalfigure[demo-b][color=yellow-100]} {spot color} -% \stopcombination \stopbaselinecorrection -% \stopbuffer -% -% \getbuffer \typebuffer +\appendtoks + \ctxcommand{setfigurelookuporder("\externalfiguresparameter\c!order")}% +\to \everysetupexternalfigures + +\definecolor[missingfigurecolor][s=.8] + +\def\grph_include_replacement#1#2#3% + {\bgroup + \letexternalfiguresparameter\c!width\figurewidth + \letexternalfiguresparameter\c!height\figureheight + \letexternalfiguresparameter\c!background\v!color + \setexternalfiguresparameter\c!backgroundcolor{missingfigurecolor}% + \inheritedexternalfiguresframed + {\tt\tfxx \nohyphens + name: \expanded{\verbatimstring{#1}}\\% + file: \expanded{\verbatimstring{#2}}\\% + state: \expanded{\verbatimstring{#3}}}% + \egroup} + +% \def\grph_include_placeholder#1#2#3% +% {\bgroup +% \setexternalfiguresparameter\c!width{#2}% +% \setexternalfiguresparameter\c!height{#3}% +% \letexternalfiguresparameter\c!frame\v!on +% \inheritedexternalfiguresframed +% {\tt\tfxx \nohyphens +% name: \expanded{\verbatimstring{#1}}\\% +% state: \expanded{\verbatimstring{placeholder}}}% +% \egroup} + +% maybe setuphandler + +\newconditional\c_grph_include_in_collection + +\newdimen\d_grph_include_collection_minwidth +\newdimen\d_grph_include_collection_maxwidth +\newdimen\d_grph_include_collection_minheight +\newdimen\d_grph_include_collection_maxheight + +\def\grph_include_analyze_collection[#1][#2]% + {\ifconditional\c_grph_include_in_collection + \setfalse\c_grph_include_in_collection + \getfiguredimensions[#1][#2]% + \settrue\c_grph_include_in_collection + \scratchdimen\naturalfigurewidth + \ifdim\scratchdimen>\d_grph_include_collection_maxwidth \d_grph_include_collection_maxwidth \scratchdimen \fi + \ifdim\scratchdimen<\d_grph_include_collection_minwidth \d_grph_include_collection_minwidth \scratchdimen \fi + \scratchdimen\naturalfigureheight + \ifdim\scratchdimen>\d_grph_include_collection_maxheight \d_grph_include_collection_maxheight\scratchdimen \fi + \ifdim\scratchdimen<\d_grph_include_collection_minheight \d_grph_include_collection_minheight\scratchdimen \fi + \fi} + +\unexpanded\def\startexternalfigurecollection[#1]% + {\begingroup + \def\currentexternalfigurecollection{#1}% + \settrue\c_grph_include_in_collection + \d_grph_include_collection_minwidth \maxdimen + \d_grph_include_collection_maxwidth \zeropoint + \d_grph_include_collection_minheight\maxdimen + \d_grph_include_collection_maxheight\zeropoint} + +\unexpanded\def\stopexternalfigurecollection + {\setxvalue{\??externalfigurecollection\currentexternalfigurecollection:\c!minwidth }{\the\d_grph_include_collection_minwidth }% + \setxvalue{\??externalfigurecollection\currentexternalfigurecollection:\c!maxwidth }{\the\d_grph_include_collection_maxwidth }% + \setxvalue{\??externalfigurecollection\currentexternalfigurecollection:\c!minheight}{\the\d_grph_include_collection_minheight}% + \setxvalue{\??externalfigurecollection\currentexternalfigurecollection:\c!maxheight}{\the\d_grph_include_collection_maxheight}% + \endgroup} + +\def\externalfigurecollectionparameter#1#2% + {\csname + \ifcsname\??externalfigurecollection#1:#2\endcsname + \??externalfigurecollection#1:#2% + \else + \s!empty + \fi + \endcsname} + +\def\externalfigurecollectionminwidth #1{\externalfigurecollectionparameter{#1}\c!minwidth } +\def\externalfigurecollectionmaxwidth #1{\externalfigurecollectionparameter{#1}\c!maxwidth } +\def\externalfigurecollectionminheight#1{\externalfigurecollectionparameter{#1}\c!minheight} +\def\externalfigurecollectionmaxheight#1{\externalfigurecollectionparameter{#1}\c!maxheight} + +\let\efcparameter\externalfigurecollectionparameter % still needed ? +\let\efcminwidth \externalfigurecollectionminwidth % still needed ? +\let\efcmaxwidth \externalfigurecollectionmaxwidth % still needed ? +\let\efcminheight\externalfigurecollectionminheight % still needed ? +\let\efcmaxheight\externalfigurecollectionmaxheight % still needed ? + +% \startexternalfigurecollection[name] +% \useexternalfigure[cow] [cow.pdf] +% \useexternalfigure[mill][mill.png] +% \stopexternalfigurecollection +% \starttext +% \bTABLE +% \bTR +% \bTD \externalfigure[cow] [height=\externalfigurecollectionmaxheight{name}] \eTD +% \bTD \externalfigure[mill][height=\externalfigurecollectionmaxheight{name}] \eTD +% \eTR +% \eTABLE +% \stoptext + +\unexpanded\def\showexternalfigures % maybe run time command is better, but no core-run, unless figs-run ... + {%\writestatus\m!system{for \string\showexternalfigures\space see \truefilename{x-res-20}.tex} + \usemodule[res-20]% + \showexternalfigures} % so for the moment we do it this way + +\unexpanded\def\overlayfigure#1% + {\externalfigure[#1][\c!width=\overlaywidth,\c!height=\overlayheight]} + +% Bonus: + +\useexternalfigure + [buffer] + [\jobname.buffer] + [\c!object=\v!no] + +\protect \endinput diff --git a/tex/context/base/l-number.lua b/tex/context/base/l-number.lua index b1ffb9ca9..301380eee 100644 --- a/tex/context/base/l-number.lua +++ b/tex/context/base/l-number.lua @@ -72,11 +72,11 @@ function number.hasbit(x, p) -- typical call: if hasbit(x, bit(3)) then ... end function number.setbit(x, p) - return hasbit(x, p) and x or x + p + return (x % (p + p) >= p) and x or x + p end function number.clearbit(x, p) - return hasbit(x, p) and x - p or x + return (x % (p + p) >= p) and x - p or x end --~ function number.tobitstring(n) diff --git a/tex/context/base/m-database.mkiv b/tex/context/base/m-database.mkiv index cef0aa815..91da78879 100644 --- a/tex/context/base/m-database.mkiv +++ b/tex/context/base/m-database.mkiv @@ -17,11 +17,6 @@ \unprotect -\def\c!first {first} -\def\c!last {last} -\def\c!quotechar {quotechar} -\def\c!commentchar {commentchar} - \definenamespace [db] [type=module, diff --git a/tex/context/base/m-spreadsheet.mkiv b/tex/context/base/m-spreadsheet.mkiv index f2b042d09..c21e10f1d 100644 --- a/tex/context/base/m-spreadsheet.mkiv +++ b/tex/context/base/m-spreadsheet.mkiv @@ -17,9 +17,6 @@ \unprotect -\ifdefined\c!comma \else \def\c!comma {comma} \fi -\ifdefined\c!period \else \def\c!period{period} \fi - % todo: get(...) set(..) ctx(...) \installcorenamespace{spreadsheet} diff --git a/tex/context/base/math-ini.mkiv b/tex/context/base/math-ini.mkiv index 868fa7f5c..9a8dbef25 100644 --- a/tex/context/base/math-ini.mkiv +++ b/tex/context/base/math-ini.mkiv @@ -27,14 +27,6 @@ \unprotect -\ifdefined\v!autopunctuation \else \def\v!autopunctuation{autopunctuation} \fi -\ifdefined\v!integral \else \def\v!integral {integral} \fi - -\def\s!lcgreek {lcgreek} -\def\s!ucgreek {ucgreek} -\def\s!italics {italics} -\def\s!integral{integral} - %D We move these definitions into the format: % test [[\char948 \cldcontext{utf.char(948)}]] diff --git a/tex/context/base/mult-aux.mkiv b/tex/context/base/mult-aux.mkiv index aae94e835..dfad1fb8b 100644 --- a/tex/context/base/mult-aux.mkiv +++ b/tex/context/base/mult-aux.mkiv @@ -290,23 +290,23 @@ \ifthirdargument \the#6% predefine \edef#8{##2}% - \expandafter\def\csname#1#4:\s!parent\endcsname{#1##2}% + \expandafter\edef\csname#1#4:\s!parent\endcsname{#1##2}% was \def \mult_interfaces_get_parameters{#1#4:}[##3]% \else\ifsecondargument \the#6% predefine \expandafter\mult_check_for_assignment_indeed\detokenize{##2}=@@\_end_ \ifassignment \let#8\empty - \expandafter\def\csname#1#4:\s!parent\endcsname{#3}% + \expandafter\def\csname#1#4:\s!parent\endcsname{#3}% maybe \edef is more efficient \mult_interfaces_get_parameters{#1#4:}[##2]% \else \edef#8{##2}% - \expandafter\def\csname#1#4:\s!parent\endcsname{#1##2}% + \expandafter\edef\csname#1#4:\s!parent\endcsname{#1##2}% was \def \fi \else \the#6% predefine \let#8\empty - \expandafter\def\csname#1#4:\s!parent\endcsname{#3}% + \expandafter\def\csname#1#4:\s!parent\endcsname{#3}% maybe \edef is more efficient \fi\fi \the#7% \let#4#9}} diff --git a/tex/context/base/mult-chk.mkiv b/tex/context/base/mult-chk.mkiv index 9260d2040..3b58a19fb 100644 --- a/tex/context/base/mult-chk.mkiv +++ b/tex/context/base/mult-chk.mkiv @@ -35,8 +35,8 @@ \registerctxluafile{mult-chk}{1.001} -\def\setvalidparameterkeys{\dodoubleargument\mult_checkers_set_valid_parameter_keys} -\def\addvalidparameterkeys{\dodoubleargument\mult_checkers_add_valid_parameter_keys} +\unexpanded\def\setvalidparameterkeys{\dodoubleargument\mult_checkers_set_valid_parameter_keys} +\unexpanded\def\addvalidparameterkeys{\dodoubleargument\mult_checkers_add_valid_parameter_keys} \def\mult_checkers_set_valid_parameter_keys[#1][#2]{\ctxlua{interfaces.setvalidkeys("#1",\!!bs#2\!!es)}} \def\mult_checkers_add_valid_parameter_keys[#1][#2]{\ctxlua{interfaces.addvalidkeys("#1",\!!bs#2\!!es)}} @@ -62,11 +62,11 @@ \fi{#3}#5} \def\mult_checkers_get_checked_parameters_nop_indeed#1#2]% - {\def\p!dogetparameter{\p!doassign#1}% + {\def\p!dogetparameter{\p!doassign#1}% will change \xprocesscommaitem#2,],\@relax@} -\def\disablecheckparameters{\let\getcheckedparameters\mult_checkers_get_checked_parameters_nop} -\def\enablecheckparameters {\let\getcheckedparameters\mult_checkers_get_checked_parameters_yes} +\unexpanded\def\disablecheckparameters{\let\getcheckedparameters\mult_checkers_get_checked_parameters_nop} +\unexpanded\def\enablecheckparameters {\let\getcheckedparameters\mult_checkers_get_checked_parameters_yes} \disablecheckparameters diff --git a/tex/context/base/mult-def.mkiv b/tex/context/base/mult-def.mkiv index f6f50ae72..68931d936 100644 --- a/tex/context/base/mult-def.mkiv +++ b/tex/context/base/mult-def.mkiv @@ -13,21 +13,54 @@ \unprotect -\setvalue{\??mi :czech}{cs} -\setvalue{\??mi :german}{de} -\setvalue{\??mi :english}{en} -\setvalue{\??mi :french}{fr} -\setvalue{\??mi :italian}{it} -\setvalue{\??mi :dutch}{nl} -\setvalue{\??mi :persian}{pe} -\setvalue{\??mi:romanian}{ro} - -\def\userinterfacetag{\ifcsname\??mi:\currentinterface\endcsname\csname\??mi:\currentinterface\endcsname\else en\fi} -\def\userresponsestag{\ifcsname\??mi:\currentresponses\endcsname\csname\??mi:\currentresponses\endcsname\else en\fi} +\installcorenamespace{multilingual} + +\setvalue{\??multilingual czech}{cs} +\setvalue{\??multilingual german}{de} +\setvalue{\??multilingual english}{en} +\setvalue{\??multilingual french}{fr} +\setvalue{\??multilingual italian}{it} +\setvalue{\??multilingual dutch}{nl} +\setvalue{\??multilingual persian}{pe} +\setvalue{\??multilingual romanian}{ro} + +\def\userinterfacetag{\ifcsname\??multilingual\currentinterface\endcsname\csname\??multilingual\currentinterface\endcsname\else en\fi} +\def\userresponsestag{\ifcsname\??multilingual\currentresponses\endcsname\csname\??multilingual\currentresponses\endcsname\else en\fi} % \input mult-\userinterfacetag \relax % \input mult-m\userresponsestag \relax \ctxlua{interfaces.setuserinterface("\userinterfacetag","\userresponsestag")} +% start todo: + +\def\c!renderingsetup {renderingsetup} +\def\c!filler {filler} +\def\c!resources {resources} +\def\c!first {first} +\def\c!last {last} +\def\c!quotechar {quotechar} +\def\c!commentchar {commentchar} +\def\c!symbolcommand {symbolcommand} +\def\c!xmlsetup {xmlsetup} +\def\c!comma {comma} +\def\c!period {period} +\def\c!monthconversion{monthconversion} + +\def\v!notation {notation} +\def\v!endnote {endnote} +\def\v!interactive {interactive} +\def\v!autopunctuation{autopunctuation} +\def\v!integral {integral} +\def\v!shiftup {shiftup} +\def\v!shiftdown {shiftdown} +\def\v!construction {construction} + +\def\s!lcgreek {lcgreek} +\def\s!ucgreek {ucgreek} +\def\s!italics {italics} +\def\s!integral {integral} + +% stop todo + \protect \endinput diff --git a/tex/context/base/mult-low.lua b/tex/context/base/mult-low.lua index 586b54813..76fb08141 100644 --- a/tex/context/base/mult-low.lua +++ b/tex/context/base/mult-low.lua @@ -136,13 +136,13 @@ return { -- "then", -- - "donothing", "dontcomplain", + "donothing", "dontcomplain", "forgetall", -- "donetrue", "donefalse", -- "htdp", "unvoidbox", - "vfilll", + "hfilll", "vfilll", -- "mathbox", "mathlimop", "mathnolop", "mathnothing", "mathalpha", -- diff --git a/tex/context/base/mult-sys.mkiv b/tex/context/base/mult-sys.mkiv index bb52dc518..ab4931119 100644 --- a/tex/context/base/mult-sys.mkiv +++ b/tex/context/base/mult-sys.mkiv @@ -505,9 +505,6 @@ \definesystemvariable {lu} % LUacode \definesystemvariable {ma} % MargeAchtergrond \definesystemvariable {mc} % MultiColumn -\definesystemvariable {mi} % MultilingualInterface -\definesystemvariable {ml} % MultilingualLabel -\definesystemvariable {mm} % MultilingualMath \definesystemvariable {mt} % inline MaTh \definesystemvariable {mt} % multi column (!!! double usage) \definesystemvariable {mo} % Math Options diff --git a/tex/context/base/node-aux.lua b/tex/context/base/node-aux.lua index 43624adfd..139f25046 100644 --- a/tex/context/base/node-aux.lua +++ b/tex/context/base/node-aux.lua @@ -342,7 +342,7 @@ end nodes.locate = locate -function nodes.concat(list) -- no slide ! +function nodes.concat(list) local head, tail for i=1,#list do local li = list[i] @@ -351,10 +351,10 @@ function nodes.concat(list) -- no slide ! elseif head then tail.next = li li.prev = tail - tail = li + tail = li.next and slide_nodes(li) or li else head = li - tail = li + tail = li.next and slide_nodes(li) or li end end return head, tail diff --git a/tex/context/base/node-fin.lua b/tex/context/base/node-fin.lua index d64c24479..dadbf80d3 100644 --- a/tex/context/base/node-fin.lua +++ b/tex/context/base/node-fin.lua @@ -7,6 +7,7 @@ if not modules then modules = { } end modules ['node-fin'] = { } -- this module is being reconstructed +-- local functions, only slightly slower local next, type, format = next, type, string.format @@ -194,6 +195,8 @@ function states.initialize(namespace,attribute,head) if nsstep then nsbegin = namespace.resolve_begin nsend = namespace.resolve_end + nspush = namespace.push + nspop = namespace.pop end end @@ -213,81 +216,167 @@ function states.finalize(namespace,attribute,head) -- is this one ok? return head, false, false end +-- disc nodes can be ignored +-- we need to deal with literals too (reset as well as oval) +-- if id == glyph_code or (id == whatsit_code and stack.subtype == pdfliteral_code) or (id == rule_code and stack.width ~= 0) or (id == glue_code and stack.leader) then + +-- local function process(namespace,attribute,head,inheritance,default) -- one attribute +-- local stack, done = head, false +-- while stack do +-- local id = stack.id +-- if id == glyph_code or (id == rule_code and stack.width ~= 0) or (id == glue_code and stack.leader) then -- or disc_code +-- local c = has_attribute(stack,attribute) +-- if c then +-- if default and c == inheritance then +-- if current ~= default then +-- head = insert_node_before(head,stack,copy_node(nsdata[default])) +-- current = default +-- done = true +-- end +-- elseif current ~= c then +-- head = insert_node_before(head,stack,copy_node(nsdata[c])) +-- current = c +-- done = true +-- end +-- -- here ? compare selective +-- if id == glue_code then --leader +-- -- same as *list +-- local content = stack.leader +-- if content then +-- local savedcurrent = current +-- local ci = content.id +-- if ci == hlist_code or ci == vlist_code then +-- -- else we reset inside a box unneeded, okay, the downside is +-- -- that we trigger color in each repeated box, so there is room +-- -- for improvement here +-- current = 0 +-- end +-- local ok = false +-- if nstrigger and has_attribute(stack,nstrigger) then +-- local outer = has_attribute(stack,attribute) +-- if outer ~= inheritance then +-- stack.leader, ok = process(namespace,attribute,content,inheritance,outer) +-- else +-- stack.leader, ok = process(namespace,attribute,content,inheritance,default) +-- end +-- else +-- stack.leader, ok = process(namespace,attribute,content,inheritance,default) +-- end +-- current = savedcurrent +-- done = done or ok +-- end +-- end +-- elseif default and inheritance then +-- if current ~= default then +-- head = insert_node_before(head,stack,copy_node(nsdata[default])) +-- current = default +-- done = true +-- end +-- elseif current > 0 then +-- head = insert_node_before(head,stack,copy_node(nsnone)) +-- current = 0 +-- done = true +-- end +-- elseif id == hlist_code or id == vlist_code then +-- local content = stack.list +-- if content then +-- local ok = false +-- if nstrigger and has_attribute(stack,nstrigger) then +-- local outer = has_attribute(stack,attribute) +-- if outer ~= inheritance then +-- stack.list, ok = process(namespace,attribute,content,inheritance,outer) +-- else +-- stack.list, ok = process(namespace,attribute,content,inheritance,default) +-- end +-- else +-- stack.list, ok = process(namespace,attribute,content,inheritance,default) +-- end +-- done = done or ok +-- end +-- end +-- stack = stack.next +-- end +-- return head, done +-- end + local function process(namespace,attribute,head,inheritance,default) -- one attribute local stack, done = head, false - while stack do - local id = stack.id - -- we need to deal with literals too (reset as well as oval) - -- if id == glyph_code or (id == whatsit_code and stack.subtype == pdfliteral_code) or (id == rule_code and stack.width ~= 0) or (id == glue_code and stack.leader) then -- or disc_code - if id == glyph_code -- or id == disc_code - or (id == rule_code and stack.width ~= 0) or (id == glue_code and stack.leader) then -- or disc_code - local c = has_attribute(stack,attribute) - if c then - if default and c == inheritance then - if current ~= default then - head = insert_node_before(head,stack,copy_node(nsdata[default])) - current = default - done = true - end - elseif current ~= c then - head = insert_node_before(head,stack,copy_node(nsdata[c])) - current = c - done = true - end - -- here ? compare selective - if id == glue_code then --leader - -- same as *list - local content = stack.leader - if content then - local savedcurrent = current - local ci = content.id - if ci == hlist_code or ci == vlist_code then - -- else we reset inside a box unneeded, okay, the downside is - -- that we trigger color in each repeated box, so there is room - -- for improvement here - current = 0 - end - local ok = false - if nstrigger and has_attribute(stack,nstrigger) then - local outer = has_attribute(stack,attribute) - if outer ~= inheritance then - stack.leader, ok = process(namespace,attribute,content,inheritance,outer) - else - stack.leader, ok = process(namespace,attribute,content,inheritance,default) - end - else - stack.leader, ok = process(namespace,attribute,content,inheritance,default) - end - current = savedcurrent - done = done or ok - end - end - elseif default and inheritance then + + local function check() + local c = has_attribute(stack,attribute) + if c then + if default and c == inheritance then if current ~= default then head = insert_node_before(head,stack,copy_node(nsdata[default])) current = default done = true end - elseif current > 0 then - head = insert_node_before(head,stack,copy_node(nsnone)) - current = 0 + elseif current ~= c then + head = insert_node_before(head,stack,copy_node(nsdata[c])) + current = c done = true end + elseif default and inheritance then + if current ~= default then + head = insert_node_before(head,stack,copy_node(nsdata[default])) + current = default + done = true + end + elseif current > 0 then + head = insert_node_before(head,stack,copy_node(nsnone)) + current = 0 + done = true + end + return c + end + + local function nested(content) + if nstrigger and has_attribute(stack,nstrigger) then + local outer = has_attribute(stack,attribute) + if outer ~= inheritance then + return process(namespace,attribute,content,inheritance,outer) + else + return process(namespace,attribute,content,inheritance,default) + end + else + return process(namespace,attribute,content,inheritance,default) + end + end + + while stack do + local id = stack.id + if id == glyph_code then + check() + elseif id == rule_code then + if stack.width ~= 0 then + check() + end + elseif id == glue_code then + local content = stack.leader + if content and check() then + local savedcurrent = current + local ci = content.id + if ci == hlist_code or ci == vlist_code then + -- else we reset inside a box unneeded, okay, the downside is + -- that we trigger color in each repeated box, so there is room + -- for improvement here + current = 0 + end + + local ok = false + stack.leader, ok = nested(content) + done = done or ok + + current = savedcurrent + end elseif id == hlist_code or id == vlist_code then local content = stack.list if content then + local ok = false - if nstrigger and has_attribute(stack,nstrigger) then - local outer = has_attribute(stack,attribute) - if outer ~= inheritance then - stack.list, ok = process(namespace,attribute,content,inheritance,outer) - else - stack.list, ok = process(namespace,attribute,content,inheritance,default) - end - else - stack.list, ok = process(namespace,attribute,content,inheritance,default) - end + stack.list, ok = nested(content) done = done or ok + end end stack = stack.next @@ -303,86 +392,185 @@ states.process = process -- state changes while the main state stays the same (like two glyphs following -- each other with the same color but different color spaces e.g. \showcolor) +-- local function selective(namespace,attribute,head,inheritance,default) -- two attributes +-- local stack, done = head, false +-- while stack do +-- local id = stack.id +-- -- we need to deal with literals too (reset as well as oval) +-- -- if id == glyph_code or (id == whatsit_code and stack.subtype == pdfliteral_code) or (id == rule_code and stack.width ~= 0) or (id == glue_code and stack.leader) then -- or disc_code +-- if id == glyph_code -- or id == disc_code +-- or (id == rule_code and stack.width ~= 0) or (id == glue_code and stack.leader) then -- or disc_code +-- local c = has_attribute(stack,attribute) +-- if c then +-- if default and c == inheritance then +-- if current ~= default then +-- local data = nsdata[default] +-- head = insert_node_before(head,stack,copy_node(data[nsforced or has_attribute(stack,nsselector) or nsselector])) +-- current = default +-- done = true +-- end +-- else +-- local s = has_attribute(stack,nsselector) +-- if current ~= c or current_selector ~= s then +-- local data = nsdata[c] +-- head = insert_node_before(head,stack,copy_node(data[nsforced or has_attribute(stack,nsselector) or nsselector])) +-- current = c +-- current_selector = s +-- done = true +-- end +-- end +-- elseif default and inheritance then +-- if current ~= default then +-- local data = nsdata[default] +-- head = insert_node_before(head,stack,copy_node(data[nsforced or has_attribute(stack,nsselector) or nsselector])) +-- current = default +-- done = true +-- end +-- elseif current > 0 then +-- head = insert_node_before(head,stack,copy_node(nsnone)) +-- current, current_selector, done = 0, 0, true +-- end +-- if id == glue_code then -- leader +-- -- same as *list +-- local content = stack.leader +-- if content then +-- local savedcurrent = current +-- local ci = content.id +-- if ci == hlist_code or ci == vlist_code then +-- -- else we reset inside a box unneeded, okay, the downside is +-- -- that we trigger color in each repeated box, so there is room +-- -- for improvement here +-- current = 0 +-- end +-- local ok = false +-- if nstrigger and has_attribute(stack,nstrigger) then +-- local outer = has_attribute(stack,attribute) +-- if outer ~= inheritance then +-- stack.leader, ok = selective(namespace,attribute,content,inheritance,outer) +-- else +-- stack.leader, ok = selective(namespace,attribute,content,inheritance,default) +-- end +-- else +-- stack.leader, ok = selective(namespace,attribute,content,inheritance,default) +-- end +-- current = savedcurrent +-- done = done or ok +-- end +-- end +-- elseif id == hlist_code or id == vlist_code then +-- local content = stack.list +-- if content then +-- local ok = false +-- if nstrigger and has_attribute(stack,nstrigger) then +-- local outer = has_attribute(stack,attribute) +-- if outer ~= inheritance then +-- stack.list, ok = selective(namespace,attribute,content,inheritance,outer) +-- else +-- stack.list, ok = selective(namespace,attribute,content,inheritance,default) +-- end +-- else +-- stack.list, ok = selective(namespace,attribute,content,inheritance,default) +-- end +-- done = done or ok +-- end +-- end +-- stack = stack.next +-- end +-- return head, done +-- end + local function selective(namespace,attribute,head,inheritance,default) -- two attributes local stack, done = head, false - while stack do - local id = stack.id - -- we need to deal with literals too (reset as well as oval) - -- if id == glyph_code or (id == whatsit_code and stack.subtype == pdfliteral_code) or (id == rule_code and stack.width ~= 0) or (id == glue_code and stack.leader) then -- or disc_code - if id == glyph_code -- or id == disc_code - or (id == rule_code and stack.width ~= 0) or (id == glue_code and stack.leader) then -- or disc_code - local c = has_attribute(stack,attribute) - if c then - if default and c == inheritance then - if current ~= default then - local data = nsdata[default] - head = insert_node_before(head,stack,copy_node(data[nsforced or has_attribute(stack,nsselector) or nsselector])) - current = default - done = true - end - else - local s = has_attribute(stack,nsselector) - if current ~= c or current_selector ~= s then - local data = nsdata[c] - head = insert_node_before(head,stack,copy_node(data[nsforced or has_attribute(stack,nsselector) or nsselector])) - current = c - current_selector = s - done = true - end - end - elseif default and inheritance then + + local function check() + local c = has_attribute(stack,attribute) + if c then + if default and c == inheritance then if current ~= default then local data = nsdata[default] head = insert_node_before(head,stack,copy_node(data[nsforced or has_attribute(stack,nsselector) or nsselector])) current = default done = true end - elseif current > 0 then - head = insert_node_before(head,stack,copy_node(nsnone)) - current, current_selector, done = 0, 0, true + else + local s = has_attribute(stack,nsselector) + if current ~= c or current_selector ~= s then + local data = nsdata[c] + head = insert_node_before(head,stack,copy_node(data[nsforced or has_attribute(stack,nsselector) or nsselector])) + current = c + current_selector = s + done = true + end end - if id == glue_code then -- leader - -- same as *list - local content = stack.leader - if content then - local savedcurrent = current - local ci = content.id - if ci == hlist_code or ci == vlist_code then - -- else we reset inside a box unneeded, okay, the downside is - -- that we trigger color in each repeated box, so there is room - -- for improvement here - current = 0 - end - local ok = false - if nstrigger and has_attribute(stack,nstrigger) then - local outer = has_attribute(stack,attribute) - if outer ~= inheritance then - stack.leader, ok = selective(namespace,attribute,content,inheritance,outer) - else - stack.leader, ok = selective(namespace,attribute,content,inheritance,default) - end - else - stack.leader, ok = selective(namespace,attribute,content,inheritance,default) - end - current = savedcurrent - done = done or ok + elseif default and inheritance then + if current ~= default then + local data = nsdata[default] + head = insert_node_before(head,stack,copy_node(data[nsforced or has_attribute(stack,nsselector) or nsselector])) + current = default + done = true + end + elseif current > 0 then + head = insert_node_before(head,stack,copy_node(nsnone)) + current, current_selector, done = 0, 0, true + end + return c + end + + local function nested(content) + if nstrigger and has_attribute(stack,nstrigger) then + local outer = has_attribute(stack,attribute) + if outer ~= inheritance then + return selective(namespace,attribute,content,inheritance,outer) + else + return selective(namespace,attribute,content,inheritance,default) + end + else + return selective(namespace,attribute,content,inheritance,default) + end + end + + while stack do + local id = stack.id + if id == glyph_code then + check() + elseif id == rule_code then + if stack.width ~= 0 then + check() + end + elseif id == glue_code then + local content = stack.leader + if content and check() then + local savedcurrent = current + local ci = content.id + if ci == hlist_code or ci == vlist_code then + -- else we reset inside a box unneeded, okay, the downside is + -- that we trigger color in each repeated box, so there is room + -- for improvement here + current = 0 end + + local ok = false + stack.leader, ok = nested(content) + done = done or ok + + current = savedcurrent end elseif id == hlist_code or id == vlist_code then local content = stack.list if content then + local ok = false - if nstrigger and has_attribute(stack,nstrigger) then - local outer = has_attribute(stack,attribute) - if outer ~= inheritance then - stack.list, ok = selective(namespace,attribute,content,inheritance,outer) - else - stack.list, ok = selective(namespace,attribute,content,inheritance,default) - end - else - stack.list, ok = selective(namespace,attribute,content,inheritance,default) - end + stack.list, ok = nested(content) done = done or ok + + -- nicer: + -- + -- local content, ok = nested(content) + -- if ok then + -- stack.leader = content + -- done = true + -- end + end end stack = stack.next @@ -390,6 +578,7 @@ local function selective(namespace,attribute,head,inheritance,default) -- two at return head, done end + states.selective = selective -- Ideally the next one should be merged with the previous but keeping it separate is @@ -404,41 +593,50 @@ states.selective = selective local function stacked(namespace,attribute,head,default) -- no triggering, no inheritance, but list-wise local stack, done = head, false local current, depth = default or 0, 0 + + local function check() + local a = has_attribute(stack,attribute) + if a then + if current ~= a then + head = insert_node_before(head,stack,copy_node(nsdata[a])) + depth = depth + 1 + current, done = a, true + end + elseif default > 0 then + -- + elseif current > 0 then + head = insert_node_before(head,stack,copy_node(nsnone)) + depth = depth - 1 + current, done = 0, true + end + return a + end + while stack do local id = stack.id - if id == glyph_code or (id == rule_code and stack.width ~= 0) or (id == glue_code and stack.leader) then -- or disc_code - local c = has_attribute(stack,attribute) - if c then - if current ~= c then - head = insert_node_before(head,stack,copy_node(nsdata[c])) - depth = depth + 1 - current, done = c, true - end - if id == glue_code then - local content = stack.leader - if content then -- unchecked - local ok = false - stack.leader, ok = stacked(namespace,attribute,content,current) - done = done or ok - end - end - elseif default > 0 then - -- - elseif current > 0 then - head = insert_node_before(head,stack,copy_node(nsnone)) - depth = depth - 1 - current, done = 0, true + if id == glyph_code then + check() + elseif id == rule_code then + if stack.width ~= 0 then + check() + end + elseif id == glue_code then + local content = stack.leader + if content and check() then + local ok = false + stack.leader, ok = stacked(namespace,attribute,content,current) + done = done or ok end elseif id == hlist_code or id == vlist_code then local content = stack.list if content then -- the problem is that broken lines gets the attribute which can be a later one if nslistwise then - local c = has_attribute(stack,attribute) - if c and current ~= c and nslistwise[c] then -- viewerlayer + local a = has_attribute(stack,attribute) + if a and current ~= a and nslistwise[a] then -- viewerlayer / needs checking, see below local p = current - current, done = c, true - head = insert_node_before(head,stack,copy_node(nsdata[c])) + current, done = a, true + head = insert_node_before(head,stack,copy_node(nsdata[a])) stack.list = stacked(namespace,attribute,content,current) head, stack = insert_node_after(head,stack,copy_node(nsnone)) current = p @@ -471,24 +669,33 @@ local function stacker(namespace,attribute,head,default) -- no triggering, no in nsbegin() local current, previous, done, okay = head, head, false, false local attrib = default or unsetvalue + + local function check() + local a = has_attribute(current,attribute) or unsetvalue + if a ~= attrib then + local n = nsstep(a) + if n then + head = insert_node_before(head,current,n) -- copy_node(nsdata[a])) + end + attrib, done, okay = a, true, true + end + return a + end + while current do local id = current.id - if id == glyph_code or (id == rule_code and current.width ~= 0) or (id == glue_code and current.leader) then -- or disc_code - local a = has_attribute(current,attribute) or unsetvalue - if a ~= attrib then - local n = nsstep(a) - if n then - head = insert_node_before(head,current,n) -- copy_node(nsdata[a])) - end - attrib, done, okay = a, true, true + if id == glyph_code then + check() + elseif id == rule_code then + if current.width ~= 0 then + check() end - if id == glue_code then - local content = current.leader - if content then -- unchecked - local ok = false - current.leader, ok = stacker(namespace,attribute,content,attrib) - done = done or ok - end + elseif id == glue_code then + local content = current.leader + if content and check() then + local ok = false + current.leader, ok = stacker(namespace,attribute,content,attrib) + done = done or ok end elseif id == hlist_code or id == vlist_code then local content = current.list @@ -497,9 +704,9 @@ local function stacker(namespace,attribute,head,default) -- no triggering, no in 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) + 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 diff --git a/tex/context/base/node-ini.lua b/tex/context/base/node-ini.lua index 0ed17a1b5..e654d9e0f 100644 --- a/tex/context/base/node-ini.lua +++ b/tex/context/base/node-ini.lua @@ -73,25 +73,29 @@ nodes.handlers = nodes.handlers or { } -- there will be more of this: local skipcodes = allocate { - [ 0] = "userskip", - [ 1] = "lineskip", - [ 2] = "baselineskip", - [ 3] = "parskip", - [ 4] = "abovedisplayskip", - [ 5] = "belowdisplayskip", - [ 6] = "abovedisplayshortskip", - [ 7] = "belowdisplayshortskip", - [ 8] = "leftskip", - [ 9] = "rightskip", - [10] = "topskip", - [11] = "splittopskip", - [12] = "tabskip", - [13] = "spaceskip", - [14] = "xspaceskip", - [15] = "parfillskip", - [16] = "thinmuskip", - [17] = "medmuskip", - [18] = "thickmuskip", + [ 0] = "userskip", + [ 1] = "lineskip", + [ 2] = "baselineskip", + [ 3] = "parskip", + [ 4] = "abovedisplayskip", + [ 5] = "belowdisplayskip", + [ 6] = "abovedisplayshortskip", + [ 7] = "belowdisplayshortskip", + [ 8] = "leftskip", + [ 9] = "rightskip", + [ 10] = "topskip", + [ 11] = "splittopskip", + [ 12] = "tabskip", + [ 13] = "spaceskip", + [ 14] = "xspaceskip", + [ 15] = "parfillskip", + [ 16] = "thinmuskip", + [ 17] = "medmuskip", + [ 18] = "thickmuskip", + [100] = "leaders", + [101] = "cleaders", + [102] = "xleaders", + [103] = "gleaders", } local penaltycodes = allocate { -- unfortunately not used diff --git a/tex/context/base/node-res.lua b/tex/context/base/node-res.lua index 4522bef98..f68e89954 100644 --- a/tex/context/base/node-res.lua +++ b/tex/context/base/node-res.lua @@ -98,6 +98,8 @@ local leftskip = register_node(new_node("glue",skipcodes.leftskip)) local rightskip = register_node(new_node("glue",skipcodes.rightskip)) local temp = register_node(new_node("temp",0)) local noad = register_node(new_node("noad")) +local hlist = register_node(new_node("hlist")) +local vlist = register_node(new_node("vlist")) function pool.zeroglue(n) local s = n.spec @@ -284,6 +286,14 @@ function pool.noad() return copy_node(noad) end +function pool.hlist() + return copy_node(hlist) +end + +function pool.vlist() + return copy_node(vlist) +end + --[[ <p>At some point we ran into a problem that the glue specification of the zeropoint dimension was overwritten when adapting a glue spec diff --git a/tex/context/base/node-rul.mkiv b/tex/context/base/node-rul.mkiv index 1f1ac20ec..5b260e669 100644 --- a/tex/context/base/node-rul.mkiv +++ b/tex/context/base/node-rul.mkiv @@ -286,9 +286,6 @@ \c!style=, \c!color=] -\def\v!shiftup {shiftup} -\def\v!shiftdown{shiftdown} - \defineshift [\v!shiftup] [\c!method=0,\c!dy=-1,\c!unit=ex,\c!continue=\v!yes,\c!style=\txx,\c!color=] \defineshift [\v!shiftdown] [\c!method=1,\c!dy=.3,\c!unit=ex,\c!continue=\v!yes,\c!style=\txx,\c!color=] diff --git a/tex/context/base/node-tra.lua b/tex/context/base/node-tra.lua index 70e4639b8..64b8e84fb 100644 --- a/tex/context/base/node-tra.lua +++ b/tex/context/base/node-tra.lua @@ -726,6 +726,62 @@ function colors.set(n,c,s) end end +function colors.setlist(n,c,s) + while n do + local mc = mapping[c] + if not mc then + unset_attribute(n,attribute) + else + if not get_attribute(n,colormodel) then + set_attribute(n,colormodel,s or 1) + end + set_attribute(n,attribute,mc) + end + n = n.next + end +end + function colors.reset(n) unset_attribute(n,attribute) end + +-- maybe + +local transparencies = { } +tracers.transparencies = transparencies + +local attribute = attributes.private('transparency') +local mapping = attributes.list[attribute] or { } + +function transparencies.set(n,t) + local mt = mapping[t] + if not mt then + unset_attribute(n,attribute) + else + set_attribute(n,attribute,mt) + end +end + +function transparencies.setlist(n,c,s) + while n do + local mt = mapping[c] + if not mt then + unset_attribute(n,attribute) + else + set_attribute(n,attribute,mt) + end + n = n.next + end +end + +function transparencies.reset(n) + unset_attribute(n,attribute) +end + +-- for the moment here + +nodes.visualizers = { } + +function nodes.visualizers.handler(head) + return head, false +end diff --git a/tex/context/base/node-typ.lua b/tex/context/base/node-typ.lua index 5f8df2b44..6540ed478 100644 --- a/tex/context/base/node-typ.lua +++ b/tex/context/base/node-typ.lua @@ -13,6 +13,7 @@ local fontparameters = fonts.hashes.parameters local hpack = node.hpack local vpack = node.vpack +local fast_hpack = nodes.fasthpack local nodepool = nodes.pool @@ -62,6 +63,10 @@ function typesetters.hpack(str,fontid,spacing) return hpack(tonodes(str,fontid,spacing),"exactly") end +function typesetters.fast_hpack(str,fontid,spacing) + return fast_hpack(tonodes(str,fontid,spacing),"exactly") +end + function typesetters.vpack(str,fontid,spacing) -- vpack is just a hack, and a proper implentation is on the agenda -- as it needs more info etc than currently available diff --git a/tex/context/base/pack-mrl.mkiv b/tex/context/base/pack-mrl.mkiv index f3f3d11d9..dae6acf47 100644 --- a/tex/context/base/pack-mrl.mkiv +++ b/tex/context/base/pack-mrl.mkiv @@ -185,42 +185,42 @@ %D %D \showsetup{setupmarginrules} -\unexpanded\def\setupmarginrules - {\dodoubleargument\getparameters[\??ka]} - -%D \macros -%D {startmarginrule} -%D -%D The second method collects text and reformats it afterwards, -%D using the shapebox macros. We prevent local margin rules. -%D -%D \showsetup{startmarginrule} - -\definecomplexorsimple\startmarginrule - -\def\simplestartmarginrule - {\bgroup - \let\drawmarginrule\relax - \let\stopmarginrule\dostopmarginrule - \beginofshapebox} - -\def\complexstartmarginrule[#1]% - {\bgroup - \let\drawmarginrule\relax - \ifnum#1<\@@kalevel\relax - \let\stopmarginrule\egroup - \else - \def\@@kadefaultwidth{#1}% - \let\stopmarginrule\dostopmarginrule - \expandafter\beginofshapebox - \fi} - -\def\dostopmarginrule - {\endofshapebox - \reshapebox - {\hbox{\inleftmargin{\dodrawmarginrule}\box\shapebox}}% - \flushshapebox - \egroup} +% \unexpanded\def\setupmarginrules +% {\dodoubleargument\getparameters[\??ka]} +% +% %D \macros +% %D {startmarginrule} +% %D +% %D The second method collects text and reformats it afterwards, +% %D using the shapebox macros. We prevent local margin rules. +% %D +% %D \showsetup{startmarginrule} +% +% \definecomplexorsimple\startmarginrule +% +% \def\simplestartmarginrule +% {\bgroup +% \let\drawmarginrule\relax +% \let\stopmarginrule\dostopmarginrule +% \beginofshapebox} +% +% \def\complexstartmarginrule[#1]% +% {\bgroup +% \let\drawmarginrule\relax +% \ifnum#1<\@@kalevel\relax +% \let\stopmarginrule\egroup +% \else +% \def\@@kadefaultwidth{#1}% +% \let\stopmarginrule\dostopmarginrule +% \expandafter\beginofshapebox +% \fi} +% +% \def\dostopmarginrule +% {\endofshapebox +% \reshapebox +% {\hbox{\inleftmargin{\dodrawmarginrule}\box\shapebox}}% +% \flushshapebox +% \egroup} %D \startbuffer %D \setupmarginrules[level=5] @@ -818,9 +818,9 @@ %D Will move up: -\setupmarginrules - [\c!level=0, - \c!rulethickness=\@@kadefaultwidth\linewidth] +% \setupmarginrules +% [\c!level=0, +% \c!rulethickness=\@@kadefaultwidth\linewidth] \setupthinrules [\c!interlinespace=\v!small, diff --git a/tex/context/base/page-ini.mkiv b/tex/context/base/page-ini.mkiv index aad08ef3e..78d7f892e 100644 --- a/tex/context/base/page-ini.mkiv +++ b/tex/context/base/page-ini.mkiv @@ -215,7 +215,6 @@ {\vbox\bgroup % intercept spurious spaces \the\everybeforepagebody \starttextproperties - \dontshowboxes \checkmarginblocks \the\beforeeverypage \normalexpanded{\global\beforepage\emptytoks\the\beforepage}% diff --git a/tex/context/base/spac-hor.mkiv b/tex/context/base/spac-hor.mkiv index eeb5cadfd..47665e8b5 100644 --- a/tex/context/base/spac-hor.mkiv +++ b/tex/context/base/spac-hor.mkiv @@ -466,8 +466,15 @@ % Bovendien definieren we enkele extra \fill's: -\unexpanded\def\hfilll{\hskip\zeropoint\!!plus1filll\relax} -\unexpanded\def\vfilll{\vskip\zeropoint\!!plus1filll\relax} +\unexpanded\def\hfilll {\hskip\zeropoint\!!plus1filll\relax} +\unexpanded\def\vfilll {\vskip\zeropoint\!!plus1filll\relax} + +%unexpanded\def\hfilneg {\hskip\zeropoint\!!plus-1fil\relax} +\unexpanded\def\hfillneg {\hskip\zeropoint\!!plus-1fill\relax} +\unexpanded\def\hfilllneg{\hskip\zeropoint\!!plus-1filll\relax} +%unexpanded\def\vfilneg {\vskip\zeropoint\!!plus-1fil\relax} +\unexpanded\def\vfillneg {\vskip\zeropoint\!!plus-1fill\relax} +\unexpanded\def\vfilllneg{\vskip\zeropoint\!!plus-1filll\relax} \unexpanded\def\tfskip {\begingroup\tf\hskip\emwidth\endgroup} \unexpanded\def\dotfskip#1{\begingroup\tf\hskip #1\endgroup} % used elsewhere @@ -576,9 +583,6 @@ \let\stopnarrow\spac_narrower_stop -% \def\v!narrower{narrower} -% \definenarrower[\v!narrower] - \newdimen\d_spac_effective_hsize \def\effectivehsize {\hsize} \newdimen\d_spac_effective_leftskip \def\effectiveleftskip {\leftskip} \newdimen\d_spac_effective_rightskip \def\effectiverightskip{\rightskip} diff --git a/tex/context/base/status-files.pdf b/tex/context/base/status-files.pdf Binary files differindex c6d8ea788..09ab902cd 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 fd6b58ce4..860ca0e03 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 14727c77b..aa5aa4d20 100644 --- a/tex/context/base/status-mkiv.lua +++ b/tex/context/base/status-mkiv.lua @@ -150,17 +150,17 @@ return { status = "okay", }, { - filename = "mult-def", + filename = "mult-aux", marktype = "mkiv", status = "okay", }, { - filename = "mult-chk", + filename = "mult-def", marktype = "mkiv", status = "okay", }, { - filename = "mult-aux", + filename = "mult-chk", marktype = "mkiv", status = "okay", }, @@ -277,12 +277,12 @@ return { marktype = "mkiv", status = "okay", }, - { - filename = "supp-vis", - marktype = "mkiv", - status = "unknown", - comment = "will become a module (and part will stay in the core)", - }, + -- { + -- filename = "supp-vis", + -- marktype = "mkiv", + -- status = "unknown", + -- comment = "will become a module (and part will stay in the core)", + -- }, { filename = "supp-fun", marktype = "mkiv", @@ -626,12 +626,6 @@ return { comment = "in transition", }, { - filename = "anch-pgr", - marktype = "mkiv", - status = "okay", - comment = "in transition", - }, - { filename = "scrn-ini", marktype = "mkvi", status = "okay", @@ -852,27 +846,27 @@ return { { filename = "buff-imp-tex", marktype = "mkiv", - status = "unknown", + status = "okay", }, { filename = "buff-imp-mp", marktype = "mkiv", - status = "unknown", + status = "okay", }, { filename = "buff-imp-lua", marktype = "mkiv", - status = "unknown", + status = "okay", }, { filename = "buff-imp-xml", marktype = "mkiv", - status = "unknown", + status = "okay", }, { filename = "buff-imp-parsed-xml", marktype = "mkiv", - status = "unknown", + status = "okay", }, { filename = "strc-blk", @@ -1077,7 +1071,7 @@ return { }, { filename = "font-gds", - marktype = "mkiv", + marktype = "mkvi", status = "okay", }, { @@ -1103,6 +1097,11 @@ return { comment = "work in progress", }, { + filename = "trac-vis", + marktype = "mkvi", + status = "okay", + }, + { filename = "typo-cln", marktype = "mkiv", status = "okay", @@ -1238,12 +1237,14 @@ return { { filename = "anch-pgr", marktype = "mkiv", - status = "unknown", + status = "okay", + comment = "in transition", }, { filename = "anch-bck", marktype = "mkvi", - status = "unknown", + status = "okay", + comment = "in transition", }, { filename = "anch-tab", @@ -1253,12 +1254,13 @@ return { { filename = "anch-bar", marktype = "mkiv", - status = "unknown", + status = "okay", }, { filename = "anch-snc", marktype = "mkiv", status = "unknown", + comment = "interesting old mechanism to keep around (module?)", }, { filename = "math-ini", @@ -1402,12 +1404,12 @@ return { { filename = "grph-inc", marktype = "mkiv", - status = "unknown", + status = "okay", }, { filename = "grph-fig", marktype = "mkiv", - status = "unknown", + status = "okay", }, { filename = "grph-raw", diff --git a/tex/context/base/status-mkiv.tex b/tex/context/base/status-mkiv.tex index 34bb8ec53..266e26966 100644 --- a/tex/context/base/status-mkiv.tex +++ b/tex/context/base/status-mkiv.tex @@ -179,7 +179,7 @@ -- -- context.stoptitle() - context.starttitle { title = "Messy namespaces" } + context.starttitle { title = "messy namespaces" } local namespaces = dofile("status-namespaces.lua") @@ -193,7 +193,7 @@ context.stoptitle() - context.starttitle { title = "Messy registers" } + context.starttitle { title = "messy registers" } local registers = dofile("status-registers.lua") diff --git a/tex/context/base/strc-con.mkvi b/tex/context/base/strc-con.mkvi index 956acaae5..a795b429c 100644 --- a/tex/context/base/strc-con.mkvi +++ b/tex/context/base/strc-con.mkvi @@ -36,8 +36,6 @@ \unprotect -\ifdefined\v!construction \else \def\v!construction{construction} \fi - %D Todo: \installcorenamespace{construction} diff --git a/tex/context/base/strc-doc.mkiv b/tex/context/base/strc-doc.mkiv index 14c6537db..0263095eb 100644 --- a/tex/context/base/strc-doc.mkiv +++ b/tex/context/base/strc-doc.mkiv @@ -17,8 +17,6 @@ \unprotect -\def\c!xmlsetup{xmlsetup} - % We operate in a \type {@@ns} namespace. All data is passed through % variables. Of course we can built another interface on top of this % that accepts multiple arguments. We might change this approach and diff --git a/tex/context/base/strc-flt.mkvi b/tex/context/base/strc-flt.mkvi index 05cfa40e3..000b74831 100644 --- a/tex/context/base/strc-flt.mkvi +++ b/tex/context/base/strc-flt.mkvi @@ -1793,7 +1793,6 @@ \forgetall \postponenotes \dontcomplain - %\showcomposition \setbox\b_strc_floats_content\vbox{\borderedfloatbox}% %\page_backgrounds_add_local_to_box\b_strc_floats_content \ifnofloatcaption diff --git a/tex/context/base/strc-lst.mkvi b/tex/context/base/strc-lst.mkvi index 16544f866..049051731 100644 --- a/tex/context/base/strc-lst.mkvi +++ b/tex/context/base/strc-lst.mkvi @@ -28,12 +28,6 @@ \unprotect -% To be added to mult-def.lua: - -\ifdefined\c!renderingsetup \else \def\c!renderingsetup{renderingsetup} \fi % maybe not interfaced -\ifdefined\c!filler \else \def\c!filler {filler} \fi -\ifdefined\v!interactive \else \def\v!interactive {interactive} \fi - %D Lists are mostly used for tables of contents but are in fact a rather generic %D feature of \CONTEXT. We seperate between storage and rendering and the current %D implementation is a reworked version of all that was added in steps. As lists diff --git a/tex/context/base/strc-not.mkvi b/tex/context/base/strc-not.mkvi index ce37a5717..5ee432761 100644 --- a/tex/context/base/strc-not.mkvi +++ b/tex/context/base/strc-not.mkvi @@ -21,10 +21,6 @@ % todo: see if we can now use \insertpenalties (>0 == some left) -\ifdefined\v!notation \else \def\v!notation {notation} \fi -\ifdefined\v!endnote \else \def\v!endnote {endnote} \fi -\ifdefined\c!symbolcommand \else \def\c!symbolcommand{symbolcommand} \fi - \ifdefined\dotagsetnotesymbol \else \let\dotagsetnotesymbol\relax \fi \unexpanded\def\unvboxed {\ifvmode\unvbox \else\box \fi} % will change or used more often diff --git a/tex/context/base/syst-ini.mkiv b/tex/context/base/syst-ini.mkiv index 4ebac304d..a4afecf52 100644 --- a/tex/context/base/syst-ini.mkiv +++ b/tex/context/base/syst-ini.mkiv @@ -443,6 +443,17 @@ \let\leavevmode\unvoidbox % we prefer to use \dontleavehmode +%D \macros +%D {dontcomplain} +%D +%D We need this one soon: + +\normalprotected\def\dontcomplain + {\hbadness\plustenthousand + \vbadness\plustenthousand + \hfuzz \maxdimen + \vfuzz \maxdimen} + %D Some expected plain variants follow. We don't reuse registers %D because we don't want clashes. diff --git a/tex/context/base/task-ini.lua b/tex/context/base/task-ini.lua index 1ec38e181..ffcb82cd9 100644 --- a/tex/context/base/task-ini.lua +++ b/tex/context/base/task-ini.lua @@ -61,6 +61,8 @@ appendaction("shipouts", "normalizers", "nodes.handlers.backgrounds") --~ appendaction("shipouts", "normalizers", "nodes.handlers.export") -- disabled +appendaction("shipouts", "finishers", "nodes.visualizers.handler") -- disabled + appendaction("shipouts", "finishers", "attributes.colors.handler") -- disabled appendaction("shipouts", "finishers", "attributes.transparencies.handler") -- disabled appendaction("shipouts", "finishers", "attributes.colorintents.handler") -- disabled @@ -122,6 +124,7 @@ disableaction("shipouts", "attributes.effects.handler") disableaction("shipouts", "attributes.negatives.handler") disableaction("shipouts", "attributes.viewerlayers.handler") disableaction("shipouts", "structures.tags.handler") +disableaction("shipouts", "nodes.visualizers.handler") disableaction("shipouts", "nodes.handlers.accessibility") disableaction("shipouts", "nodes.handlers.backgrounds") disableaction("shipouts", "nodes.handlers.cleanuppage") diff --git a/tex/context/base/trac-vis.lua b/tex/context/base/trac-vis.lua new file mode 100644 index 000000000..e2f52730b --- /dev/null +++ b/tex/context/base/trac-vis.lua @@ -0,0 +1,585 @@ +if not modules then modules = { } end modules ['trac-vis'] = { + version = 1.001, + comment = "companion to trac-vis.mkiv", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + +local string, number, table = string, number, table +local node, nodes, attributes, fonts, tex = node, nodes, attributes, fonts, tex + +local format = string.format + +-- This module started out in the early days of mkiv and luatex with +-- visualizing kerns related to fonts. In the process of cleaning up the +-- visual debugger code it made sense to integrate some other code that +-- I had laying around and replace the old supp-vis debugging code. As +-- only a subset of the old visual debugger makes sense it has become a +-- different implementation. Soms of the m-visual functionality will also +-- be ported. The code is rather trivial. The caching is not really needed +-- but saves upto 50% of the time needed to add visualization. Of course +-- the overall runtime is larger because of color and layer processing in +-- the backend (can be times as much) so the runtime is somewhat larger +-- with full visualization enabled. In practice this will never happen +-- unless one is demoing. + +-- todo: global switch (so no attributes) +-- todo: maybe also xoffset, yoffset of glyph + +local nodecodes = nodes.nodecodes +local disc_code = nodecodes.disc +local kern_code = nodecodes.kern +local glyph_code = nodecodes.glyph +local hlist_code = nodecodes.hlist +local vlist_code = nodecodes.vlist +local glue_code = nodecodes.glue +local penalty_code = nodecodes.penalty + +local kerncodes = nodes.kerncodes +local font_kern_code = kerncodes.fontkern +local user_kern_code = kerncodes.userkern + +local gluecodes = nodes.gluecodes +local cleaders_code = gluecodes.cleaders +local space_code = gluecodes.space +local xspace_code = gluecodes.xspace +local leftskip_code = gluecodes.leftskip +local rightskip_code = gluecodes.rightskip + +local concat_nodes = nodes.concat +local hpack_nodes = node.hpack +local vpack_nodes = node.vpack +local hpack_string = typesetters.hpack +local fast_hpack_string = typesetters.fast_hpack +local copy_node = node.copy +local copy_list = node.copy_list +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 insert_before = node.insert_before +local fast_hpack = nodes.fasthpack + +local tex_attribute = tex.attribute +local unsetvalue = attributes.unsetvalue + +local current_font = font.current + +local exheights = fonts.hashes.exheights +local emwidths = fonts.hashes.emwidths +local pt_factor = number.dimenfactors.pt + +local nodepool = nodes.pool +local new_rule = nodepool.rule +local new_kern = nodepool.kern +local new_glue = nodepool.glue +local new_penalty = nodepool.penalty + +local tracers = nodes.tracers +local visualizers = nodes.visualizers + +local setcolor = tracers.colors.set +local setlistcolor = tracers.colors.setlist +local settransparency = tracers.transparencies.set +local setlisttransparency = tracers.transparencies.setlist + +local starttiming = statistics.starttiming +local stoptiming = statistics.stoptiming + +-- local function setlistattribute(list,a,v) +-- while list do +-- set_attribute(list,a,v) +-- list = list.next +-- end +-- end + +local a_visual = attributes.private("visual") +local a_fontkern = attributes.private("fontkern") +local a_layer = attributes.private("viewerlayer") + +local hasbit = number.hasbit +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 report_visualize = logs.reporter("visualize") + +local modes = { + hbox = 1, + vbox = 2, + kern = 4, + glue = 8, + penalty = 16, + fontkern = 32, +} + +local usedfont, exheight, emwidth +local l_penalty, l_glue, l_kern, l_fontkern, l_hbox, l_vbox + +local enabled = false + +function visualizers.setfont(id) + usedfont = id or current_font() + exheight = exheights[usedfont] + emwidth = emwidths[usedfont] +end + +local function setvisual(n,a,what) -- this will become more efficient when we have the bit lib linked in + 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) + elseif n == "all" then + if what == false then + return unsetvalue + else + for k, v in next, modes do + a = setvisual(k,a) + end + end + else + local m = modes[n] + if m then + if a == unsetvalue then + if what == false then + return unsetvalue + else + a = setbit(0,m) + end + elseif what == false then + a = clearbit(a,m) + else + a = setbit(a,m) + end + elseif not a then + return unsetvalue + end + end + if a == unsetvalue or a == 0 then + return unsetvalue + elseif not enabled then -- must happen at runtime (as we don't store layers yet) + if not usedfont then + -- 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 { + tag = format(tag), + title = format("visualizer %s",mode), + visible = "start", + editable = "yes", + printable = "yes" + } + layers[mode] = attributes.viewerlayers.register(tag,true) + end + l_penalty = layers.penalty + l_glue = layers.glue + l_kern = layers.kern + l_fontkern = layers.fontkern + l_hbox = layers.hbox + l_vbox = layers.vbox + nodes.tasks.enableaction("shipouts","nodes.visualizers.handler") + report_visualize("enabled") + enabled = true + end + return a +end + +function visualizers.setvisual(n) + tex_attribute[a_visual] = setvisual(n,tex_attribute[a_visual]) +end + +commands.setvisual = visualizers.setvisual + +function commands.visual(n) + context(setvisual(n,0)) +end + +local function set(mode,v) + tex_attribute[a_visual] = setvisual(mode,tex_attribute[a_visual],v) +end + +for mode, value in next, modes do + trackers.register(format("visualizers.%s",mode), function(v) set(mode,v) end) +end + +trackers.register("visualizers.all", function(v) set("all", v) end) +trackers.register("visualizers.makeup",function(v) set("makeup",v) end) +trackers.register("visualizers.reset", function(v) set("reset", v) end) + +local c_positive = "trace:b" +local c_negative = "trace:r" +local c_zero = "trace:g" +local c_text = "trace:s" +local c_space = "trace:y" +local c_skip = "trace:c" + +local c_positive_d = "trace:db" +local c_negative_d = "trace:dr" +local c_zero_d = "trace:dg" +local c_text_d = "trace:ds" +local c_space_d = "trace:dy" +local c_skip_d = "trace:dc" + +-- inlining the concat could speed it up + +local function sometext(color,layer,fmt,...) + local text = fast_hpack_string(format(fmt,...),usedfont) + local size = text.width + local rule = new_rule(size,2*exheight,exheight/2) + local kern = new_kern(-size) + setcolor(rule,color) + local info = concat_nodes { + rule, + kern, + text, + } + setlisttransparency(info,c_zero) + info = fast_hpack(info) + set_attribute(info,a_layer,layer) + info.width = 0 + info.height = 0 + info.depth = 0 + return info +end + +local f_cache = { } + +local function fontkern(head,current) + local kern = current.kern + local info = f_cache[kern] + if info then + -- print("hit fontkern") + else + local text = fast_hpack_string(format(" %0.3f",kern*pt_factor),usedfont) + local rule = new_rule(emwidth/10,6*exheight,2*exheight) + local list = text.list + if kern > 0 then + setlistcolor(list,c_positive_d) + elseif kern < 0 then + setlistcolor(list,c_negative_d) + else + setlistcolor(list,c_zero_d) + end + setlisttransparency(list,c_text_d) + settransparency(rule,c_text_d) + text.shift = -5 * exheight + info = concat_nodes { + rule, + text, + } + info = fast_hpack(info) + set_attribute(info,a_layer,l_fontkern) + info.width = 0 + info.height = 0 + info.depth = 0 + f_cache[kern] = info + end + head, current = insert_before(head,current,copy_list(info)) + return head, current.next +end + +-- cache baseline + +local b_cache + +local function ruledbox(head, current, vertical) + 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 = .1 * emwidth + local baseline + if dp ~= 0 and ht ~= 0 then + if not b_cache then + -- due to an optimized leader color/transparency we need to se the glue node in order + -- to trigger this mechanism + b_cache = new_glue(0) + local leader = concat_nodes { + new_glue(2.5*linewidth), + new_rule(5*linewidth,linewidth,0), + new_glue(2.5*linewidth), + } + -- setlisttransparency(leader,c_text) + leader = fast_hpack(leader) + -- setlisttransparency(leader,c_text) + b_cache.leader = leader + b_cache.subtype = cleaders_code + b_cache.spec.stretch = 65536 + b_cache.spec.stretch_order = 2 + setlisttransparency(b_cache,c_text) + end + baseline = copy_list(b_cache) + baseline = fast_hpack(baseline,wd-2*linewidth) + -- or new hpack node, set head and also: + -- baseline.width = wd + -- baseline.glue_set = wd/65536 + -- baseline.glue_order = 2 + -- baseline.glue_sign = 1 + end + local info = concat_nodes { + new_rule(linewidth,ht,dp), + new_rule(wd-2*linewidth,-dp+linewidth,dp), + new_rule(linewidth,ht,dp), + new_kern(-wd+linewidth), + new_rule(wd-2*linewidth,ht,-ht+linewidth), + new_kern(-wd+linewidth), + baseline, + } + setlisttransparency(info,c_text) + info = fast_hpack(info) + info.width = 0 + info.height = 0 + info.depth = 0 + set_attribute(info,a_layer,vertical and l_vbox or l_hbox) + local info = concat_nodes { + info, + current, + } + info = fast_hpack(info) + if vertical then + info = vpack_nodes(info) + end + 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 function ruledglue(head,current,vertical) + local spec = current.spec + local width = spec.width + local subtype = current.subtype + local info = g_cache[width] + if info then + -- print("glue hit") + else + if subtype == space_code or subtype == xspace_code then -- not yet all space + info = sometext(c_space ,l_glue,"SP:%0.3f", width*pt_factor) + elseif subtype == leftskip_code then + info = sometext(c_skip ,l_glue,"LS:%0.3f", width*pt_factor) + elseif subtype == rightskip_code then + info = sometext(c_skip ,l_glue,"RS:%0.3f", width*pt_factor) + elseif width > 0 then + info = sometext(c_positive,l_glue,"%sS:%0.3f",vertical and "V" or "H",width*pt_factor) + elseif width < 0 then + info = sometext(c_negative,l_glue,"%sS:%0.3f",vertical and "V" or "H",width*pt_factor) + else + info = sometext(c_zero ,l_glue,"%sS:%0.3f",vertical and "V" or "H",width*pt_factor) + end + g_cache[width] = info + end + info = copy_list(info) + if vertical then + info = vpack_nodes(info) + end + head, current = insert_before(head,current,info) + return head, current.next +end + +local k_cache = { } + +local function ruledkern(head,current,vertical) + local kern = current.kern + local info = k_cache[kern] + if info then + -- print("kern hit") + else + if kern > 0 then + info = sometext(c_positive,l_kern,"%sK:%0.3f",vertical and "V" or "H",kern*pt_factor) + elseif kern < 0 then + info = sometext(c_negative,l_kern,"%sK:%0.3f",vertical and "V" or "H",kern*pt_factor) + else + info = sometext(c_zero ,l_kern,"%sK:%0.3f",vertical and "V" or "H",kern*pt_factor) + end + k_cache[kern] = info + end + info = copy_list(info) + if vertical then + info = vpack_nodes(info) + end + head, current = insert_before(head,current,info) + return head, current.next +end + +local p_cache = { } + +local function ruledpenalty(head,current,vertical) + local penalty = current.penalty + local info = p_cache[penalty] + if info then + -- print("penalty hit") + else + if penalty > 0 then + info = sometext(c_positive,l_penalty,"%sP:%s",vertical and "V" or "H",penalty) + elseif penalty < 0 then + info = sometext(c_negative,l_penalty,"%sP:%s",vertical and "V" or "H",penalty) + else + info = sometext(c_zero ,l_penalty,"%sP:%s",vertical and "V" or "H",penalty) + end + p_cache[penalty] = info + end + info = copy_list(info) + if vertical then + info = vpack_nodes(info) + end + head, current = insert_before(head,current,info) + return head, current.next +end + +local function visualize(head,vertical) + local trace_hbox = false + local trace_vbox = false + local trace_kern = false + local trace_glue = false + local trace_penalty = false + local trace_fontkern = false + local current = head + local prev_trace_fontkern = nil + local attr = unsetvalue + while current do + local id = current.id + local a = has_attribute(current,a_visual) + if a ~= attr then + prev_trace_fontkern = trace_fontkern + if not a then + trace_hbox = false + trace_vbox = false + trace_kern = false + trace_glue = false + trace_penalty = false + trace_fontkern = 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) + end + attr = a + end + if 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 + if trace_fontkern or prev_trace_fontkern then + head, current = fontkern(head,current) + end + elseif subtype == user_kern_code then + if trace_kern then + head, current = ruledkern(head,current,vertical) + end + end + elseif id == glue_code then + local content = current.leader + if content then + current.leaders = visualize(content,false) + elseif trace_glue then + head, current = ruledglue(head,current,vertical) + end + elseif id == penalty_code then + if trace_penalty then + head, current = ruledpenalty(head,current,vertical) + end + elseif id == disc_code then + current.pre = visualize(current.pre) + current.post = visualize(current.post) + current.replace = visualize(current.replace) + elseif id == hlist_code then + local content = current.list + if content then + current.list = visualize(content,false) + end + if trace_hbox then + head, current = ruledbox(head,current,false) + 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) + end + end + current = current.next + end + return head +end + +local function freed(cache) + local n = 0 + for k, v in next, cache do + free_node_list(v) + n = n + 1 + end + if n == 0 then + return 0, cache + else + return n, { } + end +end + +local function cleanup() + local hf, ng, np, nk + nf, f_cache = freed(f_cache) + ng, g_cache = freed(g_cache) + np, p_cache = freed(p_cache) + nk, k_cache = freed(k_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) +end + +function visualizers.handler(head) + if usedfont then + starttiming(visualizers) + head = visualize(head) +-- cleanup() + stoptiming(visualizers) + end + return head, false +end + +function nodes.visualizers.box(n) + tex.box[n].list = nodes.visualizers.handler(tex.box[n].list) +end + +statistics.register("visualization time",function() + if enabled then + cleanup() -- in case we don't don't do it each time + return format("%s seconds",statistics.elapsedtime(visualizers)) + end +end) diff --git a/tex/context/base/trac-vis.mkiv b/tex/context/base/trac-vis.mkiv new file mode 100644 index 000000000..256c648fc --- /dev/null +++ b/tex/context/base/trac-vis.mkiv @@ -0,0 +1,111 @@ +%D \module +%D [ file=trac-vis, % replaces supp-vis plus some s-* modules +%D version=2112.06.23, % 1996.10.21, +%D title=\CONTEXT\ Tracing Macros, +%D subtitle=Visualization, +%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. + +%D The old visual debugger dates from 1996 and started out as joke. In practice +%D it's not used that often although the \type {\ruledhbox} cum suis macros come +%D in handy when writing code. In the process of luafication some additional +%D tracing options were tested, for instance showing font kerns. As part of the +%D \MKIV\ cleanup the decision was made to reimplement, reintegrate and reconsider +%D all these features. The old code is gone and the new code will get extended +%D when needed. We still provide placeholders for some old visualization commands +%D but they might go away. +%D +%D Control over what gets visualized happens with the tracker command: +%D +%D \enabletrackers[...] +%D +%D Possible values are: \type {fontkern}, \type {kern}, \type {glue}, \type +%D {penalty}, \type {hbox}, \type {vbox}, \type {all}, \type {reset}, \type +%D {makeup}. +%D +%D In due time some special visualzation of math will move here as well. + +\writestatus{loading}{ConTeXt Tracing Macros / Visualization} + +\registerctxluafile{trac-vis}{1.001} + +\unprotect + +\definesystemattribute[visual][public,global] + +%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. + + +\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\showmakeup + {\ctxcommand{setvisual("makeup")} } + +\unexpanded\def\setvisualizerfont + {\dosingleempty\syst_visualizers_setfont} + +\def\syst_visualizers_setfont[#1]% somename at 4pt + {\begingroup + \doifelsenothing{#1}{\definedfont[Mono at 4pt]}{\definedfont[#1]}% + \ctxlua{nodes.visualizers.setfont()}% + \endgroup} + +%D We keep this one: + +\unexpanded\def\dontinterfere + {\everypar \emptytoks + \let\par \endgraf + \parindent\zeropoint + \parskip \zeropoint + \leftskip \zeropoint + \rightskip\zeropoint + \relax} + +%D We keep these for a while: + +\let\ruledvcenter \vcenter +\let\ruledhss \hss +\let\ruledhfil \hfil +\let\ruledhfill \hfill +\let\ruledhfilll \hfilll +\let\ruledhfilneg \hfilneg +\let\ruledhfillneg \hfillneg +\let\ruledhfilllneg \hfilllneg +\let\ruledvss \vss +\let\ruledvfil \vfil +\let\ruledvfill \vfill +\let\ruledvfilll \vfilll +\let\ruledvfilneg \vfilneg +\let\ruledvfillneg \vfillneg +\let\ruledvfilllneg \vfilllneg +\let\ruledhskip \hskip +\let\ruledvskip \vskip +\let\ruledkern \kern +\let\ruledhglue \hglue +\let\ruledvglue \vglue +\let\ruledmkern \mkern +\let\ruledmskip \mskip +\let\ruledpenalty \penalty + +%D And for some time we will keep these as well: + +\let\showfils \relax +\let\dontshowfils \relax +\let\showboxes \relax +\let\dontshowboxes \relax +\let\showskips \relax +\let\dontshowskips \relax +\let\showpenalties \relax +\let\dontshowpenalties \relax +\let\showcomposition \relax +\let\dontshowcomposition \relax + +\protect \endinput diff --git a/tex/context/base/typo-krn.mkiv b/tex/context/base/typo-krn.mkiv index e1e404a7b..20ca3ca89 100644 --- a/tex/context/base/typo-krn.mkiv +++ b/tex/context/base/typo-krn.mkiv @@ -62,7 +62,7 @@ %D then we always would get a command defined which is not beforehand %D a good idea. -\def\v!kerncharacters{kerncharacters} % no time now for translations +\def\v!kerncharacters{kerncharacters} % no time now for translations should be a e! actually \definecharacterkerning [\v!kerncharacters] [\c!factor=.125] diff --git a/tex/generic/context/luatex/luatex-fonts-merged.lua b/tex/generic/context/luatex/luatex-fonts-merged.lua index f3da9f3fb..a92e1a0b4 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 : 06/22/12 13:11:51 +-- merge date : 06/25/12 14:10:27 do -- begin closure to overcome local limits and interference |