summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/context/base/mkxl/spac-ali.mkxl
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/tex/context/base/mkxl/spac-ali.mkxl')
-rw-r--r--Master/texmf-dist/tex/context/base/mkxl/spac-ali.mkxl1218
1 files changed, 1218 insertions, 0 deletions
diff --git a/Master/texmf-dist/tex/context/base/mkxl/spac-ali.mkxl b/Master/texmf-dist/tex/context/base/mkxl/spac-ali.mkxl
new file mode 100644
index 00000000000..78d09295db3
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/mkxl/spac-ali.mkxl
@@ -0,0 +1,1218 @@
+%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 {flush*}
+%D variants. Starting at the last day of 2011 both methods are merged into one and
+%D caching has been added, which makes switching twice as fast.
+
+\registerctxluafile{spac-ali}{autosuffix,optimize}
+
+% Used once so ... replace it or use if more frequently ...
+
+\installcorenamespace {alignswitch}
+
+% maybe \setconstantvalue or so
+
+\expandafter\integerdef\csname\??alignswitch\v!left \endcsname\zerocount
+\expandafter\integerdef\csname\??alignswitch\v!middle\endcsname\plusone
+\expandafter\integerdef\csname\??alignswitch\v!right \endcsname\plustwo
+
+\mutable\integerdef\alignmentswitch\zerocount
+
+\permanent\protected\def\setalignmentswitch#1%
+ {\integerdef\alignmentswitch\csname\??alignswitch\ifcsname\??alignswitch#1\endcsname#1\else\v!left\fi\endcsname}
+
+% till here
+
+\definesystemattribute[realign] [public] % might be combined with the next one
+\definesystemattribute[alignstate][public] % will make a single attributes for several states
+
+\appendtoks
+ \c_attr_realign \attributeunsetvalue
+ \c_attr_alignstate\attributeunsetvalue
+\to \everyforgetall
+
+\permanent\protected\def\signalinnerrealign{\clf_setrealign\plustwo}
+\permanent\protected\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}
+
+\immutable\def\??alignmentnormalcache{\ifodd\realpageno\??alignmentnormalcacheodd\else\??alignmentnormalcacheeven\fi}
+\immutable\def\??alignmentraggedcache{\ifodd\realpageno\??alignmentraggedcacheodd\else\??alignmentraggedcacheeven\fi}
+
+\newtoks\everyresetalign % todo
+
+% This will become a more advanced layout controller soon:
+
+\newconditional\layoutlefttoright \settrue\layoutlefttoright
+\newconditional\displaylefttoright \settrue\displaylefttoright
+\newconditional\inlinelefttoright \settrue\inlinelefttoright
+
+\permanent\protected\def\lefttoright
+ {\ifvmode
+ \spac_directions_lefttoright_vmode
+ \else
+ \spac_directions_lefttoright_hmode
+ \fi}
+
+\permanent\protected\def\righttoleft
+ {\ifvmode
+ \spac_directions_righttoleft_vmode
+ \else
+ \spac_directions_righttoleft_hmode
+ \fi}
+
+\protected\def\spac_directions_lefttoright_vmode
+ {\settrue\displaylefttoright
+ \settrue\inlinelefttoright
+ \textdirection\directionlefttoright
+ \pardirection \directionlefttoright}
+
+\protected\def\spac_directions_righttoleft_vmode
+ {\setfalse\displaylefttoright
+ \setfalse\inlinelefttoright
+ \textdirection\directionrighttoleft
+ \pardirection \directionrighttoleft}
+
+\protected\def\spac_directions_lefttoright_hmode
+ {\linedirection\directionlefttoright % linedir keeps subtype of skip
+ \settrue\inlinelefttoright}
+
+\protected\def\spac_directions_righttoleft_hmode
+ {\linedirection\directionrighttoleft % linedir keeps subtype of skip
+ \setfalse\inlinelefttoright}
+
+\permanent\protected\def\synchronizelayoutdirection
+ {\ifconditional\layoutlefttoright
+ \spac_directions_synchronize_lr
+ \else
+ \spac_directions_synchronize_rl
+ \fi}
+
+\permanent\protected\def\synchronizedisplaydirection
+ {\ifconditional\displaylefttoright
+ \spac_directions_synchronize_lr
+ \else
+ \spac_directions_synchronize_rl
+ \fi}
+
+\def\spac_directions_synchronize_lr
+ {\settrue\inlinelefttoright
+ \textdirection\directionlefttoright
+ \pardirection \directionlefttoright}
+
+\def\spac_directions_synchronize_rl
+ {\setfalse\inlinelefttoright
+ \textdirection\directionrighttoleft
+ \pardirection \directionrighttoleft}
+
+\permanent\protected\def\synchronizeinlinedirection
+ {% why not \linedirection here
+ \textdirection\ifconditional\inlinelefttoright\directionlefttoright\else\directionrighttoleft\fi}
+
+\permanent\protected\def\checkedlefttoright
+ {\ifvmode
+ \spac_directions_lefttoright_vmode
+ \else
+ \spac_directions_lefttoright_hmode_checked
+ \fi}
+
+\permanent\protected\def\checkedrighttoleft
+ {\ifvmode
+ \spac_directions_righttoleft_vmode
+ \else
+ \spac_directions_righttoleft_hmode_checked
+ \fi}
+
+\protected\def\spac_directions_lefttoright_hmode_checked
+ {\ifconditional\inlinelefttoright\else
+ \lefttoright
+ \fi}
+
+\protected\def\spac_directions_righttoleft_hmode_checked
+ {\ifconditional\inlinelefttoright
+ \righttoleft
+ \fi}
+
+\installcorenamespace{bidi}
+
+\letcsname\??bidi\v!left \endcsname\checkedlefttoright \letcsname\??bidi l2r\endcsname\checkedlefttoright
+\letcsname\??bidi\v!right\endcsname\checkedrighttoleft \letcsname\??bidi r2l\endcsname\checkedrighttoleft
+
+\permanent\protected\def\usebidiparameter#1%
+ {\begincsname\??bidi#1\c!bidi\endcsname}
+
+\permanent\protected\def\showdirections
+ {\dontleavehmode
+ \begingroup\infofont\textdirection\directionlefttoright[\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}
+
+\permanent\protected\def\righttolefthbox#1#{\reversehbox#1\bgroup\righttoleft\let\next} \aliased\let\rtlhbox\righttolefthbox
+\permanent\protected\def\lefttorighthbox#1#{\naturalhbox#1\bgroup\lefttoright\let\next} \aliased\let\ltrhbox\lefttorighthbox
+\permanent\protected\def\righttoleftvbox#1#{\reversevbox#1\bgroup\righttoleft\let\next} \aliased\let\rtlvbox\righttoleftvbox
+\permanent\protected\def\lefttorightvbox#1#{\naturalvbox#1\bgroup\lefttoright\let\next} \aliased\let\ltrvbox\lefttorightvbox
+\permanent\protected\def\righttoleftvtop#1#{\reversevtop#1\bgroup\righttoleft\let\next} \aliased\let\rtlvtop\righttoleftvtop
+\permanent\protected\def\lefttorightvtop#1#{\naturalvtop#1\bgroup\lefttoright\let\next} \aliased\let\ltrvtop\lefttorightvtop
+
+\permanent\protected\def\autodirhbox#1#{\hbox#1\bgroup\synchronizeinlinedirection\let\next}
+\permanent\protected\def\autodirvbox#1#{\vbox#1\bgroup\synchronizeinlinedirection\let\next} % maybe also pardir or maybe just a \vbox
+\permanent\protected\def\autodirvtop#1#{\vtop#1\bgroup\synchronizeinlinedirection\let\next} % maybe also pardir or maybe just a \vtop
+
+\permanent\protected\def\leftorrighthbox{\ifconditional\displaylefttoright\expandafter\lefttorighthbox\else\expandafter\righttolefthbox\fi}
+\permanent\protected\def\leftorrightvbox{\ifconditional\displaylefttoright\expandafter\lefttorightvbox\else\expandafter\righttoleftvbox\fi}
+\permanent\protected\def\leftorrightvtop{\ifconditional\displaylefttoright\expandafter\lefttorightvtop\else\expandafter\righttoleftvtop\fi}
+
+% 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{\ifzeropt\hsize\plussix\bodyfontsize\else.5\hsize\fi}
+
+\permanent\protected\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
+ \ifrelax\dohyphens % was 2.5 in old implementation using scratch registers
+ \hyphenpenalty\dimexpr2.8\hsize/\dimexpr#1\relax\relax % 50 in raggedright/raggedleft
+ %\else
+ % no need to do something as we're in \nohyphens
+ \fi}
+
+\protected\def\spac_align_set_tolerant
+ {\tolerance\c_spac_tolerance_normal}
+
+\protected\def\spac_align_set_very_tolerant
+ {\tolerance\c_spac_tolerance_extreme}
+
+\protected\def\spac_align_set_stretch
+ {\emergencystretch\bodyfontsize}
+
+\protected\def\spac_align_set_extreme_stretch
+ {\emergencystretch10\bodyfontsize}
+
+% Vertical
+
+\newconstant\c_spac_align_state_vertical
+
+\protected\def\spac_align_set_vertical_none
+ {\enforced\let\raggedtopcommand \relax
+ \enforced\let\raggedbottomcommand\relax}
+
+\protected\def\spac_align_set_vertical_lohi
+ {\enforced\let\raggedtopcommand \vfilll
+ \enforced\let\raggedbottomcommand\vfilll}
+
+\protected\def\spac_align_set_vertical_low
+ {\enforced\let\raggedtopcommand \vfilll
+ \enforced\let\raggedbottomcommand\relax}
+
+\protected\def\spac_align_set_vertical_high
+ {\enforced\let\raggedtopcommand \relax
+ \enforced\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
+\newconstant\c_spac_align_state_par_fill
+
+\def\v_spac_align_fill_amount {\plusone fil}
+\def\v_spac_align_fill_amount_hard {\plusone fill}
+\def\v_spac_align_fill_amount_extreme {\plustenthousand filll}
+\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
+
+\permanent\protected\def\spac_align_set_horizontal_none % should also relax \updateraggedskips
+ {\raggedstatus \zerocount
+ \c_attr_alignstate\attributeunsetvalue
+ \leftskip \plusone\leftskip
+ \rightskip \plusone\rightskip
+ \spaceskip \zeropoint
+ \xspaceskip \zeropoint
+ \parfillleftskip \zeropoint
+ \parfillskip \s_zero_plus_one_fil % new
+ \setfalse \raggedonelinerstate % now here
+ \enforced\aliased\let\updateraggedskips\relax} % no need for adaption
+
+\permanent\protected\def\spac_align_set_horizontal_left
+ {\setraggedness \spac_align_set_raggedness_left
+ \raggedstatus \plusone
+ \c_attr_alignstate\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
+ \parfillleftskip \zeropoint
+ \parfillskip \s_zero_plus_zero
+ \parindent \zeropoint
+ \relax}
+
+\permanent\protected\def\spac_align_set_horizontal_center
+ {\setraggedness \spac_align_set_raggedness_middle
+ \raggedstatus \plustwo
+ \c_attr_alignstate\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
+ \parfillleftskip \zeropoint
+ \parfillskip \s_zero_plus_zero
+ \parindent \zeropoint
+ \relax}
+
+\permanent\protected\def\spac_align_set_horizontal_right
+ {\setraggedness \spac_align_set_raggedness_right
+ \raggedstatus \plusthree
+ \c_attr_alignstate\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
+ \parfillleftskip \zeropoint
+ \parfillskip \s_zero_plus_one_fil
+ %\parindent \parindent
+ \relax}
+
+\permanent\protected\def\spac_align_set_horizontal_very_left
+ {\raggedstatus \plusone
+ \c_attr_alignstate\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
+ \parfillleftskip \zeropoint
+ \parfillskip \s_zero_plus_zero
+ \parindent \zeropoint
+ \relax}
+
+\permanent\protected\def\spac_align_set_horizontal_very_center
+ {\raggedstatus \plustwo
+ \c_attr_alignstate\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
+ \parfillleftskip \zeropoint
+ \parfillskip \s_zero_plus_zero
+ \parindent \zeropoint
+ \relax}
+
+\permanent\protected\def\spac_align_set_horizontal_very_right
+ {\raggedstatus \plusthree
+ \c_attr_alignstate\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
+ \parfillleftskip \zeropoint
+ \parfillskip \s_zero_plus_zero
+ %\parindent \parindent
+ \relax}
+
+\permanent\protected\def\spac_align_set_horizontal_wide_center
+ {\setraggedness \spac_align_set_raggedness_middle
+ \raggedstatus \plustwo
+ \c_attr_alignstate\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
+ \parfillleftskip \zeropoint
+ \parfillskip \s_zero_plus_zero
+ \parindent \zeropoint
+ \relax}
+
+\permanent\protected\def\spac_align_set_horizontal_centered_last_line
+ {\raggedstatus \zerocount
+ \c_attr_alignstate\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
+ \parfillleftskip \zeropoint
+ \parfillskip \zeropoint\s!plus\v_spac_align_fill_amount_double\relax
+ \parindent \zeropoint
+ \relax}
+
+\permanent\protected\def\spac_align_set_horizontal_flushedright_last_line
+ {\raggedstatus \zerocount
+ \c_attr_alignstate\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
+ \parfillleftskip \zeropoint\s!plus\v_spac_align_fill_amount_extreme\relax
+ \parindent \zeropoint
+ \relax}
+
+\permanent\protected\def\spac_align_set_horizontal_right_tt % a plain command
+ {\tttf % brrr
+ \raggedstatus \plusthree
+ \c_attr_alignstate\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
+ \parfillleftskip \zeropoint
+ \parfillskip \s_zero_plus_zero
+ %\parindent \parindent
+ \relax}
+
+\permanent\protected\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
+ % 8 right aligned last line
+ \spac_align_set_horizontal_flushedright_last_line
+ \or
+ % 9 paragraph
+ \parfillskip\zeropoint
+ \fi
+ \relax}
+
+% Page spacing:
+
+\newconstant\c_spac_align_state_page
+
+\mutable\def\bottomalignlimit{\plusthree\lineheight}
+
+\newconstant\bottomraggednessmode % 0=ragged 1=normal/align 2=baseline
+
+\permanent\protected\def\raggedbottom
+ {\bottomraggednessmode\zerocount
+ \settopskip}
+
+\permanent\protected\def\alignbottom
+ {\bottomraggednessmode\plusone
+ \settopskip}
+
+\permanent\protected\def\baselinebottom
+ {\bottomraggednessmode\plustwo
+ \settopskip}
+
+\aliased\let\normalbottom\alignbottom % downward compatible
+
+\permanent\protected\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
+
+\aliased\let\raggedcommand \relax
+\aliased\let\updateraggedskips\relax
+
+\def\spac_align_add_to_cache
+ {\enforced\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
+ \c_spac_align_state_par_fill \zerocount
+ \ifcsname\??aligncommand\m_spac_align_asked\endcsname
+ \lastnamedcs
+ \else
+ \rawprocesscommacommand[\m_spac_align_asked]\spac_align_collect
+ \fi
+ \normalexpanded{\t_spac_align_collected
+ {\setfalse\raggedonelinerstate % bad
+ \the\t_spac_align_collected
+ \spac_align_flush_horizontal
+ \spac_align_flush_vertical
+ \spac_align_flush_direction
+ \spac_align_flush_page
+ \spac_align_flush_parfill
+ }}% kept, nice for tracing
+ \enforced\permanent\protected\edef\raggedcommand {\the\t_spac_align_collected }%
+ \enforced\permanent\protected\edef\updateraggedskips{\spac_align_flush_horizontal}%
+ \enforced\aliased\gletcsname\??alignmentnormalcache\m_spac_align_asked\endcsname\raggedcommand
+ \enforced\aliased\gletcsname\??alignmentraggedcache\m_spac_align_asked\endcsname\updateraggedskips}
+
+\def\spac_align_collect#1%
+ {\csname\??aligncommand#1\endcsname}
+
+% The local (key driven) setter:
+
+\permanent\protected\def\spac_align_prepare#1% deferred
+ {\edef\m_spac_align_asked{#1}%
+ \enforced\aliased\expandafter\let\expandafter\raggedcommand\csname\??alignmentnormalcache\m_spac_align_asked\endcsname
+ \ifrelax\raggedcommand
+ \spac_align_add_to_cache
+ \else
+ \enforced\aliased\expandafter\let\expandafter\updateraggedskips\csname\??alignmentraggedcache\m_spac_align_asked\endcsname
+ \fi}
+
+\aliased\let\dosetraggedcommand\spac_align_prepare % sort of public
+
+% The regular align setter:
+
+\permanent\tolerant\protected\def\setupalign[#1]% immediate
+ {\edef\m_spac_align_asked{#1}%
+ \enforced\expandafter\let\expandafter\raggedcommand\csname\??alignmentnormalcache\m_spac_align_asked\endcsname
+ \ifrelax\raggedcommand
+ \spac_align_add_to_cache
+ \else
+ \enforced\aliased\expandafter\let\expandafter\updateraggedskips\csname\??alignmentraggedcache\m_spac_align_asked\endcsname
+ \fi
+ \raggedcommand}
+
+\permanent\protected\def\usealignparameter#1% faster local variant
+ {\edef\m_spac_align_asked{#1\c!align}%
+ \ifempty\m_spac_align_asked\else
+ \spac_align_use_indeed
+ \fi}
+
+\permanent\protected\def\dousealignparameter#1% faster local variant
+ {\edef\m_spac_align_asked{#1}%
+ \ifempty\m_spac_align_asked\else
+ \spac_align_use_indeed
+ \fi}
+
+\def\spac_align_use_indeed
+ {\enforced\aliased\expandafter\let\expandafter\raggedcommand\csname\??alignmentnormalcache\m_spac_align_asked\endcsname
+ \ifrelax\raggedcommand
+ \spac_align_add_to_cache
+ \else
+ \enforced\aliased\expandafter\let\expandafter\updateraggedskips\csname\??alignmentraggedcache\m_spac_align_asked\endcsname
+ \fi
+ \raggedcommand}
+
+% experiment
+
+\protected\def\spac_align_use_later#1%
+ {\begingroup
+ \edef\m_spac_align_asked{#1}%
+ \enforced\aliased\expandafter\let\expandafter\raggedcommand\csname\??alignmentnormalcache\m_spac_align_asked\endcsname
+ \ifrelax\raggedcommand
+ \spac_align_add_to_cache
+ \fi
+ \endgroup}
+
+\protected\def\spac_align_use_now#1%
+ {\csname\??alignmentnormalcache#1\endcsname}
+
+% Maybe we need something different in columns.
+
+\permanent\protected\def\installalign#1#2% beware: commands must be unexpandable!
+ {\ifcsname\??aligncommand#1\endcsname \else
+ \defcsname\??aligncommand#1\endcsname{\toksapp\t_spac_align_collected{#2}}%
+ \fi}
+
+% The keywords:
+
+\letcsname\??aligncommand\empty \endcsname\empty
+\defcsname\??aligncommand\v!broad \endcsname{\c_spac_align_state_broad \plusone }
+\defcsname\??aligncommand\v!wide \endcsname{\c_spac_align_state_broad \plustwo }
+
+\defcsname\??aligncommand\v!bottom \endcsname{\c_spac_align_state_page \plusone }
+\defcsname\??aligncommand\v!height \endcsname{\c_spac_align_state_page \plustwo }
+\defcsname\??aligncommand\v!line \endcsname{\c_spac_align_state_page \plusthree
+ % this will become another keyword (undocumented anyway)
+ \toksapp\t_spac_align_collected{\settrue\raggedonelinerstate}}
+
+\defcsname\??aligncommand\v!high \endcsname{\c_spac_align_state_vertical \plusthree}
+\defcsname\??aligncommand\v!low \endcsname{\c_spac_align_state_vertical \plustwo }
+\defcsname\??aligncommand\v!lohi \endcsname{\c_spac_align_state_vertical \plusone }
+
+\defcsname\??aligncommand\v!flushright \endcsname{\c_spac_align_state_horizontal\plusthree}
+\defcsname\??aligncommand\v!flushleft \endcsname{\c_spac_align_state_horizontal\plustwo }
+\defcsname\??aligncommand\v!middle \endcsname{\c_spac_align_state_horizontal\plusone }
+\defcsname\??aligncommand\v!no \endcsname{\c_spac_align_state_horizontal\plustwo }
+\defcsname\??aligncommand\v!yes \endcsname{\c_spac_align_state_horizontal\zerocount}
+\defcsname\??aligncommand\v!width \endcsname{\c_spac_align_state_horizontal\zerocount}
+\defcsname\??aligncommand\v!normal \endcsname{\c_spac_align_state_horizontal\zerocount}
+\defcsname\??aligncommand\v!reset \endcsname{\c_spac_align_state_page \zerocount
+ \c_spac_align_state_horizontal\zerocount}
+\defcsname\??aligncommand\v!inner \endcsname{\c_spac_align_state_horizontal\plusfour }
+\defcsname\??aligncommand\v!outer \endcsname{\c_spac_align_state_horizontal\plusfive }
+\defcsname\??aligncommand\v!flushinner \endcsname{\c_spac_align_state_horizontal\plusfour }
+\defcsname\??aligncommand\v!flushouter \endcsname{\c_spac_align_state_horizontal\plusfive }
+\defcsname\??aligncommand\v!right \endcsname{\c_spac_align_state_horizontal\plustwo }
+\defcsname\??aligncommand\v!left \endcsname{\c_spac_align_state_horizontal\plusthree}
+\defcsname\??aligncommand\v!center \endcsname{\c_spac_align_state_horizontal\plusone
+ \c_spac_align_state_broad \plustwo }
+\defcsname\??aligncommand\v!disable \endcsname{\c_spac_align_state_horizontal\plussix }
+\defcsname\??aligncommand\v!last \endcsname{\c_spac_align_state_horizontal\plusseven}
+\defcsname\??aligncommand\v!end \endcsname{\c_spac_align_state_horizontal\pluseight}
+\defcsname\??aligncommand\v!paragraph \endcsname{\c_spac_align_state_horizontal\plusnine}
+
+\defcsname\??aligncommand\v!lefttoright \endcsname{\c_spac_align_state_direction \plusone }
+\defcsname\??aligncommand\v!righttoleft \endcsname{\c_spac_align_state_direction \plustwo }
+\defcsname\??aligncommand l2r\endcsname{\c_spac_align_state_direction \plusone }
+\defcsname\??aligncommand r2l\endcsname{\c_spac_align_state_direction \plustwo }
+
+\defcsname\??aligncommand\v!table \endcsname{\c_spac_align_state_vertical \plusthree
+ \c_spac_align_state_broad \plusone
+ \c_spac_align_state_horizontal\plustwo }
+
+\defcsname\??aligncommand\v!lesshyphenation\endcsname{\toksapp\t_spac_align_collected{\lesshyphens}}
+\defcsname\??aligncommand\v!morehyphenation\endcsname{\toksapp\t_spac_align_collected{\morehyphens}}
+
+\defcsname\??aligncommand\v!hanging \endcsname{\toksapp\t_spac_align_collected{\font_protruding_enable }}
+\defcsname\??aligncommand\v!hangingboth \endcsname{\toksapp\t_spac_align_collected{\font_protruding_enable_b}}
+\defcsname\??aligncommand\v!nothanging \endcsname{\toksapp\t_spac_align_collected{\font_protruding_disable}}
+\defcsname\??aligncommand\v!hz \endcsname{\toksapp\t_spac_align_collected{\font_expansion_enable }}
+\defcsname\??aligncommand\v!fullhz \endcsname{\toksapp\t_spac_align_collected{\font_expansion_enable_k}}
+\defcsname\??aligncommand\v!nohz \endcsname{\toksapp\t_spac_align_collected{\font_expansion_disable }}
+%defcsname\??aligncommand\v!spacing \endcsname{\toksapp\t_spac_align_collected{\normalspacing\zerocount}} % not yet
+%defcsname\??aligncommand\v!nospacing \endcsname{\toksapp\t_spac_align_collected{\normalspacing\plusone}} % not yet
+\defcsname\??aligncommand\v!hyphenated \endcsname{\toksapp\t_spac_align_collected{\dohyphens}}
+\defcsname\??aligncommand\v!nothyphenated \endcsname{\toksapp\t_spac_align_collected{\nohyphens}}
+
+\defcsname\??aligncommand\v!tolerant \endcsname{\toksapp\t_spac_align_collected{\spac_align_set_tolerant}}
+\defcsname\??aligncommand\v!verytolerant \endcsname{\toksapp\t_spac_align_collected{\spac_align_set_very_tolerant}}
+\defcsname\??aligncommand\v!stretch \endcsname{\toksapp\t_spac_align_collected{\spac_align_set_stretch}}
+\defcsname\??aligncommand\v!extremestretch \endcsname{\toksapp\t_spac_align_collected{\spac_align_set_extreme_stretch}}
+
+\defcsname\??aligncommand \v!final\endcsname{\c_spac_align_state_par_fill\plusone}
+\defcsname\??aligncommand1*\v!final\endcsname{\c_spac_align_state_par_fill\plusone}
+\defcsname\??aligncommand2*\v!final\endcsname{\c_spac_align_state_par_fill\plustwo} % hardcoded multiplier
+\defcsname\??aligncommand3*\v!final\endcsname{\c_spac_align_state_par_fill\plusthree}
+\defcsname\??aligncommand4*\v!final\endcsname{\c_spac_align_state_par_fill\plusfour}
+
+% a one shot (only usefull in e.g. framed, also needs tolerance and stretch)
+
+\defcsname\??aligncommand \v!more\endcsname{\toksapp\t_spac_align_collected{\looseness\plusone}}
+\defcsname\??aligncommand1*\v!more\endcsname{\toksapp\t_spac_align_collected{\looseness\plusone}}
+\defcsname\??aligncommand2*\v!more\endcsname{\toksapp\t_spac_align_collected{\looseness\plustwo}}
+
+%defcsname\??aligncommand ...\endcsname{\toksapp\t_spac_align_collected{\nopenalties}}
+%defcsname\??aligncommand ...\endcsname{\toksapp\t_spac_align_collected{\setdefaultpenalties}}
+
+% experiment
+
+\defcsname\??aligncommand\v!always\endcsname{\toksapp\t_spac_align_collected{\bitwiseflip\hyphenationmode\forcecheckhyphenationmodecode}}
+
+\definehspace [\v!final] [\emspaceamount]
+
+\def\spac_align_flush_parfill
+ {\ifcase\c_spac_align_state_par_fill\else
+ \spac_align_flush_parfill_indeed{\number\c_spac_align_state_par_fill}%
+ \fi}
+
+\protected\def\spac_align_flush_parfill_indeed#1%
+ {\parfillskip
+ #1\directhspaceamount\v!final
+ % plus \dimexpr\availablehsize-#1\directhspaceamount\v!final\relax
+ plus 1fill
+ \relax}
+
+%D For Wolfgang:
+
+\newtoks \t_spac_every_swap_align
+
+\appendtoks
+ \defcsname\??aligncommand\v!right\endcsname{\c_spac_align_state_horizontal\plusthree}%
+ \defcsname\??aligncommand\v!left \endcsname{\c_spac_align_state_horizontal\plustwo }%
+\to \t_spac_every_swap_align
+
+\permanent\protected\def\enablereversealignment
+ {\the\t_spac_every_swap_align
+ \t_spac_every_swap_align\emptytoks}
+
+% Visible commands:
+
+\aliased\let\notragged \spac_align_set_horizontal_none
+\aliased\let\raggedleft \spac_align_set_horizontal_left
+\aliased\let\raggedcenter \spac_align_set_horizontal_center
+\aliased\let\raggedright \spac_align_set_horizontal_right
+\aliased\let\veryraggedleft \spac_align_set_horizontal_very_left
+\aliased\let\veryraggedcenter \spac_align_set_horizontal_very_center
+\aliased\let\veryraggedright \spac_align_set_horizontal_very_right
+\aliased\let\raggedwidecenter \spac_align_set_horizontal_wide_center
+\aliased\let\centeredlastline \spac_align_set_horizontal_centered_last_line
+\aliased\let\flushedrightlastline\spac_align_set_horizontal_flushedright_last_line
+\aliased\let\ttraggedright \spac_align_set_horizontal_right_tt % a plain command
+\aliased\let\forgetragged \spac_align_set_horizontal_none
+
+\appendtoks
+ \spac_align_set_horizontal_none
+\to \everyforgetall
+
+% Box commands.
+
+\permanent\protected\def\ibox
+ {\vbox\bgroup
+ \forgetall
+ \enforced\let\\\endgraf
+ \ifdoublesided\signalinnerrealign\fi
+ \doifelserightpage\spac_align_set_horizontal_right\spac_align_set_horizontal_left
+ \let\next}
+
+\permanent\protected\def\obox
+ {\vbox\bgroup
+ \forgetall
+ \enforced\let\\\endgraf
+ \ifdoublesided\signalouterrealign\fi
+ \doifelserightpage\spac_align_set_horizontal_left\spac_align_set_horizontal_right
+ \let\next}
+
+\let\raggedbox\relax
+
+\permanent\protected\def\dosetraggedvbox#1% can be more keys .. how about caching here (but seldom used)
+ {\enforced\let\raggedbox\vbox
+ \processcommacommand[#1]\spac_align_set_ragged_vbox}
+
+\permanent\protected\def\dosetraggedhbox#1% can be more keys .. how about caching here (but seldom used)
+ {\enforced\let\raggedbox\hbox
+ \processcommacommand[#1]\spac_align_set_ragged_hbox}
+
+\def\spac_align_set_ragged_vbox#1%
+ {\ifcsname\??alignvertical#1\endcsname
+ \lastnamedcs
+ \quitcommalist
+ \fi}
+
+\def\spac_align_set_ragged_hbox#1%
+ {\ifcsname\??alignhorizontal#1\endcsname
+ \lastnamedcs
+ \quitcommalist
+ \fi}
+
+\permanent\protected\def\spac_align_vertical_left {\lbox}
+\permanent\protected\def\spac_align_vertical_right {\rbox}
+\permanent\protected\def\spac_align_vertical_middle {\cbox}
+\permanent\protected\def\spac_align_vertical_inner {\ibox}
+\permanent\protected\def\spac_align_vertical_outer {\obox}
+\permanent\protected\def\spac_align_vertical_flushleft {\rbox}
+\permanent\protected\def\spac_align_vertical_flushright{\lbox}
+\permanent\protected\def\spac_align_vertical_center {\cbox}
+\permanent\protected\def\spac_align_vertical_no {\vbox\bgroup\spac_align_set_horizontal_right\let\next=}
+
+\permanent\protected\def\spac_align_horizontal_left {\doalignedline\v!left}
+\permanent\protected\def\spac_align_horizontal_right {\doalignedline\v!right}
+\permanent\protected\def\spac_align_horizontal_middle {\doalignedline\v!middle}
+\permanent\protected\def\spac_align_horizontal_inner {\doalignedline\v!inner}
+\permanent\protected\def\spac_align_horizontal_outer {\doalignedline\v!outer}
+\permanent\protected\def\spac_align_horizontal_flushleft {\doalignedline\v!right}
+\permanent\protected\def\spac_align_horizontal_flushright{\doalignedline\v!left}
+\permanent\protected\def\spac_align_horizontal_center {\doalignedline\v!middle}
+
+\defcsname\??alignvertical \v!left \endcsname{\enforced\let\raggedbox\spac_align_vertical_left}
+\defcsname\??alignvertical \v!right \endcsname{\enforced\let\raggedbox\spac_align_vertical_right}
+\defcsname\??alignvertical \v!middle \endcsname{\enforced\let\raggedbox\spac_align_vertical_middle}
+\defcsname\??alignvertical \v!inner \endcsname{\enforced\let\raggedbox\spac_align_vertical_inner}
+\defcsname\??alignvertical \v!outer \endcsname{\enforced\let\raggedbox\spac_align_vertical_outer}
+\defcsname\??alignvertical \v!flushleft \endcsname{\enforced\let\raggedbox\spac_align_vertical_flushleft }
+\defcsname\??alignvertical \v!flushright\endcsname{\enforced\let\raggedbox\spac_align_vertical_flushright}
+\defcsname\??alignvertical \v!center \endcsname{\enforced\let\raggedbox\spac_align_vertical_center}
+\defcsname\??alignvertical \v!no \endcsname{\enforced\let\raggedbox\spac_align_vertical_no}
+
+\defcsname\??alignhorizontal\v!left \endcsname{\enforced\let\raggedbox\spac_align_horizontal_left}
+\defcsname\??alignhorizontal\v!right \endcsname{\enforced\let\raggedbox\spac_align_horizontal_right}
+\defcsname\??alignhorizontal\v!middle \endcsname{\enforced\let\raggedbox\spac_align_horizontal_middle}
+\defcsname\??alignhorizontal\v!inner \endcsname{\enforced\let\raggedbox\spac_align_horizontal_inner}
+\defcsname\??alignhorizontal\v!outer \endcsname{\enforced\let\raggedbox\spac_align_horizontal_outer}
+\defcsname\??alignhorizontal\v!flushleft \endcsname{\enforced\let\raggedbox\spac_align_horizontal_flushleft}
+\defcsname\??alignhorizontal\v!flushright\endcsname{\enforced\let\raggedbox\spac_align_horizontal_flushright}
+\defcsname\??alignhorizontal\v!center \endcsname{\enforced\let\raggedbox\spac_align_horizontal_center}
+
+% The next one can be in use so we keep it around but oen should
+% be aware of possible interference.
+
+\permanent\protected\def\setraggedskips#1#2#3#4#5#6#7% never change this name (todo: inline this one .. less tracingall)
+ {\enforced\permanent\protected\def\updateraggedskips{\dosetraggedskips{#1}{#2}{#3}{#4}{#5}{#6}{#7}}%
+ \updateraggedskips}
+
+\permanent\protected\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
+ \c_attr_alignstate\ifcase\raggedstatus\attributeunsetvalue\else\raggedstatus\fi}
+
+% older (context) names:
+
+\aliased\let\spaceamount \interwordspace
+\aliased\let\emspaceamount\emwidth
+
+% tracing:
+
+\def\spac_show_par_data#1%
+ {\ifrelax#1\else
+ \hbox{\string#1: \the#1}\endgraf
+ \expandafter\spac_show_par_data
+ \fi}
+
+\permanent\protected\def\showpardata
+ {\normalexpanded{\dontleavehmode\inleftmargin{\vsmash{\infofont\framed[\c!align=\v!right]{%
+ \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 \automatichyphenpenalty \explicithyphenpenalty
+ \displaywidowpenalty \widowpenalty \clubpenalty \brokenpenalty
+ \doublehyphendemerits \finalhyphendemerits \adjdemerits
+ \relax}}}}}
+
+\permanent\protected\def\startshowpardata
+ {\begingroup
+ \showstruts
+ \tracingparagraphs\maxdimen
+ \appendtoksonce\showpardata\to\everypar}
+
+\permanent\protected\def\stopshowpardata
+ {\endgraf
+ \endgroup}
+
+% Structure:
+
+\protected\def\startalignment
+ {\par
+ \begingroup
+ \setupalign}
+
+\protected\def\stopalignment
+ {\par
+ \endgroup}
+
+\setnewconstant\alignstrutmode\plusone
+
+% see later for the real definition, which in the simple case is:
+
+\newtoks \everyleftofalignedline
+\newtoks \everyrightofalignedline
+
+\permanent\protected\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}}}
+
+\permanent\protected\def\doalignline#1#2% \\ == newline
+ {\noindentation % was \noindent
+ \dontleavehmode % added in marrakesch at TUG 2006\begingroup
+ \begingroup
+ \setlocalhsize % new
+ \enforced\permanent\protected\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 \permanent\protected\def\line {\hbox to\hsize} \fi
+\ifdefined\leftline \else \permanent\protected\def\leftline #1{\line{#1\hss}} \fi
+\ifdefined\rightline \else \permanent\protected\def\rightline #1{\line{\hss#1}} \fi
+\ifdefined\centerline \else \permanent\protected\def\centerline#1{\line{\hss#1\hss}} \fi
+
+% direct commands
+
+\installcorenamespace{alignwrapper}
+
+\protected\defcsname\??alignwrapper\v!left \endcsname{\doalignline\relax \hss }
+\protected\defcsname\??alignwrapper\v!middle\endcsname{\doalignline\hss \hss }
+\protected\defcsname\??alignwrapper\v!right \endcsname{\doalignline\hss \relax}
+\protected\defcsname\??alignwrapper\v!max \endcsname{\doalignline\relax \relax}
+
+\def\spac_align_wrapper_middle{\doalignline\hss\hss}
+
+\def\spac_align_wrapper_handle#1%
+ {\ifcsname\??alignwrapper#1\endcsname\expandafter\lastnamedcs\else\expandafter\spac_align_wrapper_middle\fi}
+
+\permanent\tolerant\protected\def\startlinealignment[#1]%
+ {\spac_align_wrapper_handle{#1}%
+ \bgroup\ignorespaces}
+
+\protected\def\spac_align_wrapper_stop
+ {\removeunwantedspaces\egroup}
+
+\permanent\let\stoplinealignment\spac_align_wrapper_stop
+
+\permanent\protected\def\startleftaligned {\startlinealignment[\v!left ]} \permanent\let\stopleftaligned \spac_align_wrapper_stop
+\permanent\protected\def\startmiddlealigned{\startlinealignment[\v!middle]} \permanent\let\stopmiddlealigned\spac_align_wrapper_stop
+\permanent\protected\def\startrightaligned {\startlinealignment[\v!right ]} \permanent\let\stoprightaligned \spac_align_wrapper_stop
+\permanent\protected\def\startmaxaligned {\startlinealignment[\v!max ]} \permanent\let\stopmaxaligned \spac_align_wrapper_stop
+
+\aliased\let\startmidaligned \startmiddlealigned \aliased\let\stopmidaligned \stopmiddlealigned
+\aliased\let\startcenteraligned\startmiddlealigned \aliased\let\stopcenteraligned\stopmiddlealigned
+
+\permanent\protected\def\leftaligned {\spac_align_wrapper_handle\v!left }
+\permanent\protected\def\middlealigned{\spac_align_wrapper_handle\v!middle}
+\permanent\protected\def\rightaligned {\spac_align_wrapper_handle\v!right }
+\permanent\protected\def\maxaligned {\spac_align_wrapper_handle\v!max }
+
+\aliased\let\midaligned \middlealigned
+\aliased\let\centeraligned\middlealigned
+
+\installcorenamespace{alignline}
+
+\letcsname\??alignline\v!left \endcsname\leftaligned
+\letcsname\??alignline\v!right \endcsname\rightaligned
+\letcsname\??alignline\v!middle \endcsname\midaligned
+\letcsname\??alignline\v!flushleft \endcsname\rightaligned % beware, makes no sense in locations / we will have a special locations handler
+\letcsname\??alignline\v!flushright\endcsname\leftaligned % beware, makes no sense in locations / we will have a special locations handler
+\letcsname\??alignline\v!center \endcsname\midaligned
+\letcsname\??alignline\v!max \endcsname\maxaligned
+
+%D Experimental (will be redone when floats are redone as it's real messy
+%D now). It can also be made faster (if needed).
+
+\permanent\protected\def\doxalignline#1#2#3#4#5#6%
+ {\noindentation % was \noindent
+ \dontleavehmode % added in marrakesch at TUG 2006\begingroup
+ \begingroup
+ \setlocalhsize
+ \enforced\permanent\protected\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}
+
+\permanent\protected\def\doxcheckline % used for floats so multipass anyway
+ {\signalrightpage\doifelserightpage\donetrue\donefalse}
+
+\defcsname\??alignline\v!inner \endcsname{\doxalignline\doxcheckline++\zeropoint \relax\hss }
+\defcsname\??alignline\v!outer \endcsname{\doxalignline\doxcheckline++\zeropoint \hss \relax}
+\defcsname\??alignline\v!innermargin\endcsname{\doxalignline\doxcheckline-+\innermargintotal\relax\hss }
+\defcsname\??alignline\v!outermargin\endcsname{\doxalignline\doxcheckline+-\outermargintotal\hss \relax}
+\defcsname\??alignline\v!inneredge \endcsname{\doxalignline\doxcheckline-+\inneredgetotal \relax\hss }
+\defcsname\??alignline\v!outeredge \endcsname{\doxalignline\doxcheckline+-\outeredgetotal \hss \relax}
+\defcsname\??alignline\v!backspace \endcsname{\doxalignline\doxcheckline-+\backspace \relax\hss }
+\defcsname\??alignline\v!cutspace \endcsname{\doxalignline\doxcheckline+-\cutspace \hss \relax}
+
+\defcsname\??alignline\v!leftmargin \endcsname{\doxalignline\donefalse --\leftmargintotal \hss \relax}
+\defcsname\??alignline\v!rightmargin\endcsname{\doxalignline\donefalse ++\rightmargintotal\relax\hss }
+\defcsname\??alignline\v!leftedge \endcsname{\doxalignline\donefalse --\leftedgetotal \hss \relax}
+\defcsname\??alignline\v!rightedge \endcsname{\doxalignline\donefalse ++\rightedgetotal \relax\hss }
+
+\permanent\protected\def\doalignedline#1{\begincsname\??alignline#1\endcsname}
+
+\permanent\protected\def\alignedline#1#2% setting default
+ {\ifcsname\??alignline#1\endcsname
+ \expandafter\lastnamedcs
+ \else
+ \csname\??alignline#2\expandafter\endcsname
+ \fi}
+
+% beware: \wordright{whatever\kern-\rightskip} should work!
+% so, no funny boxing here
+
+%D We need to pick up a box (downward compatible in case \type {\bgroup}
+%D is used (test suite index example).
+
+\permanent\tolerant\protected\def\wordright[#1]%
+ {\dowithnextbox
+ {\normalexpanded{\spac_word_right_indeed{#1}{\hpack{\thebox\nextbox}}}}
+ \hbox}
+
+\protected\def\spac_word_right_indeed#1#2%
+ {\registerparwrapper
+ {\v!word:\v!right}
+ {\begingroup
+ \frozen\parfillskip \zeropoint
+ \frozen\finalhyphendemerits\zerocount
+ \endgroup}
+ {\doifelseparwrapper{\v!word:\v!right}%
+ {\doifelse{#1}\v!right{\kern-\rightskip}{\doifsomething{#1}{\kern-#1}}%
+ \strut \removeunwantedspaces
+ \hfill
+ \allowbreak % changed back from \hskip\zeropoint
+ \quad}%
+ {\allowbreak % changed back from \hskip\zeropoint
+ \break}%
+ \unregisterparwrapper{\v!word:\v!right}%
+ \strut
+ \hfill
+ \nobreak
+ #2%
+ \allowbreak}}
+
+% \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.
+
+% v\protected\def\bottomword
+% {\par
+% \dowithnextbox
+% {\leaders\box\nextbox\vfil\page}
+% \vbox to \lineheight}
+%
+% \permanent\protected\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
+
+\protected\def\spac_align_simple_left #1{{#1\hss}}
+\protected\def\spac_align_simple_right #1{{\hss#1}}
+\protected\def\spac_align_simple_middle#1{{\hss#1\hss}}
+
+\letcsname\??alignsimple \v!right \endcsname\spac_align_simple_left
+\letcsname\??alignsimple \v!outer \endcsname\spac_align_simple_left % not managed! see linenumbers
+\letcsname\??alignsimple \v!flushleft \endcsname\spac_align_simple_left
+\letcsname\??alignsimple \v!left \endcsname\spac_align_simple_right
+\letcsname\??alignsimple \v!inner \endcsname\spac_align_simple_right % not managed! see linenumbers
+\letcsname\??alignsimple \v!flushright\endcsname\spac_align_simple_right
+\letcsname\??alignsimple \v!middle \endcsname\spac_align_simple_middle
+
+\letcsname\??alignsimplereverse\v!right \endcsname\spac_align_simple_right
+\letcsname\??alignsimplereverse\v!outer \endcsname\spac_align_simple_right % not managed! see linenumbers
+\letcsname\??alignsimplereverse\v!flushleft \endcsname\spac_align_simple_right
+\letcsname\??alignsimplereverse\v!left \endcsname\spac_align_simple_left
+\letcsname\??alignsimplereverse\v!inner \endcsname\spac_align_simple_left % not managed! see linenumbers
+\letcsname\??alignsimplereverse\v!flushright\endcsname\spac_align_simple_left
+\letcsname\??alignsimplereverse\v!middle \endcsname\spac_align_simple_middle
+
+\permanent\protected\def\simplealignedbox#1#2%
+ {\hbox \ifdim#1>\zeropoint to #1
+ \ifcsname\??alignsimple#2\endcsname
+ \doubleexpandafter\lastnamedcs
+ \else
+ \doubleexpandafter\spac_align_simple_left
+ \fi
+ \fi}
+
+\permanent\protected\def\simplealignedspreadbox#1#2%
+ {\hbox \ifdim#1>\zeropoint spread #1
+ \ifcsname\??alignsimple#2\endcsname
+ \doubleexpandafter\lastnamedcs
+ \else
+ \doubleexpandafter\spac_align_simple_left
+ \fi
+ \fi}
+
+\permanent\protected\def\simplealignedboxplus#1#2#3%
+ {\hbox #3 \ifdim#1>\zeropoint to #1
+ \ifcsname\??alignsimple#2\endcsname
+ \doubleexpandafter\lastnamedcs
+ \else
+ \doubleexpandafter\spac_align_simple_left
+ \fi
+ \fi}
+
+\newconditional\alignsimplelefttoright \settrue\alignsimplelefttoright
+
+\permanent\protected\def\simplereversealignedbox#1#2%
+ {\hbox \ifdim#1>\zeropoint to #1
+ \ifcsname\??alignsimplereverse#2\endcsname
+ \doubleexpandafter\lastnamedcs
+ \else
+ \doubleexpandafter\spac_align_simple_left
+ \fi
+ \fi}
+
+\permanent\protected\def\simplereversealignedboxplus#1#2#3%
+ {\hbox #3 \ifdim#1>\zeropoint to #1
+ \ifcsname\??alignsimplereverse#2\endcsname
+ \doubleexpandafter\lastnamedcs
+ \else
+ \doubleexpandafter\spac_align_simple_left
+ \fi
+ \fi}
+
+% Some obsolete (old) helpers:
+
+\permanent\tolerant\protected\def\definehbox[#1]#*[#2]%
+ {\ifarguments\else\frozen\instance\protected\defcsname hbox#1\endcsname##1{\hbox to #2{\begstrut##1\endstrut\hss}}\fi}
+
+%D Some direction related helpers:
+
+\installcorenamespace {reverse}
+
+\defcsname\??reverse\v!normal \endcsname{\ifconditional\inlinelefttoright\else\s!reverse\fi}
+\defcsname\??reverse\v!reverse\endcsname{\ifconditional\inlinelefttoright \s!reverse\fi}
+
+\permanent\def\usedirectionparameterreverse#1{\begincsname\??reverse#1\c!direction\endcsname}
+
+%D Now official:
+
+\permanent\protected\def\spaceorpar{\endgraf\ifhmode\space\fi}
+
+\protect \endinput