summaryrefslogtreecommitdiff
path: root/doc/context/sources/general/manuals/texit/texit-leaders.tex
diff options
context:
space:
mode:
Diffstat (limited to 'doc/context/sources/general/manuals/texit/texit-leaders.tex')
-rw-r--r--doc/context/sources/general/manuals/texit/texit-leaders.tex247
1 files changed, 247 insertions, 0 deletions
diff --git a/doc/context/sources/general/manuals/texit/texit-leaders.tex b/doc/context/sources/general/manuals/texit/texit-leaders.tex
new file mode 100644
index 000000000..ed224da5c
--- /dev/null
+++ b/doc/context/sources/general/manuals/texit/texit-leaders.tex
@@ -0,0 +1,247 @@
+\environment texit-style
+
+\startcomponent texit-leaders
+
+\startchapter[title={Leaders}]
+
+The following example comes from a question on the \CONTEXT\ list. It
+exhibits a few low level tricks. For the purpose of this example we
+use \type {\ruledhbox} instead of \type {\hbox}. We start with a simple
+command that puts something at the end of a line:
+
+\startbuffer
+\starttexdefinition MyFill #1
+ \removeunwantedspaces
+ \hfill
+ \ruledhbox{#1}
+\stoptexdefinition
+\stopbuffer
+
+\typebuffer[option=TEX] \getbuffer
+
+We use this in:
+
+\startbuffer[sample]
+\startitemize[packed,joinedup][rightmargin=3em]
+ \startitem
+ \samplefile{ward}\MyFill{DW}
+ \stopitem
+\stopitemize
+\stopbuffer
+
+\typebuffer[sample][option=TEX]
+
+and get:
+
+\getbuffer[sample]
+
+But, the requirement was that we move the number towards the right margin, so
+instead we need something:
+
+\startbuffer
+\starttexdefinition MyFill #1
+ \removeunwantedspaces
+ \hfill
+ \rlap{\ruledhbox to \rightskip{\hss#1}}
+\stoptexdefinition
+\stopbuffer
+
+\typebuffer[option=TEX] \getbuffer
+
+This already looks more like it:
+
+\getbuffer[sample]
+
+But also part of the requirements was that there should be dots between the end
+of the last sentence and the number. In low level \TEX\ speak that means using
+leaders: repeated boxed content where the repitition is driven by a glue
+specification. Let's naively use leaders now:
+
+\startbuffer
+\starttexdefinition MyFill #1
+ \leaders
+ \ruledhbox to 1em{\hss.\hss}
+ \hfill
+ \ruledhbox{#1}
+\stoptexdefinition
+\stopbuffer
+
+\typebuffer[option=TEX] \getbuffer
+
+Let's see what we get:
+
+\getbuffer[sample]
+
+Again we need to move the number to the right. This time we need a different
+solution because we need to fill the space in between. When \TEX\ ends a
+paragraph it adds \type {\parfillskip} so we will now manipulate that parameter.
+
+\startbuffer
+\starttexdefinition MyFill #1
+ \parfillskip-1\rightskip plus 1fil\relax
+ \leaders
+ \ruledhbox to 1em{\hss.\hss}
+ \hfill
+ \ruledhbox{#1}
+\stoptexdefinition
+\stopbuffer
+
+\typebuffer[option=TEX] \getbuffer
+
+Does it look better?
+
+\getbuffer[sample]
+
+Indeed it does, but watch this:
+
+\startbuffer[sample]
+\startitemize[packed,joinedup][rightmargin=8.5em]
+ \startitem
+ \samplefile{ward}\MyFill{DW}\par
+ \samplefile{ward}\par
+ \samplefile{ward}\MyFill{DW}
+ \stopitem
+\stopitemize
+\stopbuffer
+
+\typebuffer[sample][option=TEX]
+
+The first \type {\MyFill} will set the \type {\parfillskip} to a value that will
+also be used later on.
+
+\getbuffer[sample]
+
+The way out is the following
+
+\startbuffer
+\starttexdefinition MyFill #1
+ \begingroup
+ \parfillskip-1\rightskip plus 1fil\relax
+ \leaders
+ \ruledhbox to 1em{\hss.\hss}
+ \hfill
+ \ruledhbox{#1}
+ \par
+ \endgroup
+\stoptexdefinition
+\stopbuffer
+
+\typebuffer[option=TEX] \getbuffer
+
+This looks more or less okay. The \type {\par} keeps the adaption local but for
+it to work well, the \type {\par} must be inside the group.
+
+\getbuffer[sample]
+
+Now it's time to go for perfection! First of all, we get rid of any leading
+spacing. If we need some we should inject it after a cleanup. We also use a
+different leader command. Instead of \type {to} we use a \type {spread} so that
+we get half the emwidth and not something slightly less due to the width of the
+period.
+
+\startbuffer
+\starttexdefinition MyFill #1
+ \removeunwantedspaces
+ \begingroup
+ \parfillskip-1\rightskip plus 1fil\relax
+ \cleaders
+ \ruledhbox spread 1em{\hss.\hss}
+ \hfill
+ \ruledhbox{#1}
+ \par
+ \endgroup
+\stoptexdefinition
+\stopbuffer
+
+\typebuffer[option=TEX] \getbuffer
+
+So, we end up here:
+
+\startbuffer[sample]
+\startitemize[packed,joinedup][rightmargin=5em]
+ \startitem
+ \samplefile{sapolsky}\MyFill{RS}\par
+ \stopitem
+\stopitemize
+\stopbuffer
+
+\getbuffer[sample]
+
+For which we used this:
+
+\typebuffer[sample][option=TEX]
+
+Finally we get rid of the tracing:
+
+\startbuffer
+\starttexdefinition unexpanded MyFill #1
+ \begingroup
+ \parfillskip-1\rightskip plus 1fil\relax
+ \leaders
+ \hbox to \emwidth{\hss.\hss}
+ \hfill
+ \hbox{#1}
+ \par
+ \endgroup
+\stoptexdefinition
+\stopbuffer
+
+\typebuffer[option=TEX] \getbuffer
+
+Watch a few more details. It brings us to:
+
+\getbuffer[sample]
+
+\page
+
+\startbuffer
+\definefiller
+ [MyFiller]
+ [offset=.25\emwidth,
+ method=middle]
+
+\starttexdefinition unexpanded MyFill #1
+ \begingroup
+ \parfillskip-1\rightskip plus 1fil\relax
+ \filler[MyFiller]%
+ \hbox{#1}
+ \par
+ \endgroup
+\stoptexdefinition
+\stopbuffer
+
+\typebuffer[option=TEX] \getbuffer
+
+\getbuffer[sample]
+
+When writing these examples I realized that it's rather trivial to add this
+option to the already existing filler mechanism. The definition of such a filler
+looks like this:
+
+\startbuffer
+\definefiller
+ [MyFiller]
+ [offset=.25\emwidth,
+ rightmargindistance=-\rightskip,
+ method=middle]
+\stopbuffer
+
+\typebuffer[option=TEX] \getbuffer
+
+\startbuffer[sample]
+\startitemize[packed,joinedup][rightmargin=5em]
+ \startitem
+ \samplefile{sapolsky}\fillupto[MyFiller]{RS}
+ \stopitem
+\stopitemize
+\stopbuffer
+
+The sample code now becomes:
+
+\typebuffer[sample][option=TEX]
+
+Ans as expected renders as:
+
+\getbuffer[sample]
+
+\stopcomponent