% \section{Overview} % \label{sec:imp-ovv} % % \subsection{Column-Pages} % \label{sec:imp-ovv-colpage} % % In our parallel multi-column typesetting, a column may grow independently % of other columns and may cross its page boundary asynchronously with % others. Therefore, we cannot throw away the contents of a column in a % page, or a {\em\Uidx\colpage} in short, when a page break occurs in the % column. Instead, we have to keep \colpage{}s until all columns are % {\em\Uidx\sync{}ed} implicitly or explicitly. % % An {\em\Uidx\imsync} takes place when all columns in a page see % page-breaks to let the page is shipped out. In general, all columns but % the last one which arrives the page-break have completed \colpage{}s in the % page in question and some of them may have succeeding \colpage{}s. % Therefore, we maintain the list of completed \colpage{}s % $\Uidx\S_c=|\pcol@shipped|{\cdot}c$ %  % \SpecialArrayMainIndex{c}{\pcol@shipped} %  % for each column $c\In0\C$, where $\Uidx\C=\!\pcol@ncol!$ is the number of % columns given through the argument of \env{paracol} environment, and the % set of them $\Uidx\SS=\Set{\S_c}{c\In0\C}$. % % Each element $\Uidx\s_c(p)$ of a list $\S_c$ is an \!\insert! whose % \!\vbox! contains the % $p$-th completed \colpage\footnote{ %  % Other registers such as \cs{count} are not used.}, %  % where $p=0$ for the first \colpage{} produced in \env{paracol} % environment or that following a page flushing macro \!\flushpage!, % \!\clearpage! or \!\cleardoublepage!. That is, $\S_c$ is defined as % follows, where $\Uidx\pbase=\!\pcol@basepage!$ is the zero-origin ordinal % of the {\em\Uidx\bpage} being the oldest page not shipped out yet. %  % \begin{eqnarray*} % \S_c&=&(\s_c(\pbase),\s_c(\pbase{+}1),\ldots,\s_c(\pbase{+}k{-}1))\\ % &=&\!\@elt!\,\s_c(\pbase)\;\!\@elt!\,\s_c(\pbase{+}1)\;\cdots\; % \!\@elt!\,\s_c(\pbase{+}k{-}1) % \end{eqnarray*} %  % Note that a list $\S_c$ can be empty and all members in $\SS$ may be empty. % % The other type of \sync{}ation, {\em\Uidx\exsync}, takes place by % \!\switchcolumn!|*| or the beginning of starred \csenv{}s, by % \Endparacol, or by one of page flushing macros \!\flushpage!, % \!\clearpage! and \!\cleardoublepage!. A flushing \exsync{} ships out the % pages from $\pbase$ to $\Uidx\ptop=\!\pcol@toppage!$ being the ordinal of % the {\em\Uidx\tpage} to which the most advanced {\em\Uidx\lcolumn} has % reached. On the other hand, other non-flushing \exsync{} keeps the page % $\ptop$ from being shipped out because the \colpage{}s in it or the page % itself will grow further. % % % % \subsection{Current Column-Pages and Their Contexts} % \label{sec:imp-ovv-ccol} % \changes{v1.3-4}{2013/09/17} % {Remove $\mu$ for \cs{@mparbottom} from column-context because it is % now in page context.} % % We also have to maintain another type of \colpage{}s which are currently % built, or {\em\Uidx\ccolpage{}s} in short, to switch from a column to % another. Since each column may have its own {\em context} for the % typesetting of it, or {\em\Uidx\cctext} in short, it were perfect to save % the context when we leave from a % column and to restore that when we revisit the column if we could. % However, \TeX{} and \LaTeX{} has a tremendously large number of context % variables and the number becomes virtually boundless when we take variables % defined in various styles and by users themselves into account. % Therefore, we had to abandon to keep the whole context of the column but % carefully chose a small subset comprising variables automatically modified % outside of users' control. That is, the \cctext{} % $\Uidx\cc_c=|\pcol@col|{\cdot}c$ %  % \SpecialArrayMainIndex{c}{\pcol@col} %  % of a column $c$ consists of the following elements, each of which named % $e$ is referred to as $\cc_c(e)$ hereafter. %  % \begin{itemize} % \item $\Uidx\vb$ % represents $\!\insert!{\cdot}\vb$ containing the followings. %  % \begin{itemize} % \item % $\vb^b=\!\box!{\cdot}\vb=\!\@holdpg!$ is the \!\vbox! containing the main % vertical list which has already contributed to the \ccolpage{}. % % \item % $\vb^p=\!\count!{\cdot}\vb=\!\pcol@page!$ means the \ccolpage{} belongs to % the page $\vb^p$. % % \item % $\vb^r=\!\dimen!{\cdot}\vb=\!\@colroom!$ is the room of the column. % \end{itemize} % % \item $\Uidx\ft=\Midx{\!\pcol@currfoot!}$ % is the \!\insert! containing the footnotes added in the \ccolpage, if % \Mcfnote{} typesetting is in effect. Its constituent \!\box!, \!\count!, % \!\dimen! and \!\skip! are denoted as $\ft^b$, $\ft^c$, $\ft^d$ and % $\ft^s$ respectively. On the other hand, if \Scfnote{} typesetting is in % effect, $\ft$ is always empty\footnote{ %  % But the macro \cs{pcol@currfoot} is used to keep \Scfnote{}s temporarily.}. % % \item $\Uidx\pd=\!\pcol@prevdepth!$ % is the depth of the last vertical item in $\vb^b$ obtained by % \!\prevdepth!. % % \item $\Uidx\tl=\!\@toplist!$ % is the list of top floats inserted in the \ccolpage. % % \item $\Uidx\ml=\!\@midlist!$ % is the list of mid floats inserted in the \ccolpage. % % \item $\Uidx\bl=\!\@botlist!$ % is the list of bottom floats inserted in the \ccolpage. % % \item $\Uidx\dl=\!\@deferlist!$ % is the list of \cwise{} floats deferred to the next \colpage. % % \item $\Uidx\tf=\!\pcol@textfloatsep!$ % is the vertical skip used instead of \!\textfloatsep! for top floats in the % \ccolpage{} if it has \sync{}ation points, or $\infty$ otherwise. % % \item $\Uidx\fh=\!\@textfloatsheight!$ % is the total height of mid floats and their separators in the \ccolpage. % % \item $\Uidx\tn=\!\@topnum!$ % is the maximum number of top floats which the \ccolpage{} can accommodate % further. % % \item $\Uidx\tr=\!\@toproom!$ % is the room for top floats in the \ccolpage. % % \item $\Uidx\bn=\!\@botnum!$ % is the maximum number of bottom floats which the \ccolpage{} can accommodate % further. % % \item $\Uidx\br=\!\@botroom!$ % is the room for bottom floats in the \ccolpage. % % \item $\Uidx\cn=\!\@colnum!$ % is the maximum total number of floats which the \ccolpage{} can accommodate % further. % % \item $\Uidx\sw$ % is the following encoding of \CSIndex{if@nobreak} and % \CSIndex{if@afterindent} at the time we left from the column $c$. % $$ % \sw=\cases{0&$\CSIndex{if@nobreak}=\false$\cr % 1&$\CSIndex{if@nobreak}=\true\;\land\; % \CSIndex{if@afterindent}=\true$\cr % 2&$\CSIndex{if@nobreak}=\true\;\land\; % \CSIndex{if@afterindent}=\false$} % $$ % Note that we have only three states because \CSIndex{if@afterindent} is % meaningful only when $\CSIndex{if@nobreak}=\true$\footnote{ %  % If only with the standard \LaTeX{} and so far.}. % % \item $\Uidx\ep=\!\everypar!$ % is the tokens stored in \!\everypar! at the time we left from the column % $c$. % \end{itemize} %  % \changes{v1.1}{2012/05/11} % {Add description of $w_c\EQ\cs{pcol@columnwidth}{\cdot}c$.} %  % In addition, we have special context variables % $\Uidx\w_c=|\pcol@columnwidth|{\cdot}c$ %  % \SpecialArrayMainIndex{c}{\pcol@columnwidth} %  % in which we keep \!\columnwidth! for the column $c$. % % Note that we could add other variables to the saved context and/or provide % some API macro to define them by users, but abandon them because it should % be too complicated for users\footnote{ %  % And for the author if we include save/restore of macros, though it could % be done with a \cs{toks} containing the \cs{def}initions of macros.}. %  % Also note that we provide a save/restore mechanism for \lcounter{}s as % discussed in \secref{sec:imp-ovv-counter}. % % % % \subsection{Pages and Their Contexts} % \label{sec:imp-ovv-page} % \changes{v1.2-2}{2013/05/11} % {Redesign page context and its implementation.} % \changes{v1.3-3}{2013/09/17} % {Add $\pi^s(p)$ to the page context of $p$ for column-separating % rule drawing and background painting.} % \changes{v1.3-4}{2013/09/17} % {Add $\pi^m(p)$ to the page context of $p$ for marginal note % placement.} % % Besides the \colpage{}s, we have to keep track each whole page not yet % shipped out but has some complete or incomplete (i.e., current) \colpage{}s. % We maintain the list; %  % \SpecialMainIndex{\pcol@pages} %  % \begin{eqnarray*} % \Uidx\PP % &=&\!\pcol@pages!=(\Uidx\pp(\pbase),\pp(\pbase{+}1),\ldots\pp(\ptop{-}1))\\ % &=&\!\@elt!\,\pp(\pbase)\;\!\@elt!\,\pp(\pbase{+}1)\;\cdots\; % \!\@elt!\,\pp(\ptop{-}1)\\ % \pp(p)&=&|{|\pp^p(p)|}|\pp^i(p)\pp^f(p)|{|\pp^s(p)|}||{|\pp^m(p)|}| % \end{eqnarray*} %  % where $\pp(p)$ is the {\em\Uidx\pctext} of $p$ and its elements $\pp^p(p)$, % $\pp^i(p)$, $\pp^f(p)$, $\pp^s(p)$ and $\pp^m(p)$ have the followings. %  % \begin{itemize} % \item % $\pp^p(p)=\Uidx\page(p)$ is the value of the counter \counter{page} % (i.e. \!\c@page!) for the page $p$. % % \item % Iff $\pp^i(p)\neq\bot$, the page $p$ has \pwise{} floats or the % single-column {\em\Uidx\preenv} preceding \beginparacol{} in the % {\em\Uidx\spage} where it resides and spanning all columns. In this case % $\pp^i(p)=i$ represents $\!\insert!{\cdot}i$, often {\em cached} % in the macro \!\pcol@spanning!, for such {\em\Uidx\spanning} % whose registers have the followings. %  % \begin{itemize} % \item % $\pp^b(p)=\!\box!{\cdot}i$ contains the \spanning. % % \item % $\pp^h(p)=\!\dimen!{\cdot}i=\!\@colht!$ if positive for the height of % columns shrunk by the \spanning. If negative, the page is only for % the \spanning, i.e. a {\em\Uidx\fpage}. We use the notation $\pp^h(p)$ % for the pages $\pp^i(p)=\bot$ to mean \!\textheight!. % % \item % $\pp^t(p)=\!\skip!{\cdot}i=\!\pcol@topskip!$ being the value of % \!\topskip! at \beginparacol{} to be inserted at the top of each column in % each non-first page. Otherwise, i.e., for the columns in the \spage{} % following the \preenv{}, it has 0 to prevent the \!\topskip! insertion. % We use the notation $\pp^t(p)$ for the pages $\pp^i(p)=\bot$ to % mean \!\pcol@topskip!. % \end{itemize} % % \item % Iff $\pp^f(p)\neq\bot$, \Scfnote{} typesetting, discussed in % \secref{sec:imp-ovv-scfnote}, is in effect and the page $p$ has some % footnotes in $\!\box!\cdot\pp^f(p)$. This element is often {\em cached} % in the macro \Midx{\!\pcol@footins!}. %  % \SpecialMainIndex{\pcol@pages} % % \item % $\pp^s(p)=(\Uidx\spt(H_1,h_1),\ldots,\spt(H_n,h_n))= % \!\@elt!\Arg{H_1,h_1}\ldots\!\@elt!\Arg{H_n,h_n}$ is the list of \mctext{}s % in the page $p$, where $i$-th one's top edge is at $H_i$ from the top of % the page (excluding \spanning) and its height-plus-depth is $h_i$, where % $H_i$ and $h_i$ are represented in the form of integers. Therefore, it is % emptied by \!\pcol@startpage!, and then the elements are added by % \!\pcol@makecol! (only for the last one) and \!\pcol@output@switch! % whenever they find a \mctext{} completes. The element is often {\em % cached} in the macro \!\pcol@sptextlist! and is referred to by % \!\pcol@buildcolseprule! to draw \cseprule{} and to paint columns and % \csepgap{} leaving spaces for \mctext{}s. The usage of this element is % discussed in \secref{sec:imp-ovv-cswap} a little bit more detailedly. % % \item % $\pp^m(p)=\Arg{\Uidx\mpb_L^l}\Arg{\mpb_L^r}\Arg{\mpb_R^l}\Arg{\mpb_R^r}$ % is the set of lists of marginal notes in the left ($l$) and right % ($r$) margins and in the left ($L$) and right ($R$) \parapag{}es. The % words left and right of margins mean physical left and right, while left % and right of \parapag{}es mean the logical ones, i.e., the page where the % column-0 resides is left. Each element $\mpb_{\{L,R\}}^{\{l,r\}}$ has a % list $(\Uidx\mpar(t_1,b_1),\ldots,\mpar(t_n,b_n))= % \!\@elt!\Arg{t_1}\Arg{b_1}\ldots\!\@elt!\Arg{t_n}\Arg{b_n}$ of marginal % notes whose top and bottom are at $t_i$ and $b_i$ from the top of the % column area, where $t_i$ and $b_i$ are represented in the form of % integers. Each element can be empty of course, and $\pp^m(p)$ itself can % be so as well to mean all elements are empty\footnote{ %  % To minimize the possibility of miscoding for emptying and save a small % amount of memory for pages having no marginal notes.}. %  % Therefore, $\pp^m(p)$ is emptied by % \!\pcol@startpage!, and then examined and modified by % \!\pcol@addmarginpar! when it adds a marginal note through macros % \!\pcol@getmparbottom! and \!\pcol@setmpbelt!. Another modifier % \!\pcol@output@start! initializes one of the element $\mpb_L^{\{l,r\}}$ % with the value representing the last marginal note in \preenv{}, while % another examiner \!\pcol@output@end! lets the outside \!\@mparbottom! have % a value based on $b_n$ of one of the element, according to \LaTeX's % setting of marginal note placement. The whole element $\pp^m(p)$ is often % {\em cached} in the macro \!\pcol@mparbottom!. The usage of this % element is discussed in \secref{sec:imp-ovv-cswap} a little bit more % detailedly. % \end{itemize} %  % Note that even in \parapag{}ing and in \npaired{} one in particular, % a page $p$ consists of all columns $c\In0\C$. Therefore, the term {\em % left\slash right \parapag{}e} $p$ always mean the left and right component % of a \parapag{}e (pair) $p$. % % The reason why we keep track of $\page(p)$ is that page numbering is not % necessary to be consecutive. If such a {\em jump} occurs randomly in any % columns explicitly updating \counter{page}, it is very tough to give a % consistent view of the page number of a specific page to all columns. % Therefore we suppose jumps occur only in the leftmost column 0\footnote{ %  % But we neither inhibit nor nullify a jump in non-leftmost column and thus % the update can be seen referring to \texttt{page} counter explicitly.} %  % which controls the page numbering, while non-leftmost columns are expected % to refer the \counter{page} passively. % % This page numbering is implemented as follows. Each time a \colpage{} at % $p$ of the leftmost column is completed to start a new \colpage{}, % $\page(p)$ is fixed to be the value of \counter{page} and % $\page(q)=\pp^p(q)$ for all $q\in[p,\ptop]$ are let be $\page(p)+(q-p)$ in % usual cases but $\page(p)+2(q-p)$ in \npaired{} \parapag{}ing. % This update also takes place on \cswitch{} from the leftmost \colpage{} at % $p$ to another column so that a jump happening before the switching is % notified to other columns. On the other hand, starting or \cswitch{} to a % non-leftmost \colpage{} at $p$ lets \counter{page} have $\page(p)$ % referring to $\pp(p)$, unless the column starts the most advanced \tpage. % In this new \tpage{} case, $\pp(\ptop{+}1)$ is added to $\PP$ with the % temporary setting $\pp^p(\ptop+1)=\page(\ptop+1)=\page(\ptop)+1$ usually but % $\pp^p(\ptop+1)=\page(\ptop+1)=\page(\ptop)+2$ in \npaired{} % \parapag{}ing, and $\ptop$ is incremented. % % Note that this management is imperfect because direct references of % \counter{page} in non-leftmost columns can give inconsistent results if % \counter{page} is modified in a non-leftmost column or the reference occurs % in a page $p$ after that the leftmost column modifies \counter{page} in a % page $q$ such that $q\leq p$. In addition to them, this mechanism in % \npaired{} \parapag{}ing always gives incorrect page number to the % columns in a right \parapag{}e because $\pp^p(p)$ always has $\page(p)$ % for the left \parapag{}e. However, it is expected that the progress of % the leftmost column usually precedes other columns to give consistent % \counter{page} reference even with jumps, unless the reference is made by % a column in a right \npaired{} \parapag{}e. More importantly, it is % assured that indirect references through |.aux| records and page numbers % recorded in |.toc|, |.idx|, and so on are always consistent because of the % lazy evaluation of $\counter{page}=\page(p)$ at ship-out of an ordinary % page $p$ or a left \parapag{}e $p$, while the counter is let have % $\page(p)+1$ when a right \npaired{} \parapag{}e $p$ is shipped out. % % Also note that we also keep $\pp(\ptop)$ in \Midx{\!\pcol@currpage!} % which is initialized by \!\pcol@output@start! to let $\pp^i(\ptop)$ have % the \preenv. Then the macro is redefined to have the value representing % the new page possibly with $\pp^i(\ptop)$ for \pwise{} floats in % \!\pcol@startpage! by the macro \!\pcol@defcurrpage!. Another % \!\def!inition is done in \!\pcol@output@switch! also with % \!\pcol@defcurrpage! to let $\pp^f(\ptop)$ have \Scfnote{}s built in % \!\footins! if \scfnote{} typesetting is in effect and the \cswitch{} % leaves the column in $\ptop$\footnote{ %  % The \!\def!inition of \!\pcol@currpage! in \!\pcol@setpnoelt!, and % emptying it in \!\pcol@output@start! and \!\pcol@freshpage! are for coding % trick and thus not for giving a really new \!\def!initions.}. %  % We denote the concatenation of $\PP$ and $\pp(\ptop)$ as $\Uidx\PPP$ to % represent all pages {\em on-the-fly}. % % % % \subsection{Counters} % \label{sec:imp-ovv-counter} % % Besides the context variables discussed in \secref{sec:imp-ovv-ccol}, we % need to make counters local to each column except for those declared to be % global by \!\globalcounter!. Let $\Uidx\CC$ be the set (list) of all % counters declared before \beginparacol, i.e., $\CC=\!\cl@@ckpt!$, and % $$ % \Uidx\CG=\!\pcol@gcounters!=\{\Uidx\cg_1,\ldots\}=\!\@elt!|{|\cg_1|}|\cdots % $$ % be the set of {\em\Uidx\gcounter{}s} which have declared so by % \!\globalcounter!|{|$\cg_i$|}|. Then the set of {\em\Uidx\lcounter{}s} % $\Uidx\CTL$ is defined as follows. %  % \SpecialMainIndex{\pcol@counters} % $$ % \CTL=\CC-\CG=\!\pcol@counters!=\{\Uidx\cl_1,\ldots\}=\!\@elt!|{|\cl_1|}|\cdots % $$ % % Since each column has its own values in \lcounter{}s, we have to keep the % set of counter\slash value pairs %  % \SpecialArrayMainIndex{c}{\pcol@counters} % $$ % \Uidx\Cc_c=\!\pcol@counters!{\cdot}c=\{\<\cl_1,\val_c(\cl_1)\>,\ldots\} % =\!\@elt!|{|\cl_1|}||{|\val_c(\cl_1)|}|\cdots % $$ % for each column $c$, where $\Uidx\val_c(\cl_i)$ is the value of a counter % $\cl_i$ local to $c$. That is, whenever we switch from a column $c$ to % $d$, we save $\<\cl_i,\val_c(\cl_i)\>$ in $\Cc_c$ and restore $\cl_i$ for % $d$ by letting it have $\val_d(\cl_i)$ in $\Cc_d$, for all $\cl_i\in\CTL$. % % A \gcounter{} is free from these save\slash restore operations but needs % another special operation when it is incremented by \!\stepcounter!. That % is, the invocation of \!\stepcounter! for a \gcounter{} $\cg_i$ may clear % \lcounter{}s in its set of descendant counters % $\Uidx\clist(\cg_i)=|\pcol@cl@|{\cdot}\cg_i$ %  % \SpecialArrayMainIndex{\theta}{\pcol@cl@} %  % and this clearing must be performed on the all instances of % $\cl_j\in\clist(\cg_i)$ saved in $\Cc_c$ for all $c\In0\C$. Therefore, on % the \!\stepcounter!, we do the followings for all $c\In0\C$; temporarily % restore all $\cl_k\in\CTL$ from $\Cc_c$; clear all $\cl_j\in\clist(\cg_i)$; % and then save $\<\cl_k,\val_c(\cl_k)\>$ back to $\Cc_c$. % % The other item we maintain for a \lcounter{} $\cl$ is its {\em\Uidx\lrep} % $\arg{rep}$ in a column $c$ defined by % $\!\definethecounter!\<\cl\>\\arg{rep}$. The \lrep{} $\arg{rep}$ is % kept in $|\pcol@thectr@|{\cdot}\cl{\cdot}c$ and is made \!\let!-equal to % $|\the|{\cdot}\cl$ when the column $c$ is visited. %  % \SpecialArrayMainIndex{\theta{\cdot}c}{\pcol@thectr@} % \SpecialArrayIndex{\theta}{\the} % % % % \subsection{Page-Wise and Merged Footnotes} % \label{sec:imp-ovv-scfnote} % \changes{v1.2-2}{2013/05/11} % {Add the subsection ``Single-Columned and Merged Footnotes''.} % \changes{v1.3-6}{2013/09/17} % {Change the title from ``Single-Columned and Merged Footnotes'' to % ``Page-Wise and Merged Footnotes'' according to the new naming.} % % \Uidx{\Index{page-wise footnote}}{\em Page-wise footnote} % typesetting is completely different from ordinary {\em\Mcfnote} % typesetting. % % When a \colpage{} in the \tpage{} is built, \!\footins! keeps all footnotes % \!\insert!ed by \!\footnote! or \!\footnotetext! in {\em any} columns in % the page. Therefore, \!\footnote! and \!\footnotetext! in the \tpage{} % act as usual to add the footnote to \!\footins!. Then if a \cswitch{} % takes place to leave the column, \!\footins! is saved into $\pp^f(\ptop)$ % by \!\pcol@output@switch!, so that $\pp^f(\ptop)$ is \!\insert!ed to % \!\footins! again by \!\pcol@restartcolumn! when it visits a column in % $\ptop$, or by \!\pcol@startcolumn! when it finds a column proceeds to % $\ptop$. % % Then, when a \colpage{} in the \tpage{} completes advancing $\ptop$, % \!\footins! is kept in $\pp^f(\ptop{-}1)$ by \!\pcol@startpage!, rather % than being combined with the \colpage{}. This saving into % $\pp^f(\ptop{-}1)$ {\em fixes} the footnotes in $\ptop{-}1$ so that % $\pp^f(\ptop{-}1)$ is combined with other materials in the page by % \!\pcol@outputelt! or \!\pcol@makeflushedpage! through \!\pcol@putfootins! % when the page is shipped out. % % Fixing $\pp^f(p)$ for $p<\ptop$ makes it impossible to add footnotes in a % column in the page $p$ not only to $\pp^f(p)$ but also to \!\footins! % for the page $p$ because we have at least one fixed \colpage{} $\s_c(p)$ % unable to shrink to have such additional footnotes in $p$\footnote{ %  % The \colpage{} $\s_c(p)$ could have some space at its bottom produced by, % for example, \cs{newpage}, but exploitation of such space is extremely % hard.}. %  % Therefore, such a footnote addition is {\em deferred} and is thrown into % $\pp^f(\ptop)$ through a list; % $$ % \Uidx\df=\!\pcol@topfnotes!= % (f_1,f_2,\ldots,f_n)=\!\vbox!|{|f_1\;f_2\;\cdots\;f_n|}| % $$ % where $f_i$ is a \!\vbox! containing the deferred footnote preceded by % \!\penalty!\!\interlinepenalty! to allow \TeX{} to break footnotes to place % them in two (or more) pages. That is, \!\footnote! or \!\footnotetext! in % $p<\ptop$ adds an element for the footnote to $\df$, then all the elements %  % \footnote{More accurately, some trailing elements may be left in $\df$ if % its total height is too large, as discussed in % \secref{sec:imp-sout-scfnote}.} %  % are \!\insert!ed to \!\footins! by \!\pcol@deferredfootins! invoked in % \!\pcol@restartcolumn! when it visits a column in $\ptop$, or in % \!\pcol@startcolumn! when it starts a \colpage{} in $\ptop$. The macro % \!\pcol@output@end! also do the \!\insert!ion by itself with \Mgfnote{} % typesetting to let deferred footnotes be a part of \postenv. % % The reference to $\pp^f(p)$ for $p<\ptop$ is also made in % \!\pcol@restartcolumn! and \!\pcol@flushcolumn!. The former \!\insert!s % $\pp^f(p)$ to \!\footins! so that the \colpage{} which the macro restarts % is built as if it has the footnotes in $\pp^f(p)$ to make the \colpage{} % broken leaving the space for the footnotes. However, \!\footins! is never % grown because it has been fixed and thus additional footnotes will go % to $\df$ as discussed above. Then \!\footins! is discarded by % \!\pcol@makecol! when the \colpage{} completes, or by % \!\pcol@output@switch! when it leaves the column. % % The reference to $\pp^f(p)$ by the latter macro \!\pcol@flushcolumn! is to % build the ship-out image of the \colpage{} to be flushed. When this macro % and other macros, namely \!\pcol@makecol! and \!\pcol@makeflushedpage!, % build the ship-out image in a page $p$ having $\pp^f(p)$ using % \!\@makecol!, we have to be careful of the fact that the \colpage{} has % been build as if it has footnotes in $\pp^f(p)$ but the footnotes are not % included in its ship-out image but that of the page. Therefore, % \!\@colht! referred in \!\@makecol! should be shrunk by the sum of % height and depth of $\pp^f(p)$ and $\!\skip!\cdot\pp^f(p)$ by % \!\pcol@shrinkcolbyfn!. Other and more subtle adjustment is to add the % stretch and shrink factors of $\!\skip!\cdot\pp^f(p)$ at the tail of the % \colpage{} by \!\pcol@unvbox@cclv!. This is necessary because \TeX{} has % broken the \colpage{} taking account of the stretch and, more essentially, % shrink factors, and thus without the factors the main vertical list in the % \colpage{} could be a little bit taller than \!\@colht! causing overfull. % % The feature gathering footnotes in all columns in a page brings a problem % to \exsync{}, because a column whose contents fit the \tpage{} at the % last visit may be too tall on the \sync{}ation because other columns have % put some footnotes after the last visit. That is, we cannot simply build % the \tpage{} combining $\s_c(\ptop)$ for all $c\In0\C$ and $\pp^f(\ptop)$ % because there could be $\s_c(\ptop)$ too tall to reside in $\ptop$ with % $\pp^f(\ptop)$. % % To solve this problem, we perform the following operations prior to fix % the contents of $\ptop$ having an \exsync{} point in it. First one is % {\em\Uidx\cscan} to visit all columns by \cswitch{} prior to the % \sync{}ation so that \TeX's page builder has opportunities to break too % tall \colpage{}s. Since this scan could merely break footnotes rather % than the main vertical lists in the \colpage{}s and the broken footnotes % will be reconnected when the \!\output!-routine is invoked for the % \sync{}ation, we then examine if all $\s_c(\ptop)$ are accommodated in % $\ptop$ with $\pp^f(p)$. % % This examination for a \sync{}ation by \!\switchcolumn!|*| or its % relatives is done as a part of the inherent \sync{}ing procedure to see if % the combination of the tallest {\em top} items, i.e., top floats and the % main vertical list, and the tallest {\em bottom} items, i.e., bottom % floats and \Mcfnote{}s, is too large causing page flushing. As for page % flushing and environment closing, this {\em\Uidx\pfcheck} requires a % special kind of \sync{}ed \cswitch{} by which we flush pages up to % $\ptop-1$ and examine if there is a too tall column. % % Then if too tall columns are found, in either cases, we move to the {\em % tallest} column to force a page break in the column so that we have a new % page with shorter columns and shorter \Scfnote{}s as well. In the % \sync{}ation by \!\switchcolumn!|*| or its relatives, this forced page % break is then applied to all other columns so that new \colpage{}s have % top floats, if any, below which we should place the \sync{}ation point. % This examination and forced page break is repeated until we have a page % without any too tall columns, because a page break may bring deferred % floats and footnotes which may result in a too tall column. % % % % \subsection{Text Coloring} % \label{sec:imp-ovv-color} % \changes{v1.2-1}{2013/05/11} % {Add the subsection ``Coloring''.} % \changes{v1.3-5}{2013/09/17} % {Change the subsection title from ``Coloring'' to ``Text Coloring'' % to distinguish it from background painting clearly.} % % \subsubsection{Fundamental Mechanism} % \label{sec:imp-ovv-color-fundamental} % \changes{v1.34}{2018/05/07} % {Revise the description of \Sec1.6.1 according to the new % implementation with \cs{insert}.} % % Text coloring done by \textsf{color} package and its relatives using % \!\special! stands on the fact that the main vertical list is {\em % printed} in the order of occurrence in the source |.tex|. That is, a % command such as \!\color!|{red}| puts % \!\special!|{color push [1 0 0]}|\footnote{ %  % If \texttt{.dvi} is processed by \texttt{dvips}, or other % printer-dependent command corresponding to it.} %  % into |.dvi| to make all stuff in the main vertical list colored red until % other coloring \!\special! inserted by other coloring macro appears in % |.dvi|. This simple mechanism works well even when the pair of coloring % \!\special!s are in different pages and/or columns because, with respect % to the main vertical list, everything between them in |.tex| is also % surrounded by the \!\special! pair in |.dvi|. As for other stuff such as % header, footer, floats and footnotes, \LaTeX{} surrounds them by % \!\color@begingroup! and \!\color@endgroup! or other similar constructs so % that they are colored without interference with the coloring of the main % vertical list. % % In \env{paracol} environment, however, the orders of the main vertical list % in |.tex| and |.dvi| are not always same. When a column encounters a page % break, in |.dvi| the other column should intervene between the stuff in % the broken pair of \colpage{}s possibly changing the color of the second % \colpage. A \cswitch{} from $c_1$ to $c_2$ also makes the main vertical % list out-of-order to cause another unexpected coloring because a coloring % command in $c_2$ will have no effect when $c_1$ is revisited after that % following its pre-switching stuff in |.dvi| which was put before the % coloring. Therefore, we have to make {\em\Uidx\colorctext{}s} in both % |.tex| and |.dvi| coherent inserting appropriate \!\special!s into |.dvi| % whenever an out-of-order {\em jump} occurs in |.dvi| by a page break or in % |.tex| by a \cswitch{}. % % The \textsf{color} package and its relatives\footnote{ %  % And all other coloring mechanism compliant with \LaTeXe{}, hopefully and % believingly.} %  % assume that {\em printers} have a stack for coloring and thus a coloring % \!\special! pushes the new color into the stack while it is popped by % another \!\special! which will be inserted by \!\aftergroup! mechanism % when a group surrounding the coloring \!\special! is closed. Therefore we % have to keep track of the \colorctext{} with {\em\Uidx\colorstack} % $$ % \Uidx\cst= % (\Uidx\celt_1,\celt_1,\ldots,\celt_n)= % \!\vbox!|{|\celt_1\;\celt_2\;\ldots\;\celt_n|}| % $$ % where $\celt_i$ is a \!\vbox! of 1\,|sp| tall, 0 deep and 0 wide containing % a coloring \!\special! which \!\set@color! puts into the main vertical % list. That is, when \!\set@color! is invoked we push $\celt$ to the tail % of $\cst$, while when the corresponding \!\reset@color! appears we pop it % from $\cst$\@. Then when we encounter an out-of-order jump, at first we % rewind the \colorstack{} in |.dvi| by putting \!\special!s which % \!\reset@color! would put, and then reestablish the \colorstack{} by % putting \!\special!s in $\celt_i$ as if \!\set@color! for it is invoked % for all $\celt_i\in\cst$. Therefore from the viewpoint of a {\em % printer}, it will see stack-rewinding at the end of each \colpage{} and % the leaving points of \cswitch{}, while the beginning of each \colpage{} % and the entry points of \cswitch{} should have the sequence of coloring % \!\special!s to regain the \colorstack{} which the {\em printer} must have % at each of the points. % % \SpecialArrayMainIndex{c}{\pcol@columncolor@box} %  % In addition, for each column $c$ we keep % $\Uidx\Celt^c=|\pcol@columncolor@box|\cdot c$ as the {\em default} color % of the column $c$, optionally given by the API macro \!\columncolor! or % \!\normalcolumncolor!. If given for $c$, it is assumed to be at the bottom % of the \colorstack{} denoted by % $\Uidx\CST^c=(\Celt^c,\celt_1,\ldots,\celt_n)$ which we rewind\slash % reestablish at each out-of-order jump in the column $c$. % % % % \subsubsection{Coloring in Horizontal Mode} % \label{sec:imp-ovv-color-hmode} % \changes{v1.22}{2013/06/30} % {Add the subsection ``Coloring in Horizontal Mode''.} % \changes{v1.34}{2018/05/07} % {Revise the description of \Sec1.6.2 according to the new % implementation with \cs{insert}.} % % We have to pay attention to the fact a coloring command can appear in % horizontal mode of course, and thus push/pop operations in a \colpage{} % would be done {\em before} the \colpage{} starts when \!\set@color! or % \!\reset@color! is in the second half of a page-crossing paragraph and if % we immediately performed push\slash pop of the \colorstack{} in these % macros. In addition, even in vertical mode these macros can appear before % \TeX{} finds a page break after which they must be in effect, if they are % preceded by a sequence of non-breakable vertical items by which \TeX{}'s % examination of the page break is {\em delayed} as well as the invocation % of \!\output! at the break. % % In order to solve the problem of push/pop timing, we perform push\slash % pop operations through \!\insert! to our own register set % \!\pcol@colorins!. That is, we \!\insert! $\celt$ to \!\pcol@colorins! % when we encounter a \!\set@color! for $\celt$, while its corresponding % \!\reset@color! also \!\insert!s another \!\vbox! $\Uidx\celtpop$ of % null-height\slash depth\slash width having a \!\special! which the % \!\reset@color! puts into the main vertical list. Since we let % $\!\count!\!\pcol@colorins!=0$ and $\!\skip!\!\pcol@colorins!=0$ to keep % the \!\insert!ion from affecting the growth of \!\pagetotal!, it is % guaranteed that an inserted $\celt$ or $\celtpop$ is given to \!\output! % through \!\pcol@colorins! together with |\box255| containing the % corresponding \!\special!. % % When \!\output! is invoked, \!\pcol@colorins! has $\Uidx\cstraw$ % containing $\celt_i$ and possibly its corresponding $\celtpop_i$. % Therefore, if \!\output! is for a page break or a \cswitch, we remove all % pairs of $\celt_i$ and $\celtpop_i$ from \!\pcol@colorins! to let it have % $\cst$ only with $\celt_j$ whose corresponding $\celt_j^-$ is not in % $\cstraw$. For this removal, we scan $\cstraw$ from its tail % incrementing\slash decrementing a counter $\Uidx\npop$ which we initialize % to 0 before scanning. In the scan, we remove all $\celtpop$ % unconditionally incrementing $\npop$, and $\celt$ such that $\npop>0$ on % the encounter with it decrementing $\npop$. This scan is done by % \!\pcol@clearcolorstack!, invoked from \!\pcol@opcol! for a page break and % \!\pcol@output@switch! for a \cswitch{} through \!\pcol@clearcst@unvbox!, % and is for rewinding the \colorstack{} % $(\Celt^c,\cstraw)=\Uidx\CSTraw^c$. Therefore, for each $\celt$ to be kept % because of $\npop=0$ on the encounter with it we put \!\special! for % \!\reset@color!. Note that on another scan for stack reestablishment, % \!\pcol@colorins! has $\cst$ and is kept unchanged. Also note that other % \!\output! invocations such as that for floats do not touch $\cstraw$ to % allow it grows with $\celt$ and $\celtpop$ corresponding to \!\set@color! % and \!\reset@color! in the \colpage{} in which the invocation % happens\footnote{ %  % Unlike \cs{footins} which becomes void by putting its contents back to the % main vertical list to reexamine the footnote placement possibly with % splitting.}. % % The mechanism above especially for horizontal mode has subtle issues as % follows. %  % \begin{itemize} % \item % If \!\set@color! appears in a \!\vbox!, the \!\insert!ion for pushing % is not effective but corresponding \!\reset@color! can be outside of the % \!\vbox! to make pushes and pops unbalanced because \!\aftergroup! for it % inserts it just after the closing of the \!\vbox! if \!\set@color! is not % surrounded by an inner group. % % \item % If we are in vertical mode, we can know if we are in a \!\vbox! by % \CSIndex{ifinner}. However, in horizontal or math mode, \CSIndex{ifinner} % cannot help us because it is true iff we are in a \!\hbox! or in an % in-text math. In short, \TeX{} does not provide us with any convenient % means to know if we are in a \!\vbox!. % \end{itemize} %  % To solve the problem above, we introduced a trick with \!\everyvbox! to % turn a switch $\CSIndex{ifpcol@inner}=\true$ at the beginning of every % \!\vbox! in a \env{paracol} environment, by which we suppress the % \!\insert!ion for \!\set@color! because a \!\vbox! cannot cross a % page boundary. As for that of \!\reset@color!, we suppress it by not % reserving our own macro \!\pcol@reset@color@pop! for the \!\insert!ion by % \!\aftergroup!. That is, we reserve both \!\reset@color! and % \!\pcol@reset@color@pop! with \!\aftergroup! if we are outside of any % \!\vbox!es, while does the former only otherwise. By the same reason, we % suppress the \!\insert!ion if we are in restricted horizontal mode, i.e., % if both \CSIndex{ifhmode} and \CSIndex{ifinner} are true. On the other % hand, we cannot suppress the \!\insert!ion when we are in an in-text math % because it can cross a page boundary\footnote{ %  % If an in-text math is in a \cs{hbox}, \cs{insert}ion is not % necessary because the math cannot cross a page boundary. Though we can % detect it by a trick with \!\everyhbox!, we abandon this idea because the % request is not harmful. Another and more serious issue of coloring in % math mode will be discussed shortly.}. %  % Note that the detailed implementation shown in \secref{sec:imp-startenv} % does not interfere the use of \!\everyvbox! inside/outside of % \env{paracol} environments or is not affected by the use. % % Another attention we should pay is that \!\color! will leave \!\aftergroup! % tokens of \!\reset@color! and thus they are invoked just after % \Endparacol. However, since we have completed all \colpage{}s in the % \lpage, the \colorstack{} in |.dvi| should be empty. Therefore to avoid % stack underflow, we should reestablish $\cst$ (not $\CST^c$) so that % elements in the stack are popped by \!\reset@color! invoked with the % \!\aftergroup! mechanism. We also take care of our own \colorstack{} % popper \!\pcol@reset@color@pop! which must do nothing, i.e., must not make % an \!\insert!ion, after we completed the \lpage, i.e., if % \CSIndex{ifpcol@output} is $\false$. % % % % \subsubsection{Changing Default Column Color} % \label{sec:imp-ovv-color-colcolor} % \changes{v1.34}{2018/05/07} % {Split the description of \cs{columncolor} from \Sec1.6.2 to have % new \Sec1.6.3 ``Changing Default Column Color'' because we have % several new issues in the new implementation with \cs{insert}.} % % The implementation of \!\columncolor! and \!\normalcolumncolor! is % relatively easy for the cases that they appear outside % \env{paracol} environment or they define the default color of a % column different from the current column. That is, for the default color % of a column $c$ we simply \!\def!ine % ${\Uidx\Celtshadow}^c=|pcol@columncolor|\cdot c$ to let it have what % \!\current@color! has for the color. Then, in \beginparacol{} in the % former case or immediately in the latter, we let % $\Celt^c=|pcol@coloumncolor@box|\cdot c$ have the coloring \!\special! for % the color acquiring an \!\insert! from \!\@freelist! if the box is % $\bot$. %  % \SpecialArrayMainIndex{c}{\pcol@columncolor} % \SpecialArrayIndex{c}{\pcol@columncolor@box} % % On the other hand, when the API commands are to define the default color % of the current column $c$, we need to place the coloring at the bottom of % \colorstack{}s in terms of |.tex| and |.dvi|. That is, for the former we % have to rewind and reestablish the stack which can be different from % $\CST^c$ because the API command can follow a page break which \TeX{} does % not yet find. Therefore, we maintain a {\em shadow} of $\cst$ namely; % $$ % {\Uidx\cstshadow}={\Midx{\!\pcol@colorstack@shadow!}} % =({\Uidx\celtshadow}_1,\celtshadow_2,\ldots,\celtshadow_n) % =\!\@elt!\Arg{\celtshadow_1}\;\!\@elt!\Arg{\celtshadow_2}\;\cdots\; % \!\@elt!\Arg{\celtshadow_n} % $$ % to which our version of \!\set@color! pushes $\celtshadow_i$ being % \!\current@color! which the original one defines, while popping is done % automatically by \TeX's grouping mechanism because pushes are done by % \!\edef! rather than \!\xdef!. Then before we \!\def!ine $\Celtshadow^c$ % we rewind % ${\Uidx\CSTshadow}^c=(\Celtshadow^c,\celtshadow_1,\ldots,\celtshadow_n)$ % putting \!\special! for pop to the main vertical list for each elements, % and then after the \!\def!initon of $\Celtshadow^c$ we reestablish % $\CSTshadow^c$ putting coloring \!\special! for each element. % % As for placing $\Celt^c$ at the bottom of $\CST^c$, we must ensure that % the placement is done for the \colpage{} in which the API command % belongs to, as we did in ordinary push\slash pop of the \colorstack. % Therefore the API command \!\insert!s $\Celt^c$ to $\cstraw$ in the form % of a \!\vbox!, whose height and depth are 1\,|sp| and width is 0, % containing the coloring \!\special! for $\Celt^c$. Then when $\cstraw$ is % scanned for rewinding in \!\output!, this \!\vbox! is found to let % $\Celt^c$ have the \!\special! acquiring an \!\insert! from \!\@freelist! % it was $\bot$. Note that $\cstraw$ may have multiple \!\vbox!es to update % $\Celt^c$ and if so the last one is effective. % % % % \subsubsection{Coloring in Math Mode} % \label{sec:imp-ovv-color-mmode} % \changes{v1.24}{2013/07/27} % {Add the subsection ``Coloring in Math Mode''.} % \changes{v1.34}{2018/05/07} % {Revise the description of \Sec1.6.4 according to the new % implementation with \cs{insert}.} % % Unfortunately the solution above is imperfect because \TeX{} builds an % implicit \!\hbox! for a |{|\textit{math stuff}|}| construct in math mode % and an \!\insert! in the construct does not contribute to % the main vertical list at all\footnote{ %  % The contents is not thrown away but \cs{insert}ion itself is added % to the list rather than given to \cs{output}.}. %  % Since the implicit \!\hbox! does not care about \!\everyhbox!, we cannot % use the trick similar to that with \!\everyvbox!. Another bad news is % that built-in \cs{if}s for mode checking cannot help us because we always % have $\CSIndex{ifvmode}=\CSIndex{ifhmode}=\false$ and % $\CSIndex{ifmmode}=\true$ while $\CSIndex{ifinner}$ is $\true$ or $\false$ % when we are in in-text or displayed math mode respectively. Therefore, we % have to take care of the potential loss of \!\insert!ion for pushes and % thus unmatched pops in $\cstraw$. % % For example, we have to remember that, in the cases like % |${|\!\color!$\Arg{c}\textit{text}$|}$| or % |$|\!\textcolor!$\~\Arg{c}\ARg{text}$|$| expanded to the former, the % \!\insert!ion for push is lost while its counterpart for pop survives % making it necessary to check the existence of pushing counterpart for each % pop in $\cstraw$\footnote{ %  % Since a pop is always in a group one level outer from its push % counterpart, the pop request should be presented if the push does.}. %  % Note that the fact that the pop in the examples is in the in-text math % does not help us, because the pop in % |$|\!\begingroup!\!\color!\Arg{c}\textit{text}\!\endgroup!|$| is also in % the in-text math while its pushing counterpart performs an effective % \!\insert!ion, and two \!\insert!ions must be presented in $\cstraw$ % because we can have a page-break in \textit{text}. Therefore, we have to % find a means to examine whether a pop $\celtpop_i$ has its counterpart % $\celt_i$ in $\cstraw$ to remove $\celt_i$ from $\cstraw$ if exists or to % ignore $\celtpop_i$ otherwise. That is, we have to attach an identifier % $m$ to $\celt_i$ and $\celtpop_i$, i.e., to make them $\Uidx\mcelt_{i,m}$ % and $\Uidx\mceltpop_{i,m}$. % % Since the only means we have for the communication with \!\output! routine % is what we \!\insert! to $\cstraw$, the \!\insert!ed \!\vbox! must carry an % identifier $m$ for a push\slash pop in math mode. To do that, we make % \!\vbox! $m$\,|sp| wide ($m>0$) if our version of \!\set@color! is in math % mode to represent $\mcelt_{i,m}$ and $\mceltpop_{i,m}$, while the width is % 0 otherwise as described in \secref{sec:imp-ovv-color-hmode}. Then in the % scan of $\cstraw$ for rewinding in \!\output!, we suppress % incrementing\slash decrementing $\npop$ for $\mcelt_{i,m}$ and % $\mceltpop_{i,m}$, but remove $\mcelt_{i,m}$ if $\mceltpop_{i,m}$ is in % $\cstraw$ as a successor while we keep it in $\cstraw$ otherwise putting a % \!\special! of pop for it to the main vertical list. % % To ensure that $\mcelt_{i,m}$ has its counterpart $\mceltpop_{i,m}$ in % $\cstraw$ iff the push and pop are in a \colpage, we maintain the counter % \!\pcol@mcid! incremented before (the attempt of) the \!\insert!ion of % $\mcelt_{i,m}$ with $m=\!\pcol@mcid!$ and the \!\aftergroup! reservation % for that of $\mceltpop_{i,m}$. Then the counter is zero-cleared by % \!\output! routine in order to keep it less than % $\!\pcol@mcpushlimit!=1000$ unless, roughly speaking, a \colpage{} has a % unexpectedly large number of math constructs having coloring commands in % them. Note that this zero-clearing does not ensure that an identifier $m$ % is unique in $\cstraw$. That is, it can happen that $\cstraw$ has % $\mcelt_{i,m}$, $\mceltpop_{i,m}$, $\mcelt_{j,m}$ and/or $\mceltpop_{j,m}$ % in this order for $i0\;\land\;$non-\lpage\cr % 0&otherwise}\\[1ex] % d_s&=&\cases{H_{n+1}-(H_n+h_n)+\!\maxdepth!& % $i=n\;\land\;H'_{n+1}=0\;\land\;$non-\lpage\cr % 0&otherwise} % \end{eqnarray*} % \endgroup %  % In the specifications above, $\w_c$ and $\Uidx\gap_c$ is the width of the % column $c$ and that of the \csepgap{} following it, defined by % \!\columnratio! or \!\setcolumnwidth! and stored in % $|\pcol@columnwidth|{\cdot}c$ and $|\pcol@columnsep|{\cdot}c$ % respectively. %  % \SpecialArrayIndex{c}{\pcol@columnwidth} % \SpecialArrayMainIndex{c}{\pcol@columnsep} %  % The additions of $d_{c/g}$ and $d_s$ are to extend the bottom edge of each % region down to the bottom of text area. In addition, for each % $\bgr_a^{[c]}=[(x_0,y_0)(x_1,y_1)]$, {\em\Uidx\bgext}s % $\Uidx{\bge}_a^{[c]}(\{x,y\}^\pm)$ can be specified to shift the base % points $x_0$, $y_0$, $x_1$ and $y_1$ left ($x^-$), right ($x^+$), upward % ($y^-$) and downward ($y^+$) respectively. That is, a region is defined % as; % $$ % \bgr_a^{[c]}=[(x_0-\bge_a^{[c]}(x^-),\;y_0-\bge_a^{[c]}(y^-))\; % (x_1+\bge_a^{[c]}(x^+),\;y_1+\bge_a^{[c]}(y^+))] % $$ % \begingroup\par\hfuzz0.9pt\noindent % with the optional shifts specified by the first argument of % \!\backgroundcolor! as % \Arg{\hbox{\ttfamily\itshape{a}}\oarg{c}$|(|x^\pm|,|y^\pm|)|$} (for both % $x^-$/$y^-$ and $x^+$/$y^+$) or \Arg{\hbox{\ttfamily\itshape % a}\oarg{c}$|(|x^-|,|y^-|)||(|x^+|,|y^+|)|$} and kept in macros % $|\pcol@bg@ext@|{\cdot}\~d{\cdot}|@|{\cdot}a[{\cdot}|@|{\cdot}c]$ %  % \SpecialArrayIndex{d{\cdot}\string\texttt{@}{\cdot}a}{\pcol@bg@ext@} % \SpecialArrayIndex % {d{\cdot}\string\texttt{@}{\cdot}a{\cdot}\string\texttt{@}{\cdot}c} % {\pcol@bg@ext@} %  % where $d\in\{|l|,|r|,|t|,|b|\}$ for $x^-$ (|l|), $x^+$ (|r|), $y^-$ (|t|) % and $y^+$ (|b|). Note that $\bge_a^{[c]}(\{x,y\}^\pm)$ can be extremely % large, namely greater than or equal to 9000pt, to mean the region is % extended to a border near by the corresponding paper edge. More % specifically, by this {\em\Uidx\bginfext}, each $xy$ coordinate in % $[(x_0,y_0)(x_1,y_1)]$ is defined as follows to represent a coordinate % being $10000\PT-\bge_a^{[c]}(\{x,y\}^\pm)+\!\pagerim!$ inside from the page % edge; % \par\endgroup %  % \begingroup \def\feven{f_{\mathit{even}}} % \begin{eqnarray*} % x_0&=&-\WM+(10000\PT-\bge_a^{[c]}(x^-)+\WR)\\ % y_0&=&-(\HS+\HM)+(10000\PT-\bge_a^{[c]}(y^-)+\HR)\\ % x_1&=&(\WP-\WM)-(10000\PT-\bge_a^{[c]}(x^+)+\WR)\\ % y_1&=&(\HP-\HS-\HM)-(10000\PT-\bge_a^{[c]}(y^+)+\HR)\\ % \Uidx\WP&=&\!\paperwidth!\\ % \Uidx\WM&=&1|in|+\cases{\!\oddsidemargin!&$\lnot\feven$\cr % \!\evensidemargin!&$\feven$}\\ % \Uidx\WR&=&\Uidx\HR=\!\pagerim!\\ % \Uidx\HP&=&\!\paperheight!\\ % \Uidx\HM&=&\!\headsep!+\!\headheight!+\!\topmargin!+1|in|\\ % \Uidx\HS&=&\mathit{height}(\pp^b(p))+\mathit{depth}(\pp^b(p)) % \end{eqnarray*} % \endgroup %  % where $f_{\mathit{even}}$ is $\true$ iff we are in an even numbered page % and two-sided typesetting is specified by the optional argument of % \!\documentclass! or by the specifier `|p|' of \!\twosided! explicitly or % implicitly. % % Another remark is that \cswap{} affects $\bgr_c^c(i)$ and $\bgr_s^c(i)$ to % {\em\Uidx\mirror} the region making a reflection-symmetric transformation % on it using a vertical edge of a page as the axis. That is, % $[(x_0,y_0)(x_1,y_1)]$ for a region is transformed to % $[(\WT-x_1,y_0)(\WT-x_0,y_1)]$ if $x_{\{0,1\}}$ is not extended infinitely. % With \bginfext{} on the other hand, before this transformation $x_0$ and/or % $x_1$ are calculated by the rule above replacing $\WM$ with % $\WP-(\WM+\WT)$ to represent the width of the right margin rather than the % left. % % On the other hand, the \mirror{}ing of $\bgr_{\{s,S\}}$ is enabled by the % specifier `|b|' of \!\twosided!, together with other regions being top % margin ($t,T$), bottom margin ($b,B$), left margin ($l,L$), right margin % ($r,R$), \pwise{} floats ($f,F$) and \scfnote{} footnotes ($n,N$). The % geometrical specifications $\bgr_a$ for those regions are given as follows, % but the coordinate origin is at the top-left corner of text area (rather % than the leftmost column). %  % \begin{eqnarray*} % \bgr_{\{t,T\}}&=&[(-\WM+\WR,\;-\HM+\HR),\;(\WP-\WM-\WR,\;0)]\\ % \bgr_{\{b,B\}}&=&[(-\WM+\WR,\;\HT-\HM),\;(\WP-\WM-\WR,\;\HP-\HM-\HR)]\\ % \bgr_{\{l,L\}}&=&[(-\WM+\WR,\;0),\;(0,\HT)]\\ % \bgr_{\{r,R\}}&=&[(\WT,\;0),\;(\WP-\WM-\WR,\;\HT)]\\ % \bgr_{\{f,F\}}&=&[(0.\;0),\;(\WT,\;\HS)]\\ % \bgr_{\{n,N\}}&=&[(0,\;\HT-\HN)\;(\WT,\;\HT)]\\ % \Uidx\HT&=&\!\textheight!+\!\maxdepth!\\ % \Uidx\HN&=&\!\skip!\!\footins!+\!\ht!\!\footins!+\!\dp!\!\footins! % \end{eqnarray*} %  % Note that, since we use text area coordinates, in the calculation of % \bginfext{} $\HS$ is let be 0. % % We have other regions for columns and \csepgap{}s, namely $\bgr_C^c$ and % $\bgr_G^c$, which vertically span all over text area regardless existence % of any \pwstuff. Therefore, their geometrical specifications are as % follows with text area coordinates. %  % \begin{eqnarray*} % \bgr_C^c&=&[(\W_{c-1},\;0),\:(\W_{c-1}+w_c,\;\HT)]\\ % \bgr_G^c&=&[(\W_{c-1}+w_c,\:0),\;(\W_c,\;\HT)] % \end{eqnarray*} %  % In addition, we have to paint \preenv{} and \postenv{} with color % $\bgc_{\{p,P\}}$. The region $\bgr_{\{p,P\}}$ for them is defined as % follows with text area coordinates where $\Uidx\HB$ is the $y$-coordinate % of the bottom of previous \env{paracol} environment if any, or 0 % otherwise. % $$ % \bgr_{\{p,P\}}=\cases{ % [(0,\;\HB)\;(\WT,\;\HS)]& \preenv\cr % [(0,\;\HB)\;(\WT,\;\HT)]& \postenv} % $$ % Note that painting of \postenv{} is done {\em outside} \env{paracol} % environment when the \postenv{} encounters a page break, unless another % \env{paracol} environment starts in the page and thus the \postenv{} % becomes \preenv{} of the second (or subsequent) environment. % % Finally, we define the order of \bgpaint{} as follows, where $a$, $a(i)$, % $a^c$ and $a^c(i)$ mean $\bgr_a$, $\bgr_a(i)$, $\bgr_a^c$ and % $\bgr_a^c(i)$ respectively, so that a succeeding region is {\em overlaid} % on preceding regions. %  % \begin{eqnarray*} % T&\to&B\to L\to R\\ % &\to&G^0\to\cdots\to G^{\C-2}\to C^0\to\cdots\to C^{\C-1}\\ % &\to&t\to b\to l\to r\to N\to n\to\{F,P\}\to\{f,p\}\footnotemark\\ % &\to&S(1)\to\cdots\to\S(n)\\ % &\to&g^0(1)\to\cdots\to g^{\C-2}(1)\to c^0(1)\to\cdots\to c^{\C-1}(1)\to % s(1)\\ % &\to&\cdots\\ % &\to&g^0(n)\to\cdots\to g^{\C-2}(n)\to c^0(n)\to\cdots\to c^{\C-1}(n)\to % s(n)\\ % &\to&g^0(n{+}1)\to\cdots\to g^{\C-2}(n{+}1) % \to c^0(n{+}1)\to\cdots\to c^{\C-1}(n{+}1) % \end{eqnarray*} %  % \footnotetext{In column flushing, the order is $\{F,P\}\to\{f,p\}\to N\to % n$ but this reversion should have no effect (almost always).} % % % % \subsection{Page-wise Float Placement} % \label{sec:imp-ovv-float} % \changes{v1.32-3}{2015/10/10} % {Add the section ``Page-wise Float Placement'' to discuss the % page-wise float problem.} % % In the release on 2015/01/10, \LaTeX{}'s float placement mechanism was % drastically changed to avoid {\em out-of-order\/} appearance of \pwise{} % floats as follows. Since the cause of overtaking of a \pwise{} float by a % \cwise{} float is that they are in two separated lists \!\@dbldeferlist! % for the former and \!\@deferlist! for the latter, in the new implementation % the two lists are merged to let all floats go to \!\@deferlist!. To % distinguish \pwise{} and \cwise{} floats in the list, \!\end@dblfloat! % lets the \pwise{} float processed by the macro have a special depth of % |1sp|, while depth of \cwise{} floats are 0 since \!\@endfloatbox! add a % \!\vskip! of 0 at the end of the box of floats. % % Then all float placement macros invoked in \!\output!-routine examine the % depth of floats in the list they are working on against a newly introduced % macro \!\f@depth! by also newly introduced \!\@testwrongwidth!, so that % they process only floats of a page/column category specified by % \!\f@depth!, while those not matching to \!\f@depth! are let go to % \!\@deferlist! to inhibit succeeding floats of the same type from % overtaking them. The \!\def!inition of \!\f@depth! is done only by % modified \!\@dblfloatplacement!, always invoked in a group, to let it have % |1sp| so that float placement macros usually work on \cwise{} ones with % the default setting of $\!\f@depth!=\!\z@!$ except for special occasions % in which the placement of \pwise{} floats is tried. % % Though the mechanism should work well with {\em ordinary\/} multi-columned % documents, it is incompatible with \Paracol{} almost inherently. That is, % in the first place we have to separate float-related lists into the sets % of them corresponding to columns as we do\footnote{ %  % If counters \counter{figure} and \counter{table} are global and we have to % avoid inter-column overtaking with respect to, for example, the partial % ordering rooted by the top-left corner, merging \cwise{} lists together % with the merge of \cs{@deferlist} and \cs{@dbldeferlist} might be a % solution to let the depth of a \cwise{} float be $c\,\texttt{sp}$ while % that of \pwise{} is $\C$\,\texttt{sp}. However such implementation is not % only tough but also doubtful to be worthwhile.}. %  % Therefore, it is obviously nonsense to merge the list for \pwise{} floats, % i.e., \!\@dbldeferlist!, to \!\@deferlist! of a particular column, and % thus we have to stick with the conventional implementation to process % \pwise{} and \cwise{} floats separately as follows. %  % \begin{enumerate}\def\labelenumi{(\arabic{enumi})} % \item % \label{item:ovv-float-end@dblfloat} % We \!\def!ine our own \!\end@dblfloat! namely \!\pcol@end@dblfloat! % whose definition is exactly same as the old version of \!\end@dblfloat!, % and replace the new version with it by \!\let!ting them equivalent in % \!\pcol@zparacol! by which start \env{paracol} environments. Therefore, % \pwise{} floats composed in a \env{paracol} environment is processed in % the traditional way, i.e., being included in \!\@dbldeferlist! rather than % \!\@deferlist! and having ordinary depth 0. % % \item % \label{item:ovv-float-@dblfloatplacement} % Each invocation of \!\@dblfloatplacement! in our own \!\output!-routine is % followed by a \!\let! to nullify the setting of $\!\f@depth!=|1sp|$ done % by \!\@dblfloatplacement! by doing \!\f@depth!=\!\z@!. By this setting, % \!\@tryfcolumn! in \!\pcol@startpage! and \!\@makefcolumn! in % \!\pcol@output@clear! work on their argument \!\@dbldeferlist! in the way % exactly same as in 2014 or before. % % \item % \label{item:ovv-float-@addtodblcol} % Among \LaTeX's macros in its \!\output!-routine which we use in our own % one as well, only \!\@addtodblcol! changed its target from % \!\@dbldeferlist! to \!\@deferlist!. That is, if the macro fails to put a % \pwise{} float to the page we just have started by \!\pcol@startpage!, % the float is added to \!\@deferlist! rather than \!\@dbldeferlist!. % Therefore, when we apply \!\@sdblcolelt! to the copy of \!\@dbldeferlist! % to invoke \!\@addtodblcol! for each of its element float, we have to save % \!\@deferlist! somewhere, to \!\reserved@c! in reality, and clear it prior % to the application. Then after all elements are processed, we have to let % \!\@dbldeferlist! have what \!\@deferlist! have, while \!\@deferlist! % should regain its original contents from the saved place. A subtle issue % is that we might work with \LaTeX{} of 2014 or older in which the floats % are returned to \!\@dbldeferlist!. Therefore to make \Paracol{} % compatible with both of new and old versions, we have to {\em add} % \!\@deferlist! to \!\@dbldeferlist! rather than replacing % \!\@dbldeferlist! with \!\@deferlist!. This addition should work well, % because we clear both lists before the application of \!\@sdblcolelt! and % then one of them will have the still-deferred floats after the application % while the other remains empty. % % \item % \label{item:ovv-float-@output@start} % We convert \!\@deferlist! to \!\@dbldeferlist! in \!\pcol@output@start! to % start a \env{paracol} environment, and perform the reverse operation in % \!\pcol@output@end! to close the environment. Though it is very unlikely % (or maybe impossible) that the \!\@deferlist! {\em imported\/} in the % former operation has \LaTeX's (i.e., not \Paracol's) double-column floats % of |1sp| deep, we make such floats old-fashioned making their depth 0 so % that they can be put in a page built in the \env{paracol} environment. On % the other hand, the latter cannot {\em export\/} a list having floats of % |1sp| deep because they have been produced in the closing \env{paracol} % environment or have passed our {\em custom\/} \!\pcol@output@start! when % they were imported\footnote{ %  % Therefore, if one try to {\em smuggle\/} a double-column float of the new % scheme into a \env{paracol} and to pass it through the environment to % another double-column world, the float will become a single-column one. % Even if such guy a really exists and complains about this transformation, % however, we have good right to say ``don't do that''.}. % \end{enumerate} %  % Note that the operations (1), (2) and (4) are fully compatible with 2014 % or older version of \LaTeX{}, because with the old version; (1) % \!\pcol@end@dblfloat! is equivalent to \!\end@dblfloat!; (2) modification % of \!\f@depth! cannot be seen because it does not exist; and (4) we % virtually do nothing in the importation. As for (3), we explicitly take % care of the compatibility as shown above. % % % % \section{Interaction with \TeX{} and \LaTeX{}} % \label{sec:imp-tex} % % The macros of \Paracol{} interacts with \TeX{} and \LaTeX{} through % various registers and macros as discussed in this section. % % \subsection{Registers} % \label{sec:imp-tex-reg} % % \subsubsection{Insertion Registers} % % \begin{description} % \item[\Uidx{\!\footins!}] % is used to \!\insert! footnotes through it by \!\footnote! and % \!\footnotetext!, and then in \!\output! routine the footnotes % \!\insert!ed in a page is presented in the register. The register is % referred to by the following macros. %  % \begin{itemize} % \item % \!\pcol@makecol! examines if the register has \Scfnote{}s and, if so, % saves it into $\pp^f(p)$ if $p=\ptop$ or discards it otherwise. % % \item % \!\pcol@startcolumn! \!\insert!s $\pp^f(p)$ into the \colpage{} to be % created through the register. % % \item % \!\pcol@specialoutput! logs the contents of the register for debugging. % % \item % \!\pcol@output@start! examines if the register has footnotes to be merged % with those in \env{paracol} environment, refers to its height plus depth to % calculate effective \!\@colht!, and/or \!\insert!s its contents through % itself to the main vertical list as the first part of \Mgfnote{}s. % % \item % \!\pcol@makenormalcol! combines footnotes in the register to other % \preenv{} to make a \spanning, or makes save\slash restore of the register % to/from \!\@tempboxa! to exclude footnotes from \spanning{} when % \mgfnote{}-footnote typesetting is specified. % % \item % \!\pcol@output@switch! saves the register into $\pp^f(p)$ or $\cc_c(\ft)$, % or discards its contents, when we leave from the column $c$ with footnotes. % % \item % \!\pcol@restartcolumn! restores $\cc_d(\ft)$ or $\pp^f(p)$ to the register % and then \!\insert!s the contents of \!\box!\!\footins! into itself so % that it contributes to the main vertical list to be rebuilt for the column % $d$. % % \item % \!\pcol@getcurrfoot! for column $d$ lets the register have $\cc_d(\ft)$. % % \item % \!\pcol@savefootins! saves the register into an \!\insert! for $\pp^f(p)$ % or $\cc_c(\ft)$. % % \item % \!\pcol@deferredfootins! refers the \!\skip! component of the register to % have the vertical skip above \Scfnote{}s and \!\insert!s deferred % footnotes through the register. % % \item % \!\pcol@output@end! \!\insert!s $\pp^f(p)$ into the \lpage{} through the % register. % % \item % \!\pcol@fntexttop!\marg{text} \!\insert!s the footnote $\arg{text}$ and a % penalty through the register. % % \item % \!\pcol@fntextbody!\marg{text} refers to the \!\skip! component of the % register to cap the height of the footnote $\arg{text}$. % \end{itemize} % % \item[\rm\Uidx{\!\bx@A!}, \ldots, \Uidx{\!\bx@R!}] % have floats created by \!\@xfloat! in the ordinary usage of {\em % fundamental\/} \LaTeX{} of 2014 or earlier or that without the extension % of e-\TeX{} or its relatives. On the other hand, in \LaTeX{} of 2015 or % later and with e-\TeX{} or its relatives, the set is \!\bx@A!, \ldots, % \Uidx{\!\bx@Z!}, \Uidx{\!\bx@AA!}, \ldots, \Uidx{\!\bx@ZZ!}\@. In addition % to the use in \LaTeX, we use these registers for completed \colpage{}s % $s_c(p)$ (\!\pcol@opcol!, \!\pcol@flushcolumn!), main vertical list % $\cc_c(\vb)$ (\!\pcol@output@start!, \!\pcol@output@switch!, % \!\pcol@flushcolumn!) and \Mcfnote{}s $\cc_c(\ft)$ % (\!\pcol@output@switch!) in \ccolpage{}s, \spanning{} including \preenv{} % $\pp^i(p)$ (\!\pcol@startpage!, \!\pcol@output@start!) and \Scfnote{}s % $\pp^f(p)$ (\!\pcol@makecol!, \!\pcol@output@switch!) in pages, % \mvlfloat{}s for main vertical lists in \sync{}ed pages % (\!\pcol@synccolumn!), and \pwise{} floats deferred from \env{paracol} to % \postenv{} (\!\pcol@output@end!). % \end{description} % % % % \subsubsection{Integer Registers} % % \begin{description} % \item[\Uidx{\!\deadcycles!}] % is \TeX's primitive register to count the number of \!\output! requests % made between two \!\shipout! operations. It is zero-cleared by % \!\pcol@invokeoutput! because it can have a large number in a % \env{paracol} environment. % % \item[\Uidx{\!\outputpenalty!}] % is \TeX's primitive register to have the page-break penalty with which % \!\output! routine is invoked. It is referred to by \!\pcol@output! to % know whether it has special code less than $-10000$, and by % \!\pcol@specialoutput! in detail for the dispatch according to the code. % The register is also used for the communication from the latter, which lets % it be $-10000$ for our own special \!\output! routines, to the former to % determine \!\vsize! according to if the register has a value greater than % $-10004$ or not. % % \item[\Uidx{\!\interlinepenalty!}] % is \TeX's primitive register to have the page-break penalty inserted % between two lines. The register is referred to in the following macros. %  % \begin{itemize} % \item % \!\pcol@output@start! to make \Preenv{} \Mgfnote{}s followed by this % \!\penalty! on the \!\insert!ion, and to insert it to start the first % \colpage{} allowing page-break before the start unless it is inhibited % by $\CSIndex{if@nobreak}=\true$. % % \item % \!\pcol@restartcolumn! to insert this \!\penalty! to resume a \colpage{} % allowing page-break if $\CSIndex{if@nobreak}=\false$. % % \item % \!\pcol@deferredfootins! to let the second half of split $\df$ have this % \!\penalty! as the very first element. % % \item % \!\pcol@fntexttop!\marg{text} to make the footnote $\arg{text}$ followed % by this \!\penalty! on the \!\insert!ion. % % \item % \!\pcol@fntextother!\marg{text} to make the footnote $\arg{text}$ preceded % by this \!\penalty! in $\df$. % % \item % \!\pcol@fntextbody! to let the register have \!\interfootnotelinepenalty!. % \end{itemize} % % \item[\Uidx{\!\floatingpenalty!}] % is \TeX's primitive register to have the page-break penalty added to % \!\insertpenalties! if an \!\insert! is moved to the page next to the page % in which the line having the \!\insert! resides. It is let have 20000 in % \!\pcol@fntextbody! for footnote typesetting. % % \item[\Uidx{\!\vbadness!}] % is \TeX's primitive register to have the threshold of the badness of % \!\vbox! construction with underfull messages. That is, if the badness % exceeds the threshold on a \!\vbox! construction, \TeX{} will complain % showing an underfull message. In \!\pcol@makenormalcol! and % \!\pcol@deferredfootins!, the register is temporarily let have 10000 to % avoid that \!\@makecol! invoked in the former and \!\vsplit! done in the % latter causes the message with inevitable underfull. % % \item[\Uidx{\!\showboxdepth!}] % is \TeX's primitive register to determine the maximum depth of box % structure to be shown in logging etc. The register is let have 10000 in % \!\pcol@ShowBox! for full logging. % % \item[\Uidx{\!\showboxbreadth!}] % is \TeX's primitive register to determine the maximum breadth of box % structure to be shown in logging etc. The register is let have 10000 in % \!\pcol@ShowBox! for full logging. % % \item[\Uidx{\!\interfootnotelinepenalty!}] % is an API \!\count! register to have \!\interlinepenalty! for footnotes. % It is used in \!\pcol@fntextbody! to let \!\interlinepenalty! have it. % % \item[\Uidx{\!\@ne!}] % is a \!\chardef! register to have 1. The register is referred to by the % following macros mainly for incrementing another register. %  % \begin{quote}\raggedright % \!\pcol@F@count!, % \!\pcol@output!, % \!\pcol@opcol!, % \!\pcol@setpnoelt!, % \!\pcol@nextpage!, % \!\pcol@nextpelt!, % \!\pcol@startpage!, % \!\pcol@checkshipped!, % \!\pcol@outputelt!, % \!\pcol@ioutputelt!, % \!\@outputpage!, % \!\pcol@bg@paint@ii!, % \!\pcol@output@start!, % \!\pcol@makenormalcol!, % \!\pcol@output@switch!, % \!\pcol@setcurrcol!, % \!\pcol@iscancst!, % \!\pcol@addmarginpar!, % \!\pcol@do@mpbout@i!, % \!\pcol@sync!, % \!\pcol@flushcolumn!, % \!\pcol@measurecolumn!, % \!\pcol@synccolumn!, % \!\pcol@makeflushedpage!, % \!\pcol@imakeflushedpage!, % \!\pcol@iflushfloats!, % \!\pcol@freshpage!, % \!\pcol@output@end!, % \!\pcol@invokeoutput!, % \!\pcol@zparacol!, % \!\pcol@setcolwidth@r!, % \!\pcol@setcolwidth@s!, % \!\pcol@setcw@scan!, % \!\pcol@setcw@calcf!, % \!\pcol@synccounter!, % \!\pcol@com@syncallcounters!, % \!\pcol@stepcounter!, % \!\pcol@com@switchcolumn!, % \!\pcol@sptext!, % \!\pcol@visitallcols!, % \!\pcol@ifootnote!, % \!\pcol@ifootnotemark!. % \!\pcol@swapcolumn!, % \!\pcol@set@color@push!, % \end{quote} % % \item[\Uidx{\!\tw@!}] % is a \!\chardef! register to have 2. It is used in \!\pcol@setcurrcol! to % let $\cc_c(\sw)=2$ when $\CSIndex{if@nobreak}=\true$ but % $\CSIndex{if@afterindent}=\false$, in % $\!\pcol@setcw@calcf!\\\$ to calculate $x\cdot2^k$, $y/2^k$ % and $(x/y)\cdot2^k$ with various $k$, and in \!\pcol@swapcolumn! to % calculate $\Cto-(c'-\Cfrom)-2=c-1=c^g$ for the \csepgap{} ordinal $c^g$ % physically following the column $c$ at the position $c'$. % % \item[\Uidx{\!\m@ne!}] % is a \!\count! register to have $-1$. It is used in the following macros. %  % \begin{itemize} % \item % \!\pcol@setpnoelt!, \!\pcol@nextpelt!, \!\pcol@getpelt! and % \!\pcol@setmpbelt! to decrement % \!\@tempcnta! which initially has $p-\pbase$ for a page $p$. % % \item % \!\pcol@bg@paint@i! to decrement $\CBto$ by one locally to have the column % scanning range $\LBRP\CBfrom{\CBto{-}1}$. % % \item % \!\pcol@iscancst! to decrement $\npop$ by one. % % \item % \!\pcol@do@mpbout@i! to let \!\@tempcnta! have it to indicate left margin. % % \item % \!\pcol@setcolwidth@r! to calculate $\Cto-\Cfrom-1$. % % \item % $\!\pcol@setcw@calcf!\\\$ in \!\@whilenum! loops to % calculate $z'/2^k$ and $z'/2{k-16}$ where $z'/2^k\approx x/y$. % % \item % \!\pcol@iadjustfnctr! to decrement \!\c@footnote!. % \end{itemize} % % \item[\Uidx{\!\sixt@@n!}] % is a \!\chardef! register to have 16. It is used in % $\!\pcol@setcw@calcf!\\\$ to calculate % $Z=z\times1\,|pt|=z'\cdot2^{16-k}$ where $z'/2^k\approx x/y$. % % \item[\Uidx{\!\@m!}] % is a \!\mathchardef! register to have 1000. It is used in % \!\pcol@synccolumn! and \!\pcol@output@end! to let % $\!\prevdepth!=1000\,|pt|$ on a \sync{}ation or the closing \env{paracol} % environment with an empty main vertical list, and in % \!\pcol@setcw@getspec@i! to add 1000\,|pt| to stretch and shrink % components of \!\@tempskipa! having a column\slash gap specification to % make it sure the skip register has those components. % % \item[\Uidx{\!\@M!}] % is a \!\mathchardef! register to have 10000. It is used in the following % macros %  % \begin{itemize} % \item % \!\pcol@ShowBox! to let \!\showboxdepth! and \!\showboxbreadth! have % 10000 for full logging of a box. % % \item % \!\pcol@output! to examine if $\!\outputpenalty!<-10000$ to mean a special % \!\output! request. % % \item % \!\pcol@specialoutput! to let $\!\outputpenalty!=-10000$ to tell % \!\pcol@output! that the special \!\output! request is our own. % % \item % \!\pcol@makenormalcol! and \!\pcol@deferredfootins! to let \!\vbadness! % have 10000 temporarily to avoid underfull messages. % % \item % \!\pcol@synccolumn! to bias \!\pcol@textfloatsep! by 10000\,|pt| to % indicate a \colpage{} has an \mvlfloat{} and in \!\pcol@cflt! and % \!\pcol@addflhd! to remove the bias. % % \item % \!\pcol@switchcol! and \!\pcol@flushclear! to put \!\penalty!|-10000| for % forced page break. % % \item % $\!\pcol@setcw@calcf!\\\$ to let $Z=z\times1\,|pt|=10000\,|pt|$ % if $x/y$ is too large. % \end{itemize} % % \item[\Uidx{\!\@Mii!}] % is a \!\mathchardef! register to have 10002. It is used in % \!\pcol@end@dblfloat! to examine if $\!\@floatpenalty!=-10002$ to mean the % float environment to be closed is given in horizontal mode. % % \item[\Uidx{\!\@Miv!}] % is a \!\mathchardef! register to have 10004. It is used in \!\pcol@output! % to examine if $\!\outputpenalty!=-10004$ for a dummy \!\output! request % made by \LaTeX's float-related macros and our \!\pcol@invokeoutput! to % ensure the real request is not eliminated when it is made at the very % beginning of a page or a \colpage. It is also used in % \!\pcol@specialoutput! for footnote logging when % $\!\outputpenalty!=-10004$. % % \item[\Uidx{\!\@MM!}] % is a \!\mathchardef! register to have 20000. It is used in % \!\pcol@fntextbody! to let \!\floatingpenalty! have it for footnote % typesetting. % % \item[\Uidx{\!\@beginparpenalty!}] % is a \!\count! register to have the page-break penalty inserted before the % first \!\item! of each \env{list}-like environment. The penalty is % determined in class files and is, for example, $-\!\@lowpenalty!=-51$ with % \textsf{article.cls}. It is referred to and inserted by \!\pcol@zparacol! % when it finds the \env{paracol} environment to start is at the very % beginning of a \env{list}-like environment. % % \item[\Uidx{\!\@floatpenalty!}] % is a \!\count! register to have the penalty code -10002 or -10003 given by % \!\@xfloat! at the beginning of a float environment according to the % environment is in horizontal or vertical mode respectively, or by % \!\marginpar! for a marginal note in the same meaning. It is % referred to by \!\pcol@end@dblfloat! to insert the penalty, and by % \!\pcol@xympar! to confirm \!\marginpar! is error free. % % \item[\Uidx{\!\@topnum!}] % is a \!\count! register to have the maximum number of top floats which the % \ccolpage{} can accept further. It is used in \!\pcol@setcurrcol! % and \!\pcol@iigetcurrcol! to save\slash restore it into\slash from % $\cc_c(\tn)$. The macro \!\pcol@synccolumn! also lets $\!\@topnum!=0$ to % inhibit top-float insertions in the \ccolpage{} any more after a % \sync{}ation. % % \item[\Uidx{\!\@botnum!}] % is a \!\count! register to have the maximum number of bottom floats which % the \ccolpage{} can accept further. It is used in \!\pcol@setcurrcol! % and \!\pcol@iigetcurrcol! to save\slash restore it into\slash from % $\cc_c(\bn)$. % % \item[\Uidx{\!\@colnum!}] % is a \!\count! register to have the maximum total number of floats which % the \ccolpage{} can accept further. It is used in \!\pcol@setcurrcol! % and \!\pcol@iigetcurrcol! to save\slash restore it into\slash from % $\cc_c(\cn)$. % % \item[\Uidx{\!\col@number!}] % is a \!\count! register to have the number of columns. It is let have 1 % by \!\pcol@zparacol! and \!\pcol@sptext! regardless the real number of % columns $\C$ in order to keep \!\maketitle! from putting the title by % \!\twocolumn!. % % \item[\Uidx{\!\c@page!}] % is \LaTeX's counter \Uidx{\counter{page}} being a \!\count! register to % have the page number. It is referred to by \!\pcol@setpnoelt!, and % \!\pcol@output@start! to let $\pp^p(p)=\page(p)$. The macro % \!\pcol@startpage! reload the register from $\pp^p(\ptop{-}1)$ and then % increment it by one usually but two in \npaired{} \parapag{}ing, and % repeat $\pp^p(\ptop)=\page(\ptop)$ and incrementing $\page(p)$ for each % \fpage{}s of \pwise{} floats. Reloading $\page(p)$ to the register from % $\pp^p(p)$ is also done by \!\pcol@getpelt! for macros using % \!\pcol@getcurrpage!, and by \!\pcol@outputelt!, \!\pcol@sync! and % \!\pcol@makeflushedpage! by \!\pcol@getcurrpinfo!. Then the register is % referred to by the following macros to examine its parity. %  % \begin{itemize} % \item % Our own \!\@outputpage! to give $\page(p)$ or $\page(p)+1$ to % \!\pcol@outputpage@l! and \!\pcol@outputpage@r! which finally let the % register have the value to be referred to by \!\pcol@@outputpage! being % \LaTeX's \!\@outputpage!. % % \item % \begin{Sloppy}{2800}% % \!\pcol@bg@swappage! to determine the values of \!\pcol@bg@leftmargin! % and \CSIndex{ifpcol@bg@@swap} with other factors. % \end{Sloppy} % % \item % \!\pcol@shiftspanning! to decide the necessity of shifting \mctext{} left % with \cswap{}, examining {\em raw} \!\c@page! at the \!\output! request to % close the \mctext{} rather than $\pp^p(\ptop)$ which will have the correct % value with respect to possible jump {\em after} the macro completes its % work. % % \item % \!\pcol@addmarginpar! to determine the margin to which a marginal note % goes. % % \item % \!\pcol@do@mpbout@i! to determine which of $\mpb_L^l$ or $\mpb_L^r$ is the % target of the operation specified by \!\pcol@do@mpbout@elem!. % % \item % $\!\pcol@swapcolumn!\\\<\Cfrom\>\<\Cto\>$ to determine $c_2$ % for $c_1$ if \cswap{} is in effect. % \end{itemize} %  % In addition, to do the parity examination in \!\pcol@bg@swappage! above % correctly, the macros \!\pcol@ioutputelt!, \!\pcol@makeflushedpage!, % \!\pcol@imakeflushedpage!, \!\pcol@iflushfloats! and \!\pcol@output@end! % temporarily increment the register by one when they are working on a right % \npaired{} \parapag{}e. % % The other users are \!\localcounter!\marg{ctr} to check % $\arg{ctr}\neq\counter{page}$, \!\pcol@remctrelt! to let % $|\cl@|{\cdot}\theta=\!\pcol@stepcounter!\Arg{\theta}$ %  % \SpecialArrayIndex{\theta}{\cl@} %  % unless $\theta=\counter{page}$, and \!\pcol@FF! to write it to a log file % as a part the logging information of memory leak debugging. % % \item[\Uidx{\!\c@footnote!}] % is \LaTeX's counter \Uidx{\counter{footnote}} being a \!\count! register % to have the footnote number. It is referred to by \!\pcol@zparacol! to % let $\bf=\!\pcol@footnotebase!$ have its value, by \!\pcol@calcfnctr! to % calculate the footnote ordinal which the one of its invoker % \!\pcol@iadjustfnctr! sets into the register, and by \!\endparacol! to let % the register have $\bf+\nf=\!\pcol@footnotebase!+\!\pcol@nfootnotes!$. % % \item[$\cs{c@}{\cdot}\theta$] % \SpecialArrayUsageIndex{\theta}{\c@} %  % is a \!\count! register being \LaTeX's counter $\theta$. It is referred % to by \!\pcol@savectrelt! to let $\val_c(\theta)=\Val(\theta)$ for saving % it in $\Cc_c$, by \!\pcol@cmpctrelt! to examine if % $\val_0(\theta)=\Val(\theta)$ to detect a modification outside % \env{paracol} environment, and by \!\pcol@syncctrelt! to let % $\val_c(\theta)=\Val(\theta)$ for all $c$ for \csync{}. It is also % referred to by \!\pcol@remctrelt! and \!\localcounter! to examine if % $\theta=\counter{page}$. The macros \!\pcol@setctrelt! and % \!\pcol@stpldelt! restore the value of the counter from $\val_c(\theta)$, % while \!\pcol@stpclelt! lets $\Val(\theta)=0$ for zero-clearing of % descendent counters. % % \item[\Uidx{\!\count@!}] % is a \!\count! register for temporary use. It is used in % \!\pcol@iscancst! to have $m$ of $\mcelt_{i,m}$, % \!\pcol@addmarginpar! to have the physical column position of the current % column $c$ in which \!\marginpar! is given, and in % $\!\pcol@extract@fil@i!\\!\@nil!$ to extract the unit of the stretch % component $s$ of a glue. % % \item[\Uidx{\!\@tempcnta!}] % is a \!\count! register for temporary use. The usages of this register % are as follows. %  % \begin{itemize} % \item % In \!\pcol@F@count!, it is used to measure the cardinality of % \!\@freelist!. % % \item % In \!\pcol@makecol!, it is used to keep $\page(\ptop)$ gotten by % \!\pcol@getcurrpinfo! until we store it back by \!\pcol@defcurrpage!. % % \item\begin{Sloppy}{3700} % In \!\pcol@setpageno!, \!\pcol@setpnoelt!, \!\pcol@nextpage!, % \!\pcol@nextpelt!, \!\pcol@getcurrpage!, \!\pcol@getpelt!, % \!\pcol@addmarginpar! and \!\pcol@setmpbelt!, it has $p-q$ when we scan % $\pp(q)$ for all $q\in[\pbase,\ptop]$ and the \ccolpage{} is at $p$. % \end{Sloppy} % % \item % In \!\pcol@checkshipped!, it has $c$ when we scan $\S_c$ for all % $c\In0\C$ to examine if all of them are not empty and thus we have pages % to be shipped out. % % \item % In \!\pcol@ioutputelt!, it has $c'$ when we scan $\s_c(q)$ for all % $c\In0\CL$ or $c\In\CL\C$ to build the shipping out image of a page $q$, % where $c=c'$ or $c=\Cto-1-(c'-\Cfrom)$ where % $(\Cfrom,\Cto)\in\{(0,\CL),(\CL,\C)\}$. % % \item % In \!\@outputpage!, it has $\page(p)$ or $\page(p)+1$ to be given to % \!\pcol@outputpage@l! or \!\pcol@outputpage@r! as their argument when they % are used to ship out the second (not always right) component of a % \parapag{}e pair. % % \item % In \!\pcol@bg@columnleft!, it has a value in $\LBRP\CBfrom{c}$ to sum up % the width of columns and \csepgap{}s in the range. % % \item % In \!\pcol@output@switch!, it is used to have $\page(p)$ obtained by % \!\pcol@getcurrp~info! and simply to store the value in $\pp^p(p)$ by % \!\pcol@defcurrpage! when we use these macros to add an element to % $\pp^s(p)$ and/or let $\pp^f(p)=\!\footins!$. % % \item % In \!\pcol@setcurrcol!, it has the code calculated from % \CSIndex{if@nobreak} and |\if@after|\~|indent| to be saved in % $\cc_c(\sw)$. %  % \SpecialIndex{\if@afterindent} % % \item % In $\!\pcol@scancst!\arg{box}$, it is let have % $\arg{box}\in\{\!\pcol@colorins!,|\pcol@color|\~|stack@saved|\}$ and then is % referred to in \!\pcol@iscancst!. % \SpecialIndex{\pcol@colorstack@saved} % % \item % In \!\pcol@addmarginpar! besides the page scan shown above, it is used to % scan all columns whose physical position is left from the current % column $c$ to measure the distance between the left edges of the leftmost % column and $c$. % % \item % In \!\pcol@do@mpbout@i!, it has $\pm1$ according to the margin ($\rm % left=-1$) which marginal notes outside \env{paracol} environments goes % to. % % \item % In \!\pcol@flushcolumn!, it is used to throw $\page(\ptop)$ away when we % get it by \!\pcol@getcurrpinfo! because we don't need it. % % \item % In \!\pcol@setcolwidth@r!, it has $c$ to scan fractions $r_d$ where % $d=c-\Cfrom$ in its argument $\arg{ratio}$ specified by \!\columnratio!, % and then to distribute the unspecified portion of \!\textwidth! evenly to % $\w_c$ for all $c\In{\Cfrom{+}k{+}1}\Cto$, where $k$ is the number of % fractions and $(\Cfrom,\Cto)\in\{(0,\CL),(\CL,\C)\}$. % % \item % In $\!\pcol@setcw@scan!\<\Cfrom\>\<\Cto\>\Arg{spec}$, it has $c$ for two % loops for $c\In\Cfrom\Cto$ to add `|,|' to the tail of $\arg{spec}$ as % many as $k=\Cto-\Cfrom$ and then to process first $k$ elements in % $\arg{spec}$, and is referred to by \!\pcol@setcw@set! invoked in the % second loop. % % \item % In $\!\pcol@setcw@calcf!\\\$, it used to calculate and to have % $k$ such that $z'/2^k\approx x/y$. % % \item % In \!\pcol@cmpctrelt!, it has $\Val(\theta)$ of a counter $\theta$ to be % compared with $\val_0(\theta)$. % % \item % In \!\pcol@com@switchcolumn!, it has $(c+1)\bmod\C$ being the target of % \cswitch{}. % % \item % In \!\pcol@sptext!, it temporarily has $d$ being the target of \cswitch{} % during we let \!\pcol@nextcol! have 0 to visit the leftmost column % to put a \mctext{}. % % \item % In \!\pcol@visitallcols!, it has $d\In0\C-\{c\}$ being the columns to be % visited for \cscan{}ning. % % \item % In \!\definecolumnpreamble!\marg{c}\marg{pream}, $c$ is assigned to the % register to ensure $c$ is a number. % % \item % In \!\pcol@calcfnctr!, it has the footnote ordinal calculated by the % macro to be referred to by the invokers \!\pcol@iadjustfnctr! and % \!\pcol@iifootnotetext!. % % \item % In $\!\marginparthreshold!\Arg{t_l}|[|t_r|]|$ it is let have $t_l$, while % in the related macro $\!\pcol@marginparthreshold!|[|t_r|]|$ it is let have % $t_r$. % \end{itemize} % % \item[\Uidx{\!\@tempcntb!}] % is a \!\count! register for temporary use. It is used in the following % macros. %  % \begin{itemize} % \item % In \!\pcol@ioutputelt! it has $c$, while in \!\pcol@imakeflushedpage! and % \!\pcol@iflushfloats! it has $c'$, to have $c=c'$ or $c=\Cto-1-(c'-\Cfrom)$ % according to \cswap{} for $c'$-th iteration of column scanning loop for % $c'\In\Cfrom\Cto$, where $(\Cfrom,\Cto)\in\{(0,\CL),(\CL,\C)\}$. % % \item % In \!\pcol@scancst! and \!\pcol@iscancst!, it has $\npop$. % % \item % In \!\pcol@addmarginpar!, it is let have the column number $d$ whose % physical position is left from the current column $c$ to measure the % distance between the left edges of the leftmost column and $c$. % % \item % In \!\pcol@sync! and \!\pcol@measurecolumn!, it has the (so-far) tallest % column which gives $\VP$. % % \item % In \!\pcol@setcolwidth@r!, it has $\Cto-\Cfrom-1$ then $\Cto-1$ and % finally $\Cto-\min(\Cfrom{+}k,\,\Cto{-}1)$, where $k$ is the number of % fractions given in the argument of \!\columnratio! and % $(\Cfrom,\Cto)\in\{(0,\CL),(\CL,\C)\}$. % % \item % In $\!\pcol@setcw@calcf!\\\$, at first it is used to calculate % $z'/2^k\approx x/y$ and then to calculate % $Z=z\times1\,|pt|=z'\cdot2^{16-k}$. % % \item % In \!\pcol@visitallcols!, it has $c=\!\pcol@currcol!$ to exclude it from % the \cscan{} targets. % \end{itemize} % \end{description} % % % % \subsubsection{Dimension Registers} % % \begin{description} % \item[\Uidx{\!\vsize!}] % is \TeX's primitive register to have the height of a page or a \colpage{} % being built. It is let be \!\@colroom! or \!\maxdimen! by % \!\pcol@output!. % % \item[\Uidx{\!\hsize!}] % is \TeX's primitive register to have the width of a page or a \colpage{} % being built. It is let be $\w_c$ by \!\pcol@invokeoutput! to restart (or % stay in) the column $c$, be \!\textwidth! by \!\pcol@sptext! for \mctext, % and be either of \!\textwidth! or $\w_c$ by \!\pcol@fntextbody! according % to the footnote typesetting being \scfnote{} or \mcfnote{} respectively. % % \item[\Uidx{\!\maxdepth!}] % is \TeX's primitive register to have the maximum depth of the page being % built. In \LaTeX, it is assumed that its value is fixed at % \beginenv{document}, in which the value is saved into \!\@maxdepth!, for % the typesetting throughout the document, unless a bottom float is added to % a page in which the register is let have 0 until it is shipped out. This % temporary setting for a page with bottom floats has some reasonability but % its implementation for \env{paracol} environments having \cswitch{} % from/to a \colpage{} with bottom floats to/from another one without % them is too costly\footnote{ %  % That is, we would need to incorporate \cs{maxdepth} as a member of % \cctext, but we don't because the idea of temporary setting itself is too % vague to pay the effort and a precious membership in \cctext.}. %  % Therefore, we let the register have \!\@maxdepth! in \!\pcol@output! and % \!\pcol@combinefloats! to cancel the temporary setting done in % \!\@addtobot! for the references by \TeX's page builder and \!\@cflt! % respectively. % % \item[\Uidx{\!\boxmaxdepth!}] % is \TeX's primitive register to have the maximum depth of \!\vbox!es. % The macros \!\pcol@cflt!, \!\pcol@opcol!, % \!\pcol@ioutputelt!, \!\pcol@combine~floats!, \!\pcol@output@flush! and % \!\pcol@output@clear! let it be \!\@maxdepth! for the boxes having a % completed \colpage{} or page to cap the depth of the box. The macro % $\!\pcol@@makecol!\$ also do that when $d=\!\@maxdepth!$ but it can be % $d=0$ when it is invoked to build \lpage{}. % % \item[\Uidx{\!\splitmaxdepth!}] % is \TeX's primitive register to have the maximum depth of the \!\vbox! % being the first half of a box being split. It is used in % \!\pcol@deferredfootins! to cap the depth of the first half of deferred % footnotes split from $\df$, and in \!\pcol@fntextbody! to let it have the % depth of \!\strutbox!. % % \item[\Uidx{\!\prevdepth!}] % is \TeX's primitive register to have the depth of the box which just has % been added to a vertical list, or to be given to \TeX's vertical list % builder for the calculation of the vertical skip inserted below the last % box. The macro \!\pcol@invokeoutput! refers to it to save its value in % \!\pcol@prevdepth! before putting a dummy \!\vbox! and making a \!\output! % request, and then let it have \!\pcol@prevdepth! which is given by % \!\output! routine for the column that we resume. The macro % \!\pcol@zparacol! also refers to it to save it in \!\pcol@firstprevdepth! % for the \preenv. % % \item[\Uidx{\!\vfuzz!}] % is \TeX's primitive register to have the threshold height of overfull % messaging. It is set to 0 in $\!\pcol@ShowBox!\arg{b}$ to ensure overfull % for any \!\box! $b$ of non-null height. % % \item[\Uidx{\!\maxdimen!}] % is a \!\dimen! register to have $16383.99999\,|pt|$ being the largest % legal dimensional value. The usages of this register are as follows. %  % \begin{itemize} % \item % For the \!\insert! register set $\!\pcol@colorins!=\cstraw$, % \!\dimen!\!\pcol@colorins! is let be \!\maxdimen! for the consistency with % our intention that a \colpage{} can have virtually infinite number of % \!\insert!ions for text coloring. % % \item % In \!\pcol@output!, it is set into \!\vsize! when $\!\outputpenalty!=-10004$ % for the dummy \!\output! request so that no page break should occur % between the dummy and real requests. % % \item % Our own \!\dimen! register \!\pcol@textfloatsep! has \!\maxdimen! if a % \colpage{} does not have \sync{}ation points to let top floats are % inserted in usual way. Therefore, \!\pcol@floatplacement! and % \!\pcol@zparacol! let the register have \!\maxdimen! as the initial % value. Then the macros \!\pcol@makecol! and \!\pcol@combinefloats! % examine if $\!\pcol@textfloatsep!=\!\maxdimen!$ to determine the operation % type of top float insertion, while \!\pcol@synccolumn! does that to know % if it is flushing a \colpage{} with a \sync{}ation point or is setting the % first \sync{}ation point in the \colpage{}. The macro \!\pcol@addflhd! % also examines it for the measurement of the combined height of top and % bottom floats, while \!\pcol@measurecolumn! gives it \!\maxdimen! as its % third argument for bottom floats. % % \item % The \pctext{} $\pp^h(p)$ has $-\!\maxdimen!$ if the page is a \fpage{}. % The macro \!\pcol@startpage! makes that when it creates such a page. % % \item % Our own \!\pcol@prevdepth! and that saved in $\cc_c(\pd)$ have % \!\maxdimen! if the main vertical list is empty at a \sync{}ation. The % macro \!\pcol@measurecolumn! makes that when it finds an empty list. % % \item % The \cctext{} $\cc_c(\tr)$ may have \!\maxdimen! if the column $c$ has a % \fcolumn{} in the \lpage{} of a \env{paracol} environment and the floats in % it can be put as top floats. The macro \!\pcol@makefcolumn! makes this % special assignment, and \!\pcol@flushcolumn! and \!\pcol@imakeflushedpage! % examine it. % % \item % The macro \!\pcol@makefcolelt! let the room for floats in a \fpage{} be % $-\!\maxdimen!$ if it finds no further floats can be added to the page. % % \item % At a \sync{}ation, we measure the maximum combined size of top floats and % the main vertical list $\VT$, that of footnotes and bottom floats $\VB$, % that of four items $\VP$, and $\VPP$ being $\VP$ or $\VP+\!\textfloatsep!$ % according to the existence of bottom floats. We also let $\DT$ and $\DP$ % be the minimum depth of the \colpage{}s which gives $\VT$ and $\VPP$ % respectively. For the measurement, the macro \!\pcol@sync! lets % $\VT=\VB=\VP=\VPP=-\!\maxdimen!$ and $\DT=\DP=\!\maxdimen!$ as their % initial values. Then the macro \!\pcol@synccolumn! examines if % $\DT=\!\maxdimen!$ to mean the \sync{}ation point is set just below the % top floats of a column whose main vertical list is empty. On the other % hand, \!\pcol@makeflushedpage! and \!\pcol@output@end! examine if % $\VPP=-\!\maxdimen!$ to mean the last \colpage{}s are empty. % \end{itemize} % % \item[\Uidx{\!\linewidth!}] % is a \!\dimen! register for an API parameter of \LaTeX{} to have the width % of a line possibly shorter than \!\columnwidth! in \env{list}-like % environments. It is let have $\w_c-\lrm$ by % \!\pcol@invokeoutput! for the outermost paragraphs in \env{paracol} % environment, where $\lrm=\!\pcol@lrmargin!=\!\textwidth!-l$ which % \!\pcol@zparacol! lets have to represent the left-plus-right margin of the % \env{list}-like environment, whose \!\linewidth! is $l$, enclosing % \env{paracol} if any. The macro \!\pcol@sptext! also sets the register % temporarily for \mctext{}s but letting it have $\!\textwidth!-\lrm$. % % \item[\Uidx{\!\footnotesep!}] % is a \!\dimen! register for an API parameter of \LaTeX{} to have the % vertical space inserted in a footnote when it is split into two or more % pages. It is used in \!\pcol@fntextbody! to \!\splittopskip! have it, % and to make the first line of the footnote is at least as tall as the % amount in the register. % % \item[\Uidx{\!\topmargin!}] % is a \!\dimen! register for an API parameter of \LaTeX{} to have the width % (height) of the top margin minus 1\,inch. The register is used as an % element of \!\pcol@bg@pagetop! to calculate the distance from the origin % at the left-top corner of text area to the top edge of a page. The % other users are \!\pcol@ioutputelt! and \!\pcol@makeflushedpage! % temporarily add the height-plus-depth of $\pp^b(p)$ to the register to % make the calculation biased shifting the origin to the left-top corner of % column area, i.e., below $\pp^b(p)$. The macro \!\@outputpage! also % refers to the register together with \!\headheight! and \!\headsep! to % calculate the distance from the page top (ignoring 1\,inch shift) to the % text area top. % % \item[\Uidx{\!\oddsidemargin!}] % is a \!\dimen! register for an API parameter of \LaTeX{} to have the width % of the left margin minus 1\,inch for two-sided odd-numbered pages and % all single-sided pages. The register is used together with % \!\evensidemargin! in \!\pcol@outputpage@l!, \!\pcol@outputpage@r! and % \!\pcol@bg@swappage! to decide the left margin of the page they are % working on. % % \item[\Uidx{\!\evensidemargin!}] % is a \!\dimen! register for an API parameter of \LaTeX{} to have the width % of the left margin minus 1\,inch for two-sided even-numbered pages. The % register is used together with \!\oddsidemargin! in \!\pcol@outputpage@l!, % \!\pcol@outputpage@r! and \!\pcol@bg@swappage! to decide the left margin % of the page they are working on. % % \item[\Uidx{\!\headheight!}] % is a \!\dimen! register for an API parameter of \LaTeX{} to have the % height of page headers. The register is used together with \!\topmargin! % and \!\headsep! as an element of \!\pcol@bg@pagetop! and in \!\@outputpage! % to calculate the distance from the real and imaginary page top to the text % area top respectively. % % \item[\Uidx{\!\headsep!}] % is a \!\dimen! register for an API parameter of \LaTeX{} to have the % vertical distance from the bottom of a page header to the text area top. % The register is used together with \!\topmargin! and \!\headheight! as an % element of \!\pcol@bg@pagetop! and in \!\@outputpage! to calculate the % distance from the real and imaginary page top to the text area top % respectively. % % \item[\Uidx{\!\textheight!}] % is a \!\dimen! register for an API parameter of \LaTeX{} to have the % height of text area in a page. The register is referred to by % \!\pcol@output! to examine if a page is very short, by \!\pcol@getpinfo!, % \!\pcol@startpage!, \!\pcol@flushfloats! and \!\pcol@output@end! to let % \!\@colht! be it for a page without \spanning{} (so far), by % \!\pcol@outputelt!, \!\@outputpage!, \!\pcol@output@flush! and % \!\pcol@output@clear! to build a page to be shipped out, by % \!\pcol@bg@textheight! to calculate $\HT$, and by \!\pcol@fntextbody! to % cap the height of a footnote. % % \item[\Uidx{\!\textwidth!}] % is a \!\dimen! register for an API parameter of \LaTeX{} to have the width % of a page, which we occasionally refer to as $\WT$. The register is % referred to by \!\pcol@ioutputelt!, \!\pcol@imakeflushedpage! and % \!\pcol@iflushfloats! to build a \!\hbox! of \!\textwidth! wide to have % all columns (in a left or right \parapag{}e). It also referred to by % following macros; \!\pcol@bg@swappage! to calculate the right margin for % \mirror{}ed \bgpaint; \!\pcol@bg@@r!, \!\pcol@bg@@f!, \!\pcol@bg@@n!, % \!\pcol@bg@@p! and \!\pcol@bg@@s! to specify the width of \bground{} of % \pwstuff{} to be painted; \!\pcol@shiftspanning! to calculate the % left-shift amount of a \mctext{} in \cswap; \!\pcol@addmarginpar! to % measure the distance between the right edges of the rightmost and current % columns; \!\pcol@zparacol! for the calculation of % $\lrm=\!\pcol@lrmargin!$; \!\pcol@setcolwidth@r! for the calculation of % $\w_c$ for all $c\In0\CL$ or $c\In\CL\C$; \!\pcol@setcw@calcfactors! for % the calculation of $\WT/W$ and $(\WT-W)/F$; \!\pcol@sptext!, % \!\footnoterule! of \env{paracol}'s local and \!\endparacol! to set it % in \!\columnwidth!; and \!\pcol@fntextbody! to set it in \!\hsize! if % \Scfnote{} typesetting is in effect. % % \item[\Uidx{\!\columnwidth!}] % is a \!\dimen! register for an API parameter of \LaTeX{} to have the width % of a column. The register is let have $\w_c$ by \!\pcol@getcurrcol! for % the column $c$, then is referred to by the following macros; % \!\pcol@shiftspanning! to calculate the left-shift amount of a \mctext{} in % \cswap; \!\pcol@addmarginpar! to measure the distance between the right % edges of the rightmost and current columns; \!\pcol@imakeflushedpage! and % \!\pcol@iflushfloats! to put each \colpage{} into a \!\hbox! of $\w_c$ wide % for shipping a page out; \!\pcol@invokeoutput! to let \!\linewidth! and % \!\hsize! have the value of or based on it; and \!\pcol@fntextbody! to % let \!\hsize! have it for \Mcfnote{} typesetting. The register is also % let have \!\textwidth! by \!\footnoterule! of \env{paracol}'s local % defined in \!\pcol@zparacol! if \Scfnote{} typesetting is in effect, by % \!\pcol@sptext! for \mctext{}s, and by \!\endparacol! for \postenv. % % \item[\Uidx{\!\columnsep!}] % is a \!\dimen! register for an API parameter of \LaTeX{} to have the width % of \csepgap{}s. It is referred to by \!\pcol@setcolwidth@r! to % calculate $\w_c$ for all $c\In0\CL$ or $c\In\CL\C$, and by % \!\pcol@setcw@getspec! as the default width of \csepgap{}s. % % \item[\Uidx{\!\columnseprule!}] % is a \!\dimen! register for an API parameter of \LaTeX{} to have the width % of the rules to be drawn in \csepgap{}s. It is referred to by % \!\pcol@buildcolseprule! and \!\pcol@buildcselt! to draw the rule, and by % \!\pcol@hfil! to examine if it is positive to mean the rule is really % drawn and if so to add skips of $-\!\columnseprule!/2$ to surround the % rule to nullify the width of the rule. % % \item[\Uidx{\!\marginparwidth!}] % is a \!\dimen! register for an API parameter of \LaTeX{} to have the width % of a marginal note. It is temporarily modified by \!\pcol@addmarginpar! % so that a left marginal note is placed appropriately. % % \item[\Uidx{\!\marginparsep!}] % is a \!\dimen! register for an API parameter of \LaTeX{} to have the % distance between a marginal note and text area. It is temporarily % modified by \!\pcol@addmarginpar! so that a right marginal note is placed % appropriately. % % \item[\Uidx{\!\marginparpush!}] % is a \!\dimen! register for an API parameter of \LaTeX{} to have the % minimum vertical distance between two marginal notes. It is referred to % by \!\pcol@addmarginpar! to find a place for a marginal note and remember % the place in $\pp^m(p)$. % % \item[\Uidx{\!\paperheight!}] % is a \!\dimen! register for an API parameter of \LaTeX{} to have the height % of physical pages $\HP$. It is referred to by \!\pcol@bg@paperheight! % to calculate $\HP-2\WR$. % % \item[\Uidx{\!\paperwidth!}] % is a \!\dimen! register for an API parameter of \LaTeX{} to have the width % of physical pages $\WP$. It is referred to by \!\pcol@bg@swappage! to % calculate the right margin for \mirror{}ed \bgpaint, and by % \!\pcol@bg@paperwidth! to calculate $\WP-2\WR$. % % \item[\Uidx{\!\z@!}] % is a \!\dimen! register to have 0\,|pt| to initialize \!\pagerim!, % \!\belowfootnoteskip! and \!\skip!\!\pcol@colorins! at their declarations, % and is used in the following macros. %  % \begin{quote}\raggedright % \!\pcol@ShowBox!, % \!\pcol@makecol!, % \!\pcol@combinefloats!, % \!\pcol@nextpelt!, % \!\pcol@floatplacement!, % \!\pcol@startpage!, % \!\pcol@restartcolumn!, % \!\pcol@outputelt!, % \!\pcol@ioutputelt!, % \!\pcol@buildcolseprule!, % \!\pcol@buildcselt@S!, % \!\pcol@buildcselt!, % \!\@outputpage!, % \!\pcol@startcolumn!, % \!\pcol@bg@paint@i!, % \!\pcol@bg@paintregion!, % \!\pcol@output@start!, % \!\pcol@putbackmvl!, % \!\pcol@iscancst!, % \!\pcol@deferredfootins!, % \!\pcol@combinefootins!, % \!\pcol@addmarginpar!, % \!\pcol@getmparbottom!, % \!\pcol@sync!, % \!\pcol@measurecolumn!, % \!\pcol@synccolumn!, % \!\pcol@makeflushedpage!, % \!\pcol@imakeflushedpage!, % \!\pcol@output@end!, % \!\pcol@invokeoutput!, % \!\pcol@setcolwidth@s!, % \!\pcol@setcw@calcfactors!, % \!\pcol@setcw@calcf!, % \!\pcol@extract@fil@ii!, % \!\pcol@sptext!, % \!\pcol@fntextbody!. % \!\pcol@marginpar!, % \!\pcol@icolumncolor!, % \!\pcol@set@color@push!, % \!\pcol@reset@color@pop!, % \!\pcol@reset@color@mpop!, % \!\pcol@backgroundcolor@iii!. % \end{quote} %  % It is also used to give the number 0 for the initializations of % \!\pcol@currcol!, \!\pcol@ncol!, \!\pcol@ncolleft! and % \!\count!\!\pcol@colorins! at their declarations, and in the following % macros. %  % \begin{quote}\raggedright % \!\pcol@ShowBox!, % \!\pcol@F@count!, % \!\pcol@makecol!, % \!\pcol@opcol!, % \!\pcol@setpnoelt!, % \!\pcol@nextpelt!, % \!\pcol@checkshipped!, % \!\pcol@getpelt!, % \!\pcol@outputelt!, % \!\pcol@ioutputelt!, % \!\@outputpage!, % \!\pcol@startcolumn!, % \!\pcol@output@start!, % \!\pcol@output@switch!, % \!\pcol@setcurrcol!, % \!\pcol@iscancst!, % \!\pcol@addmarginpar!, % \!\pcol@setmpbelt!, % \!\pcol@do@mpbout@i!, % \!\pcol@sync!, % \!\pcol@synccolumn!, % \!\pcol@makeflushedpage!, % \!\pcol@imakeflushedpage!, % \!\pcol@flushfloats!, % \!\pcol@iflushfloats!, % \!\pcol@freshpage!, % \!\pcol@output@end!, % \!\pcol@zparacol!, % \!\pcol@setcolwidth@r!, % \!\pcol@setcw@calcf!, % \!\pcol@synccounter!, % \!\pcol@com@syncallcounters!, % \!\pcol@stepcounter!, % \!\pcol@stpclelt!, % \!\pcol@com@switchcolumn!, % \!\pcol@switchcolumn!, % \!\pcol@sptext!, % \!\pcol@switchcol!, % \!\pcol@visitallcols!, % \!\pcol@xympar!, % \!\endparacol!. % \end{quote} % % \item[\Uidx{\!\p@!}] % \begin{Sloppy}{3950}% % is a \!\dimen! register to have 1\,|pt|. It is used in \!\pcol@ShowBox!, % \!\pcol@cflt!, \!\pcol@addflhd!, \!\pcol@synccolumn!, \!\pcol@output@end!, % \!\pcol@setcolwidth@s!, \!\pcol@setcw@getspec@i!, \!\pcol@setcw@fill! and % \!\pcol@setcw@calcf!, and the top level assignment to \!\@tempskipa! for % the invocation of \!\pcol@defkw!, as the shorthand of |pt|. % \end{Sloppy} % % \item[\Uidx{\!\@totalleftmargin!}] % is a \!\dimen! register to have the total size of the left margins of a % \env{list}-like environment and those surrounding it. It is given to % \!\parshape! by \!\pcol@invokeoutput! and \!\pcol@sptext! if \env{paracol} % is enclosed in a \env{list}-like environment. % % \item[\Uidx{\!\@themargin!}] % is a control sequence \!\let!-equal to \!\evensidemargin! for two-sided % even numbered pages or \!\oddsidemargin! for others. In % \!\pcol@outputpage@l! and \!\pcol@outputpage@r! it is bound to one of % \!\dimen! registers for the references in \!\pcol@outputpage@ev!\footnote{ %  % The reference in \CSIndex{pcol@@outputpage} being \LaTeX's % \CSIndex{@outputpage} is done after the macro itself makes the assignment, % which is of course consistent with those in our macros.}. % % \item[\Uidx{\!\@maxdepth!}] % is a \!\dimen! register to have \!\maxdepth! at \beginenv{document} to % recover the temporary update of \!\maxdepth! with 0 by \!\@addtobot! for % bottom float incorporation in a page. As discussed in the explanation of % \!\maxdepth!, in \env{paracol} environments \!\maxdepth! is let have % \!\@maxdepth! always by the assignments in \!\pcol@output! and % \!\pcol@combinefloats!. Other users, \!\pcol@cflt!, \!\pcol@opcol!, % \!\pcol@ioutputelt!, \!\pcol@combinefootins!, \!\pcol@output@flush! and % \!\pcol@output@clear!, let \!\boxmaxdepth! have \!\@maxdepth! so as to % limit the depth of boxes for a completed \colpage{} or page to the value % for page typesetting, while \!\pcol@flushcolumn! and % \!\pcol@imakeflushedpage! do that by \!\pcol@@makecol! giving the register % to it. The other usage of the register is to calculate \bgpaint{} % parameter $\HT$ by \!\pcol@bg@textheight!, and to determine the bottom % edge of the \bground{}s of columns and \csepgap{}s through the argument of % \!\pcol@buildcolseprule! given by \!\pcol@ioutputelt!, % \!\pcol@imakeflushedpage! and \!\pcol@iflushfloats!. The register is also % referred to by \!\pcol@unvbox@cclv! to go back the last baseline of the % main vertical list in \!\box!|255|, and by \!\pcol@deferredfootins! to let % \!\splitmaxdepth! have its value to cap the depth of the first half of % footnotes split from $\df$. % % \item[\Uidx{\!\@colht!}] % is a \!\dimen! register to have the height of columns in a page possibly % shrunk from \!\textheight! by \spanning. The usages of the register % are as follows. %  % \begin{itemize} % \item\begin{Sloppy}{1600} % In \!\pcol@startpage!, \!\pcol@output@start!, \!\pcol@flushfloats! and % \!\pcol@output@end!, it is initialized to \!\textheight!. In first two, % the value of the register is reduced to reflect \spanning{} if exists and % then set into $\pp^h(p)$, while the setting by the third is referred to by % its callee \!\pcol@iflushfloats!. % \end{Sloppy} % % \item % In \!\pcol@getpelt!, \!\pcol@sync!, \!\pcol@flushcolumn!, % \!\pcol@makeflushedpage! and \!\pcol@imakeflushedpage!, it is let have % $\pp^h(p)$. In addition \!\pcol@sync! examines if % $\!\@colht!<\VT+\VB+v(f)$, and \!\pcol@makefcolumn! uses it to initialize % the room of a \fcolumn{} as well as the height of $\cc_c(\vb)$ for it. % % \item % In \!\pcol@opcol!, it is used to add \!\pcol@clearcolorstack! to the % bottom of $\cc_c(\vb)$ whose height is \!\@colht!. % % \item % In \!\pcol@startcolumn!(*), \!\pcol@flushcolumn!(*) and % \!\pcol@freshpage!, it is used to let \!\@colroom! have it. % % \item % In \!\pcol@restartcolumn!(*), it is saved and restored for the use as the % height cap of deferred footnote \!\insert!ion in \!\pcol@deferredfootins! % because it can be shrunk by the non-deferred \Scfnote{}s. % % \item % In \!\pcol@output@flush! and \!\pcol@output@clear!, it is given to % \!\pcol@make~flushed~page! as its argument. The macro % \!\pcol@makeflushedpage!(*) lets \!\@colht! be the argument if it is less % than \!\@colht! and thus is given by \!\pcol@output@end!. % \end{itemize} %  % In addition, in the macros with `(*)' above and \!\pcol@makecol!, the % register is passed to \!\pcol@shrinkcolbyfn! to shrink the height in it % temporarily to keep the space required to put \Scfnote{}s in the page they % are working on, for the reference by starred macros themselves or % \!\@makecol! invoked in \!\pcol@makecol!. % % \item[\Uidx{\!\@colroom!}] % is a \!\dimen! register to have the height of a column possibly shrunk % from \!\@colht! by top and bottom floats. The register is initialized to % have \!\@colht! by \!\pcol@startcolumn!, \!\pcol@output@start!, % \!\pcol@flushcolumn! and \!\pcol@freshpage!, the last three of which also % save it into $\cc_c(\vb^r)$. This save operation is also done by % \!\pcol@output@switch! while restoring from it done by % \!\pcol@restartcolumn!, but the latter macro may shrink the amount in its % callee \!\pcol@putbackmvl! to capture a \mctext{} while the former cancel % this shrinkage. The macros \!\pcol@output! and \!\pcol@output@start! also % refer to this register to let \!\vsize! have it in the former and to % calculate the room for each \colpage{} in the \spage{} in the latter. The % macro \!\pcol@output@end! lets the register have \!\textheight! for the % \postenv{} because the \colpage{}s above it simply precedes the stuff in % the main vertical list. The other users \!\pcol@makefcolumn! and % \!\pcol@makefcolelt! use this register to accumulate the total size of % floats to be put in a \fcolumn{} temporarily. % % \item[\Uidx{\!\@pageht!}] % is a \!\dimen! register to be used in \LaTeX's \!\@specialoutput! to have % the height of \!\@holdpg!. It is referred to by \!\pcol@addmarginpar! to % determine the position at which a marginal note is placed. % We also use it as a scratchpad to have $\VP$ in \!\pcol@sync! and % \!\pcol@measurecolumn!, and to save $\pp^h(\ptop)$ in \!\pcol@flushcolumn! % for the reference in itself, and to do so in \!\pcol@makeflushedpage! for % \!\pcol@imakeflushedpage!. % % \item[\Uidx{\!\@pagedp!}] % is a \!\dimen! register to be used in \LaTeX's \!\@specialoutput! to have % the depth of \!\@holdpg!. However, we use it as a scratchpad in % \!\pcol@sync! and \!\pcol@measurecolumn! to have $\DP$, and in % \!\pcol@output@end! to have the value to be set in \!\pcol@prevdepth!. % % \item[\Uidx{\!\@toproom!}] % is a \!\dimen! register to have the room for top floats. The register is % saved in $\cc_c(\tr)$ by \!\pcol@setcurrcol! and restored from it by % \!\pcol@iigetcurrcol!. The macro \!\pcol@makefcolumn! uses this register % as a flag to indicate that $\cc_c(\tl)$ of the column $c$ having % $\cc_c(\tr)=\infty$ contains floats to be put in its last \fcolumn{} % possibly as top floats so that it is examined by \!\pcol@flushcolumn! and % \!\pcol@imakeflushedpage!, the former of which then lets $\cc_c(\tr)=0$ to % mean the floats are put in a \fcolumn{} in a non-\lpage{} by the macro. % % \item[\Uidx{\!\@botroom!}] % is a \!\dimen! register to have the room for bottom floats. The register % is saved in $\cc_c(\br)$ by \!\pcol@setcurrcol! and restored from it by % \!\pcol@iigetcurrcol!. % % \item[\Uidx{\!\@fpmin!}] % is a \!\dimen! register to have $\!\floatpagefraction!\times\!\@colht!$ % being the minimum total size of floats for which an ordinary (not flushed) % \fcolumn{} can be build. It is referred to by \!\pcol@makefcolumn! as the % threshold below which floats in the last \fcolumn{} can be put as top % floats. % % \item[\Uidx{\!\@mparbottom!}] % is a \!\dimen! register to have the bottom position of the last % \!\marginpar! stuff. Its value at \beginparacol{} is referred to by % \!\pcol@output@start! to let $\mpb_L^l$ or $\mpb_L^r$ of $\pp^m(0)$ has an % element based on it, while the tail of one of the lists in $\pp^m(\ptop)$ % defines the value at \Endparacol{} which \!\pcol@output@end! lets the % register have. The register is also updated by \!\pcol@getmparbottom! and % \!\pcol@getmpbelt! to let \!\pcol@@addmarginpar! being \LaTeX's original % \!\@addmarginpar! know the uppermost available position for the marginal % note to be added. This update is, however, just for communication between % these macros and thus is ineffective for typesetting posterior to that, as % well as the update in \!\pcol@@addmarginpar!, because whole information % for marginal note placement is kept in $\pp^m(p)$ in $\PPP$. % % \item[\Uidx{\!\@textfloatsheight!}] % is a \!\dimen! register to have the combined height of mid floats and % their separators. It is initialize to be 0 by \!\pcol@floatplacement!, % saved in $\cc_c(\fh)$ by \!\pcol@setcurrcol!, and restored from it by % \!\pcol@iigetcurrcol!. % % \item[\Uidx{\!\dimen@!}] % is a \!\dimen! register for temporary use. It is used in the following % macros. %  % \begin{itemize} % \item % \!\pcol@buildcolseprule!, \!\pcol@buildcselt@S! and \!\pcol@buildcselt! to % have the argument $d\in\{\!\@maxdepth!,0\}$ of the first macro. % % \item % \!\pcol@bg@paintregion@i! to have $y_1$ of $\bgr_a^{[c]}$. % % \item % $\!\pcol@bias@mpbout@i!\Arg{y}\Arg{t}\Arg{b}$ to have $t$ and then $t+y$. % % \item % \!\pcol@output@switch! to have the height of \prespan{} in % \!\pcol@prespan!, or 0 if it is $\bot$. % % \item % \!\pcol@sync! to have $V$ or $V-\DT+\VE$. % % \item % \!\pcol@addflhd! and \!\pcol@hdflelt! to measure the height of top and % bottom floats, \!\pcol@makecol! and \!\pcol@output@switch! to measure % the height of \prespan{} including the top floats, and % \!\pcol@measurecolumn! for top and bottom floats and $\VT$, $\VB$ and % $\VP$. % % \item % \!\pcol@setcolwidth@s! and \!\pcol@setcw@accumwd! to accumulate $W$ being % the sum of natural widths of column\slash gap specifications, and then % used by \!\pcol@setcw@calcfactors! to calculate $W/\WT$ and $W-\WT$. % \end{itemize} % % \item[\Uidx{\!\dimen@ii!}] % is a \!\dimen! register for temporary use. It is used in the following % macros. %  % \begin{itemize} % \item % \!\pcol@makecol! to measure the total height of top floats by % \!\pcol@addflhd!. % % \item % \!\pcol@bg@addext! to have % $e=|pcol@bg@ext@|{\cdot}d{\cdot}|@|{\cdot}\{a{\cdot}|@|{\cdot}c,a\}$ %  % \SpecialArrayIndex{d{\cdot}\string\texttt{@} % {\cdot}a{\cdot}\string\texttt{@}{\cdot}c}{\pcol@bg@ext@} % \SpecialArrayIndex{d{\cdot}\string\texttt{@}{\cdot}a}{\pcol@bg@ext@} %  % and then $10000\PT-e$ to calculate an \bgext{} of \bgpaint. % % \item % $\!\pcol@bias@mpbout@i!\Arg{y}\Arg{t}\Arg{b}$ to have $b$ and then $b+y$. % % \item % \!\pcol@measurecolumn! to measure $\VT$, $\VP$ and $\DP$. % % \item % \!\pcol@setcolwidth@s! and \!\pcol@setcw@accumwd! to accumulate $F$ being % the sum of infinite stretch factors in column\slash gap specifications with % the unit of pt, and then used by \!\pcol@setcw@calcfactors! to calculate % $(W-\WT)/F$, where $W$ is the sum of natural widths. % % \item % \!\pcol@setcw@calcfactors! to have $(W-\WT)/F$ above or 0 to be used in % \!\pcol@def@extract@fil@iii! through \!\pcol@setcw@filunit! made % \!\let!-equal to the register by \!\pcol@setcolwidth@s!. % \end{itemize} % % \item[\Uidx{\!\@tempdima!}] % is a \!\dimen! register for temporary use. The usages of this register % are as follows. %  % \begin{itemize} % \item % In \!\pcol@makecol! and \!\pcol@startpage!, it is used to throw % $\pp^h(\ptop)$ away when we get it by \!\pcol@getcurrpinfo! because we % don't need it. % % \item % In \!\pcol@outputelt!, it has $\pp^h(p)$ to examine if $p$ is a \fpage. % % \item % In \!\pcol@ioutputelt!, it has $\pp^h(p)$ possibly shrunk by \Scfnote{}s % to know the \bground{}s to be painted for columns etc. After that it has % $\w_c$ being the width of each \!\hbox! into which the \colpage{} of each % column $c$ is put. % % \item % In \!\pcol@buildcolseprule! and its callees \!\pcol@buildcselt@S! and % \!\pcol@buildcselt!, the register has the first argument $H=\pp^h(p)$ of % the caller macro. % % \item % In \!\pcol@hfil!$\$, it has $\gap_c=|\pcol@columnsep|{\cdot}c$. %  % \SpecialArrayIndex{c}{\pcol@columnsep} % % \item % In \!\@outputpage!, it has the sum of \!\topmargin!, \!\headheight! and % \!\headsep! being the distance between tops of imaginary page and its text % area. % % \item % In \!\pcol@startcolumn!, it is used to save \!\@colht! which can be shrunk % temporarily by \Scfnote{}s. % % \item % In \!\pcol@bg@paintregion@i!, it is let have $x_0$ of $\bgr_a^{[c]}$. % % \item % In \!\pcol@output@start!, it is used to have the room for each \colpage{} % in the \spage, and then the height-plus-depth of the \preenv. % % \item % In \!\pcol@output@switch!, it is used to throw $\pp^h(p)$ away when % we get it by \!\pcol@getcurrpinfo! because we don't need it. % % \item % In \!\pcol@shiftspanning!, it is let have the left-shift amount of a % \mctext{} in \cswap. % % \item % In \!\pcol@restartcolumn!, it is used to save \!\@colht! which can be % shrunk temporarily by \Scfnote{}s. % % \item % In \!\pcol@unvbox@cclv!$\arg{ins}$, it has the depth of \!\box!|255| for % going back to the baseline of the box, and then has the natural component % of $\!\skip!\arg{ins}$ to add its stretch and shrink components only. % % \item % In \!\pcol@addmarginpar!, at first it has the distance between left edges % of the leftmost and current columns. Then it is let have the distance % between top edges of the column and the marginal text to be put. % % \item % In $\!\pcol@getmparbottom!\\$ and % $\!\pcol@getmpbelt!\\$, it at first has $t$ and then is % let have $b_i$ when the marginal note cannot be put at $t$. % % \item % In \!\pcol@sync!, \!\pcol@measurecolumn! and \!\pcol@synccolumn!, it has % $\VT$ being the maximum combined height of top floats and the main % vertical list. % % \item % In \!\pcol@makefcolumn! and \!\pcol@makefcolelt!, it has the room for % floats to be put in a \fcolumn{}. % % \item % In \!\pcol@makeflushedpage!, it has the height-plus-depth of \spanning in % $\pp^i(\ptop)$. % % \item % In \!\pcol@output@end!, at first it is let have $\VPP-H$, where $H$ is the % height(-plus-depth) of \!\@outputbox! having the ship-out image of the % \lpage, being the negative counterpart of the height-plus-depth of % \spanning{} in the \lpage{} for setting $\mpbout$, and then have $H$ to be % set in \!\pcol@bg@preposttop! for the \bgpaint{} of \postenv. % % \item % In \!\pcol@setcolwidth@r!, it has % $\!\textwidth!-(\Cto-\Cfrom-1)\!\columnsep!$ being the base of $\w_c$. % % \item % In \!\pcol@setcw@getspec@i!, it is let have the natural width of a % column\slash gap specification, to be used in \!\pcol@setcolwidth@s!, % \!\pcol@setcw@accumwd! and \!\pcol@setcw@set!, while in the last of them % it finally has $\w_c$ or $\gap_c$. % % \item % In $\!\pcol@setcw@calcf!\\\$, at first it has $y$, then % $y/2^{k_2}$, and then $\lceil y/2^{k_2+k_3}\rceil$, where $k_2$ and $k_3$ % are scaling parameters for good approximation. % % \item % In \!\pcol@switchcol!, it is let have what \!\pcol@ensurevspace! has so % that the dimensional expression in it is evaluated in the macro and the % evaluation result is assigned to $\VE=\!\pcol@@ensurevspace!$. % % \item % In $\!\ensurevspace!\ARg{space}$, it is let have $\arg{space}$ to ensure % the argument is a dimension including forced one. % % \item % In \!\pcol@fntextbody!, it has the height-plus-depth of the \!\vbox! in % which the footnote is encapsulated. % % \item % In \!\pcol@set@color@push!, it has the width of the \!\vbox! to be % \!\insert!ed, which is $m$\,|sp| for a math-mode push of $\mcelt_{i,m}$ or % 0 for a non-math one $\celt_i$. % % \item % In $\!\pcol@bg@defext!\Arg{d}\Arg{e}$, it is let have $e$ to confirm $e$ % is a proper dimension. % \end{itemize} % % \item[\Uidx{\!\@tempdimb!}] % is a \!\dimen! register for temporary use. The usages of this register % are as follows. %  % \begin{itemize} % \item % In \!\pcol@makecol!, it is used to measure the height-plus-depth $h_i$ of % decapsulated \!\box!|255| and its original form to add an element % $\spt(H_i,h_i)$ to $\pp^s(\ptop)$ for a \mctext{} captured in the box. % % \item % In \!\pcol@ioutputelt!, if has the height-plus-depth of \spanning{} % $\pp^b(q)$ to be temporarily added to \!\topmargin!. % % \item % In \!\pcol@buildcolseprule! it has $H_0+h_0$, while in its callee % $\!\pcol@buildcselt!\\~\$ it has $H_{i-1}+h_{i-1}$ and then % $H_i+h_i$ where $\spt(H_i,h_i)\in\pp^s(p)$. % % \item % In \!\pcol@bg@paintregion@i!, it is let have $y_0$ of $\bgr_a^{[c]}$. % % \item % In \!\pcol@output@switch!, it is let have the height-plus-depth $h_i$ of % \!\@holdpg! having a \mctext{} to add an element $\spt(H_i,h_i)$ to % $\pp^s(\ptop)$. % % \item % In \!\pcol@shrinkcolbyfn!, it is let have the inverse of the \!\skip! % component of the argument \!\insert! register of the macro, so that in % \!\pcol@startcolumn! and \!\pcol@restartcolumn! it has that of $\pp^f(p)$ % if $p$ has \Scfnote{}s, or 0 otherwise, and then is referred to by % \!\pcol@deferredfootins! which then lets the register have the height cap % of $\df$ splitting. % % \item % In \!\pcol@addmarginpar!, \!\pcol@getmparbottom! and \!\pcol@getmpbelt!, % it is let have the vertical space to be occupied % by the marginal text to be put, being the second argument of % \!\pcol@getmparbottom!. % % \item % In \!\pcol@sync! and \!\pcol@measurecolumn!, it has $\VB$ and then, in the % former, it has $\VP+v(f)$, $\VT$ or $\VT+\VB+v(f)$ according to the % contents of the page to be \sync{}ed. % % \item % In \!\pcol@makefcolelt!, it has the size of vertical space consumed by a % float. % % \item % In \!\pcol@synccolumn!, it has $\VT-\vc(t)$ being the vertical space from % the bottom of $\cc_c(\vb^b)$ to the \sync{}ation point. If the % \sync{}ation point is defined by a column without main vertical list but % with top floats, then the register is let have % $\VT-\vc(t)+\!\textfloatsep!-\!\floatsep!+10000\,|pt|$ to be set in % $\cc_c(\tf)=\!\pcol@textfloatsep!$ as the space below the \mvlfloat{} % biased by 10000\,|pt| to indicate the last float is the \mvlfloat{}. % % \item % In \!\pcol@setcolwidth@r!, it has % $\!\textwidth!-(\Cto-\Cfrom-1)\!\columnsep!-\sum_{d=0}^{k-1}w_d$ being the % base of $\w_c$ for $c\In{\Cfrom{+}k}{\,\Cto}$ where $k$ is the number of % fractions given in the argument of \!\columnratio!. % % \item % In $\!\pcol@setcw@calcf!\\\$, at first it is let have $x$, % then $x\cdot2^{k_1}$, then % $z'=\break\lfloor(x\cdot2^{k_1})/\lceil{}y/2^{k_2+k_3}\rceil\rfloor$, and % finally % $Z=z\times1\,|pt|=z'\cdot2^{16-k}$ referred to by % \!\pcol@setcw@calcfactors! as $\phi_f=(\WT-W)/F$, where $k_1$, $k_2$ and % $k_3$ are scaling parameters for good approximation and $k=k_1+k_2+k_3$. % % \item % In \!\pcol@extract@fil@ii! and \!\pcol@extract@fil@iii!, it is let have % the infinite stretch factor of a column\slash gap specification % represented with the unit \!\pcol@setcw@filunit!, to be used in % \!\pcol@setcolwidth@s!, \!\pcol@setcw@accumwd!, and \!\pcol@setcw@set!. % % \item % In \!\pcol@fntextbody!, it has $\!\textheight!-\!\skip!\!\footins!$ as the % cap of the footnote. % \end{itemize} % % % \item[\Uidx{\!\@tempdimc!}] % is a \!\dimen! register for temporary use. It is let have values as % follows. %  % \begin{itemize} % \item % $H_i-(H_{i-1}+h_{i-1})$ in $\!\pcol@buildcselt!\\$. % % \item % $x_1$ of $\bgr_a^{[c]}$ in \!\pcol@bg@paintregion@i!. % % \item % $t+h$ in $\!\pcol@getmparbottom!\\$. % % \item % $\max(t,b_{i-1})+h$ in $\!\pcol@getmpbelt!\\$ invoked from % $\!\pcol@getmparbottom!\\~\$. % % \item % $\DT$ in \!\pcol@sync!, \!\pcol@measurecolumn! and \!\pcol@synccolumn!. % % \item % \!\floatsep! or \!\@fpsep! in \!\pcol@makefcolumn! and % \!\pcol@makefcolelt!. % % \item % $\w_c$ being the width of column $c$ in \!\pcol@setcolwidth@r!. % % \item % $\WT-W$ in \!\pcol@setcw@calcfactors!. % % \item % At first for calculation of $y/2^{k_2}$ and then $z'/2^k\approx x/y$ % in $\!\pcol@setcw@calcf!\\\~\$ where $k_2$ and $k$ are scaling % parameters for good approximation. % \end{itemize} % \end{description} % % % % \subsubsection{Skip Registers} % % \begin{description} % \item[\Uidx{\!\baselineskip!}] % is \TeX's primitive register to have the vertical skip to separate % adjacent baselines. It is referred to by \!\pcol@output! and % \!\pcol@output@start! to examine if \!\@colroom! is unexpectedly small, % and by \!\pcol@switchcol! to give it to \!\ensurevspace! to let % \!\pcol@ensurevspace! have the default value. % % \item[\Uidx{\!\topskip!}] % is \TeX's primitive register to have the vertical skip from the top edge % of a page to the baseline of its first vertical item. It is let be 0 by % \!\pcol@output@start! if we have \preenv{} and is saved in $\pp^t(0)$, % while \!\pcol@startpage! lets it be \!\pcol@topskip!, into which % \!\pcol@zparacol! saves the value outside \env{paracol} environment, % saving the value in $\pp^t(p)$. Then the register is restored from % $\pp^t(p)$ by \!\pcol@getpelt! and \!\pcol@sync!, while % \!\pcol@synccolumn! refers to the value restored by the latter to adjust a % \sync{}ation point. The macro \!\pcol@putbackmvl! lets the register have % 0 when it starts a \mctext{} because it originally follows \prespan{} in % the \colpage{} to be restarted rather than at the page top. The macro % \!\pcol@output@end! temporarily lets the register have 0 if we have % non-empty columns in the last page, while \!\endparacol! restores it from % \!\pcol@topskip! for the pages outside \env{paracol} environment. % % \item[\Uidx{\!\splittopskip!}] % is \TeX's primitive register to have the vertical skip inserted at the % beginning of the second half of the box split by \!\vsplit! or \TeX's % internal operation for splitting an \!\insert! at a page break. The % register is temporarily let have 0 by \!\pcol@deferredfootins! when it % splits $\df$ so that the second half does not have any skip at the top. % The register is also let have \!\footnotesep! in \!\pcol@fntextbody! for % footnote typesetting. % % \item[\Uidx{\!\parskip!}] % is \TeX's primitive register to have the vertical skip inserted above each % paragraph. It is referred to by \!\pcol@zparacol! to nullify the % insertion going to be made by the first \!\item! of a \env{list}-like % environment, when the macro finds the \env{paracol} environment to start % is at the very beginning of a \env{list}-like environment. % % \item[\Uidx{\!\fill!}] % is an API \!\skip! register to have a skip 0\,|pt| |plus| 1\,|fill|. In % our macros, however, it is used as a keyword in \!\pcol@setcw@getspec!, % \!\pcol@setcw@getspec@i! and \!\pcol@setcw@fill! to extract the infinite % stretch factor $f$ given as $f\!\fill!$ in the specification. % % \item[\Uidx{\!\itemsep!}] % is an API \!\skip! register to have the vertical skip inserted above each % non-first \!\item! in \env{list}-like environments. It is referred to by % \!\pcol@zparacol! to nullify the insertion going to be made by the first % \!\item! of a \env{list}-like environment, when the macro finds the % \env{paracol} environment to start is at the very beginning of a % \env{list}-like environment. % % \item[\Uidx{\!\floatsep!}] % is an API \!\skip! register to have the vertical skip between adjacent floats. % It is referred to by \!\pcol@cflt! to cancel the skip following the last % float, by \!\pcol@makefcolumn! to let \!\pcol@makefcolelt! examine the % capacity of a \fcolumn{} in the \lpage, by \!\pcol@addflhd! and % \!\pcol@hdflelt! to measure the total height of top and bottom floats, % and by \!\pcol@sync! to calculate the space below the \mvlfloat. % % \item[\Uidx{\!\textfloatsep!}] % is an API \!\skip! register to have the vertical skip between the main % vertical list and top\slash bottom floats. It is referred to by % \!\pcol@output@start! to calculate the room for each \colpage{} in the % \spage{} with bottom floats in the \preenv{}, by \!\pcol@combinefloats! to % insert a skip below the bottom floats in the \preenv{} and \lpage{}, % by \!\pcol@measurecolumn! to take this skip into account in the % calculation of $\VPP$, by \!\pcol@addflhd! to measure the vertical space % for top and bottom floats, and by \!\pcol@synccolumn! to calculate the % \sync{}ation point for columns with top floats. % % \item[\Uidx{\!\dblfloatsep!}] % is an API \!\skip! register to have the vertical skip between adjacent % \pwise{} floats, and is used in \!\pcol@startpage! to cancel the skip % below the last float. % % \item[\Uidx{\!\dbltextfloatsep!}] % is an API \!\skip! register to have the vertical skip between the last % \pwise{} float and the top of columns, and is used in % \!\pcol@startpage! to put the skip. % % \item[\Uidx{\!\@topsep!}] % is a \!\skip! register to have the vertical skip inserted above the first % \!\item! of a \env{list}-like environment. The actual value is determined % by \!\@trivlist! from API parameters \!\topsep!, \!\partopsep! and % \!\parskip! depending on how the environment appears. The skip in the % register is inserted by \!\pcol@zparacol! when it finds the \env{paracol} % environment to start is at the very beginning of a \env{list}-like % environment. % % \item[\Uidx{\!\@fptop!}] % is a \!\skip! register to have the vertical skip inserted at the top of % a \fcolumn, and is used in \!\pcol@makefcolpage!. % % \item[\Uidx{\!\@fpsep!}] % is a \!\skip! register to have the vertical skip between adjacent floats % in a \fcolumn, and is used in \!\pcol@makefcolpage!. % % \item[\Uidx{\!\@fpbot!}] % is a \!\skip! register to have the vertical skip inserted at the bottom of % a \fcolumn, and is used in \!\pcol@makefcolpage!. % % \item[\Uidx{\!\@tempskipa!}] % is a \!\skip! register for temporary use. It is used in the following % macros. %  % \begin{itemize} % \item % \begin{Sloppy}{2400}% % \!\pcol@makecol!, \!\pcol@startpage!, \!\pcol@outputelt!, % \!\pcol@output@switch!, \!\pcol@flushcolumn! and \!\pcol@makeflushedpage! % to throw $\pp^t(p)$ away because we don't need it. % \end{Sloppy} % % \item % \!\pcol@output@start! to determine \!\topskip! for the \spage. % % \item % \!\pcol@setcw@getspec@i! and \!\pcol@setcw@fill! to have the width % specification of a column or gap. % \end{itemize} % It is also used in the top level invocation of \!\pcol@defkw! with a glue % of $0\,|pt|\ |plus|\ 1\,|fil|\~\ |minus|\ 1\,|fil|$. % \end{description} % % % % \subsubsection{Box Registers} % % \begin{description} % \item[\Uidx{\!\strutbox!}] % is an API \!\box! register to have the strut for the current font size. % It is used in \!\pcol@fntextbody!\marg{text} to let \!\splitmaxdepth! have % its depth, and to let the last line of the footnote $\arg{text}$ have its % depth at shallowest. % % \item[\Uidx{\!\@cclv!}] % is a \!\box! register but \TeX{} defines that it has the main vertical % list when \!\output! routine is invoked. It is referred to by % \!\pcol@makecol! when it has a broken \mctext{} to measure its % height-plus-depth for the element to be added to $\pp^s(\ptop)$ and to % update it combining its contents with \prespan{} optionally shifting it % left by passing the register to \!\pcol@shiftspanning!. The macro also % uses the register together with its callee \!\pcol@unvbox@cclv! to add % stretch\slash shrink factor of \!\skip!\!\footins! at its bottom for a % \colpage{} in a page having \Scfnote{}s. The macro \!\pcol@specialoutput! % examines the register to discard the dummy \!\vbox! inserted in it by % \!\pcol@invokeoutput!. The other users \!\pcol@output@start!, % \!\pcol@makenormalcol!, \!\pcol@flushcolumn! and \!\pcol@imakeflushedpage! % let the register have the main vertical list of \preenv{} or a column to % be passed to \!\@makecol!, and \!\pcol@flushcolumn! also takes care the % skip above \Scfnote{}s. % % \item[\Uidx{\!\voidb@x!}] % is a \!\box! register to be void ($\bot$) always. It is used to % initialize \!\pcol@prespan! and \!\pcol@rightpage! at their declaration, % and is referred to by the following macros. %  % \begin{itemize} % \item % \!\pcol@makecol! to make \!\pcol@currfoot! void unless \Scfnote{}s in % \!\foot~ins! is saved into $\pp^f(p)$. % % \item % \!\pcol@startpage! to let % $\pp^i(\ptop)=\bot$ if the new \tpage{} does not have \spanning{} and % $\pp^f(\ptop)=\bot$ for all \fpage{}s and the new \tpage. % % \item % \!\pcol@outputelt! to initialize \!\@outputbox!. % % \item % \!\pcol@ioutputelt! to examine if $\S_c$ is empty. % % \item % \!\pcol@output@start! to let $\pp^f(0)=\bot$, and $\Celt^c=\bot$ if % $\Celtshadow^c$ is undefined. % % \item % \!\pcol@output@switch! to let $\cc_c(\ft^b)=\bot$ if the column does % not have \Mcfnote{}s. % % \item % \!\pcol@getcurrfoot! to let \!\footins! be void if so. % % \item % \!\pcol@setcurrcolnf! to let $\cc_c(\ft^b)=\bot$ because the column $c$ % does not have \Mcfnote{}s. % % \item % \!\pcol@putbackmvl! to let $\!\pcol@prespan!=\bot$ if a \mctext{} really % starts from the top of a \colpage, and $\csts=\bot$ if the \colpage{} % $\cc_c(\vb)$ to be restarted is non-empty. % % \item % \!\pcol@savecolorstack! to let $\csts=\bot$ or its first item be $\bot$ if % $\CST^c$ or $\Celt^c$ is $\bot$, respectively. % % \item % \!\pcol@savefootins! to let its argument macro have a void box if % \!\@freelist! is exhausted. % % \item % \!\pcol@makeflushedpage! to initialize \!\@outputbox! and % \!\pcol@rightpage! to be $\bot$ if the flushed page does not have % \spanning{}, and to let $\pp^f(\ptop)=\bot$ after putting it in the % \lpage{} so that \!\pcol@output@end! will be unaware of the \scfnote{} and % non-\Mgfnote{}s. % % \item % \!\pcol@flushfloats! to let $\!\pcol@rightpage!=\bot$ if \parapag{}ing is % not in effect. % % \item % \!\pcol@output@end! to let $\!\pcol@rightpage!=\bot$ if % the last page has nothing other than \spanning{} being \pwise{} floats % and thus we don't have the right \parapag{}e. The macro also lets % $\Celt^c=\bot$ for all $c$ and $\cst=\bot$. % % \item % \!\pcol@com@flushpage! and \!\pcol@com@clearpage! gives the void box to % \!\pcol@flushclear! as its argument to mean these macros are only aware % of \CSIndex{ifpcol@flush} as the result of \pfcheck. The macro % \!\endparacol! also does that if the footnote typesetting is \mgfnote. % \end{itemize} % % \item[\Uidx{\!\@holdpg!}] % is a \!\box! register to have the main vertical list when \!\output! is % invoked with a special \!\penalty! code. It is let have that by % \!\pcol@specialoutput!, and is referred to by \!\pcol@output@start! and % \!\pcol@makenormalcol! for \preenv{}, and by \!\pcol@output@switch! for the % column from which we are leaving. % % \item[\Uidx{\!\@outputbox!}] % is a \!\box! register to have a partial or the complete ship-out image % of a column or a page. The usages of the register are as follows. %  % \begin{itemize} % \item % In \!\pcol@@makecol!, it has a \colpage{} made by \!\@makecol! for % \!\pcol@flush~column! and \!\pcol@imakeflushedpage!. % % \item % In \!\pcol@combinefloats!, it has a \colpage{} to which top and bottom % floats are combined. % % \item % In \!\pcol@cflt!, it has a \colpage{} to which top floats are combined. % % \item % In \!\pcol@opcol!, it has the complete \colpage{} built by \!\@makecol!. % % \item % In \!\pcol@startpage!, it has the complete \fpage{} built by \!\@tryfcolumn!. % % \item % In \!\pcol@outputelt!, it has the complete (left parallel-) page to be % shipped out by \!\@outputpage!. % \Index{parallel-paging} % % \item % In \!\pcol@outputpage@r!, it is temporarily made \!\let!-equal to % \!\pcol@rightpage! so that the box is shipped out by \!\pcol@@outputpage! % being \LaTeX's \!\@outputpage! instead of the real \!\@outputbox!. % % \item\begin{Sloppy}{1700} % In \!\pcol@output@start!, it has the \preenv{} built by % \!\pcol@makenormalcol!. % \end{Sloppy} % % \item % In \!\pcol@combinefootins!, it is let have the \preenv{} with footnotes. % % \item % In \!\pcol@flushcolumn!, it has a flushed \colpage{} built by \!\@makecol! % or a \fcolumn{} built by \!\@makefcolumn!. % % \item % In \!\pcol@output@flush! and \!\pcol@output@clear!, it has a flushed page % built by \!\pcol@makeflushedpage! and \!\pcol@imakeflushedpage! in which % it has each of flushed \colpage{} built by \!\@makecol!. % % \item % In \!\pcol@flushfloats!, it has the complete (left parallel) page for % flushed \fcolumn{}s. %  % \Index{parallel-paging} % % \item % In \!\pcol@iflushfloats!, it has a \fcolumn{} built by % \!\pcol@makefcolumn!. % % \item % In \!\pcol@output@end!, it has the ship-out image of the \lpage{} of a % \env{paracol} environment built by \!\pcol@makeflushedpage! and % \!\pcol@imakeflushedpage!. % \end{itemize} % % \item[\Uidx{\!\@tempboxa!}] % is a \!\box! register for temporary use. The usages of the register are % as follows. %  % \begin{itemize} % \item % In \!\pcol@makecol!, it is used to decapsulate \!\box!|255| containing a % broken \mctext{}. In the macro and \!\pcol@output@switch!, it is also % used as a waste basket to make \!\footins! void when it contains % \Scfnote{}s in a non-\tpage. % % \item\begin{Sloppy}{2100} % In \!\pcol@cflt! and \!\pcol@startpage!, it has top column-\slash % \pwise{} floats combined by the application of % \!\@comflelt!\slash\!\@comdblflelt! to \!\@toplist!\slash\!\@dbltoplist! % respectively. % \end{Sloppy} % % \item % In \!\pcol@phantom!$\$, it has an empty box whose height and depth are % equal to those of the argument box $b$. % % \item % By \!\pcol@buildcolseprule! and its callees \!\pcol@buildcselt@S! and % \!\pcol@buildcselt!, it is let have the painted \bground{}s for columns, % \csepgap{}s and \mctext{}s in a page, and then is put into the ship-out % image of the page by \!\pcol@ioutputelt!, \!\pcol@imakeflushedpage! or % \!\pcol@iflushfloats!. % % \item % In \!\@outputpage!, it is let have the painted \bground{} of the right % page referred to by its callee \!\pcol@outputpage@r!. % % \item % In $\!\pcol@bg@paint@i!\Arg{body}$, it is let have painted \bground{}s % built by $\arg{body}$. % % \item % In $\!\pcol@bg@paintregion!\arg{a}\arg{c}$, it is let have painted % \bground{} of the region $\bgr_a^{[c]}$. % % \item % In \!\pcol@specialoutput!, it is used to discard the dummy \!\vbox! put by % \!\pcol@invokeoutput!. % % \item % In \!\pcol@makenormalcol!, it is used to save \!\footins! into it and make % it $\bot$ temporarily to exclude \mgfnote{} footnotes from \spanning{} for % \preenv. % % \item % In \!\pcol@ifempty!$\arg{box}\arg{then}\arg{else}$, it is used to examine % if $\arg{box}$ is empty. % % \item % In $\!\pcol@scancst!\arg{box}$ and \!\pcol@iscancst!, it is used to have % what $\cst$ or $\csts$ has after the scan of $\arg{box}\in\{\cst,\csts\}$. % % \item % In \!\pcol@savecolorstack!, it is used to have the \!\vbox! for $\Celt^c$ % to be placed at the top of $\csts$. % % \item % In \!\pcol@deferredfootins!, it is used to have the first half split from % $\df$ being the deferred footnotes to be \!\insert!ed. % % \item % In \!\pcol@fntextbody!\marg{text}, it is used to encapsulate $\arg{text}$ % in it. % % \item % In \!\pcol@icolumncolor!, it is used to have a \!\vbox! to be \!\insert!ed % for the update of $\Celt^c$. % % \item % In \!\pcol@set@color@push!, it is used to have a \!\vbox! to be \!\insert!ed % to push $\celt_i$ or $\mcelt_{i,m}$ to $\cstraw$. % % \item % In \!\pcol@reset@color@pop! and \!\pcol@reset@color@mpop!, it is used to % have a \!\vbox! to be \!\insert!ed to add $\celtpop_i$ or % $\mceltpop_{i,m}$ to $\cstraw$. % \end{itemize} % \end{description} % % % % \subsubsection{Token Registers} % % \begin{description} % \item[\Uidx{\!\output!}] % is \TeX's primitive to have \!\output! routine. It is let have % \!\pcol@output! as its sole token by \!\pcol@zparacol!. % % \item[\Uidx{\!\everypar!}] % is \TeX's primitive to have tokens inserted at the beginning of each % paragraph. In \!\pcol@sptext! and \!\pcol@com@endcolumn!, it is % \!\global!ized to keep its contents after the end of a group. In % \!\pcol@output@switch!, its contents are broadcasted to $\cc_c(\ep)$ for % all $c\In0\C$ if columns are \sync{}ed with a \mctext. Then these values % or that simply given in a column are saved into $\cc_c(\ep)$ by % \!\pcol@setcurrcol!, and then restored from it by \!\pcol@iigetcurrcol!. % % \item[\Uidx{\!\everyvbox!}] % is \TeX's primitive to have tokens inserted at the beginning of each % \!\vbox!. In \!\pcol@zparacol!, after tokens in it are saved into % \!\pcol@everyvbox!, it is let have a \!\the!-reference to % \!\pcol@everyvbox! and |\pcol@innertrue| to turn % $\CSIndex{ifpcol@inner}=\true$, and then the register itself is made % \!\let!-equal to \!\pcol@everyvbox!. In addition, it is let have tokens % in \!\pcol@everyvbox! if a \!\global! assignment to the register is made % in the \env{paracol} just having been closed. Another usage of this % register is to insert a painted page \bground{} to the \!\vbox! to be % \!\shipout! by \!\pcol@@outputpage! being \LaTeX's \!\@outputpage!, and is % used for this purpose by \!\pcol@outputpage@l! and \!\pcol@outputpage@r!, % and by \!\pcol@outputpage@ev! to nullify this special function for other % inside \!\vbox!es. % % \item[\Uidx{\!\@temptokena!}] % is a \!\toks! register for temporary use. It is used in % \!\pcol@output@switch! to broadcast \!\everypar! to $\cc_c(\ep)$ for all % $c\In0\C$. % % \end{description} % % % % \subsubsection{Switches} % % \begin{description} % \item[\Uidx{\CSIndex{if@twocolumn}}] % is a switch to be $\true$ iff multi-column pages are being typeset. It is % turned $\true$ by \!\pcol@zparacol!, and then turned $\false$ by % \!\endparacol!. In addition, it is turned $\false$ when \!\pcol@output! % finds that the \!\output! request for a page break outside \env{paracol} % is sneaked into our own \!\output! routine, in order to avoid that % \LaTeX's original \!\output! routine misunderstands it is working on a % two-columned document. The switch is examined by \LaTeX's own macros % including old \!\end@dblfloat! kept in our own \!\pcol@end@dblfloat!. It % is also examined by \!\pcol@zparacol! before being turned $\true$ to % ensure it is $\false$ or to complain about the inappropriateness otherwise. % % \item[\Uidx{\CSIndex{if@firstcolumn}}] % is a switch to be $\true$ iff the first column is being typeset. Its % truth value is determined by \!\pcol@addmarginpar! to tell % \!\pcol@@addmarginpar!, \!\pcol@getmparbottom@i! and \!\pcol@setmpbelt@i! % the margin which a marginal note goes to. % % \item[\Uidx{\CSIndex{if@twoside}}] % is a switch to be $\true$ iff two-sided page typesetting is in effect and % thus even numbered page may have their own left margins, headers and % footers different from those for odd numbered pages. Besides the % initialization by the main class file such as \textsf{article.cls} % according to the class option |twoside|, the switch is \!\global!ly turned % $\false$ by \!\pcol@twosided! for the case in which API macro \!\twosided! % does not have `|p|' in its optional argument, and then \!\global!ly turned % $\true$ by \!\pcol@twosided@p! which is invoked when the argument contains % `|p|', or the API macro does not have the argument at all. Then the % switch is referred to by \!\pcol@outputpage@l!, \!\pcol@outputpage@r! and % \!\pcol@bg@swappage! to decide the left margin of even numbered pages, % i.e., \!\evensidemargin! if the switch is $\true$ or \!\oddsidemargin! % otherwise. The switch is also referred to by \!\pcol@com@cleardoublepage! % to have a blank page if the switch is $\true$ and the command % \!\cleardoublepage! is used in an odd-numbered page. % % \item[\Uidx{\CSIndex{if@reversemargin}}] % is a switch to be $\true$ iff \!\reversemarginpar! is specified to reverse % the side which marginal notes go to. It is examined by % \!\pcol@addmarginpar! as a factor to decide the margin which a marginal % note goes to, and by \!\pcol@do@mpbout@i! for the same purpose but for % marginal notes in pre-environment or \postenv. %  % \Index{pre-environment stuff} % % \item[\Uidx{\CSIndex{if@mparswitch}}] % is a switch to be $\true$ iff it is specified by, for example, % \texttt{twoside} option of a class such as \textsf{article}, that marginal % notes in even numbered pages go to the left margin. It is examined by % \!\pcol@do@mpbout@i! as a factor to decide the margin which a marginal note % goes to in pre-environment or \postenv{}. %  % \Index{pre-environment stuff} % % \item[\Uidx{\CSIndex{if@nobreak}}] % is a switch to be $\true$ iff the last paragraph is for a sectioning % command. The switch is saved into $\cc_c(\sw)$ together with % \CSIndex{if@afterindent} by \!\pcol@setcurrcol!, and then restored from % it by \!\pcol@iigetcurrcol!. The macro \!\pcol@output@switch! refers to % it to broadcast its value set by a \mctext{} to $\cc_c(\sw)$ for all % $c\In0\C$, while \!\pcol@output@start! and \!\pcol@restartcolumn! insert % $\!\penalty!=10000$ by \!\nobreak! if the switch is $\true$. This % conditional \!\nobreak! is also done by \!\pcol@icolumncolor!, % \!\pcol@set@color@push!, \!\pcol@reset@color@pop! and % \!\pcol@reset@color@mpop! to avoid a break after an \!\insert!. The macro % \!\pcol@zparacol! also examines the switch, but with the truth value in it % given outside \env{paracol} environment, to invoke \!\@nbitem! if $\true$ % when the macro finds the \env{paracol} environment to start is at the very % beginning of a \env{list}-like environment. % % \item[\Uidx{\CSIndex{if@newlist}}] % is a switch to be $\true$ in the duration after a \env{list}-like % environment starts and until its first \!\item! appears. The switch is % examined by \!\pcol@zparacol! to know if the \env{paracol} environment to % start is at the very beginning of a \env{list}-like environment and, if % so, is turned $\false$ by the macro after it inserts vertical skips % pretending the first \!\item! is given. % % \item[\Uidx{\CSIndex{if@inlabel}}] % is a switch to be $\true$ in the duration after an \!\item! appears and % until its first paragraph is given. The switch is examined by % \!\pcol@zparacol! together with \CSIndex{if@newlist} to know if the % \env{paracol} environment to start is at the very beginning of a % \env{list}-like environment ($\false$) and not \env{trivlist}-like one % ($\true$). % % \item[\Uidx{\CSIndex{if@afterindent}}] % is a switch to be $\true$ iff a sectioning command tells that the first % paragraph following it is to be indented. The switch is saved into % $\cc_c(\sw)$ together with \CSIndex{if@nobreak} by \!\pcol@setcurrcol!, % and then restored from it by \!\pcol@iigetcurrcol!. The macro % \!\pcol@output@switch! refers to it to broadcast its value set by a % \mctext{} to $\cc_c(\sw)$ for all $c\In0\C$. % % \item[\Uidx{\CSIndex{if@fcolmade}}] % is a switch to be $\true$ iff a \fcolumn{} or \fpage{} is built by % \!\@tryfcolumn! or \!\@makefcolumn!. The value is set by \!\@tryfcolumn! % for $\cc_c(\dl)$ is referred to by \!\pcol@output!, \!\pcol@startcolumn! % and \!\pcol@freshpage!, while that for \!\@dbldeferlist! is referred to by % \!\pcol@startpage!. The value set by \!\@makefcolumn! for $\cc_c(\dl)$ is % referred to by \!\pcol@flushcolumn!, while that for \!\@dbldeferlist! is % referred to by \!\pcol@output@clear!. The macros \!\pcol@flushfloats! and % \!\pcol@iflushfloats! also refer to the switch to build pages having only % \fcolumn{}s and turn the switch $\true$ or $\false$ by themselves to know % such pages are still to be built or not. The macro \!\pcol@output@end! % also turns the switch $\true$ if a \lpage{} will be followed by page(s) % having \fcolumn{}s to tell that to \!\pcol@flushfloats!. % % \item[\Uidx{\CSIndex{if@tempswa}}] % is a switch for temporary use. The usages of the switch are as follows. %  % \begin{itemize} % \item % In \!\pcol@checkshipped!, it is turned $\true$ iff $\S_c$ for all % $c\In0\C$ have \colpage{}s to be shipped out, and then it is examined by % \!\pcol@opcol!. % % \item % In \!\pcol@nextpage! and \!\pcol@nextpelt!, it is $\true$ until % \!\pcol@nextpelt! finds the first $q$ such that $q>p$ and % $\pp^h(q)\geq0$ to mean $q$ is not for a \fpage{}, so that we let $p=q$ % to skip \fpage{}s following to the old $p$ if any. % % \item % In \!\pcol@outputcolumns! and \!\pcol@outputelt!, it is $\true$ until % \!\pcol@outputelt! finds the first $q$ such that $q\geq\pbase$ and % $\pp^h(q)\geq0$ to mean $q$ is not for a \fpage{}, and the argument of % \!\pcol@outputcolumns! is 0 to mean that it is not for page flushing, so that % we ship out $q$ and all \fpage{}s following it if any. % % \item % In \!\@outputpage! it is let have the value of \CSIndex{ifpcol@bg@painted} % indicating if \bgpaint{} for the left page is done, and then it is % examined by \!\pcol@outputpage@l! to determine whether the \bground{} is % put into the final ship-out image. % % \item % In \!\pcol@makenormalcol!, it is $\true$ iff the footnotes in \preenv{} is % included in \!\@outputbox! which the macro builds. % % \item % In \!\pcol@output@switch!, at first it holds \CSIndex{if@nobreak} of the % \mctext{} if columns are \sync{}ed with it to broadcast % \CSIndex{if@nobreak} to all $\cc_c(\sw)$. Then it is turned $\true$ iff % $\CSIndex{ifpcol@sync}=\true$ for \sync{}ation or % $\CSIndex{ifpcol@clear}={\true}$ for flushing, so as to invoke % \!\pcol@sync!. And finally, it is turned $\true$ iff % $\CSIndex{ifpcol@clear}={\false}$ or $\CSIndex{ifpcol@sync}=\true$, so as % to invoke \!\pcol@restartcolumn!. % % \item % In \!\pcol@restartcolumn!, it is turned $\true$ iff footnote typesetting % is \scfnote{} and $p<\ptop$. % % \item % In \!\pcol@scancst!, it is initialized to be $\true$. Then it is referred % to by \!\pcol@iscancst! for each $\celt\in\cstraw$ to update $\Celt^c$ and % then turned $\false$ when the first one is found. % % \item % In \!\pcol@savecolorstack!, it is $\true$ iff either $\cst\neq\bot$ or % $\Celt^c\neq\bot$, i.e., $\CST^c$ to be saved is not $\bot$. % % \item % In \!\pcol@getmparbottom!, it is initialized to be $\false$ and then may be % turned $\true$ by \!\pcol@getmpbelt! if it finds a gap between two marginal % notes to accommodate that to be added, and then examined by % \!\pcol@getmparbottom! to know the fact. % % \item % In \!\pcol@sync!, it is turned $\true$ iff the \sync{}ed or flushed page % can be built by \!\pcol@synccolumn!. % % \item % In \!\pcol@makefcolumn! having non-empty $\cc_c(\tl)$, it is turned % $\false$ iff the macro is acting on a column in the \lpage{}, $\cc_c(\dl)$ % is emptied by the macro itself, and the total size of the floats to be put % in the \fcolumn{} being built by the macro is less than \!\@fpmin!, to % mean it is possible that the floats in $\cc_c(\tl)$ is put in the % \fcolumn{} as top floats. % % \item % In \!\pcol@measurecolumn! and \!\pcol@addflhd!, it is set to be $\false$ % iff both top floats and the main vertical list are empty, so that % \!\pcol@measureupdate! examines it for the update of $\VT$ and $\DT$. % Then it is kept $\false$ iff both of footnotes and bottom floats are % empty, so that \!\pcol@measurecolumn! examines it for the update of $\VP$ % and \!\pcol@measureupdate! does for $\VPP$ and $\DP$. % % \item % In \!\pcol@makeflushedpage!, it is made $\false$ iff $\ptop$ is the % \lpage{}, $\VPP=-\infty$ to mean all columns are empty and % $\pp^f(\ptop)=\bot$, so as to make the \spanning{} in $\pp^i(\ptop)$ a % float in \postenv{} if \CSIndex{ifpcol@dfloats} also $\false$. Then it is % kept $\false$ if $\CSIndex{ifpcol@dfloats}=\false$ or $\pp^i(\ptop)=\bot$ % to mean nothing is shipped out for \lpage{}. Then it is made $\false$ iff % $\ptop$ is the \lpage{} without deferred floats and \Mgfnote{} % typesetting is in effect, i.e., the switch is $\true$ iff \Scfnote{}s are % put in the page to be flushed. % % \item % In \!\pcol@imakeflushedpage!, it is turned $\true$ iff $\cc_c(\tr)=\infty$ % and $\VPP=\pp^h(\ptop)$ to mean the floats in $\cc_c(\tl)$ should be put in % a \fcolumn{} in the \lpage{} as usual. % % \item % In \!\pcol@iflushfloats!, it is turned $\true$ iff one or more columns have % non-empty $\cc_c(\dl)$ after shipping a page for \fcolumn{}s out, so that % \CSIndex{if@fcolmade} is let have its value after scanning all columns. % % \item % In \!\pcol@output@end!, it is turned $\true$ iff we built \fcolumn{}s, or % the main vertical list in the \lpage{} is empty and the page is not the % \spage, so that we create a new page for the \postenv. % % \item % In \!\globalcounter!\marg{ctr}, it is turned $\true$ iff $\arg{ctr}\in\CG$ % already. % % \item % In $\!\pcol@cmpctrelt!\arg{\theta}$, it is turned $\true$ iff $\theta$ is % not in $\Cc_0$ or $\Val(\theta)\neq\val_0(\theta)$, so that $\theta$ is % added to \!\@gtempa! being the list of \lcounter{}s to be synchronized. % % \item % In \!\pcol@switchcolumn!$|[|d|]|$, it is turned $\false$ iff $0\leq d<\C$ % so that we complain $c$ is invalid if the switch is $\true$. % % \item % In $\!\pcol@ac@caption@def!\arg{s}\arg{t}$, \CSIndex{@tempswatrue} or % \CSIndex{@tempswafalse} is given as its first argument $s$ by % $\!\pcol@ac@caption@enable!$ or $\!\pcol@ac@caption@disable!$ respectively, % so that $|\if@ac@caption@if@|{\cdot}t$ is made \!\let!-equal to $s$ and % \!\pcol@ac@caption! examines it for enabling\slash disabling % \!\addcontentsline! respectively. The macros \!\pcol@ac@caption@if@lof! % and \!\pcol@ac@caption@if@lot! are initialized to be \!\let!-equal to % \!\@tempswatrue! as the default. % % \item % In \!\pcol@icolumncolor!, it is turned $\true$ iff we are in a \!\vbox! or % in restricted horizontal or math mode. % % \item % In \!\pcol@backgroundcolor@i!, it is examined if the root of the % invocation chain is \!\backgroundcolor! which turns the switch $\true$, or % \!\nobackgroundcolor! which turns it $\false$, to determine whether the % \bground{} of a region is painted or not. % \end{itemize} % \end{description} % % % % \subsection{Macros} % \label{sec:imp-tex-macro} % % \subsubsection{Procedural Macros} % % \begin{description} % \item[\Uidx{\CSIndex{par}}] % is \TeX's primitive to end\slash start paragraphs, but may be modified by % \LaTeX{} to have some special functionality occasionally. The macro % \!\pcol@output! makes it \!\let!-equal to \hbox{\!\@@par!} in which the % \TeX's original definition is kept, while \!\pcol@zparacol! and % \!\pcol@par! use it as is. % % \item[\Uidx{\!\space!}] % is an API macro to have a space token. It is used in \!\pcol@output!, % \!\pcol@icolumncolor!, \!\pcol@defcseprulecolor@i! and % \!\pcol@backgroundcolor@ii! for warning messages, and in % \!\pcol@def@extract@fil! to \!\def!ine the macro \!\pcol@extract@fil! % having spaces in its argument specification. % % \item[\Uidx{\!\nointerlineskip!}] % is an API macro to let $\!\prevdepth!=-1000$\,pt to inhibit \TeX's % baseline progress mechanism. It is used in \!\pcol@ioutputelt!, % \!\pcol@makeflushedpage! and \!\pcol@imakeflushedpage! to joint boxes % without \!\baselineskip! between them, in \!\pcol@outputpage@ev! to % suppress the \!\baselineskip! insertion after the first box of painted % \bground{} in the final ship-out image, and in \!\pcol@bg@paint@i! % for the same purpose for the box having painted \bground{}s. % % \item[\Uidx{\!\offinterlineskip!}] % is an API macro to let $\!\baselineskip!=-1000$\,pt, $\!\lineskip!=0$ and % $\!\lineskiplimit!=\!\maxdimen!$ to suppress \!\baselineskip! insertion for % all boxes following this macro. It is used in \!\pcol@bg@paint@i! to do % that in the box in which painted \bground{}s are built. % % \item[\Uidx{\!\thepage!}] % is an API macro to have the representation of the counter \counter{page}. % It is used in \!\pcol@output! for a warning message. % % \item[\Uidx{$\cs{the}{\cdot}\theta$}] % \SpecialArrayIndex{\theta}{\the} %  % is an API macro to have the representation of the counter $\theta$. The % macro is kept in $|\pcol@thectr@|{\cdot}\theta$ %  % \SpecialArrayIndex{\theta}{\pcol@thectr@} %  % by \!\pcol@thectrelt! which also makes the macro \!\let!-equal to % $|\pcol@thectr@|{\cdot}\theta{\cdot}0$ %  % \SpecialArrayIndex{\theta{\cdot}c}{\pcol@thectr@} %  % if the \lrep{} of $\theta$ in the column 0 is defined by % \!\definethecounter!. The macro \!\pcol@setctrelt! also makes this % overriding for the column $c$ to which the macro belongs if % $|\pcol@thectr@|{\cdot}\theta{\cdot}c$ %  % \SpecialArrayIndex{\theta{\cdot}c}{\pcol@thectr@} %  % being the \lrep{} for $c$ is defined, while it makes $|\the|{\cdot}\theta$ %  % \SpecialArrayIndex{\theta}{\the} %  % \!\let!-equal to $|\pcol@thectr@|{\cdot}\theta$ %  % \SpecialArrayIndex{\theta}{\pcol@thectr@} %  % otherwise to give it its original definition. % % \item[\Uidx{$\!\stepcounter!\<\theta\>$}] % is an API macro to increment the counter $\theta$ and zero-clear its % descendant counters. It is used in \!\pcol@startpage! for the counter % \counter{page}, and in \!\pcol@iifootnotetext! for \counter{footnote}. % % \item[\Uidx{\!\nobreak!}] % is an API macro to insert $\!\penalty!=10000$ to inhibit line or page % breaks. It is used in \!\pcol@output@start!, \!\pcol@restartcolumn!, % \!\pcol@icolumncolor!, \!\pcol@set@color@push!, \!\pcol@reset@color@pop! % and \!\pcol@reset@color@mpop! to meet the page-break inhibition request % made by $\CSIndex{if@nobreak}=\true$. % % \item[\Uidx{$\!\addvspace!$\marg{skip}}] % is an API macro to insert a vertical $\arg{skip}$ if % $\!\lastskip!<\arg{skip}$, or a skip of $\arg{skip}+\!\lastskip!$ % otherwise. The macro is used in \!\pcol@zparacol! when it finds the % \env{paracol} environment to start is at the very beginning of a % \env{list}-like environment, to insert \!\@topsep! instead of % $\!\parskip!+\!\itemsep!$ going to be inserted by the first \!\item!. % % \item[\Uidx{$\!\addpenalty!\arg{pen}$}] % is an API macro to insert a page break $\!\penalty!=\arg{pen}$ if % $\CSIndex{if@nobreak}={\false}$. The \!\penalty! is inserted removing the % last vertical skip which is reinserted after the \!\penalty!. The macro % is used in \!\pcol@output@start! and \!\pcol@restartcolumn! to insert % \!\interlinepenalty! if $\CSIndex{if@nobreak}=\false$, while % \!\pcol@zparacol! uses it to insert \!\@beginparpenalty! when it finds the % \env{paracol} environment to start is at the very beginning of a % \env{list}-like environment. % % \item[\Uidx{\!\footnotesize!}] % is an API macro to set the font size for footnotes. It is used in % \!\pcol@fntextbody! for footnote typesetting. % % \item[\Uidx{\!\rule!\oarg{\mbox{$r$}}$\Arg{w}\Arg{h}$}] % is an API macro to draw a vertical rule of $w$ width and $h$ tall, % optionally raised by $r$. It is used in \!\pcol@fntextbody! to have the % rule of $w=r=0$ and $h=\!\footnotesep!$ to make the first line of the % footnote is at least as tall as \!\footnotesep!. % % \item[\Uidx{$\!\addcontentsline!\arg{file}\arg{sec}\arg{entry}$}] % is an API macro to put \!\addtocontents! for the arguments to |.aux| file. % The original definition of the macro is kept in % \!\pcol@addcontentsline! so that \!\pcol@ac@disable@toc! and % \!\pcol@ac@caption! make the macro regain its original definition after % temporarily disabling its function by making it \!\let!-equal to % \!\pcol@gobblethree!. % % \item[\Uidx{\!\marginpar!}\oarg{left}\marg{right}] % is an API macro to put marginal note $\arg{left}$ or $\arg{right}$ to the % left or right margin. In \!\pcol@zparacol! it is made \!\let!-equal to % \!\pcol@marginpar! for the emulation of \!\marginnote!, while its original % version is kept in \!\pcol@@marginpar!. % % \item[\Uidx{\!\footnote!}\oarg{num}\marg{text}] % is an API macro to give a footnote $\arg{text}$ optionally with its number % $\arg{num}$. In \!\pcol@zparacol! it is made \!\let!-equal to % \!\pcol@footnote! to implement its starred version and the adjustment of % \counter{footnote} at \Endparacol, while its original version is kept in % \!\pcol@@footnote!. % % \item[\Uidx{\!\footnotemark!}\oarg{num}] % is an API macro to give a footnote mark optionally with the number % $\arg{num}$ which the mark represents. In \!\pcol@zparacol! it is made % \!\let!-equal to \!\pcol@footnotemark! to implement its starred version % and the adjustment of \counter{footnote} at \Endparacol, while its % original version is kept in \!\pcol@@footnotemark!. % % \item[\Uidx{\!\footnotetext!}\oarg{num}\marg{text}] % is an API macro to give a footnote $\arg{text}$ optionally with its number % $\arg{num}$ but without putting the mark in the footnoted text. In % \!\pcol@zparacol! it is made \!\let!-equal to \!\pcol@footnotetext! to % implement its starred version, while its original version is kept in % \!\pcol@@footnotetext!. % % \item[\Uidx{\!\footnoterule!}] % is an API macro to draw a horizontal line above footnotes, or to insert % whatever it has above them. With \Scfnote{} typesetting, it is redefined % in \!\pcol@zparacol! so that it refers to \!\textwidth! instead of % \!\columnwidth! for drawing the horizontal line or whatever defined, while % the original version is kept in \!\pcol@footnoterule!. Then it is used in % \!\pcol@putfootins! to separate footnotes from the stuff above them, with % the original or modified definition. % % \item[\Uidx{\!\newpage!}] % is an API macro to break a page. It is used in \!\pcol@switchcol! as the % argument of \!\pcol@visitallcols! to break the \colpage{}s visited in the % \cscan{} when the \sync{}ed \cswitch{} requires explicit page breaks. % % \item[\Uidx{\!\dblfigrule!}] % is an API macro to draw a horizontal line between the last \pwise{} % floats and the main vertical list, or to insert whatever it has between % them. The macro is used in \!\pcol@startpage! to build \spanning{} in % the page $p$ in $\pp^b(p)$. % % \item[\Uidx{\!\topfigrule!}] % is an API macro to draw a horizontal line between the last \cwise{} % top float and the main vertical list, or to insert whatever it has between % them. The macro is used in \!\pcol@cflt! and \!\pcol@synccolumn! to % insert it below the last (real) top float. It is also made \!\let!-equal % to \!\relax! temporarily by \!\pcol@imakeflushedpage! when it put floats in % a \fcolumn{} as top floats. Note that the macro and its bottom % counterpart \!\botfigrule! should produce a vertical list whose total % height and depth is 0, because \LaTeX's float mechanism and thus our % macros believe so. % % \item[\Uidx{\!\normalcolor!}] % is an API macro to have color specification stuff for normal coloring. % The macro is used in \!\pcol@putfootins! to specify the color of footnotes % to be put in \!\@outputbox!, in \!\normalcolumncolor!\oarg{c} to % define that the default color of the column $c$ is the normal color, % in \!\normalcolseprulecolor! to specify that the color for \cseprule{}s is % \!\normalcolor!, and in the initial definition of \!\pcol@colseprulecolor! % to give the default color for \cseprule{}s. % % \item[\Uidx{\!\color!}\oarg{mode}\marg{color}] % is an API macro defined in coloring packages to start text coloring with % $\arg{color}$ optionally with $\arg{mode}$. The macro is used in % \!\pcol@xcolumncolor!\oarg{mode}\~\marg{color}\oarg{c} and % \!\pcol@ycolumncolor!\marg{color}\oarg{c} to define the default color of % the column $c$ is $\arg{color}$ optionally with $\arg{mode}$, in % \!\pcol@defcseprulecolor@x! and \!\pcol@defcseprulecolor@y! to define the % color of \cseprule{}s, and in \!\pcol@backgroundcolor@x! to define the % color for \bgpaint{} of a region. % % \item[\Uidx{\!\pfmtname!}] % is an API macro defined in p\LaTeX{} to have its format name |pLaTeX2e| % (so far). It is used in the top level assignment of the constant switch % \CSIndex{ifpcol@bfbottom}. % % \item[\Uidx{$\!\PackageError!\arg{pkg}\arg{msg}\arg{hlp}$}] % is a developer's API macro to stop the execution showing the error % message $\arg{msg}$ with the package identification $\arg{pkg}$ and the % help message $\arg{hlp}$. The macro is used in the following macros; % \!\pcol@ovf! on \!\@freelist! shortage; \!\pcol@set@color@push! on too % many math-mode colorings; in \!\pcol@zparacol! on two-column % typesetting outside \env{paracol} and illegal nesting of \env{paracol}; % $\!\pcol@setcw@calcf!\\\$ on too large $x/y$; % \!\pcol@switchcolumn! on invalid target column; \!\pcol@switchenv! on % illegal \cswitch{} commands\slash environments in a \csenv; % \!\addcontentsonly! on unknown contents type; \!\footnoteplacement! on % unknown layout; \!\pcol@twosided! on unknown two-sided typesetting % feature; \!\pcol@backgroundcolor! on unknown region of \bgpaint; and in % \!\pcol@backgroundcolor@i! on a region not being a column or \csepgap{} % but its ordinal being specified. % % \item[\Uidx{$\!\PackageWarning!\arg{pkg}\arg{msg}$}] % is a developer's API macro to report a warning message $\arg{msg}$ with % the package identification $\arg{pkg}$. The macro is used in % \!\pcol@ignore! to complain an API macro appears in \env{paracol} % inappropriately, in \!\pcol@fntextbody! if the footnote is taller than % $\!\textheight!-\!\skip!\!\footins!$, in \!\pcol@mn@warning! to show % \!\marginnote! is emulated, and in \!\pcol@icolumncolor!, % \!\pcol@defcseprulecolor@i! and \!\pcol@backgroundcolor@ii! to complain % \!\columncolor!\slash\!\normalcolumncolor!, % \!\colseprulecolor!\slash\!\normalcolseprulecolor! or \!\background~color! % is used without coloring packages respectively. % % \item[\Uidx{$\!\PackageInfo!\arg{pkg}\arg{msg}$}] % is a developer's API macro to report an informational message $\arg{msg}$ % with the package identification $\arg{pkg}$. The macro is used if the % \textsf{footmisc} package is loaded to inform about the \!\footnotelayout! % alias being unavailable. % % \item[\Uidx{\!\@@par!}] % is an internal macro to keep \TeX's original primitive \CSIndex{par} in it. % The macro is used in \!\pcol@output! to let \CSIndex{par} act with its % original definition, and in \!\pcol@switchcol! and \!\pcol@flushclear! as % the argument given to \!\pcol@visitallcols! to give \TeX's page builder % the chance of page break in \cscan{}ning. % % \item[\Uidx{\!\@height!}] % is an internal macro having the keyword |height|. It is used in % \!\pcol@buildcolsep~rule!, \!\pcol@buildcselt!, \!\pcol@bg@paintregion@i!, % \!\pcol@output@start!, and \!\pcol@putbackmvl! to draw a \!\hrule! for % \cseprule{} in the first two, a \!\vrule! to be painted in the third, and % an invisible \!\hrule! in the fourth and last. % % \item[\Uidx{\!\@width!}] % is an internal macro having the keyword |width|. It is used in % \!\pcol@buildcolsep~rule!, \!\pcol@buildcselt!, \!\pcol@bg@paintregion@i!, % \!\pcol@output@start!, and \!\pcol@putbackmvl! to draw a \!\hrule! for % \cseprule{} in the first two, a \!\vrule! to be painted in the third, and % an invisible \!\hrule! in the fourth and last. % % \item[\Uidx{\!\@plus!}] % is an internal macro having the keyword |plus|. It is used in the % following macros. %  % \begin{itemize} % \item % \!\pcol@makecol! to \!\def!ine \!\@textbottom! with the body of a vertical % skip with small infinite stretch and shrink. % % \item % \!\pcol@combinefloats! for a skip of the same amount in \!\@textbottom! % above and that of negative amount to {\em move} the effect. % % \item % \!\pcol@hfil! for skips having 1\,|fil| infinite stretch with $\gap_c$ or % $\gap_c/2$ to make it sure the series of columns and \csepgap{}s does not % cause underfull. % % \item % \!\pcol@synccolumn! to put a $1\,|fil|$ infinite stretch below the % main vertical list together with a small infinite shrink in the \colpage{} % being flushed and having a \sync{}ation point, and a vertical skip with a % small infinite stretch to push up the main vertical list above a % \sync{}ation point. % % \item % \!\pcol@setcw@getspec@i! to add $0\,|pt|\ |plus|\ 1000\,|pt|\ |minus|\ % 1000\,|pt|$ to \!\@tempskipa! to ensure the register have stretch and % shrink components. % % \item % \!\pcol@setcw@fill! to let $\!\@tempskipa!=0\,|pt|\ |plus|\ f\,|fil|$ as % the infinite stretch factor of $f$. % \end{itemize} %  % It is also used in the top level assignment of $0\,|pt|\ |plus|\ 1\,|fil|\ % |minus|\ 1\,|fil|$ to \!\@tempskipa! for the invocation of \!\pcol@defkw!. % % \item[\Uidx{\!\@minus!}] % is an internal macro having the keyword |minus|. It is used in the % following macros. %  % \begin{itemize} % \item % \!\pcol@makecol! to \!\def!ine \!\@textbottom! with the body of a vertical % skip with small infinite stretch and shrink. % % \item % \!\pcol@combinefloats! for a skip of the same amount and that of negative % amount. % % \item % \!\pcol@synccolumn! to put a small infinite shrink together with a % stretch of $1\,|fil|$ at the bottom of the main vertical list in a % \colpage{} being flushed and having a \sync{}ation point. % % \item % \!\pcol@setcw@getspec@i! to add $0\,|pt|\ |plus|\ 1000\,|pt|\ |minus|\ % 1000\,|pt|$ to \!\@tempskipa! to ensure the register have stretch and % shrink components. % \end{itemize} %  % It is also used in the top level assignment of $0\,|pt|\ |plus|\ 1\,|fil|\ % |minus|\ 1\,|fil|$ to \!\@tempskipa! for the invocation of \!\pcol@defkw!. % % \item[\Uidx{\!\hb@xt@!}] % is an internal macro having the sequence ``\!\hbox!| to|''. It is used in % \!\pcol@ioutputelt!, \!\pcol@imakeflushedpage! and \!\pcol@iflushfloats! to % put each \colpage{} in a \!\hbox! of \!\columnwidth! wide and to enclose % all of them in a \!\hbox! of \!\textwidth! wide. % % \item[\Uidx{$\!\@namedef!\arg{cs}\arg{body}$}] % is an internal macro to do $\!\def!|\|\arg{cs}\Arg{body}$. It is used in % the following macros. %  % \begin{itemize} % \item % \!\pcol@zparacol! for \!\column*! and \!\pcol@com@column*!. % % \item % $\!\pcol@remctrelt!\<\theta\>$ for $|\cl@|{\cdot}\theta$. %  % \SpecialArrayIndex{\theta}{\cl@} % % \item % $\!\definethecounter!\<\theta\>\\arg{rep}$ for % $|\pcol@thectr@|{\cdot}\theta{\cdot}c$, %  % \SpecialArrayIndex{\theta{\cdot}c}{\pcol@thectr@} % % \item % $\!\pcol@loadctrelt!\<\theta\>\<\val_c(\theta)\>$ for % $|\pcol@ctr@|{\cdot}\theta$. %  % \SpecialArrayIndex{\theta}{\pcol@ctr@} % % \item % \!\pcol@defcolumn! for \!\pcol@com@column*!. % % \item % \!\pcol@defcseprulecolor@i! for $\!\pcol@colseprulecolor![{\cdot}c]$. %  % \SpecialArrayIndex{c}{\pcol@colseprulecolor} % % \end{itemize} %  % We also use this macro in top level \!\def!initions of % \!\pcol@com@nthcolumn*!, \!\pcol@com@leftcolumn*! and % \!\pcol@com@rightcolumn*! for the starter of the environments % \env{nthcolumn*}, \env{leftcolumn*} and \env{rightcolumn*}. % % \item[\Uidx{$\!\@nameuse!\arg{cs}$}] % is an internal macro to do $|\|\arg{cs}$. It is used in the following % macros. %  % \begin{itemize} % \item % $\!\pcol@bg@addext!\arg{z}\Arg{s}\Arg{d}$ for % $|\pcol@bg@ext@|{\cdot}d{\cdot}|@|{\cdot}\{a{\cdot}|@|{\cdot}c,a\}$. %  % \SpecialArrayIndex{d{\cdot}\string\texttt{@} % {\cdot}a{\cdot}\string\texttt{@}{\cdot}c}{\pcol@bg@ext@} % \SpecialArrayIndex{d{\cdot}\string\texttt{@}{\cdot}a}{\pcol@bg@ext@} % % \item % \!\pcol@bg@columnleft! for $|\pcol@columnwidth|{\cdot}c$ and % $|\pcol@columnsep|{\cdot}c$. %  % \SpecialArrayIndex{c}{\pcol@columnwidth} % \SpecialArrayIndex{c}{\pcol@columnsep} % % \item % \!\pcol@bg@columnwidth! for $|\pcol@columnwidth|{\cdot}c$. %  % \SpecialArrayIndex{c}{\pcol@columnwidth} % % \item % \!\pcol@bg@columnsep! for $|\pcol@columnsep|{\cdot}c$. %  % \SpecialArrayIndex{c}{\pcol@columnsep} % % \item % \!\pcol@ccuse! for % $\Celt^c=|\pcol@columncolor@box|{\cdot}c$ or % $\Celtshadow^c=|\pcol@columncolor|{\cdot}c$. %  % \SpecialArrayIndex{c}{\pcol@columncolor} % \SpecialArrayIndex{c}{\pcol@columncolor@box} % % \item % \!\column*! for \!\pcol@com@column*!. % % \item % \!\pcol@zparacol! for $|\pcol@colpream|{\cdot}0$. %  % \SpecialArrayIndex{c}{\pcol@colpream} % % \item % $\!\pcol@storectrelt!\<\theta\>$ for $|\pcol@ctr@|{\cdot}\theta$. %  % \SpecialArrayIndex{\theta}{\pcol@ctr@} % % \item % $\!\pcol@cmpctrelt!\<\theta\>$ for $|\c@|{\cdot}\theta$ %  % \SpecialArrayIndex{\theta}{\c@} %  % and $|\pcol@ctr@|{\cdot}\theta$. %  % \SpecialArrayIndex{\theta}{\pcol@ctr@} % % \item % \!\pcol@synccounter! for $|\pcol@counters|{\cdot}c$ for the column $c$. %  % \SpecialArrayIndex{c}{\pcol@counters} % % \item % $\!\pcol@syncctrelt!\<\theta\>$ for $|\c@|{\cdot}\theta$. %  % \SpecialArrayIndex{\theta}{\c@} % % \item % $\!\pcol@stepcounter!\<\theta\>$ for $|\pcol@counters|{\cdot}c$ for the % column $c$, %  % \SpecialArrayIndex{c}{\pcol@counters} %  % and for $|\cl@|{\cdot}\theta$. %  % \SpecialArrayIndex{\theta}{\cl@} % % \item % \!\pcol@switchcol! to the column $c$ for $|\pcol@colpream|{\cdot}c$. %  % \SpecialArrayIndex{c}{\pcol@colpream} % % \item % $\!\pcol@aconlyelt!\\$ for $|\pcol@ac@def@|{\cdot}t$. %  % \SpecialIndex{\pcol@ac@def@lof}\SpecialIndex{\pcol@ac@def@lot} % % \item % $\!\pcol@ac@def@lof!\arg{eord}$ and $\!\pcol@ac@def@lot!\arg{eord}$ % for $|\pcol@ac@caption@|{\cdot}\~\arg{eord}$. %  % \SpecialIndex{\pcol@ac@caption@enable} % \SpecialIndex{\pcol@ac@caption@disable} % % \item % $\!\pcol@ac@caption!\arg{type}|[|\arg{lcap}|]|\arg{cap}$ for % $|\pcol@ac@caption@if@|{\cdot}t$ %  % \SpecialIndex{\pcol@ac@caption@if@lof} % \SpecialIndex{\pcol@ac@caption@if@lot} %  % and for $|\ext@|{\cdot}\~\arg{type}$. %  % \SpecialIndex{\ext@figure}\SpecialIndex{\ext@table} % % \item % $\!\footnoteplacement!\Arg{l}$ for $|pcol@fnlayout@|{\cdot}l$. %  % \SpecialArrayIndex{l}{\pcol@fnlayout@} % \SpecialIndex{\pcol@fnlayout@c} % \SpecialIndex{\pcol@fnlayout@p} % \SpecialIndex{\pcol@fnlayout@m} % % \item % $\!\pcol@twosided!|[|T|]|$ for $|pcol@twosided@|{\cdot}t$ where $t\in T$. %  % \SpecialArrayIndex{t}{\pcol@twosided@} % \SpecialIndex{\pcol@twosided@p} % \SpecialIndex{\pcol@twosided@c} % \SpecialIndex{\pcol@twosided@m} % \SpecialIndex{\pcol@twosided@b} % \end{itemize} % % \item[\Uidx{$\!\@gobble!\arg{arg}$}] % discards its argument $\arg{arg}$. It is used in \!\pcol@output@start!, % \!\pcol@icolumncolor! and \!\pcol@set@color@push! for temporarily letting % \!\aftergroup! be \!\@gobble! to nullify \!\aftergroup! with % \!\reset@color! invoked in \!\pcol@set@color!, being the original version % of \!\set@color!, and in \!\pcol@zparacol! to make \!\pcol@bg@paintbox! % \!\let!-equal to \!\@gobble! to nullify it if any coloring packages have % not been loaded. In addition, the macros \!\pcol@F! and \!\pcol@Fe! for % logging are made \!\let!-equal to \!\@gobble! at the top level to nullify % them. % % \item[\Uidx{$\!\@ifundefined!\arg{cs}\arg{then}\arg{else}$}] % \begin{Hfuzz}{0.8pt}% % is an internal macro to do $\arg{then}$ or $\arg{else}$ if $\arg{cs}$ is % undefined or defined respectively. % It is used in the following macros; % $\!\pcol@bg@paintregion!\arg{a}\arg{c}$ to examine if either % $|\pcol@bg@color@|{\cdot}a{\cdot}|@|{\cdot}c$ or % $|\pcol@bg@color@|{\cdot}a$ is defined; %  % \SpecialArrayIndex{a{\cdot}\string\texttt{@}{\cdot}c}{\pcol@bg@color@} % \SpecialArrayIndex{a}{\pcol@bg@color@} %  % \!\add~contents~only!$\\$ to stop the execution if % $|\pcol@ac@def@|{\cdot}t$ is not defined; %  % \SpecialArrayIndex{t}{\pcol@ac@def@} %  % \!\footnote~layout!$\Arg{l}$ to stop the execution if % $|\pcol@fnlayout@|{\cdot}l$ is not defined; %  % \SpecialArrayIndex{l}{\pcol@fnlayout@} %  % $\!\pcol@twosided!|[|T|]|$ to stop the execution if $T$ has $t$ % such that $|\pcol@twosided@|{\cdot}t$ is not defined; %  % \SpecialArrayIndex{t}{\pcol@twosided@} %  % \!\pcol@backgroundcolor! to stop the execution if $|\pcol@bg@@|{\cdot}a$ % is not defined for a region $a$; %  % \SpecialArrayIndex{a}{\pcol@bg@@} %  % and \!\pcol@backgroundcolor@i! to stop the execution if % $|\pcol@bg@mayhavecol|{\cdot}a$ is not defined for a region $a$. % \end{Hfuzz} % % \item[\Uidx{$\!\@ifnextchar!\arg{char}\arg{then}\arg{else}$}] % is an internal macro to do $\arg{then}$ or $\arg{else}$ if the character % following to the macro is $\arg{char}$ or not respectively. It is used in % the following macros to examine if they are followed by a `\texttt{\LB}'. %  % \begin{quote}\raggedright % \!\paracol!, % \!\pcol@zparacol!, % \!\columnratio!, % \!\pcol@com@column*!\hbox{ (initial definition)}, % \!\pcol@com@switchcolumn!, % \!\pcol@iswitchcolumn!, % \!\pcol@adjustfnctr!, % \!\pcol@ifootnotetext!, % \!\twosided!, % \!\marginparthreshold!, % \!\columncolor!, % \!\pcol@columncolor!, % \!\normalcolumncolor!. % \!\colseprulecolor!, % \!\pcol@defcseprulecolor!, % \!\normalcolseprulecolor!, % \!\pcol@backgroundcolor!, % \!\pcol@backgroundcolor@w!. % \end{quote} % It is also used in \!\pcol@backgroundcolor@iii! and % \!\pcol@backgroundcolor@iv! if they are followed by a `\texttt{\LP}'. % % \item[\Uidx{$\!\@ifstar!\arg{then}\arg{else}$}] % is an internal macro to do $\arg{then}$ or $\arg{else}$ if the character % following to the macro is `|*|'. It is used in \!\pcol@yparacol!, % \!\globalcounter!, \!\pcol@switchcolumn!, \!\pcol@footnote!, % \!\pcol@footnotemark! and \!\pcol@footnotetext! to examine if the optional % `|*|' is specified. % % \item[\Uidx{$\!\@whilesw!\arg{sw}\cs{fi}\arg{body}$}] % is an internal macro to iterate $\arg{body}$ while the switch $\arg{sw}$ % is $\true$. It is used in \!\pcol@output!, \!\pcol@startpage!, % \!\pcol@output@clear!, \!\pcol@flushfloats!, \!\pcol@freshpage! and % \!\pcol@output@end! to iterate building process of \fcolumn{}s or % \fpage{}s while $\CSIndex{if@fcolmade}=\true$, and in \!\pcol@switchcol! % and \!\pcol@flushclear! to iterate the height check of \sync{}ed or % flushed pages while $\CSIndex{ifpcol@flush}=\true$. % % \item[\Uidx{$\!\@whilenum!\arg{ifnum}\cs{do}\arg{body}$}] % is an internal macro to iterate $\arg{body}$ while the integer comparison % expression $\arg{ifnum}$ is $\true$. The macro is used in the following % macros to iterate their own procedures for all columns $c\In0\C$. %  % \begin{quote}\raggedright % \!\pcol@checkshipped!, % \!\pcol@output@start!, % \!\pcol@output@switch!, % \!\pcol@sync!, % \!\pcol@makeflushedpage!, % \!\pcol@freshpage!, % \!\pcol@output@end!, % \!\pcol@synccounter!, % \!\pcol@com@syncallcounters!, % \!\pcol@stepcounter!, % \!\pcol@visitallcols!. % \end{quote} %  % The macro is also used in the following macros for the ranges following % macro name, where $(\Cfrom,\Cto)\in\{(0,\CL),(\CL,\C)\}$ and $c$ is the % column they are working on. %  % \begin{quote} % \!\pcol@ioutputelt! $\LBRP\Cfrom\Cto$\\ % \!\pcol@bg@paint@ii! $\LBRP\CBfrom{\Cto{-}1}$\\ % \!\pcol@bg@columnleft! $\LBRP\CBfrom{c}$\\ % \!\pcol@addmarginpar! $\LBRP\Cfrom{c'}$ ($c'\in\{c,\;\Cto-(c-\Cfrom)-1\}$)\\ % \!\pcol@imakeflushedpage! $\LBRP\Cfrom\Cto$\\ % \!\pcol@iflushfloats! $\LBRP\Cfrom\Cto$\\ % \!\pcol@setcw@scan! $\LBRP\Cfrom\Cto$ % \end{quote} %  % The other users have a little bit more complicated range as follows. % \begin{itemize} % \item % \!\pcol@flushcolumn! to iterate \fcolumn{} building for a column $c$ in % pages $q$ such that $q\in(\cc_c(\vb^p),\ptop)$. % % \item % \!\pcol@setcolwidth@r! to make assignment of $\w_c$ for % $c\In{\min(\Cfrom{+}k,\Cto{-}1)}{\,\Cto}$ where $k$ is the number of % fractions given as the first or second argument of % \!\columnratio! and kept in \!\pcol@columnratioleft! or % \!\pcol@columnratioright!, respectively. % % \item % $\!\pcol@setcw@calcf!\\\$ to calculate % $\lceil{y/2^{k_2+k_3}}\rceil$ finding $k_3$ by iterating $y/2$ until the % result becomes less than $2^{15}$, to calculate $z'/2^k$ with the range % $\LBRP0k$, to calculate $z'/2^{k-16}$ with the range $\LBRP0{\,k{-}16}$, % and to calculate $z'\cdot2^{16-k}$ with the range $\LBRP0{\,16{-}k}$, % where $z'\cdot2^{16-k}=Z=z\times1\,|pt|$ and $k_2$, $k_3$ and $k$ are % scaling parameters for good approximation. % \end{itemize} % % \item[\Uidx{$\!\@whiledim!\arg{ifdim}\cs{do}\arg{body}$}] % is an internal macro to iterate $\arg{body}$ while the dimensional % comparison expression $\arg{ifdim}$ is $\true$. The macro is used in % $\!\pcol@setcw@calcf!\\\$ twice, at first to find % $k_1=\min\Set{k}{x\cdot2^k\geq2^{13}\,|pt|}$ and to have $x\cdot2^{k_1}$, % and then to find $k_2=\max\Set{k}{y\bmod2^k=0}$ and to have $y/2^{k_2}$. % % \item[$\Uidx{\!\@for!}\arg{cs}\texttt{:=}\arg{list}\cs{do}\arg{body}$] % is an internal macro to iterate $\arg{body}$ for each element of the % comma-separated $\arg{list}$ letting $\arg{cs}$ have the element. The % macro is used in \!\pcol@setcolwidth@r! to scan its argument % $\arg{ratio}$ defined by \!\columnratio!, and in \!\pcol@setcw@scan! to % scan its argument $\arg{spec}$ defined by \!\setcolumnwidth!. % % \item[$\Uidx{\!\@tfor!}\arg{cs}|:=|\arg{list}\cs{do}\arg{body}$] % is an internal macro to iterate $\arg{body}$ for each non-space token in % $\arg{list}$ letting $\arg{cs}$ have the token. The macro is used in % \!\pcol@bg@paint@ii!, \!\pcol@setcw@getspec! and \!\pcol@twosided! to scan % their arguments, in \!\pcol@setcw@getspec@i! to scan a column\slash % gap specification to remove spaces from it, and in % $\!\pcol@twosided!|[|T|]|$ to scan all tokens being two-sided typesetting % features in $T$. % % \item[\Uidx{$\!\@next!\arg{elm}\arg{lst}\arg{suc}\arg{fail}$}] % is an internal macro to remove the first element from $\arg{lst}$, % \!\def!ine $\arg{elm}$ to have the first element, and then do $\arg{suc}$, % if $\arg{lst}$ is not empty. Otherwise, it performs $\arg{fail}$. The % macro is used in the following macros to obtain an \!\insert! from % \!\@freelist!. %  % \begin{itemize} % \item % \!\pcol@opcol! for the completed \colpage{}. % % \item % \!\pcol@startpage! for \fpage{}s and \spanning{} for \pwise{} top % floats. % % \item % \!\pcol@output@start! for the \preenv{}, and \colpage{}s and $\Celt^c$ of % all columns. % % \item % \!\pcol@output@switch! for the \colpage{} from which we are leaving. % % \item % \!\pcol@iscancst! for $\Celt^c$. % % \item % \!\pcol@savefootins! for footnotes. % % \item % \!\pcol@flushcolumn! for \fcolumn{}s and the empty \colpage{} in $\ptop$. % % \item % \!\pcol@synccolumn! for an \mvlfloat{} on a \sync{}ation if its point % defined by a column whose main vertical list is empty. % % \item % \!\pcol@output@end! for the \pwise{} floats in the \lpage{} if the % main vertical list of the page is empty. % % \item % \!\pcol@icolumncolor! for $\Celt^c$. % \end{itemize} %  % The macro is also used in \!\pcol@ioutputelt! to obtain completed % \colpage{}s from $\S_c$. % % \item[\Uidx{% % $\!\@xnext!\cs{@elt}\arg{car}\arg{cdr}\cs{@@}\arg{first}\arg{rest}$}] % is an internal macro to remove the first element $|\@elt|\arg{car}$ from a % list in the form of $|\@elt|\,e_1\,\cdots\,|\@elt|\,e_n$ where % $\arg{cdr}=|\@elt|\,e_2\,\cdots\~\,|\@elt|\,e_n$ and |\def|ine % $\arg{first}$ as $\arg{car}$ and globally |\def|ine $\arg{rest}$ as % $\arg{cdr}$. It is used in \!\pcol@addmarginpar! to get the first element % of \!\@currlist! being a \!\insert! for a right marginal note without % modifying \!\@currlist!. % % \item[\Uidx{$\!\@cons!\arg{lst}\arg{elm}$}] % is an internal macro to add $\!\@elt!\arg{elm}$ to the tail of $\arg{lst}$. %  % \begin{itemize} % \item % \!\pcol@makecol! to add $\spt(H,h)$ to the tail of $\pp^s(\ptop)$. % % \item % \!\pcol@opcol! to add the completed \ccolpage{} $\cc_c(\vb)$ to $\S_c$. % % \item % \!\pcol@startpage! to add $\pp(\ptop-1)$ and \fpage{}s to $\PP$. % % \item % \!\pcol@outputelt! to return \spanning{} $\pp^i(q)$ in a shipped-out \fpage{} % $q$ to \!\@freelist!, or to add $\pp(q)$ to $\PP$ if the page $q$ is kept. % % \item % \!\pcol@ioutputelt! to return \spanning{} $\pp^i(q)$, \Scfnote{}s % $\pp^f(q)$ and/or \colpage{}s $\s_c(q)$ for all $c\In0C$ in a shipped-out % page $q$ to \!\@freelist!. % % \item % \!\pcol@output@start! to return the \ccolpage{} $\cc_0(\vb)$ to % \!\@freelist!. % % \item % \!\pcol@output@switch! to add $\spt(H,h)$ to the tail of $\pp^s(\ptop)$. % % \item % \!\pcol@restartcolumn! to return the \ccolpage{} $\cc_c(\vb)$ to be resumed, % and its footnotes $\cc_c(\ft)$ if any, to \!\@freelist!. % % \item % $\!\pcol@getmparbottom!\\$ to add % $\mpar(\max(t,b_n),\max(t,b_n){+}h)$ to the tail of the list % $\mpb_{\{L,R\}}^{\{l,r\}}$, and its callee % $\!\pcol@getmpbelt!\\$ to add $\mpar(t_i,b_i)$ or % $\mpar(\max(t,b_{i-1}),\max(t,b_{i-1}){+}h)$ to the so-far tail of the % list in rebuilding. % % \item % \!\pcol@flushcolumn! to return footnotes $\cc_c(\ft)$ in the \ccolpage{} % of $c$ to be flushed to \!\@freelist! if any, and to add the flushed % \colpage{} and \fcolumn{}s to $\S_c$. % % \item % \!\pcol@makefcolelt! to add a float to \!\@toplist! or $\cc_c(\dl)$. % % \item % \!\pcol@synccolumn! to add an \mvlfloat{} for \sync{}ation to % $\cc_c(\tl)$. % % \item % \!\pcol@makeflushedpage! to return \spanning{} $\pp^i(\ptop)$ and/or % \Scfnote{}s $\pp^f(\ptop)$ in the top page to be flushed to \!\@freelist! % if any. % % \item % \!\pcol@imakeflushedpage! to return \Mcfnote{}s in $\cc_c(\ft)$ s.t.\ % $\cc_c(\vb^p)=\ptop$ to \!\@freelist! if any. % % \item % \!\pcol@output@end! to return $\pp^f(\ptop)$, all \ccolpage{}s % $\cc_c(\vb)$, and all $\Celt^c\neq\bot$ to \!\@freelist!. % % \item % \!\pcol@end@dblfloat! to add a \pwise{} float in \!\@currbox! to % \!\@dbldeferlist!. % % \item % $\!\globalcounter!\<\theta\>$ to add a \gcounter{} $\theta$ to $\CG$. % % \item % $\!\pcol@iremctrelt!\<\theta\>$ to add a \lcounter{} $\theta$ to $\CTL$. % % \item % $\!\pcol@storectrelt!\<\theta\>$ to add a pair $\<\theta,\val_c(\theta)\>$ % to $\Cc_c$ for a column $c$. % % \item % $\!\pcol@savectrelt!\<\theta\>$ to add a pair $\<\theta,\val(\theta)\>$ to % $\Cc_c$ for a column $c$. % % \item % $\!\pcol@cmpctrelt!\<\theta\>$ to add a counter $\theta$ to the list of % \lcounter{}s to be synchronized. % % \item % $\!\addcontentsonly!\\$ to add a pair $\$ to $\T$. % % \item % \!\pcol@backgroundcolor@ii! to add a region whose \bground{} is painted to % \!\pcol@bg@defined!. % \end{itemize} % % \item[\Uidx{$\!\@cdr!\\\cdots\\cs{@nil}$}] % is an internal macro to be expanded to $\\cdots\$. It is used % in $\!\pcol@getcurrpinfo!\arg{cs}$ to extract $\pp(\ptop)$ from % $\!\pcol@currpage!=\!\@elt!\arg{\pp(\ptop)}$ and to \!\def!ine $\arg{cs}$ % letting it have $\pp(\ptop)$. % % \item[\Uidx{$\!\protected@edef!\arg{macro}$\marg{body}}] % is an internal macro to do \!\edef!$\arg{macro}$\marg{body} with the % \!\protect!ion so that \!\protect!$\arg{cs}$ is kept in the expansion. It % is used in \!\pcol@fntextbody! to \!\edef!ine \!\@currentlabel!. % % \item[\Uidx{$\!\@latex@warning@no@line!\arg{msg}$}] % is an internal macro to report a warning message $\arg{msg}$ without the % line number in which the cause lies. It is used in \!\pcol@output! if % a page with floats and very short main vertical list is built. % % \item[\Uidx{\!\@eha!}] % is an internal macro having a help message saying the command causing an % error is ignored. It is used in \!\pcol@zparacol!, \!\pcol@setcw@calcf!, % \!\pcol@switchcolumn!, \!\pcol@switchenv!, and \!\addcontentsonly! as the % argument of \!\PackageError!. % % \item[\Uidx{\!\@ehb!}] % is an internal macro having a help message saying the error causes a % serious problem. It is used in \!\pcol@ovf!, \!\pcol@zparacol! and % \!\pcol@set@color@push! as the argument of \!\PackageError!. % % \item[\Uidx{\!\@parmoderr!}] % is an internal macro to complain about misplacement of a macro or % environment which is expected to appear in ``outer par mode''. % It is used in \!\pcol@zparacol! if it finds $\CSIndex{ifinner}=\true$. % % \item[\Uidx{\!\@Esphack!}] % is an internal macro to put back the horizontal skip and space factor % saved by \!\@bsphack! at the end of an environment. It is used in % \!\pcol@end@dblfloat!. % % \item[\Uidx{\!\reset@font!}] % is an internal macro \!\let!-equal to \!\normalfont! to use a standard % font. It is used in \!\pcol@fntextbody! for footnote typesetting. % % \item[\Uidx{\!\set@color!}] % is an internal macro to start coloring of texts following it. By default % it is \!\relax! but may have a definition to put a \!\special! for % coloring with the color in \!\current@color!. In the following macros, it % is examined if $\!\set@color!=\!\relax!$ and/or some local definition is % given to \!\set@color!. %  % \begin{itemize} % \item % \!\pcol@output! lets $\!\set@color!=\!\pcol@set@color!$ i.e., lets it % regain its original definition because we don't need any special % operations in \!\output! routine. % % \item % \!\@outputpage! performs \bgpaint{} if $\!\set@color!\neq\!\relax!$. % % \item % \!\pcol@zparacol! performs set-up operations for text coloring, including % making \!\set@color! \!\let!-equal to \!\pcol@set@color@push! saving % its original definition into \!\pcol@set@color!, and enabling \bgpaint{} % macros if $\!\set@color!\neq\!\relax!$, while these \bgpaint{} macros are % nullified otherwise. % % \item % \!\pcol@icolumncolor! complains that no color packages have been loaded if % \!\set@color!${}={}$\!\relax!, and then otherwise temporarily lets it be % the original saved in \!\pcol@set@color! to \!\insert! a \!\vbox! to % update $\Celt^c$ or to do the update immediately. % % \item % \!\pcol@iicolumncolor! temporarily lets $\!\set@color!=\!\relax!$ so that % \!\color! or \!\normalcolor! invoked in the macro just defines % \!\current@color! to be set into $\Celtshadow^c$ without doing any other % coloring operations. % % \item % \!\pcol@defcseprulecolor@i! complains that no color packages have been % loaded if $\!\set@color!=\!\relax!$, while otherwise the macro temporarily % lets $\!\set@color!=\!\relax!$ to invoke \!\color! (or \!\normalcolor!) to % check if its arguments are properly given. % % \item % \!\pcol@backgroundcolor@ii! complains that no color packages have been % loaded if $\!\set@color!=\!\relax!$, while otherwise its descendent % \!\pcol@backgroundcolor@x! temporarily lets % $\!\set@color!=\!\pcol@backgroundcolor@y!$ to \!\def!ine % $|\pcol@bg@|\~|color@|a[|@|{\cdot}c]$ to be \!\current@color!. %  % \SpecialArrayIndex{a}{\pcol@bg@color@} % \SpecialArrayIndex{a{\cdot}\string\texttt{@}{\cdot}c}{\pcol@bg@color@} % \end{itemize} % % \item[\Uidx{\!\reset@color!}] % is an internal macro to finish text coloring started by \!\set@color!. By % default it is undefined but may have some definition to put a \!\special! % to finish coloring. It is used in \!\pcol@clearcolorstack! so as to apply % it to all elements in $\CST^c$, in \!\pcol@iscancst! to put it to the % main vertical list in the case that $\Celt^c$ was $\bot$ and then updated, % in \!\pcol@icolumncolor! to apply it to all elements in $\CSTshadow^c$, % and in \!\pcol@reset@color@pop! and \!\pcol@reset@color@mpop! to have an % uncoloring \!\special! in the \!\vbox! for $\celt_i$ and $\mcelt_{i,m}$. % % \item[\Uidx{\!\color@begingroup!}] % is an internal macro to open a group in which a color is specified. It is % used in \!\pcol@putfootins! to enclose footnotes with \!\normalcolor!, and % in \!\pcol@fntextbody!\marg{text} to enclose the coloring in the footnote % $\arg{text}$. % % \item[\Uidx{\!\color@endgroup!}] % is an internal macro to close a group in which a color is specified. It is % used in \!\pcol@putfootins! to enclose footnotes with \!\normalcolor!, and % in \!\pcol@fntextbody!\marg{text} to enclose the coloring in the footnote % $\arg{text}$. % % \item[\Uidx{$\!\@stpelt!\<\theta\>$}] % is an internal macro to zero-clear the counter $\theta$ for the % implementation of \!\stepcounter!. It is used in \!\pcol@stepcounter! to % clear the descendent counters of a \gcounter{} $\cg$ listed in % $|\pcol@cl@|{\cdot}\cg$. %  % \SpecialArrayIndex{\theta}{\pcol@cl@} % % \item[\Uidx{\!\@nbitem!}] % is an internal macro to insert a vertical skip of % $\!\@outerparskip!-\!\parskip!$ above the first \!\item! of a % \env{list}-like environment when $\CSIndex{if@nobreak}=\true$. It is used % by \!\pcol@zparacol! when it finds the \env{paracol} environment to start % is at the very beginning of a \env{list}-like environment and % $\CSIndex{if@nobreak}=\true$. % % \item[\Uidx{\!\@parboxrestore!}] % is an internal macro to set up typesetting parameters for paragraphs % encapsulated in a box. It is used in \!\pcol@fntextbody! for paragraphs % in a footnote. % % \item[\Uidx{\!\@finalstrut!}$\arg{box}$] % is an internal macro to add an invisible vertical rule whose depth is that % of a $\arg{box}$. It is used in \!\pcol@fntextbody! to make the last line % of the footnotes is as deep as \!\strutbox! at shallowest. % % \item[\Uidx{\!\@sect!}] % is an internal macro to implement sectioning commands. The original % definition of the macro is kept in \!\pcol@ac@enable@toc!, while % \!\pcol@ac@def@toc! makes it \!\let!-equal to \!\pcol@ac@enable@toc! or % \!\pcol@ac@disable@toc!, the latter of which uses the original version % temporarily disabling \!\addcontentsline!. % % \item[\Uidx{\!\@svsechd!}] % is an internal macro (locally) \!\def!ined in \!\@sect! and \!\@ssect! to % keep the section header of a sectioning command such as \!\paragraph! % which puts the header as the leading text of the paragraph following the % command rather than putting it as an individual paragraph. The macro is % \!\global!ized in \!\pcol@sptext! so that it is properly referred to in % \!\everypar! for the paragraph led by the text in case that a \mctext{} % has the sectioning command only and thus the \!\def!inition of the macro % must survive after we close the group in which the \mctext{} is put. % % \item[\Uidx{\!\@svsec!}] % is an internal macro (locally) \!\def!ined in \!\@sect! to keep % \!\thesection! etc.\ to be displayed as the leading part of the section % header. The macro is \!\global!ized in \!\pcol@sptext! together with % \!\@svsechd! because it is in the body of \!\@svsechd!. % % \item[\Uidx{\!\@caption!}] % is an internal macro to implement \!\caption!. The original definition of % the macro is kept in \!\pcol@ac@caption@latex!, while % \!\pcol@ac@caption@def! makes it \!\let!-equal to \!\pcol@ac@caption! % which uses the original version temporarily disabling \!\addcontentsline! % if necessary. % % \item[\Uidx{\!\end@float!}] % is an internal macro to close a \cwise{} float environment. It is used in % \!\pcol@end@dblfloat! (but never invoked because we have \cs{if@twocolumn} % true always). % % \item[\Uidx{\!\end@dblfloat!}] % is an internal macro to close a \pwise{} float environment. It is replaced % with our own \!\pcol@end@dblfloat!. % % \item[\Uidx{\!\@endfloatbox!}] % is an internal macro to close a \!\vbox! for a float. It is used in % \!\pcol@end@dblfloat!. % % \item[\Uidx{\!\@largefloatcheck!}] % is an internal macro to examine if a float is too large. It is used in % \!\pcol@end@dblfloat!. % % \item[\Uidx{\!\@floatplacement!}] % is an internal macro for \!\output! routine to reinitialize \cwise{} % float placement parameters. It is used in our own version of it, % \!\pcol@floatplacement!. % % \item[\Uidx{\!\@dblfloatplacement!}] % is an internal macro for \!\output! routine to reinitialize \pwise{} % float placement parameters. It is used in \!\pcol@startpage! and % \!\pcol@output@clear! prior to processing \pwise{} floats in % \!\@dbldeferlist!. As discussed in % item-(\ref{item:ovv-float-@dblfloatplacement}) of % \secref{sec:imp-ovv-float}, this macro in 2015 or later version of % \LaTeX{} lets $\!\f@depth!=|1sp|$. % % \item[\Uidx{\!\@xympar!}] % is an internal macro to perform the last operations for \!\marginpar!. In % \!\pcol@zparacol! it is made \!\let!-equal to \!\pcol@xympar! for the % emulation of \!\marginnote!, while its original version is kept in % \!\pcol@@xympar!. % % \item[\Uidx{\!\p@footnote!}] % is an internal macro to have the prefix to \!\thefootnote! in the printed % reference of the counter \counter{footnote}. It is used in % \!\pcol@fntextbody! to produce \!\@currentlabel!. % % \item[\Uidx{\!\@thefnmark!}] % is an internal macro to have \!\thefootnote!\footnote{ %  % Or \cs{thempfootnote} in \env{minipage} environment.}. %  % It is used in \!\pcol@fntextbody! to produce \!\@currentlabel!. % % \item[\Uidx{\!\@footnotetext!}\marg{text}] % is an internal macro to implement \!\footnote! and \!\footnotetext! for % $\arg{text}$. In \!\pcol@zparacol!, it is made \!\let!-equal to % \!\pcol@fntext!. % % \item[\Uidx{\!\@makefntext!}\marg{fn}] % is an internal macro to typeset the footnote $\arg{fn}$. It is used in % \!\pcol@fntextbody!\marg{text} to typeset the footnote $\arg{text}$ with % some other stuff. % % \item[\Uidx{\!\@emptycol!}] % is an internal macro for \!\output! routine to put back an empty page to % the main vertical list. It is used \!\pcol@output! if a page with floats % and very short main vertical list is built. % % \item[\Uidx{\!\@specialoutput!}] % is an internal macro for \!\output! routine to process an \!\output! % request made by \LaTeX's original \!\clearpage!, $\!\end!\Arg{float}$ and % \!\marginpar!. It is used in \!\pcol@specialoutput! to process the % request for floats or marginal notes. % % \item[\Uidx{\!\@opcol!}] % is an internal macro for \!\output! routine to output a page or to keep % the first column until the second one is completed. This macro is used in % \!\pcol@output! to process a sneaked \!\output! request from outside of % \env{paracol}, and in \!\pcol@output@end! for the case \pwise{} floats % are left at \Endparacol{} and they are put in \fpage{}s. % % \item[\Uidx{\!\@makecol!}] % is an internal macro for \!\output! routine to build the ship-out % image of a column in \!\@outputbox! consisting of top floats, main % vertical list in \!\box!|255|, footnotes in \!\footins!, and bottom % floats\footnote{ %  % In p\LaTeX, the order of footnotes and bottom floats are reversed.}. %  % It is used in \!\pcol@output! to process a sneaked \!\output! request % from outside of \env{paracol}, in \!\pcol@@makecol! for a \colpage{} to be % flushed by \!\pcol@flushcolumn! and \!\pcol@makeflushedpage!, in % \!\pcol@makecol! for an ordinary \colpage{}, and in \!\pcol@output@start! % and \!\pcol@makenormalcol! for \preenv{}. % % \item[\Uidx{\!\@textbottom!}] % is an internal macro for \!\output! routine to be put at the bottom of % \!\@outputbox! in which a \colpage{} is stored, by \!\@makecol!. This % macro is temporarily re\!\def!ined by \!\pcol@makecol! for a \colpage{} % having \sync{}ation points so that it has a vertical skip of infinite % stretch and shrink to push up/down the stuff below the last \sync{}ation % point in order to adjust its top to the point. After that, its original % definition kept in \!\pcol@textbottom! is restored. Another modifiers of % the macro are as follows; \!\pcol@makenormalcol! to make the macro % \!\let!-equal to \!\relax! temporarily to avoid the insertion of whatever % the macro has in \!\@makecol!; and \!\pcol@makeflushedpage! to let the % macro have \!\vfil! temporarily so that empty columns in a \lpage{} are % made {\em full size} without underfull. % % \item[\Uidx{\!\@outputpage!}] % is an internal macro for \!\output! routine to output a page kept in % \!\@outputbox! together with the header and footer. The original % definition of this macro is saved in \!\pcol@@outputpage! to be used in % \!\pcol@outputpage@l! and \!\pcol@outputpage@r! being callees of our own % revised version of \!\@outputpage!. Therefore, any \!\output! request to % result in page ship-out reaches our own \!\@outputpage! and then \LaTeX's % one after we perform operations for \parapag{}ing and \bgpaint{} onto the % ship-out image. % % \item[\Uidx{\!\@combinefloats!}] % is an internal macro for \!\output! routine to combine top and bottom % floats in \!\@toplist! and \!\@botlist! respectively with \!\@outputbox! % in which the main vertical list and footnotes\footnote{ %  % In p\LaTeX, footnotes are not in \cs{@outputbox} because of the reversal of % footnotes and bottom floats.} %  % have been put by \!\@makecol!, and to have the result in \!\@outputbox! % again. In \!\pcol@zparacol!, it is made \!\let!-equal to our own % \!\pcol@combinefloats! so that \!\@makecol! and \!\pcol@makenormalcol! % uses it instead of the original one. However, if \!\pcol@output! finds % that the \!\output! request for a page break outside \env{paracol} is % sneaked into our own \!\output! routine, it makes this macro \!\let!-equal % to \!\pcol@@combinefloats! in which \LaTeX's version is kept so that % \LaTeX's original \!\output! routine works perfectly as original. % % \item[\Uidx{\!\@cflt!}] % is an internal macro for \!\output! routine to put all top floats in % \!\@toplist! and related stuff such as the vertical skip of % \!\textfloatsep! into \!\@outputbox! together with its old contents being % the main vertical list and footnotes %  % \addtocounter{footnote}{-1}\footnotemark. %  % It is used in \!\pcol@combinefloats! if the \colpage{} being processed % does not have \sync{}ation points. % % \item[\Uidx{\!\@cflb!}] % is an internal macro for \!\output! routine to put all bottom floats in % \!\@botlist! and related stuff such as the vertical skip of % \!\textfloatsep! into \!\@outputbox! together with its old contents being % top floats, the main vertical list and footnotes %  % \addtocounter{footnote}{-1}\footnotemark. %  % It is used in \!\pcol@combinefloats!. % % \item[\Uidx{$\!\@comflelt!\arg{flt}$}] % is an internal macro for \!\output! routine to put $\arg{flt}$ being a % \cwise{} top or bottom float to the tail of \!\@tempboxa! which % finally has all top\slash bottom floats in a column. It is used in % \!\pcol@cflt! to apply it to each element of \!\@toplist!. % % \item[\Uidx{$\!\@comdblflelt!\arg{flt}$}] % is an internal macro for \!\output! routine to put $\arg{flt}$ being a % \pwise{} float to the tail of \!\@tempboxa! which finally has the % \spanning{} for \pwise{} floats. It is used in \!\pcol@startpage! to % apply to each element of \!\@dbltoplist! to have the \spanning. % % \item[\Uidx{\!\@startcolumn!}] % is an internal macro for \!\output! routine which tries to build a % \fcolumn{} for the floats in \!\@deferlist! and, if the column % is not built, tries to move floats to \!\@toplist! and \!\@botlist!. This % macro is used in \!\pcol@output! to process a sneaked \!\output! request % from outside of \env{paracol}, and in \!\pcol@output@end! for the case % \pwise{} floats are left at \Endparacol{} after which they become % \cwise{} ones. % % \item[\Uidx{$\!\@tryfcolumn!\arg{lst}$}] % is an internal macro for \!\output! routine which examines if a \fcolumn{} % or a \fpage{} can be built with some floats in $\arg{lst}$ and, if so, % builds the page in \!\@outputbox! removing floats put in the page from % $\arg{lst}$. It is used in \!\pcol@startpage! for \pwise{} floats in % \!\@dbldeferlist!, and in \!\pcol@startcolumn! for \cwise{} floats in % $\cc_c(\dl)$. % % \item[\Uidx{$\!\@scolelt!\arg{flt}$}] % is an internal macro for \!\output! routine which examines if a % \cwise{} float $\arg{flt}$ can be added to \!\@toplist! or % \!\@botlist! being the list of the floats to be put at the top or bottom % of a page respectively. Then, if the examination succeeds, $\arg{flt}$ is % added to \!\@toplist! or \!\@botlist!, while it is added to % \!\@deferlist! otherwise. It is used in \!\pcol@trynextcolumn! to % apply to each element of (the copy of) $\cc_c(\dl)$. % % \item[\Uidx{$\!\@sdblcolelt!\arg{flt}$}] % is an internal macro for \!\output! routine which examines if a % \pwise{} float $\arg{flt}$ can be added to \!\@dbltoplist! being the % list of the floats to be put at the top of a page, and if so, adds % $\arg{flt}$ to \!\@dbltoplist!, while it is added to \!\@dbldeferlist! or % \!\@deferlist! depending on \LaTeX's version otherwise as discussed in % item-(\ref{item:ovv-float-@addtodblcol}) of \secref{sec:imp-ovv-float}. % It is used in \!\pcol@startpage! to apply to each element of (the copy of) % \!\@dbldeferlist!. % % \item[\Uidx{\!\@addmarginpar!}] % is an internal macro for \!\output! routine to add a marginal note. Its % original definition is kept in \!\pcol@@addmarginpar! and used in % \!\pcol@addmarginpar! being our own \!\@addmarginpar!. % % \item[\Uidx{$\!\@makefcolumn!\arg{lst}$}] % is an internal macro for \!\output! routine to build a \fcolumn{} with % some floats at the head of a float list $\arg{lst}$ and to remove the % floats from the list. It is used in \!\pcol@flushcolumn! and % \!\pcol@iflushfloats! for $\cc_c(\dl)$ of \cwise{} floats, and in % \!\pcol@output@clear! for \!\@dbldeferlist! of \pwise{} floats. % \end{description} % % % % \subsubsection{Structural Macros} % % \begin{description} % \item[\Uidx{$\!\@elt!\\cdots\$}] % is an internal control sequence to represent a list element having $n$ % sub-elements. The sequence is often made \!\let!-equal to a macro which % processes $\\cdots\$ and is applied to all members in a list. % It is also made \!\let!-equal to \!\relax! on a manipulation of a list, % such as element addition and concatenation, by \!\edef! or \!\xdef!. The % usages of the sequence are as follows. %  % \begin{itemize} % \item % \!\pcol@F@count! \!\def!ines \!\@elt! as a macro to increment % \!\@tempcnta! by one to measure the cardinality of \!\@freelist!. % % \item % \!\pcol@cflt! lets $\!\@elt!=\!\@comflelt!$ for $\cc_c(\tl)$, and then % $\!\@elt!=\!\relax!$ to concatenate \!\@freelist! and $\cc_c(\tl)$. % % \item % \!\pcol@setpageno! lets $\!\@elt!=\!\pcol@setpnoelt!$ for $\PP$. % % \item % \!\pcol@setpnoelt! and \!\pcol@setmpbelt! let $\!\@elt!=\!\relax!$ to add % $\pp(q)$ to $\PP$. It also uses \!\@elt! to \!\def!ine \!\pcol@currpage! % with $\!\@elt! % \Arg{\pp^p(q)}\<\pp^i(q)\>\<\pp^f(q)\>\~\Arg{\pp^s(p)}\Arg{\pp^m(p)}$. % % \item % \!\pcol@defcurrpage! lets $\!\@elt!=\!\relax!$ to \!\xdef!ine % \!\pcol@currpage! with % $\!\@elt!\Arg{\pp^p(q)}\<\pp^i(q)\>\<\pp^f(q)\>\Arg{\pp^s(p)}\Arg{\pp^m(p)}$. % % \item % \!\pcol@nextpage! lets $\!\@elt!=\!\pcol@nextpelt!$ for $\PP$. % % \item % \!\pcol@getcurrpage! lets $\!\@elt!=\!\pcol@getpelt!$ for $\PPP$. % % \item % \!\pcol@startpage! lets $\!\@elt!=\!\@sdblcolelt!$ for (the copy of) % \!\@dbldeferlist!, and $\!\@elt!=\!\@comdblflelt!$ for \!\@dbltoplist!. It % also lets $\!\@elt!=\!\relax!$ for the concatenation of \!\@dbldeferlist! % and \!\@deferlist!, and that of \!\@freelist! and \!\@dbltoplist!. % % \item % \!\pcol@outputcolumns! lets $\!\@elt!=\!\pcol@outputelt!$ with two arguments % for (the copy of) $\PP$. % % \item % \begin{Sloppy}{2400}% % \!\pcol@ioutputelt! \!\def!ines \!\pcol@bg@footnoteheight! and % \!\pcol@bg@float~height! with \!\@elt! to let painting macros add elements % in them to have the height of the \bground{} regions $\bgr_{\{n,N\}}$ and % $\bgr_{\{f,F\}}$ to be painted. % \end{Sloppy} % % \item % \!\pcol@buildcolseprule! lets $\!\@elt!=\!\pcol@buildcselt@S!$ and then % $\!\@elt!=\!\pcol@buildcselt!$ for $\pp^s(p)$, and then \!\def!ines % \!\pcol@bg@columnheight! with \!\@elt! to add $H'_n$ and $\!\@maxdepth!$ % or 0 for the \bground{} region $\bgr_{\{c,g\}}^c(n+1)$ where % $n=\Abs{\pp^s(p)}$. % % \item % \!\pcol@buildcselt@S! \!\def!ines \!\pcol@bg@spanningtop! and % \!\pcol@bg@spanning~height! with \!\@elt! to define the region % $\bgr_S(i)$. % % \item % \begin{Hfuzz}{0.55pt} % \!\pcol@buildcselt! \!\def!ines \!\pcol@bg@columnheight!, % \!\pcol@bg@spanningtop! and \!\pcol@bg@spanningheight! with \!\@elt! to % define regions $\bgr_{\{c,g\}}^c(i)$ and $\bgr_s(i)$. % \end{Hfuzz} % % \item % $\!\pcol@bg@calculate!\arg{z}\arg{z_0}\Arg{F}$ lets % $\!\@elt!=\!\pcol@bg@advance!$ to let $\!\@elt!\arg{f}$ in $F$ do % $z\gets z+f$. % % \item % $\!\pcol@bg@negative!\Arg{F^-}$ lets $\!\@elt!=\!\pcol@bg@nadvance!$ to % let $\!\@elt!\arg{f}$ in $F^-$ do $z\gets z-f$, and then lets % $\!\@elt!=\!\pcol@bg@advance!$ to go back to addition. % % \item % \!\pcol@output@start! lets all floats $f$ imported in \!\@dbldeferlist! % have depth 0 by \!\def!ining $\!\@elt!\arg{f}$ to do it, \!\edef!ines % \!\pcol@bg@textheight! with \!\@elt! having height-plus-depth of % \preenv{} for \bgpaint{} of it, and \!\def!ines $\pp^m(0)$ having one % element in $\mpb_L^l$ or $\mpb_L^r$ for \!\@mparbottom! in \preenv{}. % % \item % \!\pcol@makenormalcol! lets $\!\@elt!=\!\relax!$ to concatenate % \!\@freelist! and \!\@midlist!. % % \item % \!\pcol@trynextcolumn! lets $\!\@elt!=\!\@scolelt!$ for (the copy of) % $\cc_c(\dl)$. % % \item % \!\pcol@setcurrcol! lets $\!\@elt!=\!\relax!$ to \!\xdef!ine $\cc_c$ with % $\cc_c(\tl)=\!\@toplist!$, $\cc_c(\ml)=\!\@midlist!$, % $\cc_c(\bl)=\!\@botlist!$ and $\cc_c(\dl)=\!\@deferlist!$. % % \item % \!\pcol@scancst! and \!\pcol@iscancst! let $\!\@elt!=\!\relax!$ to % \!\edef!ine the list $M=(m\,\Bar\,\mceltpop_{j,m}\in\cstraw,\;j\geq i)$ for % $\mceltpop_{i,*}$, and then the latter \!\def!ines \!\@elt! as a macro with % an argument $m$ to examine $m\in M$ for $\mcelt_{i,m}$. % % \item % \!\pcol@addmarginpar! lets $\!\@elt!=\!\pcol@setmpbelt!$ for $\PPP$. % % \item % \!\pcol@getmparbottom! lets $\!\@elt!=\!\pcol@getmpbelt!$ for the list % $\mpb_{\{L,R\}}^{\{l,r\}}$. It also lets $\!\@elt!=\!\relax!$ for the % addition of $\mpar(h_i,t_i)$ to the list by itself and % \!\pcol@getmpbelt!. % % \item % \!\pcol@mparbottom@zero! has \!\@elt! in its body to have $\mpar(0,0)$ for % each $M\in\Set{\mpb_X^x}{X\in\{L,R\},x\in\{l,r\}}$ the macro has. % % \item % $\!\pcol@bias@mpbout@i!\Arg{y}\!\@elt!\Arg{t}\Arg{b}\!\@nil!$ has \!\@elt! % in its argument specification, and \!\def!ines \!\reserved@b! with % \!\@elt! for $\mpar(t+y,b+y)$. % % \item % \begingroup\def\,{\mskip0mu plus 2mu\relax} % $\!\pcol@getmparbottom@last@i!\, % \Arg{y}\,\mpar(t_1,b_1)\,\cdots\,\mpar(t_n,b_n)\,\!\@nil!$ at first % \!\def!\-ines \!\reserved@b! with \!\@elt! for $\mpar(y,y)$ and then % \!\def!ines \!\@elt! to do it for $\mpar(t_i,b_i)$ for all $i\in[1,n]$. % \endgroup % % \item % \!\pcol@makefcolumn! lets $\!\@elt!=\!\pcol@makefcolelt!$ for (the copy % of) $\cc_c(\dl)$ to examine if each float in it can be put in a \fcolumn{} % to be built, and then \!\def!ine it to put floats in $\cc_c(\tl)$ into % $\cc_c(\vb^b)$. % % \item % \!\pcol@addflhd! lets $\!\@elt!=\!\pcol@hdflelt!$ for its argument % $\cc_c(\tl)$ or $\cc_c(\bl)$, and then $\!\@elt!=\!\relax!$ to give the % default. % % \item % \!\pcol@makeflushedpage! \!\edef!ines \!\pcol@bg@floatheight! with % \!\@elt! letting it be \!\relax!. % % \item % \!\pcol@imakeflushedpage! \!\def!ines \!\pcol@bg@footnoteheight! with % \!\@elt!. % % \item % \!\pcol@output@end! uses \!\@elt! in the argument specification of the % \!\def!inition of \!\pcol@do@mpbout@elem!, lets $\!\@elt!=\!\relax!$ to % add the \spanning{} of the last page to the head of \!\@dbldeferlist!, and % uses it in the body of \!\pcol@bg@textheight! and % \!\pcol@bg@footnoteheight! to be \!\def!ined for \bgpaint{} of % \Scfnote{}s. % % \item % \begin{Hfuzz}{0.14pt}% % \!\pcol@zparacol! lets $\!\@elt!=\!\pcol@remctrelt!$ for $\CG$, % $\!\@elt!=\!\pcol@thectrelt!$ for $\CTL$, $\!\@elt!=\!\pcol@loadctrelt!$ % for $\Cc_0$, $\!\@elt!=\!\pcol@cmpctrelt!$ for $\CTL$, % $\!\@elt!=\!\pcol@defcomelt!$ for \!\pcol@localcommands!, and then % $\!\@elt!=\!\relax!$ to give the default. % \end{Hfuzz} % % \item % \!\globalcounter!\marg{ctr} defines \!\@elt!\marg{\theta} for $\CG$ to % check if there is $\theta\in\CG$ such that $\theta=\arg{ctr}$. % % \item % \!\pcol@localcommands! has the sequence of $\!\@elt!\ARg{com}$ for all % \lcommand{}s $|\|\arg{com}$. % % \item % \!\pcol@gcounters! has \!\@elt!|{page}| as its initial definition. % % \item % $\!\pcol@removecounter!\arg{\Theta'}\arg{\theta}$ lets % $\!\@elt!=\!\pcol@iremctrelt!$ for (the copy of) its argument % $\mathit{\Theta}'$ to remove $\theta$ from it. % % \item % $\!\pcol@sscounters!\arg{elt}$ lets $\!\@elt!=\arg{elt}$, where % $\arg{elt}=\!\pcol@storectrelt!$ or $\arg{elt}=\!\pcol@savectrelt!$, for % $\CTL$, and then $\!\@elt!=\!\relax!$ to \!\xdef!ine $\Cc_c$. % % \item \begingroup\hfuzz1.4pt % $\!\pcol@com@synccounter!\<\theta\>$ gives $\!\@elt!\Arg{\theta}$ as the % argument of |\pcol@synccounter|. %  % \SpecialIndex{\pcol@synccounter} % \par\endgroup % % \item \begingroup\hfuzz0.51pt % $\!\pcol@synccounter!\arg{lst}$ lets $\!\@elt!=\!\relax!$ to have the list % $\arg{lst}$ in \!\reserved@a! by \!\edef!, $\!\@elt!=\!\pcol@loadctrelt!$ % for $\CC_c$, and then $\!\@elt!=\!\pcol@syncctrelt!$ for $\arg{lst}$. % \par\endgroup % % \item % $\!\pcol@stepcounter!\<\theta\>$ lets $\!\@elt!=\!\pcol@stpldelt!$ for % $\CTL$, $\!\@elt!=|\pcol@|\~|stpclelt|$ %  % \SpecialIndex{\pcol@stpclelt} %  % for $\clist(\theta)$, and then $\!\@elt!=\!\@stpelt!$ for % $\clist(\theta)$. % % \item % \!\pcol@switchcol! lets $\!\@elt!=\!\pcol@setctrelt!$ for $\CC_c$, % $\!\@elt!=|\pcol@|\~|aconlyelt|$ %  % \SpecialIndex{\pcol@aconlyelt} %  % for $\T$, and then $\!\@elt!=\!\relax!$ to give the default. % % \item % \!\pcol@icolumncolor! \!\def!ines $\!\@elt!\arg{\celtshadow_i}$ to apply % \!\reset@color! for rewinding and \!\pcol@set@color! for reestablishing % to each $\celtshadow_i\in\CSTshadow^c=(\Celtshadow^c,\cstshadow)$ % by \!\pcol@scancst@shadow!, in which \!\@elt! is explicitly applied to % $\Celtshadow^c$ if it is defined and then implicitly done to % $\cstshadow=\!\pcol@colorstack@shadow!$. % % \item % \!\pcol@set@color@push! lets $\!\@elt!=\!\relax!$ to push a color % information into $\cstshadow$, with save\slash restore of its original % value. % % \item % \!\resetbackgroundcolor! lets $\!\@elt!=\!\pcol@resetbackgroundcolor!$ to % scan \!\pcol@bg@defined! containing $\!\@elt!\Arg{a'_i}$ to let % $|\pcol@bg@color|{\cdot}a'_i$ for each of $i$. %  % \SpecialArrayIndex{a}{\pcol@bg@color@} % \SpecialArrayIndex{a{\cdot}\string\texttt{@}{\cdot}c}{\pcol@bg@color@} % \end{itemize} % % \item[\Uidx{\!\@empty!}] % is a macro always having nothing. Its major usages are to examine if a % macro often having a list is empty, and to make such a macro empty. The % following macros use \!\@empty! to examine the emptiness of the objects in % parentheses. %  % \begin{quote} % \!\pcol@combinefloats! ($\cc_c(\tl)$, $\cc_c(\bl)$)\\ % \!\pcol@checkshipped! ($S_c$)\\ % \!\pcol@startpage! ($\pp(\ptop)$, \!\@dbltoplist!)\\ % \!\pcol@makenormalcol! (\!\@botlist! in \preenv)\\ % \!\pcol@getmparbottom! ($\pp^m(p)$)\\ % \!\pcol@getmparbottom@last! ($\pp^m(\ptop)$)\\ % \!\pcol@setmpbelt! ($\pp^m(p)$)\\ % \!\pcol@flushcolumn! ($\cc_c(\dl)$)\\ % \!\pcol@makefcolumn! ($\cc_c(\tl)$, $\cc_c(\dl)$)\\ % \!\pcol@measurecolumn! ($\cc_c(\bl),\cc_c(\dl)$)\\ % \!\pcol@addflhd! ($\cc_c(\tl)$, $\cc_c(\bl)$)\\ % \!\pcol@synccolumn! ($\cc_c(\tl)$)\\ % \!\pcol@makeflushedpage! ($\cc_c(\dl)$)\\ % \!\pcol@imakeflushedpage! ($\cc_c(\dl)$)\\ % \!\pcol@iflushfloats! ($\cc_c(\dl)$)\\ % $\!\pcol@setcw@getspec@i!\arg{default}\$ ($x'_d$)\\ % $\!\pcol@setcw@fill!\\!\fill!$ ($f$) % \end{quote} %  % The following macros use \!\@empty! to empty the objects in parentheses. %  % \begin{quote} % \!\pcol@cflt! ($\cc_c(\tl)$)\\ % \!\pcol@setpageno! ($\PP$, $\pp(\ptop)$)\\ % \!\pcol@startpage! ($\cc_c(\dl)$, \!\@dbldeferlist!, \!\@deferlist!, % \!\@dbltoplist!)\\ % \!\pcol@trynextcolumn! ($\cc_c(\dl)$)\\ % \!\pcol@output@start! ($\PP$, $\pp(\ptop)$, $\cc_c(\dl)$)\\ % \!\pcol@makenormalcol! (\!\@midlist! in \preenv)\\ % \!\pcol@addmarginpar! ($\PP$, $\pp(\ptop)$)\\ % \!\pcol@getmparbottom! ($\mpb_{\{L,R\}}^{\{l,r\}}$)\\ % \!\pcol@makefcolumn! ($\cc_c(\dl)$, $\cc_c(\tl)$)\\ % \!\pcol@makeflushedpage! ($\cc_c(\tl)$)\\ % \!\pcol@freshpage! ($\PP$, $\pp(\ptop)$)\\ % \!\pcol@zparacol! (\!\@gtempa!)\\ % \!\pcol@removecounter!$\<\mathit{\Theta}'\>\Arg{\theta}$ % ($\mathit{\Theta}'\in\{\CG,\CL\}$)\\ % \!\pcol@sscounters! ($\Cc_c$) % \end{quote} % % \item[\Uidx{\!\@currentlabel!}] % is an internal macro to have the reference to be associated with the % \!\label! following it. It is defined in \!\pcol@fntextbody! to have the % reference to the footnote with \!\@thefnmark!. % % \item[\Uidx{\!\ext@figure!}] % is an internal macro having ``|lof|'' being the extension of the file for % list of figures. It is used in % $\!\pcol@ac@caption!\arg{type}|[|\arg{lcap}|]|\$ to have ``|lof|'' % when $\arg{type}=|figure|$. % % \item[\Uidx{\!\ext@table!}] % is an internal macro having ``|lot|'' being the extension of the file for % list of tables. It is used in % $\!\pcol@ac@caption!\arg{type}|[|\arg{lcap}|]|\$ to have ``|lot|'' % when $\arg{type}=|table|$. % % \item[\Uidx{\!\@currbox!}] % is an internal macro which conventionally has an \!\insert! for floats, % etc. The following macros use \!\@currbox! having the objects in % parentheses. %  % \begin{quote} % \!\pcol@opcol! ($\cc_c(\vb)$)\\ % \!\pcol@startpage! ($\pp^i(\ptop)$)\\ % \!\pcol@ioutputelt! ($\s_c(q)$)\\ % \!\pcol@output@start! ($\pp^i(0)$, $\cc_c(\vb)$, $\Celt^c$)\\ % \!\pcol@output@switch! ($\cc_c(\vb)$)\\ % \!\pcol@restartcolumn! ($\cc_c(\vb)$)\\ % \!\pcol@igetcurrcol! ($\cc_c(\vb)$)\\ % \!\pcol@setcurrcol! ($\cc_c(\vb)$)\\ % \!\pcol@putbackmvl! ($\cc_c(\vb)$)\\ % \!\pcol@iscancst! ($\Celt^c$)\\ % \!\pcol@addmarginpar! (left marginal note)\\ % \!\pcol@flushcolumn! ($\cc_c(\vb), \s_c(q)$)\\ % \!\pcol@makefcolumn! ($\cc_c(\vb)$)\\ % \!\pcol@measurecolumn! ($\cc_c(\vb)$)\\ % \!\pcol@synccolumn! ($\cc_c(\vb)$)\\ % \!\pcol@imakeflushedpage! ($\cc_c(\vb)$)\\ % \!\pcol@freshpage! ($\cc_c(\vb)$)\\ % \!\pcol@output@end! (top float, $\cc_c(\vb)$)\\ % \!\pcol@end@dblfloat! (\pwise{} float)\\ % \!\pcol@icolumncolor! ($\Celt^c$) % \end{quote} % % \item[\Uidx{\!\@marbox!}] % is an internal macro which has an \!\insert! for left marginal notes. It % is used in \!\pcol@xympar!. % % \item[\Uidx{\!\@currlist!}] % is an internal macro which has an list of \!\insert!s for floats and % marginal notes given to \!output!. It is used in \!\pcol@addmarginpar! to % get the right marginal note from its head. % % \item[\Uidx{\!\@freelist!}] % is an internal macro having available \!\insert!s for floats originally, % but also \colpage{}s, \spanning{}, footnotes and default column-color in % our usage. Besides the acquisition of an \!\insert! from it shown in the % description of \!\@next!, it is used by the following macros to return the % the objects in parentheses to \!\@freelist!. %  % \begin{quote} % \!\pcol@cflt! ($\cc_c(\tl)$)\\ % \!\pcol@startpage! (\!\@dbltoplist!)\\ % \!\pcol@outputelt! ($\pp^i(q)$)\\ % \!\pcol@ioutputelt! ($\pp^i(q)$, $\pp^f(q)$, $\s_c(q)$)\\ % \!\pcol@startcolumn! ($\pp^f(\ptop)$)\\ % \!\pcol@output@start! ($\cc_0(\vb)$)\\ % \!\pcol@makenormalcol! (\!\@midlist! in \preenv)\\ % \!\pcol@restartcolumn! ($\cc_c(\vb)$, $\pp^f(p)$ or $\cc_c(\ft)$)\\ % \!\pcol@savefootins! ($\pp^f(p)$ or $\cc_c(\ft)$)\\ % \!\pcol@flushcolumn! ($\cc_c(\ft)$)\\ % \!\pcol@makefcolpage! ($\cc_c(\tl)$)\\ % \!\pcol@makeflushedpage! ($\pp^i(\ptop)$, $\pp^f(\ptop)$)\\ % \!\pcol@imakeflushedpage! ($\cc_c(\ft)$)\\ % \!\pcol@output@end! ($\pp^f(\ptop)$, $\cc_c(\vb)$, $\Celt^c$) % \end{quote} %  % In addition \!\pcol@F@count! scans its element to have its cardinality. % % \item[\Uidx{\!\@nil!}] % is an internal control sequence which is conventionally used to terminate % a variable length argument. It is used in the following macros. %  % \begin{itemize} % \item % \!\pcol@getcurrpinfo! for the invocation of \!\@cdr!. % % \item % $\!\pcol@bias@mpbout@i!\Arg{y}\!\@elt!\Arg{t}\Arg{b}\!\@nil!$ to capture % $t$ and $b$ following the convention in \!\pcol@do@mpb@all@ii!. % % \item % \begingroup\def\,{\mskip0mu plus 2mu\relax} % $\!\pcol@getmparbottom@last@i!\, % \Arg{y}\,\mpar(t_1,b_1)\,\cdots\,\mpar(t_n,b_n)\,\!\@nil!$ to capture % $\mpar(t_i,b_i)$ for all $i\in[1,n]$. % \endgroup % % \item % $\!\pcol@do@mpb@all@i! % \Arg{\mpb_L^l}\Arg{\mpb_L^r}\Arg{\mpb_R^l}\Arg{\mpb_R^r}$ to terminate the % list $M\in\Set{\mpb_X^x}{X\in\{L,R\},x\in\{l,r\}}$ in the invocation of % \!\pcol@do@mpb@all@ii!. % % \item % $\!\pcol@do@mpb@all@ii! % \Arg{y}\mpar(t_1,b_1)\cdots\mpar(t_n,b_n)\!\@nil!$ to capture % $\mpar(t_i,b_i)$ for all $i\in[1,n]$, and then to terminate them % passed to \!\pcol@bias@mpbout@i! or \!\pcol@getmparbottom@last!. % % \item % \!\pcol@setcw@scan! for the invocation of\\\mbox{}\qquad % $\!\pcol@setcw@getspec!\|/|\|/|\arg{garbage}\~\!\@nil!$. % % \item % \!\pcol@setcw@getspec@i! for the invocation of\\\mbox{}\qquad % $\!\pcol@extract@fil!\| plus |\| minus|\arg{garbage}\!\@nil!$\\ % and thus in the \!\def!inition of it in \!\pcol@def@extract@fil!. % % \item % \!\pcol@defkw! has \!\@nil! in its argument specification to terminate the % argument $0\,|pt|\ |plus|\ 1\,|fil|\ |minus|\ 1\,|fil|$. % % \item % \!\pcol@extract@fil@i!, \!\pcol@extract@fil@ii! and % \!\pcol@extract@fil@iii! have \!\@nil! in their argument specifications as % the terminator, and thus \!\@nil! appears in their invocations in % \!\pcol@extract@fil!, \!\pcol@extract@fil@i! and \!\pcol@extract@fil@ii! % respectively, and in the \!\def!inition of \!\pcol@extract@fil@iii! in % \!\pcol@def@extract@fil@iii!. % % \item % \!\pcol@iadjustfnctr! and \!\pcol@iifootnotetext! to terminate their % argument |[|$[|+-|]\meta{disp}$|]| passed to \!\pcol@calcfnctr!. % % \item % \!\backgroundcolor! and \!\nobackgroundcolor! to terminate their first % argument given to \!\pcol@backgroundcolor! so that its descendants % \!\pcol@backgroundcolor@x! and \!\pcol@backgroundcolor@z! finally capture % everything not processed by their ancestors. % \end{itemize} % % \item[\Uidx{\!\current@color!}] % is an internal macro having color information to be put into |.dvi| as a % part of the argument of coloring \!\special!. It is referred to by % \!\pcol@bg@paintregion@i!, % \!\pcol@output@start!, % \!\pcol@icolumncolor!, % \!\pcol@iicolumncolor!, and % \!\pcol@set@color@push!, % \!\pcol@backgroundcolor@y!. % % \item[\Uidx{\!\@dbldeferlist!}] % is an internal macro having the list of \pwise{} floats whose page % appearance are not yet fixed. It is scanned and then updated in % \!\pcol@startpage! and \!\pcol@output@clear!, while \!\pcol@output@start! % lets it have \!\@deferlist! made before \beginparacol, and % \!\pcol@output@end! adds \pwise{} floats to be put in the empty % \lpage{} to it and then move the whole of the list to \!\@deferlist!. % As discussed in \secref{sec:imp-ovv-float}, 2015 or later version of % \LaTeX{} no longer uses this list, but we stick with it for \pwise{} % floats produced in \env{paracol} environments and thus have its top level % definition with empty body in \Paracol. % % \item[\Uidx{\!\@dbltoplist!}] % is an internal macro having the list of \pwise{} floats which % \!\@sdblcolelt! decided to be put in the new page. The macro % \!\pcol@startpage! scans it to put all floats into the page $\ptop$ as its % \spanning{} $\pp^i(\ptop)$, and then empties it after returning all floats % to \!\@freelist!. % % \item[\Uidx{\!\@deferlist!}] % is an internal macro having the list of \cwise{} floats whose page % appearance are not yet fixed. It is scanned and then updated in % \!\pcol@startcolumn!, \!\pcol@trynextcolumn!, \!\pcol@flushcolumn!, % \!\pcol@makefcolumn! and \!\pcol@iflushfloats!, while the following macros % also act on it. %  % \begin{itemize} % \item % \!\pcol@output@start! moves it to \!\@dbldeferlist! because it is created % before \beginparacol. % % \item % \!\pcol@startpage! uses it as the interface with \!\@addtodblcol! of 2015 % or later version of \LaTeX{} as discussed in % item-(\ref{item:ovv-float-@addtodblcol}) of % \secref{sec:imp-ovv-float}. % % \item % \!\pcol@setcurrcol! and \!\pcol@igetcurrcol! saves\slash restores it % into/from $\cc_c(\dl)$, respectively. % % \item % \!\pcol@makefcolelt!$\arg{flt}$ returns $\arg{flt}$ to the list if % $\arg{flt}$ cannot be put in the \fcolumn{} which the macro is working on. % % \item % \!\pcol@measurecolumn! examines its emptiness to let % $\CSIndex{ifpcol@dfloats}=\true$ iff not empty. % % \item % \!\pcol@output@end! lets it have \!\@dbldeferlist! so that it processed as % \cwise{} floats after \Endparacol. % \end{itemize} % % \item[\Uidx{\!\@toplist!}] % is an internal macro having the list of \cwise{} floats which is % decided to be put at the top of the \ccolpage{} by float environments or by % \!\pcol@trynextcolumn!. This list is scanned by \!\pcol@cflt! if its % invoker \!\pcol@combinefloats! finds the macro is not empty. The list is % also scanned by \!\pcol@makecol!, \!\pcol@output@switch! and % \!\pcol@measurecolumn! using \!\pcol@addflhd! for the measurement of the % combined size of top floats, while \!\pcol@setcurrcol! and % \!\pcol@igetcurrcol! saves\slash restores the list into/from $\cc_c(\tl)$ % respectively. In addition our macros may add an element or build the % entire list in the following two cases. One case is for a \sync{}ation % for which \!\pcol@synccolumn! lets the main vertical list in % $\cc_c(\vb^b)$ be a float, namely {\em\mvlfloat} to be added to this list. % Another case is for a \fcolumn{} in the \lpage{} for which % \!\pcol@makefcolumn! and \!\pcol@makefcolelt! build this list for deferred % floats. In the latter case, the list is scanned by \!\pcol@makefcolpage! % invoked from \!\pcol@makefcolumn! itself, \!\pcol@flushcolumn! and % \!\pcol@makeflushedpage!. % % \item[\Uidx{\!\@botlist!}] % is an internal macro having the list of \cwise{} floats which is % decided to be put at the bottom of the \ccolpage{} by float environments or % by \!\pcol@trynextcolumn!. The emptiness of this list examined by % \!\pcol@combinefloats! to invoke the scanner \!\@cflb! unless empty, % by \!\pcol@output@start! to calculate the room for each \colpage{} in the % \spage, and by \!\pcol@makenormalcol! to decide whether \!\@makecol! is % used or not for building \preenv. The list is also scanned by % \!\pcol@measurecolumn! for the measurement of the combined size of bottom % floats, while \!\pcol@setcurrcol! and \!\pcol@igetcurrcol! saves\slash % restores the list into/from $\cc_c(\bl)$ respectively. % % \item[\Uidx{\!\@midlist!}] % is an internal macro having the list of in-text floats which has already % been put in the \ccolpage{} but is kept to check the ordering of the % succeeding floats. The list is emptied by \!\pcol@makenormalcol! after % returning all elements in it to \!\@freelist!, while \!\pcol@setcurrcol! % and \!\pcol@igetcurrcol! saves\slash restores the list into/from % $\cc_c(\ml)$ respectively. % % \item[\Uidx{\!\f@depth!}] % is an internal macro having |1sp| or being \!\let!-equal to \!\z@! to % specify the float category, \pwise{} or \cwise{} respectively, which % float-related macros work on. As discussed in % item-(\ref{item:ovv-float-@dblfloatplacement}) of % \secref{sec:imp-ovv-float}, this feature introduced in 2015 version % of \LaTeX{} is nullified in \env{paracol} environments and thus the % setting with |1sp| done by \!\@dblfloatplacement! is overridden by % \!\pcol@startpage! and \!\pcol@output@clear! when they invoke the macro. % % \item[\Uidx{\!\cl@@ckpt!}] % is an internal macro having the list of all counters defined by % \!\newcounter! and the counter \counter{page}. The original usage of this % macro is to log the values of all counters into |.aux| by \!\include!, but % we use it to obtain all counters in \!\pcol@zparacol! and % \!\pcol@globalcounter@s!. % % \item[$\cs{cl@}{\cdot}\theta$] % is an internal macro having the list $\clist(\theta)$ of descendant % counters of the counter $\theta$ whose increment by \!\stepcounter! lets % them 0. The macro \!\pcol@remctrelt! moves it to % $|\pcol@cl@|{\cdot}\theta$ %  % \Uidx{\SpecialArrayIndex{\theta}{\cl@}} %  % and re\!\def!ines it to have $\!\pcol@stepcounter!\Arg{\theta}$. % % \item[\Uidx{\!\reserved@a!}] % is an internal macro for temporary use. Its usages are as follows. %  % \begin{itemize} % \item % In \!\pcol@Fe!, it is used to keep the cardinality of \!\@freelist! in % \!\pcol@F@n! to log it by \!\pcol@FF! after \!\pcol@F@n! is let have % another measurement result. % % \item % In $\!\pcol@iLogLevel!\\arg{name}$, it is used to implement % $\!\let!|\|\arg{name}=|\|\arg{name}{\cdot}l'$ where $l'$ is the roman % representation of the level $l$. % % \item % In \!\pcol@setpageno!, it has $\PPP$ so that we update $\PP$ and % $\pp(\ptop)$ scanning their original contents. % % \item % In \!\pcol@getcurrpinfo!, it has $\pp(\ptop)$ so that we give its five % components to \!\pcol@getpinfo! as its first five arguments. % % \item % In \!\@outputpage!, it has a sequence of \bgpaint{} for both left and % right \parapag{}es to be shipped out outside \env{paracol} environment. % % \item % In \!\pcol@outputpage@ev!, it has the expansion result of % \!\meaning!\!\yoko! to be compared with \!\reserved@b! having % \!\string!\!\yoko! for examining if \!\yoko! is a primitive of underlying % \TeX{}. % % \item % In $\!\pcol@bg@paintregion!\arg{a}\arg{c}$, it is let have % $a'=a{\cdot}|@|{\cdot}c$ or $a'=a$, and then referred to by % \!\pcol@bg@paintregion@i! to use $|\pcol@bg@color|{\cdot}a'$, and by % $\!\pcol@bg@addext!\arg{z}\Arg{s}\Arg{d}$ to use % $|\pcol@bg@ext@|{\cdot}d{\cdot}|@|{\cdot}a'$. %  % \SpecialArrayIndex{a{\cdot}\string\texttt{@}{\cdot}c}{\pcol@bg@color@} % \SpecialArrayIndex{a}{\pcol@bg@color@} % \SpecialArrayIndex{d{\cdot}\string\texttt{@} % {\cdot}a{\cdot}\string\texttt{@}{\cdot}c}{\pcol@bg@ext@} % \SpecialArrayIndex{d{\cdot}\string\texttt{@}{\cdot}a}{\pcol@bg@ext@} % % \item % In \!\pcol@specialoutput!, it is \!\let!-equal to $|\pcol@output@|{\cdot}f$ % corresponding to $\!\outputpenalty!=|\pcol@op@|{\cdot}f$, or % \!\@specialoutput!. % % \item % In \!\pcol@output@start!, it is let have a \bgpaint{} macro % \!\pcol@bg@paintbox! and the definition of a parameter % \!\pcol@bg@textheight! for it. % % \item % In \!\pcol@output@switch!, it is \!\let!-equal to \!\@nobreaktrue! or % \!\@nobreakfalse! according to \CSIndex{if@nobreak} in the leaving column % to broadcast it to other columns. % % \item % In \!\pcol@ifempty!$\arg{box}\arg{then}\arg{else}$, it has $\arg{then}$ or % $\arg{else}$ according to the emptiness of $\arg{box}$. % % \item % In \!\pcol@clearcolorstack!, it is \!\def!ined to put an uncoloring % \!\special! by \!\reset@color! for its argument $\celt_i$ in % \!\pcol@iscancst!. % % \item % In \!\pcol@restorecst!, it is \!\def!ined to put a coloring \!\special! in % its argument $\celt_i$ by \!\unvbox! done in \!\pcol@iscancst!. % % \item % In \!\pcol@addmarginpar!, at first it is made let equal to 0 or $\CL$ % according to $c<\CL$ or not. Then it is let have $\PPP$ to be scanned to % find $\pp^m(p)$. % % \item % In \!\pcol@getmparbottom@i!, it is let have one of % $\mpb_{\{L,R\}}^{\{l,r\}}$ according to the side margin which the marginal % note to be added goes to, and then it is referred to by % \!\pcol@getmparbottom!. % % \item % In \!\pcol@setmpbelt@i!, it is let have what $\pp^m(p)$ should have after % the update of a list of marginal notes in it, and then \!\pcol@setmpbelt! % updates $\pp(p)$ with the new $\pp^m(p)$ in the macro. % % \item % In $\!\pcol@bias@mpbout!\Arg{y}$ and $\!\pcol@getmparbottom@last!\Arg{y}$, % it is let have $\!\pcol@bias@mpbout@i!\Arg{y}$ and % $\!\pcol@getmparbottom@last@i!\Arg{y}$ respectively, so that they are % invoked in \!\pcol@do@mpb@all@ii!. % % \item % In \!\pcol@makeflushedpage!, it is let have an invocation of % \!\pcol@bg@paintbox! for \pwise{} floats in $\pp^i(\ptop)$ together with % the condition of the \bgpaint. % % \item % In \!\pcol@output@end!, it is let have the invocation of % \!\pcol@bg@paintbox! for \bgpaint{} of \Scfnote{}s with the condition to % do it and a \!\def!inition of \!\pcol@bg@footnoteheight!. % % \item % In $\!\pcol@defcomelt!\arg{com}$, it is used to implement % $\!\let!|\|\arg{com}=|\pcol@com@|{\cdot}\~\arg{com}$. % % \item % In \!\pcol@setcolumnwidth!, it is made \!\let!-equal to % \!\pcol@setcolwidth@s! or \!\pcol@setcolwidth@r! according to % $\!\pcol@columnratioleft!=\!\relax!$ or not. % % \item % In \!\pcol@setcolwidth@r!, it is used to have the fraction $r_d$ being a % comma-separated list element in its argument $\arg{ratio}$ defined by % \!\columnratio! and scanned by a \!\@for! loop. % % \item % In $\!\pcol@setcw@scan!\<\Cfrom\>\<\Cto\>\Arg{spec}$, at first it is let % have $\arg{spec}$, then the result of adding `|,|' as many as % $\Cto-\Cfrom$ to the tail, and finally each element in the extended % $\arg{spec}$ in a \!\@for! loop. % % \item % In $\!\pcol@setcw@getspec@i!\arg{default}\$, it is let have % $\$ from which all space tokens are removed. % % \item % In \!\pcol@setcw@calcfactors!, it is used as a waste basket to throw away % $(\WT-W)/(F\times1\,|pt|)$ calculated by \!\pcol@setcw@calcf!. % % \item % In $\!\pcol@extract@fil@i!\|.|\\!\@nil!$, it has % $\|.|\$, and is referred to by % \!\pcol@extract@fil@ii!. % % \item % In \!\globalcounter!\marg{ctr}, it is used to have $\arg{ctr}$ for the % \CSIndex{ifx}-comparison with each $\theta\in\CG$. % % \item % In $\!\pcol@remctrelt!\<\theta\>$, it is used to implement % $\!\let!|\pcol@cl@|{\cdot}\theta=|\cl@|{\cdot}\theta$, %  % \SpecialArrayIndex{\theta}{\pcol@cl@}\SpecialArrayIndex{\theta}{\cl@} % % \item % In $\!\pcol@removecounter!\<\mathit{\Theta}'\>\Arg{\theta}$, it is used to % have $\theta$ for the \CSIndex{ifx}-comparison in \!\pcol@iremctrelt!. % % \item % In $\!\pcol@thectrelt!\<\theta\>$, it is used to implement % $\!\let!|\pcol@thectr@|{\cdot}\theta=|\the|{\cdot}\theta$, %  % \SpecialArrayIndex{\theta}{\pcol@thectr@}\SpecialArrayIndex{\theta}{\the} %  % and then is made \!\let!-equal to $|\pcol@thectr@|{\cdot}\theta{\cdot}0$. %  % \SpecialArrayIndex{\theta{\cdot}c}{\pcol@thectr@} % % \item % In $\!\pcol@synccounter!\arg{lst}$, it has $\arg{lst}$. % % \item % In $\!\pcol@setctrelt!\<\theta\>\<\val_c(\theta)\>$, it is made % \!\let!-equal to $|\pcol@thectr@|{\cdot}\theta$ %  % \SpecialArrayIndex{\theta}{\pcol@thectr@} %  % or % $|\pcol@thectr@|{\cdot}\theta{\cdot}c$. %  % \SpecialArrayIndex{\theta{\cdot}c}{\pcol@thectr@} % % \item % In \!\pcol@switchenv!, it is used to save \!\switchcolumn! which is % redefined in the macro, and then to invoke \!\switchcolumn! with the % original definition. % % \item % In \!\pcol@fntext!\marg{text}, it is \!\let!-equal to \!\pcol@fntextother! % or \!\pcol@fntext~top! according to the footnote $\arg{text}$ is deferred % or not. % % \item % \begin{Hfuzz}{0.6pt}% % In \!\pcol@calcfnctr!$\arg{num}$\!\@nil!, it has the first token of % $\arg{num}$ for \CSIndex{ifx}-comparison with `|+|' and `|-|'. % \end{Hfuzz} % % \item % In $\!\pcol@twosided!|[|T|]|$, it is let have each non-space token in $T$ % given by a \!\@tfor! loop. % \end{itemize} % % \item[\Uidx{\!\reserved@b!}] % is an internal macro for temporary use. It is used in the following % macros to keep a list shown in parentheses so that we update the list in % the scan of list elements. %  % \begin{quote} % \!\pcol@startpage! (\!\@dbldeferlist!)\\ % \!\pcol@outputcolumns! ($\PP$)\\ % \!\pcol@trynextcolumn! ($\cc_c(\dl)$)\\ % \!\pcol@makefcolumn! ($\cc_c(\dl)$)\\ % \!\pcol@removecounter!$\<\mathit{\Theta}'\>\Arg{\theta}$ % ($\mathit{\Theta}'\in\{\CG,\CC\}$) % \end{quote} %  % In addition, it is used in the following macros. %  % \begin{itemize} % \item % In \!\pcol@outputpage@ev!, it has the expansion result of % \!\string!\!\yoko! to be compared with \!\reserved@a! having % \!\meaning!\!\yoko! for examining if \!\yoko! is a primitive of underlying % \TeX{}. % % \item % In \!\pcol@bg@paint@ii!, it has a token in the arguments $K_b$, $K_g$ and % $K_c$ of the macro scanned by \!\@tfor!. % % \item % In \!\pcol@output@switch!, it is \!\let!-equal to |\@afterindenttrue| or % \cs{@after\BB indent\BB false} according to \CSIndex{if@afterindent} in the % leaving column to broadcast it to other columns. % % \item % In \!\pcol@clearcolorstack!, it is \!\def!ined to put an uncoloring % \!\special! by \!\reset@color! for its argument $\Celt^c$ in % \!\pcol@scancst!. % % \item % In \!\pcol@restorecst!, it is \!\def!ined to put a coloring \!\special! in % its argument $\Celt^c$ by \!\unvcopy! done in \!\pcol@scancst!. % % \item % In \!\pcol@scancst! and \!\pcol@iscancst!, after the reference for the % purposes shown in the two items above, it has % $M=(m\,\Bar\,\mceltpop_{j,m}\in\cstraw,\;j\geq i)$ for $\mceltpop_{i,*}$ % and in the latter is scanned to find $m$ for $\mcelt_{i,m}$ in $M$. % % \item % In \!\pcol@addmarginpar!, it is made let equal to $\CL$ or $\C$ % according to $c<\CL$ or not. % % \item % In $\!\pcol@bias@mpbout@i!\Arg{y}\!\@elt!\Arg{t}\Arg{b}\!\@nil!$, it is % let have $\mpar(t+y,b+y)$, and in $\!\pcol@getmparbottom@last@i! % \Arg{y}\mpar(t_1,b_1)\cdots\mpar(t_n,b_n)\!\@nil!$ it is let have % $\mpar(y,y)$ or $\mpar(t_n,b_n)$, so that they are let be a % $\mpb_{\{L,R\}}^{\{l,r\}}$ by \!\pcol@do@mpb@all@ii!. % % \item % In $\!\pcol@setcw@getspec@i!\arg{default}\$, it is let have each % non-space token in $\$ to remove space tokens from it. % % \item % In $\!\pcol@setcw@fill!\\!\fill!$, it is let have $f$. % % \item % In $\!\pcol@extract@fil@ii!\arg{unit}\!\@nil!$, it is let have % $\arg{unit}$. % % \item % In \!\globalcounter!$\Arg{\theta}$, it has $\cg_i\in\CG$ for % \CSIndex{ifx}-comparison with $\theta$. % % \item % In $\!\pcol@iremctrelt!\<\mathit{\Theta}'\>\Arg\theta$, it has $\theta$ for % \CSIndex{ifx}-comparison with $\theta'$ to be removed from $\CG$ or $\CC$. % % \item % In \!\pcol@calcfnctr!$\arg{num}$\!\@nil!, it has `|+|' and then `|-|' for % \CSIndex{ifx}-comparison with the first token of $\arg{num}$. % % \item % In \!\pcol@backgroundcolor@ii!, it has \!\pcol@backgroundcolor@x! or % \!\pcol@back~ground~color@z! according that the region of \bgpaint{} and its % color is defined or undefined. % \end{itemize} % % \item[\Uidx{\!\reserved@c!}] % is an internal macro for temporary use. It is used in \!\pcol@startpage! % to save \!\@deferlist! in it and then to restore the list from it, and in % \!\pcol@iscancst! to have \!\relax! or the macro itself to iterate the % macro recursively. % % \item[\Uidx{\!\reserved@d!}] % is an internal macro for temporary use. It is used in % \!\pcol@iscancst! as a \!\chardef! register to have 0 if $m$ for % $\mcelt_{i,m}$ is not in the list % $M=(n\,\Bar\,\mceltpop_{j,n}\in\cstraw,\;j\geq i)$, or 1 if found. % % \item[\Uidx{\!\@gtempa!}] % is an internal macro used as a \!\global!ly modifiable scratchpad. Its % usages are as follows. %  % \begin{itemize} % \item % In \!\pcol@ifempty!$\arg{box}\arg{then}\arg{else}$, it has \!\lastpenalty! % in a \!\vbox! whose value is examined outside the \!\vbox! for the % emptiness check of $\arg{box}$. % % \item % In \!\pcol@addmarginpar!, it is given to \!\@xnext! as the target to have % the second and successive elements of \!\@currlist! which we cannot modify. % % \item % In \!\pcol@zparacol! and \!\pcol@cmpctrelt!, it has the list of counters % to be synchronized. % % \item % In $\!\pcol@setcw@getspec@i!\arg{default}\$, it is made % \!\@empty! or \!\relax! according to $x'_d$ has \!\fill! or not. % % \item % In \!\pcol@storectrelt!, \!\pcol@savectrelt! and \!\pcol@sscounters!, it % has the new version of $\CC_c$. % \end{itemize} % \end{description} % % % %\iffalse %<*paracol> %\fi % % \section{Register Declaration} % \label{sec:imp-decl} % % \subsection{\cs{count} Registers} % % Here we declare registers and switches. The first group is for \!\count! % registers. %  % \begin{macro}{\pcol@currcol} % \changes{v1.2-1}{2013/05/11} % {Add initialization to 0 after the declaration.} %  % The register \!\pcol@currcol! has the zero-origin ordinal $c$ of the % column which we were in when \!\output! is invoked. Therefore, for % example, in the process of \!\switchcolumn!, the register has $c$ from % which we are switching to another column. The register is initialized to % be 0 by \!\pcol@output@start!, and then set to $\!\pcol@nextcol!=d$ by % \!\pcol@restartcolumn! to switch to (or stay in) $d$. Note that these two % assignments are \!\global! while other macros may {\em locally} use the % register to, for example, scan all columns $c\In0\C$. Besides two macros % above, the following macros refer to the register to know which column we % are in (or which column is processed by their invokers). %  % \begin{quote}\raggedright % \!\pcol@Log@iii!, % \!\pcol@Log@ii!, % \!\pcol@FF!, % \!\pcol@makecol!, % \!\pcol@opcol!, % \!\pcol@bg@columnleft!, % \!\pcol@bg@columnwidth!, % \!\pcol@bg@columnsep!, % \!\pcol@output@switch!, % \!\pcol@getcurrcol!, % \!\pcol@setcurrcol!, % \!\pcol@clearcolorstack!, % \!\pcol@restorecolorstack!, % \!\pcol@addmarginpar!, % \!\pcol@getmparbottom@i!, % \!\pcol@setmpbelt@i!, % \!\pcol@invokeoutput!\footnote{ %  % Only for logging.}, %  % \!\thecolumn!, % \!\pcol@sscounters!, % \!\pcol@setctrelt!, % \!\pcol@com@switchcolumn!, % \!\pcol@switchcol!, % \!\pcol@visitallcols!, % \!\pcol@aconlyelt!, % \!\pcol@flushclear!. % \!\pcol@columncolor!, % \!\normalcolumncolor!, % \!\pcol@icolumncolor!, % \end{quote} %  % Among the macros above, \!\columncolor! and \!\normalcolumncolor! could % refer to the register outside \env{paracol} environment and thus before % the initialization by \!\pcol@output@start!. Therefore, the register is % also initialized to be 0 after its declaration to assure safe reference. % % The following macros use the register for the scan of all $c\In0\C$ by % themselves or their invokers. %  % \begin{quote}\raggedright % \!\pcol@output@start!, % \!\pcol@output@switch!, % \!\pcol@sync!, % \!\pcol@flushcolumn!, % \!\pcol@measurecolumn!, % \!\pcol@synccolumn!, % \!\pcol@makeflushedpage!, % \!\pcol@flushfloats!, % \!\pcol@freshpage!, % \!\pcol@output@end!, % \!\pcol@synccounter!, % \!\pcol@com@syncallcounters!, % \!\pcol@stepcounter!. % \end{quote} %  % The macros \!\pcol@imakeflushedpage! and \!\pcol@iflushfloats! also use % the register for scanning but for $\LBRP\Cfrom\Cto$ given by their % arguments. % % In addition \!\pcol@ccuse!, \!\pcol@ifccdefined! and \!\pcol@ccxdef! % refer to the register to have the control sequence % $|\pcol@columncolor|\cdot c=\Celtshadow^c$ or % $|\pcol@columncolor@box|\cdot c=\Celt^c$ where $c$ is for the current % column or for all columns depending on their invokers. %  % \SpecialArrayIndex{c}{\pcol@columncolor} % \SpecialArrayIndex{c}{\pcol@columncolor@box} % \end{macro} %  % \begin{macro}{\pcol@nextcol} % The register \!\pcol@nextcol! has the zero-origin ordinal $d$ of the % column to which we are switching, or in which we are staying, to be set % into \!\pcol@currcol! by \!\pcol@restartcolumn!. The main usage of the % register is to set the switching target in \!\pcol@switchcolumn!, but % other macros use it to specify the (temporary) target of % \!\pcol@switchcol!; the tallest column in \!\pcol@sync!; 0 in % \!\pcol@zparacol!, \!\pcol@sptext! and \!\endparacol!; all in $\LBRP0\C$ % but $c=\!\pcol@currcol!$ in \!\pcol@visitallcols!; and $c$ in % \!\pcol@flushclear! to stay in the current column $c$. The other user of % this register is \!\pcol@invokeoutput! but only for logging. % \end{macro} %  % \begin{macro}{\pcol@ncol} % \changes{v1.3-3}{2013/09/17} % {Add initial zero-clearing for safe reference in \cs{@outputpage} % invoked prior to the first \string\texttt{paracol}.} % \begin{macro}{\pcol@ncolleft} % \changes{v1.3-2}{2013/09/17} % {Introduced to specify the number of columns in left % parallel-pages.} %  % The register \!\pcol@ncol! has the number of columns $\C$ given as the % argument of \!\paracol!, whose callee \!\pcol@zparacol! being the sole % modifier of the register \!\global!ly assigns $C$ to the register to give % safe reference to \!\@outputbox! invoked after a \env{paracol} is closed. % In addition for the reference in \!\@outputbox! before the first % \env{paracol}, the register is initialized with zero after the declaration. % % The following macros refer to the register to scan all columns $c\In0\C$. %  % \begin{quote}\raggedright % \!\pcol@checkshipped!, % \!\pcol@output@start!, % \!\pcol@output@switch!, % \!\pcol@sync!, % \!\pcol@makeflushedpage!, % \!\pcol@freshpage!, % \!\pcol@output@end!, % \!\pcol@synccounter!, % \!\pcol@com@syncallcounters!, % \!\pcol@stepcounter!, % \!\pcol@visitallcols!. % \end{quote} %  % The register \!\pcol@ncolleft! has $\Uidx\CL$ being the number of columns % in the left {\em\Uidx\parapag{}e} if \parapag{}ing is in effect, or have % $\C$ otherwise. Similar to $\C$, the number $\CL$ is given as the % optional argument of \!\pcol@zparacol! and is \!\global!ly assigned to the % register by the sole modifier \!\pcol@zparacol!, unless the optional % argument is not less than $\C$ which is assigned to $\CL$ if this % exception is found. The reason of the \!\global! assignment and the % initial zero-clearing after the declaration is same as that for $C$, i.e., % for the reference in \!\@outputpage! outside \env{paracol}. % % The following macros examines if $\Uidx\CL<\C$, i.e., if \parapag{}ing is % in effect. %  % \begin{quote}\raggedright % \!\pcol@outputelt!, % \!\@outputpage!, % \!\pcol@output@start!, % \!\pcol@output@flush!, % \!\pcol@output@clear!, % \!\pcol@makeflushedpage!, % \!\pcol@flushfloats!, % \!\pcol@output@end!, % \!\pcol@zparacol!, % \end{quote} %  % \begin{Sloppy}{2350} % In the macros listed above, \!\pcol@outputelt!, \!\pcol@makeflushedpage! % and \!\pcol@flushfloats! passes $\LBRP0\CL$ and $\LBRP\CL\C$ to their % respective callees \!\pcol@ioutputelt!, \!\pcol@imakeflushedpage! and % \!\pcol@iflushfloats! as their argument pair % $\LBRP{\Uidx\Cfrom}{\Uidx\Cto}$ to let them work on the left and right % \parapag{}es respectively. The callees above also pass the pair to % \!\pcol@swapcolumn! to swap the scanning order of columns if \cswap{} is % in effect. % % They also pass the pair to \!\pcol@buildcolseprule! which then passes it % to \!\pcol@bg@paintcolumns! and \!\pcol@bg@paintbox! by binding it to % $\LBRP\CBfrom\CBto=\LBRP{\!\pcol@bg@from!}{\~\!\pcol@bg@to!}$ referred to % by \!\pcol@bg@paint@i! and its callee \!\pcol@bg@paint@ii! to define the % range of columns to be painted is $\LBRP\CBfrom\CBto$. Similar passing is % done by (our own version of) \!\@outputpage!, but it directly uses % $\LBRP0\CL$ and $\LBRP\CL\C$ as the sources and the target painting macros % are \!\pcol@bg@paintpage!, \!\pcol@bg@@paintpage! and % \!\pcol@bg@paintbox!. Note that $\CBto$ is initialized to be % \!\let!-equal to $\C$ because it may be referred to without % binding\footnote{ %  % This meaningless reference has no harmful side effects.}. % \end{Sloppy} % % The macro \!\pcol@addmarginpar! also refers to $\CL$ to know if the % column $c$ on which it is working on is in the left or right \parapag{}e, % i.e., $c<\CL$ or not, to decide the margin to which a marginal note is put, % and to pass $\LBRP0\CL$ or $\LBRP\CL\C$ to \!\pcol@swapcolumn! to % calculate the distance to the left or right margin from the column. The % examination of $c<\CL$ is also done in related macros % \!\pcol@getmparbottom@i! and \!\pcol@setmpbelt@i!. % % Similar column-range specification is done for the argument pair % $\LBRP\Cfrom\Cto$ of \!\pcol@setcolumnwidth! invoked from % \!\pcol@zparacol!. Then the arguments are passed to the callees % \!\pcol@setcolwidth@r! or \!\pcol@setcolwidth@s!, the latter of % which also passes them to its callee \!\pcol@setcw@scan!, to define the % width of columns in $\LBRP\Cfrom\Cto$ and their separators. % % The other references to $\C$ are made by \!\pcol@com@switchcolumn! and % \!\pcol@switchcolumn! to examine $c<\C$, to wraparound $\C-1$ to 0 for the % former and to complain if $c\geq\C$ for the latter. % \end{macro}\end{macro} %  % \begin{macro}{\pcol@page} % The register \!\pcol@page! has the zero-origin ordinal $p$ of the page % which we are in. The register is initialized to be 0 not only by % \!\pcol@output@start! to give the obvious starting point, but also by % \!\pcol@freshpage! for page flushing which clears $\PP=\!\pcol@pages!$ to % give us another type of starting point. Then the register is incremented % by \!\pcol@nextpage! to advance one page, by \!\pcol@nextpelt! to skip a % \fpage, and by \!\pcol@startpage! for a \fpage{} to be created. The other % type of updates of the register is done by \!\pcol@restartcolumn! which % lets $p$ be $\cc_c(\vb^p)$ when we revisit the column $c$ belonging to the % page $p$. Note that, besides these \!\global! updates, % \!\pcol@flushcolumn! locally updates the register to scan % $\PP=\!\pcol@pages!$, and \!\pcol@freshpage! also performs local updates % but in more weird manner. Besides the updates discussed above, the % macros \!\pcol@Log@iii!, \!\pcol@Log@ii!, \!\pcol@FF!, \!\pcol@makecol!, % \!\pcol@opcol!, \!\pcol@setpageno!, \!\pcol@getcurrpage!, % \!\pcol@startcolumn!, \!\pcol@output@switch!, \!\pcol@addmarginpar! and % \!\pcol@fntext! refer to the register to know which page they are % operating on. % \end{macro} %  % \begin{macro}{\pcol@basepage} % The register \!\pcol@basepage! has the ordinal $\pbase$ of the \bpage{} % being the oldest page not shipped out yet. The register is initialized to % be 0 by \!\pcol@output@start! and \!\pcol@freshpage! together with % \!\pcol@page!, and then incremented by \!\pcol@outputelt! when it ships % the page $\pbase$ out. The macros \!\pcol@setpageno!, \!\pcol@nextpage!, % \!\pcol@getcurrpage! and \!\pcol@addmarginpar! refer to the register in % their scans of $\PP$ or $\PPP$ to know the zero-origin ordinal of the % element for the current page $p$ is $p-\pbase$. % \end{macro} %  % \begin{macro}{\pcol@toppage} % \changes{v1.0}{2011/10/10} % {Renamed from \cs{pcol@maxpage}.} %  % The register \!\pcol@toppage! has the ordinal $\ptop$ of the \tpage{} % having the most advanced \colpage{}s, or {\em\Uidx\lcolpage{}s} in short. % The register is initialized to be 0 by \!\pcol@output@start! and % \!\pcol@freshpage! together with \!\pcol@page!, and then let be % $p=\!\pcol@page!$ by \!\pcol@startpage! to start a new page $p$. The % macros \!\pcol@makecol!, \!\pcol@opcol!, \!\pcol@startcolumn!, % \!\pcol@output@switch! and \!\pcol@restartcolumn! refer to the register % to examine if they are working on a \colpage{} in the \tpage, while % \!\pcol@flushcolumn! and \!\pcol@fntext! examines if the \ccolpage{} is % behind the \tpage. The register is also referred to by \!\pcol@Log@iii!, % \!\pcol@Log@ii! and \!\pcol@FF! for logging. % \end{macro} %  % \begin{macro}{\pcol@footnotebase} % \changes{v1.2-2}{2013/05/11} % {Introduced for page-wise footnotes.} %  % The register \!\pcol@footnotebase! is let have the value of \!\c@footnote! % at the start of a \env{paracol} environment by \!\pcol@zparacol! to give % the base value $\Uidx\bf$ for relative numbering of \counter{footnote} % done in \!\pcol@calcfnctr! for the starred versions of \!\footnote!, % \!\footnotemark! and \!\footnotetext!. The register is also referred to % by \!\endparacol! to let \!\c@footnote! have $\bf+\nf$ where % $\nf=\!\pcol@nfootnotes!$ shown below is the number of footnotes in the % \env{paracol} environment to be closed. % \end{macro} %  % \begin{macro}{\pcol@nfootnotes} % \changes{v1.2-2}{2013/05/11} % {Introduced for page-wise footnotes.} %  % The register \!\pcol@nfootnotes! is to accumulate the number of footnotes % $\Uidx\nf$ in a \env{paracol} environment. Therefore, it is zero-cleared % by \!\pcol@zparacol!, then incremented by \!\pcol@ifootnote! and % \!\pcol@ifootnotemark! for \!\footnote! and \!\footnotemark!, and finally % referred to by \!\endparacol! to let $\!\c@footnote!=\bf+\nf$. % \end{macro} %  % \begin{macro}{\pcol@mcid} % \changes{v1.24}{2013/07/27} % {Introduced for coloring specified in math mode.} % \changes{v1.34}{2018/05/07} % {Change its meaning and operations with it a little bit according to % the new text coloring with \cs{insert}.} %  % The register \!\pcol@mcid! has the number of pushes of % \colorstack{} by coloring commands in math mode between two consecutive % invocations of \!\output!. The register is % zero-cleared by \!\pcol@output! because we are definitely in the main % vertical mode and thus all pops corresponding to pushes in math mode must % have been applied to |.tex|'s \colorstack. Then the register % is referred to by \!\pcol@set@color@push! when it is invoked in math mode, % to increment it and then examine if it does not exceed the limit % \!\pcol@mcpushlimit! to mean the math-mode coloring still can be made. The % macro then uses the value of the register as the identifier of the push % operation given to \!\output! through an \!\insert!ion. % \end{macro} % \begin{macrocode} %% Register Declaration \newcount\pcol@currcol \global\pcol@currcol\z@ \newcount\pcol@nextcol \newcount\pcol@ncol \global\pcol@ncol\z@ \newcount\pcol@ncolleft \global\pcol@ncolleft\z@ \newcount\pcol@page \newcount\pcol@basepage \newcount\pcol@toppage \newcount\pcol@footnotebase \newcount\pcol@nfootnotes \newcount\pcol@mcid % \end{macrocode} % % % % \subsection{Switches} % % The second declaration group is for switches. %  % \begin{macro}{\ifpcol@output} % \changes{v1.2-7}{2013/05/11} % {Introduced to solve the \cs{output} request sneaking.} % \changes{v1.22}{2013/06/30} % {Add a user \cs{pcol@reset@color@pop} to inhibit uncoloring if % $\mathit{false}$.} % \changes{v1.3-2}{2013/09/17} % {Add a user \cs{@outputpage} for parallel-paging.} % \changes{v1.3-3}{2013/09/17} % {Add a user \cs{@outputpage} for background-painting.} %  % The switch \CSIndex{ifpcol@output} is $\true$ iff \!\pcol@output@start! % which turns the switch $\true$ has been invoked but \!\pcol@output@end! % which does $\false$ has not yet. Then the switch is examined by % \!\pcol@output! to detect an \!\output! request sneaked from outside of % the \env{paracol} environment. The other users \!\@outputpage! and % \!\pcol@reset@color@pop! examine this switch to know if the macro is % invoked inside or outside of \env{paracol} environment, while the macro % \!\pcol@output@start! temporarily turns the switch $\false$ when it ships % out a page having \preenv{} only. % \end{macro} % % \begin{macro}{\ifpcol@nospan} % \changes{v1.0}{2011/10/10} % {Renamed from \cs{pcol@textonly}.} %  % The switch |\ifpcol@nospan| is $\true$ iff a page $p$ does not have % \spanning, i.e., $\pp^i(p)=\bot$. It is set by by % \!\pcol@getpinfo! for the examination in \!\pcol@ioutputelt!, % \!\pcol@makeflushedpage! and \!\pcol@output@end!. % \end{macro} %  % \begin{macro}{\ifpcol@sync} % \changes{v1.0}{2011/10/10} % {Add initialization to be $\string\mathit{false}$.} % \changes{v1.2-2}{2013/05/11} % {Add \cs{pcol@switchcol} and \cs{pcol@flushclear} to the macros % turning the switch $\string\mathit{true}$ due to column scanning % and pre-flushing column height check.} %  % The switch |\ifpcol@sync| is $\true$ iff \!\pcol@output@switch! is invoked % for \sync{}ed \cswitch{} by \!\switchcolumn!|*| or its relative % environment openers, or \pfcheck{} prior to page flushing or environment % closing. Therefore, the switch is \!\global!ly turned $\true$ by % \!\pcol@iswitchcolumn! and \!\pcol@sptext! for the \sync{}ing % \cswitch{}ing but then temporarily turned $\false$ by \!\pcol@switchcol! % invoked by them for \cscan{}ning and then turned $\true$ again by the % macro. For \pfcheck{}, the macro \!\pcol@flushclear! turns the switch % $\true$. The other macro turns this switch is \!\pcol@output@switch! at % the end of which the switch is turned $\false$ to go back to the default % state. The macros examining this switch are \!\pcol@output@switch!, % \!\pcol@putbackmvl!, \!\pcol@sync!, \!\pcol@invokeoutput! (for logging) and % \!\pcol@switchcol!. % \end{macro} %  % \begin{macro}{\ifpcol@sptextstart} % \changes{v1.3-1}{2013/09/17} % {Introduced to capture the starting point of a spanning text so that % the text is split from other main vertical list stuff.} % \begin{macro}{\ifpcol@sptext} % \changes{v1.0}{2011/10/10} % {Introduced to restrict the broadcast of \cs{if@nobreak} and % \cs{everypar} only when a column-switching is accompanied with % spanning text.} % \changes{v1.3-1}{2013/09/17} % {Renamed from \cs{ifpcol@mctext} following the naming convention, and % move the timing of turning $\string\mathit{true}$ from the end % of a spanning text to its beginning.} %  % The switch |\ifpcol@sptextstart| is $\true$ iff \!\pcol@output@switch! is % invoked from \!\pcol@sptext! prior to a \mctext. That is, the switch is % \!\global!ly\footnote{ %  % Not necessary to be \cs{global}ly turned but we dare to do that to clearly % distinguish that from the local turning in \cs{pcol@putbackmvl}.} %  % let $\true$ and then $\false$ by \!\pcol@sptext! before and % after the invocation of \sync{}ed \!\pcol@switchcol! prior to the % \mctext. Then the switch is examined by \!\pcol@putbackmvl! after % the \sync{}ation to save the {\em\Uidx\prespan}, being all stuff in main % vertical list prior to the \sync{}ation, so that the \mctext{} is split % from the stuff and is captured afterward by \!\pcol@makecol! and/or % \!\pcol@output@switch!. The macro also locally turns the switch % $\false$ if it does not follow the \sync{}ation, i.e., its invocation is % for \cscan{}ning or is caused by pre-\sync{}ation page break, to do the % saving only when it follows the \sync{}ation. The switch is also examined % in \!\pcol@output! to inhibit the warning and forced page break even when % $\cc_0(\vb^r)=\!\@colroom!<1.5\!\baselineskip!$, because we may let it have % a small value when the \mctext{} starts near the page bottom to capture % the text portion in the page by \!\pcol@makecol!. In addition, it is % examined by \!\pcol@switchcol! to invoke $|\pcol@colpream|{\cdot}c$, % where $c=-1$ if $\true$ or $c=\!\pcol@currcol!$ otherwise. %  % \SpecialArrayIndex{c}{\pcol@colpream} % % The macro \!\pcol@sptext! then \!\global!ly turns another switch % \CSIndex{ifpcol@sptext} $\true$ before putting the \mctext{} into the main % vertical list so that \!\pcol@makecol! for the page break in the text and % \!\pcol@output@switch! for closing capture the text to place it % appropriately especially when \cswap{} is in effect. Then the switch % is \!\global!ly turned $\false$ by \!\pcol@output@switch! to give the % default state after it {\em broadcasts} \CSIndex{if@nobreak}, % \CSIndex{if@afterindent} and \!\everypar! to all columns. % \end{macro}\end{macro} %  % \begin{macro}{\ifpcol@clear} % \changes{v1.0}{2011/10/10} % {Add initialization to be $\string\mathit{false}$.} % \changes{v1.2-2}{2013/05/11} % {Add \cs{pcol@flushclear} to the macros turning the switch % $\string\mathit{true}$ due to the pre-flushing column height % check.} %  % The switch |\ifpcol@clear| is $\true$ iff \!\pcol@output@switch! is % invoked for \pfcheck{}, page flushing or environment closing. Therefore, % the switch is turned $\true$ by \!\pcol@flushclear! in the first case, and % by \!\pcol@makeflushedpage! in the latter two. These two macros also % turned the switch $\false$ after the direct\slash indirect invocation of % \!\pcol@output@switch! to give the default state. The switch is examined % by \!\pcol@output@switch! and its descendants \!\pcol@sync!, % \!\pcol@flushcolumn! and \!\pcol@synccolumn! for \sync{}ation, and by % \!\pcol@invokeoutput! for logging. % \end{macro} %  % \begin{macro}{\ifpcol@flush} % \changes{v1.2-3}{2013/05/11} % {Introduced to fix the problem with a too-tall page at % synchronization.} % \changes{v1.2-2}{2013/05/11} % {Add uses for page-wise footnote functions.} %  % The switch |\ifpcol@flush| is turned $\true$ by \!\pcol@sync! iff it finds % that the page to be \sync{}ed or to be flushed is too tall because the % sum of the total height of top floats and main text in a column and that % of bottom floats and footnotes in another column is larger than % $\pp^h(\ptop)-v^f-\VE$, where $v^f$ is the total height-plus-depth of the % \Scfnote{}s if $\ptop$ has them or 0 otherwise, and $\VE$ is the amount % given by \!\ensurevspace! in \sync{}ation or 0 in flushing. Then the % switch is examined in \!\pcol@sync! itself to restart the tallest column % if $\true$, in \!\pcol@putbackmvl! to check if a \mctext{} is really to % start, in \!\pcol@switchcol! to have a explicit page break in each column % if $\true$, and in \!\pcol@flushclear! also to have a page break if % $\true$. The last examiner \!\pcol@flushclear! may turn the switch % $\true$ when it is invoked from \!\endparacol! if the last page leaves % deferred and non-merged \Scfnote{}s for which an explicit page break is % also required. % \end{macro} %  % \begin{macro}{\ifpcol@outputflt} % \changes{v1.0}{2011/10/10} % {Renamed from \cs{ifpcol@stopoutput} with the reversal.} %  % The switch |\ifpcol@outputflt| is used in \!\pcol@outputelt! to know % whether a \fpage{} is to be shipped out ($\true$) or not. The switch is % initialized to be $\true$ by \!\pcol@outputcolumns! which invokes % \!\pcol@outputelt! for all $\pp(p)\in\PP$. Then if \!\pcol@outputcolumns! is % invoked from \!\pcol@opcol! to ship the oldest page $\pbase$ out, the % switch is turned $\false$ when we visit the second non-\fpage. That is, % all \fpage{}s following the first (oldest) page are shipped out but others % are not. On the other hand, if \!\pcol@outputcolumns! is invoked from % \!\pcol@sync! to ship out all pages including \fpage{}s in $\PP$, the % switch is kept $\true$ throughout all invocations of \!\pcol@outputelt!. % \end{macro} %  % \begin{macro}{\ifpcol@lastpage} % \changes{v1.0}{2011/10/10} % {Introduced for special operations in the last page.} % \begin{macro}{\ifpcol@lastpagesave} % \changes{v1.2-7}{2013/05/11} % {Introduced to fix the bug that \cs{@makecol} and % \cs{pcol@makefcolumn} in \cs{pcol@flushcolumn} misunderstand that % non-last pages are last.} %  % The switch |\ifpcol@lastpage| is used to know whether the following macros % work on the {\em\Uidx\lpage} of a \env{paracol} environment to do special % operations if so. %  % \begin{itemize} % \item % \!\pcol@combinefloats! adds \!\textfloatsep! below bottom floats of each % column if any so that the floats are well separated from the \postenv. % % \item % \!\pcol@sync! examines $\VPP$ instead of $\VP$ for the \pfcheck. % % \item % \!\pcol@makefcolumn! tries to make deferred floats as top floats. % % \item % \!\pcol@makeflushedpage! builds a short page of $\VPP$ tall, leaves % \spanning{} from ship-out if $\VPP=\!\pcol@colht!=-\infty$ so that it % becomes a float in \postenv, and leaves \Scfnote{}s untouched if % \Mgfnote{} typesetting is in effect. This macro itself turns this switch % $\false$ if $\CSIndex{ifpcol@dfloats}=\true$ to mean one or more columns % in the \lpage{} have deferred \cwise{} floats and thus the \lpage{} % must be {\em full size}. % % \item % \!\pcol@imakeflushedpage! leaves the \bground{} of \Scfnote{}s unpainted, % and lets the depth of the \lpage{} be 0 in \bgpaint{} and packing of % \colpage{}s. % \end{itemize} %  % The switch is initialized to be $\false$ by \!\pcol@zparacol!, then turned % $\true$ by \!\endparacol!, and then finally turned $\false$ by % \!\pcol@output@end! again for % \fpage{}s following the \lpage{} if any. The macro \!\pcol@flushcolumn! % saves the switch into \CSIndex{ifpcol@lastpagesave} then turning it % $\false$ during it works on \colpage{}s in non-top and thus non-\lpage{}s % to keep \!\@makecol! and \!\pcol@makefcolumn! from misunderstanding the % pages are last, and then restore the switch when the macro reaches to the % \tpage. This saving and temporary turning $\false$ is also done in % \!\pcol@flushclear! when it forces a page break so that the \!\output! % routine working on the broken non-\lpage{} correctly recognizes that. % Another temporary turning is made by \!\pcol@makenormalcol! but in reverse % to let the switch be $\true$ so that its indirect callee % \!\pcol@combinefloats! puts a vertical skip of \!\textfloatsep! below the % bottom floats in \preenv. % \end{macro}\end{macro} %  % \begin{macro}{\ifpcol@scfnote} % \changes{v1.2-2}{2013/05/11} % {Introduced for page-wise footnote functions.} %  % The switch \!\ifpcol@scfnote! is turned $\true$ by \!\pcol@fnlayout@p! % and \!\pcol@fnlayout@m! (through \!\pcol@fnlayout@p!) to indicate % footnotes in all columns are merged and \scfnote, while % \!\pcol@fnlayout@c! turns it $\false$ to make footnote typesetting % \mcfnote{}, being default as well. The switch is examined by the % following macros to do special operations for \Scfnote{}s if % it is $\true$. %  % \begin{itemize} % \item % \!\pcol@makecol! shrinks \!\@colht! and put the stretch\slash shrink % factor of \!\skip!\!\footins! at the bottom of the \colpage{} to be built % by the macro if the page has footnotes. If the \colpage{} is in the % \tpage{} $\ptop$, the macro also saves \!\footins! into \!\pcol@currfoot! % which then will be saved into $\pp^f(\ptop)$ by \!\pcol@startpage!, or % \!\footins! is discarded otherwise. % % \item % \!\pcol@startcolumn!, if it is invoked from \!\pcol@output! to start a % \colpage{} in a page $p$, \!\insert!s $\pp^f(p)$ through \!\footins!, and % also the deferred footnotes in $\df$ by \!\pcol@deferredfootins!, if % $p=\ptop$. % % \item % \!\pcol@output@switch! saves \!\footins! into $\pp^f(\ptop)$ if the macro % is to leave a \colpage{} in the \tpage, or discards it otherwise. % % \item % \!\pcol@restartcolumn! to restart a \colpage{} in a page $p$ \!\insert!s % $\pp^f(p)$ through \!\footins!, and also the deferred footnotes in $\df$ % by \!\pcol@deferredfootins!, if $p=\ptop$. % % \item % \!\pcol@sync! examines whether the total height of \Scfnote{}s is too % large to let them reside in the page to be synchronized or flushed as a % whole. % % \item % \!\pcol@zparacol! redefines \!\footnoterule! so that it refers to % \!\textwidth! rather than \!\column~width! to determine the width of the % rule above footnotes. % % \item % \!\pcol@fntext! invokes \!\pcol@fntextother! to add the footnote given to % it to $\df$ as a deferred footnote if $p<\ptop$. % % \item % \!\pcol@fntextbody! lets \!\hsize! be \!\textwidth! rather than % \!\columnwidth! to typeset the footnote given to it. % \end{itemize} % \end{macro} %  % \begin{macro}{\ifpcol@mgfnote} % \changes{v1.2-2}{2013/05/11} % {Introduced for page-wise footnote functions.} %  % The switch \!\ifpcol@mgfnote! is turned $\true$ by \!\pcol@fnlayout@m! % to indicate footnotes in the \spage{} and \lpage{} of a \env{paracol} % environment are merged with those in pre- and \postenv{}, while % \!\pcol@fnlayout@p! and \!\pcol@fnlayout@c! turn it $\false$ to % put them above\slash below the columns in the starting\slash\lpage{} % respectively, being default as well. The switch is examined by the % following macros to do special operations for \mgfnote{} \Scfnote{}s % if it is $\true$. %  % \Index{pre-environment stuff} % \Index{starting page} %  % \begin{itemize} % \item % \!\pcol@makenormalcol! leaves \!\footins! untouched rather than putting it % as a part of \preenv. % % \item % \!\pcol@makeflushedpage! leaves \!\footins! untouched rather than putting it % as a part of the \lpage{} of \env{paracol} if it works on the page. % % \item % \!\endparacol! does not let \!\pcol@flushclear! examine the existence of % deferred footnotes in \pfcheck{} for the \lpage. % \end{itemize} % \end{macro} %  % \begingroup\let\small\footnotesize % \begin{macro}{\ifpcol@fncounteradjustment} % \changes{v1.2-2}{2013/05/11} % {Introduced for page-wise footnote functions.} %  % The switch \!\ifpcol@fncounteradjustment! is turned $\true$ by the API % macro \!\fncounter~adjustment!, which is also invoked from % \!\pcol@fnlayout@p! and \!\pcol@fnlayout@m! (through \!\pcol@fnlayout@p!), % to let $\!\c@footnote!=\bf+\nf$ by \!\endparacol!. The macro % \!\nofncounter~adjustment! turns the switch $\false$ to give the default % state. % \end{macro} % \endgroup %  % \begin{macro}{\ifpcol@inner} % \changes{v1.22}{2013/06/30} % {Introduced to know if we are in a \cs{vbox}.} %  % The switch \cs{ifpcol@inner} is turned $\false$ by \!\pcol@zparacol! to % mean we are outside any \!\vbox!es, while the macro also lets % \!\everyvbox! in the \env{paracol} environment has the operation to turn % the switch $\true$ so that it is true whenever we are in a \!\vbox!. The % switch is examined by \!\pcol@set@color@push! and \!\pcol@icolumncolor!, % the former of which also turns it $\true$ if we are in restricted % horizontal mode, to make an \!\output! request for \colorstack{} % manipulation and, in the former, to reserve the stack popper by % \!\aftergroup!, iff the switch is $\false$. % \end{macro} %  % \begin{macro}{\ifpcol@firstpage} % \changes{v1.3-3}{2013/09/17} % {Introduced to know if a spanning stuff is pre-environment one.} %  % The switch \cs{ifpcol@firstpage} is \!\global!ly turned $\true$ or % $\false$ by \!\pcol@output@start! if it captures \preenv{} as a % \spanning{} or not because it is too large, respectively. Then the switch % is examined by \!\pcol@ioutputelt! or \!\pcol@makeflushedpage! when they % finds a \spanning{} to be combined to the page to be printed so as to % paint the \bground{} for the color of \pwise{} floats unless the switch is % $\true$ to mean the stuff is pre-environment one rather than floats. Then % \!\pcol@outputelt! or \!\pcol@makeflushedpage! itself \!\global!ly turns % the switch $\false$ after printing a page because we no longer have % \preenv{} in the \env{paracol} environment we are in. % \end{macro} %  % \begin{macro}{\ifpcol@havelastpage} % \changes{v1.3-3}{2013/09/17} % {Introduced to know if a page to be put has the last page of a % \string\texttt{paracol} environment.} %  % The switch \cs{ifpcol@havelastpage} is, after an initial $\false$, % \!\global!ly turned $\true$ by \!\pcol@output@end! if it finds the % \lpage{} of the \env{paracol} environment is connected to the \postenv, or % $\false$ otherwise. Then the switch is examined by (our own version of) % \!\@outputpage! which paints the \bground{} of the page to be printed iff % the switch is $\true$ because a part of the page was produced by a % \env{paracol} environment. Then the macro \!\global!ly turns the switch % $\false$ because so far \bgpaint{} should be disabled. % \end{macro} %  % \begin{macro}{\ifpcol@paired} % \changes{v1.3-2}{2013/09/17} % {Introduced for parallel-paging which has paired and non-paired mode.} %  % The switch \cs{ifpcol@paired} is $\true$ if the \parapag{}ed typesetting % should be done in {\em\paired} mode in which the pair of left and right % \parapag{}es comprises a virtual page, while it is $false$ if % \npaired{} to treat the left and right pages as individual ones. % Therefore, the switch is \!\global!ly turned $\false$ by \!\pcol@yparacol! % when \beginparacol{} has the optional argument for the number of columns % in the left \parapag{}e followed by |*|, or turned $\true$ % otherwise by \!\paracol! for giving default or by \!\pcol@zparacol! if it % finds $\CL\geq\C$ to mean \parapag{}ing is not in effect % in reality\footnote{ %  % The initialization to let the switch $\false$ is not necessary because it % is examined only after the first \cs{paracol} even in the % \cs{@outputpage} outside \texttt{paracol} environment, but we dare to do % this for the sake of clarity.}. % % Then the switch is examined by \!\pcol@setpnoelt! and \!\pcol@startpage! % so that, if the switch is $\false$, they let $\page(q)=\page(q-1)+2$ where % $\cc_0(\vb^p)0$. % % The other usage of this register is to have the left or right margin for % \bgpaint{} in the alias \!\pcol@bg@leftmargin! for strict local use in % \!\pcol@bg@paint@i! and its descendent macros for \bgpaint. That is, the % register is aliased as \!\pcol@bg@leftmargin! by \!\pcol@bg@paint@i!, let % have left or right margin by \!\pcol@bg@swappage!, and then referred to by % \!\pcol@bg@pageleft!. % \end{macro}\end{macro} %  % \begin{macro}{\pagerim} % \changes{v1.3-3}{2013/09/17} % {Introduced to specify the page rim size for background coloring.} %  % The API \!\dimen! register \!\pagerim! has the size of {\em\Uidx\prim{}s} % specified by users. Since the rims are the area for which \bgpaint{} % is inhibited, the register is used in area specification macros % \!\pcol@bg@paperwidth!, \!\pcol@bg@paperheight!, \!\pcol@bg@pageleft! and % \!\pcol@bg@pagetop!, in which the register has the negative counterpart of % the specified value set by \!\pcol@bg@paint@i!. % \end{macro} %  % \begin{macro}{\pcol@topskip} % The \!\skip! register \!\pcol@topskip! keeps the value of \!\topskip! at % \beginparacol{} for the ordinary usage of \!\topskip! which may have 0 in % the starting and \lpage{} temporarily. After the initialization by % \!\pcol@zparacol!, it is referred to by \!\pcol@getpinfo! for pages without % \spanning{} and thus \preenv, by \!\pcol@startpage! to let \!\topskip! and % $\pp^t(p)$ has it for non-\spage{} $p$, by \!\pcol@output@start! for the % second page if it finds \preenv{} is too large to combine with the % multi-column stuff, and by \!\endparacol! to recover \!\topskip! for the % pages following the \lpage. % \end{macro} %  % \begin{macro}{\belowfootnoteskip} % \changes{v1.35-4}{2018/12/31} % {Introduced to specify the additional space below the non-merged % pre-environment footnotes.} %  % The API \!\skip! register \!\belowfootnoteskip! has the amount of the space % added below non-merged \Preenv{} footnotes. The register is initialized % with the default 0\,pt, and then used in \!\pcol@output@start! to measure % the room in the first page, and in \!\pcol@combinefootins! to add the % space. % \end{macro} %  % \begin{macrocode} \newdimen\pcol@prevdepth \newdimen\pcol@colht \newdimen\pcol@textfloatsep \newdimen\pcol@lrmargin \newdimen\pagerim \pagerim\z@ \newskip\pcol@topskip \newskip\belowfootnoteskip \belowfootnoteskip\z@ % \end{macrocode} % % % % \subsection{\cs{box} Registers} % % The next declaration group is for the following \!\box! registers. %  % \begin{macro}{\pcol@topfnotes} % \changes{v1.2-2}{2013/05/11} % {Introduced for page-wise footnote functions.} %  % The \!\box! register \!\pcol@topfnotes! is the implementation of $\df$ to % have the list of deferred footnotes. The register is made void by % \!\pcol@output@start! and then is made grown by \!\pcol@fntextother! with % a deferred footnote added by the macro. The macro % \!\pcol@deferredfootins! invoked from \!\pcol@startcolumn! and % \!\pcol@restartcolumn! tries to \!\insert! the contents of the register % through \!\footins! but may keep some of trailing ones in it if the total % height of the footnotes is too large, while \!\pcol@output@end! does the % \!\insert!ion without height capping. The macro \!\endparacol! with % non-\mgfnote{} \Scfnote{} typesetting also refers to the register to pass % it to \!\pcol@flushclear! as its argument so as to make an explicit page % break if the register has some deferred footnotes. % \end{macro} %  % \begin{macro}{\pcol@prespan} % \changes{v1.3-1}{2013/09/17} % {Introduced to save pre-spanning-text stuff.} %  % The \!\box! register \!\pcol@prespan! keeps the \prespan{} during a % \mctext{} is processed by \TeX{} and our own \!\output! routine. That is, % the macro \!\pcol@putbackmvl! saves the contents $\cc_0(\vb^b)$ of % the column 0 to be restarted into the register instead of putting it back % to the main vertical list, or makes the register $\bot$ if the column has % nothing, when the restart follows the \sync{}ation with % $\CSIndex{ifpcol@sptextstart}=\true$. Then the contents of the register % is put back to the main vertical list together with the box having % \mctext{} after its vertical size is registered in the list $\pp^s(p)$ of % \mctext{} positions and heights, by \!\pcol@makecol! when the text sees a % page break, or by \!\pcol@output@switch! when the text is completed. % \end{macro} %  % \begin{macro}{\pcol@rightpage} % \changes{v1.3-2}{2013/09/17} % {Introduced to have the ship-out image of a right parallel-page.} %  % The \!\box! register \!\pcol@rightpage! is used to build (a part of) the % ship-out image of a right \parapag{}e in it. The macros; %  % \begin{quote}\raggedright % \!\pcol@outputelt!, % \!\pcol@ioutputelt!, % \!\pcol@makeflushedpage!, % \!\pcol@flushfloats!, % \!\pcol@output@flush!, and % \!\pcol@output@clear! % \end{quote} %  % work on the register together with \!\@outputbox! for % the left \parapag{}e to pass both of them to (our of version of) % \!\@outputpage!. The macro \!\pcol@output@end! also uses the register to % paint the \bground{} of the empty counterpart of non-merged \Scfnote{}s in % it, or to make the register $\bot$ when it have an empty \lpage{} but with % \spanning{} of \pwise{} floats. After closing a \env{paracol} % environment, the contents of the register % will be shipped out by % \!\@outputpage! invoked outside \env{paracol} environment when the % \postenv{} sees a page break, or referred to by \!\pcol@output@start! as % the \preenv{} in the right \parapag{}e. This right \preenv{} then will be % combined with \colpage{}s in the right \parapag{}e by \!\pcol@ioutputelt! % or \!\pcol@imakeflushedpage! for shipping-out, or by % the latter indirectly invoked from \!\pcol@output@end! as the % last\Index{last page}{} right \parapag{}e again. Therefore the \!\setbox! % of the register in \!\pcol@output@start!, \!\pcol@makeflushedpage!, % \!\pcol@imakeflushedpage! and \!\pcol@output@end! must be done % \!\global!ly\footnote{ %  % The \!\global! setting in \!\pcol@makeflushedpage! and % \!\pcol@imakeflushedpage!, together with \!\@outputbox! which does not % need \!\global! assignment, is also required by the sake of simplicity in % its implementation, incidentally.}. % \end{macro} %  % \begin{macro}{\pcol@colorstack@saved} % \changes{v1.34}{2018/05/07} % {Introduced as $\mathit{\Gamma}_s$ to keep the color stack % $\mathit{\Gamma}^c$ until a column-page of $c$ becomes non-empty.} %  % The \!\box! register \!\pcol@colorstack@saved! is $\csts$ to keep the % \colorctext{} $\CST^c$ of column $c$ until its \ccolpage{} becomes non-empty % to avoid that the \colpage{} only has coloring \!\special!s for % \colorstack{} establishing and rewinding to let \!\pcol@ifempty! misjudge % the \colpage{} is non-empty. It is let have $\Celt^c$, if defined, % and $\cst$ by \!\pcol@savecolorstack! invoked from \!\pcol@startcolumn! % and \!\pcol@output@start!, and from \!\pcol@restartcolumn! through % \!\pcol@putbackmvl! when we know or find the (re)starting \colpage{} is % empty. The macro \!\pcol@putbackmvl! also makes the \!\box! register % $\bot$ when the restarting \colpage{} is not empty and thus the \colpage{} % has had coloring \!\special!s for establishing \colorctext{} at its % beginning. Then the register is given to \!\pcol@restorecst! by % \!\pcol@clearcst@unvbox! to put leading coloring \!\special!s for % establishing of the \colpage{} when we complete it by \!\pcol@opcol! or % leave from it by \!\pcol@output@switch!. % \end{macro} %  % \begin{macro}{\pcol@tempboxa} % \changes{v1.3-3}{2013/09/17} % {Introduced to have materials temporarily for column-separating rule % drawing or background painting.} % \changes{v1.34}{2018/05/07} % {Renamed from \cs{pcol@tempbox} because its relative % \cs{pcol@tempboxb} is introduced.} % \changes{v1.34}{2018/05/07} % {Add usage in \cs{pcol@scancst} and \cs{pcol@iscancst}.} %  % The \!\box! register \!\pcol@tempboxa! is used to have stuff temporarily as % follows. %  % \begin{itemize} % \item % The macro \!\pcol@buildcolseprule! and its callee \!\pcol@buildcselt! % builds the \cseprule{} in the register for a page to be shipped out, while % its contents is put into each \csepgap{} by \!\pcol@hfil!. % % \item % In (our own version of) \!\@outputpage!, the register has the \bgpaint{} % of the (left parallel-) page, %  % \Index{parallel-paging} %  % which is inserted into the ship-out image by its callee % \!\pcol@outputpage@l! through \!\everyvbox! and its contents % \!\pcol@outputpage@ev!. % % \item % In \!\pcol@scancst! and its callee \!\pcol@iscancst! to scan $\CSTraw^c$, % $\CST^c$ or $\csts$, the sequence of (un)coloring \!\special!s to be put % into the main vertical list is build in it. % \end{itemize} % \end{macro} %  % \begin{macro}{\pcol@tempboxb} % \changes{v1.34}{2018/05/07} % {Introduced to extract the top of color stack $\mathit{\Gamma}$, % $\mathit{\Gamma}_r$ or $\mathit{\Gamma}_s$.} %  % The \!\box! register \!\pcol@tempboxb! is used in \!\pcol@iscancst! % to extract the top (last) element of $\cst$, $\cstraw$ or $\csts$. % \end{macro} %  % \begin{macrocode} \newbox\pcol@topfnotes \newbox\pcol@prespan \setbox\pcol@prespan\box\voidb@x \newbox\pcol@rightpage \global\setbox\pcol@rightpage\box\voidb@x \newbox\pcol@colorstack@saved \newbox\pcol@tempboxa \newbox\pcol@tempboxb % \end{macrocode} % % % % \subsection{\cs{insert} Register Set} % \changes{v1.34}{2018/05/07} % {Add \Sec3.6 ``\cs{insert} Register Set'' for \cs{pcol@colorins}.} % % The next declaration is for the following \!\insert! register set. %  % \begin{macro}{\pcol@colorins} % \changes{v1.34}{2018/05/07} % {Introduced to present text-coloring operations to \cs{output} % synchronously with column-pages.} %  % The register set \!\pcol@colorins! is to \!\insert! a \!\vbox! containing a % (un)coloring \!\special! for color pushing or popping, or the definition % of a new default color of the current column. In order to make it sure % that an \!\insert!ion does not affect \!\pagetotal! and is given to % \!\output! with |\box255| containing the corresponding coloring % \!\special! put in the main vertical list, \!\count!\!\pcol@colorins! and % \!\skip!\!\pcol@colorins! are let be 0, while \!\dimen!\!\pcol@colorins! is % let be \!\maxdimen! to allow a \colpage{} to have virtually infinite number % of \!\insert!ions. % % The \!\insert!ion is done by \!\pcol@icolumncolor! for a default color % definition, \!\pcol@set@color@push! for color pushing, and % \!\pcol@reset@color@pop! and \!\pcol@reset@color@mpop! for color popping % in non-math and math mode respectively. Then \!\insert!ed \!\vbox!es are % packed into \!\box!\!\pcol@colorins! and is given to \!\output! as % $\cstraw$ to be scanned by \!\pcol@clearcolorstack! to reform it as % $\cst$, and then scanned by \!\pcol@restorecolorstack! or saved into % $\csts=\!\pcol@colorstack@saved!$ by \!\pcol@savecolorstack!. The % register is also referred to by $\!\pcol@scancst!\arg{box}$ to examine if % $\arg{box}$ is this register or \!\pcol@colorstack@saved!, and is made % $\bot$ by \!\pcol@output@end! after the final reestablishment of the % \colorstack. %  % \begin{macrocode} \newinsert\pcol@colorins \count\pcol@colorins\z@ \skip\pcol@colorins\z@ \dimen\pcol@colorins\maxdimen % \end{macrocode} % \end{macro} % % % % \subsection{\cs{toks} Register} % % The last declaration is for the following \!\toks! register. %  % \begin{macro}{\pcol@everyvbox} % \changes{v1.22}{2013/06/30} % {Introduced to keep \cs{everyvbox} work as usual while having % \cs{pcol@innertrue} in it always.} %  % The register \!\pcol@everyvbox! acts as \!\everyvbox! in \env{paracol} % environments. That is, by \!\pcol@zparacol!, \!\everyvbox! is made % \!\let!-equal to this register so that updates and references of % \!\everyvbox! is made to this register, while the real \!\everyvbox! is % let have the reference to the register and |\pcol@innertrue| to make % $\CSIndex{ifpcol@inner}=\true$ in every \!\vbox!. Besides % \!\pcol@zparacol!, the register is referred to by % \!\pcol@restoreeveryvbox! to examine if it has been \!\global!ly updated, % i.e., its contents is not \!\pcol@dummytoken!. % \end{macro} %  % \begin{macrocode} \newtoks\pcol@everyvbox % \end{macrocode} % % % % \section{Logging Tools} % \label{sec:imp-logging} % % Prior to the \!\def!initions of macros to implement \textsf{paracol}'s % functions, we define a few macros for debug logging. %  % \begin{macro}{\pcol@ShowBox} % \changes{v1.2-2}{2013/05/11} % {Introduced for debugging page-wise footnote functions.} % \changes{v1.3-6}{2013/09/17} % {Change \cs{unvcopy} to \cs{copy} to make sure the argument box % causes overfull if its height is positive and even if it has % nothing.} % \changes{v1.34}{2018/05/07} % {Add messaging {\tt (VOID)} if $\langle b\rangle\EQ\bot$, % $\cs{vfuzz}\gets0$ to ensure overfull, and \cs{vskip} of 1\,{\tt % pt} if $\langle b\rangle$'s height is 0 to ensure overfull too.} %  % The macro $\!\pcol@ShowBox!\arg{b}$ puts a logging \!\message! showing the % height, depth and width of the \!\box! (or \!\insert!) register $b$, or % ``|(VOID)|'' if $b=\bot$. Then, if $b\neq\bot$, $b$'s contents is dumped % into |.log| file making overfull intentionally by putting $b$ into % \!\box!|0| of null height, together with \!\vskip! of 1\,|pt| if $b$'s % height is 0, with setting $\!\vfuzz!=0$. % \end{macro} %  % \KeepSpace{13} % \begin{macro}{\pcol@LogLevel} % \changes{v1.2-2}{2013/05/11} % {Introduced for debugging page-wise footnote functions.} % \begin{macro}{\pcol@iLogLevel} % \changes{v1.2-2}{2013/05/11} % {Introduced for debugging page-wise footnote functions.} % \begin{macro}{\pcol@Log} % \changes{v1.2-2}{2013/05/11} % {Introduced for debugging page-wise footnote functions.} % \begin{macro}{\pcol@Log@iii} % \changes{v1.2-2}{2013/05/11} % {Introduced for debugging page-wise footnote functions.} % \begin{macro}{\pcol@Log@ii} % \changes{v1.2-2}{2013/05/11} % {Introduced for debugging page-wise footnote functions.} % \begin{macro}{\pcol@Log@i} % \changes{v1.2-2}{2013/05/11} % {Introduced for debugging page-wise footnote functions.} % \begin{macro}{\pcol@Logstart} % \changes{v1.2-2}{2013/05/11} % {Introduced for debugging page-wise footnote functions.} % \begin{macro}{\pcol@Logstart@ii} % \changes{v1.2-2}{2013/05/11} % {Introduced for debugging page-wise footnote functions.} % \begin{macro}{\pcol@Logstart@i} % \changes{v1.2-2}{2013/05/11} % {Introduced for debugging page-wise footnote functions.} % \begin{macro}{\pcol@Logend} % \changes{v1.2-2}{2013/05/11} % {Introduced for debugging page-wise footnote functions.} % \begin{macro}{\pcol@Logend@ii} % \changes{v1.2-2}{2013/05/11} % {Introduced for debugging page-wise footnote functions.} % \begin{macro}{\pcol@Logend@i} % \changes{v1.2-2}{2013/05/11} % {Introduced for debugging page-wise footnote functions.} % \begin{macro}{\pcol@Logfn} % \changes{v1.2-2}{2013/05/11} % {Introduced for debugging page-wise footnote functions.} % \begin{macro}{\pcol@Logfn@ii} % \changes{v1.2-2}{2013/05/11} % {Introduced for debugging page-wise footnote functions.} % \begin{macro}{\pcol@Logfn@i} % \changes{v1.2-2}{2013/05/11} % {Introduced for debugging page-wise footnote functions.} %  % The macro $\!\pcol@LogLevel!\arg{l_1}\arg{l_2}\arg{l_3}$ defines the % detailedness of logging done by logging macros. It invokes % $\!\pcol@iLogLevel!\Arg{l_i}\Arg{cs}$ to let the following $|\|\arg{cs}$ % be $|\|\arg{cs}|@|\arg{l'_i}$ where $l'_i$ is the \!\romannumeral! % representation of $l_i$. %  % \begin{itemize} % \item % $\!\pcol@Log!\arg{cs}\Arg{m}\arg{f}$ is to log the contents of the \!\insert! % register $f$ containing footnotes which is referred to by the macro % $\arg{cs}$ in a context shown by $m$. The macro \!\pcol@Log@iii! % ($l_1=3$) logs the detailed contents of $f$ by \!\pcol@ShowBox!, while % \!\pcol@Log@ii! ($l_1=2$) just shows the height of $f$ and \!\pcol@Log@i! % ($l_1=1$) does nothing. % % \item % $\!\pcol@Logstart!\Arg{m}$ and $\!\pcol@Logend!\Arg{m}$ put logging % \!\message!s `$|S:|m$' and `$|E:|m$' respectively to show the beginning % and end of a procedure in the macro whose name is at the head of $m$, if % $l_2=2$ and thus they are \!\let!-equal to \!\pcol@Logstart@ii! and % \!\pcol@Logend@ii!. If $l_2=1$, \!\pcol@Logstart@i! and \!\pcol@Logend@i! % do nothing. % % \item % $\!\pcol@Logfn!\Arg{m}$ puts a logging \!\message! $m$ whose head is the % macro name for footnotes whose information such as the ordinal number of % the footnote processed by the macro may be shown in $m$ as well, if % $l_3=2$ and thus it is \!\let!-equal to \!\pcol@Logfn@ii!. If $l_3=1$, % \!\pcol@Logfn@i! does nothing. % \end{itemize} % \end{macro}\end{macro} % \end{macro}\end{macro}\end{macro}\end{macro} % \end{macro}\end{macro}\end{macro} % \end{macro}\end{macro}\end{macro} % \end{macro}\end{macro}\end{macro} %  % \begin{macrocode} %% Logging Tools \def\pcol@ShowBox#1{% \ifvoid#1\message{(VOID)}% \else \message{(\the\ht#1+\the\dp#1)x(\the\wd#1)}% {\vfuzz\z@ \showboxdepth\@M \showboxbreadth\@M \setbox\z@\vbox to\z@{\ifdim\ht#1=\z@ \vskip1\p@\fi \copy#1}}% \fi} \def\pcol@LogLevel#1#2#3{% \pcol@iLogLevel{#1}{pcol@Log}% \pcol@iLogLevel{#2}{pcol@Logstart}% \pcol@iLogLevel{#2}{pcol@Logend}% \pcol@iLogLevel{#3}{pcol@Logfn}} \def\pcol@iLogLevel#1#2{% \expandafter\let\expandafter\reserved@a \csname #2@\romannumeral#1\endcsname \expandafter\let\csname #2\endcsname\reserved@a} \def\pcol@Log@iii#1#2#3{\message{\string#1{#2% (\number\pcol@page:\number\pcol@currcol/\number\pcol@toppage)}}% \pcol@ShowBox#3\message{end\string#1}} \def\pcol@Log@ii#1#2#3{\message{\string#1{#2% (\number\pcol@page:\number\pcol@currcol/\number\pcol@toppage)}=\the\ht#3}} \def\pcol@Log@i#1#2#3{} \def\pcol@Logstart@ii#1{\message{S\string#1}} \def\pcol@Logend@ii#1{\message{E\string#1}} \def\pcol@Logstart@i#1{} \def\pcol@Logend@i#1{} \def\pcol@Logfn@ii#1{\message{\string#1}} \def\pcol@Logfn@i#1{} \pcol@LogLevel111 % \end{macrocode} % % \begin{macro}{\pcol@F@write} % \changes{v1.32-2}{2015/10/10} % {Introduced for debugging memory leak problems.} % \begin{macro}{\pcol@F} % \changes{v1.32-2}{2015/10/10} % {Introduced for debugging memory leak problems.} % \begin{macro}{\pcol@FF} % \changes{v1.32-2}{2015/10/10} % {Introduced for debugging memory leak problems.} % \begin{macro}{\pcol@F@count} % \changes{v1.32-2}{2015/10/10} % {Introduced for debugging memory leak problems.} % \begin{macro}{\pcol@F@n} % \changes{v1.32-2}{2015/10/10} % {Introduced for debugging memory leak problems.} % \begin{macro}{\pcol@Fb} % \changes{v1.32-2}{2015/10/10} % {Introduced for debugging memory leak problems.} % \begin{macro}{\pcol@Fe} % \changes{v1.32-2}{2015/10/10} % {Introduced for debugging memory leak problems.} % Another debugging tool is for investigating memory leak problems. Since % \Paracol{} uses \!\insert! registers for various purposes, management % operations of them especially that for proper release of them are crucial % for the correctness of the implementation. A source of toughness in % debugging {\em memory leak} caused by missing a release of a register back % to \!\@freelist! is that the resulting shortage is revealed long after the % leakage to make it hard to find the point of the leakage. % % The set of macros is to help such debugging by logging the acquire and % release of \!\insert! registers into a file named $\arg{job}|.fls|$ % associated with \!\pcol@F@write! where $\arg{job}$ is given by % \!\jobname!. After opened when \Paracol{} is loaded, the file is written by % $\!\pcol@FF!\Arg{m_a}\Arg{m_b}$ with a line of the following form with % text messages $m_a$ and $m_b$, where $p=\!\pcol@page!$, % $c=\!\pcol@currcol!$, $\ptop=\!\pcol@toppage!$, $\pi=\page(p)=\!\c@page!$, % and $n_b=\!\pcol@F@n!$ is the cardinality of \!\@deferlist! counted by % \!\pcol@F@count!. %  % \begin{itemize}\item[] % $\arg{m_a}|(|\arg{p}|:|\arg{c}|/|\arg{\ptop}|:|\arg{\pi}|)=| % \arg{n_b}\arg{m_b}$ % \end{itemize} %  % The argument $\arg{m_b}$ is empty when $\!\pcol@FF!$ is invoked from % $\!\pcol@F!\arg{m_a}$ for snapshot, while % $\arg{m_b}=\hbox{`|<=|$\arg{n_b}$'}$ when invoked from % $\!\pcol@Fe!\arg{m_a}$ paired by $\!\pcol@Fb!=\!\pcol@F@count!$ by which % the cardinality of \!\@freelist! is given to $\arg{n_b}$ through % \!\pcol@F@n! and then \!\reserved@a!. Therefore, by the pair of % \!\pcol@Fb! and \!\pcol@Fe!, the consumption or restitution in a series of % operations surrounded by the pair is logged in the file. % % In the production version, the logging is disabled of course by \!\let!ting % \!\pcol@F! and \!\pcol@Fe! be \!\@gobble! and \!\pcol@F! be \!\relax!, % while the open of \!\pcol@F@write! is disabled as well by a pair of % \cs{iffalse} and \cs{fi}. % \end{macro}\end{macro}\end{macro}\end{macro}\end{macro}\end{macro}\end{macro} %  % \begin{macrocode} \iffalse \newwrite\pcol@F@write \immediate\openout\pcol@F@write\jobname.fls \fi \def\pcol@F#1{\pcol@FF{#1}{}} \def\pcol@FF#1#2{\pcol@F@count \immediate\write\pcol@F@write{#1(\number\pcol@page:\number\pcol@currcol/% \number\pcol@toppage:\number\c@page)=\pcol@F@n #2}} \def\pcol@F@count{{\@tempcnta\z@ \def\@elt##1{\advance\@tempcnta\@ne}\@freelist \xdef\pcol@F@n{\number\@tempcnta}}} \let\pcol@Fb\pcol@F@count \def\pcol@Fe#1{{\let\reserved@a\pcol@F@n \pcol@FF{#1}{<=\reserved@a}}} \let\pcol@F\@gobble \let\pcol@Fb\relax \let\pcol@Fe\@gobble % \end{macrocode} % % % % \section{\cs{output} Routine} % \label{sec:imp-output} % % \begin{macro}{\pcol@ovf} % Before giving the definitions of macros in \!\output! routine, we define % the macro \!\pcol@ovf! invoked if \!\@freelist! is empty on an acquisition % of an \!\insert! by \!\@next! and thus we have to abort the execution by % \!\PackageError! with a message notifying the shortage. The additional % help message is \!\@ehb! as in \!\@fltovf!. This macro is used in % \!\pcol@opcol!, \!\pcol@startpage!, \!\pcol@output@start!, % \!\pcol@output@switch!, \!\pcol@iscancst!, \!\pcol@savefootins!, % \!\pcol@flushcolumn!, \!\pcol@synccolumn!, \!\pcol@output@end! and % \!\pcol@icolumncolor!. % \end{macro} %  % \begin{macrocode} %% \output Routine \def\pcol@ovf{% \PackageError{paracol}{Too many unprocessed columns/floats}\@ehb} % \end{macrocode} % % \begin{macro}{\pcol@output} % \changes{v1.2-2}{2013/05/11} % {Add \cs{pcol@Logstart} and \cs{pcol@Logend}.} % \changes{v1.2-7}{2013/05/11} % {Add the examination of \cs{ifpcol@output} and \protect\LaTeX's % original sequence for \cs{output} request sneaked from outside of % \texttt{paracol} environment.} % \changes{v1.2-7}{2013/05/11} % {Add the assignment of \cs{@maxdepth} to \cs{maxdepth} to nullify % the temporary setting done by \cs{@addtobot}.} % \changes{v1.33-2}{2016/11/19} % {Add a space after \cs{@opcol} to obey the coding convention.} %  % The macro \!\pcol@output! is the \Paracol's version of \!\output! which % is let have this macro as its sole token by \!\pcol@zparacol!. The % structure of this macro is same as that of \LaTeX's \!\output! but the % following replacements are made\footnote{. %  % Besides the logging with \cs{pcol@Logstart} and \cs{pcol@Logend}.}. %  % \begin{itemize} % \item % $\!\@specialoutput!\to\!\pcol@specialoutput!$ to process \LaTeX's genuine % functions including the customized marginal note placement, and \Paracol's % own special output functions; starting first page, \colorctext{} management, % \cswitch, page flushing with\slash without float flushing, and building the % multi-column part of the \lpage. % % \item % \changes{v1.0}{2011/10/10} % {Replace \cs{@makecol} with \cs{pcol@makecol} for a special care for % column-pages with synchronization points.} %  % $\!\@makecol!\to\!\pcol@makecol!$ for a special care for \ccolpage{} having % \sync{}ation point and/or \Scfnote{}s. % % \item % $\!\@opcol!\to\!\pcol@opcol!$ to hold the \ccolpage{} which just has % completed. % % \item % \changes{v1.2-2}{2013/05/11} % {Add an argument \cs{@ne} to \cs{pcol@startcolumn} to distinguish it % from the invocation in \cs{pcol@freshpage}.} %  % $\!\@startcolumn!\to\!\pcol@startcolumn!$ to create a new \colpage{}. The % argument \!\@ne! is to distinguish the invocation in this macro from % that in \!\pcol@freshpage! so that the \!\insert!ions of $\pp^f(p)$ and % $\df$ are done only when a new \colpage{} is created with ordinary page % break. % \end{itemize} %  % \changes{v1.22}{2013/06/30} % {Add reset of \cs{set@color}.} % \changes{v1.24}{2013/07/27} % {Add zero-clear of \cs{pcol@mcid}.} % \changes{v1.3-1}{2013/09/17} % {Add $\cs{ifpcol@sptextstart}\EQ\string\mathit{false}$ to the % condition for the warning of too small \cs{vsize}.} %  % In addition, before we start the main body of \!\output! routine, we add % two operations for coloring. One is to make % \!\set@color! \!\let!-equal to \!\pcol@set@color!, i.e, to let it regain % its original definition throughout \!\output! routine, because % no manipulation of \colorstack{} is necessary\footnote{ %  % Though this operation is not necessary because \cs{everyvbox} should work % for any \cs{set@color} because they should be in a \cs{vbox}, we dare to % do it for clarity.}. %  % The other is to zero-clear the counter \!\pcol@mcid! because we are % definitely in the main (non-internal) vertical mode and thus all push/pop % pairs of the coloring in math mode have been processed. % % Further, before we start the sequence for non-special \!\output! request % on page breaks, we examine if $\CSIndex{ifpcol@output}=\true$ to mean % \!\pcol@output@start! has already been invoked in order to cope with % \!\output! request {\em sneaking}. This sneaking happens when % \beginparacol{} is at a critical position of page breaking at which the % \preenv{} has already exceeds \!\vsize! but \TeX{} cannot make the % \!\output! request for the page break at \CSIndex{par} at the beginning of % \!\pcol@zparacol! because it sees $\!\penalty!=10000$ due to, e.g., a % sectioning command just preceding \beginparacol. In this case, the % request is postponed until \TeX{} see a \!\penalty! less than 10000 and % thus it is made with some non-special \!\outputpenalty! greater than % $-10000$ when \TeX{} sees the dummy request of $\!\penalty!=-10004$ in % \!\pcol@invokeoutput! for \!\pcol@output@start!. At this timing, % \!\pcol@zparacol! has already let \!\output! have \!\pcol@output! of % course but the request must be processed by original \!\output! because it % is made {\em outside} of the \env{paracol} environment which has just % started. Therefore, if $\CSIndex{ifpcol@output}=\false$, we have to % perform the operation sequence as the original \!\output! does. % Furthermore, we have to take care of the fact that a few our own settings % related to \!\output! routine has already been made in \!\pcol@zparacol!, % namely $\CSIndex{if@twocolumn}=\true$ and % $\!\@combinefloats!=\!\pcol@combinefloats!$, which should make the macros % in the original sequence confused especially by the former. Therefore, we % turns $\CSIndex{if@twocolumn}=\false$ and let \!\@combinefloats! have the % original definition kept in \!\pcol@@combinefloats!\footnote{ %  % Though we know \cs{pcol@combinefloats} acts exactly as \cs{@combinefloats} % because \cs{pcol@zparacol} initializes $\cs{pcol@textfloatsep}=\infty$ and % $\cs{ifpcol@lastpage}=\false$. On the other hand, we don't cancel the % re\cs{def}inition of \cs{footnoterule} because it should be % $\cs{textwidth}=\cs{columnwidth}$ outside of \env{paracol} environments.} %  % temporarily, i.e., only in the group automatically surrounding the % invocation of \!\output!. % % Another addition is to assign \!\@maxdepth! to \!\maxdepth! in order to % nullify the temporary setting to 0 done in \!\@addtobot!. By this % assignment, in \env{paracol} environments \TeX's page builder always % refers to the value in \!\@maxdepth!. Yet another addition is to add % $\CSIndex{ifpcol@sptextstart}=\false$ to the condition for the warning of % too short \!\vsize!, because a \mctext{} can start near the bottom of a % page with a small \!\@colroom! less than $1.5\times\!\baselineskip!$ and % thus the warning is unnecessary and inappropriate when % $\CSIndex{ifpcol@sptextstart}=\true$. %  % \begin{macrocode} \def\pcol@output{\let\par\@@par \let\set@color\pcol@set@color \global\pcol@mcid\z@ \pcol@Logstart{\pcol@output\number\outputpenalty (\number\c@page:\number\pcol@currcol)}% \ifnum\outputpenalty<-\@M \pcol@specialoutput \else\ifpcol@output \pcol@makecol \pcol@opcol \pcol@startcolumn\@ne \@whilesw\if@fcolmade\fi{\pcol@opcol \pcol@startcolumn\@ne}% \else \@twocolumnfalse \let\@combinefloats\pcol@@combinefloats \@makecol \@opcol \@startcolumn \@whilesw\if@fcolmade\fi{\@opcol \@startcolumn}% \fi\fi \global\maxdepth\@maxdepth \ifnum\outputpenalty>-\@Miv \ifdim\@colroom<1.5\baselineskip \ifdim\@colroom<\textheight \ifpcol@sptextstart \global\vsize\@colroom \else \@latex@warning@no@line{Text page \thepage\space contains only floats}% \@emptycol \fi \else \global\vsize\@colroom \fi \else \global\vsize\@colroom \fi \else \global\vsize\maxdimen \fi \pcol@Logend\pcol@output} % \end{macrocode} % \end{macro} % % % % \section{Completing Column-Page} % \label{sec:imp-opcol} % % \begin{macro}{\pcol@@makecol} % \changes{v1.2-7}{2013/05/11} % {Introduced to cope with the careless implementation of \cs{@makecol} % in p\string\LaTeX.} % \changes{v1.3-6}{2013/09/17} % {Add an argument $d$ to be assigned to \cs{boxmaxdepth} to let it % have 0 rather than \cs{@maxdepth} for last page.} %  % The macro $\!\pcol@@makecol!\$ is used in \!\pcol@flushcolumn! and % \!\pcol@imakeflushedpage! which simply require \LaTeX's original % \!\@makecol! to build the ship-out image of a \colpage. The reason why we % need our own version is that a variation of \LaTeX, namely p\LaTeX{} for % Japanese, carelessly implements its own \!\@makecol! to make the resulting % \!\@outputbox! has a depth larger than \!\@maxdepth! if the \colpage{} has % \Mcfnote{}s whose last line is unusually deep. To cope with the problem, % this macro at first invokes \!\@makecol!, and then reshape \!\@outputbox! % assigning $d=\!\@maxdepth!$ to \!\boxmaxdepth! to cap its depth, unless % this macro is used for the \lpage{} with $d=0$ because depth of the last % component of the \!\@outputbox! is incorporated in \!\@colht!. %  % \begin{macrocode} %% Completing Column-Page \def\pcol@@makecol#1{\@makecol \setbox\@outputbox\vbox to\@colht{\boxmaxdepth#1\unvbox\@outputbox}} % \end{macrocode} % \end{macro} %  % \begin{macro}{\pcol@makecol} % \changes{v1.0}{2011/10/10} % {Introduced for special float handling in a column-page with % synchronization points.} % \changes{v1.2-2}{2013/05/11} % {Add save/discard of page-wise footnotes.} % \changes{v1.2-7}{2013/05/11} % {Remove unnecessary check of \cs{ifpcol@lastpage} on the % redefinition of \cs{@textbottom}.} % \changes{v1.3-1}{2013/09/17} % {Add a function to capture a broken spanning text, to combine it % with pre-spanning-text stuff, and to shift it left on % column-swapping.} % \changes{v1.3-3}{2013/09/17} % {Add the addition of the element to $\pi^s(p)$ for a broken % spanning text.} % \changes{v1.3-4}{2013/09/17} % {Add $\pi^m(p)\EQ\cs{pcol@mparbottom}$ to the argument of % \cs{pcol@defcurrpage}.} % \changes{v1.3-3}{2013/09/17} % {Add \cs{@colht} and \cs{relax} as the first and third argument of % \cs{pcol@shrinkcolbyfn}.} % \changes{v1.32-2}{2015/10/10} % {Add \cs{pcol@Fb}/\cs{pcol@Fe} pair(s).} % \changes{v1.33-2}{2016/11/19} % {Move down the \cs{def}inition of \cs{pcol@currfoot} with $\bot$ to % place it just before the \cs{ifpcol@scfnote}/\cs{fi} construct to % make it clear how \cs{pcol@currfoot} is \cs{def}ined.} %  % The macro \!\pcol@makecol! is invoked solely from \!\pcol@output! to build % the shipping image of the \ccolpage{} which just has completed in % \!\@outputbox!. This macro has two additional functions to its original % version \!\@makecol!\footnote{ %  % Not \cs{pcol@@makecol} because the depth capping of \cs{@outputbox} is % done by \cs{pcol@opcol} when it saves the box into $\cc_c(\vb^b)$.} %  % invoked in this macro. % % First, if $\cc_c(\tf)\neq\infty$ to mean the \colpage{} has \sync{}ation % points, \!\@makecol! is invoked with a special \!\def!inition of % \!\@textbottom! to put a vertical skip having $1/10000\,|fil|$ as its % stretch and shrink. This modification is to nullify not only finite % stretches (as \!\raggedbottom! does) but also finite shrinks possibly % inserted just below the last \sync{}ation point to move up the first % visible item upward a little bit if active. Therefore, \!\flushbottom! % setting is nullified for \colpage{}s having \sync{}ation points and a % small excess from the bottom of a \colpage{} cannot be absorbed by % shrinks but visible at the bottom\footnote{ %  % That is, the author gives higher priority to the perfect alignment of the % items following a \sync{}ation point.}. %  % Note that the original definition of \!\@textbottom! is saved in % \Midx{\!\pcol@textbottom!} before the invocation of \!\@makecol! and is % restored after that\footnote{ %  % This save/restore cannot be done by a grouping because \!\@makecol! builds % \!\@outputbox! by local assignments.}. % % Second, if $\CSIndex{pcol@sptext}=\true$ and $c=0$ to mean a \mctext{} % encounters a page break, we have the first half (or second or succeeding % part if the text lays across three or more pages) of the text in % \!\box!|255|. Therefore, we add an element $\spt(H_n,h_n)$ to the tail of % the list of \mctext{}s $\pp^s(\ptop)=\!\pcol@sptextlist!$, where $H_n$ is % the height of \prespan{} in \!\pcol@prespan!\footnote{ %  % Since we have a \sync{}ation point before a \mctext{} always, \prespan{} % or its sole contents \cs{vbox} has a vertical skip at its tail to make the % its depth 0 as discussed in \secref{sec:imp-sout-sync}.} %  % plus the total height of top floats calculated by \!\pcol@addflhd! with % $\cc_c(\tl)=\!\@toplist!$, and $h_n$ is the height-plus-depth of % \!\box!|255|. Note that $H_n$ and $h_n$ are represented in the form of % integer and thus we produce them by expansions with \!\number!. % % The addition, however, is not made if $h_n=0$ because painting its % \bground{} is harmful if an extension is specified to make the region % visible, while not painting or drawing a segment of \cseprule{} is very % natural. Note that this $h_n=0$ case includes that in which \!\box!|255| % has nothing but its height-plus-depth is non-zero because of discarding % leading skips of the \mctext{} as pre-break skips. This special case is % detected by decapsulating \!\box!|255| by \!\unvcopy! and examining the % height-plus-depth of the result\footnote{ %  % We cannot do % \cs{setbox}\cs{@cclv}\cs{vbox}\texttt{\Arg{\cs{unvbox}\cs{@cclv}}} % because it erases the effect of pre-break skip following some visible % material.}. %  % Also note that the list to be added is always for the \tpage{}, i.e., % $\pp^s(\ptop)$ and thus we get and update it by \!\pcol@getcurrpinfo! and % \!\pcol@defcurrpage!, because the \mctext{} immediately follows a % \sync{}ation point in $\ptop$. Then we let \!\box!|255| have the % \prespan{} followed by the \mctext{} being the original contents of % \!\box!|255|, which may be shifted left by % $\WT-w_c=\!\textwidth!-\!\columnwidth!$ by the macro % \!\pcol@shiftspanning! if \cswap{} is in effect so that its left edge is % aligned to that of the leftmost column, i.e., of the text area. % % The third addition is for \Scfnote{}s. If they are presented in % \!\footins!, we shrink \!\@colht! by its height plus depth % by \!\pcol@shrinkcolbyfn! and put the stretch and shrink factor of % \!\skip!\!\footins! at the bottom of \!\box!|255| by \!\pcol@unvbox@cclv! % to {\em remove} footnotes from the \colpage{} but keeping the % stretch\slash shrink contribution to the page breaking by their existence. % Then we save \!\footins! into a new \!\insert! to be referred to as % \!\pcol@currfoot!\footnote{ %  % Not in \cs{pcol@footins} because it is destroyed in \cs{pcol@startpage} % just before saving operation into $\pp^f(p)$.} %  % by \!\pcol@savefootins! if $p=\ptop$ so that it is saved in $\pp^f(p)$ by % \!\pcol@startpage! afterward, or simply discard the contents of % \!\footins! otherwise because $\pp^f(p)$ has already been fixed. Note % that these saving\slash discarding make \!\footins! void and thus % \!\@makecol! will not put footnotes. % % On the other hand, if footnote typesetting is \mcfnote{}, \!\footins! is % kept unchanged so that its contents will be put by \!\@makecol! if it has % something. As for \!\pcol@currfoot!, it should have its default value % $\!\voidb@x!=\bot$ assigned to it beforehand, so that, if $p=\ptop$, % \!\pcol@startpage! will make $\pp^f(p)=\bot$ unless \Scfnote{s} are given % in \!\footins!. %  % \begin{macrocode} \def\pcol@makecol{\let\pcol@textbottom\@textbottom \ifdim\pcol@textfloatsep=\maxdimen\else \def\@textbottom{\vskip\z@\@plus.0001fil\@minus.0001fil}\fi \ifpcol@sptext \ifnum\pcol@currcol=\z@ \pcol@getcurrpinfo\@tempcnta\@tempdima\@tempskipa \setbox\@tempboxa\vbox{\unvcopy\@cclv}% \@tempdimb\ht\@tempboxa \advance\@tempdimb\dp\@tempboxa \ifdim\@tempdimb>\z@ \@tempdimb\ht\@cclv \advance\@tempdimb\dp\@cclv \dimen@\ht\pcol@prespan \pcol@addflhd\@toplist\pcol@textfloatsep \@cons\pcol@sptextlist{{\number\dimen@}{\number\@tempdimb}}% \fi \pcol@defcurrpage{\number\@tempcnta}\pcol@spanning\pcol@footins {\pcol@sptextlist}{\pcol@mparbottom}% \setbox\@cclv\vbox{\unvbox\pcol@prespan \pcol@shiftspanning\@cclv \unvbox\@cclv}% \fi\fi \def\pcol@currfoot{\voidb@x}% \ifpcol@scfnote \ifvoid\footins\else \pcol@shrinkcolbyfn\@colht\footins\relax \setbox\@cclv\vbox{\pcol@unvbox@cclv\footins}% \ifnum\pcol@page=\pcol@toppage \pcol@Log\pcol@makecol{save}\footins \pcol@Fb \pcol@savefootins\pcol@currfoot \pcol@Fe{makecol(pagefn)}% \else \pcol@Log\pcol@makecol{discard}\footins \setbox\@tempboxa\box\footins \fi \fi\fi \pcol@Logstart\pcol@makecol \ifvoid\footins\else \pcol@Log\@makecol{put}\footins \fi \@makecol \pcol@Logend\pcol@makecol \let\@textbottom\pcol@textbottom} % \end{macrocode} % \end{macro} %  % \KeepSpace{1} % \begin{macro}{\@combinefloats} % \begin{macro}{\pcol@combinefloats} % \changes{v1.0}{2011/10/10} % {Introduced for special float handling in a column-page with % synchronization points.} % \changes{v1.2-2}{2013/05/11} % {Remove the shrink of \cs{textfloatsep} because each column in the last % page is now made not taller than \cs{@colht} definitely by the % introduction of the pre-flushing column height check.} % \changes{v1.2-7}{2013/05/11} % {Add the assignment of \cs{@maxdepth} to \cs{maxdepth} to nullify % the temporary setting done by \cs{@addtobot}.} % \changes{v1.3-6}{2013/09/17} % {Add special operations for columns having synchronization point to % move the infinite stretch and shrink to let it follow bottom floats % rather than preceding them.} % \begin{macro}{\pcol@@combinefloats} % \changes{v1.2-7}{2013/05/11} % {Introduced to solve the \cs{output} request sneaking.} %  % The macro \!\pcol@combinefloats! being our own version of \!\@combinefloats! % is used in \LaTeX's \!\@makecol! because the original and our % own are made \!\let!-equal by \!\pcol@zparacol!, and also used in % \!\pcol@makenormalcol! explicitly. The customization is twofold for both % of top and bottom floats. % % For the top floats, we invoke the original \!\@cflt! if % $\cc_c(\tf)=\infty$ to mean the \colpage{} to be shipped out does not have % \sync{}ation points, or otherwise our own \!\pcol@cflt! which we will % discuss shortly. Prior to the invocation of \!\@cflt!, in addition, we % let $\!\maxdepth!=\!\@maxdepth!$ so that the macro refers to the value used % throughout a \env{paracol} environment instead of that modified by % \!\@addtobot! possibly affect the work in \!\@cflt! by the following % sequence. %  % \begin{eqnarray*} % \!\pcol@flushcolumn!(c)&\to&\!\pcol@trynextcolumn!\to\cdots\to\!\@addtobot!\\ % &\to&\!\pcol@flushcolumn!(c{+}k)\to\!\pcol@@makecol!\to\!\@makecol!\\ % &\to&\!\pcol@combinefloats!\to\!\@cflt! % \end{eqnarray*} % % For the bottom floats, we invoke the original \!\@cflb! always but, if % the \colpage{} has \sync{}ation points, we insert vertical skips of % $s=0\,|pt|\ |plus|\ 0.0001\,|fil|\ |minus|\ 0.0001\,|fil|$ and $-s$ before % and after the invocation respectively. Since \!\@textbottom! is let have % the skip of $s$ by \!\pcol@makecol! for a \colpage{} having \sync{}ation % points and is inserted below bottom floats by \!\@makecol!\footnote{ %  % The insertion point is common to \LaTeX{} and p\LaTeX{}.}, %  % the effect of \!\@textbottom! is canceled by the skip of $-s$ but looks % moved above bottom floats. Therefore, if the natural height of the % \colpage{} is smaller than \!\@colht!, bottom floats are flushed to the % page bottom as if \colpage{} itself is flushed by \!\newpage! etc. On the % other hand, if the natural height is larger, more importantly, all shrinks % below the last \sync{}ation point is canceled by the infinite shrink in % $s$ above the bottom float but we should have sufficient space for shrinks % there thanks to \!\textfloatsep! to avoid the interference between the % bottom text and bottom floats. % % In addition, if $\CSIndex{ifpcol@lastpage}=\true$ to mean the \colpage{} is % in the \lpage{}, we insert \!\textfloatsep! in \!\@outputbox! below the % bottom floats so that they are well separated from \postenv. The switch % is also $\true$ in the invocation from \!\pcol@makenormalcol! for % \preenv{}, so that the bottom floats in it are well separated from the top % of multi-column stuff in the \spage. % % On the other hand, the original \!\@combinefloats! saved in % \!\pcol@@combinefloats! by \!\pcol@zparacol! is used in \!\pcol@output! to % restore the original when it finds \!\output! request sneaking. %  % \begin{macrocode} \def\pcol@combinefloats{% \global\maxdepth\@maxdepth \ifx\@toplist\@empty\else \ifdim\pcol@textfloatsep=\maxdimen \@cflt \else \pcol@cflt \fi \fi \ifx\@botlist\@empty\else \ifdim\pcol@textfloatsep=\maxdimen \@cflb \else \setbox\@outputbox\vbox{\unvbox\@outputbox \vskip\z@\@plus.0001fil\@minus.0001fil}% \@cflb \setbox\@outputbox\vbox{\unvbox\@outputbox \vskip\z@\@plus-.0001fil\@minus-.0001fil}% \fi \ifpcol@lastpage \setbox\@outputbox\vbox{\box\@outputbox \vskip\textfloatsep}% \fi \fi} % \end{macrocode} % \end{macro}\end{macro}\end{macro} %  % \begin{macro}{\pcol@cflt} % \changes{v1.0}{2011/10/10} % {Introduced for special float handling in a column-page with % synchronization points.} % \changes{v1.2-7}{2013/05/11} % {Replace \cs{maxdepth} with \cs{@maxdepth}.} % \changes{v1.32-2}{2015/10/10} % {Add \cs{pcol@Fb}/\cs{pcol@Fe} pair(s).} % \changes{v1.33-2}{2016/11/19} % {Add {\tt\%} to the end of the line to open \cs{vbox} for % \cs{@outputbox} to obey the coding convention.} %  % The macro \!\pcol@cflt! is invoked solely from \!\pcol@combinefloats! if % the \colpage{} for which the macro combines the top floats has % \sync{}ation points. The macro has the same structure as \LaTeX's version % \!\@cflt! but has three modifications. The first one is that the floats % are packed in a \!\vbox! rather than listed in \!\@outputbox! to nullify % the stretch and shrink of \!\floatsep! to keep the \sync{}ation point from % moving by them\footnote{ %  % Maybe unnecessary because of \!\@textbottom! inserted by \!\pcol@makecol! % but \ldots}. %  % The second is that we use \!\@maxdepth! instead of \!\maxdepth! to make it % clear we always use the value common throughout a \env{paracol} % environment. The third is that the \!\textfloatsep! is replaced with % $\!\pcol@textfloatsep!=\cc_c(\tf)$ (definitely finite) which can have a % value different from \!\textfloatsep! when the float space is enlarged for % \sync{}ation. If this enlargement is required, $\cc_c(\tf)$ is biased by % 10000\,|pt| and thus is assuredly\footnote{ %  % Though not definitely in theoretical sense.} %  % larger than 5000\,|pt|. If so, the insertion of \!\topfigrule! should be % inhibited because it has already been inserted by \!\pcol@synccolumn! or % there are no real floats but we only have the float for main vertical list % prior to the \sync{}ation point, or {\em\Uidx\mvlfloat} in short. %  % \begin{macrocode} \def\pcol@cflt{% \let\@elt\@comflelt \setbox\@tempboxa\vbox{}% \@toplist \setbox\@outputbox\vbox{% \boxmaxdepth\@maxdepth \box\@tempboxa \vskip-\floatsep \ifdim\pcol@textfloatsep>5000\p@ \advance\pcol@textfloatsep-\@M\p@ \else \topfigrule \fi \vskip\pcol@textfloatsep \unvbox\@outputbox}% \let\@elt\relax \pcol@Fb \xdef\@freelist{\@freelist\@toplist}% \pcol@Fe{cflt}% \global\let\@toplist\@empty} % \end{macrocode} % \end{macro} % % \begin{macro}{\pcol@opcol} % \changes{v1.0}{2011/10/10} % {Remove unnecessary assignment of \cs{@colht}.} % \changes{v1.0}{2011/10/10} % {Rename \cs{pcol@maxpage} as \cs{pcol@toppage}.} % \changes{v1.2-1}{2013/05/11} % {Add \cs{pcol@clearcst@unvbox} to add coloring \cs{special}s at the % top and bottom of the column-page to be shipped out, together with % the setting $\cs{boxmaxdepth}\EQ\cs{@maxdepth}$ for depth capping.} % \changes{v1.3-2}{2013/09/17} % {Rename \cs{pcol@outputpage} as \cs{pcol@outputcolumns}.} % \changes{v1.32-2}{2015/10/10} % {Add \cs{pcol@Fb}/\cs{pcol@Fe} pair(s).} % \changes{v1.33-2}{2016/11/19} % {Add {\tt\%} to the end of the line to open \cs{vbox} for % \cs{@currbox} to obey the coding convention.} %  % The macro \!\pcol@opcol! is invoked from \!\pcol@output! for the ordinary % completed \colpage{} built by \!\pcol@makecol!, or from the loop creating % \fcolumn{}s in \!\pcol@output! or \!\pcol@freshpage!. At first it % saves the \colpage{} of column $c$ in \!\@outputbox!, which % \!\pcol@makecol! or \!\@tryfcolumn! just has built for an ordinary or % \fcolumn{} respectively, in an \!\insert! acquired from \!\@freelist! by % \!\@next!, and then adds it to the tail of $\S_c=|\pcol@shipped|{\cdot}c$ %  % \SpecialArrayIndex{c}{\pcol@shipped} %  % by \!\@cons!. In this saving operation, we add the sequence of uncoloring % \!\special!s at the bottom to clear \colorstack{} by % \!\pcol@clearcst@unvbox! giving it \!\@outputbox! to be \!\unvbox!ed and % possibly coloring \!\special!s for the \colpage{}'s \colorctext{} saved in % $\csts$ at the top, so that the succeeding \colpage{} in printing order % starts with its own \colorctext. For this addition, furthermore, we let % $\!\boxmaxdepth!=\!\@maxdepth!$ to keep the depth capping made in the box % builder from nullified\footnote{ %  % Or to apply the capping dropped from p\LaTeX's \cs{@makecol}, or to do % nothing for the box made by \cs{@tryfcolumn} and thus being 0 deep.}. % % Then if $c=0$, we fix the page number of the page $p$ having the % \colpage{} and let $\pp^p(q)$ have $\page(p)+(q-p)$ usually but possibly % $\page(p)+2(q-p)$ with \npaired{} \parapag{}ing, for all % $q\in[p{+1},\ptop]$ by \!\pcol@setpageno!. After that, we invoke % \!\pcol@nextpage! to let $p=p'$ for the next \colpage{} of $c$, where % $p'=p+1$ usually but can be $p+k+1$ if we have consecutive $k$ \fpage{}s % from $p+1$. % % Next, we check if the oldest page $\pbase$ is made ready to be shipped out % by the participation of the completed \colpage{} by \!\pcol@checkshipped!. % If so, we invoke \!\pcol@outputcolumns! giving argument 0 to ship out % $\pbase$ and its successor \fpage{}s. % % Finally we set up the next page $p$ by \!\pcol@startpage! if $p>\ptop$ % meaning it is new one, or by \!\pcol@getcurrpage! otherwise, and % reinitialize parameters for floats by \!\pcol@floatplacement! before % returning to the invoker. %  % \begin{macrocode} \def\pcol@opcol{% \pcol@Fb \@next\@currbox\@freelist{\global\setbox\@currbox\vbox to\@colht{% \boxmaxdepth\@maxdepth \pcol@clearcst@unvbox\@outputbox}}\pcol@ovf \pcol@Fe{opcol}% \expandafter\@cons\csname pcol@shipped\number\pcol@currcol\endcsname\@currbox \ifnum\pcol@currcol=\z@ \pcol@setpageno \fi \pcol@nextpage \pcol@checkshipped \if@tempswa \pcol@outputcolumns\z@ \fi \ifnum\pcol@page>\pcol@toppage \pcol@startpage \else \pcol@getcurrpage \fi \pcol@floatplacement} % \end{macrocode} % \end{macro} % % \begin{macro}{\pcol@setpageno} % \changes{v1.33-2}{2016/11/19} % {Add \cs{let}\cs{@elt}\cs{relax} before \cs{edef} of \cs{reserved@a} % for the sake of clarity.} % \begin{macro}{\pcol@setpnoelt} % \changes{v1.0}{2011/10/10} % {Rename \cs{ifpcol@textonly} as \cs{ifpcol@nospan}.} % \changes{v1.2-2}{2013/05/11} % {Completely recode reflecting the redesign of page context.} % \changes{v1.3-2}{2013/09/17} % {Add an operation to increment $\string\mathit{page}(p)$ by two for % non-paired parallel-paging.} % \changes{v1.3-3}{2013/09/17} % {Revise reflecting the new page context element $\pi^s(p)$, and add a % invoker \cs{pcol@makecol}.} % \changes{v1.3-4}{2013/09/17} % {Revise reflecting the new page context element $\pi^m(p)$.} %  % The macro \!\pcol@setpageno! is invoked from \!\pcol@opcol! when it % processes the \colpage{} of the first column $c=0$ to fix the page number % $\page(p)\gets\counter{page}=\!\c@page!$ of the page $p=\!\pcol@page!$ % having the \colpage{}. It is also invoked from \!\pcol@output@switch! % when it leaves from the first column to reflect a jump of \counter{page} % made in the column building. In both cases, the macro lets $\pp^p(q)$ % have $\page'(q)=\page(p)+(q-p)$, except for the case of \npaired{} % \parapag{}ing in which $\page'(q)=\page(p)+2(q-p)$ instead, for all % $q\in[p,\ptop]$. % % Since we possibly have to update $\pp(q)$ such that $q\geq p$, at first we % temporarily let % $\Uidx\PPP=(\PP,\pp(\ptop))=\!\pcol@pages!\!\pcol@currpage!$ empty % after copying its original value into $\mathit{\Pi}'=\!\reserved@a!$. % Then we scan $\pi'(q)\in\mathit{\Pi}'$ for all $q\in[\pbase,\ptop]$ by % applying \!\pcol@setpnoelt! to each $\pi'(q)$ giving its five components % to the macro, so that the macro updates $\pp(q)$ by \!\pcol@defcurrpage! % letting $\pp^p(q)=\page'(q)$ if $q\geq p$, or equivalently $p-q\leq0$. % Note that we let \!\c@page! have $\page'(q)$, but this assignment is % temporary and \!\c@page! will regain the value $\page(p)$ after % \!\pcol@setpageno! finishes. %  % \begin{macrocode} \def\pcol@setpageno{\begingroup \@tempcnta\pcol@page \advance\@tempcnta-\pcol@basepage \let\@elt\relax \edef\reserved@a{\pcol@pages\pcol@currpage}% \global\let\pcol@pages\@empty \global\let\pcol@currpage\@empty \let\@elt\pcol@setpnoelt \reserved@a \endgroup} \def\pcol@setpnoelt#1#2#3#4#5{% {\let\@elt\relax \xdef\pcol@pages{\pcol@pages\pcol@currpage}}% \ifnum\@tempcnta>\z@ \gdef\pcol@currpage{\@elt{#1}#2#3{#4}{#5}}% \else \pcol@defcurrpage{\number\c@page}{#2}{#3}{#4}{#5}% \advance\c@page\@ne \ifpcol@paired\else \advance\c@page\@ne \fi \fi \advance\@tempcnta\m@ne} % \end{macrocode} % \end{macro}\end{macro} %  % \begin{macro}{\pcol@defcurrpage} % \changes{v1.2-2}{2013/05/11} % {Introduced by the redesign of page context, partly replacing % \cs{pcol@setordpage} which once we call \cs{pcol@settextpage}.} % \changes{v1.3-3}{2013/09/17} % {Revise reflecting the new page context element $\pi^s(p)$, and add a % invoker \cs{pcol@makecol}.} % \changes{v1.3-4}{2013/09/17} % {Revise reflecting the new page context element $\pi^m(p)$.} %  % The macro % $\!\pcol@defcurrpage! % \Arg{\pp^p(p)}\arg{\pp^i(p)}\arg{\pp^f(p)}\Arg{\pp^s(p)}\Arg{\pp^m(p)}$ % is invoked from \!\pcol@makecol! to update $\pp^s(\ptop)$, % \!\pcol@setpnoelt! to update $\pp^p(p)$, \!\pcol@startpage! to initialize % a newly created page, \!\pcol@output@start! to initialize a \spage{}, % \!\pcol@output@switch! to update $\pp^s(\ptop)$ and/or $\pp^f(\ptop)$, and % \!\pcol@setmpbelt! to update $\pp^m(p)$. The macro \!\xdef!ines % \!\pcol@currpage! letting it have the \pctext{} $\pp(p)$ given by the % arguments. %  % \begin{macrocode} \def\pcol@defcurrpage#1#2#3#4#5{{% \let\@elt\relax \xdef\pcol@currpage{\@elt{#1}#2#3{#4}{#5}}}} % \end{macrocode} % \end{macro} % % \begin{macro}{\pcol@nextpage} % \changes{v1.2-7}{2013/05/11} % {Remove unnecessary scan of $\pi(p_t)$.} % \begin{macro}{\pcol@nextpelt} % \changes{v1.2-2}{2013/05/11} % {Revise reflecting the redesign of page context.} % \changes{v1.3-3}{2013/09/17} % {Revise reflecting the new page context element $\pi^s(p)$, and add a % invoker \cs{pcol@makecol}.} % \changes{v1.3-4}{2013/09/17} % {Revise reflecting the new page context element $\pi^m(p)$.} % \changes{v1.3-6}{2013/09/17} % {Fix the bug that $\pi^h(q)$ is not referred correctly.} %  % The macro \!\pcol@nextpage! is invoked solely in \!\pcol@opcol! to let % $p$ be $p+k+1$ where $k$ is the number of \fpage{}s directly following % $p$, i.e., $k=\Abs{\Set{q>p}{p<\forall q'\leq q:\pp(q')^h<0}}$. For % this update, the macro scans $\pp(q)\in\PP$ for all $q\In\pbase\ptop$ % applying \!\pcol@nextpelt! to $\pp(q)$, to perform the following where % $p_0$ is $p$ before update and $f=\CSIndex{if@tempswa}$ being $\true$ at % initial, to let $p\gets p+k$, and then increments $p$ to have $p+k+1$. % $$ % \\gets\cases{ % \& $q\leq p_0$\cr % \& $q>p_0\;\land\;f\;\land\;\pp^i(q)\neq\bot\;\land\; % \pp^h(q)<0$\cr % \& otherwise} % $$ %  % \begin{macrocode} \def\pcol@nextpage{\begingroup \@tempcnta\pcol@page \advance\@tempcnta-\pcol@basepage \@tempswatrue \let\@elt\pcol@nextpelt \pcol@pages \global\advance\pcol@page\@ne \endgroup} \def\pcol@nextpelt#1#2#3#4#5{% \ifnum\@tempcnta<\z@ \ifvoid#2\@tempswafalse \else\ifdim\dimen#2<\z@ \if@tempswa \global\advance\pcol@page\@ne \fi \else \@tempswafalse \fi\fi \fi \advance\@tempcnta\m@ne} % \end{macrocode} % \end{macro}\end{macro} % % \begin{macro}{\pcol@checkshipped} % The macro \!\pcol@checkshipped! is invoked solely in \!\pcol@opcol! to let % \CSIndex{if@tempswa} be $\true$ iff % $S_c=|\pcol@shipped|{\cdot}c\neq\emptyset$ %  % \SpecialArrayIndex{c}{\pcol@shipped} %  % for all $c\In0\C$ to mean the oldest page $\pbase$ is ready to be shipped % out. %  % \begin{macrocode} \def\pcol@checkshipped{\@tempswatrue \@tempcnta\z@ \@whilenum\@tempcnta<\pcol@ncol\do{% \expandafter\ifx\csname pcol@shipped\number\@tempcnta\endcsname\@empty \@tempswafalse \fi \advance\@tempcnta\@ne}} % \end{macrocode} % \end{macro} % % \KeepSpace{2} % \begin{macro}{\pcol@getcurrpage} % \changes{v1.3-4}{2013/09/17} % {Add a user \cs{pcol@addmarginpar}.} % \begin{macro}{\pcol@getpelt} % \changes{v1.2-2}{2013/05/11} % {Revise reflecting the redesign of page context.} % \begin{macro}{\pcol@getpinfo} % \changes{v1.0}{2011/10/10} % {Rename \cs{ifpcol@textonly} as \cs{ifpcol@nospan}.} % \changes{v1.2-2}{2013/05/11} % {Revise reflecting the redesign of page context.} % \begin{macro}{\pcol@getcurrpinfo} % \changes{v1.2-2}{2013/05/11} % {Revise reflecting the redesign of page context.} % \changes{v1.3-3}{2013/09/17} % {Revise reflecting the new page context element $\pi^s(p)$, and add a % invoker \cs{pcol@makecol}.} % \changes{v1.3-4}{2013/09/17} % {Revise reflecting the new page context element $\pi^m(p)$.} %  % The macro \!\pcol@getcurrpage! is invoked in \!\pcol@opcol!, % \!\pcol@restartcolumn!, \!\pcol@addmarginpar!, \!\pcol@flushcolumn! and % \!\pcol@freshpage! to let; %  % \begin{eqnarray*} % &&\!\c@page!=\pp^p(p)\quad % \!\@colht!=\pp^h(p)\quad % \!\topskip!=\pp^t(p)\quad % \CSIndex{ifpcol@nospan}=(\pp^i(p)=\bot)\\ % &&\Midx{\!\pcol@spanning!}=\pp^i(p)\quad % \Midx{\!\pcol@footins!}=\pp^f(p)\quad % \Midx{\!\pcol@sptextlist!}=\pp^s(p)\\ % &&\Midx{\!\pcol@mparbottom!}=\pp^m(p) % \end{eqnarray*} %  % for $p=\!\pcol@page!\in[p_b,p_t]$. To do that, the macro scans all % $\pp(q)\in\PPP=(\PP,\pp(\ptop))$ applying \!\pcol@getpelt! to % $\pp(q)= % \Arg{\pp^p(q)}\arg{\pp^i(q)}\arg{\pp^f(q)}\Arg{\pp^s(q)}\Arg{\pp^m(q)}$ % to invoke % $$ % \!\pcol@getpinfo! % \Arg{\pp^p(q)}\arg{\pp^i(q)}\arg{\pp^f(q)}\Arg{\pp^s(q)}\Arg{\pp^m(q)} % \arg{pg}\arg{ch}\arg{ts} % $$ % with the following arguments for \!\global! assignments, if $q=p$. % $$ % \arg{pg}=\!\global!\!\c@page!\quad % \arg{ch}=\!\global!\!\@colht!\quad\arg{ts}=\!\global!\!\topskip! % $$ % Then the macro \!\pcol@getpinfo! do the obvious assignments to % \!\pcol@spanning!, \!\pcol@footins!, \!\pcol@sptextlist!, % \!\pcol@mparbottom! and $\arg{pg}$, and the following % conditional assignments. %  % \begin{eqnarray*} % &&\<\arg{ch},\arg{ts},\CSIndex{ifpcol@nospan}\>= % \left\{\begin{array}{llll} % \<\!\textheight!,&\!\pcol@topskip!,&\true\>&\quad\pp^i(q)=\bot\\ % \<\pp^h(q),&\pp^t(q),&\false\>&\quad\pp^i(q)\neq\bot\end{array}\right. % \end{eqnarray*} %  % \begin{Sloppy}{2800}\noindent % The other macro $\!\pcol@getcurrpinfo!\arg{pg}\arg{ch}\arg{ts}$ is invoked % in \!\pcol@makecol!, \!\pcol@startpage!, \!\pcol@output@switch!, % \!\pcol@sync!, \!\pcol@flushcolumn! and \!\pcol@make~flushed~page! do the % similar assignments using \!\pcol@getpinfo!, but it is not for $\pp(p)$ % but for $\pp(\ptop)={}$\!\pcol@currpage!. The macro \!\pcol@getpinfo! % also has a direct invoker \!\pcol@outputelt!. % \end{Sloppy} %  % \begin{macrocode} \def\pcol@getcurrpage{\begingroup \@tempcnta\pcol@page \advance\@tempcnta-\pcol@basepage \let\@elt\pcol@getpelt \pcol@pages\pcol@currpage \endgroup} \def\pcol@getpelt#1#2#3#4#5{% \ifnum\@tempcnta=\z@ \pcol@getpinfo{#1}#2#3{#4}{#5}% {\global\c@page}{\global\@colht}{\global\topskip}% \fi \advance\@tempcnta\m@ne} \def\pcol@getpinfo#1#2#3#4#5#6#7#8{\pcol@nospantrue \gdef\pcol@spanning{#2}\gdef\pcol@footins{#3}\gdef\pcol@sptextlist{#4}% \gdef\pcol@mparbottom{#5}% #6#1\relax \ifvoid#2\relax #7\textheight #8\pcol@topskip \else #7\dimen#2\relax #8\skip#2\relax \pcol@nospanfalse \fi} \def\pcol@getcurrpinfo{% \edef\reserved@a{\expandafter\@cdr\pcol@currpage\@nil}% \expandafter\pcol@getpinfo\reserved@a} % \end{macrocode} % \end{macro}\end{macro}\end{macro}\end{macro} % % \begin{macro}{\pcol@floatplacement} % \changes{v1.0}{2011/10/10} % {Add initialization of \cs{pcol@textfloatsep}.} % \changes{v1.3-4}{2013/09/17} % {Remove clearing operation on \cs{@mparbottom} because it is no % longer in column-context.} %  % The macro \!\pcol@floatplacement! is invoked from \!\pcol@opcol!, % \!\pcol@output@start!, \!\pcol@flushcolumn!, \!\pcol@freshpage! and % \!\pcol@output@end! to reinitialize the parameters of \cwise{} float % placement at the beginning of a \colpage{} or that of \postenv. The macro % lets \!\@textfloatsheight! be 0 and then invokes \!\@floatplacement!, as % \!\@opcol! does its tail\footnote{ %  % But $\!\@mparbottom!=0$ is not done because it is meaningless now.}. %  % In addition, the macro lets \!\pcol@textfloatsep! be \!\maxdimen! to mean % the new \colpage{} does not have \sync{}ation point at initial. %  % \begin{macrocode} \def\pcol@floatplacement{% \global\@textfloatsheight\z@ \global\pcol@textfloatsep\maxdimen \@floatplacement} % \end{macrocode} % \end{macro} % % % % \section{Starting New Page} % \label{sec:imp-startpage} % % \begin{macro}{\pcol@startpage} % \changes{v1.0}{2011/10/10} % {Add assignment of \cs{pcol@firstprevdepth} to be \cs{relax}.} % \changes{v1.0}{2011/10/10} % {Rename \cs{pcol@maxpage} as \cs{pcol@toppage}.} % \changes{v1.0}{2011/10/10} % {Rename \cs{pcol@settextpage} as \cs{pcol@setordpage}.} % \changes{v1.2-2}{2013/05/11} % {Revise reflecting the redesign of page context.} % \changes{v1.3-2}{2013/09/17} % {Duplicate \cs{stepcounter} of \cs{c@page} if non-paired % parallel-paging is in effect.} % \changes{v1.3-3}{2013/09/17} % {Revise reflecting the new page context element $\pi^s(p)$.} % \changes{v1.3-4}{2013/09/17} % {Revise reflecting the new page context element $\pi^m(p)$.} % \changes{v1.32-3}{2015/10/10} % {Add $\hbox{\cs{f@depth}}\EQ0$ to override % $\hbox{\cs{f@depth}}\EQ\hbox{\texttt{1sp}}$ done by % \cs{@dblfloatplacement}.} % \changes{v1.32-3}{2015/10/10} % {Modify the code to apply \cs{@sdblcolelt} to \cs{@dbldeferlist} so % as to work with both 2015 (or newer) and 2014 (or older) versions % of \LaTeX.} % \changes{v1.32-2}{2015/10/10} % {Add \cs{pcol@Fb}/\cs{pcol@Fe} pair(s).} %  % The macro \!\pcol@startpage! is invoked from \!\pcol@opcol! with % $\!\pcol@currpage!=\pp(p{-}1)$ to start a new page $p=\!\pcol@page!$, or % from \!\pcol@output@start! with a too large \preenv{} or % \!\pcol@freshpage! with $\!\pcol@currpage!=|{}|$ and $\!\c@page!=\page(p)$ % to start a new page $p=0$. % % First, we let $\!\pcol@firstprevdepth!=\!\relax!$ to mean we have (had) % left from the \spage{} so that \!\pcol@output@end! will be informed of % that. Next we let $\ptop=p$ and then, if invoked from \!\pcol@opcol!, % obtain $\pp^p(p{-}1)$ by \!\pcol@getcurrpinfo! to have $\page(p{-}1)$ in % \!\c@page!, and let $\PP\gets\PPP=(\PP,\pp(p{-}1))$ with % $\pp^f(p{-}1)=\!\pcol@currfoot!$ into which \!\pcol@makecol! saved % \Scfnote{}s if any. Next we lets $\!\c@page!=\page(p{-}1)+1$ unless % \npaired{} \parapag{}ing is in effect or in other words if % $\CSIndex{ifpcol@paired}=\true$, or $\!\c@page!=\page(p{-}1)+2$ otherwise, % by \!\stepcounter!. Then we let $\!\@colht!=\!\textheight!$ as the base % value without \spanning, and $\!\topskip!=\!\pcol@topskip!$ because the % new page is the second or succeeding one built in \env{paracol} % environment. %  % \begin{macrocode} %% Starting New Page \def\pcol@startpage{% \global\let\pcol@firstprevdepth\relax \global\pcol@toppage\pcol@page \ifx\pcol@currpage\@empty\else \pcol@getcurrpinfo{\global\c@page}\@tempdima\@tempskipa \@cons\pcol@pages {{\number\c@page}\pcol@spanning\pcol@currfoot {\pcol@sptextlist}{\pcol@mparbottom}}% \stepcounter{page}\ifpcol@paired\else \stepcounter{page}\fi \fi \global\@colht\textheight \global\topskip\pcol@topskip % \end{macrocode} % % Then, we build \fpage{}s if any as follows. First we invoke % \!\@dblfloatplacement! to reinitialize the parameters for \pwise{} float % placement. In addition, we let $\!\f@depth!=0$ to nullify the % setting $\!\f@depth!=|1sp|$ possibly done by \!\@dblfloatplacement! as % discussed in the item-(\ref{item:ovv-float-@dblfloatplacement}) of % \secref{sec:imp-ovv-float}. Then we repeat \!\@tryfcolumn! giving it % \!\@dbldeferlist! having \pwise{} floats not contributed to previous % pages yet, while $\CSIndex{if@fcolmade}=\true$ meaning it builds \fpage{}s % in \!\@outputbox!. For each \fpage{}, we acquire an \!\insert! from % \!\@freelist! by \!\@next! for $\pp^i(\ptop)$ to let it have the % followings to represent the \fpage{}. %  % \begin{eqnarray*} % \pp^p(\ptop)&=&\!\c@page!\quad % \pp^b(\ptop)=\!\@outputbox!\quad % \pp^h(\ptop)=-\!\maxdimen!\quad % \pp^t(\ptop)=\!\pcol@topskip!\\ % \pp^f(\ptop)&=&\bot\quad % \pp^s(\ptop)=\emptyset\quad % \pp^m(\ptop)=\emptyset % \end{eqnarray*} %  % We also increment $p$ and $\ptop$, and also \!\c@page! by one or two % according to \CSIndex{ifpcol@paired} by \!\stepcounter!, to let them have % the values for the page following the \fpage{}s. %  % \begin{macrocode} \@dblfloatplacement \let\f@depth\z@ \@tryfcolumn\@dbldeferlist \@whilesw\if@fcolmade\fi{% \pcol@Fb \@next\@currbox\@freelist{% \global\setbox\@currbox\box\@outputbox}\pcol@ovf \pcol@Fe{startpage(fcol)}% \global\dimen\@currbox-\maxdimen \global\skip\@currbox\pcol@topskip \@cons\pcol@pages{{\number\c@page}\@currbox\voidb@x{}{}}% \stepcounter{page}\ifpcol@paired\else \stepcounter{page}\fi \global\advance\pcol@page\@ne \global\pcol@toppage\pcol@page \@tryfcolumn\@dbldeferlist}% % \end{macrocode} % % Next, we copy \!\@dbldeferlist! containing \pwise{} floats which % could not be included in \fpage{}s to \!\reserved@b!, clear the list, and % then scan the copied list by applying \!\@sdblcolelt! to each list % element to invoke \!\@addtodblcol! for adding the element to \!\@dbltoplist! % or keeping it in \!\@dbldeferlist! or \!\@deferlist! depending on \LaTeX's % version, as \LaTeX's \!\@startdblcolumn! does. In addition, as discussed % in item-(\ref{item:ovv-float-@addtodblcol}) of % \secref{sec:imp-ovv-float}, we also clear \!\@deferlist! after saving it in % \!\reserved@c! prior to the scan, and then after the scan we concatenate % \!\@dbldeferlist! and \!\@deferlist! to let the former have the result and % restore \!\@deferlist! from \!\reserved@c!. % % Then If this scan results in empty \!\@dbltoplist! to mean the new page % does not have any \spanning, we invoke \!\pcol@defcurrpage! with % $\pp^i(\ptop)=\pp^f(\ptop)=\bot$ and $\pp^s(\ptop)=\pp^m(\ptop)=\emptyset$ % so that $\pp(\ptop)$ represents a page perfectly empty. %  % \begin{macrocode} \begingroup \let\reserved@b\@dbldeferlist \let\reserved@c\@deferlist \global\let\@dbldeferlist\@empty \global\let\@deferlist\@empty \let\@elt\@sdblcolelt \reserved@b \let\@elt\relax \xdef\@dbldeferlist{\@dbldeferlist\@deferlist}% \global\let\@deferlist\reserved@c \endgroup \ifx\@dbltoplist\@empty \pcol@defcurrpage{\number\c@page}\voidb@x\voidb@x{}{}% % \end{macrocode} % % Otherwise, i.e., \!\@dbltoplist! is not empty, we scan all elements in it % by letting $\!\@elt!=\!\@comdblflelt!$ to have all \pwise{} floats in % \!\@tempboxa!. Then, after returning all elements to \!\@freelist!, we % acquire an \!\insert! from \!\@freelist! to be $\pp^i(\ptop)$ by \!\@next! % and store the contents of \!\@tempboxa! in $\pp^b(\ptop)$ after removing % the last vertical skip \!\dblfloatsep! and then adding \!\dblfigrule! and % the vertical skip \!\dbltextfloatsep!. The other elements of $\pp(\ptop)$ % are set as follows to represent the page with \spanning{} which makes the % height of each column \!\@colht! shrunk from its initial value % \!\textheight! by the series of \!\@addtodblcol!. %  % \begin{eqnarray*} % \pp^p(\ptop)&=&\!\c@page!=\page(\ptop)\quad % \pp^h(\ptop)=\!\@colht!\quad % \pp^t(\ptop)=\!\pcol@topskip!\quad % \pp^f(\ptop)=\bot\\ % \pp^s(\ptop)&=&\emptyset\quad % \pp^m(\ptop)=\emptyset\quad % \end{eqnarray*} % % Finally, regardless of the existence of the \pwise{} floats, we let % $\!\pcol@footins!=\bot$ to mean the \tpage{} does not have any \Scfnote{}s, % so far if footnote typesetting is \scfnote, or never otherwise. %  % \begin{macrocode} \else \setbox\@tempboxa\vbox{}% \begingroup \let\@elt\@comdblflelt \@dbltoplist \let\@elt\relax \pcol@Fb \xdef\@freelist{\@freelist\@dbltoplist}% \pcol@Fe{startpage(dbltop)}% \global\let\@dbltoplist\@empty \pcol@Fb \@next\@currbox\@freelist{\global\setbox\@currbox\vbox{% \unvbox\@tempboxa \vskip-\dblfloatsep \dblfigrule \vskip\dbltextfloatsep}}\pcol@ovf \pcol@Fe{startpage(spanning)}% \global\dimen\@currbox\@colht \global\skip\@currbox\pcol@topskip \pcol@defcurrpage{\number\c@page}\@currbox\voidb@x{}{}% \endgroup \fi \gdef\pcol@footins{\voidb@x}} % \end{macrocode} % \end{macro} % % % % \section{Shipping Page Out} % \label{sec:imp-outputpage} % % \begin{macro}{\pcol@outputcolumns} % \changes{v1.0}{2011/10/10} % {Rename \cs{ifpcol@stopoutput} as \cs{ifpcol@outputflt}.} % \changes{v1.3-2}{2013/09/17} % {Rename \cs{pcol@outputpage} as \cs{pcol@outputcolumns}.} %  % The macro \!\pcol@outputcolumns!$\arg{all}$ is invoked from \!\pcol@opcol! % with $\arg{all}=0$ to ship out the page $\pbase$ and \fpage{}s following % it if any, or \!\pcol@sync! with $\arg{all}=1$ to ship out all pages in % $\PP$. It copies $\PP=\!\pcol@pages!$ into $\mathit{\Pi}'=\!\reserved@b!$ % and clear $\PP$ once to remove pages shipped out from it. Then, after % initializing $f_o=\CSIndex{if@tempswa}=\true$ to ship out (the first) % ordinary page and $f_f=\CSIndex{ifpcol@outputflt}=\true$ to ship out % \fpage{}s (following the first page), it scans all % $\pp(q)\in\mathit{\Pi}'$ applying $\!\pcol@outputelt!\arg{all}$ to % $\pp(q)$ to ship it out or keep it in $\PP$. %  % \begin{macrocode} %% Shipping Page Out \def\pcol@outputcolumns#1{\begingroup \def\@elt{\pcol@outputelt#1}\@tempswatrue \pcol@outputflttrue \let\reserved@b\pcol@pages \gdef\pcol@pages{}% \reserved@b \endgroup} % \end{macrocode} % \end{macro} %  % \begin{macro}{\pcol@outputelt} % \changes{v1.2-2}{2013/05/11} % {Revise reflecting the redesign of page context.} % \changes{v1.3-3}{2013/09/17} % {Revise reflecting the new page context element $\pi^s(p)$.} % \changes{v1.3-4}{2013/09/17} % {Revise reflecting the new page context element $\pi^m(p)$.} %  % The macro $\!\pcol@outputelt! % \arg{all}\Arg{\pp^p(q)}\arg{\pp^i(q)}\arg{\pp^f(q)} % \Arg{\pp^s(q)}\Arg{\pp^m(q)}$ ships out the ordinary or \fpage{} $q$ if % $f_o=\true$ or $f_f=\true$ respectively. After initializing % \!\@outputbox! to be $\bot$, we retrieve the page $q$'s information by % \!\pcol@getpinfo! to have $\page(q)$ in \!\c@page! locally, \!\textheight! % or $\pp^h(q)$ in $h=\!\@tempdima!$, % $f_{\it{}ns}=\CSIndex{ifpcol@nospan}=(\pp^i(q)=\bot)$, and % $\!\pcol@footins!={\pp^f(q)}$. %  % \begin{macrocode} \def\pcol@outputelt#1#2#3#4#5#6{% \setbox\@outputbox\box\voidb@x \pcol@getpinfo{#2}#3#4{#5}{#6}\c@page\@tempdima\@tempskipa % \end{macrocode} % % Then, we do one of the followings according to $h$ and $f_o$. %  % \begin{itemize} % \item $h<0$\\ % It means $q$ is a \fpage{}. If $f_f=\true$, we let \!\@outputbox! have % $\pp^b(q)$ to be shipped out, paint its \bground{} with $\bgc_{\{F,f\}}$ % by \!\pcol@bg@paintbox! letting the basic height \!\pcol@bg@floatheight! % of the paining region % $\bgr_{\{F,f\}}$ be % $\HT=\!\pcol@bg@textheight!=\!\textheight!+\!\maxdepth!$, and return % $\!\insert!{\cdot}\pp^i(q)$ to \!\@freelist! by \!\@cons! because it is no % longer necessary. Then if $\CL<\C$ to mean \parapag{}ing is in effect, we % let \!\pcol@rightpage! be an empty box but paint its \bground{} too, because % the right counterpart of left parallel float page should be always blank. % Note that we temporarily increment $\page(q)$ by one for \npaired{} right % \parapag{}es so that the painting macro performs page-parity dependent % operations correctly. %  % \Index{parallel-paging} % \Index{float page} % % On the other hand if $f_f=\false$, we simply return $\pp(q)$ back to $\PP$. % \end{itemize} %  % \changes{v1.0}{2011/10/10} % {Rename \cs{ifpcol@stopoutput} as \cs{ifpcol@outputflt}.} % \changes{v1.3-3}{2013/09/17} % {Add painting of page-wise float page.} % \changes{v1.3-2}{2013/09/17} % {Add building a empty right parallel float page.} % \changes{v1.32-2}{2015/10/10} % {Add \cs{pcol@Fb}/\cs{pcol@Fe} pair(s).} %  % \begin{macrocode} \ifdim\@tempdima<\z@ \ifpcol@outputflt \def\pcol@bg@floatheight{\pcol@bg@textheight}% \setbox\@outputbox\vbox to\textheight{% \pcol@bg@paintbox{Ff}\unvbox\pcol@spanning}% \pcol@Fb \@cons\@freelist\pcol@spanning \pcol@Fe{outputelt(spanning)}% \ifnum\pcol@ncolleft<\pcol@ncol \setbox\pcol@rightpage\vbox to\textheight{% \ifpcol@paired\else \advance\c@page\@ne \fi \pcol@bg@paintbox{Ff}\vfil}% \fi \else \@cons\pcol@pages{{#2}#3#4{#5}{#6}}% \fi % \end{macrocode} %  % \begin{itemize} % \item $h\geq0\;\land\;f_o=\true$\\ % It means $q$ is a non-\fpage{} to be shipped out. If $\arg{all}=0$, we % let $f_o=\false$ to keep succeeding non-\fpage{}s from being shipped out. % Then we build the ship-out image of the right \parapag{}e $q$ in % \!\pcol@rightpage! by \!\pcol@ioutputelt! giving it the box and the column % range $\LBRP\CL\C$ if $\CL<\C$ to mean \parapag{}ing, and then that of the % left \parapag{}e in \!\@outputbox! by \!\pcol@ioutputelt! again but giving % it $\LBRP0\CL$ and \!\@outputbox!. Note that the right-first left-second % order is essential, because in the process to build right \parapag{}e we % have to examine the existence of $\pp^i(q)$ and $\pp^f(q)$ and then refer % to their height and depth to make the region corresponding to them blank, % while the boxes of these \!\insert!s are made void in the building process % of the left \parapag{}e obviously. % % Then after the ship-out image building, we \!\global!ly let % $\CSIndex{ifpcol@firstpage}=\false$ to tell \!\pcol@ioutputelt! and % \!\pcol@makeflushedpage! that the pages they build are no longer first of % a \env{paracol} environment and thus $\pp^i(q)$ should have \pwise{} % floats rather than \preenv{} hereafter. % \end{itemize} %  % \changes{v1.0}{2011/10/10} % {Rename \cs{ifpcol@textonly} as \cs{ifpcol@nospan}.} % \changes{v1.1}{2012/05/11} % {Use $\cs{pcol@columnwidth}{\cdot}c$ instead of \cs{columnwidth} as % the width of $c$'s \cs{hbox}.} % \changes{v1.2-4}{2013/05/11} % {Add column-swapping for even pages if specified.} % \changes{v1.2-2}{2013/05/11} % {Add ship-out of page-wise footnote.} % \changes{v1.2-7}{2013/05/11} % {Add $\cs{boxmaxdepth}\EQ\cs{@maxdepth}$ for depth capping.} % \changes{v1.3-2}{2013/09/17} % {Move the core of ship-out image building to \cs{pcol@ioutputelt} for % parallel paging.} %  % \begin{macrocode} \else\if@tempswa \ifnum#1=\z@ \@tempswafalse \fi \ifnum\pcol@ncolleft<\pcol@ncol \pcol@Logstart{\pcol@outputelt{right}}% \pcol@ioutputelt\pcol@ncolleft\pcol@ncol\pcol@rightpage \pcol@Logend{\pcol@outputelt{right}}% \fi \pcol@Logstart{\pcol@outputelt{left}}% \pcol@ioutputelt\z@\pcol@ncolleft\@outputbox \pcol@Logend{\pcol@outputelt{left}}% \global\pcol@firstpagefalse % \end{macrocode} %  % \begin{itemize} % \item $h\geq0\;\land\;f_o=\false$\\ % It means $q$ is a non-\fpage{} to be kept. Therefore, we let % $f_f=\false$ to keep \fpage{}s following it from being shipped out. Then % we return $\pp(q)$ to $\PP$ by \!\@cons!. % \end{itemize} %  % \begin{macrocode} \else \pcol@outputfltfalse \@cons\pcol@pages{{#2}#3#4{#5}{#6}}% \fi\fi % \end{macrocode} % % Finally, if $\!\@outputbox!\neq\bot$ to mean $\pp(q)$ is to be % shipped out, we invoke \!\@outputpage! to do it and increment $\pbase$ to % let it has $q+1$. Note that since we have let $\!\c@page!=\page(q)$, the % direct and indirect references to it in \!\@outputpage! are correctly done. % Also note that the \!\global! increment of it by \!\stepcounter! in % \!\@outputpage! will be overridden by the \!\global! assignment to it done % by \!\pcol@startpage! or \!\pcol@getcurrpage! invoked from \!\pcol@opcol! % if $\arg{all}=0$, or by \!\pcol@getcurrpinfo! invoked from \!\pcol@sync! % otherwise. %  % \begin{macrocode} \ifvoid\@outputbox\else \global\advance\pcol@basepage\@ne \@outputpage \fi} % \end{macrocode} % \end{macro} % % \begin{macro}{\pcol@ioutputelt} % \changes{v1.3-2}{2013/09/17} % {Introduced for parallel-paging.} % \changes{v1.3-3}{2013/09/17} % {Add column-separating rule drawing and background painting.} % \changes{v1.3-4}{2013/09/17} % {Add a logic to cope with non-uniform column-separating gaps.} %  % The macro $\!\pcol@ioutputelt!\<\Cfrom\>\<\Cto\>\arg{b}$ is invoked solely % in \!\pcol@outputelt! but can be done twice with % $(\Cfrom,\Cto,b)=(\CL,\C,\!\pcol@rightpage!)$ if \parapag{}ing is in % effect and with $(\Cfrom,\Cto,b)=(0,\CL,\!\@outputbox!)$ always, to build % the ship-out image of the right or left \parapag{}e $q$ in the box $b$ % respectively. % % After opening a \!\vbox! of \!\textheight! tall for $b$, at first we % increment $\page(q)$ by one for right \parapag{}e if it is \npaired, so % that painting macros perform page-parity dependent operations correctly. % % Next, we put materials to be shipped out in the box $b$ as follows. % First, if $\pp^f(q)\neq\bot$ to mean the page $q$ has \Scfnote{}, we paint % their \bground{} with $\bgc_{\{N,n\}}$ by \!\pcol@bg@paintbox! letting the % basic height \!\pcol@bg@footnoteheight! of the paining region % $\bgr_{\{N,n\}}$ be the height-plus-depth of $\pp^f(q)$. % We do the painting at this earliest stage of the image building in order % to use the left-top corner of the text area where we are now at as the % origin for painting, and to let the region may be overlaid by those of % columns and \csepgap{}s. We also let $h=\pp^h(q)=\!\@tempdima!$ shrunk by % the height-plus-depth by \!\pcol@shrinkcolbyfn!. %  % \begin{macrocode} \def\pcol@ioutputelt#1#2#3{\setbox#3\vbox to\textheight{% \ifpcol@paired\else\ifnum#1=\z@\else \advance\c@page\@ne \fi\fi \ifvoid\pcol@footins\else \def\pcol@bg@footnoteheight{\@elt{\ht\pcol@footins}\@elt{\dp\pcol@footins}}% \pcol@bg@paintbox{Nn}% \pcol@shrinkcolbyfn\@tempdima\pcol@footins\relax \fi % \end{macrocode} % % Second, if $f_{\it ns}=\false$ to mean $\pp(q)$ has \spanning{} in % $\pp^b(q)$, we do one of the followings. %  % \begin{itemize} % \item % If $\Cfrom=0$ to mean the target is the left \parapag{}e, $\pp^b(q)$ is % put by \!\unvbox!, painting its \bground{} with $\bgc_{\{F,f\}}$ by % \!\pcol@bg@paintbox! letting the basic height \!\pcol@bg@floatheight! of % the paining region $\bgr_{\{F,f\}}$ be the height-plus-depth of $\pp^b(q)$ % if $q$ is not the first page and thus $\pp^b(q)$ has \pwise{} floats. We % also return the \!\insert! $\pp^i(q)$ to \!\@freelist! by \!\@cons!. % % \item % If $\Cfrom\neq0$ to mean right \parapag{}e and $q$ is the first page, % \!\pcol@rightpage! has \preenv{} in the right \parapag{}e. Therefore, we % simply put the box but making its height and depth equal to those of % $\pp^b(q)$, without painting because the box has already been painted, and % with \!\nointerlineskip! to prevent baseline-skip insertion below the box. % % \item % Otherwise, i.e., $\Cfrom\neq0$ and $q$ is not the first page, we put an % empty box whose height and depth equal to those of $\pp^b(q)$ by % \!\pcol@phantom!, with painting as done for floats in the left \parapag{}e % and with \!\nointerlineskip!. % \end{itemize} %  % Note that after putting \spanning{} and/or painting the \bground{}, we % temporarily increment \!\topmargin! by the height-plus-depth of % $\pp^b(q)$, so that painting macros for columns, \csepgap{}s and % \mctext{}s assume the top edge of column area as that of text area when % they extend the top edges of their regions upward to the page top. %  % \Index{extension of background painting region} %  % \changes{v1.32-2}{2015/10/10} % {Add \cs{pcol@Fb}/\cs{pcol@Fe} pair(s).} %  % \begin{macrocode} \ifpcol@nospan\else \def\pcol@bg@floatheight{% \@elt{\ht\pcol@spanning}\@elt{\dp\pcol@spanning}}% \@tempdimb\ht\pcol@spanning \advance\@tempdimb\dp\pcol@spanning \ifnum#1=\z@ \ifpcol@firstpage\else \pcol@bg@paintbox{Ff}\fi \pcol@Fb \@cons\@freelist\pcol@spanning \unvbox\pcol@spanning \pcol@Fe{ioutputelt(spanning)}% \else\ifpcol@firstpage \ht\pcol@rightpage\ht\pcol@spanning \dp\pcol@rightpage\dp\pcol@spanning \box\pcol@rightpage \nointerlineskip \else \pcol@bg@paintbox{Ff}\pcol@phantom\pcol@spanning \nointerlineskip \fi\fi \advance\topmargin\@tempdimb \fi % \end{macrocode} % % Third, we invoke \!\pcol@buildcolseprule! giving it $h$ being $\pp^h(q)$ % but possibly shrunk by \Scfnote{}s, the column range $\LBRP\Cfrom\Cto$, % and \!\@maxdepth! to mean $q$ is non-\lpage, to draw a \cseprule{} % possibly broken by the spaces for \mctext{}s in the box \!\pcol@tempboxa! % and to paint the \bground{}s of columns, \csepgap{}s and \mctext{} in the % box \!\@tempboxa! which we put into $b$ immediately. % % Fourth, we put a \!\hbox! of \!\textwidth! wide having \!\hbox!es % of $\w_c=|\pcol@columnwidth|{\cdot}c$ %  % \SpecialArrayIndex{c}{\pcol@columnwidth} %  % wide containing $\sigma_c$ followed by \!\hss! for all $c\In\Cfrom\Cto$, % where $\sigma_c=\!\box!{\cdot}s_c(q)$ being the first element removed from % $\S_c$ by \!\@next! and then returned to \!\@freelist! by \!\@cons! if it % is not $\bot$, or \!\voidb@x! otherwise. We separate \!\hbox!es of % $\sigma_c$ by making each \!\hbox! preceded by \Midx{\!\pcol@@hfil!} being % \!\relax! for the first one and the macro \!\pcol@hfil! for others giving % it an argument $c^g=\!\pcol@colsepid!\in\{c,c{-}1\}$ which we discuss % shortly to put a gap of $\gap_{c^g}=|\pcol@columnsep|{\cdot}c^g$ %  % \SpecialArrayIndex{c}{\pcol@columnsep} %  % wide optionally having a \cseprule{} and being painted. % % Note that the scanning order of $c\In\Cfrom\Cto$ is usually ascending of % course, but is descending if \cswap{} is specified and $\page(q)\bmod2=0$. % For this ordering, we invoke % $\!\pcol@swapcolumn!\arg{c'}\arg{c}\<\Cfrom\>\<\Cto\>$ to have $c$ for % the $(c'-\Cfrom)$-th iteration of the scanning where $c'=\!\@tempcnta!$ % and $c=\!\@tempcntb!$. Another operation done by the macro is to let % $c^g=c-1$ if swapped or $c^g=c$ otherwise, because if swapped the % column-$c$ is followed by the gap which follows $c-1$ if not swapped. %  % \changes{v1.32-2}{2015/10/10} % {Add \cs{pcol@Fb}/\cs{pcol@Fe} pair(s).} %  % \begin{macrocode} \pcol@buildcolseprule\@tempdima#1#2\@maxdepth \unvbox\@tempboxa \hb@xt@\textwidth{% \let\pcol@@hfil\relax \@tempcnta#1\relax \@whilenum\@tempcnta<#2\do{% \pcol@swapcolumn\@tempcnta\@tempcntb#1#2\relax \expandafter\@next\expandafter\@currbox \csname pcol@shipped\number\@tempcntb\endcsname \relax{\let\@currbox\voidb@x}% \ifvoid\@currbox\else \pcol@Fb \@cons\@freelist\@currbox \pcol@Fe{ioutputelt(page)}% \fi \expandafter\@tempdima \csname pcol@columnwidth\number\@tempcntb \endcsname \pcol@@hfil \hb@xt@\@tempdima{\box\@currbox\hss}% \edef\pcol@@hfil{\noexpand\pcol@hfil{\pcol@colsepid}}% \advance\@tempcnta\@ne}}% % \end{macrocode} % % Fifth, if $\pp^f(q)\neq\bot$ to mean the page $q$ has \Scfnote{}s, we put % them at the bottom of \!\@outputbox! by \!\pcol@putfootins!, and return % $\pp^f(q)$ to \!\@freelist!, if $\Cfrom=0$ meaning left \parapag{}e. % Otherwise for the right \parapag{}e, we simply put an empty box whose % height and depth equal to those of $\pp^f(q)$ by \!\pcol@phantom!, % preceded by a vertical skip of $\!\skip!{\cdot}\pp^f(q)$ and then % \!\nointerlineskip! to inhibit baseline skip insertion above the box, and % followed by null \!\vskip! as done in \!\pcol@putfootins!. % % Sixth and finally\footnote{ %  % Not necessary to be finally, but we placed this assignment at the end of % the box to make it clear the depth capping is only for the box.}, %  % we let $\!\boxmaxdepth!=\!\@maxdepth!$ to cap the depth of $b$ which we % are now closing, as done for each \colpage{} and as expected to be applied % to \Scfnote{}s. %  % \changes{v1.32-2}{2015/10/10} % {Add \cs{pcol@Fb}/\cs{pcol@Fe} pair(s).} %  % \begin{macrocode} \ifvoid\pcol@footins\else \ifnum#1=\z@ \pcol@Log\pcol@outputelt{output}\pcol@footins \pcol@putfootins\pcol@footins \pcol@Fb \@cons\@freelist\pcol@footins \pcol@Fe{ioutputelt(footins)}% \else \vskip\skip\pcol@footins \nointerlineskip \pcol@phantom\pcol@footins \vskip\z@ \fi \fi \boxmaxdepth\@maxdepth}} % \end{macrocode} % \end{macro} %  % \begin{macro}{\pcol@phantom} % \changes{v1.3-2}{2013/09/17} % {Introduced for parallel-paging.} %  % The macro \!\pcol@phantom!$\$ is used in \!\pcol@ioutputelt!, % \!\pcol@makeflushedpage! and \!\pcol@output@end! to put an empty box, whose % height and depth are equal to that of the argument box $b$ being a kind of % \pwstuff, into \!\pcol@rightpage! for the right \parapag{}e whose left % counterpart has $b$ in it. That is, the macro is used to make a region % corresponding to $b$ blank. To put the empty box, we locally let % \!\@tempboxa! have it setting its height and depth to those of $b$ and % then put it. %  % \begin{macrocode} \def\pcol@phantom#1{{% \setbox\@tempboxa\vbox{}\ht\@tempboxa\ht#1\dp\@tempboxa\dp#1\box\@tempboxa}} % \end{macrocode} % \end{macro} % % \KeepSpace{1} % \begin{macro}{\pcol@buildcolseprule} % \changes{v1.3-3}{2013/09/17} % {Introduced for column-separating rule drawing and background % painting for columns, column-separating gaps and spanning texts.} % \changes{v1.3-4}{2013/09/17} % {Introduced for non-uniform column-separating gaps.} % \changes{v1.34}{2018/05/07} % {Rename \cs{pcol@tempbox} as \cs{pcol@tempboxa}.} % \begin{macro}{\pcol@buildcselt@S} % \changes{v1.3-3}{2013/09/17} % {Introduced for background under-painting for spanning texts.} % \begin{macro}{\pcol@buildcselt} % \changes{v1.3-3}{2013/09/17} % {Introduced for column-separating rule drawing and background % painting for columns, column-separating gaps and spanning texts.} % \changes{v1.3-4}{2013/09/17} % {Introduced for non-uniform column-separating gaps.} % \changes{v1.34}{2018/05/07} % {Rename \cs{pcol@tempbox} as \cs{pcol@tempboxa}.} %  % The macro $\!\pcol@buildcolseprule!\\<\Cfrom\>\<\Cto\>\$ is % used in \!\pcol@ioutputelt!, \!\pcol@imakeflushedpage! and % \!\pcol@iflushfloats! to build a box containing \cseprule{} possibly % broken by \mctext{}s and to paint \bground{}s of columns and \csepgap{}s % for $c\In\Cfrom\Cto$ and \mctext{}s in the \lpage{} ($d=0$) or non-last % page ($d=\!\@maxdepth!$) $p$ having \colpage{}s of $H_{n+1}$ tall where % $n=\Abs{\pp^s(p)}$. % % For initializing the drawing and painting process, we let % $\!\@tempdimb!=H_0+h_0=0$, % $(\!\pcol@bg@from!,\!\pcol@bg@to!)=(\CBfrom,\CBto)=(\Cfrom,\Cto)$, and % make boxes $b_r=\!\pcol@tempboxa!$ for the rule and $b_b=\!\@tempboxa!$ for % the \bground{} empty. Then we apply % \!\pcol@buildcselt@S!$\\$ to each element $\spt(H_i,h_i)$ of % $\pp^s(p)$ to under-paint the \bground{} of each \mctext{} by % \!\pcol@bg@paintbox! defining its region $\bgr_S(i)$ by letting their top % edge positions $y_0=\!\pcol@bg@spanningtop!=H_i$, and height % $y_1-y_0=\!\pcol@bg@spanningheight!=h_i$ if $H_i+h_i\$ to each element $\spt(H_i,h_i)$ to % do the followings. %  % \begin{enumerate} % \item % To $b_r$, add a vertical rule whose height is $H'_i=H_i-(H_{i-1}+h_{i-1})$ % and width is \!\columnseprule! if $H'_i>0$, and then a vertical skip of % $h_i$, as the rule segment between $(i{-}1)$-th and $i$-th \mctext{}s. % Note that $H_i$ and $h_i$ are represented in the form of integers and thus % we need |sp| to use them as dimensions. % % \item % To $b_b$, add painted \bground{}s for all columns $c\In\Cfrom\Cto$ and % \csepgap{}s $c\In\Cfrom{\Cto{-}1}$ by \!\pcol@bg@paintcolumns! defining % their regions $\bgr_{\{c,g\}}^c(i)$ by letting common top edge position % $y_0=\!\pcol@bg@columntop!=H_{i-1}+h_{i-1}$ and common height % $y_1-y_0=\!\pcol@bg@columnheight!=H'_i$, if $H'_i>0$. Also add painted % \bground{} for the $i$-th \mctext{} by \!\pcol@bg@paintbox! as we did for % under-painting but this time the region is $\bgr_s(i)$. % % \item % Let $\!\@tempdimb!=H_i+h_i$ for the next element $\spt(H_{i+1},h_{i+1})$. % \end{enumerate} %  % Then if $H'_{n+1}>0$, we add the last rule segment of $H'_{n+1}$ tall to % $b_r$, and add painted \bground{}s for columns and \csepgap{}s as done in % the step\Tie2 above but letting $y_1-y_0=H'_{n+1}+d$ to let the common % bottom edge of the their regions reach the bottom of text area for % non-\lpage{}s. % % \begin{macrocode} \def\pcol@buildcolseprule#1#2#3#4{% \@tempdima#1\relax \dimen@#4\relax \let\pcol@bg@from#2\relax \let\pcol@bg@to#3\relax \setbox\pcol@tempboxa\vbox{}\setbox\@tempboxa\vbox{}% \let\@elt\pcol@buildcselt@S \pcol@sptextlist \@tempdimb\z@ \let\@elt\pcol@buildcselt \pcol@sptextlist \let\@elt\relax \advance\@tempdima-\@tempdimb \ifdim\@tempdima>\z@ \setbox\pcol@tempboxa\vbox{\unvbox\pcol@tempboxa \hrule\@height\@tempdima\@width\columnseprule}% \setbox\@tempboxa\vbox{\unvbox\@tempboxa \let\@elt\relax \edef\pcol@bg@columntop{\number\@tempdimb sp}% \edef\pcol@bg@columnheight{% \@elt{\number\@tempdima sp}\@elt{\number\dimen@ sp}}% \pcol@bg@paintcolumns}% \fi} \def\pcol@buildcselt@S#1#2{% \setbox\@tempboxa\vbox{\unvbox\@tempboxa \let\@elt\relax \def\pcol@bg@spanningtop{\@elt{#1sp}}% \advance\@tempdima-#1sp\relax \advance\@tempdima-#2sp\relax \advance\dimen@\@tempdima \edef\pcol@bg@spanningheight{\@elt{#2sp}% \ifdim\@tempdima>\z@\else \@elt{\number\dimen@ sp}\fi}% \pcol@bg@paintbox{S}}} \def\pcol@buildcselt#1#2{% \@tempdimc#1sp \advance\@tempdimc-\@tempdimb \setbox\pcol@tempboxa\vbox{\unvbox\pcol@tempboxa \ifdim\@tempdimc>\z@ \hrule\@height\@tempdimc\@width\columnseprule \fi \vskip#2sp}% \setbox\@tempboxa\vbox{\unvbox\@tempboxa \let\@elt\relax \edef\pcol@bg@columntop{\number\@tempdimb sp}% \edef\pcol@bg@columnheight{\@elt{\number\@tempdimc sp}}% \ifdim\@tempdimc>\z@ \pcol@bg@paintcolumns \fi \def\pcol@bg@spanningtop{\@elt{#1sp}}% \advance\@tempdima-#1sp\relax \advance\@tempdima-#2sp\relax \advance\dimen@\@tempdima \edef\pcol@bg@spanningheight{\@elt{#2sp}% \ifdim\@tempdima>\z@\else \@elt{\number\dimen@ sp}\fi}% \pcol@bg@paintbox{s}}% \@tempdimb#1sp \advance\@tempdimb#2sp\relax} % \end{macrocode} % \end{macro}\end{macro}\end{macro} % % \begin{macro}{\pcol@hfil} % \changes{v1.3-3}{2013/09/17} % {Introduced for column-separating rule drawing.} % \changes{v1.3-4}{2013/09/17} % {Introduced for non-uniform column-separating gaps.} % \changes{v1.34}{2018/05/07} % {Rename \cs{pcol@tempbox} as \cs{pcol@tempboxa}.} %  % The macro $\!\pcol@hfil!\$ is used in \!\pcol@ioutputelt!, % \!\pcol@imakeflushedpage! and \!\pcol@iflushfloats! to separate column % $c{+}1$ and $c$ or $c$ and $c{+}1$ according as the columns are % swapped or not in the page the caller macros are building. %  % \Index{column-swapping} %  % If $\!\columnseprule!=r>0$, the macro puts the followings; a horizontal % space of $\gap_{c}/2=|\pcol@columnsep|{\cdot}c/2$ %  % \SpecialArrayIndex{c}{\pcol@columnsep} %  % followed by a skip $-r/2$ to nullify the width of the rule; the rule in % \!\pcol@tempboxa! which \!\pcol@buildcolseprule! built, with color % $|\pcol@colseprulecolor|{\cdot}c$ %  % \SpecialArrayIndex{c}{\pcol@columnsep} %  % or \!\pcol@colseprulecolor! according as the former is defined or not, % i.e., \!\colseprulecolor!\oarg{mode}\ARg{color}$|[|c|]|$ is declared or % not; and $\gap_c/2$ again but preceded by $-r/2$. On the other hand if % $r=0$, we simply put a space of $\gap_c$. Note that the skips of % $\gap_c/2$ and $\gap_c$ are accompanied by 1\,|fil| infinite stretch to % avoid underfull when $\sum_{c=\Cfrom}^{\Cto-2}(\w_c+\gap_c)+\w_{\Cto-1}<\WT$ % where $(\Cfrom,\Cto)=\{(0,\CL),(\CL,C)\}$, due to arithmetic errors in % calculations of $\w_c$ and $\gap_c$\footnote{ %  % It is assured the sum of $w_c$ and $\gap_c$ cannot exceed $\WT$ even with % arithmetic errors and thus overfull never occurs.}. %  % \begin{macrocode} \def\pcol@hfil#1{{% \@tempdima\csname pcol@columnsep#1\endcsname\relax \ifdim\columnseprule>\z@ \hskip.5\@tempdima\@plus1fil\relax \hskip-.5\columnseprule \@ifundefined{pcol@colseprulecolor#1}% {\pcol@colseprulecolor}{\@nameuse{pcol@colseprulecolor#1}}% \copy\pcol@tempboxa \hskip-.5\columnseprule \hskip.5\@tempdima\@plus1fil\relax \else \hskip\@tempdima\@plus1fil\relax \fi}} % \end{macrocode} % \end{macro} % % \begin{macro}{\pcol@@outputpage} % \changes{v1.3-2}{2013/09/17} % {Introduced keep the original definition of \cs{@outputpage}.} % \changes{v1.3-3}{2013/09/17} % {Introduced keep the original definition of \cs{@outputpage}.} % \changes{v1.3-4}{2013/09/17} % {Introduced keep the original definition of \cs{@outputpage}.} % \begin{macro}{\@outputpage} % \changes{v1.3-2}{2013/09/17} % {Redefined for parallel-paging.} % \changes{v1.3-3}{2013/09/17} % {Redefined for background painting.} % \changes{v1.3-4}{2013/09/17} % {Redefined for marginal note placement.} % \changes{v1.34}{2018/05/07} % {Rename \cs{pcol@tempbox} as \cs{pcol@tempboxa}.} %  % The macro \!\@outputpage!, being our own version of \LaTeX's one kept in % \!\pcol@@outputpage!, ships out a page $p$ or \parapag{}e pair in $p$. % The reason why we redefine this macro is that we need a few special % operations for \parapag{}ing and \bgpaint{} {\em outside} of \env{paracol} % environments. Therefore, the macro is not only used in our own macros % \!\pcol@outputelt!, \!\pcol@output@start!, \!\pcol@output@flush!, % \!\pcol@output@clear!, \!\pcol@flushfloats! and \!\pcol@output@end!, but % also in \LaTeX's \!\@opcol! and \!\@doclearpage!\footnote{ %  % And possibly in \CSIndex{@outputdblcol} if double-column typesetting is % done outside \env{paracol}.} %  % invoked from our own or \LaTeX's \!\output! routine. % % First we calculate $H'_M=\!\topmargin!+\!\headheight!+\!\headsep!$ to place % the origin of \bgpaint{} at the top edge of text area in what \LaTeX{} % assumes as a page, i.e., shifted 1\,inch down from the real page. Then if % $\CSIndex{ifpcol@output}=\true$ to mean this macro is used in a % \env{paracol} environment, we build the painted \bground{}s of left and % right \parapag{}es in $\!\pcol@tempboxa!=b_l$ and $\!\@tempboxa!=b_r$ by % putting a vertical skip of $H'_M$, and invoking \!\pcol@bg@paintpage! % with the setting $(\!\pcol@bg@from!,\!\pcol@bg@to!)=(\CBfrom,\CBto)$ be % $(0,\CL)$ and $(\CL,\C)$ respectively. Note that \!\pcol@bg@paintpage! % paints \bground{}s of regions $\bgr_a^{[c]}$ for all % $a\in\{T,B,L,R,C,S,t,b,l,r\}$ and $c\In\CBfrom\CBto$, and for $b_r$ we % temporarily increment $\page(p)$ by one if \npaired{} \parapag{}ing is in % effect. % % Otherwise, i.e., if $\CSIndex{ifpcol@output}=\false$ indicating outside % use, we build the painted \bground{}s in $b_l$ and $b_r$ similarly but % with the following differences; \bgpaint{} is done if % $\CSIndex{ifpcol@havelastpage}=\true$ to mean the page to be shipped has % the \lpage{} of closed \env{paracol} as its part and % $\!\set@color!\neq\!\relax!$ to mean some coloring package is loaded; % page \bground{} painting is done by \!\pcol@bg@@paintpage! because % \!\pcol@bg@paintpage! is not available outside \env{paracol} environments; % the \bground{} of \postenv{} is painted by \!\pcol@bg@@paintbox! for the % region $\bgr_{\{P,p\}}=[(0,\WT)(\HB,\HT)]$ where % $\HB=\!\pcol@bg@preposttop! % \in\{\!\pcol@bg@preposttop@left!,\!\pcol@bg@preposttop@right!\}$ % having the bottom edge of the last % \env{paracol} environment (having right \parapag{}e for $b_r$). In % addition, we examine if $\!\pcol@rightpage!\neq\bot$ to mean the right % \parapag{}e was built by \!\pcol@output@end! when the last \env{paracol} % environment was closed and, if so, make the box \!\textheight! tall adding % \!\vfil! to its bottom. % % Then regardless of \CSIndex{ifpcol@output}, we do the followings; let the % height and depth of $b_l$ and $b_r$ be 0 because they cannot occupy any % real spaces in the ship-out image; temporarily let % $\CSIndex{ifpcol@swapcolumn}=\false$ if $\page(p)$ is odd, $\CL=\C$ to % mean \parapag{}ing is not in effect\footnote{ %  % Since the assignments of $\CL$ and $\C$ in \CSIndex{pcol@zparacol} are % \CSIndex{global} and they are not modified anywhere else, examining their % equality outside \env{paracol} environments is safe and meaningful.}, %  % \parapag{}ing is done in \npaired{} mode\footnote{ %  % We need this examination because $\CSIndex{ifpcol@swapcolumn}=\false$ for % \npaired{} \parapag{}ing is made locally by \!\pcol@zparacol!.}, %  % or we are outside \env{paracol} environments and the page does not have % anything produced in environments. That is, we let % $\CSIndex{ifpcol@swapcolumn}=\true$ if the page has something produced by % a \env{paracol} environment, \cswap{} and \parapag{}ing are specified for % the (last) environment\footnote{ %  % Column-swapping may be enabled {\em after} the last \env{paracol} % environment was closed but we consider the enabling is effective for the % page having the environment.}, %  % and the page number is even. Note that a page may have two or more % (\lpage{}s of) \env{paracol} environments whose \parapag{}ing style can % be inconsistent including the case some of them are not \parapag{}ed. If % this inconsistency happens the page is shipped out following the style of % the last environment. Also note that even if the last environment is not % \parapag{}ed, the right \parapag{}e kept in \!\pcol@rightpage! is assuredly % shipped out. % % Then if \cswap{} is in effect, we ship out the right \parapag{}e at first % by \!\pcol@outputpage@r! and then the left one by \!\pcol@outputpage@l! to % swap the left and right. Otherwise, the ship-out order is normal and thus % the invocation order is \!\pcol@outputpage@l! then \!\pcol@outputpage@r!. % Note that if \npaired{} \parapag{}ing is in effect, the page number to % given to \!\pcol@outputpage@r! as its argument is $\page(p)+1$ if it is % the second one, i.e., not swapped, while the argument in other cases and % of \!\pcol@outputpage@l! are always $\page(p)$. Then finally, we % \!\global!ly let $\CSIndex{ifpcol@havelastpage}=\false$ because so far the % next page does not have \env{paracol}'s \lpage{} especially when we are % outside it, let \!\pcol@bg@preposttop@left! and % \!\pcol@bg@preposttop@right! have 0 because, if we are outside, the next % \preenv{} should start from the top of a page, and let % $\mpbout=\!\pcol@mparbottom@out!$ be $\mpboutz=\!\pcol@mparbottom@zero!$ % because so far we have no marginal notes given in \env{paracol} % environments\footnote{ %  % This assignment in a \env{paracol} environment is meaningless because % $\mpbout$ is meaningless too, but not harmful.}. %  % \begin{macrocode} \let\pcol@@outputpage\@outputpage \def\@outputpage{\begingroup \@tempdima\topmargin \advance\@tempdima\headheight \advance\@tempdima\headsep \ifpcol@output \setbox\pcol@tempboxa\vtop{\vskip\@tempdima \global\pcol@bg@paintedfalse \let\pcol@bg@from\z@ \let\pcol@bg@to\pcol@ncolleft \pcol@bg@paintpage}% \ifpcol@bg@painted \@tempswatrue \else \@tempswafalse \fi \setbox\@tempboxa\vtop{\vskip\@tempdima \global\pcol@bg@paintedfalse \ifpcol@paired\else \advance\c@page\@ne \fi \let\pcol@bg@from\pcol@ncolleft \let\pcol@bg@to\pcol@ncol \pcol@bg@paintpage}% \else \def\reserved@a{\vskip\@tempdima \global\pcol@bg@paintedfalse \ifpcol@havelastpage \ifx\set@color\relax\else \pcol@bg@@paintpage \pcol@bg@@paintbox{Pp}% \fi\fi}% \setbox\pcol@tempboxa\vbox{% \let\pcol@bg@preposttop\pcol@bg@preposttop@left \let\pcol@bg@from\z@ \let\pcol@bg@to\pcol@ncolleft \reserved@a}% \ifpcol@bg@painted \@tempswatrue \else \@tempswafalse \fi \setbox\@tempboxa\vbox{\ifpcol@paired\else \advance\c@page\@ne \fi \let\pcol@bg@preposttop\pcol@bg@preposttop@right \let\pcol@bg@from\pcol@ncolleft \let\pcol@bg@to\pcol@ncol \reserved@a}% \ifvoid\pcol@rightpage\else \pcol@Logstart{\@outputpage{rightset}}% \setbox\pcol@rightpage\vbox to\textheight{\unvbox\pcol@rightpage \vfil}% \pcol@Logend{\@outputpage{rightset}}% \fi \fi \ht\pcol@tempboxa\z@ \dp\pcol@tempboxa\z@ \ht\@tempboxa\z@ \dp\@tempboxa\z@ \ifodd\c@page \pcol@swapcolumnfalse \fi \ifnum\pcol@ncolleft<\pcol@ncol\else \pcol@swapcolumnfalse \fi \ifpcol@output\else \ifpcol@havelastpage\else \pcol@swapcolumnfalse \fi\fi \@tempcnta\c@page \ifpcol@paired\else \advance\@tempcnta\@ne \pcol@swapcolumnfalse \fi \ifpcol@swapcolumn \pcol@outputpage@r\c@page \pcol@outputpage@l\@tempcnta \else \pcol@outputpage@l\c@page \pcol@outputpage@r\@tempcnta \fi \global\pcol@havelastpagefalse \gdef\pcol@bg@preposttop@left{0pt}% \global\let\pcol@bg@preposttop@right\pcol@bg@preposttop@left \global\let\pcol@mparbottom@out\pcol@mparbottom@zero \endgroup} % \end{macrocode} % \end{macro}\end{macro} % % \KeepSpace{1} % \begin{macro}{\pcol@outputpage@l} % \changes{v1.3-2}{2013/09/17} % {Introduced for shipping out left parallel-pages.} % \changes{v1.3-3}{2013/09/17} % {Introduced for column-separating rule drawing and background % painting in left parallel-pages.} % \changes{v1.34}{2018/05/07} % {Rename \cs{pcol@tempbox} as \cs{pcol@tempboxa}.} % \begin{macro}{\pcol@outputpage@r} % \changes{v1.3-2}{2013/09/17} % {Introduced for shipping out right parallel-pages.} % \changes{v1.3-3}{2013/09/17} % {Introduced for column-separating rule drawing and background % painting in right parallel-pages.} % \begin{macro}{\pcol@outputpage@ev} % \changes{v1.3-3}{2013/09/17} % {Introduced for background painting.} %  % The macro $\!\pcol@outputpage@l!\arg{page}$, used solely in our own % version of \!\@outputpage!, at first lets \!\c@page! have $\arg{page}$ % which definitely has the value that \!\c@page! had when we start % \!\@outputpage!. That is, even when this macro is invoked after % \!\pcol@outputpage@r! due to swapped \parapag{}ing, %  % \Index{column-swapping} %  % this assignment cancels the increment of \!\c@page! done in \LaTeX's % \!\@outputpage! or in other word \!\pcol@@outputpage! because in this case % \parapag{}es are \paired{}. Then we make \!\@themargin! \!\let!-equal to % \!\evensidemargin! if two-side typesetting is in effect and \!\c@page! is % even, or to \!\oddsidemargin! otherwise for the reference in % \!\pcol@outputpage@ev! as shown shortly. % % Next, if \bgpaint{} took place in \!\@outputpage!, we let \!\everyvbox! % have the macro invocation $\!\pcol@outputpage@ev!\$ to be expanded % to the following sequence so that they are the leading materials in the % \!\vbox! to be \!\shipout!; examination if the document is processed by a % Japanese \LaTeX{} named p\LaTeX{} and then, if so, a control sequence % \!\yoko! to put materials naturally; the painted \bground{} $b_l$ shifted % right by \!\@themargin!; \!\nointerlineskip! to inhibit \!\baselineskip! % insertion after $b_l$; emptying \!\everyvbox! to ensure nothing will be % inserted into internal \!\vbox!es; and the assignment of \!\yoko! to % \!\let! it be \!\relax! if necessary. This trick with \!\everyvbox! is % necessary\footnote{ %  % Unless we rewrite \CSIndex{@outputpage}.} %  % because $b_l$ should be put {\em before} \!\pcol@@outputpage! puts the % page header, or the header would be overlaid by regions, e.g., % $\bgr_{\{t,T\}}$ in natural cases. % % The tricky elements to handle \!\yoko! in the sequence is necessary for % p\LaTeX{} whose \!\@outputpage! has \!\yoko! as the first element of the % \!\vbox! to be \!\shipout!, because \!\yoko! must be the first element of % a box but our \!\everyvbox! to put \bground{} would make it non-first. % That is by the tricky elements, the \!\vbox! should have \!\yoko! as the % first element from \!\everyvbox! and then that put by p\LaTeX's % \!\@outputpage! is nullified by \!\let!\!\yoko!\!\relax! in the % \!\everyvbox! just for the \!\vbox! to be shipped out. On the other hand % in ordinary \LaTeX, \!\yoko! does not appear in the \!\vbox! or is % modified. The examination of the use of p\LaTeX{} is also trickily done % by comparing the expansion results of \!\meaning!\!\yoko! and % \!\string!\!\yoko!. Since the former results in the tokens ``\!\yoko!'' % which \!\string!\!\yoko! gives us iff \!\yoko! is a primitive of % underlying \TeX{} being p\TeX{} if so, the comparison should give us % equality iff p\LaTeX{} is in use\footnote{ %  % Unless some other \TeX{} has a primitive named \CSIndex{yoko}. This % examination is more strict than that with \CSIndex{pfmtname} for % \CSIndex{ifpcol@bfbottom}.}. % % Then we invoke \!\pcol@@outputpage! being (p)\LaTeX's original version of % \!\@outputpage! to ship out \!\@outputbox! finally. % % The macro \!\pcol@outputpage@r!$\arg{page}$ performs similar operations but % it does them only when $\!\pcol@rightpage!\neq\bot$ to mean we are in an % \env{paracol} environment with \parapag{}ing or outside it but in the page % in which it resides. Other differences are as follows; $\arg{page}$ can % be $\page(p)+1$ for \npaired{} right \parapag{}es; \!\@outputbox! is % locally made \!\let!-equal to \!\pcol@rightpage! prior to the invocation % of \!\pcol@@outputpage!; and $b_r$ is given to \!\pcol@outputpage@ev! as % its argument. %  % \begin{macrocode} \def\pcol@outputpage@l#1{% \pcol@Logstart{\@outputpage{left}}% \global\c@page#1\relax \let\@themargin\oddsidemargin \if@twoside\ifodd\c@page\else \let\@themargin\evensidemargin \fi\fi \if@tempswa \everyvbox{\pcol@outputpage@ev\pcol@tempboxa}\fi \pcol@@outputpage \pcol@Logend{\@outputpage{left}}} \def\pcol@outputpage@r#1{% \begingroup \ifvoid\pcol@rightpage\else \global\c@page#1\relax \let\@outputbox\pcol@rightpage \pcol@Logstart{\@outputpage{right}}% \let\@themargin\oddsidemargin \if@twoside\ifodd\c@page\else \let\@themargin\evensidemargin \fi\fi \ifpcol@bg@painted \everyvbox{\pcol@outputpage@ev\@tempboxa}\fi \pcol@@outputpage \pcol@Logend{\@outputpage{right}}% \fi \endgroup} \def\pcol@outputpage@ev#1{% \edef\reserved@a{\meaning\yoko}\edef\reserved@b{\string\yoko}% \ifx\reserved@a\reserved@b \yoko\fi \moveright\@themargin\box#1\nointerlineskip \everyvbox{}% \ifx\reserved@a\reserved@b \let\yoko\relax \fi} % \end{macrocode} % \end{macro}\end{macro}\end{macro} % % % % % \section{Starting New Column-Page} % \label{sec:imp-startcolumn} % % \begin{macro}{\pcol@startcolumn} % \changes{v1.3-3}{2013/09/17} % {Add \cs{@colht} and \cs{@tempdimb} as the first and third argument of % \cs{pcol@shrinkcolbyfn}.} % \changes{v1.32-2}{2015/10/10} % {Fix the memory leak caused by mistakingly preserving $\pi^f(p)$ % when $p\EQ p_t$.} % \changes{v1.32-2}{2015/10/10} % {Add \cs{pcol@Fb}/\cs{pcol@Fe} pair(s).} %  % The macro $\!\pcol@startcolumn!\arg{f}$ is invoked from \!\pcol@output! % with $f=1$ and \!\pcol@freshpage! with $f=0$ to start a new \colpage. % This macro has two additional functions to \LaTeX's \!\@startcolumn!, one % for \Scfnote{}s and the other for coloring. % % First, if the page $p$ in which the new \colpage{} resides has \Scfnote{}s % in $\pp^f(p)=\!\pcol@footins!$ because the column is not the leading one, %  % \Index{leading column} %  % we temporarily shrink \!\@colht! and \!\@colroom! by the space required to % put $\pp^f(p)$ by \!\pcol@shrinkcolbyfn! during the trial of deferred % float placement, remembering the existence of the footnotes by letting % $\!\@tempdimb!=-\!\skip!\!\pcol@footins!$ which should be 0 otherwise. % This shrinkage is essentially required when $p<\ptop$ because $\pp^f(p)$ % has been fixed to be a part of $p$ and thus deferred floats cannot push % footnotes down to succeeding pages. In the case of $p=\ptop$, the % shrinkage is also desirable to avoid unnecessary pushing down of footnotes % which \TeX{} has decided to be in $p$. % % Then after trying put deferred floats in the \colpage{} by \!\@tryfcolumn! % and \!\pcol@trynextcolumn! as done in \LaTeX's \!\@startcolumn!, we % \!\insert! $\pp^f(p)$, if it is has some footnotes, by letting \!\footins! % have it by \!\pcol@getcurrfoot! so that \TeX{} will be aware of the % footnotes when it examines the page break of the \colpage{}. That is, if % $p<\ptop$ the \!\insert!ion is to keep the vertical space for $\pp^f(p)$ in % the building process of the \colpage{} in $p$ because any \Scfnote{s} % cannot be added to $p$ any more, and thus $\pp^f(p)$ is preserved until % the page $p$ is shipped out. On the other hand if $p=\ptop$, \Scfnote{s} % in $p$ can grow further and thus \!\insert!ed footnotes will be captured % again by \!\pcol@output@switch! or \!\pcol@startpage!. Therefore, if % $p=\ptop$, we release $\pp^f(p)$ to \!\@freelist!. % % Then if $p=\ptop$, we also \!\insert! deferred footnotes in $\df$ until % their total height reaches \!\@colht! by \!\pcol@deferredfootins! if $f=1$ % to mean this macro is invoked from \!\pcol@output!\footnote{ %  % The \cs{insert}ion of $\pp^f(p)$ also requires $f=1$ but this examination % is redundant because $\pp^f(p)=\bot$ definitely if $f=0$.}. %  % Note that the deferred footnote \!\insert!ion in the case of $f=0$ will % be done afterward when \!\pcol@freshpage! does \!\pcol@restartcolumn! at % its tail. Also note that \!\pcol@deferredfootins! examines if % $\!\@tempdimb!=0$ to mean $\pp^f(p)=\bot$ and thus \!\skip!\!\footins! % should be taken into account in its extraction of the footnotes from $\df$. % % Then after restoring \!\@colht! and canceling the temporary shrinkage of % \!\@colroom!, we invoke \!\pcol@savecolorstack! to save \colpage{}'s % \colorctext{} into $\csts$ so that coloring \!\special!s to reestablish % $\csts$ will be put at its top if it has something when we leave it. %  % \begin{macrocode} %% Starting New Column Page \def\pcol@startcolumn#1{% \@tempdima\@colht \@tempdimb\z@ \ifvoid\pcol@footins\else \pcol@shrinkcolbyfn\@colht\pcol@footins\@tempdimb \fi \global\@colroom\@colht \@tryfcolumn\@deferlist \if@fcolmade\else \pcol@trynextcolumn \ifpcol@scfnote \ifnum#1>\z@ \ifvoid\pcol@footins\else \edef\pcol@currfoot{\pcol@footins}% \pcol@getcurrfoot\copy \pcol@Log\pcol@startcolumn{insert}\footins \insert\footins{\unvbox\footins}% \ifnum\pcol@page=\pcol@toppage \pcol@Fb \@cons\@freelist\pcol@footins \pcol@Fe{startcolumn(pagefn)}% \fi \fi \ifnum\pcol@page=\pcol@toppage \pcol@deferredfootins\pcol@startcolumn \fi \fi\fi \fi \advance\@tempdima-\@colht \global\advance\@colroom\@tempdima \global\advance\@colht\@tempdima \pcol@savecolorstack} % \end{macrocode} % \end{macro} %  % \begin{macro}{\pcol@trynextcolumn} % \changes{v1.2-2}{2013/05/11} % {No change in the code itself but its explanation is modified % according to the drastic redesign of \cs{pcol@startcolumn}.} %  % The macro \!\pcol@trynextcolumn! is invoked from \!\pcol@startcolumn! and % \!\pcol@flush~column! to try to move deferred floats in \!\@deferlist! % into \!\@toplist! or \!\@botlist!. The body of this macro is perfectly % equivalent to the \cs{else} part of \CSIndex{if@fcolmade} in \LaTeX's % \!\@startcolumn!. %  % \begin{macrocode} \def\pcol@trynextcolumn{\begingroup \let\reserved@b\@deferlist \global\let\@deferlist\@empty \let\@elt\@scolelt \reserved@b \endgroup} % \end{macrocode} % \end{macro} % % % % \section{Background Painting} % \label{sec:imp-bgpaint} % % \begin{macro}{\pcol@bg@from} % \changes{v1.3-3}{2013/09/17} % {Introduced for background painting.} % \begin{macro}{\pcol@bg@to} % \changes{v1.3-3}{2013/09/17} % {Introduced for background painting.} %  % The control sequence pair % $(\!\pcol@bg@from!,\!\pcol@bg@to!)=(\Uidx\CBfrom,\Uidx\CBto)$ are made % \!\let!-equal to $(0,\CL)$ or $(\CL,\C)$ by \!\pcol@buildcolseprule! and % \!\@outputpage! for \bgpaint{} of columns and \csepgap{}s, and referred % to by column scanning loops in \!\pcol@bg@paint@ii! and % \!\pcol@bg@columnleft!. The control sequence \!\pcol@bg@to! is also % referred to by \!\pcol@bg@paint@i! to decrement it by one temporarily so % that the loop in \!\pcol@bg@paint@ii! scans $c\In\CBfrom{\CBto{-}1}$ % rather than $\LBRP\CBfrom\CBto$. Since this decrement is done whenever a % painting macro is used regardless some setting of $\CBto$, \!\pcol@bg@to! % has default setting with $\C$ to avoid unbound reference at the % decrement. Note that since this decrement is done in a \!\vbox! and an % appropriate setting must have been done if $\CBto$ is referred in % \!\pcol@bg@paint@ii!, this decrement and default setting are safe. %  % \begin{macrocode} %% Background Painting \let\pcol@bg@to\pcol@ncol % \end{macrocode} % \end{macro}\end{macro} %  % \KeepSpace{4} % \begin{macro}{\pcol@bg@paintpage} % \changes{v1.3-3}{2013/09/17} % {Introduced for background painting.} % \begin{macro}{\pcol@bg@@paintpage} % \changes{v1.3-3}{2013/09/17} % {Introduced for background painting.} % \begin{macro}{\pcol@bg@paintcolumns} % \changes{v1.3-3}{2013/09/17} % {Introduced for background painting.} % \begin{macro}{\pcol@bg@@paintcolumns} % \changes{v1.3-3}{2013/09/17} % {Introduced for background painting.} % \begin{macro}{\pcol@bg@paintbox} % \changes{v1.3-3}{2013/09/17} % {Introduced for background painting.} % \begin{macro}{\pcol@bg@@paintbox} % \changes{v1.3-3}{2013/09/17} % {Introduced for background painting.} %  % The macros \!\pcol@bg@@paintpage!, \!\pcol@bg@@paintcolumns! and % $\!\pcol@bg@@paintbox!\Arg{A}$ are made \!\let!-equal to their interface % counterparts \!\pcol@bg@paintpage!, \!\pcol@bg@paint~columns! and % \!\pcol@bg@paintbox! by \!\pcol@zparacol! if some coloring package has % been loaded. Otherwise, these interface macros are \!\let!-equal to % \!\relax! for first two and \!\@gobble! for the last, so that macros in % \!\output! routine freely use them unaware of coloring capability. One % exception is in \!\@outputpage! which uses \!\pcol@bg@@paintpage! and % \!\pcol@bg@@paintbox! explicitly when it is outside \env{paracol} % environments, examining the availability of coloring. % % The macro \!\pcol@bg@paintpage! and \!\pcol@bg@@paintpage! are used in % \!\@outputpage! to paint \bground{}s of regions $\bgr_a^{[c]}$ for all % $a\in\{T,B,L,R,G,C,t,b,l,r\}$ and $c\In\CBfrom\CBto$ for $a=C$ while % $c\In\CBfrom{\CBto{-}1}$ for $a=G$. Therefore, the macro invokes % \!\pcol@bg@paint@i! with two % $\!\pcol@bg@paint@ii!\Arg{A_b}\Arg{A_g}\Arg{A_c}$, letting % $A_b=|TBLR|$, $A_g=|G|$ and $A_c=|C|$ in the first invocation and then % $A_b=|tblr|$ and $A_g=A_c=\emptyset$ in the second. % % The macro \!\pcol@bg@paintcolumns! is used in \!\pcol@buildcolseprule! and % \!\pcol@buildcselt! to paint \bground{}s of regions $\bgr_g^c(i)$ for % $c\In\CBfrom{\CBto{-}1}$ and $\bgr_c^c(i)$ for $c\In\CBfrom\CBto$. % Therefore, the macro invokes \!\pcol@bg@paint@i! with \!\pcol@bg@paint@ii! % giving it $A_b=\emptyset$, $A_g=|g|$ and $A_c=|c|$. % % The macro $\!\pcol@bg@paintbox!\Arg{A}$ is used in the following macros % with $A$ shown in the parentheses to paint the \bground{}s of regions % $\bgr_{\{a_1,a_2\}}$ where $(a_1,a_2)\in\{(S,s),(F,f),(N,n),\~(P,p)\}$. %  % \begin{quote}\raggedright % \!\pcol@outputelt!\Tie(|Ff|), % \!\pcol@ioutputelt!\Tie(|Nn|, |Ff|), % \!\pcol@buildcselt!\Tie(|Ss|), % \!\pcol@output@start!\Tie(|Pp|), % \!\pcol@output@clear!\Tie(|Ff|), % \!\pcol@makeflushedpage!\Tie(|Ff|), % \!\pcol@imakeflushedpage!\Tie(|Nn|), % \!\pcol@output@end!\Tie(|Nn|). % \end{quote} %  % The macro \!\@outputpage! also uses the function but \!\pcol@bg@@paintbox! % explicitly with $A=|Pp|$. Therefore \!\pcol@bg@@paintbox! invokes % \!\pcol@bg@paint@i! with \!\pcol@bg@paint@ii! giving it $A_b=A$ and % $A_g=A_c=\emptyset$. %  % \begin{macrocode} \def\pcol@bg@@paintpage{% \pcol@bg@paint@i{% \pcol@bg@paint@ii{TBLR}{G}{C}\pcol@bg@paint@ii{tblr}{}{}}} \def\pcol@bg@@paintcolumns{\pcol@bg@paint@i{\pcol@bg@paint@ii{}{g}{c}}} \def\pcol@bg@@paintbox#1{\pcol@bg@paint@i{\pcol@bg@paint@ii{#1}{}{}}} % \end{macrocode} % \end{macro}\end{macro}\end{macro}\end{macro}\end{macro}\end{macro} % % \begin{macro}{\pcol@bg@paint@i} % \changes{v1.3-3}{2013/09/17} % {Introduced for background painting.} %  % The macro $\!\pcol@bg@paint@i!\Arg{body}$ is used in % \!\pcol@bg@@paintpage!, \!\pcol@bg@@paint~columns! and % \!\pcol@bg@@paintbox! to paint \bground{}s by a sequence of % \!\pcol@bg@paint@ii! specified in $\arg{body}$. The painted \bground{} is % built in \!\@tempboxa! being a \!\vtop! having a null \!\vskip! as its % first element so that everything put in the box is below its reference % point at its top. Then, before invoking \!\pcol@bg@paint@ii! in % $\arg{body}$, we do the followings; \!\global!ly let % $\CSIndex{ifpcol@bg@painted}=\false$ to indicate so far any painted % \bground{} are produced; make \!\pcol@bg@leftmargin! \!\let!-equal % to \!\pcol@lrmargin! to use this \!\dimen! register locally with the % more appropriate alias; negate \!\pagerim! locally to calculate $\HT$ % easily; decrement $\CBto$ by one locally for the column scanning loop for % $c\In\CBfrom{\CBto{-}1}$ in \!\pcol@bg@paint@ii!; and \!\offinterlineskip! % to inhibit inter-line \!\baselineskip! insertion in the box. Then after % the invocation of the sequence of \!\pcol@bg@paint@ii! in $\arg{body}$ and % closing the box, we let the height, depth and width of the box be 0 so % that it does not occupy any real space in the outer box in which the box % is put. Finally, if $\CSIndex{ifpcol@bg@painted}=\true$ meaning that some % painted \bground{}s are built in the box, we put the box into the outer % box surrounding it by \!\nointerlineskip! to inhibit inter-line % \!\baselineskip! insertion before and after it. %  % \begin{macrocode} \def\pcol@bg@paint@i#1{% \setbox\@tempboxa\vtop{\vskip\z@ \global\pcol@bg@paintedfalse \let\pcol@bg@leftmargin\pcol@lrmargin \pagerim-\pagerim \advance\pcol@bg@to\m@ne \offinterlineskip #1}% \ht\@tempboxa\z@ \dp\@tempboxa\z@ \wd\@tempboxa\z@ \ifpcol@bg@painted \nointerlineskip \box\@tempboxa \nointerlineskip \fi} % \end{macrocode} % \end{macro} %  % \begin{macro}{\pcol@bg@paint@ii} % \changes{v1.3-3}{2013/09/17} % {Introduced for background painting.} %  % The macro $\!\pcol@bg@paint@ii!\Arg{A_b}\Arg{A_g}\Arg{A_c}$ appears only % in the argument of \!\pcol@bg@paint@i! used in % \!\pcol@bg@@paintpage!, \!\pcol@bg@@paintcolumns! and % \!\pcol@bg@@paintbox! to paint \bground{}s of regions $\bgr_a$ for % $a\in{}A_b\subseteq\{T,B,L,R,S,F,N,P,t,b,l,r,s,f,n,p\}$, $\bgr_a^c$ for % $a\in{}A_g\subseteq\{G,g\}$ and $c\In\CBfrom{\Cto{-}1}$, and $\bgr_a^c$ for % $a\in A_c\subseteq\{C,c\}$ and $c\In\CBfrom\CBto$. % % First we invoke \!\pcol@bg@swappage! with \CSIndex{ifpcol@bg@swap} to % let \!\pcol@bg@left~margin! and \CSIndex{ifpcol@bg@@swap} have values % according to \CSIndex{ifpcol@bg@swap}, \CSIndex{if@twoside} and the parity % of $\page(p)$. Then we invoke $\!\pcol@bg@paintregion!\arg{a}\arg{c}$ for % all $a\in A_b$ and $c=-1$ to paint the \bground{} of $\bgr_a$. Second, we % invoke \!\pcol@bg@swappage! again but with \CSIndex{ifpcol@swapcolumn} % instead of \CSIndex{ifpcol@bg@swap}, and \!\pcol@bg@paintregion! as well % but for $a\in\{A_g,A_c\}$ and $c\In\CBfrom{\CBto{-}1}$. Third and % finally, we make yet another invocation of \!\pcol@bg@paintregion! for % $a\in A_c$ and $c=\CBto-1$. %  % \begin{macrocode} \def\pcol@bg@paint@ii#1#2#3{% \pcol@bg@swappage\ifpcol@bg@swap\fi \@tfor\reserved@b:=#1\do{\pcol@bg@paintregion\reserved@b\m@ne}% \pcol@bg@swappage\ifpcol@swapcolumn\fi \@tfor\reserved@b:=#2#3\do{% \pcol@currcol\pcol@bg@from \@whilenum\pcol@currcol<\pcol@bg@to\do{% \pcol@bg@paintregion\reserved@b\pcol@currcol \advance\pcol@currcol\@ne}}% \@tfor\reserved@b:=#3\do{\pcol@bg@paintregion\reserved@b\pcol@currcol}} % \end{macrocode} % \end{macro} %  % \begin{macro}{\pcol@bg@swappage} % \changes{v1.3-3}{2013/09/17} % {Introduced for background painting.} %  % The macro $\!\pcol@bg@swappage!\arg{if}\cs{fi}$ is used solely in % \!\pcol@bg@paint@ii! but twice with $\arg{if}=\CSIndex{ifpcol@bg@swap}$ % and then with $\arg{if}=\CSIndex{ifpcol@swapcolumn}$, to let % \!\pcol@bg@leftmargin! and \CSIndex{ifpcol@bg@@swap} have values for % \mirror{}ing according to the truth values of $\arg{if}$ and % \CSIndex{if@twoside} and the parity of $\page(p)$ of the page $p$ for % which \bgpaint{} is taking place. That is, they are let have the values % as follows. %  % \begin{eqnarray*} % W&=&\cases{\CSIndex{oddsidemargin}& % $\page(p)\bmod2=1\;\lor\CSIndex{if@twoside}=\false$\cr % \CSIndex{evensidemargin}& % $\page(p)\bmod2=0\;\land\CSIndex{if@twoside}=\true$}\\ % \rlap{$\displaystyle(\!\pcol@bg@leftmargin!,\CSIndex{ifpcol@bg@@swap})$} % \phantom{W}\\ % &=&\cases{(W,\;\false)&$\page(p)\bmod2=1\lor\;\arg{if}=\false$\cr % (\WP-(W+\WT+2\,|in|),\;\true)& % $\page(p)\bmod2=\land\;\arg{if}=\true$} % \end{eqnarray*} %  % Note that $\WP-(W+\WT+2\,|in|)$ means the right margin width minus 1\,|in| % with given left margin width $W$, and thus % $\WM=\!\pcol@bg@leftmargin!+1\,|in|$ gives us the right margin width we % need in \mirror{}ed \bgpaint. %  % \begin{macrocode} \def\pcol@bg@swappage#1#2{% \pcol@bg@leftmargin\oddsidemargin \pcol@bg@@swapfalse \ifodd\c@page\else \if@twoside \pcol@bg@leftmargin\evensidemargin \fi #1% \ifpcol@{bg@swap,swapcolumn} \pcol@bg@@swaptrue \advance\pcol@bg@leftmargin\textwidth \advance\pcol@bg@leftmargin2in \advance\pcol@bg@leftmargin-\paperwidth \pcol@bg@leftmargin-\pcol@bg@leftmargin #2% \fi \fi} % \end{macrocode} % \end{macro} %  % \begin{macro}{\pcol@bg@paintregion} % \changes{v1.3-3}{2013/09/17} % {Introduced for background painting.} % \begin{macro}{\pcol@bg@paintregion@i} % \changes{v1.3-3}{2013/09/17} % {Introduced for background painting.} %  % The macro $\!\pcol@bg@paintregion!\arg{a}\arg{c}$ is used only in % $\!\pcol@bg@paint@ii!\Arg{A_b}\Arg{A_g}\Arg{A_c}$ but as many times as % $\Abs{A_b}+\Abs{A_g}(\CBto-\CBfrom-1)+\Abs{A_c}(\CBto-\CBfrom)$ to paint % \bground{} region $\bgr_a^{[c]}$ specified by $|\pcol@bg@@|{\cdot}a$ %  % \SpecialArrayIndex{a}{\pcol@bg@@} %  % with color $\bgc_a^c=|\pcol@bg@color@|{\cdot}a{\cdot}|@|{\cdot}c$ %  % \SpecialArrayIndex{a{\cdot}\string\texttt{@}{\cdot}c}{\pcol@bg@color@} %  % or, if it is undefined, $\bgc_a=|\pcol@bg@color@|{\cdot}a$. %  % \SpecialArrayIndex{a}{\pcol@bg@color@} % % If $\bgr_a^c$ or $\bgr_a$ is defined, the painted \bground{} is built in % \!\@tempboxa! with \!\vtop! having null vertical skip at its top and by % $\!\pcol@bg@paintregion@i!\Arg{F_x}\Arg{F_y}\Arg{F_w}\Arg{F_h}$ where % the arguments are defined in the body of the macro $|\pcol@bg@@|{\cdot}a$ %  % \SpecialArrayIndex{a}{\pcol@bg@@} %  % and thus we need triple \!\expandafter! to give them to the macro. Prior % to the invocation of the macro, we let $\!\reserved@a!=a'$ have % $a{\cdot}|@|{\cdot}c$ if $\bgc_a^c$ is defined for $a\in\{G,C,g,c\}$, or % $a$ otherwise definitely for $a\notin\{G,C,g,c\}$. % % Then \!\pcol@bg@paintregion@i! calculates $x_0=\!\@tempdima!$, % $y_0=\!\@tempdimb!$, $x_1=\!\@tempdimc!$ and $y_1=\!\dimen@!$ of the % region $\bgr_a^{[c]}$ by $\!\pcol@bg@calculate!\arg{z}\arg{z_0}\Arg{F}$ % giving it % $(z,z_0,F)\in\{(x_0,0,F_x),(y_0,0,F_y),(x_1,x_0,F_w),(y_1,y_0,F_h)\}$, % where $(x_0,y_0)$ and $(x_1,y_1)$ is the left-top and right-bottom corner % of the painting region in the text-area coordinate, i.e., left-right and % top-down coordinate whose origin is at the left-top corner of the leftmost % column. Next we modify $\{x,y\}_{\{0,1\}}$ for \bgext{} by % $\!\pcol@bg@addext!\arg{z}\Arg{s}\Arg{d}$ with $(z,s,d)\in % \{(x_0,\hbox{`|-|'},|l|),(y_0,\hbox{`|-|'},|t|), % (x_1,\emptyset,|r|),\~(y_1,\emptyset,|b|)\}$. % % Now we have $[(x_0,y_0)(x_1,y_1)]$ and thus, if not \mirror{}ed, we place % $\bgr_a^{[c]}$ at $(x_0,y_0)$ by a vertical skip of $y_0$ and shifting a % \!\hbox! for the region right by $x_0$ by \!\moveright!, and paint the box % putting a \!\vrule! of $(x_1-x_0)$ wide and $(y_1-y_0)$ tall, letting % \!\current@color! have $\bgc_r^{[c]}=|\pcol@bg@colr|{\cdot}a'$ and then % invoking \!\pcol@set@color! being the original definition of % \!\set@color!. %  % \SpecialArrayIndex{a{\cdot}\string\texttt{@}{\cdot}c}{\pcol@bg@color@} % \SpecialArrayIndex{a}{\pcol@bg@color@} %  % On the other hand if \mirror{}ing is to be done, the region should be % $[(\WT{-}x_1,y_0)(\WT{-}x_0,y_1)]$ and thus the shift amount for % \!\moveright! of the \!\hbox! is $(\WT-x_1)$. % % Then after \!\pcol@bg@paintregion@i! finishes its work, % \!\pcol@bg@paintregion! lets the switch % \CSIndex{ifpcol@bg@painted}${}=\true$ because we painted $\bgr_a^{[c]}$, % lets the height, depth and width of \!\@tempboxa! be 0 to make it a % phantom, and then put it into the outside box opened by % \!\pcol@bg@paint@i!. On the other hand, if neither $\bgc_r^c$ nor % $\bgc_r$ defined to mean the \bgpaint{} of the region is not specified, we % do nothing. %  % \begin{macrocode} \def\pcol@bg@paintregion#1#2{% \@ifundefined{pcol@bg@color@#1@\number#2}% {\def\reserved@a{#1}}{\edef\reserved@a{#1@\number#2}}% \@ifundefined{pcol@bg@color@\reserved@a}\relax {\setbox\@tempboxa\vtop{\vskip\z@ \expandafter\expandafter\expandafter \pcol@bg@paintregion@i\csname pcol@bg@@#1\endcsname}% \global\pcol@bg@paintedtrue \ht\@tempboxa\z@ \dp\@tempboxa\z@ \wd\@tempboxa\z@ \box\@tempboxa}} \def\pcol@bg@paintregion@i#1#2#3#4{% \pcol@bg@calculate\@tempdima\z@{#1}% \pcol@bg@calculate\@tempdimb\z@{#2}% \pcol@bg@calculate\@tempdimc\@tempdima{#3}% \pcol@bg@calculate\dimen@\@tempdimb{#4}% \pcol@bg@addext\@tempdima{-}{l}\pcol@bg@addext\@tempdimc{}{r}% \pcol@bg@addext\@tempdimb{-}{t}\pcol@bg@addext\dimen@{}{b}% \vskip\@tempdimb \ifpcol@bg@@swap \advance\@tempdima-\@tempdimc \@tempdima-\@tempdima \advance\@tempdimc-\textwidth \@tempdimc-\@tempdimc \moveright\@tempdimc\hbox{% \advance\dimen@-\@tempdimb \edef\current@color{\@nameuse{pcol@bg@color@\reserved@a}}\pcol@set@color \vrule\@width\@tempdima\@height\dimen@}% \else \moveright\@tempdima\hbox{% \advance\@tempdimc-\@tempdima \advance\dimen@-\@tempdimb \edef\current@color{\@nameuse{pcol@bg@color@\reserved@a}}\pcol@set@color \vrule\@width\@tempdimc\@height\dimen@}% \fi} % \end{macrocode} % \end{macro}\end{macro} % % \KeepSpace{3} % \begin{macro}{\pcol@bg@calculate} % \changes{v1.3-3}{2013/09/17} % {Introduced for background painting.} % \begin{macro}{\pcol@bg@advance} % \changes{v1.3-3}{2013/09/17} % {Introduced for background painting.} % \begin{macro}{\pcol@bg@negative} % \changes{v1.3-3}{2013/09/17} % {Introduced for background painting.} % \begin{macro}{\pcol@bg@nadvance} % \changes{v1.3-3}{2013/09/17} % {Introduced for background painting.} % \begin{macro}{\pcol@bg@dimen} % \changes{v1.3-3}{2013/09/17} % {Introduced for background painting.} %  % The macro $\!\pcol@bg@calculate!\arg{z}\arg{z_0}\arg{F}$ is used in % \!\pcol@bg@paintregion@i! and \!\pcol@bg@addext! to accumulate dimensional % values specified in $F$ into a \!\dimen! register $z$ with initial value % $z_0$. The specification $F$ is a sequence of $\!\@elt!\Arg{f}$ to add $f$ % to $z$, $\!\pcol@bg@negative!\Arg{F^-}$ to subtract the amount specified % by $F^-$ from $z$, or macros expanded to either of them. % % The macro makes \!\pcol@bg@dimen! \!\let!-equal to $z$ and \!\@elt! to % \!\pcol@bg@advance!, lets $z=z_0$, and then does what is specified in $F$\@. % Therefore, $\!\@elt!\arg{f}$ appearing directly or indirectly in $F$ does % $\!\advance!\arg{z}\arg{f}$ for the accumulation. On the other hand, % \!\pcol@bg@negative! makes \!\@elt! \!\let!-equal to \!\pcol@bg@nadvance! % to let $\!\@elt!\arg{f}$ do $\!\advance!\arg{z}{-}\arg{f}$ for % subtraction, does $F^-$, and then remake $\!\@elt!=\!\pcol@bg@advance!$. % Note that $f$ may be expanded to a negative amount having `|-|' its % beginning to results in $\!\@elt!\arg{f}$ expanded to % $\!\advance!\arg{z}{-}{-}\arg{f'}$ with some positive amount $f'$, but % this double negation is legitimate in \TeX{} and is equivalent to % $\!\advance!\arg{z}\arg{f'}$. The macro \!\pcol@bg@negative! is used in % the following macros. %  % \begin{quote}\raggedright % \!\pcol@bg@ext@inf@l!, % \!\pcol@bg@ext@inf@r!, % \!\pcol@bg@ext@inf@t!, % \!\pcol@bg@@t!, % \!\pcol@bg@@b!, % \!\pcol@bg@@l!, % \!\pcol@bg@@r!, % \!\pcol@bg@@n!, % \!\pcol@bg@@p!. % \end{quote} %  % \begin{macrocode} \def\pcol@bg@calculate#1#2#3{\let\pcol@bg@dimen#1\relax \let\@elt\pcol@bg@advance \pcol@bg@dimen#2\relax #3} \def\pcol@bg@negative#1{\let\@elt\pcol@bg@nadvance #1\relax \let\@elt\pcol@bg@advance} \def\pcol@bg@advance#1{\advance\pcol@bg@dimen#1\relax} \def\pcol@bg@nadvance#1{\advance\pcol@bg@dimen-#1\relax} % \end{macrocode} % \end{macro}\end{macro}\end{macro}\end{macro}\end{macro} % % \KeepSpace{3} % \begin{macro}{\pcol@bg@addext} % \changes{v1.3-3}{2013/09/17} % {Introduced for background painting.} % \begin{macro}{\pcol@bg@ext@inf@l} % \changes{v1.3-3}{2013/09/17} % {Introduced for background painting.} % \begin{macro}{\pcol@bg@ext@inf@r} % \changes{v1.3-3}{2013/09/17} % {Introduced for background painting.} % \begin{macro}{\pcol@bg@ext@inf@t} % \changes{v1.3-3}{2013/09/17} % {Introduced for background painting.} % \begin{macro}{\pcol@bg@ext@inf@b} % \changes{v1.3-3}{2013/09/17} % {Introduced for background painting.} %  % The macro $\!\pcol@bg@addext!\arg{z}\Arg{s}\Arg{d}$ is used only in % \!\pcol@bg@paintregion@i! but four times with $(z,s,d)\in % \{(x_0,\hbox{`|-|'},|l|),(y_0,\hbox{`|-|'},|t|), % (x_1,\emptyset,|r|),\~(y_1,\emptyset,|b|)\}$, to perform \bgext{} on a % \!\dimen! register $z$. % % First the macro gets $e=|\pcol@bg@ext@|{\cdot}d{\cdot}|@|{\cdot}a' % \in e_a^{[c]}(\{x,y\}^{\{{+},{-}\}})$ %  % \SpecialArrayIndex{d{\cdot}\string\texttt{@} % {\cdot}a{\cdot}\string\texttt{@}{\cdot}c}{\pcol@bg@ext@} % \SpecialArrayIndex{d{\cdot}\string\texttt{@}{\cdot}a}{\pcol@bg@ext@} %  % where $a'=\!\reserved@a!\~\in\{a{\cdot}|@|{\cdot}c,a\}$. Then if % $e<9000\PT$ being a finite \bgext, we let $z\gets z\pm e$ % according to $s$, i.e. $+$ if $s=\emptyset$ while $-$ if $s={}$`|-|'. % Otherwise, i.e., $e\geq9000\PT$ for a infinite \bgext, let $e'$ % be the value shown below by invoking $|\pcol@bg@ext@inf@|{\cdot}d$ %  % \SpecialArrayMainIndex{d}{\pcol@bg@ext@inf@} % $$ % e'=\cases{-(\WM-\WR)&$d=|l|$\cr % \WP-(\WM-\WR)&$d=|r|$\cr % -(\HM-\HR)&$d=|t|$\cr % \HP-(\HM-\HR)&$d=|b|$\cr} % $$ % where $\WM-\WR$ is specified by \!\pcol@bg@pageleft! and $\HM-\HR$ by % \!\pcol@bg@pagetop!. Then we let $z=e'\pm(e-10000\PT)$ according to $s$ % again, i.e., move $z$ {\em inside\/} by $(10000\PT-e)$ from $e'$. %  % \begin{macrocode} \def\pcol@bg@addext#1#2#3{% \dimen@ii\@nameuse{pcol@bg@ext@#3@\reserved@a}\relax \ifdim\dimen@ii<9000\p@\relax \advance#1#2\dimen@ii \else \pcol@bg@calculate#1\z@{\@nameuse{pcol@bg@ext@inf@#3}}% \advance\dimen@ii-\@M\p@ \advance#1#2\dimen@ii \fi} \def\pcol@bg@ext@inf@l{\pcol@bg@negative\pcol@bg@pageleft} \def\pcol@bg@ext@inf@r{\pcol@bg@negative\pcol@bg@pageleft \pcol@bg@paperwidth} \def\pcol@bg@ext@inf@t{\pcol@bg@negative\pcol@bg@pagetop} \def\pcol@bg@ext@inf@b{\pcol@bg@negative\pcol@bg@pagetop \pcol@bg@paperheight} % \end{macrocode} % \end{macro}\end{macro}\end{macro}\end{macro}\end{macro} % % \KeepSpace{7} % \begin{macro}{\pcol@bg@paperwidth} % \changes{v1.3-3}{2013/09/17} % {Introduced for background painting.} % \begin{macro}{\pcol@bg@paperheight} % \changes{v1.3-3}{2013/09/17} % {Introduced for background painting.} % \begin{macro}{\pcol@bg@pageleft} % \changes{v1.3-3}{2013/09/17} % {Introduced for background painting.} % \begin{macro}{\pcol@bg@pagetop} % \changes{v1.3-3}{2013/09/17} % {Introduced for background painting.} % \begin{macro}{\pcol@bg@textheight} % \changes{v1.3-3}{2013/09/17} % {Introduced for background painting.} % \begin{macro}{\pcol@bg@columnleft} % \changes{v1.3-3}{2013/09/17} % {Introduced for background painting.} % \begin{macro}{\pcol@bg@columnright} % \changes{v1.3-3}{2013/09/17} % {Introduced for background painting.} % \begin{macro}{\pcol@bg@columnwidth} % \changes{v1.3-3}{2013/09/17} % {Introduced for background painting.} % \begin{macro}{\pcol@bg@columnsep} % \changes{v1.3-3}{2013/09/17} % {Introduced for background painting.} %  % The following macros specify the whole or a part of % $F\in\{F_x,F_y,F_w,F_h\}$ being the body of $|\pcol@bg@@|{\cdot}a$ for % \bgpaint{} regions $\bgr_a^{[c]}$. %  % \begin{eqnarray*} % \!\pcol@bg@paperwidth!&=& \WP-2\WR=\!\paperwidth!-2\!\pagerim! % \quad(t,T,b,B,r,R)\\ % \!\pcol@bg@paperheight!&=& \HP-2\HR=\!\paperheight!-2\!\pagerim! % \quad(b,B)\\ % \!\pcol@bg@pageleft!&=& \WM-\WR= % (\!\pcol@bg@leftmargin!+1\,|in|)-\!\pagerim!\\ % & \rlap{$(t,T,b,B,l,L,r,R)$}\\ % \!\pcol@bg@pagetop!&=& \HM-\WR\\ % &=&(\!\topmargin!+\!\headheight!+\!\headsep!+1\,|in|)-\!\pagerim!\\ % & \rlap{$(t,T,b,B)$}\\ % \!\pcol@bg@textheight!&=& \HT=\!\textheight!+\!\@maxdepth!\\ % & \rlap{$(b,B,l,L,r,R,C,G,n,N,p,P)$}\\ % \!\pcol@bg@columnleft!&=& \W_c=\sum_{d=\CBfrom}^{c-1}(w_c+g_c) % \quad(c,C)\\ % \!\pcol@bg@columnright!&=& \W_c+w_c= % \!\pcol@bg@columnleft!+\!\pcol@bg@columnwidth!\\ % & \rlap{$(g,G)$}\\ % \!\pcol@bg@columnwidth!&=& w_c=|\pcol@columnwidth|{\cdot}c % \quad(c,C)\\ % \!\pcol@bg@columnsep!&=& g_c=|\pcol@columnsep|{\cdot}c % \quad(g,G) % \end{eqnarray*} %  % \SpecialArrayIndex{c}{\pcol@columnwidth} % \SpecialArrayIndex{c}{\pcol@columnsep} %  % Note that \!\pagerim! in $F$ means $-\!\pagerim!$ because its sign is % reversed by \!\pcol@bg@paint@i!. The macros are used in % $|\pcol@bg@@|{\cdot}a$ %  % \SpecialArrayIndex{a}{\pcol@bg@@} %  % whose region identifier $a$ is shown in parentheses above, but besides them % \!\pcol@bg@paperwidth! is also used in \!\pcol@bg@ext@inf@r!, % \!\pcol@bg@paperheight! in \!\pcol@bg@ext@inf@b!, \!\pcol@bg@pageleft! in % \!\pcol@bg@ext@inf@l! and \!\pcol@bg@ext@inf@r!, and \!\pcol@bg@pagetop! % in \!\pcol@bg@ext@inf@t! and \!\pcol@bg@ext@inf@b!. Also note that % \!\pcol@bg@textheight! is used in \!\pcol@output@clear! while it is % temporarily redefined in \!\pcol@output@start! and \!\pcol@output@end!. % % \begin{macrocode} \def\pcol@bg@paperwidth{\@elt\paperwidth \@elt{2\pagerim}} \def\pcol@bg@paperheight{\@elt\paperheight \@elt{2\pagerim}} \def\pcol@bg@pageleft{\@elt{1in}\@elt\pcol@bg@leftmargin \@elt\pagerim} \def\pcol@bg@pagetop{\@elt{1in}\@elt\topmargin \@elt\headheight \@elt\headsep \@elt\pagerim} \def\pcol@bg@textheight{\@elt\textheight \@elt\@maxdepth} \def\pcol@bg@columnleft{% \@tempcnta\pcol@bg@from \@whilenum\@tempcnta<\pcol@currcol\do{% \@elt{\@nameuse{pcol@columnwidth\number\@tempcnta}}% \@elt{\@nameuse{pcol@columnsep\number\@tempcnta}}% \advance\@tempcnta\@ne}} \def\pcol@bg@columnright{\pcol@bg@columnleft \pcol@bg@columnwidth} \def\pcol@bg@columnwidth{\@elt{\@nameuse{pcol@columnwidth\number\pcol@currcol}}} \def\pcol@bg@columnsep{\@elt{\@nameuse{pcol@columnsep\number\pcol@currcol}}} % \end{macrocode} % \end{macro}\end{macro}\end{macro}\end{macro}\end{macro} % \end{macro}\end{macro}\end{macro}\end{macro} %  % \KeepSpace{7} % \begin{macro}{\pcol@bg@preposttop} % \changes{v1.3-3}{2013/09/17} % {Introduced for background painting.} % \begin{macro}{\pcol@bg@preposttop@left} % \changes{v1.3-3}{2013/09/17} % {Introduced for background painting.} % \begin{macro}{\pcol@bg@preposttop@right} % \changes{v1.3-3}{2013/09/17} % {Introduced for background painting.} % \begin{macro}{\pcol@bg@columntop} % \changes{v1.3-3}{2013/09/17} % {Introduced for background painting.} % \begin{macro}{\pcol@bg@columnheight} % \changes{v1.3-3}{2013/09/17} % {Introduced for background painting.} % \begin{macro}{\pcol@bg@floatheight} % \changes{v1.3-3}{2013/09/17} % {Introduced for background painting.} % \begin{macro}{\pcol@bg@footnoteheight} % \changes{v1.3-3}{2013/09/17} % {Introduced for background painting.} % \begin{macro}{\pcol@bg@spanningtop} % \changes{v1.3-3}{2013/09/17} % {Introduced for background painting.} % \begin{macro}{\pcol@bg@spanningheight} % \changes{v1.3-3}{2013/09/17} % {Introduced for background painting.} %  % Besides the macros shown above, $|\pcol@bg@@|{\cdot}a$ uses the following % macros defined by macros using \!\pcol@bg@paintpage!, % \!\pcol@bg@paintcolumns! or \!\pcol@bg@paintbox!. %  % \begin{itemize} % \item % \!\pcol@bg@preposttop! being \!\pcol@bg@preposttop@left! or % \!\pcol@bg@preposttop@right! for $a\in\{p,P\}$ by \!\@outputpage! and % \!\pcol@output@end!, the latter of which may define only the left one if % the closing environment is not \parapag{}ed. That is, both of left and % right macros are usually equivalent, but the right one can be smaller than % the left if we have two or more (\lpage{}s of) \env{paracol} environments % in a page and the closing environment is not \parapag{}ed while some % others are. In such case, \!\@outputpage! or \!\pcol@output@start!, % another macro referring to them, must paint the region below % \!\pcol@bg@preposttop@right! in the right page as a part of \preenv{} or % \postenv{} by \!\let!ting \!\pcol@bg@preposttop! be % \!\pcol@bg@preposttop@left! and \!\pcol@bg@preposttop@right! for the left % and right \parapag{}es respectively. Both macros have common initial % value 0. % % \item % \!\pcol@bg@columntop! and \!\pcol@bg@columnheight! for $a\in\{c,g\}$ by % \!\pcol@build~col~sep~rule! and \!\pcol@buildcselt!. % % \item % \!\pcol@bg@spanningtop! and \!\pcol@bg@spanningheight! for $a\in\{s,S\}$ by % \!\pcol@buildcselt!. % % \item % \!\pcol@bg@floatheight! for $a\in\{f,F\}$ by \!\pcol@outputelt!, % \!\pcol@ioutputelt!, \!\pcol@output@clear! and \!\pcol@makeflushedpage! % % \item % \!\pcol@bg@footnoteheight! for $a\in\{n,N\}$ by \!\pcol@ioutputelt!, % \!\pcol@imakeflushed~page! and \!\pcol@output@end!. % \end{itemize} % % \begin{macrocode} \def\pcol@bg@preposttop@left{0pt} \let\pcol@bg@preposttop@right\pcol@bg@preposttop@left % \end{macrocode} % \end{macro}\end{macro}\end{macro}\end{macro}\end{macro} % \end{macro}\end{macro}\end{macro}\end{macro} % % \KeepSpace{18} % \begin{macro}{\pcol@bg@@c} % \changes{v1.3-3}{2013/09/17}{Introduced for background painting.} % \begin{macro}{\pcol@bg@@C} % \changes{v1.3-3}{2013/09/17}{Introduced for background painting.} % \begin{macro}{\pcol@bg@@g} % \changes{v1.3-3}{2013/09/17}{Introduced for background painting.} % \begin{macro}{\pcol@bg@@G} % \changes{v1.3-3}{2013/09/17}{Introduced for background painting.} % \begin{macro}{\pcol@bg@@s} % \changes{v1.3-3}{2013/09/17}{Introduced for background painting.} % \begin{macro}{\pcol@bg@@S} % \changes{v1.3-3}{2013/09/17}{Introduced for background painting.} % \begin{macro}{\pcol@bg@@t} % \changes{v1.3-3}{2013/09/17}{Introduced for background painting.} % \begin{macro}{\pcol@bg@@T} % \changes{v1.3-3}{2013/09/17}{Introduced for background painting.} % \begin{macro}{\pcol@bg@@b} % \changes{v1.3-3}{2013/09/17}{Introduced for background painting.} % \begin{macro}{\pcol@bg@@B} % \changes{v1.3-3}{2013/09/17}{Introduced for background painting.} % \begin{macro}{\pcol@bg@@l} % \changes{v1.3-3}{2013/09/17}{Introduced for background painting.} % \begin{macro}{\pcol@bg@@L} % \changes{v1.3-3}{2013/09/17}{Introduced for background painting.} % \begin{macro}{\pcol@bg@@r} % \changes{v1.3-3}{2013/09/17}{Introduced for background painting.} % \begin{macro}{\pcol@bg@@R} % \changes{v1.3-3}{2013/09/17}{Introduced for background painting.} % \begin{macro}{\pcol@bg@@f} % \changes{v1.3-3}{2013/09/17}{Introduced for background painting.} % \begin{macro}{\pcol@bg@@F} % \changes{v1.3-3}{2013/09/17}{Introduced for background painting.} % \begin{macro}{\pcol@bg@@n} % \changes{v1.3-3}{2013/09/17}{Introduced for background painting.} % \begin{macro}{\pcol@bg@@N} % \changes{v1.3-3}{2013/09/17}{Introduced for background painting.} % \begin{macro}{\pcol@bg@@p} % \changes{v1.3-3}{2013/09/17}{Introduced for background painting.} % \begin{macro}{\pcol@bg@@P} % \changes{v1.3-3}{2013/09/17}{Introduced for background painting.} %  % The macros $|\pcol@bg@@|{\cdot}a$ %  % \SpecialArrayMainIndex{a}{\pcol@bg@@} %  % define arguments $F_x$, $F_y$, $F_w$ and $F_h$ to be passed to % \!\pcol@bg@paintregion@i! in their bodies to calculate $(x_0,y_0)$ and % $(x_1{-}x_0,y_1{-}y_0)$ for regions $\bgr_a^{[c]}$ as shown below in the % form of $(x_0,y_0)+(x_1{-}x_0,y_1{-}y_0)$ (to have $(x_1,y_1)$), where % $H^c=\!\pcol@bg@columntop!$, $h^c=\!\pcol@bg@columnheight!$, % $H^s=\!\pcol@bg@spanningtop!$, $h^s=\!\pcol@bg@spanningheight!$, % $h^f=\!\pcol@bg@floatheight!$, $h^n=\!\pcol@bg@footnoteheight!$ and % $H^p=\!\pcol@bg@preposttop!$ calculated by macros which invoke \bgpaint{} % macros, while $s^n=\!\skip!\!\footins!$. %  % \begin{eqnarray*} % \bgr_c^c&\;:\;&(\W_c\;,\;H^c)\ +\ (w_c\;,\;h^c)\\ % \bgr_C^c&:&(\W_c\;,\;0)\ +\ (w_c\;,\;\HT)\\ % \bgr_g^c&:&((\W_c+w_c)\;,\;H^c)\ +\ (g_c\;,\;h^c)\\ % \bgr_G^c&:&((\W_c+w_c)\;,\;0)\ +\ (g_c\;,\;\HT)\\ % \bgr_{\{s,S\}}&:&(0\;,\;H^s)\ +\ (\WT\;,\;h^s)\\ % \bgr_{\{t,T\}}&:&(-(\WM-\WR)\;,\;-(\HM-\HR))\ +\ ((\WP-2\WR)\;,\;\HM-\HR)\\ % \bgr_{\{b,B\}}&:&(-(\WM-\WR)\;,\;\HT)\ +\ % ((\WP-2\WR)\;,\;(\HP-2\HR)-((\HM-\HR)+\HT))\\ % \bgr_{\{l,L\}}&:&(-(\WM-\WR)\;,\;0)\ +\ ((\WM-\WR)\;,\;\HT)\\ % \bgr_{\{r,R\}}&:&(\WT\;,\;0)\ +\ ((\WP-2\WR)-((\WM-\WR)+\WT)\;,\;\HT)\\ % \bgr_{\{f,F\}}&:&(0\;,\;0)\ +\ (\WT\;,\;h^f)\\ % \bgr_{\{n,N\}}&:&(0\;,\;\HT-(h^n+s^n))\ +\ (\WT\;,\;h^n+s^n)\\ % \bgr_{\{p,P\}}&:&(0\;,\;H^p)\ +\ (\WT\;,\;\HT-H^p) % \end{eqnarray*} %  % \begin{macrocode} \def\pcol@bg@@c{% {\pcol@bg@columnleft}% {\@elt\pcol@bg@columntop}% {\pcol@bg@columnwidth}% {\pcol@bg@columnheight}} \def\pcol@bg@@C{% {\pcol@bg@columnleft}% {}% {\pcol@bg@columnwidth}% {\pcol@bg@textheight}} \def\pcol@bg@@g{% {\pcol@bg@columnright}% {\@elt\pcol@bg@columntop}% {\pcol@bg@columnsep}% {\pcol@bg@columnheight}} \def\pcol@bg@@G{% {\pcol@bg@columnright}% {}% {\pcol@bg@columnsep}% {\pcol@bg@textheight}} \def\pcol@bg@@s{% {}% {\pcol@bg@spanningtop}% {\@elt\textwidth}% {\pcol@bg@spanningheight}} \def\pcol@bg@@t{% {\pcol@bg@negative\pcol@bg@pageleft}% {\pcol@bg@negative\pcol@bg@pagetop}% {\pcol@bg@paperwidth}% {\pcol@bg@pagetop}} \def\pcol@bg@@b{% {\pcol@bg@negative\pcol@bg@pageleft}% {\pcol@bg@textheight}% {\pcol@bg@paperwidth}% {\pcol@bg@paperheight \pcol@bg@negative{\pcol@bg@pagetop \pcol@bg@textheight}}} \def\pcol@bg@@l{% {\pcol@bg@negative\pcol@bg@pageleft}% {}% {\pcol@bg@pageleft}% {\pcol@bg@textheight}} \def\pcol@bg@@r{% {\@elt\textwidth}% {}% {\pcol@bg@paperwidth \pcol@bg@negative{\pcol@bg@pageleft \@elt\textwidth}}% {\pcol@bg@textheight}} \def\pcol@bg@@f{% {}% {}% {\@elt\textwidth}% {\pcol@bg@floatheight}} \def\pcol@bg@@n{% {}% {\pcol@bg@textheight \pcol@bg@negative{\pcol@bg@footnoteheight \@elt{\skip\footins}}}% {\@elt\textwidth}% {\pcol@bg@footnoteheight \@elt{\skip\footins}}} \def\pcol@bg@@p{% {}% {\@elt\pcol@bg@preposttop}% {\@elt\textwidth}% {\pcol@bg@textheight \pcol@bg@negative{\@elt\pcol@bg@preposttop}}} \let\pcol@bg@@S\pcol@bg@@s \let\pcol@bg@@T\pcol@bg@@t \let\pcol@bg@@B\pcol@bg@@b \let\pcol@bg@@L\pcol@bg@@l \let\pcol@bg@@R\pcol@bg@@r \let\pcol@bg@@F\pcol@bg@@f \let\pcol@bg@@N\pcol@bg@@n \let\pcol@bg@@P\pcol@bg@@p % \end{macrocode} % \end{macro}\end{macro}\end{macro}\end{macro}\end{macro} % \end{macro}\end{macro}\end{macro}\end{macro}\end{macro} % \end{macro}\end{macro}\end{macro}\end{macro}\end{macro} % \end{macro}\end{macro}\end{macro}\end{macro}\end{macro} % % % % \KeepSpace{10} % \section{Special Output Routines} % \label{sec:imp-sout} % % \subsection{Dispatcher} % \label{sec:imp-sout-disp} % % \changes{v1.22}{2013/06/30} % {\cs{pcol@op@cpush} was introduced for output request to push color % stack but removed in v1.34.} % \changes{v1.34}{2018/05/07} % {\cs{pcol@op@cpush} is removed according to the change of text % coloring from \cs{output} to \cs{insert}.} % \changes{v1.22}{2013/06/30} % {\cs{pcol@op@cpop} was introduced for output request to pop color % stack but removed in v1.34.} % \changes{v1.34}{2018/05/07} % {\cs{pcol@op@cpop} is removed according to the change of text % coloring from \cs{output} to \cs{insert}.} % \changes{v1.22}{2013/06/30} % {\cs{pcol@op@cset} was introduced for output request to set % $\gamma_0^c$ but removed in v1.34} % \changes{v1.34}{2018/05/07} % {\cs{pcol@op@cpop} is removed according to the change of text % coloring from \cs{output} to \cs{insert}.} % % \begin{macro}{\pcol@op@start} % \begin{macro}{\pcol@op@switch} % \begin{macro}{\pcol@op@flush} % \begin{macro}{\pcol@op@clear} % \begin{macro}{\pcol@op@end} %  % The macro $|\pcol@op@|{\cdot}f$ where $f\in % F=\{|start|,|switch|,|flush|,|clear|,|end|\}$ has % our own \!\outputpenalty! code less than $-10000$ to invoke the % corresponding macro $|\pcol@output@|{\cdot}f$. The code macros are given % to \!\pcol@invokeoutput! as its argument by \!\pcol@zparacol! ($f=|start|$), % \!\pcol@switchcol! ($f=|switch|$), \!\pcol@visitallcols! ($f=|switch|$), % \!\pcol@com@flushpage! ($f=|flush|$), \!\pcol@com@clearpage! % ($f=|clear|$), \!\pcol@flushclear! ($f=|switch|$), and \!\endparacol! % ($f=|end|$) to set one of them into \!\outputpenalty!, so that the other % user \!\pcol@specialoutput! examines which special function is invoked. %  % \SpecialIndex{\pcol@output@start} % \SpecialIndex{\pcol@output@switch} % \SpecialIndex{\pcol@output@flush} % \SpecialIndex{\pcol@output@clear} % \SpecialIndex{\pcol@output@end} %  % \begin{macrocode} %% Special Output Routines: Dispatcher \def\pcol@op@start{-10010} \def\pcol@op@switch{-10011} \def\pcol@op@flush{-10012} \def\pcol@op@clear{-10013} \def\pcol@op@end{-10014} % \end{macrocode} % \end{macro}\end{macro}\end{macro}\end{macro}\end{macro} % % \changes{v1.24}{2013/07/27} % {\cs{pcol@op@mcpush} was introduced for coloring specified in math % mode but removed in v1.34.} % \changes{v1.34}{2018/05/07} % {\cs{pcol@op@mcpush} is removed according to the change of text % coloring from \cs{output} to \cs{insert}.} % \changes{v1.24}{2013/07/27} % {\cs{pcol@op@mcpush@pone} was introduced for coloring specified in % math mode but removed in v1.34.} % \changes{v1.34}{2018/05/07} % {\cs{pcol@op@mcpush@pone} is removed according to the change of text % coloring from \cs{output} to \cs{insert}.} % \changes{v1.24}{2013/07/27} % {\cs{pcol@op@mcpop} was introduced for coloring specified in math % mode but removed in v1.34.} % \changes{v1.34}{2018/05/07} % {\cs{pcol@op@mcpop} is removed according to the change of text % coloring from \cs{output} to \cs{insert}.} % \changes{v1.24}{2013/07/27} % {\cs{pcol@op@mcpop@pone} was introduced for coloring specified in % math mode but removed in v1.34.} % \changes{v1.34}{2018/05/07} % {\cs{pcol@op@mcpop@pone} is removed according to the change of text % coloring from \cs{output} to \cs{insert}.} % % \begin{macro}{\pcol@specialoutput} % \changes{v1.0}{2011/10/10} % {Remove unnecessary \cs{pcol@latex@specialoutput}.} % \changes{v1.2-2}{2013/05/11} % {Add footnote logging if $\cs{outputpenalty}\EQ-10004$.} % \changes{v1.22}{2013/06/30} % {Add the invocation of \cs{pcol@output@}${\cdot}f$ for % $f\in\{\string\texttt{cpush},\string\texttt{cpop}, % \string\texttt{cset}\}$} % \changes{v1.24}{2013/07/27} % {Add examination with $P_{\string\rm{push}}$ and $P_{\string\rm{pop}}$ % and invocation of \cs{pcol@output@mcpush} and % \cs{pcol@output@mcpop}.} % \changes{v1.34}{2018/05/07} % {Remove examinations related to $f\in\{{\tt cpush},{\tt cpop},{\tt % mcpush},{\tt mcpop}\}$.} %  % The macro \!\pcol@specialoutput! is invoked solely in \!\pcol@output! to % invoke our own or \LaTeX's special output routine. It examines if % $P=\!\outputpenalty!\in\Set{\cs{pcol@op@}{\cdot}f}{f\in F}$ and then, if % so, before invoking $|\pcol@output@|{\cdot}f$, we rebuild \!\@holdpg! % removing \!\lastbox! and the last vertical skip as done in \LaTeX's % \!\@specialoutput!. We also let $\!\outputpenalty!=-10000$\footnote{ %  % It can be any value larger than -10004.} %  % so that \!\vsize! is correctly set to \!\@colroom! in the second half of % \!\pcol@output! after this macro finishes. % % \hfuzz9pt % Otherwise, i.e., if $P\notin\Set{\cs{pcol@op@}{\cdot}f}{f\in{}F}$, % we simply invokes \LaTeX's \!\@specialoutput!\footnote{ %  % With footnote logging if $\cs{outputpenalty}=-10004$.}. %  % \begin{macrocode} \def\pcol@specialoutput{% \ifnum\outputpenalty=\pcol@op@start\relax \let\reserved@a\pcol@output@start \else\ifnum\outputpenalty=\pcol@op@switch\relax \let\reserved@a\pcol@output@switch \else\ifnum\outputpenalty=\pcol@op@flush\relax \let\reserved@a\pcol@output@flush \else\ifnum\outputpenalty=\pcol@op@clear\relax \let\reserved@a\pcol@output@clear \else\ifnum\outputpenalty=\pcol@op@end\relax \let\reserved@a\pcol@output@end \else \let\reserved@a\@specialoutput \fi\fi\fi\fi\fi \ifnum\outputpenalty=-\@Miv\relax \ifvoid\footins\else \pcol@Log\dummy{dummy}\footins \fi \fi \ifx\reserved@a\@specialoutput\else \global\setbox\@holdpg\vbox{\unvbox\@holdpg \unvbox\@cclv \setbox\@tempboxa\lastbox \unskip}% \outputpenalty-\@M \fi \reserved@a} % \end{macrocode} % \end{macro} % % % % \subsection{Building Starting Page} \label{sec:imp-sout-start} % % \begin{macro}{\pcol@output@start} % \changes{v1.0}{2011/10/10} % {Change the order of operations.} % \changes{v1.0}{2011/10/10} % {Rename \cs{pcol@maxpage} as \cs{pcol@toppage}.} % \changes{v1.0}{2011/10/10} % {Add special operation in case of too small room for column-pages.} % \changes{v1.2-2}{2013/05/11} % {Add initialization of $\string\mathit{\string\Phi}$ and % page-wise footnote output operations, and revise reflecting % the redesign of page context.} % \changes{v1.2-7}{2013/05/11} % {Add \cs{pcol@outputtrue} to solve the \cs{output} request sneaking.} % \changes{v1.2-7}{2013/05/11} % {Include the effect of the separation of pre-environment bottom % floats and columns in the starting page into the check of too large % pre-environment stuff.} % \changes{v1.3-6}{2013/09/17} % {Change the page builder for too tall pre-environment stuff from % \cs{pcol@makenormalcol} to \cs{@makecol} because the page should be % built by the ordinary mechanism.} % \changes{v1.3-3}{2013/09/17} % {Let $\cs{ifpcol@output}\EQ\string\mathit{false}$ temporarily before % the invocation of \cs{@outputpage} for too tall pre-environment % stuff because the page is considered as outside % \string\texttt{paracol} environments.} % \changes{v1.32-3}{2015/10/10} % {Add depth clearing of imported deferred floats in case that some of % them has \texttt{1sp}.} % \changes{v1.35-4}{2018/12/31} % {Add \cs{belowfootnoteskip} to $H_f$ being the space for the % non-merged pre-environment footnotes.} %  % The macro \!\pcol@output@start! is invoked solely from % \!\pcol@specialoutput! to process the special \!\output! request made in % \!\pcol@zparacol! and to build the {\em\Uidx\spage} from which parallel % columns start possibly with the stuff preceding \beginparacol{}, or % {\em\Uidx\preenv} in short. First, we turn % $\CSIndex{ifpcol@output}=\true$ so that \!\output! requests for page % breaks are processed by our own macros such as \!\pcol@makecol! hereafter. % Then we let $p=\pbase={\ptop}=0$ and $\PP=\emptyset$ because we have % nothing for $q<\ptop=0$. We also move \!\@deferlist! to \!\@dbldeferlist! % and then let \!\@deferlist! be empty because all \cwise{} deferred floats % become \pwise{}. In this float importation, as discussed in % item-(\ref{item:ovv-float-@output@start}) of % \secref{sec:imp-ovv-float}, we force all floats in the list have % depth 0 to ensure no one has |1sp| to conform our own and old-fashioned % \pwise{} float placement mechanism\footnote{ %  % Though having \texttt{1sp} is almost impossible.}. %  % We then and let $\df=\bot$ because we don't have any deferred footnotes. % % Next we calculate $H=H_r-(H_m+H_f+H_b)$ where $H_r=\!\@colroom!$; $H_m$ is % the height-plus-depth of the main vertical list in \!\@holdpg!; $H_f$ is % the sum of \!\skip!\!\footins!, the height-plus-depth of \!\footins! and % \!\belowfootnoteskip!, if \!\footins! is not $\bot$ or 0 otherwise; and % $H_b=\!\textfloatsep!$ if the \preenv{} has bottom floats or 0 otherwise. % That is, $H$ is the room for each of \colpage{} in the \spage. Then we % examine if $H<1.5\times\!\baselineskip!$ to mean \!\pcol@output! would % force a page break with warning. If so, we assume we have a page break % before \beginparacol{} to ship out \preenv{} to avoid the warning. % Therefore, we invoke \LaTeX's \!\@makecol!\footnote{ %  % \Sloppy{2500}% % We can be unaware of our customization for \sync{}ation in % \CSIndex{pcol@combinefloats} because \CSIndex{pcol@textfloatsep} is % made $\infty$ by \CSIndex{pcol@zparacol}.} %  % giving it \!\@holdpg! through \!\@cclv! to build the ship-out image in % \!\@outputbox!. Then the box is passed to \!\@outputbox! for which we % temporarily let $\CSIndex{ifpcol@output}=\false$ because the page is % assumed to be outside the \env{paracol} environment having just started. % % After that we invoke \!\pcol@startpage! to let it produce $\pp(\ptop)$ for % the \spage{} $\ptop=0$ letting $\!\pcol@currpage!$ be empty so that the % macro will not refer to it. The page $\pp(0)$ is usually empty but can % have non-empty $\pp^i(0)$ with imported deferred floats which are now % \pwise. Moreover, we can have two or more pages if deferred \pwise{} % floats produce \fpage{s}. However, we can be unaware of these effects of % floats because the resulting $\PP^+$ with them is correct of course. % % Then let $\!\topskip!=\!\pcol@topskip!$ being the value at \beginparacol, % and $\cs{ifpcol@}\~|firstpage|={\false}$, because we have the \spage{} % without \preenv{} and thus the first item of each column will be at its % top. %  % \CSINDEX{ifpcol@firstpage} %  % \begin{macrocode} %% Special Output Routines: Building First Page \def\pcol@output@start{% \global\pcol@outputtrue \global\pcol@page\z@ \global\pcol@toppage\z@ \global\pcol@basepage\z@ \global\let\pcol@pages\@empty \global\let\@dbldeferlist\@deferlist \global\let\@deferlist\@empty {\def\@elt##1{\global\dp##1\z@}\@dbldeferlist}% \setbox\z@\box\pcol@topfnotes \@tempdima\@colroom \advance\@tempdima-\ht\@holdpg \advance\@tempdima-\dp\@holdpg \ifvoid\footins\else \advance\@tempdima-\skip\footins \advance\@tempdima-\ht\footins \advance\@tempdima-\dp\footins \advance\@tempdima-\belowfootnoteskip \fi \ifx\@botlist\@empty\else \advance\@tempdima-\textfloatsep \fi \ifdim\@tempdima<1.5\baselineskip \setbox\@cclv\box\@holdpg \@makecol \pcol@outputfalse \@outputpage \pcol@outputtrue \global\let\pcol@currpage\@empty \pcol@startpage \global\topskip\pcol@topskip \global\pcol@firstpagefalse % \end{macrocode} % % Otherwise, i.e., if $H\geq1.5\times\!\baselineskip!$, we invoke % \!\pcol@makenormalcol! to make the \preenv{} as the \spanning{} of the % \spage. The macro is different from \!\@makecol! as follows; the height % of resulting \!\@outputbox! is natural rather than \!\textheight!; % \Mgfnote{}s is excluded if any; and the skip of \!\textfloatsep! is added % below the bottom floats also if any, % % Then we let $h$ be the height-plus-depth of \!\@outputbox! being the % \spanning{} and shrink \!\@colht! by $h$. Next if % $h>\HB=\!\pcol@bg@preposttop! % \in\{\!\pcol@bg@preposttop@left!,\~\!\pcol@bg@preposttop@right!\}$, being % the bottom of the previous \env{paracol} environment (having right % \parapag{}e) or 0 if the current page does not have it, to mean we have % ordinary single-columned stuff in \preenv{}, we paint its \bground{} by % \!\pcol@bg@paintbox! temporarily letting $\!\pcol@bg@textheight!=h$ so % that $y_0=\HB$ and $y_1=h$ for $\bgr_{\{p,P\}}$. This \bgpaint{} is not % only for $\pp^b(0)$ which we acquire from from \!\@freelist! by \!\@next! % and let have the \spanning, but also for \!\pcol@rightpage! if $\CL<\C$ to % mean \parapag{}ing for which we temporarily increment \!\c@page! by one if % \npaired. % % We also let $\pp^h(0)$ be the shrunk \!\@colht!, and $\pp^t(0)$ be % \!\topskip! if $h=0$ assuming that the page does % not have any \spanning{}\footnote{ %  % Checking the emptiness by \cs{pcol@ifempty} does not work well for the % very first page of a document because it has a \cs{write} as the very % first item.} %  % to typeset \colpage{}s from the top of the page, or otherwise be 0 % together with \!\topskip! to inhibit the ordinary \!\topskip! insertion. % % As for $\pp^m(0)$, we define it as follows, referring to % $\mpbout=\!\pcol@mparbottom@out!=\{\mpb_L^l,\mpb_L^r,\mpb_R^l,\mpb_R^r\}$, % where $\mpb_X^x$ has exactly one element $\mpar(h,t)$ which may be the % position of last marginal notes in the last \env{paracol} environment in % the page we are working on, or $\mpb_X^x=\{\mpar(0,0)\}$ if such marginal % note or the environment itself does not exist in the page. On the other % hand, $B=\!\@mparbottom!$ may have non-zero for the bottom edge of the % last marginal note in \preenv{} including the last \env{paracol} % environment if any. Therefore, what we need to do is to let % $\mpb_L^x=\{\mpar(0,B)\}$ to reflect the marginal node whose bottom is at % $B$ and which can be different from what $\mpb_L^x$ had, where $x$ is the % target margin in the \preenv{} determined by \CSIndex{if@mparswitch}, the % parity of $\page(0)$ and \CSIndex{if@reversemargin}. % % The replacement is done by \!\pcol@do@mpbout! which invokes % $\!\pcol@do@mpbout@whole!\arg{m_L^l}\~\arg{m_L^r}\arg{\mpb_R^l}\arg{\mpb_R^r}$ % where $m_L^x\in\{M_L^x,\,\!\pcol@do@mpbout@elem!\arg{M_L^x}\}$ whose choice % is made according that $x\in\{l,r\}$ is the target margin (latter) or not % (former). Therefore, prior to the invocation of \!\pcol@do@mpbout!, we % \!\def!fine \!\pcol@do@mpbout@whole! so that it \!\xdef!ines % $\mpbout=\!\pcol@mparbottom@out!$ with its four arguments, and % \!\pcol@do@mpbout@elem! to let it be expanded to % $\!\@elt!\Arg{0}\Arg{B}=\mpar(0,B)$. After that, we also invoke % \!\pcol@bias@mpbout! giving it $-h$ to replace $\mpar(t,b)$ being the sole % element of each $\mpb_{\{L,R\}}^{\{l,r\}}$ in the resulting $\mpbout$ with % $\mpar(t-h,b-h)$ to have what we give to $\pp^m(0)$. This replacement % transforms the coordinates for text area to that for columns, and makes it % possible for the first marginal note in each margin in the \env{paracol} % environment we now start to exploit the space for \preenv{} even if it is % tall extraordinarily. % % Then we let $\pp(0)$ have $\pp^i(0)$ and $\pp^m(0)$ shown above, and % $\pp^p(0)=\!\c@page!$, $\pp^f(0)=\bot$ and $\pp^s(0)=\emptyset$ by % \!\pcol@defcurrpage!, and let $\CSIndex{ifpcol@firstpage}=\true$ because % $\pp^b(0)$ has \preenv. %  % \changes{v1.3-6}{2013/09/17} % {Delete the argument of \cs{pcol@makenormalcol} because now it is % not used too tall pre-environment stuff.} % \changes{v1.3-3}{2013/09/17} % {Add background painting of pre-environment stuff.} % \changes{v1.3-4}{2013/09/17} % {Add initialization of $\pi^m(0)$.} % \changes{v1.32-2}{2015/10/10} % {Add \cs{pcol@Fb}/\cs{pcol@Fe} pair(s).} %  % \begin{macrocode} \else \pcol@makenormalcol \@tempdima\ht\@outputbox \advance\@tempdima\dp\@outputbox \global\advance\@colht-\@tempdima \def\reserved@a{% \ifdim\pcol@bg@preposttop=\@tempdima\else \edef\pcol@bg@textheight{\@elt{\number\@tempdima sp}}% \pcol@bg@paintbox{Pp}% \fi} \ifnum\pcol@ncolleft<\pcol@ncol \global\setbox\pcol@rightpage\vbox{% \ifpcol@paired\else \advance\c@page\@ne \fi \let\pcol@bg@preposttop\pcol@bg@preposttop@right \reserved@a \unvbox\pcol@rightpage}% \fi \pcol@Fb \@next\@currbox\@freelist{\global\setbox\@currbox\vbox{% \let\pcol@bg@preposttop\pcol@bg@preposttop@left \reserved@a \unvbox\@outputbox}}\pcol@ovf \pcol@Fe{output@start(preenv)}% \global\dimen\@currbox\@colht \ifdim\@tempdima=\z@ \@tempskipa\topskip \else \@tempskipa\z@ \fi \global\skip\@currbox\@tempskipa \global\topskip\@tempskipa \def\pcol@do@mpbout@whole##1##2##3##4{% \xdef\pcol@mparbottom@out{{##1}{##2}{##3}{##4}}}% \def\pcol@do@mpbout@elem\@elt##1##2{\@elt{0}{\number\@mparbottom}}% \pcol@do@mpbout \pcol@bias@mpbout{-\@tempdima}% \pcol@defcurrpage{\number\c@page}\@currbox\voidb@x{}{\pcol@mparbottom@out}% \global\pcol@firstpagetrue \fi % \end{macrocode} % % Then regardless of $H$, we do the followings for all columns $c\In0\C$ to % build $\cc_c$, after initializing \!\@colroom! to be \!\@colht!, and % invoking \!\pcol@floatplacement! to reinitialize the parameters of % \cwise{} float placement. % % First, if we have let $\!\topskip!=0$ with the \preenv, % we let $\cc_c(\vb^b)$ have an invisible \!\hrule! whose % height and depth are 0 as the very first vertical item of the \colpage. % When we visit the column $c$ for the first time afterward, we will % \!\unvbox! the box to let \TeX's page builder have $\!\topskip!=0$ and the % invisible rule. Then the first vertical item of the \colpage{} is added % but it is recognized as non-first by \TeX's page builder and thus it % inserts \!\baselineskip! referring to \!\prevdepth! as the depth of the % last item. The important issue is that the \!\prevdepth! to be referred % is assured having its value at \beginparacol, which is usually the depth % of the last item of \spanning, by the following mechanism: (1) % \!\pcol@invokeoutput! invoked in \!\pcol@zparacol! saves \!\prevdepth! in % \!\pcol@prevdepth! before the \!\output! request for % \!\pcol@output@start!; (2) \!\pcol@prevdepth! is saved in $\cc_c(\pd)$ by % \!\pcol@setcurrcolnf! invoked from \!\pcol@output@start! as discussed % afterward; (3) when the column $c$ is visited for the first time, the % special output routine \!\pcol@output@start! itself ($c=0$) or % \!\pcol@output@switch! ($c>0$) restores \!\pcol@prevdepth! from % $\cc_c(\pd)$ by \!\pcol@getcurrcol!; (4) \!\pcol@invokeoutput! which made % the \!\output! request for (3) lets \!\prevdepth! have the value of % \!\pcol@prevdepth! after the request. Therefore, the baseline progress % from the last line of the \spanning{} to the first line of each % \colpage{} should be very natural as we see in the third and fourth lines % of \secref{sec:man-close} of Part \ref{part:man}. % % Then we invoke \!\pcol@setcurrcolnf! to save the following values for % $\cc_c(e)$ ($e\neq\vb$); $\cc_c(\ft)=\!\voidb@x!$ because $c$ does not % have \Mcfnote{}s so far; $\cc_c(\pd)=\!\prevdepth!$ as discussed above; % $\cc_c(\tl)=\cc_c(\ml)=\cc_c(\bl)=\emptyset$ because % \!\pcol@makenormalcol! and \!\@combinefloats! invoked from it emptied % them; $\cc_c(\dl)=\emptyset$ as discussed above; % $\cc_c(\tn)=\!\c@topnumber!$, $\cc_c(\bn)=\!\c@botnumber!$ and % $\cc_c(\tn)=\!\c@totalnumber!$ as initialized by \!\@floatplacement! % invoked from \!\pcol@floatplacement!; % $\cc_c(\tr)=\!\topfraction!\times\!\@colht!$ and % $\cc_c(\br)=\!\bottomfraction!\times\!\@colht!$ as initialized by % \!\@floatplacement!; $\cc_c(\sw)$ is defined by \CSIndex{if@nobreak} and % \cs{if@after}\~|indent| %  % \expandafter\SpecialIndex\csname if@afterindent\endcsname %  % at the time of \beginparacol; and % $\cc_c(\ep)=\!\everypar!$ at the time of \beginparacol. We also let % $\cc_c(\vb^p)=0$ because $p=0$ and $\cc_c(\vb^r)=\!\@colroom!$ defined % above. In addition, we let $\S_c=\emptyset$ because we don't have any % \colpage{} having been completed. % % \SpecialArrayIndex{c}{\pcol@columncolor} % \SpecialArrayIndex{c}{\pcol@columncolor@box} % We also examine if $\Celtshadow^c=\cs{pcol@columncolor}\cdot c$ is defined % and, if so, acquire an \!\insert! from \!\@freelist! to let % $\Celt^c=\cs{pcol@columncolor@box}\cdot c$ have the coloring \!\special! % for the color defined in $\Celtshadow^c$ by invoking \!\pcol@set@color! % being the original \!\set@color! with nullification of \!\aftergroup!. % Otherwise, we let $\Celt^c=\bot$ . %  % \changes{v1.0}{2011/10/10} % {Add clearing of $S_c$.} % \changes{v1.32-2}{2015/10/10} % {Add \cs{pcol@Fb}/\cs{pcol@Fe} pair(s).} % \changes{v1.34}{2018/05/07} % {Add initialization of % $\gamma_0^c\EQ\cs{pcol@columncolor@box}\cdot c$.}  %  % \begin{macrocode} \global\@colroom\@colht \pcol@floatplacement \pcol@currcol\z@ \@whilenum\pcol@currcol<\pcol@ncol\do{% \pcol@Fb \@next\@currbox\@freelist{\global\setbox\@currbox\vbox{% \ifdim\topskip=\z@ \hrule\@height\z@\@width\z@ \fi}}\pcol@ovf \pcol@Fe{output@start(col)}% \pcol@setcurrcolnf \global\count\@currbox\z@ \global\dimen\@currbox\@colroom \expandafter\gdef\csname pcol@shipped\number\pcol@currcol\endcsname{}% \pcol@ifccdefined {\@next\@currbox\@freelist{\global\setbox\@currbox\vbox{% \def\current@color{\pcol@ccuse{}}\let\aftergroup\@gobble \pcol@set@color}}\pcol@ovf}% {\def\@currbox{\voidb@x}}% \pcol@ccxdef{\@currbox}% \advance\pcol@currcol\@ne}% % \end{macrocode} % % \changes{v1.2-1}{2013/05/11} % {Add emptying \cs{pcol@colorstack} and the invocation of % \cs{pcol@savecolorstack} at the beginning of the first % column-page to be built.} % \changes{v1.2-2}{2013/05/11} % {Add insertion of \cs{footins} having footnotes to be merged if it % is not void.} % \changes{v1.22}{2013/06/30} % {Move emptying \cs{pcol@colorstack} to \cs{pcol@zparacol}.} % \changes{v1.32-2}{2015/10/10} % {Add \cs{pcol@Fb}/\cs{pcol@Fe} pair(s).} % \changes{v1.35-1}{2018/12/31} % {Add \cs{interlinepenalty} insertion for the first column to avoid % vertical overfull due to the first item taller than the column % room.} %  % Finally, we let $c=\!\pcol@currcol!=0$ for the first column, and regain the % parameters in $\cc_0$ by \!\pcol@getcurrcol!. Then before putting % $\cc_0(\vb^b)$ to the main vertical list by \!\unvbox! returning % $\cc_0(\vb)$ to \!\@freelist! by \!\@cons! because it has become useless % so far, we save the \colorctext{} just with $\Celt^c$ into $\csts$ by % \!\pcol@savecolorstack! because $\CST$ is emptied by \!\pcol@zparacol!. % Then we \!\insert! \!\footins! through itself to the main vertical list if % it is not $\bot$ and thus has footnotes to be \mgfnote{}. This % \!\insert!ion is different from other footnote \!\insert!ion because % \!\footins! is not \!\unvbox!ed but is put as a whole and is followed by % \!\penalty!\!\interlinepenalty!, so that footnotes will not be broken by % \TeX's page builder to prevent the reconnection of a broken footnote with % inappropriate glue discarding, which we will discuss in % \secref{sec:imp-fnote}. We also add a penalty 10000 or % \!\interlinepenalty! according to $\CSIndex{if@nobreak}=\true$ or not to % allow the first column to start from a new page when its first item is % taller than the room in the \spage{}. %  % \begin{macrocode} \global\pcol@currcol\z@ \pcol@getcurrcol \pcol@savecolorstack \pcol@Fb \@cons\@freelist\@currbox \unvbox\@currbox \pcol@Fe{output@start(col)}% \ifvoid\footins\else \pcol@Log\pcol@output@start{insert}\footins \insert\footins{\box\footins\penalty\interlinepenalty}% \fi \if@nobreak \nobreak \else \addpenalty\interlinepenalty \fi} % \end{macrocode} % \end{macro} % % \begin{macro}{\pcol@makenormalcol} % \changes{v1.2-2}{2013/05/11} % {Replace the building operation of \cs{@outputbox} with footnotes % with the invocation of \cs{pcol@combinefootins} and add the % examination of \cs{ifpcol@mgfnote}.} % \changes{v1.2-7}{2013/05/11} % {Turn \cs{ifpcol@lastpage} be $\string\true$ temporarily for % \cs{pcol@combinefloats} to separate bottom floats in % pre-environment stuff and the multi-column stuff in % \string\texttt{paracol} environment by \cs{textfloatsep}.} % \changes{v1.3-6}{2013/09/17} % {Completely redesigned to use \cs{@makecol} if pre-environment % stuff has bottom floats.} % \changes{v1.32-2}{2015/10/10} % {Add \cs{pcol@Fb}/\cs{pcol@Fe} pair(s).} %  % The macro \!\pcol@makenormalcol! is invoked solely from % \!\pcol@output@start! to let \!\@output~box! have the \preenv{} as % \spanning{} of the \spage. The operations this macro performs are very % similar to those of \!\@makecol!, which in fact is used in this macro % itself, but has the following differences. %  % \begin{enumerate}\def\labelenumi{(\arabic{enumi})} % \item % If $\CSIndex{ifpcol@mgfnote}=\true$, we exclude footnotes in \!\footins! % from \!\@outputbox!, because they are \mgfnote{} with \Scfnote{}s given in % columns, by saving it into \!\@tempboxa! during the building process and % restoring it from the box register. % % \item % If \preenv{} does not have bottom floats, we build \!\@outputbox! by % ourselves without relying on \!\@makecol! because the skips put into the % bottom (or near it) by the macro is harmful to making \preenv{} and % parallel columns naturally connected. Therefore, we move % \!\@holdpg! to \!\@outputbox! adding \!\footins! to its tail if any by % \!\pcol@combinefootins!, and then combine top floats if any by % \!\pcol@combinefloats!\footnote{ %  % Since we do not have bottom floats, the order of materials in the % resulting \!\@outputbox! being top floats, main text and footnotes should % be consistent with other pages with any \LaTeX{} including p\LaTeX.}. %  % In addition, we clear \!\@midlist! and returns its contents to % \!\@freelist! as \!\@makecol! does. % % \item % If \preenv{} has bottom floats, on the other hand, we use \!\@makecol! to % build \preenv{} in \!\@outputbox! moving \!\@holdpg! into \!\box!|255| % prior to the invocation\footnote{ %  % Therefore the order of footnotes and bottom floats is consistent with % other pages and columns, i.e., footnote-first in the native \LaTeX{} while % float-first in p\LaTeX{}, for example.}. %  % Also before invocation in addition, we temporarily let % $\CSIndex{ifpcol@lastpage}=\true$ to let % $\!\@combinefloats!=\!\pcol@combinefloats!$ used in \!\@makecol! put a % vertical skip of \!\textfloatsep! below the bottom floats so that the % floats are well separated from the top of multi-column stuff in the % \spage. We also nullify \!\@textbottom! by making it \!\let!-equal to % \!\relax! because it is unnecessary to put an infinitely stretchable skip % at the bottom\footnote{ %  % Even if unharmful.}, %  % and let $\!\vbadness!=10000$ to avoid an inevitable underfull message % because \!\@makecol! lets \!\@outputbox! as tall as \!\textheight!. % % \item % In both cases but especially that with bottom floats, resulting % \!\@outputbox! is decapsulated by \!\unvbox! to make its height {\em % natural}. % \end{enumerate} %  % Note that the special function for \sync{}ed \colpage{} in % \!\pcol@combinefloats! used directly or indirectly in this macro, on the % other hand, is not active in the invocation because \!\pcol@zparacol! % initialized $\!\pcol@textfloatsep!=\infty$ to mean we have no \sync{}ation % points. Also % note that bottom floats and non-\mgfnote{} footnotes are put in % \!\@outputbox! and thus they will not appear at the bottom of the page % but above the \colpage{}s in the page\footnote{ %  % We could put them at the bottom by keeping them somewhere and insert them % in \!\pcol@outputcolumns!, but it will cause another problem that the % numbers of the figures and footnotes are smaller than those in \colpage{}s % which are above them.}. %  % \begin{macrocode} \def\pcol@makenormalcol{% \ifpcol@mgfnote \setbox\@tempboxa\box\footins \fi \begingroup \ifx\@botlist\@empty \ifvoid\footins \setbox\@outputbox\box\@holdpg \else \pcol@combinefootins\@holdpg\footins \fi \pcol@Fb \let\@elt\relax \xdef\@freelist{\@freelist\@midlist}% \pcol@Fe{makenormalcol}% \global\let\@midlist\@empty \pcol@combinefloats \else \pcol@lastpagetrue \setbox\@cclv\box\@holdpg \let\@textbottom\relax \vbadness\@M \@makecol \fi \global\setbox\@outputbox\vbox{\unvbox\@outputbox}% \endgroup \ifpcol@mgfnote \setbox\footins\box\@tempboxa \fi} % \end{macrocode} % \end{macro} % % % % \subsection{Column-Switching} % \label{sec:imp-sout-switch} % % \begin{macro}{\pcol@output@switch} % \changes{v1.2-1}{2013/05/11} % {Add \cs{pcol@clearcst@unvbox} to add coloring \cs{special}s at the % top and bottom of the column-page to be saved.} % \changes{v1.3-1}{2013/09/17} % {Add the capture of a spanning text when it is closed.} % \changes{v1.3-3}{2013/09/17} % {Add $\pi^s(p)\EQ\cs{pcol@sptextlist}$ to the argument of % \cs{pcol@defcurrpage}.} % \changes{v1.3-4}{2013/09/17} % {Add $\pi^m(p)\EQ\cs{pcol@mparbottom}$ to the argument of % \cs{pcol@defcurrpage}.} % \changes{v1.32-2}{2015/10/10} % {Add \cs{pcol@Fb}/\cs{pcol@Fe} pair(s).} % \changes{v1.33-2}{2016/11/19} % {Let \cs{dimen@} have the height of \cs{pcol@prespan} if it is not % $\bot$, or 0 if $\bot$ for the sake of clarity.} %  % The macro \!\pcol@output@switch! is invoked from % \!\pcol@specialoutput! to process the special \!\output! request made in % \!\pcol@switchcol!, \!\pcol@visitallcols! and \!\pcol@flushclear!, for a % \cswitch{} from $c=\!\pcol@currcol!$ to $d=\!\pcol@nextcol!$ which can be % $c$. The macro is also invoked from \!\pcol@makeflushedpage! to \sync{}e % and to flush all \ccolpage{}s but staying in $c$. % % First, we examine if the \cswitch{} is to close a \mctext, i.e., % $\CSIndex{ifpcol@sptext}={\true}$ and $c=0$, and if so we do the % following; let $h_p$ be the height of \!\pcol@prespan! having \prespan{} % if it is not $\bot$, or 0 if $\bot$ to mean we have had a page break in % the \mctext; add $h_p$ to \!\@colroom! which we temporarily shrank when % the \mctext{} starts; add an element $\spt(H,h)$ to the tail of % $\pp^s(\ptop)=\!\pcol@sptextlist!$ by \!\pcol@getcurrpage! and % \!\pcol@defcurrpage!, where $H$ is $h_p$ plus the total height of top % floats measured by \!\pcol@addflhd!, and $h$ is the height-plus-depth of % \!\@holdpg! having (a part of) \mctext, represented in the form of % integers and thus expanded with \!\number!; shift \!\@holdpg! left by % \!\pcol@shiftspanning! if the column-0 is not the leftmost due to \cswap; % and then put \prespan{} and (maybe shifted) \!\@holdpg! into \!\@holdpg! % itself so as to let \!\@holdpg! have everything in the \colpage{} 0 as % usual. % % Note that it can be $\!\pcol@prespan!=\bot$ if \mctext{} had a page break % (or multiple ones) in it as shown above. This empty \prespan{}, however, % does not always means that we have no top floats because the page break in % the \mctext{} can produce a \colpage{} with top floats which are deferred % from the previous page(s), or though unlikely the \mctext{} itself has % float environments. Therefore, the measurement of the total height of top % floats are always necessary. Also note that we perform these operations % at the first \cswitch{} for \cscan{}ing from $c=0$ with % $\CSIndex{ifpcol@sptext}=\true$, i.e., prior to the \sync{}ation itself % which takes place afterword, as explained shortly. % % Then regardless of the operations above, we acquire an \!\insert! from % \!\@freelist! by \!\@next! for $\cc_c(\vb)$ to store the \ccolpage{} in % (maybe modified) \!\@holdpg! by \!\pcol@clearcst@unvbox! to add uncoloring % \!\special!s to rewind the \colorstack{} $\CST^c$ at the bottom and % possibly coloring ones to establish that saved in $\csts$ at the top as % the \colorctext{} for the \colpage{} when it has the first item. % % Then if $\!\footins!\neq\bot$, we perform one of the followings. %  % \begin{itemize} % \item % If \Scfnote{} typesetting is in effect and $p=\ptop$, we save \!\footins! % into $\pp^f(p)$ by the sequence of \!\pcol@getcurrpinfo! to get $\pp(p)$, % \!\pcol@savefootins! to move it in $\pp^f(p)$, and \!\pcol@defcurrpage! to % update $\pp(p)$ with $\pp^f(p)$. % % \item % If \Scfnote{} typesetting is in effect but $p<\ptop$, we simply discard % the contents of \!\footins! by making it $\bot$, because \!\footins! % should have $\pp^f(p)$ which has been already fixed. % % \item % If \Mcfnote{} typesetting is in effect, by \!\pcol@savefootins! we save % \!\footins! into \!\pcol@currfoot!, which should be $\bot$ in other cases, % so that it will be saved into $\cc_c(\ft)$ by \!\pcol@setcurrcol! % afterward. % \end{itemize} % % % Then if $c=0$, we invoke \!\pcol@setpageno! to reflect the jump of % \!\c@page! made in the building process of the \colpage{} to $\pp(q)$ for % all $q\in[p,\ptop]$. After that, we save $c$'s \cctext{} into $\cc_c$ by % \!\pcol@setcurrcol! and let $\cc_c(\vb^p)=p$ and % $\cc_c(\vb^r)=\!\@colroom!$. %  % \begin{macrocode} %% Special Output Routines: Column-Switching \def\pcol@output@switch{% \ifpcol@sptext\ifnum\pcol@currcol=\z@ \ifvoid\pcol@prespan \dimen@\z@ \else \dimen@\ht\pcol@prespan \fi \global\advance\@colroom\dimen@ \pcol@addflhd\@toplist\pcol@textfloatsep \pcol@getcurrpinfo\@tempcnta\@tempdima\@tempskipa \@tempdimb\ht\@holdpg \advance\@tempdimb\dp\@holdpg \@cons\pcol@sptextlist{{\number\dimen@}{\number\@tempdimb}}% \pcol@defcurrpage{\number\@tempcnta}\pcol@spanning\pcol@footins {\pcol@sptextlist}{\pcol@mparbottom}% \pcol@shiftspanning\@holdpg \setbox\@holdpg\vbox{\unvbox\pcol@prespan \unvbox\@holdpg}% \fi\fi \pcol@Fb \@next\@currbox\@freelist{\global\setbox\@currbox\vbox{ \pcol@clearcst@unvbox\@holdpg}}\pcol@ovf \pcol@Fe{output@switch}% \def\pcol@currfoot{\voidb@x}% \ifvoid\footins\else \ifpcol@scfnote \ifnum\pcol@page=\pcol@toppage \pcol@getcurrpinfo\@tempcnta\@tempdima\@tempskipa \pcol@Log\pcol@output@switch{save}\footins \pcol@Fb \pcol@savefootins\pcol@footins \pcol@Fe{output@switch(pagefn)}% \pcol@defcurrpage{\number\@tempcnta}\pcol@spanning\pcol@footins {\pcol@sptextlist}{\pcol@mparbottom}% \else \pcol@Log\pcol@output@switch{discard}\footins \setbox\@tempboxa\box\footins \fi \else \pcol@Log\pcol@output@switch{save}\footins \pcol@Fb \pcol@savefootins\pcol@currfoot \pcol@Fe{output@switch(colfn)}% \fi \fi \ifnum\pcol@currcol=\z@ \pcol@setpageno \fi \pcol@setcurrcol \global\count\@currbox\pcol@page \global\dimen\@currbox\@colroom % \end{macrocode} % % Next, we examine if $\CSIndex{ifpcol@sptext}=\true$ and $c=0$ again, and % if so we {\em broadcast} \CSIndex{if@nobreak} and % \CSIndex{if@afterindent}, or in other words $\cc_c(\sw)$, and tokens in % $\!\everypar!=\cc_c(\ep)$, to pretend all columns follow the \mctext. % That is, for each column $e$, we restore its \cctext{} from $\cc_e$ by % \!\pcol@getcurrcol!, let \CSIndex{if@nobreak} and \CSIndex{if@afterindent} % have the values for $c$ ($\in\{0,\C{-}1\}$) and $\!\everypar!=\cc_c(\ep)$, % and then save the context to $\cc_e$ by \!\pcol@setcurrcol! so that % $\cc_e(\sw)=\cc_c(\sw)$ and $\cc_e(\ep)=\cc_c(\ep)$. After that, we % \!\global!ly turn $\CSIndex{ifpcol@sptext}=\false$ to give it the default % state. % % Note that this broadcast is essential when the \mctext{} has sectioning % commands to have consistent settings of the page break inhibition, the % skip above the another sectioning command following them, and the % indentation of the first paragraph, for all columns. On the other hand, % broadcasting of \!\everypar! is natural even when it does not have % sectioning commands because all columns may be considered following the % \mctext. Also note that, as mentioned in the explanation of the first % examination at the beginning of this macro, we perform these operations at % the first \cswitch{} for \cscan{}ning from $c=0$ with % $\CSIndex{ifpcol@sptext}=\true$ prior to the \sync{ation} following the % \mctext. This means, if $\CSIndex{if@nobreak}={\true}$, % $\!\penalty!=10000$ is inserted at the top and bottom end of the space for % \mctext{} in the columns such that $c\neq0$, the former by this \cscan{} % and the latter by the \cswitch{} to $c$ made after the synchronization. % Therefore, if our \sync{ation} mechanism and \TeX's page builder once % agreed both end can be in a page, both end will not chosen as page % break points\footnote{ %  % As for $c=0$, its top end of \mctext{} is a feasible break point to make % the penalty insertion asymmetric. Therefore, we need to reinvestigate if % the condition of the broadcast is really appropriate, and, if % inappropriate, have to go back to the old implementation in which % \cs{ifpcol@sync} is included in the condition. Otherwise, if proved % appropriate, we will have to consider to make the penalty insertion % symmetric by adding \cs{nobreak} at the top of \mctext{} in $c=0$.}. %  % \changes{v1.0}{2011/10/10} % {Restrict the broadcast of \cs{if@nobreak} and \cs{everypar} only % when a column-switching is accompanied with spanning text.} % \changes{v1.2-7}{2013/05/11} % {Modify broadcasting of $\kappa_c(\sigma)$ so that \cs{@afterindent} % is broadcasted with \cs{@nobreak}.} % \changes{v1.3-1}{2013/09/17} % {Rename \cs{ifpcol@mctext} as \cs{ifpcol@sptext}.} % \changes{v1.3-6}{2013/09/17} % {Modify the condition of broadcasting $\kappa_0(\sigma)$ and % $\kappa_0(\varepsilon)$ accompanied with \cs{ifpcol@sptext} from % \cs{ifpcol@sync} to $c\EQ0$ so that the broadcast is made in the % first column-switching in column-scanning.} %  % \begin{macrocode} \let\reserved@a\@nobreakfalse \let\reserved@b\@afterindentfalse \ifpcol@sptext\ifnum\pcol@currcol=\z@ \if@nobreak \let\reserved@a\@nobreaktrue \fi \if@afterindent \let\reserved@b\@afterindenttrue \fi \@temptokena\everypar \pcol@currcol\z@ \@whilenum\pcol@currcol<\pcol@ncol\do{% \pcol@getcurrcol \reserved@a \reserved@b \everypar\@temptokena \pcol@setcurrcol \advance\pcol@currcol\@ne}% \global\pcol@sptextfalse \fi\fi % \end{macrocode} %  % \changes{v1.2-2}{2013/05/11} % {Add the case % $\cs{ifpcol@clear}\EQ\cs{ifpcol@sync}\EQ\string\mathit{true}$ for % the invocation of \cs{pcol@restartcolumn} for pre-flushing column % height check.} % \changes{v1.3-6}{2013/09/17} % {Modify the code structure to let % $\cs{if@tempswa}\EQ\string\mathit{true}$ according to the % modification of the broadcast of $\kappa_0(\sigma)$ and % $\kappa_0(\varepsilon)$.} % % Finally we invoke \!\pcol@sync! for the \sync{}ation if % \CSIndex{ifpcol@sync} or \CSIndex{ifpcol@clear} is $\true$, and then % \!\pcol@restartcolumn! to restart the \ccolpage{} $d$ if % $\CSIndex{ifpcol@clear}={}\false$ to mean ordinary (but possibly % \sync{}ed) \cswitch{} or $\CSIndex{ifpcol@clear}={}\true$ but % $\CSIndex{ifpcol@sync}={}\true$ too to mean pre-flushing column height % check, before finishing \!\output! routine letting % $\CSIndex{ifpcol@sync}=\false$ for next \cswitch. %  % \begin{macrocode} \@tempswafalse \ifpcol@sync \@tempswatrue \fi \ifpcol@clear \@tempswatrue \fi \if@tempswa \pcol@sync \fi \@tempswatrue \ifpcol@clear \ifpcol@sync\else \@tempswafalse \fi\fi \if@tempswa \pcol@restartcolumn \fi \global\pcol@syncfalse} % \end{macrocode} % \end{macro} % % \begin{macro}{\pcol@shiftspanning} % \changes{v1.3-1}{2013/09/17} % {Introduced to shift a spanning text to left if the column-0 is not % leftmost due to column-swapping.} %  % The macro $\!\pcol@shiftspanning!\arg{b}$ is used in \!\pcol@makecol! and % \!\pcol@output@switch! to let box register $b$ have itself but shifted % left by $\WT-w_0=\!\textwidth!-\!\columnwidth!$ so that the left edge of % its contents \mctext{} is aligned to the left edge of the leftmost column % being different from column-0 due to \cswap, i.e., if % $\CSIndex{ifpcol@swapcolumn}=\true$ and $\!\c@page!\bmod2=0$. Note that % \!\c@page! is {\em not} obtained from $\pp^p(p)$ by the invokers but have % the value when the \!\output! request is made to let invokers work, and % thus have the correct value even when a jump occurs prior to the request. %  % \begin{macrocode} \def\pcol@shiftspanning#1{% \ifpcol@swapcolumn\ifodd\c@page\else \setbox#1\vbox{\@tempdima\textwidth \advance\@tempdima-\columnwidth \moveleft\@tempdima\box#1} \fi\fi} % \end{macrocode} % \end{macro} % % \begin{macro}{\pcol@restartcolumn} % \changes{v1.0}{2011/10/10} % {Add \cs{pcol@getcurrfoot} to restore parameters of $\kappa_c(\tau)$ % into \cs{footins}.} % \changes{v1.32-2}{2015/10/10} % {Add \cs{pcol@Fb}/\cs{pcol@Fe} pair(s).} %  % The macro \!\pcol@restartcolumn! is invoked from \!\pcol@output@switch! or % \!\pcol@freshpage! to restart the \ccolpage{} $d=\!\pcol@nextcol!$ which % becomes $c=\!\pcol@currcol!$ by the very first assignment in this macro. % Then we restore the \cctext{} in $\cc_c$ by \!\pcol@getcurrcol! and let % $p=\cc_c(\vb^p)$ and $\!\@colroom!=\cc_c(\vb^r)$ before returning % $\cc_c(\vb)$ to \!\@freelist! by \!\@cons! because it has become useless % so far. We also restore the \pctext{} of $p$ by \!\pcol@getcurrpage!. %  % \begin{macrocode} \def\pcol@restartcolumn{% \global\pcol@currcol\pcol@nextcol \pcol@getcurrcol \global\pcol@page\count\@currbox \global\@colroom\dimen\@currbox \pcol@Fb \@cons\@freelist\@currbox \pcol@Fe{restartcolumn(col)}% \pcol@getcurrpage % \end{macrocode} %  % \changes{v1.2-2}{2013/05/11} % {Redesign the footnote insertion mechanism to cope with % page-wise footnotes.} % \changes{v1.2-1}{2013/05/11} % {Add \cs{pcol@restorecst@restart} to return main vertical list % with coloring operations.} % \changes{v1.3-1}{2013/09/17} % {Rename \cs{pcol@restorecst@restart} as \cs{pcol@putbackmvl}.} % \changes{v1.3-6}{2013/09/17} % {Change the code structure to move the insertion of page break % penalty for ordinary column-wise footnotes from below the main % text to below the footnotes.} % \changes{v1.3-3}{2013/09/17} % {Add \cs{@colht} and \cs{@tempdimb} as the first and third argument % of \cs{pcol@shrinkcolbyfn}.} % % Then we perform footnote \!\insert!ion as follows. %  % \begin{enumerate}\def\labelenumi{(\arabic{enumi})} % \item\label{item:scftop} % If footnote typesetting is \scfnote{} and $p=\ptop$, we do the followings. %  % \begin{enumerate}\def\labelenumii{(\alph{enumii})} % \item\label{item:scftop-main} % Put the contents of $\cc_c(\vb^b)$ by \!\pcol@putbackmvl! to make % the \colorctext{} in |.dvi| consistent with the current |.tex|'s one, and % to save \prespan{} into \!\pcol@prespan! if we are opening a \mctext{}. % % \item\label{item:scftop-pen} % Put $\!\penalty!=10000$ by \!\nobreak! if $\CSIndex{if@nobreak}=\true$ or % \!\interlinepenalty! by \!\addpenalty!\footnote{ %  % As done in \!\@specialoutput! but \!\penalty!\!\interlinepenalty! should % be sufficient.} %  % otherwise, as the page break penalty at the returning point. Note that % adding the \!\penalty! will be nullified by \TeX{} if $\cc_c(\vb^b)$ has % nothing and thus, if the \colpage{} is still empty when we leave from it, % its emptiness without any items is assured. Also note that the penalty % insertion here {\em looks} essential to keep \TeX's page builder from % confusing with \scfnote{} footnotes which it has not seen in a % \colpage\footnote{ %  % At least a test with tall \scfnote{} footnotes gave us a confusing % result.}. % % \item\label{item:scftop-fnote} % If $\pp^f(p)\neq\bot$, let \!\pcol@currfoot! and then \!\footins! have % the footnotes in it by an \!\edef! and \!\pcol@getcurrfoot!, return the % \!\insert! for them to \!\@freelist!, invoke \!\pcol@shrinkcolbyfn! to % shrink \!\@colht! temporarily by their total height and to remember the % existence of them with $\!\@tempdimb!=-\!\skip!\!\footins!$, and then % \!\insert! the footnotes so that it contributes to the building process % of the \colpage{} to be restarted. Otherwise, i.e. if $\pp^f(p)=\bot$, % \!\@colht! is unchanged and $\!\@tempdimb!=0$. % % \item\label{item:scftop-defer} % Invoke \!\pcol@deferredfootins! to \!\insert! deferred footnotes in $\df$ % until their total height reaches (possibly shrunk) \!\@colht!. This % height capping is to keep \TeX's page builder from holding too large % number of footnotes unprocessed causing confused ordering on presenting % them to \!\output! routine. % \end{enumerate} % % \item % If footnote typesetting is \scfnote{} but $p<\ptop$, we do the followings. %  % \begin{enumerate}\def\labelenumii{(\alph{enumii})} % \item % If $\pp^f(p)\neq\bot$, get it into \!\footins! as done in % (\ref{item:scftop-fnote}) but giving \!\copy! to \!\pcol@getcurrfoot! % because $\pp^f(p)$ has been fixed and thus will be kept until it is % shipped out, and then \!\insert! it. % % \item % Put $\cc_c(\vb^b)$ and the penalty as done in (\ref{item:scftop-main}) and % (\ref{item:scftop-pen}). % \end{enumerate} %  % The order of footnotes, main vertical list and then penalty is essential % to ensure that the \colpage{} in $p<\ptop$ has room for footnotes whose % residence in $p$ has already been fixed. % % \item % If footnote typesetting is \mcfnote{}, we do the followings. %  % \begin{enumerate}\def\labelenumii{(\alph{enumii})} % \item % Put $\cc_c(\vb^b)$ as done in (\ref{item:scftop-main}). % % \item % If $\cc_c(ft)\neq\bot$, get it by \!\pcol@getcurrfoot! returning the % \!\insert! to \!\@freelist!, and then \!\insert! it. % % \item % Put a penalty as done in (\ref{item:scftop-pen}). % \end{enumerate} %  % The order of main vertical list, footnotes and then penalty is appropriate % for \Mcfnote{}s because they definitely have space in the \colpage{} and % \TeX{} will break the page below the insertion, possibly just below thanks % to the penalty, to keep the footnotes and references to them in a page. % \end{enumerate} %  % \changes{v1.32-2}{2015/10/10} % {Add \cs{pcol@Fb}/\cs{pcol@Fe} pair(s).} %  % \begin{macrocode} \ifpcol@scfnote \edef\pcol@currfoot{\pcol@footins}% \ifnum\pcol@page=\pcol@toppage \@tempdima\@colht \@tempdimb\z@ \pcol@putbackmvl \if@nobreak \nobreak \else \addpenalty\interlinepenalty \fi \ifvoid\pcol@footins\else \pcol@Fb \pcol@getcurrfoot\box \@cons\@freelist\pcol@currfoot \pcol@Fe{restartcolumn(pagefn)}% \pcol@Log\pcol@restartcolumn{insert}\footins \pcol@shrinkcolbyfn\@colht\footins\@tempdimb \insert\footins{\unvbox\footins}% \fi \pcol@deferredfootins\pcol@restartcolumn \@colht\@tempdima \else \ifvoid\pcol@footins\else \pcol@getcurrfoot\copy \pcol@Log\pcol@restartcolumn{insdmy}\footins \insert\footins{\unvbox\footins}% \fi \pcol@putbackmvl \if@nobreak \nobreak \else \addpenalty\interlinepenalty \fi \fi \else \pcol@putbackmvl \ifvoid\pcol@currfoot\else \pcol@Fb \pcol@getcurrfoot\box \@cons\@freelist\pcol@currfoot \pcol@Fe{restartcolumn(colfn)}% \pcol@Log\pcol@restartcolumn{insert}\footins \insert\footins{\unvbox\footins}% \fi \if@nobreak \nobreak \else \addpenalty\interlinepenalty \fi \fi} % \end{macrocode} % \end{macro} % % \KeepSpace{1} % \begin{macro}{\pcol@getcurrcol} % \changes{v1.1}{2012/05/11} % {Add assignment $w_c$ to \cs{columnwidth}, \cs{hsize} and % \cs{linewidth}.} % \changes{v1.2-5}{2013/05/11} % {Move assignment $w_c$ to \cs{hsize} and \cs{linewidth} to % \cs{pcol@invokeoutput}.} % \begin{macro}{\pcol@igetcurrcol} % \begin{macro}{\pcol@iigetcurrcol} % \changes{v1.0}{2011/10/10} % {Add restoration of \cs{pcol@textfloatsep}.} % \changes{v1.3-4}{2013/09/17} % {Remove the argument for $\kappa_c(\mu)\EQ\cs{@mparbottom}$ because it % is no longer in the column context.} %  % The macro \!\pcol@getcurrcol! is invoked from the following macros to % restore the typesetting parameters of the column $c=\!\pcol@currcol!$ from % $\cc_c$, and to let \!\columnwidth! have % $\w_c=|\pcol@columnwidth|{\cdot}c$\footnote{ %  % \cs{hsize} and \cs{linewidth} are let have $\w_c$ and $\w_c-\lrm$ % respectively in \cs{pcol@invokeoutput}.}. %  % \SpecialArrayIndex{c}{\pcol@columnwidth} %  % \begin{itemize}\item[]\begin{tabular}{lll} % \!\pcol@output@start!&\!\pcol@output@switch!&\!\pcol@restartcolumn!\\ % \!\pcol@flushcolumn!&\!\pcol@measurecolumn!&\!\pcol@synccolumn!\\ % \!\pcol@makeflushedpage!&\!\pcol@imakeflushedpage!&\!\pcol@iflushfloats!\\ % \!\pcol@freshpage!&\!\pcol@output@end! % \end{tabular} % \end{itemize} %  % Since we represent $\cc_c$ as; %  % \begin{eqnarray*} % &&\Arg{\cc_c(\vb)}\Arg{\cc_c(\ft)}\Arg{\cc_c(\pd)}\Arg{\cc_c(\tl)} % \Arg{\cc_c(\ml)}\Arg{\cc_c(\bl)}\Arg{\cc_c(\dl)}\Arg{\cc_c(\tf)}|%|\\ % &&\Arg{\Arg{\cc_c(\fh)}\Arg{\cc_c(\tn)}\Arg{\cc_c(\tr)} % \Arg{\cc_c(\bn)}\Arg{\cc_c(\br)}\Arg{\cc_c(\cn)}\Arg{\cc_c(\sw)} % \Arg{\cc_c(\ep)}} % \end{eqnarray*} %  % in the body of $|\pcol@col|{\cdot}c$, %  % \SpecialArrayIndex{c}{\pcol@col} %  % we restore first eight by \!\pcol@igetcurrcol! giving everything above as % its arguments by the expansion of % $$ % \!\csname!| pcol@col|\!\number!\!\pcol@currcol!\!\endcsname! % $$ % and then of the resulting control sequence. Then this macro gives its % ninth argument to \!\pcol@iigetcurrcol! which restores the last eight. We % also do % $$ % \!\global!\!\columnwidth!|\pcol@columnwidth|{\cdot}c % $$ %  % \SpecialArrayIndex{c}{\pcol@columnwidth} %  % by a pair of \!\expandafter! for the first two control sequences. % % Note that the restore operations are \!\global!, except for $\cc_c(\vb)$ % and $\cc_d(\ft)$ because they are referred to only in \!\output!, % including \CSIndex{if@nobreak} for which \!\@nobreaktrue! and % \!\@nobreakfalse! are defined \!\global! by \LaTeX. Also note that % \!\dimen!-type parameters are saved in the form of integers and thus % restoring them needs to specify the unit |sp|. %  % \begin{macrocode} \def\pcol@getcurrcol{% \expandafter\expandafter\expandafter\pcol@igetcurrcol \csname pcol@col\number\pcol@currcol\endcsname \expandafter\global\expandafter\columnwidth \csname pcol@columnwidth\number\pcol@currcol\endcsname} \def\pcol@igetcurrcol#1#2#3#4#5#6#7#8#9{% \def\@currbox{#1}\def\pcol@currfoot{#2}\global\pcol@prevdepth#3sp\relax \gdef\@toplist{#4}\gdef\@midlist{#5}\gdef\@botlist{#6}\gdef\@deferlist{#7}% \global\pcol@textfloatsep#8sp\pcol@iigetcurrcol#9} \def\pcol@iigetcurrcol#1#2#3#4#5#6#7#8{% \global\@textfloatsheight#1sp\relax \global\@topnum#2\relax \global\@toproom#3sp\relax \global\@botnum#4\relax \global\@botroom#5sp\relax \global\@colnum#6\relax \global\@afterindentfalse \@nobreaktrue \ifcase#7 \@nobreakfalse \or \global\@afterindenttrue \else \relax \fi \global\everypar{#8}} % \end{macrocode} % \end{macro}\end{macro}\end{macro} %  % \begin{macro}{\pcol@getcurrfoot} % \changes{v1.2-2}{2013/05/11} % {Add an argument being \cs{box} or \cs{copy}} %  % The macro $\!\pcol@getcurrfoot!\arg{com}$ is invoked from % \!\pcol@startcolumn! (\!\copy!, $\pp^f(p)$), % \!\pcol@restartcolumn! (\!\copy!\slash\!\box!, $\pp^f(p)$\slash$\cc_c(\ft)$), % \!\pcol@flushcolumn! (\!\box!, $\cc_c(\ft)$) and \!\pcol@imakeflushedpage! % (\!\box!, $\cc_c(\ft)$) to put everything in $\!\pcol@currfoot!$, having % the second element in the parens following macro names, into \!\footins! % using $\arg{com}$ shown as the first element in parens for the \!\box! % component. That is, if the source $\pp^f(p)$ or $\cc_c(\ft^b)$ is void, % we let $\!\box!{\cdot}\!\footins!$ be so. Otherwise, we move \!\box!, % \!\count!, \!\dimen! and \!\skip! of the source into those of % \!\footins!\footnote{ %  % Moving \!\count!, \!\dimen! and \!\skip! is redundant almost always % because it is very unlikely that these footnote parameters are modified % dynamically. Moreover, dynamic modification of them is hardly consistent % with repetitive self-\!\insert!ion of \!\footins! in % \!\pcol@restartcolumn! and \!\@reinserts! of \LaTeX. However, we dare to % move them in order to, for example, allow each column has its own footnote % parameters.}. %  %  % \begin{macrocode} \def\pcol@getcurrfoot#1{% \ifvoid\pcol@currfoot \global\setbox\footins\box\voidb@x \else \global\setbox\footins#1\pcol@currfoot \global\count\footins\count\pcol@currfoot \global\dimen\footins\dimen\pcol@currfoot \global\skip\footins\skip\pcol@currfoot \fi} % \end{macrocode} % \end{macro} %  % \begin{macro}{\pcol@setcurrcol} % \changes{v1.0}{2011/10/10} % {Add save of \cs{pcol@textfloatsep}.} % \changes{v1.3-4}{2013/09/17} % {Remove $\kappa_c(\mu)\EQ\cs{@mparbottom}$ from the body of % $\cs{pcol@col}{\cdot}c$ because it is no longer in the column % context.} %  % \begin{macro}{\pcol@setcurrcolnf} % The macro \!\pcol@setcurrcol! is invoked from \!\pcol@output@switch!, % \!\pcol@measurecolumn! and \!\pcol@synccolumn! to save \cctext{} of % $c=\!\pcol@currcol!$ in $\cc_c$. It is also used in \!\pcol@setcurrcolnf! % invoked from \!\pcol@output@start!, \!\pcol@flushcolumn!, % \!\pcol@imakeflushedpage!, \!\pcol@iflushfloats! and \!\pcol@freshpage! for % the saving when the \colpage{} is known to have no footnotes. % % The macro \!\pcol@setcurrcol! at first calculates the combined code for % \CSIndex{if@nobreak} and \CSIndex{if@afterindent}, and then saves % parameters into $\cc_c$ by \!\xdef! to have the sequence shown in the % description of \!\pcol@getcurrcol!. Note that \!\dimen!-type parameters % are saved by expansions with \!\number! and thus as decimal integers. % % The macro \!\pcol@setcurrcolnf! \!\def!ines $\cc_c(\ft)=\!\pcol@currfoot!$ % as \!\voidb@x!, and then invoke \!\pcol@setcurrcol! for saving. %  % \begin{macrocode} \def\pcol@setcurrcol{{\let\@elt\relax \@tempcnta\if@nobreak\if@afterindent\@ne\else\tw@\fi\else\z@\fi \expandafter\xdef\csname pcol@col\number\pcol@currcol\endcsname{% {\@currbox}{\pcol@currfoot}{\number\pcol@prevdepth}% {\@toplist}{\@midlist}{\@botlist}{\@deferlist}{\number\pcol@textfloatsep}% {{\number\@textfloatsheight}% {\number\@topnum}{\number\@toproom}{\number\@botnum}{\number\@botroom}% {\number\@colnum}{\number\@tempcnta}{\the\everypar}}}}} \def\pcol@setcurrcolnf{\def\pcol@currfoot{\voidb@x}\pcol@setcurrcol} % \end{macrocode} % \end{macro}\end{macro} % % \begin{macro}{\pcol@putbackmvl} % \changes{v1.2-1}{2013/05/11} % {Introduced to restart a column with coloring.} % \changes{v1.3-1}{2013/09/17} % {Renamed from \cs{pcol@restorecst@restart} and the operations to % save pre-spanning-text stuff is added.} % \changes{v1.33-2}{2016/11/19} % {Add {\tt\%} to the end of the line to open \cs{vbox} for % \cs{pcol@prespan} to obey the coding convention.} % \changes{v1.34}{2018/05/07} % {Change nullification of % $\mathit{\Gamma}_s\EQ\cs{pcol@colorstack@saved}$ from \cs{gdef} to % \cs{box}-assignment of $\bot$ because it is now a \cs{vbox}.} %  % The macro \!\pcol@putbackmvl!, solely used in % \!\pcol@restartcolumn!, has two functions; \colorstack{} restoration and % \prespan{} preservation. It examines the emptiness of the \colpage{} of the % column $c$ to be restarted in $\cc_c(\vb)=\!\@currbox!$. If so, the % \colorstack{} $\CST^c$ is saved into $\csts=\!\pcol@colorstack@saved!$ by % \!\pcol@savecolorstack! as the opening \colorctext{} of the \colpage{}, % and \!\pcol@prespan! for \prespan{} is made $\bot$. % % Otherwise, $\csts$ is let $\bot$ because the opening \colorctext{} has % already been put when we left from the \colpage{}. Then if % $\CSIndex{ifpcol@sptextstart}=\true$ to mean a \mctext{} is to start, we % save $\cc_c(\vb)$ into \!\pcol@prespan! adding the coloring \!\special!s % to restore \colorctext{} from $\CST^c$ by % \!\pcol@restorecolorstack!\footnote{ %  % If \cs{pcol@prespan} is connected to (the first part of) the \mctext, % the reestablishment of the \colorstack{} here correctly places coloring % \cs{special}s in \texttt{.dvi}. On the other hand, if the \mctext{} is % stowed away to the next page as a whole, the reestablishment here is % essential for the correct paring of the pushes and pops, the latter of % which are at the bottom of the \colpage{} whose tail is \cs{pcol@prespan}.}. %  % We also shrink $\cc_c(\vb^r)=\!\@colroom!$ by the height of the \prespan{} % so that \mctext{} will be captured by \!\pcol@makecol! if it is broken % into two (or more) pages, and put a invisible \!\hrule! to the main % vertical list letting $\!\topskip!=0$ to suppress \!\topskip! insertion % prior to the \mctext{} but instead to make the text led by % \!\baselineskip! (or \!\lineskip!) according to the \!\prevdepth! being % the depth of the tallest column and the height of the first \!\hbox! in % the \mctext. Otherwise, i.e., if $\CSIndex{ifpcol@sptextstart}=\false$, % we simply put back $\cc_c(\vb)$ into the main vertical list and then the % coloring \!\special!s by \!\pcol@restorecolorstack!. % % Note that $\CSIndex{ifpcol@sptextstart}$ is temporarily made $\false$ by % this macro if the \!\pcol@output@switch! invoking \!\pcol@restartcolumn! % did not make \sync{}ed \cswitch{}, i.e., if $\CSIndex{ifpcol@flush}=\true$ % to mean the page is flushed before the \sync{}ation, or % $\CSIndex{ifpcol@sync}=\false$ for \cscan{}ning prior to the \sync{}ation. %  % \begin{macrocode} \def\pcol@putbackmvl{% \ifpcol@flush \pcol@sptextstartfalse \fi \ifpcol@sync\else \pcol@sptextstartfalse \fi \pcol@ifempty\@currbox {\pcol@savecolorstack \ifpcol@sptextstart \global\setbox\pcol@prespan\box\voidb@x \fi}% {\global\setbox\pcol@colorstack@saved\box\voidb@x \ifpcol@sptextstart \global\setbox\pcol@prespan\vbox{% \unvbox\@currbox \pcol@restorecolorstack}% \global\advance\@colroom-\ht\pcol@prespan \global\topskip\z@ \hrule\@height\z@\@width\z@ \else \unvbox\@currbox \pcol@restorecolorstack \fi}} % \end{macrocode} % \end{macro} % % % % \KeepSpace{3} % \subsection{Color Management} % \label{sec:imp-sout-color} %  % \changes{v1.2-1}{2013/05/11} % {Add the subsection ``Color Management'' to describe newly % introduced macros for coloring.} % \changes{v1.3-6}{2013/09/17} % {Move commands outside \cs{output} routine to the newly introduced % section ``Commands for Text Coloring'' to distinguish % macros inside and outside \cs{output} routine.} % \changes{v1.22}{2013/06/30} % {\cs{pcol@output@cpush} was introduced for color stack pushing but % removed in v1.34.} % \changes{v1.34}{2018/05/07} % {\cs{pcol@output@cpush} is removed according to the change of text % coloring from \cs{output} to \cs{insert}.} % \changes{v1.22}{2013/06/30} % {\cs{pcol@output@icpush} was introduced to implement % \cs{pcol@output@cpush} but removed in v1.34.} % \changes{v1.34}{2018/05/07} % {\cs{pcol@output@icpush} is removed according to the change of text % coloring from \cs{output} to \cs{insert}.} % \changes{v1.24}{2013/07/27} % {\cs{pcol@output@mcpush} was introduced for coloring specified in % math mode but removed in v1.34.} % \changes{v1.34}{2018/05/07} % {\cs{pcol@output@mcpush} is removed according to the change of text % coloring from \cs{output} to \cs{insert}.} % \changes{v1.24}{2013/07/27} % {\cs{pcol@output@imcpush} was introduced for coloring specified in % math mode but removed in v1.34.} % \changes{v1.34}{2018/05/07} % {\cs{pcol@output@imcpush} is removed according to the change of text % coloring from \cs{output} to \cs{insert}.} % \changes{v1.22}{2013/06/30} % {\cs{pcol@output@cpop} was introduced for color stack popping but % removed in v1.34.} % \changes{v1.34}{2018/05/07} % {\cs{pcol@output@cpop} is removed according to the change of text % coloring from \cs{output} to \cs{insert}.} % \changes{v1.2-1}{2013/05/11} % {\cs{pcol@reset@color@elt} was introduced to implement % \cs{pcol@reset@color@pop} but removed in v1.34.} % \changes{v1.22}{2013/06/30} % {\cs{pcol@reset@color@elt} was moved from the position where % \cs{pcol@reset@color@pop} was defined % because it became to be used only by \cs{pcol@output@cpop}, but % removed in v1.34.} % \changes{v1.34}{2018/05/07} % {\cs{pcol@reset@color@elt} is removed according to the change of text % coloring from \cs{output} to \cs{insert}.} % \changes{v1.24}{2013/07/27} % {\cs{pcol@output@mcpop} was introduced for coloring specified in % math mode but removed in v1.34.} % \changes{v1.34}{2018/05/07} % {\cs{pcol@output@mcpop} is removed according to the change of text % coloring from \cs{output} to \cs{insert}.} % \changes{v1.24}{2013/07/27} % {\cs{pcol@output@mcpop@elt} was introduced for coloring specified in % math mode but removed in v1.34.} % \changes{v1.34}{2018/05/07} % {\cs{pcol@output@mcpop@elt} is removed according to the change of text % coloring from \cs{output} to \cs{insert}.} % \changes{v1.22}{2013/06/30} % {\cs{pcol@output@cset} was introduced to set $\gamma_0^c$ but % removed in v1.34.} % \changes{v1.34}{2018/05/07} % {\cs{pcol@output@cset} is removed according to the change of text % coloring from \cs{output} to \cs{insert}.} % \changes{v1.22}{2013/06/30} % {\cs{pcol@output@icset} was introduced to implement % \cs{pcol@output@cset} but removed in v1.34.} % \changes{v1.34}{2018/05/07} % {\cs{pcol@output@icset} is removed according to the change of text % coloring from \cs{output} to \cs{insert}.} % \changes{v1.22}{2013/06/30} % {\cs{pcol@return@from@color} was introduced to implement % \cs{pcol@output@cpush}, \cs{pcol@output@cpop} and % \cs{pcol@output@cset} but removed in v1.34.} % \changes{v1.34}{2018/05/07} % {\cs{pcol@return@from@color} is removed according to the change of % text coloring from \cs{output} to \cs{insert}.} % % \begin{macro}{\pcol@magicpenalty} % \begin{macro}{\pcol@ifempty} % \changes{v1.2-1}{2013/05/11} % {Introduced to examine the emptiness of the box, extracting the code % from \cs{pcol@measurecolumn} so as to be used for coloring as % well.} %  % The macro $\!\pcol@ifempty!\arg{box}\arg{then}\arg{else}$ is used in % \!\pcol@putbackmvl!, \!\pcol@clearcst@unvbox! and % \!\pcol@measurecolumn! to examine if $\arg{box}$ is empty, and to perform % $\arg{then}$ if so or $\arg{else}$ otherwise. Since \TeX{} does not % provide any convenient way for the examination unfortunately, we perform a % series of tricky operations to put the followings into \!\@tempboxa!; a % penalty of $\!\pcol@magicpenalty!=12345$ whose existence in the % $\arg{box}$ is (almost) impossible; contents of $\arg{box}$ put by % \!\unvcopy!; and then a \!\global! \!\def!inition of \!\@gtempa! to let it % have the decimal representation of \!\lastpenalty!. Since \!\lastpenalty! % has $\arg{pen}$ if the last item is $\!\penalty!\arg{pen}$, or 0 % otherwise, $\!\@gtempa!=\!\pcol@magicpenalty!$ iff $\arg{box}$ is empty. %  % \begin{macrocode} %% Special Output Routines: Color Management \def\pcol@magicpenalty{12345} \def\pcol@ifempty#1#2#3{% \setbox\@tempboxa\vbox{\penalty\pcol@magicpenalty \unvcopy#1\xdef\@gtempa{\number\lastpenalty}}% \ifnum\@gtempa=\pcol@magicpenalty\relax \def\reserved@a{#2}% \else \def\reserved@a{#3}% \fi \reserved@a} % \end{macrocode} % \end{macro}\end{macro} % % \begin{macro}{\pcol@clearcst@unvbox} % \changes{v1.2-1}{2013/05/11} % {Introduced to put coloring \cs{special}s above and below of a % column-page.} % \begin{macro}{\pcol@clearcolorstack} % \changes{v1.2-1}{2013/05/11} % {Introduced to clear color context.} % \changes{v1.34}{2018/05/07} % {Completely change its definition according to the new text coloring % with \cs{insert}.} %  % The macro \!\pcol@clearcst@unvbox!$\arg{box}$, invoked from \!\pcol@opcol! % and \!\pcol@output@switch!, puts the following above and below % $\arg{box}$ containing the main vertical list of a \colpage{} from which % we are now leaving, if \!\pcol@ifempty! judges that $\arg{box}$ is not % empty. Above the $\arg{box}$, we put coloring \!\special!s to establish % the \colorstack{} of |.dvi| saved in $\csts=\!\pcol@colorstack@saved!$ by % \!\pcol@restorecst! as the opening \colorctext{} of the \colpage{}. The % stack $\csts$, however, can be $\bot$ if $\arg{box}$ already has the % \!\special!s, i.e., when we visit the \colpage{} it had already had % some items. Below $\arg{box}$, on the other hand, we put uncoloring % \!\special!s by \!\pcol@clearcolorstack! to rewind $\CSTraw^c$ to clear the % \colorctext{} of the \colpage{} in |.dvi| temporarily so that afterward it % is made consistent with that in |.tex|. % % The macro \!\pcol@clearcolorstack!, solely invoked from % \!\pcol@clearcst@unvbox! shown above\footnote{ %  % But we have this macro to avoid the complication in \cs{def}ining % \cs{reserved@a} and \cs{reserved@b} with an argument if we did it in the % argument of \cs{pcol@ifempty} in \cs{pcol@clearcst@unvbox}.}, %  % scans $\CSTraw^c=(\Celt^c,\cstraw)$ by \!\pcol@scancst! giving % $\cstraw=\!\pcol@colorins!$ to it as its argument. Since we gives % $\cstraw$ to the macro, this scan includes removals of all $\celtpop_i$ % and $\mceltpop_{i,m}$, all $\celt_i$ having matching $\celtpop_i$, all % $\mcelt_{i,m}$ having matching $\mceltpop_{i,m}$, and all elements to % update $\Celt^c$, from $\cstraw$ to let \!\pcol@colorins! have $\cst$. % Prior to this invocation, we \!\def!ine $\!\reserved@a!\<\celt_i\>$ and % $\!\reserved@b!\<\Celt^c\>$ to let them have \!\reset@color! so that % uncoloring \!\special! will be put into the main vertical list for each % $\celt_i\in\cst$ and $\Celt^c$ before update if any, regardless of % coloring \!\special! they have. That is, we invoke \!\reset@color! as % many times as the appearance of $\celt_i\in\cst$ and once if % $\Celt^c\neq\bot$ before the invocation, ignoring the color information in % each element and the order of elements, expecting \!\reset@color! just % pops printer's \colorstack{} to rewind it as we intend. % % Note that in some printer |.def|inition could \!\def!ine \!\reset@color! to % let printer's text color be \!\current@color! to make the stack rewinding % resulting in the sequence of coloring operations with \!\current@color! at % the invocation of \!\output!. This meaningless operations might cause a % problem when a colored \colpage{} of $c_1$ is physically followed by another % \colpage{} of the succeeding column $c_2$ without any coloring, because the % \colpage{} of $c_2$ will be colored with \!\current@color! at the page break % in $c_1$. If this problem is serious, we could initialize $\Celt^c$ with % \!\current@color! at \beginparacol{} for all $c$ such that $\Celtshadow^c$ % is undefined, in order to make sure that any \colpage{} has at least one % coloring \!\special! with $\Celt^c$ at its beginning so that, for example, % coloring operations at the tail of the \colpage{} of $c_1$ is overridden % by that of the default color of $c_2$ placed at the head of its \colpage{}. %  % \begin{macrocode} \def\pcol@clearcst@unvbox#1{% \pcol@ifempty#1\relax {\pcol@restorecst\pcol@colorstack@saved \unvbox#1\pcol@clearcolorstack}} \def\pcol@clearcolorstack{% \def\reserved@a##1{\reset@color}\def\reserved@b##1{\reset@color}% \pcol@scancst\pcol@colorins} % \end{macrocode} % \end{macro}\end{macro} % % \changes{v1.2-1}{2013/05/11} % {\cs{pcol@set@color@elt} was introduced to implement color context % reestablishment but removed in v1.34.} % \changes{v1.34}{2018/05/07} % {\cs{pcol@set@color@elt} is removed according to the change of text % coloring from \cs{output} to \cs{insert}.} %  % \begin{macro}{\pcol@restorecolorstack} % \changes{v1.2-1}{2013/05/11} % {Introduced to reestablish color context.} % \changes{v1.34}{2018/05/07} % {Completely change its definition according to the new text coloring % with \cs{insert}.} % \begin{macro}{\pcol@restorecst} % \changes{v1.2-1}{2013/05/11} % {Introduced to reestablish color context.} % \changes{v1.34}{2018/05/07} % {Completely change its definition according to the new text coloring % with \cs{insert}.} %  % The macro \!\pcol@restorecolorstack!, used in \!\pcol@putbackmvl! % and \!\pcol@output@end!, makes \colorctext{} in % |.dvi| consistent with that in |.tex| by giving $\cst=\!\pcol@colorins!$ % to \!\pcol@restorecst! to let it scan $\CST^c=(\Celt^c,\cst)$. % The callee macro $\!\pcol@restorecst!\arg{box}$, also used in % \!\pcol@clearcst@unvbox! with $\arg{box}=\csts=\!\pcol@colorstack@saved!$, % invokes \!\pcol@scancst! after \!\def!ining $\!\reserved@a!\<\celt_i\>$ to % apply \!\unvbox! to $\celt_i$ in $\cst$ or $\csts$ and % $\!\reserved@b!\<\Celt^c\>$ to apply \!\unvcopy! to $\Celt^c$ so that % coloring \!\special!s they have will be put into the main vertical list. %  % \begin{macrocode} \def\pcol@restorecolorstack{\pcol@restorecst\pcol@colorins} \def\pcol@restorecst{% \def\reserved@a##1{\unvbox##1}\def\reserved@b##1{\unvcopy##1}% \pcol@scancst} % \end{macrocode} % \end{macro}\end{macro} % % \begin{macro}{\pcol@scancst} % \changes{v1.34}{2018/05/07} % {Introduced to implement new text coloring with \cs{insert}.} % \begin{macro}{\pcol@iscancst} % \changes{v1.34}{2018/05/07} % {Introduced to implement new text coloring with \cs{insert}.} % % \begin{Sloppy}{1500} % The macro $\!\pcol@scancst!\arg{box}$ is invoked from % \!\pcol@clearcolorstack! and \!\pcol@restorecst!. In the former % invocation, we have $\arg{box}=\cstraw=\!\pcol@colorins!$ to rewind % $\CSTraw=(\Celt^c,\cstraw)$ with $\!\reserved@a!\arg{\celt_i}$ and % $\!\reserved@b!\arg{\Celt^c}$ having \!\reset@color!. In the latter one, % we have % $\arg{box}\in\{\cst{=}\!\pcol@colorins!,\,\csts{=}\!\pcol@colorstack@saved!\}$ % to reestablish $\CST^c=(\Celt^c,\cst)$ or $\csts$ with % $\!\reserved@a!\arg{\celt_i}$ to apply \!\unvbox! to $\celt_i$ and % $\!\reserved@b!\arg{\Celt^c}$ to apply \!\unvcopy! to $\Celt^c$. % Therefore, if $\arg{box}=\!\pcol@colorins!$, we at first put (un)coloring % \!\special! for $\Celt^c$, unless it is $\bot$, to the main vertical % list applying \!\reserved@b! to it. This means the \!\special! for % $\Celt^c$ is put first prior to those for elements in $\cstraw$ or $\cst$ % consistently in reestablishing but not in rewinding. However as we % discussed in the description of \!\pcol@clearcolorstack!, the order of % rewinding does not affect the result for almost all printers because only % the number of pop operations is significant for them\footnote{ %  % And even for the minority because multiple updates of printer's color with % one particular color are independent of the order of them.}. %  % Then if $\arg{box}\neq\bot$ we invoke \!\pcol@iscancst! to examine the % contents of $\arg{box}$ from its bottom to top. Prior to the invocation, % we do the following; let \!\@tempboxa! have an empty \!\vbox! as its initial % value of reformed $\arg{box}$; let \!\pcol@tempboxa! have an empty % \!\vbox! as its initial value of the sequence of \!\special!s to be put % into the main vertical list; let $\npop=\!\@tempcntb!=0$; let % $M=\!\reserved@b!=()$ as its initial value of the list of identifiers of % math-mode pops; $\CSIndex{if@tempswa}=\true$ to mean the first \!\vbox! to % update $\Celt^c$ found in the scan (i.e., the bottommost one) is % effective. % \end{Sloppy} % % In the macro \!\pcol@iscancst!, we repeatedly examine the last \!\vbox! in % $\arg{box}$ taken by \!\lastbox! into $\celt=\!\pcol@tempboxb!$ until % $\celt$ becomes $\bot$, and perform one of the following for $\celt$. %  % \begin{enumerate}\def\labelenumi{(\arabic{enumi})} % \def\HT{\mathit{height}}\def\DP{\mathit{depth}}\def\WD{\mathit{width}} % \item % If $\HT(\celt)=0$ and $\WD(\celt)=0$ to mean $\celt=\celtpop_i$, increment % $\npop$. % % \item % If $\HT(\celt)=0$ and $\WD(\celt)=m>0$ to mean $\celt=\mceltpop_{i,m}$, let % $M=(m,M)$. % % \item % If $\HT(\celt)\neq0$, $\DP(\celt)=0$ and $\WD(\celt)=0$ to mean % $\celt=\celt_i$, decrement $\npop$ if $\npop>0$, or otherwise add $\celt$ % to the head of \!\@tempboxa! and apply $\!\reserved@a!\arg{\celt}$ to add % its result to the head of \!\pcol@tempboxa!. % % \item % If $\HT(\celt)\neq0$, $\DP(\celt)=0$ and $\WD(\celt)=m>0$ to mean % $\celt=\mcelt_{i,m}$, do nothing if $m\in M$, or otherwise add $\celt$ % to the head of \!\@tempboxa! and apply $\!\reserved@a!\arg{\celt}$ to add % its result to the head of \!\pcol@tempboxa!. % % \item % If $\HT(\celt)\neq0$, $\DP(\celt)\neq0$ to mean $\celt$ has a \!\special! % with which $\Celt^c$ is updated. If $\CSIndex{if@tempswa}=\true$ to mean % $\celt$ is the first (bottommost) occurrence, $\Celt^c$ is updated % acquiring an \!\insert! from \!\@freelist! if it was $\bot$. In this % case of $\bot$, we have to put an uncoloring \!\special! by % \!\reset@color!, because \!\pcol@scancst! did not do it but % \!\columncolor! or \!\normalcolumncolor! pushed the corresponding color % \!\special!. Then we let $\CSIndex{if@tempswa}=\false$. % % Otherwise, i.e., if $\CSIndex{if@tempswa}=\false$ for second or succeeding % occurrences, we do nothing because updates by them are overridden by the % first one. % \end{enumerate} %  % Note that the cases other than (3) and (4) happen only in rewinding, and % thus in reestablishing we only have (3) and (4) with $\npop=0$ and $M=()$ % always so that every $\celt$ is kept into new $\arg{box}$ and a coloring % \!\special! for it will be put into the main vertical list. % % Then we go back to \!\pcol@scancst! to let $\arg{box}=\!\@tempboxa!$, % meaningless in reestablishing but not harmful, and put the contents of % \!\pcol@tempboxa! to the main vertical list. % %  % \begin{macrocode} \def\pcol@scancst#1{% \@tempcnta#1\relax \ifnum\@tempcnta=\pcol@colorins \ifvoid\pcol@ccuse{@box}\else \reserved@b{\pcol@ccuse{@box}}\fi \fi \ifvoid\@tempcnta\else \setbox\@tempboxa\vbox{}\setbox\pcol@tempboxa\vbox{}\@tempcntb\z@ \def\reserved@b{}\let\@elt\relax \@tempswatrue \pcol@iscancst \global\setbox\@tempcnta\box\@tempboxa \unvbox\pcol@tempboxa \fi} \def\pcol@iscancst{% \setbox\@tempcnta\vbox{% \unvbox\@tempcnta \global\setbox\pcol@tempboxb\lastbox}% \ifvoid\pcol@tempboxb \let\reserved@c\relax \else \let\reserved@c\pcol@iscancst \ifdim\ht\pcol@tempboxb=\z@ \ifdim\wd\pcol@tempboxb=\z@ \advance\@tempcntb\@ne \else \edef\reserved@b{\@elt{\number\wd\pcol@tempboxb}\reserved@b}% \fi \else\ifdim\dp\pcol@tempboxb=\z@ \ifdim\wd\pcol@tempboxb=\z@ \ifnum\@tempcntb>\z@ \advance\@tempcntb\m@ne \else \setbox\@tempboxa\vbox{\copy\pcol@tempboxb \unvbox\@tempboxa}% \setbox\pcol@tempboxa\vbox{% \reserved@a\pcol@tempboxb \unvbox\pcol@tempboxa}% \fi \else \count@\wd\pcol@tempboxb \chardef\reserved@d\z@ \def\@elt##1{\ifnum##1=\count@ \chardef\reserved@d\@ne \fi}% \reserved@b \let\@elt\relax \ifnum\reserved@d=\z@ \setbox\@tempboxa\vbox{\copy\pcol@tempboxb \unvbox\@tempboxa}% \setbox\pcol@tempboxa\vbox{% \reserved@a\pcol@tempboxb \unvbox\pcol@tempboxa}% \fi \fi \else\if@tempswa \ifvoid\pcol@ccuse{@box}% \@next\@currbox\@freelist{\global\setbox\@currbox\vbox{}}\pcol@ovf \pcol@ccxdef{\@currbox}\reset@color \fi \global\setbox\pcol@ccuse{@box}\vbox{\unvbox\pcol@tempboxb}% \@tempswafalse \fi\fi\fi \fi \reserved@c} % \end{macrocode} % \end{macro}\end{macro} % % \begin{macro}{\pcol@savecolorstack} % \changes{v1.2-1}{2013/05/11} % {Introduced to save the opening color context of a column-page.} % \changes{v1.34}{2018/05/07} % {Completely change its definition according to the new text coloring % with \cs{insert}.} %  % The macro \!\pcol@savecolorstack! is used in \!\pcol@startcolumn!, % \!\pcol@output@start! and \!\pcol@putbackmvl! to save the opening % \colorctext{} in $\CST^c$ of a \ccolpage{} $c$ known to be or found empty % into $\csts=\!\pcol@colorstack@saved!$. If both of % $\Celt^c=|\pcol@columncolor@box|\cdot c$ and $\cst=\!\pcol@colorins!$ are % $\bot$, $\csts$ is let be $\bot$. Otherwise, $\csts$ is let be a \!\vbox! % having a \!\vbox! for $\Celt^c$ at the top if it is not $\bot$ and then the % contents of $\cst$ if it is not $\bot$. %  % \SpecialArrayIndex{c}{\pcol@columncolor@box} %  % \begin{macrocode} \def\pcol@savecolorstack{% \ifvoid\pcol@colorins \@tempswafalse \else \@tempswatrue \fi \ifvoid\pcol@ccuse{@box}% \setbox\@tempboxa\box\voidb@x \else \setbox\@tempboxa\vbox{\unvcopy\pcol@ccuse{@box}}% \ht\@tempboxa1sp \dp\@tempboxa\z@ \wd\@tempboxa\z@ \@tempswatrue \fi \if@tempswa \global\setbox\pcol@colorstack@saved\vbox{% \ifvoid\@tempboxa\else \box\@tempboxa \fi \ifvoid\pcol@colorins\else \unvcopy\pcol@colorins \fi} \else \global\setbox\pcol@colorstack@saved\box\voidb@x \fi} % \end{macrocode} % \end{macro} %  % \changes{v1.2-1}{2013/05/11} % {\cs{pcol@colorstack@full} was introduced to represent % $\string\mathit{\Gamma}^c$ but removed in v1.34.} % \changes{v1.34}{2018/05/07} % {\cs{pcol@colorstack@full} is removed according to the change of text % coloring from \cs{output} to \cs{insert}.} %  % \KeepSpace{3} % \begin{macro}{\pcol@ccuse} % \changes{v1.34}{2018/05/07} % {Introduced to implement new text coloring with \cs{insert}.} % \begin{macro}{\pcol@ifccdefined} % \changes{v1.34}{2018/05/07} % {Introduced to implement new text coloring with \cs{insert}.} % \begin{macro}{\pcol@ccxdef} % \changes{v1.34}{2018/05/07} % {Introduced to implement new text coloring with \cs{insert}.} %  % The macro $\!\pcol@ccuse!\arg{pfx}$ is to expand a macro % $|\pcol@columncolor|\cdot\arg{pfx}\cdot c$ for the current column $c$. It % is used in \!\pcol@output@start! and \!\pcol@scancst@shadow! with % $\arg{pfx}=\hbox{`'}$ to have $\Celtshadow^c$, and in \!\pcol@scancst!, % \!\pcol@iscancst!, \!\pcol@savecolorstack!, \!\pcol@output@end! and % \!\pcol@icolumncolor! with $\arg{pfx}=|@box|$ to have $\Celt^c$. %  % \SpecialArrayIndex{c}{\pcol@columncolor} % \SpecialArrayIndex{c}{\pcol@columncolor@box} % % The macro $\!\pcol@ifccdefined!\arg{then}\arg{else}$ is used in % \!\pcol@output@start! and \!\pcol@scancst@shadow! to examine whether % $\Celtshadow^c=|\pcol@columncolor|\cdot c$ is defined and to do % $\arg{then}$ if so or $\arg{else}$ otherwise. %  % \SpecialArrayIndex{c}{\pcol@columncolor} % % The macro $\!\pcol@ccxdef!\arg{body}$ \!\xdef!ines a macro % $\Celt^c=|\pcol@columncolor@box|\cdot c$ as $\arg{body}$ for the current % column $c$. It is used in \!\pcol@output@start!, \!\pcol@iscancst! and % \!\pcol@icolumncolor! with $\arg{body}=\!\@currbox!$ when an \!\insert! % for $\Celt^c$ is acquired, and in \!\pcol@output@end! with % $\arg{body}=\!\voidb@x!$ after releasing $\Celt^c$ to \!\@freelist!. %  % \SpecialArrayIndex{c}{\pcol@columncolor@box} %  % \begin{macrocode} \def\pcol@ccuse#1{\@nameuse{pcol@columncolor#1\number\pcol@currcol}} \def\pcol@ifccdefined#1#2{% \expandafter\ifx\csname pcol@columncolor\number\pcol@currcol\endcsname\relax #2\else#1\fi} \def\pcol@ccxdef#1{% \expandafter\xdef \csname pcol@columncolor@box\number\pcol@currcol\endcsname{#1}} % \end{macrocode} % \end{macro}\end{macro}\end{macro} % % % % \subsection{Footnote Handling} % \label{sec:imp-sout-scfnote} % \changes{v1.2-2}{2013/05/11} % {Add the subsection ``Footnote Handling'' to describe newly % introduced macros for page-wise footnotes.} % % \begin{macro}{\pcol@savefootins} % \changes{v1.2-2}{2013/05/11} % {Introduced to save footnotes in multiple occasions.} %  % The macro $\!\pcol@savefootins!\arg{cs}$, invoked from \!\pcol@makecol! % for \Scfnote{}s and from \!\pcol@output@switch! for both \mcfnote{} and % \Scfnote{}s, saves \!\footins! to an \!\insert! register obtained by % \!\@next! from \!\@freelist!, and \!\def!ines $\arg{cs}$ being % \!\pcol@currfoot! or \!\pcol@footins! so that it has the register as its % body and the register is then saved into $\pp^f(p)$ or $\cc_c(\ft)$. We % save not only \!\box! component of \!\footins! but also \!\count!, % \!\dimen! and \!\skip!\footnote{ %  % Knowing these three components are virtually constants.}. %  % \begin{macrocode} %% Special Output Routines: Footnote Handling \def\pcol@savefootins#1{% \@next#1\@freelist{% \global\setbox#1\box\footins \global\count#1\count\footins \global\dimen#1\dimen\footins \global\skip#1\skip\footins}{\def#1{\voidb@x}\pcol@ovf}} % \end{macrocode} % \end{macro} % % \begin{macro}{\pcol@shrinkcolbyfn} % \changes{v1.2-2}{2013/05/11} % {Introduced to shrink \cs{@colht} temporarily by the % height-plus-depth of page-wise footnotes and the natural size % of the skip above them.} % \changes{v1.3-3}{2013/09/17} % {Add the first argument $\langle\string\mathit{height}\rangle$ for % the user \cs{pcol@ioutputelt}.} % \changes{v1.3-6}{2013/09/17} % {Add the third argument $\langle\string\mathit{skip}\rangle$ to % avoid accidental destruction of \cs{@tempdimb} which was modified % unconditionally.} %  % The macro $\!\pcol@shrinkcolbyfn!\arg{height}\arg{ins}\arg{skip}$, invoked % from \!\pcol@makecol!, \!\pcol@ioutputelt!, \!\pcol@startcolumn!, % \!\pcol@restartcolumn!, \!\pcol@flushcolumn! and \!\pcol@makeflushedpage!, % shrinks $\arg{height}\in\{\!\@colht!,\!\@tempdima!\}$ temporarily so that a % column or the set of all columns resides in a page with \Scfnote{}s in the % \!\insert! $\arg{ins}$. The shrinkage is calculated by adding the sum of % the height plus depth of all footnotes, i.e., that of $\arg{ins}$, and the % natural component of $\!\skip!\arg{ins}$, i.e., the vertical space % inserted between the columns and the footnotes. Note that the stretch and % shrink components of $\!\skip!\arg{ins}$ cannot be incorporated into the % calculation but their contribution to each \colpage{} is taken care of by % the following macro \!\pcol@unvbox@cclv! if required. Also note that the % inverse of $\!\skip!\arg{ins}$ is kept in $\arg{skip}$ if it is not % \!\relax! so that \!\pcol@deferredfootins! knows $\arg{ins}\neq\bot$ when % this macro is invoked from \!\pcol@startcolumn! and % \!\pcol@restartcolumn! with $\arg{skip}=\!\@tempdimb!$. %  % \begin{macrocode} \def\pcol@shrinkcolbyfn#1#2#3{% \ifx#3\relax\else #3-\skip#2\relax \fi \advance#1-\ht#2\advance#1-\dp#2\advance#1-\skip#2\relax} % \end{macrocode} % \end{macro} %  % \begin{macro}{\pcol@unvbox@cclv} % \changes{v1.2-2}{2013/05/11} % {Introduced to add stretch/shrink components of % \cs{skip}\cs{footins} at the bottom of a column-page if the page has % page-wise footnotes.} %  % The macro $\!\pcol@unvbox@cclv!\arg{ins}$, invoked from \!\pcol@makecol! and % \!\pcol@flushcolumn! when they work on a column-page with \Scfnote{}s, % adds the stretch and shrink components of $\!\skip!\arg{ins}$ at the end % of \!\box!|255|, where $\arg{ins}$ is non-void $\pp^f(p)$ having % \Scfnote{}s. Before the addition, the macro goes back to the baseline of % \!\box!|255|\footnote{ %  % The comparison of the depth of \cs{box}\texttt{255} and \cs{@maxdepth} and % taking the latter if it is smaller is really just-in-case.} %  % to nullify the baseline progress mechanism so as to make it sure the exact % amount of the vertical skip is added. Then it adds the stretch and shrink % by at first adding the skip itself and then the negative amount of its % natural component. %  % \begin{macrocode} \def\pcol@unvbox@cclv#1{% \@tempdima\dp\@cclv \unvbox\@cclv \vskip \ifdim\@tempdima>\@maxdepth -\@maxdepth \else -\@tempdima \fi \vskip\skip#1\@tempdima\skip#1\vskip-\@tempdima} % \end{macrocode} % \end{macro} % % \begin{macro}{\pcol@deferredfootins} % \changes{v1.2-2}{2013/05/11} % {Introduced to insert deferred footnotes.} % \changes{v1.3-6}{2013/09/17} % {Fix the bug that the height cap was underestimated by the duplicated % subtraction of \cs{skip}\cs{footins} if the page has already have % non-deferred footnotes.} %  % The macro $\!\pcol@deferredfootins!\arg{macro}$, invoked from % \!\pcol@startcolumn! and \!\pcol@restartcolumn!, tries to \!\insert! some % of leading deferred footnotes in $\df$ through \!\footins!\footnote{ %  % The argument $\arg{macro}$ has the invoker itself shown in debug % messages.}. %  % In order to avoid that \!\footins! has footnotes across three or more % pages to make confusion in the order of footnotes kept inside of \TeX, we % cap the total height of footnotes by $h=\!\@colht!$ if it has already % shrunk by non-deferred footnotes in the page we are working on indicated % by $\!\@tempdimb!<0$, or $h=\!\@colht!-\!\skip!\!\footins!$ if the page % does not have non-deferred footnotes indicated by $\!\@tempdimb!=0$. That % is, we extract leading elements of $\df$ by \!\vsplit! until their total % height reaches $h$ and, if some elements are obtained in \!\@tempboxa!, % \!\insert! them through \!\footins!. As for the remaining elements if % any, we add a leading \!\penalty!\!\interlinepenalty! which should have % been removed by \!\vsplit!. % % Note that we temporarily let $\!\splitmaxdepth!=\!\@maxdepth!$, % $\!\splittopskip!=0$ and $\!\vbadness!=\infty$ at the \!\vsplit! so that % the depth of the split first half is \!\@maxdepth! at deepest, the second % half does not have any skip at its top, and \TeX{} will not complain of % (almost) inevitable underfull. Also note that the successful extraction % of the leading elements is examined by checking \!\ht!\!\@tempboxa! and % thus we need to \!\unvbox! it in itself because \!\vsplit! makes the % height $h$ regardless of its contents. %  % \begin{macrocode} \def\pcol@deferredfootins#1{% \ifdim\@tempdimb=\z@ \@tempdimb\@colht \advance\@tempdimb-\skip\footins \else \@tempdimb\@colht \fi \ifvoid\pcol@topfnotes\else \ifdim\@tempdimb>\z@ \begingroup \splitmaxdepth\@maxdepth \splittopskip\z@ \vbadness\@M \setbox\@tempboxa\vsplit\pcol@topfnotes to\@tempdimb \ifvoid\pcol@topfnotes\else \global\setbox\pcol@topfnotes\vbox{\penalty\interlinepenalty \unvbox\pcol@topfnotes}% \fi \setbox\@tempboxa\vbox{\unvbox\@tempboxa}% \ifdim\ht\@tempboxa>\z@ \pcol@Log#1{add}\@tempboxa \insert\footins{\unvbox\@tempboxa}% \fi \endgroup \fi\fi} % \end{macrocode} % \end{macro} % % \begin{macro}{\pcol@combinefootins} % \changes{v1.2-2}{2013/05/11} % {Introduced to put footnotes into pre-environment stuff.} % \changes{v1.35-4}{2018/12/31} % {Add the insertion of vertical skip \cs{belowfootnoteskip}.} % \begin{macro}{\pcol@putfootins} % \changes{v1.2-2}{2013/05/11} % {Introduced to put page-wise footnotes to a page.} % \changes{v1.3-2}{2013/09/17} % {Change users \cs{pcol@outputelt} to \cs{pcol@ioutputelt}.} % \changes{v1.3-6}{2013/09/17} % {Remove \cs{pcol@output@end} from users.} %  % The macro $\!\pcol@combinefootins!\arg{b}\arg{f}$, invoked solely from % \!\pcol@makenormalcol!\footnote{ %  % And thus having the arguments $\arg{b}$ and $\arg{f}$ is unnecessary, but % we keep this implementation to avoid unnecessary recoding from a % development version.}, %  % constructs the \preenv{} in \!\@outputbox!, combining the stuff in the box % $b$ and pre-environment footnotes in the \!\insert! $f$. It is almost % equivalent to the \cs{else} part of \!\@makecol! in which the main % vertical list and \Mcfnote{}s are combined. The operation to put % footnotes is almost equivalent to the second half of the \cs{else} part % except that \!\insert! is not always \!\footins! but $f$ and is done by % \!\pcol@putfootins! in which a null vertical skip is added after $f$ but % this skip is removed by \!\unskip! after the invocation. The other % difference is that the vertical space of \!\belowfootnoteskip! is added if % it is not 0\footnote{ %  % We avoid null space insertion to minimize the difference from older % versions in traced output.} %  % to have some space between non-merged \Preenv{} footnotes and the first % lines in a \env{paracol} environment. % % The null vertical skip is put for \Scfnote{}s, for which the macro % \!\pcol@putfootins! is invoked from \!\pcol@ioutputelt! and % \!\pcol@makeflushedpage!. Since we shrink the height of \colpage{}s by % the height-plus-depth of \Scfnote{}s, the natural height of the box in % which \colpage{}s and \Scfnote{}s are combined would be less than % \!\textheight! due to the depth of the last footnote line if we simply % made the footnotes the last items of the box. Though this shortage at % most \!\maxdepth! is expected to be covered by the stretch factor of % \!\skip!\!\footins! without too large badness causing an underfull % message\footnote{ %  % With default settings of $\cs{maxdimen}=5\,|pt|$ and the stretch factor % 4\,|pt| of \cs{skip}\cs{footins}, the badness $100\times(5/4)^3\approx195$ % is significantly less than the default $\cs{vbadness}=1000$.}, %  % someday we could face an underfull with some unusual settings of % \!\maxdimen!, \!\skip!\!\footins! and/or \!\vbadness!. Therefore, we put a % null vertical skip so that the real bottom of the footnotes, instead of % the last baseline, is placed at the baseline of the box, to make the % natural height of the box is \!\textheight! exactly. Note that this % shifting \Scfnote{}s up will not make last baselines of footnotes among % pages unaligned, because the last line have a strut. %  % \begin{macrocode} \def\pcol@combinefootins#1#2{% \setbox\@outputbox\vbox{% \boxmaxdepth\@maxdepth \unvbox#1\relax \pcol@putfootins#2\unskip \ifdim\belowfootnoteskip=\z@\else \vskip\belowfootnoteskip \fi}} \def\pcol@putfootins#1{% \vskip\skip#1\relax \color@begingroup \normalcolor \footnoterule \unvbox#1\relax \color@endgroup \vskip\z@} % \end{macrocode} % \end{macro}\end{macro} % % % % \KeepSpace{3} % \subsection{Marginal Notes} % \label{sec:imp-sout-mpar} % \changes{v1.3-4}{2013/09/17} % {Add this section ``Marginal Notes''.} % % \begin{macro}{\@addmarginpar} % \changes{v1.3-4}{2013/09/17} % {Made \cs{let}-equal to \cs{pcol@addmarginpar} in % \string\texttt{paracol} environments.} % \begin{macro}{\pcol@addmarginpar} % \changes{v1.3-4}{2013/09/17} % {Introduced to make a margin sharable by marginal notes from % different columns.} % \changes{v1.35-3}{2018/12/31} % {Fix the bug referring to \cs{@marbox} inappropriately.} % \changes{v1.35-3}{2018/12/31} % {Add vertical shifting of marginal note to emulate of % \cs{marginnote}.} % \begin{macro}{\pcol@@addmarginpar} % \changes{v1.3-4}{2013/09/17} % {Introduced to keep the original definition of \cs{@addmarginpar}.} % \def\swap{\mathit{swap}} %  % The macro \!\pcol@addmarginpar! is our own version of \!\@addmarginpar!, % which \!\pcol@zparacol! makes \!\let!-equal to \!\pcol@addmarginpar! % keeping its original definition in \!\pcol@@addmarginpar!. Therefore, in % an \env{paracol} environment, the \!\output! request made by \LaTeX's % \!\marginpar! in the column $c$ and page $p$ is processed by % \!\pcol@addmarginpar! through our own \!\output! routine being % \!\pcol@output!, \!\pcol@specialoutput! and \LaTeX's \!\@specialoutput!. % What we do in this macro are as follows; determine the margin which a % marginal note goes to; temporarily modify the parameter % $m_w=\!\marginparwidth!$ or $m_s=\!\marginparsep!$ according to the margin % and the column; determine the position to place the marginal note % consulting $\pp^m(p)=\!\pcol@mparbottom!$ obtained by % \!\pcol@getcurrpage!: and update $\pp^m(p)$ according to the position. % % First, there are the following parameters to determine the margin, and thus % the value of $\CSIndex{if@firstcolumn}$ referred to in \LaTeX's % \!\@addmarginpar! and meaning left if $\true$ or right if $\false$. %  % \begin{enumerate}\def\labelenumi{(\arabic{enumi})} % \item % The macros \!\pcol@mpthreshold@l! and \!\pcol@mpthreshold@r! defined by % \!\marginpar~threshold!\ give us the threshold of the column number to let % columns less than it go to the left margin while those equal to or greater % than it to the right, according to the \parapag{}e the column belongs to. % Therefore, we let $\CSIndex{if@firstcolumn}=\true$ iff % $c<\!\pcol@mpthreshold@l!\land c<\CL$ or $c<\!\pcol@mpthreshold@r!\land % c\geq\CL$, as the fundamental setting. % % \item % If $\CSIndex{ifpcol@swapmarginpar}=\true$ because the specifier `|m|' is % given to \!\twosided! explicitly or implicitly, the decision in (1) is % reversed if $\page(p)\bmod2=0$, and then this decision is reversed again % if $c\geq\CL$ and $\CSIndex{ifpcol@paired}=\false$ to mean $c$ is in a % \npaired{} right \parapag{}e. The second reversal is done because % $\page(p)$ is \emph{common} to both left and right \parapag{}es and is for % the left page in usual cases without page number jumps. Therefore, % $(\page(p)\bmod2)$ is for left \parapag{}es and thus for right counterparts % the decision should be made by $((\page(p)+1)\bmod2)$ and thus the result % should be reversed. % % \item % If \CSIndex{if@reversemargin} is made $\true$ by \LaTeX's % \!\reversemarginpar!, the decision made by (1) and then possibly reversed % by (2) is finally reversed. % \end{enumerate} %  % Second, we calculate % $$ % D=\!\@tempdima!=\sum_{d=\Cfrom}^{\swap(c)-1}(w_{\swap(d)}+g_{\swap'(d)}) % $$ % where $x'=swap(x)$ is given by % $\!\pcol@swapcolumn!\\\<\Cfrom\>\<\Cto\>$ to let % $x'=\Cto-(x-\Cfrom)-1$ if $\CSIndex{ifpcol@swapcolumn}=\true$ and % $\page(p)\bmod2=0$ or $x'=x$ otherwise, % $\swap'(x)=\!\pcol@colsepid!\in\{\swap(x)-1,x\}$ according to swapped or % not, $(\Cfrom,\Cto)\in\{(0,\CL),(\CL,\C)\}$ according to $c<\CL$ or not, % and $\w_x$ and $\gap_x$ are the width of $x$-th column and gap given by % $|\pcol@columnwidth|{\cdot}x$ and $|\pcol@columnsep|{\cdot}x$ % respectively. %  % \SpecialArrayIndex{c}{\pcol@columnwidth} % \SpecialArrayIndex{c}{\pcol@columnsep} %  % That is, $D$ is the distance from the left edge of the column $c$ to that % of leftmost column in the (parallel-) %  % \Index{parallel-paging} %  % page in which $c$ resides. Then if $\CSIndex{if@firstcolumn}=\true$ to % let the marginal note go to the left margin, we add $D$ to % $m_w=\!\marginparwidth!$ so that \LaTeX's \!\@addmarginpar! being % \!\pcol@@addmarginpar! aligns the left edge of the marginal note at the % point apart from the column's left edge by $(D+m_w)+m_s$ rather than % $m_w+m_s$, or in other words $m_w+m_s$ apart from the left edge of the % leftmost column. On the other hand if $\CSIndex{if@firstcolumn}=\false$, % we add $\WT-(D+w_c)$ where $\WT$ is \!\textwidth!, being the distance from % the right edge of the column $c$ to that of the rightmost column, to % $m_s=\!\marginparsep!$ so that \!\pcol@@addmarginpar! aligns the left % edge of the marginal note at the point apart from the column's right edge % by $\WT-(D+w_c)+m_s$ rather than $m_s$, or in other words $m_s$ apart from % the right edge of the rightmost column. % % Third, we let \Midx{\!\pcol@marbox!} be the first element of \!\@currlist! % obtained by \!\@xnext! for the right marginal note if % $\CSIndex{if@firstcolumn}=\false$, or \!\@currbox! for the left marginal % note otherwise. Then we let $t=\!\@tempdima!$ be the distance from the % top edge of the column to that of the marginal note, namely \!\@pageht! % minus the height of \!\pcol@marbox! plus |\dimen|\!\@currbox! being % downward shift amount optionally given by \!\marginnote!. We also let % $h=\!\@tempdimb!$ be the height-plus-depth of the box \!\pcol@marbox! % plus \!\marginparpush!, or in other words the vertical space the marginal % note requires. Then we give $t$ and $h$ to \!\pcol@getmparbottom! to let % \!\@mparbottom! have the bottom of the existing marginal text below which % we put the marginal text in \!\pcol@marbox!, and to let \!\pcol@mpblist! % have the new list to be replaced with $\mpb_{\{L,R\}}^{\{l,r\}}$ in % $\pp^m(p)$. % % Forth, we update $\pp^m(p)$ with the new list in \!\pcol@mpblist! by a % process similar to \!\pcol@setpageno! but with \!\pcol@setmpbelt! to scan % the list of pages $\PPP$. % % Fifth, we shift down \!\pcol@marbox! by |\dimen|\!\@currbox! and, if the % shift amount is greater than the height of the box and thus the height of % shifting result is zero, decrement \!\@mparbottom! by the amount to % deceive \LaTeX's \!\@addmarginpar! into believing \!\@mparbottom! is above % the real one by the amount. In other words, by the decrement we let % \!\@addmarginpar! see the top edge of the shifted marginal note in the % box, rather than that of the box itself, for the placement with % \!\@mparbottom!. % % Finally, we invoke \LaTeX's original \!\@addmarginpar! being % \!\pcol@@addmarginpar! to put the marginal note according to % \CSIndex{if@firstcolumn}, temporarily modified \!\marginparsep! and % \!\marginparwidth!, and \!\@mparbottom!. Note that since % \!\pcol@zparacol! lets $\CSIndex{if@twocolumn}\~=\true$, % \!\pcol@@addmarginpar! determine the margin only by % \CSIndex{if@firstcolumn}. Also note that it can be $\!\@mparbottom!>t$ % (before decrement with the positive shift amount) to mean the marginal % note should be shifted down from its natural position, and if so % \!\pcol@@addmarginpar! will give us a warning as the correct consequence % of the placement. %  % \begin{macrocode} %% Special Output Routines: Marginal Notes \def\pcol@addmarginpar{% \pcol@getcurrpage \@firstcolumntrue \ifnum\pcol@currcol<\pcol@ncolleft \let\reserved@a\z@ \let\reserved@b\pcol@ncolleft \ifnum\pcol@mpthreshold@l>\pcol@currcol\else \@firstcolumnfalse \fi \else \let\reserved@a\pcol@ncolleft \let\reserved@b\pcol@ncol \ifnum\pcol@mpthreshold@r>\pcol@currcol\else \@firstcolumnfalse \fi \fi \ifpcol@swapmarginpar \ifodd\c@page\else \if@firstcolumn \@firstcolumnfalse \else \@firstcolumntrue \fi \fi \ifpcol@paired\else \ifnum\pcol@currcol<\pcol@ncolleft\else \if@firstcolumn \@firstcolumnfalse \else \@firstcolumntrue \fi \fi\fi \fi \if@reversemargin \if@firstcolumn \@firstcolumnfalse \else \@firstcolumntrue \fi \fi \pcol@swapcolumn\pcol@currcol\count@\reserved@a\reserved@b \@tempdima\z@ \@tempcnta\reserved@a \@whilenum\@tempcnta<\count@\do{% \pcol@swapcolumn\@tempcnta\@tempcntb\reserved@a\reserved@b \advance\@tempdima\csname pcol@columnwidth\number\@tempcntb\endcsname\relax \advance\@tempdima\csname pcol@columnsep\pcol@colsepid\endcsname\relax \advance\@tempcnta\@ne}% \if@firstcolumn \advance\marginparwidth\@tempdima \else \advance\marginparsep\textwidth \advance\marginparsep-\@tempdima \advance\marginparsep-\columnwidth \fi \expandafter\@xnext\@currlist\@@\pcol@marbox\@gtempa \if@firstcolumn\let\pcol@marbox\@currbox \fi \@tempdima\@pageht \advance\@tempdima-\ht\pcol@marbox \advance\@tempdima\dimen\@currbox \@tempdimb\ht\pcol@marbox \advance\@tempdimb\dp\pcol@marbox \advance\@tempdimb\marginparpush \pcol@getmparbottom\@tempdima\@tempdimb \begingroup \@tempcnta\pcol@page \advance\@tempcnta-\pcol@basepage \edef\reserved@a{\pcol@pages\pcol@currpage}% \global\let\pcol@pages\@empty \global\let\pcol@currpage\@empty \let\@elt\pcol@setmpbelt \reserved@a \endgroup \ifdim\dimen\@currbox=\z@\else \ifdim\dimen\@currbox>\ht\pcol@marbox \advance\@mparbottom-\dimen\pcol@marbox \fi \setbox\pcol@marbox\hbox{\lower\dimen\@currbox\box\pcol@marbox}% \fi \pcol@@addmarginpar} % \end{macrocode} % \end{macro}\end{macro}\end{macro} % % \KeepSpace{3} % \begin{macro}{\pcol@getmparbottom} % \changes{v1.3-4}{2013/09/17} % {Introduced to find the space where a marginal note is placed.} % \begin{macro}{\pcol@getmparbottom@i} % \changes{v1.3-4}{2013/09/17} % {Introduced to find the space where a marginal note is placed.} % \begin{macro}{\pcol@getmpbelt} % \changes{v1.3-4}{2013/09/17} % {Introduced to find the space where a marginal note is placed.} % \changes{v1.33-1}{2016/11/19} % {Fix the bug by which $t_k$ such that $t_k\geq t$ and $t_k-t\geq h$ % but $t_k-b_{k-1}\$ is solely used in % \!\pcol@addmarginpar!\footnote{ %  % Thus giving $t$ and $h$ as arguments is not necessary but we dare to do % it.} %  % to let $B=\!\@mparbottom!$ point the bottom of the marginal note below % which a new marginal note $m$, whose natural top is at $t$ and occupancy % height is $h$, in the current column $c$ and the page $p$ is placed, or 0 % if the side margin has had no marginal notes yet. It is also \!\def!ines % $M'=\Midx{\!\pcol@mpblist!}$ having $\mpar(t',t'{+}h)$ for the new marginal % note $m$ placed at $t'$ in it and being replaced with one of % $\mpb_{\{L,R\}}^{\{l,r\}}$ in $\pp^m(p)$ by \!\pcol@setmpbelt!. % % First we examine if $\pp^m(p)=\!\pcol@mparbottom!$ is empty and if so we % simply let $B=0$ and $M'=(\mpar(t,t+h))$ because there are no marginal % notes in the page $p$ at all. Otherwise we obtain % $M\in\Set{\mpb_X^x}{X\in\{L,R\},\;x\in\{l,r\}}$ in \!\reserved@a! according % to the side margin to which the new marginal note $m$ goes to, i.e., % according to $\CSIndex{if@firstcolumn}$ and $c<\CL$ or not, by % \!\pcol@getmparbottom@i! giving it the body of $\pp^m(p)$ by % \!\expandafter!. Then we apply $\!\pcol@getmpbelt!$ to each % $\mpar(t_i,b_i)\in M$ to have % $t_k=\min\Set{t_i}{t_i\geq{t},\;t_i-\max(t,b_{i-1})\geq{h}}$ and let % $B=b_{k-1}$ and %  % \begin{eqnarray*} % M'&=&(\mpar(t_1,b_1),\;\ldots,\;\mpar(t_{k-1},b_{k-1}),\; % \mpar(\max(t,B),\,\max(t,B)+h),\\ % &&\phantom{\LP} % \mpar(t_k,b_k),\;\ldots,\;\mpar(t_n,b_n)) % \end{eqnarray*} %  % where $n=\Abs{M}$, assuming $b_0=0$. That is, we try to find the first % available gap between marginal notes below $t$ to accommodate the % marginal note $m$ of $h$ tall. Then if such $t_k$ is not found because % $t>t_n$ to mean $m$ appears below the last marginal note as in natural % cases, or $t_i-\max(t,b_{i-1})t$ to mean % there are no available gaps, we let $B=t_n$ and % $M'=(M,\mpar(\max(t,B),\,\max(t,B)+h))$ to place $m$ at the bottom. %  % \begin{macrocode} \def\pcol@getmparbottom#1#2{% \global\@mparbottom\z@ \ifx\pcol@mparbottom\@empty \begingroup \@tempdimc#2\relax \advance\@tempdimc#1\relax \let\@elt\relax \xdef\pcol@mpblist{\@elt{\number#1}{\number\@tempdimc}}% \endgroup \else \expandafter\pcol@getmparbottom@i\pcol@mparbottom \begingroup \@tempdima#1\relax \@tempdimb#2\relax \@tempswafalse \let\@elt\pcol@getmpbelt \global\let\pcol@mpblist\@empty \reserved@a \if@tempswa\else \ifdim\@tempdima<\@mparbottom \@tempdima\@mparbottom \fi \advance\@tempdimb\@tempdima \@cons\pcol@mpblist{{\number\@tempdima}{\number\@tempdimb}}% \fi \endgroup \fi} \def\pcol@getmparbottom@i#1#2#3#4{% \ifnum\pcol@currcol<\pcol@ncolleft \if@firstcolumn \def\reserved@a{#1}\else\def\reserved@a{#2}\fi \else \if@firstcolumn \def\reserved@a{#3}\else\def\reserved@a{#4}\fi \fi} \def\pcol@getmpbelt#1#2{% \ifdim#1sp<\@tempdima \global\@mparbottom#2sp\relax \@cons\pcol@mpblist{{#1}{#2}}% \ifdim\@tempdima<#2sp\relax \@tempdima#2sp\relax \fi \else \@tempdimc\@tempdima \advance\@tempdimc\@tempdimb \ifdim#1sp<\@tempdimc \@tempdima#2sp\relax \global\@mparbottom#2sp\relax \@cons\pcol@mpblist{{#1}{#2}}% \else \@cons\pcol@mpblist{{\number\@tempdima}{\number\@tempdimc}\@elt{#1}{#2}}% \@tempswatrue \def\pcol@getmpbelt##1##2{\@cons\pcol@mpblist{{##1}{##2}}} \fi \fi} % \end{macrocode} % \end{macro}\end{macro}\end{macro} % % \begin{macro}{\pcol@setmpbelt} % \changes{v1.3-4}{2013/09/17} % {Introduced to update $\pi^m(p)$.} % \begin{macro}{\pcol@setmpbelt@i} % \changes{v1.3-4}{2013/09/17} % {Introduced to update $\pi^m(p)$.} %  % The macro $\!\pcol@setmpbelt! % \Arg{\pp^p(q)}\<\pp^i(q)\>\<\pp^f(q)\>\Arg{\pp^s(q)}\Arg{\pp^m(q)}$ is % used solely in \!\pcol@addmarginpar! and is applied to $\PPP$ to update an % element $M\in\Set{\mpb_X^x}{X\in\{L,R\},x\in{l,r}}$ in $\pp^m(p)$ with % $M'=\!\pcol@mpblist!$ given by \!\pcol@getmparbottom!. The structure of % the macro is similar to \!\pcol@setpnoelt! to update $\pp^p(q)$ s.t.\ % $q\geq p$, but in this macro the target of the update is only $p$. Then % for $q=p$, we invoke \!\pcol@setmpbelt@i! giving it the body of $\pp^m(p)$ % being % $\Arg{\mpb_L^l}\Arg{\mpb_L^r}\Arg{\mpb_R^l}\Arg{\mpb_R^r}$, or % $\<\emptyset\>\<\emptyset\>\<\emptyset\>\<\emptyset\>$ if % $\pp^m(p)=\emptyset$, to obtain what $\pp^m(p)$ should have in % $\pp_{\mathit{new}}^m(p)=\!\reserved@a!$ in which $\mpb_X^x$ is replaced % with $M'$, where $X=L$ or $X=R$ if $c<\CL$ or not respectively, and $x=l$ % or $x=r$ if $\CSIndex{if@firstcolumn}=\true$ or not respectively, and then % update $\pp^m(p)$ by $\!\pcol@defcurrpage! % \Arg{\pp^p(p)}\<\pp^i(p)\>\<\pp^f(p)\>\Arg{\pp^s(p)} % \Arg{\pp_{\mathit{new}}^m(q)}$. %  % \begin{macrocode} \def\pcol@setmpbelt#1#2#3#4#5{% {\let\@elt\relax \xdef\pcol@pages{\pcol@pages\pcol@currpage}}% \ifnum\@tempcnta=\z@ \def\reserved@a{#5}% \ifx\reserved@a\@empty \pcol@setmpbelt@i{}{}{}{}\else \pcol@setmpbelt@i#5\fi \pcol@defcurrpage{#1}{#2}{#3}{#4}{\reserved@a}% \else \gdef\pcol@currpage{\@elt{#1}#2#3{#4}{#5}}% \fi \advance\@tempcnta\m@ne} \def\pcol@setmpbelt@i#1#2#3#4{% \ifnum\pcol@currcol<\pcol@ncolleft \if@firstcolumn \def\reserved@a{{\pcol@mpblist}{#2}{#3}{#4}}% \else \def\reserved@a{{#1}{\pcol@mpblist}{#3}{#4}}% \fi \else \if@firstcolumn \def\reserved@a{{#1}{#2}{\pcol@mpblist}{#4}}% \else \def\reserved@a{{#1}{#2}{#3}{\pcol@mpblist}}% \fi \fi} % \end{macrocode} % \end{macro}\end{macro} % % \begin{macro}{\pcol@mparbottom@zero} % \changes{v1.3-4}{2013/09/17} % {Introduced to give the default of \cs{pcol@mparbottom@out}.} % \begin{macro}{\pcol@mparbottom@out} % \changes{v1.3-4}{2013/09/17} % {Introduced to keep the last elements of $\pi^m(p_t)$ at % \cs{end}\string\texttt{\char`\{paracol\char`\}.}} %  % The macro $\Uidx\mpboutz=\!\pcol@mparbottom@zero!$ is used in % \!\@outputpage!, \!\pcol@getmparbottom@last! and \!\pcol@output@end! to % give the default value of $\Uidx\mpbout=\!\pcol@mparbottom@out!$ with % $\mpar(0,0)$ for all elements $M\in\Set{\mpb_X^x}{X\in\{L,R\},x=\{l,r\}}$ % to mean a page has no marginal notes carrying over from the preceding % \env{paracol} environments. % % As for $\mpbout$, besides the top level initialization to make it % $\mpboutz$, it is updated in \!\pcol@output@end! through macros % \!\pcol@getmparbottom@last! and \!\pcol@bias@mpbout! to have the last % element of each $M\in\Set{\mpb_X^x}{X\in\{L,R\},x=\{l,r\}}$ in % $\pp^m(\ptop)$ with transformation from coordinates of columns to that of % text area, or directly with $\mpboutz$ if the \lpage{} will not have % \postenv. The resulting $\mpbout$ is at first used in \!\pcol@output@end! % itself through \!\pcol@do@mpbout! to let \!\@mparbottom! have the value % $b$ of $\mpar(t,b)$ in $\mpb_L^l$ or $\mpb_L^r$ according to the side % margin which marginal notes in \postenv{} goes to. % % Then $\mpbout$ is passed to the next \env{paracol} environment if it % resides in the page where the previous environment also resides, to be % referred to by \!\pcol@output@start! which also performs % \!\pcol@do@mpbout! and \!\pcol@bias@mpbout! to let $\pp^m(0)$ have the % lists according to $\mpbout$ and $\!\@mparbottom!$ which can be modified % in \postenv{} of the previous environment or in other word % in \preenv{} of starting environment. By this setting of $\pp^m(0)$, % marginal note placement in the \spage{} is aware of the marginal notes % having been placed in previous environments and in \preenv{} and thus can % correctly examines if a marginal note to be added in a margin collide % the last one in the margin. On the other hand, if the \postenv{} % encounters a page break before a new environment starts, our own % \!\@outputpage! should be invoked at the page break to let % $\mpbout=\mpboutz$ because the marginal notes in previous environments do % not affect those in the new environment. % % Note that $\mpbout$ is also referred to and updated by % \!\pcol@do@mpb@all@i! and \!\pcol@do@mpb@all@ii! because they are used in % \!\pcol@bias@mpbout! and \!\pcol@getmparbottom@last! through % \!\pcol@do@mpb@all!. %  % \begin{macrocode} \gdef\pcol@mparbottom@zero{{\@elt{0}{0}}{\@elt{0}{0}}{\@elt{0}{0}}{\@elt{0}{0}}} \global\let\pcol@mparbottom@out\pcol@mparbottom@zero % \end{macrocode} % \end{macro}\end{macro} % % \KeepSpace{2} % \begin{macro}{\pcol@do@mpbout} % \changes{v1.3-4}{2013/09/17} % {Introduced to do specified operations on $\string\cal{M}$ and its % element $M_L^x$ according to the side margin for marginal notes % outside \texttt{paracol} environments.} % \begin{macro}{\pcol@do@mpbout@i} % \changes{v1.3-4}{2013/09/17} % {Introduced to do specified operations on $\string\cal{M}$ and its % element $M_L^x$ according to the side margin for marginal notes % outside \texttt{paracol} environments.} % \begin{macro}{\pcol@do@mpbout@whole} % \changes{v1.3-4}{2013/09/17} % {Introduced to do a specified operation on $\string\cal{M}$.} % \begin{macro}{\pcol@do@mpbout@elem} % \changes{v1.3-4}{2013/09/17} % {Introduced to do a specified operation on an element $M_L^x$ in % $\string\cal{M}$.} %  % The macro \!\pcol@do@mpbout! is used in \!\pcol@output@start! and % \!\pcol@output@end! to perform operations specified by % \!\pcol@do@mpbout@whole! and \!\pcol@do@mpbout@elem!. The macro just % invokes \!\pcol@do@mpbout@i! giving it all % $M\in\Set{\mpb_X^x}{X\in\{L,R\},x\in\{l,r\}}$ by \!\expandafter!. % % Then \!\pcol@do@mpbout@i! determines the side margin $x\in\{l,r\}$ letting % $x=l$ iff $\CSIndex{if@mparswitch}=\true$, $\page(p)\bmod2=0$ and % $\CSIndex{if@reversemargin}=\false$, to invoke \!\pcol@do@mpbout@whole! % giving it all $M$ but $\mpb_L^x$ whose sole element $\mpar(t,b)$ % may be modified by $\!\pcol@do@mpbout@elem!\!\@elt!\Arg{t}\Arg{b}$. % % In \!\pcol@output@start!, \!\pcol@do@mpbout@whole! is to \!\xdef!ine % $\mpbout$ with all $M$ and \!\pcol@do@mpbout@elem! is expanded to % $\mpar(0,B)$, where $B=\!\@mparbottom!$, regardless of $\mpb_L^x$ so that % it is replaced with $(\mpar(0,B))$ in the modified $\mpbout$ keeping other % elements unchanged. In \!\pcol@output@end!, \!\pcol@do@mpbout@whole! is % to throw all $M$ away into a \!\hbox! while \!\pcol@do@mpbout@elem! lets % $B=b$ so that the bottom of the last marginal note in the side margin % specified by $x$ is passed to \postenv{} through \!\@mparbottom!. %  % \begin{macrocode} \def\pcol@do@mpbout{\expandafter\pcol@do@mpbout@i\pcol@mparbottom@out} \def\pcol@do@mpbout@i#1#2#3#4{\@tempcnta\@ne \if@mparswitch \ifodd\c@page\else \@tempcnta\m@ne \fi\fi \if@reversemargin \@tempcnta-\@tempcnta \fi \ifnum\@tempcnta<\z@ \pcol@do@mpbout@whole{\pcol@do@mpbout@elem#1}{#2}{#3}{#4}% \else \pcol@do@mpbout@whole{#1}{\pcol@do@mpbout@elem#2}{#3}{#4}% \fi} % \end{macrocode} % \end{macro}\end{macro}\end{macro}\end{macro} % % \begin{macro}{\pcol@bias@mpbout} % \changes{v1.3-4}{2013/09/17} % {Introduced to perform coordinate transformation of the elements in % $\string\cal{M}$.} % \begin{macro}{\pcol@bias@mpbout@i} % \changes{v1.3-4}{2013/09/17} % {Introduced to perform coordinate transformation of the elements in % $\string\cal{M}$.} %  % The macro $\!\pcol@bias@mpbout!\Arg{y}$ is used in \!\pcol@output@start! % with $-y$ being the heigh-plus-depth of \preenv{}, in % \!\pcol@output@end! with $y$ being that of \spanning{} in the \lpage, and % in $\!\pcol@getmparbottom@last!\Arg{y}$ with its argument $y$. The macro % modifies $\mpar(t,b)$ in all $M\in\Set{\mpb_X^x}{X\in\{L,R\},x\in\{l,r\}}$ % of $\mpbout$ so that they have $\mpar(t{+}y,b{+}y)$ for the transformation % from text area coordinates to columns in the first and third, while for % the reverse transformation in the second, by invoking \!\pcol@do@mpb@all! % giving it $\mpbout$ and letting \!\reserved@a! have % $\!\pcol@bias@mpbout@i!\Arg{y}$. That is, % $\!\pcol@bias@mpbout@i!\Arg{y}\!\@elt!\Arg{t}\Arg{b}\!\@nil!$ is then % invoked in \!\pcol@do@mpb@all@ii! with $t$ and $b$ from $\mpar(t,b)$ in % each $M$, and then it \!\def!ines \!\reserved@b! with $\mpar(t{+}y,b{+}y)$ % so that updated $M$ has it. %  % \begin{macrocode} \def\pcol@bias@mpbout#1{\def\reserved@a{\pcol@bias@mpbout@i{#1}}% \pcol@do@mpb@all\pcol@mparbottom@out} \def\pcol@bias@mpbout@i#1\@elt#2#3\@nil{% \dimen@#2sp\relax \advance\dimen@#1\relax \dimen@ii#3sp\relax \advance\dimen@ii#1\relax \def\reserved@b{\@elt{\number\dimen@}{\number\dimen@ii}}} % \end{macrocode} % \end{macro}\end{macro} % % \begin{macro}{\pcol@getmparbottom@last} % \changes{v1.3-4}{2013/09/17} % {Introduced to let $\string\cal{M}$ have the occupancy information of % the bottom marginal note in each margin.} % \begingroup\let\small\footnotesize % \begin{macro}{\pcol@getmparbottom@last@i} % \changes{v1.3-4}{2013/09/17} % {Introduced to let $\string\cal{M}$ have the occupancy information of % the bottom marginal note in each margin.} %  % The macro $\!\pcol@getmparbottom@last!\Arg{y}$ is used solely in % \!\pcol@output@end! to let % $\mpbout=\Arg{m_L^l}\Arg{m_L^r}\Arg{m_R^l}\Arg{m_R^r}$, where % $m_X^x=\mpar(t_n,b_n)\in\mpb_X^x$, $n=\Abs{\mpb_X^x}$ assuming % $\mpar(t_0,b_0)={\mpar}(y,y)$, and $y$ is the negative counterpart of the % height-plus-depth of the \spanning{} in the \lpage. Therefore, $\mpbout$ % is let have the occupancy information of the last marginal note if any, or % the top edge of text area otherwise, in each margin. % % The macro at first examines if $\pp^m(\ptop)=\emptyset$ and, if so, lets % all elements in $\mpbout$ have $(\mpar(y,y))$ by letting it $\mpboutz$ and % then adding $y$ to each $t=b=0$ by \!\pcol@bias@mpbout! giving it $y$. % Otherwise, i.e., if $\pp^m(\ptop)\neq\emptyset$, it invokes % \!\pcol@do@mpb@all! giving it $\pp^m(\ptop)$ and letting \!\reserved@a! % have $\!\pcol@getmparbottom@last@i!\Arg{y}$. That is, % $\!\pcol@getmparbottom@last@i!\Arg{y}\~\mpar(t_1,b_1)\cdots % \mpar(t_n,b_n)\!\@nil!$ is then invoked in \!\pcol@do@mpb@all@ii! for each % $\mpb_X^x$ to let \!\reserved@b! have $\mpar(y,y)$ at first and then to % let it have $\mpar(t_i,b_i)$ for all $i\in[1,n]$. Therefore, % \!\reserved@b! should finally have $\mpar(t_n,b_n)$ assuming $t_0=b_0=y$, % and then becomes $m_X^x$. % \end{macro}\endgroup %  % \begin{macrocode} \def\pcol@getmparbottom@last#1{% \ifx\pcol@mparbottom\@empty \global\let\pcol@mparbottom@out\pcol@mparbottom@zero \pcol@bias@mpbout{#1}% \else \def\reserved@a{\pcol@getmparbottom@last@i{#1}}% \pcol@do@mpb@all\pcol@mparbottom \fi} \def\pcol@getmparbottom@last@i#1#2\@nil{% \edef\reserved@b{\@elt{\number#1}{\number#1}}% \def\@elt##1##2{\def\reserved@b{\@elt{##1}{##2}}}% #2\let\@elt\relax} % \end{macrocode} % \end{macro} % % \KeepSpace{1} % \begin{macro}{\pcol@do@mpb@all} % \changes{v1.3-4}{2013/09/17} % {Introduced to implement \cs{pcol@bias@mpbout} and % \cs{pcol@getmparbottom@last}.} % \begin{macro}{\pcol@do@mpb@all@i} % \changes{v1.3-4}{2013/09/17} % {Introduced to implement \cs{pcol@bias@mpbout} and % \cs{pcol@getmparbottom@last}.} % \begin{macro}{\pcol@do@mpb@all@ii} % \changes{v1.3-4}{2013/09/17} % {Introduced to implement \cs{pcol@bias@mpbout} and % \cs{pcol@getmparbottom@last}.} %  % The macro $\!\pcol@do@mpb@all!\$ is used in \!\pcol@bias@mpbout! with % $L=\mpbout$ and in \!\pcol@getmparbottom@last! with $L=\pp^m(\ptop)$, to % process all four elements $\mpb_X^x$ in $L$ applying \!\reserved@a! to % each of them and to let $\mpbout$ have the result through \!\reserved@b!. % The macro simply invokes \!\pcol@do@mpb@all@i! giving it the body of $L$ % by \!\expandafter!. Then $\!\pcol@do@mpb@all@i! % \Arg{\mpb_L^l}\Arg{\mpb_L^r}\Arg{\mpb_R^l}\Arg{\mpb_R^r}$ initialize % $\mpbout=\emptyset$ and then invokes \!\pcol@do@mpb@all@ii! four times % giving it each $\mpb_X^x$. Then % $\!\pcol@do@mpb@all@ii!\,\mpar(t_1,b_1)\cdots\~{\mpar}(t_n,b_n)\!\@nil!$ % invokes \!\reserved@a! giving it all of $\mpar(t_i,b_1)$ at once to % process them and to have the result in \!\reserved@b! being added to % $\mpbout$. %  % \begin{macrocode} \def\pcol@do@mpb@all#1{\expandafter\pcol@do@mpb@all@i#1} \def\pcol@do@mpb@all@i#1#2#3#4{\begingroup \let\@elt\relax \gdef\pcol@mparbottom@out{}% \pcol@do@mpb@all@ii#1\@nil\pcol@do@mpb@all@ii#2\@nil \pcol@do@mpb@all@ii#3\@nil\pcol@do@mpb@all@ii#4\@nil \endgroup} \def\pcol@do@mpb@all@ii#1\@nil{% \reserved@a#1\@nil \xdef\pcol@mparbottom@out{\pcol@mparbottom@out{\reserved@b}}} % \end{macrocode} % \end{macro}\end{macro}\end{macro} % % % % \subsection{Synchronization} % \label{sec:imp-sout-sync} % % \begin{macro}{\pcol@sync} % \changes{v1.0}{2011/10/10} % {Add measurement of $D_T$.} % \changes{v1.2-3}{2013/05/11} % {Modify the action on the page overflow to return from \cs{output} % without flushing so that the page is broken outside \cs{output} to % place top floats above the synchronization point set in the next % page.} % \changes{v1.2-2}{2013/05/11} % {Revise reflecting the redesign of page context.} % \changes{v1.2-2}{2013/05/11} % {Add pre-flushing column height check taking page-wise % footnotes into account.} % \changes{v1.3-6}{2013/09/17} % {Add the initialization of % $\cs{ifpcol@dfloats}\EQ\string\mathit{false}$ before invoking % \cs{pcol@measurecolumn}.} %  % The macro \!\pcol@sync! is invoked solely from \!\pcol@output@switch! for % \exsync{} in the following three cases in which % $\CSIndex{ifpcol@sync}\lor\CSIndex{ifpcol@clear}=\true$ commonly. %  % \begin{itemize} % \item % $\CSIndex{ifpcol@sync}\land\lnot\CSIndex{ifpcol@clear}$ to mean ordinary % \sync{}ed \cswitch. % % \item % $\CSIndex{ifpcol@sync}\land\CSIndex{ifpcol@clear}$ to mean \pfcheck. % % \item % $\lnot\CSIndex{ifpcol@sync}\land\CSIndex{ifpcol@clear}$ to mean page % flushing. % \end{itemize} %  % In any cases\footnote{ %  % In the last case of page flushing, invoking \!\pcol@flushcolumn! is % redundant because it is made $p=\ptop$ by \pfcheck{} always preceding the % flushing, but the invocation is harmless.}, %  % first we invoke \!\pcol@flushcolumn! for all $c\In0\C$ to flush the % \ccolpage{} of $c$ into $\S_c$ if the \colpage{} is not in $\ptop$, i.e., % $\cc_c(\vb^p)<\ptop$ and then, if we have deferred floats, to ship out % following \fpage{}s up to $\ptop-1$ into $\S_c$ and to place them in % $\ptop$. This float placement in $\ptop$ is only for top and bottom % floats in \sync{}ed \cswitch{}, while a \fcolumn{} may be made in other % cases. Then we ship out all pages $p$ such that $p<\ptop$ by % \!\pcol@outputcolumns! giving argument 1. After that, we obtain the % \pctext{} of $\ptop$ by \!\pcol@getcurrpinfo!. % % Next, we measure the vertical sizes of the contents in the \ccolpage{} of % $c$ which is now in $\ptop$ for all $c\In0\C$ by \!\pcol@measurecolumn! as % follows, where $h(x)$ and $d(x)$ are the height and depth of an object $x$ % respectively. %  % \begin{eqnarray*} % \sigma&=&\rlap{\!\floatsep!}\hskip8em % \sigma_t=\cases{\cc_c(\tf)& $\cc_c(\tf)<\infty$\cr % \!\textfloatsep!&$\cc_c(\tf)=\infty$}\qquad % \sigma_b=\!\textfloatsep!\\ % \Uidx\fc(t)&=&\rlap{$\displaystyle(\cc_c(\tl)\neq())$}\hskip8em % \fc(m)=(\cc_c(\vb)\neq\!\vbox!|{}|)\\ % \fc(f)&=&\rlap{$\displaystyle(\cc_c(\ft)\neq\bot)$}\hskip8em % \fc(b)=\fc(b')=(\cc_c(\bl)\neq())\\ % \Uidx\Fc(X)&=&\rlap{$\displaystyle\exists x\in X:\fc(x)$}\hskip8em % f_b=\CSIndex{ifpcol@bfbottom}\\ % \Uidx\vc(t)&=&\!\skip!{\cdot}\cc_c(\vb)= % \sum_{\Sub{\phi\in\cc_c(\tl)}}(h(\phi)+d(\phi))+ % (\Abs{\cc_c(\tl)}-1)\cdot\sigma+\sigma_t\\ % \vc(m)&=&h(\cc_c(\vb))+d(\cc_c(\vb))\\ % \vc(f)&=&h(\cc_c(\ft))+d(\cc_c(\ft))\\ % \vc(b)&=&\sum_{\Sub{\phi\in\cc_c(\bl)}}(h(\phi)+d(\phi))+ % (\Abs{\cc_c(\bl)}-1)\cdot\sigma+\sigma_b\\ % \vc(b')&=&\vc(b)+\sigma_b\\ % \pd_c&=&\cases{\cc_c(\pd)&$\fc(m)$\cr % \infty &$\lnot \fc(m)$}\\ % \Uidx\size_c(x)&=&\cases{\vc(x)&$\fc(x)$\cr % 0 &$\lnot \fc(x)$}\\ % \Uidx\Size_c(X)&=&\cases{\displaystyle\sum_{x\in X}\size_c(x)&$\Fc(X)$\cr % -\infty& $\lnot \Fc(X)$}\\ % \Uidx\VT&=&\!\@tempdima!=\max_{0\leq c<\C}\{\Size_c(\{t,m\})\}\\ % \Uidx\VB&=&\!\@tempdimb!=\max_{0\leq c<\C}\{\size_c(f)+\size_c(b)\}\\ % \Uidx\VP&=&\!\@pageht!=\max_{0\leq c<\C}\{\Size_c(\{t,m,f,b\})\}\\ % \Uidx\VPP&=&\!\pcol@colht!=\max_{0\leq c<\C}\{\Size_c(\{t,m,f,b'\})\}\\ % \Uidx\DT&=&\!\@tempdimc!=\min\Set{\pd_c}{\Size_c{\{t,m\}=\VT}}\\ % \Uidx\dc&=&\cases{ % 0& $\fc(b)\land(\lnot \fc(f)\lor f_b)$\cr % d(\cc_c(\ft))& $\fc(f)\land(\lnot \fc(b)\lor\lnot f_b)$\cr % d(\cc_c(\pd))& $\lnot \fc(b)\land\lnot \fc(f)$}\\ % \Uidx\DP&=&\!\@pagedp!=\min\Set{\dc}{\Size_c(\{t,m,f,b'\})=\VPP}\\ % \Uidx\cmax&=&\!\@tempcntb!=\ARG\max_{0\leq c<\C}\{\Size_c(\{t,m,f,b\})\} % \end{eqnarray*} %  % That is, $\VT$ is the maximum of combined vertical size (height plus % depth) of the top floats and the main vertical list, $\VB$ is that of % the footnotes and bottom floats, and $\VP$ is that of all items. % $\VPP$ is similar to $\VP$ but we add \!\textfloatsep! to the size of % bottom floats. Note that $\VT$, $\VP$ and $\VPP$ are $-\infty$ if any % \colpage{}s don't have corresponding items, while $\VB=0$ if so. % Also note that $\cmax$ is the ordinal of the column whose size is $\VP$. % % $\DT$ and $\DP$ are the minimum $\pd_c$ and $\dc$ respectively among those % gives $\VT$ and $\VPP$ respectively, where $\pd_c$ is $\cc_c(\pd)$ if % $f_m=\true$ or $\infty$ otherwise, and $\dc$ is 0 if $c$ has bottom float, % or the depth of the last footnote if any and without any bottom float, or % $\cc_c(\pd)$ otherwise. The reason why $\DT$ and $\DP$ have minimums is % that they are set into \!\prevdepth! for the items just following the % \sync{}ation point, and thus a smaller value results in a larger interline % skip and the special value $-1000\,|pt|$ to inhibit the skip by, e.g., % \!\nointerlineskip!, is given the highest priority. % % Note that $\VPP$ and $\DP$ are only for the \lpage{} and thus referred to % by \!\pcol@output@end! to close the environment, and the former is done by % \!\pcol@makeflushedpage! if it works on the page. The reason why we add % \!\textfloatsep! to $\VPP$ is to make the last page well separated from % the \postenv{} if the tallest column, taking the addition into account, % has bottom floats. Also note that we let % $\CSIndex{ifpcol@dfloats}=\false$ before scanning columns with % \!\pcol@measurecolumn! so that the switch becomes $\true$ after the scan % iff a column has deferred floats (in the \lpage{}). %  % \begin{macrocode} %% Special Output Routines: Synchronization \def\pcol@sync{% \pcol@currcol\z@ \@whilenum\pcol@currcol<\pcol@ncol\do\pcol@flushcolumn \pcol@outputcolumns\@ne \pcol@getcurrpinfo{\global\c@page}{\global\@colht}{\global\topskip}% \@tempdima-\maxdimen \@tempdimb-\maxdimen \pcol@colht-\maxdimen \@pageht-\maxdimen \@tempdimc\maxdimen \@pagedp\maxdimen \@tempcntb\z@ \pcol@dfloatsfalse \pcol@currcol\z@ \@whilenum\pcol@currcol<\pcol@ncol\do\pcol@measurecolumn % \end{macrocode} % % As described above, any items can be empty, naturally for top floats, % footnotes and bottom floats, but also including main vertical lists if the % \ccolpage{}s were not in $\ptop$ before the invocation of % \!\pcol@flushcolumn!. Moreover, all main vertical lists can be empty if % all \lcolpage{}s just have started (by \!\newpage!, for example). More % weirdly, the case of all-empty main vertical lists can be accompanied with % other non-empty items when columns have floats or footnotes which cannot % be in $\ptop-1$ but are found their places in $\ptop$. % % Taking it into account that any items can be empty and the other item % of \Scfnote{}s, we have to determine whether the following two operations % are taken; invocation of \!\pcol@synccolumn! for each \colpage{} to set a % \sync{}ation point or to add an infinite stretch (and shrink) to its % bottom; and the examination of the height of each \colpage{}, taking the % \sync{}ation point to be set into account, to tell the necessity of % explicit page break with $\CSIndex{ifpcol@flush}=\true$. For the latter % we calculate the examination target $V=\!\@tempdimb!$ to be compared with % $\pp^h(\ptop)$, while for the former we determine the value of a switch % $f=\CSIndex{if@tempswa}$ so that we invoke \!\pcol@synccolumn! iff % $f=\true$ and $V\geq0$. % % For \sync{}ed \cswitch{} with $\CSIndex{ifpcol@clear}=\false$, we let % $f=(\VT\geq0)$ to mean at least one \colpage{} has a top float or % non-empty main vertical list, i.e., $\Fc(\{t,m\})={\true}$ for some % $c\In0\C$. That is if $\VT<0$, since the next items added to all % \colpage{}s are placed at the top of the page\footnote{ %  % In usual cases, but it can mean some of them have negative vertical % sizes. Even though we can detect such a very unlikely special case, it is % very tough to define the reasonable \sync{}ation point above the top of % $\ptop$. Therefore, we assume the point is at the top of $\ptop$ and thus % do nothing.}, %  % we don't need to set \sync{}ation points in them. As for $V$, we let % $V=\max(\VT,0)+\max(\VB,0)+v^f$ where $v^f$ is the sum of % height-plus-depth of $\pp^f(\ptop)$ and $\!\skip!{\cdot}\pp^f(\ptop)$ if % $\ptop$ has \Scfnote{}s, or 0 otherwise\footnote{ %  % In the real implementation, $V=-\infty$ if $\VT=\VB=-\infty$ and no % \Scfnote{}s are presented, but this difference does not affect the % decisions because $f\land(V\geq0)=(\VT<0)\land(V\geq0)=\false$ and % $V\leq\pp^f(\ptop)$ with either $V=0$ or $V=-\infty$.}. %  % Note that it can be $\VP+v^f\leq\pp^h(\ptop)<\VT+\VB+v^f=V$ to mean % setting the \sync{}ation point at $\VT$ below $\ptop$'s top edge would % push bottom stuff beyond its bottom edge and thus we need an explicit page % break to place the point at the top of $\ptop+1$ (in usual cases). % % For \pfcheck{} or page flushing with $\CSIndex{ifpcol@clear}=\true$ on % the other hand, we let $f=\lnot\!\pcol@sync!$ to invoke \!\pcol@synccolumn! % only for page flushing and thus not for \pfcheck{}. As for $V$, we let % $V'=\VPP$ or $V'=\VP$ according as we working on \lpage{} or not, and % then let $V=\max(V',0)+v^f$ or $V=V'$ according as $\ptop$ has \Scfnote{}s % or not. That is, we have to invoke \!\pcol@synccolumn! unless $\ptop$ is % perfectly empty. % % Then if $\CSIndex{ifpcol@clear}=\false$ and % $\max(V,\;V-D'_T+\VE)>\pp^h(\ptop)$ where $D'_T=\DT$ if $0\leq\DT<\infty$ or % 0 otherwise, or $\CSIndex{ifpcol@clear}=\true$ and % $V>\pp^h(\ptop)$\footnote{ %  % The examination is redundant in page flushing with % $\CSIndex{ifpcol@sync}=\false$ because it is assured that no overflow % happens in any \colpage{} by \pfcheck{} and explicit page breaking, but is % not harmful.}, %  % we flush the page. That is, if the condition above holds, % we let $\CSIndex{ifpcol@flush}=\true$ and $d=\!\pcol@nextcol!={\cmax}$ to % tell \!\pcol@switchcol! or \!\pcol@flushclear! to make an explicit page % break in the column $\cmax$ from which we restart, and $f=\false$ to skip % \!\pcol@synccolumn! to postpone the \exsync{}. Note that the bias % $\VE=\!\pcol@@ensurevspace!$ in \sync{}ed \cswitch{} is to avoid breaking a % \colpage{} just below the \sync{}ation point due to too small space below % the point, less than \!\baselineskip! in default but can be other % threshold explicitly defined by \!\ensurevspace!. That is, % since $V-\DT+k\!\baselineskip!$ usually means the vertical position at % which $k$-th baseline below the \sync{}ation point is placed, the flushing % condition with $\VE=k\!\baselineskip!$ ensures that the page is flushed % iff the space below the point cannot accommodate $k$ lines. Also note that % necessary flushing with $V>\pp^h(p)$ assuredly takes place even when % $\DT$ is unusually large and/or $\VE$ is negative to make $-\DT+\VE<0$. % % Finally if $V\geq0$ and $f=\true$, we invoke \!\pcol@synccolumn! for each % column $c\In0\C$ to set a \sync{}ation point in it or to add an infinite % stretch (and shrink) at its bottom for flushing. %  % \changes{v1.3-6}{2013/09/17} % {Modify the flushing condition of synchronized column switching from % $V\GT\pi^h(p)$ to $\max(V,V-D_T+V_E)\GT\pi^h(p)$ to avoid page % break just below the synchronization point as much as possible.} %  % \begin{macrocode} \@tempswatrue \global\pcol@flushfalse \ifpcol@clear \ifpcol@lastpage \@tempdimb\pcol@colht \else \@tempdimb\@pageht \fi \ifpcol@sync \@tempswafalse \fi \else \ifdim\@tempdima<\z@ \@tempswafalse \else\ifdim\@tempdimb<\z@ \@tempdimb\@tempdima \else \advance\@tempdimb\@tempdima \fi\fi \fi \ifpcol@scfnote\ifvoid\pcol@footins\else \ifdim\@tempdimb<\z@ \@tempdimb\z@ \fi \advance\@tempdimb\ht\pcol@footins \advance\@tempdimb\dp\pcol@footins \advance\@tempdimb\skip\pcol@footins \fi\fi \dimen@\@tempdimb \ifpcol@clear\else \ifdim\dimen@<\z@\else \ifdim\@tempdimc=\maxdimen\else \ifdim\@tempdimc<\z@\else \advance\dimen@-\@tempdimc \fi\fi \advance\dimen@\pcol@@ensurevspace \ifdim\dimen@<\@tempdimb \dimen@\@tempdimb \fi \fi\fi \ifdim\dimen@>\@colht \global\pcol@flushtrue \@tempswafalse \pcol@nextcol\@tempcntb \fi \ifdim\@tempdimb<\z@\else \if@tempswa \pcol@currcol\z@ \@whilenum\pcol@currcol<\pcol@ncol\do\pcol@synccolumn \fi\fi} % \end{macrocode} % \end{macro} % % \begin{macro}{\pcol@flushcolumn} % \changes{v1.0}{2011/10/10} % {Rename \cs{pcol@maxpage} as \cs{pcol@toppage}.} % \changes{v1.0}{2011/10/10} % {Add \cs{vfil} at the bottom of flushed column-page.} % \changes{v1.0}{2011/10/10} % {Change order of the garbage collection of \cs{pcol@currfoot} and % \cs{pcol@getcurrfoot}.} % \changes{v1.2-2}{2013/05/11} % {Revise reflecting the redesign of \cs{pcol@getcurrfoot}.} % \changes{v1.2-2}{2013/05/11} % {Add operations for page-wise footnotes.} % \changes{v1.2-2}{2013/05/11} % {Add the examination of $\kappa_c(\rho)\EQ\infty$ to cope with a % rare-case interaction of pre-flushing column height check and float % columns in last pages.} % \changes{v1.2-7}{2013/05/11} % {Save \cs{ifpcol@lastpage} into \cs{ifpcol@lastpagesave} and turn % \cs{ifpcol@lastpage} $\string\mathit{false}$ temporarily during % the macro works on non-top and thus non-last pages to fix the bug % that \cs{@makecol} and \cs{pcol@makefcolumn} misunderstand the page % they work on is last.} % \changes{v1.2-7}{2013/05/11} % {Replace \cs{@makecol} with \cs{pcol@@makecol} to cap the depth of % \cs{@outputbox} by \cs{@maxdepth} even with p\string\LaTeX.} % \changes{v1.21}{2013/06/06} % {Add page and column numbers to logging.} % \changes{v1.3-6}{2013/09/17} % {Fix the problem that a flushed column in a non-top page causes % overfull due to its hight-plus-depth greater than $\pi^h(p)$.} % \changes{v1.3-3}{2013/09/17} % {Add \cs{@colht} and \cs{relax} as the first and third argument % of \cs{pcol@shrinkcolbyfn} for all of three invocations of it.} % \changes{v1.3-6}{2013/09/17} % {Add \cs{@maxdepth} as the first argument of \cs{pcol@@makecol}.} % \changes{v1.32-2}{2015/10/10} % {Add \cs{pcol@Fb}/\cs{pcol@Fe} pair(s).} %  % The macro \!\pcol@flushcolumn! is invoked for each column $c\In0\C$ from % \!\pcol@sync! to ship out the \ccolpage{} of $c$ into $\S_c$ if it is not % leading one\Index{leading column-page}, i.e., $p=\cc_c(\vb^p)<\ptop$. The % macro also ships out \fpage{}s from $p+1$ up to $\ptop-1$ if we have % deferred floats to fill them and, if this float flushing still leaves % deferred floats, puts some of them to the \lcolpage{} being % current\Index{current column-page}{} now as its top and/or bottom floats. % % First we obtain the \cctext{} in $\cc_c$ by \!\pcol@getcurrcol! and % examines if $p=\cc_c(\vb^p)<\ptop$. If it does not hold to mean $c$ has % \lcolpage{}, we do nothing. % % Otherwise, we save \CSIndex{ifpcol@lastpage} into % \CSIndex{ifpcol@lastpagesave} turning the former switch $\false$ because we % are working on a non-\lcolpage{} definitely in a non-\lpage. Then we put % the contents of the \ccolpage{} $\cc_c(\vb^b)$ adding \!\vfil! at its tail % into \!\box!|255| being the \TeX's standard interface to carry the main % vertical list for \!\output! routine. We also move everything in % $\cc_c(\ft)$ obtained by \!\pcol@getcurrfoot! into \!\footins! and return % $\cc_c(\ft)$ to \!\@freelist! if $\cc_c(\ft^b)$ is not void. % % Then we obtain $p$'s \pctext{} by \!\pcol@getcurrpage! and, if it has % \Scfnote{}s in $\pp^f(p)$, we shrink \!\@colht! by the space required for % the footnotes using \!\pcol@shrinkcolbyfn! and add the stretch\slash % shrink components of $\!\skip!\cdot\pp^f(p)$ at the bottom of % \!\box!|255| by \!\pcol@unvbox@cclv!, as we did in \!\pcol@makecol!. % Otherwise we take a special care of the case that the height-plus-depth of % $\cc_c(\vb^b)$ is greater than $\pp^h(p)$ due to that its height is almost % equal to $\pi^h(p)$ and thus its depth makes the hight-plus-depth % exceeding $\pi^h(p)$. This excess is revealed by the \!\vfil! we just % have added making the height-plus-depth the height of \!\box!|255|, and % would cause overfull in \!\@makecol! and \!\pcol@@makecol! because they % need the height, i.e., not height-plus-depth, of \!\box!|255| not % exceeding $\pp^h(p)$. Therefore if it happens, we we remove the \!\vfil! % and cap the height of \!\box!|255| by \!\@maxdepth! to pretend as if the % box is directly passed from \TeX's page builder. % % Next we examine if $\cc_c(\tr)$ was made $\infty$ by \!\pcol@makefcolumn! % invoked from this macro itself when it processed the \colpage{} in the % previous \pfcheck{} for environment closing, which found a page break % should be done. That is, $\cc_c(\tr)=\infty$ means the \ccolpage{} was % once judged to be in the \lpage{} but \pfcheck{} forced a page break to % make it non-last, it should have all deferred floats now listed in % $\cc_c(\tl)$ at \Endparacol{}, but their total size is less than the % threshold to make a usual \fcolumn{} for the \lpage. If so, since the page % is not last now, we put all floats in $\cc_c(\tl)$ by \!\pcol@makefcolpage! % as the ship-out image in \!\@outputbox!, ignoring the contents added to % \!\box!|255| in the operations above because $\cc_c(\vb^b)$ should be % empty, and letting $\cc_c(\tr)=0$ to mean the floats have been % processed\footnote{ %  % $\cc_c(\tl)$ can have any values other than $\infty$ because definitely it % will not be referred to in its inherent sense in the situation with no % further float additions and no deferred floats.}. % % Otherwise, since the \colpage{} can be put as usual, we invoke % \!\pcol@@makecol!\footnote{ %  % Neither \cs{pcol@makecol} because \!\box!\texttt{255} has \!\vfil! at its % tail and the \colpage{} should be short enough, nor \cs{@makecol} because % we need to ensure the depth of resulting \cs{@outputbox} is capped.} %  % giving \!\@maxdepth! to it to build the complete \colpage{} in % \!\@outputbox! with depth capping and with the following setting\footnote{ %  % \LaTeX's has another \!\insert! named \!\@kludgeins! for \!\enlargepage! % but \Paracol{} does not cares about it.}. % $$ % \begin{array}{lll} % \!\box!|255|=\cc_c(\vb^b)& % \!\footins!=\cc_c(\ft)& % \!\@colht!=\pp^h(\cc_c(\vb^p))\\ % \!\@midlist!=\cc_c(\ml)& % \!\@toplist!=\cc_c(\tl)& % \!\@botlist!=\cc_c(\bl) % \end{array} % $$ % Finally, regardless of $\cc_c(\tr)=\infty$ or not, the resulting % \!\@outputbox! becomes $\s_c(p)$ and is added to the tail of $\S_c$ % by \!\@cons!. %  % \begin{macrocode} \def\pcol@flushcolumn{% \pcol@getcurrcol \ifnum\count\@currbox<\pcol@toppage \ifpcol@lastpage \pcol@lastpagesavetrue \else \pcol@lastpagesavefalse \fi \pcol@lastpagefalse \pcol@page\count\@currbox \setbox\@cclv\vbox{\unvbox\@currbox \vfil}% \ifvoid\pcol@currfoot\else \pcol@Fb \@cons\@freelist\pcol@currfoot \pcol@Fe{flushcolumn(colfn)}% \fi \pcol@getcurrfoot\box \pcol@getcurrpage \ifvoid\pcol@footins \ifdim\ht\@cclv>\@colht \setbox\@cclv\vbox{\boxmaxdepth\@maxdepth \unvbox\@cclv \unskip}% \fi \else \pcol@shrinkcolbyfn\@colht\pcol@footins\relax \setbox\@cclv\vbox{\pcol@unvbox@cclv\pcol@footins}% \fi \pcol@Logstart{\pcol@flushcolumn(\number\c@page:\number\pcol@currcol)} \ifdim\@toproom=\maxdimen \setbox\@outputbox\pcol@makefcolpage \global\@toproom\z@ \else \pcol@@makecol\@maxdepth \fi \pcol@Logend\pcol@flushcolumn \global\setbox\@currbox\box\@outputbox \expandafter\@cons\csname pcol@shipped\number\pcol@currcol\endcsname \@currbox % \end{macrocode} % % Then for each $q\in[p{+}1,\ptop{-}1]$, we repeat the followings; get $q$'s % \pctext{} by \!\pcol@getcurrpage!; shrink \!\@colht! by % \!\pcol@shrinkcolbyfn! if $q$ has \Scfnote{}s; try to make a \fcolumn{} in % \!\@outputbox! by \!\@makefcolumn! giving it \!\@deferlist! being % $\cc_c(\dl)$ at initial but will be shrunk; if the \fcolumn{} is made, % acquire an \!\insert! by \!\@next! to keep the contents of \!\@outputbox! % and to be added to the tail of $\S_c$ by \!\@cons!. %  % \changes{v1.2-2}{2013/05/11} % {Add \cs{@colht} shrinking by page-wise footnotes.} % \changes{v1.32-2}{2015/10/10} % {Add \cs{pcol@Fb}/\cs{pcol@Fe} pair(s).} %  % \begin{macrocode} \advance\pcol@page\@ne \ifx\@deferlist\@empty\else \@whilenum\pcol@page<\pcol@toppage\do{% \pcol@getcurrpage \ifvoid\pcol@footins\else \pcol@shrinkcolbyfn\@colht\pcol@footins\relax \fi \@makefcolumn\@deferlist \if@fcolmade \pcol@Fb \@next\@currbox\@freelist{\global\setbox\@currbox\box\@outputbox}% \pcol@ovf \pcol@Fe{flushcolumn(fcol)}% \expandafter\@cons \csname pcol@shipped\number\pcol@currcol\endcsname\@currbox \fi \advance\pcol@page\@ne}% \fi % \end{macrocode} % % Next, since we reach $\ptop$ and thus restore \CSIndex{ifpcol@lastpage} % from \CSIndex{ifpcol@lastpagesave} because the \tpage{} can be last. % Then we acquire the \ccolpage{} of $c$ which is now in $\ptop$ and thus % empty, by \!\@next!. Then we let $\!\@colht!=\!\@colroom!=\pp^h(\ptop)$ % by \!\pcol@getcurrpinfo! but shrinking them by \!\pcol@shrinkcolbyfn! if % $\ptop$ has \Scfnote{}s, and reinitialize the float placement parameters by % \!\pcol@floatplacement!. Then, if $\cc_c(\dl)$ still has some floats, % we make a \fcolumn{} for some of them in the \tpage{} by % \!\pcol@makefcolumn! if $\CSIndex{ifpcol@clear}={}\true$ meaning flushing, % or try to move some of them to $\cc_c(\tl)=\!\@toplist!$ and/or % $\cc_c(\bl)=\!\@botlist!$ by \!\pcol@trynextcolumn! otherwise. Note that % since \!\@colroom! is used in \!\pcol@makefcolumn! as a working register, % we let $\!\@colroom!=\pp^h(\ptop)$ again after its invocation. After that % we save \cctext{} including those given by \!\pcol@floatplacement! and % modified by \!\pcol@makefcolumn! or \!\pcol@trynextcolumn! into $\cc_c$ by % \!\pcol@setcurrcolnf! because all footnotes are shipped out, and let % $\cc_c(\vb^p)=\ptop$. We also let $\cc_c(\vb^r)=\!\@colroom!$ possibly % modified by \!\pcol@trynextcolumn! but after canceling the shrinkage of % \!\@colht! due to \Scfnote{}s, i.e., % $\cc_c(\vb^r)\gets\cc_c(\vb^r)+(H-H')$ where $H$ and $H'$ are \!\@colht! % before and after the shrinkage respectively. %  % \changes{v1.0}{2011/10/10} % {Add $\cs{@colht}\EQ\pi^h(p)$.} % \changes{v1.0}{2011/10/10} % {Replace \cs{pcol@trynextcolumn} with \cs{pcol@makefcolumn} for the % case of $\cs{ifpcol@clear}\EQ\mathit{true}$.} % \changes{v1.2-2}{2013/05/11} % {Revise reflecting the redesign of page context.} % \changes{v1.2-2}{2013/05/11} % {Add \cs{@colht} shrinking by page-wise footnotes.} % \changes{v1.2-7}{2013/05/11} % {Add the restore of \cs{ifpcol@lastpage} from % \cs{ifpcol@lastpagesave}.} % \changes{v1.21}{2013/06/06} % {Fix the bug that $\kappa_c(\beta^p)$ is let have \cs{pcol@page}, % which can be less than $p_t\EQ\cs{pcol@toppage}$, to cause the column % $c$ is lost or moved to a wrong page.} % \changes{v1.32-2}{2015/10/10} % {Add \cs{pcol@Fb}/\cs{pcol@Fe} pair(s).} %  % \begin{macrocode} \ifpcol@lastpagesave \pcol@lastpagetrue \fi \pcol@Fb \@next\@currbox\@freelist{\global\setbox\@currbox\vbox{}}\pcol@ovf \pcol@Fe{flushcolumn(col)}% \pcol@getcurrpinfo\@tempcnta{\global\@colht}\@tempskipa \@pageht\@colht \ifvoid\pcol@footins\else \pcol@shrinkcolbyfn\@colht\pcol@footins\relax \fi \global\@colroom\@colht \pcol@floatplacement \ifx\@deferlist\@empty\else \ifpcol@clear \pcol@makefcolumn \global\@colroom\@colht \else \pcol@trynextcolumn \fi\fi \pcol@setcurrcolnf \global\count\@currbox\pcol@toppage \advance\@pageht-\@colht \advance\@pageht\@colroom \global\dimen\@currbox\@pageht \fi %\ifnum\count\@currbox<\pcol@toppage \advance\pcol@currcol\@ne} % \end{macrocode} % \end{macro} % % \begin{macro}{\pcol@makefcolumn} % \changes{v1.0}{2011/10/10} % {Introduced to take special care of the float-column in the last % page. } % \changes{v1.2-2}{2013/05/11} % {Encapsulate the float column in a \cs{vbox} of \cs{@colht} so that % vertical skips at the top and bottom are not lost when the column % is put back to the main vertical list, and makes the assignment to % \cs{@currbox} global because the box is now referred to after % \cs{output} is completed.} % \changes{v1.2-7}{2013/05/11} % {Replace the sequence of operations to make a usual float column % with \cs{@toplist} with the newly introduced % \cs{pcol@makefcolpage}.} % \changes{v1.33-2}{2016/11/19} % {Remove a space after the \cs{vbox} to be assigned to \cs{@currbox} % to obey the coding convention.} %  % The macro \!\pcol@makefcolumn! is invoked solely from \!\pcol@flushcolumn! % to put deferred floats in the currently empty \colpage{} of $c$ in the % \tpage{} $\ptop$ which is being flushed. Since we have to take special care % of the case of environment closing, we cannot do this operation by % \!\@makefcolumn!, while in other cases for \!\flushpage! and \!\clearpage! % we also have to pay a small attention. % % First, we scan the copy of $\cc_c(\dl)$ applying \!\pcol@makefcolelt! to % each element to have the floats to be put in \!\@toplist!, which is % assuredly empty because the \ccolpage{} of $c$ has already been shipped % out to empty it, and those still deferred in $\cc_c(\dl)$. Prior to scan, % we let $H_r=\pp^h(\ptop)\footnotemark+\alpha$\footnotetext{ %  % $\pp^h(\ptop)$ referred in this macro may have been shrunk by \Scfnote{}s % in \cs{pcol@flushcolumn}.}, %  % as the space initially available for % floats each of which being $\phi$ is assumed to consume % $v(\phi)=h(\phi)+d(\phi)+\alpha$, and $H_t=\!\@colroom!=-\alpha$ as the % initial value of the accumulated size of $v(\phi)$ for all $\phi$ to be % put, where $\alpha=\!\floatsep!$ if $\CSIndex{ifpcol@lastpage}=\true$ %  % \SpecialIndex{\ifpcol@lastpage} %  % as discussed afterward, or $\alpha=\!\@fpsep!$ otherwise. % % Then if the resulting \!\@toplist! is not empty\footnote{ %  % It can happen if the first float is larger than $\pp^h(\ptop)$.}, %  % we examine if $\ptop$ is the \lpage{} ($|\ifpcol@|\~|lastpage|=\true$) %  % \SpecialIndex{\ifpcol@lastpage} %  % and $\cc_c(\dl)$ is empty to mean the last \colpage{} have all deferred % floats. This case is subtle because if we make the \colpage{} a \fcolumn{} % it can be sparse and unnecessarily throw the \postenv{} to the next % page. Therefore, we intend to pack floats to the page top as top floats % and thus have let $\alpha=\!\floatsep!$ in the building process of % \!\@toplist! above\footnote{ %  % We dare to do it knowing the natural component of \!\floatsep! is a little % bit (4pt) larger than that \!\@fpsep! and the possibility of having % fewer floats than those given by \!\@makefcolumn!.}, %  % but it may make a too tall \colpage{} only having floats shrinking % the \postenv{} in the page. In addition, if other columns have % \fpage{}s in the \lpage, packing the floats as top floats should give % inconsistent appearance but we don't know whether the columns following % $c$ has \fpage{}s. Therefore, we performs this float packing if making % the \fpage{} gives too sparse, more specifically if % $H_t<\!\floatpagefraction!\times\pp^h(\ptop)=\!\@fpmin!$, but postpone the % final decision until the \colpage{} is eventually shipped out by % \!\pcol@flushcolumn! or \!\pcol@makeflushedpage!. That is, if the all % conditions above hold, we keep \!\@toplist! so that it is saved in % $\cc_c(\tl)$ and let $\cc_c(\tr)=\infty$ to indicate that the column has % pending floats. Note that the floats are shipped out by % \!\pcol@flushcolumn! if the \pfcheck{} currently being performed finds a % too tall column in $\ptop$ to force a page break making $\ptop$ non-last. % Also note that, in any cases, letting $\cc_c(\tr)=\infty$ is safe because % no longer we will have any float additions to the \colpage. % % Otherwise, i.e., if we are working on a non-\lpage{} to be flushed or a % \fcolumn{} is to be made for the \lpage, we put all floats in \!\@toplist! % in a \!\vbox! of $\pp^h(\ptop)$ tall by \!\pcol@makefcolpage! and then % let $\cc_c(\vb^b)$ be another \!\vbox! having it. This encapsulation of % the \fcolumn{} is necessary because $\cc_c(\vb^b)$ can be put back to the % main vertical list after the \pfcheck{} to remove skips above and below % the floats, namely \!\@fptop! and \!\@fpbot!, if the contents were not % encapsulated. %  % \begin{macrocode} \def\pcol@makefcolumn{% \ifpcol@lastpage \@tempdimc\floatsep \else \@tempdimc\@fpsep \fi \@tempdima\@colht \advance\@tempdima\@tempdimc \global\@colroom-\@tempdimc \begingroup \let\@elt\pcol@makefcolelt \let\reserved@b\@deferlist \global\let\@deferlist\@empty \reserved@b \endgroup \ifx\@toplist\@empty\else \@tempswatrue \ifpcol@lastpage \ifx\@deferlist\@empty \ifdim\@colroom<\@fpmin \@tempswafalse \global\@toproom\maxdimen \fi\fi\fi \if@tempswa \global\setbox\@currbox\vbox{\pcol@makefcolpage}\fi \fi} % \end{macrocode} % \end{macro} %  % \begin{macro}{\pcol@makefcolelt} % \changes{v1.0}{2011/10/10} % {Introduced to take special care of the float-column in the last % page. } %  % The macro $\!\pcol@makefcolelt!\<\phi\>$ is invoked solely from % \!\pcol@makefcolumn! to be applied to each float element $\phi$ in (the % copy of) $\cc_c(\dl)$. We examine if $v(\phi)=h(\phi)+d(\phi)+\alpha\leq % H_r$ to mean the \fcolumn{} being built has room large enough for the float % $\phi$. If so, we add $\phi$ to \!\@toplist! by \!\@cons!, and let % $H_r\gets H_r-v(\phi)$ and $H_t\gets H_t+v(\phi)$. Otherwise, we add % $\phi$ to $\cc_c(\dl)$ by \!\@cons! to make it deferred again, and % let $H_r=-\infty$ so that the examinations for any succeeding elements % fail. %  % \begin{macrocode} \def\pcol@makefcolelt#1{% \@tempdimb\ht#1{}\advance\@tempdimb\dp#1{}\advance\@tempdimb\@tempdimc \ifdim\@tempdimb>\@tempdima \@cons\@deferlist#1\relax \@tempdima-\maxdimen \else \@cons\@toplist#1\relax \advance\@tempdima-\@tempdimb \global\advance\@colroom\@tempdimb \fi} % \end{macrocode} % \end{macro} %  % \begin{macro}{\pcol@makefcolpage} % \changes{v1.2-7}{2013/05/11} % {Introduced to implement the operations to make a float column % performed in three macros.} % \changes{v1.32-2}{2015/10/10} % {Add \cs{pcol@Fb}/\cs{pcol@Fe} pair(s).} % \changes{v1.33-2}{2016/11/19} % {Add {\tt\%} to the end of the line to open \cs{vbox} to obey the % coding convention.} %  % The macro \!\pcol@makefcolpage! is invoked from \!\pcol@flushcolumn!, % \!\pcol@makefcolumn! and \!\pcol@imakeflushedpage! to build a \fcolumn{} % having floats in \!\@toplist!, which is then returned to \!\@freelist! and % then emptied. The floats are put in a \!\vbox! of \!\@colht! tall with % vertical skips of \!\@fptop!, \!\@fpsep! and \!\@fpbot! above, between and % below them respectively. The box is then let be $\s_c(p)$ or % $\cc_c(\vb^b)$ explicitly or implicitly by the invokers, with an % encapsulation in the case of \!\pcol@makefcolumn!. %  % \begin{macrocode} \def\pcol@makefcolpage{\vbox to\@colht{% \vskip\@fptop \vskip-\@fpsep \def\@elt##1{\vskip\@fpsep\box##1}\@toplist \vskip\@fpbot}% \pcol@Fb \xdef\@freelist{\@freelist\@toplist}\global\let\@toplist\@empty \pcol@Fe{makefcolpage}% } % \end{macrocode} % \end{macro} % % \begin{macro}{\pcol@measurecolumn} % \changes{v1.0}{2011/10/10} % {Drastically changed to measure $D_T$, to deal with empty % main vertical list, and to omit \cs{topfigrule} and \cs{botfigrule} % from float size measurement.} %  % The macro \!\pcol@measurecolumn! is invoked for each column $c\In0\C$ from % \!\pcol@sync! to measure the sizes of the top floats $\size_c(t)$, main % vertical list $\size_c(m)$, footnotes $\size_c(f)$ and bottom floats % $\size_c(b)$ in the \ccolpage{} in the page $\ptop$. After obtaining the % \cctext{} in $\cc_c$ by \!\pcol@getcurrcol!, we calculate % $\size_c(t)=\!\skip!{\cdot}\cc_c(\vb)$ by \!\pcol@addflhd! giving it % $\cc_c(\tl)$ and $\cc_c(\tf)=\!\pcol@textfloatsep!$ as its arguments also % to have $\CSIndex{if@tempswa}={\fc(t)}$. Note that $\cc_c(\tf)=\infty$ means % the \colpage{} does not have any \sync{}ation points yet and thus % \!\textfloatsep! is used in the calculation as the skip between the top % floats and main vertical list, while the value itself possibly for a % \mvlfloat{} discussed later is used if $\cc_c(\tf)<\infty$. We also % calculate $\size_c(m)=h(\cc_c(\vb))+d(\cc_c(\vb))$, and then the sum of it % and $\size_c(t)$. %  % \begin{macrocode} \def\pcol@measurecolumn{% \pcol@getcurrcol \@tempswafalse \dimen@\z@ \pcol@addflhd\@toplist\pcol@textfloatsep \global\skip\@currbox\dimen@ \advance\dimen@\ht\@currbox \advance\dimen@\dp\@currbox \dimen@ii\dimen@ % \end{macrocode} % % Next we examine if the main vertical list $\cc_c(\vb^b)$ is empty by % \!\pcol@ifempty! and, if so, we let $\pd_c=\cc_c(\pd)=\infty$ and save it % (together with others) by \!\pcol@setcurrcol! so that, if the column % defines the $\VT$ finally by its top floats, $\DT$ is let $\infty$ and the % fact that the column has empty list is remembered. Otherwise, we let % $\pd_c=\cc_c(\pd)$ and $\CSIndex{if@tempswa}=\true$ to represent % $\Fc(\{t,m\})=f_t\lor f_m$ because $f_m=\true$. Then we invoke % \!\pcol@measureupdate! to let $\VT=\size_c(t)+\size_c(m)=\Size_c(\{t,m\})$ % and $\DT=\pd_c$ if $\Fc(\{t,m\})=\true$ and $\VT<\Size_c(\{t,m\})$. %  % \begin{macrocode} \pcol@ifempty\@currbox {\global\pcol@prevdepth\maxdimen \pcol@setcurrcol}% {\@tempswatrue}% \pcol@measureupdate\@tempdima\dimen@ii\@tempdimc\pcol@prevdepth % \end{macrocode} %  % \changes{v1.2-2}{2013/05/11} % {Add calculation of $V_P$ and $c_{\string\max}$.} % % Next we let $\size_c(f)=0$ if $\cc_c(\ft^b)$ is void, or otherwise let % $\size_c(f)=h(\cc_c(\ft^b))+d(\cc_c(\ft^b))+{}\cc_c(\ft^s)$\footnote{ %  % We ignore the height and depth of \!\footnoterule! because they are % expected to be 0 and are so in the default setting.} %  % and $\CSIndex{if@tempswa}=\true$ because $\fc(f)=\true$ and thus % $\Fc(\{t,m,f\})=\true$. After that, we calculate $\size_c(f)+\size_c(b)$ % by \!\pcol@addflhd! giving it $\cc_c(\bl)$ and $\infty$ to mean % \!\textfloatsep! should be used for the calculation as its argument also % to have $\CSIndex{if@tempswa}={\Fc}(\{t,m,f,b\})$. Then we let % $\VB=\size_c(f)+\size_c(b)$ if $\VB<\size_c(f)+\size_c(b)$, and let % $\VP=\size_c(t)+\size_c(m)+\size_c(f)+\size_c(b)=\Size_c(\{t,m,f,b\})$ and % $c_{\max}=c$ if $\Fc(\{t,m,f,b\})=\true$ and $\VP<\Size_c(\{t,m,f,b\})$. %  % \begin{macrocode} \ifvoid\pcol@currfoot \dimen@\z@ \else \dimen@\ht\pcol@currfoot \advance\dimen@\dp\pcol@currfoot \advance\dimen@\skip\pcol@currfoot \@tempswatrue \fi \pcol@addflhd\@botlist\maxdimen \ifdim\dimen@>\@tempdimb \@tempdimb\dimen@ \fi \advance\dimen@\dimen@ii \if@tempswa \ifdim\dimen@>\@pageht \@pageht\dimen@ \@tempcntb\pcol@currcol \fi\fi % \end{macrocode} % % Next, we let $\dc$ be the depth of the lowest non-empty items among the % main vertical list, footnotes and bottom floats. That is, we let % $\dc\gets\cc_c(\pd)$ at first, and then, if % $\CSIndex{ifpcol@bfbottom}={\true}$, override it by $\dc\gets % d(\cc_c(\ft^b))$ if there are footnotes, and finally override it by % $\dc\gets0$ for the bottom floats if exist adding \!\textfloatsep! to % $\Size_c(\{t,m,f,b\})$ to have $\Size_c(\{t,m,f,b'\})$. This overriding % order of $d(\cc_c(\ft^b))$ and then 0 by bottom floats is reversed when % $\CSIndex{ifpcol@bfbottom}=\false$ according to the implementation of % \!\@makecol!. Then, we invoke \!\pcol@measureupdate! again to let % $\VPP=\Size_c(\{t,m,f,b'\})$ and $\DP=\dc$ if $\Fc(\{t,m,f,b\})=\true$ and % $\VPP<\Size_c(\{t,m,f,b'\})$. It also lets $\DP=\dc$ if % $\Fc(\{t,m,f,b\})=\true$, $\VPP=\Size_c(\{t,m,f,b'\})$ and $\DP>\dc$. % % Finally, we let $\CSIndex{ifpcol@dfloats}=\true$ if % $\cc_c(\dl)\neq\emptyset$ to tell \!\pcol@makeflushedpage! that the % \lpage{} must be {\em full size} and \!\pcol@output@end! to flush the % deferred \cwise{} floats. %  % \changes{v1.3-6}{2013/09/17} % {Revise the mechanism to tell \cs{pcol@makeflushedpage} and % \cs{pcol@output@end} that a column in a last page has deferred % column-wise floats with newly introduced \cs{ifpcol@dfloats}.} %  % \begin{macrocode} \dimen@ii\pcol@prevdepth \ifpcol@bfbottom \ifvoid\pcol@currfoot\else \dimen@ii\dp\pcol@currfoot \fi \ifx\@botlist\@empty\else \dimen@ii\z@ \advance\dimen@\textfloatsep \fi \else \ifx\@botlist\@empty\else \dimen@ii\z@ \advance\dimen@\textfloatsep \fi \ifvoid\pcol@currfoot\else \dimen@ii\dp\pcol@currfoot \fi \fi \pcol@measureupdate\pcol@colht\dimen@\@pagedp\dimen@ii \ifx\@deferlist\@empty\else \pcol@dfloatstrue \fi \advance\pcol@currcol\@ne} % \end{macrocode} % \end{macro} %  % \begin{macro}{\pcol@addflhd} % \changes{v1.0}{2011/10/10} % {Drastically changed to omit \cs{topfigrule} and \cs{botfigrule} % from float size measurement, to take care of top float enlargement, % to add the measurement of $D_T$, and to revise the definition of % $D_P$.} %  % \begin{macro}{\pcol@hdflelt} % \def\xl{\lambda_x} % \changes{v1.3-3}{2013/09/17} % {Add a user \cs{pcol@makecol}.} %  % The macro $\!\pcol@addflhd!\arg{list}\arg{tfs}$ is invoked twice from % \!\pcol@measurecolumn! for a column $c$ to measure $\size_c(x)$ % ($x\in\{t,b\}$) of top ($x=t$) or bottom ($x=b$) floats. % The arguments and registers referred to in the macro have the following % values according to $x=t$ or $x=b$. % $$ % \nosv\begin{array}{l|ll} % & x=t& x=b\\\hline % \arg{list}& \cc_c(\tl)& \cc_c(\bl)\\ % \arg{tfs}& \!\pcol@textfloatsep!& \!\maxdimen!\\ % \CSIndex{if@tempswa}& % \false& \Fc(\{t,m,f\})\\ % \!\dimen@!& 0& \size(f) % \end{array} % $$ % The macro is also used in \!\pcol@makecol! and \!\pcol@output@switch! for % $x=t$ but with \!\dimen@! having the height of \!\pcol@prespan! for the % measurement of the total height of \prespan{} including top % floats\footnote{ %  % In these invocations, \CSIndex{if@tempswa} is meaningless and not examined % by the invokers.}. % % The macro at first examines if $\cc_c(\xl)=\arg{list}$ is empty and does % nothing if so. Otherwise, \CSIndex{if@tempswa} is turned $\true$ to have % $\fc(t)=\true$ for $x=t$ or $\Fc(\{t,m,f,b\})=\true$ for $x=b$. Then we % scan all floats in $\arg{list}$ applying \!\pcol@hdflelt! to each float % $\phi$ to add $h(\phi)+d(\phi)+\!\floatsep!$ to \!\dimen@!, from/to which % we then subtract \!\floatsep! and add $\sigma_x$ because the last\slash % first float is followed\slash preceded by the vertical skip of $\sigma_x$ % instead of \!\floatsep!, to have $\size_c(t)$ for $x=t$ or % $\size_c(f)+\size_c(b)$ for $x=b$ being {\em returned} to % \!\pcol@measurecolumn!. % % Note that $\sigma_t$ is $\arg{tfs}=\!\pcol@textfloatsep!$ if it is less % than $\infty$ or \!\textfloatsep! otherwise, while % $\sigma_b=\!\textfloatsep!$ always because $\arg{tfs}=\!\maxdimen!$. Also % note that $\sigma_t$ can be biased by 10000\,|pt| and thus larger than % 5000\,|pt|, if we have a \mvlfloat{} in top floats as discussed later. % Another caution is that we ignore the contribution by \!\topfigrule! nor % \!\botfigrule! because they should insert vertical items whose total % height and depth are 0. %  % \begin{macrocode} \def\pcol@addflhd#1#2{% \ifx#1\@empty\else \@tempswatrue \let\@elt\pcol@hdflelt #1\advance\dimen@-\floatsep \ifdim#2=\maxdimen \advance\dimen@\textfloatsep \else \advance\dimen@\pcol@textfloatsep \ifdim\pcol@textfloatsep>5000\p@ \advance\dimen@-\@M\p@ \fi \fi \let\@elt\relax \fi} \def\pcol@hdflelt#1{\advance\dimen@\ht#1\advance\dimen@\dp#1% \advance\dimen@\floatsep} % \end{macrocode} % \end{macro}\end{macro} %  % \begin{macro}{\pcol@measureupdate} % \changes{v1.0}{2011/10/10} % {Introduced to let $D_T$ and $D_P$ have the minimum depth of items % among those which give $V_T$ and $V_P$.} %  % The macro $\!\pcol@measureupdate!\\\\$ is invoked % twice in \!\pcol@measurecolumn! for $c$ to update $V\in\{\VT,\VPP\}$ % and $D=\{\DT,\DP\}$ as follows if \CSIndex{if@tempswa}, being % $\Fc(\{t,m\})$ for $V=\VT$ or $\Fc(\{t,m,f,b\})$ for $V=\VPP$, is $\true$. % $$ % V\gets\max(V,v)\qquad % D\gets\cases{\min(D,d)&$V=v$\cr % D& $V\neq v$} % $$ % The arguments $v$ and $d$ have the followings according to $V$. % $$ % \arraycolsep0pt % \begin{array}{rll} % V=\VT \;{:}\;&v=\Size_c(\{t,m\})&\quad d=\delta_c\\ % V=\VPP\;{:}\;&v=\Size_c(\{t,m,f,b'))&\quad d=\dc % \end{array} % $$ %  % \begin{macrocode} \def\pcol@measureupdate#1#2#3#4{\if@tempswa \ifdim#1<#2\relax#1#2\relax#3#4\relax \else\ifdim#1=#2\ifdim#3>#4\relax#3#4\fi\fi\fi\fi} % \end{macrocode} % \end{macro} % % \begin{macro}{\pcol@synccolumn} % \changes{v1.0}{2011/10/10} % {Drastically changed to correctly implement the top float % enlargement and MVL-float.} % \changes{v1.2-2}{2013/05/11} % {Change code structure removing the case for overflown synchronized % pages.} % \changes{v1.2-2}{2013/05/11} % {Remove \cs{penalty}\string\texttt{-10000} made unnecessary by the % redesign of overflow synchronized pages.} % \changes{v1.2-7}{2013/05/11} % {Add an shrink of $1/10000\,\string\texttt{fil}$ to the bottom of % flushed column pages to cancel finite shrinks just below % synchronization points.} %  % The macro \!\pcol@synccolumn! is invoked for each column $c\In0\C$ from % \!\pcol@sync! to set a \sync{}ation point at $\VT$ from the top of the % \ccolpage{} of $c$ if $\CSIndex{ifpcol@clear}={\false}$, or flush it % otherwise. After obtaining $c$'s \cctext{} $\cc_c$ by % \!\pcol@getcurrcol!, we process one of the following three cases. % % The first case is for flushing with $\CSIndex{ifpcol@clear}=\true$. In % this case we simply add \!\vfil! at the tail of the main vertical list in % $\cc_c(\vb^b)$ to make the whole \colpage{} possibly with other items fit % in a box of \!\@colht! tall and, if $\cc_c(\tf)\neq\infty$ to mean the % column to be flushed has a \sync{}ation point, we also add an infinite % shrink of $1/10000\,|fil|$ so as to cancel a finite shrink just below the % point, as done in \!\pcol@makecol!\footnote{ %  % Just in case, because it looks impossible that the natural height of the % \colpage{} exceeds $\pp^h(\ptop)$ with \pfcheck.}. %  % We also let $\cc_c(\pd)=1000\,|pt|$ to mimic \TeX's mechanism of % \!\prevdepth! with the empty main vertical list in the next % \colpage{}\footnote{ %  % The author is not sure if this setting is really necessary but, at least, % it looks working well (though other setting looks all right too).}. %  % \begin{macrocode} \def\pcol@synccolumn{% \pcol@getcurrcol \ifpcol@clear \global\pcol@prevdepth\@m\p@ \global\setbox\@currbox\vbox{\unvbox\@currbox \ifdim\pcol@textfloatsep=\maxdimen \vfil \else \vskip\z@\@plus1fil\@minus.0001fil \fi}% % \end{macrocode} %  % The second and third cases are for \sync{}ed \cswitch{}. The second case % is for $\DT=\infty$ to mean the \sync{}ation point is set just below the % top floats of a column whose main vertical list is empty because it is % definitely $\VT\geq0>-\infty$. In this case, we should not put anything % back to the main vertical list, because the column having defined the % point will restart from the top of its \colpage{} with \!\topskip! and % thus other columns should do so for the stuff following the point. % Therefore, we put $\cc_c(\vb^b)$ as the last top float, namely % {\em\Uidx\mvlfloat} because it is for the main vertical list, acquiring an % \!\insert! from \!\@freelist! by \!\@next! and assigning it to % \Midx{\!\pcol@float!} so that we pretend main vertical lists of all % columns are empty. % % The float has zero height and depth, and contains the % followings if we have some real floats; a vertical skip of $-\!\floatsep!$ % to go back to the bottom of the last real float; \!\topfigrule! and a skip % of \!\textfloatsep! to separate $\cc_c(\vb^b)$ from the last real float; % and $\cc_c(\vb^b)$ followed by \!\vss! to avoid overfull and underfull. % Otherwise, i.e., we don't have any real floats, neither of the skips nor % \!\topfigrule! are put in the \mvlfloat{} because we let % $\!\floatsep!=\!\textfloatsep!=0$ and $\!\topfigrule!=\!\relax!$ % temporarily in a group. Then we set the \sync{}ation point by enlarging % the space below the \mvlfloat{} so that the total size of all floats % including \!\floatsep! and \!\textfloatsep!, which may be 0 as set in the % process above, is equal to $\VT$. This enlarging is done by letting % $\cc_c(\tf)=\VT-(\vc(t)-\!\textfloatsep!+\!\floatsep!)$, the second term % of which is the vertical size of the top float sequence up to the % \mvlfloat, and by replacing \!\textfloatsep! with $\cc_c(\tf)$ in the top % float insertion process in \!\pcol@cflt! so that the top floats including % the \mvlfloat{} consumes $\VT$ as a whole\footnote{ %  % This enlarging cannot be done by making the float's height % $\VT-\vc(t)-\!\floatsep!$ (or \!\textfloatsep!) because the height can be % negative.}. % % Note that the process above involves \!\floatsep! and \!\textfloatsep! % with some finite stretch and shrink, but these factors will not contribute % the final result because they are canceled by \!\vss! in the \mvlfloat{} % and by the small infinite stretch and shrink put by \!\pcol@makecol! and % this macro for flushing. Also note that $\cc_c(\tf)$ is then biased by % 10000\,|pt| so that \!\pcol@cflt! will not put \!\topfigrule! because it % has been already put as a part of the \mvlfloat{} or we don't have any % real floats. We also let $\cc_c(\pd)=1000$ to mean the \colpage{}'s main % vertical list is empty, so as to mimic \TeX's mechanism of \!\prevdepth! % with an empty list again. % % Another attention we have to pay is that \colpage{}s with % $\cc_c(\tf)=\infty$ does not have any \sync{}ation points, and thus % $\cc_c(\tf)<\infty$ means a \sync{}ation has already taken place in them. % If this $\cc_c(\tf)<\infty$ happens with $\DT=\infty$\footnote{ %  % This can happen when a \sync{}ation with $\DT=\infty$ is immediately % followed by another \sync{}ation or, more unlikely, by additions of % items whose total amount is negative and then a \sync{}ation.}, %  % we cannot update $\cc_c(\tf)$ because \!\pcol@measurecolumn! took care of % its value on measuring $\vc(t)$. Therefore, we do nothing if % $\cc_c(\tf)<\infty$ but just let succeeding stuff be added to the main % vertical list as in \cswitch{} without \sync{}ation. %  % \changes{v1.32-2}{2015/10/10} % {Add \cs{pcol@Fb}/\cs{pcol@Fe} pair(s).} % \changes{v1.33-2}{2016/11/19} % {Add {\tt\%} to the end of the line to open \cs{vbox} for % \cs{pcol@float} to obey the coding convention.} %  % \begin{macrocode} \else \@tempdimb\@tempdima \advance\@tempdimb-\skip\@currbox \ifdim\@tempdimc=\maxdimen \ifdim\pcol@textfloatsep=\maxdimen \begingroup \ifx\@toplist\@empty \textfloatsep\z@ \floatsep\z@ \let\topfigrule\relax \fi \pcol@Fb \@next\pcol@float\@freelist{\global\setbox\pcol@float\vbox to\z@{% \vskip-\floatsep \topfigrule \vskip\textfloatsep \unvbox\@currbox \vss}}\pcol@ovf \pcol@Fe{synccolumn(topfloat)}% \@cons\@toplist\pcol@float \advance\@tempdimb\textfloatsep \advance\@tempdimb-\floatsep \advance\@tempdimb\@M\p@ \global\pcol@prevdepth\@m\p@ \global\pcol@textfloatsep\@tempdimb \endgroup \fi % \end{macrocode} %  % The third and last case is for $\DT<\infty$ and thus most usual. In this % case, we enclose everything in $\cc_c(\vb^b)$ in a \!\vbox! whose height % is $h_c^v=\VT-\vc(t)$ and let $\cc_c(\vb^b)$ have it so that the item % following the \sync{}ation point start at $\VT$. An attention we have to % pay is that it can be $h_c^v<\!\topskip!$ to let \TeX{} insert a vertical % skip of the difference between them when the box is returned to the main % vertical list pushing down the \sync{}ation point a little bit\footnote{ %  % This can happen not very unlikely especially with $\vc(t)$ a little bit % less than $\VT$ and $\cc_c(\vb^b)$ being empty.}. %  % Therefore, if so, we let $\cc_c(\vb^b)$ have the followings; a \!\vbox! of % \!\topskip! tall having its old contents at its top above which no % vertical skip will be inserted; a vertical skip $-\!\topskip!$ going back % to the page top; and a vertical skip $h_c^v$ going down to the % \sync{}ation point. % % The encapsulation of the old contents $\cc_c(\vb^b)$ in the box of $h_c^v$ % tall gives us the following two features desirable for \sync{}ation. % First, all vertical glues in the box are {\em frozen}, nullifying finite % stretches in them because we insert an infinite stretch of % $1/10000\,|fil|$ at the bottom of $\cc_c(\vb^b)$ to push up its old % contents respecting other infinite stretches if any, as done by % \!\raggedbottom!, and also nullifying finite and infinite shrinks because % $h_c^v\geq\vc(m)$ definitely. This freezing and nullification keeps % \sync{}ation points already in $\cc_c(\vb^b)$ from being observed moving a % little bit vertically. That is, if we have a glue just below a % \sync{}ation point and it were {\em visible} to \TeX's page builder, the % item below the glue could move up/down when the builder found a break % point with some shrink\slash stretch. Though this moving up/down is % inhibited by the small infinite stretch\slash shrink which the \colpage{} % will at its bottom finally, it is undesirable to make \TeX{} % misunderstanding that the glues are stretchable\slash shrinkable though % they are not in reality. % % Second, since the boxes in all \colpage{} are zero deep due to the % infinite stretch at their bottoms and these bottoms are aligned at the % \sync{}ation point, we have a clear view of the baseline progress after % the \sync{}ation regardless of their contents. That is, we let % $\cc_c(\pd)=\DT$ to {\em broadcast} $\DT$ to all columns, so that % the baselines of first items following the \sync{}ation % point are aligned \!\baselineskip! below the bottom baseline of the column % which defines $\DT$\footnote{ %  % Since $\DT$ is given by one of the tallest columns whose depth is smallest % among them, it is very likely that the bottom baseline of the column is % lowest among all columns. However, another column can have the lowest one % when its vertical size is a little bit shorter than $\VT$ and its depth is % small (e.g., 0). Though of course we can define $\DT$ being $\VT$ minus % the height of the column having the largest height to make the first % baseline below the \sync{}ation point apart from the lowest one by % \cs{baselineskip}, we dare to choose the definition of $\DT$ because such % lowest baseline often means that the column have some skip at its bottom % to give us the impression that the space between the baselines of the % tallest column and its first item is a little bit too large.}, %  % if $\DT$ plus the hight of each item is less than \!\baselineskip!. % % In addition, we let $\cc_c(\tf)=\!\textfloatsep!$ to % indicate the \colpage{} has the \sync{}ation point we just have set, if it % was $\infty$ to mean the point is the first one. By this setting, % \!\pcol@makecol! and this macro itself will know that the \colpage{} needs % to have a small infinite shrink at its bottom to cancel finite ones below % the \sync{}ation point, while \!\pcol@cflt! acts as \LaTeX's \!\@cflt! % because it should be $\cc_c(\tf)\leq5000\,|pt|$ to mean the \colpage{} % does not have a \mvlfloat. %  % \changes{v1.33-2}{2016/11/19} % {Add {\tt\%} to the end of the line to open \cs{vbox} for % \cs{@currbox} and two lines for \cs{vbox}es in it to obey the % coding convention.} %  % \begin{macrocode} \else \global\pcol@prevdepth\@tempdimc \ifdim\pcol@textfloatsep=\maxdimen \global\pcol@textfloatsep\textfloatsep \fi \global\setbox\@currbox\vbox{% \ifdim\@tempdimb<\topskip \vbox to\topskip{\unvbox\@currbox \vskip\z@\@plus.0001fil}% \vskip-\topskip \vskip\@tempdimb \else \vbox to\@tempdimb{\unvbox\@currbox \vskip\z@\@plus.0001fil}% \fi}% \fi \fi % \end{macrocode} %  % Finally, we let $\cc_c(\tn)=0$ to inhibit further addition of top floats % because we have fixed the space for them\footnote{ %  % Allowing the addition is tremendously tough even when the \colpage{} has % sufficiently large space above the \sync{}ation point.}, %  % and save it and other \cctext{} members into $\cc_c$ by \!\pcol@setcurrcol!. %  % \begin{macrocode} \global\@topnum\z@ \pcol@setcurrcol \advance\pcol@currcol\@ne} % \end{macrocode} % \end{macro} % % % % \subsection{Page Flushing} % \label{sec:imp-sout-flush} % % \begin{macro}{\pcol@output@flush} % \changes{v1.0}{2011/10/10} % {Rename \cs{pcol@makelastpage} as \cs{pcol@makeflushedpage}.} % \changes{v1.0}{2011/10/10} % {Remove unnecessary assignment of \cs{@colht}.} % \changes{v1.2-2}{2013/05/11} % {Add \cs{pcol@Logstart} and \cs{pcol@Logend}.} % \changes{v1.2-7}{2013/05/11} % {Add $\cs{boxmaxdepth}\EQ\cs{@maxdepth}$ for depth capping.} % \changes{v1.2-7}{2013/05/11} % {Add $\cs{boxmaxdepth}\EQ\cs{@maxdepth}$ for depth capping.} % \changes{v1.3-2}{2013/09/17} % {Add depth capping of \cs{pcol@rightpage}.} %  % The macro \!\pcol@output@flush! is invoked solely from % \!\pcol@specialoutput! to process the \!\output! request made by % \!\flushpage!. We invoke \!\pcol@makeflushedpage! giving it \!\@colht! as % the height of each \colpage{} to have the ship-out image of the % \tpage{} including its \spanning{} and \Scfnote{}s in \!\@outputbox! whose % height is then set to be \!\textheight!\footnote{ %  % Just in case because the height of source \cs{@outputbox} should be exactly % \cs{textheight} though not specified so on its construction in % \cs{pcol@makeflushedpage}.}, %  % ensuring that its depth is capped by $\!\boxmaxdepth!=\!\@maxdepth!$. We % also perform these height setting and depth capping on \!\pcol@rightpage! % if $\CL<\C$ to mean \parapag{}ing. Then we invoke \!\@outputpage! for % shipping out, and then finally \!\pcol@freshpage! to have a new page to % start new \colpage{}s in it. %  % \begin{macrocode} %% Special Output Routines: Page Flushing \def\pcol@output@flush{% \pcol@makeflushedpage\@colht \pcol@Logstart\pcol@output@flush \setbox\@outputbox\vbox to\textheight{\boxmaxdepth\@maxdepth \unvbox\@outputbox}% \ifnum\pcol@ncolleft<\pcol@ncol \setbox\pcol@rightpage\vbox to\textheight{\boxmaxdepth\@maxdepth \unvbox\pcol@rightpage}% \fi \pcol@Logend\pcol@output@flush \@outputpage \pcol@freshpage} % \end{macrocode} % \end{macro} % % \begin{macro}{\pcol@output@clear} % \changes{v1.0}{2011/10/10} % {Rename \cs{pcol@makelastpage} as \cs{pcol@makeflushedpage}.} % \changes{v1.0}{2011/10/10} % {Remove unnecessary increment of \cs{pcol@page} and assignment of % \cs{@colht}.} % \changes{v1.2-2}{2013/05/11} % {Add \cs{pcol@Logstart} and \cs{pcol@Logend}.} % \changes{v1.2-7}{2013/05/11} % {Add $\cs{boxmaxdepth}\EQ\cs{@maxdepth}$ for depth capping.} % \changes{v1.3-2}{2013/09/17} % {Add depth capping of \cs{pcol@rightpage} and building an empty % right parallel-page for each page-wise float page.} % \changes{v1.3-3}{2013/09/17} % {Add background painting of float pages.} % \changes{v1.32-3}{2015/10/10} % {Add $\hbox{\cs{f@depth}}\EQ0$ to override % $\hbox{\cs{f@depth}}\EQ\hbox{\texttt{1sp}}$ done by % \cs{@dblfloatplacement}.} %  % The macro \!\pcol@output@clear! is invoked solely from % \!\pcol@specialoutput! to process the \!\output! request made by % \!\clearpage!. The first part up to \!\@outputpage! and the last line of % this macro are same as \!\pcol@output@flush! to flush the \tpage{} and to % have a newpage. In the remaining mid part, we invoke \!\pcol@flushfloats! % to ship out all deferred \cwise{} floats in all columns if any, and % then do it for \pwise{} floats by the following invocations enclosed in a % group; letting $\!\pcol@rightpage!=\bot$ for ordinary paging; % \!\@dblfloatplacement! to set up placement parameters followed by % $\!\f@depth!=0$ to nullify the setting $\!\f@depth!=|1sp|$ possibly done % by it as discussed in the item-(\ref{item:ovv-float-@dblfloatplacement}) % of \secref{sec:imp-ovv-float}; \!\@makefcolumn! with % \!\@dbldeferlist! to have a \fpage{} in \!\@outputbox! if any; and a loop % of \bgpaint{} of \!\@outputbox! and, if $\CL<\C$, of empty % \!\pcol@rightpage!, and \!\@outputpage! followed by \!\@makefcolumn! % repeated while we have a \fpage{}, i.e., $\CSIndex{if@fcolmade}=\true$. % % Note that the mid part is same as that found in \!\@doclearpage! but we % omit various adjuncts surrounding it as follows; examination of % \CSIndex{if@twocolumn} because we should have multiple columns; % examination of \CSIndex{if@firstcolumn} because we have to clear the page % immediately even when we are not in the first column; concatenating % \!\@dbltoplist! with \!\@dbldeferlist! and clearing it because the author % believes \!\@dbltoplist! must be empty on the invocation of this macro; % and letting $\!\@colht!=\!\textheight!$ because \!\pcol@flushfloats! did % it. %  % \begin{macrocode} \def\pcol@output@clear{% \pcol@makeflushedpage\@colht \pcol@Logstart\pcol@output@clear \setbox\@outputbox\vbox to\textheight{\boxmaxdepth\@maxdepth \unvbox\@outputbox}% \ifnum\pcol@ncolleft<\pcol@ncol \setbox\pcol@rightpage\vbox to\textheight{\boxmaxdepth\@maxdepth \unvbox\pcol@rightpage}% \fi \pcol@Logend\pcol@output@clear \@outputpage \pcol@flushfloats \begingroup \setbox\pcol@rightpage\box\voidb@x \@dblfloatplacement \let\f@depth\z@ \@makefcolumn\@dbldeferlist \@whilesw\if@fcolmade\fi{% \def\pcol@bg@floatheight{\pcol@bg@textheight}% \setbox\@outputbox\vbox to\textheight{% \pcol@bg@paintbox{Ff}\unvbox\@outputbox}% \ifnum\pcol@ncolleft<\pcol@ncol \setbox\pcol@rightpage\vbox to\textheight{\pcol@bg@paintbox{Ff}\vfil}% \fi \@outputpage \@makefcolumn\@dbldeferlist}% \endgroup \pcol@freshpage} % \end{macrocode} % \end{macro} % % \begin{macro}{\pcol@makeflushedpage} % \changes{v1.0}{2011/10/10} % {Renamed from \cs{pcol@makelastpage}.} % \changes{v1.0}{2011/10/10} % {Rename \cs{ifpcol@textonly} as \cs{ifpcol@nospan}.} % \changes{v1.0}{2011/10/10} % {Judge the last page is empty if $V_P\EQ-\infty$ instead of $V_P<0$.} % \changes{v1.2-2}{2013/05/11} % {Revise reflecting the redesign of page context.} % \changes{v1.3-2}{2013/09/17} % {Completely redesigned with new macro \cs{pcol@imakeflushedpage}.} % \changes{v1.3-3}{2013/09/17} % {Add background painting of page-wise floats, and a part of % operations for column-separation rule drawing and background % painting of page-wise footnotes.}  % \changes{v1.3-6}{2013/09/17} % {Revise the mechanism of special care about last page introducing % \cs{ifpcol@dfloats}.} %  % The macro $\!\pcol@makeflushedpage!\arg{ht}$ is invoked from % \!\pcol@output@flush! or \!\pcol@output@clear! with $\arg{ht}=\!\@colht!$ % and from \!\pcol@output@end! with $\arg{ht}=\!\pcol@colht!$. At first, we % invoke \!\pcol@output@switch! with setting $\CSIndex{ifpcol@clear}=\true$ % to flush all pages up to $\ptop-1$ and to let $\cc_c(\vb^b)$ have the % ship-out image of the main vertical list of each \colpage{} $c$ in % $\ptop$. This invocation also lets $\!\pcol@colht!=\VPP$ so that hereafter % we will refer $\VPP$ through $\arg{ht}$ if it is $\!\pcol@colht!$ for % \lpage. Then after obtaining $\ptop$'s \pctext{} to have % $\page(\ptop)=\pp^p(\ptop)$, $\!\@colht!=\pp^h(\ptop)$ and % \CSIndex{ifpcol@nospan} by \!\pcol@getcurrpinfo!, we build the ship-out % image of $\ptop$ in \!\@outputbox!, and \!\pcol@rightpage! if % \parapag{}ing, taking special care of the \lpage{} case as follows. %  % \begin{enumerate}\def\labelenumi{(\arabic{enumi})} % \item\label{item:mfp-nonlast} % If $\CSIndex{ifpcol@lastpage}=\false$, each of $\cc_c(\vb^b)$ has ship-out % image even if some or all of them are empty. It is unnecessary to be aware % of the perfectly empty case because it should mean the page $\ptop$ is % made blank intentionally. % % \item\label{item:mfp-last-dfloats} % If $\CSIndex{ifpcol@lastpage}=\true$ but $\CSIndex{ifpcol@dfloats}=\true$ % too, the last page must have {\em full size} because we will have parallel % columned pages having \fcolumn{}s for deferred floats. However, if the % page has nothing, i.e., $\pp^i(\ptop)=\pp^f(\ptop)=\bot$ and % $\VPP=-\infty$, we must let $\!\@outputbox!=\bot$ (and % $\!\pcol@rightpage!=\bot$ as well) to avoid an unnecessary blank page is % shipped out. On the other hand, if $\pp^i(\ptop)\neq\bot$ or % $\pp^f(\ptop)\neq\bot$ while $\VPP=-\infty$, we build a full size page as % usual but letting $\!\@textbottom!=\!\vfil!$ temporarily to avoid underfull % in the process of building columns. Note that if $\pp^f(\ptop)\neq\bot$, % the \Scfnote{}s are always put into \!\@outputbox! regardless % \CSIndex{ifpcol@mgfnote} because the \lpage{} is not combined with % \postenv. % % \item\label{item:mfp-last-empty} % If $\CSIndex{ifpcol@lastpage}=\true$, $\CSIndex{ifpcol@dfloats}=\false$ % and $\VPP=-\infty$, we have to let $\!\@outputbox!=\bot$ unless % $\pp^i(\ptop)\neq\bot$ or $\pp^f(\ptop)\neq\bot$ having non-\Mgfnote{}s. % If $\pp^f(\ptop)$ has non-\Mgfnote{}s, \!\@outputbox! and % \!\pcol@rightpage! must have $\pp^f(\ptop)$ possibly with $\pp^i(\ptop)$ % but without any columns, and must be put into the main vertical list as % the leading part of \postenv{} by modifying $\VPP=0$. On the other hand % $\pp^f(\ptop)=\bot$ or it has \Mgfnote{}s, \!\@outputbox! must have only % $\pp^i(\ptop)$\footnote{ %  % \!\pcol@rightpage! must have the counterpart in right \parapag{}e if the % \spanning{} is \preenv, while it is made $\bot$ by \!\pcol@output@end! if % the \spanning{} are \pwise{} floats.}. %  % Since \pwise{} floats become ordinary floats in \postenv, we cannot paint % its \bground{} and must remove \!\dbltextfloatsep! at the bottom of % $\pp^i(\ptop)$. % % \item\label{item:mfp-last-nonempty} % If $\CSIndex{ifpcol@lastpage}=\true$, $\CSIndex{ifpcol@dfloats}=\false$ % and $\VPP>-\infty$, \!\@outputpage! and \!\pcol@rightpage! must have short % columns of $\VPP$ tall, together with $\pp^i(\ptop)$ as in non-\lpage{}s % but without $\pp^f(\ptop)$ if it has \Mgfnote{}s. % \end{enumerate} %  % To implement a part of special cares above, we at first let % $\CSIndex{if@tempswa}=\true$ iff $\cs{ifpcol@}\~|lastpage|=\false$, %  % \CSINDEX{ifpcol@lastpage} %  % $\VPP>-\infty$ or $\pp^f(\ptop)\neq\bot$. %  % \begin{macrocode} \def\pcol@makeflushedpage#1{% \pcol@cleartrue \pcol@output@switch \pcol@clearfalse \pcol@getcurrpinfo{\global\c@page}{\global\@colht}\@tempskipa \ifpcol@lastpage \@tempswafalse \else \@tempswatrue \fi \ifdim\pcol@colht=-\maxdimen\else \@tempswatrue \fi \ifvoid\pcol@footins\else \@tempswatrue \fi % \end{macrocode} % % Next, if $\CSIndex{ifpcol@nospan}=\true$ to mean the page $\ptop$ does not % have \spanning{} in $\pp^i(\ptop)$, we initialize both \!\@outputbox! and % \!\pcol@rightpage! to be $\bot$. Otherwise, after letting % $\CSIndex{if@tempswa}=\true$ if $\CSIndex{ifpcol@dfloats}=\true$ to make the % \lpage{} full size if we are working on it as discussed in\Tie % (\ref{item:mfp-last-dfloats}), we put $\pp^i(\ptop)$ in \!\@outputbox!, % and paint its \bground{} by \!\pcol@bg@paintbox! \!\edef!ining the height % parameter \!\pcol@bg@floatheight! with $h$ being the height-plus-depth of % $\pp^i(\ptop)$ with the following two exceptions; one is the case of % $\CSIndex{ifpcol@firstpage}={\true}$ to mean we are in \spage{} and thus % the \spanning{} is \preenv{} having already been painted by % \!\pcol@output@start!; and the other is the case of % $\CSIndex{if@tempswa}=\false$ to mean we are working on a truly \lpage{} % being empty except for the \spanning{} itself and thus the \pwise{} % floats become a part of deferred floats in \postenv{} as discussed in\Tie % (\ref{item:mfp-last-empty}). In the latter exceptional case, excluding % the case that the \lpage{} is also the \spage\footnote{ %  % Extremely exceptional because the closing environment does not have % anything.}, %  % we also remove the last skip being \!\dbltextfloatsep! so that those % floats are naturally connected with other floats given in % \postenv{} also as discussed in\Tie(\ref{item:mfp-last-empty}). Then we % {\em pack} the \!\@outputbox! in itself by \!\vbox! so that any % stretch\slash shrink factors in it cannot affect the ship-out image % especially when we paint its \bground{}\footnote{ %  % Though that hardly happens.}. %  % Then we do the similar procedure for \!\pcol@rightpage! and make its height % and depth equal to those of \!\@outputbox!\footnote{ %  % If \pwise{} floats become a part of \postenv's floats, \!\pcol@rightpage! % will be made $\bot$ by \!\pcol@output@end! afterward.}. %  % Finally we temporarily add $h$ to \!\topmargin! as done in % \!\pcol@ioutputelt! so that \bgpaint{} of columns and so on with % \bginfext{} can reach the paper top edge. %  % \changes{v1.3-6}{2013/09/17} % {Revise the condition of leaving page-wise floats as ordinary % post-environment floats using \cs{if@tempswa} with % \cs{ifpcol@dfloats}.} % \changes{v1.32-2}{2015/10/10} % {Add \cs{pcol@Fb}/\cs{pcol@Fe} pair(s).} %  % \begin{macrocode} \begingroup \ifpcol@nospan \global\setbox\@outputbox\box\voidb@x \global\setbox\pcol@rightpage\box\voidb@x \else \ifpcol@dfloats \@tempswatrue \fi \let\@elt\relax \edef\pcol@bg@floatheight{% \@elt{\number\ht\pcol@spanning sp}\@elt{\number\dp\pcol@spanning sp}}% \def\reserved@a{% \ifpcol@firstpage\else \if@tempswa \pcol@bg@paintbox{Ff}\fi\fi}% \@tempdima\ht\pcol@spanning \advance\@tempdima\dp\pcol@spanning \global\setbox\@outputbox\vbox{% \reserved@a \unvbox\pcol@spanning \ifpcol@firstpage\else \if@tempswa\else \unskip \fi\fi}% \global\setbox\@outputbox\vbox{\box\@outputbox}% \pcol@Fb \@cons\@freelist\pcol@spanning \pcol@Fe{makeflushedpage(spanning)}% \ifnum\pcol@ncolleft<\pcol@ncol \global\setbox\pcol@rightpage\vbox{% \ifpcol@paired\else \advance\c@page\@ne \fi \reserved@a \unvbox\pcol@rightpage}% \global\ht\pcol@rightpage\ht\@outputbox \global\dp\pcol@rightpage\dp\@outputbox \global\setbox\pcol@rightpage\vbox{\box\pcol@rightpage}% \fi \advance\topmargin\@tempdima \fi % \end{macrocode} % % Next, after \!\global!ly letting $\CSIndex{ifpcol@firstpage}=\false$ because % we will ship a page which may be the \spage{} shortly, we build the % ship-out image of columns if required fundamentally by % $\CSIndex{if@tempswa}=\true$. First, % if the page $\ptop$ has \Scfnote{}s, we shrink % $\!\@colht!={\pp^h}(\ptop)$ by \!\pcol@shrinkcolbyfn! to keep the room for % the footnotes, to have $H=\!\@pageht!$ being the possibly shrunk % $\pp^h(\ptop)$ for the reference % in \!\pcol@imakeflushedpage! after the further possible modification of % \!\@colht! we will make shortly. Second, if % $\CSIndex{ifpcol@lastpage}=\true$ but $\CSIndex{ifpcol@dfloats}=\true$ % too, we turn $\CSIndex{ifpcol@lastpage}=\false$ because we need a % full-sized \lpage{}, temporarily letting $\!\@textbottom!=\!\vfil!$ if % $\VPP=-\infty$ to avoid underfull due to perfectly empty \colpage{}s as % discussed in\Tie(\ref{item:mfp-last-dfloats})\footnote{ %  % Each \colpage{} $cc_c(\vb^b)$ itself exists because the empty \colpage{} % has been visited by \cscan{} prior to \!\output! request for environment % closing.}. %  % Third, if we are working on a truly \lpage{} and $\arg{ht}\<\Cto\>\$ once or twice, to put % columns in right \parapag{}e to $b=\!\pcol@rightpage!$ with % $\LBRP\Cfrom\Cto=\LBRP\CL\C$ if $\CL<\C$, and then to put left ones in % $b=\!\@outputbox!$ with $\LBRP\Cfrom\Cto=\LBRP0\CL$ always\footnote{ %  % The order of right to left is not essential in this macro but we follow % the convention in \!\pcol@outputelt!.}. %  % \changes{v1.0}{2011/10/10} % {Let \cs{@colht} be $\langle\mathit{ht}\rangle$ if the former is % less than the latter.} % \changes{v1.0}{2011/10/10} % {Add special care of the float column in the last page.} % \changes{v1.2-2}{2013/05/11} % {Add \cs{@colht} shrinking by page-wise footnotes.} % \changes{v1.3-3}{2013/09/17} % {Add \cs{@colht} and \cs{relax} as the first and third argument % of \cs{pcol@shrinkcolbyfn} for all of three invocations of it.} % \changes{v1.3-6}{2013/09/17} % {Remove empty column scan for \cs{if@fcolmade} because it is now % unnecessary thanks to \cs{ifpcol@dfloats}.} % \changes{v1.3-6}{2013/09/17} % {Revise the condition of column-page building and setting of % \cs{@colht}.} %  % \begin{macrocode} \global\pcol@firstpagefalse \if@tempswa \ifvoid\pcol@footins\else \pcol@shrinkcolbyfn\@colht\pcol@footins\relax \fi \let\pcol@@hfil\relax \@pageht\@colht \ifpcol@lastpage \ifpcol@dfloats \ifdim\pcol@colht<\z@ \def\@textbottom{\vfil}\fi \pcol@lastpagefalse \fi\fi \ifpcol@lastpage \ifdim#1<\@colht \@colht#1\fi\fi \ifdim\@colht<\z@ \else \ifnum\pcol@ncolleft<\pcol@ncol \pcol@imakeflushedpage\pcol@ncolleft\pcol@ncol\pcol@rightpage \fi \pcol@imakeflushedpage\z@\pcol@ncolleft\@outputbox \fi \fi % \end{macrocode} % % After putting all \colpage{}s, we examine if the page $\ptop$ has % \Scfnote{}s in $\pp^f(\ptop)$. If so, and unless $\ptop$ is a truly % \lpage{} and \Mgfnote{} typesetting is in effect to mean the \Scfnote{}s % will be merged with \postenv{}, we put the footnotes in $\pp^f(\ptop)$ % below the \colpage{}s. Prior to this however, we let % \Midx{\!\pcol@fnheight@lpage!} have the height-plus-depth of the footnote, % so that \!\pcol@output@end! know the size for the \bgpaint{} of the % footnotes, which \!\pcol@imakeflushedpage! performed for non-\lpage{}s. % We also put an empty box of the size into \!\pcol@rightpage! by % \!\pcol@phantom! together with the \!\skip! component of $\pp^f(\ptop)$ to % keep the space necessary especially when $\ptop$ is the \lpage. Then we % put the footnotes in $\pp^f(\ptop)$ into \!\@outputpage! by % \!\pcol@putfootins!, reclaiming the contents of $\pp^f(\ptop)$ and letting % $\pp^f(\ptop)=\bot$ so that \!\pcol@output@end! will be unaware of the % footnotes. We also let $\VPP=\!\pcol@colht!=0$ if $\ptop$ is a truly % \lpage{} and it had $-\infty$ to indicate that the \lpage{} is not empty % but has footnotes as discussed in\Tie(\ref{item:mfp-last-empty}). %  % \changes{v1.2-2}{2013/05/11} % {Add incorporation of page-wise footnotes.} % \changes{v1.3-6}{2013/09/17} % {page-wise footnotes for the last page followed by pages for % deferred column-wise floats are now put by this macro.} % \changes{v1.32-2}{2015/10/10} % {Add \cs{pcol@Fb}/\cs{pcol@Fe} pair(s).} %  % \begin{macrocode} \gdef\pcol@fnheight@lpage{0pt}% \ifvoid\pcol@footins\else \@tempswatrue \ifpcol@lastpage \ifpcol@mgfnote \@tempswafalse \fi\fi \if@tempswa \pcol@Log\pcol@makeflushedpage{output}\pcol@footins \@tempdima\ht\pcol@footins \advance\@tempdima\dp\pcol@footins \xdef\pcol@fnheight@lpage{\number\@tempdima sp}% \ifnum\pcol@ncolleft<\pcol@ncol \global\setbox\pcol@rightpage\vbox{\unvbox\pcol@rightpage \vskip\skip\pcol@footins \nointerlineskip \pcol@phantom\pcol@footins \vskip\z@}% \fi \global\setbox\@outputbox\vbox{% \unvbox\@outputbox \pcol@putfootins\pcol@footins}% \pcol@Fb \@cons\@freelist\pcol@footins \gdef\pcol@footins{\voidb@x}% \pcol@Fe{makeflushedpage(pagefn)}% \ifdim\pcol@colht=-\maxdimen \global\pcol@colht\z@ \fi \fi \fi \endgroup} % \end{macrocode} % \end{macro} % % \begin{macro}{\pcol@imakeflushedpage} % \changes{v1.3-2}{2013/09/17} % {Introduced for parallel-paging.} % \changes{v1.3-3}{2013/09/17} % {Implement column-separating rule and background painting of % columns, column-separating gaps, spanning texts and page-wise % footnotes.} % \changes{v1.3-4}{2013/09/17} % {Implement variable-width column-separating gaps.} % % The macro $\!\pcol@imakeflushedpage!\<\Cfrom\>\<\Cto\>\arg{b}$ is invoked % solely in \!\pcol@makeflushedpage! but can be twice with % $(\Cfrom,\Cto,b)=(\CL,\C,\!\pcol@rightpage!)$ if \parapag{}ing is in effect % and with $(\Cfrom,\Cto,b)=(0,\CL,\!\@outputbox!)$ always, to build the % ship-out image of the right or left \parapag{}e $\ptop$ in the box $b$ % already having \spanning{} or its blank counterpart if any, respectively. % % After opening the \!\vbox! of the ship-out image for $b$, at first we % examine if $\CSIndex{ifpcol@paired}={\false}$ and $\Cfrom>0$, and if so we % temporarily increment $\page(\ptop)$ by one so that we check its parity % for \mirror{}ed \bgpaint{} correctly. Then if the page $\ptop$ has % \Scfnote{}s in $\pp^f(\ptop)$, we paint its \bground, or that of its blank % counterpart, by \!\pcol@bg@paintbox! \!\def!ining the parameter % \!\pcol@bg@footnoteheight! with the height-plus-depth of $\pp^f(\ptop)$, % as the very first element of the ship-out image as done in % \!\pcol@ioutputelt!, unless $\ptop$ is the truly \lpage{} for which the % \bgpaint{} is done in \!\pcol@output@end!. Then we put \spanning{} in $b$ % itself if any. % % Next, we invoke \!\pcol@buildcolseprule! for \cseprule{} drawing and % \bgpaint{} giving it $H$ in \!\@colht! possibly shrunk from $\pp^h(\ptop)$ % by \Scfnote{}s, $\LBRP\Cfrom\Cto$ for the set of columns to be put, and % \!\@maxdepth! for non-\lpage{}s to paint the \bground{}s of columns and % \csepgap{}s so that those of the last segment reach the page bottom, while % for \lpage{} we give 0 to let the bottom be the real bottom of the % columns. Then we put the painted \bground{}s in \!\@tempboxa! % immediately. %  % \begin{macrocode} \def\pcol@imakeflushedpage#1#2#3{\global\setbox#3\vbox{% \ifpcol@paired\else\ifnum#1=\z@\else \advance\c@page\@ne \fi\fi \ifvoid\pcol@footins\else \ifpcol@lastpage\else \def\pcol@bg@footnoteheight{% \@elt{\ht\pcol@footins}\@elt{\dp\pcol@footins}}% \pcol@bg@paintbox{Nn}% \fi\fi \unvbox#3\nointerlineskip \ifpcol@lastpage \pcol@buildcolseprule\@colht#1#2\z@ \else \pcol@buildcolseprule\@colht#1#2\@maxdepth \fi \unvbox\@tempboxa % \end{macrocode} % % Now we put columns in a \!\hbox! of $\WT=\!\textwidth!$ wide. That is, % for each $c$, being $c'$ or $\C-1-c'$ for the $c'$-th iteration determined % by \!\pcol@swapcolumn! according to the effectiveness of \cswap{} and the % parity of $\page(\ptop)$, we obtain $c$'s \cctext{} $\cc_c$ by % \!\pcol@getcurrcol!, move $\cc_c(\vb^b)$ into \!\box!|255|, and let % $\!\footins!=\cc_c(\ft)$ by \!\pcol@getcurrfoot! returning it to % \!\@freelist! if $c$ has \Mcfnote{}s. % % After that we examine if $\cc_c(\tr)=\infty$ to mean we are working on the % \lpage{} and the \colpage{} is for a \fcolumn{} whose floats can be put as % top floats, and let $\!\topfigrule!=\!\relax!$ temporarily because the % floats are not top ones in reality, if so. Note that the abnormal setting % $\cc_c(\tr)=\infty$ is not recovered because it will never be referred to % and the register \!\@toproom! it represents will be updated with correct % value before it is referred to in \postenv. Then we also check % $\arg{ht}=H$ to mean the \lpage{} is full size. If both of them hold, % the floats in $\cc_c(\tl)$ should be (or may be) put in the \fcolumn{} as % usual and thus we put them in \!\@outputbox! of $H$ tall by % \!\pcol@makefcolpage!. Otherwise we invoke \!\pcol@@makecol!\footnote{ %  % Not \cs{pcol@makecol} because the main vertical list has \!\vfil! and, if % it has a \sync{}ation point, a infinite shrink by \cs{pcol@synccolumn} at % its tail already, and we should not do any special operations for % \Scfnote{}s. Also it is not \cs{@makecol} because we need to ensure the % depth of resulting \cs{@outputbox} is capped.}, %  % to have the ship-out image of the \colpage{} in \!\@outputbox!, possibly % only for the deferred floats in $\cc_c(\tl)$ but without \!\topfigrule! in % this case. Note that we don't take care of the stretch\slash shrink of % \!\skip!\!\footins! for \Scfnote{}s because \pfcheck{} on the \colpage{} % makes it sure that the natural height of the \colpage{} cannot be greater % than \!\@colht!. Also note that we give \!\@maxdepth! to % \!\pcol@@makecol! for non-\lpage{}s for depth capping, but for the % \lpage{} we pass 0 to the macro because $H=\!\@colht!$ should be large % enough to accommodate everything in the column including its last box even % if the box is unusually deep. % % Then we put the \!\@outputbox! above in a \!\hbox! of \!\columnwidth! wide % preceded by \!\pcol@@hfil! being \!\relax! for the first column, while % it is $\!\pcol@hfil!\$, where $c^g=\!\pcol@colsepid!$ being $c$ or % $c-1$ without or with \cswap{} respectively, to put a \csepgap{} possibly % with \cseprule{} segments in \!\pcol@tempboxa! built by % \!\pcol@buildcolseprule!. Finally, we save \cctext{} especially those % for float parameters into $\cc_c$ by \!\pcol@setcurrcolnf! because all % \Mcfnote{}s have been shipped out. %  % \changes{v1.2-4}{2013/05/11} % {Add column-swapping for even pages if specified.} % \changes{v1.2-2}{2013/05/11} % {Revise reflecting the redesign of \cs{pcol@getcurrfoot}.} % \changes{v1.2-2}{2013/05/11} % {Add \cs{pcol@Logstart} and \cs{pcol@Logend}.} % \changes{v1.2-7}{2013/05/11} % {Enclose the column-page building process in a group to fix the bug % which lets $\cs{topfigrule}\EQ\cs{relax}$ affecting to another % column.} % \changes{v1.2-7}{2013/05/11} % {Replace the sequence of operations to make a usual float column % with \cs{@toplist} with the newly introduced % \cs{pcol@makefcolpage}.} % \changes{v1.2-7}{2013/05/11} % {Replace \cs{@makecol} with \cs{pcol@@makecol} to cap the depth of % \cs{@outputbox} by \cs{@maxdepth} even with p\string\LaTeX.} % \changes{v1.3-6}{2013/09/17} % {Add \cs{@maxdepth} or 0 as the argument of \cs{pcol@@makecol} to % fix the problem that the last page is too large due to % \cs{@maxdepth}, by the latter.} % \changes{v1.3-6}{2013/09/17} % {Remove the examination of $\kappa_c(\lambda_d)$ for % \cs{if@fcolmade} because it is made unnecessary now by % \cs{ifpcol@dfloats}.} % \changes{v1.32-2}{2015/10/10} % {Add \cs{pcol@Fb}/\cs{pcol@Fe} pair(s).} %  % \begin{macrocode} \hb@xt@\textwidth{% \@tempcntb#1\@whilenum\@tempcntb<#2\do{% \pcol@swapcolumn\@tempcntb\pcol@currcol#1#2\relax \pcol@getcurrcol \setbox\@cclv\box\@currbox \ifvoid\pcol@currfoot\else \pcol@Fb \@cons\@freelist\pcol@currfoot \pcol@Fe{imakeflushedpage(colfn)}% \fi \pcol@getcurrfoot\box \@tempswafalse \begingroup \ifdim\@toproom=\maxdimen \let\topfigrule\relax \ifdim\@colht=\@pageht \@tempswatrue \fi \fi \if@tempswa \pcol@Logstart{\pcol@makeflushedpage(1)}% \setbox\@outputbox\pcol@makefcolpage \pcol@Logend{\pcol@makeflushedpage(1)}% \else \pcol@Logstart{\pcol@makeflushedpage(2)}% \ifpcol@lastpage \pcol@@makecol\z@ \else \pcol@@makecol\@maxdepth \fi \pcol@Logend{\pcol@makeflushedpage(2)}% \fi \pcol@@hfil \hb@xt@\columnwidth{\box\@outputbox\hss}% \endgroup \edef\pcol@@hfil{\noexpand\pcol@hfil{\pcol@colsepid}}% \pcol@setcurrcolnf \advance\@tempcntb\@ne}}}} % \end{macrocode} % \end{macro} % % \begin{macro}{\pcol@flushfloats} % \changes{v1.0}{2011/10/10} % {Add reinitialization of \cs{@colht}.} % \changes{v1.2-4}{2013/05/11} % {Add column-swapping for even pages if specified.} % \changes{v1.3-2}{2013/09/17} % {Completely redesigned with new macro \cs{pcol@iflushfloats}.} % \begin{macro}{\pcol@iflushfloats} % \changes{v1.3-2}{2013/09/17} % {Introduced for parallel-paging.} % \changes{v1.3-3}{2013/09/17} % {Implement column-separating rule and background painting of % columns and column-separating gaps} % \changes{v1.3-4}{2013/09/17} % {Implement variable-width column-separating gaps.} %  % The macro \!\pcol@flushfloats! is invoked from \!\pcol@output@clear! and % \!\pcol@output@end! to flush all deferred \cwise{} floats in each % column if any. After letting $\!\@colht!=\!\textheight!$ for % \fcolumn{}s, we iterate shipping out a page having \fcolumn{}s while % $\CSIndex{if@fcolmade}=\exists c\In0\C:(\cc_c(\dl)\neq())$. % % In the loop, we initialize $\CSIndex{if@fcolmade}=\false$, and then % invoke \!\pcol@iflushfloats! twice or once according to $\CL<\C$ or not to % mean \parapag{}ing is in effect or not, respectively. That is, if % $\CL<\C$ we invoke the macro with $\LBRP\CL\C$ and \!\pcol@rightpage! for % the right \parapag{}e, and do it with $\LBRP0\CL$ and \!\@outputbox! % always. Note that if $\CL=\C$, we let $\!\pcol@rightpage!=\bot$ to tell % \!\@outputpage!, which we invoke at the end of the loop to ship out a page % or a \parapag{}e pair, that the \parapag{}ing is not in effect. % % The macro $\!\pcol@iflushfloats!\<\Cfrom\>\<\Cto\>\$ opens % a \!\vbox! to be set into $b$. Then if $\CSIndex{ifpcol@paired}={\false}$ % and $\Cfrom>0$ to mean we are working on a right \npaired{} \parapag{}e, % we temporarily add \!\c@page! by one for page parity examination for % \mirror{}ed \bgpaint. Then, the macro \!\pcol@buildcolseprule! is invoked % with $\!\@colht!=\!\textheight!$ and $\LBRP\Cfrom\Cto$ for \cseprule{} % drawing in \!\pcol@tempboxa! and \bgpaint{} for columns and \csepgap{}s in % \!\@tempboxa! put into $b$ immediately. % % Then we open a \!\hbox! of \!\textwidth! wide and initialize % $f=\CSIndex{if@tempswa}$ to be \CSIndex{if@fcolmade}. Then for each % $c\In\Cfrom\Cto$, being $c'$ or $\C-1-c'$ for the $c'$-th iteration % determined by \!\pcol@swapcolumn! according to the effectiveness of % \cswap{} and the parity of \!\c@page!, we put an inner \!\hbox! of % $\!\columnwidth!=\w_c$ wide preceded by \!\pcol@@hfil! being \!\relax! at % initial or $\!\pcol@hfil!\$ otherwise for a \csepgap{} and % \cseprule{}, where $c_g\in\{c,c{-}1\}$ without or with \cswap{} % respectively. That is, at first we obtain $c$'s \cctext{} including % $\cc_c(\dl)$ by \!\pcol@getcurrcol! and pass $\cc_c(\dl)$ to % \!\@makefcolumn! to produce a \fcolumn{} in \!\@outputbox! to be put into % the inner \!\hbox!. Then we do $f\gets f\lor(\cc_d(\dl)\neq\emptyset)$ % with $\cc_d(\dl)$ shrunk by \!\@makefcolumn! to let $f$ have % $\exists{}c\In0\Cto:(\cc_c(\dl)\neq\emptyset)$ at the end of the loop for % $c$, and then save the \cctext{} into $\cc_c$ by \!\pcol@setcurrcolnf! % because we have no footnotes in $c$. % % After the end of the loop, we move $f$ to \CSIndex{if@fcolmade} for % the termination check of the loop in \!\pcol@flushfloats!. %  % \begin{macrocode} \def\pcol@flushfloats{% \global\@colht\textheight \@whilesw\if@fcolmade\fi{% \global\@fcolmadefalse \ifnum\pcol@ncolleft<\pcol@ncol \pcol@iflushfloats\pcol@ncolleft\pcol@ncol\pcol@rightpage \else \setbox\pcol@rightpage\box\voidb@x \fi \pcol@iflushfloats\z@\pcol@ncolleft\@outputbox \@outputpage}} \def\pcol@iflushfloats#1#2#3{\setbox#3\vbox{% \ifpcol@paired\else\ifnum#1=\z@\else \advance\c@page\@ne \fi\fi \pcol@buildcolseprule\@colht#1#2\@maxdepth \unvbox\@tempboxa \hb@xt@\textwidth{% \let\pcol@@hfil\relax \if@fcolmade \@tempswatrue \else \@tempswafalse \fi \@tempcntb#1\@whilenum\@tempcntb<#2\do{% \pcol@swapcolumn\@tempcntb\pcol@currcol#1#2\relax \pcol@getcurrcol \@makefcolumn\@deferlist \pcol@@hfil \hb@xt@\columnwidth{% \if@fcolmade \box\@outputbox \else \vbox to\@colht{}\fi \hss}% \ifx\@deferlist\@empty\else \@tempswatrue \fi \edef\pcol@@hfil{\noexpand\pcol@hfil{\pcol@colsepid}}% \pcol@setcurrcolnf \advance\@tempcntb\@ne}% \if@tempswa \global\@fcolmadetrue \else \global\@fcolmadefalse \fi}}} % \end{macrocode} % \end{macro}\end{macro} % % \begin{macro}{\pcol@freshpage} % \changes{v1.0}{2011/10/10} % {Rename \cs{pcol@maxpage} as \cs{pcol@toppage}.} % \changes{v1.0}{2011/10/10} % {Add save and restore of \cs{@currbox}.} % \changes{v1.0}{2011/10/10} % {Remove unnecessary assignment of \cs{pcol@currcol}.} % \changes{v1.2-2}{2013/05/11} % {Add argument 0 for the invocations of \cs{pcol@startcolumn} to % inhibit inserting deferred page-wise footnotes.} %  % The macro \!\pcol@freshpage! is invoked from \!\pcol@output@flush! and % \!\pcol@output@clear! to start a new page after column flushing. At % first, we let $p=\pbase=\ptop=0$ and $\PP=\emptyset$ because we know no % pages are kept. Then we invoke \!\pcol@startpage! to start a new page % with a \!\def!inition of $\!\pcol@currpage!=|{}|$ to indicate the invoker % is this macro (i.e., not \!\pcol@opcol!). Then after keeping \!\@colht! % in $h=\!\pcol@colht!$, we do the followings for each column $c\In0\C$. % % First we obtain $c$'s \cctext{} in $\cc_c$ by \!\pcol@getcurrcol! but let % $p=0$ and $\!\@colroom!=h$, which can be modified by $c'0$ to mean we have % footnotes whose total height-plus-depth is in the macro, we paint their % \bground{} by \!\pcol@bg@paintbox! \!\def!ining \!\pcol@bg@footnoteheight! % with the size and temporarily re\!\def!ining \!\pcol@bg@textheight! to be % the height-plus-depth of \!\@outputbox! because the footnotes are at the % bottom of the box instead of the page. Note that the order of painting is % right first and then left second if we have \parapag{}es because we refer % the height-plus-depth of \!\@outputbox! being put into the main vertical % list making the box $\bot$. Also note that if the right \parapag{}e is % \npaired, we temporarily increment \!\c@page! in \!\pcol@rightpage! to let % \!\pcol@bg@paintbox! handle \bginfext{} to side margins correctly. % Another remark is that we don't modify $\pd=\!\@pagedp!$ and thus it keeps % $\DP$ in this case, and $f_{sp}$ is kept $\false$. %  % \changes{v1.3-3}{2013/09/17} % {Add background painting of page-wise footnotes.} %  % \begin{macrocode} \else \global\pcol@havelastpagetrue \@tempdima\ht\@outputbox \advance\@tempdima\dp\@outputbox \xdef\pcol@bg@preposttop@left{\number\@tempdima sp}% \ifnum\pcol@ncolleft<\pcol@ncol \global\let\pcol@bg@preposttop@right\pcol@bg@preposttop@left \fi \def\pcol@bg@textheight{\@elt{\ht\@outputbox}\@elt{\dp\@outputbox}}% \def\reserved@a{% \ifdim\pcol@fnheight@lpage>\z@ \def\pcol@bg@footnoteheight{\@elt\pcol@fnheight@lpage}% \pcol@bg@paintbox{Nn}% \fi}% \ifnum\pcol@ncolleft<\pcol@ncol \global\setbox\pcol@rightpage\vbox{% \ifpcol@paired\else \advance\c@page\@ne \fi \reserved@a \unvbox\pcol@rightpage}% \fi \topskip\z@ \vbox{\reserved@a \unvbox\@outputbox}% \fi \fi % \end{macrocode} % % Now we have put almost everything in the \lpage{} but we may still have % \Scfnote{}s in $\pp^f(\ptop)$ to be merged with those in \postenv. % Therefore, we \!\insert! them through \!\footins! as a part of \postenv, % and then do that for deferred footnotes in $\df=\!\pcol@topfnotes!$ % without using \!\pcol@deferredfootins! because we don't need the height % capping. %  % \changes{v1.2-2}{2013/05/11} % {Add insertion of page-wise footnotes to be merged.} % \changes{v1.32-2}{2015/10/10} % {Add \cs{pcol@Fb}/\cs{pcol@Fe} pair(s).} %  % \begin{macrocode} \ifvoid\pcol@footins\else \pcol@Log\pcol@output@end{insert}\pcol@footins \pcol@Fb \insert\footins{\unvbox\pcol@footins}\@cons\@freelist\pcol@footins \pcol@Fe{output@end(pagefn)}% \fi \ifvoid\pcol@topfnotes\else \insert\footins{\unvbox\pcol@topfnotes}\fi % \end{macrocode} % % The following operations are for clean-up and set-up for the \postenv; % for all c, return $\cc_c(\vb)$ obtained by \!\pcol@getcurrcol! and % $\Celt^c\neq\bot$ letting it $\bot$ to \!\@freelist!; reestablish the % \colorstack{} by \!\pcol@restorecolorstack! for column-0\footnote{ %  % It can be any other column.} %  % so that the \colorstack{} is just $\cst$ and is rewound at \Endparacol, % and let $\cst=\bot$; reload $\cc_d$ for $d=\!\pcol@lastcol!$ being the % column in which \Endparacol{} occurs to let $\!\everypar!=\cc_d(\ep)$ and % to let \CSIndex{if@nobreak} and \CSIndex{if@afterindent} have the value % represented by $\cc_d(\sw)$, so that the first paragraph of the \postenv{} % is typeset following them\footnote{ %  % For rare cases that the last item of the closing environment is a % sectioning command, but a user has such very unusual usage.}; %  % let $\!\pcol@prevdepth!=\pd$ so that it is set to \!\prevdepth! by % \!\pcol@invokeoutput!; let $\!\@colht!=\!\@colroom!=\!\textheight!$ to % mean the single-column page does not have any floats so far because those % produced in or before the environment have already been shipped out, are % put to the main vertical list packed in \!\@outputbox!, or are in % \!\@dbldeferlist!. % % As for deferred \pwise{} floats produced in the environment, including % those once put in the \lpage{} but returned to the list by the operation % described above, we move them to \!\@deferlist! because they are now % \cwise{} floats. Then we invoke \!\pcol@floatplacement! to % reinitialize float placement parameters. Finally, if $f_{\it sp}=\true$, % we invoke \!\@startcolumn! and then repeat invocations of \!\@opcol! and % \!\@startcolumn! while \fpage{}s are produced, after letting % $\CSIndex{ifpcol@lastpage}=\false$ to make \!\@combinefloats! work as % \LaTeX's original\footnote{ %  % Letting $\!\pcol@textfloatsep!=\infty$ is done by \!\pcol@floatplacement!.}. %  % \changes{v1.2-1}{2013/05/11} % {Add color resetting.} % \changes{v1.31}{2013/10/10} % {Add \cs{pcol@getcurrcol} for the column specified by % \cs{pcol@lastcol} to pass \cs{if@nobreak}, \cs{if@afterindent} and % \cs{everypar} of the column to post-environment stuff.} % \changes{v1.32-2}{2015/10/10} % {Add \cs{pcol@Fb}/\cs{pcol@Fe} pair(s).} % \changes{v1.34}{2018/05/07} % {Remove nullification of $\gamma_0^0$ because it is not meaningless % now, add release of $\gamma_0^c\NEQ\bot$ and then nullification of % it for all $c$, move color stack reestablishment down to the loop % with $c$ to ensure $\gamma_0^0\EQ\bot$, and add nullification of % $\mathit{\Gamma}$.} %  % \begin{macrocode} \pcol@currcol\z@ \@whilenum\pcol@currcol<\pcol@ncol\do{% \pcol@Fb \pcol@getcurrcol \@cons\@freelist\@currbox \ifvoid\pcol@ccuse{@box}\else \@cons\@freelist{\pcol@ccuse{@box}}% \pcol@ccxdef{\voidb@x}% \fi \pcol@Fe{output@end(col)}% \advance\pcol@currcol\@ne}% \pcol@currcol\z@ \pcol@restorecolorstack \global\setbox\pcol@colorins\box\voidb@x \pcol@currcol\pcol@lastcol\relax \pcol@getcurrcol \global\pcol@prevdepth\@pagedp \global\@colht\textheight \global\@colroom\textheight \global\let\@deferlist\@dbldeferlist \gdef\@dbldeferlist{}% \pcol@floatplacement \pcol@lastpagefalse \if@tempswa \@startcolumn \@whilesw\if@fcolmade\fi{\@opcol\@startcolumn}% \fi \pcol@Logend\pcol@output@end } % \end{macrocode} % \end{macro} % % % % \section{Starting Environment} % \label{sec:imp-startenv} % % \begin{macro}{\pcol@invokeoutput} % \changes{v1.0}{2011/10/10} % {Let \cs{pcol@prevdepth} have \cs{prevdepth} directly instead of via % \cs{tempdima}.} % \changes{v1.2-2}{2013/05/11} % {Add logging.} % \changes{v1.2-5}{2013/05/11} % {Move the setting of \cs{linewidth} and \cs{hsize} from % \cs{pcol@getcurrcol} to this macro and add \cs{parshape}.} % \changes{v1.21}{2013/06/06} % {Add zero-clearing of \cs{deadcycles}.} %  % Before giving the definition of \env{paracol} environment and commands % used in it, we define the macro $\!\pcol@invokeoutput!\arg{pen}$ invoked % from them to make an \!\output!-request with \!\penalty! of % $\arg{pen}=|\pcol@op@|{\cdot}f$. The macro's structure is similar to that % for the request sequence in \!\end@float! as follows; insert a \!\penalty! % of $-10004$ to save the main vertical list in \!\@holdpg!; save % \!\prevdepth!; insert a \!\vbox! to make it sure the following \!\penalty! % of $\arg{pen}$ is kept even when we are at the top of a page; and finally % restore \!\prevdepth!. % % A difference is that we zero-clear \!\deadcycles! because it can be reach % $\!\maxdeadcycles!=100$ easily if a page has many \sync{}ations and many % columns. Another and more important difference is in the save\slash % restore of \!\prevdepth!. First, the value of the register is saved in % our own \!\pcol@prevdepth! instead of \!\@tempdima! by a \!\global! % assignment so that \!\output!-routine refers to it\footnote{ %  % The assignment is not necessary to be done \!\global!ly but we dare to do % it to make all assignments to \!\pcol@prevdepth! being \!\global! % consistently.}. %  % Second, the value restored to \!\prevdepth! may be different from that we % just have saved because \!\output!-routine may update \!\pcol@prevdepth! % to have, for example, the value saved in $\cc_c(\pd)$ when we left from % $c$ which we are now restarting. % % In addition to above, after the invocation of \!\output!-routine, we let % $\!\linewidth!=\w_c-\lrm$ so that the register is shrunk from $\w_c$ by the % total width of left and right margins of the \env{list}-like environment % surrounding \env{paracol} if $\lrm=\!\pcol@lrmargin!>0$ to mean that. % Then if so, we set \!\parshape! to let every line of paragraphs in the % column $c$ is indented by \!\@totalleftmargin! and has width of % \!\linewidth!, as \LaTeX's \!\list! does. We also let $\!\hsize!=\w_c$ % because it should have the width of the column even in a \env{list}-like % environment. % % The macro is invoked from \!\pcol@zparacol! ($f=|start|$), % \!\pcol@switchcol! for \!\switch~column! and \csenv{}s ($f=|switch|$), % \!\pcol@visitallcols! for \cscan{} prior to \sync{}ed \cswitch{} and page % flushing ($f=|switch|$), \!\pcol@flushclear! for \pfcheck{} % ($f=|switch|$), \!\pcol@com@flushpage! for \!\flushpage! ($f=|flush|$), % \!\pcol@com@clearpage! for \!\clearpage! ($f=|clear|$), and % \!\endparacol! ($f=|end|$). % \SpecialIndex{\pcol@op@start} % \SpecialIndex{\pcol@op@switch} % \SpecialIndex{\pcol@op@flush} % \SpecialIndex{\pcol@op@clear} % \SpecialIndex{\pcol@op@end} %  % \begin{macrocode} %% Starting Environment \def\pcol@invokeoutput#1{\deadcycles\z@ \pcol@Logstart{\pcol@invokeoutput {#1:\the\pcol@currcol/\the\pcol@nextcol% \ifnum#1=-10011:\ifpcol@sync s\fi \ifpcol@clear c\fi\fi}}% \penalty-\@Miv \global\pcol@prevdepth\prevdepth \vbox{}% \penalty#1\relax \prevdepth\pcol@prevdepth \linewidth\columnwidth \advance\linewidth-\pcol@lrmargin \ifdim\pcol@lrmargin>\z@ \parshape\@ne\@totalleftmargin\linewidth \fi \hsize\columnwidth \pcol@Logend{\pcol@invokeoutput{#1}}} % \end{macrocode} % \end{macro} % % \KeepSpace{2} % \begin{macro}{\paracol} % \changes{v1.0}{2011/10/10} % {Change the order of operations for sake of clarity.} % \changes{v1.0}{2011/10/10} % {Add the mechanism of inter-environment local counter conservation.} % \changes{v1.0}{2011/10/10} % {Let $\cs{col@number}\EQ1$ instead of $C$ to keep \cs{maketitle} from % producing title with \cs{twocolumn}.} % \changes{v1.0}{2011/10/10} % {Add initialization of \cs{pcol@textfloatsep}, \cs{ifpcol@lastpage}, % \cs{pcol@firstprevdepth} and \cs{@combinefloats}.} % \changes{v1.0}{2011/10/10} % {Make API commands environment-local and inhibit nesting of % \texttt{paracol}.} % \changes{v1.3-2}{2013/09/17} % {Modify to add the optional argument $C_L$ and optional % `\string\texttt{*}' for parallel-paging.} % \begin{macro}{\pcol@xparacol} % \changes{v1.3-2}{2013/09/17} % {Introduced to let $C_L\EQ C$ if the optional argument $C_L$ is not % given to \cs{paracol}.} % \begin{macro}{\pcol@yparacol} % \changes{v1.3-2}{2013/09/17} % {Introduced to process the optional `\string\texttt{*}' given with % the optional argument $C_L$ of \cs{paracol}.} % \begin{macro}{\pcol@zparacol} % \changes{v1.3-2}{2013/09/17} % {Introduced to add the optional argument $C_L$ and optional % `\string\texttt{*}' to \cs{paracol} for parallel-paging and to do % what had done by \cs{paracol}.} %  % The API macro $\!\paracol!|[|\CL|][*]|\Arg{\C}$\oarg{text} is invoked by % \beginparacol{} to start a \Midx{\env{paracol}} environment. The macro % simply examines the existence of the optional argument $\CL$, whose % default value $\C$ is given by \!\pcol@xparacol!, to decide the % number of columns in left \parapag{}es. Then if the optional argument is % given, \!\pcol@yparacol! examines the existence of `|*|' following it for % \npaired{} \parapag{}ing to let $\CSIndex{ifpcol@paired}=\false$, while % \!\paracol! gave the default $\true$ for \paired{} one to the switch. % Then the all other operations to start the environment is done by % \!\pcol@zparacol!. %  % \begin{macrocode} \def\paracol{\global\pcol@pairedtrue \@ifnextchar[%] \pcol@yparacol\pcol@xparacol} \def\pcol@xparacol#1{\pcol@zparacol[#1]{#1}} \def\pcol@yparacol[#1]{% \@ifstar{\global\pcol@pairedfalse \pcol@zparacol[#1]}% {\pcol@zparacol[#1]}} % \end{macrocode} % % In \!\pcol@zparacol!, after making it sure to be in vertical mode by % \CSIndex{par}, at first we examine if we are neither in a box by % \CSIndex{ifinner} nor with ordinary two-column typesetting by % \CSIndex{if@twocolumn}, and complain about inappropriateness unless our % expectation is satisfied. Then we let $\CL$ and $\C$ have the value given % through the corresponding arguments, unless $\CL>\C$ to let us make % $\CL=\C$ silently. Next we examine $\CL<\C$, and if not we let % $\CSIndex{ifpcol@paired}=\true$ regardless the setting in % \!\pcol@yparacol! because \npaired{} typesetting is meaningless without % \parapag{}ing. On the other hand, if \npaired{} typesetting is specified, % we let $\CSIndex{ifpcol@swapcolumn}={\false}$ but {\em not} \!\global!ly % because \cswap{} is meaningless in \npaired{} mode in the environment now % starting. % % Second, we perform the operations done by \!\item! if % $\CSIndex{if@newlist}=\true$ and $\CSIndex{if@inlabel}\~=\false$ to mean % the first one in a \env{list}-like environment will appear at the very % first line of the leftmost column. That is, we invoke \!\@nbitem! if % $\CSIndex{if@nobreak}=\true$, or add a penalty \!\@beginparpenalty! and a % vertical skip $\!\@topsep!-\!\parskip!-\!\itemsep!$ so that the first % \!\item! is \!\@topsep! apart from the last line above the environment, % and then let $\CSIndex{if@newlist}=\false$. The reason why we do these % operations here is that, if the \env{paracol} environment is enclosed in a % \env{list}-like environment without anything between two \!\begin! for % environments, we have to align all first \!\item!s in all columns. That % is, if we did not do that, the {\em literally first} \!\item! would do % that resulting in the column having the \!\item! led by the vertical skip % of \!\@topsep! while others should have ordinary inter-\!\item! skips. % Therefore, we perform the operations on behalf of all first \!\item!s in % all columns to have the skip of \!\@topsep! {\em above} the \env{paracol} % environment we are opening. Note that if \beginparacol{} immediately % follows a \!\begin! for a \env{trivlist}-like environment, % $\CSIndex{if@inlabel}=\true$ because the first \!\item! was given in the % opening macro and thus the operations shown above has already been % performed. %  % \changes{v1.3-6}{2013/09/17} % {Add operations for the vertical skips at the beginning of a % \texttt{list}-like environment.} % \changes{v1.35-6}{2018/12/31} % {Add error check with \cs{ifinner} and \cs{if@twocolumn}.} % \changes{v1.35-2}{2018/12/31} % {Add $\lnot$\cs{if@inlabel} to the condition to perform operations % for first \cs{item}.} %  % \begin{macrocode} \def\pcol@zparacol[#1]#2{\par \ifinner \@parmoderr \fi \if@twocolumn \PackageError{paracol}{% Environment paracol cannot work with ordinary two-column typesetting.}\@ehb\fi \global\pcol@ncolleft#1\relax \global\pcol@ncol#2\relax \ifnum\pcol@ncolleft>\pcol@ncol \global\pcol@ncolleft\pcol@ncol \fi \ifnum\pcol@ncolleft<\pcol@ncol\else \global\pcol@pairedtrue \fi \ifpcol@paired\else \pcol@swapcolumnfalse \fi \if@newlist \if@inlabel\else \if@nobreak \@nbitem \else \addpenalty\@beginparpenalty \addvspace\@topsep \addvspace{-\parskip}\addvspace{-\itemsep}% \fi \global\@newlistfalse \fi\fi % \end{macrocode} % % The third operation group is to set up lists for counters as follows. % First we obtain $\CC=\!\cl@@ckpt!$ to have all counters defined by % \!\newcounter! and \counter{page}. Then we scan $\CG=\!\pcol@gcounters!$ % applying \!\pcol@remctrelt! to each element to have % $\CTL=\!\pcol@counters!$ for all \lcounter{}s by removing all $\cg\in\CG$ % from $\CC$, and to move $\clist(\cg)=|\cl@|{\cdot}\cg$ to % $|\pcol@cl@|{\cdot}\cg$ redefining % $|\cl@|{\cdot}\cg=\!\pcol@stepcounter!\Arg{\cg}$ %  % \SpecialArrayIndex{\theta}{\cl@} %  % to clear descendant \lcounter{}s of $\cg$, i.e., those in $\clist(\cg)$. % % Next we scan $\CTL$ applying \!\pcol@thectrelt! to each element $\cl\in\CTL$ % to let $|\pcol@thectr@|{\cdot}\~\cl=|\the|{\cdot}\cl$ %  % \SpecialArrayIndex{\theta}{\pcol@thectr@} % \SpecialArrayIndex{\theta}{\the} %  % so that the former has the {\em default} \lrep{} of $\cl$. The macro % \!\pcol@thectrelt! also lets % $|\the|{\cdot}\cl=|\pcol@thectr@|{\cdot}\cl{\cdot}0$ %  % \SpecialArrayIndex{\theta{\cdot}c}{\pcol@thectr@} % \SpecialArrayIndex{\theta}{\the} %  % if the \lrep{} for $\cl$ and $c=0$ has been defined by % \!\definethecounter!. This is necessary because in the first visit to the % leftmost column 0 we will neither invoke \!\pcol@switchcol! nor thus scan % $\CTL$ with \!\pcol@setctrelt! which defines \lrep{}s, unless a \mctext{} % is specified with \beginparacol. % % Next we give the initial value of $\val_c(\cl)$ for each column $c$ and % \lcounter{} $\cl\in\CTL$ by the followings enclosed in a group. First we % scan $\Cc_0$ applying \!\pcol@loadctrelt! to each % $\cl\in\Cc'_0=\Set{\theta}{\<\theta,\val_0(\theta)\>\in\Cc_0}$ to have % the value $\val_0(\cl)$ in $|\pcol@ctr@|{\cdot}\cl$ %  % \SpecialArrayIndex{\theta}{\pcol@ctr@} %  % temporarily. Next we scan $\CTL$ to pick \lcounter{}s $\theta$ such that % $\Uidx\Val(\theta)\neq\val_0(\theta)$ where $\Val(\theta)$ is the value of % $\theta$ outside \env{paracol} environment, or $\theta\notin\Cc'_0$, to % let them be listed in \!\@gtempa!. That is, we pick \lcounter{}s which % have been updated or defined after the closing of the previous % \env{paracol}, or everything in $\CTL$ at the first \beginparacol{} because % $\Cc_0=\emptyset$\footnote{ %  % Undefined in fact.}. %  % Finally, we invoke \!\pcol@synccounter! giving it \!\@gtempa! as its % argument to let $\val_c(\theta)=\Val(\theta)$ for all $c$ and for each % $\theta$ in \!\@gtempa!. That is, when \env{paracol} environment appears % two or more times, the value of a \lcounter{} at the beginning of the % second or succeeding environment is kept unchanged from that at the end of % the previous environment, unless it has been updated between them. Note % that these scans above are enclosed in a group in order to make % $|\pcol@ctr@|{\cdot}\cl$ %  % \SpecialArrayIndex{\theta}{\pcol@ctr@} %  % local and thus collected as a garbage at \!\endgroup!. %  % \begin{macrocode} \global\let\pcol@counters\cl@@ckpt \let\@elt\pcol@remctrelt \pcol@gcounters \let\@elt\pcol@thectrelt \pcol@counters \begingroup \let\@elt\pcol@loadctrelt \csname pcol@counters0\endcsname \let\@elt\pcol@cmpctrelt \global\let\@gtempa\@empty \pcol@counters \pcol@synccounter\@gtempa \endgroup % \end{macrocode} %  % Fourth, we set up a few \LaTeX's typesetting parameters which should have % appropriate values in the environment. We let % $\CSIndex{if@twocolumn}=\true$ so that \textit{float}|*| environments work % for \pwise{} floats and LaTeX's \!\@addmarginpar! determine the margin % for marginal notes by \CSIndex{if@firstcolumn} whose truth value is % determined by our own \!\@addmarginpar!. We also let $\!\col@number!=1$ % instead of $\C$ so that its (almost surely) sole user \!\maketitle! will % not produce the title with \!\twocolumn! which cannot be in the % environment. % % Then we invoke $\!\pcol@setcolumnwidth!\<\Cfrom\>\<\Cto\>\\$ once % or twice with % $(\Cfrom,\Cto,r,s)=(0,\CL,\!\pcol@columnratioleft!,\!\pcol@colwidthspecleft!)$ % always for left \parapag{}e, and with % $(\CL,\C,\!\pcol@columnratioright!,\!\pcol@colwidthspecright!)$ for right % one if $\CL<\C$ to define column widths $\w_c=|\pcol@columnwidth|{\cdot}c$ %  % \SpecialArrayIndex{c}{\pcol@columnwidth} %  % and that of \csepgap{}s $\gap_c=|\pcol@columnsep|{\cdot}c$ %  % \SpecialArrayIndex{c}{\pcol@columnsep} %  % for all $c\In0\C=\LBRP0\CL\cup\LBRP\CL\C$. % % Then we initialize other variables as follows; % $\lrm=\!\pcol@lrmargin!=\!\textwidth!-\!\linewidth!$ so that, if $\lrm>0$, % \!\linewidth! for $c$ has $\w_c-\lrm$ reflecting the paragraph shape of the % \env{list}-like environment surrounding \env{paracol} environment; % $\!\pcol@topskip!=\!\topskip!$ for the second and succeeding pages; % $\!\pcol@textfloatsep!=\infty$ to mean we don't have any \sync{}ation % points so far; $\CSIndex{ifpcol@lastpage}=\false$ because the \spage{} is % not the last so far; and $\!\pcol@firstprevdepth!=\!\prevdepth!$ in % decimal integer form for the extreme empty case. % % We also make the macro \!\@combinefloats! \!\let!-equal to our own % \!\pcol@combinefloats! throughout the environment, after saving its % original definition into \Midx{\!\pcol@@combinefloats!} for processing % \!\output! request sneaked from outside of environment, so that our % customization is in effect for any invocations including those from % \LaTeX's own macros. Similarly, \!\@addmarginpar! is made \!\let!-equal % to our own \!\pcol@addmarginpar! while its original definition is saved % into \!\pcol@@addmarginpar! but in this case we need the original for the % implementation of our own. On the other hand, \!\end@dblfloat! is simply % replaced with our own \!\pcol@end@dblfloat! being what \LaTeX{} had had until % 2014 as discussed in item-(\ref{item:ovv-float-end@dblfloat}) of % \secref{sec:imp-ovv-float}. %  % \changes{v1.1}{2012/05/11} % {Replace the calculation of \cs{columnwidth} with the call of % \cs{pcol@setcolumnwidth} and the assignment of $w_0$ to it.} % \changes{v1.2-4}{2013/05/11} % {Modify the setting of \cs{if@firstcolumn} according to % column-swapping.} % \changes{v1.2-5}{2013/05/11} % {Remove the setting \cs{columnwidth}, \cs{hsize} and \cs{linewidth} % because they are properly set in and after \cs{pcol@output@start}.} % \changes{v1.2-5}{2013/05/11} % {Add the setting of \cs{pcol@lrmargin}.} % \changes{v1.2-7}{2013/05/11} % {Add the saving of \cs{@combinefloats}.} % \changes{v1.3-4}{2013/09/17} % {Revise the mechanism to define the width of columns and % column-separating gaps, and add local overriding definition of % \cs{@addmarginpar}.} % \changes{v1.3-2}{2013/09/17} % {Add operations to define the width of columns and column-separating % gaps in right parallel-pages.} % \changes{v1.32-3}{2015/10/10} % {Add replacement of \cs{end@dblfloat} with \cs{pcol@end@dblfloat}.} %  % \begin{macrocode} \global\@twocolumntrue \col@number\@ne \pcol@setcolumnwidth\z@\pcol@ncolleft \pcol@columnratioleft\pcol@colwidthspecleft \ifnum\pcol@ncolleft<\pcol@ncol \pcol@setcolumnwidth\pcol@ncolleft\pcol@ncol \pcol@columnratioright\pcol@colwidthspecright \fi \pcol@lrmargin\textwidth \advance\pcol@lrmargin-\linewidth \global\pcol@topskip\topskip \global\pcol@textfloatsep\maxdimen \pcol@lastpagefalse \xdef\pcol@firstprevdepth{\number\prevdepth}% \let\pcol@@combinefloats\@combinefloats \let\@combinefloats\pcol@combinefloats \let\pcol@@addmarginpar\@addmarginpar \let\@addmarginpar\pcol@addmarginpar \let\end@dblfloat\pcol@end@dblfloat % \end{macrocode} % % Fifth, we save the original definition of \!\set@color! into % \!\pcol@set@color!, and then examine if $\!\set@color!\neq\!\relax!$ % meaning some coloring package is loaded. If any coloring packages are not % loaded, we make macros for \bgpaint{}, namely \!\pcol@bg@paintpage!, % \!\pcol@bg@paintcolumns! and \!\pcol@bg@paintbox!, \!\let!-equal to % \!\relax! for the first two and to \!\@gobble! for the last so that they do % nothing without coloring package. % % If the coloring is enabled, on the other hand, we redefine \LaTeX's % \!\set@color! so that it works as \!\pcol@set@color@push! with % \colorstack. We also prepare the text coloring mechanism to let % $\CSIndex{ifpcol@inner}=\true$ in every \!\vbox! in the \env{paracol} % environment as follows. First, we let $\CSIndex{ifpcol@inner}=\false$ % because we are not in any \!\vbox!es obviously. Then, to use % \!\everyvbox! for our own purpose, we do the followings; (1) \!\global!ly % assign a token \Midx{\!\pcol@dummytoken!}, which should never occurs, to % \!\pcol@everyvbox!; (2) save \!\everyvbox! into \!\pcol@everyvbox! % locally; (3) let \!\everyvbox! have a \!\the!-reference to % \!\pcol@everyvbox! and |\pcol@innerture| to let % $\CSIndex{ifpcol@inner}={\true}$; and then (4) make \!\everyvbox! % \!\let!-equal to \!\pcol@everyvbox!. By the last operation (4), any % \!\everyvbox! appearing in the \env{paracol} environment is replaced with % \!\pcol@everyvbox! to keep the real \!\everyvbox! from modified nullifying % our own operation |\pcol@innertrue|. On the other hand, since both % \!\everyvbox! and \!\pcol@everyvbox! are registers to hold tokens and % thus any operations applicable to \!\everyvbox! are also applicable to % \!\pcol@everyvbox!, any updates on \!\everyvbox! and explicit references % to it are simulated by \!\pcol@everyvbox!. Then the initial tokens given % to \!\pcol@everyvbox! by the saving operation (2) or tokens given inside % the environment are correctly processed whenever a \!\vbox! is opened, % together with |\pcol@innertrue| to fulfill our own purpose, because the % real \!\everyvbox! is let have a \!\the!-reference to \!\pcol@everyvbox! % by (3). We also reserve the invocation of \!\pcol@restoreeveryvbox! by % \!\aftergroup! so that the macro is invoked just after \Endparacol{} to % examine if any \!\global! assignments to \!\everyvbox! has been made in % the environment. The funny \!\global! assignment (1) is done for this % examination so that we detect global assignments done in the environment % having been closed because they should have changed the global value of % \!\pcol@everyvbox! to something different from \!\pcol@dummytoken!. % % Then we continue the case having some coloring package to make \bgpaint{} % macros \!\pcol@bg@paintpage!, \!\pcol@bg@paintbox! and % \!\pcol@bg@paintcolumns! activated by making them \!\let!-equal to their % |@@| counterparts namely \!\pcol@bg@@paintpage!, \!\pcol@bg@@paintbox! and % \!\pcol@bg@@paintcolumns! which implement \bgpaint{}. % % Finally we empty the shadow \colorstack{} % $\cstshadow={}$\!\pcol@colorstack@shadow! to give it initial value % regardless of the availability of coloring package. %  % \changes{v1.2-1}{2013/05/11} % {Add redefinitions of \cs{set@color} and \cs{reset@color}.} % \changes{v1.22}{2013/06/30} % {Add a trick with \cs{everyvbox} to turn on \cs{ifpcol@inner} in % every \cs{vbox}.} % \changes{v1.22}{2013/06/30} % {Move initial emptying of $\string\mathit{\Gamma}$ from % \cs{pcol@output@start} to \cs{pcol@zparacol}.} % \changes{v1.22}{2013/06/30} % {Add initial emptying of $\string\hat{\mathit{\Gamma}}$ and $\chi$.} % \changes{v1.3-3}{2013/09/17} % {Add definition of painting macros dependent to the availability of % a coloring package.} % \changes{v1.34}{2018/05/07} % {Remove the initializations of \cs{pcol@colorstack} and % \cs{pcol@colorstack@buf} because they no longer exist.} %  % \begin{macrocode} \global\let\pcol@set@color\set@color \ifx\set@color\relax \let\pcol@bg@paintpage\relax \let\pcol@bg@paintbox\@gobble \let\pcol@bg@paintcolumns\relax \else \let\set@color\pcol@set@color@push \pcol@innerfalse \global\pcol@everyvbox{\pcol@dummytoken}% \pcol@everyvbox\everyvbox \everyvbox{\the\pcol@everyvbox \pcol@innertrue} \let\everyvbox\pcol@everyvbox \aftergroup\pcol@restoreeveryvbox \let\pcol@bg@paintpage\pcol@bg@@paintpage \let\pcol@bg@paintbox\pcol@bg@@paintbox \let\pcol@bg@paintcolumns\pcol@bg@@paintcolumns \fi \gdef\pcol@colorstack@shadow{}% % \end{macrocode} %  % \changes{v1.2-2}{2013/05/11} % {Add initialization of \cs{pcol@footnotebase} and % \cs{pcol@nfootnotes}, and redefinitions of \cs{footnote}, % \cs{footnotemark}, \cs{footnotetext} and \cs{@footnotetext}.} % \changes{v1.36-3}{2024/10/23} % {Check for \cs{@footnotetext} being renamed to \cs{H@@footnotetext}.} % % The sixth settings are for (mainly \mcfnote) footnotes. We initialize two % footnote-related count registers letting $\bf=\!\pcol@footnotebase!$ have % \!\c@footnote! and zero-clearing $\nf=\!\pcol@nfootnotes!$. Then we % redefine \LaTeX's API macros \!\footnote!, \!\footnotemark! and % \!\footnotetext! to let them be our own \!\pcol@footnote!, % \!\pcol@footnotemark! and \!\pcol@footnotetext! so that they have % starred-versions. The other API macro to be redefined, if \Scfnote{} % typesetting is in effect, is \!\footnoterule! which lets % $\!\columnwidth!=\!\textwidth!$ before invoking its original version saved % in \!\pcol@footnoterule! so that it acts as in single-columned typesetting % rather than multi-columned. Then we redefine \LaTeX's internal macro % \!\@footnotetext!\footnote{ % This is called \!\H@@footnotetext! if \textsf{hyperref} (with option % \texttt{hyperfootnote}) is loaded.} % letting it be our own \!\pcol@fntext! for encapsulating a footnote in a % \!\vbox! and for deferred \!\insert!ion with \Scfnote{} typesetting. %  % \begin{macrocode} \pcol@footnotebase\c@footnote \global\pcol@nfootnotes\z@ \let\footnote\pcol@footnote \let\footnotemark\pcol@footnotemark \let\footnotetext\pcol@footnotetext \ifpcol@scfnote \def\footnoterule{{\columnwidth\textwidth \pcol@footnoterule}}% \fi \@ifundefined{H@@footnotetext}{% \let\@footnotetext\pcol@fntext }{% \let\H@@footnotetext\pcol@fntext } % \end{macrocode} % % Seventh, we let \!\marginpar!, \!\@mn@@marginnote! and \!\@xympar! be our % own versions \!\pcol@marginpar!, \!\pcol@marginnote! and \!\pcol@xympar! % respectively for the emulation of \!\marginnote!, saving the original % version of the first and third into \!\pcol@@marginpar! and % \!\pcol@@xympar!. Then we inactivate API macros \!\twosided! and % \!\footnoteplacement! together with their backward-compatible macros % \!\swapcolumninevenpages!, \!\noswapcolumnineven~pages!, % \!\footnotelayout!, \!\multicolumnfootnotes!, \!\singlecolumnfootnotes! and % \!\mergedfootnotes!, so that they commonly invoke \!\pcol@ignore! because % their inherent operations turning corresponding switches are harmful in % \env{paracol} environment. Note that the inactivation of \!\twosided! is % done by redefinition of \!\pcol@twosided! because we need optional % argument processing by \!\twosided! even when it is inactivated. Further % note, that since \textsf{footmisc} defines its own version of % \!\footnotelayout!, we must only redefine \!\footnotelayout! if it is what we % expect, i.e. an alias to \!\footnoteplacement!. %  % \changes{v1.2-4}{2013/05/11} % {Add nullification of \cs{[no]swapcolumninevenpages}.} % \changes{v1.2-2}{2013/05/11} % {Add nullification of API macros of footnote typesetting definition.} % \changes{v1.3-3}{2013/09/17} % {Add new API inactivation for \cs{pcol@twosided}.} % \changes{v1.3-4}{2013/09/17} % {Add new API inactivation for \cs{pcol@twosided}.} % \changes{v1.3-5}{2013/09/17} % {Add new API inactivation for \cs{footnotelayout}.} % \changes{v1.35-3}{2018/12/31} % {Add local modifications of \cs{marginpar}, \cs{@mn@@marginnote} and % \cs{@xympar} for the emulation of \cs{marginnote}.} % \changes{v1.36-2}{2024/10/22} % {Add new API inactivation for \cs{footnoteplacement} and a check before % deactivating \cs{footnotelayout}.} %  % \begin{macrocode} \let\pcol@@marginpar\marginpar \let\marginpar\pcol@marginpar \let\@mn@@marginnote\pcol@marginnote \let\pcol@@xympar\@xympar \let\@xympar\pcol@xympar \def\pcol@twosided[#1]{\pcol@ignore\twosided}% \def\swapcolumninevenpages{\pcol@ignore\swapcolumninevenpages}% \def\noswapcolumninevenpages{\pcol@ignore\noswapcolumninevenpages}% \def\footnoteplacement#1{\pcol@ignore\footnoteplacement}% \ifx\footnotelayout\footnoteplacement \def\footnotelayout#1{\pcol@ignore\footnotelayout}% \fi \def\multicolumnfootnotes{\pcol@ignore\multicolumnfootnotes}% \def\singlecolumnfootnotes{\pcol@ignore\singlecolumnfootnotes}% \def\mergedfootnotes{\pcol@ignore\mergedfootnotes}% % \end{macrocode} % % Eighth, we scan the list \!\pcol@localcommands! of $\arg{com}$ being the % name of commands, e.g., |switchcolumn|, available only in the environment % or customized for the environment, applying \!\pcol@defcomelt! to each % $\arg{com}$ to let $|\|\arg{com}=|\pcol@com@|{\cdot}\arg{com}$ %  % \SpecialArrayMainIndex{\string\arg{com}}{\pcol@com@} %  % the latter of which is the real implementation of the former. Note that % the list does not have all \elocal{} API commands but we omit % \!\column!(|*|) for \env{column}(|*|) environments because their % implementations \!\pcol@com@column!(|*|) are modified after the first % invocation. Therefore, we \!\def!ine \!\column!(|*|) to have % \!\pcol@com@column!(|*|) in their bodies\footnote{ %  % We can do this for other commands instead of adhering to \cs{let} to % eliminate the exception, but the author loves to use \cs{let} as much as % possible.}. %  % We also give the first \!\def!initions of % \!\pcol@com@column!(|*|) to let them do nothing but re\!\def!ine % themselves by \!\pcol@defcolumn! unless % \!\pcol@com@column*! is given an optional \mctext{} argument which is % directly processed by \!\pcol@sptext!, if they appear as the first % \cswitch{} command\slash environment after \beginparacol. Then we % re\!\def!ine \!\paracol! itself so that it will complain of illegal % nesting by \!\PackageError!. %  % \begin{macrocode} \let\@elt\pcol@defcomelt \pcol@localcommands \def\column{\pcol@com@column}% \@namedef{column*}{\@nameuse{pcol@com@column*}}% \global\let\pcol@com@column\pcol@defcolumn \global\@namedef{pcol@com@column*}{\pcol@defcolumn \@ifnextchar[%] \pcol@sptext\relax}% \def\paracol##1{\PackageError{paracol}{% Environment paracol cannot be nested.}\@eha}% % \end{macrocode} % % Ninth, we let \!\output! have our output routine \!\pcol@output! as its sole % token, and then make \!\output! request with % $\!\penalty!=\!\pcol@op@start!$ by \!\pcol@invokeoutput! to invoke % \!\pcol@output@start! for initialization, after letting % $\!\@elt!=\!\relax!$ to make it sure that any lists can be manipulated % without unexpected application of a macro to their elements. %  % \begin{macrocode} \output{\pcol@output}% \let\@elt\relax \pcol@invokeoutput\pcol@op@start % \end{macrocode} % % Tenth and finally, we let $\!\pcol@nextcol!=0$ in case \beginparacol{} has % the optional argument for \mctext{}, and invoke \!\pcol@sptext! if it has. % Otherwise, we invoke $|\pcol@colpream|{\cdot}0$ being the \colpream{} of % the first column 0, which will be invoked by \!\pcol@switchcol! if % \mctext{} is given. %  % \SpecialArrayIndex{c}{\pcol@colpream} %  % \changes{v1.35-5}{2018/12/31} % {Add the invocation of $\cs{pcol@colpream}{\cdot}0$.} %  % \begin{macrocode} \pcol@nextcol\z@ \@ifnextchar[%] \pcol@sptext{\@nameuse{pcol@colpream0}}} % \end{macrocode} % \end{macro}\end{macro}\end{macro}\end{macro} % % \begin{macro}{\pcol@paracol} % The macro \!\pcol@paracol! has the definition of \!\paracol!, which is % redefined in the macro itself, so that the only referrer % \!\pcol@icolumncolor! examines if it appears in \env{paracol}, i.e., % $\!\pcol@paracol!\neq\!\paracol!$. %  % \begin{macrocode} \let\pcol@paracol\paracol % \end{macrocode} % \end{macro} % % \begin{macro}{\thecolumn} % \changes{v1.3-5}{2013/09/17} % {Introduced to let users know which column they are working in.} %  % The API macro \!\thecolumn! gives the value of \!\pcol@currcol! to users % to let them know which column they are working in so that, for example, % they do some column-dependent operations. %  % \begin{macrocode} \def\thecolumn{\number\pcol@currcol} % \end{macrocode} % \end{macro} % % \begin{macro}{\pcol@ignore} % \changes{v1.2-4}{2013/05/11} % {Introduced for nullification of \cs{[no]swapcolumninevenpages}.} % \changes{v1.2-2}{2013/05/11} % {Introduced for nullification of API macros of footnote typesetting % definition.} %  % The macro \!\pcol@ignore!$\arg{macro}$ is to complain that the % $\arg{macro}$ being one of the followings appears in \env{paracol} % environment. %  % \begin{itemize}\raggedright\item[] % \!\twosided!, % \!\swapcolumninevenpages!, % \!\noswapcolumninevenpages!, % \!\footnoteplacement!, % \!\footnotelayout!, % \!\multicolumnfootnotes!, % \!\singlecolumnfootnotes!, % \!\mergedfootnotes! % \end{itemize} %  % That is, these macros, except for \!\twosided!, are re\!\def!ined in % \!\pcol@zparacol! to invoke this macro with the argument identifying % themselves, which is shown in the warning message given by % \!\PackageWarning!. As for \!\twosided!, the target of the % re\!\def!inition is \!\pcol@twosided! so that its optional argument is % captured before the complaint. %  % \begin{macrocode} \def\pcol@ignore#1{\PackageWarning{paracol}{The command \string#1 is not effective in paracol environment and thus ignored}} % \end{macrocode} % \end{macro} % % \begin{macro}{\pcol@localcommands} % \changes{v1.0}{2011/10/10} % {Introduced to make API commands environment-local.} % \changes{v1.3-5}{2013/09/17} % {Add \cs{@elt}\string\texttt{\char`\{cleardoublepage\char`\}} for % \cs{cleardoublepage}.}  %  % The macro \!\pcol@localcommands! is the list of the names of the following % {\em\Uidx\elocal} API commands (or {\em\Uidx\lcommand{}s} in short) and is % solely referred to by \!\pcol@zparacol!. %  % \begin{center}\begin{tabular}{llll} % \!\switchcolumn!& % \!\endcolumn!(|*|)& % \!\nthcolumn!(|*|)&\!\endnthcolumn!(|*|)\\ % \!\leftcolumn!(|*|)&\!\endleftcolumn!(|*|)& % \!\rightcolumn!(|*|)&\!\endrightcolumn!(|*|)\\ % \!\flushpage!& % \!\clearpage!& % \!\cleardoublepage!\\ % \!\synccounter!& % \!\syncallcounters! % \end{tabular}\end{center} %  % Note that we omit \!\column!(|*|) from the list as discussed in the % description of \!\pcol@zparacol!. %  % \begin{macrocode} \def\pcol@localcommands{% \@elt{switchcolumn}% \@elt{endcolumn}\@elt{endcolumn*}% \@elt{nthcolumn}\@elt{endnthcolumn}\@elt{nthcolumn*}\@elt{endnthcolumn*}% \@elt{leftcolumn}\@elt{endleftcolumn}\@elt{leftcolumn*}\@elt{endleftcolumn*}% \@elt{rightcolumn}\@elt{endrightcolumn}% \@elt{rightcolumn*}\@elt{endrightcolumn*}% \@elt{flushpage}\@elt{clearpage}\@elt{cleardoublepage}% \@elt{synccounter}\@elt{syncallcounters}} % \end{macrocode} % \end{macro} %  % \begin{macro}{\pcol@defcomelt} % \changes{v1.0}{2011/10/10} % {Introduced to make API commands environment-local.} %  % The macro \!\pcol@defcomelt! is invoked solely from \!\pcol@zparacol! to be % applied to each element $\arg{com}$ in \!\pcol@localcommands!. Two % lengthy \!\let!s with \!\expandafter!s are for doing % $\!\let!|\|\arg{com}|=\pcol@com@|{\cdot}\arg{com}$ to bind the \elocal{} % API command $|\|\arg{com}$ and its implementation % $|\pcol@com@|{\cdot}\arg{com}$. %  % \SpecialArrayIndex{\string\arg{com}}{\pcol@com@} %  % \begin{macrocode} \def\pcol@defcomelt#1{% \expandafter\let\expandafter\reserved@a\csname pcol@com@#1\endcsname \expandafter\let\csname #1\endcsname\reserved@a} % \end{macrocode} % \end{macro} % % \begin{macro}{\@dbldeferlist} % \changes{v1.32-3}{2015/10/10} % {Add top-level definition in case that future \LaTeX{} removes it at % all.} % \begin{macro}{\pcol@end@dblfloat} % \changes{v1.32-3}{2015/10/10} % {Added to go back to old mechanism.} % As discussed in \secref{sec:imp-ovv-float}, 2015 version of \LaTeX{} % no longer uses \!\@dbldeferlist! but the macro itself is still kept in % \LaTeX{}. However it will be removed in future to make the first % \!\@cons! with it resulting in an error. Therefore, here we have its top % level definition with empty duplicatedly in case of its future % elimination. The macro \!\end@dblfloat!, on the other hand, is replaced % with a new definition in the new \LaTeX{} of course, and thus we define % \!\pcol@end@dblfloat! here to keep its old definition and to replace the % new one in \env{paracol} environment as discussed in % item-(\ref{item:ovv-float-end@dblfloat}) of \secref{sec:imp-ovv-float}. %  % \begin{macrocode} \gdef\@dbldeferlist{} \def\pcol@end@dblfloat{% \if@twocolumn \@endfloatbox \ifnum\@floatpenalty <\z@ \@largefloatcheck \@cons\@dbldeferlist\@currbox \fi \ifnum \@floatpenalty =-\@Mii \@Esphack\fi \else \end@float \fi } % \end{macrocode} % \end{macro}\end{macro} % % % % \KeepSpace{6} % \section{Column Width Setting} % \label{sec:imp-cwidth} % \changes{v1.3-4}{2013/09/17} % {Add the section ``Column Width Setting'' mainly to discuss the new % API \cs{setcolumnwidth}.} % % \begin{macro}{\columnratio} % \changes{v1.1}{2012/05/11} % {Introduced to specify column width fractions.} % \changes{v1.3-2}{2013/09/17} % {Add optional second argument for fractions in right % parallel-pages.} % \begin{macro}{\pcol@icolumnratio} % \changes{v1.3-2}{2013/09/17} % {Introduced to process the optional second argument of % \cs{columnratio}.} % \begin{macro}{\pcol@columnratioleft} % \changes{v1.1}{2012/05/11} % {Introduced to keep column width fractions.} % \changes{v1.3-2}{2013/09/17} % {Renamed from \cs{pcol@columnratio} to clarify it has fractions for % left parallel-pages.} % \begin{macro}{\pcol@columnratioright} % \changes{v1.3-2}{2013/09/17} % {Introduced to keep column width fractions for right % parallel-pages.} %  % The API macro $\!\columnratio! % \Arg{r^l_0,r^l_1,\cdots,r^l_{k^l-1}}|[|r^r_0,r^r_1,\cdots,r^r_{k^r-1}|]|$ % defines the column width fraction $r^l_c$ for column $c$ in left % \parapag{}es and optionally $r^r_c$ for those in right \parapag{}es. This % macro and its callee \!\pcol@icolumnratio! just \!\global!y \!\def!ine % macros \!\pcol@columnratioleft! and \!\pcol@columnratioright! whose % bodies have the first and second arguments respectively, or commonly have % the first if the second optional one is not given, so that they are given % to \!\pcol@setcolwidth@r! as its third argument through % \!\pcol@setcolumnwidth! invoked in \!\pcol@zparacol!. Both of % \!\pcol@columnratioleft! and \!\pcol@columnratioright! are initialized to % be empty so that all columns have same width and are separated by % \!\columnsep! as default. Note that \!\pcol@columnratioleft! can be made % \!\let!-equal to \!\relax! by the related API macro \!\setcolumnwidth! so % that \!\pcol@setcolumnwidth! knows which of specifications given by two % API macros is effective and chooses \!\pcol@setcolwidth@r! or % \!\pcol@setcolwidth@s!. %  % \begin{macrocode} %% Column Width Setting \def\columnratio#1{\global\let\pcol@colwidthspecleft\relax \gdef\pcol@columnratioleft{#1}% \@ifnextchar[%] \pcol@icolumnratio{\gdef\pcol@columnratioright{#1}}} \def\pcol@icolumnratio[#1]{\gdef\pcol@columnratioright{#1}} \columnratio{}\relax % \end{macrocode} % \end{macro}\end{macro}\end{macro}\end{macro} % % \KeepSpace{2} % \begin{macro}{\setcolumnwidth} % \changes{v1.3-4}{2013/09/17} % {Introduced to specify column widths and column-separating gaps more % detailedly.} % \begin{macro}{\pcol@isetcolumnwidth} % \changes{v1.3-4}{2013/09/17} % {Introduced to process the optional second argument of % \cs{setcolumnwidth}.} % \begin{macro}{\pcol@colwidthspecleft} % \changes{v1.3-4}{2013/09/17} % {Introduced to keep column width specifications for left % parallel-pages.} % \begin{macro}{\pcol@colwidthspecright} % \changes{v1.3-4}{2013/09/17} % {Introduced to keep column width specifications for right % parallel-pages.} %  % The API macro $\!\setcolumnwidth! % \Arg{s^l_0,s^l_1,\cdots,s^l_{k^l-1}}|[|s^r_0,s^r_1,\cdots,s^r_{k^r-1}|]|$ % defines the column width specification $s^l_c$ for column $c$ in left % \parapag{}es and optionally $s^r_c$ for those in right \parapag{}es, where % each specification $s^x_c$ has the form of $|[|w_c|][/[|g_c|]]|$ for width % and gap specifier $\w_c$ and $\gap_c$. After \!\let!ting % $\!\pcol@columnratioleft!=\!\relax!$ to disable the setting by % \!\columnratio! and to enable that done by this macro, the macro and its % callee \!\pcol@isetcolumnwidth! just \!\global!y \!\def!ine macros % \!\pcol@colwidthspecleft! and \!\pcol@colwidthspecright! whose bodies have % the first and second arguments respectively, or commonly have the first if % the second optional one is not given, so that they are given to % \!\pcol@setcolwidth@s! as its fourth argument through % \!\pcol@setcolumnwidth! invoked in \!\pcol@zparacol!. Both of % \!\pcol@colwidthspecleft! and \!\pcol@colwidthspecright! are initially % undefined because the default specification is given by % \!\columnratio!|{}|. %  % \begin{macrocode} \def\setcolumnwidth#1{\global\let\pcol@columnratioleft\relax \gdef\pcol@colwidthspecleft{#1}% \@ifnextchar[%] \pcol@isetcolumnwidth{\gdef\pcol@colwidthspecright{#1}}} \def\pcol@isetcolumnwidth[#1]{\gdef\pcol@colwidthspecright{#1}} % \end{macrocode} % \end{macro}\end{macro}\end{macro}\end{macro} % % \begin{macro}{\pcol@setcolumnwidth} % \changes{v1.3-4}{2013/09/17} % {Move original functions to \cs{pcol@setcolumnwidth@r} and redefine % this macro to switch \cs{pcol@setcolumnwidth@r} and % \cs{pcol@setcolumnwidth@s}.} %  % \begin{Sloppy}{1500} % The macro $\!\pcol@setcolumnwidth!\<\Cfrom\>\<\Cto\>\arg{ratio}\arg{spec}$ % is invoked solely from \!\pcol@zparacol! but can be twice, with; % $$ % (\Cfrom,\Cto,\arg{ratio},\arg{spec})= % (0,\CL,\!\pcol@columnratioleft!,\!\pcol@colwidthspecleft!) % $$ % always and with; % $$ % (\Cfrom,\Cto,\arg{ratio},\arg{spec})= % (\CL,\C,\!\pcol@columnratioright!,\!\pcol@colwidthspecright!) % $$ % if $\CL<\C$ for \parapag{}ing. The macro simply invokes % \!\pcol@setcolwidth@s! if $\!\pcol@columnratioleft!=\!\relax!$ because % \!\setcolumnwidth! did so, or \!\pcol@setcolwidth@r! otherwise, with all % arguments given by \!\pcol@zparacol!. % \end{Sloppy} %  % \begin{macrocode} \def\pcol@setcolumnwidth{% \ifx\pcol@columnratioleft\relax \let\reserved@a\pcol@setcolwidth@s \else \let\reserved@a\pcol@setcolwidth@r \fi \reserved@a} % \end{macrocode} % \end{macro} % % \begin{macro}{\pcol@setcolwidth@r} % \changes{v1.1}{2012/05/11} % {Introduced to calculate $w_c$.} % \changes{v1.3-4}{2013/09/17} % {Renamed from \cs{pcol@setcolumnwidth} to make it clear what the % macro works for.} % \changes{v1.3-2}{2013/09/17} % {Add arguments $C^0$, $C^1$, $\langle\string\mathit{ratio}\rangle$ % and $\langle\string\mathit{spec}\rangle$ for columns in right % parallel-pages.} % \changes{v1.3-3}{2013/09/17} % {Add setting of $g_c\EQ\cs{pcol@columnsep}{\cdot}c=\cs{columnsep}.} %  % \begin{Hfuzz}{0.3pt}% % The macro $\!\pcol@setcolwidth@r!\<\Cfrom\>\<\Cto\>\arg{ratio}\arg{spec}$ % is invoked solely from \!\pcol@zparacol! through \!\pcol@setcolumnwidth! % once or twice with the arguments described in the explanation of the % latter macro. The macro calculates $\w_c=|\pcol@columnwidth|{\cdot}c$ %  % \SpecialArrayIndex{c}{\pcol@columnwidth} %  % for all $c\In\Cfrom\Cto$, from the fractions $r_0$, $r_1$, \ldots, % $r_{k-1}$ given through the third argument $\arg{ratio}$, which was given % to \!\columnratio! and then kept in \!\pcol@columnratioleft! or % \!\pcol@columnratioright!. The macro also lets % $\gap_c=|\pcol@columnsep|{\cdot}c=\!\columnsep!$ %  % \SpecialArrayIndex{c}{\pcol@columnsep} %  % for all $c\In\Cfrom\Cto$. % \end{Hfuzz} % % First, we calculate $W=\!\textwidth!-(\Cto-\Cfrom-1)\times\!\columnsep!$ % being the sum of $\w_c$ for all $c\In\Cfrom\Cto$. Then we let % $\w_c=r_d{}W$ and $\gap_c=\!\columnsep!$ for all $c\In\Cfrom{k'}$ where % $k'=\min(k,\Cto-1)$, in the \!\@for! loop scanning $r_d$ for all % $d=c-\Cfrom\In0k$. Finally, we let % $\w_c=(W-\sum_{d=\Cfrom}^{k'-1}w_d)/(\Cto-\Cfrom-k')$ and % $\gap_c=\!\columnsep!$ for all $c\In{k'}\Cto$. Note that % $|\pcol@columnwidth|{\cdot}c$ and $|\pcol@columnsep|{\cdot}c$ are macros % having the integer representations of $\w_c$ and $\gap_c$ with the unit % |sp|. %  % \begin{macrocode} \def\pcol@setcolwidth@r#1#2#3#4{% \@tempcntb#2\advance\@tempcntb-#1\advance\@tempcntb\m@ne \@tempdima-\columnsep \multiply\@tempdima\@tempcntb \advance\@tempdima\textwidth \@tempdimb\@tempdima \@tempcnta#1\relax\@tempcntb#2\advance\@tempcntb\m@ne \@for\reserved@a:=#3\do{% \ifnum\@tempcnta<\@tempcntb \@tempdimc\reserved@a\@tempdima \expandafter\xdef\csname pcol@columnwidth\number\@tempcnta\endcsname{% \number\@tempdimc sp}% \global\@namedef{pcol@columnsep\number\@tempcnta}{\columnsep}% \advance\@tempdimb-\@tempdimc \advance\@tempcnta\@ne \fi}% \@tempcntb#2\advance\@tempcntb-\@tempcnta \divide\@tempdimb\@tempcntb \@whilenum\@tempcnta<#2\do{% \expandafter\xdef\csname pcol@columnwidth\number\@tempcnta\endcsname{% \number\@tempdimb sp}% \global\@namedef{pcol@columnsep\number\@tempcnta}{\columnsep}% \advance\@tempcnta\@ne}% } % \end{macrocode} % \end{macro} % % \KeepSpace{3} % \begin{macro}{\pcol@setcolwidth@s} % \changes{v1.3-4}{2013/09/17} % {Introduced to calculate $w_c$ and $g_c$.} % \begin{macro}{\pcol@setcw@c} % \changes{v1.3-4}{2013/09/17} % {Introduced to process column width components in the argument % $\langle\string\mathit{spec}\rangle$ of \cs{pcol@setcolwidth@s}.} % \begin{macro}{\pcol@setcw@s} % \changes{v1.3-4}{2013/09/17} % {Introduced to process column-separating gap components in the % argument $\langle\string\mathit{spec}\rangle$ of % \cs{pcol@setcolwidth@s}.} % \begin{macro}{\pcol@setcw@filunit} % \changes{v1.3-4}{2013/09/17} % {Introduced to define the unit of infinite stretch factors in the % argument $\langle\string\mathit{spec}\rangle$ of % \cs{pcol@setcolwidth@s}.} %  % \begin{Hfuzz}{0.3pt}% % The macro $\!\pcol@setcolwidth@s!\<\Cfrom\>\<\Cto\>\arg{ratio}\arg{spec}$ % is invoked solely from \!\pcol@zparacol! through \!\pcol@setcolumnwidth! % once or twice with the arguments described in the explanation of the % latter macro. The macro calculates $\w_c=|\pcol@columnwidth|{\cdot}c$ %  % \SpecialArrayIndex{c}{\pcol@columnwidth} %  % for all $c\In\Cfrom\Cto$ and $\gap_c=|\pcol@columnsep|{\cdot}c$ %  % \SpecialArrayIndex{c}{\pcol@columnsep} %  % for all $c\In\Cfrom{\Cto{-}1}$, from the column\slash gap specifications % $s_0$, $s_1$, \ldots, $s_{k-1}$ given through the fourth argument % $\arg{spec}$, which was given to \!\setcolumnwidth! and then kept in % \!\pcol@colwidthspecleft! or \!\pcol@colwidthspecright!. % \end{Hfuzz} % % Each specification $s_d$ for $\w_c$ and $\gap_c$ where $c=\Cfrom+d$ has % the form $|[|w'_d|][/[|g'_d|]]|$ to specify the natural width $w^n_d$ and % $g^n_d$ and infinite stretch factor $w^f_d$ and $g^f_d$ of column\slash gap % specification as follows; %  % \begin{eqnarray*} % w^n_d&=&\cases{0&$w'_d=\emptyset$\cr % 0&$w'_d=f\!\fill!$\cr % \mathit{natural}(w'_d)&otherwise}\qquad % w^f_d = \cases{1&$w'_d=\emptyset$\cr % f&$w'_d=f\!\fill!$\cr % \mathit{stretch}(w'_d)&otherwise}\\[1ex] % g^n_d&=&\cases{\!\columnsep!&$g'_d=\emptyset$\cr % 0&$g'_d=f\!\fill!$\cr % \mathit{natural}(g'_d)&otherwise}\qquad % g^f_d = \cases{0&$g'_d=\emptyset$\cr % f&$g'_d=f\!\fill!$\cr % \mathit{stretch}(g'_d)&otherwise} % \end{eqnarray*} %  % where $\mathit{natural}(x)$ is the natural width of the skip $x$ and % $\mathit{stretch}(x)$ is the infinite stretch factor of $x$. Note that % any finite stretch factors or any shrink factors do not affect them, and % infinite stretch units |fil|, |fill| and |filll| are not distinguished. % From factors above, we determine $w_c$ and $\gap_c$ as follows; %  % \begin{eqnarray*} % W&=&\sum_{d=0}^{m-2}(w^n_d+g^n_d)+w^n_{m-1}\\ % F&=&\sum_{d=0}^{m-2}(w^f_d+g^f_d)+w^f_{m-1}\\ % x_c&=&\cases{(\WT/W)x^n_{c-\Cfrom}&$W\geq\WT\;\lor\;F\leq0$\cr % x^n_{c-\Cfrom}+(x^f_{c-\Cfrom}/F)(\WT-W)&$W<\WT\;\land\;F>0$} % \qquad(x\in{\w,\gap}) % \end{eqnarray*} % where $\WT=\!\textwidth!$ and $m=\Cto-\Cfrom$. % % To perform the assignments above, the macro at first invoke % $\!\pcol@setcw@scan!\<\Cfrom\>\<\Cto\>\~\ARg{spec}$ letting % $\!\pcol@setcw@c!=\!\pcol@setcw@s!=\!\pcol@setcw@accumwd!$ and % \!\pcol@setcw@filunit!${}=1$\,pt to scan $s_d$ for all $d\In0{m}$ and to % accumulate $W+g^n_{m-1}$ and $F+g^f_{m-1}$ in \!\dimen@! and \!\dimen@ii! % and then subtract $g^n_{m-1}$ and $g^f_{m-1}$ from them to have $W$ and % $F$. Note that $F$ is represented by a dimension with the unit of pt by % the definition of \!\pcol@setcw@filunit!. Then we invoke % \!\pcol@setcw@calcfactors! to calculate $(\WT/W)=\!\pcol@setcw@scale!$ and % $(\WT-W)/F=\!\@tempdimb!$. Finally we scan $s_d$ again but in this case % we let $\!\pcol@setcw@c!=\!\pcol@setcw@set!|{width}|$, % $\!\pcol@setcw@s!=\!\pcol@setcw@set!|{sep}|$ and % $\!\pcol@setcw@filunit!=\!\@tempdimb!=(\WT-W)/F$ to let $w_c$ and $\gap_c$ % have the values shown above. %  % \begin{macrocode} \def\pcol@setcolwidth@s#1#2#3#4{\begingroup \dimen@\z@ \dimen@ii\z@ \def\pcol@setcw@filunit{\@ne\p@}% \let\pcol@setcw@c\pcol@setcw@accumwd \let\pcol@setcw@s\pcol@setcw@accumwd \pcol@setcw@scan#1#2{#4}% \advance\dimen@-\@tempdima \advance\dimen@ii-\@tempdimb \pcol@setcw@calcfactors \def\pcol@setcw@c{\pcol@setcw@set{width}}% \def\pcol@setcw@s{\pcol@setcw@set{sep}}% \let\pcol@setcw@filunit\dimen@ii \pcol@setcw@scan#1#2{#4}% \endgroup} % \end{macrocode} % \end{macro}\end{macro}\end{macro}\end{macro} %  % \begin{macro}{\pcol@setcw@scan} % \changes{v1.3-4}{2013/09/17} % {Introduced to scan the argument % $\langle\string\mathit{spec}\rangle$ of \cs{pcol@setcolwidth@s}.} %  % The macro $\!\pcol@setcw@scan!\<\Cfrom\>\<\Cto\>\~\ARg{spec}$ is to scan % first $m=\Cto-\Cfrom$ elements in $\arg{spec}=s_0,s_1,\ldots$ being the % column\slash gap specifications given to \!\setcolumnwidth!. At first we % add `,' as many as $m$ to the tail of $\arg{spec}$ to make it sure the % resulting $\arg{spec}$ has $m$ or more elements. Then we scan all % elements in the extended $\arg{spec}$ by a \!\@for! loop having many % \!\expandafter! but equivalent to; %  % \begin{quote} % |\@for\reserved@a:=|$s_0,s_1,\ldots$|\do{|\textit{body}|}| % \end{quote} %  % In the \textit{body} above, we invoke % $\!\pcol@setcw@getspec!\;s_i|//|\!\@nil!$ to parse $s_i$ to have $w^n_i$, % $w^f_i$ to be processed by \!\pcol@setcw@c! and $g^n_i$ and $g^f_i$ by % \!\pcol@setcw@s!, for all $i\In0m$. %  % \begin{macrocode} \def\pcol@setcw@scan#1#2#3{\def\reserved@a{#3}% \@tempcnta#1\relax \@whilenum\@tempcnta<#2\do{ \edef\reserved@a{\reserved@a,}\advance\@tempcnta\@ne}% \@tempcnta#1\relax \expandafter\@for\expandafter\reserved@a\expandafter:\expandafter=\reserved@a \do{% \ifnum\@tempcnta<#2\relax \expandafter\pcol@setcw@getspec\reserved@a//\@nil \fi \advance\@tempcnta\@ne}} % \end{macrocode} % \end{macro} %  % \KeepSpace{1} % \begin{macro}{\pcol@setcw@getspec} % \changes{v1.3-4}{2013/09/17} % {Introduced to parse an element in the argument % $\langle\string\mathit{spec}\rangle$ of \cs{pcol@setcolwidth@s}.} % \begin{macro}{\pcol@setcw@getspec@i} % \changes{v1.3-4}{2013/09/17} % {Introduced to parse an element in the argument % $\langle\string\mathit{spec}\rangle$ of \cs{pcol@setcolwidth@s}.} % \begin{macro}{\pcol@setcw@fill} % \changes{v1.3-4}{2013/09/17} % {Introduced to extract \cs{fill} factor from an element in the % argument $\langle\string\mathit{spec}\rangle$ of % \cs{pcol@setcolwidth@s}.} %  % The macro % $\!\pcol@setcw@getspec!\|/|\|/|\arg{garbage}\!\@nil!$ is % used solely in \!\pcol@setcw@scan! to parse a column\slash gap % specification $s_d=|[|w'_d|][/[|g'_d|]]|$, to extract factors $w_d^n$, % $w_d^f$, $g_d^n$ and $g_d^f$, and to process width factors by % \!\pcol@setcw@c! and gap factors by \!\pcol@setcw@s!. Since the macro is % invoked with arguments in the form of $s_d|//|\!\@nil!$, if $s_d$ has % `|/|' in it $w'_d$ and $g'_d$ should have everything preceding and % following the `|/|' respectively while $\arg{garbage}$ should have the % redundant `|/|'. Otherwise, i.e., if $s_d$ does not have `|/|', % $w'_d=s_d$ and $g'_d=\emptyset$ while $\arg{garbage}=\emptyset$\footnote{ %  % If $s_d$ have two or more `|/|', everything following the second one is % thrown away into $\arg{garbage}$ together with `|//|'. Therefore we could % check if $s_d$ has at most one `|/|' by examining $\arg{garbage}$ but we % abandon it simply ignoring $\arg{garbage}$.}. %  % Therefore, we invoke $\!\pcol@setcw@getspec@i!\arg{default}\Arg{x'_d}$ twice % with $(\arg{default},x'_d)=(\!\fill!,w'_d)$ for a column and % $(\arg{default},x'_d)=(\!\columnsep!,g'_d)$ for a gap, and \!\pcol@setcw@c! % and \!\pcol@setcw@s! after each invocation respectively. % % In this macro, at first we scan all tokens in $x'_d$ by \!\@tfor! to % remove all space tokens in it\footnote{ %  % A proper skip specification and ``$f\!\fill!$'' is always proper without % space tokens in them.}. %  % Then if $x'_d$ after the space removal has nothing, we let % $x'_d=\arg{default}$. Next we examine if $x'_d=f\!\fill!$ in a tricky % way by temporarily \!\let!ting $\!\@gtempa!=\!\relax!$, defining \!\fill! % as ``|1pt|\!\gdef!\!\@gtempa!|{}|'' and making an assignment % ``\!\@tempskipa! $x'_d$''. That is, if $x'_d=f\!\fill!$, \!\@tempskipa! % will have $f{\cdot}|1pt|$ being a proper dimension and \!\@gtempa! is made % empty. Otherwise, \!\@tempskipa! should have $x'_d$ which must be a % proper skip and \!\@gtempa! remains unchanged from \!\relax!. Therefore, % if $\!\@gtempa!=\!\relax!$ we let $\!\@tempskipa!=x'_d$ again\footnote{ %  % Because the first assignment is done in a group.}. %  % Otherwise, we invoke $\!\pcol@setcw@fill!\;x'_d$ to let % \!\@tempskipa! have $0\,|pt|\ |plus|\ f\,|fil|$ where $f$ is replaced by 1 % if $f=\emptyset$. % % Now \!\@tempskipa! has $x_d^n$ as its natural component and may have some % infinite stretch component $x_d^f$ specified explicitly or with \!\fill!. % Therefore, we assign \!\@tempskipa! to \!\@tempdima! so that it has % $x_d^n$, and then, after adding 0\,|pt| |plus| 1000\,|pt| |minus| % 1000\,|pt| to \!\@tempskipa! to make it sure it has both stretch and shrink % components\footnote{ %  % Almost sure because they could be $-1000$\,pt, but we ignore the % possibility.} %  % keeping infinite stretch factor if any, invoke \!\pcol@extract@fil! giving % it \!\the!-expansion of \!\@tempskipa! as the argument to let % $\!\@tempdimb!=x_d^f\times\!\pcol@setcw@filunit!$. %  % \begin{macrocode} \def\pcol@setcw@getspec#1/#2/#3\@nil{% \pcol@setcw@getspec@i\fill{#1}\pcol@setcw@c \pcol@setcw@getspec@i\columnsep{#2}\pcol@setcw@s} \def\pcol@setcw@getspec@i#1#2{% \def\reserved@a{}% \@tfor\reserved@b:=#2\do{\edef\reserved@a{\reserved@a\reserved@b}} \ifx\reserved@a\@empty \let\reserved@a#1\fi \let\@gtempa\relax {\def\fill{1\p@\gdef\@gtempa{}}\@tempskipa\reserved@a}% \ifx\@gtempa\relax \@tempskipa\reserved@a\relax \else \expandafter\pcol@setcw@fill\reserved@a \fi \@tempdima\@tempskipa \advance\@tempskipa0\p@\@plus\@m\p@\@minus\@m\p@\relax \expandafter\pcol@extract@fil\the\@tempskipa\@nil} \def\pcol@setcw@fill#1\fill{\def\reserved@b{#1}% \ifx\reserved@b\@empty \let\reserved@b\@ne \fi \@tempskipa0\p@\@plus\reserved@b fil\relax} % \end{macrocode} % \end{macro}\end{macro}\end{macro} % % \begin{macro}{\pcol@setcw@accumwd} % \changes{v1.3-4}{2013/09/17} % {Introduced to accumulate natural and fill factors of the element in % the argument $\langle\string\mathit{spec}\rangle$ of % \cs{pcol@setcolwidth@s}.} %  % The macro \!\pcol@setcw@accumwd! is made \!\let!-equal to \!\pcol@setcw@c! % and \!\pcol@setcw@s! commonly and thus invoked from \!\pcol@setcw@getspec! % with setting $\!\@tempdima!=x_d^n$ and $\!\@tempdimb!=x_d^f\times1\,|pt|$, % where $x\in\{w,g\}$. The macro simply add them to \!\dimen@! and % \!\dimen@ii! respectively to accumulate $x_d^n$ and $x_d^f$ in them. %  % \begin{macrocode} \def\pcol@setcw@accumwd{\advance\dimen@\@tempdima \advance\dimen@ii\@tempdimb} % \end{macrocode} % \end{macro} %  % \begin{macro}{\pcol@setcw@set} % \changes{v1.3-4}{2013/09/17} % {Introduced to define $w_c$ and $g_c$ according to the element in % the argument $\langle\string\mathit{spec}\rangle$ of % \cs{pcol@setcolwidth@s}.} %  % The macro $\!\pcol@setcw@set!\ARg{wors}$ is made the body of % \!\pcol@setcw@c! with $\arg{wors}=|width|$ and of % \!\pcol@setcw@s! with $\arg{wors}=|sep|$ and thus invoked from % \!\pcol@setcw@getspec! with setting $\!\@tempdima!=x_d^n$ and % $$ % (\!\pcol@setcw@scale!,\!\@tempdimb!) % \in\{(\emptyset,\,(x_d^f/F)(\WT-W)),\;(\WT/W,\,0)\} % $$ % Therefore, we calculate % $x_c=\!\pcol@setcw@scale!\times\!\@tempdima!+\!\@tempdimb!$ and % \!\xdef!ine $|\pcol@column|{\cdot}\{\cdot}c$ to let it have the % integer representation of $x_c$ with the unit |sp|. %  % \SpecialArrayIndex{c}{\pcol@columnwidth} % \SpecialArrayIndex{c}{\pcol@columnsep} %  % \begin{macrocode} \def\pcol@setcw@set#1{% \@tempdima\pcol@setcw@scale\@tempdima \advance\@tempdima\@tempdimb \expandafter\xdef\csname pcol@column#1\number\@tempcnta\endcsname{% \number\@tempdima sp}} % \end{macrocode} % \end{macro} % % \begin{macro}{\pcol@setcw@calcfactors} % \changes{v1.3-4}{2013/09/17} % {Introduced to calculate scaling and stretch factors from % the argument $\langle\string\mathit{spec}\rangle$ of % \cs{pcol@setcolwidth@s}.} % \begin{macro}{\pcol@setcw@calcf} % \changes{v1.3-4}{2013/09/17} % {Introduced to calculate scaling or stretch factor from % the argument $\langle\string\mathit{spec}\rangle$ of % \cs{pcol@setcolwidth@s}.} % \changes{v1.31}{2013/10/10} % {Capitalize the first word of the error message for consistency.} % \begin{macro}{\pcol@setcw@scale} % \changes{v1.3-4}{2013/09/17} % {Introduced to have the scaling factor of $w_c$ and $g_c$.} %  % The macro \!\pcol@setcw@calcfactors! is used solely in % \!\pcol@setcolwidth@s! to calculate $\phi_s=\!\pcol@setcw@scale!$ and % $\phi_f=\!\dimen@ii!$ as follows % $$ % (\phi_s,\phi_f)=\cases{(\WT/\W,\;0)& $W\geq\WT\;\lor\;F\leq0$\cr % (1,\;(\WT-W)/F)&$W<\WT\;\land\;F>0$} % $$ % where $W=\!\dimen@!$, $F\times1\,|pt|=\!\dimen@ii!$ and $\WT=\!\textwidth!$, % and $\phi_s=1$ is represented by empty body of \!\pcol@setcw@scale!. % First we deal with the special and trivial case of $W=\WT$ to let % $\phi_s=1$ and $\phi_f=0$ so as to avoid arithmetic error in the % calculation of $\WT/W$. If $W\neq\WT$ on the other hand, we calculate % $\WT/W$ by $\!\pcol@setcw@calcf!\<\WT\>\\<\phi_s\>$ to have a % provisional result. Then if $W<\WT$ and $F>0$, we let $\phi_s=1$ and % invoke \!\pcol@setcw@calcf! again giving it $(\WT-W)$ and $F\times1\,|pt|$ % but throw away the result $(\WT-W)/(F\times1\,|pt|)$ because \!\@tempdimb! % should have $(\WT-W)/F$ which is then set into $\phi_f=\!\dimen@ii!$. % Otherwise, we keep the provisional result of $\phi_s$ as the final one and % let $\phi_f=\!\dimen@ii!=0$. % % The macro $\!\pcol@setcw@calcf!\\\$ calculates $z\approx x/y$ % and let $\!\@tempdimb!=Z=z\times1\,|pt|$ as follows. First we find the % following three parameters. %  % \begin{eqnarray*} % k_1&=&\min\Set{k}{k\geq0,\;x\cdot2^k\geq2^{13}\,|pt|}\\ % k_2&=&\max\Set{k}{y\bmod2^k=0}\\ % k_3&=&\min\Set{k}{k\geq0,\;\lceil y/2^{k_2+k}\rceil\leq2^{15}} % \end{eqnarray*} %  % With these parameters, we calculate $z'=\lfloor(x\cdot2^{k_1})/\lceil % y/2^{k_2+k_3}\rceil\rfloor$ to have a good approximation of % $(x/y)\cdot2^{k}$ where $k=k_1+k_2+k_3$ without arithmetic overflow. Then % if $z'/2^k\geq2^{14}$ or in other words $Z$ is larger than \!\maxdimen!, % we complain that by \!\PackageError! and, in case a user dare to % continue the typesetting process, we let $Z=10000\,|pt|$. Otherwise, we % calculate $Z=(z'/2^k)\cdot2^{16}=z'\cdot2^{16-k}$ to have it in % \!\@tempdimb! by $Z=z'\times2^{16-k}$ if $k<16$, or by $Z=z'/2^{k-16}$ % otherwise. Finally we invoke \!\pcol@extract@pt! giving it % \!\the!-representation of $Z$ to have $z$. % % Note that it is assured $z\leq x/y$ regardless of successfulness of the % calculation and thus the scaling $\phi_s x_d^n$ and stretching % $x_d^n+\phi_f x_d^f$ cannot exceed their exact value to make it also sure % that $\sum_{c=\Cfrom}^{\Cto-2}(\w_c+\gap_c)+\w_{\Cto-1}\leq\WT$ and thus % the series of columns and \csepgap{}s should not cause overfull when a % page is shipped out with \!\hfil! added to each \csepgap{} for underfull % avoidance. %  % \begin{macrocode} \def\pcol@setcw@calcfactors{% \ifdim\dimen@=\textwidth \def\pcol@setcw@scale{}\dimen@ii\z@ \else \pcol@setcw@calcf\textwidth\dimen@\pcol@setcw@scale \ifdim\dimen@<\textwidth \ifdim\dimen@ii>\z@ \def\pcol@setcw@scale{}% \@tempdimc\textwidth \advance\@tempdimc-\dimen@ \pcol@setcw@calcf\@tempdimc\dimen@ii\reserved@a \dimen@ii\@tempdimb \else \dimen@ii\z@ \fi \else \dimen@ii\z@ \fi \fi} \def\pcol@setcw@calcf#1#2#3{% \@tempdimb#1\@tempdima#2\@tempcnta\z@ \ifdim\@tempdima=\z@ \@tempdima1sp\relax\fi \@whiledim\@tempdimb<8192\p@\do{% \multiply\@tempdimb\tw@ \advance\@tempcnta\@ne}% \@tempdimc\@tempdima \@whiledim\@tempdima=\@tempdimc\do{% \divide\@tempdimc\tw@ \multiply\@tempdimc\tw@ \ifdim\@tempdima=\@tempdimc \divide\@tempdima\tw@ \divide\@tempdimc\tw@ \advance\@tempcnta\@ne \fi} \advance\@tempdima-1sp\relax \@whilenum\@tempdima>32768\do{\divide\@tempdima\tw@ \advance\@tempcnta\@ne}% \advance\@tempdima1sp\relax \divide\@tempdimb\@tempdima \@tempdimc\@tempdimb \@tempcntb\@tempcnta \@whilenum\@tempcntb>\z@\do{\divide\@tempdimc\tw@ \advance\@tempcntb\m@ne} \ifnum\@tempdimc>16383\relax \PackageError{% Scaling/filling factor for column/gap width is too large.}\@eha \@tempdimb\@M\p@ \else \@tempcntb\sixt@@n \advance\@tempcntb-\@tempcnta \ifnum\@tempcntb<\z@ \@whilenum\@tempcntb<\z@\do{\divide\@tempdimb\tw@ \advance\@tempcntb\@ne}% \else \@whilenum\@tempcntb>\z@\do{% \multiply\@tempdimb\tw@ \advance\@tempcntb\m@ne}% \fi \fi \expandafter\pcol@extract@pt\the\@tempdimb#3} % \end{macrocode} % \end{macro}\end{macro}\end{macro} % % \KeepSpace{3} % \begin{macro}{\pcol@defkw} % \changes{v1.3-4}{2013/09/17} % {Introduced to define $\cs{pcol@kw@}{\cdot}k$ where % $k\in\{\string\texttt{pt},\string\texttt{plus},\string\texttt{minus}, % \string\texttt{fil}\}$.} % \begin{macro}{\pcol@kw@pt} % \changes{v1.3-4}{2013/09/17} % {Introduced to have the keyword \string\texttt{pt}.} % \begin{macro}{\pcol@kw@plus} % \changes{v1.3-4}{2013/09/17} % {Introduced to have the keyword \string\texttt{plus}.} % \begin{macro}{\pcol@kw@minus} % \changes{v1.3-4}{2013/09/17} % {Introduced to have the keyword \string\texttt{minus}.} % \begin{macro}{\pcol@kw@fil} % \changes{v1.3-4}{2013/09/17} % {Introduced to have the keyword \string\texttt{fil}.} %  % The macro % $\!\pcol@defkw!|1.0|\arg{pt}\verb*| |\arg{plus}\verb*| 1.0|\arg{fil} % \verb*| |\arg{minus}\verb*| 1.0|\arg{garbage}\!\@nil!$ is used just once at % the top level to \!\def!ine \!\pcol@kw@pt!, \!\pcol@kw@plus!, % \!\pcol@kw@minus! and \!\pcol@kw@fil! letting them have $\arg{pt}=|pt|$, % $\arg{plus}=|plus|$, $\arg{minus}=|minus|$ and $\arg{fil}=|fil|$ in their % body respectively but with $\!\catcode!=12$ (other) which is used in % \!\the!-representation of glues. For the definition, we invoke % \!\pcol@defkw! giving it \!\the!-representation of \!\@tempskipa! letting % it have $1\,|pt|\ |plus|\ 1\,|fil|\ |minus|\ 1\,|fil|$ having all keywords % we need to have\footnote{ %  % We can do what \!\pcol@defkw! does by temporarily giving $\!\catcode!=12$ % to the characters for the keywords of course, but this method is much % easier.}. %  % The macro \!\pcol@kw@pt! is used in % $\!\pcol@extract@fil@ii!\arg{unit}\!\@nil!$ to examine if % $\arg{unit}=|pt|$, and in \!\pcol@def@extract@pt! to \!\def!ine % \!\pcol@extract@pt! having |pt| in its argument specification. The macros % \!\pcol@kw@plus! and \!\pcol@kw@minus! are used only in % \!\pcol@def@extract@fil!, and % \!\pcol@kw@fil! only in \!\pcol@def@extract@fil@iii!, to \!\def!ine % \!\pcol@extract@fil! having |plus| and |minus|, and % \!\pcol@extract@fil@iii! having |fil|, in their argument specifications % respectively. %  % \begin{macrocode} \@tempskipa 1\p@\@plus1fil\@minus1fil\relax \def\pcol@defkw1.0#1 #2 1.0#3 #4 1.0#5\@nil{% \def\pcol@kw@pt{#1}\def\pcol@kw@plus{#2}\def\pcol@kw@fil{#3}% \def\pcol@kw@minus{#4}} \expandafter\pcol@defkw\the\@tempskipa\@nil % \end{macrocode} % \end{macro}\end{macro}\end{macro}\end{macro}\end{macro} %  % \KeepSpace{4} % \begin{macro}{\pcol@def@extract@fil} % \changes{v1.3-4}{2013/09/17} % {Introduced to define \cs{pcol@extract@fil}.} % \begin{macro}{\pcol@extract@fil} % \changes{v1.3-4}{2013/09/17} % {Introduced to extract infinite stretch factor from a skip if any.} % \begin{macro}{\pcol@extract@fil@i} % \changes{v1.3-4}{2013/09/17} % {Introduced to extract the factor of \string\texttt{fil} from the % stretch factor in a skip if any.} % \begin{macro}{\pcol@extract@fil@ii} % \changes{v1.3-4}{2013/09/17} % {Introduced to extract the factor of \string\texttt{fil} from the % stretch factor in a skip if any.} % \begin{macro}{\pcol@def@extract@fil@iii} % \changes{v1.3-4}{2013/09/17} % {Introduced to define \cs{pcol@extract@fil@iii}.} % \begin{macro}{\pcol@extract@fil@iii} % \changes{v1.3-4}{2013/09/17} % {Introduced to extract the factor of \string\texttt{fil} from the % stretch factor in a skip.} %  % The macro % $\!\pcol@extract@fil!\<\mathit{garbage}_1\>\verb*| plus |\\verb*| minus| % \<\mathit{garbage}_2\>\!\@nil!$ is used solely in \!\pcol@setcw@getspec@i! % to extract the infinite stretch factor $f$ in the stretch component $s$ of % a column\slash gap specification $x'_d$ and to let % $\!\@tempdimb!=f\cdot{}u$ where % $u=\!\pcol@setcw@filunit!\in\{1\,|pt|,\;\phi_f=\!\dimen@ii!\}$ if $f$ % exist or $\!\@tempdimb!=0$ otherwise. First of all, since the macro has % keywords |plus| and |minus| in $\!\catcode!=12$ in its argument % specification, we \!\def!ine it using \!\pcol@def@extract@fil!, whose body % is equivalent to %  % \begin{itemize}\item[] % \let\@sverb\latex@sverb % \verb*|\def\pcol@extract@fil#1 plus #2 minus#3\@nil| % |{\pcol@extract@fil@i#2\@nil}| % \end{itemize} %  % just once at the top level. Then since $s$ should have the form % $\|.|\\arg{unit}$ where $n$ and $m$ are decimal digit sequences and % $\arg{unit}\in\{|pt|,|fil|,|fill|,|filll|\}$, we examine if % $\arg{unit}=|pt|$ or not by a tricky way in % $\!\pcol@extract@fil@i!\|.|\\!\@nil!$. That % is, we do $\!\count@!\\!\@nil!$ with % \!\afterassignment! to invoke $\!\pcol@extract@fil@ii!\arg{unit}\!\@nil!$ % after $m$ is assigned to \!\count@! to capture $\arg{unit}$. Then if it % is |pt| we let $\!\@tempdimb!=0$, or otherwise invoke % $\!\pcol@extract@fil@iii!\|fil|\arg{garbage}\!\@nil!$ giving it $s$ % because it should have a postfix being |fil|, |fill| or |filll|, to have % $\!\@tempdimb!=f\cdot u$ finally. Note that since % \!\pcol@extract@fil@iii! also has the keyword |fil| in its argument % specification, we \!\def!ine it using \!\pcol@def@extract@fil@iii!, whose % body is equivalent to %  % \begin{quote} % \let\@sverb\latex@sverb % \verb*|\def\pcol@extract@fil@iii#1fil#2\@nil{%|\\ % | \@tempdimb\pcol@setcw@filunit\relax \@tempdimb#1\@tempdimb}| % \end{quote} %  % just once at the top level too. %  % \begin{macrocode} \edef\pcol@def@extract@fil{% \def\noexpand\pcol@extract@fil ##1\space\pcol@kw@plus\space##2\space\pcol@kw@minus##3\noexpand\@nil{% \noexpand\pcol@extract@fil@i##2\noexpand\@nil}} \pcol@def@extract@fil \def\pcol@extract@fil@i#1.#2\@nil{\def\reserved@a{#1.#2}% \afterassignment\pcol@extract@fil@ii\count@#2\@nil} \def\pcol@extract@fil@ii#1\@nil{\def\reserved@b{#1}% \ifx\reserved@b\pcol@kw@pt \@tempdimb\z@ \else \expandafter\pcol@extract@fil@iii\reserved@a\@nil \fi} \edef\pcol@def@extract@fil@iii{% \def\noexpand\pcol@extract@fil@iii##1\pcol@kw@fil##2\noexpand\@nil{% \@tempdimb\noexpand\pcol@setcw@filunit\relax \@tempdimb##1\@tempdimb}} \pcol@def@extract@fil@iii % \end{macrocode} % \end{macro}\end{macro}\end{macro}\end{macro}\end{macro}\end{macro} % % \begin{macro}{\pcol@def@extract@pt} % \changes{v1.3-4}{2013/09/17} % {Introduced to define \cs{pcol@extract@pt}.} % \begin{macro}{\pcol@extract@pt} % \changes{v1.3-4}{2013/09/17} % {Introduced to extract the factor of \string\texttt{pt} from the % \cs{the} representation of a dimension.} %  % The macro $\!\pcol@extract@pt!\|pt|\$ is solely used in % \!\pcol@setcw@calcf! to extract $f$ from a dimension in the form of % $f|pt|$ and to let the macro $\$ have $f$. Since this macro has % the keyword |pt| in its argument specification, we \!\def!ine it using % \!\pcol@def@extract@pt!, whose body is equivalent to %  % \begin{quote} % \let\@sverb\latex@sverb % |\def\pcol@extract@pt#1pt#2{\def#2{#1}}| % \end{quote} % just once at the top level again. %  % \begin{macrocode} \edef\pcol@def@extract@pt{% \def\noexpand\pcol@extract@pt##1\pcol@kw@pt##2{\def##2{##1}}} \pcol@def@extract@pt % \end{macrocode} % \end{macro}\end{macro} % % % % \section{Counter Operations} % \label{sec:imp-counter} % % \begin{macro}{\globalcounter} % \changes{v1.2-7}{2013/05/11} % {Examine if the argument counter is already in % $\string\mathit{\Theta}^g$ to avoid the duplication in the list % which caused a bug.} % \changes{v1.32-1}{2015/10/10} % {Modified according to the introduction of \cs{globalcounter*}.} % \begin{macro}{\pcol@globalcounter@s} % \changes{v1.32-1}{2015/10/10} % {Added for \cs{globalcounter*}.} % \begin{macro}{\pcol@globalcounter} % \changes{v1.32-1}{2015/10/10} % {Renamed from \cs{globalcounter} according to the introduction of % \cs{globalcounter*}.} % \begin{macro}{\pcol@gcounters} % The API macro $\!\globalcounter!\ARg{ctr}$, implemented by % \!\pcol@globalcounter! and also used in \!\pcol@fnlayout@p! to globalize the % counter \counter{footnote}, defines that $\arg{ctr}$ is a \gcounter, and % thus adds it to $\CG=\Midx{\!\pcol@gcounters!}$, which has \counter{page} % at initial. Note that we examines if $\arg{ctr}\in\CG$ prior to the % addition to avoid the duplication in $\CG$. Also note that initial % definition of \!\pcol@gcounters! is done by \!\gdef! just for consistent % \!\global! assignments to it. On the other hand \!\globalcounter!|*|, % implemented by \!\pcol@globalcounter@s!, makes all counters kept in % \!\cl@@ckpt! global by letting \!\pcol@gcounters! have the list. % Switching these two functionality is done by \!\globalcounter! examining % if it is followed by a |*| by \!\@ifstar!. %  % \begin{macrocode} %% Counter Operations \def\globalcounter{\@ifstar\pcol@globalcounter@s\pcol@globalcounter} \def\pcol@globalcounter@s{\global\let\pcol@gcounters\cl@@ckpt} \def\pcol@globalcounter#1{{% \@tempswafalse \def\reserved@a{#1}% \def\@elt##1{\def\reserved@b{##1}% \ifx\reserved@a\reserved@b \@tempswatrue \fi}% \pcol@gcounters \if@tempswa\else \@cons\pcol@gcounters{{#1}}\fi}} \gdef\pcol@gcounters{\@elt{page}} % \end{macrocode} % \end{macro}\end{macro}\end{macro}\end{macro} %  % \begin{macro}{\localcounter} % \changes{v1.2-6}{2013/05/11} % {Introduced to remove the argument counter from % $\string\mathit{\Theta}^g$.} %  % The API macro \!\localcounter!\marg{ctr}, also used in % \!\pcol@fnlayout@c! to localize the counter \counter{footnote}, % declares that $\arg{ctr}$ is a \lcounter, and thus removes it from $\CG$ % by \!\pcol@removecounter! if $\arg{ctr}\neq\counter{page}$. %  % \begin{macrocode} \def\localcounter#1{% \expandafter\ifx\csname c@#1\endcsname\c@page\else \pcol@removecounter\pcol@gcounters{#1}% \fi} % \end{macrocode} % \end{macro} %  % \KeepSpace{1} % \begin{macro}{\pcol@remctrelt} % \changes{v1.2-6}{2013/05/11} % {Recode to use newly introduced \cs{pcol@removecounter}.} % \begin{macro}{\pcol@removecounter} % \changes{v1.2-6}{2013/05/11} % {Introduced for the counter removal operation in % \cs{localcounter} and \cs{pcol@remctrelt}.} % \begin{macro}{\pcol@iremctrelt} % \changes{v1.2-6}{2013/05/11} % {Add the first argument $\string\mathit{\Theta}'$ as the counter % list from which the second argument $\theta$ is removed.} %  % The macro $\!\pcol@remctrelt!\Arg\cg$ is invoked solely from % \!\pcol@zparacol! and is applied to each \gcounter{} $\cg\in\CG$ to % remove it from $\CC=\!\pcol@counters!$ in which we have $\CTL$ finally. % The macro also moves $|\cl@|{\cdot}\cg=\clist(\cg)$ %  % \SpecialArrayIndex{\theta}{\cl@} %  % to $|\pcol@cl@|{\cdot}\cg$ %  % \SpecialArrayMainIndex{\theta}{\pcol@cl@} %  % to keep the list of the descendant \lcounter{}s of $\cg$ in it, and then % re\!\def!ines $|\cl@|{\cdot}\cg=\!\pcol@stepcounter!\Arg\cg$ %  % \SpecialArrayMainIndex{\theta}{\cl@} %  % so that it is invoked on $\!\stepcounter!\Arg\cg$ to let $\val_c(\cl)=0$ % for all $c\In0\C$ and $\cl\in\clist(\cg)$, if $\cg\neq\counter{page}$. % These operations are performed by a lengthy sequence with many occurrences % of \!\expandafter!, \!\csname! and \!\endcsname! but the sequence is % equivalent to the following. %  % \begin{quote} % $\!\let!|\pcol@cl@|{\cdot}\cg|=\cl@|{\cdot}\cg$\\ % $\CSIndex{ifx}|\c@|{\cdot}\cg\!\c@page!|\else | % |\def\cl@|{\cdot}\cg|{|\!\pcol@stepcounter!|{|\cg|}}\fi|$ % \end{quote} %  % As for the removal of $\cg$ from $\CC$, we invoke % $\!\pcol@removecounter!\<\mathit{\Theta}'\>\Arg{\theta}$ giving it % $\mathit{\Theta}'=\CC$ and $\theta=\cg$. This macro, also invoked from % $\!\localcounter!\Arg\cl$ with $\mathit{\Theta}'=\CG$ and $\theta=\cl$, % does $\mathit{\Theta}''\gets\mathit{\Theta}'$, % $\mathit{\Theta}'=\emptyset$, and then apply % $\!\pcol@iremctrelt!\arg{\mathit{\Theta}'}$ to each % $\theta'\in\mathit{\Theta}''$ to let % $\mathit{\Theta}'\gets\mathit{\Theta}'\cup\{\theta'\}$ by \!\@cons! if % $\theta'\neq\theta$. %  % \begin{macrocode} \def\pcol@remctrelt#1{% \expandafter\let\expandafter\reserved@a\csname cl@#1\endcsname \expandafter\let\csname pcol@cl@#1\endcsname\reserved@a \expandafter\ifx\csname c@#1\endcsname\c@page\else \@namedef{cl@#1}{\pcol@stepcounter{#1}}% \fi \pcol@removecounter\pcol@counters{#1}} \def\pcol@removecounter#1#2{% \def\reserved@a{#2}\let\reserved@b#1\relax \global\let#1\@empty {\def\@elt{\pcol@iremctrelt#1}\reserved@b}} \def\pcol@iremctrelt#1#2{% \def\reserved@b{#2}% \ifx\reserved@a\reserved@b\else \@cons#1{{#2}}\fi} % \end{macrocode} % \end{macro}\end{macro}\end{macro} % % \begin{macro}{\definethecounter} % The API macro $\!\definethecounter!\<\cl\>\\arg{rep}$ define the % \lrep{} $\arg{rep}$ for a \lcounter{} $\cl$ in a column $c$. It % \!\def!ines $|\pcol@thectr@|{\cdot}\cl{\cdot}c$ %  % \SpecialArrayMainIndex{\theta{\cdot}c}{\pcol@thectr@} %  % to have $\arg{rep}$ in its body. %  % \begin{macrocode} \def\definethecounter#1#2#3{\@namedef{pcol@thectr@#1#2}{#3}} % \end{macrocode} % \end{macro} %  % \begin{macro}{\pcol@thectrelt} % The macro $\!\pcol@thectrelt!\<\cl\>$ is invoked solely in \!\pcol@zparacol! % and is applied to each $\cl\in\CTL$ to define its \lrep{} of % default and that of the leftmost column 0. To give unique representations % |\theH|${\cdot}\cl$ used by \textsf{hyperref}, it prepends the current column % number as \Midx{\!\pcol@thecurrcol!} to them. The macro performs a lengthy % sequence with many occurrences of \!\expandafter!, \!\csname! and % \!\endcsname! but the sequence is equivalent to the following. %  % \begin{quote} % $\!\let!|\pcol@thectr@|{\cdot}\cl|=\the|{\cdot}\cl$\\ % $\CSIndex{ifx}|\pcol@thectr@|{\cdot}\cl{\cdot}0\!\relax!|\else | % \!\let!|\the|{\cdot}\cl|=\pcol@thectr@|{\cdot}\cl{\cdot}0| \fi|$ % $\!\let!|\theH|{\cdot}\cl|=\pcol@thecurrcol\the|{\cdot}\cl$\\ % \end{quote} %  % \SpecialArrayMainIndex{\theta}{\pcol@thectr@} % \SpecialArrayIndex{\theta{\cdot}c}{\pcol@thectr@} % \SpecialArrayMainIndex{\theta}{\the} % \SpecialArrayMainIndex{\theta}{\theH} %  % \begin{macrocode} \def\pcol@thectrelt#1{% \expandafter\let\expandafter\reserved@a\csname the#1\endcsname \expandafter\let\csname pcol@thectr@#1\endcsname\reserved@a \expandafter\let\expandafter\reserved@a\csname pcol@thectr@#10\endcsname \ifx\reserved@a\relax\else \expandafter\let\csname the#1\endcsname\reserved@a \fi \@ifundefined{theH#1}{}{% \expandafter\def\csname theH#1\expandafter\expandafter\expandafter\endcsname \expandafter\expandafter\expandafter{% \expandafter\expandafter\expandafter\pcol@thecurrcol\csname theH#1\endcsname }% }% } \def\pcol@thecurrcol{column\number\pcol@currcol.} % \end{macrocode} % \end{macro} % % \KeepSpace{1} % \begin{macro}{\pcol@loadctrelt} % \changes{v1.0}{2011/10/10} % {Introduced for inter-environment local counter conservation.} % \begin{macro}{\pcol@storecounters} % \changes{v1.0}{2011/10/10} % {Introduced for inter-environment local counter conservation.} % \begin{macro}{\pcol@storectrelt} % \changes{v1.0}{2011/10/10} % {Introduced for inter-environment local counter conservation.} %  % The macro $\!\pcol@loadctrelt!\<\cl\>\<\val_c(\cl)\>$ is invoked from % \!\pcol@zparacol! and \!\pcol@synccounter! and is applied to each element % $\<\cl,\val_c(\cl)\>\in\Cc_c$ for a column $c$ to define a macro % $|\pcol@ctr@|{\cdot}\cl=v(\cl)$ %  % \SpecialArrayMainIndex{\theta}{\pcol@ctr@} %  % having $\val_c(\cl)$ in its body for a temporary use. This macro or its % redefined version is then referred to by $\!\pcol@cmpctrelt!\<\cl\>$ or % $\!\pcol@storectrelt!\<\cl\>$. The latter is invoked from % \!\pcol@storecounters! via \!\pcol@sscounters! to add $\<\cl,v(\cl)\>$ to % \!\@gtempa! by \!\@cons! to rebuild $\CC_c$ for a column $c$ in % \!\@gtempa!. % % The macro \!\pcol@storecounters! is invoked solely from % $\!\pcol@synccounter!\<\theta\>$ to update a \lcounter{} $\theta$ with % $\Val(\theta)$ for \csync. That is, \!\pcol@storecounters! is used to add % $\<\cl,v(\cl)\>$ to \!\@gtempa! for all $\cl\in\CTL$ by \!\pcol@sscounters! % giving it \!\pcol@storectrelt! as its argument, where $v(\cl)$ is modified % if $\cl=\theta$ or unmodified otherwise after it is defined by % \!\pcol@loadctrelt!. %  % \begin{macrocode} \def\pcol@loadctrelt#1#2{\@namedef{pcol@ctr@#1}{#2}} \def\pcol@storecounters{\pcol@sscounters\pcol@storectrelt} \def\pcol@storectrelt#1{\@cons\@gtempa{{#1}{\@nameuse{pcol@ctr@#1}}}} % \end{macrocode} % \end{macro}\end{macro}\end{macro} %  % \begin{macro}{\pcol@savecounters} % \changes{v1.0}{2011/10/10} % {Move the body to \cs{pcol@sscounters}.} %  % \begin{macro}{\pcol@savectrelt} % The macro \!\pcol@savecounters! is invoked from % \!\pcol@com@syncallcounters!, \!\pcol@stepcounter! and \!\pcol@switchcol! % to let $\CC_c$ for a column $c$ have the list of $\<\cl,\val_c(\cl)\>$ % where $\val_c(\cl)$ is the value of $|\c@|{\cdot}\cl$ to be saved in % the list. %  % \SpecialArrayIndex{\theta}{\c@} %  % It does this operation invoking \!\pcol@sscounters! giving it % \!\pcol@savectrelt! as its argument. % % The macro $\!\pcol@savectrelt!\<\cl\>$ adds $\<\cl,\val_c(\cl)\>$ to % \!\@gtempa! by \!\@cons! to rebuild $\CC_c$ for a column $c$ in % \!\@gtempa!. %  % \begin{macrocode} \def\pcol@savecounters{\pcol@sscounters\pcol@savectrelt} \def\pcol@savectrelt#1{\@cons\@gtempa{{#1}{\number\csname c@#1\endcsname}}} % \end{macrocode} % \end{macro}\end{macro} %  % \begin{macro}{\pcol@sscounters} % \changes{v1.0}{2011/10/10} % {Introduced to implement the common operations of % \cs{pcol@storecounters} and \cs{pcol@savecounters}.} %  % The macro $\!\pcol@sscounters!\arg{elt}$ is invoked from % \!\pcol@storecounters! with $\arg{elt}=\!\pcol@storectrelt!$ or % \!\pcol@savecounters! with $\arg{elt}=\!\pcol@savectrelt!$ to build % $\CC_c=|\pcol@counters|{\cdot}c$ for a column $c$. %  % \SpecialArrayMainIndex{c}{\pcol@counters} %  % To do that, it lets $\!\@gtempa!=()$ and then apply $\arg{elt}$ to all % $\cl\in\CTL=\!\pcol@counters!$ to have updated $\CC_c$ in \!\@gtempa!. % Then finally, \!\@gtempa! is moved into $\CC_c$ by \!\xdef!\footnote{ %  % It can be done by \cs{global}\cs{let} more efficiently but it is lengthy % due to two \cs{expandafter}.}. %  % \begin{macrocode} \def\pcol@sscounters#1{\begingroup \global\let\@gtempa\@empty \let\@elt#1\relax \pcol@counters \let\@elt\relax \expandafter\xdef\csname pcol@counters\number\pcol@currcol\endcsname{% \@gtempa}% \endgroup} % \end{macrocode} % \end{macro} % % \begin{macro}{\pcol@cmpctrelt} % \changes{v1.0}{2011/10/10} % {Introduced for inter-environment local counter conservation.} %  % The macro $\!\pcol@cmpctrelt!\<\theta\>$ is invoked solely from % \!\pcol@zparacol! and is applied to each $\theta\in\CC$ to examine if % $\val_0(\theta)=\Val(\theta)$ where $\val_0(\theta)$ is in % $|\pcol@ctr@|{\cdot}\theta$. %  % \SpecialArrayIndex{\theta}{\pcol@ctr@} %  % If the examination fails including due to that $|\pcol@ctr@|{\cdot}\theta$ %  % \SpecialArrayIndex{\theta}{\pcol@ctr@} %  % is undefined, we add $\theta$ to the list \!\@gtempa! by \!\@cons!. %  % \begin{macrocode} \def\pcol@cmpctrelt#1{\@tempswafalse \@tempcnta\@nameuse{c@#1}% \expandafter\ifx\csname pcol@ctr@#1\endcsname\relax \@tempswatrue \else\ifnum\@nameuse{pcol@ctr@#1}=\@tempcnta\else \@tempswatrue \fi\fi \if@tempswa \@cons\@gtempa{{#1}}\fi} % \end{macrocode} % \end{macro} % % \begin{macro}{\synccounter} % \changes{v1.0}{2011/10/10} % {Introduced as an environment-local API command.} % \begin{macro}{\pcol@com@synccounter} % \changes{v1.0}{2011/10/10} % {Introduced for the implementation of the new API command % \cs{synccounter}.} %  % The macro $\!\pcol@com@synccounter!\<\theta\>$, being the implementation % of the \elocal{} API macro \!\synccounter!, lets % $\val_c(\theta)=\Val(\theta)$ for all $c\In0\C$. That is, the value of % the counter $\theta$ is {\em broadcasted} to all columns for the % {\em\Uidx\csync} of $\theta$. This broadcast is done by % \!\pcol@synccounter! with an argument $\!\@elt!|{|\theta|}|$ so that it % works only on $\theta$. %  % \begin{macrocode} \def\pcol@com@synccounter#1{\pcol@synccounter{\@elt{#1}}} % \end{macrocode} % \end{macro}\end{macro} %  % \begin{macro}{\pcol@synccounter} % \changes{v1.0}{2011/10/10} % {Introduced for \cs{synccounter} and inter-environment local counter % conservation.} % \begin{macro}{\pcol@syncctrelt} % \changes{v1.0}{2011/10/10} % {Introduced for \cs{synccounter} and inter-environment local counter % conservation.} %  % The macro $\!\pcol@synccounter!\arg{lst}$ is invoked from % \!\pcol@zparacol! with $\arg{lst}=\!\@gtempa!$ and from % $\!\pcol@com@synccounter!\arg{ctr}$ with $\arg{lst}=\!\@elt!\Arg{ctr}$, to % let $\val_c(\theta)=\Val(\theta)$ for all $c\In0\C$ and all $\theta$ in % $\arg{lst}$. To do that, at first we move $\arg{lst}$ into \!\reserved@a! % in order to make \!\@gtempa! free so that it can be used in % \!\pcol@storecounters!. Next, for each $c\In0\C$, we let % $v(\cl)=\val_c(\cl)$ by applying \!\pcol@loadctrelt! to all % $\<\cl,\val_c(\cl)\>\in\Cc_c$, then scan $\arg{lst}$ applying % $\!\pcol@syncctrelt!\<\theta\>$ for each $\theta$ in $\arg{lst}$ to let % $v(\theta)=\Val(\theta)$, and finally store all $v(\cl)$ back to $\Cc_c$ % by \!\pcol@storecounters!, where $v(\theta)$ is % $|\pcol@ctr@|{\cdot}\theta$. %  % \SpecialArrayIndex{\theta}{\pcol@ctr@} %  % \begin{macrocode} \def\pcol@synccounter#1{{% \let\@elt\relax \edef\reserved@a{#1}% \pcol@currcol\z@ \@whilenum\pcol@currcol<\pcol@ncol\do{% \let\@elt\pcol@loadctrelt \@nameuse{pcol@counters\number\pcol@currcol}% \let\@elt\pcol@syncctrelt \reserved@a \pcol@storecounters \advance\pcol@currcol\@ne}}} \def\pcol@syncctrelt#1{% \expandafter\edef\csname pcol@ctr@#1\endcsname{\number\@nameuse{c@#1}}} % \end{macrocode} % \end{macro}\end{macro} % % \begin{macro}{\syncallcounters} % \changes{v1.0}{2011/10/10} % {Introduced as an environment-local API command.} % \begin{macro}{\pcol@com@syncallcounters} % \changes{v1.0}{2011/10/10} % {Introduced for the implementation of the new API command % \cs{syncallcounters}.} %  % The macro \!\pcol@com@syncallcounters!, being the implementation of the % \elocal{} API macro \!\syncallcounters!, makes all \lcounter{}s in all % columns have the value in the current column. That is, for each % $c\In0\C$, we invoke \!\pcol@savecounters! to let $\val_c(\cl)={\Val}(\cl)$ % for all $\cl\in\CTL$. %  % \begin{macrocode} \def\pcol@com@syncallcounters{{% \pcol@currcol\z@ \@whilenum\pcol@currcol<\pcol@ncol\do{% \pcol@savecounters \advance\pcol@currcol\@ne}}} % \end{macrocode} % \end{macro}\end{macro} % % \begin{macro}{\pcol@setctrelt} % \changes{v1.0}{2011/10/10} % {Replace \cs{setcounter} with direct assignment with \cs{csname} and % \cs{endcsname}} %  % The macro $\!\pcol@setctrelt!\<\cl\>\<\val_c(\cl)\>$ is solely invoked % from \!\pcol@switchcol! to switch to a column $c$ and is applied to each % $\<\cl,\val_c(\cl)\>\in\Cc_c$ to let $\Val(\cl)=\val_c(\cl)$ \!\global!ly. % It also define the \lrep{} of $\cl$, being $|\the|{\cdot}\cl$, %  % \SpecialArrayIndex{\theta}{\the} %  % to be $|\pcol@thectr@|{\cdot}\cl{\cdot}c$ %  % \SpecialArrayIndex{\theta{\cdot}c}{\pcol@thectr@} %  % if it is defined, or otherwise to be $|\pcol@thectr@|{\cdot}\cl$ which keeps % the original $|\the|{\cdot}\cl$. %  % \SpecialArrayIndex{\theta}{\the} %  % This \lrep{} definition is done by a lengthy sequence with many occurrences % of \!\expandafter!, \!\csname! and \!\endcsname!, but it is equivalent to % the followings. %  % \begin{quote} % $\CSIndex{ifx}|\pcol@thectr@|{\cdot}\cl{\cdot}c\!\relax!| | % \!\let!|\the|{\cdot}\cl|=\pcol@thectr@|{\cdot}\cl$\\ % $|\else |\!\let!|\the|{\cdot}\cl|=\pcol@thectr@|{\cdot}\cl{\cdot}c$\\ % |\fi| % \end{quote} % %  % \begin{macrocode} \def\pcol@setctrelt#1#2{% \global\csname c@#1\endcsname#2\relax \expandafter\ifx\csname pcol@thectr@#1\number\pcol@currcol\endcsname\relax \expandafter\let\expandafter\reserved@a\csname pcol@thectr@#1\endcsname \else \expandafter\let\expandafter\reserved@a \csname pcol@thectr@#1\number\pcol@currcol\endcsname \fi \expandafter\let\csname the#1\endcsname\reserved@a} % \end{macrocode} % \end{macro} % % \KeepSpace{1} % \begin{macro}{\pcol@stepcounter} % \changes{v1.0}{2011/10/10} % {Change the order of operations.} % \changes{v1.0}{2011/10/10} % {Replace \cs{csname}/\cs{endcsname} with \cs{@nameuse}.} % \begin{macro}{\pcol@stpldelt} % \begin{macro}{\pcol@stpclelt} %  % The macro $\!\pcol@stepcounter!\<\cg\>$ is invoked from % $\!\stepcounter!\<\cg\>$ for a \gcounter{} $\cg$ because % $|\cl@|{\cdot}\cg$ %  % \SpecialArrayIndex{\theta}{\cl@} %  % is modified by \!\pcol@remctrelt! so as to invoke this macro to zero-clear % \lcounter{}s $\theta\in\clist(\cg)$. To do that, we do the followings in % a group for each $c\In0\C$. First we apply % $\!\pcol@stpldelt!\<\cl\>\<\val_c(\cl)\>$ to each % $\<\cl,\val_c(\cl)\>\in\Cc_c$ to let $\Val(\cl)=\val_c(\cl)$ locally. % Then we apply $\!\pcol@stpclelt!\<\theta\>$ to each $\theta\in\clist(\cg)$ % to let $\Val(\theta)=0$. Finally, we invoke \!\pcol@savecounters! to let % $\val_c(\cl)=\Val(\cl)$ for all $\cl\in\CTL$ to reflect the zero-clear of % $\theta\in\clist(\cg)$. % % After the operations above, we apply $\!\@stpelt!\<\theta\>$ to each % $\theta\in\clist(\cg)$ for \!\global! zero-clearing. %  % \begin{macrocode} \def\pcol@stepcounter#1{\begingroup \pcol@currcol\z@ \@whilenum\pcol@currcol<\pcol@ncol\do{% \let\@elt\pcol@stpldelt \@nameuse{pcol@counters\number\pcol@currcol}% \let\@elt\pcol@stpclelt \@nameuse{pcol@cl@#1}% \pcol@savecounters \advance\pcol@currcol\@ne}% \endgroup \let\@elt\@stpelt \@nameuse{pcol@cl@#1}} \def\pcol@stpldelt#1#2{\csname c@#1\endcsname#2\relax} \def\pcol@stpclelt#1{\csname c@#1\endcsname\z@} % \end{macrocode} % \end{macro}\end{macro}\end{macro} % % % % \section{Column-Switching Commands and Environments} % \label{sec:imp-switch} % % \begin{macro}{\pcol@par} % \changes{v1.0}{2011/10/10} % {Introduced for \cs{par}-if-necessary operation.} %  % Before giving the definition of \cswitch{} commands and environments, we % define a commonly used macro \!\pcol@par!, which do \CSIndex{par} if % necessary, i.e., we are not in vertical mode. The reason why we don't % simply do \CSIndex{par} is that it may have some definition different from % \!\@@par! and thus an incautious repetition of \CSIndex{par} may cause % undesirable results. This macro is used in \!\pcol@com@switchcolumn!, % \!\pcol@sptext!, \!\pcol@com@endcolumn!, \!\pcol@flushclear!, % and \!\endparacol!. %  % \begin{macrocode} %% Column-Switching Commands and Environments \def\pcol@par{\ifvmode\else \par \fi} % \end{macrocode} % \end{macro} % % \KeepSpace{2} % \begin{macro}{\switchcolumn} % \changes{v1.0}{2011/10/10} % {Made \cs{let}-equal to \cs{pcol@com@switchcolumn} for localization.} % \begin{macro}{\pcol@com@switchcolumn} % \changes{v1.0}{2011/10/10} % {Introduced as the implementation of \cs{switchcolumn}.} % \changes{v1.0}{2011/10/10} % {Add \cs{pcol@defcolumn} to clarify the behavior of \texttt{column}.} % \begin{macro}{\pcol@switchcolumn} % \changes{v1.0}{2011/10/10} % {Add the check of $d\geq0$.} % \changes{v1.31}{2013/10/10} % {Add a space before the number of columns in the error message.} %  % \begin{macro}{\pcol@iswitchcolumn} % The macro $\!\pcol@com@switchcolumn!|[|d|]|$, being the implementation of the % \elocal{} API macro \!\switchcolumn!, switches to the column $d$ if provided % through its optional argument, or to $d=(c+1)\bmod\C$ otherwise where $c$ % is the ordinal of the current column. After making it sure to be in % vertical mode by \!\pcol@par!, it invokes \!\pcol@defcolumn! to give % \!\pcol@com@column!(|*|) their % \!\def!initions for occurrences not as the very first \cswitch{} command % or environment of the current \env{paracol} environment. Then, after % calculating $d=(c+1)\bmod\C$, this macro simply invokes % $\!\pcol@switchcol!|[|d|]|$ with or without the calculated $d$ depending % on the existence of the optional argument delimiter `|[|'. % % The macro $\!\pcol@switchcolumn!|[|d|]|$ lets $\!\pcol@nextcol!=d$ and % confirms $0\leq d<\C$ or abort the execution by \!\PackageError! if it % does not hold. Then it invokes \!\pcol@iswitchcolumn! if % $\!\switchcolumn!|[|d|]|$ is followed by a `|*|', or \!\pcol@switchcol! % otherwise. % % The macro $\!\pcol@iswitchcolumn!|[|\arg{text}|]|$ invokes % $\!\pcol@sptext!|[|\arg{text}|]|$ if the optional argument is provided, or % \!\pcol@switchcol! otherwise, after letting $\CSIndex{ifpcol@sync}=\true$ % for \exsync{}. %  % \begin{macrocode} \def\pcol@com@switchcolumn{\pcol@par \pcol@defcolumn \@tempcnta\pcol@currcol \advance\@tempcnta\@ne \ifnum\@tempcnta<\pcol@ncol\else \@tempcnta\z@ \fi \@ifnextchar[%] \pcol@switchcolumn{\pcol@switchcolumn[\@tempcnta]}} \def\pcol@switchcolumn[#1]{% \pcol@nextcol#1\relax \@tempswafalse \ifnum#1<\z@ \@tempswatrue \fi \ifnum#1<\pcol@ncol\else \@tempswatrue \fi \if@tempswa \PackageError{paracol}{% Column number \number#1 must be less than \number\pcol@ncol}\@eha \pcol@nextcol\z@ \fi \@ifstar\pcol@iswitchcolumn\pcol@switchcol} \def\pcol@iswitchcolumn{% \global\pcol@synctrue \@ifnextchar[%] \pcol@sptext\pcol@switchcol} % \end{macrocode} % \end{macro}\end{macro}\end{macro}\end{macro} % % \begin{macro}{\pcol@sptext} % \changes{v1.0}{2011/10/10} % {Made \cs{long} to allow \cs{par} in its argument.} % \changes{v1.0}{2011/10/10} % {Replace \cs{par} with \cs{pcol@par}.} % \changes{v1.0}{2011/10/10} % {Add $\cs{ifpcol@mctext}\EQ\mathit{true}$ for restriction of the % broadcast of \cs{if@nobreak} and \cs{everypar}.} % \changes{v1.2-4}{2013/05/11} % {Add \cs{pcol@swapcolumn} for column-swapping.} % \changes{v1.2-5}{2013/05/11} % {Add setting of \cs{columnwidth}, \cs{linewidth} and \cs{parshape} % to have indented spanning text with surrounding % \string\texttt{list}-like environments.} % \changes{v1.3-1}{2013/09/17} % {Add $\cs{ifpcol@sptextstart}\EQ\string\mathit{true}$ before first % synchronized column-switching to let \cs{pcol@output@switch} save % pre-spanning-text stuff, move the timing of % $\cs{ifpcol@sptext}\EQ\string\mathit{true}$ from the end of % spanning text to the beginning so that \cs{output} routine for a % page break in the text capture the pre-break portion, and remove % the invocation of \cs{pcol@swapcolumn} because spanning texts are % now always put into the column-0.} % \changes{v1.3-6}{2013/09/17} % {Add globalization of \cs{@svsechd} and \cs{@svsec}.} %  % The macro $\!\pcol@sptext!|[|\arg{text}|]|$ is invoked from % \!\pcol@zparacol! and \!\pcol@iswitchcolumn! to put a \Uidx\mctext{} % $\arg{text}$ given as the optional argument of the former or that of % \!\switchcolumn!|*| and its relative environment openers for the latter. % The macro has \!\long! attribute because the \mctext{} may have % \CSIndex{par}. Since the text is put in the column-0 regardless of its % physical position, we let \!\pcol@nextcol! have 0 after saving the target % column $d=\!\pcol@nextcol!$ in \!\@tempcnta!. Then we switch to the % column by \!\pcol@switchcol!, after turning $\CSIndex{ifpcol@sync}=\true$ % to set a \sync{}ation point above the text and % $\CSIndex{ifpcol@sptextstart}=\true$ to tell \!\pcol@output@switch! to % prepare the capture of \mctext{} saving the \prespan{}. % % Next, we let $\CSIndex{ifpcol@sptextstart}=\false$ and % $\CSIndex{ifpcol@sptext}=\true$ to indicate the main vertical list % contains only the \mctext{} and it is to be captured by \!\output! % routine. Then the $\arg{text}$ is put in a group in which we let % $\!\columnwidth!=\!\hsize!=\!\textwidth!$ and % $\!\linewidth!=\!\textwidth!-\lrm$ with \!\parshape! to indent lines by % \!\@totalleftmargin! if $\lrm>0$, to let \mctext{} span across all columns % reflecting the indentation in the \env{list}-like environments surrounding % \env{paracol} if any. We also let $\!\col@number!=1$ to ensure again that % \!\maketitle! produces a title without \!\twocolumn! if it is in the % \mctext. % % Then, after invoking \!\pcol@par! to ensure to be in vertical % mode, we \!\global!ize \!\@svsechd! and \!\@svsec! which may be defined in % a lower-level sectioning command such as \!\paragraph! in the \mctext{} so % that they are properly expanded in \!\everypar! inserted at the beginning % of the first paragraph of the column to which we switch shortly, even when % the sectioning command is used inappropriately in the \mctext. % We also \!\global!ize \!\everypar! by a sequence with three % \!\expandafter! so that \!\pcol@output@switch! for the \sync{}ed % \cswitch{} we make shortly broadcasts it to other columns. Finally after % closing the group, we let $\!\pcol@nextcol!=d$ and % $\CSIndex{pcol@sync}=\true$ to set another \sync{}ation point below the % \mctext{} and to make the captured text combined with \prespan, and then % invoke \!\pcol@switchcol! to switch the column $d$. %  % \begin{macrocode} \long\def\pcol@sptext[#1]{% \@tempcnta\pcol@nextcol \global\pcol@synctrue \pcol@nextcol\z@ \global\pcol@sptextstarttrue \pcol@switchcol \global\pcol@sptextstartfalse \global\pcol@sptexttrue \begingroup \columnwidth\textwidth \hsize\columnwidth \linewidth\columnwidth \advance\linewidth-\pcol@lrmargin \ifdim\pcol@lrmargin>\z@ \parshape\@ne\@totalleftmargin\linewidth \fi \col@number\@ne #1\pcol@par \global\let\@svsechd\@svsechd \global\let\@svsec\@svsec \expandafter\global\expandafter\everypar\expandafter{\the\everypar}% \endgroup \pcol@nextcol\@tempcnta \global\pcol@synctrue \pcol@switchcol} % \end{macrocode} % \end{macro} % % \begin{macro}{\pcol@switchcol} % \changes{v1.0}{2011/10/10} % {Add \cs{pcol@aconly} for disabling \cs{addcontentsline}.} % \changes{v1.2-2}{2013/05/11} % {Add column-scanning and page-overflow check for synchronized % column-switching.} % \changes{v1.2-4}{2013/05/11} % {Add \cs{pcol@swapcolumn} for column-swapping to turn % \cs{if@firstcolumn}.} % \changes{v1.3-4}{2013/09/17} % {Remove setting \cs{if@firstcolumn} and the invocation of % \cs{pcol@swapcolumn} for it because the position of marginal notes % are now controlled by \cs{pcol@addmarginpar}.} % \changes{v1.3-5}{2013/09/17} % {Add setting $V_E\EQ\cs{pcol@@ensurevspace}$ and reinitialization of % \cs{pcol@ensurevspace} for avoidance of post-synchronization % inconsistent page break.} % \changes{v1.35-5}{2018/12/31} % {Add the invocation of $\cs{pcol@colpream}\cdot c$.} % \changes{v1.36-1}{2024/10/21} % {Add check to not add zeroth preamble in \cs{endparacol}.} %  % The macro \!\pcol@switchcol! is invoked from \!\pcol@switchcolumn!, % \!\pcol@iswitchcolumn!, \!\pcol@sptext! and \!\endparacol! to switch the % column $d=\!\pcol@nextcol!$. First, we save \lcounter{}s in the current % column $c$ into $\Cc_c$ by \!\pcol@savecounters!. % % Next, if $\CSIndex{ifpcol@sync}=\true$, we do the followings. At first we % let $\VE={}$\!\pcol@@ensure~vspace! have the natural component of % \!\pcol@ensurevspace! which can have a glue specified by \!\ensurevspace!, % so that it is referred to by \!\pcol@sync! as the minimum space required % below the \sync{}ation point we are now setting. Second, we invoke % \!\pcol@visitallcols! temporarily turning $\CSIndex{ifpcol@sync}=\false$ % for \cscan{}ning to visit all columns but current one to give \TeX's page % builder the chance to break \colpage{}s in the \tpage{} with \Scfnote{}s % which could have not been presented in the last visit of the columns. % Third, we make an \!\output! request with $\!\penalty!=\!\pcol@op@switch!$ % to invoke \!\pcol@output@switch! by \!\pcol@invokeoutput! with % $\CSIndex{ifpcol@sync}=\true$ to make \sync{}ed switch to the column $d$. % This invocation may result in $\CSIndex{ifpcol@flush}=\true$ to mean the % \tpage{} should be broken before setting the \sync{}ation point. % Therefore if so, since \!\pcol@output@switch! switched to the tallest % column rather than $d$, we put \!\vfil! and \!\penalty!|-10000| to force % page break, make \cscan{} with \!\newpage! put into each column to have % some floats in the column in the new \tpage{}, and then invoke % \!\pcol@output@switch! again until it returns % $\CSIndex{ifpcol@flush}=\false$ telling us it successfully sets the % \sync{}ation point switching to the column $d$. Then as the last operation % specific to \sync{}ed \cswitch{}, we invoke \!\ensurevspace! with % \!\baselineskip! to give the default of $\VE$ for the next \sync{}ation. % % Otherwise, i.e., if $\CSIndex{ifpcol@sync}=\false$, we simply make the % \!\output! request for \!\pcol@output@switch! to switch to the column $d$. % % Then we scan $\Cc_d$ applying \!\pcol@setctrelt! to each % $\<\cl,\val_d(\cl)\>\in\Cc_d$ to let $\Val(\cl)={\val_d(\cl)}$. We also % scan $\T=\!\pcol@aconly!$ applying \!\pcol@aconlyelt! to each % $\\in T$ to inhibit \!\addcontentsline! to the contents file of % type $t_d$ as specified so by $\!\addcontentsonly!\arg{t_d}\~\arg{d}$. % After that, we let $\!\@elt!=\!\relax!$ to make it sure that any lists can % be manipulated without unexpected application of a macro to their % elements. % % Finally -- unless we process the implicit \!\pcol@switchol! from % \!\endparacol! -- we invoke $|\pcol@colpream|{\cdot}c$, where $c=-1$ if % $\CSIndex{ifpcol@sptextstart}=\true$ to mean the \cswitch{} is for a % \sptext{}, or $c=d$ otherwise. %  % \SpecialArrayIndex{c}{\pcol@colpream} %  % \begin{macrocode} \def\pcol@switchcol{% \pcol@savecounters \ifpcol@sync \@tempdima\pcol@ensurevspace\relax \edef\pcol@@ensurevspace{\number\@tempdima sp\relax}% \global\pcol@syncfalse \pcol@visitallcols\@@par \global\pcol@synctrue \pcol@invokeoutput\pcol@op@switch \@whilesw\ifpcol@flush\fi{% \vfil \penalty-\@M \global\pcol@syncfalse \pcol@visitallcols\newpage \global\pcol@synctrue \pcol@invokeoutput\pcol@op@switch}% \ensurevspace{\baselineskip}% \else \pcol@invokeoutput\pcol@op@switch \fi \let\@elt\pcol@setctrelt \csname pcol@counters\number\pcol@currcol\endcsname \let\@elt\pcol@aconlyelt \pcol@aconly \let\@elt\relax \@ifundefined{pcol@lastcol}{% \@nameuse{pcol@colpream\ifpcol@sptextstart-1\else\number\pcol@currcol\fi} }{}} % \end{macrocode} % \end{macro} % % \begin{macro}{\pcol@visitallcols} % \changes{v1.2-2}{2013/05/11} % {Introduced for column-scanning in synchronized column-switching and % page flushing.} %  % The macro $\!\pcol@visitallcols!\arg{cs}$, invoked from \!\pcol@switchcol! % and \!\pcol@flushclear!, performs \cscan{}ning putting $\arg{cs}$ into the % visited columns. That is, we repeat the invocation of % \!\pcol@output@switch! to visit $d$ through \!\pcol@invokeoutput! with % $\!\penalty!=\!\pcol@op@switch!$ for all $d\In0\C-\{c\}$. In each visit, % we put $\arg{cs}\in\{\!\@@par!,\!\newpage!\}$ to have a chance of or to % force page break in each visited \colpage{}. Finally we go back to $c$ to % restore its \cctext{} especially when we are leaving the column 0 for % \mctext. That is, $\cc_c(\sw)$ and $\cc_c(\ep)$ should be presented to % \!\pcol@output@switch! to broadcast them to other columns. %  % \begin{macrocode} \def\pcol@visitallcols#1{\begingroup \@tempcnta\z@ \@tempcntb\pcol@currcol \@whilenum\@tempcnta<\pcol@ncol\do{% \ifnum\@tempcnta=\@tempcntb\else \pcol@nextcol\@tempcnta \pcol@invokeoutput\pcol@op@switch #1% \fi \advance\@tempcnta\@ne}% \pcol@nextcol\@tempcntb \pcol@invokeoutput\pcol@op@switch \endgroup} % \end{macrocode} % \end{macro} % % \KeepSpace{3} % \begin{macro}{\column} % \changes{v1.0}{2011/10/10} % {Made \cs{let}-equal to \cs{pcol@com@column} for localization.} % \begin{macro}{\column*} % \changes{v1.0}{2011/10/10} % {Made \cs{let}-equal to \cs{pcol@com@column*} for localization.} % \begin{macro}{\pcol@com@column} % \changes{v1.0}{2011/10/10} % {Introduced as the implementation of \cs{column}.} % \begin{macro}{\pcol@com@column*} % \changes{v1.0}{2011/10/10} % {Introduced as the implementation of \cs{column*}.} % \begin{macro}{\pcol@defcolumn} % \changes{v1.0}{2011/10/10} % {Replace \cs{column} with \cs{pcol@com@column} and \cs{switchcolumn} % with \cs{pcol@switchenv}.} %  % The macros \!\pcol@com@column!(|*|), the implementations of the \elocal{} % API commands \!\column!(*), starts the environment |column(*)|. %  % \Midx{\EnvIndex{column}}\Midx{\EnvIndex{column*}} %  % Basically, the macros do \!\switch~column!\~(|*|), but if the environment % starts just after \beginparacol{} the macro have to switch to the column % 0. Therefore, the definitions for this very-beginning appearance are % given in \!\pcol@zparacol! to do (almost) nothing, and then those for % other ones are given by \!\pcol@defcolumn! invoked in % \!\pcol@com@switchcolumn! to invoke % \!\pcol@switchenv!|{column|(|*|)|}|(|*|) which then invokes % \!\switchcolumn!. Note that the definition of non-starred % \!\pcol@com@column! has \!\relax! after the invocation of % \!\pcol@switchenv! so that \!\@ifnextchar! and \!\@ifstar! to examine the % existence of `|[|' and `|*|' definitely tells us no even if the body of the % environment starts with a `|[|' or `|*|'. %  % \begin{macrocode} \def\pcol@defcolumn{% \gdef\pcol@com@column{\pcol@switchenv{column}\relax}% \global\@namedef{pcol@com@column*}{\pcol@switchenv{column*}*}} % \end{macrocode} % \end{macro}\end{macro}\end{macro}\end{macro}\end{macro} % % \KeepSpace{10} % \begin{macro}{\nthcolumn} % \changes{v1.0}{2011/10/10} % {Made \cs{let}-equal to \cs{pcol@com@nthcolumn} for localization.} % \begin{macro}{\nthcolumn*} % \changes{v1.0}{2011/10/10} % {Made \cs{let}-equal to \cs{pcol@com@nthcolumn*} for localization.} % \begin{macro}{\pcol@com@nthcolumn} % \changes{v1.0}{2011/10/10} % {Introduced as the implementation of \cs{nthcolumn} with the % inhibition of column-switching in the environment.} % \begin{macro}{\pcol@com@nthcolumn*} % \changes{v1.0}{2011/10/10} % {Introduced as the implementation of \cs{nthcolumn*} with the % inhibition of column-switching in the environment.} % \begin{macro}{\leftcolumn} % \changes{v1.0}{2011/10/10} % {Made \cs{let}-equal to \cs{pcol@com@leftcolumn} for localization.} % \begin{macro}{\leftcolumn*} % \changes{v1.0}{2011/10/10} % {Made \cs{let}-equal to \cs{pcol@com@leftcolumn*} for localization.} % \begin{macro}{\pcol@com@leftcolumn} % \changes{v1.0}{2011/10/10} % {Introduced as the implementation of \cs{leftcolumn} with the % inhibition of column-switching in the environment.} % \begin{macro}{\pcol@com@leftcolumn*} % \changes{v1.0}{2011/10/10} % {Introduced as the implementation of \cs{leftcolumn*} with the % inhibition of column-switching in the environment.} % \begin{macro}{\rightcolumn} % \changes{v1.0}{2011/10/10} % {Made \cs{let}-equal to \cs{pcol@com@rightcolumn} for localization.} % \begin{macro}{\rightcolumn*} % \changes{v1.0}{2011/10/10} % {Made \cs{let}-equal to \cs{pcol@com@rightcolumn*} for localization.} % \begin{macro}{\pcol@com@rightcolumn} % \changes{v1.0}{2011/10/10} % {Introduced as the implementation of \cs{rightcolumn} with the % inhibition of column-switching in the environment.} % \begin{macro}{\pcol@com@rightcolumn*} % \changes{v1.0}{2011/10/10} % {Introduced as the implementation of \cs{rightcolumn*} with the % inhibition of column-switching in the environment.} %  % The macros $\!\pcol@com@nthcolumn!(|*|)\arg{d}$, % \!\pcol@com@leftcolumn!(|*|) and |\pcol@com@right|\~|column|(|*|) are the % implementations of \elocal{} API macros \!\nthcolumn!(|*|)$\arg{d}$, % \!\leftcolumn!(|*|) and \!\rightcolumn!(|*|) respectively. They start % corresponding environments |nthcolumn|(|*|), |leftcolumn|(|*|), and % |rightcolumn|(|*|) %  % \Midx{\EnvIndex{nthcolumn}}\Midx{\EnvIndex{nthcolumn*}} % \Midx{\EnvIndex{leftcolumn}}\Midx{\EnvIndex{leftcolumn*}} % \Midx{\EnvIndex{rightcolumn}}\Midx{\EnvIndex{rightcolumn*}} %  % simply invoking \!\pcol@switchenv!$\Arg{env}$\~(|*|), where $\arg{env}$ is % the name of each environment, giving it $d$, 0 and 1 respectively as its % optional argument for the target column. %  % \begin{macrocode} \def\pcol@com@nthcolumn#1{\pcol@switchenv{nthcolumn}[#1]\relax} \@namedef{pcol@com@nthcolumn*}#1{\pcol@switchenv{nthcolumn*}[#1]*} \def\pcol@com@leftcolumn{\pcol@switchenv{leftcolumn}[0]\relax} \@namedef{pcol@com@leftcolumn*}{\pcol@switchenv{leftcolumn*}[0]*} \def\pcol@com@rightcolumn{\pcol@switchenv{rightcolumn}[1]\relax} \@namedef{pcol@com@rightcolumn*}{\pcol@switchenv{rightcolumn*}[1]*} % \end{macrocode} % \end{macro}\end{macro}\end{macro}\end{macro} % \end{macro}\end{macro}\end{macro}\end{macro} % \end{macro}\end{macro}\end{macro}\end{macro} % % \begin{macro}{\pcol@switchenv} % \changes{v1.0}{2011/10/10} % {Introduced to inhibit column-switching in the environment.} % \changes{v1.31}{2013/10/10} % {Fix the misspell ``switching'' in the error message.} %  % The macro $\!\pcol@switchenv!\arg{env}$ is invoked from % $|\pcol@com@|{\cdot}\arg{env}$ where $\arg{env}\in % \{\env{column}\~(|*|),\env{nthcolumn}(|*|),\env{leftcolumn}(|*|), % \env{rightcolumn}(|*|)\}$ to invoke \!\switchcolumn! with the arguments % following $\arg{env}$ given by the invoker macros. Before invoking % \!\switchcolumn!, we save it in \!\reserved@a! for the invocation and % re\!\def!ine it so that it will complain the illegal usage of \cswitch{} % commands\slash environments in the environment $\arg{env}$ by % \!\PackageError!. %  % \begin{macrocode} \def\pcol@switchenv#1{\let\reserved@a\switchcolumn \def\switchcolumn{\PackageError{paracol}{% Column switching commands and environments cannot be used in #1}\@eha} \reserved@a} % \end{macrocode} % \end{macro} % % \KeepSpace{14} % \begin{macro}{\endcolumn} % \changes{v1.0}{2011/10/10} % {Made \cs{let}-equal to \cs{pcol@com@endcolumn} for localization.} % \begin{macro}{\endcolumn*} % \changes{v1.0}{2011/10/10} % {Made \cs{let}-equal to \cs{pcol@com@endcolumn*} for localization.} % \begin{macro}{\pcol@com@endcolumn} % \changes{v1.0}{2011/10/10} % {Introduced as the implementation of \cs{endcolumn} with the % globalization of \cs{everypar}.} % \begin{macro}{\pcol@com@endcolumn*} % \changes{v1.0}{2011/10/10} % {Introduced as the implementation of \cs{endcolumn*} with the % globalization of \cs{everypar}.} % \begin{macro}{\endnthcolumn} % \changes{v1.0}{2011/10/10} % {Made \cs{let}-equal to \cs{pcol@com@endnthcolumn} for localization.} % \begin{macro}{\endnthcolumn*} % \changes{v1.0}{2011/10/10} % {Made \cs{let}-equal to \cs{pcol@com@endnthcolumn*} for % localization.} % \begin{macro}{\pcol@com@endnthcolumn} % \changes{v1.0}{2011/10/10} % {Introduced as the implementation of \cs{endnthcolumn} with the % globalization of \cs{everypar}.} % \begin{macro}{\pcol@com@endnthcolumn*} % \changes{v1.0}{2011/10/10} % {Introduced as the implementation of \cs{endnthcolumn*} with the % globalization of \cs{everypar}.} % \begin{macro}{\endleftcolumn} % \changes{v1.0}{2011/10/10} % {Made \cs{let}-equal to \cs{pcol@com@endleftcolumn} for % localization.} % \begin{macro}{\endleftcolumn*} % \changes{v1.0}{2011/10/10} % {Made \cs{let}-equal to \cs{pcol@com@endleftcolumn*} for % localization.} % \begin{macro}{\pcol@com@endleftcolumn} % \changes{v1.0}{2011/10/10} % {Introduced as the implementation of \cs{endleftcolumn} with the % globalization of \cs{everypar}.} % \begin{macro}{\pcol@com@endleftcolumn*} % \changes{v1.0}{2011/10/10} % {Introduced as the implementation of \cs{endleftcolumn*} with the % globalization of \cs{everypar}.} % \begin{macro}{\endrightcolumn} % \changes{v1.0}{2011/10/10} % {Made \cs{let}-equal to \cs{pcol@com@endrightcolumn} for % localization.} % \begin{macro}{\endrightcolumn*} % \changes{v1.0}{2011/10/10} % {Made \cs{let}-equal to \cs{pcol@com@endrightcolumn*} for % localization.} % \begin{macro}{\pcol@com@endrightcolumn} % \changes{v1.0}{2011/10/10} % {Introduced as the implementation of \cs{endrightcolumn} with the % globalization of \cs{everypar}.} % \begin{macro}{\pcol@com@endrightcolumn*} % \changes{v1.0}{2011/10/10} % {Introduced as the implementation of \cs{endrightcolumn*} with the % globalization of \cs{everypar}.} %  % The macro \!\pcol@com@endcolumn! is the implementation of the \elocal{} % API macro \!\endcolumn! to close \env{column} environment. The macro % makes it sure we are in vertical mode by \!\pcol@par! and \!\global!ize % \!\everypar! so that it is saved in $\cc_c(\ep)$ of the current column % $c$ on the switch to another column. The macro also gives the common % definition of \!\pcol@com@endcolumn*! for \!\endcolumn*!, % \!\pcol@com@endnthcolumn!(|*|) for \!\endnthcolumn!(|*|), % \!\pcol@com@endleftcolumn!(|*|) for \!\endleftcolumn!(|*|), and % \!\pcol@com@endrightcolumn!(|*|) for \!\endrightcolumn!(|*|). %  % \begin{macrocode} \def\pcol@com@endcolumn{\pcol@par \expandafter\global\expandafter\everypar\expandafter{\the\everypar}} \expandafter\let\csname pcol@com@endcolumn*\endcsname\pcol@com@endcolumn \let\pcol@com@endnthcolumn\pcol@com@endcolumn \expandafter\let\csname pcol@com@endnthcolumn*\endcsname\pcol@com@endcolumn \let\pcol@com@endleftcolumn\pcol@com@endcolumn \expandafter\let\csname pcol@com@endleftcolumn*\endcsname\pcol@com@endcolumn \let\pcol@com@endrightcolumn\pcol@com@endcolumn \expandafter\let\csname pcol@com@endrightcolumn*\endcsname\pcol@com@endcolumn % \end{macrocode} % \end{macro}\end{macro}\end{macro}\end{macro} % \end{macro}\end{macro}\end{macro}\end{macro} % \end{macro}\end{macro}\end{macro}\end{macro} % \end{macro}\end{macro}\end{macro}\end{macro} % % \begin{macro}{\definecolumnpreamble} % \changes{v1.35-5}{2018/12/31} % {Introduced to define a column preamble.} %  % The API macro \!\definecolumnpreamble!\marg{c}\marg{pream} is to define % the \colpream{} $\arg{pream}$ for the column $c$ or that for \sptext{}s if % $c=-1$. After assigning $c$ to \!\@tempcnta! to ensure $c$ is a number, % the macro $|\pcol@colpream|{\cdot}c$ is |\def|ined to have $\arg{pream}$. %  % \SpecialArrayMainIndex{c}{\pcol@colpream} %  % \begin{macrocode} \def\definecolumnpreamble#1#2{\@tempcnta#1\relax \expandafter\gdef\csname pcol@colpream\number\@tempcnta\endcsname{#2}} % \end{macrocode} % \end{macro} % % % \begin{macro}{\ensurevspace} % \changes{v1.3-5}{2013/09/17} % {Introduced to declare the minimum space $V_E$ below a % synchronization point to let it stay in a page.} % \begin{macro}{\pcol@ensurevspace} % \changes{v1.3-5}{2013/09/17} % {Introduced to keep $V_E$ declared by \cs{ensurevspace}.} % \begin{macro}{\pcol@@ensurevspace} % \changes{v1.3-5}{2013/09/17} % {Introduced to pass $V_E$ declared by \cs{ensurevspace} to % \cs{output} routine.} %  % The API macro $\!\ensurevspace!\ARg{space}$ is to declare that the % \sync{}ation point following it must be thrown to the next page unless the % page has the vertical $\arg{space}$ below the \sync{}ation point. The % macro makes a dummy assignment of $\arg{space}$ to \!\@tempdima! to ensure % the argument is a dimension including forced one, or in other words to % raise an error if not in this macro rather than at the time $\arg{space}$ % is {\em evaluated} in \!\pcol@switchcol!. Then $\arg{space}$ is kept in % \!\pcol@ensurevspace! so that $\arg{space}$ is evaluated in % \!\pcol@switchcol! for the \sync{}ation in question to pass the value to % \!\pcol@sync! through the macro $\!\pcol@@ensurevspace!=\Uidx\VE$, % especially when it has register references, for example to % \!\baselineskip!. To give the default of \!\pcol@ensurevspace!, we invoke % \!\ensurevspace! at the top level with \!\baselineskip!. %  % \begin{macrocode} \def\ensurevspace#1{{\@tempdima#1\relax \gdef\pcol@ensurevspace{#1}}} \ensurevspace{\baselineskip} % \end{macrocode} % \end{macro}\end{macro}\end{macro} % % % % \section{Disabling \cs{addcontentsline}} % \label{sec:imp-aconly} % % \begin{macro}{\addcontentsonly} % \changes{v1.0}{2011/10/10} % {Introduced for disabling \cs{addcontentsline}.} % \begin{macro}{\pcol@aconly} % \changes{v1.0}{2011/10/10} % {Introduced for disabling \cs{addcontentsline}.} %  % The API macro $\!\addcontentsonly!\arg{t}\arg{c}$ makes the type $t$ % contents file written by commands appearing only in the column $c$. The % macro simply add the pair $\$ to the list $\Uidx\T=\!\pcol@aconly!$ % being empty at initial, after confirming we know the type $t$, one of % |toc|, |lof| and |lot| so far, by the fact $|\pcol@ac@def|{\cdot}t$ is % defined, or abort execution by \!\PackageError!. %  % \begin{macrocode} %% Disabling \addcontentsline \def\addcontentsonly#1#2{% \@ifundefined{pcol@ac@def@#1} {\PackageError{paracol}{Unknown contents type #1}\@eha}\relax \@cons\pcol@aconly{{#1}{#2}}} \gdef\pcol@aconly{} % \end{macrocode} % \end{macro}\end{macro} % % \begin{macro}{\pcol@aconlyelt} % \changes{v1.0}{2011/10/10} % {Introduced for disabling \cs{addcontentsline}.} %  % The macro $\!\pcol@aconlyelt!\arg{t_d}\arg{d}$ is invoked solely in % \!\pcol@switchcol! for the \cswitch{} to column $c$, and is applied to % each $\\in\T$ to enable \!\addcontentsline! for $t_d$ if $d=c$ by % the invocation of $|\pcol@ac@def@|{\cdot}t_d$ %  % \SpecialArrayMainIndex{t}{\pcol@ac@def@} %  % with an argument |enable|, or to disable if $d\neq c$ with |disable|. %  % \begin{macrocode} \def\pcol@aconlyelt#1#2{% \ifnum#2=\pcol@currcol \@nameuse{pcol@ac@def@#1}{enable}% \else \@nameuse{pcol@ac@def@#1}{disable}% \fi} % \end{macrocode} % \end{macro} %  % \begin{macro}{\pcol@gobblethree} % \changes{v1.0}{2011/10/10} % {Introduced for disabling \cs{addcontentsline}.} % \begin{macro}{\pcol@addcontentsline} % \changes{v1.0}{2011/10/10} % {Introduced for disabling \cs{addcontentsline}.} %  % \hfuzz0.39pt % The macro $\!\pcol@gobblethree!\arg{file}\arg{sec}\arg{entry}$ is used in % \!\pcol@ac@disable@toc! and \!\pcol@ac@caption! to make % \!\addcontentsline! \!\let!-equal to this macro, which does nothing but % discarding three arguments, for disabling. The macro % \!\pcol@addcontentsline! is the \LaTeX's original \!\addcontentsline! and % is used in the macros mentioned above to let \!\addcontentsline! act as % original. %  % \begin{macrocode} \def\pcol@gobblethree#1#2#3{} \let\pcol@addcontentsline\addcontentsline % \end{macrocode} % \end{macro}\end{macro} % % \KeepSpace{1} % \begin{macro}{\pcol@ac@def@toc} % \changes{v1.0}{2011/10/10} % {Introduced for disabling \cs{addcontentsline}.} % \begin{macro}{\pcol@ac@enable@toc} % \changes{v1.0}{2011/10/10} % {Introduced for disabling \cs{addcontentsline}.} % \begin{macro}{\pcol@ac@disable@toc} % \changes{v1.0}{2011/10/10} % {Introduced for disabling \cs{addcontentsline}.} %  % The macro $\!\pcol@ac@def@toc!\arg{eord}$ is invoked solely in % $\!\pcol@aconlyelt!|{toc}|\arg{c}$ to enable or disable % \!\addcontentsline! according to $\arg{eord}$ by making \!\@sect! % \!\let!-equal to \!\pcol@ac@enable@toc! which is the \LaTeX's original % \!\@sect!, or to \!\pcol@ac@disable@toc! respectively. The macro % $\!\pcol@ac@disable@toc! % \\\\\\|[|\|]|\$ at first % disables \!\addcontentsline! by making it \!\let!-equal to % \!\pcol@gobblethree!, then invokes the original \!\@sect! saved in % \!\pcol@ac@enable@toc! giving it all arguments $a_1$ to $a_8$, and % finally enables it by making it \!\let!-equal to \!\pcol@addcontentsline!. % Note that the argument $a_7$ is surrounded by |{| and |}| on the % invocation of \!\@sect! to conceal `|]|' in $a_7$. %  % \begin{macrocode} \def\pcol@ac@def@toc#1{% \expandafter\let\expandafter\@sect\csname pcol@ac@#1@toc\endcsname} \let\pcol@ac@enable@toc\@sect \def\pcol@ac@disable@toc#1#2#3#4#5#6[#7]#8{% \let\addcontentsline\pcol@gobblethree \pcol@ac@enable@toc{#1}{#2}{#3}{#4}{#5}{#6}[{#7}]{#8}% \let\addcontentsline\pcol@addcontentsline} % \end{macrocode} % \end{macro}\end{macro}\end{macro} % % \KeepSpace{5} % \begin{macro}{\pcol@ac@def@lof} % \changes{v1.0}{2011/10/10} % {Introduced for disabling \cs{addcontentsline}.} % \begin{macro}{\pcol@ac@def@lot} % \changes{v1.0}{2011/10/10} % {Introduced for disabling \cs{addcontentsline}.} % \begin{macro}{\pcol@ac@caption@enable} % \changes{v1.0}{2011/10/10} % {Introduced for disabling \cs{addcontentsline}.} % \begin{macro}{\pcol@ac@caption@disable} % \changes{v1.0}{2011/10/10} % {Introduced for disabling \cs{addcontentsline}.} % \begin{macro}{\pcol@ac@caption@def} % \changes{v1.0}{2011/10/10} % {Introduced for disabling \cs{addcontentsline}.} % \begin{macro}{\pcol@ac@caption@if@lof} % \changes{v1.0}{2011/10/10} % {Introduced for disabling \cs{addcontentsline}.} % \begin{macro}{\pcol@ac@caption@if@lot} % \changes{v1.0}{2011/10/10} % {Introduced for disabling \cs{addcontentsline}.} %  % The macro $\!\pcol@ac@def@lof!\arg{eord}$ and % $\!\pcol@ac@def@lot!\arg{eord}$ are invoked solely in % $\!\pcol@aconlyelt!\\$ when $t$ is |lof| or |lot| % respectively. They invoke \!\pcol@ac@caption@enable!$\$ or % $\!\pcol@ac@caption@disable!\$ according to $\arg{eord}$, and then % these macros invoke $\!\pcol@ac@caption@def!\\$ where % $s=\!\@tempswatrue!$ or $s=\!\@tempswafalse!$ respectively to let % $\!\@caption!=\!\pcol@ac@caption!$ and $|\pcol@ac@caption@if@|{\cdot}t=s$ % which are \!\let!-equal to \!\@tempswatrue! in default. That is, % $|\pcol@ac@catption@if@|{\cdot}t$ lets $\CSIndex{if@tempswa}={}\true$ iff % \!\addcontentsline! for $t$ is to be enable. %  % \begin{macrocode} \def\pcol@ac@def@lof#1{\@nameuse{pcol@ac@caption@#1}{lof}} \def\pcol@ac@def@lot#1{\@nameuse{pcol@ac@caption@#1}{lot}} \def\pcol@ac@caption@enable{\pcol@ac@caption@def\@tempswatrue} \def\pcol@ac@caption@disable{\pcol@ac@caption@def\@tempswafalse} \def\pcol@ac@caption@def#1#2{\let\@caption\pcol@ac@caption \expandafter\let\csname pcol@ac@caption@if@#2\endcsname#1} \let\pcol@ac@caption@if@lof\@tempswatrue \let\pcol@ac@caption@if@lot\@tempswatrue % \end{macrocode} % \end{macro}\end{macro}\end{macro}\end{macro} % \end{macro}\end{macro}\end{macro} %  % \begin{macro}{\pcol@ac@caption} % \changes{v1.0}{2011/10/10} % {Introduced for disabling \cs{addcontentsline}.} % \begin{macro}{\pcol@ac@caption@latex} % \changes{v1.0}{2011/10/10} % {Introduced for disabling \cs{addcontentsline}.} %  % The macro $\!\pcol@ac@caption!\arg{type}|[|\arg{lcap}|]|\$ is made % \!\let!-equal to \!\@caption! by \!\pcol@ac@caption@def! to do what % \!\@caption! do but with enabling\slash disabling \!\addcontentsline!. At % first, it invokes $|\pcol@ac@cation@if@|{\cdot}t$ where % $t=|\ext@|{\cdot}\arg{type}$ %  % \SpecialIndex{\ext@figure}\SpecialIndex{\ext@table} %  % to let \CSIndex{if@tempswa} be $\true$ or $\false$ according to the % enable\slash disable status of $t$. Then, after letting % $\!\addcontentsline!=\!\pcol@gobblethree!$ for disabling if $\false$, we % invoke \!\pcol@ac@caption@latex!, being the \LaTeX's original \!\@caption!, % giving all three arguments of \!\pcol@ac@caption! itself surrounding % $\arg{lcap}$ with |{| and |}| for the concealment of `|]|'. Finally, we % let $\!\addcontentsline!=\!\pcol@addcontentsline!$ so that other macros % uses it with its original definition. %  % \begin{macrocode} \long\def\pcol@ac@caption#1[#2]#3{% \@nameuse{pcol@ac@caption@if@\@nameuse{ext@#1}}% \if@tempswa\else \let\addcontentsline\pcol@gobblethree \fi \pcol@ac@caption@latex{#1}[{#2}]{#3}% \let\addcontentsline\pcol@addcontentsline} \let\pcol@ac@caption@latex\@caption % \end{macrocode} % \end{macro}\end{macro} % % % % \KeepSpace{7} % \section{Page Flushing Commands} % \label{sec:imp-flush} % % \begin{macro}{\flushpage} % \changes{v1.0}{2011/10/10} % {Made \cs{let}-equal to \cs{pcol@com@flushpage} for % localization.} % \begin{macro}{\pcol@com@flushpage} % \changes{v1.0}{2011/10/10} % {Introduced as the implementation of \cs{flushpage} with the % replacement of \cs{par} with \cs{pcol@par}.} % \begin{macro}{\clearpage} % \changes{v1.0}{2011/10/10} % {Made \cs{let}-equal to \cs{pcol@com@clearpage} for % localization.} % \begin{macro}{\pcol@com@clearpage} % \changes{v1.0}{2011/10/10} % {Introduced as the implementation of \cs{clearpage} with the % replacement of \cs{par} with \cs{pcol@par}.} % \begin{macro}{\cleardoublepage} % \changes{v1.3-5}{2013/09/17} % {Added as a member of local commands and made \cs{let}-equal to % \cs{pcol@com@cleardoublepage}.} % \begin{macro}{\pcol@com@cleardoublepage} % \changes{v1.3-5}{2013/09/17} % {Introduced as the implementation of \cs{cleardoublepage}.} %  % The macros \!\pcol@com@flushpage!, \!\pcol@com@clearpage! and % \!\pcol@com@cleardoublepage! are the implementations of \elocal{} API % macro \!\flushpage!, \!\clearpage! and \!\cleardoublepage! respectively. % The first two have a common structure in which we at first invoke % \!\pcol@flushclear! for \cscan{} and \pfcheck, and then make an \!\output! % request by \!\pcol@invokeoutput! with \!\penalty! being \!\pcol@op@flush! % or \!\pcol@op@clear! according to the commands. On the other hand the % last one simply invokes \!\pcol@com@clearpage! unconditionally, and then % \!\pcol@com@flushpage!\footnote{ %  % Unlike \LaTeX's \!\cleardoublepage!, it is unnecessary to put an empty % \!\hbox! before \!\flushpage! because it is active even at the top of a % page.} %  % if two-sided paging is enabled by $\CSIndex{if@twoside}=\true$, we are % in an even-numbered page, and $\CSIndex{ifpcol@paired}=\false$ to mean we % are not doing \npaired{} \parapag{}ing. %  % \begin{macrocode} %% Page Flushing Commands \def\pcol@com@flushpage{\pcol@flushclear\voidb@x \pcol@invokeoutput\pcol@op@flush} \def\pcol@com@clearpage{\pcol@flushclear\voidb@x \pcol@invokeoutput\pcol@op@clear} \def\pcol@com@cleardoublepage{\pcol@com@clearpage \if@twoside \ifodd\c@page\else \ifpcol@paired\else \pcol@com@flushpage \fi\fi\fi} % \end{macrocode} % \end{macro}\end{macro}\end{macro}\end{macro}\end{macro}\end{macro} %  % \begin{macro}{\pcol@flushclear} % \changes{v1.2-2}{2013/05/11} % {Introduced for column-scanning in synchronized column-switching and % page flushing.} %  % The macro $\!\pcol@flushclear!\arg{box}$, invoked from % \!\pcol@com@flushpage!, \!\pcol@com@clear~page! and \!\endparacol!, % performs \cscan{} and \pfcheck{} prior to page flushing or environment % closing. After confirming we are in vertical mode by \!\pcol@par! and % letting $d=\!\pcol@nextcol!$ be $c=\!\pcol@currcol!$ to stay in $c$, we % invoke \!\pcol@visitallcols! for \cscan{} to give \TeX's page builder the % chance to break the \tpage{} prior to flushing it. % % Then we repeat \pfcheck{} invoking \!\pcol@output@switch! through % \!\pcol@invokeoutput! with $\!\penalty!=\!\pcol@op@switch!$ and % $\CSIndex{ifpcol@clear}=|\ifpcol@|\~|sync|=\true$ %  % \SpecialIndex{\ifpcol@sync} %  % until the special \!\output! routine finishes with % $\CSIndex{ifpcol@flush}=\false$ and $\arg{box}=\bot$, where % $\arg{box}=\df=\!\pcol@topfnotes!$ if this macro is invoked from % \!\endparacol! with non-merged \Scfnote{} typesetting. In the repetition, % we put \!\vfil! and \!\penalty!|-10000| to force page break into the % tallest column, temporarily turning $\CSIndex{ifpcol@lastpage}=\false$ % using \!\ifpcol@lastpagesave! because the broken page is not last one, % each time the \pfcheck{} tells us to do it. That is, we repeat the check % while we have too tall columns due to \Scfnote{}s or, when closing % \env{paracol} environment, deferred non-merged \Scfnote{}s. % % Finally we let $\CSIndex{ifpcol@clear}$ have its default setting, i.e., % $\false$. %  % \begin{macrocode} \def\pcol@flushclear#1{\pcol@par \pcol@nextcol\pcol@currcol \pcol@visitallcols\@@par \pcol@cleartrue \global\pcol@synctrue \ifpcol@lastpage \pcol@lastpagesavetrue \else \pcol@lastpagesavefalse \fi \pcol@invokeoutput\pcol@op@switch \ifvoid#1\else \global\pcol@flushtrue \fi \@whilesw\ifpcol@flush\fi{% \pcol@lastpagefalse \vfil \penalty-\@M \pcol@cleartrue \global\pcol@synctrue \ifpcol@lastpagesave \pcol@lastpagetrue \fi \pcol@invokeoutput\pcol@op@switch \ifvoid#1\else \global\pcol@flushtrue \fi}% \pcol@clearfalse} % \end{macrocode} % \end{macro} % % % % % \KeepSpace{8} % \section{Commands for Footnotes} % \label{sec:imp-fnote} % \changes{v1.2-2}{2013/05/11} % {Add the subsection ``Commands for Footnotes'' to describe newly % introduced macros for page-wise footnotes.} % % \begin{macro}{\footnoteplacement} % \changes{v1.36-2}{2024/10/22} % {Rename \cs{footnotelayout} to \cs{footnoteplacement} for compatibility % with \textsf{footmisc} package.} % \begin{macro}{\footnotelayout} % \changes{v1.3-5}{2013/09/17} % {Introduced for easier declaration of footnote layout.} % \begin{macro}{\pcol@fnlayout@c} % \changes{v1.3-5}{2013/09/17} % {Introduced for easier declaration of column-wise footnotes.} % \begin{macro}{\pcol@fnlayout@p} % \changes{v1.3-5}{2013/09/17} % {Introduced for easier declaration of page-wise footnotes.} % \begin{macro}{\pcol@fnlayout@m} % \changes{v1.3-5}{2013/09/17} % {Introduced for easier declaration of merged footnotes.} % \begin{macro}{\multicolumnfootnotes} % \changes{v1.2-2}{2013/05/11} % {Introduced to declare the default column-wise footnote % typesetting explicitly.} % \begin{macro}{\singlecolumnfootnotes} % \changes{v1.2-2}{2013/05/11} % {Introduced to declare the page-wise but non-merged footnote % typesetting.} % \begin{macro}{\mergedfootnotes} % \changes{v1.2-2}{2013/05/11} % {Introduced to declare the page-wise and merged footnote % typesetting.} %  % The API macro $\!\footnoteplacement!\Arg{l}$ is to determine that footnotes % are \mcfnote{} ($l=|c|$), \scfnote{} without merging ($l=|p|$), or % \mgfnote{} and \scfnote{} ($l=m$). The macro examines if % $l\in\{|c|,|p|,|m|\}$ by the existence of the corresponding macro % $|\pcol@fnlayout@|{\cdot}l$ %  % \SpecialArrayIndex{l}{\pcol@fnlayout@} %  % and invokes it, or complains if not by \!\PackageError!. % % The macros \!\pcol@fnlayout@c!, \!\pcol@fnlayout@p! and % \!\pcol@fnlayout@m! turn switches $f_s=\CSIndex{ifpcol@scfnote}$, % $f_m=\CSIndex{ifpcol@mgfnote}$ and % $f_a=\CSIndex{ifpcol@fncounteradjustment}$ and make the counter % \counter{footnote} global or local as follows. % $$ % \nosv\begin{array}{l|llll} % l&f_s&f_m&f_a&\counter{footnote}\\\hline % \verb|c|&\false&\false&\false&\hbox{local}\\ % \verb|p|&\true&\false&\true&\hbox{global}\\ % \verb|m|&\true&\true&\true&\hbox{global} % \end{array} % $$ % Note that turning \CSIndex{ifpcol@fncounteradjustment} is done by % \!\fncounteradjustment! ($\true$) or \!\nofncounteradjustment! ($\false$). % Also note that the setting of |\ifpcol@fncounter|\~|adjustment| %  % \SpecialIndex{\ifpcol@fncounteradjustment} %  % and the globalization\slash localization of \counter{footnote} are just to % give defaults and thus can be overridden by API macros giving non-default % settings. Another remark is that backward-compatible macros % \!\multicolumnfootnotes!, \!\singlecolumnfootnotes! and % \!\mergedfootnotes! are \!\let!-equal to \!\pcol@fnlayout@c!, % \!\pcol@fnlayout@p! and \!\pcol@fnlayout@m! respectively. If the deprecated % \!\footnotelayout! is undefined \!\let! it equal to \!\footnoteplacement! and % add a hook to undefine it if \textsf{footmisc} gets loaded; print an % informational message in any case where our \!\footnotelayout! is % unavailable. %  % \begin{macrocode} %% Commands for Footnotes \def\footnoteplacement#1{\@ifundefined{pcol@fnlayout@#1}% {\PackageError{paracol}{Unknown footnote layout specifier #1}}% {\@nameuse{pcol@fnlayout@#1}}} \def\pcol@fnlayout@c{\global\pcol@scfnotefalse \global\pcol@mgfnotefalse \localcounter{footnote}\nofncounteradjustment} \def\pcol@fnlayout@p{\global\pcol@scfnotetrue \global\pcol@mgfnotefalse \globalcounter{footnote}\fncounteradjustment} \def\pcol@fnlayout@m{\pcol@fnlayout@p\global\pcol@mgfnotetrue} \let\multicolumnfootnotes\pcol@fnlayout@c \let\singlecolumnfootnotes\pcol@fnlayout@p \let\mergedfootnotes\pcol@fnlayout@m \@ifundefined{footnotelayout}{% \let\footnotelayout\footnoteplacement \AddToHook{package/footmisc/before}{\let\footnotelayout\relax}% }{} \AddToHook{package/footmisc/before}{\PackageNoteNoLine{paracol}{% With footmisc loaded, paracol's \string\footnotelayout\space will be unavailable. Please use the equivalent \string\footnoteplacement\space instead.\MessageBreak Also note, that paracol's and footmisc's footnote handling may crash% }} % \end{macrocode} % \end{macro}\end{macro}\end{macro}\end{macro} % \end{macro}\end{macro}\end{macro}\end{macro} % % \KeepSpace{2} % \begin{macro}{\@footnotetext} % \begin{macro}{\pcol@fntext} % \changes{v1.2-2}{2013/05/11} % {Introduced for footnote encapsulation and deferring.} % \begin{macro}{\pcol@fntexttop} % \changes{v1.2-2}{2013/05/11} % {Introduced for footnote encapsulation.} % \begin{macro}{\pcol@fntextother} % \changes{v1.2-2}{2013/05/11} % {Introduced for footnote encapsulation and deferring.} %  % The macro \!\pcol@fntext!\marg{text} is our own version of \LaTeX's % \!\@footnotetext! used in \!\footnote! and \!\footnotetext! to \!\insert! % the footnote $\arg{text}$ through \!\footins!. Since the original and our % own are made \!\let!-equal by \!\pcol@zparacol!, our own is active % throughout the environment. The customization is done to examine if the % footnote should be deferred and to encapsulate the footnote in a \!\vbox!. % % The deferred footnote insertion is in effect if the footnote typesetting % is \scfnote{} and \!\footnote! or \!\footnotetext! appears in a page % $p<\ptop$. If so, we put the footnote $\arg{text}$ encapsulated in a % \!\vbox! by \!\pcol@fntextbody! to the tail of $\df=\!\pcol@topfnotes!$ % with \!\penalty!\!\interlinepenalty! preceding it for the split in % \!\pcol@deferredfootins!, using \!\pcol@fntextother!\marg{text} whose sole % user is this macro. Note that the decision of deferring is done based on % $p=\!\pcol@page!$ which could be less than that of the page in which the % footnoted text appears because the paragraph having the text will have a % page break before the text. Therefore, $p$ for the footnote can be % $\ptop$, but this misjudgment will not cause problems because the footnote % will eventually be put in $\ptop$ through $\df$ when the page break % occurs. % % Otherwise the footnote $\arg{text}$ is processed by % \!\pcol@fntexttop!\marg{text}, also used solely in this macro, to % \!\insert! it through \!\footins! as usual but after the encapsulation by % \!\pcol@fntextbody! and with \!\penalty!\!\interlinepenalty! following it % to allow \TeX's page builder to split footnotes. % % Note that \!\pcol@fntexttop! and \!\pcol@fntextother! have \!\long! % property because $\arg{text}$ may have two or more paragraphs. %  % \begin{macrocode} \def\pcol@fntext{% \let\reserved@a\pcol@fntexttop \ifpcol@scfnote \ifnum\pcol@page<\pcol@toppage \let\reserved@a\pcol@fntextother \fi\fi \reserved@a} \long\def\pcol@fntexttop#1{% \pcol@Logfn{\pcol@fntexttop{\@thefnmark}}% \insert\footins{\pcol@fntextbody{#1}\penalty\interlinepenalty}} \long\def\pcol@fntextother#1{% \global\setbox\pcol@topfnotes\vbox{\unvbox\pcol@topfnotes \penalty\interlinepenalty\pcol@fntextbody{#1}}} % \end{macrocode} % \end{macro}\end{macro}\end{macro}\end{macro} %  % \begin{macro}{\pcol@fntextbody} % \changes{v1.2-2}{2013/05/11} % {Introduced for footnote encapsulation and height capping.} %  % The macro \!\pcol@fntextbody!\marg{text}, invoked from \!\pcol@fntexttop! % and \!\pcol@fntext~other!, encapsulates the footnote $\arg{text}$ in a % \!\vbox! whose height is $h_{\max}=\!\textheight!-\!\skip!\~\!\footins!$ at % tallest. The encapsulation is to inhibit page breaks in a footnote % because the split by the break will make some skips and other items % eliminated causing a weird result when split portions are {\em joined}. % The height capping is thus required to find a page in which the footnote % resides. % % The macro at first does operations done in \LaTeX's % \!\@footnotetext! to put $\arg{text}$ in \!\@tempboxa! but with one % exception that $\!\hsize!=\!\textwidth!$ rather than \!\columnwidth! when % \Scfnote{} typesetting is in effect. Note that this part is blindly copied % from the original though it should be meaningless to set % \!\interlinepenalty!, \!\splittopskip!, \!\splitmaxdepth! and % \!\floatingpenalty! because $\arg{text}$ is encapsulated. % % Then the height-plus-depth of the box is compared with $h_{\max}$ and, if % it exceeds the limit, the height of the box is set $h_{\max}$, the % footnote is made followed by a \!\vss! to avoid overfull, and a warning % message of too tall is put by \!\PackageWarning!. Finally, the box is put % into \!\footins! or $\df$ by the invoker of this macro. %  % \begin{macrocode} \long\def\pcol@fntextbody#1{\setbox\@tempboxa\vbox{% \reset@font\footnotesize \interlinepenalty\interfootnotelinepenalty \splittopskip\footnotesep \splitmaxdepth \dp\strutbox \floatingpenalty \@MM \hsize \ifpcol@scfnote \textwidth \else \columnwidth \fi \def\@currentcounter{footnote}% \protected@edef\@currentlabel{% \csname p@footnote\endcsname\@thefnmark }% \color@begingroup \@makefntext{% \rule\z@\footnotesep\ignorespaces#1\@finalstrut\strutbox}% \par \color@endgroup}% \@tempdima\ht\@tempboxa \advance\@tempdima\dp\@tempboxa \@tempdimb\textheight \advance\@tempdimb-\skip\footins \ifdim\@tempdima>\@tempdimb \setbox\@tempboxa\vbox to\@tempdimb{\unvbox\@tempboxa\vss}% \PackageWarning{paracol}{Too tall footnote}% \fi \box\@tempboxa} % \end{macrocode} % \end{macro} % % \begin{macro}{\fncounteradjustment} % \changes{v1.2-2}{2013/05/11} % {Introduced to make \string\texttt{footnote} counter is consistent % with its origin at the beginning of \string\texttt{paracol} and the % number of footnotes given in the environment at its end.} % \begin{macro}{\nofncounteradjustment} % \changes{v1.2-2}{2013/05/11} % {Introduced to disable the footnote counter adjustment.} %  % The API macros \!\fncounteradjustment! and \!\nofncounteradjustment! turns % |\ifpcol@|\~|fncounteradjustment| %  % \SpecialIndex{\ifpcol@fncounteradjustment} %  % $\true$ or $\false$, to enable or disable the \counter{footnote} counter % adjustment letting $\!\c@footnote!=\bf+\nf$ in \Endparacol, respectively. % After the definition we disable the adjustment to give the default setting. %  % \begin{macrocode} \def\fncounteradjustment{\global\pcol@fncounteradjustmenttrue} \def\nofncounteradjustment{\global\pcol@fncounteradjustmentfalse} \nofncounteradjustment % \end{macrocode} % \end{macro}\end{macro} % % \KeepSpace{2} % \begin{macro}{\pcol@footnoterule} % \changes{v1.2-2}{2013/05/11} % {Introduced to keep the original definition of \cs{footnoterule}.} % \begin{macro}{\pcol@@footnote} % \changes{v1.2-2}{2013/05/11} % {Introduced to keep the original definition of \cs{footnote}.} % \begin{macro}{\pcol@@footnotemark} % \changes{v1.2-2}{2013/05/11} % {Introduced to keep the original definition of \cs{footnotemark}.} % \begin{macro}{\pcol@@footnotetext} % \changes{v1.2-2}{2013/05/11} % {Introduced to keep the original definition of \cs{footnotetext}.} %  % The macros \!\pcol@footnoterule!, \!\pcol@@footnote!, % \!\pcol@@footnotemark! and \!\pcol@@footnotetext! are to keep the original % definitions of \!\footnoterule!, \!\footnote!, \!\foot~note~mark! and % \!\footnotetext! in them, respectively, so that we define our own versions % with references to the originals. %  % \begin{macrocode} \let\pcol@footnoterule\footnoterule \let\pcol@@footnote\footnote \let\pcol@@footnotemark\footnotemark \let\pcol@@footnotetext\footnotetext % \end{macrocode} % \end{macro}\end{macro}\end{macro}\end{macro} %  % \KeepSpace{4} % \begin{macro}{\footnote} % \begin{macro}{\pcol@footnote} % \changes{v1.2-2}{2013/05/11} % {Introduced for \cs{footnote*} and footnote counter adjustment.} % \begin{macro}{\pcol@ifootnote} % \changes{v1.2-2}{2013/05/11} % {Introduced for \cs{footnote*} and footnote counter adjustment.} % \begin{macro}{\footnotemark} % \begin{macro}{\pcol@footnotemark} % \changes{v1.2-2}{2013/05/11} % {Introduced for \cs{footnotemark*} and footnote counter adjustment.} % \begin{macro}{\pcol@ifootnotemark} % \changes{v1.2-2}{2013/05/11} % {Introduced for \cs{footnotemark*} and footnote counter adjustment.} %  % The macros \!\pcol@footnote! and \!\pcol@footnotemark! are the % implementations of our own versions of \!\footnote! and \!\footnotemark! % which are made \!\let!-equal to them by \!\pcol@zparacol!, respectively. % The reasons why we need to have our own are two-fold; to have starred % version of them; and to maintain $\nf=\!\pcol@nfootnotes!$ for the % \counter{footnote} counter adjustment. % % The implementations of the starred versions % \!\footnote!|*|\oarg{num}\marg{text} and % \!\footnotemark!|*|\~\oarg{num} have common structure in which we invoke % \!\pcol@adjustfnctr!$\arg{macro}$\oarg{num} if `|*|' is given, to let % \!\c@footnote! have the number relative to $\bf=\!\pcol@footnotebase!$ or % to itself. Then the macros \!\pcol@ifootnote! or \!\pcol@ifootnotemark! % are invoked from \!\pcol@adjustfnctr! or the else-part of \!\@ifstar! to % perform the operations common to both cases with and without `|*|', i.e., % invoking the original version \!\pcol@@footnote! or \!\pcol@@footnotemark! % after incrementing $\nf$. One caution is that % $\arg{macro}=\!\pcol@ifootnote!$ for \!\footnote!, but % $\arg{macro}=|{|\!\pcol@ifootnotemark!\!\relax!|}|$ for \!\footnotemark! % so that \!\@ifnextchar! in \!\pcol@@footnotemark! invoked from % \!\pcol@ifootnotemark! eats \!\relax! to terminate space skipping and thus % spaces following \oarg{num} are kept. %  % \begin{macrocode} \def\pcol@footnote{\@ifstar{\pcol@adjustfnctr\pcol@ifootnote}\pcol@ifootnote} \def\pcol@ifootnote{\global\advance\pcol@nfootnotes\@ne \pcol@@footnote} \def\pcol@footnotemark{\@ifstar {\pcol@adjustfnctr{\pcol@ifootnotemark\relax}}% \pcol@ifootnotemark} \def\pcol@ifootnotemark{\global\advance\pcol@nfootnotes\@ne \pcol@@footnotemark} % \end{macrocode} % \end{macro}\end{macro}\end{macro}\end{macro}\end{macro}\end{macro} %  % \KeepSpace{1} % \begin{macro}{\pcol@adjustfnctr} % \changes{v1.2-2}{2013/05/11} % {Introduced for \cs{footnote*} and \cs{footnotemark*}.} % \begin{macro}{\pcol@iadjustfnctr} % \changes{v1.2-2}{2013/05/11} % {Introduced for \cs{footnote*} and \cs{footnotemark*}.} % \begin{macro}{\pcol@calcfnctr} % \changes{v1.2-2}{2013/05/11} % {Introduced for \cs{footnote*}, \cs{footnotemark*} and % \cs{footnotetext*}.} %  % The macro \!\pcol@adjustfnctr!$\arg{macro}$\oarg{num}, invoked from the % then-part of \!\@ifstar! in \!\pcol@footnote! and \!\pcol@footnotemark!, % calculates the number to be set into \!\c@footnote! by % \!\pcol@calcfnctr!$\arg{num}$\!\@nil! after processing the optional % argument $\arg{num}$ by \!\pcol@iadjustfnctr! with default `|+1|', and % then invoke $\arg{macro}$ being \!\pcol@ifootnote! or % \!\pcol@ifootnotemark!\!\relax!. Since \!\pcol@calcfnctr! returns the % number \!\c@footnote! should have and the counter is incremented by % \!\stepcounter! in \!\pcol@@footnote! or \!\pcol@@footnotemark!, we % decrement the counter prior to invoke $\arg{macro}$. % % The macro \!\pcol@calcfnctr!$\arg{num}$\!\@nil!, also invoked from % \!\pcol@iifootnotetext!, calculate $m$ specified by $\arg{num}$ as follows, % where $f=\!\c@footnote!$, to return it through \!\@tempcnta!. % $$ % m=\cases{f+k&$\arg{num}=|+|k$\cr % f-k&$\arg{num}=|-|k$\cr % \bf+k&$\arg{num}=k$} % $$ %  % \begin{macrocode} \def\pcol@adjustfnctr#1{\@ifnextchar[%] {\pcol@iadjustfnctr{#1}}{\pcol@iadjustfnctr{#1}[+1]}} \def\pcol@iadjustfnctr#1[#2]{\pcol@calcfnctr#2\@nil \global\c@footnote\@tempcnta \global\advance\c@footnote\m@ne#1} \def\pcol@calcfnctr#1#2\@nil{\@tempcnta\c@footnote \def\reserved@a{#1}\def\reserved@b{+}% \ifx\reserved@a\reserved@b \advance\@tempcnta#2\relax \else \def\reserved@b{-}% \ifx\reserved@a\reserved@b \advance\@tempcnta-#2\relax \else \@tempcnta\pcol@footnotebase \advance\@tempcnta#1#2\relax \fi\fi} % \end{macrocode} % \end{macro}\end{macro}\end{macro} %  % \KeepSpace{2} % \begin{macro}{\footnotetext} % \begin{macro}{\pcol@footnotetext} % \changes{v1.2-2}{2013/05/11} % {Introduced for \cs{footnotetext*}.} % \begin{macro}{\pcol@ifootnotetext} % \changes{v1.2-2}{2013/05/11} % {Introduced for \cs{footnotetext*}.} % \begin{macro}{\pcol@iifootnotetext} % \changes{v1.2-2}{2013/05/11} % {Introduced for \cs{footnotetext*}.} %  % The macros \!\pcol@footnotetext! is the implementation of our own versions % of \!\footnotetext! which is made \!\let!-equal to it by % \!\pcol@zparacol!. The reasons why we need to have our own is to have the % starred version. That is, if `|*|' is not given, we simply invoke the % original version \!\pcol@@footnotetext!. Otherwise we invoke % \!\pcol@ifootnotetext! which then examines if the optional argument % \oarg{num} is presented. If so, we invoke \!\pcol@iifootnotetext! in % which \!\pcol@calcfnctr!$\arg{num}$\!\@nil! is invoked to have the value % $m$ being the footnote ordinal with which we invoke % \!\pcol@@footnotetext!\oarg{\mbox{$m$}} with two \!\expandafter!s to % extract $m$ from \!\@tempcnta!. Otherwise, i.e., \oarg{num} is not given, % we increment \!\c@footnote! by \!\stepcounter! before invoking % \!\pcol@@footnotetext!. %  % \begin{macrocode} \def\pcol@footnotetext{\@ifstar\pcol@ifootnotetext\pcol@@footnotetext} \def\pcol@ifootnotetext{\@ifnextchar[%] \pcol@iifootnotetext{\stepcounter{footnote}\pcol@@footnotetext}} \def\pcol@iifootnotetext[#1]{\pcol@calcfnctr#1\@nil \expandafter\pcol@@footnotetext\expandafter[\number\@tempcnta]} % \end{macrocode} % \end{macro}\end{macro}\end{macro}\end{macro} % % % % \KeepSpace{13} % \section{Commands for Marginal Notes} % \label{sec:imp-mpar} % \changes{v1.35-3}{2018/12/31} % {Add the section ``Commands for Marginal Notes'' to describe newly % introduced macros for the emulation of \cs{marginnote}.} % % \begin{macro}{\marginpar} % \changes{v1.35-3}{2018/12/31} % {Locally modified in \cs{pcol@zparacol} for the emulation of % \cs{marginnote}.} % \begin{macro}{\pcol@marginpar} % \changes{v1.35-3}{2018/12/31} % {Introduced as the in-\texttt{paracol} version of \cs{marginpar} for % the emulation of \cs{marginnote}.} % \begin{macro}{\pcol@@marginpar} % \changes{v1.35-3}{2018/12/31} % {Introduced to keep the original version of \cs{marginpar} for % the emulation of \cs{marginnote}.} % \begin{macro}{\@mn@@marginnote} % \changes{v1.35-3}{2018/12/31} % {Locally modified in \cs{pcol@zparacol} for the emulation of % \cs{marginnote}.} % \begin{macro}{\pcol@marginnote} % \changes{v1.35-3}{2018/12/31} % {Introduced as the in-\texttt{paracol} version of % \cs{@mn@@marginnote} for the emulation of \cs{marginnote}.} % \begin{macro}{\pcol@mn@warning} % \changes{v1.35-3}{2018/12/31} % {Introduced to put a warning message to show \cs{marginnote} is % emulated.} % \begin{macro}{\@xympar} % \changes{v1.35-3}{2018/12/31} % {Locally modified in \cs{pcol@zparacol} for the emulation of % \cs{marginnote}.} % \begin{macro}{\pcol@xympar} % \changes{v1.35-3}{2018/12/31} % {Introduced as the in-\texttt{paracol} version of % \cs{@xympar} for the emulation of \cs{marginnote}.} % \begin{macro}{\pcol@@xympar} % \changes{v1.35-3}{2018/12/31} % {Introduced to keep the original version of \cs{@xympar} for the % emulation of \cs{marginnote}.} % \begin{macro}{\pcol@mparoffset} % \changes{v1.35-3}{2018/12/31} % {Introduced to have the vertical offset for the emulation of % \cs{marginnote}.} % The API macro \!\marginnote!\oarg{left}\marg{right}\oarg{voffset} given by % the package \textsf{marginnote} is emulated using % \!\marginpar!\oarg{left}\marg{right} and \!\pcol@addmarginpar! in % \!\output! routine. The basic mechanism is to pass the vertical offset % $\arg{voffset}$ to \!\pcol@addmarginpar! through $|\dimen|\arg{b}$ where % $b$ is the \!\insert! to carry $\arg{left}$. The offset passing is % implemented as follows. %  % \begin{itemize} % \item % \!\marginpar! is made \!\let!-equal to our own version \!\pcol@marginpar! % in \!\pcol@zparacol! so that it \!\let! the macro \!\pcol@mparoffset! be % \!\z@! and then invoke \LaTeX's original version kept in % \!\pcol@@marginpar!, because the marginal note given by \!\marginpar! will % not be shifted. % % \item % The internal macro % \!\@mn@@marginnote!\oarg{left}\marg{right}\oarg{voffset} defined in % \textsf{marginnote} is made \!\let!-equal to our own version % \!\pcol@marginnote! in \!\pcol@zparacol! so that it |\def|ines % \!\pcol@mparoffset! to have $\arg{voffset}$ and then invoke % \!\pcol@@marginpar!\oarg{left}\~\marg{right} for the emulation. In the % invocation, \textsf{marginnote}'s typesetting macros \!\margin~font!, % \!\raggedleftmarginnote! and \!\raggedrightmarginnote! are attached to % $\arg{left}$ and $\arg{right}$. % % \item % \LaTeX's internal macro \!\@xympar! for the last operations of % \!\marginpar! is made \!\let!-equal to our own version in % \!\pcol@zparacol! so that it assigns the offset in \!\pcol@mparoffset! to % |\dimen|\!\@marbox! for $\arg{left}$, if $\!\@floatpenalty!<0$ to mean % other macros for \!\marginpar! have not detected any errors. % \end{itemize} %  % In addition, we raise a warning that \!\marginnote! is emulated by % \!\pcol@mn@warning!, which is made \!\let!-equal to \!\relax! in the caller % \!\pcol@marginnote! after the invocation so that the warning message is % put just once. %  % \begin{macrocode} %% Commands for Marginal Notes \def\pcol@marginpar{\let\pcol@mparoffset\z@ \pcol@@marginpar} \long\def\pcol@marginnote[#1]#2[#3]{\endgroup \pcol@mn@warning \global\let\pcol@mn@warning\relax \def\pcol@mparoffset{#3}% \pcol@@marginpar[\marginfont\raggedleftmarginnote#1]% {\marginfont\raggedrightmarginnote#2}} \def\pcol@mn@warning{% \PackageWarning{paracol}{\string\margninnote\space is emulated by \string\marginpar.}} \def\pcol@xympar{% \ifnum\@floatpenalty<\z@ \global\dimen\@marbox\pcol@mparoffset\relax \fi \pcol@@xympar} % \end{macrocode} % \end{macro}\end{macro}\end{macro}\end{macro}\end{macro} % \end{macro}\end{macro}\end{macro}\end{macro}\end{macro} % % % \KeepSpace{9} % \section{Two-Sided Typesetting} % \label{sec:imp-swap} % \changes{v1.2-4}{2013/05/11} % {Add the section ``Column-Swapping'' to describe newly % introduced macros for column-swapping.} % \changes{v1.3-5}{2013/09/17} % {Rename the section title from ``Column-Swapping'' to ``Two-Sided % Typesetting''.} % % \begin{macro}{\twosided} % \changes{v1.3-5}{2013/09/17} % {Introduced as an easier API for various two-sided typesetting.} % \changes{v1.3-3}{2013/09/17} % {Add two-sided background painting.} % \changes{v1.3-4}{2013/09/17} % {Add two-sided marginal note placement.} % \begin{macro}{\pcol@twosided} % \changes{v1.3-5}{2013/09/17} % {Introduced to implement \cs{twosided}.} % \changes{v1.31}{2013/10/10} % {Fix spelling ``twosiding'' replacing it with ``two-siding'' in the % error message.} % \begin{macro}{\pcol@twosided@p} % \changes{v1.3-5}{2013/09/17} % {Introduced to implement \cs{twosided} with \string\texttt{[p]}.} % \begin{macro}{\pcol@twosided@c} % \changes{v1.3-5}{2013/09/17} % {Introduced to implement \cs{twosided} with \string\texttt{[c]}.} % \begin{macro}{\pcol@twosided@m} % \changes{v1.3-5}{2013/09/17} % {Introduced to implement \cs{twosided} with \string\texttt{[m]}.} % \changes{v1.3-4}{2013/09/17} % {Introduced for two-sided marginal note placement.} % \begin{macro}{\pcol@twosided@b} % \changes{v1.3-5}{2013/09/17} % {Introduced to implement \cs{twosided} with \string\texttt{[b]}.} % \changes{v1.3-3}{2013/09/17} % {Introduced for two-sided background painting.} % \begin{macro}{\swapcolumninevenpages} % \changes{v1.2-4}{2013/05/11} % {Introduced to enable column-swapping.} % \begin{macro}{\noswapcolumninevenpages} % \changes{v1.2-4}{2013/05/11} % {Introduced to disable column-swapping.} %  % \def\inornot{\mathrel{{\in}/{\notin}}} %  % The API macro $\!\twosided!|[|T|]|$ where $T=t_1t_2\cdots$ is to % enable\slash disable two-sided paging with % $\CSIndex{if@twoside}=\true/\false$ ($|p|\inornot T$), two-sided \cswap{} % with $\CSIndex{ifpcol@swapcolumn}\~={\true/\false}$ ($|c|\inornot T$), % two-sided % marginal note placement with % $\CSIndex{ifpcol@swapmarginpar}={\true/\false}$ ($|m|\inornot T$), and/or % two-sided \bgpaint{} with $\CSIndex{ifpcol@bg@swap}={\true/\false}$ % ($|b|\inornot{}T$) individually, or to enable all of them as a whole % when the optional argument is not given. % % The macro invokes \!\pcol@twosided! with the optional argument $T$ if % provided, or with $T=|pcmb|$ otherwise to enable all features. Then % \!\pcol@twosided! at first turns all the switches $\false$ an then scans % all non-space tokens $t\in T$ invoking $|\pcol@twosided@|{\cdot}t$ if it % is defined and thus $t\in\{|p|,|c|,|m|,|b|\}$ to turn the corresponding % switch $\true$, or complains that the feature $t$ is unknown. % % Note that backward-compatible API macros % \!\swapcolumninevenpages! and \!\noswapcolumn~inevenpages! are still % available to turn $\CSIndex{ifpcol@swapcolumn}$ $\true$ an $\false$ % respectively. %  % \begin{macrocode} %% Column Swapping \def\twosided{\@ifnextchar[%] {\pcol@twosided}{\pcol@twosided[pcmb]}} \def\pcol@twosided[#1]{% \global\@twosidefalse \global\pcol@swapcolumnfalse \global\pcol@swapmarginparfalse \global\pcol@bg@swapfalse \@tfor\reserved@a:=#1\do{% \@ifundefined{pcol@twosided@\reserved@a}% {\PackageError{paracol}{Unknown two-siding feature \reserved@a}}% {\@nameuse{pcol@twosided@\reserved@a}}}} \def\pcol@twosided@p{\global\@twosidetrue} \def\pcol@twosided@c{\global\pcol@swapcolumntrue} \def\pcol@twosided@m{\global\pcol@swapmarginpartrue} \def\pcol@twosided@b{\global\pcol@bg@swaptrue} \def\swapcolumninevenpages{\global\pcol@swapcolumntrue} \def\noswapcolumninevenpages{\global\pcol@swapcolumnfalse} % \end{macrocode} % \end{macro}\end{macro}\end{macro}\end{macro}\end{macro}\end{macro} % \end{macro}\end{macro} %  % \begin{macro}{\pcol@swapcolumn} % \changes{v1.2-4}{2013/05/11} % {Introduced to convert column ordinal and its position.} % \changes{v1.3-2}{2013/09/17} % {Add two arguments $C^0$ and $C^1$ as the third and fourth ones to % modify the calculation of $c_2$ with them for column-swapping with % parallel-paging.} % \changes{v1.3-3}{2013/09/17} % {Add the assignment of \cs{pcol@colsepid} to let it have $c_2-1$ if % swapped or $c_2$ otherwise.} % \changes{v1.3-4}{2013/09/17} % {Add a user \cs{pcol@addmarginpar} and remove \cs{paracol}, % \cs{pcol@sptext} and \cs{pcol@switchcol}.} % \begin{macro}{\pcol@colsepid} % \changes{v1.3-3}{2013/09/17} % {Introduced to be let have $c_2-1$ if swapped or $c_2$ otherwise by % \cs{pcol@swapcolumn}.} %  % The macro \!\pcol@swapcolumn!$\\\<\Cfrom\>\<\Cto\>$ converts % the column ordinal $c$ or position $c'$ in the \!\count! % register\footnote{ %  % Or the \!\dimen! register \!\z@!.} %  % $c_1$ to the position or ordinal to set it in the \!\count! register % $c_2$, for a \parapag{}e having columns $c\In\Cfrom\Cto$. That is, we let % $c_2=(\Cto-1)-(c_1-\Cfrom)$ if $\CSIndex{ifpcol@swapcolumn}=\true$ to mean % the \cswap{} is in effect and \!\c@page! is even, while $c_2=c_1$ % otherwise. We also let $c^g=\!\pcol@colsepid!=c_2-1$ if swapped, or % $c^g=c_2$ otherwise, so that it has the ordinal of the \csepgap{} % {\em physically} following the column $c_2$. % % The macro is used in \!\pcol@ioutputelt!, \!\pcol@addmarginpar!, % \!\pcol@imakeflushedpage! and \!\pcol@iflushfloats! with % $(c_1,c_2)=(c',c)$, and in \!\pcol@addmarginpar! (another use) with % $(c_1,c_2)=(c,c')$. Note that in the uses in the macros above except for % \!\pcol@addmarginpar!, \!\c@page! definitely has the page number for the % page to be shipped out. As for \!\pcol@addmarginpar! on the other hand, % \!\c@page! can be different from the ship-out page number to produce a % weird result if their parities are different, due to page jump. However % this problem is not so severe because it just affects the position of % marginal notes which \LaTeX{} itself may misplace. %  % \begin{macrocode} \def\pcol@swapcolumn#1#2#3#4{% \edef\pcol@colsepid{\number#1}% \ifpcol@swapcolumn \ifodd\c@page\relax #2#1\relax \else #2#4\relax \advance#2-#1\relax \advance#2#3\relax \advance#2-\tw@ \edef\pcol@colsepid{\number#2}% \advance#2\@ne \fi \else #2#1\relax \fi} % \end{macrocode} % \end{macro}\end{macro} %  % \KeepSpace{2} % \begin{macro}{\marginparthreshold} % \changes{v1.3-4}{2013/09/17} % {Introduced to specify the smallest ordinal of columns whose marginal % notes go to the right margin if not swapped.} % \begin{macro}{\pcol@marginparthreshold} % \changes{v1.3-4}{2013/09/17} % {Introduced to implement \cs{marginparthreshold}.} % \begin{macro}{\pcol@mpthreshold@l} % \changes{v1.3-4}{2013/09/17} % {Introduced to keep the value specified by \cs{marginparthreshold} % for columns in left parallel-pages.} % \begin{macro}{\pcol@mpthreshold@r} % \changes{v1.3-4}{2013/09/17} % {Introduced to keep the value specified by \cs{marginparthreshold} % for columns in right parallel-pages.} %  % The API macro $\!\marginparthreshold!\Arg{t_l}|[|t_r|]|$ determines the % smallest ordinal $t_l$ of columns in left \parapag{}es whose marginal % notes go to the right margin in fundamental setting of marginal note % positioning, while the threshold in right \parapag{}es is given by $t_r$ % if provided or by $t_l$ otherwise. That is, marginal notes given in a % column $c$ in a page $p$ s.t.\ $c\In0\CL$ (resp.\ $\LBRP\CL\C$) go left if % $c\!\pcol@mcpushlimit!=1000$, and if so % we stop the execution with \!\PackageError!\footnote{ %  % And let $m=1$ to allow a user to continue the execution bravely.} %  % in order to avoid too many macros $|\pcol@reset@color@mpop@|\cdot m$ are % defined\footnote{ %  % \SpecialArrayIndex{m}{\pcol@reset@color@mpop@} %  % We could make the number of math-mode coloring operations virtually % unlimited by putting all digits of the decimal representation of $m$ % followed by a terminator by multiple % \cs{aftergroup}s so that \cs{pcol@reset@color@mpop} is put by % \cs{aftergroup} prior to them to capture them as its argument, but % limiting with $2^{31}-1$ is still necessary and that with 1000 is % reasonable.}. %  % Otherwise, i.e., if $m\leq\!\pcol@mcpushlimit!$, we % reserve the invocation of the macro $|\pcol@reset@color@mpop@|{\cdot}i$ %  % \SpecialArrayMainIndex{m}{\pcol@reset@color@mpop@} %  % for our own pop by \!\aftergroup! defining the macro as % $\!\pcol@reset@color@mpop!\Arg{m}$. If we are not in math mode, on the % other hand, and neither in a \!\vbox! nor in restricted horizontal mode, % we simply reserve the invocation of the macro $\pcol@reset@color@pop$. % % Then, regardless that we are in math mode or not, we push the contents of % \!\current@color!, which \!\set@color! should refer to as the color % information to be set, into the shadow \colorstack{} % $\cstshadow=\!\pcol@colorstack@shadow!$ for the stack rewinding\slash % reestablishing in \!\columncolor! and \!\normalcolumncolor!. Since this % push is done non-\!\global!ly with \!\edef!, we save\slash restore the % definition of \!\@elt! to\slash from \Midx{\!\pcol@elt@save!} before\slash % after the push, respectively\footnote{ %  % Just in case.}. %  % Then we \!\insert! a \!\vbox! through \!\pcol@colorins! for the push of % $\celt_i$ or $\mcelt_{i,m}$ to $\cstraw$ synchronous with a page break or % \cswitch{}. The height of the \!\vbox! is 1\,|pt|, depth is 0 and % width is $m$\,|sp| if we are in math mode or 0 otherwise, and its % contents is the coloring \!\special! given by \!\pcol@set@color! so that % the \!\special! is what the macro put at the beginning of this macro but % without the reservation of \!\reset@color!. After the insertion, we put % \!\pcol@fcwhyphenate!, being \!\hskip!\!\z@! when % \!\coloredwordhyphenated! is effective, to split the coloring \!\special! % from the first colored word so that the word may be hyphenated if we are % in horizontal mode. If we are in vertical mode, on the other hand, we do % \!\nobreak! if $\CSIndex{if@nobreak}=\true$ to keep the \!\insert!ion from % being followed by a page break. %  % \begin{macrocode} \def\pcol@mcpushlimit{1000} \def\pcol@set@color@push{\pcol@set@color \ifmmode\else\ifinner \pcol@innertrue \fi\fi \ifpcol@inner\else \ifmmode \global\advance\pcol@mcid\@ne \ifnum \pcol@mcid>\pcol@mcpushlimit\relax \PackageError{paracol}{Too many coloring commands in math mode}\@ehb \global\pcol@mdid\@ne \fi \@tempdima\pcol@mcid sp\relax \expandafter\aftergroup \csname pcol@reset@color@mpop@\number\pcol@mcid\endcsname \expandafter\xdef \csname pcol@reset@color@mpop@\number\pcol@mcid\endcsname {\noexpand\pcol@reset@color@mpop{\number\pcol@mcid}}% \else \aftergroup\pcol@reset@color@pop \@tempdima\z@ \fi \let\pcol@elt@save\@elt \let\@elt\relax \edef\pcol@colorstack@shadow{\pcol@colorstack@shadow\@elt{\current@color}}% \let\@elt\pcol@elt@save \setbox\@tempboxa\vbox{\let\aftergroup\@gobble \pcol@set@color}% \ht\@tempboxa1sp \dp\@tempboxa\z@ \wd\@tempboxa\@tempdima \insert\pcol@colorins{\box\@tempboxa}\ifhmode \pcol@fcwhyphenate \fi \ifvmode\if@nobreak \nobreak \fi\fi \fi} % \end{macrocode} % \end{macro}\end{macro}\end{macro}\end{macro} % % \begin{macro}{\pcol@reset@color@pop} % \changes{v1.2-1}{2013/05/11} % {Introduced to work as \cs{reset@color}.} % \changes{v1.22}{2013/06/30} % {Modified to pop color stack by \cs{output} and to examine if % $\cs{ifpcol@output}\EQ\mathit{true}$.} % \changes{v1.23}{2013/07/08} % {Add an argument of \cs{relax} to \cs{pcol@color@invokeoutput} % so that the last word of a colored text is not followed by a line % break candidate.} % \changes{v1.34}{2018/05/07} % {Completely change its definition according to the new text coloring % with \cs{insert}.} % \begin{macro}{\pcol@reset@color@mpop} % \changes{v1.24}{2013/07/27} % {Introduced for coloring specified in math mode.} % \changes{v1.34}{2018/05/07} % {Completely change its definition according to the new text coloring % with \cs{insert}.} %  % The macro \!\pcol@reset@color@pop! and its math-mode relative % $\!\pcol@reset@color@mpop!\~\Arg{m}$ are invoked by % \!\aftergroup! mechanism in \!\pcol@set@color@push!, directly for the % former and through the macro $|\pcol@reset@color@mpop@|{\cdot}m$ %  % \SpecialArrayIndex{m}{\pcol@reset@color@mpop@} %  % for the latter. They \!\insert! a \!\vbox! for $\celtpop_i$ or % $\mceltpop_{i,m}$ to add it to $\cstraw$ synchronously with a page break % or \cswitch{}. Therefore, the height and depth of the \!\vbox! are 0 and % width is 0 for $\celtpop_i$ or $m$\,|sp| for $\mceltpop_{i,m}$. The % contents of the \!\vbox! is an uncoloring \!\special! given by % \!\reset@color! but this is done just for debugging to show what % \!\pcol@colorins! has by, for example, \!\pcol@ShowBox!. Then if we are % in vertical mode and $\CSIndex{if@nobreak}=\true$, we do \!\nobreak! to % keep the \!\insert!ion from being followed by a page break even in % \!\pcol@reset@color@mpop! because its corresponding % \!\pcol@set@color@push! may have been in a displayed math construct after % which we are in vertical mode. % % One caution is that \!\pcol@reset@color@pop! can be invoked outside the % \env{paracol} environment in which the corresponding % \!\pcol@set@color@push! appears. In this case with % $\CSIndex{ifpcol@output}=\false$, we don't need to do the pop operation % and cannot make the \!\insert!ion for it because \!\output! is not for % \env{paracol}. %  % \begin{macrocode} \def\pcol@reset@color@pop{% \ifpcol@output \setbox\@tempboxa\vbox{\reset@color}% \ht\@tempboxa\z@ \dp\@tempboxa\z@ \wd\@tempboxa\z@ \insert\pcol@colorins{\box\@tempboxa}% \ifvmode\if@nobreak \nobreak \fi\fi \fi} \def\pcol@reset@color@mpop#1{% \setbox\@tempboxa\vbox{\reset@color}% \ht\@tempboxa\z@ \dp\@tempboxa\z@ \wd\@tempboxa#1sp\relax \insert\pcol@colorins{\box\@tempboxa}% \ifvmode\if@nobreak \nobreak \fi\fi } % \end{macrocode} % \end{macro}\end{macro} % % \changes{v1.22}{2013/06/30} % {\cs{pcol@color@invokeoutput} was introduced for \cs{output} % request for coloring but removed in v1.34.} % \changes{v1.23}{2013/07/08} % {\cs{pcol@color@invokeoutput} was modified to add second argument % $s$ to insert a null skip after \cs{vadjust} only when the macro is % invoked from \cs{pcol@set@color@push} in horizontal mode.} % \changes{v1.34}{2018/05/07} % {\cs{pcol@color@invokeoutput} is removed according to the change of % text coloring from \cs{output} to \cs{insert}.} % \changes{v1.22}{2013/06/30} % {\cs{pcol@color@invokeoutput@v} was introduced for \cs{output} % request for coloring but removed in v1.34.} % \changes{v1.34}{2018/05/07} % {\cs{pcol@color@invokeoutput@v} is removed according to the change of % text coloring from \cs{output} to \cs{insert}.} % % \KeepSpace{1} % \begin{macro}{\coloredwordhyphenated} % \changes{v1.3-6}{2013/09/17} % {Introduced to enable null skip insertion before the first word % after a coloring command not always but conditionally.} % \begin{macro}{\nocoloredwordhyphenated} % \changes{v1.3-6}{2013/09/17} % {Introduced to disable null skip insertion before the first word % after a coloring command.} % \begin{macro}{\pcol@fcwhyphenate} % \changes{v1.3-6}{2013/09/17} % {Introduced to enable null skip insertion before the first word % after a coloring command not always but conditionally.} %  % The API macro \!\coloredwordhyphenated! \!\def!ines the macro % \!\pcol@fcwhyphenate! being \!\hskip!\!\z@! so that the null space is % inserted after the coloring \!\special! and \!\insert! put by % \!\pcol@set@color@push! if we are in horizontal mode, so that the word % following them can be hyphenated. The other API macro % \!\nocoloredwordhyphenated! makes $\!\pcol@fcwhyphenate!=\!\relax!$ to % inhibit the insertion. Since the null skip is a line break candidate, the % skip might cause an unexpected and undesirable line break. However, this % demerit is less important than the merit of making it possible to % hyphenate the first word in multi-column documents with narrow lines, and % thus we make \!\coloredwordhyphenated! effective in default while giving % users a means to disable the insertion (occasionally) by % \!\nocoloredwordhyphenated!. %  % \begin{macrocode} \def\coloredwordhyphenated{\def\pcol@fcwhyphenate{\hskip\z@}} \def\nocoloredwordhyphenated{\let\pcol@fcwhyphenate\relax} \coloredwordhyphenated % \end{macrocode} % \end{macro}\end{macro}\end{macro} % % % % \KeepSpace{8} % \section{Commands for Column-Separating Rule Color and Background Painting} % \label{sec:imp-commbg} % \changes{v1.3-3}{2013/09/17} % {Add the subsection ``Commands for Column-Separating Rule Color and % Background Painting'' to describe newly % introduced API macros to specify colors of column-separating rules % and background painting.} % % \begin{macro}{\colseprulecolor} % \changes{v1.3-3}{2013/09/17} % {Introduced to specify the colors of column-separating rules.} % \begin{macro}{\pcol@defcseprulecolor@x} % \changes{v1.3-3}{2013/09/17} % {Introduced to implement \cs{colseprulecolor}.} % \begin{macro}{\pcol@defcseprulecolor@y} % \changes{v1.3-3}{2013/09/17} % {Introduced to implement \cs{colseprulecolor}.} % \begin{macro}{\pcol@defcseprulecolor} % \changes{v1.3-3}{2013/09/17} % {Introduced to implement \cs{colseprulecolor}.} % \begin{macro}{\normalcolseprulecolor} % \changes{v1.3-3}{2013/09/17} % {Introduced to specify that color of column-separating rules is normal.} % \begin{macro}{\pcol@defcseprulecolor@i} % \changes{v1.3-3}{2013/09/17} % {Introduced to implement \cs{colseprulecolor} and % \cs{normalcolseprulecolor}.} % \begin{macro}{\pcol@colseprulecolor} % \changes{v1.3-3}{2013/09/17} % {Introduced to keep the color for all column-separating rules.} %  % The macro \!\colseprulecolor!\oarg{mode}\marg{color}$|[|c|]|$ \!\def!ines % \!\pcol@colseprulecolor! to have the $\arg{color}$ optionally with % coloring $\arg{mode}$ of all \cseprule{}s if the optional argument $c$ is % not provided, or $|\pcol@colseprulecolor|{\cdot}c$ %  % \SpecialArrayMainIndex{c}{\pcol@colseprulecolor} %  % that of the rule drawn between a particular column pair $c$ and $c+1$. % After \!\def!ining \Midx{\!\pcol@colorcommand!} to be \!\colseprulecolor! % in case we have to give a warning, the macro invokes % \!\pcol@defcseprulecolor@x!\oarg{mode}\marg{color} or % \!\pcol@defcseprulecolor@y!\marg{color} according to the provision of the % optional argument $\arg{mode}$ to invoke \!\pcol@defcseprulecolor! with % argument \marg{cmd}${}={}$\!\color!\oarg{mode}\marg{color} so that this % macro invokes $\!\pcol@defcseprulecolor@i!\ARg{cmd}|[|c|]|$ where % $c=\emptyset$ if the optional argument $c$ is not provided. % % The macro $\!\normalcolseprulecolor!|[|c|]|$, on the other hand, defines % $|\pcol@colseprule|\~|color|[{\cdot}c]$ %  % \SpecialArrayIndex{c}{\pcol@colseprulecolor} % \SpecialIndex{\pcol@colseprulecolor} %  % with whatever \!\normalcolor! gives, and thus it invokes % \!\pcol@defcseprulecolor@i! letting $\arg{cmd}=\!\normalcolor!$, after % \!\def!ining \!\pcol@colorcommand! to be \!\normalcolsep~rule~color!. % % The macro $\!\pcol@defcseprulecolor@i!\ARg{cmd}|[|c|]|$ examines if % $\!\set@color!=\!\relax!$ to mean no coloring packages have been loaded % and, if so, do nothing giving a warning the command in % \!\pcol@colorcommand! is not effective. Otherwise, we examine if % $\arg{cmd}$ has proper arguments by invoking it but temporally nullifying % \!\set@color! and then \!\def!ine $|\pcol@colseprulecolor|[{\cdot}c]$ %  % \SpecialArrayIndex{c}{\pcol@colseprulecolor} % \SpecialIndex{\pcol@colseprulecolor} %  % to be $\arg{cmd}$. % % Note that at the top level we \!\def!ine \!\pcol@colseprulecolor! to be % \!\normalcolor! to give the default for all \cseprule{}s. Also note that % macros $|\pcol@colseprulecolor|{\cdot}c$ %  % \SpecialArrayIndex{c}{\pcol@colseprulecolor} %  % are referred to solely in \!\pcol@hfil! % which also uses \!\pcol@colseprulecolor! for columns for which % $|\pcol@colseprulecolor|{\cdot}c$ %  % \SpecialArrayIndex{c}{\pcol@colseprulecolor} %  % is not defined. %  % \begin{macrocode} %% Commands for Column-Separating Rule Color and Background Painting \def\colseprulecolor{\def\pcol@colorcommand{\string\colseprulecolor}% \@ifnextchar[%] \pcol@defcseprulecolor@x\pcol@defcseprulecolor@y} \def\pcol@defcseprulecolor@x[#1]#2{\pcol@defcseprulecolor{\color[#1]{#2}}} \def\pcol@defcseprulecolor@y#1{\pcol@defcseprulecolor{\color{#1}}} \def\pcol@defcseprulecolor#1{\@ifnextchar[%] {\pcol@defcseprulecolor@i{#1}}{\pcol@defcseprulecolor@i{#1}[]}} \def\normalcolseprulecolor{% \def\pcol@colorcommand{\string\normalcolseprulecolor}% \@ifnextchar[%] {\pcol@defcseprulecolor@i\normalcolor}% {\pcol@defcseprulecolor@i\normalcolor[]}} \def\pcol@defcseprulecolor@i#1[#2]{% \ifx\set@color\relax \PackageWarning{paracol}{\pcol@colorcommand\space is not effective without some coloring package}% \else {\let\set@color\relax #1}% \global\@namedef{pcol@colseprulecolor#2}{#1}% \fi} \gdef\pcol@colseprulecolor{\normalcolor} % \end{macrocode} % \end{macro}\end{macro}\end{macro}\end{macro}\end{macro}\end{macro}\end{macro} % % \KeepSpace{8} % \begin{macro}{\backgroundcolor} % \changes{v1.3-3}{2013/09/17} % {Introduced to define colors for background painting.} % \begin{macro}{\nobackgroundcolor} % \changes{v1.3-3}{2013/09/17} % {Introduced to undefine colors for background painting.} % \begin{macro}{\pcol@backgroundcolor@e} % \changes{v1.3-3}{2013/09/17} % {Introduced to implement \cs{backgroundcolor} and % \cs{nobackgroundcolor}.} % \begin{macro}{\pcol@backgroundcolor} % \changes{v1.3-3}{2013/09/17} % {Introduced to implement \cs{backgroundcolor} and % \cs{nobackgroundcolor}.} % \changes{v1.31}{2013/10/10} % {Fix the misspelling ``colorling'' in the error message.} % \begin{macro}{\pcol@backgroundcolor@i} % \changes{v1.3-3}{2013/09/17} % {Introduced to implement \cs{backgroundcolor} and % \cs{nobackgroundcolor}.} % \begin{macro}{\pcol@bg@region} % \changes{v1.3-3}{2013/09/17} % {Introduced to implement \cs{backgroundcolor} and % \cs{nobackgroundcolor}.} % \begin{macro}{\pcol@backgroundcolor@ii} % \changes{v1.3-3}{2013/09/17} % {Introduced to implement \cs{backgroundcolor} and % \cs{nobackgroundcolor}.} % \begin{macro}{\pcol@backgroundcolor@iii} % \changes{v1.3-3}{2013/09/17} % {Introduced to implement \cs{backgroundcolor}.} % \begin{macro}{\pcol@backgroundcolor@iv} % \changes{v1.3-3}{2013/09/17} % {Introduced to implement \cs{backgroundcolor}.} % \begin{macro}{\pcol@backgroundcolor@v} % \changes{v1.3-3}{2013/09/17} % {Introduced to implement \cs{backgroundcolor}.} %  % {\nosv\gdef\|{\;|\;}} % \def\fdef{f_{\mathit{def}}} %  % The macro % \!\backgroundcolor!\marg{region}\oarg{mode}\marg{color} % defines the $\arg{color}$ optionally with $\arg{mode}$ of the % $\arg{region}$ whose syntax is specified as follows. %  % % \begin{eqnarray*} % \arg{region}&{:}{:}{=}&\arg{regionid}\arg{extension}\\ % \arg{regionid}&{:}{:}{=}&\\|\arg{corg}|[|c|]|\\ % \arg{a}&{:}{:}{=}&\arg{corg}\||s|\||S|\||t|\||T|\||l|\||L|\||r|\||R|\| % |f|\||F|\||n|\||N|\||p|\||P|\\ % \arg{corg}&{:}{:}{=}&|c|\||C|\||g|\||G|\\ % \arg{extension}&{:}{:}{=}&\emptyset\||(|x_0|,|y_0|)|\| % |(|x_0|,|y_0|)(|x_1|,|y_1|)| % \end{eqnarray*} % %  % On the other hand, the counterpart macro % \!\nobackgroundcolor!\marg{region} undefines the color of $\arg{region}$. % Both macros invoke \!\pcol@backgroundcolor! giving all arguments to it to % parse the argument $\arg{region}$, after letting % $\fdef=\CSIndex{if@tempswa}=\true$ and % $\!\pcol@backgroundcolor@e!=\!\pcol@backgroundcolor@w!$ in % \!\backgroundcolor!, or $\fdef=\CSIndex{if@tempswa}=\true$ and % $\!\pcol@backgroundcolor@e!=\!\pcol@backgroundcolor@z!$ in % \!\nobackgroundcolor!. Note that the \!\let!-assignment to % \!\pcol@backgroundcolor@e! is effective when we found an error in the % parse of the argument $\arg{region}$ to throw away what remains in the % argument unprocessed and, for \!\backgroundcolor!, the other arguments % \oarg{mode}\marg{color}. % % Then the macro \!\pcol@backgroundcolor! examines if $|\pcol@bg@@|{\cdot}a$ %  % \SpecialArrayIndex{a}{\pcol@bg@@} %  % is defined, and if not, raises an error that $a$ is invalid and then, in case % the user dare to continue the execution, invokes % \!\pcol@backgroundcolor@e! to throw all arguments away after letting % $a'=\!\pcol@bg@region!=|xx|$ so that the undefining % $|\pcol@bg@color|{\cdot}a'$ does not cause any troubles. %  % \SpecialArrayIndex{a}{\pcol@bg@color@} % \SpecialArrayIndex{a{\cdot}\string\texttt{@}{\cdot}c}{\pcol@bg@color@} %  % Otherwise, i.e., if $|\pcol@bg@@|{\cdot}a$ is defined, it % invokes $\!\pcol@backgroundcolor@i!|[|c|]|$ or \!\pcol@backgroundcolor@ii! % according to the provision of the optional argument $|[|c|]|$, after % \!\def!ining $a'=\Midx{\!\pcol@bg@region!}$ to be $a$. Then % \!\pcol@backgroundcolor@i! examines if \!\pcol@bg@may~have~col@!${\cdot}a$ %  % \SpecialIndex{\pcol@bg@mayhavecol@c}\SpecialIndex{\pcol@bg@mayhavecol@C} % \SpecialIndex{\pcol@bg@mayhavecol@g}\SpecialIndex{\pcol@bg@mayhavecol@G} %  % is defined, and if not, raises an error again in a similar way, or % otherwise invokes \!\pcol@backgroundcolor@ii! after re\!\def!ining % $a'=a{\cdot}|@|{\cdot}c$. % % Then if $\fdef=\true$, the macro \!\pcol@backgroundcolor@ii! examines if % $\!\set@color!=\!\relax!$, and if so it complains that any coloring % packages have not been loaded and invokes \!\pcol@backgroundcolor@w! just % for throwing away optional arguments for \bgext{} and % \oarg{mode}\marg{color}. Otherwise, i.e., if $\!\set@color!\neq\!\relax!$, % it invokes \!\pcol@backgroundcolor@iii! after adding $a'$ to the tail of % \!\pcol@bg@defined!. On the other hand if $\fdef=\false$, it invokes % \!\pcol@backgroundcolor@z! without checking the availability of coloring % macros. % % The macro \!\pcol@backgroundcolor@iii! at first invokes % $\!\pcol@bg@defext!\Arg{d}\Arg{e}$ with $e=0$ for all % $d\in\{|l|,|r|,|t|,|b|\}$ to have default (no) \bgext{}s. Then if % $|(|x_0|,|y_0|)|$ is provided, \!\pcol@bg@defext! is invoked again by % \!\pcol@backgroundcolor@iv! for all % $d\in\{|l|,|r|,|t|,|b|\}$ but with $e=x_0$ for % $d\in\{|l|,|r|\}$ and with $e=y_0$ for $d\in\{|t|,|b|\}$. % Further, if % $|(|x_1|,|y_1|)|$ is also provided, \!\pcol@bg@defext! is % invoked once again by \!\pcol@backgroundcolor@v! for all % $(d,e)\in\{(|r|,x_1),(|b|,y_1)\}$. Finally \!\pcol@backgroundcolor@v! % invokes \!\pcol@backgroundcolor@x!, which is also invoked from % \!\pcol@backgroundcolor@iii! and \!\pcol@backgroundcolor@iv! if they find no % (further) \bgext{}s. %  % \begin{macrocode} \def\backgroundcolor#1{\@tempswatrue \let\pcol@backgroundcolor@e\pcol@backgroundcolor@w \pcol@backgroundcolor#1\@nil} \def\nobackgroundcolor#1{\@tempswafalse \let\pcol@backgroundcolor@e\pcol@backgroundcolor@z \pcol@backgroundcolor#1\@nil} \def\pcol@backgroundcolor#1{% \@ifundefined{pcol@bg@@#1}% {\PackageError{paracol}% {Invalid background coloring region identifier #1}% \def\pcol@bg@region{xx}\pcol@backgroundcolor@e}% {\def\pcol@bg@region{#1}% \@ifnextchar[%] \pcol@backgroundcolor@i \pcol@backgroundcolor@ii}} \def\pcol@backgroundcolor@i[#1]{% \@ifundefined{pcol@bg@mayhavecol@\pcol@bg@region}% {\PackageError{paracol}% {Column number \number#1 is not effective for background coloring region \pcol@bg@region}% \def\pcol@bg@region{xx}\pcol@backgroundcolor@e}% {\edef\pcol@bg@region{\pcol@bg@region @#1}% \pcol@backgroundcolor@ii}} \def\pcol@backgroundcolor@ii{% \if@tempswa \ifx\set@color\relax \PackageWarning{paracol}{\string\backgroundcolor\space is not effective without some coloring package}% \let\reserved@b\pcol@backgroundcolor@w \else \let\reserved@b\pcol@backgroundcolor@iii \@cons\pcol@bg@defined{{\pcol@bg@region}}% \fi \else \let\reserved@b\pcol@backgroundcolor@z \fi \reserved@b} \def\pcol@backgroundcolor@iii{% \pcol@bg@defext{l}\z@ \pcol@bg@defext{r}\z@ \pcol@bg@defext{t}\z@ \pcol@bg@defext{b}\z@ \@ifnextchar(%) \pcol@backgroundcolor@iv \pcol@backgroundcolor@x} \def\pcol@backgroundcolor@iv(#1,#2){% \pcol@bg@defext{l}{#1}\pcol@bg@defext{r}{#1}% \pcol@bg@defext{t}{#2}\pcol@bg@defext{b}{#2}% \@ifnextchar(%) \pcol@backgroundcolor@v \pcol@backgroundcolor@x} \def\pcol@backgroundcolor@v(#1,#2){% \pcol@bg@defext{r}{#1}\pcol@bg@defext{b}{#2}% \pcol@backgroundcolor@x} % \end{macrocode} % \end{macro}\end{macro}\end{macro}\end{macro}\end{macro} % \end{macro}\end{macro}\end{macro}\end{macro}\end{macro} %  % \begin{macro}{\pcol@backgroundcolor@x} % \changes{v1.3-3}{2013/09/17} % {Introduced to implement \cs{backgroundcolor}.} % \begin{macro}{\pcol@backgroundcolor@y} % \changes{v1.3-3}{2013/09/17} % {Introduced to implement \cs{backgroundcolor}.} %  % The macro \!\pcol@backgroundcolor@x! is used in % \!\pcol@backgroundcolor@iii!, \!\pcol@backgroundcolor@iv! and % \!\pcol@backgroundcolor@v! to define the color for \bgpaint{} of the % region $a'=\!\pcol@bg@region!$. Since the macro is followed by the % arguments \oarg{mode}\marg{color} of \!\backgroundcolor!, the macro % invokes \!\color! to let it \!\def!ine \!\current@color! but without real % coloring operations by letting % \!\set@color!${}={}$\!\pcol@backgroundcolor@y!. Therefore % \!\pcol@backgroundcolor@y! is invoked in \!\color! and it \!\xdef!ines % $|\pcol@bg@colpr|{\cdot}a'$ to let it have whatever \!\current@color! has. %  % \SpecialArrayIndex{a}{\pcol@bg@color@} % \SpecialArrayIndex{a{\cdot}\string\texttt{@}{\cdot}c}{\pcol@bg@color@} %  % \begin{macrocode} \def\pcol@backgroundcolor@x#1\@nil{\begingroup \let\set@color\pcol@backgroundcolor@y \color} \def\pcol@backgroundcolor@y{% \expandafter\xdef\csname pcol@bg@color@\pcol@bg@region\endcsname {\current@color}% \endgroup} % \end{macrocode} % \end{macro}\end{macro} % % \KeepSpace{2} % \begin{macro}{\pcol@backgroundcolor@z} % \changes{v1.3-3}{2013/09/17} % {Introduced to implement \cs{nobackgroundcolor}.} % \begin{macro}{\pcol@backgroundcolor@w} % \changes{v1.3-3}{2013/09/17} % {Introduced to implement \cs{backgroundcolor}.} % \begin{macro}{\pcol@backgroundcolor@wi} % \changes{v1.3-3}{2013/09/17} % {Introduced to implement \cs{backgroundcolor} and % \cs{nobackgroundcolor}.} % \begin{macro}{\pcol@bg@color@xx} % \changes{v1.3-3}{2013/09/17} % {Introduced to implement \cs{backgroundcolor} and % \cs{nobackgroundcolor}.} %  % The macro \!\pcol@backgroundcolor@z! is invoked from % \!\pcol@backgroundcolor@ii! directly to work for \!\nobackgroundcolor! to % disable the \bgpaint{} for a region $a'=\!\pcol@bg@region!$, or from % \!\pcol@backgroundcolor! and \!\pcol@backgroundcolor@i! through % \!\pcol@backgroundcolor@e! when they find an error in the argument % $\arg{region}$ of \!\nobackground~color!. Similarly the macro % \!\pcol@backgroundcolor@w! is invoked from \!\pcol@background~color@ii! % directly when it finds no coloring packages have not been loaded, or % \!\pcol@backgroundcolor! and \!\pcol@backgroundcolor@i! through % \!\pcol@backgroundcolor@e! on error too but in the argument of % \!\backgroundcolor!. Both macros throw away whatever remains in % $\arg{region}$ unprocessed and then invoke \!\pcol@backgroundcolor@wi!, % but \!\pcol@backgroundcolor@z! gives it a dummy argument pair, while % \!\pcol@backgroundcolor@w! passes \oarg{mode}\marg{color} to it. % % Then \!\pcol@backgroundcolor@wi! throw all arguments away and lets % $|\pcol@bg@color@|{\cdot}a'\~=\!\relax!$ so that the region $a'$ is % untouched in \bgpaint{} macros. Note that since % $a'=|xx|$ being an absolutely non-existent region when this macro is used % for error recovery, undefining \!\pcol@bg@color@xx! is not harmful. %  % \begin{macrocode} \def\pcol@backgroundcolor@z#1\@nil{\pcol@backgroundcolor@wi[]{}} \def\pcol@backgroundcolor@w#1\@nil{\@ifnextchar[%] \pcol@backgroundcolor@wi{\pcol@backgroundcolor@wi[]}} \def\pcol@backgroundcolor@wi[#1]#2{% \expandafter\global\expandafter\let \csname pcol@bg@color@\pcol@bg@region\endcsname\relax} % \end{macrocode} % \end{macro}\end{macro}\end{macro}\end{macro} % % \KeepSpace{2} % \begin{macro}{\pcol@bg@mayhavecol@c} % \changes{v1.3-3}{2013/09/17} % {Introduced to implement \cs{backgroundcolor} and % \cs{nobackgroundcolor}.} % \begin{macro}{\pcol@bg@mayhavecol@C} % \changes{v1.3-3}{2013/09/17} % {Introduced to implement \cs{backgroundcolor} and % \cs{nobackgroundcolor}.} % \begin{macro}{\pcol@bg@mayhavecol@g} % \changes{v1.3-3}{2013/09/17} % {Introduced to implement \cs{backgroundcolor} and % \cs{nobackgroundcolor}.} % \begin{macro}{\pcol@bg@mayhavecol@G} % \changes{v1.3-3}{2013/09/17} % {Introduced to implement \cs{backgroundcolor} and % \cs{nobackgroundcolor}.} %  % The macros $|\pcol@bg@mayhavecol@|{\cdot}a$ where $a\in\{|c|,|C|,|g|,|G|\}$ % are used in \!\pcol@background~color@i! when the region specifier $a$ in % $\arg{region}$ argument of \!\backgroundcolor! or \!\noback~groundcolor! is % followed by optional $|[|c|]|$, so that the invoker macro examines if $a$ % can have the optional column ordinal. %  % \SpecialArrayMainIndex{a}{\pcol@bg@mayhavecol@} %  % Therefore, the macros just need not to be \!\relax! and thus commonly have % empty bodies. %  % \begin{macrocode} \def\pcol@bg@mayhavecol@c{} \def\pcol@bg@mayhavecol@C{} \def\pcol@bg@mayhavecol@g{} \def\pcol@bg@mayhavecol@G{} % \end{macrocode} % \end{macro}\end{macro}\end{macro}\end{macro} % % \begin{macro}{\pcol@bg@defext} % \changes{v1.3-3}{2013/09/17} % {Introduced to implement \cs{backgroundcolor}.} % The macro $\!\pcol@bg@defext!\Arg{d}\Arg{e}$ is used by % \!\pcol@backgroundcolor@iii!, % \!\pcol@back~groundcolor@iv! and \!\pcol@backgroundcolor@v! to \!\def!ine % $|\pcol@bg@ext@|{\cdot}d{\cdot}|@|{\cdot}a'$ be $e=0$ for all % $d\in\{|l|,|r|,|t|,|b|\}$ in the first, be $e=x_0$ for $d\in\{|l|,|r|\}$ % and $e=y_0$ for $d\in\{|t|,|b|\}$ in the second, and be $e=x_0$, $x_1$, % $y_0$ and $y_1$ for $d$ being |l|, |r|, |t|, |b| respectively in the last. %  % \SpecialArrayMainIndex{d{\cdot}\string\texttt{@}{\cdot}a}{\pcol@bg@ext@} % \SpecialArrayMainIndex % {d{\cdot}\string\texttt{@}{\cdot}a{\cdot}\string\texttt{@}{\cdot}c} % {\pcol@bg@ext@} %  % The macro at first lets \!\@tempdima! have $e$ to confirm $e$ is a proper % dimension and then \!\xdef!ines % $|\pcol@bg@ext@|{\cdot}d{\cdot}|@|{\cdot}a'$ to let it have the integer % representation of $e$ followed by |sp|. %  % \SpecialArrayMainIndex{d{\cdot}\string\texttt{@}{\cdot}a}{\pcol@bg@ext@} % \SpecialArrayMainIndex % {d{\cdot}\string\texttt{@}{\cdot}a{\cdot}\string\texttt{@}{\cdot}c} % {\pcol@bg@ext@} %  %  % \begin{macrocode} \def\pcol@bg@defext#1#2{% \@tempdima#2\relax \expandafter\xdef\csname pcol@bg@ext@#1@\pcol@bg@region\endcsname{% \number\@tempdima sp}} % \end{macrocode} % \end{macro} % % \begin{macro}{\resetbackgroundcolor} % \changes{v1.3-3}{2013/09/17} % {Introduced to disable background-painting for all regions.} % \begingroup \let\SMALL\small \let\small\footnotesize % \begin{macro}{\pcol@resetbackgroundcolor} % \changes{v1.3-3}{2013/09/17} % {Introduced to implement \cs{resetbackgroundcolor}.} % \let\small\SMALL % \begin{macro}{\pcol@bg@defined} % \changes{v1.3-3}{2013/09/17} % {Introduced to implement \cs{resetbackgroundcolor}.} %  % The API macro \!\resetbackgroundcolor! disables \bgpaint{} of all regions % whose colors have been specified by \!\backgroundcolor!. Since the region % specifiers $a'_1$, $a'_2$, \ldots, $a'_n$ for which \bgpaint{} is specified % are recorded in $\!\pcol@bg@defined!= % \!\@elt!\Arg{a'_1}\!\@elt!\Arg{a'_2}\cdots\!\@elt!\Arg{a'_n}$ by % \!\pcol@backgroundcolor!, the macro invokes \!\pcol@bg@defined! % temporarily letting $\!\@elt!=\!\pcol@resetbackgroundcolor!$ to let % $|\pcol@bg@|\~|color@|{\cdot}a'_i$ be \!\relax! for all $i\in[1,n]$, and % clears \!\pcol@bg@defined!, whose initial state is also empty. %  % \SpecialArrayIndex{a}{\pcol@bg@color@} % \SpecialArrayIndex{a{\cdot}\string\texttt{@}{\cdot}c}{\pcol@bg@color@} %  % \begin{macrocode} \def\resetbackgroundcolor{{% \let\@elt\pcol@resetbackgroundcolor \pcol@bg@defined \gdef\pcol@bgdefined{}}} \def\pcol@resetbackgroundcolor#1{% \expandafter\global\expandafter\let\csname pcol@bg@color@#1\endcsname\relax} \gdef\pcol@bg@defined{} % \end{macrocode} % \end{macro}\end{macro}\endgroup\end{macro} % % % % \section{Closing Environment} % \label{sec:imp-end} % % \begin{macro}{\endparacol} % \changes{v1.0}{2011/10/10} % {Replace \cs{par} with \cs{pcol@par}.} % \changes{v1.2-2}{2013/05/11} % {Add pre-flushing column height check and footnote counter % adjustment.} % \changes{v1.2-5}{2013/05/11} % {Remove \cs{global} assignment of \cs{hsize} and \cs{linewidth} % because assignments of them in \string\texttt{paracol} are now % perfectly local.} % \changes{v1.31}{2013/10/10} % {Add saving $c$ into \cs{pcol@lastcol} to let \cs{pcol@output@end} % know the column visited last.} % \begin{macro}{\pcol@lastcol} % \changes{v1.31}{2013/10/10} % {Introduced to keep the column visited last to pass its typesetting % parameters to post-environment.} %  % The macro \!\endparacol! is invoked from \Endparacol{} to close % \env{paracol} environment. After making it sure to be in vertical mode by % \!\pcol@par!, we switch to the column 0 by \!\pcol@switchcol! to let % \lcounter{} have the values for the column 0 so that they are referred to % outside the environment, after saving the current column $c$ in % \!\pcol@lastcol! to be referred to in \!\pcol@output@end! so that % $\cc_c(\sw)$ and $\cc_c(\ep)$ are passed to \postenv. In \!\pcol@switchcol!, % we make sure, not to add the preamble for column 0 by checking whether % \!\pcol@lastcol! is set. % % \begin{Sloppy}{1800} % Then we invoke \!\pcol@flushclear! for \pfcheck{}, turning % $\CSIndex{ifpcol@lastpage}=\true$ to tell \!\pcol@output@switch! for the % check that it works on the \lpage, and giving $\bot$ to \!\pcol@flushclear! % as its argument, unless footnote typesetting is \scfnote{} but not % \mgfnote{} for which we give $\df$ to ensure all deferred footnotes are % put in the checking process. Note that the argument for \Mcfnote{} % typesetting is $\df$ but it is definitely $\bot$ in this mode. After that % we make an \!\output! request by \!\pcol@invokeoutput! with % $\!\penalty!=\!\pcol@op@end!$ and still with % $\CSIndex{ifpcol@lastpage}=\true$ to build the \lpage. % \end{Sloppy} % % Next, we let $\!\columnwidth!=\!\textwidth!$ and % $\CSIndex{if@twocolumn}=\false$ for single-column typesetting, and also % let $\!\topskip!=\!\pcol@topskip!$ to make it sure that the parameter has % the value used outside in \env{paracol} environment. Finally, if the % \counter{footnote} counter adjustment is required by % $\CSIndex{ifpcol@fncounteradjustment}=\true$, we let % $\!\c@footnote!=\bf+\nf$. %  % \begin{macrocode} %% Closing Environment \def\endparacol{\pcol@par \edef\pcol@lastcol{\number\pcol@currcol}% \pcol@nextcol\z@ \pcol@switchcol \pcol@lastpagetrue \ifpcol@mgfnote \pcol@flushclear\voidb@x \else \pcol@flushclear\pcol@topfnotes \fi \pcol@invokeoutput\pcol@op@end \global\columnwidth\textwidth \global\@twocolumnfalse \global\topskip\pcol@topskip \ifpcol@fncounteradjustment \global\c@footnote\pcol@footnotebase \global\advance\c@footnote\pcol@nfootnotes \fi} % \end{macrocode} % \end{macro}\end{macro} % % \begin{macro}{\pcol@restoreeveryvbox} % \changes{v1.22}{2013/06/30} % {Introduced to reflect \cs{global} updates on \cs{everyvbox} in % \string\texttt{paracol} environments.} %  % The macro \!\pcol@restoreeveryvbox! is invoked just after \Endparacol{} by % \!\aftergroup! mechanism activated by \!\pcol@zparacol!. It examines if % \!\pcol@everyvbox! has tokens different from \!\pcol@dummytoken! which % \!\pcol@zparacol! \!\global!ly assigned to the register. Since the dummy % token cannot be assigned to \!\everyvbox!\footnote{ %  % Unless a very surprising coincidence happens or a user intentionally % violates the coherence of the implementation.}, %  % the difference means the \!\everyvbox! has been \!\global!ly updated with % the value that \!\pcol@everyvbox! has now. Therefore if so, we % globally update \!\everyvbox! with \!\pcol@everyvbox! to reflect the % global update in the environment. %  % \begin{macrocode} \def\pcol@restoreeveryvbox{% \expandafter\def\expandafter\reserved@a\expandafter{\the\pcol@everyvbox}% \def\reserved@b{\pcol@dummytoken}% \ifx\reserved@a\reserved@b\else \global\everyvbox\pcol@everyvbox \fi} % \end{macrocode} % \end{macro} %\iffalse % %\fi \endinput  vi: spellcapcheck=[.?]\\_[])'"^I\ ]\\+ spell