summaryrefslogtreecommitdiff
path: root/tex/context/base/m-edtsnc.tex
diff options
context:
space:
mode:
Diffstat (limited to 'tex/context/base/m-edtsnc.tex')
-rw-r--r--tex/context/base/m-edtsnc.tex207
1 files changed, 207 insertions, 0 deletions
diff --git a/tex/context/base/m-edtsnc.tex b/tex/context/base/m-edtsnc.tex
new file mode 100644
index 000000000..0926f4488
--- /dev/null
+++ b/tex/context/base/m-edtsnc.tex
@@ -0,0 +1,207 @@
+%D \module
+%D [ file=m-editsnc,
+%D version=2003.12.23,
+%D title=\CONTEXT\ Modules,
+%D subtitle=Editor Synchronization,
+%D author={Hans Hagen \& Ton Otten},
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.edit for
+%C details.
+
+% \enablemode[demo]
+
+% This file is a variation of the file m-pdfsync. This time we do it
+% in a more abstract way and prepare ourselves for support in dvi
+% output.
+
+% \enableeditsync
+% \disableeditsync
+% \editsync
+% \editsynctext {string}
+% \editsyncnode {char}
+% \editsynctracemode [chardef: 0-4]
+
+\writestatus{editsync}{loading and enabling editor synchronization support}
+
+\unprotect % not really needed
+
+\ifx\pdfoutput\undefined
+ \donefalse
+\else\ifcase\pdfoutput
+ \donefalse
+\else\ifx\pdfsavepos\undefined
+ \donefalse
+\else
+ \donetrue
+\fi\fi\fi
+
+\chardef \editsyncstate \zerocount
+\chardef \editsynctracemode \zerocount
+\newcount \editsynccounter
+\newwrite \editsyncwrite
+
+\def\enableeditsync {\chardef\editsyncstate\plusone}
+\def\disableeditsync{\chardef\editsyncstate\zerocount}
+
+% The following definitions can go into the special drivers, but
+% for the moment we do it this way.
+
+\ifdone
+
+ \def\dostarteditsync
+ {\immediate\openout\editsyncwrite\jobname.pdfsync
+ \immediate\write\editsyncwrite{\jobname}%
+ \immediate\write\editsyncwrite{version 0}}
+
+ \def\dostopeditsync
+ {\closeout\editsyncwrite}
+
+ \def\doeditsyncregisterpage#1{\immediate\write\editsyncwrite{s\space\number#1}}
+ \def\doeditsyncopenfile #1{\immediate\write\editsyncwrite{(\space#1}}
+ \def\doeditsyncclosefile #1{\immediate\write\editsyncwrite{)}}
+
+ \def\doregistereditsyncnode#1#2#3% tag counter linenumber
+ {\pdfsavepos
+ \immediate\write\editsyncwrite{l\space\number#2\space\number#3}%
+ \expanded{\write\editsyncwrite{p\ifnum#1=\plusone*\fi\space\number#2\space\noexpand\the\pdflastxpos\space\noexpand\the\pdflastypos}}}
+
+\else
+
+ \let\dostarteditsync \relax
+ \let\dostopeditsync \relax
+
+ \let\doeditsyncregisterpage\gobbleoneargument
+ \let\doeditsyncopenfile \gobbleoneargument
+ \let\doeditsyncclosefile \gobbleoneargument
+ \let\doregistereditsyncnode\gobblethreearguments
+
+ % These specials could be filtered by a dvitopdf backend and
+ % written to a jobname.pdfsync file. In that case, the x and
+ % y coordinates have to be to be resolved by driver.
+
+ % \def\doeditsyncregisterpage#1{\special{pdfsync: s\space\number#1}}
+ % \def\doeditsyncopenfile #1{\special{pdfsync: ( #1}}
+ % \def\doeditsyncclosefile #1{\special{pdfsync: )}}
+
+ % \def\doregistereditsyncnode#1#2#3%
+ % {\special{pdfsync: l the\editsynccounter\space\number#3}%
+ % \special{pdfsync: p\ifnum#1=\plusone*\fi\space\number#2}}
+
+\fi
+
+\let\editsynctracer\gobbleoneargument
+
+\editsynccounter\minusone % counting starts at zero and we increment beforehand
+
+\def\registereditsyncnode#1% we assume #1 is one token
+ {\ifcase\editsyncstate
+ \expandafter\gobbleoneargument
+ \else
+ \global\advance\editsynccounter\plusone
+ \doregistereditsyncnode#1\editsynccounter\inputlineno
+ \expandafter\editsynctracer
+ \fi}
+
+\def\editsync {\registereditsyncnode\plusone *}
+\def\editsyncnode{\registereditsyncnode\zerocount}
+\def\editsynctext{\registereditsyncnode\plusone }
+
+\appendtoks \dostarteditsync \to \everystarttext
+%appendtoks \dostopeditsync \to \everystoptext
+\appendtoks \doeditsyncregisterpage\realfolio \to \everyshipout
+\appendtoks \doeditsyncopenfile\readfilename \to \everybeforereadfile
+\appendtoks \doeditsyncclosefile\readfilename \to \everyafterreadfile
+
+\appendtoks \enableeditsync \to \everystarttext
+\appendtoks \disableeditsync \to \everypagebody
+
+\def\editsynctracer#1%
+ {\ifcase\editsynctracemode\else
+ \begingroup
+ \forgetall
+ \disableeditsync
+ \ifcase\editsynctracemode\or % could be done more efficient, box around ifcase
+ \setbox\scratchbox\hbox to \zeropoint{\hss\infofont#1\hss}% 1
+ \else
+ \setbox\scratchbox\hbox to \zeropoint{\hss\traceboxplacementtrue\boxcursor\hss}% 2/3/4
+ \fi
+ \smashbox\scratchbox\box\scratchbox
+ \ifcase\editsynctracemode\or\or\or
+ \setbox\scratchbox\hbox to \zeropoint{\hss\raise1.25ex\hbox{\infofont#1}\hss}% 3
+ \smashbox\scratchbox\box\scratchbox
+ \or
+ \setbox\scratchbox\hbox to \zeropoint{\hss\lower1.25ex\hbox{\infofont#1}\hss}% 4
+ \smashbox\scratchbox\box\scratchbox
+ \fi
+ \endgroup
+ \fi}
+
+% \def\editsynctracer#1% more efficient but unreadable
+% {\ifcase\editsynctracemode\else
+% \ifcase\editsyncstate\else
+% \begingroup
+% \forgetall
+% \disableeditsync
+% \setbox\scratchbox\hbox to \zeropoint
+% {\hss
+% \ifcase\editsynctracemode\or
+% \infofont#1% 1
+% \else
+% \traceboxplacementtrue\boxcursor% 2/3/4
+% \fi
+% \hss}%
+% \smashbox\scratchbox\box\scratchbox
+% \setbox\scratchbox\hbox to \zeropoint
+% {\hss
+% \ifcase\editsynctracemode\or\or\or
+% \raise1.25ex\hbox{\infofont#1}% 3
+% \or
+% \lower1.25ex\hbox{\infofont#1}% 4
+% \fi
+% \hss}%
+% \smashbox\scratchbox\box\scratchbox
+% \endgroup
+% \fi
+% \fi}
+
+% beware, adding nodes this way will interfere with the typesetting
+
+\appendtoks \editsyncnode p\to \everypar
+\appendtoks \editsyncnode m\to \everymath
+\appendtoks \editsyncnode d\to \everydisplay
+\appendtoks \editsyncnode h\to \everyhbox
+
+% For compatibility with 'pdfsync4context' we provide:
+
+\let\pdfsyncstart\enableeditsync
+\let\pdfsyncstop \disablepdfsync
+\let\pdfsync \editsync
+
+\protect
+
+\doifnotmode{demo}{\endinput}
+
+\chardef\editsynctracemode=3
+
+\starttext
+
+\chapter{Test}
+
+\processfile{tufte}
+
+\startitemize
+\item first
+\item second
+\stopitemize
+
+\processfile{tufte}
+
+\startlines
+some local \editsync sync and \editsynctext{here}a marked point
+some local \editsync sync and \editsyncnode{here}a marked point
+\stoplines
+
+\stoptext