You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 
tex-compiler/texmf-dist/tex/xelatex/ucharclasses/ucharclasses.sty

1045 lines
31 KiB

% ----------------------------------------------------------------------------
% 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 10.0.
%
% Credits:
% v2.1-2.3: Qing Lee, Werner Lemberg
% v2.0: Enrico Gregorio
% v1.0: Mike "Pomax" Kamermans
%
% Significant updates:
% v2.3: Unicode 10 support
% v2.2: Unicode 8.0 and LaTeX2e support
% v2.1: Uplift for the intercharclass updates introduced in XeTeX 0.99994
% v2.0: Rewritten to Vastly improve performance.
% v1.0: Unicode block switching using XeTeX intercharclasses.
%
% License: public domain (https://www.ctan.org/license/pd)
%
% ----------------------------------------------------------------------------
\ProvidesPackage{ucharclasses}[2017/08/10 v2.3.0 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.
%
% Starting with XeTeX version 3.14159265-2.6-0.99994, the number of
% \XeTeXcharclass registers was extended from 256 to 4096 entries; some not
% so important blocks are thus provided only for this and newer versions.
% The boundary of character class was changed from 255 to 4095 correspondingly.
% The primitive \XeTeXinterwordspaceshaping was introduced by XeTeX 0.99994;
% we use it as a flag to identify this version.
%
% However, earlier version of LaTeX2e (before 2016/04/22 v2.0q) didn't provide
% support for 4096 entries; we thus have to override the hard-coded limit.
\ifdefined\e@alloc@intercharclass@top
\chardef\@ucharclass@boundary=\e@alloc@intercharclass@top
\else
\ifdefined\XeTeXinterwordspaceshaping
\chardef\@ucharclass@boundary=4095 %
\def\newXeTeXintercharclass{%
\e@alloc\XeTeXcharclass\chardef
\xe@alloc@intercharclass\m@ne\@ucharclass@boundary}
\else
\chardef\@ucharclass@boundary=\@cclv
\fi
\fi
\def\AllClasses{
% Unicode 5.1 block definitions
\do{AegeanNumbers}{"010100}{"01013F}
\do{AlphabeticPresentationForms}{"0FB00}{"0FB4F}
\do{AncientGreekMusicalNotation}{"01D200}{"01D24F}
\do{AncientGreekNumbers}{"010140}{"01018F}
\do{AncientSymbols}{"010190}{"0101CF}
\do{Arabic}{"0600}{"06FF}
\do{ArabicPresentationFormsA}{"0FB50}{"0FDFF}
\do{ArabicPresentationFormsB}{"0FE70}{"0FEFF}
\do{ArabicSupplement}{"0750}{"077F}
\do{Armenian}{"0530}{"058F}
\do{Arrows}{"02190}{"021FF}
\do{Balinese}{"01B00}{"01B7F}
\do{BasicLatin}{"0020}{"007F} % 0000..007F in Unicode standard
\do{Bengali}{"0980}{"09FF}
\do{BlockElements}{"02580}{"0259F}
\do{Bopomofo}{"03100}{"0312F}
\do{BopomofoExtended}{"031A0}{"031BF}
\do{BoxDrawing}{"02500}{"0257F}
\do{BraillePatterns}{"02800}{"028FF}
\do{Buginese}{"01A00}{"01A1F}
\do{Buhid}{"01740}{"0175F}
\do{ByzantineMusicalSymbols}{"01D000}{"01D0FF}
% Carian (see below)
\do{Cham}{"0AA00}{"0AA5F}
\do{Cherokee}{"013A0}{"013FF}
\do{CJKCompatibility}{"03300}{"033FF}
\do{CJKCompatibilityForms}{"0FE30}{"0FE4F}
\do{CJKCompatibilityIdeographs}{"0F900}{"0FAFF}
\do{CJKCompatibilityIdeographsSupplement}{"02F800}{"02FA1F}
\do{CJKRadicalsSupplement}{"02E80}{"02EFF}
\do{CJKStrokes}{"031C0}{"031EF}
\do{CJKSymbolsAndPunctuation}{"03000}{"0303F}
\do{CJKUnifiedIdeographs}{"04E00}{"09FFF}
\do{CJKUnifiedIdeographsExtensionA}{"03400}{"04DBF}
\do{CJKUnifiedIdeographsExtensionB}{"020000}{"02A6DF}
\do{CombiningDiacriticalMarks}{"0300}{"036F}
\do{CombiningDiacriticalMarksForSymbols}{"020D0}{"020FF}
\do{CombiningDiacriticalMarksSupplement}{"01DC0}{"01DFF}
\do{CombiningHalfMarks}{"0FE20}{"0FE2F}
\do{ControlPictures}{"02400}{"0243F}
\do{Coptic}{"02C80}{"02CFF}
\do{CountingRodNumerals}{"01D360}{"01D37F}
\do{Cuneiform}{"012000}{"0123FF}
\do{CuneiformNumbersAndPunctuation}{"012400}{"01247F}
\do{CurrencySymbols}{"020A0}{"020CF}
\do{CypriotSyllabary}{"010800}{"01083F}
\do{Cyrillic}{"0400}{"04FF}
\do{CyrillicExtendedA}{"02DE0}{"02DFF}
\do{CyrillicExtendedB}{"0A640}{"0A69F}
\do{CyrillicSupplement}{"0500}{"052F}
\do{Deseret}{"010400}{"01044F}
\do{Devanagari}{"0900}{"097F}
\do{Dingbats}{"02700}{"027BF}
\do{DominoTiles}{"01F030}{"01F09F}
\do{EnclosedAlphanumerics}{"02460}{"024FF}
\do{EnclosedCJKLettersAndMonths}{"03200}{"032FF}
\do{Ethiopic}{"01200}{"0137F}
\do{EthiopicExtended}{"02D80}{"02DDF}
\do{EthiopicSupplement}{"01380}{"0139F}
\do{GeneralPunctuation}{"02000}{"0206F}
\do{GeometricShapes}{"025A0}{"025FF}
\do{Georgian}{"010A0}{"010FF}
\do{GeorgianSupplement}{"02D00}{"02D2F}
\do{Glagolitic}{"02C00}{"02C5F}
\do{Gothic}{"010330}{"01034F}
\do{GreekAndCoptic}{"0370}{"03FF}
\do{GreekExtended}{"01F00}{"01FFF}
\do{Gujarati}{"0A80}{"0AFF}
\do{Gurmukhi}{"0A00}{"0A7F}
\do{HalfwidthAndFullwidthForms}{"0FF00}{"0FFEF}
\do{HangulCompatibilityJamo}{"03130}{"0318F}
\do{HangulJamo}{"01100}{"011FF}
\do{HangulSyllables}{"0AC00}{"0D7AF}
\do{Hanunoo}{"01720}{"0173F}
\do{Hebrew}{"0590}{"05FF}
\do{Hiragana}{"03040}{"0309F}
\do{IdeographicDescriptionCharacters}{"02FF0}{"02FFF}
\do{IPAExtensions}{"0250}{"02AF}
\do{Kanbun}{"03190}{"0319F}
\do{KangxiRadicals}{"02F00}{"02FDF}
\do{Kannada}{"0C80}{"0CFF}
\do{Katakana}{"030A0}{"030FF}
\do{KatakanaPhoneticExtensions}{"031F0}{"031FF}
\do{KayahLi}{"0A900}{"0A92F}
\do{Kharoshthi}{"010A00}{"010A5F}
\do{Khmer}{"01780}{"017FF}
\do{KhmerSymbols}{"019E0}{"019FF}
\do{Lao}{"0E80}{"0EFF}
\do{LatinExtendedAdditional}{"01E00}{"01EFF}
\do{LatinExtendedA}{"0100}{"017F}
\do{LatinExtendedB}{"0180}{"024F}
\do{LatinExtendedC}{"02C60}{"02C7F}
\do{LatinExtendedD}{"0A720}{"0A7FF}
\do{LatinSupplement}{"0080}{"00FF}
\do{Lepcha}{"01C00}{"01C4F}
\do{LetterlikeSymbols}{"02100}{"0214F}
\do{Limbu}{"01900}{"0194F}
\do{LinearBIdeograms}{"010080}{"0100FF}
\do{LinearBSyllabary}{"010000}{"01007F}
\do{Lycian}{"010280}{"01029F}
\do{Lydian}{"010920}{"01093F}
\do{MahjongTiles}{"01F000}{"01F02F}
\do{Malayalam}{"0D00}{"0D7F}
\do{MathematicalAlphanumericSymbols}{"01D400}{"01D7FF}
\do{MathematicalOperators}{"02200}{"022FF}
\do{MiscellaneousMathematicalSymbolsA}{"027C0}{"027EF}
\do{MiscellaneousMathematicalSymbolsB}{"02980}{"029FF}
\do{MiscellaneousSymbols}{"02600}{"026FF}
\do{MiscellaneousSymbolsAndArrows}{"02B00}{"02BFF}
\do{MiscellaneousTechnical}{"02300}{"023FF}
\do{ModifierToneLetters}{"0A700}{"0A71F}
\do{Mongolian}{"01800}{"018AF}
\do{MusicalSymbols}{"01D100}{"01D1FF}
\do{Myanmar}{"01000}{"0109F}
\do{NewTaiLue}{"01980}{"019DF}
\do{NKo}{"07C0}{"07FF}
\do{NumberForms}{"02150}{"0218F}
\do{Ogham}{"01680}{"0169F}
\do{OlChiki}{"01C50}{"01C7F}
% OldItalic (see below)
\do{OldPersian}{"0103A0}{"0103DF}
\do{OpticalCharacterRecognition}{"02440}{"0245F}
\do{Oriya}{"0B00}{"0B7F}
\do{Osmanya}{"010480}{"0104AF}
\do{PhagsPa}{"0A840}{"0A87F}
% PhaistosDisc (see below)
\do{Phoenician}{"010900}{"01091F}
\do{PhoneticExtensions}{"01D00}{"01D7F}
\do{PhoneticExtensionsSupplement}{"01D80}{"01DBF}
\do{PrivateUseArea}{"0E000}{"0F8FF}
\do{Rejang}{"0A930}{"0A95F}
\do{Runic}{"016A0}{"016FF}
\do{Saurashtra}{"0A880}{"0A8DF}
\do{Shavian}{"010450}{"01047F}
\do{Sinhala}{"0D80}{"0DFF}
\do{SmallFormVariants}{"0FE50}{"0FE6F}
\do{SpacingModifierLetters}{"02B0}{"02FF}
\do{Sundanese}{"01B80}{"01BBF}
\do{SuperscriptsAndSubscripts}{"02070}{"0209F}
\do{SupplementalArrowsA}{"027F0}{"027FF}
\do{SupplementalArrowsB}{"02900}{"0297F}
\do{SupplementalMathematicalOperators}{"02A00}{"02AFF}
\do{SupplementalPunctuation}{"02E00}{"02E7F}
% SupplementaryPrivateUseAreaA (see below)
% SupplementaryPrivateUseAreaB (see below)
\do{SylotiNagri}{"0A800}{"0A82F}
\do{Syriac}{"0700}{"074F}
\do{Tagalog}{"01700}{"0171F}
\do{Tagbanwa}{"01760}{"0177F}
\do{Tags}{"0E0000}{"0E007F}
\do{TaiLe}{"01950}{"0197F}
\do{TaiXuanJingSymbols}{"01D300}{"01D35F}
\do{Tamil}{"0B80}{"0BFF}
\do{Telugu}{"0C00}{"0C7F}
\do{Thaana}{"0780}{"07BF}
\do{Thai}{"0E00}{"0E7F}
\do{Tibetan}{"0F00}{"0FFF}
\do{Tifinagh}{"02D30}{"02D7F}
\do{Ugaritic}{"010380}{"01039F}
\do{UnifiedCanadianAboriginalSyllabics}{"01400}{"0167F}
\do{Vai}{"0A500}{"0A63F}
\do{VerticalForms}{"0FE10}{"0FE1F}
\do{YiRadicals}{"0A490}{"0A4CF}
\do{YiSyllables}{"0A000}{"0A48F}
\do{YijingHexagramSymbols}{"04DC0}{"04DFF}
% Unicode 5.2 additions
\do{Avestan}{"010B00}{"010B3F}
\do{Bamum}{"0A6A0}{"0A6FF}
\do{CJKUnifiedIdeographsExtensionC}{"02A700}{"02B73F}
\do{CommonIndicNumberForms}{"0A830}{"0A83F}
\do{DevanagariExtended}{"0A8E0}{"0A8FF}
\do{EgyptianHieroglyphs}{"013000}{"01342F}
\do{EnclosedAlphanumericSupplement}{"01F100}{"01F1FF}
\do{EnclosedIdeographicSupplement}{"01F200}{"01F2FF}
\do{HangulJamoExtendedA}{"0A960}{"0A97F}
\do{HangulJamoExtendedB}{"0D7B0}{"0D7FF}
\do{ImperialAramaic}{"010840}{"01085F}
\do{InscriptionalPahlavi}{"010B60}{"010B7F}
\do{InscriptionalParthian}{"010B40}{"010B5F}
\do{Javanese}{"0A980}{"0A9DF}
\do{Kaithi}{"011080}{"0110CF}
\do{Lisu}{"0A4D0}{"0A4FF}
\do{MeeteiMayek}{"0ABC0}{"0ABFF}
\do{MyanmarExtendedA}{"0AA60}{"0AA7F}
% OldSouthArabian (see below)
% OldTurkic (see below)
\do{RumiNumeralSymbols}{"010E60}{"010E7F}
\do{Samaritan}{"0800}{"083F}
\do{TaiTham}{"01A20}{"01AAF}
\do{TaiViet}{"0AA80}{"0AADF}
\do{UnifiedCanadianAboriginalSyllabicsExtended}{"018B0}{"018FF}
\do{VedicExtensions}{"01CD0}{"01CFF}
% Unicode 6.0 additions
\do{AlchemicalSymbols}{"01F700}{"01F77F}
\do{BamumSupplement}{"016800}{"016A3F}
\do{Batak}{"01BC0}{"01BFF}
\do{Brahmi}{"011000}{"01107F}
\do{CJKUnifiedIdeographsExtensionD}{"02B740}{"02B81F}
\do{Emoticons}{"01F600}{"01F64F}
\do{EthiopicExtendedA}{"0AB00}{"0AB2F}
\do{KanaSupplement}{"01B000}{"01B0FF}
\do{Mandaic}{"0840}{"085F}
\do{MiscellaneousSymbolsAndPictographs}{"01F300}{"01F5FF}
\do{PlayingCards}{"01F0A0}{"01F0FF}
\do{TransportAndMapSymbols}{"01F680}{"01F6FF}
% Unicode 6.1 additions
\do{ArabicExtendedA}{"08A0}{"08FF}
\do{ArabicMathematicalAlphabeticSymbols}{"01EE00}{"01EEFF}
\do{Chakma}{"011100}{"01114F}
\do{MeeteiMayekExtensions}{"0AAE0}{"0AAFF}
\do{MeroiticCursive}{"0109A0}{"0109FF}
\do{MeroiticHieroglyphs}{"010980}{"01099F}
\do{Miao}{"016F00}{"016F9F}
\do{Sharada}{"011180}{"0111DF}
\do{SoraSompeng}{"0110D0}{"0110FF}
\do{SundaneseSupplement}{"01CC0}{"01CCF}
\do{Takri}{"011680}{"0116CF}
% Unicode 7.0 additions
\do{BassaVah}{"016AD0}{"016AFF}
\do{CaucasianAlbanian}{"010530}{"01056F}
\do{CombiningDiacriticalMarksExtended}{"01AB0}{"01AFF}
\do{CopticEpactNumbers}{"0102E0}{"0102FF}
% Duployan (see below)
\do{Elbasan}{"010500}{"01052F}
\do{GeometricShapesExtended}{"01F780}{"01F7FF}
\do{Grantha}{"011300}{"01137F}
\do{Khojki}{"011200}{"01124F}
\do{Khudawadi}{"0112B0}{"0112FF}
\do{LatinExtendedE}{"0AB30}{"0AB6F}
\do{LinearA}{"010600}{"01077F}
\do{Mahajani}{"011150}{"01117F}
\do{Manichaean}{"010AC0}{"010AFF}
\do{MendeKikakui}{"01E800}{"01E8DF}
\do{Modi}{"011600}{"01165F}
\do{Mro}{"016A40}{"016A6F}
\do{MyanmarExtendedB}{"0A9E0}{"0A9FF}
\do{Nabataean}{"010880}{"0108AF}
% OldNorthArabian (see below)
\do{OldPermic}{"010350}{"01037F}
\do{OrnamentalDingbats}{"01F650}{"01F67F}
\do{PahawhHmong}{"016B00}{"016B8F}
\do{Palmyrene}{"010860}{"01087F}
\do{PauCinHau}{"011AC0}{"011AFF}
\do{PsalterPahlavi}{"010B80}{"010BAF}
% ShorthandFormatControls (see below)
\do{Siddham}{"011580}{"0115FF}
\do{SinhalaArchaicNumbers}{"0111E0}{"0111FF}
\do{SupplementalArrowsC}{"01F800}{"01F8FF}
\do{Tirhuta}{"011480}{"0114DF}
\do{WarangCiti}{"0118A0}{"0118FF}
% Unicode 8.0 additions
\do{Ahom}{"011700}{"01173F}
% AnatolianHieroglyphs (see below)
\do{CherokeeSupplement}{"0AB70}{"0ABBF}
\do{CJKUnifiedIdeographsExtensionE}{"02B820}{"02CEAF}
\do{EarlyDynasticCuneiform}{"012480}{"01254F}
\do{Hatran}{"0108E0}{"0108FF}
\do{Multani}{"011280}{"0112AF}
\do{OldHungarian}{"010C80}{"010CFF}
\do{SupplementalSymbolsAndPictographs}{"01F900}{"01F9FF}
% SuttonSignWriting (see below)
% Unicode 9.0 additions needed for classes
\do{CyrillicExtendedC}{"01C80}{"01C8F}
\do{GlagoliticSupplement}{"01E000}{"01E02F}
\do{IdeographicSymbolsAndPunctuation}{"016FE0}{"016FFF}
\do{MongolianSupplement}{"011660}{"01167F}
% Unicode 10.0 additions needed for classes
\do{CJKUnifiedIdeographsExtensionF}{"02CEB0}{"02EBEF}
\do{KanaExtendedA}{"01B100}{"01B12F}
\do{SyriacSupplement}{"0860}{"086F}
%
\ifdefined\XeTeXinterwordspaceshaping
\do{AnatolianHieroglyphs}{"014400}{"01467F}
\do{Carian}{"0102A0}{"0102DF}
\do{Duployan}{"01BC00}{"01BC9F}
\do{OldItalic}{"010300}{"01032F}
\do{OldNorthArabian}{"010A80}{"010A9F}
\do{OldSouthArabian}{"010A60}{"010A7F}
\do{OldTurkic}{"010C00}{"010C4F}
\do{PhaistosDisc}{"0101D0}{"0101FF}
\do{ShorthandFormatControls}{"01BCA0}{"01BCAF}
\do{SupplementaryPrivateUseAreaA}{"0F0000}{"0FFFFF}
\do{SupplementaryPrivateUseAreaB}{"0100000}{"010FFFF}
\do{SuttonSignWriting}{"01D800}{"01DAAF}
% Unicode 9.0 additions
\do{Adlam}{"01E900}{"01E95F}
\do{Bhaiksuki}{"011C00}{"011C6F}
\do{Marchen}{"011C70}{"011CBF}
\do{Newa}{"011400}{"01147F}
\do{Osage}{"0104B0}{"0104FF}
\do{Tangut}{"017000}{"0187FF}
\do{TangutComponents}{"018800}{"018AFF}
% Unicode 10.0 additions
\do{MasaramGondi}{"011D00}{"011D5F}
\do{Nushu}{"01B170}{"01B2FF}
\do{Soyombo}{"011A50}{"011AAF}
\do{ZanabazarSquare}{"011A00}{"011A4F}
\fi
}
% ----------------------------------------------------------------------------
% 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{CanadianSyllabics}
\doclass{CherokeeFull}
\doclass{Chinese}
\doclass{CJK}
\doclass{Cyrillics}
\doclass{Diacritics}
\doclass{EthiopicFull}
\doclass{GeorgianFull}
\doclass{Greek}
\doclass{Korean}
\doclass{Japanese}
\doclass{Latin}
\doclass{Mathematics}
\doclass{MongolianFull}
\doclass{MyanmarFull}
\doclass{Phonetics}
\doclass{Punctuation}
\doclass{SundaneseFull}
\doclass{Symbols}
\doclass{SyriacFull}
\doclass{Yi}
\doclass{Other}
}
\def\ArabicsClasses{
\do{Arabic}
\do{ArabicExtendedA}
\do{ArabicPresentationFormsA}
\do{ArabicPresentationFormsB}
\do{ArabicSupplement}
}
\def\CanadianSyllabicsClasses{
\do{UnifiedCanadianAboriginalSyllabics}
\do{UnifiedCanadianAboriginalSyllabicsExtended}
}
\def\CherokeeFullClasses{
\do{Cherokee}
\do{CherokeeSupplement}
}
\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{CJKUnifiedIdeographsExtensionE}
\do{CJKUnifiedIdeographsExtensionF}
\do{EnclosedCJKLettersAndMonths}
\do{EnclosedIdeographicSupplement}
\do{IdeographicDescriptionCharacters}
\do{IdeographicSymbolsAndPunctuation}
\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{CJKUnifiedIdeographsExtensionE}
\do{CJKUnifiedIdeographsExtensionF}
\do{EnclosedCJKLettersAndMonths}
\do{EnclosedIdeographicSupplement}
\do{HalfwidthAndFullwidthForms}
\do{HangulCompatibilityJamo}
\do{HangulJamo}
\do{HangulJamoExtendedA}
\do{HangulJamoExtendedB}
\do{HangulSyllables}
\do{Hiragana}
\do{IdeographicDescriptionCharacters}
\do{IdeographicSymbolsAndPunctuation}
\do{KanaSupplement}
\do{KanaExtendedA}
\do{Kanbun}
\do{KangxiRadicals}
\do{Katakana}
\do{KatakanaPhoneticExtensions}
}
\def\CyrillicsClasses{
\do{Cyrillic}
\do{CyrillicExtendedA}
\do{CyrillicExtendedB}
\do{CyrillicExtendedC}
\do{CyrillicSupplement}
\do{GlagoliticSupplement}
\do{Glagolitic}
}
\def\DiacriticsClasses{
\do{CombiningDiacriticalMarks}
\do{CombiningDiacriticalMarksExtended}
\do{CombiningDiacriticalMarksForSymbols}
\do{CombiningDiacriticalMarksSupplement}
\do{CombiningHalfMarks}
\do{ModifierToneLetters}
\do{SpacingModifierLetters}
}
\def\EthiopicFullClasses{
\do{Ethiopic}
\do{EthiopicExtended}
\do{EthiopicExtendedA}
\do{EthiopicSupplement}
}
\def\GeorgianFullClasses{
\do{Georgian}
\do{GeorgianSupplement}
}
\def\GreekClasses{
\do{Coptic}
\do{CopticEpactNumbers}
\do{GreekAndCoptic}
\do{GreekExtended}
}
\def\KoreanClasses{
\do{HangulCompatibilityJamo}
\do{HangulJamo}
\do{HangulJamoExtendedA}
\do{HangulJamoExtendedB}
\do{HangulSyllables}
}
\def\JapaneseClasses{
\do{CJKUnifiedIdeographs}
\do{HalfwidthAndFullwidthForms}
\do{Hiragana}
\do{KanaSupplement}
\do{KanaExtendedA}
\do{Kanbun}
\do{KangxiRadicals}
\do{Katakana}
\do{KatakanaPhoneticExtensions}
}
\def\LatinClasses{
\do{AlphabeticPresentationForms}
\do{BasicLatin}
\do{LatinExtendedAdditional}
\do{LatinExtendedA}
\do{LatinExtendedB}
\do{LatinExtendedC}
\do{LatinExtendedD}
\do{LatinExtendedE}
\do{LatinSupplement}
}
\def\MathematicsClasses{
\do{ArabicMathematicalAlphabeticSymbols}
\do{MathematicalAlphanumericSymbols}
\do{MathematicalOperators}
\do{MiscellaneousMathematicalSymbolsA}
\do{MiscellaneousMathematicalSymbolsB}
\do{SupplementalMathematicalOperators}
}
\def\MongolianFullClasses{
\do{Mongolian}
\do{MongolianSupplement}
}
\def\MyanmarFullClasses{
\do{Myanmar}
\do{MyanmarExtendedA}
\do{MyanmarExtendedB}
}
\def\PhoneticsClasses{
\do{IPAExtensions}
\do{PhoneticExtensions}
\do{PhoneticExtensionsSupplement}
}
\def\PunctuationClasses{
\do{GeneralPunctuation}
\do{SupplementalPunctuation}
}
\def\SundaneseFullClasses{
\do{Sundanese}
\do{SundaneseSupplement}
}
\def\SymbolsClasses{
\do{AlchemicalSymbols}
\do{Arrows}
\do{BoxDrawing}
\do{ByzantineMusicalSymbols}
\do{ControlPictures}
\do{CurrencySymbols}
\do{Dingbats}
\do{Emoticons}
\do{GeometricShapes}
\do{GeometricShapesExtended}
\do{LetterlikeSymbols}
\do{MiscellaneousSymbols}
\do{MiscellaneousSymbolsAndArrows}
\do{MiscellaneousSymbolsAndPictographs}
\do{MiscellaneousTechnical}
\do{NumberForms}
\do{OrnamentalDingbats}
\do{SupplementalArrowsA}
\do{SupplementalArrowsB}
\do{SupplementalArrowsC}
\do{SupplementalSymbolsAndPictographs}
\do{TransportAndMapSymbols}
}
\def\SyriacFullClasses{
\do{Syriac}
\do{SyriacSupplement}
}
\def\YiClasses{
\do{YiRadicals}
\do{YiSyllables}
}
\def\OtherClasses{
\do{AegeanNumbers}
\do{Ahom}
% AnatolianHieroglyphs (see below)
\do{AncientGreekMusicalNotation}
\do{AncientGreekNumbers}
\do{AncientSymbols}
\do{Armenian}
\do{Avestan}
\do{Balinese}
\do{Bamum}
\do{BamumSupplement}
\do{BassaVah}
\do{Batak}
\do{Bengali}
\do{BlockElements}
\do{Brahmi}
\do{BraillePatterns}
\do{Buginese}
\do{Buhid}
% Carian (see below)
\do{Cham}
\do{CaucasianAlbanian}
\do{Chakma}
\do{CommonIndicNumberForms}
\do{Coptic}
\do{CountingRodNumerals}
\do{Cuneiform}
\do{CuneiformNumbersAndPunctuation}
\do{CypriotSyllabary}
\do{Deseret}
\do{Devanagari}
\do{DominoTiles}
% Duployan (see below)
\do{EarlyDynasticCuneiform}
\do{EgyptianHieroglyphs}
\do{Elbasan}
\do{EnclosedAlphanumerics}
\do{EnclosedAlphanumericSupplement}
\do{Gothic}
\do{Grantha}
\do{Gujarati}
\do{Gurmukhi}
\do{Hanunoo}
\do{Hatran}
\do{Hebrew}
\do{ImperialAramaic}
\do{InscriptionalPahlavi}
\do{InscriptionalParthian}
\do{Javanese}
\do{Kaithi}
\do{Kannada}
\do{KayahLi}
\do{Kharoshthi}
\do{Khmer}
\do{KhmerSymbols}
\do{Khojki}
\do{Khudawadi}
\do{Lao}
\do{Lepcha}
\do{Limbu}
\do{LinearA}
\do{LinearBIdeograms}
\do{LinearBSyllabary}
\do{Lisu}
\do{Lycian}
\do{Lydian}
\do{Mahajani}
\do{MahjongTiles}
\do{Malayalam}
\do{Mandaic}
\do{Manichaean}
\do{MeeteiMayek}
\do{MeeteiMayekExtensions}
\do{MendeKikakui}
\do{MeroiticCursive}
\do{MeroiticHieroglyphs}
\do{Miao}
\do{Modi}
\do{Mro}
\do{Multani}
\do{MusicalSymbols}
\do{Nabataean}
\do{NewTaiLue}
\do{NKo}
\do{Ogham}
\do{OlChiki}
\do{OldHungarian}
% OldItalic (see below)
% OldNorthArabian (see below)
\do{OldPermic}
\do{OldPersian}
% OldSouthArabian (see below)
% OldTurkic (see below)
\do{OpticalCharacterRecognition}
\do{Oriya}
\do{Osmanya}
\do{PahawhHmong}
\do{Palmyrene}
\do{PauCinHau}
\do{PhagsPa}
% PhaistosDisc (see below)
\do{Phoenician}
\do{PlayingCards}
\do{PrivateUseArea}
\do{PsalterPahlavi}
\do{Rejang}
\do{RumiNumeralSymbols}
\do{Runic}
\do{Samaritan}
\do{Saurashtra}
\do{Sharada}
\do{Shavian}
% ShorthandFormatControls (see below)
\do{Siddham}
\do{Sinhala}
\do{SinhalaArchaicNumbers}
\do{SmallFormVariants}
\do{SoraSompeng}
\do{SuperscriptsAndSubscripts}
% SupplementaryPrivateUseAreaA (see below)
% SupplementaryPrivateUseAreaB (see below)
% SuttonSignWriting (see below)
\do{SylotiNagri}
\do{Tagalog}
\do{Tagbanwa}
\do{Tags}
\do{TaiLe}
\do{TaiTham}
\do{TaiViet}
\do{TaiXuanJingSymbols}
\do{Takri}
\do{Tamil}
\do{Telugu}
\do{Thaana}
\do{Thai}
\do{Tibetan}
\do{Tifinagh}
\do{Tirhuta}
\do{Ugaritic}
\do{Vai}
\do{VedicExtensions}
\do{VerticalForms}
\do{WarangCiti}
\do{YijingHexagramSymbols}
%
\ifdefined\XeTeXinterwordspaceshaping
\do{Adlam}
\do{AnatolianHieroglyphs}
\do{Bhaiksuki}
\do{Carian}
\do{Duployan}
\do{Marchen}
\do{MasaramGondi}
\do{Newa}
\do{Nushu}
\do{OldItalic}
\do{OldNorthArabian}
\do{OldSouthArabian}
\do{OldTurkic}
\do{Osage}
\do{PhaistosDisc}
\do{ShorthandFormatControls}
\do{Soyombo}
\do{SupplementaryPrivateUseAreaA}
\do{SupplementaryPrivateUseAreaB}
\do{SuttonSignWriting}
\do{Tangut}
\do{TangutComponents}
\do{ZanabazarSquare}
\fi
}
% 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 = \z@}
\newcommand{\enableTransitionRules}{\XeTeXinterchartokenstate = \@ne}
% 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\@ucharclass@boundary\csname #1Class\endcsname={#2}%
\XeTeXinterchartoks\csname #1Class\endcsname\@ucharclass@boundary={#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\@ucharclass@boundary\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\@ucharclass@boundary={#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
% - CanadianSyllabics
% - CherokeeFull
% - Chinese (including bopomofo)
% - CJK (Chinese/Japanese/Korean)
% - Cyrillics
% - Diacritics
% - EthiopicFull
% - GeorgianFull
% - 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
% - MongolianFull
% - MyanmarFull
% - Phonetics
% - Punctuation
% - SundaneseFull
% - Symbols
% - SyriacFull
% - 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'.