% \iffalse meta-comment
%
% It 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.
%
% This work has the LPPL maintenance status "maintained".
%
% The Current Maintainer of this work is Udi Fogiel.
%
% The list of derived (unpacked) files belonging to the distribution
% and covered by LPPL is defined by the unpacking scripts (with
% extension .ins) which are part of the distribution.
% \fi
%
% \iffalse meta-comment
% Hebrew language definition and additional packages.
% Copyright (C) 1997 -- 2005 Boris Lavva and Johannes Braams.
%
% Copyright (C) 2023 Udi Fogiel.
% All rights reserved.
%
%<*calendar>
%% TeX & LaTeX macros for computing Hebrew date from Gregorian one
%% Copyright (C) 1991 by Michail Rozman,
[email protected]
%%
%</calendar>
% \fi
%
%
% \iffalse
%<hebrew>\ProvidesFile{hebrew.ldf}
%<rightleft>\ProvidesFile{rlbabel.def}
%<calendar>\ProvidesPackage{hebcal}
%<newcode>\ProvidesPackage{hebrew_newcode}
%<pccode>\ProvidesPackage{hebrew_p}
%<oldcode>\ProvidesPackage{hebrew_oldcode}
%<*driver>
\ProvidesFile{hebrew.drv}
%</driver>
% \fi
% \ProvidesFile{hebrew.dtx}
[2023/08/22 v2.4a %
% \iffalse
%<hebrew> Hebrew language definition from the babel system
%<rightleft> Right-to-Left support from the babel system
%<calendar> Hebrew calendar
%<driver> Driver file for hebrew support
%<newcode> Package for backwards compatibility
%<pccode> Package for backwards compatibility
%<oldcode> Package for backwards compatibility
% \fi
Hebrew language support from the babel system]
%
% \iffalse
% \subsection{A driver for this document}
%
% The next bit of code contains the documentation driver file for
% \TeX{}, i.e., the file that will produce the documentation you are
% currently reading. It will be extracted from this file by the \dst{}
% program.
%
% \begin{macrocode}
%<*driver>
\documentclass{ltxdoc}
\providecommand\babel{\textsf{babel}}
\providecommand\file[1]{\texttt{#1}}
\makeatletter
% \end{macrocode}
%
% The code lines are numbered within sections,
% \begin{macrocode}
\@addtoreset{CodelineNo}{section}
\renewcommand\theCodelineNo{%
\reset@font\scriptsize\thesection.\arabic{CodelineNo}}
% \end{macrocode}
% which should also be visible in the index; hence this
% redefinition of a macro from \file{doc.sty}.
% \begin{macrocode}
\renewcommand\codeline@wrindex[1]{\if@filesw
\immediate\write\@indexfile
{\string\indexentry{#1}%
{\number\c@section.\number\c@CodelineNo}}\fi}
% \end{macrocode}
%
% The glossary environment is used or the change log, but its
% definition needs changing for this document.
% \begin{macrocode}
\renewenvironment{theglossary}{%
\glossary@prologue%
\GlossaryParms \let\item\@idxitem \ignorespaces}%
{}
\makeatother
\DisableCrossrefs
\CodelineIndex
\RecordChanges
\title{Hebrew language support from the \babel\ system}
\author{Boris Lavva\and Udi Fogiel}
\date{Printed \today}
\begin{document}
\maketitle
\tableofcontents
\DocInput{hebrew.dtx}
\clearpage
\def\filename{index}
\PrintIndex
\clearpage
\def\filename{changes}
\PrintChanges
\end{document}
%</driver>
% \end{macrocode}
% \fi
%
% \providecommand\babel{\textsf{babel}}
% \providecommand\dst{\textsc{docstrip}}
% \providecommand\file[1]{\texttt{#1}}
% \providecommand\pkg[1]{\texttt{#1}}
% \providecommand\XeT{X\kern-.125em\lower.5ex\hbox{E}\kern-.1667emT\@}
% \providecommand\scrunch{\setlength{\itemsep}{-.05in}}
% \GetFileInfo{hebrew.dtx}
%
% \changes{hebrew~0.1}{??/??/??}{%
% Preliminary \LaTeX\ Hebrew option (by Sergio Fogel)}
% \changes{hebrew~0.2}{??/??/??}{%
% Corrections and additions (by Rama Porrat)}
% \changes{hebrew~0.6}{??/??/??}{Additions (by Yael Dubinsky)}
% \changes{hebrew~1.2}{??/??/??}{%
% Bilingual tables, penalties, documentation and more changes
% (by Yaniv Bargury)}
% \changes{hebrew~1.30}{1992/05/15}{%
% Font selection, various (by Alon Ziv)}
% \changes{hebrew~1.31}{1993/02/22}{Bug fixes (by Alon Ziv)}
% \changes{hebrew~1.32}{1993/03/10}{Made font-change command
% for numbers `\cs{protect}'ed (by Alon Ziv)}
% \changes{hebrew~1.33}{1993/03/11}{%
% Made \cs{refstepcounter} work using \cs{@ltor} (by Alon Ziv)}
% \changes{hebrew~1.34}{1993/03/22}{%
% Moved font loading to another file. Added \cs{mainsec}.
% Made all text strings be produced by control codes (similar to
% \LaTeX 2.09 Mar '92). Fixed \cs{noindent} (by Alon Ziv)}
% \changes{hebrew~1.35}{1993/03/22}{%
% Moved the texts to a file selected by the current encoding
% (by Alon Ziv)}
% \changes{hebrew~1.36}{1993/03/24}{Use \TeX\ tricks to redefine
% \cs{theXXXX} without keeping old definitions.
% Use only \cs{@eng} for direction/font change (removed \cs{@ltor}).
% Switched from use of \cs{mainsec} to code taken from \babel\
% system (by Alon Ziv)}
% \changes{hebrew~1.37}{1993/03/28}{%
% Use \cs{add@around} in defining font size commands. Small bug
% fixes (by Alon Ziv)}
% \changes{hebrew~1.38}{1993/04/20}{%
% \cs{everypar} changed so that \cs{noindent} works unmodified
% (by Alon Ziv, thanks to Chris Rowley)}
% \changes{hebrew~1.39}{1993/08/10}{%
% Redefined primitive sectioning commands. Changed \cs{include} so
% it finds \texttt{.h}, \texttt{.xet}, and \texttt{.ltx} files (no
% extension needed). Reinstated use of \cs{@ltor} (by Alon Ziv)}
% \changes{hebrew~1.40}{1993/09/01}{Added the \cs{@brackets} hack
% (by Alon Ziv)}
% \changes{hebrew~1.41}{1993/09/09}{%
% Reworked towards using NFSS2. Changed some macro names to be more
% logical: renamed \cs{@ltor} to \cs{@number}, \cs{@eng} to
% \cs{@latin}, and (in \texttt{hebrew.ldf}) \cs{@heb} to
% \cs{@hebrew} (by Alon Ziv)}
% \changes{hebrew~1.42}{1993/09/22}{%
% Made list environments work better. Fixed thebibliography
% environment (by Alon Ziv)}
% \changes{hebrew~2.0a}{1998/01/01}{%
% Completely rewritten for \LaTeXe\ and \babel\ support. Various
% input and font encodings (with NFSS2) are supported too. The
% original \pkg{hebrew.sty} is divided to a number of packages and
% definition files for better readability and extensibility. Added
% some user- and code-level documentation inside the \texttt{.dtx}
% and \texttt{.fdd} files, and \LaTeX -driven installation with
% \pkg{hebrew.ins} (by Boris Lavva)}
% \changes{hebrew~2.1}{2000/11/23}{%
% corrections from Sivan Toledo: sender name in letter, and section name in
% headings. (by Tzafrir Cohen)}
% \changes{hebrew~2.2}{2000/12/11}{%
% renamed hebrew letters to heb* (e.g.: alef renamed to hebalef)
% (by Tzafrir Cohen)}
% \changes{hebrew~2.3}{2001/02/27}{
% added several \cs{@ifclassloaded}\{slides\} to allow the use of the
% slides class. (by Tzafrir Cohen)}
% \changes{hebrew~2.3a}{2001/07/09}{
% The documentation should now be built fine (broken since at least
% 2.1, and probably 2.0) (by Tzafrir Cohen)}
% \changes{hebrew~2.3b}{2001/08/16}{
% minor clean-ups. The documentation builds now with no warnings.
% Also removed \cs{R} from the caption macro (added in 2.1)
% Added internal \cs{@ensure@L} and \cs{@ensure@R}
% (Is there a real need for them? Maybe should they be exposed?)
% (by Tzafrir Cohen)}
% \changes{hebrew~2.3c}{2001/10/05}{
% a temporary fix to the \cs{gim} macro. Should be replaced by stuff
% from hebcal.
% (by Tzafrir Cohen)}
% \changes{hebrew~2.3d}{2002/01/04}{
% Initial support for the prosper class. Added \cs{arabicnorl} .
% (by Tzafrir Cohen)}
% \changes{hebrew~2.3e}{2002/08/09}{
% Removing hebtech from this distriution (not relevant to babel),
% added \cs{HeblatexEncoding}. some docs cleanup
% (by Tzafrir Cohen)}
% \changes{hebrew~2.3f}{2002/12/26}{
% redefined \cs{list} instead of redefining every environment
% that uses it. some pscolor handling, removed HeblatexEncoding
% (don't use 2.3e) (by Tzafrir Cohen)}
% \changes{hebrew~2.3g}{2003/06/05}{
% Reimplemented the printing of Hebrew numerals and Hebrew
% counters; modified \pkg{hebcal.sty} to use this implementation
% when typesetting Hebrew dates; added option |full| to package
% \pkg{hebcal}; also removed some gratuitous
% spaces inserted by \pkg{hebcal.sty} by adding comment marks.
% CAUTION: the changes to \pkg{hebcal.sty} make it dependent on
% \pkg{babel} and not useable as a stand-alone package. Is this a
% problem? (by Ron Artstein)}
% \changes{hebrew~2.4}{2023/08/16}{
% Moving hebinp and hebrew.fdd to a seperate package.
% Changing the default input encoding to utf8 and
% default font encoding to NHE8.
% Merging heb209 and hebrew.dtx.
% Fixed bugs in \everypar and
% checked that \cs{l@chapter} is defined (Udi Fogiel)}
%
% \section{The Hebrew language}\label{sec:hebrew}
%
% The file \file{\filename}\footnote{The Hebrew language support
% files described in this section have version number \fileversion\
% and were last revised on \filedate.} provides the following
% packages and files for Hebrew language support:
% \begin{description}
% \item[\file{hebrew.ldf}] file defines all the language-specific
% macros for the Hebrew language.
% \item[\file{rlbabel.def}] file is used by |hebrew.ldf| for
% bidirectional versions of the major \LaTeX{} commands and
% environments. It is designed to be used with other right-to-left
% languages, not only with Hebrew.
% \item[\pkg{hebcal.sty}] package defines a set of macros for
% computing Hebrew date from Gregorian one.
% \end{description}
%
% Additional Hebrew input and font encoding definition files that
% should be included and used with \file{hebrew.ldf} are
% the files were moved to the hebrew-fonts package):
% \begin{description}
% \item[\file{hebinp.dtx}] provides Hebrew input encodings, such as
% ISO 8859-8, MS Windows codepage 1255 or IBM PC codepage 862.
% \item[\file{hebrew.fdd}] contains Hebrew font encodings, related
% font definition files and \pkg{hebfont} package that
% provides Hebrew font switching commands.
% \end{description}
%
% \LaTeX~2.09 compatibility files are included with
% \file{heb209.dtx} and gives possibility to compile existing
% \LaTeX~2.09 Hebrew documents with small (if any) changes (see
% Section~\ref{sec:heb209} on page~\pageref{sec:heb209} for
% details).
%
% Finally, optional document class \pkg{hebtech} may be useful for
% writing theses and dissertations in both Hebrew and English (and
% any other languages included with \babel). It designed to meet
% requirements of the Graduate School of the Technion --- Israel
% Institute of Technology.
%
% \emph{As of version 2.3e hebtech is no longer distributed together
% with heblatex. It should be part of a new "hebclasses" package}
%
% \subsection{Acknowledgement}
%
% The following people have contributed to Hebrew package in one
% way or another, knowingly or unknowingly. In alphabetical order:
% Irina Abramovici, Yaniv Bargury, Yael Dubinsky, Sergio Fogel,
% Dan Haran, Rama Porrat, Michail Rozman, Alon Ziv.
%
% Tatiana Samoilov and Vitaly Surazhsky found a number of serious
% bugs in preliminary version of Hebrew package.
%
% A number of other people have contributed comments and
% information. Specific contributions are acknowledged within the
% document.
%
% I want to thank my wife, Vita, and son, Mishka, for their
% infinite love and patience.
%
% If you made a contribution and I haven't mentioned it, don't
% worry, it was an accident. I'm sorry. Just tell me and I will add
% you to the next version.
%
% \StopEventually{}
%
% \subsection{The {\normalfont\dst{}} modules}
%
% The following modules are used in the implementation to direct
% \dst{} in generating external files:
% \begin{center}
% \begin{tabular}{@{}ll}
% driver & produce a documentation driver file \\[4pt]
% hebrew & produce Hebrew language support file\\
% rightleft & create right-to-left support file\\
% calendar & create Hebrew calendar package
% \end{tabular}
% \end{center}
% A typical \dst{} command file would then have entries like:
% \begin{quote}
% |\generateFile{hebrew.ldf}{t}{\from{hebrew.dtx}{hebrew}}|
% \end{quote}
%
% \subsection{Hebrew language definitions}
%
% The macro |\LdfInit| takes care of preventing that this file is
% loaded more than once, checking the category code of the |@|
% sign, etc.
% \begin{macrocode}
%<*hebrew>
\LdfInit{hebrew}{captionshebrew}
% \end{macrocode}
%
% When this file is read as an option, i.e., by the |\usepackage|
% command, |hebrew| will be an `unknown' language, in which case we
% have to make it known. So we check for the existence of
% |\l@hebrew| to see whether we have to do something here.
%
% \begin{macrocode}
\ifx\l@hebrew\@undefined
\@nopatterns{Hebrew}%
\adddialect\l@hebrew0
\fi
% \end{macrocode}
%
% \begin{macro}{\hebrewencoding}
% \emph{FIX DOCS REGARDING 8BIT}
%
% Typesetting Hebrew texts implies that a special input and output
% encoding needs to be used. Generally, the user may choose
% between different available Hebrew encodings provided. The
% current support for Hebrew uses all available fonts from the
% Hebrew University of Jerusalem encoded in `old-code' 7-bit
% encoding also known as Israeli Standard SI-960. We define for
% these fonts the Local Hebrew Encoding |LHE| (see the file
% |hebrew.fdd| for more details), and the |LHE| encoding definition
% file should be loaded by default.
%
% Other fonts are available in windows-cp1255 (a superset of ISO-8859-8
% with nikud). For those, the encoding |HE8| should be used. Such fonts
% are, e.g., windows' TrueType fonts (once cnverted to Type1 or MetaFont)
% and IBM's Type1 fonts.
%
% However, if an user wants to use another font encoding, for
% example, cyrillic encoding T2 and extended latin encoding T1, ---
% he/she has to load the corresponding file \emph{before} the
% \pkg{hebrew} package. This may be done in the following way:
% \begin{quote}
% |\usepackage[LHE,T2,T1]{fontenc}|\\
% |\usepackage[hebrew,russian,english]{babel}|
% \end{quote}
% We make sure that the |LHE| encoding is known to \LaTeX{} at end
% of this package.
%
% Also note that if you want to use the encoding |HE8| , you should define
% the following in your document, \emph{before loading babel}:
% \begin{quote}
% |\def\HeblatexEncoding{HE8}|\\
% |\def\HeblatexEncodingFile{he8enc}|
% \end{quote}
% \changes{hebrew-2.3h}{2004/02/20}{Make LHE the default encoding for
% compatibility reasons}
% \begin{macrocode}
% \changes{hebrew~2.4}{2023/08/16}{Make NHE8 the default font encoding}
% \changes{hebrew~2.4a}{2023/08/16}{Better handeling for font encoding}
\@ifundefined{HeblatexEncoding}
{
\@ifl@aded{def}{nhe8enc}
{
\providecommand*\HeblatexEncoding{NHE8}
\providecommand*\HeblatexEncodingFile{nhe8enc}
}
{
\@ifl@aded{def}{he8enc}
{
\providecommand*\HeblatexEncoding{HE8}
\providecommand*\HeblatexEncodingFile{he8enc}
}
{
\@ifl@aded{def}{lheenc}
{
\providecommand*\HeblatexEncoding{LHE}
\providecommand*\HeblatexEncodingFile{lheenc}
}
{
\providecommand*\HeblatexEncoding{NHE8}
\providecommand*\HeblatexEncodingFile{nhe8enc}
}
}
}
}{}
\@ifl@aded{def}{\HeblatexEncodingFile}{}
{\input{\HeblatexEncodingFile.def}}
\newcommand{\heblatex@set@encoding}[2]{
}
\edef\hebrewencoding{\HeblatexEncoding}
\def\heb@NHEenc{NHE8}
\ifx\heb@NHEenc\hebrewencoding
\def\@brackets#1#2#3{#1#2#3}
\fi
% \end{macrocode}
% \end{macro}
% \changes{hebrew~2.4}{2023/08/16}{Assuming utf8 as default input encoding.}
%
% The next step consists of defining commands to switch to (and
% from) the Hebrew language.
%
% \begin{macro}{\hebrewhyphenmins}
% This macro is used to store the correct values of the hyphenation
% parameters |\lefthyphenmin| and |\righthyphenmin|. They are set
% to~2.
% \changes{hebrew~2.0b}{2000/09/22}{Now use \cs{providehyphenmins} to
% provide a default value}
% \begin{macrocode}
\providehyphenmins{\CurrentOption}{\tw@\tw@}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\captionshebrew}
% The macro |\captionshebrew| replaces all captions used in the four
% standard document classes provided with \LaTeXe with their Hebrew
% equivalents.
% \changes{hebrew-2.0b}{2000/09/20}{Added \cs{glossaryname}}
% \begin{macrocode}
\addto\captionshebrew{%
\def\prefacename{\@ensure@R{\hebmem\hebbet\hebvav\hebalef}}%
\def\refname{\@ensure@R{\hebresh\hebshin\hebyod\hebmem\hebtav\ %
\hebmem\hebqof\hebvav\hebresh\hebvav\hebtav}}%
\def\abstractname{\@ensure@R{\hebtav\hebqof\hebtsadi\hebyod\hebresh}}%
\def\bibname{\@ensure@R{\hebbet\hebyod\hebbet\heblamed\hebyod\hebvav%
\hebgimel\hebresh\hebpe\hebyod\hebhe}}%
\def\chaptername{\@ensure@R{\hebpe\hebresh\hebqof}}%
\def\appendixname{\@ensure@R{\hebnun\hebsamekh\hebpe\hebhet}}%
\def\contentsname{\@ensure@R{%
\hebtav\hebvav\hebkaf\hebfinalnun\ %
\hebayin\hebnun\hebyod\hebyod\hebnun\hebyod\hebfinalmem}}%
\def\listfigurename{\@ensure@R{%
\hebresh\hebshin\hebyod\hebmem\hebtav\ %
\hebalef\hebyod\hebvav\hebresh\hebyod\hebfinalmem}}%
\def\listtablename{\@ensure@R{%
\hebresh\hebshin\hebyod\hebmem\hebtav\
\hebtet\hebbet\heblamed\hebalef\hebvav\hebtav}}%
\def\indexname{\@ensure@R{\hebmem\hebpe\hebtav\hebhet}}%
\def\figurename{\@ensure@R{\hebalef\hebyod\hebvav\hebresh}}%
\def\tablename{\@ensure@R{\hebtet\hebbet\heblamed\hebhe}}%
\def\partname{\@ensure@R{\hebhet\heblamed\hebqof}}%
\def\enclname{\@ensure@R{\hebresh\hebtsadi"\hebbet}}%
\def\ccname{\@ensure@R{\hebhe\hebayin\hebtav\hebqof\hebyod%
\hebfinalmem}}%
\def\headtoname{\@ensure@R{\hebalef\heblamed}}%
\def\pagename{\@ensure@R{\hebayin\hebmem\hebvav\hebdalet}}%
\def\psname{\@ensure@R{\hebnun.\hebbet.}}%
\def\seename{\@ensure@R{\hebresh\hebalef\hebhe}}%
\def\alsoname{\@ensure@R{\hebresh\hebalef\hebhe \hebgimel%
\hebmemesof}}%
\def\proofname{\@ensure@R{\hebhe\hebvav\hebkaf\hebhet\hebhe}}
\def\glossaryname{\@ensure@L{Glossary}}% <-- Needs translation
}
% \end{macrocode}
% \end{macro}
% \begin{macro}{\slidelabel}
% Here we fix the macro |slidelabel| of the seminar package. Note
% that this still won't work well enough when overlays will be
% involved
% \begin{macrocode}
\@ifclassloaded{seminar}{%
\def\slidelabel{\bf \if@rl\R{\hebshin\hebqof\hebfinalpe{} \theslide}%
\else\L{Slide \theslide}%
\fi}%
}{}
% \end{macrocode}
% \end{macro}
%
% Here we provide an user with translation of Gregorian dates
% to Hebrew. In addition, the \pkg{hebcal} package can be used
% to create Hebrew calendar dates.
%
% \begin{macro}{\hebmonth}
% The macro |\hebmonth{|\emph{month}|}| produces month names in
% Hebrew.
% \begin{macrocode}
\def\hebmonth#1{%
\ifcase#1\or \hebyod\hebnun\hebvav\hebalef\hebresh\or %
\hebpe\hebbet\hebresh\hebvav\hebalef\hebresh\or %
\hebmem\hebresh\hebfinaltsadi\or %
\hebalef\hebpe\hebresh\hebyod\heblamed\or %
\hebmem\hebalef\hebyod\or \hebyod\hebvav\hebnun\hebyod\or %
\hebyod\hebvav\heblamed\hebyod\or %
\hebalef\hebvav\hebgimel\hebvav\hebsamekh\hebtet\or %
\hebsamekh\hebpe\hebtet\hebmem\hebbet\hebresh\or %
\hebalef\hebvav\hebqof\hebtet\hebvav\hebbet\hebresh\or %
\hebnun\hebvav\hebbet\hebmem\hebbet\hebresh\or %
\hebdalet\hebtsadi\hebmem\hebbet\hebresh\fi}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\hebdate}
% The macro |\hebdate{|\emph{day}|}{|\emph{month}|}{|\emph{year}|}|
% translates a given Gregorian date to Hebrew.
% \begin{macrocode}
\def\hebdate#1#2#3{%
\beginR\beginL\number#1\endL\ \hebbet\hebmonth{#2}
\beginL\number#3\endL\endR}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\hebday}
% The macro |\hebday| will replace |\today| command when in Hebrew
% mode.
% \begin{macrocode}
\def\hebday{\hebdate{\day}{\month}{\year}}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\datehebrew}
% The macro |\datehebrew| redefines the command |\today| to produce
% Gregorian dates in Hebrew. It uses the macro |\hebday|.
% \begin{macrocode}
\def\datehebrew{\let\today=\hebday}
% \end{macrocode}
% \end{macro}
%
% The macro |\extrashebrew| will perform all the extra definitions
% needed for the Hebrew language. The macro |\noextrashebrew|
% is used to cancel the actions of |\extrashebrew|.
%
% \begin{macro}{\extrashebrew}
% We switch font encoding to Hebrew and direction to
% right-to-left. We cannot use the regular language switching
% commands (for example, |\sethebrew| and |\unsethebrew| or
% |\selectlanguage{hebrew}|), when in restricted horizontal mode,
% because it will result in \emph{unbalanced} |\beginR| or
% |\beginL| primitives.
% Instead, in \TeX 's restricted horizontal mode, the
% |\L{|\emph{latin text}|}| and |\R{|\emph{hebrew text}|}|, or
% |\embox{|\emph{latin text}|}| and |\hmbox{|\emph{hebrew text}|}|
% should be used.
%
% Hence, we use |\beginR| and |\beginL| switching commands only
% when not in restricted horizontal mode.
% \begin{macrocode}
\addto\extrashebrew{%
\tohebrew%
\ifhmode\ifinner\else\beginR\fi\fi}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\noextrashebrew}
% The macro |\noextrashebrew| is used to cancel the actions of
% |\extrashebrew|. We switch back to the previous font encoding and
% restore left-to-right direction.
% \begin{macrocode}
\addto\noextrashebrew{%
\fromhebrew%
\ifhmode\ifinner\else\beginL\fi\fi}
% \end{macrocode}
% \end{macro}
%
% Generally, we can switch to- and from- Hebrew by means of
% standard \babel -defined commands, for example,
% \begin{quote}
% |\selectlanguage{hebrew}|
% \end{quote}
% or
% \begin{quote}
% |\begin{otherlanguage}{hebrew}|\\
% \hspace*{1.5em} some Hebrew text\\
% |\end{otherlanguage}|
% \end{quote}
% Now we define two additional commands that offer the possibility
% to switch to and from Hebrew language. These commands are
% backward compatible with the previous versions of
% \pkg{hebrew.sty}.
%
% \begin{macro}{\sethebrew}
% \begin{macro}{\unsethebrew}
% The command |\sethebrew| will switch from the current font encoding
% to the hebrew font encoding, and from the current direction of
% text to the right-to-left mode. The command |\unsethebrew| switches
% back.
%
% Both commands use standard right-to-left switching macros
% |\setrllanguage{|\emph{ r2l language name}|}| and
% |\unsetrllanguage{|\emph{r2l language name}|}|, that
% defined in the \file{rlbabel.def} file.
% \begin{macrocode}
\def\sethebrew{\setrllanguage{hebrew}}
\def\unsethebrew{\unsetrllanguage{hebrew}}
% \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\hebrewtext}
% \begin{macro}{\nohebrewtext}
% The following two commands are \emph{obsolete} and work only
% in \LaTeX 2.09 compatibility mode. They are synonyms of
% |\sethebrew| and |\unsethebrew| defined above.
% \begin{macrocode}
\if@compatibility
\let\hebrewtext=\sethebrew
\let\nohebrewtext=\unsethebrew
\fi
% \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\tohebrew}
% \begin{macro}{\fromhebrew}
% These two commands change only the current font encoding to- and
% from- Hebrew encoding. Their implementation uses
% |\@torl{|\emph{language name}|}| and |\@fromrl| macros defined in
% \file{rlbabel.def} file. Both commands may be useful \emph{only}
% for package and class writers, not for regular users.
% \begin{macrocode}
\def\tohebrew{\@torl{hebrew}}%
\def\fromhebrew{\@fromrl}
% \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\@hebrew}
% Sometimes we need to preserve Hebrew mode without knowing in
% which environment we are located now. For these cases, the
% |\@hebrew{|\emph{hebrew text}|}| macro will be useful. Not that
% this macro is similar to the |\@number| and |\@latin| macros
% defined in \file{rlbabel.def} file.
% \begin{macrocode}
\def\@@hebrew#1{\beginR{{\tohebrew#1}}\endR}
\def\@hebrew{\protect\@@hebrew}
% \end{macrocode}
% \end{macro}
%
% \subsubsection{Hebrew numerals}
%
% We provide commands to print numbers in the traditional
% notation using Hebrew letters. We need commands that print
% a Hebrew number from a decimal input, as well as commands
% to print the value of a counter as a Hebrew number.
% \begin{macro}{\if@gim@apost}
% \begin{macro}{\if@gim@final}
% Hebrew numbers can be written in various styles: with or without
% apostrophes, and with the letters kaf, mem, nun, pe, tsadi as either
% final or initial forms when they are the last letters in the
% sequence. We provide two flags to set the style options.
% \begin{macrocode}
\newif\if@gim@apost % whether we print apostrophes
\newif\if@gim@final % whether we use final or initial letters
% \end{macrocode}
% \end{macro}
% \end{macro}
% \begin{macro}{\hebrewnumeral}
% \begin{macro}{\Hebrewnumeral}
% \begin{macro}{\Hebrewnumeralfinal}
% The commands that print a Hebrew number
% must specify the style locally: relying on a global style
% option could cause a counter to
% print in an inconsistent manner---for instance, page numbers
% might appear in different styles if the global style option
% changed mid-way through a document.
% The commands only allow three of the four possible flag
% combinations (I do not know of a use that requires the
% combination of final letters and no apostrophes --RA).
%
% Each command sets the style flags and calls |\@hebrew@numeral|.
% Double braces are used in order to protect the values of
% |\@tempcnta| and |\@tempcntb|, which are changed by this call;
% they also keep the flag assignments local (this is not important
% because the global values are never used).
% \begin{macrocode}
\newcommand*{\hebrewnumeral}[1] % no apostrophe, no final letters
{{\@gim@finalfalse\@gim@apostfalse\@hebrew@numeral{#1}}}
\newcommand*{\Hebrewnumeral}[1] % apostrophe, no final letters
{{\@gim@finalfalse\@gim@aposttrue\@hebrew@numeral{#1}}}
\newcommand*{\Hebrewnumeralfinal}[1] % apostrophe, final letters
{{\@gim@finaltrue\@gim@aposttrue\@hebrew@numeral{#1}}}
% \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% \begin{macro}{\alph}
% \begin{macro}{\@alph}
% \begin{macro}{\Alph}
% \begin{macro}{\@Alph}
% \begin{macro}{\Alphfinal}
% \begin{macro}{\@Alphfinal}
% Counter-printing commands are based on the above commands. The
% natural name for the counter-printing commands is |\alph|, because
% Hebrew numerals are the only way to represent numbers with
% Hebrew letters (kaf always means~20, never~11). Hebrew has no
% uppercase letters, hence no need for the familiar meaning of |\Alph|;
% we therefore define |\alph| to print counters as Hebrew numerals
% without apostrophes, and |\Alph| to print with apostrophes. A third
% form, |\Alphfinal|, is provided to print with apostrophes and final
% letters, as is required for Hebrew year designators. The commands
% |\alph| and |\Alph| are defined in \pkg{latex.ltx}, and we only
% need to redefine the internal commands |\@alph| and
% |\@Alph|; for |\Alphfinal| we need to provide both a wrapper and
% an internal command.
% The counter printing commands are made semi-robust: without the
% |\protect|, commands like |\theenumii| break (I'm not quite clear
% on why this happens, --RA); at the same time, we cannot make the
% commands too robust (e.g.~with |\DeclareRobustCommand|) because
% this would enter the command name rather than its value into
% files like |.aux|, |.toc| etc\@.
% The old meanings of meaning of |\@alph| and |\@Alph| are saved
% upon entering Hebrew mode and restored upon exiting it.
% \begin{macrocode}
\addto\extrashebrew{%
\let\saved@alph=\@alph%
\let\saved@Alph=\@Alph%
\renewcommand*{\@alph}[1]{\protect\hebrewnumeral{\number#1}}%
\renewcommand*{\@Alph}[1]{\protect\Hebrewnumeral{\number#1}}%
\def\Alphfinal#1{\expandafter\@Alphfinal\csname c@#1\endcsname}%
\providecommand*{\@Alphfinal}[1]{\protect\Hebrewnumeralfinal{\number#1}}}
\addto\noextrashebrew{%
\let\@alph=\saved@alph%
\let\@Alph=\saved@Alph}
% \end{macrocode}
% Note that |\alph| (without apostrophes) is already the
% appropriate choice for the second-level enumerate label, and
% |\Alph| (with apostrophes) is an appropriate choice for appendix;
% however, the default \LaTeX\ labels need to be redefined for
% appropriate cross-referencing, see below.
% \LaTeX\ default class files specify |\Alph| for
% the fourth-level enumerate level, this should probably be changed.
% Also, the way labels get flushed left by default looks inappropriate
% for Hebrew numerals, so we should redefine |\labelenumii| as well
% as |\labelenumiv| (presently not implemented).
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \begin{macro}{\theenumii}
% \begin{macro}{\theenumiv}
% \begin{macro}{\label}
% Cross-references to counter labels need to be printed according
% to the language environment in which a label was issued, not
% the environment in which it is called: for example, a label~(1b)
% issued in a Latin environment should be referred to as~(1b) in a
% Hebrew text, and label~(2dalet) issued in a Hebrew environment
% should be referred to as~(2dalet) in a Latin text. This was the
% unanimous opinion in a poll sent to the Ivri\TeX\ list.
% We therefore redefine |\theenumii| and |\theenumiv|, so that an
% explicit language instruction gets written to the |.aux| file.
% \begin{macrocode}
\renewcommand{\theenumii}
{\if@rl\protect\hebrewnumeral{\number\c@enumii}%
\else\protect\L{\protect\@@alph{\number\c@enumii}}\fi}
\renewcommand{\theenumiv}
{\if@rl\protect\Hebrewnumeral{\number\c@enumiv}%
\else\protect\L{\protect\@@Alph{\number\c@enumiv}}\fi}
% \end{macrocode}
% We also need to control for the font and direction in which a
% counter label is printed. Direction is straightforward: a Latin
% label like~(1b) should be written left-to-right when called in a
% Hebrew text, and a Hebrew label like~(2dalet) should be written
% right-to-left when called in a Latin text. The font question is
% more delicate, because we should decide whether the numerals
% should be typeset in the font of the language enviroment in which
% the label was issued, or that of the environment in which it is
% called.
% \begin{itemize}
% \item
% A purely numeric label like~(23) looks best if it is set in the
% font of the surrounding language.
% \item
% But a mixed alphanumeric label like~(1b) lookes weird if
% the~`1' is taken from the Hebrew font; likewise, (2dalet) looks
% weird if the~`2' is taken from a Latin font.
% \item
% Finally, mixing the two possibilities is worst, because a
% single Hebrew sentence referring to examples~(1b) and~(2) would
% take the~`1' from the Latin font and the~`2' from the Hebrew
% font, and this looks really awful. (It is also very hard to
% implement).
% \end{itemize}
% In light of the conflicting considerations it seems like there's
% no perfect solution. I have chosen to implement the top option,
% where numerals are taken from the font of the surrounding
% language, because it seems to me that reference to purely numeric
% labels is the most common, so this gives a good solution to the
% majority of cases and a mediocre solution to the minority.
%
% We redefine the |\label| command which writes to the
% |.aux| file. Depending on the language environment we issue
% appropriate |\beginR/L|$\cdots$|\endR/L| commands to control the
% direction without affecting the font. Since these commands do not
% affect the value of |\if@rl|, we cannot use the macro
% |\@brackets| to determine the correct brackets to be used with
% |\p@enumiii|; instead, we let the language environment determine an
% explicit definition.
% \begin{macrocode}
\ifx\heb@NHEenc\HeblatexEncoding
\def\label#1{\@bsphack
\if@rl
\protected@write\@auxout{}%
{\string\newlabel{#1}{{\beginR\@currentlabel\endR}{\thepage}}}%
\else
\protected@write\@auxout{}%
{\string\newlabel{#1}{{\beginL\@currentlabel\endL}{\thepage}}}%
\fi
\@esphack}
\else
\def\label#1{\@bsphack
\if@rl
\def\p@enumiii{\p@enumii)\theenumii(}%
\protected@write\@auxout{}%
{\string\newlabel{#1}{{\beginR\@currentlabel\endR}{\thepage}}}%
\else
\def\p@enumiii{\p@enumii(\theenumii)}%
\protected@write\@auxout{}%
{\string\newlabel{#1}{{\beginL\@currentlabel\endL}{\thepage}}}%
\fi
\@esphack}
\fi
% \end{macrocode}
% NOTE: it appears that the definition of |\label| is
% language-independent and thus belongs in \pkg{rlbabel.def}, but
% this is not the case. The decision to typeset label numerals
% in the font of the surrounding language is reasonable for Hebrew,
% because mixed-font (1b) and (2dalet) are somewhat acceptable. The
% same may not be acceptable for Arabic, whose numeral glyphs are
% radically different from those in the Latin fonts. The decision
% about the direction may also be different for Arabic, which is
% more right-to-left oriented than Hebrew (two examples: dates like
% 15/6/2003 are written left-to-right in Hebrew but right-to-left
% in Arabic; equations like $1+2=3$ are written left-to-right in
% Hebrew but right-to-left in Arabic elementary school textbooks
% using Arabic numeral glyphs). My personal hunch is that a label
% like~(1b) in an Arabic text would be typeset left-to-right if
% the~`1' is a Western glyph, but right-to-left if the~`1' is an
% Arabic glyph. But this is just a guess, I'd have to ask Arab
% typesetters to find the correct answer. --RA.
% \end{macro}
% \end{macro}
% \end{macro}
% \begin{macro}{\appendix}
% The following code provides for the proper printing of appendix
% numbers in tables of contents. Section and chapter headings are
% normally bilingual: regardless of the text language, the author
% supplies each section/chapter with two headings---one for the
% Hebrew table of contents and one for the Latin table of contents.
% It makes sense that the label should be a Latin letter in the
% Latin table of contents and a Hebrew letter in the Hebrew table
% of contents. The definition is similar to that of |\theenumii|
% and |\theenumiv| above, but additional |\protect| commands ensure
% that the entire condition is written the |.aux| file. The
% appendix number will therefore be typeset according to the
% environment in which it is used rather than issued: a Hebrew
% number (with apostrophes) in a Hebrew environment and a Latin
% capital letter in a Latin environment (the command
% |\@@Alph| is set in \pkg{rlbabel.def} to hold the default meaning
% of \LaTeX\ [latin] |\@Alph|, regardless of the mode in which it is
% issued). The net result is that
% the second appendix will be marked with~`B' in the Latin table of
% contents and with `bet' in the Hebrew table of contents; the mark
% in the main text will depend on the language of the appendix itself.
% \begin{macrocode}
\@ifclassloaded{letter}{}{%
\@ifclassloaded{slides}{}{%
\let\@@appendix=\appendix%
\@ifclassloaded{article}{%
\renewcommand\appendix{\@@appendix%
\renewcommand\thesection
{\protect\if@rl\protect\Hebrewnumeral{\number\c@section}%
\protect\else\@@Alph\c@section\protect\fi}}}
{\renewcommand\appendix{\@@appendix%
\renewcommand\thechapter
{\protect\if@rl\protect\Hebrewnumeral{\number\c@chapter}%
\protect\else\@@Alph\c@chapter\protect\fi}}}}}
% \end{macrocode}
% QUESTION: is this also the appropriate way to refer to an
% appendix in the text, or should we retain the original label the
% same way we did with |enumerate| labels?
% ANOTHER QUESTION: are similar redefinitions needed for other
% counters that generate texts in bilingual lists like |.lof/.fol|
% and |.lot/.tol|? --RA.
% \end{macro}
% \begin{macro}{\@hebrew@numeral}
% The command |\@hebrew@numeral| prints a Hebrew number. The groups
% of thousands, millions, billions are separated by apostrophes and
% typeset without apostrophes or final letters; the remainder
% (under 1000) is typeset conventionally, with the selected styles
% for apostrophes and final letters.
% The function calls on |\gim@no@mil| to typeset each
% three-digit block. The algorithm
% is recursive, but the maximum recursion depth is~4 because \TeX\
% only allows numbers up to $2^{31}-1 = 2{,}147{,}483{,}647$.
% The typesetting routine is wrapped in |\@hebrew| in order to
% ensure that numbers are always typeset in Hebrew mode.
%
% Initialize: |\@tempcnta| holds the value, |\@tempcntb| is used for
% calculations.
% \begin{macrocode}
\newcommand*{\@hebrew@numeral}[1]
{\@hebrew{\@tempcnta=#1\@tempcntb=#1\relax
\divide\@tempcntb by 1000
% \end{macrocode}
% If we're under 1000, call |\gim@nomil|
% \begin{macrocode}
\ifnum\@tempcntb=0\gim@nomil\@tempcnta\relax
% \end{macrocode}
% If we're above 1000 then force no apostrophe and no final letter
% styles for the value above~1000, recur for the value above~1000,
% add an apostrophe, and call |\gim@nomil| for the remainder.
% \begin{macrocode}
\else{\@gim@apostfalse\@gim@finalfalse\@hebrew@numeral\@tempcntb}'%
\multiply\@tempcntb by 1000\relax
\advance\@tempcnta by -\@tempcntb\relax
\gim@nomil\@tempcnta\relax
\fi
}}
% \end{macrocode}
% NOTE: is it the case that 15,000 and 16,000 are written as
% yod-he and yod-vav, rather than tet-vav and tet-zayin? This
% vaguely rings a bell, but I'm not certain. If this is the case,
% then the current behavior is incorrect and should be changed. --RA.
% \end{macro}
% \begin{macro}{\gim@nomil}
% The command |\gim@nomil| typesets an integer between 0~and~999
% (for~0 it typesets nothing). The code has been modified from the
% old |hebcal.sty|
% (appropriate credits---Boris Lavva and Michail Rozman ?).
% |\@tempcnta| holds the total value that remains to be typeset.
% At each stage we find the highest valued letter that is
% less than or equal to |\@tempcnta|, and call on |\gim@print| to
% subtract this value and print the letter.
%
% Initialize: |\@tempcnta| holds the value, there is no previous
% letter.
% \begin{macrocode}
\newcommand*{\gim@nomil}[1]{\@tempcnta=#1\@gim@prevfalse
% \end{macrocode}
% Find the hundreds digit.
% \begin{macrocode}
\@tempcntb=\@tempcnta\divide\@tempcntb by 100\relax % hundreds digit
\ifcase\@tempcntb % print nothing if no hundreds
\or\gim@print{100}{\hebqof}%
\or\gim@print{200}{\hebresh}%
\or\gim@print{300}{\hebshin}%
\or\gim@print{400}{\hebtav}%
\or\hebtav\@gim@prevtrue\gim@print{500}{\hebqof}%
\or\hebtav\@gim@prevtrue\gim@print{600}{\hebresh}%
\or\hebtav\@gim@prevtrue\gim@print{700}{\hebshin}%
\or\hebtav\@gim@prevtrue\gim@print{800}{\hebtav}%
\or\hebtav\@gim@prevtrue\hebtav\gim@print{900}{\hebqof}%
\fi
% \end{macrocode}
% Find the tens digit. The numbers 15 and 16 are traditionally
% printed as tet-vav ($9+6$) and tet-zayin ($9+7$) to avoid
% spelling the Lord's name.
% \begin{macrocode}
\@tempcntb=\@tempcnta\divide\@tempcntb by 10\relax % tens digit
\ifcase\@tempcntb % print nothing if no tens
\or % number between 10 and 19
\ifnum\@tempcnta = 16 \gim@print {9}{\hebtet}% tet-zayin
\else\ifnum\@tempcnta = 15 \gim@print {9}{\hebtet}% tet-vav
\else \gim@print{10}{\hebyod}%
\fi % \@tempcnta = 15
\fi % \@tempcnta = 16
% \end{macrocode}
% Initial or final forms are selected according to the current
% style option; |\gim@print| will force a non-final letter in
% non-final position by means of a local style change.
% \begin{macrocode}
\or\gim@print{20}{\if@gim@final\hebfinalkaf\else\hebkaf\fi}%
\or\gim@print{30}{\heblamed}%
\or\gim@print{40}{\if@gim@final\hebfinalmem\else\hebmem\fi}%
\or\gim@print{50}{\if@gim@final\hebfinalnun\else\hebnun\fi}%
\or\gim@print{60}{\hebsamekh}%
\or\gim@print{70}{\hebayin}%
\or\gim@print{80}{\if@gim@final\hebfinalpe\else\hebpe\fi}%
\or\gim@print{90}{\if@gim@final\hebfinaltsadi\else\hebtsadi\fi}%
\fi
% \end{macrocode}
% Print the ones digit.
% \begin{macrocode}
\ifcase\@tempcnta % print nothing if no ones
\or\gim@print{1}{\hebalef}%
\or\gim@print{2}{\hebbet}%
\or\gim@print{3}{\hebgimel}%
\or\gim@print{4}{\hebdalet}%
\or\gim@print{5}{\hebhe}%
\or\gim@print{6}{\hebvav}%
\or\gim@print{7}{\hebzayin}%
\or\gim@print{8}{\hebhet}%
\or\gim@print{9}{\hebtet}%
\fi
}
% \end{macrocode}
% \end{macro}
% \begin{macro}{\gim@print}
% \begin{macro}{\if@gim@prev}
% The actual printing routine typesets a digit with the appropriate
% apostrophes: if a number sequence consists of a
% single letter then it is followed by a single apostrophe, and if
% it consists of more than one letter then a double
% apostrophe is inserted before the last letter.
% We typeset the letters one at a time, keeping a flag that tells
% us if any previous letters had been typeset.
% \begin{macrocode}
\newif\if@gim@prev % flag if a previous letter has been typeset
% \end{macrocode}
% For each letter, we
% first subtract its value from the total. Then,
% \begin{itemize}
% \item
% if the result is zero then this is the last letter; we check
% the flag to see if this is the only letter and print it with
% the appropriate apostrophe;
% \item
% if the result is not zero then there remain additional letters
% to be typeset; we print without an apostrophe and set the
% `previous letter' flag.
% \end{itemize}
% |\@tempcnta| holds the total value that remains to be typeset.
% We first deduct the letter's value from |\@tempcnta|,
% so |\@tempcnta| is zero if and only if this is the last letter.
% \begin{macrocode}
\newcommand*{\gim@print}[2]{% #2 is a letter, #1 is its value.
\advance\@tempcnta by -#1\relax% deduct the value from the remainder
% \end{macrocode}
% If this is the last letter, we print with the appropriate
% apostrophe (depending on the style option):
% if there is a preceding letter, print |"x| if the style calls for
% apostrophes, |x| if it doesn't;
% otherwise, this is the only letter: print |x'| if the style calls
% for apostrophes, |x| if it doesn't.
% \begin{macrocode}
\ifnum\@tempcnta=0% if this is the last letter
\if@gim@prev\if@gim@apost"\fi#2%
\else#2\if@gim@apost'\fi\fi%
% \end{macrocode}
% If this is not the last letter: print a non-final form (by
% forcing a local style option) and set the `previous letter' flag.
% \begin{macrocode}
\else{\@gim@finalfalse#2}\@gim@prevtrue\fi}
% \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\hebr}
% \begin{macro}{\gim}
% The older Hebrew counter commands |\hebr| and |\gim| are retained
% in order to keep older documents from breaking. They are set to
% be equivalent to |\alph|, and their use is deprecated. Note that
% |\hebr| gives different results than it had in the past---it
% now typesets 11 as yod-alef rather than kaf.
% \begin{macrocode}
\let\hebr=\alph
\let\gim=\alph
% \end{macrocode}
% \end{macro}
% \end{macro}
%
% For backward compatibility with `older' \pkg{hebrew.sty}
% packages, we define Hebrew equivalents of some useful \LaTeX\
% commands. Note, however, that 8-bit macros defined in Hebrew
% are no longer supported.
% \begin{macrocode}
\def\hebcopy{\protect\R{\hebhe\hebayin\hebtav\hebqof}}
\def\hebincl{\protect\R{\hebresh\hebtsadi"\hebbet}}
\def\hebpage{\protect\R{\hebayin\hebmem\hebvav\hebdalet}}
\def\hebto{\protect\R{\hebayin\hebdalet}}
% \end{macrocode}
% |\hadgesh| produce ``poor man's bold'' (heavy printout), when
% used with normal font glyphs. It is advisable to use bold font
% (for example, \emph{Dead Sea}) instead of this macro.
% \begin{macrocode}
\def\hadgesh#1{\leavevmode\setbox0=\hbox{#1}%
\kern-.025em\copy0\kern-\wd0
\kern.05em\copy0\kern-\wd0
\kern-.025em\raise.0433em\box0 }
% \end{macrocode}
% |\piska| and |\piskapiska| sometimes used in `older' hebrew
% sources, and should not be used in \LaTeXe.
% \begin{macrocode}
\if@compatibility
\def\piska#1{\item{#1}\hangindent=-\hangindent}
\def\piskapiska#1{\itemitem{#1}\hangindent=-\hangindent}
\fi
% \end{macrocode}
% The following commands are simply synonyms for the standard ones,
% provided with \LaTeXe.
% \begin{macrocode}
\let\makafgadol=\textendash
\let\makafanak=\textemdash
\let\geresh=\textquoteright
\let\opengeresh=\textquoteright
\let\closegeresh=\textquoteleft
\let\openquote=\textquotedblright
\let\closequote=\textquotedblleft
\let\leftquotation=\textquotedblright
\let\rightquotation=\textquotedblleft
% \end{macrocode}
%
% We need to ensure that Hebrew is used as the default
% right-to-left language at |\begin{document}|. The mechanism of
% defining the |\@rllanguagename| is the same as in \babel 's
% |\languagename|: the last right-to-left language in the
% |\usepackage{babel}| line is set as the default right-to-left
% language at document beginning.
%
% For example, the following code:
% \begin{quote}
% |\usepackage[russian,hebrew,arabic,greek,english]{babel}|
% \end{quote}
% will set the Arabic language as the default right-to-left
% language and the English language as the default language.
% As a result, the commands |\L{}| and |\embox{}| will use English
% and |\R{}| and |\hmbox{}| will use Arabic by default. These
% defaults can be changed with the next |\sethebrew| or
% |\selectlanguage{|\emph{language name}|}| command.
% \begin{macrocode}
\AtBeginDocument{\def\@rllanguagename{hebrew}}
% \end{macrocode}
%
% The macro |\ldf@finish| takes care of looking for a configuration
% file, setting the main language to be switched on at
% |\begin{document}| and resetting the category code of |@| to its
% original value.
% \begin{macrocode}
\ldf@finish{hebrew}
%</hebrew>
% \end{macrocode}
%
% \subsection{Right to left support}
%
% This file \pkg{rlbabel.def} defines necessary bidirectional macro
% support for \LaTeXe. It is designed for use not only with Hebrew,
% but with any Right-to-Left languages, supported by \babel. The
% macros provided in this file are language and encoding
% independent.
%
% Right-to-left languages will use \TeX\ extensions, namely \TeX\
% primitives |\beginL|, |\endL| and |\beginR|, |\endR|, currently
% implemented only in $\varepsilon$-\TeX\ and in \TeX{-}{-}\XeT.
%
% If $\varepsilon$-\TeX\ is used, we should switch it to the
% \emph{enhanced} mode:
% \begin{macrocode}
%<*rightleft>
\ifx\TeXXeTstate\undefined\else%
\TeXXeTstate=1
\fi
% \end{macrocode}
%
% Note, that $\varepsilon$-\TeX 's format file should be created
% for \emph{extended} mode. Mode can be checked by running
% $\varepsilon$-\TeX\ on some \TeX{} file, for example:
% \begin{quote}
% |This is e-TeX, Version 3.14159-1.1 (Web2c 7.0)|\\
% |entering extended mode|
% \end{quote}
% The second line should be \texttt{entering extended mode}.
%
% We check if user uses Right-to-Left enabled engine instead of
% regular Knuth's \TeX:
% \begin{macrocode}
\ifx\beginL\@undefined%
\newlinechar`\^^J
\typeout{^^JTo avoid this error message,^^J%
run TeX--XeT or e-TeX engine instead of regular TeX.^^J}
\errmessage{Right-to-Left Support Error: use TeX--XeT or e-TeX
engine}%
\fi
% \end{macrocode}
%
% \subsubsection{Switching from LR to RL mode and back}
%
% \cs{@torl} and \cs{@fromrl} are called each time the horizontal
% direction changes. They do all that is necessary besides changing
% the direction. Currently their task is to change the encoding
% information and mode (condition \cs{if@rl}). They should not
% normally be called by users: user-level macros, such as
% \cs{sethebrew} and \cs{unsethebrew}, as well as \babel 's
% \cs{selectlanguage} are defined in language-definition files and
% should be used to change default language (and direction).
%
% Local direction changing commands (for small pieces of text):
% |\L{}|, |\R{}|, |\embox{}| and |\hmbox{}| are defined below in
% this file in language-independent manner.
%
% \begin{macro}{\if@rl}
% \begin{description}\scrunch
% \item[|\@rltrue|] means that the main mode is currently
% Right-to-Left.
% \item[|\@rlfalse|] means that the main mode is currently
% Left-to-Right.
% \end{description}
% \begin{macrocode}
\newif\if@rl
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\if@rlmain}
% This is the main direction of the document. Unlike |\if@rl|
% it is set once and never changes.
% \begin{description}\scrunch
% \item[|\@rltrue|] means that the document is Right-to-Left.
% \item[|\@rlfalse|] means that the document is Left-to-Right.
% \end{description}
% Practically |\if@rlmain| is set according to the value of |\if@rl|
% in the beginning of the run.
% \begin{macrocode}
\AtBeginDocument{% Here we set the main document direction
\newif\if@rlmain%
\if@rl% e.g: if the options to babel were [english,hebrew]
\@rlmaintrue%
\else% e.g: if the options to babel were [hebrew,english]
\@rlmainfalse%
\fi%
}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@torl}
% Switches current direction to Right-to-Left: saves current
% Left-to-Right encoding in |\lr@encodingdefault|, sets required
% Right-to-Left language name in |\@rllanguagename| (similar to
% \babel 's |\languagename|) and changes derection.
%
% The Right-to-Left language encoding should be defined in |.ldf|
% file as special macro created by concatenation of the language
% name and string \texttt{encoding}, for example, for Hebrew it
% will be |\hebrewencoding|.
% \begin{macrocode}
\DeclareRobustCommand{\@torl}[1]{%
\if@rl\else%
\let\lr@encodingdefault=\encodingdefault%
\fi%
\def\@rllanguagename{#1}%
\def\encodingdefault{\csname#1encoding\endcsname}%
\fontencoding{\encodingdefault}%
\selectfont%
\@rltrue}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@fromrl}
% Opposite to |\@torl|, switches current direction to
% Left-to-Right: restores saved Left-to-Right encoding
% (|\lr@encodingdefault|) and changes direction.
% \begin{macrocode}
\DeclareRobustCommand{\@fromrl}{%
\if@rl%
\let\encodingdefault=\lr@encodingdefault%
\fi%
\fontencoding{\encodingdefault}%
\selectfont%
\@rlfalse}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\selectlanguage}
% This standard \babel 's macro should be redefined to support
% bidirectional tables. We divide |\selectlanguage| implementation
% to two parts, and the first part calls the second
% |\@@selectlanguage|.
% \begin{macrocode}
\expandafter\def\csname selectlanguage \endcsname#1{%
\edef\languagename{%
\ifnum\escapechar=\expandafter`\string#1\@empty
\else \string#1\@empty\fi}%
\@@selectlanguage{\languagename}}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@selectlanguage}
% This new internal macro redefines a final part of the standard
% \babel 's |\select|\-|language| implementation.
%
% Standard \LaTeX\ provides us with 3 tables: Table of Contents
% (|.toc|), List of Figures (|.lof|), and List of Tables
% (|.lot|). In multi-lingual texts mixing Left-to-Right languages
% with Right-to-Left ones, the use of various directions in one
% table results in very ugly output. Therefore, these 3 standard
% tables will be used now only for Left-to-Right languages, and we
% will add 3 Right-to-Left tables (their extensions are simply
% reversed ones): RL Table of Contents (|.cot|), RL List of Figures
% (|.fol|), and RL List of Tables (|.lof|).
% \begin{macrocode}
\def\@@selectlanguage#1{%
\select@language{#1}%
\if@filesw
\protected@write\@auxout{}{\string\select@language{#1}}%
\if@rl%
\addtocontents{cot}{\xstring\select@language{#1}}%
\addtocontents{fol}{\xstring\select@language{#1}}%
\addtocontents{tol}{\xstring\select@language{#1}}%
\else%
\addtocontents{toc}{\xstring\select@language{#1}}%
\addtocontents{lof}{\xstring\select@language{#1}}%
\addtocontents{lot}{\xstring\select@language{#1}}%
\fi%
\fi}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\setrllanguage}
% \begin{macro}{\unsetrllanguage}
% The |\setrllanguage| and |\unsetrllanguage| pair of macros is
% proved to very useful in bilingual texts, for example, in
% Hebrew-English texts. The language-specific commands, for example,
% |\sethebrew| and |\unsethebrew| use these macros as basis.
%
% Implementation saves and restores other language in
% |\other@languagename| variable, and uses internal macro
% |\@@selectlanguage|, defined above, to switch between languages.
% \begin{macrocode}
\let\other@languagename=\languagename
\DeclareRobustCommand{\setrllanguage}[1]{%
\if@rl\else%
\let\other@languagename=\languagename%
\fi%
\def\languagename{#1}%
\@@selectlanguage{\languagename}}
% \end{macrocode}
%
% \begin{macrocode}
\DeclareRobustCommand{\unsetrllanguage}[1]{%
\if@rl%
\let\languagename=\other@languagename%
\fi
\@@selectlanguage{\languagename}}
% \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\L}
% \begin{macro}{\R}
% \begin{macro}{\HeblatexRedefineL}
% Macros for changing direction, originally taken from TUGboat.
% Usage: |\L{|\emph{Left to Right text}|}| and |\R{|\emph{Right to
% Left text}|}|. Numbers should also be enclosed in |\L{}|, as in
% |\L{123}|.
%
% Note, that these macros do not receive language name as
% parameter. Instead, the saved |\@rllanguagename| will be
% used. We assume that each Right-to-Left language defines
% |\to|\emph{languagename} and |\from|\emph{languagename} macros in
% language definition file, for example, for Hebrew: |\tohebrew|
% and |\fromhebrew| macros in \pkg{hebrew.ldf} file.
%
% The macros \cs{L} and \cs{R} include `protect' to to make them robust and
% allow use, for example, in tables.
%
% Due to the fact that some packages have different definitions for \cs{L}
% the macro |\HeblatexRedefineL| is provided to overide them. This may
% be required with hyperref, for instance.
% \begin{macrocode}
\let\next=\
\def\HeblatexRedefineL{%
\def\L{\protect\pL}%
}
\HeblatexRedefineL
\def\pL{\protect\afterassignment\moreL \let\next= }
\def\moreL{\bracetext \aftergroup\endL \beginL\csname
from\@rllanguagename\endcsname}
% \end{macrocode}
%
% \begin{macrocode}
\def\R{\protect\pR}
\def\pR{\protect\afterassignment\moreR \let\next= }
\def\moreR{\bracetext \aftergroup\endR \beginR\csname
to\@rllanguagename\endcsname}
\def\bracetext{\ifcat\next{\else\ifcat\next}\fi
\errmessage{Missing left brace has been substituted}\fi \bgroup}
\everydisplay{\if@rl\aftergroup\beginR\fi }
% \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\@ensure@R}
% \begin{macro}{\@ensure@L}
% Two small internal macros, a-la |\ensuremath|
% \begin{macrocode}
\def\@ensure@R#1{\if@rl#1\else\R{#1}\fi}
\def\@ensure@L#1{\if@rl\L{#1}\else#1\fi}
% \end{macrocode}
% \end{macro}
% \end{macro}
%
% Take care of Right-to-Left indentation in every paragraph.
% The old approach had conflicts with amsthm, so I addapted
% the code from the bidi package by Vafa Khalighi.
%
%
% \begin{macrocode}
\def\heb@rl@everypar{{\setbox\z@\lastbox\if@rl\beginR\else\beginL\fi\ifvoid\z@\else\usebox\z@\fi}}
\let\heb@o@everypar=\everypar
\newtoks\heb@n@everypar
\heb@n@everypar\expandafter{\the\heb@o@everypar}
\heb@o@everypar{\heb@rl@everypar\the\heb@n@everypar}
\let\everypar=\heb@n@everypar
% \end{macrocode}
%
% \begin{macro}{\hmbox}
% \begin{macro}{\embox}
% Useful vbox commands. All text in math formulas is best enclosed
% in these: LR text in |\embox| and RL text in |\hmbox|. |\mbox{}|
% is useless for both cases, since it typesets in Left-to-Right
% even for Right-to-Left languages (additions by Yaniv Bargury).
% \begin{macrocode}
\newcommand{\hmbox}[1]{\mbox{\R{#1}}}
\newcommand{\embox}[1]{\mbox{\L{#1}}}
% \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\@brackets}
% When in Right-to-Left mode, brackets should be swapped. This
% macro receives 3 parameters: left bracket, content, right
% bracket. Brackets can be square brackets, braces, or
% parentheses.
% \begin{macrocode}
\def\@brackets#1#2#3{\protect\if@rl #3#2#1\protect\else
#1#2#3\protect\fi}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@number}
% \begin{macro}{\@latin}
% \cs{@number} preserves numbers direction from Left to Right.
% \cs{@latin} in addition switches current encoding to the latin.
% \begin{macrocode}
\def\@@number#1{\ifmmode\else\beginL\fi#1\ifmmode\else\endL\fi}
\def\@@latin#1{\@@number{{\@fromrl#1}}}
\def\@number{\protect\@@number}
\def\@latin{\protect\@@latin}
% \end{macrocode}
% \end{macro}
% \end{macro}
%
% \subsubsection{Counters}
%
% To make counter references work in Right to Left text, we need
% to surround their original definitions with an
% |\@number{|\ldots|}| or |\@latin{|\ldots|}|. Note, that
% language-specific counters, such as \cs{hebr} or \cs{gim} are
% provided with language definition file.
%
% We start with saving the original definitions:
% \begin{macrocode}
\let\@@arabic=\@arabic
\let\@@roman=\@roman
\let\@@Roman=\@Roman
\let\@@alph=\@alph
\let\@@Alph=\@Alph
% \end{macrocode}
%
% \begin{macro}{\@arabic}
% \begin{macro}{\@roman}
% \begin{macro}{\@Roman}
% Arabic and roman numbers should be from Left to Right. In
% addition, roman numerals, both lower- and upper-case should be in
% latin encoding.
% \begin{macrocode}
\def\@arabic#1{\@number{\@@arabic#1}}
\def\@roman#1{\@latin{\@@roman#1}}
\def\@Roman#1{\@latin{\@@Roman#1}}
% \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\arabicnorl}
% This macro preserves the original definition of |\arabic|
% (overrides the overriding of |\@arabic|)
% \begin{macrocode}
\def\arabicnorl#1{\expandafter\@@arabic\csname c@#1\endcsname}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\make@lr}
% In Right to Left documents all counters defined in the standard
% document classes \emph{article}, \emph{report} and \emph{book}
% provided with \LaTeXe, such as |\thesection|, |\thefigure|,
% |\theequation| should be typed as numbers from left to right. To
% ensure direction, we use the following
% |\make@lr{|\emph{counter}|}| macro:
% \begin{macrocode}
\def\make@lr#1{\begingroup
\toks@=\expandafter{#1}%
\edef\x{\endgroup
\def\noexpand#1{\noexpand\@number{\the\toks@}}}%
\x}
% \end{macrocode}
%
% \begin{macrocode}
\@ifclassloaded{letter}{}{%
\@ifclassloaded{slides}{}{%
\make@lr\thesection
\make@lr\thesubsection
\make@lr\thesubsubsection
\make@lr\theparagraph
\make@lr\thesubparagraph
\make@lr\thefigure
\make@lr\thetable
}
\make@lr\theequation
}
% \end{macrocode}
% \end{macro}
%
% \subsubsection{Preserving logos}
%
% Preserve \TeX, \LaTeX\ and \LaTeXe\ logos.
% \begin{macro}{\TeX}
% \begin{macrocode}
\let\@@TeX\TeX
\def\TeX{\@latin{\@@TeX}}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\LaTeX}
% \begin{macrocode}
\let\@@LaTeX\LaTeX
\def\LaTeX{\@latin{\@@LaTeX}}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\LaTeXe}
% \begin{macrocode}
\let\@@LaTeXe\LaTeXe
\def\LaTeXe{\@latin{\@@LaTeXe}}
% \end{macrocode}
% \end{macro}
%
% \subsubsection{List environments}
%
% List environments in Right-to-Left languages, are ticked and
% indented from the right instead of from the left. All the
% definitions that caused indentation are revised for Right-to-Left
% languages. \LaTeX\ keeps track on the indentation with the
% \cs{leftmargin} and \cs{rightmargin} values.
%
% \begin{macro}{list}
% Thus we need to override the definition of the |\list| macro: when
% in RTL mode, the right margins are the begining of the line.
% \begin{macrocode}
\def\list#1#2{%
\ifnum \@listdepth >5\relax
\@toodeep
\else
\global\advance\@listdepth\@ne
\fi
\rightmargin\z@
\listparindent\z@
\itemindent\z@
\csname @list\romannumeral\the\@listdepth\endcsname
\def\@itemlabel{#1}%
\let\makelabel\@mklab
\@nmbrlistfalse
#2\relax
\@trivlist
\parskip\parsep
\parindent\listparindent
\advance\linewidth -\rightmargin
\advance\linewidth -\leftmargin
% \end{macrocode}
% The only change in the macro is the |\if@rl| case:
% \begin{macrocode}
\if@rl
\advance\@totalleftmargin \rightmargin
\else
\advance\@totalleftmargin \leftmargin
\fi
\parshape \@ne \@totalleftmargin \linewidth
\ignorespaces}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\labelenumii}
% \begin{macro}{\p@enumiii}
% The \cs{labelenumii} and \cs{p@enumiii} commands use
% \emph{parentheses}. They are revised to work Right-to-Left with
% the help of \cs{@brackets} macro defined above.
% \begin{macrocode}
\def\labelenumii{\@brackets(\theenumii)}
\def\p@enumiii{\p@enumii\@brackets(\theenumii)}
% \end{macrocode}
% \end{macro}
% \end{macro}
%
% \subsubsection{Tables of moving stuff}
%
% Tables of moving arguments: table of contents (|toc|), list of
% figures (|lof|) and list of tables (|lot|) are handles here. These
% three default \LaTeX\ tables will be used now exclusively for
% Left to Right stuff.
%
% Three additional Right-to-Left tables: RL table of contents
% (|cot|), RL list of figures (|fol|), and RL list of tables
% (|tol|) are added.
% These three tables will be used exclusively for Right to
% Left stuff.
%
% \begin{macro}{\@tableofcontents}
% \begin{macro}{\@listoffigures}
% \begin{macro}{\@listoftables}
% We define 3 new macros similar to the standard \LaTeX\ tables,
% but with one parameter --- table file extension. These macros
% will help us to define our additional tables below.
% \begin{macrocode}
\@ifclassloaded{letter}{}{% other
\@ifclassloaded{slides}{}{% other
\@ifclassloaded{article}{% article
\newcommand\@tableofcontents[1]{%
\section*{\contentsname\@mkboth%
{\MakeUppercase\contentsname}%
{\MakeUppercase\contentsname}}%
\@starttoc{#1}}
\newcommand\@listoffigures[1]{%
\section*{\listfigurename\@mkboth%
{\MakeUppercase\listfigurename}%
{\MakeUppercase\listfigurename}}%
\@starttoc{#1}}
\newcommand\@listoftables[1]{%
\section*{\listtablename\@mkboth%
{\MakeUppercase\listtablename}%
{\MakeUppercase\listtablename}}%
\@starttoc{#1}}}%
{% else report or book
\newcommand\@tableofcontents[1]{%
\@restonecolfalse\if@twocolumn\@restonecoltrue\onecolumn%
\fi\chapter*{\contentsname\@mkboth%
{\MakeUppercase\contentsname}%
{\MakeUppercase\contentsname}}%
\@starttoc{#1}\if@restonecol\twocolumn\fi}
\newcommand\@listoffigures[1]{%
\@restonecolfalse\if@twocolumn\@restonecoltrue\onecolumn%
\fi\chapter*{\listfigurename\@mkboth%
{\MakeUppercase\listfigurename}%
{\MakeUppercase\listfigurename}}%
\@starttoc{#1}\if@restonecol\twocolumn\fi}
\newcommand\@listoftables[1]{%
\if@twocolumn\@restonecoltrue\onecolumn\else\@restonecolfalse\fi%
\chapter*{\listtablename\@mkboth%
{\MakeUppercase\listtablename}%
{\MakeUppercase\listtablename}}%
\@starttoc{#1}\if@restonecol\twocolumn\fi}}%
% \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\lrtableofcontents}
% \begin{macro}{\lrlistoffigures}
% \begin{macro}{\lrlistoftables}
% Left-to-Right tables are called now |\lr|\emph{xxx} and defined
% with the aid of three macros defined above (extensions |toc|,
% |lof|, and |lot|).
% \begin{macrocode}
\newcommand\lrtableofcontents{\@tableofcontents{toc}}%
\newcommand\lrlistoffigures{\@listoffigures{lof}}%
\newcommand\lrlistoftables{\@listoftables{lot}}%
% \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\rltableofcontents}
% \begin{macro}{\rllistoffigures}
% \begin{macro}{\rllistoftables}
% Right-to-Left tables will be called |\rl|\emph{xxx} and defined
% with the aid of three macros defined above (extensions |cot|,
% |fol|, and |tol|).
% \begin{macrocode}
\newcommand\rltableofcontents{\@tableofcontents{cot}}%
\newcommand\rllistoffigures{\@listoffigures{fol}}%
\newcommand\rllistoftables{\@listoftables{tol}}%
% \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\tableofcontents}
% \begin{macro}{\listoffigures}
% \begin{macro}{\listoftables}
% Let |\|\emph{xxx} be |\rl|\emph{xxx} if the current direction is
% Right-to-Left and |\lr|\emph{xxx} if it is Left-to-Right.
% \begin{macrocode}
\renewcommand\tableofcontents{\if@rl\rltableofcontents%
\else\lrtableofcontents\fi}
\renewcommand\listoffigures{\if@rl\rllistoffigures%
\else\lrlistoffigures\fi}
\renewcommand\listoftables{\if@rl\rllistoftables%
\else\lrlistoftables\fi}}}
% \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\@dottedtocline}
% The following makes problems when making a Right-to-Left tables,
% since it uses \cs{leftskip} and \cs{rightskip} which are both
% mode dependent.
% \begin{macrocode}
\def\@dottedtocline#1#2#3#4#5{%
\ifnum #1>\c@tocdepth \else
\vskip \z@ \@plus.2\p@
{\if@rl\rightskip\else\leftskip\fi #2\relax
\if@rl\leftskip\else\rightskip\fi \@tocrmarg \parfillskip
-\if@rl\leftskip\else\rightskip\fi
\parindent #2\relax\@afterindenttrue
\interlinepenalty\@M
\leavevmode
\@tempdima #3\relax
\advance\if@rl\rightskip\else\leftskip\fi \@tempdima
\null\nobreak\hskip -\if@rl\rightskip\else\leftskip\fi
{#4}\nobreak
\leaders\hbox{$\m@th
\mkern \@dotsep mu\hbox{.}\mkern \@dotsep
mu$}\hfill
\nobreak
\hb@xt@\@pnumwidth{\hfil\normalfont \normalcolor \beginL#5\endL}%
\par}%
\fi}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\l@part}
% This standard macro was redefined for table of contents since it
% uses \cs{rightskip} which is mode dependent.
% \begin{macrocode}
\@ifclassloaded{letter}{}{% other
\@ifclassloaded{slides}{}{% other
\renewcommand*\l@part[2]{%
\ifnum \c@tocdepth >-2\relax
\addpenalty{-\@highpenalty}%
\addvspace{2.25em \@plus\p@}%
\begingroup
\setlength\@tempdima{3em}%
\parindent \z@ \if@rl\leftskip\else\rightskip\fi \@pnumwidth
\parfillskip -\@pnumwidth
{\leavevmode
\large \bfseries #1\hfil \hb@xt@\@pnumwidth{\hss#2}}\par
\nobreak
\global\@nobreaktrue
\everypar{\global\@nobreakfalse\everypar{}}%
\endgroup
\fi}}}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@part}
% Part is redefined to support new Right-to-Left table of contents
% (|cot|) as well as the Left-to-Right one (|toc|).
% \begin{macrocode}
\@ifclassloaded{article}{% article class
\def\@part[#1]#2{%
\ifnum \c@secnumdepth >\m@ne
\refstepcounter{part}%
\addcontentsline{toc}{part}{\thepart\hspace{1em}#1}%
\addcontentsline{cot}{part}{\thepart\hspace{1em}#1}%
\else
\addcontentsline{toc}{part}{#1}%
\addcontentsline{cot}{part}{#1}%
\fi
{\parindent \z@ \raggedright
\interlinepenalty \@M
\normalfont
\ifnum \c@secnumdepth >\m@ne
\Large\bfseries \partname~\thepart
\par\nobreak
\fi
\huge \bfseries #2%
\markboth{}{}\par}%
\nobreak
\vskip 3ex
\@afterheading}%
}{% report and book classes
\def\@part[#1]#2{%
\ifnum \c@secnumdepth >-2\relax
\refstepcounter{part}%
\addcontentsline{toc}{part}{\thepart\hspace{1em}#1}%
\addcontentsline{cot}{part}{\thepart\hspace{1em}#1}%
\else
\addcontentsline{toc}{part}{#1}%
\addcontentsline{cot}{part}{#1}%
\fi
\markboth{}{}%
{\centering
\interlinepenalty \@M
\normalfont
\ifnum \c@secnumdepth >-2\relax
\huge\bfseries \partname~\thepart
\par
\vskip 20\p@
\fi
\Huge \bfseries #2\par}%
\@endpart}}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@sect}
% Section was redefined from the \pkg{latex.ltx} file. It is
% changed to support both Left-to-Right (|toc|) and Right-to-Left
% (|cot|) table of contents simultaneously.
% \begin{macrocode}
\def\@sect#1#2#3#4#5#6[#7]#8{%
\ifnum #2>\c@secnumdepth
\let\@svsec\@empty
\else
\refstepcounter{#1}%
\protected@edef\@svsec{\@seccntformat{#1}\relax}%
\fi
\@tempskipa #5\relax
\ifdim \@tempskipa>\z@
\begingroup
#6{%
\@hangfrom{\hskip #3\relax\@svsec}%
\interlinepenalty \@M #8\@@par}%
\endgroup
\csname #1mark\endcsname{#7}%
\addcontentsline{toc}{#1}{%
\ifnum #2>\c@secnumdepth \else
\protect\numberline{\csname the#1\endcsname}%
\fi
#7}%
\addcontentsline{cot}{#1}{%
\ifnum #2>\c@secnumdepth \else
\protect\numberline{\csname the#1\endcsname}%
\fi
#7}%
\else
\def\@svsechd{%
#6{\hskip #3\relax
\@svsec #8}%
\csname #1mark\endcsname{#7}%
\addcontentsline{toc}{#1}{%
\ifnum #2>\c@secnumdepth \else
\protect\numberline{\csname the#1\endcsname}%
\fi
#7}%
\addcontentsline{cot}{#1}{%
\ifnum #2>\c@secnumdepth \else
\protect\numberline{\csname the#1\endcsname}%
\fi
#7}}%
\fi
\@xsect{#5}}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@caption}
% Caption was redefined from the \pkg{latex.ltx} file. It is
% changed to support Left-to-Right list of figures and list of
% tables (|lof| and |lot|) as well as new Right-to-Left lists
% (|fol| and |tol|) simultaneously.
% \begin{macrocode}
\long\def\@caption#1[#2]#3{%
\par
\addcontentsline{\csname ext@#1\endcsname}{#1}%
{\protect\numberline{\csname the#1\endcsname}%
{\ignorespaces #2}}%
\def\@fignm{figure}
\ifx#1\@fignm\addcontentsline{fol}{#1}%
{\protect\numberline{\csname the#1\endcsname}%
{\ignorespaces #2}}\fi%
\def\@tblnm{table}
\ifx#1\@tblnm\addcontentsline{tol}{#1}%
{\protect\numberline{\csname the#1\endcsname}%
{\ignorespaces #2}}\fi%
\begingroup
\@parboxrestore
\if@minipage
\@setminipage
\fi
\normalsize
\@makecaption{\csname fnum@#1\endcsname}{\ignorespaces #3}\par
\endgroup}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\l@chapter}
% This standard macro was redefined for table of contents since it
% uses \cs{rightskip} which is mode dependent.
% \begin{macrocode}
\@ifclassloaded{letter}{}{%
\@ifclassloaded{slides}{}{%
\@ifclassloaded{article}{}{%
\@ifundefined{l@chapter}{}{%
\renewcommand*\l@chapter[2]{%
\ifnum \c@tocdepth >\m@ne
\addpenalty{-\@highpenalty}%
\vskip 1.0em \@plus\p@
\setlength\@tempdima{1.5em}%
\begingroup
\parindent \z@ \if@rl\leftskip\else\rightskip\fi \@pnumwidth
\parfillskip -\@pnumwidth
\leavevmode \bfseries
\advance\if@rl\rightskip\else\leftskip\fi\@tempdima
\hskip -\if@rl\rightskip\else\leftskip\fi
#1\nobreak\hfil \nobreak\hb@xt@\@pnumwidth{\hss#2}\par
\penalty\@highpenalty
\endgroup
\fi}}}}}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\l@section}
% \begin{macro}{\l@subsection}
% \begin{macro}{\l@subsubsection}
% \begin{macro}{\l@paragraph}
% \begin{macro}{\l@subparagraph}
% The toc entry for section did not work in article style.
% Also it does not print dots, which is funny when most of your
% work is divided into sections.
%
% It was revised to use |\@dottedtocline| as in \pkg{report.sty}
% (by Yaniv Bargury) and was updated later for all kinds of
% sections (by Boris Lavva).
% \begin{macrocode}
\@ifclassloaded{article}{%
\renewcommand*\l@section{\@dottedtocline{1}{1.5em}{2.3em}}
\renewcommand*\l@subsection{\@dottedtocline{2}{3.8em}{3.2em}}
\renewcommand*\l@subsubsection{\@dottedtocline{3}{7.0em}{4.1em}}
\renewcommand*\l@paragraph{\@dottedtocline{4}{10em}{5em}}
\renewcommand*\l@subparagraph{\@dottedtocline{5}{12em}{6em}}}{}
% \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
%
% \subsubsection{Two-column mode}
%
% This is the support of \texttt{twocolumn} option for the standard
% \LaTeXe\ classes.
% The following code was originally borrowed from the Arab\TeX\
% package, file \pkg{latexext.sty}, copyright by Klaus Lagally,
% Institut fuer Informatik, Universitaet Stuttgart. It was updated
% for this package by Boris Lavva.
%
% \begin{macro}{\@outputdblcol}
% \begin{macro}{\set@outputdblcol}
% \begin{macro}{rl@outputdblcol}
% First column is \cs{@leftcolumn} will be shown at the right side,
% Second column is \cs{@outputbox} will be shown at the left side.
%
% |\set@outputdblcol| IS CURRENTLY DISABLED. TODO: REMOVE IT [tzafrir]
% \begin{macrocode}
\let\@@outputdblcol\@outputdblcol
%\def\set@outputdblcol{%
% \if@rl\renewcommand{\@outputdblcol}{\rl@outputdblcol}%
% \else\renewcommand{\@outputdblcol}{\@@outputdblcol}\fi}
\renewcommand{\@outputdblcol}{%
\if@rlmain%
\rl@outputdblcol%
\else%
\@@outputdblcol%
\fi%
}
\newcommand{\rl@outputdblcol}{%
\if@firstcolumn
\global \@firstcolumnfalse
\global \setbox\@leftcolumn \box\@outputbox
\else
\global \@firstcolumntrue
\setbox\@outputbox \vbox {\hb@xt@\textwidth {%
\hskip\columnwidth%
\hfil\vrule\@width\columnseprule\hfil
\hb@xt@\columnwidth {%
\box\@leftcolumn \hss}%
\hb@xt@\columnwidth {%
\hskip-\textwidth%
\box\@outputbox \hss}%
\hskip\columnsep%
\hskip\columnwidth}}%
\@combinedblfloats
\@outputpage
\begingroup
\@dblfloatplacement
\@startdblcolumn
\@whilesw\if@fcolmade \fi
{\@outputpage
\@startdblcolumn}%
\endgroup
\fi}
% \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
%
% \subsubsection{Footnotes}
%
% \begin{macro}{\footnoterule}
% The Right-to-Left footnote rule is simply reversed default
% Left-to-Right one. Footnotes can be used in RL or LR main
% modes, but changing mode while a footnote is pending is still
% unsolved.
% \begin{macrocode}
\let\@@footnoterule=\footnoterule
\def\footnoterule{\if@rl\hb@xt@\hsize{\hss\vbox{\@@footnoterule}}%
\else\@@footnoterule\fi}
% \end{macrocode}
% \end{macro}
%
% \subsubsection{Headings and two-side support}
%
% When using \texttt{headings} or \texttt{myheadings} modes, we
% have to ensure that the language and direction of heading is the
% same as the whole chapter/part of the document. This is
% implementing by setting special variable \cs{headlanguage} when
% starting new chapter/part.
%
% In addition, when selecting the \texttt{twoside} option (default in
% \texttt{book} document class), the LR and RL modes need to be set
% properly for things on the heading and footing. This is done
% here too.
%
% \begin{macro}{ps@headings}
% \begin{macro}{ps@myheadings}
% \begin{macro}{headeven}
% \begin{macro}{headodd}
% First, we will support the standard \pkg{letter} class:
% \begin{macrocode}
\@ifclassloaded{letter}{%
\def\headodd{\protect\if@rl\beginR\fi\headtoname{}
\ignorespaces\toname
\hfil \@date
\hfil \pagename{} \thepage\protect\if@rl\endR\fi}
\if@twoside
\def\ps@headings{%
\let\@oddfoot\@empty\let\@evenfoot\@empty
\def\@oddhead{\select@language{\headlanguage}\headodd}
\let\@evenhead\@oddhead}
\else
\def\ps@headings{%
\let\@oddfoot\@empty
\def\@oddhead{\select@language{\headlanguage}\headodd}}
\fi
\def\headfirst{\protect\if@rl\beginR\fi\fromlocation \hfill %
\telephonenum\protect\if@rl\endR\fi}
\def\ps@firstpage{%
\let\@oddhead\@empty
\def\@oddfoot{\raisebox{-45\p@}[\z@]{%
\hb@xt@\textwidth{\hspace*{100\p@}%
\ifcase \@ptsize\relax
\normalsize
\or
\small
\or
\footnotesize
\fi
\select@language{\headlanguage}\headfirst}}\hss}}
%
\renewcommand{\opening}[1]{%
\let\headlanguage=\languagename%
\ifx\@empty\fromaddress%
\thispagestyle{firstpage}%
{\raggedleft\@date\par}%
\else % home address
\thispagestyle{empty}%
{\raggedleft
\if@rl\begin{tabular}{@{\beginR\csname%
to\@rllanguagename\endcsname}r@{\endR}}\ignorespaces
\fromaddress \\*[2\parskip]%
\@date \end{tabular}\par%
\else\begin{tabular}{l}\ignorespaces
\fromaddress \\*[2\parskip]%
\@date \end{tabular}\par%
\fi}%
\fi
\vspace{2\parskip}%
{\raggedright \toname \\ \toaddress \par}%
\vspace{2\parskip}%
#1\par\nobreak}
}
% \end{macrocode}
% Then, the \pkg{article}, \pkg{report} and \pkg{book} document
% classes are supported. Note, that in one-sided mode
% \cs{markright} was changed to \cs{markboth}.
% \begin{macrocode}
{% article, report, book
\def\headeven{\protect\if@rl\beginR\thepage\hfil\rightmark\endR
\protect\else\thepage\hfil{\slshape\leftmark}
\protect\fi}
\def\headodd{\protect\if@rl\beginR\leftmark\hfil\thepage\endR
\protect\else{\slshape\rightmark}\hfil\thepage
\protect\fi}
\@ifclassloaded{article}{% article
\if@twoside % two-sided
\def\ps@headings{%
\let\@oddfoot\@empty\let\@evenfoot\@empty
\def\@evenhead{\select@language{\headlanguage}\headeven}%
\def\@oddhead{\select@language{\headlanguage}\headodd}%
\let\@mkboth\markboth
\def\sectionmark##1{%
\markboth {\MakeUppercase{%
\ifnum \c@secnumdepth >\z@
\thesection\quad
\fi
##1}}{}}%
\def\subsectionmark##1{%
\markright{%
\ifnum \c@secnumdepth >\@ne
\thesubsection\quad
\fi
##1}}}
\else % one-sided
\def\ps@headings{%
\let\@oddfoot\@empty
\def\@oddhead{\headodd}%
\let\@mkboth\markboth
\def\sectionmark##1{%
\markboth{\MakeUppercase{%
\ifnum \c@secnumdepth >\m@ne
\thesection\quad
\fi
##1}}{\MakeUppercase{%
\ifnum \c@secnumdepth >\m@ne
\thesection\quad
\fi
##1}}}}
\fi
%
\def\ps@myheadings{%
\let\@oddfoot\@empty\let\@evenfoot\@empty
\def\@evenhead{\select@language{\headlanguage}\headeven}%
\def\@oddhead{\select@language{\headlanguage}\headodd}%
\let\@mkboth\@gobbletwo
\let\sectionmark\@gobble
\let\subsectionmark\@gobble
}}{% report and book
\if@twoside % two-sided
\def\ps@headings{%
\let\@oddfoot\@empty\let\@evenfoot\@empty
\def\@evenhead{\select@language{\headlanguage}\headeven}
\def\@oddhead{\select@language{\headlanguage}\headodd}
\let\@mkboth\markboth
\def\chaptermark##1{%
\markboth{\MakeUppercase{%
\ifnum \c@secnumdepth >\m@ne
\@chapapp\ \thechapter. \ %
\fi
##1}}{}}%
\def\sectionmark##1{%
\markright {\MakeUppercase{%
\ifnum \c@secnumdepth >\z@
\thesection. \ %
\fi
##1}}}}
\else % one-sided
\def\ps@headings{%
\let\@oddfoot\@empty
\def\@oddhead{\select@language{\headlanguage}\headodd}
\let\@mkboth\markboth
\def\chaptermark##1{%
\markboth{\MakeUppercase{%
\ifnum \c@secnumdepth >\m@ne
\@chapapp\ \thechapter. \ %
\fi
##1}}{\MakeUppercase{%
\ifnum \c@secnumdepth >\m@ne
\@chapapp\ \thechapter. \ %
\fi
##1}}}}
\fi
\def\ps@myheadings{%
\let\@oddfoot\@empty\let\@evenfoot\@empty
\def\@evenhead{\select@language{\headlanguage}\headeven}%
\def\@oddhead{\select@language{\headlanguage}\headodd}%
\let\@mkboth\@gobbletwo
\let\chaptermark\@gobble
\let\sectionmark\@gobble
}}}
% \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
%
%
% \subsubsection{Postscript Porblems}
% Any command that is implemented by PostScript directives, e.g
% commands from the ps-tricks package, needs to be fixed, because the
% PostScript directives are being interpeted after the document has been
% converted by \TeX to visual Hebrew (DVI, PostScript and PDF have visual
% Hebrew).
%
% For instance: Suppose you wrote in your document:
%
% |\textcolor{cyan}{some ltr text}|
%
% This would be interpeted by \TeX to something like:
%
% |[postscript:make color cyan]some LTR text[postscript:make color black]|
%
%
% However, with the bidirectionality support we get:
%
% |\textcolor{cyan}{\hebalef\hebbet}|
%
% Translated to:
%
% |[postscript:make color black]{bet}{alef}[postscript:make color cyan]|
%
% While we want:
%
% |[postscript:make color cyan]{bet}{alef}[postscript:make color black]|
%
% The following code will probably work at least with code that stays in the
% same line:
% \begin{macro}{@textcolor}
% \begin{macrocode}
\AtBeginDocument{%
%I assume that \@textcolor is only defined by the package color
\ifx\@textcolor\@undefined\else%
% If that macro was defined before the beginning of the document,
% that is: the package was loaded: redefine it with bidi support
\def\@textcolor#1#2#3{%
\if@rl%
\beginL\protect\leavevmode{\color#1{#2}\beginR#3\endR}\endL%
\else%
\protect\leavevmode{\color#1{#2}#3}%
\fi%
}%
\fi%
}
% \end{macrocode}
% \end{macro}
% \begin{macro}{\thetrueSlideCounter}
% This macro probably needs to be overriden for when using |prosper|,
% (waiting for feedback. Tzafrir)
% \begin{macrocode}
\@ifclassloaded{prosper}{%
\def\thetrueSlideCounter{\arabicnorl{trueSlideCounter}}
}{}
% \end{macrocode}
% \end{macro}
%
% \subsubsection{Miscellaneous internal \LaTeX\ macros}
%
% \begin{macro}{\raggedright}
% \begin{macro}{\raggedleft}
% \cs{raggedright} was changed from \pkg{latex.ltx} file to support
% Right-to-Left mode, because of the bug in its implementation.
% \begin{macrocode}
\def\raggedright{%
\let\\\@centercr
\leftskip\z@skip\rightskip\@flushglue
\parindent\z@\parfillskip\z@skip}
% \end{macrocode}
% Swap meanings of \cs{raggedright} and \cs{raggedleft} in
% Right-to-Left mode.
% \begin{macrocode}
\let\@@raggedleft=\raggedleft
\let\@@raggedright=\raggedright
\renewcommand\raggedleft{\if@rl\@@raggedright%
\else\@@raggedleft\fi}
\renewcommand\raggedright{\if@rl\@@raggedleft%
\else\@@raggedright\fi}
% \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\author}
% \cs{author} is inserted with \texttt{tabular} environment, and
% will be used in restricted horizontal mode. Therefore we have to
% add explicit direction change command when in Right-to-Left
% mode.
% \begin{macrocode}
\let\@@author=\author
\renewcommand{\author}[1]{\@@author{\if@rl\beginR #1\endR\else #1\fi}}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\MakeUppercase}
% \begin{macro}{\MakeLowercase}
% There are no uppercase and lowercase letters in most
% Right-to-Left languages, therefore we should redefine
% \cs{MakeUppercase} and \cs{MakeLowercase} \LaTeXe\ commands.
% \begin{macrocode}
\let\@@MakeUppercase=\MakeUppercase
\def\MakeUppercase#1{\if@rl#1\else\@@MakeUppercase{#1}\fi}
\let\@@MakeLowercase=\MakeLowercase
\def\MakeLowercase#1{\if@rl#1\else\@@MakeLowercase{#1}\fi}
% \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\underline}
% We should explicitly use \cs{L} and \cs{R} commands in
% \cs{underline}d text.
% \begin{macrocode}
\DeclareRobustCommand\underline[1]{%
\relax
\ifmmode\@@underline{#1}%
\else
\if@rl $\@@underline{\hbox{\beginR#1\endR}}\m@th$\relax
\else
$\@@underline{\hbox{#1}}\m@th$\relax\fi\fi}
% \end{macrocode}
% \end{macro}
%
% \cs{undertext} was added for \LaTeX 2.09 compatibility mode.
% \begin{macrocode}
\if@compatibility
\let\undertext=\underline
\fi
% \end{macrocode}
%
% \begin{macro}{\@xnthm}
% \begin{macro}{\@opargbegintheorem}
% The following has been inserted to correct the appearance of the
% number in \cs{newtheorem} to reorder theorem number components. A
% similar correction in the definition of \cs{@opargbegintheorem}
% was added too.
% \begin{macrocode}
\def\@xnthm#1#2[#3]{%
\expandafter\@ifdefinable\csname #1\endcsname
{\@definecounter{#1}\@addtoreset{#1}{#3}%
\expandafter\xdef\csname the#1\endcsname{\noexpand\@number
{\expandafter\noexpand\csname the#3\endcsname \@thmcountersep
\@thmcounter{#1}}}%
\global\@namedef{#1}{\@thm{#1}{#2}}%
\global\@namedef{end#1}{\@endtheorem}}}
%
\def\@opargbegintheorem#1#2#3{%
\trivlist
\item[\hskip \labelsep{\bfseries #1\ #2\
\@brackets({#3})}]\itshape}
% \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\@chapter}
% \begin{macro}{\@schapter}
% The following was added for pretty printing of the chapter
% numbers, for supporting Right-to-Left tables (\texttt{cot},
% \texttt{fol}, and \texttt{tol}), to save \cs{headlanguage}
% for use in running headers, and to start two-column mode
% depending on chapter's main language.
% \begin{macrocode}
\@ifclassloaded{article}{}{%
% For pretty priniting
\def\@@chapapp{Chapter}
\def\@@thechapter{\@@arabic\c@chapter}
\def\@chapter[#1]#2{%
\let\headlanguage=\languagename%
%\set@outputdblcol%
\ifnum \c@secnumdepth >\m@ne
\refstepcounter{chapter}%
\typeout{\@@chapapp\space\@@thechapter.}%
\addcontentsline{toc}{chapter}%
{\protect\numberline{\thechapter}#1}
\addcontentsline{cot}{chapter}%
{\protect\numberline{\thechapter}#1}
\else
\addcontentsline{toc}{chapter}{#1}%
\addcontentsline{cot}{chapter}{#1}%
\fi
\chaptermark{#1}
\addtocontents{lof}{\protect\addvspace{10\p@}}%
\addtocontents{fol}{\protect\addvspace{10\p@}}%
\addtocontents{lot}{\protect\addvspace{10\p@}}%
\addtocontents{tol}{\protect\addvspace{10\p@}}%
\if@twocolumn
\@topnewpage[\@makechapterhead{#2}]%
\else
\@makechapterhead{#2}%
\@afterheading
\fi}
%
\def\@schapter#1{%
\let\headlanguage=\languagename%
%\set@outputdblcol%
\if@twocolumn
\@topnewpage[\@makeschapterhead{#1}]%
\else
\@makeschapterhead{#1}%
\@afterheading
\fi}}
% \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\appendix}
% Changed mainly for pretty printing of appendix numbers, and to
% start two-column mode with the right language (if needed).
% \begin{macrocode}
\@ifclassloaded{letter}{}{% other
\@ifclassloaded{slides}{}{% other
\@ifclassloaded{article}{% article
\renewcommand\appendix{\par
\setcounter{section}{0}%
\setcounter{subsection}{0}%
\renewcommand\thesection{\@Alph\c@section}}
}{% report and book
\renewcommand\appendix{\par
%\set@outputdblcol%
\setcounter{chapter}{0}%
\setcounter{section}{0}%
\renewcommand\@chapapp{\appendixname}%
% For pretty priniting
\def\@@chapapp{Appendix}%
\def\@@thechapter{\@@Alph\c@chapter}
\renewcommand\thechapter{\@Alph\c@chapter}}}}}
% \end{macrocode}
% \end{macro}
%
% \subsubsection{Bibliography and citations}
%
% \begin{macro}{\@cite}
% \begin{macro}{\@biblabel}
% \begin{macro}{\@lbibitem}
% Citations are produced by the macro
% |\@cite{|\emph{LABEL}|}{|\emph{NOTE}|}|. Both the citation label
% and the note is typeset in the current direction. We have to use
% \cs{@brackets} macro in \cs{@cite} and \cs{@biblabel} macros. In
% addition, when using \emph{alpha} or similar bibliography style,
% the \cs{@lbibitem} is used and have to be update to support bot
% Right-to-Left and Left-to-Right citations.
%
% \begin{macrocode}
\def\@cite#1#2{\@brackets[{#1\if@tempswa , #2\fi}]}
\def\@biblabel#1{\@brackets[{#1}]}
\def\@lbibitem[#1]#2{\item[\@biblabel{#1}\hfill]\if@filesw
{\let\protect\noexpand
\immediate
\if@rl\write\@auxout{\string\bibcite{#2}{\R{#1}}}%
\else\write\@auxout{\string\bibcite{#2}{\L{#1}}}\fi%
}\fi\ignorespaces}
% \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
%
% \begin{environment}{thebibliography}
% Use \cs{rightmargin} instead of \cs{leftmargin} when in RL mode.
% \begin{macrocode}
\@ifclassloaded{letter}{}{% other
\@ifclassloaded{slides}{}{% other
\@ifclassloaded{article}{%
\renewenvironment{thebibliography}[1]
{\section*{\refname\@mkboth%
{\MakeUppercase\refname}%
{\MakeUppercase\refname}}%
\list{\@biblabel{\@arabic\c@enumiv}}%
{\settowidth\labelwidth{\@biblabel{#1}}%
\if@rl\leftmargin\else\rightmargin\fi\labelwidth
\advance\if@rl\leftmargin\else\rightmargin\fi\labelsep
\@openbib@code
\usecounter{enumiv}%
\let\p@enumiv\@empty
\renewcommand\theenumiv{\@arabic\c@enumiv}}%
\sloppy
\clubpenalty4000
\@clubpenalty \clubpenalty
\widowpenalty4000%
\sfcode`\.\@m}
{\def\@noitemerr
{\@latex@warning{Empty `thebibliography' environment}}%
\endlist}}%
{\renewenvironment{thebibliography}[1]{%
\chapter*{\bibname\@mkboth%
{\MakeUppercase\bibname}%
{\MakeUppercase\bibname}}%
\list{\@biblabel{\@arabic\c@enumiv}}%
{\settowidth\labelwidth{\@biblabel{#1}}%
\if@rl\leftmargin\else\rightmargin\fi\labelwidth
\advance\if@rl\leftmargin\else\rightmargin\fi\labelsep
\@openbib@code
\usecounter{enumiv}%
\let\p@enumiv\@empty
\renewcommand\theenumiv{\@arabic\c@enumiv}}%
\sloppy
\clubpenalty4000
\@clubpenalty \clubpenalty
\widowpenalty4000%
\sfcode`\.\@m}
{\def\@noitemerr
{\@latex@warning{Empty `thebibliography' environment}}%
\endlist}}}}
% \end{macrocode}
% \end{environment}
%
% \begin{macro}{\@verbatim}
% All kinds of verbs (\cs{verb},\cs{verb*},\texttt{verbatim} and
% \texttt{verbatim*}) now can be used in Right-to-Left mode. Errors
% in latin mode solved too.
% \begin{macrocode}
\def\@verbatim{%
\let\do\@makeother \dospecials%
\obeylines \verbatim@font \@noligs}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@makecaption}
% Captions are set always centered. This allows us to use bilingual
% captions, for example: |\caption{\R{RLtext} \\ \L{LRtext}}|,
% which will be formatted as:
% \begin{center}
% Right to left caption here (RLtext) \\
% Left to right caption here (LRtext)
% \end{center}
% See also \cs{bcaption} command below.
% \begin{macrocode}
\long\def\@makecaption#1#2{%
\vskip\abovecaptionskip%
\begin{center}%
#1: #2%
\end{center} \par%
\vskip\belowcaptionskip}
% \end{macrocode}
% \end{macro}
%
% \subsubsection{Additional bidirectional commands}
%
% \begin{itemize}
% \item Section headings are typeset with the default global
% direction.
% \item Text in section headings in the reverse language \emph{do
% not} have to be protected for the reflection command, as in:
% |\protect\L{|\emph{Latin Text}|}|, because \cs{L} and \cs{R} are
% robust now.
% \item Table of contents, list of figures and list of tables
% should be typeset with the \cs{tableofcontents},
% \cs{listoffigures} and \cs{listoftables} commands respectively.
% \item The above tables will be typeset in the main direction (and
% language) in effect where the above commands are placed.
% \item Only 2 tables of each kind are supported: one for
% Right-to-Left and another for Left-to-Right directions.
% \end{itemize}
%
% How to include line to both tables? One has to use bidirectional
% sectioning commands as following:
% \begin{enumerate}
% \item Use the |\b|\emph{xxx} version of the sectioning commands
% in the text instead of the |\|\emph{xxx} version (\emph{xxx} is
% one of: \texttt{part}, \texttt{chapter}, \texttt{section},
% \texttt{subsection}, \texttt{subsubsection}, \texttt{caption}).
% \item Syntax of the |\b|\emph{xxx} command is
% |\b|\emph{xxx}|{|\emph{RL text}|}{|\emph{LR text}|}|.
% Both arguments are typeset in proper direction by default (no
% need to change direction for the text inside).
% \item The section header inside the document will be typeset in
% the global direction in effect at the time. i.e. The |{|\emph{RL
% text}|}| will be typeset if Right-to-Left mode is in effect and
% |{|\emph{LR text}|}| otherwise.
% \end{enumerate}
%
% \begin{macro}{\bpart}
% \begin{macrocode}
\newcommand{\bpart}[2]{\part{\protect\if@rl%
#1 \protect\else #2 \protect\fi}}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\bchapter}
% \begin{macrocode}
\newcommand{\bchapter}[2]{\chapter{\protect\if@rl%
#1 \protect\else #2 \protect\fi}}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\bsection}
% \begin{macrocode}
\newcommand{\bsection}[2]{\section{\protect\if@rl%
#1 \protect\else #2 \protect\fi}}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\bsubsection}
% \begin{macrocode}
\newcommand{\bsubsection}[2]{\subsection{\protect\if@rl%
#1 \protect\else #2 \protect\fi}}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\bsubsubsection}
% \begin{macrocode}
\newcommand{\bsubsubsection}[2]{\subsubsection{\protect\if@rl%
#1 \protect\else #2 \protect\fi}}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\bcaption}
% \begin{macrocode}
\newcommand{\bcaption}[2]{%
\caption[\protect\if@rl \R{#1}\protect\else \L{#2}\protect\fi]{%
\if@rl\R{#1}\protect\\ \L{#2}
\else\L{#2}\protect\\ \R{#1}\fi}}
% \end{macrocode}
% \end{macro}
%
% The following definition is a modified version of \cs{bchapter}, meant
% as a bilingual twin for \cs{chapter*} and \cs{section*}
% (added by Irina Abramovici).
%
% \begin{macro}{\bchapternn}
% \begin{macrocode}
\newcommand{\bchapternn}[2]{\chapter*{\protect\if@rl%
#1 \protect\else #2 \protect\fi}}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\bsectionnn}
% \begin{macrocode}
\newcommand{\bsectionnn}[2]{\section*{\protect\if@rl%
#1 \protect\else #2 \protect\fi}}
% \end{macrocode}
% \end{macro}
%
% Finally, at end of \babel\ package, the \cs{headlanguage} and
% two-column mode will be initialized according to the current
% language.
% \begin{macrocode}
\AtEndOfPackage{\rlAtEndOfPackage}
%
\def\rlAtEndOfPackage{%
\global\let\headlanguage=\languagename%\set@outputdblcol%
}
%</rightleft>
% \end{macrocode}
%
% \subsection{Hebrew calendar}
%
% The original version of the package \pkg{hebcal.sty}\footnote{The
% following description of \pkg{hebcal} package is based on the
% comments included with original source by the author, Michail
% Rozman.} for \TeX\ and \LaTeX2.09, entitled ``\TeX{} \& \LaTeX{}
% macros for computing Hebrew date from Gregorian one'' was created
% by Michail Rozman, |
[email protected]|\footnote{Please direct
% any comments, bug reports, questions, etc. about the package to
% this address.}
%
% \begin{tabular}{@{}lr@{}c@{}ll}
% Released: &Tammuz 12, 5751&--&June 24, 1991 &\\
% Corrected:&Shebat 10, 5752&--&January 15, 1992&by Rama Porrat\\
% Corrected:&Adar II 5, 5752&--&March 10, 1992 &by Misha\\
% Corrected:&Tebeth, 5756 &--&January 1996 &Dan Haran\\
% &&&&(
[email protected])
% \end{tabular}
%
% The package was adjusted for \babel{} and \LaTeXe{} by Boris
% Lavva.
%
% Changes to the printing routine (only) by Ron Artstein, June 1,
% 2003.
%
% This package should be included \emph{after} the \pkg{babel} with
% \pkg{hebrew} option, as following:
% \begin{quote}
% |\documentclass[|\ldots|]{|\ldots|}|\\
% |\usepackage[hebrew,|\ldots|,|\emph{other languages}|,|
% \ldots|]{babel}|\\
% |\usepackage{hebcal}|
% \end{quote}
%
% Two main user-level commands are provided by this package:
%
% \DescribeMacro{\Hebrewtoday}
% Computes today's Hebrew date and prints it. If we are presently
% in Hebrew mode, the date will be printed in Hebrew, otherwise ---
% in English (like Shebat 10, 5752).
%
% \DescribeMacro{\Hebrewdate}
% Computes the Hebrew date from the given Gregorian date and
% prints it. If we are presently in Hebrew mode, the date will be
% printed in Hebrew, otherwise --- in English (like Shebat 10,
% 5752). An example of usage is shown below:
% \begin{quote}
% |\newcount\hd \newcount\hm \newcount\hy|\\
% |\hd=10 \hm=3 \hy=1992|\\
% |\Hebrewdate{\hd}{\hm}{\hy}|
% \end{quote}
%
% \DescribeMacro{full}
% The package option |full| sets the flag |\@full@hebrew@year|,
% which causes years from the current millenium to be printed with
% the thousands digit (he-tav-shin-samekh-gimel). Without this
% option, thousands are not printed for the current millenium.
% NOTE: should this be a command option rather than a package
% option? --RA.
%
% \subsubsection{Introduction}
%
% The Hebrew calendar is inherently complicated: it is lunisolar --
% each year starts close to the autumn equinox, but each month must
% strictly start at a new moon. Thus Hebrew calendar must be
% harmonized simultaneously with both lunar and solar events. In
% addition, for reasons of the religious practice, the year cannot
% start on Sunday, Wednesday or Friday.
%
% For the full description of Hebrew calendar and for the list of
% references see:
% \begin{quote}
% Nachum Dershowitz and Edward M. Reingold,
% \emph{``Calendarical Calculations''}, Software--Pract.Exper.,
% vol. 20 (9), pp.899--928 (September 1990).
% \end{quote}
% |C| translation of |LISP| programs from the above article
% available from Mr. Wayne Geiser, |geiser%
[email protected]|.
%
% The 4\textsuperscript{th} distribution (July 1989) of hdate/hcal
% (Hebrew calendar programs similar to UNIX date/cal) by Mr. Amos
% Shapir, |
[email protected]|, contains short and very clear
% description of algorithms.
%
% \subsubsection{Registers, Commands, Formatting Macros}
%
% The command |\Hebrewtoday| produces today's date for Hebrew
% calendar. It is similar to the standard \LaTeXe{} command
% |\today|. In addition three numerical registers |\Hebrewday|,
% |\Hebrewmonth| and |\Hebrewyear| are set.
% For setting this registers without producing of date string
% command |\Hebrewsetreg| can be used.
%
% The command
% |\Hebrewdate{|\emph{Gday}|}{|\emph{Gmonth}|}{|\emph{Gyear}|}|
% produces Hebrew calendar date corresponding to Gregorian date
% |Gday.Gmonth.Gyear|. Three numerical registers |\Hebrewday|,
% |\Hebrewmonth| and |\Hebrewyear| are set.
%
% For converting arbitrary Gregorian date |Gday.Gmonth.Gyear|
% to Hebrew date |Hday.Hmonth.Hyear| without producing date string
% the command:
% \begin{center}
% |\HebrewFromGregorian{|\emph{Gday}|}{|\emph{Gmonth}|}{|%
% \emph{Gyear}|}{|\emph{Hday}|}{|\emph{Hmonth}|}{|\emph{Hyear}|}|
% \end{center}
% can be used.
%
% \begin{macrocode}
%<*calendar>
\newif\if@full@hebrew@year
\@full@hebrew@yearfalse
\DeclareOption{full}{\@full@hebrew@yeartrue}
\ProcessOptions
\newcount\Hebrewday \newcount\Hebrewmonth \newcount\Hebrewyear
% \end{macrocode}
%
% \begin{macro}{\Hebrewdate}
% Hebrew calendar date corresponding to Gregorian date
% |Gday.Gmonth.Gyear|. If Hebrew (right-to-left) fonts \& macros
% are not loaded, we have to use English format.
% \begin{macrocode}
\def\Hebrewdate#1#2#3{%
\HebrewFromGregorian{#1}{#2}{#3}
{\Hebrewday}{\Hebrewmonth}{\Hebrewyear}%
\ifundefined{if@rl}%
\FormatForEnglish{\Hebrewday}{\Hebrewmonth}{\Hebrewyear}%
\else%
\FormatDate{\Hebrewday}{\Hebrewmonth}{\Hebrewyear}%
\fi}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\Hebrewtoday}
% Today's date in Hebrew calendar.
% \begin{macrocode}
\def\Hebrewtoday{\Hebrewdate{\day}{\month}{\year}}
\let\hebrewtoday=\Hebrewtoday
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\Hebrewsetreg}
% Set registers: today's date in hebrew calendar.
% \begin{macrocode}
\def\Hebrewsetreg{%
\HebrewFromGregorian{\day}{\month}{\year}
{\Hebrewday}{\Hebrewmonth}{\Hebrewyear}}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\FormatDate}
% Prints a Hebrew calendar date |Hebrewday.Hebrewmonth.Hebrewyear|.
% \begin{macrocode}
\def\FormatDate#1#2#3{%
\if@rl%
\FormatForHebrew{#1}{#2}{#3}%
\else%
\FormatForEnglish{#1}{#2}{#3}
\fi}
% \end{macrocode}
% \end{macro}
%
% To prepare another language version of Hebrew calendar commands,
% one should change or add commands here.
%
% We start with Hebrew language macros.
% \begin{macro}{\HebrewYearName}
% Prints Hebrew year as a Hebrew number. Disambiguates strings by
% adding lamed-pe-gimel to years of the first Jewish millenium and
% to years divisible by 1000. Suppresses the thousands digit in the
% current millenium unless the package option |full| is selected.
% NOTE: should this be provided as a command option rather than a
% package option? --RA.
% \begin{macrocode}
\def\HebrewYearName#1{{%
\@tempcnta=#1\divide\@tempcnta by 1000\multiply\@tempcnta by 1000
\ifnum#1=\@tempcnta\relax % divisible by 1000: disambiguate
\Hebrewnumeralfinal{#1}\ )\heblamed\hebpe"\hebgimel(%
\else % not divisible by 1000
\ifnum#1<1000\relax % first millennium: disambiguate
\Hebrewnumeralfinal{#1}\ )\heblamed\hebpe"\hebgimel(%
\else
\ifnum#1<5000
\Hebrewnumeralfinal{#1}%
\else
\ifnum#1<6000 % current millenium, print without thousands
\@tempcnta=#1\relax
\if@full@hebrew@year\else\advance\@tempcnta by -5000\fi
\Hebrewnumeralfinal{\@tempcnta}%
\else % #1>6000
\Hebrewnumeralfinal{#1}%
\fi
\fi
\fi
\fi}}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\HebrewMonthName}
% The macro |\HebrewMonthName{|\emph{month}|}{|\emph{year}|}|
% returns the name of month in the `year'.
% \begin{macrocode}
\def\HebrewMonthName#1#2{%
\ifnum #1 = 7 %
\CheckLeapHebrewYear{#2}%
\if@HebrewLeap \hebalef\hebdalet\hebresh\ \hebbet'%
\else \hebalef\hebdalet\hebresh%
\fi%
\else%
\ifcase#1%
% nothing for 0
\or\hebtav\hebshin\hebresh\hebyod%
\or\hebhet\hebshin\hebvav\hebfinalnun%
\or\hebkaf\hebsamekh\heblamed\hebvav%
\or\hebtet\hebbet\hebtav%
\or\hebshin\hebbet\hebtet%
\or\hebalef\hebdalet\hebresh\ \hebalef'%
\or\hebalef\hebdalet\hebresh\ \hebbet'%
\or\hebnun\hebyod\hebsamekh\hebfinalnun%
\or\hebalef\hebyod\hebyod\hebresh%
\or\hebsamekh\hebyod\hebvav\hebfinalnun%
\or\hebtav\hebmem\hebvav\hebzayin%
\or\hebalef\hebbet%
\or\hebalef\heblamed\hebvav\heblamed%
\fi%
\fi}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\HebrewDayName}
% Name of day in Hebrew letters (gimatria).
% \begin{macrocode}
\def\HebrewDayName#1{\Hebrewnumeral{#1}}
% \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\FormatForHebrew}
% The macro |\FormatForHebrew{|\emph{hday}|}{|\emph{hmonth}
% |}{|\emph{hyear}|}| returns the formatted Hebrew date in Hebrew
% language.
% \begin{macrocode}
\def\FormatForHebrew#1#2#3{%
\HebrewDayName{#1}~\hebbet\HebrewMonthName{#2}{#3},~%
\HebrewYearName{#3}}
% \end{macrocode}
% \end{macro}
%
% We continue with two English language macros for Hebrew calendar.
% \begin{macro}{\HebrewMonthNameInEnglish}
% The macro |\HebrewMonthNameInEnglish{|\emph{month}|}{|%
% \emph{year}|}| is similar to |\Hebrew|\-|Month|\-|Name| described
% above. It returns the name of month in the Hebrew `year' in
% English.
% \begin{macrocode}
\def\HebrewMonthNameInEnglish#1#2{%
\ifnum #1 = 7%
\CheckLeapHebrewYear{#2}%
\if@HebrewLeap Adar II\else Adar\fi%
\else%
\ifcase #1%
% nothing for 0
\or Tishrei%
\or Heshvan%
\or Kislev%
\or Tebeth%
\or Shebat%
\or Adar I%
\or Adar II%
\or Nisan%
\or Iyar%
\or Sivan%
\or Tammuz%
\or Av%
\or Elul%
\fi
\fi}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\FormatForEnglish}
% The macro |\FormatForEnglish{|\emph{hday}|}{|\emph{hmonth}
% |}{|\emph{hyear}|}| is similar to |\Format|\-|For|\-|Hebrew|
% macro described above and returns the formatted Hebrew date in
% English.
% \begin{macrocode}
\def\FormatForEnglish#1#2#3{%
\HebrewMonthNameInEnglish{#2}{#3} \number#1,\ \number#3}
% \end{macrocode}
% \end{macro}
%
% \subsubsection{Auxiliary Macros}
%
% \begin{macrocode}
\newcount\@common
% \end{macrocode}
% \begin{macro}{\Remainder}
% |\Remainder{|\emph{a}|}{|\emph{b}|}{|\emph{c}|}| calculates
% $c = a\%b == a-b\times\frac{a}{b}$
% \begin{macrocode}
\def\Remainder#1#2#3{%
#3 = #1% % c = a
\divide #3 by #2% % c = a/b
\multiply #3 by -#2% % c = -b(a/b)
\advance #3 by #1}% % c = a - b(a/b)
% \end{macrocode}
% \end{macro}
% \begin{macrocode}
\newif\if@Divisible
% \end{macrocode}
% \begin{macro}{\CheckIfDivisible}
% |\CheckIfDivisible{|\emph{a}|}{|\emph{b}|}| sets
% |\@Divisibletrue| if $a\%b == 0$
% \begin{macrocode}
\def\CheckIfDivisible#1#2{%
{%
\countdef\tmp = 0% \tmp == \count0 - temporary variable
\Remainder{#1}{#2}{\tmp}%
\ifnum \tmp = 0%
\global\@Divisibletrue%
\else%
\global\@Divisiblefalse%
\fi}}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\ifundefined}
% From the \TeX book, ex. 7.7:
% \begin{quote}
% |\ifundefined{|\emph{command}|}<true text>\else<false text>\fi|
% \end{quote}
% \begin{macrocode}
\def\ifundefined#1{\expandafter\ifx\csname#1\endcsname\relax}
% \end{macrocode}
% \end{macro}
%
% \subsubsection{Gregorian Part}
%
% \begin{macrocode}
\newif\if@GregorianLeap
% \end{macrocode}
% \begin{macro}{\IfGregorianLeap}
% Conditional which is true if Gregorian `year' is a leap year:
% $((year\%4==0)\wedge(year\%100\neq 0))\vee(year\%400==0)$
% \begin{macrocode}
\def\IfGregorianLeap#1{%
\CheckIfDivisible{#1}{4}%
\if@Divisible%
\CheckIfDivisible{#1}{100}%
\if@Divisible%
\CheckIfDivisible{#1}{400}%
\if@Divisible%
\@GregorianLeaptrue%
\else%
\@GregorianLeapfalse%
\fi%
\else%
\@GregorianLeaptrue%
\fi%
\else%
\@GregorianLeapfalse%
\fi%
\if@GregorianLeap}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\GregorianDaysInPriorMonths}
% The macro |\GregorianDaysInPriorMonths{|\emph{month}|}{|^^A
% \emph{year}|}{|\emph{days}|}| calculates the number of days in
% months prior to `month' in the `year'.
% \begin{macrocode}
\def\GregorianDaysInPriorMonths#1#2#3{%
{%
#3 = \ifcase #1%
0 \or% % no month number 0
0 \or%
31 \or%
59 \or%
90 \or%
120 \or%
151 \or%
181 \or%
212 \or%
243 \or%
273 \or%
304 \or%
334%
\fi%
\IfGregorianLeap{#2}%
\ifnum #1 > 2% % if month after February
\advance #3 by 1% % add leap day
\fi%
\fi%
\global\@common = #3}%
#3 = \@common}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\GregorianDaysInPriorYears}
% The macro |\GregorianDaysInPriorYears{|\emph{year}|}{|^^A
% \emph{days}|}| calculates the number of days in years prior to
% the `year'.
% \begin{macrocode}
\def\GregorianDaysInPriorYears#1#2{%
{%
\countdef\tmpc = 4% % \tmpc==\count4
\countdef\tmpb = 2% % \tmpb==\count2
\tmpb = #1% %
\advance \tmpb by -1% %
\tmpc = \tmpb% % \tmpc = \tmpb = year-1
\multiply \tmpc by 365% % Days in prior years =
#2 = \tmpc% % = 365*(year-1) ...
\tmpc = \tmpb% %
\divide \tmpc by 4% % \tmpc = (year-1)/4
\advance #2 by \tmpc% % ... plus Julian leap days ...
\tmpc = \tmpb% %
\divide \tmpc by 100% % \tmpc = (year-1)/100
\advance #2 by -\tmpc% % ... minus century years ...
\tmpc = \tmpb% %
\divide \tmpc by 400% % \tmpc = (year-1)/400
\advance #2 by \tmpc% % ... plus 4-century years.
\global\@common = #2}%
#2 = \@common}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\AbsoluteFromGregorian}
% The macro |\AbsoluteFromGregorian{|\emph{day}|}{|\emph{month}^^A
% |}{|\emph{year}|}{|\emph{absdate}|}| calculates the absolute date
% (days since $01.01.0001$) from Gregorian date |day.month.year|.
% \begin{macrocode}
\def\AbsoluteFromGregorian#1#2#3#4{%
{%
\countdef\tmpd = 0% % \tmpd==\count0
#4 = #1% % days so far this month
\GregorianDaysInPriorMonths{#2}{#3}{\tmpd}%
\advance #4 by \tmpd% % add days in prior months
\GregorianDaysInPriorYears{#3}{\tmpd}%
\advance #4 by \tmpd% % add days in prior years
\global\@common = #4}%
#4 = \@common}
% \end{macrocode}
% \end{macro}
%
% \subsubsection{Hebrew Part}
%
% \begin{macrocode}
\newif\if@HebrewLeap
% \end{macrocode}
% \begin{macro}{\CheckLeapHebrewYear}
% Set |\@HebrewLeaptrue| if Hebrew `year' is a leap year, i.e.\ if
% $(1+7\times year)\%19 < 7$ then \emph{true} else \emph{false}
% \begin{macrocode}
\def\CheckLeapHebrewYear#1{%
{%
\countdef\tmpa = 0% % \tmpa==\count0
\countdef\tmpb = 1% % \tmpb==\count1
%
\tmpa = #1%
\multiply \tmpa by 7%
\advance \tmpa by 1%
\Remainder{\tmpa}{19}{\tmpb}%
\ifnum \tmpb < 7% % \tmpb = (7*year+1)%19
\global\@HebrewLeaptrue%
\else%
\global\@HebrewLeapfalse%
\fi}}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\HebrewElapsedMonths}
% The macro |\HebrewElapsedMonths{|\emph{year}|}{|\emph{months}|}|
% determines the number of months elapsed from the Sunday prior to
% the start of the Hebrew calendar to the mean conjunction of
% Tishri of Hebrew `year'.
% \begin{macrocode}
\def\HebrewElapsedMonths#1#2{%
{%
\countdef\tmpa = 0% % \tmpa==\count0
\countdef\tmpb = 1% % \tmpb==\count1
\countdef\tmpc = 2% % \tmpc==\count2
%
\tmpa = #1% %
\advance \tmpa by -1% %
#2 = \tmpa% % #2 = \tmpa = year-1
\divide #2 by 19% % Number of complete Meton cycles
\multiply #2 by 235% % #2 = 235*((year-1)/19)
%
\Remainder{\tmpa}{19}{\tmpb}% \tmpa = years%19-years this cycle
\tmpc = \tmpb% %
\multiply \tmpb by 12% %
\advance #2 by \tmpb% % add regular months this cycle
%
\multiply \tmpc by 7% %
\advance \tmpc by 1% %
\divide \tmpc by 19% % \tmpc = (1+7*((year-1)%19))/19 -
% % number of leap months this cycle
\advance #2 by \tmpc% % add leap months
%
\global\@common = #2}%
#2 = \@common}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\HebrewElapsedDays}
% The macro |\HebrewElapsedDays{|\emph{year}|}{|\emph{days}|}|
% determines the number of days elapsed from the Sunday prior to
% the start of the Hebrew calendar to the mean conjunction of
% Tishri of Hebrew `year'.
% \begin{macrocode}
\def\HebrewElapsedDays#1#2{%
{%
\countdef\tmpa = 0% % \tmpa==\count0
\countdef\tmpb = 1% % \tmpb==\count1
\countdef\tmpc = 2% % \tmpc==\count2
%
\HebrewElapsedMonths{#1}{#2}%
\tmpa = #2% %
\multiply \tmpa by 13753% %
\advance \tmpa by 5604% % \tmpa=MonthsElapsed*13758 + 5604
\Remainder{\tmpa}{25920}{\tmpc}% \tmpc == ConjunctionParts
\divide \tmpa by 25920%
%
\multiply #2 by 29%
\advance #2 by 1%
\advance #2 by \tmpa% % #2 = 1 + MonthsElapsed*29 +
% % PartsElapsed/25920
\Remainder{#2}{7}{\tmpa}% % \tmpa == DayOfWeek
\ifnum \tmpc < 19440%
\ifnum \tmpc < 9924%
\else% % New moon at 9 h. 204 p. or later
\ifnum \tmpa = 2% % on Tuesday ...
\CheckLeapHebrewYear{#1}% of a common year
\if@HebrewLeap%
\else%
\advance #2 by 1%
\fi%
\fi%
\fi%
\ifnum \tmpc < 16789%
\else% % New moon at 15 h. 589 p. or later
\ifnum \tmpa = 1% % on Monday ...
\advance #1 by -1%
\CheckLeapHebrewYear{#1}% at the end of leap year
\if@HebrewLeap%
\advance #2 by 1%
\fi%
\fi%
\fi%
\else%
\advance #2 by 1% % new moon at or after midday
\fi%
%
\Remainder{#2}{7}{\tmpa}% % \tmpa == DayOfWeek
\ifnum \tmpa = 0% % if Sunday ...
\advance #2 by 1%
\else% %
\ifnum \tmpa = 3% % Wednesday ...
\advance #2 by 1%
\else%
\ifnum \tmpa = 5% % or Friday
\advance #2 by 1%
\fi%
\fi%
\fi%
\global\@common = #2}%
#2 = \@common}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\DaysInHebrewYear}
% The macro |\DaysInHebrewYear{|\emph{year}|}{|\emph{days}|}|
% calculates the number of days in Hebrew `year'.
% \begin{macrocode}
\def\DaysInHebrewYear#1#2{%
{%
\countdef\tmpe = 12% % \tmpe==\count12
%
\HebrewElapsedDays{#1}{\tmpe}%
\advance #1 by 1%
\HebrewElapsedDays{#1}{#2}%
\advance #2 by -\tmpe%
\global\@common = #2}%
#2 = \@common}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\HebrewDaysInPriorMonths}
% The macro |\HebrewDaysInPriorMonths{|\emph{month}|}{|^^A
% \emph{year}|}{|\emph{days}|}| calculates the nu\-mber of days in
% months prior to `month' in the `year'.
% \begin{macrocode}
\def\HebrewDaysInPriorMonths#1#2#3{%
{%
\countdef\tmpf= 14% % \tmpf==\count14
%
#3 = \ifcase #1% % Days in prior month of regular year
0 \or% % no month number 0
0 \or% % Tishri
30 \or% % Heshvan
59 \or% % Kislev
89 \or% % Tebeth
118 \or% % Shebat
148 \or% % Adar I
148 \or% % Adar II
177 \or% % Nisan
207 \or% % Iyar
236 \or% % Sivan
266 \or% % Tammuz
295 \or% % Av
325 \or% % Elul
400% % Dummy
\fi%
\CheckLeapHebrewYear{#2}%
\if@HebrewLeap% % in leap year
\ifnum #1 > 6% % if month after Adar I
\advance #3 by 30% % add 30 days
\fi%
\fi%
\DaysInHebrewYear{#2}{\tmpf}%
\ifnum #1 > 3%
\ifnum \tmpf = 353% %
\advance #3 by -1% %
\fi% % Short Kislev
\ifnum \tmpf = 383% %
\advance #3 by -1% %
\fi% %
\fi%
%
\ifnum #1 > 2%
\ifnum \tmpf = 355% %
\advance #3 by 1% %
\fi% % Long Heshvan
\ifnum \tmpf = 385% %
\advance #3 by 1% %
\fi% %
\fi%
\global\@common = #3}%
#3 = \@common}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\AbsoluteFromHebrew}
% The macro |\AbsoluteFromHebrew{|\emph{day}|}{|\emph{month}^^A
% |}{|\emph{year}|}{|\emph{absdate}|}| calculates the absolute date
% of Hebrew date |day.month.year|.
% \begin{macrocode}
\def\AbsoluteFromHebrew#1#2#3#4{%
{%
#4 = #1%
\HebrewDaysInPriorMonths{#2}{#3}{#1}%
\advance #4 by #1% % Add days in prior months this year
\HebrewElapsedDays{#3}{#1}%
\advance #4 by #1% % Add days in prior years
\advance #4 by -1373429% % Subtract days before Gregorian
\global\@common = #4}% % 01.01.0001
#4 = \@common}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\HebrewFromGregorian}
% The macro |\HebrewFromGregorian{|\emph{Gday}|}{|\emph{Gmonth}^^A
% |}{|\emph{Gyear}|}{|\emph{Hday}|}{|\emph{Hmonth}|}|\-|{|^^A
% \emph{Hyear}|}| evaluates Hebrew date |Hday|, |Hmonth|, |Hyear|
% from Gregorian date |Gday|, |Gmonth|, |Gyear|.
% \begin{macrocode}
\def\HebrewFromGregorian#1#2#3#4#5#6{%
{%
\countdef\tmpx= 17% % \tmpx==\count17
\countdef\tmpy= 18% % \tmpy==\count18
\countdef\tmpz= 19% % \tmpz==\count19
%
#6 = #3% %
\global\advance #6 by 3761% approximation from above
\AbsoluteFromGregorian{#1}{#2}{#3}{#4}%
\tmpz = 1 \tmpy = 1%
\AbsoluteFromHebrew{\tmpz}{\tmpy}{#6}{\tmpx}%
\ifnum \tmpx > #4% %
\global\advance #6 by -1% Hyear = Gyear + 3760
\AbsoluteFromHebrew{\tmpz}{\tmpy}{#6}{\tmpx}%
\fi% %
\advance #4 by -\tmpx% % Days in this year
\advance #4 by 1% %
#5 = #4% %
\divide #5 by 30% % Approximation for month from below
\loop% % Search for month
\HebrewDaysInPriorMonths{#5}{#6}{\tmpx}%
\ifnum \tmpx < #4%
\advance #5 by 1%
\tmpy = \tmpx%
\repeat%
\global\advance #5 by -1%
\global\advance #4 by -\tmpy}}
%</calendar>
% \end{macrocode}
% \end{macro}
%
% \providecommand\dst{\textsc{docstrip}}
% \providecommand\babel{\textsf{babel}}
% \GetFileInfo{heb209.dtx}
%
% \changes{heb209~1.0a}{1998/01/06}{%
% Initial version. Provides hebrew\_newcode, hebrew\_oldcode and
% hebrew\_p style files for \LaTeX~2.09 (by Boris Lavva)}
%
% \section{Hebrew in \LaTeX~2.09 compatibility mode}\label{sec:heb209}
%
% |\documentstyle| command in the preamble of \LaTeX\ document
% indicates that it is a \LaTeX~2.09 document, and should be processed
% in \emph{compatibility mode}. In such documents, one of the following
% three Hebrew style options can be included:
% \begin{enumerate}
% \item \texttt{hebrew\_newcode} indicates that document will use UNIX
% ISO 8859-8 or Windows cp1255 input encoding, i.e.\ \emph{Alef}
% letter will be represented as 224.
% \item \texttt{hebrew\_p} indicates that document is encoded with IBM
% PC cp862 encoding, i.e.\ \emph{Alef} letter will be represented as
% 128.
% \item \texttt{hebrew\_oldcode} indicates that document uses old 7-bit
% encoding, as defined in Israeli Standard 960, i.e.\ \emph{Alef} is
% character number 96.
% \end{enumerate}
% Note, that other hebrew-related styles, such as \texttt{hebcal} can
% be included \emph{after} the abovenamed Hebrew style option, for
% example:
% \begin{quote}
% |\documentstyle[12pt,hebrew_p,hebcal]{report}|.
% \end{quote}
%
% Any Hebrew document which compiled under \LaTeX~2.09 should compile
% under compatibility mode, unless it uses low-level commands such as
% |\tenrm|.
%
% \subsection{The {\normalfont\dst{}} modules}
%
% The following modules are used in the implementation to direct
% \dst{} in generating the external files:
% \begin{center}
% \begin{tabular}{ll}
% newcode & produce \texttt{hebrew\_newcode.sty} \\
% pccode & produce \texttt{hebrew\_p.sty} \\
% oldcode & produce \texttt{hebrew\_oldcode.sty}
% \end{tabular}
% \end{center}
%
% \StopEventually{}
%
% \iffalse
% \subsection{A driver for this document}
%
% The next bit of code contains the documentation driver file for
% \TeX{}, i.e., the file that will produce the documentation you
% are currently reading. It will be extracted from this file by
% the \dst{} program.
%
% \begin{macrocode}
%<*driver>
\documentclass{ltxdoc}
\title{Hebrew \LaTeX~2.09 compatibility style files}
\author{Boris Lavva}
\date{Printed \today}
\begin{document}
\maketitle
\DocInput{heb209.dtx}
\end{document}
%</driver>
% \end{macrocode}
% \fi
%
% \subsection{Obsolete style files}
%
% For each of the Hebrew \LaTeX~2.09 Hebrew styles, we produce a
% file which uses correct input encoding and calls \babel\ with
% Hebrew and English language options.
% This means that any styles which say |\input hebrew_newcode.sty|
% or |\documentstyle[|\ldots|hebrew_newcode|\ldots|]{|\ldots|}|
% should still work.
%
% \begin{macrocode}
%<*newcode|pccode|oldcode>
\NeedsTeXFormat{LaTeX2e}
%</newcode|pccode|oldcode>
% \end{macrocode}
%
% \begin{macrocode}
%<*newcode>
\@obsoletefile{hebrew.sty}{hebrew_newcode.sty}
\RequirePackage[8859-8]{inputenc}
%</newcode>
%<*pccode>
\@obsoletefile{hebrew.sty}{hebrew_p.sty}
\RequirePackage[cp862]{inputenc}
%</pccode>
%<*oldcode>
\@obsoletefile{hebrew.sty}{hebrew_oldcode.sty}
\RequirePackage[si960]{inputenc}
%</oldcode>
% \end{macrocode}
%
% \begin{macrocode}
%<*newcode|pccode|oldcode>
\RequirePackage[english,hebrew]{babel}
%</newcode|pccode|oldcode>
% \end{macrocode}
%
% \Finale
%%
%% \CharacterTable
%% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
%% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
%% Digits \0\1\2\3\4\5\6\7\8\9
%% Exclamation \! Double quote \" Hash (number) \#
%% Dollar \$ Percent \% Ampersand \&
%% Acute accent \' Left paren \( Right paren \)
%% Asterisk \* Plus \+ Comma \,
%% Minus \- Point \. Solidus \/
%% Colon \: Semicolon \; Less than \<
%% Equals \= Greater than \> Question mark \?
%% Commercial at \@ Left bracket \[ Backslash \\
%% Right bracket \] Circumflex \^ Underscore \_
%% Grave accent \` Left brace \{ Vertical bar \|
%% Right brace \} Tilde \~}
%%
\endinput