diff options
author | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
commit | e0c6872cf40896c7be36b11dcc744620f10adf1d (patch) | |
tree | 60335e10d2f4354b0674ec22d7b53f0f8abee672 /macros/latex/contrib/truncate/truncate.sty |
Initial commit
Diffstat (limited to 'macros/latex/contrib/truncate/truncate.sty')
-rw-r--r-- | macros/latex/contrib/truncate/truncate.sty | 158 |
1 files changed, 158 insertions, 0 deletions
diff --git a/macros/latex/contrib/truncate/truncate.sty b/macros/latex/contrib/truncate/truncate.sty new file mode 100644 index 0000000000..a4f0ed840c --- /dev/null +++ b/macros/latex/contrib/truncate/truncate.sty @@ -0,0 +1,158 @@ +% truncate.sty ver 3.6 20-Aug-2001 Donald Arseneau +% This LaTeX program is released to the public domain. +% +% Truncate text to a specified width: \truncate [marker]{width}{text} +% +% If the text is too wide to fit in the specified width, then it is +% truncated, and a continuation marker is shown at the end. The default +% marker, used when the optional "[marker]" parameter is omitted, is +% "\,\dots". You can change this default by redefining "\TruncateMarker" +% ("\renewcommand{\TruncateMarker}{}"). +% +% Normally, the text (whether truncated or not) is printed flush-left +% in a box with exactly the width specified. The package option "[fit]" +% ("\usepackage[fit]{truncate}") causes the output text to have its +% natural width, up to a maximum of the specified width. +% +% The text will not normally be truncated in the middle of a word, +% nor at a space specified by the tie "~". For example: +% +% "\truncate{122pt}{This text has been~truncated}" +% gives +% "This text has... " +% +% You can give one of the package options "[hyphenate]", "[breakwords]", +% or "[breakall]" to allow breaking in the middle of words. The first +% two only truncate at hyphenation points; with the difference being that +% "breakwords" suppresses the hyphen character. On the other hand, +% "breakall" allows truncation at any character. For example: +% +% "\truncate{122pt}{This text has been~truncated}" +% gives +% "This text has been trun-..." (hyphenate) +% "This text has been trun... " (breakwords) +% "This text has been trunc..." (breakall) +% +% (All of these options work through TeX's hyphenation mechanism.) +% +\ProvidesPackage{truncate}[2001/08/20 \space ver 3.6] +% +% [breakwords] allows hyphenation but with invisible hyphen characters +\DeclareOption{breakwords}{% + \let\@Trunc@DoSelect\relax + \expandafter\chardef\csname \string\@TruncHyph T1\endcsname 23 + \expandafter\chardef\csname \string\@TruncHyph OT1\endcsname 223 + \expandafter\chardef\csname \string\@TruncHyph LY1\endcsname 0 + \def\@Trunc@Post{\hyphenpenalty\tw@ \exhyphenpenalty\tw@ + \doublehyphendemerits\z@ \finalhyphendemerits\z@ + \the\@Trunc@RestHyph % set invisible hyphenchars for all fonts used + }} +% +% [breakall] is like breakwords, but all characters are treated like +% the letter "c"; the default language 0 patterns allow hyphenation +% c-c-c-c-c-c-c-c-c. This means we don't need special patterns! +\DeclareOption{breakall}{\ExecuteOptions{breakwords}% + \expandafter\def\expandafter\@Trunc@Post\expandafter{\@Trunc@Post + \@tempcnta\z@ \chardef\c`\c % in knuth patterns, c allows hyphens + \loop \lccode\@tempcnta\c \advance\@tempcnta\@ne + \ifnum\@tempcnta<\@cclvi \repeat}% + \def\@Trunc@Pre{% force US english + \lefthyphenmin\@ne \righthyphenmin\@ne + \doublehyphendemerits\language + \language\z@ % default English language + \let\language\doublehyphendemerits + \uchyph\@ne + }} +% +% [hyphenate] ordinary hyphenation for breakpoints +\DeclareOption{hyphenate}{% takes precedence over breakwords + \def\@Trunc@Post{\hyphenpenalty\sixt@@n}\let\@Trunc@Pre\relax} +% +% [fit] use true size of truncated text, not requested size. +\DeclareOption{fit}{\def\@Trunc@Rebox{% + \setbox\z@\hbox{\unhbox\z@\unskip\unskip\@tempa}% + \ifdim\wd\z@>\hsize \hbox to\hsize{\unhbox\z@}\else \box\z@ \fi}} +% +% Defaults: +\let\@Trunc@Pre\@empty +\def\@Trunc@Post{\hyphenpenalty\@M} +\def\@Trunc@Rebox{\hbox to\hsize{\unhbox\z@\unskip\unskip\@tempa\hfil}} +\let\@Trunc@DoSelect\@empty + +\ProcessOptions\relax + +\providecommand{\TruncateMarker}{\,\dots} + +\newcommand{\truncate}[3][\TruncateMarker]{% #1=marker #2=width #3=text + \parbox[b]{#2}{\tolerance9999 \emergencystretch .216\hsize + \vbadness\maxdimen \vfuzz\vsize % no overfull warnings + \hbadness\maxdimen \hfuzz\vsize + % set up hyphenchar switching for all fonts used. + \edef\@tempb{\the\@Trunc@RestHyph}% save whole stack + \global\@Trunc@RestHyph{}% + \ifx\@Trunc@DoSelect\relax + \let\@Trunc@DoSelect\selectfont + \def\selectfont{\@Trunc@DoSelect\@Trunc@SaveHChar}% + \fi + \@Trunc@SaveHChar % do it for current font + \setbox\z@\vbox\bgroup + % First set text in a hbox to see if it fits. + \setbox\z@\@@line{\ignorespaces #3\unskip\hfil}% + \ifnum\badness>\@M % text does not fit + \settowidth\rightskip{#1}% + \advance\rightskip \z@\@plus\p@ + \parfillskip-\@ne\rightskip \@plus\@ne fil + \parshape \tw@ \z@\hsize \z@\maxdimen \linepenalty60 + \tracinglostchars\z@ + %% \let\par\relax -- don't do this because \vskip causes infinite loop + \@Trunc@Pre % must set language before paragraph + \noindent \vadjust{\penalty-\@MM}% for splitting off first line + \nobreak\hskip\z@skip % allow first word hyphenation + \ignorespaces #3% the text + \pretolerance\hyphenpenalty \@Trunc@Post % set up `hyphenation' + \@@par + \ifnum\prevgraf>\@ne + \egroup \def\@tempa{#1}% use truncation marker + \else + \egroup \let\@tempa\@empty% no linebreak, so all text fits; no marker + \fi + \else + \box\z@ \egroup \let\@tempa\@empty + \fi + \setbox\@tempboxa\vsplit\z@ to\z@ \unvbox\@tempboxa + \unskip\unpenalty\unpenalty + \setbox\z@\lastbox + \nointerlineskip + \hfuzz\p@ + \@Trunc@Rebox + \let\@Trunc@HC\@firstofone \the\@Trunc@RestHyph % restore hyphenchars + \global\@Trunc@RestHyph\expandafter{\@tempb}% restore the stack itself + }} +% (Note that the text may be proessed twice. I could avoid that +% if there are problems with global counters etc.) + +% we save (implicit global) hyphenchar settings for each font on a +% manual stack -- the token register \@Trunc@RestHyph -- before changing +% them. We execute \@Trunc@RestHyph to set them to the invisible +% characters and then again to restore them. (I can't imagine this +% will ever be required.) +\newtoks\@Trunc@RestHyph +\global\@Trunc@RestHyph{} +% +\def\@Trunc@SaveHChar{\begingroup + \edef\@tempa{% + \hyphenchar\the\font=\noexpand\@Trunc@HC{\the\hyphenchar\font}\relax + \the\@Trunc@RestHyph}% + \global\@Trunc@RestHyph\expandafter{\@tempa}% +% \hyphenchar\font\z@ + \endgroup} +% +% select an invisible character for hyphenation. Use \textcompwordmark, if +% any; use selected numbers for certain encodings (OT1 uses a *missing* +% character); use a space otherwise. +\def\@Trunc@HC#1{% + \@ifundefined{\f@encoding\string\textcompwordmark}{% + \@ifundefined{\string\@TruncHyph\f@encoding}% + {32}% If no appropriate character, guess space character may be blank + {\csname \string\@TruncHyph\f@encoding\endcsname}% + }{\csname\f@encoding\string\textcompwordmark\endcsname}}% |