diff options
author | Karl Berry <karl@freefriends.org> | 2008-06-09 20:51:27 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2008-06-09 20:51:27 +0000 |
commit | c58445fb5fb17c48e0504ed7041e03aaaf6e387a (patch) | |
tree | a7ccc772c1f6e1ae94200b5a105654b9cc3f589e /Master/texmf-dist/tex/xelatex | |
parent | c2ded34c4ac6a32fbed94b870481aaf9667fc227 (diff) |
finish fontwrap commit
git-svn-id: svn://tug.org/texlive/trunk@8624 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex/xelatex')
-rw-r--r-- | Master/texmf-dist/tex/xelatex/fontwrap/fontwrap.sty | 1880 |
1 files changed, 1880 insertions, 0 deletions
diff --git a/Master/texmf-dist/tex/xelatex/fontwrap/fontwrap.sty b/Master/texmf-dist/tex/xelatex/fontwrap/fontwrap.sty new file mode 100644 index 00000000000..5057ec2d036 --- /dev/null +++ b/Master/texmf-dist/tex/xelatex/fontwrap/fontwrap.sty @@ -0,0 +1,1880 @@ +% ---------------------------------------------------------------------------- +% +% fontwrap inserts fonts into your XeLaTeX text based on which unicode blocks +% characters belong to. For instance, something like: +% +% "This is English with 日本語 interspersed" +% +% will be turned into become: +% +% "\fontspec{\unicodeblockLatinFont}This is English with \fontspec{\unicodeblockJapaneseFont}日本語\fontspec{\unicodeblockLatinFont} interspersed" +% +% This is something that most word processors can do already, and it was sort +% silly that LaTeX didn't have a general scheme for this. After all, LaTeX should +% be better than word processors! ^_^ +% +% That said, you can bind different fonts to different unicode blocks (the best +% font for Japanese, for instance, is definitely not the best font for Chinese, +% both of which are probably pretty poor English fonts... for instance), +% Any unicode block that you didn't bind yourself will use the defaults: +% +% \langfonddefaultfont for anything not CJK +% \langfonddefaultCJKfont for anything CJK (including the separate japanese and korean blocks) +% +% June 2008, Mike Kamermans, % nihongoresources.com (C) +% ---------------------------------------------------------------------------- + +\ProvidesPackage{fontwrap} + +% enables use of system fonts +\usepackage{fontspec} + +% enables full support for unicode text +\usepackage{xunicode} + +% fixes some older command behaviour to current - see http://www.ctan.org/tex-archive/help/Catalogue/entries/xltxtra.html +\usepackage{xltxtra} + +% also get some external Perl logic going +\usepackage{perltex} + + +% ---------------------------------------------------------------------------- +% +% The actually interesting method. This parses the input and inserts \fontspec +% commands where necessary. +% +% ---------------------------------------------------------------------------- + +% default font - a fairly complete unicode font +\newcommand{\fontwrapdefaultfont}{Bitstream Cyberbit} + +% default font for CJK languages - another pretty complete unicode font +\newcommand{\fontwrapdefaultCJKfont}{Code2000} + +% --------------------------------------------------------- +% Font bindings. Font bindings for 158 unicode blocks... +% --------------------------------------------------------- + +\newcommand{\unicodeblockBasicLatinFont}{\fontwrapdefaultfont} + +\newcommand{\unicodeblockHiraganaFont}{\fontwrapdefaultCJKfont} + +\newcommand{\unicodeblockCJKUnifiedIdeographsFont}{\fontwrapdefaultCJKfont} + +\newcommand{\unicodeblockKatakanaFont}{\fontwrapdefaultCJKfont} + +\newcommand{\unicodeblockAegeanNumbersFont}{\fontwrapdefaultfont} + +\newcommand{\unicodeblockAlphabeticPresentationFormsFont}{\fontwrapdefaultfont} + +\newcommand{\unicodeblockAncientGreekMusicalNotationFont}{\fontwrapdefaultfont} + +\newcommand{\unicodeblockAncientGreekNumbersFont}{\fontwrapdefaultfont} + +\newcommand{\unicodeblockArabicFont}{\fontwrapdefaultfont} + +\newcommand{\unicodeblockArabicPresentationFormsAFont}{\fontwrapdefaultfont} + +\newcommand{\unicodeblockArabicPresentationFormsBFont}{\fontwrapdefaultfont} + +\newcommand{\unicodeblockArabicSupplementFont}{\fontwrapdefaultfont} + +\newcommand{\unicodeblockArmenianFont}{\fontwrapdefaultfont} + +\newcommand{\unicodeblockArrowsFont}{\fontwrapdefaultfont} + +\newcommand{\unicodeblockBalineseFont}{\fontwrapdefaultfont} + +\newcommand{\unicodeblockBengaliFont}{\fontwrapdefaultfont} + +\newcommand{\unicodeblockBlockElementsFont}{\fontwrapdefaultfont} + +\newcommand{\unicodeblockBopomofoFont}{\fontwrapdefaultCJKfont} + +\newcommand{\unicodeblockBopomofoExtendedFont}{\fontwrapdefaultCJKfont} + +\newcommand{\unicodeblockBoxDrawingFont}{\fontwrapdefaultfont} + +\newcommand{\unicodeblockBraillePatternsFont}{\fontwrapdefaultfont} + +\newcommand{\unicodeblockBugineseFont}{\fontwrapdefaultfont} + +\newcommand{\unicodeblockBuhidFont}{\fontwrapdefaultfont} + +\newcommand{\unicodeblockByzantineMusicalSymbolsFont}{\fontwrapdefaultfont} + +\newcommand{\unicodeblockCherokeeFont}{\fontwrapdefaultfont} + +\newcommand{\unicodeblockCJKCompatibilityFont}{\fontwrapdefaultCJKfont} + +\newcommand{\unicodeblockCJKCompatibilityFormsFont}{\fontwrapdefaultCJKfont} + +\newcommand{\unicodeblockCJKCompatibilityIdeographsFont}{\fontwrapdefaultCJKfont} + +\newcommand{\unicodeblockCJKCompatibilityIdeographsSupplementFont}{\fontwrapdefaultCJKfont} + +\newcommand{\unicodeblockCJKRadicalsSupplementFont}{\fontwrapdefaultCJKfont} + +\newcommand{\unicodeblockCJKStrokesFont}{\fontwrapdefaultCJKfont} + +\newcommand{\unicodeblockCJKSymbolsandPunctuationFont}{\fontwrapdefaultCJKfont} + +\newcommand{\unicodeblockCJKUnifiedIdeographsExtensionAFont}{\fontwrapdefaultCJKfont} + +\newcommand{\unicodeblockCJKUnifiedIdeographsExtensionBFont}{\fontwrapdefaultCJKfont} + +\newcommand{\unicodeblockCombiningDiacriticalMarksFont}{\fontwrapdefaultfont} + +\newcommand{\unicodeblockCombiningDiacriticalMarksforSymbolsFont}{\fontwrapdefaultfont} + +\newcommand{\unicodeblockCombiningDiacriticalMarksSupplementFont}{\fontwrapdefaultfont} + +\newcommand{\unicodeblockCombiningHalfMarksFont}{\fontwrapdefaultfont} + +\newcommand{\unicodeblockControlPicturesFont}{\fontwrapdefaultfont} + +\newcommand{\unicodeblockCopticFont}{\fontwrapdefaultfont} + +\newcommand{\unicodeblockCountingRodNumeralsFont}{\fontwrapdefaultfont} + +\newcommand{\unicodeblockCuneiformFont}{\fontwrapdefaultfont} + +\newcommand{\unicodeblockCuneiformNumbersandPunctuationFont}{\fontwrapdefaultfont} + +\newcommand{\unicodeblockCurrencySymbolsFont}{\fontwrapdefaultfont} + +\newcommand{\unicodeblockCypriotSyllabaryFont}{\fontwrapdefaultfont} + +\newcommand{\unicodeblockCyrillicFont}{\fontwrapdefaultfont} + +\newcommand{\unicodeblockCyrillicExtendedAFont}{\fontwrapdefaultfont} + +\newcommand{\unicodeblockCyrillicExtendedBFont}{\fontwrapdefaultfont} + +\newcommand{\unicodeblockCyrillicSupplementFont}{\fontwrapdefaultfont} + +\newcommand{\unicodeblockDeseretFont}{\fontwrapdefaultfont} + +\newcommand{\unicodeblockDevanagariFont}{\fontwrapdefaultfont} + +\newcommand{\unicodeblockDingbatsFont}{\fontwrapdefaultfont} + +\newcommand{\unicodeblockDominoTilesFont}{\fontwrapdefaultfont} + +\newcommand{\unicodeblockEnclosedAlphanumericsFont}{\fontwrapdefaultfont} + +\newcommand{\unicodeblockEnclosedCJKLettersandMonthsFont}{\fontwrapdefaultCJKfont} + +\newcommand{\unicodeblockEthiopicFont}{\fontwrapdefaultfont} + +\newcommand{\unicodeblockEthiopicExtendedFont}{\fontwrapdefaultfont} + +\newcommand{\unicodeblockEthiopicSupplementFont}{\fontwrapdefaultfont} + +\newcommand{\unicodeblockGeneralPunctuationFont}{\fontwrapdefaultfont} + +\newcommand{\unicodeblockGeometricShapesFont}{\fontwrapdefaultfont} + +\newcommand{\unicodeblockGeorgianFont}{\fontwrapdefaultfont} + +\newcommand{\unicodeblockGeorgianSupplementFont}{\fontwrapdefaultfont} + +\newcommand{\unicodeblockGlagoliticFont}{\fontwrapdefaultfont} + +\newcommand{\unicodeblockGothicFont}{\fontwrapdefaultfont} + +\newcommand{\unicodeblockGreekandCopticFont}{\fontwrapdefaultfont} + +\newcommand{\unicodeblockGreekExtendedFont}{\fontwrapdefaultfont} + +\newcommand{\unicodeblockGujaratiFont}{\fontwrapdefaultfont} + +\newcommand{\unicodeblockGurmukhiFont}{\fontwrapdefaultfont} + +\newcommand{\unicodeblockHalfwidthandFullwidthFormsFont}{\fontwrapdefaultCJKfont} + +\newcommand{\unicodeblockHangulCompatibilityJamoFont}{\fontwrapdefaultCJKfont} + +\newcommand{\unicodeblockHangulJamoFont}{\fontwrapdefaultCJKfont} + +\newcommand{\unicodeblockHangulSyllablesFont}{\fontwrapdefaultCJKfont} + +\newcommand{\unicodeblockHanunooFont}{\fontwrapdefaultfont} + +\newcommand{\unicodeblockHebrewFont}{\fontwrapdefaultfont} + +\newcommand{\unicodeblockHighPrivateUseSurrogatesFont}{\fontwrapdefaultfont} + +\newcommand{\unicodeblockHighSurrogatesFont}{\fontwrapdefaultfont} + +\newcommand{\unicodeblockIdeographicDescriptionCharactersFont}{\fontwrapdefaultCJKfont} + +\newcommand{\unicodeblockIPAExtensionsFont}{\fontwrapdefaultfont} + +\newcommand{\unicodeblockKanbunFont}{\fontwrapdefaultCJKfont} + +\newcommand{\unicodeblockKangxiRadicalsFont}{\fontwrapdefaultCJKfont} + +\newcommand{\unicodeblockKannadaFont}{\fontwrapdefaultfont} + +\newcommand{\unicodeblockKatakanaPhoneticExtensionsFont}{\fontwrapdefaultfont} + +\newcommand{\unicodeblockKharoshthiFont}{\fontwrapdefaultfont} + +\newcommand{\unicodeblockKhmerFont}{\fontwrapdefaultfont} + +\newcommand{\unicodeblockKhmerSymbolsFont}{\fontwrapdefaultfont} + +\newcommand{\unicodeblockLaoFont}{\fontwrapdefaultfont} + +\newcommand{\unicodeblockLatinExtendedAdditionalFont}{\fontwrapdefaultfont} + +\newcommand{\unicodeblockLatinExtendedAFont}{\fontwrapdefaultfont} + +\newcommand{\unicodeblockLatinExtendedBFont}{\fontwrapdefaultfont} + +\newcommand{\unicodeblockLatinExtendedCFont}{\fontwrapdefaultfont} + +\newcommand{\unicodeblockLatinExtendedDFont}{\fontwrapdefaultfont} + +% in keeping with uniformity, technically this should be unicodeblockLatin1SupplementFont, but numbers are not allowed in macro names... +\newcommand{\unicodeblockLatinSupplementFont}{\fontwrapdefaultfont} + +\newcommand{\unicodeblockLetterlikeSymbolsFont}{\fontwrapdefaultfont} + +\newcommand{\unicodeblockLimbuFont}{\fontwrapdefaultfont} + +\newcommand{\unicodeblockLinearBIdeogramsFont}{\fontwrapdefaultfont} + +\newcommand{\unicodeblockLinearBSyllabaryFont}{\fontwrapdefaultfont} + +\newcommand{\unicodeblockLowSurrogatesFont}{\fontwrapdefaultfont} + +\newcommand{\unicodeblockMahjongTilesFont}{\fontwrapdefaultfont} + +\newcommand{\unicodeblockMalayalamFont}{\fontwrapdefaultfont} + +\newcommand{\unicodeblockMathematicalAlphanumericSymbolsFont}{\fontwrapdefaultfont} + +\newcommand{\unicodeblockMathematicalOperatorsFont}{\fontwrapdefaultfont} + +\newcommand{\unicodeblockMiscellaneousMathematicalSymbolsAFont}{\fontwrapdefaultfont} + +\newcommand{\unicodeblockMiscellaneousMathematicalSymbolsBFont}{\fontwrapdefaultfont} + +\newcommand{\unicodeblockMiscellaneousSymbolsFont}{\fontwrapdefaultfont} + +\newcommand{\unicodeblockMiscellaneousSymbolsandArrowsFont}{\fontwrapdefaultfont} + +\newcommand{\unicodeblockMiscellaneousTechnicalFont}{\fontwrapdefaultfont} + +\newcommand{\unicodeblockModifierToneLettersFont}{\fontwrapdefaultfont} + +\newcommand{\unicodeblockMongolianFont}{\fontwrapdefaultfont} + +\newcommand{\unicodeblockMusicalSymbolsFont}{\fontwrapdefaultfont} + +\newcommand{\unicodeblockMyanmarFont}{\fontwrapdefaultfont} + +\newcommand{\unicodeblockNewTaiLueFont}{\fontwrapdefaultfont} + +\newcommand{\unicodeblockNKoFont}{\fontwrapdefaultfont} + +\newcommand{\unicodeblockNumberFormsFont}{\fontwrapdefaultfont} + +\newcommand{\unicodeblockOghamFont}{\fontwrapdefaultfont} + +\newcommand{\unicodeblockOldItalicFont}{\fontwrapdefaultfont} + +\newcommand{\unicodeblockOldPersianFont}{\fontwrapdefaultfont} + +\newcommand{\unicodeblockOpticalCharacterRecognitionFont}{\fontwrapdefaultfont} + +\newcommand{\unicodeblockOriyaFont}{\fontwrapdefaultfont} + +\newcommand{\unicodeblockOsmanyaFont}{\fontwrapdefaultfont} + +% because hyphens are also not allowed in macros, "Phags-pa" has been turned into the less correct PhagsPa +\newcommand{\unicodeblockPhagsPaFont}{\fontwrapdefaultfont} + +\newcommand{\unicodeblockPhoenicianFont}{\fontwrapdefaultfont} + +\newcommand{\unicodeblockPhoneticExtensionsFont}{\fontwrapdefaultfont} + +\newcommand{\unicodeblockPhoneticExtensionsSupplementFont}{\fontwrapdefaultfont} + +\newcommand{\unicodeblockPrivateUseAreaFont}{\fontwrapdefaultfont} + +\newcommand{\unicodeblockRunicFont}{\fontwrapdefaultfont} + +\newcommand{\unicodeblockShavianFont}{\fontwrapdefaultfont} + +\newcommand{\unicodeblockSinhalaFont}{\fontwrapdefaultfont} + +\newcommand{\unicodeblockSmallFormVariantsFont}{\fontwrapdefaultfont} + +\newcommand{\unicodeblockSpacingModifierLettersFont}{\fontwrapdefaultfont} + +\newcommand{\unicodeblockSpecialsFont}{\fontwrapdefaultfont} + +\newcommand{\unicodeblockSuperscriptsandSubscriptsFont}{\fontwrapdefaultfont} + +\newcommand{\unicodeblockSupplementalArrowsAFont}{\fontwrapdefaultfont} + +\newcommand{\unicodeblockSupplementalArrowsBFont}{\fontwrapdefaultfont} + +\newcommand{\unicodeblockSupplementalMathematicalOperatorsFont}{\fontwrapdefaultfont} + +\newcommand{\unicodeblockSupplementalPunctuationFont}{\fontwrapdefaultfont} + +\newcommand{\unicodeblockSupplementaryPrivateUseAreaAFont}{\fontwrapdefaultfont} + +\newcommand{\unicodeblockSupplementaryPrivateUseAreaBFont}{\fontwrapdefaultfont} + +\newcommand{\unicodeblockSylotiNagriFont}{\fontwrapdefaultfont} + +\newcommand{\unicodeblockSyriacFont}{\fontwrapdefaultfont} + +\newcommand{\unicodeblockTagalogFont}{\fontwrapdefaultfont} + +\newcommand{\unicodeblockTagbanwaFont}{\fontwrapdefaultfont} + +\newcommand{\unicodeblockTagsFont}{\fontwrapdefaultfont} + +\newcommand{\unicodeblockTaiLeFont}{\fontwrapdefaultfont} + +\newcommand{\unicodeblockTaiXuanJingSymbolsFont}{\fontwrapdefaultfont} + +\newcommand{\unicodeblockTamilFont}{\fontwrapdefaultfont} + +\newcommand{\unicodeblockTeluguFont}{\fontwrapdefaultfont} + +\newcommand{\unicodeblockThaanaFont}{\fontwrapdefaultfont} + +\newcommand{\unicodeblockThaiFont}{\fontwrapdefaultfont} + +\newcommand{\unicodeblockTibetanFont}{\fontwrapdefaultfont} + +\newcommand{\unicodeblockTifinaghFont}{\fontwrapdefaultfont} + +\newcommand{\unicodeblockUgariticFont}{\fontwrapdefaultfont} + +\newcommand{\unicodeblockUnifiedCanadianAboriginalSyllabicsFont}{\fontwrapdefaultfont} + +\newcommand{\unicodeblockVariationSelectorsFont}{\fontwrapdefaultfont} + +\newcommand{\unicodeblockVariationSelectorsSupplementFont}{\fontwrapdefaultfont} + +\newcommand{\unicodeblockVerticalFormsFont}{\fontwrapdefaultfont} + +\newcommand{\unicodeblockYiRadicalsFont}{\fontwrapdefaultCJKfont} + +\newcommand{\unicodeblockYiSyllablesFont}{\fontwrapdefaultCJKfont} + +\newcommand{\unicodeblockYijingHexagramSymbolsFont}{\fontwrapdefaultCJKfont} + +% +% I don't want to write a huge ifthen construction - I prefer +% to rely on parse passes instead. +% +\perlnewcommand{\setunicodeblockfont}[2]{ return "\\renewcommand{\\unicodeblock".$_[0]."Font}{".$_[1]."}"; } + +% ------------------------------------------------------------------ +% +% in addition to the unicode blocks, also mark the informal groups +% +% ------------------------------------------------------------------ + +\newcommand{\unicodegroupArabicFont}{\fontwrapdefaultfont} +\newcommand{\unicodegroupChineseFont}{\fontwrapdefaultCJKfont} +\newcommand{\unicodegroupCJKFont}{\fontwrapdefaultCJKfont} +\newcommand{\unicodegroupCyrillicFont}{\fontwrapdefaultfont} +\newcommand{\unicodegroupDiacriticsFont}{\fontwrapdefaultfont} +\newcommand{\unicodegroupGreekFont}{\fontwrapdefaultfont} +\newcommand{\unicodegroupKoreanFont}{\fontwrapdefaultCJKfont} +\newcommand{\unicodegroupJapaneseFont}{\fontwrapdefaultCJKfont} +\newcommand{\unicodegroupLatinFont}{\fontwrapdefaultfont} +\newcommand{\unicodegroupMathematicsFont}{\fontwrapdefaultfont} +\newcommand{\unicodegroupPhoneticsFont}{\fontwrapdefaultfont} +\newcommand{\unicodegroupPunctuationFont}{\fontwrapdefaultfont} +\newcommand{\unicodegroupSymbolsFont}{\fontwrapdefaultfont} +\newcommand{\unicodegroupYiFont}{\fontwrapdefaultfont} +\newcommand{\unicodegroupOtherFont}{\fontwrapdefaultfont} + +% ------------------------------------------------------------------------------- +% +% Then, informal group font binding, to make life just a little easier. +% The following informal groups are supported: +% +% - Arabic +% - Chinese (including bopomofo) +% - CJK (Chinese/Japanese/Korean) +% - Cyrillic +% - Diacritics +% - Greek +% - Japanese +% - Korean (=Hangul) +% - Latin +% - Mathematics +% - Phonetics +% - Punctuation +% - Symbols +% - Yi +% - Other (I am not a fan of lump groups. I hope to un-lump most of it) +% +% ------------------------------------------------------------------------------- + + +\newcommand{\setunicodegroupArabicFont}[1]{ + \renewcommand{\unicodeblockArabicFont}{#1} + \renewcommand{\unicodeblockArabicPresentationFormsAFont}{#1} + \renewcommand{\unicodeblockArabicPresentationFormsBFont}{#1} + \renewcommand{\unicodeblockArabicSupplementFont}{#1} + \renewcommand{\unicodegroupArabicFont}{#1} +} + +\newcommand{\setunicodegroupChineseFont}[1]{ + \renewcommand{\unicodeblockBopomofoFont}{#1} + \renewcommand{\unicodeblockBopomofoExtendedFont}{#1} + \renewcommand{\unicodeblockCJKCompatibilityFont}{#1} + \renewcommand{\unicodeblockCJKCompatibilityFormsFont}{#1} + \renewcommand{\unicodeblockCJKCompatibilityIdeographsFont}{#1} + \renewcommand{\unicodeblockCJKCompatibilityIdeographsSupplementFont}{#1} + \renewcommand{\unicodeblockCJKRadicalsSupplementFont}{#1} + \renewcommand{\unicodeblockCJKStrokesFont}{#1} + \renewcommand{\unicodeblockCJKSymbolsandPunctuationFont}{#1} + \renewcommand{\unicodeblockCJKUnifiedIdeographsFont}{#1} + \renewcommand{\unicodeblockCJKUnifiedIdeographsExtensionAFont}{#1} + \renewcommand{\unicodeblockCJKUnifiedIdeographsExtensionBFont}{#1} + \renewcommand{\unicodeblockEnclosedCJKLettersandMonthsFont}{#1} + \renewcommand{\unicodeblockIdeographicDescriptionCharactersFont}{#1} + \renewcommand{\unicodeblockKangxiRadicalsFont}{#1} + \renewcommand{\unicodegroupChineseFont}{#1} +} + +\newcommand{\setunicodegroupCJKFont}[1]{ + \renewcommand{\unicodeblockBopomofoFont}{#1} + \renewcommand{\unicodeblockBopomofoExtendedFont}{#1} + \renewcommand{\unicodeblockCJKCompatibilityFont}{#1} + \renewcommand{\unicodeblockCJKCompatibilityFormsFont}{#1} + \renewcommand{\unicodeblockCJKCompatibilityIdeographsFont}{#1} + \renewcommand{\unicodeblockCJKCompatibilityIdeographsSupplementFont}{#1} + \renewcommand{\unicodeblockCJKRadicalsSupplementFont}{#1} + \renewcommand{\unicodeblockCJKStrokesFont}{#1} + \renewcommand{\unicodeblockCJKSymbolsandPunctuationFont}{#1} + \renewcommand{\unicodeblockCJKUnifiedIdeographsFont}{#1} + \renewcommand{\unicodeblockCJKUnifiedIdeographsExtensionAFont}{#1} + \renewcommand{\unicodeblockCJKUnifiedIdeographsExtensionBFont}{#1} + \renewcommand{\unicodeblockEnclosedCJKLettersandMonthsFont}{#1} + \renewcommand{\unicodeblockHalfwidthandFullwidthFormsFont}{#1} + \renewcommand{\unicodeblockHangulCompatibilityJamoFont}{#1} + \renewcommand{\unicodeblockHangulJamoFont}{#1} + \renewcommand{\unicodeblockHangulSyllablesFont}{#1} + \renewcommand{\unicodeblockHiraganaFont}{#1} + \renewcommand{\unicodeblockIdeographicDescriptionCharactersFont}{#1} + \renewcommand{\unicodeblockKanbunFont}{#1} + \renewcommand{\unicodeblockKangxiRadicalsFont}{#1} + \renewcommand{\unicodeblockKatakanaFont}{#1} + \renewcommand{\unicodeblockKatakanaPhoneticExtensionsFont}{#1} + \renewcommand{\unicodegroupCJKFont}{#1} +} + +\newcommand{\setunicodegroupCyrillicFont}[1]{ + \renewcommand{\unicodeblockCyrillicFont}{#1} + \renewcommand{\unicodeblockCyrillicExtendedAFont}{#1} + \renewcommand{\unicodeblockCyrillicExtendedBFont}{#1} + \renewcommand{\unicodeblockCyrillicSupplementFont}{#1} + \renewcommand{\unicodegroupCyrillicFont}{#1} +} + +\newcommand{\setunicodegroupDiacriticsFont}[1]{ + \renewcommand{\unicodeblockCombiningDiacriticalMarksFont}{#1} + \renewcommand{\unicodeblockCombiningDiacriticalMarksforSymbolsFont}{#1} + \renewcommand{\unicodeblockCombiningDiacriticalMarksSupplementFont}{#1} + \renewcommand{\unicodeblockCombiningHalfMarksFont}{#1} + \renewcommand{\unicodegroupDiacriticsFont}{#1} +} + +\newcommand{\setunicodegroupGreekFont}[1]{ + \renewcommand{\unicodeblockGreekandCopticFont}{#1} + \renewcommand{\unicodeblockGreekExtendedFont}{#1} + \renewcommand{\unicodegroupGreekFont}{#1} +} + +\newcommand{\setunicodegroupKoreanFont}[1]{ + \renewcommand{\unicodeblockHangulCompatibilityJamoFont}{#1} + \renewcommand{\unicodeblockHangulJamoFont}{#1} + \renewcommand{\unicodeblockHangulSyllablesFont}{#1} + \renewcommand{\unicodegroupKoreanFont}{#1} +} + +\newcommand{\setunicodegroupJapaneseFont}[1]{ + \renewcommand{\unicodeblockHalfwidthandFullwidthFormsFont}{#1} + \renewcommand{\unicodeblockHiraganaFont}{#1} + \renewcommand{\unicodeblockKanbunFont}{#1} + \renewcommand{\unicodeblockKatakanaFont}{#1} + \renewcommand{\unicodeblockKatakanaPhoneticExtensionsFont}{#1} + \renewcommand{\unicodeblockKangxiRadicalsFont}{#1} + \renewcommand{\unicodegroupJapaneseFont}{#1} +} + +\newcommand{\setunicodegroupLatinFont}[1]{ + \renewcommand{\unicodeblockBasicLatinFont}{#1} + \renewcommand{\unicodeblockLatinExtendedAdditionalFont}{#1} + \renewcommand{\unicodeblockLatinExtendedAFont}{#1} + \renewcommand{\unicodeblockLatinExtendedBFont}{#1} + \renewcommand{\unicodeblockLatinExtendedCFont}{#1} + \renewcommand{\unicodeblockLatinExtendedDFont}{#1} + \renewcommand{\unicodeblockLatinSupplementFont}{#1} + \renewcommand{\unicodeblockAlphabeticPresentationFormsFont}{#1} + \renewcommand{\unicodegroupLatinFont}{#1} +} + +\newcommand{\setunicodegroupMathematicsFont}[1]{ + \renewcommand{\unicodeblockMathematicalAlphanumericSymbolsFont}{#1} + \renewcommand{\unicodeblockMathematicalOperatorsFont}{#1} + \renewcommand{\unicodeblockMiscellaneousMathematicalSymbolsAFont}{#1} + \renewcommand{\unicodeblockMiscellaneousMathematicalSymbolsBFont}{#1} + \renewcommand{\unicodeblockSupplementalMathematicalOperatorsFont}{#1} + \renewcommand{\unicodegroupMathematicsFont}{#1} +} + +\newcommand{\setunicodegroupPhoneticsFont}[1]{ + \renewcommand{\unicodeblockIPAExtensionsFont}{#1} + \renewcommand{\unicodeblockPhoneticExtensionsFont}{#1} + \renewcommand{\unicodeblockPhoneticExtensionsSupplementFont}{#1} + \renewcommand{\unicodegroupPhoneticsFont}{#1} +} + +\newcommand{\setunicodegroupPunctuationFont}[1]{ + \renewcommand{\unicodeblockGeneralPunctuationFont}{#1} + \renewcommand{\unicodeblockSupplementalPunctuationFont}{#1} + \renewcommand{\unicodegroupPunctuationFont}{#1} +} + +\newcommand{\setunicodegroupSymbolsFont}[1]{ + \renewcommand{\unicodeblockArrowsFont}{#1} + \renewcommand{\unicodeblockBoxDrawingFont}{#1} + \renewcommand{\unicodeblockByzantineMusicalSymbolsFont}{#1} + \renewcommand{\unicodeblockControlPicturesFont}{#1} + \renewcommand{\unicodeblockCurrencySymbolsFont}{#1} + \renewcommand{\unicodeblockGeometricShapesFont}{#1} + \renewcommand{\unicodeblockLetterlikeSymbolsFont}{#1} + \renewcommand{\unicodeblockMiscellaneousSymbolsFont}{#1} + \renewcommand{\unicodeblockMiscellaneousSymbolsandArrowsFont}{#1} + \renewcommand{\unicodeblockMiscellaneousTechnicalFont}{#1} + \renewcommand{\unicodeblockSupplementalArrowsAFont}{#1} + \renewcommand{\unicodeblockSupplementalArrowsBFont}{#1} + \renewcommand{\unicodeblockVariationSelectorsFont}{#1} + \renewcommand{\unicodeblockVariationSelectorsSupplementFont}{#1} + \renewcommand{\unicodegroupSymbolsFont}{#1} +} + +\newcommand{\setunicodegroupYiFont}[1]{ + \renewcommand{\unicodeblockYiRadicalsFont}{#1} + \renewcommand{\unicodeblockYiSyllablesFont}{#1} + \renewcommand{\unicodegroupYiFont}{#1} +} + +\newcommand{\setunicodegroupOtherFont}[1]{ + \renewcommand{\unicodeblockAegeanNumbersFont}{#1} + \renewcommand{\unicodeblockAncientGreekMusicalNotationFont}{#1} + \renewcommand{\unicodeblockAncientGreekNumbersFont}{#1} + \renewcommand{\unicodeblockArmenianFont}{#1} + \renewcommand{\unicodeblockBalineseFont}{#1} + \renewcommand{\unicodeblockBengaliFont}{#1} + \renewcommand{\unicodeblockBlockElementsFont}{#1} + \renewcommand{\unicodeblockBraillePatternsFont}{#1} + \renewcommand{\unicodeblockBugineseFont}{#1} + \renewcommand{\unicodeblockBuhidFont}{#1} + \renewcommand{\unicodeblockCherokeeFont}{#1} + \renewcommand{\unicodeblockCopticFont}{#1} + \renewcommand{\unicodeblockCountingRodNumeralsFont}{#1} + \renewcommand{\unicodeblockCuneiformFont}{#1} + \renewcommand{\unicodeblockCuneiformNumbersandPunctuationFont}{#1} + \renewcommand{\unicodeblockCypriotSyllabaryFont}{#1} + \renewcommand{\unicodeblockDeseretFont}{#1} + \renewcommand{\unicodeblockDevanagariFont}{#1} + \renewcommand{\unicodeblockDingbatsFont}{#1} + \renewcommand{\unicodeblockDominoTilesFont}{#1} + \renewcommand{\unicodeblockEnclosedAlphanumericsFont}{#1} + \renewcommand{\unicodeblockEthiopicFont}{#1} + \renewcommand{\unicodeblockEthiopicExtendedFont}{#1} + \renewcommand{\unicodeblockEthiopicSupplementFont}{#1} + \renewcommand{\unicodeblockGeorgianFont}{#1} + \renewcommand{\unicodeblockGeorgianSupplementFont}{#1} + \renewcommand{\unicodeblockGlagoliticFont}{#1} + \renewcommand{\unicodeblockGothicFont}{#1} + \renewcommand{\unicodeblockGujaratiFont}{#1} + \renewcommand{\unicodeblockGurmukhiFont}{#1} + \renewcommand{\unicodeblockHanunooFont}{#1} + \renewcommand{\unicodeblockHebrewFont}{#1} + \renewcommand{\unicodeblockHighPrivateUseSurrogatesFont}{#1} + \renewcommand{\unicodeblockHighSurrogatesFont}{#1} + \renewcommand{\unicodeblockKannadaFont}{#1} + \renewcommand{\unicodeblockKharoshthiFont}{#1} + \renewcommand{\unicodeblockKhmerFont}{#1} + \renewcommand{\unicodeblockKhmerSymbolsFont}{#1} + \renewcommand{\unicodeblockLaoFont}{#1} + \renewcommand{\unicodeblockLimbuFont}{#1} + \renewcommand{\unicodeblockLinearBIdeogramsFont}{#1} + \renewcommand{\unicodeblockLinearBSyllabaryFont}{#1} + \renewcommand{\unicodeblockLowSurrogatesFont}{#1} + \renewcommand{\unicodeblockMahjongTilesFont}{#1} + \renewcommand{\unicodeblockMalayalamFont}{#1} + \renewcommand{\unicodeblockModifierToneLettersFont}{#1} + \renewcommand{\unicodeblockMongolianFont}{#1} + \renewcommand{\unicodeblockMusicalSymbolsFont}{#1} + \renewcommand{\unicodeblockMyanmarFont}{#1} + \renewcommand{\unicodeblockNewTaiLueFont}{#1} + \renewcommand{\unicodeblockNKoFont}{#1} + \renewcommand{\unicodeblockNumberFormsFont}{#1} + \renewcommand{\unicodeblockOghamFont}{#1} + \renewcommand{\unicodeblockOldItalicFont}{#1} + \renewcommand{\unicodeblockOldPersianFont}{#1} + \renewcommand{\unicodeblockOpticalCharacterRecognitionFont}{#1} + \renewcommand{\unicodeblockOriyaFont}{#1} + \renewcommand{\unicodeblockOsmanyaFont}{#1} + \renewcommand{\unicodeblockPhagsPaFont}{#1} + \renewcommand{\unicodeblockPhoenicianFont}{#1} + \renewcommand{\unicodeblockPrivateUseAreaFont}{#1} + \renewcommand{\unicodeblockRunicFont}{#1} + \renewcommand{\unicodeblockShavianFont}{#1} + \renewcommand{\unicodeblockSinhalaFont}{#1} + \renewcommand{\unicodeblockSmallFormVariantsFont}{#1} + \renewcommand{\unicodeblockSpacingModifierLettersFont}{#1} + \renewcommand{\unicodeblockSpecialsFont}{#1} + \renewcommand{\unicodeblockSuperscriptsandSubscriptsFont}{#1} + \renewcommand{\unicodeblockSupplementaryPrivateUseAreaAFont}{#1} + \renewcommand{\unicodeblockSupplementaryPrivateUseAreaBFont}{#1} + \renewcommand{\unicodeblockSylotiNagriFont}{#1} + \renewcommand{\unicodeblockSyriacFont}{#1} + \renewcommand{\unicodeblockTagalogFont}{#1} + \renewcommand{\unicodeblockTagbanwaFont}{#1} + \renewcommand{\unicodeblockTagsFont}{#1} + \renewcommand{\unicodeblockTaiLeFont}{#1} + \renewcommand{\unicodeblockTaiXuanJingSymbolsFont}{#1} + \renewcommand{\unicodeblockTamilFont}{#1} + \renewcommand{\unicodeblockTeluguFont}{#1} + \renewcommand{\unicodeblockThaanaFont}{#1} + \renewcommand{\unicodeblockThaiFont}{#1} + \renewcommand{\unicodeblockTibetanFont}{#1} + \renewcommand{\unicodeblockTifinaghFont}{#1} + \renewcommand{\unicodeblockUgariticFont}{#1} + \renewcommand{\unicodeblockUnifiedCanadianAboriginalSyllabicsFont}{#1} + \renewcommand{\unicodeblockVerticalFormsFont}{#1} + \renewcommand{\unicodeblockYijingHexagramSymbolsFont}{#1} + \renewcommand{\unicodegroupOtherFont}{#1} +} + +\newcommand{\setfontwrapdefaultfont}[1]{ + \setunicodegroupArabicFont{#1} + \setunicodegroupCJKFont{#1} + \setunicodegroupCyrillicFont{#1} + \setunicodegroupDiacriticsFont{#1} + \setunicodegroupGreekFont{#1} + \setunicodegroupLatinFont{#1} + \setunicodegroupMathematicsFont{#1} + \setunicodegroupPhoneticsFont{#1} + \setunicodegroupPunctuationFont{#1} + \setunicodegroupSymbolsFont{#1} + \setunicodegroupYiFont{#1} + \setunicodegroupOtherFont{#1} +} + +% +% I don't want to write a huge ifthen construction here either +% +\perlnewcommand{\setunicodegroupfont}[2]{ return "\\setunicodegroup".$_[0]."Font{".$_[1]."}"; } + + +% ------------------------------------------------------------------------------------ +% +% then, the actual block data definitions. These consist of a comma delimited list of: +% +% - unicode block name +% - informal group the block is in +% - codepoint of the first glyph in the block, in hexadecimal notation +% - codepoint of the last glyph in the block, in hexadecimal notation +% - number of glyphs in the block +% - font macro, which is passed as macro argument +% +% ------------------------------------------------------------------------------------ + +\newcommand{\unicodeblockAegeanNumbers}[1]{Aegean Numbers,Other,10100,1013F,57,#1} + +\newcommand{\unicodeblockAlphabeticPresentationForms}[1]{Alphabetic Presentation Forms,Ligatures,FB00,FB4F,58,#1} + +\newcommand{\unicodeblockAncientGreekMusicalNotation}[1]{Ancient Greek Musical Notation,Other,1D200,1D24F,70,#1} + +\newcommand{\unicodeblockAncientGreekNumbers}[1]{Ancient Greek Numbers,Other,10140,1018F,75,#1} + +\newcommand{\unicodeblockArabic}[1]{Arabic,Arabic,0600,06FF,235,#1} + +\newcommand{\unicodeblockArabicPresentationFormsA}[1]{Arabic Presentation Forms-A,Arabic,FB50,FDFF,595,#1} + +\newcommand{\unicodeblockArabicPresentationFormsB}[1]{Arabic Presentation Forms-B,Arabic,FE70,FEFF,141,#1} + +\newcommand{\unicodeblockArabicSupplement}[1]{Arabic Supplement,Arabic,0750,077F,30,#1} + +\newcommand{\unicodeblockArmenian}[1]{Armenian,Other,0530,058F,86,#1} + +\newcommand{\unicodeblockArrows}[1]{Arrows,Symbols,2190,21FF,112,#1} + +\newcommand{\unicodeblockBalinese}[1]{Balinese,Other,1B00,1B7F,121,#1} + +\newcommand{\unicodeblockBasicLatin}[1]{Basic Latin,Latin,0000,007F,128,#1} + +\newcommand{\unicodeblockBengali}[1]{Bengali,Other,0980,09FF,91,#1} + +\newcommand{\unicodeblockBlockElements}[1]{Block Elements,Other,2580,259F,32,#1} + +\newcommand{\unicodeblockBopomofo}[1]{Bopomofo,Bopomofo,3100,312F,40,#1} + +\newcommand{\unicodeblockBopomofoExtended}[1]{Bopomofo Extended,Bopomofo,31A0,31BF,24,#1} + +\newcommand{\unicodeblockBoxDrawing}[1]{Box Drawing,Symbols,2500,257F,128,#1} + +\newcommand{\unicodeblockBraillePatterns}[1]{Braille Patterns,Other,2800,28FF,256,#1} + +\newcommand{\unicodeblockBuginese}[1]{Buginese,Other,1A00,1A1F,30,#1} + +\newcommand{\unicodeblockBuhid}[1]{Buhid,Other,1740,175F,20,#1} + +\newcommand{\unicodeblockByzantineMusicalSymbols}[1]{Byzantine Musical Symbols,Symbols,1D000,1D0FF,246,#1} + +\newcommand{\unicodeblockCherokee}[1]{Cherokee,Other,13A0,13FF,85,#1} + +\newcommand{\unicodeblockCJKCompatibility}[1]{CJK Compatibility,CJK,3300,33FF,256,#1} + +\newcommand{\unicodeblockCJKCompatibilityForms}[1]{CJK Compatibility Forms,CJK,FE30,FE4F,32,#1} + +\newcommand{\unicodeblockCJKCompatibilityIdeographs}[1]{CJK Compatibility Ideographs,CJK,F900,FAFF,467,#1} + +\newcommand{\unicodeblockCJKCompatibilityIdeographsSupplement}[1]{CJK Compatibility Ideographs Supplement,CJK,2F800,2FA1F,542,#1} + +\newcommand{\unicodeblockCJKRadicalsSupplement}[1]{CJK Radicals Supplement,CJK,2E80,2EFF,115,#1} + +\newcommand{\unicodeblockCJKStrokes}[1]{CJK Strokes,CJK,31C0,31EF,16,#1} + +\newcommand{\unicodeblockCJKSymbolsandPunctuation}[1]{CJK Symbols and Punctuation,CJK,3000,303F,64,#1} + +\newcommand{\unicodeblockCJKUnifiedIdeographs}[1]{CJK Unified Ideographs,CJK,4E00,9FFF,20924,#1} + +\newcommand{\unicodeblockCJKUnifiedIdeographsExtensionA}[1]{CJK Unified Ideographs Extension A,CJK,3400,4DBF,6582,#1} + +\newcommand{\unicodeblockCJKUnifiedIdeographsExtensionB}[1]{CJK Unified Ideographs Extension B,CJK,20000,2A6DF,42711,#1} + +\newcommand{\unicodeblockCombiningDiacriticalMarks}[1]{Combining Diacritical Marks,Diacritics,0300,036F,112,#1} + +\newcommand{\unicodeblockCombiningDiacriticalMarksforSymbols}[1]{Combining Diacritical Marks for Symbols,Diacritics,20D0,20FF,32,#1} + +\newcommand{\unicodeblockCombiningDiacriticalMarksSupplement}[1]{Combining Diacritical Marks Supplement,Diacritics,1DC0,1DFF,13,#1} + +\newcommand{\unicodeblockCombiningHalfMarks}[1]{Combining Half Marks,Diacritics,FE20,FE2F,4,#1} + +\newcommand{\unicodeblockControlPictures}[1]{Control Pictures,Symbols,2400,243F,39,#1} + +\newcommand{\unicodeblockCoptic}[1]{Coptic,Other,2C80,2CFF,114,#1} + +\newcommand{\unicodeblockCountingRodNumerals}[1]{Counting Rod Numerals,Other,1D360,1D37F,18,#1} + +\newcommand{\unicodeblockCuneiform}[1]{Cuneiform,Other,12000,123FF,879,#1} + +\newcommand{\unicodeblockCuneiformNumbersandPunctuation}[1]{Cuneiform Numbers and Punctuation,Other,12400,1247F,103,#1} + +\newcommand{\unicodeblockCurrencySymbols}[1]{Currency Symbols,Symbols,20A0,20CF,22,#1} + +\newcommand{\unicodeblockCypriotSyllabary}[1]{Cypriot Syllabary,Other,10800,1083F,55,#1} + +\newcommand{\unicodeblockCyrillic}[1]{Cyrillic,Cyrillic,0400,04FF,255,#1} + +\newcommand{\unicodeblockCyrillicExtendedA}[1]{Cyrillic Extended-A,Cyrillic,2DE0,2DFF,32,#1} + +\newcommand{\unicodeblockCyrillicExtendedB}[1]{Cyrillic Extended-B,Cyrillic,A640,A69f,78,#1} + +\newcommand{\unicodeblockCyrillicSupplement}[1]{Cyrillic Supplement,Cyrillic,0500,052F,20,#1} + +\newcommand{\unicodeblockDeseret}[1]{Deseret,Other,10400,1044F,80,#1} + +\newcommand{\unicodeblockDevanagari}[1]{Devanagari,Other,0900,097F,110,#1} + +\newcommand{\unicodeblockDingbats}[1]{Dingbats,Other,2700,27BF,174,#1} + +\newcommand{\unicodeblockDominoTiles}[1]{Domino Tiles,Other,1F030,1F09F,100,#1} + +\newcommand{\unicodeblockEnclosedAlphanumerics}[1]{Enclosed Alphanumerics,Other,2460,24FF,160,#1} + +\newcommand{\unicodeblockEnclosedCJKLettersandMonths}[1]{Enclosed CJK Letters and Months,CJK,3200,32FF,242,#1} + +\newcommand{\unicodeblockEthiopic}[1]{Ethiopic,Other,1200,137F,356,#1} + +\newcommand{\unicodeblockEthiopicExtended}[1]{Ethiopic Extended,Other,2D80,2DDF,79,#1} + +\newcommand{\unicodeblockEthiopicSupplement}[1]{Ethiopic Supplement,Other,1380,139F,26,#1} + +\newcommand{\unicodeblockGeneralPunctuation}[1]{General Punctuation,Punctuation,2000,206F,106,#1} + +\newcommand{\unicodeblockGeometricShapes}[1]{Geometric Shapes,Symbols,25A0,25FF,96,#1} + +\newcommand{\unicodeblockGeorgian}[1]{Georgian,Other,10A0,10FF,83,#1} + +\newcommand{\unicodeblockGeorgianSupplement}[1]{Georgian Supplement,Other,2D00,2D2F,38,#1} + +\newcommand{\unicodeblockGlagolitic}[1]{Glagolitic,Other,2C00,2C5F,94,#1} + +\newcommand{\unicodeblockGothic}[1]{Gothic,Other,10330,1034F,27,#1} + +\newcommand{\unicodeblockGreekandCoptic}[1]{Greek and Coptic,Greek,0370,03FF,127,#1} + +\newcommand{\unicodeblockGreekExtended}[1]{Greek Extended,Greek,1F00,1FFF,233,#1} + +\newcommand{\unicodeblockGujarati}[1]{Gujarati,Other,0A80,0AFF,83,#1} + +\newcommand{\unicodeblockGurmukhi}[1]{Gurmukhi,Other,0A00,0A7F,77,#1} + +\newcommand{\unicodeblockHalfwidthandFullwidthForms}[1]{Halfwidth and Fullwidth Forms,CJK,FF00,FFEF,225,#1} + +\newcommand{\unicodeblockHangulCompatibilityJamo}[1]{Hangul Compatibility Jamo,Hangul,3130,318F,94,#1} + +\newcommand{\unicodeblockHangulJamo}[1]{Hangul Jamo,Hangul,1100,11FF,240,#1} + +\newcommand{\unicodeblockHangulSyllables}[1]{Hangul Syllables,Hangul,AC00,D7AF,2,#1} + +\newcommand{\unicodeblockHanunoo}[1]{Hanunoo,Other,1720,173F,23,#1} + +\newcommand{\unicodeblockHebrew}[1]{Hebrew,Other,0590,05FF,87,#1} + +\newcommand{\unicodeblockHighPrivateUseSurrogates}[1]{High Private Use Surrogates,Other,DB80,DBFF,2,#1} + +\newcommand{\unicodeblockHighSurrogates}[1]{High Surrogates,Other,D800,DB7F,2,#1} + +\newcommand{\unicodeblockHiragana}[1]{Hiragana,CJK,3040,309F,93,#1} + +\newcommand{\unicodeblockIdeographicDescriptionCharacters}[1]{Ideographic Description Characters,CJK,2FF0,2FFF,12,#1} + +\newcommand{\unicodeblockIPAExtensions}[1]{IPA Extensions,Phonetics,0250,02AF,96,#1} + +\newcommand{\unicodeblockKanbun}[1]{Kanbun,CJK,3190,319F,16,#1} + +\newcommand{\unicodeblockKangxiRadicals}[1]{Kangxi Radicals,CJK,2F00,2FDF,214,#1} + +\newcommand{\unicodeblockKannada}[1]{Kannada,Other,0C80,0CFF,86,#1} + +\newcommand{\unicodeblockKatakana}[1]{Katakana,CJK,30A0,30FF,96,#1} + +\newcommand{\unicodeblockKatakanaPhoneticExtensions}[1]{Katakana Phonetic Extensions,CJK,31F0,31FF,16,#1} + +\newcommand{\unicodeblockKharoshthi}[1]{Kharoshthi,Other,10A00,10A5F,65,#1} + +\newcommand{\unicodeblockKhmer}[1]{Khmer,Other,1780,17FF,114,#1} + +\newcommand{\unicodeblockKhmerSymbols}[1]{Khmer Symbols,Other,19E0,19FF,32,#1} + +\newcommand{\unicodeblockLao}[1]{Lao,Other,0E80,0EFF,65,#1} + +\newcommand{\unicodeblockLatinExtendedAdditional}[1]{Latin Extended Additional,Latin,1E00,1EFF,246,#1} + +\newcommand{\unicodeblockLatinExtendedA}[1]{Latin Extended-A,Latin,0100,017F,128,#1} + +\newcommand{\unicodeblockLatinExtendedB}[1]{Latin Extended-B,Latin,0180,024F,208,#1} + +\newcommand{\unicodeblockLatinExtendedC}[1]{Latin Extended-C,Latin,2C60,2C7F,17,#1} + +\newcommand{\unicodeblockLatinExtendedD}[1]{Latin Extended-D,Latin,A720,A7FF,2,#1} + +\newcommand{\unicodeblockLatinSupplement}[1]{Latin-1 Supplement,Latin,0080,00FF,128,#1} + +\newcommand{\unicodeblockLetterlikeSymbols}[1]{Letterlike Symbols,Symbols,2100,214F,79,#1} + +\newcommand{\unicodeblockLimbu}[1]{Limbu,Other,1900,194F,66,#1} + +\newcommand{\unicodeblockLinearBIdeograms}[1]{Linear B Ideograms,Other,10080,100FF,123,#1} + +\newcommand{\unicodeblockLinearBSyllabary}[1]{Linear B Syllabary,Other,10000,1007F,88,#1} + +\newcommand{\unicodeblockLowSurrogates}[1]{Low Surrogates,Other,DC00,DFFF,2,#1} + +\newcommand{\unicodeblockMahjongTiles}[1]{Mahjong Tiles,Other,1F000,1F02F,44,#1} + +\newcommand{\unicodeblockMalayalam}[1]{Malayalam,Other,0D00,0D7F,78,#1} + +\newcommand{\unicodeblockMathematicalAlphanumericSymbols}[1]{Mathematical Alphanumeric Symbols,Mathematics,1D400,1D7FF,996,#1} + +\newcommand{\unicodeblockMathematicalOperators}[1]{Mathematical Operators,Mathematics,2200,22FF,256,#1} + +\newcommand{\unicodeblockMiscellaneousMathematicalSymbolsA}[1]{Miscellaneous Mathematical Symbols-A,Mathematics,27C0,27EF,39,#1} + +\newcommand{\unicodeblockMiscellaneousMathematicalSymbolsB}[1]{Miscellaneous Mathematical Symbols-B,Mathematics,2980,29FF,128,#1} + +\newcommand{\unicodeblockMiscellaneousSymbols}[1]{Miscellaneous Symbols,Symbols,2600,26FF,176,#1} + +\newcommand{\unicodeblockMiscellaneousSymbolsandArrows}[1]{Miscellaneous Symbols and Arrows,Symbols,2B00,2BFF,31,#1} + +\newcommand{\unicodeblockMiscellaneousTechnical}[1]{Miscellaneous Technical,Symbols,2300,23FF,232,#1} + +\newcommand{\unicodeblockModifierToneLetters}[1]{Modifier Tone Letters,Other,A700,A71F,27,#1} + +\newcommand{\unicodeblockMongolian}[1]{Mongolian,Other,1800,18AF,155,#1} + +\newcommand{\unicodeblockMusicalSymbols}[1]{Musical Symbols,Other,1D100,1D1FF,219,#1} + +\newcommand{\unicodeblockMyanmar}[1]{Myanmar,Other,1000,109F,78,#1} + +\newcommand{\unicodeblockNewTaiLue}[1]{New Tai Lue,Other,1980,19DF,80,#1} + +\newcommand{\unicodeblockNKo}[1]{NKo,Other,07C0,07FF,59,#1} + +\newcommand{\unicodeblockNumberForms}[1]{Number Forms,Other,2150,218F,50,#1} + +\newcommand{\unicodeblockOgham}[1]{Ogham,Other,1680,169F,29,#1} + +\newcommand{\unicodeblockOldItalic}[1]{Old Italic,Other,10300,1032F,35,#1} + +\newcommand{\unicodeblockOldPersian}[1]{Old Persian,Other,103A0,103DF,50,#1} + +\newcommand{\unicodeblockOpticalCharacterRecognition}[1]{Optical Character Recognition,Other,2440,245F,11,#1} + +\newcommand{\unicodeblockOriya}[1]{Oriya,Other,0B00,0B7F,81,#1} + +\newcommand{\unicodeblockOsmanya}[1]{Osmanya,Other,10480,104AF,40,#1} + +\newcommand{\unicodeblockPhagsPa}[1]{PhagsPa,Other,A840,A87F,56,#1} + +\newcommand{\unicodeblockPhoenician}[1]{Phoenician,Other,10900,1091F,27,#1} + +\newcommand{\unicodeblockPhoneticExtensions}[1]{Phonetic Extensions,Phonetics,1D00,1D7F,128,#1} + +\newcommand{\unicodeblockPhoneticExtensionsSupplement}[1]{Phonetic Extensions Supplement,Phonetics,1D80,1DBF,64,#1} + +\newcommand{\unicodeblockPrivateUseArea}[1]{Private Use Area,Other,E000,F8FF,2,#1} + +\newcommand{\unicodeblockRunic}[1]{Runic,Other,16A0,16FF,81,#1} + +\newcommand{\unicodeblockShavian}[1]{Shavian,Other,10450,1047F,48,#1} + +\newcommand{\unicodeblockSinhala}[1]{Sinhala,Other,0D80,0DFF,80,#1} + +\newcommand{\unicodeblockSmallFormVariants}[1]{Small Form Variants,Other,FE50,FE6F,26,#1} + +\newcommand{\unicodeblockSpacingModifierLetters}[1]{Spacing Modifier Letters,Other,02B0,02FF,80,#1} + +\newcommand{\unicodeblockSpecials}[1]{Specials,Other,FFF0,FFFF,5,#1} + +\newcommand{\unicodeblockSuperscriptsandSubscripts}[1]{Superscripts and Subscripts,Other,2070,209F,34,#1} + +\newcommand{\unicodeblockSupplementalArrowsA}[1]{Supplemental Arrows-A,Symbols,27F0,27FF,16,#1} + +\newcommand{\unicodeblockSupplementalArrowsB}[1]{Supplemental Arrows-B,Symbols,2900,297F,128,#1} + +\newcommand{\unicodeblockSupplementalMathematicalOperators}[1]{Supplemental Mathematical Operators,Mathematics,2A00,2AFF,256,#1} + +\newcommand{\unicodeblockSupplementalPunctuation}[1]{Supplemental Punctuation,Punctuation,2E00,2E7F,26,#1} + +\newcommand{\unicodeblockSupplementaryPrivateUseAreaA}[1]{Supplementary Private Use Area-A,Other,F0000,FFFFF,2,#1} + +\newcommand{\unicodeblockSupplementaryPrivateUseAreaB}[1]{Supplementary Private Use Area-B,Other,100000,10FFFF,2,#1} + +\newcommand{\unicodeblockSylotiNagri}[1]{Syloti Nagri,Other,A800,A82F,44,#1} + +\newcommand{\unicodeblockSyriac}[1]{Syriac,Other,0700,074F,77,#1} + +\newcommand{\unicodeblockTagalog}[1]{Tagalog,Other,1700,171F,20,#1} + +\newcommand{\unicodeblockTagbanwa}[1]{Tagbanwa,Other,1760,177F,18,#1} + +\newcommand{\unicodeblockTags}[1]{Tags,Other,E0000,E007F,97,#1} + +\newcommand{\unicodeblockTaiLe}[1]{Tai Le,Other,1950,197F,35,#1} + +\newcommand{\unicodeblockTaiXuanJingSymbols}[1]{Tai Xuan Jing Symbols,Other,1D300,1D35F,87,#1} + +\newcommand{\unicodeblockTamil}[1]{Tamil,Other,0B80,0BFF,71,#1} + +\newcommand{\unicodeblockTelugu}[1]{Telugu,Other,0C00,0C7F,80,#1} + +\newcommand{\unicodeblockThaana}[1]{Thaana,Other,0780,07BF,50,#1} + +\newcommand{\unicodeblockThai}[1]{Thai,Other,0E00,0E7F,87,#1} + +\newcommand{\unicodeblockTibetan}[1]{Tibetan,Other,0F00,0FFF,195,#1} + +\newcommand{\unicodeblockTifinagh}[1]{Tifinagh,Other,2D30,2D7F,55,#1} + +\newcommand{\unicodeblockUgaritic}[1]{Ugaritic,Other,10380,1039F,31,#1} + +\newcommand{\unicodeblockUnifiedCanadianAboriginalSyllabics}[1]{Unified Canadian Aboriginal Syllabics,Other,1400,167F,630,#1} + +\newcommand{\unicodeblockVariationSelectors}[1]{Variation Selectors,Symbols,FE00,FE0F,16,#1} + +\newcommand{\unicodeblockVariationSelectorsSupplement}[1]{Variation Selectors Supplement,Symbols,E0100,E01EF,240,#1} + +\newcommand{\unicodeblockVerticalForms}[1]{Vertical Forms,Other,FE10,FE1F,10,#1} + +\newcommand{\unicodeblockYiRadicals}[1]{Yi Radicals,Yi,A490,A4CF,55,#1} + +\newcommand{\unicodeblockYiSyllables}[1]{Yi Syllables,Yi,A000,A48F,1165,#1} + +\newcommand{\unicodeblockYijingHexagramSymbols}[1]{Yijing Hexagram Symbols,Other,4DC0,4DFF,64,#1} + +% ------------------------------------------------------- +% +% And finally, the macro that generates the whole zwiq +% +% ------------------------------------------------------- + +\newcommand{\autfontunicodedata}{ + % these first four blocks have been ordered for fast resolution by the perl script, + % because the list of blocks is checked in order. + + \unicodeblockBasicLatin{ \unicodeblockBasicLatinFont } + + \unicodeblockHiragana{ \unicodeblockHiraganaFont } + + \unicodeblockCJKUnifiedIdeographs{ \unicodeblockCJKUnifiedIdeographsFont } + + \unicodeblockKatakana{ \unicodeblockKatakanaFont } + + \unicodeblockAegeanNumbers{ \unicodeblockAegeanNumbersFont } + + \unicodeblockAlphabeticPresentationForms{ \unicodeblockAlphabeticPresentationFormsFont } + + \unicodeblockAncientGreekMusicalNotation{ \unicodeblockAncientGreekMusicalNotationFont } + + \unicodeblockAncientGreekNumbers{ \unicodeblockAncientGreekNumbersFont } + + \unicodeblockArabic{ \unicodeblockArabicFont } + + \unicodeblockArabicPresentationFormsA{ \unicodeblockArabicPresentationFormsAFont } + + \unicodeblockArabicPresentationFormsB{ \unicodeblockArabicPresentationFormsBFont } + + \unicodeblockArabicSupplement{ \unicodeblockArabicSupplementFont } + + \unicodeblockArmenian{ \unicodeblockArmenianFont } + + \unicodeblockArrows{ \unicodeblockArrowsFont } + + \unicodeblockBalinese{ \unicodeblockBalineseFont } + + \unicodeblockBengali{ \unicodeblockBengaliFont } + + \unicodeblockBlockElements{ \unicodeblockBlockElementsFont } + + \unicodeblockBopomofo{ \unicodeblockBopomofoFont } + + \unicodeblockBopomofoExtended{ \unicodeblockBopomofoExtendedFont } + + \unicodeblockBoxDrawing{ \unicodeblockBoxDrawingFont } + + \unicodeblockBraillePatterns{ \unicodeblockBraillePatternsFont } + + \unicodeblockBuginese{ \unicodeblockBugineseFont } + + \unicodeblockBuhid{ \unicodeblockBuhidFont } + + \unicodeblockByzantineMusicalSymbols{ \unicodeblockByzantineMusicalSymbolsFont } + + \unicodeblockCherokee{ \unicodeblockCherokeeFont } + + \unicodeblockCJKCompatibility{ \unicodeblockCJKCompatibilityFont } + + \unicodeblockCJKCompatibilityForms{ \unicodeblockCJKCompatibilityFormsFont } + + \unicodeblockCJKCompatibilityIdeographs{ \unicodeblockCJKCompatibilityIdeographsFont } + + \unicodeblockCJKCompatibilityIdeographsSupplement{ \unicodeblockCJKCompatibilityIdeographsSupplementFont } + + \unicodeblockCJKRadicalsSupplement{ \unicodeblockCJKRadicalsSupplementFont } + + \unicodeblockCJKStrokes{ \unicodeblockCJKStrokesFont } + + \unicodeblockCJKSymbolsandPunctuation{ \unicodeblockCJKSymbolsandPunctuationFont } + + \unicodeblockCJKUnifiedIdeographsExtensionA{ \unicodeblockCJKUnifiedIdeographsExtensionAFont } + + \unicodeblockCJKUnifiedIdeographsExtensionB{ \unicodeblockCJKUnifiedIdeographsExtensionBFont } + + \unicodeblockCombiningDiacriticalMarks{ \unicodeblockCombiningDiacriticalMarksFont } + + \unicodeblockCombiningDiacriticalMarksforSymbols{ \unicodeblockCombiningDiacriticalMarksforSymbolsFont } + + \unicodeblockCombiningDiacriticalMarksSupplement{ \unicodeblockCombiningDiacriticalMarksSupplementFont } + + \unicodeblockCombiningHalfMarks{ \unicodeblockCombiningHalfMarksFont } + + \unicodeblockControlPictures{ \unicodeblockControlPicturesFont } + + \unicodeblockCoptic{ \unicodeblockCopticFont } + + \unicodeblockCountingRodNumerals{ \unicodeblockCountingRodNumeralsFont } + + \unicodeblockCuneiform{ \unicodeblockCuneiformFont } + + \unicodeblockCuneiformNumbersandPunctuation{ \unicodeblockCuneiformNumbersandPunctuationFont } + + \unicodeblockCurrencySymbols{ \unicodeblockCurrencySymbolsFont } + + \unicodeblockCypriotSyllabary{ \unicodeblockCypriotSyllabaryFont } + + \unicodeblockCyrillic{ \unicodeblockCyrillicFont } + + \unicodeblockCyrillicExtendedA{ \unicodeblockCyrillicExtendedAFont } + + \unicodeblockCyrillicExtendedB{ \unicodeblockCyrillicExtendedBFont } + + \unicodeblockCyrillicSupplement{ \unicodeblockCyrillicSupplementFont } + + \unicodeblockDeseret{ \unicodeblockDeseretFont } + + \unicodeblockDevanagari{ \unicodeblockDevanagariFont } + + \unicodeblockDingbats{ \unicodeblockDingbatsFont } + + \unicodeblockDominoTiles{ \unicodeblockDominoTilesFont } + + \unicodeblockEnclosedAlphanumerics{ \unicodeblockEnclosedAlphanumericsFont } + + \unicodeblockEnclosedCJKLettersandMonths{ \unicodeblockEnclosedCJKLettersandMonthsFont } + + \unicodeblockEthiopic{ \unicodeblockEthiopicFont } + + \unicodeblockEthiopicExtended{ \unicodeblockEthiopicExtendedFont } + + \unicodeblockEthiopicSupplement{ \unicodeblockEthiopicSupplementFont } + + \unicodeblockGeneralPunctuation{ \unicodeblockGeneralPunctuationFont } + + \unicodeblockGeometricShapes{ \unicodeblockGeometricShapesFont } + + \unicodeblockGeorgian{ \unicodeblockGeorgianFont } + + \unicodeblockGeorgianSupplement{ \unicodeblockGeorgianSupplementFont } + + \unicodeblockGlagolitic{ \unicodeblockGlagoliticFont } + + \unicodeblockGothic{ \unicodeblockGothicFont } + + \unicodeblockGreekandCoptic{ \unicodeblockGreekandCopticFont } + + \unicodeblockGreekExtended{ \unicodeblockGreekExtendedFont } + + \unicodeblockGujarati{ \unicodeblockGujaratiFont } + + \unicodeblockGurmukhi{ \unicodeblockGurmukhiFont } + + \unicodeblockHalfwidthandFullwidthForms{ \unicodeblockHalfwidthandFullwidthFormsFont } + + \unicodeblockHangulCompatibilityJamo{ \unicodeblockHangulCompatibilityJamoFont } + + \unicodeblockHangulJamo{ \unicodeblockHangulJamoFont } + + \unicodeblockHangulSyllables{ \unicodeblockHangulSyllablesFont } + + \unicodeblockHanunoo{ \unicodeblockHanunooFont } + + \unicodeblockHebrew{ \unicodeblockHebrewFont } + + \unicodeblockHighPrivateUseSurrogates{ \unicodeblockHighPrivateUseSurrogatesFont } + + \unicodeblockHighSurrogates{ \unicodeblockHighSurrogatesFont } + + \unicodeblockIdeographicDescriptionCharacters{ \unicodeblockIdeographicDescriptionCharactersFont } + + \unicodeblockIPAExtensions{ \unicodeblockIPAExtensionsFont } + + \unicodeblockKanbun{ \unicodeblockKanbunFont } + + \unicodeblockKangxiRadicals{ \unicodeblockKangxiRadicalsFont } + + \unicodeblockKannada{ \unicodeblockKannadaFont } + + \unicodeblockKatakanaPhoneticExtensions{ \unicodeblockKatakanaPhoneticExtensionsFont } + + \unicodeblockKharoshthi{ \unicodeblockKharoshthiFont } + + \unicodeblockKhmer{ \unicodeblockKhmerFont } + + \unicodeblockKhmerSymbols{ \unicodeblockKhmerSymbolsFont } + + \unicodeblockLao{ \unicodeblockLaoFont } + + \unicodeblockLatinExtendedAdditional{ \unicodeblockLatinExtendedAdditionalFont } + + \unicodeblockLatinExtendedA{ \unicodeblockLatinExtendedAFont } + + \unicodeblockLatinExtendedB{ \unicodeblockLatinExtendedBFont } + + \unicodeblockLatinExtendedC{ \unicodeblockLatinExtendedCFont } + + \unicodeblockLatinExtendedD{ \unicodeblockLatinExtendedDFont } + + \unicodeblockLatinSupplement{ \unicodeblockLatinSupplementFont } + + \unicodeblockLetterlikeSymbols{ \unicodeblockLetterlikeSymbolsFont } + + \unicodeblockLimbu{ \unicodeblockLimbuFont } + + \unicodeblockLinearBIdeograms{ \unicodeblockLinearBIdeogramsFont } + + \unicodeblockLinearBSyllabary{ \unicodeblockLinearBSyllabaryFont } + + \unicodeblockLowSurrogates{ \unicodeblockLowSurrogatesFont } + + \unicodeblockMahjongTiles{ \unicodeblockMahjongTilesFont } + + \unicodeblockMalayalam{ \unicodeblockMalayalamFont } + + \unicodeblockMathematicalAlphanumericSymbols{ \unicodeblockMathematicalAlphanumericSymbolsFont } + + \unicodeblockMathematicalOperators{ \unicodeblockMathematicalOperatorsFont } + + \unicodeblockMiscellaneousMathematicalSymbolsA{ \unicodeblockMiscellaneousMathematicalSymbolsAFont } + + \unicodeblockMiscellaneousMathematicalSymbolsB{ \unicodeblockMiscellaneousMathematicalSymbolsBFont } + + \unicodeblockMiscellaneousSymbols{ \unicodeblockMiscellaneousSymbolsFont } + + \unicodeblockMiscellaneousSymbolsandArrows{ \unicodeblockMiscellaneousSymbolsandArrowsFont } + + \unicodeblockMiscellaneousTechnical{ \unicodeblockMiscellaneousTechnicalFont } + + \unicodeblockModifierToneLetters{ \unicodeblockModifierToneLettersFont } + + \unicodeblockMongolian{ \unicodeblockMongolianFont } + + \unicodeblockMusicalSymbols{ \unicodeblockMusicalSymbolsFont } + + \unicodeblockMyanmar{ \unicodeblockMyanmarFont } + + \unicodeblockNewTaiLue{ \unicodeblockNewTaiLueFont } + + \unicodeblockNKo{ \unicodeblockNKoFont } + + \unicodeblockNumberForms{ \unicodeblockNumberFormsFont } + + \unicodeblockOgham{ \unicodeblockOghamFont } + + \unicodeblockOldItalic{ \unicodeblockOldItalicFont } + + \unicodeblockOldPersian{ \unicodeblockOldPersianFont } + + \unicodeblockOpticalCharacterRecognition{ \unicodeblockOpticalCharacterRecognitionFont } + + \unicodeblockOriya{ \unicodeblockOriyaFont } + + \unicodeblockOsmanya{ \unicodeblockOsmanyaFont } + + \unicodeblockPhagsPa{ \unicodeblockPhagsPaFont } + + \unicodeblockPhoenician{ \unicodeblockPhoenicianFont } + + \unicodeblockPhoneticExtensions{ \unicodeblockPhoneticExtensionsFont } + + \unicodeblockPhoneticExtensionsSupplement{ \unicodeblockPhoneticExtensionsSupplementFont } + + \unicodeblockPrivateUseArea{ \unicodeblockPrivateUseAreaFont } + + \unicodeblockRunic{ \unicodeblockRunicFont } + + \unicodeblockShavian{ \unicodeblockShavianFont } + + \unicodeblockSinhala{ \unicodeblockSinhalaFont } + + \unicodeblockSmallFormVariants{ \unicodeblockSmallFormVariantsFont } + + \unicodeblockSpacingModifierLetters{ \unicodeblockSpacingModifierLettersFont } + + \unicodeblockSpecials{ \unicodeblockSpecialsFont } + + \unicodeblockSuperscriptsandSubscripts{ \unicodeblockSuperscriptsandSubscriptsFont } + + \unicodeblockSupplementalArrowsA{ \unicodeblockSupplementalArrowsAFont } + + \unicodeblockSupplementalArrowsB{ \unicodeblockSupplementalArrowsBFont } + + \unicodeblockSupplementalMathematicalOperators{ \unicodeblockSupplementalMathematicalOperatorsFont } + + \unicodeblockSupplementalPunctuation{ \unicodeblockSupplementalPunctuationFont } + + \unicodeblockSupplementaryPrivateUseAreaA{ \unicodeblockSupplementaryPrivateUseAreaAFont } + + \unicodeblockSupplementaryPrivateUseAreaB{ \unicodeblockSupplementaryPrivateUseAreaBFont } + + \unicodeblockSylotiNagri{ \unicodeblockSylotiNagriFont } + + \unicodeblockSyriac{ \unicodeblockSyriacFont } + + \unicodeblockTagalog{ \unicodeblockTagalogFont } + + \unicodeblockTagbanwa{ \unicodeblockTagbanwaFont } + + \unicodeblockTags{ \unicodeblockTagsFont } + + \unicodeblockTaiLe{ \unicodeblockTaiLeFont } + + \unicodeblockTaiXuanJingSymbols{ \unicodeblockTaiXuanJingSymbolsFont } + + \unicodeblockTamil{ \unicodeblockTamilFont } + + \unicodeblockTelugu{ \unicodeblockTeluguFont } + + \unicodeblockThaana{ \unicodeblockThaanaFont } + + \unicodeblockThai{ \unicodeblockThaiFont } + + \unicodeblockTibetan{ \unicodeblockTibetanFont } + + \unicodeblockTifinagh{ \unicodeblockTifinaghFont } + + \unicodeblockUgaritic{ \unicodeblockUgariticFont } + + \unicodeblockUnifiedCanadianAboriginalSyllabics{ \unicodeblockUnifiedCanadianAboriginalSyllabicsFont } + + \unicodeblockVariationSelectors{ \unicodeblockVariationSelectorsFont } + + \unicodeblockVariationSelectorsSupplement{ \unicodeblockVariationSelectorsSupplementFont } + + \unicodeblockVerticalForms{ \unicodeblockVerticalFormsFont } + + \unicodeblockYiRadicals{ \unicodeblockYiRadicalsFont } + + \unicodeblockYiSyllables{ \unicodeblockYiSyllablesFont } + + \unicodeblockYijingHexagramSymbols{ \unicodeblockYijingHexagramSymbolsFont } + +} + + +% ---------------------------------------------------------- +% +% After all this unicode font and data stuff, the perl +% program for placing fontspec codes appropriately is +% defined in a \perlautolang 'macro', which is wrapped +% by the \fontwrap macro, which passes it the text it +% needs to add font macros into, and the list of unicode +% block data entries, with appropriate font macros loaded. +% +% ---------------------------------------------------------- + +% +% The list of macros fontwrap is allowed to go inside of, to add font +% renew this command to actually get things to happen =) +% + +\newcommand{\fontwrapallowedmacros}{} +\newcommand{\setfontwrapallowedmacros}[1]{\renewcommand{\fontwrapallowedmacros}{#1}} + +% +% The list of environments fontwrap is allowed to go inside of, to add font +% renew this command to actually get things to happen =) +% + +\newcommand{\fontwrapallowedenvironments}{} +\newcommand{\setfontwrapallowedenvironments}[1]{\renewcommand{\fontwrapallowedenvironments}{#1}} + + +% +% Normally it doesn't matter that (Xe)(La)TeX strips all the whitespace when +% running through a command, but in settings where it is of the utmost +% importance that they are preserved, you should wrap the text in the +% fontwrap equivalent of the verbatim environment: "verbatimfontwrap". +% + +\newenvironment{verbatimfontwrap}{\begingroup \obeylines \obeyspaces}{\endgroup} + +% +% a wrapper to the perl command. Feeds it both the text to wrap, +% and the unicode block data, with font bindings. +% + +\newcommand{\fontwrap}[1]{ + \perlfontwrap{#1}{\autfontunicodedata}{\fontwrapallowedmacros}{\fontwrapallowedenvironments} +} + +% +% the language detection/font insertion command +% + +\perlnewcommand{\perlfontwrap}[4]{ + + # the input text + $text = $_[0]; + + # all the unicode data + $blockdata = &trim($_[1]); + + # the list of macros we're allowed to process the content of + @args = split(/,/,&trim($_[2])); + foreach $am (@args) { $allowedmacros{$am}='1'; } + + # the list of environments we're allowed to process the content of + @args = split(/,/,&trim($_[3])); + foreach $am (@args) { $allowedenvironments{$am}='1'; } + + # clear + @args=(); + + # Also, I know these two look silly. Without them, checks on $swapped break... + $true=1; + $false=0; + + # ------------------------------------------------ + # Create the unicode block data array-of-arrays. + # This is essentially an array with on each position + # a list representing a unicode block. The data is + # is organised as: + # + # [0] - block name + # [1] - informal group name + # [2] - first codepoint in the block (in hex) + # [3] - last codepoint in the block (in hex) + # [4] - number of glyphs in the block + # [5] - font bound to this block + # + # mostly for my personal ease of code-use, these + # indices are never used numerically, instead I + # will use indicatively named variables. + # ----------------------------------------------- + + $idx_blockname=0; + $idx_groupname=1; + $idx_start=2; + $idx_end=3; + $idx_glyphs=4; + $idx_font=5; + + $unicodeblockcount=0; + @lines = split(/\\par /,$blockdata); + for $i (0 .. @lines) { + $line = &trim($lines[$i]); + # skip any comments + if(substr($line,0,1) eq chr(35) || $line eq '') { next; } + else { + ($blockname,$groupname,$start,$end,$glyphs,$font) = split(/,/,$line); + $unicodeblocks[$unicodeblockcount++] = [$blockname,$groupname,$start,$end,$glyphs,(&trim($font) ne '')?&trim($font):'fontwrapdefaultfont']; + } + } + + + # ---------------------------------------------------------------------- + # + # Miscellaneous subroutines + # + # ---------------------------------------------------------------------- + + + # + # very simple trim function + # + sub trim { + my $string = shift; + $string =~ s/^\s+//; + $string =~ s/\s+$//; + return $string } + + + # + # checks if the passed byte indicates the start of a new unicode glyph + # + sub isnewglyph { + $byte = shift; + # in utf8 context, anything that isn't 10xxxxxxx is a new byte + return (ord($byte)<128 || ord($byte)>191); } + + + # + # detemines the hexadecimal location of the passed glyph + # in the unicode 5.0 space + # + sub codepoint { + @utf_lead_bytes = (0,0,192,224,240,248,252); + @utf_first_byte = (0,7,5,4,3,2,1); + @utf_total_bits = (0,7,11,16,21,26,31); + @bytes=split(//,shift); + $blength = @bytes; + + # if we're dealing with a single byte, its ordinal value can be obtained by calling ord() directly + if($blength==1) { $ordinal = ord($bytes[0]); } + + # ---------------------------------------------------------------------------- + # + # UTF8 byte layout: + # + # U-00000000 ... U-0000007F = 0xxxxxxx + # U-00000080 ... U-000007FF = 110xxxxx 10xxxxxx + # U-00000800 ... U-0000FFFF = 1110xxxx 10xxxxxx 10xxxxxx + # U-00010000 ... U-001FFFFF = 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx + # U-00200000 ... U-03FFFFFF = 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx + # U-04000000 ... U-7FFFFFFF = 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx + # + # After 2,147,483,648 characters, we run out of UTF8 places... then again, even if there + # are languages with tens of thousands of characters (42 thousand for the unified CJK + # block extended B, for instance), it's really hard to fill 2 billion glyphs. Even + # if all currently used languages had 100,000 letters, that would only use up a little + # over a quarter of all UTF8 spots available... and most languages have less than 250 + # characters. + # + # ---------------------------------------------------------------------------- + + # if there are more bytes, we need to play by the UTF8 rules + else + { + # handle first byte + $bpos = 0; + $baseval = ord($bytes[0]) - $utf_lead_bytes[$blength]; # remove the first byte mask (see list above) + $basepower = 2**(6*($blength-1)); # this number starts at bit 1+6*(bytes-1), because bytes 2-> are 6 bits + $ordinal = $baseval * $basepower; # fairly obvious calculation + + # handle further bytes + for($bpos=1;$bpos<$blength;$bpos++) { + $baseval = ord($bytes[$bpos]) - 128; # remove the 10xxxxxx mask that 'followup' utf8 bytes have + $basepower = 2**(6*($blength-($bpos+1))); # this number starts at bit 1+6*((bytes-currentpos)-1) + $ordinal += $baseval * $basepower; } # again, fairly obvious calculation + } + + # return uppercase hex representation + $hexval = sprintf("%x",$ordinal); + if(length($hexval)%2!=0) { $hexval = "0".$hexval; } # add a leading zero (purely cosmetic) + return uc($hexval); # return in uppercase (again, purely cosmetic) + } + + + # + # appends the output string with the passed string. + # + sub appendoutput + { + $string=shift; + $rewritten .= $string; + } + + + # ---------------------------------------------------------------------- + # + # Font changing subroutine + # + # ---------------------------------------------------------------------- + + + sub attemptfontchange + { + $glyphblock{'blockname'} = 'unknown...'; + $cp = &codepoint($glyph); + + # check which unicode block this character is in + for($pos=0;$pos<$unicodeblockcount;$pos++) { + # add '0' padding to the codepoint if necessary + $ncp = ("0" x (length($unicodeblocks[$pos][$idx_start]) - length($cp))) . $cp; + $higher = $ncp cmp $unicodeblocks[$pos][$idx_start]; + $lower = $ncp cmp $unicodeblocks[$pos][$idx_end]; + # if within range, we found the right unicode block + if($higher>=0 && $lower <=0) { + $glyphblock = $unicodeblocks[$pos][$idx_blockname]; + $glyphfont = $unicodeblocks[$pos][$idx_font]; + last; }} + + # if this differs from what we were already in, add a fontchange code if we need to, and set currentblock to the new block + if($glyphblock ne $currentblock) { + if($currentfont ne $glyphfont) { + &appendoutput("\\fontspec{".$glyphfont."}"); + $currentfont=$glyphfont; + $swapped=$true; } + $currentblock=$glyphblock; } + + # if we swapped fonts, and the next glyph was a space, escape it for good measure. + if($swapped==1 && $glyph eq ' ') { &appendoutput("\\"); } + $swapped=$false; + } + + + + # ---------------------------------------------------------------------- + # + # Macro parsing support subroutines + # + # ---------------------------------------------------------------------- + + + # + # runs through the text array, extracting the macro's command. + # In case this was an argumented macro, the text pointer $i is + # moved to the first non-whitespace character after the macro + # name. If it was an argumentless macro, the pointer is set to + # directly after the macro name. + # + sub getmacrocommand { + for($i=$i+1;$i<@textarray;$i++) { + $glyph = $textarray[$i]; + if($glyph ne chr(123) && &trim($glyph) ne '') { + undef $textarray[$i]; + $macro .= $glyph; } + else { + # if glyph was whitespace, check if there is an argument list to come, or not. + if($glyph ne chr(123)) { + for($j=1;$j<@textarray;$j++) { + # non-whitespace: we need to stop. but do we need to discard the crossed whitespace? + if(&trim($textarray[$i+$j]) ne '') { + # if we found an argument list, we do. otherwise, we don't have to. + if($textarray[$i+$j] eq chr(123)) { $i=$i+$j; } + last; }} + } + $i--; + return $macro; }} + } + + # + # simply copies from the textarray to the rewritten string until we run out of macrobody. + # + sub copymacrotooutput + { + $depth=0; + for(;$i<@textarray;$i++) { + $glyph = $textarray[$i]; + $textarray[$i]=''; + if($depth==0 && &trim($glyph) eq '') { next; } + # { increments $depth, } decrements it. + if($glyph eq chr(123)) { $depth++;} + elsif($glyph eq chr(125)) { $depth--; } + $macrobody .= $glyph; + if($depth==0 && $glyph ne chr(123)) { + &appendoutput($macrobody); + $macrobody = ''; + if(&hasarguments) { + # recurse, for as many arguments as there are... + ©macrotooutput(); } + $i--; + last; }} + } + + + + # + # check whether a macro has arguments or not + # + sub hasarguments { + $j=$i; + for(;$j<@textarray;$j++) { + $check = $textarray[$j]; + if(&trim($check) ne '') { + return ($check eq chr(123)); }}} + + + # ---------------------------------------------------------------------- + # + # Environment parsing support subroutines + # + # ---------------------------------------------------------------------- + + + # + # runs through the text array, extracting the environments's name + # when this is done, $i will point to the glyph *after* the closing + # brace: + # + # \begin{environmentname} Whatever text + # L + # $i + # + sub getenvironment { + for($i=$i+1;$i<@textarray;$i++) { + $glyph = $textarray[$i]; + + # ignore opening brace and possible whitespace + if($glyph eq chr(123) || &trim($glyph) eq '') { next; } + + # something that's part of environment name + elsif($glyph ne chr(123) && $glyph ne chr(125) && &trim($glyph) ne '') { + $textarray[$i]=''; + $environment .= $glyph; } + + # because of the way environments are defined, this has to now + # be a closing brace... unless you messed up your TeX. + else { + if($glyph ne chr(125)) { die "You messed up your TeX - environment name \"".$environment."\" not followed by '".chr(125)."' but by '".$glyph."'!"; } + $i=$i+1; + return $environment; }} + } + + # + # copies from the textarray to the rewritten string until we hit \end{environment} + # + sub copyenvironmenttooutput + { + $environment=shift; + $environmentbody=''; + for(;$i<@textarray;$i++) { + $glyph = $textarray[$i]; + $textarray[$i]=''; + if($glyph eq chr(92)) { + $check=''; + for $j (1..3) { $check .= $textarray[$i+$j]; } + if($check eq 'end') { + # make sure this is the end tag for the right environment! + $checkenv=''; + $spaces=0; + # $i+1..3 was 'end', so the next read spot is at $i+4 + for($j=4;$j<@textarray;$j++) { + if(&trim($textarray[$i+$j]) eq '') { $spaces++; } + else { last; }} + + $start = 4+$spaces+1; + $end = $start + length($environment)-1; + for $j ($start .. $end) { $checkenv .= $textarray[$i+$j]; } + if($checkenv eq $environment) { + &appendoutput($environmentbody . "\\end{".$environment."}"); + $i = $i + length("end{".$environment."}")+1; + $environmentbody=''; + return; } + + # "end" macro, just not the right one. append glyph to environment body + else { $environmentbody .= $glyph; }} + # some marco that isn't "end": append glyph to body + else { $environmentbody .= $glyph; }} + # regular glyph... you guessed it: append + else { $environmentbody .= $glyph; }} + } + + + + # ---------------------------------------------------------------------- + # + # Macro parsing subroutine + # + # ---------------------------------------------------------------------- + + + # + # processes a LaTeX macro + # + sub processmacro + { + $macro = &getmacrocommand(); + # rather special macro + if($macro eq 'begin') { + $macro=''; + # find out which environment is being entered, whether we may work inside it + $environment = &getenvironment(); + &appendoutput("\\begin{" . $environment . "}"); + if($allowedenvironments{$environment} ne '') { + # allowed to process, which means we don't need to pay any special + # attention to end{environment} commands, as they'll be processed like + # any other macro (though you should not put them in the allowedmacro + # list, obviously :) + $environment=''; + return; } + else { + # not allowed to process environment. copy until we hit "\end{environment}" + ©environmenttooutput($environment); + $environment=''; } + return; } + else { + &appendoutput("\\" . $macro); + if($allowedmacros{$macro} ne '') { + # if we're allowed to work inside it, return so that the + # processing of glyphs continues as normal + $macro=''; + return; } + else { + $macro=''; + # not allowed to do anything with this content - write out any arguments if it has + # them and stop processing, returning to the toplevel processglyph subroutine + if(&hasarguments) { ©macrotooutput(); }}} + } + + + # ---------------------------------------------------------------------- + # + # Glyph parsing subroutines + # + # ---------------------------------------------------------------------- + + # + # processes one glyph + # + sub processglyph + { + # get the current glyph + $glyph = $textarray[$i]; + $textarray[$i]=''; # maintainance. progressively clears up a bit of mem + if($glyph eq '') { return; } # shortcut for the first, empty, split character in the array + + # if we find a '\', we process the text as macro. + if($glyph eq chr(92)) { + &processmacro(); + # after we process a macro, it will have already been inserted into the $rewritten string, so we just return. + return; } + + else { + # check if the font needs changing + &attemptfontchange(); + # finally, add the glyph to the $rewritten string + &appendoutput($glyph); } + } + + + # ---------------------------------------------------------------------- + # start running through the passed text. + # ---------------------------------------------------------------------- + + + # + # first off, convert the passed text into an array of unicode glyphs, so + # we can iterate over it letter by letter. + # + + @bytes = split(//,$text); + $text = ""; # maintenance. Saves a bit of memory. + $buffer=""; + @textarray=(); + foreach $byte (@bytes) { + if(&isnewglyph($byte)) { + push @textarray, $buffer; + $buffer=$byte; } + else { $buffer.=$byte; }} + push @textarray, $buffer; + @bytes=(); + + # + # At this point the text has been pulled apart as unicode glyphs, rather than just bytes, which means we can start walking through the array. + # + + $rewritten=''; + $currentblock='not set yet'; + $currentfont='not set yet'; + + # set the processing in motion (because all variables are persistent, + # this script runs through the text a like a finite state machine) + $i=0; + for(;$i<@textarray; $i++) { &processglyph(); } + + # + # perltex uses persistent variables, but in some cases frees the wrong threadpool's memory. + # as such, emptying the variables before exit is not a bad good idea, although normally + # you wouldn't bother with it this close to the return statement. + # + + undef $text; + undef @textarray; + undef $blockdata; + undef @args; + undef %allowedmacros; + undef %allowedenvironments; + undef $glyph; + undef $currentblock; + undef $currentfont; + undef $glyphblock; + undef $glyphfont; + undef $macro; + undef $macrobody; + undef $cp; + + # return the now font-tagged text + return $rewritten; +} + +% ---------------------------------------------------------------------------- +\endinput +% +% End of file `langfont.sty'.
\ No newline at end of file |