%% %% This is file 'bxcoloremoji.sty'. %% %% Copyright (c) 2017-2024 Takayuki YATO (aka. "ZR") %% GitHub: https://github.com/zr-tex8r %% Twitter: @zr_tex8r %% %% This package is distributed under the MIT License. %% %% package declarations \NeedsTeXFormat{LaTeX2e} \ProvidesPackage{bxcoloremoji}[2024/11/18 v1.0a] \def\bxce@pkgname{bxcoloremoji} \providecommand\bxDebug[1]{} %% code guard \edef\bxce@restore@codes{% \catcode33=\the\catcode33% \catcode34=\the\catcode34% \catcode39=\the\catcode39% \catcode43=\the\catcode43% \catcode45=\the\catcode45% \catcode46=\the\catcode46% \catcode47=\the\catcode47% \catcode58=\the\catcode58% \catcode59=\the\catcode59% \catcode60=\the\catcode60% \catcode62=\the\catcode62% \catcode63=\the\catcode63% \catcode96=\the\catcode96% \catcode124=\the\catcode124% \catcode126=\the\catcode126% \endlinechar=\the\endlinechar% \relax} \catcode33=12 % \catcode34=12 % <"> \catcode39=12 % <'> \catcode43=12 % <+> \catcode45=12 % <-> \catcode46=12 % <.> \catcode47=12 % \catcode58=12 % <:> \catcode59=12 % <;> \catcode60=12 % <<> \catcode62=12 % <>> \catcode63=12 % \catcode96=12 % <`> \catcode124=12 % <|> \catcode126=13 % <~> \AtEndOfPackage{% \bxce@restore@codes \let\bxce@restore@codes\relax} %--------------------------------------- public settings %% packages \RequirePackage{etoolbox}[2011/01/03]% v2.1 \RequirePackage{keyval} %% e-TeX check \ifx\numdef\@undefined % etoolbox is aborted % etoolbox has already issued an error \PackageWarningNoLine\bxce@pkgname {Package loading is aborted} \DeclareOption*{} \ProcessOptions* \expandafter\endinput\fi\relax %%<*D> \coloremojidir : base directory \newcommand*\coloremojidir{emoji_images/} \chardef\bxce@abool@@false=0 \chardef\bxce@abool@@auto=1 \chardef\bxce@abool@@true=2 %% switch bxce@nodvidriver@opt : is 'nodvidriver' given? \newbool{bxce@nodvidriver@opt} %% \bxce@bbparam@opt : 'bbparam' value \let\bxce@bbparam@opt\bxce@abool@@auto %% \bxce@jatype@opt : 'jatype' value \let\bxce@jatype@opt\bxce@abool@@auto %% switch bxce@names \newbool{bxce@names} \bxce@namestrue %% \bxce@preload@names@opt : 'preload-names' value \let\bxce@preload@names@opt\bxce@abool@@auto %% \bxce@bxghost@opt : 'bxghost' value \let\bxce@bxghost@opt\bxce@abool@@auto %% \bxce@output@type : output type \chardef\bxce@ot@@none=0 % no image \chardef\bxce@ot@@std=1 % use standard family \chardef\bxce@ot@@custom=2 % use custom family \chardef\bxce@ot@@twemojis=3 % use twemojis package \let\bxce@output@type\bxce@ot@@none %% switch bxce@use@pua \newbool{bxce@use@pua} %% switch bxce@twm@skip@tikz \newbool{bxce@twm@skip@tikz} \bxce@twm@skip@tikztrue %% bxce@family : image family \let\bxce@family\@undefined %% bxce@bb : image bbox \let\bxce@bb\relax %% bxce@ext : image file extension \let\bxce@ext\relax %% bxce@prefix : image file prefix \let\bxce@prefix\relax %% bxce@scale : image scale \def\bxce@scale{1} %% bxce@size : image size \let\bxce@size\@empty %% bxce@size@var : image size for *-form \let\bxce@size@var\@empty %% \bxce@count@from : starting value of emoji orders % (used in \coloremoji(code)successor(of)) \def\bxce@count@from{1} %% switch bxce@in@command % Whether the key process is for command options. \newif\ifbxce@in@command %% \bxce@opt@in@cmd{}{} % Process a key that is only valid in command options. \def\bxce@opt@in@cmd#1#2{% \ifbxce@in@command #2% \else \bxce@err@naopt{#1}% \fi } %% \bxce@expd{} % Fully-expands the code and runs it. \def\bxce@expd#1{% \edef\bxce@tmp@expd{#1}% \bxce@tmp@expd } %% \bxce@initialize@setup \def\bxce@initialize@setup{% \let\bxce@output@type\bxce@ot@@none \let\bxce@family\relax \let\bxce@bb\relax \let\bxce@ext\relax \let\bxce@prefix\relax } %% \bxce@warn@dpcmd \def\bxce@warn@dpcmd{% \PackageWarningNoLine\bxce@pkgname {Parameter '\string\coloremojidir' is DEPRECATED\MessageBreak and will be abolished in future, where\MessageBreak the parameter is ignored and regarded as\MessageBreak always empty}% } %% \bxce@warn@dpopt{} \def\bxce@warn@dpopt#1{% \PackageWarningNoLine\bxce@pkgname {Option '#1' is DEPRECATED\MessageBreak and will be abolished in future.\MessageBreak It might no longer work now}% } %% \bxce@err@ivval{}{} \def\bxce@err@ivval#1#2{% \PackageError\bxce@pkgname {Invalid value for key '#1' found\MessageBreak (#2)}% {\@eha}% } %% \bxce@err@naopt{} \def\bxce@err@naopt#1{% \PackageError\bxce@pkgname {You cannot use '#1' here}% {\@eha}% } %% \bxce@check@opt@key{}{}{}{}{} \def\bxce@check@opt@key#1#2#3#4#5{% \ifcsdef{#3#2}{#4}{%else \bxce@err@ivval{#1}{#2}% #5% }% } %% \bxce@invalidate@opt@key{} \def\bxce@invalidate@opt@key#1{% \define@key{bxce}{#1}[]{\bxce@err@naopt{#1}}% } %% family options \define@key{bxce}{no-image}[]{% \bxce@initialize@setup } \define@key{bxce}{twemoji-pdf}[]{% \bxce@use@custom@family{twemoji-pdf}% } \define@key{bxce}{twemoji-png}[]{% \bxce@use@custom@family{twemoji-png}% } %% 'twemojis' \define@key{bxce}{twemojis}[]{% \bxce@initialize@setup \let\bxce@output@type\bxce@ot@@twemojis \def\bxce@family{twemojis}% \def\bxce@bb{0 0 27 27}% } \define@key{bxce}{twitter}[]{% *DEPRECATED* \bxce@warn@dpopt{twitter}% \let\bxce@output@type\bxce@ot@@std \def\bxce@family{twitter}% \def\bxce@bb{0 0 38 38}% \def\bxce@ext{pdf}% \def\bxce@prefix{\coloremojidir twitter/}% } \define@key{bxce}{hires}[]{% *DEPRECATED* \bxce@warn@dpopt{hires}% \let\bxce@output@type\bxce@ot@@std \def\bxce@family{hires}% \def\bxce@bb{0 0 11.338600 11.338600}% \def\bxce@ext{pdf}% \def\bxce@prefix{\coloremojidir hires/}% } \define@key{bxce}{lowres}[]{% *DEPRECATED* \bxce@warn@dpopt{lowres}% \let\bxce@output@type\bxce@ot@@std \def\bxce@family{lowres}% \def\bxce@bb{0 0 4.535430 4.535430}% \def\bxce@ext{pdf}% \def\bxce@prefix{\coloremojidir lowres/}% } %% 'scale=' \define@key{bxce}{scale}{% \def\bxce@scale{#1}% } %% 'size=' \define@key{bxce}{size}{% \def\bxce@size{#1}% } %% 'size*=' \define@key{bxce}{size*}{% \def\bxce@size@var{#1}% } %% 'basedir=' \define@key{bxce}{basedir}{% *DEPRECATED* \bxce@warn@dpopt{basedir}% \def\coloremojidir{#1}% } %% 'bbparam=' \define@key{bxce}{bbparam}[true]{% \bxce@check@opt@key{bbparam}{#1}{bxce@abool@@}{% \letcs\bxce@bbparam@opt{bxce@abool@@#1}% }{}% } %% 'jatype=' \define@key{bxce}{jatype}[true]{% \bxce@check@opt@key{jatype}{#1}{bxce@abool@@}{% \letcs\bxce@jatype@opt{bxce@abool@@#1}% }{}% } %% 'names=' \define@key{bxce}{names}[true]{% \bxce@check@opt@key{names}{#1}{bxce@names}{% \csuse{bxce@names#1}% }{}% } %% 'preload-names=' \define@key{bxce}{preload-names}[true]{% \bxce@check@opt@key{preload-names}{#1}{bxce@abool@@}{% \letcs\bxce@preload@names@opt{bxce@abool@@#1}% }{}% } %% 'bxghost=' \define@key{bxce}{bxghost}[true]{% \bxce@check@opt@key{bxghost}{#1}{bxce@abool@@}{% \letcs\bxce@bxghost@opt{bxce@abool@@#1}% }{}% } %% 'pua=' \define@key{bxce}{pua}[true]{% \bxce@check@opt@key{pua}{#1}{bxce@use@pua}{% \csuse{bxce@use@pua#1}% }{}% } %% 'twemojis-skip-tikz=' \define@key{bxce}{twemojis-skip-tikz}[true]{% \bxce@check@opt@key{twemojis-skip-tikz}{#1}{bxce@twm@skip@tikz}{% \csuse{bxce@twm@skip@tikz#1}% }{}% } %% 'count-from=' \define@key{bxce}{count-from}{% \def\bxce@count@from{#1}% } %% 'family=' \define@key{bxce}{family}{% \bxce@use@custom@family{#1}% } % tentative definition, redefined later \def\bxce@use@custom@family#1{% \bxce@initialize@setup \let\bxce@output@type\bxce@ot@@custom \def\bxce@family{#1}% } %--------------------------------------- package options %% 'nodvidriver' \DeclareOption{nodvidriver}{% \bxce@nodvidriver@opttrue } %% 'resetdvidriver' \DeclareOption{resetdvidriver}{% \bxce@nodvidriver@optfalse } %% keyval options \DeclareOption*{% \bxce@expd{\noexpand\setkeys{bxce}{\CurrentOption}}% } %% dispatch \ProcessOptions* %% set default family \unless\ifdefined\bxce@family \setkeys{bxce}{twemojis} \fi %% invalidate some keys \bxce@invalidate@opt@key{basedir} \bxce@invalidate@opt@key{bbparam} \bxce@invalidate@opt@key{jatype} \bxce@invalidate@opt@key{names} \bxce@invalidate@opt@key{preload-names} \bxce@invalidate@opt@key{bxghost} \bxce@invalidate@opt@key{twemoji-skip-tikz} \AtBeginDocument{% \@tempswatrue \def\bxce@do{\ifx\coloremojidir\bxce@tmpa\@tempswafalse\fi}% \def\bxce@tmpa{emoji_images/}\bxce@do \let\bxce@tmpa\@empty\bxce@do \long\def\bxce@tmpa{}\bxce@do \if@tempswa \bxce@warn@dpcmd \fi } %--------------------------------------- environment check %% \bxce@engine : engine type \let\bxce@engine\relax %% switch 'bxce@jaok' : Japanese OK? \newbool{bxce@jaok} %% switch 'bxce@ptex' : engine is pTeX-ish? \newbool{bxce@ptex} %% switch 'bxce@ucs@avail' : '\ucs' (of pTeX) is available? \newbool{bxce@ucs@avail} %% switch 'bxce@luatexja' : LuaTeX-ja is loaded? \newbool{bxce@luatexja} %% switch 'bxce@CJK' : CJK is loaded? \newbool{bxce@CJK} %% switch 'bxce@inputenc' : use inputenc? \newbool{bxce@inputenc} %% switch 'bxce@use@image' : use images? \newbool{bxce@use@image} %% switch 'bxce@use@bb' : use bb parameter? \newbool{bxce@use@bb} %% switch 'bxce@bxghost' : use bxghost? \newbool{bxce@bxghost} %% set \bxce@engine \@onlypreamble\bxce@if@primitive \def\bxce@if@primitive#1#2{% \edef\bxce@tmpa{\string#1}\edef\bxce@tmpb{\meaning#1}% \ifx\bxce@tmpa\bxce@tmpb #2\fi } \let\bxce@engine=d \bxce@if@primitive\kanjiskip{\let\bxce@engine=p} \bxce@if@primitive\enablecjktoken{\let\bxce@engine=u} \bxce@if@primitive\XeTeXversion{\let\bxce@engine=x} \bxce@if@primitive\luatexversion{\let\bxce@engine=l} % Here upTeX whose internal kanji code is not Unicode % will be regarded as 'pTeX'. \if u\bxce@engine \ifnum\ucs"3000="3000 \else \let\bxce@engine=p\fi \fi %% set switch 'bxce@ptex' \bxce@ptexfalse \if p\bxce@engine \bxce@ptextrue \fi \if u\bxce@engine \bxce@ptextrue \fi % NB. bxce@luatexja will be set at \bxce@resolve@image@metric %% set switch 'bxce@ucs@avail' \bxce@ucs@availfalse \ifbxce@ptex \bxce@if@primitive\ucs{\bxce@ucs@availtrue} \fi %% \bxce@check@inputenc \let\bxce@check@inputenc\relax \ifnum0\ifbxce@ptex1\fi\ifx d\bxce@engine1\fi >0 \def\bxce@tmpa{utf8}% \ifx\inputencodingname\bxce@tmpa \bxce@inputenctrue \else\unless\ifx u\bxce@engine \def\bxce@check@inputenc{% \global\let\bxce@check@inputenc\relax \PackageError\bxce@pkgname {You must load 'inputenc' before this package\MessageBreak and use input encoding 'utf8'}\@ehc }% \fi\fi \fi %% set switch 'bxce@use@image' \unless\ifbxce@nodvidriver@opt \bxce@use@imagetrue \fi %% \bxce@resolve@image@setup \bxce@use@bbfalse \def\bxce@resolve@image@setup{% \global\let\bxce@resolve@image@setup\relax \ifbxce@use@image \@ifpackageloaded{graphicx}{}{%else \PackageError\bxce@pkgname {Package 'graphicx' is not loaded}\@ehc \global\bxce@use@imagefalse }% \fi \unless\ifbxce@use@image \else\ifnum\bxce@bbparam@opt=\bxce@abool@@true \global\bxce@use@bbtrue \else\ifnum\bxce@bbparam@opt=\bxce@abool@@auto \def\bxce@tmpa{dvipdfmx.def}% \ifx\Gin@driver\bxce@tmpa \global\bxce@use@bbtrue \fi \def\bxce@tmpa{dvipdfm.def}% \ifx\Gin@driver\bxce@tmpa \global\bxce@use@bbtrue \fi \fi\fi\fi \bxce@resolve@image@metric } \AtBeginDocument{\bxce@resolve@image@setup} % auto-load graphicx if possible \ifbxce@use@image % check if a global driver option is given \chardef\bxce@do\z@ \@for\bxce@tmpa:=\@classoptionslist\do{% \@for\bxce@tmpb:={dvipdfmx,dvipdfm,dvips}\do{% \ifx\bxce@tmpa\bxce@tmpb \chardef\bxce@do\@ne \fi } } \ifnum\ifdefined\pdfoutput \pdfoutput \else\ifdefined\outputmode \outputmode \else\ifx x\bxce@engine \@ne \else \bxce@do \fi\fi\fi >\z@ \RequirePackage{graphicx}[]% \@ifpackageloaded{xcolor}{}{%else \@ifl@t@r\fmtversion{2021/06/01}{% \RequirePackage{color}[]% }{}% } % if 'twemojis' option is given auto-load 'twemojis' package \ifnum\bxce@output@type=\bxce@ot@@twemojis \@ifpackageloaded{tikz}{\bxce@twm@skip@tikzfalse}{}% \ifbxce@twm@skip@tikz % avoid loading tikz in twemojis \cslet{ver@tikz.sty}\@empty \RequirePackage{twemojis}[]% \csundef{ver@tikz.sty}% \else \RequirePackage{twemojis}[]% \fi \@ifpackageloaded{twemojis}{}{%else % not installed, error is already issued \bxce@use@imagefalse } \fi \fi \fi %% set switch 'bxce@bxghost' \ifnum\bxce@jatype@opt=\bxce@abool@@false % skip \else\ifnum\bxce@bxghost@opt=\bxce@abool@@true \bxce@bxghosttrue \else\ifnum\bxce@bxghost@opt=\bxce@abool@@auto \@ifpackageloaded{luatexja}{\let\bxce@tmpa=t}{\let\bxce@tmpa=f} \if \ifbxce@ptex T\else\if t\bxce@tmpa T\else F\fi\fi T% \IfFileExists{bxghost-lib.sty}{\bxce@bxghosttrue}{} \fi \fi\fi\fi \ifbxce@bxghost \IfFileExists{bxghost-lib.sty}{% \RequirePackage{bxghost-lib}[]% }{%else \RequirePackage{bxghost}[]% } \unless\ifdefined\jghostguarded % not installed, error is already issued \bxce@bxghostfalse \fi \fi %--------------------------------------- helpers %% variables \newbool{bxce@ok} \newcount\bxce@cnta \newcount\bxce@cnto \let\bxce@arg\relax % (flags) %[bxce@f/ee] : error occurred in input text expansion %[bxce@f/jg] : ja-geta is needed in PDF strings %% unique tokens \def\bxce@end{\bxce@end@} \def\bxce@mt{\bxce@mt@} \let\bxce@mk\indent %% \bxce@hex{} \letcs\bxce@hex{int_to_Hex:n} \unless\ifdefined\bxce@hex \input{binhex} \let\bxce@hex\hex \fi %% \bxce@@BS \begingroup \lccode`\*=`\\ \lowercase{\global\let\bxce@@BS=*} \endgroup %% \bxce@nihil \def\bxce@nihil{% \vrule\@width\z@\relax } %% \bxce@cond\ifXXX...\fi{}{} \@gobbletwo\if\if \def\bxce@cond#1\fi{% #1\expandafter\@firstoftwo \else \expandafter\@secondoftwo \fi } %% \bxce@skip@space\CScont \def\bxce@skip@space#1 {#1} %% \bxce@raise@flag{} \def\bxce@raise@flag#1{% \expandafter\@gobble\csname bxce@f/#1\endcsname } %% \bxce@if@flag@raised{} \def\bxce@if@flag@raised#1{% \ifcsdef{bxce@f/#1}% } %% \bxce@hedge@options@with\CS{} % Expands to \CS{}{}. \def\bxce@hedge@options@with#1#2#{% brace delimit #1{#2}% } %% \bxce@with@star{}{}{} % Checks whether the string starts with '*'. \def\bxce@with@star#1{% \bxce@with@star@a#1.\bxce@end } \def\bxce@with@star@a#1#2\bxce@end{% \bxce@cond\ifx*#1\fi } %% \bxce@lowercase@edef \def\bxce@lowercase@edef#1#2{% \edef\bxce@tmp@le{\noexpand\bxce@lowercase@edef@a{#2}}% \bxce@tmp@le#1% } \def\bxce@lowercase@edef@a#1#2{% \lowercase{\def#2{#1}}% } %--------------------------------------- character database %% character properties \chardef\bxce@cp@base=1 % base char \chardef\bxce@cp@comb=2 % combining char \chardef\bxce@cp@mod=7 % modifier char \chardef\bxce@cp@ris=3 % region indicator \chardef\bxce@cp@evs=4 % emoji variant selector \chardef\bxce@cp@zwj=5 % zero width joiner \chardef\bxce@cp@tag=6 % tag char %% constants %[bxce@cp/] : Unicode -> char property %[bxce@ju/] : JIS-code -> Unicode (for jachar trick) %% variables \let\bxce@cp\relax %% \bxce@@; \let\bxce@@\relax % normally unexpandable %% \bxce@csn@cp{} \def\bxce@csn@cp#1{% bxce@cp/\number#1% } \ifbxce@use@pua \def\bxce@csn@cp#1{% bxce@cp/% \ifnum#1<"E000 \number#1% \else\ifnum#1<"F900 48% \else\ifnum#1<"F0000 \number#1% \else 48% \fi\fi\fi } \fi %% \bxce@set@cp{,...} \@onlypreamble\bxce@set@cp \def\bxce@set@cp#1#2{% \let\bxce@cp=#1% \@for\bxce@arg:={#2}\do{% \expandafter\bxce@set@cp@a\bxce@arg--\bxce@end}% } \@onlypreamble\bxce@set@cp@a \def\bxce@set@cp@a#1-#2-#3\bxce@end{% \ifx-#2-\bxce@set@cp@b{#1}{#1}% \else \bxce@set@cp@b{#1}{#2}% \fi } \@onlypreamble\bxce@set@cp@b \def\bxce@set@cp@b#1#2{% \bxce@cnta="#1\relax \numdef\bxce@tmpb{"#2+1}% \@whilenum{\bxce@cnta<\bxce@tmpb}\do{% \edef\bxce@arg{{\the\bxce@cnta}{\bxce@hex{\bxce@cnta}}}% \expandafter\bxce@set@cp@c\bxce@arg \advance\bxce@cnta1 }% } \@onlypreamble\bxce@set@cp@c \def\bxce@set@cp@c#1#2{% \cslet{bxce@cp/#1}\bxce@cp \bxce@set@cp@d{#1}{#2}% } \@onlypreamble\bxce@set@cp@d \ifx u\bxce@engine \def\bxce@set@cp@d#1#2{% \ifbxce@inputenc \ifnum#1>127 \ifnum\kcatcode#1=15 \DeclareUnicodeCharacter{#2}{\bxce@@#2;}% \fi\fi \else \PackageWarningNoLine\bxce@pkgname {Some emoji characters might not be output.\MessageBreak You must load 'inputenc' before this package\MessageBreak and use input encoding 'utf8'} \let\bxce@set@cp@d\@gobbletwo \fi } \else \def\bxce@set@cp@d#1#2{% \ifbxce@inputenc\ifnum#1>127 \DeclareUnicodeCharacter{#2}{\bxce@@#2;}% \fi\fi } \fi %%-------- data %% make [bxce@cp] table \bxce@set@cp\bxce@cp@base{% 0023,002A,0030-0039,00A9,00AE,203C,2049,2122,2139,2194-2199,% 21A9-21AA,231A-231B,2328,23CF,23E9-23EC,23ED-23EE,23EF,23F0,% 23F1-23F2,23F3,23F8-23FA,24C2,25AA-25AB,25B6,25C0,25FB-25FE,% 2600-2601,2602-2603,2604,260E,2611,2614-2615,2618,261D,2620,% 2622-2623,2626,262A,262E,262F,2638-2639,263A,2640,2642,2648-2653,% 265F,2660,2663,2665-2666,2668,267B,267E,267F,2692,2693,2694,2695,% 2696-2697,2699,269B-269C,26A0-26A1,26A7,26AA-26AB,26B0-26B1,% 26BD-26BE,26C4-26C5,26C8,26CE,26CF,26D1,26D3,26D4,26E9,26EA,% 26F0-26F1,26F2-26F3,26F4,26F5,26F7-26F9,26FA,26FD,2702,2705,% 2708-270C,270D,270F,2712,2714,2716,271D,2721,2728,2733-2734,2744,% 2747,274C,274E,2753-2755,2757,2763,2764,2795-2797,27A1,27B0,27BF,% 2934-2935,2B05-2B07,2B1B-2B1C,2B50,2B55,3030,303D,3297,3299,1F004,% 1F0CF,1F170-1F171,1F17E-1F17F,1F18E,1F191-1F19A,1F1E6-1F1FF,% 1F201-1F202,1F21A,1F22F,1F232-1F23A,1F250-1F251,1F300-1F30C,% 1F30D-1F30E,1F30F,1F310,1F311,1F312,1F313-1F315,1F316-1F318,1F319,% 1F31A,1F31B,1F31C,1F31D-1F31E,1F31F-1F320,1F321,1F324-1F32C,% 1F32D-1F32F,1F330-1F331,1F332-1F333,1F334-1F335,1F336,1F337-1F34A,% 1F34B,1F34C-1F34F,1F350,1F351-1F37B,1F37C,1F37D,1F37E-1F37F,% 1F380-1F393,1F396-1F397,1F399-1F39B,1F39E-1F39F,1F3A0-1F3C4,1F3C5,% 1F3C6,1F3C7,1F3C8,1F3C9,1F3CA,1F3CB-1F3CE,1F3CF-1F3D3,1F3D4-1F3DF,% 1F3E0-1F3E3,1F3E4,1F3E5-1F3F0,1F3F3,1F3F4,1F3F5,1F3F7,1F3F8-1F407,% 1F408,1F409-1F40B,1F40C-1F40E,1F40F-1F410,1F411-1F412,1F413,1F414,% 1F415,1F416,1F417-1F429,1F42A,1F42B-1F43E,1F43F,1F440,1F441,% 1F442-1F464,1F465,1F466-1F46B,1F46C-1F46D,1F46E-1F4AC,1F4AD,% 1F4AE-1F4B5,1F4B6-1F4B7,1F4B8-1F4EB,1F4EC-1F4ED,1F4EE,1F4EF,% 1F4F0-1F4F4,1F4F5,1F4F6-1F4F7,1F4F8,1F4F9-1F4FC,1F4FD,1F4FF-1F502,% 1F503,1F504-1F507,1F508,1F509,1F50A-1F514,1F515,1F516-1F52B,% 1F52C-1F52D,1F52E-1F53D,1F549-1F54A,1F54B-1F54E,1F550-1F55B,% 1F55C-1F567,1F56F-1F570,1F573-1F579,1F57A,1F587,1F58A-1F58D,1F590,% 1F595-1F596,1F5A4,1F5A5,1F5A8,1F5B1-1F5B2,1F5BC,1F5C2-1F5C4,% 1F5D1-1F5D3,1F5DC-1F5DE,1F5E1,1F5E3,1F5E8,1F5EF,1F5F3,1F5FA,% 1F5FB-1F5FF,1F600,1F601-1F606,1F607-1F608,1F609-1F60D,1F60E,1F60F,% 1F610,1F611,1F612-1F614,1F615,1F616,1F617,1F618,1F619,1F61A,1F61B,% 1F61C-1F61E,1F61F,1F620-1F625,1F626-1F627,1F628-1F62B,1F62C,1F62D,% 1F62E-1F62F,1F630-1F633,1F634,1F635,1F636,1F637-1F640,1F641-1F644,% 1F645-1F64F,1F680,1F681-1F682,1F683-1F685,1F686,1F687,1F688,1F689,% 1F68A-1F68B,1F68C,1F68D,1F68E,1F68F,1F690,1F691-1F693,1F694,1F695,% 1F696,1F697,1F698,1F699-1F69A,1F69B-1F6A1,1F6A2,1F6A3,1F6A4-1F6A5,% 1F6A6,1F6A7-1F6AD,1F6AE-1F6B1,1F6B2,1F6B3-1F6B5,1F6B6,1F6B7-1F6B8,% 1F6B9-1F6BE,1F6BF,1F6C0,1F6C1-1F6C5,1F6CB,1F6CC,1F6CD-1F6CF,1F6D0,% 1F6D1-1F6D2,1F6D5,1F6D6-1F6D7,1F6DD-1F6DF,1F6E0-1F6E5,1F6E9,% 1F6EB-1F6EC,1F6F0,1F6F3,1F6F4-1F6F6,1F6F7-1F6F8,1F6F9,1F6FA,% 1F6FB-1F6FC,1F7E0-1F7EB,1F7F0,1F90C,1F90D-1F90F,1F910-1F918,% 1F919-1F91E,1F91F,1F920-1F927,1F928-1F92F,1F930,1F931-1F932,% 1F933-1F93A,1F93C-1F93E,1F93F,1F940-1F945,1F947-1F94B,1F94C,% 1F94D-1F94F,1F950-1F95E,1F95F-1F96B,1F96C-1F970,1F971,1F972,% 1F973-1F976,1F977-1F978,1F979,1F97A,1F97B,1F97C-1F97F,1F980-1F984,% 1F985-1F991,1F992-1F997,1F998-1F9A2,1F9A3-1F9A4,1F9A5-1F9AA,% 1F9AB-1F9AD,1F9AE-1F9AF,1F9B0-1F9B9,1F9BA-1F9BF,1F9C0,1F9C1-1F9C2,% 1F9C3-1F9CA,1F9CB,1F9CC,1F9CD-1F9CF,1F9D0-1F9E6,1F9E7-1F9FF,% 1FA70-1FA73,1FA74,1FA78-1FA7A,1FA7B-1FA7C,1FA80-1FA82,1FA83-1FA86,% 1FA90-1FA95,1FA96-1FAA8,1FAA9-1FAAC,1FAB0-1FAB6,1FAB7-1FABA,% 1FAC0-1FAC2,1FAC3-1FAC5,1FAD0-1FAD6,1FAD7-1FAD9,1FAE0-1FAE7,% 1FAF0-1FAF6} \bxce@set@cp\bxce@cp@comb{% 20E0,20E3} \bxce@set@cp\bxce@cp@mod{% 1F3FB-1F3FF} \bxce@set@cp\bxce@cp@ris{% 1F1E6-1F1FF} \bxce@set@cp\bxce@cp@evs{% FE0E-FE0F} \bxce@set@cp\bxce@cp@zwj{% 200D} \bxce@set@cp\bxce@cp@tag{% E0020-E007F} %% make [bxce@ju] table \ifx p\bxce@engine \def\bxce@do#1#2{\csedef{bxce@ju/\jis"#1}{\number"#2}} \bxce@do{2169}{2642} \bxce@do{216A}{2640} \fi %--------------------------------------- user interface %%<*> \coloremojisetup{=,...} \newrobustcmd*{\coloremojisetup}[1]{% \setkeys{bxce}{#1}% } %%<*> \coloremoji*[