% \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 -- 2026 Udi Fogiel.
% All rights reserved.
%
%<*calendar>
%% TeX & LaTeX macros for computing Hebrew date from Gregorian one
%% Copyright (C) 1991 by Michail Rozman, misha@iop.tartu.ew.su
%%
%
% \fi
%
%
% \iffalse
%\ProvidesFile{hebrew.ldf}
%\ProvidesFile{rlbabel.def}
%\ProvidesPackage{hebcal}
%\ProvidesPackage{hebrew_newcode}
%\ProvidesPackage{hebrew_p}
%\ProvidesPackage{hebrew_oldcode}
%<*driver>
\ProvidesFile{hebrew.drv}
%
% \fi
% \ProvidesFile{hebrew.dtx}
[2026/02/16 v2.5 %
% \iffalse
% Hebrew language definition from the babel system
% Right-to-Left support from the babel system
% Hebrew calendar
% Driver file for hebrew support
% Package for backwards compatibility
% Package for backwards compatibility
% 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
The package is in maintenance only, bugs will
be fixed but no new features will be added.
The .ldf file is only compatiable with pdfLaTeX or LaTeX,
and even then it is strongly recommended for documents using
more than a short text in Hebrew to either use LuaTeX
(with babel's .ini file or polyglossia), or for short text
with pdfTeX use the .ini file. Consult the documentation
of babel for better settings for Hebrew.
\tableofcontents
\DocInput{hebrew.dtx}
\clearpage
\def\filename{index}
\PrintIndex
\clearpage
\def\filename{changes}
\PrintChanges
\end{document}
%
% \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}
\def\@eqnnum{{\normalfont \normalcolor \if@rl\beginR\fi(\theequation)\if@rl\endR\fi}}
\AddToHook{package/amsmath/after}{%
\def\tagform@#1{\maketag@@@{\if@rl\beginR\fi(\kern\z@\ignorespaces#1\unskip\@@italiccorr)\if@rl\endR\fi}}}
\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\RLE{\hebshin\hebqof\hebfinalpe{} \theslide}%
\else\LRE{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\LRE{\protect\@@alph{\number\c@enumii}}\fi}
\renewcommand{\theenumiv}
{\if@rl\protect\Hebrewnumeral{\number\c@enumiv}%
\else\protect\LRE{\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
\AtBeginDocument{%
\def\label#1{\@bsphack\begingroup\UseHookWithArguments{label}{1}{#1}%
\if@rl
\protected@write\@auxout{}%
{\string\newlabel{#1}{{\beginR\@currentlabel\endR}{\thepage}%
{\beginR\@currentlabelname\endR}{\@currentHref}{\@kernel@reserved@label@data}}}%
\else
\protected@write\@auxout{}%
{\string\newlabel{#1}{{\beginL\@currentlabel\endL}{\thepage}%
{\beginL\@currentlabelname\endL}{\@currentHref}{\@kernel@reserved@label@data}}}%
\fi
\endgroup\@esphack}}
\else
\AtBeginDocument{%
\def\label#1{\@bsphack\begingroup\UseHookWithArguments{label}{1}{#1}%
\if@rl
\def\p@enumiii{\p@enumii)\theenumii(}%
\protected@write\@auxout{}%
{\string\newlabel{#1}{{\beginR\@currentlabel\endR}{\thepage}%
{\beginR\@currentlabelname\endR}{\@currentHref}{\@kernel@reserved@label@data}}}%
\else
\def\p@enumiii{\p@enumii(\theenumii)}%
\protected@write\@auxout{}%
{\string\newlabel{#1}{{\beginL\@currentlabel\endL}{\thepage}%
{\beginL\@currentlabelname\endL}{\@currentHref}{\@kernel@reserved@label@data}}}%
\fi
\endgroup\@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\RLE{\hebhe\hebayin\hebtav\hebqof}}
\def\hebincl{\protect\RLE{\hebresh\hebtsadi"\hebbet}}
\def\hebpage{\protect\RLE{\hebayin\hebmem\hebvav\hebdalet}}
\def\hebto{\protect\RLE{\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}
\AddToHook{begindocument/before}{\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}
%
% \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. The \cs{LRE}, \cs{RLE}, \cs{RL} and \cs{LR}
% are provided to avoid conflicts with other macros.
%
% 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}
\let\LRE\L
\let\LR\L
% \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 }
\let\RLE\R
\let\RL\R
% \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\RLE{#1}\fi}
\def\@ensure@L#1{\if@rl\LRE{#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{\RLE{#1}}}
\newcommand{\embox}[1]{\mbox{\LRE{#1}}}
\AddToHook{package/amstext/after}{%
\def\textdef@#1#2#3{\hbox{{%
\everymath{#1}%
\let\f@size#2\selectfont
\if@rl\beginR\fi#3\if@rl\endR\fi}}}
}
% \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}
\AddToHook{package/color/after}{%
\long\def\color@b@x#1#2#3{%
\leavevmode\ifmmode\else\if@rl\beginL\fi\fi
\setbox\z@\hbox{\kern\fboxsep{\set@color\if@rl\beginR\fi#3\if@rl\endR\fi}\kern\fboxsep}%
\dimen@\ht\z@\advance\dimen@\fboxsep\ht\z@\dimen@
\dimen@\dp\z@\advance\dimen@\fboxsep\dp\z@\dimen@
{#1{#2\color@block{\wd\z@}{\ht\z@}{\dp\z@}%
\box\z@}}\ifmmode\else\if@rl\endL\fi\fi}
\def\normalcolor{\let\current@color\default@color\ifhmode\if@rl\beginL\aftergroup\endR\fi\fi\set@color\ifhmode\if@rl\beginR\aftergroup\endL\fi\fi}
\DeclareRobustCommand\color{%
\ifhmode\if@rl\beginL\aftergroup\endR\fi\fi\@ifnextchar[\@undeclaredcolor\@declaredcolor}
\def\@declaredcolor#1{%
\@ifundefined{\string\color @#1}%
{\c@lor@error{`#1'}}%
{\expandafter\let\expandafter\current@color
\csname\string\color @#1\endcsname
\set@color}%
\ifhmode\if@rl\beginR\aftergroup\endL\fi\fi\ignorespaces}
\def\@undeclaredcolor[#1]#2{%
\@ifundefined{color@#1}%
{\c@lor@error{model `#1'}}%
{\csname color@#1\endcsname\current@color{#2}%
\set@color}%
\ifhmode\if@rl\beginR\aftergroup\endL\fi\fi\ignorespaces}
\DeclareRobustCommand\bidicolor{%
\@ifnextchar[\@bidiundeclaredcolor\@bidideclaredcolor}
\def\@bidiundeclaredcolor[#1]#2{%
\@ifundefined{color@#1}%
{\c@lor@error{model `#1'}}%
{\csname color@#1\endcsname\current@color{#2}%
\set@color}%
\ignorespaces}
\def\@bidideclaredcolor#1{%
\@ifundefined{\string\color @#1}%
{\c@lor@error{`#1'}}%
{\expandafter\let\expandafter\current@color
\csname\string\color @#1\endcsname
\set@color}%
\ignorespaces}
\def\color@box#1#2{\color@b@x\relax{\bidicolor#1{#2}}}
\def\color@fbox#1#2#3{%
\color@b@x{\fboxsep\z@\bidicolor#1{#2}\fbox}{\bidicolor#1{#3}}}
\def\color@setgroup{\begingroup\ifhmode\if@rl\beginL\aftergroup\endR\fi\fi\set@color\ifhmode\if@rl\beginR\aftergroup\endL\fi\fi}
}
\AddToHook{package/xcolor/after}{%
\long\def\color@b@x#1#2#3%
{\leavevmode\ifmmode\else\if@rl\beginL\fi\fi
\setbox\z@\hbox{\kern\fboxsep{\set@color\if@rl\beginR\fi#3\if@rl\endR\fi}\kern\fboxsep}%
\dimen@\ht\z@\advance\dimen@\fboxsep\ht\z@\dimen@
\dimen@\dp\z@\advance\dimen@\fboxsep\dp\z@\dimen@
{#1{#2\color@block{\wd\z@}{\ht\z@}{\dp\z@}\box\z@}}\ifmmode\else\if@rl\endL\fi\fi}
\protected\def\normalcolor{\let\current@color\default@color\ifhmode\if@rl\beginL\aftergroup\endR\fi\fi\set@color\ifhmode\if@rl\beginR\aftergroup\endL\fi\fi}
\DeclareRobustCommand\color
{\ifhmode\if@rl\beginL\aftergroup\endR\fi\fi\@ifnextchar[\@undeclaredcolor\@declaredcolor}
\def\@undeclaredcolor[#1]#2%
{\begingroup
\let\@@cls\@empty
\XC@getmodclr12{#1}{#2}{}%
{\ifblendcolors
\ifx\colorblend\@empty\else
\edef\@@mix{\expandafter\@gobble\colorblend}\@tempswafalse
\XC@coremodel\@@mod\@@clr\@xcolor@{}{}\@@mod\@@clr
\fi
\fi
\ifconvertcolorsU
\edef\@@tmp{\XC@tgt@mod{\@@mod}}%
\convertcolorspec\@@mod\@@clr\@@tmp\@@clr \let\@@mod\@@tmp
\fi
\ifmaskcolors
\convertcolorspec\@@mod\@@clr\XC@mmod\@@clr
\let\@@mod\XC@mmod
\XC@inflate\@@mod\XC@mclr\@@clr\@@tmp
\expandafter\XC@mul\@@tmp,\@@clr
\fi
\edef\@@tmp{\noexpand\XC@undeclaredcolor{\@@mod}{\@@clr}}%
\expandafter\endgroup\@@tmp}}
\def\@declaredcolor#1%
{\XC@edef\XC@@tmp{#1}\XC@@tstfalse
\ifcase\XC@type\XC@@tmp\relax \XC@@tsttrue\or \relax\else
\ifblendcolors\XC@@tsttrue\fi \ifmaskcolors\XC@@tsttrue\fi
\ifconvertcolorsU\XC@@tsttrue\fi
\fi
\ifXC@@tst
\expandafter\XC@declaredcolor\else
\expandafter\XC@declaredc@lor\fi}
\def\XC@undeclaredcolor#1#2%
{\@ifundefinedmodel{#1}%
{\c@lor@error{model `#1'}}%
{\@nameuse{color@#1}\current@color{#2}%
\edef\XC@current@color{\noexpand\xcolor@{}{\current@color}{#1}{#2}}%
\XC@display}\ifhmode\if@rl\beginR\aftergroup\endL\fi\fi\ignorespaces}
\def\XC@declaredc@lor
{\XC@let@Nc\XC@current@color{\string\color@\XC@@tmp}%
\edef\current@color{\XC@current@color}%
\XC@display\ifhmode\if@rl\beginR\aftergroup\endL\fi\fi\ignorespaces}
\DeclareRobustCommand\bidicolor
{\@ifnextchar[\@bidiundeclaredcolor\@bidideclaredcolor}
\def\@bidiundeclaredcolor[#1]#2%
{\begingroup
\let\@@cls\@empty
\XC@getmodclr12{#1}{#2}{}%
{\ifblendcolors
\ifx\colorblend\@empty\else
\edef\@@mix{\expandafter\@gobble\colorblend}\@tempswafalse
\XC@coremodel\@@mod\@@clr\@xcolor@{}{}\@@mod\@@clr
\fi
\fi
\ifconvertcolorsU
\edef\@@tmp{\XC@tgt@mod{\@@mod}}%
\convertcolorspec\@@mod\@@clr\@@tmp\@@clr \let\@@mod\@@tmp
\fi
\ifmaskcolors
\convertcolorspec\@@mod\@@clr\XC@mmod\@@clr
\let\@@mod\XC@mmod
\XC@inflate\@@mod\XC@mclr\@@clr\@@tmp
\expandafter\XC@mul\@@tmp,\@@clr
\fi
\edef\@@tmp{\noexpand\XC@bidiundeclaredcolor{\@@mod}{\@@clr}}%
\expandafter\endgroup\@@tmp}}
\def\XC@bidiundeclaredcolor#1#2%
{\@ifundefinedmodel{#1}%
{\c@lor@error{model `#1'}}%
{\@nameuse{color@#1}\current@color{#2}%
\edef\XC@current@color{\noexpand\xcolor@{}{\current@color}{#1}{#2}}%
\XC@display}}
\def\@bidideclaredcolor#1%
{\XC@edef\XC@@tmp{#1}\XC@@tstfalse
\ifcase\XC@type\XC@@tmp\relax \XC@@tsttrue\or \relax\else
\ifblendcolors\XC@@tsttrue\fi \ifmaskcolors\XC@@tsttrue\fi
\ifconvertcolorsU\XC@@tsttrue\fi
\fi
\ifXC@@tst
\expandafter\XC@bidideclaredcolor\else
\expandafter\XC@bidideclaredc@lor\fi}
\def\XC@bidideclaredcolor
{\XC@split\XC@@tmp
\edef\@@tmp{\noexpand\@bidiundeclaredcolor[\@@mod]{\@@clr}}%
\expandafter\endgroup\@@tmp}
\def\XC@bidideclaredc@lor
{\XC@let@Nc\XC@current@color{\string\color@\XC@@tmp}%
\edef\current@color{\XC@current@color}%
\XC@display}
\def\color@box#1#2{\color@b@x\relax{\bidicolor#1{#2}}}
\def\color@fbox#1#2#3#{\protect\color@fb@x{#1}{#2}{#3}}
\def\color@fb@x#1#2#3#4%
{\color@b@x{\fboxsep\z@\bidicolor#1{#2}\XC@fbox}%
{\@ifxempty{#3}{\bidicolor#1}{\bidicolor#3}{#4}}}
\def\color@setgroup{\begingroup\ifhmode\if@rl\beginL\aftergroup\endR\fi\fi\set@color\ifhmode\if@rl\beginR\aftergroup\endL\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}
%
% \begin{macro}{hyperrefsupport}
% \begin{macrocode}
\AddToHook{package/hyperref/after}{%
\AtBeginDocument{%
\def\contentsline#1#2#3#4{%
\ifx\\#4\\%
\csname l@#1\endcsname{#2}{#3}%
\else
\ifcase\Hy@linktoc % none
\csname l@#1\endcsname{#2}{#3}%
\or % section
\csname l@#1\endcsname{%
\hyper@linkstart{link}{#4}{\if@rl\beginR\fi#2\if@rl\endR\fi}\hyper@linkend
}{#3}%
\or % page
\csname l@#1\endcsname{{#2}}{%
\hyper@linkstart{link}{#4}{#3}\hyper@linkend
}%
\else % all
\csname l@#1\endcsname{%
\hyper@linkstart{link}{#4}{\if@rl\beginR\fi#2\if@rl\endR\fi}\hyper@linkend
}{%
\hyper@linkstart{link}{#4}{#3}\hyper@linkend
}%
\fi
\fi
}
\def\Hy@BeginAnnot#1{%
\ifmmode\else\beginL\fi%
\global\advance\c@Hy@AnnotLevel\@ne
\ifnum\c@Hy@AnnotLevel=\@ne
#1%
\fi
}
\def\Hy@EndAnnot{%
\ifnum\c@Hy@AnnotLevel=\@ne
\Hy@endcolorlink
\@pdfm@mark{eann}%
\fi
\global\advance\c@Hy@AnnotLevel\m@ne
\ifmmode\else\endL\fi%
}
\def\Hy@StartlinkName#1#2{%
\beginL\hbox\bgroup
\pdfstartlink attr{#1}goto name{#2}\relax
}
\def\close@pdflink{%
\Hy@endcolorlink
\Hy@VerboseLinkStop
\pdfendlink
\egroup\endL
}
\def\hyper@link#1#2#3{%
\hyper@linkstart{#1}{#2}\ifmmode\else\if@rl\beginR\fi\fi#3\ifmmode\else\if@rl\endR\fi\fi\Hy@xspace@end\hyper@linkend
}
\def\hyper@linkfile#1#2#3{%
\leavevmode
\Hy@BeginAnnot{%
\def\Hy@pstringF{#2}%
\Hy@CleanupFile\Hy@pstringF
\Hy@pstringdef\Hy@pstringF\Hy@pstringF
\Hy@pstringdef\Hy@pstringD{#3}%
\Hy@MakeRemoteAction
\@pdfm@mark{%
bann<<%
/Type/Annot%
/Subtype/Link%
\ifHy@pdfa /F 4\fi
\Hy@setpdfborder
\ifx\@filebordercolor\relax
\else
/C[\@filebordercolor]%
\fi
/A<<%
/S/GoToR%
/F(\Hy@pstringF)%
/D%
\ifx\\#3\\%
[\Hy@href@page\@pdfremotestartview]%
\else
(\Hy@pstringD)%
\fi
\Hy@SetNewWindow
\Hy@href@nextactionraw
>>%
>>%
}%
\Hy@colorlink\@filecolor
}%
\ifmmode\else\if@rl\beginR\fi\fi#1\ifmmode\else\if@rl\endR\fi\fi\Hy@xspace@end
\Hy@EndAnnot
}
\def\@hyper@launch run:#1\\#2#3{% filename, anchor text linkname
\leavevmode
\Hy@BeginAnnot{%
\Hy@pstringdef\Hy@pstringF{#1}%
\Hy@pstringdef\Hy@pstringP{#3}%
\@pdfm@mark{%
bann<<%
/Type/Annot%
/Subtype/Link%
\ifHy@pdfa /F 4\fi
\Hy@setpdfborder
\ifx\@runbordercolor\relax
\else
/C[\@runbordercolor]%
\fi
/A<<%
/F(\Hy@pstringF)%
/S/Launch%
\Hy@SetNewWindow
\ifx\\#3\\%
\else
/Win<
>%
\fi
\Hy@href@nextactionraw
>>%
>>%
}%
\Hy@colorlink\@runcolor
}%
\ifmmode\else\if@rl\beginR\fi\fi#2\ifmmode\else\if@rl\endR\fi\fi\Hy@xspace@end
\Hy@EndAnnot
}
\def\hyper@linkurl#1#2{%
\leavevmode
\Hy@BeginAnnot{%
\Hy@pstringdef\Hy@pstringURI{#2}%
\@pdfm@mark{%
bann<<%
/Type/Annot%
/Subtype/Link%
\ifHy@pdfa /F 4\fi
\Hy@setpdfborder
\ifx\@urlbordercolor\relax
\else
/C[\@urlbordercolor]%
\fi
/A<<%
/S/URI%
/URI(\Hy@pstringURI)%
\ifHy@href@ismap
/IsMap true%
\fi
\Hy@href@nextactionraw
>>%
>>%
}%
\Hy@colorlink\@urlcolor
}%
\ifmmode\else\if@rl\beginR\fi\fi#1\ifmmode\else\if@rl\endR\fi\fi\Hy@xspace@end
\Hy@EndAnnot
}
\def\Acrobatmenu#1#2{%
\Hy@Acrobatmenu{#1}{#2}{%
\Hy@BeginAnnot{%
\EdefEscapeName\Hy@temp@menu{#1}%
\@pdfm@mark{%
bann<<%
/Type/Annot%
/Subtype/Link%
\ifHy@pdfa /F 4\fi
\Hy@setpdfborder
\ifx\@menubordercolor\relax
\else
/C[\@menubordercolor]%
\fi
/A<<%
/S/Named%
/N/\Hy@temp@menu
\Hy@href@nextactionraw
>>%
>>%
}%
\Hy@colorlink\@menucolor
}%
\ifmmode\else\if@rl\beginR\fi\fi#2\ifmmode\else\if@rl\endR\fi\fi\Hy@xspace@end
\Hy@EndAnnot
}%
}
\def\hyper@natlinkstart#1{%
\Hy@backout{#1}%
\hyper@linkstart{cite}{cite.#1}\if@rl\beginR\fi%
\def\hyper@nat@current{#1}%
}
\def\hyper@natlinkend{%
\if@rl\endR\fi\hyper@linkend
}
\def\hyper@natlinkbreak#1#2{%
\if@rl\endR\fi\hyper@linkend#1\hyper@linkstart{cite}{cite.#2}\if@rl\beginR\fi%
}}%
\pdfstringdefDisableCommands{%
\let\LRE\@firstofone
\let\LR\@firstofone
\let\RLE\@firstofone
\let\RL\@firstofone
\let\L\@firstofone
\let\R\@firstofone}}
% \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}{\RLE{#1}}}%
\else\write\@auxout{\string\bibcite{#2}{\LRE{#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 \RLE{#1}\protect\else \LRE{#2}\protect\fi]{%
\if@rl\RLE{#1}\protect\\ \LRE{#2}
\else\LRE{#2}\protect\\ \RLE{#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%
}
%
% \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, |misha@iop.tartu.ew.su|\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\\
% &&&&(haran@math.tau.ac.il)
% \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%pictel@uunet.uu.net|.
%
% The 4\textsuperscript{th} distribution (July 1989) of hdate/hcal
% (Hebrew calendar programs similar to UNIX date/cal) by Mr. Amos
% Shapir, |amos@shum.huji.ac.il|, 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}|}\else\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}}
%
% \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}
%
% \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}
%
% \end{macrocode}
%
% \begin{macrocode}
%<*newcode>
\@obsoletefile{hebrew.sty}{hebrew_newcode.sty}
\RequirePackage[8859-8]{inputenc}
%
%<*pccode>
\@obsoletefile{hebrew.sty}{hebrew_p.sty}
\RequirePackage[cp862]{inputenc}
%
%<*oldcode>
\@obsoletefile{hebrew.sty}{hebrew_oldcode.sty}
\RequirePackage[si960]{inputenc}
%
% \end{macrocode}
%
% \begin{macrocode}
%<*newcode|pccode|oldcode>
\RequirePackage[english,hebrew]{babel}
%
% \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