summaryrefslogtreecommitdiff
path: root/macros/latex209/contrib/misc/semitic.sty
blob: eef6f2c527885b9133dac757a288b49357f9b8c4 (plain)
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%%%%%%%%%%%%%%%%%%%%%%%%%%%%%