Changes

Jump to navigation Jump to search
1,572 bytes added ,  14:28, 20 August 2022
m
→‎A direct comparison: - Fix context code
< [[Visuals]] |
 
== Cropping text ==
There are some rare cases in which it is useful to crop truncate a givenline of text line and loose part discard some of its informationit.
=== <tt>\doboundtext</tt> ===
<texcode>
\doboundtext{My entire inheritance goes to my beloved cat Pussy!}{70mm60mm}{...}
</texcode>
<context>
\ss\doboundtext{My entire inheritance goes to my beloved cat Pussy!}{70mm60mm}{...}
</context>
 
=== <tt>\limitatetext</tt> ===
A bit more beautiful alternative for the previous command is <tt>\{{cmd|limitatetext</tt>}}.
This command takes care of '''word''' boundaries, so that only complete words will
appear in the final (cropped) text.
\limitatetext {text} {width} {sentinel}
\limitatetext {text} {-width} {prelude}
\limitatetext {text} {width1 , width2} {symbol}
</texcode>
When no <tt>width</tt> is given, the whole <tt>text</tt> becomes available.
A negative value crops the beginning and the text starts with
the <tt>prelude</tt>. Sentinel and prelude are both optional.Just look at the example, to see what happens, if you call the macro withtwo positive dimensions...
Example:
<texcode>
\limitatetext {Pussy is the name of the cat!}{38mm}{...}\par
\limitatetext {Pussy is the name of the cat!}{-38mm}{...}\par\limitatetext {Pussy is the name of the cat!}{12mm, 12mm}{...}
</texcode>
<context>
\limitatetext {\ss\x Pussy is the name of the cat!}{38mm}{...}\par\limitatetext {\ss\x Pussy is the name of the cat!}{-38mm}{...}\par\limitatetext {\ss Pussy is the name of the cat!}{10mm, 10mm}{...}
</context>
Both commands have their range of application.
<tt>\{{cmd|limitatetext</tt> }} is more robust (using grouping tokens like<tt>\{{cmd|underbar</tt> }} is possible), while <tt>\{{cmd|doboundtext</tt> }} works better
on text that cannot be hyphenated.
=== <tt>\limitatefirstline</tt> ===
In ConTeXt versions newer than 07.09.2005 there is also a command
called <tt>\{{cmd|limitatefirstline</tt>}}, which acts nearly like <tt>\{{cmd|doboundtext</tt>}},
but at a more robust level. This macro first tries to break the given text
at character level. It uses nearly the same breaking mechanism as <tt>\{{cmd|limitatetext</tt>}},
so it shares the problem with nonbreakable text.
But in contrast to <tt>\{{cmd|limitatetext</tt> }} it has a second mechanism, that is only used,if the prior one failsor if the result of breaking is wasting too much space.
This fail safe mechanism "simply" clips (no breaking at all) the text to the desired
measures. This is done without any consideration to character boundaries.
<texcode>
\limitatefirstline {\underbar{Mr.~Drofnats was happiest when he was at work%
typesetting beautiful documents.}{110mm109mm}{\unknown}
</texcode>
 
<context>
\unprotect
 
\def\limitatefirstline#1#2#3%
{\hbox\bgroup\strut\dontcomplain \setbox\scratchbox\hbox{\begstrut#1\endstrut}% \ifdim\wd\scratchbox>#2\relax \setbox\scratchbox\hbox{#3}% \hsize#2\relax \advance\hsize-\wd\scratchbox \setbox\scratchbox\vbox{\forgetall\veryraggedright#1}% \setbox\scratchbox\vsplit\scratchbox to \lineheight \vbox {\unvbox\scratchbox \global\setbox\plusone\lastbox \global\setbox\plusone\hbox{\strut\unhbox\plusone}% \hbox % to #2 {\ifx\clip\undefined \box\plusone \else\ifdim\wd\plusone>\hsize \lower\strutdepth\hbox{\clip[\c!width=\hsize,\c!height=\lineheight]{\hbox{\raise\strutdepth\box\plusone}}}% \else\ifdim\wd\plusone<\dimexpr\hsize-6ex\relax% tolerance for "successful" breaking \lower\strutdepth\hbox{\clip[\c!width=\hsize,\c!voffsetheight=-4pt\lineheight]{\boxhbox{\raise\strutdepth\hbox{\begstrut#1\plusoneendstrut}}}}% \else \box\plusone \fi\fi\fi \removeunwantedspaces#3}}% \removeunwantedspaces\hss#3}}% \else #1% \fi \egroup}
\protect
 \limitatefirstline {\ss\x\underbar{Mr.~Drofnats was happiest when he was at work typesetting beautiful documents.}}{110mm107mm}{\unknown}
</context>
 
 
In this example breaking is successful (right after the word typesetting),
but the gap between the breaking point and the given width is too big.
So clipping is used here.
=== A direct comparison ===
|-
|<tt>'''\doboundtext'''</tt>
|<context>\ss\x\doboundtext{It's all in the garden.}{30mm}{...}</context>|<context>\ss\x\doboundtext{0123456789}{15mm}{...}</context>
|align=center|not possible
|-
|<tt>'''\limitatetext'''</tt>
|<context>\ss\x\limitatetext{It's all in the garden.}{30mm}{...}</context>|<context>\ss\x\limitatetext{0123456789}{15mm}{...}</context>|<context>\ss\x\limitatetext{\underbar{In a bar, under the sea}}{31mm}{...}</context>
|-
|<tt>'''\limitatefirstline'''</tt>
|<context>\ss\x\limitatefirstline{It's all in the garden.}{30mm}{\red...}</context>|<context>\ss\x\limitatefirstline{0123456789}{15mm}{...}</context>|<context>\ss\x\limitatefirstline{\underbar{In a bar, under the sea}}{31mm}{...}</context>
|}
 
== Fitting text ==
You can fit text into a box by:
 
<texcode>
\def\HowStrange#1{#1\ifx#1\blankspace\else\allowbreak\fi}
 
\framed
[width=2cm,align={normal,verytolerant,stretch}]
{\handletokens There are some rather long titles that needs to be typeset.\with\HowStrange}
</texcode>
 
<context>
\def\HowStrange#1{#1\ifx#1\blankspace\else\allowbreak\fi}
 
\framed
[width=2cm,align={normal,verytolerant,stretch}]
{\handletokens There are some rather long titles that needs to be typeset.\with\HowStrange}
</context>
 
There is also similar facility for verbatim text in [[Verbatim_with_line_breaks]] and [[Wrapping]] section.
 
== See also ==
 
* If you meant to crop a page ''to'' some text, see {{cmd|startTEXpage}}
 
[[Category:Basics]]
[[Category:Graphics]]
174

edits

Navigation menu