1%%%%%%%%%%%%%%%%%%%%%%%%%%% utfcode.sty %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 2% utfcode.sty 3% scanner module for the Arabic and Hebrew segments of UTF-8 4% loaded and called by utf8.sty 5% 07.03.2002 6%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 7% (c) Klaus Lagally 8% Institut fuer Informatik 9% Universitaet Stuttgart 10%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 11 12\catcode`\@ = 11 13 14\a@ident {utfcode.sty} {3.10a Arabic+Hebrew segment of UTF-8} {07.03.2002} 15 16\newcount \u@lb \newcount \u@lq 17 18\newif \ifa@quote 19 20\def \utfc@scan #1>{% modified scanner call: token sequence -> \a@tokens 21\iftest@scan \tracingmacros = 1 \fi 22\global\def \a@rest {}\global\a@tokens = {}\def \sc@char {}% 23\utf@beg #1\@ \@ \@ \@@ % transform 24\iftest@scan \tracingmacros = 0 \xpa \a@verb \xpa (\the\a@tokens )>\fi } 25 26\def \utf@beg #1#2{% start UTF-8 scanner 27\h@mzafalse \iz@fetfalse \novocalize % because of explicit quoting 28 \@ssimfalse 29 \def \next {\utf@word #1#2}% 30\ifnum `#1="D8 \ifnum `#2="27 \def \next {\utf@alif }\fi \else 31%\ifx #1"\def \next {\utf@lquote #2}\else 32\ifx #1/\global \a@tokens ={#1}\def \next {\utf@word #2}\else % x> 33%\fi 34\fi\fi \next } 35 36{\catcode `\^ 7 \catcode `\^^M=13 37\gdef \utf@word #1#2{% transform input into internal notation 38\ifx #1\@ \def \next {\utf@end #2}\else % finished 39\ifx #1-\def \next {\utf@minus #2}\else % 40%ifx #1"\def \next {\utf@rquote #2}\else % 41\ifx #1/\def \next {\sc@back #1#2}\else % 42%\if \nxp ^^M\nxp #1\def \next {\utf@par #2}\else % active character 43\ifnum `#1="D6 \def \next {\utf@dvi #2}\else % 44\ifnum `#1="D7 \def \next {\utf@dvii #2}\else % 45\ifnum `#1="D8 \def \next {\utf@dviii #2}\else % 46\ifnum `#1="D9 \def \next {\utf@dix #2}\else % 47\ifnum `#1="DA \def \next {\utf@da #2}\else % 48\ifnum `#1="DB \def \next {\utf@db #2}\else % 49 \def \next {\utf@asci #1#2}% 50\fi\fi\fi\fi\fi\fi % 51%\fi\fi 52\fi\fi\fi \next }% 53% 54\gdef \utf@word #1{% transform input into internal notation 55\ifx #1\@ \def \next {\utf@end }\else % finished 56\ifx #1-\def \next {\utf@minus }\else % 57\ifx #1/\def \next {\sc@back #1}\else % 58\ifnum `#1="D6 \def \next {\utf@dvi }\else % 59\ifnum `#1="D7 \def \next {\utf@dvii }\else % 60\ifnum `#1="D8 \def \next {\utf@dviii }\else % 61\ifnum `#1="D9 \def \next {\utf@dix }\else % 62\ifnum `#1="DA \def \next {\utf@da }\else % 63\ifnum `#1="DB \def \next {\utf@db }\else % 64 \def \next {\utf@asci #1}% 65\fi\fi\fi\fi\fi\fi % 66\fi\fi\fi \next }% 67} % catcode 13 68 69\def \utf@end #1\@@ {\relax } 70 71\def \utf@next {% save and deposit character 72\sc@put \utf@word } 73 74\def \utf@asci #1{% deposit ASCII item 75\def \sc@char {#1}\utf@next } 76 77{\catcode `\% 12 \gdef \a@pc {%}} 78 79%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 80 81\def \utf@dvi #1{% segment D6 82 \u@lb `#1\relax \advance \u@lb -128 83 \u@lq \u@lb \divide \u@lq 8 84 \edef \sc@char {}% 85\ifcase \u@lq \or \or \or \or \or 86\or \advance \u@lb -48 \edef \sc@char 87 {\ifcase \u@lb 88 "\n@xp\a@e\or "\n@xp\a@I\or "\n@xp\a@A\or "\n@xp\a@O\or 89 "i\or "\n@xp\a@E\or "e\or "a\or 90 \fi }% 91\or \advance \u@lb -56 \edef \sc@char 92 {\ifcase \u@lb 93 "A\or "\n@xp\a@o\or L\or "u\or 94 "\n@xp\a@Zu\or |\or B\or "\n@xp\a@Zo\or 95 \fi }% 96\fi \utf@next } 97 98%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 99 100\def \utf@dvii #1{% segment D7 101 \u@lb `#1\relax \advance \u@lb -128 102 \u@lq \u@lb \divide \u@lq 8 103\ifcase \u@lq \edef \sc@char 104 {\ifcase \u@lb 105 K\or "\n@xp\a@Ze\or "\n@xp\a@Za\or :\or "\n@xp\a@Zi\or \or \or \or 106 \fi }% 107\or \advance \u@lb -8 \edef \sc@char {}% 108\or \advance \u@lb -16 \edef \sc@char 109 {\ifcase \u@lb 110 Q\or b\or g\or d\or h\or w\or z\or X\or 111 \fi }% 112\or \advance \u@lb -24 \edef \sc@char 113 {\ifcase \u@lb 114 C\or y\or k\or k\or l\or m\or m\or n\or 115 \fi }% 116\or \advance \u@lb -32 \edef \sc@char 117 {\ifcase \u@lb 118 n\or s\or P\or p\or p\or S\or S\or q\or 119 \fi }% 120\or \advance \u@lb -40 \edef \sc@char 121 {\ifcase \u@lb 122 r\or \n@xp\a@S \or t\or \or \or \or \or \or 123 \fi }% 124\or \advance \u@lb -48 \edef \sc@char 125 {\ifcase \u@lb 126 w\n@xp\a@U w\or wy\or y\n@xp\a@U y\or '\or 127 ''\or \or \or \or 128 \fi }% 129\or \advance \u@lb -56 \edef \sc@char 130 {\ifcase \u@lb 131 \or \or \or \or \or \or \or "|\or 132 \fi }% 133\fi \utf@next } 134 135%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 136 137\def \utf@dviii #1{% segment D8 138 \u@lb `#1\relax \advance \u@lb -"80 139 \u@lq \u@lb \divide \u@lq 8 140\ifcase \u@lq \edef \sc@char {}% 141\or \advance \u@lb -8 \edef \sc@char {\ifcase \u@lb 142 \or \or \or \or ,\or \or \or \or \fi }% 143\or \advance \u@lb -"10 \edef \sc@char {}% 144\or \advance \u@lb -"18 \edef \sc@char {\ifcase \u@lb 145 \or \or \or ;\or \or \or \or ?\or \fi }% 146\or \advance \u@lb -"20 \edef \sc@char {\ifcase \u@lb 147 \or Q|\or QA\or Qa\or Qw\or Qi\or Qy\or A\or \fi }% 148\or \advance \u@lb -"28 \edef \sc@char {\ifcase \u@lb 149 b\or T\or t\or C\or G\or H\or X\or d\or \fi }% 150\or \advance \u@lb -"30 \edef \sc@char {\ifcase \u@lb 151 F\or r\or z\or s\or x\or S\or D\or V\or \fi }% 152\or \advance \u@lb -"38 \edef \sc@char {\ifcase \u@lb 153 Z\or P\or R\or \or \or \or \or \or \fi }% 154\fi \utf@next } 155 156%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 157 158\def \utf@dix #1{% segment D9 159 \u@lb `#1\relax \advance \u@lb -"80 160 \u@lq \u@lb \divide \u@lq 8 161\ifcase \u@lq \edef \sc@char {\ifcase \u@lb 162 B\or f\or q\or k\or l\or m\or n\or h\or \fi }% 163\or \advance \u@lb -8 \edef \sc@char {\ifcase \u@lb 164 w\or Y\or y\or "aN\or "uN\or "iN\or "a\or "u\or \fi }% 165\or \advance \u@lb -"10 \edef \sc@char {\ifcase \u@lb 166 "i\or "\n@xp\a@Ze\or ""\or "\n@xp\a@ZE\or 167 "\n@xp\a@Za\or "\n@xp\a@Zu\or \or \or \fi }% 168\or \advance \u@lb -"18 \edef \sc@char {}% 169\or \advance \u@lb -"20 \edef \sc@char {\ifcase \u@lb 170 0\or 1\or 2\or 3\or 4\or 5\or 6\or 7\or \fi }% 171\or \advance \u@lb -"28 \edef \sc@char {\ifcase \u@lb 172 8\or 9\or \a@pc\or \f@sila\or 173 \f@sila\or *\or \or \or \fi }% 174\or \advance \u@lb -"30 \edef \sc@char {\ifcase \u@lb 175 "\n@xp\a@a\or "\or "\n@xp\a@ZA\or "\n@xp\a@ZU\or 176% N"\n@xp\a@Za\or Qa\or Qw\or Qw"u\or \fi }% 177N"\n@xp\a@Za\or N"\n@xp\a@Za A\or N"\n@xp\a@Za w\or N"\n@xp\a@Za w"u\or \fi }% 178\or \advance \u@lb -"38 \edef \sc@char {\ifcase \u@lb 179% Qy\or \n@xp\a@t\or \n@xp\a@T\or \n@xp\a@ab\or 180 N"\n@xp\a@Za Y\or \n@xp\a@t\or \n@xp\a@T\or \n@xp\a@ab\or 181 \n@xp\a@v\or \n@xp\a@at\or p\or \n@xp\a@ac\or \fi }% 182\fi \utf@next } 183 184%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 185 186\def \utf@da #1{% segment DA 187 \u@lb `#1\relax \advance \u@lb -"80 188 \u@lq \u@lb \divide \u@lq 8 189\ifcase \u@lq \edef \sc@char {\ifcase \u@lb 190 \n@xp\a@ap\or c\or \n@xp\a@G\or \n@xp\a@ag\or 191 \n@xp\a@ah\or \n@xp\a@c\or J\or \n@xp\a@aj\or \fi }% 192\or \advance \u@lb -8 \edef \sc@char {\ifcase \u@lb 193 \n@xp\a@d\or \n@xp\a@aA\or \n@xp\a@D\or \n@xp\a@aB\or 194 \n@xp\a@ad\or \n@xp\a@af\or \n@xp\a@aC\or \n@xp\a@ae\or \fi }% 195\or \advance \u@lb -"10 \edef \sc@char {\ifcase \u@lb 196 \n@xp\a@aD\or \n@xp\a@r\or \n@xp\a@aF\or \n@xp\a@q\or 197 \n@xp\a@aG\or \n@xp\a@R\or \n@xp\a@z\or \n@xp\a@aH\or \fi }% 198\or \advance \u@lb -"18 \edef \sc@char {\ifcase \u@lb 199 j\or \n@xp\a@ar\or \n@xp\a@s\or \n@xp\a@aJ\or 200 \n@xp\a@aK\or \n@xp\a@aL\or \n@xp\a@aM\or \n@xp\a@aO\or \fi }% 201\or \advance \u@lb -"20 \edef \sc@char {\ifcase \u@lb 202 \n@xp\a@p\or \n@xp\a@f\or \n@xp\a@F\or \n@xp\a@aP\or 203 v\or \n@xp\a@V\or \n@xp\a@aq\or \n@xp\a@aQ\or \fi }% 204\or \advance \u@lb -"28 \edef \sc@char {\ifcase \u@lb 205 \n@xp\a@aR\or \n@xp\a@k\or \n@xp\a@ax\or \n@xp\a@g\or 206 \n@xp\a@L\or K\or \n@xp\a@aS\or g\or \fi }% 207\or \advance \u@lb -"30 \edef \sc@char {\ifcase \u@lb 208 \n@xp\a@J\or \n@xp\a@al\or \n@xp\a@aT\or \n@xp\a@ak\or 209 \n@xp\a@M\or \n@xp\a@l\or \n@xp\a@aW\or \n@xp\a@aX\or \fi }% 210\or \advance \u@lb -"38 \edef \sc@char {\ifcase \u@lb 211 \n@xp\a@aY\or \n@xp\a@aZ\or \n@xp\a@n\or \n@xp\a@an\or 212 \n@xp\a@m\or \n@xp\a@am\or h-\or \n@xp\a@aE\or \fi }% 213\fi \utf@next } 214 215%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 216 217\def \utf@db #1{% segment DB 218 \u@lb `#1\relax \advance \u@lb -"80 219 \u@lq \u@lb \divide \u@lq 8 220\ifcase \u@lq \edef \sc@char {\ifcase \u@lb 221 Qh\or \n@xp\a@h\or \n@xp\a@B\or \n@xp\a@j\or 222 \n@xp\a@aU\or \n@xp\a@aV\or \n@xp\a@W\or \n@xp\a@w\or \fi }% 223\or \advance \u@lb -8 \edef \sc@char {\ifcase \u@lb 224 \n@xp\a@aw\or \n@xp\a@au\or \n@xp\a@av\or \n@xp\a@X\or 225 Y\or L\or \n@xp\a@az\or \n@xp\a@x\or \fi }% 226\or \advance \u@lb -"10 \edef \sc@char {\ifcase \u@lb 227 \n@xp\a@Y\or \n@xp\a@y\or E\or \n@xp\a@ay\or 228 B\or \n@xp\a@H\or \or \or \fi }% 229\or \advance \u@lb -"18 \edef \sc@char {}% 230\or \advance \u@lb -"20 \edef \sc@char {}% 231\or \advance \u@lb -"28 \edef \sc@char {}% 232\or \advance \u@lb -"30 \edef \sc@char {\ifcase \u@lb 233 0\or 1\or 2\or 3\or 234 4\or 5\or 6\or 7\or \fi }% 235\or \advance \u@lb -"38 \edef \sc@char {\ifcase \u@lb 236 8\or 9\or \n@xp\a@aI\or \n@xp\a@aN\or 237 \n@xp\a@P\or \n@xp\a@ai"\n@xp\a@Zi\or 238 \n@xp\a@ao"\n@xp\a@Zi\or \or \fi }% 239\fi \utf@next } 240 241%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 242 243\def \utf@alif {% alif at the beginning of a word 244\def \sc@char {a}\sc@put \utf@word } 245 246\def \utf@minus {% hyphen between words 247\def \sc@char {-}\sc@put \utf@beg } 248%\def \sc@char {B}\sc@put \utf@beg } 249 250\def \utf@lquote {% left quote 251\ifa@quote \def \sc@char {'}\global\a@quotefalse 252\else \def \sc@char {`}\global\a@quotetrue 253\fi \sc@put \utf@beg } 254 255\def \utf@rquote {% right quote 256\global\a@quotefalse \def \sc@char {'}\sc@put \utf@word } 257 258\def \utf@par #1\@ \@@ {% new line, push back the rest 259\sc@back \\#1\@ \@@ } 260 261\def \utf@b@cs #1#2{% test word end 262\def \sc@char {#1}\sc@put 263%\ifx #2\@ \def \next {\sc@endscan #2}\else 264\ifx #2\@ \def \next {\utf@end #2}\else 265\ifcat -\nxp #2 \def \next {\utf@word #2}\else 266\def \next {\sc@back #2}\fi \fi \next } 267 268\def \utf@cs #1#2{% control sequence within a word; push back? 269\xpa \ifx #1\closegeresh \def \next {\utf@b@cs {\nxp \lq }#2}\else 270\xpa \ifx #1\closequote \def \next {\utf@b@cs {`}#2}\else 271 \def \next {\sc@back #1#2}% 272\fi\fi \next } 273 274%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 275 276\catcode `\@ = \utfatcode 277 278\endinput 279%%%%%%%%%%%%%%%%%%%%%%%% EOF %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 280