summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/context/base/page-txt.mkvi
diff options
context:
space:
mode:
authorMojca Miklavec <mojca.miklavec@gmail.com>2012-05-14 17:38:55 +0000
committerMojca Miklavec <mojca.miklavec@gmail.com>2012-05-14 17:38:55 +0000
commit15995e10bfc68edf79970c4ea4fbb6678566c46e (patch)
tree2de7ca2a83f2d37ef043ad7429a5cb945bb79ddb /Master/texmf-dist/tex/context/base/page-txt.mkvi
parentc9a39f716f1e5ec820ed3aab2c9aef25c5a9d730 (diff)
ConTeXt 2012.05.14 16:00
git-svn-id: svn://tug.org/texlive/trunk@26371 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex/context/base/page-txt.mkvi')
-rw-r--r--Master/texmf-dist/tex/context/base/page-txt.mkvi885
1 files changed, 885 insertions, 0 deletions
diff --git a/Master/texmf-dist/tex/context/base/page-txt.mkvi b/Master/texmf-dist/tex/context/base/page-txt.mkvi
new file mode 100644
index 00000000000..c86597338ca
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/page-txt.mkvi
@@ -0,0 +1,885 @@
+% macros=mkvi
+
+%D \module
+%D [ file=page-txt, % copied from main-001,
+%D version=1997.03.31,
+%D title=\CONTEXT\ Page Macros,
+%D subtitle=Texts,
+%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 Page Macros / Texts}
+
+\unprotect
+
+\newtoks\toptextcontent \newtoks\leftedgetextcontent
+\newtoks\headertextcontent \newtoks\leftmargintextcontent
+\newtoks\footertextcontent \newtoks\rightmargintextcontent
+\newtoks\bottomtextcontent \newtoks\rightedgetextcontent
+
+\newtoks\texttextcontent
+
+%D \macros
+%D {setuptop, setupheader, setuptext,
+%D setupfooter, setupbottom}
+%D
+%D The macros in this module sometimes look a bit more complicated
+%D than needed, which is a direct result of the fact that their
+%D ancestors are quite old and upward compatibility is a must.
+%D
+%D \showsetup{setuptop}
+%D \showsetup{setupheader}
+%D \showsetup{setuptext}
+%D \showsetup{setupfooter}
+%D \showsetup{setupbottom}
+
+\installcorenamespace{layouttexts}
+\installcorenamespace{layouttextsline}
+\installcorenamespace{layouttextsreset}
+\installcorenamespace{layouttextssynchronize}
+\installcorenamespace{layouttextstrut}
+\installcorenamespace{layouttextspecial}
+\installcorenamespace{layouttextcontent}
+
+\installcommandhandler \??layouttexts {layoutelement} \??layouttexts
+
+% \appendtoks
+% \resetlayoutelementparameter\c!lefttext % resolves better
+% \resetlayoutelementparameter\c!middletext
+% \resetlayoutelementparameter\c!righttext
+% \to \everydefinelayoutelement
+
+\definelayoutelement[\v!top ]
+\definelayoutelement[\v!header]
+\definelayoutelement[\v!text ]
+\definelayoutelement[\v!footer]
+\definelayoutelement[\v!bottom]
+
+\definelayoutelement[\v!top :\v!text] [\v!top ][\c!lefttext=,\c!middletext=,\c!righttext=]
+\definelayoutelement[\v!header:\v!text] [\v!header][\c!lefttext=,\c!middletext=,\c!righttext=]
+\definelayoutelement[\v!text :\v!text] [\v!text ][\c!lefttext=,\c!middletext=,\c!righttext=]
+\definelayoutelement[\v!footer:\v!text] [\v!footer][\c!lefttext=,\c!middletext=,\c!righttext=]
+\definelayoutelement[\v!bottom:\v!text] [\v!bottom][\c!lefttext=,\c!middletext=,\c!righttext=]
+
+\definelayoutelement[\v!top :\v!margin][\v!top ][\c!lefttext=,\c!middletext=,\c!righttext=]
+\definelayoutelement[\v!header:\v!margin][\v!header][\c!lefttext=,\c!middletext=,\c!righttext=]
+\definelayoutelement[\v!text :\v!margin][\v!text ][\c!lefttext=,\c!middletext=,\c!righttext=]
+\definelayoutelement[\v!footer:\v!margin][\v!footer][\c!lefttext=,\c!middletext=,\c!righttext=]
+\definelayoutelement[\v!bottom:\v!margin][\v!bottom][\c!lefttext=,\c!middletext=,\c!righttext=]
+
+\definelayoutelement[\v!top :\v!edge] [\v!top ][\c!lefttext=,\c!middletext=,\c!righttext=]
+\definelayoutelement[\v!header:\v!edge] [\v!header][\c!lefttext=,\c!middletext=,\c!righttext=]
+\definelayoutelement[\v!text :\v!edge] [\v!text ][\c!lefttext=,\c!middletext=,\c!righttext=]
+\definelayoutelement[\v!footer:\v!edge] [\v!footer][\c!lefttext=,\c!middletext=,\c!righttext=]
+\definelayoutelement[\v!bottom:\v!edge] [\v!bottom][\c!lefttext=,\c!middletext=,\c!righttext=]
+
+\unexpanded\def\setuplayouttext
+ {\dotripleempty\page_layouts_setup_text}
+
+\def\page_layouts_setup_text[#vertical][#horizontal][#settings]%
+ {\ifthirdargument
+ \setuplayoutelement[#vertical:#horizontal][#settings]%
+ \else
+ \setuplayoutelement[#vertical][#horizontal]%
+ \fi}
+
+\appendtoks
+ \ifx\currentlayoutelement\empty\else
+ \page_layouts_synchronize_element\currentlayoutelement % brr, can be vertical:horizontal
+ \fi
+\to \everysetuplayoutelement
+
+\def\page_layouts_reset_element_status#vertical%
+ {\expandafter\normalgdef\csname\??layouttextsreset#vertical\endcsname{\page_layouts_set_element_status_normal#vertical}}
+
+\def\page_layouts_set_element_status_normal#vertical%
+ {\global\expandafter\let\csname\namedlayoutelementhash#vertical\c!state\endcsname\v!normal
+ \global\expandafter\let\csname\??layouttextsreset#vertical\endcsname\relax
+ \page_layouts_synchronize_element{#vertical}}
+
+\def\page_layouts_synchronize_element#vertical%
+ {\xdef\previoustextstate{\csname\??layouttextssynchronize#vertical\endcsname}% can be a let
+ \edef\currenttextstate {\namedlayoutelementparameter{#vertical}\c!state}%
+ %\writestatus{>>}{[#vertical:\currenttextstate/\previoustextstate]}%
+ \ifx\currenttextstate\previoustextstate \else
+ \page_layouts_synchronize_element_indeed{#vertical}%
+ \fi}
+
+\def\page_layouts_synchronize_element_indeed#vertical%
+ {\ifx\currenttextstate \v!high \calculatevsizes\page_backgrounds_recalculate \else
+ \ifx\previoustextstate\v!high \calculatevsizes\page_backgrounds_recalculate \else
+ \ifx\currenttextstate \v!none \calculatevsizes\page_backgrounds_recalculate \else
+ \ifx\previoustextstate\v!none \calculatevsizes\page_backgrounds_recalculate \fi\fi\fi\fi
+ \letgvalue{\??layouttextssynchronize#vertical}\currenttextstate}
+
+\unexpanded\def\setuptop {\dotripleempty\page_layouts_setup_text[\v!top ]}
+\unexpanded\def\setupheader{\dotripleempty\page_layouts_setup_text[\v!header]}
+\unexpanded\def\setuptext {\dotripleempty\page_layouts_setup_text[\v!text ]}
+\unexpanded\def\setupfooter{\dotripleempty\page_layouts_setup_text[\v!footer]}
+\unexpanded\def\setupbottom{\dotripleempty\page_layouts_setup_text[\v!bottom]}
+
+%D We inherit some settings:
+
+\setuplayoutelement
+ [ \c!leftstyle=\layoutelementparameter\c!style,
+ \c!rightstyle=\layoutelementparameter\c!style,
+ \c!leftcolor=\layoutelementparameter\c!color,
+ \c!rightcolor=\layoutelementparameter\c!color,
+ \c!leftwidth=\layoutelementparameter\c!width,
+ \c!rightwidth=\layoutelementparameter\c!width]
+
+%D \macros
+%D {noheaderandfooterlines,notopandbottomlines}
+%D
+%D Although not really needed, the following shortcuts
+%D sometimes come in handy.
+%D
+%D \showsetup{noheaderandfooterlines}
+%D \showsetup{notopandbottomlines}
+
+\def\noheaderandfooterlines
+ {\setuplayoutelement[\v!header][\c!state=\v!empty]%
+ \setuplayoutelement[\v!footer][\c!state=\v!empty]}
+
+\def\notopandbottomlines
+ {\setuplayoutelement[\v!top ][\c!state=\v!empty]%
+ \setuplayoutelement[\v!bottom][\c!state=\v!empty]}
+
+%D \macros
+%D {setuptoptexts, setupheadertexts, setuptexttexts,
+%D setupfootertexts, setupbottomtexts}
+%D
+%D The next macros take one or more arguments. The exact setup
+%D depends on the number of arguments. Although not that
+%D intuitive, the current scheme evolved out of the original.
+%D When margin and edge texts as well as middle texts showed
+%D up, the current odd|/|even scheme surfaced.
+%D
+%D \showsetup{setuptoptexts}
+%D \showsetup{setupheadertexts}
+%D \showsetup{setuptexttexts}
+%D \showsetup{setupfootertexts}
+%D \showsetup{setupbottomtexts}
+
+\unexpanded\def\setuptoptexts {\dosixtupleempty\page_layouts_setup_texts[\v!top ]}
+\unexpanded\def\setupheadertexts{\dosixtupleempty\page_layouts_setup_texts[\v!header ]}
+\unexpanded\def\setuptexttexts {\dosixtupleempty\page_layouts_setup_texts[\v!text ]}
+\unexpanded\def\setupfootertexts{\dosixtupleempty\page_layouts_setup_texts[\v!footer ]}
+\unexpanded\def\setupbottomtexts{\dosixtupleempty\page_layouts_setup_texts[\v!bottom ]}
+
+% todo: \setuplayoutelementtext
+
+% An alternative approach is to have more variables but that does not
+% make the code less complex (probably more).
+
+\def\page_layouts_setup_texts[#vertical][#horizontal][#a][#b][#c][#d]%
+ {\ifsixthargument
+ \edef\currentlayoutelement{#vertical:#horizontal}%
+ \setlayoutelementparameter\c!lefttext
+ {\page_layouts_process_element_double
+ \c!leftstyle \c!leftcolor \c!leftwidth {#a}%
+ \c!rightstyle\c!rightcolor\c!rightwidth{#d}}%
+ \setlayoutelementparameter\c!righttext
+ {\page_layouts_process_element_double
+ \c!rightstyle\c!rightcolor\c!rightwidth{#b}%
+ \c!leftstyle \c!leftcolor \c!leftwidth {#c}}%
+ \else\iffifthargument
+ \edef\currentlayoutelement{#vertical:\v!text}%
+ \setlayoutelementparameter\c!lefttext
+ {\page_layouts_process_element_double
+ \c!leftstyle \c!leftcolor \c!leftwidth {#horizontal}%
+ \c!rightstyle\c!rightcolor\c!rightwidth{#c}}%
+ \setlayoutelementparameter\c!righttext
+ {\page_layouts_process_element_double
+ \c!rightstyle\c!rightcolor\c!rightwidth{#a}%
+ \c!leftstyle \c!leftcolor \c!leftwidth {#b}}%
+ \else\iffourthargument
+ \edef\currentlayoutelement{#vertical:#horizontal}%
+ \doifelsenothing{\detokenize{#a}}
+ {\resetlayoutelementparameter\c!lefttext}
+ {\setlayoutelementparameter\c!lefttext
+ {\page_layouts_process_element_double
+ \c!leftstyle\c!leftcolor\c!leftwidth{#a}%
+ \c!leftstyle\c!leftcolor\c!leftwidth{#a}}}%
+ \doifelsenothing{\detokenize{#b}}
+ {\resetlayoutelementparameter\c!righttext}
+ {\setlayoutelementparameter\c!righttext
+ {\page_layouts_process_element_double
+ \c!rightstyle\c!rightcolor\c!rightwidth{#b}%
+ \c!rightstyle\c!rightcolor\c!rightwidth{#b}}}%
+ \else\ifthirdargument
+ \edef\currentlayoutelement{#vertical:\v!text}%
+ \doifelsenothing{\detokenize{#horizontal}}
+ {\resetlayoutelementparameter\c!lefttext}
+ {\setlayoutelementparameter\c!lefttext
+ {\page_layouts_process_element_double
+ \c!leftstyle\c!leftcolor\c!leftwidth{#horizontal}%
+ \c!leftstyle\c!leftcolor\c!leftwidth{#horizontal}}}%
+ \doifelsenothing{\detokenize{#a}}
+ {\resetlayoutelementparameter\c!righttext}
+ {\setlayoutelementparameter\c!righttext
+ {\page_layouts_process_element_double
+ \c!rightstyle\c!rightcolor\c!rightwidth{#a}%
+ \c!rightstyle\c!rightcolor\c!rightwidth{#a}}}%
+ \else\ifsecondargument
+ \edef\currentlayoutelement{#vertical:\v!text}%
+ \resetlayoutelementparameter\c!lefttext
+ \resetlayoutelementparameter\c!righttext
+ \doifelsenothing{\detokenize{#horizontal}}
+ {\resetlayoutelementparameter\c!middletext}
+ {\setlayoutelementparameter\c!middletext
+ {\page_layouts_process_element_single\c!style\c!color\c!width{#horizontal}}}%
+ \else
+ \edef\currentlayoutelement{#vertical:\v!text}%
+ \resetlayoutelementparameter\c!lefttext
+ \resetlayoutelementparameter\c!righttext
+ \resetlayoutelementparameter\c!middletext
+ \edef\currentlayoutelement{#vertical:\v!margin}%
+ \resetlayoutelementparameter\c!lefttext
+ \resetlayoutelementparameter\c!righttext
+ \resetlayoutelementparameter\c!middletext
+ \edef\currentlayoutelement{#vertical:\v!edge}%
+ \resetlayoutelementparameter\c!lefttext
+ \resetlayoutelementparameter\c!righttext
+ \resetlayoutelementparameter\c!middletext
+ \fi\fi\fi\fi\fi}
+
+%D Left and right texts are swapped on odd and even pages, but
+%D only when double sided typesetting is enabled.
+
+\unexpanded\def\page_layouts_process_element_double
+ {\doifoddpageelse
+ \page_layouts_process_element_double_odd
+ \page_layouts_process_element_double_even}
+
+\def\page_layouts_process_element_double_odd #lstyle#lcolor#lwidth#lcontent#rstyle#rcolor#rwidth#rcontent%
+ {\page_layouts_process_element_single#lstyle#lcolor#lwidth{#lcontent}}
+
+\def\page_layouts_process_element_double_even#lstyle#color#lwidth#lcontent#rstyle#rcolor#rwidth#rcontent%
+ {\page_layouts_process_element_single#rstyle#rcolor#rwidth{#rcontent}}
+
+%D The next macro will be cleaned up and made less messy and
+%D dependent.
+
+\let\m_page_layouts_element_content\empty
+
+\unexpanded\def\page_layouts_process_element_single#style#color#width#content%
+ {\edef\m_page_layouts_element_content{\detokenize{#content}}%
+ \ifx\m_page_layouts_element_content\empty
+ % should not happen too often
+ \else
+ \page_layouts_process_element_single_indeed#style#color#width{#content}%
+ \fi}
+
+\setvalue{\??layouttextstrut\v!yes}{\setstrut\strut} % maybe more variants
+
+\def\page_layouts_process_element_single_indeed#style#color#width#content%
+ {\begingroup
+ \uselayoutelementstyleandcolor#style#color%
+ \csname\??layouttextstrut\layoutelementparameter\c!strut\endcsname
+ \ifcsname\??layouttextspecial\m_page_layouts_element_content\endcsname
+ \csname\??layouttextspecial\m_page_layouts_element_content\endcsname
+ \else
+ \edef\currentlayoutelementwidth{\layoutelementparameter#width}%
+ \ifx\currentlayoutelementwidth\empty
+ \expandafter\page_layouts_process_element_single_normal
+ \else
+ \expandafter\page_layouts_process_element_single_limited
+ \fi{#content}%
+ \fi
+ \endgroup}
+
+% {}{}{} prevents lookahead issues ... this will go away
+
+\def\page_layouts_process_element_single_normal#content%
+ {\doifelsemarking\m_page_layouts_element_content
+ {\getmarking[\m_page_layouts_element_content][\v!first]}
+ {\ignorecrlf#content{}{}{}}}
+
+\def\page_layouts_process_element_single_limited#content%
+ {\doifelsemarking\m_page_layouts_element_content
+ {\limitatetext{\getmarking[\m_page_layouts_element_content][\v!first]}\currentlayoutelementwidth\unknown}
+ {\ignorecrlf\limitatetext{#content{}{}{}}\currentlayoutelementwidth\unknown}}
+
+\setvalue{\??layouttextspecial\v!pagenumber}{\page_layouts_place_page_number}
+\setvalue{\??layouttextspecial\v!date }{\currentdate}
+
+%D When specified, the texts are automatically limited in
+%D length.
+
+% % where used ?
+%
+% \def\page_layouts_limitate_element_text#width%
+% {\edef\currentlayoutelementwidth{\layoutelementparameter#width}%
+% \ifx\currentlayoutelementwidth\empty
+% \expandafter\firstofoneargument
+% \else
+% \expandafter\page_layouts_limitate_element_text_indeed
+% \fi}
+%
+% \def\page_layouts_limitate_element_text_indeed#content%
+% {\limitatetext{#content}\currentlayoutelementwidth\unknown}
+
+%D The placement of text is hooked into the token lists
+%D associated to the area at hand.
+
+\appendtoks \page_layouts_place_text_line\v!top \topheight \to \toptextcontent
+\appendtoks \page_layouts_place_text_line\v!header\headerheight \to \headertextcontent
+\appendtoks \page_layouts_place_text_line\v!text \textheight \to \texttextcontent
+\appendtoks \page_layouts_place_text_line\v!footer\footerheight \to \footertextcontent
+\appendtoks \page_layouts_place_text_line\v!bottom\bottomheight \to \bottomtextcontent
+
+%D Texts can be disabled, moved up and ignored, depending in
+%D the \type {status} variable. This is handled by the next
+%D couple of macros.
+
+\newcount\c_page_layouts_element_state_n
+
+\def\page_layouts_set_element_status#vertical%
+ {\c_page_layouts_element_state_n=0\namedlayoutelementparameter#vertical\c!n\relax
+ \ifcase\c_page_layouts_element_state_n
+ \edef\textlinestatus{\namedlayoutelementparameter#vertical\c!state}%
+ \else
+ \setxvalue{\namedlayoutelementhash#vertical\c!n}{\the\numexpr\c_page_layouts_element_state_n+\minusone}%
+ \let\textlinestatus\v!stop
+ \fi}
+
+\appendtoks
+ \doifinset\v!header\floatspecification{\setxvalue{\namedlayoutelementhash\v!header\c!n}{1}}%
+ \doifinset\v!footer\floatspecification{\setxvalue{\namedlayoutelementhash\v!footer\c!n}{1}}%
+\to \everybeforeflushedpagefloat
+
+\unexpanded\def\page_layouts_place_text_line#vertical%
+ {\page_layouts_set_element_status#vertical%
+ \csname\??layouttextsline\ifcsname\??layouttextsline\textlinestatus\endcsname\textlinestatus\else\s!unknown\fi\endcsname#vertical}
+
+\unexpanded\def\doifelselayouttextline#vertical% shown or not
+ {\edef\currentlayoutelementstate{\namedlayoutelementparameter{#vertical}\c!state}%
+ \ifx\currentlayoutelementstate\v!normal
+ \expandafter\firstoftwoarguments
+ \else\ifx\currentlayoutelementstate\v!start
+ \doubleexpandafter\firstoftwoarguments
+ \else
+ \doubleexpandafter\secondoftwoarguments
+ \fi\fi}
+
+\unexpanded\def\doifelselayoutsomeline#vertical% present or not
+ {\edef\currentlayoutelementstate{\namedlayoutelementparameter{#vertical}\c!state}%
+ \ifx\currentlayoutelementstate\v!none
+ \expandafter\secondoftwoarguments
+ \else\ifx\currentlayoutelementstate\v!high
+ \doubleexpandafter\secondoftwoarguments
+ \else
+ \doubleexpandafter\firstoftwoarguments
+ \fi\fi}
+
+\newconditional\resyncaftertextline
+
+\setvalue{\??layouttextsline\v!normal}{\page_layouts_place_text_line_indeed}
+\setvalue{\??layouttextsline\empty }{\page_layouts_place_text_line_indeed}
+
+\letvalue{\??layouttextsline\v!none}\gobbletwoarguments
+\letvalue{\??layouttextsline\v!stop}\gobbletwoarguments
+
+\setvalue{\??layouttextsline\v!high}#vertical#height%
+ {\global\settrue\resyncaftertextline
+ \page_layouts_reset_element_status#vertical}
+
+\setvalue{\??layouttextsline\v!empty}#vertical#height%
+ {\page_layouts_reset_element_status#vertical}
+
+\setvalue{\??layouttextsline\v!start}#vertical#height%
+ {\page_layouts_reset_element_status#vertical%
+ \page_layouts_place_text_line_indeed#vertical#height}
+
+\setvalue{\??layouttextsline\v!nomarking}#vertical#height%
+ {\bgroup
+ \page_layouts_reset_element_status#vertical%
+ \settrue\inhibitgetmarking
+ \page_layouts_place_text_line_indeed#vertical#height%
+ \egroup}
+
+\setvalue{\??layouttextsline\s!unknown}#vertical#height%
+ {\global\settrue\resyncaftertextline
+ \begingroup % new
+ \page_layouts_reset_element_status#vertical%
+ \csname\namedlayoutelementhash#vertical\textlinestatus\endcsname
+ \csname\namedlayoutelementhash#vertical\v!text \textlinestatus\endcsname
+ \csname\namedlayoutelementhash#vertical\v!margin\textlinestatus\endcsname
+ \csname\namedlayoutelementhash#vertical\v!edge \textlinestatus\endcsname
+ \page_layouts_place_text_line_indeed#vertical#height%
+ \endgroup}
+
+%D The following macro has to be called after a page
+%D is flushed.
+
+\def\resetlayouttextlines % public
+ {\csname\??layouttextsreset\v!top \endcsname
+ \csname\??layouttextsreset\v!header\endcsname
+ \csname\??layouttextsreset\v!text \endcsname
+ \csname\??layouttextsreset\v!footer\endcsname
+ \csname\??layouttextsreset\v!bottom\endcsname
+ \ifconditional\resyncaftertextline
+ \calculateglobalvsizes
+ \page_backgrounds_recalculate
+ \global\setfalse\resyncaftertextline
+ \fi}
+
+% \settext[header][text][middle][xxx][yyy]
+
+\def\settextcontent
+ {\doquintupleempty\page_layouts_set_text_content}
+
+\def\page_layouts_set_text_content[#vertical][#horizontal][#one][#two][#three]% header text middle text/text
+ {\iffifthargument
+ \setvalue{\namedlayoutelementhash{#vertical:#horizontal}\executeifdefined{\??layouttextcontent\c!text:#one}\c!middletext}%
+ {\page_layouts_process_element_double
+ \c!leftstyle \c!leftcolor \c!leftwidth {#two}%
+ \c!rightstyle\c!rightcolor\c!rightwidth{#three}}%
+ \else\iffourthargument
+ \setvalue{\namedlayoutelementhash{#vertical:#horizontal}\executeifdefined{\??layouttextcontent\c!text:#one}\c!middletext}%
+ {\page_layouts_process_element_double
+ \c!leftstyle \c!leftcolor \c!leftwidth {#two}%
+ \c!rightstyle\c!rightcolor\c!rightwidth{#two}}%
+ \else\ifthirdargument
+ \setvalue{\namedlayoutelementhash{#vertical:#horizontal}\c!middletext}%
+ {\page_layouts_process_element_double
+ \c!leftstyle \c!leftcolor \c!leftwidth {#one}%
+ \c!rightstyle\c!rightcolor\c!rightwidth{#one}}%
+ \fi\fi\fi}
+
+\def\resettextcontent
+ {\dotripleempty\page_layouts_reset_text_content}
+
+\def\page_layouts_reset_text_content[#vertical][#horizontal][#tag]% header text middle
+ {\edef\currentlayoutelement{#vertical:#horizontal}%
+ \ifthirdargument
+ \letvalueempty{\layoutelementhash\executeifdefined{\??layouttextcontent\c!text:#tag}\c!middletext}%
+ \else\ifsecondargument
+ \resetlayoutelementparameter\c!lefttext
+ \resetlayoutelementparameter\c!middletext
+ \resetlayoutelementparameter\c!righttext
+ \fi\fi}
+
+\letvalue{\??layouttextcontent\c!middle:\c!text}\c!middletext
+\letvalue{\??layouttextcontent\c!left :\c!text}\c!lefttext
+\letvalue{\??layouttextcontent\c!right :\c!text}\c!righttext
+
+%D The placement of a whole line is handled by the next two
+%D macros. These are hooked into the general purpose token
+%D list registers mentioned before.
+
+\def\ignoredlinebreak{\unskip\space\ignorespaces}
+
+\def\page_layouts_place_text_line_indeed#vertical#height%
+ {\let\currentlayouttextline#vertical%
+ \ifdim#height>\zeropoint\relax % prevents pagenumbers when zero height
+ \page_layouts_place_text_line_left_or_right{#height}%
+ \fi}
+
+\def\page_layouts_place_text_line_left_or_right#height%
+ {\goleftonpage
+ \setbox\b_page_layouts_element\vbox to #height
+ {\vsize#height\relax
+ %\hsize\zeropoint % hack so that e.g. after=\hairline gives predictable results
+ \hsize\totaltextwidth
+ \normalbaselines
+ \let\\\ignoredlinebreak
+ \let\crlf\ignoredlinebreak
+ \namedlayoutelementparameter\currentlayouttextline\c!before
+ \doifbothsidesoverruled
+ \page_layouts_place_text_line_right
+ \page_layouts_place_text_line_right
+ \page_layouts_place_text_line_left
+ \namedlayoutelementparameter\currentlayouttextline\c!after
+ \kern\zeropoint}% keep the \dp, beware of \vtops, never change this!
+ \dp\b_page_layouts_element\zeropoint
+ \box\b_page_layouts_element
+ \vskip-#height\relax}
+
+\let\page_layouts_extra_at_margin_left \plusone
+\let\page_layouts_extra_at_margin_right\plustwo
+
+\let\page_layouts_place_extra_text_left \relax % historic
+\let\page_layouts_place_extra_text_right\relax % historic
+
+\def\page_layouts_place_text_line_right
+ {\hbox
+ {\ifdim\leftedgewidth>\zeropoint
+ \page_layouts_left_edge_element\c!lefttext
+ \fi
+ \ifdim\leftmarginwidth>\zeropoint
+ %\page_layouts_left_margin_element\c!lefttext\page_layouts_extra_at_margin_left
+ \page_layouts_left_margin_element\c!lefttext\page_layouts_extra_at_margin_right
+ \fi
+ \ifdim\makeupwidth>\zeropoint
+ \page_layouts_text_body_element\c!lefttext\c!middletext\c!righttext\page_layouts_extra_at_margin_left
+ \fi
+ \ifdim\rightmarginwidth>\zeropoint
+ %\page_layouts_right_margin_element\c!righttext\page_layouts_extra_at_margin_left
+ \page_layouts_right_margin_element\c!righttext\page_layouts_extra_at_margin_right
+ \fi
+ \ifdim\rightedgewidth>\zeropoint
+ %\page_layouts_right_edge_element\c!lefttext
+ \page_layouts_right_edge_element\c!righttext
+ \fi}}
+
+\def\page_layouts_place_text_line_left
+ {\hbox
+ {\ifdim\leftedgewidth>\zeropoint
+ \page_layouts_left_edge_element\c!righttext
+ \fi
+ \ifdim\leftmarginwidth>\zeropoint
+ %\page_layouts_left_margin_element\c!righttext\page_layouts_extra_at_margin_right
+ \page_layouts_left_margin_element\c!righttext\page_layouts_extra_at_margin_left
+ \fi
+ \ifdim\makeupwidth>\zeropoint
+ \page_layouts_text_body_element\c!righttext\c!middletext\c!lefttext\page_layouts_extra_at_margin_right
+ \fi
+ \ifdim\rightmarginwidth>\zeropoint
+ %\page_layouts_right_margin_element\c!lefttext\page_layouts_extra_at_margin_right
+ \page_layouts_right_margin_element\c!lefttext\page_layouts_extra_at_margin_left
+ \fi
+ \ifdim\rightedgewidth>\zeropoint
+ %\page_layouts_right_edge_element\c!righttext
+ \page_layouts_right_edge_element\c!lefttext
+ \fi}}
+
+\def\page_layouts_left_edge_element#parameter%
+ {\edef\currentlayoutelement{\currentlayouttextline:\v!edge}%
+ \page_layouts_place_element_indeed\leftedgewidth
+ {\hss\layoutelementparameter#parameter}%
+ \hskip\leftedgedistance}
+
+\def\page_layouts_left_margin_element#parameter#extrastate%
+ {\edef\currentlayoutelement{\currentlayouttextline:\v!margin}%
+ \page_layouts_place_element_indeed\leftmarginwidth
+ {\hbox to \leftmarginwidth{\hss\layoutelementparameter#parameter}%
+ \ifnum#extrastate=\page_layouts_extra_at_margin_left
+ \hskip-\leftmarginwidth
+ \hbox to \leftmarginwidth{\hss\layoutelementparameter\c!margintext}%
+ \fi}%
+ \hskip\leftmargindistance}
+
+\def\page_layouts_text_body_element#left#middle#right#extrastate%
+ {\edef\currentlayoutelement{\currentlayouttextline:\v!text}%
+ \page_layouts_place_element_indeed\makeupwidth
+ {\hbox to \makeupwidth{\ifnum#extrastate=\page_layouts_extra_at_margin_left\page_layouts_place_extra_text_left\fi\layoutelementparameter#left\hss}%
+ \hskip-\makeupwidth
+ \hbox to \makeupwidth{\hss\layoutelementparameter#middle\hss}%
+ \hskip-\makeupwidth
+ \hbox to \makeupwidth{\hss\layoutelementparameter#right\ifnum#extrastate=\page_layouts_extra_at_margin_right\page_layouts_place_extra_text_right\fi}}}
+
+\def\page_layouts_right_margin_element#parameter#extrastate%
+ {\edef\currentlayoutelement{\currentlayouttextline:\v!margin}%
+ \hskip\rightmargindistance
+ \page_layouts_place_element_indeed\rightmarginwidth
+ {\hbox to \rightmarginwidth{\layoutelementparameter#parameter\hss}%
+ \ifnum#extrastate=\page_layouts_extra_at_margin_right
+ \hskip-\rightmarginwidth
+ \hbox to \rightmarginwidth{\layoutelementparameter\c!margintext\hss}%
+ \fi}}
+
+\def\page_layouts_right_edge_element#parameter%
+ {\edef\currentlayoutelement{\currentlayouttextline:\v!edge}%
+ \hskip\rightedgedistance
+ \page_layouts_place_element_indeed\rightedgewidth
+ {\layoutelementparameter#parameter\hss}}
+
+\def\page_layouts_place_element_indeed#width#content%
+ {\vbox % to \vsize
+ {\hsize#width\relax
+ \layoutelementparameter\c!before
+ \setlayoutcomponentattribute\currentlayoutelement
+ \hbox \layoutcomponentboxattribute to #width{#content}%
+ \layoutelementparameter\c!after}}
+
+%D Although it is far better to use backgrounds for this
+%D purpose, one can add a rule in the following way. This
+%D method makes the rules disappear in case of an empty text
+%D line. Consider this a feature.
+%D
+%D \starttyping
+%D \setupheadertexts[left][right]
+%D
+%D \setupheader[text][after=\hrule,style=bold]
+%D
+%D \starttext
+%D \input tufte \page
+%D \setupheader[state=empty]
+%D \input tufte \page
+%D \stoptext
+%D \stoptyping
+
+%D This code will move to \type {page-flt.tex}.
+
+\appendtoks \placerightmarginblock \hskip-\rightmarginwidth \to \rightmargintextcontent
+\appendtoks \placeleftmarginblock \hskip-\leftmarginwidth \to \leftmargintextcontent
+
+%D \macros
+%D {definetext}
+%D
+%D Some macros ago, we implemented the \type {status} option
+%D \type {unknown}. This one is used to take care of
+%D symbolic texts handlers.
+%D
+%D \showsetup{definetext}
+%D
+%D The next example demonstrates how we can use this
+%D mechanism to provide page (event) dependent text lines.
+%D
+%D \starttyping
+%D \definetext[chapter][footer][pagenumber]
+%D \setuphead[chapter][header=high,footer=chapter]
+%D \setupheadertexts[pagenumber]
+%D \setupfootertexts[left][right]
+%D \chapter{eerste} \dorecurse{20}{\input tufte \relax}
+%D \chapter{tweede} \dorecurse{20}{\input tufte \relax}
+%D \stoptyping
+
+\unexpanded\def\definetext
+ {\doseventupleempty\page_layouts_define_text}
+
+\def\page_layouts_define_text[#tag][#vertical][#horizontal][#a][#b][#c][#d]%
+ {\ifseventhargument
+ \setvalue{\namedlayoutelementhash{#vertical:#horizontal}#tag}%
+ {\dosixtupleempty\page_layouts_setup_texts[#vertical][#horizontal][#a][#b][#c][#d]}%
+ \else\ifsixthargument
+ \setvalue{\namedlayoutelementhash{#vertical}#tag}%
+ {\dosixtupleempty\page_layouts_setup_texts[#vertical][#horizontal][#a][#b][#c]}%
+ \else\iffifthargument
+ \setvalue{\namedlayoutelementhash{#vertical:#horizontal}#tag}%
+ {\dosixtupleempty\page_layouts_setup_texts[#vertical][#horizontal][#a][#b]}%
+ \else\iffourthargument
+ \setvalue{\namedlayoutelementhash{#vertical}#tag}%
+ {\dosixtupleempty\page_layouts_setup_texts[#vertical][#horizontal][#a]}%
+ \else
+ \setvalue{\namedlayoutelementhash{#vertical}#tag}%
+ {\dosixtupleempty\page_layouts_setup_texts[#vertical][#horizontal]}%
+ \fi\fi\fi\fi}
+
+%D A few more page breakers:
+
+\installpagebreakmethod \v!empty
+ {\page_otr_flush_all_floats
+ \page_otr_command_next_page
+ \doifnot{\namedlayoutelementparameter\v!header\c!state}\v!stop{\setuplayoutelement[\v!header][\c!state=\v!empty]}%
+ \doifnot{\namedlayoutelementparameter\v!footer\c!state}\v!stop{\setuplayoutelement[\v!footer][\c!state=\v!empty]}%
+ \page_otr_insert_dummy_page}
+
+\installpagebreakmethod \v!header
+ {\doifnot{\namedlayoutelementparameter\v!header\c!state}\v!stop{\setuplayoutelement[\v!header][\c!state=\v!empty]}}
+
+\installpagebreakmethod \v!footer
+ {\doifnot{\namedlayoutelementparameter\v!footer\c!state}\v!stop{\setuplayoutelement[\v!footer][\c!state=\v!empty]}}
+
+%D While the header and footer lines are moved away from the
+%D main text, the top and bottom lines are centered.
+
+\setuplayoutelement[\v!top ][\c!state=\v!normal,\c!n=0,\c!before=\vss,\c!after=\vss,\c!strut=]
+\setuplayoutelement[\v!header][\c!state=\v!normal,\c!n=0,\c!before=, \c!after=\vss,\c!strut=\v!yes]
+\setuplayoutelement[\v!text ][\c!state=\v!normal,\c!n=0,\c!before=\vss,\c!after=\vss,\c!strut=]
+\setuplayoutelement[\v!footer][\c!state=\v!normal,\c!n=0,\c!before=\vss,\c!after=, \c!strut=\v!yes]
+\setuplayoutelement[\v!bottom][\c!state=\v!normal,\c!n=0,\c!before=\vss,\c!after=\vss,\c!strut=]
+
+%D Moved here from strc-pag:
+
+% We reset a previous location but only when it has a pagenumber
+% associated. This is a rather messy test but better than the MkII
+% way where we use states and keep settings.
+
+\let\m_page_layouts_page_number_location_ \relax
+\let\m_page_layouts_page_number_location__v\relax
+\let\m_page_layouts_page_number_location__h\relax
+\let\m_page_layouts_page_number_location__x\relax
+
+\def\page_layouts_place_page_number % also elsewhere .. beware, not \unexpanded else
+ {\placelocationpagenumber} % test below fails
+
+\def\page_layouts_reset_page_number_location
+ {\ifx\m_page_layouts_page_number_location__v\relax\else
+ \edef\currentlayoutelement{\m_page_layouts_page_number_location__v:\m_page_layouts_page_number_location__h}%
+ \edef\page_layouts_previous_page_number_locator{\detokenizedlayoutelementparameter\m_page_layouts_page_number_location__x}%
+ \doif{\meaning\page_layouts_previous_page_number_locator}{\meaning\page_layouts_place_page_number}
+ {\resetlayoutelementparameter\m_page_layouts_page_number_location__x}%
+ \fi}
+
+\def\page_layouts_set_page_number_location
+ {\edef\currentlayoutelement{\m_page_layouts_page_number_location__v:\m_page_layouts_page_number_location__h}%
+ \letlayoutelementparameter\m_page_layouts_page_number_location__x\page_layouts_place_page_number
+ \ifx\m_page_layouts_page_number_location__x\c!marginedgetext
+ \let\page_layouts_place_extra_text_left \page_layouts_place_page_number_left
+ \let\page_layouts_place_extra_text_right\page_layouts_place_page_number_right
+ \else
+ \let\page_layouts_place_extra_text_left \relax
+ \let\page_layouts_place_extra_text_right\relax
+ \fi}
+
+\def\page_layouts_identify_page_number_location
+ {\let\m_page_layouts_page_number_location__v\v!footer
+ \let\m_page_layouts_page_number_location__h\v!text
+ \let\m_page_layouts_page_number_location__x\c!middletext
+ \processallactionsinset[\@@nmlocation]
+ [ \v!header=>\let\m_page_layouts_page_number_location__v\v!header,
+ \v!footer=>\let\m_page_layouts_page_number_location__v\v!footer,
+ \v!middle=>\let\m_page_layouts_page_number_location__h\v!text
+ \let\m_page_layouts_page_number_location__x\c!middletext,
+ \v!left=>\let\m_page_layouts_page_number_location__h\v!text
+ \let\m_page_layouts_page_number_location__x\c!lefttext,
+ \v!right=>\let\m_page_layouts_page_number_location__h\v!text
+ \let\m_page_layouts_page_number_location__x\c!righttext,
+ \v!inleft=>\let\m_page_layouts_page_number_location__h\v!margin
+ \let\m_page_layouts_page_number_location__x\c!lefttext,
+ \v!inright=>\let\m_page_layouts_page_number_location__h\v!margin
+ \let\m_page_layouts_page_number_location__x\c!righttext,
+ \v!inmargin=>\let\m_page_layouts_page_number_location__h\v!margin
+ \def\m_page_layouts_page_number_location__x{\ifdoublesided\c!margintext\else\c!righttext\fi},
+ \v!margin=>\let\m_page_layouts_page_number_location__h\v!margin
+ \def\m_page_layouts_page_number_location__x{\ifdoublesided\c!margintext\else\c!righttext\fi},
+ \v!atmargin=>\let\m_page_layouts_page_number_location__h\v!text
+ \let\m_page_layouts_page_number_location__x\c!marginedgetext,
+ \v!marginedge=>\let\m_page_layouts_page_number_location__h\v!text
+ \let\m_page_layouts_page_number_location__x\c!marginedgetext]}
+
+\unexpanded\def\dosetpagenumberlocation
+ {\ifx\@@nmlocation\m_page_layouts_page_number_location_
+ % unchanged
+ \else
+ \let\m_page_layouts_page_number_location_\@@nmlocation
+ \page_layouts_reset_page_number_location
+ \ifx\@@nmlocation\empty
+ % set otherwise
+ \else
+ \page_layouts_identify_page_number_location
+ \page_layouts_set_page_number_location
+ \fi
+ \fi}
+
+\def\page_layouts_place_page_number_left % historic
+ {\begingroup
+ \setbox\scratchbox\hbox{\ignorespaces\layoutelementparameter\c!marginedgetext\removeunwantedspaces}%
+ \ifzeropt\wd\scratchbox\else
+ \doifelsenothing\@@nmwidth
+ {\box\scratchbox\tfskip}
+ {\hbox to \@@nmwidth{\box\scratchbox\hss}}%
+ \fi
+ \endgroup}
+
+\def\page_layouts_place_page_number_right % historic
+ {\begingroup
+ \setbox\scratchbox\hbox{\ignorespaces\layoutelementparameter\c!marginedgetext\removeunwantedspaces}%
+ \ifzeropt\wd\scratchbox\else
+ \doifelsenothing\@@nmwidth
+ {\tfskip\box\scratchbox}
+ {\hbox to \@@nmwidth{\hss\box\scratchbox}}%
+ \fi
+ \endgroup}
+
+\dosetpagenumberlocation
+
+% will go to page-box.mkiv
+
+% the next macros will be redone (less boxing)
+
+\newbox\b_page_layouts_element
+
+\def\page_layouts_insert_elements
+ {\ifcase\pageornamentstate
+ \page_layouts_place_elements_indeed
+ \fi}
+
+\def\page_layouts_place_elements_indeed
+ {\setbox\b_page_layouts_element\vbox
+ {\dontcomplain
+ \calculatereducedvsizes
+ \swapmargins
+ \offinterlineskip
+ \vskip\dimexpr-\topheight-\topdistance\relax
+ \the\toptextcontent
+ \vskip\dimexpr\topheight+\topdistance\relax
+ \the\headertextcontent
+ \vskip\dimexpr\headerheight+\headerdistance\relax
+ \anch_positions_place_anchors
+ \vskip-\textheight
+ \the\texttextcontent
+ \vskip\textheight
+ \the\everyendoftextbody
+ \vskip\footerdistance
+ \the\footertextcontent
+ \vskip\dimexpr\footerheight+\bottomdistance\relax
+ \the\bottomtextcontent
+ \vskip\bottomheight
+ \vfilll}%
+ \smashbox\b_page_layouts_element
+ \box\b_page_layouts_element}
+
+\def\page_insert_body#1#2%
+ {\setbox\b_page_layouts_element\vbox
+ {\offinterlineskip
+ \calculatereducedvsizes
+ \calculatehsizes
+ \swapmargins
+ \vskip\dimexpr\headerheight+\headerdistance+\layoutparameter\c!textdistance\relax
+ \dontleavehmode
+ \hbox to \makeupwidth
+ {\begingroup
+ \swapmargins
+ \goleftonpage
+ \ifdim\leftedgewidth>\zeropoint
+ \the\leftedgetextcontent
+ \kern\dimexpr\leftedgewidth+\leftedgedistance\relax
+ \fi
+ \ifdim\leftmarginwidth>\zeropoint
+ \the\leftmargintextcontent
+ \kern\dimexpr\leftmarginwidth+\leftmargindistance\relax
+ \fi
+ \endgroup
+ \mkprocesspagecontents{#2}%
+ \settextpagecontent\b_page_layouts_element{#1}{#2}%
+ \page_backgrounds_add_to_text\b_page_layouts_element
+ \page_grids_add_to_box\b_page_layouts_element
+ \box\b_page_layouts_element
+ \begingroup
+ \ifdim\rightmarginwidth>\zeropoint
+ \kern\rightmargindistance
+ \the\rightmargintextcontent
+ \kern\rightmarginwidth
+ \fi
+ \ifdim\rightedgewidth>\zeropoint
+ \kern\rightedgedistance
+ \the\rightedgetextcontent
+ \kern\rightedgewidth
+ \fi
+ \endgroup
+ \hss}}%
+ \smashbox\b_page_layouts_element
+ \box\b_page_layouts_element}
+
+%D The main text area has to be combined with some additional
+%D (tracing) information.
+
+% will be stored as normal and overloaded in page-lyr and later in
+% page-spr we overload the the stored version .. evenatually i will
+% clear up the experimental mess
+
+\def\settextpagecontent#1#2#3% #2 and #3 will disappear
+ {\setbox#1\hbox to \makeupwidth
+ {\hss % so don't change this
+ \setlayoutcomponentattribute{\v!page:\v!text}%
+ \vbox \layoutcomponentboxattribute to \textheight
+ {\offinterlineskip
+ \freezetextwidth
+ \hsize\textwidth % local variant of \sethsize <<< in columns?
+ \boxmaxdepth\maxdepth
+ \noindent % content can be < \hsize
+ \dopagecontents#2#3}%
+ \hss}%
+ \dp#1\zeropoint}
+
+\protect \endinput
+