% exchars.tex
%%%%%%%%%%%%%%%%%%%%%%%%
% Petr Olsak   Aug. 2013

% This macros implement the handling of characters from expert 
% or some other special fonts. 
% See the end of this file for more information.

% Macros:

\def\exchardef #1#2 #3 {\def#1{\printexchar#1{#2}{#3}}}

\def\printexchar#1#2#3{% if \addprotect\exfont then all \exchars are protected.
   \ifx\exfont\relax \noexpand#1\else
      \ifx\exxfont\undefined
         {\exfont{#2}%
          \ifx\exxfont\undefined
             \excharblackbox{#1}{#2}{#3}%
             \message{WARNING: extra font unavailable for \string#1/#2 in \tmpa.}%
          \else
             \char#3
          \fi}%
      \else \char#3 
   \fi\fi
}
\def\exfont#1{\expandafter\expandafter\expandafter
   \separethefont\expandafter\fontname\expandafter\font\space\relax
   \expandafter \ifx\csname ex:\tmpa/#1\endcsname \relax \else
      \font\exxfont=\csname ex:\tmpa/#1\endcsname\space\tmpb\relax \exxfont
   \fi
}
\def\separethefont#1 #2\relax{\def\tmpa{#1}\def\tmpb{#2}}
\def\excharblackbox #1#2#3%
   {\leavevmode\kern.05em\vrule height.5em width.5em depth0pt\kern.05em }
\def\setexfont #1 #2 #3 {\expandafter\def\csname ex:#1/#2\endcsname{#3}}

% Fonts declarations:

\def\declexfamily #1 #2 #3{%  we spare TeX memory, so we set only one
  \def\tmpb{#1}            %  preloaded family; others \declexfamily are ingnored
  \edef\tmpb{\meaning\tmpb}
  \ifx\tmpa\tmpb 
     \message{EXCHARS: extra characters in TS1 encoding prepared for #2 family.}#3\fi
}
\expandafter\expandafter\expandafter
   \separethefont\expandafter\fontname\expandafter\tenrm\space\relax
\edef\tmpa{\meaning\tmpa}

\def\setexfamilyA #1 #2 #3 #4 #5 #6 #7 #8 {%
  \setexfont  #1#3#7 TS1 ts1-#2r
  \setexfont  #1#4#7 TS1 ts1-#2b
  \setexfont  #1#5#7 TS1 ts1-#2ri
  \setexfont  #1#6#7 TS1 ts1-#2bi
  \setexfont  pcrr#8 TS1 ts1-qcrr 
}
\declexfamily ptmr8z Times      {\setexfamilyA ptm qtm r b ri bi 8z 8u }
\declexfamily pagk8z Avantgarde {\setexfamilyA pag qag k d ko do 8z 8u }
\declexfamily pbkl8z Bookman    {\setexfamilyA pbk qbk l d li di 8z 8u }
\declexfamily phvr8z Helvetica  {\setexfamilyA phv qhv r b ro bo 8z 8u }
\declexfamily pncr8z NewCentury {\setexfamilyA pnc qcs r b ri bi 8z 8u }
\declexfamily pplr8z Palatino   {\setexfamilyA ppl qpl r b ri bi 8z 8u }
\declexfamily ptmr8t Times      {\setexfamilyA ptm qtm r b ri bi 8t 8t }
\declexfamily pagk8t Avatgarde  {\setexfamilyA pag qag k d ko do 8t 8t }
\declexfamily pbkl8t Bookman    {\setexfamilyA pbk qbk l d li di 8t 8t }
\declexfamily phvr8t Helvetica  {\setexfamilyA phv qhv r b ro bo 8t 8t }
\declexfamily pncr8t NewCentury {\setexfamilyA pnc qcs r b ri bi 8t 8t }
\declexfamily pplr8t Palatino   {\setexfamilyA ppl qpl r b ri bi 8t 8t }

\def\setexfamilyB #1 #2 #3 #4 #5 #6 {%
  \setexfont #6-#1#2 TS1 ts1-#1#2
  \setexfont #6-#1#3 TS1 ts1-#1#3
  \setexfont #6-#1#4 TS1 ts1-#1#4
  \setexfont #6-#1#5 TS1 ts1-#1#5
}
\declexfamily cs-qtmr Termes   {\setexfamilyB qtm r b ri bi cs }
\declexfamily cs-qagr Adventor {\setexfamilyB qag r b ri bi cs }
\declexfamily cs-qbkr Bonum    {\setexfamilyB qbk r b ri bi cs }
\declexfamily cs-qhvr Heros    {\setexfamilyB qhv r b ri bi cs }
\declexfamily cs-qcsr Pagella  {\setexfamilyB qcs r b ri bi cs }
\declexfamily cs-qplr Schola   {\setexfamilyB qpl r b ri bi cs }
\declexfamily cs-qcrr Cursor   {\setexfamilyB qcr r b ri bi cs }
\declexfamily ec-qtmr Termes   {\setexfamilyB qtm r b ri bi ec }
\declexfamily ec-qagr Adventor {\setexfamilyB qag r b ri bi ec }
\declexfamily ec-qbkr Bonum    {\setexfamilyB qbk r b ri bi ec }
\declexfamily ec-qhvr Heros    {\setexfamilyB qhv r b ri bi ec }
\declexfamily ec-qcsr Pagella  {\setexfamilyB qcs r b ri bi ec }
\declexfamily ec-qplr Schola   {\setexfamilyB qpl r b ri bi ec }
\declexfamily ec-qcrr Cursor   {\setexfamilyB qcr r b ri bi ec }

\declexfamily cs-lmr10 LatinModern {%
  \setexfamilyB lm r10 bx10 ri10 bxi10 cs 
  \setexfamilyB lm tt10 csc10 csco10 ss10 cs }
\declexfamily ec-lmr10 LatinModern {%
  \setexfamilyB lm r10 bx10 ri10 bxi10 ec 
  \setexfamilyB lm tt10 csc10 csco10 ss10 ec }

\def\tmp{%
  \setexfont csr8     TS1  ts1-lmr8
  \setexfont csr9     TS1  ts1-lmr9
  \setexfont csr10    TS1  ts1-lmr10
  \setexfont csr12    TS1  ts1-lmr12
  \setexfont csr17    TS1  ts1-lmr17
  \setexfont csbx8    TS1  ts1-lmbx8
  \setexfont csbx9    TS1  ts1-lmbx9
  \setexfont csbx10   TS1  ts1-lmbx10
  \setexfont csbx12   TS1  ts1-lmbx12
  \setexfont csti8    TS1  ts1-lmri8
  \setexfont csti9    TS1  ts1-lmri9
  \setexfont csti10   TS1  ts1-lmri10
  \setexfont csti12   TS1  ts1-lmri12
  \setexfont csbxti10 TS1  ts1-lmbxi10
  \setexfont cstt10   TS1  ts1-lmtt10
  \setexfont cstt12   TS1  ts1-lmtt12
  \setexfont cstt8    TS1  ts1-lmtt8
  \setexfont cstt9    TS1  ts1-lmtt9
}
\declexfamily csr10 CSfont {\tmp}
\declexfamily csr12 CSfont {\tmp}
\declexfamily csr8  CSfont {\tmp}
\declexfamily csr9  CSfont {\tmp}

% user can declare more metrics by \setexfont.

% Character declarations:

\exchardef  \excapitalcompwordmark   TS1   23
\exchardef  \exascendercompwordmark  TS1   31
\exchardef  \exquotestraightbase     TS1   13
\exchardef  \exquotestraightdblbase  TS1   18
\exchardef  \extwelveudash           TS1   21
\exchardef  \exthreequartersemdash   TS1   22
\exchardef  \exleftarrow             TS1   24
\exchardef  \exrightarrow            TS1   25
\exchardef  \exblank                 TS1   32
\exchardef  \exdollar                TS1   36
\exchardef  \exquotesingle           TS1   39
\exchardef  \exasteriskcentered      TS1   42
\exchardef  \exdblhyphen             TS1   45
\exchardef  \exfractionsolidus       TS1   47
\exchardef  \exzerooldstyle          TS1   48
\exchardef  \exoneoldstyle           TS1   49
\exchardef  \extwooldstyle           TS1   50
\exchardef  \exthreeoldstyle         TS1   51
\exchardef  \exfouroldstyle          TS1   52
\exchardef  \exfiveoldstyle          TS1   53
\exchardef  \exsixoldstyle           TS1   54
\exchardef  \exsevenoldstyle         TS1   55
\exchardef  \exeightoldstyle         TS1   56
\exchardef  \exnineoldstyle          TS1   57
\exchardef  \exlangle                TS1   60
\exchardef  \exminus                 TS1   61
\exchardef  \exrangle                TS1   62
\exchardef  \exmho                   TS1   77
\exchardef  \exbigcircle             TS1   79
\exchardef  \exohm                   TS1   87
\exchardef  \exlbrackdbl             TS1   91
\exchardef  \exrbrackdbl             TS1   93
\exchardef  \exuparrow               TS1   94
\exchardef  \exdownarrow             TS1   95
\exchardef  \exasciigrave            TS1   96
\exchardef  \exborn                  TS1   98
\exchardef  \exdivorced              TS1   99
\exchardef  \exdied                  TS1  100
\exchardef  \exleaf                  TS1  108
\exchardef  \exmarried               TS1  109
\exchardef  \exmusicalnote           TS1  110
\exchardef  \extildelow              TS1  126
\exchardef  \exdblhyphenchar         TS1  127
\exchardef  \exasciibreve            TS1  128
\exchardef  \exasciicaron            TS1  129
\exchardef  \exacutedbl              TS1  130
\exchardef  \exgravedbl              TS1  131
\exchardef  \exdagger                TS1  132
\exchardef  \exdaggerdbl             TS1  133
\exchardef  \exbardbl                TS1  134
\exchardef  \experthousand           TS1  135
\exchardef  \exbullet                TS1  136
\exchardef  \excelsius               TS1  137
\exchardef  \exdollaroldstyle        TS1  138
\exchardef  \excentoldstyle          TS1  139
\exchardef  \exflorin                TS1  140
\exchardef  \excolonmonetary         TS1  141
\exchardef  \exwon                   TS1  142
\exchardef  \exnaira                 TS1  143
\exchardef  \exguarani               TS1  144
\exchardef  \expeso                  TS1  145
\exchardef  \exlira                  TS1  146
\exchardef  \exrecipe                TS1  147
\exchardef  \exinterrobang           TS1  148
\exchardef  \exinterrobangdown       TS1  149
\exchardef  \exdong                  TS1  150
\exchardef  \extrademark             TS1  151
\exchardef  \expertenthousand        TS1  152
\exchardef  \expilcrow               TS1  153
\exchardef  \exbaht                  TS1  154
\exchardef  \exnumero                TS1  155
\exchardef  \exdiscount              TS1  156
\exchardef  \exestimated             TS1  157
\exchardef  \exopenbullet            TS1  158
\exchardef  \exservicemark           TS1  159
\exchardef  \exlquill                TS1  160
\exchardef  \exrquill                TS1  161
\exchardef  \excent                  TS1  162
\exchardef  \exsterling              TS1  163
\exchardef  \excurrency              TS1  164
\exchardef  \exyen                   TS1  165
\exchardef  \exbrokenbar             TS1  166
\exchardef  \exsection               TS1  167
\exchardef  \exasciidieresis         TS1  168
\exchardef  \excopyright             TS1  169
\exchardef  \exordfeminine           TS1  170
\exchardef  \excopyleft              TS1  171
\exchardef  \exlnot                  TS1  172
\exchardef  \excircledP              TS1  173
\exchardef  \exregistered            TS1  174
\exchardef  \exasciimacron           TS1  175
\exchardef  \exdegree                TS1  176
\exchardef  \expm                    TS1  177
\exchardef  \extwosuperior           TS1  178
\exchardef  \exthreesuperior         TS1  179
\exchardef  \exasciiacute            TS1  180
\exchardef  \exmu                    TS1  181
\exchardef  \exparagraph             TS1  182
\exchardef  \experiodcentered        TS1  183
\exchardef  \exreferencemark         TS1  184
\exchardef  \exonesuperior           TS1  185
\exchardef  \exordmasculine          TS1  186
\exchardef  \exsurd                  TS1  187
\exchardef  \exonequarter            TS1  188
\exchardef  \exonehalf               TS1  189
\exchardef  \exthreequarters         TS1  190
\exchardef  \exeuro                  TS1  191
\exchardef  \extimes                 TS1  214
\exchardef  \exdiv                   TS1  246

\endinput

===================================================================================

After:

\input ctimes  \input exchars

you can try to type: The leaf in roman: \exleaf, 
{\it the leaf in italics: \exleaf}, 
{\bf the leaf in bold: \exleaf}.
\end

You have to include exchars.tex immediatelly after \input ctimes
or \input lmfonts or \input cs-pagella etc. or at the begin of the document
if none of such files is loaded.

-----------------------------------------------------------------------------------

Usage of \exchardef:

\exchardef  \exmacro     ENC  CODE

The ``exchardefed'' macro tries to find the extra metrics derived from the
metrics of the current font and from the specified encoding ENC.
If it is found then the macro switches to the extra metric in the group and
prints the character of CODE.

Usage of \setexfont:

\setexfont  base-metrics  ENC  extra-metrics

This command declares the extra-metrics as the metrics used when the current
font has the base-metrics and the ``exchardefed'' character is printed in ENC
encoding. Without this declaration the extra metrics is unknown and the
``exchardefed'' character is not printed (only warning is written on the
terminal and \excharblackbox is printed to the document.

You can switch to the extra-metrics for more than one character by \exfont:

Test 1: {\exfont{TS1}\exonequarter \exonehalf \exthreequarters}
Test 2: \exonequarter \exonehalf \exthreequarters

The only difference between Test 1 and Test 2 is that the characters in Test 1 
can be corrected by kerning if the kerning pairs are in the metrics. The
characters in Test 2 are without kerning.

User can declare his/her own encoding and metrics-pairs by \setexfont and
extra characters by \exchardef. This file implements only one encoding
as an example: TS1 -- TeX companion symbols.

Users of encTeX can add the UTF-8 declarations of ``exchadefed'' symbols. Example:

\mubyte \exonehalf ^^c2^^bd\endmubyte
\mubyte \exflorin  ^^c6^^92\endmubyte
etc...

Now user can write raw characters in the document: ½.

----------------------------------------------------------------------------------
