% ----------------------------------------------------------------------------
%  This "ucharclasses" package sets up XeTeX character classes based on which 
%  unicode block a character is found in. It then allows transition rules to be defined
%  when entering or leaving particular unicode blocks, the code of which gets inserted
%  automatically when a transition from a character from one unicode block to a 
%  character from another unicode block is encountered by XeTeX
%
%  Current compatibility should be Unicode 6.0, although I may have missed one or
%  more blocks that were added between 5 and 6.
%
%  Credits:
%   v1.0: Mike "Pomax" Kamermans
%   v2.0: rewritten by Enrico Gregorio
%
%  License: public domain (http://www.tex.ac.uk/CTAN/help/Catalogue/licenses.pd.html)
%
% ----------------------------------------------------------------------------

\ProvidesPackage{ucharclasses}[2012/09/25 v2.0x Unicode block
  character classes for XeLaTeX]

\newif\if@ucharclassverbose
\DeclareOption{verbose}{\@ucharclassverbosetrue}
	
% ----------------------------------------------------------------------------
%  The package options allow you to selectively enable certain unicode blocks
% ----------------------------------------------------------------------------

% We first define all blocks in a list together with their start and
% end point

\def\AllClasses{
% Unicode 5.1 block definitions
  \do{AegeanNumbers}{65792}{65855}
  \do{AlphabeticPresentationForms}{64256}{64335}
  \do{AncientGreekMusicalNotation}{119296}{119375}
  \do{AncientGreekNumbers}{65856}{65935}
  \do{AncientSymbols}{65936}{65999}
  \do{Arabic}{1536}{1791}
  \do{ArabicPresentationFormsA}{64336}{65023}
  \do{ArabicPresentationFormsB}{65136}{65279}
  \do{ArabicSupplement}{1872}{1919}
  \do{Armenian}{1328}{1423}
  \do{Arrows}{8592}{8703}
  \do{Balinese}{6912}{7039}
  \do{BasicLatin}{32}{127}
  \do{Bengali}{2432}{2559}
  \do{BlockElements}{9600}{9631}
  \do{Bopomofo}{12544}{12591}
  \do{BopomofoExtended}{12704}{12735}
  \do{BoxDrawing}{9472}{9599}
  \do{BraillePatterns}{10240}{10495}
  \do{Buginese}{6656}{6687}
  \do{Buhid}{5952}{5983}
  \do{ByzantineMusicalSymbols}{118784}{119039}
  \do{Carian}{66208}{66271}
  \do{Cham}{43520}{43615}
  \do{Cherokee}{5024}{5119}
  \do{CJKCompatibility}{13056}{13311}
  \do{CJKCompatibilityForms}{65072}{65103}
  \do{CJKCompatibilityIdeographs}{63744}{64255}
  \do{CJKCompatibilityIdeographsSupplement}{194560}{195103}
  \do{CJKRadicalsSupplement}{11904}{12031}
  \do{CJKStrokes}{12736}{12783}
  \do{CJKSymbolsAndPunctuation}{12288}{12351}
  \do{CJKUnifiedIdeographs}{19968}{40959}
  \do{CJKUnifiedIdeographsExtensionA}{13312}{19903}
  \do{CJKUnifiedIdeographsExtensionB}{131072}{173791}
  \do{CJKUnifiedIdeographsExtensionC}{173824}{177983}
  \do{CombiningDiacriticalMarks}{768}{879}
  \do{CombiningDiacriticalMarksforSymbols}{8400}{8447}
  \do{CombiningDiacriticalMarksSupplement}{7616}{7679}
  \do{CombiningHalfMarks}{65056}{65071}
  \do{ControlPictures}{9216}{9279}
  \do{Coptic}{11392}{11519}
  \do{CountingRodNumerals}{119648}{119679}
  \do{Cuneiform}{73728}{74751}
  \do{CuneiformNumbersAndPunctuation}{74752}{74879}
  \do{CurrencySymbols}{8352}{8399}
  \do{CypriotSyllabary}{67584}{67647}
  \do{Cyrillic}{1024}{1279}
  \do{CyrillicExtendedA}{11744}{11775}
  \do{CyrillicExtendedB}{42560}{42655}
  \do{CyrillicSupplement}{1280}{1327}
  \do{Deseret}{66560}{66639}
  \do{Devanagari}{2304}{2431}
  \do{Dingbats}{9984}{10175}
  \do{DominoTiles}{127024}{127135}
  \do{EnclosedAlphanumerics}{9312}{9471}
  \do{EnclosedCJKLettersAndMonths}{12800}{13055}
  \do{Ethiopic}{4608}{4991}
  \do{EthiopicExtended}{11648}{11743}
  \do{EthiopicSupplement}{4992}{5023}
  \do{GeneralPunctuation}{8192}{8303}
  \do{GeometricShapes}{9632}{9727}
  \do{Georgian}{4256}{4351}
  \do{GeorgianSupplement}{11520}{11567}
  \do{Glagolitic}{11264}{11359}
  \do{Gothic}{66352}{66383}
  \do{GreekAndCoptic}{880}{1023}
  \do{GreekExtended}{7936}{8191}
  \do{Gujarati}{2688}{2815}
  \do{Gurmukhi}{2560}{2687}
  \do{HalfwidthAndFullwidthForms}{65280}{65519}
  \do{HangulCompatibilityJamo}{12592}{12687}
  \do{HangulJamo}{4352}{4607}
  \do{HangulSyllables}{44032}{55215}
  \do{Hanunoo}{5920}{5951}
  \do{Hebrew}{1424}{1535}
  \do{Hiragana}{12352}{12447}
  \do{IdeographicDescriptionCharacters}{12272}{12287}
  \do{IPAExtensions}{592}{687}
  \do{Kanbun}{12688}{12703}
  \do{KangxiRadicals}{12032}{12255}
  \do{Kannada}{3200}{3327}
  \do{Katakana}{12448}{12543}
  \do{KatakanaPhoneticExtensions}{12784}{12799}
  \do{KayahLi}{43264}{43311}
  \do{Kharoshthi}{68096}{68191}
  \do{Khmer}{6016}{6143}
  \do{KhmerSymbols}{6624}{6655}
  \do{Lao}{3712}{3839}
  \do{LatinExtendedAdditional}{7680}{7935}
  \do{LatinExtendedA}{256}{383}
  \do{LatinExtendedB}{384}{591}
  \do{LatinExtendedC}{11360}{11391}
  \do{LatinExtendedD}{42784}{43007}
  \do{LatinSupplement}{128}{255}
  \do{Lepcha}{7168}{7247}
  \do{LetterlikeSymbols}{8448}{8527}
  \do{Limbu}{6400}{6479}
  \do{LinearBIdeograms}{65664}{65791}
  \do{LinearBSyllabary}{65536}{65663}
  \do{Lycian}{66176}{66207}
  \do{Lydian}{67872}{67903}
  \do{MahjongTiles}{126976}{127023}
  \do{Malayalam}{3328}{3455}
  \do{MathematicalAlphanumericSymbols}{119808}{120831}
  \do{MathematicalOperators}{8704}{8959}
  \do{MiscellaneousMathematicalSymbolsA}{10176}{10223}
  \do{MiscellaneousMathematicalSymbolsB}{10624}{10751}
  \do{MiscellaneousSymbols}{9728}{9983}
  \do{MiscellaneousSymbolsAndArrows}{11008}{11263}
  \do{MiscellaneousTechnical}{8960}{9215}
  \do{ModifierToneLetters}{42752}{42783}
  \do{Mongolian}{6144}{6319}
  \do{MusicalSymbols}{119040}{119295}
  \do{Myanmar}{4096}{4255}
  \do{NewTaiLue}{6528}{6623}
  \do{NKo}{1984}{2047}
  \do{NumberForms}{8528}{8591}
  \do{Ogham}{5760}{5791}
  \do{OldChiki}{7248}{7295}
  \do{OldItalic}{66304}{66351}
  \do{OldPersian}{66464}{66527}
  \do{OpticalCharacterRecognition}{9280}{9311}
  \do{Oriya}{2816}{2943}
  \do{Osmanya}{66688}{66735}
  \do{PhagsPa}{43072}{43135}
  \do{PhaistosDisc}{66000}{66047}
  \do{Phoenician}{67840}{67871}
  \do{PhoneticExtensions}{7424}{7551}
  \do{PhoneticExtensionsSupplement}{7552}{7615}
  \do{PrivateUseArea}{57344}{63743}
  \do{Rejang}{43312}{43359}
  \do{Runic}{5792}{5887}
  \do{Saurashtra}{43136}{43231}
  \do{Shavian}{66640}{66687}
  \do{Sinhala}{3456}{3583}
  \do{SmallFormVariants}{65104}{65135}
  \do{SpacingModifierLetters}{688}{767}
  \do{Specials}{65520}{65535}
  \do{SuperscriptsAndSubscripts}{8304}{8351}
  \do{SupplementalArrowsA}{10224}{10239}
  \do{SupplementalArrowsB}{10496}{10623}
  \do{SupplementalMathematicalOperators}{10752}{11007}
  \do{SupplementalPunctuation}{11776}{11903}
  \do{SupplementaryPrivateUseAreaA}{983040}{1048575}
  \do{SupplementaryPrivateUseAreaB}{1048576}{1114111}
  \do{SylotiNagri}{43008}{43055}
  \do{Syriac}{1792}{1871}
  \do{Tagalog}{5888}{5919}
  \do{Tagbanwa}{5984}{6015}
  \do{Tags}{917504}{917631}
  \do{TaiLe}{6480}{6527}
  \do{TaiXuanJingSymbols}{119552}{119647}
  \do{Tamil}{2944}{3071}
  \do{Telugu}{3072}{3199}
  \do{Thaana}{1920}{1983}
  \do{Thai}{3584}{3711}
  \do{Tibetan}{3840}{4095}
  \do{Tifinagh}{11568}{11647}
  \do{Ugaritic}{66432}{66463}
  \do{UnifiedCanadianAboriginalSyllabics}{5120}{5759}
  \do{Vai}{42240}{42559}
  \do{VariationSelectors}{65024}{65039}
  \do{VariationSelectorsSupplement}{917760}{917999}
  \do{VerticalForms}{65040}{65055}
  \do{YiRadicals}{42128}{42191}
  \do{YiSyllables}{40960}{42127}
  \do{YijingHexagramSymbols}{19904}{19967}
% Unicode 6.0 block definitions
  \do{Mandaic}{2112}{2143}
  \do{Batak}{7104}{7167}
  \do{EthiopicExtendedA}{43776}{43823}
  \do{Brahmi}{69632}{69759}
  \do{BamumSupplement}{92160}{92735}
  \do{KanaSupplement}{110592}{110847}
  \do{PlayingCards}{127136}{127231}
  \do{MiscellaneousSymbolsAndPictographs}{127744}{128511}
  \do{Emoticons}{128512}{128591}
  \do{TransportAndMapSymbols}{128640}{128767}
  \do{AlchemicalSymbols}{128768}{128895}
  \do{CJKUnifiedIdeographsExtensionD}{177984}{178207}
}
% ----------------------------------------------------------------------------
%  Option handling lets the user turn off "load all" and selectively enable only those blocks 
%  they are interested in
% ----------------------------------------------------------------------------

% Each option starts with \overrideClassLoading; so any specified
% option will set |\if@overrideClassLoading| to true; when one has
% been scanned it's not necessary to set the conditional again. Then
% for block X we let \enableX to \@empty so that later on we can check
% if it is defined

\newif\if@overrideClassLoading
\newcommand{\overrideClassLoading}{\@overrideClassLoadingtrue
  \let\overrideClassLoading\relax}

\def\do#1#2#3{\DeclareOption{#1}%
  {\overrideClassLoading\expandafter\let\csname enable#1\endcsname\@empty}}
% We execute the list with this definition of \do
\AllClasses

% informal groups
% We define lists also for these groups

\def\ClassGroups{
  \doclass{Arabics}
  \doclass{Chinese}
  \doclass{CJK}
  \doclass{Cyrillics}
  \doclass{Diacritics}
  \doclass{Greek}
  \doclass{Korean}
  \doclass{Japanese}
  \doclass{Latin}
  \doclass{Mathematics}
  \doclass{Phonetics}
  \doclass{Punctuation}
  \doclass{Symbols}
  \doclass{Yi}
  \doclass{Other}
}

\def\ArabicsClasses{
  \do{Arabic}
  \do{ArabicPresentationFormsA}
  \do{ArabicPresentationFormsB}
  \do{ArabicSupplement}
}

\def\ChineseClasses{
  \do{Bopomofo}
  \do{BopomofoExtended}
  \do{CJKCompatibility}
  \do{CJKCompatibilityForms}
  \do{CJKCompatibilityIdeographs}
  \do{CJKCompatibilityIdeographsSupplement}
  \do{CJKRadicalsSupplement}
  \do{CJKStrokes}
  \do{CJKSymbolsAndPunctuation}
  \do{CJKUnifiedIdeographs}
  \do{CJKUnifiedIdeographsExtensionA}
  \do{CJKUnifiedIdeographsExtensionB}
  \do{CJKUnifiedIdeographsExtensionC}
  \do{CJKUnifiedIdeographsExtensionD}
  \do{EnclosedCJKLettersAndMonths}
  \do{IdeographicDescriptionCharacters}
  \do{KangxiRadicals}
}

\def\CJKClasses{
  \do{Bopomofo}
  \do{BopomofoExtended}
  \do{CJKCompatibility}
  \do{CJKCompatibilityForms}
  \do{CJKCompatibilityIdeographs}
  \do{CJKCompatibilityIdeographsSupplement}
  \do{CJKRadicalsSupplement}
  \do{CJKStrokes}
  \do{CJKSymbolsAndPunctuation}
  \do{CJKUnifiedIdeographs}
  \do{CJKUnifiedIdeographsExtensionA}
  \do{CJKUnifiedIdeographsExtensionB}
  \do{CJKUnifiedIdeographsExtensionC}
  \do{CJKUnifiedIdeographsExtensionD}
  \do{EnclosedCJKLettersAndMonths}
  \do{HalfwidthAndFullwidthForms}
  \do{HangulCompatibilityJamo}
  \do{HangulJamo}
  \do{HangulSyllables}
  \do{Hiragana}
  \do{IdeographicDescriptionCharacters}
  \do{Kanbun}
  \do{KangxiRadicals}
  \do{Katakana}
  \do{KatakanaPhoneticExtensions}
  \do{KanaSupplement}
}

\def\CyrillicsClasses{
  \do{Cyrillic}
  \do{CyrillicExtendedA}
  \do{CyrillicExtendedB}
  \do{CyrillicSupplement}
}

\def\DiacriticsClasses{
  \do{CombiningDiacriticalMarks}
  \do{CombiningDiacriticalMarksforSymbols}
  \do{CombiningDiacriticalMarksSupplement}
  \do{CombiningHalfMarks}
}

\def\GreekClasses{
  \do{Coptic}
  \do{GreekAndCoptic}
  \do{GreekExtended}
}

\def\KoreanClasses{
  \do{HangulCompatibilityJamo}
  \do{HangulJamo}
  \do{HangulSyllables}
}

\def\JapaneseClasses{
  \do{HalfwidthAndFullwidthForms}
  \do{Hiragana}
  \do{Kanbun}
  \do{KangxiRadicals}
  \do{Katakana}
  \do{KatakanaPhoneticExtensions}
  \do{KanaSupplement}
  \do{CJKUnifiedIdeographs}
}

\def\LatinClasses{
  \do{BasicLatin}
  \do{LatinExtendedAdditional}
  \do{LatinExtendedA}
  \do{LatinExtendedB}
  \do{LatinExtendedC}
  \do{LatinExtendedD}
  \do{LatinSupplement}
  \do{AlphabeticPresentationForms}
}

\def\MathematicsClasses{
  \do{MathematicalAlphanumericSymbols}
  \do{MathematicalOperators}
  \do{MiscellaneousMathematicalSymbolsA}
  \do{MiscellaneousMathematicalSymbolsB}
  \do{SupplementalMathematicalOperators}
}

\def\PhoneticsClasses{
  \do{IPAExtensions}
  \do{PhoneticExtensions}
  \do{PhoneticExtensionsSupplement}
}

\def\PunctuationClasses{
  \do{GeneralPunctuation}
  \do{SupplementalPunctuation}
}

\def\SymbolsClasses{
  \do{Arrows}
  \do{BoxDrawing}
  \do{ByzantineMusicalSymbols}
  \do{ControlPictures}
  \do{CurrencySymbols}
  \do{GeometricShapes}
  \do{LetterlikeSymbols}
  \do{MiscellaneousSymbols}
  \do{MiscellaneousSymbolsAndArrows}
  \do{MiscellaneousTechnical}
  \do{SupplementalArrowsA}
  \do{SupplementalArrowsB}
  \do{VariationSelectors}
  \do{VariationSelectorsSupplement}
  \do{MiscellaneousSymbolsAndPictographs}
  \do{Emoticons}
  \do{TransportAndMapSymbols}
  \do{AlchemicalSymbols}
}

\def\YiClasses{
  \do{YiRadicals}
  \do{YiSyllables}
}

\def\OtherClasses{
  \do{AegeanNumbers}
  \do{AncientGreekMusicalNotation}
  \do{AncientGreekNumbers}
  \do{Armenian}
  \do{Balinese}
  \do{Bengali}
  \do{BlockElements}
  \do{BraillePatterns}
  \do{Buginese}
  \do{Buhid}
  \do{Cherokee}
  \do{Coptic}
  \do{CountingRodNumerals}
  \do{Cuneiform}
  \do{CuneiformNumbersAndPunctuation}
  \do{CypriotSyllabary}
  \do{Deseret}
  \do{Devanagari}
  \do{Dingbats}
  \do{DominoTiles}
  \do{EnclosedAlphanumerics}
  \do{Ethiopic}
  \do{EthiopicExtended}
  \do{EthiopicSupplement}
  \do{Georgian}
  \do{GeorgianSupplement}
  \do{Glagolitic}
  \do{Gothic}
  \do{Gujarati}
  \do{Gurmukhi}
  \do{Hanunoo}
  \do{Hebrew}
  \do{Kannada}
  \do{Kharoshthi}
  \do{Khmer}
  \do{KhmerSymbols}
  \do{Lao}
  \do{Limbu}
  \do{LinearBIdeograms}
  \do{LinearBSyllabary}
  \do{MahjongTiles}
  \do{Malayalam}
  \do{ModifierToneLetters}
  \do{Mongolian}
  \do{MusicalSymbols}
  \do{Myanmar}
  \do{NewTaiLue}
  \do{NKo}
  \do{NumberForms}
  \do{Ogham}
  \do{OldItalic}
  \do{OldPersian}
  \do{OpticalCharacterRecognition}
  \do{Oriya}
  \do{Osmanya}
  \do{PhagsPa}
  \do{Phoenician}
  \do{PrivateUseArea}
  \do{Runic}
  \do{Shavian}
  \do{Sinhala}
  \do{SmallFormVariants}
  \do{SpacingModifierLetters}
  \do{Specials}
  \do{SuperscriptsAndSubscripts}
  \do{SupplementaryPrivateUseAreaA}
  \do{SupplementaryPrivateUseAreaB}
  \do{SylotiNagri}
  \do{Syriac}
  \do{Tagalog}
  \do{Tagbanwa}
  \do{Tags}
  \do{TaiLe}
  \do{TaiXuanJingSymbols}
  \do{Tamil}
  \do{Telugu}
  \do{Thaana}
  \do{Thai}
  \do{Tibetan}
  \do{Tifinagh}
  \do{Ugaritic}
  \do{UnifiedCanadianAboriginalSyllabics}
  \do{VerticalForms}
  \do{YijingHexagramSymbols}
}

% For each class group Z we define the relative option
% \DeclareOption{Z}{\overrideClassLoading\enableX1\enableX2...\enableXn}
% where X1, X2, ..., Xn are the blocks belonging to class Z

\def\do#1{%
  \unexpanded{\expandafter\let\csname enable#1\endcsname\@empty}}
\def\doclass#1{%
  \begingroup\edef\x{\endgroup\noexpand\DeclareOption{#1}{%
    \noexpand\overrideClassLoading\csname #1Classes\endcsname}}\x}
\ClassGroups


\ProcessOptions\relax

% If no option has been given, \if@overrideClassLoading will still be
% false, and in this case we enable *all* blocks (again by defining
% \enableX equal to \@empty for each block X

\if@overrideClassLoading\else
  \def\do#1#2#3{\expandafter\let\csname enable#1\endcsname\@empty}
  \AllClasses
\fi

% ----------------------------------------------------------------------------
% After dealing with the options, make sure we have the necessary packages available
% ----------------------------------------------------------------------------

% because this package relies on XeTeX's intercharclass sytem, better require XeTeX
\RequirePackage{ifxetex}
\RequireXeTeX

% ----------------------------------------------------------------------------
% This package heavily exploits XeTeX's intercharclass system!
% ----------------------------------------------------------------------------

% enable/disable commands
\newcommand{\disableTransitionRules}{\XeTeXinterchartokenstate = 0}
\newcommand{\enableTransitionRules}{\XeTeXinterchartokenstate = 1}

% shorthand commands
\let\uccoff\disableTransitionRules
\let\uccon\enableTransitionRules

% make sure it's turned on
\enableTransitionRules

% ----------------------------------------------------------------------------
%  And now, finally, we can start loading all the requested blocks
% ----------------------------------------------------------------------------

% \message{Package ucharclasses Message: Assigning character classes per
% Unicode block (this may take a while)}

%% We record the last allocated class before allocating ours;
%% \newXeTeXintercharclass saves in the counter
%% \xe@alloc@intercharclass the last allocated class number; initially
%% it's 3, but some other code might have allocated interchar classes
%% before loading this package; if \enableX is defined (to \@empty,
%% but that's irrelevant), an intercharclass is allocated by using the
%% list \AllClasses; two cases for block X:
%%
%% (1) \enableX is defined: then \do{X}{a}{b} will become
%% \@defineUnicodeClass{X}{a}{b} which in turn will execute
%% \newXeTeXintercharclass\XClass and start a loop assigning code
%% points from a to b to this class
%%
%% (2) \enableX is not defined: then \do{X}{a}{b} will become
%% \@gobblethree{X}{a}{b} and so nothing will be performed

\chardef\@classstart=\xe@alloc@intercharclass

\providecommand\@gobblethree[3]{}
\def\do#1{%
  \ifcsname enable#1\endcsname
     \expandafter\@defineUnicodeClass
   \else
     \expandafter\@gobblethree
   \fi{#1}}

\def\@defineUnicodeClass#1#2#3{%
  \if@ucharclassverbose\typeout{Defining #1 Class}\fi
  \expandafter\newXeTeXintercharclass\csname #1Class\endcsname
  \count@=#2
  \loop
  \if@ucharclassverbose
    \typeout{\XeTeXcharclass\number\count@=
      \expandafter\string\csname #1Class\endcsname}%
  \fi
    \XeTeXcharclass\count@=\csname #1Class\endcsname
  \ifnum\count@<#3
    \advance\count@\@ne
  \repeat
}
\AllClasses

% finally, we record the end of our charclass range
\chardef\@classend=\xe@alloc@intercharclass

%%% Our assigned classes go from \@classstart (excluded) to \@classend (included)

% ----------------------------------------------------------------------------
%	Use: \setTransitionsFor{block name}{when entering this block}{when leaving this block}
% ----------------------------------------------------------------------------

\def\setTransitionsFor#1#2#3{%
  \ifcsname enable#1\endcsname
    \count@=\@classstart
    \loop\ifnum\count@<\@classend
      \advance\count@\@ne
      \ifnum\count@=\csname #1Class\endcsname\else
         \XeTeXinterchartoks\count@ \csname #1Class\endcsname={#2}%
         \XeTeXinterchartoks\csname #1Class\endcsname \count@={#3}%
      \fi
    \repeat
    \XeTeXinterchartoks\@cclv\csname #1Class\endcsname={#2}%
    \XeTeXinterchartoks\csname #1Class\endcsname\@cclv={#3}%
  \else
    \if@ucharclassverbose
      \PackageWarningNoLine{ucharclasses}{Class #1\MessageBreak
                                          not loaded}%
    \fi
  \fi
}

% ----------------------------------------------------------------------------
%	Use: \setTransitionTo{block name}{what to do when entering this block}
% ----------------------------------------------------------------------------

\def\setTransitionTo#1#2{%
  \ifcsname enable#1\endcsname
    \count@=\@classstart
    \loop\ifnum\count@<\@classend
      \advance\count@\@ne
      \ifnum\count@=\csname #1Class\endcsname\else
        \XeTeXinterchartoks\count@ \csname #1Class\endcsname={#2}%
      \fi
    \repeat
    \XeTeXinterchartoks\@cclv\csname #1Class\endcsname={#2}%
  \else
    \if@ucharclassverbose
      \PackageWarningNoLine{ucharclasses}{Class #1\MessageBreak
                                          not loaded}%
    \fi
  \fi
}

% ----------------------------------------------------------------------------
%	Use: \setTransitionFrom{block name }{what to do when leaving this block}
% ----------------------------------------------------------------------------

\def\setTransitionFrom#1#2{%
  \ifcsname enable#1\endcsname
    \count@=\@classstart
    \loop\ifnum\count@<\@classend
      \advance\count@\@ne
      \ifnum\count@=\csname #1Class\endcsname\else
        \XeTeXinterchartoks\csname #1Class\endcsname \count@={#2}%
      \fi
    \repeat
    \XeTeXinterchartoks\csname #1Class\endcsname\@cclv={#2}%
  \else
    \if@ucharclassverbose
      \PackageWarningNoLine{ucharclasses}{Class #1\MessageBreak
                                          not loaded}%
    \fi
  \fi
}

% ----------------------------------------------------------------------------
% Informal Block Rules - for these, to/from must always be defined
%
% Available informal groups are:
%
%   - Arabics
%   - Chinese (including bopomofo)
%   - CJK (Chinese/Japanese/Korean)
%   - Cyrillics
%   - Diacritics
%   - Greek
%   - Japanese	(it is advised to set CJK first to a catch-all, then set Japanese for specifics)
%   - Korean (=Hangul) (same comment as for Japanese)
%   - Latin
%   - Mathematics
%   - Phonetics
%   - Punctuation
%   - Symbols
%   - Yi
%   - Other (I am not a fan of lump groups. I hope to un-lump most of it)
%
% ----------------------------------------------------------------------------

%% For each class group Z we define \setTransitionsForX as
%% \newcommand\setTransitionsForZ[2]{%
%%    \setTransitionsFor{X1}{#1}{#2}
%%    \setTransitionsFor{X2}{#1}{#2}
%%    ...
%%    \setTransitionsFor{Xn}{#1}{#2}}
%% where X1, X2, ..., Xn are the blocks in group Z

\def\do#1{\noexpand\setTransitionsFor{#1}{####1}{####2}}
\def\doclass#1{
  \begingroup\edef\x{\endgroup
    \noexpand\newcommand
    \unexpanded\expandafter{\csname setTransitionsFor#1\endcsname}[2]%
    {\csname #1Classes\endcsname}}\x}
\ClassGroups


% ----------------------------------------------------------------------------
%
% based on the previous informal groups, we can define a catch-all transition command
%
% ----------------------------------------------------------------------------

%% The following is equivalent to define
%%   \newcommand{\setDefaultTransitions[2]{
%%     \setTransitionsForArabic{#1}{#2}
%%     ...
%%     \setTransitionsForOther{#1}{#2}}

\def\doclass#1{%
  \expandafter\noexpand\csname setTransitionsFor#1\endcsname{####1}{####2}}
\begingroup\edef\x{\endgroup
  \noexpand\newcommand\noexpand\setDefaultTransitions[2]{%
    \ClassGroups}}\x

% ----------------------------------------------------------------------------

\let\do\@undefined\let\doclass\@undefined
\endinput
%
% End of file `ucharclasses.sty'.