summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/context/base/mkiv/anch-snc.mkiv
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/tex/context/base/mkiv/anch-snc.mkiv')
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/anch-snc.mkiv272
1 files changed, 158 insertions, 114 deletions
diff --git a/Master/texmf-dist/tex/context/base/mkiv/anch-snc.mkiv b/Master/texmf-dist/tex/context/base/mkiv/anch-snc.mkiv
index 5f0246155e8..3e99da8a64f 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/anch-snc.mkiv
+++ b/Master/texmf-dist/tex/context/base/mkiv/anch-snc.mkiv
@@ -1,6 +1,6 @@
%D \module
%D [ file=anch-snc,
-%D version=2003.12.01, % actually 1999 so real old
+%D version=2003.12.01,
%D title=\CONTEXT\ Anchoring Macros,
%D subtitle=Synchronization,
%D author=Hans Hagen,
@@ -11,42 +11,151 @@
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.
-%D The original is in the mkii file. It does more at the \TEX\ end and
-%D has some more magic. If we really need that I'll add it. After all,
-%D in mkiv we can do things different.
-
-%D TODO: bleed : + left , minus right oro check if it touches page ... autobleed
+% this can be optimized (will do when used again)
\writestatus{loading}{ConTeXt Anchoring Macros / Synchronization}
-\registerctxluafile{anch-snc}{}
-
\unprotect
-\ifx\??syncposcounter\undefined \installcorenamespace{syncposcounter} \fi
-\ifx\s!syncpos \undefined \def\s!syncpos {syncpos} \fi
-
-\let\c_sync_n\relax
+\ifx\s!num \undefined \def\s!num {num} \fi
+\ifx\s!set \undefined \def\s!set {set} \fi
+\ifx\s!reset \undefined \def\s!reset {reset} \fi
+\ifx\s!preset \undefined \def\s!preset {preset} \fi
+\ifx\s!syncpos\undefined \def\s!syncpos{syncpos} \fi
\unexpanded\def\definesyncpositions[#1]%
- {\ifcsname\??syncposcounter:#1\endcsname \else
- \expandafter\newcount\csname\??syncposcounter:#1\endcsname
+ {\ifcsname\s!num:\s!syncpos:#1\endcsname \else
+ \global\let\flushsyncpositions\doflushsyncpositions % only when used
+ \global\let\flushsyncresets \doflushsyncresets
+ \global\let\flushsyncpresets \doflushsyncpresets
+ \expandafter\newcount\csname\s!num:\s!syncpos:#1\endcsname
+ \doglobal\appendtoksonce\csname\s!reset :\s!syncpos:#1\endcsname\to\resetsyncpositions
+ \doglobal\appendtoksonce\csname\s!preset:\s!syncpos:#1\endcsname\to\presetsyncpositions
+% to be tested:
+% \doglobal\expandafter\appendtoksonce\csname\s!reset :\s!syncpos:#1\endcsname\to\resetsyncpositions
+% \doglobal\expandafter\appendtoksonce\csname\s!preset:\s!syncpos:#1\endcsname\to\presetsyncpositions
+ \setgvalue{\s!syncpos:#1}{sync_n[#1] := 0 ;}%
+ \setgvalue{\s!set:\s!syncpos:#1}{\dosetsyncpositions{#1}}%
\fi}
-\unexpanded\def\syncposition
- {\dodoubleempty\anch_sync_position}
+\def\syncposition
+ {\dodoubleempty\dosyncposition}
+
+\def\dosyncposition[#1][#2]%
+ {\letgvalue{\s!reset :\s!syncpos:#1}\relax
+ \letgvalue{\s!preset:\s!syncpos:#1}\relax
+ \dontleavehmode
+ \dodosyncposition{#1}{#2}\s!set
+ \ignorespaces}
+
+\def\doifelselastsyncposition#1#2%
+ {\doifelse{\lastsyncclass\lastsyncposition}{#1#2}}
+
+\let\doiflastsyncpositionelse\doifelselastsyncposition
-\def\anch_sync_position[#1][#2]% we could actually use par positions
- {\dontleavehmode
- \ifcsname\??syncposcounter:#1\endcsname
- \let\c_sync_n\lastnamedcs
- \global\advance\c_sync_n\plusone
- \enabletextarearegistration
- \setpositionplus{\s!syncpos:#1:\the\c_sync_n}{#2}\hpack{\strut}%
+\def\dodosyncposition#1#2#3%
+ {\letgvalue{\s!reset:\s!syncpos:#1}\relax
+ \letgvalue{\s!preset:\s!syncpos:#1}\relax
+ \ifcsname\s!syncpos:#1\endcsname
+ \global\advance\csname\s!num:\s!syncpos:#1\endcsname\plusone
+ \setsyncpositions{#1}%
+ % option: geen w/h, alleen p 0 0 0 data
+ \setpositionplus{\s!syncpos:#1:\the\csname\s!num:\s!syncpos:#1\endcsname}{#2}\hpack{\strut}%
\else
\strut
+ \fi}
+
+\def\setsyncpositions#1%
+ {\enabletextarearegistration
+ \getvalue {\s!set:\s!syncpos:#1}%
+ \letgvalue{\s!set:\s!syncpos:#1}\relax}
+
+\def\dosetsyncpositions#1%
+ {\startnointerference % removing out of sync can best be done in mp
+ \!!dimena\maxdimen
+ \!!counta\zerocount
+ \!!countc\zerocount
+ \doloop
+ {\doifelseposition{\s!syncpos:#1:\recurselevel}
+ {\!!dimenb\MPy{\s!syncpos:#1:\recurselevel}\relax
+ \!!countb\MPp{\s!syncpos:#1:\recurselevel}\relax
+ \ifnum\!!countb=\!!counta % same page
+ \ifdim\!!dimenb>\!!dimena
+ \donefalse % out of order nodes
+ \else
+ \donetrue % nodes in order
+ \fi
+ \else
+ \donetrue % different page
+ \fi
+ \ifdone
+ \!!counta\!!countb
+ \!!dimena\!!dimenb
+ \advance\!!countc\plusone
+ \edef\!!stringa{[#1][\the\!!countc]:=}%
+ \edef\!!stringc{\s!syncpos:#1:\the\!!countc}%
+ \edef\!!stringd{\MPplus\!!stringc{1}{0}}%
+ \setxvalue{\s!syncpos:#1}%
+ {\getsyncpositions{#1}%
+ sync_p \!!stringa \MPp \!!stringc ;
+ sync_xy\!!stringa \MPxy\!!stringc ;
+ sync_w \!!stringa \MPw \!!stringc ;
+ sync_h \!!stringa \MPh \!!stringc ;
+ sync_d \!!stringa \MPd \!!stringc ;
+ \ifx\!!stringd\empty \else sync_t \!!stringa \MPplus\!!stringc{1}{0} ; \fi}%
+ \fi}
+ {\setxvalue{\s!syncpos:#1}%
+ {\getsyncpositions{#1}%
+ sync_n[#1] := \the\!!countc ;}
+ \exitloop}}%
+ \stopnointerference}
+
+\def\getsyncpositions#1%
+ {\getvalue{\s!syncpos:#1}}
+
+\newtoks\resetsyncpositions
+\newtoks\presetsyncpositions
+
+\def\resyncposition {\dodoubleargument\doresyncposition}
+\def\presyncposition{\dodoubleargument\dopresyncposition}
+
+\def\dodoresyncposition #1#2{\dodosyncposition{#1}{#2}\s!reset}
+\def\dodopresyncposition#1#2{\dodosyncposition{#1}{#2}\s!preset}
+
+\def\doresyncposition [#1][#2]{\setxvalue{\s!reset :\s!syncpos:#1}{\noexpand\dodoresyncposition{#1}{#2}}}
+\def\dopresyncposition[#1][#2]{\setxvalue{\s!preset:\s!syncpos:#1}{\noexpand\dodopresyncposition{#1}{#2}}}
+
+\let\flushsyncpositions\relax
+
+\def\doflushsyncpositions % this order !
+ {\begingroup
+ \the\presetsyncpositions
+ \the\resetsyncpositions
+ \endgroup}
+
+\def\flushsyncxxsets#1%
+ {\begingroup
+ \setbox\scratchbox\hbox{\the#1}%
+ \ifvoid\scratchbox\else
+ \prewordbreak
+ %\let\prewordbreak\relax % only once
+ \smashbox\scratchbox
+ \box\scratchbox
\fi
- \ignorespaces}
+ \endgroup}
+
+\let\flushsyncresets \relax
+\let\flushsyncpresets\relax
+
+\def\doflushsyncresets {\flushsyncxxsets\resetsyncpositions }
+\def\doflushsyncpresets{\flushsyncxxsets\presetsyncpositions}
+
+% \appendtoks \flushsyncpositions \to \everypar
+% \appendtoks \flushsyncpositions \to \everyheadstart
+
+% \explicitneverypar -> in grid snapper, eerst testen
+%
+% \appendtoks \flushsyncpositions \to \neverypar
\protect
@@ -54,106 +163,41 @@
\starttext
-% \setuppapersize[A4][A3]
-
-\setuplayout[location=middle]
-
\setupbodyfont[dejavu]
\definesyncpositions[1]
-\definesyncpositions[2]
-
-% \enabletrackers[metapost.lua]
-
-\startMPdefinitions
- input "mp-asnc.mpiv" ;
-
- SetSyncColor(1,0,"magenta") ;
- SetSyncColor(1,1,"red") ;
- SetSyncColor(1,2,"green") ;
- SetSyncColor(1,3,"blue") ;
- SetSyncColor(1,4,"yellow") ;
-
- SetSyncColor(2,0,"magenta") ;
- SetSyncColor(2,1,"red") ;
- SetSyncColor(2,2,"green") ;
- SetSyncColor(2,3,"blue") ;
- SetSyncColor(2,4,"yellow") ;
-\stopMPdefinitions
-
-\startuseMPgraphic{sync1}
- StartPage ;
- StartSync(1) ;
- SyncHOffset := 0 ;
- SyncWidth := BackSpace - LeftMarginDistance;
- CollectSyncDataPage ;
- % ExtendSyncPaths ; % to top of text area
- PruneSyncPaths ; % clip top / bottom
- CollapseSyncPaths ;
- MakeSyncPaths ;
- % DrawSyncPaths ;
- FillSyncPaths ;
- StopSync ;
- clip currentpicture to Page ;
- setbounds currentpicture to Page ;
- StopPage ;
-\stopuseMPgraphic
-\startuseMPgraphic{sync2}
- StartSync(2) ;
- SyncHOffset := -1cm ;
- SyncWidth := 1cm ;
- CollectSyncDataRegion(OverlayRegion) ;
- ExtendSyncPaths ; % to top of text area
- MakeSyncPaths ;
- FillSyncPaths ;
- StopSync ;
- clip currentpicture to OverlayBox leftenlarged 1cm;
- setbounds currentpicture to OverlayBox ;
+\startuseMPgraphic{sync}
+ StartPage ;
+ \getsyncpositions{1} ;
+ SyncThreshold := 2LineHeight ;
+ SyncLeftOffset := -.5LeftMarginDistance ;
+ % SetSyncThreshold(1,3,3LineHeight) ;
+ SyncWidth := - (BackSpace + SyncLeftOffset) ;
+ SetSyncColor(1,1,\MPcolor{red}) ;
+ SetSyncColor(1,2,\MPcolor{green}) ;
+ SetSyncColor(1,3,\MPcolor{blue}) ;
+ SetSyncColor(1,4,\MPcolor{yellow}) ;
+ PrepareSyncTasks(1,true,true,false) ;
+ for i = 1 upto NOfSyncPaths :
+ fill SyncPaths[i]
+ withcolor TheSyncColor(CurrentSyncClass,sync_t[CurrentSyncClass][SyncTasks[i]]) ;
+ endfor ;
+ setbounds currentpicture to Page ;
+ StopPage ;
\stopuseMPgraphic
-\defineoverlay[tempoverlay1][\useMPgraphic{sync1}]
-\defineoverlay[tempoverlay2][\useMPgraphic{sync2}]
-
-\setupbackgrounds[page][background=tempoverlay1]
-
-\framed[region=yes,background=tempoverlay2,width=14cm,align=normal]{
- \syncposition[2][1]\samplefile{ward}\endgraf
- \syncposition[2][2]\samplefile{ward}\endgraf
- \syncposition[2][3]\samplefile{ward}\endgraf
-}
-
-
-\vskip1cm \hskip1cm \framed[region=yes,background=tempoverlay2,width=16cm,align=normal]{
- \syncposition[2][1]\samplefile{ward}\endgraf
- \syncposition[2][2]\samplefile{ward}\endgraf
- \syncposition[2][3]\samplefile{ward}\endgraf
-}
-
-\vskip1cm \hskip1cm \framed[region=yes,background=tempoverlay2,width=10cm,align=normal]{
- \syncposition[2][1]\samplefile{ward}\endgraf
- \syncposition[2][2]\samplefile{ward}\endgraf
- \syncposition[2][3]\samplefile{ward}\endgraf
-}
+\defineoverlay[tempoverlay][\useMPgraphic{sync}]
+\setupbackgrounds[page][background=tempoverlay]
-\dorecurse {100} {
-% \dorecurse {1} {
- \startchapter[title={Test #1}]
- \syncposition[1][1,reset]\dorecurse{20}{\samplefile{ward}\endgraf}
- \syncposition[1][2]\dorecurse {4}{\samplefile{ward}\endgraf}
- \syncposition[1][3]\dorecurse {7}{\samplefile{ward}\endgraf}
- \syncposition[1][4]\dorecurse {3}{\samplefile{ward}\endgraf}
- \stopchapter
-}
+\dorecurse {10} {
-\dorecurse {100} {
-% \dorecurse {1} {
\startchapter[title={Test #1}]
- \syncposition[1][1]\dorecurse{1}{\samplefile{ward}\endgraf}
- \syncposition[1][2]\dorecurse{1}{\samplefile{ward}\endgraf}
- \syncposition[1][3]\dorecurse{1}{\samplefile{ward}\endgraf}
- \syncposition[1][4]\dorecurse{1}{\samplefile{ward}\endgraf}
+ \syncposition[1][1] \dorecurse{10}{\input ward \endgraf}
+ \syncposition[1][2] \dorecurse {4}{\input ward \endgraf}
+ \syncposition[1][3] \dorecurse {7}{\input ward \endgraf}
+ \syncposition[1][4] \dorecurse {3}{\input ward \endgraf}
\stopchapter
}