summaryrefslogtreecommitdiff
path: root/doc/context/sources/general/manuals/spacing/spacing-spaces.tex
diff options
context:
space:
mode:
Diffstat (limited to 'doc/context/sources/general/manuals/spacing/spacing-spaces.tex')
-rw-r--r--doc/context/sources/general/manuals/spacing/spacing-spaces.tex276
1 files changed, 276 insertions, 0 deletions
diff --git a/doc/context/sources/general/manuals/spacing/spacing-spaces.tex b/doc/context/sources/general/manuals/spacing/spacing-spaces.tex
new file mode 100644
index 000000000..0d7f64379
--- /dev/null
+++ b/doc/context/sources/general/manuals/spacing/spacing-spaces.tex
@@ -0,0 +1,276 @@
+% language=uk
+
+\environment spacing-style
+
+\startcomponent spacing-periods
+
+\startchapter[title=Spacing]
+
+\startsection[title=Spaces]
+
+When \TEX\ reads its input and transforms content it into a node list spaces are
+turned into glue nodes of subtype \quote {spaceskip} or \quote {xspaceskip}. In
+pseudo code, this is what happens:
+
+\starttyping
+if spacefactor >= 2000 and xspaceskip ~= 0 then
+ space = xspaceskip_space
+ stretch = xspaceskip_stretch
+ shrink = xspaceskip_shrink
+ subtype = xspaceskip
+else
+ if spaceskip == 0 then
+ space = font_space
+ stretch = font_stretch
+ shrink = font_shrink
+ else
+ space = spaceskip_space
+ stretch = spaceskip_stretch
+ shrink = spaceskip_shrink
+ end
+ if space_factor >= 2000
+ space = space + font_extraspace
+ end
+ stretch = stretch * space_factor
+ shrink = shrink * space_factor
+ subtype = spaceskip
+end
+insert_glue(space,stretch,shrink,subtype)
+\stoptyping
+
+We demonstrate the effects in a few examples. You can use \typ {\showmakeup [space]} to
+visualize spaces.
+
+\def\ShowSpaces#1#2#3%
+ {\blank
+ \start
+ \startsubsubsubject[title={case #1: \type{#2} and \type {#3}}]
+ \dontleavehmode
+ #2\relax
+ #3\relax
+ \showmakeup[space]%
+ % \definedfont[Serif*default]%
+ \nonfrenchspacing
+ \strut x\space x.\space x\crlf
+ \frenchspacing
+ \strut x\space x.\space x\par
+ \stop
+ \stopsubsubject
+ \blank}
+
+\ShowSpaces{1}{\spacefactor2000}{\xspaceskip100pt}
+
+\starttabulate[|l|l|]
+\HL
+\NC \type {\spacefactor} \NC $\geq 2000$ \NC \NR
+\NC \type {\xspaceskip} \NC $\neq 0$ \NC \NR
+\HL
+\NC space \NC xspaceskip_space \NC \NR
+\NC stretch \NC xspaceskip_stretch \NC \NR
+\NC shrink \NC xspaceskip_shrink \NC \NR
+\NC subtype \NC xspaceskip \NC \NR
+\HL
+\stoptabulate
+
+\ShowSpaces{2}{\spacefactor1000}{\spaceskip0pt}
+
+\starttabulate[|l|l|]
+\HL
+\NC \type {\spacefactor} \NC $\lt 2000$ \NC \NR
+\NC \type {\spaceskip} \NC $\eq 0$ \NC \NR
+\HL
+\NC space \NC font_space \NC \NR
+\NC stretch \NC font_stretch \NC \NR
+\NC shrink \NC font_shrink \NC \NR
+\NC subtype \NC spaceskip \NC \NR
+\HL
+\stoptabulate
+
+\ShowSpaces{3}{\spacefactor2000}{\spaceskip0pt}
+
+\starttabulate[|l|l|]
+\HL
+\NC \type {\spacefactor} \NC $\geq 2000$ \NC \NR
+\NC \type {\spaceskip} \NC $\eq 0$ \NC \NR
+\HL
+\NC space \NC font_space $+$ extraspace_font \NC \NR
+\NC stretch \NC font_stretch \NC \NR
+\NC shrink \NC font_shrink \NC \NR
+\NC subtype \NC spaceskip \NC \NR
+\HL
+\stoptabulate
+
+\ShowSpaces{4}{\spacefactor1000}{\spaceskip100pt}
+
+\starttabulate[|l|l|]
+\HL
+\NC \type {\spacefactor} \NC $\lt 2000$ \NC \NR
+\NC \type {\spaceskip} \NC $\neq 0$ \NC \NR
+\HL
+\NC space \NC font_space \NC \NR
+\NC stretch \NC font_stretch $\times$ space_factor \NC \NR
+\NC shrink \NC font_shrink $\times$ space_factor \NC \NR
+\NC subtype \NC spaceskip \NC \NR
+\HL
+\stoptabulate
+
+\ShowSpaces{5}{\spacefactor2000}{\spaceskip100pt}
+
+\starttabulate[|l|l|]
+\HL
+\NC \type {\spacefactor} \NC $\geq 2000$ \NC \NR
+\NC \type {\spaceskip} \NC $\neq 0$ \NC \NR
+\HL
+\NC space \NC font_space $+$ extraspace_font \NC \NR
+\NC stretch \NC font_stretch $\times$ space_factor \NC \NR
+\NC shrink \NC font_shrink $\times$ space_factor \NC \NR
+\NC subtype \NC spaceskip \NC \NR
+\HL
+\stoptabulate
+
+The width of a space relates to the design of a font and therefore the t width of
+the space, its stretch and its shrink are taken from the font and scaled
+accordingly. Normally we take the space character in the font as reference.
+Traditional \TEX\ fonts don't have that character but \OPENTYPE\ fonts have. When
+there is no space character, in the case of a monospaced font we take the
+emwidth, otherwise we take half the emwidth. As a last resort we can take the
+average width of characters. And of even that fails we take half of the font
+units. But, as mentioned, modern fonts have a space.
+
+In the \CONTEXT\ font loader we use a stretch that is 1/2 of the width of a space
+and the shrink is 1/3 the width of a space. These values are familiar for those
+who come from traditional \TEX.
+
+As with many variables, you can overload these values when a font is loaded by
+setting the \type {spacing} feature. Here is how this is done:
+
+\startbuffer
+\definefontfeature
+ [morespace]
+ [spacing=0.50 plus 0.50 minus 0.250]
+\definefontfeature
+ [lessspace]
+ [spacing=0.25 plus 0.25 minus 0.125]
+\definefontfeature
+ [extramorespace]
+ [spacing=0.50 plus 0.50 minus 0.250 extra 2.00]
+\definefontfeature
+ [extralessspace]
+ [spacing=0.25 plus 0.25 minus 0.125 extra 2.00]
+
+\definedfont[Serif*default]
+ \inleft{\infofont default}
+ \samplefile{klein}\par
+ \blank
+\definedfont[Serif*default,morespace]
+ \inleft{\infofont morespace}
+ \samplefile{klein}\par
+ \blank
+\definedfont[Serif*default,extramorespace]
+ \inleft{\infofont extramorespace}
+ \samplefile{klein}\par
+ \blank
+\definedfont[Serif*default,lessspace]
+ \inleft{\infofont lessspace}
+ \samplefile{klein}\par
+ \blank
+\definedfont[Serif*default,extralessspace]
+ \inleft{\infofont extralessspace}
+ \samplefile{klein}\par
+ \blank
+\stopbuffer
+
+\typebuffer
+
+For demonstration purposes we use a somewhat excessive \type {extra}
+specification. By default the extra space is equal to the shrink.
+
+\blank \start
+ \showmakeup[space]
+ \getbuffer
+\stop \blank
+
+\stopsection
+
+\startsection[title=Expansion]
+
+Spaces become glue that can shrink or stretch. In the worst case words will come
+too close, or the gap will be large. Even worse is that this can lead to
+successive lines in a paragraph looking different with respect to spacing. A solution
+for this is to use font expansion, although the benefits are often less than
+some users want (you) to believe.
+
+This mechanism is enabled with \type {\setupalign}. There are two variants (\type
+{hz} and \type {fullhz}) and a reset (\type {nohz}). In \in {figure} [fig:expansion]
+we use the following font definition:
+
+\startbuffer
+\definefont[testfont][Normal*default,quality @ 9pt]
+\stopbuffer
+
+\typebuffer \getbuffer
+
+We use \type {\showfontexpansion} to view the effective expansion factors of each
+glyph. When \type {fullhz} is used fontkerns also can get expanded. Zero values
+are not shown. The font kern factors are shown below the character factors. They
+can be neglected and one can even wonder if they need a treatment especially
+because kerns are also used for relative positioning, accent anchoring and
+cursive attachments.
+
+\startplacefigure[reference=fig:expansion,title={The two expansion methods in action.}]
+ \startcombination[nx=3,ny=2,location=top]
+ {\framed[foregroundstyle=\testfont,width=.3\textwidth,align={normal,tolerant,nohz}] {\showfontexpansion\samplefile{ward}}} {}
+ {\framed[foregroundstyle=\testfont,width=.3\textwidth,align={normal,tolerant,fullhz}]{\showfontexpansion\samplefile{ward}}} {}
+ {\framed[foregroundstyle=\testfont,width=.3\textwidth,align={normal,tolerant,hz}] {\showfontexpansion\samplefile{ward}}} {}
+ {\scale[width=.3\textwidth]{\clip[nx=2,ny=4,x=2,y=3]{\framed[foregroundstyle=\testfont,width=.3\textwidth,align={normal,tolerant,nohz}] {\showfontexpansion\samplefile{ward}}}}} {\tttf{nohz}}
+ {\scale[width=.3\textwidth]{\clip[nx=2,ny=4,x=2,y=3]{\framed[foregroundstyle=\testfont,width=.3\textwidth,align={normal,tolerant,fullhz}]{\showfontexpansion\samplefile{ward}}}}} {\tttf{fullhz}}
+ {\scale[width=.3\textwidth]{\clip[nx=2,ny=4,x=2,y=3]{\framed[foregroundstyle=\testfont,width=.3\textwidth,align={normal,tolerant,hz}] {\showfontexpansion\samplefile{ward}}}}} {\tttf{hz}}
+ \stopcombination
+\stopplacefigure
+
+\stopsection
+
+\startsection[title=Looseness]
+
+The \type {\looseness} parameter can be used to let the par builder add more
+lines, but that condition is only met when the demand is reasonable. So we need
+stretch and often also tolerance to achieve it.
+
+\starttyping
+\looseness=1 ... text ... \par
+\stoptyping
+
+This setting is reset afterwards. Because \type {framed} does some grouping deep down,
+we need either to use it in there like this:
+
+\starttyping
+\framed
+ [align={normal,verytolerant,stretch},strut=no]
+ {\looseness1 ... \par}
+\stoptyping
+
+which is somewhat clumsy, or we can do:
+
+\starttyping
+\framed
+ [align={normal,verytolerant,stretch,2*more}]
+ {...}
+\stoptyping
+
+This is demonstrated in \in {figure} [fig:looseness].
+
+\startplacefigure[reference=fig:looseness,title={Looseness in action.}]
+ \dontcomplain
+ \startcombination[location=top,nx=3,ny=1]
+ {\framed[foregroundstyle=small,align={normal,verytolerant,stretch}, width=.3\textwidth]{\samplefile{sapolsky}\unskip}} {}
+ {\framed[foregroundstyle=small,align={normal,verytolerant,stretch,1*more},width=.3\textwidth]{\samplefile{sapolsky}\unskip}} {\type {1*more}}
+ {\framed[foregroundstyle=small,align={normal,verytolerant,stretch,2*more},width=.3\textwidth]{\samplefile{sapolsky}\unskip}} {\type {2*more}}
+ \stopcombination
+\stopplacefigure
+
+\stopsection
+
+\stopchapter
+
+\stopcomponent
+