1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
|
%%%%%%%%%%%%%%%%%%%%%%%%%%Cut with a sharp axe here%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% This is a very simple LaTeX substyle to set Semitic languages. It is a very
% much a hacked HEBREW.TeX distributed with the Hebrew fonts.
% Graeme McKinstry,
% Computing Services Centre,
% University of Otago,
% Dunedin,
% New Zealand.
% E-mail: graeme%otago.ac.nz@relay.cs.net
%
% The fonts were designed by Jacques Goldberg:
% E-mail: phr00jg@technion.bitnet (watch for ZEROES in phr00jg)
% S-mail: Prof. Jacques Goldberg, Department of Physics
% TECHNION, 32000 Haifa, Israel.
% Emergency phone: (972)4-293663
%
% WHAT IT DOES:
% * Reverses order of letters in words.
% * Reverses order of words on a line (sets right-to-left).
%
% Use it as follows:
% \documentstyle[semitic,...]{...}
% .
% .
% .
% Normal text here
% \begin{semitic}
% Hebrew text in `natural direction'. Type Hebrew paragraph as
% you would any `normal' paragraph in a LaTeX document.
% \end{semitic}
% More text ...
% .
% .
% .
%
% NOTES:
% * There is now no need to put only 1 hebrew word on a line. Treat the
% Hebrew text as `normal' text.
% * There can be no space between `\end' and `{semitic}' in
% `\end{semitic}' (similar to the verbatim environment).
% * To keep something together enclose it in braces, e.g., {text together}
% This will stop it being broken over a line but the contents
% will still be reversed. If more than 1 word then place a ~ between
% words to maintain space.
% * To keep something together and to STOP IT BEING REVERSED enclose it
% in 2 sets of braces, e.g.,
% {{$\sin(\theta + \frac{\pi}{2}) = \cos \theta$}}
% * The text is processed in LR mode and then formed into lines. Anything
% that starts a new paragraph, e.g., displayed maths, will cause problems.
% This also mean that no blank lines can appear in the environment.
% * A new paragraph is started before and after the semitic environment.
\font\ivrit=redis10
\hyphenchar\ivrit=-1
\font\hebbf=redisbx10
\hyphenchar\hebbf=-1
\font\hebsl=rediss10
\hyphenchar\hebsl=-1
% The two lines below are taken from D. Knuth and P. MacKay
% TuGBoat vol.8,#1,page 14.
% Use \hebrew{hebrew~text} for short hebrew passages.
\gdef\hebrew#1\relax{{\ivrit\reflect#1\empty\tcelfer}}
\gdef\reflect#1#2\tcelfer{\ifx#1\empty\else\reflect#2\tcelfer#1\fi}
\def\ivrconcat#1#2{#1 #2}
\newbox\ivrbox % The Semitic box to test full line condition
\newbox\ivrstrbox % The box to hold the current Semitic string
\setbox\ivrbox=\hbox{}
\setbox\ivrstrbox=\hbox{}
\def\@esemitic{\end{semitic}} % Used for checking end of environment
\def\semitic{\par\ivrit\let\bf=\hebbf\let\sl=\hebsl
\parindent=0pt\@makesemiticline}
\def\endsemitic{\par}
% \@makesemitic line reads in a word at a time (a word is taken as text
% terminated by 1 or more spaces).
% It will then take this word and reverse it (using \reflect) and add it
% to the FRONT of the line being made. If this word makes the line too
% long (> \linewidth) then the line is broken before this word and this
% word is added to the next line.
\def\@makesemiticline#1 {\def\@word{#1}\relax
\ifx\@word\empty % removes CR
\let\next=\@makesemiticline
\else
\ifx\@esemitic\@word % i.e., read in \end{semitic}
\let\next=\@esemitic % will finish off semitic environment
\hbox to\hsize{\hfil \unhbox\ivrstrbox \unskip}
\else % semitic word
\ifdim\wd\ivrstrbox=0pt % i.e., contains nothing therefore
% at beginning of line
\setbox\ivrbox=\hbox{\reflect#1\empty\tcelfer}
\else % add reversed word to FRONT of line.
\setbox\ivrbox=\hbox{\ivrconcat{\reflect#1\empty\tcelfer
}{ \unhcopy\ivrstrbox}}
\fi
\let\next=\@makesemiticline % will loop around yet again
\ifdim \linewidth < \wd\ivrbox % line now too long
\hbox to\linewidth{\hss % remove \hss to justify
\unhcopy\ivrstrbox}
\setbox\ivrstrbox=\hbox{\reflect#1\empty\tcelfer}
\else % set store string to whole line
\setbox\ivrstrbox=\hbox{\unhcopy\ivrbox}\relax
\fi
\fi
\fi\next}
%%%%%%%%%%%%%%%%%%%%%%%%%%Cut with a sharp axe here%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|