summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--tex/context/base/buff-ini.mkiv9
-rw-r--r--tex/context/base/cont-new.mkii2
-rw-r--r--tex/context/base/cont-new.mkiv2
-rw-r--r--tex/context/base/context-version.pdfbin4074 -> 4063 bytes
-rw-r--r--tex/context/base/context-version.pngbin104985 -> 103799 bytes
-rw-r--r--tex/context/base/context.mkii2
-rw-r--r--tex/context/base/context.mkiv4
-rw-r--r--tex/context/base/core-ini.mkiv2
-rw-r--r--tex/context/base/core-mis.mkiv1029
-rw-r--r--tex/context/base/enco-ini.mkiv38
-rw-r--r--tex/context/base/grph-inc.lua2
-rw-r--r--tex/context/base/grph-inc.mkiv19
-rw-r--r--tex/context/base/grph-trf.mkiv6
-rw-r--r--tex/context/base/mult-aux.mkiv3
-rw-r--r--tex/context/base/mult-sys.mkiv5
-rw-r--r--tex/context/base/pack-com.mkiv350
-rw-r--r--tex/context/base/page-lay.mkiv14
-rw-r--r--tex/context/base/spac-ali.mkiv5
-rw-r--r--tex/context/base/status-files.pdfbin24277 -> 24242 bytes
-rw-r--r--tex/context/base/status-lua.pdfbin171571 -> 170726 bytes
-rw-r--r--tex/context/base/status-mkiv.lua25
-rw-r--r--tex/context/base/supp-box.mkiv9
-rw-r--r--tex/context/base/syst-lua.lua8
-rw-r--r--tex/context/base/typo-brk.lua116
-rw-r--r--tex/context/base/typo-brk.mkiv88
-rw-r--r--tex/context/base/typo-cap.lua41
-rw-r--r--tex/context/base/typo-cap.mkiv70
-rw-r--r--tex/context/base/typo-del.mkiv607
-rw-r--r--tex/context/base/typo-dig.lua41
-rw-r--r--tex/context/base/typo-dig.mkiv6
-rw-r--r--tex/context/base/typo-mar.mkiv20
-rw-r--r--tex/context/base/typo-rep.lua43
-rw-r--r--tex/context/base/typo-rep.mkiv10
-rw-r--r--tex/context/base/typo-spa.lua18
-rw-r--r--tex/generic/context/luatex/luatex-fonts-merged.lua2
35 files changed, 1375 insertions, 1221 deletions
diff --git a/tex/context/base/buff-ini.mkiv b/tex/context/base/buff-ini.mkiv
index 0d240e1a9..0512910ce 100644
--- a/tex/context/base/buff-ini.mkiv
+++ b/tex/context/base/buff-ini.mkiv
@@ -34,7 +34,7 @@
{\ctxcommand{erasebuffer("#1")}}
\setuvalue{\e!start\v!buffer}%
- {\bgroup
+ {\begingroup % (1)
\obeylines
\dosingleempty\buff_start}
@@ -45,7 +45,7 @@
{\normalexpanded{\buff_pickup{#2}{#3}{#4}{}{\buff_stop{#4}}}}
\unexpanded\def\grabbufferdata % was: \dostartbuffer
- {\bgroup
+ {\begingroup % (1)
\obeylines
\doquadrupleempty\buff_grab_direct_indeed}
@@ -64,12 +64,13 @@
\unexpanded\def\buff_pickup#1#2#3#4#5% name, startsequence, stopsequence, before, after
{#4%
- \bgroup
+ \begingroup % (2)
\edef\catcodetableofbuffer{\number\catcodetable}%
\ctxcommand{erasebuffer("#1")}%
\setcatcodetable\vrbcatcodes
\def\buff_finish
- {\egroup
+ {\endgroup % (1)
+ \endgroup % (2)
#5}%
\def\buff_gobble##1#3% is detokenize needed? TEST
%{\ctxcommand{grabbuffer("#1","#2","#3",\!!bs\detokenize{##1}\!!es)} % space ?
diff --git a/tex/context/base/cont-new.mkii b/tex/context/base/cont-new.mkii
index 86e6a0374..43da43bd6 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.01.11 14:58}
+\newcontextversion{2012.01.12 11:03}
%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 89a754665..dd3bf86dd 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.01.11 14:58}
+\newcontextversion{2012.01.12 11:03}
%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
index edaaa063f..6c7fccec0 100644
--- a/tex/context/base/context-version.pdf
+++ b/tex/context/base/context-version.pdf
Binary files differ
diff --git a/tex/context/base/context-version.png b/tex/context/base/context-version.png
index 4a65db342..44fc1db1b 100644
--- a/tex/context/base/context-version.png
+++ b/tex/context/base/context-version.png
Binary files differ
diff --git a/tex/context/base/context.mkii b/tex/context/base/context.mkii
index cefbf66b7..944066f75 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.01.11 14:58}
+\edef\contextversion{2012.01.12 11:03}
%D For those who want to use this:
diff --git a/tex/context/base/context.mkiv b/tex/context/base/context.mkiv
index 65423c066..5f6719619 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.01.11 14:58}
+\edef\contextversion{2012.01.12 11:03}
%D For those who want to use this:
@@ -406,6 +406,8 @@
\loadmarkfile{strc-lnt}
\loadmarkfile{core-mis}
+\loadmarkfile{pack-com}
+\loadmarkfile{typo-del}
\loadmarkfile{grph-trf}
\loadmarkfile{grph-inc}
diff --git a/tex/context/base/core-ini.mkiv b/tex/context/base/core-ini.mkiv
index cdaa02a21..0c369ff3a 100644
--- a/tex/context/base/core-ini.mkiv
+++ b/tex/context/base/core-ini.mkiv
@@ -36,7 +36,7 @@
\appendtoks \registerparoptions \to \everypar
\appendtoks \flushsyncpositions \to \everypar
\appendtoks \flushpostponednodedata \to \everypar
-\appendtoks \dohandlerepeatdelimitedtext \to \everypar
+\appendtoks \typo_delimited_repeat \to \everypar
\appendtoks \insertparagraphintro \to \everypar
\appendtoks \flushpostponedbookmark \to \neverypar
diff --git a/tex/context/base/core-mis.mkiv b/tex/context/base/core-mis.mkiv
index 1e21fc60c..299a01fa2 100644
--- a/tex/context/base/core-mis.mkiv
+++ b/tex/context/base/core-mis.mkiv
@@ -1,4 +1,3 @@
-
%D \module
%D [ file=core-mis,
%D version=1998.01.29,
@@ -16,21 +15,6 @@
% needs to be redone
-% %D You would not expect the next macro in \CONTEXT,
-% %D wouldn't you? It's there to warn \LATEX\ users that
-% %D something is wrong.
-% %D
-% %D Obsolete now:
-% %
-% % \def\documentstyle{\showmessage\m!system3\empty\stoptekst}
-% %
-% % \let\documentclass=\documentstyle
-% %D \macros
-% %D {simplifiedcommands, simplifycommands}
-% %D
-% %D I first needed this simplification in bookmarks. Users can
-% %D add their own if needed.
-
\unprotect
%D Sometimes (for instance in bookmarks) we need to simplify macro
@@ -60,15 +44,6 @@
% THIS WAS MAIN-002.TEX
-%\def\checkinterlineskip
-% {\ifvmode
-% \ifdim\lastskip>\zeropoint
-% \nointerlineskip
-% \else\ifdim\lastkern>\zeropoint
-% \nointerlineskip
-% \fi\fi
-% \fi}
-
\def\horitems#1#2% #1=breedte #2=commandos
{\scratchdimen#1%
\divide\scratchdimen \nofitems
@@ -197,11 +172,6 @@
\c!inbetween={\blank[\v!medium]},
\c!after=\blank]
-% Te zijner tijd [plaats=boven,onder,midden] implementeren,
-% in dat geval moet eerst de maximale hoogte worden bepaald.
-%
-% Overigens kan een en ander mooier met \halign.
-
% there is quite some historic balast in this mechanism, the next variant
% is a first cleanup
@@ -419,6 +389,8 @@
\paragraphparameter\c!after
\egroup}
+% Is this used at all?
+
\def\dosetuptab[#1]%
{\getparameters[\??ta]
[\c!headstyle=\v!normal,
@@ -445,663 +417,6 @@
\setuptab
[\c!location=\v!left]
-\unexpanded\def\celsius #1{#1\mathematics{^\circ}C}
-\unexpanded\def\inch {\mathematics{\prime\prime}} % was: \hbox{\rm\char125\relax}
-\unexpanded\def\fraction#1#2{\mathematics{#1\over#2}}
-
-% very dutch
-
-\unexpanded\def\graden {\mathematics{^\circ}}
-
-\def\bedragprefix {\euro\normalfixedspace}
-\def\bedragsuffix {}
-\def\bedragempty {\euro}
-
-\unexpanded\def\bedrag#1%
- {\strut\hbox\bgroup
- \let\normalfixedspace\nonbreakablespace
- \doifelsenothing{#1}
- {\bedragempty}
- {\bedragprefix\digits{#1}\bedragsuffix}%
- \egroup}
-
-% \definieeralineas[test][n=3]
-%
-% \stelalineasin[test][3][breedte=4cm,uitlijnen=links]
-%
-% \startopelkaar
-% \test hans \\ ton \\ \bedrag{1.000,--} \\
-% \test hans \\ ton \\ \bedrag{~.~~1,--} \\
-% \test hans \\ ton \\ \bedrag{~.~~1,~~} \\
-% \test hans \\ ton \\ \bedrag{~.100,--} \\
-% \test hans \\ ton \\ \subtot{1.000,--} \\
-% \test hans \\ ton \\ \bedrag{1.000,--} \\
-% \test hans \\ ton \\ \bedrag{1.000,--} \\
-% \test hans \\ ton \\ \totaal{1.000,--} \\
-% \test hans \\ ton \\ \bedrag{nihil,--} \\
-% \test hans \\ ton \\ \totaal{nihil,--} \\
-% \test hans \\ ton \\ \subtot{nihil,--} \\
-% \stopopelkaar
-
-\def\periodswidth {.5em}
-\def\periodsdefault{3} % was 5, but now it's like \unknown
-
-\unexpanded\def\periods
- {\dosingleempty\doperiods}
-
-% \def\doperiods[#1]% todo: also n=,width= or maybe just #1,#2
-% {\dontleavehmode
-% \begingroup
-% \scratchdimen\periodswidth
-% \hbox to \iffirstargument#1\else\periodsdefault\fi \scratchdimen
-% {\leaders\hbox to \scratchdimen{\hss.\hss}\hss}%
-% \endgroup}
-%
-% better for export:
-
-\def\doperiods[#1]% todo: also n=,width= or maybe just #1,#2
- {\dontleavehmode
- \hbox\bgroup
- \setbox\scratchbox\hbox to \periodswidth{\hss.\hss}%
- \dorecurse{\iffirstargument#1\else\periodsdefault\fi}{\copy\scratchbox}%
- \egroup}
-
-\unexpanded\def\unknown
- {\periods\relax} % relax prevents lookahead for []
-
-% Example by Wolfgang Schuster on the context list:
-%
-% \unexpanded\def\fourdots{{\def\periodswidth{.3em}\periods[4]}}
-%
-% Hello\fourdots\ World\fourdots \par Hello\fourdots\ World.
-
-\setnewconstant\boundarycharactermode\plusone
-
-\def\midboundarycharacter#1#2%
- {\ifcase\boundarycharactermode
- \or
- %\nobreak
- \hskip\hspaceamount\currentlanguage{#2}%
- \languageparameter#1%
- %\nobreak
- \hskip\hspaceamount\currentlanguage{#2}%
- \or
- \languageparameter#1%
- \fi
- \boundarycharactermode\plusone}
-
-\def\leftboundarycharacter#1#2%
- {\ifcase\boundarycharactermode
- \or
- \languageparameter#1%
- \nobreak
- \hskip\hspaceamount\currentlanguage{#2}%
- \or
- \languageparameter#1%
- \fi
- \boundarycharactermode\plusone}
-
-\def\rightboundarycharacter#1#2%
- {\ifcase\boundarycharactermode
- \or
- \prewordbreak %\nobreak
- \hskip\hspaceamount\currentlanguage{#2}%
- \languageparameter#1%
- \or
- \languageparameter#1%
- \fi
- \boundarycharactermode\plusone}
-
-% actually this is pretty old, but temporary moved here
-%
-% obsolete:
-
-\unexpanded\def\setuphyphenmark
- {\dodoubleargument\getparameters[\??kp]}
-
-\unexpanded\def\setuphyphenmark[#1]% sign=normal|wide
- {\dodoubleargument\getparameters[\??kp][#1]%
- \doifelse\@@kpsign {\v!normal}% was inset?
- {\let\textmodehyphen\normalhyphen \let\textmodehyphendiscretionary\normalhyphendiscretionary}
- {\let\textmodehyphen\composedhyphen\let\textmodehyphendiscretionary\composedhyphendiscretionary}}
-
-\setuphyphenmark[\c!sign=\v!wide]
-% % \setuphyphenmark[\c!sign=\v!normal]
-
-\definesymbol[\c!lefthyphen] [\languageparameter\c!lefthyphen]
-\definesymbol[\c!righthyphen] [\languageparameter\c!righthyphen]
-\definesymbol[\c!hyphen] [\languageparameter\c!hyphen]
-
-\def\normalhyphen
- {\hbox{\directsymbol\empty\c!hyphen}}
-
-\def\composedhyphen
- {\hbox{\directsymbol\empty\c!compoundhyphen}}
-
-\def\normalhyphendiscretionary
- {\discretionary
- {\hbox{\directsymbol\empty\c!righthyphen}}
- {\hbox{\directsymbol\empty\c!lefthyphen}}
- {\hbox{\directsymbol\empty\c!hyphen}}}
-
-\def\composedhyphendiscretionary
- {\discretionary
- {\hbox{\directsymbol\empty\c!rightcompoundhyphen}}
- {\hbox{\directsymbol\empty\c!leftcompoundhyphen}}
- {\hbox{\directsymbol\empty\c!compoundhyphen}}}
-
-\let\textmodehyphen \composedhyphen
-\let\textmodehyphendiscretionary\composedhyphendiscretionary
-
-\definesymbol[\c!leftcompoundhyphen] [\languageparameter\c!leftcompoundhyphen]
-\definesymbol[\c!rightcompoundhyphen] [\languageparameter\c!rightcompoundhyphen]
-\definesymbol[\c!compoundhyphen] [\languageparameter\c!compoundhyphen]
-
-\definehspace [sentence] [\zeropoint]
-\definehspace [intersentence] [.250em]
-
-\definesymbol
- [\c!midsentence]
- [\midboundarycharacter\c!midsentence{sentence}]
-
-\definesymbol
- [\c!leftsentence]
- [\leftboundarycharacter\c!leftsentence{sentence}]
-
-\definesymbol
- [\c!rightsentence]
- [\rightboundarycharacter\c!rightsentence{sentence}]
-
-\definesymbol
- [\c!leftsubsentence]
- [\leftboundarycharacter\c!leftsubsentence{sentence}]
-
-\definesymbol
- [\c!rightsubsentence]
- [\rightboundarycharacter\c!rightsubsentence{sentence}]
-
-\newsignal \subsentencesignal
-\newcount \subsentencelevel
-
-\let\beforesubsentence\donothing
-\let\aftersubsentence \donothing
-
-% todo: make this language option
-%
-% \def\beforesubsentence{\removeunwantedspaces}
-% \def\aftersubsentence {\ignorespaces}
-
-\def\midsentence
- {\symbol[\c!midsentence]}
-
-\def\beginofsubsentence
- {\beforesubsentence
- \ifdim\lastkern=\subsentencesignal
- \unskip
- \kern\hspaceamount\currentlanguage{intersentence}%
- \fi
- \global\advance\subsentencelevel\plusone
- \ifnum\subsentencelevel=\plusone
- \dontleavehmode % was \leaveoutervmode
- \fi
- \dostarttagged\t!subsentence\empty
- \symbol[\ifodd\subsentencelevel\c!leftsentence\else\c!leftsubsentence\fi]%
- }% \ignorespaces}
-
-\def\endofsubsentence % relax prevents space gobbling
- {\symbol[\ifodd\subsentencelevel\c!rightsentence\else\c!rightsubsentence\fi]%
- \dostoptagged
- \global\advance\subsentencelevel\minusone
- \unskip
- \kern\subsentencesignal\relax
- \aftersubsentence}
-
-\def\beginofsubsentencespacing % relax prevents space gobbling
- {\kern\subsentencesignal\relax}% \ignorespaces}
-
-\def\endofsubsentencespacing
- {\ifdim\lastkern=\subsentencesignal
- \unskip
- \hskip\hspaceamount\currentlanguage{intersentence}%
- % no good, actually language dependent:
-% \ignorespaces
- \else
- \unskip
- \fi}
-
-%D \startbuffer
-%D test |<|test |<|test|>| test|>| test \par
-%D test|<|test|<|test|>|test|>|test \par
-%D test |<||<|test|>||>| test \par
-%D test \directdiscretionary{<}test\directdiscretionary{>} test \par
-%D \stopbuffer
-%D
-%D \typebuffer
-%D \getbuffer
-
-\unexpanded\def\startsubsentence{\beginofsubsentence \prewordbreak\beginofsubsentencespacing}
-\unexpanded\def\stopsubsentence {\endofsubsentencespacing\prewordbreak\endofsubsentence}
-\unexpanded\def\subsentence {\groupedcommand\startsubsentence\stopsubsentence}
-
-\definehspace [quotation] [\zeropoint]
-\definehspace [interquotation] [.125em]
-
-%definehspace [quote] [\zeropoint]
-%definehspace [speech] [\zeropoint]
-
-\definehspace [quote] [\hspaceamount\currentlanguage{quotation}]
-\definehspace [speech] [\hspaceamount\currentlanguage{quotation}]
-
-\definesymbol
- [\c!leftquotation]
- [\leftboundarycharacter\c!leftquotation{quotation}]
-
-\definesymbol
- [\c!rightquotation]
- [\rightboundarycharacter\c!rightquotation{quotation}]
-
-\definesymbol
- [\c!leftquote]
- [\leftboundarycharacter\c!leftquote{quote}]
-
-\definesymbol
- [\c!rightquote]
- [\rightboundarycharacter\c!rightquote{quote}]
-
-\definesymbol
- [\c!leftspeech]
- [\leftboundarycharacter\c!leftspeech{speech}]
-
-\definesymbol
- [\c!rightspeech]
- [\rightboundarycharacter\c!rightspeech{speech}]
-
-\definesymbol
- [\c!middlespeech]
- [\leftboundarycharacter\c!middlespeech{speech}]
-
-\appendtoks\def\quotation#1{"#1"}\to\simplifiedcommands
-\appendtoks\def\quote #1{'#1'}\to\simplifiedcommands
-
-%D The next features was so desperately needed by Giuseppe
-%D Bilotta that he made a module for it. Since this is a
-%D typical example of core functionality, I decided to extend
-%D the low level quotation macros in such a way that a speech
-%D feature could be build on top of it. The speech opening and
-%D closing symbols are defined per language. Italian is an
-%D example of a language that has them set.
-
-% this will replace the quotation and speed definitions
-
-% todo: \typo_ namespace
-
-\newsignal\delimitedtextsignal
-
-\let\currentdelimitedtext\s!unknown
-
-\def\delimitedtextlevel{\csname\??ci:\currentdelimitedtext:\c!level\endcsname}
-
-\def\doinitializetextlevel#1%
- {\ifcsname\??ci:#1:\c!level\endcsname
- \csname\??ci:#1:\c!level\endcsname\zerocount
- \else
- \expandafter\newcount\csname\??ci:#1:\c!level\endcsname
- \fi}
-
-\def\delimitedtextparameter#1% will be sped up
- {\executeifdefined{\??ci\currentdelimitedtext:\number\delimitedtextlevel#1}%
- {\executeifdefined{\??ci\currentdelimitedtext#1}%
- {\executeifdefined{\??ci#1}\empty}}}
-
-\unexpanded\def\definedelimitedtext
- {\dodoubleempty\dodefinedelimitedtext}
-
-\def\dodefinedelimitedtext[#1][#2]%
- {\doinitializetextlevel{#1}%
- \doifassignmentelse{#2}
- {\getparameters
- [\??ci#1]
- [\c!location=\v!margin, % \v!text \v!paragraph
- \c!spacebefore=,
- \c!spaceafter=\delimitedtextparameter\c!spacebefore,
- \c!style=\v!normal,
- \c!color=,
- \c!leftmargin=\zeropoint,
- \c!rightmargin=\delimitedtextparameter\c!leftmargin,
- \c!indentnext=\v!yes,
- \c!before=,
- \c!after=,
- \c!left=,
- \c!right=,
- %\c!level=0,
- \c!repeat=\v!no,
- \c!method=,
- #2]}%
- {\doifdefined{#2}
- {\copyparameters[\??ci#1][\??ci#2]
- [\c!location,\c!spacebefore,\c!spaceafter,\c!style,\c!color,
- \c!leftmargin,\c!rightmargin,\c!indentnext,
- \c!before,\c!after,\c!left,\c!right]}}%
- \doifsomething{#1}
- {\setuvalue{#1}{\delimitedtext[#1]}%
- \setuvalue{\e!start#1}{\startdelimitedtext[#1]}% u added
- \setuvalue{\e!stop #1}{\stopdelimitedtext}}} % u added
-
-\unexpanded\def\setupdelimitedtext
- {\dotripleargument\dosetupdelimitedtext}
-
-\def\dosetupdelimitedtext[#1][#2][#3]% #2 = optional level
- {\ifthirdargument
- \getparameters[\??ci#1:#2][#3]%
- \else\ifsecondargument
- \getparameters[\??ci#1][#2]%
- \else
- \getparameters[\??ci][#1]%
- \fi\fi}
-
-\def\dorepeatdelimitedtext
- {\relax\ifcase\delimitedtextlevel\else
- \dohandledelimitedtext\c!middle % maybe better \dohandleleftdelimitedtext
- \fi}
-
-\let\dohandlerepeatdelimitedtext\relax
-
-\unexpanded\def\startdelimitedtext[#1]%
- {\begingroup
- \pushdelimitedtext{#1}%
- \dostarttagged\t!delimitedblock\currentdelimitedtext
- \doifelse{\delimitedtextparameter\c!method}\s!font
- {\let\dostopdelimitedtext\typo_delimitedtexts_finish_font
- \ignoredelimitedtext\c!left\ignorespaces}
- {\doifelse{\delimitedtextparameter\c!repeat}\v!yes
- {\let\dohandlerepeatdelimitedtext\dorepeatdelimitedtext}%
- {\let\dohandlerepeatdelimitedtext\relax}%
- \doifinsetelse{\delimitedtextparameter\c!location}{\v!paragraph,\v!margin}%
- {\dosingleempty\dostartdelimitedtextpar}\dostartdelimitedtexttxt}}
-
-\def\typo_delimitedtexts_finish_font
- {\removeunwantedspaces\ignoredelimitedtext\c!right}
-
-\def\dostartdelimitedtextpar[#1]%
- {\let\dostopdelimitedtext\dostopdelimitedtextpar
- \doifsomething{\delimitedtextparameter\c!spacebefore}
- {\blank[\delimitedtextparameter\c!spacebefore]}%
- \delimitedtextparameter\c!before
- % nicer:
- % \doadaptleftskip {\delimitedtextparameter\c!leftmargin}%
- % \doadaptrightskip{\delimitedtextparameter\c!rightmargin}%
- % backward compatible:
- \doifelsenothing{#1}
- {\endgraf
- \doadaptleftskip {\delimitedtextparameter\c!leftmargin}%
- \doadaptrightskip{\delimitedtextparameter\c!rightmargin}%
- \let\dodostopdelimitedtextpar\endgraf}
- {\startnarrower[#1]\let\dodostopdelimitedtextpar\stopnarrower}%
- % so far
- \pushmacro\checkindentation
- \doifsomething{\delimitedtextparameter\c!indenting} % WS
- {\setupindenting[\delimitedtextparameter\c!indenting]}%
- \begingroup
- \dousestylehashparameter{\??ci\currentdelimitedtext}\c!style
- \dousecolorhashparameter{\??ci\currentdelimitedtext}\c!color
- \leftdelimitedtextmark
- \ignorespaces}
-
-\def\dostopdelimitedtextpar
- {\removeunwantedspaces
- \removelastskip
- \rightdelimitedtextmark
- \endgroup
- \popmacro\checkindentation
- \dodostopdelimitedtextpar
- \delimitedtextparameter\c!after
- \doifsomething{\delimitedtextparameter\c!spaceafter}
- {\blank[\delimitedtextparameter\c!spaceafter]}%
- \useindentnextparameter\delimitedtextparameter
- \dorechecknextindentation}% AM: This was missing!
-
-\def\dostartdelimitedtexttxt
- {\let\dostopdelimitedtext\dostopdelimitedtexttxt
- \begingroup
- \dousestylehashparameter{\??ci\currentdelimitedtext}\c!style
- \dousecolorhashparameter{\??ci\currentdelimitedtext}\c!color
- \dohandleleftdelimitedtext\c!left
- \ignorespaces}
-
-\def\dostopdelimitedtexttxt
- {\removeunwantedspaces
- \dohandlerightdelimitedtext\c!right
- \endgroup}
-
-\unexpanded\def\stopdelimitedtext
- {\dostopdelimitedtext
- \dostoptagged
- \popdelimitedtext
- \endgroup}
-
-\def\pushdelimitedtext#1%
- {\globalpushmacro\currentdelimitedtext
- \def\currentdelimitedtext{#1}%
- \global\advance\delimitedtextlevel\plusone}
-
-\def\popdelimitedtext
- {\global\advance\delimitedtextlevel\minusone
- \globalpopmacro\currentdelimitedtext}
-
-\unexpanded\def\delimitedtext[#1]%
- {\dontleavehmode % following ones can be omited
- \pushdelimitedtext{#1}%
- \doifelse{\delimitedtextparameter\c!method}\s!font
- {\dofontdrivendelimited}
- {\doifinsetelse{\delimitedtextparameter\c!location}{\v!paragraph,\v!margin}%
- \dodelimitedtextpar\dodelimitedtexttxt}}
-
-% shortcuts
-
-\unexpanded\def\startdelimited{\startdelimitedtext}
-\unexpanded\def\stopdelimited {\stopdelimitedtext} % no let, dynamically assigned
- \def\delimited {\delimitedtext}
-
-\def\leftdelimitedtextmark
- {\doifsomething{\delimitedtextparameter\c!left}
- {\setbox\scratchbox\hbox{\delimitedtextparameter\c!left}%
- \dontleavehmode
- \doif{\delimitedtextparameter\c!location}\v!margin{\hskip-\wd\scratchbox}%
- \box\scratchbox}}
-
-\def\rightdelimitedtextmark
- {\doifsomething{\delimitedtextparameter\c!right}
- {\hsmash{\delimitedtextparameter\c!right}}}
-
-% \starttext
-% \hyphenatedword{groepsvrijstellingsverordeningen}\par
-% \hyphenatedword{\quote{groepsvrijstellingsverordeningen}}\par
-% \dorecurse{100}{\hskip300pt\hskip\recurselevel pt test \quote{xxx xxxx}.\par}
-% \page \setuppapersize[A5][A4]
-% \quotation {overly beautiful pusillanimous sesquipedalian
-% longwinded} test test test test test test test test test test test
-% test test test test test test test test test test test test test
-% test test test test test test test test test test test test test
-% test test test test test test test test test test test test test
-% test test test
-% \stoptext
-
-\def\dohandledelimitedtext#1#2%
- {\begingroup
- \setbox\scratchbox\hbox{\delimitedtextparameter#1}%
- \ifdim\wd\scratchbox>\zeropoint
- \ifdim\lastkern=\delimitedtextsignal
- \unkern
- \hskip\hspaceamount\currentlanguage{interquotation}%
- \else
- #2%
- \fi
- \ifhmode % else funny pagebeaks
- \penalty\plustenthousand
- \hskip\zeropoint % == \prewordbreak
- \fi
- \strut % new, needed below
- \delimitedtextparameter#1% unhbox\scratchbox
- % \penalty\plustenthousand % else overfull boxes, but that's better than dangling periods
- \kern\delimitedtextsignal % +- \prewordbreak
- \fi
- \endgroup}
-
-\def\dohandleleftdelimitedtext#1#2%
- {\begingroup
- \setbox\scratchbox\hbox{\delimitedtextparameter#1}%
- \ifdim\wd\scratchbox>\zeropoint
- \ifdim\lastkern=\delimitedtextsignal
- \unkern
- \hskip\hspaceamount\currentlanguage{interquotation}%
- \else\ifdim\lastskip=\delimitedtextsignal
- \unskip
- \hskip\hspaceamount\currentlanguage{interquotation}%
- \else
- #2%
- \fi\fi
- \strut % new, needed below
- \ifhmode % else funny pagebeaks
- \penalty\plustenthousand
- \hskip\zeropoint % == \prewordbreak
- \fi
- \strut % new, needed below
- \delimitedtextparameter#1% unhbox\scratchbox
- \hskip\delimitedtextsignal % +- \prewordbreak
- \fi
- \endgroup}
-
-\def\dohandlerightdelimitedtext#1#2%
- {\begingroup
- \setbox\scratchbox\hbox{\delimitedtextparameter#1}%
- \ifdim\wd\scratchbox>\zeropoint
- \ifdim\lastkern=\delimitedtextsignal
- \unkern
- \penalty\plustenthousand
- \hskip\hspaceamount\currentlanguage{interquotation}%
- \else\ifdim\lastskip=\delimitedtextsignal
- \unskip
- \penalty\plustenthousand
- \hskip\hspaceamount\currentlanguage{interquotation}%
- \else
- #2%
- \fi\fi
- \ifhmode % else funny pagebeaks
- \penalty\plustenthousand
- \hskip\zeropoint % == \prewordbreak
- \fi
- \strut % new, needed below
- \delimitedtextparameter#1% unhbox\scratchbox
- \kern\delimitedtextsignal % +- \prewordbreak
- \fi
- \endgroup}
-
-
-\def\ignoredelimitedtext#1%
- {\delimitedtextparameter#1}
-
-\def\handledelimitedtext#1%
- {\dohandledelimitedtext{#1}\relax}
-
-\def\handleleftdelimitedtext#1%
- {\dohandleleftdelimitedtext{#1}\relax}
-
-\def\handlerightdelimitedtext#1%
- {\dohandlerightdelimitedtext{#1}\relax}
-
-\unexpanded\def\dodelimitedtextpar
- {\groupedcommand
- {\dostarttagged\t!delimited\currentdelimitedtext % block?
- \dohandleleftdelimitedtext\c!left\relax}
- {\dohandlerightdelimitedtext\c!right\removelastskip
- \dostoptagged
- \popdelimitedtext}}
-
-\unexpanded\def\dodelimitedtexttxt
- {\doifelse{\delimitedtextparameter\c!style}\v!normal
- \doquoteddelimited\doattributeddelimited}
-
-\def\doquoteddelimited
- {\groupedcommand
- {\dostarttagged\t!delimited\currentdelimitedtext
- \dohandleleftdelimitedtext\c!left\relax}
- {\dohandlerightdelimitedtext\c!right
- \removelastskip
- \dostoptagged
- \popdelimitedtext}}
-
-\def\doattributeddelimited
- {\groupedcommand
- {\dostarttagged\t!delimited\currentdelimitedtext
- \dousestylehashparameter{\??ci\currentdelimitedtext}\c!style
- \dousecolorhashparameter{\??ci\currentdelimitedtext}\c!color}
- {\dostoptagged
- \popdelimitedtext}}
-
-\def\dofontdrivendelimited
- {\simplegroupedcommand
- {\dostarttagged\t!delimited\currentdelimitedtext
- \languageparameter{\c!left\currentdelimitedtext}}
- {\languageparameter{\c!right\currentdelimitedtext}%
- \dostoptagged
- \popdelimitedtext}}
-
-% testcase for nesting:
-%
-% \quotation{... \quotation{...} ...}
-% \startquotation ... \startquotation... \quotation{...} \stopquotation\space ...\stopquotation
-% \setupdelimitedtext[quotation][1][left=(,right=)]
-% \setupdelimitedtext[quotation][2][left={[},right={]}]
-% \setupdelimitedtext[quotation][3][left=\{,right=\}]
-% \quotation{... \quotation{...} ...}
-% \startquotation ... \startquotation... \quotation{...} \stopquotation\space ...\stopquotation
-
-\definedelimitedtext
- [\v!quotation]
- [\c!left={\symbol[\c!leftquotation]},
- \c!right={\symbol[\c!rightquotation]},
- \c!leftmargin=\v!standard]
-
-\definedelimitedtext
- [\v!quote][\v!quotation]
-
-\setupdelimitedtext
- [\v!quote]
- [\c!location=\v!text,
- \c!left={\symbol[\c!leftquote]},
- \c!right={\symbol[\c!rightquote]}]
-
-\definedelimitedtext
- [\v!blockquote][\v!quotation]
-
-\setupdelimitedtext
- [\v!blockquote]
- [\c!left=,
- \c!right=]
-
-\definedelimitedtext
- [\v!speech][\v!quotation]
-
-\setupdelimitedtext
- [\v!speech]
- [\c!repeat=\v!yes,
- \c!left={\symbol[\c!leftspeech]},
- \c!middle={\symbol[\c!middlespeech]},
- \c!right={\symbol[\c!rightspeech]}]
-
-% how do we call an tight quote
-%
-% \definedelimitedtext
-% [\v!quotation][\v!quotation]
-%
-% \setupdelimitedtext
-% [\v!quotation]
-% [\c!indentnext=\v!no,
-% \c!spacebefore=\v!nowhite]
-
-\unexpanded\def\setupquotation{\setupdelimitedtext[\v!quotation]}
-\unexpanded\def\setupquote {\setupdelimitedtext[\v!quote]}
-
% seldom used, move from kernel to run time module
\ifx\tfx\undefined \let\tfx\relax \fi
@@ -1219,41 +534,6 @@
\let\grid\basegrid
-% only used at pragma, move from kernel to run time module
-
-\def\referraldate
- {\currentdate[\v!referral]}
-
-\def\doreferral[#1]%
- {\noheaderandfooterlines
- \bgroup
- \getparameters
- [\??km]
- [\c!bet=\unknown,\c!dat=\unknown,\c!ken=\unknown,
- \c!from=,\c!to=,\c!ref=,#1]%
- % moet anders, hoort niet in 01b
- \assigntranslation[\s!nl=referentie,\s!en=reference,\s!de=Referenz,\s!hr=referenca,\s!sp=referencia]\to\@@@kmref
- \assigntranslation[\s!nl=van,\s!en=from,\s!de=Von,\s!hr=od,\s!sp=de]\to\@@@kmvan
- \assigntranslation[\s!nl=aan,\s!en=to,\s!de=An,\s!hr=za,\s!sp=a]\to\@@@kmaan
- \assigntranslation[\s!nl=betreft,\s!en=concerns,\s!de=Betreff,\s!hr=predmet,\s!sp=]\to\@@@kmbet
- \assigntranslation[\s!nl=datum,\s!en=date,\s!de=Datum,\s!hr=datum,\s!sp=fecha]\to\@@@kmdat
- \assigntranslation[\s!nl=kenmerk,\s!en=mark,\s!de=Kennzeichen,\s!hr=oznaka,\s!sp=]\to\@@@kmken
- %
- \definetabulate[\s!dummy][|l|p|]
- \startdummy
- \NC\@@@kmbet\EQ\@@kmbet\NC\NR
- \NC\@@@kmdat\EQ\@@kmdat\NC\NR
- \NC\@@@kmken\EQ\expanded{\smallcapped{\@@kmken}}\NC\NR
- \doifsomething{\@@kmfrom\@@kmto}{\NC\NC\NC\NR}%
- \doifsomething \@@kmfrom {\NC\@@@kmvan\EQ\@@kmfrom\NC\NR}%
- \doifsomething \@@kmto {\NC\@@@kmaan\EQ\@@kmto\NC\NR}%
- \doifsomething \@@kmref {\NC\NC\NC\NR\NC\@@@kmref\EQ\@@kmref\NC\NR}%
- \stopdummy
- \egroup}
-
-\def\referral
- {\dosingleargument\doreferral}
-
\definetabulate
[\v!legend]
[|emj1|i1|mR|]
@@ -1433,6 +713,12 @@
%D \stopitemize}}
%D \stoptyping
+\newsystemmode{pairedbox}
+
+\appendtoks
+ \global\resetsystemmode{pairedbox}%
+\to \everyinsidefloat
+
\newbox\firstpairedbox
\newbox\secondpairedbox
@@ -1610,294 +896,6 @@
\definepairedbox[\v!legend]
-%D Goody (to be reconsidered):
-
-\newsystemmode{combination}
-\newsystemmode{pairedbox}
-
-\appendtoks
- \global\resetsystemmode{combination}%
- \global\resetsystemmode{pairedbox}%
-\to \everyinsidefloat
-
-% todo: \startcombination \startcomb \stopcomb ...
-
-% needs to be mkiv'd (we could map this onto bTABLE)
-
-\newcount\horcombination % counter
-\newcount\totcombination
-
-\unexpanded\def\definecombination
- {\dodoubleempty\dodefinecombination}
-
-\def\dodefinecombination[#1][#2]%
- {\copyparameters
- [\??co#1][\??co]
- [\c!width,\c!height,\c!distance,\c!location,%
- \c!before,\c!inbetween,\c!after,\c!align,%
- \c!style,\c!color]%
- \getparameters
- [\??co#1][#2]}
-
-\unexpanded\def\setupcombinations
- {\dodoubleempty\dosetupcombinations}
-
-\def\dosetupcombinations[#1][#2]%
- {\ifsecondargument
- \getparameters[\??co#1][#2]%
- \else
- \getparameters[\??co][#1]%
- \fi}
-
-\def\combinationparameter#1%
- {\csname\??co\currentcombination#1\endcsname}%
-
-\unexpanded\def\startcombination
- {\bgroup % so we can grab a group
- \dodoubleempty\dostartcombination}
-
-% \startcombination {alpha} {a} {beta} {b} \stopcombination
-% \startcombination[2*1] {alpha} {a} {beta} {b} \stopcombination
-% \startcombination[1*2] {alpha} {a} {beta} {b} \stopcombination
-% \startcombination[2] {alpha} {a} {beta} {b} \stopcombination
-
-\def\dostartcombination[#1][#2]% needs a cleanup, also nx ny (pretty old, this one)
- {\global\setsystemmode{combination}%
- \doifnothing{#1}\firstargumentfalse % to be sure (when called in macros)
- \doifnothing{#2}\secondargumentfalse % to be sure (when called in macros)
- \ifsecondargument % todo: nx ny
- \def\currentcombination{#1}%
- \edef\currentcombinationspec{#2*1*}%
- \else % better : \doifcombinationelse ... \??co#1\c!location
- \doifinstringelse{*}{#1}
- {\let\currentcombination\empty
- \edef\currentcombinationspec{#1*1*}}
- {\doifnumberelse{#1}
- {\let\currentcombination\empty
- \edef\currentcombinationspec{#1*1*}}
- {\def\currentcombination{#1}%
- \edef\currentcombinationspec{2*1*}}}%
- \fi
- \forgetall
- \dostarttagged\t!combination\currentcombination
- \doifelse{\combinationparameter\c!height}\v!fit
- \vbox {\vbox to \combinationparameter\c!height}%
- \bgroup
- \let\combination\empty % permits \combination{}{} handy for cld
- \setuphorizontaldivision
- [\c!n=\v!fit,\c!distance=\combinationparameter\c!distance]%
- \expanded{\dodostartcombination[\currentcombinationspec]}}
-
-\ifdefined\dotagcombination \else \let\dotagcombination\relax \fi
-
-\long\def\dodostartcombination[#1*#2*#3]%
- {\global\horcombination#1%
- \global\totcombination#2%
- \dotagcombination
- \global\setbox\combinationstack\emptybox
- \xdef\maxhorcombination{\the\horcombination}%
- \multiply\totcombination\horcombination
- \tabskip\zeropoint
- \doifelse{\combinationparameter\c!width}\v!fit
- {\halign}{\halign to \combinationparameter\c!width}%
- \bgroup
- &%
- %\hfil##\hfil% now : location={left,top}
- \expanded{\doifnotinset{\v!left}{\combinationparameter\c!location}}\hfil
- ##%
- \expanded{\doifnotinset{\v!right}{\combinationparameter\c!location}}\hfil
- &%
- \tabskip\zeropoint \!!plus 1fill
- ##%
- \cr
- \docombination}
-
-\def\docombination % we want to add struts but still ignore an empty box
- {\dostarttagged\t!combinationpair\empty
- \dostarttagged\t!combinationcontent\empty
- \dowithnextboxcs\docombinationfinish\hbox}
-
-\def\docombinationfinish % we want to add struts but still ignore an empty box
- {\dostoptagged
- \setbox0\flushnextbox
- \dostarttagged\t!combinationcaption\empty
- \dowithnextbox
- {\dostoptagged
- \dostoptagged
- \setbox2\flushnextbox
- \dodocombination}%
- \vtop\bgroup
- \afterassignment\donextcombination\let\nexttoken=}
-
-\def\donextcombination
- {\futurelet\nexttoken\donextnextcombination}
-
-\def\donextnextcombination
- {\ifx\nexttoken\egroup \else % the next box is empty
- \hsize\wd0
- \setupalign[\combinationparameter\c!align]%
- \dousestylehashparameter{\??co\currentcombination}\c!style
- \dousecolorhashparameter{\??co\currentcombination}\c!color
- \bgroup
- \aftergroup\endstrut
- \aftergroup\egroup
- \begstrut
- \fi}
-
-\def\depthonlybox
- {\dowithnextbox{\vtop{\hsize\wd\nextbox\kern\zeropoint\box\nextbox}}\vbox}
-
-\def\dodocombination
- {\vbox
- {\forgetall % \setupwhitespace[\v!none]%
- \let\next\vbox
- \expanded{\processallactionsinset[\combinationparameter\c!location]}
- [ \v!top=>\let\next\depthonlybox, % \tbox,
- \v!middle=>\let\next\halfwaybox]%
- \next{\copy0}%
- % we need to save the caption for a next alignment line
- \saveoncombinationstack2}%
- \ifnum\totcombination>\plusone
- \global\advance\totcombination\minusone
- \global\advance\horcombination\minusone
- \ifnum\horcombination=\zerocount
- \doubleexpandafter\docombinationa
- \else
- \doubleexpandafter\docombinationb
- \fi
- \else
- \expandafter\docombinationc
- \fi}
-
-\def\docombinationa
- {\cr
- \flushcombinationstack
- \noalign
- {\forgetall % \setupwhitespace[\v!none]% no
- \global\setbox\combinationstack\emptybox
- \nointerlineskip
- \combinationparameter\c!after
- \combinationparameter\c!before
- \vss
- \nointerlineskip}%
- \global\horcombination\maxhorcombination\relax
- \docombination}
-
-\def\docombinationb
- {&&&\hskip\combinationparameter\c!distance&\docombination}
-
-\def\docombinationc
- {\cr
- \flushcombinationstack
- \egroup}
-
-% formally ok:
-%
-% \unexpanded\def\stopcombination
-% {\egroup
-% \egroup}
-%
-% more robust:
-%
-% \unexpanded\def\stopcombination
-% {{}{}{}{}{}{}{}{}% catches (at most 4) missing entries
-% \egroup
-% \egroup}
-%
-% even better:
-
-\unexpanded\def\stopcombination
- {{\scratchtoks{{}{}{}}\dorecurse\totcombination{\appendtoks{}{}{}{}\to\scratchtoks}\expandafter}\the\scratchtoks
- \egroup
- \dostoptagged
- \egroup}
-
-\newbox\combinationstack
-
-\def\saveoncombinationstack#1%
- {\global\setbox\combinationstack\hbox
- {\hbox{\box#1}\unhbox\combinationstack}}
-
-\def\flushcombinationstack
- {\noalign
- {\ifdim\ht\combinationstack>\zeropoint
- \nointerlineskip % nieuw
- \combinationparameter\c!inbetween
- \global\horcombination\maxhorcombination
- \globallet\doflushcombinationstack\dodoflushcombinationstack
- \else
- \global\setbox\combinationstack\emptybox
- \globallet\doflushcombinationstack\donothing
- \fi}%
- \doflushcombinationstack\crcr}
-
-\gdef\dodoflushcombinationstack
- {\global\setbox\combinationstack\hbox
- {\unhbox\combinationstack
- \global\setbox1\lastbox}%
- \box1% \ruledhbox{\box1}%
- \global\advance\horcombination\minusone\relax
- \ifnum\horcombination>\zerocount
- \expandafter\dodoflushcombinationstacknext
- \else
- \global\setbox\combinationstack\emptybox
- \fi}
-
-\def\dodoflushcombinationstacknext
- {&&&&\doflushcombinationstack}
-
-\setupcombinations
- [\c!width=\v!fit,
- \c!height=\v!fit,
- \c!distance=1em,
- \c!location=\v!bottom, % can be something {top,left}
- \c!before=\blank,
- \c!inbetween={\blank[\v!medium]},
- \c!style=,
- \c!color=,
- \c!after=,
- \c!align=\v!middle]
-
-%D \macros
-%D {startfloatcombination}
-%D
-%D \setupexternalfigures[directory={../sample}]
-%D \startbuffer
-%D \placefigure
-%D [left,none]
-%D {}
-%D {\startfloatcombination[2*2]
-%D \placefigure{alpha}{\externalfigure[cow.pdf][width=1cm]}
-%D \placefigure{beta} {\externalfigure[cow.pdf][width=2cm]}
-%D \placefigure{gamma}{\externalfigure[cow.pdf][width=3cm]}
-%D \placefigure{delta}{\externalfigure[cow.pdf][width=4cm]}
-%D \stopfloatcombination}
-%D
-%D \input tufte
-%D \stopbuffer
-%D
-%D \typebuffer \getbuffer
-
-\unexpanded\def\startfloatcombination
- {\dodoubleempty\dostartfloatcombination}
-
-\let\startfloatcombination\relax
-
-\def\dostartfloatcombination[#1][#2]%
- {\vbox\bgroup
- %\insidecolumnstrue % trick, forces no centering, todo: proper switch/feature
- \postcenterfloatmethod\zerocount
- \forcelocalfloats
- \unexpanded\def\stopfloatcombination{\dostopfloatcombination{#1}}}
-
-\unexpanded\def\dostopfloatcombination#1%
- {\scratchtoks\emptytoks
- \dorecurse\noflocalfloats
- {\appendetoks{\noexpand\getlocalfloat{\recurselevel}}{}\to\scratchtoks}% brrr
- \expanded{\startcombination[#1]\the\scratchtoks}\stopcombination
- \resetlocalfloats
- \egroup}
-
\unexpanded\def\placerelativetoeachother#1#2%
{\bgroup
\dowithnextbox
@@ -1957,9 +955,8 @@
[\c!distance=\emwidth,
\c!n=\v!fit]
-%D This one is for Daniel Pittman, who wanted tight
-%D fractions. We show three versions. First the simple
-%D one using \type {\low} and \type {high}:
+%D This one is for Daniel Pittman, who wanted tight fractions. We show
+%D three versions. First the simple one using \type {\low} and \type {high}:
%D
%D \startbuffer
%D \def\vfrac#1#2%
@@ -2017,7 +1014,7 @@
\lower\dp0\hbox{\raise\dp2\hbox{\txx#2}}%
\fi}}
-\ifx\vfrac\undefined \let\vfrac\vulgarfraction \fi
+\ifdefined\vfrac \else \let\vfrac\vulgarfraction \fi
%D \starttabulate
%D \HL
@@ -2029,7 +1026,7 @@
%D \NC 3 \NC \vulgarfractionmethod3 \vulgarfraction{1}{2} \NC\NR
%D \HL
%D \stoptabulate
-
+
%D Under construction:
%D
%D \starttyping
@@ -2041,6 +1038,8 @@
%D \commalistsentence[a,b,c][+,-]
%D \stoptyping
+% obsolete .. use lua instead
+
\let\handlecommalistsentence\firstofoneargument
\def\commalistsentenceone{and-1}
diff --git a/tex/context/base/enco-ini.mkiv b/tex/context/base/enco-ini.mkiv
index a5dc60f93..d225f07af 100644
--- a/tex/context/base/enco-ini.mkiv
+++ b/tex/context/base/enco-ini.mkiv
@@ -339,4 +339,42 @@
\unexpanded\def\textplus
{\char"002B } % plus
+%D Moved from core-mis:
+
+\unexpanded\def\celsius #1{#1\mathematics{^\circ}C}
+\unexpanded\def\inch {\mathematics{\prime\prime}} % was: \hbox{\rm\char125\relax}
+\unexpanded\def\fraction#1#2{\mathematics{#1\over#2}}
+
+\def\periodswidth {.5em}
+\def\periodsdefault{3} % was 5, but now it's like \unknown
+
+\unexpanded\def\periods
+ {\dosingleempty\doperiods}
+
+% \def\doperiods[#1]% todo: also n=,width= or maybe just #1,#2
+% {\dontleavehmode
+% \begingroup
+% \scratchdimen\periodswidth
+% \hbox to \iffirstargument#1\else\periodsdefault\fi \scratchdimen
+% {\leaders\hbox to \scratchdimen{\hss.\hss}\hss}%
+% \endgroup}
+%
+% better for export:
+
+\unexpanded\def\doperiods[#1]% todo: also n=,width= or maybe just #1,#2
+ {\dontleavehmode
+ \hbox\bgroup
+ \setbox\scratchbox\hbox to \periodswidth{\hss.\hss}%
+ \dorecurse{\iffirstargument#1\else\periodsdefault\fi}{\copy\scratchbox}%
+ \egroup}
+
+\unexpanded\def\unknown
+ {\periods\relax} % relax prevents lookahead for []
+
+% Example by Wolfgang Schuster on the context list:
+%
+% \unexpanded\def\fourdots{{\def\periodswidth{.3em}\periods[4]}}
+%
+% Hello\fourdots\ World\fourdots \par Hello\fourdots\ World.
+
\protect \endinput
diff --git a/tex/context/base/grph-inc.lua b/tex/context/base/grph-inc.lua
index bc5c4f12d..db94c62e4 100644
--- a/tex/context/base/grph-inc.lua
+++ b/tex/context/base/grph-inc.lua
@@ -8,6 +8,8 @@ if not modules then modules = { } end modules ['grph-inc'] = {
-- figures -> managers.figures
+-- todo: empty filename or only suffix always false (not found)
+
-- lowercase types
-- mps tex tmp svg
-- partly qualified
diff --git a/tex/context/base/grph-inc.mkiv b/tex/context/base/grph-inc.mkiv
index 58d1e2b62..633130ea9 100644
--- a/tex/context/base/grph-inc.mkiv
+++ b/tex/context/base/grph-inc.mkiv
@@ -290,6 +290,7 @@
height = "\@@efheight", % can be crap
} }%
\ctxlua{figures.identify()}%
+ % also mode: checkpresense only
\ifconditional\testexternalfigureonly
\ifcase\figurestatus \else
\ctxlua{figures.check()}%
@@ -325,7 +326,7 @@
\newsystemmode\v!figure
-\def\signalexternalfigure % global
+\def\signalexternalfigure % global (dup call to status)
{\ifcase\figurestatus
\global\resetsystemmode\v!figure % todo, also: \v!resource
\else
@@ -406,9 +407,21 @@
\let\getfiguredimensionsonly\getfiguredimensions
-\def\doiffigureelse#1%
+% \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 !
- \ifdim\figurewidth=\zeropoint % todo: \figurestatus
+ \ifcase\figurestatus
\expandafter\secondoftwoarguments
\else
\expandafter\firstoftwoarguments
diff --git a/tex/context/base/grph-trf.mkiv b/tex/context/base/grph-trf.mkiv
index b3392a9b7..a33e5606d 100644
--- a/tex/context/base/grph-trf.mkiv
+++ b/tex/context/base/grph-trf.mkiv
@@ -823,7 +823,7 @@
\settrue \c_grph_rotate_obey_depth
\grph_rotate_framed}
-\def\dorotatebox#1% {angle} \hbox/\vbox/\vtop % a fast low level one
+\unexpanded\def\dorotatebox#1% {angle} \hbox/\vbox/\vtop % a fast low level one
{\ifcase#1\relax
\expandafter\gobbleoneargument
\else
@@ -837,7 +837,9 @@
\dowithnextboxcs\grph_rotate_finish_box}
\def\grph_rotate_finish_box
- {\getvalue{\??rotatelocation\v!broad}%
+ {\setfalse\c_grph_rotate_not_fit % this is the same as broad but
+ \setfalse\c_grph_rotate_center % without the following grab as
+ \setfalse\c_grph_rotate_obey_depth % we call finish directly
\grph_rotate_finish_indeed
\egroup
\egroup}
diff --git a/tex/context/base/mult-aux.mkiv b/tex/context/base/mult-aux.mkiv
index e50a7470c..d9ac110c9 100644
--- a/tex/context/base/mult-aux.mkiv
+++ b/tex/context/base/mult-aux.mkiv
@@ -11,6 +11,9 @@
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.
+% todo: setupxxx and setupxxxs (so a plural for the root setup and
+% we can consider blocking the root)
+
%D A generalization of \MKIV-like inheritance. Just something to play
%D with (interface might change). The code here evolved in an email
%D exchange between me and Wolgang Schuster.
diff --git a/tex/context/base/mult-sys.mkiv b/tex/context/base/mult-sys.mkiv
index 816a32d4f..205e67009 100644
--- a/tex/context/base/mult-sys.mkiv
+++ b/tex/context/base/mult-sys.mkiv
@@ -439,9 +439,8 @@
\definesystemvariable {br} % sideBaR
\definesystemvariable {bx} % BackendExport
\definesystemvariable {cb} % CollectBox
-\definesystemvariable {ci} % CItaat
+% \definesystemvariable {ci} % CItaat
\definesystemvariable {cm} % CheMical
-\definesystemvariable {co} % COmbinaties
\definesystemvariable {cp} % CliP
\definesystemvariable {da} % DAte
\definesystemvariable {db} % Labels
@@ -478,7 +477,6 @@
\definesystemvariable {it} % stelInTerliniein
\definesystemvariable {iv} % stelInvulLijnenin
\definesystemvariable {ka} % KAntlijn
-\definesystemvariable {kk} % Kapitalen
\definesystemvariable {kl} % KoLommen
\definesystemvariable {km} % KenMerk
\definesystemvariable {kp} % KopPelteken
@@ -559,6 +557,7 @@
\definesystemvariable{cs} % CharacterSpacing
\definesystemvariable{ts} % TypeScript
+\definesystemvariable{kk} % Kapitalen
%D Next we define some language independant one letter
%D variables and keywords. We can actually make these
diff --git a/tex/context/base/pack-com.mkiv b/tex/context/base/pack-com.mkiv
new file mode 100644
index 000000000..be06b2e86
--- /dev/null
+++ b/tex/context/base/pack-com.mkiv
@@ -0,0 +1,350 @@
+%D \module
+%D [ file=pack-com, % used to be in core-mis,
+%D version=20120111,
+%D title=\CONTEXT\ Packing Macros,
+%D subtitle=Combinations,
+%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 Packaging Macros / Combinations}
+
+\unprotect
+
+%D We could of course map combinations onto one of the table
+%D mechanisms but as it has served us well for ages we keep
+%D this one. The code has been cleaned up a bit and mkiv'd.
+%D
+%D Okay ... I might luafy this one eventually.
+
+% \startcombination {alpha} {a} {beta} {b} \stopcombination
+% \startcombination[2*1] {alpha} {a} {beta} {b} \stopcombination
+% \startcombination[1*2] {alpha} {a} {beta} {b} \stopcombination
+% \startcombination[2] {alpha} {a} {beta} {b} \stopcombination
+
+% todo: \startcombination \startcomb \stopcomb ...
+
+\ifdefined\dotagcombination \else \let\dotagcombination\relax \fi
+
+\newsystemmode{combination}
+
+\appendtoks
+ \global\resetsystemmode{combination}%
+\to \everyinsidefloat
+
+\newcount\c_pack_combinations_x
+\newcount\c_pack_combinations_n
+\newcount\c_pack_combinations_max
+\newbox \b_pack_combinations_captions
+\newbox \b_pack_combinations_content
+\newbox \b_pack_combinations_caption
+\newbox \b_pack_combinations_temp % global
+
+\installcorenamespace{combination}
+
+\installcommandhandler \??combination {combination} \??combination
+
+\setupcombination
+ [\c!width=\v!fit,
+ \c!height=\v!fit,
+ \c!distance=\emwidth,
+ \c!location=\v!bottom, % can be something {top,left}
+ \c!before=\blank,
+ \c!inbetween={\blank[\v!medium]},
+ %\c!style=,
+ %\c!color=,
+ %\c!after=,
+ \c!align=\v!middle]
+
+\let\setupcombinations\setupcombination % for the moment (we might distinguish)
+
+\installcorenamespace{combinationlocation}
+
+\let\m_pack_combinations_rightfiller\hfil
+\let\m_pack_combinations_leftfiller \hfil
+\let\m_pack_combinations_valigner \firstofoneargument
+
+\setvalue{\??combinationlocation\v!left }{\let\m_pack_combinations_leftfiller\relax}
+\setvalue{\??combinationlocation\v!right }{\let\m_pack_combinations_rightfiller\relax}
+\setvalue{\??combinationlocation\v!top }{\let\m_pack_combinations_valigner\depthonlybox}
+\setvalue{\??combinationlocation\v!middle}{\let\m_pack_combinations_valigner\halfwaybox}
+
+\def\pack_combinations_location_step#1%
+ {\csname\??combinationlocation#1\endcsname}
+
+\unexpanded\def\startcombination
+ {\bgroup % so we can grab a group
+ \dodoubleempty\pack_combinations_start}
+
+% formally ok:
+%
+% \unexpanded\def\stopcombination
+% {\egroup
+% \egroup}
+%
+% more robust:
+%
+% \unexpanded\def\stopcombination
+% {{}{}{}{}{}{}{}{}% catches (at most 4) missing entries
+% \egroup
+% \egroup}
+%
+% even better:
+%
+% \unexpanded\def\stopcombination
+% {\bgroup
+% \scratchtoks{{}}%
+% \dorecurse\c_pack_combinations_n
+% {\scratchtoks\expandafter{\the\scratchtoks{}{}}}%
+% \expandafter\egroup\the\scratchtoks
+% \egroup
+% \dostoptagged
+% \egroup}
+%
+% faster
+
+\unexpanded\def\stopcombination
+ {\bgroup\normalexpanded{\egroup{}\ctxcommand{ntimes("{}{}",\number\c_pack_combinations_n)}}%
+ \dostoptagged
+ \egroup
+ \egroup}
+
+\def\pack_combinations_start[#1][#2]% needs a cleanup, also nx ny (pretty old, this one)
+ {\global\setsystemmode{combination}%
+ %
+% \doifnothing{#1}\firstargumentfalse % to be sure (when called in macros)
+% \doifnothing{#2}\secondargumentfalse % to be sure (when called in macros)
+% \ifsecondargument % todo: nx ny
+% \edef\currentcombination{#1}%
+% \edef\currentcombinationspec{#2*\plusone*}%
+% \else % better : \doifcombinationelse ... \??co#1\c!location
+% \doifinstringelse{*}{#1}
+% {\let\currentcombination\empty
+% \edef\currentcombinationspec{#1*\plusone*}}
+% {\doifnumberelse{#1}
+% {\let\currentcombination\empty
+% \edef\currentcombinationspec{#1*\plusone*}}
+% {\edef\currentcombination{#1}%
+% \edef\currentcombinationspec{\plustwo*\plusone*}}}%
+% \fi
+ %
+ % todo : move split to here
+ %
+ \edef\currentcombination{#1}%
+ \edef\currentcombinationspec{#2}%
+ \ifx\currentcombinationspec\empty
+ \doifinstringelse{*}\currentcombination
+ {\edef\currentcombinationspec{\currentcombination*\plusone*}%
+ \let\currentcombination\empty}
+ {\doifnumberelse\currentcombination
+ {\edef\currentcombinationspec{\currentcombination*\plusone*}%
+ \let\currentcombination\empty}
+ {\edef\currentcombinationspec{\plustwo*\plusone*}}}%
+ \else
+ \edef\currentcombinationspec{\currentcombinationspec*\plusone*}%
+ \fi
+ %
+ \forgetall
+ %
+ \edef\p_height {\combinationparameter\c!height}%
+ \edef\p_width {\combinationparameter\c!width}%
+ \edef\p_location{\combinationparameter\c!location}%
+ \edef\p_align {\combinationparameter\c!align}%
+ \edef\p_distance{\combinationparameter\c!distance}%
+ %
+ \let\m_pack_combinations_rightfiller\relax
+ \let\m_pack_combinations_leftfiller \relax
+ \let\m_pack_combinations_valigner \vbox
+ \processcommacommand[\p_location]\pack_combinations_location_step
+ %
+ \dostarttagged\t!combination\currentcombination
+ \vbox \ifx\p_height\v!fit\else to \p_height \fi \bgroup
+ \let\combination\empty % permits \combination{}{} handy for cld
+ \setuphorizontaldivision[\c!n=\v!fit,\c!distance=\p_distance]%
+ \normalexpanded{\pack_combinations_start_indeed[\currentcombinationspec]}}
+
+\unexpanded\def\pack_combinations_start_indeed[#1*#2*#3]%
+ {\global\c_pack_combinations_x#1\relax
+ \global\c_pack_combinations_n#2\relax
+ \dotagcombination
+ \global\setbox\b_pack_combinations_captions\emptybox
+ \global\c_pack_combinations_max\c_pack_combinations_x
+ \multiply\c_pack_combinations_n\c_pack_combinations_x
+ \tabskip\zeropoint
+ \halign \ifx\p_width\v!fit\else to \p_width \fi \bgroup
+ \aligntab
+ \m_pack_combinations_leftfiller
+ \alignmark\alignmark
+ \m_pack_combinations_rightfiller
+ \aligntab
+ \tabskip\zeropoint \!!plus 1fill
+ \alignmark\alignmark
+ \cr
+ \pack_combinations_pickup}
+
+\def\pack_combinations_pickup % we want to add struts but still ignore an empty box
+ {\dostarttagged\t!combinationpair\empty
+ \dostarttagged\t!combinationcontent\empty
+ \dowithnextboxcs\pack_combinations_pickup_content\hbox}
+
+\def\pack_combinations_pickup_content % we want to add struts but still ignore an empty box
+ {\dostoptagged
+ \setbox\b_pack_combinations_content\box\nextbox
+ \dostarttagged\t!combinationcaption\empty
+ \dowithnextboxcs\pack_combinations_pickup_caption\vtop\bgroup
+ \afterassignment\pack_combinations_caption_first
+ \let\nexttoken=}
+
+\def\pack_combinations_pickup_caption
+ {\dostoptagged
+ \dostoptagged
+ \setbox\b_pack_combinations_caption\box\nextbox
+ \pack_combinations_pickup_package_pair}
+
+\def\pack_combinations_caption_first
+ {\futurelet\nexttoken\pack_combinations_caption_second}
+
+\def\pack_combinations_caption_second
+ {\ifx\nexttoken\egroup
+ % the caption is empty
+ \else
+ \hsize\wd\b_pack_combinations_content
+ \ifx\p_align\empty\else\setupalign[\p_align]\fi
+ \usecombinationstyleandcolor\c!style\c!color
+ \bgroup
+ \aftergroup\endstrut
+ \aftergroup\egroup
+ \begstrut
+ \fi}
+
+\def\pack_combinations_pickup_package_pair % we need to store the caption row
+ {\vbox
+ {\forgetall
+ \m_pack_combinations_valigner{\copy\b_pack_combinations_content}%
+ % we need to save the caption for a next alignment line
+ \pack_combinations_save_caption}%
+ \ifnum\c_pack_combinations_n>\plusone
+ \global\advance\c_pack_combinations_n\minusone
+ \global\advance\c_pack_combinations_x\minusone
+ \ifcase\c_pack_combinations_x
+ \doubleexpandafter\pack_combinations_pickup_package_pair_a
+ \else
+ \doubleexpandafter\pack_combinations_pickup_package_pair_b
+ \fi
+ \else
+ \singleexpandafter\pack_combinations_pickup_package_pair_c
+ \fi}
+
+\def\pack_combinations_pickup_package_pair_a
+ {\cr
+ \pack_combinations_flush_captions
+ \noalign
+ {\forgetall
+ \global\setbox\b_pack_combinations_captions\emptybox
+ \nointerlineskip
+ \combinationparameter\c!after
+ \combinationparameter\c!before
+ \vss
+ \nointerlineskip}%
+ \global\c_pack_combinations_x\c_pack_combinations_max
+ \pack_combinations_pickup}
+
+\def\pack_combinations_pickup_package_pair_b
+ {\aligntab
+ \aligntab
+ \aligntab
+ \hskip\p_distance
+ \aligntab
+ \pack_combinations_pickup}
+
+\def\pack_combinations_pickup_package_pair_c
+ {\cr
+ \pack_combinations_flush_captions
+ \egroup}
+
+\def\pack_combinations_save_caption
+ {\global\setbox\b_pack_combinations_captions\hbox
+ {\hbox{\box\b_pack_combinations_caption}%
+ \unhbox\b_pack_combinations_captions}}
+
+\def\pack_combinations_flush_captions
+ {\noalign
+ {\ifdim\ht\b_pack_combinations_captions>\zeropoint
+ \nointerlineskip % indeed
+ \combinationparameter\c!inbetween
+ \global\c_pack_combinations_x\c_pack_combinations_max
+ \globallet\pack_combinations_flush_captions_indeed\pack_combinations_flush_captions_yes
+ \else
+ \global\setbox\b_pack_combinations_captions\emptybox
+ \globallet\pack_combinations_flush_captions_indeed\pack_combinations_flush_captions_nop
+ \fi}%
+ \pack_combinations_flush_captions_indeed
+ \crcr}
+
+\def\pack_combinations_flush_captions_yes
+ {\global\setbox\b_pack_combinations_captions\hbox
+ {\unhbox\b_pack_combinations_captions
+ \global\setbox\b_pack_combinations_temp\lastbox}%
+ \box\b_pack_combinations_temp
+ \global\advance\c_pack_combinations_x\minusone\relax
+ \ifnum\c_pack_combinations_x>\zerocount
+ \expandafter\pack_combinations_flush_captions_yes_followup
+ \else
+ \global\setbox\b_pack_combinations_captions\emptybox
+ \fi}
+
+\let\pack_combinations_flush_captions_nop\donothing
+
+\def\pack_combinations_flush_captions_yes_followup
+ {\aligntab
+ \aligntab
+ \aligntab
+ \aligntab
+ \pack_combinations_flush_captions_indeed}
+
+%D \macros
+%D {startfloatcombination}
+%D
+%D \setupexternalfigures[directory={../sample}]
+%D \startbuffer
+%D \placefigure
+%D [left,none]
+%D {}
+%D {\startfloatcombination[2*2]
+%D \placefigure{alpha}{\externalfigure[cow.pdf][width=1cm]}
+%D \placefigure{beta} {\externalfigure[cow.pdf][width=2cm]}
+%D \placefigure{gamma}{\externalfigure[cow.pdf][width=3cm]}
+%D \placefigure{delta}{\externalfigure[cow.pdf][width=4cm]}
+%D \stopfloatcombination}
+%D
+%D \input tufte
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+
+\unexpanded\def\startfloatcombination
+ {\dodoubleempty\pack_combinations_start_float}
+
+\let\stopfloatcombination\relax
+
+\def\pack_combinations_start_float[#1][#2]%
+ {\vbox\bgroup
+ %\insidecolumnstrue % trick, forces no centering, todo: proper switch/feature
+ \postcenterfloatmethod\zerocount
+ \forcelocalfloats
+ \unexpanded\def\stopfloatcombination{\pack_combinations_stop_float{#1}}}
+
+\def\pack_combinations_stop_float#1%
+ {\scratchtoks\emptytoks
+ \dorecurse\noflocalfloats
+ {\appendetoks{\noexpand\getlocalfloat{\recurselevel}}{}\to\scratchtoks}% brrr
+ \expanded{\startcombination[#1]\the\scratchtoks}\stopcombination
+ \resetlocalfloats
+ \egroup}
+
+
+\protect \endinput
diff --git a/tex/context/base/page-lay.mkiv b/tex/context/base/page-lay.mkiv
index 525017954..d00de2c31 100644
--- a/tex/context/base/page-lay.mkiv
+++ b/tex/context/base/page-lay.mkiv
@@ -814,20 +814,24 @@
\newconditional\c_page_layouts_location_is_set
-\def\page_layouts_location_reset
+\def\page_layouts_location_reset % we start in the left top and mirror right pages
{\setfalse\c_page_layouts_location_is_set
\let\v_page_target_left_fill \relax
- \let\v_page_target_right_fill \relax
+ \let\v_page_target_right_fill \hss % ? \relax
\let\v_page_target_top_fill \relax
- \let\v_page_target_bottom_fill\relax}
+ \let\v_page_target_bottom_fill\vss} % \relax}
\setvalue{\??layoutlocation\v!right }{\settrue\c_page_layouts_location_is_set
- \let\v_page_target_left_fill \hss}
+ \let\v_page_target_left_fill \hss
+ \let\v_page_target_right_fill \relax}
\setvalue{\??layoutlocation\v!left }{\settrue\c_page_layouts_location_is_set
+ \let\v_page_target_left_fill \relax
\let\v_page_target_right_fill \hss}
\setvalue{\??layoutlocation\v!bottom }{\settrue\c_page_layouts_location_is_set
- \let\v_page_target_top_fill \vss}
+ \let\v_page_target_top_fill \vss
+ \let\v_page_target_bottom_fill\relax}
\setvalue{\??layoutlocation\v!top }{\settrue\c_page_layouts_location_is_set
+ \let\v_page_target_top_fill \relax
\let\v_page_target_bottom_fill\vss}
\setvalue{\??layoutlocation\v!middle }{\settrue\c_page_layouts_location_is_set
\let\v_page_target_left_fill \hss
diff --git a/tex/context/base/spac-ali.mkiv b/tex/context/base/spac-ali.mkiv
index 01bd565c0..6cc04b203 100644
--- a/tex/context/base/spac-ali.mkiv
+++ b/tex/context/base/spac-ali.mkiv
@@ -236,6 +236,10 @@
\newconditional\raggedonelinerstate % public
\fi
+% \appendtoks
+% \setfalse\raggedonelinerstate
+% \to \everyforgetall
+
\newconstant\raggedstatus % public
\newconstant\c_spac_align_state_horizontal
@@ -262,6 +266,7 @@
\spaceskip \zeropoint
\xspaceskip \zeropoint
\parfillskip\s_zero_plus_one_fil % new
+ \setfalse\raggedonelinerstate % now here
\let\updateraggedskips\relax} % no need for adaption
\unexpanded\def\spac_align_set_horizontal_left
diff --git a/tex/context/base/status-files.pdf b/tex/context/base/status-files.pdf
index cf02f71fc..e8412cf30 100644
--- a/tex/context/base/status-files.pdf
+++ b/tex/context/base/status-files.pdf
Binary files differ
diff --git a/tex/context/base/status-lua.pdf b/tex/context/base/status-lua.pdf
index da0b60f3f..af0fbaf85 100644
--- a/tex/context/base/status-lua.pdf
+++ b/tex/context/base/status-lua.pdf
Binary files differ
diff --git a/tex/context/base/status-mkiv.lua b/tex/context/base/status-mkiv.lua
index 8968cd993..320bcd414 100644
--- a/tex/context/base/status-mkiv.lua
+++ b/tex/context/base/status-mkiv.lua
@@ -783,12 +783,12 @@ return {
{
filename = "typo-pag",
marktype = "mkiv",
- status = "unknown",
+ status = "okay",
},
{
filename = "typo-mar",
marktype = "mkiv",
- status = "unknown",
+ status = "okay",
},
{
filename = "buff-ini",
@@ -1031,22 +1031,22 @@ return {
{
filename = "typo-brk",
marktype = "mkiv",
- status = "unknown",
+ status = "okay",
},
{
filename = "typo-cap",
marktype = "mkiv",
- status = "unknown",
+ status = "okay",
},
{
filename = "typo-dig",
marktype = "mkiv",
- status = "unknown",
+ status = "okay",
},
{
filename = "typo-rep",
marktype = "mkiv",
- status = "unknown",
+ status = "okay",
},
{
filename = "typo-txt",
@@ -1057,7 +1057,8 @@ return {
{
filename = "typo-par",
marktype = "mkiv",
- status = "unknown",
+ status = "okay",
+ comment = "might get extended",
},
{
filename = "type-ini",
@@ -1267,6 +1268,16 @@ return {
status = "unknown",
},
{
+ filename = "pack-com",
+ marktype = "mkiv",
+ status = "okay",
+ },
+ {
+ filename = "typo-del",
+ marktype = "mkiv",
+ status = "unknown",
+ },
+ {
filename = "grph-trf",
marktype = "mkiv",
status = "okay",
diff --git a/tex/context/base/supp-box.mkiv b/tex/context/base/supp-box.mkiv
index 0c78994ea..5981b97f0 100644
--- a/tex/context/base/supp-box.mkiv
+++ b/tex/context/base/supp-box.mkiv
@@ -2454,6 +2454,15 @@
\lower.5\ht\nextbox\box\nextbox
\egroup}
+\unexpanded\def\depthonlybox
+ {\vtop\bgroup
+ \dowithnextboxcs\syst_boxes_depthonlybox_finish\vbox}
+
+\def\syst_boxes_depthonlybox_finish
+ {\hsize\wd\nextbox
+ \kern\zeropoint\box\nextbox
+ \egroup}
+
%D New:
\def\setdimentoatleast#1#2{\ifdim#1>\zeropoint\else#1=#2\fi}
diff --git a/tex/context/base/syst-lua.lua b/tex/context/base/syst-lua.lua
index 000b16963..e5c6c8242 100644
--- a/tex/context/base/syst-lua.lua
+++ b/tex/context/base/syst-lua.lua
@@ -6,10 +6,12 @@ if not modules then modules = { } end modules ['syst-lua'] = {
license = "see context related readme files"
}
-local format, find, match = string.format, string.find, string.match
+local format, find, match, rep = string.format, string.find, string.match, string.rep
local tonumber = tonumber
local S, lpegmatch, lpegtsplitat = lpeg.S, lpeg.match, lpeg.tsplitat
+local context = context
+
commands = commands or { }
function commands.writestatus(...) logs.status(...) end -- overloaded later
@@ -95,3 +97,7 @@ function commands.firstinlist(str)
local first = match(str,"^([^,]+),")
context(first or str)
end
+
+function commands.ntimes(str,n)
+ context(rep(str,n or 1))
+end
diff --git a/tex/context/base/typo-brk.lua b/tex/context/base/typo-brk.lua
index fe0258bcc..14f0b8b47 100644
--- a/tex/context/base/typo-brk.lua
+++ b/tex/context/base/typo-brk.lua
@@ -32,10 +32,13 @@ local remove_node = nodes.remove -- ! nodes
local link_nodes = nodes.link
local texattribute = tex.attribute
+local unsetvalue = attributes.unsetvalue
local nodepool = nodes.pool
local tasks = nodes.tasks
+local v_reset = interfaces.variables.reset
+
local new_penalty = nodepool.penalty
local new_glue = nodepool.glue
local new_disc = nodepool.disc
@@ -54,7 +57,7 @@ typesetters.breakpoints = typesetters.breakpoints or {}
local breakpoints = typesetters.breakpoints
breakpoints.mapping = breakpoints.mapping or { }
-local mapping = breakpoints.mapping
+breakpoints.numbers = breakpoints.numbers or { }
breakpoints.methods = breakpoints.methods or { }
local methods = breakpoints.methods
@@ -64,27 +67,12 @@ breakpoints.attribute = a_breakpoints
storage.register("typesetters/breakpoints/mapping", breakpoints.mapping, "typesetters.breakpoints.mapping")
-function breakpoints.setreplacement(id,char,language,settings)
- char = utfbyte(char)
- local map = mapping[id]
- if not map then
- map = { }
- mapping[id] = map
- end
- local cmap = map[char]
- if not cmap then
- cmap = { }
- map[char] = cmap
- end
- local left, right, middle = settings.left, settings.right, settings.middle
- cmap[language or ""] = {
- type = tonumber(settings.type) or 1,
- nleft = tonumber(settings.nleft) or 1,
- nright = tonumber(settings.nright) or 1,
- left = left ~= "" and left or nil,
- right = right ~= "" and right or nil,
- middle = middle ~= "" and middle or nil,
- } -- was { type or 1, before or 1, after or 1 }
+local mapping = breakpoints.mapping
+local numbers = breakpoints.mapping
+
+for i=1,#mapping do
+ local m = mapping[i]
+ numbers[m.name] = m
end
local function insert_break(head,start,before,after)
@@ -167,12 +155,13 @@ local function process(namespace,attribute,head)
while start do
local id = start.id
if id == glyph_code then
- local attr = has_attribute(start,attribute)
+ local attr = has_attribute(start,a_breakpoints)
if attr and attr > 0 then
- unset_attribute(start,attribute) -- maybe test for subtype > 256 (faster)
+ unset_attribute(start,a_breakpoints) -- maybe test for subtype > 256 (faster)
-- look ahead and back n chars
- local map = mapping[attr]
- if map then
+ local data = mapping[attr]
+ if data then
+ local map = data.characters
local cmap = map[start.char]
if cmap then
local lang = start.lang
@@ -230,15 +219,64 @@ local function process(namespace,attribute,head)
return head, done
end
-function breakpoints.set(n)
- if trace_breakpoints then
- report_breakpoints("enabling breakpoints handler")
+local enabled = false
+
+function breakpoints.define(name)
+ local data = numbers[name]
+ if data then
+ -- error
+ else
+ local number = #mapping + 1
+ local data = {
+ name = name,
+ number = number,
+ characters = { },
+ }
+ mapping[number] = data
+ numbers[name] = data
+ end
+end
+
+function breakpoints.setreplacement(name,char,language,settings)
+ char = utfbyte(char)
+ local data = numbers[name]
+ if data then
+ local characters = data.characters
+ local cmap = characters[char]
+ if not cmap then
+ cmap = { }
+ characters[char] = cmap
+ end
+ local left, right, middle = settings.left, settings.right, settings.middle
+ cmap[language or ""] = {
+ type = tonumber(settings.type) or 1,
+ nleft = tonumber(settings.nleft) or 1,
+ nright = tonumber(settings.nright) or 1,
+ left = left ~= "" and left or nil,
+ right = right ~= "" and right or nil,
+ middle = middle ~= "" and middle or nil,
+ } -- was { type or 1, before or 1, after or 1 }
end
- tasks.enableaction("processors","typesetters.breakpoints.handler")
- function breakpoints.set(n)
- texattribute[a_breakpoints] = n
+end
+
+function breakpoints.set(n)
+ if n == v_reset then
+ n = unsetvalue
+ else
+ n = mapping[n]
+ if not n then
+ n = unsetvalue
+ else
+ if not enabled then
+ if trace_breakpoints then
+ report_breakpoints("enabling breakpoints handler")
+ end
+ tasks.enableaction("processors","typesetters.breakpoints.handler")
+ end
+ n = n.number
+ end
end
- breakpoints.set(n)
+ texattribute[a_breakpoints] = n
end
breakpoints.handler = nodes.installattributehandler {
@@ -247,6 +285,12 @@ breakpoints.handler = nodes.installattributehandler {
processor = process,
}
-function breakpoints.enable()
- tasks.enableaction("processors","typesetters.breakpoints.handler")
-end
+-- function breakpoints.enable()
+-- tasks.enableaction("processors","typesetters.breakpoints.handler")
+-- end
+
+-- interface
+
+commands.definebreakpoints = breakpoints.define
+commands.definebreakpoint = breakpoints.setreplacement
+commands.setbreakpoints = breakpoints.set
diff --git a/tex/context/base/typo-brk.mkiv b/tex/context/base/typo-brk.mkiv
index cd2db6212..23253240c 100644
--- a/tex/context/base/typo-brk.mkiv
+++ b/tex/context/base/typo-brk.mkiv
@@ -15,73 +15,65 @@
\unprotect
+% hm, we cannot prebuild lists, font dependent
+%
+% -- type nleft nright language left right middle
+%
+% -- we might eventually stick to only method 5
+
\registerctxluafile{typo-brk}{1.001}
\definesystemattribute[breakpoint][public]
-% compound stuff (under construction)
-
-\newbox\breakpointbox
-
\exhyphenchar\minusone % we use a different order then base tex, so we really need this
-\newcount \maxbreakpointsid
-
\unexpanded\def\definebreakpoints
- {\dosingleargument\dodefinebreakpoints}
-
-\def\dodefinebreakpoints[#1]%
- {\ifcsname\??bp:#1\endcsname \else
- \global\advance\maxbreakpointsid\plusone
- \setxvalue{\??bp:#1}{\number\maxbreakpointsid}%
- \fi}
-
-\def\installbreakpoint
- {\dotripleempty\doinstallbreakpoint}
-
-% hm, we cannot prebuild lists, font dependent
-%
-% -- type nleft nright language left right middle
-%
-% -- we might eventually stick to only method 5
-
-\def\doinstallbreakpoint[#1][#2][#3]%
- {\ifcsname\??bp:#1\endcsname
- \begingroup
- \getparameters[\??bp][\c!type=1,\c!nleft=3,\c!nright=3,\s!language=,\c!left=,\c!right=,\c!middle=,#3]%
- \ctxlua{typesetters.breakpoints.setreplacement(\csname\??bp:#1\endcsname, "#2", "\reallanguagetag\@@bplanguage", {
- type = \@@bptype,
- nleft = "\@@bpnleft",
- nright = "\@@bpnright",
- right = "\@@bpright",
- left = "\@@bpleft",
- middle = "\@@bpmiddle"
- } )}% todo: table
- \endgroup
- \fi}
+ {\dosingleargument\typo_breakpoints_define}
+
+\def\typo_breakpoints_define[#1]%
+ {\ctxcommand{definebreakpoints("#1")}}
+
+\def\definebreakpoint
+ {\dotripleempty\typo_breakpoints_define_character}
+
+\def\typo_breakpoints_define_character[#1][#2][#3]% name char settings
+ {\begingroup
+ \getparameters[\??bp][\c!type=1,\c!nleft=3,\c!nright=3,\s!language=,\c!left=,\c!right=,\c!middle=,#3]%
+ \ctxcommand{definebreakpoint("#1", "#2", "\reallanguagetag\@@bplanguage", {
+ type = \@@bptype,
+ nleft = "\@@bpnleft",
+ nright = "\@@bpnright",
+ right = "\@@bpright",
+ left = "\@@bpleft",
+ middle = "\@@bpmiddle"
+ } )}%
+ \endgroup}
\unexpanded\def\setbreakpoints[#1]%
- {\ctxlua{typesetters.breakpoints.set(\number\csname\??bp:#1\endcsname)}}
+ {\ctxcommand{setbreakpoints("#1")}}
-\letvalue{\??bp:\s!reset}\attributeunsetvalue
+\unexpanded\def\resetbreakpoints
+ {\attribute\breakpointattribute\attributeunsetvalue}
\definebreakpoints[compound]
-\installbreakpoint [compound] [+] [\c!nleft=3,\c!nright=3,\c!type=1] % middle=+,left=,right=
-\installbreakpoint [compound] [-] [\c!nleft=3,\c!nright=3,\c!type=1] % middle=+,left=,right=
-\installbreakpoint [compound] [/] [\c!nleft=3,\c!nright=3,\c!type=1] % middle=+,left=,right=
-\installbreakpoint [compound] [(] [\c!nleft=3,\c!nright=3,\c!type=2] % type=5,middle=(,left=(-,right=
-\installbreakpoint [compound] [)] [\c!nleft=3,\c!nright=3,\c!type=3] % type=5,middle=),left=,right=-)
+\definebreakpoint [compound] [+] [\c!nleft=3,\c!nright=3,\c!type=1] % middle=+,left=,right=
+\definebreakpoint [compound] [-] [\c!nleft=3,\c!nright=3,\c!type=1] % middle=+,left=,right=
+\definebreakpoint [compound] [/] [\c!nleft=3,\c!nright=3,\c!type=1] % middle=+,left=,right=
+\definebreakpoint [compound] [(] [\c!nleft=3,\c!nright=3,\c!type=2] % type=5,middle=(,left=(-,right=
+\definebreakpoint [compound] [)] [\c!nleft=3,\c!nright=3,\c!type=3] % type=5,middle=),left=,right=-)
+
+\let\installbreakpoint\definebreakpoint % for a while
% \start \hsize 1.5cm \setbreakpoints[compound]
-% \installbreakpoint [compound] [-] [nleft=3,nright=3,type=5,left=,right={-},middle={-}]
-% \installbreakpoint [compound] [(] [nleft=3,nright=3,type=5,left=,right={(-},middle={(}]
-% \installbreakpoint [compound] [)] [nleft=3,nright=3,type=5,left={-)},right=,middle={)}]
+% \definebreakpoint [compound] [-] [nleft=3,nright=3,type=5,left=,right={-},middle={-}]
+% \definebreakpoint [compound] [(] [nleft=3,nright=3,type=5,left=,right={(-},middle={(}]
+% \definebreakpoint [compound] [)] [nleft=3,nright=3,type=5,left={-)},right=,middle={)}]
% composed-word\par composed(word)\par
% \stop
% \mainlanguage[czech]
-% \installbreakpoint [compound] [\number`-] [language=cs,nleft=3,nright=3,type=4]
+% \definebreakpoint [compound] [\number`-] [language=cs,nleft=3,nright=3,type=4]
% \setbreakpoints[compound]
% \start \hsize 1mm test-test \par \stop
diff --git a/tex/context/base/typo-cap.lua b/tex/context/base/typo-cap.lua
index 2e20a95e7..3d70ffbfd 100644
--- a/tex/context/base/typo-cap.lua
+++ b/tex/context/base/typo-cap.lua
@@ -4,7 +4,7 @@ if not modules then modules = { } end modules ['typo-cap'] = {
author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
copyright = "PRAGMA ADE / ConTeXt Development Team",
license = "see context related readme files"
-}
+ }
local next, type = next, type
local format, insert = string.format, table.insert
@@ -23,6 +23,7 @@ local traverse_id = node.traverse_id
local copy_node = node.copy
local texattribute = tex.attribute
+local unsetvalue = attributes.unsetvalue
local nodecodes = nodes.nodecodes
local skipcodes = nodes.skipcodes
@@ -40,6 +41,8 @@ local fonthashes = fonts.hashes
local fontdata = fonthashes.identifiers
local fontchar = fonthashes.characters
+local v_reset = interfaces.variables.reset
+
local chardata = characters.data
typesetters = typesetters or { }
@@ -257,19 +260,29 @@ end
local m, enabled = 0, false -- a trick to make neighbouring ranges work
function cases.set(n)
- if not enabled then
- tasks.enableaction("processors","typesetters.cases.handler")
- if trace_casing then
- report_casing("enabling case handler")
- end
- enabled = true
- end
- if m == 100 then
- m = 1
+ if n == v_reset then
+ n = unsetvalue
else
- m = m + 1
+ n = tonumber(n)
+ if n then
+ if not enabled then
+ tasks.enableaction("processors","typesetters.cases.handler")
+ if trace_casing then
+ report_casing("enabling case handler")
+ end
+ enabled = true
+ end
+ if m == 100 then
+ m = 1
+ else
+ m = m + 1
+ end
+ n = m * 100 + n
+ else
+ n = unsetvalue
+ end
end
- texattribute[a_cases] = m * 100 + n
+ texattribute[a_cases] = n
end
cases.handler = nodes.installattributehandler {
@@ -277,3 +290,7 @@ cases.handler = nodes.installattributehandler {
namespace = cases,
processor = process,
}
+
+-- interface
+
+commands.setcharactercasing = cases.set
diff --git a/tex/context/base/typo-cap.mkiv b/tex/context/base/typo-cap.mkiv
index 2ed50ce20..713beaa31 100644
--- a/tex/context/base/typo-cap.mkiv
+++ b/tex/context/base/typo-cap.mkiv
@@ -49,22 +49,22 @@
% test \word{test TEST \TeX} test
% test \Word{test TEST \TeX} test
-\unexpanded\def\setcharactercasing[#1]%
- {\ctxlua{typesetters.cases.set(\number#1)}}
+\unexpanded\def\setcharactercasing[#1]% mayb eat some point we will introduce names alongside numbers
+ {\ctxcommand{setcharactercasing("#1")}}
% todo: names casings
-\unexpanded\def\WORD {\groupedcommand{\setcharactercasing[\plusone ]}{}}
-\unexpanded\def\word {\groupedcommand{\setcharactercasing[\plustwo ]}{}}
-\unexpanded\def\Word {\groupedcommand{\setcharactercasing[\plusthree]}{}}
-\unexpanded\def\Words{\groupedcommand{\setcharactercasing[\plusfour ]}{}}
+\unexpanded\def\WORD {\groupedcommand{\setcharactercasing[1]}{}}
+\unexpanded\def\word {\groupedcommand{\setcharactercasing[2]}{}}
+\unexpanded\def\Word {\groupedcommand{\setcharactercasing[3]}{}}
+\unexpanded\def\Words{\groupedcommand{\setcharactercasing[4]}{}}
-% this will become:
+% This might become:
%
-% \unexpanded\def\WORD {\bgroup\def\g_word{\setcharactercasing[\plusone ]}\afterassignment\g_word\let\nexttoken}
-% \unexpanded\def\word {\bgroup\def\g_word{\setcharactercasing[\plustwo ]}\afterassignment\g_word\let\nexttoken}
-% \unexpanded\def\Word {\bgroup\def\g_word{\setcharactercasing[\plusthree]}\afterassignment\g_word\let\nexttoken}
-% \unexpanded\def\Words{\bgroup\def\g_word{\setcharactercasing[\plusfour ]}\afterassignment\g_word\let\nexttoken}
+% \unexpanded\def\WORD {\bgroup\def\g_word{\setcharactercasing[1]}\afterassignment\g_word\let\nexttoken}
+% \unexpanded\def\word {\bgroup\def\g_word{\setcharactercasing[2]}\afterassignment\g_word\let\nexttoken}
+% \unexpanded\def\Word {\bgroup\def\g_word{\setcharactercasing[3]}\afterassignment\g_word\let\nexttoken}
+% \unexpanded\def\Words{\bgroup\def\g_word{\setcharactercasing[4]}\afterassignment\g_word\let\nexttoken}
%
% so no longer {\Word test} and { } mandate (also later \groupedcommands will go)
@@ -127,33 +127,33 @@
\let\disablepseudocaps\relax % maybe used elsewhere
-\newconditional\pseudocapsenabled
+\newconditional\c_typo_capitals_pseudo
-\def\usepseudocaps{\settrue \pseudocapsenabled}
-\def\userealcaps {\setfalse\pseudocapsenabled}
+\unexpanded\def\usepseudocaps{\settrue \c_typo_capitals_pseudo}
+\unexpanded\def\userealcaps {\setfalse\c_typo_capitals_pseudo}
\usepseudocaps
% we use char0 as placeholder for the larger font
-\unexpanded\def\pseudosmallcapped{\groupedcommand{\setcharactercasing[\plusone ]\signalcharacter\tx}{}} % all upper
-\unexpanded\def\pseudoSmallcapped{\groupedcommand{\setcharactercasing[\plusfive]\signalcharacter\tx}{}} % one upper + font
-\unexpanded\def\pseudoSmallCapped{\groupedcommand{\setcharactercasing[\plussix ]\signalcharacter\tx}{}} % some upper + font
+\unexpanded\def\pseudosmallcapped{\groupedcommand{\setcharactercasing[1]\signalcharacter\tx}{}} % all upper
+\unexpanded\def\pseudoSmallcapped{\groupedcommand{\setcharactercasing[5]\signalcharacter\tx}{}} % one upper + font
+\unexpanded\def\pseudoSmallCapped{\groupedcommand{\setcharactercasing[6]\signalcharacter\tx}{}} % some upper + font
-\unexpanded\def\realsmallcapped {\groupedcommand{\sc\setcharactercasing[\plusone ]}{}} % all lower
-\unexpanded\def\realSmallcapped {\groupedcommand{\sc\setcharactercasing[\plusthree]}{}} % one upper + font
-\unexpanded\def\realSmallCapped {\groupedcommand{\sc\setcharactercasing[\plusfour ]}{}} % some upper
+\unexpanded\def\realsmallcapped {\groupedcommand{\sc\setcharactercasing[1]}{}} % all lower
+\unexpanded\def\realSmallcapped {\groupedcommand{\sc\setcharactercasing[3]}{}} % one upper + font
+\unexpanded\def\realSmallCapped {\groupedcommand{\sc\setcharactercasing[4]}{}} % some upper
-\unexpanded\def\dohandlesmallcaps
- {\ifconditional\pseudocapsenabled
+\unexpanded\def\typo_capitals_smallcaps
+ {\ifconditional\c_typo_capitals_pseudo
\expandafter\firstoftwoarguments
\else
\expandafter\secondoftwoarguments
\fi}
-\unexpanded\def\smallcapped{\dohandlesmallcaps\pseudosmallcapped\realsmallcapped}
-\unexpanded\def\Smallcapped{\dohandlesmallcaps\pseudoSmallcapped\realSmallcapped}
-\unexpanded\def\SmallCapped{\dohandlesmallcaps\pseudoSmallCapped\realSmallCapped}
+\unexpanded\def\smallcapped{\typo_capitals_smallcaps\pseudosmallcapped\realsmallcapped}
+\unexpanded\def\Smallcapped{\typo_capitals_smallcaps\pseudoSmallcapped\realSmallcapped}
+\unexpanded\def\SmallCapped{\typo_capitals_smallcaps\pseudoSmallCapped\realSmallCapped}
\unexpanded\def\autocap{\ifmmode\expandafter\normalcap\else\expandafter\smallcapped\fi}
@@ -171,7 +171,7 @@
%D As suggested by WS:
-\unexpanded\def\notsmallcapped{\groupedcommand{\setcharactercasing[\plustwo]\signalcharacter}{}}
+\unexpanded\def\notsmallcapped{\groupedcommand{\setcharactercasing[2]\signalcharacter}{}}
%D \macros
%D {setupcapitals}
@@ -183,16 +183,18 @@
\let\normalsmallcapped\smallcapped
+\definesystemvariable{kk}
+
\unexpanded\def\setupcapitals
- {\dosingleempty\dosetupcapitals}
+ {\dosingleempty\typo_capitals_setup}
-\def\dosetupcapitals[#1]% todo: don't use grouping just a switch
+\def\typo_capitals_setup[#1]% todo: don't use grouping just a switch
{\getparameters[\??kk][#1]%
\doifelse\@@kktitle\v!yes
- {\definealternativestyle[\v!capital][\normalsmallcapped][\normalsmallcapped]%
- \definealternativestyle[\v!smallcaps][\sc][\sc]}
- {\definealternativestyle[\v!capital][\normalsmallcapped][\normalWORD]%
- \definealternativestyle[\v!smallcaps][\sc][\normalWORD]}%
+ {\definealternativestyle[\v!capital ][\normalsmallcapped][\normalsmallcapped]%
+ \definealternativestyle[\v!smallcaps][\sc ][\sc ]}
+ {\definealternativestyle[\v!capital ][\normalsmallcapped][\normalWORD ]%
+ \definealternativestyle[\v!smallcaps][\sc ][\normalWORD ]}%
\doifelse\@@kksc\v!yes\userealcaps\usepseudocaps}
\let\uppercased\normalWORD
@@ -200,7 +202,7 @@
\setupcapitals
[\c!title=\v!yes,
- sc=\v!no] % no \c!sc any longer
+ \s!sc=\v!no] % no \c!sc any longer
% \definestartstop is not yet in available at core-spa time
%
@@ -208,7 +210,7 @@
%
% \definestartstop[randomized][\c!before=\dosetattribute{case}{8},\c!after=]
-\def\randomizetext{\groupedcommand{\attribute\caseattribute\pluseight}{}}
+\unexpanded\def\randomizetext{\groupedcommand{\attribute\caseattribute\pluseight}{}}
\definestartstop[randomized][\c!before=\dosetattribute{case}{8},\c!after=]
diff --git a/tex/context/base/typo-del.mkiv b/tex/context/base/typo-del.mkiv
new file mode 100644
index 000000000..b2213db65
--- /dev/null
+++ b/tex/context/base/typo-del.mkiv
@@ -0,0 +1,607 @@
+%D \module
+%D [ file=typo-del, % moved from core-mis,
+%D version=20110112,
+%D title=\CONTEXT\ Typesetting Macros,
+%D subtitle=Delimited Content,
+%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 Typesetting Macros / Delimited Content}
+
+\unprotect
+
+% THIS IS OBSOLETE:
+
+\unexpanded\def\setuphyphenmark
+ {\dodoubleargument\getparameters[\??kp]}
+
+\unexpanded\def\setuphyphenmark[#1]% sign=normal|wide
+ {\dodoubleargument\getparameters[\??kp][#1]%
+ \doifelse\@@kpsign {\v!normal}% was inset?
+ {\let\textmodehyphen\normalhyphen \let\textmodehyphendiscretionary\normalhyphendiscretionary}
+ {\let\textmodehyphen\composedhyphen\let\textmodehyphendiscretionary\composedhyphendiscretionary}}
+
+\setuphyphenmark[\c!sign=\v!wide]
+
+\definesymbol[\c!lefthyphen] [\languageparameter\c!lefthyphen]
+\definesymbol[\c!righthyphen] [\languageparameter\c!righthyphen]
+\definesymbol[\c!hyphen] [\languageparameter\c!hyphen]
+
+\def\normalhyphen
+ {\hbox{\directsymbol\empty\c!hyphen}}
+
+\def\composedhyphen
+ {\hbox{\directsymbol\empty\c!compoundhyphen}}
+
+\def\normalhyphendiscretionary
+ {\discretionary
+ {\hbox{\directsymbol\empty\c!righthyphen}}
+ {\hbox{\directsymbol\empty\c!lefthyphen}}
+ {\hbox{\directsymbol\empty\c!hyphen}}}
+
+\def\composedhyphendiscretionary
+ {\discretionary
+ {\hbox{\directsymbol\empty\c!rightcompoundhyphen}}
+ {\hbox{\directsymbol\empty\c!leftcompoundhyphen}}
+ {\hbox{\directsymbol\empty\c!compoundhyphen}}}
+
+\let\textmodehyphen \composedhyphen
+\let\textmodehyphendiscretionary\composedhyphendiscretionary
+
+\definesymbol[\c!leftcompoundhyphen] [\languageparameter\c!leftcompoundhyphen]
+\definesymbol[\c!rightcompoundhyphen] [\languageparameter\c!rightcompoundhyphen]
+\definesymbol[\c!compoundhyphen] [\languageparameter\c!compoundhyphen]
+
+% TILL HERE
+
+\setnewconstant\boundarycharactermode\plusone
+
+\unexpanded\def\midboundarycharacter#1#2%
+ {\ifcase\boundarycharactermode
+ \or
+ %\nobreak
+ \hskip\hspaceamount\currentlanguage{#2}%
+ \languageparameter#1%
+ %\nobreak
+ \hskip\hspaceamount\currentlanguage{#2}%
+ \or
+ \languageparameter#1%
+ \fi
+ \boundarycharactermode\plusone}
+
+\unexpanded\def\leftboundarycharacter#1#2%
+ {\ifcase\boundarycharactermode
+ \or
+ \languageparameter#1%
+ \nobreak
+ \hskip\hspaceamount\currentlanguage{#2}%
+ \or
+ \languageparameter#1%
+ \fi
+ \boundarycharactermode\plusone}
+
+\unexpanded\def\rightboundarycharacter#1#2%
+ {\ifcase\boundarycharactermode
+ \or
+ \prewordbreak %\nobreak
+ \hskip\hspaceamount\currentlanguage{#2}%
+ \languageparameter#1%
+ \or
+ \languageparameter#1%
+ \fi
+ \boundarycharactermode\plusone}
+
+\definehspace [sentence] [\zeropoint]
+\definehspace [intersentence] [.250\emwidth]
+
+\definesymbol
+ [\c!midsentence]
+ [\midboundarycharacter\c!midsentence{sentence}]
+
+\definesymbol
+ [\c!leftsentence]
+ [\leftboundarycharacter\c!leftsentence{sentence}]
+
+\definesymbol
+ [\c!rightsentence]
+ [\rightboundarycharacter\c!rightsentence{sentence}]
+
+\definesymbol
+ [\c!leftsubsentence]
+ [\leftboundarycharacter\c!leftsubsentence{sentence}]
+
+\definesymbol
+ [\c!rightsubsentence]
+ [\rightboundarycharacter\c!rightsubsentence{sentence}]
+
+\newsignal \d_typo_subsentence_signal
+\newcount \c_typo_subsentence_nesting
+
+\let\beforesubsentence\donothing
+\let\aftersubsentence \donothing
+
+% todo: make this language option
+%
+% \def\beforesubsentence{\removeunwantedspaces}
+% \def\aftersubsentence {\ignorespaces}
+
+\unexpanded\def\midsentence
+ {\symbol[\c!midsentence]}
+
+\unexpanded\def\beginofsubsentence
+ {\beforesubsentence
+ \ifdim\lastkern=\d_typo_subsentence_signal
+ \unskip
+ \kern\hspaceamount\currentlanguage{intersentence}%
+ \fi
+ \global\advance\c_typo_subsentence_nesting\plusone
+ \ifnum\c_typo_subsentence_nesting=\plusone
+ \dontleavehmode % was \leaveoutervmode
+ \fi
+ \dostarttagged\t!subsentence\empty
+ \symbol[\ifodd\c_typo_subsentence_nesting\c!leftsentence\else\c!leftsubsentence\fi]%
+ }% \ignorespaces}
+
+\unexpanded\def\endofsubsentence % relax prevents space gobbling
+ {\symbol[\ifodd\c_typo_subsentence_nesting\c!rightsentence\else\c!rightsubsentence\fi]%
+ \dostoptagged
+ \global\advance\c_typo_subsentence_nesting\minusone
+ \unskip
+ \kern\d_typo_subsentence_signal\relax
+ \aftersubsentence}
+
+\unexpanded\def\beginofsubsentencespacing % relax prevents space gobbling
+ {\kern\d_typo_subsentence_signal\relax}% \ignorespaces}
+
+\unexpanded\def\endofsubsentencespacing
+ {\ifdim\lastkern=\d_typo_subsentence_signal
+ \unskip
+ \hskip\hspaceamount\currentlanguage{intersentence}%
+ % no good, actually language dependent:
+% \ignorespaces
+ \else
+ \unskip
+ \fi}
+
+%D \startbuffer
+%D test |<|test |<|test|>| test|>| test \par
+%D test|<|test|<|test|>|test|>|test \par
+%D test |<||<|test|>||>| test \par
+%D test \directdiscretionary{<}test\directdiscretionary{>} test \par
+%D \stopbuffer
+%D
+%D \typebuffer
+%D \getbuffer
+
+\unexpanded\def\startsubsentence{\beginofsubsentence \prewordbreak\beginofsubsentencespacing}
+\unexpanded\def\stopsubsentence {\endofsubsentencespacing\prewordbreak\endofsubsentence}
+\unexpanded\def\subsentence {\groupedcommand\startsubsentence\stopsubsentence}
+
+\definehspace [quotation] [\zeropoint]
+\definehspace [interquotation] [.125em]
+
+%definehspace [quote] [\zeropoint]
+%definehspace [speech] [\zeropoint]
+
+\definehspace [quote] [\hspaceamount\currentlanguage{quotation}]
+\definehspace [speech] [\hspaceamount\currentlanguage{quotation}]
+
+\definesymbol
+ [\c!leftquotation]
+ [\leftboundarycharacter\c!leftquotation{quotation}]
+
+\definesymbol
+ [\c!rightquotation]
+ [\rightboundarycharacter\c!rightquotation{quotation}]
+
+\definesymbol
+ [\c!leftquote]
+ [\leftboundarycharacter\c!leftquote{quote}]
+
+\definesymbol
+ [\c!rightquote]
+ [\rightboundarycharacter\c!rightquote{quote}]
+
+\definesymbol
+ [\c!leftspeech]
+ [\leftboundarycharacter\c!leftspeech{speech}]
+
+\definesymbol
+ [\c!rightspeech]
+ [\rightboundarycharacter\c!rightspeech{speech}]
+
+\definesymbol
+ [\c!middlespeech]
+ [\leftboundarycharacter\c!middlespeech{speech}]
+
+\appendtoks\def\quotation#1{"#1"}\to\simplifiedcommands
+\appendtoks\def\quote #1{'#1'}\to\simplifiedcommands
+
+%D The next features was so desperately needed by Giuseppe
+%D Bilotta that he made a module for it. Since this is a
+%D typical example of core functionality, I decided to extend
+%D the low level quotation macros in such a way that a speech
+%D feature could be build on top of it. The speech opening and
+%D closing symbols are defined per language. Italian is an
+%D example of a language that has them set.
+
+\newsignal\d_typo_delimited_signal
+
+\let\currentdelimitedtext\s!unknown
+
+\let\delimitedtextlevel\!!zerocount
+
+\def\c_typo_delimited_nesting{\csname\??delimitedtextlevel\currentparentdelimitedtext\endcsname}
+
+\def\typo_delimited_push#1%
+ {\globalpushmacro\currentdelimitedtext
+ \def\currentdelimitedtext{#1}%
+ \let\currentparentdelimitedtext\currentdelimitedtext
+ \global\advance\c_typo_delimited_nesting\plusone
+ \edef\delimitedtextlevel{\number\c_typo_delimited_nesting}%
+ \normalexpanded{\chaintocurrentdelimitedtext{\currentparentdelimitedtext:\delimitedtextlevel}}%
+ \edef\currentdelimitedtext{\currentparentdelimitedtext:\delimitedtextlevel}}
+
+\def\typo_delimited_pop
+ {\global\advance\c_typo_delimited_nesting\minusone
+ \globalpopmacro\currentdelimitedtext}
+
+\installcorenamespace{delimitedtext}
+\installcorenamespace{delimitedtextlevel}
+
+\installcommandhandler \??delimitedtext {delimitedtext} \??delimitedtext
+
+\appendtoks
+ \expandafter\newcount\csname\??delimitedtextlevel\currentdelimitedtext\endcsname
+ \setuevalue{\currentdelimitedtext }{\delimitedtext[\currentdelimitedtext]}%
+ \setuevalue{\e!start\currentdelimitedtext}{\startdelimitedtext[\currentdelimitedtext]}%
+ \setuevalue{\e!stop \currentdelimitedtext}{\stopdelimitedtext}%
+\to \everydefinedelimitedtext
+
+\setupdelimitedtext
+ [\c!location=\v!margin, % \v!text \v!paragraph
+ \c!spacebefore=,
+ \c!spaceafter=\delimitedtextparameter\c!spacebefore,
+ \c!style=\v!normal,
+ \c!color=,
+ \c!leftmargin=\zeropoint,
+ \c!rightmargin=\delimitedtextparameter\c!leftmargin,
+ \c!indentnext=\v!yes,
+ \c!before=,
+ \c!after=,
+ \c!left=,
+ \c!right=,
+ %\c!level=0,
+ \c!method=,
+ \c!repeat=\v!no]
+
+\def\typo_delimited_repeat_ideed
+ {\relax\ifcase\delimitedtextlevel\else
+ \typo_delimited_handle_middle\c!middle
+ \fi}
+
+\let\typo_delimited_repeat\relax
+
+\unexpanded\def\startdelimitedtext[#1]%
+ {\begingroup
+ \typo_delimited_push{#1}%
+ \dostarttagged\t!delimitedblock\currentdelimitedtext
+ \edef\p_method{\delimitedtextparameter\c!method}%
+ \ifx\p_method\s!font
+ \expandafter\typo_delimited_start_font
+ \else
+ \expandafter\typo_delimited_start_other
+ \fi}
+
+\let\typo_delimited_stop\relax % hooks into \everypar
+
+\def\typo_delimited_start_font
+ {\let\typo_delimited_stop\typo_delimitedtexts_finish_font
+ \delimitedtextparameter\c!left
+ \ignorespaces}
+
+\def\typo_delimited_start_other
+ {\edef\p_repeat{\delimitedtextparameter\c!repeat}%
+ \ifx\p_repeat\v!yes
+ \let\typo_delimited_repeat\typo_delimited_repeat_ideed
+ \else
+ \let\typo_delimited_repeat\relax
+ \fi
+ \edef\p_location{\delimitedtextparameter\c!location}%
+ \ifx\p_location\v!paragraph
+ \singleexpandafter\typo_delimited_start_par
+ \else\ifx\p_location\v!margin
+ \doubleexpandafter\typo_delimited_start_par
+ \else
+ \doubleexpandafter\typo_delimited_start_txt
+ \fi\fi}
+
+\def\typo_delimitedtexts_finish_font
+ {\removeunwantedspaces\delimitedtextparameter\c!right}
+
+\def\typo_delimited_start_par
+ {\dosingleempty\typo_delimited_start_par_indeed}
+
+\def\typo_delimited_start_par_indeed[#1]%
+ {\let\typo_delimited_stop\typo_delimited_stop_par
+ \doifsomething{\delimitedtextparameter\c!spacebefore}
+ {\blank[\delimitedtextparameter\c!spacebefore]}%
+ \delimitedtextparameter\c!before
+ \edef\m_typo_delimited_narrower{#1}%
+ \ifx\m_typo_delimited_narrower\empty
+ \endgraf
+ \doadaptleftskip {\delimitedtextparameter\c!leftmargin}%
+ \doadaptrightskip{\delimitedtextparameter\c!rightmargin}%
+ \let\typo_delimited_stop_par_indeed\endgraf
+ \else % backward compatible direct directive
+ \startnarrower[#1]%
+ \let\typo_delimited_stop_par_indeed\stopnarrower
+ \fi
+ % so far
+ \pushmacro\checkindentation
+ \doifsomething{\delimitedtextparameter\c!indenting} % WS
+ {\setupindenting[\delimitedtextparameter\c!indenting]}%
+ \begingroup
+ \usedelimitedtextstyleandcolor\c!style\c!color
+ \leftdelimitedtextmark
+ \ignorespaces}
+
+\def\typo_delimited_stop_par
+ {\removeunwantedspaces
+ \removelastskip
+ \rightdelimitedtextmark
+ \endgroup
+ \popmacro\checkindentation
+ \typo_delimited_stop_par_indeed
+ \delimitedtextparameter\c!after
+ \doifsomething{\delimitedtextparameter\c!spaceafter}
+ {\blank[\delimitedtextparameter\c!spaceafter]}%
+ \useindentnextparameter\delimitedtextparameter
+ \dorechecknextindentation}% AM: This was missing!
+
+\def\typo_delimited_start_txt
+ {\let\typo_delimited_stop\typo_delimited_stop_txt
+ \begingroup
+ \usedelimitedtextstyleandcolor\c!style\c!color
+ \typo_delimited_handle_left\c!left
+ \ignorespaces}
+
+\def\typo_delimited_stop_txt
+ {\removeunwantedspaces
+ \typo_delimited_handle_right\c!right
+ \endgroup}
+
+\unexpanded\def\stopdelimitedtext
+ {\typo_delimited_stop
+ \dostoptagged
+ \typo_delimited_pop
+ \endgroup}
+
+\unexpanded\def\delimitedtext[#1]%
+ {\dontleavehmode % following ones can be omited
+ \typo_delimited_push{#1}%
+ \edef\p_method{\delimitedtextparameter\c!method}%
+ \ifx\p_method\s!font
+ \expandafter\typo_delimited_fontdriven
+ \else
+ \expandafter\typo_delimited_other
+ \fi}
+
+\def\typo_delimited_other
+ {\edef\p_location{\delimitedtextparameter\c!location}%
+ \ifx\p_location\v!paragraph
+ \singleexpandafter\typo_delimited_par
+ \else\ifx\p_location\v!margin
+ \doubleexpandafter\typo_delimited_par
+ \else
+ \doubleexpandafter\typo_delimited_txt
+ \fi\fi}
+
+% shortcuts
+
+\unexpanded\def\startdelimited{\startdelimitedtext}
+\unexpanded\def\stopdelimited {\stopdelimitedtext} % no let, dynamically assigned
+ \def\delimited {\delimitedtext}
+
+\unexpanded\def\leftdelimitedtextmark
+ {\doifsomething{\delimitedtextparameter\c!left}
+ {\setbox\scratchbox\hbox{\delimitedtextparameter\c!left}%
+ \dontleavehmode
+ \doif{\delimitedtextparameter\c!location}\v!margin{\hskip-\wd\scratchbox}%
+ \box\scratchbox}}
+
+\unexpanded\def\rightdelimitedtextmark
+ {\doifsomething{\delimitedtextparameter\c!right}
+ {\hsmash{\delimitedtextparameter\c!right}}}
+
+% \starttext
+% \hyphenatedword{groepsvrijstellingsverordeningen}\par
+% \hyphenatedword{\quote{groepsvrijstellingsverordeningen}}\par
+% \dorecurse{100}{\hskip300pt\hskip\recurselevel pt test \quote{xxx xxxx}.\par}
+% \page \setuppapersize[A5][A4]
+% \quotation {overly beautiful pusillanimous sesquipedalian
+% longwinded} test test test test test test test test test test test
+% test test test test test test test test test test test test test
+% test test test test test test test test test test test test test
+% test test test test test test test test test test test test test
+% test test test
+% \stoptext
+
+\def\typo_delimited_handle_middle#1%
+ {\begingroup
+ \setbox\scratchbox\hbox{\delimitedtextparameter#1}%
+ \ifdim\wd\scratchbox>\zeropoint
+ \ifdim\lastkern=\d_typo_delimited_signal
+ \unkern
+ \hskip\hspaceamount\currentlanguage{interquotation}%
+ \fi
+ \ifhmode % else funny pagebeaks
+ \penalty\plustenthousand
+ \hskip\zeropoint % == \prewordbreak
+ \fi
+ \strut % new, needed below
+ \delimitedtextparameter#1% unhbox\scratchbox
+ % \penalty\plustenthousand % else overfull boxes, but that's better than dangling periods
+ \kern\d_typo_delimited_signal % +- \prewordbreak
+ \fi
+ \endgroup}
+
+\def\typo_delimited_handle_left#1%
+ {\begingroup
+ \setbox\scratchbox\hbox{\delimitedtextparameter#1}%
+ \ifdim\wd\scratchbox>\zeropoint
+ \ifdim\lastkern=\d_typo_delimited_signal
+ \unkern
+ \hskip\hspaceamount\currentlanguage{interquotation}%
+ \else\ifdim\lastskip=\d_typo_delimited_signal
+ \unskip
+ \hskip\hspaceamount\currentlanguage{interquotation}%
+ \fi\fi
+ \strut % new, needed below
+ \ifhmode % else funny pagebeaks
+ \penalty\plustenthousand
+ \hskip\zeropoint % == \prewordbreak
+ \fi
+ \strut % new, needed below
+ \delimitedtextparameter#1% unhbox\scratchbox
+ \hskip\d_typo_delimited_signal % +- \prewordbreak
+ \fi
+ \endgroup}
+
+\def\typo_delimited_handle_right#1%
+ {\begingroup
+ \setbox\scratchbox\hbox{\delimitedtextparameter#1}%
+ \ifdim\wd\scratchbox>\zeropoint
+ \ifdim\lastkern=\d_typo_delimited_signal
+ \unkern
+ \penalty\plustenthousand
+ \hskip\hspaceamount\currentlanguage{interquotation}%
+ \else\ifdim\lastskip=\d_typo_delimited_signal
+ \unskip
+ \penalty\plustenthousand
+ \hskip\hspaceamount\currentlanguage{interquotation}%
+ \fi\fi
+ \ifhmode % else funny pagebeaks
+ \penalty\plustenthousand
+ \hskip\zeropoint % == \prewordbreak
+ \fi
+ \strut % new, needed below
+ \delimitedtextparameter#1% unhbox\scratchbox
+ \kern\d_typo_delimited_signal % +- \prewordbreak
+ \fi
+ \endgroup}
+
+\unexpanded\def\typo_delimited_par
+ {\groupedcommand
+ {\dostarttagged\t!delimited\currentdelimitedtext % block?
+ \typo_delimited_handle_left\c!left}
+ {\typo_delimited_handle_right\c!right
+ \removelastskip
+ \dostoptagged
+ \typo_delimited_pop}}
+
+\unexpanded\def\typo_delimited_txt
+ {\doifelse{\delimitedtextparameter\c!style}\v!normal
+ \typo_delimited_quoted
+ \typo_delimited_attributed}
+
+\def\typo_delimited_quoted_b
+ {\dostarttagged\t!delimited\currentdelimitedtext
+ \typo_delimited_handle_left\c!left}
+
+\def\typo_delimited_quoted_e
+ {\typo_delimited_handle_right\c!right
+ \removelastskip
+ \dostoptagged
+ \typo_delimited_pop}
+
+\def\typo_delimited_attributed_b
+ {\dostarttagged\t!delimited\currentdelimitedtext
+ \usedelimitedtextstyleandcolor\c!style\c!color}
+
+\def\typo_delimited_attributed_e
+ {\dostoptagged
+ \typo_delimited_pop}
+
+\def\typo_delimited_fontdriven_b
+ {\dostarttagged\t!delimited\currentdelimitedtext
+ \languageparameter{\c!left\currentdelimitedtext}}
+
+\def\typo_delimited_fontdriven_e
+ {\languageparameter{\c!right\currentdelimitedtext}%
+ \dostoptagged
+ \typo_delimited_pop}
+
+% We now assume proper argument usage (so no longer grouped
+% command).
+
+% \def\typo_delimited_quoted {\groupedcommand \typo_delimited_quoted_b \typo_delimited_quoted_e }
+% \def\typo_delimited_attributed{\groupedcommand \typo_delimited_attributed_b\typo_delimited_attributed_e}
+% \def\typo_delimited_fontdriven{\simplegroupedcommand\typo_delimited_fontdriven_b\typo_delimited_fontdriven_e}
+
+\def\typo_delimited_quoted {\bgroup\typo_delimited_quoted_b \aftergroup\typo_delimited_quoted_e \let\next=}
+\def\typo_delimited_attributed{\bgroup\typo_delimited_attributed_b\aftergroup\typo_delimited_attributed_e\let\next=}
+\def\typo_delimited_fontdriven{\bgroup\typo_delimited_fontdriven_b\aftergroup\typo_delimited_fontdriven_e\let\next=}
+
+% testcase for nesting:
+%
+% \quotation{... \quotation{...} ...}
+% \startquotation ... \startquotation... \quotation{...} \stopquotation\space ...\stopquotation
+% \setupdelimitedtext[quotation][1][left=(,right=)]
+% \setupdelimitedtext[quotation][2][left={[},right={]}]
+% \setupdelimitedtext[quotation][3][left=\{,right=\}]
+% \quotation{... \quotation{...} ...}
+% \startquotation ... \startquotation... \quotation{...} \stopquotation\space ...\stopquotation
+
+\definedelimitedtext
+ [\v!quotation]
+ [\c!left={\symbol[\c!leftquotation]},
+ \c!right={\symbol[\c!rightquotation]},
+ \c!leftmargin=\v!standard]
+
+\definedelimitedtext
+ [\v!quote][\v!quotation]
+
+\setupdelimitedtext
+ [\v!quote]
+ [\c!location=\v!text,
+ \c!left={\symbol[\c!leftquote]},
+ \c!right={\symbol[\c!rightquote]}]
+
+\definedelimitedtext
+ [\v!blockquote][\v!quotation]
+
+\setupdelimitedtext
+ [\v!blockquote]
+ [\c!left=,
+ \c!right=]
+
+\definedelimitedtext
+ [\v!speech][\v!quotation]
+
+\setupdelimitedtext
+ [\v!speech]
+ [\c!repeat=\v!yes,
+ \c!left={\symbol[\c!leftspeech]},
+ \c!middle={\symbol[\c!middlespeech]},
+ \c!right={\symbol[\c!rightspeech]}]
+
+% how do we call an tight quote
+%
+% \definedelimitedtext
+% [\v!quotation][\v!quotation]
+%
+% \setupdelimitedtext
+% [\v!quotation]
+% [\c!indentnext=\v!no,
+% \c!spacebefore=\v!nowhite]
+
+\unexpanded\def\setupquotation{\setupdelimitedtext[\v!quotation]}
+\unexpanded\def\setupquote {\setupdelimitedtext[\v!quote]}
+
+\protect \endinput
diff --git a/tex/context/base/typo-dig.lua b/tex/context/base/typo-dig.lua
index 1e4a02fc6..f11b3b0e3 100644
--- a/tex/context/base/typo-dig.lua
+++ b/tex/context/base/typo-dig.lua
@@ -28,6 +28,7 @@ local insert_before = node.insert_before
local insert_after = node.insert_after
local texattribute = tex.attribute
+local unsetvalue = attributes.unsetvalue
local nodecodes = nodes.nodecodes
local glyph_code = nodecodes.glyph
@@ -42,6 +43,8 @@ local fontdata = fonthashes.identifiers
local chardata = fonthashes.characters
local quaddata = fonthashes.quads
+local v_reset = interfaces.variables.reset
+
local charbase = characters.data
local getdigitwidth = fonts.helpers.getdigitwidth
@@ -125,20 +128,30 @@ end
local m, enabled = 0, false -- a trick to make neighbouring ranges work
-function digits.set(n)
- if not enabled then
- tasks.enableaction("processors","typesetters.digits.handler")
- if trace_digits then
- report_digits("enabling digit handler")
- end
- enabled = true
- end
- if m == 100 then
- m = 1
+function digits.set(n) -- number or 'reset'
+ if n == v_reset then
+ n = unsetvalue
else
- m = m + 1
+ n = tonumber(n)
+ if n then
+ if not enabled then
+ tasks.enableaction("processors","typesetters.digits.handler")
+ if trace_digits then
+ report_digits("enabling digit handler")
+ end
+ enabled = true
+ end
+ if m == 100 then
+ m = 1
+ else
+ m = m + 1
+ end
+ n = m * 100 + n
+ else
+ n = unsetvalue
+ end
end
- texattribute[a_digits] = m * 100 + n
+ texattribute[a_digits] = n
end
digits.handler = nodes.installattributehandler {
@@ -146,3 +159,7 @@ digits.handler = nodes.installattributehandler {
namespace = digits,
processor = process,
}
+
+-- interface
+
+commands.setdigitsmanipulation = digits.set
diff --git a/tex/context/base/typo-dig.mkiv b/tex/context/base/typo-dig.mkiv
index 03be1bffc..832ebbec4 100644
--- a/tex/context/base/typo-dig.mkiv
+++ b/tex/context/base/typo-dig.mkiv
@@ -39,7 +39,7 @@
%D \stoplines
\unexpanded\def\setdigitsmanipulation[#1]%
- {\ctxlua{typesetters.digits.set(\number#1)}}
+ {\ctxcommand{setdigitsmanipulation("#1")}}
\unexpanded\def\resetdigitsmanipulation
{\attribute\digitsattribute\attributeunsetvalue}
@@ -48,8 +48,8 @@
\resetdigitsmanipulation
\to \everyresettypesetting
-\unexpanded\def\equaldigits{\groupedcommand{\setdigitsmanipulation[\plusone]}{}}
-\unexpanded\def\dummydigit {\hphantom{\setdigitsmanipulation[\plusone]0}}
+\unexpanded\def\equaldigits{\groupedcommand{\setdigitsmanipulation[\number\plusone]}{}}
+\unexpanded\def\dummydigit {\hphantom {\setdigitsmanipulation[\number\plusone]0}}
\appendtoks
\resetcharacterspacing
diff --git a/tex/context/base/typo-mar.mkiv b/tex/context/base/typo-mar.mkiv
index 0d5c5a5b9..987ce9a12 100644
--- a/tex/context/base/typo-mar.mkiv
+++ b/tex/context/base/typo-mar.mkiv
@@ -155,26 +155,26 @@
\unexpanded\def\margindata
{\iftrialtypesetting
- \expandafter\nomargindata
+ \expandafter\typo_margins_data_nop
\else
- \expandafter\domargindata
+ \expandafter\typo_margins_data_yes
\fi}
-\def\nomargindata[#name]%
- {\dodoubleempty\donomargindata}
+\def\typo_margins_data_nop[#name]%
+ {\dodoubleempty\typo_margins_data_nop_indeed}
-\def\domargindata[#name]%
+\def\typo_margins_data_yes[#name]%
{\setfalse\inhibitmargindata % flushing afterwards
\begingroup
%\settrue\inhibitmargindata % no flushing in here
\def\currentmargindata{#name}%
\let\currentmarginframed\currentmargindata
- \dodoubleempty\dodomargindata}
+ \dodoubleempty\typo_margins_data_yes_indeed}
-\unexpanded\def\donomargindata[#dataparameters][#textparameters]#content%
+\unexpanded\def\typo_margins_data_nop_indeed[#dataparameters][#textparameters]#content%
{}
-\unexpanded\def\dodomargindata[#dataparameters][#textparameters]#content%
+\unexpanded\def\typo_margins_data_yes_indeed[#dataparameters][#textparameters]#content%
{\iffirstargument
\setupcurrentmargindata[#dataparameters]%
\fi
@@ -365,9 +365,9 @@
\let\definemarginline\definemargindata
\unexpanded\def\defineinmargin
- {\doquadrupleempty\dodefineinmargin}
+ {\doquadrupleempty\typo_inmargin_define}
-\def\dodefineinmargin[#name][#location][#align][#settings]% not completely compatible
+\def\typo_inmargin_define[#name][#location][#align][#settings]% not completely compatible
{\definemargindata[#name][\c!location=#location,\c!align=#align,#settings]%
\definemarginframed[#name][#location][\c!align=#align,#settings]}
diff --git a/tex/context/base/typo-rep.lua b/tex/context/base/typo-rep.lua
index 5ecff5586..0d9bf8cc1 100644
--- a/tex/context/base/typo-rep.lua
+++ b/tex/context/base/typo-rep.lua
@@ -24,12 +24,17 @@ local has_attribute = node.has_attribute
local chardata = characters.data
local collected = false
-local attribute = attributes.private("stripping")
+local a_stripping = attributes.private("stripping")
local fontdata = fonts.hashes.identifiers
local tasks = nodes.tasks
-local nodecodes = nodes.nodecodes
-local glyph_code = nodecodes.glyph
+local texattribute = tex.attribute
+local unsetvalue = attributes.unsetvalue
+
+local v_reset = interfaces.variables.reset
+
+local nodecodes = nodes.nodecodes
+local glyph_code = nodecodes.glyph
-- todo: other namespace -> typesetters
@@ -74,7 +79,7 @@ function nodes.handlers.stripping(head)
while current do
if current.id == glyph_code then
-- it's more efficient to keep track of what needs to be kept
- local todo = has_attribute(current,attribute)
+ local todo = has_attribute(current,a_stripping)
if todo == 1 then
local char = current.char
local what = glyphs[char]
@@ -94,11 +99,31 @@ function nodes.handlers.stripping(head)
return head, done
end
+local enabled = false
+
+function stripping.set(n) -- number or 'reset'
+ if n == v_reset then
+ n = unsetvalue
+ else
+ n = tonumber(n)
+ if n then
+ if not enabled then
+ if initialize then initialize() end
+ tasks.enableaction("processors","nodes.handlers.stripping")
+ enabled = true
+ end
+ else
+ n = unsetvalue
+ end
+ end
+ texattribute[a_stripping] = n
+end
+
+-- why not in task-ini?
+
tasks.appendaction("processors","fonts","nodes.handlers.stripping",nil,"nodes.handlers.characters")
tasks.disableaction("processors","nodes.handlers.stripping")
-function nodes.stripping.enable()
- if initialize then initialize() end
- tasks.enableaction("processors","nodes.handlers.stripping")
- function nodes.stripping.enable() end
-end
+-- interface
+
+commands.setcharacterstripping = stripping.set
diff --git a/tex/context/base/typo-rep.mkiv b/tex/context/base/typo-rep.mkiv
index c13d7eeb7..46b439491 100644
--- a/tex/context/base/typo-rep.mkiv
+++ b/tex/context/base/typo-rep.mkiv
@@ -37,17 +37,15 @@
\definesystemattribute[stripping][public]
-\def\setcharacterstripping
- {\ctxlua{nodes.stripping.enable()}%
- \gdef\setcharacterstripping[##1]{\attribute\strippingattribute##1\relax}%
- \setcharacterstripping}
+\unexpanded\def\setcharacterstripping[#1]%
+ {\ctxcommand{setcharacterstripping("#1")}}
-\def\resetcharacterstripping
+\unexpanded\def\resetcharacterstripping
{\attribute\strippingattribute\attributeunsetvalue}
% maybe .. this might disappear, but is handy for testing
-\def\forcecharacterstripping % secret command
+\unexpanded\def\forcecharacterstripping % secret command
{\ctxlua{fonts.handlers.otf.features.register("formatters",true)}}
\protect \endinput
diff --git a/tex/context/base/typo-spa.lua b/tex/context/base/typo-spa.lua
index 5b80c7178..9e653ad55 100644
--- a/tex/context/base/typo-spa.lua
+++ b/tex/context/base/typo-spa.lua
@@ -30,6 +30,8 @@ local quaddata = fonthashes.quads
local texattribute = tex.attribute
local unsetvalue = attributes.unsetvalue
+local v_reset = interfaces.variables.reset
+
local nodecodes = nodes.nodecodes
local glyph_code = nodecodes.glyph
@@ -192,12 +194,18 @@ function spacings.setup(name,char,settings)
end
function spacings.set(name)
- if not enabled then
- tasks.enableaction("processors","typesetters.spacings.handler")
- enabled = true
+ local n = unsetvalue
+ if name ~= v_reset then
+ local data = numbers[name]
+ if data then
+ if not enabled then
+ tasks.enableaction("processors","typesetters.spacings.handler")
+ enabled = true
+ end
+ n = data.number or unsetvalue
+ end
end
- local data = numbers[name]
- texattribute[a_spacings] = data and data.number or unsetvalue
+ texattribute[a_spacings] = n
end
function spacings.reset()
diff --git a/tex/generic/context/luatex/luatex-fonts-merged.lua b/tex/generic/context/luatex/luatex-fonts-merged.lua
index 50eb86f93..c5a3e3028 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 : 01/11/12 14:58:36
+-- merge date : 01/12/12 11:03:39
do -- begin closure to overcome local limits and interference