# 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

## 2. Thai Input and Output

- 2.1 Linux console
- 2.2 X Window system

## 3. Applications with Thai language

- 3.1 Some X applications and Thai language
- 3.2 Printing Thai document
- 3.3 X Application Resources
- 3.4 Thai Extension for Linux (TE)

## 4. References and FTP sites

- 4.1 Other documents of relevance
- 4.2 Thai related stuffs
- 4.3 FTP and Web sites

## 5. Acknowledgments and Copyright

## 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 layoutThere are two ways to map Thai keyboard on X window, using X KeyboardExtension (XKB) and using `xmodmap`. Please select how you map Thai keyboard. Irecommend 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.

`bash shell` :

  Normally, shell accepts only ASCII character set. To type Thai characters in shell command line, you should set environment `LC_CTYPE` to `iso_8859_1`.

  I don't set `LC_CTYPE` environment variable to iso_8859_1 because this environment variable will effect other applications too. With bash shell, you can specify which environment variable to be passed to the application. For example, I can make a fake Thai X terminal with this syntax.

  > `

  >     LC_CTYPE=iso_8859_1 xterm -fn thai8x16

  > `

  This xterm display Thai characters well, but not good for typing Thai characters. I strongly recommend you to use `txterm`.

`ls` :

  If you name a filename in Thai. Issue the command as

  > `

  >     ls -N

  > `

  You may set `alias` in `~/.bashrc` or `~/.cshrc`, so you can type `ls` without option. If you don't use `ls` with `-N` option, you may see Thai filename as ?????.

### 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& 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.