The Linux Thai HOWTO


Poonlap Veeratanabutr, poon-v@fedu.uec.ac.jp

v0.4, 4 August 1998
-------------------------------------------------------------------------------
This document describes how to use Thai language with Linux. This will cover
setting Thai fonts, Thai keyboard and some Thai applications.
-------------------------------------------------------------------------------

1. Introduction

It's about one year that I didn't update this document. There were a lot of
movement in Thai computing and using Linux in Thailand. For example, Linux
boxes are used as server in many schools_in_Thailand.
The purpose of this document is to show how to set your Linux to use Thai
language. I use Linux RedHat 5.0 as I wrote this document, so directories which
I mention in this document may be different from other distribution.
First I would like to talk about Thai standard character set. Thai standard
character set is TIS-620. There are also other Thai standard character sets
such as ISO-IR-166, CP874, etc. Please see http://www.inet.co.th/cyberclub/
trin/thairef/ for further information about Thai standard character set. TIS-
620 is 8-bit character set. It has the same range as ISO-8859-1, so we can use
apllications that support ISO-8859-1 character set also. Although we can use
Thai language with apllications that support ISO-8859-1 character set, but it
does not mean those applications support Thai language.
Thai characters are different from English characters. There is a variation of
position, normal position, character can be on other character, character can
be under other character. There is no space between words. These are some
problems in developing Thai supported application.
You can find the lastest version of Thai-HOWTO document from http://
www.fedu.uec.ac.jp/ZzzThai/Linux. Your comment is welcome.

2. Thai Input and Output


 2.1 Linux console

Thai characters do not display properly in Linux console. If you mainly use X
window, you may pass this section.

Thai fonts

You can obtain Linux Thai console fonts which created by Mr. Phaisarn
Techajaruwong from ZzzThai_ftp_site
For example, there is a font name "phaisarn.psf". Put it in /usr/lib/kbd/
consolefonts/ directory. Then, you can load the new font from Linux console by
command


       %setfont phaisarn.psf



Keyboard layout

You can set keyboard behavior as you like by using loadkeys command. Usually,
you use loadkeys to load the file located in /usr/lib/kbd/keytables. You can
create a US/Thai keyboard-map file and save it in this directory. Here is a
sample.


       keycode   0 =
       keycode   1 = Escape           Escape
               alt     keycode   1 = Meta_Escape
       keycode   2 = +one              exclam          +0x0e5
       plus
               alt     keycode   2 = Meta_one
               alt shift keycode 2 = Meta_exclam
       keycode   3 = +two              at              +slash
       0x0f1
               control keycode   3 = nul
               control shift keycode 3 = nul
               alt     keycode   3 = Meta_two
               alt shift keycode 3 = Meta_at
       keycode   4 = +three            numbersign      +underscore
       0x0f2
               control keycode   4 = Escape
               alt     keycode   4 = Meta_three
               alt shift keycode 4 = Meta_numbersign
       keycode   5 = +four             dollar          +0x0c0
       0x0f3
               control keycode   5 = Control_backslash
               alt     keycode   5 = Meta_four
               alt shift keycode 5 = Meta_dollar
       keycode   6 = +five             percent         +0x0b6
       0x0f4
               control keycode   6 = Control_bracketright
               alt     keycode   6 = Meta_five
               alt shift keycode 6 = Meta_percent
       keycode   7 = +six              asciicircum     +0x0d8
       0x0d9
               control keycode   7 = Control_asciicircum
               alt     keycode   7 = Meta_six
               alt shift keycode 7 = Meta_asciicircum
       keycode   8 = +seven            ampersand       +0x0d6
       0x0df
               control keycode   8 = Control_underscore
               alt     keycode   8 = Meta_seven
       keycode   9 = +eight            asterisk        +0x0a4
       0x0f5
               control keycode   9 = Delete
               alt     keycode   9 = Meta_eight
       keycode  10 = +nine             parenleft       +0x0b5
       0x0d6
               alt     keycode  10 = Meta_nine
       keycode  11 = +zero             parenright      +0x0a8
       0x0f7
               alt     keycode  11 = Meta_zero
       keycode  12 = +minus            underscore      +0x0a2
       0x0f8
               control keycode  12 = Control_underscore
               control shift keycode 12 = Control_underscore
               alt     keycode  12 = Meta_minus
       keycode  13 = +equal            plus            +0x0aa
       0x0f9
               alt     keycode  13 = Meta_equal
       keycode  14 = Delete           Delete           Delete
       Delete
               alt     keycode  14 = Meta_Delete
       keycode  15 = Tab              Tab              Tab             Tab
               alt     keycode  15 = Meta_Tab
       keycode  16 = +q        Q       +0x0e6          0x0f0
       keycode  17 = +w        W       +0x0e4          quotedbl
       keycode  18 = +e        E       +0x0d3          0x0ae
       keycode  19 = +r        R       +0x0be          0x0b1
       keycode  20 = +t        T       +0x0d0          0x0b8
       keycode  21 = +y        Y       +0x0d1          0x0ed
       keycode  22 = +u        U       +0x0d5          0x0ea
       keycode  23 = +i        I       +0x0c3          0x0b3
       keycode  24 = +o        O       +0x0b9          0x0cf
       keycode  25 = +p        P       +0x0c2          0x0ad
       keycode  26 = +bracketleft      braceleft       +0x0ba
       0x0b0
               control keycode  26 = Escape
               alt     keycode  26 = Meta_bracketleft
               alt shift keycode 26 = Meta_braceleft
       keycode  27 = +bracketright     braceright      +0x0c5
       comma
               control keycode  27 = Control_bracketright
               alt     keycode  27 = Meta_bracketright
               alt shift keycode 27 = Meta_braceright
       keycode  28 = Return            Return          Return
       Return
               alt     keycode  28 = 0x080d
       keycode  29 = Control           Control         Control
       Control
       keycode  30 = +a        A       +0x0bf          0x0c4
       keycode  31 = +s        S       +0x0cb          0x0a6
       keycode  32 = +d        D       +0x0a1          0x0af
       keycode  33 = +f        F       +0x0b4          0x0e2
       keycode  34 = +g        G       +0x0e0          0x0ac
       keycode  35 = +h        H       +0x0e9          0x0e7
       keycode  36 = +j        J       +0x0e8          0x0eb
       keycode  37 = +k        K       +0x0d2          0x0c9
       keycode  38 = +l        L       +0x0ca          0x0c8
       keycode  39 = +semicolon        colon           +0x0c7
       0x0ab
               alt     keycode  39 = Meta_semicolon
       keycode  40 = +apostrophe       quotedbl        +0x0a7
       period
               control keycode  40 = Control_g
               alt     keycode  40 = Meta_apostrophe
       keycode  41 = +grave            asciitilde      +minus
       percent
               control keycode  41 = nul
               alt     keycode  41 = Meta_grave
       keycode  42 = Shift            Shift            Shift
       Shift
       keycode  43 = +backslash        bar             +0x0a3
       0x0a5
               control keycode  43 = Control_backslash
               alt     keycode  43 = Meta_backslash
               alt shift keycode 43 = Meta_bar
       keycode  44 = +z        Z       +0x0bc          parenleft

       keycode  45 = +x        X       +0x0bb          parenright

       keycode  46 = +c        C       +0x0e1          0x0a9
       keycode  47 = +v        V       +0x0cd          0x0ce
       keycode  48 = +b        B       +0x0d4          0x0da
       keycode  49 = +n        N       +0x0d7          0x0ec
       keycode  50 = +m        M       +0x0b7          question

       keycode  51 = +comma    less    +0x0c1          0x0b2
               alt     keycode  51 = Meta_comma
               alt shift keycode 51 = Meta_less
       keycode  52 = +period           greater         +0x0e3
       0x0cc
               alt     keycode  52 = Meta_period
               alt shift keycode 52 = Meta_greater
       keycode  53 = +slash            question        +0x0bd
       0x0c6
               control keycode  53 = Delete
               alt     keycode  53 = Meta_slash
       keycode  54 = Shift            Shift            Shift
       Shift
       keycode  55 = KP_Multiply
       keycode  56 = Alt              Alt              Alt             Alt

       keycode  57 = space            space            space
       space
               control keycode  57 = nul
               alt     keycode  57 = Meta_space
       keycode  58 = Caps_Lock        Caps_Lock        Caps_Lock
       Caps_Lock
       keycode  59 = F1               F11              Console_13
               control keycode  59 = F1
               alt     keycode  59 = Console_1
               control alt     keycode  59 = Console_1
       keycode  60 = F2               F12              Console_14
               control keycode  60 = F2
               alt     keycode  60 = Console_2
               control alt     keycode  60 = Console_2
       keycode  61 = F3               F13              Console_15
               control keycode  61 = F3
               alt     keycode  61 = Console_3
               control alt     keycode  61 = Console_3
       keycode  62 = F4               F14              Console_16
               control keycode  62 = F4
               alt     keycode  62 = Console_4
               control alt     keycode  62 = Console_4
       keycode  63 = F5               F15              Console_17
               control keycode  63 = F5
               alt     keycode  63 = Console_5
               control alt     keycode  63 = Console_5
       keycode  64 = F6               F16              Console_18
               control keycode  64 = F6
               alt     keycode  64 = Console_6
               control alt     keycode  64 = Console_6
       keycode  65 = F7               F17              Console_19
               control keycode  65 = F7
               alt     keycode  65 = Console_7
               control alt     keycode  65 = Console_7
       keycode  66 = F8               F18              Console_20
               control keycode  66 = F8
               alt     keycode  66 = Console_8
               control alt     keycode  66 = Console_8
       keycode  67 = F9               F19              Console_21
               control keycode  67 = F9
               alt     keycode  67 = Console_9
               control alt     keycode  67 = Console_9
       keycode  68 = F10              F20              Console_22
               control keycode  68 = F10
               alt     keycode  68 = Console_10
               control alt     keycode  68 = Console_10
       keycode  69 = Num_Lock
       keycode  70 = Scroll_Lock      Show_Memory      Show_Registers
               control keycode  70 = Show_State
               alt     keycode  70 = Scroll_Lock
       keycode  71 = KP_7
               alt     keycode  71 = Ascii_7
       keycode  72 = KP_8
               alt     keycode  72 = Ascii_8
       keycode  73 = KP_9
               alt     keycode  73 = Ascii_9
       keycode  74 = KP_Subtract
       keycode  75 = KP_4
               alt     keycode  75 = Ascii_4
       keycode  76 = KP_5
               alt     keycode  76 = Ascii_5
       keycode  77 = KP_6
               alt     keycode  77 = Ascii_6
       keycode  78 = KP_Add
       keycode  79 = KP_1
               alt     keycode  79 = Ascii_1
       keycode  80 = KP_2
               alt     keycode  80 = Ascii_2
       keycode  81 = KP_3
               alt     keycode  81 = Ascii_3
       keycode  82 = KP_0
               alt     keycode  82 = Ascii_0
       keycode  83 = KP_Period
               altgr   control keycode  83 = Boot
               control alt     keycode  83 = Boot
       keycode  84 = Last_Console
       keycode  85 =
       keycode  86 = less             greater          bar
               alt     keycode  86 = Meta_less
       keycode  87 = F11              F11              Console_23
               control keycode  87 = F11
               alt     keycode  87 = Console_11
               control alt     keycode  87 = Console_11
       keycode  88 = F12              F12              Console_24
               control keycode  88 = F12
               alt     keycode  88 = Console_12
               control alt     keycode  88 = Console_12
       keycode  89 =
       keycode  90 =
       keycode  91 =
       keycode  92 =
       keycode  93 =
       keycode  94 =
       keycode  95 =
       keycode  96 = KP_Enter
       keycode  97 = Control
       keycode  98 = KP_Divide
       keycode  99 = Control_backslash
               control keycode  99 = Control_backslash
               alt     keycode  99 = Control_backslash
       keycode 100 = AltGr_Lock
       keycode 101 = Break
       keycode 102 = Find
       keycode 103 = Up
       keycode 104 = Prior
               shift   keycode 104 = Scroll_Backward
       keycode 105 = Left
               alt     keycode 105 = Decr_Console
       keycode 106 = Right
               alt     keycode 106 = Incr_Console
       keycode 107 = Select
       keycode 108 = Down
       keycode 109 = Next
               shift   keycode 109 = Scroll_Forward
       keycode 110 = Insert
       keycode 111 = Remove
               altgr   control keycode 111 = Boot
               control alt     keycode 111 = Boot
       keycode 112 =
       keycode 113 =
       keycode 114 =
       keycode 115 =
       keycode 116 =
       keycode 117 =
       keycode 118 =
       keycode 119 =
       keycode 120 =
       keycode 121 =
       keycode 122 =
       keycode 123 =
       keycode 124 =
       keycode 125 =
       keycode 126 =
       keycode 127 =
       string F1 = "\033[[A"
       string F2 = "\033[[B"
       string F3 = "\033[[C"
       string F4 = "\033[[D"
       string F5 = "\033[[E"
       string F6 = "\033[17~"
       string F7 = "\033[18~"
       string F8 = "\033[19~"
       string F9 = "\033[20~"
       string F10 = "\033[21~"
       string F11 = "\033[23~"
       string F12 = "\033[24~"
       string F13 = "\033[25~"
       string F14 = "\033[26~"
       string F15 = "\033[28~"
       string F16 = "\033[29~"
       string F17 = "\033[31~"
       string F18 = "\033[32~"
       string F19 = "\033[33~"
       string F20 = "\033[34~"
       string Find = "\033[1~"
       string Insert = "\033[2~"
       string Remove = "\033[3~"
       string Select = "\033[4~"
       string Prior = "\033[5~"
       string Next = "\033[6~"
       string F21 = ""
       string F22 = ""
       string F23 = ""
       string F24 = ""
       string F25 = ""
       string F26 = ""


Suppose you save this file as thai.map. From Linux console, use command
loadkeys to load thai.map.


       %loadkeys thai.map


You can switch to Thai keyboard by pressing the right Alt key. If you want to
switch the keyboard back, press the right Alt key again.

 2.2 X Window system


 Thai fonts

You can obtain Thai fonts in bdf format or pcf format from internet. You can
also use scalable fonts such as Type1 or TrueType fonts. But I will not
describe about these.

Installing Thai fonts

You must log in as root. Let's put Thai fonts in /usr/X11R6/lib/X11/fonts/
misc/, this is a default font path. Change directory to /usr/X11R6/lib/X11/
fonts/misc/ and run command


       %mkfontdir
       %xset fp rehash


If you put Thai fonts in different directory, you must use xset to add the new
font path. Please see man-page for further information. You can check the new
fonts by running command xlsfonts and see whether there are Thai fonts or not.
If you can not see any Thai fonts from this command, you may need to restart X
window.

Thai keyboard layout There are two ways to map Thai keyboard on X window, using
X Keyboard Extension (XKB) and using xmodmap. Please select how you map Thai
keyboard. I recommend using XKB.


XKB and Thai keyboard layout.

Beginning with XFree86 3.1.2D, you can use the new X11R6.1 XKEYBOARD extension
to manage the keyboard layout. This is very helpful.
During X server configuration with xf86config you will be asked about XKB, if
you want to to set Thai keyboard layout for your system, say yes. There are a
list of pre-configured keymaps. Choose Standard 101-key, Thai encoding.
XF86Setup is the graphical X server configuration utility for XFree86 X server.
It is easier than traditional xf86config. You can select a keyboard layout
easily with this tool.
Ther are many choices of keyboard switch key to select. The default is
LeftAlt+RightShift switch to Thai and LeftAlt+LeftShift switch to US. You can
type Thai characters in any applications which support ISO-8859-1 character
set, but don't forget to use Thai fonts with those applications too.
I found that pre-configured keymaps that came with XFree86-3.2 is not correct.
You may not be able to type THO THUNG which located at " 5 key " . To fix this
problem, you should add the line


           key <AE05> {     [], [   paragraph,      ocircumflex     ]
       };


in the file /usr/X11R6/lib/X11/xkb/symbols/th as the example.


       .................
           key <AE03> {        [], [       minus,      ograve          ]
       };
           key <AE04> {        [], [      Agrave,      oacute          ]
       };
           key <AE05> {     [], [   paragraph,      ocircumflex     ]
       };
           key <AE06> {        [], [    Ooblique,      Ugrave          ]
       };
           key <AE07> {        [], [  Odiaeresis,      ssharp          ]
       };
       .................


You can not type SORUSI also. Please change the line from


           key <AC08> {        [], [      Ograve,      eacute          ]
       };


to


           key <AC08> {        [], [      Ograve,      Eacute          ]
       };


Note that eacute is equal to MAITHO and Eacute is equal to SORUSI.
There are also XKB extension utilities such as setxkbmap, xkbcomp, etc. Please
see man-page for more information. I recommend to use xkbvled. The leds will be
on when you are using Thai keyboard so you can know your keyboard's status.
The following is part of XF86Config file about keyboard section. If you want to
configure the keyboard by hand, change the content of /usr/X11R6/lib/X11/
XF86Config as an example below. This configuration uses the default toggle key.


       Section "Keyboard"
          Protocol        "Standard"
          AutoRepeat      500 5
          LeftAlt         Meta
          RightAlt        Meta
          ScrollLock      Compose
          RightCtl        Control
       #  XkbDisable
          XkbKeycodes     "xfree86"
          XkbTypes        "default"
          XkbCompat       "default"
          XkbSymbols      "us(pc101)"
          XkbGeometry     "pc"
          XkbRules        "xfree86"
          XkbModel        "pc101"
          XkbLayout       "th"
       EndSection


If you use XKB extension, Thai keyboard mapping with xmodmap may not work. See
XF86Config man-page for mor information.

Thai keyboard layout with xmodmap

You can use the utility xmodmap to map Thai keyboard. Normally xmodmap is used
to load a keyboard configured file. For most Linux distributions, when you
start X window with startx, X server will find .Xmodmap in /usr/X11R6/lib/X11/
xinit/ first. If .Xmodmap does not exist, X server will find .Xmodmap in your
home directory. Please see the content of /usr/X11R6/lib/X11/xinit/xinitrc.
The following is the sample of .Xmodmap for Thai Kedmanee keyboard layout.


       !
       ! Linux/XFree86 Thai Kedmanee layout (based on US keyboard)
       ! Use ScrollLock to switch to Thai keyboard.
       ! This file will work with XFree86 only.
       !

       keycode 0x09 =  Escape
       keycode 0x43 =  F1
       keycode 0x44 =  F2
       keycode 0x45 =  F3
       keycode 0x46 =  F4
       keycode 0x47 =  F5
       keycode 0x48 =  F6
       keycode 0x49 =  F7
       keycode 0x4A =  F8
       keycode 0x4B =  F9
       keycode 0x4C =  F10
       keycode 0x5F =  F11
       keycode 0x60 =  F12
       keycode 0x6F =  Print
       keycode 0x4E =  Mode_switch     XF86ModeLock
       keycode 0x6E =  Pause
       keycode 0x31 =  grave           asciitilde      minus
       percent
       keycode 0x0A =  1               exclam          0x0e5
       plus
       keycode 0x0B =  2               at              slash
       0x0f1
       keycode 0x0C =  3               numbersign      underscore
       0x0f2
       keycode 0x0D =  4               dollar          0x0c0
       0x0f3
       keycode 0x0E =  5               percent         0x0b6
       0x0f4
       keycode 0x0F =  6               asciicircum     0x0d8
       0x0d9
       keycode 0x10 =  7               ampersand       0x0d6
       0x0df
       keycode 0x11 =  8               asterisk        0x0a4
       0x0f5
       keycode 0x12 =  9               parenleft       0x0b5
       0x0f6
       keycode 0x13 =  0               parenright      0x0a8
       0x0f7
       keycode 0x14 =  minus           underscore      0x0a2
       0x0f8
       keycode 0x15 =  equal           plus            0x0aa
       0x0f9
       keycode 0x33 =  backslash       bar             0x0a3
       0x0a5
       keycode 0x16 =  BackSpace
       keycode 0x6A =  Insert
       keycode 0x61 =  Home
       keycode 0x63 =  Prior
       keycode 0x4D =  Num_Lock
       keycode 0x70 =  KP_Divide
       keycode 0x3F =  KP_Multiply
       keycode 0x52 =  KP_Subtract
       keycode 0x17 =  Tab
       keycode 0x18 =  q               Q               0x0e6
       0x0f0
       keycode 0x19 =  w               W               0x0e4
       quotedbl
       keycode 0x1A =  e               E               0x0d3
       0x0ae
       keycode 0x1B =  r               R               0x0be
       0x0b1
       keycode 0x1C =  t               T               0x0d0
       0x0b8
       keycode 0x1D =  y               Y               0x0d1
       0x0ed
       keycode 0x1E =  u               U               0x0d5
       0x0ea
       keycode 0x1F =  i               I               0x0c3
       0x0b3
       keycode 0x20 =  o               O               0x0b9
       0x0cf
       keycode 0x21 =  p               P               0x0c2
       0x0ad
       keycode 0x22 =  bracketleft     braceleft       0x0ba
       0x0b0
       keycode 0x23 =  bracketright    braceright      0x0c5
       comma
       keycode 0x24 =  Return
       keycode 0x6B =  Delete
       keycode 0x67 =  End
       keycode 0x69 =  Next
       keycode 0x4F =  KP_7
       keycode 0x50 =  KP_8
       keycode 0x51 =  KP_9
       keycode 0x56 =  KP_Add
       keycode 0x42 =  Caps_Lock
       keycode 0x26 =  a               A               0x0bf
       0x0c4
       keycode 0x27 =  s               S               0x0cb
       0c0a6
       keycode 0x28 =  d               D               0x0a1
       0x0af
       keycode 0x29 =  f               F               0x0b4
       0x0e2
       keycode 0x2A =  g               G               0x0e0
       0x0ac
       keycode 0x2B =  h               H               0x0e9
       0x0e7
       keycode 0x2C =  j               J               0x0e8
       0x0eb
       keycode 0x2D =  k               K               0x0d2
       0x0c9
       keycode 0x2E =  l               L               0x0ca
       0x0c8
       keycode 0x2F =  semicolon       colon           0x0c7
       0x0ab
       keycode 0x30 =  apostrophe      quotedbl        0x0a7
       period
       keycode 0x53 =  KP_4
       keycode 0x54 =  KP_5
       keycode 0x55 =  KP_6
       keycode 0x32 =  Shift_L
       keycode 0x34 =  z               Z               0x0bc
       parenleft
       keycode 0x35 =  x               X               0x0bb
       parenright
       keycode 0x36 =  c               C               0x0e1
       0x0a9
       keycode 0x37 =  v               V               0x0cd
       0x0ce
       keycode 0x38 =  b               B               0x0d4
       0x0da
       keycode 0x39 =  n               N               0x0d7
       0x0ec
       keycode 0x3A =  m               M               0x0b7
       question
       keycode 0x3B =  comma           less            0x0c1
       0x0b2
       keycode 0x3C =  period          greater         0x0e3
       0x0cc
       keycode 0x3D =  slash           question        0x0bd
       0x0c6
       keycode 0x3E =  Shift_R
       keycode 0x62 =  Up
       keycode 0x57 =  KP_1
       keycode 0x58 =  KP_2
       keycode 0x59 =  KP_3
       keycode 0x6C =  KP_Enter
       keycode 0x25 =  Control_L
       keycode 0x40 =  Alt_L           Meta_L
       keycode 0x41 =  space
       keycode 0x71 =  Alt_R           Meta_R
       keycode 0x6D =  Control_R
       keycode 0x64 =  Left
       keycode 0x68 =  Down
       keycode 0x66 =  Right
       keycode 0x5A =  KP_0
       keycode 0x5B =  KP_Decimal

       clear Shift
       clear Lock
       clear Control
       clear Mod1
       clear Mod2
       clear Mod3
       clear Mod4
       clear Mod5

       add    Shift   = Shift_L Shift_R
       add    Lock    = Caps_Lock
       add    Control = Control_L Control_R
       add    Mod1    = Alt_L Alt_R
       add    Mod2    = Mode_switch


Just put .Xmodmap in your home directory will be OK. When you start X window, X
server will load this file.
You can also load .Xmodmap from command line.


       %xmodmap ~/.Xmodmap


In above .Xmodmap file, US/Thai switch key is assigned to keycode 0x4E (78),
Scroll Lock key, with the statement

     ---------------------------------------------------------------------

       keycode 0x4E =  Mode_switch     XF86ModeLock

     ---------------------------------------------------------------------

XF86ModeLock is the special keysym for XFree86 X server. If you don't add this
keysym, you have to hold the scroll lock key while you are typing Thai
characters. Note that if you use commercial X server, some keycodes are
different. You may have to map keyboard by yourself. See man-pages of X and xev
for further information.
Note: If you are using XFree86 version 3.1.2D or later, you need to add the
line XkbDisable in keyboard section of XF86Config file. You may config the
keyboard section like the following sample.


       Section "Keyboard"
          Protocol        "Standard"
          AutoRepeat      500 5
          LeftAlt         Meta
          RightAlt        ModeShift
          ScrollLock      ModeLock
          RightCtl        Compose
          XkbDisable
       EndSection



3. Applications with Thai language

This is the tricky part. Most applications support ISO-8859-1 character set.
For example, emacs can display ISO-8859-1 character. If we set emacs to display
ISO-8859-1 and use Thai font, you can edit Thai document with emacs. But this
is not a good policy. You should avoid using this trick as possible. What we
need is Thai locale or Thai supported applications to manage these things.
To make X window application displays Thai font, you should run the application
with -fn option. For example,


       %xedit -fn thai8x16


Note that thai8x16 is just a one of Thai font names. You can see all available
fonts by command xlfonts. If you don't want to fill -fn option every time you
run application. You should set Thai font in your ~/.Xdefaults or ~/.Xresources
like this


       XTerm*font:     thai8x16



3.1 Some X applications and Thai language


txterm

txterm is Thai version of xterm. There are several programs running under xterm
such as shell, pine, vi, less, etc. We can type Thai characters without any
problems with txterm. Txterm also provides its own Thai input method by
pressing " F1 " key. Txterm will use fonts thai9x13 as default Thai font. You
can change this by add -fn option.
You can get txterm from Thaigate or ZzzThai.

Emacs, Mule

Mule stands for " Multilingual Enhancement to GNU Emacs " . It has the same
functions as emacs and supports many languages. Mule provides its own input
method, so you don't need any configuration for typing Thai. You needs only
Thai fonts for mule which you can get from, ZzzThai or Etl_site. These Thai
fonts are fixed width fonts.
You need some configuration for mule. Puts the following lines in your .emacs.


       ;;
       ;; Thai System, add in .emacs
       ;;
       (set-file-coding-system-for-read '*tis620*)
       (set-default-file-coding-system '*tis620*)
       (set-display-coding-system '*tis620*)
       (set-keyboard-coding-system '*tis620*)
       (setq-deafault quail-current-package (assoc "thai" quail-package-
       alist))


Add the following lines in .Xdefaults.


       !
       ! Emacs, Mule - Font menu
       !
       Emacs*FontSetList: thai14, thai16, thai24
       Emacs*FontSet-thai14:\
               -etl-fixed-medium-r-normal--14-140-72-72-m-70-tis620.2529-1
       Emacs*FontSet-thai16:\
               -etl-fixed-medium-r-normal--16-160-72-72-m-80-tis620.2529-1
       Emacs*FontSet-thai24:\
               -etl-fixed-medium-r-normal--24-500-72-72-m-120-tis620.2529-
       1


When you hold shift key and press left mouse's button, you can select Thai
fonts to display in mule window. To type Thai characters, press " Ctrl + ] " .
To type English, press " Ctrl + ] " again.
You can get mule from ElectroTechnical_Laboratory(ETL)

vi

Vi should be run on txterm.

pine

In the past, we could not send 8-bit characters through E-mail. Now, although
mail transfer agent can handle 8-bit characters but some old mail transfer
agent can not. We can send Thai e-mail by using e-mail application that
supports MIME (Multipurpose Internet Mail Extensions) E-mail applications that
support MIME are pine, elm, Netscape mail, etc.
Put the following definition in your ~/.pinerc file:


       character-set=ISO-8859-1


This can also be set via the Setup option in pine window. You can find it under
Config. You can read Thai news from pine, too.
Pine should be run in txterm.

Netscape

If you have Thai fonts in your system. Just set Thai font from preference. Thai
fonts will appear in User defined area. See http://www.fedu.uec.ac.jp/ZzzThai/
unix for setting Thai language on Netscape.
Some movement about Thai Mozilla project at http://members.xoom.com/inThai/
mozthai.html.

Ss, Simple thai word Separator

ss is a dictionary based Thai word separation program similar to cttex. It can
be used to insert a configurable string between Thai words. It can also show
words that cannot be found in the dictionary. More words can be added to the
dictionary. Developed by Mr.Teera Kittichareonpot.
We can use this program to insert < WBR > tag between Thai words in html file.
Browser will display Thai homepage better than normal html document.

Xzthai, X keyboard configurator + simple editor

Xzthai, this is the Tcl/Tk application for mapping Thai keyboard on any
keyboard with graphical user interface. Also provides simple editor and
keyboard layout figure. It actually uses xmodmap program in background to map
Thai keyboard. This may be useful for commercial X server and X server on UNIX.

3.2 Printing Thai document

Thai2ps is used to convert plain text file to postscript file.You can use
ghostscript(gs) to print your Thai document. For better quality document, you
have to use (La)TeX.

Latex and Thai language

Dr. Manop Wongsaisuwan first tried to use Thai language with latex. He wrote
some perl script as filter for latex source code that contains Thai language.
Then pass the result to latex. Mr. Vuthichai Ampornaramvech used this concept
and wrote a program in C language, cttex, to handle this. It runs faster and
makes Thai word segmentation based on dictionary. Cttex also fixes the position
of Thai characters in word, so SARA and WANNAYUK will be placed in the
beautiful position.
You can find Thai latex filter from http://thaigate.nacsis.ac.jp/files/
ttex.html.

Latex's configuration for Thai language

You must have latex installed in your computer. First, download Thai postscript
(Type1) fonts, tfm fonts and Thai style file. These fonts are needed by Latex.
This is the list of files you should download.


       tfm fonts:
           dbtt.tfm    dbttb.tfm   dbttbi.tfm  dbtti.tfm
       postscript fonts:
           dbtt.pfa    dbttb.pfa   dbttbi.pfa  dbtti.pfa
       style files:
           thai.sty sakka.sty
       Thai Latex filter:
           cttex
       Sample Latex file:
           ttex.ttex test.ttex


There is latex's directory at /usr/lib/texmf/texmf/ (RedHat 5.0). I will call /
usr/lib/texmf/texmf/ as " $texroot " . We will concentrate at $texroot/texmf/
directory. In $texroot/texmf/ directory, there are many files about tex's
configuration. You have to edit files in dvips, fonts, tex subdirectories.
Add the following lines to $texroot/texmf/dvips/misc/psfonts.map


       dbtt  DBThaiText <dbtt.pfa
       dbttb DBThaiTextBold <dbttb.pfa
       dbttbi DBThaiTextBoldItalic <dbttbi.pfa
       dbtti DBThaiTextItalic <dbtti.pfa


Make a new directories and copy files to the appropriate directories.


       %mkdir /usr/lib/texmf/texmf/fonts/tfm/public/thai
       %mkdir /usr/lib/texmf/texmf/fonts/type1/public/thai
       %mkdir /usr/lib/texmf/texmf/tex/generic/thai
       %cp *.tfm /usr/lib/texmf/texmf/fonts/tfm/public/thai
       %cp *.pfa /usr/lib/texmf/texmf/fonts/type1/public/thai
       %cp *.sty /usr/lib/texmf/texmf/tex/generic/thai


Run texhash or MakeTeXls-R(in some system) to update Tex database.


       %/usr/bin/texhash
       texhash: updating /usr/lib/texmf/texmf/ls-R ...
       texhash: Done.



Use Thai LaTeX filter

We can use cttex as filter like this,


       %cttex < ttex.ttex > ttex.tex
       C-TTeX $Revivsion: 1.15 $
       Usage : cttex [cutcode] < infile > outfile
       Usage : cutcode=0 forces operation in HTML mode.
       Build-in dictionary size: 9945 words
        343
       Done
       %latex ttex.tex
       ...
       %xdvi ttex.dvi


You can convert dvi file to postscript file by,


       %dvips -o ttex.ps ttex.dvi


Finally, you can print ttex.ps by using gs or lpr. You must configure printer
before printing. See man-pages of printcap, gs, lpr for more information.

Editing LaTex source file

For new latex user, lyx is helpful. But I recommend to use mule to edit Thai
latex source file because mule supports Thai language and it is a powerful
editor. You may take a look a Thai_Latex_tutorial.

3.3 X Application Resources

Because Xt based applications allow user to configure the applications by
resources. We can make the menu or label to be Thai language.
For example, if you want xman to display Thai labels. You may add these lines
in your .Xdefaults


       ......
       !!  Xman section
       Xman*Font:                          thai8x16
       Xman*helpButton.Label:              ªèÇÂ
       Xman*quitButton.Label:              ÍÍ¡
       Xman*manpageButton.Label:           ¤ÙèÁ×Í¡ÒÃãªé
       ......


You can use the same idea to set window manager to be more Thai environment
too.

3.4 Thai Extension for Linux (TE)

Thai Extension for Linux is a installation package comes with applicaions and
Thai fonts. You don't have to configure Linux system and applications by
yourself. Let TE do configuration task for you. After installation, you can use
Thai language suddenly. Get TE from ftp://fedu.uec.ac.jp/pub/thai/UEC/ZzzThai/
Software/Linux/

4. References and FTP sites


 4.1 Other documents of relevance

The HOWTOs ought to be available from all mirrors of sunsite.unc.edu.
The Linux Danish/International HOWTO by Niels Kristian Bech Jensen
The Linux Cyrillic HOWTO by Alexander L. Belikoff
The Keystroke mini-HOWTO by Zenon Fortuna.
The Locales mini-HOWTO by Peeter Joot. (This one is mainly for developers.)
The ISO-8859-1 FAQ and Programming for Internationalization FAQ (plus much
more) by Michael Gschwind is available from his_homepage.

 4.2 Thai related stuffs

" NACSIS R&amp; D Thai Project Page " , http://thaigate.nacsis.ac.jp

* Information about Thai computing.
* Discussion groups in Thai language, such as thai-l (Thai Mailing list), Thai
  news, etc.
* Thai references and Thai softwares.
* Thai Latex filter.

" ZzzThai Project " , http://www.fedu.uec.ac.jp

* Most softwares and Thai fonts introduced here can download from ZzzThai.
* Describe how to use Thai with 3 main computer platforms, UNIX like, Windows
  and Mac.
* Linux information at http://www.fedu.uec.ac.jp/ZzzThai/Linux, TE, Thai LaTeX
  tutorial, etc.
* By The group of students at The University of Electro-Communications, Tokyo.

" Vuthichai's Page " , http://www.ctrl.titech.ac.jp:80/~vuthi/

* Information about Thai computing by Mr. Vuthichai Ampornaramveth.

" An annotated reference to the Thai implementations " , http://www.inet.co.th/
cyberclub/trin/thairef/

* Information about Thai character standard.
* By Mr.Trin Tantsetthi.

" X window and Thai language " , http://members.xoom.com.cwg.x11th/

* By Mr.Rawat S.Pirom

" SchoolNet Internet Sever " , http://www.school.net.th/linux-sis/

* Using Linux in School, Thailand.
* By NECTEC (National Electronics and Computer Technology Center).

" Thai Open Source Development " , http://members.xoom.com/inThai

* Mozilla Thai enabling.
* Open source Thai softwares and Libraries.
* By Mr.Samphan Raruenrom

" Linux Thai Project " , http://www.geocities.com/SiliconValley/8302

* Information about Linux in Thai language.
* By Kaiwal Development Team.

" ThaiLinux unofficial Webboard " , http://lulu.mptc.eng.cmu.ac.th/HyperNews/
get/ThaiLinux.html

* Questions and answers about Linux in Thai language.
* By Mr.Pruet Boonma

" Thai Linux installation project " , http://www.geocities.com/Tokyo/Bay/4521/

* Installation guide in Thai language


 4.3 FTP and Web sites

Most softwares and Thai fonts which introdued in this howto.

* ftp://ftp.fedu.uec.ac.jp/pub/thai/UEC/ZzzThai/Software/Linux
* http://thaigate.nacsis.ac.jp/files/index.html
* http://www.nectec.or.th/pub/software/i18n/thai

Mule

* ftp://etlport.etl.go.jp/pub/mule

Ss

* http://members.xoom.com/theera/ss/

SunSite and mirrors. doc/howto has the above mentioned HOWTOs. utils/nls and
subdirectories contain files related to National Language Support. Developers
should take a look at locale-tutorial-0.8.txt.gz, locale-pack-0.8.tar.gz and
cat-pack.tar.gz.
The_GNU_archives has the recode package for character table conversion, the
ABOUT-NLS file and the gettext package for locale support of some GNU
applications and (of course) the latest versions of GNU emacs.

5. Acknowledgments and Copyright

Some parts of this HOWTO comes from The Linux Danish/International HOWTO by
Thomas Petersen, petersen@post1.tele.dk (the original author) and Niels
Kristian Bech Jensen, nkbj@image.dk.
Thank you to Phaisarn Techajaruwong for building Thai fonts and valuable
discussion.
Thank you to Thai students at The University of Electro-Communications and Mr.
Vuthichai Ampornaramveth for every help.
This HOWTO is copyrighted by Poonlap Veeratanabutr, poon-v@fedu.uec.ac.jp. It
is distributed as other Linux HOWTOs under the terms described below.
Linux HOWTO documents may be reproduced and distributed in whole or in part, in
any medium physical or electronic, as long as this copyright notice is retained
on all copies. Commercial redistribution is allowed and encouraged; however,
the authors would like to be notified of any such distributions.
All translations, derivative works, or aggregate works incorporating any Linux
HOWTO documents must be covered under this copyright notice. That is, you may
not produce a derivative work from a HOWTO and impose additional restrictions
on its distribution. Exceptions to these rules may be granted under certain
conditions; please contact the Linux HOWTO coordinator at the address given
below.
If you have questions, please contact Tim Bynum, the Linux HOWTO coordinator,
at linux-howto@sunsite.unc.edu via email.