% \iffalse meta-comment
%
% Copyright (C) 1997-2003 by Michael J. Downes
% Copyright (C) 2007-2008 by Morten Hoegholm
% Copyright (C) 2007-2014 by Lars Madsen
% Copyright (C) 2007-2017 by Will Robertson
% Copyright (C) 2010-2017 by Joseph Wright
%
% This work may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either
% version 1.3 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.3 or later is part of all distributions of
% LaTeX version 2005/12/01 or later.
%
% This work has the LPPL maintenance status "maintained".
%
% This Current Maintainer of this work is Will Robertson.
%
% This work consists of the main source file flexisym.dtx
% and the derived files
%    flexisym.sty, flexisym.pdf, flexisym.ins,
%    cmbase.sym, mathpazo.sym, mathptmx.sym, msabm.sym.
%
% Distribution:
%    CTAN:macros/latex/contrib/mh/flexisym.dtx
%    CTAN:macros/latex/contrib/mh/flexisym.pdf
%
% Unpacking:
%    (a) If flexisym.ins is present:
%           tex flexisym.ins
%    (b) Without flexisym.ins:
%           tex flexisym.dtx
%    (c) If you insist on using LaTeX
%           latex \let\install=y\input{flexisym.dtx}
%        (quote the arguments according to the demands of your shell)
%
% Documentation:
%    The class ltxdoc loads the configuration file ltxdoc.cfg
%    if available. Here you can specify further options, e.g.
%    use A4 as paper format:
%       \PassOptionsToClass{a4paper}{article}
%
%    Programm calls to get the documentation (example):
%       pdflatex flexisym.dtx
%       makeindex -s gind.ist flexisym.idx
%       pdflatex flexisym.dtx
%       makeindex -s gind.ist flexisym.idx
%       pdflatex flexisym.dtx
%
% Installation:
%    TDS:tex/latex/breqn/flexisym.sty
%    TDS:tex/latex/breqn/cmbase.sym
%    TDS:tex/latex/breqn/mathpazo.sym
%    TDS:tex/latex/breqn/mathptmx.sym
%    TDS:tex/latex/breqn/msabm.sym
%    TDS:doc/latex/breqn/flexisym.pdf
%    TDS:source/latex/breqn/flexisym.dtx
%
%<*ignore>
\begingroup
  \def\x{LaTeX2e}
\expandafter\endgroup
\ifcase 0\ifx\install y1\fi\expandafter
         \ifx\csname processbatchFile\endcsname\relax\else1\fi
         \ifx\fmtname\x\else 1\fi\relax
\else\csname fi\endcsname
%</ignore>
%<*install>
\input docstrip.tex
\Msg{************************************************************************}
\Msg{* Installation: flexisym}
\Msg{************************************************************************}

\keepsilent
\askforoverwritefalse

\preamble

This is a generated file.

Copyright (C) 1997-2003 by Michael J. Downes
Copyright (C) 2007-2010 by Morten Hoegholm
Copyright (C) 2007-2014 by Lars Madsen
Copyright (C) 2007-2017 by Will Robertson
Copyright (C) 2010-2017 by Joseph Wright

This work may be distributed and/or modified under the
conditions of the LaTeX Project Public License, either
version 1.3 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.3 or later is part of all distributions of
LaTeX version 2005/12/01 or later.

This work has the LPPL maintenance status "maintained".

The Current Maintainer of this work is Will Robertson.

This work consists of the main source file flexisym.dtx
and the derived files
   flexisym.sty, flexisym.pdf, flexisym.ins,
   cmbase.sym, mathpazo.sym, mathptmx.sym, msabm.sym.

\endpreamble

\generate{%
  \file{flexisym.ins}{\from{flexisym.dtx}{install}}%
  \usedir{tex/latex/breqn}%
  \file{flexisym.sty}{\from{flexisym.dtx}{package}}%
  \file{cmbase.sym}{\from{flexisym.dtx}{cmbase}}%
  \file{mathpazo.sym}{\from{flexisym.dtx}{mathpazo}}%
  \file{mathptmx.sym}{\from{flexisym.dtx}{mathptmx}}%
  \file{msabm.sym}{\from{flexisym.dtx}{msabm}}%
}

\obeyspaces
\Msg{************************************************************************}
\Msg{*}
\Msg{* To finish the installation you have to move the following}
\Msg{* files into a directory searched by TeX:}
\Msg{*}
\Msg{*     flexisym.sty, cmbase.sym, mathpazo.sym, mathptmx.sym, msabm.sym}
\Msg{*}
\Msg{* Happy TeXing!}
\Msg{*}
\Msg{************************************************************************}

\endbatchfile
%</install>
%<*ignore>
\fi
%</ignore>
%<*driver>
\NeedsTeXFormat{LaTeX2e}
\ProvidesFile{flexisym.drv}[2017/01/27 0.98e flexisym]
\documentclass{ltxdoc}
\CodelineIndex
\EnableCrossrefs
\setcounter{IndexColumns}{2}
%\providecommand*\meta[1]{\ensuremath\langle\textit{#1}\ensuremath\rangle}
\providecommand*\pkg[1]{\textsf{#1}}
\providecommand*\cls[1]{\textsf{#1}}
\providecommand*\opt[1]{\texttt{#1}}
\providecommand*\env[1]{\texttt{#1}}
\providecommand*\fn[1]{\texttt{#1}}
\makeatletter
\providecommand{\AmS}{{\protect\AmSfont
  A\kern-.1667em\lower.5ex\hbox{M}\kern-.125emS}}
\providecommand{\AmSfont}{%
  \usefont{OMS}{cmsy}{\if\expandafter\@car\f@series\@nil bb\else m\fi}{n}}
\makeatother
\newenvironment{aside}{\begin{quote}\bfseries}{\end{quote}}
\begin{document}
  \DocInput{flexisym.dtx}
\end{document}
%</driver>
% \fi
%
% \GetFileInfo{flexisym.drv}
% \title{The \textsf{flexisym} package}
% \date{\filedate\space\fileversion}
% \author{Authors: Michael J. Downes, Morten H\o gholm\\ Maintained by Morten H\o gholm, Will Robertson\\ Feedback: \texttt{https://github.com/wspr/breqn/issues}}
%
% \maketitle
%
% \part*{User's guide}
%
% For now, the user's guide is in breqn.
%
% \StopEventually{}
% \part*{Implementation}
%
% \section{flexisym}
%
%    \begin{macrocode}
%<*package>
\RequirePackage{expl3}[2009/08/05]
\ProvidesExplPackage{flexisym}{2017/01/27}{0.98e}{Make math characters macros}

\edef\do{%
  \noexpand\AtEndOfPackage{%
    \catcode\number`\"=\number\catcode`\"
    \relax
  }%
}
\do \let\do\relax
\catcode`\"=12
\let\@sym\@gobble
\DeclareOption{robust}{%
  \def\@sym#1{%
    \ifx\protect\@typeset@protect \else\protect#1\exp_after:wN\use_none:nnnn\fi
  }%
}
%    \end{macrocode}
% The math groups (mg) here relate to |\textfont|$n$.
%    \begin{macrocode}
\def\mg@bin{2}% binary operators
\def\mg@rel{2}% relations
%%\def\mg@nre{B}% negated relations
\def\mg@del{3}% delimiters
%%\def\mg@arr{B}% arrows
\def\mg@acc{0}% accents
\def\mg@cop{3}% cumulative operators (sum, int)
\def\mg@latin{1}% (Latin) letters
\def\mg@greek{1}% (lowercase) Greek
\def\mg@Greek{0}% (capital) Greek
%%\def\mg@bflatin{4}% bold upright Latin letters ?
%%\def\mg@Bbb{B}% blackboard bold
\def\mg@cal{2}% script/calligraphic
%%\def\mg@frak{5}% Fraktur letters
\def\mg@digit{0}% decimal digits % 1 = oldstyle, 0 = capital
%    \end{macrocode}
% This is how we insert mathchars. The command has three arguments:
% class, fam and slot postion and so it is always given as
% hexadecimal.  This way of separating things should make it easier
% to get this to work with XeTeX et al.\ which have many more slot
% positions
%    \begin{macrocode}
\cs_set_protected:Nn \math_char:NNn {
  \tex_mathchar:D \__int_eval:w " #1#2#3 \__int_eval_end:
}
%    \end{macrocode}
% Delimiters and radicals are similar except here we have both small
% and large variant. Radicals have no class.
%    \begin{macrocode}
\cs_set_protected:Nn \math_delimiter:NNnNn {
  \tex_delimiter:D \__int_eval:w " #1#2#3#4#5 \__int_eval_end:
}
\cs_set_protected:Nn \math_radical:NnNn {
  \tex_radical:D  \__int_eval:w " #1#2#3#4 \__int_eval_end:
}
\cs_set_protected:Nn \math_accent:NNnn {
  \tex_mathaccent:D \__int_eval:w " #1 #2 #3 \__int_eval_end: {#4}
}

\let\sumlimits\displaylimits
\let\intlimits\nolimits
\let\namelimits\displaylimits
%    \end{macrocode}
% \TeX\ defines  eight types of atoms.
% \begin{enumerate}\addtocounter{enumi}{-1}
% \item Ordinary
% \item Operators
% \item Binary
% \item Relation
% \item Open
% \item Close
% \item Punctuation
% \item Inner
% \end{enumerate}
% \TeX\ defines  eight math classes.
% \begin{enumerate}\addtocounter{enumi}{-1}
% \item Ordinary
% \item Operators
% \item Binary
% \item Relation
% \item Open
% \item Close
% \item Punctuation
% \item Variable family
% \end{enumerate}
% flexisym/breqn extends this to  types of classes.
% \begin{enumerate}\addtocounter{enumi}{-1}
% \item Ordinary: (Ord), Bidirectional delimiters (DeB), Radicals
%   (Rad), Accented items (Acc)
% \item Operators: Cumulative Operators sum-like (COs), Cumulative
%   Operators integral-like (COi)
% \item Binary: (Bin)
% \item Relation: (Rel), Arrow delimiters (DeA)
% \item Open: (DeL)
% \item Close (DeR)
% \item Punctuation: (Pun)
% \item Variable family: (Var)
% \end{enumerate}
%
% Here's an overview of what we are about to do. Math chars of each
% type as defined by us need a basic operation for inserting it. We
% will call that function |\math_bsym_|\meta{type}|:Nn|. Next there
% are compund symbols for each type which we name
% |\math_bcsym_|\meta{type}|:Nn|. Also, there is inline mode and
% display mode which are different. We will call them for
% |\math_isym_|\meta{type}|:Nn| |\math_icsym_|\meta{type}|:Nn| for
% inline mode and |\math_dsym_|\meta{type}|:Nn| and
% |\math_dcsym_|\meta{type}|:Nn|. The code uses the terms
% |\math_sym_|\meta{type}|:Nn| and |\math_csym_|\meta{type}|:Nn| for
% the current meaning of things.  First up the basic definitions. |#1|
% is the math group it is from and |#2| is the slot position.
%    \begin{macrocode}
\cs_new:Npn \math_bsym_Ord:Nn {\math_char:NNn 0 }% \m@Ord
\cs_new:Npn \math_bsym_Var:Nn {\math_char:NNn 7 }% \m@Var
\cs_new:Npn \math_bsym_Bin:Nn {\math_char:NNn 2 }% \m@Bin
\cs_new:Npn \math_bsym_Rel:Nn {\math_char:NNn 3 }% \m@Bin
\cs_new:Npn \math_bsym_Pun:Nn {\math_char:NNn 6 }% \m@Pun
\cs_new:Nn  \math_bsym_COs:Nn { \math_char:NNn 1 #1 {#2} \sumlimits }% \m@COs
\cs_new:Nn  \math_bsym_COi:Nn { \math_char:NNn 1 #1 {#2} \intlimits }% \m@COi
\cs_new:Nn  \math_bsym_DeL:Nn { \math_sd_del_aux:Nnn 4 #1{#2} }% \m@DeL
\cs_new:Nn  \math_bsym_DeR:Nn { \math_sd_del_aux:Nnn 5 #1{#2} }% \m@DeR
\cs_new:Nn  \math_bsym_DeB:Nn { \math_sd_del_aux:Nnn 0 #1{#2} }% \m@DeB
\cs_new:Nn  \math_bsym_DeA:Nn { \math_sd_del_aux:Nnn 3 #1{#2} }% \m@DeA
\cs_new:Nn  \math_bsym_Rad:Nn { \math_sd_rad_aux:Nn #1{#2} }% \m@Rad
\cs_new:Npn \math_bsym_Acc:Nn #1#2#3#4 {\math_accent:NNnn #1#2{#3}{#4}}% name is wrong

%    \end{macrocode}
% Next is somewhat complicated internally. The way it is done is that
% delimiters and radicals need information about the smallest version
% of the symbol.  If this smallest delimiter (SD) is defined, then use
% it. We have these functions to help us return the number. Extract
% the numbers to use and stick a function in front of it.
%
% Code changed because now we require the smallest delimiter to be
% defined (it may be the same, no problem in that). So the two
% arguments present in |\math_bsym_DeL:Nn| are the location of
% extensible version (where the font will do the rest for us
% automatically). For each delimiter, a pointer is defined using the
% extensible characters family and slot as name and value equal to
% family and position of the smallest version. For |(| in standard
% \LaTeX\ this is |{del}{00}| and |{OT1}{28}| respectively. Hence,
% |\math_bsym_DeL:Nn \mg@del {00}| must expand to
% |\math_delimiter:NNnNn 4 \mg@OT1 {28}\mg@del{00}|. So first expand
% away to get to the smallest version. Then call next function which
% shuffles the arguments around.
%    \begin{macrocode}
\cs_set:Npn \math_sd_del_aux:Nnn #1#2#3{
  \exp_args:Nf \math_sd_del_auxi:nN {\use:c{sd@#2#3}} #1 #2{#3}
}
\cs_set:Npn \math_sd_del_auxi:nN #1#2{ \math_delimiter:NNnNn #2 #1 }
%    \end{macrocode}
% Same for radicals.
%    \begin{macrocode}
\cs_set:Npn \math_sd_rad_aux:Nn #1#2{
  \exp_args:Nf \math_sd_rad_auxi:n {\use:c{sd@#1#2}} #1 {#2}
}
\cs_set:Npn \math_sd_rad_auxi:n #1{ \math_radical:NnNn #1 }


% \cs_set:Npn \math_sd_aux:nn  #1#2 {
%   %\exp_args:Nnf \use:nn { #1}  { \math_sd_auxi:Nn #2 }
%   \exp_args:Nnf \use:nn { #1}  { \use:c{sd@\use:nn#2} }
% }
% \cs_set:Npn \math_sd_auxi:Nn #1#2 {
%    \cs_if_free:cTF {sd@#1#2}
%   {   #1{#2}  }
%   {   \use:c{sd@#1#2}  }
% }
%    \end{macrocode}
% compound symbols here
%    \begin{macrocode}
\cs_set_protected:Npn \math_bcsym_Ord:Nn #1#2 { \@symtype \mathord   { \OrdSymbol {#2} } }%\@symOrd
\cs_set_protected:Npn \math_bcsym_Var:Nn #1#2 { \@symtype \mathord   { \OrdSymbol {#2} } }%\@symVar
\cs_set_protected:Npn \math_bcsym_Bin:Nn #1#2 { \@symtype \mathbin   { \OrdSymbol {#2} } }%\@symBin
\cs_set_protected:Npn \math_bcsym_Rel:Nn #1#2 { \@symtype \mathrel   { \OrdSymbol {#2} } }%\@symRel
\cs_set_protected:Npn \math_bcsym_Pun:Nn #1#2 { \@symtype \mathpunct { \OrdSymbol {#2} } }%\@symPun
\cs_set_protected:Npn \math_bcsym_COi:Nn #1#2 { \@symtype \mathop    { \OrdSymbol {#2} \intlimits } }%\@symCOi
\cs_set_protected:Npn \math_bcsym_COs:Nn #1#2 { \@symtype \mathop    { \OrdSymbol {#2} \sumlimits } }%\@symCOs
\cs_set_protected:Npn \math_bcsym_DeL:Nn #1#2 { \@symtype \mathopen  { \OrdSymbol {#2} } }%\@symDeL
\cs_set_protected:Npn \math_bcsym_DeR:Nn #1#2 { \@symtype \mathclose { \OrdSymbol {#2} } }%\@symDeR
\cs_set_protected:Npn \math_bcsym_DeB:Nn #1#2 { \@symtype \mathord   { \OrdSymbol {#2} } }%\@symDeB
\cs_set_protected:Npn \math_bcsym_DeA:Nn #1#2 { \@symtype \mathrel   { \OrdSymbol {#2} } }%\@symDeA
\cs_set_protected:Npn \math_bcsym_Acc:Nn {\@sym}%\@symAcc FIX!
% These three?
\cs_set_protected:Npn \math_bcsym_Ope:Nn #1#2{\@symtype\mathopen{\OrdSymbol{#2}}}%\@symVar
\cs_set_protected:Npn \math_bcsym_Clo:Nn #1#2{\@symtype\mathclose{\OrdSymbol{#2}}}%\@symVar
\cs_set_protected:Npn \math_bcsym_Inn:Nn #1#2{\@symtype\mathinner{\OrdSymbol{#2}}}%\@symVar

\let\@symtype\@firstofone
\let\sym@global\global
%    \end{macrocode}
%
%
%
%
% The inline variants, using the basic operations. Currently we do not
% do anything to inline math.
%    \begin{macrocode}
\cs_new:Npn \math_isym_Ord:Nn { \math_bsym_Ord:Nn }% \m@Ord
\cs_new:Npn \math_isym_Var:Nn { \math_bsym_Var:Nn }% \m@Var
\cs_new:Npn \math_isym_Bin:Nn { \math_bsym_Bin:Nn }% \m@Bin
\cs_new:Npn \math_isym_Rel:Nn { \math_bsym_Rel:Nn }% \m@Bin
\cs_new:Npn \math_isym_Pun:Nn { \math_bsym_Pun:Nn }% \m@Pun
\cs_new:Npn \math_isym_COs:Nn { \math_bsym_COs:Nn }% \m@COs
\cs_new:Npn \math_isym_COi:Nn { \math_bsym_COi:Nn }% \m@COi
\cs_new:Npn \math_isym_DeL:Nn { \math_bsym_DeL:Nn }% \m@DeL
\cs_new:Npn \math_isym_DeR:Nn { \math_bsym_DeR:Nn }% \m@DeR
\cs_new:Npn \math_isym_DeB:Nn { \math_bsym_DeB:Nn }% \m@DeB
\cs_new:Npn \math_isym_DeA:Nn { \math_bsym_DeA:Nn }% \m@DeA
\cs_new:Npn \math_isym_Rad:Nn { \math_bsym_Rad:Nn }% \m@Rad
\cs_new:Npn \math_isym_Acc:Nn { \math_bsym_DeL:Nn }% name is wrong
% inline compound
\cs_set_protected:Npn \math_icsym_Ord:Nn { \math_bcsym_Ord:Nn }
\cs_set_protected:Npn \math_icsym_Var:Nn { \math_bcsym_Var:Nn }
\cs_set_protected:Npn \math_icsym_Bin:Nn { \math_bcsym_Bin:Nn }
\cs_set_protected:Npn \math_icsym_Rel:Nn { \math_bcsym_Rel:Nn }
\cs_set_protected:Npn \math_icsym_Pun:Nn { \math_bcsym_Pun:Nn }
\cs_set_protected:Npn \math_icsym_COi:Nn { \math_bcsym_COi:Nn }
\cs_set_protected:Npn \math_icsym_COs:Nn { \math_bcsym_COs:Nn }
\cs_set_protected:Npn \math_icsym_DeL:Nn { \math_bcsym_DeL:Nn }
\cs_set_protected:Npn \math_icsym_DeR:Nn { \math_bcsym_DeR:Nn }
\cs_set_protected:Npn \math_icsym_DeB:Nn { \math_bcsym_DeB:Nn }
\cs_set_protected:Npn \math_icsym_DeA:Nn { \math_bcsym_DeA:Nn }
\cs_set_protected:Npn \math_icsym_Acc:Nn { \math_bcsym_Acc:Nn }
\cs_set_protected:Npn \math_icsym_Ope:Nn { \math_bcsym_Ope:Nn }
\cs_set_protected:Npn \math_icsym_Clo:Nn { \math_bcsym_Clo:Nn }
\cs_set_protected:Npn \math_icsym_Inn:Nn { \math_bcsym_Inn:Nn }
%    \end{macrocode}
%
% The display variants, using the basic operations. Currently we do
% not do anything to inline math.
%    \begin{macrocode}
\cs_new:Npn \math_dsym_Ord:Nn { \math_bsym_Ord:Nn }
\cs_new:Npn \math_dsym_Var:Nn { \math_bsym_Var:Nn }
\cs_new:Npn \math_dsym_Bin:Nn { \math_bsym_Bin:Nn }
\cs_new:Npn \math_dsym_Rel:Nn { \math_bsym_Rel:Nn }
\cs_new:Npn \math_dsym_Pun:Nn { \math_bsym_Pun:Nn }
\cs_new:Npn \math_dsym_COs:Nn { \math_bsym_COs:Nn }
\cs_new:Npn \math_dsym_COi:Nn { \math_bsym_COi:Nn }
\cs_new:Npn \math_dsym_DeL:Nn { \math_bsym_DeL:Nn }
\cs_new:Npn \math_dsym_DeR:Nn { \math_bsym_DeR:Nn }
\cs_new:Npn \math_dsym_DeB:Nn { \math_bsym_DeB:Nn }
\cs_new:Npn \math_dsym_DeA:Nn { \math_bsym_DeA:Nn }
\cs_new:Npn \math_dsym_Rad:Nn { \math_bsym_Rad:Nn }
\cs_new:Npn \math_dsym_Acc:Nn { \math_bsym_DeL:Nn }
% inline compound
\cs_set_protected:Npn \math_dcsym_Ord:Nn { \math_bcsym_Ord:Nn }
\cs_set_protected:Npn \math_dcsym_Var:Nn { \math_bcsym_Var:Nn }
\cs_set_protected:Npn \math_dcsym_Bin:Nn { \math_bcsym_Bin:Nn }
\cs_set_protected:Npn \math_dcsym_Rel:Nn { \math_bcsym_Rel:Nn }
\cs_set_protected:Npn \math_dcsym_Pun:Nn { \math_bcsym_Pun:Nn }
\cs_set_protected:Npn \math_dcsym_COi:Nn { \math_bcsym_COi:Nn }
\cs_set_protected:Npn \math_dcsym_COs:Nn { \math_bcsym_COs:Nn }
\cs_set_protected:Npn \math_dcsym_DeL:Nn { \math_bcsym_DeL:Nn }
\cs_set_protected:Npn \math_dcsym_DeR:Nn { \math_bcsym_DeR:Nn }
\cs_set_protected:Npn \math_dcsym_DeB:Nn { \math_bcsym_DeB:Nn }
\cs_set_protected:Npn \math_dcsym_DeA:Nn { \math_bcsym_DeA:Nn }
\cs_set_protected:Npn \math_dcsym_Acc:Nn { \math_bcsym_Acc:Nn }
\cs_set_protected:Npn \math_dcsym_Ope:Nn { \math_bcsym_Ope:Nn }
\cs_set_protected:Npn \math_dcsym_Clo:Nn { \math_bcsym_Clo:Nn }
\cs_set_protected:Npn \math_dcsym_Inn:Nn { \math_bcsym_Inn:Nn }
%    \end{macrocode}
% Almost ready now! Now just need two commands to initialize these
% settings.
%
%    \begin{macrocode}
\cs_set:Npn \math_setup_inline_symbols:
 {
  \cs_set_eq:NN \math_sym_Ord:Nn  \math_isym_Ord:Nn
  \cs_set_eq:NN \math_sym_Var:Nn  \math_isym_Var:Nn
  \cs_set_eq:NN \math_sym_Bin:Nn  \math_isym_Bin:Nn
  \cs_set_eq:NN \math_sym_Rel:Nn  \math_isym_Rel:Nn
  \cs_set_eq:NN \math_sym_Pun:Nn  \math_isym_Pun:Nn
  \cs_set_eq:NN \math_sym_COs:Nn  \math_isym_COs:Nn
  \cs_set_eq:NN \math_sym_COi:Nn  \math_isym_COi:Nn
  \cs_set_eq:NN \math_sym_DeL:Nn  \math_isym_DeL:Nn
  \cs_set_eq:NN \math_sym_DeR:Nn  \math_isym_DeR:Nn
  \cs_set_eq:NN \math_sym_DeB:Nn  \math_isym_DeL:Nn
  \cs_set_eq:NN \math_sym_DeA:Nn  \math_isym_DeA:Nn
  \cs_set_eq:NN \math_sym_Rad:Nn  \math_isym_Rad:Nn
  \cs_set_eq:NN \math_sym_Acc:Nn  \math_isym_DeL:Nn
  \cs_set_eq:NN \math_csym_Ord:Nn \math_icsym_Ord:Nn
  \cs_set_eq:NN \math_csym_Var:Nn \math_icsym_Var:Nn
  \cs_set_eq:NN \math_csym_Bin:Nn \math_icsym_Bin:Nn
  \cs_set_eq:NN \math_csym_Rel:Nn \math_icsym_Rel:Nn
  \cs_set_eq:NN \math_csym_Pun:Nn \math_icsym_Pun:Nn
  \cs_set_eq:NN \math_csym_COi:Nn \math_icsym_COi:Nn
  \cs_set_eq:NN \math_csym_COs:Nn \math_icsym_COs:Nn
  \cs_set_eq:NN \math_csym_DeL:Nn \math_icsym_DeL:Nn
  \cs_set_eq:NN \math_csym_DeR:Nn \math_icsym_DeR:Nn
  \cs_set_eq:NN \math_csym_DeB:Nn \math_icsym_DeB:Nn
  \cs_set_eq:NN \math_csym_DeA:Nn \math_icsym_DeA:Nn
  \cs_set_eq:NN \math_csym_Acc:Nn \math_icsym_Acc:Nn
  \cs_set_eq:NN \math_csym_Ope:Nn \math_icsym_Ope:Nn
  \cs_set_eq:NN \math_csym_Clo:Nn \math_icsym_Clo:Nn
  \cs_set_eq:NN \math_csym_Inn:Nn \math_icsym_Inn:Nn
 }

\cs_set:Npn \math_setup_display_symbols:
 {
  \cs_set_eq:NN \math_sym_Ord:Nn  \math_dsym_Ord:Nn
  \cs_set_eq:NN \math_sym_Var:Nn  \math_dsym_Var:Nn
  \cs_set_eq:NN \math_sym_Bin:Nn  \math_dsym_Bin:Nn
  \cs_set_eq:NN \math_sym_Rel:Nn  \math_dsym_Rel:Nn
  \cs_set_eq:NN \math_sym_Pun:Nn  \math_dsym_Pun:Nn
  \cs_set_eq:NN \math_sym_COs:Nn  \math_dsym_COs:Nn
  \cs_set_eq:NN \math_sym_COi:Nn  \math_dsym_COi:Nn
  \cs_set_eq:NN \math_sym_DeL:Nn  \math_dsym_DeL:Nn
  \cs_set_eq:NN \math_sym_DeR:Nn  \math_dsym_DeR:Nn
  \cs_set_eq:NN \math_sym_DeB:Nn  \math_dsym_DeL:Nn
  \cs_set_eq:NN \math_sym_DeA:Nn  \math_dsym_DeA:Nn
  \cs_set_eq:NN \math_sym_Rad:Nn  \math_dsym_Rad:Nn
  \cs_set_eq:NN \math_sym_Acc:Nn  \math_dsym_DeL:Nn
  \cs_set_eq:NN \math_csym_Ord:Nn \math_dcsym_Ord:Nn
  \cs_set_eq:NN \math_csym_Var:Nn \math_dcsym_Var:Nn
  \cs_set_eq:NN \math_csym_Bin:Nn \math_dcsym_Bin:Nn
  \cs_set_eq:NN \math_csym_Rel:Nn \math_dcsym_Rel:Nn
  \cs_set_eq:NN \math_csym_Pun:Nn \math_dcsym_Pun:Nn
  \cs_set_eq:NN \math_csym_COi:Nn \math_dcsym_COi:Nn
  \cs_set_eq:NN \math_csym_COs:Nn \math_dcsym_COs:Nn
  \cs_set_eq:NN \math_csym_DeL:Nn \math_dcsym_DeL:Nn
  \cs_set_eq:NN \math_csym_DeR:Nn \math_dcsym_DeR:Nn
  \cs_set_eq:NN \math_csym_DeB:Nn \math_dcsym_DeB:Nn
  \cs_set_eq:NN \math_csym_DeA:Nn \math_dcsym_DeA:Nn
  \cs_set_eq:NN \math_csym_Acc:Nn \math_dcsym_Acc:Nn
  \cs_set_eq:NN \math_csym_Ope:Nn \math_dcsym_Ope:Nn
  \cs_set_eq:NN \math_csym_Clo:Nn \math_dcsym_Clo:Nn
  \cs_set_eq:NN \math_csym_Inn:Nn \math_dcsym_Inn:Nn
 }
%    \end{macrocode}
% Phew, that was it.
%
% Well, almost. We need to set them up for use properly. Should they
% be added to |\everymath|? Probably, for math within
% displays. However, this is a lot of extra processing which we could
% tackle in the display setup.
%    \begin{macrocode}
\math_setup_inline_symbols:
%    \end{macrocode}
%
% Need an active character for a second. Don't rely on |~| being
% active!
%    \begin{macrocode}
\edef\tmp{\catcode\z@=\the\catcode\z@}
\catcode\z@=\active
\def\DeclareFlexSymbol#1#2#3#4{%
  \begingroup
  \cs_set_protected:Npx\@tempb{
    \exp_not:N\@sym\exp_not:N#1\exp_not:c{math_sym_#2:Nn}
        \exp_not:c{mg@#3}{#4}
  }
  \ifcat\exp_not:N#1\relax
    \sym@global\let#1\@tempb
  \else
    \sym@global\mathcode`#1="8000\relax
    \lccode\z@=`#1\relax
    \lowercase{\sym@global\let^^@\@tempb}% zero char
  \fi
  \endgroup
}
\tmp % restore catcode
\cs_set:Npn \DeclareFlexDelimiter #1#2#3#4#5#6{
  \DeclareFlexSymbol{#1}{#2}{#3}{#4}
  \cs_gset:cpx{sd@\use:c{mg@#3}#4}{\exp_not:c{mg@#5}{#6}}
}

%    \end{macrocode}
% |\DeclareFlexCompoundSymbol{\cdots}{Inn}{\cdotp\cdotp\cdotp}|
% |\def\@symInn#1#2{\@symtype\mathinner{\OrdSymbol{#2}}}|
% |\@symtype \mathinner{\OrdSymbol{\cdtop\cdotp\cdotp}}|
%    \begin{macrocode}
\def\DeclareFlexCompoundSymbol#1#2#3{%
  \exp_args:NNo \DeclareRobustCommand#1{\csname math_csym_#2:Nn\endcsname#1{#3}}%
  \sym@global\let#1#1\relax
}
\DeclareRobustCommand\textchar{\text@char\textfont}
\DeclareRobustCommand\scriptchar{\text@char\scriptfont}%
%    \end{macrocode}
% Simplified the next bit because now the slot is read as one argument
% so no afterassignment and what have you. Just drop the char
% directly.
%    \begin{macrocode}
\def\text@char@sym#1#2#3#4{% #3=fam, #4=slot
  \begingroup
    \cs_set_eq:NN \@sym \prg_do_nothing: % defense against infinite loops
%    \end{macrocode}
% the next line will result in |\scriptfont|\meta{num}, where |#3|
% provides the \meta{num}.
%    \begin{macrocode}
   \the\text@script@char#3%
   \char"#4\endgroup
}
\edef\tmp{\catcode\z@=\the\catcode\z@}
\catcode\z@=\active
\def\text@char#1#2{\begingroup
  \check@mathfonts
  \cs_set_eq:NN \text@script@char #1
  \cs_set_eq:NN \@sym \text@char@sym
  \cs_set_eq:NN \@symtype \use_ii:nn
  \cs_set_eq:NN \OrdSymbol \use:n
  \cs_set_eq:NN \ifmmode \iftrue
  \everymath{$\use_none:n}%$
  \def\mkern{\muskip\z@}
  \cs_set_eq:NN\mskip\mkern
  \ifcat\relax\noexpand#2% true if #2 is a cs.
    #2%
  \else
    \lccode\z@=\expandafter`\string#2\relax
    \lowercase{^^@}%
  \fi
  \endgroup
}
\tmp % restore catcode
\providecommand\textprime{}
\DeclareRobustCommand\textprime{\leavevmode
  \raise.8ex\hbox{\text@char\scriptfont\prime}%
}
\@ifundefined{resetMathstrut@}{}{%
  \def\resetMathstrut@{%
    \setbox\z@\hbox{\textchar\vert}%
    \ht\Mathstrutbox@\ht\z@ \dp\Mathstrutbox@\dp\z@
  }%
}
%    \end{macrocode}
% Arrow fills. changed to 7mu as in amsmath
%    \begin{macrocode}
\@ifundefined{rightarrowfill@}{}{%
  \def\rightarrowfill@#1{\m@th\setboxz@h{$#1\relbar$}\ht\z@\z@
    $#1\copy\z@\mkern-7mu\cleaders
    \hbox{$#1\mkern-2mu\box\z@\mkern-2mu$}\hfill
    \mkern-6mu\OrdSymbol{\rightarrow}$}
  \def\leftarrowfill@#1{\m@th\setboxz@h{$#1\relbar$}\ht\z@\z@
    $#1\OrdSymbol{\leftarrow}\mkern-6mu\cleaders
    \hbox{$#1\mkern-2mu\copy\z@\mkern-2mu$}\hfill
    \mkern-7mu\box\z@$}
  \def\leftrightarrowfill@#1{\m@th\setboxz@h{$#1\relbar$}\ht\z@\z@
    $#1\OrdSymbol{\leftarrow}\mkern-6mu\cleaders
    \hbox{$#1\mkern-2mu\box\z@\mkern-2mu$}\hfill
    \mkern-6mu\OrdSymbol{\rightarrow}$}
}
%    \end{macrocode}
% hey, this looks like a simple case switch...
%    \begin{macrocode}
\def\binrel@sym#1#2#3#4{%
  \xdef\binrel@@##1{%
    \ifx\math_sym_Ord:Nn #2 \math_csym_Ord:Nn
    \else\ifx\math_sym_Var:Nn#2 \math_csym_Var:Nn
    \else\ifx\math_sym_COs:Nn#2 \math_csym_COs:Nn
    \else\ifx\math_sym_COi:Nn#2 \math_csym_COi:Nn
    \else\ifx\math_sym_Bin:Nn#2 \math_csym_Bin:Nn
    \else\ifx\math_sym_Rel:Nn#2 \math_csym_Rel:Nn
    \else\ifx\math_sym_Pun:Nn#2 \math_csym_Pun:Nn
    \else\exp_not:N\@symErr \fi\fi\fi\fi\fi\fi\fi
  ?{\exp_not:N\OrdSymbol{##1}}}%
}

\def\binrel@a{%
  \def\math_sym_Ord:Nn##1##2{\gdef\binrel@@####1{\math_sym_Ord:Nn##1{\OrdSymbol{####1}}}}%
  \def\math_sym_Var:Nn##1##2{\gdef\binrel@@####1{\math_sym_Var:Nn##1{\OrdSymbol{####1}}}}%
  \def\math_sym_COs:Nn##1##2{\gdef\binrel@@####1{\math_sym_COs:Nn##1{\OrdSymbol{####1}}}}%
  \def\math_sym_COi:Nn##1##2{\gdef\binrel@@####1{\math_sym_COi:Nn##1{\OrdSymbol{####1}}}}%
  \def\math_sym_Bin:Nn##1##2{\gdef\binrel@@####1{\math_sym_Bin:Nn##1{\OrdSymbol{####1}}}}%
  \def\math_sym_Rel:Nn##1##2{\gdef\binrel@@####1{\math_sym_Rel:Nn##1{\OrdSymbol{####1}}}}%
  \def\math_sym_Pun:Nn##1##2{\gdef\binrel@@####1{\math_sym_Pun:Nn##1{\OrdSymbol{####1}}}}%
}
\def\binrel@#1{%
  \setbox\z@\hbox{$%
    \let\mathchoice\@gobblethree
    \let\@sym\binrel@sym \binrel@a
    #1$}%
}
\def\@symextension{sym}
\newcommand\usesymbols[1]{%
  \clist_map_variable:nNn{#1}\@tempb{%
    \exp_args:No\@onefilewithoptions{\@tempb}[][]\@symextension
  }%
}
% Need to introduce \ProvidesExplFile somehow
\newcommand\ProvidesSymbols[1]{\ProvidesFile{#1.sym}}
\DeclareRobustCommand{\not}[1]{\math_csym_Rel:Nn\not{\OrdSymbol{\notRel#1}}}
\DeclareRobustCommand{\OrdSymbol}[1]{%
  \begingroup\mathchars@reset#1\endgroup
}
\def\mathchars@reset{\let\@sym\@sym@ord \let\@symtype\@symtype@ord
  \let\OrdSymbol\relax}
\def\@symtype@ord#1#{}% a strange sort of \@gobble
\def\@sym@ord#1#2{\exp_after:wN\@sym@ord@a\string#2\@nil}%
%    \end{macrocode}
% Read delimited argument here. We want to find first character of
% DeA, Bin, etc. and the control sequence checked agains is |\m@DeL|,
% |\m@Pun|, etc.  The lccode trick makes the . into an @ with catcode
% 12. This is what results when the code is called with
% |\string|. Beware of this when we change internal names for math
% groups! If a Delimiter is found, insert it with class 0 but use the
% smallest version available. Otherwise just insert math char of class
% 0. The code here is not pretty and it indicates it should be tackled
% differently!
%    \begin{macrocode}
\begingroup
\lccode`\.=`\_ \lowercase{\endgroup
\def\@sym@ord@a#1.#2.}#3#4\@nil#5#6{%
  \if D#3
     %\math_ord_delim_aux:Nn #5{#6}
     \math_sd_del_aux:Nnn 0 #5{#6}% check if this works!
  \else
    \math_char:NNn 0 #5{#6}
  \fi
}
\cs_set:Nn \math_ord_delim_aux:Nn {
  \math_sd_aux:nn { \math_char:NNn 0 } {#1{#2}}
}
%    \end{macrocode}
%
%
% Before declaring any math characters active, we have to take care of
% a small problem with \pkg{amsmath} v2.x, if it is loaded before
% \pkg{flexisym}. \cs{std@minus} and \cs{std@equal} are defined as
% \begin{verbatim}
% \mathchardef\std@minus\mathcode`\-\relax
% \mathchardef\std@equal\mathcode`\=\relax
% \end{verbatim}
% in \fn{amsmath.sty} and again \cs{AtBeginDocument}. The
% latter is because
% \begin{quote}
%   In case some alternative math fonts are loaded
%   later. [\fn{amsmath.dtx}]
% \end{quote}
% The problem arises because \pkg{flexisym} sets the mathcode of all
% symbols to $32768$ which is illegal for a \cs{mathchardef}.
%
% We have to remove the assignments from the \cs{AtBeginDocument} hook
% as they will cause an error there.
%    \begin{macrocode}
\@ifpackageloaded{amsmath}{%
  \begingroup
%    \end{macrocode}
% Split the contents of \cs{@begindocumenthook} by reading what we
% search for as a delimited argument and ensure these two assignments
% do not take place. It is questionable if anything reasonable can be
% done to them. In the case of a package such as \pkg{mathpazo} which defines
% \begin{verbatim}
%\DeclareMathSymbol{=}{\mathrel}{upright}{"3D}
% \end{verbatim}
% the \cs{Relbar} will look wrong if we don't use the correct
% symbol. The way to solve this is define additional \fn{.sym} files
% which contain the definition of \cs{relbar} and \cs{Relbar}
% needed. We need those additional files anyway for things like
% \cs{joinord}.
%    \begin{macrocode}
  \long\def\next#1\mathchardef\std@minus\mathcode`\-\relax
                  \mathchardef\std@equal\mathcode`\=\relax#2\flexi@stop{%
    \toks@{#1#2}%
    \xdef\@begindocumenthook{\the\toks@}%
  }%
  \expandafter\next\@begindocumenthook\flexi@stop
  \endgroup
}{}
%    \end{macrocode}
%
% There is problem when using \cs{DeclareMathOperator} as the
% operators defined call a command \cs{newmcodes@} which relies on the
% mathcode of \texttt{-} being less than 32768. We delay the
% definition \cs{AtBeginDocument} in case \pkg{amssymb} hasn't been
% loaded yet.
%    \begin{macrocode}
\AtBeginDocument{%
\def\newmcodes@{%
  \mathcode `\'39\space
  \mathcode `\*42\space
  \mathcode `\."613A\space
  \ifnum\mathcode`\-=45\space
  \else
%    \end{macrocode}
% The extra check. Don't do anything if \texttt{-} is math active.
%    \begin{macrocode}
    \ifnum\mathcode`\-=32768\space
    \else
      \mathchardef \std@minus \mathcode `\-\relax
    \fi
  \fi
  \mathcode `\-45\space
  \mathcode `\/47\space
  \mathcode `\:"603A\space\relax
}%
}
%    \end{macrocode}
%
% And we then continue with the options.
%    \begin{macrocode}
\DeclareOption{mathstyleoff}{%
  \PassOptionsToPackage{noactivechars}{mathstyle}}
\DeclareOption{cmbase}{\usesymbols{cmbase}}
\DeclareOption{mathpazo}{\usesymbols{mathpazo}}
\DeclareOption{mathptmx}{\usesymbols{mathptmx}}
\ExecuteOptions{cmbase}
\ProcessOptions\relax
\renewcommand{\lnot}{\neg}
\renewcommand{\land}{\wedge}
\renewcommand{\lor}{\vee}
\renewcommand{\le}{\leq}
\renewcommand{\ge}{\geq}
\renewcommand{\ne}{\neq}
\renewcommand{\owns}{\ni}
\renewcommand{\gets}{\leftarrow}
\renewcommand{\to}{\rightarrow}
\renewcommand{\|}{\Vert}
\RequirePackage{mathstyle}
%</package>\endinput
%    \end{macrocode}
%
% \section{cmbase, mathpazo, mathptmx}
%
%
% For each math font package we define a corresponding symbol file
% with extension \fn{sym}. The Computer Modern base is called
% \opt{cmbase} and \opt{mathpazo} and \opt{mathptmx} corresponds to
% the packages. The definitions are almost identical as they mostly
% concern the positions in the math font encodings. Look for
% differences in \cs{joinord}, \cs{relbar} and \cs{Relbar}. If you
% inspect the source code, you'll see that the support for
% \pkg{mathptmx} didn't require any work but I thought it better to
% create a \fn{sym} file to maintain a uniform interface.
%
% \begin{aside}
% Open question on \verb"!" and \verb"?": maybe they
% should have type `Pun' instead of `DeR'.    Need to
% search for uses in math in AMS archives.    Or, maybe add a special
% `Clo' type for them: non-extensible closing delimiter.
% \end{aside}
%
%
%
% Default mathgroup setup.
% \changes{v0.3}{2010/07/11}{fixed bugs regarding capital greek
% letters in mathpazo and mathptmx}
%    \begin{macrocode}
%<*cmbase|mathpazo|mathptmx>
%<cmbase>\ProvidesSymbols{cmbase}[2007/12/19 v0.92]
%<mathpazo>\ProvidesSymbols{mathpazo}[2010/07/11 v0.3]
%<mathptmx>\ProvidesSymbols{mathptmx}[2010/07/11 v0.3]
\ExplSyntaxOn
\cs_gset:cpx {mg@OT1}  {\hexnumber@\symoperators}
\cs_gset:cpx {mg@OML}  {\hexnumber@\symletters}
\cs_gset:cpx {mg@OMS}  {\hexnumber@\symsymbols}
\cs_gset:cpx {mg@OMX}  {\hexnumber@\symlargesymbols}
\cs_gset:Npx \mg@bin   {\mg@OMS}
\cs_gset:Npx \mg@del   {\mg@OMX}
\cs_gset:Npx \mg@digit {\exp_not:c{mg@OT1}}
\cs_gset:Npn \mg@latin {\mg@OML}
\cs_gset_eq:NN \mg@Latin \mg@latin
\cs_gset_eq:NN \mg@greek \mg@latin
%<cmbase|mathptmx>\cs_gset_eq:NN\mg@Greek\mg@digit
%    \end{macrocode}
% Mathpazo takes the upper case greeks from the letter font if
% slantedGreek is in effect, but from \emph{upright} if not. Mathptmx
% also takes the slanted greek from the letter font.
%    \begin{macrocode}
%<mathpazo>\@ifpackagewith{mathpazo}{slantedGreek}{%
%<mathpazo>  \cs_gset_eq:NN\mg@Greek\mg@latin
%<mathpazo>}{%
%<mathpazo>  \cs_gset:cpx{mg@Greek}{\hexnumber@\symupright}
%<mathpazo>}
%<mathptmx>\@ifpackagewith{mathptmx}{slantedGreek}{%
%<mathptmx>   \cs_gset_eq:NN\mg@Greek\mg@latin
%<mathptmx>}{}
\cs_gset_eq:NN \mg@rel \mg@bin
\cs_gset_eq:NN \mg@ord \mg@bin
\cs_gset_eq:NN \mg@cop \mg@del
%    \end{macrocode}
%
%
% Symbols from the 128-character \fn{cmr} encoding.
% Paren and square bracket delimiters from this encoding are covered
% by the definitions in the \fn{cmex} section, however.
%    \begin{macrocode}
\DeclareFlexSymbol{!}     {Pun}{OT1}{21}
\DeclareFlexSymbol{+}     {Bin}{OT1}{2B}
\DeclareFlexSymbol{:}     {Rel}{OT1}{3A}
\DeclareFlexSymbol{\colon}{Pun}{OT1}{3A}
\DeclareFlexSymbol{;}     {Pun}{OT1}{3B}
\DeclareFlexSymbol{=}     {Rel}{OT1}{3D}
\DeclareFlexSymbol{?}     {Pun}{OT1}{3F}
%    \end{macrocode}
% \AmS\TeX, and therefore the \pkg{amsmath} package, make the
% uppercase Greek letters class 0 (nonvariable) instead of 7
% (variable), to eliminate the glaring inconsistency with lowercase
% Greek.    (In plain \TeX , \verb"{\bf\Delta}" works, while
% \verb"{\bf\delta}" doesn't.) Let us try to make them both
% variable (fonts permitting) instead of nonvariable.
%    \begin{macrocode}
\DeclareFlexSymbol{\Gamma}  {Var}{Greek}{00}
\DeclareFlexSymbol{\Delta}  {Var}{Greek}{01}
\DeclareFlexSymbol{\Theta}  {Var}{Greek}{02}
\DeclareFlexSymbol{\Lambda} {Var}{Greek}{03}
\DeclareFlexSymbol{\Xi}     {Var}{Greek}{04}
\DeclareFlexSymbol{\Pi}     {Var}{Greek}{05}
\DeclareFlexSymbol{\Sigma}  {Var}{Greek}{06}
\DeclareFlexSymbol{\Upsilon}{Var}{Greek}{07}
\DeclareFlexSymbol{\Phi}    {Var}{Greek}{08}
\DeclareFlexSymbol{\Psi}    {Var}{Greek}{09}
\DeclareFlexSymbol{\Omega}  {Var}{Greek}{0A}
%    \end{macrocode}
% Decimal digits.
%    \begin{macrocode}
\DeclareFlexSymbol{0}{Var}{digit}{30}
\DeclareFlexSymbol{1}{Var}{digit}{31}
\DeclareFlexSymbol{2}{Var}{digit}{32}
\DeclareFlexSymbol{3}{Var}{digit}{33}
\DeclareFlexSymbol{4}{Var}{digit}{34}
\DeclareFlexSymbol{5}{Var}{digit}{35}
\DeclareFlexSymbol{6}{Var}{digit}{36}
\DeclareFlexSymbol{7}{Var}{digit}{37}
\DeclareFlexSymbol{8}{Var}{digit}{38}
\DeclareFlexSymbol{9}{Var}{digit}{39}
%    \end{macrocode}
% Symbols from the 128-character \fn{cmmi} encoding.
%    \begin{macrocode}
\DeclareFlexSymbol{,}{Pun}{OML}{3B}
\DeclareFlexSymbol{.}{Ord}{OML}{3A}
\DeclareFlexSymbol{/}{Ord}{OML}{3D}
\DeclareFlexSymbol{<}{Rel}{OML}{3C}
\DeclareFlexSymbol{>}{Rel}{OML}{3E}
%    \end{macrocode}
% To do: make the Var property of lc Greek work properly.
%    \begin{macrocode}
\DeclareFlexSymbol{\alpha}     {Var}{greek}{0B}
\DeclareFlexSymbol{\beta}      {Var}{greek}{0C}
\DeclareFlexSymbol{\gamma}     {Var}{greek}{0D}
\DeclareFlexSymbol{\delta}     {Var}{greek}{0E}
\DeclareFlexSymbol{\epsilon}   {Var}{greek}{0F}
\DeclareFlexSymbol{\zeta}      {Var}{greek}{10}
\DeclareFlexSymbol{\eta}       {Var}{greek}{11}
\DeclareFlexSymbol{\theta}     {Var}{greek}{12}
\DeclareFlexSymbol{\iota}      {Var}{greek}{13}
\DeclareFlexSymbol{\kappa}     {Var}{greek}{14}
\DeclareFlexSymbol{\lambda}    {Var}{greek}{15}
\DeclareFlexSymbol{\mu}        {Var}{greek}{16}
\DeclareFlexSymbol{\nu}        {Var}{greek}{17}
\DeclareFlexSymbol{\xi}        {Var}{greek}{18}
\DeclareFlexSymbol{\pi}        {Var}{greek}{19}
\DeclareFlexSymbol{\rho}       {Var}{greek}{1A}
\DeclareFlexSymbol{\sigma}     {Var}{greek}{1B}
\DeclareFlexSymbol{\tau}       {Var}{greek}{1C}
\DeclareFlexSymbol{\upsilon}   {Var}{greek}{1D}
\DeclareFlexSymbol{\phi}       {Var}{greek}{1E}
\DeclareFlexSymbol{\chi}       {Var}{greek}{1F}
\DeclareFlexSymbol{\psi}       {Var}{greek}{20}
\DeclareFlexSymbol{\omega}     {Var}{greek}{21}
\DeclareFlexSymbol{\varepsilon}{Var}{greek}{22}
\DeclareFlexSymbol{\vartheta}  {Var}{greek}{23}
\DeclareFlexSymbol{\varpi}     {Var}{greek}{24}
\DeclareFlexSymbol{\varrho}    {Var}{greek}{25}
\DeclareFlexSymbol{\varsigma}  {Var}{greek}{26}
\DeclareFlexSymbol{\varphi}    {Var}{greek}{27}
%    \end{macrocode}
% Note that in plain \TeX\  \cs{imath} and \cs{jmath} are
% not variable-font.    But if a \verb"j" changes font to, let's
% say, sans serif or calligraphic, a dotless \verb"j" in the same
% context should change font in the same way.
%    \begin{macrocode}
\DeclareFlexSymbol{\imath}           {Var}{OML}{7B}
\DeclareFlexSymbol{\jmath}           {Var}{OML}{7C}
\DeclareFlexSymbol{\ell}             {Ord}{OML}{60}
\DeclareFlexSymbol{\wp}              {Ord}{OML}{7D}
\DeclareFlexSymbol{\partial}         {Ord}{OML}{40}
\DeclareFlexSymbol{\flat}            {Ord}{OML}{5B}
\DeclareFlexSymbol{\natural}         {Ord}{OML}{5C}
\DeclareFlexSymbol{\sharp}           {Ord}{OML}{5D}
\DeclareFlexSymbol{\triangleleft}    {Bin}{OML}{2F}
\DeclareFlexSymbol{\triangleright}   {Bin}{OML}{2E}
\DeclareFlexSymbol{\star}            {Bin}{OML}{3F}
\DeclareFlexSymbol{\smile}           {Rel}{OML}{5E}
\DeclareFlexSymbol{\frown}           {Rel}{OML}{5F}
\DeclareFlexSymbol{\leftharpoonup}   {Rel}{OML}{28}
\DeclareFlexSymbol{\leftharpoondown} {Rel}{OML}{29}
\DeclareFlexSymbol{\rightharpoonup}  {Rel}{OML}{2A}
\DeclareFlexSymbol{\rightharpoondown}{Rel}{OML}{2B}
%    \end{macrocode}
% Latin
%    \begin{macrocode}
\DeclareFlexSymbol{a}{Var}{latin}{61}
\DeclareFlexSymbol{b}{Var}{latin}{62}
\DeclareFlexSymbol{c}{Var}{latin}{63}
\DeclareFlexSymbol{d}{Var}{latin}{64}
\DeclareFlexSymbol{e}{Var}{latin}{65}
\DeclareFlexSymbol{f}{Var}{latin}{66}
\DeclareFlexSymbol{g}{Var}{latin}{67}
\DeclareFlexSymbol{h}{Var}{latin}{68}
\DeclareFlexSymbol{i}{Var}{latin}{69}
\DeclareFlexSymbol{j}{Var}{latin}{6A}
\DeclareFlexSymbol{k}{Var}{latin}{6B}
\DeclareFlexSymbol{l}{Var}{latin}{6C}
\DeclareFlexSymbol{m}{Var}{latin}{6D}
\DeclareFlexSymbol{n}{Var}{latin}{6E}
\DeclareFlexSymbol{o}{Var}{latin}{6F}
\DeclareFlexSymbol{p}{Var}{latin}{70}
\DeclareFlexSymbol{q}{Var}{latin}{71}
\DeclareFlexSymbol{r}{Var}{latin}{72}
\DeclareFlexSymbol{s}{Var}{latin}{73}
\DeclareFlexSymbol{t}{Var}{latin}{74}
\DeclareFlexSymbol{u}{Var}{latin}{75}
\DeclareFlexSymbol{v}{Var}{latin}{76}
\DeclareFlexSymbol{w}{Var}{latin}{77}
\DeclareFlexSymbol{x}{Var}{latin}{78}
\DeclareFlexSymbol{y}{Var}{latin}{79}
\DeclareFlexSymbol{z}{Var}{latin}{7A}
\DeclareFlexSymbol{A}{Var}{Latin}{41}
\DeclareFlexSymbol{B}{Var}{Latin}{42}
\DeclareFlexSymbol{C}{Var}{Latin}{43}
\DeclareFlexSymbol{D}{Var}{Latin}{44}
\DeclareFlexSymbol{E}{Var}{Latin}{45}
\DeclareFlexSymbol{F}{Var}{Latin}{46}
\DeclareFlexSymbol{G}{Var}{Latin}{47}
\DeclareFlexSymbol{H}{Var}{Latin}{48}
\DeclareFlexSymbol{I}{Var}{Latin}{49}
\DeclareFlexSymbol{J}{Var}{Latin}{4A}
\DeclareFlexSymbol{K}{Var}{Latin}{4B}
\DeclareFlexSymbol{L}{Var}{Latin}{4C}
\DeclareFlexSymbol{M}{Var}{Latin}{4D}
\DeclareFlexSymbol{N}{Var}{Latin}{4E}
\DeclareFlexSymbol{O}{Var}{Latin}{4F}
\DeclareFlexSymbol{P}{Var}{Latin}{50}
\DeclareFlexSymbol{Q}{Var}{Latin}{51}
\DeclareFlexSymbol{R}{Var}{Latin}{52}
\DeclareFlexSymbol{S}{Var}{Latin}{53}
\DeclareFlexSymbol{T}{Var}{Latin}{54}
\DeclareFlexSymbol{U}{Var}{Latin}{55}
\DeclareFlexSymbol{V}{Var}{Latin}{56}
\DeclareFlexSymbol{W}{Var}{Latin}{57}
\DeclareFlexSymbol{X}{Var}{Latin}{58}
\DeclareFlexSymbol{Y}{Var}{Latin}{59}
\DeclareFlexSymbol{Z}{Var}{Latin}{5A}
%    \end{macrocode}
% The \cs{ldotPun} glyph is used in constructing the
% \cs{ldots} symbol.    It is just a period with a different math
% symbol class.    \cs{lhookRel} and \cs{rhookRel} are used
% in a similar way for building hooked arrow symbols.
%    \begin{macrocode}
\DeclareFlexSymbol{\ldotPun}{Pun}{OML}{3A}
\def\ldotp{\ldotPun}
\DeclareFlexSymbol{\lhookRel}{Rel}{OML}{2C}
\DeclareFlexSymbol{\rhookRel}{Rel}{OML}{2D}
%    \end{macrocode}
% Symbols from the 128-character \fn{cmsy} encoding.
%    \begin{macrocode}
\DeclareFlexSymbol{*}           {Bin}{bin}{03} % \ast
\DeclareFlexSymbol{-}           {Bin}{bin}{00}
\DeclareFlexSymbol{|}           {Ord}{OMS}{6A}
\DeclareFlexSymbol{\aleph}      {Ord}{ord}{40}
\DeclareFlexSymbol{\Re}         {Ord}{ord}{3C}
\DeclareFlexSymbol{\Im}         {Ord}{ord}{3D}
\DeclareFlexSymbol{\infty}      {Ord}{ord}{31}
\DeclareFlexSymbol{\prime}      {Ord}{ord}{30}
\DeclareFlexSymbol{\emptyset}   {Ord}{ord}{3B}
\DeclareFlexSymbol{\nabla}      {Ord}{ord}{72}
\DeclareFlexSymbol{\top}        {Ord}{ord}{3E}
\DeclareFlexSymbol{\bot}        {Ord}{ord}{3F}
\DeclareFlexSymbol{\triangle}   {Ord}{ord}{34}
\DeclareFlexSymbol{\forall}     {Ord}{ord}{38}
\DeclareFlexSymbol{\exists}     {Ord}{ord}{39}
\DeclareFlexSymbol{\neg}        {Ord}{ord}{3A}
\DeclareFlexSymbol{\clubsuit}   {Ord}{ord}{7C}
\DeclareFlexSymbol{\diamondsuit}{Ord}{ord}{7D}
\DeclareFlexSymbol{\heartsuit}  {Ord}{ord}{7E}
\DeclareFlexSymbol{\spadesuit}  {Ord}{ord}{7F}
\DeclareFlexSymbol{\smallint}   {COs}{OMS}{73}
%    \end{macrocode}
% Binary operators.
%    \begin{macrocode}
\DeclareFlexSymbol{\bigtriangleup}  {Bin}{bin}{34}
\DeclareFlexSymbol{\bigtriangledown}{Bin}{bin}{35}
\DeclareFlexSymbol{\wedge}          {Bin}{bin}{5E}
\DeclareFlexSymbol{\vee}            {Bin}{bin}{5F}
\DeclareFlexSymbol{\cap}            {Bin}{bin}{5C}
\DeclareFlexSymbol{\cup}            {Bin}{bin}{5B}
\DeclareFlexSymbol{\ddagger}        {Bin}{bin}{7A}
\DeclareFlexSymbol{\dagger}         {Bin}{bin}{79}
\DeclareFlexSymbol{\sqcap}          {Bin}{bin}{75}
\DeclareFlexSymbol{\sqcup}          {Bin}{bin}{74}
\DeclareFlexSymbol{\uplus}          {Bin}{bin}{5D}
\DeclareFlexSymbol{\amalg}          {Bin}{bin}{71}
\DeclareFlexSymbol{\diamond}        {Bin}{bin}{05}
\DeclareFlexSymbol{\bullet}         {Bin}{bin}{0F}
\DeclareFlexSymbol{\wr}             {Bin}{bin}{6F}
\DeclareFlexSymbol{\div}            {Bin}{bin}{04}
\DeclareFlexSymbol{\odot}           {Bin}{bin}{0C}
\DeclareFlexSymbol{\oslash}         {Bin}{bin}{0B}
\DeclareFlexSymbol{\otimes}         {Bin}{bin}{0A}
\DeclareFlexSymbol{\ominus}         {Bin}{bin}{09}
\DeclareFlexSymbol{\oplus}          {Bin}{bin}{08}
\DeclareFlexSymbol{\mp}             {Bin}{bin}{07}
\DeclareFlexSymbol{\pm}             {Bin}{bin}{06}
\DeclareFlexSymbol{\circ}           {Bin}{bin}{0E}
\DeclareFlexSymbol{\bigcirc}        {Bin}{bin}{0D}
\DeclareFlexSymbol{\setminus}       {Bin}{bin}{6E}
\DeclareFlexSymbol{\cdot}           {Bin}{bin}{01}
\DeclareFlexSymbol{\ast}            {Bin}{bin}{03}
\DeclareFlexSymbol{\times}          {Bin}{bin}{02}
%    \end{macrocode}
% Relation symbols.
%    \begin{macrocode}
\DeclareFlexSymbol{\propto}        {Rel}{rel}{2F}
\DeclareFlexSymbol{\sqsubseteq}    {Rel}{rel}{76}
\DeclareFlexSymbol{\sqsupseteq}    {Rel}{rel}{77}
\DeclareFlexSymbol{\parallel}      {Rel}{rel}{6B}
\DeclareFlexSymbol{\mid}           {Rel}{rel}{6A}
\DeclareFlexSymbol{\dashv}         {Rel}{rel}{61}
\DeclareFlexSymbol{\vdash}         {Rel}{rel}{60}
\DeclareFlexSymbol{\nearrow}       {Rel}{rel}{25}
\DeclareFlexSymbol{\searrow}       {Rel}{rel}{26}
\DeclareFlexSymbol{\nwarrow}       {Rel}{rel}{2D}
\DeclareFlexSymbol{\swarrow}       {Rel}{rel}{2E}
\DeclareFlexSymbol{\Leftrightarrow}{Rel}{rel}{2C}
\DeclareFlexSymbol{\Leftarrow}     {Rel}{rel}{28}
\DeclareFlexSymbol{\Rightarrow}    {Rel}{rel}{29}
\DeclareFlexSymbol{\leq}           {Rel}{rel}{14}
\DeclareFlexSymbol{\geq}           {Rel}{rel}{15}
\DeclareFlexSymbol{\succ}          {Rel}{rel}{1F}
\DeclareFlexSymbol{\prec}          {Rel}{rel}{1E}
\DeclareFlexSymbol{\approx}        {Rel}{rel}{19}
\DeclareFlexSymbol{\succeq}        {Rel}{rel}{17}
\DeclareFlexSymbol{\preceq}        {Rel}{rel}{16}
\DeclareFlexSymbol{\supset}        {Rel}{rel}{1B}
\DeclareFlexSymbol{\subset}        {Rel}{rel}{1A}
\DeclareFlexSymbol{\supseteq}      {Rel}{rel}{13}
\DeclareFlexSymbol{\subseteq}      {Rel}{rel}{12}
\DeclareFlexSymbol{\in}            {Rel}{rel}{32}
\DeclareFlexSymbol{\ni}            {Rel}{rel}{33}
\DeclareFlexSymbol{\gg}            {Rel}{rel}{1D}
\DeclareFlexSymbol{\ll}            {Rel}{rel}{1C}
\DeclareFlexSymbol{\leftrightarrow}{Rel}{rel}{24}
\DeclareFlexSymbol{\leftarrow}     {Rel}{rel}{20}
\DeclareFlexSymbol{\rightarrow}    {Rel}{rel}{21}
\DeclareFlexSymbol{\sim}           {Rel}{rel}{18}
\DeclareFlexSymbol{\simeq}         {Rel}{rel}{27}
\DeclareFlexSymbol{\perp}          {Rel}{rel}{3F}
\DeclareFlexSymbol{\equiv}         {Rel}{rel}{11}
\DeclareFlexSymbol{\asymp}         {Rel}{rel}{10}
%    \end{macrocode}
% The \cs{notRel} glyph is a special zero-width glyph intended only
% for use in constructing negated symbols.    \cs{mapstoRel} and
% \cs{cdotPun} have similar but more restricted applications.
%    \begin{macrocode}
\DeclareFlexSymbol{\notRel}   {Rel}{rel}{36}
\DeclareFlexSymbol{\mapstoOrd}{Ord}{OMS}{37}
\DeclareFlexSymbol{\cdotOrd}  {Ord}{OMS}{01}
\cs_set:Npn\cdotp{\mathpunct{\cdotOrd}}
%    \end{macrocode}
% Symbols from the 128-character \fn{cmex} encoding.
% \verb"COs" stands for `cumulative operator
% (sum-like)'.
% \verb"COi" stands for `cumulative operator
% (integral-like)'.    These typically differ only in the
% default placement of limits.    \verb"cop" stands for
% `cumulative operator math group'.
%    \begin{macrocode}
\DeclareFlexSymbol{\coprod}   {COs}{cop}{60}
\DeclareFlexSymbol{\bigvee}   {COs}{cop}{57}
\DeclareFlexSymbol{\bigwedge} {COs}{cop}{56}
\DeclareFlexSymbol{\biguplus} {COs}{cop}{55}
\DeclareFlexSymbol{\bigcap}   {COs}{cop}{54}
\DeclareFlexSymbol{\bigcup}   {COs}{cop}{53}
\DeclareFlexSymbol{\int}      {COi}{cop}{52}
\DeclareFlexSymbol{\prod}     {COs}{cop}{51}
\DeclareFlexSymbol{\sum}      {COs}{cop}{50}
\DeclareFlexSymbol{\bigotimes}{COs}{cop}{4E}
\DeclareFlexSymbol{\bigoplus} {COs}{cop}{4C}
\DeclareFlexSymbol{\bigodot}  {COs}{cop}{4A}
\DeclareFlexSymbol{\oint}     {COi}{cop}{48}
\DeclareFlexSymbol{\bigsqcup} {COs}{cop}{46}
%    \end{macrocode}
% Delimiter symbols.
% \verb"DeL" stands for `delimiter (left)'.
% \verb"DeR" stands for `delimiter (right)'.
% \verb"DeB" stands for `delimiter (bidirectional)'.
% The principal encoding point for an extensible delimiter is the
% first link in the list of linked sizes as specified in the font metric
% information.
% For a math encoding such as OT1/OML/OMS/OMX where not all sizes of a
% given delimiter reside in a given font, the extra encoding point for the
% smallest delimiter must be supplied by defining
% \begin{verbatim}
% \sd@GXX
% \end{verbatim}
% where G is the mathgroup and XX is the hexadecimal glyph
% position. |\DeclareFlexDelimiter| does that for us.
%    \begin{macrocode}
\DeclareFlexDelimiter{\rangle}{DeR}{del}{0B}{OMS}{69}
\DeclareFlexDelimiter{\langle}{DeL}{del}{0A}{OMS}{68}
\DeclareFlexDelimiter{\rbrace}{DeR}{del}{09}{OMS}{67}
\DeclareFlexDelimiter{\lbrace}{DeL}{del}{08}{OMS}{66}
\DeclareFlexDelimiter{\rceil} {DeR}{del}{07}{OMS}{65}
\DeclareFlexDelimiter{\lceil} {DeL}{del}{06}{OMS}{64}
\DeclareFlexDelimiter{\rfloor}{DeR}{del}{05}{OMS}{63}
\DeclareFlexDelimiter{\lfloor}{DeL}{del}{04}{OMS}{62}
\DeclareFlexDelimiter{(}      {DeL}{del}{00}{OT1}{28}
\DeclareFlexDelimiter{)}      {DeR}{del}{01}{OT1}{29}
\DeclareFlexDelimiter{[}      {DeL}{del}{02}{OT1}{5B}
\DeclareFlexDelimiter{]}      {DeR}{del}{03}{OT1}{5D}
\DeclareFlexDelimiter{\lVert} {DeL}{del}{0D}{OMS}{6B}
\DeclareFlexDelimiter{\rVert} {DeR}{del}{0D}{OMS}{6B}
\DeclareFlexDelimiter{\lvert} {DeL}{del}{0C}{OMS}{6A}
\DeclareFlexDelimiter{\rvert} {DeR}{del}{0C}{OMS}{6A}
\DeclareFlexDelimiter{\Vert}  {DeB}{del}{0D}{OMS}{6B}
\DeclareFlexDelimiter{\vert}  {DeB}{del}{0C}{OMS}{6A}
%    \end{macrocode}
% Maybe make the vert bars mathord instead of delimiter, to discourage
% poor usage.
%    \begin{macrocode}
\DeclareFlexDelimiter{|}{DeB}{del}{0C}{OMS}{6A}
\DeclareFlexDelimiter{/}{DeB}{del}{0E}{OML}{3D}
%    \end{macrocode}
%
%
% These wacky delimiters need to be supported I guess for
% compabitility reasons.
% The DeA delimiter type is a special case used only for these
% arrows.
%    \begin{macrocode}
\DeclareFlexDelimiter{\lmoustache} {DeL}{del}{40}{del}{7A}
\DeclareFlexDelimiter{\rmoustache} {DeR}{del}{41}{del}{7B}
\DeclareFlexDelimiter{\lgroup}     {DeL}{del}{3A}{del}{3A}
\DeclareFlexDelimiter{\rgroup}     {DeR}{del}{3B}{del}{3B}
\DeclareFlexDelimiter{\bracevert}  {DeB}{del}{3E}{del}{3E}
\DeclareFlexDelimiter{\arrowvert}  {DeB}{del}{3C}{OMS}{6A}
\DeclareFlexDelimiter{\Arrowvert}  {DeB}{del}{3D}{OMS}{6B}
\DeclareFlexDelimiter{\uparrow}    {DeA}{del}{78}{OMS}{22}
\DeclareFlexDelimiter{\downarrow}  {DeA}{del}{79}{OMS}{23}
\DeclareFlexDelimiter{\updownarrow}{DeA}{del}{3F}{OMS}{6C}
\DeclareFlexDelimiter{\Uparrow}    {DeA}{del}{7E}{OMS}{2A}
\DeclareFlexDelimiter{\Downarrow}  {DeA}{del}{7F}{OMS}{2B}
\DeclareFlexDelimiter{\Updownarrow}{DeA}{del}{77}{OMS}{6D}
\DeclareFlexDelimiter{\backslash}  {DeB}{del}{0F}{OMS}{6E}
%    \end{macrocode}
%
%
%
%
% \section{Some compound symbols}
% The following symbols are not robust in standard \LaTeX\
% because they use \verb"#" or \cs{mathpalette} (which is not
% robust and contains a \verb"#" in its expansion): \cs{angle},
% \cs{cong}, \cs{notin}, \cs{rightleftharpoons}.
%
% In this definition of \cs{hbar}, the symbol is cobbled together
% from a math italic h and the cmr overbar accent glyph.
%    \begin{macrocode}
\DeclareFlexSymbol{\hbarOrd}{Ord}{OT1}{16}
\DeclareFlexCompoundSymbol{\hbar}{Ord}{\hbarOrd\mkern-9mu h}
%    \end{macrocode}
% For \cs{surd}, the interior symbol gets math class 1
% (cumulative operator) to make the glyph vertically centered on the
% math axis, but the desired horizontal spacing is the spacing for a
% mathord.    (Couldn't it just be class mathopen, though?)
%    \begin{macrocode}
\DeclareFlexSymbol{\surdOrd}{Ord}{OMS}{70}
\DeclareFlexCompoundSymbol{\surd}{Ord}{\mathop{\surdOrd}}
%    \end{macrocode}
% As shown in this definition of \cs{angle}, rule dimens are not
% allowed to use math-units, unfortunately.
%    \begin{macrocode}
\DeclareFlexCompoundSymbol{\angle}{Ord}{%
  \vbox{\ialign{%
      $\m@th\scriptstyle##$\crcr
      \notRel\mathrel{\mkern14mu}\crcr
      \noalign{\nointerlineskip}%
      \mkern2.5mu\leaders\hrule \@height.34pt\hfill\mkern2.5mu\crcr
  }}%
}
%    \end{macrocode}
% The \cs{not} function, which is defined in the \pkg{flexisym}
% package, requires a suitably defined \cs{notRel} symbol.
%    \begin{macrocode}
\DeclareFlexCompoundSymbol{\neq}{Rel}{\not{=}}
%    \end{macrocode}
% .
%    \begin{macrocode}
\DeclareFlexCompoundSymbol{\mapsto}{Rel}{\mapstoOrd\rightarrow}
%    \end{macrocode}
% The \cs{@vereq} function ends by centering the whole
% construction on the math axis, unlike \cs{buildrel} where the base
% symbol remains at its normal altitude.    Furthermore,
% \cs{@vereq} leaves the math style of the top symbol as given
% instead of downsizing to scriptstyle.
%    \begin{macrocode}
\DeclareFlexCompoundSymbol{\cong}{Rel}{\mathpalette\@vereq\sim}
%    \end{macrocode}
% The \cs{m@th} in the \fn{fontmath.ltx} definition of
% \cs{notin} is superfluous unless \cs{c@ncel} doesn't include
% it (which was perhaps true in an older version of
% \fn{plain.tex}?).
%    \begin{macrocode}
\providecommand*\joinord{}
%<cmbase|mathptmx>\renewcommand*\joinord{\mkern-3mu }
%<mathpazo>\renewcommand*\joinord{\mkern-3.45mu }
\DeclareFlexCompoundSymbol{\notin}{Rel}{\mathpalette\c@ncel\in}
\DeclareFlexCompoundSymbol{\rightleftharpoons}{Rel}{\mathpalette\rlh@{}}
\DeclareFlexCompoundSymbol{\doteq}{Rel}{\buildrel\textstyle.\over=}
\DeclareFlexCompoundSymbol{\hookrightarrow}{Rel}{\lhookRel\joinord\rightarrow}
\DeclareFlexCompoundSymbol{\hookleftarrow}{Rel}{\leftarrow\joinord\rhookRel}
\DeclareFlexCompoundSymbol{\bowtie}{Rel}{\triangleright\joinord\triangleleft}
\DeclareFlexCompoundSymbol{\models}{Rel}{\vert\joinord=}
\DeclareFlexCompoundSymbol{\Longrightarrow}{Rel}{\Relbar\joinord\Rightarrow}
\DeclareFlexCompoundSymbol{\longrightarrow}{Rel}{\relbar\joinord\rightarrow}
\DeclareFlexCompoundSymbol{\Longleftarrow}{Rel}{\Leftarrow\joinord\Relbar}
\DeclareFlexCompoundSymbol{\longleftarrow}{Rel}{\leftarrow\joinord\relbar}
\DeclareFlexCompoundSymbol{\longmapsto}{Rel}{\mapstochar\longrightarrow}
\DeclareFlexCompoundSymbol{\longleftrightarrow}{Rel}{\leftarrow\joinord\rightarrow}
\DeclareFlexCompoundSymbol{\Longleftrightarrow}{Rel}{\Leftarrow\joinord\Rightarrow}
%    \end{macrocode}
% Here is what you get from the old definition of \cs{iff}.
% \begin{verbatim}
% \glue 2.77771 plus 2.77771
% \glue(\thickmuskip) 2.77771 plus 2.77771
% \OMS/cmsy/m/n/10 (
% \hbox(0.0+0.0)x-1.66663
% .\kern -1.66663
% \OMS/cmsy/m/n/10 )
% \penalty 500
% \glue 2.77771 plus 2.77771
% \glue(\thickmuskip) 2.77771 plus 2.77771
% \end{verbatim}
% Looks like it could be simplified slightly.    But it's not so
% easy as it looks to do it without screwing up the line breaking
% possibilities.
%    \begin{macrocode}
\renewcommand*\iff{%
  \mskip\thickmuskip\Longleftrightarrow\mskip\thickmuskip
}
%    \end{macrocode}
% Some dotly symbols.
%    \begin{macrocode}
\DeclareFlexCompoundSymbol{\cdots}{Inn}{\cdotp\cdotp\cdotp}%
\DeclareFlexCompoundSymbol{\vdots}{Ord}{%
  \vbox{\baselineskip4\p@ \lineskiplimit\z@
    \kern6\p@\hbox{.}\hbox{.}\hbox{.}}}
\DeclareFlexCompoundSymbol{\ddots}{Inn}{%
  \mkern1mu\raise7\p@
  \vbox{\kern7\p@\hbox{.}}\mkern2mu%
  \raise4\p@\hbox{.}\mkern2mu\raise\p@\hbox{.}\mkern1mu%
}
%    \end{macrocode}
% .
%    \begin{macrocode}
\def\relbar{\begingroup \def\smash@{tb}% in case amsmath is loaded
    \mathpalette\mathsm@sh{\mathchar"200 }\endgroup}
%    \end{macrocode}
% For \cs{Relbar} we take an equal sign of class $0$ (Ord) from the
% operator family. For \fn{cmr} and \pkg{mathptmx} we know this is
% family $0$.
%    \begin{macrocode}
%<cmbase|mathptmx>\def\Relbar{\mathchar"3D }
%    \end{macrocode}
% For the \pkg{mathpazo} setup we need to use the equal sign from
% \fn{cmr} and so must insert class $0$ and use the symbol from the
% upright symbols.
%    \begin{macrocode}
%<mathpazo>\edef\Relbar{\mathchar\string"\hexnumber@\symupright3D }
%    \end{macrocode}
% Done.
%    \begin{macrocode}
\ExplSyntaxOff
%</cmbase|mathpazo|mathptmx>
%    \end{macrocode}
% Various synonyms such as \cs{le} for \cs{leq} and
% \cs{to} for \cs{rightarrow} are defined in
% \pkg{flexisym} with \cs{def} instead of \cs{let}, for
% slower execution speed but smaller chance of synchronization
% problems.
%
%
%
%    \begin{macrocode}
%<*msabm>
\ProvidesSymbols{msabm}[2001/09/08 v0.91]
\ExplSyntaxOn
%    \end{macrocode}
%    \begin{macrocode}
\RequirePackage{amsfonts}\relax
%    \end{macrocode}
%    \begin{macrocode}
\cs_gset:cpx{mg@MSA}{\hexnumber@\symAMSa}%
\cs_gset:cpx{mg@MSB}{\hexnumber@\symAMSb}%
%    \end{macrocode}
%    \begin{macrocode}
\DeclareFlexSymbol{\boxdot}             {Bin}{MSA}{00}
\DeclareFlexSymbol{\boxplus}            {Bin}{MSA}{01}
\DeclareFlexSymbol{\boxtimes}           {Bin}{MSA}{02}
\DeclareFlexSymbol{\square}             {Ord}{MSA}{03}
\DeclareFlexSymbol{\blacksquare}        {Ord}{MSA}{04}
\DeclareFlexSymbol{\centerdot}          {Bin}{MSA}{05}
\DeclareFlexSymbol{\lozenge}            {Ord}{MSA}{06}
\DeclareFlexSymbol{\blacklozenge}       {Ord}{MSA}{07}
\DeclareFlexSymbol{\circlearrowright}   {Rel}{MSA}{08}
\DeclareFlexSymbol{\circlearrowleft}    {Rel}{MSA}{09}
%    \end{macrocode}
% In amsfonts.sty:
%    \begin{macrocode}
%%\DeclareFlexSymbol{\rightleftharpoons}{Rel}{MSA}{0A}
\DeclareFlexSymbol{\leftrightharpoons}  {Rel}{MSA}{0B}
\DeclareFlexSymbol{\boxminus}           {Bin}{MSA}{0C}
\DeclareFlexSymbol{\Vdash}              {Rel}{MSA}{0D}
\DeclareFlexSymbol{\Vvdash}             {Rel}{MSA}{0E}
\DeclareFlexSymbol{\vDash}              {Rel}{MSA}{0F}
\DeclareFlexSymbol{\twoheadrightarrow}  {Rel}{MSA}{10}
\DeclareFlexSymbol{\twoheadleftarrow}   {Rel}{MSA}{11}
\DeclareFlexSymbol{\leftleftarrows}     {Rel}{MSA}{12}
\DeclareFlexSymbol{\rightrightarrows}   {Rel}{MSA}{13}
\DeclareFlexSymbol{\upuparrows}         {Rel}{MSA}{14}
\DeclareFlexSymbol{\downdownarrows}     {Rel}{MSA}{15}
\DeclareFlexSymbol{\upharpoonright}     {Rel}{MSA}{16}
 \let\restriction\upharpoonright
\DeclareFlexSymbol{\downharpoonright}   {Rel}{MSA}{17}
\DeclareFlexSymbol{\upharpoonleft}      {Rel}{MSA}{18}
\DeclareFlexSymbol{\downharpoonleft}    {Rel}{MSA}{19}
\DeclareFlexSymbol{\rightarrowtail}     {Rel}{MSA}{1A}
\DeclareFlexSymbol{\leftarrowtail}      {Rel}{MSA}{1B}
\DeclareFlexSymbol{\leftrightarrows}    {Rel}{MSA}{1C}
\DeclareFlexSymbol{\rightleftarrows}    {Rel}{MSA}{1D}
\DeclareFlexSymbol{\Lsh}                {Rel}{MSA}{1E}
\DeclareFlexSymbol{\Rsh}                {Rel}{MSA}{1F}
\DeclareFlexSymbol{\rightsquigarrow}    {Rel}{MSA}{20}
\DeclareFlexSymbol{\leftrightsquigarrow}{Rel}{MSA}{21}
\DeclareFlexSymbol{\looparrowleft}      {Rel}{MSA}{22}
\DeclareFlexSymbol{\looparrowright}     {Rel}{MSA}{23}
\DeclareFlexSymbol{\circeq}             {Rel}{MSA}{24}
\DeclareFlexSymbol{\succsim}            {Rel}{MSA}{25}
\DeclareFlexSymbol{\gtrsim}             {Rel}{MSA}{26}
\DeclareFlexSymbol{\gtrapprox}          {Rel}{MSA}{27}
\DeclareFlexSymbol{\multimap}           {Rel}{MSA}{28}
\DeclareFlexSymbol{\therefore}          {Rel}{MSA}{29}
\DeclareFlexSymbol{\because}            {Rel}{MSA}{2A}
\DeclareFlexSymbol{\doteqdot}           {Rel}{MSA}{2B}
 \let\Doteq\doteqdot
\DeclareFlexSymbol{\triangleq}          {Rel}{MSA}{2C}
\DeclareFlexSymbol{\precsim}            {Rel}{MSA}{2D}
\DeclareFlexSymbol{\lesssim}            {Rel}{MSA}{2E}
\DeclareFlexSymbol{\lessapprox}         {Rel}{MSA}{2F}
\DeclareFlexSymbol{\eqslantless}        {Rel}{MSA}{30}
\DeclareFlexSymbol{\eqslantgtr}         {Rel}{MSA}{31}
\DeclareFlexSymbol{\curlyeqprec}        {Rel}{MSA}{32}
\DeclareFlexSymbol{\curlyeqsucc}        {Rel}{MSA}{33}
\DeclareFlexSymbol{\preccurlyeq}        {Rel}{MSA}{34}
\DeclareFlexSymbol{\leqq}               {Rel}{MSA}{35}
\DeclareFlexSymbol{\leqslant}           {Rel}{MSA}{36}
\DeclareFlexSymbol{\lessgtr}            {Rel}{MSA}{37}
\DeclareFlexSymbol{\backprime}          {Ord}{MSA}{38}
\DeclareFlexSymbol{\risingdotseq}       {Rel}{MSA}{3A}
\DeclareFlexSymbol{\fallingdotseq}      {Rel}{MSA}{3B}
\DeclareFlexSymbol{\succcurlyeq}        {Rel}{MSA}{3C}
\DeclareFlexSymbol{\geqq}               {Rel}{MSA}{3D}
\DeclareFlexSymbol{\geqslant}           {Rel}{MSA}{3E}
\DeclareFlexSymbol{\gtrless}            {Rel}{MSA}{3F}
%    \end{macrocode}
% in amsfonts.sty
%    \begin{macrocode}
%% \DeclareFlexSymbol{\sqsubset}    {Rel}{MSA}{40}
%% \DeclareFlexSymbol{\sqsupset}    {Rel}{MSA}{41}
\DeclareFlexSymbol{\vartriangleright}   {Rel}{MSA}{42}
\DeclareFlexSymbol{\vartriangleleft}    {Rel}{MSA}{43}
\DeclareFlexSymbol{\trianglerighteq}    {Rel}{MSA}{44}
\DeclareFlexSymbol{\trianglelefteq}     {Rel}{MSA}{45}
\DeclareFlexSymbol{\bigstar}            {Ord}{MSA}{46}
\DeclareFlexSymbol{\between}            {Rel}{MSA}{47}
\DeclareFlexSymbol{\blacktriangledown}  {Ord}{MSA}{48}
\DeclareFlexSymbol{\blacktriangleright} {Rel}{MSA}{49}
\DeclareFlexSymbol{\blacktriangleleft}  {Rel}{MSA}{4A}
\DeclareFlexSymbol{\vartriangle}        {Rel}{MSA}{4D}
\DeclareFlexSymbol{\blacktriangle}      {Ord}{MSA}{4E}
\DeclareFlexSymbol{\triangledown}       {Ord}{MSA}{4F}
\DeclareFlexSymbol{\eqcirc}             {Rel}{MSA}{50}
\DeclareFlexSymbol{\lesseqgtr}          {Rel}{MSA}{51}
\DeclareFlexSymbol{\gtreqless}          {Rel}{MSA}{52}
\DeclareFlexSymbol{\lesseqqgtr}         {Rel}{MSA}{53}
\DeclareFlexSymbol{\gtreqqless}         {Rel}{MSA}{54}
\DeclareFlexSymbol{\Rrightarrow}        {Rel}{MSA}{56}
\DeclareFlexSymbol{\Lleftarrow}         {Rel}{MSA}{57}
\DeclareFlexSymbol{\veebar}             {Bin}{MSA}{59}
\DeclareFlexSymbol{\barwedge}           {Bin}{MSA}{5A}
\DeclareFlexSymbol{\doublebarwedge}     {Bin}{MSA}{5B}
%    \end{macrocode}
% In amsfonts.sty
%    \begin{macrocode}
%%\DeclareFlexSymbol{\angle}         {Ord}{MSA}{5C}
\DeclareFlexSymbol{\measuredangle}   {Ord}{MSA}{5D}
\DeclareFlexSymbol{\sphericalangle}  {Ord}{MSA}{5E}
\DeclareFlexSymbol{\varpropto}       {Rel}{MSA}{5F}
\DeclareFlexSymbol{\smallsmile}      {Rel}{MSA}{60}
\DeclareFlexSymbol{\smallfrown}      {Rel}{MSA}{61}
\DeclareFlexSymbol{\Subset}          {Rel}{MSA}{62}
\DeclareFlexSymbol{\Supset}          {Rel}{MSA}{63}
\DeclareFlexSymbol{\Cup}             {Bin}{MSA}{64}
 \let\doublecup\Cup
\DeclareFlexSymbol{\Cap}             {Bin}{MSA}{65}
 \let\doublecap\Cap
\DeclareFlexSymbol{\curlywedge}      {Bin}{MSA}{66}
\DeclareFlexSymbol{\curlyvee}        {Bin}{MSA}{67}
\DeclareFlexSymbol{\leftthreetimes}  {Bin}{MSA}{68}
\DeclareFlexSymbol{\rightthreetimes} {Bin}{MSA}{69}
\DeclareFlexSymbol{\subseteqq}       {Rel}{MSA}{6A}
\DeclareFlexSymbol{\supseteqq}       {Rel}{MSA}{6B}
\DeclareFlexSymbol{\bumpeq}          {Rel}{MSA}{6C}
\DeclareFlexSymbol{\Bumpeq}          {Rel}{MSA}{6D}
\DeclareFlexSymbol{\lll}             {Rel}{MSA}{6E}
 \let\llless\lll
\DeclareFlexSymbol{\ggg}             {Rel}{MSA}{6F}
 \let\gggtr\ggg
\DeclareFlexSymbol{\circledS}        {Ord}{MSA}{73}
\DeclareFlexSymbol{\pitchfork}       {Rel}{MSA}{74}
\DeclareFlexSymbol{\dotplus}         {Bin}{MSA}{75}
\DeclareFlexSymbol{\backsim}         {Rel}{MSA}{76}
\DeclareFlexSymbol{\backsimeq}       {Rel}{MSA}{77}
\DeclareFlexSymbol{\complement}      {Ord}{MSA}{7B}
\DeclareFlexSymbol{\intercal}        {Bin}{MSA}{7C}
\DeclareFlexSymbol{\circledcirc}     {Bin}{MSA}{7D}
\DeclareFlexSymbol{\circledast}      {Bin}{MSA}{7E}
\DeclareFlexSymbol{\circleddash}     {Bin}{MSA}{7F}
%    \end{macrocode}
%   Begin AMSb declarations
%    \begin{macrocode}
\DeclareFlexSymbol{\lvertneqq}       {Rel}{MSB}{00}
\DeclareFlexSymbol{\gvertneqq}       {Rel}{MSB}{01}
\DeclareFlexSymbol{\nleq}            {Rel}{MSB}{02}
\DeclareFlexSymbol{\ngeq}            {Rel}{MSB}{03}
\DeclareFlexSymbol{\nless}           {Rel}{MSB}{04}
\DeclareFlexSymbol{\ngtr}            {Rel}{MSB}{05}
\DeclareFlexSymbol{\nprec}           {Rel}{MSB}{06}
\DeclareFlexSymbol{\nsucc}           {Rel}{MSB}{07}
\DeclareFlexSymbol{\lneqq}           {Rel}{MSB}{08}
\DeclareFlexSymbol{\gneqq}           {Rel}{MSB}{09}
\DeclareFlexSymbol{\nleqslant}       {Rel}{MSB}{0A}
\DeclareFlexSymbol{\ngeqslant}       {Rel}{MSB}{0B}
\DeclareFlexSymbol{\lneq}            {Rel}{MSB}{0C}
\DeclareFlexSymbol{\gneq}            {Rel}{MSB}{0D}
\DeclareFlexSymbol{\npreceq}         {Rel}{MSB}{0E}
\DeclareFlexSymbol{\nsucceq}         {Rel}{MSB}{0F}
\DeclareFlexSymbol{\precnsim}        {Rel}{MSB}{10}
\DeclareFlexSymbol{\succnsim}        {Rel}{MSB}{11}
\DeclareFlexSymbol{\lnsim}           {Rel}{MSB}{12}
\DeclareFlexSymbol{\gnsim}           {Rel}{MSB}{13}
\DeclareFlexSymbol{\nleqq}           {Rel}{MSB}{14}
\DeclareFlexSymbol{\ngeqq}           {Rel}{MSB}{15}
\DeclareFlexSymbol{\precneqq}        {Rel}{MSB}{16}
\DeclareFlexSymbol{\succneqq}        {Rel}{MSB}{17}
\DeclareFlexSymbol{\precnapprox}     {Rel}{MSB}{18}
\DeclareFlexSymbol{\succnapprox}     {Rel}{MSB}{19}
\DeclareFlexSymbol{\lnapprox}        {Rel}{MSB}{1A}
\DeclareFlexSymbol{\gnapprox}        {Rel}{MSB}{1B}
\DeclareFlexSymbol{\nsim}            {Rel}{MSB}{1C}
\DeclareFlexSymbol{\ncong}           {Rel}{MSB}{1D}
\DeclareFlexSymbol{\diagup}          {Ord}{MSB}{1E}
\DeclareFlexSymbol{\diagdown}        {Ord}{MSB}{1F}
\DeclareFlexSymbol{\varsubsetneq}    {Rel}{MSB}{20}
\DeclareFlexSymbol{\varsupsetneq}    {Rel}{MSB}{21}
\DeclareFlexSymbol{\nsubseteqq}      {Rel}{MSB}{22}
\DeclareFlexSymbol{\nsupseteqq}      {Rel}{MSB}{23}
\DeclareFlexSymbol{\subsetneqq}      {Rel}{MSB}{24}
\DeclareFlexSymbol{\supsetneqq}      {Rel}{MSB}{25}
\DeclareFlexSymbol{\varsubsetneqq}   {Rel}{MSB}{26}
\DeclareFlexSymbol{\varsupsetneqq}   {Rel}{MSB}{27}
\DeclareFlexSymbol{\subsetneq}       {Rel}{MSB}{28}
\DeclareFlexSymbol{\supsetneq}       {Rel}{MSB}{29}
\DeclareFlexSymbol{\nsubseteq}       {Rel}{MSB}{2A}
\DeclareFlexSymbol{\nsupseteq}       {Rel}{MSB}{2B}
\DeclareFlexSymbol{\nparallel}       {Rel}{MSB}{2C}
\DeclareFlexSymbol{\nmid}            {Rel}{MSB}{2D}
\DeclareFlexSymbol{\nshortmid}       {Rel}{MSB}{2E}
\DeclareFlexSymbol{\nshortparallel}  {Rel}{MSB}{2F}
\DeclareFlexSymbol{\nvdash}          {Rel}{MSB}{30}
\DeclareFlexSymbol{\nVdash}          {Rel}{MSB}{31}
\DeclareFlexSymbol{\nvDash}          {Rel}{MSB}{32}
\DeclareFlexSymbol{\nVDash}          {Rel}{MSB}{33}
\DeclareFlexSymbol{\ntrianglerighteq}{Rel}{MSB}{34}
\DeclareFlexSymbol{\ntrianglelefteq} {Rel}{MSB}{35}
\DeclareFlexSymbol{\ntriangleleft}   {Rel}{MSB}{36}
\DeclareFlexSymbol{\ntriangleright}  {Rel}{MSB}{37}
\DeclareFlexSymbol{\nleftarrow}      {Rel}{MSB}{38}
\DeclareFlexSymbol{\nrightarrow}     {Rel}{MSB}{39}
\DeclareFlexSymbol{\nLeftarrow}      {Rel}{MSB}{3A}
\DeclareFlexSymbol{\nRightarrow}     {Rel}{MSB}{3B}
\DeclareFlexSymbol{\nLeftrightarrow} {Rel}{MSB}{3C}
\DeclareFlexSymbol{\nleftrightarrow} {Rel}{MSB}{3D}
\DeclareFlexSymbol{\divideontimes}   {Bin}{MSB}{3E}
\DeclareFlexSymbol{\varnothing}      {Ord}{MSB}{3F}
\DeclareFlexSymbol{\nexists}         {Ord}{MSB}{40}
\DeclareFlexSymbol{\Finv}            {Ord}{MSB}{60}
\DeclareFlexSymbol{\Game}            {Ord}{MSB}{61}
%    \end{macrocode}
% In amsfonts.sty:
%    \begin{macrocode}
%%\DeclareFlexSymbol{\mho}           {Ord}{MSB}{66}
\DeclareFlexSymbol{\eth}             {Ord}{MSB}{67}
\DeclareFlexSymbol{\eqsim}           {Rel}{MSB}{68}
\DeclareFlexSymbol{\beth}            {Ord}{MSB}{69}
\DeclareFlexSymbol{\gimel}           {Ord}{MSB}{6A}
\DeclareFlexSymbol{\daleth}          {Ord}{MSB}{6B}
\DeclareFlexSymbol{\lessdot}         {Bin}{MSB}{6C}
\DeclareFlexSymbol{\gtrdot}          {Bin}{MSB}{6D}
\DeclareFlexSymbol{\ltimes}          {Bin}{MSB}{6E}
\DeclareFlexSymbol{\rtimes}          {Bin}{MSB}{6F}
\DeclareFlexSymbol{\shortmid}        {Rel}{MSB}{70}
\DeclareFlexSymbol{\shortparallel}   {Rel}{MSB}{71}
\DeclareFlexSymbol{\smallsetminus}   {Bin}{MSB}{72}
\DeclareFlexSymbol{\thicksim}        {Rel}{MSB}{73}
\DeclareFlexSymbol{\thickapprox}     {Rel}{MSB}{74}
\DeclareFlexSymbol{\approxeq}        {Rel}{MSB}{75}
\DeclareFlexSymbol{\succapprox}      {Rel}{MSB}{76}
\DeclareFlexSymbol{\precapprox}      {Rel}{MSB}{77}
\DeclareFlexSymbol{\curvearrowleft}  {Rel}{MSB}{78}
\DeclareFlexSymbol{\curvearrowright} {Rel}{MSB}{79}
\DeclareFlexSymbol{\digamma}         {Ord}{MSB}{7A}
\DeclareFlexSymbol{\varkappa}        {Ord}{MSB}{7B}
\DeclareFlexSymbol{\Bbbk}            {Ord}{MSB}{7C}
\DeclareFlexSymbol{\hslash}          {Ord}{MSB}{7D}
%    \end{macrocode}
% In amsfonts.sty:
%    \begin{macrocode}
%%\DeclareFlexSymbol{\hbar}          {Ord}{MSB}{7E}
\DeclareFlexSymbol{\backepsilon}     {Rel}{MSB}{7F}
\ExplSyntaxOff
%</msabm>
%    \end{macrocode}
%
% \PrintIndex
%
% \Finale
