%%%%%%%%%%%%%%%%%%%%%%%%%%% ascan.sty %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % ascan.sty % ArabTeX % Standard Scanner % 22.08.2003 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % (c) Klaus Lagally % Institut fuer Formale Methoden der Informatik % Universitaet Stuttgart %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \a@ident {ascan.sty} {3.11 standard ZDMG input encoding } {22.08.2003} \chardef \testatcode = \catcode`\@ \catcode`\@ = 11 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % dynamic definitions for Arabic {\catcode `\^ 7 \catcode `\ =9 \catcode `\^^M=9 \catcode `\^^I=9 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \gdef \seta@codes {% define standard \ArabTeX input coding \globaldefs=1 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \def \sc@@ {@} % illegal character \def \sc@a {a} \def \sc@b {b} \def \sc@c {\ift@rk G\else \ifs@nd J\else \ifm@lay J\else c\fi\fi\fi } \def \sc@d {d} \def \sc@e {e} \def \sc@f {\ifm@gh \n@xp \a@F \else f\fi } \def \sc@g {\ifm@lay \n@xp \a@K \else g\fi } \def \sc@h {h} \def \sc@i {i} \def \sc@j {\ift@rk j\else G\fi } \def \sc@k {\ifs@nd \n@xp \a@ax \else \ifk@fs \n@xp \a@k \else k\fi\fi } \def \sc@l {l} \def \sc@m {m} \def \sc@n {n} \def \sc@o {o} \def \sc@p {\ifm@lay v\else p\fi } \def \sc@q {\ifm@gh \n@xp \a@Q \else q\fi } \def \sc@r {r} \def \sc@s {s} \def \sc@t {t} \def \sc@u {u} \def \sc@v {\ifm@gh \n@xp \a@V \else \ift@rk w\else \ifm@lay \n@xp \a@x \else v\fi\fi\fi } \def \sc@w {\ifu@gh \n@xp \a@X \else w\fi } \def \sc@x {X} \def \sc@y {y} \def \sc@z {z} \def \sc@A {A} \def \sc@B {B} \def \sc@C {@} \def \sc@D {@} \def \sc@E {E} \def \sc@F {@} \def \sc@G {\n@xp \a@g } % Pashto gaf with ring \def \sc@H {\n@xp \a@H } % Heh marbouta \def \sc@I {I} \def \sc@J {@} \def \sc@K {K} \def \sc@L {@} \def \sc@M {M} \def \sc@N {N} \def \sc@O {O} \def \sc@P {@} \def \sc@Q {@} \def \sc@R {@} \def \sc@S {\n@xp \a@S } \def \sc@T {T} \def \sc@U {U} \def \sc@V {v} \def \sc@W {W} \def \sc@X {@} \def \sc@Y {Y} \def \sc@Z {@} \a@digits = {0123456789} \a@paren = {()[]} \global\a@first = {.^_-'`~,|"=:\a@tok \lq \rq \cap \MIN \IN } \globaldefs=0 } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% }% end of dynamic definitions for Arabic %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \def \a@@scan #1>{% standard scanner call: token sequence -> \a@tokens \iftest@scan \tracingmacros = 1 \ifshow \else \a@verb #1>\fi\fi \global\def \a@rest {}\global\a@tokens = {}\sc@beg #1\@ \@@ \iftest@scan \tracingmacros = 0 % \xpa \a@verb \xpa (\the\a@tokens )>\fi } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% {\arab@codes % because of special characters \gdef \set@next #1{\def \next {#1}} \gdef \t@b@g #1{% start \ArabTeX scanner \def \next {\sc@word {#1}}\def \sc@char {@}% \ifcat a\nxp #1\else % letter \apply \set@next \tocase #1\of { \@{\sc@endscan } % finished '{\t@rquote } `{\t@lquote } \default {\sc@word {#1}} }\endcase \fi \next } \gdef \t@w@rd #1{% transform input into internal notation \def \next {\sc@word }% \ifx #1\@\def \next {\sc@endscan }\else % finished \ifcat \nxp #1a% \ifx #1a\def \next {\t@aa }\else % test for aa -> A \ifx #1n\def \next {\t@nn }\else % test for ng, ny \edef \sc@char {\csname sc@#1\endcsname }% letter \ifx \sc@char \relax \def \sc@char {#1}% undef letter \fi \ifs@nd \edef \next {\nxp \t@asp {\sc@char }}\else \sc@put \fi \fi\fi \else % other character \ifcat \nxp #1\relax \def \next {\t@cs #1}\else % control sequence \ifx #1'\def \next {\t@hamza }\else % hamza \def \sc@char {#1}% \apply \set@next \tocase #1\of {~\@ldtie{\t@tie } .{\t@dot } ,{\t@comma } -{\t@minus } `{\t@ain } "{\t@dquote } :={\t@colon } ^{\t@up } _{\t@down } |{\t@bar } \default {\t@w@@rd {#1}} }\endcase \fi\fi\fi\fi \next } \gdef \t@w@@rd #1{% default branch \ifcat \nxp #1\nxp ~\def \next {\t@cs #1}% % active character \else \def \sc@char {\nxp #1}% % other character \ifs@nd \edef \next {\nxp \t@asp {\sc@char }}% \else \sc@put \def \next {\sc@word }% \fi \fi \next } } % \arab@codes %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \def \set@char@next #1#2{\def \sc@char {#1}\def \next {#2}} \def \set@@c@n #1{\set@char@next #1} \def \t@cs #1{% control sequence within a word; push back \apply \set@@c@n \tocase #1\of { \a@tok \MIN \IN \cap \shadda \madda \sukun \raphe \dagesh \mappiq \ldot \rdot \cdot {{#1} {\csname t@\xpa\@gobble\string #1\endcsname }} \maqqef {{B} {\sc@put \sc@word }} \, {{"|} {\sc@put \sc@word }} \lq {{`} {\sc@put \sc@word }} \c@p {{\nxp \cap } {\sc@put \sc@word }} \abbr {{'} {\sc@put \sc@word }} \rq {{'} {\sc@put \sc@back }} \default {{#1} {\sc@back #1}}% }\endcase \next } \def \tdef #1{% define robust ArabTeX scanner command \def #1{\nxp #1}% \xpa\def \csname t@\xpa\@gobble\string #1\endcsname } \tdef \a@tok (#1){% direct substitution \global \a@tokens \xpa {\the\a@tokens #1}\sc@word } \tdef \MIN {\def \sc@char {\nxp\a@ao \nxp\a@Zi }\sc@put \sc@word } \tdef \IN {\def \sc@char {\nxp\a@ai \nxp\a@Zi }\sc@put \sc@word } \tdef \shadda {\sc@dep {\nxp \a@Ze }} \tdef \madda {\sc@dep {\nxp \a@ZE }} \tdef \sukun {\sc@dep {\nxp \a@e }} \tdef \raphe {\sc@dep {\nxp \a@Zo }} \tdef \dagesh {\sc@dep {\nxp \a@Zu }} \tdef \mappiq {\sc@dep {\nxp \a@Zu }} \tdef \ldot {\sc@dep {\nxp \a@Za }} \tdef \rdot {\sc@dep {\nxp \a@Ze }} \def \t@cdot {\sc@dep {\nxp \a@Zi }} \def \t@cap #1{\sc@word \c@p #1} % kill braces on #1 \def \sc@@back #1\@ \@@ {% end scanning, push back into input \global\def \a@rest {#1}\global\let \test@token \test@rest } \def \sc@@endscan \@@ {\global\let \a@scan \a@@scan } \def \sc@dep #1{% deposit tokens and proceed \def \sc@char {#1}\sc@put \sc@word } \def \sc@put {% deposit a symbol % no group! \edef \temp {\global \nxp \a@tokens % \temp {\the\a@tokens \sc@char }}\temp } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \def \t@rquote #1#2{% context '#1#2 , initial \ifh@mza \ifx #1\@ \def \sc@char {QQ}\sc@put % '> \def \next {\sc@endscan #2}\else \ifx #1'\ifx #2\@ \def \sc@char {'}\sc@put \def \next {\sc@word #2}% ''> \else \def \sc@char {QQ}\sc@put \def \sc@char {Q}% \def \next {\sc@word '#2}% ''x \fi \else \def \sc@char {QQ}\sc@put \def \sc@char {Q}% \def \next {\sc@word #1#2}% 'xy \fi\fi \else \ifu@gh \def \sc@char {QY}\sc@put \else \def \sc@char {Q}\sc@put \fi \def \next {\sc@word #1#2}% \fi \next } \def \t@hamza #1{% context \sc@char ' #1 \ifh@mza % not verbatim mode \ifx #1'\let \next \t@hamza@ii \else \ifcat -\sc@char \def \sc@char {QQ}\sc@put \else \xpa\def \xpa\sc@char \xpa{\xpa Q\sc@char }\sc@put \fi \def \sc@char {Q}\def \next {\sc@word #1}% \fi \else % verbatim mode \ifx #1'\def \sc@char {'}\sc@put \let \next \sc@word \else \ifu@gh \def \sc@char {QY}\sc@put \else \def \sc@char {Q}\sc@put \fi \def \next {\sc@word #1}% \fi \fi \next } \def \t@hamza@ii #1#2{% context \sc@char '' #1 #2 \ifcat \nxp #1a% \edef \sc@toks {\the\a@tokens Q\sc@char QQ}% \global \a@tokens =\xpa {\sc@toks }\def \sc@char {Q}% \else \ifcat \nxp #2a% \edef \sc@toks {\the\a@tokens Q\sc@char QQ}% \global \a@tokens =\xpa {\sc@toks }\def \sc@char {Q}% \else \def \sc@char {'}\sc@put % right quote \fi\fi \sc@word #1#2} \def \t@dquote #1{% verbatim \ifx #1'\ifh@mza \def \sc@char {"QQ}\sc@put \else \def \sc@char {"Q}\sc@put \fi \def \sc@char {Q}\let \next \sc@word \else \def \sc@char {"}\sc@put \def \next {\sc@word #1}% \fi \next } \def \t@ain {% ` = `ain \def \sc@char {P}\sc@put \sc@word } \def \t@lquote #1#2{% context `#1#2 at the beginning of a word \ifx #1`\def \sc@char {`}\sc@put \def \next {\sc@word #2}% ``x \else \def \sc@char {P}\sc@put \def \next {\sc@word #1#2}% `xy \fi \next } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \def \t@aa #1{% aa -> A \edef \@tempa {\sc@char }% \xpa\ifx \@tempa Q\def \next {\sc@word #1}\def \sc@char {a}\else \ifx #1a\def \sc@char {A}\def \next {\sc@word }\else \edef \sc@char {\sc@a }\def \next {\sc@word #1}% \fi\fi \sc@put \next } \def \t@nn #1{% after n \def \sc@char {n}\def \next {\sc@word }% \ifm@lay \ifx #1g\def \sc@char {\nxp \a@p }\else \ifx #1y\def \sc@char {\nxp \a@am }\else \def \next {\sc@word #1}% \fi\fi \else \def \next {\sc@word #1}% \fi \sc@put \next } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \def \t@minus #1{% after - \ifx #1-\def \sc@char {B}\def \next {\sc@word }\else \def \sc@char {-}\def \next {\sc@word #1}% \fi \sc@put \next } \def \t@bar #1{% after | \ifx #1|\def \next {\sc@word \,}\else \def \sc@char {|}\sc@put \def \next {\sc@word #1}% \fi \next } \def \set@char #1{\def \sc@char {#1}} \def \t@tail #1#2{% default exit \ifx \sc@char \empty \set@char {#1}\def \next {\sc@put \sc@word #2}% \else \def \next {\edef \temp {\nxp \t@asp {\sc@char }}\temp }% \fi \next } \def \t@dot #1{% after . \apply \set@char \tocase #1\of { a{\ifk@sh \nxp \a@Za \else \nxp \a@A \fi } b{\nxp \a@b } c{c} d{D} e{\nxp \a@I } f{\nxp \a@f } g{R} h{H} i{\nxp \a@e } k{\ift@rk q\else \nxp \a@k \fi } l{\nxp \a@l } n{\ifp@sht \nxp \a@m \else \ifs@nd \nxp \a@an \else \nxp \a@n \fi\fi } o{\ifk@sh \nxp \a@Zo \else \nxp \a@O \fi } p{\nxp \a@f } r{\ifs@nd \nxp \a@ar \else \nxp \a@R \fi } s{S} t{V} u{\ifk@sh \nxp \a@Zu \else \nxp \a@U \fi } v{\nxp \a@b } y{\nxp \a@ZI } z{Z} A{\nxp \a@ZA } O{\nxp \a@ZO } U{\nxp \a@ZU } Z{\nxp \a@Zz } T{Y} }\endcase \t@tail .#1} \def \t@comma #1{% after , \apply \set@char \tocase #1\of { a{a\nxp \a@H } A{\nxp \a@a \nxp \a@H } c{\ift@rk J\else \nxp \a@c \fi } d{\ifp@sht \nxp \a@aA \else \ifs@nd \nxp \a@D \else \nxp \a@d \fi\fi } e{e\nxp \a@H } g{\nxp \a@L } h{\nxp \a@h } n{\ifs@nd \nxp \a@an \else \nxp \a@M \fi } r{\ifp@sht \nxp \a@q \else \ifs@nd \nxp \a@ar \else \nxp \a@r \fi\fi } s{\ift@rk x\else \nxp \a@s \fi } t{\ifp@sht \nxp \a@v \else \ifs@nd \nxp \a@at \else \nxp \a@t \fi\fi } z{\ift@rk D\else \nxp \a@z \fi } }\endcase \t@tail ,#1} \def \t@up #1{% after ^ \apply \set@char \tocase #1\of { c{J} d{\nxp \a@D } e{\nxp \a@E } g{\ift@rk \nxp \a@p \else \ifk@rd R\else \ifu@gh R\else G\fi\fi\fi } l{\nxp \a@l } n{\ifs@nd \nxp \a@ag \else \ifm@lay M\else K\fi\fi } s{x} u{U} z{j} }\endcase \t@tail ^#1} \def \t@down #1{% after _ \apply \set@char \tocase #1\of { a{\nxp \a@a } A{Y} d{F} e{\nxp \a@E } h{X} i{\nxp \a@i } k{R} o{\nxp \a@o } O{\nxp \a@O } s{C} t{C} u{\nxp \a@u } U{\nxp \a@o } z{F} }\endcase \t@tail @#1} \gdef \t@colon #1{% after = or : \apply \set@char \tocase #1\of { a{\ifu@gh \nxp \a@H \else \nxp \a@A \fi } b{\nxp \a@ab } d{\nxp \a@ae } e{\nxp \a@I } g{\nxp \a@ak } i{\nxp \a@I } j{\nxp \a@ah } I{\nxp \a@e } n{\nxp \a@al } o{\ifu@gh \nxp \a@W \else \nxp \a@O \fi } s{\nxp \a@aJ } O{\nxp \a@P } t{V} u{\ifu@gh \nxp \a@aw \else \nxp \a@U \fi } U{\nxp \a@w } z{D} }\endcase \t@tail :#1} \gdef \t@colon #1{% after = or : \apply \set@char \tocase #1\of { a{\nxp \a@A } b{\nxp \a@ab } d{\nxp \a@ae } e{\nxp \a@I } g{\nxp \a@ak } i{\nxp \a@I } j{\nxp \a@ah } I{\nxp \a@e } n{\nxp \a@al } o{\nxp \a@O } s{\nxp \a@aJ } O{\nxp \a@P } t{V} u{\nxp \a@U } U{\nxp \a@w } z{D} }\endcase \t@tail :#1} \def \t@tie #1{% after ~ \apply \set@char \tocase #1\of { l{\nxp \a@l } g{\nxp \a@p } n{\ifs@nd \nxp \a@ag \else \ifm@lay M\else K\fi\fi } }\endcase \t@tail ^#1} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \def \t@asp #1#2{% test for hah \ifs@nd \ifx #2h\def \next {\t@@asp {#1}}% \else \def \next {\sc@put \sc@word #2}% \fi \else \def \next {\sc@put \sc@word #2}% \fi \next } \def \t@@asp #1{% test for aspiration \apply \set@char \tocase #1\of { b{\nxp \a@ap } c{J} d{\nxp \a@ad } p{\nxp \a@aq } k{\ifs@nd \nxp \a@k \else X\fi } t{\nxp \a@ac } J{\nxp \a@aj } \a@D{\nxp \a@af } \a@at{\nxp \a@T } \a@ax{\nxp \a@k } }\endcase \ifx \empty \sc@char \def \sc@char {\nxp #1}\def \next {\sc@word h}% \else \def \next {\sc@word }% \fi \sc@put \next } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % preparations for additional scanners \def \setcode #1{% switch the input encoding \lowercase {\def \sc@code {#1}% \ifx \sc@code \sc@oldcode \else \begingroup \def \sc@lookup ##1#1##2##3\@@ {\endgroup ##2}% \xpa \sc@lookup \sc@table #1\sc@default \@@ \fi }% \let \sc@oldcode \sc@code } \pdef \stdcode #1{% prepare temp switch to standard \let \a@oldcode \sc@code \sc@standard \test@token #1 \@stdcode } \def \a@c@@stdcode {\xpa\setcode\xpa{\a@oldcode }} \all@w@ne \stdcode \xpa \all@w@ne \csname stdcode \endcsname \def \sc@table {% table of code names standard\sc@standard arabtex\sc@standard } \def \sc@restore {% restore scanner defaults \let \vocalize \v@calize \let \fullvocalize \fullv@calize \let \sc@beg \t@b@g \let \sc@word \t@w@rd \let \sc@back \sc@@back \let \sc@endscan \sc@@endscan \let \a@scan \a@@scan \seta@codes \let \arab@codes \a@arab@codes \let \unarab@codes \a@unarab@codes } \def \sc@standard {\sc@restore % standard encoding \ifx \sc@code \sc@oldcode \else \a@message {input encoding set to ArabTeX standard conventions.}\fi } \def \sc@default {\sc@restore % unknown encoding \a@message {unknown input encoding `\sc@code'; ArabTeX standard encoding is assumed.}} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \a@message {scanner for code `arabtex' installed.} \let \sc@oldcode \@ \setcode {standard} % default \endinput %%%%%%%%%%%%%%%%%%%%%%%% EOF %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%