diff --git a/unicodedomino.sty b/unicodedomino.sty new file mode 100644 index 0000000000000000000000000000000000000000..fb678df8a26b4d2eb0946f7f55ea4acc38e74593 --- /dev/null +++ b/unicodedomino.sty @@ -0,0 +1,118 @@ +% -*- mode: tex -*- +%- +% Copyright © 2017 +% mirabilos <t.glaser@tarent.de> +% with contributions by (among others) +% David Carlisle <http://tex.stackexchange.com/users/1090> +% +% Provided that these terms and disclaimer and all copyright notices +% are retained or reproduced in an accompanying document, permission +% is granted to deal in this work without restriction, including un†+% limited rights to use, publicly perform, distribute, sell, modify, +% merge, give away, or sublicence. +% +% This work is provided “AS IS†and WITHOUT WARRANTY of any kind, to +% the utmost extent permitted by applicable law, neither express nor +% implied; without malicious intent or gross negligence. In no event +% may a licensor, author or contributor be held liable for indirect, +% direct, other damage, loss, or other issues arising in any way out +% of dealing in the work, even if advised of the possibility of such +% damage or existence of a defect, except proven that it results out +% of said person’s immediate fault when using the work as intended. +%- +% Change UTF-8 input encoding to not error out, but substitute, upon +% encountering characters not set up with newunicodechar. + +\NeedsTeXFormat{LaTeX2e}% +\ProvidesPackage{unicodedomino}[2017/02/19 1.0 Domino for unknown codepoints]% +\makeatletter% + +\ifx\numexpr\@undefined% + \PackageError{unicodedomino}{This package requires numexpr}% +\fi% +\ifx\UTFviii@defined\@undefined% + \PackageError{unicodedomino}{This package requires UTF-8 input encoding}% +\fi% + +% nicer printing of codepoint hex numbers, not strictly necessary +\def\unicodedomino@codepoint#1{% + \ifnum#1>65535% + U-000% + \else\ifnum#1>4095% + U+% + \else% + U+0% + \fi\fi% + \expandafter\UTFviii@hexnumber\expandafter{#1}% +}% + +% override to beautify the output, not strictly necessary but requested +\gdef\UTFviii@splitcsname#1:#2\relax{% + #2 (\expandafter\unicodedomino@codepoint\expandafter{% + \the\numexpr\decode@UTFviii#2\relax})% +}% + +% render the actual domino piece +\def\unicodedomino@box#1#2{% + \begingroup% + \fboxsep=.1em% + \fboxrule=.4pt% + \texttt{\fbox{\makebox[0pt][l]{\textsuperscript{#1}}\textsubscript{#2}}}% + \endgroup% +}% + +% expand one hex nybble +\def\unicodedomino@hex@ne#1{% + \ifnum#1>15 % + \expandafter\unicodedomino@hex@ne\expandafter{\the\numexpr(#1-8)/16\relax}% + \fi% + \UTFviii@hexdigit{\numexpr#1\ifnum#1>0-((#1-8)/16)*16\fi\relax}.% +}% +% expand all hex nybbles, zero-padded +\def\unicodedomino@hex@ll#1{% + \ifnum#1<65536 0.\fi% + \ifnum#1<4096 0.\fi% + \expandafter\unicodedomino@hex@ne\expandafter{#1}% +}% +% call the appropriate box function +\def\unicodedomino@hex@do#1.#2.#3.#4.#5.{% + \ifnum#1>0% + \unicodedomino@box{0#1#2}{#3#4#5}% + \else% + \unicodedomino@box{#2#3}{#4#5}% + \fi% +}% +% split nybbles and pass on +\protected\def\unicodedomino@hex#1{% + \edef\temp{\expandafter\unicodedomino@hex@ll\expandafter{#1}}% + \expandafter\unicodedomino@hex@do\temp\relax% +}% +% split, decode and pass on +\def\unicodedomino@decode#1:#2\relax{% + \expandafter\unicodedomino@hex\expandafter{% + \the\numexpr\decode@UTFviii#2\relax% + }% +}% + +\def\UTFviii@defined#1{% + \ifx#1\relax% + % unknown char + \ifx\protect\@typeset@protect% + % not protected + \PackageWarning{inputenc}{% + Unicode\space char\space\expandafter\UTFviii@splitcsname\string#1\relax% + \space not\space set\space up\space for\space use\MessageBreak with\space% + LaTeX, replacing}% + \expandafter\unicodedomino@decode\string#1\relax% + \else% + % protected, just write the original character + \expandafter\@gobblefour\string#1% + \fi% + \else% + % known char, expand + \expandafter#1% + \fi% +}% + +\makeatother% +\endinput