%***************************************************************
%
%% betababel.sty
%% Copyright 2005 Felix G. Berkemeier
% 
%
% This work may be distributed and/or modified under the 
% conditions of the LaTeX Project Public License, either 
% version 1.3 of this license or (at your option) any later 
% version.
% 
% The latest version of this license is in
% 
%   http://www.latex-project.org/lppl.txt
%   
% and version 1.3 or later is part of all distributions of LaTeX
% version 2003/12/01 or later.
% 
% Please report errors to: felix.berkemeier@gmx.de
% 
% This work consists of the file betababel.sty
% 
%***************************************************************

\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{betababel}%
  [2005/07/10 v0.5 betababel.sty Beta Code for Babel package]

\IfFileExists{teubner.sty}%
{%
	\def\TeubnerLo@ded{}
	\PassOptionsToPackage{greek}{babel}
	\DeclareOption{polutonikogreek}{}
	\DeclareOption{greek}{}
	\DeclareOption*{%
	  \PassOptionsToPackage{\CurrentOption}{babel}%
	}
	\ProcessOptions\relax
	\RequirePackage{babel}
	\RequirePackage{teubner}%
}%
{%
	\PassOptionsToPackage{polutonikogreek}{babel}
	\DeclareOption{polutonikogreek}{}
	\DeclareOption{greek}{}
	\DeclareOption*{%
	  \PassOptionsToPackage{\CurrentOption}{babel}%
	}
	\ProcessOptions\relax
	\RequirePackage{babel}%
}

%***************************************************************

\newlength\betaskip
\setlength\betaskip{\medskipamount}

{%
	\catcode`$=0
	\catcode`$\=12
	$catcode`$&=6
	$catcode`$#=12
	$catcode`$==12
	$gdef$Terminus{Terminus}
	$gdef$empty@{}
	$newcount$suffix@
	$suffix@=-48
	$newcount$Bet@Mode
	$newcount$FirstP@r
	$newcount$FirstWord@
	$newcount$Ch@rCode
	
	$gdef$SigmaW@rning&1{$gdef$GreekCh@r{}$PackageWarning{betababel}{The BetaCode s&1 does not exist for greek characters}}
	$gdef$LunateW@rning{$PackageWarning{betababel}{The Lunate Sigma (BetaCode: s3) is not implemented (yet?)!}}
	$gdef$SubDotW@rning{$PackageWarning{betababel}{The Subscript Dot (BetaCode: ?) is not implemented (yet?)!}}
	$gdef$JW@rning{$PackageError{betababel}{'J' and 'j' aren't valid characters in BetaCode! You shouldn't use them, because they can make betababel interrupt. Please remove them from your source or replace them by 'S' or 's'}{You can continue typesetting by pressing <return>, but maybe betababel has ignored some of the BetaCode text you wanted to be typeset. You should correct your document and eliminate every 'J' or 'j' within the BetaCode.}}
	$gdef$HashW@rning{$PackageWarning{betababel}{There is no BetaCode '*#'. Therefore those two characters have been ignored}}
	$gdef$H@shWarning&1{$PackageWarning{betababel}{The extended functionality of betababel (e.g. all the codes containing the hash character '#') only works when teubner.sty is installed. Unless your TeX finds teubner.sty, all the unusable characters will be ignored --- as e.g. the &1 }}
	
	$gdef$SetCodes@{%
		$lccode`(=0$lccode`)=0
		$lccode`[=0$lccode`]=0
		$lccode`+=0$lccode`/=0
		$lccode`$==0$lccode`|=0
		$uccode`(=0$uccode`)=0
		$uccode`[=0$uccode`]=0
		$uccode`+=0$uccode`/=0
		$uccode`$==0$uccode`|=0
		$lccode`-=0$lccode`_=0
		$lccode`.=0$lccode`,=0
		$lccode`:=0$lccode`;=0
		$lccode`'=0$lccode`?=0
	}
	
	$long$gdef$s@veText&1{$xdef$TextToTypeset@{&1}}
	$gdef$@ddToText{$let$tempString@$TextToTypeset@$addToText@}
	$long$gdef$addToText@&1{$s@veText{$tempString@&1}}
	$gdef$@ddCharToText{$let$tempString@$TextToTypeset@$addCh@rToText}
	$gdef$addCh@rToText&1{$s@veText{$tempString@$char&1}}
	$gdef$@ddCsToText{$let$tempString@$TextToTypeset@$addCsToText@}
	$gdef$addCsToText@&1{$s@veText{$tempString@$myProtect@$csname&1$endcsname}}
		
	$gdef$bcode{%
		$expandafter$ifx$csname TeubnerLo@ded$endcsname$relax$fi
		$def$TextToTypeset@{}%
		$Bet@Mode=1
		$FirstP@r=1
		$noindent
		$begingroup
		$catcode`$=0
		$catcode`$\=12
		$catcode`$&=6
		$catcode`$#=12
		$catcode`$==12
		$Bet@Code
	}
	
	$long$gdef$betacode{%
		$expandafter$ifx$csname TeubnerLo@ded$endcsname$relax$fi
		$def$TextToTypeset@{}%
		$Bet@Mode=0
		$vspace{$betaskip}
		$begingroup
		$catcode`$=0
		$catcode`$\=12
		$catcode`$&=6
		$catcode`$#=12
		$catcode`$==12
		$Bet@Environment
	}
	
	$long$gdef$Bet@Environment&1\end{%
		$SetCodes@
		$gdef$myProtect@{$noexpand$myProtect@$noexpand}%
		$ReadP@r&1$par Terminus$par
		$endgroup
%		$message{Final:$TextToTypeset@}% Just for debug purposes
		$gdef$myProtect@{}%
		$foreignlanguage{polutonikogreek}{$obeyspaces$TextToTypeset@}
		$end
	}
	
	$long$gdef$endbetacode{%
		$par$vspace{$betaskip}
	}
	
	$long$gdef$Bet@Code&1{%
		$SetCodes@
		$gdef$myProtect@{$noexpand$myProtect@$noexpand}%
		$ReadP@r&1$par Terminus$par
		$endgroup
%		$message{Final:$TextToTypeset@}% Just for debug purposes
		$gdef$myProtect@{}%
		$foreignlanguage{polutonikogreek}{$obeyspaces$TextToTypeset@}%
	}
	
	$gdef$ReadP@r&1$par{%
	  $gdef$p@rTemp{&1}%
	  $ifx$p@rTemp$Terminus%
	  $else
	    $ifcase$Bet@Mode$@ddToText{$par}$or%
	      $ifnum$FirstP@r=1$FirstWord@=1$FirstP@r=0$else$@ddToText{$par$noindent}$fi%
	    $fi%
	    $Re@dWord&1 J 
	    $expandafter$ReadP@r
	  $fi
	}
	
	$gdef$Re@dWord&1 {%
	  $gdef$wordTemp@{&1}%
	  $if&1J%
	  $else$ifx$wordTemp@$empty@
	    $else
	      $ifnum$FirstWord@=1$FirstWord@=0$else$@ddToText{{ }}$fi%
	      $ReadCh@r&1 JJJJJJ$Terminus
	    $fi
	    $expandafter$Re@dWord
	  $fi
	}

	$gdef$ReadCh@r&1&2&3&4&5&6$Terminus{%
%	  $message{&1,&2,&3,&4,&5,&6; }% Just for debug purposes
	  $lowercase{$if&1}j%
	    $lowercase{$if&2}j%
	    $else$JW@rning$ReadCh@r&2&3&4&5&6$Terminus
	    $fi
	  $else$if&1*%
	      $if&2#%
	        $ifx$TeubnerLo@ded$relax
	          $H@shWarning{&2}%
	          $ReadCh@r&3&4&5&6$Terminus
	        $else
	          $ifcase1&3$or$HashW@rning$ReadCh@r&3&4&5&6$Terminus
	          $else$ifcase1&4$or$H@ndleHash&3jj$ReadCh@r&4&5&6$Terminus
	            $else$ifcase1&5$or$H@ndleHash&3&4j$ReadCh@r&5&6$Terminus
	              $else$H@ndleHash&3&4&5$ReadCh@r&6$Terminus
	              $fi
	            $fi
	          $fi
	        $fi
	      $else
	        $ifnum$lccode`&2=0
	          $ifnum$lccode`&3=0
	            $ifnum$lccode`&4=0
	              $uppercase{$Bet@Spiritus&2&3&4&5}%
	              $ReadCh@r&6$Terminus
	            $else$uppercase{$Bet@Spiritus&2&3j&4}%
	              $ReadCh@r&5&6$Terminus
	            $fi
	          $else$uppercase{$Bet@Spiritus&2jj&3}%
	            $ReadCh@r&4&5&6$Terminus
	          $fi
	        $else$lowercase{$if&2}v%
	            $@ddCsToText{Digamma}%
	          $else
	            $uppercase{$Bet@Spiritus&3&4&5&2}%
	          $fi
	          $ReadCh@r&3&4&5&6$Terminus
	        $fi
	      $fi
	    $else$if&1#%
	        $ifx$TeubnerLo@ded$relax
	          $H@shWarning{&1}
	          $ReadCh@r&2&3&4&5&6$Terminus
	        $else
	          $ifcase1&2$or$@ddToText{$char254{}}$ReadCh@r&2&3&4&5&6$Terminus
	          $else$ifcase1&3$or$HandleH@sh&2jj$ReadCh@r&3&4&5&6$Terminus
	            $else$ifcase1&4$or$HandleH@sh&2&3j$ReadCh@r&4&5&6$Terminus
	              $else$HandleH@sh&2&3&4$ReadCh@r&5&6$Terminus
	              $fi
	            $fi
	          $fi
	        $fi
	      $else$ifnum$lccode`&1=0
	          $ifnum`&1=45$@ddToText{-}$fi%               -
	          $ifnum`&1=95$@ddToText{--}$fi%              _ -> --
	          $ifnum`&1=46$@ddToText{.}$fi%               .
	          $ifnum`&1=44$@ddToText{,}$fi%               ,
	          $ifnum`&1=58$@ddToText{;}$fi%               : -> ;
	          $ifnum`&1=59$@ddToText{?}$fi%               ; -> ?
	          $ifnum`&1=39$@ddToText{''}$fi%              ' -> ''
	          $ifnum`&1=91$@ddToText{[}$fi%				[
	          $ifnum`&1=93$@ddToText{]}$fi%				]
	          $ifnum`&1=63$SubDotW@rning$fi%              ?
	        $else$lowercase{$if&1}v%
	            $@ddCsToText{digamma}%
	          $else
	            $lowercase{$Bet@Spiritus&2&3&4&1}%
	          $fi
	        $fi
	        $ReadCh@r&2&3&4&5&6$Terminus
	      $fi
	    $fi
	  $fi
	}
	
	$gdef$HandleH@sh&1&2&3{% for unprefixed hashes: #...
%		$message{hash: &1,&2,&3}% Just for debug purposes
		$ifcase1&1$or$else
			$ifcase&1$HandleH@sh&2&3j%
				$or$ifcase1&2$or$@ddCsToText{koppa}%		#1
					$else$ifcase&2%
						$or
						$or$ifcase1&3$or$@ddToText{---}%	#12
							$fi
						$fi
					$fi
				$or$ifcase1&2$or$@ddCsToText{stigma}%		#2
					$else$ifcase&2%
						$or
						$or$ifcase1&3$or$@ddToText{$char255{}}%	#22
							$fi
						$fi
					$fi
				$or$ifcase1&2$or$@ddCsToText{coppa}%		#3
					$fi
				$or
				$or$ifcase1&2$or$@ddCsToText{sampi}%		#5
					$fi
				$or$ifcase1&2$or$@ddCsToText{paragr}%		#6
					$fi
				$or
				$or
				$or
			$else
			$fi
		$fi
	}
	
	$gdef$H@ndleHash&1&2&3{% for hashes with asterisk prefix: *#...
%		$message{Hash: &1,&2,&3}% Just for debug purposes
		$ifcase1&1$or$else
			$ifcase&1$H@ndleHash&2&3j%
				$or
				$or$ifcase1&2$or$@ddCsToText{Stigma}%		*#2
					$fi
				$or$ifcase1&2$or$@ddCsToText{Coppa}%		*#3
					$fi
				$or
				$or$ifcase1&2$or$@ddCsToText{Sampi}%		*#5
					$fi
				$or
				$or
				$or
				$or
			$else
			$fi
		$fi
	}

	$gdef$Fin@lSigma&1&2{%
	  $lowercase{$if&1}s%
	    $ifnum`&2=45$suffix@=58
	    $else$ifnum`&2=46$suffix@=58
	      $else$ifnum`&2=44$suffix@=58
	        $else$ifnum`&2=58$suffix@=58
	          $else$ifnum`&2=59$suffix@=58
	            $else$ifnum`&2=63$suffix@=58
	              $else$advance$suffix@`&2
	              $fi
	            $fi
	          $fi
	        $fi
	      $fi
	    $fi
	  $fi
	}

	$gdef$Bet@Spiritus&1&2&3&4{%
	  $Fin@lSigma&4&1%
	  $if&1($@ddToText{<}$Bet@Accent&2&3&4%
	  $else$if&1)$@ddToText{>}$Bet@Accent&2&3&4%
	    $else$if&1+$@ddToText{"}$Bet@Accent&2&3&4%
	      $else$Bet@Accent&1&2&4%
	      $fi
	    $fi
	  $fi
	}

	{%
		$catcode`$~=12
		$gdef$Bet@Accent&1&2&3{%
	      $if&1/$@ddToText{'}$Bet@IotaSigma&2&3%
	      $else$if&1\$@ddToText{`}$Bet@IotaSigma&2&3%
	        $else$if&1=$@ddToText{~}$Bet@IotaSigma&2&3%
	          $else$if&1!$@ddToText{`}$Bet@IotaSigma&2&3% workaround, see below
	          $else$Bet@IotaSigma&1&3%
	          $fi% this is a workaround for the footnote bug (when using betacode within another command)
	          $fi
	        $fi
	      $fi
	    }
    }

	$gdef$Bet@IotaSigma&1&2{%
	  $if&2s%
	    $ifcase$suffix@$expandafter$SigmaW@rning$number$suffix@
	      $or$@ddToText{sv}%
	      $or$@ddToText{c}%
	      $or$LunateW@rning
	      $or$expandafter$SigmaW@rning$number$suffix@
	      $or$expandafter$SigmaW@rning$number$suffix@
	      $or$expandafter$SigmaW@rning$number$suffix@
	      $or$expandafter$SigmaW@rning$number$suffix@
	      $or$expandafter$SigmaW@rning$number$suffix@
	      $or$expandafter$SigmaW@rning$number$suffix@
	    $else
	      $ifnum$suffix@=58$@ddToText{s}%
	      $else$@ddToText{sv}%
	      $fi
	    $fi
	  $else$Ch@rCode=`&2
	    $lowercase{$if&2}q$advance$Ch@rCode-7$fi
	    $lowercase{$if&2}c$advance$Ch@rCode21$fi
	    $lowercase{$if&2}x$advance$Ch@rCode-7$fi
	    $@ddCharToText{$number$Ch@rCode}%
	  $fi
	  $if&1|$@ddToText{|}%
	  $fi
	  $suffix@=-48
	}
}