%% Here's the TeXbook's macro to test if a command has been defined.
\def\ifundefined#1{\expandafter\ifx\csname#1\endcsname\relax}
\def\monthname#1{\ifcase#1 XXX\or Jan\or Feb\or Mar\or Apr\or May\or
        Jun\or Jul\or Aug\or Sep\or Oct\or Nov\or Dec\or ZZZ\fi}
\bgroup\catcode`\ =11\gdef\mkrspace{ }\egroup
\ifundefined{today}%
        \def\today{\the\day\mkrspace\monthname\month\mkrspace\the\year}%
\fi
\newcount\scr % scratch counter
\newcount\hrs \newcount\mins
\def\getnow{\hrs=\time \divide\hrs by60 \mins=\hrs \multiply \mins by60
        \advance\mins by-\time \multiply\mins by-1 }
\getnow
\def\now{\the\hrs:\the\mins}

%% Catcodes made accessible...
\def\active{13 }\let\ACTIVE=\active 
\def\ESCAPECHAR{0 }
\def\STARTGROUP{1 }\def\ENDGROUP{2 }
\def\MATHSHIFT{3 }\def\ALIGNMENTTAB{4 }
\def\ENDOFLINE{5 }\def\PARAMETER{6 }
\def\SUPERSCRIPT{7 }\def\SUBSCRIPT{8 }
\def\IGNOREDCHAR{9 }\def\SPACECATCODE{10 }
\def\LETTER{11 }\def\OTHER{12 }\def\COMMENTCHAR{14 }
\def\INVALIDCHAR{15 }

\newif\ifAHFONTS  \AHFONTSfalse % the default
%\AHFONTStrue

%% This macro file is part of the Makor2 package for typesetting Hebrew
%% with Omega.  (Alan Hoenig; July, 2002).

\let\G=\global \let\X=\expandafter

%% Most of the Makor business is taken care of by Omega OTPs, but some
%% stuff still needs to be done via macros.  Foremost is the utilities
%% to get kerns between characters, so we can determine a characters
%% axis. 

%% \getkern{a}{b} stores the kerns between characters a and b 
%% in the current
%% font in \dimen0.
\def\getkern#1#2{\setbox0=\hbox{#1#2}\dimen0=\wd0\relax
  \setbox0=\hbox{#1{}#2}%
  \advance\dimen0 by-\wd0% dimen0 is the kern
}

%% In Makor, the kerns between the nullchar (\char254) and any other
%% character yield the width of the offset from the medial axis
%% through the type.  A positive kern means the displacement is to the
%% right; to the left, otherwise.  \getloweraxis{ch} gets the lower
%% axis of the letter ch.
\newdimen\axisoffset
\def\nullchar{\char254 }
\def\getloweraxis#1{\getkern{\nullchar}{#1}\axisoffset=\dimen0 }
\def\getupperaxis#1{\getkern{#1}{\nullchar}\axisoffset=\dimen0 }

%% Here follow some straightforward macros to adjust the placement of
%% a glyph's vowels.  Adjustment can occur for either or both of an
%% upper and lower accent.  Normally, the adjustment parameter is
%% $-10$, which means no adjustments are necessary.  Otherwise, its
%% value is a number which multiplies the width of the glyph and
%% determines where to place the accent.  Suppose the glyph's width is
%% $w$.  Then:
%%   * 0 means place the accent at the left edge;
%%   * 1 means place the accent at the right edge;
%%   * .6 means (for ex) place the accent 60\% of the way between left
%%   and right;
%%   * 1.2 means place the accent 20\% of w past right edge of the type;
%%   * -.15 means place the accent 15\% of w to the left of the type; and
%% so on for other values.
\def\upperfudgefactor{-10}\def\lowerfudgefactor{-10}% default values
\def\fudgefactordefault{-10}
\def\upperadjustment#1{\def\upperfudgefactor{#1}}
\def\loweradjustment#1{\gdef\lowerfudgefactor{#1}}

\def\startnum!{\bgroup\textdir TLT{}}\def\endnum!{\egroup}

\newdimen\upperaxisoffset \newdimen\loweraxisoffset 
\newdimen\glyphwd \newdimen\glyphht \newdimen\glyphdp
\newdimen\lowerglyphremainder \newdimen\upperglyphremainder
\newdimen\IC \newdimen\leftedge \newdimen\rightedge
\def\getIC#1{% get the Italic Correction of a character
        \setbox0=\hbox{#1\ItalCorrec}\setbox2=\hbox{#1}\dimen0=\wd0
        \advance\dimen0 by-\wd2 \IC=\dimen0 }
\def\getICstandards{\setbox0=\hbox{\clearocplists Y}\G\leftedge=\ht0
        \setbox0=\hbox{\clearocplists Z}\G\rightedge=\ht0 }
\def\measureuppertrope#1{\getICstandards\measurediacrit{#1}%
        \getIC{#1}%
        \ifdim\IC=\leftedge  \gdef\upperfudgefactor{.2}\fi
        \ifdim\IC=\rightedge \gdef\upperfudgefactor{.8}\fi}

\def\lap#1{\hbox to 0pt{\hss#1\hss}}
\def\getloweraxisandoffset#1{\getloweraxis{#1}\loweraxisoffset=\axisoffset}
\def\getupperaxisandoffset#1{\getupperaxis{#1}\upperaxisoffset=\axisoffset}
\newdimen\upxtune \newdimen\upytune \newdimen\lowxtune
        \newdimen\lowytune
\newdimen\upxtuning \newdimen\upytuning \newdimen\lowxtuning
        \newdimen\lowytuning
\upxtune=0pt \upytune=0pt \lowxtune=0pt \lowytune=0pt
\upxtuning=0pt\upytuning=0pt \lowxtuning=0pt \lowytuning=0pt
\def\restoredefaultfudges{\G\let\lowerfudgefactor=\fudgefactordefault
        \G\let\upperfudgefactor=\fudgefactordefault
        \G\upxtune=0pt \G\upytune=0pt \G\lowxtune=0pt \G\lowytune=0pt
        \G\upxtuning=0pt\G\upytuning=0pt \G\lowxtuning=0pt
        \G\lowytuning=0pt \makeifsfalse }
\def\adjustloweraxis{% No change in accent placement...
  \ifx\lowerfudgefactor\fudgefactordefault
    \advance\loweraxisoffset by.5\glyphwd
  \else % change the accent placement
    \loweraxisoffset = \lowerfudgefactor\glyphwd
  \fi}
\def\adjustupperaxis{% No change in accent placement...
  \ifx\upperfudgefactor\fudgefactordefault
    \advance\upperaxisoffset by.5\glyphwd
  \else % change the accent placement
    \upperaxisoffset = \upperfudgefactor\glyphwd
  \fi}
\def\getupperglyphremainder{\upperglyphremainder=\glyphwd 
        \advance\upperglyphremainder by-\upperaxisoffset}
\def\getlowerglyphremainder{\lowerglyphremainder=\glyphwd 
        \advance\lowerglyphremainder by-\loweraxisoffset}
\def\measurechar#1{\setbox0=\hbox{#1}\glyphwd=\wd0 \glyphht=\ht0
        \glyphdp=\dp0 }
\newdimen\dwd \def\dbox#1{\hbox to\dwd{#1\hss}}% width, box for diacrit
\def\measurediacrit#1{\setbox0=\hbox{#1}\dwd=\wd0 %
}
\def\PutVwl#1#2{\getloweraxisandoffset{#1}% all vowels are low
  \measurechar{#1}\measurediacrit{#2}\adjustloweraxis
  %% Now place glyph plus accent
    %% \glyphremainder is the remaining space to get to the right
    %% edge; glyphremainder + axisoffset = glyphwd
  \getlowerglyphremainder \finagletest
  \noindent\rlap{#1}\kern\lowerglyphremainder
  \ifltune\lap{\dbox{\lowpoint{#2}}}%
  \else\lap{#2}\fi
  \kern\loweraxisoffset
  \penalty10000\restoredefaultfudges
}\let\PutLTrp=\PutVwl % for the time being...
%% Use the following to place an upper accent only...
\def\PutUTrp#1#2{\getupperaxisandoffset{#1}% all vowels are low
  \measurechar{#1}\measureuppertrope{#2}\adjustupperaxis%
  %% Now place glyph plus accent
    %% \glyphremainder is the remaining space to get to the right
    %% edge; glyphremainder + axisoffset = glyphwd
  \getupperglyphremainder \finagletest
  \noindent\rlap{#1}\kern\upperglyphremainder
  \ifutune\raise\glyphht\lap{\dbox{\uppoint{#2}}}%
  \else\raise\glyphht\lap{#2}\fi
  \kern\upperaxisoffset
  \penalty10000\restoredefaultfudges}
\def\ArchaicVowels{\let\PutVwl=\PutUTrp}% for typesetting archaic vwls
\def\ArchO{\vbox{\baselineskip=0pt\ialign{##\crcr\hidewidth o\hidewidth
        \crcr w\crcr}}}% typesetting archaic holam
\newdimen\vwlsep % separation between adjacent trope/vowel combos
\vwlsep = .5pt
\def\PutVwlLTrp#1#2#3{\getloweraxisandoffset{#1}%
  \measurechar{#1}\measurediacrit{#2#3}\adjustloweraxis
  \getlowerglyphremainder\finagletest
  \noindent\rlap{#1}\kern\lowerglyphremainder
  \ifltuning\lap{#2\hskip\lowxtuning\lower\lowytuning\hbox{#3}}%
        \else
        \ifltune\lap{\dbox{\lowpoint{#2#3}}}\else
  \lap{#2\hskip\vwlsep#3}\fi\fi
  \kern\loweraxisoffset
  \penalty10000\restoredefaultfudges}
\let\PutLTrpVwl=\PutVwlLTrp
\def\PutVwlUTrp#1#2#3{\getloweraxisandoffset{#1}\getupperaxisandoffset{#1}%
  \measurechar{#1}\measurediacrit{#2}\measureuppertrope{#3}%
  \adjustloweraxis\adjustupperaxis
  \getlowerglyphremainder \getupperglyphremainder \finagletest
  \noindent\rlap{#1}\kern\lowerglyphremainder
  \ifltune\lap{\dbox{\lowpoint{#2}}}\else\lap{#2}\fi
  \kern-\lowerglyphremainder\kern\upperglyphremainder
    \ifutune\raise\glyphht\lap{\dbox{\uppoint{#3}}}%
  \else\raise\glyphht\lap{#3}\fi
  \kern\upperaxisoffset \penalty10000 \restoredefaultfudges}
\def\PutUTrpVwl#1#2#3{\getloweraxisandoffset{#1}\getupperaxisandoffset{#1}%
  \measurechar{#1}\measurediacrit{#3}\measureuppertrope{#2}%
  \adjustloweraxis\adjustupperaxis
  \getlowerglyphremainder \getupperglyphremainder \finagletest
  \noindent\rlap{#1}\kern\lowerglyphremainder
  \ifltune\lap{\dbox{\lowpoint{#3}}}\else\lap{#3}\fi
  \kern-\lowerglyphremainder\kern\upperglyphremainder
    \ifutune\raise\glyphht\lap{\dbox{\uppoint{#2}}}%
  \else\raise\glyphht\lap{#2}\fi
  \kern\upperaxisoffset \penalty10000 \restoredefaultfudges}
\def\PutCon#1{#1} % do nothing special with consonants...
\let\PutNum=\PutCon \let\PutOther=\PutCon
\newif\ifladjust \newif\ifltune \newif\ifltuning % test for low finagles
\newif\ifuadjust \newif\ifutune \newif\ifutuning % test for up finagles
\def\makeifsfalse{\G\ladjustfalse \G\ltunefalse \G\ltuningfalse
        \G\uadjustfalse \G\utunefalse \G\utuningfalse }
\makeifsfalse % default states
\def\finagletest{% are any finagles needed?
  \ifdim\lowxtune=0pt\else\ifdim\lowytune=0pt\else\ltunetrue\fi\fi
  \ifdim\upxtune=0pt\else\ifdim\upytune=0pt\else\utunetrue\fi\fi
  \ifdim\lowxtuning=0pt\else\ifdim\lowytuning=0pt\else\ltuningtrue\fi\fi
  \ifdim\upxtuning=0pt\else\ifdim\upytuning=0pt\else\utuningtrue\fi\fi
  \ifx\lowerfudgefactor\fudgefactordefault \else \ladjusttrue\fi
  \ifx\upperfudgefactor\fudgefactordefault \else \uadjusttrue\fi}
%% \def\finagletest{% are any finagles needed?
%%   \ltunetrue \utunetrue \ltuningtrue \utuningtrue % defaults
%%   \ifdim\lowxtune=0pt{\ifdim\lowytune=0pt \ltunefalse\fi}\fi
%%   \ifdim\upxtune=0pt  \ifdim\upytune=0pt  \utunefalse\fi\fi
%%   \ifdim\lowxtuning=0pt{\ifdim\lowytuning=0pt \ltuningfalse\fi}\fi
%%   \ifdim\upxtuning=0pt  \ifdim\upytuning=0pt  \utuningfalse\fi\fi
%%   \ifx\lowerfudgefactor\fudgefactordefault \else \ladjusttrue\fi
%%   \ifx\upperfudgefactor\fudgefactordefault \else \uadjusttrue\fi}
\def\loweradj#1{\gdef\lowerfudgefactor{#1}}
\def\upperadj#1{\gdef\upperfudgefactor{#1}}
\def\lowertune[#1,#2]{\G\lowxtune=#1\relax \G\lowytune=#2}
\def\uppertune[#1,#2]{\G\upxtune=#1\relax \G\upytune=#2}
\def\lowertuning[#1,#2;#3,#4]{\lowertune[#3,#4]\G\lowxtuning=\lowxtune
        \G\lowytuning=\lowytune\lowertune[#1,#2]}
\def\uppertuning[#1,#2;#3,#4]{\uppertune[#3,#4]\G\upxtuning=\upxtune
        \G\upytuning=\upytune\uppertune[#1,#2]}
\def\lowpoint#1{\hskip\lowxtune\lower\lowytune\hbox{#1}}
\def\uppoint#1{\hskip\upxtune\raise\upytune\hbox{#1}}

%% Some useful hacks...
\def\'{{\clearocplists\char39\relax}}
\def\"{{\clearocplists\char34\relax}}
\let\ItalCorrec=\/
\def\/{\kern0pt}
\def\PrintChar#1{{\clearocplists\char#1\relax}}

\let\prefilter=\relax
%% List def's
\ocp\yid        = m2yiddish
\ocp\yidcon     = m2yidcon
\ocp\trope      = m2ustrope
\ocp\notrope    = m2usnotrope
\ocp\vwls       = m2usvwls
\ocp\novwls     = m2usnovwls
\ocp\lamed      = m2uslamed
\ocp\bentlamed  = m2usblamed
\ocp\lamednv    = m2uslamednv
\ocp\bentlamednv= m2usblamednv
\ocp\consonants = m2uscons
\ocp\consonantsnv = m2usconsnv
\ocp\aleph      = m2aleph
\ocp\alephnv    = m2alephnv
\ocp\oddments   = m2oddments
\ocp\adddots    = m2dodagesh
\ocp\nodots     = m2dontdagesh
\ocp\contest    = m2contest
\ocp\context    = m2context
\ocp\BLcontext  = m2blcontext
\ocp\fplusv     = m2fplusv % treatment of vocalized finals
\ocp\fplusvalt  = m2fplusvalt % treatment of vocalized finals
\ocp\putvwl     = m2putvwl
\ocp\numb       = m2numeral

\ocp\lagally    = lagally
\ocp\bhsnull    = bhs0
\ocp\bhs        = bhs
\ocp\german     = m2deu2us
{\catcode`@=11
\gdef\newif#1{\count@\escapechar \escapechar\m@ne
  \expandafter\expandafter\expandafter
   \def\@if#1{true}{\let#1=\iftrue}%
  \expandafter\expandafter\expandafter
   \def\@if#1{false}{\let#1=\iffalse}%
  \@if#1{false}\escapechar\count@} % the condition starts out false
\gdef\@if#1#2{\csname\expandafter\if@\string#1#2\endcsname}
{\uccode`1=`i \uccode`2=`f \uppercase{\gdef\if@12{}}}} % `if' is required

\newwrite\tmpout
\let\OCPlist=\ocplist \let\ADDBEFOREOCPLIST=\addbeforeocplist 
\let\NULLOCPLIST=\nullocplist
\def\defIfSwitch#1{\expandafter\newif\csname if#1\endcsname
  \X\def\csname #1off\endcsname{\csname #1false\endcsname}%
  \X\def\csname #1on\endcsname{\csname #1true\endcsname}}
\defIfSwitch{CONTEXT}\CONTEXTon % easy way to suppress contextual analysis
\defIfSwitch{DEU}\DEUoff
\defIfSwitch{BHS}\BHSoff
\defIfSwitch{Lagally}\Lagallyoff
\defIfSwitch{Yiddish}\Yiddishoff
\defIfSwitch{Vowels}\Vowelson
\defIfSwitch{Trope}\Tropeon
\defIfSwitch{BentLamed}\BentLamedoff
\defIfSwitch{AlternateFinal}\AlternateFinaloff
\defIfSwitch{Pal}\Paloff
\defIfSwitch{Bab}\Baboff
\def\disablelistprimitives{%
  \let\ocplist=0\let\addbeforeocplist=0\let\nullocplist=0\relax
}
\def\enablelistprimitives{\let\ocplist=\OCPlist
  \let\addbeforeocplist=\ADDBEFOREOCPLIST \let\nullocplist=\NULLOCPLIST
}
\def\IWrT{\immediate\write\tmpout}
\bgroup \catcode`\%=11 
        \gdef\comment{% }
\egroup
%%
%% Here's the MKR ocplist, which is almost always called for...
\ocplist\MKR =
 \addbeforeocplist .99 \contest 
 \addbeforeocplist 1 \trope 
 \addbeforeocplist 1 \vwls 
 \addbeforeocplist 1 \lamed 
 \addbeforeocplist 1 \consonants 
 \addbeforeocplist 2 \aleph 
 \addbeforeocplist 3 \oddments 
 \addbeforeocplist 4 \adddots 
 \addbeforeocplist 5 \context 
 \addbeforeocplist 6 \fplusv 
 \addbeforeocplist 7 \putvwl 
 \addbeforeocplist 8 \numb 
 \nullocplist 
%% Here follows the machinery for creating ocp lists dynamically...
%%
%% We begin by making available the output stream that keeps a record
%% of these lists.
\def\M#1{\message{Defining ocplist #1...}}
\def\StartSomeOCPLists#1{\immediate\openout\tmpout=#1.tmp }
\StartSomeOCPLists{mkrlists}
\IWrT{\comment I am a temporary file called `mkrlists.tmp'; you may delete me.}
\IWrT{\comment I was created by the Makor2 package for typesetting Hebrew}
\IWrT{\comment with the Omega extension to TeX on \today\mkrspace at \now.}
\IWrT{\comment}
\def\makeocplist#1{\disablelistprimitives
  \IWrT{\comment ocplist #1...}
  \IWrT{\noexpand\ifundefined{#1}\noexpand\M{#1}%
        \global\ocplist\csname #1\endcsname=}%
  %% First, any pre-filters...
  \ifBHS \IWrT{  \addbeforeocplist .5 \bhsnull 
      \addbeforeocplist .5 \bhs}\fi
  \ifLagally\IWrT{  \addbeforeocplist .5 \lagally}\fi
  \ifYiddish\IWrT{  \addbeforeocplist .5 \yid}%
            \IWrT{  \addbeforeocplist .5 \yidcon}%
  \fi
  \ifDEU \IWrT{  \addbeforeocplist .5 \german}\fi
  \ifCONTEXT \IWrT{  \addbeforeocplist .99 \contest}\fi
  %% Trope...
  \ifTrope\IWrT{  \addbeforeocplist 1 \trope}\else
    \IWrT{  \addbeforeocplist 1 \notrope}\fi
  %% Vowels...
    %% Turning off vowels means mapping vocal diacritics to null, and
    %% mapping dagesh forms to un-dagesh, including things like shin+dot
    %% to `naked' shin.  This involves alteration also to \adddots,
    %% \lamed, and \consonants.
  \ifVowels\IWrT{  \addbeforeocplist 1 \vwls}\else
  \IWrT{  \addbeforeocplist 1 \novwls}\fi
  %% Lamed...
  \ifVowels %...
     \ifBentLamed\IWrT{  \addbeforeocplist 1 \bentlamed}\else
     \IWrT{  \addbeforeocplist 1 \lamed}\fi 
  \else % no vowels...
     \ifBentLamed\IWrT{  \addbeforeocplist 1 \bentlamednv}\else
     \IWrT{  \addbeforeocplist 1 \lamednv}\fi 
  \fi
  %% Consonants...
  \ifVowels\IWrT{  \addbeforeocplist 1 \consonants}\else
  \IWrT{  \addbeforeocplist 1 \consonantsnv}\fi
  %% The strange case of Alef/Sheva
  \ifVowels\IWrT{  \addbeforeocplist 2 \aleph}\else
  \IWrT{  \addbeforeocplist 2 \alephnv}\fi
  %% Oddments
  \IWrT{  \addbeforeocplist 3 \oddments}%
  %% Adding the Dagesh...
  \ifVowels\IWrT{  \addbeforeocplist 4 \adddots}\else
  \IWrT{  \addbeforeocplist 4 \nodots}\fi
  %% Contextual analysis...
  \ifCONTEXT 
     \ifBentLamed\IWrT{  \addbeforeocplist 5 \BLcontext}\else
     \IWrT{  \addbeforeocplist 5 \context}\fi
  \fi
  %% Vocalized final forms...
  \ifAlternateFinal\IWrT{  \addbeforeocplist 6 \fplusvalt}\else
  \IWrT{  \addbeforeocplist 6 \fplusv}\fi
  %% Vowel Placement...
  \ifBab\IWrT{  \addbeforeocplist 7 \putbvwl}\elseifPal
  \IWrT{  \addbeforeocplist 7 \putpvwl}\else
  \IWrT{  \addbeforeocplist 7 \putvwl}\fi
  %% Numbers...
  \IWrT{  \addbeforeocplist 8 \numb}%
  %% Finishing the ocp list...
  \IWrT{  \nullocplist \noexpand\fi}\IWrT{}%
  %% FInal details...
  \enablelistprimitives}
%% When you've finished specifying ocplists (environments/conventions),
%% issue this command.
\def\InhaleEnvironmentKnowledge#1{\IWrT{\comment End of lists.}%
        \immediate\closeout\tmpout 
        \enablelistprimitives\input #1.tmp }
\let\MakeMakorEnvironment=\makeocplist
\newif\ifHebrewenvironmentDefined \HebrewenvironmentDefinedfalse
\def\MakorEnvironment#1{\HebrewenvironmentDefinedtrue
        \def\CurrMakorEnv{\X\pushocplist\csname #1\endcsname}\CurrMakorEnv}
\let\MakorConvention=\MakorEnvironment
%% Some standard environments...
\def\MakeStandardMKREnvironments{%\MakeMakorEnvironment{MKR}
\Yiddishon
\Tropeoff
  \MakeMakorEnvironment{YID}
\Tropeon
\Yiddishoff
\BentLamedon
  \MakeMakorEnvironment{MKRbl}      
\BentLamedoff
\Lagallyon
  \MakeMakorEnvironment{Lagally}
\Lagallyoff
\BHSon
  \MakeMakorEnvironment{BHS}
\BHSoff
\DEUon
  \MakeMakorEnvironment{MKRdeu}
\DEUoff
\BentLamedon
  \MakeMakorEnvironment{BHSbl}
\BentLamedoff
\Vowelsoff \Tropeoff
  \MakeMakorEnvironment{MKRnv}
\BHSon
  \MakeMakorEnvironment{BHSnv}% no vowels...
\BHSoff
\Vowelson \Tropeon
\AlternateFinalon
  \MakeMakorEnvironment{MKRalt}
\AlternateFinaloff}
\MakeStandardMKREnvironments \InhaleEnvironmentKnowledge{mkrlists}
\def\CurrMakorEnv{\X\pushocplist\csname MKR\endcsname} % default
\def\CXLV{\pushocplist\MKRnv}% cancelling vowels
%% THe BIBLE environment also needs to know about \ketiv and \qere...
\def\ketiv#1 {{\little\MakorEnvironment{BHSnv}[#1 \unskip]} }
\def\qere*#1 {#1 }

%% Hebrew numbering.  Given a raw interger, this routine converts it to
%% the Hebrew alpha-number.
\newcount\rawnumber     %\scr defined at top of file
\newcount\ones  \newcount\twenty        \newcount\thirty
\newcount\forty \newcount\fifty         \newcount\sixty
\newcount\seventy       \newcount\eighty
\newcount\ninety        \newcount\onehundred
\newcount\twohundred    \newcount\threehundred
\newcount\fourhundred
\def\HebrewDigit#1#2{\ifnum#1=1\relax #2\fi}
\def\ConvertGroup#1#2{% Usage: \ConvertGroup{\twohundred}{200}
        \ifnum\scr<#2\relax #1=0\else
                #1=1 \advance\scr by -#2
        \fi}
\def\GetNumericGroups#1{\scr=#1%
        \ConvertGroup{\fourhundred}{400}%
        \ConvertGroup{\threehundred}{300}%
        \ConvertGroup{\twohundred}{200}%
        \ConvertGroup{\onehundred}{100}%
        \ConvertGroup{\ninety}{90}%
        \ConvertGroup{\eighty}{80}%
        \ConvertGroup{\seventy}{70}%
        \ConvertGroup{\sixty}{60}%
        \ConvertGroup{\fifty}{50}%
        \ConvertGroup{\forty}{40}%
        \ConvertGroup{\thirty}{30}%
        \ConvertGroup{\twenty}{20}}
{\catcode`\$=11 \catcode`\_=11 \catcode`\^=11 % beginning a group
\gdef\ConvertOnes#1{\ones=#1\relax
        \ifnum\ones>19 \G\advance\ones by-20\fi
        \ifcase\ones \or ^'\or v\or g\or d\or h\or w\or z\or 
        ch\or .t\or y\or y^'\or yv\or yg\or yd\or 
        .tw\or .tz\or yz\or ych\or y.t\fi}
\gdef\HNUMERROR{\message{Oops---this value is out-of-bounds for }%
        \message{conversion to a Hebrew number.  I'm stymied.}}
\gdef\HebrewNumber#1{\let\next=\relax \ifnum#1<1\HNUMERROR
        \elseifnum#1>1099\relax \HNUMERROR
        \else\def\next{\DoHebrewNumber{#1}}\fi \next}
\gdef\DoHebrewNumber#1{\rawnumber=#1\relax
        \GetNumericGroups{\rawnumber}%
        \HebrewDigit{\fourhundred}{s}%
        \HebrewDigit{\threehundred}{sh}%
        \HebrewDigit{\twohundred}{r}%
        \HebrewDigit{\onehundred}{q}%
        \HebrewDigit{\ninety}{ts_}%
        \HebrewDigit{\eighty}{f_}%
        \HebrewDigit{\seventy}{`}%
        \HebrewDigit{\sixty}{.s}%
        \HebrewDigit{\fifty}{n_}%
        \HebrewDigit{\forty}{m_}%
        \HebrewDigit{\thirty}{l}%
        \HebrewDigit{\twenty}{kh_}\ConvertOnes{\scr}}
} % ending the group...

\newcount\vnum \vnum=1 % verse number
\newcount\cnum \cnum=1 % chapter number
\newcount\bnum \bnum=1 % book number, in case needed or wanted
\font\little=ezra2 at 7pt
\def\NewVerse{ \G\advance\vnum by 1{\textdir TLT
        \clearocplists\little\the\vnum\ }}
\def\NewVerse{{\little\HebrewNumber{\vnum}\kern3pt}\advance\vnum by 1\relax}
\def\NewChapter{\vnum=1 \leavevmode\the\cnum\kern5pt\advance\cnum by 1\relax}
\ifAHFONTS
        \font\Bf=pacs9t scaled\magstep1
\else
        \font\Bf=cmb10 scaled\magstep2
\fi
\def\NewBook#1{\vfill\eject\advance\bnum by1 \vnum=1 \cnum=1
  {\textdir TLT\centerline{\Bf LIBER #1}}\endgraf\smallskip\noindent}
%% Some font macros.
\newdimen\hfontsize 
\hfontsize=10pt \def\hfontsizeinverse{1.0 } % defaults
\def\hfontdef#1#2#3{% \hfontdef{myhebrew}{rawfont}{size}
        \hfontsize=#3\baselineskip=1.3\hfontsize
        \expandafter\font\csname #1\endcsname = #2 at \hfontsize}
\def\hfont#1{\csname #1\endcsname}
\hfontdef{HDEFAULTFONT}{ezra2}{9pt}
\hfontdef{HFOOTFONT}{ezra2}{6pt}

%% Some footnote macros (really intended for Lambda users)...
\def\ENG{\bgroup\clearocplists\textdir TLT\rm}
\def\ENDENG{\egroup}


\def\INFLATE#1#2{\setbox0=\hbox{#1}\dimen0=\wd0\dimen2=\ht0\relax
        \dimen4=\dp0\relax\hfontdef{TMP}{#2}{1.2\hfontsize}%
        \setbox0=\hbox{\hfont{TMP}#1}\ht0=\dimen2\relax 
        \dp0=\dimen4\leavevmode\box0}
\def\LargeHSpace{{\clearocplists \hskip 4pc plus 2pc minus1pc\char16
  \hskip 4pc plus 2pc minus1pc}}
\def\NewParAfterVerse{{\clearocplists\HPAR\char17\endgraf \noindent }}

\def\HINDENT{\noindent\hskip\parindent}
\def\HPAR{{\clearocplists
        \parfillskip=0pt\hskip0pt plus1fill minus10pc\char254}}
\newskip\MAKORPARFILLSKIP \MAKORPARFILLSKIP=0pc plus100pc minus50pc
\newskip\savedparfillskip \savedparfillskip=\parfillskip
\def\CENTERLASTLINE{\global\parfillskip=\MAKORPARFILLSKIP
   \hskip\parfillskip\char254 }
{\obeylines\gdef\hobeylines{\catcode`\^^M=\active
\def^^M{\HPAR\endgraf}}}

\def\<{ \unskip}\let\>=\<

\def\HEBREW{{\clearocplists\global\catcode`\$=\LETTER 
        \global\catcode`\_=\LETTER \global\catcode`\^=\LETTER}\textdir TRT}
\def\BIBLE{{\clearocplists\global\catcode`\&=\LETTER 
        \global\catcode`\#=\LETTER }}
\def\UNHEBREW{\global\catcode`\$=\MATHSHIFT 
        \global\catcode`\_=\SUBSCRIPT \global\catcode`\^=\SUPERSCRIPT}
\def\UNBIBLE{\global\catcode`\&=\ALIGNMENTTAB 
        \global\catcode`\#=\PARAMETER }

%% In the following, we use two successive nullchar's to signal the
%% beginning and ending of the \[, \]environments.
\def\Hebrew{\HEBREW \CurrMakorEnv
        \bgroup\hfont{HDEFAULTFONT}}
\def\endHebrew{\egroup
        \UNHEBREW\UNBIBLE\clearocplists\textdir TLT\relax}
\let\[=\Hebrew \let\]=\endHebrew

\outer\def\BYE{\HPAR \vfill\supereject\end }

\def\raggedleft{\rightskip=0pt \leftskip=0pt plus4em 
  \spaceskip=.3333em \xspaceskip=.5em }

%% Now for a `\hebalign' set of macros for entering Hebrew tables.

{\catcode`\#=\OTHER\gdef\H{#}}
\newread\MKRRD \newwrite\MKRWRT
\def\CURRWRTFILE{aligntmp}\edef\CURRRDFILE{aligntmp}
\def\Openin{\message{Opening \CURRRDFILE.mkr as input...}%
        \immediate\openin\csname MKRRD\endcsname=\CURRRDFILE.mkr}
\def\Closein{\immediate\closein\csname MKRRD\endcsname}
\def\Openout{\message{Opening \CURRWRTFILE.mkr as output...}
        \immediate\openout\MKRWRT=\CURRWRTFILE.mkr}
\def\Closeout{\message{Closing \CURRWRTFILE.mkr as output...}%
        \immediate\closeout\MKRWRT}
\def\Outline{\immediate\write\csname MKRWRT\endcsname{\the\TSIL}%
        \TSIL={}}

\newtoks\TSIL % holds the reversed line
\def\PARSELINE#1&{\def\ttmp{#1}%
        \ifx\ttmp\Empty 
                \let\next=\SAVELINE
        \else \let\next=\PARSELINE
                \edef\tmpmac{\ttmp &\the\TSIL}%
                \TSIL=\expandafter{\tmpmac}%
        \fi \next}
\def\SAVELINE{\expandafter\STRIPOFFFINALAMPERSAND\the\TSIL\XYZ
        {\let\cr=0\edef\tmp{\the\TSIL\cr}\TSIL=\expandafter{\tmp}%
        \Outline}}
\def\Empty{\empty}
\def\STRIPOFFFINALAMPERSAND#1&\XYZ{\TSIL=\expandafter{#1}}
\def\CR#1{\TSIL={}\PARSELINE#1&\empty&}
\def\MPROTECT#1{\let#1=0\relax}\def\myprotects{}%% default; 
\def\HEBALIGN#1{\Openout
        \TSIL={\halign\bgroup}\Outline
        {\myprotects\let\hfont=0\let\[=0\let\]=0#1}%
        \TSIL={\egroup}\Outline\Closeout 
        \input \CURRWRTFILE.mkr}
\def\HEBNOALIGN#1{\TSIL={\noalign{#1}}\Outline}

%% Makor2, as of summer, 2003, includes a dingbat font called calading2.
%% You get some phases of moon, stars of David, menorahs, and tablets
%% of the law.  Here are the macros that make using this font a bit
%% easier.  YOU MUST DEFINE THE DINGBAT FONT USING THE NAME HDING!  It
%% is defined below, but you may redefine it as you see fit.

\hfontdef{HDING}{calading2}{12pt}
\newcount\DINGCOUNT
\def\GetDingbatFromRange#1#2#3{% #1 is font offset for dingbat
%% #2 is the position in font for first dingbat in series
%% #3 is the number of dingbats in the series
%% Example \GetDingbatFromRange{2}{64}{12} selects the third dingbat
%% in the moon series, which begins at position 64 in the calading2
%% font, and there are 12 different moon dingbats.
  \DINGCOUNT=#2\relax \advance\DINGCOUNT by#1\relax 
  \bgroup
    \hfont{HDING}%
    \count8=#2\relax \advance\count8 by#3\relax \advance\count8 by-1 
    \ifnum\DINGCOUNT>\count8 
      \message{There are only #3 dingbats to choose from, not #1.}
    \else % alles is gut
      \PrintChar{\DINGCOUNT}%
    \fi
  \egroup
}% end of \GetDingbatFromRange
\def\MagenDavid#1{\GetDingbatFromRange{#1}{33}{9}}% #1 in (0..8)
\let\StarOfDavid=\MagenDavid
\def\MoonPhase#1{\GetDingbatFromRange{#1}{64}{12}}% #1 in (0..11)

\def\RoundMenorah{{\hfont{HDING}\PrintChar{42}}}
\def\AngledMenorah{{\hfont{HDING}\PrintChar{43}}}
\def\TabletsOfLaw{{\hfont{HDING}\PrintChar{52}}}
\def\BlackTablets{{\hfont{HDING}\PrintChar{50}}}
\def\BlankTablets{{\hfont{HDING}\PrintChar{51}}}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%
%% Some silly utility macros..
%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% POOR MAN'S BOLD (from the TeXbook) is useful in cases where a genuine
%% bold-face font is not available, such as osheb2
\newbox\pmbbox
\def\PMB#1{\setbox\pmbbox=\hbox{#1}% for larger fonts
  \kern-.015em\copy\pmbbox\kern-\wd\pmbbox
  \kern.03em\copy\pmbbox\kern-\wd\pmbbox
  \kern-.015em\raise.025em\box\pmbbox }
\def\pmb#1{\setbox\pmbbox=\hbox{#1}% for smaller fonts
  \kern-.025em\copy\pmbbox\kern-\wd\pmbbox
  \kern.05em\copy\pmbbox\kern-\wd\pmbbox
  \kern-.025em\raise.0433em\box\pmbbox }

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%
%% DEBUG MODE
%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\catcode`\@=11
\def\\{\hfont{HDEFAULTFONT}}
\def\DBGPutVwl#1#2{ @PutVwl[{\\#1}][{\\#2}]\endgraf}
\def\DBGPutUTrp#1#2{ @PutUTrp[{\\#1}][{\\#2}]\endgraf}
\def\DBGPutVwlLTrp#1#2#3{ @PutVwlLTrop[{\\#1}][{\\#2}][{\\#3}]\endgraf}
\def\DBGPutVwlUTrp#1#2#3{ @PutVwlUTrp[{\\#1}][{\\#2}][{\\#3}]\endgraf}
\def\DBGPutUTrpVwl#1#2#3{ @PutUTrpVwl[{\\#1}][{\\#2}][{\\#3}]\endgraf}
\def\DBGPutCon#1{ @PutCon[{\\#1}]\endgraf}
\def\DBGPutNum#1{ @PutNum[{\\#1}]\endgraf}
\def\DBGPutOther#1{ @PutOther[{\\#1}]\endgraf}
\def\DBGstartnum!{ @startnum!}
\def\DBGendnum!{@endnum!\endgraf}
\def\begindebugmode#1{\bgroup
  \let\[=\relax \let\]=\relax \let\CENTERLASTLINE=\relax
  \let\HPAR=\relax \let\NewVerse=\relax \let\NewChapter=\relax
  \catcode`\&=11 \catcode`\$=11 \catcode`\^=11 \catcode`\_=11 
  \let\PutVwl=\DBGPutVwl \let\PutVwlUTrp=\DBGPutVwlUTrp
  \let\PutUTrp=\DBGPutUTrp \let\PutVwlLTrp=\DBGPutVwlLTrp
  \let\PutUTrpVwl=\DBGPutUTrpVwl \let\PutCon=\DBGPutCon
  \let\PutNum=\DBGPutNum \let\PutOther=\DBGPutOther
  \let\startnum=\DBGstartnum \let\endnum=\DBGendnum
  \MakeStandardMKREnvironments
  \InhaleEnvironmentKnowledge\MakorEnvironment{#1}%
  \HEBREW\BIBLE\textdir TLT\tt}
\def\enddebugmode{\egroup}

\errorcontextlines=10
%\tolerance=10000
\endinput

%%% Local Variables: 
%%% mode: plain-tex
%%% TeX-master: t
%%% End: 
