%%%%%%%%%%%%%%%%%%%%%%%%%%%%% arabtex.sty %%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% arabtex.sty 
% this is the driver module for the ArabTeX macro package
\def \theversion {3.11}
\def \thedatum {22.08.2003}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% (c) Klaus Lagally              EMail:  lagallyk@acm.org
%     Institut fuer Formale
%       Methoden der Informatik  TEL:    +49-711-7816-392
%     Universitaet Stuttgart     FAX:    +49-711-7816-370
%     Universitaetsstrasse 38
%     D-70569 Stuttgart          INFO: arabtex@informatik.uni-stuttgart.de
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% This program can be redistributed and/or modified under the terms
% of the LaTeX Project Public License distributed from CTAN
% archives in directory macros/latex/base/lppl.txt; either
% version 1 of the License, or (at your option) any later version.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\ifx \undefined \Lagally \else
\errhelp {ArabTex should be loaded *after* EDMAC (if applicable),^^J
but *before* any non-standard LaTeX packages or options.^^J
Correct your configuration and try again.}
\errmessage {Inconsistent configuration.^^J
The command `\string \undefined' has been redefined by some package.^^J
`\string \undefined' is defined as `\meaning \undefined'.^^J
This might utterly confuse ArabTeX which is therefore not loaded.^^J
}\fi

\ifx \ar@batcode \undefined \else \expandafter \endinput
\fi % load only once

\chardef \ar@batcode = \catcode`\@ \catcode`\@ = 11 \chardef \@other = 12
\chardef \ar@bdqcode = \catcode`\" \catcode`\" = 12 % for german.sty

%%%%%%%%%%%%%%%%%%%%%%%% auxiliary macros %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\def \ArabTeX {Arab\TeX }        

\let \xpa \expandafter        		\def \xxpa {\xpa \xpa \xpa }    
\def \xxxpa {\xpa \xxpa \xpa }

\let \nxp \noexpand             	\def \nxxp {\nxp \nxp \nxp }
\def \n@xp {\nxp \nxp \nxp }

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%% identify yourself %%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\input aconfig.sty % check environment

\let \a@wlog \wlog        	\def \wlog #1{\relax }

\a@ident {arabtex.sty} {\theversion \space ArabTeX main module} {\thedatum }

\UsePackage {arabaux}                % load auxiliary macros

%%%%%%%%%%%%%%%%%%% various declarations %%%%%%%%%%%%%%%%%%%%%

\newbox  \wordb@x       \newbox  \lineb@x       \newbox  \tempb@x
\newtoks \a@tokens      \newtoks \sc@next       \newtoks \sc@rest
\newtoks \a@@cmd        \newtoks \a@@name       \newtoks \a@@tail
\newtoks \a@digits      \newtoks \a@first       \newtoks \a@paren
\newtoks \a@@everypar   \newtoks \a@accent
\newskip \a@parindent   \newskip \a@parskip            
\newwrite \a@@err       \newwrite \a@@out
\newcount \tracingarab  \def \quiet {\tracingarab = 0 }

\newif \if@vocals       \newif \ifv@c           \newif \if@sukun
\newif \if@suk          \newif \if@wasla        \newif \if@was
\newif \if@high         \newif \ifacc@hi        \newif \ifa@vmode
\newif \ifa@space       \newif \iftr@ns         \newif \ifa@oldhmode

\newif \iftest                 % \testtrue % for internal use only
\newif \iftest@scan     \newif \iftest@trans
\newif \iftest@parse    \newif \iftest@write
\newif \iftest@command  \newif \iftest@font

\newif \ifnewfont	\newif \ifaRL

%%%%%%%%%%%%%%%%%%% language specific switches %%%%%%%%%%%%%%%%%%%%%

%% beware of moving arguments!

\newif \ifarab     % generate the arabic script
\newif \ifshow     % display the input text verbatim
\newif \ifligs     % set all ligatures active
\newif \ifspread   % spread characters by keshide
\newif \iftrans    % generate the transliteration

%newif \ifRL       % alias for \ifarab
\let \RLtrue \arabtrue         \let \RLfalse \arabfalse

% internal switches

\newif \ifaN@alif          % tanwin on alif
\newif \ifqur@n            % old hamza rules
\newif \ifh@mza            % hamza rules, assimilation
\newif \if@ssim            % assimilation
\newif \ifiz@fet           % izafet rules
\newif \ifyahd@ts          % yah with dots
\newif \ifk@fs             % final kaf without mark
\newif \iff@rsn            % Farsi numerals
\newif \ifk@sra            % Kasra always below char

\newif \ifp@sht            % loop chars, e as two dots, diphtongs
\newif \ifurd@             % e as long yah, urdu accent, two hah chars
\newif \ifm@gh             % variants of fah, vah and qaf
\newif \ift@rk             % special transliteration and coding
\newif \ifk@rd             % special transliteration and coding
\newif \ifs@nd             % special transliteration and coding
\newif \ifu@gh             % special transliteration and coding
\newif \ifm@lay            % special transliteration and coding
\newif \ifk@sh             % special transliteration and coding

\newif \ifn@arab           % load Arabic default

%%%%%%%%%%%%%%%%%%% various robust options %%%%%%%%%%%%%%%%%%%%%

\pdef \yahdots {\yahd@tstrue }           \pdef \yahnodots {\yahd@tsfalse }
\pdef \accentshigh {\acc@hitrue }        \pdef \accentslow {\acc@hifalse }
\pdef \oldtanwin {\aN@aliffalse }        \pdef \newtanwin {\aN@aliftrue }
\pdef \oldhamza {\qur@ntrue }            \pdef \newhamza {\qur@nfalse }

%%%%%%%%%%%%%%%%%%% various defaults %%%%%%%%%%%%%%%%%%%%%

\def \transtrue {% activate the transliteration
\iftr@ns \else \tr@zdmg \fi \let \iftrans \iftrue }

\let \tr@zdmg \relax                \n@arabtrue         

\def \arab@output {\ifx \a@lang \a@arab \else
\tr@ceoff % switch to Arabic output conventions
\def@arabchars         % define character macros for Arabic
\def@arabaccent % define accent macros for Arabic
\def@arabvoc         % define vowel parsing routines for Arabic
\def@arabstrut         % define strut for Arabic
\tr@zdmg        % define standard transliteration
\let \a@write \a@@write                \let \a@write@hook \relax
\tr@ceon \let \a@lang \a@arab \fi }

\def \a@arab {ARABIC}   \def \a@lang {NONE}

%%%%%%%%%%%%%%%%%%% ML-TeX compatibility (br) %%%%%%%%%%%%%%%%%%%%%

\newcount \arab@charsubdefmax        \arab@charsubdefmax \m@ne

\ifx \charsubdefmax \undefined 
        \csname newcount\endcsname \charsubdefmax
\else        % save actual \charsubdefmax value
        \arab@charsubdefmax=\charsubdefmax
             % restore it, when outputting a new box in \output routine
        \csname newtoks\endcsname \a@@output        \a@@output=\output
        \output={\charsubdefmax \arab@charsubdefmax \the\a@@output }
\fi

%%%%%%%%%%%%%%%%%%% language selection %%%%%%%%%%%%%%%%%%%%%

\def \all@false {% reset language code to default 
\k@rdfalse \t@rkfalse \m@ghfalse \urd@false \p@shtfalse 
\s@ndfalse \m@layfalse \u@ghfalse \k@srafalse
\h@mzafalse \@ssimfalse \iz@fetfalse \yahd@tsfalse \k@fsfalse \f@rsnfalse
\let \vocalize \v@calize    \let \fullvocalize \fullv@calize
\arab@output \catcode`\<=\active }

% all language selection commands are robust!

\pdef \setarab {% kaf with mark, hamza rules, yah with dots
\all@false \h@mzatrue \@ssimtrue \yahd@tstrue  \oldtanwin 
\def \a@defaultfont {\setnash }}

\pdef \setmaghribi {% variants of fah and qaf
\setarab \m@ghtrue  }

\pdef \setfarsi {% no kaf mark, yah without dots, izafet
\all@false \iz@fettrue \h@mzatrue \@ssimtrue \k@fstrue \f@rsntrue
\newtanwin \def \a@defaultfont {\setnast }}

\pdef \setkurdish {% no kaf mark, yah without dots, izafet
\setfarsi \k@rdtrue }

\pdef \setturk {% kaf with mark, yah without dots, izafet, hamza
\all@false \iz@fettrue \h@mzatrue \@ssimtrue \newtanwin \t@rktrue 
\def \a@defaultfont {\setnash }}

\pdef \seturdu {% two hah, long yah, urdu accent, long e, izafet
\all@false \iz@fettrue \h@mzatrue \@ssimtrue \k@fstrue \f@rsntrue
\newtanwin \urd@true  \def \a@defaultfont {\setnast }}

\pdef \setpashto {% pashto loop, e: two dots, izafet, hamza
\all@false \iz@fettrue \h@mzatrue \@ssimtrue \yahd@tstrue \k@fstrue  
\newtanwin \p@shttrue  \def \a@defaultfont {\setnast }}

\pdef \setbalut {% temporary
\setpashto}

\pdef \setsindhi {% switch language specific processing
\seturdu \h@mzafalse \ligsfalse \yahd@tstrue \s@ndtrue }% ALA-LC has dots!

%\seturdu \h@mzafalse \ligsfalse \yahd@tsfalse \s@ndtrue }% A.Pandey not

\pdef \setmalay {% p, ng, ny
\seturdu \yahd@tstrue \m@laytrue \def \a@defaultfont {\setnash }}

\pdef \setuighur {% switch language specific processing
\let \vocalize \novocalize    \let \fullvocalize \novocalize
\novocalize \@ssimfalse \h@mzafalse
\u@ghtrue \def \a@defaultfont {\setnash }}

\pdef \setkashmiri {% Kashmiri language mode
\seturdu \k@shtrue \newarabfont        \settrans{kashmiri}}

\pdef \setverb {% no special processing
\all@false \yahd@tstrue  \oldtanwin \def \a@defaultfont {\setnash }}

\pdef \setnone {\catcode`\<=\@other }% deselect arabic quotations

\pdef \setquot {\catcode`\<=\active }% select arabic quotations

\pdef \setnoquot {\catcode`\<=\@other }% deselect arabic quotations

%%%%%%%%%%%%%%%%%%%%%%% vowelization options %%%%%%%%%%%%%%%%%%%%%%%%

% must be robust!

\pdef \novocalize  {% no diacritics except explicitly indicated
\@vocalsfalse \v@cfalse \@sukunfalse \@sukfalse }

\pdef \v@calize    {% diacritics for short vowels only
\@vocalstrue \v@ctrue \@sukunfalse \@sukfalse }

\pdef \fullv@calize {% all diacritics
\@vocalstrue \v@ctrue \@sukuntrue \@suktrue }

\let \vocalize \v@calize    \let \fullvocalize \fullv@calize

%%%%%%%%%%%%%%%%%%%%%%%% robust font selection %%%%%%%%%%%%%%%%%%%%%%%%

\def \setarabfont #1{% define font switching
        \def \set@arabfont {\tr@ceoff #1\tr@ceon }}

\pdef \set@nash         {\setarabfont \nash }
\pdef \set@nashbf       {\setarabfont \nashbf }
\pdef \set@nast         {\setarabfont \nastaliq }
\pdef \set@xnash        {\setarabfont \xnash }
\pdef \set@xnashbf      {\setarabfont \xnashbf }

% presently no nastaliq font
\def \nastaliq {\nash }

\def \newarabfont {% switch to new ArabTeX fonts version
\setx@skels % activate new skeletons
\let \setnash     \set@xnash
\let \setnashbf   \set@xnashbf
\let \setnastaliq \set@xnash
\let \setnast     \set@xnash
\newfonttrue \setnash }

\def \oldarabfont {% switch to old ArabTeX fonts version
\seta@skels % activate old skeletons
\let \setnash     \set@nash
\let \setnashbf   \set@nashbf
\let \setnastaliq \set@nash
\let \setnast     \set@nash
\newfontfalse \setnash }

\def \a@defaultfont {\setnash }
\def \a@default     {\a@defaultfont }
\def \a@normalfont  {\a@defaultfont }

%%%%%%%%%%%%%%%%%%%%%%%% handling of special characters %%%%%%%%%%%%%%%

\def \a@arab@codes {% save and set special characters
\chardef \spc@de = \catcode`\         \catcode`\  = 10
\chardef \dqc@de = \catcode`\"        \catcode`\" = \@other                 
\chardef \lsc@de = \catcode`\<        \catcode`\< = \@other 
\csname originalTeX\endcsname % reset codes if BABEL is present
\arab@charsubdefmax \charsubdefmax \charsubdefmax \m@ne }

\def \a@unarab@codes {% reset catcodes
\catcode`\  = \spc@de \catcode`\< = \lsc@de \catcode`\" = \dqc@de 
\charsubdefmax \arab@charsubdefmax 
\csname germanTeX\endcsname }% reset codes if german.sty is present

\let \arab@codes \a@arab@codes        \let \unarab@codes \a@unarab@codes

%%%%%%%%%%%%%%%%%%%%%%% Arabic environment %%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\newif \ifin@arab % inside Arabic environment?

\def \arabtext {% environment for RTL formatting
\a@parparams 	% aoutput::a@parparams
\the\arabtext@hook \test@token }

\newtoks \arabtext@hook         

\arabtext@hook = {% initialize RTL environment
\in@arabtrue   \a@parindent \parindent   \a@parskip \parskip 
\edef \a@@font {\the\font }%
\ifhmode \a@oldhmodetrue \else \a@oldhmodefalse \fi
\a@vmodetrue      \a@@everypar {}%
\let \| \break    \def \\{\hfil \break }%    
\let \emphasize \underbar % define internal commands
\let \a@last@line \short@line    \let \a@put@line \put@line
\arab@codes \set@arabfont \@waslafalse \@wasfalse
\def \next@command {\test@special}}

\def \at@arabtext #1{% extend the initialization
\arabtext@hook \xpa{\the\arabtext@hook #1}}

\let \at@arabtex \at@arabtext % catch typo

\def \a@par {% close a RTL paragraph
\ifa@vmode \else % terminate last RTL line
\a@last@line \spreadfalse \a@vmodetrue
\parindent \a@parindent    \parskip \a@parskip 
\a@resetpar \a@par@hook    % aoutput::
\ifnum \tracingarab > 0 \message {##}\fi
\fi }

\let \a@@par \a@par % save for \a@@everypar in \a@c@autopar

\def \endarabtext {% close RTL environment
\a@last@line 
\ifa@oldhmode \noindent \fi
\ifnum \tracingarab > 0 \message {||}\fi
\global \@ignoretrue }

\let \RLtext    \arabtext      \let \arabtex    \arabtext    % catch typo
\let \endRLtext \endarabtext   \let \endarabtex \endarabtext % catch typo

%%%%%%%%%%%%%%%%%%%%%%%%%% next token %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\a@accent = {\lq \rq \cap \MIN \IN \a@tok \shadda \madda \sukun 
  \raphe \dagesh \mappiq \ldot \rdot \cdot \maqqef \abbr \,}

{\catcode `\^^a0 12         \gdef \sp@ce {^^a0}
}% catcode ^^a0

\a@digits = {0123456789}             \a@paren  = {()[]}
\a@first  = {.^_-'`~,|"=:}        % default, scanner dependent

\def \test@@token {\iftest@command \tracingmacros 0 \fi
\let \a@@word \empty \get@token }

\def \get@token {\futurelet \next@token \test@space }

\let \test@token \test@@token        % get next token

\def \test@space {% check for LTR space 
\if \space \nxp\next@token \a@@putword \xpa\kill@space 
\else \xpa\next@command \fi }%	hook for acmd, aedpatch, arabext

\xpa\def \xpa\kill@space \space {% gobble LTR space
\futurelet \next@token \test@special }

\xpa\def \xpa\kill@sp@ce \sp@ce {% gobble RTL space
\futurelet \next@token \test@space }

\def \obey@space {% after control characters
\a@spacefalse \futurelet \next@token \obey@@space }

\def \obey@@space {% check for space after control character
\if \space \nxp\next@token \a@spacetrue \fi \test@space }

\def \test@rest {% continue after \control sequence in text
\global\let \test@token \test@@token                                % global!
\xpa \xpa \xpa \test@token \xpa \a@rest \space }

%%%%%%%%%%%%%%%%%%%%%% special cases %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\long\def \test@special #1{% check for special cases
\if \bgroup \nxp \next@token                    % arabic group
	\a@@putword \def \next {\arab@group {#1}}\else
\if \relax \nxp #1%                             % command
	\if\is@in@set #1\a@accent		% known to scanner
		\a@@append {#1}\def \next {\get@token }%
	\else 					% general command
		\a@@putword \def \next {\test@command #1}%
	\fi \else
\if \sp@ce \nxp \next@token			% RTL space
	\a@@putword \def \next {\get@token }\else
\ifcat \nxp ~\nxp #1%                           % active character
	\a@@putword \def \next {\test@command #1}\else
\if \nxp <\nxp #1\unarab@codes                  % Roman insert
	\a@@putword \let \next \test@insert \else
\ifx $#1\unarab@codes                           % Math insert
	\a@@putword \let \next \test@math 
\else \a@@append {#1}\def \next {\get@token}%	% normal case
\fi\fi\fi\fi\fi\fi \next }

\def \a@@putword {% process characters
\ifx \a@@word \empty \else
	\ifarab \putwordb@x {\xpa\arab@item \a@@word \@@ }\fi 
	\a@spacetrue \xpa\a@showinput \xpa{\a@@word }%
	\let \a@@word \empty
\fi }

\def \a@@append #1{% add character
\a@extend \a@@word {#1}}

%%%%%%%%%%%%%%%%%%%%%% Arabic word %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\def \arab@item #1#2\@@ {% split the word if necessary
\ifx \relax #1\relax \else                        % empty word
\ifx \relax #2\relax \a@rabwrite {#1}\else        % single character
\if\is@in@set #1\a@first 
        \a@rabwrite {#1#2}\else                   % start symbol: word
\if\is@in@set #1\a@digits 
        \a@split #1#2\@@ \else                    % digit: number
\if\is@in@set #1\a@paren 
        \arab@item #2\@@ \a@rabwrite {#1}\else    % parenthesis: test content
        \a@rabwrite {#1#2}%                       % normal case
\fi\fi\fi\fi\fi }

\def \a@rabwrite #1{% process an Arabic word (called within a group)
\tracingmacros 0                 % use \test@XXXtrue for testing !
  \a@scan #1>%                        % generate the token sequence
  \xpa \a@parse \the\a@tokens >%  split it into syllables and reverse
  \xpa \a@write \the\a@revwd >%   output the word
\ifnum \tracingarab > 2 \message {.}\fi }

%%%%%%%%%%%%%%%%%%%%%%%%%% Arabic commands %%%%%%%%%%%%%%%%%%%%%%%%%%%%

\gdef \a@c@last@ {\\}        \gdef \a@c@put@ {\|}        \gdef \a@c@par@ {\par }

{\catcode `\^ 7 \catcode `\^^M=\active \gdef \a@c@M {^^M}}

{\catcode `\ =\active\gdef\a@c@SP{ }}

\long \def \test@command #1{% check for special commands
\gdef \a@arg {#1}\let \next \test@token
\ifx \a@arg \a@c@par@ \a@@par \else                        % \par
\ifx \a@arg \a@c@M \a@@par \else                        % \obeylines
\ifx \a@arg \a@c@SP \else                                % \obeyspaces
\ifx \a@arg \a@c@last@ \a@last@line \else                % \\
\ifx \a@arg \a@c@put@ \a@put@line \else                        % \|
     \def \next {\a@command #1}% process the command inside "acmd.sty"
\fi\fi\fi\fi\fi \next }

%%%%%%%%%%%%%%%%%%%%%%%%%% Arabic groups %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\def \arab@group #1{% process the next group
\bgroup \initlineb@x
\def \end {\global \setbox1 \hbox {\unhbox \lineb@x}%
\egroup \putwordb@x {\unhbox1 }\a@spacetrue \test@token }% last line
\test@token #1 \end }

\def \a@sequence #1{% put a sequence of words into a \hbox
\bgroup \transfalse \showfalse \let \end \relax 
\let \a@last@line \finish@line \let \a@put@line \break@line
\def \next@command {\test@special}\let \put@word \addt@line
\initlineb@x \test@token #1 \end \box\lineb@x \egroup }

%%%%%%%%%%%%%%%%%%%%%%%%%% arabic number %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\def \a@split #1#2\@@ {% next word starts with digit
\ifx \relax #2\relax \a@rabwrite {#1}\else
        \def \a@body {}\def \a@number {#1}\a@splitnumber #2\@@ 
        \xpa \a@rabwrite \xpa {\a@body }%
\fi }

%{\catcode `\B =12 \gdef \f@sila {B}}         % cf. awrite::ac@other
%{\catcode `\C =12 \gdef \h@phen {C}}

\def \a@splitnumber #1#2\@@ {% process word starting with digit
\if\is@in@set #1\a@digits \edef \a@number {#1\a@number }\else 
\ifx -#1\edef \a@number {\h@phen \a@number }\else 
\ifx /#1\edef \a@number {/\a@number }\else 
\ifx ,#1\ifx \relax #2\relax
        \edef \a@body {\a@body \a@number #1}\def \a@number {}%
        \else \edef \a@number {\f@sila \a@number }\fi 
\else \edef \a@body {\a@body \a@number #1}\def \a@number {}%
\fi\fi\fi\fi
\ifx \relax #2\relax \edef \a@body {\a@body \a@number}\let \next \relax
\else \def \next {\a@splitnumber #2\@@ }%
\fi \next }

%%%%%%%%%%%%%%%%%%%%%%%%%% insertions %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\def \test@math #1${% Math insertion in Arabic text
\def \next {#1}% test for display math
\ifx \next \empty \def \next 
        {\begingroup \endarabtext $$\aftergroup \endgroup 
        \aftergroup \a@spacefalse \aftergroup \test@token }%
\else \def \next 
        {\putwordb@x {$#1$}\a@spacetrue \arab@codes \test@token }%
\fi \next }

\def \test@insert #1>{% Roman insertion in Arabic text
\putwordb@x {\rm #1}\a@spacetrue \arab@codes \test@token }
%\putwordb@x {\a@@font #1}\a@spacetrue \arab@codes \test@token }

% cf. abidir::\LR

%%%%%%%%%%%%%%%%%%%%%%%%%% verbatim mode %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\def \a@showinput #1{% show verbatim text and transliteration
\ifshow \a@@verb {#1}\fi
\iftrans {\tracingmacros 0 \set@transfont \trans@text #1 \end }\fi }

\def \a@@verb #1{\def \verb@text {#1}% list input words verbatim
        {\tracingmacros 0 \penalty \z@ \tt 
        \xpa \get@meaning \meaning \verb@text }\ }

\def \get@meaning #1>{} % strip off macro header

\def \a@verb #1>{\a@@verb {#1}}

%%%%%%%%%%%%%%%%%%%%%%%%%%%% arabic insertion %%%%%%%%%%%%%%%%%%%%%%%%

{\catcode `\< = \@other           % better make sure

\gdef \a@ins {% arabic insertion or 'less'
\ifmmode \global\let \a@less <
\else \global\let \a@less \arab@insert \leavevmode
  \bgroup \arab@codes \set@arabfont \@waslafalse \@wasfalse
\fi \a@less }

\gdef \<{\protect \a@ins }        % explicit command \<

\catcode`\< = \active             % prepare active <
\gdef <{\protect \a@ins }
} % catcode < 

\def \break@line {% \| inside insertion
\box\lineb@x \break \initlineb@x }

\def \finish@line {% \\ inside insertion
\box\lineb@x \hfil \break \initlineb@x }

\def \arab@insert #1>{% Arabic insertion in Roman text
\ifshow \a@@verb {#1}\fi % verbating listing
\ifarab \a@sequence {#1} \fi % arabic writing
\iftrans \set@transfont \trans@text #1 \end \/\fi
\ifnum \tracingarab > \@ne \message {>}\fi
\unskip \egroup }

% cf. abidir::\LR

%%%%%%%%%%%%%%%%%%%%%%%%% transliteration %%%%%%%%%%%%%%%%%%%%%%%%%%%%

\def \settransfont #1{% set transliteration style or \style
\if \relax \nxp#1\relax \def \set@transfont 
        {\tr@ceoff #1\csname selectfont\endcsname \tr@ceon }%
\else \def \set@transfont 
        {\tr@ceoff \csname #1\endcsname 
        \csname selectfont\endcsname \tr@ceon }%
\fi}

\settransfont {\rm \it }% standard font for transliteration

\long \def \trans@text #1{% check for special cases
\leavevmode \def \next {\trans@text }%
\if\is@in@set {#1}\a@first \def \next {\trans@elem #1}\else % normal case
\ifx \end #1\let \next \relax \else
\ifx \par #1\endgraf \else
\ifx \\#1\hfil \break \else
\ifx \|#1\hfil \break \else
\ifx \emphasize #1\def \next {\a@emp }\else
\if \relax \nxp #1\relax % ignore control sequences
\else \def \next {\trans@elem #1}% normal case
\fi\fi\fi\fi\fi\fi\fi \next }

\def \a@emp #1{\trans@text #1 }

\def \trans@elem #1 {% transliterate next word of text
\a@transword {#1}\trans@text }

\def \a@transword #1{% transliterate a word
{\tracingmacros 0 \a@scan #1>\xpa \a@trans \the\a@tokens >\ }}

\ifx \a@trans \undefined % atrans.sty not yet loaded
\def \a@trans #1>{\gdef \a@trans ##1>{\relax }% default 
\message {`atrans.sty' not loaded; transliteration ignored.}}
\fi

%%%%%%%%%%%%%%%%%%%%%%%%% initialization %%%%%%%%%%%%%%%%%%%%%%%%

\def \startarab {% set default initializations
\newarabfont        
\a@normalfont        % default font
\transfalse   \arabtrue   \vocalize   \ligsfalse   
\tracingarab = 0 \setnone } % \catcode < := 12 for user macros

%%%%%%%%%%%%%%%%%%%%%%% load the later passes %%%%%%%%%%%%%%%%%%%%%%

\UsePackage {acmd}                % load the command processor module
\UsePackage {afonts}              % load the default fonts
\UsePackage {ascan}               % generate a token sequence
\UsePackage {aparse}              % parse it into syllables and reverse them
\UsePackage {awrite}              % generate the basic writing
\UsePackage {aligs}               % modify for any ligatures
\UsePackage {aoutput}             % generate output lines
\UsePackage {abidir}              % bidirectional linebreaking
\UsePackage {atrans}              % generate the transliteration
\UsePackage {alatex}              % extensions for LaTeX
\UsePackage {abjad}               % abjad numerals
\ifx \edmacloaded \relax
  \UsePackage {aedpatch} \fi      % patches for EDMAC ?
\ifx \undefined \peek@token \else
\ifx \undefined \bbl@test@token
  \UsePackage {arababel} \fi\fi   % patches for old BABEL ?
\ifx \CJK \undefined \else
  \UsePackage {acjk} \fi          % patches for CJK ?
\UsePackage {apatch}              % any last minute corrections

%%%%%%%%%%%%%%%%%%%%%%% statistics %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\def \arab@stat {{\newlinechar `$ 
\wlog {$Parameterless commands valid in Arabic mode:}
\wlog {\space (\the\a@@listzero )}
\wlog {$Commands with 1 parameter valid in Arabic mode:}
\wlog {\space (\the\a@@listone )}
\wlog {$Commands with 2 parameters valid in Arabic mode:}
\wlog {\space (\the\a@@listtwo )}
\wlog {$User defined commands valid in Arabic mode:}
\wlog {\space (\the\a@@listreg )}}}

\let \arabstat \arab@stat

%%%%%%%%%%%%%%%%%%%%%%%%%%%% here we go %%%%%%%%%%%%%%%%%%%%%%%

\let \wlog \a@wlog

\startarab \a@report        

\a@message {... now be patient ... }

\catcode`\" = \ar@bdqcode        \catcode`\@ = \ar@batcode        

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\endinput
%%%%%%%%%%%%%%%%%%%%%%%%%%%%% EOF %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%