Aleph Guide

Unofficial ConTeXt Wiki mirror

Last modified: 2022-07-02

(with apologies to Maimonides)

by Prof. Idris Samawi Hamid

Introduction

Aleph is a typesetting engine derived from Omega and eTeX. Reasons for Aleph:

  1. ConTeXt depends on the eTeX extensions, and even LaTeX now defaults to pdfeTeX.
  2. Omega provides a nice foundation for multilingual typesetting with large (>256) character sets, including large virtual fonts, but a stable, dependable version has not been a priority with its developers.
    1. In particular, the RL-LR code works excellently for the most part (minor bugs, easy to work around).
    2. Omega 1.15 was the last relatively stable bugfix version, as far as usability is concerned.
  3. Some users need a dependable LR-RL TeX engine now .

Aleph weds Omega 1.15 and eTeX 201, removes some extraneous stuff, and fixes a few bugs. I use it for production purposes. It uses dvipdfmx for pdf production, and can take advantage of most of ConTeXt's capabilities. Giuseppe Bilotta has done virtually all of the development work.

In addition to large character sets, Aleph inherits the filter sequence mechanism for script processing (extension ocp, compile from text-editable otp). So you can script whatever input encoding you like to whatever output font encoding you like. It is mechanism powerful enough to do contextual analysis of Arabic script for example, but not powerful enough for things like vertical glyph positioning for cursive scripts and the like.

Aleph, inheriting from Omega, provides many ready-to-go filters, using a Times Roman like font for Latin, Greek, and Cyrillic scripts. The ConTeXt module for this setup is called Gamma (m-gamma.tex); this is a port of the Lambda (i.e., LaTeX) style files to ConTeXt. The font typescript is called type-omg.

Installing

This install is based on the stand-alone ConTeXt for Win32 package.

Users of MiKTeX and other OS's will need to adjust the following instructions to their own setups.

How recent, you ask? Just be safe and get the latest :-)

 extra_mem_bot.context    = 2000000

otherwise Aleph will crash under some conditions, like overfull boxes and the like...
The XeTeX developer found the source to this bug, and a fix; hopefully Giuseppe will get to it :-))

This makes r-l numeral labels with separators easier to handle. Always use something like $<numeral>$ or ${\tf <numeral>}$ for mathematics and decimal points. $<numeral>$ uses the default math font; ${\tf <numeral>}$ uses the digits from the main text font.

 %tex=aleph output=dvipdfmx

at the beginning of every Aleph file.

omarb.tex

% tex=aleph output=dvipdfmx
\usemodule[gamma]
\input type-omg.tex % perhaps \usetypescriptfile[type-omg] ?

\setupbodyfont[omlgc,12pt]

\starttext

\startlatin

This is a test

\bf This is a test

\stoplatin

\startgreek

A B G D a b g d

{\bf A B G D a b g d}

\stopgreek

\startarab

`rby:

A b t th j H kh

{\bf \ A b t th j H kh}

fArsy:

A b p t th j ch H kh

{\bf A b p t th j ch H kh}

\starturdu

ArdU:

A b p t 't th j ch H kh

{\bf A b p t 't th j ch H kh}

\stopurdu

\blank

\tfc

`rby:

bsm ALLah Al-rrHmn Al-rrHym

fArsy:

bh nAm khdAwnd b-kh-sh-nde mhrbAn

\starturdu

\tfc

ArdU:

ALLah kE nAm sE jw rHmAn w rHym hE

\stopurdu

\stoparab

\stoptext

m-arabic-enc.tex

% tex=aleph output=dvipdfmx
%\usemodule[gamma]
\usetypescriptfile[type-omg]
\usetypescript[OmegaArab]

\hoffset=0pt

%% Individual Filters

% Input filters (from what you type)

\definefiltersynonym [UTF8]      [inutf8]
\definefiltersynonym [ISO8859-6] [in88596]
\definefiltersynonym [CP1256]    [incp1256]

% Contextual filter

\definefiltersynonym [UniCUni]            [uni2cuni]

% Output filters (font mapping)

\definefiltersynonym [CUniArab]           [cuni2oar]

%% Filter Sequences

\definefiltersequence
  [UTFArabic]
  [UTF8,UniCUni,CUniArab]

\definefiltersequence
  [ISOArabic]
  [ISO8859-6,UniCUni,CUniArab]

\definefiltersequence
  [WINArabic]
  [CP1256,UniCUni,CUniArab]

% For inner paragraph control within an LR paragraph

\definestartstop
  [arabictextutf]
  [commands=%
    {\textdir TRT%
    \switchtobodyfont[omarb]%
    \usefiltersequence[UTFArabic]}]

\definestartstop
  [arabictextiso]
  [commands=%
    {\textdir TRT%
    \switchtobodyfont[omarb]%
    \usefiltersequence[ISOArabic]}]

\definestartstop
  [arabictextwin]
  [commands=%
    {\textdir TRT%
    \switchtobodyfont[omarb]%
    \usefiltersequence[WINArabic]}]

\def\ArabicTextUTF#1{\startarabictextutf#1\stoparabictextutf}

\def\ArabicTextISO#1{\startarabictextiso#1\stoparabictextiso}

\def\ArabicTextWIN#1{\startarabictextwin#1\stoparabictextwin}

% For global Arabic script

\def\ArabicDirGlobal{%
\pagedir TRT\bodydir TRT\textdir TRT\pardir TRT %
\hoffset=-8.88cm} % compensate for a bug in \bodydir TRT

\def\ArabicUTF{\ArabicDirGlobal\usefiltersequence[UTFArabic]
                \switchtobodyfont[omarb]}

\def\ArabicISO{\ArabicDirGlobal\usefiltersequence[ISOArabic]
                \switchtobodyfont[omarb]}

\def\ArabicWIN{\ArabicDirGlobal\usefiltersequence[WINArabic]
                \switchtobodyfont[omarb]}

% For separate Arabic-script paragraphs

\def\ArabicDirPar{\textdir TRT\pardir TRT}

\definestartstop
  [arabutf]
  [commands=%
    {\usefiltersequence[UTFArabic]
     \switchtobodyfont[omarb]%
     \ArabicDirPar}]

\definestartstop
  [arabiso]
  [commands=%
    {\usefiltersequence[ISOArabic]
     \switchtobodyfont[omarb]%
     \ArabicDirPar}]

\definestartstop
  [arabwin]
  [commands=%
    {\usefiltersequence[WINArabic]
     \switchtobodyfont[omarb]%
     \ArabicDirPar}]

\showframe[text]

\starttext

\startarabutf

اللَّهُمَّ صَلِّ عَلَى مُحَمَّدٍ وَ
آلِ مُحَمَّدٍ وَ ارْزُقْنِي
الْيَقِينَ وَ حُسْنَ الظَّنِّ بِكَ
وَ أَثْبِتْ رَجَاءَكَ فِي قَلْبِي
وَ اقْطَعْ رَجَائِي عَمَّنْ سِوَاكَ
حَتَّى لَا أَرْجُوَ غَيْرَكَ وَ لَا
أَثِقَ إِلَّا بِك‏

\stoparabutf

\blank

\startarabiso

Çääñîçïåñî Õîäñð Ùîäîé åïÍîåñîÏí èî Âäð åïÍîåñîÏí èî ÇÑòÒïâòæðê
Çäòêîâðêæî èî ÍïÓòæî ÇäØñîæñð Èðãî èî ÃîËòÈðÊò ÑîÌîÇÁîãî áðê
âîäòÈðê èî Çâò×îÙò ÑîÌîÇÆðê Ùîåñîæò ÓðèîÇãî ÍîÊñîé äîÇ ÃîÑòÌïèî
ÚîêòÑîãî èî äîÇ ÃîËðâî ÅðäñîÇ Èðã

\stoparabiso

\blank

\startarabwin

Çááøóåõãøó Õóáøö Úóáóì ãõÍóãøóÏò æó Âáö ãõÍóãøóÏò æó ÇÑúÒõÞúäöí
ÇáúíóÞöíäó æó ÍõÓúäó ÇáÙøóäøö Èößó æó ÃóËúÈöÊú ÑóÌóÇÁóßó Ýöí
ÞóáúÈöí æó ÇÞúØóÚú ÑóÌóÇÆöí Úóãøóäú ÓöæóÇßó ÍóÊøóì áóÇ ÃóÑúÌõæó
ÛóíúÑóßó æó áóÇ ÃóËöÞó ÅöáøóÇ Èößþ

\stoparabwin

\blank

Here is some mixed {\em Arabic-} (\ArabicTextUTF{عربي}) and
Latin-script. As you can see, Aleph does a very good job mixing
{\em LR} (\ArabicTextUTF{يسار-يمين}) and {\em RL}
(\ArabicTextUTF{يمين-يسار}) texts. \ArabicTextUTF{و
هنا جملة منقطعة في وسط قرينة
لاتينية}. Aleph even does a great job breaking Arabic
phrases across lines.

\stoptext

Going beyond

The last example shows how to make and apply your own filter sequences beyond the basic Gamma module. To go further you need to learn some low-level business. You will also need some File:Utilities-aleph.zip. I have put together a windows package that you can unzip to C:\ConTeXt. These utilities do work, but they are cobbled together from old fpTeX and MiKTeX versions.

Example: If you want to get the final Persian kaaf instead of the default Arabic one

Check to see if your glyph is in the Arabic font. The Arabic font is made of 6 raw fonts: 3 regular and three bold:

 texmf-local/fonts/type1/public/omega
 omsea1, omsea1b, ... omsea3b

Using a font viewer or editor you will find the Persian final kaaf in omsea2, named kafswashfin.

Now go to texmf-local/omega/lambda/misc and open omarab.cfg you will find a line

 04AA N kafswashfin

This means that the 044A is the virtual font position for kafswashfin. Open cuni2oar.otp and add the following at line 263:

 %@"E343 => @"04AA;

Following this line you should see

 % remaining Arabic glyphs
 @"E000-@"E3FF => #(\1 - @"DF00);

Basically, in uni2cuni.otp final-kaaf gets mapped to E343. In the font, we want it mapped to kafswashfin, so we did that. Now recompile the otp:

 otp2ocp cuni2oar

Now you will get kafswashfin for the final kaaf.

Want new fonts (Arabic or Latin)? Here are the instructions

How to cook omarab.ovf

Ingredients: omarab.cfg, omseco.afm, omsea1.afm, omsea2.afm, omsea3.afm

 > perl makeovp.pl omarab.cfg omseco.afm omsea1.afm omsea2.afm omsea3.afm omarab.ovp
 > pltotf omseco.pl omseco.tfm
 > pltotf omsea1.pl omsea1.tfm
 > pltotf omsea2.pl omsea2.tfm
 > pltotf omsea3.pl omsea3.tfm
 > ovp2ovf omarab.ovp omarab.ovf omarab.ofm

If the last line does not work, try

 > ovp2ovf omarab.ovp omarab.ovf omarab.tfm

rename omarab.tfm to omarab.ofm --> ofm directory

How to distill omarab.ovp from omarab.ovf:

Use a different directory or a different name for the output ovp so that omarab.ovp created above is not overwritten.

get omarab.ofm & rename to omarab.tfm

 > ovf2ovp omarab.ovf omarab.tfm omarab.ovp

How to cook omarabb.ovf

Ingredients: omarab.cfg, omsecob.afm, omsea1b.afm, omsea2b.afm, omsea3b.afm

 > perl makeovp.pl omarab.cfg omsecob.afm omsea1b.afm omsea2b.afm omsea3b.afm omarabb.ovp
 > pltotf omsecob.pl omsecob.tfm
 > pltotf omsea1b.pl omsea1b.tfm
 > pltotf omsea2b.pl omsea2b.tfm
 > pltotf omsea3b.pl omsea3b.tfm
 > ovp2ovf omarabb.ovp omarabb.ovf omarabb.ofm


If the last line does not work, try

 > ovp2ovf omarabb.ovp omarabb.ovf omarabb.tfm

rename omarab.tfm to omarab.ofm --> ofm directory

How to distill omarabb.ovp from omarabb.ovf

Use a different directory or a different name for the output ovp so that omarabb.ovp created above is not overwritten

get omarab.ofm & rename to omarab.tfm

 > ovf2ovp omarabb.ovf omarabb.tfm omarabb.ovp

See also tsukuba-arabic

Miscellaneous

To the future