summaryrefslogtreecommitdiff
path: root/macros/plain/contrib/js-misc/sperr.tex
blob: 4e6b090230130e1a5a9a97ad1de1504ce5d07fd4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
% $Id: sperr.tex,v 1.2 1995/04/16 23:27:04 schrod Exp $
%---------------------------------------------------------
% Written by Joachim Schrod <schrod@iti.informatik.th-darmstadt.de>.
% This file is distributed without any copyright restriction.


%
% Makro-Datei zum Sperren von Zeichenfolgen.
%
% Bitte sperrt damit keine Gemeinen.
%
%                                Joachim Schrod
%

%
% Benutzung: \sperr{TEXT}{KERNING}
%     Wenn in TEXT mehrere Token als eines behandelt werden sollen
%     (z.B. Umlaute), m\"ussen diese Tokens geklammert werden.
%


\ifx \CatEscape\undefined
    \chardef\CatEscape=0
    \chardef\CatOpen=1
    \chardef\CatClose=2
    \chardef\CatIgnore=9
    \chardef\CatLetter=11
    \chardef\CatOther=12
    \chardef\CatActive=13               % \active of plain.tex
    \chardef\CatInvalid=15

    \chardef\CatAtCode=\catcode`\@
    \chardef\CatUsCode=\catcode`\_
\fi

\catcode`\@=\CatLetter                  % top level macro file
\catcode`\_=\CatLetter

\begingroup
    \catcode`\$=\CatIgnore
    \catcode`\:=\CatIgnore
    \message{Text sperren, $Revision: 1.2 $}
\endgroup


\let\end_list=\relax
\edef\empty_list{\end_list}

\def\split#1#2\end_list{%
   \edef\sec_char{#1}%
   \toks@={#2\end_list}%
   }

\def\do_split{%
   \expandafter \split \the\toks@ \end_list
   }

\def\next_char{%
   \edef\first_char{\sec_char}%
   \do_split
   }



\newdimen\sperr_width

\def\sperr#1#2{%        % Text, Sperrbreite
   \toks@={#1\end_list}%
   \sperr_width=#2\relax
   \do_split
   \next_char           % initialize pipeline
   \ifx \sec_char\empty_list  #1%     % nur 1 Zeichen
   \else  \do_sperr
   \fi
   }


\newif \if@loop

\def\do_sperr{%
   \loop
      \set_char         % Zeichen und nachfolgendes Kerning setzen
      \next_char
      \ifx \sec_char\empty_list
         \first_char
         \@loopfalse
      \else  \@looptrue
      \fi
      \if@loop
   \repeat
   }




\newbox\kern_box
\newdimen\kern_width

\def\set_char{%
   \setbox\kern_box=\hbox{\first_char\sec_char}%
   \kern_width=\wd\kern_box
   \setbox\kern_box=\hbox{\hbox{\first_char}\hbox{\sec_char}}%
   \advance \kern_width by -\wd\kern_box
   \advance \kern_width by \sperr_width
   \first_char \kern\kern_width
   }




\catcode`\@=\CatAtCode
\catcode`\_=\CatUsCode



\endinput