diff options
Diffstat (limited to 'tex/context/base/spac-ali.mkiv')
-rw-r--r-- | tex/context/base/spac-ali.mkiv | 1117 |
1 files changed, 0 insertions, 1117 deletions
diff --git a/tex/context/base/spac-ali.mkiv b/tex/context/base/spac-ali.mkiv deleted file mode 100644 index 07d588ba7..000000000 --- a/tex/context/base/spac-ali.mkiv +++ /dev/null @@ -1,1117 +0,0 @@ -%D \module -%D [ file=spac-ali, -%D version=2009.10.16, % 1997.03.31, was core-spa.tex -%D title=\CONTEXT\ Spacing Macros, -%D subtitle=Alignments, -%D author=Hans Hagen, -%D date=\currentdate, -%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}] -%C -%C This module is part of the \CONTEXT\ macro||package and is -%C therefore copyrighted by \PRAGMA. See mreadme.pdf for -%C details. - -\writestatus{loading}{ConTeXt Spacing Macros / Alignments} - -\unprotect - -%D The \type {new} and \type {old} methods are gone as we now have \type -%D {flush*} variants. Starting at the last day of 2011 both methods are -%D merged into one and caching has been added, which makes switching -%D twice as fast. - -% Todo: find a way to force last lines to have some distance from the right -% edge (problem: keywords or presets), maybe a plugin -% -% \setupalign[...,myoption] % last -% -% but that also means myoption gets frozen due to caching. - -\registerctxluafile{spac-ali}{1.001} - -\definesystemattribute[realign] [public] % might be combined with the next one -\definesystemattribute[alignstate][public] % will make a single attributes for several states - -\appendtoks - \attribute\realignattribute \attributeunsetvalue - \attribute\alignstateattribute\attributeunsetvalue -\to \everyforgetall - -\unexpanded\def\resetrealignsignal{\attribute\realignattribute\attributeunsetvalue} -\unexpanded\def\signalinnerrealign{\clf_setrealign\plustwo} -\unexpanded\def\signalouterrealign{\clf_setrealign\plusone} - -\installcorenamespace{aligncommand} -\installcorenamespace{alignhorizontal} -\installcorenamespace{alignvertical} - -\installcorenamespace{alignmentnormalcache} -\installcorenamespace{alignmentraggedcache} - -% nasty hack: - -\installcorenamespace{alignmentnormalcacheodd} -\installcorenamespace{alignmentnormalcacheeven} - -\installcorenamespace{alignmentraggedcacheodd} -\installcorenamespace{alignmentraggedcacheeven} - -\def\??alignmentnormalcache{\ifodd\realpageno\??alignmentnormalcacheodd\else\??alignmentnormalcacheeven\fi} -\def\??alignmentraggedcache{\ifodd\realpageno\??alignmentraggedcacheodd\else\??alignmentraggedcacheeven\fi} - -\newtoks\everyresetalign % todo - -% We will not use bodydir and pagedir so we disable them. That way we get -% normal hyperlink support. - -\let\spac_directions_normal_body_dir\normalbodydir -\let\spac_directions_normal_page_dir\normalpagedir - -\unexpanded\def\bodydir{\afterassignment\spac_directions_bodydir_indeed\spac_directions_normal_body_dir} \let\normalbodydir\bodydir -\unexpanded\def\pagedir{\afterassignment\spac_directions_pagedir_indeed\spac_directions_normal_page_dir} \let\normalpagedir\pagedir - -\def\spac_directions_bodydir_indeed{\spac_directions_normal_body_dir TLT\relax} -\def\spac_directions_pagedir_indeed{\spac_directions_normal_page_dir TLT\relax} - -% This will become a more advanced layout controller soon: - -\newconditional\layoutlefttoright \settrue\layoutlefttoright -\newconditional\displaylefttoright \settrue\displaylefttoright -\newconditional\inlinelefttoright \settrue\inlinelefttoright - -\unexpanded\def\lefttoright - {\ifvmode - \spac_directions_lefttoright_vmode - \else - \spac_directions_lefttoright_hmode - \fi} - -\unexpanded\def\spac_directions_lefttoright_vmode - {\settrue\displaylefttoright - \settrue\inlinelefttoright - \textdir TLT\relax - \pardir TLT\relax} - -\unexpanded\def\spac_directions_lefttoright_hmode - {\settrue\inlinelefttoright - \textdir TLT\relax} - -\unexpanded\def\righttoleft - {\ifvmode - \spac_directions_righttoleft_vmode - \else - \spac_directions_righttoleft_hmode - \fi} - -\unexpanded\def\spac_directions_righttoleft_vmode - {\setfalse\displaylefttoright - \setfalse\inlinelefttoright - \textdir TRT\relax - \pardir TRT\relax} - -\unexpanded\def\spac_directions_righttoleft_hmode - {\textdir TRT\relax - \setfalse\inlinelefttoright} - -\def\currentdirectionparameters - {\ifconditional\inlinelefttoright \else - idir="r2l", - \fi - \ifconditional\displaylefttoright \else - ddir="r2l", - \fi} - -\unexpanded\def\synchronizelayoutdirection - {\ifconditional\layoutlefttoright - \spac_directions_synchronize_lr - \else - \spac_directions_synchronize_rl - \fi} - -\unexpanded\def\synchronizedisplaydirection - {\ifconditional\displaylefttoright - \spac_directions_synchronize_lr - \else - \spac_directions_synchronize_rl - \fi} - -\def\spac_directions_synchronize_lr - {\settrue\inlinelefttoright - \textdir TLT\relax - \pardir TLT\relax} - -\def\spac_directions_synchronize_rl - {\setfalse\inlinelefttoright - \textdir TRT\relax - \pardir TRT\relax} - -\unexpanded\def\synchronizeinlinedirection - {\textdir T\ifconditional\inlinelefttoright L\else R\fi T\relax} - -\unexpanded\def\showdirections - {\dontleavehmode - \begingroup\infofont\textdir TLT[\space - layout:\ifconditional \layoutlefttoright l2r\else r2l\fi\space - display:\ifconditional\displaylefttoright l2r\else r2l\fi\space - inline:\ifconditional \inlinelefttoright l2r\else r2l\fi\space - ]\endgroup} - -\unexpanded\def\righttolefthbox#1#{\normalhbox dir TRT #1\bgroup\righttoleft\let\next} \let\rtlhbox\righttolefthbox -\unexpanded\def\lefttorighthbox#1#{\normalhbox dir TLT #1\bgroup\lefttoright\let\next} \let\ltrhbox\lefttorighthbox -\unexpanded\def\righttoleftvbox#1#{\normalvbox dir TRT #1\bgroup\righttoleft\let\next} \let\rtlvbox\righttoleftvbox -\unexpanded\def\lefttorightvbox#1#{\normalvbox dir TLT #1\bgroup\lefttoright\let\next} \let\ltrvbox\lefttorightvbox -\unexpanded\def\righttoleftvtop#1#{\normalvtop dir TRT #1\bgroup\righttoleft\let\next} \let\rtlvtop\righttoleftvtop -\unexpanded\def\lefttorightvtop#1#{\normalvtop dir TLT #1\bgroup\lefttoright\let\next} \let\ltrvtop\lefttorightvtop - -\unexpanded\def\autodirhbox#1#{\hbox#1\bgroup\synchronizeinlinedirection\let\next} -\unexpanded\def\autodirvbox#1#{\vbox#1\bgroup\synchronizeinlinedirection\let\next} % maybe also pardir or maybe just a \vbox -\unexpanded\def\autodirvtop#1#{\vtop#1\bgroup\synchronizeinlinedirection\let\next} % maybe also pardir or maybe just a \vtop - -% Tolerance and hyphenation - -\ifdefined\lesshyphens \else \let\lesshyphens\relax \fi -\ifdefined\morehyphens \else \let\morehyphens\relax \fi -\ifdefined\nohyphens \else \let\nohyphens \relax \fi -\ifdefined\dohyphens \else \let\dohyphens \relax \fi - -\newconstant\c_spac_tolerance_default \c_spac_tolerance_default 1500 % shouldn't that be 200 -\newconstant\c_spac_tolerance_minimum \c_spac_tolerance_minimum 1500 -\newconstant\c_spac_tolerance_normal \c_spac_tolerance_normal 3000 -\newconstant\c_spac_tolerance_extreme \c_spac_tolerance_extreme 4500 - -\def\spac_align_set_raggedness_left {\plustwo\bodyfontsize} -\def\spac_align_set_raggedness_right {\plustwo\bodyfontsize} -\def\spac_align_set_raggedness_middle{\plussix\bodyfontsize} % overloaded below - -% oeps, hsize can be 0pt in which case we get a strange division -% was: 6\bodyfontsize, fails on: \placefigure{x $x=x$ x}{} - -\def\spac_align_set_raggedness_middle{\ifdim\hsize=\zeropoint\plussix\bodyfontsize\else.5\hsize\fi} - -\unexpanded\def\setraggedness#1% tricky .. we keep the global tolerance otherwise ... to be reconsidered - {\ifnum\tolerance<\c_spac_tolerance_minimum - \tolerance\c_spac_tolerance_minimum % small values have unwanted side effects - \else - % todo: take set value or none .. better done elsewhere (200 is normal) - \fi - \ifx\dohyphens\relax % was 2.5 in old implementation using scratch registers - \hyphenpenalty\dimexpr2.8\hsize/\dimexpr#1\relax\relax % 50 in raggedright/raggedleft - \fi} - -\unexpanded\def\spac_align_set_tolerant - {\tolerance\c_spac_tolerance_normal} - -\unexpanded\def\spac_align_set_very_tolerant - {\tolerance\c_spac_tolerance_extreme} - -\unexpanded\def\spac_align_set_stretch - {\emergencystretch\bodyfontsize} - -\unexpanded\def\spac_align_set_extreme_stretch - {\emergencystretch10\bodyfontsize} - -% Vertical - -\newconstant\c_spac_align_state_vertical - -\unexpanded\def\spac_align_set_vertical_none - {\let\raggedtopcommand \relax - \let\raggedbottomcommand\relax} - -\unexpanded\def\spac_align_set_vertical_lohi - {\let\raggedtopcommand \vfilll - \let\raggedbottomcommand\vfilll} - -\unexpanded\def\spac_align_set_vertical_low - {\let\raggedtopcommand \vfilll - \let\raggedbottomcommand\relax} - -\unexpanded\def\spac_align_set_vertical_high - {\let\raggedtopcommand \relax - \let\raggedbottomcommand\vfilll} - -\def\spac_align_flush_vertical - {\ifcase\c_spac_align_state_vertical - \spac_align_set_vertical_none - \or - \spac_align_set_vertical_lohi - \or - \spac_align_set_vertical_low - \or - \spac_align_set_vertical_high - \fi} - -% Horizontal - -\ifdefined\raggedonelinerstate \else - \newconditional\raggedonelinerstate % public -\fi - -% \appendtoks -% \setfalse\raggedonelinerstate -% \to \everyforgetall - -\newconstant\raggedstatus % public - -\newconstant\c_spac_align_state_horizontal -\newconstant\c_spac_align_state_broad - -\def\v_spac_align_fill_amount {\plusone fil} -\def\v_spac_align_fill_amount_negative {\minusone fil} -\def\v_spac_align_fill_amount_double {\plustwo fil} -\def\v_spac_align_fill_amount_space {\plustwo fil} % can be added to xspace if we have a key -\def\v_spac_align_fill_amount_half {.5fil} -\let\v_spac_align_space_amount \interwordspace -\def\v_spac_align_space_amount_x {.5\emwidth} - -\newskip\s_zero_plus_one_fil \s_zero_plus_one_fil = 0pt plus 1fil -\newskip\s_zero_plus_zero \s_zero_plus_zero = 0pt plus 0pt - -% \s!plus ... slower than inline - -\unexpanded\def\spac_align_set_horizontal_none % should also relax \updateraggedskips - {\raggedstatus\zerocount - \attribute\alignstateattribute\attributeunsetvalue - \leftskip \plusone\leftskip - \rightskip \plusone\rightskip - \spaceskip \zeropoint - \xspaceskip \zeropoint - \parfillskip\s_zero_plus_one_fil % new - \setfalse\raggedonelinerstate % now here - \let\updateraggedskips\relax} % no need for adaption - -\unexpanded\def\spac_align_set_horizontal_left - {\setraggedness\spac_align_set_raggedness_left - \raggedstatus\plusone - \attribute\alignstateattribute\plusone - \leftskip \plusone\leftskip \s!plus\spac_align_set_raggedness_left - \rightskip \plusone\rightskip\s!plus\zeropoint - \spaceskip \v_spac_align_space_amount - \xspaceskip \v_spac_align_space_amount_x - \parfillskip\s_zero_plus_zero - \parindent \zeropoint - \relax} - -\unexpanded\def\spac_align_set_horizontal_center - {\setraggedness\spac_align_set_raggedness_middle - \raggedstatus\plustwo - \attribute\alignstateattribute\plustwo - \leftskip \plusone\leftskip \s!plus\spac_align_set_raggedness_middle - \rightskip \plusone\rightskip\s!plus\spac_align_set_raggedness_middle - \spaceskip \v_spac_align_space_amount - \xspaceskip \v_spac_align_space_amount_x - \parfillskip\s_zero_plus_zero - \parindent \zeropoint - \relax} - -\unexpanded\def\spac_align_set_horizontal_right - {\setraggedness\spac_align_set_raggedness_right - \raggedstatus\plusthree - \attribute\alignstateattribute\plusthree - \leftskip \plusone\leftskip \s!plus\zeropoint - \rightskip \plusone\rightskip\s!plus\spac_align_set_raggedness_right - \spaceskip \v_spac_align_space_amount - \xspaceskip \v_spac_align_space_amount_x - \parfillskip\s_zero_plus_one_fil - %\parindent \parindent - \relax} - -\unexpanded\def\spac_align_set_horizontal_very_left - {\raggedstatus\plusone - \attribute\alignstateattribute\plusone - \leftskip \plusone\leftskip \s!plus\v_spac_align_fill_amount - \rightskip \plusone\rightskip\s!plus\zeropoint - \spaceskip \v_spac_align_space_amount - \xspaceskip \v_spac_align_space_amount_x - \parfillskip\s_zero_plus_zero - \parindent \zeropoint - \relax} - -\unexpanded\def\spac_align_set_horizontal_very_center - {\raggedstatus\plustwo - \attribute\alignstateattribute\plustwo - \leftskip \plusone\leftskip \s!plus\v_spac_align_fill_amount - \rightskip \plusone\rightskip\s!plus\v_spac_align_fill_amount - \spaceskip \v_spac_align_space_amount - \xspaceskip \v_spac_align_space_amount_x - \parfillskip\s_zero_plus_zero - \parindent \zeropoint - \relax} - -\unexpanded\def\spac_align_set_horizontal_very_right - {\raggedstatus\plusthree - \attribute\alignstateattribute\plusthree - \leftskip \plusone\leftskip \s!plus\zeropoint - \rightskip \plusone\rightskip\s!plus\v_spac_align_fill_amount - \spaceskip \v_spac_align_space_amount - \xspaceskip \v_spac_align_space_amount_x - \parfillskip\s_zero_plus_zero - %\parindent \parindent - \relax} - -\unexpanded\def\spac_align_set_horizontal_wide_center - {\setraggedness\spac_align_set_raggedness_middle - \raggedstatus\plustwo - \attribute\alignstateattribute\plustwo - \leftskip \plusone\leftskip \s!plus\v_spac_align_fill_amount_half - \rightskip \plusone\rightskip\s!plus\v_spac_align_fill_amount_half - \spaceskip \v_spac_align_space_amount - \xspaceskip \v_spac_align_space_amount_x - \parfillskip\s_zero_plus_zero - \parindent \zeropoint - \relax} - -\unexpanded\def\spac_align_set_horizontal_centered_last_line - {\raggedstatus\zerocount - \attribute\alignstateattribute\attributeunsetvalue - \leftskip \plusone\leftskip \s!plus\v_spac_align_fill_amount\relax - \rightskip \plusone\rightskip\s!plus\v_spac_align_fill_amount_negative\relax - \spaceskip \zeropoint\relax - \xspaceskip \zeropoint\relax - \parfillskip\zeropoint\s!plus\v_spac_align_fill_amount_double\relax - \parindent \zeropoint - \relax} - -\unexpanded\def\spac_align_set_horizontal_right_tt % a plain command - {\tttf % brrr - \raggedstatus\plusthree - \attribute\alignstateattribute\plusthree - \leftskip \plusone\leftskip \s!plus\zeropoint\relax - \rightskip \plusone\rightskip\s!plus\spac_align_set_raggedness_right\relax - \spaceskip \zeropoint\relax - \xspaceskip \zeropoint\relax - \parfillskip\s_zero_plus_zero - %\parindent \parindent - \relax} - -\unexpanded\def\spac_align_set_horizontal_extra - {\xspaceskip\zeropoint\s!plus\v_spac_align_fill_amount_space\relax} - -\def\spac_align_flush_horizontal - {\ifcase\c_spac_align_state_horizontal - % 0 - \spac_align_set_horizontal_none - \or - % 1 center - \ifcase\c_spac_align_state_broad - \spac_align_set_horizontal_center - \or - \spac_align_set_horizontal_very_center - \or - \spac_align_set_horizontal_wide_center - \fi - \or - % 2 flush left - \ifcase\c_spac_align_state_broad - \spac_align_set_horizontal_right - \else - \spac_align_set_horizontal_very_right - \fi - \or - % 3 flush right - \ifcase\c_spac_align_state_broad - \spac_align_set_horizontal_left - \else - \spac_align_set_horizontal_very_left - \fi - \or - % 4 inner - \ifdoublesided - \signalinnerrealign - \fi - \rightorleftpageaction\spac_align_set_horizontal_right\spac_align_set_horizontal_left - \or - % 5 outer - \ifdoublesided - \signalouterrealign - \fi - \rightorleftpageaction\spac_align_set_horizontal_left\spac_align_set_horizontal_right - \or - % 6 oneliner - \ifcase\c_spac_align_state_broad - \spac_align_set_horizontal_right - \else - \spac_align_set_horizontal_very_right - \fi - \parfillskip\zeropoint - \or - % 7 centered last line - \spac_align_set_horizontal_centered_last_line - \or - \parfillskip\zeropoint - \fi} - -% Page spacing: - -\newconstant\c_spac_align_state_page - -\def\bottomalignlimit{\plusthree\lineheight} - -\newconstant\bottomraggednessmode % 0=ragged 1=normal/align 2=baseline - -\unexpanded\def\raggedbottom - {\bottomraggednessmode\zerocount - \settopskip} - -\unexpanded\def\alignbottom - {\bottomraggednessmode\plusone - \settopskip} - -\unexpanded\def\baselinebottom - {\bottomraggednessmode\plustwo - \settopskip} - -\let\normalbottom\alignbottom % downward compatible - -\unexpanded\def\setbottomalignmode#1% - {\bottomraggednessmode#1% - \settopskip} - -\def\spac_align_flush_page - {\ifcase\c_spac_align_state_page - % keep state - \or - \raggedbottom - \or - \alignbottom - \or - \baselinebottom - \fi} - -% Directions - -\newconstant\c_spac_align_state_direction - -\def\spac_align_flush_direction - {\ifcase\c_spac_align_state_direction - % keep state - \or - \lefttoright - \or - \righttoleft - \fi} - -% Interesting is that the non cached version is also pretty efficient -% and as we cache we seldom call that one now so one can debate the -% speedup. - -\newtoks\t_spac_align_collected - -\let\raggedcommand \relax -\let\updateraggedskips\relax - -\def\spac_align_add_to_cache - {\let\raggedbox\relax % why - % we inherit hyphenation and tolerance - \t_spac_align_collected \emptytoks - \c_spac_align_state_broad \zerocount - \c_spac_align_state_horizontal\zerocount - \c_spac_align_state_vertical \zerocount - \c_spac_align_state_direction \zerocount % what is default ? - \c_spac_align_state_page \zerocount - \ifcsname\??aligncommand\m_spac_align_asked\endcsname - \csname\??aligncommand\m_spac_align_asked\endcsname % not much gain in new method - \else - \rawprocesscommacommand[\m_spac_align_asked]\spac_align_collect - \fi - \normalexpanded{\t_spac_align_collected - {% \resetrealignsignal % can go as it is always set - \setfalse\raggedonelinerstate % bad - \the\t_spac_align_collected - \spac_align_flush_horizontal - \spac_align_flush_vertical - \spac_align_flush_direction - \spac_align_flush_page - }}% kept, nice for tracing - \edef\raggedcommand {\the\t_spac_align_collected }% - \edef\updateraggedskips{\spac_align_flush_horizontal}% - \global\expandafter\let\csname\??alignmentnormalcache\m_spac_align_asked\endcsname\raggedcommand - \global\expandafter\let\csname\??alignmentraggedcache\m_spac_align_asked\endcsname\updateraggedskips} - -\def\spac_align_collect#1% - {\csname\??aligncommand#1\endcsname} - -% The local (key driven) setter: - -\unexpanded\def\spac_align_prepare#1% deferred - {\edef\m_spac_align_asked{#1}% - \expandafter\let\expandafter\raggedcommand\csname\??alignmentnormalcache\m_spac_align_asked\endcsname - \ifx\raggedcommand\relax - \spac_align_add_to_cache - \else - \expandafter\let\expandafter\updateraggedskips\csname\??alignmentraggedcache\m_spac_align_asked\endcsname - \fi} - -\let\dosetraggedcommand\spac_align_prepare % sort of public - -% The regular align setter: - -\unexpanded\def\setupalign - {\dosingleempty\spac_align_setup} - -\def\spac_align_setup[#1]% immediate - {\edef\m_spac_align_asked{#1}% - \expandafter\let\expandafter\raggedcommand\csname\??alignmentnormalcache\m_spac_align_asked\endcsname - \ifx\raggedcommand\relax - \spac_align_add_to_cache - \else - \expandafter\let\expandafter\updateraggedskips\csname\??alignmentraggedcache\m_spac_align_asked\endcsname - \fi - \raggedcommand} - -\unexpanded\def\usealignparameter#1% faster local variant - {\edef\m_spac_align_asked{#1\c!align}% - \ifx\m_spac_align_asked\empty\else - \spac_align_use_indeed - \fi} - -\unexpanded\def\dousealignparameter#1% faster local variant - {\edef\m_spac_align_asked{#1}% - \ifx\m_spac_align_asked\empty\else - \spac_align_use_indeed - \fi} - -\def\spac_align_use_indeed - {\expandafter\let\expandafter\raggedcommand\csname\??alignmentnormalcache\m_spac_align_asked\endcsname - \ifx\raggedcommand\relax - \spac_align_add_to_cache - \else - \expandafter\let\expandafter\updateraggedskips\csname\??alignmentraggedcache\m_spac_align_asked\endcsname - \fi - \raggedcommand} - -% experiment - -\unexpanded\def\spac_align_use_later#1% - {\begingroup - \edef\m_spac_align_asked{#1}% - \expandafter\let\expandafter\raggedcommand\csname\??alignmentnormalcache\m_spac_align_asked\endcsname - \ifx\raggedcommand\relax - \spac_align_add_to_cache - \fi - \endgroup} - -\unexpanded\def\spac_align_use_now#1% - {\csname\??alignmentnormalcache#1\endcsname} - -% Maybe we need something different in columns. - -\unexpanded\def\installalign#1#2% beware: commands must be unexpandable! - {\ifcsname\??aligncommand#1\endcsname \else - \setvalue{\??aligncommand#1}{\t_spac_align_collected\expandafter{\the\t_spac_align_collected#2}}% - \fi} - -% beware, toks stuff and states are set at a differt time, so installalign is -% only for special options -% -% \setvalue{\??aligncommand whatever}% -% {\c_spac_align_state_horizontal\plushundred -% \t_spac_align_collected\expandafter{\the\t_spac_align_collected .....}} -% -% this one could deal with both -% -% \unexpanded\def\installalignoption#1#2% -% {\ifcsname\??aligncommand#1\endcsname \else -% \setvalue{\??aligncommand#1}% -% {\spac_align_set_horizontal_none -% \c_spac_align_state_horizontal\plushundred % don't set -% \t_spac_align_collected\expandafter{\the\t_spac_align_collected#2}}% -% \fi} -% -% \installalignoption -% {whatever} -% {} - -% The keywords: - -\letvalue{\??aligncommand\empty }\empty -\setvalue{\??aligncommand\v!broad }{\c_spac_align_state_broad \plusone } -\setvalue{\??aligncommand\v!wide }{\c_spac_align_state_broad \plustwo } - -\setvalue{\??aligncommand\v!bottom }{\c_spac_align_state_page \plusone } -\setvalue{\??aligncommand\v!height }{\c_spac_align_state_page \plustwo } -\setvalue{\??aligncommand\v!line }{\c_spac_align_state_page \plusthree - % this will become another keyword (undocumented anyway) - \t_spac_align_collected\expandafter{\the\t_spac_align_collected\settrue\raggedonelinerstate}} - -\setvalue{\??aligncommand\v!high }{\c_spac_align_state_vertical \plusthree} -\setvalue{\??aligncommand\v!low }{\c_spac_align_state_vertical \plustwo } -\setvalue{\??aligncommand\v!lohi }{\c_spac_align_state_vertical \plusone } - -\setvalue{\??aligncommand\v!flushright }{\c_spac_align_state_horizontal\plusthree} -\setvalue{\??aligncommand\v!flushleft }{\c_spac_align_state_horizontal\plustwo } -\setvalue{\??aligncommand\v!middle }{\c_spac_align_state_horizontal\plusone } -\setvalue{\??aligncommand\v!no }{\c_spac_align_state_horizontal\plustwo } -\setvalue{\??aligncommand\v!yes }{\c_spac_align_state_horizontal\zerocount} -\setvalue{\??aligncommand\v!width }{\c_spac_align_state_horizontal\zerocount} -\setvalue{\??aligncommand\v!normal }{\c_spac_align_state_horizontal\zerocount} -\setvalue{\??aligncommand\v!reset }{\c_spac_align_state_page \zerocount - \c_spac_align_state_horizontal\zerocount} -\setvalue{\??aligncommand\v!inner }{\c_spac_align_state_horizontal\plusfour } -\setvalue{\??aligncommand\v!outer }{\c_spac_align_state_horizontal\plusfive } -\setvalue{\??aligncommand\v!flushinner }{\c_spac_align_state_horizontal\plusfive } -\setvalue{\??aligncommand\v!flushouter }{\c_spac_align_state_horizontal\plusfour } -\setvalue{\??aligncommand\v!right }{\c_spac_align_state_horizontal\plustwo } -\setvalue{\??aligncommand\v!left }{\c_spac_align_state_horizontal\plusthree} -\setvalue{\??aligncommand\v!center }{\c_spac_align_state_horizontal\plusone - \c_spac_align_state_broad \plustwo } -\setvalue{\??aligncommand\v!disable }{\c_spac_align_state_horizontal\plussix } -\setvalue{\??aligncommand\v!last }{\c_spac_align_state_horizontal\plusseven} -\setvalue{\??aligncommand\v!paragraph }{\c_spac_align_state_horizontal\pluseight} - - -\setvalue{\??aligncommand\v!lefttoright }{\c_spac_align_state_direction \plusone } -\setvalue{\??aligncommand\v!righttoleft }{\c_spac_align_state_direction \plustwo } -\setvalue{\??aligncommand l2r}{\c_spac_align_state_direction \plusone } -\setvalue{\??aligncommand r2l}{\c_spac_align_state_direction \plustwo } - -\setvalue{\??aligncommand\v!table }{\c_spac_align_state_vertical \plusthree - \c_spac_align_state_broad \plusone - \c_spac_align_state_horizontal\plustwo } - -\setvalue{\??aligncommand\v!lesshyphenation}{\t_spac_align_collected\expandafter{\the\t_spac_align_collected\lesshyphens}} -\setvalue{\??aligncommand\v!morehyphenation}{\t_spac_align_collected\expandafter{\the\t_spac_align_collected\morehyphens}} - -\setvalue{\??aligncommand\v!hanging }{\t_spac_align_collected\expandafter{\the\t_spac_align_collected\font_protruding_enable }} -\setvalue{\??aligncommand\v!nothanging }{\t_spac_align_collected\expandafter{\the\t_spac_align_collected\font_protruding_disable}} -\setvalue{\??aligncommand\v!hz }{\t_spac_align_collected\expandafter{\the\t_spac_align_collected\font_expansion_enable }} -\setvalue{\??aligncommand\v!nohz }{\t_spac_align_collected\expandafter{\the\t_spac_align_collected\font_expansion_disable }} -%setvalue{\??aligncommand\v!spacing }{\t_spac_align_collected\expandafter{\the\t_spac_align_collected\enablespacehandling \enablekernhandling }} % not in mkiv -%setvalue{\??aligncommand\v!nospacing }{\t_spac_align_collected\expandafter{\the\t_spac_align_collected\disablespacehandling\disablekernhandling}} % not in mkiv -\setvalue{\??aligncommand\v!hyphenated }{\t_spac_align_collected\expandafter{\the\t_spac_align_collected\dohyphens}} -\setvalue{\??aligncommand\v!nothyphenated }{\t_spac_align_collected\expandafter{\the\t_spac_align_collected\nohyphens}} - -\setvalue{\??aligncommand\v!tolerant }{\t_spac_align_collected\expandafter{\the\t_spac_align_collected\spac_align_set_tolerant}} -\setvalue{\??aligncommand\v!verytolerant }{\t_spac_align_collected\expandafter{\the\t_spac_align_collected\spac_align_set_very_tolerant}} -\setvalue{\??aligncommand\v!stretch }{\t_spac_align_collected\expandafter{\the\t_spac_align_collected\spac_align_set_stretch}} -\setvalue{\??aligncommand\v!extremestretch }{\t_spac_align_collected\expandafter{\the\t_spac_align_collected\spac_align_set_extreme_stretch}} - -%D For Wolfgang: - -\newtoks \t_spac_every_swap_align - -\appendtoks - \setvalue{\??aligncommand\v!right}{\c_spac_align_state_horizontal\plusthree}% - \setvalue{\??aligncommand\v!left }{\c_spac_align_state_horizontal\plustwo }% -\to \t_spac_every_swap_align - -\unexpanded\def\enablereversealignment - {\the\t_spac_every_swap_align - \t_spac_every_swap_align\emptytoks} - -% Visible commands: - -\let\notragged \spac_align_set_horizontal_none -\let\raggedleft \spac_align_set_horizontal_left -\let\raggedcenter \spac_align_set_horizontal_center -\let\raggedright \spac_align_set_horizontal_right -\let\veryraggedleft \spac_align_set_horizontal_very_left -\let\veryraggedcenter\spac_align_set_horizontal_very_center -\let\veryraggedright \spac_align_set_horizontal_very_right -\let\raggedwidecenter\spac_align_set_horizontal_wide_center -\let\centeredlastline\spac_align_set_horizontal_centered_last_line -\let\ttraggedright \spac_align_set_horizontal_right_tt % a plain command - -\let\forgetragged \spac_align_set_horizontal_none - -\appendtoks - \spac_align_set_horizontal_none -\to \everyforgetall - -% Box commands. - -\unexpanded\def\ibox#1#2#3% - {\vbox\bgroup - \forgetall - \let\\=\endgraf - \ifdoublesided\signalinnerrealign\fi - \doifelserightpage\spac_align_set_horizontal_right\spac_align_set_horizontal_left - \let\next} - -\unexpanded\def\obox#1#2#3% - {\vbox\bgroup - \forgetall - \let\\=\endgraf - \ifdoublesided\signalouterrealign\fi - \doifelserightpage\c_spac_align_state_horizontal_left\spac_align_set_horizontal_right - \let\next} - -\let\raggedbox\relax - -\def\dosetraggedvbox#1% can be more keys .. how about caching here (but seldom used) - {\let\raggedbox\vbox - \processcommacommand[#1]\spac_align_set_ragged_vbox} - -\def\dosetraggedhbox#1% can be more keys .. how about caching here (but seldom used) - {\let\raggedbox\hbox - \processcommacommand[#1]\spac_align_set_ragged_hbox} - -\def\spac_align_set_ragged_vbox#1% - {\ifcsname\??alignvertical#1\endcsname - \csname\??alignvertical#1\endcsname - \quitcommalist - \fi} - -\def\spac_align_set_ragged_hbox#1% - {\ifcsname\??alignhorizontal#1\endcsname - \csname\??alignhorizontal#1\endcsname - \quitcommalist - \fi} - -% \def\usealignparametersethbox#1% -% {\edef\p_spac_align{#1\c!align}% -% \let\raggedbox\hbox -% \ifx\p_spac_align\empty \else -% \processcommacommand[\p_spac_align]\spac_align_set_ragged_hbox -% \fi} -% -% \def\usealignparametersetvbox#1% -% {\edef\p_spac_align{#1\c!align}% -% \let\raggedbox\vbox -% \ifx\p_spac_align\empty \else -% \processcommacommand[\p_spac_align]\spac_align_set_ragged_vbox -% \fi} - -\setvalue{\??alignvertical \v!left }{\let\raggedbox\lbox} -\setvalue{\??alignvertical \v!right }{\let\raggedbox\rbox} -\setvalue{\??alignvertical \v!middle }{\let\raggedbox\cbox} -\setvalue{\??alignvertical \v!inner }{\let\raggedbox\ibox} -\setvalue{\??alignvertical \v!outer }{\let\raggedbox\obox} -\setvalue{\??alignvertical \v!flushleft }{\let\raggedbox\rbox} -\setvalue{\??alignvertical \v!flushright}{\let\raggedbox\lbox} -\setvalue{\??alignvertical \v!center }{\let\raggedbox\cbox} -\setvalue{\??alignvertical \v!no }{\def\raggedbox{\vbox\bgroup\spac_align_set_horizontal_right\let\next=}]} - -% maybe \let's - -\setvalue{\??alignhorizontal\v!left }{\def\raggedbox{\doalignedline\v!left }} -\setvalue{\??alignhorizontal\v!right }{\def\raggedbox{\doalignedline\v!right }} -\setvalue{\??alignhorizontal\v!middle }{\def\raggedbox{\doalignedline\v!middle}} -\setvalue{\??alignhorizontal\v!inner }{\def\raggedbox{\doalignedline\v!inner }} -\setvalue{\??alignhorizontal\v!outer }{\def\raggedbox{\doalignedline\v!outer }} -\setvalue{\??alignhorizontal\v!flushleft }{\def\raggedbox{\doalignedline\v!right }} -\setvalue{\??alignhorizontal\v!flushright}{\def\raggedbox{\doalignedline\v!left }} -\setvalue{\??alignhorizontal\v!center }{\def\raggedbox{\doalignedline\v!middle}} - -% The next one can be in use so we keep it around but oen should -% be aware of possible interference. - -\unexpanded\def\setraggedskips#1#2#3#4#5#6#7% never change this name (todo: inline this one .. less tracingall) - {\unexpanded\def\updateraggedskips{\dosetraggedskips{#1}{#2}{#3}{#4}{#5}{#6}{#7}}% - \updateraggedskips} - -\def\dosetraggedskips#1#2#3#4#5#6#7% - {\raggedstatus #1\relax - \leftskip 1\leftskip \s!plus#2\relax - \rightskip 1\rightskip\s!plus#3\relax - \spaceskip #4\relax - \xspaceskip #5\relax - \parfillskip \zeropoint\s!plus#6\relax - \parindent #7\relax - \attribute\alignstateattribute\ifcase\raggedstatus\attributeunsetvalue\else\raggedstatus\fi} - -% older (context) names: - -\let\spaceamount \interwordspace -\let\emspaceamount\emwidth - -% tracing: - -\def\spac_show_par_data#1% - {\ifx#1\relax\else - \hbox{\string#1: \the#1}\endgraf - \expandafter\spac_show_par_data - \fi} - -\unexpanded\def\showpardata - {\edef\thepardata - {\hbox{font: \fontname\font}\endgraf - \spac_show_par_data - \interwordspace \interwordstretch \interwordshrink \emwidth \exheight \extraspace - \hsize \vsize - \leftskip \rightskip - \spaceskip \xspaceskip - \parindent \parfillskip - \hyphenpenalty \exhyphenpenalty - \displaywidowpenalty \widowpenalty \clubpenalty \brokenpenalty - \doublehyphendemerits \finalhyphendemerits \adjdemerits - \relax}% - \dontleavehmode - \begingroup - \inleftmargin{\vsmash{\infofont\framed[\c!align=\v!right]{\thepardata}}}% - \endgroup} - -\unexpanded\def\startshowpardata - {\begingroup - \showstruts - \tracingparagraphs\maxdimen - \appendtoksonce\showpardata\let\showpardata\relax\to\everypar} - -\unexpanded\def\stopshowpardata - {\endgraf - \endgroup} - -% Structure: - -\unexpanded\def\startalignment - {\begingroup - \setupalign} - -\unexpanded\def\stopalignment - {\par - \endgroup} - -\setnewconstant\alignstrutmode\plusone - -% see later for the real definition, which in the simple case is: - -\newtoks \everyleftofalignedline -\newtoks \everyrightofalignedline - -\unexpanded\def\shiftalignedline#1#2#3#4% left, right, inner, outer - {\rightorleftpageaction - {\everyleftofalignedline {\hskip\dimexpr#1+#3\relax}% - \everyrightofalignedline{\hskip\dimexpr#2+#4\relax}} - {\everyleftofalignedline {\hskip\dimexpr#1+#4\relax}% - \everyrightofalignedline{\hskip\dimexpr#2+#3\relax}}} - -\def\doalignline#1#2% \\ == newline - {\noindentation % was \noindent - \dontleavehmode % added in marrakesch at TUG 2006\begingroup - \begingroup - \setlocalhsize % new - \def\\{\egroup\par\doalignline{#1}{#2}\bgroup}% - \dowithnextbox - {\hbox to \localhsize - {\ifcase\alignstrutmode\or\strut\fi - \the\everyleftofalignedline - #1\unhbox\nextbox#2\relax - \the\everyrightofalignedline}% - \endgroup} - \hbox} - -% plain commands - -\ifdefined\line \else \def\line {\hbox to\hsize} \fi -\ifdefined\leftline \else \def\leftline #1{\line{#1\hss}} \fi -\ifdefined\rightline \else \def\rightline #1{\line{\hss#1}} \fi -\ifdefined\centerline \else \def\centerline#1{\line{\hss#1\hss}} \fi - -% direct commands - -\installcorenamespace{alignwrapper} - -\setuvalue{\??alignwrapper\v!left }{\doalignline\relax \hss } -\setuvalue{\??alignwrapper\v!middle}{\doalignline\hss \hss } -\setuvalue{\??alignwrapper\v!right }{\doalignline\hss \relax} -\setuvalue{\??alignwrapper\v!max }{\doalignline\relax \relax} - -\def\spac_align_wrapper_handle#1% - {\csname\??alignwrapper\ifcsname\??alignwrapper#1\endcsname#1\else\v!middle\fi\endcsname} - -\unexpanded\def\spac_align_wrapper_start[#1]% - {\spac_align_wrapper_handle{#1}% - \bgroup\ignorespaces} - -\unexpanded\def\spac_align_wrapper_stop - {\removeunwantedspaces\egroup} - -\unexpanded\def\startlinealignment - {\dosingleempty\spac_align_wrapper_start} - -\let\stoplinealignment\spac_align_wrapper_stop - -\unexpanded\def\startleftaligned {\spac_align_wrapper_start[\v!left ]} \let\stopleftaligned \spac_align_wrapper_stop -\unexpanded\def\startmiddlealigned{\spac_align_wrapper_start[\v!middle]} \let\stopmiddlealigned\spac_align_wrapper_stop -\unexpanded\def\startrightaligned {\spac_align_wrapper_start[\v!right ]} \let\stoprightaligned \spac_align_wrapper_stop -\unexpanded\def\startmaxaligned {\spac_align_wrapper_start[\v!max ]} \let\stopmaxaligned \spac_align_wrapper_stop - -\let\startmidaligned \startmiddlealigned \let\stopmidaligned \stopmiddlealigned -\let\startcenteraligned\startmiddlealigned \let\stopcenteraligned\stopmiddlealigned - -\unexpanded\def\leftaligned {\spac_align_wrapper_handle\v!left } -\unexpanded\def\middlealigned{\spac_align_wrapper_handle\v!middle} -\unexpanded\def\rightaligned {\spac_align_wrapper_handle\v!right } -\unexpanded\def\maxaligned {\spac_align_wrapper_handle\v!max } - -\let\midaligned \middlealigned -\let\centeraligned\middlealigned - -\installcorenamespace{alignline} - -\letvalue{\??alignline\v!left }\leftaligned -\letvalue{\??alignline\v!right }\rightaligned -\letvalue{\??alignline\v!middle }\midaligned -\letvalue{\??alignline\v!flushleft }\rightaligned % beware, makes no sense in locations / we will have a special locations handler -\letvalue{\??alignline\v!flushright}\leftaligned % beware, makes no sense in locations / we will have a special locations handler -\letvalue{\??alignline\v!center }\midaligned -\letvalue{\??alignline\v!max }\maxaligned - -\def\doalignedline#1{\resetrealignsignal\csname\??alignline#1\endcsname} - -%D Experimental (will be redone when floats are redone as it's real messy -%D now). It can also be made faster (if needed). - -\def\doxalignline#1#2#3#4#5#6% - {\noindentation % was \noindent - \dontleavehmode % added in marrakesch at TUG 2006\begingroup - \begingroup - \setlocalhsize - \def\\{\egroup\par\doxalignline#1#2#3#4#5#6\bgroup}% inefficient - \dowithnextbox - {\hbox to \localhsize - {#1\hskip\ifdone#2\else#3\fi#4% - \hbox to \localhsize - {\the\everyleftofalignedline - \ifcase\alignstrutmode\or\strut\fi - \ifdone#5\unhbox\nextbox#6\else#6\unhbox\nextbox#5\fi - \the\everyrightofalignedline}% - \hss}% - \endgroup} - \hbox} - -\def\doxcheckline % used for floats so multipass anyway - {\signalrightpage\doifelserightpage\donetrue\donefalse} - -\setvalue{\??alignline\v!inner }{\doxalignline\doxcheckline++\zeropoint \relax\hss } -\setvalue{\??alignline\v!outer }{\doxalignline\doxcheckline++\zeropoint \hss \relax} -\setvalue{\??alignline\v!innermargin}{\doxalignline\doxcheckline-+\innermargintotal\relax\hss } -\setvalue{\??alignline\v!outermargin}{\doxalignline\doxcheckline+-\outermargintotal\hss \relax} -\setvalue{\??alignline\v!inneredge }{\doxalignline\doxcheckline-+\inneredgetotal \relax\hss } -\setvalue{\??alignline\v!outeredge }{\doxalignline\doxcheckline+-\outeredgetotal \hss \relax} -\setvalue{\??alignline\v!backspace }{\doxalignline\doxcheckline-+\backspace \relax\hss } -\setvalue{\??alignline\v!cutspace }{\doxalignline\doxcheckline+-\cutspace \hss \relax} - -\setvalue{\??alignline\v!leftmargin }{\doxalignline\donefalse --\leftmargintotal \hss \relax} -\setvalue{\??alignline\v!rightmargin}{\doxalignline\donefalse ++\rightmargintotal\relax\hss } -\setvalue{\??alignline\v!leftedge }{\doxalignline\donefalse --\leftedgetotal \hss \relax} -\setvalue{\??alignline\v!rightedge }{\doxalignline\donefalse ++\rightedgetotal \relax\hss } - -\def\doalignedline#1% unchecked - {\csname\??alignline#1\endcsname} % no \resetrealignsignal here ? - -\def\alignedline#1#2% setting default - {\csname\??alignline\ifcsname\??alignline#1\endcsname#1\else#2\fi\endcsname} - -% beware: \wordright{whatever\kern-\rightskip} should work! -% so, no funny boxing here - -\unexpanded\def\wordright - {\dosingleempty\spac_word_right} - -\def\spac_word_right[#1]% - {% don't change - \groupedcommand - {\removeunwantedspaces - \hfill - \allowbreak % changed back from \hskip\zeropoint - \strut - \hfill - \quad % decent spacing - \hbox} - {\doifelse{#1}\v!right{\kern-\rightskip}{\doifsomething{#1}{\kern-#1}}% - \parfillskip\zeropoint - \finalhyphendemerits\zerocount % yes or no (see hyhenation/specialcases-001.tex) - \par}} - -% \dorecurse{5}{something} \wordright{--someone} \endgraf -% \dorecurse{6}{something} \wordright{--someone} \endgraf -% \dorecurse{7}{something} \wordright{--someone} \endgraf -% -% \dorecurse{5}{something} \wordright{--someone else entirely} \endgraf -% \dorecurse{6}{something} \wordright{--someone else entirely} \endgraf -% \dorecurse{7}{something} \wordright{--someone else entirely} \endgraf -% -% \wordright[\rightskip]{whatever} - -% Trick posted by WS on mailing list, generalized a bit. The bottom text only shows -% op when there is one line space available. We could add some extra space if needed. - -% \unexpanded\def\bottomword -% {\par -% \dowithnextbox -% {\leaders\box\nextbox\vfil\page} -% \vbox to \lineheight} -% -% \unexpanded\def\bottomword -% {\par -% \groupedcommand -% {\leaders -% \vbox to \lineheight\bgroup} -% {\egroup -% \vfil -% \page}} - -% \simplealignedbox{2cm}{right}{x} - -\installcorenamespace{alignsimple} -\installcorenamespace{alignsimplereverse} - -% todo: also handle \bgroup ... \egroup - -\unexpanded\def\spac_align_simple_left #1{{#1\hss}} -\unexpanded\def\spac_align_simple_right #1{{\hss#1}} -\unexpanded\def\spac_align_simple_middle#1{{\hss#1\hss}} - -\letvalue{\??alignsimple \v!right }\spac_align_simple_left -\letvalue{\??alignsimple \v!outer }\spac_align_simple_left % not managed! see linenumbers -\letvalue{\??alignsimple \v!flushleft }\spac_align_simple_left -\letvalue{\??alignsimple \v!left }\spac_align_simple_right -\letvalue{\??alignsimple \v!inner }\spac_align_simple_right % not managed! see linenumbers -\letvalue{\??alignsimple \v!flushright}\spac_align_simple_right -\letvalue{\??alignsimple \v!middle }\spac_align_simple_middle - -\letvalue{\??alignsimplereverse\v!right }\spac_align_simple_right -\letvalue{\??alignsimplereverse\v!outer }\spac_align_simple_right % not managed! see linenumbers -\letvalue{\??alignsimplereverse\v!flushleft }\spac_align_simple_right -\letvalue{\??alignsimplereverse\v!left }\spac_align_simple_left -\letvalue{\??alignsimplereverse\v!inner }\spac_align_simple_left % not managed! see linenumbers -\letvalue{\??alignsimplereverse\v!flushright}\spac_align_simple_left -\letvalue{\??alignsimplereverse\v!middle }\spac_align_simple_middle - -\unexpanded\def\simplealignedbox#1#2% - {\hbox \ifdim#1>\zeropoint to #1 - \csname\??alignsimple\ifcsname\??alignsimple#2\endcsname#2\else\v!right\fi\expandafter\endcsname - \fi} - -\unexpanded\def\simplealignedboxplus#1#2#3% - {\hbox #3 \ifdim#1>\zeropoint to #1 - \csname\??alignsimple\ifcsname\??alignsimple#2\endcsname#2\else\v!right\fi\expandafter\endcsname - \fi} - -\newconditional\alignsimplelefttoright \settrue\alignsimplelefttoright - -\unexpanded\def\simplereversealignedbox#1#2% - {\hbox \ifdim#1>\zeropoint to #1 - \csname\??alignsimplereverse\ifcsname\??alignsimplereverse#2\endcsname#2\else\v!left\fi\expandafter\endcsname - \fi} - -\unexpanded\def\simplereversealignedboxplus#1#2#3% - {\hbox #3 \ifdim#1>\zeropoint to #1 - \csname\??alignsimplereverse\ifcsname\??alignsimplereverse#2\endcsname#2\else\v!left\fi\expandafter\endcsname - \fi} - -% \installnamespace{alignsets} -% -% \setvalue{\??alignsets\v!right }#1#2{\let#1\relax\let#2\hss } -% \setvalue{\??alignsets\v!left }#1#2{\let#1\hss \let#2\relax} -% \setvalue{\??alignsets\v!flushright}#1#2{\let#1\hss \let#2\relax} -% \setvalue{\??alignsets\v!flushleft }#1#2{\let#1\relax\let#2\hss } -% \setvalue{\??alignsets\v!middle }#1#2{\let#1\hss \let#2\hss } -% \setvalue{\??alignsets\v!low }#1#2{\let#1\vss \let#2\relax} -% \setvalue{\??alignsets\v!high }#1#2{\let#1\relax\let#2\vss } -% \setvalue{\??alignsets\v!lohi }#1#2{\let#1\vss \let#2\vss } -% \setvalue{\??alignsets\s!unknown }#1#2{\let#1\relax\let#2\relax} -% -% \unexpanded\def\spac_align_set_ss#1% -% {\csname\??alignsetss\ifcsname\??alignsetss#1\endcsname#1\else\s!unknown\fi\endcsname} - -% Some obsolete (old) helpers: - -\def\dodefinehbox[#1][#2]% - {\setvalue{hbox#1}##1{\hbox to #2{\begstrut##1\endstrut\hss}}} - -\unexpanded\def\definehbox - {\dodoubleargument\dodefinehbox} - -\protect \endinput |