Tuesday, June 5, 2012

ഒരു മലയാളം ഫോണ്ടുണ്ടാക്കിയാലോ - 6

“കുറേ മാസത്തിനു് ശേഷം ദേ ഇയാൾ വീണ്ടും വന്നിരിക്കുന്നു!” എന്നു് നിങ്ങൾ അല്ഭുതപ്പെടുന്നുണ്ടാവും. എന്താ ചെയ്യാ, വല്ലാത്ത തിരക്കായിപ്പോയി.


ആദ്യം ഒരു ശുഭവാർത്ത: എനിക്കൊരു ആൺകുട്ടി ജനിച്ചിരിക്കുന്നു! ഇപ്പൊ എട്ടുമാസമായി. സുഖമായി ഇരിക്കുന്നു. “തുമ്പി” എന്ന ബൂലോകനാമം ഇട്ടു; വീട്ടിൽ വച്ചുവിളിക്കാൻ സിദ്ധാർത്ഥ് എന്നും.

ഇനി തിരിച്ചു ഫോണ്ടിലേക്കു്. ഈ ഭാഗത്തിൽ മൈക്രോസോഫ്ടിന്റെ ഔദ്യോഗികമായി നിഷ്കർഷിച്ചിട്ടുള്ള രീതിയിൽ ലിഗേച്ചറുകൾ ഉണ്ടാക്കുന്ന രീതി കൂടി പറയാം. ഇതോടെ ഫോണ്ട് ലേഖനപരമ്പര നിർത്തുകയാണു്. അവശേഷിക്കുന്ന ഭാഗം കേർണിംഗ് (kerning - അക്ഷരങ്ങൾ തമ്മിലുള്ള അകലം അക്ഷരസമുച്ചയങ്ങൾക്കനുസരിച്ചു് മാറ്റുന്ന പ്രക്രിയ) ആണു്; അതു് ഞാൻ പ്രതിപാദിക്കുന്നില്ല. താൽപര്യമുള്ളവർ ഈമെയിൽ അയക്കുമല്ലൊ.

ഈ ലിങ്കിൽ പോയി നോക്കിയിട്ടുണ്ടാവുമല്ലൊ? Glossary എന്ന ഭാഗത്തു് കൊടുത്തിരിക്കുന്ന പട്ടിക ശ്രദ്ധിച്ചു വായിക്കുക. ലിഗേച്ചറുകളുടെ നിർമ്മാണത്തിൽ വളരെ ആവശ്യമുള്ള ഒരു പറ്റം വിവരമാണു് ഇതിൽ പറഞ്ഞിട്ടുള്ളതു്. ഏതൊക്കെ സന്ദർഭങ്ങളിൽ ഏതു തരം ലിഗേചർ ഉപയോഗിക്കണം എന്നതു് ഈ പട്ടിക നോക്കി വിലയിരുത്തേണ്ടതുണ്ടു്.

മൈക്രോസോഫ്റ്റ് ലേഖനത്തിന്റെ രണ്ടാം പേജിൽ GSUB എന്ന ഭാഗത്തു് പറഞ്ഞിട്ടുള്ള shaping features എന്ന ഭാഗം ശ്രദ്ധിക്കുക. വിവിധ തരം ലിഗേച്ചറുകളിൽ ഏതാണു് ആദ്യം ചുമത്തപ്പെടുക, ഏതാണു് പിന്നീടു് ചുമത്തപെടുക എന്നുള്ള ക്രമം വിശദീകരിച്ചിട്ടുണ്ടു്. അതുപോലെ ലിഗേച്ചറുകളെ ക്രമപ്പെടുത്തിയശേഷം അവയെ ദൃശ്യവല്ക്കരിക്കുന്ന ക്രമവും വിവരിച്ചിട്ടുണ്ടു്. ഇവ രണ്ടും സൂക്ഷിച്ചു പഠിച്ചാലേ നല്ല ലിഗേച്ചറുകൾ ഉണ്ടാക്കാനാവൂ.

(ഞാൻ നേരത്തെ പറഞ്ഞ kerning പ്രതിപാദിക്കപ്പെടുന്നതു് രണ്ടാം പേജിൽ തന്നെ GPOS എന്ന ഭാഗത്താണു്. താല്പര്യമുള്ളവർ ശ്രദ്ധിക്കുക)

ഒരു കാര്യം കൂടി പറഞ്ഞു നിങ്ങളെ പേടിപ്പിച്ച ശേഷം ലിഗേച്ചറുണ്ടാക്കാൻ തുടങ്ങാം:

Zero width joiner (ZWJ) എന്നും zero width non-joiner (ZWNJ) എന്നും കേട്ടിട്ടുണ്ടല്ലൊ? (കേട്ടിട്ടില്ലെങ്കിൽ പേജുകൾ ഒന്നുകൂടി മനസ്സിരുത്തി വായിക്കുക, കൂടാതെ ഇതുവരെ ഉണ്ടാക്കിയ അക്ഷരരൂപങ്ങളും എടുത്തുനോക്കുക). ZWJ ഉപയോഗിച്ചാൽ കൂട്ടക്ഷരം ഉണ്ടാക്കുന്നതു് തടയാനാവും. എന്നാൽ ചില്ലക്ഷരങ്ങൾ സൃഷ്ടിക്കപ്പെടും. ZWNJ ഉപയോഗിക്കുമ്പോൾ ചില്ലക്ഷരം ഉണ്ടാവുന്നതും രോധിക്കപെടുന്നു.

ഉദാഹരണത്തിനു്, ന + ചന്ദ്രക്കല + ZWJ = ൻ (ചില്ലക്ഷരം)

ന + ചന്ദ്രക്കല + ZWNJ = ന്‌

അതായതു്, ചില്ലക്ഷരത്തിന്റെ ലിഗേച്ചർ ഉണ്ടാക്കുമ്പോൾ ZWJ കൊടുക്കാൻ മറക്കരുതു്. അഥവാ മറന്നു് ന + ചന്ദ്രക്കല = ൻ എന്നു പറഞ്ഞുപോയാൽ ചിലപ്പോൾ “ചന്ദ്രൻ” എന്നെഴുതിയാൽ നമ്മുടെ ഫോണ്ടിൽ വായിക്കുമ്പോൾ “ചൻദ്രൻ” എന്നു് കണ്ടേക്കും.

കൂട്ടത്തിൽ പറയട്ടെ, വരമൊഴി പോലെയുള്ള സോഫ്റ്റ്വെയറുകൾ എങ്ങിനെ പ്രവർത്തിക്കുന്നു എന്നൊരു ചെറിയ ധാരണ ഇപ്പോൾ കിട്ടിയോ? pon_naaLam എന്നെഴുതുമ്പോൾ പൊന്നാളം എന്നു വരാതെ പൊൻനാളം എന്നു കൃത്യമായി കാണാൻ സാധിക്കുന്നതു്, നമ്മൾ ഇട്ട അണ്ടർസ്കോറിനെ വരമൊഴി ഒരു ZWJ ആയി മാറ്റുന്നതുകൊണ്ടാണു്. ഇതുപോലെ ഓരോ സന്ദർഭങ്ങളിലും വരമൊഴി പോലുള്ള സോഫ്റ്റ്വെയറുകൾ (ഫോണ്ട് എഞ്ജിനുകൾ എന്നു് പൊതുവിൽ പറയാം) എങ്ങിനെ പ്രവർത്തിക്കുന്നു എന്നു് ആലോചിക്കുന്നതു് ഒരു നല്ല കാര്യമായിരിക്കും.

ഇനി ലിഗേച്ചറുകൾ നോക്കിത്തുടങ്ങാം. ഫോണ്ട്ഫോർജിൽ Element->Font Info എന്ന മെനുവിൽ ക്ലിക്കി തുടർന്നു കിട്ടുന്ന വിൻഡോയിൽ ഇടതുവശത്തു് Lookupൽ ക്ലിക്കിയാൽ GSUB പട്ടികയും GPOS പട്ടികയും കാണാൻ സാധിക്കും.



മുകളിൽ കാണിച്ചിരിക്കുന്നതു് അഞ്ജലി പഴയലിപിയുടെ സ്ക്രീൻ ആണു്. നമുക്കു് ഓരോ ലിഗേച്ചറും വെവ്വേറെ ഉണ്ടാക്കണം. അതിനു് താഴെ പറയുന്ന പോലെ ചെയ്യുക. ഒരു ഉദാഹരണം എന്ന നിലക്കു് “അഖണ്ഡ്” (akhand - akhn) എന്ന ലിഗേചർ ആദ്യമെടുക്കാം.

നേരത്തെ പറഞ്ഞ മെനുവിൽ നിന്നു് GSUB പട്ടിക തുറക്കുക. ഇപ്പോൾ അതിൽ ഒന്നുമുണ്ടാവില്ല.




വലതുവശത്തു് Add Lookup എന്ന ബട്ടൺ ഞക്കുക (കൈകൊണ്ടല്ല, മൗസ് കൊണ്ട്). അപ്പോൾ താഴെക്കാണും വിധം പുതിയ ഒരു വിൻഡോ തുറക്കും:



മുകളിലെ ബട്ടൺ ഞെക്കിയപ്പൊ വരുന്ന ഓപ്ഷൻസ് കണ്ടോ? അഖണ്ഡ് എന്ന ലിഗേച്ചറിനു് വേണ്ടതു് Ligature substitution എന്ന ഐച്ഛികമാണു്. അതു് തെരഞ്ഞെടുക്കുക.



തുടർന്നു് തൊട്ടുതാഴെ Feature എന്നു പറഞ്ഞിരിക്കുന്നതിനു താഴെ നു വലതുവശത്തുള്ള ചെറിയ പെട്ടിയിൽ ഞെക്കിയാൽ നമുക്കു വേണ്ട ലിഗേചർ തെരഞ്ഞെടുക്കാം. കാണിക്കുന്ന ഐച്ഛികങ്ങളിൽ ഒന്നു് അഖൻഡ് ആണെന്നു് ശ്രദ്ധിച്ചിരിക്കുമല്ലൊ.


അപ്പൊ അഖണ്ഡ് തെരഞ്ഞെടുക്കുക. താഴെക്കാണും വിധം കിട്ടും:


Scripts & Languagesൽ പോയി mlym മാത്രം നിലനിർത്തിയാലും മതിയാകും. ഇനി ഓക്കെ അടിക്കുക.


ഇപ്പോൾ വലതുവശത്തു് മുമ്പു് വ്യക്തമല്ലാതിരുന്ന പല ബട്ടനുകളും തെളിഞ്ഞിട്ടുണ്ടു്. അതിൽ Add subtable എന്ന ബട്ടൺ ഞെക്കുക.


ഓക്കെ അടിച്ചാൽ മുന്നോട്ടു പോകാം


ഇനിയങ്ങോട്ടു് നാം ലിഗേചർ ആദ്യഭാഗത്തു ചെയ്തപോലെ, ഇടതുവശത്തു് ലിഗേചറിന്റെ പേരു്, വലതുവശത്തു് ആ ലിഗേചറിന്റെ ഘടകാക്ഷരനാമങ്ങൾ എന്നിവ കൊടുക്കുക. ശ്രദ്ധിക്കേണ്ട ഒരു കാര്യം, ചന്ദ്രക്കലയോടൊപ്പം ല, ര, റ മുതലായവ വരുന്ന കൂട്ടക്ഷരങ്ങൾ (ഉദാ: ക + ചന്ദ്രക്കല + ല = ക്ല, ക + ചന്ദ്രക്കല + ര = ക്ര) ഇവിടെ ചേർക്കരുതു്. ഓരോന്നിനും അതിന്റേതായ സ്ഥലമുണ്ടു്. സദ്യക്കു് വിളമ്പുമ്പോൾ ഓരോ കറിക്കും അതിന്റേതായ സ്ഥാനമുള്ളതുപോലെ.

അഞ്ജലി പഴയലിപിയുടെ ഒരു അഖണ്ഡ് പട്ടികയാണു് താഴെ:


മൈക്രോസോഫ്റ്റിന്റെ മൂന്നാം പേജിൽ പറഞ്ഞിട്ടുള്ള എല്ലാ ലിഗേചറുകളും സൃഷ്ടിക്കണം എന്നില്ല. ആവശ്യമുള്ളവ നിർമ്മിച്ചാൽ മതിയാവും.

ശരി, ഇനി അടുത്ത ലിഗേചർ - Below base forms - blwf

അക്ഷരങ്ങളേ ലിഗേചർ കൊണ്ടു് ആദേശം ചെയ്യുമ്പോൾ മുൻപത്തെ അക്ഷരത്തിനെ ചുവട്ടിലാണു് മാറ്റം വരുന്നതെങ്കിൽ അതിനു് ഇത്തരം ലിഗേചർ ഉപയോഗിക്കാം. ഏറ്റവും നല്ല ഉദാഹരണം ക + ് + ല = ക്ല (ക എന്ന അക്ഷരത്തിനു ചുവട്ടിൽ ല എന്ന ചിഹ്നം വന്നതു് ശ്രദ്ധിക്കുക) ആണു്.

ഇതിനു് രണ്ടു് പട്ടിക തയ്യറാക്കണം.

ആദ്യം, ഒരു സാധാരണ ലിഗേചർ പട്ടിക തയ്യാറാക്കുക. ഇതു് എങ്ങിനെ ചെയ്യണം എന്നു് മുമ്പിലത്തെ അദ്ധ്യായത്തിൽ നോക്കി മനസ്സിലാക്കുമല്ലൊ. എന്നിട്ടു് ചന്ദ്രക്കല + ല = ല ചിഹ്നം എന്ന ലിഗേചർ നിയമം സൃഷ്ടിക്കുക. അതുപോലെ, മറ്റൊരു പട്ടികയിൽ ചന്ദ്രക്കല + ള = ല ചിഹ്നം എന്നും ചേർക്കുക.

ഇനി വേണ്ടതു് എപ്പോഴൊക്കെ ഈ മാറ്റം നടത്തണം എന്നു് ഫോണ്ടിനോടു് പറയലാണു്. അതിനു് കുറച്ചു പണിയുണ്ടു്.

പുതിയ Lookup പട്ടികയുണ്ടാക്കുന്ന സ്ക്രീനിൽ പോയി പട്ടികയുണ്ടാക്കുക. Type എന്നുള്ളിടത്തു് Contextual Chaining substitution തെരഞ്ഞെടുക്കുക.


Featureൽ blwf എന്നു ചേർത്ത ശേഷം Script(s) & Language(s)ൽ mlym{dflt} എന്നു ചേർക്കുക.

ഇനി പറ്റിയ ഒരു പേരു കൊടുത്തു് പട്ടിക സേവ് ചെയ്യാം.

അടുത്തതായി ഈ ടേബിൾ സിലെക്റ്റ് ചെയ്തു് Add Subtable ക്ലിക്കുക. പറ്റിയ ഒരു പേരു കൊടുത്തുകഴിഞ്ഞാൽ പരിചയമില്ലാത്ത ഒരു സ്ക്രീൻ വരും:


ഇതിൽ By Coverage ക്ലിക് ചെയ്തശേഷം Next അടിക്കുക. അപ്പൊ ഇതുപോലെയാവും:


ഇതിൽ വേണ്ടതു്, നമ്മുടെ ലിഗേചറിലുള്ള ഗ്ലിഫ്ഫുകളെ ചേർക്കുകയും ഏതൊക്കെ അക്ഷരത്തിനു ശേഷം വന്നാലാണു് ലിഗേചർ ഉപയോഗിക്കേണ്ടതു് എന്നു നിയമമുണ്ടാക്കുകയുമാണു്.

Glyphs in the coverage tables എന്നു കാണുന്നതിനു തൊട്ടുചുവട്ടിൽ <New>കണ്ടില്ലേ? അതിനു വലതുവശത്തു് ഒരു ചെറിയ ചതുരപ്പെട്ടിയും കണ്ടില്ലേ? ആ ചതുരപ്പെട്ടിയിൽ ക്ലിക്കിയാൽ ഏതൊക്കെ ഗ്ലിഫ്ഫുകൾ വേണം എന്നു് തെരഞ്ഞെടുക്കാം. അതിനുതകുന്ന രീതിയിൽ ഇതുവരെ ഫോണ്ടിൽ നമ്മളുണ്ടാക്കിയിട്ടുള്ള ഗ്ലിഫ്ഫുകൾ തെളിഞ്ഞുവരും. ആദ്യം ചന്ദ്രക്കല തെരഞ്ഞെടുക്കുക. Ok അടിക്കുക. വീണ്ടും New ക്ലിക് ചെയ്തു് ചറ്റുരപ്പെട്ടിയിൽ ഞെക്കി ല എന്ന ഗ്ലിഫ്ഫും തെരഞ്ഞെടുക്കുക.

അതിനു തൊട്ടു താഴെ Apply lookupൽ നമ്മൾ ഇത്തിരിമുമ്പേ ഉണ്ടാക്കിയ ലിഗേചർ പട്ടികയുടെ പേരു തെരഞ്ഞെടുക്കുക. at position എന്നുള്ളയിടത്തു് 0 (അതായതു് zero) എന്നു കൊടുത്തോളു.

ഇനി മുകളിൽ Matchനു തൊട്ടടുത്തു് Backtrack എന്ന ടാബിൽ ക്ലിക് ചെയ്യുക. അവിടേയും New കാണാം. വലതുവശത്തെ ചതുരപ്പെട്ടിയിൽ ക്ലിക് ചെയ്തു് ഏതൊക്കെ ഗ്ലിഫ്ഫുകൾക്കു ശേഷം ചന്ദ്രക്കല+ല വന്നാലാണു് “്ല”ക്കു പകരം ല ചിഹ്നം സ്ഥാപിക്കേണ്ടതു് എന്നു തെരഞ്ഞെടുക്കുക. ഇനി ഇവയിലേതെങ്കിലും ഗ്ലിഫ്ഫിനു ശേഷം ചന്ദ്രക്കലയും തൊട്ടുപിന്നാലെ ല എന്ന അക്ഷരവും വന്നാൽ ല ചിഹ്നമായി മാറും. മുമ്പത്തെ അക്ഷരത്തിനു ചുവട്ടിൽ വരികയും ചെയ്യും.

Lookaheadൽ ഒന്നും ചെയ്യേണ്ട. ഇനി Ok അടിച്ചു ടേബിൾ സേവ് ചെയ്യാം.

അടുത്ത ലിഗേചർ - post-base - pstf

മൈക്രോസോഫ്റ്റ് സൈറ്റിൽ ശ്രദ്ധിച്ചാൽ മനസ്സിലാവും, വേണ്ടതു് 3 ലിഗേചറുകളാണു്. സാധാരണ ലിഗേച്ചറുകൾ. ക + ചന്ദ്രക്കല + ര = ക്ര, ക + ചന്ദ്രക്കല + യ = ക്യ, ക + ചന്ദ്രക്കല + വ = ക്വ എന്നിങ്ങനെ ഉദാഹരിക്കാം.

ഇനി presentation formsലേക്കു്.

അതായതു് ഇത്രയും നേരം നമ്മൾ ചെയ്തതു് ലിഗേചർ ഉണ്ടാക്കലായിരുന്നു. ഇനി വേണ്ടതു് അവയെ പ്രദർശിപ്പിക്കുമ്പോൾ എന്തെങ്കിലും മാറ്റം വേണമെങ്കിൽ അവ ചെയ്യലാണു്. ഉദാഹരണത്തിനു്, ക + ചന്ദ്രക്കല + വ = ക്വ എന്നു ഇപ്പൊ പറഞ്ഞതേയുള്ളു. പക്ഷെ വ + ചന്ദ്രക്കല + വ എന്നുവന്നാൽ വ്വ എന്നു വേണം, അല്ലാതെ വ കഴിഞ്ഞു് ചിഹ്നമല്ല വേണ്ടതു്. സോ, അപ്രകാരം ഉള്ള ഐറ്റംസ് നിഷ്കർഷിക്കുന്ന നിയമങ്ങളെ.. എന്തു വിളിക്കുന്നു? Presentation forms എന്നു വിളിക്കുന്നു.

പൊതുവെ, ഇവ ലിഗേചറുകളായി ഉണ്ടാക്കിയാൽ മതിയാവും. അഞ്ജലി പഴയലിപിയിൽ Contextual chaining ആണു് ചെയ്തിരിക്കുന്നതു്. അതിന്റെ ആവശ്യമുണ്ടെന്നു് എനിക്കു് തോന്നുന്നില്ല. അതായതു്, അപവാദങ്ങൾ (exceptions) മാത്രം ലിഗേചറായി സൃഷ്ടിച്ചാൽ മതിയാവുന്നതാണു്.

ഇത്രയുംകൊണ്ടു് ഫോണ്ട് റെഡിയായി. ഇനി നേരത്തേ പറഞ്ഞപോലെ എക്സ്പോർട്ട് ചെയ്തു് ഉപയോഗിച്ചുതുടങ്ങാം.

ഈ ലേഖനപരമ്പര എഴുതുമ്പോൾ ഒരുപാടു പേരുടെ സഹായം എനിക്കു കിട്ടിയിട്ടുണ്ടു്. എല്ലാവരേയും പേരെടുത്തു പറയുന്നില്ല. നന്ദി എന്നൊരു വാക്കിൽ ഒതുക്കാവുന്നതല്ല എല്ലാവരും തന്ന പ്രോൽസാഹനം. പക്ഷെ ഭാഷ ഇന്നും അപൂർണമായതുകൊണ്ടു് ഇത്രയും പറഞ്ഞു് ഈ ലേഖനം നിർത്തുന്നു. അടുത്തതു് ഒരു കഥയാണു്. ഉടനെ തിരിച്ചുവരാം.

ഫോണ്ടിനെക്കുറിച്ചു് എന്തെങ്കിലും സംശയമുണ്ടെങ്കിൽ എനിക്കു് ഇമെയിൽ അയക്കുമല്ലൊ. അധികമൊന്നും അറിയില്ലെങ്കിലും ഉള്ളതു പറഞ്ഞുതരാം. അറിയാത്തതു് നമുക്കൊരുമിച്ചു കണ്ടുപിടിക്കാൻ ശ്രമിക്കുകയുമാവാം.




4 comments:

ajith said...

മനസ്സില്‍ ആലോചിച്ചത് തന്നെ പോസ്റ്റില്‍ ആദ്യവാചകമായി എഴുതി

ajith said...

സിദ്ധാര്‍ത്ഥിന് ആശംസകള്‍ പറയാന്‍ വീണ്ടും വന്നു

ചാണ്ടിച്ചൻ said...

ഇനിയും തിരക്കാകാന്‍ ഞങ്ങ വല്ല നേര്‍ച്ചയും നേരേണ്ടി വരുമോ!!!!
വല്ല നര്‍മവും എഴുതി പോസ്റ്റൂ ഭായി.....തുമ്പിക്കഥകള്‍ :-)

കൊച്ചു കൊച്ചീച്ചി said...

സ്വാഗതം, സ്വാഗതം!! അച്ഛന് ബൂലോകത്തേയ്ക്കും മകന് ഭൂലോകത്തേയ്ക്കും.

ഞാന്‍ ഫോണ്ടൊന്നും ഉണ്ടാക്കിയില്ല, കേട്ടോ. മടിയാ. പക്ഷേ ഈ പ്രയത്നത്തിന് എന്നെങ്കിലും ആരെങ്കിലും താങ്കളോടു നന്ദി പറയുമെന്ന് കരുതുന്നു. കുറഞ്ഞത് കമ്പ്യൂട്ടര്‍ സയന്‍സ് ഫൈനല്‍ ഇയര്‍ പ്രോജക്റ്റിന് കോപ്പിയടിക്കാന്‍ പറ്റിയ ഒരു ഐറ്റം തിരഞ്ഞുനടക്കുന്നവനെങ്കിലും.

അപ്പൊ കഥ പറ, കഥ പറ. വേഗാട്ടെ....