diff options
author | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
commit | e0c6872cf40896c7be36b11dcc744620f10adf1d (patch) | |
tree | 60335e10d2f4354b0674ec22d7b53f0f8abee672 /macros/xetex/latex/mathspec/mathspec.sty |
Initial commit
Diffstat (limited to 'macros/xetex/latex/mathspec/mathspec.sty')
-rw-r--r-- | macros/xetex/latex/mathspec/mathspec.sty | 1001 |
1 files changed, 1001 insertions, 0 deletions
diff --git a/macros/xetex/latex/mathspec/mathspec.sty b/macros/xetex/latex/mathspec/mathspec.sty new file mode 100644 index 0000000000..e63a27d5ef --- /dev/null +++ b/macros/xetex/latex/mathspec/mathspec.sty @@ -0,0 +1,1001 @@ +\NeedsTeXFormat{LaTeX2e}[2005/12/01] +\ProvidesPackage{mathspec} + [2016/12/22 v0.2b LaTeX Package (Mathematics font selection for XeLaTeX)] + +%% Requirements: +\RequirePackage{etoolbox} +\RequirePackage{amstext} + +\RequirePackage{ifxetex} +\RequireXeTeX +\ifcsundef{XeTeXglyphbounds} + {\PackageError{mathspec} + {mathspec requires a more recent version of XeTeX} + {Your current vesion of XeTeX is \the\XeTeXversion\XeTeXrevision.\MessageBreak + Update your version of XeTeX to at least 0.9995.}} + {\relax} + +%% Booleans are created automatically on demand. +\newcommand\eu@booltrue[1]{\providebool{#1}\booltrue{#1}} +\newcommand\eu@gbooltrue[1]{\providebool{#1}\global\booltrue{#1}} +\newcommand\eu@boolfalse[1]{\providebool{#1}\boolfalse{#1}} +\newcommand\eu@ifbool[1]{\providebool{#1}\ifbool{#1}} + +%% Some extras: +%% \eu@ifbooltrue{<bool>}{<true>} +%% \eu@ifboolfalse{<bool>}{<false>} +%% \eu@ifsomebooltrue{<bool_1>,...,<bool_n>}{<true>} +%% (if <bool_i> is true for some i) +%% \eu@ifnumis{x}{x_1,...,x_n}{<true>}{<false>} (if x = x_i for some i) +%% \eu@ifnumin{x}{a,b}{<true>}{<false>} (if a ≤ x ≤ b) +\newcommand\eu@ifbooltrue[2]{\eu@ifbool{#1}{#2}{\relax}} +\newcommand\eu@ifboolfalse[2]{\eu@ifbool{#1}{\relax}{#2}} +\newcommand\eu@ifsomebooltrue[1]{% + \eu@boolfalse{temp}% + \def\do##1{\eu@ifbooltrue{##1}{\eu@booltrue{temp}}}% + \docsvlist{#1}% + \eu@ifbooltrue{temp}} +\newcommand\eu@ifnumis[2]{% + \providebool{temp}% + \boolfalse{temp}% + \def\do##1{\ifnumcomp{#1}{=}{##1}{\booltrue{temp}}{\relax}}% + \docsvlist{#2}% + \ifbool{temp}} +\newcommand\eu@ifnumin[2]{\@eu@ifnumin{#1}#2\@nil} +\def\@eu@ifnumin #1#2,#3\@nil{% + \providebool{temp}% + \booltrue{temp}% + \ifnumcomp{#1}{<}{#2}{\boolfalse{temp}}{\relax}% + \ifnumcomp{#3}{<}{#1}{\boolfalse{temp}}{\relax}% + \ifbool{temp}} + +%% Options: +\DeclareOption{normalskips} + {\PackageWarning{mathspec} + {Package option `normalskips' is deprecated}} +\def\eu@zf@math{no-math} +\DeclareOption{math}{\def\eu@zf@math{math}} +\DeclareOption{no-math}{\relax} +\DeclareOption{MnSymbol}{\eu@booltrue{MnSymbol}} +\DeclareOption*{\PassOptionsToPackage{\CurrentOption}{fontspec}} +\ProcessOptions\relax + +%% Requires packages: +%% fontspec, xkeyval, mathstyle, etoolbox and maybe MnSymbol +\RequirePackage[\eu@zf@math]{fontspec}[2008/08/09] +\RequirePackage{xkeyval} +\eu@ifbooltrue{MnSymbol}{\RequirePackage{MnSymbol}} + +\providecommand\currentmathstyle{\relax} + +%% @-namespace fontspec variable: +\ExplSyntaxOn +\def\eu@enc{\g_fontspec_encoding_tl} +\ExplSyntaxOff +%% This is needed to transition to the TU encoding instead of EU1 (WSPR) + +%% Deprecated commands in fontspec: +\ExplSyntaxOn +\tl_set:Nn \zf@enc { \g_fontspec_encoding_tl } +\cs_set:Npn \zf@fontspec #1 #2 + { + \fontspec_select:nn {#1} {#2} + \tl_set:Nn \zf@family { \l_fontspec_family_tl } + \tl_set:Nn \zf@basefont { \l_fontspec_font } + } +\ExplSyntaxOff +%% These are still defined in fontspec at time of writing but maybe be removed in the future. (WSPR) + +%% Define the undefined Greek letters. Include all variant forms (same as normal +%% forms if variant forms are unavailable). Latin F for digamma is better than +%% nothing. If Digamma is available, then Capital and Lowercase the are same. +\DeclareMathSymbol{\Alpha}{\mathalpha}{operators}{"41} +\DeclareMathSymbol{\Beta}{\mathalpha}{operators}{"42} +\DeclareMathSymbol{\Epsilon}{\mathalpha}{operators}{"45} +\DeclareMathSymbol{\Zeta}{\mathalpha}{operators}{"5A} +\DeclareMathSymbol{\Eta}{\mathalpha}{operators}{"48} +\DeclareMathSymbol{\Iota}{\mathalpha}{operators}{"49} +\DeclareMathSymbol{\Kappa}{\mathalpha}{operators}{"4B} +\DeclareMathSymbol{\Mu}{\mathalpha}{operators}{"4D} +\DeclareMathSymbol{\Nu}{\mathalpha}{operators}{"4E} +\DeclareMathSymbol{\Omicron}{\mathalpha}{operators}{"4F} +\DeclareMathSymbol{\Rho}{\mathalpha}{operators}{"50} +\DeclareMathSymbol{\Tau}{\mathalpha}{operators}{"54} +\DeclareMathSymbol{\Chi}{\mathalpha}{operators}{"58} +\DeclareMathSymbol{\omicron}{\mathord}{letters}{"6F} +\let\varbeta\beta +\ifdef{\varkappa}{\relax} + {\let\varkappa\kappa} +\ifdef{\varTheta}{\let\eu@cm@varTheta\varTheta} + {\relax} +\let\varTheta\Theta +\ifdef{\digamma}{\let\Digamma\digamma} + {\DeclareMathSymbol{\Digamma}{\mathalpha}{operators}{"46} + \DeclareMathSymbol{\digamma}{\mathord}{letters}{"46}} + +%% Preserve old definitions of all Greek letters. \eu@cm@alpha etc. +\def\do#1{\csletcs{eu@cm@#1}{#1}} +\docsvlist{ + Alpha,Beta,Gamma,Delta,Epsilon,Zeta,Eta,Theta,Iota,Kappa,Lambda,Mu,Nu, + Xi,Omicron,Pi,Rho,Sigma,Tau,Upsilon,Phi,Chi,Psi,Omega,Digamma,alpha, + beta,gamma,delta,epsilon,zeta,eta,theta,iota,kappa,lambda,mu,nu,xi, + omicron,pi,rho,varsigma,sigma,tau,upsilon,phi,chi,psi,omega,digamma, + varTheta,varbeta,varepsilon,vartheta,varkappa,varpi,varrho,varphi} +%% varTheta is done separately because amsmath defines it differently. + +%% Can define/redefine any command using the syntax of +%% \newcommand/\renewcommand without error. Some helpers. +\newcommand\ernewcommand[1]{\ifdef{#1}{\renewcommand{#1}}{\newcommand{#1}}} +\providecommand\expanded[1]{\edef\@tempa{#1}\@tempa} +\newcommand\eu@setkeys[3][]{ + \ifblank{#1}{\relax}{\presetkeys[eu]{#2}{#1}{}} + \expanded{\noexpand\setkeys*[eu]{#2}{\expandonce#3\@empty}}} +\newcommand\eu@fontspec[2]{ + \expanded{\noexpand\zf@fontspec{\expandonce#1\@empty}{\expandonce#2\@empty}}} + +%% Deprecated commands. +%% \+: Use \"..." or " instead. +%% \plaindigits: Digits are no longer selected automatically from either +%% the Latin or the Greek mathematics font. Instead, they +%% must explicitely be stated. If you want plain digits, just +%% don't say you want digits. +%5 \normalvarforms: Now called \normalisevarforms +%% \varforms: Now called \exchangeforms +%% Eventually, documents that use these will compile with error. +\newcommand\+{ + \PackageWarning{mathspec} + {\protect\+\space is deprecated, recommend to use\MessageBreak\protect\"..." + or "} + \eu@plus} +\newcommand\setsansfonts{ + \PackageWarning{mathspec} + {\protect\setsansfonts\space is deprecated, recommend to use \protect + \setallsansfonts.} + \setallsansfonts} +\@onlypreamble\setsansfonts +\newcommand\setmonofonts{ + \PackageWarning{mathspec} + {\protect\setmonofonts\space is deprecated, recommend to use \protect + \setallmonofonts.} + \setallsansfonts} +\@onlypreamble\setmonofonts +\newcommand\plaindigits{ + \PackageWarning{mathspec}{\protect\plaindigits\space is deprecated}} +\@onlypreamble\plaindigits +\newcommand\normalvarforms{ + \PackageWarning{mathspec} + {\protect\normalvarforms\space is deprecated, recommend to use + \protect\normalisevarforms\space or \protect\normalizevarforms} + \normalisevarforms} +\@onlypreamble\normalvarforms +\newcommand\varforms{ + \PackageWarning{mathspec} + {\protect\varforms\space is deprecated, recommend to use + \protect\exchangeforms} + \exchangeforms} +\@onlypreamble\varforms + +%% I don't want this clogging up my sty file. It will be gone eventually. +\def\@ifnext#1#2#3{% + \let\@tempd=#1% + \def\@tempa{#2}% + \def\@tempb{#3}% + \futurelet\@tempc\@ifnexta} +\def\@ifnexta{% + \ifx\@tempc\@tempd% + \let\@tempb\@tempa% + \fi\@tempb} +\def\eu@DeclareRobustCommand{\@star@or@long\eu@declare@robustcommand} +\def\eu@declare@robustcommand#1{% + \ifx#1\@undefined\else\ifx#1\relax\else + \@latex@info{Redefining \string#1}% + \fi\fi + \edef\reserved@a{\string#1}% + \def\reserved@b{#1}% + \edef\reserved@b{\expandafter\strip@prefix\meaning\reserved@b}% + \edef#1{% + \ifx\reserved@a\reserved@b + \noexpand\x@protect + \noexpand#1% + \fi + \noexpand\protect + \expandafter\noexpand\csname\expandafter\@gobble\string#1\endcsname}% + \let\@ifdefinable\@rc@ifdefinable + \expandafter\eu@new@command\csname\expandafter\@gobble\string#1\endcsname} +\def\eu@new@command#1{\eu@@testopt{\eu@@newcommand#1}0} +\def\eu@@newcommand#1[#2]{\@ifnext[{\@xargdef#1[#2]}{\@argdef#1[#2]}} +\long\def\eu@@testopt#1#2{\@ifnext[{#1}{#1[{#2}]}} +\eu@DeclareRobustCommand\eu@plus[1][]{} + +%% The main user command (comes in two spellings) +%% \setmathsfont(<sets>)[<shapes, font features>]{<font name>} +%% \setmathfont(<sets>)[<shapes, font features>]{<font name>} +%% +%% <set> is a CSV list of any of: Special, Latin, Greek, Digits, Symbols. If +%% (<set>) is omitted, then (Special) is assumed. Special is provided to +%% hook to some external code (e.g. potentially unicode-math). That is, +%% for mathspec purposes, (<sets>) is mandatory. Omit it so that it +%% behaves like a different command. See below. +%% <shapes> is the keyval list of font shapes for the subset of <set>. +%% Valid keys are: Uppercase, Lowercase, Arabic. +%% Valid values are: Regular, Italic, Plain. +%% <font features>, <font name> follow directly from fontspec. +\providecommand\setmathsfont{\eu@setmathsfont} +\let\setmathfont\setmathsfont +\newcommand\eu@setmathsfont{ + \@ifnextchar( + {\@eu@setmathsfont} + {\@eu@setmathsfont(Special)}} +\def\@eu@setmathsfont(#1){ + \edef\eu@setmathsfont@Set{#1} + \@@eu@setmathsfont} +\newcommand\@@eu@setmathsfont[2][]{ + \@for\i@for:=\eu@setmathsfont@Set\do + {\csname eu@ScopeSet@\i@for\endcsname[#1]{#2}}} + +%% The FIRST branch \setmathsfont(Special) +%% Predefine this command before mathspec is loaded (or redefine it) to get +%% +%% \setmathsfont[<font features>]{<font name>} +%% +%% to do something else. +%% +%% Essentially, \setmathsfont(<sets>)[<font features>]{<font name>} is a mathspec +%% command, but \setmathsfont[<font features>]{<font name>} is an external +%% command. +\providecommand\eu@ScopeSet@Special[2][]{\relax} + +%% The SECOND branch \setmathsfont(Digits) +\newcommand\eu@ScopeSet@Digits[2][]{ + \eu@setkeys[Arabic=Regular]{Digits}{#1} + \eu@fontspec{\XKV@rm}{#2} + \ifcase\eu@DigitsArabic@@value %% If Digits Regular + \ernewcommand\eu@DigitsArabic@symfont{Digits:m:n} + \let\eu@Digitsmathsfont\zf@family + \eu@booltrue{Digits} + \or %% If Digits Italic + \ernewcommand\eu@DigitsArabic@symfont{Digits:m:it} + \let\eu@Digitsmathsfont\zf@family + \eu@booltrue{Digits} + \or %% If Digits Plain + \eu@boolfalse{Digits} + \fi + \eu@ifsomebooltrue{Digits} + {\DeclareSymbolFont{Digits:m:n}{\eu@enc}{\eu@Digitsmathsfont}{m}{n}} + \eu@ifbooltrue{Digits} + {\fontfamily\eu@Digitsmathsfont\selectfont + \DeclareMathSymbol{0}{\mathord}{\eu@DigitsArabic@symfont}{`0} + \DeclareMathSymbol{1}{\mathord}{\eu@DigitsArabic@symfont}{`1} + \DeclareMathSymbol{2}{\mathord}{\eu@DigitsArabic@symfont}{`2} + \DeclareMathSymbol{3}{\mathord}{\eu@DigitsArabic@symfont}{`3} + \DeclareMathSymbol{4}{\mathord}{\eu@DigitsArabic@symfont}{`4} + \DeclareMathSymbol{5}{\mathord}{\eu@DigitsArabic@symfont}{`5} + \DeclareMathSymbol{6}{\mathord}{\eu@DigitsArabic@symfont}{`6} + \DeclareMathSymbol{7}{\mathord}{\eu@DigitsArabic@symfont}{`7} + \DeclareMathSymbol{8}{\mathord}{\eu@DigitsArabic@symfont}{`8} + \DeclareMathSymbol{9}{\mathord}{\eu@DigitsArabic@symfont}{`9}}} + +%% The THIRD branch \setmathsfont(Latin) +\newcommand\eu@ScopeSet@Latin[2][]{ + \eu@setkeys[Uppercase=Italic,Lowercase=Italic]{Latin}{#1} + \eu@fontspec{\XKV@rm}{#2} + \ifcase\eu@LatinUppercase@@value %% If Latin Uppercase Regular + \ernewcommand\eu@LatinUppercase@symfont{Latin:m:n} + \let\eu@Latinmathsfont\zf@family + \eu@booltrue{LatinUppercase} + \or %% If Latin Uppercase Italic + \ernewcommand\eu@LatinUppercase@symfont{Latin:m:it} + \let\eu@Latinmathsfont\zf@family + \eu@booltrue{LatinUppercase} + \or %% If Latin Uppercase Plain + \eu@boolfalse{LatinUppercase} + \fi + \ifcase\eu@LatinLowercase@@value %% If Latin Lowercase Regular + \ernewcommand\eu@LatinLowercase@symfont{Latin:m:n} + \let\eu@Latinmathsfont\zf@family + \eu@booltrue{LatinLowercase} + \or %% If Latin Lowercase Italic + \ernewcommand\eu@LatinLowercase@symfont{Latin:m:it} + \let\eu@Latinmathsfont\zf@family + \eu@booltrue{LatinLowercase} + \or %% If Latin Lowercase Plain + \eu@boolfalse{LatinLowercase} + \fi + \eu@ifsomebooltrue{LatinUppercase,LatinLowercase} + {\DeclareSymbolFont{Latin:m:n}{\eu@enc}{\eu@Latinmathsfont}{m}{n} + \DeclareSymbolFont{Latin:m:it}{\eu@enc}{\eu@Latinmathsfont}{m}{it}} + \eu@ifbooltrue{LatinUppercase} + {\fontfamily\eu@Latinmathsfont\selectfont + \DeclareMathSymbol{A}{\mathalpha}{\eu@LatinUppercase@symfont}{`A} + \DeclareMathSymbol{B}{\mathalpha}{\eu@LatinUppercase@symfont}{`B} + \DeclareMathSymbol{C}{\mathalpha}{\eu@LatinUppercase@symfont}{`C} + \DeclareMathSymbol{D}{\mathalpha}{\eu@LatinUppercase@symfont}{`D} + \DeclareMathSymbol{E}{\mathalpha}{\eu@LatinUppercase@symfont}{`E} + \DeclareMathSymbol{F}{\mathalpha}{\eu@LatinUppercase@symfont}{`F} + \DeclareMathSymbol{G}{\mathalpha}{\eu@LatinUppercase@symfont}{`G} + \DeclareMathSymbol{H}{\mathalpha}{\eu@LatinUppercase@symfont}{`H} + \DeclareMathSymbol{I}{\mathalpha}{\eu@LatinUppercase@symfont}{`I} + \DeclareMathSymbol{J}{\mathalpha}{\eu@LatinUppercase@symfont}{`J} + \DeclareMathSymbol{K}{\mathalpha}{\eu@LatinUppercase@symfont}{`K} + \DeclareMathSymbol{L}{\mathalpha}{\eu@LatinUppercase@symfont}{`L} + \DeclareMathSymbol{M}{\mathalpha}{\eu@LatinUppercase@symfont}{`M} + \DeclareMathSymbol{N}{\mathalpha}{\eu@LatinUppercase@symfont}{`N} + \DeclareMathSymbol{O}{\mathalpha}{\eu@LatinUppercase@symfont}{`O} + \DeclareMathSymbol{P}{\mathalpha}{\eu@LatinUppercase@symfont}{`P} + \DeclareMathSymbol{Q}{\mathalpha}{\eu@LatinUppercase@symfont}{`Q} + \DeclareMathSymbol{R}{\mathalpha}{\eu@LatinUppercase@symfont}{`R} + \DeclareMathSymbol{S}{\mathalpha}{\eu@LatinUppercase@symfont}{`S} + \DeclareMathSymbol{T}{\mathalpha}{\eu@LatinUppercase@symfont}{`T} + \DeclareMathSymbol{U}{\mathalpha}{\eu@LatinUppercase@symfont}{`U} + \DeclareMathSymbol{V}{\mathalpha}{\eu@LatinUppercase@symfont}{`V} + \DeclareMathSymbol{W}{\mathalpha}{\eu@LatinUppercase@symfont}{`W} + \DeclareMathSymbol{X}{\mathalpha}{\eu@LatinUppercase@symfont}{`X} + \DeclareMathSymbol{Y}{\mathalpha}{\eu@LatinUppercase@symfont}{`Y} + \DeclareMathSymbol{Z}{\mathalpha}{\eu@LatinUppercase@symfont}{`Z}} + \eu@ifbooltrue{LatinLowercase} + {\fontfamily\eu@Latinmathsfont\selectfont + \DeclareMathSymbol{a}{\mathalpha}{\eu@LatinLowercase@symfont}{`a} + \DeclareMathSymbol{b}{\mathalpha}{\eu@LatinLowercase@symfont}{`b} + \DeclareMathSymbol{c}{\mathalpha}{\eu@LatinLowercase@symfont}{`c} + \DeclareMathSymbol{d}{\mathalpha}{\eu@LatinLowercase@symfont}{`d} + \DeclareMathSymbol{e}{\mathalpha}{\eu@LatinLowercase@symfont}{`e} + \DeclareMathSymbol{f}{\mathalpha}{\eu@LatinLowercase@symfont}{`f} + \DeclareMathSymbol{g}{\mathalpha}{\eu@LatinLowercase@symfont}{`g} + \DeclareMathSymbol{h}{\mathalpha}{\eu@LatinLowercase@symfont}{`h} + \DeclareMathSymbol{i}{\mathalpha}{\eu@LatinLowercase@symfont}{`i} + \DeclareMathSymbol{j}{\mathalpha}{\eu@LatinLowercase@symfont}{`j} + \DeclareMathSymbol{k}{\mathalpha}{\eu@LatinLowercase@symfont}{`k} + \DeclareMathSymbol{l}{\mathalpha}{\eu@LatinLowercase@symfont}{`l} + \DeclareMathSymbol{m}{\mathalpha}{\eu@LatinLowercase@symfont}{`m} + \DeclareMathSymbol{n}{\mathalpha}{\eu@LatinLowercase@symfont}{`n} + \DeclareMathSymbol{o}{\mathalpha}{\eu@LatinLowercase@symfont}{`o} + \DeclareMathSymbol{p}{\mathalpha}{\eu@LatinLowercase@symfont}{`p} + \DeclareMathSymbol{q}{\mathalpha}{\eu@LatinLowercase@symfont}{`q} + \DeclareMathSymbol{r}{\mathalpha}{\eu@LatinLowercase@symfont}{`r} + \DeclareMathSymbol{s}{\mathalpha}{\eu@LatinLowercase@symfont}{`s} + \DeclareMathSymbol{t}{\mathalpha}{\eu@LatinLowercase@symfont}{`t} + \DeclareMathSymbol{u}{\mathalpha}{\eu@LatinLowercase@symfont}{`u} + \DeclareMathSymbol{v}{\mathalpha}{\eu@LatinLowercase@symfont}{`v} + \DeclareMathSymbol{w}{\mathalpha}{\eu@LatinLowercase@symfont}{`w} + \DeclareMathSymbol{x}{\mathalpha}{\eu@LatinLowercase@symfont}{`x} + \DeclareMathSymbol{y}{\mathalpha}{\eu@LatinLowercase@symfont}{`y} + \DeclareMathSymbol{z}{\mathalpha}{\eu@LatinLowercase@symfont}{`z}}} + +%% The FOURTH branch \setmathsfont(Greek) +\newcommand\eu@ScopeSet@Greek[2][]{ + \eu@setkeys[Uppercase=Regular,Lowercase=Italic]{Greek}{#1} + \eu@fontspec{\XKV@rm}{#2} + \ifcase\eu@GreekUppercase@@value %% If Greek Uppercase Regular + \ernewcommand\eu@GreekUppercase@symfont{Greek:m:n} + \let\eu@Greekmathsfont\zf@family + \eu@booltrue{GreekUppercase} + \or %% If Greek Uppercase Italic + \ernewcommand\eu@GreekUppercase@symfont{Greek:m:it} + \let\eu@Greekmathsfont\zf@family + \eu@booltrue{GreekUppercase} + \or %% If Greek Uppercase Plain + \eu@boolfalse{GreekUppercase} + \fi + \ifcase\eu@GreekLowercase@@value %% If Greek Lowercase Regular + \ernewcommand\eu@GreekLowercase@symfont{Greek:m:n} + \let\eu@Greekmathsfont\zf@family + \eu@booltrue{GreekLowercase} + \or %% If Greek Lowercase Italic + \ernewcommand\eu@GreekLowercase@symfont{Greek:m:it} + \let\eu@Greekmathsfont\zf@family + \eu@booltrue{GreekLowercase} + \or %% If Greek Lowercase Plain + \eu@boolfalse{GreekLowercase} + \fi + \eu@ifsomebooltrue{GreekUppercase,GreekLowercase} + {\DeclareSymbolFont{Greek:m:n}{\eu@enc}{\eu@Greekmathsfont}{m}{n} + \DeclareSymbolFont{Greek:m:it}{\eu@enc}{\eu@Greekmathsfont}{m}{it}} + \eu@ifbooltrue{GreekUppercase} + {\fontfamily\eu@Greekmathsfont\selectfont + \XeTeXDeclareMathSymbol{Α}{\mathalpha}{\eu@GreekUppercase@symfont}{`Α}[\Alpha] + \XeTeXDeclareMathSymbol{Β}{\mathalpha}{\eu@GreekUppercase@symfont}{`Β}[\Beta] + \XeTeXDeclareMathSymbol{Γ}{\mathalpha}{\eu@GreekUppercase@symfont}{`Γ}[\Gamma] + \XeTeXDeclareMathSymbol{Δ}{\mathalpha}{\eu@GreekUppercase@symfont}{`Δ}[\Delta] + \XeTeXDeclareMathSymbol{Ε}{\mathalpha}{\eu@GreekUppercase@symfont}{`Ε}[\Epsilon] + \XeTeXDeclareMathSymbol{Ζ}{\mathalpha}{\eu@GreekUppercase@symfont}{`Ζ}[\Zeta] + \XeTeXDeclareMathSymbol{Η}{\mathalpha}{\eu@GreekUppercase@symfont}{`Η}[\Eta] + \XeTeXDeclareMathSymbol{Θ}{\mathalpha}{\eu@GreekUppercase@symfont}{`Θ}[\Theta] + \XeTeXDeclareMathSymbol{Ι}{\mathalpha}{\eu@GreekUppercase@symfont}{`Ι}[\Iota] + \XeTeXDeclareMathSymbol{Κ}{\mathalpha}{\eu@GreekUppercase@symfont}{`Κ}[\Kappa] + \XeTeXDeclareMathSymbol{Λ}{\mathalpha}{\eu@GreekUppercase@symfont}{`Λ}[\Lambda] + \XeTeXDeclareMathSymbol{Μ}{\mathalpha}{\eu@GreekUppercase@symfont}{`Μ}[\Mu] + \XeTeXDeclareMathSymbol{Ν}{\mathalpha}{\eu@GreekUppercase@symfont}{`Ν}[\Nu] + \XeTeXDeclareMathSymbol{Ξ}{\mathalpha}{\eu@GreekUppercase@symfont}{`Ξ}[\Xi] + \XeTeXDeclareMathSymbol{Ο}{\mathalpha}{\eu@GreekUppercase@symfont}{`Ο}[\Omicron] + \XeTeXDeclareMathSymbol{Π}{\mathalpha}{\eu@GreekUppercase@symfont}{`Π}[\Pi] + \XeTeXDeclareMathSymbol{Ρ}{\mathalpha}{\eu@GreekUppercase@symfont}{`Ρ}[\Rho] + \XeTeXDeclareMathSymbol{Σ}{\mathalpha}{\eu@GreekUppercase@symfont}{`Σ}[\Sigma] + \XeTeXDeclareMathSymbol{Τ}{\mathalpha}{\eu@GreekUppercase@symfont}{`Τ}[\Tau] + \XeTeXDeclareMathSymbol{Υ}{\mathalpha}{\eu@GreekUppercase@symfont}{`Υ}[\Upsilon] + \XeTeXDeclareMathSymbol{Φ}{\mathalpha}{\eu@GreekUppercase@symfont}{`Φ}[\Phi] + \XeTeXDeclareMathSymbol{Χ}{\mathalpha}{\eu@GreekUppercase@symfont}{`Χ}[\Chi] + \XeTeXDeclareMathSymbol{Ψ}{\mathalpha}{\eu@GreekUppercase@symfont}{`Ψ}[\Psi] + \XeTeXDeclareMathSymbol{Ω}{\mathalpha}{\eu@GreekUppercase@symfont}{`Ω}[\Omega] + \XeTeXDeclareMathSymbol{Ϝ}{\mathalpha}{\eu@GreekUppercase@symfont}{`Ϝ}[\Digamma] + \XeTeXDeclareMathSymbol{ϴ}{\mathalpha}{\eu@GreekUppercase@symfont}{`ϴ}[\varTheta] + \eu@fixgreekcs{Α}{Alpha} + \eu@fixgreekcs{Β}{Beta} + \eu@fixgreekcs{Γ}{Gamma} + \eu@fixgreekcs{Δ}{Delta} + \eu@fixgreekcs{Ε}{Epsilon} + \eu@fixgreekcs{Ζ}{Zeta} + \eu@fixgreekcs{Η}{Eta} + \eu@fixgreekcs{Θ}{Theta} + \eu@fixgreekcs{Ι}{Iota} + \eu@fixgreekcs{Κ}{Kappa} + \eu@fixgreekcs{Λ}{Lambda} + \eu@fixgreekcs{Μ}{Mu} + \eu@fixgreekcs{Ν}{Nu} + \eu@fixgreekcs{Ξ}{Xi} + \eu@fixgreekcs{Ο}{Omicron} + \eu@fixgreekcs{Π}{Pi} + \eu@fixgreekcs{Ρ}{Rho} + \eu@fixgreekcs{Σ}{Sigma} + \eu@fixgreekcs{Τ}{Tau} + \eu@fixgreekcs{Υ}{Upsilon} + \eu@fixgreekcs{Φ}{Phi} + \eu@fixgreekcs{Χ}{Chi} + \eu@fixgreekcs{Ψ}{Psi} + \eu@fixgreekcs{Ω}{Omega} + \eu@fixgreekcs{Ϝ}{Digamma} + \eu@fixgreekcs{ϴ}{varTheta}} + \eu@ifbooltrue{GreekLowercase} + {\fontfamily\eu@Greekmathsfont\selectfont + \XeTeXDeclareMathSymbol{α}{\mathalpha}{\eu@GreekLowercase@symfont}{`α}[\alpha] + \XeTeXDeclareMathSymbol{β}{\mathalpha}{\eu@GreekLowercase@symfont}{`β}[\beta] + \XeTeXDeclareMathSymbol{γ}{\mathalpha}{\eu@GreekLowercase@symfont}{`γ}[\gamma] + \XeTeXDeclareMathSymbol{δ}{\mathalpha}{\eu@GreekLowercase@symfont}{`δ}[\delta] + \XeTeXDeclareMathSymbol{ε}{\mathalpha}{\eu@GreekLowercase@symfont}{`ε}[\epsilon] + \XeTeXDeclareMathSymbol{ζ}{\mathalpha}{\eu@GreekLowercase@symfont}{`ζ}[\zeta] + \XeTeXDeclareMathSymbol{η}{\mathalpha}{\eu@GreekLowercase@symfont}{`η}[\eta] + \XeTeXDeclareMathSymbol{θ}{\mathalpha}{\eu@GreekLowercase@symfont}{`θ}[\theta] + \XeTeXDeclareMathSymbol{ι}{\mathalpha}{\eu@GreekLowercase@symfont}{`ι}[\iota] + \XeTeXDeclareMathSymbol{κ}{\mathalpha}{\eu@GreekLowercase@symfont}{`κ}[\kappa] + \XeTeXDeclareMathSymbol{λ}{\mathalpha}{\eu@GreekLowercase@symfont}{`λ}[\lambda] + \XeTeXDeclareMathSymbol{μ}{\mathalpha}{\eu@GreekLowercase@symfont}{`μ}[\mu] + \XeTeXDeclareMathSymbol{ν}{\mathalpha}{\eu@GreekLowercase@symfont}{`ν}[\nu] + \XeTeXDeclareMathSymbol{ξ}{\mathalpha}{\eu@GreekLowercase@symfont}{`ξ}[\xi] + \XeTeXDeclareMathSymbol{ο}{\mathalpha}{\eu@GreekLowercase@symfont}{`ο}[\omicron] + \XeTeXDeclareMathSymbol{π}{\mathalpha}{\eu@GreekLowercase@symfont}{`π}[\pi] + \XeTeXDeclareMathSymbol{ρ}{\mathalpha}{\eu@GreekLowercase@symfont}{`ρ}[\rho] + \XeTeXDeclareMathSymbol{ς}{\mathalpha}{\eu@GreekLowercase@symfont}{`ς}[\varsigma] + \XeTeXDeclareMathSymbol{σ}{\mathalpha}{\eu@GreekLowercase@symfont}{`σ}[\sigma] + \XeTeXDeclareMathSymbol{τ}{\mathalpha}{\eu@GreekLowercase@symfont}{`τ}[\tau] + \XeTeXDeclareMathSymbol{υ}{\mathalpha}{\eu@GreekLowercase@symfont}{`υ}[\upsilon] + \XeTeXDeclareMathSymbol{φ}{\mathalpha}{\eu@GreekLowercase@symfont}{`φ}[\phi] + \XeTeXDeclareMathSymbol{χ}{\mathalpha}{\eu@GreekLowercase@symfont}{`χ}[\chi] + \XeTeXDeclareMathSymbol{ψ}{\mathalpha}{\eu@GreekLowercase@symfont}{`ψ}[\psi] + \XeTeXDeclareMathSymbol{ω}{\mathalpha}{\eu@GreekLowercase@symfont}{`ω}[\omega] + \XeTeXDeclareMathSymbol{ϝ}{\mathalpha}{\eu@GreekLowercase@symfont}{`ϝ}[\digamma] + \XeTeXDeclareMathSymbol{ϐ}{\mathalpha}{\eu@GreekLowercase@symfont}{`ϐ}[\varbeta] + \XeTeXDeclareMathSymbol{ϵ}{\mathalpha}{\eu@GreekLowercase@symfont}{`ϵ}[\varepsilon] + \XeTeXDeclareMathSymbol{ϑ}{\mathalpha}{\eu@GreekLowercase@symfont}{`ϑ}[\vartheta] + \XeTeXDeclareMathSymbol{ϰ}{\mathalpha}{\eu@GreekLowercase@symfont}{`ϰ}[\varkappa] + \XeTeXDeclareMathSymbol{ϖ}{\mathalpha}{\eu@GreekLowercase@symfont}{`ϖ}[\varpi] + \XeTeXDeclareMathSymbol{ϱ}{\mathalpha}{\eu@GreekLowercase@symfont}{`ϱ}[\varrho] + \XeTeXDeclareMathSymbol{ϕ}{\mathalpha}{\eu@GreekLowercase@symfont}{`ϕ}[\varphi] + \eu@fixgreekcs{α}{alpha} + \eu@fixgreekcs{β}{beta} + \eu@fixgreekcs{γ}{gamma} + \eu@fixgreekcs{δ}{delta} + \eu@fixgreekcs{ε}{epsilon} + \eu@fixgreekcs{ζ}{zeta} + \eu@fixgreekcs{η}{eta} + \eu@fixgreekcs{θ}{theta} + \eu@fixgreekcs{ι}{iota} + \eu@fixgreekcs{κ}{kappa} + \eu@fixgreekcs{λ}{lambda} + \eu@fixgreekcs{μ}{mu} + \eu@fixgreekcs{ν}{nu} + \eu@fixgreekcs{ξ}{xi} + \eu@fixgreekcs{ο}{omicron} + \eu@fixgreekcs{π}{pi} + \eu@fixgreekcs{ρ}{rho} + \eu@fixgreekcs{ς}{varsigma} + \eu@fixgreekcs{σ}{sigma} + \eu@fixgreekcs{τ}{tau} + \eu@fixgreekcs{υ}{upsilon} + \eu@fixgreekcs{φ}{phi} + \eu@fixgreekcs{χ}{chi} + \eu@fixgreekcs{ψ}{psi} + \eu@fixgreekcs{ω}{omega} + \eu@fixgreekcs{ϝ}{digamma} + \eu@fixgreekcs{ϐ}{varbeta} + \eu@fixgreekcs{ϵ}{varepsilon} + \eu@fixgreekcs{ϑ}{vartheta} + \eu@fixgreekcs{ϰ}{varkappa} + \eu@fixgreekcs{ϖ}{varpi} + \eu@fixgreekcs{ϱ}{varrho} + \eu@fixgreekcs{ϕ}{varphi}}} +\newcommand\eu@fixgreekcs[2]{ + \ifcsequal{#2}{eu@cm@#2} + {\relax} + {\expandafter\def\csname #2\endcsname{{"#1}}}} + +%% The FIFTH branch \setmathsfont(Symbols) +%% The symbols are not for now. +%% \newcommand\eu@ScopeSet@Symbols[2][]{ +%% \eu@fontspec{#1}{#2} +%% \def\eu@Symbols@symfont{Symbols:m:n} +%% \let\eu@Symbolsmathsfont\zf@family +%% \eu@booltrue{Symbols}} +%% +%% The FIFTH branch (REDEFINED) \setmathsfont(Symbols) +\newcommand\eu@ScopeSet@Symbols[2][]{\eu@boolfalse{Symbols}} + +%% Just so we know, by "all variant forms" I mean: +%% varbeta varpi cursive beta "omega" style pi +%% varepsilon varrho lunate epsilon rho with tail hooked under +%% vartheta varphi cursive theta cursive phi (or orthotic phi) +%% varkappa varTheta cursive kappa Theta with horizontal bar connected +%% +%% Note that varsigma is not included in this list (varsigma is not a variant +%% form, it is a final form). + +%% Some authors might prefer the normal and variant forms to be exchanged. For +%% example, I prefer \phi to print the orthotic phi and \varphi the cursive phi, +%% contrary to many text fonts. +%% +%% \exchangeforms{<list>} +%% <list> is a CSV list of any of: +%% beta, epsilon, theta, kappa, pi, rho, phi, Theta +\newcommand\exchangeforms[1]{ + \AtBeginDocument{ + \@for\i@for:=#1\do{\eu@booltrue{exchange\i@for forms}} + \eu@ifbooltrue{GreekLowercase} + {\eu@ifbooltrue{exchangebetaforms} + {\XeTeXDeclareMathSymbol{β}{\mathalpha}{\eu@GreekLowercase@symfont}{`ϐ}[\beta] + \XeTeXDeclareMathSymbol{ϐ}{\mathalpha}{\eu@GreekLowercase@symfont}{`β}[\varbeta]} + \eu@ifbooltrue{exchangeepsilonforms} + {\XeTeXDeclareMathSymbol{ε}{\mathalpha}{\eu@GreekLowercase@symfont}{`ϵ}[\epsilon] + \XeTeXDeclareMathSymbol{ϵ}{\mathalpha}{\eu@GreekLowercase@symfont}{`ε}[\varepsilon]} + \eu@ifbooltrue{exchangethetaforms} + {\XeTeXDeclareMathSymbol{θ}{\mathalpha}{\eu@GreekLowercase@symfont}{`ϑ}[\theta] + \XeTeXDeclareMathSymbol{ϑ}{\mathalpha}{\eu@GreekLowercase@symfont}{`θ}[\vartheta]} + \eu@ifbooltrue{exchangekappaforms} + {\XeTeXDeclareMathSymbol{κ}{\mathalpha}{\eu@GreekLowercase@symfont}{`ϰ}[\kappa] + \XeTeXDeclareMathSymbol{ϰ}{\mathalpha}{\eu@GreekLowercase@symfont}{`κ}[\varkappa]} + \eu@ifbooltrue{exchangepiforms} + {\XeTeXDeclareMathSymbol{π}{\mathalpha}{\eu@GreekLowercase@symfont}{`ϖ}[\pi] + \XeTeXDeclareMathSymbol{ϖ}{\mathalpha}{\eu@GreekLowercase@symfont}{`π}[\varpi]} + \eu@ifbooltrue{exchangerhoforms} + {\XeTeXDeclareMathSymbol{ρ}{\mathalpha}{\eu@GreekLowercase@symfont}{`ϱ}[\rho] + \XeTeXDeclareMathSymbol{ϱ}{\mathalpha}{\eu@GreekLowercase@symfont}{`ρ}[\varrho]} + \eu@ifbooltrue{exchangephiforms} + {\XeTeXDeclareMathSymbol{φ}{\mathalpha}{\eu@GreekLowercase@symfont}{`ϕ}[\phi] + \XeTeXDeclareMathSymbol{ϕ}{\mathalpha}{\eu@GreekLowercase@symfont}{`φ}[\varphi]}} + \eu@ifbooltrue{GreekUppercase} + {\eu@ifbooltrue{exhangeThetaforms} + {\XeTeXDeclareMathSymbol{Θ}{\mathalpha}{\eu@GreekUppercase@symfont}{`ϴ}[\Theta] + \XeTeXDeclareMathSymbol{ϴ}{\mathalpha}{\eu@GreekUppercase@symfont}{`Θ}[\varTheta]}}}} +\@onlypreamble\exchangeforms + +%% Some text fonts do not contain all variant forms. For those that don't, +%% after defining the Greek mathematics font, the ‘absent’ variant forms will +%% still be typeset in Computer Modern (usually). +%% +%% \normalisevarforms[<list>] +%% \normalizevarforms[<list>] +%% <list> is a CSV list of any of: +%% beta, epsilon, theta, kappa, pi, rho, phi, Theta +%% +%% This command makes the listed variant forms of Greek symbols equivalent to +%% their normal forms, but only if they do not already exist in the font. For +%% example, if \varbeta and \eu@cm@varbeta are equivalent, then +%% \XeTeXDeclareMathSymbol failed to assign \varbeta to ϐ because ϐ does not +%% exist in the font. +\newcommand\normalisevarforms[1][beta,epsilon,theta,kappa,pi,rho,phi,Theta]{ + \AtBeginDocument{ + \@for\i@for:=#1\do{\eu@booltrue{normalisevar\i@for}} + \eu@ifbooltrue{GreekLowercase} + {\eu@ifbooltrue{normalisevarbeta} + {\ifx\varbeta\eu@cm@varbeta + \XeTeXDeclareMathSymbol{ϐ}{\mathalpha}{\eu@GreekLowercase@symfont}{`β} + \let\varbeta\beta + \fi} + \eu@ifbooltrue{normalisevarepsilon} + {\ifx\varepsilon\eu@cm@varepsilon + \XeTeXDeclareMathSymbol{ϵ}{\mathalpha}{\eu@GreekLowercase@symfont}{`ε} + \let\varepsilon\epsilon + \fi} + \eu@ifbooltrue{normalisevartheta} + {\ifx\vartheta\eu@cm@vartheta + \XeTeXDeclareMathSymbol{ϑ}{\mathalpha}{\eu@GreekLowercase@symfont}{`θ} + \let\vartheta\theta + \fi} + \eu@ifbooltrue{normalisevarkappa} + {\ifx\varkappa\eu@cm@varkappa + \XeTeXDeclareMathSymbol{ϰ}{\mathalpha}{\eu@GreekLowercase@symfont}{`κ} + \let\varkappa\kappa + \fi} + \eu@ifbooltrue{normalisevarpi} + {\ifx\varpi\eu@cm@varpi + \XeTeXDeclareMathSymbol{ϖ}{\mathalpha}{\eu@GreekLowercase@symfont}{`π} + \let\varpi\pi + \fi} + \eu@ifbooltrue{normalisevarrho} + {\ifx\varrho\eu@cm@varrho + \XeTeXDeclareMathSymbol{ϱ}{\mathalpha}{\eu@GreekLowercase@symfont}{`ρ} + \let\varrho\rho + \fi} + \eu@ifbooltrue{normalisevarphi} + {\ifx\varphi\eu@cm@varphi + \XeTeXDeclareMathSymbol{ϕ}{\mathalpha}{\eu@GreekLowercase@symfont}{`φ} + \let\varphi\phi + \fi}} + \eu@ifbooltrue{GreekUppercase}{ + \eu@ifbooltrue{normalisevarTheta} + {\ifx\varTheta\eu@cm@varTheta + \XeTeXDeclareMathSymbol{ϴ}{\mathalpha}{\eu@GreekUppercase@symfont}{`Θ} + \let\varTheta\Theta + \fi}}}} +\@onlypreamble\normalisevarforms +\let\normalizevarforms\normalisevarforms +\@onlypreamble\normalizevarforms + +%% xkeyval things +\define@choicekey[eu] + {Digits}{Arabic}[\eu@DigitsArabic@value\eu@DigitsArabic@@value] + {Regular,Italic,Plain}[Regular]{\relax} +\define@choicekey[eu] + {Latin}{Uppercase}[\eu@LatinUppercase@value\eu@LatinUppercase@@value] + {Regular,Italic,Plain}[Italic]{\relax} +\define@choicekey[eu] + {Latin}{Lowercase}[\eu@LatinLowercase@value\eu@LatinLowercase@@value] + {Regular,Italic,Plain}[Italic]{\relax} +\define@choicekey[eu] + {Greek}{Uppercase}[\eu@GreekUppercase@value\eu@GreekUppercase@@value] + {Regular,Italic,Plain}[Regular]{\relax} +\define@choicekey[eu] + {Greek}{Lowercase}[\eu@GreekLowercase@value\eu@GreekLowercase@@value] + {Regular,Italic,Plain}[Italic]{\relax} + +%% Also say Digits has Uppercase and Lowercase keys, and Latin and Greek both +%% have Arabic key. So that if a superfluous key is accidently sent through the +%% wrong command (possible with \setallmainfonts), then it doesn't blow up. +\define@key[eu]{Digits}{Uppercase}{\relax} +\define@key[eu]{Digits}{Lowercase}{\relax} +\define@key[eu]{Latin}{Arabic}{\relax} +\define@key[eu]{Greek}{Arabic}{\relax} + +%% I hope Will doesn't mind if I patch fontspec. Why? Because these keys are +%% accidently sent through fontspec (e.g. \setallmainfonts does \setmainfont, +%% which is a fontspec command). So I allow fontspec to understand them, but do +%% nothing. +\define@key[zf]{options}{Arabic}{\relax} +\define@key[zf]{options}{Uppercase}{\relax} +\define@key[zf]{options}{Lowercase}{\relax} + +%% Fonts have metrics suitable for text, not for mathematics. Need to kern each +%% letter individually. Previous version took a trial and error approach with +%% \+[<size>] where <size> was determined by trial and error. Now, there is a +%% XeTeX primitive \XeTeXglyphbounds which is used to automatically calculate +%% the required mkern. +%% +%% Some register definitions. \three@digits takes a number and, if it is less +%% than 100, inserts leading zeroes so that it has three digits. +\muskipdef\muskip@\z@ +\muskipdef\muskip@i\@ne +\dimendef\dimen@iv 4\relax +\newcounter{eu@} +\newcounter{eu@i} +\providecommand\three@digits[1]{\ifnum#1<100 0\ifnum#1<10 0\fi\fi\number#1} + +%% \setminwhitespace{<number>} +%% Sets the minimum gap between adjacent characters in mathematics. +%% <number> is in units of mmu (1/1000 mu). So 1 em = 18000 mmu. +%% \eu@minwhitespace is the minimum white space. It's default value is 500 +%% which corresponds to 0.5 mu or 1/36 em. +\newcommand\setminwhitespace[1][500]{\def\eu@minwhitespace{#1}} +\setminwhitespace + +%% \eu@mkern operates over some adjacent character tokens +%% \@eu@mkern operates over individual character tokens +%% +%% Unless I've missed something, it is really, really hard to get information +%% about the font that a mathematics symbol is typeset in, so I devised a series +%% of tests in text mode (\text!) (otherwise the received information will be +%% rubbish, related to the text font outside the mathematics). It would be +%% neater if I do it inside a box that's not printed, instead of an empty +%% \text. The \@eu@mkern algorithm to calculate the mkern might be neater if I +%% use e-TeX's \numexpr and \glueexpr. Maybe \gluetomu might be useful? What I +%% have here already ought to be sufficient but perhaps inefficient. I think +%% optical sizes follow through automatically because \text inherits the +%% surrounding size, is that right? +\newcommand\eu@mkern[1]{% + \@tfor\i@tfor:=#1\do{\expandafter\@eu@mkern\i@tfor}} +\def\eu@get@familyseriesshape#1:#2:#3\@nil{% + \expandafter\fontfamily\csname eu@#1mathsfont\endcsname\selectfont + \ifstrequal{#2}{m}{\mdseries}{\relax}% + \ifstrequal{#2}{bx}{\bfseries}{\relax}% + \ifstrequal{#3}{n}{\upshape}{\relax}% + \ifstrequal{#3}{it}{\itshape}{\relax}} +\def\eu@get@familyseriesshape#1:#2:#3\@nil{% + \def\eu@family{#1}% + \def\eu@series{#2}% + \def\eu@shape{#3}} +\newcounter{mkern} +\newcommand\@eu@mkern[1]{% + \setcounter{mkern}{-1}% + \eu@boolfalse{domkern}% + \eu@ifnumin{`#1}{`0,`9}{\setcounter{mkern}{0}}{\relax}% + \eu@ifnumin{`#1}{`A,`Z}{\setcounter{mkern}{1}}{\relax}% + \eu@ifnumin{`#1}{`a,`z}{\setcounter{mkern}{2}}{\relax}% + \eu@ifnumin{`#1}{`Α,`Ω}{\setcounter{mkern}{3}}{\relax}% + \eu@ifnumin{`#1}{`α,`ω}{\setcounter{mkern}{4}}{\relax}% + \eu@ifnumis{`#1}{`Ϝ,`ϴ}{\setcounter{mkern}{3}}{\relax}% + \eu@ifnumis{`#1}{`ϐ,`ϑ,`ϕ,`ϖ,`ϝ,`ϰ,`ϱ,`ϵ}{\setcounter{mkern}{4}}{\relax}% + \text{% + \ifnum\the\c@mkern>\m@ne + \eu@gbooltrue{domkern}% + \fi + \ifcase\the\c@mkern\relax % If Digits (0) + \ifdef{\eu@DigitsArabic@symfont}% + {\expandafter\eu@get@familyseriesshape\eu@DigitsArabic@symfont\@nil}% + {\global\boolfalse{domkern}}% + \or % If Latin Uppercase (1) + \ifdef{\eu@LatinUppercase@symfont}% + {\expandafter\eu@get@familyseriesshape\eu@LatinUppercase@symfont\@nil}% + {\global\boolfalse{domkern}}% + \or % If Latin Lowercase (2) + \ifdef{\eu@LatinLowercase@symfont}% + {\expandafter\eu@get@familyseriesshape\eu@LatinLowercase@symfont\@nil}% + {\global\boolfalse{domkern}}% + \or % If Greek Uppercase (3) + \ifdef{\eu@GreekUppercase@symfont}% + {\expandafter\eu@get@familyseriesshape\eu@GreekUppercase@symfont\@nil}% + {\global\boolfalse{domkern}}% + \or % If Greek Lowercase (4) + \ifdef{\eu@GreekLowercase@symfont}% + {\expandafter\eu@get@familyseriesshape\eu@GreekLowercase@symfont\@nil}% + {\global\boolfalse{domkern}}% + \fi + \ifdef{\eu@family}% + {\expandafter\fontfamily\csname eu@\eu@family mathsfont\endcsname\selectfont}% + {\relax}% + \ifdef{\eu@series}% + {\expandafter\ifstrequal\expandafter{\eu@series}{m}% + {\mdseries}% + {\relax}% + \expandafter\ifstrequal\expandafter{\eu@series}{bx}% + {\bfseries}% + {\relax}}% + {\relax}% + \ifdef{\eu@shape}% + {\expandafter\ifstrequal\expandafter{\eu@shape}{n}% + {\upshape}% + {\relax}% + \expandafter\ifstrequal\expandafter{\eu@shape}{it}% + {\itshape}% + {\relax}}% + {\relax}% + \global\dimen@\XeTeXglyphbounds\@ne\the\XeTeXcharglyph`#1\relax + \global\dimen@iv\XeTeXglyphbounds\thr@@\the\XeTeXcharglyph`#1} + \dimen@ii 1em + \c@eu@\dimen@ + \c@eu@i\dimen@ii + \multiply\c@eu@ 3000\relax + \divide\c@eu@i 6\relax + \divide\c@eu@\c@eu@i + \c@eu@i\c@eu@ + \ifnum\number\c@eu@ <\eu@minwhitespace + \c@eu@\eu@minwhitespace + \fi + \advance\c@eu@ -\c@eu@i + \c@eu@i\c@eu@ + \divide\c@eu@i\@m + \edef\eu@mkern@left{\number\c@eu@i} + \multiply\c@eu@i\@m + \advance\c@eu@ -\c@eu@i + \edef\eu@mkern@left{\eu@mkern@left.\three@digits{\number\c@eu@}mu} + \dimen@\dimen@iv + \dimen@ii 1em + \c@eu@\dimen@ + \c@eu@i\dimen@ii + \multiply\c@eu@ 3000\relax + \divide\c@eu@i 6\relax + \divide\c@eu@\c@eu@i + \c@eu@i\c@eu@ + \ifnum\number\c@eu@ <\eu@minwhitespace + \c@eu@\eu@minwhitespace + \fi + \advance\c@eu@ -\c@eu@i + \c@eu@i\c@eu@ + \divide\c@eu@i\@m + \edef\eu@mkern@right{\number\c@eu@i} + \multiply\c@eu@i\@m + \advance\c@eu@ -\c@eu@i + \edef\eu@mkern@right{\eu@mkern@right.\three@digits{\number\c@eu@}mu} + \eu@ifbool{domkern} + {\mkern\eu@mkern@left#1\mkern\eu@mkern@right} + {#1}} + +%% Redefine \" and " in maths mode only. Umlaut and quote definitions remain +%% in effect in text mode. +%% +%% " put the " before a character, e.g $"f$, and the character is +%% printed with kerns on either side. +%% \"..." Surround a series of adjacent characters, e.g. $\"abcde"$ is +%% equivalent to $"a"b"c"d"e$. +%% Note that the tokens that " and \" operate on MUST be characters because +%% they are sent through the XeTeX primitive \XeTeXcharglyph as in: +%% +%% \XeTeXglyphbounds n \the\XeTeXcharglyph`#1 +%% +%% where n = 1,2,3,4 and #1 is the character (If #1 is not a character, then +%% \XeTeXcharglyph`#1 doesn't make sense). Higher level tests are needed to +%% avoid this problem. +\let\eu@original@quote=" +\let\eu@original@csquote=\" +\mathcode`\"="8000 +\newcommand\eu@active@quote{% + \ifmmode + \expandafter\eu@new@quote + \else + \expandafter\eu@original@quote + \fi} +\newcommand\eu@active@csquote{% + \ifmmode + \expandafter\eu@new@csquote + \else + \expandafter\eu@original@csquote + \fi} +\begingroup + \catcode`\"=\active + \global\let"=\eu@active@quote +\endgroup +\let\"=\eu@active@csquote +\newcommand\eu@new@quote[1]{\eu@mkern{#1}} +\def\eu@new@csquote#1"{\eu@mkern{#1}} + +%% Redefine LaTeX 2e kernel macros to do Unicode characters too. Add optional +%% fifth argument. This is a list of control sequences which will be let equal +%% to the symbol if the symbol exists in the font. If the symbol does not exist +%% in the font, then the fifth argument is ignored. +%% +%% e.g. \XeTeXDeclareMathSymbol{≠}{\mathrel}{font}{"2260}[\neq\ne] +\def\XeTeXDeclareMathSymbol#1#2#3#4{% + \expandafter\in@\csname sym#3\expandafter\endcsname + \expandafter{\group@list}% + \ifin@ + \begingroup + \if\relax\noexpand#1% is command? + \edef\reserved@a{\noexpand\in@{\string\mathchar}{\meaning#1}}% + \reserved@a + \ifin@ + \expandafter\XeTeXset@mathsymbol + \csname sym#3\endcsname#1#2{#4}% + \@font@info{Redeclaring math symbol \string#1}% + \else + \expandafter\ifx + \csname\expandafter\@gobble\string#1\endcsname + \relax + \expandafter\XeTeXset@mathsymbol + \csname sym#3\endcsname#1#2{#4}% + \else + \@latex@error{Command `\string#1' already defined}\@eha + \fi + \fi + \else + \expandafter\XeTeXset@mathchar + \csname sym#3\endcsname#1#2{#4}% + \fi + \endgroup + \def\XeTeXDeclareMathSymbol@symbol{#1}% + \def\XeTeXDeclareMathSymbol@slot{#4}% + \expandafter\XeTeXDeclareMathSymbol@option + \else + \@latex@error{Symbol font `#3' is not defined}\@eha + \expandafter\@gobbleoarg + \fi} +\@onlypreamble\XeTeXDeclareMathSymbol +\def\XeTeXset@mathchar#1#2#3#4{% + \global\XeTeXmathcode`#2="\mathchar@type#3#1#4\relax} +\@onlypreamble\XeTeXset@mathchar +\def\XeTeXset@mathsymbol#1#2#3#4{% + \global\XeTeXmathchardef#2"\mathchar@type#3#1#4\relax} +\@onlypreamble\XeTeXset@mathsymbol +\newcommand\@gobbleoarg[1][]{} +\newcommand\XeTeXDeclareMathSymbol@option[1][]{% + \ifnum\the\XeTeXcharglyph\XeTeXDeclareMathSymbol@slot>\z@ + \@tfor\i@tfor #1:=\do% + {\expandafter\edef\i@tfor{\expandonce\XeTeXDeclareMathSymbol@symbol}}% + \fi} + +%% Some shorthands, so the same information isn't typed out more than once +%% +%% \setallmainfonts(<sets>)[<shapes, font features>]{<font name>} +%% \setprimaryfont[<shapes, font features>]{<font name>} +%% \setallsansfonts[<shapes, font features>]{<font name>} +%% \setallmonofonts[<shapes, font features>]{<font name>} +\newcommand\setallmainfonts{ + \@ifnextchar( + {\eu@setallmainfonts} + {\eu@setallmainfonts(Digits,Latin,Greek)}} +\def\eu@setallmainfonts(#1){ + \edef\eu@setmathsfont@Set{#1} + \@eu@setallmainfonts} +\newcommand\@eu@setallmainfonts[2][]{ + \setmainfont[#1]{#2} + \setmathsfont(\eu@setmathsfont@Set)[#1]{#2} + \setmathrm[#1]{#2}} +\newcommand\setprimaryfont{\setallmainfonts(Digits,Latin)} +\newcommand\setallsansfonts[2][]{ + \setsansfont[#1]{#2} + \setmathsf[#1]{#2}} +\newcommand\setallmonofonts[2][]{ + \setmonofont[#1]{#2} + \setmathtt[#1]{#2}} + +%% Set the particular mathematics alphabets +\ernewcommand\setmathrm[2][]{ + \zf@fontspec{#1}{#2} + \let\eu@mathrm\zf@family + \DeclareMathAlphabet{\mathrm}{\eu@enc}{\eu@mathrm}{m}{n} + \SetMathAlphabet{\mathrm}{bold}{\eu@enc}{\eu@mathrm}{bx}{n} + \DeclareMathAlphabet{\mathit}{\eu@enc}{\eu@mathrm}{m}{it} + \DeclareMathAlphabet{\mathbf}{\eu@enc}{\eu@mathrm}{bx}{n} + \SetMathAlphabet{\mathit}{bold}{\eu@enc}{\eu@mathrm}{bx}{it} + \DeclareSymbolFont{Operators:m:n}{\eu@enc}{\eu@mathrm}{m}{n} + \def\operator@font{\expandafter\mathgroup\csname symOperators:m:n\endcsname}} +\ernewcommand\setmathcal[2][]{ + \zf@fontspec{#1}{#2} + \let\eu@mathcal\zf@family + \DeclareMathAlphabet{\mathcal}{\eu@enc}{\eu@mathcal}{m}{n}} +\ernewcommand\setmathsf[2][]{ + \zf@fontspec{#1}{#2} + \let\eu@mathsf\zf@family + \DeclareMathAlphabet{\mathsf}{\eu@enc}{\eu@mathsf}{m}{n} + \SetMathAlphabet{\mathsf}{bold}{\eu@enc}{\eu@mathsf}{bx}{n}} +\ernewcommand\setmathtt[2][]{ + \zf@fontspec{#1}{#2} + \let\eu@mathtt\zf@family + \DeclareMathAlphabet{\mathtt}{\eu@enc}{\eu@mathtt}{m}{n}} +\ernewcommand\setmathfrak[2][]{ + \zf@fontspec{#1}{#2} + \let\eu@mathfrak\zf@family + \DeclareMathAlphabet{\mathfrak}{\eu@enc}{\eu@mathfrak}{m}{n}} +\ernewcommand\setmathbb[2][]{ + \zf@fontspec{#1}{#2} + \let\eu@mathbb\zf@family + \DeclareMathAlphabet{\mathbb}{\eu@enc}{\eu@mathbb}{m}{n}} + +%% If amsmath is loaded, it must be loaded before mathspec. Checking for its +%% existence \AtBeginDocument is too late because the damage is already done +%% (It attempted to define \varTheta when mathspec already defined it). Or +%% should I delay the definition of \varTheta until \AtBeginDocument? +\let\original@RequirePackage\RequirePackage +\renewcommand\RequirePackage[2][]{ + \ifstrequal{#2}{amsmath} + {\PackageError{mathspec} + {`amsmath' must be loaded earlier than `mathspec'} + {Edit the document so that `amsmath' is required earlier than `mathspec'.}} + {\relax} + \original@RequirePackage[#1]{#2}} +\@onlypreamble\RequirePackage +\let\usepackage\RequirePackage +\@onlypreamble\usepackage + +%% Any font changes that mathspec has done are reset by LaTeX 2ε at +%% \begin{document} using \process@table. + +\endinput + +%% © Andrew Gilbert Moschou 2009 +%% +%% This work may be distributed and/or modified under the +%% conditions of the LaTeX Project Public License, either version 1.3c +%% of this license or (at your option) any later version. +%% The latest version of this license is in: +%% http://www.latex-project.org/lppl.txt +%% and version 1.3c or later is part of all recent distributions of LaTeX. +%% +%% This work has the LPPL maintenance status ‘maintained’. +%% The Current Maintainer of this work is Andrew Gilbert Moschou. +%% This work consists of the files mathspec.sty and mathspec.tex. + |