summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/context/base/mkxl/spac-par.mkxl
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/tex/context/base/mkxl/spac-par.mkxl')
-rw-r--r--Master/texmf-dist/tex/context/base/mkxl/spac-par.mkxl456
1 files changed, 456 insertions, 0 deletions
diff --git a/Master/texmf-dist/tex/context/base/mkxl/spac-par.mkxl b/Master/texmf-dist/tex/context/base/mkxl/spac-par.mkxl
new file mode 100644
index 00000000000..134a60e2a02
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/mkxl/spac-par.mkxl
@@ -0,0 +1,456 @@
+%D \module
+%D [ file=spac-par,
+%D version=2009.10.16, % 1997.03.31, was core-spa.tex
+%D title=\CONTEXT\ Spacing Macros,
+%D subtitle=Paragraphs,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Spacing Macros / Paragraphs}
+
+\registerctxluafile{spac-par}{autosuffix}
+
+\unprotect
+
+% TODO: \appendtoks \strut \wrapuppar{\strut}\to \everypar
+
+%D New experimental stuff:
+
+% this might move to syst-ini.mkxl
+
+\setnewconstant\paragraphupdatecodes\numexpr
+ \frozentolerancecode
+ + \frozenloosenesscode
+ + \frozenlinepenaltycode
+ + \frozenwidowpenaltycode
+ + \frozenclubpenaltycode
+ + \frozenbrokenpenaltycode
+ + \frozendemeritscode
+\relax
+
+\setnewconstant\paragraphpenaltycodes\numexpr
+ \frozenlinepenaltycode
+ + \frozenwidowpenaltycode
+ + \frozenclubpenaltycode
+ + \frozenbrokenpenaltycode
+\relax
+
+\setnewconstant\paragraphdemeritcodes\numexpr
+ \frozendemeritscode
+\relax
+
+\setnewconstant\paragraphshapecodes\numexpr
+ \frozenhangcode
+ + \frozenskipcode
+ + \frozenparfillcode
+ + \frozenshapecode
+\relax
+
+\setnewconstant\paragraphlinecodes\numexpr
+ \frozenlinecode
+\relax
+
+\setnewconstant\paragraphhyphenationcodes\numexpr
+ \frozenhyphenationcode
+\relax
+
+\setnewconstant\frozenparagraphdefault\numexpr
+ \frozenhsizecode % \hsize
+ + \frozenskipcode % \leftskip \rightskip
+ + \frozenhangcode % \hangindent \hangafter
+ + \frozenindentcode % \parindent
+ + \frozenparfillcode % \parfillskip \parfillleftskip
+ + \frozenadjustcode % \adjustspacing
+ + \frozenprotrudecode % \protrudechars
+ + \frozentolerancecode % \tolerance \pretolerance
+ + \frozenstretchcode % \emergcystretch
+ + \frozenloosenesscode % \looseness
+ + \frozenlastlinecode % \lastlinefit
+ + \frozenlinepenaltycode % \linepenalty \interlinepenalty \interlinepenalties
+ + \frozenclubpenaltycode % \clubpenalty \clubpenalties
+ + \frozenwidowpenaltycode % \widowpenalty \widowpenalties
+ + \frozendisplaypenaltycode % \displaypenalty \displaypenalties
+ + \frozenbrokenpenaltycode % \brokenpenalty
+ + \frozendemeritscode % \doublehyphendemerits \finalhyphendemerits \adjdemerits
+ + \frozenshapecode % \parshape
+ % \frozenlinecode % \baselineskip \lineskip \lineskiplimit
+ + \frozenhyphenationcode % \hyphenationmode
+\relax
+
+\permanent\protected\def\freezeparagraphproperties {\snapshotpar\frozenparagraphdefault}
+\permanent\protected\def\defrostparagraphproperties{\snapshotpar\zerocount}
+
+\permanent\protected\def\updateparagraphproperties{\ifhmode\snapshotpar\paragraphupdatecodes \fi}
+\permanent\protected\def\updateparagraphpenalties {\ifhmode\snapshotpar\paragraphpenaltycodes\fi}
+\permanent\protected\def\updateparagraphdemerits {\ifhmode\snapshotpar\paragraphdemeritcodes\fi}
+\permanent\protected\def\updateparagraphshapes {\ifhmode\snapshotpar\paragraphshapecodes \fi}
+\permanent\protected\def\updateparagraphlines {\ifhmode\snapshotpar\paragraphlinecodes \fi}
+
+% so far
+
+\let\spac_paragraph_freeze\relax
+
+\permanent\protected\def\setparagraphfreezing {\enforced\let\spac_paragraph_freeze\freezeparagraphproperties}
+\permanent\protected\def\forgetparagraphfreezing{\enforced\let\spac_paragraph_freeze\relax}
+
+\installcorenamespace {bparwrap}
+\installcorenamespace {eparwrap}
+\installcorenamespace {parwrapbefore}
+\installcorenamespace {parwrapafter}
+\installcorenamespace {parwrapcount}
+
+\let\spac_paragraph_wrap\relax
+
+\newcount\c_spac_paragraph_group_level
+
+\protected\def\spac_paragraph_update
+ {\c_spac_paragraph_group_level\currentgrouplevel\relax
+ \ifcsname\??bparwrap\the\c_spac_paragraph_group_level\endcsname
+ \the\lastnamedcs
+ \relax
+ \dontleavehmode % just in case
+ \wrapuppar{\the\csname\??eparwrap\the\c_spac_paragraph_group_level\endcsname\relax}%
+ \fi}
+
+\permanent\protected\def\registerparwrapper {\spac_register_par_wrapper\toksapp\tokspre}
+\permanent\protected\def\registerparwrapperreverse{\spac_register_par_wrapper\tokspre\toksapp}
+
+\protected\def\spac_paragraph_install
+ {\expandafter\newtoks\csname\??bparwrap\the\currentgrouplevel\endcsname
+ \expandafter\newtoks\csname\??eparwrap\the\currentgrouplevel\endcsname}
+
+\def\spac_paragraph_install_count#1%
+ {\expandafter\newcount\csname\??parwrapcount#1\endcsname}
+
+\def\spac_paragraph_install_pair#1#2#3%
+ {\expandafter\newtoks\csname\??parwrapbefore#3\endcsname
+ \expandafter\newtoks\csname\??parwrapafter #3\endcsname
+ #1\csname\??bparwrap\the\currentgrouplevel\endcsname{\the\csname\??parwrapbefore#3\endcsname}%
+ #2\csname\??eparwrap\the\currentgrouplevel\endcsname{\the\csname\??parwrapafter #3\endcsname}}
+
+\def\spac_register_par_wrapper_yes#1#2#3#4#5%
+ {\ifcsname\??bparwrap\the\currentgrouplevel\endcsname \else
+ \spac_paragraph_install
+ \fi
+ \ifcsname\??parwrapcount#3\endcsname \else
+ \spac_paragraph_install_count{#3}%
+ \fi
+ \ifcsname\??parwrapbefore#3\endcsname \else
+ \spac_paragraph_install_pair#1#2{#3}%
+ \fi
+ #1\csname\??parwrapbefore#3\endcsname{\advance\csname\??parwrapcount#3\endcsname\plusone\relax
+ \clf_setparwrapper{#3}#4}%
+ #2\csname\??parwrapafter #3\endcsname{#5}%
+ \clf_newparwrapper{#3}%
+ \enforced\let\spac_paragraph_wrap\spac_paragraph_update}
+
+\def\spac_register_par_wrapper_nop#1#2#3#4#5%
+ {\ifcsname\??parwrapcount#3\endcsname \else
+ \spac_paragraph_install_count{#3}%
+ \fi
+ \csname\??parwrapcount#3\endcsname\plusone
+ #4\wrapuppar{#5}}
+
+\protected\def\spac_register_par_wrapper
+ {\ifhmode
+ \expandafter\spac_register_par_wrapper_nop
+ \else
+ \expandafter\spac_register_par_wrapper_yes
+ \fi}
+
+\permanent\protected\def\forgetparwrapper
+ {\csname\??bparwrap\the\currentgrouplevel\endcsname\emptytoks
+ \csname\??eparwrap\the\currentgrouplevel\endcsname\emptytoks}
+
+\permanent\protected\def\unregisterparwrapper#1%
+ {\csname\??parwrapcount#1\endcsname\zerocount
+ \ifcsname\??parwrapbefore#1\endcsname
+ \lastnamedcs\emptytoks
+ \csname\??parwrapafter#1\endcsname\emptytoks
+ \fi}
+
+\permanent\def\directparwrapper#1#2%
+ {#1\wrapuppar{#2}}
+
+\permanent\protected\def\doifelseparwrapper#1%
+ {\unless\ifcsname\??parwrapcount#1\endcsname
+ \expandafter\secondoftwoarguments
+ \orelse\ifcase\lastnamedcs
+ \expandafter\secondoftwoarguments
+ \else
+ \expandafter\firstoftwoarguments
+ \fi}
+
+% \getparwrapper % defined in lua
+% \lastparwrapper % defined in lua
+
+\permanent\protected\def\showparwrapperstate#1%
+ {\begingroup
+ \infofont ΒΆ#1\hilo
+ {\smallinfofont\getparwrapper {#1}}%
+ {\smallinfofont\lastparwrapper{#1}}%
+ \endgroup}
+
+%appendtoks\updateparwrapperindeed\to\everypar
+%appendtoks\spac_paragraph_wrap \to\everypar
+%appendtoks\spac_paragraph_freeze \to\everypar
+
+\setparagraphfreezing
+
+\appendtoks\enforced\let\spac_paragraph_wrap\relax\to\everyforgetall
+
+%D In due time, the code below will be upgraded using the above mechanisms.
+
+%D The dreadful sequence \type {\bgroup} \unknown\ \type {\carryoverpar} \unknown\
+%D \type {\egroup} is needed when for instance sidefloats are used in combination
+%D with something that starts with a group. This is because otherwise the
+%D indentation as set (by the output routine) inside the group are forgotten
+%D afterwards. (I must not forget its existence).
+
+\mutable\let\currentparagraphproperties\empty % visible for tracing
+
+\permanent\def\carryoverpar#1% #1 can be \endgroup or \egroup or ... expandable !
+ {\normalexpanded
+ {\noexpand#1%
+ \hangindent\the\hangindent
+ \hangafter \the\hangafter
+ \parskip \the\parskip
+ \leftskip \the\leftskip
+ \rightskip \the\rightskip
+ \relax}}
+
+\permanent\protected\def\pushparagraphproperties
+ {\edef\currentparagraphproperties{\carryoverpar\relax}%
+ \pushmacro\currentparagraphproperties}
+
+\permanent\protected\def\popparagraphproperties
+ {\popmacro\currentparagraphproperties
+ \currentparagraphproperties}
+
+\permanent\protected\def\flushparagraphproperties
+ {\popmacro\currentparagraphproperties}
+
+%D Beware, changing this will break some code (like pos/backgrounds) but it has been
+%D changed anyway so let's see where things go wrong.
+
+\installcorenamespace{paragraphintro}
+
+\let\spac_paragraphs_flush_intro\relax % hook into everypar
+
+\newtoks\t_spac_paragraphs_intro_first
+\newtoks\t_spac_paragraphs_intro_next
+\newtoks\t_spac_paragraphs_intro_each
+
+\newconditional\c_spac_paragraphs_intro_first
+\newconditional\c_spac_paragraphs_intro_next
+\newconditional\c_spac_paragraphs_intro_each
+
+\let\spac_paragraphs_flush_intro\relax
+\let\spac_paragraphs_intro_step \relax
+
+\permanent\protected\tolerant\def\setupparagraphintro[#1]#*[#2]%
+ {\def\spac_paragraphs_intro_step##1%
+ {\csname\??paragraphintro\ifcsname\??paragraphintro##1\endcsname##1\fi\endcsname{#2}}%
+ \processcommacommand[#1]\spac_paragraphs_intro_step}
+
+\letcsname\??paragraphintro\empty\endcsname\gobbleoneargument
+
+\defcsname\??paragraphintro\v!reset\endcsname#1%
+ {\global\setfalse\c_spac_paragraphs_intro_first
+ \global\setfalse\c_spac_paragraphs_intro_next
+ \global\setfalse\c_spac_paragraphs_intro_each
+ \global\t_spac_paragraphs_intro_first\emptytoks
+ \global\t_spac_paragraphs_intro_next \emptytoks
+ \global\t_spac_paragraphs_intro_each \emptytoks
+ \glet\spac_paragraphs_flush_intro\relax}
+
+\defcsname\??paragraphintro\v!first\endcsname#1%
+ {\global\settrue\c_spac_paragraphs_intro_first
+ \gtoksapp\t_spac_paragraphs_intro_first{#1}%
+ \glet\spac_paragraphs_flush_intro\spac_paragraphs_flush_intro_indeed}
+
+\defcsname\??paragraphintro\v!next\endcsname#1%
+ {\global\settrue\c_spac_paragraphs_intro_next
+ \gtoksapp\t_spac_paragraphs_intro_next{#1}%
+ \glet\spac_paragraphs_flush_intro\spac_paragraphs_flush_intro_indeed}
+
+\defcsname\??paragraphintro\v!each\endcsname#1%
+ {\global\settrue\c_spac_paragraphs_intro_each
+ \gtoksapp\t_spac_paragraphs_intro_each{#1}%
+ \glet\spac_paragraphs_flush_intro\spac_paragraphs_flush_intro_indeed}
+
+%D We can say:
+%D
+%D \starttyping
+%D \setupparagraphintro[first][\index{Knuth}]
+%D \stoptyping
+%D
+%D Maybe more convenient is:
+%D
+%D \starttyping
+%D \flushatparagraph{\index{Zapf}}
+%D \stoptyping
+%D
+%D \starttyping
+%D \setupparagraphintro[first][\hbox to 3.5em{\tt FIRST \hss}]
+%D \setupparagraphintro[first][\hbox to 3.5em{\tt TSRIF \hss}]
+%D \setupparagraphintro[next] [\hbox to 3.5em{\tt NEXT \hss}]
+%D \setupparagraphintro[next] [\hbox to 3.5em{\tt TXEN \hss}]
+%D \setupparagraphintro[each] [\hbox to 3.0em{\tt EACH \hss}]
+%D \setupparagraphintro[each] [\hbox to 3.0em{\tt HCEA \hss}]
+%D
+%D some paragraph \par
+%D some paragraph \par
+%D some paragraph \par
+%D some paragraph \par
+%D
+%D \setupparagraphintro[first][\hbox to 3.5em{\tt FIRST \hss}]
+%D \setupparagraphintro[first][\hbox to 3.5em{\tt TSRIF \hss}]
+%D
+%D some paragraph \par
+%D some paragraph \par
+%D
+%D \setupparagraphintro[reset]
+%D
+%D some paragraph \par
+%D \stoptyping
+
+\permanent\protected\def\flushatparagraph#1%
+ {\global\c_spac_paragraphs_intro_first\plusone
+ \gtoksapp\t_spac_paragraphs_intro_first{#1}%
+ \glet\spac_paragraphs_flush_intro\spac_paragraphs_flush_intro_indeed}
+
+%D Here comes the flusher (we misuse the one level expansion of token registers to
+%D feed a nice stream into the paragraph.)
+
+\protected\def\spac_paragraphs_flush_intro_indeed % we make sure that the token lists expand directly
+ {\normalexpanded{% % after another so the first code is there twice
+ \ifconditional\c_spac_paragraphs_intro_each
+ \ifconditional\c_spac_paragraphs_intro_next
+ \glet\spac_paragraphs_flush_intro\spac_paragraphs_flush_intro_next
+ \else
+ \glet\spac_paragraphs_flush_intro\spac_paragraphs_flush_intro_each
+ \fi
+ \ifconditional\c_spac_paragraphs_intro_first
+ \global\setfalse\c_spac_paragraphs_intro_first
+ \global\t_spac_paragraphs_intro_first\emptytoks
+ \the\t_spac_paragraphs_intro_first
+ \fi
+ \the\t_spac_paragraphs_intro_each
+ \else
+ \ifconditional\c_spac_paragraphs_intro_next
+ \glet\spac_paragraphs_flush_intro\spac_paragraphs_flush_intro_next
+ \fi
+ \ifconditional\c_spac_paragraphs_intro_first
+ \global\setfalse\c_spac_paragraphs_intro_first
+ \global\t_spac_paragraphs_intro_first\emptytoks
+ \the\t_spac_paragraphs_intro_first
+ \fi
+ \fi}}
+
+\protected\def\spac_paragraphs_flush_intro_next
+ {\normalexpanded{%
+ \global\setfalse\c_spac_paragraphs_intro_next
+ \global\t_spac_paragraphs_intro_next\emptytoks
+ \ifconditional\c_spac_paragraphs_intro_each
+ \glet\spac_paragraphs_flush_intro\spac_paragraphs_flush_intro_each
+ \the\t_spac_paragraphs_intro_next
+ \the\t_spac_paragraphs_intro_each
+ \else
+ \glet\spac_paragraphs_flush_intro\relax
+ \the\t_spac_paragraphs_intro_next
+ \fi}}
+
+\protected\def\spac_paragraphs_flush_intro_each
+ {\the\t_spac_paragraphs_intro_each}
+
+%D \macros
+%D {flushatnextpar}
+%D
+%D This macro collects data that will be flushed at the next paragraph. By using
+%D this macro you can avoid interfering nodes (writes, etc).
+
+\aliased\let\flushpostponednodedata\relax % hook into everypar
+
+\newbox \b_spac_postponed_data
+%newcount\c_spac_postponed_data
+
+% \installcorenamespace {postponednodesstack}
+%
+% \initializeboxstack\??postponednodesstack
+%
+% \protected\def\pushpostponednodedata
+% {\global\advance\c_spac_postponed_data\plusone
+% \savebox\??postponednodesstack{\the\c_spac_postponed_data}{\box\b_spac_postponed_data}}
+%
+% \protected\def\poppostponednodedata
+% {\global\setbox\b_spac_postponed_data\hbox{\foundbox\??postponednodesstack{\the\c_spac_postponed_data}}%
+% \global\advance\c_spac_postponed_data\minusone
+% \ifvoid\b_spac_postponed_data\else
+% \enforced\glet\flushpostponednodedata\spac_postponed_data_flush
+% \fi}
+
+\newtoks\everyflushatnextpar
+
+\permanent\protected\def\pushpostponednodedata
+ {\globalpushbox\b_spac_postponed_data}
+
+\permanent\protected\def\poppostponednodedata
+ {\globalpopbox\b_spac_postponed_data
+ \ifvoid\b_spac_postponed_data\else
+ \enforced\glet\flushpostponednodedata\spac_postponed_data_flush
+ \fi}
+
+\permanent\protected\def\flushatnextpar
+ {\begingroup
+ \the\everyflushatnextpar
+ \enforced\glet\flushpostponednodedata\spac_postponed_data_flush
+ \dowithnextboxcs\spac_postponed_data_finish\hpack}
+
+% \def\spac_postponed_data_finish
+% {\global\setbox\b_spac_postponed_data\hpack % to\zeropoint
+% {\box\b_spac_postponed_data\box\nextbox}%
+% \endgroup}
+%
+% This is better when used with protrusion which does not like too deeply nested
+% boxes:
+%
+% \def\spac_postponed_data_finish
+% {\dontcomplain
+% \global\setbox\b_spac_postponed_data\hpack to \zeropoint
+% {\unhbox\b_spac_postponed_data\unhbox\nextbox}%
+% \endgroup}
+%
+% We could do this if there is content with widths ... not that is should be used
+% that way, but this way we don't overflow:
+
+\def\spac_postponed_data_finish
+ {\dontcomplain
+ \global\setbox\b_spac_postponed_data\hpack % to \zeropoint
+ {\unhbox\b_spac_postponed_data
+ \scratchdimen\wd\nextbox
+ \unhbox\nextbox
+ \ifcase\scratchdimen\else\kern-\b_spac_postponed_data\fi}%
+ \endgroup}
+
+\def\spac_postponed_data_flush
+ {%\iftrialtypesetting \else
+ \ifvoid\b_spac_postponed_data\else
+ \hpack{\smashedbox\b_spac_postponed_data}% \box\b_spac_postponed_data
+ \fi
+ \enforced\glet\flushpostponednodedata\relax
+ }%\fi}
+
+\permanent\protected\def\doflushatpar % might be renamed
+ {\ifvmode
+ \expandafter\flushatnextpar
+ \else
+ \expandafter\firstofoneargument
+ \fi}
+
+\protect \endinput