beta 2014.02.14 17:07
[context.git] / tex / context / base / page-col.mkiv
blob14b5124210f9ab95e31fa91a439907d9d5107e0c
1 %D \module
2 %D   [       file=page-col,   % moved from page-ini
3 %D        version=2011.12.07, % 2000.10.20,
4 %D          title=\CONTEXT\ Page Macros,
5 %D       subtitle=Column Helpers,
6 %D         author=Hans Hagen,
7 %D           date=\currentdate,
8 %D      copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
9 %C
10 %C This module is part of the \CONTEXT\ macro||package and is
11 %C therefore copyrighted by \PRAGMA. See mreadme.pdf for
12 %C details.
14 \writestatus{loading}{ConTeXt Page Macros / Column Helpers}
16 %D Here we implement a couple of helpers for dealing with columns. For
17 %D the moment we keep the names. When the mul and set modules are redone
18 %D these can be adapted or disappear.
20 \unprotect
22 %D We reserve a counter for the number of columns as well as the current
23 %D column. Both are not to be changed by users!
25 \newcount\nofcolumns \nofcolumns\plusone
26 \newcount\mofcolumns \mofcolumns\plusone
28 \newconstant\columndirection % 0:lr 1:rl
30 \setnewconstant\maxnofcolumns       50
31 \setnewconstant\allocatednofcolumns  0
33 %D During initialization the temporary boxes are allocated. This enables us to
34 %D use as much columns as we want, without exhausting the pool of boxes too
35 %D fast. We could have packed them in one box, but we've got enough boxes.
37 %D Two sets of boxes are declared, the txtboxes are used for the text, the
38 %D topboxes are for moved column floats.
40 \installcorenamespace{columntext}
41 \installcorenamespace{columnfooter}
42 \installcorenamespace{columntop}
43 \installcorenamespace{columnbottom}
45 \unexpanded\def\initializecolumns#1%
46   {\ifnum#1>\maxnofcolumns
47      \showmessage\m!columns1\maxnofcolumns
48      \nofcolumns\maxnofcolumns
49    \else
50      \nofcolumns#1\relax
51    \fi
52    \ifnum\nofcolumns>\allocatednofcolumns
53      \page_columns_allocate
54    \fi}
56 \def\page_columns_allocate
57   {\dorecurse\nofcolumns
58      {\ifnum\recurselevel>\allocatednofcolumns\relax
59         \ifcsname\??columntext\recurselevel\endcsname \else
60           \expandafter\newbox\csname\??columntext  \recurselevel\endcsname % text
61           \expandafter\newbox\csname\??columnfooter\recurselevel\endcsname % footer
62           \expandafter\newbox\csname\??columntop   \recurselevel\endcsname % top insert
63           \expandafter\newbox\csname\??columnbottom\recurselevel\endcsname % bottom insert
64         \fi
65       \fi}%
66    \global\allocatednofcolumns\nofcolumns}
68 \def\currentcolumn       {1}
70 \def\firstcolumnbox      {\columntextbox\plusone}
71 \def\currentcolumnbox    {\columntextbox\mofcolumns}
72 \def\lastcolumnbox       {\columntextbox\nofcolumns}
74 \def\firsttopcolumnbox   {\columntopbox \plusone}
75 \def\currenttopcolumnbox {\columntopbox \mofcolumns}
76 \def\lasttopcolumnbox    {\columntopbox \nofcolumns}
78 \def\columntextbox     #1{\csname\??columntext  \number#1\endcsname}
79 \def\columnfootbox     #1{\csname\??columnfooter\number#1\endcsname}
80 \def\columntopbox      #1{\csname\??columntop   \number#1\endcsname}
81 \def\columnbotbox      #1{\csname\??columnbottom\number#1\endcsname}
83 \unexpanded\def\columnsettextbox    {\global\setbox\columntextbox}
84 \unexpanded\def\columnsetfootbox    {\global\setbox\columnfootbox}
85 \unexpanded\def\columnsettopbox     {\global\setbox\columntopbox}
86 \unexpanded\def\columnsetbotbox     {\global\setbox\columnbotbox}
88 \unexpanded\def\columngettextbox    {\copy\columntextbox}
89 \unexpanded\def\columngetfootbox    {\copy\columnfootbox}
90 \unexpanded\def\columngettopbox     {\copy\columntopbox}
91 \unexpanded\def\columngetbotbox     {\copy\columnbotbox}
93 \unexpanded\def\columnerasetextboxes{\dorecurse\allocatednofcolumns{\columnsettextbox\recurselevel\emptybox}}
94 \unexpanded\def\columnerasefootboxes{\dorecurse\allocatednofcolumns{\columnsetfootbox\recurselevel\emptybox}}
95 \unexpanded\def\columnerasetopboxes {\dorecurse\allocatednofcolumns{\columnsettopbox \recurselevel\emptybox}}
96 \unexpanded\def\columnerasebotboxes {\dorecurse\allocatednofcolumns{\columnsetbotbox \recurselevel\emptybox}}
98 %D Without going in details we present two macro's which handle the columns. The
99 %D action which is transfered by the the first and only parameter can do something
100 %D with \type {\currentcolumnbox}. In case of the mid columns, \type
101 %D {\firstcolumnbox} and \type {\lastcolumnbox} are handled outside these macro's.
103 % \unexpanded\def\dohandlecolumn#1%
104 %   {\mofcolumns\recurselevel
105 %    \let\currentcolumn\recurselevel
106 %    #1\relax}
108 % \unexpanded\def\dohandleallcolumns#1%
109 %   {\dorecurse\nofcolumns{\dohandlecolumn{#1}}}
111 % \unexpanded\def\dohandlerevcolumns#1%
112 %   {\dostepwiserecurse\nofcolumns\plusone\minusone{\dohandlecolumn{#1}}}
114 % \unexpanded\def\dohandlemidcolumns#1%
115 %   {\dohandleallcolumns
116 %      {\ifnum\recurselevel>\plusone
117 %         \ifnum\recurselevel<\nofcolumns
118 %           \dohandlecolumn{#1}%
119 %         \fi
120 %       \fi}}
122 % As we don't nest we can use a fast variant:
124 \unexpanded\def\dohandleallcolumnscs#1{\let\page_columns_action  #1\page_columns_all_indeed}
125 \unexpanded\def\dohandleallcolumns  #1{\def\page_columns_action{#1}\page_columns_all_indeed}
127 \unexpanded\def\dohandlerevcolumnscs#1{\let\page_columns_action  #1\page_columns_rev_indeed}
128 \unexpanded\def\dohandlerevcolumns  #1{\def\page_columns_action{#1}\page_columns_rev_indeed}
130 \unexpanded\def\dohandlemidcolumnscs#1{\let\page_columns_action  #1\page_columns_mid_indeed}
131 \unexpanded\def\dohandlemidcolumns  #1{\def\page_columns_action{#1}\page_columns_mid_indeed}
133 \unexpanded\def\page_columns_all_indeed
134   {\mofcolumns\plusone
135    \edef\currentcolumn{\the\mofcolumns}%
136    \page_columns_action\relax
137    \ifnum\mofcolumns<\nofcolumns
138      \expandafter\page_columns_all_next
139    \fi}
141 \unexpanded\def\page_columns_all_next
142   {\advance\mofcolumns\plusone
143    \edef\currentcolumn{\the\mofcolumns}%
144    \page_columns_action\relax
145    \ifnum\mofcolumns<\nofcolumns
146      \expandafter\page_columns_all_next
147    \fi}
149 \unexpanded\def\page_columns_rev_indeed
150   {\mofcolumns\nofcolumns
151    \edef\currentcolumn{\the\mofcolumns}%
152    \page_columns_action\relax
153    \ifnum\mofcolumns>\plusone
154      \expandafter\page_columns_rev_prev
155    \fi}
157 \unexpanded\def\page_columns_rev_prev
158   {\advance\mofcolumns\minusone
159    \edef\currentcolumn{\the\mofcolumns}%
160    \page_columns_action\relax
161    \ifnum\mofcolumns>\plusone
162      \expandafter\page_columns_rev_prev
163    \fi}
165 \unexpanded\def\page_columns_mid_indeed
166   {\mofcolumns\plustwo
167    \ifnum\mofcolumns<\nofcolumns
168      \expandafter\page_columns_mid_next
169    \fi}
171 \unexpanded\def\page_columns_mid_next
172   {\edef\currentcolumn{\the\mofcolumns}%
173    \page_columns_action\relax
174    \advance\mofcolumns\plusone
175    \ifnum\mofcolumns<\nofcolumns
176      \expandafter\page_columns_mid_next
177    \fi}
179 \protect \endinput