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