<!doctype linuxdoc system>

<article>

<title>The Linux Thai HOWTO
<author>Poonlap Veeratanabutr, <tt/<htmlurl url="mailto:poon-v@fedu.uec.ac.jp"
name="poon-v@fedu.uec.ac.jp">/
<date>v0.4, 4 August 1998

<abstract>
This document describes how to use Thai language with Linux. This will cover
setting Thai fonts, Thai keyboard and some Thai applications.
</abstract>

<toc>

<sect>Introduction

<p>
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 <url url="http://www.school.net.th"
name="schools in Thailand">. 
<p>
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.

<p>
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 <url
url="http://www.inet.co.th/cyberclub/trin/thairef/"
name="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.
<p>
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.
<p>
You can find the lastest version of Thai-HOWTO document from <url 
url="http://www.fedu.uec.ac.jp/ZzzThai/Linux"
name="http://www.fedu.uec.ac.jp/ZzzThai/Linux">.
Your comment is welcome.


<sect>Thai Input and Output

<sect1>Linux console<label id="console">
<p>
Thai characters do not display properly in Linux console. If you mainly use X
window, you may pass this section.
<sect2>Thai fonts
<p>
You can obtain Linux Thai console fonts which created by Mr. <htmlurl
url="mailto:phaisarn_te@hotmail.com" name="Phaisarn
Techajaruwong"> from <url
url="ftp://ftp.fedu.uec.ac.jp/pub/thai/UEC/ZzzThai/Sofware/Linux/fonts/console" 
name="ZzzThai ftp site">

For example, there is a font name "phaisarn.psf". Put it in
<tt>/usr/lib/kbd/consolefonts/</tt> directory. Then, you can load the new
font from Linux console by command
<tscreen><verb>
%setfont phaisarn.psf
</verb></tscreen>

<sect2>Keyboard layout
<p>
You can set keyboard behavior as you like by using <tt/loadkeys/
command. Usually, you use <tt/loadkeys/ to load the file located in
<tt>/usr/lib/kbd/keytables</tt>. You can create a US/Thai keyboard-map file and save it
in this directory. Here is a sample.
<p>
<tscreen><verb>
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 = ""
</verb></tscreen>

Suppose you save this file as <tt/thai.map/. From Linux console, use command
<tt/loadkeys/ to load <tt/thai.map/.
<tscreen><verb>
%loadkeys thai.map
</verb></tscreen>
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. 


<sect1>X Window system<label id="xwindow">
<sect2>Thai fonts<label id="install_fonts">
<p>
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.
<p>

<sect3>Installing Thai fonts
<p>
You must log in as root. Let's put Thai fonts in
<tt>/usr/X11R6/lib/X11/fonts/misc/</tt>, this is a default font path. Change directory to
<tt>/usr/X11R6/lib/X11/fonts/misc/</tt> and run command
<tscreen><verb>
%mkfontdir
%xset fp rehash
</verb></tscreen>
If you put Thai fonts in different directory, you must use <tt/xset/ to add
the new font path. Please see man-page for further information.
You can check the new fonts by running command <tt/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.
<p>

<sect2>Thai keyboard layout
There are two ways to map Thai keyboard on X window, using X Keyboard
Extension (XKB) and using <tt/xmodmap/. Please select how you map Thai keyboard. I
recommend using XKB.
<p>
<sect3>XKB and Thai keyboard layout.
<p>
Beginning with XFree86 3.1.2D, you can use the new X11R6.1 XKEYBOARD
extension to manage the keyboard layout. This is
very helpful. 
<p>
During X server configuration with <tt/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. 
<p>
<tt/XF86Setup/ is the graphical X server configuration utility for XFree86 X server. 
It is easier than traditional <tt/xf86config/. You can
select a keyboard layout easily with this tool.
<p>
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. 
<p>
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 &dquot 5 key &dquot . To fix this problem, you should
add the line
<tscreen><verb>
    key <AE05> {	[], [	paragraph,	ocircumflex	]	};
</verb></tscreen>
in the file <tt>/usr/X11R6/lib/X11/xkb/symbols/th</tt> as the example.
<tscreen><verb>
.................
    key <AE03> {        [], [       minus,      ograve          ]       };
    key <AE04> {        [], [      Agrave,      oacute          ]       };
    key <AE05> {	[], [	paragraph,	ocircumflex	]	};
    key <AE06> {        [], [    Ooblique,      Ugrave          ]       };
    key <AE07> {        [], [  Odiaeresis,      ssharp          ]       };
.................
</verb></tscreen>
You can not type SORUSI also. Please change the line from
<tscreen><verb>
    key <AC08> {        [], [      Ograve,      eacute          ]       };
</verb></tscreen>
to
<tscreen><verb>
    key <AC08> {        [], [      Ograve,      Eacute          ]       };
</verb></tscreen>
Note that eacute is equal to MAITHO and Eacute is equal to SORUSI.
<p>
There are also XKB extension utilities such as <tt/setxkbmap/,
<tt/xkbcomp/, etc. Please see man-page for more information. I recommend to
use <tt/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 <tt/XF86Config/ file
about keyboard section. If you want to configure the keyboard by hand, change
the content of <tt>/usr/X11R6/lib/X11/XF86Config</tt> as an example
below. This configuration uses the default toggle key.
<tscreen><verb>
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
</verb></tscreen>
<p>
If you use XKB extension, Thai keyboard mapping with <tt/xmodmap/ may not work.
See <tt/XF86Config/ man-page for mor information.
<p>
<sect3>Thai keyboard layout with xmodmap
<p>
You can use the utility <tt/xmodmap/ to map Thai keyboard. 
Normally <tt/xmodmap/ is used to load a keyboard configured file. 
For most Linux distributions,
when you start X window with <tt/startx/, X server will find <tt/.Xmodmap/ in
<tt>/usr/X11R6/lib/X11/xinit/</tt> first. If <tt/.Xmodmap/ does not exist, X
server will find <tt/.Xmodmap/ in your home directory. Please see the content of
<tt>/usr/X11R6/lib/X11/xinit/xinitrc</tt>.
<p>
The following is the sample of <tt/.Xmodmap/ for Thai Kedmanee
keyboard layout.

<tscreen><verb>
!
! 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
</verb></tscreen>
Just put <tt/.Xmodmap/ in your home directory will be OK. When you start X window, X
server will load this file. 

You can also load <tt/.Xmodmap/ from command line.
<tscreen><verb>
%xmodmap ~/.Xmodmap
</verb></tscreen>

<p>
In above <tt/.Xmodmap/ file, US/Thai switch key is
assigned to keycode 0x4E (78), Scroll Lock key, with the statement
<tscreen><code>
keycode 0x4E =  Mode_switch     XF86ModeLock
</code></tscreen>
<tt/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 <tt/X/ and <tt/xev/ for further information.

<p>
<bf/Note:/ If you are using XFree86 version 3.1.2D or later, you need to
add the line <tt/XkbDisable/ in keyboard section of
<tt/XF86Config/ file. You may config the keyboard section
like the following sample.
<tscreen><verb>
Section "Keyboard"
   Protocol        "Standard"
   AutoRepeat      500 5
   LeftAlt         Meta
   RightAlt        ModeShift
   ScrollLock      ModeLock
   RightCtl        Compose
   XkbDisable
EndSection
</verb></tscreen>
<p>

<p>

<sect>Applications with Thai language
<p>
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.

<p>
To make X window application displays Thai font,
you should run the application with <tt/-fn/ option. For example,
<tscreen><verb>
%xedit -fn thai8x16
</verb></tscreen>
Note that <tt/thai8x16/ is just a one of Thai font names. You can see all
available fonts by command <tt/xlfonts/.
If you don't want to fill <tt/-fn/ option every time you run
application. You should set Thai font in your <tt>~/.Xdefaults</tt> or
<tt>~/.Xresources</tt> like this
<tscreen><verb>
XTerm*font:     thai8x16
</verb></tscreen>


<sect1>Some X applications and Thai language
<p>

<sect2>txterm
<p>
<tt/txterm/ is Thai version of <tt/xterm/. There are several programs running
under <tt/xterm/ such as shell, <tt/pine/, <tt/vi/, <tt/less/, etc. We can type Thai
characters without any problems with <tt/txterm/. <tt/Txterm/ also provides
its own Thai input method by pressing &dquot F1 &dquot key. <tt/Txterm/ will
use fonts <tt/thai9x13/ as default Thai font. You can change this by add <tt/-fn/ option.

You can get <tt/txterm/ from
<url url="http://thaigate.nacsis.ac.jp" name="Thaigate"> or 
<url url="ftp://ftp.fedu.uec.ac.jp/pub/thai/UEC/ZzzThai/Software/Linux"
name="ZzzThai">.


<descrip>
<tag/<tt>bash shell</tt> :/
Normally, shell accepts only ASCII character set. To type Thai characters in
shell command line, you should set environment <tt/LC&lowbar;CTYPE/ to
<tt/iso&lowbar;8859&lowbar;1/.

I don't set <tt/LC&lowbar;CTYPE/ environment variable to 
iso&lowbar;8859&lowbar;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.
<tscreen><verb>
LC_CTYPE=iso&lowbar;8859&lowbar;1 xterm -fn thai8x16
</verb></tscreen>
This xterm display Thai characters well, but not good for typing Thai
characters. I strongly recommend you to use <tt/txterm/.

<tag/<tt>ls</tt> :/
If you name a filename in Thai. Issue the command as
<tscreen><verb>
ls -N 
</verb></tscreen> 

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

</descrip>

<sect2>Emacs, Mule
<p>
Mule stands for &dquot Multilingual Enhancement to GNU Emacs &dquot . It has
the same functions as emacs and supports many languages. <tt/Mule/ provides
its own input method, so you don't need any configuration for typing Thai. You 
needs only Thai fonts for <tt/mule/ which you can get from,
<url
url="ftp://ftp.fedu.uec.ac.jp/pub/thai/UEC/ZzzThai/Software/Linux/fonts/"
name="ZzzThai"> or <url url="ftp://etlport.etl.go.jp/pub/mule/fonts/ETL/" name="Etl site">. 
These Thai fonts are fixed width fonts.

You need some configuration for <tt/mule/. Puts the following lines in
your <tt/.emacs/.
<tscreen><verb>
;;
;; 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))
</verb></tscreen>
Add the following lines in <tt/.Xdefaults/. 
<tscreen><verb>
!
! 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
</verb></tscreen>

When you hold shift key and press
left mouse's button, you can select Thai fonts to display in <tt/mule/ window.
To type Thai characters, press &dquot Ctrl + ] &dquot . To type English, press 
&dquot Ctrl + ] &dquot again.
<p>
You can get <tt/mule/ from <url url="ftp://etlport.etl.go.jp/pub/mule/"
name="ElectroTechnical Laboratory(ETL)">

<sect2>vi
<p>
Vi should be run on <tt/txterm/.

<sect2>pine
<p>
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 <tt/pine/, <tt/elm/, Netscape mail, etc.

Put the following definition in your <tt>~/.pinerc</tt> file:
<tscreen><verb>
character-set=ISO-8859-1
</verb></tscreen>
This can also be set via the <tt/Setup/ option in <tt/pine/ window. You can find
it under <tt/Config/. You can read Thai news from pine, too.

<tt/Pine/ should be run in <tt/txterm/. 

<sect2>Netscape
<p>
If you have Thai fonts in your system. Just set Thai font from
preference. Thai fonts will appear in User defined area. See <url
url="http://www.fedu.uec.ac.jp/ZzzThai/unix"
name="http://www.fedu.uec.ac.jp/ZzzThai/unix"> for setting Thai
language on Netscape.

Some movement about Thai Mozilla project at <url
url="http://members.xoom.com/inThai/mozthai.html"
name="http://members.xoom.com/inThai/mozthai.html">. 

<sect2>Ss, Simple thai word Separator
<p>
<tt/ss/ is a dictionary based Thai word separation program similar to
<tt/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 <tt/&lt WBR &gt/ tag between Thai words in html
file. Browser will display Thai homepage better than normal html document.

<sect2>Xzthai, X keyboard configurator + simple editor
<p>
<tt/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
<tt/xmodmap/ program in background to map Thai
keyboard. This may be useful for commercial X server and X server on UNIX.

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

<sect2>Latex and Thai language
<p>
Dr. Manop Wongsaisuwan first tried to use Thai language with <tt/latex/. He
wrote some perl script as filter for latex source code that contains Thai
language. Then pass the result to <tt/latex/. Mr. Vuthichai Ampornaramvech
used this concept and wrote a program in C language, <tt/cttex/, to handle this. It runs
faster and makes Thai word segmentation based on dictionary. <tt/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 <url
url="http://thaigate.nacsis.ac.jp/files/ttex.html"
name="http://thaigate.nacsis.ac.jp/files/ttex.html">.

<sect2>Latex's configuration for Thai language
<p>
You must have <tt/latex/ installed in your computer. 
First, download Thai postscript (Type1) fonts, tfm fonts and Thai style
file. These fonts are needed by
<tt/Latex/. This is the list of files you should download.
<tscreen><verb>
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
</verb></tscreen>

<p>
There is <tt/latex/'s directory at
<tt>/usr/lib/texmf/texmf/</tt> (RedHat 5.0). I will call <tt>/usr/lib/texmf/texmf/</tt> as
&dquot $texroot &dquot . We will concentrate at <tt>$texroot/texmf/</tt> directory.
In <tt>$texroot/texmf/</tt> directory, there are many files
about tex's configuration. You have to edit files in <tt/dvips, fonts, tex/ subdirectories.
<p>
Add the following lines to <tt>$texroot/texmf/dvips/misc/psfonts.map</tt>
<tscreen><verb>
dbtt  DBThaiText <dbtt.pfa
dbttb DBThaiTextBold <dbttb.pfa
dbttbi DBThaiTextBoldItalic <dbttbi.pfa
dbtti DBThaiTextItalic <dbtti.pfa
</verb></tscreen>

<p>
Make a new directories and copy files to the appropriate directories.
<tscreen><verb>
%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
</verb></tscreen>

<p>
Run <tt/texhash/ or <tt/MakeTeXls-R/(in some system) to update <tt/Tex/ database.
<tscreen><verb>
%/usr/bin/texhash
texhash: updating /usr/lib/texmf/texmf/ls-R ...
texhash: Done.
</verb></tscreen>

<sect2>Use Thai <tt/LaTeX/ filter
<p>
We can use <tt/cttex/ as filter like this,
<tscreen><verb>
%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
</verb></tscreen>
You can convert dvi file to postscript file by,
<tscreen><verb>
%dvips -o ttex.ps ttex.dvi
</verb></tscreen>
<p>
Finally, you can print ttex.ps by using <tt/gs/ or <tt/lpr/. You must configure
printer before printing. See man-pages of <tt/printcap/, <tt/gs/, <tt/lpr/
for more information.

<sect2>Editing <tt/LaTex/ source file
<p>
For new <tt/latex/ user, <tt/lyx/ is helpful. But I recommend to use <tt/mule/ 
to edit Thai <tt/latex/ source file because <tt/mule/ supports Thai language
and it is a powerful editor. You may take a look a <url
url="http://www.fedu.uec.ac.jp/ZzzThai/Linux/ttex" name="Thai Latex tutorial">.


<sect1>X Application Resources
<p>
Because Xt based applications allow user to configure
the applications by resources. We can make the menu or label to be
Thai language.
<p>
For example, if you want <tt/xman/ to display Thai labels. You may add
these lines in your <tt/.Xdefaults/ 
<tscreen><verb>
......
!!  Xman section
Xman*Font:                          thai8x16
Xman*helpButton.Label:              ช่วย
Xman*quitButton.Label:              ออก
Xman*manpageButton.Label:           คู่มือการใช้
......
</verb></tscreen>
<p>
You can use the same idea to set window manager to be more Thai environment too.

<sect1> Thai Extension for Linux (TE)
<p>
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 <url
url="ftp://fedu.uec.ac.jp/pub/thai/UEC/ZzzThai/Software/Linux/" name="ftp://fedu.uec.ac.jp/pub/thai/UEC/ZzzThai/Software/Linux/">


<sect>References and FTP sites
<p>
<sect1>Other documents of relevance<label id="docs">

<p>
The HOWTOs ought to be available from all mirrors of <tt/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
<url url="http://www.vlsivie.tuwien.ac.at/mike/i18n.html"
name="his homepage">. 

<sect1> Thai related stuffs<label id="thstuffs">
<p>
 &dquot NACSIS R&amp D Thai
Project Page &dquot ,<url url="http://thaigate.nacsis.ac.jp" name="http://thaigate.nacsis.ac.jp">
<itemize>
<item> Information about Thai computing.
<item> Discussion groups in Thai language, such as thai-l (Thai Mailing list), 
Thai news, etc.
<item> Thai references and Thai softwares.
<item> Thai Latex filter.
</itemize>

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

&dquot Vuthichai's Page &dquot , <url
 url="http://www.ctrl.titech.ac.jp:80/~vuthi/"
 name="http://www.ctrl.titech.ac.jp:80/~vuthi/"> 
<itemize>
<item>Information about Thai computing by Mr. Vuthichai Ampornaramveth.
</itemize>

&dquot An annotated
reference to the Thai implementations &dquot , <url
url="http://www.inet.co.th/cyberclub/trin/thairef/"
name="http://www.inet.co.th/cyberclub/trin/thairef/"> 
<itemize>
<item> Information about Thai character standard.
<item> By Mr.Trin Tantsetthi.
</itemize>

&dquot X window and Thai
language &dquot , <url url="http://members.xoom.com/cwg/x11th/"
name="http://members.xoom.com.cwg.x11th/">
<itemize>
<item> By Mr.Rawat S.Pirom
</itemize>

&dquot SchoolNet
Internet Sever &dquot , <url url="http://www.school.net.th/linux-sis/"
name="http://www.school.net.th/linux-sis/">
<itemize>
<item> Using Linux in School, Thailand.
<item> By <url url="http://www.nectec.or.th" name="NECTEC"> (National
Electronics and Computer Technology Center).
</itemize>

&dquot Thai Open Source
Development &dquot , <url url="http://members.xoom.com/inThai"
name="http://members.xoom.com/inThai">
<itemize>
<item> Mozilla Thai enabling.
<item> Open source Thai softwares and Libraries.
<item> By Mr.Samphan Raruenrom 
</itemize>

&dquot Linux
Thai Project &dquot , <url url="http://www.geocities.com/SiliconValley/8302"
name="http://www.geocities.com/SiliconValley/8302">
<itemize>
<item> Information about Linux in Thai language.
<item> By Kaiwal Development Team.
</itemize>

&dquot ThaiLinux unofficial Webboard &dquot ,
<url url="http://lulu.mptc.eng.cmu.ac.th/HyperNews/get/ThaiLinux.html"
name="http://lulu.mptc.eng.cmu.ac.th/HyperNews/get/ThaiLinux.html"> 
<itemize>
<item> Questions and answers about Linux in Thai language.
<item> By Mr.Pruet Boonma
</itemize>

&dquot Thai Linux
installation project &dquot ,
 <url url="http://www.geocities.com/Tokyo/Bay/4521/"
 name="http://www.geocities.com/Tokyo/Bay/4521/ ">
<itemize>
<item> Installation guide in Thai language
</itemize>

<sect1>FTP and Web sites<label id="ftp">
<p>

Most softwares and Thai fonts which introdued in this howto.
<itemize>
<item> <url url="ftp://ftp.fedu.uec.ac.jp/pub/thai/UEC/ZzzThai/Software/Linux" 
name="ftp://ftp.fedu.uec.ac.jp/pub/thai/UEC/ZzzThai/Software/Linux">
<item> <url url="http://thaigate.nacsis.ac.jp/files/index.html"
name="http://thaigate.nacsis.ac.jp/files/index.html">
<item> <url url="http://www.nectec.or.th/pub/software/i18n/thai"
name="http://www.nectec.or.th/pub/software/i18n/thai" >
</itemize>

<tt/Mule/
<itemize>
<item><url url="ftp://etlport.etl.go.jp/pub/mule"
name="ftp://etlport.etl.go.jp/pub/mule">
</itemize>

<tt/Ss/
<itemize>
<item> <url url="http://members.xoom.com/theera/ss/"
name="http://members.xoom.com/theera/ss/">
</itemize>

<url url="ftp://sunsite.unc.edu/pub/linux/" name="SunSite"> and mirrors.
<tt>doc/howto</tt> has the above mentioned HOWTOs. <tt>utils/nls</tt> and
subdirectories contain files related to National Language Support.
Developers should take a look at <tt>locale-tutorial-0.8.txt.gz</tt>,
<tt>locale-pack-0.8.tar.gz</tt> and <tt/cat-pack.tar.gz/. 

<url url="ftp://prep.ai.mit.edu/pub/gnu/" name="The GNU archives"> has the
<tt/recode/ package for character table conversion, the <tt/ABOUT-NLS/ file
and the <tt/gettext/ package for locale support of some GNU applications and
(of course) the latest versions of GNU emacs.

<tscreen>
</tscreen>

<sect>Acknowledgments and Copyright

<p>
Some parts of this HOWTO comes from The Linux Danish/International
HOWTO by Thomas Petersen, <tt/petersen@post1.tele.dk/ (the original
author) and Niels Kristian Bech Jensen, <tt/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,
<tt/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 <tt/<htmlurl url="mailto:linux-howto@sunsite.unc.edu"
name="linux-howto@sunsite.unc.edu">/ via email.

</article>
