%\iffalse meta-comment
%
% ------------------------------------------------------------------------
%                       The `microtype' package
%         Subliminal refinements towards typographical perfection
%           Copyright (c) 2004--2025 R Schlicht <w.m.l@gmx.net>
%
% 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:
% https://www.latex-project.org/lppl.txt, and version 1.3c or later is part
% of all distributions of LaTeX version 2005/12/01 or later.
%
% This work has the LPPL maintenance status `maintained'.
%
% This work consists of the files microtype.dtx, microtype-utf.dtx and
% microtype.ins and the derived files microtype.sty, microtype-pdftex.def,
% microtype-luatex.def, microtype-xetex.def, microtype.lua, letterspace.sty
% and microtype-show.sty.
%
% Modified versions of the configuration files (*.cfg) may be distributed
% provided that: (1) the original copyright statement is not removed, and
% (2) the identification string is changed.
% ------------------------------------------------------------------------
%
%<package|letterspace|show>\NeedsTeXFormat{LaTeX2e}
%<*driver>
\ProvidesFile{\jobname.dtx}
%</driver>
%<package|letterspace|show>\ProvidesPackage
%<config|pdf-|lua-|xe->\ProvidesFile
%<package>  {microtype}
%<letterspace>  {letterspace}
%<show>  {microtype-show}
%<m-t>  {microtype.cfg}
%<pdf->  {microtype-pdftex.def}
%<lua->  {microtype-luatex.def}
%<xe->  {microtype-xetex.def}
%<*package|letterspace|m-t|pdf-|lua-|xe-|show>
  [2025/02/11 v3.2a
%<package>   Micro-typographical refinements
%<letterspace>   Robust letterspacing
%<show>  Visual debugging for the microtype package
%<m-t>   microtype main configuration file
%<pdf-|lua-|xe->   Definitions specific to
%<pdf->   pdftex
%<lua->   luatex
%<xe->   xetex
   (RS)]
%</package|letterspace|m-t|pdf-|lua-|xe-|show>
%<luafile>microtype        = microtype or {}
%<luafile>local microtype  = microtype
%<luafile>microtype.module = {
%<luafile>    name         = "microtype",
%<luafile>    version      = "3.2a",
%<luafile>    date         = "2025/02/11",
%<luafile>    description  = "microtype module.",
%<luafile>    author       = "E. Roux, R. Schlicht and P. Gesang",
%<luafile>    copyright    = "E. Roux, R. Schlicht and P. Gesang",
%<luafile>    license      = "LPPL",
%<luafile>}
%<luafile>luatexbase.provides_module(microtype.module)
%<*config>
%<bch>  {mt-bch.cfg}[2007/03/03 v1.5 microtype config. file: Bitstream Charter (RS)]
%<blg>  {mt-blg.cfg}[2007/07/14 v1.0 microtype config. file: Bitstream Letter Gothic (RS)]
%<cmr>  {mt-cmr.cfg}[2013/05/19 v2.2 microtype config. file: Computer Modern Roman (RS)]
%<ebg>  {mt-EBGaramond.cfg}[2021/10/25 v2.0 microtype config. file: EB Garamond / Adobe Garamond (RS)]
%<pmn>  {mt-pmn.cfg}[2009/11/14 v1.3 microtype config. file: Adobe Minion (HH/KK)]
%<ppl>  {mt-ppl.cfg}[2005/11/16 v1.6 microtype config. file: Palatino (RS)]
%<ptm>  {mt-ptm.cfg}[2006/04/20 v1.7 microtype config. file: Times (RS)]
%<ugm>  {mt-ugm.cfg}[2006/01/26 v1.0 microtype config. file: URW Garamond (RS)]
%<msa>  {mt-msa.cfg}[2006/02/04 v1.1 microtype config. file: AMS symbols (a) (RS)]
%<msb>  {mt-msb.cfg}[2005/06/01 v1.0 microtype config. file: AMS symbols (b) (RS)]
%<euf>  {mt-euf.cfg}[2006/07/03 v1.1 microtype config. file: AMS Euler Fraktur (RS)]
%<eur>  {mt-eur.cfg}[2006/07/31 v1.1 microtype config. file: AMS Euler Roman (RS)]
%<eus>  {mt-eus.cfg}[2006/07/28 v1.2 microtype config. file: AMS Euler Script (RS)]
%<zpeu>  {mt-zpeu.cfg}[2006/05/04 v1.0 microtype config. file: Adobe Euro (RS)]
%<mvs>  {mt-mvs.cfg}[2006/07/05 v1.1 microtype config. file: Marvosym Euro (RS)]
%</config>
%
%<*driver|docsty>
%<*driver>
\makeatletter
\documentclass[10pt,a4paper,doc2]{ltxdoc}
%</driver>
% Compiling microtype.dtx with the command line option
% --jobname=microtype-code
% will produce the document microtype-code.pdf,
% containing only the Implementation.
\expandafter\newif\csname ifcodedoc\endcsname
\edef\@tempa{\jobname}
\edef\@tempb{\detokenize{microtype-code}}
\ifx\@tempa\@tempb
  \codedoctrue
\fi
%<docsty>\codedoctrue
% Let's abolish CM! We use Charter and Letter Gothic
% (for the pre-built documentation on CTAN):
\usepackage[LGR,T1]{fontenc}
\usepackage[charter]{mathdesign}
 \def\rmdefault{bch} % not scaled
 \def\sfdefault{SourceSansPro-TLF}
 \def\SourceSansPro@scale{1.02}
\IfFileExists{t1blg.fd}
 {\def\ttdefault{blg}}
 {\def\ttdefault{ulg}}
 {\ttfamily\selectfont
  \DeclareFontShape{T1}{\ttdefault}{eb}{n}{<-> ssub * \ttdefault/b/n}{}}
\usepackage{iftex}
%<*!docsty>
\ifxetex\else
\usepackage[latin1]{\ifluatex lua\fi inputenc}
\fi
%</!docsty>
\GetFileInfo{\jobname.dtx}
\usepackage{microtype}[\filedate]
 \DeclareMicrotypeSet*[protrusion]
      { doc }
      { encoding = {*, TS1, OMS},
        family   = {rm*, sf*, tt*},
        size     = {footnotesize, small, normalsize} }
 \SetProtrusion
      { encoding = OMS,
        family   = mdbch }
      { "68 = {400, },  % \langle
        "69 = { ,400} } % \rangle
 \DeclareMicrotypeSet*[kerning]
      { doc }
      { encoding = T1,
        family   = blg, % typewriter font and ...
        font     = * }  % French sample in section \ref{sub:kerning}
 \SetExtraKerning
      { encoding = T1,
        family   = blg }
      { _ = {100,100} } % underscores shouldn't touch
\ifxetex\else
 % disable ?` and !` ligatures (sample in section \ref{sec:disable-ligatures})
 \DisableLigatures[?,!]{encoding = *, family = rm* }
\fi
 % Fraktur sample in section \ref{sec:lettersp}
\IfFileExists{t1mwr.fd}
  {\def\textfrak##1{{\fontfamily{mwr}\selectfont ##1}}
   \SetTracking[no ligatures={f,s,c}]{encoding=T1,family=mwr}{120}}
  {\IfFileExists{yfonts.sty}
     {\usepackage{yfonts}
      \SetTracking[no ligatures={f,s,c}]{encoding=LY,family=yfrak}{120}}
     {\def\textfrak{\rule{.5em}{1.5ex}\@gobble}}}
\ifpdftex
  \microtypesetup{kerning=true}
\fi
\ifluatex % microtype.dtx finally compiles with 0.35!
  \usepackage{luatex85}
\fi
\ifpdf
  \microtypesetup{expansion=alltext} % with activated expansion ...
  \tolerance=250 % ... we can make TeX almost as intolerant as it normally is (200)
  \g@addto@macro\macrocode{\microtypesetup{expansion=false}}
  % bonus material
  \InputIfFileExists{microtype-logo.dtx}\relax\relax
  \InputIfFileExists{microtype-lssample.dtx}\relax\relax
\else
  \ifluatex\else
    \let\lsstyle\relax
  \fi
\fi
\usepackage{booktabs}
\usepackage{array}
 \newcolumntype{L}[1]{p{#1}<{\raggedright}}
\usepackage{color}
 \definecolor{thered}    {rgb} {0.65,0.04,0.07}
 \definecolor{thegreen}  {rgb} {0.06,0.44,0.08}
 \definecolor{theblue}   {rgb} {0.02,0.04,0.48}
 \definecolor{sectioning}{gray}{0.44}
 \definecolor{thegrey}   {gray}{0.5}
 \definecolor{theframe}  {gray}{0.75}
 \definecolor{theshade}  {gray}{0.94}
\usepackage{graphicx}
\usepackage{etoolbox}
% general layout
\frenchspacing
\DeclareRobustCommand\textoractual[2]{\ifpdf
  \pdfliteral direct{/Span<</ActualText(#2)>>BDC}#1\pdfliteral direct{EMC}%
  \else #1\fi}
\expandafter\newif\csname ifcmr\endcsname
\long\def\@tempa{cmr}
\ifx\rmdefault\@tempa
  \cmrtrue
  \def\PackageFont{\sffamily}
  \def\match{\textbullet}
  \usepackage{amssymb} % \varnothing
  \expandafter\let\expandafter\OrigTeX\csname TeX \endcsname
  \DeclareRobustCommand\TeX{\textoractual{\OrigTeX}{TeX}}
  \setlength\textheight{49\baselineskip}
\else
  \let\bfdefault\bfdefault@previous % undo mathdesign's \def\bfdefault{b}
  \def\Module#1{{\color{theblue}\textoractual{$\langle$}{<}\texttt{\itshape#1}\textoractual{$\rangle$}{>}}}
  \DeclareRobustCommand\TeX{\textoractual{T\kern-.1em\lower.4ex\hbox{E}\kern-.075emX\@}{TeX}}
  \DeclareRobustCommand\LaTeX{\textoractual{L\kern-.26em{\sbox\z@ T\vbox to\ht\z@{%
     \hbox{\check@mathfonts\fontsize\sf@size\z@\math@fontsfalse\selectfont A}%
    \vss}}}{La}\kern-.075em\TeX}
  \def\PackageFont{\ttfamily}
  \def\match{{\large\raisebox{-.15em}{\textbullet}}}
  {\catcode`\`=\active % indiscernible from ' in Bitstream Letter Gothic
   \g@addto@macro\macro@code{\let`\textasciigrave}}
  \DeclareEncodingSubset{TS1}{blg}{1} % for \textasciigrave
  \linespread{1.07}\normalfont
  \setlength\textheight{48\baselineskip}
\fi
\addtolength\textheight{\topskip}
\setlength\topmargin{5pt}
% sections
\def\@seccntformat#1{\llap{\csname the#1\endcsname\hskip\marginparsep}}
\def\MTsectionfont{\ifcmr\fontseries{bx}\else\fontseries{eb}\fi\sffamily\color{sectioning}}
\patchcmd\section      {\bfseries}{\MTsectionfont}\relax\relax
\patchcmd\subsection   {\bfseries}{\MTsectionfont}\relax\relax
\patchcmd\subsubsection{\bfseries}{\MTsectionfont}\relax\relax
\def\paragraph{\@startsection{paragraph}{4}%
  {0pt}{8pt plus 2pt minus 1pt}{-1em}%
  {\normalfont\normalsize\itshape}}
% title
\def\@maketitle{%
  \newpage\null\vskip 2em
  \begin{center}\sffamily
    {\huge \@title\par\vskip 1.5em}%
    {\large\hspace{4.5em}\parbox{.33\textwidth}{\@author}%
                         \parbox{.33\textwidth}{\@date}\par\vskip 1em
           \textls*[-20]{\url{\githuburl}}}%
    \vskip 2.5em\rule{\textwidth}{.4pt}%
  \end{center}\par\vskip 1.5em}
\def\abstractname{}
% headers
\headheight=15pt
\def\ps@MTheadings{%
  \def\@oddhead{%
    \hbox to\textwidth{\vbox{\hbox to\textwidth{%
      \footnotesize\sffamily{\leftmark\rightmark\strut}\hfill\thepage\strut}%
      \hrule height 0.4pt width\textwidth \vskip-0.4pt
    }}\hss}
  \let\@oddfoot\@empty
  \let\@mkboth\markboth
  \def\sectionmark##1{\markboth{\textls*[70]{\MakeUppercase{##1}}}{}}
  \def\subsectionmark##1{\markright{\,: ##1}}}
\pagestyle{MTheadings}
% toc
\let\l@section@\l@section
\def\l@section{\vskip -1.25ex\l@section@}
\def\l@subsection{\vskip.35ex \penalty\@secpenalty \@dottedtocline{2}{1.5em}{2.2em}}
\def\l@subsubsection#1#2{%
  \leftskip 3.7em
  \rightskip 2em plus 2em
  \parindent 0pt
  {\let\numberline\@gobble{\small #1~[#2]}}}
\def\l@table{\@dottedtocline{1}{0pt}{1.5em}}
\let\l@figure\l@table
\def\@pnumwidth{1.7em}
\def\defspecial@toc#1#2#3{\long\def#1{%
  \ifpdf\phantomsection\bookmarksetupnext{italic}\pdfbookmark[1]{#2}{#3}\fi
  \section*{#2}\@mkboth{\textls*[70]{\MakeUppercase{\contentsname}}}{}%
  \@starttoc{#3}}}
\defspecial@toc\tableofcontents\contentsname{toc}
\defspecial@toc\listoftables\listtablename{lot}
\defspecial@toc\listoffigures\listfigurename{lof}
% bibliography
\def\@cite#1#2{#1\if@tempswa, #2\fi}
\def\thebibliography#1{%
  \section{\refname}%
  \list{}{\leftmargin 0pt}% \sloppy
  \clubpenalty 4000
  \@clubpenalty \clubpenalty
  \widowpenalty 4000}
\def\@biblabel#1{}
% footnotes
\def\@makefnmark{\raisebox{0.3ex}{\sffamily\footnotesize\,\@thefnmark}}
\long\def\@makefntext#1{%
  \leftskip 0pt
  \parindent 0pt
  \everypar{\parindent 0pt}%
  \leavevmode\llap{\sffamily\@thefnmark\hskip\marginparsep}#1}
\def\footnoterule{%
  \kern-3\p@
  \hrule\@width \columnwidth
  \kern2.6\p@}
\skip\@mpfootins=4pt
% lists
\setlength\leftmargini{15pt}
\setlength\leftmarginii{12.5pt}
\setlength\leftmarginiii{10pt}
\def\@listi{\leftmargin \leftmargini
            \parsep 4.5pt plus 1pt minus 1pt
            \topsep 4.5pt plus 1pt minus 1pt
            \itemsep 0pt}
\let\@listI\@listi
\def\descriptionlabel#1{\hspace\labelsep\normalfont#1:}
\renewenvironment{itemize}
  {\ifnum \@itemdepth >\thr@@\@toodeep\else
    \advance\@itemdepth\@ne
    \edef\@itemitem{labelitem\romannumeral\the\@itemdepth}%
    \expandafter\list
      \csname\@itemitem\endcsname
      {\ifnum\@itemdepth=\@ne\leftmargin 0pt\fi
       \def\makelabel##1{\hss\llap{\color{sectioning}##1}}}%
   \fi}
  {\endlist}
\newenvironment{enum}[1][0]
  {\list\labelenumi
    {\usecounter{enumi}\setcounter{enumi}{#1}\addtocounter{enumi}{-1}%
     \renewcommand\labelenumi{\texttt{\theenumi}:}%
     \leftmargin 30pt
     \itemindent-15pt
     \labelwidth 15pt
     \labelsep 0pt
     \def\makelabel##1{##1\hss}}}
  {\endlist}
\newenvironment{options}
  {\list{}
    {\leftmargin 0pt
     \labelwidth 0pt
     \labelsep 1em
     \itemindent \labelsep
     \lstset{belowskip=0pt}}}
  {\endlist}
% boxes (for some reason, mathdesign changes these values)
\setlength\fboxrule{0.4pt}
\setlength\fboxsep{3pt}
\setlength\arrayrulewidth{0.4pt}
% tables
\usepackage{tabularx}
\setlength\tabcolsep{2pt}
\newbox\mt@box
\newdimen\mt@unvdimen
\long\def\@makecaption#1#2{%
  \setbox\mt@box\vbox{\llap{\vbox{% \fboxsep = 4pt
          \vskip\dimexpr\floatsep-4pt+\fboxrule\relax
          \hsize\dimexpr\marginparwidth-\marginparsep-4pt-\fboxrule\relax
          \rightskip\dimexpr\marginparsep+4pt+\fboxrule\relax plus 2.5em
          \footnotesize \sffamily #1:\\[-\dimexpr\aboverulesep+\cmidrulewidth+3.5\fboxrule]
  \textcolor{theframe}{\rlap{\vrule width \hsize height\fboxrule}}\\[.3\baselineskip] #2}}}
  \mt@unvdimen\dimexpr\ht\mt@box+\dp\mt@box\relax
  \unvbox\mt@box
  \vskip-\mt@unvdimen}
% index and change log
\IndexPrologue{\section{Index}%
  \ifcodedoc
  Numbers in upright shape refer to the \textit{page} where the corresponding entry
  is described (bold face) resp. occurs.
  Numbers in italic shape refer to the \textit{code line} where the corresponding entry
  is defined (underlined) resp. used.
  Numbers prefixed with `U' refer to the User manual.
  \fi
}
\GlossaryPrologue{\section{Change history}\label{sec:changes}%
  \ifcodedoc \PrintHistory \par\medskip\noindent
    Numbers prefixed with `U' refer to the User manual.\fi
  \vspace*{-\multicolsep}}
 %\setcounter{finalcolumnbadness}{100}
 %\raggedcolumns
\setcounter{IndexColumns}{2}
\def\IndexMin{12\baselineskip}
\g@addto@macro\IndexParms{%
  \ifcodedoc\footnotesize\else\small\fi
  \def\indexspace#1{%
    \end{multicols}
    \vspace{-20pt}%
    \begin{multicols}{2}
      \ifpdf{\let\bfseries\empty\let\hfil\empty\phantomsection\pdfbookmark[2]{#1}{#1}}\fi
      \setbox0\hbox{\sffamily\hss#1}%
      \ifdim\wd0<1em \setbox0\hbox to 1em{\sffamily\hss#1\hss}\fi
      \llap{\color{thegrey}\box0\hskip\marginparsep}%
      \vspace*{-\baselineskip}%
      \IndexParms %\rightskip 15pt
      \let\item\@idxitem
      \raggedcolumns}}
\def\GlossaryParms{\IndexParms
  \let\indexspace\relax
  \def\@idxitem ##1##2\efill{%
    \end{multicols}
    \ifpdf \vspace{-3.25ex}%
      \pdfbookmark[2]{\if##1v\relax ##2
          (\csname MTversiondate##2\endcsname)\else ##2\fi}
        {subsection\zap@space ##2 \@empty}\fi
    \begin{multicols}{2}[%
        \subsubsection*{\if##1v\relax
        \llap{\mdseries\color{thegrey}\footnotesize
              \csname MTversiondate##2\endcsname\hskip\marginparsep}%
         Version ##2\else ##2\fi}][6\baselineskip]
      \label{sub:changes:##2}%
      \GlossaryParms \rightskip 15pt plus 5pt
      \let\item\@idxitem
      \ignorespaces \makeatletter \scan@allowedfalse}%
  \def\subitem{\par\hangindent 15pt}%
  \def\subsubitem{\subitem\hspace*{7.5pt}}}
% Change history
% based on an original idea by Tom Bombadil (https://tex.stackexchange.com/a/61251/7674),
% but don't look too closely at the messy rest, or you'll lose all your tikz skills
%<*!docsty>
\ifcodedoc
\usepackage{tikz,pgfcalendar}
\usetikzlibrary{calc}
\newcounter{MThistitem}
\def\MThistlastnode{n-0}
\pgfmathsetmacro{\MThistfirstyear}{2004} % v1.0 2004/09/11
\pgfmathsetmacro{\MThistlastyear}{\year}
\pgfmathsetmacro{\MThistyears}{\MThistlastyear-\MThistfirstyear}
\pgfmathsetmacro{\MThistvsep}{1.75}
\pgfmathsetmacro{\MThisthshift}{3}
\def\MThistprepare{%
  \pgfmathsetmacro{\MThistnodesep}{(\textwidth+\MThisthshift cm+2pt)/(\theMThistitem/2+1)}% why the extra 2pt? I have no idea... probably because all this only pretends to be automatic...!
  \pgfmathsetmacro{\MThistnodewidth}{\MThistnodesep*3/4}
  \pgfmathsetmacro{\MThistxshift}{1.4pt}
  \let\MThistcurrnodesep\MThistnodesep
  \setcounter{MThistitem}{0}
  \node[inner sep=0pt] (n-0) at (-\MThisthshift,\MThistvsep) {}; }
\let\MThistshow\@empty
\def\MThist@versiondate#1#2{% count items and reverse order
  \ifnum\pdfmatch{([a-z])}{#1}=1
    \gpreto\MThistshow{\MT@doversion{#1}{#2}{2}}%
    \addtocounter{MThistitem}{1}%
  \else
    \gpreto\MThistshow{\MT@doversion{#1}{#2}{1}}%
    \addtocounter{MThistitem}{2}%
  \fi}
\def\MThist@ifmajor{1}
\def\MThistlastmajor{1}
\def\MT@doversion#1#2#3{%
  \stepcounter{MThistitem}%
  \def\MThist@xshift{0}%
  \ifnum#3=2
    \ifnum\pdfmatch{([a-z])}{#1}=1
      \edef\MThist@current{\expandafter\strip@prefix\pdflastmatch1 }%
    \fi
    \ifnum\MThist@ifmajor>0 \def\MThist@xshift{-\MThistxshift}\fi
    \def\MThist@ifmajor{0}%
  \else
    \def\MThist@current{#1}%
    \ifnum\MThist@ifmajor<1 \def\MThist@xshift{\MThistxshift}\fi
    \def\MThist@ifmajor{1}%
  \fi
  \node[right=\MThistcurrnodesep,xshift=\MThist@xshift,outer sep=0pt,align=center,nodemajor]
        (n-\theMThistitem) at (\MThistlastnode.west) {\hyperref[sub:changes:#1]{\MThist@current\strut}};
  \pgfmathsetmacro{\MThistcurrnodesep}{\MThistnodesep/#3}%
  \ifnum\MThist@ifmajor>0
    \ifnum\theMThistitem>1
      \draw (n-\MThistlastmajor.north west) -- ($(n-\theMThistitem.north east)-(\MThistcurrnodesep pt,0)$);
      \draw (n-\MThistlastmajor.south west) -- ($(n-\theMThistitem.south east)-(\MThistcurrnodesep pt,0)$);
      \edef\MThistlastmajor{\theMThistitem}%
    \fi
  \else
    \draw [very thin] ($(n-\theMThistitem.north west)+(.8pt,-.9pt)$) -- ($(n-\theMThistitem.north east)-( .8pt,.9pt)$);
    \draw [very thin] ($(n-\theMThistitem.south west)+(.8pt, .9pt)$) -- ($(n-\theMThistitem.south east)+(-.8pt,.9pt)$);
  \fi
  \MThist@splitdate#2\relax
  \pgfcalendardatetojulian{\MTYear-\MTMonth-\MTDay}{\@tempcnta}
  \pgfcalendardatetojulian{\MTYear-1-1}{\@tempcntb}
  \advance\@tempcnta-\@tempcntb
  \pgfmathsetmacro{\MTDate}{\MTYear-\MThistfirstyear+\@tempcnta/365}
  \expandafter\edef\csname MThistnodetime\theMThistitem\endcsname{\MTDate}
  \expandafter\edef\csname MThist@ifmajor\theMThistitem\endcsname{\MThist@ifmajor}
  \edef\MThistlastnode{n-\theMThistitem}}
\def\MThist@splitdate#1/#2/#3\relax{\def\MTYear{#1}\def\MTMonth{#2}\def\MTDay{#3}}
\def\MThisttimeline{%
  \path (n-\theMThistitem.east); \pgfgetlastxy{\MT@tempdim}{\@tempdima};
  \pgfmathsetmacro{\MThistxposition}{\MT@tempdim/28.452755}
  \foreach \x in {1,...,\theMThistitem}{
    \pgfmathsetmacro{\MThisttimeposition}{\MThistxposition/(\MThistlastyear-\MThistfirstyear)*\csname MThistnodetime\x \endcsname}
    \draw[rounded corners=3pt,arrowmajor]
         (\MThisttimeposition,0) -- (\MThisttimeposition,0.5) -- ($(n-\x.south)-(0,0.5)$) -- (n-\x.south); }
  \draw[very thick,-latex] (0,0) -- ($(\MThistlastnode.east)-(0,\MThistvsep)+(1,0)$);
  \foreach \x in {0,...,\MThistyears}{
    \pgfmathsetmacro{\MThistlabelposition}{\MThistxposition/(\MThistlastyear-\MThistfirstyear)*\x}
    \node[below] (label-\x) at (\MThistlabelposition,-0.2) {\number\numexpr\MThistfirstyear+\x};
    \draw (label-\x.north) -- ++ (0,0.2); }}
\def\PrintHistory{%
  \InputIfFileExists{microtype-hist.tmp}{\let\VersionDate\MThist@versiondate\@firstofone}\@gobble
  {\hypersetup{linkcolor=thered}%
    \hspace{-\MThisthshift cm}%
    \rlap{%
      \begin{tikzpicture}[color=thegrey,font=\fontsize{4.5}{6}\selectfont,
        nodemajor/.code={%
          \ifnum\MThist@ifmajor>0
            \tikzset{fill=theshade,text width=\MThistnodewidth,inner sep=1pt}
          \else
            \tikzset{color=theshade,line width=1.6pt,draw,fill=white,text width=\MThistnodewidth/2,
                     font=\fontsize{4}{6}\selectfont,inner sep=0.4pt}
          \fi
        },
        arrowmajor/.code={%
          \expandafter\ifnum\csname MThist@ifmajor\x\endcsname=0
            \tikzset{shorten >=-.8pt,very thin}
          \fi
        }]
        \MThistprepare
        \MThistshow
        \MThisttimeline
        % borders for the last major version
        \ifnum\MThist@ifmajor>0 \def\@tempa{0,0}\def\@tempb{0,0}\else\def\@tempa{.8pt,.6pt}\def\@tempb{.8pt,-.6pt}\fi
        \draw (n-\MThistlastmajor.north west) -- ($(n-\theMThistitem.north east)+(\@tempa)$);
        \draw (n-\MThistlastmajor.south west) -- ($(n-\theMThistitem.south east)+(\@tempb)$);
    \end{tikzpicture}}}}
\fi
%</!docsty>
% macro code
\MacroTopsep=0pt
\MacrocodeTopsep=3pt
\setlength\MacroIndent{0pt}
\def\theCodelineNo{\reset@font\sffamily\color{thegrey}\scriptsize
  \textoractual{\arabic{CodelineNo}\ }{}}% don't copy line numbers
\def\MacroFont{\ttfamily\small}
\setcounter{StandardModuleDepth}{99}
\def\PrintMacroName#1{\strut\MacroFont\string #1\hskip15pt}
\def\ImplementationSettings{%
  \linespread{1}%
  \hfuzz=50pt
  \def\MacroFont{\ttfamily\footnotesize}%
  \let\macro@font\MacroFont}
% additional bells ...
\def\Describe#1#2#3{\noindent\csname Describe#1\endcsname{#2}%
  \DescribeValues{#1}{#3}}
\def\DescribeOption{\leavevmode\@bsphack
  \begingroup\MakePrivateLetters\Describe@Option}
\def\Describe@Option#1{\endgroup
  \marginpar{\raggedleft\PrintDescribeOption{#1}}%
  \SpecialOptionIndex{#1}\@esphack\ignorespaces}
\def\DescribePackage{\leavevmode\@bsphack
  \begingroup\MakePrivateLetters\Describe@Package}
\def\Describe@Package#1{\endgroup
  \marginpar{\raggedleft\PrintDescribeOption{#1.sty}}%
  \CatMainIndex{#1}{package}\@esphack\ignorespaces}
\def\DescribeValues#1#2{%
  \let\@tempa\@empty \let\Option@default\@empty
  \@for\@tempb:=#2\do{%
    \csname Special#1Value\expandafter\endcsname\@tempb\@nil
    \expandafter\g@addto@macro\expandafter\@tempa
      \expandafter{\csname #1Sep\endcsname}%
    \expandafter\g@addto@macro\expandafter\@tempa
      \expandafter{\@tempb}}%
  \@ifnextchar[\PrintValues{\PrintValues[\Option@default]}}
\def\SpecialOptionValue#1#2\@nil{%
  \if#1:\def\@tempb{\Variable{#2}}\else %                      : = variable
  \if#1!\def\@tempb{#2}\def\Option@default{#2}\else %          ! = default
  \if#1*\def\@tempb{#2}\def\Option@default{\MaybeDefault{#2}}% * = default (maybe)
  \fi\fi\fi}
\def\SpecialMacroValue#1#2\@nil{%
  \if#1?\def\@tempb{\normalsize[\Variable{#2}]}%  % ? = optional
   \else\def\@tempb{\normalsize\{\Variable{#1#2}\}}\fi}
\let\SpecialEnvValue\SpecialMacroValue
\DeclareRobustCommand\langlechar{<} % for makeindex
\DeclareRobustCommand\ranglechar{>}
\def\Variable#1{%
  \textoractual{$\langle$}{\langlechar}%
    {\rmfamily\itshape\small#1}%
  \textoractual{$\rangle$}{\ranglechar}}
\let\m@a\meta \def\meta#1{\textoractual{\m@a{#1}}{\langlechar#1\ranglechar}}
\def\MaybeDefault#1{\textrm{*}\,#1}
\def\OptionSep{{\rmfamily, }} \def\MacroSep{\,} \def\EnvironmentSep{\,}
\def\PrintValues[#1]{{\MacroFont\expandafter\@gobble\@tempa\hfill #1}\\*[.25\baselineskip]}
\def\CatIndex#1#2{\index{#1\actualchar{\protect\ttfamily #1} (#2)\encapchar \ifcodedoc\else doc\fi hyperpage}}
\def\CatIndeX#1#2#3{\index{#2\actualchar#1\ (#3)\encapchar \ifcodedoc\else doc\fi hyperpage}}
\def\CatMainIndex#1#2{\index{#1\actualchar{\protect\ttfamily #1} (#2)\encapchar docmain}}
\def\SpecialOptionIndex#1{\@bsphack
  \index{\quotechar/#1% sort options as `Symbols'
    \actualchar{\protect\ttfamily#1}\encapchar docmain}%
  \CatMainIndex{#1}{option}\@esphack}
\def\SpecialUsageIndex#1{\@bsphack
  \index{\quotechar1% sort commands as `Numbers'
    \actualchar\string\verb
      \quotechar*\verbatimchar\string#1\verbatimchar\encapchar docmain}%
  {\let\special@index\index\SpecialIndex@{#1}{\encapchar docmain}}\@esphack}
\def\SpecialEnvIndex#1{\CatMainIndex{#1}{environment}}
\def\cmd#1{\orig@cs{\expandafter\cmd@to@cs\string#1}}
\DeclareRobustCommand\orig@cs[1]{\texttt{\char`\\#1}}
\DeclareRobustCommand\cs[1]{\texttt{\char`\\#1}%
  {\let\special@index\index
   \expandafter\SpecialIndex@\expandafter{\csname#1\endcsname}{\encapchar \ifcodedoc\else doc\fi hyperpage}}}
%</driver|docsty>
% microtype's index style (microtype-gind.ist):
%<docist>actual '='
%<docist>quote '!'
%<docist>level '>'
%<docist>preamble  "\n \\begin{theindex} \n \\makeatletter\\scan@allowedfalse\n\\indexspace"
%<docist>postamble "\n\n \\end{theindex}\n"
%<docist>item_x1   "\\efill \n \\subitem "
%<docist>delim_0   "\\pfill "
%<docist>delim_1   "\\pfill "
%<docist>heading_prefix    "{\\bfseries\\hfil "
%<docist>heading_suffix    "\\hfil}\\nopagebreak\n"
%<docist>headings_flag      1
%<docist>symhead_positive  "Options"
%<docist>numhead_positive  "Commands"
%<*driver|docsty>
\def\PrintDescribeMacro#1{\strut\MacroFont\color{thegreen}\string #1}
\def\PrintDescribeEnv#1{\strut\MacroFont\bslash begin\{{\color{thegreen}#1}\}%
  \\*[.25\baselineskip]\strut\bslash end\{{\color{thegreen}#1}\}}
\def\PrintDescribeOption#1{\strut\MacroFont\color{thered}#1}
\def\Indexing{\let\special@index\codeline@wrindex}
\def\NoIndexing{\let\special@index\@gobble}
\def\GeneralChanges#1{\edef\generalname{\if*#1 General\else#1\fi}}% mind the space!
\DeclareRobustCommand\key[1]{\textcolor{thered}{\ttfamily#1}}
\DeclareRobustCommand\pkg[1]{{\PackageFont#1}\@bsphack\CatIndex{#1}{package}\@esphack}
\DeclareRobustCommand\cls[1]{{\PackageFont#1}\@bsphack\CatIndex{#1}{class}\@esphack}
\DeclareRobustCommand\opt[1]{{\ttfamily#1}\@bsphack\CatIndex{#1}{option}\@esphack}
\DeclareRobustCommand\file[1]{{\ttfamily#1}}
\def\RequiresSep{ \textbar\ }
\def\requires#1{\let\@tempa\@empty
  \@for\@tempb:=#1\do{%
    \g@addto@macro\@tempa\RequiresSep
    \expandafter\g@addto@macro\expandafter\@tempa\expandafter{\@tempb}}%
  \hfill{\setlength\fboxsep{2pt}%
    \fcolorbox{theframe}{white}{\mdseries\small\strut\color{sectioning}%
      \,\expandafter\@gobble\@tempa\,}}}
% ... and whistles
\usepackage{listings}
\lstdefinestyle{microtype}{
  gobble=1,columns=flexible,keepspaces,upquote,escapechar=",
  basicstyle=\MacroFont,
  keywords=[0]{\microtypesetup,\DeclareMicrotypeSet,\UseMicrotypeSet,
    \DeclareMicrotypeSetDefault,\SetProtrusion,\SetExpansion,\SetTracking,
    \SetExtraKerning,\SetExtraSpacing,\DisableLigatures,\DeclareCharacterInheritance,
    \DeclareMicrotypeVariants,\DeclareMicrotypeAlias,\DeclareMicrotypeBabelHook,
    \LoadMicrotypeFile,\DeclareMicrotypeFilePrefix,\microtypecontext,\textmicrotypecontext,
    \textls,\lsstyle,\lslig,
    \leftprotrusion,\rightprotrusion,\noprotrusion,\noprotrusionifhmode,
    \Microtype@Hook},
  keywordstyle=[0]\color{thegreen},
  keywords=[1]{protrusion,expansion,activate,DVIoutput,disable,verbose,
    config,factor,auto,stretch,shrink,step,selected,unit,tracking,kerning,
    spacing,letterspace,babel,context,patch,nopatch,
   %defersetup,copyfonts,deactivate,reactivate,% undocumented
    no ligatures,outer spacing,outer kerning}, % there are three \nobreakspace in this line
  keywordstyle=[1]\color{thered},
  comment=[l]\%,
  commentstyle=\color{thegrey}\itshape,
  alsoother={0123456789_},
  frame=single,backgroundcolor=\color{theshade},rulecolor=\color{theframe},
  framerule=\fboxrule,xleftmargin=3.4pt,xrightmargin=3.4pt,belowskip=\smallskipamount
}
\lstset{style=microtype}
\lstdefinestyle{message}{deletekeywords={[1]{expansion,protrusion,auto}},
  belowskip=-\smallskipamount,frame=none,xleftmargin=0pt,backgroundcolor=,
  basicstyle=\MacroFont\footnotesize,delim=[is][\itshape\color{thegreen}]{<}{>}}
\let\verbatim\relax
\lstnewenvironment{verbatim}[1][]{\lstset{#1}}{}
\def\todo#1{\changes{zTo Do}{0000/00/00}{#1}%
  \marginpar{\rightskip2\marginparsep plus1em \hangindent1.5em \hangafter-2
    \smash{\llap{\raisebox{-1.4ex}{\colorbox{thered}{\Large\color{white}!} }}}%
    \footnotesize\textcolor{thered}{#1}}}
\let\todo\@gobble
% fancy PDF document
\ifpdf
  \usepackage{xr-hyper}
  \usepackage[bookmarks,pdfdisplaydoctitle,
              colorlinks,linkcolor=theblue,citecolor=theblue,urlcolor=thered,
              hyperindex=false,hyperfootnotes=false]
             {hyperref}
  \usepackage[atend]{bookmark}
%<*!docsty>
  \BookmarkAtEnd{%
    \bookmark[startatroot,level=0,bold,gotor={microtype\ifcodedoc\else-code\fi.pdf}]
             {\ifcodedoc User manual\else Implementation\fi}}
%</!docsty>
  \externaldocument{microtype\ifcodedoc\else-code\fi}
  \let\r@TotPages\relax                  % suppress multiply defined warning
  \PassOptionsToPackage{nodvi}{totpages} % and annoying log output
  \usepackage{hyperxmp}                  % (hyperxmp loads totpages)
  \usepackage{attachfile}
  \usepackage{pdfpages}
  \hypersetup{
    keeppdfinfo,
    pdftitle={The microtype package\ifcodedoc\space-- Implementation\fi},
    pdfauthor={R Schlicht <w.m.l@gmx.net>},
    pdfsubject={Subliminal refinements towards typographical perfection},
    pdfkeywords={TeX, LaTeX, pdfTeX, LuaTeX, XeTeX, typography, micro-typography,
      character protrusion, margin kerning, optical alignment, font expansion,
      font scaling, hz, kerning, spacing, glue, letterspacing, tracking, ligatures},
    pdfcopyright={\textcopyright\ 2004--2025 R Schlicht\textLF
      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.\textLF
      This work has the LPPL maintenance status `maintained'.},
    pdflicenseurl={https://www.latex-project.org/lppl/},
    pdflang={en-GB}
  }
  % we no longer use {hypdestopt}, as it would break the external references
  \def\changes@#1#2#3{% recording the changes ...
    \protected@edef\@tempa{\noexpand\glossary{#1\levelchar
      \ifx\saved@macroname\@empty \space\actualchar\generalname
      \else\expandafter\@gobble\saved@macroname\actualchar
        \string\verb\quotechar*\verbatimchar\saved@macroname\verbatimchar\fi
      :\levelchar #3\encapchar \ifcodedoc\else doc\fi hyperpage}}%
    \@tempa\endgroup\@esphack}
  \def\MTrmn#1{\ifrmnum{#1}{\rmntonum{#1}}{#1}}
  % remove double entries (\dochyperpage followed by \docmain)
  \def\dochyperpage#1{\def\MT@curr@index{#1}\@ifnextchar,\dochyperpage@{\doc@hyperpage{#1}}}
  \def\dochyperpage@,{\@ifnextchar\docmain\dochyperpage@@\dochyperpage@x}
  \def\dochyperpage@@\docmain#1{\MT@ifstreq{#1}{\MT@curr@index}\relax\dochyperpage@x\docmain{#1}}
  \def\dochyperpage@x{\expandafter\doc@hyperpage\expandafter{\MT@curr@index}, }
  % indexing user doc ...
  \ifcodedoc
    \def\doc@hyperpage#1{\href[page={\MTrmn{#1}}]{microtype.pdf}{U\MTrmn{#1}}}
    \def\docmain#1{\href[page={\MTrmn{#1}}]{microtype.pdf}{\textbf{U\MTrmn{#1}}}}
    \def\main#1{\underline{\itshape\hyperlink{L:#1}{#1}}}
    \def\SpecialIndex#1{\@bsphack\special@index{%
       \expandafter\@gobble\string#1\actualchar
       \string\verb\quotechar*\verbatimchar\string#1\verbatimchar
       \encapchar codeline}\@esphack}
  \else
    % write references to the User manual intermediarily in roman numerals
    % in order to separate them from those in the Implementation part
    \def\@wrindex#1{\protected@write\@indexfile{\let\@roman\relax}{\string\indexentry{#1}{\@roman\thepage}}\endgroup\@esphack}
    \def\HyInd@pagelink#1{\begingroup\toks@={}\edef\x{\MTrmn{#1} }\expandafter\HyInd@removespaces\x\@nil\endgroup}
    \def\docmain#1{\textbf{\hyperpage{#1}}}
    \let\doc@hyperpage\hyperpage
  \fi
  \def\theCodelineNo{% ... and implementation
    \reset@font\sffamily\color{thegrey}\scriptsize
    \@tempcnta\arabic{CodelineNo}\advance\@tempcnta by\@ne
    \hypertarget{L:\number\@tempcnta}
      {\textoractual{\arabic{CodelineNo}\ }{}}}% don't copy line numbers
  \def\codeline#1{{\itshape\link@sanitize#1-\@nil{#1}}}
  \def\link@sanitize#1-#2\@nil{\link@@sanitize#1,\@nil}
  \def\link@@sanitize#1,#2\@nil{\hyperlink{L:#1}}
  \def\ctanurl#1{Available from \acronym{CTAN} at \href{https://mirror.ctan.org/#1}{\nolinkurl{/#1}}}
  \def\ctanpkgurl#1{Available from \acronym{CTAN} at \href{https://www.ctan.org/pkg/#1}{\nolinkurl{pkg/#1}}}
  \DeclareRobustCommand\mailto[1]{\href{mailto:#1}{\nolinkurl{#1}}}
  \def\mailtoRS{\href % some PDF viewers don't like spaces:
    {mailto:Robert\%20Schlicht\%3cw.m.l@gmx.net\%3e?subject=[microtype\%20\fileversion]}
    {\texttt{w.m.l@gmx.net}}}
  % the samples in the introduction, utilising nested optional content groups (aka. layers)
  % (nowadays, I would be using one of the ocg packages, but none of them existed back then (2005)):
  \ifnum\pdftexversion<140 \else
    \def\mt@layer#1#2{\pdfliteral page{/OC/#1 BDC}#2\pdfliteral page{EMC}}
    \ifx\mt@objects\@undefined\let\mt@objects\@empty\fi
    \ifx\mt@order  \@undefined\let\mt@order  \@empty\fi
    \let\mt@resources\@empty
    \def\mt@register#1#2{%
      \immediate\pdfobj{<< /Type/OCG /Name(#1:#2) >>}
      \expandafter\xdef\csname mt@#1@#2\endcsname{\the\pdflastobj\space 0 R }
      \xdef\mt@objects  {\mt@objects        \csname mt@#1@#2\endcsname}
      \xdef\mt@order    {\mt@order          \csname mt@#1@#2\endcsname}
      \xdef\mt@resources{\mt@resources/#1#2 \csname mt@#1@#2\endcsname}}
    \xdef\mt@order{\mt@order[(Sample)}
     \mt@register{Protrusion}{true} \mt@register{Protrusion}{false}
     \mt@register{Expansion} {true} \mt@register{Expansion} {false}
     \mt@register{_compatibility}{}
    \xdef\mt@order{\mt@order]}
    \pdfcatalog{/OCProperties <<
                   /OCGs [\mt@objects]
                   /D << /Order [\mt@order]
                         /BaseState/OFF
                         /ON [\mt@Protrusion@false \mt@Expansion@false
                              \ifx\mtl@objects\@undefined\else\mtl@objects\fi] >> >> }
    \def\mt@place#1{%
      \vskip-\mt@unvdimen
      \setbox\mt@box\vbox{#1}%
      \mt@unvdimen\dimexpr\ht\mt@box+\dp\mt@box\relax
      \unvbox\mt@box}
    \def\mt@pseudo@marg#1{%
      \mt@place{\llap{\vbox{%
        \hsize\marginparwidth
        \rightskip \marginparsep plus 1em
        \leavevmode\itshape\footnotesize #1}}}}
    \def\mt@show@sample#1#2{%
      \mt@layer{Protrusion#1}{%
        \mt@layer{Expansion#2}{%
          \mt@place{\microtypesetup{protrusion=#1,expansion=#2}%
            \mt@sample@text\strut}}}}
    \def\mt@toggle@sample#1{%
      \pdfstartlink user{/Subtype/Link
        /BS << /Type/Border/W 1 /S/D /D[4 1] >>
        /H/O /C[0.65 0.04 0.07] /Contents(Click to Toggle #1!)
        %/OC << /Type/OCMD /VE[/Not \csname mt@_compatibility@\endcsname] >> % not honoured by older viewers anyway
        /A << /S/SetOCGState /State[/Toggle \csname mt@#1@true\endcsname
                                            \csname mt@#1@false\endcsname] >>}
      #1 \hfill\pdfendlink & \mt@layer{#1true}{\rlap{on}}\mt@layer{#1false}{off}}
    \long\def\microtypesample#1{%
      \begingroup
      \leftskip 15pt \rightskip 15pt
      \parskip   4pt \parindent  0pt
      \vskip 8pt % = \topsep without vertical stretchability
      \long\def\mt@sample@text{#1}
      \mt@pseudo@marg{\color{theblue}%
        After you have read the text on the right, you can view the effect of
        the features it describes by clicking on the links:\strut\\
        \colorbox{theshade}{%
          \begin{tabular}{@{}>{\upshape}l@{\quad}l}
            \mt@toggle@sample{Protrusion}\\\addlinespace
            \mt@toggle@sample{Expansion}
          \end{tabular}}\\[0.3\baselineskip]
        Both features are enabled throughout this document.}
      \mt@show@sample{false}{false}
      \mt@show@sample{false}{true}
      \mt@show@sample{true} {false}
      \mt@layer{_compatibility}{%
        % for compatibility with older PDF viewers that don't support OCGs, we
        % add a layer that contains a white box, which will hide the underlying
        % layers for older viewers, and will be ignored by PDF 1.5 capable viewers.
        \mt@place{\rlap{\hskip-\marginparwidth \color{white}%
          \vrule width\dimexpr\hsize+\marginparwidth\relax height\mt@unvdimen}}
        \mt@pseudo@marg{\color{thered}%
          If you had a \acronym{PDF} viewer that understands
          \acronym{PDF}\,{\smaller1.5}, you could view the effect of the
          micro-typographic features by clicking on the links.\strut
          \\\vphantom{\colorbox{white}{\tabular l\\\addlinespace\\\endtabular}}%
          \\[0.3\baselineskip] Both features are enabled throughout this document.}}
      \mt@show@sample{true}{true}
      \vskip 4pt
      \endgroup
      \edef\x{\pdfpageresources{/Properties <<\mt@resources>>}}\x}
    \def\emptypdfpageresources{\pdfpageresources{}}
    \font\dummyspace=dummy-space
    \pdfglyphtounicode{space}{0020}
    \def\lst@outputspace{% copy spaces (from a font that really has a space at x20)
      \setbox0\hbox{ }\@tempdima\wd0
      \setbox0\hbox{\dummyspace\char"20}\advance\@tempdima-\wd0
      \unhbox0 \kern\@tempdima}
  \fi
\else
  \usepackage{url,xr}
  \externaldocument{microtype\ifcodedoc\else-code\fi}
  \newcommand\hyperref[2][]{#2}
  \let\hyperpage\@firstofone
  \let\dochyperpage\@firstofone
  \let\docmain\main
  \let\texorpdfstring\@firstoftwo
  \def\ctanurl{Available from \acronym{CTAN} at \url}
  \let\ctanpkgurl\ctanurl
  \let\nolinkurl\url
  \let\mailto\texttt
  \def\mailtoRS{\mailto{w.m.l@gmx.net}}
  \let\href\@gobble
  \newcommand\textattachfile[3][]{#3 \textit{[File \file{#2} not attached,
        because \file{microtype.dtx} hasn't been compiled with \pdftex.]}}
  \long\def\microtypesample#1{\begin{quote}#1\end{quote}}
  \let\emptypdfpageresources\relax
\fi
\ifx\l@ukenglish\@undefined
  \hyphenation{let-ter-spac-ing let-ter-spaced let-ter-space}
\else
  \language=\l@ukenglish
\fi
\hyphenation{%An-dre-as Ber-nard Ha-rald Mi-cha-el Pe-ter Ste-phan Wolf-ram
             %Har-ders Hop-pe Jac-kow-ski Ku-char-czyk Mei-er Mu-the-si-us Zed-ler
             %Die-te-rich Sveinung Marcin RazorXsr
             Dyballa Maverick
             with-out
             Pa-la-ti-no}
\def\fallbacktext#1{{\centering\itshape[#1]\par}}
% abbreviations
\DeclareRobustCommand\thanhthe{Th\^e%
     \ifx\eTeXversion\undefined \llap{\raisebox{0.5ex}{\'{}}}%
     \else \llap{\raisebox{0.45ex}{\'{}\kern\dimexpr.05em-2\fontdimen1\font\relax}}%
     \fi}
\DeclareRobustCommand\thanh{H\`an \thanhthe{} Th\`anh}
\DeclareRobustCommand\pdftex{\texorpdfstring{pdf\kern.05em\TeX\CatIndeX{pdf\TeX}{pdftex}{engine}}{pdfTeX}}
\DeclareRobustCommand\luatex{\texorpdfstring{Lua\kern-.05em\TeX\CatIndeX{Lua\TeX}{luatex}{engine}}{LuaTeX}}
\DeclareRobustCommand\etex{\mbox{e-\kern-.075em\TeX}\CatIndeX{e-\TeX}{etex}{engine}}
\DeclareRobustCommand\nonetex{\rlap{\kern.05em/}\etex} % aka. \TeX
\def\@reflect#1{\ifdim\fontdimen1\font=0pt \reflectbox{#1}\else\rotatebox[origin=c]{180}{#1}\fi}
\DeclareRobustCommand\xe{\textoractual{\@reflect{X}\lower.4ex\hbox{\kern-.066em\@reflect{E}}}{Xe}}% also reflect the initial `X'?
\DeclareRobustCommand\xetex{\xe\kern-.1em\TeX\CatIndeX{\xe\TeX}{xetex}{engine}}
\DeclareRobustCommand\texlive{\TeX~Live\CatIndeX{\TeX~Live}{TeXLive}{distribution}}
\DeclareRobustCommand\miktex{MiK\TeX\CatIndeX{MiK\TeX}{MiKTeX}{distribution}}
\def\githuburl{https://github.com/schlcht/microtype}
\DeclareRobustCommand\githubissue[1]{\let\maybe@comma\@empty
  [issue\maybe@plural#1,\@nil~\@for\@ISSUE:=#1\do{%
    \maybe@comma\href{\githuburl/issues/\@ISSUE}{\#\@ISSUE}\let\maybe@comma,}]}
\def\maybe@plural#1,#2\@nil{\ifx\relax#2\else s\fi}
\def\microtype{{\PackageFont microtype}}
\def\letterspace{\pkg{letterspace}}
\def\fontdim{\cmd\fontdimen\,}
\def\eg{e.g.}
\def\ie{i.e.}
\def\EM#1{#1\kern.1emem}
\DeclareRobustCommand\smaller{\setbox\z@\hbox{\@tempcnta=\f@size
  \edef\x{\@tempcnta=\the\@tempcnta}\expandafter}\x
  \advance\@tempcnta-7  \ifcase\@tempcnta\tiny\or\scriptsize\or
    \footnotesize\or\small\or\or\normalsize\or\or\large\or\or\or\Large\fi}
\DeclareRobustCommand\acronym[1]{\texorpdfstring{{\smaller\textls[60]{#1}}}{#1}}
\let\less=<
{\catcode`\<=\active
 \AtBeginDocument{\catcode`\<=\active
   \def<#1>{\acronym{#1}}
   \def\contributor#1 <#2\at#3>{\@contributor{#1}{#2@#3}}}}
%\DeclareRobustCommand\@contributor[2]{\textit{#1}}
%\DeclareRobustCommand\@contributor[2]{\href{mailto:#2}{\textit{#1}}}
\ifcodedoc \else
 \newwrite\@contributorsfile
 \immediate\openout\@contributorsfile=microtype.cdx
\fi
\DeclareRobustCommand\@contributor[2]{\textit{#1}%
   {\ifcodedoc\else\let\@indexfile\@contributorsfile\fi
    \expandafter\index\expandafter{\@getlastname#1 \@nil\actualchar %\href{mailto:#2}{#1}
        \textit{#1} (contributor)\encapchar \ifcodedoc\else doc\fi hyperpage}}}
\def\@getlastname#1 #2\@nil{\ifx\@nil#2\@nil#1\else\@getlastname#2\@nil\fi}
%<*driver>
\CodelineIndex
\EnableCrossrefs
\RecordChanges
\ifcodedoc
  \let\printlogo\undefined
  \InputIfFileExists{microtype-hist.tmp}
    {\def\VersionDate##1##2{\global\expandafter\def\csname MTversiondate##1\endcsname{##2}}}
    \relax
\else
  \OnlyDescription
\fi
\begin{document}
  \DocInput{microtype.dtx}
\end{document}
%</driver>
%</driver|docsty>
% \fi
%
% ^^A -------------------------------------------------------------------------
%\GeneralChanges*
%\ifcodedoc\else
%\changes{v1.0}{2004/09/11}{Initial version}
%\changes{v2.0}{2006/12/29}{new package \letterspace: a stripped-down version,
%                           containing the letterspacing commands only}
%\changes{v3.0}{2021/10/31}{move development to \href{\githuburl}{GitHub}}
%\changes{v3.1b}{2023/09/30}{add \file{DEPENDS.txt}
%                            (suggested by \contributor Bruno Victal <mirai\at makinata.eu>)}
%                             ^^A private mail, 2023/09/29
%
%\GeneralChanges{Documentation}
%\changes{v1.9b}{2006/01/13}{activate expansion in the distributed <PDF>}
%\changes{v2.2}{2007/04/01}{logo transparency and amusement}
%\changes{v3.0}{2021/06/01}{\relax split up in User manual (\file{microtype.pdf})
%                            and Implementation doc (\file{microtype-code.pdf})}
%\fi
%
% \GetFileInfo{\jobname.dtx}
% \title{\ifx\printlogo\undefined\else\printlogo\fi
%        \textls[40]{The \microtype\ package}%
%        \\[6pt]\large
%        Subliminal refinements towards typographical perfection
%        \ifcodedoc\\[9pt]{\Large--- \textls[60]{IMPLEMENTATION} ---}\fi}%
% \author{R Schlicht\\\mailtoRS}
% \date{\fileversion\\\filedate}
%
% \maketitle \thispagestyle{empty}
%
%\begin{abstract}
%\noindent
% The \microtype\ package provides a \LaTeX\ interface to the micro-typographic
% extensions that were introduced by \pdftex\ and some of which have since also
% propagated to \luatex\ and \xetex: most prominently, character protrusion and
% font expansion, furthermore the adjustment of interword spacing and additional
% kerning, as well as hyphenatable letterspacing (tracking) and the possibility
% to disable all or selected ligatures.
% These features may be applied to customisable sets of fonts, and all
% micro-typographic aspects of the fonts can be configured in a straight-forward
% and flexible way. Settings for various fonts are provided.
%
% Note that character protrusion requires \pdftex\ (version~0.14f or later),
% \luatex, or \xetex\ (at least version~0.9997).
% Font expansion works with \pdftex\ (version~1.20 for automatic expansion)
% or \luatex.
% The package will by default enable protrusion and expansion if they can safely
% be assumed to work.
% Disabling ligatures requires \pdftex\ ($\geq$\,1.30) or \luatex, while the
% adjustment of interword spacing and of kerning only works with \pdftex\ ($\geq$\,1.40).
% Letterspacing is available with \pdftex\ ($\geq$\,1.40), \luatex\ ($\geq$\,0.62) or \xetex.
%
% The alternative package \letterspace, which also works with plain \TeX,
% provides the user commands for letterspacing only, omitting support for all
% other extensions (see section~\ref{sec:lettersp}\ifcodedoc\space of the User manual\fi).
%
%\bigskip\noindent
% This package is copyright \textcopyright\ 2004\kern.09em--2025 R Schlicht.
% It may be distributed and/or modified under the conditions of the
% \IfFileExists{lppl.tex}{\hyperref[LPPL:LPPL]}{\href{https://www.latex-project.org/lppl/}}
%   {\LaTeX\ Project Public License},
% either version~1.3c of this license or (at your option) any later version.
% This work has the <LPPL> maintenance status `maintained'.
%\end{abstract}
%
%
%\newpage
%\emptypdfpageresources ^^A layers of the logo
%
%{\sffamily\def\familydefault{\sfdefault}\ifcmr\else\DeclareFontSeriesDefault[sf]{bf}{sb}\fi
% \tableofcontents
% \listoftables
% \ifcodedoc\listoffigures\fi
% \vskip2\baselineskip
% \Large\MTsectionfont
% \noindent
% \ifpdf
%  \ifcodedoc
%    \href{file:microtype.pdf}{User manual}
%  \else
%    \href{file:microtype-code.pdf}{Implementation}
%  \fi
%  \normalfont\normalsize (external document)
% \fi
%}
%
%
%\ifcodedoc\else
%
%\newpage
%\section{Micro-typography with \TeX}\label{sec:micro-type}
%
% Micro-typography is the art of enhancing the appearance and readability of a
% document while exhibiting a minimum degree of visual obtrusion. It is
% concerned with what happens between or at the margins of characters,
% words or lines.
% Whereas the macro-typographical aspects of a document (\ie, its layout) are
% clearly visible even to the untrained eye, micro-typographical refinements
% should ideally not even be recognisable. That is, you may think that a
% document looks beautiful, but you might not be able to tell exactly
% why: good micro-typographic practice tries to reduce all potential irritations
% that might disturb a reader.
%
% Some essential micro-typographical aspects are already taken care of by
% \TeX\ out of the box -- and in an outstanding manner -- namely, hyphenation
% and justification, as well as kerning and ligatures.
% Other aspects are in the user's scope of responsibilities, \eg, to specify
% the right amounts of spacing around punctuation characters, numbers, or
% quotation marks.
% On top of this, a number of long-standing micro-typographic techniques have
% been introduced to the \TeX\ world relatively recently with \pdftex, and
% have since also propagated to \luatex\ and \xetex.
% These features make them the tool of choice not only for the creation of
% electronic documents but also of works of outstanding time-honoured typography:
% most prominently, \textit{character protrusion} (also known as margin kerning)
% and \textit{font expansion}. Quoting \thanh, the author of \pdftex, who
% writes in his thesis:
%
%\changes{v1.9b}{2006/01/13}{add samples of micro-typographic features}
%\microtypesample{\small
% `Margin kerning is the adjustments of the characters at the margins of a
%  typeset text. A simplified employment of margin kerning is hanging
%  punctuation. Margin kerning is needed for optical alignment of the margins
%  of a typeset text, because mechanical justification of the margins makes
%  them look rather ragged. Some characters can make a line appear shorter to
%  the human eye than others. Shifting such characters by an appropriate
%  amount into the margins would greatly improve the appearance of a typeset
%  text.
%
%  Composing with font expansion is the method to use a wider or narrower
%  variant of a font to make interword spacing more even. A font in a loose
%  line can be substituted by a wider variant so the interword spaces are
%  stretched by a smaller amount. Similarly, a font in a tight line can be
%  replaced by a narrower variant to reduce the amount that the interword
%  spaces are shrunk by. There is certainly a potential danger of font
%  distortion when using such manipulations, thus they must be used with
%  extreme care. The potentiality to adjust a line width by font expansion can
%  be taken into consideration while a paragraph is being broken into lines,
%  in order to choose better breakpoints.' [\cite[p.~323]{ThanhThesis}]}
%
% Another micro-typographic technique, which has always been extremely
% difficult to achieve in \TeX, is robust and hyphenatable \emph{letterspacing
% (tracking)}.\footnote{^^A
%   The \cite{soul} package undertakes great efforts, but may still fail in
%   certain circumstances; even to systematically adjust the tracking of a
%   font throughout the document remains impossible.}
% Whereas letterspacing can easily be, and often is, abused when applying
% it to lowercase letters, readability may be increased by slightly
% letterspacing (small) capitals or by decreasing the tracking of very large
% uppercase type.
%
% Setting \emph{additional kerning} for individual characters is especially
% (but not only) useful for languages whose typographical tradition requires certain
% characters to be separated by a space. For example, it is customary in French
% typography to add a small space before question mark, exclamation mark and
% semi-colon, and a bigger space before the colon and the guillemets. Until
% now, this could only be achieved by making these characters active (as is done,
% for example, by the \pkg{babel} package), which may not always be a robust
% solution. In contrast to the standard kerning built into the fonts
% (which will of course apply as usual), this additional kerning relates to
% single characters, not to character pairs.
%
% \emph{Adjustment of interword spacing} is based upon the idea that in order
% to achieve a uniform greyness of the text, the space between words should
% also depend on the surrounding characters. For example, if a word ends with
% an `r', the following space should be a tiny bit smaller than that following,
% say, an `m'. You can think of this concept as an extension to \TeX's `space
% factors'. This feature may enhance the appearance of paragraphs even more.
% Emphasis in the last sentence is on the word `may': this extension is still
% highly experimental -- in particular, only ending characters will currently
% influence the interword space. Also, the settings shipped with \microtype\
% are but a first approximation, and I~would highly welcome corrections and
% improvements. I suggest reading the reasoning behind the settings in
% the Implementation part, section~\ref{sub:conf-spacing}.
%
% The possibility, finally, to \emph{disable all or selected ligatures} is
% particularly useful for typewriter fonts.
%
%\emptypdfpageresources ^^A layers of the sample
%\bigskip\noindent
% The \microtype\ package provides an interface to all these micro-typographic
% extensions. All micro-typographic aspects may be customised to your taste and
% needs in a straight-forward and systematic manner. The next chapters present
% a survey of all options and customisation possibilities. Should the
% micro-typographic extension discussed in a section work only with certain
% \TeX\ engines, this requirement is marked inside a grey text box on the
% right.
%
%
%\section{Getting started}
%
% There is nothing surprising in loading this package:
%\begin{verbatim}[morekeywords={[1]{microtype}}]
%\usepackage{microtype}
%\end{verbatim}
% This will be sufficient in most cases, and if you are not interested in
% fine-tuning the micro-typographic appearance of your document (however
% unlikely this would seem, since using this package is proof of your interest
% in typographic issues), you may actually skip the rest of this document.
%^^A
% If this, on the other hand, does not satisfy you -- be it for theoretical or
% practical reasons -- this manual will guide you on the path to the desired
% results along the following milestones:
%
%\changes{v2.2}{2007/06/06}{add overview}
%\begin{itemize}
%  \item Enable the desired micro-typographic features, either via the
%        respective package option or with the \cs{microtypesetup} command
%        (section~\ref{sec:options}).
%  \item Select the fonts to which the features should be applied by declaring
%        and activating `sets of fonts'. A number of sets are predefined, which may be
%        activated directly in the package options
%        (section~\ref{sec:font-sets}).
%  \item Fine-tune the micro-typographic settings of the fonts or sets of fonts
%        (section~\ref{sec:fine-tuning}).
%  \item If you're of the kind who always wants to march on, you will certainly
%        be interested in the possibility of context-sensitive setup
%        (section~\ref{sec:context}).
%  \item You are even countenanced to leave the path of typographic virtue and
%        steal some sheep (section~\ref{sec:lettersp}) or trespass in other ways
%        (section~\ref{sec:disable-ligatures}).
%  \item For the pedantic or the perfectionist, sections \ref{sec:pedantic}
%        and \ref{sec:contrib} are warmly recommended.
%  \item Should you encounter any obstacles, follow the hints and caveats
%        (section~\ref{sec:caveats}).
%\end{itemize}
%
%
%\section{Options}\label{sec:options}
%
% Like many other \LaTeX\ packages, the \microtype\ package accepts options in
% the well-known |key=value| syntax. In the following, you will find a
% description of all \key{keys} and their possible |values|
% (`|true|' may be omitted; multiple values, where allowed, must be enclosed in
% braces; the default value is shown on the right -- if preceded by an asterisk,
% this default only applies when running an up-to-date \pdftex\ in <PDF> mode).
%
%
%\subsection{Enabling the micro-typographic features}\label{sub:options-microtype}
%
%\Describe{Option}{protrusion}
%                 {*true,false,compatibility,nocompatibility,:font set name}
%\DescribeOption{expansion}
% These are the main options to control the level of micro-typographic
% refinement which the fonts in your document should gain. By default, the
% package is moderately greedy: character protrusion will always be enabled,
% font expansion will only be disabled when the fonts cannot be expanded
% automatically, that is, with \pdftex\ versions older than 1.20 or in <DVI>
% output mode (see section~\ref{sub:options-misc}), or with \xetex.
% In other words, \microtype\ will try to apply as much micro-typography as
% can safely be expected to work under the respective conditions (hence, it is
% usually not necessary to load the package with different options, \eg, for <PDF>
% resp. <DVI> mode).
%
% Protrusion and expansion may be enabled or disabled independently from each
% other by setting the respective key to |true| resp. |false|. The
% \opt{activate} option
%\DescribeOption{activate}
% is a shortcut for setting both options at the same time. Therefore, the
% following lines all have the same effect (when creating <PDF> files with a
% recent version of \pdftex):
%\begin{verbatim}
%\usepackage[protrusion=true,expansion]{microtype}
%\end{verbatim}
%\begin{verbatim}
%\usepackage[activate={true,nocompatibility}]{microtype}
%\end{verbatim}
%\begin{verbatim}
%\usepackage{microtype}
%\end{verbatim}
%\smallskip
% With activated font expansion and/or character protrusion, line breaks
% (and consequently, page breaks) may turn out differently. If this is not
% desired -- because you are re-typesetting a book whose pagination must not
% change -- you may pass the value |compatibility| to the \opt{protrusion}
% and/or \opt{expansion} options. Typographically, however, the results will be
% suboptimal, hence the default value is |nocompatibility|.
%
% Finally, you may also specify the name of a font set to which character
% protrusion and/or font expansion should be restricted. See
% section~\ref{sec:font-sets} for a detailed discussion. Specifying a font set
% for a feature implicitly activates this feature.
%
%\medskip
%\Describe{Option}{tracking}{true,!false,:font set name}
% This option will systematically change the tracking of the fonts specified in
% the active font set (by default, all small capitals).
% With \pdftex, it is only available in <PDF> mode.
%
%\pagebreak ^^A layout
%\medskip
%\Describe{Option}{kerning}{true,!false,:font set name}
%\DescribeOption{spacing}
% These features do not unconditionally improve the quality of the typeset text:
% the \opt{spacing} feature is still considered experimental, while the \opt{kerning}
% feature only makes sense in special cases.
% Therefore, neither feature is enabled by default. They are not available
% with \xetex\ or \luatex.
%
%\begin{table}\small
%\changes{v2.3a}{2008/02/25}{add table of available and enabled features}
%\changes{v2.8a}{2020/12/23}{reorganise table~\ref{tab:available-features} for clarification
%                            (suggested by \contributor Daniel Benjamin Miller <dbmiller\at dbmiller.org>)}
%                            ^^A private mail, 2020/12/10
%\caption{Availability of micro-typographic features}\label{tab:available-features}
%\catcode`\!=13 \def!{\textcolor{thegreen}{\hskip.9em $\bigstar$}}
%\catcode`\?=13 \def?{\textcolor{theblue} {\hskip 1em $\boxtimes$}}
%\catcode`\_=13 \def_{\textcolor{thered}  {\hskip 1em $\varnothing$}}
%\setlength\fboxsep{4pt}
%\leavevmode\kern-\dimexpr\fboxsep+\fboxrule\relax
%\fcolorbox{theframe}{white}{^^A
%\begin{minipage}{\textwidth}
%\def\arraystretch{1.2}
%\begin{tabular}{*3{@{}L{40pt}}*6{@{}L{39pt}}@{}}
%      \multicolumn{3}{@{}l}{\footnotesize \TeX\ engine}
%    & \multicolumn{6}{@{}l}{\footnotesize Micro-typographic features}\\
%\cmidrule(r){1-3}\cmidrule{4-9}
%      \footnotesize Engine
%    & \footnotesize Version
%    & \footnotesize Output
%    & \footnotesize Protrusion
%    & \multicolumn{2}{l}{\footnotesize\hspace{2em}Expansion}
%    & \footnotesize Tracking
%    & \footnotesize Kerning
%    & \footnotesize Spacing\\
%\cmidrule(r){5-6}\addlinespace[-2pt]
% &&&& \footnotesize \textls[-20]{manual}
%    & \footnotesize \textls[-20]{automatic}\\
%\cmidrule(r){1-1}\cmidrule(r){2-2}\cmidrule(r){3-3}
%\cmidrule(r){4-4}\cmidrule(r){5-5}\cmidrule(r){6-6}
%\cmidrule(r){7-7}\cmidrule(r){8-8}\cmidrule   {9-9}
% \pdftex
%    & $\less$ 0.14f & <DVI>/<PDF> & _ & _ & _ & _ & _ & _\\
%    & $\geq$  0.14f & <DVI>/<PDF> & ! & ? & _ & _ & _ & _\\
%    & $\geq$  1.20  & <DVI>       & ! & ? & _ & _ & _ & _\\
%    &               & <PDF>       & ! & ? & ! & _ & _ & _\\
%    & $\geq$  1.40  & <DVI>       & ! & ? & _ & _ & ? & ?\\
%    &               & <PDF>       & ! & ? & ! & ? & ? & ?\\
%\cmidrule(r){1-3}
% \luatex ^^A we will have to re-model kerning and spacing with \luatex
%    & $\geq$  0.30  & <DVI>       & ! & ? & _ & _ & _ & _\\
%    &               & <PDF>       & ! & ? & ! & _ & _ & _\\
%    & $\geq$  0.62  & <DVI>       & ! & _ & \hskip1em\llap{(}\textcolor{theblue}{$\boxtimes$})\raisebox{0.4ex}{\sffamily\itshape\footnotesize a} & ? & _ & _\\
%    &               & <PDF>       & ! & _ & ! & ? & _ & _\\
%\cmidrule(r){1-3}
% \let\textoractual\@firstoftwo ^^A why?
% \xetex
%    & $\geq$ 0.9997 & <PDF>       & ! & _ & _ & ? & _ & _\\
%\addlinespace[2pt]
%\bottomrule
%\end{tabular}^^A
%\vskip4pt\footnotesize
%\hskip-1em
% ! = enabled\quad
% ? = not enabled\quad
% _ = not available
%\hfill
% {\sffamily\itshape a}\quad by means of variable tracking
%\vskip4pt
%\end{minipage}^^A
%}\kern-\dimexpr\fboxsep+\fboxrule\relax ^^A end \fcolorbox
%\end{table}
%
%\medskip\noindent
% Table~\ref{tab:available-features} presents an overview of which
% micro-typographic features are available and enabled by default for the
% relevant \TeX\ versions and output modes.
%
%\medskip\noindent
% Whether ligatures should be disabled cannot be controlled via a package option
% but by using the \cs{DisableLigatures} command, which is explained in
% section~\ref{sec:disable-ligatures}.
%
%
%\subsection[Character protrusion]
%           {Character protrusion \requires{\pdftex~0.14f,\luatex~0.30,\xetex~0.9997}}
%           \label{sub:options-protrusion}
%
%\Describe{Option}{factor}{:integer}[\MT@factor@default]
% Using this option, you can globally increase or decrease the amount by which
% the characters will be protruded. While a value of 1000 means that the full
% protrusion as specified in the configuration (see section~\ref{sub:protrusion})
% will be used, a value of 500 would result in halving all protrusion factors of
% the configuration. This might be useful if you are generally satisfied with
% the settings but prefer the margin kerning to be less or more visible
% (\eg, if you are so proud of being able to use this feature that you want
% everybody to see it, or -- to mention a motivation more in compliance with
% typographical correctness -- if you are using a large font that calls for
% more modest protrusion).
%
%\medskip
%\Describe{Option}{patch}{!all,none,:list of patches}
%\DescribeOption{nopatch}
% These options provide control over various patches meant to fix protrusion
% at margins other than the text block margins.
% They are described in detail in section~\ref{sec:pedantic}.
%
%\pagebreak ^^A layout
%\medskip
%\Describe{Option}{unit}{!character,:dimension}
% This option is described in section~\ref{sub:protrusion}, apropos of the command
% \cs{SetProtrusion}. Use with care.
%
%
%\subsection[Font expansion]
%           {Font expansion \requires{\pdftex~0.14f,\luatex~0.30}}
%           \label{sub:options-expansion}
%
%\Describe{Option}{auto}{*true,false}
% Beginning with \pdftex\ version 1.20 (inherited by \luatex), the expanded
% instances of the fonts may be calculated automatically and at run-time instead
% of the user having to prepare them in advance. This option is true
% by default provided that you are using a \TeX\ engine with this capability
% and the output mode is <PDF>.\footnote{
% With \pdftex, automatic font expansion does not work with bitmap fonts.
% Therefore, if you are using the Computer Modern Roman fonts in <T1> encoding,
% you should either install the \pkg{cm-super} package or use the Latin Modern
% fonts (package \pkg{lmodern}).}
%\changes{v1.9}{2005/08/27}{add remark about Type\,1 fonts required for
%                           automatic font expansion}
% If \opt{auto} is set to false, the font instances for all expansion steps must exist
% (with files called \meta{font~name}\texttt{\textpm}\meta{expansion value},
% \eg, \file{cmr12+10}, as described in the \cite{pdftexman}).
%\iffalse ^^A no longer true (1.40?)
% If expanded instances of the fonts are available, they will be used
% regardless whether \opt{auto} is true or not.
%\fi
% With recent versions of \luatex, expansion is always automatic.
%
% When generating <DVI> files, font expansion has to be enabled explicitly.
% With \pdftex, \emph{automatic} font expansion will not work because
% the postprocessing drivers (|dvips|, |dvipdfm|, etc.) resp. the <DVI> viewer
% are not able to generate the fonts on the fly.
%^^A\changes{v2.7}{2017/07/06}{add remark about automatic font expansion with \texttt{dvilualatex}}
%\changes{v2.8}{2020/02/09}{squash fake news about automatic font expansion with \texttt{dvilualatex}}^^A
% With \luatex, on the other hand, expansion in <DVI> mode is realised by
% modifying the inter-letter spacing (tracking) instead of the glyphs
% themselves, which may or may not be desired.
%
%\medskip
%\Describe{Option}{stretch}{:integer}[\MT@stretch@default]
%\DescribeOption{shrink}
% You may specify the stretchability and shrinkability of a font, \ie, the
% maximum amount that a font may be stretched or shrunk. The numbers will be
% divided by 1000, so that a stretch limit of 10 means that the font may be
% expanded by up to~1\%.
% The default stretch limit is 20. The shrink limit will by default be the
% same as the stretch limit.
%
%\medskip
%\Describe{Option}{step}{:integer}[\MaybeDefault{1}]
% Fonts are not expanded by arbitrary amounts but only by certain discrete
% steps within the expansion limits. With recent versions of \pdftex\ (1.40 or
% newer) or \luatex, this option is by default set to 1, in order to allow
% trying the maximum number of font instances, and hence to guarantee
% the best possible output.\footnote{
%   The downside with this default is that \pdftex\ may run out of memory with
%   huge documents; in this case, read about the error messages in the `Hints
%   and caveats' section~(\ref{sec:caveats}), or try with a larger \opt{step}.}
% Older \pdftex\ versions, however, had to include every font instance in the
% <PDF> file, which may increase the file size quite dramatically. Therefore,
% in case you are using a pre-1.40 \pdftex\ version, \opt{step} is by default
% set to one fifth of the smaller value of \opt{stretch} and \opt{shrink}.
%
%\medskip
%\Describe{Option}{selected}{true,!false}
% When applying font expansion, it is possible to restrict the expansion of some
% characters that are more sensitive to deformation than others (\eg, the `O',
% in contrast to the `I'). This is called \emph{selected expansion}, and its
% use allows increasing the stretch and shrink limits (to, say, 30 instead
% of 20); however, the gain is limited since at the same time the average
% stretch variance will be decreased. Therefore, this option is by default
% set to |false|, so that all characters will be expanded by the same amount.
% See section~\ref{sub:expansion} for a more detailed discussion.
%
%
%\subsection[Tracking]
%           {Tracking \requires{\pdftex~1.40,\luatex~0.62,\xetex~0.9997}}
%           \label{sub:options-tracking}
%
%\Describe{Option}{letterspace}{:integer}[\MT@letterspace@default]
% This option changes the default amount for tracking (see section~\ref{sub:tracking})
% resp. letterspacing (see section~\ref{sec:lettersp}). The amount is specified
% in thousandths of \EM{1}; admissible values are in the range of \textminus1000
% to +1000.
%
%
%\subsection{Miscellaneous options}\label{sub:options-misc}
%
%\changes{v2.0}{2006/11/28}{add remark about `\opt{disable}' (previously \texttt{draft}) option disabling \microtype\
%               (noted by \contributor Michalis Miatidis <miatidis\at informatik.rwth-aachen.de>)}
%                                                                    ^^A private mail, 2006/11/26
%\changes{v3.0}{2021/09/28}{rename option \texttt{draft} to \opt{disable}
%               (insistently requested by \contributor Frank Mittelbach <frank.mittelbach\at latex-project.org>)}
%                ^^A private mail, 2018/07/04
%\Describe{Option}{disable}{true,!false,ifdraft}
% If the \opt{disable} option is passed to the package, all
% micro-typographic extensions will be disabled, which may lead to different
% line, and hence even page, breaks. This option replaces the |draft| option
% from earlier versions, which could be inherited from the class options;
% to restore the previous behaviour, you may pass the value |ifdraft|:
% in this case, the \opt{disable} option will be set to |true| if and only if
% the document class has been loaded with the |draft| option.
%
%\medskip
%\Describe{Option}{verbose}{true,!false,errors,silent}
% Information on the settings used for each font will be written into the log
% file if you enable the \opt{verbose} option. This is useful for debugging.
% When \microtype\ encounters a problem that is not fatal (\eg, an unknown
% character in the settings, or non-existent settings), it will by default
% only issue a warning and try to continue. Loading the package with
% |verbose=errors| will turn all warnings into errors, so that you can be sure
% that no problem will go unnoticed. If, on the other hand, you have
% investigated all warnings and decide to ignore them, you may silence
% \microtype\ with |verbose=silent|.
%
%\medskip
%\Describe{Option}{babel}{true,!false}
% Loading the package with the \opt{babel} option will adjust the typesetting
% according to the respective selected language. This also works with the
% \pkg{polyglossia} package. Read section~\ref{sec:context}
% for further information.
%
%\medskip
%\Describe{Option}{config}{:file name}[microtype]
% Various settings for this package will be loaded from a main configuration
% file, by default \file{microtype.cfg} (see section~\ref{sub:config-file}).
% You can have a different configuration file loaded instead by specifying its
% name \emph{without the extension}, \eg, |config=mycrotype|.
%
%\medskip
%\Describe{Option}{DVIoutput}{true,*false}
% \pdftex\ and \luatex\ are not only able to generate <PDF> output but can also
% spit out <DVI> files. In fact, all recent \TeX\ systems are using \pdftex\ as
% the default engine also for <DVI> output, and \luatex\ too can be called
% in <DVI> mode. However, since changing the output mode inside the document
% may have undesired effects, this option should be considered deprecated;
% instead, it is recommended to just call the respective program (|latex| resp.
% |dvilualatex|).
%\changes{v2.8}{2020/04/02}{declare \opt{DVIoutput} option deprecated}
% For \xetex, this option is not applicable.
%
%\iffalse
%\changes{v1.5}{2004/12/15}{add note about \opt{DVIoutput} option}
% The latter can be ordered with the option \opt{DVIoutput}, which will set
% \cmd\pdfoutput\ to zero.
% Note that this will confuse packages that depend on the value of
% \cmd\pdfoutput\ if they were loaded earlier, as they had been made believe
% that they were called to generate <PDF> output where they actually weren't.
% These packages are, among others: \pkg{graphics}, \pkg{color},
% \pkg{hyperref}, \pkg{pstricks} and, obviously, \pkg{ifpdf}. Either load these
% packages after \microtype\ or else issue the command |\pdfoutput=0| earlier
% -- in the latter case, the \opt{DVIoutput} option is redundant.
%\fi
%
%\iffalse ^^A ... waiting for bug reports before documenting yet another option ...
%\medskip
%\Describe{Option}{defersetup}{!true,false}
% Unlike in earlier versions, \microtype\ will since version 1.9a defer its
% setup until the end of the preamble. This has at least two advantages: the
% command \cs{microtypesetup} described below may be used to change package
% options later on, and it is no longer necessary to set the default fonts and
% encodings before loading \microtype. There is one possible problem: if a box
% is being constructed inside the preamble, \emph{and} this box contains a font
% that is not loaded before the box is being used in the document, then this
% font will not be set up. Should this extremely unlikely case occur, set
% |defersetup=false|. Then, however, the aforementioned restrictions apply.
%
%\medskip
%\Describe{Option}{copyfonts}{true,!false} ^^A and another one ...
% There are some restrictions as to what \pdftex\ can do with a font: Firstly,
% it cannot expand a single font with different parameters, secondly, it cannot
% apply different protrusion settings to one font within the same paragraph.
% Both restrictions, which only matter with a context-sensitive setup
% (cf.~section~\ref{sec:context}), can be circumvented with the \opt{copyfonts}
% option: when it is set to |true|, \microtype\ will use font copies to work
% on. This option will automatically be set to |true|, whenever protrusion or
% expansion settings with a |context| keyword are encountered. If these
% settings are loaded after the preamble, however, it is too late, and you
% should set the \opt{copyfonts} option manually.
% This only works with \pdftex\ 1.40.4 or later, or \luatex.
%\fi
%
%
%\subsection{Changing options later}\label{sub:options-cmd}
%
%\Describe{Macro}{\microtypesetup}{key\,|=|\,value list}
% Inside the preamble, this command accepts all package options described above
% (except for \key{config}).
% In the document body, this command may be used to change the general settings
% of the micro-typographic extensions. It then accepts all options from
% section~\ref{sub:options-microtype}: \key{expansion}, \key{protrusion} and
% \key{activate}, which in turn may receive the values |true|, |false|,
% |compatibility| or |nocompatibility|, and \key{tracking}, \key{kerning} and
% \key{spacing} with the admissible values |true| or |false|.
% Passing the name of a font set is not allowed.
% Additionally, it accepts the options \key{patch} and \key{nopatch}
% (see section~\ref{sec:pedantic}).
% Using this command, you could for instance temporarily disable font expansion
% by saying:
%\begin{verbatim}
%\microtypesetup{expansion=false}
%\end{verbatim}
%
%
%\section{Selecting fonts for micro-typography}\label{sec:font-sets}
%
% By default, character protrusion will be applied to all text fonts used in
% the document, and a basic set of fonts will be subject to font
% expansion. You may want to customise which fonts should get the benefit of
% micro-typographic treatment. This can be achieved by declaring and activating
% `font sets'; these font sets are specified via font attributes that have to
% match.
%
%\medskip
%\Describe{Macro}{\DeclareMicrotypeSet}{?features,set name,set of fonts}
%\DescribeMacro{\DeclareMicrotypeSet*}
% This command declares a new set of fonts to which the micro-typographic
% extensions should be applied. The optional argument may contain a
% comma-separated list of features to which this set should be restricted.
% The starred version of the command declares \emph{and} activates the font
% set at the same time.
%
% \paragraph{The set of fonts} is specified by assigning values to the <NFSS>
% font attributes: encoding, family, series, shape and size (cf.~\cite{fntguide}).
% Let's start with an example. In the main configuration file \file{microtype.cfg},
% a font set called `|basictext|' is defined as follows:
%\begin{verbatim}
%\DeclareMicrotypeSet{basictext}
%   { encoding = {OT1,T1,T2A,LY1,OT4,QX,T5,EU1,EU2,TU},
%     family   = {rm*,sf*},
%     series   = {md*},
%     size     = {normalsize,footnotesize,small,large}
%   }
%\end{verbatim}
% If you now call
%\begin{verbatim}[deletekeywords={[1]{protrusion}}]
%\UseMicrotypeSet[protrusion]{basictext}
%\end{verbatim}
% in the document's preamble, only fonts in the text encodings, roman or sans
% serif families, normal (or `medium') series, and in sizes called by
% \cmd\normalsize, \cmd\footnotesize, \cmd\small\ or \cmd\large, will be
% protruded. Math fonts, on the other hand, will not, since they are in another
% encoding. Neither will fonts in bold face, or huge fonts. Etc.
%
% If an attribute list is empty or missing -- like the `shape' attribute
% in the above example -- it does not constitute a restriction. In other
% words, this is equivalent to specifying \emph{all} possible values for that
% attribute.
% Therefore, the predefined set `|alltext|', which is declared as:
%\begin{verbatim}
%\DeclareMicrotypeSet{alltext}
%   { encoding = {OT1,T1,T2A,LY1,OT4,QX,T5,TS1,EU1,EU2,TU} }
%\end{verbatim}
% is far less restrictive. The only condition here is that the encoding must
% match.
%
% If a value is followed by an asterisk (like `|rm*|' and `|sf*|' in the first
% example), it does not designate an <NFSS> code, but will be translated into
% the document's |\|\meta{value}|default|, \eg, \cmd\rmdefault.\footnote{
%   These translations will take place \cmd\AtBeginDocument, which means that
%   changes to the defaults inside the preamble will also be taken into account.
%   Only in cases where you change font defaults \cmd\AtBeginDocument\ yourself,
%   you need to load \microtype\ after these changes.}
% A single asterisk means |\|\meta{attribute}|default|, \eg,
% \cmd\encodingdefault, respectively \cmd\normalsize\ for the size axis.
% Sizes may either be specified as a dimension (`|10|' or `|10pt|'), or as a
% size selection command \emph{without} the backslash. You may also specify
% ranges (\eg, `|small-Large|'); while the lower boundary is included in the
% range, the upper boundary is not. Thus, `|12-16|' would match 12\,pt,
% 13.5\,pt and 15.999\,pt, for example, but not 16\,pt. You are allowed to omit
% the lower or upper bound (`|-10|', `|large-|').
%
% Additionally to this declaration scheme, you can add single fonts to
% a set using the `|font|' key, which expects the concatenation of all font
% attributes, separated by forward slashes, \ie,
%`|font|\,|=|\,\meta{encoding}|/|\meta{family}|/|\meta{series}|/|\meta{shape}|/|\meta{size}'.
% This allows you to add fonts to the set that are otherwise disjunct from it.
% For instance, if you wanted to have the roman family in all sizes protruded,
% but only the normal sized, possibly italic, typewriter font (in contrast to,
% say, the small one), this is how you could declare the set:
%\begin{verbatim}[deletekeywords={[1]{protrusion}}]
%\DeclareMicrotypeSet[protrusion]
%   { myset }
%   { encoding = T1,
%     family   = rm*,
%     font     = {T1/tt*/m/n/*,
%                 T1/tt*/m/it/*} }
%\end{verbatim}
% As you can tell from the example, the asterisk notation is also permitted for
% the |font| key. A single asterisk is equivalent to `|*/*/*/*/*|', \ie, the
% normal font. Size selection commands are possible, too, however, ranges are
% not allowed.
%
%\newcounter{nrfontsets}
%\begin{table}\microtypesetup{protrusion=false}\small
%\caption{Predefined font sets}\label{tab:predefined-font-sets}
%\catcode`\!=13 \def!{\textcolor{thered}{$\varnothing$}}
%\catcode`\/=13 \def/#1/{\textcolor{thegreen}{#1}}
%\def<#1>{\textcolor{theblue}{\acronym{#1}}}
%\def\s#1{|#1|\stepcounter{nrfontsets}}
%\setlength\fboxsep{4pt}
%\leavevmode\kern-\dimexpr\fboxsep+\fboxrule\relax
%\fcolorbox{theframe}{white}{^^A
%\begin{minipage}{\textwidth}
%\def\arraystretch{1.2}
%\begin{tabular}{@{}L{65pt}L{82pt}*2{L{41pt}}L{43pt}L{62pt}@{}}
%      \footnotesize Set name
%    & \multicolumn{5}{l}{\footnotesize Font attributes}\\
%\cmidrule{2-6}
%    & \footnotesize Encoding
%    & \footnotesize Family
%    & \footnotesize Series
%    & \footnotesize Shape
%    & \footnotesize Size\\
%\cmidrule(r){1-1}\cmidrule(r){2-2}\cmidrule(r){3-3}
%\cmidrule(r){4-4}\cmidrule(r){5-5}\cmidrule{6-6}
% \s{all}
%    & !
%    & !
%    & !
%    & !
%    & ! \\
%\cmidrule(r){1-1}
% \s{alltext}\linebreak(\s{allmath})
%    & Text encodings, <TS1>\linebreak (<OML>, <OMS>, <U>)
%    & !
%    & !
%    & !
%    & ! \\
%\cmidrule(r){1-1}
% \s{alltext-nott}\linebreak(\s{allmath-nott})
%    & Text encodings, <TS1>\linebreak (<OML>, <OMS>, <U>)
%    & /\cmd\rm|*|/,\linebreak/\cmd\sf|*|/
%    & !
%    & !
%    & ! \\
%\cmidrule(r){1-1}
% \s{basictext}\linebreak(\s{basicmath})
%    & Text encodings \linebreak (<OML>, <OMS>)
%    & /\cmd\rm|*|/,\linebreak/\cmd\sf|*|/
%    & /\cmd\md|*|/
%    & !
%    & /\cmd\normalsize/, /\cmd\footnotesize/, /\cmd\small/, /\cmd\large/\\
%\cmidrule(r){1-1}
% \s{smallcaps}
%    & Text encodings
%    & !
%    & !
%    & /\cmd\sc|*|/,/si/,/scit/
%    & ! \\
%\cmidrule(r){1-1}
% \s{footnotesize}
%    & Text encodings, <TS1>
%    & !
%    & !
%    & !
%    & |-|/\cmd\small/\\
%\cmidrule(r){1-1}
% \s{scriptsize}
%    & Text encodings, <TS1>
%    & !
%    & !
%    & !
%    & |-|/\cmd\footnotesize/\\
%\cmidrule(r){1-1}
% \s{normalfont}
%    & /\cmd\encoding|*|/
%    & /\cmd\family|*|/
%    & /\cmd\series|*|/
%    & /\cmd\shape|*|/
%    & /\cmd\normalsize/\\
%\bottomrule
%\end{tabular}
%\vskip4pt\footnotesize
% `Text encodings' = <OT1>, <T1>, <T2A>, <LY1>, <OT4>, <QX>, <T5>, <EU1>, <EU2>, <TU>
%\hfill
% `/\bslash\,\dots|*|/' = `/\bslash\,\dots|default|/'
%\vskip4pt
%\end{minipage}^^A
%}\kern-\dimexpr\fboxsep+\fboxrule\relax ^^A end \fcolorbox
%\ifcase\c@nrfontsets\or\or\or\or\or\or\or\or\or\or\or
%   \def\@currentlabel{eleven}\or \def\@currentlabel{twelve}\else
%   \PackageError{\MT@MT}{I cannot count any further}{}\fi\label{nrfontsets}
%\end{table}
%
%\medskip\noindent
% Table~\ref{tab:predefined-font-sets} lists the \ref*{nrfontsets} predefined font sets.
% They may also be activated by passing their name to the feature options
% \opt{protrusion}, \opt{expansion}, \opt{tracking}, \opt{kerning} and
% \opt{spacing} when loading the package, for example:
%\begin{verbatim}
%\usepackage[protrusion=allmath,tracking=smallcaps]{microtype}
%\end{verbatim}
%
%\medskip
%\Describe{Macro}{\UseMicrotypeSet}{?features,set name}
% This command activates a font set previously declared by \cs{DeclareMicrotypeSet}.
% Using the optional argument, you can limit the application of the set to one
% or more features. This command only has an effect if the feature was activated
% in the package options.
%
%\medskip
%\Describe{Macro}{\DeclareMicrotypeSetDefault}{?features,set name}
% If a feature is enabled but no font set has been chosen explicitly, the sets
% declared by this command will be activated. By default, the `|alltext|' font
% set will be activated for character protrusion and additional kerning, the
% `|alltext-nott|' set for font expansion and interword spacing, and the
% `|smallcaps|' set for tracking.
%
%\medskip\noindent
% These commands may only be used in the preamble or in the main configuration
% file. Their scope is global to the document. Only one set per feature may be
% activated.
%
%
%\section{Micro fine tuning}\label{sec:fine-tuning}
%
% Every character asks for a particular protrusion, kerning or spacing amount.
% It may also be desirable to restrict the maximum expansion of certain
% characters. Furthermore, since every font looks different, settings have to
% be specific to a font or set of fonts. This package offers flexible and
% straight-forward methods of customising these finer aspects of
% micro-typography.
%
% All fine-tuning commands follow basically the same syntax: they all take
% three arguments; the first one is optional and may contain additional
% options; in the second argument, you specify the set of fonts to which the
% settings should apply; the third argument contains the actual settings.
% Here, as in all configuration commands, all spaces are ignored.
%
% The set of fonts to which the settings should apply is declared using the
% same syntax of \meta{font axis}\,|=|\,\meta{value list} pairs as for the
% command \cs{DeclareMicrotypeSet} (see section~\ref{sec:font-sets}), with the
% only difference that values including asterisks (which, as you may recall,
% stand for the respective default) will be translated immediately
% instead of at the end of the preamble.
% To find the matching settings for a given font the package will try all
% combinations of font encoding, family, series, shape and size,
% with decreasing significance in this order. For instance, if settings exist for
% both the current family (say, |T1/cmr///|) and for italic fonts in the
% normal weight (|T1//m/it/|), the settings for the |cmr| family would apply.
%\changes{v1.7}{2005/03/23}{remove table of match order
%                           (now table~\ref{tab:match-order} on page~\pageref{tab:match-order})}
% The encoding must always match.\looseness=-1 ^^A layout
%\iffalse
%^^A TODO: When using native TrueType\slash OpenType fonts (with \xetex\ or \luatex, and
%^^A the \pkg{fontspec} package), you may additionally restrict the settings to
%^^A certain |features|.
%\fi
%
% The characters may be specified either as a single letter (|A|),
% as a text symbol command (\cmd\textquoteleft), or as a slot number (resp.
% Unicode number for \luatex\ or \xetex): three or more  digits for decimal
% notation, prefixed with~|"| for hexadecimal, with~|'| for octal numerals (\eg, the
% `fl' ligature in <T1> encoding:~|029|, |"1D|, |'35|).
% \mbox{8-bit} (and even <UTF-8>) characters may be entered directly or in
% \LaTeX's traditional \mbox{7-bit} notation: both |\"A| and \expandafter|\"A|
% are valid, provided the character is actually declared in both the input and
% the font encoding.
% With \luatex\ or \xetex, you may additionally specify a (font-specific)
% glyph name, prefixed with `|/|' (\eg, the `fl' ligature as |/f_l|).
% Note that you also have the possibility to declare lists
% of characters that should inherit settings (see section~\ref{sub:inheritance}).
%
%\subsection[Character protrusion]
%           {Character protrusion \requires{\pdftex~0.14f,\luatex~0.30,\xetex~0.9997}}
%           \label{sub:protrusion}
%
%\Describe{Macro}{\SetProtrusion}{?options,set of fonts,protrusion settings}
% Using this command, you can set the protrusion factors for each character of a
% font or a set of fonts. A very incomplete example would be the following:
%\begin{verbatim}
%\SetProtrusion
%   { encoding = T1,
%     family   = cmr }
%   { A              = {50,50},
%     \textquoteleft = {700, } }
%\end{verbatim}
% which would result in the character `A' being protruded by 5\% of its width
% on both sides, and the left quote character by 70\% of its width into the
% left margin. This would apply to all font shapes, series and sizes of the
% <T1>~encoded Computer Modern Roman family.
%
%\paragraph{The protrusion settings}
% consist of \meta{character}\,|=|\,\meta{protrusion factors} pairs.
% The protrusion factors designate the amount that a character should be
% protruded into the left margin (first value) respectively into the right
% margin (second value). By default, the values are relative to the character
% widths, so that a value of 1000 means that the character should be shifted
% fully into the margin, while, for example, with a value of 50 it would be
% protruded by 5\% of its width. Negative values are admitted, as well as
% numbers larger than 1000 (but effectively not more than \EM{1} of the font).
% You may omit either number if the character should not be protruded on that
% side, but must not drop the separating comma.
%
%\paragraph{Options:}
%\begin{options}
%  \item[\key{name}] You may assign a name to the protrusion settings, so that you
%       are able to load it by another list.
%  \item[\key{load}] You can load another list (provided, you assigned
%       a name to it) before the current list will be loaded, so that the
%       fonts will inherit the values from the loaded list.
%      \par
%       In this way, the configuration may be simplified considerably. You can for
%       instance create a default list for a font; settings for other shapes
%       or series can then load these settings, and extend or overwrite them
%       (since the value that comes last will take precedence). Font settings
%       will be loaded recursively.
%       The following options will affect all loaded lists, in other words,
%       any options from the loaded lists will be ignored:
%\changes{v1.8}{2005/06/23}{add example for \texttt{factor} option}
%  \item[\key{factor}] This option can be used to influence all protrusion
%       factors of the list, overriding any global \opt{factor} setting (see
%       section~\ref{sub:options-protrusion}). For instance, if you want fonts
%       in larger sizes to be protruded less, you could load the normal lists,
%       just with a different factor applied to them:
%\begin{verbatim}
%\SetProtrusion
%   [ factor   = 700,
%     load     = cmr-T1 ]
%   { encoding = T1,
%     family   = cmr,
%     size     = large- }
%   { }
%\end{verbatim}
%  \item[\key{unit}] By default, the protrusion factors are relative to the
%       respective character's width. The |unit| option may be used to override
%       this and make \microtype\ regard all values in the list as thousandths
%       of the specified width. Issuing, for instance, `|unit=1em|' would have
%       the effect that a value of, say, 50 now results in the character being
%       protruded by 5\% of an em of the font (thus simulating the internal
%       measuring of \pdftex's \cmd\lpcode\ and \cmd\rpcode\ primitives).
%       The default behaviour can be restored with |unit=character|.\footnote{
%          The |unit| option can even be passed globally to the package (cf.
%          section~\ref{sub:options-protrusion}).
%          However, all provided settings are created under the assumption
%          that the values are relative to the character width. Therefore, you
%          should only change it if you are certain that the
%          default settings will not be used in your document.}
%  \item[\key{preset}] Presets the protrusion codes of all characters to the
%       specified values (|={|\meta{left}|,|\meta{right}|}|), possibly
%       scaled by a |factor|. A |unit| setting will only be taken into account
%       if it is not |=character|.
%  \item[\key{inputenc}] Selects an input encoding that should apply to this
%       list, regardless of what the document's input encoding is. You may
%       specify any encoding that can be loaded via the \pkg{inputenc} package,
%       \eg, |ansinew|, |koi8-r|, |utf8|.
%  \item[\key{context}] The scope of the list may be limited to a certain
%       context. For further details, see section~\ref{sec:context}.
%\end{options}
%
%
%\subsection[Font expansion]
%           {Font expansion \requires{\pdftex~0.14f,\luatex~0.30}}
%           \label{sub:expansion}
%
%\Describe{Macro}{\SetExpansion}{?options,set of fonts,expansion settings}
% By default, all characters of a font are allowed to be stretched or shrunk by
% the same amount. However, it is also possible to limit the expansion of
% certain characters if they are more sensitive to deformation. This is the
% purpose of the \cs{SetExpansion} command. Note that it will only have an
% effect if the package has been loaded with the \opt{selected} option (cf.
% section~\ref{sub:options-expansion}). Otherwise, the expansion settings will
% be ignored~-- unlike the options in the optional first argument, which will
% still be evaluated.
% If the \opt{selected} option has been set to true, and settings for a font
% don't exist, font expansion will not be applied to this font at all. Should
% the extraordinary situation arise that you want to employ selected expansion
% in general but for a particular font (set) all characters should be
% expanded or shrunk by the same amount, you would have to declare an empty
% list for these fonts.
%
%\paragraph{The expansion settings}
% consist of \meta{character}\,|=|\,\meta{expansion factor} pairs.
% You may specify one number for each character, which determines the amount
% that a character may be expanded. The numbers denominate thousandths of the
% full expansion.
% For example, if you set the expansion factor for the character `O' to 500,
% it will only be expanded or shrunk by one half of the amount that the rest
% of the characters will be expanded or shrunk.
% While the default value for character protrusion is~0~-- that is, if you
% didn't specify any characters, none would be protruded~-- the default value
% for expansion is 1000, which means that all characters would be expanded by
% the same amount.
%
%\paragraph{Options:}
%\begin{options}
%  \item[{\spaceskip=.75\fontdimen2\font\key{name}, \key{load}, \key{preset}, \key{inputenc}, \key{context}}]
%       \hspace{-1.5pt}Analogous to \cs{SetProtrusion}, the optional argument may be used to
%       assign a name to the list, to load another list, to preset all
%       expansion factors, to set the input encoding, or to determine the
%       context of the list (expansion contexts are only possible with \pdftex\
%       version 1.40.4 or newer).
%\changes{v1.8}{2005/04/12}{add example of how to get rid of a widow
%               (suggested by \contributor Adam Kucharczyk <adamk\at ijp-pan.krakow.pl>)}
%                                                          ^^A private mail, 2005/04/09
%  \item[\key{auto}, \key{stretch}, \key{shrink}, \key{step}]
%       These keys can be used to override the global settings from the package
%       options (see section~\ref{sub:options-expansion}). If you don't specify
%       either one of |stretch|, |shrink| and |step|, their respective global
%       value will be used (that is, no calculation will take place).
%
%       As a practical example, suppose you have a paragraph with a lone widow
%       that could be avoided by shrinking the font a bit more.
%       In conjunction with the |context| option (see section~\ref{sec:context}
%       for further details), you could thus allow for more expansion in this
%       particular paragraph:
%\begin{verbatim}[gobble=2]
% \SetExpansion
%    [ context = sloppy,
%      stretch = 30,
%      shrink  = 60,
%      step    =  5  ]
%    { encoding = {OT1,T1,TS1} }
%    { }
% % ... END PREAMBLE
% {\microtypecontext{expansion=sloppy}%
%  This paragraph contains a `fussy' widow.}
%\end{verbatim}
%       This method of employing contexts to temporarily apply different
%       expansion parameters only works with \pdftex\ version 1.40.4 or later,^^A
%         \footnote{For older versions, a dirty trick is laid out in
%                   the Implementation part, section~\ref{sub:font-setup}, page~\pageref{exp-hack}.}
%       or with \luatex.
%       Also note that both \pdftex\ and \luatex\ prohibit the use of fonts with different expansion
%       limits or steps (even of different fonts) within one paragraph, hence
%       the |sloppy| context would have to be applied to complete paragraphs.
%  \item[\key{factor}]
%       This option provides a different method to alter expansion settings for
%       certain fonts, working around the restriction just mentioned. The
%       |factor| option influences the expansion factors of all characters (in
%       contrast to the overall stretchability) of the font. For instance, if
%       you want the italic shape to be expanded less, you could declare:
%\begin{verbatim}
%\SetExpansion
%   [ factor   = 500 ]
%   { encoding = *,
%     shape    = it }
%   { }
%\end{verbatim}
%       The |factor| option can only be used to \emph{decrease} the
%       stretchability of the characters, that is, it may only receive values
%       smaller than 1000. Also, it can only be used for single fonts or font
%       sets; setting it globally in the package options wouldn't make much
%       sense -- to this end, you use the package's \opt{stretch} and
%       \opt{shrink} options.
%\end{options}
%
%
%\subsection[Tracking]
%           {Tracking \requires{\pdftex~1.40,\luatex~0.62,\xetex~0.9997}}
%           \label{sub:tracking}
%
%\Describe{Macro}{\SetTracking}{?options,set of fonts,tracking amount}
% An important typographic technique -- which was missing in \TeX\ for a long
% time -- is the adjustment of tracking, \ie, the uniform addition or
% subtraction of letter space to/from all the characters in a font. For
% example, it is good typographic practice to slightly space out text set in
% all capitals or small capitals (as in this document). Legibility may also be
% improved by minimally increasing the tracking of smaller and decreasing that
% of larger type.\footnote{
%     With full-featured fonts like Computer Modern, this is usually not
%     necessary, though, since they come in optical sizes, and the tracking of
%     the small-capitals font is already adjusted.}
% The \cs{SetTracking} command allows specifying the tracking amount for
% different fonts or font sets. It will also be evaluated by the \cs{textls}
% command, which may be used for letterspacing shorter pieces of text (see
% section~\ref{sec:lettersp}).
%
%\paragraph{The tracking amount}
% is specified in thousandths of \EM{1} (or the given unit); negative values are
% allowed, too.
%
%\paragraph{Options:}
%\begin{options}
%  \item[\key{name}, \key{unit}, \key{context}]
%       These options serve the same functions as in the previous configuration
%       commands. The unit may be any dimension, default is \EM{1}.
%  \item[\key{spacing}]
%       When the inter-\emph{letter} spacing is altered, the inter-\emph{word}
%       spacing probably also needs to be adjusted. This option expects three
%       numbers for interword space, stretch and shrink respectively, which are
%       given in thousandths of \EM{1} (or of the current \texttt{unit}). If a
%       value is followed by an asterisk, it denotes thousandths of the
%       respective font dimension which will be added to it. For instance, with
%\begin{verbatim}
%\SetTracking[ spacing = {25*,166, } ]{ encoding = *, shape = sc }{ 25 }
%\end{verbatim}
%       the interword space will be increased by 2.5\%, the stretch amount will
%       be set to \EM{0.166}, while the shrink amount will be left untouched. If
%       you don't specify the \texttt{spacing} option, the interword space will
%       be scaled by the current letterspace amount (as in the above example),
%       while stretch and shrink will not be changed.
%  \item[\key{outer spacing}]
%       If an interword space immediately precedes or follows letterspaced text,
%       it will by default be equal to that within the text. With this option,
%       which accepts the same values as \texttt{spacing}, it may be adjusted
%       independently.
%  \item[\key{outer kerning}]
%       If, on the other hand, no interword space precedes or follows, you may
%       still want to slightly set off the first and last letter from adjoining
%       letters. This option expects the kerning amounts for left and right hand
%       side, separated by a comma, in thousandths of \EM{1} (or the current
%       \texttt{unit}). If a value is followed by an asterisk, it denotes
%       thousandths of the current letterspacing amount. A single asterisk means
%       `|500*|'; this is also the default, \ie, the sum of the outer kerns is
%       by default equal to the current letterspace amount. To remove kerning on
%       both sides, you would write `|outer kerning={0,0}|'.
%  \item[\key{no ligatures}]
%       In the absence of this option, ligatures in letterspaced fonts would
%       be constructed as usual, which may be advisable when changing the
%       tracking by only a small amount. For larger letterspacing amounts, on
%       the other hand, the normal letter space within ligatures would have
%       displeasing \textls[150]{e\lslig{ff}ects}.
%       This key expects a comma-separated list of characters for which
%       ligatures should be disabled; only the character that begins a ligature
%       must be specified.
%       If the key is given without a value (or with the value `|all|'),
%       \emph{all} ligatures of the font will be disabled.
%       (With \pdftex, this is not recommended, however,
%       since it entails that kerning will be switched off, too. With \luatex,
%       there is no such limitation.)
%       Given the value `|none|', none of the ligatures will be disabled,
%       or, put positively, all of the font's ligatures will stay intact.
%       The default settings (in \file{microtype.cfg}) disable ligatures
%       for the character `|f|' only, \ie, `ff', `fi', ffi', etc.
%     ^^A\footnote{
%     ^^A    With \pdftex\ versions older than 1.40.4, \emph{all} ligatures, and
%     ^^A    hence all kerning, will be disabled. It is therefore recommended to
%     ^^A    use at least version 1.40.4.}
%       In exceptional situations, you can manually break up a ligature by
%       inserting `|{\kern0pt}|' resp. \pkg{babel}'s \verb="|=
%       shortcut, or protect it by enclosing it in \cs{lslig} (see
%       section~\ref{sec:lettersp}).
%       \xetex\ does not allow disabling ligatures selectively, or generally,
%       for that matter.
%  \item[\key{features}] What it does allow, though, is enabling or disabling
%       OpenType font features pertaining to ligatures. With \xetex\ or \luatex,
%       the |features| key accepts any number of \pkg{fontspec} options for the
%       `Ligatures' font feature, \eg, |NoCommon|, |Rare|, |RequiredOff| or
%       |ResetAll| (see the \cite{fontspec} documentation for details).
%       With \luatex, the |features| and the |no ligatures| keys
%       may even be combined, where the latter will take precedence.
%\end{options}
%
%\ifx\lssample\undefined
% \fallbacktext{The original documentation\footnote{
%     \ctanurl{macros/latex/contrib/microtype/microtype.pdf}.}
%   includes an image illustrating all of these options.}
%\medskip\noindent
% As an
%\else
%\changes{v2.3}{2007/11/03}{add letterspacing illustration}
%\noindent
% Since a picture is worth a thousand words, probably even more if, in our
% case, it depicts a couple of letterspaced words, let's bring one to sum up
% these somewhat confusing options. Suppose you had the following settings
% (which are in no way recommended; they only serve illustrative purposes):
%\begin{verbatim}
%\SetTracking
%  [ no ligatures  = {"\anchorarrow{nolig}"f},
%    spacing       = {60"\anchorarrow{ispace}"0*,-1"\anchorarrow{istretch}"00*, "\anchorarrow{ishrink}"},
%    outer spacing = {4"\anchorarrow{ospace}"50,2"\anchorarrow{ostretch}"50,1"\anchorarrow{oshrink}"50},
%    outer kerning = {"\anchorarrow{okernbegin}"*,"\anchorarrow{okernend}"*} ]
%  { encoding = * }
%  { 1"\anchorarrow{lsamount}"60 }
%\end{verbatim}
% and then write:
%\begin{verbatim}
%Stop \textls{stealing sheep}!
%\end{verbatim}
% this would be the (typographically dubious) outcome:
%
% \lssample
%
%\enlargethispage{\baselineskip}^^A layout
%\noindent
% While the word `Stop' is not letterspaced, the space between the letters in
% the other two words is expanded by the \showarrow[tracking]{tracking~amount}{red}
% of \EM{160/1000}\,=\allowbreak\,\EM{0.16}.
% The \showarrow[ispace]{inner~space}{green} within the letterspaced text is
% increased by 60\%, while its \showarrow[istretch]{stretch}{green} amount is
% decreased by 10\% and the \showarrow[ishrink]{shrink}{green} amount is left
% untouched.
% The \showarrow[ospace]{outer~space}{green} (of \EM{0.45}) immediately before the
% piece of text may \showarrow[ostretch]{stretch}{green} by \EM{0.25} and
% \showarrow[oshrink]{shrink}{green} by \EM{0.15}.
% Note that there is no outer space after the text, since the exclamation mark
% immediately follows; instead, the default \showarrow[okern]{outer~kern}{red}
% of half the letterspace amount (\EM{0.08}) is added.
% Furthermore, one \showarrow{ligature}{grey} wasn't broken up, because we
% neglected to specify the `|s|' in the |no ligatures| key.
%
%\medskip\noindent
% As another, more realistic
%\fi
%                            example, suppose you want to space out all small
% capitals by \EM{50/1000}, fonts smaller than \cmd\small\ by \EM{0.02}, and to
% decrease the tracking of large type by \EM{0.02}. This could be achieved with
% the following settings:
%^^A there's a \nobreakspace ahead!
%\begin{verbatim}
%\usepackage[tracking=true]{microtype}
%\DeclareMicrotypeSet*[tracking]{my}
%   { encoding = *,
%     size     = {-small,Large-},
%     font     = */*/*/sc/* }
%\SetTracking[ no ligatures = f ]{ encoding = *, shape = sc}{ 50 }
%\SetTracking{ encoding = *, size = -small }{  20 }
%\SetTracking{ encoding = *, size = Large- }{ -20 }
%\end{verbatim}
%
%\medskip\noindent
% Letterspaced fonts for which settings don't exist will be spaced out by the
% default of \EM{\fpeval{\MT@letterspace@default/1000}}
% (adjustable with the package option \opt{letterspace}, see
% section~\ref{sub:options-tracking}). Suppose your editor wants you to shorten
% your 1000-pages chef-d'\oe uvre by a handful of pages, you could load
% \microtype\ with (fingers crossed):
%\begin{verbatim}
%\usepackage[tracking=alltext,letterspace=-40]{microtype}
%\end{verbatim}
%
%
%\subsection[Additional kerning]
%           {Additional kerning \requires{\pdftex~1.40}}
%           \label{sub:kerning}
%\todo{Rename to \cs{SetSidebearing}}
%\Describe{Macro}{\SetExtraKerning}{?options,set of fonts,kerning settings}
% With this command, you can fine tune the extra kerning. In contrast to
% standard kerning, which is always associated with a \emph{pair} of
% characters, and to tracking, which specifies the space between \emph{all}
% characters of a font, the extra kerning relates to single characters, that
% is, whenever a particular character appears in the text, the specified
% kerning will be inserted, regardless of which character precedes resp.
% follows it.
% (Put differently, this feature allows modifying the left or right
% \textit{sidebearings} of specific glyphs.)
%
%\emptypdfpageresources ^^A layers of letterspacing illustration
%
% It should not be neglected to mention a limitation of this feature:
% words \emph{immediately following} such a kern (not separated by a space)
% will not be hyphenated, unless you insert the breakpoints manually, \eg, for
% kerning after the apostrophe, `|l'apos\-trophe|'.
%\changes{v2.7}{2016/10/16}{mention that additional kerning does not work in math mode
%                            (discovered by `\contributor Daniel <@\at @>')}
%                           ^^A https://tex.stackexchange.com/questions/332695/microtype-kerning-in-math-mode-with-mathdesign-charter
% Furthermore, additional kerning will not be applied in math mode.
% These restrictions of \pdftex\ will hopefully be lifted some time.
%
%\paragraph{The kerning settings}
% are specified as pairs of \meta{character}\,|=|\,\meta{kerning values}, where
% the latter consist of two values: the kerning added before the character, and
% the kerning appended after the respective character. Once again, either value
% may be omitted, but not the separating comma.
%
%\paragraph{Options:}
%\begin{options}
%  \item[\key{name}, \key{load}, \key{factor}, \key{preset}, \key{inputenc}]
%       These options serve the same function as in the previous configuration
%       commands.
%  \item[\key{unit}] Admissible values are: |space|, |character| and a
%       \meta{dimension}. By default, the values denote thousandths of \EM{1}.
%  \item[\key{context}] When it comes to kerning settings, this option is
%       especially useful, since it allows applying settings depending on the
%       current language.
%      \par
%       For example, you can find the following settings, intended to be used
%       for documents written in French, in the main configuration file:
%\begin{verbatim}[deletekeywords={[1]{unit}}]
%\SetExtraKerning
%   [ name     = french-default,
%     context  = french,
%     unit     = space   ]
%   { encoding = {OT1,T1,LY1} }
%   {
%     :  = {1000,}, % = \fontdimen2
%     ;  = {500, }, % ~ \thinspace
%     !  = {500, },
%     ?  = {500, }
%   }
%\end{verbatim}
%\changes{v2.3}{2007/11/20}{add kerning sample}
%\ifluatex
% \fallbacktext{Since this document was compiled with |luatex| instead of
%   |pdftex|, it does not\\include the sample that the original documentation
%   features.}
%\else
%      \begin{microtypecontext}{kerning=french}
%       What is the result of these settings? If they are active, like in the
%       current paragraph, a thin space will be inserted in front of each
%       question mark, exclamation mark and semicolon; a normal space in front
%       of the colon. Read section~\ref{sec:context} to learn how to activate
%       these settings! This paragraph was input like this:
%      \end{microtypecontext}
%\begin{verbatim}[deletekeywords={[1]{context,activate}}]
%\begin{microtypecontext}{kerning=french}
% What is the result of these settings? If they are active, like in the
% current paragraph, a thin space will be inserted in front of each
% question mark, exclamation mark and semicolon; a normal space in front
% of the colon. Read section~\ref{sec:context} to learn how to activate
% these settings! This paragraph was input like this:
%\end{microtypecontext}
%\end{verbatim}
%\fi
%\end{options}
%
%
%\subsection[Interword spacing]
%           {Interword spacing \requires{\pdftex~1.40}}
%           \label{sub:spacing}
%
%\Describe{Macro}{\SetExtraSpacing}{?options,set of fonts,spacing settings}
% This command allows you to fine tune the interword spacing (also known as
% glue). A preliminary remark on what a `space' is may be in order: between two
% words, \TeX\ will insert a so called glue, which is characterised by three
% parameters -- the normal distance between two words, the maximum amount of
% space that may be added to it, and the maximum amount that may be subtracted.
% The latter two parameters come into effect whenever \TeX\ tries to break a
% paragraph into lines and does not succeed; it can then stretch or shrink the
% spaces between words. These three parameters are specific to each font.
%
% On top of these glue dimensions, \TeX\ has the concept of `space factors'.
% They may be used to increase the space after certain characters, most
% prominently the punctuation characters. \pdftex's additional spacing
% adjustment may be considered as an extension to space factors with much
% finer control: while space factors will influence all three parameters of
% interword space (or glue) by the same amount~-- the kerning, the maximum
% amount that the space may be stretched and the maximum amount that it may be
% shrunk~-- you may modify these parameters independently from one another.
% Furthermore, the values may be set differently for each font. And, probably
% most importantly, the parameters may not only be increased but also decreased.
% Note that when interword spacing adjustment is in effect, space factors are
% ignored.
%
%\paragraph{The spacing settings}
% are declared as pairs of \meta{character}\,|=|\,\meta{spacing factors}, where
% the latter consist of three numbers: first, the additional kern inserted
% after this character if it appears before an interword space, second, the
% additional stretch amount, and third, the additional shrink amount. All
% values may also be negative, in which case the dimensions will be decreased.
% Not all values have to be specified, but the settings must always contain the
% two separating commas.
%
%\paragraph{Options:}
%\begin{options}
%  \item[{\spaceskip=.85\fontdimen2\font\key{name}, \key{load}, \key{factor}, \key{preset}, \key{inputenc}, \key{context}}]
%       \hspace{-0.5pt}These options serve the same function as in the previous configuration
%       commands.
%  \item[\key{unit}] You can specify the unit by which the specified numbers are
%       measured. Possible values are: |character|, a \meta{dimension} and,
%       additionally, |space|. The latter will measure the values in thousandths
%       of the respective space dimension set by the font. By default, the unit
%       is measured by the space dimensions. For example, with the following
%       (nonsensical) settings:
%\begin{verbatim}
%\SetExtraSpacing
%   [ unit = space  ] % default
%   { font = */*/*/*/* }
%   {
%       .  = {1000,1000,1000},
%   }
%\end{verbatim}
%       the space inserted after a full stop would be doubled (technically
%       speaking: 2\,\texttimes\ \fontdim2), as would the maximum stretch and
%       shrink amounts of the interword space (\fontdim3 and~4). Conversely,
%       setting all three values to \textminus1000 would completely cancel a
%       space after the respective character.
%\end{options}
%
%
%\subsection{Character inheritance}\label{sub:inheritance}
%
% \Describe{Macro}{\DeclareCharacterInheritance}
%                 {?features,set of fonts,inheritance lists}
% In most cases, accented characters should inherit the settings from the
% respective base character. For example, all of the characters \`A, \'A, \^A,
% \~A, \"A, \r{A} and \u{A} should probably be protruded by the same (absolute)
% amount as the character A. Using the command \cs{DeclareCharacterInheritance},
% you may declare such classes of characters, so that you then only have to set
% up the respective base character. With the optional argument, which may
% contain a comma-separated list of features, you can confine the scope of the
% list. Additionally, it accepts the \key{inputenc} key to set the input encoding
% for this list. The font set can be declared in the usual way. The inheritance
% lists are declared as pairs of \meta{base character}\,|=|\,\meta{list of
% inheriting characters}.
%
% With \pdftex, there should be no need to change the default
% character inheritance settings, unless you are using a different encoding or
% a very peculiarly shaped font.
% The situation is different with \luatex\ and \xetex, however: the default
% inheritance settings only contain those glyhps that can safely be assumed to
% exist in any font; but since OpenType fonts may contain many more glyphs for
% different scripts (languages), it is quite probable that font-specific
% settings are necessary, which should be specified in the font's configuration
% file (see next section).
%
%\medskip\noindent
% Additionally, this command provides the possibility to have the desired
% protrusion amount calculated automatically based on the difference of character widths.
% If the base character is preceded with either `|(l)|', `|(r)|' or `|(lr)|',
% the characters in the list will not only inherit the protrusion of the base character,
% but will be additionally protruded by the result of
% |charwidth(|\meta{inheriting character}|)|$-$|charwidth|\allowbreak|(|\meta{base character}|)|:
% for `|(l)|' and `|(r)|', this amount will be added to the given protrusion on
% the respective side, for `|(lr)|' half of the amount will be added to both sides.
% So that, \eg, with
%\begin{verbatim}
%\DeclareCharacterInheritance
%  { encoding = TU, family = {GFS Porson} }
%  {  (l)"\rlap{\sffamily H}"  = {"\fontencoding{LGR}\sffamily\~>\textEta"},
%    (lr)I = {T}  }
%\end{verbatim}
% the accent before the `H' would be fully protruded into the left margin,
% while the stem of the `T' would be aligned with that of the `I' if at either margin.
% This feature is especially useful for Greek typography, where capital letters
% at the beginning of a line should be placed as if they had no accent (the `H' in
% the example above).
% Base characters may have both unprefixed and prefixed inheritance lists;
% characters in the latter will be implicitly added to the corresponding unprefixed one.
% Inheriting characters may appear in both `|(l)|' and `|(r)|'-prefixed lists at the
% same time, whereas lists prefixed with `|(l)|' or `|(r)|' and those prefixed with
% `|(lr)|' are mutually exclusive.
% For all other features except protrusion, these prefixed lists will be ignored.
%
%
%\subsection{Configuration files}\label{sub:config-file}
%
% The default configuration, consisting of inheritance settings, declarations
% of font sets and alias fonts, and generic protrusion, expansion, spacing and
% kerning settings, will be loaded from the file \file{microtype.cfg}. You may
% extend this file with custom settings (or load a different configuration file
% with the `\opt{config}' option, see section~\ref{sub:options-misc}).
%
% If you embark on creating new settings for a font family, you should
% put them into a dedicated file, whose name must be: `|mt-|\meta{font
% family}|.cfg|' (\eg, `\file{mt-cmr.cfg}'; any spaces in the font name should
% be removed, \eg, `\file{mt-MinionPro.cfg}'), and may contain all commands
% described in the current section~\ref{sec:fine-tuning}. These files will be
% loaded automatically if you are actually using the respective fonts.
% The \microtype\ package ships with configuration files for a number of font families.
% They are listed in tables~\ref{tab:type1-fonts} (Type\,1 fonts) and
% \ref{tab:ot-fonts} (OpenType fonts).
%
%\begin{table}[t]\small
%\changes{v1.6a}{2005/02/02}{add table of fonts with tailored protrusion settings}
%\caption[Type\,1 fonts with  tailored protrusion settings]
%        {Type\,1 fonts with\\tailored protrusion settings}\label{tab:type1-fonts}
%\setlength\fboxsep{4pt}
%\leavevmode\kern-\dimexpr\fboxsep+\fboxrule\relax
%\fcolorbox{theframe}{white}{^^A
%\begin{minipage}{\textwidth}
%\def\arraystretch{1.2}
%\long\def\@makefntext#1{%
%  \raggedright
%  \leftskip 1.2em
%  \parindent -1.2em
%  \everypar{\parindent -1.2em}%
%  \leavevmode\hbox to 1.2em{\sffamily\@thefnmark\hss}#1}
%\let\footnoterule\relax
%\def\thempfootnote{{\itshape\ifnum\c@mpfootnote=10 \global\advance\c@mpfootnote 1 \fi\@alph\c@mpfootnote}}
%\def\fnref#1{\raisebox{0.3ex}{\sffamily\itshape\footnotesize\,\ifpdf\ref*{#1}\else\ref{#1}\fi}}
%\begin{tabularx}{\textwidth}{@{\extracolsep{\fill}}>{\leftprotrusion}Xll@{}}
%       \footnotesize Font family (<NFSS> code)
%      & \multicolumn{2}{l}{\footnotesize Features}\\
%\cmidrule(r){2-3}
%      & \footnotesize Encodings
%      & \footnotesize Shapes\\
%\cmidrule(r){1-1}\cmidrule(r){2-2}\cmidrule(r){3-3}
% Generic
%      & <OT1>, <T1>, <T2A>, <LY1>, <QX>, (<TS1>)\fnref{fn:t1-incmpl}
%      & n, (it, sl, sc)\fnref{fn:t1-incmpl} \\
% Computer Modern Roman (|cmr|)\footnote{Aliases: Latin Modern Roman (|lmr|),
%                                        \pkg{ae} (|aer|), \pkg{zefonts} (|zer|),
%                                        \pkg{eco} (|cmor|), \pkg{hfoldsty} (|hfor|), \pkg{mlmodern}~(|mlmr|)}
%      & <OT1>, <OT4>, <T1>, <T2A>, <T5>, <LY1>, <TS1>
%      & n, it, sl, sc \\
% Bitstream Charter (|bch|)\footnote{Aliases: \pkg{mathdesign}/Charter (|mdbch|),
%                                    MicroPress's \pkg{chmath} (|chr|), \pkg{XCharter}}
%      & <OT1>, <T1>, <T5>, <LY1>, <TS1>
%      & n, it, (sl)\fnref{fn:t1-itsl}, sc \\
% <EB> Garamond\footnote{Alias: Adobe Garamond (|pad|, |padx|, |padj|)}
%      & <OT1>, <T1>, <LY1>, <LGR>, <TS1>
%      & n, it, sc, si \\
% <URW> Garamond (|ugm|)\footnote{Aliases: \pkg{mathdesign}/<URW> Garamond (|mdugm|), \pkg{garamondx} (|zgmx|, |zgmj|)}
%      & <OT1>, <T1>, <TS1>
%      & n, it\\
% Bitstream Letter Gothic (|blg|)\footnote{Alias: \pkg{ulgothic} (|ulg|)}
%      & <OT1>, <T1>, <TS1>
%      & n, it \\
% Adobe Minion (|pmnx|, |pmnj|)
%      & <OT1>, <T1>, <T2A>, <LY1>, <TS1>
%      & n, it, (sl)\fnref{fn:t1-itsl}, sc, si\\
% Palatino (|ppl|, |pplx|, |pplj|)\footnote{Aliases: \pkg{pxfonts} (|pxr|),
%                                           \pkg{qfonts}/QuasiPalatino, \TeX\ Gyre Pagella (|qpl|),
%                                           \pkg{newpx}, <FPL> Neu (|fp9x|, |fp9j|), \pkg{domitian}}
%      & <OT1>, <OT4>, <T1>, <LY1>, (<TS1>)\fnref{fn:t1-incmpl}
%      & n, it, (sl)\fnref{fn:t1-itsl}, sc \\
% Times (|ptm|, |ptmx|, |ptmj|)\footnote{Aliases: \pkg{txfonts} (|txr|),
%                                        \pkg{qfonts}/QuasiTimes, \TeX\ Gyre Termes (|qtm|),
%                                        \pkg{newtx}, \pkg{tempora}, \pkg{step}, \pkg{stix}/\pkg{stix2}/\pkg{stickstoo}}
%      & <OT1>, <OT4>, <T1>, <LY1>, <QX>, (<TS1>)\fnref{fn:t1-incmpl}
%      & n, it, (sl)\fnref{fn:t1-itsl}, sc \\
% Computer Modern math (|cmsy|, |cmm|)\footnote{Aliases: Latin Modern (|lmsy|, |lmm|), \pkg{mlmodern} (|mlmsy|, |mlmm|)}
%      & <OML>/<OMS>
%      & n/it \\
% <AMS> symbols (|msa|, |msb|)
%      & <U>
%      & n\\
% Euler (|eur|, |eus|, |euf|)\footnote{Alias: \pkg{eulervm} (|zeur|, |zeus|)}
%      & <U>
%      & n\\
% Euro symbols (Adobe, <ITC>, \pkg{marvosym})
%      & <U>/<OT1>
%      & n, it\phantom{^^A
%               \footnote{Incomplete\label{fn:t1-incmpl}}
%               \footnote{Settings inherited from italic shape\label{fn:t1-itsl}}} \\
%\bottomrule
%\end{tabularx}^^A
%\end{minipage}^^A
%}\kern-\dimexpr\fboxsep+\fboxrule\relax ^^A end \fcolorbox
%\end{table}
%
%\begin{table}[t]\small
%\changes{v3.0}{2021/06/16}{split up table of fonts with tailored protrusion settings}
%\caption{OpenType fonts with tailored protrusion settings}\label{tab:ot-fonts}
%\setlength\fboxsep{4pt}
%\leavevmode\kern-\dimexpr\fboxsep+\fboxrule\relax
%\fcolorbox{theframe}{white}{^^A
%\begin{minipage}{\textwidth}
%\def\arraystretch{1.2}
%\long\def\@makefntext#1{%
%  \raggedright
%  \leftskip 1.2em
%  \parindent -1.2em
%  \everypar{\parindent -1.2em}%
%  \leavevmode\hbox to 1.2em{\sffamily\@thefnmark\hss}#1}
%\let\footnoterule\relax
%\def\fnref#1{\raisebox{0.3ex}{\sffamily\itshape\footnotesize\,\ifpdf\ref*{#1}\else\ref{#1}\fi}}
%\begin{tabularx}{\textwidth}{@{\extracolsep{\fill}}>{\leftprotrusion}Xll@{}}
%       \footnotesize Font family
%      & \multicolumn{2}{l}{\footnotesize Features}\\
%\cmidrule(r){2-3}
%      & \rlap{\footnotesize Scripts}\hphantom{<OT1>, <OT4>, <T1>, <T2A>, <T5>, <LY1>, <TS1>}
%      & \rlap{\footnotesize Shapes}\hphantom{n, it, (sl)\fnref{fn:t1-itsl}, sc, si}\\
%\cmidrule(r){1-1}\cmidrule(r){2-2}\cmidrule(r){3-3}
% Generic
%      & Latin
%      & n, (it, sl, sc)\fnref{fn:ot-incmpl} \\
% Latin Modern Roman
%      & Latin
%      & n, it, (sl)\fnref{fn:ot-itsl}\\
% New Computer Modern\footnote{Alias: <CMU> Serif}
%      & Latin, Greek
%      & n, it, (sl)\fnref{fn:ot-itsl}\\
% Charis <SIL>
%      & Latin, Cyrillic
%      & n, it, sc\\
% <EB> Garamond
%      & Latin, Cyrillic, Greek
%      & n, it, sc, si\\
% Palatino\footnote{Aliases: Palatino Linotype, Palatino <LT> Std, \TeX\ Gyre Pagella, Domitian}
%      & Latin
%      & n, it, sc\phantom{^^A
%               \footnote{Incomplete\label{fn:ot-incmpl}}
%               \footnote{Settings inherited from italic shape\label{fn:ot-itsl}}} \\
%\bottomrule
%\end{tabularx}^^A
%\end{minipage}^^A
%}\kern-\dimexpr\fboxsep+\fboxrule\relax ^^A end \fcolorbox
%\end{table}
%
%\medskip
%\Describe{Macro}{\DeclareMicrotypeVariants}{list of suffixes}
%\DescribeMacro{\DeclareMicrotypeVariants*}
% On its search for a configuration file, the package will also try to remove
% from the font name a suffix of one or more letters that denotes a `variant'
% of the base font (cf. Karl Berry's \cite{fontname}). It is thus possible to
% put settings for, \eg, the fonts |pplx|~(expert set), |pplj| (oldstyle
% numerals) and |ppl| (plain) into one and the same file \file{mt-ppl.cfg}.
% This command expects a comma-separated list of variant suffixes. The starred
% version appends the suffix(es) to the existing list. The default declaration
% in \file{microtype.cfg} is:
%\begin{verbatim}
%\DeclareMicrotypeVariants{x,j,w,a,d,0,1,-LF,-TLF,-OsF,-TOsF}
%\end{verbatim}
%
%\medskip
%\Describe{Macro}{\DeclareMicrotypeAlias}{font name,alias font}
% This command may be used for fonts that are very similar, or actually the
% same (for instance if you did not stick to the Berry naming scheme when
% installing a font). An example would be the Latin Modern fonts, which are
% derived from Computer Modern, so that it is not necessary to create new
% settings for them -- you could say:
%\begin{verbatim}
%\DeclareMicrotypeAlias{lmr}{cmr}
%\end{verbatim}
% which would make the package, whenever it encounters the font |lmr| and does
% not find settings for it, also try the font name |cmr|. In fact, you will find
% this very line, along with some others, in the default configuration file.
%
%\medskip
%\Describe{Macro}{\LoadMicrotypeFile}{font name}
% In rare cases, it might be necessary to load a font configuration file
% manually, for instance, from within another configuration file, or to be able
% to extend settings defined in a file that would otherwise not be loaded
% automatically, or would be loaded too late.\footnote{
%    Font package authors might also want to have a look at the hook
%    \cs{Microtype@Hook}, described in the Implementation part,
%     section~\ref{sub:hook}.}
% This command will load the file `|mt-|\meta{font name}|.cfg|'.
%
%\medskip
%\Describe{Macro}{\DeclareMicrotypeFilePrefix}{prefix}
% Or, in fact, it will load the file `\meta{prefix}|-|\meta{font name}|.cfg|'.
% The \meta{prefix} may be changed, which, however, you should only do
% if you have your own set of configuration files that you want to be
% loaded \emph{instead of} any of those provided with the package.
%
%\section[Context-sensitive setup]
%        {Context-sensitive setup\requires{\pdftex~1.40,\luatex~0.30}}
% \label{sec:context}
%
% The \microtype\ package also allows applying different micro-typographic
% settings to the fonts depending on the context in which they occur. This
% opens up the space for infinite possibilities of tweaking the document's
% appearance.
%  ^^A\footnote{
%  ^^A With \luatex, you have to load the fonts with the \cite{fontspec} option
%  ^^A `|Renderer=Basic|'.}  ^^A Otherwise, OpenType feature will be ignored (+smcp being one of them)
%
%\medskip
%\Describe{Macro}{\microtypecontext}{context assignments}
% This command may be used anywhere in the document (also in the preamble) to
% change the micro-typographic context in the current group. To each feature
% (\key{protrusion}, \key{expansion}, (or \key{activate} as a shortcut for both),
% \key{tracking}, \key{spacing} and \key{kerning}), one context may be assigned.
% Consequently, only settings with the corresponding `|context|' keyword will be applied.
%
%\medskip
%\Describe{Env}{microtypecontext}{context assignments}
% Like many \LaTeX\ commands, it is also available in the form of an environment.
%
%\medskip
%\Describe{Macro}{\textmicrotypecontext}{context assignments,general text}
% As another possibility, the command \cs{textmicrotypecontext} sets the
% context(s) for the text given in the second argument.
%
%\changes{v1.9c}{2006/01/25}{add example of how to increase protrusion of footnote markers
%                (suggested by \contributor Georg Verweyen <verweyen\at gmail.com>)}
%                                                     ^^A private mail, 2006/01/25
%\medskip\noindent
% Suppose you want the footnote markers in the text to be protruded by a larger
% amount. You could define settings for the numbers:
%\begin{verbatim}
%\SetProtrusion
%   [ context = footnote ]
%   { font    = */*/*/*/scriptsize } % adapt if necessary
%   { 1 = { ,650}, 2 = { ,400}, 3 = { ,400}, 4 = { ,400}, 5 = { ,400},
%     6 = { ,400}, 7 = { ,500}, 8 = { ,400}, 9 = { ,400}, 0 = { ,400} }
%\end{verbatim}
% and have the context changed in the footnote marker command. This command
% differs among the various classes; for the base classes, \eg, \cls{article},
% it would be:
%\begin{verbatim}
%\newcommand*\new@makefnmark{\hbox{\@textsuperscript{\normalfont
%   \microtypecontext{protrusion=footnote}\@thefnmark}}}
%\renewcommand*\@footnotemark{%
%   \leavevmode \ifhmode\edef\@x@sf{\the\spacefactor}\nobreak\fi
%   \new@makefnmark \ifhmode\spacefactor\@x@sf\fi \relax}
%\end{verbatim}
% For the \cls{memoir} class, you would additionally have to disable
% auto-detection of multiple footnotes, which prevents protrusion:
%\begin{verbatim}
%\renewcommand*\@makefnmark{\hbox{\@textsuperscript{\normalfont
%   \microtypecontext{protrusion=footnote}\@thefnmark}}}
%\let\m@mmf@prepare\relax
%\let\m@mmf@check\relax
%\end{verbatim}
% ^^A For other classes, the command would have to be changed in a similar way.
%
%\medskip\noindent
% Another possibility would be to employ contexts for a language-dependent
% setup. For instance, if you are writing a text in French, you could add:
%\begin{verbatim}
%\microtypecontext{kerning=french}
%\end{verbatim}
% to the preamble. This would have the effect that kerning settings for the
% French context would be applied to the document. Should parts of the document
% be in English, you could write:
%\begin{verbatim}
%\textmicrotypecontext{kerning=}{English text!}
%\end{verbatim}
% to reset the context, so that the punctuation characters in these parts will
% not receive any extra kerning.
%
% Instead of adding these commands manually to your document, you may also load
% \microtype\ with the \opt{babel} option (see section~\ref{sub:options-misc}).
% The current language will then be automatically detected and the contexts set
% accordingly.
%
%\medskip
%\Describe{Macro}{\DeclareMicrotypeBabelHook}
%                {list of \pkg{babel}/\pkg{polyglossia} languages,context list}
% Naturally, \microtype\ does not know about the typographic specialties of
% every language. This command is a means of teaching it how to adjust the
% context when a particular language is selected. The main configuration file
% contains among others the following declaration:
%\begin{verbatim}
%\DeclareMicrotypeBabelHook
%   {french,francais,acadian,canadien}
%   {kerning=french, spacing=}
%\end{verbatim}
% Consequently, whenever you switch to the French language, the kerning context
% will be changed to `|french|' and the spacing context will be reset. This
% hook only has an effect if the package was loaded with the \opt{babel} option.
% Currently, \microtype\ supports French and Turkish kerning and English
% spacing (aka. \cmd\nonfrenchspacing). For unknown languages, all contexts
% will be reset.
%
%
%\section[Letterspacing revisited]
%        {Letterspacing revisited \requires{\pdftex~1.40,\luatex~0.62,\xetex~0.9997}}
%        \label{sec:lettersp} ^^A [also referenced in microtype.ins]
%
%\Describe{Macro}{\textls}{?amount,general text}
% While the \opt{tracking} feature, described in section~\ref{sub:tracking},
% will apply to sets of fonts, you may also want to letterspace shorter pieces
% of text, regardless of the font in which they are typeset.\footnote{
%   Letterspacing should be used cautiously; in particular, letterspacing
%   lowercase text is held in abhorrence by honourable typographers. Unless
%   you know what you are doing, you should probably only letterspace
%   capitals or small capitals. Another just cause may be emphasis in texts
%   typeset in Fraktur fonts.}
% For such ad-hoc letterspacing, \microtype\ introduces two commands that can
% be used (independently of whether the |tracking| option is enabled) in the
% same way as \LaTeX's text commands: \cs{textls} -- which also works in math
% mode -- expects the text in the mandatory argument, while
%\DescribeMacro{\lsstyle}
% \cs{lsstyle} will switch on letterspacing for all subsequent fonts until the
% end of the current group.
%\DescribeMacro{\textls*}
% The starred version of \cs{textls} does not add any
% extra kerning before or after the text, which may be useful, \eg, for section
% titles. By default, each character will be spaced out by
% \EM{\MT@letterspace@default/1000}\,=\,\EM{\fpeval{\MT@letterspace@default/1000}};
% this amount may be altered in the optional
% argument to \cs{textls}, using the \cs{SetTracking} command, or globally with
% the \opt{letterspace} package option, with decreasing significance in this
% order.
%
%\medskip
%\Describe{Macro}{\lslig}{ligature}
% Since the commands \cs{textls} and \cs{lsstyle} will also evaluate the
% `\texttt{no ligatures}' key for the respective font (as well as all other
% options mentioned in section~\ref{sub:tracking}), you usually need not worry
% about protecting or breaking ligatures with most fonts. However, in certain
% situations, there may be a conflict of ligatures beginning with the same
% letter, where some of them should be inhibited, while others should not. For
% example, when letterspacing text typeset in Fraktur fonts, the ligatures `ch',
% `ck', `tz' and `sz'~(`\textfrak{sz}') should never be broken up; you also usually
% see the `st'~(`\textfrak{st}') ligature in letterspaced text. Furthermore, at
% least the \pkg{yfonts} package realises the short~s~(`\textfrak{s:}') as the
% pseudo-ligature~`|s:|'. On the other hand, the `ct'~ligature and the other `long~s'
% ligatures often found in Fraktur fonts should be suppressed. There are two
% ways of solving this problem: either don't disable the `|s|' and/or `|c|'
% ligatures and break those that need to be broken up by inserting
% `|{\kern0pt}|' or \pkg{babel}'s~\verb="|= shortcut; or disable them and
% protect those ligatures that need to be protected by enclosing them in the
% \cs{lslig} command. So, the following two solutions have the same result
% (namely, `\textls{\def\!#1{\textcolor{thegreen}{\lslig{#1}}}^^A
%                   \def\?#1{\textcolor{thered}{#1}}^^A
%  \textfrak{Au\!{s:}\?{si}\!{ch}t\!{s:}lo\?{si}gkeit}}',
%  with ligatures here highlighted in green, inhibited ligatures in red):
%
%\begin{verbatim}[morekeywords={[0]{\kern}}]
%\SetTracking[no ligatures={f}]{encoding = LY, family = yfrak}{120}
%\textfrak{\lsstyle Aus:s{\kern0pt}ichts:los{\kern0pt}igkeit}
%\end{verbatim}
%\begin{verbatim}
%\SetTracking[no ligatures={f,s,c}]{encoding = LY, family = yfrak}{120}
%\textfrak{\lsstyle Au\lslig{s:}si\lslig{ch}t\lslig{s:}losigkeit}
%\end{verbatim}
%
%\bigskip\noindent
%\DescribePackage{letterspace}
% These three commands (plus the \opt{letterspace} option, described in
% section~\ref{sub:options-tracking}) are also available with the alternative
% \letterspace\ package, which is in fact a much stripped-down version of
% \microtype, omitting support for all the other extensions (and also omitting
% the possibilities of the \cs{SetTracking} command -- all `|f|' ligatures will
% be disabled, inner and outer spacing and outer kerning will be set to the
% default values described in section~\ref{sub:tracking}). If you would rather
% forgo \microtype's specialties, you may load the \letterspace\ package
% instead. Both packages should not be used at the same time.
%
% In contrast to \microtype, which requires \LaTeX, the \letterspace\
% package also works with \pkg{eplain} or even only \pkg{miniltx}: for use with
% \pkg{eplain}, load the package with \cmd\usepackage\ inside the
% \cmd\beginpackages~\dots\ \cmd\endpackages\ environment; with \pkg{miniltx}
% (which does not support package options) simply \cmd\input\ \file{letterspace.sty}.
%
%
%\section[Disabling ligatures]
%        {Disabling ligatures \requires{\pdftex~1.30,\luatex~0.30}}
%        \label{sec:disable-ligatures}
%
%\Describe{Macro}{\DisableLigatures}{?characters,set of fonts}
% While completely disabling all ligatures of a font (which will also switch
% off kerning for this font), purposely \textit{lowers} the micro-typographic
% quality instead of raising it, it is especially useful for typewriter fonts,
% so that, \eg, in a <T1> encoded font, `|\texttt{--}|' will indeed be printed
% as `|--|', not as `\texttt{--}'. \cs{DisableLigatures} may be used to
% specify, in the usual way, a set of fonts for which ligatures should be
% disabled, for example, of the typewriter font in <T1> encoding:
%\begin{verbatim}
%\DisableLigatures{encoding = T1, family = tt* }
%\end{verbatim}
% It is also possible to disable selected ligatures only. The optional argument
% may contain a comma-separated list of characters for which the ligature
% mechanism should be inhibited:
%\begin{verbatim}
%\DisableLigatures[?,!]{encoding = T1} % "\ifx\tagcode\undefined\else ^^A
%           \normalfont\color{thegrey}inhibit ?` and !`, but not fi, --, >>, etc.\fi"
%\end{verbatim}
% Only the character that begins the ligature(s) should be specified. This
% command may only be used in the preamble, and only once.\footnote{
%   With \luatex, you have to load the fonts with the \cite{fontspec} option
%   `|Renderer=Basic|'.}
%   ^^A Otherwise, it won't work at all
%
%
%\section[Being pedantic about protrusion]
%        {Being pedantic about protrusion \requires{\etex}}\label{sec:pedantic}
%
% Protrusion works well in running paragraphs, but may also be desirable
% in situations where \TeX, in contrast to human eyes, would not see a margin,^^A
%   \footnote{Possibly because \TeX\ tends to look through its gastro-intestinal tract.}
% \eg, in |itemize| or |tabular| environments.
% The \microtype\ package offers two commands that may be inserted at
% such an effective inner margin to make the first respectively last glyph
% protrude as if it were located at a normal outer  margin:
%
%\medskip
%\Describe{Macro}{\leftprotrusion}{general text}
% This command will add left protrusion for the following text.
% You may also just say \cs{leftprotrusion} (without an argument), and
% \microtype\ will gather the next glyph (possibly a ligature) before
% adding protrusion on its left hand side.
% For instance, you could add this command to tabular cell definitions
% (using the \pkg{array} package):
%\begin{verbatim}
%\begin{tabular}{l>{\leftprotrusion}p{9cm}r}
%\end{verbatim}
% in order to get protrusion at the beginning of the |p| cell.
%
%\medskip
%\Describe{Macro}{\rightprotrusion}{general text}
% will typeset \meta{general text} and then add protrusion on the right side.
% (Unfortunately, \TeX\ cannot look backwards at what it has already typeset,
% so this command requires that the text be given in the argument.)
%
%\medskip\noindent
%\DescribeMacro{\noprotrusion}
% is a command from \LaTeX\ proper, so it's just mentioned apropos.
% When added to the beginning or end of a line, protrusion at the respective
% margin will be prevented.\linebreak
%\DescribeMacro{\noprotrusionifhmode}
% While the latter command will always leave vertical mode first
% (which in some situations may result in unwanted vertical space),
% this variant prevents protrusion only if already in horizontal mode.
%
%\medskip\noindent
% The \microtype\ package defines a number of patches in order to get protrusion
% right (indicated in parentheses are dedicated patches for classes and packages
% beyond the standard ones; they may still work with other classes or packages):
%\begingroup
%\list{}{\labelwidth=3em \itemindent\z@ \leftmargin=\labelwidth
%     \def\makelabel#1{\hskip\labelsep\texttt{#1}\hss}}
%\def\MTsupp#1{\unskip\nobreak\hfil\penalty50 \hskip2em\hbox{}\nobreak\hfil
%   {\smaller(#1)}\parfillskip=0pt \finalhyphendemerits=0 }
%^^A \microtypesetup{nopatch=item}
% \item[item]  Affects the first line of \cmd\item\kern.6pts in various environments, so that,
%              \eg, the two\break A's here -- the one in the current line and the one in the
%              line above -- are neatly aligned; without the patch, the first A would be
%              slightly shifted to the right.
%              This patch also affects environments such as |quote| or |flushleft|, which are
%              implemented in \LaTeX\ as lists starting with an implicit empty item.
%              \MTsupp{\cls{beamer}, \cls{simplecv}}
% \item[toc]   Adds protrusion at the left margins of sectioning titles in the Table of Contents
%              and similar Lists of \meta{Things}.
%              \MTsupp{\cls{memoir}}
% \item[footnote] Protrusion for the first line of footnote text (visible in particular
%              when the footnote text is set in block paragraphs, like in this document).
%              \MTsupp{\cls{memoir}, <\cls{KOMA}> classes, \cls{beamer}, \pkg{changebar}, \pkg{fnbreak}, \pkg{hyperref}}
% \item[verbatim] Disables protrusion and expansion in verbatim environments.
%              \MTsupp{\pkg{alltt}}
% \item[eqnum] Protrusion for equation numbers on either side. If you are using the
%              interface provided by \pkg{mathtools}, insert the relevant commands
%              yourself, \eg:
%\begin{verbatim}[belowskip=-\smallskipamount]
%\newtagform{mytag}[\textbf]{\leftprotrusion{(}}{\rightprotrusion{)}}
%\end{verbatim}^^A
%              \MTsupp{\pkg{amsmath}, \cls{IEEEtran}, \pkg{showkeys}}
%\endlist\endgroup
%
%\medskip\noindent
% By default, all of the above patches will be applied. Should this not be desired,
% or in case you are running into problems (or just want to silence a warning that a
% patch cannot be applied -- which in itself only means that no harm is done, but no
% good either), you may prevent or undo the patches through
% the \textcolor{thered}{\opt{patch}} and \textcolor{thered}{\opt{nopatch}} options,
% either when loading the package:
%\begin{verbatim}
%\usepackage[nopatch=toc]{microtype}
%\end{verbatim}
% or, possibly temporarily, within the document:
%\begin{verbatim}
%\microtypesetup{nopatch=item}
%\end{verbatim}
%
%\medskip\noindent
%\leavevmode\llap{\itshape\color{thegrey}Help wanted!\hskip\marginparsep}^^A
%\leftprotrusion These pedantic protrusion patches are still work-in-progress.
% I suspect many use cases where they either do not work as advertised,
% or worse, where they may even lead to errors.
% Also, I am aware that there are myriads of classes and packages out there that
% modify internal commands in their own ways, possibly rendering the patches useless.
% Finally, there will certainly be many more situations where protrusion would be appropriate.
% I would be happy to include more patches, or enhance the existing ones,
% so I welcome any suggestions and problem reports you may have.
%
%
%\section{Creating configurations and contributing}\label{sec:contrib} ^^A [also referenced in microtype.ins]
%
% I would also be glad to include configuration files for more fonts. Preparing such
% configurations is quite a time-consuming task and requires a lot of patience.
% To alleviate this process, \microtype\ includes the companion package
%\DescribePackage{microtype-show}
% \pkg{microtype-show}, which offers some tools to visually debug protrusion
% settings. It should not be used in production contexts.
%
%\medskip\noindent
%^^A don't index the commands from microtype-show as "Commands"
%{\def\SpecialUsageIndex#1{\let\special@index\index\SpecialIndex@{#1}{\encapchar dochyperpage}}^^A
%\DescribeMacro{\ShowCharacterInheritance}
% These commands show all defined inheritance resp. protrusion settings
% (the latter relative to character width, to \EM{1}, and as the effective kerning amount)
%\DescribeMacro{\ShowProtrusion}
% for the current font. They are most useful for consistency checks.
%
%\DescribeMacro{\ShowMissingGlyphstrue}
% If the boolean \cs{ifShowMissingGlyphs} is set to true, the glyphs \textit{not}
% included in the configuration will also be shown. Setting the switch
%\DescribeMacro{\ShowGlyphIndextrue}
% \cs{ifShowGlyphIndex} to true will additionally display the glyph (\pdftex)
%\DescribeMacro{\GlyphScaleFactor}
% respectively Unicode (\luatex) index number. Furthermore, you may alter the glyphs'
% display size by redefining \cs{GlyphScaleFactor} (default:~|2|).
%
%\medskip\noindent
%\DescribeMacro{\ShowProtrusionAll}
% When preparing the actual protrusion settings, these commands may prove helpful.
% Conveniently placing the glyphs at the margins, they show, respectively:
%\DescribeMacro{\ShowProtrusionDefined}
% all glyphs in the current font; only those with defined protrusion settings;
%\DescribeMacro{\ShowProtrusionMissing}
% or those without any protrusion settings.
% (Note that here, the protrusion amounts are given in 1000ths of \EM{1}, not in
% 1000ths of character widths).
%^^A
% The package also includes a test file that shows all of these commands in action
% (\file{test-microtype.tex}).
%}
%
%\medskip\noindent
% If you have created a configuration file for another font, or if you have any
% suggestions for enhancements in the default configuration files, I~would
% gratefully accept them: \mailtoRS.
%\iffalse\footnote{^^A ... OK, so nobody has any ...
%    Should you have lots of \pkg{pdfcprot} configuration files lying around,
%    I can also provide you with a \TeX\ conversion script. Just ask me.}
%\fi
%
%\medskip\noindent
% Development of the package takes place on GitHub, which also provides an
% issue tracker for submitting bug reports and feature requests:
% \url{\githuburl/issues}.
%
%
%\section{Hints and caveats}\label{sec:caveats} ^^A [also referenced in: \MT@warn@unknown@once]
%
%\paragraph{Use settings that match your font.}
% Although the default settings should give reasonable results for most fonts,
% the particular font you happen to be using may have different character
% shapes that necessitate more or less protrusion. In particular,
% italic letter shapes may differ wildly in different fonts, hence I have
% decided against providing default protrusion settings for them.
% See the previous section for some tools for the preparation
% of protrusion settings.
%
%\paragraph{Don't use too large a value for expansion.}
% Font expansion is a feature that is supposed to enhance the typographic
% quality of your document by producing a more uniform greyness of the text
% block (and potentially reducing the number of necessary hyphenations). When
% expanding or shrinking a font too much, the effect will be turned into the
% opposite. Expanding the fonts by more than 2\%, \ie, setting a \opt{stretch}
% limit of more than 20, should be justified by a typographically trained eye.
% If you are so lucky as to be in the possession of multiple instances of a
% Multiple Master font, you may set expansion limits to up to 4\%.
%
%\changes{v2.0}{2006/12/13}{qualify hint about web documents with regard to older \pdftex\ versions}
%\changes{v3.0}{2021/05/25}{remove hint about web documents with pre-1.40 \pdftex\ (it's been 14 years~\dots)}
%\iffalse ^^A pdftex 1.40 was released in 2007 ...
%\paragraph{Don't use font expansion for web documents (with older \pdftex\ versions).}
% With \pdftex\ versions older than 1.40, each expanded instance of the font
% will be embedded in the <PDF> file, hence the file size may increase by quite
% a large factor (depending on expansion limits and step). Therefore, courtesy
% and thriftiness of bandwidth command it not to enable font expansion when
% creating files to be distributed electronically. With \pdftex\ 1.40 and \luatex, which
% use a different technique of expansion, the increase of file size can be
% neglected.
%\fi
%
%\changes{v2.2}{2007/07/06}{add hint about extra <TOC> leader dot
%                           (first discovered by \contributor Morten H\o gholm <morten.hoegholm\at latex-project.org>)}
%                                                                                       ^^A private mail, 2006/08/26
%\changes{v3.0}{2021/05/15}{remove hint about extra <TOC> leader dot
%                           (fixed in \LaTeX)}
%\iffalse
%\paragraph{You might want to disable protrusion in the Table of Contents.}
% In unfortunate situations, enabled protrusion might internally alter the line
% length in the <TOC> and similar lists in such a way that an excess leader dot
% will fit in. The solution is to temporarily disable protrusion for the <TOC>:
%\begin{verbatim}
%\microtypesetup{protrusion=false}
%\tableofcontents
%\microtypesetup{protrusion=true}
%\end{verbatim}
%\fi
%
%\iffalse
%\changes{v1.9}{2005/07/10}{add hint about \texttt{verbatim} environment}
%\paragraph{You might want to disable protrusion in \texttt{verbatim} environments.}
% As you know by now, \microtype\ will by default activate character protrusion
% for all fonts contained in the font set `|alltext|'. This also includes the
% typewriter font. Although it does make sense to protrude the typewriter font
% if it appears in running text (like, for example, in this manual), this is
% probably not desirable inside the |verbatim| environment. However,
% \microtype\ has no knowledge about the context that a font appears in but
% will solely decide by examining its attributes. Therefore, you have to take
% care of disabling protrusion in |verbatim| environments for yourself (that
% is, if you don't want to disable protrusion for the typewriter font
% altogether, by activating, say, the font set `|alltext-nott|').
% While the \cs{microtypesetup} command has of course been designed for cases
% like this, you may find it tiresome to repeat it every time if you are
% using the |verbatim| environment frequently. The following line (which requires
% the \pkg{etoolbox} package), added to the document's preamble, would serve the same purpose:
%\changes{v2.3e}{2009/07/21}{suggest to patch \cmd\@verbatim\ instead of \cmd\verbatim}
%\changes{v2.6}{2016/03/07}{suggest to use \pkg{etoolbox} to patch \cmd\verbatim}
%\begin{verbatim}
%\AtBeginEnvironment{verbatim}{\microtypesetup{activate=false}}
%\end{verbatim}
% If you are using the \pkg{fancyvrb} or the \pkg{listings} package, this is
% not necessary, since their implementation of the corresponding environments
% will inhibit protrusion anyway.
%\fi
%
%\changes{v1.9e}{2006/07/10}{add hint about unknown encodings}
%\paragraph{Settings for Greek/Thai/Armenian etc. encodings are not yet included.}
% The default sets of fonts for which the micro-typographic features will be
% enabled (see table~\ref{tab:predefined-font-sets}) only contain those
% encodings for which configurations exist. Therefore, if you are using any
% other encoding (\eg, <LGR>, <T2B>, etc.), \microtype\ will not apply to these
% fonts. You have to define and activate a new font set including the
% encoding(s) you are using (for details, see section~\ref{sec:font-sets}). For
% protrusion at least, you would also have to create settings for the fonts in
% question (see section~\ref{sub:protrusion}). It goes without saying that
% contributions for these encodings are more than welcome.
%
%\paragraph{Only employ kerning adjustment if it is customary in the language's
%typographic tradition.}
% In contrast to protrusion and expansion, additional kerning does not
% unconditionally improve the micro-typographical quality of your document. You
% should only switch it on if you are writing a document in a language whose
% typographic tradition warrants such kerning. If you are, for example, writing
% an English text, your readers would probably be rather confused by additional
% spaces before the punctuation characters.
%
%\changes{v2.3c}{2008/10/27}{add hint about \opt{spacing} being experimental}
%\paragraph{Adjustment of interword spacing is still experimental.}
% The implementation of this feature in \pdftex\ is not complete, and may not
% yield the positive effects on the typographical quality you might expect --
% in certain situations, there may even be undesired side effects,
%\changes{v2.5}{2011/11/27}{add hint about \opt{spacing} and \pkg{ragged2e}} ^^A (beta:09)
% in particular, when used together with the \pkg{ragged2e} package. Therefore,
% the \opt{spacing} option should not be chosen blindly; it is also recommended
% to experiment with the settings in order to understand the workings of this
% feature.
%
%\changes{v1.7}{2005/03/23}{add hint about compatibility}
%\paragraph{Compatibility and interaction with other packages:}
% The \microtype\ package is supposed to work happily together with all other
% \LaTeX\ packages (except for \pkg{pdfcprot}). However, life isn't perfect, so
% problems are to be expected. Currently, I am aware of the following issues:
%\begin{itemize}
%\changes{v2.7b}{2018/09/18}{update hint about non-7-bit characters
%                            (notified by \contributor Frank Mittelbach <frank.mittelbach\at latex-project.org>)}
%                            ^^A private mail, 2018/08/14
%  \item Even though most configuration files are still provided in legacy (7-bit)
%        format, using multi-byte (Unicode) characters in the settings will run
%        smoothly with an up-to-date \LaTeX\ system.
%        For older systems or documents in legacy encodings, in contrast,
%        the \pkg{inputenc} package must be loaded first.
%        Furthermore, when using multiple input encodings in a document, 8-bit characters in
%        the settings will only work reliably if you specify the |inputenc| key.
%\changes{v2.3a}{2008/02/25}{add hint about \pkg{babel} having to be loaded first}
%  \item When loading the package with the \opt{babel} option, you must load
%        the \pkg{babel} or \pkg{polyglossia} package before \microtype.
%\changes{v2.5}{2012/09/11}{add hint about \luatex\ compatibility}
%  \item Before this package was fully compatible with \luatex, the following
%        method of enabling expansion and protrusion with the \cite{fontspec}
%        package was most often found to be recommended:
%\begin{verbatim}[deletekeywords={[1]{expansion,protrusion}},belowskip=0pt]
%\newfontfeature{Microtype}{protrusion=default;expansion=default}
%\defaultfontfeatures{Microtype}
%\end{verbatim}
%        This code should \emph{not} be used with this package, as it will
%        basically override all of the settings made by \microtype\ -- despite
%        the naming, the above lines have nothing to do with this
%        package.\footnote{^^A
%             They make use of features provided by \cite{luaotfload} (via \cite{fontspec}).}
%\changes{v2.3c}{2008/11/11}{add hint about partial incompatibility with \pkg{CJK}}
%  \item With \pdftex, it is currently not possible to create character-specific settings for
%        Chinese\slash Japanese\slash Korean fonts. Therefore, the only
%        micro-typographic extension that can be made to work with
%        \pkg{CJK} fonts is (non-selected) font expansion.
%\changes{v2.6}{2015/11/03}{add hint about partial incompatibility with \pkg{xeCJK} and \pkg{luatexja}}
%  \item When used with the \pkg{xeCJK} package or the \pkg{luatexja} package,
%        text commands (\eg, |\'A|, |\textless|) in the configuration will not be understood.
%        You therefore have to ensure that \microtype\ will encounter none of them.
%        This requires, firstly, that the glyphs be specified only as single (possibly Unicode)
%        characters, as numbers, or as glyph names (cf. section~\ref{sec:fine-tuning});
%        and secondly, if you are using a font for which pre-defined settings do not exist,
%        that you create these settings yourself (because otherwise, the default settings
%        will be loaded, which do contain text commands). Furthermore, you should
%        load \microtype\ late.
%\end{itemize}
%
%\changes{v1.8}{2005/06/23}{add hint about error messages}
%\paragraph{Possible warning and error messages and how to get rid of them
%           (\textcolor{thegreen}{specs} may differ):}
%\begin{itemize}
%\lstset{style=message}
%  \item
%\begin{verbatim}
%Package microtype Warning: Unknown slot number of character
%(microtype)                `<\k A>'
%(microtype)                in font encoding `TU' in inheritance list
%(microtype)                `"\csname MT@pr@inh@TU////\endcsname"'.
%\end{verbatim}
%\changes{v3.0}{2021/06/26}{add hint about unknown slot numbers}
% If you receive lots of warnings like the above, and you are running \luatex\
% or \xetex, this probably means that the font you are using contains less
% glyphs than are defined in the default protrusion and/or inheritance settings.
% For such fonts, the \microtype\ package defines basic inheritance settings
% to which you may alias your font (the generic protrusion settings will
% still be loaded). Try adding the line:
%\begin{verbatim}[style=microtype,belowskip=0pt]
%\DeclareMicrotypeAlias{"\rmfamily\meta{your font}"}{TU-basic}
%\end{verbatim}
% to the preamble. For symbol fonts, you may even use the alias |TU-empty|,
% which is, well, empty, meaning that no protrusion will be applied at all
% to this font. Note that these aliases are just meant to provide an easy way
% of getting rid of the warnings, while the proper solution would be to create
% inheritance and protrusion settings specific to the font in question.
%
%  \item
%\begin{verbatim}[deletekeywords={[1]{patch}}]
%Package microtype Warning: Unable to apply patch `<footnote>' on input line <29>.
%\end{verbatim}
%\changes{v3.1}{2022/09/15}{add hint about protrusion patch warnings}
% As described in chapter~\ref{sec:pedantic} above, \microtype\ tries to patch a number
% of commands to enable or disable protrusion in certain situations. If you receive a warning
% like the above, you should first make sure (as always) that the package is up to date.
% If it is, consider filing a \href{\githuburl/issues}{bug report}.
% Until a fix is available, or if you are, for whatever reason, unable or unwilling
% to update, the easiest solution to get rid of the warning is to disable the
% problematic patch with the \opt{nopatch} option, \eg:
%\begin{verbatim}[style=microtype]
%\microtypesetup{nopatch=footnote}
%\end{verbatim}
%
%  \item
%\begin{verbatim}
%! Font csnameendcsname=<cmr10+20 at 10.0pt> not loadable: Metric (TFM) file not found.
%\end{verbatim}
%\changes{v1.9a}{2005/11/15}{add explanation for error message in <DVI> mode}
% This error message will occur if you are trying to employ font expansion
% while creating <DVI> output. Remember that \emph{automatic} font expansion
% only works when running \pdftex\ or \luatex\ in <PDF> mode. Although expansion is also
% possible in <DVI> mode with \pdftex, it requires that all instances of the expanded fonts
% exist on your \TeX\ system.
%
%  \item
%\begin{verbatim}
%! pdfTeX error (font expansion): auto expansion is only possible with scalable fonts.
%\end{verbatim}
%\changes{v2.2}{2007/06/13}{add hint about error message with \pdftex\ 1.40}
% Beginning with \pdftex\ 1.40, font expansion not only works with Type\,1 fonts
% but also with TrueType, OpenType and even non-embedded fonts.
% The above error message indicates either that you are trying to apply expansion to
% a bitmap~(|pk|) font, which is still not possible, or that the font isn't found
% at all, \eg, because of missing map entries.
%
%  \item
%\begin{verbatim}
%Warning: pdflatex: font <ptmr8r> cannot be expanded (not an included Type1 font)
%\end{verbatim}
%\changes{v2.0}{2006/12/13}{qualify hints about expansion error messages with
%                           regard to older \pdftex\ versions}
% and the <PDF> viewer complains about a missing font, \eg, Adobe Reader thusly:
%\begin{verbatim}[aboveskip=\smallskipamount]
%Could not find a font in the Resources dictionary - using Helvetica instead.
%\end{verbatim}
% With \pdftex\ versions older than 1.40, font expansion can only be applied if
% the font is actually embedded in the <PDF> file. If you get the above error
% message, your \TeX\ system is not set up to embed (or `download') the base
% PostScript fonts (\eg, Times, Helvetica, Courier). In most \TeX\
% distributions, this can be changed in the file \file{updmap.cfg} by setting
% |pdftexDownloadBase14| to |true|.
%
%\pagebreak ^^A layout
%  \item
%\begin{verbatim}
%Warning: pdflatex (file <ecrm1000+20>): Font <ecrm1000+20 at 1200> not found
%\end{verbatim}
%\changes{v1.9a}{2005/11/15}{add explanation for error message with non-Type\,1 fonts}
% Furthermore, \pdftex\ versions older than 1.40 require Type\,1 fonts for
% automatic font expansion. When you receive a message like the above, you are
% probably trying to apply font expansion to a bitmap or TrueType font. With
% older \pdftex\ versions, this is only possible if you manually create
% expanded instances of the fonts.
%
%  \item
%\begin{verbatim}
%! Font <T1/cmr/m/n/10>=<ecrm1000 at 10.0pt> not loaded: Not enough room left.
%\end{verbatim}
%\changes{v2.0}{2006/11/05}{add hint about how to increase \texttt{font\textunderscore max}
%                            and \texttt{font\textunderscore mem\textunderscore size}}
% Memory parameter `|font_mem_size|' too small.
%  \item
%\begin{verbatim}
%! TeX capacity exceeded, sorry [maximum internal font number (font_max)=<2000>].
%\end{verbatim}
% Memory parameter `|font_max|' too small.
%  \item
%\begin{verbatim}
%! TeX capacity exceeded, sorry [PDF memory size (pdf_mem_size)=<65536>].
%\end{verbatim}
% Memory parameter `|pdf_mem_size|' too small (\pdftex\ versions older than 1.30).
%
% When applying micro-typographic enhancement to a large document with a lot of
% fonts, \pdftex\ may be running out of some kind of memory. It can be
% increased by setting the respective parameter to a larger value. For
% web2c-based systems, \eg, \texlive, change the settings in \file{texmf.cnf},
% for \miktex, in the file \file{miktex.ini} (2.4 or older) resp.
% \file{pdflatex.ini} (2.5 or newer).
%
%  \item
%\begin{verbatim}
%pdfTeX warning (font expansion): font should be expanded before its first use
%\end{verbatim}
%\changes{v2.0}{2007/01/05}{add hint about warning when tracking \emph{and}
%                           expansion is applied to a font}
% This warning will occur with \pdftex\ versions older than 1.40.4, if tracking
% \emph{and} expansion is applied to a font. It is harmless and can be ignored.
%\end{itemize}
%
%\changes{v2.5}{2012/07/17}{add hint about \texttt{dtx} source code}
% \paragraph{The source code of this document is freely available.}
% If you wonder how this document was created, just have a look at the source
% code in \file{microtype.dtx}, which is either already included in your \TeX\
% distribution, or else can be downloaded from
% \href{https://mirror.ctan.org/macros/latex/contrib/microtype/}
%      {\acronym{CTAN}}.
% For the source code of the logo on the title page and of the letterspacing
% sample from section~\ref{sub:tracking}, see the Implementation part,
% appendices~\ref{sec:title-logo} and \ref{sec:letterspace-ill}.
%\changes{v2.5a}{2013/05/23}{add notes on typesetting the documentation}
% If you want to re-typeset the documentation, read the comments at the end of
% \file{microtype.dtx}.
%
%
%\section{Acknowledgments}
%
% This package would be pointless if
%  \contributor H\`an \thanhthe{} Th\`anh <thanh\at pdftex.org>
% hadn't created the \pdftex\ program in the first place, which introduced
% the micro-typographic extensions and made them available to the \TeX\ world.
% Furthermore, I thank him for helping me to improve this package, and not
% least for promoting it in \cite{ThanhPracTeX}, \cite{ThanhEuroTeX07} and ^^A comma, to avoid the Three Ands Falls
% elsewhere. I also thank him and the rest of the \pdftex\ team, and more
% recently also the \luatex\ and \xetex\ teams, for refuting the idea that
% \TeX\ is dead, and for fixing the bugs I find.
%
%  \contributor Harald Harders <h.harders\at tu-bs.de>
% has contributed protrusion settings for Adobe Minion. I~would also like to
% thank him for a number of bug reports and suggestions he had to make.
%  \contributor Andreas B\"uhmann <andreas.buehmann\at web.de>
% has suggested the possibility to specify ranges of font sizes, and
% resourcefully assisted in implementing this. He also came up with some good
% ideas for the management of complex configurations.
%  \contributor Ulrich Dirr <ud\at art-satz.de>
% has made numerous suggestion, especially concerning the new extensions of
% interword spacing adjustment and additional character kerning.
%  \contributor Georg Duffner <g.duffner\at gmail.com> has patiently tested
% \microtype\ under \xetex\ and \luatex\ with his beautiful OpenType font
% <EB>~Garamond.
% My thanks also go to
%  \contributor Maciej Eder <maciej_eder\at poczta.onet.pl>
% for contributing settings for the <QX> encoding, as well as to
%  \contributor Karl Karlsson <karl-karlsson\at yandex.ru>
% for providing settings for the Cyrillic <T2A> encoding, and to
%  \contributor Hendrik Vogt <hendrik.vogt\at tu-dresden.de>,
% who made substantial improvements to the Computer Modern Roman italic settings.
% I thank
%  \contributor Loren~B. Davis <davislo\at eecs.oregonstate.edu>
% for providing protrusion settings for OpenType versions of Palatino Linotype,
% as well as
%  \contributor Antonis Tsolomitis <antonis.tsolomitis\at gmail.com>
% for settings for his New Computer Modern font. The latter also showcase the
% new feature of automatically calculated protrusion, which was an original idea by
%  \contributor Daniel Benjamin Miller <dbmiller\at dbmiller.org>. ^^A also https://tex.stackexchange.com/users/176404/d909
% I am also very much indebted to
%  \contributor \'Elie Roux <elie.roux\at telecom-bretagne.eu>,
% who not only contributed the |lua| module in the first place, but also,
% together with
%  \contributor Philipp Gesang <philipp.gesang\at alumni.uni-heidelberg.de>,
% took care of updating it for the developments in \luatex\ land.
%
% I thank
%  \contributor Philipp Lehman <plehman\at gmx.net>
% for adding to his \pkg{csquotes} package the possibility to restore the
% original meanings of all activated characters, thus allowing for these
% characters to be used in the configuration files.
%  \contributor Peter Wilson <herries.press\at earthlink.net>
% kindly provided a hook in his \pkg{ledmac}/\pkg{ledpar} packages
% (inherited by their successors \pkg{reledmac}\slash\pkg{reledpar}),
% so that critical editions can also benefit from character protrusion.
% Likewise,
%  \contributor Donald Arseneau <asnd\at triumf.ca>
% patched his \pkg{shapepar} package to accommodate protrusion.
%
% Additionally, the following people have reported bugs, made suggestions or
% helped otherwise (in chronological order, quotes indicate
%    \href{https://tex.stackexchange.com/users/}{TeX.SX} and/or
%    \href{https://github.com/}{GitHub} user names):
%  \contributor Tom Kink          <kink\at hia.rwth-aachen.de>,
%  \contributor Herb Schulz       <herbs\at wideopenwest.com>,
%  \contributor Michael Hoppe     <mh\at michael-hoppe.de>,
%  \contributor Gary~L. Gray      <gray\at engr.psu.edu>,
%  \contributor Georg Verweyen    <verweyen\at gmail.com>,
%  \contributor Christoph Bier    <christoph.bier\at web.de>,
%  \contributor Peter Muthesius   <Pemu\at gmx.de>,
%  \contributor Bernard Gaulle    <gaulle\at idris.fr>, ^^A\,\textdagger,
%  \contributor Adam Kucharczyk   <adamk\at ijp-pan.krakow.pl>,
%  \contributor Mark Rossi        <mark.rossi\at de.bosch.com>,
%  \contributor Stephan Hennig    <stephanhennig\at arcor.de>,
%  \contributor Michael Zedler    <Michael.Zedler\at tum.de>,
%  \contributor Herbert Vo\ss{}   <Herbert.Voss\at gmx.net>,
%  \contributor Ralf Stubner      <ralf.stubner\at physik.uni-erlangen.de>,
%  \contributor Holger Uhr        <huhr\at uni-paderborn.de>,
%  \contributor Peter Dyballa     <Peter_Dyballa\at Web.DE>,
%  \contributor Morten H\o gholm  <morten.hoegholm\at latex-project.org>,
%  \contributor Steven Bath       <steven128\at iname.com>,
%  \contributor Daniel Flipo      <daniel.flipo\at univ-lille1.fr>,
%  \contributor Michalis Miatidis <miatidis\at informatik.rwth-aachen.de>,
%  \contributor Sven Naumann      <svenau\at gmx.net>,
%  \contributor Ross Hetherington <ross\at heth.eclipse.co.uk>,
%  \contributor Wiebke Petersen   <petersew\at uni-duesseldorf.de>,
%  \contributor Geoff Vallis      <gkv\at Princeton.EDU>,
%  \contributor Steven~E. Harris  <seh\at panix.com>,
%  \contributor Karl Berry        <karl\at freefriends.org>,
%  \contributor Peter Meier       <Peter.Meier998\at gmx.de>,
%  \contributor Nathan Rosenblum  <nater\at cs.wisc.edu>,
%  \contributor Wolfram Schaalo   <schaalo\at gmx.net>,
%  \contributor Vasile Gaburici   <vgaburici\at gmail.com>,
%  \contributor Sveinung Heggen   <sveinung.heggen\at orkla.no>,
%  \contributor Axel Berger       <Axel_Berger\at b.maus.de>,
%  \contributor Colin Rourke      <gt\at msp.warwick.ac.uk>,
%  \contributor Maverick Woo      <maverick\at cs.cmu.edu>,
%  \contributor Silas~S. Brown    <ssb22\at cam.ac.uk>,
%  \contributor Lars R\"onnb\"ack <lars.ronnback\at affecto.com>,
%  \contributor Christian Stark   <cstark\at gmx.de>,
%  \contributor Leo               <sdl.web\at gmail.com>,
%  \contributor Marcin Borkowski  <mbork\at atos.wmid.amu.edu.pl>,
%  \contributor hscm              <henkmetselaar\at gmail.com>,
%  \contributor George Gratzer    <gratzer\at me.com>,
%  \contributor Josep Maria Font  <jmfont\at ub.edu>,
%  \contributor Juan Acevedo      <juan.acevedo.juan\at gmail.com>,
%  \contributor Heiko Oberdiek    <heiko.oberdiek\at googlemail.com>,
%  \contributor Till~A. Heilmann  <till.heilmann\at unibas.ch>,
%  \contributor Rolf Dieterich    <rolf.dieterich\at gmx.de>,
%  \contributor Seamus Bradley    <@\at @>, ^^A https://tex.stackexchange.com/users/215/seamus
%  \contributor Meho~R            <meho.2005\at gmail.com>,
%  \contributor Steffen Hoffmann  <speraviro-delenda\at expires-2011-11-30.arcornews.de>,
%  \contributor Scott Pakin       <scott\at pakin.org>,
%  \contributor Ma\"ieul Rouquette <maieul\at maieul.net>,
%  \contributor Jonas Hogstrom    <hjb981\at gmail.com>,
%  \contributor Gabriel Kerneis   <gabriel\at kerneis.info>,
% `\contributor RazorXsr          <@\at @>', ^^A https://tex.stackexchange.com/users/17609/razorxsr
%  \contributor Sebastian Schubert <schubert.seb\at googlemail.com>,
% `\contributor Dave              <@\at @>', ^^A https://tex.stackexchange.com/users/15562/dave
%  \contributor Giuseppe Palma    <pippi.palma\at gmail.com>,
%  \contributor Stephan Stiller   <stephan.stiller\at gmail.com>,
%  \contributor Christopher Schramm <debian\at shakaweb.org>,
% `\contributor uli               <@\at @>',  ^^A https://tex.stackexchange.com/users/9391/uli
%  \contributor Sam Mason         <sam\at samason.me.uk>, ^^A https://tex.stackexchange.com/users/16433/sam-mason
% `\contributor kleenstar         <@\at @>', ^^A https://tex.stackexchange.com/users/56468/kleenstar
% `\contributor Henning           <@\at @>', ^^A https://tex.stackexchange.com/users/64603/henning
%  \contributor Ronnie Marksch    <Ronnie.Marksch\at yahoo.de>,
%  \contributor David Carlisle    <d.p.carlisle\at gmail.com>,
% `\contributor web-stranger      <@\at @>', ^^A https://tex.stackexchange.com/users/75134/web-stranger
% `\contributor Max               <@\at @>', ^^A https://tex.stackexchange.com/users/16809/max
% `\contributor HcN               <@\at @>', ^^A https://tex.stackexchange.com/users/87090/hcn
%  \contributor Will Robertson    <will\at wspr.io>,
% `\contributor user11126         <@\at @>', ^^A https://tex.stackexchange.com/users/1000/user11126
%  \contributor Ulrike Fischer    <fischer\at troubleshooting-tex.de>,
% `\contributor Daniel            <@\at @>', ^^A https://tex.stackexchange.com/users/113787/daniel
% `\contributor ltcomdata         <@\at @>', ^^A https://tex.stackexchange.com/users/17061/ltcomdata
%  \contributor Reinhard Kotucha  <reinhard.kotucha\at web.de>,
% `\contributor jcr               <@\at @>', ^^A https://tex.stackexchange.com/users/56514/jcr
%  \contributor Nils Anders Danielsson <nad\at cse.gu.se>,
%  \contributor Paolo Ney         <@\at @>,  ^^A https://tex.stackexchange.com/users/29161/paulo-ney
%  \contributor Frank Mittelbach  <frank.mittelbach\at latex-project.org>,
%  \contributor Franz Wexler      <@\at @>,  ^^A https://tex.stackexchange.com/users/182307/franz-wexler
%  \contributor Moritz Wemheuer   <moritz.wemheuer\at gmail.com>,
% `\contributor Andy N            <@\at @>', ^^A https://tex.stackexchange.com/users/182462/andy-n
%  \contributor Phelype Oleinik   <phe.h.o1\at gmail.com>,
%  \contributor Falk Hanisch      <falk.hanisch\at tu-dresden.de>,
%  \contributor Markus Kohm       <komascript\at gmx.info>,
%  \contributor Paolo Polesana    <@\at @>,  ^^A https://tex.stackexchange.com/users/95083/paolo-polesana
%  \contributor Oliver Kopp       <koppdev\at gmail.com>,
%  \contributor Hironori Kitagawa <h_kitagawa2001\at yahoo.co.jp>,
%  \contributor Aman Mehra        <reportaman\at gmail.com>, ^^A also https://tex.stackexchange.com/users/192717/reportaman
%  \contributor Md Ayquassar      <mdayq0\at lenta.ru>,
%  \contributor Holger Gerhardt   <holger.gerhardt\at uni-bonn.de>,
%  \contributor Marcel Kr\"uger   <tex\at 2krueger.de>,
%  \contributor Ekkehart Schlicht <ekkehart.schlicht\at gmail.com>,
% `\contributor Canageek          <@\at @>', ^^A https://tex.stackexchange.com/users/7880/canageek
% `\contributor dsedivec          <@\at @>', ^^A https://tex.stackexchange.com/users/1680/dsedivec
% `\contributor DORpapst          <@\at @>', ^^A https://tex.stackexchange.com/users/104965/dorpapst
% `\contributor chsk              <@\at @>', ^^A https://tex.stackexchange.com/users/158639/chsk
% `\contributor tnull             <@\at @>', ^^A https://tex.stackexchange.com/users/91987/tnull
% `\contributor azur              <@\at @>', ^^A https://tex.stackexchange.com/users/216369/azur
% `\contributor Safron            <@\at @>', ^^A https://tex.stackexchange.com/users/149123/safron
%  \contributor Joseph Wright     <@\at @>,  ^^A https://tex.stackexchange.com/users/73/joseph-wright
%  \contributor Gustavo Barros    <@\at @>,  ^^A https://tex.stackexchange.com/users/105447/gusbrs
%  \contributor Torsten Schuetze  <torsten.schuetze\at gmx.net>,
% `\contributor florian           <@\at @>', ^^A https://tex.stackexchange.com/users/172863/florian
%  \contributor Liang-Bo Wang     <@\at @>,  ^^A https://github.com/ccwang002
% `\contributor MisterFiLou       <@\at @>', ^^A https://github.com/MisterFiLou
%  \contributor Akira Yokosawa    <@\at @>,  ^^A https://github.com/akiyks
% `\contributor theufman          <@\at @>', ^^A https://github.com/theufman
% `\contributor frafl             <@\at @>', ^^A https://github.com/frafl
%  \contributor Joel Coffman      <@\at @>,  ^^A https://github.com/joel-coffman
% `\contributor user182849        <@\at @>', ^^A https://tex.stackexchange.com/users/182849/user182849
% `\contributor NightShade        <@\at @>', ^^A https://tex.stackexchange.com/users/260836/nightshade
%  \contributor Nelson Lago       <@\at @>,  ^^A https://github.com/urrameu
%  \contributor Brian Dunn        <@\at @>,  ^^A https://github.com/bdtc
%  \contributor Ralf Steinle      <rasteinle\at web.de>,
%  \contributor Denis Bitouz\'e   <dbitouze\at wanadoo.fr>, ^^A https://tex.stackexchange.com/users/18401/denis-bitouz%c3%a9, https://github.com/dbitouze
%  \contributor Christophe Dervieux <@\at @>, ^^A https://github.com/cderv
%  \contributor Scott Kostyshak   <@\at @>,  ^^A https://github.com/scottkosty
%  \contributor Shen Zhou Hong    <@\at @>,  ^^A https://github.com/ShenZhouHong
%  \contributor David Purton      <@\at @>,  ^^A https://github.com/dcpurton
% `\contributor rallg             <@\at @>', ^^A https://github.com/rallg
%  \contributor Artur A. Marczok  <marczok\at t-online.de>,
%  \contributor Uwe Siart         <uwe.siart\at tum.de>,
% `\contributor simon-codes-something <@\at @>', ^^A https://github.com/simon-codes-something
% `\contributor scholnik          <@\at @>', ^^A https://github.com/scholnik
%  \contributor Ulrich Schwarz    <@\at @>,  ^^A https://tex.stackexchange.com/users/1860/ulrich-schwarz
%  \contributor Bruno Victal      <mirai\at makinata.eu>,
%  \contributor Linas Stonys      <lstonys\at vtex.lt>,
% `\contributor user202729        <@\at @>', ^^A https://tex.stackexchange.com/users/250119/user202729
%  \contributor Oliver Beery      <@\at @>,  ^^A https://github.com/beeryoliver
%  \contributor Bernhard Fisseni  <@\at @>,  ^^A https://github.com/teoric
%  \contributor Aleksandr Petrosyan <@\at @>, ^^A https://github.com/appetrosyan
%  \contributor Didier Verna      <@\at @>,  ^^A https://tex.stackexchange.com/users/24506/didier-verna
% `\contributor nowox             <@\at @>', ^^A https://tex.stackexchange.com/users/85416/nowox
% `\contributor hpvd              <@\at @>', ^^A https://github.com/hpvd
%  \contributor Mark Collins      <@\at @>,  ^^A https://github.com/Marcool04
%  \contributor Nick Bart         <@\at @>,  ^^A https://github.com/njbart
% `\contributor Rimole            <@\at @>'  ^^A https://github.com/Rimole
% and
%  \contributor Clea F. Rees      <@\at @>.
%
%\iffalse
%\section{History of micro-typography} ^^A some time ...
% Both these features have been lacking a simple \LaTeX\ user interface for
% quite some time. Then, the \cite{pdfcprot} package was released, which
% allowed \LaTeX\ users to employ character protrusion without having to mess
% much with the internals.
%
% Font expansion, however, was still most difficult to utilise, since it
% required that the font metrics are available for all levels of expansion.
% Therefore, anybody who wanted to make use of this feature had to create
% multiple instances of the fonts in advance. Shell scripts to partly relieve
% the user from this burden were available~-- however, it remained a cumbersome
% task. Furthermore, all fonts were still being physically created, thus
% wasting compilation time and disk space.
%
% In the summer of 2004, \thanh\ implemented a feature that has proven as a
% major facilitation for \TeX\ and \LaTeX\ users: font expansion can now take
% place automatically. That is, \pdftex\ no longer needs the expanded font
% metrics but will calculate them at run-time and completely in memory.
%
% After this great leap in usability had been taken, the development did not
% stop. On the contrary, \pdftex\ was extended with even more features: version
% 1.30 introduced the possibility to \emph{disable all ligatures}, version 1.40
% a robust \emph{letterspacing} command, the possibility to specify
% \emph{additional character kerning}, and the \emph{adjustment of interword
% spacing}.
%\fi
%
%
%\begin{thebibliography}{}
% \bibitem[Th\`anh 2000]{ThanhThesis}
%   \thanh, `Micro-typographic extensions to the \TeX\ typesetting system',
%   Diss. Masaryk University Brno 2000,
%   in: \textit{TUGBoat}, vol.~21 (2000), no.~4, pp.~317--434.
%   (Online at \url{https://www.tug.org/TUGboat/Articles/tb21-4/tb69thanh.pdf})
%
%\iffalse ^^A obsolete
% \bibitem[Th\`anh 2001]{ThanhTUG}
%   \thanh, `Margin Kerning and Font Expansion with \pdftex',
%   in: \textit{TUGBoat}, vol.~22 (2001), no.~3:
%      `Proceedings of the 2001 Annual Meeting', pp.~146--148.
%   (Online at \url{https://www.tug.org/TUGboat/Articles/tb22-3/tb72thanh.pdf})
%\fi
%
% \bibitem[Th\`anh 2004]{ThanhPracTeX}
%   \thanh, `Micro-typographic extensions of \pdftex\ in practice',
%   in: \textit{TUGBoat}, vol.~25 (2004), no.~1:
%      `Proceedings of the Practical \TeX\ 2004 Conference', pp.~35--38.
%   (Online at \url{https://www.tug.org/TUGboat/Articles/tb25-1/thanh.pdf})
%
%\iffalse
% \bibitem[Th\`anh 2005]{ThanhEuroTeX05}
%   \thanh, `Experiences with micro-typographic extensions of \pdftex\ in practice',
%   in: Euro\TeX\ 2005 Proceedings
%       ^^A 15th~Annual Meeting of the European \TeX\ Users,
%       ^^A March~7 -- March~11, 2005, Abbaye des Pr\'emontr\'es, Pont-\`a-Mousson,
%       [=~\textit{TUGBoat}, vol.~27 (2006), no.~0], pp.~159--164.
%   (Online at \url{https://www.tug.org/TUGboat/Articles/tb27-0/thanh.pdf})
%\fi
%
% \bibitem[Th\`anh 2008]{ThanhEuroTeX07}
%   \thanh, `Font-specific issues in \pdftex',
%   in: \textit{TUGBoat}, vol.~29 (2008), no.~1:
%      `EuroBacho\TeX\ 2007 Proceedings', pp.~36--41.
%   (Online at \url{https://www.tug.org/TUGboat/Articles/tb29-1/tb91thanh-fonts.pdf})
%
% \bibitem[\pdftex\ manual]{pdftexman}
%^^A   \thanh, Sebastian Rahtz, Hans Hagen, Hartmut Henkel, Pawe\l\ Jackowski, Martin Schr\"oder, Karl Berry,
%   \thanh\ and others,
%   \emph{The \pdftex\ user manual},
%   22~February 2024.
%   (\ctanurl{systems/doc/pdftex/manual/pdftex-a.pdf})
%
% \bibitem[Fontname]{fontname}
%   Karl Berry, \emph{Fontname: Filenames for \TeX\ fonts},
%   July 2009.
%   (\ctanurl{info/fontname/fontname.pdf})
%
% \bibitem[\LaTeXe\ font selection]{fntguide}
%   \LaTeX\ Project Team, \emph{\LaTeXe\ font selection},
%   September 2024.
%   (\ctanurl{macros/latex/base/fntguide.pdf})
%
% \bibitem[\pkg{fontspec}]{fontspec}
%   Will Robertson,
%   \emph{The \pkg{fontspec} package: Font selection for \xe\LaTeX\ and Lua\LaTeX},
%   11~May 2024.
%   (\ctanpkgurl{fontspec})
%
% \bibitem[\pkg{luaotfload}]{luaotfload}
%   \LaTeX3 Project, \'Elie Roux, Khaled Hosny, Philipp Gesang, Ulrike Fischer, Marcel Kr\"uger,
%   \emph{The \pkg{luaotfload} package},
%   14~February 2024.
%   (\ctanpkgurl{luaotfload})
%
% \bibitem[\pkg{pdfcprot}]{pdfcprot}
%   Carsten Schurig, Tobias Schlemmer, \emph{The \pkg{pdfcprot}|.sty| package},
%   10 June 2005.
%   (\ctanpkgurl{pdfcprot})
%
% \bibitem[\pkg{soul}]{soul}
%   [Melchior Franz,] Heiko Oberdiek, \emph{The \pkg{soul} package},
%   14 June 2023.
%   (\ctanpkgurl{soul}).
%
%\end{thebibliography}
%
%
%\section{Changes}
%\changes{v1.5}{2004/12/11}{add `Short history'}
%
% The comprehensive list of changes can be found in the Implementation part,
% appendix~\ref{sec:changes}.
% The following is a list of all changes relevant in the user land; bug and
% compatibility fixes are swept under the rug. Numbers in brackets indicate
% the relevant section in this manual.
%
%\newenvironment{History}
%  {\list\labelitemi
%   {\leftmargin 0pt
%    \parsep 0pt
%    \def\refsection##1{[##1]}
%    \def\makelabel##1{\hss\llap{\color{sectioning}##1}}}}
%  {\endlist}
%\newcommand\Version[2]{
%  \VersionDate{#1}{#2}
%  \vskip\topsep
%  \pagebreak[2]
%  \item[\textsf{\bfseries\color{sectioning}#1}]\textsf{\bfseries\color{sectioning}(#2)}
%  \vskip\topsep
%  \nopagebreak}
%\newcommand\VersionDate[2]{^^A needed in the Change history
%  \global\expandafter\def\csname MTversiondate#1\endcsname{#2}^^A
%  \immediate\write\histtmp{\string\VersionDate{#1}{#2}}}
%
%\newwrite          \histtmp
%\immediate\openout \histtmp=microtype-hist.tmp
%
%\begin{History}
%
%\VersionDate{\expandafter\@gobble\fileversion}{\filedate}
%
%\Version{3.2}{2024/12/12}
%  \item Support for tracking/letterspacing with \xetex\
%        \refsection{\ref{sub:options-microtype}, \ref{sub:tracking}, \ref{sec:lettersp}}
%  \item New default for letterspacing: \MT@letterspace@default\space \refsection{\ref{sub:options-tracking}}
%  \item New key `\texttt{features}' for \cs{SetTracking} to enable\slash disable
%        \pkg{fontspec} `Ligatures' features (\luatex/\xetex\ only)
%        \refsection{\ref{sub:tracking}}
%  \item New values `|none|' and `|all|' for the `|no ligatures|' key of
%        \cs{SetTracking} \refsection{\ref{sub:tracking}}
%
%\VersionDate{3.1b}{2024/03/29}
%
%\VersionDate{3.1a}{2023/03/13}
%
%\Version{3.1}{2023/03/06}
%  \item New command \cs{DeclareMicrotypeFilePrefix} to change the prefix of the
%        configuration files \refsection{\ref{sub:config-file}}
%  \item New protrusion patch |verbatim| to switch off protrusion
%        and expansion in |verbatim| environments \refsection{\ref{sec:pedantic}}
%
%\VersionDate{3.0f}{2022/06/23}
%
%\VersionDate{3.0e}{2022/06/20}
%
%\VersionDate{3.0d}{2022/03/14}
%
%\VersionDate{3.0c}{2022/02/22}
%
%\VersionDate{3.0b}{2021/12/10}
%
%\VersionDate{3.0a}{2021/12/02}
%
%\Version{3.0}{2021/10/31}
%  \item New option \opt{disable}, replacing the |draft| option; deprecate option |final|
%        \refsection{\ref{sub:options-misc}}
%  \item Possibility of automatical protrusion based on difference of character widths
%        \refsection{\ref{sub:inheritance}}
%  \item New commands \cs{leftprotrusion} and \cs{rightprotrusion};
%        various patches to get protrusion right \refsection{\ref{sec:pedantic}}
%  \item New package \pkg{microtype-show} for visual debugging of protrusion settings
%        \refsection{\ref{sec:contrib}}
%  \item Protrusion settings for New Computer Modern (OpenType)
%  \item Protrusion settings for <EB> Garamond (OpenType)
%  \item New generic protrusion settings for \luatex/\xetex\ \refsection{\ref{sec:caveats}}
%  \item Move development to \href{\githuburl}{GitHub}
%
%\VersionDate{2.8c}{2021/03/14}
%
%\VersionDate{2.8b}{2021/02/25}
%
%\VersionDate{2.8a}{2021/02/22}
%
%\Version{2.8}{2020/12/07}
%  \item New default font sets for expansion and spacing: `|alltext-nott|'
%        \refsection{\ref{sec:font-sets}, table~\ref{tab:predefined-font-sets}}
%
%\VersionDate{2.7d}{2019/11/18}
%
%\VersionDate{2.7c}{2019/10/10}
%
%\VersionDate{2.7b}{2019/02/28}
%
%\VersionDate{2.7a}{2018/01/14}
%
%\Version{2.7}{2017/07/07}
%  \item Allow automatic expansion and letterspacing with \luatex\ in <DVI> mode
%        (aka. \texttt{dvilualatex})
%        \refsection{\ref{sub:options-microtype}, \ref{sub:options-expansion}, table~\ref{tab:available-features}}
%^^A \item Compatibility with \LaTeX\ 2017/01/01 (fix warnings)
%
%\VersionDate{2.6a}{2016/05/14}
%
%\Version{2.6}{2016/05/01}
%  \item Support for \luatex\ $\geq$ 0.85
%  \item Improvements for tracking/letterspacing with \luatex\
%        (|Renderer=Basic| no longer required)
%  \item New font sets: `|alltext-nott|', `|allmath-nott|'
%        \refsection{\ref{sec:font-sets}, table~\ref{tab:predefined-font-sets}}
%
%\VersionDate{2.5a}{2013/05/23}
%
%\Version{2.5}{2013/03/13}
%  \item Support for the \cite{fontspec} package, viz.
%        for OpenType fonts with \luatex\ and \xetex
%  \item Support for protrusion with \xetex\ $\geq$ 0.9997
%  \item Support for tracking/letterspacing with \luatex\ $\geq$ 0.62
%  \item Allow context-sensitive setup with \luatex
%  \item Info instead of warning if protrusion settings are generic
%  \item Protrusion settings for Latin Modern Roman (OpenType)
%  \item Protrusion settings for Charis SIL (OpenType)
%  \item Protrusion settings for Palatino Linotype (OpenType)
%
%\Version{2.4}{2010/01/10}
% ^^A \item |lua| functions moved to a dedicated file
%  \item Protrusion settings for <T2A> encoded Minion
%
%\Version{2.3e}{2009/11/09}
%  \item Support for the Cyrillic <T2A> encoding (protrusion, expansion, spacing)
%
%\Version{2.3d}{2009/03/27}
%  \item New default for expansion option `\opt{step}': 1, if \pdftex\ $\geq$ 1.40
%        \refsection{\ref{sub:options-expansion}}
%
%\Version{2.3c}{2008/11/11}
%  \item Support for \luatex\ enabled by default
%
%\VersionDate{2.3b}{2008/06/04}
%
%\VersionDate{2.3a}{2008/02/29}
%
%\Version{2.3}{2007/12/23}
%  \item New option `\opt{verbose}|=silent|' to turn all warnings into mere messages
%        \refsection{\ref{sub:options-misc}}
%  \item New key `|outer kerning|' for \cs{SetTracking} to customise outer kerning
%        \refsection{\ref{sub:tracking}}
%  \item Adjust protrusion settings for tracking even if protrusion is not enabled
%  \item The \letterspace\ package also works with \pkg{eplain} or \pkg{miniltx}
%        \refsection{\ref{sec:lettersp}}
%
%\Version{2.2}{2007/07/14}
%  \item Improvements to tracking/letterspacing: retain kerning (\pdftex\ $\geq$ 1.40.4);
%        automatically adjust protrusion settings
%  \item Possibility to expand a font with different parameters (\pdftex\ $\geq$ 1.40.4)
%    ^^A ; new option `\opt{copyfonts}'
%        \refsection{\ref{sub:expansion}}
%  \item New key `|no ligatures|' for \cs{SetTracking} to disable selected or
%        all ligatures (\pdftex\ $\geq$ 1.40.4)
%        \refsection{\ref{sub:tracking}}
%  \item New keys `|spacing|' and `|outer spacing|' for \cs{SetTracking} to
%        customise interword spacing
%        \refsection{\ref{sub:tracking}}
%  \item New command \cs{DeclareMicrotypeVariants} to specify variant suffixes
%        \refsection{\ref{sub:config-file}}
%  \item New command \cs{textmicrotypecontext} as a wrapper for \cs{microtypecontext}
%        \refsection{\ref{sec:context}}
%  \item New optional argument for \cs{DisableLigatures} to disable selected ligatures
%        \refsection{\ref{sec:disable-ligatures}}
%  \item Protrusion settings for Bitstream Letter Gothic
%^^A  \item Basic support for \luatex\ (if generated with the |lua| option)
%
%\Version{2.1}{2007/01/21}
%  \item New command \cs{lslig} to protect ligatures in letterspaced text
%        \refsection{\ref{sec:lettersp}}
%
%\Version{2.0}{2007/01/14}
%  \item Support for the new extensions of \pdftex\ $\geq$ 1.40:
%        tracking/letterspacing, additional kerning, and adjustment of
%        interword spacing (glue)
%        (new commands \cs{SetTracking}, \cs{SetExtraKerning}, \cs{SetExtraSpacing};
%         new options `\opt{tracking}', `\opt{kerning}', `\opt{spacing}')
%        \refsection{\ref{sub:tracking}, \ref{sub:kerning}, \ref{sub:spacing}}
%  \item New commands \cs{textls} and \cs{lsstyle} for letterspacing,
%        new option `\opt{letterspace}'
%        \refsection{\ref{sub:options-tracking}, \ref{sec:lettersp}}
%  \item New option `\opt{babel}' for automatic micro-typographic adjustment to
%        the selected language
%        \refsection{\ref{sub:options-misc}, \ref{sec:context}}
%  \item New font sets: `|smallcaps|', `|footnotesize|', `|scriptsize|'
%        \refsection{\ref{sec:font-sets}, table~\ref{tab:predefined-font-sets}}
%  \item New package `\letterspace' providing the commands for robust and
%        hyphenatable letterspacing
%        \refsection{\ref{sec:lettersp}}
%
%\VersionDate{1.9f}{2006/09/09}
%
%\Version{1.9e}{2006/07/28}
%  \item New key `|inputenc|' to specify the lists' input encodings
%        \refsection{\ref{sec:fine-tuning}}
%  \item Protrusion settings for Euler math fonts
%
%\Version{1.9d}{2006/05/05}
%  \item Support for the Central European <QX> encoding
%        (protrusion, inheritance)
%  \item Protrusion settings for various Euro symbol fonts (Adobe, <ITC>, \pkg{marvosym})
%  \item Support for Unicode input in the configuration (\pkg{inputenc}/|utf8|)
%
%\Version{1.9c}{2006/02/02}
%  \item Protrusion settings for <URW> Garamond
%
%\VersionDate{1.9b}{2006/01/20}
%
%\Version{1.9a}{2005/12/05}
%  \item Defer setup until the end of the preamble
%   ^^A ; consequently, no need to
%   ^^A   change font defaults before loading \microtype, or to put it the other
%   ^^A   way round, \microtype\ may now be loaded at any time
%   ^^A ; new option `\opt{defersetup}'
%  \item Inside the preamble, \cs{microtypesetup} accepts all package options
%        \refsection{\ref{sub:options-cmd}}
%  \item Protrusion settings for <T5> encoded Charter
%
%\Version{1.9}{2005/10/28}
%  \item New command \cs{microtypecontext} to change the configuration context;
%        new key `|context|' for the configuration commands
%        \refsection{\ref{sec:context}}
%  \item New command \cs{DisableLigatures} to disable ligatures
%        (\pdftex\ $\geq$ 1.30)
%        \refsection{\ref{sec:disable-ligatures}}
%  \item New key `|font|' to add single fonts to the font sets
%        \refsection{\ref{sec:font-sets}}
%  \item New key `|preset|' to set all characters to the specified value before
%        loading the lists
%  \item Value `|relative|' renamed to `|character|' for `|unit|' keys
%  \item Support for the Polish <OT4> encoding (protrusion, expansion, inheritance)
%  \item Support for the Vietnamese <T5> encoding (protrusion, expansion, inheritance)
%^^A  \item `\opt{DVIoutput}' option will work with \texlive\ 2004
%
%\Version{1.8}{2005/06/23}
%^^A  \item If font substitution has occurred, the settings for the substitute will
%^^A        be used instead of those for the selected font
%  \item New option `\opt{config}' to load a different configuration file
%        \refsection{\ref{sub:options-misc}}
%  \item New command \cs{DeclareMicrotypeSetDefault} to declare the default font sets
%        \refsection{\ref{sec:font-sets}}
%  \item New option `\opt{unit}' to measure protrusion factors relative to a
%        dimension instead of the character width
%        \refsection{\ref{sub:protrusion}}
%  \item Renamed commands from \cmd{\..MicroType..} to \cmd{\..Microtype..}
%  \item Protrusion settings for <AMS> math fonts
%^^A  \item Protrusion settings for Times in <LY1> encoding completed
%  \item The `|allmath|' font set also includes <U> encoding
%^^A  \item 8-bit characters in the configuration finally work as advertised,
%^^A        even if made active by the \pkg{csquotes} package
%  \item Support for protrusion with the \pkg{ledmac} package (\pdftex\ $\geq$ 1.30)
%
%\Version{1.7}{2005/03/23}
%  \item Possibility to specify ranges of font sizes in the set declarations
%        \refsection{\ref{sec:font-sets}, \ref{sec:fine-tuning}}
%^^A  \item Always take font size into account when trying to find protrusion resp.
%^^A        expansion settings for a given font
%^^A        \refsection{\ref{sec:fine-tuning}}
%  \item New command \cs{LoadMicrotypeFile} to load a configuration file manually
%        \refsection{\ref{sub:config-file}}
%  \item New command \cs{Microtype@Hook} for font package authors
%        \refsection{Implementation, \ref{sub:hook}}
%  \item New option `\opt{verbose}|=errors|' to turn all warnings into errors
%^^A  \item Disable expansion inside \cmd\showhyphens
%  \item Warning when running in disable mode
%
%\VersionDate{1.6a}{2005/02/02}
%
%\Version{1.6}{2005/01/24}
%  \item When \pdftex\ is too old to expand fonts automatically, expansion
%        has to be enabled explicitly, automatic expansion will be disabled
%        \refsection{\ref{sub:options-microtype}}
%  \item New option `\opt{factor}' to influence protrusion resp. expansion of
%        all characters of a font or font set
%        \refsection{\ref{sub:options-protrusion}, \ref{sec:fine-tuning}}
%^^A  \item Protrusion settings of digits improved
%  \item Use \etex\ extensions, if available
%
%\Version{1.5}{2004/12/15}
%  \item When output mode is <DVI>, font expansion has to be enabled explicitly,
%        automatic expansion will be disabled
%        \refsection{\ref{sub:options-microtype}}
%  \item New option `\opt{selected}' to enable selected expansion,
%        default: |false|
%        \refsection{\ref{sub:options-expansion}, \ref{sub:expansion}}
%  \item New default for expansion option `\opt{step}': 4 (min(\opt{stretch},\opt{shrink})/5)
%        \refsection{\ref{sub:options-expansion}}
%  \item Protrusion settings for Bitstream Charter
%
%\VersionDate{1.4b}{2004/11/26}
%^^A\Version{1.4b}{2004/11/26}
%^^A  \item \cs{UseMicrotypeSet} requires the set to be declared
%^^A        \refsection{\ref{sec:font-sets}}
%
%\VersionDate{1.4a}{2004/11/17}
%
%\Version{1.4}{2004/11/12}
%  \item Set up fonts independently from \LaTeX\ font loading
%^^A        (therefore, no risk of overlooking fonts anymore, and the package may
%^^A        be loaded at any time)
%^^A  \item \cs{microtypesetup} now sets the correct level of protrusion
%^^A        \refsection{\ref{sub:options-cmd}}
%^^A  \item New option: `\opt{final}'
%^^A        \refsection{\ref{sub:options-misc}}
%
%\VersionDate{1.3}{2004/10/27}
%
%\Version{1.2}{2004/10/03}
%  \item New font sets: `|allmath|' and `|basicmath|'
%        \refsection{\ref{sec:font-sets}, table~\ref{tab:predefined-font-sets}}
%  \item Protrusion settings for Computer Modern Roman math symbols
%^^A  \item Protrusion settings for <TS1> encoding completed for Computer Modern
%^^A        Roman and Adobe Garamond
%^^A  \item If an alias font name is specified, it will be used as an alternative,
%^^A        not as a replacement \refsection{\ref{sub:config-file}}
%
%\Version{1.1}{2004/09/21}
%  \item New command: \cs{DeclareCharacterInheritance}
%        \refsection{\ref{sub:inheritance}}
%  \item Characters may also be specified as octal or hexadecimal numbers
%        \refsection{\ref{sec:fine-tuning}}
%  \item Protrusion settings for Adobe Minion
%^^A  \item Configuration file names in lowercase [\ref{sub:config-file}]
%
%\Version{1.0}{2004/09/11}
%  \item First <CTAN> release
%\end{History}
%
%\immediate\closeout\histtmp
%
%\fi ^^A ifcodedoc
%
%
%\def\AppendixSettings{
%  \ifcodedoc
%    \addtocontents{toc}{\protect\pagebreak} ^^A layout
%    \addtolength\textwidth{50pt}
%    \addtolength{\oddsidemargin}{-50pt}
%    \setlength{\columnwidth}{\textwidth}
%    \setlength{\hsize}{\textwidth}
%    \setlength{\linewidth}{\textwidth}
%    \newpage
%    \footnotesize
%  \else
%    \small
%  \fi
%}
%
%\def\LPPLSettings{
%\changes{v1.9e}{2006/06/13}{include <LPPL>}
%  \let\LPPLicense\empty
%  \def\endLPPLicense{\endmulticols\endgroup}
%  \def\LPPLsection##1{\begin{multicols}{2}[\section{##1}][12\baselineskip]}
%  \def\LPPLsubsection##1{\end{multicols}\begin{multicols}{2}[\subsection*{##1}][6\baselineskip]}
%  \def\LPPLsubsubsection{\subsubsection*}
%  \let\LPPLparagraph\textit
%  \let\LPPLfile\file
%  \def\textsc##1{\acronym{\MakeUppercase{##1}}}
%  \lstset{gobble=2,basicstyle=\MacroFont\tiny,commentstyle=,aboveskip=\smallskipamount}
%  \let\oldmakeatletter\makeatletter
%  \long\def\makeatletter##1\makeatother{\let\makeatletter\oldmakeatletter}
%  \MakePercentComment
%}
%
%\StopEventually{
%  \GeneralChanges{Documentation}
%  \ifx\Finale\relax
%    \AppendixSettings
%  \fi
%  \PrintIndex
%}
%
% \GeneralChanges*
%
% ^^A =========================================================================
%
% ^^A Heiko Oberdiek's fix from latexbugs (latex/3540):
%\begingroup
%  \def\x\begingroup#1\@nil{\endgroup
%    \def\DoNotIndex{\begingroup
%      \@tfor\@tempa:=\#\$\&\^\_\|\~\ \<\do{\expandafter\@makeother\@tempa}#1}}
%\expandafter\x\DoNotIndex\@nil
%\def\PercentIndex{}\def\LeftBraceIndex{}\def\RightBraceIndex{}
% ^^A also index new ifs:
%\def\@newif{newif}\newif\if@newif
%\def\macro@finish{\macro@namepart
%  \ifx\macro@namepart\@newif\@tempswatrue\else\@tempswafalse\fi
%  \ifnot@excluded
%    \edef\@tempa{\noexpand\SpecialIndex{\bslash\macro@namepart}}\@tempa
%  \fi
%  \if@newif
%    \edef\@tempa{\noexpand\SpecialMainIndex
%       {\bslash\expandafter\@gobbletwo\macro@namepart true}}\@tempa
%    \edef\@tempa{\noexpand\SpecialMainIndex
%       {\bslash\expandafter\@gobbletwo\macro@namepart false}}\@tempa
%  \fi
%  \if@tempswa\@newiftrue\else\@newiffalse\fi
%}
%
%\DoNotIndex{\!,\",\',\(,\),\*,\+,\,,\-,\.,\/,\:,\;,\<,\=,\>,\?,\[,\\,\],\`,
%  \#,\$,\&,\^,\_,\|,\~,\ ,
%  \advance,\afterassignment,\aftergroup,\begingroup,\bgroup,\catcode,\char,
%  \chardef,\clubpenalty,\csname,\def,\divide,\edef,\egroup,\else,\endcsname,\endgroup,
%  \endinput,\escapechar,\everypar,\expandafter,\fi,\futurelet,\gdef,\global,
%  \hbadness,\hbox,\hfill,\hrule,\hsize,\hskip,\if,\ifcase,\ifcat,\ifdim,\iffalse,\ifhbox,
%  \ifhmode,\ifmmode,\ifnum,\iftrue,\ifvbox,\ifx,\ignorespaces,\immediate,\input,
%  \inputlineno,\interlinepenalty,\jobname,\kern,\lastbox,\lastkern,\lastskip,\lccode,
%  \leaders,\let,\long,\lowercase,\maxdimen,\meaning,\multiply,\newlinechar,\noexpand,
%  \noindent,\number,\or,\parfillskip,\pretolerance,\relax,\setbox,\showboxdepth,
%  \splittopskip,\string,\the,\tolerance,\tracingmacros,\unhbox,\unkern,\unskip,
%  \unvbox,\uppercase,\vbadness,\vbox,\vfuzz,\vrule,\vsplit,\vss,\wd,\widowpenalty,
%  \write,\xdef}
%^^A\DoNotIndex{\font,\fontdimen,\fontname,\nullfont,\sfcode,\spacefactor,
%^^A  \spaceskip,\xspaceskip}                                                ^^A tex
%\DoNotIndex{\currentgrouplevel,\currentgrouptype,\currentiflevel,\detokenize,
%  \dimexpr,\eTeXversion,\ifcsname,\ifdefined,\lastnodetype,\numexpr,\protected,
%  \unexpanded}
%^^A\DoNotIndex{\fontcharwd,\iffontchar}                                     ^^A e-tex
%\DoNotIndex{\pdfannot,\pdfmatch,\pdfstrcmp,\pdftexrevision,\pdftexversion}
%^^A\DoNotIndex{\(ef,lp,rp,kn(ac,bc),(kn,sh,st)bs)code,\(left,right)marginkern,
%^^A  \tagcode,\letterspacefont,\pdfcopyfont,\pdffontexpand,\pdfnoligatures,
%^^A  \pdfprotrudechars,\pdfadjust(interwordglue,spacing),\pdf(ap,pre)pendkern,
%^^A  \pdfoutput,\pdftracingfonts}                                           ^^A pdftex
%\DoNotIndex{\XeTeXversion,\XeTeXrevision,\strcmp}
%^^A\DoNotIndex{\XeTeXcharglyph,\XeTeXfonttype,\XeTeXglyph,\XeTeXglyphindex,
%^^A  \XeTeXglyphname,\XeTeXlastfontchar,\XeTeXprotrudechars}                ^^A xetex
%\DoNotIndex{\directlua,\glet,\luatexversion,\pdfextension,\pdffeedback}
%^^A\DoNotIndex{\adjustspacing,\copyfont,\expandglyphsinfont,
%^^A  \ignoreligaturesinfont,\outputmode,\protrudechars,\tracingfonts}       ^^A luatex
%\DoNotIndex{\eplain,\usepkg@pkg}                                            ^^A eplain
%\DoNotIndex{\@backslashchar,\@car,\@cclvi,\@changed@cmd,\@classoptionslist,
%  \@current@cmd,\@currext,\@currname,\@defaultunits,\@empty,\@@enc@update,
%  \@eqnnum,\@expandtwoargs,\@firstofone,\@firstoftwo,\@footnotetext,\@gobble,
%  \@gobbletwo,\@ifclassloaded,\@ifl@t@r,\@ifl@aded,\@ifnextchar,\@ifpackagelater,
%  \@ifpackageloaded,\@ifstar,\@ifundefined,\@item,\@let@token,\@m,\@M,\@makeother,
%  \@minus,\@mpfootnotetext,\@nameuse,\@ne,\@newlistfalse,\@nil,\@nnil,\@onelevel@sanitize,
%  \@onlypreamble,\@plus,\@ptionlist,\@removeelement,\@secondoftwo,\@spaces,\@sptoken,
%  \@tempa,\@tempb,\@tempc,\@tempcnta,\@tempcntb,\@tempdima,\@typeset@protect,
%  \@undefined,\@unprocessedoptions,\@unusedoptionlist,\@xobeysp,\check@icr,
%  \color@begingroup,\color@endgroup,\g@addto@macro,\hmode@bgroup,\m@ne,\maybe@ic,
%  \maybe@ic@,\nfss@text,\not@math@alphabet,\on@line,\p@,\set@display@protect,
%  \strip@prefix,\strip@pt,\@text@composite,\tw@,\@verbatim,\z@,\z@skip,\zap@space,
%  \active,\bfseries,\documentclass,\dotfill,\em,\emph,\fbox,\fboxrule,\fboxsep,\fmtversion,
%  \fontseriesforce,\fontshapeforce,\footnotesize,\huge,\Huge,\itshape,\large,\Large,
%  \LARGE,\leavevmode,\llap,\makeatletter,\makebox,\marginparsep,\mathrm,\mbox,\mdseries,
%  \medskip,\newbox,\newcommand,\newcount,\newdimen,\newif,\newline,\newskip,\newtoks,
%  \nobreak,\nonfrenchspacing,\normalbaselineskip,\normalshape,\normalsize,\numberline,
%  \obeylines,\par,\parbox,\providecommand,\quad,\raggedright,\renewcommand,\rmfamily,
%  \scalebox,\sffamily,\scriptsize,\scshape,\slshape,\small,\space,\sscshape,\strut,\swshape,
%  \textbf,\textit,\textmd,\textnormal,\textrm,\textsc,\textsf,\textsl,\textssc,\textsw,
%  \textulc,\textup,\textwidth,\texttt,\tiny,\tracingnone,\ttfamily,\upshape,\ulcshape,
%  \usefont,\tiny,\AddToHook,\AtBeginDocument,\AtEndOfPackage,\CheckCommand,\CurrentOption,
%  \DeclareOption,\DeclareRobustCommand,\IfFileExists,\IfFormatAtLeastTF,\InputIfFileExists,
%  \MakeLowercase,\MakeUppercase,\MakeTitlecase,\MessageBreak,\PackageError,\PackageInfo,
%  \PackageWarning,\PassOptionsToPackage,\ProcessOptions,\RawNoindent,\RequirePackage,
%  \UnicodeEncodingName}
%^^A\DoNotIndex{\add@accent,\cf@encoding,\curr@fontshape,\define@newfont,
%^^A  \do@subst@correction,\f@encoding,\f@family,\f@size,\font@name,\fontencoding,
%^^A  \fontseries,\fontshape,\glb@currsize,\glb@settings,\normalfont,\pickup@font,
%^^A  \remove@tlig,\selectfont,\seriesdefault,\shapedefault,\set@fontsize,\showhyphens}  ^^A latex
%\DoNotIndex{\ExplSyntaxOff,\ExplSyntaxOn}                                   ^^A latex3
%\DoNotIndex{\normalpdfoutput,\normalpdftexversion,\normalpdftexrevision}    ^^A tex live 2004
%\DoNotIndex{\alltt}                                                         ^^A alltt
%\DoNotIndex{\eqref,\tagform@}                                               ^^A amsmath
%\DoNotIndex{\foreign@language,\languagename,\select@language,\shorthandoff} ^^A babel
%\DoNotIndex{\percentsign}                                                   ^^A babel/spanish,galician,mexican
%\DoNotIndex{\beamer@@callorigitem,\beamer@callorigitem,
%  \beamer@framefootnotetext}                                                ^^A beamer
%\DoNotIndex{\cb@end,\ltx@footnotetext,\ltx@mpfootnotetext}                  ^^A changebar
%\DoNotIndex{\CJK@ifundefined,\CJK@plane,\CJK@temp,\CJK@addcmap}             ^^A CJK,CJKutf8
%\DoNotIndex{\color}                                                         ^^A color
%\DoNotIndex{\csqQQ,\csq@bqgroup,\csq@eqgroup,\@disablequotes,
%  \enquote,\foreignquote,\foreigntextquote,\foreigntextcquote,
%  \hyphenquote,\hyphentextquote,\hyphentextcquote,\textquote,\textcquote}   ^^A csquotes
%\DoNotIndex{\meta}                                                          ^^A doc
%\DoNotIndex{\apptocmd,\gappto,\ifdefdimen,\ifdefmacro,\ifdefparam,\patchcmd}^^A etoolbox
%\DoNotIndex{\fnb@fnstart,\fnb@orig@footnotetext}                            ^^A fnbreak
%\DoNotIndex{\txfigures,\lnfigures,\tbfigures,\prfigures,\fontfigurestyle,
%  \fontfigurealignment,\fontbasefamily,\figureversion,\textfigures,
%  \liningfigures,\tabularfigures,\proportionalfigures}                      ^^A fontaxes
%\DoNotIndex{\addfontfeature,\addfontfeatures,\strong}                       ^^A fontspec
%\DoNotIndex{\hyper@@anchor,\hyper@nopatch@footnote,\Hy@footnote@currentHref,
% \ifHy@hyperfootnotes,\ifHy@implicit,\pdfstringdefDisableCommands,
% \pdfstringdefWarn}                                                         ^^A hyperref
%\DoNotIndex{\theequationdis,\theIEEEsubequationdis}                         ^^A IEEEtran
%\DoNotIndex{\ifpdf,\ifetex,\ifluatex,\ifxetex}                              ^^A ifpdf/iftex
%\DoNotIndex{\@inpenc@undefined@,\IeC,\inputencoding,\inputencodingname}     ^^A inputenc
%^^A\DoNotIndex{\UTFviii@defined,\UTF@four@octets@noexpand,                  ^^A inputenc/utf8
%^^A            \UTF@three@octets@noexpand,\UTF@two@octets@noexpand,
%^^A            \UTFviii@four@octets,\UTFviii@three@octets,\UTFviii@two@octets}
%\DoNotIndex{\PrerenderUnicode,\unicode@charfilter}                          ^^A inputenc/utf8x
%\DoNotIndex{\define@key,\KV@@sp@def,\setkeys}                               ^^A keyval
%\DoNotIndex{\KOMAClassName,\setuptoc,\unsettoc,\scr@saved@footnotetext}     ^^A koma (tocbasic)
%\DoNotIndex{\l@dunhbox@line}                                                ^^A ((r)e)ledmac,((r)e)ledpar
%\DoNotIndex{\lst@ProcessLetter}                                             ^^A listings
%\DoNotIndex{\cs,\marg,\oarg,\parg}                                          ^^A ltxdoc
%\DoNotIndex{\newluafunction}                                                ^^A luatexbase
%\DoNotIndex{\tistyle,\ltstyle,\ofstyle,\altstyle,\regstyle,\embossstyle,
% \ornamentalstyle,\qtstyle,\shstyle,\tmstyle,\tvstyle,\swashstyle,
% \lnstyle,\osstyle,\instyle,\sustyle,\lstyle,\ostyle,\pstyle,\tstyle,
% \plstyle,\postyle,\tlstyle,\tostyle,\scolshape,\olshape,\sishape,\ushape,
% \scushape,\uishape,\rishape,\dfshape,\swstyle,\nwwidth,\cdwidth,\ecwidth,
% \ucwidth,\etwidth,\epwidth,\exwidth,\uxwidth,\regwidth,\mbweight,\dbweight,
% \sbweight,\ebweight,\ubweight,\lgweight,\elweight,\ulweight,
% \textti,\textlt,\textof,\textalt,\textreg,\emboss,\textorn,\ornament,
% \textqt,\textsh,\texttm,\texttv,\textswash,\textln,\textos,\textin,\textsu,
% \textl,\texto,\textp,\textt,\textpl,\textpo,\texttl,\textto,\textol,\textsi,
% \textu,\textscu,\textui,\textri,\textdf,\textnw,\textcd,\textec,\textuc,
% \textet,\textep,\textex,\textux,\textrw,\textmb,\textdb,\textsb,\texteb,
% \textub,\textlg,\textel,\textul}                                           ^^A nfssext-cfr
%\DoNotIndex{\booknumberline,\chapternumberline,\foottextfont,\partnumberline,
%  \cftbookafterpnum,\cftchapterafterpnum,\cftfigureafterpnum,\cftparagraphafterpnum,
%  \cftpartafterpnum,\cftsectionafterpnum,\cftsubparagraphafterpnum,\cftsubsectionafterpnum,
%  \cftsubsubsectionafterpnum,\cfttableafterpnum}                            ^^A memoir
%\DoNotIndex{\pdf@escapestring}                                              ^^A pdftexcmds
%\DoNotIndex{\py@macron}                                                     ^^A pinyin
%\DoNotIndex{\polyglossia@language@switched}                                 ^^A polyglossia
%\DoNotIndex{\SK@eqnnum,\SK@tagform@}                                        ^^A showkeys
%\DoNotIndex{\@topic@item}                                                   ^^A simplecv
%\DoNotIndex{\SOUL@,\SOUL@doword,\soulregister}                              ^^A soul
%\DoNotIndex{\tikz@expandcount}                                              ^^A tikz
%\DoNotIndex{\conditionally@traceoff}                                        ^^A trace
%\DoNotIndex{\@vwid@sift,\sift@deathcycles,\@vwid@resetb,\@vwid@loff,\@vwid@measure}^^A varwidth
%\DoNotIndex{\@xspace,\@xspace@firsttrue}                                    ^^A xspace
%\DoNotIndex{\frakfamily,\gothfamily,\swabfamily,\textfrak,\textgoth,\textswab}^^A yfonts
%\DoNotIndex{\x,\MT@dinfo,\MT@dinfo@nl,\tracingmicrotype,\tracingmicrotypeinpdf,
%  \ifMT@inannot,\MT@inannottrue,\MT@inannotfalse,\MT@addto@annot,\MT@pdf@annot,
%  \MT@show@pdfannot,\iftracingmicrotypeinpdfall,\tracingmicrotypeinpdfalltrue,
%  \tracingmicrotypeinpdfallfalse,\DeclareMicroTypeAlias,\DeclareMicroTypeSet,
%  \LoadMicroTypeFile,\UseMicroTypeSet,\MicroType@Hook}                      ^^A microtype
%
% ^^A -------------------------------------------------------------------------
%
%\newpage
%\ImplementationSettings
%\ifpdf\hypersetup{bookmarksopen=false}\fi
%
%\section{Implementation}
%
% The \pkg{docstrip} modules in this file are:
% \begin{description}
%  \item[|driver|]  The documentation driver, only visible in the \file{dtx} file.
%  \item[|package|] The code for the \microtype\ package (\file{microtype.sty}).
%  \item[|show|] The code for the \pkg{microtype-show} package (\file{microtype-show.sty}).
%  \item[|pdf-|] Definitions specific to \pdftex\ (\file{microtype-pdftex.def}).
%  \item[|lua-|] Definitions specific to \luatex\ (\file{microtype-luatex.def}).
%  \item[|xe-|] Definitions specific to \xetex\ (\file{microtype-xetex.def}).
%  \item[|letterspace|] The code for the \letterspace\ package (\file{letterspace.sty}).
%   \begin{description}
%    \item[|plain|]  Code for \pkg{eplain}, \pkg{miniltx} (\letterspace\ only).
%   \end{description}
%  \item[|debug|]  Code for additional output in the log file.
%                 \\Used for -- surprise! -- debugging purposes.
%  \item[|luafile|] Lua functions (\file{microtype.lua}).
%  \item[|config|]  Surrounds all configuration modules.
%   \begin{description}
%    \item[|cfg-t|]  Surrounds (Latin) text configurations.
%     \begin{description}
%      \item[|m-t|]   The main configuration file (\file{microtype.cfg}).
%      \item[|bch|]   Settings for Bitstream Charter (\file{mt-bch.cfg}).
%      \item[|blg|]   Settings for Bitstream Letter Gothic (\file{mt-blg.cfg}).
%      \item[|cmr|]   Settings for Computer Modern Roman (\file{mt-cmr.cfg}).
%      \item[|ebg|]   Settings for <EB> Garamond (\file{mt-EBGaramond.cfg}).
%      \item[|ppl|]   Settings for Palatino (\file{mt-ppl.cfg}).
%      \item[|ptm|]   Settings for Times (\file{mt-ptm.cfg}).
%      \item[|pmn|]   Settings for Adobe Minion (\file{mt-pmn.cfg}).
%                    \\Contributed by \contributor Harald Harders <h.harders\at tu-bs.de>.
%      \item[|ugm|]   Settings for <URW> Garamond (\file{mt-ugm.cfg}).
%     \end{description}
%    \item[|cfg-u|]  Surrounds non-text configurations (<U> encoding).
%     \begin{description}
%      \item[|msa|]   Settings for <AMS> `a' symbol font (\file{mt-msa.cfg}).
%      \item[|msb|]   Settings for <AMS> `b' symbol font (\file{mt-msb.cfg}).
%      \item[|euf|]   Settings for Euler Fraktur font (\file{mt-euf.cfg}).
%      \item[|eur|]   Settings for Euler Roman font (\file{mt-eur.cfg}).
%      \item[|eus|]   Settings for Euler Script font (\file{mt-eus.cfg}).
%     \end{description}
%    \item[|cfg-e|]  Surrounds Euro symbol configurations.
%     \begin{description}
%      \item[|zpeu|]  Settings for Adobe Euro symbol fonts (\file{mt-zpeu.cfg}).
%      \item[|mvs|]   Settings for \pkg{marvosym} Euro symbol (\file{mt-mvs.cfg}).
%     \end{description}
%   \end{description}
%  \item[|test|]    A helper file that may be used to create and test
%                    protrusion settings\\(\file{test-microtype.tex}).
% \end{description}
% And now for something completely different.
%
%    \begin{macrocode}
%<*package|letterspace>
%    \end{macrocode}
%
%\subsection{Preliminaries}
%
%\begin{macro}{\MT@MT}
% This is us.
%    \begin{macrocode}
\def\MT@MT
%<package>  {microtype}
%<letterspace>  {letterspace}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@fix@catcode}
%\changes{v1.3}{2004/10/27}{check some category codes (compatibility with \pkg{german})}
%\changes{v1.5}{2004/12/03}{reset catcode of `\texttt{\^}' (compatibility with \pkg{chemsym})}
%\changes{v2.3a}{2007/12/29}{fix catcodes earlier, and also for the \letterspace\ package}
% We have to make sure that the category codes of some characters are correct
% (the \pkg{german} package, for instance, makes |"| active). Probably overly
% cautious. Ceterum censeo: it should be forbidden for packages to change
% catcodes within the preamble.
%\begin{macro}{\MT@restore@catcodes}
% Polite as we are, we'll restore them afterwards.
%    \begin{macrocode}
\let\MT@restore@catcodes\@empty
%    \end{macrocode}
%\end{macro}
%    \begin{macrocode}
\def\MT@fix@catcode#1#2{%
  \edef\MT@restore@catcodes{%
    \MT@restore@catcodes
    \catcode#1=\the\catcode#1\relax
  }%
  \catcode#1=#2\relax
}
\MT@fix@catcode{17}{14}% ^^Q (comment)
\MT@fix@catcode{24} {9}% ^^X (ignore)
%<package>\MT@fix@catcode{33}{12}% !
%<package>\MT@fix@catcode{34}{12}% "
\MT@fix@catcode{36} {3}% $ (math shift)
\MT@fix@catcode{39}{12}% '
\MT@fix@catcode{42}{12}% *
\MT@fix@catcode{43}{12}% +
\MT@fix@catcode{44}{12}% ,
\MT@fix@catcode{45}{12}% -
\MT@fix@catcode{58}{12}% :
\MT@fix@catcode{60}{12}% <
\MT@fix@catcode{61}{12}% =
\MT@fix@catcode{62}{12}% >
%<package>\MT@fix@catcode{63}{12}% ?
\MT@fix@catcode{94} {7}% ^ (superscript)
\MT@fix@catcode{96}{12}% `
%<package>\MT@fix@catcode{124}{12}% |
%    \end{macrocode}
%\end{macro}
% These are all commands for the outside world. We define them here as blank
% commands, so that they won't generate an error if we are not running \pdftex.
%    \begin{macrocode}
%<*package>
\newcommand*\DeclareMicrotypeSet[3][]{}
\newcommand*\UseMicrotypeSet[2][]{}
\newcommand*\DeclareMicrotypeSetDefault[2][]{}
\newcommand*\SetProtrusion[3][]{}
\newcommand*\SetExpansion[3][]{}
\newcommand*\SetTracking[3][]{}
\newcommand*\SetExtraKerning[3][]{}
\newcommand*\SetExtraSpacing[3][]{}
\newcommand*\DisableLigatures[2][]{}
\newcommand*\DeclareCharacterInheritance[3][]{}
\newcommand*\DeclareMicrotypeVariants[1]{}
\newcommand*\DeclareMicrotypeAlias[2]{}
\newcommand*\LoadMicrotypeFile[1]{}
\newcommand*\DeclareMicrotypeFilePrefix[1]{}
\newcommand*\DeclareMicrotypeBabelHook[2]{}
\newcommand*\microtypesetup[1]{}
\newcommand*\microtypecontext[1]{}
\newcommand*\textmicrotypecontext[2]{#2}
\newcommand\leftprotrusion[1]{#1}
\newcommand\rightprotrusion[1]{#1}
\providecommand*\noprotrusion{}
\newcommand*\noprotrusionifhmode{}
\@ifpackageloaded{letterspace}{\let\MT@textls\relax}{%
%</package>
\newcommand*\lsstyle{}
\newcommand\textls[2][]{}
\def\textls#1#{}
\newcommand*\lslig[1]{#1}
%<*package>
}
%    \end{macrocode}
% These commands also have a starred version.
%    \begin{macrocode}
\def\DeclareMicrotypeSet#1#{\@gobbletwo}
\def\DeclareMicrotypeVariants#1#{\@gobble}
%    \end{macrocode}
% Set declarations are only allowed in the preamble (resp. the main
% configuration file). The configuration commands, on the other hand, must be
% allowed in the document, too, since they may be called inside font
% configuration files, which, in principle, may be loaded at any time.
%    \begin{macrocode}
\@onlypreamble\DeclareMicrotypeSet
\@onlypreamble\UseMicrotypeSet
\@onlypreamble\DeclareMicrotypeSetDefault
\@onlypreamble\DisableLigatures
\@onlypreamble\DeclareMicrotypeVariants
\@onlypreamble\DeclareMicrotypeBabelHook
\@onlypreamble\DeclareMicrotypeFilePrefix
%    \end{macrocode}
% Don't load \letterspace.
%    \begin{macrocode}
\expandafter\let\csname ver@letterspace.sty\endcsname\@empty
%    \end{macrocode}
%\begin{macro}{\MT@old@cmd}
% The old command names had one more hunch (|\..MicroType..|).
% Before finally letting them sink into oblivion, raise an error.
%\changes{v1.8}{2005/04/28}{renamed commands from \cmd{\..MicroType..} to \cmd{\..Microtype..}}
%\changes{v3.0}{2021/04/10}{old command names will raise an error}
%    \begin{macrocode}
\def\MT@old@cmd#1#2{%
  \newcommand*#1{\MT@error{%
    \string#1 is deprecated. Please use\MessageBreak
    \string#2 instead}{As I said}%
    \let #1#2#2}}
%    \end{macrocode}
%\end{macro}
%    \begin{macrocode}
\MT@old@cmd\DeclareMicroTypeAlias\DeclareMicrotypeAlias
\MT@old@cmd\DeclareMicroTypeSet  \DeclareMicrotypeSet
\MT@old@cmd\UseMicroTypeSet      \UseMicrotypeSet
\MT@old@cmd\LoadMicroTypeFile    \LoadMicrotypeFile
%</package>
%    \end{macrocode}
%\begin{macro}{\MT@warning}
%\begin{macro}{\MT@warning@nl}
%\begin{macro}{\MT@info}
%\begin{macro}{\MT@info@nl}
%\begin{macro}{\MT@vinfo}
%\changes{v1.6}{2005/01/06}{new macro instead of \cs{ifMT@verbose}}
%\begin{macro}{\MT@error}
%\begin{macro}{\MT@warn@err}
%\changes{v1.7}{2005/03/16}{new macro: for \opt{verbose}\texttt{\quotechar=errors}}
% Communicate.
%    \begin{macrocode}
\def\MT@warning{\PackageWarning\MT@MT}
\def\MT@warning@nl#1{\MT@warning{#1\@gobble}}
%<*package>
\def\MT@info{\PackageInfo\MT@MT}
\def\MT@info@nl#1{\MT@info{#1\@gobble}}
\let\MT@vinfo\@gobble
\def\MT@error{\PackageError\MT@MT}
\def\MT@warn@err#1{\MT@error{#1}{%
  This error message appears because you loaded the `\MT@MT'\MessageBreak
  package with the option `verbose=errors'. Consult the documentation\MessageBreak
  in \MT@MT.pdf to find out what went wrong.}}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%
%\subsubsection{Debugging}
%
%\begin{macro}{\tracingmicrotype}
%\begin{macro}{\MT@dinfo}
%\begin{macro}{\MT@dinfo@nl}
% Cases for \cs{tracingmicrotype}:
%\begin{enum}
%  \item almost none
%  \item + sets \& lists
%  \item + heirs
%  \item + slots
%  \item + factors
%\end{enum}
%    \begin{macrocode}
%<*debug>
\MT@warning@nl{This is the debug version}
\newcount\tracingmicrotype
\tracingmicrotype=2
\def\MT@info#1{\PackageInfo\MT@MT{#1}\MT@addto@annot{#1}}
\def\MT@info@nl#1{\PackageInfo\MT@MT{#1\@gobble}\MT@addto@annot{#1}}
\let\MT@vinfo\MT@info@nl
\def\MT@warning#1{\PackageWarning\MT@MT{#1}\MT@addto@annot{Warning: #1}}
\def\MT@warning@nl#1{\PackageWarning\MT@MT{#1\@gobble}\MT@addto@annot{Warning: #1}}
\def\MT@dinfo#1#2{\ifnum\tracingmicrotype<#1 \else\MT@info{#2}\fi}
\def\MT@dinfo@nl#1#2{\ifnum\tracingmicrotype<#1 \else\MT@info@nl{#2}\fi}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\tracingmicrotypeinpdf}
%\changes{v2.0}{2006/09/21}{new debug method: mark all fonts with <PDF> annotations}
% Another debug method: font switches can be marked in the <PDF> file with a
% small caret, an accompanying popup text box displaying all debug messages.
%
% Cases for \cs{tracingmicrotypeinpdf}:
%\begin{enum}[1]
%  \item show new fonts
%  \item + show known fonts
%\end{enum}
%    \begin{macrocode}
\newcount\tracingmicrotypeinpdf
%    \end{macrocode}
%\end{macro}
%\ifpdf\ifx\tracingmicrotypeinpdf\undefined
% \fallbacktext{If \file{microtype.sty} had been generated with the `|debug|'
%   option,\\this method would be demonstrated here.}
%\else
% Let's see how it works~\dots\ (if you don't see anything special on this page,
% your <PDF> viewer doesn't support annotations).
%\begin{verbatim}
%\tracingmicrotypeinpdf=2
%\end{verbatim}
%\tracingmicrotypeinpdf=2
%\fi\fi
%\begin{macro}{\MT@pdf@annot}
%\begin{macro}{\MT@addto@annot}
%\begin{macro}{\ifMT@inannot}
% During font setup, we save the text for the popup in \cs{MT@pdf@annot}.
% (This requires \pdftex\ $\geq$~1.30.)
% The \pkg{pdftexcmds} package provides \pdftex's utility commands in \luatex, too.
%\changes{v2.3d}{2009/02/27}{use \pkg{pdftexcmds} for debugging}
%    \begin{macrocode}
\RequirePackage{pdftexcmds}
\newif\ifMT@inannot \MT@inannottrue
\let\MT@pdf@annot\@empty
\def\MT@addto@annot#1{\ifnum\tracingmicrotypeinpdf>\z@ \ifMT@inannot
  {\def\MessageBreak{^^J\@spaces}%
   \MT@xadd\MT@pdf@annot{\pdf@escapestring{#1^^J}}}\fi\fi}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\iftracingmicrotypeinpdfall}
% With \cs{tracingmicrotypeinpdfallfalse}, the <PDF> output is (hopefully)
% identical, but some font switches will not be displayed; otherwise the output
% is affected, but \emph{all} font switches are visible. In the latter case, we
% also insert a small kern so that multiple font switches are discernable.
%    \begin{macrocode}
\newif\iftracingmicrotypeinpdfall
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@show@pdfannot}
% A red caret is shown for fonts which are actually set up by
% {\ifpdf\ifx\tracingmicrotypeinpdf\undefined\else\fontfamily{pzc}\itshape\fi\fi
%  Microtype},
% a green one marks fonts that we have already seen. The |/Caret| annotation
% requires a viewer for <PDF> version 1.5 (you could use |/Text| if you're
% using an older <PDF> viewer).
%    \begin{macrocode}
\ifx\directlua\@undefined \else
  \protected\def\pdfannot{\pdfextension annot }\fi
\def\MT@show@pdfannot#1{%
  \ifnum\tracingmicrotypeinpdf<#1 \else
    \iftracingmicrotypeinpdfall\leavevmode\fi
    \pdfannot height 4pt width 4pt depth 2pt {%
      /Subtype/Caret
      /T(\expandafter\string\font@name)
      \ifcase#1\or
      /Subj(New font)/C[1 0 0]
      \else
      /Subj(Known font)/C[0 1 0]
      \fi
      /Contents(\MT@pdf@annot)
    }%
    \iftracingmicrotypeinpdfall\kern1pt \fi
    \global\MT@inannotfalse
  \fi
}
%</debug>
%</package>
%</package|letterspace>
%    \end{macrocode}
%\end{macro}
%\ifpdf\ifx\tracingmicrotypeinpdf\undefined\else
% \tracingmicrotypeinpdf0
% \tracingmicrotype0
%\fi\fi
%
%\subsubsection{Visual debugging}
%
%\changes{v3.0}{2021/06/02}{new package: \pkg{microtype-show} for visual debugging}
% The \pkg{microtype-show} package offers some tools for preparing
% protrusion settings. We make use of the \microtype\ infrastructure,
% redefining some of its internal commands (done later,
% in sections \ref{ssub:setup-prot} and \ref{ssub:setup-config}).
% First, some preparation:
%    \begin{macrocode}
%<*show>
\RequirePackage{iftex}
\ifetex\else
  \PackageError{microtype-show}
               {This package only works with e-TeX}{Use e-TeX}
\fi
\ifxetex
  \PackageError{microtype-show}
               {This package only works with pdfTeX or luaTeX}{Don't use XeTeX}
\fi
\PackageWarning{microtype-show}{DO NOT USE THIS PACKAGE FOR REAL DOCUMENTS\@gobble}
\DeclareOption*{\PassOptionsToPackage{\CurrentOption}{microtype}}
\ProcessOptions\relax
\PassOptionsToPackage{verbose}{microtype}
\RequirePackage{microtype,graphicx,xcolor}
%    \end{macrocode}
%\begin{macro}{\ifShowGlyphIndex}
%\begin{macro}{\ifShowMissingGlyphs}
%\begin{macro}{\GlyphScaleFactor}
%\begin{macro}{\Showbaselinecolor}
%\begin{macro}{\Showposcolor}
%\begin{macro}{\Shownegcolor}
% The following commands are configurable:
%    \begin{macrocode}
\newif\ifShowGlyphIndex
\newif\ifShowMissingGlyphs
\newcommand*\GlyphScaleFactor{2}
\newcommand*\Showbaselinecolor{\color{black!40}}
\newcommand*\Showposcolor{\color{green!50}}
\newcommand*\Shownegcolor{\color{red!50}}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\MTS@printtext}
%\begin{macro}{\MTS@show@index}
%\begin{macro}{\MTS@crulefill}
% Make sure to have a readable font.
%    \begin{macrocode}
\ifluatex
  \def\MTS@printtext#1{{\usefont{TU}{lmr}{m}{n}#1}}
\else
  \def\MTS@printtext#1{{\usefont{T1}{cmr}{m}{n}#1}}
\fi
\def\MTS@show@index#1{\ifShowGlyphIndex{\tiny$_{#1}%
 %  \ifluatex^{\mathrm{%
 %    \MT@lua{tex.print(luaotfload.aux.name_of_slot(tonumber([[#1]])))}}}\fi
  $}\fi\space}
\def\MTS@crulefill{\leaders\hrule height \dimexpr1ex/2+.4pt depth -\dimexpr1ex/2\hfill}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\MTS@Prot}
%\begin{macro}{\MTS@Char}
% Add the |show| commands to \microtype's setup.
%    \begin{macrocode}
\g@addto@macro\MT@setupfont{\MTS@Prot\MTS@Char}
\let\MTS@Prot\relax
\let\MTS@Char\relax
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\begin{macro}{\MTS@setup}
%\begin{macro}{\MTS@glyphlist}
% Common setup. \cs{MTS@glyphlist} stores all glyphs we've seen.
%    \begin{macrocode}
\def\MTS@setup{%
  \fboxsep=0pt
  \fboxrule=.1pt
  \raggedright
  \let\MTS@glyphlist\@gobble
  \def\MT@feat{pr}%
}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\begin{macro}{\ShowProtrusion}
% Activate the sleeper command, then trigger the setup.
%    \begin{macrocode}
\newcommand*\ShowProtrusion{%
  \begingroup
    \MTS@setup
    \let\MTS@Prot\MTS@Prot@do
    \def\MT@cat{c}%
    \selectfont
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MTS@Prot@do}
% But in all other cases of a font being picked up, there should
% be no special treatment. After we're done, select the previous
% font again.
%    \begin{macrocode}
\def\MTS@Prot@do{%
    \MT@ltx@pickupfont
    \let\MT@pr@split@val\MTS@pr@split@val
    \let\MT@load@list\MTS@load@list
    \let\MT@set@pr@prefixes@\MTS@set@pr@prefixes@
    \MTS@show@pr
  \endgroup
  \aftergroup\selectfont
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\ShowCharacterInheritance}
%    \begin{macrocode}
\newcommand*\ShowCharacterInheritance{%
  \begingroup
    \MTS@setup
    \let\MTS@Char\MTS@Char@do
    \def\MT@cat{inh}%
    \selectfont
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MTS@Char@do}
%    \begin{macrocode}
\def\MTS@Char@do{%
    \MT@ltx@pickupfont
    \let\MT@set@pr@prefixes@\MTS@set@pr@prefixes@
    \MTS@show@inheritance
  \endgroup
  \aftergroup\selectfont
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\ShowProtrusionLineGlyph}
% By glyph.
%    \begin{macrocode}
\newcommand*\ShowProtrusionLineGlyph[1]{%
  {\MTS@setup
   \MTS@showprotrusionline{`#1}}%
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\ShowProtrusionLineIndex}
% By glyph number.
%    \begin{macrocode}
\newcommand*\ShowProtrusionLineIndex[1]{%
  {\MTS@setup
   \MTS@showprotrusionline{#1}}%
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MTS@showprotrusionline}
%\begin{macro}{\MTS@lpcode}
%\begin{macro}{\MTS@rpcode}
%    \begin{macrocode}
\def\MTS@showprotrusionline#1{%
  \edef\MTS@lpcode{\number\lpcode\font#1}%
  \edef\MTS@rpcode{\number\rpcode\font#1}%
  \char#1%
    lorem ipsum dolor sit amet, \MTS@crulefill\ %
    \MTS@printtext{\ifnum\MTS@lpcode=\z@\Showbaselinecolor\fi[\MTS@lpcode]}
    \fbox{\char#1}\MTS@show@index{\number#1}
    \MTS@printtext{\ifnum\MTS@rpcode=\z@\Showbaselinecolor\fi[\MTS@rpcode]}
    \MTS@crulefill\ you know the rest%
  \char#1\par
  \ShowDummyLine
}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\ShowDummyLine}
% The first and last glyphs in this line should have a straight (non-protruded) shape.
% We also reset to default shape and series, because that's what, say, italic shapes
% should be matched with.
%    \begin{macrocode}
\newcommand*\ShowDummyLine{%
 {\fontencoding{\encodingdefault}\fontseries{\seriesdefault}\fontshape{\shapedefault}%
  \selectfont\noindent
  here is the beginning of a line, \dotfill and here is its end}\par
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\ShowProtrusionAll}
%    \begin{macrocode}
\newcommand*\ShowProtrusionAll{%
  {\MTS@setup
   \MTS@lede{}%
   \MT@do@font{\iffontchar\font\@tempcnta\MTS@showprotrusionline{\@tempcnta}\fi}}%
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\ShowProtrusionDefined}
%    \begin{macrocode}
\newcommand*\ShowProtrusionDefined{%
  {\MTS@setup
   \MTS@lede{defined}%
   \let\MTS@first\@gobble
   \let\MTS@second\@firstofone
   \MT@do@font{%
     \MTS@firstorsecond
     \MTS@temp{%
       \iffontchar\font\@tempcnta\MTS@showprotrusionline{\@tempcnta}\else
         \MT@warning@nl{Glyph \the\@tempcnta\space is missing in font
                        \MessageBreak\font@name}%
       \fi}}}%
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\ShowProtrusionMissing}
%    \begin{macrocode}
\newcommand*\ShowProtrusionMissing{%
  {\MTS@setup
   \MTS@lede{missing}%
   \let\MTS@first\@firstofone
   \let\MTS@second\@gobble
   \MT@do@font{%
     \MTS@firstorsecond
     \iffontchar\font\@tempcnta\MTS@temp{\MTS@showprotrusionline{\@tempcnta}}\fi}}%
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MTS@lede}
%    \begin{macrocode}
\def\MTS@lede#1{%
  \selectfont
  \edef\MTS@font{\expandafter\string\font@name}%
  \MTS@printtext{All glyphs \MT@ifempty{#1}{in}{#1 in protrusion list for}
                 font \texttt{\MTS@font}:}\par
  \ShowDummyLine
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MTS@firstorsecond}
%    \begin{macrocode}
\def\MTS@firstorsecond{%
  \let\MTS@temp\MTS@first
  \ifnum\lpcode\font\@tempcnta=\z@ \else
    \let\MTS@temp\MTS@second
  \fi
  \ifnum\rpcode\font\@tempcnta=\z@ \else
    \let\MTS@temp\MTS@second
  \fi
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MTS@charwd}
%\begin{macro}{\MTS@lp@}
%\begin{macro}{\MTS@rp@}
%\begin{macro}{\MTS@show@char@pr}
% Display the glyph with protrusion.
%    \begin{macrocode}
\newdimen\MTS@charwd
\newdimen\MTS@lp@
\newdimen\MTS@rp@
\def\MTS@show@char@pr#1{%
  \xdef\MTS@glyphlist{\MTS@glyphlist,#1}%
  \scalebox{\GlyphScaleFactor}{\strut\escapechar`\\
    \MTS@charwd=\fontcharwd\MT@font#1\relax
%    \end{macrocode}
% The baseline rule.
%    \begin{macrocode}
    {\Showbaselinecolor\vrule width \dimexpr\MTS@charwd+.3em\relax height 1sp depth 0pt}%
    \hskip-\dimexpr\MTS@charwd+.15em\relax
%    \end{macrocode}
% Left protrusion.
%    \begin{macrocode}
    {\ifdim\MTS@lp@<\z@\Shownegcolor\else\Showposcolor\fi
     \vrule width \ifdim\MTS@lp@<\z@ -\fi\MTS@lp@ height 1em depth .2em}%
    \hskip\dimexpr\MTS@charwd\ifdim\MTS@lp@>\z@-\MTS@lp@\fi
                             \ifdim\MTS@rp@>\z@-\MTS@rp@\fi\relax
%    \end{macrocode}
% Right protrusion.
%    \begin{macrocode}
    {\ifdim\MTS@rp@<\z@\Shownegcolor\else\Showposcolor\fi
     \vrule width \ifdim\MTS@rp@<\z@ -\fi\MTS@rp@ height 1em depth .2em}%
    \hskip-\dimexpr\MTS@charwd+\fboxrule\ifdim\MTS@rp@<\z@-\MTS@rp@\fi\relax
%    \end{macrocode}
% Finally the glyph, so that it's on top.
%    \begin{macrocode}
    \fbox{\char#1}}\,%
    \MTS@show@index{#1}%
}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\MTS@show@char}
%\begin{macro}{\MTS@show@char@x}
% Just show the glyph; the second command also remembers it.
%    \begin{macrocode}
\def\MTS@show@char#1{\scalebox{\GlyphScaleFactor}{%
  \strut\fbox{\char#1}}\MTS@show@index{#1}}
\def\MTS@show@char@x#1{\xdef\MTS@glyphlist{\MTS@glyphlist,#1}\MTS@show@char{#1}}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\begin{macro}{\MTS@show@missing}
%    \begin{macrocode}
\def\MTS@show@missing{%
  \MT@ifdefined@c@T\MT@pr@inh@name{%
    \MTS@lp@=\z@ \MTS@rp@=\z@
    \par \MTS@printtext{Glyphs not included in configuration (with defined heirs):}%
    \MT@do@font{%
      \edef\MT@temp{\the\@tempcnta}%
      \MT@ifdefined@n@T{MT@inh@\MT@pr@inh@name @\MT@temp @}{%
        \MT@exp@one@n\MT@in@clist\MT@temp\MTS@glyphlist
        \ifMT@inlist@\else \newline
        \llap{\MTS@show@char@pr{\MT@temp} \MTS@printtext{=} }%
         \MT@exp@cs\MT@map@tlist@c
           {MT@inh@\MT@pr@inh@name @\the\@tempcnta @}%
           \MTS@show@char@x
        \fi
      }%
    }%
  }%
  \MTS@show@missing@
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MTS@show@missing@}
%    \begin{macrocode}
\def\MTS@show@missing@{%
  \par \MTS@printtext{Other glyphs not in configuration:}\newline
  \MT@do@font{%
    \edef\MT@temp{\the\@tempcnta}%
    \MT@exp@one@n\MT@in@clist\MT@temp\MTS@glyphlist
    \ifMT@inlist@\else
      \MTS@show@char\MT@temp
    \fi
  }%
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MTS@show@inheritance}
%    \begin{macrocode}
\def\MTS@show@inheritance{%
  \MT@get@inh@list
  \MTS@printtext{Character inheritance for font `\texttt{\MT@@font}':}\\
  \MT@ifdefined@c@TF\MT@listname{%
    \MTS@printtext{First matching list is for `\texttt{\@tempa}':\\
              \texttt{\MT@listname}:}\par\leavevmode
    \MT@do@font{%
      \MT@ifdefined@n@T{MT@inh@\MT@listname @\the\@tempcnta @}{%
        \newline
        \xdef\MTS@glyphlist{\MTS@glyphlist,\the\@tempcnta}%
        \llap{\MTS@show@char{\the\@tempcnta}\MTS@printtext{= }}%
        \MT@exp@cs\MT@map@tlist@c
          {MT@inh@\MT@listname @\the\@tempcnta @}%
          \MTS@show@char@x
      }%
    }%
    \MT@ifdefined@n@T{MT@inh@\MT@listname @prefixes}{%
      \par \MTS@printtext{(with prefixes:)}%
      \@tempcntb=\z@
      \let\MTS@show@char@pr\MTS@show@char@x
      \MT@set@pr@prefixheirs}%
    \ifShowMissingGlyphs\MTS@show@missing@\fi
  }{%
    \MTS@printtext{NOT DEFINED}%
  }%
  \par
}
%</show>
%    \end{macrocode}
%\end{macro}
%
%\subsubsection{Requirements}
%
% Back to the user packages.
%
%\begin{macro}{\MT@plain}
% The \letterspace\ package works with:
%\begin{enum}
%\changes{v2.3}{2007/11/07}{\letterspace: support for \pkg{eplain}/\pkg{miniltx}}
%  \item \pkg{miniltx}
%  \item \pkg{eplain} ^^A tested with eplain v3.1, 2006/12/03; v3.2, 2007/11/26; v3.3, 2009/07/21
%  \item \LaTeX
%\end{enum}
% For plain usage, we have to copy some commands from \file{latex.ltx}.
%    \begin{macrocode}
%<*package|letterspace>
%<*plain>
\def\MT@plain{2}
\ifx\documentclass\@undefined
  \def\MT@plain{1}
  \def\hmode@bgroup{\leavevmode\bgroup}
  \def\nfss@text#1{{\mbox{#1}}}
  \let\@typeset@protect\relax
  \ifx\eplain\@undefined
    \def\MT@plain{0}
    \def\PackageWarning#1#2{%
      \begingroup
        \newlinechar=10 %
        \def\MessageBreak{^^J(#1)\@spaces\@spaces\@spaces\@spaces}%
        \immediate\write16{^^JPackage #1 Warning: #2\on@line.^^J}%
      \endgroup
    }
    \def\on@line{ on input line \the\inputlineno}
    \def\@spaces{\space\space\space\space}
  \fi
\fi
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@requires@latex}
%\changes{v2.3b}{2008/05/26}{new macro}
% Better use groups than plain ifs.
%    \begin{macrocode}
\def\MT@requires@latex#1{%
  \ifnum\MT@plain<#1 \expandafter\@secondoftwo\else\expandafter\@firstoftwo\fi
}
%</plain>
%    \end{macrocode}
%\end{macro}
%\changes{v2.2}{2007/05/01}{use catcode trickery for \etex\ test}
%^^A\changes{v2.3a}{2007/12/29}{removed} ^^A \MT@maybe@etex
%\changes{v2.8}{2020/05/26}{\letterspace\ works with \etex\ only}
% For definitions that depend on \etex\ features.
%    \begin{macrocode}
\ifcase 0%
  \ifx\eTeXversion\@undefined 1\else
    \ifx\eTeXversion\relax    1\else
      \ifcase\eTeXversion     1\fi
    \fi
  \fi
\else
  \catcode`\^^Q=9 \catcode`\^^X=14
\fi
%<letterspace>^^Q\MT@warning@nl{This package requires the etex extensions.
%<letterspace>^^Q               \MessageBreak Exiting}\MT@restore@catcodes\endinput
%<debug>\MT@dinfo@nl{0}{this is
%<debug>^^Q not
%<debug>  etex}
%    \end{macrocode}
%\changes{v2.5}{2010/05/05}{new files: \file{microtype-pdftex.def}, \file{microtype-xetex.def}, \file{microtype-luatex.def},
%                           containing engine-specific definitions}
% We check whether we are running \pdftex, \xetex, or \luatex, and
% load the appropriate definition file (later in section~\ref{ssub:def-files}).
%\begin{macro}{\MT@clear@options}
% If we are using neither of these engines, or a too old version, we disable everything and exit.
%    \begin{macrocode}
\def\MT@clear@options{%
%<plain>  \MT@requires@latex1{%
  \AtEndOfPackage{\let\@unprocessedoptions\relax\MT@restore@catcodes}%
  \let\CurrentOption\@empty
%<plain>  }\relax
}
%    \end{macrocode}
%\end{macro}
%\changes{v1.9}{2005/08/29}{compatibility with \texlive\ hack
%               (reported by \contributor Herbert Vo\ss{} <Herbert.Voss\at gmx.net>)}
%                                      ^^A MID: <deprh8$c69$00$1@news.t-online.com>
% A hack circumventing the \texlive\ 2004 hack which undefines the \pdftex\
% primitives in the format in order to hide the fact that \pdftex\ is being run
% from the user. This has been \emph{fixed} in \texlive\ 2005.
%    \begin{macrocode}
\ifx\normalpdftexversion\@undefined \else
  \let\pdftexversion \normalpdftexversion
  \let\pdftexrevision\normalpdftexrevision
  \let\pdfoutput     \normalpdfoutput
\fi
%    \end{macrocode}
%\begin{macro}{\MT@engine}
%\changes{v2.6}{2016/03/25}{fix test with \luatex\ 0.85}
%\begin{macro}{\ifMT@engine@unfit}
%\begin{macro}{\MT@engine@minversion}
% Old packages might have let \cmd\pdftexversion\ to \cmd\relax.
%    \begin{macrocode}
\let\MT@engine\relax
\newif\ifMT@engine@unfit
\MT@engine@unfittrue
\ifx\pdftexversion\@undefined \else
  \ifx\pdftexversion\relax \else
    \def\MT@engine{pdf}
%<package>    \def\MT@engine@minversion{0.14f}
%<letterspace>    \let\MT@pdf@or@lua\@firstoftwo
    \ifnum\pdftexversion
%<package>        > 13
%<letterspace>        > 139
      \MT@engine@unfitfalse
%<package>      \ifnum \pdftexversion=14
%<package>        \ifnum \expandafter`\pdftexrevision < `f
%<package>          \MT@engine@unfittrue
%<package>        \fi
%<package>      \fi
    \fi
  \fi
\fi
\ifx\directlua\@undefined \else
  \ifx\directlua\relax \else
    \def\MT@engine{lua}
    \MT@engine@unfitfalse
%    \end{macrocode}
% Since approx. \luatex\ 0.80, \cmd\pdftexversion\ is let to \cmd\luatexversion,
% so that we would be fooled into thinking that \pdftex\ is too old.
%    \begin{macrocode}
%<*letterspace>
    \let\MT@pdf@or@lua\@secondoftwo
    \ifnum\luatexversion < 62 \MT@engine@unfittrue
    \else
      \let\MT@lua\directlua
      \ifnum\luatexversion > 84
        \let\pdfoutput\outputmode
        \let\pdfprotrudechars\protrudechars
        \let\pdfadjustspacing\adjustspacing
      \fi
    \fi
%</letterspace>
  \fi
\fi
%<*package>
\ifx\MT@engine\relax
  \ifx\XeTeXversion\@undefined \else
    \ifx\XeTeXversion\relax \else
      \def\MT@engine{xe}
      \def\MT@engine@minversion{0.9997}
      \ifdim 0\XeTeXrevision pt > 0.9996pt
        \MT@engine@unfitfalse
      \fi
    \fi
  \fi
\fi
%</package>
%</package|letterspace>
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\MT@pdftex@no}
%\changes{v1.6a}{2005/02/02}{new macro}
% \pdftex's features for which we provide an interface here haven't always been
% available, and some specifics have changed over time. Therefore, we have to
% test which \pdftex\ we're using, if any. \cs{MT@pdftex@no} will be used
% throughout the package to respectively do the right thing.
% Currently, we have to distinguish the following cases for \pdftex:
%\begin{enum}
%  \item not running \pdftex
%  \item \pdftex\ ($\less$~0.14f) (already checked above)
%  \item + micro-typographic extensions (0.14f,g)
%  \item + protrusion relative to \EM{1} ($\geq$~0.14h)
%  \item + automatic font expansion;
%          protrusion no longer has to be set up first;
%          scale factor fixed to 1000;
%          default \cmd\efcode\,=\,1000 ($\geq$~1.20)
%  \item + \cmd{\(left,right)marginkern};
%\changes{v1.8}{2005/04/15}{case 5: \pdftex\ 1.30}
%          \cmd\pdfnoligatures;
%          \cmd\pdfstrcmp;
%          \cmd\pdfescapestring\ ($\geq$~1.30)
%  \item + adjustment of interword spacing;
%\changes{v2.0}{2005/08/20}{case 6: \pdftex\ 1.40} ^^A (beta:1)
%          extra kerning;
%          \cmd\letterspacefont;
%          \cmd\pdfmatch\footnote{This command was actually introduced
%           in 1.30, but failed on strings longer than 1023 bytes.};
%          \cmd\pdftracingfonts;
%          always \etex\
%          ($\geq$~1.40)
%  \item + \cmd\letterspacefont\ doesn't disable ligatures and kerns;
%\changes{v2.2}{2007/02/23}{case 7: \pdftex\ 1.40.4}
%          \cmd\pdfcopyfont\
%          ($\geq$~1.40.4)
%  \item + \cmd\letterspacefont\ uses explicit \fontdim6 if specified
%\changes{v3.0}{2021/07/01}{case 8: \pdftex\ 1.40.23}
%          ^^A https://git.texlive.info/texlive/commit/?id=1c7ff5528e10e989ba7ea7b72182d5f34d4d4e29
%          ($\geq$~1.40.23)
%\end{enum}
%\changes{v1.1}{2004/09/13}{fix: version check
%               (reported by \contributor Harald Harders <h.harders\at tu-bs.de>)}
%                                                   ^^A private mail, 2004/09/13
%    \begin{macrocode}
%<*pdf->
%<debug>\MT@dinfo@nl{0}{this is pdftex \the\pdftexversion(\pdftexrevision)}
\def\MT@pdftex@no{8}
\ifnum\pdftexversion = 140
  \ifnum\pdftexrevision < 23
    \def\MT@pdftex@no{7}
    \ifnum\pdftexrevision < 4
      \def\MT@pdftex@no{6}
    \fi
  \fi
\else
  \ifnum\pdftexversion < 140
    \def\MT@pdftex@no{5}
    \ifnum\pdftexversion < 130
      \def\MT@pdftex@no{4}
      \ifnum\pdftexversion < 120
        \def\MT@pdftex@no{3}
        \ifnum\pdftexversion = 14
          \ifnum \expandafter`\pdftexrevision < `h
            \def\MT@pdftex@no{2}
          \fi
        \fi
      \fi
    \fi
  \fi
\fi
%<debug>\MT@dinfo@nl{0}{pdftex no.: \MT@pdftex@no}
%</pdf->
%    \end{macrocode}
%\end{macro}
%\changes{v2.5}{2010/05/05}{protrusion with \xetex}
%\begin{macro}{\MT@xetex@no}
% \xetex\ supports character protrusion since version 0.9997.
% This test is not necessary here, we just keep it for the
% (unlikely) case that features get added to \xetex\ in the
% future.
%    \begin{macrocode}
%<*xe->
%<debug>\MT@dinfo@nl{0}{this is xetex (\the\XeTeXversion\XeTeXrevision)}
%\ifdim 0\XeTeXrevision pt < 0.9997pt
%  \def\MT@xetex@no{1}
%\else
%  \def\MT@xetex@no{2}
%\fi
%<debug>%\MT@dinfo@nl{0}{xetex no.: \MT@xetex@no}
%</xe->
%    \end{macrocode}
%\end{macro}
%\changes{v2.3c}{2008/09/09}{\luatex\ supported by default}
%\begin{macro}{\MT@luatex@no}
% Cases for \luatex\
% (\cmd\luatexversion\ ought to have been enabled by the format):
%\begin{enum}
% \item N/A
% \item \luatex\ ($\less$~0.36)
% \item + \cmd\directlua\ without state number ($\geq$~0.36)
% \item + \cmd\letterspacefont; non-automatic expansion doesn't work anymore,
%         and automatic expansion in <DVI> mode is realised by modifying the tracking,
%         not the glyphs\footnote{This may have been changed earlier, but I'm no longer able
%               to find out when (the last version that actually works for me is 0.40).}
%         ($\geq$~0.62)
% \item + almost all of the \pdftex\ primitives have been renamed ($\geq$~0.85)
% \item + default \cmd\efcode\,=\,1000;
%         \cmd\protrusionboundary\ [doesn't seem to work] ($\geq$~0.90)
%\todo{interface for \cmd\protrusionboundary}
% \item + \cmd\glet ($\geq$~1.10)
%\end{enum}
%\changes{v2.6}{2016/04/22}{update for \luatex\ 0.85 (renamed primitives)}
% Also, sometime between 1.0.4 and 1.0.7, the function |font.setexpansion|
% has been introduced (but we're not using it for now).
%    \begin{macrocode}
%<*lua->
%<debug>\MT@dinfo@nl0{this is luatex (\the\luatexversion)}
%    \end{macrocode}
%\begin{macro}{\MT@lua}
% Communicate with |lua|.
%\changes{v2.2}{2007/05/10}{(basic) support for \luatex}
% Beginning with \luatex\ 0.36, \cmd\directlua\ no longer requires a state
% number.
%\changes{v2.3d}{2009/03/25}{update for \luatex\ 0.36}
%    \begin{macrocode}
\let\MT@lua\directlua
\def\MT@luatex@no{6}
\ifnum\luatexversion<110
  \def\MT@luatex@no{5}
  \ifnum\luatexversion<90
    \def\MT@luatex@no{4}
    \ifnum\luatexversion<85
      \def\MT@luatex@no{3}
      \ifnum\luatexversion<62
        \def\MT@luatex@no{2}
        \ifnum\luatexversion<36
          \def\MT@lua{\directlua0}
          \def\MT@luatex@no{1}
        \fi
      \fi
    \fi
  \fi
\fi
%    \end{macrocode}
%\end{macro}
%    \begin{macrocode}
%<debug>\MT@dinfo@nl{0}{luatex no.: \MT@luatex@no}
%</lua->
%    \end{macrocode}
%\end{macro}
% Abort if no capable engine found.
%\changes{v3.0a}{2021/11/10}{abort earlier if no capable engine found}
%    \begin{macrocode}
%<*package|letterspace>
\ifMT@engine@unfit
  \MT@warning@nl{You
    \ifx\MT@engine\relax
      don't seem to be using pdftex%
%<package>      , luatex or xetex%
%<letterspace>      \space or luatex%
     .\MessageBreak `\MT@MT' only works with these engines.%
    \else
      are using a \MT@engine tex version older than
%<package>       \MT@engine@minversion
%<letterspace>      \MT@pdf@or@lua{1.40}{0.62}%
     .\MessageBreak `\MT@MT' does not work with this version.%
      \MessageBreak Please install a newer version of \MT@engine tex.%
    \fi
    \MessageBreak I will quit now}
  \MT@clear@options
\endinput\fi
%    \end{macrocode}
% Still there? Then we can begin:
% We need the \pkg{keyval} package, including the `new' \cmd\KV@@sp@def\
% implementation.
%\changes{v2.1}{2007/01/15}{fix: \letterspace\ package forgot to load \pkg{keyval}}
% For the \opt{patch} option, we use \pkg{etoolbox}, which requires \etex.
%\changes{v3.0}{2021/05/17}{require package \pkg{etoolbox} (for \opt{patch} option)}
%    \begin{macrocode}
\RequirePackage{keyval}[1997/11/10]
%<*package>
^^X\RequirePackage{etoolbox}
\providecommand\IfFormatAtLeastTF{\@ifl@t@r\fmtversion}
%    \end{macrocode}
%\begin{macro}{\MT@toks}
% We need a token register,
%\changes{v1.9}{2005/09/28}{use instead of \cmd\toks@}
%    \begin{macrocode}
\newtoks\MT@toks
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@tempbox}
% our own box,
%    \begin{macrocode}
\newbox\MT@tempbox
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\ifMT@if@}
% and a scratch if.
%    \begin{macrocode}
\newif\ifMT@if@
%    \end{macrocode}
%\end{macro}
%
%\subsubsection{Declarations}
%
%\begin{macro}{\ifMT@protrusion}
%\begin{macro}{\ifMT@expansion}
%\begin{macro}{\ifMT@auto}
%\begin{macro}{\ifMT@selected}
%\begin{macro}{\ifMT@noligatures}
%\begin{macro}{\ifMT@draft}
%\begin{macro}{\ifMT@disable}
%\begin{macro}{\ifMT@spacing}
%\begin{macro}{\ifMT@kerning}
%\begin{macro}{\ifMT@tracking}
%\begin{macro}{\ifMT@babel}
% These are the global switches~\dots
%    \begin{macrocode}
\newif\ifMT@protrusion
\newif\ifMT@expansion
\newif\ifMT@auto
\newif\ifMT@selected
\newif\ifMT@noligatures
\newif\ifMT@draft
\newif\ifMT@disable
\newif\ifMT@spacing
\newif\ifMT@kerning
\newif\ifMT@tracking
\newif\ifMT@babel
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
% [This line intentionally left blank.]
%\begin{macro}{\MT@pr@level}
%\begin{macro}{\MT@ex@level}
%\begin{macro}{\MT@pr@factor}
%\begin{macro}{\MT@ex@factor}
%\begin{macro}{\MT@sp@factor}
%\begin{macro}{\MT@kn@factor}
% \dots~and numbers.
%    \begin{macrocode}
\let\MT@pr@level\tw@
\let\MT@ex@level\tw@
\let\MT@pr@factor\@m
\let\MT@ex@factor\@m
\let\MT@sp@factor\@m
\let\MT@kn@factor\@m
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\MT@pr@unit}
%\begin{macro}{\MT@sp@unit}
%\begin{macro}{\MT@kn@unit}
% Default unit for protrusion settings is character width, for spacing
% |space|, for kerning (and tracking) \EM{1}.
%    \begin{macrocode}
\let\MT@pr@unit\@empty
\let\MT@sp@unit\m@ne
\def\MT@kn@unit{1em}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\MT@stretch}
%\begin{macro}{\MT@shrink}
%\begin{macro}{\MT@step}
% Expansion settings.
%    \begin{macrocode}
\let\MT@stretch\m@ne
\let\MT@shrink \m@ne
\let\MT@step   \m@ne
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\MT@pr@min}
%\begin{macro}{\MT@pr@max}
%\begin{macro}{\MT@ex@min}
%\begin{macro}{\MT@ex@max}
%\begin{macro}{\MT@sp@min}
%\begin{macro}{\MT@sp@max}
%\begin{macro}{\MT@kn@min}
%\begin{macro}{\MT@kn@max}
%\begin{macro}{\MT@tr@min}
%\begin{macro}{\MT@tr@max}
% Minimum and maximum values allowed by \pdftex.
%    \begin{macrocode}
\def\MT@pr@min{-\@m}
\let\MT@pr@max\@m
\let\MT@ex@min\z@
\let\MT@ex@max\@m
\def\MT@sp@min{-\@m}
\let\MT@sp@max\@m
\def\MT@kn@min{-\@m}
\let\MT@kn@max\@m
%</package>
\def\MT@tr@min{-\@m}
\let\MT@tr@max\@m
%<*package>
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\MT@factor@default}
% Default factor.
%    \begin{macrocode}
\def\MT@factor@default{1000 }
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@stretch@default}
%\begin{macro}{\MT@shrink@default}
% Default values for expansion.
%    \begin{macrocode}
\def\MT@stretch@default{20 }
\def\MT@shrink@default{20 }
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\begin{macro}{\MT@letterspace}
%\begin{macro}{\MT@letterspace@default}
% Default value for letterspacing (in thousandths of \EM{1}).
%\changes{v3.2}{2024/10/11}{new default for letterspacing: \MT@letterspace@default\space
%                           (following a report by \contributor Mark Collins <@\at @>) \githubissue{41}}
%    \begin{macrocode}
%</package>
\let\MT@letterspace\m@ne
\def\MT@letterspace@default{50}
%<*package>
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\begin{macro}{\ifMT@document}
% Our private test whether we're still in the preamble.
%    \begin{macrocode}
\newif\ifMT@document
%</package>
%</package|letterspace>
%    \end{macrocode}
%\end{macro}
%
%\subsubsection{Auxiliary macros}
%
%\begin{macro}{\MT@requires@pdftex}
%\begin{macro}{\MT@requires@luatex}
% For definitions that depend on a particular \pdftex\ resp. \luatex\ version.
%    \begin{macrocode}
%<*pdf-|lua->
\def
%<pdf->  \MT@requires@pdftex%
%<lua->  \MT@requires@luatex%
  #1{\ifnum
%<pdf->  \MT@pdftex@no
%<lua->  \MT@luatex@no
    <#1 \expandafter\@secondoftwo\else\expandafter\@firstoftwo\fi}
%<lua-&debug>\MT@requires@luatex4{\MT@lua{tex.enableprimitives('pdf',{'tracingfonts'})}}\relax
%<pdf-&debug>\MT@requires@pdftex6{
%<debug>\pdftracingfonts=1
%<pdf-&debug>}\relax
%</pdf-|lua->
%    \end{macrocode}
%\end{macro}
%\end{macro}
% Some functions are loaded from a dedicated |lua| file. This avoids character
% escaping problems and incompatibilities between versions of \luatex.
%\changes{v2.5a}{2013/04/19}{use \pkg{luatexbase} instead of \pkg{luatextra}
%                            (contributed by \contributor \'Elie Roux <elie.roux\at telecom-bretagne.eu>)}
%                            ^^A MID: <516AAF6B.8040605@telecom-bretagne.eu>
% Unless running a recent \LaTeX,
%\changes{v2.7}{2017/02/08}{drop \pkg{luatexbase} with recent \LaTeX}
% we load the \pkg{luatexbase} package.
%    \begin{macrocode}
%<lua->\IfFormatAtLeastTF{2016/01/01}\relax{\RequirePackage{luatexbase}}
%    \end{macrocode}
% We load \pkg{luaotfload}, because some of its functions are
% required in \file{microtype.lua}. This eliminates the need for the user to
% load \pkg{fontspec} before \microtype.
% There will hardly be any \luatex\ documents that don't load this package, anyway.
%\changes{v2.6}{2013/06/19}{load \pkg{luaotfload} with \luatex}
%\changes{v3.0}{2021/03/21}{\letterspace\ loads \file{microtype.lua}}
% Since 2017/01/01, it is already loaded in the format.
%    \begin{macrocode}
%<lua->\IfFormatAtLeastTF{2017/01/01}\relax{\RequirePackage{luaotfload}}
%<letterspace>\MT@pdf@or@lua\relax{
%<letterspace>\ifx\newluafunction\@undefined \input ltluatex \fi
%<lua-|letterspace>\MT@lua{require("microtype")}
%<letterspace>}
%    \end{macrocode}
% Here it begins. The module was contributed by \'Elie Roux.
%\changes{v2.4}{2009/11/12}{new file \file{microtype.lua} containing the \texttt{lua} functions
%                           (contributed by \contributor \'Elie Roux <elie.roux\at telecom-bretagne.eu>)}
%\changes{v2.7b}{2019/02/28}{update lua function \texttt{microtype.info} after changes in \pkg{luaotfload}
%                            (reported by \contributor Moritz Wemheuer <moritz.wemheuer\at gmail.com> and
%                             \contributor Ulrike Fischer <news3\at nililand.de>)}
%                            ^^A private mail, 2019/02/19
%                            ^^A private mail, 2019/02/26
%\changes{v2.8}{2020/05/26}{fix for \pkg{luatexbase}}
%    \begin{macrocode}
%<*luafile>

function microtype.info(...)
  luatexbase.module_info("microtype",...)
end

local find       = string.find
local match      = string.match
local gsub       = string.gsub
local tex_write  = tex.write

local catpackage
if luatexbase.registernumber then
  catpackage = luatexbase.registernumber("catcodetable@atletter") -- LaTeX
else
  catpackage = luatexbase.catcodetables.CatcodeTableLaTeXAtLetter -- luatexbase
end
function microtype.sprint (...)
  tex.sprint(catpackage, ...)
end

%    \end{macrocode}
% We need the function |math.tointeger|, which is missing in older
% \luatex\ versions, and Con\TeX t (inherited via \pkg{luaotfload})
% faultily overwrites its own definition.
%\changes{v3.0a}{2021/11/17}{define function \texttt{math.tointeger} for older \luatex\ versions}
%                           ^^A cf. https://mailman.ntg.nl/pipermail/dev-luatex/2021-November/006556.html
% The following is the (correct) definition from \file{l-math.lua}.
%    \begin{macrocode}
if not math.tointeger or not pcall(math.tointeger,0) then
  math.mininteger=-0x4FFFFFFFFFFF
  math.maxinteger=0x4FFFFFFFFFFF
  local floor=math.floor
  function math.tointeger(n)
    local f=floor(n)
    return f==n and f or nil
  end
end

%</luafile>
%    \end{macrocode}
% To be continued, but first back to primitives.
%\begin{macro}{\MT@glet}
%\changes{v1.9f}{2006/08/09}{new macro}
% Here's the forgotten one
%\changes{v2.8a}{2020/02/01}{use \luatex's \cmd\glet, if available}
% (finally implemented in \luatex).
%    \begin{macrocode}
%<lua->\MT@requires@luatex6{\let\MT@glet\glet}\relax
%<*package|letterspace>
\def\MT@glet{\global\let}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@exp@cs}
%\begin{macro}{\MT@exp@gcs}
%\changes{v2.3b}{2008/03/07}{new macro: reduce save stack size}
% Commands to create command sequences. Those that are going to be defined
% globally should be created inside a group so that the save stack won't
% explode.
%    \begin{macrocode}
\def\MT@exp@cs#1#2{\expandafter#1\csname#2\endcsname}
%<*package>
\def\MT@exp@gcs#1#2{\begingroup\expandafter\endgroup\expandafter#1\csname#2\endcsname}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\changes{v1.4b}{2004/11/21}{optimisation: use less \cmd\expandafter s and \cmd\csname s}
%\begin{macro}{\MT@def@n}
%\begin{macro}{\MT@gdef@n}
%\changes{v1.9f}{2006/08/09}{new macros: global variants}
% This is \cmd\@namedef\ and global.
%    \begin{macrocode}
\def\MT@def@n{\MT@exp@cs\def}
\def\MT@gdef@n{\MT@exp@gcs\gdef}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\begin{macro}{\MT@edef@n}
%\begin{macro}{\MT@xdef@n}
% Its expanding versions.
%    \begin{macrocode}
%</package>
\def\MT@edef@n{\MT@exp@cs\edef}
%<*package>
\def\MT@xdef@n{\MT@exp@gcs\xdef}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\begin{macro}{\MT@let@nc}
%\begin{macro}{\MT@glet@nc}
% \cmd\let\ a \cmd\csname\ sequence to a command.
%    \begin{macrocode}
\def\MT@let@nc{\MT@exp@cs\let}
\def\MT@glet@nc{\MT@exp@gcs\MT@glet}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\begin{macro}{\MT@let@cn}
% \cmd\let\ a command to a \cmd\csname\ sequence.
%    \begin{macrocode}
%</package>
\def\MT@let@cn#1#2{\expandafter\let\expandafter#1\csname #2\endcsname}
%<*package>
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@let@nn}
%\begin{macro}{\MT@glet@nn}
% \cmd\let\ a \cmd\csname\ sequence to a \cmd\csname\ sequence.
%    \begin{macrocode}
\def\MT@let@nn{\MT@exp@cs\MT@let@cn}
\def\MT@glet@nn{\MT@exp@gcs{\global\expandafter\MT@let@cn}}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\begin{macro}{\MT@@font}
% Remove trailing space from the font name.
%    \begin{macrocode}
\def\MT@@font{\expandafter\string\MT@font}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@exp@one@n}
% Expand the second token once and enclose it in braces.
%    \begin{macrocode}
%</package>
\def\MT@exp@one@n#1#2{\expandafter#1\expandafter{#2}}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@exp@two@c}
% Expand the next two tokens after \meta{\#1} once.
%    \begin{macrocode}
\def\MT@exp@two@c#1{\expandafter\expandafter\expandafter#1\expandafter}
%<*package>
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@exp@two@n}
%\changes{v1.9}{2005/09/28}{new macros: less \cmd\expandafter s}
% Expand the next two tokens after \meta{\#1} once and enclose them in braces.
%    \begin{macrocode}
\def\MT@exp@two@n#1#2#3{%
  \expandafter\expandafter\expandafter
    #1\expandafter\expandafter\expandafter
      {\expandafter#2\expandafter}\expandafter{#3}}
%    \end{macrocode}
%\end{macro}
% You do not wonder why |\MT@exp@one@c| doesn't exist, do you?
%\changes{v1.6}{2005/01/19}{use \etex's \orig@cs{ifcsname} and \orig@cs{ifdefined} if defined}
%\begin{macro}{\MT@ifdefined@c@T}
%\changes{v1.9a}{2005/11/08}{new macros: true case only}
%\begin{macro}{\MT@ifdefined@c@TF}
%\begin{macro}{\MT@ifdefined@n@T}
%\begin{macro}{\MT@ifdefined@n@TF}
% Wrapper for testing whether command resp. \cmd\csname\ sequence is defined.
% If we are running \etex, we will use its primitives \orig@cs{ifdefined} and
% \orig@cs{ifcsname}, which decreases memory use substantially.
%    \begin{macrocode}
\def\MT@ifdefined@c@T#1{%
^^X  \ifdefined#1\expandafter\@firstofone\else\expandafter\@gobble\fi
^^Q  \ifx#1\@undefined\expandafter\@gobble\else\expandafter\@firstofone\fi
}
%</package>
\def\MT@ifdefined@c@TF#1{%
^^X  \ifdefined#1\expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi
%<package>^^Q  \ifx#1\@undefined
%<package>^^Q    \expandafter\@secondoftwo\else\expandafter\@firstoftwo\fi
}
\def\MT@ifdefined@n@T#1{%
^^X  \ifcsname#1\endcsname\expandafter\@firstofone\else\expandafter\@gobble\fi
%<package>^^Q  \begingroup\MT@exp@two@c\endgroup\ifx\csname #1\endcsname\relax
%<package>^^Q    \expandafter\@gobble\else\expandafter\@firstofone\fi
}
\def\MT@ifdefined@n@TF#1{%
^^X  \ifcsname#1\endcsname\expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi
%<package>^^Q  \begingroup\MT@exp@two@c\endgroup\ifx\csname #1\endcsname\relax
%<package>^^Q    \expandafter\@secondoftwo\else\expandafter\@firstoftwo\fi
}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\MT@if@expanding@F}
%\changes{v3.1b}{2023/06/07}{new macro: check whether inside expanding context}
%\begin{macro}{\MT@if@expanding@F@}
% The following voodoo is based on a trick by \contributor Ulrich Schwarz <@\at @>.\footnote{Cf. \url{https://tex.stackexchange.com/a/29188/7674}}
%    \begin{macrocode}
%<*package>
\def\MT@if@expanding@F{\let\MT@if@expanding@F@\MT@if@expanding@F@\@firstofone}
\def\MT@if@expanding@F@#1#2#3{\relax\relax}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\begin{macro}{\MT@detokenize@n}
%\changes{v1.9d}{2006/03/08}{new macro: use \cmd\detokenize\ if available}
%\begin{macro}{\MT@detokenize@c}
%\changes{v1.9}{2005/08/17}{fix the \nonetex\ version}
%\changes{v2.3c}{2008/08/23}{fix: remove last space only
%                            (reported by \contributor Ulrich Dirr <ud\at mucschach.de>)}
%                                                         ^^A private mail, 2008/08/22
%\begin{macro}{\MT@rem@last@space}
% Translate a macro into a token list. With \etex, we can use \cmd\detokenize.
% We also need to remove the last trailing space; and only the last one --
% therefore the fiddling (and the \cmd\string\ isn't perfect, of course).
%    \begin{macrocode}
\def\MT@detokenize@n#1{%
^^X  \expandafter\MT@rem@last@space\detokenize{#1} \@nil
^^Q  \string#1%
}
\def\MT@detokenize@c#1{%
^^X  \MT@exp@one@n\MT@detokenize@n#1%
^^Q  \MT@exp@two@c\MT@rem@last@space\strip@prefix\meaning#1 \@nil
}
\def\MT@rem@last@space#1 #2{#1%
  \ifx\@nil#2\else \space
  \expandafter\MT@rem@last@space\expandafter#2\fi
}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\MT@ifempty}
% Test whether argument is empty.
%\changes{v1.1}{2004/09/15}{fix: use category code 12 for the percent character
%               (reported by \contributor Tom Kink <kink\at hia.rwth-aachen.de>)}
%                                      ^^A MID: <2qrkp9F134l6lU1@uni-berlin.de>
%    \begin{macrocode}
%</package>
\begingroup
\catcode`\%=12
\catcode`\&=14
\gdef\MT@ifempty#1{&
  \if %#1%&
    \expandafter\@firstoftwo
  \else
    \expandafter\@secondoftwo
  \fi
}
\endgroup
%<*package>
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@ifint}
% Test whether argument is an integer, using an old trick by Mr. Arseneau,
%\changes{v1.9a}{2005/11/03}{use \cmd\pdfmatch\ if available}
% or the latest and greatest from \pdftex\
%\changes{v2.2}{2007/05/10}{employ \luatex\ features if available}
% or \luatex\ (which also allows negative numbers, as required by the
% \opt{letterspace} option).
%    \begin{macrocode}
%</package>
%</package|letterspace>
%<pdf->\MT@requires@pdftex6{
%<letterspace>\MT@pdf@or@lua{
%<*pdf-|letterspace>
\def\MT@ifint#1{%
  \ifcase\pdfmatch{^-*[0-9]+ *$}{#1}\relax
    \expandafter\@secondoftwo
  \else
    \expandafter\@firstoftwo
  \fi
}
}{
%</pdf-|letterspace>
%<*pdf-|xe-|letterspace>
\def\MT@ifint#1{%
  \if!\ifnum9<1#1!\else?\fi
    \expandafter\@firstoftwo
  \else
    \expandafter\@secondoftwo
  \fi
}
%</pdf-|xe-|letterspace>
%<pdf-|letterspace>}
%<lua->\def\MT@ifint#1{\csname\MT@lua{microtype.if_int([[#1]])}\endcsname}
%<*luafile>
local function if_int(s)
  if find(s,"^-*[0-9]+ *$") then
    tex_write("@firstoftwo")
  else
    tex_write("@secondoftwo")
  end
end
microtype.if_int = if_int

%</luafile>
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@ifdimen}
% Test whether argument is dimension (or number).
%\changes{v1.4b}{2004/11/22}{don't set \cs{MT@count} globally (save stack problem)}
%\changes{v1.7}{2005/03/15}{comparison with 1 to allow size smaller than 1
%               (suggested by \contributor Andreas B\"uhmann <andreas.buehmann\at web.de>)}
%                                                            ^^A private mail, 2005/03/15
%\changes{v1.9b}{2006/01/05}{use \cmd\pdfmatch\ if available}
% (|nd| and |nc| are new Didot resp. Cicero, added in \pdftex\ 1.30; |px| is a pixel.)
%\changes{v2.2}{2007/05/10}{employ \luatex\ features if available}
%\todo{fix \texttt{lua} expression}
%    \begin{macrocode}
%<*pdf->
\MT@requires@pdftex6{
\def\MT@ifdimen#1{%
  \ifcase\pdfmatch{^([0-9]+([.,][0-9]+)?|[.,][0-9]+)%
                    (em|ex|cm|mm|in|pc|pt|dd|cc|bp|sp|nd|nc|px)? *$}{#1}\relax
    \expandafter\@secondoftwo
  \else
    \expandafter\@firstoftwo
  \fi
}
}{
%</pdf->
%<*pdf-|xe->
\def\MT@ifdimen#1{%
  \setbox\z@=\hbox{%
    \MT@count=1#1\relax
    \ifnum\MT@count=\@ne
      \aftergroup\@secondoftwo
    \else
      \aftergroup\@firstoftwo
    \fi
  }%
}
%</pdf-|xe->
%<pdf->}
%<lua->\def\MT@ifdimen#1{\csname\MT@lua{microtype.if_dimen([[#1]])}\endcsname}
%<*luafile>
local function if_dimen(s)
  if (find(s, "^-*[0-9]+(%a*) *$") or
      find(s, "^-*[0-9]*[.,][0-9]+(%a*) *$")) then
    tex_write("@firstoftwo")
  else
    tex_write("@secondoftwo")
  end
end
microtype.if_dimen = if_dimen

%</luafile>
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@ifdim}
% Compare floating point numbers.
%    \begin{macrocode}
%<*package>
\def\MT@ifdim#1#2#3{%
  \ifdim #1\p@ #2 #3\p@
    \expandafter\@firstoftwo
  \else
    \expandafter\@secondoftwo
  \fi
}
%</package>
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@ifstreq}
% Test whether two strings (fully expanded) are equal.
%\changes{v1.9a}{2005/11/03}{use \cmd\pdfstrcmp\ if available}
%\changes{v2.2}{2007/03/07}{fix: \nonetex\ version shouldn't use \cmd\x\ and \cmd\y\
%                           (found by \contributor Wiebke Petersen <petersew\at uni-duesseldorf.de>)}
%                                               ^^A MID: <esmd6k$954$1@news1.rz.uni-duesseldorf.de>
%\changes{v2.2}{2007/05/10}{employ \luatex\ features if available}
%\changes{v2.8}{2020/06/18}{use \xetex's \cmd\stringcmp}
%    \begin{macrocode}
%<*pdf-|xe->
%<pdf->\MT@requires@pdftex5{
\def\MT@ifstreq#1#2{%
  \ifnum
%<pdf->      \pdfstrcmp
%<xe->      \strcmp
      {#1}{#2}=\z@
    \expandafter\@firstoftwo
  \else
    \expandafter\@secondoftwo
  \fi
}
%</pdf-|xe->
%<*pdf->
}{
\def\MT@ifstreq#1#2{%
  \edef\MT@res@a{#1}%
  \edef\MT@res@b{#2}%
  \ifx\MT@res@a\MT@res@b
    \expandafter\@firstoftwo
  \else
    \expandafter\@secondoftwo
  \fi
}
}
%</pdf->
%<lua->\def\MT@ifstreq#1#2{\csname\MT@lua{microtype.if_str_eq([[#1]],[[#2]])}\endcsname}
%<*luafile>
local function if_str_eq(s1, s2)
  if s1 == s2 then
    tex_write("@firstoftwo")
  else
    tex_write("@secondoftwo")
  end
end
microtype.if_str_eq = if_str_eq

%</luafile>
%    \end{macrocode}
%\end{macro}
% With this, we can now also check whether versions match (using the command from
% \ref{ssub:def-files}).
%    \begin{macrocode}
%<lua->\MT@check@MT@version
%<lua->  {\MT@lua{tex.write(microtype.module['date'] .. ' v' .. microtype.module['version'])}}
%<lua->  {\MT@MT.lua}
%    \end{macrocode}
%\begin{macro}{\MT@xadd}
%\changes{v1.8}{2005/04/17}{simplified}
% Add item to a list.
%    \begin{macrocode}
%<*package>
\def\MT@xadd#1#2{%
  \ifx#1\relax
    \xdef#1{#2}%
  \else
    \xdef#1{#1#2}%
  \fi
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@xaddb}
% Add item to the beginning.
%    \begin{macrocode}
\def\MT@xaddb#1#2{%
  \ifx#1\relax
    \xdef#1{#2}%
  \else
    \xdef#1{#2#1}%
  \fi
}
%</package>
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@map@clist@n}
%\changes{v1.8}{2005/04/17}{new macro: used instead of \cmd\@for}
%\changes{v1.9a}{2005/11/03}{following \LaTeX3}
%\begin{macro}{\MT@map@clist@c}
%\begin{macro}{\MT@map@clist@}
%\begin{macro}{\MT@clist@function}
%\begin{macro}{\MT@clist@break}
% Run \meta{\#2} on all elements of the comma list \meta{\#1}. This and the
% following is modelled after \LaTeX3 commands.
%    \begin{macrocode}
%<*package|letterspace>
\def\MT@map@clist@n#1#2{%
  \ifx\@empty#1\else
    \def\MT@clist@function##1{#2}%
    \MT@map@clist@#1,\@nil,\@nnil
  \fi
}
%    \end{macrocode}
%\todo{think \cmd\@nil\ should be defined as itself}
%    \begin{macrocode}
\def\MT@map@clist@c#1{\MT@exp@one@n\MT@map@clist@n#1}
\def\MT@map@clist@#1,{%
  \ifx\@nil#1%
    \expandafter\MT@clist@break
  \fi
  \MT@clist@function{#1}%
  \MT@map@clist@
}
\let\MT@clist@function\@gobble
\def\MT@clist@break#1\@nnil{}
%<*package>
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\MT@map@tlist@n}
%\changes{v1.8}{2005/04/16}{new macro: used instead of \cmd\@tfor}
%\begin{macro}{\MT@map@tlist@c}
%\begin{macro}{\MT@map@tlist@}
%\begin{macro}{\MT@tlist@break}
% Execute \meta{\#2} on all elements of the token list \meta{\#1}.
% \cs{MT@tlist@break} can be used to jump out of the loop.
%    \begin{macrocode}
\def\MT@map@tlist@n#1#2{\MT@map@tlist@#2#1\@nnil}
\def\MT@map@tlist@c#1#2{\expandafter\MT@map@tlist@\expandafter#2#1\@nnil}
\def\MT@map@tlist@#1#2{%
  \ifx\@nnil#2\else
    #1{#2}%
    \expandafter\MT@map@tlist@
    \expandafter#1%
  \fi
}
\def\MT@tlist@break#1\@nnil{\fi}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\ifMT@inlist@}
%\begin{macro}{\MT@in@clist}
% Test whether item \meta{\#1} is in comma list \meta{\#2}.
%^^A\changes{v1.4b}{2004/11/22}{fix: compare with \cmd\\ instead of \cmd\relax\
%^^A                (discovered by \contributor Herb Schulz <herbs\at wideopenwest.com>)}
%^^A                                    ^^A MID: <BDBFA967.C01F%herbs@wideopenwest.com>
% Using \cmd\pdfmatch\ would be slower.
%\changes{v1.9a}{2005/11/03}{fix}
%\changes{v2.3}{2007/11/14}{don't use \cmd\x\
%                           (reported by \contributor Peter Meier <Peter.Meier998\at gmx.de>)}
%                                                                ^^A private mail, 2007/11/12
%    \begin{macrocode}
\newif\ifMT@inlist@
\def\MT@in@clist#1#2{%
  \def\MT@res@a##1,#1,##2##3\@nnil{%
    \ifx##2\@empty
      \MT@inlist@false
    \else
      \MT@inlist@true
    \fi
  }%
  \expandafter\MT@res@a\expandafter,#2,#1,\@empty\@nnil
}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\begin{macro}{\MT@rem@from@clist}
% Remove item \meta{\#1} from comma list \meta{\#2}. This is basically
% \cmd\@removeelement\ from \file{ltcntrl.dtx}.
%\changes{v1.9}{2005/10/28}{new macro: remove an item from a comma list}
%\changes{v1.9a}{2005/11/03}{fix}
%\changes{v1.9e}{2006/07/26}{model after \cmd\@removeelement}
% Using \cmd\pdfmatch\ and \cmd\pdflastmatch\ here would be really slow!
%    \begin{macrocode}
\def\MT@rem@from@clist#1#2{%
  \def\MT@res@a##1,#1,##2\MT@res@a{##1,##2\MT@res@b}%
  \def\MT@res@b##1,\MT@res@b##2\MT@res@b{\ifx,##1\@empty\else##1\fi}%
  \xdef#2{\MT@exp@two@c\MT@res@b\MT@res@a\expandafter,#2,\MT@res@b,#1,\MT@res@a}%
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@in@tlist}
%\begin{macro}{\MT@in@tlist@}
% Test whether item is in token list. Since this isn't too elegant, I thought
% that at least here, \cmd\pdfmatch\ would be more efficient -- however, it
% turned out to be even slower than this solution.
%    \begin{macrocode}
\def\MT@in@tlist#1#2{%
  \MT@inlist@false
  \def\MT@res@a{#1}%
  \MT@map@tlist@c#2\MT@in@tlist@
}
\def\MT@in@tlist@#1{%
  \edef\MT@res@b{#1}%
  \ifx\MT@res@a\MT@res@b
    \MT@inlist@true
    \expandafter\MT@tlist@break
  \fi
}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\begin{macro}{\MT@in@rlist}
%\changes{v1.8}{2005/04/20}{made recursive}
%\begin{macro}{\MT@in@rlist@}
%\begin{macro}{\MT@in@rlist@@}
%\begin{macro}{\MT@size@name}
% Test whether size \cs{MT@size} is in a list of ranges. Store the name of the
% list in \cs{MT@size@name}
%    \begin{macrocode}
\def\MT@in@rlist#1{%
  \MT@inlist@false
  \MT@map@tlist@c#1\MT@in@rlist@
}
\def\MT@in@rlist@#1{\expandafter\MT@in@rlist@@#1}
\def\MT@in@rlist@@#1#2#3{%
  \MT@ifdim{#2}=\m@ne{%
    \MT@ifdim{#1}=\MT@size
      \MT@inlist@true
      \relax
  }{%
    \MT@ifdim\MT@size<{#1}\relax{%
      \MT@ifdim\MT@size<{#2}%
        \MT@inlist@true
        \relax
    }%
  }%
  \ifMT@inlist@
    \def\MT@size@name{#3}%
    \expandafter\MT@tlist@break
  \fi
}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\MT@loop}
%\changes{v1.2}{2004/09/23}{fix: new macro, used instead of \cmd\loop}
%\begin{macro}{\MT@iterate}
%\begin{macro}{\MT@repeat}
% This is the same as \LaTeX's \cmd\loop, which we mustn't use, since this
% could confuse an outer \cmd\loop\ in the document.
%    \begin{macrocode}
%</package>
\def\MT@loop#1\MT@repeat{%
  \def\MT@iterate{#1\relax\expandafter\MT@iterate\fi}%
  \MT@iterate \let\MT@iterate\relax
}
\let\MT@repeat\fi
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\MT@while@num}
% Execute \meta{\#3} from \meta{\#1} up to (excluding) \meta{\#2} (much faster
% than \LaTeX's \cmd\@whilenum).
%    \begin{macrocode}
\def\MT@while@num#1#2#3{%
  \@tempcnta#1\relax
  \MT@loop #3%
    \advance\@tempcnta \@ne
    \ifnum\@tempcnta < #2\MT@repeat
}
%</package|letterspace>
%    \end{macrocode}
%\end{macro}
%\changes{v2.6a}{2016/05/03}{fixes for \letterspace\ package with \luatex}
%\begin{macro}{\MT@if@opentype@font}
%\changes{v2.8}{2019/11/27}{use \texttt{lua} function}
%\changes{v3.2}{2024/05/13}{version for \xetex}
% For fonts loaded by \pkg{luaotfload} we query the font's table,
% for \xetex, the font type. (`opentype' here stands for non-legacy.)
%    \begin{macrocode}
%<letterspace>\MT@pdf@or@lua{\let\MT@if@opentype@font\@secondoftwo}{
%<*lua-|letterspace>
\def\MT@if@opentype@font{\csname\MT@lua{%
  microtype.if_opentype_font()
  }\endcsname
}
%</lua-|letterspace>
%<*xe->
\def\MT@if@opentype@font{%
  \ifnum\XeTeXfonttype\font@name=\z@
    \expandafter\@secondoftwo
  \else
    \expandafter\@firstoftwo
  \fi
}
%</xe->
%<letterspace>}
%<*luafile>
local function if_opentype_font()
  local thefont = font.getfont(font.current())
  if thefont and ( thefont.format == "opentype" or thefont.format == "truetype" )
    then tex.write("@firstoftwo")
    else tex.write("@secondoftwo")
  end
end
microtype.if_opentype_font = if_opentype_font

%</luafile>
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@do@font}
% Execute \meta{\#1} 256 times,
%    \begin{macrocode}
%<pdf-|letterspace>\def\MT@do@font{\MT@while@num\z@\@cclvi}
%    \end{macrocode}
% resp. for the whole font for \luatex, if it's a Unicode font.
%\changes{v2.5}{2010/08/14}{adapt for \luatex}
%\changes{v2.6}{2013/07/14}{speed up for \luatex}
%\changes{v2.6a}{2015/05/10}{fix \texttt{lua} function
%                            (reported by \contributor Herbert Vo\ss{} <Herbert.Voss\at FU-Berlin.DE>)}
%                             ^^A private mail, 2016/05/10
%\changes{v2.8}{2020/06/20}{simplify \texttt{lua} function}
%    \begin{macrocode}
%<*lua->
\def\MT@do@font#1{%
  \MT@if@opentype@font{%
    \def\MT@dofont@function{#1}%
    \MT@lua{microtype.do_font()}%
  }{\MT@while@num\z@\@cclvi{#1}}%
}
%</lua->
%    \end{macrocode}
% This is the |lua| function, which is much faster than looping through all glyphs
% in \TeX. Legacy fonts (which this function should never work on) don't contain a
% |v.index| field.
%\changes{v3.0}{2021/10/26}{guard against return values outside Unicode range (for HarfBuzz)}
% Our test whether |i| is larger than 1114111 may seem strange, but with the
% HarfBuzz renderer, we are not guaranteed to get a number within the Unicode range.
%    \begin{macrocode}
%<*luafile>
local function do_font()
  local thefont = font.getfont(font.current())
  if thefont then
    for i,v in next,thefont.characters do
      if v.index == nil or ( v.index > 0 and i < 1114112 ) then
        microtype.sprint([[\@tempcnta=]]..i..[[\relax\MT@dofont@function]])
      end
    end
  end
end
microtype.do_font = do_font

%</luafile>
%    \end{macrocode}
% The \xetex\ variant (it's slow~\dots!).
%\changes{v2.5}{2010/05/18}{adapt for \xetex}
%\changes{v2.8}{2020/02/06}{fix for \xetex}
%    \begin{macrocode}
%<*xe->
\def\MT@do@font#1{%
  \@tempcnta=\z@
  \MT@loop
    \iffontchar\MT@font\@tempcnta #1\fi
    \advance\@tempcnta\@ne
    \ifnum\@tempcnta < \XeTeXlastfontchar\MT@font \MT@repeat
}
%</xe->
%    \end{macrocode}
%\end{macro}
%\changes{v1.4}{2004/11/12}{use one instead of five counters}
%\begin{macro}{\MT@count}
%\begin{macro}{\MT@increment}
% Increment macro \meta{\#1} by one. Saves using up too many counters.
%\changes{v1.7}{2005/03/07}{use \etex's \cmd\numexpr\ if available}
% The \etex\ way is slightly faster.
%    \begin{macrocode}
%<*package>
\newcount\MT@count
\def\MT@increment#1{%
^^X  \edef#1{\number\numexpr #1 + 1\relax}%
^^Q  \MT@count=#1\relax
^^Q  \advance\MT@count \@ne
^^Q  \edef#1{\number\MT@count}%
}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\begin{macro}{\MT@scale}
%\changes{v1.7}{2005/02/12}{new macro: use \etex's \cmd\numexpr\ if available}
%\changes{v1.8}{2005/03/30}{fix: remove spaces in \nonetex\ variant
%               (reported by \contributor Mark Rossi <mark.rossi\at de.bosch.com>)}
%                               ^^A MID: <d6uhag$qoi$1@ns2.fe.internet.bosch.com>
% Multiply and divide a counter. If we are using \etex, we will use its
% \cmd\numexpr\ primitive. This has the advantage that it is less likely to
% run into arithmetic overflow. The result of the division will be rounded
% instead of truncated. Therefore, we'll get a different (more accurate)
% result in about half of the cases.
%    \begin{macrocode}
\def\MT@scale#1#2#3{%
^^Q  \multiply #1 #2\relax
  \ifnum #3 = \z@
^^X    #1=\numexpr #1 * #2\relax
  \else
^^X    #1=\numexpr #1 * #2 / #3\relax
^^Q    \divide #1 #3\relax
  \fi
}
%    \end{macrocode}
%\end{macro}
%\changes{v1.7}{2005/03/07}{shorter command names}
%\begin{macro}{\MT@abbr@pr}
%\begin{macro}{\MT@abbr@ex}
%\begin{macro}{\MT@abbr@pr@c}
%\begin{macro}{\MT@abbr@ex@c}
%\begin{macro}{\MT@abbr@pr@inh}
%\begin{macro}{\MT@abbr@ex@inh}
%\begin{macro}{\MT@abbr@nl}
%\begin{macro}{\MT@abbr@sp}
%\begin{macro}{\MT@abbr@sp@c}
%\begin{macro}{\MT@abbr@sp@inh}
%\begin{macro}{\MT@abbr@kn}
%\begin{macro}{\MT@abbr@kn@c}
%\begin{macro}{\MT@abbr@kn@inh}
%\begin{macro}{\MT@abbr@tr}
%\begin{macro}{\MT@abbr@tr@c}
% Some abbreviations. Thus, we can have short command names but full-length
% log output.
%    \begin{macrocode}
\def\MT@abbr@pr{protrusion}
\def\MT@abbr@ex{expansion}
\def\MT@abbr@pr@c{protrusion codes}
\def\MT@abbr@ex@c{expansion codes}
\def\MT@abbr@pr@inh{protrusion inheritance}
\def\MT@abbr@ex@inh{expansion inheritance}
\def\MT@abbr@nl{noligatures}
\def\MT@abbr@sp{spacing}
\def\MT@abbr@sp@c{interword spacing codes}
\def\MT@abbr@sp@inh{interword spacing inheritance}
\def\MT@abbr@kn{kerning}
\def\MT@abbr@kn@c{kerning codes}
\def\MT@abbr@kn@inh{kerning inheritance}
\def\MT@abbr@tr{tracking}
\def\MT@abbr@tr@c{tracking amount}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\MT@rbba@protrusion}
%\begin{macro}{\MT@rbba@expansion}
%\begin{macro}{\MT@rbba@spacing}
%\begin{macro}{\MT@rbba@kerning}
%\begin{macro}{\MT@rbba@tracking}
% These we also need the other way round.
%    \begin{macrocode}
\def\MT@rbba@protrusion{pr}
\def\MT@rbba@expansion{ex}
\def\MT@rbba@spacing{sp}
\def\MT@rbba@kerning{kn}
\def\MT@rbba@tracking{tr}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\MT@features}
%\changes{v1.9b}{2006/01/17}{use throughout the package to adjust to beta-ness}
%\begin{macro}{\MT@features@long}
% We can work on these lists to save some guards in the \file{dtx} file.
%    \begin{macrocode}
\def\MT@features{pr,ex,sp,kn,tr}
\def\MT@features@long{protrusion,expansion,spacing,kerning,tracking}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\begin{macro}{\MT@is@feature}
%\changes{v1.9a}{2005/11/03}{new macro: check for \pdftex\ feature}
% Whenever an optional argument accepts a list of features, we can use this
% command to check whether a feature exists in order to prevent a rather
% confusing `|Missing \endcsname inserted|' error message. The feature (long
% form) must be in \meta{\#1}, the type of list to ignore in \meta{\#2},
% then comes the action.
%    \begin{macrocode}
\def\MT@is@feature#1#2{%
  \MT@in@clist{#1}\MT@features@long
  \ifMT@inlist@
    \expandafter\@firstofone
  \else
    \MT@error{`#1' is not an available micro-typographic\MessageBreak
      feature. Ignoring #2}{Available features are: `\MT@features@long'.}%
    \expandafter\@gobble
  \fi
}
%    \end{macrocode}
%\end{macro}
%
%\subsubsection{Compatibility}\label{ssub:compatibility}
%
% For the record, the following \LaTeX\ kernel commands will be modified by
% \microtype:
%\begin{itemize}
%  \item \cmd\pickup@font
%  \item \cmd\do@subst@correction
%  \item \cmd\add@accent\ (all in section~\ref{ssub:impl.hook})
%  \item \cmd\showhyphens\ (in section~\ref{ssub:impl.options})
%\end{itemize}
%
% The \pkg{wordcount} package redefines the font-switching commands, which will
% break \microtype. Since \microtype\ doesn't have an effect on the number of
% words in the document anyway, we will simply disable ourselves.
%\changes{v2.2}{2007/02/11}{disable \microtype\ if \pkg{wordcount} is loaded
%                           (reported by \contributor Ross Hetherington <ross\at heth.eclipse.co.uk>)}
%                                         ^^A MID: <A9-dnaHX5LxN01LYnZ2dnUVZ8tqqnZ2d@eclipse.net.uk>
%    \begin{macrocode}
\@ifl@aded{tex}{wordcount}{%
  \MT@warning@nl{Detected the `wordcount' utility.\MessageBreak
    Disabling `\MT@MT', since it wouldn't work}%
  \MT@clear@options\endinput}\relax
%    \end{macrocode}
% The \cls{minimal} class doesn't define any size commands other than
% \cmd\normalsize, which will result in lots of warnings. Therefore we
% issue a warning about the warnings.
%\changes{v2.7}{2016/05/18}{warning with \cls{minimal} class}
%    \begin{macrocode}
\@ifclassloaded{minimal}{%
  \MT@warning@nl{Detected the `minimal' class.\MessageBreak
    Expect lots of warnings and some malfunctions.\MessageBreak
    You might want to use a proper class instead}%
}\relax
%</package>
%    \end{macrocode}
%\begin{macro}{\MT@setup@}
%\changes{v1.9a}{2005/11/21}{defer setup until the end of the preamble}
%\changes{v1.9e}{2006/07/06}{empty \cs{MT@setup@} after use
%                            (compatibility with the \cls{combine} class)}
%\changes{v2.3e}{2009/08/31}{make space-unaware
%                            (requested by \contributor Marcin Borkowski <mbork\at atos.wmid.amu.edu.pl>)}
%                               ^^A private mail, 2009/08/31
% The setup is deferred until the end of the preamble. This has a couple of
% advantages: \cs{microtypesetup} can be used to change options later on in the
% preamble, and fonts don't have to be set up before \microtype.
%    \begin{macrocode}
%<*package|letterspace>
%<plain>\MT@requires@latex1{
\let\MT@setup@\@empty
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@addto@setup}
% We use our private hook to have better control over the timing.
% This will also work with \pkg{eplain}, but not with \pkg{miniltx} alone.
%    \begin{macrocode}
\def\MT@addto@setup{\g@addto@macro\MT@setup@}
%    \end{macrocode}
%\end{macro}
% Don't hesitate with \pkg{miniltx}.
%    \begin{macrocode}
%<plain>}{\let\MT@addto@setup\@firstofone}
%    \end{macrocode}
%\begin{macro}{\MT@with@package@T}
% We almost never do anything if a package is not loaded.
%    \begin{macrocode}
\def\MT@with@package@T#1{\@ifpackageloaded{#1}\@firstofone\@gobble}
%</package|letterspace>
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@with@babel@and@T}
%\changes{v2.2}{2007/05/25}{also inspect class options}
%\changes{v3.0a}{2021/11/23}{fix grouping}
%\changes{v3.1b}{2023/03/24}{don't use \cmd\@pkgextension\ (was \cmd\@onlypreamble d in older \LaTeX\ versions)}
% \LaTeX's \cmd\@ifpackagewith\ ignores the class options.
%    \begin{macrocode}
%<*package>
\def\MT@with@babel@and@T#1{%
  \MT@ifdefined@n@T{opt@babel.sty}{%
    \@expandtwoargs\MT@in@clist{#1}
      {\csname opt@babel.sty\endcsname,\@classoptionslist}%
    \ifMT@inlist@\expandafter\@secondoftwo\else\expandafter\@firstofone\fi
  }\@gobble
}
%</package>
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@ledmac@setup}
% The \pkg{ledmac} package first saves each paragraph in a box, from which it
% then splits off the lines one by one. This will destroy character protrusion.
% (There aren't any problems with the \pkg{lineno} package, since it takes a
% different approach.)
%\iffalse
% We issue a warning, so that nobody can say they didn't know.
%\changes{v1.6}{2004/12/29}{warning when using the \pkg{ledmac} package}
% --- This is fixed in \pdftex\ 1.21a, so we no longer warn.
%\changes{v1.6a}{2005/02/02}{no warning when using the \pkg{ledmac} package}
% --- Actually, it was completely broken in 1.21a, but 1.21b provides a work-around.
%\fi
% ---~\dots~---
%\changes{v1.8}{2005/04/15}{character protrusion with \pkg{ledmac}}
% After much to and fro, the situation has finally settled and there is a fix.
% Beginning with \pdftex\ version 1.21b together with \file{ledpatch.sty} as of
% 2005/06/02 (v0.4), character protrusion will work at last.
%
% \contributor Peter Wilson <herries.press\at earthlink.net> was so kind to provide the \cmd\l@dunhbox@line\ hook in
% \pkg{ledmac} to allow for protrusion. \cmd\leftmarginkern\ and
% \cmd\rightmarginkern\ are new primitives of \pdftex\ 1.21b (aka. 1.30.0).
%\changes{v2.5}{2012/07/02}{fix to work with \xetex\
%                           (reported by \contributor Ma\"ieul Rouquette <maieul\at maieul.net>)}
%                           ^^A private mail, 2012/06/30
% They are also part of recent \xetex.
%\changes{v2.5a}{2013/03/25}{support for \pkg{eledmac}}
%\changes{v2.6}{2015/08/10}{support for \pkg{reledmac}}^^A
% The successor packages \pkg{eledmac} and \pkg{reledmac} are also supported.
%    \begin{macrocode}
%<*pdf-|lua-|xe->
%<pdf->\MT@requires@pdftex5{
  \def\MT@ledmac@setup{%
    \ifMT@protrusion
      \MT@ifdefined@c@TF\l@dunhbox@line{%
%    \end{macrocode}
%\begin{macro}{\MT@led@unhbox@line}
% Hook.
%\changes{v2.5a}{2013/03/27}{simplified}
%    \begin{macrocode}
        \MT@info@nl{Patching ((r)e)ledmac to enable character protrusion}%
        \let\MT@led@unhbox@line\l@dunhbox@line
        \renewcommand*{\l@dunhbox@line}[1]{%
          \ifhbox##1%
            \kern\leftmarginkern##1%
            \expandafter\MT@led@unhbox@line\expandafter##1\expandafter
            \kern\rightmarginkern##1%
          \fi
        }%
%    \end{macrocode}
%\end{macro}
%    \begin{macrocode}
      }{%
        \MT@warning@nl{%
          Character protrusion in paragraphs with line\MessageBreak
          numbering will only work if you update ledmac,\MessageBreak
          or use one of its successors, eledmac or reledmac}%
      }%
    \fi
  }
%<*pdf->
}{
  \def\MT@ledmac@setup{%
    \ifMT@protrusion
      \MT@warning@nl{%
        The pdftex version you are using does not allow\MessageBreak
        character protrusion in paragraphs with line\MessageBreak
        numbering by the `((r)e)ledmac' package.\MessageBreak
        Upgrade pdftex to version 1.30 or later}%
    \fi
  }
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@varwidth@setup}
% Likewise, the \pkg{varwidth} package de- and reassembles \cmd\vbox es
% line by line, in the course of which margin kerns will get lost.
% We patch the relevant commands to record and reinsert the margin kerns.
%\changes{v3.2}{2024/05/03}{patch \pkg{varwidth} to allow for margin kerning
%                           (reported by \contributor web-stranger <@\at @>)}
%                           ^^A https://tex.stackexchange.com/questions/245798/microtype-raggedright-and-varwidth-doesnt-work-well-with-each-other
%\changes{v3.2a}{2024/12/21}{fix for \cls{standalone} class
%                            (reported by \contributor Denis Bitouz\'e <dbitouze\at wanadoo.fr>) \githubissue{43}}
%    \begin{macrocode}
\MT@requires@pdftex5{
%</pdf->
  \def\MT@varwidth@setup{%
    \ifMT@protrusion
^^Q      \MT@warning@nl{Cannot patch varwidth without etex extensions}%
^^X      \MT@info@nl{Patching varwidth to enable character protrusion}%
^^X      \newdimen\MT@vwid@leftmargin
^^X      \newdimen\MT@vwid@rightmargin
^^X      \patchcmd\@vwid@sift{\sift@deathcycles\z@}
^^X        {\ifhbox\z@ \MT@vwid@leftmargin\leftmarginkern\z@
^^X         \MT@vwid@rightmargin\rightmarginkern\z@\fi \sift@deathcycles\z@}{}{}%
^^X      \patchcmd\@vwid@resetb{\kern\@vwid@loff \unhbox\z@}
^^X        {\kern\@vwid@loff \ifdim\MT@vwid@leftmargin=\z@\else\kern\MT@vwid@leftmargin\fi
^^X         \unhbox\z@ \ifdim\MT@vwid@rightmargin=\z@\else\kern\MT@vwid@rightmargin\fi}{}{}%
^^X      \patchcmd\@vwid@measure{\kern\@vwid@loff \unhbox\z@}
^^X        {\kern\@vwid@loff \ifdim\MT@vwid@leftmargin=\z@\else\kern\MT@vwid@leftmargin\fi
^^X         \unhbox\z@ \ifdim\MT@vwid@rightmargin=\z@\else\kern\MT@vwid@rightmargin\fi}{}{}%
    \fi
  }
%<*pdf->
}{
  \def\MT@varwidth@setup{%
    \ifMT@protrusion
      \MT@warning@nl{%
        The pdftex version you are using does not allow\MessageBreak
        character protrusion in varwidth environments.\MessageBreak
        Upgrade pdftex to version 1.30 or later}%
    \fi
  }
}
%</pdf->
%</pdf-|lua-|xe->
%    \end{macrocode}
%\end{macro}
% The \pkg{shapepar} package (v2.2) fixes this in a similar manner by itself,
% so we don't have to bother.
% ^^A missing protrusion with \pkg{shapepar} (reported by \contributor Giuseppe Palma <pippi.palma\at gmail.com>)}
% ^^A                                     ^^A private mail, 2013/03/22
% ^^A fixed in shapepar v2.2 (Mar 2013)
%\begin{macro}{\MT@restore@p@h}
% Restore meaning of \cmd\% and \cmd\#.
%    \begin{macrocode}
%<*package|letterspace>
%<*package>
\def\MT@restore@p@h{\chardef\%`\% \chardef\#`\# }
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\ifMT@fontspec}
%\begin{macro}{\ifMT@xunicode}
% Two new conditionals for use with \xetex\ or \luatex.
%    \begin{macrocode}
\newif\ifMT@fontspec
\MT@with@package@T{fontspec}\MT@fontspectrue
\newif\ifMT@xunicode
\MT@with@package@T{xunicode}\MT@xunicodetrue
%    \end{macrocode}
%\end{macro}
%\changes{v2.8c}{2021/03/12}{add to hook for \pkg{fontspec}}
%\changes{v3.0}{2021/09/27}{fix for changed hook name order
%                           (reported by \contributor Frank Mittelbach <frank.mittelbach\at latex-project.org>
%                            and \contributor Karl Berry <karl\at freefriends.org>)}
%                            ^^A private mails, 2021/09/06 and 2021/09/26
%\end{macro}
% We need the correct value of the former for configuration commands
% inside the preamble (to get the default families right).
%    \begin{macrocode}
\IfFormatAtLeastTF{2020/10/01}
  {\IfFormatAtLeastTF{2021/11/15}
    {\AddToHook{package/fontspec/after}{\MT@fontspectrue}}
    {\AddToHook{package/after/fontspec}{\MT@fontspectrue}}}\relax
%    \end{macrocode}
%\begin{macro}{\MT@maybe@gobble@with@tikz}
%\begin{macro}{\MT@tikz@setup}
%\changes{v2.3e}{2009/11/02}{compatibility with \pkg{tikz} (first reported by
%                           \contributor Christian Stark <cstark\at gmx.de>)}       ^^A MID: <7d81lgF2ad3ckU1@mid.dfncis.de>, 2009/07/28
%^^A                  Also: \contributor Karl Karlsson <karl-karlsson\at yandex.ru> ^^A private mail, 2009/10/29
%^^A                        \contributor hscm <henkmetselaar\at gmail.com>          ^^A MID: <6a24e972-b1a7-4172-a5a0-d2707e016301@12g2000pri.googlegroups.com>, 2009/11/02
%\changes{v2.7}{2016/06/08}{compatibility with \pkg{tikz} (again)}
% If \cmd\tikz@expandcount\ is greater than zero, we're inside or at the end of
% a \pkg{tikz} node, where we don't want to adjust spacing after letterspacing,
% lest we disturb \pkg{tikz}. This is used in \cs{MT@afteraftergroup}, and we
% don't need it for \letterspace.
%    \begin{macrocode}
\let\MT@maybe@gobble@with@tikz\@firstofone
\def\MT@tikz@setup{%
  \def\MT@maybe@gobble@with@tikz{%
    \ifnum\tikz@expandcount>\z@
      \expandafter\@gobble
    \else
      \expandafter\@firstofone
    \fi}}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\begin{macro}{\MT@setupfont@hook}
% This hook will be executed every time a font is set up (inside a group).
%
% In the preamble, we check for the packages each time a font is set up.
% Thus, it will work regardless when the packages are loaded.
%
% Even for packages that don't activate any characters in the preamble (like
% \pkg{babel} and \pkg{csquotes}), we have to check here, too, in case they were
% loaded before \microtype, and a font is loaded \cmd\AtBeginDocument, before
% \microtype.
% (This is no longer needed, since the complete setup is now deferred until the
% end of the preamble. However, it is still necessary for \opt{defersetup}|=false|.)
%    \begin{macrocode}
\def\MT@setupfont@hook{%
%    \end{macrocode}
%\iffalse
%\changes{v1.7}{2005/02/06}{compatibility with the \pkg{chemsym} package}
% The \pkg{chemsym} package redefines, among other commands, the Hungarian
% umlaut \cmd\H\ in a way that cannot be parsed by \microtype. As a work-around,
% we restore the usual definition of \cmd\H\ before setting up the font (which
% will be done inside a group).
%\changes{v1.8}{2005/03/24}{remove superfluous \pkg{chemsym} hook}
% --- Since version 1.7, this is no longer needed, since our character parsing
% is robust enough now.
%
%\changes{v1.7}{2005/03/10}{compatibility with the \pkg{statex} package}
% Same for \pkg{statex}.
%\changes{v1.8}{2005/03/24}{remove superfluous \pkg{statex} hook}
% --- No longer needed, either.
%\fi
%\changes{v1.8}{2005/03/30}{restore percent character if Spanish \pkg{babel} is loaded}
%\changes{v2.2}{2007/02/02}{restore percent character if Galician \pkg{babel} is loaded}
%\changes{v2.3a}{2008/01/29}{restore percent character if Mexican \pkg{babel} is loaded}
% Spanish (as well as Galician and Mexican) \pkg{babel} modify \cmd\%, storing
% the original meaning in \cmd\percentsign.
%    \begin{macrocode}
  \MT@if@false
  \MT@with@babel@and@T{spanish} \MT@if@true
  \MT@with@babel@and@T{galician}\MT@if@true
  \MT@with@babel@and@T{mexican} \MT@if@true
  \ifMT@if@\MT@ifdefined@c@T\percentsign{\let\%\percentsign}\fi
%    \end{macrocode}
%\changes{v1.8}{2005/04/22}{restore \pkg{csquotes}'s active characters}
% Using \cmd\@disablequotes, we can restore the original meaning of all
% characters made active by \pkg{csquotes}.
% (It would be doable for older versions, too, but we won't bother.)
%    \begin{macrocode}
  \MT@with@package@T{csquotes}{%
    \@ifpackagelater{csquotes}{2005/05/11}\@disablequotes\relax}%
%    \end{macrocode}
% \pkg{hyperref} redefines \cmd\% and \cmd\# inside a \cmd\url. We restore
% the original meanings (which we can only hope are correct).
%\changes{v1.8}{2005/05/20}{restore \cmd\% and \cmd\# when \pkg{hyperref} is loaded}
% Same for \pkg{tex4ht}
%\changes{v1.9d}{2006/02/27}{restore \cmd\% and \cmd\# when \pkg{tex4ht} is loaded
%                            (reported by \contributor Peter Dyballa <Peter_Dyballa\at Web.DE>)}
%                                                                  ^^A private mail, 2006/02/26
% and \pkg{mathastext}.
%\changes{v2.5}{2011/07/29}{restore \cmd\% and \cmd\# when \pkg{mathastext} is loaded
%                           (found by \contributor Seamus Bradley <@\at @>)}
%                           ^^A https://tex.stackexchange.com/questions/24248
%                           ^^A (beta:07)
%    \begin{macrocode}
  \MT@if@false
  \MT@with@package@T{hyperref}  \MT@if@true
  \MT@with@package@T{tex4ht}    \MT@if@true
  \MT@with@package@T{mathastext}\MT@if@true
  \ifMT@if@\MT@restore@p@h\fi
  \MT@with@package@T{tikz}\MT@tikz@setup
}
%    \end{macrocode}
%\end{macro}
% Check again at the end of the preamble.
%    \begin{macrocode}
%</package>
\MT@addto@setup{%
%<*package>
%    \end{macrocode}
%\changes{v1.4}{2004/11/04}{check for \pkg{pdfcprot}}
% Our competitor, the \pkg{pdfcprot} package, must not be tolerated!
%    \begin{macrocode}
  \MT@with@package@T{pdfcprot}{%
    \MT@error{Detected the `pdfcprot' package!\MessageBreak
              `\MT@MT' and `pdfcprot' may not be used together}{%
The `pdfcprot' package provides an interface to character protrusion.\MessageBreak
So does the `\MT@MT' package. Using both packages at the same\MessageBreak
time will almost certainly lead to undesired results. Have your choice!}%
  }%
  \MT@with@package@T  {ledmac}\MT@ledmac@setup
  \MT@with@package@T {eledmac}\MT@ledmac@setup
  \MT@with@package@T{reledmac}\MT@ledmac@setup
  \MT@with@package@T{varwidth}\MT@varwidth@setup
  \MT@with@package@T{xunicode}\MT@xunicodetrue
  \MT@with@package@T{fontspec}\MT@fontspectrue
%    \end{macrocode}
% We can clean up \cs{MT@setupfont@hook} now.
%\changes{v2.6}{2014/03/17}{redefine \cs{MT@setupfont@hook} globally
%                           for problem with \cls{tikzposter}
%                           (reported by \contributor Sam Mason <sam\at samason.me.uk>)}
%                           ^^A https://tex.stackexchange.com/questions/165846/
%    \begin{macrocode}
  \MT@glet\MT@setupfont@hook\@empty
%    \end{macrocode}
% \microtype\ is so so loquacious~\dots\
% Sometimes you just want to silence it when debugging a document.\footnote{
%   Cf. \url{https://www.youtube.com/watch?v=7FQLnggVgDE&t=38m24s}}
%   \index{Mittelbach=\textit  {Frank Mittelbach} (contributor)|hyperpage}
%    \begin{macrocode}
 %\gdef\MT@setupfont@hook{\ifnum\tracingmacros>\z@\tracingnone
 %  \MT@info{->Silently doing my `magic' (Mittelbach) for font\MessageBreak->\MT@@font}\fi}%
  \MT@if@false
  \MT@with@babel@and@T{spanish} \MT@if@true
  \MT@with@babel@and@T{galician}\MT@if@true
  \MT@with@babel@and@T{mexican} \MT@if@true
  \ifMT@if@
    \g@addto@macro\MT@setupfont@hook{%
      \MT@ifdefined@c@T\percentsign{\let\%\percentsign}}%
  \fi
  \MT@with@package@T{csquotes}{%
    \@ifpackagelater{csquotes}{2005/05/11}{%
      \g@addto@macro\MT@setupfont@hook\@disablequotes
%    \end{macrocode}
%\changes{v3.0e}{2022/04/05}{disable \pkg{csquotes}'s grouping control for \cs{leftprotrusion}
%                            (reported by \contributor Ralf Steinle <rasteinle\at web.de>
%                            and \contributor Denis Bitouz\'e <@\at @>)}
%                            ^^A https://www.listserv.dfn.de/sympa/arc/tex-d-l/2022-04/msg00010.html
%                            ^^A also: https://tex.stackexchange.com/questions/647223/
% For \cs{leftprotrusion}, we disable \pkg{csquotes}'s tracking
% of group level and type, because we'll probably be typesetting
% the opening quotes only.
%    \begin{macrocode}
      \g@addto@macro\MT@prot@hook{%
        \def\csq@bqgroup{\begingroup\leavevmode
          \let\MT@csq@eqgroup\endgroup}%
        \let\csq@eqgroup\endgroup}%
    }{%
      \MT@warning@nl{%
        Should you receive warnings about unknown slot\MessageBreak
        numbers, try upgrading the `csquotes' package}%
    }%
  }%
%    \end{macrocode}
% We disable \microtype's additions inside \pkg{hyperref}'s \cmd\pdfstringdef,
% which redefines lots of commands.
%\changes{v1.9}{2005/09/10}{disable \microtype\ setup inside \pkg{hyperref}'s \cmd\pdfstringdef\
%               (reported by \contributor H\`an \thanhthe{} Th\`anh <hanthethanh\at gmail.com>)}
%                                                  ^^A private mail, 2005/09/10
%\changes{v2.3}{2007/11/11}{disable \cs{microtypecontext} in \pkg{hyperref}'s \cmd\pdfstringdef}
% \pkg{hyperref} doesn't work with plain \TeX, so in that case we don't bother.
%\changes{v3.0b}{2021/12/09}{disable patches for \pkg{tex4ht}}
%    \begin{macrocode}
  \MT@if@false
%</package>
%<plain>  \MT@requires@latex2{
  \MT@with@package@T{hyperref}{%
    \pdfstringdefDisableCommands{%
%<*package>
      \MT@ltx@pickupfont
      \let\textmicrotypecontext\@secondoftwo
      \let\microtypecontext\@gobble
%</package>
      \def\lsstyle{\pdfstringdefWarn\lsstyle}%
      \def\textls#1#{\pdfstringdefWarn\textls}%
    }%
%<package>    \MT@if@true
  }%
%<plain>  }\relax
%<*package>
  \MT@with@package@T{tex4ht}{%
    \def\MT@apply@patch#1{\MT@info{Not applying patch `#1' (for tex4ht)}}%
    \def\MT@undo@patch#1{\MT@info{Not undoing patch `#1' (for tex4ht)}}%
    \MT@if@true
  }%
  \MT@with@package@T{mathastext}\MT@if@true
  \ifMT@if@\g@addto@macro\MT@setupfont@hook\MT@restore@p@h\fi
%    \end{macrocode}
%\changes{v1.9b}{2005/12/19}{compatibility with \pkg{listings}: sanitise more catcodes
%                            (reported by \contributor Holger Uhr <huhr\at uni-paderborn.de>)}
%                                               ^^A MID: <do4gvo$tv$1@news.uni-paderborn.de>
% The \pkg{listings} package makes numbers and letters active,
%    \begin{macrocode}
  \MT@with@package@T{listings}{%
    \g@addto@macro\MT@cfg@catcodes{%
      \MT@while@num{"30}{"3A}{\catcode\@tempcnta=12\relax}%
      \MT@while@num{"41}{"5B}{\catcode\@tempcnta=11\relax}%
      \MT@while@num{"61}{"7B}{\catcode\@tempcnta=11\relax}%
    }%
%    \end{macrocode}
% \dots~and the backslash (which would lead to problems in \cs{MT@get@slot}).
%\changes{v2.0}{2006/09/15}{compatibility with \pkg{listings}: set catcode of backslash to zero
%                           (reported by \contributor Steven Bath <steven128\at iname.com>)}
%                                                     ^^A private mail, 2006/09/15
%    \begin{macrocode}
    \g@addto@macro\MT@setupfont@hook{%
      \catcode`\\=\z@
%    \end{macrocode}
% Inside a listing, \cmd\space\ is redefined.
%\changes{v2.5}{2011/05/03}{restore \cmd\space\ inside \pkg{listings}
%                           (reported by \contributor Rolf Dieterich <rolf.dieterich\at gmx.de>)}
%                           ^^A private mail, 2011/04/30
%                           ^^A (beta:07)
%    \begin{macrocode}
      \def\space{ }%
%    \end{macrocode}
%\changes{v1.9b}{2005/12/23}{compatibility with the \texttt{extendedchar} option of
%                            the \pkg{listings} package}
% When loaded with the |extendedchar| option, \pkg{listings} will also redefine
% 8-bit active characters (\pkg{inputenc}). Luckily, this simple redefinition
% will make them expand to their original definition, so that they could be used
% in the configuration.
%    \begin{macrocode}
      \let\lst@ProcessLetter\@empty
    }%
  }%
%    \end{macrocode}
%\changes{v2.0}{2005/12/21}{compatibility with \pkg{soul}: register \cs{textls} and \cs{lsstyle}} ^^A (beta:3)
% Of course, using both \pkg{soul}'s and \microtype's letterspacing mechanisms
% at the same time doesn't make much sense. But \pkg{soul} can do more, \eg,
% underlining. The optional argument to \cs{textls} may not be used.
%\changes{v2.8}{2020/04/11}{compatibility with \pkg{soul}: patch for font change
%                           (reported by \contributor Md Ayquassar <mdayq0\at lenta.ru>)}
%                           ^^A https://github.com/latex3/babel/issues/53#issuecomment-598307655
% Also, we have to disable expansion within \pkg{soul}'s trial run.
%\changes{v2.3a}{2008/01/06}{fix test for \pkg{soul} under plain \TeX}
% Under plain \TeX, \pkg{soul} doesn't register itself the \LaTeX\ way, so
% we just test for its main command.
%    \begin{macrocode}
%</package>
  \ifx\SOUL@\@undefined\else
    \soulregister\lsstyle 0%
    \soulregister\textls  1%
    \ifx\XeTeXrevision\@undefined
      \let\MT@SOUL@doword\SOUL@doword
      \def\SOUL@doword{\pdfadjustspacing=\z@ \MT@SOUL@doword}%
    \fi
  \fi
%<*package>
  \MT@with@package@T{tikz}\MT@tikz@setup
%    \end{macrocode}
%\changes{v2.1}{2007/01/15}{compatibility with \pkg{pinyin}: disable \microtype\ in \cmd\py@macron\
%                           (reported by \contributor Sven Naumann <svenau\at gmx.net>)}
%                                                 ^^A MID: <87d55hxxdd.fsf@linux.site>
% Compatibility with the \pkg{pinyin} package (from \pkg{CJK}): disable
% \microtype\ in \cmd\py@macron, which loads a different font for the accent.
% In older versions of \pkg{pinyin} (pre-4.6.0),
%\changes{v2.3d}{2009/03/19}{fix \pkg{pinyin} compatibility check
%                            (reported by \contributor Silas~S. Brown <ssb22\at cam.ac.uk>)}
%                                                            ^^A private mail, 2009/03/19
% \cmd\py@macron\ had only one argument.
%    \begin{macrocode}
  \MT@with@package@T{pinyin}{%
    \let\MT@orig@py@macron\py@macron
    \@ifpackagelater{pinyin}{2005/08/11}{% 4.6.0
      \def\py@macron#1#2{%
        \MT@ltx@pickupfont
        \MT@orig@py@macron{#1}{#2}%
        \MT@MT@pickupfont}%
    }{%
      \def\py@macron#1{%
        \MT@ltx@pickupfont
        \MT@orig@py@macron{#1}%
        \MT@MT@pickupfont}%
    }%
  }%
%    \end{macrocode}
%\changes{v3.0}{2021/04/16}{compatibility fix for \pkg{unicode-math} with \pkg{luainputenc}
%                           (reported by \contributor tnull <@\at @>)}
%                            ^^A https://tex.stackexchange.com/questions/592946/microtype-unknown-slot-number-of-character-for-palatino-in-classicthesis-w-l
% The \pkg{luainputenc} package makes all characters active, which can lead into
% problems when the \pkg{unicode-math} package is loaded, as the latter doesn't
% always define characters in <LICR>-conforming ways. By disabling the following command,
% we prevent errors; warnings about unknown slots, however, may still occur --
% but that's one of the unavoidable downsides of using \pkg{luainputenc}.
%    \begin{macrocode}
  \MT@with@package@T{unicode-math}{%
    \MT@let@nc{__um_sub_or_super:n}\relax
  }%
%</package>
}
%</package|letterspace>
%    \end{macrocode}
%
%\subsubsection{Protrusion patches}
%
%\begin{macro}{\ifMT@patch@ok}
%\begin{macro}{\MT@patch@info}
%\begin{macro}{\MT@patch@warn}
%\begin{macro}{\MT@patch@undef}
%\begin{macro}{\MT@patch@info@undo}
% We have to patch some macros to get protrusion right.
%    \begin{macrocode}
%<*package>
\newif\ifMT@patch@ok
\def\MT@patch@info#1{\MT@info{Applying patch `#1'}}
\def\MT@patch@warn#1{\MT@warning{Unable to apply patch `#1'}}
\def\MT@patch@undef#1{\MT@warning{Patch `#1' undefined.\MessageBreak Cannot apply it}}
\def\MT@patch@info@undo#1{\MT@info{Reverting patch `#1'}}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\MT@patches@def}
%\begin{macro}{\MT@define@patch}
% Define a patch and add it to the list of patches.
% The third argument may contain more revert commands, but will
% mostly be empty.
%\changes{v3.1}{2022/09/26}{define patches globally}
%\changes{v3.1}{2022/09/26}{check if patch defined}
%    \begin{macrocode}
\let\MT@patches@def\@gobble
\def\MT@define@patch#1#2#3{%
  \MT@ifdefined@n@TF{MT@patch@@#1}{%
    \MT@warning{Patch `#1' already defined.\MessageBreak Cannot define it}%
  }{%
    \g@addto@macro\MT@patches@def{,#1}%
    \MT@gdef@n{MT@patch@@#1}{#2}%
    \MT@gdef@n{MT@patch@undo@@#1}{#3}%
  }%
}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\begin{macro}{\MT@redefined@patches}
%\begin{macro}{\MT@redefine@patch}
% We also provide an easier way of redefining patches, which
% would otherwise be a bit tricky because of the timing (patches
% are defined \emph{and} executed <ABD>).
%\changes{v3.0a}{2021/12/01}{facilitate redefinition of patches}
%    \begin{macrocode}
\let\MT@redefined@patches\@empty
\def\MT@redefine@patch#1#2#3{%
  \g@addto@macro\MT@redefined@patches{%
    \MT@ifdefined@n@TF{MT@patch@@#1}{%
      \MT@gdef@n{MT@patch@@#1}{#2}%
      \MT@gdef@n{MT@patch@undo@@#1}{#3}%
    }{%
      \MT@warning{Patch `#1' undefined.\MessageBreak Cannot redefine it}%
    }%
  }%
}
%    \end{macrocode}
%\end{macro}
%\end{macro}
% Both macros are only allowed in the preamble.
%    \begin{macrocode}
\@onlypreamble\MT@define@patch
\@onlypreamble\MT@redefine@patch
%    \end{macrocode}
%\begin{macro}{\MT@append@patch}
%\begin{macro}{\MT@patch@patch}
%\begin{macro}{\MT@patch@patch@app}
% Wrappers around \pkg{etoolbox} commands.
% We also remember the original command to allow unpatching.
%    \begin{macrocode}
\def\MT@append@patch#1#2{%
  \MT@remember@patch{#1}%
  \apptocmd#1{#2}\relax\MT@patch@okfalse
}
\def\MT@patch@patch#1#2#3{%
  \MT@remember@patch{#1}%
  \patchcmd#1{#2}{#3}\relax\MT@patch@okfalse
}
\def\MT@patch@patch@app#1#2#3{%
  \MT@patch@patch#1{#2}{#2#3}%
}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\MT@remember@patch}
% Remember the original definition and add to undo command.
%    \begin{macrocode}
\def\MT@remember@patch#1{%
  \MT@ifdefined@n@TF{MT@patch@saved@\string#1}\relax
    {\MT@let@nc{MT@patch@saved@\string#1}#1%
     \MT@exp@cs\g@addto@macro{MT@patch@undo@@\MT@patch@name}%
       {\MT@let@cn#1{MT@patch@saved@\string#1}}}%
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@patches@applied}
%\begin{macro}{\MT@apply@patch}
% Apply a previously defined patch.
%\changes{v3.0a}{2021/11/23}{compatibility with \pkg{babel}\slash\texttt{spanish}:
%                           fix catcodes}
% With some packages, we have to reset catcodes (\eg, for the `|item|'
% patch with Spanish \pkg{babel}, which makes `|>|' active).
%    \begin{macrocode}
\let\MT@patches@applied\@gobble
\def\MT@apply@patch#1{%
  \MT@patch@oktrue
  \MT@ifdefined@n@TF{MT@patch@@#1}
    {\MT@in@clist{#1}\MT@patches@applied
     \ifMT@inlist@
       \MT@warning{Patch `#1' has already been applied,\MessageBreak
                   cannot reapply it}%
     \else
       \let\MT@restore@catcodes\@empty
       \MT@with@babel@and@T{spanish} {\MT@fix@catcode{62}{12}}% >
       \MT@with@babel@and@T{galician}{\MT@fix@catcode{62}{12}}% >
       \def\MT@patch@name{#1}%
       \g@addto@macro\MT@patches@applied{,#1}%
       \@nameuse{MT@patch@@#1}%
       \@nameuse{MT@patch@\ifMT@patch@ok info\else warn\fi}{#1}%
       \MT@restore@catcodes
     \fi}
    {\MT@patch@undef{#1}}%
}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\begin{macro}{\MT@undo@patch}
% Undo a patch (if indeed previously applied).
%    \begin{macrocode}
\def\MT@undo@patch#1{%
  \MT@in@clist{#1}\MT@patches@applied
  \ifMT@inlist@
    \MT@rem@from@clist{#1}\MT@patches@applied
    \@nameuse{MT@patch@undo@@#1}%
    \MT@patch@info@undo{#1}%
  \else
    \MT@warning{Patch `#1' hasn't been applied,\MessageBreak cannot revert it}%
  \fi
}
%    \end{macrocode}
%\end{macro}
% Unfortunately, \pkg{etoolbox} is a bit bitchy with hashes in arguments
% (but who would blame it), so I currently see no other solution than to
% temporarily reset the catcode of the \# character.
%    \begin{macrocode}
{\catcode`\#=12
\MT@addto@setup{%
%    \end{macrocode}
% Now for the actual patches:
%\begin{description}
% \item [|item|] \cmd\@item, which is a kind of catch-all, as it's internally
%    used for most basic environments (\eg, |itemize|, |enumerate|, but also
%    |quote|, |flushleft| etc.). For |verse| (and probably other environments), ^^A found by \contributor Antonis Tsolomitis <antonis.tsolomitis\at gmail.com>, private mail, 2021/08/01
%    we also have to patch \cmd\everypar~\dots
% \begin{itemize}
%\changes{v3.0}{2021/05/20}{protrusion patch for \cmd\item}
%   \item for the base classes
%    \begin{macrocode}
  \MT@define@patch{item}{%
    \MT@append@patch\@item\leftprotrusion
    \MT@patch@patch\@item{\everypar{}}{\everypar{\leftprotrusion}}%
%    \end{macrocode}
% \item \cls{beamer} patches it too
%    \begin{macrocode}
    \@ifclassloaded{beamer}
      {\MT@append@patch\beamer@@callorigitem\leftprotrusion
       \MT@patch@patch@app\beamer@callorigitem\ignorespaces\leftprotrusion}
%    \end{macrocode}
% \item the \cls{simplecv} class
%    \begin{macrocode}
      {\@ifclassloaded{simplecv}
        {\MT@append@patch\@topic@item\leftprotrusion}
        {}}%
  }{}%
%    \end{macrocode}
% \end{itemize}
% \item [|toc|] <TOC> and friends
%\changes{v3.0}{2021/05/20}{protrusion patch for <TOC>}
%    \begin{macrocode}
  \MT@define@patch{toc}{%
    \MT@append@patch\numberline\leftprotrusion
%    \end{macrocode}
% \begin{itemize}
%   \item for the \cls{memoir} class we also fix the extra leader problem~\dots
%    \begin{macrocode}
    \@ifclassloaded{memoir}
      {\MT@append@patch\booknumberline\leftprotrusion
       \MT@append@patch\partnumberline\leftprotrusion
       \MT@append@patch\chapternumberline\leftprotrusion
       \MT@append@patch\cftbookafterpnum\noprotrusion
       \MT@append@patch\cftpartafterpnum\noprotrusion
       \MT@append@patch\cftchapterafterpnum\noprotrusion
       \MT@append@patch\cftsectionafterpnum\noprotrusion
       \MT@append@patch\cftsubsectionafterpnum\noprotrusion
       \MT@append@patch\cftsubsubsectionafterpnum\noprotrusion
       \MT@append@patch\cftparagraphafterpnum\noprotrusion
       \MT@append@patch\cftsubparagraphafterpnum\noprotrusion
       \MT@append@patch\cftfigureafterpnum\noprotrusion
       \MT@append@patch\cfttableafterpnum\noprotrusion}
      {}%
  }{}%
%    \end{macrocode}
% \item for the <\cls{KOMA}> classes (which load the \pkg{tocbasic} package)
%       we additionally have to switch protrusion back on; this will
%       re-introduce the risk of getting an extra leader dot, but I
%       currently don't see how to easily add \cmd\noprotrusion.
%       Therefore, I'll skip this patch for now, saving the joy of wading
%       through |scr| files for later, all the while waiting for somebody
%       who would understand <\cls{KOMA}> better than me.
%\todo{fix KOMA patch (add \cmd\noprotrusion)}
%    \begin{macrocode}
%    \@ifpackageloaded{tocbasic}
%      {\MT@define@patch{toc}
%        {\MT@append@patch\numberline\leftprotrusion
%         \setuptoc{toc}{noprotrusion}%
%         \setuptoc{lof}{noprotrusion}%
%         \setuptoc{lot}{noprotrusion}}
%        {\unsettoc{toc}{noprotrusion}%
%         \unsettoc{lof}{noprotrusion}%
%         \unsettoc{lot}{noprotrusion}}}{}%
%    \end{macrocode}
% \item (a patch for \pkg{titletoc} would also be worthwhile~\dots)
%\todo{patch for \pkg{titletoc}}
% \end{itemize}
% \item [|eqnum|] equation numbers
%\changes{v3.0}{2021/05/21}{protrusion patch for equation numbers
%                           (provided by \contributor Holger Gerhardt <holger.gerhardt\at uni-bonn.de>)}
%\changes{v3.0a}{2021/11/22}{protrusion patch \texttt{eqnum} for \cls{IEEEtran}}
%\changes{v3.2}{2024/12/12}{protrusion patch \texttt{eqnum}: fix for \pkg{showkeys}}
% \begin{itemize}
%  \item \cls{IEEEtran}
%    \begin{macrocode}
  \MT@define@patch{eqnum}{%
    \@ifclassloaded{IEEEtran}
      {\MT@patch@patch\theequationdis{(}{\leftprotrusion{(}}%
       \MT@patch@patch\theequationdis{)}{\rightprotrusion{)}}%
       \MT@patch@patch\theIEEEsubequationdis{(}{\leftprotrusion{(}}%
       \MT@patch@patch\theIEEEsubequationdis{)}{\rightprotrusion{)}}}
      {}%
%    \end{macrocode}
%  \item \cmd\eqref\ (\pkg{amsmath}) relies on \cmd\tagform@, so we have to have it
%        use the original definition. The \pkg{showkeys} package also modifies this
%        command, as well as \cmd\@eqnnum\space (below); we don't test for the package
%        itself but the relevant command, which is only redefined <ABD>.
%    \begin{macrocode}
    \@ifpackageloaded{amsmath}
      {\MT@ifdefined@c@TF\SK@tagform@
        {\MT@patch@patch\SK@tagform@{(}{\leftprotrusion{(}}%
         \MT@patch@patch\SK@tagform@{)}{\rightprotrusion{)}}}
        {\MT@patch@patch\tagform@{(}{\leftprotrusion{(}}%
         \MT@patch@patch\tagform@{)}{\rightprotrusion{)}}}%
%    \end{macrocode}
% The command has been made robust in 2022.
%\changes{v3.0e}{2022/05/21}{protrusion patch \texttt{eqnum}: adjust to robustness of \cmd\eqref\
%                            (\LaTeX\ 2022-06-01), cf. \githubissue{19}}
%    \begin{macrocode}
       \MT@ifdefined@n@TF{eqref }
         {\MT@exp@cs\MT@patch@patch{eqref }}{\MT@patch@patch\eqref}
           {\tagform@}{\@nameuse{MT@patch@saved@\string\tagform@}}%
%    \end{macrocode}
%   \item If the user has altered the tags' appearance via \pkg{mathtools}'s \cmd\newtagform\
%         interface, our patch won't have any effect. We don't issue a warning
%         because \verb/\(left|right)protrusion/ might have been specified appropriately
%         in \cmd\newtagform. We could also patch the latter command (or, to be more
%         precise, |\MT_define_tagform:nwnn|), but the timing is a bit tricky, so
%         for now info it is.
%\todo{patch for \pkg{mathtools}'s \cmd\newtagform}
%\changes{v3.0c}{2021/12/30}{info that protrusion patch \texttt{eqnum} may not be effective with \pkg{mathtools}
%                           (reported by \contributor user182849 <@\at @>)}
%                           ^^A https://tex.stackexchange.com/questions/628090/usetagform-incompatible-with-microtype/
%\changes{v3.2}{2024/12/12}{protrusion patch \texttt{eqnum}: fix for \cls{IEEEtran}}
%    \begin{macrocode}
       \MT@with@package@T{mathtools}{%
         \ifMT@patch@ok\else \MT@patch@oktrue
           \MT@info@nl{The `eqnum' patch may not be effective because you are\MessageBreak
               using the mathtools package. Make sure to insert\MessageBreak
               `\@backslashchar leftprotrusion' and
               `\@backslashchar rightprotrusion' as\MessageBreak
               appropriate in mathtools's `\@backslashchar newtagform' command}%
         \fi}}
      {\@ifclassloaded{IEEEtran}{}
        {\MT@ifdefined@c@TF\SK@eqnnum
          {\MT@patch@patch\SK@eqnnum{(}{\leftprotrusion{(}}%
           \MT@patch@patch\SK@eqnnum{)}{\rightprotrusion{)}}}%
          {\MT@patch@patch\@eqnnum{(}{\leftprotrusion{(}}%
           \MT@patch@patch\@eqnnum{)}{\rightprotrusion{)}}}}}%
  }{}%
%    \end{macrocode}
% \end{itemize}
% \item [|footnote|] footnote text (only visible with block paragraphs)
%\changes{v3.0}{2021/05/25}{protrusion patch for footnote text}^^A
%\changes{v3.0c}{2022/01/21}{protrusion patch \texttt{footnote}: also for minipages}^^A
% \begin{itemize}
%   \item The new footnote code (in \file{latex-lab-footnotes.ltx}), which is meant
%         to facilitate tagging, introduces many hooks, among them |fntext/begin|, which
%         would seem appropriate for us. Unfortunately, however, we cannot use it, as we'd
%         stumble over the hook management itself.
%^^A see my feature request at https://github.com/latex3/tagging-project/issues/726
%         I think it's unnecessary to patch the |expl3| version too, but I suppose
%         it won't do any harm either.
%         There's no new code for footnotes in minipages at the moment.
%\changes{v3.2}{2024/10/03}{fix protrusion patch \texttt{footnote} for tagging
%                           (reported by \contributor hpvd <@\at @>) \githubissue{40}}
%    \begin{macrocode}
  \MT@define@patch{footnote}{%
    \MT@ifdefined@n@TF{fnote_footnotetext:n}
      {\ExplSyntaxOn
       \MT@patch@patch@app\@footnotetext\ignorespaces\leftprotrusion
       \MT@exp@cs\MT@patch@patch@app{fnote_footnotetext:n}\ignorespaces\leftprotrusion
       \MT@patch@patch@app\@mpfootnotetext\ignorespaces\leftprotrusion
       \ExplSyntaxOff}
%    \end{macrocode}
%   \item \pkg{fnbreak} patches the footnote command <ABD>, overwriting everything else.
%         This also means that we can only patch it if \pkg{fnbreak} has been loaded first.
%\changes{v3.2a}{2025/01/07}{fix protrusion patch \texttt{footnote} with \pkg{fnbreak}
%                            (reported by \contributor Rimole <@\at @>) \githubissue{44}}
%    \begin{macrocode}
      {\@ifpackageloaded{fnbreak}
        {\MT@ifdefined@c@TF\fnb@orig@footnotetext
          {\MT@patch@patch@app\@footnotetext\fnb@fnstart\leftprotrusion}
          {\MT@warning{Unable to apply patch `footnote'.\MessageBreak
                       Load package `fnbreak' before `microtype'}}}%
%    \end{macrocode}
%   \item \pkg{hyperref} also patches this command (but only if |hyperfootnotes=true|,
%         |implicit=true| and \cmd\hyper@nopatch@footnote\ is undefined)
%\changes{v3.0a}{2021/11/30}{fix protrusion patch \texttt{footnote} with \pkg{hyperref}
%                           (reported by \contributor Liang-Bo Wang <@\at @>) \githubissue{2}}
%\changes{v3.0e}{2022/05/13}{fix protrusion patch \texttt{footnote} for \pkg{hyperref}
%                            with option \texttt{implicit!=false}}
%\changes{v3.0e}{2022/05/21}{fix protrusion patch \texttt{footnote} for \pkg{hyperref}
%                            if \cmd\hyper@nopatch@footnote\ is defined}
%    \begin{macrocode}
        {\@ifpackageloaded{hyperref}
          {\MT@if@false
           \ifHy@implicit
             \ifHy@hyperfootnotes
               \MT@ifdefined@c@TF\hyper@nopatch@footnote\relax
                 \MT@if@true
             \fi
           \fi
           \ifMT@if@\expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi}
          \@secondoftwo
        {\MT@patch@patch@app\@footnotetext\ignorespaces\leftprotrusion
         \MT@patch@patch@app\@footnotetext{\@empty\ignorespaces}\leftprotrusion
         \MT@patch@patch@app\@mpfootnotetext\ignorespaces\leftprotrusion
         \MT@patch@patch@app\@mpfootnotetext{{\expandafter\hyper@@anchor
                 \expandafter{\Hy@footnote@currentHref}{\relax}}\ignorespaces}
             \leftprotrusion}
%    \end{macrocode}
%   \item \cls{memoir} additionally allows footnotes in the margins
%    \begin{macrocode}
        {\@ifclassloaded{memoir}
          {\MT@patch@patch\@footnotetext{\foottextfont #1}{\foottextfont\leftprotrusion #1}%
           \MT@patch@patch\@mpfootnotetext{\foottextfont #1}{\foottextfont\leftprotrusion #1}}
%    \end{macrocode}
%   \item \cls{beamer} has it its own way, of course
%\changes{v3.0e}{2022/05/13}{fix protrusion patch \texttt{footnote} with \cls{beamer}}
%    \begin{macrocode}
          {\@ifclassloaded{beamer}
            {\MT@exp@cs\MT@patch@patch@app{beamerx@\string\beamer@framefootnotetext}
                 \ignorespaces\leftprotrusion
             \MT@exp@cs\MT@patch@patch@app{beamerx@\string\@mpfootnotetext}
                 \ignorespaces\leftprotrusion}
%    \end{macrocode}
%   \item the <\cls{KOMA}> classes
%\changes{v3.0a}{2021/12/02}{fix protrusion patch \texttt{footnote} with <\cls{KOMA}> classes
%                           (reported by \contributor MisterFiLou <@\at @>) \githubissue{2}}
%\changes{v3.1}{2022/08/03}{fix test for <\cls{KOMA}> classes in protrusion patch \texttt{footnote}
%                           (also reported by \contributor David Purton <@\at @>) \githubissue{26}}
%    \begin{macrocode}
            {\MT@ifdefined@c@TF\KOMAClassName
              {\MT@patch@patch@app\scr@saved@footnotetext\ignorespaces\leftprotrusion
               \MT@patch@patch@app\@mpfootnotetext\ignorespaces\leftprotrusion}
%    \end{macrocode}
%   \item \pkg{changebar}
%\changes{v3.2a}{2025/01/07}{fix protrusion patch \texttt{footnote} with \pkg{changebar}
%                            (reported by \contributor Rimole <@\at @>) \githubissue{45}}
%    \begin{macrocode}
              {\@ifpackageloaded{changebar}
                {\MT@patch@patch\@footnotetext{#1}{\leftprotrusion#1}%
                 \MT@patch@patch\@footnotetext{#1\cb@end}{\leftprotrusion#1\cb@end}%
                 \MT@patch@patch\@mpfootnotetext{#1}{\leftprotrusion#1}%
                 \MT@patch@patch\@mpfootnotetext{#1\cb@end}{\leftprotrusion#1\cb@end}}
%    \end{macrocode}
%   \item finally, the base classes
%    \begin{macrocode}
                {\MT@patch@patch@app\@footnotetext\ignorespaces\leftprotrusion
                 \MT@patch@patch@app\@mpfootnotetext\ignorespaces\leftprotrusion}}}}}}}%
  }{}%
%    \end{macrocode}
% \end{itemize}
% \item [|verbatim|] disable all microtypographic extensions in
%                    verbatim blocks. (This could have been another nice opportunity
%                    to use the new \LaTeX\ hook management, however, the hook
%                    here is executed too early -- namely, before the |\par| in
%                    \cmd\@verbatim, which may result in spilling the
%                    microtypographic settings to the preceding paragraph -- so
%                    we're resorting to patching, again.)
%\changes{v3.1}{2022/09/29}{new protrusion patch \texttt{verbatim}}
%   \begin{itemize}
%      \item Appending to \cmd\@verbatim\ works for, at least, the standard
%            classes, \pkg{verbatim} (and \cls{memoir}); the implementations
%            in \pkg{fancvrb} and \pkg{listings} don't allow protrusion anyway.
%    \begin{macrocode}
  \MT@define@patch{verbatim}{%
    \MT@append@patch\@verbatim{\microtypesetup{activate=false}}%
%    \end{macrocode}
%      \item package \pkg{alltt}
%    \begin{macrocode}
    \MT@with@package@T{alltt}{\MT@append@patch\alltt{\microtypesetup{activate=false}}}%
  }{}
%    \end{macrocode}
%   \end{itemize}
%\end{description}
% Finally, execute any redefinitions.
%    \begin{macrocode}
  \MT@redefined@patches
}}
%</package>
%    \end{macrocode}
%
%\subsection{Font setup}\label{sub:font-setup}
%
%\changes{v1.6}{2005/01/19}{load a font if none is selected}
% We need a font (the \cls{minimal} class doesn't load one).
%    \begin{macrocode}
%<package>\expandafter\ifx\the\font\nullfont\normalfont\fi
%    \end{macrocode}
%
%\begin{macro}{\MT@setupfont}
% Setting up a font entails checking for each feature whether it should be
% applied to the current font (\cs{MT@font}).
%    \begin{macrocode}
%<*pdf-|lua-|xe->
\def\MT@setupfont{%
%    \end{macrocode}
%\changes{v2.5}{2012/08/22}{select font with \pkg{fontspec} (found by \contributor Georg Duffner <g.duffner\at gmail.com>)}
%                           ^^A private mail, 2012/08/17
%\changes{v2.7b}{2018/02/21}{always select current font with \xetex\ and \luatex\ (reported by \contributor Paolo Ney <@\at @>,
%                            solution by \contributor Ulrike Fischer <news3\at nililand.de>)}
%                            ^^A (1) https://tex.stackexchange.com/questions/416310/problem-of-amsart-and-microtype-under-xelatex
%                            ^^A (2) private mail, 2018/02/20
% With \xetex\ and \luatex\ the font may not be actually loaded,
% hence we might see a wrong font (in \cs{MT@get@slot}).
% Therefore, we first load the current font.
%    \begin{macrocode}
%<xe-|lua->  \MT@font
%    \end{macrocode}
% We might have to disable stuff when used together with adventurous
% packages.
%    \begin{macrocode}
  \MT@setupfont@hook}
%    \end{macrocode}
% This will use a copy of the font (allowing for expansion parameter variation
% and the use of more than one set of protrusion factors for a font within one
% paragraph).
%    \begin{macrocode}
%<pdf->\MT@requires@pdftex7{
%<pdf-|lua->\g@addto@macro\MT@setupfont\MT@copy@font
%<pdf->}\relax
%    \end{macrocode}
% The font properties must be extracted from \cs{MT@font}, since the current
% value of \cmd\f@encoding\ and friends may be wrong!
%    \begin{macrocode}
\g@addto@macro\MT@setupfont{%
  \MT@exp@two@c\MT@split@name\string\MT@font/\@nil
%    \end{macrocode}
% Try to find a configuration file for the current font family.
%\changes{v1.2}{2004/09/29}{also search for alias font file}
%    \begin{macrocode}
  \MT@exp@one@n\MT@find@file\MT@family
  \ifx\MT@familyalias\@empty \else
    \MT@exp@one@n\MT@find@file\MT@familyalias\fi
%    \end{macrocode}
%\changes{v1.2}{2004/09/26}{fix: call \cmd\@@enc@update\ if necessary}
% We have to make sure that \cmd\cf@encoding\ expands to the correct value (for
% later, in \cs{MT@get@slot}), which isn't the case when \cmd\selectfont\
% chooses a new encoding (this would be done a second later in
% \cmd\selectfont, anyway -- three lines, to be exact).
% (I think, I do not need this anymore -- however, I'm too afraid to remove it.
% \dots\ Oops, I did it. Let's see whether anybody complains.)
%\changes{v2.2}{2007/04/15}{don't call \cmd\@@enc@update\ anymore}
%    \begin{macrocode}
% \ifx\f@encoding\cf@encoding\else\@@enc@update\fi
}
%    \end{macrocode}
% Tracking has to come first, since it means actually loading a different font.
%\changes{v2.2}{2007/04/15}{only add features that are available with the respective \pdftex}
%    \begin{macrocode}
%<pdf->\MT@requires@pdftex6
%<lua->\MT@requires@luatex3
%<pdf-|lua->{
%<pdf-|lua-|xe->  \g@addto@macro\MT@setupfont\MT@tracking
%<pdf-|lua->}\relax
\g@addto@macro\MT@setupfont{%
  \MT@check@font
  \ifMT@inlist@
%<debug>\MT@show@pdfannot2%
  \else
    \MT@vinfo{Setting up font `\MT@@font'\on@line}%
    \MT@info@notracking
%    \end{macrocode}
% Now we can begin setting up the font for all features that the current
% \pdftex\ provides. The following commands are \cmd\let\ to \cmd\relax\ if the
% respective feature is disabled via package options.
%
% For versions older than 1.20, protrusion has to be set up first, beginning
% with 1.20, the order doesn't matter.
%    \begin{macrocode}
  \MT@protrusion
%<pdf-|lua->  \MT@expansion
}
%    \end{macrocode}
% Interword spacing and kerning (\pdftex\ 1.40).
%    \begin{macrocode}
%<*pdf->
\MT@requires@pdftex6{
\g@addto@macro\MT@setupfont{\MT@spacing\MT@kerning}
}\relax
%</pdf->
%    \end{macrocode}
% Disable ligatures (\pdftex\ 1.30).
%    \begin{macrocode}
%<pdf->\MT@requires@pdftex5{
%<pdf-|lua->\g@addto@macro\MT@setupfont\MT@noligatures
%<pdf->}\relax
\g@addto@macro\MT@setupfont{%
%    \end{macrocode}
% Debugging.
%    \begin{macrocode}
%<debug>\MT@show@pdfannot1%
%    \end{macrocode}
% Finally, register the font so that we don't set it up anew each time.
%    \begin{macrocode}
    \MT@register@font
  \fi
}
%</pdf-|lua-|xe->
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@copy@font}
%\changes{v2.2}{2007/07/03}{optionally work on copies of fonts}
%\begin{macro}{\MT@copy@font@}
% The new (1.40.4) \cmd\pdfcopyfont\ command allows expanding a font with
% different parameters, or to use more than one set of protrusion factors for a
% given font within one paragraph. It will be used when we find a context for
% \cs{SetProtrusion} or \cs{SetExpansion} in the preamble, or when the package
% has been loaded with the \opt{copyfonts} option.
%    \begin{macrocode}
%<*pdf-|lua->
\let\MT@copy@font\relax
%<pdf->\MT@requires@pdftex7{
\def\MT@copy@font@{%
%    \end{macrocode}
%\begin{macro}{\MT@font@copy}
% For every new protrusion and expansion context, we create a new copy.
%\changes{v2.3b}{2008/04/15}{enable font copies also with protrusion contexts
%                            (reported by \contributor Nathan Rosenblum <nater\at cs.wisc.edu>)}
%                                                               ^^A private mail, 2008/04/14
%    \begin{macrocode}
  \xdef\MT@font@copy{\csname\MT@@font/\MT@pr@context/\MT@ex@context\endcsname}%
  \expandafter\ifx\MT@font@copy\relax
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@font@orig}
% \pdftex\ doesn't allow copying a font that has already been copied and
% expanded\slash letterspaced. Hence, we have to get the original.
%    \begin{macrocode}
    \edef\MT@font@orig{\csname\expandafter\string\font@name @orig\endcsname}%
    \expandafter\ifx\MT@font@orig\relax
      \MT@exp@two@c\MT@glet\MT@font@orig\font@name
    \else
      \MT@exp@two@c\let\font@name\MT@font@orig
    \fi
%<pdf->    \global\MT@exp@two@c\pdfcopyfont\MT@font@copy\font@name
%    \end{macrocode}
%\end{macro}
% Even though \luatex\ also provides the primitive from \pdftex\ (even renamed to
% \cmd\copyfont, that is, `promoted' as per the \luatex\ manual), it is seriously
% crippled in that OpenType features will be lost. ^^A see https://mailman.ntg.nl/pipermail/ntg-context/2016/087541.html seqq.
%\changes{v2.7d}{2019/11/17}{in \luatex, don't use the \cmd\copyfont\ primitive, but load the font anew
%                            (reported by \contributor Paolo Polesana <@\at @> and
%                                         \contributor Oliver Kopp <koppdev\at gmail.com>)}
%                                          ^^A https://tex.stackexchange.com/questions/338942/cancellation-of-color-fontspec-font-settings-while-defining-microtype-context
%                                          ^^A https://tex.stackexchange.com/questions/419288/microtypecontext-with-lualatex
% Therefore, we do not copy the font but load it anew.
%    \begin{macrocode}
%<lua->    \MT@exp@two@c\MT@lua@copyfont\meaning\font@name\@nil
%<debug>\MT@dinfo1{creating new copy: \MT@font@copy}%
%    \end{macrocode}
% Since it's a new font, we have to remove it from the context lists.
%    \begin{macrocode}
    \MT@map@clist@c\MT@active@features{%
      \MT@exp@cs\ifx{MT@\@nameuse{MT@abbr@##1}}\relax\else
        \def\@tempa{##1}%
        \MT@exp@cs\MT@map@tlist@c{MT@##1@doc@contexts}\MT@rem@from@list
      \fi
    }%
  \fi
  \MT@exp@two@c\let\MT@font\MT@font@copy
%    \end{macrocode}
% We only need the font identifier for letterspacing.
%    \begin{macrocode}
  \let\font@name\MT@font@copy
%    \end{macrocode}
% But we have to properly substitute the font after we're done.
%    \begin{macrocode}
  \aftergroup\let\aftergroup\font@name\aftergroup\MT@font@copy
}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\begin{macro}{\MT@rem@from@list}
%    \begin{macrocode}
\def\MT@rem@from@list#1{%
  \MT@exp@cs\ifx{MT@\@tempa @#1font@list}\relax\else
    \expandafter\MT@exp@one@n\expandafter\MT@rem@from@clist\expandafter
       \MT@font \csname MT@\@tempa @#1font@list\endcsname
  \fi
}
%<pdf->}\relax
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@lua@copy@font} ^^A TODO: \fontname ?
% \meta{\#1} and \meta{\#2} are `|select|' and `|font|', respectively,
% \meta{\#3} is the font spec.
%    \begin{macrocode}
%<lua->\def\MT@lua@copyfont #1 #2 #3\@nil{%
%<lua->  \global\expandafter\font\MT@font@copy=#3\relax}
%</pdf-|lua->
%    \end{macrocode}
%\end{macro}
%\ifpdf\phantomsection\fi\label{exp-hack}
%\paragraph{Here's the promised dirty trick}
% for users of older \pdftex\ versions, which works around the problem that the
% use of the same font with different expansion parameters is prohibited. If
% you do not want to create a clone of the font setup (this would require
% duplicating the \file{tfm}/\file{vf} files under a new name, and writing new
% \file{fd} files and \file{map} entries), you can load a minimally larger font
% for the paragraph in question. E.g., for a document typeset in 10\,pt:
%\begin{verbatim}[gobble=2,morekeywords={[0]{\expandpar}}]
% \SetExpansion
%    [ stretch = 30,
%      shrink  = 60,
%      step    =  5 ]
%    { encoding = *,
%      size = 10.001 }
%    { }
% \newcommand{\expandpar}[1]{{%
%    \fontsize{10.001}{\baselineskip}\selectfont #1\par}}
% % ...
% \expandpar{This paragraph contains an `unnecessary' widow.}
%\end{verbatim}
% Note that the \cmd\expandpar\ command can only be applied to complete
% paragraphs. If you are using Computer Modern Roman, you have to load the
% \pkg{fix-cm} package to be able to select fonts in arbitrary sizes. Finally,
% the reason I suggest to use a larger font, and not a smaller one, is to
% prevent a different design size being selected.
%
%\bigskip
%\begin{macro}{\MT@fix@fontdimen@six}
%\changes{v1.8}{2005/05/03}{new macro: test whether \fontdim6 is defined}
%\changes{v2.3e}{2009/08/31}{fix: gobbling settings with tracking failed
%                            (reported by \contributor Leo <sdl.web\at gmail.com>)}
%                                             ^^A MID: <m0vdk4g8t2.fsf@cam.ac.uk>
%\changes{v2.8}{2020/05/25}{try to fix zero \fontdim6}
%\changes{v3.1b}{2023/12/04}{compatibility with \luatex\ in <DVI> mode
%                            (reported by \contributor Linas Stonys <lstonys\at vtex.lt>)}
%                                          ^^A private mail, 2023/11/30
%\begin{macro}{\MT@dimen@six}
% If \fontdim6 is zero, character protrusion, spacing, kerning and tracking
% won't work, and we could skip the settings (for example, the \pkg{dsfont}
% fonts don't specify this dimension; this is probably a bug -- the \pkg{fourier}
% and \pkg{newpx}/\pkg{newtx} packages have been fixed in the meantime).
% However, we can fix it ourselves (and since \pdftex\ 1.40.23, this also works
% for \cmd\letterspacefont). ^^A https://mailman.ntg.nl/pipermail/ntg-pdftex/2021-June/004335.html
% \xetex\ (and newer \luatex\ in <DVI> mode) doesn't provide an equivalent to
% \cmd\pdffontsize, so we use the nominal size instead.
%    \begin{macrocode}
%<*pdf-|lua-|xe->
\def\MT@fix@fontdimen@six{%
  \ifnum\fontdimen6\MT@font=\z@
    \fontdimen6\MT@font=%
%<pdf->      \pdffontsize\MT@font
%<lua->      \MT@requires@luatex4{\ifnum\outputmode=\@ne \pdffeedback fontsize\else
%<lua-|xe->               \MT@size pt%
%<lua->                          \expandafter\@gobble\fi}{\pdffontsize}\MT@font
    \MT@info{Fixing zero \@backslashchar fontdimen 6 for font `\MT@@font'\MessageBreak
             (new value: \the\fontdimen6\MT@font)}%
%<pdf->    \MT@requires@pdftex8\relax{\MT@glet@nc{\MT@@font-fake6}\@empty}%
  \fi
  \edef\MT@dimen@six{\number\fontdimen6\MT@font}%
}
%</pdf-|lua-|xe->
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\begin{macro}{\MT@split@name}
%\changes{v1.7}{2005/02/27}{don't define \cs{MT@encoding} \&c. \cmd\global ly}
%\changes{v2.0}{2006/12/19}{adjust to possible letterspacing}
%\begin{macro}{\MT@encoding}
%\begin{macro}{\MT@family}
%\begin{macro}{\MT@series}
%\begin{macro}{\MT@shape}
%\begin{macro}{\MT@size}
% Split up the font name (\meta{\#6} may be a protrusion\slash expansion
% context and/or a letterspacing amount). ^^A really?
% With \pkg{fontspec} we also need to remove its internal instance counter.
%    \begin{macrocode}
%<*package>
\def\MT@split@name#1/#2/#3/#4/#5/#6\@nil{%
  \def\MT@encoding{#1}%
  \ifMT@fontspec
    \edef\MT@family{\MT@scrubfeature#2()\relax}%
  \else
    \def\MT@family{#2}%
  \fi
  \def\MT@series  {#3}%
  \def\MT@shape   {#4}%
  \def\MT@size    {#5}%
  \MT@fix@fontdimen@six
%    \end{macrocode}
%\begin{macro}{\MT@familyalias}
% Alias family?
%\changes{v1.2}{2004/09/29}{define alias font name as an alternative, not
%                          as a replacement}
%    \begin{macrocode}
  \MT@ifdefined@n@TF{MT@\MT@family @alias}%
    {\MT@let@cn\MT@familyalias{MT@\MT@family @alias}}%
    {\let\MT@familyalias\@empty}%
}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\MT@scrubfeature}
%\begin{macro}{\MT@scrubfeatures}
% Remove one resp. all feature counters (\pkg{fontspec}).
%\changes{v2.5}{2010/02/27}{compatibility with \pkg{fontspec}: remove its internal counter}
%    \begin{macrocode}
\def\MT@scrubfeature#1(#2)#3\relax{#1}
\def\MT@scrubfeatures#1(#2)#3\relax{%
  #1%
  \ifx\relax#3\relax\else
    \MT@scrubfeatures#3\relax
  \fi
}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\begin{macro}{\ifMT@do}
%\begin{macro}{\MT@feat}
%\begin{macro}{\MT@maybe@do}
% We check all features of the current font against the lists of the currently
% active font set, and set \cs{ifMT@do} accordingly.
%\changes{v1.2}{2004/09/29}{also check for alias font name}
%\changes{v1.9}{2005/09/28}{redone}
%    \begin{macrocode}
\newif\ifMT@do
\def\MT@maybe@do#1{%
%    \end{macrocode}
% (but only if the feature isn't globally set to false)
%    \begin{macrocode}
  \csname ifMT@\csname MT@abbr@#1\endcsname\endcsname
%    \end{macrocode}
% Begin with setting micro-typography to true for this font. The
% |\MT@checklist@...| tests will set it to false if the property is not in
% the list. The first non-empty list that does not contain a match will stop us
% (except for |font|).
%    \begin{macrocode}
    \MT@dotrue
    \edef\@tempa{\csname MT@#1@setname\endcsname}%
    \MT@map@clist@n{font,encoding,family,series,shape,size}{%
      \MT@ifdefined@n@TF{MT@checklist@##1}%
        {\csname MT@checklist@##1\endcsname}%
        {\MT@checklist@{##1}}%
      {#1}%
    }%
  \else
    \MT@dofalse
  \fi
  \ifMT@do
%    \end{macrocode}
% \cs{MT@feat} stores the current feature.
%    \begin{macrocode}
    \def\MT@feat{#1}%
    \csname MT@set@#1@codes\endcsname
  \else
    \MT@ifstreq{#1}{tr}%
      {\let\MT@info@notracking\MT@info@notracking@}%
      {\MT@vinfo{... No \@nameuse{MT@abbr@#1}}}%
  \fi
}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\MT@info@notracking}
%\begin{macro}{\MT@info@notracking@}
%\changes{v2.7a}{2017/11/17}{defer `No tracking' message}
% To defer the message to after the font has actually been logged.
%    \begin{macrocode}
\let\MT@info@notracking\relax
\def\MT@info@notracking@{\MT@vinfo{... No tracking}}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\begin{macro}{\MT@dinfo@list}
%    \begin{macrocode}
%<debug>\def\MT@dinfo@list#1#2#3{\MT@dinfo@nl{1}{\@nameuse{MT@abbr@#1}: #2
%<debug>  \ifx\\#3\\list empty\else `\@nameuse{MT@#2}' #3 list\fi}}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@checklist@}
% The generic test (\meta{\#1} is the axis, \meta{\#2} the feature, \cmd\@tempa\
% contains the set name).
%    \begin{macrocode}
\def\MT@checklist@#1#2{%
%<!debug>  \MT@ifdefined@n@T
%<debug>  \MT@ifdefined@n@TF
      {MT@#2list@#1@\@tempa}{%
%    \end{macrocode}
% Begin a (neatly masqueraded) \cmd\expandafter\ orgy to test whether the font
% attribute is in the list.
%    \begin{macrocode}
    \expandafter\MT@exp@one@n\expandafter\MT@in@clist
      \csname MT@#1\expandafter\endcsname
      \csname MT@#2list@#1@\@tempa\endcsname
    \ifMT@inlist@
%<debug>\MT@dinfo@list{#2}{#1}{in}%
      \MT@dotrue
    \else
%<debug>\MT@dinfo@list{#2}{#1}{not in}%
      \MT@dofalse
      \expandafter\MT@clist@break
    \fi
  }%
%    \end{macrocode}
% If no limitations have been specified, \ie, the list for a font attribute
% has not been defined at all, the font should be set up.
%    \begin{macrocode}
%<debug>  {\MT@dinfo@list{#2}{#1}{}}%
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@checklist@family}
% Also test for the alias font, if the original font is not in the list.
%\changes{v1.4b}{2004/11/22}{fix: don't try alias family name if encoding failed}
%\changes{v1.9}{2005/07/12}{fix: add two missing \cmd\expandafter s}
%    \begin{macrocode}
\def\MT@checklist@family#1{%
%<!debug>  \MT@ifdefined@n@T
%<debug>  \MT@ifdefined@n@TF
      {MT@#1list@family@\@tempa}{%
    \MT@exp@two@n\MT@in@clist
        \MT@family{\csname MT@#1list@family@\@tempa\endcsname}%
    \ifMT@inlist@
%<debug>\MT@dinfo@list{#1}{family}{in}%
      \MT@dotrue
    \else
%<debug>\MT@dinfo@list{#1}{family}{not in}%
      \MT@dofalse
      \ifx\MT@familyalias\@empty \else
        \MT@exp@two@n\MT@in@clist
            \MT@familyalias{\csname MT@#1list@family@\@tempa\endcsname}%
        \ifMT@inlist@
%<debug>  \MT@dinfo@list{#1}{family alias}{in}%
          \MT@dotrue
%<debug>\else\MT@dinfo@list{#1}{family alias}{not in}%
        \fi
      \fi
    \fi
    \ifMT@do \else
      \expandafter\MT@clist@break
    \fi
  }%
%<debug>  {\MT@dinfo@list{#1}{family}{}}%
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@checklist@size}
% Test whether font size is in list of size ranges.
%    \begin{macrocode}
\def\MT@checklist@size#1{%
%<!debug>  \MT@ifdefined@n@T
%<debug>  \MT@ifdefined@n@TF
      {MT@#1list@size@\@tempa}{%
    \MT@exp@cs\MT@in@rlist{MT@#1list@size@\@tempa}%
    \ifMT@inlist@
%<debug>\MT@dinfo@list{#1}{size}{in}%
      \MT@dotrue
    \else
%<debug>\MT@dinfo@list{#1}{size}{not in}%
      \MT@dofalse
      \expandafter\MT@clist@break
    \fi
  }%
%<debug>  {\MT@dinfo@list{#1}{size}{}}%
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@checklist@font}
% If the font matches, we skip the rest of the test.
%    \begin{macrocode}
\def\MT@checklist@font#1{%
%<!debug>  \MT@ifdefined@n@T
%<debug>  \MT@ifdefined@n@TF
      {MT@#1list@font@\@tempa}{%
%    \end{macrocode}
% Since \cs{MT@font} may be appended with context and/or letterspacing specs,
% we construct the name from the font characteristics.
%\changes{v2.2}{2007/07/03}{fix: construct font name from characteristics}
%    \begin{macrocode}
    \edef\@tempb{\MT@encoding/\MT@family/\MT@series/\MT@shape/\MT@size}%
    \expandafter\MT@exp@one@n\expandafter\MT@in@clist\expandafter
      \@tempb \csname MT@#1list@font@\@tempa\endcsname
    \ifMT@inlist@
%<debug>\MT@dinfo@list{#1}{font}{in}%
      \expandafter\MT@clist@break
    \else
%<debug>\MT@dinfo@list{#1}{font}{not in}%
      \MT@dofalse
    \fi
  }%
%<debug>  {\MT@dinfo@list{#1}{font}{}}%
}
%    \end{macrocode}
%\end{macro}
%
%\subsubsection{Protrusion}\label{ssub:setup-prot}
%
%\begin{macro}{\ifMT@nofamily}
% Info for settings that are not family-specific.
% (Warnings seem to be too irritating.) ^^A at least one thing I found out in the ridiculously long `beta' phase
% The switch is set in \cs{MT@next@listname}.
%\changes{v2.5}{2011/05/28}{info if settings are not family-specific
%                          (suggested by \contributor H\`an \thanhthe{} Th\`anh <thanh\at river-valley.org>)}
%                          ^^A private mail, 2010/09/07
%                          ^^A (beta:07)
%    \begin{macrocode}
\newif\ifMT@nofamily
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@protrusion}
% Set up for protrusion?
%    \begin{macrocode}
\def\MT@protrusion{\MT@maybe@do{pr}}
%</package>
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@set@pr@codes}
% This macro is called by \cs{MT@setupfont}, and does all the work for setting
% up a font for protrusion.
%\changes{v1.5}{2004/12/10}{adjust protrusion factors before setting the inheriting
%                           characters}
%\changes{v1.6}{2004/12/18}{introduce \texttt{factor} option}
%    \begin{macrocode}
%<*pdf-|lua-|xe-|show>
%<show>\def\MTS@show@pr
%<pdf-|lua-|xe->\def\MT@set@pr@codes
  {%
%<pdf-|lua-|xe-> \MT@nofamilyfalse
%    \end{macrocode}
% Check whether and if, which list should be applied to the current font.
% If family-specific settings don't exist, we write it to the log
%\changes{v2.5}{2013/02/05}{make info about generic settings encoding-specific
%                           (reported by \contributor Sebastian Schubert <schubert.seb\at googlemail.com>)}
%                           ^^A private mail, 2013/01/24
% (for each encoding).
%    \begin{macrocode}
%<show>  \MTS@printtext{Protrusion settings for font `\texttt{\MT@@font}':}\\
  \MT@if@list@exists{%
%<*pdf-|lua-|xe->
    \ifMT@nofamily
      \MT@ifdefined@n@TF{\MT@encoding-\MT@family-settings}\relax{%
        \MT@info@nl{Loading generic protrusion settings for font family\MessageBreak
                    `\MT@family' (encoding: \MT@encoding).\MessageBreak
                    For optimal results, create family-specific settings.\MessageBreak
                    See the microtype manual for details}%
        \MT@glet@nc{\MT@encoding-\MT@family-settings}\@empty
      }%
    \fi
%</pdf-|lua-|xe->
%<show>    \MTS@printtext{First matching list is for `\texttt{\@tempa}':\\\texttt{\MT@pr@c@name}}%
    \MT@get@opt
    \MT@reset@pr@codes
%    \end{macrocode}
% Get the name of the inheritance list and parse it.
%    \begin{macrocode}
    \MT@get@inh@list
%    \end{macrocode}
% Set an input encoding?
%    \begin{macrocode}
    \MT@set@inputenc{c}%
%    \end{macrocode}
% Load additional lists?
%    \begin{macrocode}
    \MT@load@list\MT@pr@c@name
    \MT@set@listname
%    \end{macrocode}
% Load the main list.
%    \begin{macrocode}
    \MT@let@cn\@tempc{MT@pr@c@\MT@pr@c@name}%
    \expandafter\MT@set@codes\@tempc,\relax,%
%<show>    \vrule width 4cm height .5pt \\
%<show>    \MTS@printtext{End of list `\texttt{\MT@pr@c@name}'}\\[.5em]
%<show>    \MT@ifdefined@c@T\MT@pr@inh@name{%
%<show>      \MT@ifdefined@n@T{MT@inh@\MT@pr@inh@name @prefixes}{%
%<show>        \par \MTS@printtext{(with prefixes:)}%
%<show>        \@tempcntb=\z@
%    \end{macrocode}
% Set unconditional heirs.
%    \begin{macrocode}
    \MT@set@pr@prefixheirs
%<show>    }}%
%<show>    \ifShowMissingGlyphs\MTS@show@missing\fi
  }%
%<show>  {\MTS@printtext{NOT DEFINED}%
  \MT@reset@pr@codes
%<show>  }\par
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@set@all@pr}
%\changes{v2.2}{2007/06/16}{(et al.) allow empty values}
% Set all protrusion codes of the font.
%\changes{v2.5}{2011/08/19}{fix: remove space
%                           (found by \contributor Meho~R <meho.2005\at gmail.com>)}
%                            ^^A MID: <b3c1627e-192f-4004-ab46-4ea86925e298@dc3g2000vbb.googlegroups.com>
%                            ^^A https://tex.stackexchange.com/questions/25036/microtype-package-v-2-5-beta-06-and-footnote-protrusion
%                            ^^A (beta:08)
%    \begin{macrocode}
%<*pdf-|lua-|xe->
\def\MT@set@all@pr#1#2{%
%<debug>\MT@dinfo@nl{3}{-- lp/rp: setting all to #1/#2}%
  \let\MT@temp\@empty
  \MT@ifempty{#1}\relax{\g@addto@macro\MT@temp{\lpcode\MT@font\@tempcnta=#1}}%
  \MT@ifempty{#2}\relax{\g@addto@macro\MT@temp{\rpcode\MT@font\@tempcnta=#2}}%
  \MT@do@font\MT@temp
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@reset@pr@codes@}
%\begin{macro}{\MT@reset@pr@codes}
% All protrusion codes are zero for new fonts. However, if we have to reload
% the font due to different contexts, we have to reset them.
% This command will be changed by \cs{microtypecontext} if necessary.
%    \begin{macrocode}
\def\MT@reset@pr@codes@{\MT@set@all@pr\z@\z@}
\let\MT@reset@pr@codes\relax
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\begin{macro}{\MT@the@pr@code}
%\begin{macro}{\MT@the@pr@code@tr}
%\changes{v2.2}{2007/04/05}{adjust protrusion of letterspaced fonts}
% If the font is letterspaced, we have to add half the letterspacing amount to
% the margin kerns. This will be activated in \cs{MT@set@tr@codes}.
%    \begin{macrocode}
\def\MT@the@pr@code{\@tempcntb}
%<*pdf-|lua->
%<pdf->\MT@requires@pdftex6
%<lua->\MT@requires@luatex3
  {\def\MT@the@pr@code@tr{%
    \numexpr\@tempcntb+\MT@letterspace@/2\relax
  }
}\relax
%</pdf-|lua->
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\begin{macro}{\MT@set@codes}
%\changes{v2.3a}{2007/12/29}{generalised}
% Split up the values and set the codes.
%    \begin{macrocode}
\def\MT@set@codes#1,{%
  \ifx\relax#1\@empty\else
    \MT@split@codes #1==\relax
    \expandafter\MT@set@codes
  \fi
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@split@codes}
%\changes{v1.1}{2004/09/13}{fix: allow zero and negative values}
%\changes{v1.8}{2005/05/25}{get character width once only}
% The \pkg{keyval} package would remove spaces here, which we needn't do since
% \cs{SetProtrusion} ignores spaces in the protrusion list anyway.
% \cs{MT@get@char@unit} may mean different things.
%    \begin{macrocode}
\def\MT@split@codes#1=#2=#3\relax{%
  \def\@tempa{#1}%
  \ifx\@tempa\@empty \else
    \MT@get@slot
%<pdf-|lua->    \ifnum\MT@char > \m@ne
%<xe->    \ifx\MT@char\@empty \else
      \MT@get@char@unit
      \csname MT@\MT@feat @split@val\endcsname#2\relax
    \fi
  \fi
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@pr@split@val}
%    \begin{macrocode}
\def\MT@pr@split@val#1,#2\relax
%</pdf-|lua-|xe->
%<show>\def\MTS@pr@split@val#1,#2\relax
  {\def\@tempb{#1}%
  \MT@ifempty\@tempb
%<pdf-|lua-|xe->    \relax
%<show>  {\MTS@lp@=\z@ \let\MTS@lpcode\@empty}%
  {\MT@scale@to@em
%<pdf-|lua-|xe->    \lpcode\MT@font\MT@char=\MT@the@pr@code
%<show>    \MTS@lp@=\dimexpr\@tempcntb em/1000\relax\relax
%<show>    \edef\MTS@lpcode{[\@tempb] \the\@tempcntb/\the\MTS@lp@}%
%<debug>\MT@dinfo@nl{4}{;;; lp (\MT@char): \number\lpcode\MT@font\MT@char: [#1]}%
  }%
  \def\@tempb{#2}%
  \MT@ifempty\@tempb
%<pdf-|lua-|xe->    \relax
%<show>  {\MTS@rp@=\z@ \let\MTS@rpcode\@empty}%
  {\MT@scale@to@em
%<pdf-|lua-|xe->    \rpcode\MT@font\MT@char=\MT@the@pr@code
%<show>    \MTS@rp@=\dimexpr\@tempcntb em/1000\relax\relax
%<show>    \edef\MTS@rpcode{[\@tempb] \the\@tempcntb/\the\MTS@rp@}%
%<debug>\MT@dinfo@nl{4}{;;; rp (\MT@char): \number\rpcode\MT@font\MT@char: [#2]}%
  }%
%<show>  \llap{\MTS@show@char@pr\MT@char\quad}%
%<show>  \parbox[b][][b]{3.5cm}{\MTS@printtext{%
%<show>      \footnotesize\makebox[.4cm][l]{L:} \MT@ifempty{\MTS@lpcode}{---}{\MTS@lpcode}\\
%<show>                   \makebox[.4cm][l]{R:} \MT@ifempty{\MTS@rpcode}{---}{\MTS@rpcode}}}%
%<show>  \parbox[t][][t]{\dimexpr\textwidth-3.5cm}{%
%    \end{macrocode}
% Now we can set the values for the inheriting characters. Their slot numbers
% are saved in the macro |\MT@inh@|\meta{list name}|@|\meta{slot number}|@|.
%    \begin{macrocode}
  \MT@ifdefined@c@T\MT@pr@inh@name{%
    \MT@ifdefined@n@T{MT@inh@\MT@pr@inh@name @\MT@char @}{%
      \MT@exp@cs\MT@map@tlist@c
        {MT@inh@\MT@pr@inh@name @\MT@char @}%
%<pdf-|lua-|xe->        \MT@set@pr@heirs
%<show>      \MTS@show@char@pr
    }%
  }%
%<show>  }\newline
}
%<*pdf-|lua-|xe->
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@scale@to@em}
% Since \pdftex\ version 0.14h, we have to adjust the protrusion factors (\ie,
% convert numbers from thousandths of character width to thousandths of an em
% of the font). We have to do this \emph{before} setting the inheriting
% characters, so that the latter inherit the absolute value, not the relative
% one if they have a differing width (\eg, the `ff' ligature).
%\changes{v1.5}{2004/12/10}{don't use \cmd\lpcode\ and \cmd\rpcode\ for the
%                           calculation}
% Unlike \file{protcode.tex} and \pkg{pdfcprot}, we do not calculate with
% \cmd\lpcode\ resp. \cmd\rpcode, since this would disallow protrusion factors
% larger than the character width (since \verb!\[lr]pcode!'s limit is 1000). Now,
% the maximum protrusion is \EM{1} of the font.
%
% The unit is in \cs{MT@count}, the desired factor in \cmd\@tempb, and the
% result will be returned in \cmd\@tempcntb.
%    \begin{macrocode}
%<pdf->\MT@requires@pdftex3{
\def\MT@scale@to@em{%
  \@tempcntb=\MT@count\relax
%    \end{macrocode}
% For really huge fonts (100\,pt or so), an arithmetic overflow could occur
% with vanilla \TeX. Using \etex, this can't happen, since the intermediate
% value is 64\,bit, which could only be reached with a character width larger
% than \cmd\maxdimen.
%    \begin{macrocode}
  \MT@scale\@tempcntb \@tempb \MT@dimen@six
  \ifnum\@tempcntb=\z@ \else
    \MT@scale@factor
  \fi
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@get@charwd}
% Get the width of the character. When using \etex, we can employ
% \cmd\fontcharwd\ instead of building scratch boxes.
%\changes{v1.6}{2005/01/19}{use \etex's \cmd\fontcharwd, if available}
%\changes{v1.8}{2005/05/25}{warning for missing (resp. zero-width) characters}
%    \begin{macrocode}
\def\MT@get@charwd{%
%<*pdf->
^^X  \MT@count=\fontcharwd\MT@font\MT@char\relax
^^Q  \setbox\z@=\hbox{\MT@font \char\MT@char}%
^^Q  \MT@count=\wd\z@
%</pdf->
%<lua->  \MT@count=\fontcharwd\MT@font\MT@char\relax
%    \end{macrocode}
% \cs{MT@char} contains a slot number (legacy fonts), a Unicode number,
% or a glyph name (if \cs{MT@char@} is negative).
%    \begin{macrocode}
%<*xe->
  \ifnum\MT@char@<\z@
    \setbox\z@=\hbox{\MT@font \XeTeXglyph-\MT@char@}%
    \MT@count=\wd\z@
  \else
    \MT@count=\fontcharwd\MT@font\MT@char@\relax
  \fi
%</xe->
  \ifnum\MT@count=\z@ \MT@info@missing@char \fi
}
%    \end{macrocode}
%\changes{v2.2}{2007/04/05}{subtract letterspacing amount from width}
% For letterspaced fonts, we have to subtract the letterspacing amount from the
% characters' widths. The protrusion amounts will be adjusted in
% \cs{MT@set@pr@codes}.
% The letterspaced font is already loaded so that \EM{1} = \fontdim6.
%    \begin{macrocode}
%<*pdf->
\MT@requires@pdftex6{
  \g@addto@macro\MT@get@charwd{%
    \MT@ifdefined@c@T\MT@letterspace@
      {\advance\MT@count -\dimexpr\MT@letterspace@ sp *\dimexpr 1em/1000\relax}%
  }
}\relax
}{
%    \end{macrocode}
%\end{macro}
% No adjustment with versions 0.14f and 0.14g.
%    \begin{macrocode}
\def\MT@scale@to@em{%
  \MT@count=\@tempb\relax
  \ifnum\MT@count=\z@ \else
    \MT@scale@factor
  \fi
}
%    \end{macrocode}
% We need this in \cs{MT@warn@code@too@large} (neutralised).
%    \begin{macrocode}
\def\MT@get@charwd{\MT@count=\MT@dimen@six}
}
%</pdf->
%</pdf-|lua-|xe->
%</pdf-|lua-|xe-|show>
%    \end{macrocode}
%\begin{macro}{\MT@get@font@dimen}
% For the |space| unit.
%\changes{v1.9d}{2006/02/13}{warning for zero fontdimen}
%    \begin{macrocode}
%<*package>
\def\MT@get@font@dimen#1{%
  \ifnum\fontdimen#1\MT@font=\z@
    \MT@warning@nl{Font `\MT@@font' does not specify its\MessageBreak
      \@backslashchar fontdimen #1 (it's zero)!\MessageBreak
      You should use a different `unit' for \MT@curr@list@name}%
  \else
    \MT@count=\fontdimen#1\MT@font
  \fi
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@info@missing@char}
%\changes{v1.9a}{2005/11/17}{info instead of warning
%                (after \contributor Michael Hoppe <mh\at michael-hoppe.de> reported that
%                 the `fl' ligature is missing in Palatino <SC>)}
%                 ^^A MID: <1h64d0x.16xsx9n1151dieN%mh@michael-hoppe.de>
% Info about missing characters, or characters with zero width.
%\changes{v2.5}{2010/11/11}{fix error message for \xetex\
%                           (reported by \contributor Juan Acevedo <juan.acevedo.juan\at gmail.com>)}
%                           ^^A <http://permalink.gmane.org/gmane.comp.tex.xetex/17202>
%                           ^^A (beta:05)
%\changes{v2.7b}{2018/02/20}{fix message for glyphs specified as names in \xetex\
%                            (reported by \contributor Paolo Ney <@\at @>)}
%                            ^^A https://tex.stackexchange.com/questions/416310/problem-of-amsart-and-microtype-under-xelatex
%    \begin{macrocode}
\def\MT@info@missing@char{%
  \MT@info@nl{Character `\the\MT@toks'
^^X   \ifnum\MT@char@<\z@ is missing\else
^^X     \iffontchar\MT@font\MT@char@
               has a width of 0pt
^^X      \else is missing\fi\fi
^^Q    \MessageBreak (it's probably missing)
    \MessageBreak in font `\MT@@font'.\MessageBreak
    Ignoring protrusion settings for this character}%
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@scale@factor}
%\changes{v1.5}{2004/12/10}{warning for factors outside limits}
%\changes{v1.9}{2005/09/28}{generalised}
% Furthermore, we might have to multiply with a factor.
%    \begin{macrocode}
\def\MT@scale@factor{%
  \ifnum\csname MT@\MT@feat @factor@\endcsname=\@m \else
    \expandafter\MT@scale\expandafter \@tempcntb
      \csname MT@\MT@feat @factor@\endcsname \@m
  \fi
  \ifnum\@tempcntb>\csname MT@\MT@feat @max\endcsname\relax
    \MT@exp@cs\MT@warn@code@too@large{MT@\MT@feat @max}%
  \else
    \ifnum\@tempcntb<\csname MT@\MT@feat @min\endcsname\relax
      \MT@exp@cs\MT@warn@code@too@large{MT@\MT@feat @min}%
    \fi
  \fi
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@warn@code@too@large}
% Type out a warning if a chosen protrusion factor is too large after the
% conversion. As a special service, we also type out the maximum amount that
% may be specified in the configuration.
%\changes{v1.7}{2005/02/17}{new macro: type out maximum protrusion factor}
%\changes{v1.9b}{2006/01/03}{fix calculation with present factor}
%    \begin{macrocode}
\def\MT@warn@code@too@large#1{%
  \@tempcnta=#1\relax
  \ifnum\csname MT@\MT@feat @factor@\endcsname=\@m \else
    \expandafter\MT@scale\expandafter\@tempcnta\expandafter
      \@m \csname MT@\MT@feat @factor@\endcsname
  \fi
  \MT@scale\@tempcnta \MT@dimen@six \MT@count
  \MT@warning@nl{The \@nameuse{MT@abbr@\MT@feat} code \@tempb\space
    is too large for character\MessageBreak
    `\the\MT@toks' in \MT@curr@list@name.\MessageBreak
    Setting it to the maximum of \number\@tempcnta}%
  \@tempcntb=#1\relax
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@get@opt}
% The optional argument to the configuration commands (except for
% \cs{SetExpansion} and \cs{SetTracking}, which are being dealt with
% in \cs{MT@get@ex@opt} and \cs{MT@get@tr@opt}, resp.).
%    \begin{macrocode}
\def\MT@get@opt{%
  \MT@set@listname
%    \end{macrocode}
%\begin{macro}{\MT@pr@factor@}
%\begin{macro}{\MT@sp@factor@}
%\begin{macro}{\MT@kn@factor@}
% Apply a factor?
%    \begin{macrocode}
  \MT@ifdefined@n@TF{MT@\MT@feat @c@\csname MT@\MT@feat @c@name\endcsname @factor}{%
    \MT@let@nn{MT@\MT@feat @factor@}
        {MT@\MT@feat @c@\csname MT@\MT@feat @c@name\endcsname @factor}%
    \MT@vinfo{... : Multiplying \@nameuse{MT@abbr@\MT@feat} codes by
                    \number\csname MT@\MT@feat @factor@\endcsname/1000}%
  }{%
    \MT@let@nn{MT@\MT@feat @factor@}{MT@\MT@feat @factor}%
  }%
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\MT@pr@unit@}
%\begin{macro}{\MT@sp@unit@}
%\begin{macro}{\MT@kn@unit@}
% The |unit| can only be evaluated here, since it might be font-specific.
% If it's \cmd\@empty, it's relative to character widths, if it's \textminus1,
% relative to space dimensions.
%    \begin{macrocode}
  \MT@ifdefined@n@TF{MT@\MT@feat @c@\csname MT@\MT@feat @c@name\endcsname @unit}{%
    \MT@let@nn{MT@\MT@feat @unit@}%
        {MT@\MT@feat @c@\csname MT@\MT@feat @c@name\endcsname @unit}%
    \MT@exp@cs\ifx{MT@\MT@feat @unit@}\@empty
      \MT@vinfo{... : Setting \@nameuse{MT@abbr@\MT@feat} codes
                      relative to character widths}%
    \else
      \MT@exp@cs\ifx{MT@\MT@feat @unit@}\m@ne
        \MT@vinfo{... : Setting \@nameuse{MT@abbr@\MT@feat} codes
                        relative to width of space}%
      \fi
    \fi
  }{%
    \MT@let@nn{MT@\MT@feat @unit@}{MT@\MT@feat @unit}%
  }%
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\MT@get@space@unit}
%\begin{macro}{\MT@get@char@unit}
% The codes are either relative to character widths, or to a fixed width.
% For spacing and kerning lists, they may also be relative to the width of
% the interword glue.
% Only the setting from the top list will be taken into account.
%    \begin{macrocode}
  \let\MT@get@char@unit\relax
  \let\MT@get@space@unit\@gobble
  \MT@exp@cs\ifx{MT@\MT@feat @unit@}\@empty
    \let\MT@get@char@unit\MT@get@charwd
  \else
    \MT@exp@cs\ifx{MT@\MT@feat @unit@}\m@ne
      \let\MT@get@space@unit\MT@get@font@dimen
    \else
      \MT@exp@cs\MT@get@unit{MT@\MT@feat @unit@}%
    \fi
  \fi
%    \end{macrocode}
%\end{macro}
%\end{macro}
% Preset all characters? If so, we surely don't need to reset, too.
%\changes{v1.9}{2005/10/08}{new key `\texttt{preset}' to set all characters to
%                           the specified value before loading the lists}
%\changes{v1.9d}{2006/02/13}{set list name before presetting}
%\changes{v1.9d}{2006/02/18}{optimise: don't reset when \texttt{preset} option is set}
%    \begin{macrocode}
  \MT@ifdefined@n@T{MT@\MT@feat @c@\csname MT@\MT@feat @c@name\endcsname @preset}{%
    \csname MT@preset@\MT@feat\endcsname
    \MT@let@nc{MT@reset@\MT@feat @codes}\relax
  }%
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@get@unit}
%\changes{v1.8}{2005/04/14}{new macro: get unit for codes}
%\begin{macro}{\MT@get@unit@}
% If |unit| contains an |em| or |ex|, we use the corresponding \cmd\fontdimen\
% to obtain the real size. Simply converting the em into points might give a
% wrong result, since the font probably isn't set up yet, so that these
% dimensions haven't been updated, either.
%    \begin{macrocode}
\def\MT@get@unit#1{%
  \expandafter\MT@get@unit@#1 e!\@nil
  \ifx\x\@empty\else\let#1\x\fi
  \@defaultunits\@tempdima#1 pt\relax\@nnil
  \ifdim\@tempdima=\z@
    \MT@warning@nl{%
      Cannot set \@nameuse{MT@abbr@\MT@feat} factors relative to zero\MessageBreak
      width. Setting factors of list `\@nameuse{MT@\MT@feat @c@name}'\MessageBreak
      relative to character widths instead}%
    \let#1\@empty
    \let\MT@get@char@unit\MT@get@charwd
  \else
    \MT@vinfo{... : Setting \@nameuse{MT@abbr@\MT@feat} factors relative
                    to \the\@tempdima}%
    \MT@count=\@tempdima\relax
  \fi
}
\def\MT@get@unit@#1e#2#3\@nil{%
  \ifx\\#3\\\let\x\@empty \else
    \if m#2%
      \edef\x{#1\fontdimen6\MT@font}%
    \else
      \if x#2%
        \edef\x{#1\fontdimen5\MT@font}%
      \fi
    \fi
  \fi
}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\begin{macro}{\MT@set@inputenc}
% The configurations may be under the regime of an input encoding.
%    \begin{macrocode}
\def\MT@set@inputenc#1{%
%    \end{macrocode}
%\begin{macro}{\MT@cat}
% We remember the current category (|c| or |inh|), in case of warnings later.
%    \begin{macrocode}
  \def\MT@cat{#1}%
%    \end{macrocode}
%\end{macro}
%    \begin{macrocode}
  \edef\@tempa{MT@\MT@feat @#1@\csname MT@\MT@feat @#1@name\endcsname @inputenc}%
  \MT@ifdefined@n@T\@tempa\MT@set@inputenc@
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@set@inputenc@}
%\changes{v2.2}{2007/06/08}{only load \pkg{inputenc} files if necessary}
% More recent versions of \pkg{inputenc} remember the current encoding, so that
% we can test whether we really have to load the encoding file.
%    \begin{macrocode}
\MT@addto@setup{%
  \@ifpackageloaded{inputenc}{%
    \@ifpackagelater{inputenc}{2006/02/22}{%
      \def\MT@set@inputenc@{%
        \MT@ifstreq\inputencodingname{\csname\@tempa\endcsname}\relax
          \MT@load@inputenc
      }%
    }{%
      \let\MT@set@inputenc@\MT@load@inputenc
    }%
  }{%
    \def\MT@set@inputenc@{%
      \MT@warning@nl{Key `inputenc' used in \MT@curr@list@name, but the `inputenc'
          \MessageBreak package isn't loaded. Ignoring input encoding}%
    }%
  }%
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@load@inputenc}
% Set up normal catcodes, since, \eg, \pkg{listings} would otherwise want to
% actually typeset the \pkg{inputenc} file when it is being loaded inside a
% listing.
%\changes{v2.0}{2006/09/15}{sanitise catcodes before loading input encoding
%                            (problem with \pkg{listings})}
%    \begin{macrocode}
\def\MT@load@inputenc{%
  \MT@cfg@catcodes
%<debug>\MT@dinfo@nl{1}{loading input encoding: \@nameuse{\@tempa}}%
  \inputencoding{\@nameuse{\@tempa}}%
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@set@pr@heirs}
% Set the inheriting characters.
%    \begin{macrocode}
\def\MT@set@pr@heirs#1{%
  \lpcode\MT@font #1=\lpcode\MT@font\MT@char\relax
  \rpcode\MT@font #1=\rpcode\MT@font\MT@char\relax
%<debug>\MT@dinfo@nl{2}{-- heir of \MT@char: #1}%
%<debug>\MT@dinfo@nl{4}{;;; lp/rp (#1): \number\lpcode\MT@font\MT@char/%
%<debug>                                \number\rpcode\MT@font\MT@char}%
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@set@pr@prefixheirs}
% Inheriting characters that have been specified in a prefixed list.
%    \begin{macrocode}
\def\MT@set@pr@prefixheirs{%
  \MT@ifdefined@c@T\MT@pr@inh@name{%
    \MT@ifdefined@n@T{MT@inh@\MT@pr@inh@name @prefixes}{%
      \MT@exp@cs\MT@map@tlist@c
        {MT@inh@\MT@pr@inh@name @prefixes}%
        \MT@set@pr@prefixes
    }%
  }%
}
%</package>
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@set@pr@prefixes}
%\begin{macro}{\MT@set@pr@prefixes@}
% Add |charwidth(|\meta{inheriting char}|)-charwidth(|\meta{base char}|)|
% to either left or right side or half the amount to both sides.
% For \xetex, we may have to translate to glyph numbers because
% \cmd\fontcharwd\ doesn't have the nice feature of understanding the
% `|U|' or `|/|' prefixes.
%    \begin{macrocode}
%<*pdf-|lua-|xe-|show>
%<pdf-|lua-|xe->\def\MT@set@pr@prefixes#1{\MT@set@pr@prefixes@#1}
%<pdf-|lua-|xe->\def\MT@set@pr@prefixes@#1#2#3#4%
%<show>\def\MTS@set@pr@prefixes@#1#2#3#4%
  {%
%<show>  \MTS@lp@=\z@ \MTS@rp@=\z@
%<show>  \ifnum#1=\@tempcntb \else
%<show>    \par\leavevmode
%<show>    \llap{\MTS@show@char@pr{#1} \MTS@printtext{=} }%
%<show>  \fi
%<*xe->
  \edef\@tempa{\expandafter\ifx\@car#1\@nil U\@gobble#1\else\number\XeTeXglyphindex"#1" \fi}%
  \edef\@tempb{\expandafter\ifx\@car#2\@nil U\@gobble#2\else\number\XeTeXglyphindex"#2" \fi}%
%</xe->
  \@tempcnta=\z@
  \ifnum#3>\z@
    \@tempcnta=\numexpr
%<pdf-|lua-|show>      (\fontcharwd\MT@font#2-\fontcharwd\MT@font#1)%
%<xe->      (\fontcharwd\MT@font\@tempb-\fontcharwd\MT@font\@tempa)%
      *#3/\MT@dimen@six\relax
  \fi
%<pdf-|lua-|xe->  \lpcode\MT@font #2=\numexpr\lpcode\MT@font#1+\@tempcnta\relax
%<show>  \MTS@lp@=\dimexpr\numexpr\lpcode\MT@font#1+\@tempcnta\relax em/1000\relax
  \@tempcnta=\z@
  \ifnum#4>\z@
    \@tempcnta=\numexpr
%<pdf-|lua-|show>      (\fontcharwd\MT@font#2-\fontcharwd\MT@font#1)%
%<xe->      (\fontcharwd\MT@font\@tempb-\fontcharwd\MT@font\@tempa)%
      *#4/\MT@dimen@six\relax
  \fi
%<pdf-|lua-|xe->  \rpcode\MT@font #2=\numexpr\rpcode\MT@font#1+\@tempcnta\relax
%<show>  \MTS@rp@=\dimexpr\numexpr\rpcode\MT@font#1+\@tempcnta\relax em/1000\relax
%<debug>\MT@dinfo@nl{2}{-- (prefix) heir of #1: #2}%
%<debug>\MT@dinfo@nl{4}{;;; lp/rp (#2): \number\lpcode\MT@font#2/%
%<debug>                                \number\rpcode\MT@font#2}%
%<show>  \MTS@show@char@pr{#2}%
%<show>  \@tempcntb=#1\relax
}
%</pdf-|lua-|xe-|show>
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\begin{macro}{\MT@preset@pr}
%\begin{macro}{\MT@preset@pr@}
% Preset characters. Presetting them relative to their widths is not allowed.
%    \begin{macrocode}
%<*package>
\def\MT@preset@pr{%
  \expandafter\expandafter\expandafter\MT@preset@pr@
    \csname MT@pr@c@\MT@pr@c@name @preset\endcsname\@nil
}
\def\MT@preset@pr@#1,#2\@nil{%
  \ifx\MT@pr@unit@\@empty
    \MT@warn@preset@towidth{pr}%
    \let\MT@preset@aux\MT@preset@aux@factor
  \else
    \def\MT@preset@aux{\MT@preset@aux@space2}%
  \fi
  \MT@ifempty{#1}{\let\@tempa\@empty}{\MT@preset@aux{#1}\@tempa}%
  \MT@ifempty{#2}{\let\@tempb\@empty}{\MT@preset@aux{#2}\@tempb}%
  \MT@set@all@pr\@tempa\@tempb
}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\begin{macro}{\MT@preset@aux}
%\begin{macro}{\MT@preset@aux@factor}
%\begin{macro}{\MT@preset@aux@space}
%\changes{v2.2}{2007/06/16}{generalised}
% Auxiliary macro for presetting. Store value \meta{\#1} in macro \meta{\#2}.
%    \begin{macrocode}
\def\MT@preset@aux@factor#1#2{%
  \@tempcntb=#1\relax
  \MT@scale@factor
  \edef#2{\number\@tempcntb}%
}
\def\MT@preset@aux@space#1#2#3{%
  \def\@tempb{#2}%
  \MT@get@space@unit#1%
  \MT@scale@to@em
  \edef#3{\number\@tempcntb}%
}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\MT@warn@preset@towidth}
%    \begin{macrocode}
\def\MT@warn@preset@towidth#1{%
  \MT@warning@nl{%
    Cannot preset characters relative to their widths\MessageBreak
    for \@nameuse{MT@abbr@#1} list `\@nameuse{MT@#1@c@name}'.
    Presetting them\MessageBreak relative to 1em instead}%
}
%    \end{macrocode}
%\end{macro}
%
%\subsubsection{Manual protrusion}\label{ssub:setup-protcmd}
%
%\begin{macro}{\noprotrusion}
%\changes{v3.0}{2021/05/15}{provide command for older \LaTeX\ versions}
% This command may be used to inhibit protrusion on either side. It's part
% of \LaTeX\ since 2018-12-01.
% We provide it for older releases.
%    \begin{macrocode}
\MT@ifdefined@c@TF\noprotrusion\relax{
  \DeclareRobustCommand\noprotrusion{\leavevmode\kern-\p@\kern\p@}
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\noprotrusionifhmode}
%\changes{v3.0c}{2021/12/22}{new command}
% Same, but only if we're already in hmode.
%    \begin{macrocode}
\DeclareRobustCommand\noprotrusionifhmode{\relax\ifhmode\kern-\p@\kern\p@\fi}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\leftprotrusion}
%\changes{v3.0}{2021/05/15}{new command}
% This command may be used to add protrusion on the left hand side.
% We try to reconstruct the next glyph (possibly a ligature).\footnote{
%   \luatex\ offers the command \cmd\protrusionboundary, which could
%   potentially be very helpful here, but it doesn't seem to do what it
%   promises (not even the example from the manual works as advertised).
%   ^^A cf. https://mailman.ntg.nl/pipermail/dev-luatex/2021-May/006486.html
%   Maybe \contributor Marcel Kr\"uger <@\at @>'s attempt at a
%   |betterprotrusionboundary| (\url{https://tex.stackexchange.com/a/629080})
%   could be an option.}
%    \begin{macrocode}
\DeclareRobustCommand\leftprotrusion{%
  \MT@toks{}%
  \MT@prot@toks{}%
  \let\MT@prot@l\MT@prot@l@
  \let\MT@prot@get@first@group\MT@prot@get@first@group@
  \let\MT@maybe@textcmd\@firstofone
  \MT@prot@get@firstgroup
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@prot@l}
%\begin{macro}{\MT@prot@l@}
%\changes{v3.0b}{2021/12/05}{make \cmd\long\ again
%                           (reported by \contributor Akira Yokosawa <@\at @>) \githubissue{3}}
%\changes{v3.0c}{2022/01/14}{next try at removing \cmd\long}
% This probably doesn't need to be \cmd\long\ any longer.
%    \begin{macrocode}
\def\MT@prot@l@#1{%
  \MT@get@prot{#1}{left}%
  #1%
}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\begin{macro}{\MT@prot@toks}
%\begin{macro}{\MT@prot@l@tc}
%\changes{v3.1}{2023/03/06}{new macro: for text commands}
%\begin{macro}{\MT@gobble@to@nil}
% If \cs{leftprotrusion} is followed by a text command,
% we trial-typeset only the first glyph, then actually typeset
% the whole argument, which we've saved in \cs{MT@prot@toks},
% and finally gobble anything that might still be left in the
% input stream (see \cs{MT@prot@check@F} below).
%    \begin{macrocode}
\newtoks\MT@prot@toks
\def\MT@prot@l@tc#1{%
  \MT@get@prot{\MT@maybe@textcmd{#1}}{left}%
  \the\MT@prot@toks
  \MT@gobble@to@nil
}
\def\MT@gobble@to@nil#1\MT@nil{}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\rightprotrusion}
%\changes{v3.0}{2021/05/15}{new command}
%\begin{macro}{\MT@prot@r}
%\changes{v3.0c}{2022/01/14}{no longer \cmd\long}
% Unfortunately, there's no way to retrieve anything that's already been typeset,
% so the counterpart cannot be defined symmetrically.
%    \begin{macrocode}
\DeclareRobustCommand\rightprotrusion{\MT@prot@r}
\def\MT@prot@r#1{%
  {#1}%
  \MT@get@prot{#1}{right}%
}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\begin{macro}{\MT@get@prot}
% Typeset the text inside a box and get the left and right margin kerns.
% We add an extra \cmd\vbox\ in case we're inside a |tabular|.
% \cmd\@newlistfalse\ is meant to make \cmd\\ work in |centering| etc.
%\changes{v3.0a}{2021/11/05}{compatibility fix for \pkg{csquotes}
%                           (reported by \contributor Gustavo Barros <@\at @>) \githubissue{1}}^^A
%                            ^^A https://tex.stackexchange.com/questions/621440/microtype-csquotes-autoquote-and-itemize-interaction
%\changes{v3.0a}{2021/11/22}{reset counters}^^A
%\changes{v3.0a}{2021/11/27}{set penalties to zero and vfuzz to max
%                           (reported by \contributor florian <@\at @>)}^^A
%                            ^^A https://tex.stackexchange.com/questions/624171/overfull-vbox-in-list-of-figures-since-miktex-update
%\changes{v3.0b}{2021/12/05}{unconditionally \cmd\leavevmode}^^A
%\changes{v3.0e}{2022/06/16}{revert \cmd\leavevmode}^^A
% We set various penalties to zero to allow linebreaking, and don't
% bother if the split box is overfull (but shouldn't we? -- after all,
% that's how the penalties bug was discovered~\dots).
%\changes{v3.0d}{2022/03/03}{no longer reset counters
%                           (reported by \contributor Brian Dunn <@\at @>) \githubissue{14}}
% (We no longer reset counters etc., since we don't typeset whole arguments anymore.)
% Also, we begin a group to make it color-safe.
%\changes{v3.2}{2024/04/24}{make color-safe}
%\begin{macro}{\MT@prot@hook}
% Furthermore, we have a hook for compatibility fixes (currently used for \pkg{csquotes} only),
%\begin{macro}{\MT@csq@eqgroup}
%\changes{v3.0c}{2022/01/06}{compatibility with \pkg{csquotes}, again
%                           (reported by \contributor NightShade <@\at @>)}
%                           ^^A https://tex.stackexchange.com/questions/629068/microtype-quotation-marks-in-itemize-not-aligned-properly-at-begin-of-an-item
% and a dedicated command to end \pkg{csquotes}'s group (because we actually typeset
% the quote character, instead of disabling quotes altogether (as we suggested
% for \githubissue{1}, which was wrong)).
%\changes{v3.0e}{2022/04/05}{add \cmd\relax\ (for \pkg{csquotes})}
% Compatibility with \pkg{csquotes} is also the reason for the extra \cmd\relax\ after \meta{\#1}.
%\begin{macro}{\MT@noindent}
%\changes{v3.0c}{2022/01/14}{use \cmd\RawNoindent, if available \githubissue{8}}
% Finally, \LaTeX's new paragraph hooks require special attention, as they're
% (currently?) unable to distinguish between real typesetting and trial runs.
% In our case, fortunately, we really don't want to trigger the hooks.\footnote{
%   Well, in some cases we do, but this indeed `needs further analysis'
%   (cf. \url{https://github.com/latex3/latex2e/issues/880}).}
%\todo{fix use of \cmd\RawNoindent}
% Also, as far as I can tell, we don't need a \cmd\RawParEnd\ at the end
% (as suggested in \file{ltpara}), because none of our commands are \cmd\long\ anymore.
%    \begin{macrocode}
\let\MT@prot@hook\@empty
\let\MT@csq@eqgroup\relax
\IfFormatAtLeastTF{2021/11/15}
  {\let\MT@noindent\RawNoindent}
  {\let\MT@noindent\noindent}
\def\MT@get@prot#1#2{%
  \begingroup
    \setbox\MT@tempbox\vbox{%
      \everypar{}%
      \parfillskip=\z@skip
      \hbadness\@M
      \clubpenalty\z@
      \widowpenalty\z@
      \interlinepenalty\z@
      \@newlistfalse
      \MT@prot@hook
      \begingroup
        \MT@noindent #1\relax\MT@csq@eqgroup
      \endgroup}%
    \vbadness=\@M
    \splittopskip=\z@
    \vfuzz=\maxdimen
    \setbox\MT@tempbox\vbox{%
      \ifvbox\MT@tempbox
        \global\setbox\MT@tempbox=\vsplit\MT@tempbox to \normalbaselineskip
        \unvbox\MT@tempbox
        \global\setbox\MT@tempbox=\lastbox
      \fi
    }%
  \endgroup
  \ifhbox\MT@tempbox
    \@tempdima=\@nameuse{#2marginkern}\MT@tempbox\relax
    \expandafter\ifdim\@tempdima=\z@ \else
      \leavevmode
      \MT@vinfo{|<< adding #2 margin kern for `#1':\MessageBreak
        \the\@tempdima \on@line}%
      \kern\@tempdima
%<debug>%\vbox to0pt{\vss\llap{\fbox{%
%<debug>%      \MT@ifstreq{#2}{left}{\kern\@tempdima}\relax
%<debug>%      \kern-\fboxsep\unhbox\MT@tempbox\kern-\fboxsep
%<debug>%      \MT@ifstreq{#2}{right}{\kern\@tempdima}\relax}\hskip\marginparsep}}%
    \fi
  \fi
}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\MT@prot@ifx}
% Test next token.
%    \begin{macrocode}
\def\MT@prot@ifx#1{%
  \ifx\MT@prot@next#1\expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@prot@ifcat}
% Test catcode of next token.
%    \begin{macrocode}
\def\MT@prot@ifcat#1{%
  \ifcat#1\noexpand\MT@prot@next\expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@prot@ifmacro}
%\begin{macro}{\MT@prot@ifmacro@}
% Test whether \meta{\#1} is a macro or an active character
% that does not take an argument.
%^^A (inspired by \contributor Joseph Wright <@\at @>). ^^A https://tex.stackexchange.com/a/331696/
%\changes{v3.0e}{2022/06/15}{use \pkg{etoolbox} facilities}
% As we're using \pkg{etoolbox} here, this only works with \etex.
%    \begin{macrocode}
^^X\def\MT@prot@ifmacro@{%
^^X  \ifdefmacro\MT@prot@next{\ifdefparam\MT@prot@next\@gobble\@firstofone}\@gobble}
^^Q\let\MT@prot@ifmacro\@gobble
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\begin{macro}{\MT@prot@iffirstcmd}
% Test whether the first token in \cs{MT@prot@next} (once expanded) is the
% command \meta{\#1}. Since \cs{MT@prot@next} may also be user-defined (or
% whatever), we have to use our own, \cmd\long\ version of \cmd\@car.
%\changes{v3.0c}{2021/12/17}{use \cmd\long\ variant of \cmd\@car\
%                           (reported by \contributor frafl <@\at @>) \githubissue{6}}
%    \begin{macrocode}
\def\MT@prot@iffirstcmd#1{%
  \ifx\relax#1\expandafter\@secondoftwo\else
    \MT@exp@two@c\ifx\MT@car\MT@prot@next\relax\@nil#1%
      \expandafter\expandafter\expandafter\@firstoftwo
    \else
      \expandafter\expandafter\expandafter\@secondoftwo
    \fi
  \fi
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@car}
% A long car.
%    \begin{macrocode}
\long\def\MT@car#1#2\@nil{#1}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@prot@iflicrcmd}
%\changes{v3.0f}{2022/06/22}{no need to know about encodings
%                            (also fixes \githubissue{20}, reported by
%                             \contributor Christophe Dervieux <@\at @>)}
% Fun with <LICR>:
% If we have an encoding command, test if the first command of the third command
% (\eg, |\T1\"|) is \cmd\@text@composite, in which case also grab the next token,
% otherwise it should be a text command.
%    \begin{macrocode}
\def\MT@getthird#1#2#3#4\@nil{#3}
\def\MT@prot@iflicrcmd{%
  \MT@prot@iffirstcmd\@current@cmd\@secondoftwo\@firstofone
    {\MT@prot@iffirstcmd\@changed@cmd\@firstofone\@gobble}%
  {\expandafter\expandafter\expandafter\let
      \expandafter\expandafter\expandafter\@tempa
      \expandafter\MT@getthird\MT@prot@next\relax\@nil
    \MT@exp@two@c\ifx\@car\@tempa\relax\@nil\@text@composite
      \def\MT@temp*##1##2{\MT@exp@one@n\MT@prot@l{\the\MT@toks##1##2}}%
    \else
      \def\MT@temp*##1{\MT@exp@one@n\MT@prot@l{\the\MT@toks##1}}%
    \fi
  }%
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@prot@addgroup}
%\changes{v3.0a}{2021/11/20}{rescan grouped material to allow \texttt{verbatim} etc.
%               (reported by \contributor Torsten Schuetze <torsten.schuetze\at gmx.net>)}
%               ^^A private mail, 2021/11/18
%               ^^A also on the non-public dante-ev mailing list: https://lists.dante.de/mailman/listinfo/dante-ev
% If we have a group, we inject \cs{MT@prot@get@firstgroup} again at the
% beginning and don't bother about the rest. This still allows,
% \eg, |\verb|, |verbatim| or |lstlistings| material.
% The downside of being this cautious is that we'll miss lots of cases.
%\changes{v3.0b}{2021/12/05}{don't rescan anymore
%                           (reported by \contributor Akira Yokosawa <@\at @>
%                                    and \contributor theufman <@\at @>) \githubissue{3,4}}
%\changes{v3.0d}{2022/02/26}{no brace delimiting
%                           (reported by \contributor Nelson Lago <@\at @>) \githubissue{10}}
%\changes{v3.0e}{2022/06/16}{only add group if very first token}
%\changes{v3.1}{2023/03/06}{allow multiple groups}
%    \begin{macrocode}
\def\MT@prot@addgroup{\bgroup\afterassignment\MT@prot@get@firstgroup\let\MT@temp= }
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@prot@get@firstgroup}
%\begin{macro}{\MT@prot@get@firstgroup@tc}
%\begin{macro}{\MT@prot@get@firsttoken}
%\begin{macro}{\MT@prot@get@nexttoken}
% Scan token by token.
%    \begin{macrocode}
\def\MT@prot@get@firstgroup{\futurelet\MT@prot@next\MT@prot@get@first@group}
\def\MT@prot@get@firstgroup@tc{\futurelet\MT@prot@next\MT@prot@get@first@group@tc}
\def\MT@prot@get@firsttoken{\futurelet\MT@prot@next\MT@prot@get@first@token}
\def\MT@prot@get@nexttoken{\futurelet\MT@prot@next\MT@prot@get@next@token}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\MT@prot@get@first@group}
%\begin{macro}{\MT@prot@get@first@group@}
% If next char is |{|, start a group and try again, else continue until
% we find a beginning char.
%    \begin{macrocode}
\def\MT@prot@get@first@group@{%
  \MT@prot@ifcat\bgroup{%
    \def\MT@temp*{\MT@prot@addgroup}%
  }{%
    \def\MT@temp*{\MT@prot@get@first@token}%
  }%
  \MT@temp*%
}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\begin{macro}{\MT@prot@get@first@group@tc}
% The variant for text commands (in case they start with another group).
%    \begin{macrocode}
\def\MT@prot@get@first@group@tc{%
  \MT@prot@ifcat\bgroup{%
    \def\MT@temp*##1##2\MT@nil{\MT@ifempty{##1}\relax
          {{\MT@prot@get@firstgroup@tc##1\MT@nil}}}%
  }{%
    \def\MT@temp*{\MT@prot@get@first@token}%
  }%
  \MT@temp*%
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@prot@get@first@token}
%\changes{v3.0e}{2022/06/15}{don't gobble previously captured content}
%\changes{v3.1}{2023/03/06}{expand toks once}
% This can be called repeatedly.
% We add a letter or other character, \dots
%    \begin{macrocode}
\def\MT@prot@get@first@token{%
  \def\MT@temp*{\MT@exp@one@n\MT@ifempty{\the\MT@toks}
      {\MT@exp@one@n\MT@ifempty{\the\MT@prot@toks}\relax{\the\MT@prot@toks\MT@gobble@to@nil}}
      {\MT@exp@one@n\MT@prot@l{\the\MT@toks}}}%
  \MT@prot@ifcat{a}{%
    \def\MT@temp*{\MT@prot@addtoken@first}%
  }{%
    \MT@prot@ifcat{!}{%
      \def\MT@temp*{\MT@prot@addtoken@first}%
    }{%
%    \end{macrocode}
% a space character, \dots
%    \begin{macrocode}
      \MT@prot@ifx\@sptoken{%
        \def\MT@temp* {\MT@prot@get@firstgroup}%
      }{%
%    \end{macrocode}
% commands, \dots
%    \begin{macrocode}
        \let\MT@prot@ifmacro\MT@prot@ifmacro@
        \MT@map@tlist@c\MT@prot@check@cmds\MT@prot@check
%    \end{macrocode}
% \dots~or a command/active char whose first command is one of the following:
%    \begin{macrocode}
        \MT@prot@ifmacro{%
          \MT@prot@iffirstcmd\UTFviii@two@octets{%
            \def\MT@temp*##1##2{\MT@exp@one@n\MT@prot@l{\the\MT@toks##1##2}}%
          }{%
            \MT@prot@iffirstcmd\UTFviii@three@octets{%
              \def\MT@temp*##1##2##3{\MT@exp@one@n\MT@prot@l{\the\MT@toks##1##2##3}}%
            }{%
              \MT@prot@iffirstcmd\UTFviii@four@octets{%
                \def\MT@temp*##1##2##3##4{\MT@exp@one@n\MT@prot@l{\the\MT@toks##1##2##3##4}}%
              }{%
%    \end{macrocode}
% (this is for chars made active by \pkg{csquotes}, via \cmd\MakeAutoQuote\ or
% \cmd\MakeOuterQuote)
%    \begin{macrocode}
                \MT@prot@iffirstcmd\csqQQ{\def\MT@temp*##1{\MT@exp@one@n\MT@prot@l{\the\MT@toks##1}}}{%
%    \end{macrocode}
% or, finally, a <LICR> command.
%    \begin{macrocode}
                  \MT@prot@iflicrcmd
                }%
              }%
            }%
          }%
        }%
      }%
    }%
  }%
  \MT@temp*%
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@prot@addtoken@first}
% Begin filling toks.
%    \begin{macrocode}
\def\MT@prot@addtoken@first#1{%
  \MT@toks\expandafter{\the\MT@toks#1}%
  \MT@prot@get@nexttoken
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@prot@get@next@token}
% Continue if letter or other.
%    \begin{macrocode}
\def\MT@prot@get@next@token{%
  \def\MT@temp*{\MT@prot@addtoken@next}%
  \MT@prot@ifcat{a}\relax{%
    \MT@prot@ifcat{!}\relax{%
      \def\MT@temp*{\MT@exp@one@n\MT@prot@l{\the\MT@toks}}%
    }%
  }%
  \MT@temp*%
}
%</package>
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@prot@addtoken@next}
% Add token to our toks and test whether we've seen enough (ligature completed).
% For luatex, we have to jump through another hoop (\ie, box), because, contrary
% to the manual, \cmd\lastnodetype\ isn't really compatible. ^^A cf. https://mailman.ntg.nl/pipermail/dev-luatex/2021-August/006536.html et seqq.
%\changes{v3.2}{2024/04/24}{make color-safe}
%    \begin{macrocode}
%<*pdf-|lua-|xe->
\def\MT@prot@addtoken@next#1{%
  \MT@toks\expandafter{\the\MT@toks#1}%
  \setbox\MT@tempbox\hbox{%
    \begingroup
%    \end{macrocode}
% We disable italic correction, which would prevent us from
% seeing the ligature (with text commands).
%    \begin{macrocode}
    \let\maybe@ic\relax
    \MT@exp@one@n\MT@maybe@textcmd{\the\MT@toks}%
%<pdf-|xe->    \relax
    \endgroup
%<lua->  }\setbox\MT@tempbox\hbox{\unhbox\MT@tempbox
    \ifnum\lastnodetype=7 \aftergroup\@firstoftwo\else\aftergroup\@secondoftwo\fi}%
      \MT@prot@get@nexttoken
      {\MT@exp@one@n\MT@prot@l{\the\MT@toks}}%
}
%</pdf-|lua-|xe->
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@prot@check}
%\changes{v3.1}{2022/12/17}{allow replacement command}
%\begin{macro}{\MT@prot@check@}
% We map through a list of commands that should be copied into the toks.
% \meta{\#3} will be \cmd\relax\ by default, but can also indicate
% a replacement command.
%    \begin{macrocode}
%<*package>
\def\MT@prot@check#1{\MT@prot@check@#1\relax\@nil}
\def\MT@prot@check@#1#2#3\@nil{%
  \ifx\MT@prot@next#2%
    \csname MT@prot@check@#1\endcsname #3%
    \let\MT@prot@ifmacro\@gobble
    \expandafter\MT@tlist@break
  \fi
}
%    \end{macrocode}
%\end{macro}
%\end{macro}
% Beware that the following nomenclature is rather arcane.
%\begin{itemize}
%  \item
%\begin{macro}{\MT@prot@check@I}
% This is for commands to be \textbf{I}gnored.
%    \begin{macrocode}
\def\MT@prot@check@I{%
  \def\MT@temp*##1{\MT@prot@get@firstgroup}%
}
%    \end{macrocode}
%\end{macro}
%  \item
%\begin{macro}{\MT@prot@check@S}
% Add a \textbf{S}ingle command (without an argument).
%    \begin{macrocode}
\def\MT@prot@check@S{%
  \def\MT@temp*##1{\MT@toks\expandafter{\the\MT@toks##1}\MT@prot@get@firstgroup}%
}
%    \end{macrocode}
%\end{macro}
%  \item
%\begin{macro}{\MT@prot@check@O}
% Add a command with \textbf{O}ne argument.
%    \begin{macrocode}
\def\MT@prot@check@O{%
  \def\MT@temp*##1##2{\MT@toks\expandafter{\the\MT@toks##1{##2}}\MT@prot@get@firstgroup}%
}
%    \end{macrocode}
%\end{macro}
%  \item
%\begin{macro}{\MT@prot@check@o}
%\changes{v3.2}{2024/04/24}{new macro: for one-argument commands with optional argument}
%\begin{macro}{\MT@prot@check@o@}
% The same with an optional argument.
%    \begin{macrocode}
\def\MT@prot@check@o{%
  \def\MT@temp*##1{\@ifnextchar[{\MT@prot@check@o@##1}{\MT@prot@check@o@##1[]}}%
}
%    \end{macrocode}
% The \cmd\color\ command, for which this is used, would stumble over an empty
% optional argument.
%    \begin{macrocode}
\def\MT@prot@check@o@#1[#2]#3{%
  \MT@ifempty{#2}
    {\MT@toks\expandafter{\the\MT@toks#1{#3}}}
    {\MT@toks\expandafter{\the\MT@toks#1[#2]{#3}}}%
  \MT@prot@get@firstgroup
}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%  \item
%\begin{macro}{\MT@prot@check@T}
% Add a command with \textbf{T}wo arguments.
%    \begin{macrocode}
\def\MT@prot@check@T{%
  \def\MT@temp*##1##2##3{\MT@toks\expandafter{\the\MT@toks##1{##2}{##3}}\MT@prot@get@firstgroup}%
}
%    \end{macrocode}
%\end{macro}
%  \item
%\begin{macro}{\MT@prot@check@E}
%\changes{v3.1}{2022/11/29}{new macro: take care of commands that enclose their argument}
% This is for commands that \textbf{E}nclose their argument in something, \eg, in braces,
% and which we trial-typeset without any contents.
%    \begin{macrocode}
\def\MT@prot@check@E{%
  \the\MT@toks
  \def\MT@temp*##1{\MT@prot@l{##1}}%
}
%    \end{macrocode}
%\end{macro}
%  \item
%\begin{macro}{\MT@prot@check@e}
%\changes{v3.1}{2022/11/29}{new macro: take care of starred commands that enclose their argument}
% Same for starred commands (the main candidate here is \pkg{csquotes}'s \cmd\enquote).
%    \begin{macrocode}
\def\MT@prot@check@e{%
  \the\MT@toks
  \def\MT@temp*##1{\@ifstar{\MT@prot@l{##1*}}{\MT@prot@l{##1}}}%
}
%    \end{macrocode}
%\end{macro}
%  \item
%\begin{macro}{\MT@prot@check@eX}
%\changes{v3.1}{2022/12/28}{new macro: replace enclosing commands}
% Here we replace the `integrated interface' (\pkg{csquotes}) with the regular one.
%    \begin{macrocode}
\def\MT@prot@check@eX#1{%
  \the\MT@toks
  \def\MT@temp*##1{\@ifstar
    {\MT@get@prot{#1*}{left}##1*}
    {\MT@get@prot{#1}{left}##1}}%
}
%    \end{macrocode}
%\end{macro}
%  \item
%\begin{macro}{\MT@prot@check@l}
%\changes{v3.1}{2022/12/26}{new macro: for commands that enclose their second argument}
%\begin{macro}{\MT@prot@check@l@}
% \pkg{csquotes} provides a couple of commands for quotations in foreign
% \textbf{l}anguages (lowercase, because it may be starred), whose first argument
% (the language) we also have to evaluate before trial typesetting.
%    \begin{macrocode}
\def\MT@prot@check@l{%
  \def\MT@temp*##1{\@ifstar{\MT@prot@check@l@{##1*}}{\MT@prot@check@l@{##1}}}%
}
\def\MT@prot@check@l@#1#2{%
  \the\MT@toks
  \MT@prot@l{#1{#2}}%
}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%  \item
%\begin{macro}{\MT@prot@check@lX}
%\changes{v3.1}{2022/12/28}{new macro: replace language-switching enclosing commands}
%\begin{macro}{\MT@prot@check@lX@}
% Another macro for \pkg{csquotes} commands: replace integrated language-switching
% commands with their regular variants.
%    \begin{macrocode}
\def\MT@prot@check@lX#1{%
  \def\MT@temp*##1{\@ifstar
    {\def\MT@temp{##1*}\MT@prot@check@lX@{#1*}}
    {\def\MT@temp{##1}\MT@prot@check@lX@{#1}}}%
}
\def\MT@prot@check@lX@#1#2{%
  \the\MT@toks
  \MT@get@prot{#1{#2}}{left}\MT@temp{#2}%
}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%  \item
%\begin{macro}{\MT@prot@check@F}
%\changes{v3.1}{2023/03/06}{new macro: for text commands}
%\changes{v3.1a}{2023/03/12}{fix: execute (and empty) \cs{MT@toks}
%                            (reported by \contributor Artur A. Marczok <marczok\at t-online.de>
%                             and \contributor Uwe Siart <uwe.siart\at tum.de>)}
%                            ^^A private mail, 2023/03/12
%                            ^^A private mail, 2023/03/13
%\changes{v3.1b}{2024/03/29}{fix: failed when group began with another command
%                            \githubissue{31}}
%\changes{v3.2}{2024/09/03}{fix: add \cmd\@empty\ (reported by \contributor nowox <@\at @>)}
%                            ^^A https://tex.stackexchange.com/questions/725639/insert-monospace-text-at-the-beginning-of-item-while-using-microtype
%\begin{macro}{\MT@prot@check@F@@}
% Here we deal with \textbf{F}ont switching commands (\ie, text commands,
% which take an argument).
% We (a) remember the text command, (b) save the full text,
% and then (c) continue inspecting the contents of the argument.
% We also have to execute (and empty) \cs{MT@toks}, because it might
% already contain other commands.
% Nested text commands still don't work.
%    \begin{macrocode}
\def\MT@prot@check@F{%
  \ifx\MT@prot@l\MT@prot@l@tc
    \def\MT@temp*{\MT@exp@one@n\MT@prot@l{\the\MT@toks}}%
  \else
    \let\MT@prot@l\MT@prot@l@tc
    \let\MT@prot@get@first@group\MT@prot@get@first@group@tc
    \def\MT@temp*##1{%
      \the\MT@toks
      \MT@toks{}%
      \MT@prot@check@F@##1%
    }%
  \fi
}
\def\MT@prot@check@F@@#1#2{%
  \let\MT@maybe@textcmd#1%
  \MT@prot@toks{#1{#2}}%
  \MT@prot@get@firstgroup@tc#2\@empty\MT@nil
}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\begin{macro}{\MT@prot@check@F@beamer}
%\changes{v3.2}{2024/10/02}{compatibility with \cls{beamer}'s overlay specifications
%                           (reported by \contributor Frank Mittelbach <frank.mittelbach\at latex-project.org>) \githubissue{38}}
%\begin{macro}{\MT@prot@check@F@beamer@}
% Compatibility with the \cls{beamer} class and its overlay specifications
% (\eg, |\textbf<2>{...}|).
%    \begin{macrocode}
\def\MT@prot@check@F@beamer#1{%
  \@ifnextchar<%
    {\MT@prot@check@F@beamer@#1}%
    {\MT@prot@check@F@@#1}%
}
\def\MT@prot@check@F@beamer@#1<#2>#3{%
  \def\MT@maybe@textcmd{#1<#2>}%
  \MT@prot@toks{#1<#2>{#3}}%
  \MT@prot@get@firstgroup@tc#3\@empty\MT@nil
}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\begin{macro}{\MT@prot@check@F@}
% Choose the right definition.
%    \begin{macrocode}
\@ifclassloaded{beamer}
  {\let\MT@prot@check@F@\MT@prot@check@F@beamer}
  {\let\MT@prot@check@F@\MT@prot@check@F@@}
%    \end{macrocode}
%\end{macro}
%  \item
%\begin{macro}{\MT@prot@check@C}
%\changes{v3.1b}{2023/03/16}{new macro: for text commands with an optional argument
%                            (after \contributor scholnik <@\at @> reported
%                             that \cmd\MakeUppercase\ and friends support one) \githubissue{29}}
%\begin{macro}{\MT@prot@check@C@}
% Same, but for commands that allow an optional argument (\eg, the \textbf{C}ase
% changing commands since \LaTeX\ 2022/11/01).
%    \begin{macrocode}
\def\MT@prot@check@C{%
  \ifx\MT@prot@l\MT@prot@l@tc
    \def\MT@temp*{\MT@exp@one@n\MT@prot@l{\the\MT@toks}}%
  \else
    \let\MT@prot@l\MT@prot@l@tc
    \let\MT@prot@get@first@group\MT@prot@get@first@group@tc
    \def\MT@temp*##1{%
      \the\MT@toks
      \MT@toks{}%
      \@ifnextchar[%
        {\MT@prot@check@C@##1}%
        {\MT@prot@check@C@##1[]}%
    }%
  \fi
}
\def\MT@prot@check@C@#1[#2]#3{%
  \def\MT@maybe@textcmd{#1[#2]}%
  \MT@prot@toks{#1[#2]{#3}}%
  \MT@prot@get@firstgroup@tc#3\@empty\MT@nil
}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{itemize}
%\begin{macro}{\MT@prot@check@cmds}
%\changes{v3.0e}{2022/06/09}{new macro: make list of commands extensible}
%\changes{v3.0e}{2022/05/13}{ignore \cmd\@empty}
%\changes{v3.0e}{2022/06/15}{add standard font selection commands}
%\changes{v3.0f}{2022/06/22}{add \microtype's commands}
%\changes{v3.1}{2023/01/07}{add \cmd\em}
%\changes{v3.1}{2023/03/06}{add \cmd\MakeUppercase\ and friends}
% And here's the list of commands that we can deal with.
% (It's a bit of a shame that \cs{textls} is not among them.)
%    \begin{macrocode}
\def\MT@prot@check@cmds{%
  {I\ignorespaces}{I\relax}{I\@empty}%
  {S\rmfamily}{S\sffamily}{S\ttfamily}{S\mdseries}{S\bfseries}%
  {S\upshape}{S\itshape}{S\slshape}{S\scshape}{S\em}%
  {S\normalfont}{S\selectfont}%
  {S\lsstyle}%
  {S\tiny}{S\scriptsize}{S\footnotesize}{S\small}{S\normalsize}%
  {S\large}{S\Large}{S\LARGE}{S\huge}{S\Huge}%
  {O\fontencoding}{O\fontfamily}{O\fontseries}{O\fontshape}%
  {O\microtypesetup}{O\microtypecontext}%
  {T\fontsize}%
  {F\textrm}{F\textsf}{F\texttt}{F\textnormal}%
  {F\textbf}{F\textmd}{F\textit}{F\textsl}{F\textsc}{F\textup}{F\emph}%
}
%    \end{macrocode}
% \LaTeX\ 2020/02/02 introduced some more text commands
%\changes{v3.0f}{2022/06/22}{add new <NFSS> commands}
% (adopted from \pkg{fontaxes}, which provides some more, see below).
%\changes{v3.1}{2023/01/08}{add \pkg{fontaxes} commands}
%    \begin{macrocode}
\IfFormatAtLeastTF{2020/02/02}
  {\g@addto@macro\MT@prot@check@cmds{%
    {S\swshape}{S\ulcshape}{S\sscshape}{S\normalshape}%
    {F\textulc}{F\textsw}{F\textssc}%
    {O\fontseriesforce}{O\fontshapeforce}}}
  \relax
\IfFormatAtLeastTF{2022/11/01}
  {\g@addto@macro\MT@prot@check@cmds{{C\MakeUppercase}{C\MakeLowercase}{C\MakeTitlecase}}}
  {\g@addto@macro\MT@prot@check@cmds{{F\MakeUppercase}{F\MakeLowercase}}}
%    \end{macrocode}
% The \cls{ltxdoc} class and the \pkg{doc} package provide some abbreviations.
% Unfortunately, the \cmd\cmd\ command doesn't work.
%\changes{v3.1}{2022/12/04}{add \cls{ltxdoc} and \pkg{doc} abbreviations}
%    \begin{macrocode}
\@ifclassloaded{ltxdoc}
  {\g@addto@macro\MT@prot@check@cmds{{E\enquote}{E\marg}{E\oarg}{E\parg}{E\cs}}}\relax
%    \end{macrocode}
% Add \cmd\color\ (but not yet \cmd\textcolor).
%\changes{v3.2}{2024/04/24}{add \pkg{color}'s \cmd\color\ command}
% We also don't yet understand \cls{beamer}'s |<.-.>| notation added to \cmd\color.
%    \begin{macrocode}
\MT@addto@setup{%
  \MT@with@package@T{color}
    {\@ifclassloaded{beamer}\relax{\g@addto@macro\MT@prot@check@cmds{{o\color}}}}%
%    \end{macrocode}
% \pkg{csquotes}'s \cmd\enquote\ command.
% It would take precedence over the one provided by \cls{ltxdoc}.
%\changes{v3.1}{2022/11/29}{add \pkg{csquotes}'s commands
%                           (reported by \contributor Shen Zhou Hong <@\at @>)
%                           \githubissue{25}}
%    \begin{macrocode}
  \MT@with@package@T{csquotes}
    {\@ifclassloaded{ltxdoc}
      {\patchcmd\MT@prot@check@cmds{E\enquote}{e\enquote}\relax\relax}
      {\g@addto@macro\MT@prot@check@cmds{{e\enquote}}}%
     \g@addto@macro\MT@prot@check@cmds{{e\textquote}%
       {l\foreignquote}{l\hyphenquote}{l\foreigntextquote}{l\hyphentextquote}%
       {{eX}\textcquote\textquote}%
       {{lX}\foreigntextcquote\foreigntextquote}%
       {{lX}\hyphentextcquote\hyphentextquote}}}%
  \MT@with@package@T{doc}
    {\g@addto@macro\MT@prot@check@cmds{{E\meta}}}%
%    \end{macrocode}
% The additional \pkg{fontaxes} commands.
%    \begin{macrocode}
  \MT@with@package@T{fontaxes}
    {\g@addto@macro\MT@prot@check@cmds{%
      {S\txfigures}{S\lnfigures}{S\tbfigures}{S\prfigures}%
      {O\fontfigurestyle}{O\fontfigurealignment}{O\fontbasefamily}%
      {O\figureversion}%
      {F\textfigures}{F\liningfigures}{F\tabularfigures}{F\proportionalfigures}}%
      \IfFormatAtLeastTF{2020/02/02}\relax
        {\g@addto@macro\MT@prot@check@cmds{%
          {S\swshape}{S\ulcshape}{S\sscshape}%
          {F\textulc}{F\textsw}{F\textssc}}}}%
%    \end{macrocode}
% \pkg{fontspec}'s \cmd\fontspec's command allows an optional
% argument \emph{after} the mandatory one, and we can't deal with
% that (yet).
%\changes{v3.2}{2024/05/22}{add some \pkg{fontspec} commands}
%    \begin{macrocode}
  \MT@with@package@T{fontspec}
    {\g@addto@macro\MT@prot@check@cmds{%
      {O\addfontfeature}{O\addfontfeatures}{F\strong}}}%
%    \end{macrocode}
% The \pkg{nfssext-cfr} package (an extension of the \pkg{nfssext} package,
% which is part of Philipp Lehman's \pkg{fontinstallationguide} but was never
% publicised separately as far as I can tell) adds many more commands on top
% of the <NFSS>.
%\changes{v3.1}{2023/01/16}{add \pkg{nfssext-cfr} commands}
%    \begin{macrocode}
  \MT@with@package@T{nfssext-cfr}
    {\g@addto@macro\MT@prot@check@cmds{%
      {S\tistyle}{S\ltstyle}{S\ofstyle}{S\altstyle}{S\regstyle}{S\embossstyle}%
      {S\ornamentalstyle}{S\qtstyle}{S\shstyle}{S\tmstyle}{S\tvstyle}{S\swashstyle}%
      {S\lnstyle}{S\osstyle}{S\instyle}{S\sustyle}{S\lstyle}{S\ostyle}%
      {S\pstyle}{S\tstyle}{S\plstyle}{S\postyle}{S\tlstyle}{S\tostyle}%
      {S\scolshape}{S\olshape}{S\sishape}{S\ushape}{S\scushape}%
      {S\uishape}{S\rishape}{S\dfshape}{S\swstyle}%
      {S\nwwidth}{S\cdwidth}{S\ecwidth}{S\ucwidth}%
      {S\etwidth}{S\epwidth}{S\exwidth}{S\uxwidth}{S\regwidth}%
      {S\mbweight}{S\dbweight}{S\sbweight}{S\ebweight}%
      {S\ubweight}{S\lgweight}{S\elweight}{S\ulweight}%
      {F\textti}{F\textlt}{F\textof}{F\textalt}{F\textreg}{F\emboss}%
      {F\textorn}{O\ornament}{F\textqt}{F\textsh}{F\texttm}{F\texttv}{F\textswash}%
      {F\textln}{F\textos}{F\textin}{F\textsu}{F\textl}{F\texto}%
      {F\textp}{F\textt}{F\textpl}{F\textpo}{F\texttl}{F\textto}%
      {F\textol}{F\textsi}{F\textu}{F\textscu}%
      {F\textui}{F\textri}{F\textdf}%
      {F\textnw}{F\textcd}{F\textec}{F\textuc}%
      {F\textet}{F\textep}{F\textex}{F\textux}{F\textrw}%
      {F\textmb}{F\textdb}{F\textsb}{F\texteb}%
      {F\textub}{F\textlg}{F\textel}{F\textul}}%
      \IfFormatAtLeastTF{2020/02/02}\relax
        {\g@addto@macro\MT@prot@check@cmds{{S\swshape}{F\textsw}}}}%
%    \end{macrocode}
% If \pkg{yfonts} is loaded, we add the relevant commands.
%    \begin{macrocode}
  \MT@with@package@T{yfonts}
    {\g@addto@macro\MT@prot@check@cmds{%
      {S\frakfamily}{S\swabfamily}{S\gothfamily}%
      {F\textfrak}{F\textswab}{F\textgoth}}}%
}
%</package>
%    \end{macrocode}
%\end{macro}
%
%\subsubsection{Expansion}
%
%\begin{macro}{\MT@expansion}
% Set up for expansion?
%    \begin{macrocode}
%<*pdf-|lua->
\def\MT@expansion{\MT@maybe@do{ex}}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@set@ex@codes@s}
% Setting up font expansion is a bit different because of the \opt{selected} option.
% There are two versions of this macro.
%
% If \opt{selected}|=true|, we only apply font expansion to those fonts for which a
% list has been declared (\ie, like for protrusion).
%    \begin{macrocode}
\def\MT@set@ex@codes@s{%
  \MT@if@list@exists{%
    \MT@get@ex@opt
    \let\MT@get@char@unit\relax
    \MT@reset@ef@codes
    \MT@get@inh@list
    \MT@set@inputenc{c}%
    \MT@load@list\MT@ex@c@name
    \MT@set@listname
    \MT@let@cn\@tempc{MT@ex@c@\MT@ex@c@name}%
    \expandafter\MT@set@codes\@tempc,\relax,%
    \MT@expandfont
  }\relax
}
%</pdf-|lua->
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\MT@set@ex@codes@n}
% If, on the other hand, all characters should be expanded by the same amount,
% we only take the first optional argument to \cs{SetExpansion} into account.
%\begin{macro}{\ifMT@nonselected}
% We need this boolean in \cs{MT@if@list@exists} so that no warning for missing
% lists will be issued.
%    \begin{macrocode}
%<package>\newif\ifMT@nonselected
%    \end{macrocode}
%\end{macro}
%    \begin{macrocode}
%<*pdf-|lua->
\def\MT@set@ex@codes@n{%
  \MT@nonselectedtrue
  \MT@if@list@exists
    \MT@get@ex@opt
  {%
    \let\MT@stretch@  \MT@stretch
    \let\MT@shrink@   \MT@shrink
    \let\MT@step@     \MT@step
    \let\MT@auto@     \MT@auto
    \let\MT@ex@factor@\MT@ex@factor
  }%
  \MT@reset@ef@codes
  \MT@expandfont
  \MT@nonselectedfalse
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@set@ex@codes}
%\changes{v1.5}{2004/12/02}{allow non-selected font expansion}
%\changes{v1.6}{2004/12/26}{introduce \texttt{factor} option}
%\changes{v1.7}{2005/02/06}{two versions of this macro}
% Default is non-selected. It can be changed in the package options.
%    \begin{macrocode}
\let\MT@set@ex@codes\MT@set@ex@codes@n
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@expandfont}
% Expand the font. For some reason, older \luatex\ versions freeze if
% the |autoexpand| modifier is missing. Can't be bothered to find out why.
% For newer versions, we could also use the function |font.setexpansion|,
% or, in the future, \pkg{luaotfload}'s expansion font feature. ^^A https://github.com/latex3/luaotfload/commit/4907e23407c52437cca56966d11d3b4548bba585
%\iffalse
% In \luatex, we try to go the |lua| way, if the |font.setexpansion| function exists.
%\changes{v2.7d}{2019/11/17}{use \luatex\ function \texttt{font.}\penalty\exhyphenpenalty\texttt{setexpansion} if available}
%\fi
%    \begin{macrocode}
%<*lua->
\MT@requires@luatex3{
\MT@requires@luatex4{\let\pdffontexpand\expandglyphsinfont}\relax
\ifnum\luatexversion<79
\def\MT@expandfont{%
  \pdffontexpand\MT@font \MT@stretch@ \MT@shrink@ \MT@step@ autoexpand\relax
}
\else
\def\MT@expandfont{%
  \pdffontexpand\MT@font \MT@stretch@ \MT@shrink@ \MT@step@\relax
}
\fi
}{
%</lua->
\def\MT@expandfont{%
  \pdffontexpand\MT@font \MT@stretch@ \MT@shrink@ \MT@step@ \MT@auto@\relax
}
%<lua->}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@set@all@ex}
%\begin{macro}{\MT@reset@ef@codes@}
% At first, all expansion factors for the characters will be set to 1000
% (respectively the |factor| of this font).
%    \begin{macrocode}
\def\MT@set@all@ex#1{%
%<debug>\MT@dinfo@nl{3}{-- ex: setting all to \number#1}%
  \MT@do@font{\efcode\MT@font\@tempcnta=#1\relax}%
}
\def\MT@reset@ef@codes@{\MT@set@all@ex\MT@ex@factor@}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\begin{macro}{\MT@reset@ef@codes}
% However, this is only necessary for \pdftex\ versions prior to~1.20,
% or \luatex\ $\less$~0.90 (actually, I think, 0.87).
%\changes{v1.6a}{2005/01/30}{only reset \cmd\efcode s for older \pdftex\ versions}
%\changes{v2.7}{2017/02/13}{only reset \cmd\efcode s for older \luatex\ versions}
%    \begin{macrocode}
%<pdf->\MT@requires@pdftex4
%<lua->\MT@requires@luatex5
{
  \def\MT@reset@ef@codes{%
    \ifnum\MT@ex@factor@=\@m \else
      \MT@reset@ef@codes@
    \fi
  }
}{
  \let\MT@reset@ef@codes\MT@reset@ef@codes@
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@ex@split@val}
% There's only one number per character.
%    \begin{macrocode}
\def\MT@ex@split@val#1\relax{%
  \@tempcntb=#1\relax
%    \end{macrocode}
% Take an optional factor into account.
%    \begin{macrocode}
  \ifnum\MT@ex@factor@=\@m \else
    \MT@scale\@tempcntb \MT@ex@factor@ \@m
  \fi
  \ifnum\@tempcntb > \MT@ex@max
    \MT@warn@ex@too@large\MT@ex@max
  \else
    \ifnum\@tempcntb < \MT@ex@min
      \MT@warn@ex@too@large\MT@ex@min
    \fi
  \fi
  \efcode\MT@font\MT@char=\@tempcntb
%<debug>\MT@dinfo@nl{4}{::: ef (\MT@char): \number\efcode\MT@font\MT@char: [#1]}%
%    \end{macrocode}
% Heirs, heirs, I love thy heirs.
%    \begin{macrocode}
  \MT@ifdefined@c@T\MT@ex@inh@name{%
    \MT@ifdefined@n@T{MT@inh@\MT@ex@inh@name @\MT@char @}{%
      \MT@exp@cs\MT@map@tlist@c{MT@inh@\MT@ex@inh@name @\MT@char @}\MT@set@ex@heirs
    }%
  }%
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@warn@ex@too@large}
%    \begin{macrocode}
\def\MT@warn@ex@too@large#1{%
  \MT@warning@nl{Expansion factor \number\@tempcntb\space too large for
    character\MessageBreak `\the\MT@toks' in \MT@curr@list@name.\MessageBreak
    Setting it to the maximum of \number#1}%
  \@tempcntb=#1\relax
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@get@ex@opt}
%\changes{v1.9d}{2006/02/13}{fix: evaluate \texttt{preset}}
%\begin{macro}{\MT@ex@factor@}
%\begin{macro}{\MT@stretch@}
%\begin{macro}{\MT@shrink@}
%\begin{macro}{\MT@step@}
%\begin{macro}{\MT@auto@}
% Apply different values to this font?
%    \begin{macrocode}
\def\MT@get@ex@opt{%
  \MT@set@listname
  \MT@ifdefined@n@TF{MT@ex@c@\MT@ex@c@name @factor}{%
    \MT@let@cn\MT@ex@factor@{MT@ex@c@\MT@ex@c@name @factor}%
    \MT@vinfo{... : Multiplying expansion factors by \number\MT@ex@factor@/1000}%
  }{%
    \let\MT@ex@factor@\MT@ex@factor
  }%
  \MT@get@ex@opt@{stretch}{Setting stretch limit to \number\MT@stretch@}%
  \MT@get@ex@opt@{shrink} {Setting shrink limit to \number\MT@shrink@}%
  \MT@get@ex@opt@{step}   {Setting expansion step to \number\MT@step@}%
%<lua->  \MT@requires@luatex3\relax{%
  \MT@get@ex@opt@{auto}{\MT@ifstreq{\MT@auto@}{autoexpand}{En}{Dis}abling automatic expansion}%
%<lua->  }%
  \MT@ifdefined@n@T{MT@ex@c@\MT@ex@c@name @preset}{%
    \MT@preset@ex
    \let\MT@reset@ef@codes\relax
  }%
}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\MT@get@ex@opt@}
%    \begin{macrocode}
\def\MT@get@ex@opt@#1#2{%
  \MT@ifdefined@n@TF{MT@ex@c@\MT@ex@c@name @#1}{%
    \MT@let@nn{MT@#1@}{MT@ex@c@\MT@ex@c@name @#1}%
    \MT@vinfo{... : #2}%
  }{%
    \MT@let@nn{MT@#1@}{MT@#1}%
  }%
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@set@ex@heirs}
%    \begin{macrocode}
\def\MT@set@ex@heirs#1{%
  \efcode\MT@font#1=\efcode\MT@font\MT@char
%<debug>\MT@dinfo@nl{2}{-- heir of \MT@char: #1}%
%<debug>\MT@dinfo@nl{4}{::: ef (#1) \number\efcode\MT@font\MT@char}%
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@preset@ex}
%    \begin{macrocode}
\def\MT@preset@ex{%
  \@tempcntb=\csname MT@ex@c@\MT@ex@c@name @preset\endcsname\relax
  \MT@scale@factor
  \MT@set@all@ex\@tempcntb
}
%</pdf-|lua->
%    \end{macrocode}
%\end{macro}
%
%\subsubsection{Interword spacing (glue)}
%
%\begin{macro}{\MT@spacing}
% Adjustment of interword spacing? Only works with \pdftex.
%    \begin{macrocode}
%<*pdf->
\MT@requires@pdftex6{
\def\MT@spacing{\MT@maybe@do{sp}}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@set@sp@codes}
% This is all the same.
%    \begin{macrocode}
\def\MT@set@sp@codes{%
  \MT@if@list@exists{%
    \MT@get@opt
    \MT@reset@sp@codes
    \MT@get@inh@list
    \MT@set@inputenc{c}%
    \MT@load@list\MT@sp@c@name
    \MT@set@listname
    \MT@let@cn\@tempc{MT@sp@c@\MT@sp@c@name}%
    \expandafter\MT@set@codes\@tempc,\relax,%
  }\MT@reset@sp@codes
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@sp@split@val}
% If |unit=space|, \cs{MT@get@space@unit} will be defined to fetch the
% corresponding fontdimen (2 for the first, 3 for the second and 4 for the
% third argument).
%    \begin{macrocode}
\def\MT@sp@split@val#1,#2,#3\relax{%
  \def\@tempb{#1}%
  \MT@ifempty\@tempb\relax{%
    \MT@get@space@unit2%
    \MT@scale@to@em
    \knbscode\MT@font\MT@char=\@tempcntb
%<debug>\MT@dinfo@nl{4}{;;; knbs (\MT@char): \number\knbscode\MT@font\MT@char: [#1]}%
  }%
  \def\@tempb{#2}%
  \MT@ifempty\@tempb\relax{%
    \MT@get@space@unit3%
    \MT@scale@to@em
    \stbscode\MT@font\MT@char=\@tempcntb
%<debug>\MT@dinfo@nl{4}{;;; stbs (\MT@char): \number\stbscode\MT@font\MT@char: [#2]}%
  }%
  \def\@tempb{#3}%
  \MT@ifempty\@tempb\relax{%
    \MT@get@space@unit4%
    \MT@scale@to@em
    \shbscode\MT@font\MT@char=\@tempcntb
%<debug>\MT@dinfo@nl{4}{;;; shbs (\MT@char): \number\shbscode\MT@font\MT@char: [#3]}%
  }%
  \MT@ifdefined@c@T\MT@sp@inh@name{%
    \MT@ifdefined@n@T{MT@inh@\MT@sp@inh@name @\MT@char @}{%
      \MT@exp@cs\MT@map@tlist@c{MT@inh@\MT@sp@inh@name @\MT@char @}\MT@set@sp@heirs
    }%
  }%
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@set@sp@heirs}
%    \begin{macrocode}
\def\MT@set@sp@heirs#1{%
  \knbscode\MT@font#1=\knbscode\MT@font\MT@char
  \stbscode\MT@font#1=\stbscode\MT@font\MT@char
  \shbscode\MT@font#1=\shbscode\MT@font\MT@char
%<debug>\MT@dinfo@nl{2}{-- heir of \MT@char: #1}%
%<debug>\MT@dinfo@nl{4}{;;; knbs/stbs/shbs (#1): \number\knbscode\MT@font\MT@char/%
%<debug>        \number\stbscode\MT@font\MT@char/\number\shbscode\MT@font\MT@char}%
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@set@all@sp}
%\begin{macro}{\MT@reset@sp@codes}
%\begin{macro}{\MT@reset@sp@codes@}
%    \begin{macrocode}
\def\MT@set@all@sp#1#2#3{%
%<debug>\MT@dinfo@nl{3}{-- knbs/stbs/shbs: setting all to #1/#2/#3}%
  \let\MT@temp\@empty
  \MT@ifempty{#1}\relax{\g@addto@macro\MT@temp{\knbscode\MT@font\@tempcnta=#1\relax}}%
  \MT@ifempty{#2}\relax{\g@addto@macro\MT@temp{\stbscode\MT@font\@tempcnta=#2\relax}}%
  \MT@ifempty{#3}\relax{\g@addto@macro\MT@temp{\shbscode\MT@font\@tempcnta=#3\relax}}%
  \MT@do@font\MT@temp
}
\def\MT@reset@sp@codes@{\MT@set@all@sp\z@\z@\z@}
\let\MT@reset@sp@codes\relax
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\MT@preset@sp}
%\begin{macro}{\MT@preset@sp@}
%    \begin{macrocode}
\def\MT@preset@sp{%
  \expandafter\expandafter\expandafter\MT@preset@sp@
    \csname MT@sp@c@\MT@sp@c@name @preset\endcsname\@nil
}
\def\MT@preset@sp@#1,#2,#3\@nil{%
  \ifx\MT@sp@unit@\@empty
    \MT@warn@preset@towidth{sp}%
    \MT@ifempty{#1}{\let\@tempa\@empty}{\MT@preset@aux@factor{#1}\@tempa}%
    \MT@ifempty{#2}{\let\@tempc\@empty}{\MT@preset@aux@factor{#2}\@tempc}%
    \MT@ifempty{#3}{\let\@tempb\@empty}{\MT@preset@aux@factor{#3}\@tempb}%
  \else
    \MT@ifempty{#1}{\let\@tempa\@empty}{\MT@preset@aux@space2{#1}\@tempa}%
    \MT@ifempty{#2}{\let\@tempc\@empty}{\MT@preset@aux@space3{#2}\@tempc}%
    \MT@ifempty{#3}{\let\@tempb\@empty}{\MT@preset@aux@space4{#3}\@tempb}%
  \fi
  \MT@set@all@sp\@tempa\@tempc\@tempb
}
}\relax
%    \end{macrocode}
%\end{macro}
%\end{macro}
%
%\subsubsection{Additional kerning}
%
%\begin{macro}{\MT@kerning}
% Again, only check for additional kerning for new versions of \pdftex.
%    \begin{macrocode}
\MT@requires@pdftex6{
\def\MT@kerning{\MT@maybe@do{kn}}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@set@kn@codes}
% It's getting boring, I know.
%    \begin{macrocode}
\def\MT@set@kn@codes{%
  \MT@if@list@exists{%
    \MT@get@opt
    \MT@reset@kn@codes
    \MT@get@inh@list
    \MT@set@inputenc{c}%
    \MT@load@list\MT@kn@c@name
    \MT@set@listname
    \MT@let@cn\@tempc{MT@kn@c@\MT@kn@c@name}%
    \expandafter\MT@set@codes\@tempc,\relax,%
  }\MT@reset@kn@codes
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@kn@split@val}
% Again, the unit may be measured in the space dimension; this time only
% \fontdim2.
%    \begin{macrocode}
\def\MT@kn@split@val#1,#2\relax{%
  \def\@tempb{#1}%
  \MT@ifempty\@tempb\relax{%
    \MT@get@space@unit2%
    \MT@scale@to@em
    \knbccode\MT@font\MT@char=\@tempcntb
%<debug>\MT@dinfo@nl{4}{;;; knbc (\MT@char): \number\knbccode\MT@font\MT@char: [#1]}%
  }%
  \def\@tempb{#2}%
  \MT@ifempty\@tempb\relax{%
    \MT@get@space@unit2%
    \MT@scale@to@em
    \knaccode\MT@font\MT@char=\@tempcntb
%<debug>\MT@dinfo@nl{4}{;;; knac (\MT@char): \number\knaccode\MT@font\MT@char: [#2]}%
  }%
  \MT@ifdefined@c@T\MT@kn@inh@name{%
    \MT@ifdefined@n@T{MT@inh@\MT@kn@inh@name @\MT@char @}{%
      \MT@exp@cs\MT@map@tlist@c{MT@inh@\MT@kn@inh@name @\MT@char @}\MT@set@kn@heirs
    }%
  }%
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@set@kn@heirs}
%    \begin{macrocode}
\def\MT@set@kn@heirs#1{%
  \knbccode\MT@font#1=\knbccode\MT@font\MT@char
  \knaccode\MT@font#1=\knaccode\MT@font\MT@char
%<debug>\MT@dinfo@nl{2}{-- heir of \MT@char: #1}%
%<debug>\MT@dinfo@nl{4}{;;; knbc (#1): \number\knbccode\MT@font\MT@char/%
%<debug>                               \number\knaccode\MT@font\MT@char}%
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@set@all@kn}
%\begin{macro}{\MT@reset@kn@codes}
%\begin{macro}{\MT@reset@kn@codes@}
%    \begin{macrocode}
\def\MT@set@all@kn#1#2{%
%<debug>\MT@dinfo@nl{3}{-- knac/knbc: setting all to #1/#2}%
  \let\MT@temp\@empty
  \MT@ifempty{#1}\relax{\g@addto@macro\MT@temp{\knbccode\MT@font\@tempcnta=#1\relax}}%
  \MT@ifempty{#2}\relax{\g@addto@macro\MT@temp{\knaccode\MT@font\@tempcnta=#2\relax}}%
  \MT@do@font\MT@temp
}
\def\MT@reset@kn@codes@{\MT@set@all@kn\z@\z@}
\let\MT@reset@kn@codes\relax
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\MT@preset@kn}
%\begin{macro}{\MT@preset@kn@}
%    \begin{macrocode}
\def\MT@preset@kn{%
  \expandafter\expandafter\expandafter\MT@preset@kn@
    \csname MT@kn@c@\MT@kn@c@name @preset\endcsname\@nil
}
\def\MT@preset@kn@#1,#2\@nil{%
  \ifx\MT@kn@unit@\@empty
    \MT@warn@preset@towidth{kn}%
    \let\MT@preset@aux\MT@preset@aux@factor
  \else
    \def\MT@preset@aux{\MT@preset@aux@space2}%
  \fi
  \MT@ifempty{#1}{\let\@tempa\@empty}{\MT@preset@aux{#1}\@tempa}%
  \MT@ifempty{#2}{\let\@tempb\@empty}{\MT@preset@aux{#2}\@tempb}%
  \MT@set@all@kn\@tempa\@tempb
}
}\relax
%</pdf->
%    \end{macrocode}
%\end{macro}
%\end{macro}
%
%\subsubsection{\lsstyle Tracking}
%
% This only works with \pdftex\ 1.40
%\changes{v2.5}{2010/09/17}{letterspacing with \luatex\ 0.62} ^^A (beta:03)
%\changes{v3.2}{2024/05/16}{letterspacing\slash tracking with \xetex\
%                           (requested by \contributor Aleksandr Petrosyan <@\at @>)
%                           \githubissue{22}}
% or \luatex\ 0.62.
%    \begin{macrocode}
%<*pdf-|lua-|xe->
%<pdf->\MT@requires@pdftex6
%<lua->\MT@requires@luatex3
%<pdf-|lua->{
%    \end{macrocode}
%\begin{macro}{\MT@tracking}
%\changes{v2.2}{2007/02/23}{remember fonts that shouldn't be letterspaced}
%\begin{macro}{\MT@tracking@}
%\changes{v2.2}{2007/06/16}{fix: tracking couldn't be re-enabled}
%\begin{macro}{\MT@tr@font@list}
% We only check whether a font should not be letterspaced at all, not whether
% we've already done that (because we have to do it again).
%    \begin{macrocode}
\let\MT@tr@font@list\@empty
\def\MT@tracking@{%
  \MT@exp@one@n\MT@in@clist\MT@font\MT@tr@font@list
  \ifMT@inlist@\else
    \MT@maybe@do{tr}%
    \ifMT@do\else
      \xdef\MT@tr@font@list{\MT@tr@font@list\MT@font,}%
    \fi
  \fi
}
%</pdf-|lua-|xe->
%<pdf-|lua-|xe-|letterspace>\let\MT@tracking
%<pdf-|lua-|xe->  \MT@tracking@
%<letterspace>  \relax
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\MT@set@tr@codes}
% The tracking amount is determined by the optional argument to \cs{textls},
% settings from \cs{SetTracking}, or the global \opt{letterspace} option, in
% this order.
%
% Tracking won't work with older \pdftex\ versions (\less\ 1.40.23)
% if the original font's \fontdim6 is zero, in which
%\changes{v3.0}{2021/06/11}{with \luatex, tracking also works for fonts with a zero \fontdim6}
%\changes{v3.0}{2021/07/01}{with \pdftex\ 1.40.23, tracking also works for fonts with a zero \fontdim6}
% case we issue a warning (once for every font).
%    \begin{macrocode}
%<*pdf-|lua-|xe-|letterspace>
\def\MT@set@tr@codes{%
%<*pdf-|lua-|xe->
  \MT@vinfo{Tracking font `\MT@@font'\on@line}%
%<*pdf->
  \MT@requires@pdftex8\@firstofone{%
    \MT@ifdefined@n@TF{\MT@@font-fake6}{%
      \MT@exp@cs\ifx{\MT@@font-fake6}\@empty
        \MT@warning@nl{%
          Font `\MT@@font' does not specify its\MessageBreak
          \@backslashchar fontdimen 6 (width of an `em')! Therefore,\MessageBreak
          tracking will not work with this font}%
        \MT@glet@nc{\MT@@font-fake6}\relax
      \fi
    }%
  }{%
%</pdf->
  \MT@if@list@exists
    \MT@get@tr@opt
    \relax
%</pdf-|lua-|xe->
  \MT@ifdefined@c@TF\MT@letterspace@\relax{\let\MT@letterspace@\MT@letterspace}%
  \ifnum\MT@letterspace@=\z@
%    \end{macrocode}
%\changes{v2.3d}{2009/03/05}{allow zero tracking}
% Zero tracking requires special treatment.
%    \begin{macrocode}
    \MT@set@tr@zero
  \else
%<pdf-|lua-|xe->    \MT@vinfo{... Tracking by \number\MT@letterspace@}%
%    \end{macrocode}
% Letterspacing only works in <PDF> mode.
%    \begin{macrocode}
%<pdf-|lua-|letterspace>    \MT@warn@tracking@DVI
%    \end{macrocode}
%\begin{macro}{\MT@lsfont}
% The letterspaced font instances are saved in macros
% |\|\meta{font name}|/|\meta{letterspacing amount}|ls|.
%
%\changes{v2.2}{2007/03/07}{use \cmd\font@name, not \cs{MT@font}}
% In contrast to \cs{MT@font}, which may reflect the font characteristics more
% accurately (taking substitutions into account), \cmd\font@name\ is guaranteed
% to correspond to an actual font identifier.
%    \begin{macrocode}
    \xdef\MT@lsfont{\csname\expandafter\string\font@name
                           /\number\MT@letterspace@ ls\endcsname}%
    \expandafter\ifx\MT@lsfont\relax
%<debug>\MT@dinfo@nl{1}{... new letterspacing instance}%
%    \end{macrocode}
%\end{macro}
% In case of nested letterspacing with different amounts, we have to extract
% the base font again.
%    \begin{macrocode}
      \MT@get@ls@basefont
%    \end{macrocode}
%\changes{v2.6}{2013/07/15}{use \pkg{luaotfload}'s \texttt{kernfactor} feature if available}
% \pkg{luaotfload} provides the faux font feature |kernfactor|, which we will
% use when dealing with non-legacy fonts, as it is less problematic and faster
% than the \pdftex\ primitive \cmd\letterspacefont.
%    \begin{macrocode}
%<*lua-|xe-|letterspace>
      \MT@if@opentype@font{%
%<debug>\MT@dinfo@nl{1}{... opentype font: \MessageBreak
%<debug>         \expandafter\fontname\font@name}%
%<lua-|xe-|letterspace>        \let\MT@tr@features\@empty
%<lua-|xe->        \MT@ifdefined@c@T\MT@tr@feat\MT@tr@set@features
        \global\expandafter\font\MT@lsfont=\MT@ls@fontspec@font
%<debug>\MT@dinfo@nl{2}{... -- new font: \expandafter\fontname\MT@lsfont}%
      }{%
%</lua-|xe-|letterspace>
%<lua-&debug>\MT@dinfo@nl{1}{... legacy font}%
%<lua->        \MT@ifdefined@c@T\MT@tr@feat
%<lua->          {\MT@warning{\MT@@font\space is a legacy font.\MessageBreak
%<lua->                Cannot disable Opentype `features' in \MT@curr@list@name}}%
%<pdf-|lua-|letterspace>      \global\expandafter\letterspacefont\MT@lsfont\font@name\MT@letterspace@
%<xe->        \MT@warning{\MT@@font\space is a legacy font.\MessageBreak
%<xe->                    Cannot letterspace it}%
%<xe->        \MT@glet\MT@lsfont\font@name
%<lua-|xe-|letterspace>      }%
%    \end{macrocode}
%\changes{v2.2}{2007/06/16}{possibility to customise interword spacing}
% Scale interword spacing (not configurable in \letterspace).
%    \begin{macrocode}
%<*pdf-|lua-|xe->
      \MT@ifdefined@c@TF\MT@tr@ispace
        {\let\@tempa\MT@tr@ispace}%
        {\edef\@tempa{\MT@letterspace@*,,}}%
      \MT@ifdefined@c@TF\MT@tr@ospace
        {\edef\@tempa{\@tempa,\MT@tr@ospace}}%
        {\edef\@tempa{\@tempa,,,}}%
      \expandafter\MT@tr@set@space\@tempa,%
%</pdf-|lua-|xe->
%<*letterspace>
      % spacing = {<letterspace amount>*,,}
      \fontdimen2\MT@lsfont=\dimexpr\numexpr 1000+\MT@letterspace@\relax sp
                                            * \fontdimen2\MT@lsfont/1000\relax
%</letterspace>
%    \end{macrocode}
%\changes{v2.3}{2007/11/03}{possibility to customise outer kerning
%                           (suggested by \contributor Stephan Hennig <stephanhennig\at arcor.de>)}
%                            ^^A MID: <46aa1cbb$0$31620$9b4e6d93@newsspool3.arcor-online.net>
% Adjust outer kerning (\microtype\ only).
%    \begin{macrocode}
%<*pdf-|lua-|xe->
      \MT@ifdefined@c@TF\MT@tr@okern{\let\@tempa\MT@tr@okern}{\def\@tempa{*,*}}%
      \expandafter\MT@tr@set@okern\@tempa,%
%    \end{macrocode}
%\changes{v2.2}{2007/02/23}{disable ligatures in letterspaced fonts manually
%                           (due to change in \pdftex\ 1.40.4)}
% Disable ligatures (not configurable in \letterspace, not possible with \xetex).
%\changes{v3.2}{2024/05/16}{fix noligatures for OpenType fonts with \letterspace}
%    \begin{macrocode}
      \MT@ifdefined@c@T\MT@tr@ligatures\MT@tr@noligatures
%</pdf-|lua-|xe->
%<*letterspace>
      % no ligatures = {f}
      \MT@if@opentype@font
        {\MT@lua{microtype.noligatures([[\MT@lsfont]],[[\number\numexpr`f]])}}
        {\tagcode\MT@lsfont`f=\m@ne}%
%</letterspace>
%    \end{macrocode}
% Adjust protrusion values now, and maybe later (in \cs{MT@pr@split@val})
% (not for \luatex, though, where letterspacing does not interfere with protrusion).
%\changes{v2.3}{2007/07/27}{also adjust tracking if protrusion is not enabled,
%                           and even for \letterspace\
%                           (reported by \contributor Stephan Hennig <stephanhennig\at arcor.de>)}
%                               ^^A MID: <46a9c6c6$0$21005$9b4e6d93@newsspool1.arcor-online.net>
%\changes{v2.3b}{2008/05/12}{fix: protrusion adjustment only for new fonts
%                            (reported by \contributor Wolfram Schaalo <schaalo\at gmx.net>)}
%                                                              ^^A private mail, 2008/05/12
%    \begin{macrocode}
%<lua-|letterspace>      \MT@if@opentype@font\relax{%
%<(lua-|pdf-)&debug>\MT@dinfo@nl{2}{... compensating for tracking (\number\MT@letterspace@)}%
%<!xe->      \MT@do@font{\lpcode\MT@lsfont\@tempcnta=\numexpr\MT@letterspace@/2\relax
%<!xe->                  \rpcode\MT@lsfont\@tempcnta=\numexpr\MT@letterspace@/2\relax}%
%<!xe->      \let\MT@the@pr@code\MT@the@pr@code@tr
%<lua-|letterspace>     }%
    \fi
%    \end{macrocode}
% Finally, let the letterspaced font propagate.
% With \luatex, we also need to load.
%\changes{v2.5a}{2013/05/15}{fix: load font for \pkg{fontspec}} ^^A for MT@get@slot
%    \begin{macrocode}
    \aftergroup\MT@set@lsfont
%<pdf-|lua-|xe->    \let\MT@font\MT@lsfont
%<lua-|xe->    \MT@if@opentype@font\MT@font\relax
%    \end{macrocode}
%\begin{macro}{\MT@set@curr@ls}
%\begin{macro}{\MT@curr@ls}
% We need to remember the current letterspacing amount (for \cs{lslig}).
%    \begin{macrocode}
    \xdef\MT@set@curr@ls{\def\noexpand\MT@curr@ls{\MT@letterspace@}}%
    \aftergroup\MT@set@curr@ls
%    \end{macrocode}
%\end{macro}
%\end{macro}
% Adjust surrounding spacing and kerning.
%\begin{macro}{\MT@set@curr@os}
%\changes{v2.3}{2007/11/03}{adjusting spaces made more reliable}
% We get the current outer spacing and adjust it, then, after the end of the
% current outer group, set the current outer spacing, again, and adjust.
%    \begin{macrocode}
%<*pdf-|lua-|xe->
    \MT@outer@space=\csname MT@outer@space\expandafter\string\font@name\endcsname\relax
    \xdef\MT@set@curr@os{\MT@outer@space=\the\MT@outer@space\relax}%
    \MT@tr@outer@l
%</pdf-|lua-|xe->
%    \end{macrocode}
%\end{macro}
% If \cs{MT@ls@adjust} is empty, it's the starred version of \cs{textls}.
% Use scaling to avoid a `Dimension too large'.
%    \begin{macrocode}
    \ifx\MT@ls@adjust\@empty
%<letterspace>      % \textls : outer kerning = {*,*} ; \textls* : outer kerning = {0,0}
      \MT@outer@kern=-\dimexpr\MT@letterspace@ sp * \fontdimen6\font@name/2000\relax
      \MT@ls@outer@k
%    \end{macrocode}
% Otherwise, get the current outer kerning and adjust it, for left and right
% side (\microtype\ only).
%    \begin{macrocode}
%<*pdf-|lua-|xe->
    \else
      \MT@outer@kern=\expandafter\expandafter\expandafter\@firstoftwo
                      \csname MT@outer@kern\expandafter\string\font@name\endcsname\relax
      \ifdim\MT@outer@kern=\z@\else \MT@ls@outer@k \fi
      \MT@outer@kern=\expandafter\expandafter\expandafter\@secondoftwo
                      \csname MT@outer@kern\expandafter\string\font@name\endcsname\relax
%</pdf-|lua-|xe->
%<*letterspace>
      \xdef\MT@set@curr@ok{\MT@outer@kern=\the\MT@outer@kern\relax}%
      \MT@afteraftergroup{%
        \MT@set@curr@ok
        \noexpand\MT@ls@outer@k
      }%
%</letterspace>
    \fi
%<*pdf-|lua-|xe->
%    \end{macrocode}
%\begin{macro}{\MT@set@curr@ok}
% Carry the outer kerning amount to outside the next group, then set outer
% spacing (which will set kerning, if no space follows).
%    \begin{macrocode}
    \xdef\MT@set@curr@ok{\MT@outer@kern=\the\MT@outer@kern\relax}%
%    \end{macrocode}
%\end{macro}
% Stuff to be done after the letterspace group. The \letterspace\ package
% only adjusts the kerning.
%    \begin{macrocode}
    \MT@afteraftergroup{%
      \MT@set@curr@os
      \MT@set@curr@ok
      \noexpand\MT@tr@outer@r
    }%
%</pdf-|lua-|xe->
  \fi
%<pdf->  }%
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@afteraftergroup}
% This helper macro carries stuff outside of the current group to the end of
% the next group, but will then respect grouping, which is crucial for nested
% letterspacing. (Following an idea of Will Robertson.)^^A https://tex.stackexchange.com/a/56319
%\changes{v2.5a}{2013/05/15}{fix: get outer kerning and spacing of nested letterspacing right}
%    \begin{macrocode}
\def\MT@afteraftergroup#1{%
%<!letterspace>  \MT@maybe@gobble@with@tikz{%
    \MT@ifdefined@n@TF{MT@aftergroup@\number\currentgrouplevel}\relax{%
      \MT@exp@cs\xdef{MT@aftergroup@\number\currentgrouplevel}%
        {\MT@exp@cs\MT@glet{MT@aftergroup@\number\currentgrouplevel}\noexpand\@undefined#1}%
      \expandafter\aftergroup\expandafter\aftergroup\MT@exp@cs\aftergroup
        {MT@aftergroup@\number\currentgrouplevel}%
    }%
%<!letterspace>  }%
}
%</pdf-|lua-|xe-|letterspace>
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@ls@fontspec@font}
% Add the |kernfactor| feature to a font loaded by \pkg{fontspec}
%\changes{v2.6a}{2016/05/03}{fix for value of \textpm1000}
%\changes{v2.7}{2017/02/10}{fix for `\texttt{file:}\meta{font}' spec
%                           (reported by \contributor Reinhard Kotucha <reinhard.kotucha\at web.de>)}^^A
%                            ^^A http://tug.org/pipermail/lualatex-dev/2017-February/001670.html
%\changes{v3.0}{2021/03/19}{use \texttt{lua} to parse font spec\slash fix for font spec containing spaces
%                           (reported by \contributor Aman Mehra <reportaman\at gmail.com>)}^^A
%                            ^^A https://tex.stackexchange.com/questions/567698/luatex-microtype-fontspec-luaotfload-buggy-interaction-canceling-each-others-s
%\changes{v3.2}{2024/05/03}{fix for spaces in font names, made necessary because \pkg{fontspec} v2.9b no longer strips them
%                           (reported by \contributor Bernhard Fisseni <@\at @>)
%                           \githubissue{35}}^^A
%                           ^^A cf. https://github.com/latex3/fontspec/commit/b3f91feab5519d1a04db4b63adfc397e3e81a742
% (after possibly removing a leftover |kernfactor| spec).
%\changes{v3.2a}{2025/02/10}{remove \texttt{kernfactor} from font spec
%                            (reported by \contributor Clea F. Rees <@\at @>) \githubissue{47}}
%    \begin{macrocode}
%<*lua-|letterspace>
\def\MT@ls@fontspec@font{%
  \MT@lua{microtype.add_ls([[\MT@letterspace@]],[[\MT@tr@features]])}%
}
%</lua-|letterspace>
%<*xe->
\def\MT@ls@fontspec@font{\MT@exp@two@c\MT@ls@fontspec@font@\fontname\font@name\MT@nil}
\def\MT@ls@fontspec@font@"#1"#2\MT@nil{\MT@ls@fontspec@font@@#1::\MT@nil#2}
\def\MT@ls@fontspec@font@@#1:#2:#3\MT@nil{%
  "#1:#2letterspace=\strip@pt\dimexpr\MT@letterspace@ pt/10\relax
  ;\MT@tr@features"%
}
%</xe->
%<*luafile>
local function add_ls(k,feat)
  local f = tex.fontname(font.current())
  local spec,size = match(f,'^(.+)( at .+)$')
  if not spec then spec = f end
  spec = gsub(spec,"kernfactor=[-]?%d+%.%d+;","")
  local q = match(spec,'^"') or ""
  local a,b,c = match(spec,'^'..q..'([^:]+):?([^:]*):?(.*)'..q..'$')
  local ls = "kernfactor=" .. k/1000 .. ';'
  microtype.sprint(q..a..':')
  if (a == "name" or a == "file") then
    microtype.sprint(b..':'..ls..c..feat..q)
  else
    microtype.sprint(ls..b..feat..q)
  end
  if size then
    microtype.sprint(size)
  end
end
microtype.add_ls = add_ls

%</luafile>
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@get@tr@opt}
% Various settings (only for the \microtype\ version).
%    \begin{macrocode}
%<*pdf-|lua-|xe->
\def\MT@get@tr@opt{%
  \MT@set@listname
  \let\MT@tr@factor@\@m
%    \end{macrocode}
%\begin{macro}{\MT@tr@unit@}
% Different unit (for |letterspace| and/or |(outer)spacing|)?
%\changes{v2.8}{2020/11/22}{fix: allow unit regardless whether letterspacing is set}
%    \begin{macrocode}
  \MT@ifdefined@n@T{MT@tr@c@\MT@tr@c@name @unit}{%
    \MT@let@cn\MT@tr@unit@{MT@tr@c@\MT@tr@c@name @unit}%
    \ifdim\MT@tr@unit@=1em
      \let\MT@tr@unit@\@undefined
    \else
      \MT@get@unit\MT@tr@unit@
    \fi
  }%
  \MT@ifdefined@n@T{MT@tr@c@\MT@tr@c@name}{%
    \MT@let@cn\MT@letterspace{MT@tr@c@\MT@tr@c@name}%
    \MT@ifdefined@c@T\MT@tr@unit@{%
      \let\@tempb\MT@letterspace
      \MT@scale@to@em
      \edef\MT@letterspace{\number\@tempcntb}%
    }%
  }%
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@tr@ispace}
%\begin{macro}{\MT@tr@ospace}
% Adjust interword spacing.
%    \begin{macrocode}
  \MT@get@tr@opt@{spacing}     {ispace}%
  \MT@get@tr@opt@{outerspacing}{ospace}%
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\begin{macro}{\MT@tr@okern}
% Adjust outer kerning.
%    \begin{macrocode}
  \MT@get@tr@opt@{outerkerning}{okern}%
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@tr@ligatures}
% Which ligatures should we disable (empty means all, undefined none)?
%    \begin{macrocode}
  \MT@get@tr@opt@{noligatures} {ligatures}%
%<lua-|xe->  \MT@get@tr@opt@{features}    {feat}%
}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\begin{macro}{\MT@get@tr@opt@}
%    \begin{macrocode}
\def\MT@get@tr@opt@#1#2{%
  \MT@ifdefined@n@T{MT@tr@c@\MT@tr@c@name @#1}%
    {\MT@let@nn{MT@tr@#2}{MT@tr@c@\MT@tr@c@name @#1}}%
}
%</pdf-|lua-|xe->
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@tr@set@features}
% With \luatex\ or \xetex, Ligatures features may be switched
% on or off.
%    \begin{macrocode}
%<*lua-|xe->
\def\MT@tr@set@features{%
  \MT@map@clist@c\MT@tr@feat{%
    \MT@ifempty{##1}\relax{%
      \MT@if@false
      \lowercase{\edef\@tempa{##1}}%
      \MT@map@tlist@n{{{required}     {rlig}}
                      {{common}       {liga}}
                      {{contextual}   {clig}}
                      {{rare}         {dlig}}
                      {{discretionary}{dlig}}
                      {{historic}     {hlig}}
%<lua->                      {{tex}          {tlig}}
                     }\MT@tr@set@feature@
      \ifMT@if@\else
%<*xe->
        \MT@ifstreq{\@tempa}{tex}{%
          \MT@xadd\MT@tr@features{mapping=tex-text;}%
        }{%
          \MT@ifstreq{\@tempa}{texoff}{%
            \MT@xadd\MT@tr@features{mapping=;}%
          }{%
            \MT@ifstreq{\@tempa}{notex}{%
              \MT@xadd\MT@tr@features{mapping=;}%
            }{%
%</xe->
              \MT@ifstreq{\@tempa}{resetall}{%
                \MT@xadd\MT@tr@features{+dlig;-dlig;+rlig;-rlig;+liga;-liga;+clig;-clig;+hlig;-hlig;%
%<lua->                                        +tlig,-tlig;%
%<xe->                                        mapping=tex-text;%
                                       }%
              }{%
                \MT@warning@nl{Unknown Ligatures feature `##1' in \MT@curr@list@name.
                               Ignoring it}%
              }%
%<xe->        }}}%
      \fi
    }%
  }%
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@tr@set@feature@}
%\begin{macro}{\MT@tr@set@feature@@}
%    \begin{macrocode}
\def\MT@tr@set@feature@#1{%
  \MT@tr@set@feature@@#1%
}
\def\MT@tr@set@feature@@#1#2{%
  \MT@ifstreq\@tempa{#1}{%
    \MT@tr@set@feature@@@{+#2}%
  }{%
    \MT@ifstreq\@tempa{#1off}{%
      \MT@tr@set@feature@@@{-#2}%
    }{%
      \MT@ifstreq\@tempa{no#1}{%
        \MT@tr@set@feature@@@{-#2}%
      }{%
        \MT@ifstreq\@tempa{#1reset}{%
          \MT@tr@set@feature@@@{+#2;-#2}%
        }\relax
      }%
    }%
  }%
}
\def\MT@tr@set@feature@@@#1{%
  \MT@xadd\MT@tr@features{#1;}%
  \MT@if@true
  \MT@tlist@break
}
%</lua-|xe->
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\begin{macro}{\MT@set@lsfont}
% Redefine \cmd\font@name, which will be called a second later (in
% \cmd\selectfont).
%    \begin{macrocode}
%<*pdf-|lua-|xe-|letterspace>
%<plain>\MT@requires@latex2{
\def\MT@set@lsfont{\MT@exp@two@c\let\font@name\MT@lsfont}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\lsstyle}
%\changes{v2.0}{2005/09/21}{new command: letterspacing} ^^A (beta:1)
%\changes{v2.0}{2006/09/19}{fix: font switches don't pose a problem anymore} ^^A (beta:8)
%\changes{v2.0}{2006/09/21}{fix: letterspacing commands may be nested} ^^A (beta:8)
%\changes{v2.0}{2006/12/28}{totally redone, using the new \cmd\letterspacefont}
%\changes{v2.3d}{2008/11/16}{make invalid in math mode}
%\changes{v2.3d}{2009/01/07}{disable for \luatex}
% Disable the tests whether the font should be letterspaced, then trigger the
% setup.
% Only \cs{textls} can be used in math mode (\cs{lsstyle} may be used inside
% another text switch, of course).
%\changes{v2.5}{2012/11/14}{fix: ensure to set up math fonts (reported by \contributor RazorXsr <@\at @>)}
%                           ^^A https://tex.stackexchange.com/questions/82686/settracking-in-the-math-environment
%\changes{v2.6}{2014/09/07}{fix: ensure to set up math fonts (reported by \contributor kleenstar <@\at @>)}
%                           ^^A https://tex.stackexchange.com/questions/187655/microtype-gives-wrong-letterspacing-in-math-mode
% Still, we have to ensure that math fonts are set up again.
%\changes{v2.7}{2016/08/03}{fix: prevent infinite loop with \pkg{psnfss} and \pkg{exscale} packages
%                            (reported by \contributor user11126 <@\at @>,
%                             solution by \contributor Ulrike Fischer <fischer\at troubleshooting-tex.de>)}
%                           ^^A https://tex.stackexchange.com/questions/316231/microtype-and-exscale-crashing-in-texlive-2016#comment771828_316252
% Setting \cmd\glb@currsize\ globally to \cmd\@empty\ (our previous solution) could
% throw us into an infinite loop (\eg, with the \pkg{psnfss} packages,
% via \cmd\every@math@size), so we issue \cmd\glb@settings\ instead.
%\changes{v2.8}{2020/05/26}{fix: enforce math setup, again}
% However, in certain situations, we may still miss some math fonts, so
% let's try to also enforce it by emptying \cmd\glb@currsize, fingers crossed.
% The overhead seems small.
%    \begin{macrocode}
\DeclareRobustCommand\lsstyle{%
  \not@math@alphabet\lsstyle\textls
  \let\glb@currsize\@empty
%<pdf-|lua-|xe->  \MT@maybe@gobble@with@tikz{\aftergroup\glb@settings}%
%<pdf-|lua-|xe->  \def\MT@feat{tr}%
  \let\MT@tracking\MT@set@tr@codes
  \selectfont
}
%    \end{macrocode}
% Now the definitions for the \letterspace\ package with plain \TeX.
%    \begin{macrocode}
%<*plain>
}{
\def\MT@set@lsfont{\MT@lsfont}
\def\lsstyle{%
  \begingroup
  \escapechar\m@ne
  \xdef\font@name{\csname\expandafter\string\the\font\endcsname}%
  \MT@set@tr@codes
  \endgroup
}
\let\textls\@undefined
\let\lslig\@undefined
}
%</plain>
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\lslig}
%\changes{v2.1}{2007/01/17}{new command: protect ligatures in letterspaced text}
%\changes{v2.2}{2007/02/25}{always defined}
%\changes{v2.3}{2007/11/03}{redone: extract outer kerns from current letterspacing
%                           amount}
% For Fraktur fonts, some ligatures shouldn't be broken up. This command will
% temporarily select the base font (making sure to really select the current font)
%\changes{v3.0d}{2022/03/01}{define \cmd\font@name\
%                            (reported by \contributor Ulrike Fischer <fischer\at troubleshooting-tex.de>)
%                            \githubissue{12}}
% and insert the correct kerning.
%    \begin{macrocode}
\DeclareRobustCommand\lslig[1]{%
  {\MT@ifdefined@c@TF\MT@curr@ls{%
     \escapechar\m@ne
%<plain>    \MT@requires@latex2{%
     \xdef\font@name{\csname\curr@fontshape/\f@size\endcsname}%
%<plain>    }\relax%
     \MT@get@ls@basefont
     \MT@outer@kern=\dimexpr\MT@curr@ls sp * \fontdimen6\font@name/2000\relax
     \kern\MT@outer@kern
     \font@name #1%
     \kern\MT@outer@kern
  }{#1}}%
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@ls@basefont}
%\begin{macro}{\MT@get@ls@basefont}
%\changes{v2.1}{2007/01/19}{redone: use \cmd\pdfmatch\ to make it bullet-proof}
% \pdftex\ cannot letterspace fonts that already are letterspaced. Therefore,
% we have to save the base font in |\|\meta{font name}|@base|.
%
%\changes{v2.2}{2007/02/18}{fix again: remember base font in a macro}
% The previous solution (checking the macro's meaning with \cmd\pdfmatch),
% where we were loading the base font via the \cmd\font\ primitive again,
% would destroy all previously set up micro-typographic features of the font.
%    \begin{macrocode}
\def\MT@get@ls@basefont{%
  \xdef\MT@ls@basefont{\csname\expandafter\string\font@name @base\endcsname}%
  \expandafter\ifx\MT@ls@basefont\relax
    \MT@exp@two@c\MT@glet\MT@ls@basefont\font@name
  \else
%<debug>\MT@dinfo@nl{1}{... fixing base font}%
    \MT@set@lsbasefont
  \fi
}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\begin{macro}{\MT@set@lsbasefont}
%\begin{macro}{\MT@set@tr@zero}
%\changes{v2.3d}{2009/03/05}{fix: allow switching off tracking
%                            (reported by \contributor Ulrich Dirr <ud\at mucschach.de>)}
%                                                          ^^A private mail, 2009/02/22
% If tracking is switched off in the middle of the document, or if \cs{textls}
% is called with a zero letterspacing amount, we have to retrieve the base font
% and select it.
%    \begin{macrocode}
\def\MT@set@lsbasefont{\MT@exp@two@c\let\font@name\MT@ls@basefont}
\def\MT@set@tr@zero{%
%<debug>\MT@dinfo@nl{1}{... zero tracking}%
  \xdef\MT@ls@basefont{\csname\expandafter\string\font@name @base\endcsname}%
  \expandafter\ifx\MT@ls@basefont\relax \else
%<debug>\MT@dinfo@nl{1}{... fixing base font}%
    \aftergroup\MT@set@lsbasefont
  \fi
}
%</pdf-|lua-|xe-|letterspace>
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\begin{macro}{\MT@tr@noligatures}
% Since an empty value is somewhat ambiguous, we also allow the values
% `|all|' and `|none|'.
%\changes{v3.2}{2024/04/03}{new values `\texttt{none}' and `\texttt{all}'
%                           for the `\texttt{no ligatures}' key in
%                           \cs{SetTracking} (after a report by \contributor user202729 <@\at @>)}
%                           ^^A https://tex.stackexchange.com/questions/709456/ligatures-are-not-preserved-by-textls-letter-spacing/
% \pdftex\ 1.40.0--1.40.3 disabled all ligatures in letterspaced fonts.
%    \begin{macrocode}
%<*pdf-|lua-|xe->
%<pdf->\MT@requires@pdftex7{
%<*pdf-|lua->
  \def\MT@tr@noligatures{%
    \ifx\MT@tr@ligatures\@empty
      \MT@noligatures@\MT@lsfont\@undefined
    \else
      \MT@ifstreq\MT@tr@ligatures{all}{%
        \MT@noligatures@\MT@lsfont\@undefined
      }{%
        \MT@ifstreq\MT@tr@ligatures{none}\relax{%
          \MT@noligatures@\MT@lsfont\MT@tr@ligatures
        }%
      }%
    \fi
  }
%</pdf-|lua->
%<*pdf-|xe->
%<pdf->}{
  \def\MT@tr@noligatures{%
    \MT@ifstreq\MT@tr@ligatures{all}\relax{%
      \MT@warning@nl{%
        Disabling (selected) ligatures is
%<pdf->        possible since\MessageBreak pdftex 1.40.4.
%<pdf->        Disabling all ligatures instead%
%<xe->        not possible with\MessageBreak xetex.
%<xe->        Ignoring `no ligatures' key in \MT@curr@list@name
      }%
      \MT@glet\MT@tr@noligatures\relax
    }%
  }
%<pdf->}
%</pdf-|xe->
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@outer@space}
% A new skip for outer spacing.
%    \begin{macrocode}
\newskip\MT@outer@space
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@tr@set@space}
% Adjust interword spacing (\fontdim2,3,4) for inner and outer space.
% For inner spacing, the font dimensions will be adjusted, the settings for
% outer spacing will be remembered in a macro.
%\todo{don't add stretch components if \pkg{ragged2e} is active?} ^^A reported by \contributor Leo ? <sdl.web\at gmail.com>, MID: <wqlfwxsuo6h.fsf@pip.srcf.ucam.org>
%^^A or in fact, shouldn't we test whether \spaceskip<>0pt ?
%    \begin{macrocode}
\def\MT@tr@set@space#1,#2,#3,#4,#5,#6,{%
%<debug>\MT@dinfo@nl2{... orig. space: \the\fontdimen2\MT@lsfont,
%<debug>    \the\fontdimen3\MT@lsfont, \the\fontdimen4\MT@lsfont
%<debug>    \MessageBreak... (#1,#2,#3) (#4,#5,#6)}%
  \let\MT@temp\@empty
  \MT@tr@set@space@{#1}{#4}{2}\@empty
  \MT@tr@set@space@{#2}{#5}{3}\@plus
  \MT@tr@set@space@{#3}{#6}{4}\@minus
  \MT@glet@nc{MT@outer@space\expandafter\string\font@name}\MT@temp
%<debug>\MT@dinfo@nl2{... inner space: \the\fontdimen2\MT@lsfont,
%<debug>    \the\fontdimen3\MT@lsfont, \the\fontdimen4\MT@lsfont}%
%<debug>\MT@dinfo@nl2{... outer space: \MT@temp}%
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@tr@set@space@}
% If settings for outer spacing \meta{\#2} don't exist, they will be inherited
% from the inner spacing settings \meta{\#1}.
%\changes{v2.8}{2020/11/24}{simplified}
%    \begin{macrocode}
\def\MT@tr@set@space@#1#2#3#4{%
  \MT@ifempty{#2}{%
    \MT@ifempty{#1}\relax{%
      \MT@tr@set@space@@{#1}{#3}{1000}%
      \fontdimen#3\MT@lsfont=\@tempdima
    }%
    \edef\MT@temp{\MT@temp#4\the\fontdimen#3\MT@lsfont}%
  }{%
    \MT@tr@set@space@@{#2}{#3}{2000}%
    \edef\MT@temp{\MT@temp#4\the\@tempdima}%
    \MT@ifempty{#1}\relax{%
      \MT@tr@set@space@@{#1}{#3}{1000}%
      \fontdimen#3\MT@lsfont=\@tempdima
    }%
  }%
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@tr@set@space@@}
% If the value is followed by an asterisk, the fontdimen will be scaled by the
% respective amount, otherwise the value denotes the desired dimension in the
% respective unit.
%    \begin{macrocode}
\def\MT@tr@set@space@@#1#2#3{%
  \MT@test@ast#1*\@nil{%
    \MT@ifdefined@c@TF\MT@tr@unit@
      {\edef\@tempb{#1}\MT@scale@to@em}
      {\@tempcntb=#1\relax}%
    \@tempdima=\dimexpr\@tempcntb sp*\MT@dimen@six/1000\relax
%    \end{macrocode}
% For \fontdim2, we also have to subtract the kerning that letterspacing adds
% to each side of the characters (only half if it's for outer spacing).
%\changes{v3.2}{2024/05/15}{fix for \luatex\ and \xetex}
% This is necessary only for legacy fonts.
%    \begin{macrocode}
%<*pdf-|lua->
    \ifnum#2=\tw@
%<lua->    \MT@if@opentype@font\relax{%
      \advance\@tempdima -\dimexpr\MT@letterspace@ sp*\MT@dimen@six/#3\relax
%<lua->   }%
    \fi
%</pdf-|lua->
  }{%
    \MT@ifempty\@tempa{\let\@tempa\MT@letterspace@}\relax
    \@tempdima=\dimexpr \numexpr1000+\@tempa sp *\fontdimen#2\MT@lsfont/1000\relax
  }%
%<debug>\MT@dinfo@nl3{... : font dimen #2 (#1): \the\@tempdima}%
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@tr@outer@l}
% Recall the last skip (must really be an interword space, not just a marker,
%\changes{v2.3}{2007/10/23}{only change pre outer space if it contains shrink}
% nor a `hard' space, \ie, one that doesn't contain stretch or shrink parts).
%\changes{v2.3b}{2008/05/12}{fix: only in horizontal mode}
%    \begin{macrocode}
\def\MT@tr@outer@l{%
  \ifhmode
    \ifdim\lastskip>5sp
      \edef\x{\the\lastskip minus 0pt}%
      \setbox\z@\hbox{\MT@outer@space=\x}%
      \ifdim\wd\z@>\z@
%<debug>\MT@dinfo2{[[[ adjusting pre space: \the\MT@outer@space}%
        \unskip \hskip\MT@outer@space\relax
%    \end{macrocode}
% Disable left outer kerning.
%    \begin{macrocode}
        \let\MT@ls@outer@k\relax
      \else
%    \end{macrocode}
%\changes{v2.3b}{2008/05/18}{make \cmd\spaceskip-aware (\pkg{ragged2e})}
% The \pkg{ragged2e} package sets \cmd\spaceskip\ without glue.
%    \begin{macrocode}
        \ifdim\lastskip=%
            \ifnum\spacefactor<2000
              \spaceskip
            \else
              \ifdim\xspaceskip=\z@
                \dimexpr\spaceskip+\fontdimen7\font@name\relax
              \else
                \xspaceskip
              \fi
            \fi
%<debug>\MT@dinfo2{[[[ adjusting pre space (skip): \the\MT@outer@space}%
          \unskip \hskip\MT@outer@space\relax
          \let\MT@ls@outer@k\relax
        \fi
      \fi
    \fi
  \fi
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@tr@outer@next}
%\begin{macro}{\MT@tr@outer@r}
% \microtype\ also adjusts spacing.
% The following is borrowed from \pkg{soul}. I've added the cases for italic
% correction, since tracking may also be triggered by text commands (\eg,
% \cmd\textsc).
%    \begin{macrocode}
\def\MT@tr@outer@r{%
  \futurelet\MT@tr@outer@next\MT@tr@outer@r@
}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\begin{macro}{\MT@if@outer@next}
% We avoid using \orig@cs{ifx} tests, in case \cs{MT@tr@outer@next} is \cmd\let\ to
% \orig@cs{fi} etc.
%\changes{v2.5}{2012/02/20}{fix: conflict with \pkg{amsmath}
%                           (reported by \contributor Scott Pakin <scott\at pakin.org>)}
%                            ^^A private mail, 2012/02/09
%                            ^^A (beta:09)
%    \begin{macrocode}
\def\MT@if@outer@next#1{%
  \ifx\MT@tr@outer@next#1\expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@tr@outer@r@}
%    \begin{macrocode}
\def\MT@tr@outer@r@{%
  \def\MT@temp*{}%
%    \end{macrocode}
% Don't adjust in math mode.
%\changes{v2.3d}{2008/11/16}{fix: don't adjust in math mode
%                            (reported by \contributor Christoph Bier <christoph.bier\at web.de>)}
%                                                   ^^A MID: <6oapk7F2lvo6U1@mid.individual.net>
% There was a tricky bug when \cs{textls} was the last command in a
% \cmd\mathchoice\ group.
%    \begin{macrocode}
  \ifmmode \else
%    \end{macrocode}
% A similar bug occurred when adjustment would happen inside a discretionary
% group, which we prevent here.
%\changes{v2.3d}{2009/02/08}{fix: don't adjust inside discretionary
%                            (reported by \contributor Maverick Woo <maverick\at cs.cmu.edu>)}
%                                                  ^^A private mail, 2009/02/07
% This only works with \etex\ (which we know is available).
%\changes{v2.3b}{2008/05/18}{additional test for horizontal mode}
%    \begin{macrocode}
    \ifnum\currentgrouptype=10 \else
      \def\MT@temp*##1{\ifhmode\hskip\MT@outer@space
%<debug>\MT@dinfo2{]]] adjusting post space (1): \the\MT@outer@space}%
        \fi}%
      \expandafter\ifcat\expandafter\noexpand\csname MT@tr@outer@next\endcsname\egroup
%    \end{macrocode}
%\changes{v2.3c}{2008/09/18}{additional test for horizontal mode
%                            (reported by \contributor Sveinung Heggen <sveinung.heggen\at orkla.no>)}
%                                                                       ^^A private mail, 2008/09/18
%    \begin{macrocode}
        \ifhmode\unkern\fi\egroup
        \MT@set@curr@ok \MT@set@curr@os
        \def\MT@temp*{\afterassignment\MT@tr@outer@r\let\MT@temp=}%
      \else
%    \end{macrocode}
% If the next token is \cmd\maybe@ic\ (from an enclosing text command), we
% gobble it, read the next one, feed it to \cmd\maybe@ic@\ (via
% \cs{MT@tr@outer@icr}) and then call ourselves again.
%\changes{v2.3d}{2009/02/25}{don't use \cmd\x\
%                            (reported by \contributor Ulrich Dirr <ud\at mucschach.de>)}
%                                 ^^A private mail, 2009/02/22
%\changes{v2.3e}{2009/05/29}{fix: set current kerning and spacing again
%                            (found by \contributor Lars R\"onnb\"ack <lars.ronnback\at affecto.com>)}
%                                 ^^A <http://code.google.com/p/tufte-latex/issues/detail?id=25>
%    \begin{macrocode}
        \MT@if@outer@next\maybe@ic{%
          \MT@set@curr@ok \MT@set@curr@os
          \def\MT@temp*{\afterassignment\MT@tr@outer@icr\let\MT@temp=}%
        }{%
%    \end{macrocode}
% If the next token is \cmd\check@icr\ (from an inner text command), we insert
% ourselves just before it. This will then call \cmd\maybe@ic\ again the next
% round (which however will always insert an italic correction, since it
% doesn't read beyond our group).
%    \begin{macrocode}
          \MT@if@outer@next\check@icr{%
            \def\MT@temp*{\aftergroup\MT@tr@outer@r\check@icr\let\MT@temp=}%
          }{%
            \MT@if@outer@next\@sptoken{%
              \def\MT@temp* {\ifhmode\hskip\MT@outer@space
%<debug>\MT@dinfo2{]]] adjusting post space (2): \the\MT@outer@space}%
                \fi}%
            }{%
              \MT@if@outer@next~{%
                \def\MT@temp*~{\nobreak\hskip\MT@outer@space
%<debug>\MT@dinfo2{]]] adjusting post space (3): \the\MT@outer@space}%
                  }%
              }{%
                \MT@if@outer@next\ \relax{%
                  \MT@if@outer@next\space\relax{%
                    \MT@if@outer@next\@xobeysp\relax{%
%    \end{macrocode}
% \pkg{xspace} requires special treatment.
%    \begin{macrocode}
                      \MT@if@outer@next\xspace{%
                        \def\MT@temp*\xspace{\MT@xspace}%
                      }{%
%    \end{macrocode}
% If there's no outer spacing, there may be outer kerning.
%    \begin{macrocode}
                        \def\MT@temp*{\ifdim\MT@outer@kern=\z@\else\MT@ls@outer@k
%<debug>\MT@dinfo2{--- adjusting post kern: \the\MT@outer@kern}%
                          \fi}%
                        \MT@let@nc{MT@tr@outer@next}\relax
      }}}}}}}}\fi
  \fi\fi
  \MT@temp*%
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@tr@outer@icr}
%\begin{macro}{\MT@tr@outer@icr@}
% Helper macros for the italic correction mess.
%    \begin{macrocode}
\def\MT@tr@outer@icr{\afterassignment\MT@tr@outer@icr@\MT@tr@outer@r}
\def\MT@tr@outer@icr@{%
  \let\@let@token= \MT@tr@outer@next
  \maybe@ic@
}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\begin{macro}{\MT@xspace}
%\changes{v2.5a}{2013/05/15}{fix \texttt{outer spacing} problem with \pkg{xspace}
%                            (reported by \contributor Dave <@\at @>)}
%                            ^^A https://tex.stackexchange.com/questions/59655
%\changes{v2.6}{2014/11/22}{fix \texttt{outer spacing} problem with (not only) \pkg{algorithm}
%                           (reported by \contributor Henning <@\at @>
%                            and \contributor Ronnie Marksch <Ronnie.Marksch\at yahoo.de>)}
%                            ^^A https://tex.stackexchange.com/questions/213164
%                            ^^A MID: <mk1sqc$jve$1@speranza.aioe.org>
%\begin{macro}{\MT@xspace@}
% If the group is followed by \cmd\xspace, we first feed \cmd\xspace\ with the
% next token, then check whether it has inserted a space.
% \cmd\@let@token\ might be something evil, so it should be encapsulated here.
%    \begin{macrocode}
\def\MT@xspace{\futurelet\@let@token\MT@xspace@}
\def\MT@xspace@{\@xspace@firsttrue\@xspace
  \ifdim\lastskip>5sp
    \unskip \hskip\MT@outer@space
  \else
    \ifdim\MT@outer@kern=\z@\else\MT@ls@outer@k \fi
  \fi
}
%    \end{macrocode}
%\end{macro}
%\end{macro}
% For older \pdftex\ versions and \luatex, throw an error.
%    \begin{macrocode}
%<*pdf-|lua->
}{
  \DeclareRobustCommand\lsstyle{%
    \MT@error{Letterspacing only works with \MT@engine tex version
%<pdf->      1.40%
%<lua->      0.62%
      \MessageBreak or newer}
      {Upgrade \MT@engine tex, or try the `soul' package instead.}%
    \MT@glet\lsstyle\relax
  }
}
%</pdf-|lua->
%</pdf-|lua-|xe->
%    \end{macrocode}
%\begin{macro}{\textls}
%\changes{v2.0}{2005/09/21}{new command: letterspacing} ^^A (beta:1)
%\changes{v2.0}{2006/12/28}{starred version: remove spaces around text}
%\changes{v2.1}{2007/01/19}{fix: use \cmd\hmode@bgroup}
%\changes{v2.3d}{2008/11/16}{make math mode aware}
%\begin{macro}{\MT@ls@adjust@}
% This command may be used like the other text commands.
% The starred version removes kerning on the sides.
% The optional argument changes the letterspacing factor.
%    \begin{macrocode}
%<*package|letterspace>
\DeclareRobustCommand\textls{%
  \@ifstar{\let\MT@ls@adjust@\MT@ls@adjust@empty\MT@textls}%
          {\let\MT@ls@adjust@\MT@ls@adjust@relax\MT@textls}%
}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\begin{macro}{\MT@textls}
%\begin{macro}{\MT@letterspace@}
% This is now almost \LaTeX's \cmd\DeclareTextFontCommand, with the difference
% that we adjust the outer spacing and kerning also for \cs{lsstyle}, while
% \LaTeX's text \emph{switches} don't bother about italic correction.
%    \begin{macrocode}
\newcommand\MT@textls[2][]{%
  \ifmmode
    \nfss@text{\MT@ls@set@ls{#1}\lsstyle#2}%
  \else
    \hmode@bgroup
      \MT@ls@set@ls{#1}%
      \lsstyle #2%
      \expandafter
    \egroup
  \fi
}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\begin{macro}{\MT@ls@adjust}
%\begin{macro}{\MT@ls@adjust@empty}
%\begin{macro}{\MT@ls@adjust@relax}
%\begin{macro}{\MT@ls@set@ls}
% Set current letterspacing amount and outer kerning. This has to be done inside
% the same group as the letterspacing command.
%\changes{v2.5}{2010/12/02}{allow formulas in optional argument to \cs{textls}
%                           (fix by \contributor Heiko Oberdiek <heiko.oberdiek\at googlemail.com>)}
%                            ^^A private mail, 2010/12/02
%                            ^^A (beta:05)
%    \begin{macrocode}
\def\MT@ls@adjust@empty{\let\MT@ls@adjust\@empty}
\def\MT@ls@adjust@relax{\let\MT@ls@adjust\relax}
\def\MT@ls@set@ls#1{%
  \MT@ifempty{#1}%
    {\let\MT@letterspace@\@undefined}%
    {\KV@@sp@def\MT@letterspace@{#1}%
     \edef\MT@letterspace@{\number\MT@letterspace@}%
     \MT@ls@too@large\MT@letterspace@}%
  \MT@ls@adjust@
}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\MT@ls@too@large}
% Test whether letterspacing amount is too large.
%    \begin{macrocode}
\def\MT@ls@too@large#1{%
  \ifnum#1>\MT@tr@max
    \MT@warning{Maximum for option `letterspace' is \number\MT@tr@max}%
    \edef#1{\number\MT@tr@max}%
  \else
    \ifnum#1<\MT@tr@min
      \MT@warning{Minimum for option `letterspace' is \number\MT@tr@min}%
      \edef#1{\number\MT@tr@min}%
    \fi
  \fi
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@outer@kern}
%\begin{macro}{\MT@tr@set@okern}
%\changes{v2.3d}{2008/12/19}{allow empty value for \texttt{outer kerning}}
%\changes{v3.2}{2024/05/14}{fix for \luatex\ and \xetex}
% This dimen is used for the starred version of \cs{textls}, for \cs{lslig}
% and for adjusted outer kerning.
%    \begin{macrocode}
\newdimen\MT@outer@kern
%</package|letterspace>
%<*pdf-|lua-|xe->
\def\MT@tr@set@okern#1,#2,{%
  \let\MT@temp\@empty
  \MT@ifempty{#1}{\MT@tr@set@okern@{*}}{\MT@tr@set@okern@{#1}}%
  \MT@ifempty{#2}{\MT@tr@set@okern@{*}}{\MT@tr@set@okern@{#2}}%
  \MT@glet@nc{MT@outer@kern\expandafter\string\font@name}\MT@temp
%<debug>\MT@dinfo@nl2{... outer kerning: (#1,#2)
%<debug>              = \@nameuse{MT@outer@kern\expandafter\string\font@name}}%
}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\begin{macro}{\MT@tr@set@okern@}
%    \begin{macrocode}
\def\MT@tr@set@okern@#1{%
  \MT@test@ast#1*\@nil{%
    \MT@ifdefined@c@TF\MT@tr@unit@
      {\edef\@tempb{#1}\MT@scale@to@em}
      {\@tempcntb=#1\relax}%
    \@tempdima=\dimexpr \@tempcntb sp * \MT@dimen@six/1000\relax
  }{%
    \MT@ifempty\@tempa{\let\@tempa\@m}\relax
    \@tempdima=\dimexpr \numexpr\@tempa*\MT@letterspace@/1000\relax sp
                      * \fontdimen6\MT@lsfont/2000\relax
  }%
%<lua->  \MT@if@opentype@font\relax{%
%<pdf-|lua->  \advance\@tempdima -\dimexpr \MT@letterspace@ sp
%<pdf-|lua->                  * \fontdimen6\MT@lsfont/2000\relax
%<lua->  }%
  \edef\MT@temp{\MT@temp{\the\@tempdima}}%
}
%</pdf-|lua-|xe->
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@ls@outer@k}
% Adjust outer kerning. We additionally add a marker (|\kern3sp\kern-3sp|)
% for cases of nested letterspacing without anything actually printed. ^^A eg. \LaTeX!
%\changes{v2.5a}{2013/05/15}{add marker for tightly nested letterspacing}
%    \begin{macrocode}
%<*pdf-|lua-|xe-|letterspace>
\def\MT@ls@outer@k{%
  \ifhmode
    \ifdim\lastkern=-3sp \unkern
      \ifdim\lastkern=3sp \kern-3sp
        \expandafter\expandafter\expandafter\@gobble
      \else \unkern
        \expandafter\expandafter\expandafter\@firstofone
      \fi
    \else
      \expandafter\@firstofone
    \fi
    {\kern\MT@outer@kern\kern3sp\kern-3sp\relax}%
  \fi
}
%</pdf-|lua-|xe-|letterspace>
%    \end{macrocode}
%\end{macro}
%
%\subsubsection{Disabling ligatures}
%
%\begin{macro}{\MT@noligatures}
% The possibility to disable ligatures is a new features of \pdftex\ 1.30, and
% also works with \luatex.
%\changes{v2.3}{2007/10/23}{fix: set evaluation didn't work (bug introduced in v2.2)}
%\changes{v3.2a}{2024/12/18}{fix: define current feature (reported by \contributor Nick Bart <@\at @>) \githubissue{42}}
%    \begin{macrocode}
%<*pdf-|lua->
%<pdf->\MT@requires@pdftex5{
\def\MT@noligatures{%
  \MT@dotrue
  \let\@tempa\MT@nl@setname
  \def\MT@feat{nl}%
  \MT@map@clist@n{font,encoding,family,series,shape,size}{%
    \MT@ifdefined@n@TF{MT@checklist@##1}%
      {\csname MT@checklist@##1\endcsname}%
      {\MT@checklist@{##1}}%
    {nl}%
  }%
  \ifMT@do
    \MT@noligatures@\MT@font\MT@nl@ligatures
  \fi
}
%    \end{macrocode}
%\begin{macro}{\MT@noligatures@}
% This is also used by \cs{MT@set@tr@codes}.
%    \begin{macrocode}
%<lua->\MT@requires@luatex4{\let\pdfnoligatures\ignoreligaturesinfont}\relax
\def\MT@noligatures@#1#2{%
  \MT@ifdefined@c@TF#2{%
%    \end{macrocode}
% Early MiK\TeX\ versions (before 2.5.2579) didn't know \cmd\tagcode.
%    \begin{macrocode}
    \MT@ifdefined@c@TF\tagcode{%
%    \end{macrocode}
% No `|inputenc|' key.
%\changes{v2.3b}{2008/03/27}{fix: warning messages for unknown slots}
%    \begin{macrocode}
      \let\MT@warn@maybe@inputenc\@empty
      \MT@ifstreq\MT@feat{tr}\relax
        {\def\MT@curr@list@name{\@backslashchar DisableLigatures}}%
      \MT@map@clist@c#2{%
        \MT@ifempty{##1}\relax{%
          \KV@@sp@def\@tempa{##1}\MT@get@slot
          \ifnum\MT@char>\m@ne
            \tagcode#1\MT@char=\m@ne
%    \end{macrocode}
% With \luatex, we additionally register the ligatures that should be inhibited
% in a table (used by the \pkg{luaotfload} function |keepligature|).
%\changes{v2.6}{2016/04/20}{use \pkg{luaotfload} function to keep\slash inhibit ligatures}
%    \begin{macrocode}
%<lua->            \MT@if@opentype@font
%<lua->               {\MT@lua{microtype.noligatures([[#1]],[[\MT@char]])}}\relax
          \fi
        }%
      }%
      \MT@vinfo{... Disabling ligatures for characters: #2}%
    }{%
      \pdfnoligatures#1%
      \MT@warning{Cannot disable selected ligatures (pdftex doesn't\MessageBreak
          know \@backslashchar tagcode). Disabling all ligatures of\MessageBreak
          the font instead}%
    }%
  }{%
    \pdfnoligatures#1%
%<lua->    \MT@if@opentype@font
%<lua->        {\MT@lua{microtype.noligatures([[#1]],"_all_")}}\relax
    \MT@vinfo{... Disabling all ligatures}%
  }%
}
%<pdf->}\relax
%</pdf-|lua->
%    \end{macrocode}
%\end{macro}
%\end{macro}
% For each potential ligature, \pkg{luaotfload} will call the
% |keepligature| function, which expects the first node of the ligature,
% to check whether they should be kept or inhibited.
% Here's our concoction of this function. The table |microtype.ligs| will
% be populated in \cmd\MT@noligatures@.
%\changes{v2.7c}{2019/03/08}{turn warning into info when overwriting the \texttt{keepligature} function
%                            (reported by \contributor Andy N <@\at @>)}
%                            ^^A https://tex.stackexchange.com/questions/478344/
%    \begin{macrocode}
%<*luafile>
microtype.ligs = microtype.ligs or { }

local function noligatures(fontcs,liga)
  local fontcs = match(fontcs,"([^ ]+)")
  microtype.ligs[fontcs] = microtype.ligs[fontcs] or { }
  table.insert(microtype.ligs[fontcs],liga)
end
microtype.noligatures = noligatures

local function keepligature(c)
  local nodedirect = node.direct
  local getfield   = nodedirect.getfield
  local getfont    = nodedirect.getfont
  local f,ch
  if type(c) == "userdata" then -- in older luaotfload versions, c was a node
    f  = c.font
    ch = c.components.char
  else                          -- since 2.6, c is a (direct node) number
    f  = getfont(c)
    ch = getfield(getfield(c,"components"),"char")
  end
--  if ch then -- should always be true
  local ligs = microtype.ligs[match(tex.fontidentifier(f),"\\([^ ]+)")]
  if ligs then
    for _,lig in pairs(ligs) do
      if lig == "_all_" or tonumber(lig) == ch then
        return false
      end
    end
  end
  return true
--  end
end

if luaotfload and luaotfload.letterspace then
  if luaotfload.letterspace.keepligature then
    microtype.info("overwriting function `keepligature'")
  end
  luaotfload.letterspace.keepligature = keepligature
end

%</luafile>
%    \end{macrocode}
%
%\subsubsection{Loading the configuration}\label{ssub:setup-config}
%
%\begin{macro}{\MT@load@list}
% Recurse through the lists to be loaded.
%\changes{v1.3}{2004/10/27}{check whether list exists}
%\todo{load more than one list}
%    \begin{macrocode}
%<*package|show>
%<package>\def\MT@load@list#1%
%<show>\def\MTS@load@list#1%
  {\edef\@tempa{#1}%
  \MT@let@cn\@tempb{MT@\MT@feat @c@\@tempa @load}%
  \MT@ifstreq\@tempa\@tempb{%
    \MT@error{\@nameuse{MT@abbr@\MT@feat} list `\@tempa' cannot load itself}{}%
  }{%
    \ifx\@tempb\relax
%<show>    :\par\medskip\leavevmode
    \else
      \MT@ifdefined@n@TF{MT@\MT@feat @c@\@tempb}{%
%<show>        \MTS@printtext{, loading \texttt{\@tempb}}%
        \MT@vinfo{... : First loading \@nameuse{MT@abbr@\MT@feat} list `\@tempb'}%
        \begingroup
          \MT@load@list\@tempb
        \endgroup
        \edef\MT@curr@list@name{%
%<package>                  \@nameuse{MT@abbr@\MT@feat} list \noexpand\MessageBreak
                  `\@tempb'}%
        \MT@let@cn\@tempc{MT@\MT@feat @c@\@tempb}%
        \expandafter\MT@set@codes\@tempc,\relax,%
%<show>        \vrule width 4cm height .5pt \\
%<show>        \MTS@printtext{End of list \texttt{\MT@curr@list@name}}%
%<show>        \par\medskip\leavevmode
      }{%
        \MT@error{\@nameuse{MT@abbr@\MT@feat} list `\@tempb' undefined.\MessageBreak
                    Cannot load it from list `\@tempa'}{}%
      }%
    \fi
  }%
}
%</package|show>
%    \end{macrocode}
%\end{macro}
%\changes{v1.1}{2004/09/13}{configuration file names in lowercase
%               (suggested by \contributor Harald Harders <h.harders\at tu-bs.de>)}
%                                                    ^^A private mail, 2004/09/13
%\begin{macro}{\MT@find@file}
%\changes{v1.1}{2004/09/14}{fix: also check whether the file for the base
%                           font family has already been loaded}
% Micro-typographic settings may be written into a file |mt-|\meta{font family}|.cfg|.
%\changes{v1.8}{2005/04/16}{no longer wrap names in commands}
%\changes{v3.1}{2023/02/13}{simplify}
%\begin{macro}{\MT@file@list}
% We must also record whether we've already loaded the file.
%    \begin{macrocode}
%<*package>
\let\MT@file@list\@empty
\def\MT@find@file#1{%
%    \end{macrocode}
%\end{macro}
% Check for existence of the file only once.
%    \begin{macrocode}
  \MT@in@clist{#1}\MT@file@list
  \ifMT@inlist@ \else
%    \end{macrocode}
% Don't forget that because reading the files takes place inside a group, all
% commands that may be used there have to be defined globally.
%    \begin{macrocode}
    \MT@begin@catcodes
      \let\MT@begin@catcodes\relax
      \let\MT@end@catcodes\relax
      \MT@xadd\MT@file@list{#1,}%
      \InputIfFileExists{\MT@cfg@prefix-#1.cfg}{%
        \edef\MT@curr@file{\MT@cfg@prefix-#1.cfg}%
        \MT@vinfo{... Loading configuration file \MT@curr@file}%
      }{%
        \MT@get@basefamily#1\@empty\@empty\@empty\@nil
        \MT@exp@one@n\MT@in@clist\@tempa\MT@file@list
        \ifMT@inlist@ \else
          \InputIfFileExists{\MT@cfg@prefix-\@tempa.cfg}{%
            \edef\MT@curr@file{\MT@cfg@prefix-\@tempa.cfg}%
            \MT@vinfo{... Loading configuration file \MT@curr@file}%
            \MT@xadd\MT@file@list{\@tempa,}%
          }{%
            \MT@vinfo{... No configuration file \MT@cfg@prefix-#1.cfg}%
          }%
        \fi
      }%
    \endgroup
  \fi
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@cfg@catcodes}
% We have to make sure that all characters have the correct category code.
% Especially, new lines and spaces should be ignored, since files might be
% loaded in the middle of the document. This is basically \cmd\nfss@catcodes\
% (from the \LaTeX\ kernel). I've added:
%\changes{v1.4a}{2004/11/16}{fix: reset some more catcodes when reading files
%                (reported by \contributor Michael Hoppe <mh\at michael-hoppe.de>)}
%                                 ^^A MID: <p06002000bdbff1f93eb7@[192.168.0.34]>
% |&| (in |tabular|s), |!|, |?|, |;|,
%\changes{v1.7}{2005/02/06}{reset catcode of `\texttt{:}'
%                           (compatibility with \pkg{french}* packages)}
% |:| (|french|), |,|, |$|, |_|, |~|,
%\changes{v1.5}{2004/11/28}{reset catcode of `\texttt{\quotechar=}'
%                           (compatibility with Turkish \pkg{babel})}
% and |=| (Turkish \pkg{babel}).
%
%\changes{v1.8}{2005/03/29}{reset catcodes of the remaining <ASCII> characters}
% OK, now all printable characters up to 127 are `other'. We hope that letters
% are always letters and numbers other. (\pkg{listings} makes them active, see
% section~\ref{ssub:compatibility}.)
%
% We leave |^| at catcode 7, so that stuff like `|^^ff|' remains possible.
%    \begin{macrocode}
\def\MT@cfg@catcodes{%
  \makeatletter
  \catcode`\^7%
  \catcode`\ 9%
  \catcode`\^^I9%
  \catcode`\^^M9%
  \catcode`\\\z@
  \catcode`\{\@ne
  \catcode`\}\tw@
  \catcode`\#6%
  \catcode`\%14%
  \MT@map@tlist@n
    {\!\"\$\&\'\(\)\*\+\,\-\.\/\:\;\<\=\>\?\[\]\_\`\|\~}%
    \@makeother
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@begin@catcodes}
% This will be used before reading the files as well as in all configuration
% commands, so that catcodes are also harmless when these commands are used
% outside the configuration files.
%\changes{v1.7}{2005/02/17}{also use inside configuration commands}
%\changes{v2.3}{2007/11/20}{fix: don't disable \cmd\KV@@sp@def}
%    \begin{macrocode}
\def\MT@begin@catcodes{%
  \begingroup
  \MT@cfg@catcodes
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@end@catcodes}
% End group if outside configuration file (otherwise relax).
%    \begin{macrocode}
\let\MT@end@catcodes\endgroup
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@get@basefamily}
% The family name might have a suffix
%\changes{v1.1}{2004/09/14}{only remove suffixes `\texttt{x}' or `\texttt{j}'}
% \eg, for expert set (|x|), old style numbers (|j|)
%\changes{v1.2}{2004/09/26}{also remove `w' (swash capitals)}
% swash capitals (|w|) etc. We mustn't simply remove the last letter, as this
% would make for instance |cms| out of |cmss| \textit{and} |cmsy| (OK, |cmex|
% will still become |cme|~\dots).
%\changes{v1.4b}{2004/11/25}{fix: failed for font names of the form \texttt{abczz}
%                (reported by \contributor Georg Verweyen <Georg.Verweyen\at WEB.DE>)}
%                                                 ^^A MID: <41A64DC7.7040404@web.de>
%\changes{v2.2}{2007/02/04}{redone, working on font names and suffixes of arbitrary length}
%
% We only work on the font name if it is longer than three characters.
%    \begin{macrocode}
\def\MT@get@basefamily#1#2#3#4\@nil{%
  \ifx\@empty#4%
    \def\@tempa{#1#2#3}%
  \else
    \let\@tempa\@empty
    \edef\@tempb{#1#2#3#4}%
    \expandafter\MT@get@basefamily@\@tempb\@nil
  \fi
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@get@basefamily@}
% This will only remove one suffix (the longest match), so that
% \emph{combinations} of suffixes would have be to added manually (\eg,
% |\DeclareMicrotypeVariants*{aw}|). But otherwise, something like `|pplx|'
% would be truncated to `|p|'.
%    \begin{macrocode}
\def\MT@get@basefamily@#1#2\@nil{%
  \edef\@tempa{\@tempa#1}%
  \ifx\\#2\\\expandafter\@gobble\else\expandafter\@firstofone\fi
  {\MT@in@tlist{#2}\MT@variants
   \ifMT@inlist@\else\MT@get@basefamily@#2\@nil\fi}%
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@listname}
%\begin{macro}{\MT@get@listname}
%\begin{macro}{\MT@get@listname@}
% Try all combinations of font family, series, shape and size to get a list for
% the current font.
%\changes{v1.1}{2004/09/15}{don't check for empty attributes list}
%\changes{v1.2}{2004/09/30}{alternatively check for alias font name}
%\changes{v1.7}{2005/03/15}{use \cmd\@tfor\
%               (\contributor Andreas B\"uhmann <andreas.buehmann\at web.de>'s idea)}
%                                                      ^^A private mail, 2005/03/12
%\changes{v1.8}{2005/04/16}{made recursive}
%    \begin{macrocode}
\def\MT@get@listname#1{%
%<debug>\MT@dinfo@nl{1}{trying to find \@nameuse{MT@abbr@#1} list for font `\MT@@font'}%
  \let\MT@listname\@undefined
  \def\@tempb{#1}%
  \MT@map@tlist@c\MT@try@order\MT@get@listname@
}
\def\MT@get@listname@#1{%
  \expandafter\MT@next@listname#1%
  \ifx\MT@listname\@undefined \else
    \expandafter\MT@tlist@break
  \fi
}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\MT@try@order}
%\changes{v1.7}{2005/03/11}{fix: also check for //\meta{series}/\meta{shape}//
%               (reported by \contributor Andreas B\"uhmann <andreas.buehmann\at web.de>)}
%                                                           ^^A private mail, 2005/03/10
%\changes{v1.7}{2005/03/11}{always check for size, too
%               (suggested by \contributor Andreas B\"uhmann <andreas.buehmann\at web.de>)}
%                                                           ^^A private mail, 2005/03/10
%
%\begin{table}\small
%\caption{Order for matching font attributes}\label{tab:match-order}
%\catcode`\!=13 \let!\match
%\setlength\fboxsep{4pt}
%\leavevmode\kern-\dimexpr\fboxsep+\fboxrule\relax
%\fcolorbox{theframe}{white}{^^A
%\begin{minipage}{\textwidth}
%\def\arraystretch{1.2}
%\begin{tabular}{@{}L{38pt}*{16}{p{19.5pt}<{\centering}@{}}}
%          & 1.& 2.& 3.& 4.& 5.& 6.& 7.& 8.& 9.&10.&11.&12.&13.&14.&15.&16.\\
%\cmidrule(r){2-2}  \cmidrule(r){3-3}  \cmidrule(r){4-4}  \cmidrule(r){5-5}
%\cmidrule(r){6-6}  \cmidrule(r){7-7}  \cmidrule(r){8-8}  \cmidrule(r){9-9}
%\cmidrule(r){10-10}\cmidrule(r){11-11}\cmidrule(r){12-12}\cmidrule(r){13-13}
%\cmidrule(r){14-14}\cmidrule(r){15-15}\cmidrule(r){16-16}\cmidrule   {17-17}
% Encoding & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! \\
% Family   & ! & ! & ! & ! & ! & ! & ! & ! & - & - & - & - & - & - & - & - \\
% Series   & ! & ! & ! & ! & - & - & - & - & ! & ! & ! & ! & - & - & - & - \\
% Shape    & ! & ! & - & - & ! & ! & - & - & ! & ! & - & - & ! & ! & - & - \\
% Size     & ! & - & ! & - & ! & - & ! & - & ! & - & ! & - & ! & - & ! & - \\
%\end{tabular}
%\end{minipage}^^A
%}\kern-\dimexpr\fboxsep+\fboxrule\relax ^^A end \fcolorbox
%\end{table}
%
% Beginning with version 1.7, we always check for the font size. Since the
% matching order has become more logical now, it can be described in words, so
% that we don't need table~\ref{tab:match-order} in the documentation part any
% longer and can cast it off here.
%    \begin{macrocode}
\def\MT@try@order{%
  {1111}{1110}{1101}{1100}{1011}{1010}{1001}{1000}%
  {0111}{0110}{0101}{0100}{0011}{0010}{0001}{0000}%
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@next@listname}
% The current context is added to the font attributes. That is, the context must
% match.
%    \begin{macrocode}
\def\MT@next@listname#1#2#3#4{%
  \ifnum#1=\z@\MT@nofamilytrue\fi
  \edef\@tempa{\MT@encoding
/\ifnum#1=\@ne \MT@family  \fi
/\ifnum#2=\@ne \MT@series  \fi
/\ifnum#3=\@ne \MT@shape   \fi
/\ifnum#4=\@ne *\fi
               \MT@context}%
%<debug>\MT@dinfo@nl{1}{trying \@tempa}%
  \MT@ifdefined@n@TF{MT@\@tempb @\@tempa}{%
    \MT@next@listname@#4%
  }{%
%    \end{macrocode}
% Also try with an alias family.
%    \begin{macrocode}
    \ifnum#1=\@ne
      \ifx\MT@familyalias\@empty \else
        \edef\@tempa{\MT@encoding
                    /\MT@familyalias
      /\ifnum#2=\@ne \MT@series\fi
      /\ifnum#3=\@ne \MT@shape\fi
      /\ifnum#4=\@ne *\fi
                     \MT@context}%
%<debug>\MT@dinfo@nl{1}{(alias) \@tempa}%
        \MT@ifdefined@n@T{MT@\@tempb @\@tempa}{%
          \MT@next@listname@#4%
        }%
      \fi
    \fi
  }%
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@next@listname@}
% If size is to be evaluated, do that, otherwise use the current list.
%    \begin{macrocode}
\def\MT@next@listname@#1{%
  \ifnum#1=\@ne
    \MT@exp@cs\MT@in@rlist{MT@\@tempb @\@tempa @sizes}%
    \ifMT@inlist@
      \let\MT@listname\MT@size@name
    \fi
  \else
    \MT@let@cn\MT@listname{MT@\@tempb @\@tempa}%
  \fi
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@if@list@exists}
%\changes{v1.7}{2005/02/06}{don't define \cs{MT@pr@c@name} etc. \cmd\global ly,
%                           here and elsewhere}
%\begin{macro}{\MT@context}
%    \begin{macrocode}
\def\MT@if@list@exists{%
  \MT@let@cn\MT@context{MT@\MT@feat @context}%
  \MT@ifstreq{@}\MT@context{\let\MT@context\@empty}\relax
  \MT@get@listname{\MT@feat @c}%
  \MT@ifdefined@c@TF\MT@listname{%
    \MT@edef@n{MT@\MT@feat @c@name}{\MT@listname}%
    \ifMT@nonselected
      \MT@vinfo{... Applying non-selected expansion (list `\MT@listname')}%
    \else
      \MT@vinfo{... Loading \@nameuse{MT@abbr@\MT@feat} list `\MT@listname'}%
    \fi
    \@firstoftwo
  }{%
%    \end{macrocode}
% Since the name cannot be \cmd\@empty, this is a sound proof that no matching
% list exists.
%    \begin{macrocode}
    \MT@let@nc{MT@\MT@feat @c@name}\@empty
%    \end{macrocode}
% Don't warn if \opt{selected}|=false|.
%    \begin{macrocode}
    \ifMT@nonselected
      \MT@vinfo{... Applying non-selected expansion (no list)}%
    \else
%    \end{macrocode}
% Tracking doesn't require a list, either.
%    \begin{macrocode}
      \MT@ifstreq\MT@feat{tr}\relax{%
        \MT@warning{I cannot find a \@nameuse{MT@abbr@\MT@feat} list
          for font\MessageBreak`\MT@@font'%
            \ifx\MT@context\@empty\else\space(context: `\MT@context')\fi.
          Switching off\MessageBreak\@nameuse{MT@abbr@\MT@feat} for this font}%
      }%
    \fi
    \@secondoftwo
  }%
}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\begin{macro}{\MT@get@inh@list}
%\changes{v1.6}{2004/12/18}{correct message if \opt{selected} is false}
%\begin{macro}{\MT@context}
% The inheritance lists are global (no context).
%    \begin{macrocode}
\def\MT@get@inh@list{%
  \let\MT@context\@empty
%    \end{macrocode}
%\end{macro}
%    \begin{macrocode}
  \MT@get@listname{\MT@feat @inh}%
  \MT@ifdefined@c@TF\MT@listname{%
    \MT@edef@n{MT@\MT@feat @inh@name}{\MT@listname}%
%<debug>\MT@dinfo@nl{1}{... Using \@nameuse{MT@abbr@\MT@feat} inheritance list
%<debug>                `\MT@listname'}%
    \MT@let@cn\@tempc{MT@\MT@feat @inh@\MT@listname}%
%    \end{macrocode}
% If the list is \cmd\@empty, it has already been parsed.
%\changes{v1.2}{2004/09/26}{fix: set inheritance list \cmd\global ly to \cmd\@empty}
%    \begin{macrocode}
    \ifx\@tempc\@empty \else
%<debug>\MT@dinfo@nl{1}{parsing inheritance list ...}%
%    \end{macrocode}
% The group is only required in case an input encoding is given.
%\changes{v1.9f}{2006/08/03}{fix: input encoding must be set after the inheritance
%                            list has been parsed}
%    \begin{macrocode}
      \begingroup
      \edef\MT@curr@list@name{inheritance list\noexpand\MessageBreak`\MT@listname'}%
      \MT@set@inputenc{inh}%
      \expandafter\MT@inh@do\@tempc,\relax,%
      \MT@glet@nc{MT@\MT@feat @inh@\MT@listname}\@empty
      \endgroup
    \fi
  }{%
    \MT@let@nc{MT@\MT@feat @inh@name}\@undefined
  }%
}
%    \end{macrocode}
%\end{macro}
%
% \subsubsection{Translating characters into slots}
%
%\changes{v1.4}{2004/11/04}{don't use scratch registers in global definitions}
% Get the slot number of the character in the current encoding.
%
%\begin{macro}{\MT@get@slot}
%^^A\changes{v1.2}{2004/09/26}{fix: group must also include \cs{MT@get@composite}}
%\changes{v1.4b}{2004/11/22}{don't define \cs{MT@char} globally (save stack problem)}
%\changes{v1.6a}{2005/01/30}{completely redone, hopefully more robust
%                (compatible with \pkg{frenchpro}; problem reported by
%                 \contributor Bernard Gaulle <gaulle\at idris.fr>)}
%                                     ^^A private mail, 2005/01/28
%\changes{v1.7}{2005/03/21}{remove backslash hack}
% There are lots of possibilities how a character may be specified in the
% configuration files, which makes translating them into slot numbers quite
% expensive. Also, we want to have this as robust as possible, so that the user
% does not have to solve a sphinx's riddle if anything goes wrong.
%
%\begin{macro}{\MT@char}
%\begin{macro}{\MT@char@}
% The character is in \cmd\@tempa, we want its slot number in \cs{MT@char}.
%    \begin{macrocode}
\def\MT@get@slot{%
  \escapechar`\\
  \let\MT@char@\m@ne
  \MT@noresttrue
%    \end{macrocode}
%\end{macro}
%\end{macro}
% Save unexpanded string in case we need to issue a warning message.
%    \begin{macrocode}
  \MT@toks=\expandafter{\@tempa}%
%    \end{macrocode}
%\changes{v1.8}{2005/03/30}{fix: expand active characters}
%\changes{v2.7a}{2018/01/12}{expand active characters earlier}
%  \item It might be an active character, \ie, an 8-bit character defined by
%        \pkg{inputenc}. If so, we will expand it here to its <LICR> form.
%    \begin{macrocode}
  \MT@exp@two@c\MT@is@active\string\@tempa\@nil
%    \end{macrocode}
% Now, let's walk through (hopefully) all possible cases.
%\begin{itemize}
%  \item It's a letter, a character or a number.
%    \begin{macrocode}
  \expandafter\MT@is@letter\@tempa\relax\relax
  \ifnum\MT@char@ < \z@
%    \end{macrocode}
%  \item OK, so it must be a macro. We do not allow random commands but only
%        those defined in \LaTeX's idiosyncratic font encoding scheme:
%
%        If |\|\meta{encoding}|\|\meta{command} (that's \emph{one} command) is
%        defined, we try to extract the slot number.
%\changes{v1.7}{2005/02/27}{test whether \texttt{\string\bslash}\meta{encoding}\texttt{\string\bslash}\meta{...} is defined}
%\changes{v1.8}{2005/04/04}{test whether \texttt{\string\bslash}\meta{encoding}\texttt{\string\bslash}\meta{...} is defined
%                           made more robust}
%
%        We must be cautious not to stumble over accented characters consisting
%        of two commands, like \cmd\`\cmd\i\ or \cmd\U\cmd\CYRI, hence,
%        \cmd\string\ wouldn't be safe enough.
%    \begin{macrocode}
    \MT@ifdefined@n@TF{\MT@encoding\MT@detokenize@c\@tempa}%
      \MT@is@symbol
%    \end{macrocode}
%  \item Now, we'll catch the rest, which hopefully is an accented character
%        (\eg~|\"a|).
%    \begin{macrocode}
      {\expandafter\MT@is@composite\@tempa\relax\relax}%
    \ifnum\MT@char@ < \z@
%    \end{macrocode}
%  \item It could also be a \cmd\chardef ed command (\eg, the percent character).
%        This seems the least likely case, so it's last.
%\changes{v1.7}{2005/03/20}{test for \cmd\chardef ed commands}
%    \begin{macrocode}
      \expandafter\MT@exp@two@c\expandafter\MT@is@char\expandafter
          \meaning\expandafter\@tempa\MT@charstring\relax\relax\relax
    \fi
  \fi
%    \end{macrocode}
%\end{itemize}
%    \begin{macrocode}
  \let\MT@char\MT@char@
  \MT@get@slot@
  \escapechar\m@ne
}
%</package>
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@get@slot@}
%\changes{v2.5}{2010/05/18}{adapt for \xetex}
%    \begin{macrocode}
%<*pdf-|lua-|xe->
\def\MT@get@slot@{%
%    \end{macrocode}
% If it's a legacy (\ie, <TFM>) font, proceed as usual.
%    \begin{macrocode}
%<xe->  \ifnum\XeTeXfonttype\MT@font=\z@
  \ifnum\MT@char > \m@ne
%    \end{macrocode}
% In \luatex, it may also be a glyph name, prefixed with `|/|'.
%\changes{v2.5}{2012/08/14}{adapt for \luatex\ (requested by \contributor Georg Duffner <g.duffner\at gmail.com>)}
%                           ^^A private mail, 2012/07/17
%                           ^^A (beta:10)
%    \begin{macrocode}
%<*lua->
    \ifnum\MT@char=47\relax
      \ifMT@norest \else
        \@tempcnta=\MT@lua{
           local glyph = microtype.name_to_slot([[\expandafter\@gobble\@tempa]],true)
           if glyph then tex.write(glyph)
           else tex.write(-1)
           end
        }\relax
        \ifnum\@tempcnta<\z@
          \MT@warn@unknown
          \let\MT@char\m@ne
        \else
          \edef\MT@char{\the\@tempcnta}%
%<debug>\MT@dinfo@nl{3}{> `\the\MT@toks' is a glyph name (\the\@tempcnta)}%
        \fi
      \fi
    \else
%</lua->
%    \end{macrocode}
% If the user has specified something like `|fi|', or wanted to define a number
% but forgot to use three digits, we'll have something left of the string. In
% this case, we issue a warning and forget the complete string.
%\changes{v2.6}{2016/04/23}{fix: could fail with \xetex\
%                           (reported by \contributor Christopher Schramm <debian\at shakaweb.org>)}
%                           ^^A http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=725395#15
%    \begin{macrocode}
    \ifMT@norest \else
      \MT@warn@rest
%<pdf-|lua->      \let\MT@char\m@ne
%<xe->      \let\MT@char\@empty
    \fi
%<lua->    \fi
  \else
    \MT@warn@unknown
%<xe->    \let\MT@char\@empty
  \fi
%<*xe->
  \else
%    \end{macrocode}
% There are more possibilities for \xetex:
% It may be a Unicode codepoint (prefixed with `|U|') or a glyph name (prefixed with~`|/|').\footnote{
%    This doesn't seem to be documented anywhere, but it has been announced here:
%    \url{https://tug.org/pipermail/xetex/2010-May/016531.html}}
% We indicate glyph names to \cs{MT@get@charwd} by reversing the sign of \cs{MT@char@}.
%    \begin{macrocode}
    \ifnum\MT@char=47\relax
      \ifMT@norest \edef\MT@char{U47}%
      \else
        \@tempcnta=\XeTeXglyphindex"\expandafter\@gobble\@tempa"\relax
        \ifnum\@tempcnta=\z@
          \MT@warn@unknown
          \let\MT@char\@empty
        \else
          \edef\MT@char{\@tempa\space}%
          \edef\MT@char@{-\the\@tempcnta}%
%<debug>\MT@dinfo@nl{3}{> `\the\MT@toks' is a glyph name (\the\@tempcnta)}%
        \fi
      \fi
    \else
      \ifnum\MT@char > \m@ne
        \ifMT@norest
%    \end{macrocode}
% Or, it's a Unicode number, which we mustn't translate into a glyph number,
% since the latter is font-specific. But we add the `|U|' prefix.
%    \begin{macrocode}
          \@tempcnta=\XeTeXcharglyph\MT@char\relax
          \ifnum\@tempcnta=\z@
            \MT@info@missing@char
            \let\MT@char\@empty
          \else
%<debug>\MT@dinfo@nl{3}{> (glyph number: \the\@tempcnta,
%<debug>                   glyph name:   \XeTeXglyphname\MT@font\@tempcnta)}%
            \edef\MT@char{U\MT@char}%
          \fi
        \else
          \MT@warn@rest
          \let\MT@char\@empty
        \fi
      \else
        \MT@warn@unknown
        \let\MT@char\@empty
      \fi
    \fi
  \fi
%</xe->
}
%</pdf-|lua-|xe->
%    \end{macrocode}
% This is the lua function to translate glyph name into slot number.
% Beginning with v2.2, \pkg{luaotfload} provides this function in its <API>, which
% we use if available, but (for now, at least) keep the old code for backward
% compatibility.
%\changes{v2.5a}{2013/04/19}{adapt to \pkg{luaotfload} v2.2
%                            (contributed by \contributor \'Elie Roux <elie.roux\at telecom-bretagne.eu>)}
%                            ^^A MID: <516AAF6B.8040605@telecom-bretagne.eu>
% With HarfBuzz, the return value is not guaranteed to be inside the
% Unicode range, so we have to guard against this case as well (same as in
% |do_font|).
% ^^A cf. https://github.com/latex3/luaotfload/issues/198
%\changes{v3.0}{2021/10/26}{guard against return values outside Unicode range (for HarfBuzz)}
% Also, older versions of \pkg{luaotfload} (until v3.18) returned the numbers as floats.
%^^A fixed here: https://github.com/latex3/luaotfload/commit/53b70cbdb60101e2869d879e9d8daf576b0c8f82
%\changes{v3.0}{2021/10/30}{convert floats to integers
%                           (reported by \contributor azur <@\at @>)}
%                            ^^A https://tex.stackexchange.com/questions/616329/using-polyglossia-microtype-and-newcomputermodern-with-lualatex-results-in-0-0
%    \begin{macrocode}
%<*luafile>
if luaotfload and luaotfload.aux and luaotfload.aux.slot_of_name then
  local slot_of_name = luaotfload.aux.slot_of_name
  microtype.name_to_slot = function(name, unsafe)
    local n = slot_of_name(font.current(), name, unsafe)
    if not n then return -1 end
    if n > 1114111 then return -1 end
    return math.tointeger(n)
  end
else
  -- we dig into internal structure (should be avoided)
  local function name_to_slot(name, unsafe)
    if fonts then
      local unicodes
      if fonts.ids then       -- legacy luaotfload
        local tfmdata = fonts.ids[font.current()]
        if not tfmdata then return end
        unicodes = tfmdata.shared.otfdata.luatex.unicodes
      else                    -- new location
        local tfmdata = fonts.hashes.identifiers[font.current()]
        if not tfmdata then return end
        unicodes = tfmdata.resources.unicodes
      end
      local unicode = unicodes[name]
      if unicode then -- does the 'or' branch actually exist?
        return type(unicode) == "number" and unicode or unicode[1]
      end
    end
  end
  microtype.name_to_slot = name_to_slot
end

%</luafile>
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@is@letter}
% Input is a letter, a character or a number.
%\changes{v1.8}{2005/04/04}{warning for non-<ASCII> characters}
%\changes{v1.9}{2005/10/22}{using \cmd\catcode\ should be more efficient than
%                           inspecting the \cmd\meaning}
%\begin{macro}{\MT@max@char}
%\begin{macro}{\MT@max@slot}
% Warning if resulting character or slot number is too large.
%    \begin{macrocode}
%<*pdf-|lua-|xe->
\def\MT@max@char
%<pdf->  {127 }
%<lua-|xe->  {1114111 }
\def\MT@max@slot
%<pdf->  {255 }
%<lua-|xe->  {1114111 }
%</pdf-|lua-|xe->
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\begin{macro}{\ifMT@norest}
% Test whether all of the string has been used up.
%    \begin{macrocode}
%<*package>
\newif\ifMT@norest
%    \end{macrocode}
%\end{macro}
%    \begin{macrocode}
\def\MT@is@letter#1#2\relax{%
  \ifcat a\noexpand#1\relax
    \edef\MT@char@{\number`#1}%
    \ifx\\#2\\%
%<debug>\MT@dinfo@nl{3}{> `\the\MT@toks' is a letter (\MT@char@)}%
    \else
      \MT@norestfalse
    \fi
  \else
    \ifcat !\noexpand#1\relax
      \edef\MT@char@{\number`#1}%
%<debug>\MT@dinfo@nl{3}{> `\the\MT@toks' is a character (\MT@char@)}%
      \ifx\\#2\\%
        \ifnum\MT@char@ > \MT@max@char \MT@warn@ascii \fi
      \else
        \MT@norestfalse
        \expandafter\MT@is@number#1#2\relax\relax
      \fi
    \fi
  \fi
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@is@number}
% Numbers may be specified as a three-digit decimal number (|029|),
%\changes{v1.1}{2004/09/13}{numbers may also be specified in hexadecimal or octal
%               (suggested by \contributor Harald Harders <h.harders\at tu-bs.de>)}
%                                                    ^^A private mail, 2004/09/13
% as a hexadecimal number (prefixed with~|"|: |"1D|) or as a octal number
% (prefixed with~|'|: |'35|). They must consist of at least three characters
% (including the prefix), that is, |"F| is not permitted.
%    \begin{macrocode}
\def\MT@is@number#1#2#3\relax{%
  \ifx\relax#3\relax \else
    \ifx\relax#2\relax \else
      \MT@noresttrue
      \if#1"\relax
        \def\x{\uppercase{\edef\MT@char@{\number#1#2#3}}}\x
%<debug>\MT@dinfo@nl{3}{> ... a hexadecimal number: \MT@char@}%
      \else
        \if#1'\relax
          \def\MT@char@{\number#1#2#3}%
%<debug>\MT@dinfo@nl{3}{> ... an octal number: \MT@char@}%
        \else
          \MT@ifint{#1#2#3}{%
            \def\MT@char@{\number#1#2#3}%
%<debug>\MT@dinfo@nl{3}{> ... a decimal number: \MT@char@}%
          }\MT@norestfalse
        \fi
      \fi
      \ifnum\MT@char@ > \MT@max@slot
        \MT@warn@number@too@large{\noexpand#1\noexpand#2\noexpand#3}%
        \let\MT@char@\m@ne
      \fi
    \fi
  \fi
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@is@active}
%\changes{v1.8}{2005/03/30}{new macro: translate \pkg{inputenc}-defined characters}
% Expand an active character. (This was completely broken in v1.7, and only
% worked by chance before.)
%\changes{v1.9}{2005/09/08}{redone: use \cmd\set@display@protect}
% We \cmd\set@display@protect\ to translate, \eg, \expandafter|\"A| into |\"A|,
% that is to whatever it is defined in the \pkg{inputenc} encoding file.
%
%\iffalse
% Previous solution, slightly more robust (but doesn't understand Unicode):
%\begin{verbatim}
%\def\MT@is@active#1#2\@nil{%
%   \ifx\\#2\\%
%      \ifnum\catcode`#1 = \active
%         \toks@=\expandafter\expandafter\expandafter{\@tempa}%
%         \expandafter\MT@active@inpenc\the\toks@\relax\relax
%         \edef\@tempa{\the\toks@}%
%         \edef\x{\MT@toks={\the\MT@toks\space(= \the\toks@)}}\x
%      \fi
%   \fi
%}
%\def\MT@active@inpenc#1#2#3\relax{%
%   \ifx#1\IeC
%      \def\IeC##1{\toks@={##1}}%
%      \the\toks@
%      \expandafter\MT@active@inpenc\the\toks@\relax\relax
%   \fi
%   \ifx#1\@tabacckludge
%      \def\@tabacckludge##1##2{%
%         \toks@=\expandafter{\csname\string##1\endcsname#3}}%
%      \the\toks@
%   \fi
%   \ifx#1\@inpenc@undefined@
%      \def\@inpenc@undefined@##1{%
%         \edef\x{\toks@={%
%            undefined^^J(\MT@MT)\@spaces\@spaces\@spaces\@spaces
%            in input encoding ``##1''}}\x}%
%      \the\toks@
%   \fi
%}
%\end{verbatim}
%\fi
%
% Unfortunately, the (older) \pkg{inputenc} definitions prefer the
% protected\slash generic variants (\eg, \cmd\copyright\ instead of
% \cmd\textcopyright), which our parser won't be able to understand.
% (I'm fed up now, so you have to complain if you really, really want to be able
% to write `\expandafter|\textcopyright|' instead of \cmd\textcopyright, thus
% rendering your configuration files unportable.)
%
% Unicode characters (\pkg{inputenc}/|utf8|,|utf8x|) are also supported.
%\changes{v1.9d}{2006/03/06}{support for Unicode (\pkg{inputenc}\slash\texttt{utf8})}
%\changes{v2.3}{2007/11/11}{support for extended Unicode (\pkg{inputenc}\slash\texttt{utf8x} resp. \pkg{ucs}) -- experimental}
%
%\iffalse ^^A obsolete because of `inputenc' key
% We presume that only one input encoding is being used throughout the entire
% document. We could of course save the input encoding together with the list,
% but this would entail a couple of problems: (1)~the overhead of resetting the
% input encoding every time, (2)~the problem (or rather, impossibility) to
% decide which input encoding should be chosen -- the one active when the list
% was declared or the one active when the font is selected, and (3)~the
% improbability of multiple input encodings being used at all.
%\fi
%    \begin{macrocode}
\def\MT@is@active#1#2\@nil{%
  \ifnum\catcode`#1 = \active
    \begingroup
      \set@display@protect
      \let\IeC\@firstofone
      \let\@inpenc@undefined@\MT@undefined@char
%    \end{macrocode}
% Unicode handling has changed again with \LaTeX\ 2019/10/01.
%\changes{v2.7c}{2019/10/10}{compatibility with \LaTeX\ 2019/10/01} ^^A https://github.com/latex3/latex2e/commit/2edd9339ed9a710d45b435ba91545240d0cc9528#diff-d138747c4604d436824f8cb7cedd7d46
%    \begin{macrocode}
      \let\UTF@two@octets@noexpand\@empty
      \let\UTF@three@octets@noexpand\@empty
      \let\UTF@four@octets@noexpand\@empty
%    \end{macrocode}
% We refrain from checking whether there is a sufficient number of octets.
%    \begin{macrocode}
      \def\UTFviii@defined##1{\ifx ##1\relax
        \MT@undefined@char{utf8}\else\expandafter ##1\fi}%
%    \end{macrocode}
% For \pkg{ucs} (utf8x). Let's call it experimental~\dots
%    \begin{macrocode}
      \MT@ifdefined@c@T\PrerenderUnicode
        {\PrerenderUnicode{\@tempa}\let\unicode@charfilter\@firstofone}%
      \MT@is@active@hook{#1}%
%    \end{macrocode}
% The \cmd\expandafter\ hocus-pocus should please \pkg{newunicodechar}.
%\changes{v2.7a}{2017/11/25}{compatibility with \pkg{newunicodechar}
%                            (reported by \contributor Nils Anders Danielsson <nad\at cse.gu.se>)}
%                            ^^A private mail, 2017/09/05
%    \begin{macrocode}
      \edef\x{\endgroup
        \def\noexpand\@tempa{\expandafter\expandafter\expandafter\@empty\@tempa}%
%    \end{macrocode}
% Append what we think the translation is to the token register we use for the
% log.
%    \begin{macrocode}
        \MT@toks={\the\MT@toks\space(=
                  \expandafter\expandafter\expandafter\@empty\@tempa)}%
      }%
    \x
  \fi
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@is@active@hook}
%\changes{v3.0e}{2022/05/22}{hook for active chars}
% Test for these packages only once (requires \pkg{etoolbox}).
%    \begin{macrocode}
\let\MT@is@active@hook\@gobble
^^Q\@gobble
{\catcode`\#=12
\MT@addto@setup{%
%    \end{macrocode}
% If a char has been made active by \pkg{listings}'s \cmd\lstMakeShortInline,
%\changes{v3.0e}{2022/05/21}{fix for \pkg{listings}'s \cmd\lstMakeShortInline\
%                            (reported by \contributor Denis Bitouz\'e <@\at @>)}
%                            ^^A https://tex.stackexchange.com/questions/644665/lstmakeshortinline-fails-with-some-characters-when-luatex-ja-and-microtype-are
% we need to retrieve the original meaning, or else make sure that we're
% seeing a non-active char.
%    \begin{macrocode}
  \MT@with@package@T{listings}{%
    \apptocmd\MT@is@active@hook{%
      \MT@ifdefined@n@T{lst@ShortInlineOldCatcode\string#1}{%
        \catcode`#1=\csname lst@ShortInlineOldCatcode\string#1\endcsname\relax
        \ifnum\catcode`#1=\active
          \begingroup
            \catcode`\~\active \lccode`\~`#1%
            \lowercase{\endgroup
              \MT@let@cn~{lst@ShortInlineOldMeaning\string#1}}%
        \else
          \def\@tempa{#1}%
        \fi
      }%
    }{}{}%
  }%
%    \end{macrocode}
% Same for \cmd\MakeShortVerb\ of \pkg{doc}/\pkg{shortvrb} (and implicitly \cls{memoir}).
%\changes{v3.0e}{2022/05/22}{fix for \pkg{doc}/\pkg{shortvrb}'s \cmd\MakeShortVerb}
%    \begin{macrocode}
  \MT@if@false
  \MT@with@package@T{doc}\MT@if@true
  \MT@with@package@T{shortvrb}\MT@if@true
  \ifMT@if@\expandafter\@firstofone\else\expandafter\@gobble\fi{%
    \apptocmd\MT@is@active@hook{%
      \MT@ifdefined@n@T{cc\string#1}{%
        \catcode`#1=\csname cc\string#1\endcsname\relax
        \ifnum\catcode`#1=\active
          \begingroup
            \catcode`\~\active \lccode`\~`#1%
            \lowercase{\endgroup
              \MT@let@cn~{ac\string#1}}%
        \else
          \def\@tempa{#1}%
        \fi
      }%
    }{}{}%
  }%
}}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@undefined@char}
% For characters not defined in the current input encoding.
%    \begin{macrocode}
\def\MT@undefined@char#1{undefined in input encoding ``#1''}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@is@symbol}
% The symbol commands might expand to funny stuff, depending on context.
% Instead of simply expanding |\|\meta{command}, we construct the command
% |\|\meta{encoding}|\|\meta{command} and see whether its meaning is
% \cmd\char|"|\meta{hex number}, which is the case for everything that has
% been defined with \cmd\DeclareTextSymbol\ in the encoding definition files.
%\changes{v2.0}{2006/09/15}{made even more robust}
%    \begin{macrocode}
\def\MT@is@symbol{%
  \expandafter\def\expandafter\MT@char\expandafter
      {\csname\MT@encoding\MT@detokenize@c\@tempa\endcsname}%
%    \end{macrocode}
% Since recently, some glyphs are defined optionally in \LaTeX\
% by checking if the glyph actually exists in the font (\eg, \cmd\textasteriskcentered).
%    \begin{macrocode}
  \expandafter\expandafter\expandafter
    \MT@is@opt@char\MT@char\iffontchar\char\else\fi\relax
  \expandafter\MT@exp@two@c\expandafter\MT@is@char\expandafter
    \meaning\expandafter\MT@char\MT@charstring\relax\relax\relax
  \ifnum\MT@char@ < \z@
%    \end{macrocode}
%\changes{v2.7c}{2019/08/13}{take care of \cmd\remove@tlig}
% In <TU> encoding, some commands (currently, \cmd\textquotesingle, \cmd\textasciigrave\
% and \cmd\textquotedbl) are defined by means of the auxiliary macro
% \cmd\remove@tlig, which we take care of here.
%    \begin{macrocode}
    \expandafter\expandafter\expandafter\MT@is@tlig\MT@char\relax\relax
    \ifnum\MT@char@ < \z@
%    \end{macrocode}
%\changes{v2.2}{2007/03/07}{expand once more (for \pkg{frenchpro})}
% Finally, if it hasn't been defined by \cmd\DeclareTextSymbol, it could be a letter
% (\eg, \cmd\i, when using \pkg{frenchpro}). ^^A as noted by Bernard Gaulle
%                                              ^^A private mail, 2005/01/28
%    \begin{macrocode}
      \expandafter\expandafter\expandafter\MT@is@letter\MT@char\relax\relax
    \fi
  \fi
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@is@opt@char}
% This seems adventurous, but we're only redefining the text command within
% the scope of our setup.
%\changes{v2.8c}{2021/03/05}{fix for optionally defined glyphs
%                            (reported by \contributor Frank Mittelbach <frank.mittelbach\at latex-project.org>)}
%                            ^^A private mail, 2021/03/02
%                            ^^A also: https://github.com/latex3/latex2e/issues/525
%\changes{v3.0}{2021/10/18}{fix for incompatibility with \pkg{syntax}
%                           (reported by \contributor Safron <@\at @>)}
%                            ^^A https://tex.stackexchange.com/questions/619410/conflict-between-microtype-and-syntax-packages/
%    \begin{macrocode}
\def\MT@is@opt@char#1\iffontchar#2\char#3\else#4\fi\relax{%
  \MT@ifempty{#1}{%
    \iffontchar#2%
      \MT@exp@cs\chardef{\MT@encoding\MT@detokenize@c\@tempa}=#3\relax
    \fi
  }\relax
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@is@char}
%\begin{macro}{\MT@charstring}
% A helper macro that inspects the \cmd\meaning\ of its argument.
%    \begin{macrocode}
\begingroup
  \catcode`\/=\z@
%    \end{macrocode}
%\SpecialEscapechar{\/}
%    \begin{macrocode}
  /MT@map@tlist@n{/\CHARLEX}/@makeother
  /lowercase{%
    /def/x{/endgroup
      /def/MT@charstring{\CHAR"}%
      /def/MT@is@char##1\CHAR"##2##3##4/relax{%
        /ifx/relax##4/relax
          /ifMT@xunicode
            /expandafter/MT@is@charx/MT@strip@prefix##1>/relax\CHAR "%
              /relax/relax/relax/relax/relax
          /fi
        /else
          /ifx/relax##1/relax
            /if##3\/relax
              /edef/MT@char@{/number"##2}%
              /MT@ifstreq/MT@charstring{##3##4}/relax/MT@norestfalse
            /else
              /edef/MT@char@{/number"##2##3}%
              /MT@ifstreq/MT@charstring{##4}/relax
                {/MT@is@xchar##2##3|##4\CHAR"/relax}%
            /fi
%<debug>    /MT@dinfo@nl{3}{> `/the/MT@toks' is a \char (/MT@char@)}%
          /fi
        /fi
      }%
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\begin{macro}{\MT@is@xchar}
%\changes{v2.6}{2016/04/23}{update for \pkg{fontspec}'s <TU> encoding}
% With \pkg{fontspec}'s <TU> encoding, glyph numbers may be up to four digits.
%\SpecialEscapechar{\/}
%    \begin{macrocode}
      /def/MT@is@xchar##1|##2\CHAR"##3##4/relax{%
        /MT@ifstreq/MT@charstring{##3##4}%
          {/edef/MT@char@{/number"##1##2}}/MT@norestfalse
      }%
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@charxstring}
%\begin{macro}{\MT@strip@prefix}
%\begin{macro}{\MT@is@charx}
% For \pkg{xunicode}, which doesn't \cmd\countdef, but rather \cmd\def s the chars.
%\changes{v2.5}{2010/02/27}{compatibility with \pkg{xunicode}}
%\SpecialEscapechar{\/}
%    \begin{macrocode}
      /def/MT@charxstring{\CHAR "}%
      /def/MT@strip@prefix##1>##2/relax{##2}%
      /def/MT@is@charx##1\CHAR "##2##3##4##5##6/relax{%
        /ifx/relax##1/relax
          /ifx/relax##6/relax/else
            /edef/MT@char@{/number"##2##3##4##5}%
            /MT@ifstreq{\RELAX >\CHAR "}{##6}/relax/MT@norestfalse
%<debug>    /MT@dinfo@nl{3}{> `/the/MT@toks' is a xunicode \char (/MT@char@)}%
          /fi
        /fi
      }%
    }%
  }
/x
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\MT@is@tlig}
% This might have to change again with the next \LaTeX\ release, ^^A see https://github.com/latex3/latex2e/issues/165
% \dots\ or so I feared, but it still seems to be fine.
%    \begin{macrocode}
\def\MT@is@tlig#1#2\relax{%
  \ifx\remove@tlig#1%
%<debug>    \MT@dinfo@nl{3}{> `\the\MT@toks' (removing remove@tlig)}%
    \MT@remove@tlig
  \fi
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@remove@tlig}
% We remove the \cs{remove@tlig} command and only pass on the number.
%\changes{v2.8c}{2021/03/04}{fix for text commands containing conditionals
%                            (reported by \contributor Frank Mittelbach <frank.mittelbach\at latex-project.org>)}
%                            ^^A private mail, 2021/03/02
%    \begin{macrocode}
\def\MT@remove@tlig{%
  \expandafter\MT@exp@two@c\expandafter\MT@is@number
  \expandafter\@secondoftwo\MT@char\relax\relax
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@is@composite}
% Here, we are dealing with accented characters, specified as two tokens.
%\changes{v1.7}{2005/03/10}{new macro: construct command for composite character;
%                           no uncontrolled expansion}
%\changes{v2.2}{2007/06/08}{more robust: expand exactly once}
%    \begin{macrocode}
\def\MT@is@composite#1#2\relax{%
  \ifx\\#2\\\else
%    \end{macrocode}
% Again, we construct a control sequence, this time of the form:
% |\\|\meta{encoding}\allowbreak|\|\meta{accent}|-|\meta{character}, \eg,
% |\\T1\"-a|, which we then expand once to see if it is a letter (if it has
% been defined by \cmd\DeclareTextComposite). This should be robust, finally,
% especially, since we also \cmd\detokenize\ the input instead of only
% \cmd\string ifying it. Thus, we will die gracefully even on wrong Unicode
% input without |utf8|.
%    \begin{macrocode}
    \expandafter\def\expandafter\MT@char\expandafter{\csname\expandafter
                    \string\csname\MT@encoding\endcsname
                    \MT@detokenize@n{#1}-\MT@detokenize@n{#2}\endcsname}%
%    \end{macrocode}
% In 2017, \LaTeX\ introduced a new way of declaring accented
% Unicode commands (\cmd\DeclareUnicodeComposite), which we take care of here
% (\cmd\UnicodeEncodingName\ has been introduced at the same time):
%\changes{v2.7}{2017/04/29}{compatibility with \LaTeX\ 2017/01/01 (\cmd\DeclareUnicodeComposite)
%                            (reported by \contributor Ulrike Fischer <news3\at nililand.de> and
%                             `\contributor jcr <@\at @>')}
%                             ^^A (1) private mail, 2017/04/25
%                             ^^A (2) https://tex.stackexchange.com/questions/373594/
%    \begin{macrocode}
    \ifx\UnicodeEncodingName\@undefined\else
      \expandafter\expandafter\expandafter
        \MT@is@uni@comp\MT@char\iffontchar\else\fi\relax
    \fi
    \expandafter\expandafter\expandafter\MT@is@letter\MT@char\relax\relax
%    \end{macrocode}
% Again, \pkg{xunicode}.
%    \begin{macrocode}
    \ifnum\MT@char@ < \z@
      \ifMT@xunicode
        \edef\MT@char{\MT@exp@two@c\MT@strip@prefix\meaning\MT@char>\relax}%
        \expandafter\MT@exp@two@c\expandafter\MT@is@charx\expandafter
            \MT@char\MT@charxstring\relax\relax\relax\relax\relax
      \fi
    \fi
  \fi
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@is@uni@comp}
% Helper for \cmd\DeclareUnicodeComposite.
%    \begin{macrocode}
\def\MT@is@uni@comp#1\iffontchar#2\else#3\fi\relax{%
  \ifx\\#1\\\edef\MT@char{\iffontchar#2\fi}\fi
}
%    \end{macrocode}
%\end{macro}
% [What about math? Well, for a moment the following looked like a solution, with
% \cmd\mt@is@mathchar\ defined accordingly, analogous to \cs{MT@is@char} above,
% to pick up the last two tokens (the \cmd\meaning\ of a \cmd\mathchardef'ed
% command expands to its hexadecimal notation):
%\begin{verbatim}
%\def\MT@is@mathchar#1{%
%  \if\relax\noexpand#1% it's a macro
%    \let\x#1%
%  \else % it's a character
%    \mathchardef\x=\mathcode`#1\relax
%  \fi
%  \expandafter\MT@exp@two@c\expandafter\mt@is@mathchar\expandafter
%    \meaning\expandafter\x\mt@mathcharstring\relax\relax\relax
%}
%\end{verbatim}
% However, the problem is that \cmd\mathcode s and \cmd\mathchardef s have
% global scope. Therefore, if they are changed by a package that loads
% different math fonts, there is no guarantee whatsoever that things will still
% be correct (\eg, the minus in |cmsy| when the \pkg{euler} package is loaded).
% So, no way to go, unfortunately.]
%
% Some warning messages, for performance reasons separated here.
%\begin{macro}{\MT@curr@list@name}
%\changes{v1.8}{2005/06/08}{new macro: current list type and name}
%\changes{v1.9f}{2006/08/03}{fix: \cmd\MessageBreak\ must not be expanded}
%\begin{macro}{\MT@set@listname}
% The type and name of the current list, defined at various places.
%    \begin{macrocode}
\def\MT@set@listname{%
  \edef\MT@curr@list@name{\@nameuse{MT@abbr@\MT@feat} list\noexpand\MessageBreak
    `\@nameuse{MT@\MT@feat @c@name}'}%
}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\begin{macro}{\MT@warn@ascii}
% For `other' characters \textgreater\ 127, we issue a warning (\pkg{inputenc}
% probably hasn't been loaded), since correspondence with the slot numbers
% would be purely coincidental.
%    \begin{macrocode}
\def\MT@warn@ascii{%
  \MT@warning@nl{Character `\the\MT@toks' (= \MT@char@)
    is outside of ASCII range.\MessageBreak
    You must load the `inputenc' package before using\MessageBreak
    8-bit characters in \MT@curr@list@name}%
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@warn@number@too@large}
% Number too large.
%    \begin{macrocode}
\def\MT@warn@number@too@large#1{%
  \MT@warning@nl{%
    Number #1 in encoding `\MT@encoding' too large!\MessageBreak
    Ignoring it in \MT@curr@list@name}%
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@warn@rest}
% Not all of the string has been parsed.
%    \begin{macrocode}
\def\MT@warn@rest{%
  \MT@warning@nl{%
    Unknown slot number of character\MessageBreak`\the\MT@toks'%
    \MT@warn@maybe@inputenc\MessageBreak
    in font encoding `\MT@encoding'.\MessageBreak
    Make sure it's a single character\MessageBreak
    (or a number) in \MT@curr@list@name}%
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@warn@unknown}
% No idea what went wrong.
%    \begin{macrocode}
\def\MT@warn@unknown{%
  \MT@warning@nl{%
    Unknown slot number of character\MessageBreak`\the\MT@toks'%
    \MT@warn@maybe@inputenc\MessageBreak
    in font encoding `\MT@encoding' in \MT@curr@list@name}%
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@warn@maybe@inputenc}
% In case an input encoding had been requested.
%    \begin{macrocode}
\def\MT@warn@maybe@inputenc{%
  \MT@ifdefined@n@T
     {MT@\MT@feat @\MT@cat @\csname MT@\MT@feat @\MT@cat @name\endcsname @inputenc}%
    { (input encoding `\@nameuse
     {MT@\MT@feat @\MT@cat @\csname MT@\MT@feat @\MT@cat @name\endcsname @inputenc}')}%
}
%    \end{macrocode}
%\end{macro}
\def\MT@warn@unknown@once#1{%
  \def\MT@warn@unknown{%
    \MT@warning@nl{One or more slots in the configuration are unknown.\MessageBreak
                   Make sure that no text commands are used.\MessageBreak
                   See the documentation for details (the note\MessageBreak
                   on `#1' in section 11: `Hints and caveats')}%
    \MT@glet\MT@warn@unknown\relax}%
}
%
%\subsubsection{Hook into \LaTeX's font selection}\label{ssub:impl.hook}
%
% We append \cs{MT@setupfont} to \cmd\pickup@font, which is called by \LaTeX\
% every time a font is selected. We then check whether we've already seen this
% font, and if not, set it up for micro-typography.
% This ensures that we will catch all fonts, and that we will not set up fonts
% more than once. The whole package really hangs on this command.
%
% In contrast to the \pkg{pdfcprot} package, it is not necessary to declare in
% advance which fonts should benefit from micro-typographic treatment. Also,
% only those fonts that are actually being used will be set up.
%
% For my reference:
%\begin{itemize}
%  \item \cmd\pickup@font\ is called by \cmd\selectfont, \cmd\wrong@fontshape,
%     or \\ \cmd\getanddefine@fonts\ (for math).
%  \item \cmd\pickup@font\ calls \cmd\define@newfont.
%  \item \cmd\define@newfont\ may call (inside a group!)
%  \begin{itemize}
%     \item \cmd\wrong@fontshape, which in turn will call \cmd\pickup@font,
%        and thus \\ \cmd\define@newfont\ again, or
%     \item \cmd\extract@font.
%  \end{itemize}
%  \item \cmd\get@external@font\ is called by \cmd\extract@font, by itself,
%        and by the substitution macros.
%\end{itemize}
%
%\iffalse
%\changes{v1.2}{2004/10/02}{check for packages that might load fonts}
%\changes{v1.4}{2004/11/04}{no need to check for packages that might load fonts anymore}
%\fi
%\changes{v1.4}{2004/11/04}{use \cmd\pickup@font\ instead of \cmd\define@newfont\
%                           as the hook for \cs{MT@setupfont}}
% Up to version 1.3 of this package, we were using \cmd\define@newfont\ as the
% hook, which is only called for \emph{new} fonts, and therefore seemed the
% natural choice. However, this meant that we had to take special care to catch
% all fonts: we additionally had to set up the default font, the error font (if
% it wasn't the default font), we had to check for some packages that might
% have been loaded before \microtype\ and were loading fonts, \eg,
% \pkg{jurabib}, \pkg{ledmac}, \pkg{pifont} (loaded by \pkg{hyperref}),
% \pkg{tipa}, and probably many more. Furthermore, we had to include a hack for
% the \cls{IEEEtran} class which loads all fonts in the class file itself (to
% fine tune inter-word spacing), and the \cls{memoir} class, too. To cut this
% short: it seemed to get out of hand, and I decided that it would be better to
% use \cmd\pickup@font\ and decide for ourselves whether we've already seen
% that font. I hope the overhead isn't too large.
%\changes{v1.8}{2005/05/15}{if font substitution has occurred, set up the
%                           substitute font, not the selected one}
%\changes{v1.9}{2005/10/03}{allow context-specific font setup}
%\begin{macro}{\MT@font@list}
%\begin{macro}{\MT@font}
% We use a comma separated list.
%    \begin{macrocode}
\let\MT@font@list\@empty
\let\MT@font\@empty
%    \end{macrocode}
%\end{macro}
%\end{macro}
% All this is done at the beginning of the document.
% It doesn't work for plain, of course, which doesn't have \cmd\pickup@font.
%    \begin{macrocode}
%</package>
%<*package|letterspace>
%<plain>\MT@requires@latex2{
\MT@addto@setup{%
%    \end{macrocode}
%\begin{macro}{\MT@orig@pickupfont}
% The \pkg{luatexja} package redefines \cmd\char, which will upset our parsing
% of text symbols and commands; instead of fixing this, we won't bother,
% at least for the moment, but simply issue a warning and disable all
% further warnings. The fix is left to the user by not specifying any text
% commands but only (Unicode) letters.
%\changes{v2.6}{2015/12/05}{(in)compatibility with \pkg{luatexja}: disable unknown slots warnings
%                          (reported by \contributor Max <@\at @>)}
%                           ^^A https://tex.stackexchange.com/questions/272102/luatexja-with-microtype-generates-lots-of-warnings
% The \pkg{xeCJK} package, or rather its \pkg{xunicode-addon}, also modifies the way
% text symbols are defined (like \pkg{luatexja} but in a different way).
% Again, we only issue a warning.
%\changes{v2.6}{2015/11/03}{(in)compatibility with \pkg{xeCJK}: disable unknown slots warnings
%                           (reported by \contributor HcN <@\at @>)}
%                           ^^A https://tex.stackexchange.com/questions/275653/warning-using-microtype-and-excjk-packages
%    \begin{macrocode}
%<package>  \MT@with@package@T{luatexja}{\MT@warn@unknown@once{luatexja}}%
%<package>  \MT@with@package@T{xeCJK}   {\MT@warn@unknown@once{xeCJK}}%
%    \end{macrocode}
%\changes{v2.1}{2007/01/15}{compatibility with \pkg{CJK}: also check for its definition}
%\changes{v2.3b}{2008/05/26}{compatibility with \pkg{CJKutf8}: also check for its definition}
% \microtype\ also works with \pkg{CJK} in the sense that nothing will break
% when both packages are used at the same time. However, since \pkg{CJK} has
% its own way of encoding, it is currently not possible to create
% character-specific settings. That is, the only feature available with
% \pkg{CJK} fonts is (non-selected) expansion.
% (Tracking doesn't really work for other reasons.)
%\todo{fix tracking with \pkg{CJK}, if worth the trouble}^^A
% Like us, \pkg{CJK} redefines \cmd\pickup@font.
%    \begin{macrocode}
  \@ifpackageloaded{CJK}{%
%    \end{macrocode}
%\changes{v2.6}{2013/06/06}{compatibility with \pkg{xeCJK}: pretend that \pkg{CJK} wasn't loaded}
% The \pkg{xeCJK} package in turn pretends that \pkg{CJK} was loaded, but does not
% change the definition of \cmd\pickup@font.
% With \pkg{xeCJK}, protrusion should be possible also for C/J/K characters;
% I haven't tried it, though.
%^^A also, \XeTeXinterchartoks probably interferes ...
%    \begin{macrocode}
    \@ifpackageloaded{xeCJK}{\@firstofone}{%
      \@ifpackagelater{CJK}{2006/10/17}% 4.7.0
        {\def\MT@orig@pickupfont{\CJK@ifundefined\CJK@plane}}%
        {\def\MT@orig@pickupfont{\@ifundefined{CJK@plane}}}%
      \g@addto@macro\MT@orig@pickupfont
        {{\expandafter\ifx\font@name\relax\define@newfont\fi}}%
%    \end{macrocode}
% \pkg{CJKutf8} redefines \cmd\pickup@font\ once more (recent versions, in
% <PDF> mode, as determined by \pkg{ifpdf}, which \pkg{CJKutf8} loads).
%    \begin{macrocode}
      \@ifpackageloaded{CJKutf8}%
        {\@ifpackagelater{CJKutf8}{2008/05/22}% 4.8.0
          {\ifpdf\expandafter\@secondoftwo\else\expandafter\@firstoftwo\fi}%
          {\@firstoftwo}}%
        {\@firstoftwo}%
      {\g@addto@macro\MT@orig@pickupfont{%
        {\expandafter\ifx\csname\curr@fontshape/\f@size/\CJK@plane\endcsname\relax
           \define@newfont\else\xdef\font@name{%
             \csname \curr@fontshape/\f@size/\CJK@plane\endcsname}\fi}}}%
      {\g@addto@macro\MT@orig@pickupfont{%
        {\expandafter\ifx\csname \curr@fontshape/\f@size/\CJK@plane\endcsname\relax
           \define@newfont\def\CJK@temp{v}%
           \ifx\CJK@temp\CJK@plane
             \expandafter\ifx\csname CJK@cmap@\f@family\CJK@plane\endcsname\relax
             \else\csname CJK@cmap@\f@family\CJK@plane\endcsname\fi
           \else \CJK@addcmap\CJK@plane \fi
         \else\xdef\font@name{%
           \csname \curr@fontshape/\f@size/\CJK@plane\endcsname}\fi}}}%
      \@gobble
    }%
  }{\@firstofone}%
%    \end{macrocode}
% This is the normal \LaTeX\ definition.
%    \begin{macrocode}
  {\def\MT@orig@pickupfont{\expandafter\ifx\font@name\relax\define@newfont\fi}}%
%    \end{macrocode}
% Check whether \cmd\pickup@font\ is defined as expected.
% The warning issued by \cmd{\CheckCommand*} would be a bit too generic.
%    \begin{macrocode}
  \ifx\pickup@font\MT@orig@pickupfont \else
    \MT@warning@nl{%
      Command \string\pickup@font\space is not defined as expected.%
      \MessageBreak Patching it anyway. Some things may break%
%<*package>
     .\MessageBreak Double-check whether micro-typography is indeed%
      \MessageBreak applied to the document.%
      \MessageBreak (Hint: Turn on `verbose' mode)%
%</package>
    }%
  \fi
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\pickup@font}
% Then we append our stuff. Everything is done inside a group.
%\changes{v2.2}{2007/04/15}{\letterspace: setup inside group}
%    \begin{macrocode}
  \g@addto@macro\pickup@font{\begingroup}%
%    \end{macrocode}
% If the \pkg{trace} package is loaded, we turn off tracing of \microtype's
% setup, which is extremely noisy.
%\changes{v1.9e}{2006/05/25}{no tracing with \pkg{trace} package}
%    \begin{macrocode}
  \MT@with@package@T{trace}{\g@addto@macro\pickup@font{\conditionally@traceoff}}%
  \g@addto@macro\pickup@font{%
%    \end{macrocode}
%\changes{v3.1b}{2023/06/07}{guard against expanding context}
% If we're inside an \cmd\edef\ (or \cmd\write~\dots), we don't want to
% execute our code. This will still leave `|\begingroup \let \relax \relax \endgroup|'
% in the input stream, which is not nothing but should be harmless enough.
% \cmd\pickup@font\ should never be executed in these contexts anyway, but obviously
% this may, under rare circumstances, still happen (\eg, with \pkg{hyperref}).\footnote{
%    Cf. \url{https://tex.stackexchange.com/q/687763/7674}}
%    \begin{macrocode}
%<package>    \MT@if@expanding@F{%
      \escapechar\m@ne
%<*package>
%<debug>      \global\MT@inannottrue
%<debug>      \MT@glet\MT@pdf@annot\@empty
%<debug>      \MT@addto@annot{(line \number\inputlineno)}%
%    \end{macrocode}
% If \cs{MT@font} is empty, no substitution has taken place, hence
% \cmd\font@name\ is correct. Otherwise, if they are different,
% \cmd\font@name\ does not describe the font actually used. This test will
% catch first order substitutions, like |bx| to |b|, but it will still fail if
% the substituting font is itself substituted.
%    \begin{macrocode}
      \MT@let@cn\MT@font{MT@subst@\expandafter\string\font@name}%
      \ifx\MT@font\relax
        \let\MT@font\font@name
      \else
        \ifx\MT@font\font@name \else
%<debug>  \MT@addto@annot{= substituted with \MT@@font}%
          \MT@register@subst@font
        \fi
      \fi
      \MT@setupfont}%
%</package>
%<letterspace>      \MT@tracking
    \endgroup
  }%
%<*package>
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@pickupfont}
%\begin{macro}{\MT@MT@pickupfont}
%\begin{macro}{\MT@ltx@pickupfont}
% Remember the patched command, because we may have to disable
% ourselves in certain situations.
%    \begin{macrocode}
  \let\MT@pickupfont\pickup@font
  \def\MT@MT@pickupfont {\let\pickup@font\MT@pickupfont}%
  \def\MT@ltx@pickupfont{\let\pickup@font\MT@orig@pickupfont}%
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\do@subst@correction}
% Additionally, we hook into \cmd\do@subst@correction, which is called if
% a substitution has taken place, to record the name of the ersatz font.
% Unfortunately, this will only work for one-level substitutions.
%\changes{v2.3}{2007/08/05}{remember substitute font for all times
%                           (reported by \contributor Stephan Hennig <stephanhennig\at arcor.de>)}
%                               ^^A MID: <46ab4fbb$0$31632$9b4e6d93@newsspool3.arcor-online.net>
% We have to remember the substitute for the rest of the document, not just for
% the first time it is called, since we need it every time a font is
% letterspaced.
%    \begin{macrocode}
  \g@addto@macro\do@subst@correction
    {\edef\MT@font{\csname\curr@fontshape/\f@size\endcsname}%
     \MT@glet@nc{MT@subst@\expandafter\string\font@name}\MT@font}%
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\add@accent}
%\changes{v1.8}{2005/06/14}{fix: disable micro-typographic setup inside \cmd\add@accent\
%               (reported by \contributor Stephan Hennig <stephanhennig\at arcor.de>)}
%                    ^^A MID: <42adb0e3$0$27784$9b4e6d93@newsread2.arcor-online.net>
%\begin{macro}{\MT@orig@add@accent}
% Inside \cmd\add@accent, we have to disable \microtype's setup, since the
% grouping in the patched \cmd\pickup@font\ would break the accent if
% different fonts are used for the base character and the accent. Fortunately,
% \LaTeX\ takes care that the fonts used for the \cmd\accent\ are already set
% up, so that we cannot be overlooking them.
%    \begin{macrocode}
  \let\MT@orig@add@accent\add@accent
  \def\add@accent#1#2{%
    \MT@ltx@pickupfont
    \MT@orig@add@accent{#1}{#2}%
    \MT@MT@pickupfont
  }%
%</package>
}
%<plain>}\relax
%</package|letterspace>
%<*package>
%    \end{macrocode}
%\end{macro}
%\end{macro}
% Consequently (if all goes well), we are the last ones to change these
% commands, therefore there is no need to check whether our definition has
% survived.
%\changes{v1.6}{2004/12/29}{test whether \cmd\pickup@font\ has changed}
%\changes{v1.9a}{2005/11/21}{remove superfluous test whether \cmd\pickup@font\ has changed}
%
%\begin{macro}{\MT@check@font}
% Check whether we've already seen the current font.
%    \begin{macrocode}
\def\MT@check@font{\MT@exp@one@n\MT@in@clist\MT@font\MT@font@list}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@register@font}
% Register the current font.
%    \begin{macrocode}
\def\MT@register@font{\xdef\MT@font@list{\MT@font@list\MT@font,}}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@register@subst@font}
% Register the substituted font
%\changes{v2.5}{2010/08/23}{only register substituted font if it isn't registered already
%                           (reported by \contributor George Gratzer <gratzer\at me.com>
%                            and \contributor Josep Maria Font <jmfont\at ub.edu>)}
%                             ^^A 1. <http://permalink.gmane.org/gmane.comp.tex.macosx/38293>
%                             ^^A 2. <http://permalink.gmane.org/gmane.comp.tex.macosx/38303>
%                             ^^A (beta:02)
% (only if it isn't registered already).
%\changes{v2.7d}{2019/10/28}{remove substitute font from list
%                            (reported by \contributor Markus Kohm <komascript\at gmx.info>)}
%                             ^^A private mail, 2019/01/16
%                             ^^A https://tex.stackexchange.com/q/470311
% Additionally, we have to remove the substitute font from the list of fonts,
% so that we set it up again.
%    \begin{macrocode}
\def\MT@register@subst@font{%
  \MT@exp@one@n\MT@in@clist\font@name\MT@font@list
  \ifMT@inlist@\else
    \xdef\MT@font@list{\MT@font@list\font@name,}%
    \expandafter\MT@rem@from@clist\MT@font\MT@font@list
  \fi
}
%</package>
%    \end{macrocode}
%\end{macro}
%
%\subsubsection{Context-sensitive setup}
%
% Here are the variants for context-sensitive setup.
%\begin{macro}{\MT@active@features}
% The activated features are stored in a command.
%\changes{v3.1}{2022/07/24}{always activate contexts for tracking}
% We always allow contexts for tracking, because \cmd\textls\ may
% be used without activating the feature.
%    \begin{macrocode}
%<*pdf-|lua-|xe->
%<pdf->\MT@requires@pdftex6
%<lua->\MT@requires@luatex3
%<pdf-|lua->  {%
  \def\MT@active@features{,tr}%
%<pdf-|lua->  }{\let\MT@active@features\@empty}
%</pdf-|lua-|xe->
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@check@font@cx}
% Every feature has its own list of fonts that have already been dealt with. If
% the font needn't be set up for a feature, we temporarily disable the
% corresponding setup command.
%\changes{v1.9a}{2005/11/14}{optimise context-sensitive setup}
% This should be more efficient than book-keeping the fonts in lists associated
% with the combination of contexts, as we've done it before.
%    \begin{macrocode}
%<*package>
\def\MT@check@font@cx{%
  \MT@if@true
  \MT@map@clist@c\MT@active@features{%
    \expandafter\MT@exp@one@n\expandafter\MT@in@clist\expandafter\MT@font
      \csname MT@##1@\csname MT@##1@context\endcsname font@list\endcsname
    \ifMT@inlist@
      \MT@let@nc{MT@\@nameuse{MT@abbr@##1}}\relax
    \else
      \MT@if@false
    \fi
  }%
  \ifMT@if@ \MT@inlist@true \else \MT@inlist@false \fi
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@register@subst@font@cx}
% Add the substituted font to each feature list and possibly remove substitute font.
%\todo{remove from other lists?}
%\changes{v2.5}{2010/08/23}{only register if it isn't registered already} ^^A (beta:02)
%\changes{v2.7d}{2019/10/28}{remove substitute font from lists}
%    \begin{macrocode}
\def\MT@register@subst@font@cx{%
  \MT@map@clist@c\MT@active@features{%
    \expandafter\MT@exp@one@n\expandafter\MT@in@clist\expandafter\font@name
      \csname MT@##1@\csname MT@##1@context\endcsname font@list\endcsname
    \ifMT@inlist@ \else
      \MT@exp@cs\MT@xadd
        {MT@##1@\csname MT@##1@context\endcsname font@list}%
        {\font@name,}%
      \expandafter\MT@exp@one@n\expandafter\MT@rem@from@clist\expandafter\MT@font
         \csname MT@##1@\csname MT@##1@context\endcsname font@list\endcsname
    \fi
  }%
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@register@font@cx}
% For each feature, add the current font to the list, unless we didn't set it
% up.
%    \begin{macrocode}
\def\MT@register@font@cx{%
  \MT@map@clist@c\MT@active@features{%
    \MT@exp@cs\ifx{MT@\@nameuse{MT@abbr@##1}}\relax\else
      \MT@exp@cs\MT@xadd
        {MT@##1@\csname MT@##1@context\endcsname font@list}%
        {\MT@font,}%
      \def\@tempa{##1}%
      \MT@exp@cs\MT@map@tlist@c{MT@##1@doc@contexts}\MT@maybe@rem@from@list
    \fi
  }%
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@maybe@rem@from@list}
% Recurse through all context font lists of the document and remove the font,
% unless it's the current context.
%    \begin{macrocode}
\def\MT@maybe@rem@from@list#1{%
  \MT@ifstreq{\@tempa/#1}{\@tempa/\csname MT@\@tempa @context\endcsname}\relax{%
    \expandafter\MT@exp@one@n\expandafter\MT@rem@from@clist\expandafter
       \MT@font \csname MT@\@tempa @#1font@list\endcsname
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\microtypecontext}
%\changes{v1.9}{2005/10/03}{new command: change setup context in the document}
%\changes{v2.3}{2007/08/05}{made robust (reported by \contributor Stephan Hennig <stephanhennig\at arcor.de>)}
%                                           ^^A MID: <46ab4fbb$0$31632$9b4e6d93@newsspool3.arcor-online.net>
%\changes{v2.6}{2014/03/26}{allow \texttt{activate} shortcut (reported by \contributor Karl Berry <karl\at freefriends.org>)}
%                                           ^^A private mail, 2014/03/21
%\changes{v2.8}{2019/11/25}{fix \texttt{activate} shortcut}
%\changes{v2.8}{2019/12/12}{ignore spaces}
%\begin{macro}{\MT@microtypecontext}
% The user may change the context, so that different setups are possible. This
% is especially useful for multi-lingual documents.
%
% Inside the preamble, this command shouldn't actually do anything but remember itself for
% later.
%    \begin{macrocode}
\DeclareRobustCommand\microtypecontext{\MT@begin@catcodes\MT@microtypecontext}
\def\MT@microtypecontext#1{\MT@end@catcodes\MT@addto@setup{\microtypecontext{#1}}}
\MT@addto@setup{%
  \DeclareRobustCommand\microtypecontext{%
    \MT@begin@catcodes
    \MT@microtypecontext
  }%
  \def\MT@microtypecontext#1{%
    \MT@end@catcodes
    \MT@setup@contexts
    \let\MT@reset@context\relax
%    \end{macrocode}
% We need to ensure that math fonts are set up anew.
%\changes{v2.5}{2012/11/13}{fix: ensure to set up math fonts (reported by \contributor RazorXsr <@\at @>)}
%                           ^^A https://tex.stackexchange.com/questions/82556/pdftex-font-expansion-error-setexpansion-in-microtype-package
%    \begin{macrocode}
    \MT@glet\glb@currsize\@empty
    \setkeys{MTC}{#1}%
    \selectfont
    \MT@reset@context
  }%
}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\begin{macro}{\textmicrotypecontext}
%\changes{v2.2}{2007/07/03}{new command: wrapper around \cs{microtypecontext}}
%\changes{v2.8}{2019/12/12}{ignore spaces}
%\begin{macro}{\MT@textmicrotypecontext}
%\begin{macro}{\MT@text@microtypecontext}
% This is just a wrapper around \cs{microtypecontext}.
%    \begin{macrocode}
\DeclareRobustCommand\textmicrotypecontext{\MT@begin@catcodes\MT@textmicrotypecontext}
\def\MT@textmicrotypecontext#1{\MT@end@catcodes\MT@text@microtypecontext{#1}}
\def\MT@text@microtypecontext#1#2{{\microtypecontext{#1}#2}}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\MT@reset@context}
%\changes{v1.9f}{2006/08/03}{only reset context if it has actually been changed}
%\begin{macro}{\MT@reset@context@}
% We have to reset the font at the end of the group, provided there actually was
% a change.
%    \begin{macrocode}
\def\MT@reset@context@{%
  \MT@vinfo{<<< Resetting contexts\on@line
%<debug>  \MessageBreak= \MT@pr@context/\MT@ex@context
%<debug>                /\MT@tr@context/\MT@kn@context/\MT@sp@context
  }%
  \selectfont
}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\begin{macro}{\MT@setup@contexts}
% The first time \cs{microtypecontext} is called, we initialise the context
% lists and redefine the commands used in \cmd\pickup@font.
%    \begin{macrocode}
\def\MT@setup@contexts{%
  \MT@map@clist@c\MT@active@features
    {\MT@glet@nc{MT@##1@@font@list}\MT@font@list}%
  \MT@glet\MT@check@font\MT@check@font@cx
  \MT@glet\MT@register@font\MT@register@font@cx
  \MT@glet\MT@register@subst@font\MT@register@subst@font@cx
  \MT@glet\MT@setup@contexts\relax
}
%    \end{macrocode}
%\end{macro}
% Define context keys.
%    \begin{macrocode}
\MT@map@clist@c\MT@features@long{%
  \define@key{MTC}{#1}[]{%
    \edef\@tempb{\@nameuse{MT@rbba@#1}}%
    \MT@exp@one@n\MT@in@clist\@tempb\MT@active@features
    \ifMT@inlist@
%    \end{macrocode}
% Using an empty context is only asking for trouble, therefore we choose the
% `|@|' instead (hoping for the \LaTeX\ users' natural awe of this character).
%    \begin{macrocode}
      \MT@ifempty{##1}{\def\MT@val{@}}{\def\MT@val{##1}}%
      \MT@exp@cs\ifx{MT@\@tempb @context}\MT@val
%<debug>\MT@dinfo{1}{>>> no change of #1 context: `\MT@val'}%
      \else
        \MT@vinfo{>>> Changing #1 context to `\MT@val'\MessageBreak\on@line
%<debug>          \space(previous: `\@nameuse{MT@\@tempb @context}')%
                 }%
        \def\MT@reset@context{\aftergroup\MT@reset@context@}%
%    \end{macrocode}
% The next time we see the font, we have to reset \emph{all} factors.
%^^A TODO: only for pdftex? or why at all?
%    \begin{macrocode}
        \MT@glet@nn{MT@reset@\@tempb @codes}{MT@reset@\@tempb @codes@}%
%    \end{macrocode}
% We must also keep track of all contexts in the document.
%    \begin{macrocode}
        \expandafter\MT@exp@one@n\expandafter\MT@in@tlist\expandafter
          \MT@val \csname MT@\@tempb @doc@contexts\endcsname
        \ifMT@inlist@ \else
          \MT@exp@cs\MT@xadd{MT@\@tempb @doc@contexts}{{\MT@val}}%
%<debug>  \MT@dinfo{1}{||| added #1 context: \@nameuse{MT@\@tempb @doc@contexts}}%
        \fi
        \MT@edef@n{MT@\@tempb @context}{\MT@val}%
      \fi
    \fi
  }%
}
%    \end{macrocode}
% We also allow the |activate| shortcut.
%    \begin{macrocode}
\define@key{MTC}{activate}[]{%
  \setkeys{MTC}{protrusion={#1}}%
  \setkeys{MTC}{expansion={#1}}%
}
%    \end{macrocode}
%\begin{macro}{\MT@pr@context}
%\begin{macro}{\MT@ex@context}
%\begin{macro}{\MT@tr@context}
%\begin{macro}{\MT@sp@context}
%\begin{macro}{\MT@kn@context}
%\begin{macro}{\MT@pr@doc@contexts}
%\begin{macro}{\MT@ex@doc@contexts}
%\begin{macro}{\MT@tr@doc@contexts}
%\begin{macro}{\MT@sp@doc@contexts}
%\begin{macro}{\MT@kn@doc@contexts}
%\begin{macro}{\MT@extra@context}
% Initialise the contexts.
%    \begin{macrocode}
\MT@exp@one@n\MT@map@clist@n{\MT@features,nl}{%
  \MT@def@n{MT@#1@context}{@}%
  \MT@def@n{MT@#1@doc@contexts}{{@}}%
}
\let\MT@extra@context\@empty
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%
%\subsection{Configuration}
%
%\subsubsection{Font sets}
%\todo{allow for \texttt{load}ing and extending another set; or using more than one set?}
%
%\begin{macro}{\DeclareMicrotypeSet}
%^^A \changes{v1.1}{2004/09/15}{remove spaces around first argument}
%\changes{v2.6}{2013/08/05}{ignore spaces}
%\begin{macro}{\DeclareMicrotypeSet*}
% Calling this macro will create a comma list for every font attribute of the
% form: |\MT|\meta{feature}|list@|\meta{attribute}|@|\meta{set name}. If the
% optional argument is empty, lists for all available features will be created.
%
% The third argument must be a list of |key=value| pairs. If a font attribute
% is not specified, we define the corresponding list to \cmd\relax, so that it
% does not constitute a constraint.
%    \begin{macrocode}
\def\DeclareMicrotypeSet{%
  \MT@begin@catcodes
  \@ifstar
    \MT@DeclareSetAndUseIt
    \MT@DeclareSet
}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\begin{macro}{\MT@DeclareSet}
%    \begin{macrocode}
\newcommand\MT@DeclareSet[3][]{%
  \MT@ifempty{#1}{%
    \MT@map@clist@c\MT@features{\begingroup\MT@declare@sets{##1}{#2}{#3}\endgroup}%
  }{%
    \MT@map@clist@n{#1}{\begingroup
      \MT@ifempty{##1}\relax{%
        \MT@is@feature{##1}{set declaration `#2'}{%
          \MT@exp@one@n\MT@declare@sets
            {\csname MT@rbba@##1\endcsname}{#2}{#3}%
        }%
      }%
    \endgroup}%
  }%
  \MT@end@catcodes
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@DeclareSetAndUseIt}
%    \begin{macrocode}
\newcommand\MT@DeclareSetAndUseIt[3][]{%
  \MT@DeclareSet[#1]{#2}{#3}%
  \UseMicrotypeSet[#1]{#2}%
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@curr@set@name}
% We need to remember the name of the set currently being declared.
%    \begin{macrocode}
\let\MT@curr@set@name\@empty
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@declare@sets}
% Define the current set name and parse the keys.
%\changes{v1.1}{2004/09/20}{remove spaces around set name}
%\changes{v1.8}{2005/05/15}{warning when redefining a set}
%\changes{v2.0}{2006/10/16}{fix: empty size list when redefining set}
%\changes{v2.6}{2016/04/20}{fix: undefine lists for redefining}
%\todo{share one set between features}
%    \begin{macrocode}
\def\MT@declare@sets#1#2#3{%
  \def\MT@curr@set@name{#2}%
  \MT@ifdefined@n@T{MT@#1@set@@\MT@curr@set@name}{%
    \MT@warning{Redefining \@nameuse{MT@abbr@#1} set `\MT@curr@set@name'}%
    \MT@map@clist@n{font,encoding,family,series,shape,size}{%
      \MT@glet@nc{MT@#1list@##1@\MT@curr@set@name}\@undefined
    }%
  }%
  \MT@glet@nc{MT@#1@set@@\MT@curr@set@name}\@empty
%<debug>\MT@dinfo{1}{declaring \@nameuse{MT@abbr@#1} set `\MT@curr@set@name'}%
  \setkeys{MT@#1@set}{#3}%
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@define@set@key@}
% \meta{\#1} = font axis, \meta{\#2} = feature.
%\changes{v1.8}{2005/04/16}{use comma lists instead of token lists}
%\changes{v1.9a}{2005/11/21}{don't expand variables immediately
%                (requested by \contributor Georg Verweyen <verweyen\at gmail.com>)}
%                   ^^A MID: <437a522d$0$7419$9b4e6d93@newsread4.arcor-online.net>
%    \begin{macrocode}
\def\MT@define@set@key@#1#2{%
  \define@key{MT@#2@set}{#1}[]{%
    \MT@glet@nc{MT@#2list@#1@\MT@curr@set@name}\@empty
    \MT@map@clist@n{##1}{%
      \KV@@sp@def\MT@val{####1}%
      \MT@get@highlevel{#1}%
%    \end{macrocode}
% We do not add the expanded value to the list~\dots
%    \begin{macrocode}
      \MT@exp@two@n\g@addto@macro
        {\csname MT@#2list@#1@\MT@curr@set@name\expandafter\endcsname}%
        {\MT@val,}%
    }%
%    \end{macrocode}
% \dots~but keep in mind that the list has to be expanded at the end of the
% preamble.
%    \begin{macrocode}
    \expandafter\g@addto@macro\expandafter\MT@font@sets
      \csname MT@#2list@#1@\MT@curr@set@name\endcsname
%<debug>\MT@dinfo@nl{1}{-- #1: \@nameuse{MT@#2list@#1@\MT@curr@set@name}}%
  }%
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@get@highlevel}
% Saying, for instance, `|family=rm*|' or `|shape=bf*|' will expand to
% \cmd\rmdefault\ resp. \cmd\bfdefault.
%    \begin{macrocode}
\def\MT@get@highlevel#1{%
  \expandafter\MT@test@ast\MT@val*\@nil\relax{%
%    \end{macrocode}
% And `|family = *|' will become \cmd\familydefault.
%    \begin{macrocode}
    \MT@ifempty\@tempa{\def\@tempa{#1}}\relax
%    \end{macrocode}
% Test whether the command is actually defined.
%\changes{v2.7a}{2017/11/17}{test whether \cmd{\...default} is defined}
%    \begin{macrocode}
    \MT@ifdefined@n@TF{\@tempa default}%
      {\edef\MT@val{\MT@exp@cs\noexpand{\@tempa default}}}%
      {\MT@warning{`\@backslashchar\@tempa default' is not a defined command.\MessageBreak
                   Ignoring `#1 = {\@tempa*}' in font set\MessageBreak`\MT@curr@set@name'}%
       \let\MT@val\@empty}%
%    \end{macrocode}
% In contrast to earlier versions, these values will not be expanded immediately,
% but at the end of the preamble.
%\changes{v1.2}{2004/09/26}{check whether defaults have changed}
%\changes{v1.5}{2004/12/02}{don't test defaults if called after begin document}
%\changes{v1.9a}{2005/11/21}{no longer check whether defaults have changed}
%    \begin{macrocode}
  }%
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@test@ast}
% It the last character is an asterisk, execute the second argument, otherwise
% the first one.
%\changes{v1.7}{2005/03/10}{make it simpler}
%    \begin{macrocode}
\def\MT@test@ast#1*#2\@nil{%
  \def\@tempa{#1}%
  \MT@ifempty{#2}%
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@font@sets}
%\begin{macro}{\MT@fix@font@set}
% Fully expand the font specification and fix catcodes for all font sets. Also
% remove \pkg{fontspec}'s counters.
%    \begin{macrocode}
\let\MT@font@sets\@empty
\def\MT@fix@font@set#1{%
  \MT@ifdefined@c@T{#1}{%
    \xdef#1{#1}%
    \ifMT@fontspec
      \xdef#1{\expandafter\MT@scrubfeatures#1()\relax}%
    \fi
    \global\@onelevel@sanitize#1%
  }%
}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\begin{macro}{\MT@define@set@key@size}
% |size| requires special treatment.
%    \begin{macrocode}
\def\MT@define@set@key@size#1{%
  \define@key{MT@#1@set}{size}[]{%
    \MT@map@clist@n{##1}{%
      \def\MT@val{####1}%
      \expandafter\MT@get@range\MT@val--\@nil
      \ifx\MT@val\relax \else
        \MT@exp@cs\MT@xadd
          {MT@#1list@size@\MT@curr@set@name}%
          {{{\MT@lower}{\MT@upper}\relax}}%
      \fi
    }%
%<debug>\MT@dinfo@nl{1}{-- size: \@nameuse{MT@#1list@size@\MT@curr@set@name}}%
  }%
}
%    \end{macrocode}
%\end{macro}
%\changes{v1.7}{2005/03/11}{allow specification of size ranges
%               (suggested by \contributor Andreas B\"uhmann <andreas.buehmann\at web.de>)}
%                                                            ^^A private mail, 2005/03/10
% Font sizes may also be specified as ranges. This has been requested by Andreas
% B\"uhmann, who has also offered valuable help in implementing this. Now, it
% is for instance possible to set up different lists for fonts with optical
% sizes. (The \pkg{MinionPro} project does this for the OpenType version
% of Adobe's Minion. (\ctanpkgurl{minionpro}))
%
%\begin{macro}{\MT@get@range}
%\begin{macro}{\MT@upper}
%\begin{macro}{\MT@lower}
% Ranges will be stored as triplets of |{|\meta{lower bound}|}|\allowbreak
% |{|\meta{upper bound}|}|\allowbreak|{|\meta{list name}|}|.
% For simple sizes, the upper boundary is \textminus1.
%    \begin{macrocode}
\def\MT@get@range#1-#2-#3\@nil{%
  \MT@ifempty{#1}{%
    \MT@ifempty{#2}{%
      \let\MT@val\relax
    }{%
      \def\MT@lower{0}%
      \def\MT@val{#2}%
      \MT@get@size
      \edef\MT@upper{\MT@val}%
    }%
  }{%
    \def\MT@val{#1}%
    \MT@get@size
    \ifx\MT@val\relax \else
      \edef\MT@lower{\MT@val}%
      \MT@ifempty{#2}{%
        \MT@ifempty{#3}%
          {\def\MT@upper{-1}}%
%    \end{macrocode}
% 2048\,pt is \TeX's maximum font size.
%    \begin{macrocode}
          {\def\MT@upper{2048}}%
      }{%
        \def\MT@val{#2}%
        \MT@get@size
        \ifx\MT@val\relax \else
          \MT@ifdim\MT@lower>\MT@val{%
            \MT@error{%
              Invalid size range (\MT@lower\space > \MT@val) in font set
              `\MT@curr@set@name'.\MessageBreak Swapping sizes}{}%
            \edef\MT@upper{\MT@lower}%
            \edef\MT@lower{\MT@val}%
          }{%
            \edef\MT@upper{\MT@val}%
          }%
          \MT@ifdim\MT@lower=\MT@upper
            {\def\MT@upper{-1}}%
            \relax
        \fi
      }%
    \fi
  }%
}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\MT@get@size}
% Translate a size selection command and normalise it.
%    \begin{macrocode}
\def\MT@get@size{%
%    \end{macrocode}
% A single star would mean \cmd\sizedefault, which doesn't exist, so we define
% it to be \cmd\normalsize.
%    \begin{macrocode}
  \if*\MT@val\relax
    \def\@tempa{\normalsize}%
  \else
    \MT@let@cn\@tempa{\MT@val}%
  \fi
  \ifx\@tempa\relax\else
    \MT@get@size@
  \fi
%    \end{macrocode}
% Font specifications also accept dimens. (\cmd\ifdefdimen\ is provided
% by \pkg{etoolbox}.)
%\changes{v3.2}{2024/05/03}{check for dimen (reported by \contributor Oliver Beery <@\at @>)
%                           \githubissue{36}}
%    \begin{macrocode}
^^X  \MT@exp@one@n\ifdefdimen\MT@val{\edef\MT@val{\the\MT@val}}\relax
%    \end{macrocode}
% Test whether we finally got a number or dimension so that we can strip the
% `|pt|' (\cmd\@defaultunits\ and \cmd\strip@pt\ are kernel macros).
%\changes{v1.2}{2004/09/27}{additional magic to catch some errors}
%    \begin{macrocode}
  \MT@ifdimen\MT@val{%
    \@defaultunits\@tempdima\MT@val pt\relax\@nnil
    \edef\MT@val{\strip@pt\@tempdima}%
  }{%
    \MT@warning{Could not parse font size `\MT@val'\MessageBreak
                in font set `\MT@curr@set@name'}%
    \let\MT@val\relax
  }%
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@get@size@}
%\begin{macro}{\MT@get@size@@}
% The \pkg{relsize} solution of parsing \cmd\@setfontsize\ does not work with the
% <AMS> classes, among others. I hope my hijacking doesn't do any harm.
%\changes{v1.2}{2004/09/26}{hijack \cmd\set@fontsize\ instead of \cmd\@setfontsize}
% We redefine \cmd\set@fontsize\ instead of \cmd\@setfontsize\ because some classes
% might define the size selection commands by simply using \cmd\fontsize\
% (\eg, the \cls{a0poster} class).
%\changes{v2.3b}{2008/03/07}{grouping}
%    \begin{macrocode}
\def\MT@get@size@@{%
  \begingroup
    \def\set@fontsize##1##2##3##4\@nil{\endgroup\def\MT@val{##2}}%
    \@tempa\@nil
}
%    \end{macrocode}
% The \cls{svjour3} class defines the size commands using conditionals;
% using \etex\ primitives, we close any leftovers here.
%\changes{v2.8a}{2020/12/10}{compatibility with \cls{svjour3}
%                            (reported by \contributor Ekkehart Schlicht <ekkehart.schlicht\at gmail.com> (no relation!!))}
%                            ^^A https://groups.google.com/g/de.comp.text.tex/c/46sJ1jFRq-I
%                            ^^A MID: <9aa52497-19b5-4ca7-a668-c076cec4ceadn@googlegroups.com>, 2020/11/09
%    \begin{macrocode}
^^X\@ifclassloaded{svjour3}{%
^^X  \def\MT@get@size@{%
^^X    \@tempcnta=\currentiflevel
^^X    \MT@get@size@@
^^X    \MT@loop
^^X      \ifnum\numexpr\currentiflevel-1>\@tempcnta
^^X      \csname fi\endcsname
^^X    \MT@repeat
^^X  }%
^^X}{%
  \let\MT@get@size@\MT@get@size@@
^^X}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\changes{v1.9}{2005/07/13}{\cs{DeclareMicrotypeSet}: new key: \texttt{font}}
%\begin{macro}{\MT@define@set@key@font}
%\changes{v2.3}{2007/11/20}{\texttt{font}: single asterisk means normal font}
%    \begin{macrocode}
\def\MT@define@set@key@font#1{%
  \define@key{MT@#1@set}{font}[]{%
    \MT@glet@nc{MT@#1list@font@\MT@curr@set@name}\@empty
    \MT@map@clist@n{##1}{%
      \def\MT@val{####1}%
      \MT@ifstreq\MT@val*{\def\MT@val{*/*/*/*/*}}\relax
      \expandafter\MT@get@font\MT@val/////\@nil
      \MT@exp@two@n\g@addto@macro
        {\csname MT@#1list@font@\MT@curr@set@name\expandafter\endcsname}%
        {\MT@val,}%
    }%
    \expandafter\g@addto@macro\expandafter\MT@font@sets
      \csname MT@#1list@font@\MT@curr@set@name\endcsname
%<debug>\MT@dinfo@nl{1}{-- font: \@nameuse{MT@#1list@font@\MT@curr@set@name}}%
  }%
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@get@font}
% Translate any asterisks.
%    \begin{macrocode}
\def\MT@get@font#1/#2/#3/#4/#5/#6\@nil{%
  \MT@get@font@{#1}{#2}{#3}{#4}{#5}{0}%
  \ifx\MT@val\relax\def\MT@val{0}\fi
  \expandafter\g@addto@macro\expandafter\@tempb\expandafter{\MT@val}%
  \let\MT@val\@tempb
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@get@font@}
% Helper macro, also used by \cs{MT@get@font@and@size}.
%    \begin{macrocode}
\def\MT@get@font@#1#2#3#4#5#6{%
  \let\@tempb\@empty
  \def\MT@temp{#1/#2/#3/#4/#5}%
  \MT@get@axis{encoding}{#1}%
  \MT@get@axis{family}  {#2}%
  \MT@get@axis{series}  {#3}%
  \MT@get@axis{shape}   {#4}%
  \ifnum#6>\z@\edef\@tempb{\@tempb*}\fi
  \MT@ifempty{#5}{%
    \MT@warn@axis@empty{size}{\string\normalsize}%
    \def\MT@val{*}%
  }{%
    \def\MT@val{#5}%
  }%
  \MT@get@size
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@get@axis}
%    \begin{macrocode}
\def\MT@get@axis#1#2{%
  \def\MT@val{#2}%
  \MT@get@highlevel{#1}%
  \MT@ifempty\MT@val{%
    \MT@warn@axis@empty{#1}{\csname #1default\endcsname}%
    \expandafter\def\expandafter\MT@val\expandafter{\csname #1default\endcsname}%
  }\relax
  \expandafter\g@addto@macro\expandafter\@tempb\expandafter{\MT@val/}%
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@warn@axis@empty}
%    \begin{macrocode}
\def\MT@warn@axis@empty#1#2{%
  \MT@warning{#1 axis is empty in font specification\MessageBreak
    `\MT@temp'. Using `#2' instead}%
}
%    \end{macrocode}
%\end{macro}
% We can finally assemble all pieces to define \cs{DeclareMicrotypeSet}'s
% keys.
% They are also used for \cs{DisableLigatures}.
%    \begin{macrocode}
\MT@exp@one@n\MT@map@clist@n{\MT@features,nl}{%
  \MT@define@set@key@{encoding}{#1}%
  \MT@define@set@key@{family}  {#1}%
  \MT@define@set@key@{series}  {#1}%
  \MT@define@set@key@{shape}   {#1}%
  \MT@define@set@key@size      {#1}%
  \MT@define@set@key@font      {#1}%
}
%    \end{macrocode}
%\begin{macro}{\UseMicrotypeSet}
% To use a particular set we simply redefine |MT@|\meta{feature}|@setname|.
% If the optional argument is empty, set names for all features will be
% redefined.
%^^A \changes{v1.1}{2004/09/20}{remove spaces around first argument}
%\changes{v2.6}{2013/08/05}{ignore spaces}
%    \begin{macrocode}
\def\UseMicrotypeSet{%
  \MT@begin@catcodes
  \MT@UseMicrotypeSet
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@UseMicrotypeSet}
%    \begin{macrocode}
\newcommand*\MT@UseMicrotypeSet[2][]{%
  \MT@ifempty{#1}{%
    \MT@map@clist@c\MT@features{\begingroup\MT@use@set{##1}{#2}\endgroup}%
  }{%
    \MT@map@clist@n{#1}{\begingroup
      \MT@ifempty{##1}\relax{%
        \MT@is@feature{##1}{activation of set `#2'}{%
          \MT@exp@one@n\MT@use@set
            {\csname MT@rbba@##1\endcsname}{#2}%
        }%
      }%
    \endgroup}%
  }%
  \MT@end@catcodes
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@pr@setname}
%\begin{macro}{\MT@ex@setname}
%\begin{macro}{\MT@tr@setname}
%\begin{macro}{\MT@sp@setname}
%\begin{macro}{\MT@kn@setname}
%\begin{macro}{\MT@use@set}
% Only use sets that have been declared.
%\changes{v1.1}{2004/09/20}{remove spaces around set name}
%\changes{v1.4b}{2004/11/25}{don't use undeclared font sets}
%\changes{v1.6}{2005/01/19}{retain current set if new set is undeclared}
%\changes{v1.8}{2005/05/15}{fix: remove braces in first line}
%    \begin{macrocode}
\def\MT@use@set#1#2{%
  \MT@ifdefined@n@TF{MT@#1@set@@#2}{%
    \MT@xdef@n{MT@#1@setname}{#2}%
  }{%
    \MT@ifdefined@n@TF{MT@#1@setname}\relax{%
      \MT@xdef@n{MT@#1@setname}{\@nameuse{MT@default@#1@set}}%
    }%
    \MT@error{%
      The \@nameuse{MT@abbr@#1} set `#2' is undeclared.\MessageBreak
      Using set `\@nameuse{MT@#1@setname}' instead}{}%
  }%
}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\DeclareMicrotypeSetDefault}
%\changes{v1.8}{2005/05/15}{new command: set default font set}
%\changes{v2.6}{2013/08/05}{ignore spaces}
% This command can be used in the main configuration file to declare the
% default font set, in case no set is specified in the package options.
%    \begin{macrocode}
\def\DeclareMicrotypeSetDefault{%
  \MT@begin@catcodes
  \MT@DeclareMicrotypeSetDefault
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@DeclareMicrotypeSetDefault}
%    \begin{macrocode}
\newcommand*\MT@DeclareMicrotypeSetDefault[2][]{%
  \MT@ifempty{#1}{%
    \MT@map@clist@c\MT@features{\begingroup\MT@set@default@set{##1}{#2}\endgroup}%
  }{%
    \MT@map@clist@n{#1}{\begingroup
      \MT@ifempty{##1}\relax{%
        \MT@is@feature{##1}{declaration of default set `#2'}{%
          \MT@exp@one@n\MT@set@default@set
            {\csname MT@rbba@##1\endcsname}{#2}%
        }%
      }%
    \endgroup}%
  }%
  \MT@end@catcodes
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@default@pr@set}
%\begin{macro}{\MT@default@ex@set}
%\begin{macro}{\MT@default@tr@set}
%\begin{macro}{\MT@default@sp@set}
%\begin{macro}{\MT@default@kn@set}
%\begin{macro}{\MT@set@default@set}
%    \begin{macrocode}
\def\MT@set@default@set#1#2{%
  \MT@ifdefined@n@TF{MT@#1@set@@#2}{%
%<debug>\MT@dinfo{1}{declaring default \@nameuse{MT@abbr@#1} set `#2'}%
    \MT@xdef@n{MT@default@#1@set}{#2}%
  }{%
    \MT@error{%
      The \@nameuse{MT@abbr@#1} set `#2' is not declared.\MessageBreak
      Cannot make it the default set. Using set\MessageBreak `all' instead}{}%
    \MT@xdef@n{MT@default@#1@set}{all}%
  }%
}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%
%\subsubsection{Variants and aliases}
%
%\begin{macro}{\DeclareMicrotypeVariants}
%\changes{v2.2}{2007/02/04}{new command}
%\changes{v2.6}{2013/08/05}{ignore spaces}
%\begin{macro}{\MT@variants}
% Specify suffixes for variants (see \file{fontname/variants.map}).
% The starred version appends to the list.
%    \begin{macrocode}
\let\MT@variants\@empty
\def\DeclareMicrotypeVariants{%
  \MT@begin@catcodes
  \@ifstar
    \MT@DeclareVariants
    {\let\MT@variants\@empty\MT@DeclareVariants}%
}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\begin{macro}{\MT@DeclareVariants}
%    \begin{macrocode}
\def\MT@DeclareVariants#1{%
  \MT@map@clist@n{#1}{%
    \def\@tempa{##1}%
    \@onelevel@sanitize\@tempa
    \xdef\MT@variants{\MT@variants{\@tempa}}%
  }%
  \MT@end@catcodes
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\DeclareMicrotypeAlias}
% This can be used to set an alias name for a font, so that the file and the
% settings for the aliased font will be loaded.
%\changes{v1.5}{2004/12/03}{remove spaces around arguments}
%\changes{v1.8}{2005/05/09}{warning when overriding an alias font}
%\changes{v2.5}{2010/05/17}{ignore spaces}
%    \begin{macrocode}
\def\DeclareMicrotypeAlias{%
  \MT@begin@catcodes
  \MT@DeclareMicrotypeAlias
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@DeclareMicrotypeAlias}
%    \begin{macrocode}
\newcommand*\MT@DeclareMicrotypeAlias[2]{%
  \def\@tempb{#2}%
  \@onelevel@sanitize\@tempb
  \MT@ifdefined@n@T{MT@#1@alias}{%
    \MT@warning{Alias font family `\@tempb' will override
      alias `\@nameuse{MT@#1@alias}'\MessageBreak
      for font family `#1'}}%
  \MT@xdef@n{MT@#1@alias}{\@tempb}%
%    \end{macrocode}
% If we encounter this command while a font is being set up, we also set the
% alias for the current font so that if \cs{DeclareMicrotypeAlias} has been
% issued inside a configuration file, the configuration file for the alias font
% will be loaded, too.
%\changes{v1.7}{2005/03/23}{may also be used inside configuration files}
%    \begin{macrocode}
  \MT@ifdefined@c@T\MT@family{%
%<debug>\MT@dinfo{1}{Activating alias font `\@tempb' for `\MT@family'}%
    \MT@glet\MT@familyalias\@tempb
  }%
  \MT@end@catcodes
}
%    \end{macrocode}
%\end{macro}
%
%\subsubsection{Configuration file management}
%
%\begin{macro}{\LoadMicrotypeFile}
%\changes{v1.7}{2005/03/22}{new command (suggested by
%               \contributor Andreas B\"uhmann <andreas.buehmann\at web.de>)}
%                                              ^^A private mail, 2005/03/21
%\changes{v2.5}{2010/05/13}{remove all spaces in font name}
% May be used to load a configuration file manually.
%    \begin{macrocode}
\def\LoadMicrotypeFile#1{%
  \edef\@tempa{\zap@space#1 \@empty}%
  \@onelevel@sanitize\@tempa
  \MT@exp@one@n\MT@in@clist\@tempa\MT@file@list
  \ifMT@inlist@
    \MT@vinfo{... Configuration file \MT@cfg@prefix-\@tempa.cfg already loaded}%
  \else
    \MT@xadd\MT@file@list{\@tempa,}%
    \MT@begin@catcodes
    \InputIfFileExists{\MT@cfg@prefix-\@tempa.cfg}{%
      \edef\MT@curr@file{\MT@cfg@prefix-\@tempa.cfg}%
      \MT@vinfo{... Loading configuration file \MT@curr@file}%
    }{%
      \MT@warning{Configuration file \MT@cfg@prefix-\@tempa.cfg\MessageBreak
                  does not exist}%
    }%
    \MT@end@catcodes
  \fi
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@cfg@prefix}
%\begin{macro}{\DeclareMicrotypeFilePrefix}
%\changes{v3.1}{2023/03/01}{new command (suggested by
%               \contributor rallg <@\at @>) \githubissue{28}}
% The configuration files' prefix may be customised.
%    \begin{macrocode}
\def\MT@cfg@prefix{mt}
\def\DeclareMicrotypeFilePrefix#1{%
  \def\MT@cfg@prefix{#1}%
}
%</package>
%    \end{macrocode}
%\end{macro}
%\end{macro}
%
%\subsubsection{Disabling ligatures}
%
%\begin{macro}{\DisableLigatures}
%\changes{v1.9}{2005/07/11}{new command: disable ligatures (requires \pdftex\ 1.30)}
%\changes{v2.2}{2007/01/22}{new optional argument: disable selected ligatures only}
%\begin{macro}{\MT@DisableLigatures}
%\begin{macro}{\MT@nl@setname}
%\begin{macro}{\MT@nl@ligatures}
% This is really simple now: we can re-use the set definitions of
% \cs{DeclareMicrotypeSet}; there can only be one set, which we'll call
% `|no ligatures|'.
%
% The optional argument may be used to disable selected ligatures only.
%    \begin{macrocode}
%<*pdf-|lua->
%<pdf->\MT@requires@pdftex5{
\def\DisableLigatures{%
  \MT@begin@catcodes
  \MT@DisableLigatures
}
\newcommand*\MT@DisableLigatures[2][]{%
  \MT@ifempty{#1}\relax{\gdef\MT@nl@ligatures{#1}}%
  \xdef\MT@active@features{\MT@active@features,nl}%
  \global\MT@noligaturestrue
  \MT@declare@sets{nl}{no ligatures}{#2}%
  \gdef\MT@nl@setname{no ligatures}%
  \MT@end@catcodes
}
%<pdf->}{
%</pdf-|lua->
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
% If \pdftex\ is too old, we throw an error.
%    \begin{macrocode}
%<*pdf-|xe->
\renewcommand*\DisableLigatures[2][]{%
  \MT@error{Disabling ligatures of a font is only possible\MessageBreak
    with pdftex version 1.30 or newer.\MessageBreak
    Ignoring \@backslashchar DisableLigatures}{%
%<pdf->    Upgrade
%<xe->    Use
    pdftex.}%
}
%<pdf->}
%</pdf-|xe->
%    \end{macrocode}
%\end{macro}
%
%\subsubsection{Interaction with \pkg{babel}}
%
%\begin{macro}{\DeclareMicrotypeBabelHook}
%\changes{v2.0}{2005/10/04}{new command: interaction with \pkg{babel}} ^^A (beta:1)
%\changes{v3.2}{2024/05/25}{make catcode-safe}
%\begin{macro}{\MT@DeclareMicrotypeBabelHook}
% Declare the context that should be loaded when a \pkg{babel} language
% is selected. The command will not check whether a previous declaration will
% be overwritten.
%    \begin{macrocode}
%<*package>
\def\DeclareMicrotypeBabelHook{%
  \MT@begin@catcodes
  \MT@DeclareMicrotypeBabelHook
}
\def\MT@DeclareMicrotypeBabelHook#1#2{%
  \MT@map@clist@n{#1}{%
    \KV@@sp@def\@tempa{##1}%
    \MT@gdef@n{MT@babel@\@tempa}{#2}%
  }%
  \MT@end@catcodes
}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%
%
%\subsubsection{Fine tuning}
%
% The commands \cs{SetExpansion} and \cs{SetProtrusion} provide an interface for
% setting the character protrusion resp. expansion factors for a set of fonts.
%
%\begin{macro}{\SetProtrusion}
%\changes{v1.9}{2005/07/13}{(et al.) new key: \texttt{font}}
%\changes{v1.9d}{2006/02/23}{(et al.) split keys of optional and mandatory argument}
%\changes{v1.9d}{2006/02/23}{(et al.) optimise: unify keys for mandatory argument}
%\changes{v1.9e}{2006/07/26}{(et al.) new key: \texttt{inputenc}}
%\changes{v1.9f}{2006/08/10}{(et al.) set catcodes before parsing optional argument}
% This macro accepts three arguments: [options,] set of font attributes and
% list of character protrusion factors.
%
% A new macro called |\MT@pr@c@|\meta{name} will be defined to be \meta{\#3}
% (\ie, the list of characters, not expanded).
%    \begin{macrocode}
\def\SetProtrusion{%
  \MT@begin@catcodes
  \MT@SetProtrusion
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@SetProtrusion}
%\begin{macro}{\MT@pr@c@name}
%\begin{macro}{\MT@extra@context}
%\begin{macro}{\MT@permutelist}
% We want the catcodes to be correct even if this is called in the preamble.
%    \begin{macrocode}
\newcommand*\MT@SetProtrusion[3][]{%
  \let\MT@extra@context\@empty
%    \end{macrocode}
% Parse the optional first argument. We first have to know the name before we
% can deal with the extra options.
%    \begin{macrocode}
  \MT@set@named@keys{MT@pr@c}{#1}%
%<debug>\MT@dinfo{1}{creating protrusion list `\MT@pr@c@name'}%
  \def\MT@permutelist{pr@c}%
  \setkeys{MT@cfg}{#2}%
%    \end{macrocode}
% We have parsed the second argument, and can now define macros for all
% permutations of the font attributes to point to |\MT@pr@c@|\meta{name},~\dots
%    \begin{macrocode}
  \MT@permute
%    \end{macrocode}
% \dots~which we can now define to be \meta{\#3}.
% Here, as elsewhere, we have to make the definitions global, since they will
% occur inside a group.
%    \begin{macrocode}
  \MT@gdef@n{MT@pr@c@\MT@pr@c@name}{#3}%
  \MT@end@catcodes
}
%</package>
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\SetExpansion}
%\changes{v1.4}{2004/11/10}{fix: specifying extra options does no
%                           longer require to give a \texttt{name}, too}
%\changes{v1.9e}{2006/07/26}{new key: \texttt{inputenc}}
% \cs{SetExpansion} only differs in that it allows some extra options
% (|stretch|, |shrink|, |step|, |auto|).
%    \begin{macrocode}
%<*pdf-|lua->
\def\SetExpansion{%
  \MT@begin@catcodes
  \MT@SetExpansion
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@SetExpansion}
%\begin{macro}{\MT@ex@c@name}
%\begin{macro}{\MT@extra@context}
%\begin{macro}{\MT@permutelist}
%    \begin{macrocode}
\newcommand*\MT@SetExpansion[3][]{%
  \let\MT@extra@context\@empty
  \MT@set@named@keys{MT@ex@c}{#1}%
  \MT@ifdefined@n@T{MT@ex@c@\MT@ex@c@name @factor}{%
    \ifnum\csname MT@ex@c@\MT@ex@c@name @factor\endcsname > \@m
      \MT@warning@nl{Expansion factor \number\@nameuse{MT@ex@c@\MT@ex@c@name @factor}
        too large in list\MessageBreak `\MT@ex@c@name'. Setting it to the
        maximum of 1000}%
      \MT@glet@nc{MT@ex@c@\MT@ex@c@name @factor}\@m
    \fi
  }%
%<debug>\MT@dinfo{1}{creating expansion list `\MT@ex@c@name'}%
  \def\MT@permutelist{ex@c}%
  \setkeys{MT@cfg}{#2}%
  \MT@permute
  \MT@gdef@n{MT@ex@c@\MT@ex@c@name}{#3}%
  \MT@end@catcodes
}
%</pdf-|lua->
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\SetTracking}
%\changes{v2.0}{2006/12/28}{new command: tracking}
%\changes{v2.2}{2007/02/23}{third argument may be empty}
%\changes{v2.2}{2007/02/23}{new key `\texttt{no ligatures}' to disable
%                           ligatures of letterspaced fonts}
%\changes{v2.2}{2007/06/16}{new keys `\texttt{spacing}' and `\texttt{outer spacing}'
%                           to adjust interword spacing
%                           (suggested by \contributor Steven~E. Harris <seh\at panix.com>)}
%                                                             ^^A private mail, 2007/06/15
%\changes{v3.2}{2024/05/15}{new key `\texttt{features}' to en-\slash disable \pkg{fontspec}
%                           features (\luatex\ or \xetex)}
%    \begin{macrocode}
%<*pdf-|lua-|xe->
\def\SetTracking{%
  \MT@begin@catcodes
  \MT@SetTracking
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@SetTracking}
% Third argument may be empty.
%\changes{v2.3}{2007/11/20}{sanity check for value}
%    \begin{macrocode}
\newcommand*\MT@SetTracking[3][]{%
  \let\MT@extra@context\@empty
  \MT@set@named@keys{MT@tr@c}{#1}%
%<debug>\MT@dinfo{1}{creating tracking list `\MT@tr@c@name'}%
  \def\MT@permutelist{tr@c}%
  \setkeys{MT@cfg}{#2}%
  \MT@permute
  \KV@@sp@def\@tempa{#3}%
  \MT@ifempty\@tempa\relax{%
    \MT@ifint\@tempa
      {\MT@xdef@n{MT@tr@c@\MT@tr@c@name}{\@tempa}}%
      {\MT@warning{Value `\@tempa' is not a number in\MessageBreak
                   tracking set `\MT@curr@set@name'}}}%
  \MT@end@catcodes
}
%</pdf-|lua-|xe->
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\SetExtraSpacing}
%\changes{v2.0}{2005/09/28}{new command: adjustment of interword spacing} ^^A (beta:1)
%    \begin{macrocode}
%<*pdf->
\def\SetExtraSpacing{%
  \MT@begin@catcodes
  \MT@SetExtraSpacing
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@SetExtraSpacing}
%\begin{macro}{\MT@sp@c@name}
%\begin{macro}{\MT@extra@context}
%\begin{macro}{\MT@permutelist}
%    \begin{macrocode}
\newcommand*\MT@SetExtraSpacing[3][]{%
  \let\MT@extra@context\@empty
  \MT@set@named@keys{MT@sp@c}{#1}%
%<debug>\MT@dinfo{1}{creating spacing list `\MT@sp@c@name'}%
  \def\MT@permutelist{sp@c}%
  \setkeys{MT@cfg}{#2}%
  \MT@permute
  \MT@gdef@n{MT@sp@c@\MT@sp@c@name}{#3}%
  \MT@end@catcodes
}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\SetExtraKerning}
%\changes{v2.0}{2005/09/28}{new command: additional kerning} ^^A (beta:1)
%    \begin{macrocode}
\def\SetExtraKerning{%
  \MT@begin@catcodes
  \MT@SetExtraKerning
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@SetExtraKerning}
%\begin{macro}{\MT@kn@c@name}
%\begin{macro}{\MT@extra@context}
%\begin{macro}{\MT@permutelist}
%    \begin{macrocode}
\newcommand*\MT@SetExtraKerning[3][]{%
  \let\MT@extra@context\@empty
  \MT@set@named@keys{MT@kn@c}{#1}%
%<debug>\MT@dinfo{1}{creating kerning list `\MT@kn@c@name'}%
  \def\MT@permutelist{kn@c}%
  \setkeys{MT@cfg}{#2}%
  \MT@permute
  \MT@gdef@n{MT@kn@c@\MT@kn@c@name}{#3}%
  \MT@end@catcodes
}
%</pdf->
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\MT@set@named@keys}
%\changes{v1.9f}{2006/08/10}{new macro: set name first, simplify parsing of
%                            optional argument}
%\begin{macro}{\MT@options}
% We first set the name (if specified), then remove it from the list, and set
% the remaining keys.
%    \begin{macrocode}
%<*package>
\def\MT@set@named@keys#1#2{%
  \def\x##1name=##2,##3\@nil{%
    \setkeys{#1}{name=##2}%
    \gdef\MT@options{##1##3}%
    \MT@rem@from@clist{name=}\MT@options
  }%
  \x#2,name=,\@nil
  \@expandtwoargs\setkeys{#1}\MT@options
}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\begin{macro}{\MT@define@code@key}
% Define the keys for the configuration lists (which are setting the codes, in
% \pdftex\ speak).
%    \begin{macrocode}
\def\MT@define@code@key#1#2{%
  \define@key{MT@#2}{#1}[]{%
    \@tempcnta=\@ne
    \MT@map@clist@n{##1}{%
      \KV@@sp@def\MT@val{####1}%
%    \end{macrocode}
% Here, too, we allow for something like `|bf*|'. It will be expanded
% immediately.
%    \begin{macrocode}
      \MT@get@highlevel{#1}%
      \MT@edef@n{MT@temp#1\the\@tempcnta}{\MT@val}%
      \advance\@tempcnta \@ne
    }%
  }%
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@define@code@key@family}
%\changes{v2.5}{2011/02/07}{compatibility with \pkg{fontspec}: remove its internal counter
%                           (reported by \contributor Till~A. Heilmann <till.heilmann\at unibas.ch>)}
%                           ^^A <http://permalink.gmane.org/gmane.comp.tex.lualatex.devel/668>
%                           ^^A (beta:06)
% Remove \pkg{fontspec}'s internal feature counter.
%    \begin{macrocode}
\def\MT@define@code@key@family#1{%
  \define@key{MT@#1}{family}[]{%
    \@tempcnta=\@ne
    \MT@map@clist@n{##1}{%
      \KV@@sp@def\MT@val{####1}%
      \MT@get@highlevel{family}%
      \ifMT@fontspec
        \edef\x{\edef\noexpand\MT@val{\noexpand\MT@scrubfeature\MT@val()\relax}}\x
      \fi
      \MT@edef@n{MT@tempfamily\the\@tempcnta}{\MT@val}%
      \advance\@tempcnta \@ne
    }%
  }%
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@define@code@key@size}
%\changes{v1.9c}{2006/01/25}{fix: embrace \cs{MT@tempsize} in \cmd\csname\
%                            (bug introduced in v1.9b)}
% \cs{MT@tempsize} must be in a \cmd\csname, so that it is at least
% \cmd\relax, not undefined.
%    \begin{macrocode}
\def\MT@define@code@key@size#1{%
  \define@key{MT@#1}{size}[]{%
    \MT@map@clist@n{##1}{%
      \KV@@sp@def\MT@val{####1}%
      \expandafter\MT@get@range\MT@val--\@nil
      \ifx\MT@val\relax \else
        \MT@exp@cs\MT@xadd{MT@tempsize}%
           {{{\MT@lower}{\MT@upper}{\MT@curr@set@name}}}%
      \fi
    }%
  }%
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@define@code@key@font}
%\changes{v1.9c}{2006/01/25}{fix: context was ignored}
%\changes{v2.5}{2011/09/04}{scrub \pkg{fontspec} feature count
%                           (found by \contributor Meho~R <meho.2005\at gmail.com>)}
%                            ^^A MID: <e16242e2-49cf-47bf-9ab4-66f81ced4c7a@glegroupsg2000goo.googlegroups.com>
%                            ^^A (beta:08)
%    \begin{macrocode}
\def\MT@define@code@key@font#1{%
  \define@key{MT@#1}{font}[]{%
    \MT@map@clist@n{##1}{%
      \KV@@sp@def\MT@val{####1}%
      \MT@ifstreq\MT@val*{\def\MT@val{*/*/*/*/*}}\relax
      \expandafter\MT@get@font@and@size\MT@val/////\@nil
      \ifMT@fontspec
        \edef\@tempb{\expandafter\MT@scrubfeatures\@tempb()\relax}%
      \fi
      \MT@xdef@n{MT@\MT@permutelist @\@tempb\MT@extra@context}%
        {\csname MT@\MT@permutelist @name\endcsname}%
%<debug>\MT@dinfo@nl{1}{initialising: use list for font \@tempb=\MT@val
%<debug>                \ifx\MT@extra@context\@empty\else\MessageBreak
%<debug>                  (context: \MT@extra@context)\fi}%
      \MT@exp@cs\MT@xaddb
        {MT@\MT@permutelist @\@tempb\MT@extra@context @sizes}%
        {{{\MT@val}{\m@ne}{\MT@curr@set@name}}}%
    }%
  }%
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@get@font@and@size}
% Translate any asterisks and split off the size.
%    \begin{macrocode}
\def\MT@get@font@and@size#1/#2/#3/#4/#5/#6\@nil{%
  \MT@get@font@{#1}{#2}{#3}{#4}{#5}{1}%
}
%    \end{macrocode}
%\end{macro}
%    \begin{macrocode}
\MT@define@code@key{encoding}{cfg}
\MT@define@code@key@family   {cfg}
\MT@define@code@key{series}  {cfg}
\MT@define@code@key{shape}   {cfg}
\MT@define@code@key@size     {cfg}
\MT@define@code@key@font     {cfg}
%    \end{macrocode}
%\begin{macro}{\MT@define@opt@key}
%    \begin{macrocode}
\def\MT@define@opt@key#1#2{%
  \define@key{MT@#1@c}{#2}[]{\MT@ifempty{##1}\relax{%
    \MT@xdef@n{MT@#1@c@\MT@curr@set@name @#2}{##1}}}%
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@listname@count}
% The options in the optional first argument.
%    \begin{macrocode}
\newcount\MT@listname@count
\MT@map@clist@c\MT@features{%
%    \end{macrocode}
%\end{macro}
%\changes{v1.9a}{2005/11/21}{`\meta{file name}\texttt{/}\meta{line number}' as default list name}
% Use file name and line number as the list name if the user didn't bother
% to invent one -- also check whether the name already exists (in case more
% than one unnamed list is loaded in the same line, for example
% \cmd\AtBeginDocument).
%\changes{v2.5}{2011/02/26}{fix: check whether `\meta{file}\texttt{/}\meta{line}' list name already exists
%                           (reported by \contributor Till~A. Heilmann <till.heilmann\at unibas.ch>)}
%                           ^^A private mail, 2011/02/25
%                           ^^A (beta:07)
%\changes{v1.3}{2004/10/27}{fix: specifying \texttt{load} option does no
%                           longer require to give a \texttt{name}, too}
%\changes{v2.2}{2007/01/28}{simplify key declarations}
%    \begin{macrocode}
  \define@key{MT@#1@c}{name}[]{%
    \MT@ifempty{##1}{%
      \MT@ifdefined@n@TF{MT@#1@c@\MT@curr@file/\the\inputlineno}{%
        \global\advance\MT@listname@count\@ne
        \MT@edef@n{MT@#1@c@name}{\MT@curr@file/\the\inputlineno
                                 (\number\MT@listname@count)}%
      }{%
        \MT@edef@n{MT@#1@c@name}{\MT@curr@file/\the\inputlineno}%
      }%
    }{%
      \MT@edef@n{MT@#1@c@name}{##1}%
      \MT@ifdefined@n@T{MT@#1@c@\csname MT@#1@c@name\endcsname}{%
        \MT@warning{Redefining \@nameuse{MT@abbr@#1} list `\@nameuse{MT@#1@c@name}'}%
      }%
    }%
    \MT@let@cn\MT@curr@set@name{MT@#1@c@name}%
  }%
  \MT@define@opt@key{#1}{load}%
  \MT@define@opt@key{#1}{factor}%
  \MT@define@opt@key{#1}{preset}%
  \MT@define@opt@key{#1}{inputenc}%
%    \end{macrocode}
% Only one context is allowed. This might change in the future.
%    \begin{macrocode}
  \define@key{MT@#1@c}{context}[]{\MT@ifempty{##1}\relax{\def\MT@extra@context{##1}}}%
}
%</package>
%    \end{macrocode}
% Automatically enable font copying if we find a protrusion or expansion context.
% After the preamble, check whether font copying is enabled.
% For older \pdftex\ versions, disallow.
%\changes{v2.5}{2010/02/27}{allow contexts for \luatex}
% It also works with \luatex\ 0.30 or newer.
%    \begin{macrocode}
%<*pdf-|lua->
%<pdf->\MT@requires@pdftex7{
  \define@key{MT@ex@c}{context}[]{%
    \MT@ifempty{#1}\relax{%
      \MT@glet\MT@copy@font\MT@copy@font@
      \def\MT@extra@context{#1}%
    }%
  }
  \MT@addto@setup{%
    \define@key{MT@ex@c}{context}[]{%
      \ifx\MT@copy@font\MT@copy@font@
        \MT@ifempty{#1}\relax{\def\MT@extra@context{#1}}%
      \else
        \MT@error{\MT@MT\space isn't set up for expansion contexts.\MessageBreak
           Ignoring `context' key\on@line}%
          {Either move the settings inside the preamble,\MessageBreak
           or load the package with the `copyfonts' option.}%
      \fi
    }%
  }
%    \end{macrocode}
% Protrusion contexts \emph{might} also work without copying the font, so we
% don't issue an error but only a warning. The problem is that \pdftex\ only
% allows one set of protrusion factors for a given font within one paragraph
% (those that are in effect at the end of the paragraph will be in effect for
% the whole paragraph). When different fonts are loaded -- like in the example
% with the footnote markers -- we don't need to copy the fonts.
%    \begin{macrocode}
  \define@key{MT@pr@c}{context}[]{%
    \MT@ifempty{#1}\relax{%
      \MT@glet\MT@copy@font\MT@copy@font@
      \def\MT@extra@context{#1}%
    }%
  }
  \MT@addto@setup{%
    \define@key{MT@pr@c}{context}[]{%
      \MT@ifempty{#1}\relax{\def\MT@extra@context{#1}}%
      \ifx\MT@copy@font\MT@copy@font@\else
        \MT@warning@nl{If protrusion contexts don't work as expected,
          \MessageBreak load the package with the `copyfonts' option}%
      \fi
    }%
  }
%</pdf-|lua->
%<*pdf->
}{
  \define@key{MT@ex@c}{context}[]{%
    \MT@error{Expansion contexts only work with pdftex 1.40.4\MessageBreak
        or later. Ignoring `context' key\on@line}%
      {Upgrade pdftex.}%
  }
%</pdf->
%<*pdf-|xe->
  \define@key{MT@pr@c}{context}[]{%
    \MT@error{Protrusion contexts only work with pdftex
%<pdf->        1.40.4\MessageBreak or later.
%<xe->        \MessageBreak or luatex.
        Ignoring `context' key\on@line}%
%<pdf->      {Upgrade pdftex.}%
%<xe->      {Use pdftex or luatex.}%
  }
%</pdf-|xe->
%<pdf->}
%    \end{macrocode}
%\begin{macro}{\MT@warn@nodim}
%    \begin{macrocode}
%<*package>
\def\MT@warn@nodim#1{%
  \MT@warning{`\@tempa' is not a dimension.\MessageBreak
              Ignoring it and setting values relative to\MessageBreak #1}%
}
%    \end{macrocode}
%\end{macro}
%\changes{v1.8}{2005/04/14}{\cs{SetProtrusion}: new key: \texttt{unit}}
%\changes{v1.9}{2005/09/28}{\cs{SetProtrusion}: value `\texttt{relative}' renamed
%                           to `\texttt{character}' for key \texttt{unit}}
%\changes{v2.0}{2006/09/30}{option `\opt{unit}', \cs{SetProtrusion}:
%                           deprecate value `\texttt{relative}' completely}
%\todo{new key for unit: \texttt{dimen} (for \texttt{kerning}, especially)}
% Protrusion codes may be relative to character width, or to any dimension.
%    \begin{macrocode}
\define@key{MT@pr@c}{unit}[character]{%
  \MT@glet@nc{MT@pr@c@\MT@curr@set@name @unit}\@empty
  \def\@tempa{#1}%
  \MT@ifstreq\@tempa{character}\relax{%
%    \end{macrocode}
% Test whether it's a dimension, but do not translate it into its final
% form here, since it may be font-specific.
%    \begin{macrocode}
    \MT@ifdimen\@tempa
      {\MT@glet@nc{MT@pr@c@\MT@curr@set@name @unit}\@tempa}%
      {\MT@warn@nodim{character widths}}%
  }%
}
%    \end{macrocode}
% Tracking may only be relative to a dimension.
%    \begin{macrocode}
\define@key{MT@tr@c}{unit}[1em]{%
  \MT@glet@nc{MT@tr@c@\MT@curr@set@name @unit}\@empty
  \def\@tempa{#1}%
  \MT@ifdimen\@tempa
    {\MT@glet@nc{MT@tr@c@\MT@curr@set@name @unit}\@tempa}%
    {\MT@warn@nodim{1em}%
     \MT@gdef@n{MT@tr@c@\MT@curr@set@name @unit}{1em}}%
}
%</package>
%    \end{macrocode}
% Spacing and kerning codes may additionally be relative to space dimensions.
%    \begin{macrocode}
%<*pdf->
\MT@map@clist@n{sp,kn}{%
  \define@key{MT@#1@c}{unit}[space]{%
    \MT@glet@nc{MT@#1@c@\MT@curr@set@name @unit}\@empty
    \def\@tempa{##1}%
    \MT@ifstreq\@tempa{character}\relax{%
      \MT@glet@nc{MT@#1@c@\MT@curr@set@name @unit}\m@ne
      \MT@ifstreq\@tempa{space}\relax{%
        \MT@ifdimen\@tempa
          {\MT@glet@nc{MT@#1@c@\MT@curr@set@name @unit}\@tempa}%
          {\MT@warn@nodim{width of space}}%
      }%
    }%
  }%
}
%</pdf->
%    \end{macrocode}
% The first argument to \cs{SetExpansion} accepts some more options.
%    \begin{macrocode}
%<*pdf-|lua->
\MT@map@clist@n{stretch,shrink,step}{%
  \define@key{MT@ex@c}{#1}[]{%
    \MT@ifempty{##1}\relax{%
      \MT@ifint{##1}{%
%    \end{macrocode}
% A space terminates the number.
%    \begin{macrocode}
        \MT@gdef@n{MT@ex@c@\MT@curr@set@name @#1}{##1 }%
      }{%
        \MT@warning{%
          Value `##1' for option `#1' is not a number.\MessageBreak
          Ignoring it}%
      }%
    }%
  }%
}
\define@key{MT@ex@c}{auto}[true]{%
  \def\@tempa{#1}%
  \csname if\@tempa\endcsname
%    \end{macrocode}
% Don't use |autoexpand| for \pdftex\ version older than 1.20.
%\changes{v1.7}{2005/03/07}{fix: remove space after \texttt{autoexpand}}
%\changes{v1.7}{2005/03/07}{disallow automatic expansion if \pdftex\ too old}
%\changes{v2.7a}{2017/08/08}{disallow non-automatic expansion with \luatex}
%    \begin{macrocode}
%<pdf->    \MT@requires@pdftex4%
%<lua->    \MT@requires@luatex3\relax
      {\MT@gdef@n{MT@ex@c@\MT@curr@set@name @auto}{autoexpand}}%
%<pdf->      {\MT@warning{pdftex too old for automatic font expansion}}%
  \else
%<pdf->    \MT@requires@pdftex4%
%<*lua->
    \MT@requires@luatex3{%
      \MT@warning{Non-automatic font expansion doesn't work with\MessageBreak
                  luatex}}%
%</lua->
      {\MT@glet@nc{MT@ex@c@\MT@curr@set@name @auto}\@empty}%
%<pdf->      \relax
  \fi
}
%</pdf-|lua->
%    \end{macrocode}
% Tracking: Interword spacing and outer kerning.
% The variant with space just in case \cs{SetTracking} is called inside an
% argument (\eg, to \cmd\IfFileExists).
%    \begin{macrocode}
%<*pdf-|lua-|xe->
\MT@define@opt@key{tr}{spacing}
\MT@define@opt@key{tr}{outerspacing}
\MT@define@opt@key{tr}{outerkerning}
\MT@define@opt@key{tr}{features}
%    \end{macrocode}
% Which ligatures should be disabled?
%    \begin{macrocode}
\define@key{MT@tr@c}{noligatures}[]%
  {\MT@xdef@n{MT@tr@c@\MT@curr@set@name @noligatures}{#1}}
\define@key{MT@tr@c}{outer spacing}[]{\setkeys{MT@tr@c}{outerspacing={#1}}}
\define@key{MT@tr@c}{outer kerning}[]{\setkeys{MT@tr@c}{outerkerning={#1}}}
\define@key{MT@tr@c}{no ligatures}[]{\setkeys{MT@tr@c}{noligatures={#1}}}
%</pdf-|lua-|xe->
%    \end{macrocode}
%
%\subsubsection{Character inheritance}
%
%\begin{macro}{\DeclareCharacterInheritance}
%\changes{v1.1}{2004/09/15}{new command: possibility to specify character inheritance}
%^^A\changes{v1.2}{2004/09/29}{check whether only one encoding specified}
%\changes{v1.9d}{2006/02/09}{fix: empty context}
%\changes{v1.9e}{2006/07/26}{new key `\texttt{inputenc}' to set the input encoding}
%\changes{v2.5}{2010/05/18}{allow more than one encoding}
%\changes{v2.8a}{2021/01/15}{skip settings for tracking}
% This macro may be used in the configuration files to declare characters that
% should inherit protrusion resp. expansion values from other characters. Thus,
% there is no need to define all accented characters (\eg, |\`a|, |\'a|,
% |\^a|, |\~a|, |\"a|, |\r{a}|, |\k{a}|, |\u{a}|), which will make the
% configuration files look much nicer and easier to maintain. If a single
% character of an inheritance list should have a different value, one can
% simply override it.
%\begin{macro}{\MT@inh@feat}
% The optional argument may be used to restrict the list to some features,
%\begin{macro}{\MT@extra@inputenc}
% and to specify an input encoding.
%    \begin{macrocode}
%<*package>
\renewcommand*\DeclareCharacterInheritance[1][]{%
  \let\MT@extra@context\@empty
  \let\MT@extra@inputenc\@undefined
  \let\MT@inh@feat\@empty
  \setkeys{MT@inh@}{#1}%
  \MT@begin@catcodes
  \MT@set@inh@list
}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\MT@set@inh@list}
% No need to create an inheritance list for tracking.
%\changes{v3.0}{2021/03/27}{fix: grouping with \cmd\begingroup~\dots~\cmd\endgroup\ instead of \texttt{\{}\dots\texttt{\}}
%                           (reported by \contributor chsk <@\at @>)}
%                            ^^A https://tex.stackexchange.com/questions/590265/improper-halign-inside-s-with-lmodern-microtype-fontspec
%    \begin{macrocode}
\def\MT@set@inh@list#1#2{%
  \MT@ifempty\MT@inh@feat{%
    \MT@map@clist@c\MT@features{\begingroup
      \MT@ifstreq{##1}{tr}\relax{\MT@declare@char@inh{##1}{#1}{#2}}%
    \endgroup}%
  }{%
    \MT@map@clist@c\MT@inh@feat{\begingroup
      \KV@@sp@def\@tempa{##1}%
      \MT@ifempty\@tempa\relax{%
        \edef\@tempa{\csname MT@rbba@\@tempa\endcsname}%
        \MT@ifstreq\@tempa{tr}\relax{%
          \MT@exp@one@n\MT@declare@char@inh{\@tempa}{#1}{#2}}}%
    \endgroup}%
  }%
  \MT@end@catcodes
}
%    \end{macrocode}
%\changes{v1.9f}{2006/08/09}{fix: forgotten comma in the features list}
%\end{macro}
% The keys for the optional argument.
%    \begin{macrocode}
\MT@map@clist@c\MT@features@long{%
  \define@key{MT@inh@}{#1}[]{\edef\MT@inh@feat{\MT@inh@feat#1,}}}
\define@key{MT@inh@}{inputenc}{\def\MT@extra@inputenc{#1}}
%    \end{macrocode}
%\begin{macro}{\MT@declare@char@inh}
%\todo{share one list between features}
% The lists cannot be given a name by the user.
%    \begin{macrocode}
\def\MT@declare@char@inh#1#2#3{%
  \MT@edef@n{MT@#1@inh@name}%
    {\MT@curr@file/\the\inputlineno (\@nameuse{MT@abbr@#1})}%
  \MT@let@cn\MT@curr@set@name{MT@#1@inh@name}%
  \MT@ifdefined@c@T\MT@extra@inputenc{%
    \MT@xdef@n{MT@#1@inh@\MT@curr@set@name @inputenc}{\MT@extra@inputenc}}%
%<debug>\MT@dinfo{1}{creating inheritance list `\@nameuse{MT@#1@inh@name}'}%
  \MT@gdef@n{MT@#1@inh@\csname MT@#1@inh@name\endcsname}{#3}%
  \def\MT@permutelist{#1@inh}%
  \setkeys{MT@inh}{#2}%
  \MT@permute
}
%    \end{macrocode}
%\end{macro}
% Parse the second argument. \cs{DeclareCharacterInheritance} may also be set
% up for various combinations.
% We can reuse the key setup from the configuration lists
% (|\Set...|).
%    \begin{macrocode}
\MT@define@code@key{encoding}{inh}
\MT@define@code@key@family   {inh}
\MT@define@code@key{series}  {inh}
\MT@define@code@key{shape}   {inh}
\MT@define@code@key@size     {inh}
\MT@define@code@key@font     {inh}
%    \end{macrocode}
%\begin{macro}{\MT@inh@do}
% Now parse the third argument, the inheritance lists. We define the commands
% |\MT@inh@|\meta{name}|@|\meta{slot}|@|, containing the inheriting characters.
% They will also be translated to slot numbers here, to save some time. The
% following will be executed only once, namely the first time this inheritance
% list is encountered (in |\MT@set@|\meta{feature}|@codes|).
%    \begin{macrocode}
\def\MT@inh@do#1,{%
  \ifx\relax#1\@empty \else
    \MT@inh@split #1==\relax
    \expandafter\MT@inh@do
  \fi
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@inh@split}
% Only gather the inheriting characters here. Their codes will actually be set
% in |\MT@set@|\meta{feature}|@codes|.
%    \begin{macrocode}
%</package>
%<*pdf-|lua-|xe->
\def\MT@inh@split#1=#2=#3\relax{%
  \def\@tempa{#1}%
  \ifx\@tempa\@empty \else
    \expandafter\MT@has@inh@prefix\@tempa()\relax\@nil
    \MT@get@slot
%<pdf-|lua->    \ifnum\MT@char > \m@ne
%<xe->    \ifx\MT@char\@empty\else
      \let\MT@val\MT@char
      \MT@map@clist@n{#2}{%
        \def\@tempa{##1}%
        \ifx\@tempa\@empty \else
          \MT@get@slot
%<pdf-|lua->          \ifnum\MT@char > \m@ne
%<xe->          \ifx\MT@char\@empty\else
            \ifx\MT@inh@prefix\@empty
              \MT@exp@cs\MT@xadd{MT@inh@\MT@listname @\MT@val @}{{\MT@char}}%
            \else
              \MT@exp@cs\MT@xadd{MT@inh@\MT@listname @prefixes}%
                  {{{\MT@val}{\MT@char}\MT@inh@prefix@}}%
            \fi
          \fi
        \fi
      }%
%<debug>\MT@dinfo@nl{2}{children of #1 (\MT@val):
%<debug>    \@nameuse{MT@inh@\MT@listname @\ifx\MT@inh@prefix\@empty\MT@val @\else prefixes\fi}}%
    \fi
  \fi
}
%</pdf-|lua-|xe->
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@inh@prefix}
%\begin{macro}{\MT@has@inh@prefix}
% If the inheriting character is preceded by |(|\meta{prefix}|)|, where
% \meta{prefix} is one of |l|, |r| or |lr|, this has a special meaning
% for protrusion. For the other features, we ignore these settings.
%\changes{v3.0}{2021/03/27}{new: automatical protrusion based on char widths difference
%                           (suggested by \contributor Daniel Benjamin Miller <dbmiller\at dbmiller.org>)}
%                            ^^A private mail, 2020/12/24
%    \begin{macrocode}
%<*package>
\def\MT@has@inh@prefix#1(#2)#3#4\@nil{%
  \let\MT@temp\relax
  \ifx\relax#3%
    \def\@tempa{#1#2}%
    \let\MT@inh@prefix\@empty
  \else
    \MT@ifstreq{\MT@feat}{pr}{%
      \MT@ifstreq{#2}{l}{\def\MT@inh@prefix@{{1000}{0}}\@firstoftwo}{%
        \MT@ifstreq{#2}{r}{\def\MT@inh@prefix@{{0}{1000}}\@firstoftwo}{%
          \MT@ifstreq{#2}{lr}{\def\MT@inh@prefix@{{500}{500}}\@firstoftwo}{%
            \MT@warning@nl{`#2' is not a valid prefix in inheritance list%
              \MessageBreak\MT@listname. Ignoring it}%
            \@secondoftwo}}}%
      {\def\@tempa{#3}%
       \def\MT@inh@prefix{#2}%
       \@gobble}%
      {\@firstofone}%
    }{\@firstofone}%
   {\let\MT@char\m@ne
    \let\MT@temp\@gobble
   }%
  \fi
  \MT@temp
}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%
%\subsubsection{Permutation}\label{ssub:permutation}
%
%\begin{macro}{\MT@permute}
%\changes{v1.1}{2004/09/15}{don't use sets for empty encoding}
%\begin{macro}{\MT@permute@}
%\begin{macro}{\MT@permute@@}
%\begin{macro}{\MT@permute@@@}
%\begin{macro}{\MT@permute@@@@}
% Calling \cs{MT@permute} will define commands for all permutations
% of the specified font attributes of the form
% |\MT@|\meta{list type}|@/|\allowbreak
%       \meta{encoding}|/|\allowbreak
%       \meta{family}|/|\allowbreak
%       \meta{series}|/|\allowbreak
%       \meta{shape}|/|\allowbreak
%       \meta{\textbar*}
% to be the expansion of |\MT@|\meta{list type}|@name|, \ie, the name of the
% currently defined list. Size ranges are held in a separate macro called
% |\MT@|\meta{list type}|@/|\allowbreak\meta{font axes}|@sizes|, which in turn
% contains the respective \meta{list name}s attached to the ranges.
% So that,
%\begin{verbatim}
%\SetProtrusion
%   { encoding = U,
%     family   = {euroitc,euroitcs} }
%   { E = {100,50} }
%\SetProtrusion
%   { encoding = U,
%     family   = {euroitc,euroitcs},
%     shape    = it* }
%   { E = {100,} }
%\end{verbatim}
% would yield the following assignments:
%    \begin{macrocode}
\MT@gdef@n{MT@pr@c@U/euroitc///}{euroitc}
\MT@gdef@n{MT@pr@c@U/euroitcs///}{euroitc}
\MT@gdef@n{MT@pr@c@U/euroitc//it/}{euroitci}
\MT@gdef@n{MT@pr@c@U/euroitcs//it/}{euroitci}
\MT@gdef@n{MT@pr@c@euroitc}{E={100,50}}
\MT@gdef@n{MT@pr@c@euroitci}{E={100,}}
\def\MT@permute{%
  \let\MT@cnt@encoding\@ne
  \MT@permute@
%    \end{macrocode}
% Undefine commands for the next round.
%    \begin{macrocode}
  \MT@map@tlist@n{{encoding}{family}{series}{shape}}\MT@permute@reset
  \MT@glet\MT@tempsize\@undefined
}
\def\MT@permute@{%
  \let\MT@cnt@family\@ne
  \MT@permute@@
  \MT@increment\MT@cnt@encoding
  \MT@ifdefined@n@T{MT@tempencoding\MT@cnt@encoding}%
    \MT@permute@
}
\def\MT@permute@@{%
  \let\MT@cnt@series\@ne
  \MT@permute@@@
  \MT@increment\MT@cnt@family
  \MT@ifdefined@n@T{MT@tempfamily\MT@cnt@family}%
    \MT@permute@@
}
\def\MT@permute@@@{%
  \let\MT@cnt@shape\@ne
  \MT@permute@@@@
  \MT@increment\MT@cnt@series
  \MT@ifdefined@n@T{MT@tempseries\MT@cnt@series}%
    \MT@permute@@@
}
\def\MT@permute@@@@{%
  \MT@permute@@@@@
  \MT@increment\MT@cnt@shape
  \MT@ifdefined@n@T{MT@tempshape\MT@cnt@shape}%
    \MT@permute@@@@
}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\MT@permute@@@@@}
%\changes{v1.9a}{2005/12/05}{don't define permutations for unused encodings}
% In order to save some memory, we can ignore unused encodings (inside the
% document).
%    \begin{macrocode}
\def\MT@permute@@@@@{%
  \MT@permute@define{encoding}%
  \ifMT@document
    \ifx\MT@tempencoding\@empty \else
      \MT@ifdefined@n@TF{T@\MT@tempencoding}\relax
        {\expandafter\expandafter\expandafter\@gobble}%
    \fi
  \fi
  \MT@permute@@@@@@
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@permute@@@@@@}
%    \begin{macrocode}
\def\MT@permute@@@@@@{%
  \MT@permute@define{family}%
  \MT@permute@define{series}%
  \MT@permute@define{shape}%
  \edef\@tempa{\MT@tempencoding
              /\MT@tempfamily
              /\MT@tempseries
              /\MT@tempshape
              /\MT@ifdefined@c@T\MT@tempsize *}%
%    \end{macrocode}
%\changes{v1.2}{2004/09/29}{more sanity checks for \cs{SetProtrusion} and
%                          \cs{SetExpansion}}
% Some sanity checks: an encoding must be specified (unless nothing else is).
%    \begin{macrocode}
  \MT@ifstreq\@tempa{////}\relax{%
    \ifx\MT@tempencoding\@empty
      \MT@warning{%
        You have to specify an encoding for\MessageBreak
        \@nameuse{MT@abbr@\MT@permutelist} list
        `\@nameuse{MT@\MT@permutelist @name}'.\MessageBreak
        Ignoring it}%
    \else
      \MT@ifdefined@c@TF\MT@tempsize{%
%    \end{macrocode}
% Add the list of ranges to the beginning of the current combination, after
% checking for conflicts.
%\changes{v1.8}{2005/04/20}{add ranges to the beginning of the lists}
%    \begin{macrocode}
        \MT@ifdefined@n@T{MT@\MT@permutelist @\@tempa\MT@extra@context @sizes}{%
          \MT@map@tlist@c\MT@tempsize\MT@check@rlist
        }%
        \MT@exp@cs\MT@xaddb
          {MT@\MT@permutelist @\@tempa\MT@extra@context @sizes}%
          \MT@tempsize
%<debug>\MT@dinfo@nl{1}{initialising: use list for font \@tempa,\MessageBreak
%<debug>         sizes: \csname MT@\MT@permutelist @\@tempa\MT@extra@context
%<debug>                        @sizes\endcsname}%
      }{%
%    \end{macrocode}
% Only one list can apply to a given combination.
%\changes{v2.7}{2017/07/07}{don't warn for override if conflicting list is loaded}
% But we don't warn if the overridden list is to be loaded by the current one.
%    \begin{macrocode}
        \MT@ifdefined@n@T{MT@\MT@permutelist @\@tempa\MT@extra@context}{%
          \MT@ifstreq{\csname MT@\MT@permutelist @\@tempa\MT@extra@context\endcsname}%
             {\csname MT@\MT@permutelist @\csname MT@\MT@permutelist @name\endcsname @load\endcsname}%
              \relax{%
            \MT@warning{\@nameuse{MT@abbr@\MT@permutelist} list
              `\@nameuse{MT@\MT@permutelist @name}' will\MessageBreak override
              list `\@nameuse{MT@\MT@permutelist @\@tempa\MT@extra@context}'
              for \MessageBreak font `\@tempa'}%
          }%
        }%
%<debug>\MT@dinfo@nl{1}{initialising: use list for font \@tempa
%<debug>                \ifx\MT@extra@context\@empty\else\MessageBreak
%<debug>                  (context: \MT@extra@context)\fi}%
      }%
      \MT@xdef@n{MT@\MT@permutelist @\@tempa\MT@extra@context}%
          {\csname MT@\MT@permutelist @name\endcsname}%
    \fi
  }%
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@permute@define}
% Define the commands.
%    \begin{macrocode}
\def\MT@permute@define#1{%
  \@tempcnta=\csname MT@cnt@#1\endcsname\relax
  \MT@ifdefined@n@TF{MT@temp#1\the\@tempcnta}%
    {\MT@edef@n{MT@temp#1}{\csname MT@temp#1\the\@tempcnta\endcsname}}%
    {\MT@let@nc{MT@temp#1}\@empty}%
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@permute@reset}
% Reset the commands.
%    \begin{macrocode}
\def\MT@permute@reset#1{%
  \@tempcnta=\@ne
  \MT@loop
    \MT@let@nc{MT@temp#1\the\@tempcnta}\@undefined
    \advance\@tempcnta\@ne
    \MT@ifdefined@n@TF{MT@temp#1\the\@tempcnta}%
      \iftrue
      \iffalse
  \MT@repeat
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@check@rlist}
%\changes{v1.8}{2005/04/20}{made recursive}
% For every new range item in \cs{MT@tempsize}, check whether it overlaps with
% ranges in the existing list.
%    \begin{macrocode}
\def\MT@check@rlist#1{\expandafter\MT@check@rlist@ #1}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@check@rlist@}
% Define the current new range and~\dots
%    \begin{macrocode}
\def\MT@check@rlist@#1#2#3{%
  \def\@tempb{#1}%
  \def\@tempc{#2}%
  \MT@if@false
  \MT@exp@cs\MT@map@tlist@c
    {MT@\MT@permutelist @\@tempa\MT@extra@context @sizes}%
    \MT@check@range
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@check@range}
% \dots~recurse through the list of existing ranges.
%    \begin{macrocode}
\def\MT@check@range#1{\expandafter\MT@check@range@ #1}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@check@range@}
% \cmd\@tempb\ and \cmd\@tempc\ are lower resp. upper bound of the new range,
% \meta{\#1} and \meta{\#2} those of the existing range. \meta{\#3} is the list name.
%\changes{v2.7}{2017/07/07}{don't warn for override if conflicting list is loaded}
%    \begin{macrocode}
\def\MT@check@range@#1#2#3{%
  \MT@ifdim{#2}=\m@ne{%
    \MT@ifdim\@tempc=\m@ne{%
%    \end{macrocode}
%\begin{itemize}
%  \item Both items are simple sizes.
%    \begin{macrocode}
      \MT@ifdim\@tempb={#1}\MT@if@true\relax
    }{%
%    \end{macrocode}
%  \item Item in list is a simple size, new item is a range.
%    \begin{macrocode}
      \MT@ifdim\@tempb>{#1}\relax{%
        \MT@ifdim\@tempc>{#1}{%
          \MT@if@true
          \edef\@tempb{#1 (with range: \@tempb\space to \@tempc)}%
        }\relax
      }%
    }%
  }{%
    \MT@ifdim\@tempc=\m@ne{%
%    \end{macrocode}
%  \item Item in list is a range, new item is a simple size.
%    \begin{macrocode}
      \MT@ifdim\@tempb<{#2}{%
        \MT@ifdim\@tempb<{#1}\relax\MT@if@true
      }\relax
    }{%
%    \end{macrocode}
%  \item Both items are ranges.
%    \begin{macrocode}
      \MT@ifdim\@tempb<{#2}{%
        \MT@ifdim\@tempc>{#1}{%
          \MT@if@true
          \edef\@tempb{#1 to #2 (with range: \@tempb\space to \@tempc)}%
        }\relax
      }\relax
    }%
  }%
  \ifMT@if@
    \MT@ifstreq{#3}%
        {\csname MT@\MT@permutelist @\csname MT@\MT@permutelist @name\endcsname @load\endcsname}%
        \relax{%
      \MT@warning{\@nameuse{MT@abbr@\MT@permutelist} list
        `\@nameuse{MT@\MT@permutelist @name}' will override\MessageBreak
        list `#3' for font \@tempa,\MessageBreak size \@tempb}%
    }%
%    \end{macrocode}
% If we've already found a conflict with this item, we can skip the rest of the
% list.
%    \begin{macrocode}
    \expandafter\MT@tlist@break
  \fi
}
%    \end{macrocode}
%\end{itemize}
%\end{macro}
%
%\subsection{Package options}
%
%\subsubsection{Declaring the options}
%
%\begin{macro}{\ifMT@opt@expansion}
%\begin{macro}{\ifMT@opt@auto}
%\begin{macro}{\ifMT@opt@DVI}
% Keep track of whether the user explicitly set these options.
%    \begin{macrocode}
\newif\ifMT@opt@expansion
\newif\ifMT@opt@auto
\newif\ifMT@opt@DVI
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\MT@optwarn@admissible}
% Some warnings.
%    \begin{macrocode}
\def\MT@optwarn@admissible#1#2{%
  \MT@warning@nl{`#1' is not an admissible value for option\MessageBreak
                 `#2'. Assuming `false'}%
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@optwarn@nan}
%    \begin{macrocode}
%</package>
%<*package|letterspace>
%<plain>\MT@requires@latex1{
\def\MT@optwarn@nan#1#2{%
  \MT@warning@nl{Value `#1' for option `#2' is not a\MessageBreak number.
                 Using default value of \number\@nameuse{MT@#2@default}}%
}
%<plain>}\relax
%</package|letterspace>
%<*package>
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@opt@def@set}
%    \begin{macrocode}
\def\MT@opt@def@set#1{%
  \MT@ifdefined@n@TF{MT@\@tempb @set@@\MT@val}{%
    \MT@xdef@n{MT@\@tempb @setname}{\MT@val}%
  }{%
    \MT@xdef@n{MT@\@tempb @setname}{\@nameuse{MT@default@\@tempb @set}}%
    \MT@warning@nl{The #1 set `\MT@val' is undeclared.\MessageBreak
                   Using set `\@nameuse{MT@\@tempb @setname}' instead}%
  }%
}
%    \end{macrocode}
%\end{macro}
% \opt{expansion} and \opt{protrusion} may be |true|, |false|, |compatibility|,
% |nocompatibility| and/or a \meta{set name}.
%\changes{v1.9}{2005/10/06}{fix: use \texttt{true} as the default value}
%    \begin{macrocode}
\MT@map@clist@n{protrusion,expansion}{%
  \define@key{MT}{#1}[true]{%
    \csname MT@opt@#1true\endcsname
    \MT@map@clist@n{##1}{%
      \KV@@sp@def\MT@val{####1}%
      \MT@ifempty\MT@val\relax{%
        \csname MT@#1true\endcsname
        \edef\@tempb{\csname MT@rbba@#1\endcsname}%
        \MT@ifstreq\MT@val{true}\relax
        {%
          \MT@ifstreq\MT@val{false}{%
            \csname MT@#1false\endcsname
          }{%
            \MT@ifstreq\MT@val{compatibility}{%
              \MT@let@nc{MT@\@tempb @level}\@ne
            }{%
              \MT@ifstreq\MT@val{nocompatibility}{%
                \MT@let@nc{MT@\@tempb @level}\tw@
              }{%
%    \end{macrocode}
% If everything failed, it should be a set name.
%    \begin{macrocode}
                \MT@opt@def@set{#1}%
              }%
            }%
          }%
        }%
      }%
    }%
  }%
}
%    \end{macrocode}
% \opt{activate} is a shortcut for \opt{protrusion} and \opt{expansion}.
%\changes{v1.9e}{2006/07/18}{fix: default value for \opt{activate}: \texttt{true}}
%\todo{add \opt{spacing} to \opt{activate}, when the feature has stabilised in \pdftex?} ^^A probably won't happen ...
%    \begin{macrocode}
\define@key{MT}{activate}[true]{%
   \setkeys{MT}{protrusion={#1}}%
   \setkeys{MT}{expansion={#1}}%
}
%    \end{macrocode}
% \opt{spacing}, \opt{kerning} and \opt{tracking} do not have a compatibility level.
%    \begin{macrocode}
\MT@map@clist@n{spacing,kerning,tracking}{%
  \define@key{MT}{#1}[true]{%
    \MT@map@clist@n{##1}{%
      \KV@@sp@def\MT@val{####1}%
      \MT@ifempty\MT@val\relax{%
        \csname MT@#1true\endcsname
        \MT@ifstreq\MT@val{true}\relax
        {%
          \MT@ifstreq\MT@val{false}{%
            \csname MT@#1false\endcsname
          }{%
            \edef\@tempb{\csname MT@rbba@#1\endcsname}%
            \MT@opt@def@set{#1}%
          }%
        }%
      }%
    }%
  }%
}
%    \end{macrocode}
%\changes{v1.5}{2004/12/02}{new option: \opt{selected}, by default false
%               (suggested by \contributor H\`an \thanhthe{} Th\`anh <hanthethanh\at gmx.net>)}
%                                               ^^A private mail, 2004/11/30
%\changes{v2.0}{2005/10/04}{new option: \opt{babel}, by default false
%               (language-dependent setup suggested by \contributor Ulrich Dirr <ud\at art-satz.de>)}
%                                               ^^A private mail, 2005/08/27
%                                               ^^A (beta:1)
%\begin{macro}{\MT@def@bool@opt}
% The |true|/|false| options:
% \opt{draft} (may be inherited from the class options),
% \opt{auto},
% \opt{selected},
% \opt{babel},
% \opt{DVIoutput},
% \opt{defersetup},
% \opt{copyfonts}.
%    \begin{macrocode}
\def\MT@def@bool@opt#1#2{%
  \define@key{MT}{#1}[true]{%
    \def\@tempa{##1}%
    \MT@ifstreq\@tempa{true}\relax{%
      \MT@ifstreq\@tempa{false}\relax{%
        \MT@optwarn@admissible{##1}{#1}%
        \def\@tempa{false}%
      }%
    }%
    #2%
  }%
}
%    \end{macrocode}
%\end{macro}
% Boolean options that only set the switch.
%    \begin{macrocode}
\MT@map@clist@n{draft,selected,babel}{%
  \MT@def@bool@opt{#1}{\csname MT@#1\@tempa\endcsname}}
\MT@def@bool@opt{auto}{\csname MT@auto\@tempa\endcsname \MT@opt@autotrue}
%    \end{macrocode}
% The \opt{DVIoutput} option will change \cmd\pdfoutput\ immediately to minimise
% the risk of confusing other packages.
%\changes{v2.5}{2010/09/17}{disable `\opt{DVIoutput}' option for \xetex} ^^A (beta:03)
%    \begin{macrocode}
%</package>
%<*pdf-|lua-|xe->
%<lua->\MT@requires@luatex4{\let\pdfoutput\outputmode}\relax
\MT@def@bool@opt{DVIoutput}{%
  \csname if\@tempa\endcsname
%<*pdf-|lua->
    \ifnum\pdfoutput>\z@ \MT@opt@DVItrue \fi
    \pdfoutput\z@
  \else
    \ifnum\pdfoutput<\@ne \MT@opt@DVItrue \fi
    \pdfoutput\@ne
%</pdf-|lua->
%<xe->    \MT@warning@nl{Ignoring `DVIoutput' option}%
  \fi
}
%</pdf-|lua-|xe->
%    \end{macrocode}
%\changes{v1.9a}{2005/11/21}{new option: \opt{defersetup}, by default true}
% Setting the \opt{defersetup} option to false will restore the old behaviour,
% where the setup took place at the time when the package was loaded. This is
% \emph{undocumented}, since I would like to learn about the cases where this is
% necessary.
%
% The only problem with the new deferred setup I can think of is when a box
% is being constructed inside the preamble and this box contains a font that is
% not loaded before the box is being used.
%    \begin{macrocode}
%<*package>
\MT@def@bool@opt{defersetup}{%
  \csname if\@tempa\endcsname \else
    \AtEndOfPackage{%
      \MT@setup@
      \let\MT@setup@\@empty
      \let\MT@addto@setup\@firstofone
    }%
  \fi
}
%</package>
%    \end{macrocode}
% \opt{copyfonts} will copy all fonts before setting them up. This allows
% protrusion and expansion with different parameters.
%\changes{v2.2}{2007/07/03}{new option: \opt{copyfonts}}
% This options is also \emph{undocumented} in the hope that we can always find
% out automatically whether it's required.
% It also works with \luatex\ 0.30 or newer.
%    \begin{macrocode}
%<*pdf-|lua->
%<pdf->\MT@requires@pdftex7{
  \MT@def@bool@opt{copyfonts}{%
    \csname if\@tempa\endcsname
      \MT@glet\MT@copy@font\MT@copy@font@
    \else
      \MT@glet\MT@copy@font\relax
    \fi
  }
%<pdf->}{
%</pdf-|lua->
%<*pdf-|xe->
  \MT@def@bool@opt{copyfonts}{%
    \csname if\@tempa\endcsname
      \MT@error
%<pdf->        {The pdftex version you are using is too old\MessageBreak
%<pdf->        to use the `copyfonts' option}{Upgrade pdftex.}%
%<xe->        {The `copyfonts' option does not work with xetex}
%<xe->        {Use pdftex or luatex instead.}%
    \fi
  }
%<pdf->}
%</pdf-|xe->
%    \end{macrocode}
% \opt{final} is the opposite to \opt{draft}.
%\changes{v1.4a}{2004/11/16}{new option: \opt{final}}
% It's only kept for backwards compatibility.
%\changes{v3.0}{2021/08/13}{remove option \opt{final}}
%    \begin{macrocode}
%<*package>
\MT@def@bool@opt{final}{}
%    \end{macrocode}
% The \opt{disable} option replaces the \opt{draft} option,
% which could be inherited from the class options.
% The third value |ifdraft| mimicks this behaviour.
%\changes{v3.0}{2021/08/13}{new option: \opt{disable}, replacing the \texttt{draft} option
%                           (suggested by \contributor Frank Mittelbach <frank.mittelbach\at latex-project.org>)}
%                            ^^A private mail, 2018/07/04
%    \begin{macrocode}
\define@key{MT}{disable}[true]{%
  \def\@tempa{#1}%
  \MT@ifstreq\@tempa{true}\MT@disabletrue{%
    \MT@ifstreq\@tempa{ifdraft}{\ifMT@draft\MT@disabletrue\fi}{%
      \MT@ifstreq\@tempa{false}\relax{%
        \MT@optwarn@admissible{#1}{disable}%
      }%
    }%
  }%
}
%    \end{macrocode}
% For \opt{verbose} output, we redefine \cs{MT@vinfo}.
%\changes{v2.3}{2007/11/05}{turned some warnings into errors}
%    \begin{macrocode}
\define@key{MT}{verbose}[true]{%
  \let\MT@vinfo\MT@info@nl
  \def\@tempa{#1}%
  \MT@ifstreq\@tempa{true}\relax{%
%    \end{macrocode}
%\changes{v1.7}{2005/03/16}{new value for \opt{verbose} option: \texttt{errors}}
% Take problems seriously.
%    \begin{macrocode}
    \MT@ifstreq\@tempa{errors}{%
      \let\MT@warning   \MT@warn@err
      \let\MT@warning@nl\MT@warn@err
    }{%
      \let\MT@vinfo\@gobble
%    \end{macrocode}
%\changes{v2.3}{2007/11/05}{new value for \opt{verbose} option: \texttt{silent}
%                           (suggested by \contributor Karl Berry <karl\at freefriends.org>)}
%                                                              ^^A private mail, 2007/11/05
% Cast warnings to the winds.
%    \begin{macrocode}
      \MT@ifstreq\@tempa{silent}{%
        \let\MT@warning   \MT@info
        \let\MT@warning@nl\MT@info@nl
      }{%
        \MT@ifstreq\@tempa{false}\relax{\MT@optwarn@admissible{#1}{verbose}}%
      }%
    }%
  }%
}
%</package>
%    \end{macrocode}
%\changes{v1.5}{2004/12/02}{defaults: \opt{step}: 4
%               (suggested by \contributor H\`an \thanhthe{} Th\`anh <hanthethanh\at gmx.net>)}
%                                               ^^A private mail, 2004/11/30
%\changes{v1.6}{2004/12/18}{new option: \opt{factor}, by default 1000}
%\changes{v2.0}{2005/09/21}{new option: \opt{letterspace}, by default 100} ^^A (beta:1)
%^^A\changes{v2.0}{2007/01/05}{option `\texttt{letterspacing}' renamed to `\opt{letterspace}'}
% Options with numerical keys:
%   \opt{factor},
%   \opt{stretch},
%   \opt{shrink},
%   \opt{step},
%   \opt{letterspace}.
%    \begin{macrocode}
%<*package|letterspace>
%<plain>\MT@requires@latex1{
\MT@map@clist@n{%
%<package>    stretch,shrink,step,%
    letterspace}{%
  \define@key{MT}{#1}[\csname MT@#1@default\endcsname]{%
    \def\@tempa{##1 }%
%    \end{macrocode}
% No nonsense in \cs{MT@factor} et al.?
%\changes{v1.6}{2005/01/06}{test whether numeric options receive a number}
% A space terminates the number.
%    \begin{macrocode}
    \MT@ifint\@tempa
      {\MT@edef@n{MT@#1}{\@tempa}}%
      {\MT@optwarn@nan{##1}{#1}}%
  }%
}
%<plain>}\relax
%</package|letterspace>
%    \end{macrocode}
% \opt{factor} will define the protrusion factor only.
%    \begin{macrocode}
%<*package>
\define@key{MT}{factor}[\MT@factor@default]{%
  \def\@tempa{#1 }%
  \MT@ifint\@tempa
    {\edef\MT@pr@factor{\@tempa}}
    {\MT@optwarn@nan{#1}{factor}}%
}
%    \end{macrocode}
% Unit for protrusion codes.
%\changes{v1.8}{2005/04/14}{new option: \opt{unit}, by default \texttt{character}}
%\changes{v1.9}{2005/09/28}{option \opt{unit}: rename value \texttt{relative} to \texttt{character}}
%    \begin{macrocode}
\define@key{MT}{unit}[character]{%
  \def\@tempa{#1}%
  \MT@ifstreq\@tempa{character}\relax{%
    \MT@ifdimen\@tempa
      {\let\MT@pr@unit\@tempa}%
      {\MT@warning@nl{`\@tempa' is not a dimension.\MessageBreak
              Ignoring it and setting values relative to\MessageBreak
              character widths}}%
  }%
}
%    \end{macrocode}
%\changes{v3.0}{2021/05/22}{new options: \opt{patch} and \opt{nopatch}}
%\begin{macro}{\MT@patches@list}
%\begin{macro}{\MT@nopatches@list}
% The \opt{patch} and \opt{nopatch} options.
% Remember chosen option for later (\cmd\relax\ means `all',
% \cmd\@empty\ means `none').
%    \begin{macrocode}
\let\MT@patches@list\relax
\let\MT@nopatches@list\@empty
%    \end{macrocode}
%\end{macro}
%\end{macro}
%    \begin{macrocode}
\define@key{MT}{patch}[all]{%
  \def\@tempa{#1}%
  \MT@ifstreq\@tempa{all}
    \relax
    {\MT@ifstreq\@tempa{none}
      {\let\MT@patches@list\@empty}
      {\def\MT@patches@list{#1}}}%
}
\define@key{MT}{nopatch}[all]{%
  \def\@tempa{#1}%
  \MT@ifstreq\@tempa{all}
    {\let\MT@nopatches@list\relax}
    {\MT@ifstreq\@tempa{none}
      \relax
      {\def\MT@nopatches@list{#1}}}%
}
%    \end{macrocode}
% We can only apply the patches AtBeginDocument.
%    \begin{macrocode}
\MT@addto@setup{%
  \ifx\MT@patches@list\relax
    \let\MT@patches@list\MT@patches@def
  \fi
  \ifx\MT@nopatches@list\@empty\else
    \ifx\MT@nopatches@list\relax
      \let\MT@nopatches@list\MT@patches@def
    \fi
    \MT@map@clist@c\MT@nopatches@list{%
      \MT@rem@from@clist{#1}\MT@patches@list}%
  \fi
  \ifx\MT@patches@list\@empty\else
^^X    \MT@map@clist@c\MT@patches@list{\MT@apply@patch{#1}}%
^^Q    \MT@warning@nl{Patches require the etex extensions. Ignoring them}%
  \fi
}
%    \end{macrocode}
%
%\subsubsection{Loading the definition file}\label{ssub:def-files}
%
% Load the engine-specific code (as strewn across this file).
%\begin{macro}{\MT@get@MT@version}
%\begin{macro}{\MT@version}
%\begin{macro}{\MT@check@MT@version}
%\changes{v3.1b}{2023/03/14}{check if \texttt{.sty} and \texttt{.def} (and \texttt{.lua}) file versions match}
% We also check whether versions are the same.
%    \begin{macrocode}
\def\MT@get@MT@version#1 #2 #3\@nil{#1 #2}
\edef\MT@version{\expandafter\expandafter\expandafter\MT@get@MT@version
  \csname ver@\MT@MT.sty\endcsname\@nil}
\def\MT@check@MT@version#1#2{%
  \MT@ifstreq\MT@version{#1}{}{%
    \MT@warning@nl{Mismatching file versions:\MessageBreak
       \MT@MT.sty provides:\MessageBreak`\MT@version',\MessageBreak
       whereas #2 provides:\MessageBreak`#1'.\MessageBreak
       Please fix your installation}}}
\input{\MT@MT-\MT@engine tex.def}
\edef\@tempa{\expandafter\expandafter\expandafter\MT@get@MT@version
  \csname ver@\MT@MT-\MT@engine tex.def\endcsname\@nil}
\MT@check@MT@version\@tempa{\MT@MT-\MT@engine tex.def}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%
% \subsubsection{Reading the configuration file}
%
% The package should just work if called without any options. Therefore,
% expansion will be switched off by default if output is <DVI>, since it isn't
% likely that expanded fonts are available. (This grows more important as
% modern \TeX\ systems have switched to the \pdftex\ engine even for <DVI>
% output, so that the user might not even be aware of the fact that she's
% running \pdftex.)
%    \begin{macrocode}
\MT@protrusiontrue
%</package>
%<*pdf-|lua->
\ifnum\pdfoutput<\@ne \else
%    \end{macrocode}
% Also, we only enable expansion by default if \pdftex\ can expand the fonts
% automatically.
%\changes{v1.6}{2004/12/23}{defaults: turn off expansion for old \pdftex\ versions}
%    \begin{macrocode}
%<pdf->  \MT@requires@pdftex4{
    \MT@expansiontrue
%<pdf->    \MT@autotrue
%<pdf->  }\relax
\fi
%<lua->\MT@autotrue
%</pdf-|lua->
%    \end{macrocode}
% The main configuration file will be loaded before processing the package
% options.
%\changes{v1.8}{2005/05/15}{new option: \opt{config} to load a different main
%                           configuration file}
%\begin{macro}{\MT@config@file}
% However, the \opt{config} option must of course be evaluated beforehand.
% We also have to define a no-op for the regular option processing later.
%    \begin{macrocode}
%<*package>
\define@key{MT}{config}[]{\relax}
\def\MT@temp#1config=#2,#3\@nil{%
  \MT@ifempty{#2}%
    {\def\MT@config@file{\MT@MT.cfg}}%
    {\def\MT@config@file{#2.cfg}}%
}
\expandafter\expandafter\expandafter\MT@temp
  \csname opt@\@currname.\@currext\endcsname,config=,\@nil
%    \end{macrocode}
%\end{macro}
%\changes{v1.4b}{2004/11/25}{fix: set catcodes before reading global configuration file
%                (reported by \contributor Christoph Bier <christoph.bier\at web.de>)}
%                                           ^^A MID: <30k2tqF30v483U1@uni-berlin.de>
% Load the file.
%    \begin{macrocode}
\IfFileExists{\MT@config@file}{%
  \MT@info@nl{Loading configuration file \MT@config@file}%
  \MT@begin@catcodes
    \let\MT@begin@catcodes\relax
    \let\MT@end@catcodes\relax
    \let\MT@curr@file\MT@config@file
    \input{\MT@config@file}%
  \endgroup
}{\MT@warning@nl{%
    Could not find configuration file `\MT@config@file'!\MessageBreak
    This will almost certainly cause undesired results.\MessageBreak
    Please fix your installation}%
}
%    \end{macrocode}
%\begin{macro}{\MT@check@active@set}
% We have to make sure that font sets are active. If the user didn't activate
% any, we use those sets declared by \cs{DeclareMicrotypeSetDefault} (this
% is done at the end of the preamble).
%    \begin{macrocode}
\def\MT@check@active@set#1{%
  \MT@ifdefined@n@TF{MT@#1@setname}{%
    \MT@info@nl{Using \@nameuse{MT@abbr@#1} set `\@nameuse{MT@#1@setname}'}%
  }{%
    \MT@ifdefined@n@TF{MT@default@#1@set}{%
      \MT@glet@nn{MT@#1@setname}{MT@default@#1@set}%
      \MT@info@nl{Using default \@nameuse{MT@abbr@#1} set `\@nameuse{MT@#1@setname}'}%
    }{%
%    \end{macrocode}
% If no default font set has been declared in the main configuration file,
% we use the (empty, non-existent) set `|@|',
%\changes{v2.3d}{2008/11/24}{warning for missing default sets}
% and issue a warning.
%    \begin{macrocode}
      \MT@gdef@n{MT@#1@setname}{@}%
      \MT@warning@nl{No \@nameuse{MT@abbr@#1} set chosen, no default set declared.
                     \MessageBreak Using empty set}%
    }%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\subsubsection{Hook for other packages}\label{sub:hook}
%
% {\let\special@index\index\SpecialIndex@{\Microtype@Hook}{\encapchar hyperpage}}
%\begin{macro}{\Microtype@Hook}
%\changes{v1.7}{2005/03/22}{new command for font package authors}
% This hook may be used by font package authors, \eg, to declare alias fonts. If
% it is defined, it will be executed here, \ie, after the main configuration
% file has been loaded, and before the package options are evaluated.
%
% This hook was needed in versions prior to 1.9a to overcome the situation that
% (1)~the \microtype\ package should be loaded after all font defaults have
% been set up (hence, using \cmd\@ifpackageloaded\ in the font package was not
% viable), and (2)~checking \cmd\AtBeginDocument\ could be too late, since
% fonts might already have been loaded, and consequently set up, in the
% preamble. With the new deferred setup, one could live without this command,
% however, it remains here since it's simpler than testing whether the package
% was loaded both in the preamble as well as at the beginning of the document
% (which is what one would have to do).
%
% Package authors should check whether the command is already defined so that
% existing definitions by other packages aren't overwritten. Example:
%\begin{verbatim}
%\def\MinionPro@MT@Hook{\DeclareMicrotypeAlias{MinionPro-LF}{MinionPro}}
%\@ifpackageloaded{microtype}
%  \MinionPro@MT@Hook
%  {\@ifundefined{Microtype@Hook}
%    {\let\Microtype@Hook\MinionPro@MT@Hook}
%    {\g@addto@macro\Microtype@Hook{\MinionPro@MT@Hook}}}
%\end{verbatim}
% \orig@cs{MicroType@Hook} with a capital |T| (which only existed in version 1.7)
% is now officially deprecated.
%    \begin{macrocode}
\MT@ifdefined@c@T\MicroType@Hook{\MT@error{%
  Command \@backslashchar MicroType@Hook is deprecated.\MessageBreak
  Use \@backslashchar Microtype@Hook instead}
  {You might want to inform the font package authors.}\MicroType@Hook}
\MT@ifdefined@c@T\Microtype@Hook\Microtype@Hook
%    \end{macrocode}
%\end{macro}
%
%\subsubsection{Changing options later}
%
%\begin{macro}{\microtypesetup}
%\changes{v1.4}{2004/11/04}{fix: set the correct levels, and remember them;
%                           warning when enabling an option disabled in package options}
%\changes{v1.7}{2005/02/17}{fix: warning also when setting to \texttt{(no)compatibility}}
%\changes{v1.9a}{2005/11/21}{inside the preamble, accepts all package options}
%\changes{v2.3d}{2009/03/05}{select font after setup}
%\changes{v3.2}{2024/04/24}{make robust}
%\begin{macro}{\MT@define@optionX}
% Inside the preamble, \cs{microtypesetup} accepts the same options as the
% package (unless \opt{defersetup}|=false|).
% In the document body, it accepts the options:
% |protrusion|, |expansion|, |activate|, |tracking|, |spacing| and |kerning|
% (but specifying font sets is not allowed), and |patch| and |nopatch|.
%    \begin{macrocode}
\DeclareRobustCommand\microtypesetup{\setkeys{MT}}
\MT@addto@setup{\DeclareRobustCommand\microtypesetup[1]{\setkeys{MTX}{#1}\selectfont}}
%</package>
%<*pdf-|lua-|xe->
\def\MT@define@optionX#1#2{%
  \define@key{MTX}{#1}[true]{%
    \edef\@tempb{\csname MT@rbba@#1\endcsname}%
    \MT@map@clist@n{##1}{%
      \KV@@sp@def\MT@val{####1}%
      \MT@ifempty\MT@val\relax{%
        \@tempcnta=\m@ne
        \MT@ifstreq\MT@val{true}{%
%    \end{macrocode}
% Enabling micro-typography in the middle of the document is not allowed if it
% has been disabled in the package options since fonts might already have been
% loaded and hence wouldn't be set up.
%    \begin{macrocode}
          \MT@checksetup{#1}{%
            \@tempcnta=\csname MT@\@tempb @level\endcsname
            \MT@vinfo{Enabling #1
                    (level \number\csname MT@\@tempb @level\endcsname)\on@line}%
          }%
        }{%
          \MT@ifstreq\MT@val{false}{%
            \@tempcnta=\z@
            \MT@vinfo{Disabling #1\on@line}%
          }{%
            \MT@ifstreq\MT@val{compatibility}{%
              \MT@checksetup{#1}{%
                \@tempcnta=\@ne
                \MT@let@nc{MT@\@tempb @level}\@ne
                \MT@vinfo{Setting #1 to level 1\on@line}%
              }%
            }{%
              \MT@ifstreq\MT@val{nocompatibility}{%
                \MT@checksetup{#1}{%
                  \@tempcnta=\tw@
                  \MT@let@nc{MT@\@tempb @level}\tw@
                  \MT@vinfo{Setting #1 to level 2\on@line}%
                }%
              }{\MT@error{Value `\MT@val' for key `#1' not recognised}
                         {Use any of `true', `false', `compatibility' or
                          `nocompatibility'.}%
              }%
            }%
          }%
        }%
        \ifnum\@tempcnta>\m@ne
          #2\@tempcnta\relax
        \fi
      }%
    }%
  }%
}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\begin{macro}{\MT@checksetup}
% Test whether the feature wasn't disabled in the package options.
%    \begin{macrocode}
\def\MT@checksetup#1{%
  \csname ifMT@#1\endcsname
    \expandafter\@firstofone
  \else
    \MT@error{You cannot enable #1 if it was disabled\MessageBreak
              in the package options}{Load microtype with #1 enabled.}%
    \expandafter\@gobble
  \fi
}
%    \end{macrocode}
%\end{macro}
%    \begin{macrocode}
\MT@define@optionX{protrusion}\MT@protrudechars
%<*pdf-|lua->
\MT@define@optionX{expansion}\MT@adjustspacing
%    \end{macrocode}
%\begin{macro}{\MT@protrudechars}
%\begin{macro}{\MT@adjustspacing}
%    \begin{macrocode}
%<*lua->
\MT@requires@luatex4{
  \let\pdfprotrudechars\protrudechars
  \let\pdfadjustspacing\adjustspacing
}\relax
%</lua->
\let\MT@protrudechars\pdfprotrudechars
\let\MT@adjustspacing\pdfadjustspacing
%</pdf-|lua->
%<*xe->
\let\MT@protrudechars\XeTeXprotrudechars
\define@key{MTX}{expansion}[true]{\MT@warning{Ignoring expansion setup}}
%</xe->
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\begin{macro}{\MT@define@optionX@}
% The same for |tracking|, |spacing| and |kerning|, which do not have a
% |compatibility| level.
%    \begin{macrocode}
%<pdf->\MT@requires@pdftex6{
%<lua->\MT@requires@luatex3{
  \def\MT@define@optionX@#1#2{%
    \define@key{MTX}{#1}[true]{%
      \MT@map@clist@n{##1}{%
        \KV@@sp@def\MT@val{####1}%
        \MT@ifempty\MT@val\relax{%
          \@tempcnta=\m@ne
          \MT@ifstreq\MT@val{true}{%
            \MT@checksetup{#1}{%
              \@tempcnta=\@ne
              \MT@vinfo{Enabling #1\on@line}%
            }%
          }{%
            \MT@ifstreq\MT@val{false}{%
              \@tempcnta=\z@
              \MT@vinfo{Disabling #1\on@line}%
            }{\MT@error{Value `\MT@val' for key `#1' not recognised}
                       {Use either `true' or `false'}%
            }%
          }%
          \ifnum\@tempcnta>\m@ne
            #2\relax
          \fi
        }%
      }%
    }%
  }
%    \end{macrocode}
%\end{macro}
% We cannot simply let \cs{MT@tracking} relax, since this may select the already
% letterspaced font instance.
%    \begin{macrocode}
  \MT@define@optionX@{tracking}{\ifnum\@tempcnta=\z@ \let\MT@tracking\MT@set@tr@zero
                                \else \let\MT@tracking\MT@tracking@ \fi}
%<pdf->  \MT@define@optionX@{spacing}{\pdfadjustinterwordglue\@tempcnta}
%<pdf->  \MT@define@optionX@{kerning}{\pdfprependkern\@tempcnta
%<pdf->                               \pdfappendkern\@tempcnta}
%<pdf-|lua->}{
%    \end{macrocode}
% Disable for older \pdftex\ versions and for \xetex\ and \luatex.
%    \begin{macrocode}
%<pdf-|lua->\define@key{MTX}{tracking}[true]{\MT@warning{Ignoring tracking setup}}
%<lua->}
\define@key{MTX}{kerning}[true]{\MT@warning{Ignoring kerning setup}}
\define@key{MTX}{spacing}[true]{\MT@warning{Ignoring spacing setup}}
%<pdf->}
\define@key{MTX}{activate}[true]{%
  \setkeys{MTX}{protrusion={#1}}%
%<pdf-|lua->  \setkeys{MTX}{expansion={#1}}%
}
%</pdf-|lua-|xe->
%    \end{macrocode}
%\begin{macro}{\MT@saved@setupfont}
% Disable everything -- may be used as a temporary work-around in case
% setting up fonts doesn't work under certain circumstances, but only until
% that specific problem is fixed. These options are \emph{undocumented}, as they
% completely deprive us of the possibility to act -- we're blind and paralysed.
%    \begin{macrocode}
%<*package>
\let\MT@saved@setupfont\MT@setupfont
%    \end{macrocode}
%\end{macro}
%    \begin{macrocode}
\define@key{MTX}{deactivate}[]{%
  \MT@info{Deactivate `\MT@MT' package}%
  \let\MT@setupfont\relax
}
\define@key{MTX}{reactivate}[]{%
  \MT@info{Reactivate `\MT@MT' package}%
  \let\MT@setupfont\MT@saved@setupfont
}
%    \end{macrocode}
% Apply or revert patches.
%\changes{v3.0a}{2021/11/29}{allow \cmd\microtypesetup\texttt{\{(no)patch\quotechar=all\}}}
%    \begin{macrocode}
\define@key{MTX}{patch}[all]{%
  \def\@tempa{#1}%
  \MT@ifstreq\@tempa{all}
    {\let\@tempa\MT@patches@def}
    {\MT@ifstreq\@tempa{none}
      {\let\@tempa\@empty}
      \relax}%
  \ifx\@tempa\@empty\else
^^X    \MT@map@clist@c\@tempa{\MT@apply@patch{##1}}%
^^Q    \MT@warning@nl{Patches require the etex extensions. Ignoring them}%
  \fi
}
\define@key{MTX}{nopatch}[all]{%
  \def\@tempa{#1}%
  \MT@ifstreq\@tempa{all}
    {\let\@tempa\MT@patches@def}
    {\MT@ifstreq\@tempa{none}
      {\let\@tempa\@empty}
      \relax}%
  \ifx\@tempa\@empty\else
^^X    \MT@map@clist@c\@tempa{\MT@undo@patch{##1}}%
  \fi
}
%</package>
%    \end{macrocode}
%
%\subsubsection{Processing the options}\label{ssub:impl.options}
%
%\begin{macro}{\MT@ProcessOptionsWithKV}
% Parse options.
%    \begin{macrocode}
%<*package|letterspace>
%<plain>\MT@requires@latex1{
\def\MT@ProcessOptionsWithKV#1{%
  \let\@tempc\relax
  \let\MT@temp\@empty
%<plain>  \MT@requires@latex2{
    \MT@map@clist@c\@classoptionslist{%
      \def\CurrentOption{##1}%
      \MT@ifdefined@n@T{KV@#1@\expandafter\MT@getkey\CurrentOption=\@nil}{%
        \edef\MT@temp{\MT@temp,\CurrentOption,}%
        \@expandtwoargs\@removeelement\CurrentOption
          \@unusedoptionlist\@unusedoptionlist
      }%
    }%
    \edef\MT@temp{\noexpand\setkeys{#1}%
                    {\MT@temp\@ptionlist{\@currname.\@currext}}}%
%    \end{macrocode}
% \pkg{eplain} can handle package options.
%    \begin{macrocode}
%<*plain>
  }{\edef\MT@temp{\noexpand\setkeys{#1}%
                    {\csname usepkg@options@\usepkg@pkg\endcsname}}}
%</plain>
  \MT@temp
  \MT@clear@options
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@getkey}
% For |key=val| in class options.
%\changes{v2.3a}{2008/02/09}{fix: \texttt{key\quotechar=val} in class options list}
%    \begin{macrocode}
\def\MT@getkey#1=#2\@nil{#1}
%    \end{macrocode}
%\end{macro}
%    \begin{macrocode}
\MT@ProcessOptionsWithKV{MT}
%<plain>}\relax
%</package|letterspace>
%<*package>
%    \end{macrocode}
% Now we can take the appropriate actions. We also tell the log file which
% options the user has chosen (in case it's interested).
%    \begin{macrocode}
\MT@addto@setup{%
\ifMT@disable
%    \end{macrocode}
% We disable most of what we've just defined in the \arabic{CodelineNo} lines
% above if we are running in disable (aka. draft) mode.
%\changes{v1.7}{2005/02/06}{warning when running in draft mode}
%    \begin{macrocode}
  \MT@warning@nl{The `disable' option is in effect.\MessageBreak
                 Disabling all micro-typographic extensions.\MessageBreak
                 This might lead to different line and page breaks}%
  \let\MT@setupfont\relax
  \renewcommand*\LoadMicrotypeFile[1]{}%
  \renewcommand*\microtypesetup[1]{}%
  \renewcommand*\microtypecontext[1]{}%
  \renewcommand*\lsstyle{}%
\else
  \MT@setup@PDF
  \MT@setup@copies
%    \end{macrocode}
% Fix the font sets.
%    \begin{macrocode}
  \MT@map@tlist@c\MT@font@sets\MT@fix@font@set
  \MT@setup@protrusion
  \MT@setup@expansion
  \MT@setup@tracking
  \MT@setup@warntracking
  \MT@setup@spacing
  \MT@setup@kerning
  \MT@setup@noligatures
}
%</package>
%    \end{macrocode}
%\begin{macro}{\MT@setup@PDF}
% \pdftex\ can create <DVI> output, too. However, both the <DVI> viewer and
% |dvips| need to find actual fonts. Therefore, expansion will only work if the
% fonts for different degrees of expansion are readily available.
%
%\changes{v1.4b}{2004/11/19}{new message if \cmd\pdfoutput\ is changed}
% Some packages depend on the value of \cmd\pdfoutput\ and will get confused if
% it is changed after they have been loaded. These packages are, among others:
% \pkg{color}, \pkg{graphics}, \pkg{hyperref}, \pkg{crop}, \pkg{contour},
% \pkg{pstricks} and, as a matter of course, \pkg{ifpdf}. Instead of testing
% for each package (that's not our job), we only say that it was \microtype\
% that changed it. This must be sufficient!
%    \begin{macrocode}
%<*pdf-|lua->
\def\MT@setup@PDF{%
  \MT@info@nl{Generating \ifnum\pdfoutput<\@ne DVI \else PDF \fi output%
              \ifMT@opt@DVI\space (changed by \MT@MT)\fi}%
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@setup@copies}
% Working on font copies?
%    \begin{macrocode}
\def\MT@setup@copies{%
  \ifx\MT@copy@font\relax\else \MT@info@nl{Using font copies for contexts}\fi
}
%</pdf-|lua->
%<*xe->
\let\MT@setup@PDF\relax
\let\MT@setup@copies\relax
%</xe->
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@setup@protrusion}
% Protrusion.
%    \begin{macrocode}
%<*pdf-|lua-|xe->
\def\MT@setup@protrusion{%
  \ifMT@protrusion
    \edef\MT@active@features{\MT@active@features,pr}%
    \MT@protrudechars\MT@pr@level
    \MT@info@nl{Character protrusion enabled (level \number\MT@pr@level)%
      \ifnum\MT@pr@factor=\MT@factor@default \else,\MessageBreak
        factor: \number\MT@pr@factor\fi
      \ifx\MT@pr@unit\@empty \else,\MessageBreak unit: \MT@pr@unit\fi}%
    \MT@check@active@set{pr}%
  \else
    \let\MT@protrusion\relax
    \MT@info@nl{No character protrusion}%
  \fi
}
%</pdf-|lua-|xe->
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@setup@expansion}
% For <DVI> output, the user must have explicitly passed the \opt{expansion}
% option to the package.
%\changes{v1.5}{2004/12/02}{defaults: turn off expansion for <DVI> output}
% Under \luatex, expansion works quite differently: the glyphs will be
% positioned as if they were transformed, without actually being transformed.
% Since this could still be considered a viable option, we don't disable
% the feature completely, but issue a warning.
%\changes{v2.8}{2020/02/09}{warning when expanding in <DVI> mode with \luatex\
%                           (reported by \contributor Daniel Benjamin Miller <dbmiller\at dbmiller.org>)} ^^A aka `d909'
%                           ^^A https://tex.stackexchange.com/questions/531413/dvipdfmx-and-dvips-do-not-expand-fonts-properly-with-lualatex-in-dvi-mode
%    \begin{macrocode}
%<*pdf-|lua->
\def\MT@setup@expansion{%
  \ifnum\pdfoutput<\@ne
    \ifMT@opt@expansion
%<*lua->
      \ifMT@expansion
        \MT@requires@luatex3{%
          \MT@warning@nl{Font expansion doesn't work properly with luatex in\MessageBreak
             DVI mode: the glyphs won't be actually transformed,\MessageBreak
             but will only be shifted. You might want to use\MessageBreak
             pdflatex instead. I'll continue anyway ..}%
          %\MT@expansionfalse
        }\relax
      \fi
%</lua->
    \else
      \MT@expansionfalse
    \fi
  \fi
  \ifMT@expansion
%    \end{macrocode}
% Set up the values for font expansion: if \opt{stretch} has not been specified, we
% take the default value of 20.
%    \begin{macrocode}
    \ifnum\MT@stretch=\m@ne
      \let\MT@stretch\MT@stretch@default
    \fi
%    \end{macrocode}
% If \opt{shrink} has not been specified, it will inherit the value from \opt{stretch}.
%    \begin{macrocode}
    \ifnum\MT@shrink=\m@ne
      \let\MT@shrink\MT@stretch
    \fi
%    \end{macrocode}
%\changes{v2.3d}{2008/11/19}{default \texttt{step}: 1 for \pdftex\ versions $\geq$ 1.40}
% If \opt{step} has not been specified, we will just set it to 1 for recent
% \pdftex\ versions. My tests did not show much difference neither in
% compilation time (within the margin of error) nor in file size (less than
% 1\% difference for \file{microtype.pdf} with |step=1| compared to |step=5|).
%\changes{v1.5}{2004/12/02}{defaults: calculate \opt{step} as
%                           min(\texttt{stretch},\texttt{shrink})/5}
% With older versions, we set it to min(\opt{stretch},\opt{shrink})/5,
% rounded off, minimum value 1.
%\changes{v1.9}{2005/07/08}{warning if user requested zero \opt{step}}
%    \begin{macrocode}
    \ifnum\MT@step=\m@ne
%<pdf->    \MT@requires@pdftex6{%
      \def\MT@step{1 }%
%<*pdf->
    }{%
      \ifnum\MT@stretch>\MT@shrink
        \ifnum\MT@shrink=\z@
          \@tempcnta=\MT@stretch
        \else
          \@tempcnta=\MT@shrink
        \fi
      \else
        \ifnum\MT@stretch=\z@
          \@tempcnta=\MT@shrink
        \else
          \@tempcnta=\MT@stretch
        \fi
      \fi
      \divide\@tempcnta 5\relax
      \ifnum\@tempcnta=\z@ \@tempcnta=\@ne \fi
      \edef\MT@step{\number\@tempcnta\space}%
    }%
%</pdf->
    \fi
    \ifnum\MT@step=\z@
      \MT@warning@nl{The expansion step cannot be set to zero.\MessageBreak
          Setting it to one}%
      \def\MT@step{1 }%
    \fi
%    \end{macrocode}
%\begin{macro}{\MT@auto}
% Automatic expansion of the font? This new feature of \pdftex\ 1.20 makes the
% \textit{\fontfamily{pzc}\selectfont hz}~programme really usable.
% It must be either `|autoexpand|' or empty (or `|1000|' for older versions of
% \pdftex).
%\changes{v2.7a}{2017/07/18}{with \luatex, non-automatic font expansion is no longer possible
%                            (as confirmed by \contributor Hans Hagen <pragma\at wxs.nl>)}
%                             ^^A http://tug.org/pipermail/luatex/2017-July/006579.html and following
% With \luatex, we just leave it empty, as there's actually no difference --
% non-automatic font expansion doesn't work anymore.
%\changes{v2.7a}{2017/11/01}{remove `\texttt{autoexpand}' for \luatex\ 1.0.6
%                            (reported by \contributor Ulrike Fischer <news3\at nililand.de>)}
%                            ^^A private mail, 2017/10/29
% In \luatex\ 1.0.6, the `|autoexpand|' option seems to have been removed altogether
% and would trigger a warning.
%    \begin{macrocode}
    \let\MT@auto\@empty
    \ifMT@auto
%    \end{macrocode}
%\end{macro}
% We turn off automatic expansion if output mode is <DVI>.
%\changes{v1.5}{2004/12/02}{disable automatic expansion for <DVI> output}
%\changes{v2.7}{2017/07/02}{don't disable automatic expansion for <DVI> output with \luatex}
%    \begin{macrocode}
%<*pdf->
      \MT@requires@pdftex4{%
        \ifnum\pdfoutput<\@ne
          \ifMT@opt@auto
            \MT@error{%
              Automatic font expansion only works for PDF output.\MessageBreak
              However, you are creating a DVI file}
             {If you have created expanded fonts instances, remove `auto' from%
              \MessageBreak the package options. Otherwise, you have to switch
              off expansion\MessageBreak completely.}%
          \fi
          \MT@autofalse
        \else
          \def\MT@auto{autoexpand}%
        \fi
%    \end{macrocode}
% Also, if \pdftex\ is too old.
%\changes{v1.1}{2004/09/13}{issue an error instead of a warning, when \pdftex\
%                            version is too old for \texttt{autoexpand}}
%\changes{v1.6}{2004/12/23}{disable automatic expansion for old \pdftex\ versions}
%    \begin{macrocode}
      }{%
        \MT@error{%
          The pdftex version you are using is too old for\MessageBreak
          automatic font expansion}%
         {If you have created expanded fonts instances, remove `auto' from\MessageBreak
          the package options. Otherwise, you have to switch off expansion\MessageBreak
          completely, or upgrade pdftex to version 1.20 or newer.}%
        \MT@autofalse
        \def\MT@auto{1000 }%
      }%
%</pdf->
%<lua->      \MT@requires@luatex3\relax{\def\MT@auto{autoexpand}}%
    \else
%<*pdf->
%    \end{macrocode}
% No automatic expansion.
%    \begin{macrocode}
      \MT@requires@pdftex4\relax{%
        \def\MT@auto{1000 }%
      }%
%</pdf->
%<*lua->
      \MT@requires@luatex3{%
        \ifMT@opt@auto
          \MT@error{Non-automatic font expansion does not work with\MessageBreak
                    luatex}{Remove `auto=false' from the package options, or use pdftex.}%
          \MT@autotrue
        \fi
      }\relax
%</lua->
    \fi
%    \end{macrocode}
% Choose the appropriate macro for selected expansion.
%    \begin{macrocode}
    \ifMT@selected
      \let\MT@set@ex@codes\MT@set@ex@codes@s
    \else
      \let\MT@set@ex@codes\MT@set@ex@codes@n
    \fi
%    \end{macrocode}
% Filter out |stretch=0,shrink=0|, since it would result in a \pdftex\ error.
%\changes{v1.9}{2005/07/08}{disable expansion if both \opt{step} and \opt{shrink} are zero}
%    \begin{macrocode}
    \ifnum\MT@stretch=\z@
      \ifnum\MT@shrink=\z@
        \MT@warning@nl{%
          Both the stretch and shrink limit are set to zero.\MessageBreak
          Disabling font expansion}%
        \MT@expansionfalse
      \fi
    \fi
  \fi
  \ifMT@expansion
    \edef\MT@active@features{\MT@active@features,ex}%
    \MT@adjustspacing\MT@ex@level
    \MT@info@nl{\ifMT@auto A\else Non-a\fi utomatic font expansion enabled
                (level \number\MT@ex@level),\MessageBreak
                stretch: \number\MT@stretch, shrink: \number\MT@shrink,
                step: \number\MT@step, \ifMT@selected\else non-\fi selected}%
%    \end{macrocode}
%\changes{v2.2}{2007/01/28}{warning if \opt{stretch} or \opt{shrink} aren't multiples of \opt{step}}
%\begin{macro}{\MT@check@step}
% Check whether \opt{stretch} and \opt{shrink} are multiples of \opt{step}.
%    \begin{macrocode}
    \def\MT@check@step##1{%
      \@tempcnta=\csname MT@##1\endcsname
      \divide\@tempcnta \MT@step
      \multiply\@tempcnta \MT@step
      \ifnum\@tempcnta=\csname MT@##1\endcsname\else
        \MT@warning@nl{The ##1 amount is not a multiple of step.\MessageBreak
                       The effective maximum ##1 is \the\@tempcnta\space
                       (step \number\MT@step)}%
      \fi
    }%
    \MT@check@step{stretch}%
    \MT@check@step{shrink}%
    \MT@check@active@set{ex}%
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\showhyphens}
%\changes{v1.7}{2005/03/02}{modify \cmd\showhyphens}
% Inside \cmd\showhyphens, font expansion should be disabled.
% (Since 2017/01/10, the \LaTeX\ format contains a different version
% for \xetex, but since expansion doesn't work with \xetex, we don't
% have to bother.)
%\changes{v2.7c}{2019/10/02}{compatibility with \LaTeX\ 2019/10/01
%                            (reported by \contributor Phelype Oleinik <phe.h.o1\at gmail.com>
%                             and \contributor Falk Hanisch <falk.hanisch\at tu-dresden.de>)}
%                            ^^A private mail, 2019/09/26
%                            ^^A private mail, 2019/10/08
% Since 2019/10/01, the command is robust.
%    \begin{macrocode}
    \MT@ifdefined@n@TF{showhyphens }{%
      \def\MT@temp##1##2{%
        \MT@exp@cs\CheckCommand{showhyphens }[1]{##1}%
        \DeclareRobustCommand\showhyphens[1]{##2}}%
    }{%
      \def\MT@temp##1##2{%
        \CheckCommand*\showhyphens[1]{##1}%
        \gdef\showhyphens####1{##2}}%
    }%
    \MT@temp
       {\setbox0\vbox{\color@begingroup
        \everypar{}\parfillskip\z@skip
        \hsize\maxdimen\normalfont\pretolerance\m@ne\tolerance\m@ne
        \hbadness\z@\showboxdepth\z@\ ##1\color@endgroup}}
       {\setbox0\vbox{\color@begingroup\pdfadjustspacing\z@
        \everypar{}\parfillskip\z@skip
        \hsize\maxdimen\normalfont\pretolerance\m@ne\tolerance\m@ne
        \hbadness\z@\showboxdepth\z@\ ##1\color@endgroup}}%
%    \end{macrocode}
%\end{macro}
%    \begin{macrocode}
  \else
    \let\MT@expansion\relax
    \MT@info@nl{No font expansion}%
  \fi
}
%</pdf-|lua->
%<*xe->
\def\MT@setup@expansion{%
  \ifMT@expansion
    \ifMT@opt@expansion
      \MT@error{Font expansion does not work with xetex}
               {Use pdftex or luatex instead.}%
    \fi
  \fi
}
%</xe->
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@setup@tracking}
% Tracking, spacing and kerning.
%    \begin{macrocode}
%<*pdf-|lua-|xe->
%<pdf->\MT@requires@pdftex6{%
%<lua->\MT@requires@luatex3{%
  \def\MT@setup@tracking{%
    \ifMT@tracking
      \MT@info@nl{Tracking enabled}%
      \MT@check@active@set{tr}%
%    \end{macrocode}
% Enable protrusion for compensation at the line edges.
%\changes{v2.3}{2007/07/27}{enable protrusion when tracking is enabled}
%    \begin{macrocode}
      \ifMT@protrusion\else\MT@protrudechars\@ne\fi
    \else
      \let\MT@tracking\relax
      \MT@info@nl{No adjustment of tracking}%
    \fi
  }
%</pdf-|lua-|xe->
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@setup@spacing}
%    \begin{macrocode}
%<*pdf->
  \def\MT@setup@spacing{%
    \ifMT@spacing
      \edef\MT@active@features{\MT@active@features,sp}%
      \pdfadjustinterwordglue\@ne
      \MT@info@nl{Adjustment of interword spacing enabled}%
%    \end{macrocode}
%\changes{v2.5}{2011/11/29}{warning with \pkg{ragged2e}
%                           (reported by \contributor Steffen Hoffmann <speraviro-delenda\at expires-2011-11-30.arcornews.de>)}
%                            ^^A MID: <dctt-20353621.20111126$90.sph@virsperans.my-fqdn.de>
%                            ^^A (beta:09)
% The \pkg{ragged2e} package sets interword spaces to a fixed value without glue.
% \microtype's modifications can therefore have undesired effects. Therefore,
% we issue a warning.
%    \begin{macrocode}
      \MT@with@package@T{ragged2e}{%
        \MT@warning@nl{You are using the `ragged2e' package.\MessageBreak
          Adjustment of interword spacing may lead to\MessageBreak
          undesired results when used with `ragged2e'.\MessageBreak
          In this case, disable the `spacing' option}%
      }%
      \MT@check@active@set{sp}%
    \else
      \let\MT@spacing\relax
      \MT@info@nl{No adjustment of interword spacing}%
    \fi
  }
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@setup@spacing@check}
% Warning if \cmd\nonfrenchspacing\ is active, since space factors will be
% ignored with \cmd\pdfadjustinterwordglue\,|>|\,0. Why 1500? Because some
% packages redefine \cmd\frenchspacing.\footnote{
%   Cf. the \texttt{c.t.t.} thread `\cmd\frenchspacing\ with <AMS> packages
%   and babel', started by Philipp Lehman on 16~August 2005,
%   <MID>:~\nolinkurl{ddtbaj$rob$1@online.de}}
%    \begin{macrocode}
  \def\MT@setup@spacing@check{%
    \ifMT@spacing
      \ifMT@babel \else
        \ifnum\sfcode`\. > 1500
          \MT@ifstreq\MT@sp@context{nonfrench}\relax{%
            \MT@warning@nl{%
              \@backslashchar nonfrenchspacing is active. Adjustment of\MessageBreak
              interword spacing will disable it. You might want\MessageBreak
              to add `\@backslashchar microtypecontext{spacing=nonfrench}'\MessageBreak
              to your preamble}%
          }%
        \fi
      \fi
    \fi
  }
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@setup@kerning}
%    \begin{macrocode}
  \def\MT@setup@kerning{%
    \ifMT@kerning
      \edef\MT@active@features{\MT@active@features,kn}%
      \pdfprependkern\@ne
      \pdfappendkern\@ne
      \MT@info@nl{Adjustment of character kerning enabled}%
      \MT@check@active@set{kn}%
    \else
      \let\MT@kerning\relax
      \MT@info@nl{No adjustment of character kerning}%
    \fi
  }
%</pdf->
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@error@doesnt@work}
% If \pdftex\ is too old, we disable tracking, spacing and kerning,
%\changes{v2.3a}{2008/02/16}{error messages if \pdftex\ is too old for extensions}
% and throw an error message.
% We also switch the features off for \luatex\ and \xetex.
%    \begin{macrocode}
%<pdf-|lua->}{
%<*lua->
  \def\MT@setup@tracking{%
    \ifMT@tracking
      \MT@error{The tracking feature only works with luatex 0.62\MessageBreak
        or newer. Switching it off}{Upgrade luatex.}%
      \MT@trackingfalse
      \MT@let@nc{MT@tracking}\relax
    \else
      \MT@info@nl{No adjustment of tracking (luatex too old)}%
    \fi
  }
}
%</lua->
%<*pdf-|lua-|xe->
  \def\MT@error@doesnt@work#1{%
    \csname ifMT@#1\endcsname
      \MT@error{The #1 feature only works with pdftex 1.40\MessageBreak
        or newer. Switching it off}
%<pdf->        {Upgrade pdftex.}%
%<lua-|xe->        {Use pdftex instead.}%
      \csname MT@#1false\endcsname
      \MT@let@nc{MT@#1}\relax
    \else
      \MT@info@nl{No adjustment of #1%
%<pdf->      \space(pdftex too old)%
      }%
    \fi
  }
%<pdf->  \def\MT@setup@tracking{\MT@error@doesnt@work{tracking}}
  \def\MT@setup@kerning {\MT@error@doesnt@work{kerning}}
  \def\MT@setup@spacing {\MT@error@doesnt@work{spacing}}
%<pdf->}
%</pdf-|lua-|xe->
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@setup@warntracking}
%    \begin{macrocode}
%<pdf-|lua-|xe->\def\MT@setup@warntracking
%<letterspace>\MT@addto@setup
%    \end{macrocode}
%\begin{macro}{\MT@warn@tracking@DVI}
%\changes{v2.2}{2007/02/11}{warning when letterspacing in <DVI> mode}
%\changes{v2.7}{2017/07/06}{don't warn for letterspacing in <DVI> mode with \luatex}
% With \pdftex, we issue a warning, when letterspacing in <DVI> mode, since it will probably
% not work. We also switch on protrusion if it isn't already, to compensate for
% the letterspacing kerns.
%    \begin{macrocode}
%<*pdf-|lua-|xe-|letterspace>
{%
%<*pdf-|letterspace>
  \ifnum\pdfoutput<\@ne
    \def\MT@warn@tracking@DVI{%
%<letterspace>      \MT@pdf@or@lua{%
      \MT@warning@nl{%
          You are using tracking/letterspacing in DVI mode.\MessageBreak
          This will probably not work, unless the post-\MessageBreak
          processing program (dvips, dvipdfm(x), ...) is\MessageBreak
          able to create the virtual fonts on the fly}%
%<letterspace>      }\relax
      \MT@glet\MT@warn@tracking@DVI\relax
    }%
  \else
%</pdf-|letterspace>
%<*pdf-|lua-|letterspace>
    \def\MT@warn@tracking@DVI{%
      \ifnum\pdfprotrudechars<\@ne \global\pdfprotrudechars\@ne \fi
      \MT@glet\MT@warn@tracking@DVI\relax
    }%
%</pdf-|lua-|letterspace>
%<pdf-|letterspace>  \fi
%    \end{macrocode}
%\end{macro}
%    \begin{macrocode}
  \ifnum\MT@letterspace=\m@ne
    \let\MT@letterspace\MT@letterspace@default
  \else
    \MT@ls@too@large\MT@letterspace
  \fi
}
%</pdf-|lua-|xe-|letterspace>
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@setup@noligatures}
% \cs{DisableLigatures} is only admissible in the preamble, therefore we can
% now disable the corresponding macro, if it was never called.
%\changes{v2.0}{2006/12/14}{maybe disable \cs{MT@noligatures} after the preamble}
%    \begin{macrocode}
%<*pdf-|lua->
\def\MT@setup@noligatures{%
%<pdf->  \MT@requires@pdftex5{%
    \ifMT@noligatures \else
      \let\MT@noligatures\relax
    \fi
%<pdf->  }\relax
}
%</pdf-|lua->
%<xe->\let\MT@setup@noligatures\relax
%    \end{macrocode}
%\end{macro}
% Remove the leading comma in \cs{MT@active@features}, and set the
% document switch to true.
%    \begin{macrocode}
%<*package>
\MT@addto@setup{%
  \ifx\MT@active@features\@empty \else
    \edef\MT@active@features{\expandafter\@gobble\MT@active@features}%
  \fi
  \MT@documenttrue
}
%    \end{macrocode}
%\begin{macro}{\MT@set@babel@context}
% Interaction with \pkg{babel}.
%    \begin{macrocode}
\def\MT@set@babel@context#1{%
  \MT@ifdefined@n@TF{MT@babel@#1}{%
    \MT@vinfo{*** Changing to language context `#1'\MessageBreak\on@line}%
    \expandafter\MT@exp@one@n\expandafter\microtypecontext
      \csname MT@babel@#1\endcsname
  }{%
    \microtypecontext{protrusion=,expansion=,spacing=,kerning=}%
  }%
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@shorthandoff}
% Active characters can only be switched off if \pkg{babel} isn't loaded after
% \microtype.
%    \begin{macrocode}
\@ifpackageloaded{babel}{
  \def\MT@shorthandoff#1#2{%
    \MT@info@nl{Switching off #1 babel's active characters (#2)}%
    \shorthandoff{#2}}
}{
  \def\MT@shorthandoff#1#2{%
    \MT@error{You must load `babel' before `\MT@MT'}
             {Otherwise, `\MT@MT' cannot switch off #1 babel's\MessageBreak
              active characters.}}
}
%    \end{macrocode}
%\end{macro}
% We patch \pkg{babel}'s language switching commands to enable language-dependent setup.
%    \begin{macrocode}
\MT@addto@setup{%
  \ifMT@babel
    \@ifpackageloaded{babel}{%
      \MT@info@nl{Redefining babel's language switching commands}%
      \let\MT@orig@select@language\select@language
      \def\select@language#1{%
        \MT@orig@select@language{#1}%
        \MT@set@babel@context{#1}%
      }%
      \let\MT@orig@foreign@language\foreign@language
      \def\foreign@language#1{%
        \MT@orig@foreign@language{#1}%
        \MT@set@babel@context{#1}%
      }%
      \ifMT@kerning
%    \end{macrocode}
%\todo{make switching off of \pkg{babel}'s shorthands configurable}
% Disable French \pkg{babel}'s active characters.
%\changes{v2.0}{2006/10/10}{option `\opt{babel}': fix: switch off French
%                           \pkg{babel}'s shorthands properly
%                           (reported by \contributor Daniel Flipo <daniel.flipo\at univ-lille1.fr>)}
%                                                      ^^A private mail, 2006/10/09
%                                                      ^^A (beta:8)
%    \begin{macrocode}
        \MT@if@false
        \MT@with@babel@and@T{french}  \MT@if@true
        \MT@with@babel@and@T{frenchb} \MT@if@true
        \MT@with@babel@and@T{francais}\MT@if@true
        \MT@with@babel@and@T{canadien}\MT@if@true
        \MT@with@babel@and@T{acadian} \MT@if@true
        \ifMT@if@\MT@shorthandoff{French}{:;!?}\fi
%    \end{macrocode}
% Disable Turkish \pkg{babel}'s active characters.
%\changes{v2.0}{2006/10/10}{option `\opt{babel}': switch off Turkish \pkg{babel}'s shorthands} ^^A (beta:8)
%\changes{v2.3}{2007/10/03}{fix: really switch off Turkish shorthands}
%    \begin{macrocode}
        \MT@if@false
        \MT@with@babel@and@T{turkish} \MT@if@true
        \ifMT@if@\MT@shorthandoff{Turkish}{:!=}\fi
      \fi
%    \end{macrocode}
% In case \pkg{babel} was loaded before \microtype:
%    \begin{macrocode}
      \MT@set@babel@context\languagename
%    \end{macrocode}
% The \pkg{polyglossia} package has a useful hook.
%\changes{v3.0c}{2022/01/21}{make \opt{babel} option work with \pkg{polyglossia}}
% Unfortunately, compatibility with \pkg{polyglossia} is less useful in itself,
% as only \luatex\ allows working on font copies, and currently doesn't provide
% the kerning or spacing feature. But who knows, maybe somebody would want more
% protrusion in French\dots
%    \begin{macrocode}
    }{%
      \@ifpackageloaded{polyglossia}{%
        \MT@info@nl{Registering with polyglossia's language switching hook}%
        \gappto\polyglossia@language@switched{%
          \MT@set@babel@context{\languagename}%
        }%
        \MT@set@babel@context\languagename
      }{%
        \MT@warning@nl{%
          You did not load the babel or the polyglossia package.\MessageBreak
          The `babel' option won't have any effect}%
      }%
    }%
  \fi
}
%    \end{macrocode}
% Now we close the \orig@cs{fi} from \cs{ifMT@disable}.
%    \begin{macrocode}
\MT@addto@setup{\fi
%    \end{macrocode}
% Set up the current font, most likely the normal font. This has to come after
% all of the setup (including anything from the preamble) has been dealt with.
%    \begin{macrocode}
  \selectfont}
%    \end{macrocode}
%\begin{macro}{\MT@curr@file}
% This is the current file (hopefully with the correct extension).
%    \begin{macrocode}
\edef\MT@curr@file{\jobname.tex}
%</package>
%    \end{macrocode}
%\end{macro}
% Finally, execute the setup macro at the end of the preamble, and empty it
% (the \cls{combine} class calls it repeatedly).
%\changes{v2.3d}{2009/02/05}{move setup to the very end
%                            (for \contributor Colin Rourke <gt\at msp.warwick.ac.uk>)}
%                                                       ^^A private mail, 2009/02/03
%    \begin{macrocode}
%<*package|letterspace>
%<plain>\MT@requires@latex1{
\AtBeginDocument{\MT@setup@ \MT@glet\MT@setup@\@empty}
%<plain>}\relax
%</package|letterspace>
%    \end{macrocode}
% Must come at the very, very end.
%    \begin{macrocode}
%<package>\MT@ifdefined@c@T\MT@setup@spacing@check
%<package>  {\AtBeginDocument{\MT@setup@spacing@check}}
%    \end{macrocode}
% Restore catcodes.
%    \begin{macrocode}
%<package|letterspace>\MT@restore@catcodes
%    \end{macrocode}
% That was that.
%
% ^^A -------------------------------------------------------------------------
%\NoIndexing  ^^A from now on, don't bother indexing
%
%\newpage
%
%\section{Configuration files}
%\changes{v1.6}{2005/01/24}{restructure \file{dtx} file}
%\changes{v2.8a}{2021/02/22}{rename \file{mt-pad.cfg} to \file{mt-EBGaramond.cfg}
%                            (requested by \contributor Karl Berry <karl\at freefriends.org>)}
%                            ^^A private mail, 2021/02/22
%
% Let's now write the font configuration files.
%    \begin{macrocode}
%<*config>

%    \end{macrocode}
%\subsection{Font sets}
%\GeneralChanges{Font sets}
%
% We first declare some sets in the main configuration file.
%
%    \begin{macrocode}
%<*m-t>
%%% -----------------------------------------------------------------------
%%% FONT SETS

\DeclareMicrotypeSet{all}
   { }

%    \end{macrocode}
%\changes{v1.2}{2004/10/02}{new: \texttt{allmath} and \texttt{basicmath}}
%\changes{v1.8}{2005/05/25}{add <U> encoding to \texttt{allmath}}
%\changes{v1.9}{2005/08/17}{add <OT4> encoding to text sets}
%\changes{v1.9}{2005/08/17}{add <T5> encoding to text sets}
%\changes{v1.9d}{2006/04/20}{add <QX> encoding to text sets}
%\changes{v2.3e}{2009/10/28}{add <T2A> encoding}
%\changes{v2.5}{2010/05/13}{add <EU1> and <EU2> encodings}
%\changes{v2.6}{2016/04/22}{add <TU> encoding
%                           (notified by \contributor Will Robertson <will\at wspr.io>)}
%                           ^^A semi-private mail, 2016/01/28
%    \begin{macrocode}
\DeclareMicrotypeSet{allmath}
   { encoding = {OT1,T1,T2A,LY1,OT4,QX,T5,EU1,EU2,TU,TS1,OML,OMS,U} }

\DeclareMicrotypeSet{alltext}
   { encoding = {OT1,T1,T2A,LY1,OT4,QX,T5,TS1,EU1,EU2,TU} }

%    \end{macrocode}
%\changes{v2.6}{2014/04/07}{new: \texttt{allmath-nott} and \texttt{alltext-nott}
%                           (suggested by \contributor Karl Berry <karl\at freefriends.org>)}
%                           ^^A private mail, 2014/03/21
%    \begin{macrocode}
\DeclareMicrotypeSet{allmath-nott}
   { encoding = {OT1,T1,T2A,LY1,OT4,QX,T5,EU1,EU2,TU,TS1,OML,OMS,U},
     family   = {rm*,sf*}
   }

\DeclareMicrotypeSet{alltext-nott}
   { encoding = {OT1,T1,T2A,LY1,OT4,QX,T5,TS1,EU1,EU2,TU},
     family   = {rm*,sf*}
   }

%    \end{macrocode}
%\changes{v1.9d}{2006/02/22}{\texttt{md*} instead of \texttt{m} series in basic sets}
%    \begin{macrocode}
\DeclareMicrotypeSet{basicmath}
   { encoding = {OT1,T1,T2A,LY1,OT4,QX,T5,EU1,EU2,TU,OML,OMS},
     family   = {rm*,sf*},
     series   = {md*},
     size     = {normalsize,footnotesize,small,large}
   }

\DeclareMicrotypeSet{basictext}
   { encoding = {OT1,T1,T2A,LY1,OT4,QX,T5,EU1,EU2,TU},
     family   = {rm*,sf*},
     series   = {md*},
     size     = {normalsize,footnotesize,small,large}
   }

%    \end{macrocode}
%\changes{v2.0}{2006/12/28}{new: \texttt{smallcaps}}
%\changes{v2.3e}{2009/06/01}{\texttt{sc*} instead of \texttt{sc} in \texttt{smallcaps} set}
%\changes{v2.6}{2014/02/18}{add \texttt{si} and \texttt{scit} to \texttt{smallcaps} set
%                           (reported by \contributor uli <@\at @>)}
%                           ^^A https://tex.stackexchange.com/questions/157397
%    \begin{macrocode}
\DeclareMicrotypeSet{smallcaps}
   { encoding = {OT1,T1,T2A,LY1,OT4,QX,T5,TS1,EU1,EU2,TU},
     shape    = {sc*,si,scit}
   }

%    \end{macrocode}
%\changes{v2.0}{2006/12/21}{new: \texttt{footnotesize} and \texttt{scriptsize}}
%    \begin{macrocode}
\DeclareMicrotypeSet{footnotesize}
   { encoding = {OT1,T1,T2A,LY1,OT4,QX,T5,TS1,EU1,EU2,TU},
     size     = {-small}
   }

\DeclareMicrotypeSet{scriptsize}
   { encoding = {OT1,T1,T2A,LY1,OT4,QX,T5,TS1,EU1,EU2,TU},
     size     = {-footnotesize}
   }

\DeclareMicrotypeSet{normalfont}
   { font = */*/*/*/* }

%    \end{macrocode}
% The default sets.
%\changes{v2.2}{2007/04/15}{default set for tracking: \texttt{smallcaps}}
%\changes{v2.8}{2019/12/04}{default set for expansion: \texttt{alltext-nott}
%                           (suggested by \contributor Aman Mehra <reportaman\at gmail.com>)}
%                           ^^A https://tex.stackexchange.com/questions/519166/microtype-expansion-gets-disabled-when-fontsize-is-changed-lualatex
%\changes{v2.8}{2019/12/04}{default set for spacing: \texttt{alltext-nott}}
%    \begin{macrocode}
%%% -----------------------------------------------------------------------
%%% DEFAULT SETS

\DeclareMicrotypeSetDefault[protrusion]{alltext}
\DeclareMicrotypeSetDefault[expansion] {alltext-nott}
\DeclareMicrotypeSetDefault[spacing]   {alltext-nott}
\DeclareMicrotypeSetDefault[kerning]   {alltext}
\DeclareMicrotypeSetDefault[tracking]  {smallcaps}

%    \end{macrocode}
%
%\subsection{Font variants and aliases}
%\GeneralChanges{Font aliases}
%
% These are the variants I happen to be using (expert encoding, oldstyle
% numerals, swashes, alternative, display, inferior and superior numerals):
% Additionally, we add the now common variants for Lining, Tabular, Oldstyle,
% and Tabular Oldstyle numbers.
%\changes{v2.8a}{2021/02/22}{add \texttt{-LF}, \texttt{-TLF}, \texttt{-OsF} and \texttt{-TOsF} as variants}
%    \begin{macrocode}
%%% -----------------------------------------------------------------------
%%% FONT VARIANTS AND ALIASES

\DeclareMicrotypeVariants{x,j,w,a,d,0,1,-LF,-TLF,-OsF,-TOsF}
%    \end{macrocode}
% Other candidates: |2|~(proportional digits), |e|~(engraved), |f|~(Fraktur),
% |g|~(small text), |h|~(shadow), |l|~(outline), |n|~(informal),
% |p|~(ornaments), |r|~(roman), |s|~(sans serif), |t|~(typewriter).
% I've omitted them since they seem hardly be used and/or they are actually
% more than just a variant, \ie, they shouldn't share a file.
%
%\bigskip\noindent
% Fonts that are `the same':
% The \pkg{fontspec} package will set |lmr| as the default font, whose
% declarations for <EU1>/<EU2>/<TU> encoding are in \file{mt-LatinModernRoman.cfg}.
%\changes{v2.5}{2012/08/23}{declare Latin Modern Roman (OpenType version) as alias of \texttt{lmr}
%                           when \pkg{fontspec} is loaded}
% Since 2016/12/03, the default encoding with \xetex\ and \luatex\ in the
% \LaTeX\ format is <TU>, even if \pkg{fontspec} is not loaded.
%\changes{v2.7}{2017/01/27}{declare Latin Modern Roman as alias of \texttt{lmr}
%                            with new \LaTeX\ format
%                            (reported by \contributor Ulrike Fischer <news3\at nililand.de>)}
%                            ^^A private mail, 2017/01/25
%    \begin{macrocode}

\MT@if@false
\ifx\UnicodeEncodingName\@undefined\else
  \MT@ifstreq{\encodingdefault}{\UnicodeEncodingName}\MT@if@true\relax
\fi
\ifMT@fontspec\MT@if@true\fi
\ifMT@if@
%% -- Computer/Latin Modern Roman
\DeclareMicrotypeAlias{lmr}{Latin Modern Roman}
  \else
\DeclareMicrotypeAlias{lmr}{cmr}           % lmodern
\fi
%    \end{macrocode}
% The Latin Modern fonts, the virtual fonts from the
% \pkg{ae} and \pkg{zefonts} and the \pkg{eco} and \pkg{hfoldsty} packages
% (oldstyle numerals), as well as \pkg{mlmodern}, all inherit the (basic) settings
% from Computer Modern Roman. Some of them are in part overwritten later.
%\changes{v1.2}{2004/10/03}{declare \texttt{cmor} as an alias of \texttt{cmr}}
%\changes{v1.3}{2004/10/22}{declare \texttt{aer}, \texttt{zer} and \texttt{hfor}
%                           as aliases of \texttt{cmr}}^^A
% We mustn't forget the Latin Modern math fonts.
%\changes{v2.5}{2012/07/17}{declare \texttt{lmsy} and \texttt{lmm} as aliases
%                           of \texttt{cmsy} resp. \texttt{cmm}
%                           (reported by \contributor Jonas Hogstrom <hjb981\at gmail.com>)}
%                           ^^A https://tex.stackexchange.com/questions/63558/how-to-get-microtype-to-work-with-mathematical-minus-sign-and-package-lmodern
%\changes{v2.8a}{2021/01/13}{declare \pkg{mlmodern} fonts as aliases of Latin Modern
%                            (reported by \contributor Daniel Benjamin Miller <dbmiller\at dbmiller.org>)}
%                            ^^A private mail, 2021/01/12
%    \begin{macrocode}
\DeclareMicrotypeAlias{lmsy}{cmsy}         %   "
\DeclareMicrotypeAlias{lmm} {cmm}          %   "
\DeclareMicrotypeAlias{aer} {cmr}          % ae
\DeclareMicrotypeAlias{zer} {cmr}          % zefonts
\DeclareMicrotypeAlias{cmor}{cmr}          % eco
\DeclareMicrotypeAlias{hfor}{cmr}          % hfoldsty
\DeclareMicrotypeAlias{mlmr}{cmr}          % mlmodern
\DeclareMicrotypeAlias{mlmsy}{cmsy}        %   "
\DeclareMicrotypeAlias{mlmm} {cmm}         %   "
%    \end{macrocode}
% Another, new Computer Modern extension.
%\changes{v2.8}{2019/11/22}{declare New Computer Modern as an alias of Latin Modern Roman}
% The \pkg{newcomputermodern} package loads it by file name.
%\changes{v2.8a}{2021/01/09}{reference New Computer Modern also by file name
%                            (reported by \contributor Canageek <@\at @>)}
%                            ^^A https://tex.stackexchange.com/questions/578121/how-do-i-properly-tell-microtype-that-newcomputermodern-is-the-same-as-comput
%\changes{v3.0}{2021/08/08}{New Computer Modern has its own settings}
%    \begin{macrocode}
\DeclareMicrotypeAlias{NewCM10-Book.otf}   {New Computer Modern}
\DeclareMicrotypeAlias{NewCM10-Regular.otf}{New Computer Modern}
%    \end{macrocode}
%\changes{v3.0a}{2021/11/09}{declare <CMU> Serif as an alias of New Computer Modern}
% <CMU> Serif can use the settings from New Computer Modern too.
%    \begin{macrocode}
\DeclareMicrotypeAlias{CMU Serif}          {New Computer Modern}
%    \end{macrocode}
% The packages \pkg{pxfonts} and \pkg{txfonts} fonts inherit Palatino and Times
% settings respectively,
%\changes{v1.8}{2005/04/19}{declare \texttt{pxr} and \texttt{txr}
%                           as aliases of \texttt{ppl} resp. \texttt{ptm}}
% also the \TeX\ Gyre fonts Pagella and Termes (formerly: \pkg{qfonts}).
%\changes{v1.9}{2005/08/16}{declare \texttt{qpl} and \texttt{qtm} (\pkg{qfonts}, \TeX\ Gyre)
%                           as aliases of \texttt{ppl} resp. \texttt{ptm}}
%    \begin{macrocode}
%% -- Palatino
\DeclareMicrotypeAlias{pxr} {ppl}          % pxfonts
\DeclareMicrotypeAlias{qpl} {ppl}          % TeX Gyre Pagella (formerly: qfonts/QuasiPalatino)
%    \end{macrocode}
% The `<FPL> Neu' fonts, a `re-implementation' of Palatino.
%\changes{v2.2}{2007/05/27}{declare \texttt{fp9x}, \texttt{fp9j} (<FPL> Neu) as aliases of \texttt{ppl[xj]}}
%    \begin{macrocode}
\DeclareMicrotypeAlias{fp9x}{pplx}         % FPL Neu
\DeclareMicrotypeAlias{fp9j}{pplj}         %    "
%    \end{macrocode}
% The \pkg{newpx} package, a replacement for \pkg{pxfonts}.
%\changes{v2.7}{2017/03/13}{declare aliases for \pkg{newpx}}
%    \begin{macrocode}
\DeclareMicrotypeAlias{zpllf}{pplx}        % newpxtext
\DeclareMicrotypeAlias{zplosf}{pplj}       %    "
\DeclareMicrotypeAlias{zpltlf}{pplx}       %    "
\DeclareMicrotypeAlias{zpltosf}{pplj}      %    "
%    \end{macrocode}
% The \pkg{domitian} package.
%\changes{v2.8}{2020/03/07}{declare aliases for \pkg{step} and \pkg{domitian}
%                           (notified by \contributor Daniel Benjamin Miller <dbmiller\at dbmiller.org>)}
%                           ^^A private mail, 2020/02/27
%    \begin{macrocode}
\DeclareMicrotypeAlias{Domitian-TLF} {pplx}% domitian
\DeclareMicrotypeAlias{Domitian-TOsF}{pplj}%    "
%    \end{macrocode}
% The OpenType versions:
%
%\changes{v2.5}{2012/03/29}{declare TeX Gyre Pagella, Asana Math, Palatino <LT> Std, and Palatino
%                           as aliases of Palatino Linotype (OpenType version)}
%    \begin{macrocode}
\DeclareMicrotypeAlias{Palatino Linotype}{Palatino}
\DeclareMicrotypeAlias{Palatino LT Std}  {Palatino}
\DeclareMicrotypeAlias{TeX Gyre Pagella} {Palatino}
\DeclareMicrotypeAlias{Domitian}         {Palatino}
\DeclareMicrotypeAlias{Asana Math}       {Palatino}
%% -- Times New Roman
\DeclareMicrotypeAlias{txr}{ptm}           % txfonts
%    \end{macrocode}
% The \pkg{newtx} package, a replacement for \pkg{txfonts}.
%\changes{v2.7}{2017/02/25}{declare aliases for \pkg{newtx}}
%    \begin{macrocode}
\DeclareMicrotypeAlias{ntxlf}  {ptmx}      % newtxtext
\DeclareMicrotypeAlias{ntxtlf} {ptmx}      %    "
\DeclareMicrotypeAlias{ntxosf} {ptmj}      %    "
\DeclareMicrotypeAlias{ntxtosf}{ptmj}      %    "
%    \end{macrocode}
% The \pkg{tempora} package.
%\changes{v2.7}{2017/02/25}{declare aliases for \pkg{tempora}}
%    \begin{macrocode}
\DeclareMicrotypeAlias{Tempora-TLF} {ptmx} % tempora
\DeclareMicrotypeAlias{Tempora-TOsF}{ptmj} %    "
\DeclareMicrotypeAlias{qtm}{ptm}           % TeX Gyre Termes (formerly: qfonts/QuasiTimes)
%    \end{macrocode}
% The \pkg{step} package.
%    \begin{macrocode}
\DeclareMicrotypeAlias{STEP-TLF} {ptmx}    % step
\DeclareMicrotypeAlias{STEP-TOsF}{ptmj}    %   "
%    \end{macrocode}
% The \pkg{stix}, \pkg{stix2} and \pkg{stickstoo} packages (the latter two have departed a bit from being
% a Times clone, but still seem close enough).
%\changes{v2.8}{2020/05/31}{declare aliases for \pkg{stix} and \pkg{stix2} fonts}
%\changes{v3.0e}{2022/05/23}{declare aliases for \pkg{stickstoo} fonts}
%    \begin{macrocode}
\DeclareMicrotypeAlias{stix} {ptm}         % stix
\DeclareMicrotypeAlias{stix2}{ptm}         % stix2
\DeclareMicrotypeAlias{SticksTooText-LF}  {ptmx}
\DeclareMicrotypeAlias{SticksTooText-TLF} {ptmx}
\DeclareMicrotypeAlias{SticksTooText-OsF} {ptmj}
\DeclareMicrotypeAlias{SticksTooText-TOsF}{ptmj}
%    \end{macrocode}
%\todo{check Times variants}
% More Times variants, to be checked: |pns|, |mns| (TimesNewRomanPS); |mnt|
% (Times\-NewRomanMT, TimesNRSevenMT), |mtm| (TimesSmallTextMT); |pte|
% (TimesEuropa); |ptt| (TimesTen); TimesEighteen; TimesModernEF.
%
% MicroPress's Charter version (\pkg{chmath}).
%\changes{v2.2}{2007/06/08}{declare \texttt{chr} (\pkg{chmath}) as an alias of \texttt{bch}
%                           (reported by \contributor Geoff Vallis <gkv\at Princeton.EDU>)}
%                                                            ^^A private mail, 2007/06/07
%    \begin{macrocode}
%% -- Charter
\DeclareMicrotypeAlias{chr}{bch}           % CH Math
%    \end{macrocode}
%\changes{v2.7}{2017/03/13}{declare aliases for \pkg{XCharter}}
% The \pkg{XCharter} package extends the Charter fonts.
%    \begin{macrocode}
\DeclareMicrotypeAlias{XCharter-TLF} {bch} % XCharter
\DeclareMicrotypeAlias{XCharter-TOsF}{bch} %    "
%    \end{macrocode}
% The \pkg{mathdesign} package provides math fonts matching Bitstream Charter
%\changes{v1.9a}{2005/10/31}{declare \texttt{mdbch} (\pkg{mathdesign})
%                            as an alias of \texttt{bch}}
% and <URW> Garamond.
%    \begin{macrocode}
\DeclareMicrotypeAlias{mdbch}{bch}         % mathdesign/Charter
%% -- Garamond
\DeclareMicrotypeAlias{mdugm}{ugm}         % mathdesign/URW Garamond
%    \end{macrocode}
% The \pkg{garamondx} package, an extension of <URW> Garamond, providing
% small caps and oldstyle figures.
%\changes{v2.5}{2013/02/20}{declare \texttt{zgmx} etc. (\pkg{garamondx})
%                           as aliases of \texttt{ugm}}
%    \begin{macrocode}
\DeclareMicrotypeAlias{zgmx}{ugm}          % garamondx
\DeclareMicrotypeAlias{zgmj}{ugm}          %    "
\DeclareMicrotypeAlias{zgmI}{ugm}          %    "
\DeclareMicrotypeAlias{zgmq}{ugm}          %    "
%    \end{macrocode}
% Because a configuration file for Adobe Garamond wouldn't be permitted
% for \texlive\ distribution, we use <EB> Garamond as the base font.
%    \begin{macrocode}
\DeclareMicrotypeAlias{pad} {EBGaramond-LF}% Adobe Garamond
\DeclareMicrotypeAlias{padx}{EBGaramond-TLF}%   "
\DeclareMicrotypeAlias{padj}{EBGaramond-TOsF}%  "
%% --
%    \end{macrocode}
% <URW> Letter Gothic is similar enough to Bitstream Letter Gothic to share the
% configuration.
%    \begin{macrocode}
\DeclareMicrotypeAlias{ulg}{blg}           % URW LetterGothic -> Bitstream LetterGothic12Pitch
%    \end{macrocode}
% The \pkg{eulervm} package virtually extends the Euler fonts.
%\changes{v1.9e}{2006/07/28}{declare \texttt{zeur} and \texttt{zeus} (\pkg{eulervm})
%                            as aliases of \texttt{eur} resp. \texttt{eus} (\pkg{euler})}
%    \begin{macrocode}
\DeclareMicrotypeAlias{zeur}{eur}          % Euler VM
\DeclareMicrotypeAlias{zeus}{eus}          %    "
%    \end{macrocode}
% Euro symbol fonts, to save some files.
%    \begin{macrocode}
\DeclareMicrotypeAlias{zpeus}   {zpeu}     % Adobe Euro sans -> serif
\DeclareMicrotypeAlias{eurosans}{zpeu}     % Adobe Euro sans -> serif
%    \end{macrocode}
% The Lato and Fontin fonts (and many, many  more\dots) only contain a
% basic set of glyphs. We alias them here to the basic settings
% (see \ref{subsub:OT-inh-basic}) to prevent lots of warning
% messages from the inheritance settings; they will still receive
% protrusion settings from the default (<T1>) configuration.
%\changes{v3.0}{2021/06/22}{declare \texttt{basic} aliases for the Fontin font}
%\changes{v3.0}{2021/06/25}{declare \texttt{basic} alias for Bergamo Std}
%    \begin{macrocode}
\DeclareMicrotypeAlias{Lato}             {TU-basic}
\DeclareMicrotypeAlias{Lato-Regular}     {TU-basic}
\DeclareMicrotypeAlias{Fontin}           {TU-basic}
\DeclareMicrotypeAlias{Fontin-Regular}   {TU-basic}
\DeclareMicrotypeAlias{Bergamo Std}      {TU-basic}
%    \end{macrocode}
% The \pkg{fontawesome} and \pkg{fontawesome5} packages are aliased
% to empty settings (see \ref{subsub:OT-inh-empty} and \ref{subsub:OT-prot-empty}).
%\changes{v3.0}{2021/03/15}{declare \texttt{empty} aliases for \pkg{fontawesome5}}
%    \begin{macrocode}
\DeclareMicrotypeAlias{FontAwesome}      {TU-empty} % fontawesome
\DeclareMicrotypeAlias{fontawesomefree}  {TU-empty} % fontawesome5
\DeclareMicrotypeAlias{fontawesomepro}   {TU-empty}
\DeclareMicrotypeAlias{fontawesomebrands}{TU-empty}

%    \end{macrocode}
%
%\subsection{Interaction with \pkg{babel}}
%
% Contexts that are to be set when switching to a language.
%    \begin{macrocode}
%%% -----------------------------------------------------------------------
%%% INTERACTION WITH THE `babel' PACKAGE

\DeclareMicrotypeBabelHook
   {english,UKenglish,british,USenglish,american}
   {kerning=, spacing=nonfrench}

\DeclareMicrotypeBabelHook
   {french,francais,acadian,canadien}
   {kerning=french, spacing=}

\DeclareMicrotypeBabelHook
   {turkish}
   {kerning=turkish, spacing=}

%    \end{macrocode}
%\GeneralChanges*
%
% \subsection{Note on admissible characters}
%
% All printable <ASCII> characters are allowed in the settings, with the
% following exceptions (on the left hand side, the replacements on the right):
%
%\begin{tabbing}
%  |\|\quad\=:\quad\=\cmd\textbackslash   \\
%  |{|     \>:\>     \cmd\textbraceleft   \\
%  |}|     \>:\>     \cmd\textbraceright  \\
%  |^|     \>:\>     \cmd\textasciicircum \\
%  |%|     \>:\>     \cmd\%               \\
%  |#|     \>:\>     \cmd\#
%\end{tabbing}
%
%\noindent
% Comma and equal sign must be guarded with braces (`|{,}|', `|{=}|') to keep
% \pkg{keyval} happy.
%
% Character commands are allowed as far as they have been defined in the proper
% \LaTeX\ way, that is, when they have been assigned a slot in the font
% encoding with \cmd\DeclareTextSymbol\ or \cmd\DeclareTextComposite.
% Characters defined via \cmd\chardef\ are also possible.
%
% Ligatures and \cmd\mathchardef'ed symbols have to be specified numerically.
% Of course, numerical identification is possible in any other case, too.
%
%\changes{v1.1}{2004/09/14}{remove 8-bit characters from the configuration files
%               (suggested by \contributor Harald Harders <h.harders\at tu-bs.de>)}
%                                                    ^^A private mail, 2004/09/13
% 8-bit characters are also admissible, provided they have been declared in the
% input encoding file. They should, however, only be used in private
% configuration files, where the proper input encoding is guaranteed, or else in
% combination with the `|inputenc|' key.
%
% With \xetex\ or \luatex, in contrast, it is advisable to use the proper
% Unicode characters, or the font-specific glyph names prefixed with `|/|'
% (cf. section \ref{sec:OpenType}).
%
%\subsection{Character inheritance}
%\GeneralChanges{Inheritance}
%
% First the lists of inheriting characters. We only declare those characters
% that are the same on \emph{both} sides, \ie, not \OE\ for O.
%    \begin{macrocode}
%</m-t>
%<*m-t|ebg|zpeu|mvs>
%%% -----------------------------------------------------------------------
%%% CHARACTER INHERITANCE

%</m-t|ebg|zpeu|mvs>
%<*m-t>
%    \end{macrocode}
%
%\subsubsection{<OT1>}
% Glyphs that should possibly inherit settings on one side only:
% |012|~(`fi' ligature), |013|~(`fl'), |014|~(`ffi'), |015|~(`ffl'),
% \AE, \ae, \OE, \oe.
%    \begin{macrocode}
\DeclareCharacterInheritance
   { encoding = OT1 }
   { f = {011}, % ff
     i = {\i},
     j = {\j},
     O = {\O},
     o = {\o}
   }

%    \end{macrocode}
%
%\subsubsection{<T1>}
% Candidates here: |028|~(`fi'), |029|~(`fl'), |030|~(`ffi'), |031|~(`ffl'),
% |156| (`\IJ'~ligature, since \LaTeX\ 2005/12/01 accessible as |\IJ|),
% |188|~(`\ij', |\ij|), \AE, \ae, \OE, \oe.
%\changes{v1.5}{2004/12/11}{remove \cmd\ss\ from <T1> list, add \cmd\DJ}
%\changes{v1.8}{2005/04/26}{remove \cmd\DJ\ from <T1> list (it's the same as \cmd\DH)}
%    \begin{macrocode}
\DeclareCharacterInheritance
   { encoding = T1 }
   { A = {\`A,\'A,\^A,\~A,\"A,\r A,\k A,\u A},
     a = {\`a,\'a,\^a,\~a,\"a,\r a,\k a,\u a},
     C = {\'C,\c C,\v C},
     c = {\'c,\c c,\v c},
     D = {\v D,\DH},
     d = {\v d,\dj},
     E = {\`E,\'E,\^E,\"E,\k E,\v E},
     e = {\`e,\'e,\^e,\"e,\k e,\v e},
     f = {027}, % ff
     G = {\u G},
     g = {\u g},
     I = {\`I,\'I,\^I,\"I,\.I},
     i = {\`i,\'i,\^i,\"i,\i},
     j = {\j},
     L = {\L,\'L,\v L},
     l = {\l,\'l,\v l},
     N = {\'N,\~N,\v N},
     n = {\'n,\~n,\v n},
     O = {\O,\`O,\'O,\^O,\~O,\"O,\H O},
     o = {\o,\`o,\'o,\^o,\~o,\"o,\H o},
     R = {\'R,\v R},
     r = {\'r,\v r},
     S = {\'S,\c S,\v S,\SS},
     s = {\'s,\c s,\v s},
     T = {\c T,\v T},
     t = {\c t,\v t},
     U = {\`U,\'U,\^U,\"U,\H U,\r U},
     u = {\`u,\'u,\^u,\"u,\H u,\r u},
     Y = {\'Y,\"Y},
     y = {\'y,\"y},
     Z = {\'Z,\.Z,\v Z},
     z = {\'z,\.z,\v z}
%    \end{macrocode}
%\changes{v2.2}{2007/02/04}{remove `\texttt{-}' $\rightarrow$ `\texttt{127}'}
% The `soft hyphen' often has reduced right side bearing so that it may already
% be protruded, hence no inheritance.
%    \begin{macrocode}
%    - = {127},
   }

%    \end{macrocode}
%
%\subsubsection{<LY1>}
% More characters: |008|~(`fl'), |012|~(`fi'), |014|~(`ffi'), |015|~(`ffl'),
% \AE, \ae, \OE, \oe.
%    \begin{macrocode}
\DeclareCharacterInheritance
   { encoding = LY1 }
   { A = {\`A,\'A,\^A,\~A,\"A,\r A},
     a = {\`a,\'a,\^a,\~a,\"a,\r a},
     C = {\c C},
     c = {\c c},
     D = {\DH},
     E = {\`E,\'E,\^E,\"E},
     e = {\`e,\'e,\^e,\"e},
     f = {011}, % ff
     I = {\`I,\'I,\^I,\"I},
     i = {\`i,\'i,\^i,\"i,\i},
     L = {\L},
     l = {\l},
     N = {\~N},
     n = {\~n},
     O = {\`O,\'O,\^O,\~O,\"O,\O},
     o = {\`o,\'o,\^o,\~o,\"o,\o},
     S = {\v S},
     s = {\v s},
     U = {\`U,\'U,\^U,\"U},
     u = {\`u,\'u,\^u,\"u},
     Y = {\'Y,\"Y},
     y = {\'y,\"y},
     Z = {\v Z},
     z = {\v z}
   }

%    \end{macrocode}
%
%\subsubsection{<OT4>}
%\changes{v1.9}{2005/08/16}{add list for <OT4>}
%\changes{v2.7b}{2019/02/28}{add textquotedblleft ligature to <OT4>
%                (reported by \contributor Franz Wexler <@\at @>)}
%                ^^A https://tex.stackexchange.com/questions/476648/
% The Polish <OT1> extension. More interesting characters here:
% |009|~(`fk'), |012|~(`fi'), |013|~(`fl'), |014|~(`ffi'), |015|~(`ffl'),
% \AE, \ae, \OE, \oe.
%    \begin{macrocode}
\DeclareCharacterInheritance
   { encoding = OT4 }
   { A = {\k A},
     a = {\k a},
     C = {\'C},
     c = {\'c},
     E = {\k E},
     e = {\k e},
     f = {011}, % ff
     i = {\i},
     j = {\j},
     L = {\L},
     l = {\l},
     N = {\'N},
     n = {\'n},
     O = {\O,\'O},
     o = {\o,\'o},
     S = {\'S},
     s = {\'s},
     Z = {\'Z,\.Z},
     z = {\'z,\.z},
     \textquotedblleft = "FF
   }

%    \end{macrocode}
%
%\subsubsection{<QX>}
%\changes{v1.9d}{2006/04/20}{add list for <QX> encoding (contributed by
%                            \contributor Maciej Eder <maciej_eder\at poczta.onet.pl>)}
%                                                     ^^A private mail, 2006/04/19
% The Central European <QX> encoding.\footnote{
%   Contributed by \contributor Maciej Eder <maciej_eder\at poczta.onet.pl>.}
% Ligatures: |009|~(`fk'), |012|~(`fi'), |013|~(`fl'), |014|~(`ffi'),
% |015|~(`ffl'), \AE, \ae, \OE, \oe.
%    \begin{macrocode}
\DeclareCharacterInheritance
   { encoding = QX }
   { A = {\`A,\'A,\^A,\~A,\"A,\k A,\AA},
     a = {\`a,\'a,\^a,\~a,\"a,\k a,\aa},
     C = {\'C,\c C},
     c = {\'c,\c c},
     D = {\DH},
     E = {\`E,\'E,\^E,\"E,\k E},
     e = {\`e,\'e,\^e,\"e,\k e},
     f = {011}, % ff
     I = {\`I,\'I,\^I,\"I,\k I},
     i = {\`i,\'i,\^i,\"i,\k i,\i},
     j = {\j},
     L = {\L},
     l = {\l},
     N = {\'N,\~N},
     n = {\'n,\~n},
     O = {\O,\`O,\'O,\^O,\~O,\"O},
     o = {\o,\`o,\'o,\^o,\~o,\"o},
%    \end{macrocode}
%\changes{v2.3c}{2008/09/01}{add \cmd\textcommabelow[\texttt{STst}] to <QX> encoding
%                            (reported by \contributor Vasile Gaburici <vgaburici\at gmail.com>)}
%                                          ^^A private mail, 2008/09/01, and
%                                          ^^A http://tug.org/pipermail/tex-live/2008-September/017385.html
% The Romanian \cmd\textcommabelow\ accents are actually replacements for the
% \cmd\c\ variants, which had previously (and erroneously\footnote{
%   Cf. \url{https://tug.org/pipermail/tex-live/2008-August/017204.html}})
% been included in <QX> encoding. They are still kept for backwards
% compatibility.
%\iffalse
% If \cmd\textcommabelow\ is undefined, it will be silently ignored.
% This is due to a quirk in \cs{\MT@map@clist@}.
%\todo{fix \cs{\MT@map@clist@}?}
%\fi
%    \begin{macrocode}
     S = {\'S,\c S,\textcommabelow S,\v S},
     s = {\'s,\c s,\textcommabelow s,\v s},
     T = {\c T,\textcommabelow T},
     t = {\c t,\textcommabelow t},
     U = {\`U,\'U,\^U,\"U,\k U},
     u = {\`u,\'u,\^u,\"u,\k u},
     Y = {\'Y,\"Y},
     y = {\'y,\"y},
     Z = {\'Z,\.Z,\v Z},
     z = {\'z,\.z,\v z},
     . = \textellipsis
   }

%    \end{macrocode}
%
%\subsubsection{<T5>}
%\changes{v1.9}{2005/08/17}{add list for <T5> (requested by
%                           \contributor H\`an \thanhthe{} Th\`anh <hanthethanh\at gmail.com>)}
%                                                ^^A private email, 2005/08/16
% The Vietnamese encoding <T5>. It is so crowded with accented and double-accented
% characters that there is no room for any ligatures.
%    \begin{macrocode}
\DeclareCharacterInheritance
   { encoding = T5 }
   { A = {\`A,\'A,\~A,\h A,\d A,\^A,\u A,
          \`\Acircumflex,\'\Acircumflex,\~\Acircumflex,\h\Acircumflex,\d\Acircumflex,
          \`\Abreve,\'\Abreve,\~\Abreve,\h\Abreve,\d\Abreve},
     a = {\`a,\'a,\~a,\h a,\d a,\^a,\u a,
          \`\acircumflex,\'\acircumflex,\~\acircumflex,\h\acircumflex,\d\acircumflex,
          \`\abreve,\'\abreve,\~\abreve,\h\abreve,\d\abreve},
     D = {\DJ},
     d = {\dj},
     E = {\`E,\'E,\~E,\h E,\d E,\^E,
          \`\Ecircumflex,\'\Ecircumflex,\~\Ecircumflex,\h\Ecircumflex,\d\Ecircumflex},
     e = {\`e,\'e,\~e,\h e,\d e,\^e,
          \`\ecircumflex,\'\ecircumflex,\~\ecircumflex,\h\ecircumflex,\d\ecircumflex},
     I = {\`I,\'I,\~I,\h I,\d I},
     i = {\`i,\'i,\~i,\h i,\d i,\i},
     O = {\`O,\'O,\~O,\h O,\d O,\^O,\horn O,
          \`\Ocircumflex,\'\Ocircumflex,\~\Ocircumflex,\h\Ocircumflex,\d\Ocircumflex,
          \`\Ohorn,\'\Ohorn,\~\Ohorn,\h\Ohorn,\d\Ohorn},
     o = {\`o,\'o,\~o,\h o,\d o,\^o,\horn o,
          \`\ocircumflex,\'\ocircumflex,\~\ocircumflex,\h\ocircumflex,\d\ocircumflex,
          \`\ohorn,\'\ohorn,\~\ohorn,\h\ohorn,\d\ohorn},
     U = {\`U,\'U,\~U,\h U,\d U,\horn U,
          \`\Uhorn,\'\Uhorn,\~\Uhorn,\h\Uhorn,\d\Uhorn},
     u = {\`u,\'u,\~u,\h u,\d u,\horn u,
          \`\uhorn,\'\uhorn,\~\uhorn,\h\uhorn,\d\uhorn},
     Y = {\`Y,\'Y,\~Y,\h Y,\d Y},
     y = {\`y,\'y,\~y,\h y,\d y}
   }

%    \end{macrocode}
%\subsubsection{<EU1>, <EU2>, <TU>}
%\changes{v2.5}{2010/11/05}{add rudimentary list for <EU1> and <EU2>} ^^A (beta:03)
%\changes{v2.6}{2016/04/22}{add <TU> encoding}
% The <EU1> (\xetex), <EU2> (\luatex), and, since \pkg{fontspec} version 2.5,
% <TU> encodings are not well-defined in the sense that they don't
% contain a fixed number of glyphs, all of which must be present.
% OpenType fonts may contain thousands of glyphs, but we only define those
% that should be present in every font (basically <T1>). This inheritance list
% should be overridden by font-specific ones.
%    \begin{macrocode}
\DeclareCharacterInheritance
   { encoding = {TU,EU1,EU2} }
   { A = {\`A,\'A,\^A,\~A,\"A,\r A,\k A,\u A},
     a = {\`a,\'a,\^a,\~a,\"a,\r a,\k a,\u a},
     C = {\'C,\c C,\v C},
     c = {\'c,\c c,\v c},
     D = {\v D,\DH},
     d = {\v d,\dj},
     E = {\`E,\'E,\^E,\"E,\k E,\v E},
     e = {\`e,\'e,\^e,\"e,\k e,\v e},
%     f = {/f_f}, % sometimes /f_f, sometimes /ff
     G = {\u G},
     g = {\u g},
     I = {\`I,\'I,\^I,\"I,\.I},
     i = {\`i,\'i,\^i,\"i,\i},
%     j = {\j},
     L = {\L,\'L,\v L},
     l = {\l,\'l,\v l},
     N = {\'N,\~N,\v N},
     n = {\'n,\~n,\v n},
     O = {\O,\`O,\'O,\^O,\~O,\"O,\H O},
     o = {\o,\`o,\'o,\^o,\~o,\"o,\H o},
     R = {\'R,\v R},
     r = {\'r,\v r},
     S = {\'S,\c S,\v S}, % \SS
     s = {\'s,\c s,\v s},
     T = {\c T,\v T},
     t = {\c t,\v t},
     U = {\`U,\'U,\^U,\"U,\H U,\r U},
     u = {\`u,\'u,\^u,\"u,\H u,\r u},
     Y = {\'Y,\"Y},
     y = {\'y,\"y},
     Z = {\'Z,\.Z,\v Z},
     z = {\'z,\.z,\v z}
   }

%</m-t>
%    \end{macrocode}
%\subsubsection{<LGR>}
%\changes{v3.0}{2021/06/24}{add settings for <LGR>}
% The Greek <LGR> encoding. <EB> Garamond contains some more glyphs.
%    \begin{macrocode}
%<*m-t|ebg>
\DeclareCharacterInheritance
  { encoding = LGR,
%<ebg>    family = {EBGaramond-OsF,EBGaramond-TOsF,EBGaramond-LF,EBGaramond-TLF}
  }
  {
%<m-t>    A = {012},
%<ebg>    A = {009,012,253},
%<ebg> (l)E = {199},
%<ebg>    H = {010},
%<ebg> (l)H = {159},
    I = {219},
%<ebg> (l)I = {155},
    O = J,
%<ebg> (l)O = {151},
    U = {013,223},
    W = {011},
    a = {014,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,
         144,145,146,148,149,150,248},
    e = {224,225,226,227,232,233,234,235},
    h = {152,153,154,156,157,158,160,161,162,163,164,165,166,167,168,169,170,
         171,172,173,174,175,249},
%<m-t>    i = {200,201,202,203,208,209,210,211,216,217,218,240,241,242,243},
%<ebg>    i = {008,200,201,202,203,208,209,210,211,216,217,218,240,241,242,243},
    o = {228,229,230,231,236,237,238,239},
    r = {251,252},
    u = {015,204,205,206,207,212,213,214,215,220,221,222,244,245,246,247},
    w = {176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,
         193,194,196,197,198,250},
%<ebg>    \textstigma = \textvarstigma,
    . = {059}  % ano teleia
  }

%</m-t|ebg>
%    \end{macrocode}
%
%\subsubsection{Euro symbols}
% Make Euro symbols settings simpler.
%    \begin{macrocode}
%<*zpeu>
\DeclareCharacterInheritance
   { encoding = U,
     family   = {zpeu,zpeus,eurosans} }
   { E = 128 }

%</zpeu>
%<*mvs>
%    \end{macrocode}
% Since 2006/05/11 (that is, one week after I've added these settings, after the
% package had been dormant for six years!), \pkg{marvosym}'s encoding is
% (correctly) <U> instead of <OT1>.
%\changes{v1.9e}{2006/07/05}{adapt to \pkg{marvosym}'s changed encoding}
%    \begin{macrocode}
\DeclareCharacterInheritance
   { encoding = {OT1,U},
     family   = mvs }
   { 164 = {099,100,101} } % \EURhv,\EURcr,\EURtm

%</mvs>
%    \end{macrocode}
%
%\subsection{Tracking}
%\GeneralChanges{Tracking}
%
%\changes{v2.2}{2007/02/23}{add ligatures that are to be disabled}
%\changes{v2.5}{2011/09/07}{add <EU2> encoding to default list} ^^A (beta:09)
%\changes{v2.6}{2016/04/22}{add <TU> encoding to default list}
% By default, we only disable the `f*' ligatures, for those fonts that have
% any. Thus, ligatures and especially kerning for all other characters will be
% retained.
%\changes{v3.2}{2024/05/13}{\texttt{features} instead of \texttt{no ligatures} with \xetex}
% With \xetex, we reset all ligatures (keeping only the \TeX\ pseudo-ligatures).
%    \begin{macrocode}
%<*m-t>
%%% -----------------------------------------------------------------------
%%% TRACKING/LETTERSPACING

\ifx\XeTeXrevision\@undefined
\SetTracking % pdftex/luatex
  [ name         = default,
    no ligatures = {f} ]
  { encoding     = {OT1,T1,T2A,LY1,OT4,QX,EU2,TU} }
  { }
\else
\SetTracking % xetex
  [ name         = default,
    features     = {ResetAll} ]
  { encoding     = {EU1,TU} }
  { }
\fi

%    \end{macrocode}
%
%\subsection{Font expansion}
%\GeneralChanges{Expansion}
%
% These are \thanh's original expansion settings. They are used for all fonts
% (until somebody shows mercy and creates font-specific settings).
%    \begin{macrocode}
%%% -----------------------------------------------------------------------
%%% EXPANSION

\SetExpansion
   [ name     = default      ]
   { encoding = {OT1,OT4,QX,T1,LY1} }
   {
     A = 500,     a = 700,
   \AE = 500,   \ae = 700,
     B = 700,     b = 700,
     C = 700,     c = 700,
     D = 500,     d = 700,
     E = 700,     e = 700,
     F = 700,
     G = 500,     g = 700,
     H = 700,     h = 700,
     K = 700,     k = 700,
     M = 700,     m = 700,
     N = 700,     n = 700,
     O = 500,     o = 700,
   \OE = 500,   \oe = 700,
     P = 700,     p = 700,
     Q = 500,     q = 700,
     R = 700,
     S = 700,     s = 700,
     U = 700,     u = 700,
     W = 700,     w = 700,
     Z = 700,     z = 700,
     2 = 700,
     3 = 700,
     6 = 700,
     8 = 700,
     9 = 700
   }

%    \end{macrocode}
% Settings for Cyrillic <T2A> encoding.\footnote{Contributed by
%                                           \contributor Karl Karlsson <karl-karlsson\at yandex.ru>.}
%\changes{v2.3e}{2009/10/28}{settings for <T2A> encoding
%                            (contributed by \contributor Karl Karlsson <karl-karlsson\at yandex.ru>)}
%    \begin{macrocode}
\SetExpansion
   [ name     = T2A ]
   { encoding = T2A }
   {
     A = 500,     a = 700,
     B = 700,     b = 700,
     C = 700,     c = 700,
     D = 500,     d = 700,
     E = 700,     e = 700,
     F = 700,
     G = 500,     g = 700,
     H = 700,     h = 700,
     K = 700,     k = 700,
     M = 700,     m = 700,
     N = 700,     n = 700,
     O = 500,     o = 700,
     P = 700,     p = 700,
     Q = 500,     q = 700,
     R = 700,
     S = 700,     s = 700,
     U = 700,     u = 700,
     W = 700,     w = 700,
     Z = 700,     z = 700,
     2 = 700,
     3 = 700,
     6 = 700,
     8 = 700,
     9 = 700,
     \CYRA = 500,     \cyra = 700,
     \CYRB = 700,     \cyrb = 700,
     \CYRV = 700,     \cyrv = 700,
     \CYRG = 700,     \cyrg = 700,
     \CYRD = 700,     \cyrd = 700,
     \CYRE = 700,     \cyre = 700,
     \CYRZH = 700,    \cyrzh = 700,
     \CYRZ = 700,     \cyrz = 700,
     \CYRI = 700,     \cyri = 700,
     \CYRISHRT = 700, \cyrishrt = 700,
     \CYRK = 700,     \cyrk = 700,
     \CYRL = 700,     \cyrl = 700,
     \CYRM = 700,     \cyrm = 700,
     \CYRN = 700,     \cyrn = 700,
     \CYRO = 500,     \cyro = 700,
     \CYRP = 700,     \cyrp = 700,
     \CYRR = 700,     \cyrr = 700,
     \CYRS = 700,     \cyrs = 700,
     \CYRT = 700,     \cyrt = 700,
     \CYRU = 700,     \cyru = 700,
     \CYRF = 700,     \cyrf = 700,
     \CYRH = 700,     \cyrh = 700,
     \CYRC = 700,     \cyrc = 700,
     \CYRCH = 700,    \cyrch = 700,
     \CYRSH = 700,    \cyrsh = 700,
     \CYRSHCH = 700,  \cyrshch = 700,
     \CYRHRDSN = 700, \cyrhrdsn = 700,
     \CYRERY = 700,   \cyrery = 700,
     \CYRSFTSN = 700, \cyrsftsn = 700,
     \CYREREV = 700,  \cyrerev = 700,
     \CYRYU = 700,    \cyryu = 700,
     \CYRYA = 700,    \cyrya = 700
   }

%    \end{macrocode}
% <T5> encoding does not contain \cmd\AE, \cmd\ae, \cmd\OE\ and \cmd\oe.
%    \begin{macrocode}
\SetExpansion
   [ name     = T5 ]
   { encoding = T5 }
   {
     A = 500,     a = 700,
     B = 700,     b = 700,
     C = 700,     c = 700,
     D = 500,     d = 700,
     E = 700,     e = 700,
     F = 700,
     G = 500,     g = 700,
     H = 700,     h = 700,
     K = 700,     k = 700,
     M = 700,     m = 700,
     N = 700,     n = 700,
     O = 500,     o = 700,
     P = 700,     p = 700,
     Q = 500,     q = 700,
     R = 700,
     S = 700,     s = 700,
     U = 700,     u = 700,
     W = 700,     w = 700,
     Z = 700,     z = 700,
     2 = 700,
     3 = 700,
     6 = 700,
     8 = 700,
     9 = 700
   }

%</m-t>
%    \end{macrocode}
%
%\subsection{Character protrusion}
%\GeneralChanges{Protrusion}
%
%\changes{v1.1}{2004/09/14}{add factors for some more characters}
%\changes{v1.4b}{2004/11/19}{harmonise dashes in upshape and italic
%                            (\texttt{cmr}, \texttt{pad}, \texttt{ppl})}
%\changes{v1.9}{2005/08/16}{settings for <OT4> encoding (Computer Modern Roman,
%                           Palatino, Times)}
%\changes{v1.9}{2005/08/17}{settings for <T5> encoded Computer Modern Roman}
%\changes{v1.9a}{2005/12/02}{settings for <T5> encoded Charter}
%
%    \begin{macrocode}
%%% -----------------------------------------------------------------------
%%% PROTRUSION

%    \end{macrocode}
% For future historians, \thanh's original settings (from \file{protcode.tex},
% converted to \microtype\ notation).
%\begin{verbatim}
%\SetProtrusion
%   [ name     = thanh ]
%   { encoding = OT1 }
%   {
%     A = {50,50},
%     F = {  ,50},
%     J = {50,  },
%     K = {  ,50},
%     L = {  ,50},
%     T = {50,50},
%     V = {50,50},
%     W = {50,50},
%     X = {50,50},
%     Y = {50,50},
%     k = {  ,50},
%     r = {  ,50},
%     t = {  ,50},
%     v = {50,50},
%     w = {50,50},
%     x = {50,50},
%     y = {50,50},
%     . = { ,700},    {,}= { ,700},
%     : = { ,500},     ; = { ,500},
%     ! = { ,200},     ? = { ,200},
%     ( = {50,  },     ) = {  ,50},
%     - = { ,700},
%     \textendash        = { ,300},     \textemdash        = { ,200},
%     \textquoteleft     = {700, },     \textquoteright    = { ,700},
%     \textquotedblleft  = {500, },     \textquotedblright = { ,500}
%   }
%\end{verbatim}
%
%\subsubsection{Normal}
%
% The default settings always use the most moderate value.
%
%    \begin{macrocode}
%<*cfg-t>
\SetProtrusion
%<m-t>   [ name     = default ]
%    \end{macrocode}
% We also create configuration files for the fonts
%\begin{itemize}
%  \item Bitstream Charter (<NFSS> code |bch|)
%\changes{v1.5}{2004/11/28}{settings for Bitstream Charter}
%    \begin{macrocode}
%<bch>   [ name     = bch-default ]
%    \end{macrocode}
%  \item Bitstream Letter Gothic (|blg|)
%\changes{v2.2}{2007/03/03}{settings for Bitstream Letter Gothic}
%    \begin{macrocode}
%<blg>   [ name     = blg-default ]
%    \end{macrocode}
%  \item Computer Modern Roman (|cmr|)
%    \begin{macrocode}
%<cmr>   [ name     = cmr-default ]
%    \end{macrocode}
%  \item <EB> Garamond
%    \begin{macrocode}
%<ebg>   [ name     = EBGaramond-default ]
%    \end{macrocode}
%  \item Minion\footnote{Contributed by \contributor Harald Harders <h.harders\at tu-bs.de>
%                        and \contributor Karl Karlsson <karl-karlsson\at yandex.ru>.}
%        (|pmnx|, |pmnj|)
%\changes{v1.1}{2004/09/14}{settings for Adobe Minion (contributed by
%                           \contributor Harald Harders <h.harders\at tu-bs.de>)}
%                                                  ^^A private mail, 2004/09/14
%    \begin{macrocode}
%<pmn>   [ name     = pmnj-default ]
%    \end{macrocode}
%  \item Palatino (|ppl|, |pplx|, |pplj|)
%    \begin{macrocode}
%<ppl>   [ name     = ppl-default ]
%    \end{macrocode}
%  \item Times (|ptm|, |ptmx|, |ptmj|)
%    \begin{macrocode}
%<ptm>   [ name     = ptm-default ]
%    \end{macrocode}
%  \item <URW> Garamond (|ugm|)
%\changes{v1.9c}{2006/01/26}{settings for <URW> Garamond}
%\end{itemize}
%    \begin{macrocode}
%<ugm>   [ name     = ugm-default ]
%<m-t|cmr|pmn|ebg>   { }
%<bch|blg|ugm>   { encoding = OT1,
%<ppl|ptm>   { encoding = {OT1,OT4},
%<bch>     family   = bch }
%<blg>     family   = blg }
%<ppl>     family   = {ppl,pplx,pplj} }
%<ptm>     family   = {ptm,ptmx,ptmj} }
%<ugm>     family   = ugm }
   {
%<m-t|bch|blg|cmr|ebg|pmn|ppl|ptm>     A = {50,50},
%<ugm>     A = {50,100},
%<ebg|ptm>   \AE = {50,  },
%<ugm>   \AE = {150,50},
%<ugm>     B = {  ,50},
%<bch|ebg|pmn|ugm>     C = {50,  },
%<bch|ebg|pmn>     D = {  ,50},
%<ugm>     D = {  ,70},
%<ugm>     E = {  ,50},
%<m-t|bch|cmr|ebg|pmn|ptm>     F = {  ,50},
%<ugm>     F = {  ,70},
%<bch|ebg|pmn>     G = {50,  },
%<ugm>     G = {50,50},
%<blg>     I = {150,150},
%<m-t|cmr|ebg|pmn|ppl|ptm|ugm>     J = {50,  },
%<bch|blg>     J = {100,  },
%<!blg>     K = {  ,50},
%<blg>     K = {50,  },
%<m-t|bch|cmr|ebg|pmn|ppl>     L = {  ,50},
%<blg>     L = {  ,150},
%<ptm>     L = {  ,80},
%<ugm>     L = {  ,120},
%<bch|ebg|pmn|ugm>     O = {50,50},
%<ebg>   \OE = {50,  },
%<ugm>   \OE = {50,50},
%<blg>     P = {  ,100},
%<ugm>     P = {  ,50},
%<bch|ebg|pmn>     Q = {50,70},
%<ugm>     Q = {50,50},
%<bch>     R = {  ,50},
%<ugm|ebg>     R = {  ,70},
%<m-t|bch|cmr|pmn|ppl|ptm>     T = {50,50},
%<blg>     T = {100,100},
%<ebg|ugm>     T = {70,70},
%<m-t|bch|cmr|ebg|pmn|ppl|ptm>     V = {50,50},
%<blg|ugm>     V = {70,70},
%<m-t|bch|cmr|ebg|pmn|ppl|ptm>     W = {50,50},
%<ugm>     W = {70,70},
%<m-t|bch|cmr|ebg|pmn|ppl|ptm>     X = {50,50},
%<ugm>     X = {50,70},
%<m-t|bch|cmr|ebg|pmn|ppl>     Y = {50,50},
%<blg|ptm|ugm>     Y = {80,80},
%<ugm>     Z = {50,50},
%<blg>     f = {150,100},
%<blg>     i = {150,150},
%<blg>     j = {100,100},
%<m-t|bch|cmr|ebg|pmn|ppl|ptm>     k = {  ,50},
%<ugm>     k = {  ,70},
%<blg>     l = {150,150},
%<pmn>     l = {  ,-50},
%<ppl>     p = {50,50},
%<ebg|ugm>     p = {  ,50},
%<ebg|ppl>     q = {50,  },
%<!blg>     r = {  ,50},
%<blg>     r = {100, 80},
%<cmr|ebg|pmn>     t = {  ,70},
%<bch>     t = {  ,50},
%<blg>     t = {150, 80},
%<ugm>     t = {  ,100},
%<m-t|bch|cmr|ebg|pmn|ppl|ptm>     v = {50,50},
%<blg>     v = {100,100},
%<ugm>     v = {50,70},
%<m-t|bch|cmr|ebg|pmn|ppl|ptm>     w = {50,50},
%<ugm>     w = {50,70},
%<!blg>     x = {50,50},
%<blg>     x = {100,100},
%<m-t|bch|ebg|pmn>     y = {  ,50},
%<blg>     y = { 50,100},
%<cmr|ppl|ptm>     y = {50,70},
%<ugm>     y = {  ,70},
%    \end{macrocode}
%\changes{v1.6}{2005/01/11}{improve settings for numbers
%               (pointed out by \contributor Peter Muthesius <newsname\at gmx.de>)}
%                                       ^^A MID: <34b1h7F48s44tU1@individual.net>
%    \begin{macrocode}
%<cmr>     0 = {  ,50},
%<m-t>     1 = {50,50},
%<bch|blg|ptm|ugm>     1 = {150,150},
%<cmr>     1 = {100,200},
%<pmn>     1 = {  ,50},
%<ppl>     1 = {100,100},
%<bch|cmr|ugm>     2 = {50,50},
%<blg>     2 = {  ,100},
%<bch|pmn>     3 = {50,  },
%<cmr|ugm>     3 = {50,50},
%<blg>     3 = {100,  },
%<m-t>     4 = {50,50},
%<bch>     4 = {100,50},
%<blg>     4 = {100,  },
%<cmr|ugm>     4 = {70,70},
%<pmn>     4 = {50,  },
%<ptm>     4 = {70,  },
%<cmr>     5 = {  ,50},
%<bch>     6 = {50,  },
%<cmr>     6 = {  ,50},
%<m-t>     7 = {50,50},
%<bch|pmn|ugm>     7 = {50,80},
%<blg>     7 = {100,100},
%<cmr|ptm>     7 = {50,100},
%<ppl>     7 = {  ,50},
%<cmr>     8 = {  ,50},
%<bch>     9 = {50,50},
%<cmr>     9 = {  ,50},
%<m-t|cmr|pmn|ppl|ptm|ugm>     . = { ,700},
%<bch|ebg>     . = { ,600},
%<blg>     . = {400,500},
%<!blg>    {,}= { ,500},
%<blg>    {,}= {300,400},
%<m-t|cmr|pmn|ppl|ptm|ugm>     : = { ,500},
%<bch|ebg>     : = { ,400},
%<blg>     : = {300,400},
%<m-t|bch|ebg|pmn|ptm>     ; = { ,300},
%<blg>     ; = {200,300},
%<cmr|ppl>     ; = { ,500},
%<ugm>     ; = { ,400},
%<!blg>     ! = { ,100},
%<blg>     ! = {200,200},
%<m-t|ebg|pmn|ptm>     ? = { ,100},
%<bch|cmr|ppl|ugm>     ? = { ,200},
%<blg>     ? = {150,150},
%<pmn>     " = {300,300},
%<m-t|bch|cmr|ebg|pmn|ppl>     @ = {50,50},
%<ptm>     @ = {100,100},
%<m-t|bch|blg|cmr|ebg|pmn|ppl|ptm>     ~ = {200,250},
%<ugm>     ~ = {300,350},
%<ebg|ppl|ptm>     & = {50,100},
%<ugm>     & = {  ,100},
%<m-t|cmr|ebg|pmn>    \% = {50,50},
%<bch>    \% = {  ,50},
%<ppl|ptm>    \% = {100,100},
%<ugm>    \% = {50,100},
%<blg>    \# = {100,100},
%<m-t|ppl|ptm|ugm>     * = {200,200},
%<bch|pmn>     * = {200,300},
%<blg>     * = {150,200},
%<cmr|ebg>     * = {300,300},
%<m-t|cmr|ebg|ppl|ptm>     + = {250,250},
%<bch>     + = {150,250},
%<blg|pmn>     + = {150,200},
%<ugm>     + = {250,300},
%<blg|ugm>    {=}= {200,200},
%<m-t|ebg|pmn|ptm>     ( = {100,   },    ) = {   ,200},
%<bch|ugm>     ( = {200,   },    ) = {   ,200},
%<cmr|blg>     ( = {300,   },    ) = {   ,300},
%<ppl>     ( = {100,   },    ) = {   ,300},
%<bch|pmn>     [ = {100,   },    ] = {   ,100},
%<blg>     [ = {300,100},    ] = {   ,300},
%    \end{macrocode}
%\changes{v1.7}{2005/03/15}{fix: remove \textbackslash\ from <OT1>,
%                           add \cmd\textbackslash\ to <T1> encoding}
%    \begin{macrocode}
%<m-t|ebg|pmn|ptm>     / = {100,200},
%<bch>     / = { ,200},
%<blg>     / = {300,300},
%<cmr|ppl>     / = {200,300},
%<ugm>     / = {100,300},
%<m-t|ptm>     - = {500,500},
%<bch|cmr|ppl>     - = {400,500},
%<blg>     - = {300,400},
%<ebg>     - = {300,500},
%<pmn>     - = {200,400},
%<ugm>     - = {500,600},
%<blg>     < = {200,100},    > = {100,200},
%<blg>     _ = {150,250},
%<blg>     | = {250,250},
%<m-t|pmn>     \textendash       = {200,200},   \textemdash        = {150,150},
%<bch>     \textendash       = {200,300},   \textemdash        = {150,250},
%<cmr>     \textendash       = {400,300},   \textemdash        = {300,200},
%<ebg|ppl|ptm>     \textendash       = {300,300},   \textemdash        = {200,200},
%<ugm>     \textendash       = {250,300},   \textemdash        = {250,250},
%    \end{macrocode}
% Why settings for left \emph{and} right quotes? Because in some languages they
% might be used like that (see the \pkg{csquotes} package for examples).
%    \begin{macrocode}
%<m-t|bch|pmn>     \textquoteleft    = {300,400},   \textquoteright    = {300,400},
%<blg>     \textquoteleft     = {400,600},   \textquoteright    = {400,600},
%<cmr>     \textquoteleft    = {500,700},   \textquoteright    = {500,600},
%<ebg>     \textquoteleft    = {300,500},   \textquoteright    = {400,400},
%<ppl>     \textquoteleft    = {500,700},   \textquoteright    = {500,700},
%<ptm>     \textquoteleft    = {500,500},   \textquoteright    = {300,500},
%<ugm>     \textquoteleft    = {300,600},   \textquoteright    = {300,600},
%<m-t|ebg|bch|pmn>     \textquotedblleft = {300,300},   \textquotedblright = {300,300}
%<blg>     \textquotedblright = {300,400}
%<cmr>     \textquotedblleft = {500,300},   \textquotedblright = {200,600}
%<ppl|ptm>     \textquotedblleft = {300,400},   \textquotedblright = {300,400}
%<ugm>     \textquotedblleft = {400,400},   \textquotedblright = {400,400}
   }

%    \end{macrocode}
% Greek uppercase letters are in <OT1> encoding only.
%\changes{v1.9}{2005/07/10}{fix: remove uppercase Greek letters from <T1> encoded <CMR>}
%    \begin{macrocode}
%<*m-t|cmr|ebg|pmn>
\SetProtrusion
%<m-t>   [ name     = OT1-default,
%<cmr>   [ name     = cmr-OT1,
%<ebg>   [ name     = EBGaramond-OT1,
%<pmn>   [ name     = pmnj-OT1,
%<m-t>     load     = default ]
%<cmr>     load     = cmr-default ]
%<ebg>     load     = EBGaramond-default ]
%<pmn>     load     = pmnj-default ]
%<m-t>   { encoding = OT1 }
%<cmr>   { encoding = {OT1,OT4},
%<pmn>   { encoding = OT1,
%<cmr>     family   = cmr  }
%<pmn>     family   = pmnj }
%<ebg>   { }
   {
%<m-t|cmr>     \AE = {50,   },
%<pmn>     \OE = {50,  }
%<*cmr|ebg>
     "00 = {   ,150}, % \Gamma
     "01 = {100,100}, % \Delta
     "02 = { 50, 50}, % \Theta
     "03 = {100,100}, % \Lambda
%<ebg>     "04 = { 50, 50}, % \Xi
%<cmr>     "06 = { 50, 50}, % \Sigma
     "07 = {100,100}, % \Upsilon
     "08 = { 50, 50}, % \Phi
     "09 = { 50, 50}, % \Psi
%<ebg>     "0A = { 50, 50}, % \Omega
%<ebg>     138 = {   , 50}, % \L
%    \end{macrocode}
% Remaining slots can be found in the source file.
%\iffalse ^^A ... namely, here:
%    "05 = {   ,   }, % \Pi
%\fi
%    \begin{macrocode}
%</cmr|ebg>
   }

%    \end{macrocode}
% Settings for figure variants.
%\changes{v3.0}{2021/06/10}{settings for <EB> Garamond figure variants}
%    \begin{macrocode}
%<*ebg>
\SetProtrusion
   [ name     = EBGaramond-OT1-LF,
     load     = EBGaramond-OT1 ]
   { encoding = OT1,
     family   = {EBGaramond-LF,EBGaramond-TLF,EBGaramond-OsF} }
   {
     1 = {50,50},
     2 = {50,50},
     4 = {50,50},
     7 = {50,50},
   }

\SetProtrusion
   [ name     = EBGaramond-OT1-TOsF,
     load     = EBGaramond-OT1 ]
   { encoding = OT1,
     family   = {EBGaramond-TOsF} }
   {
     1 = {150,150},
     2 = {50,50},
     3 = {50,50},
     4 = {50,50},
     5 = {50,50},
     6 = {50,50},
     7 = {50,80},
     8 = {50,50},
     9 = {50,50},
   }

%</ebg>
%</m-t|cmr|ebg|pmn>
%    \end{macrocode}
% <T1> and <LY1> encodings contain some more characters. The default list
% will be loaded first.
%\changes{v1.9a}{2005/11/07}{fix: remove `\texttt{\_}' from <OT1> encoding}
% For \xetex\ (<EU1>) and \luatex\ (<EU2>) we simply use the <T1> list as
% default (for now).
%\changes{v2.5}{2010/11/05}{add default lists for <EU1> and <EU2>} ^^A (beta:03)
%\changes{v2.6}{2016/04/22}{add <TU> encoding to lists}
%    \begin{macrocode}
\SetProtrusion
%<m-t>   [ name     = T1-default,
%<bch>   [ name     = bch-T1,
%<blg>   [ name     = blg-T1,
%<cmr>   [ name     = cmr-T1,
%<ebg>   [ name     = EBGaramond-T1,
%<pmn>   [ name     = pmnj-T1,
%<ppl>   [ name     = ppl-T1,
%<ptm>   [ name     = ptm-T1,
%<ugm>   [ name     = ugm-T1,
%<m-t>     load     = default     ]
%<bch>     load     = bch-default ]
%<blg>     load     = blg-default ]
%<cmr>     load     = cmr-default ]
%<ebg>     load     = EBGaramond-default ]
%<pmn>     load     = pmnj-default ]
%<ppl>     load     = ppl-default ]
%<ptm>     load     = ptm-default ]
%<ugm>     load     = ugm-default ]
%<m-t>   { encoding = {T1,LY1,EU1,EU2,TU} }
%<bch|cmr|pmn|ppl>   { encoding = {T1,LY1},
%<blg|ptm|ugm>   { encoding = {T1},
%<ebg>   { encoding = {LY1},
%<bch>     family   = bch }
%<blg>     family   = blg }
%<cmr>     family   = cmr }
%<ebg>     family   = {EBGaramond-LF,EBGaramond-TLF,EBGaramond-OsF,EBGaramond-TOsF} }
%<pmn>     family   = pmnj }
%<ppl>     family   = {ppl,pplx,pplj} }
%<ptm>     family   = {ptm,ptmx,ptmj} }
%<ugm>     family   = ugm }
   {
%<m-t|cmr>     \AE = {50,  },
%<bch|pmn>     \OE = {50,  },
%<pmn>     \TH = {  ,50},
%<blg>     \v L = {   ,250},
%<blg>     \v d = {   ,250},
%<blg>     \v l = {   ,250},
%<blg>     \v t = {   ,250},
%<blg>     127 =  {300,400},
%<blg>     156 =  {100,   }, % IJ
%<blg>     188 =  { 80, 80}, % ij
%<m-t|bch|ebg|pmn|ppl|ptm>       _ = {100,100},
%<cmr>       _ = {200,200},
%<ugm>       _ = {100,200},
%<m-t|ebg|pmn|ptm>     \textbackslash    = {100,200},
%<bch>     \textbackslash    = {150,200},
%<blg>     \textbackslash    = {250,300},
%<cmr|ppl>     \textbackslash    = {200,300},
%<ugm>     \textbackslash    = {100,300},
%<ugm>     \textbar          = {200,200},
%<blg>     \textendash       = {300,300},   \textemdash        = {150,150},
%<blg>     \textquotedbl     = {300,400},   \textquotedblleft  = {300,400},
%<cmr>     \textquotedbl     = {300,300},   \textquotedblleft  = {200,600},
%    \end{macrocode}
%\changes{v1.4}{2004/10/30}{tweak quote characters for \texttt{cmr}
%                           variants (<OT1>, <T1>, \texttt{lmr})}
% The <EC> fonts do something weird: they insert an implicit kern between quote
% and boundary character. Therefore, we must override the settings from <OT1>.
%    \begin{macrocode}
%<m-t|cmr|ebg|ppl|ptm|ugm>     \quotesinglbase   = {400,400},   \quotedblbase      = {400,400},
%<blg>     \quotesinglbase   = {400,400},   \quotedblbase      = {300,400},
%<bch|pmn>     \quotesinglbase   = {400,400},   \quotedblbase      = {300,300},
%<m-t|bch|pmn>     \guilsinglleft    = {400,300},   \guilsinglright    = {300,400},
%<blg>     \guilsinglleft    = {300,500},   \guilsinglright    = {300,500},
%<cmr|ebg|ppl|ptm>     \guilsinglleft    = {400,400},   \guilsinglright    = {300,500},
%<ugm>     \guilsinglleft    = {400,400},   \guilsinglright    = {300,600},
%<m-t>     \guillemotleft    = {200,200},   \guillemotright    = {200,200},
%<cmr>     \guillemotleft    = {300,200},   \guillemotright    = {100,400},
%<bch|pmn>     \guillemotleft    = {200,200},   \guillemotright    = {150,300},
%<blg|ppl|ptm>     \guillemotleft    = {300,300},   \guillemotright    = {200,400},
%<ebg>     \guillemotleft    = {300,300},   \guillemotright    = {200,300},
%<ugm>     \guillemotleft    = {300,400},   \guillemotright    = {300,400},
%<m-t|bch|cmr|ebg|pmn|ppl|ugm>     \textexclamdown   = {100,   },   \textquestiondown  = {100,   },
%<blg>     \textexclamdown   = {200,   },   \textquestiondown  = {100,   },
%<ptm>     \textexclamdown   = {200,   },   \textquestiondown  = {200,   },
%<m-t|cmr|ebg|ppl|ptm|ugm>     \textbraceleft    = {400,200},   \textbraceright    = {200,400},
%<bch|blg|pmn>     \textbraceleft    = {200,   },   \textbraceright    = {   ,300},
%<m-t|bch|cmr|ebg|ppl|ptm|ugm>     \textless         = {200,100},   \textgreater       = {100,200}
%<pmn>     \textless         = {100,   },   \textgreater       = {   ,100},
%<pmn>     \textvisiblespace = {100,100} % not in LY1
%    \end{macrocode}
%\iffalse
%   \dh = {  ,  },
%   \th = {  ,  },
%   \NG = {  ,  },
%   \ng = {  ,  },
%   \textasciicircum = {  ,  },
%   \textsterling = {  ,  }, % also in TS1
%   \textsection = {  ,  }, % also in TS1
%\fi
%    \begin{macrocode}
   }

%    \end{macrocode}
% The \pkg{lmodern} fonts used to restore the original settings from <OT1>
% fonts. Now, they require even other settings, though.
%\changes{v2.3a}{2008/02/19}{adjust <LMR> quotation marks again}
%    \begin{macrocode}
%<*cmr>
\SetProtrusion
   [ name     = lmr-T1,
     load     = cmr-T1   ]
   { encoding = {T1,LY1},
     family   = lmr      }
   {
     \textquotedblleft  = {300,400},  \textquotedblright = {300,400}
   }

%</cmr>
%<*ebg>
\SetProtrusion
   [ name     = EBGaramond-T1-LF,
     load     = EBGaramond-T1 ]
   { encoding = T1,
     family   = {EBGaramond-LF,EBGaramond-TLF,EBGaramond-OsF} }
   {
     1 = {50,50},
     2 = {50,50},
     4 = {50,50},
     7 = {50,50},
   }

\SetProtrusion
   [ name     = EBGaramond-T1-TOsF,
     load     = EBGaramond-T1 ]
   { encoding = T1,
     family   = {EBGaramond-TOsF} }
   {
     1 = {150,150},
     2 = {50,50},
     3 = {50,50},
     4 = {50,50},
     5 = {50,50},
     6 = {50,50},
     7 = {50,80},
     8 = {50,50},
     9 = {50,50},
   }

%</ebg>
%    \end{macrocode}
% Settings for the <T2A> encoding (generic, Computer Modern Roman, and Minion).\footnote{Contributed by
%                            \contributor Karl Karlsson <karl-karlsson\at yandex.ru>.}
%\changes{v2.3e}{2009/10/28}{settings for <T2A> encoding (contributed by
%                            \contributor Karl Karlsson <karl-karlsson\at yandex.ru>)}
%                                                       ^^A private mail, 2009/10/21
%\changes{v2.4}{2009/11/15}{settings for <T2A> encoded Minion (contributed by
%                           \contributor Karl Karlsson <karl-karlsson\at yandex.ru>)}
%                                                       ^^A private mail, 2009/11/14
%    \begin{macrocode}
%<*m-t|cmr|pmn>
\SetProtrusion
%<m-t>   [ name     = T2A-default,
%<cmr>   [ name     = cmr-T2A,
%<pmn>   [ name     = pmnj-T2A,
%<m-t>     load     = default     ]
%<cmr>     load     = cmr-default ]
%<pmn>     load     = pmnj-default ]
   { encoding = T2A,
%<m-t>   }
%<cmr>     family   = cmr }
%<pmn>     family   = pmnj }
   {
     \CYRA = {50,50},
     \CYRG = {  ,50},
     \CYRK = {  ,50},
     \CYRT = {50,50},
     \CYRH = {50,50},
     \CYRU = {50,50},
%<pmn>     \CYRS = {50,  },
%<pmn>     \CYRO = {50,50},
     \cyrk = {  ,50},
     \cyrg = {  ,50},
     \cyrh = {50,50},
%<m-t|pmn>     \cyru = {50,50},
%<cmr>     \cyru = {50,70},
%<m-t>        _  = {100,100},
%<cmr>        _  = {200,200},
%<m-t>     \textbackslash    = {100,200},   \quotedblbase      = {400,400},
%<cmr>     \textbackslash    = {200,300},   \quotedblbase      = {400,400},
%<pmn>     \textbackslash    = {100,200},   \quotedblbase      = {300,300},
%<cmr>     \textquotedbl     = {300,300},   \textquotedblleft  = {200,600},
%<m-t>     \guillemotleft    = {200,200},   \guillemotright    = {200,200},
%<cmr>     \guillemotleft    = {300,200},   \guillemotright    = {100,400},
%<pmn>     \guillemotleft    = {200,200},   \guillemotright    = {150,300},
%<m-t|cmr>     \textbraceleft    = {400,200},   \textbraceright    = {200,400},
%<pmn>     \textbraceleft    = {200,   },   \textbraceright    = {   ,300},
%<m-t|cmr>     \textless         = {200,100},   \textgreater       = {100,200}
%<pmn>     \textless         = {100,   },   \textgreater       = {   ,100}
   }

%</m-t|cmr|pmn>
%    \end{macrocode}
% Settings for the <QX> encoding (generic and Times).\footnote{Contributed by
%                            \contributor Maciej Eder <maciej_eder\at poczta.onet.pl>.}
%\changes{v1.9d}{2006/04/20}{settings for <QX> encoding (contributed by
%                            \contributor Maciej Eder <maciej_eder\at poczta.onet.pl>)}
%                                                     ^^A private mail, 2006/04/19
% It also includes some glyphs otherwise in <TS1>.
%    \begin{macrocode}
%<*m-t|ptm>
\SetProtrusion
%<m-t>   [ name     = QX-default,
%<ptm>   [ name     = ptm-QX,
%<m-t>     load     = default ]
%<ptm>     load     = ptm-default ]
%<m-t>   { encoding = QX }
%<ptm>   { encoding = QX,
%<ptm>     family   = {ptm,ptmx,ptmj} }
   {
     \AE = {50,  },
%<ptm>      *  = {200,200},
     {=} = {100,100},
     \textunderscore   = {100,100},
     \textbackslash    = {100,200},
     \quotedblbase     = {400,400},
%<m-t>     \guillemotleft    = {200,200},   \guillemotright    = {200,200},
%<ptm>     \guillemotleft    = {300,300},   \guillemotright    = {200,400},
     \textexclamdown   = {100,   },   \textquestiondown  = {100,   },
%<m-t>     \textbraceleft    = {400,200},   \textbraceright    = {200,400},
%<ptm>     \textbraceleft    = {200,200},   \textbraceright    = {200,300},
     \textless         = {200,100},   \textgreater       = {100,200},
     \textminus        = {200,200},   \textdegree        = {300,300},
%<m-t>     \copyright        = {100,100},   \textregistered    = {100,100}
%<ptm>     \copyright        = {100,150},   \textregistered    = {100,150},
%<ptm>     \textxgeq         = {   ,100},   \textxleq          = {100,   },
%<ptm>     \textalpha        = {   , 50},   \textDelta         = { 70, 70},
%<ptm>     \textpi           = { 50, 80},   \textSigma         = {   , 70},
%<ptm>     \textmu           = {   , 80},   \texteuro          = { 50, 50},
%<ptm>     \textellipsis     = {150,200},   \textasciitilde    = { 80, 80},
%<ptm>     \textapprox       = { 50, 50},   \textinfty         = {100,100},
%<ptm>     \textdagger       = {150,150},   \textdaggerdbl     = {100,100},
%<ptm>     \textdiv          = { 50,150},   \textsection       = { 80, 80},
%<ptm>     \texttimes        = {100,150},   \textpm            = { 50, 80},
%<ptm>     \textbullet       = {150,150},   \textperiodcentered = {300,300},
%<ptm>     \textquotesingle  = {500,500},   \textquotedbl      = {300,300},
%<ptm>     \textperthousand  = {    ,50}
   }

%</m-t|ptm>
%    \end{macrocode}
% <T5> is based on <OT1>; it shares some but not all extra characters of <T1>.
% All accented characters are already taken care of by the inheritance list.
%    \begin{macrocode}
%<*cmr|bch>
\SetProtrusion
%<cmr>   [ name     = cmr-T5,
%<cmr>     load     = cmr-default ]
%<bch>   [ name     = bch-T5,
%<bch>     load     = bch-default ]
   { encoding = T5,
%<cmr>     family   = cmr }
%<bch>     family   = bch }
   {
%<bch>     _ = {100,100},
%<bch>     \textbackslash    = {150,200},
%<cmr>     \textbackslash    = {200,300},
%<cmr>     \textquotedblleft = {200,600},
%<cmr>     \textquotedbl     = {300,300},
%<bch>     \quotesinglbase   = {400,400},   \quotedblbase      = {300,300},
%<cmr>     \quotesinglbase   = {400,400},   \quotedblbase      = {400,400},
%<bch>     \guilsinglleft    = {400,300},   \guilsinglright    = {300,400},
%<cmr>     \guilsinglleft    = {400,400},   \guilsinglright    = {300,500},
%<bch>     \guillemotleft    = {200,200},   \guillemotright    = {150,300},
%<cmr>     \guillemotleft    = {300,200},   \guillemotright    = {100,400},
%<bch>     \textbraceleft    = {200,   },   \textbraceright    = {   ,300},
%<cmr>     \textbraceleft    = {400,200},   \textbraceright    = {200,400},
     \textless         = {200,100},   \textgreater       = {100,200}
   }

%</cmr|bch>
%    \end{macrocode}
% Minion with lining numbers.
%    \begin{macrocode}
%<*pmn>
\SetProtrusion
   [ name     = pmnx-OT1,
     load     = pmnj-default ]
   { encoding = OT1,
     family   = pmnx }
   {
     1 = {230,180}
   }

\SetProtrusion
   [ name     = pmnx-T1,
     load     = pmnj-T1  ]
   { encoding = {T1,LY1},
     family   = pmnx     }
   {
     1 = {230,180}
   }

\SetProtrusion
   [ name     = pmnx-T2A,
     load     = pmnj-T2A  ]
   { encoding = {T2A},
     family   = pmnx     }
   {
     1 = {230,180}
   }

%</pmn>
%    \end{macrocode}
% Times is the default font for <LY1>, therefore we provide settings for the
% additional characters in this encoding, too.
%\changes{v1.8}{2005/04/26}{add <LY1> characters for Times}
%    \begin{macrocode}
%<*ptm>
 \SetProtrusion
   [ name     = ptm-LY1,
     load     = ptm-T1 ]
   { encoding = LY1,
     family   = {ptm,ptmx,ptmj} }
   {
     _                         = {100,100},
     \texttrademark            = {100,100},
     \textregistered           = {100,100},
     \textcopyright            = {100,100},
     \textdegree               = {300,300},
     \textminus                = {200,200},
     \textellipsis             = {150,200},
%    \texteuro                 = {   ,   }, % ?
     \textcent                 = {100,100},
     \textquotesingle          = {500,500},
     \textflorin               = { 50, 70},
     \textdagger               = {150,150},
     \textdaggerdbl            = {100,100},
     \textperthousand          = {   , 50},
     \textbullet               = {150,150},
     \textonesuperior          = {100,100},
     \texttwosuperior          = { 50, 50},
     \textthreesuperior        = { 50, 50},
     \textperiodcentered       = {300,300},
     \textplusminus            = { 50, 80},
     \textmultiply             = {100,100},
     \textdivide               = { 50,150}
%    \end{macrocode}
% Remaining slots in the source file.
%\iffalse
%    \textbrokenbar            = {   ,   },
%    \textyen                  = {   ,   },
%    \textfractionsolidus      = {   ,   },
%    \textordfeminine          = {   ,   },
%    \textordmasculine         = {   ,   },
%    \textmu                   = {   ,   },
%    \textparagraph            = {   ,   },
%    \textonequarter           = {   ,   },
%    \textonehalf              = {   ,   },
%    \textthreequarters        = {   ,   },
%\fi
%    \begin{macrocode}
   }

%</ptm>
%    \end{macrocode}
%\changes{v3.0}{2021/06/25}{<LGR> settings for <EB> Garamond}
% For the Greek <LGR> encoding.
%    \begin{macrocode}
%<*ebg>
\SetProtrusion
  [ name = EBGaramond-LGR ]
  { }
  {
     A = {50,50},
     D = {100,100},
     F = {50,50},
     G = {  ,150},
     K = {  ,50},
     L = {100,100},
     O = {50,50},
     U = {100,100},
     T = {50,50},
     W = {  ,50},
     Y = {50,50},
     . = { ,600},
    {,}= { ,500},
     : = { ,400},
     ; = { ,300},
     ! = { ,100},
     ? = { ,100},
     ~ = {200,250},
    \% = {50,50},
     * = {300,300},
     + = {250,250},
    {=}= { 50, 50},
     ( = {100,   },    ) = {   ,200},
     / = {100,200},
     - = {300,500},
     \texteuro = { 50,100},
     \textendash       = {300,300},   \textemdash        = {200,200},
     \textquoteleft    = {300,500},   \textquoteright    = {400,400},
     \guillemotleft    = {300,300},   \guillemotright    = {200,400},
  }

\SetProtrusion
   [ name     = EBGaramond-LGR-LF,
     load     = EBGaramond-LGR ]
   { encoding = LGR,
     family   = {EBGaramond-LF,EBGaramond-TLF,EBGaramond-OsF} }
   {
     1 = {50,50},
     2 = {50,50},
     4 = {50,50},
     7 = {50,50},
   }

\SetProtrusion
   [ name     = EBGaramond-LGR-TOsF,
     load     = EBGaramond-LGR ]
   { encoding = LGR,
     family   = {EBGaramond-TOsF} }
   {
     1 = {150,150},
     2 = {50,50},
     3 = {50,50},
     4 = {50,50},
     5 = {50,50},
     6 = {50,50},
     7 = {50,80},
     8 = {50,50},
     9 = {50,50},
   }

%</ebg>
%    \end{macrocode}
%
%\subsubsection{Italics}
%
%\changes{v1.4b}{2004/11/22}{slanted like italics}
%\changes{v1.6}{2004/12/26}{add italic uppercase Greek letters}
%
% To find default settings for italic is difficult, since the character shapes
% and their behaviour at the beginning or end of line may be wildly different
% for different fonts. In the generic settings we therefore omit the letters,
% and only set up the punctuation characters.
%
% The italic glyphs of Computer Modern Roman feature a lot of side bearing,
% therefore almost all of them have to protrude.\footnote{Settings
%                            contributed by \contributor Hendrik Vogt <hendrik.vogt\at tu-dresden.de>.}
%\changes{v2.5}{2011/04/09}{improvements to Computer Modern Roman italics
%                           (contributed by \contributor Hendrik Vogt <hendrik.vogt\at tu-dresden.de>)}
%                           ^^A private mail, 2011/02/24
%                           ^^A (beta:07)
%
%    \begin{macrocode}
\SetProtrusion
%<m-t>   [ name     = OT1-it   ]
%<bch>   [ name     = bch-it   ]
%<blg>   [ name     = blg-it,
%<blg>     load     = blg-default ]
%<cmr>   [ name     = cmr-it   ]
%<ebg>   [ name     = EBGaramond-it   ]
%<pmn>   [ name     = pmnj-it  ]
%<ppl>   [ name     = ppl-it   ]
%<ptm>   [ name     = ptm-it   ]
%<ugm>   [ name     = ugm-it   ]
%<m-t|bch|blg|ugm>   { encoding = OT1,
%<ppl|ptm>   { encoding = {OT1,OT4},
%<bch>     family   = bch,
%<blg>     family   = blg,
%<ppl>     family   = {ppl,pplx,pplj},
%<ptm>     family   = {ptm,ptmx,ptmj},
%<ugm>     family   = ugm,
%<m-t|bch|ppl|ptm>     shape    = {it,sl}  }
%<blg|ugm>     shape    = it  }
%<cmr|ebg|pmn>   { }
   {
%<cmr>     A = {100,100},
%<ptm>     A = {100,50},
%<ebg|pmn>     A = {50,  },
%<ugm>     A = {  ,150},
%<ppl>     A = {50,50},
%<ptm>   \AE = {100,  },
%<ebg|ppl>   \AE = {50,  },
%<cmr>     B = {83,-40},
%<ebg|ppl|ptm>     B = {50,  },
%<pmn>     B = {20,-50},
%<bch|ppl|ptm|ugm>     C = {50,  },
%<cmr>     C = {165,-75},
%<ebg>     C = {100, },
%<pmn>     C = {50,-50},
%<cmr>     D = {75, -28},
%<ebg|ppl|ptm>     D = {50,50},
%<pmn>     D = {20,  },
%<cmr>     E = {80,-55},
%<ebg|ppl|ptm>     E = {50,  },
%<pmn>     E = {20,-50},
%<cmr>     F = {85,-80},
%<ebg|ptm>     F = {100, },
%<pmn>     F = {10,  },
%<ppl>     F = {50,  },
%<bch|ppl|ptm|ugm>     G = {50,  },
%<cmr>     G = {153,-15},
%<ebg>     G = {100, },
%<pmn>     G = {50,-50},
%<cmr>     H = {73,-60},
%<ebg|ppl|ptm>     H = {50,  },
%<cmr>     I = {140,-120},
%<ebg|ptm>     I = {50,  },
%<pmn>     I = {20,-50},
%<cmr>     J = {135,-80},
%<ebg>     J = {50,  },
%<pmn>     J = {20,  },
%<ptm>     J = {100, },
%<cmr>     K = {70,-30},
%<ebg|ppl|ptm>     K = {50,  },
%<pmn>     K = {20,  },
%<cmr>     L = {87, 40},
%<ebg|ppl|ptm>     L = {50,  },
%<pmn>     L = {20,50},
%<ugm>     L = {  ,100},
%<cmr>     M = {67,-45},
%<pmn>     M = {  ,-30},
%<ptm>     M = {50,  },
%<cmr>     N = {75,-55},
%<pmn>     N = {  ,-30},
%<ptm>     N = {50,  },
%<bch|pmn|ppl|ptm>     O = {50,  },
%<cmr>     O = {150,-30},
%<ebg>     O = {100, },
%<ugm>     O = {70,50},
%<ppl|ptm>   \OE = {50,  },
%<ebg>   \OE = {100, },
%<cmr>     P = {82,-50},
%<ebg|ppl|ptm>     P = {50,  },
%<pmn>     P = {20,-50},
%<bch|pmn|ppl|ptm>     Q = {50,  },
%<cmr>     Q = {150,-30},
%<ebg>     Q = {100, },
%<ugm>     Q = {70,50},
%<cmr>     R = {75, 15},
%<ebg|ppl|ptm>     R = {50,  },
%<pmn>     R = {20,  },
%<bch|ebg|ppl|ptm>     S = {50,  },
%<cmr>     S = {90,-65},
%<pmn>     S = {20,-30},
%<bch|ebg|ppl|ptm>     $ = {50,  },
%<cmr>     $ = {100,-20},
%<pmn>     $ = {20,-30},
%<bch|pmn|ugm>     T = {70,  },
%<cmr>     T = {220,-85},
%<ebg|ppl|ptm>     T = {100, },
%<cmr>     U = {230,-55},
%<ebg|ppl|ptm>     U = {50,  },
%<pmn>     U = {50,-50},
%<cmr>     V = {260,-60},
%<ebg|pmn|ugm>     V = {100, },
%<ppl|ptm>     V = {100,50},
%<cmr>     W = {185,-55},
%<ebg|pmn|ugm>     W = {100, },
%<ppl>     W = {50,  },
%<ptm>     W = {100,50},
%<cmr>     X = {70,-30},
%<ppl|ptm>     X = {50,  },
%<cmr>     Y = {250,-60},
%<pmn>     Y = {50,  },
%<ppl>     Y = {100,50},
%<ptm>     Y = {100, },
%<cmr>     Z = {90,-60},
%<pmn>     Z = {  ,-50},
%<cmr>     a = {150,-10},
%<cmr>     b = {170,   },
%<cmr>     c = {173,-10},
%<cmr>     d = {150,-55},
%<pmn>     d = {  ,-50},
%<cmr>     e = {180, },
%<cmr>     f = {  ,-250},
%<ebg|pmn>     f = { ,-100},
%<cmr>     g = {150,-10},
%<cmr>     h = {100, },
%<cmr>     i = {210, },
%<pmn>     i = {  ,-30},
%<cmr>     j = {  ,-40},
%<pmn>     j = {  ,-30},
%<cmr>     k = {110,-50},
%<cmr>     l = {240,-110},
%<pmn>     l = {  ,-100},
%<cmr>     m = {80, },
%<cmr>     n = {115, },
%<bch>     o = {50,50},
%<cmr>     o = {155, },
%<bch>     p = {  ,50},
%<pmn>     p = {-50,  },
%<bch>     q = {50,  },
%<cmr>     q = {170,-40},
%<cmr>     r = {155,-40},
%<pmn>     r = {  ,50},
%<cmr>     s = {130, },
%<bch>     t = {  ,50},
%<cmr>     t = {230,-10},
%<cmr>     u = {120, },
%<cmr>     v = {140,-25},
%<pmn|ugm>     v = {50,  },
%<bch>     w = {  ,50},
%<cmr>     w = {98,-20},
%<pmn|ugm>     w = {50,  },
%<cmr>     x = {65,-40},
%<bch>     y = {  ,50},
%<cmr>     y = {130,-20},
%<cmr>     z = {110,-80},
%<cmr>     0 = {170,-85},
%<bch|ptm>     1 = {150,100},
%<cmr>     1 = {230,110},
%<ebg>     1 = {150, },
%<pmn>     1 = {50,  },
%<ppl>     1 = {100, },
%<ugm>     1 = {150,150},
%<cmr>     2 = {130,-70},
%<ebg|ppl|ptm>     2 = {50,  },
%<pmn>     2 = {-50,  },
%<bch>     3 = {50,  },
%<cmr>     3 = {140,-70},
%<pmn>     3 = {-100, },
%<ptm>     3 = {100,50},
%<bch>     4 = {100, },
%<cmr>     4 = {130,80},
%<ebg>     4 = {150, },
%<ppl|ptm>     4 = {50,  },
%<cmr>     5 = {160, },
%<ptm>     5 = {50,  },
%<bch>     6 = {50,  },
%<cmr>     6 = {175,-30},
%<bch|ebg|ptm>     7 = {100, },
%<cmr>     7 = {250,-150},
%<pmn>     7 = {20,  },
%<ppl>     7 = {50,  },
%<cmr>     8 = {130,-40},
%<cmr>     9 = {155,-80},
%<m-t|cmr|ebg|pmn|ppl>     . = { ,500},
%<blg>     . = {400,600},
%<bch|ptm|ugm>     . = { ,700},
%<blg>    {,}= {300,500},
%<m-t|ebg|pmn|ppl>    {,}= { ,500},
%<cmr>    {,}= { ,450},
%<bch|ugm>    {,}= { ,600},
%<ptm>    {,}= { ,700},
%<m-t|cmr|ebg|ppl>     : = { ,300},
%<bch|ugm>     : = { ,400},
%<pmn>     : = { ,200},
%<ptm>     : = { ,500},
%<m-t|cmr|ebg|ppl>     ; = { ,300},
%<bch|ugm>     ; = { ,400},
%<pmn>     ; = { ,200},
%<ptm>     ; = { ,500},
%<ptm>     ! = { ,100},
%<bch>     ? = { ,200},
%<ptm>     ? = { ,100},
%<ppl>     ? = { ,300},
%<pmn>     " = {400,200},
%<m-t|ebg|pmn|ppl|ptm>     & = {50,50},
%<bch>     & = {  ,80},
%<cmr>     & = {130,30},
%<ugm>     & = {50,100},
%<m-t|ebg|pmn>    \% = {100, },
%<cmr>    \% = {180,50},
%<bch>    \% = {50,50},
%<ppl|ptm>    \% = {100,100},
%<ugm>    \% = {100,50},
%<m-t|pmn|ppl>     * = {200,200},
%<bch>     * = {300,200},
%<cmr>     * = {380,20},
%<ebg>     * = {500,100},
%<ptm|ugm>     * = {400,200},
%<m-t|pmn|ppl>     + = {150,200},
%<cmr>     + = {180,200},
%<bch|ugm>     + = {250,250},
%<ebg|ptm>     + = {250,200},
%<m-t|ebg|pmn|ppl>     @ = {50,50},
%<bch>     @ = {80,50},
%<cmr>     @ = {180,10},
%<ptm>     @ = {150,150},
%<m-t|bch|ugm>     ~ = {150,150},
%<cmr|ebg|pmn|ppl|ptm>     ~ = {200,150},
%<ugm>    {=}= {200,200},
%<m-t|bch|ebg|pmn|ppl|ptm|ugm>     ( = {200, },    ) = {  ,200},
%<cmr>     ( = {300, },    ) = {  ,70},
%<m-t|ebg|ppl|ptm|ugm>     / = {100,200},
%<cmr>     / = {100,100},
%<bch>     / = {  ,150},
%<pmn>     / = {100,150},
%<m-t>     - = {300,300},
%<bch|ebg>     - = {300,400},
%<pmn>     - = {200,300},
%<cmr>     - = {500,300},
%<ppl>     - = {300,500},
%<ptm>     - = {500,500},
%<ugm>     - = {400,700},
%<blg>     _ = {0,300},
%<m-t|pmn>     \textendash       = {200,200},   \textemdash        = {150,150},
%<bch>     \textendash       = {200,300},   \textemdash        = {150,200},
%<cmr>     \textendash       = {500,300},   \textemdash        = {400,170},
%<ebg|ppl|ptm|ugm>     \textendash       = {300,300},   \textemdash        = {200,200},
%<m-t|bch|pmn|ugm>     \textquoteleft    = {400,200},   \textquoteright    = {400,200},
%<blg>     \textquoteleft     = {400,400},    \textquoteright    = {400,400},
%<cmr>     \textquoteleft    = {800,200},   \textquoteright    = {800,-20},
%<ebg>     \textquoteleft    = {800,200},   \textquoteright    = {800,200},
%<ppl>     \textquoteleft    = {700,400},   \textquoteright    = {700,400},
%<ptm>     \textquoteleft    = {800,500},   \textquoteright    = {800,500},
%<m-t|bch|pmn>     \textquotedblleft = {400,200},   \textquotedblright = {400,200}
%<blg>     \textquotedblright = {300,300}
%<cmr>     \textquotedblleft = {540,100},   \textquotedblright = {500,100}
%<ebg>     \textquotedblleft = {700,200},   \textquotedblright = {700,200}
%<ppl>     \textquotedblleft = {500,300},   \textquotedblright = {500,300}
%<ptm>     \textquotedblleft = {700,400},   \textquotedblright = {700,400}
%<ugm>     \textquotedblleft = {600,200},   \textquotedblright = {600,200}
   }

%<*cmr|ebg|pmn>
\SetProtrusion
%<cmr>   [ name     = cmr-it-OT1,
%<ebg>   [ name     = EBGaramond-it-OT1,
%<pmn>   [ name     = pmnj-it-OT1,
%<cmr>     load     = cmr-it   ]
%<ebg>     load     = EBGaramond-it   ]
%<pmn>     load     = pmnj-it  ]
%<cmr>   { encoding = {OT1,OT4},
%<pmn>   { encoding = OT1,
%<cmr>     family   = cmr,
%<pmn>     family   = pmnj,
%<cmr>     shape    = it       }
%<pmn>     shape    = {it,sl}  }
%<ebg>   { }
   {
%<cmr>     \AE = {100,   },
%<pmn>     \AE = {  ,-50},
%<cmr>     \OE = {100,   },
%<pmn>     \OE = {50,   }
%<*cmr|ebg>
%<cmr>     "00 = {200,150}, % \Gamma
%<ebg>     "00 = {   ,150}, % \Gamma
%<cmr>     "01 = {150,100}, % \Delta
%<ebg>     "01 = {100,100}, % \Delta
%<cmr>     "02 = {150, 50}, % \Theta
%<ebg>     "02 = { 50, 50}, % \Theta
%<cmr>     "03 = {150, 50}, % \Lambda
%<ebg>     "03 = {100,100}, % \Lambda
%<cmr>     "04 = {100,100}, % \Xi
%<ebg>     "04 = { 50, 50}, % \Xi
%<cmr>     "05 = {100,100}, % \Pi
%<cmr>     "06 = {100, 50}, % \Sigma
%<cmr>     "07 = {200,150}, % \Upsilon
%<ebg>     "07 = {100,100}, % \Upsilon
%<cmr>     "08 = {150, 50}, % \Phi
%<ebg>     "08 = { 50, 50}, % \Phi
%<cmr>     "09 = {150,100}, % \Psi
%<ebg>     "09 = { 50, 50}, % \Psi
     "0A = { 50, 50}, % \Omega
%<ebg>     138 = {   , 50}, % \L
%</cmr|ebg>
   }

%</cmr|ebg|pmn>
%<*ebg>
\SetProtrusion
   [ name     = EBGaramond-it-OT1-LF,
     load     = EBGaramond-it-OT1 ]
   { encoding = OT1,
     family   = {EBGaramond-LF,EBGaramond-TLF},
     shape    = it }
   {
     1 = {50,50},
     2 = {50,50},
     3 = {80,50},
     4 = {50,50},
     5 = {50,50},
     6 = {50,50},
     7 = {50,50},
     8 = {50,50},
     9 = {50,  },
   }

\SetProtrusion
   [ name     = EBGaramond-it-OT1-OsF,
     load     = EBGaramond-it-OT1 ]
   { encoding = OT1,
     family   = {EBGaramond-OsF},
     shape    = it }
   {
     1 = {50,50},
     2 = {50,50},
     3 = {  ,80},
     4 = {50,50},
     7 = {50,50},
   }

\SetProtrusion
   [ name     = EBGaramond-it-OT1-TOsF,
     load     = EBGaramond-it-OT1 ]
   { encoding = OT1,
     family   = {EBGaramond-TOsF},
     shape    = it }
   {
     0 = {150,150},
     1 = {150,150},
     2 = {80,80},
     3 = {50,80},
     4 = {50,80},
     5 = {50,80},
     6 = {50,50},
     7 = {50,100},
     8 = {50,50},
     9 = {50,80},
   }

%</ebg>
\SetProtrusion
%<m-t>   [ name     = T1-it-default,
%<bch>   [ name     = bch-it-T1,
%<blg>   [ name     = blg-it-T1,
%<cmr>   [ name     = cmr-it-T1,
%<ebg>   [ name     = EBGaramond-it-T1,
%<pmn>   [ name     = pmnj-it-T1,
%<ppl>   [ name     = ppl-it-T1,
%<ptm>   [ name     = ptm-it-T1,
%<ugm>   [ name     = ugm-it-T1,
%<m-t>     load     = OT1-it   ]
%<bch>     load     = bch-it   ]
%<blg>     load     = blg-T1   ]
%<cmr>     load     = cmr-it   ]
%<pmn>     load     = pmnj-it  ]
%<ebg>     load     = EBGaramond-it   ]
%<ppl>     load     = ppl-it   ]
%<ptm>     load     = ptm-it   ]
%<ugm>     load     = ugm-it   ]
%<m-t|bch|cmr|pmn|ppl>   { encoding = {T1,LY1},
%<ebg>   { encoding = {LY1},
%<blg|ptm|ugm>   { encoding = T1,
%<bch>     family   = bch,
%<blg>     family   = blg,
%<cmr>     family   = cmr,
%<pmn>     family   = pmnj,
%<ebg>     family   = {EBGaramond-LF,EBGaramond-TLF,EBGaramond-OsF,EBGaramond-TOsF},
%<ppl>     family   = {ppl,pplx,pplj},
%<ptm>     family   = {ptm,ptmx,ptmj},
%<ugm>     family   = ugm,
%<m-t|bch|pmn|ppl|ptm>     shape    = {it,sl}  }
%<blg|cmr|ebg|ugm>     shape    = it       }
   {
%<m-t|bch|pmn>     _ = {  ,100},
%<blg>     _ = {0,300},
%<cmr|ugm>     _ = {100,200},
%<ebg|ppl|ptm>     _ = {100,100},
%<blg>     . = {400,600},
%<blg>    {,}= {300,500},
%<cmr>     \AE = {100,   },
%<pmn>     \AE = {  ,-50},
%<bch|pmn>     \OE = { 50,   },
%<cmr>     \OE = {100,   },
%<pmn>     031 = { ,-100}, % ffl
%<cmr|ptm>     156 = {100, },  % IJ
%<ebg>     156 = {50,  },  % IJ
%<pmn>     156 = {20,  },  % IJ
%<pmn>     188 = {  ,-30}, % ij
%<pmn>   \v t = { ,100},
%<m-t|ebg|ppl|ptm>     \textbackslash    = {100,200},
%<cmr|ugm>     \textbackslash    = {300,300},
%<bch>     \textbackslash    = {150,150},
%<pmn>     \textbackslash    = {100,150},
%<ugm>     \textbar          = {200,200},
%<cmr>     \textquotedblleft = {500,300},
%<blg>    \textquoteleft     = {400,400},    \textquoteright    = {400,400},
%<blg>    \textquotedbl      = {300,300},    \textquotedblleft  = {300,300},
%<blg>    \textquotedblright = {300,300},    \quotedblbase      = {200,600},
%<m-t|ptm>     \quotesinglbase   = {300,700},   \quotedblbase      = {400,500},
%<cmr>     \quotesinglbase   = {300,700},   \quotedblbase      = {200,600},
%<bch|pmn>     \quotesinglbase   = {200,500},   \quotedblbase      = {150,500},
%<ebg|ppl>     \quotesinglbase   = {500,500},   \quotedblbase      = {400,400},
%<ugm>     \quotesinglbase   = {300,700},   \quotedblbase      = {300,500},
%<m-t|ppl|ptm>     \guilsinglleft    = {400,400},   \guilsinglright    = {300,500},
%<bch|pmn>     \guilsinglleft    = {300,400},   \guilsinglright    = {200,500},
%<cmr>     \guilsinglleft    = {500,300},   \guilsinglright    = {400,400},
%<ebg>     \guilsinglleft    = {500,400},   \guilsinglright    = {300,500},
%<ugm>     \guilsinglleft    = {400,400},   \guilsinglright    = {300,600},
%<m-t|ppl>     \guillemotleft    = {300,300},   \guillemotright    = {300,300},
%<bch|pmn>     \guillemotleft    = {200,300},   \guillemotright    = {150,400},
%<cmr>     \guillemotleft    = {400,100},   \guillemotright    = {200,300},
%<ebg>     \guillemotleft    = {300,300},   \guillemotright    = {200,400},
%<ptm>     \guillemotleft    = {300,400},   \guillemotright    = {200,400},
%<ugm>     \guillemotleft    = {300,400},   \guillemotright    = {300,400},
%<m-t|ebg|ppl|ugm>     \textexclamdown   = {100,   },   \textquestiondown  = {200,   },
%<cmr|ptm>     \textexclamdown   = {200,   },   \textquestiondown  = {200,   },
%<pmn>     \textexclamdown   = {-50,   },   \textquestiondown  = {-50,   },
%<m-t|ppl|ugm>     \textbraceleft    = {200,100},   \textbraceright    = {200,200},
%<bch|pmn>     \textbraceleft    = {200,   },   \textbraceright    = {   ,200},
%<cmr|ebg|ptm>     \textbraceleft    = {400,100},   \textbraceright    = {200,200},
%<bch|pmn>     \textless         = {100,   },   \textgreater       = {   ,100},
%<cmr|ebg|ppl|ptm>     \textless         = {300,100},   \textgreater       = {200,100}
%<pmn>     \textvisiblespace = {100,100}
  }

%<*ebg>
\SetProtrusion
   [ name     = EBGaramond-it-T1-LF,
     load     = EBGaramond-it-T1 ]
   { encoding = T1,
     family   = {EBGaramond-LF,EBGaramond-TLF},
     shape    = it }
   {
     1 = {50,50},
     2 = {50,50},
     3 = {80,50},
     4 = {50,50},
     5 = {50,50},
     6 = {50,50},
     7 = {50,50},
     8 = {50,50},
     9 = {50,  },
   }

\SetProtrusion
   [ name     = EBGaramond-it-T1-OsF,
     load     = EBGaramond-it-T1 ]
   { encoding = T1,
     family   = {EBGaramond-OsF},
     shape    = it }
   {
     1 = {50,50},
     2 = {50,50},
     3 = {  ,80},
     4 = {50,50},
     7 = {50,50},
   }

\SetProtrusion
   [ name     = EBGaramond-it-T1-TOsF,
     load     = EBGaramond-it-T1 ]
   { encoding = T1,
     family   = {EBGaramond-TOsF},
     shape    = it }
   {
     0 = {150,150},
     1 = {150,150},
     2 = {80,80},
     3 = {50,80},
     4 = {50,80},
     5 = {50,80},
     6 = {50,50},
     7 = {50,100},
     8 = {50,50},
     9 = {50,80},
   }

%</ebg>
%<*m-t|cmr|pmn>
\SetProtrusion
%<m-t>   [ name     = T2A-it-default,
%<cmr>   [ name     = cmr-it-T2A,
%<pmn>   [ name     = pmnj-it-T2A,
%<m-t>     load     = OT1-it   ]
%<cmr>     load     = cmr-it   ]
%<pmn>     load     = pmnj-it  ]
   { encoding = T2A,
%<cmr>     family   = cmr,
%<pmn>     family   = pmnj,
%<m-t|pmn>     shape    = {it,sl}  }
%<cmr>     shape    = it       }
   {
%<cmr>     \CYRA = {100,50},
%<pmn>     \CYRA = {50,  },
%<cmr>     \CYRB = {50,  },
%<cmr>     \CYRV = {50,  },
%<pmn>     \CYRV = {20,-50},
%<cmr>     \CYRG = {100, },
%<pmn>     \CYRG = {10,  },
%<cmr>     \CYRD = {50,  },
%<cmr>     \CYRE = {50,  },
%<pmn>     \CYRE = {20,-50},
%<cmr>     \CYRZH = {50,  },
%<cmr>     \CYRZ = {50,  },
%<pmn>     \CYRZ = {20,-50},
%<cmr>     \CYRI = {50,  },
%<pmn>     \CYRI = {  ,-30},
%<cmr>     \CYRISHRT = {50,  },
%<cmr>     \CYRK = {50,  },
%<pmn>     \CYRK = {20,  },
%<cmr>     \CYRL = {50,  },
%<cmr>     \CYRM = {50,  },
%<pmn>     \CYRM = {  ,-30},
%<cmr>     \CYRN = {50,  },
%<cmr>     \CYRO = {100, },
%<pmn>     \CYRO = {50,  },
%<cmr>     \CYRP = {50,  },
%<cmr>     \CYRR = {50,  },
%<pmn>     \CYRR = {20,-50},
%<cmr>     \CYRS = {100, },
%<pmn>     \CYRS = {50,  },
%<cmr>     \CYRT = {100, },
%<pmn>     \CYRT = {70,  },
%<cmr>     \CYRU = {100, },
%<pmn>     \CYRU = {50,  },
%<cmr>     \CYRF = {100, },
%<cmr>     \CYRH = {50,  },
%<cmr>     \CYRC = {50,  },
%<cmr>     \CYRCH = {100, },
%<cmr>     \CYRSH = {50,  },
%<cmr>     \CYRSHCH = {50,  },
%<cmr>     \CYRHRDSN = {100, },
%<cmr>     \CYRERY = {50,  },
%<cmr>     \CYRSFTSN = {50,  },
%<cmr>     \CYREREV = {50,  },
%<cmr>     \CYRYU = {50,  },
%<cmr>     \CYRYA = {50,  },
%<pmn>     \CYRYA = {  ,20},
%<pmn>     \cyrr = {-50,  },
%<m-t|pmn>      _ = {  ,100},
%<cmr>      _ = {100,200},
%<pmn>      031 = { ,-100}, % ffl
%<pmn>     \v t = { ,100},
%<m-t>     \textbackslash    = {100,200},   \quotedblbase      = {400,500},
%<cmr>     \textbackslash    = {300,300},   \quotedblbase      = {200,600},
%<pmn>     \textbackslash    = {100,150},   \quotedblbase      = {150,500},
%<m-t>     \guillemotleft    = {300,300},   \guillemotright    = {300,300},
%<cmr>     \guillemotleft    = {400,100},   \guillemotright    = {200,300},
%<pmn>     \guillemotleft    = {200,300},   \guillemotright    = {150,400},
%<m-t>     \textbraceleft    = {200,100},   \textbraceright    = {200,200},
%<cmr>     \textbraceleft    = {400,100},   \textbraceright    = {200,200},
%<pmn>     \textbraceleft    = {200,   },   \textbraceright    = {   ,200},
%<cmr>     \textquotedblleft = {500,300},
%<cmr>     \textless         = {300,100},   \textgreater       = {200,100}
%<pmn>     \textless         = {100,   },   \textgreater       = {   ,100}
  }

%</m-t|cmr|pmn>
%<*m-t|ptm>
\SetProtrusion
%<m-t>   [ name     = QX-it-default,
%<ptm>   [ name     = ptm-it-QX,
%<m-t>     load     = OT1-it ]
%<ptm>     load     = ptm-it ]
   { encoding = {QX},
%<ptm>     family   = {ptm,ptmx,ptmj},
     shape    = {it,sl}  }
   {
%<ptm>     009 = {  , 50}, % fk
     {=} = {100,100},
%<m-t>     \textunderscore   = {100,100},
%<ptm>     \textunderscore   = {100,150},
     \textbackslash    = {100,200},
     \quotedblbase     = {300,400},
%<m-t>     \guillemotleft    = {300,300},   \guillemotright    = {300,300},
%<ptm>     \guillemotleft    = {200,400},   \guillemotright    = {200,400},
     \textexclamdown   = {200,   },   \textquestiondown  = {200,   },
     \textbraceleft    = {200,100},   \textbraceright    = {200,200},
     \textless         = {100,100},   \textgreater       = {100,100},
     \textminus        = {200,200},   \textdegree        = {300,150},
%<m-t>     \copyright        = {100,100},   \textregistered    = {100,100}
%<ptm>     \textregistered   = {100,150},   \copyright         = {100,150},
%<ptm>     \textDelta        = { 70,   },   \textdelta         = {   , 50},
%<ptm>     \textpi           = { 50, 80},   \textmu            = {   , 80},
%<ptm>     \texteuro         = {200,   },   \textellipsis      = {100,200},
%<ptm>     \textquoteleft    = {500,400},   \textquoteright    = {500,400},
%<ptm>     \textquotedblleft = {500,300},   \textquotedblright = {400,400},
%<ptm>     \textapprox       = { 50, 50},   \textinfty         = {100,100},
%<ptm>     \textdagger       = {150,150},   \textdaggerdbl     = {100,100},
%<ptm>     \textdiv          = {150,150},   \textasciitilde    = { 80, 80},
%<ptm>     \texttimes        = {100,150},   \textpm            = { 50, 80},
%<ptm>     \textbullet       = {300,100},   \textperiodcentered = {300,300},
%<ptm>     \textquotesingle  = {500,500},   \textquotedbl      = {300,300},
%<ptm>     \textperthousand  = {    ,50}
   }

%</m-t|ptm>
%<*cmr|bch>
\SetProtrusion
%<cmr>   [ name = cmr-it-T5,
%<cmr>     load = cmr-it ]
%<bch>   [ name = bch-it-T5,
%<bch>     load = bch-it ]
   { encoding = T5,
%<bch>     family   = bch,
%<cmr>     family   = cmr,
     shape    = it }
   {
%<bch>      _ = {  ,100},
%<cmr>      _ = {100,200},
%<bch>     \textbackslash    = {150,150},
%<cmr>     \textbackslash    = {300,300},
%<bch>     \quotesinglbase   = {200,500},   \quotedblbase      = {150,500},
%<cmr>     \quotesinglbase   = {300,700},   \quotedblbase      = {200,600},
%<bch>     \guilsinglleft    = {300,400},   \guilsinglright    = {200,500},
%<cmr>     \guilsinglleft    = {500,300},   \guilsinglright    = {400,400},
%<bch>     \guillemotleft    = {200,300},   \guillemotright    = {150,400},
%<cmr>     \guillemotleft    = {400,100},   \guillemotright    = {200,300},
%<bch>     \textbraceleft    = {200,   },   \textbraceright    = {   ,200},
%<cmr>     \textbraceleft    = {400,100},   \textbraceright    = {200,200},
%<bch>     \textless         = {100,   },   \textgreater       = {   ,100}
%<cmr>     \textless         = {300,100},   \textgreater       = {200,100}
  }

%</cmr|bch>
%    \end{macrocode}
%\changes{v1.8}{2005/06/01}{verified settings for slanted Computer Modern Roman}
% Slanted is very similar to italic.
%    \begin{macrocode}
%<*cmr>
\SetProtrusion
   [ name     = cmr-sl,
     load     = cmr-it-OT1 ]
   { encoding = {OT1,OT4},
     family   = cmr,
     shape    = sl  }
   {
      L = {  ,50},
      f = { ,-50},
      - = {300, },
     \textendash = {400,  },  \textemdash = {300,  }
   }

\SetProtrusion
   [ name     = cmr-sl-T1,
     load     = cmr-it-T1 ]
   { encoding = {T1,LY1},
     family   = cmr,
     shape    = sl  }
   {
      L = {  ,50},
      f = { ,-50},
      - = {300, },
     \textendash = {400,  },  \textemdash = {300,  }
   }

\SetProtrusion
   [ name     = cmr-sl-T2A,
     load     = cmr-it-T2A ]
   { encoding = T2A,
     family   = cmr,
     shape    = sl  }
   {
      L = {  ,50},
      f = { ,-50},
      - = {300, },
     \textendash = {400,  },  \textemdash = {300,  }
   }

\SetProtrusion
   [ name     = cmr-sl-T5,
     load     = cmr-it-T5 ]
   { encoding = T5,
     family   = cmr,
     shape    = sl  }
   {
      L = {  ,50},
      f = { ,-50},
      - = {300, },
     \textendash = {400,  },  \textemdash = {300,  }
   }

\SetProtrusion
   [ name     = lmr-it-T1,
     load     = cmr-it-T1 ]
   { encoding = {T1,LY1},
     family   = lmr,
     shape    = {it,sl} }
   {
     \textquotedblleft  = { ,200},  \textquotedblright = { ,200},
     \quotesinglbase    = { ,400},  \quotedblbase      = { ,500}
   }

%    \end{macrocode}
% Oldstyle numerals are slightly different.
%    \begin{macrocode}
\SetProtrusion
   [ name = cmr(oldstyle)-it,
     load = cmr-it-T1 ]
   { encoding = T1,
     family   = {hfor,cmor},
     shape    = {it,sl}  }
   {
     1 = {250, 50},
     2 = {150,-100},
     3 = {100,-50},
     4 = {150,150},
     6 = {200,   },
     7 = {200, 50},
     8 = {150,-50},
     9 = {100, 50}
   }

%</cmr>
%<*pmn>
\SetProtrusion
   [ name     = pmnx-it,
     load     = pmnj-it ]
   { encoding = OT1,
     family   = pmnx,
     shape    = {it,sl} }
   {
     1 = {100,150}
   }

\SetProtrusion
   [ name     = pmnx-it-T1,
     load     = pmnj-it-T1 ]
   { encoding = {T1,LY1},
     family   = pmnx,
     shape    = {it,sl} }
   {
     1 = {100,150}
   }

\SetProtrusion
   [ name     = pmnx-it-T2A,
     load     = pmnj-it-T2A ]
   { encoding = {T2A},
     family   = pmnx,
     shape    = {it,sl} }
   {
     1 = {100,150}
   }

%</pmn>
%<*ptm>
\SetProtrusion
   [ name     = ptm-it-LY1,
     load     = ptm-it-T1   ]
   { encoding = {LY1},
     family   = {ptm,ptmx,ptmj},
     shape    = {it,sl}  }
   {
     _                         = {100,100},
     \texttrademark            = {100,100},
     \textregistered           = {100,100},
     \textcopyright            = {100,100},
     \textdegree               = {300,100},
     \textminus                = {200,200},
     \textellipsis             = {100,200},
%    \texteuro                 = {   ,   }, % ?
     \textcent                 = {100,100},
     \textquotesingle          = {500,   },
     \textflorin               = {100, 70},
     \textdagger               = {150,150},
     \textdaggerdbl            = {100,100},
     \textbullet               = {150,150},
     \textonesuperior          = {150,100},
     \texttwosuperior          = {150, 50},
     \textthreesuperior        = {150, 50},
     \textparagraph            = {100,   },
     \textperiodcentered       = {500,300},
     \textonequarter           = { 50,   },
     \textonehalf              = { 50,   },
     \textplusminus            = {100,100},
     \textmultiply             = {150,150},
     \textdivide               = {150,150}
   }

%</ptm>
%    \end{macrocode}
%
%\subsubsection{Small caps}
%
% Small caps should inherit the values from their big brothers. Since values are
% relative to character width, we don't need to adjust them any further (but
% we have to reset some characters).
%    \begin{macrocode}
%<*!(blg|ugm)>
\SetProtrusion
%<m-t>   [ name     = OT1-sc,
%<bch>   [ name     = bch-sc,
%<cmr>   [ name     = cmr-sc-OT1,
%<ebg>   [ name     = EBGaramond-sc-OT1-Prop,
%<pmn>   [ name     = pmnj-sc,
%<ppl>   [ name     = ppl-sc,
%<ptm>   [ name     = ptm-sc,
%<m-t>     load     = default ]
%<bch>     load     = bch-default ]
%<cmr>     load     = cmr-OT1 ]
%<ebg>     load     = EBGaramond-OT1-LF ]
%<pmn>     load     = pmnj-default ]
%<ppl>     load     = ppl-default ]
%<ptm>     load     = ptm-default ]
%<m-t|bch|ebg|pmn>   { encoding = OT1,
%<cmr|ppl|ptm>   { encoding = {OT1,OT4},
%<bch>     family   = bch,
%<cmr>     family   = cmr,
%<ebg>     family   = {EBGaramond-LF,EBGaramond-OsF},
%<pmn>     family   = pmnj,
%<ppl>     family   = {ppl,pplx,pplj},
%<ptm>     family   = {ptm,ptmx,ptmj},
     shape    = sc }
   {
     a = {50,50},
%<cmr|ebg|ppl|ptm>   \ae = {50,  },
%<bch|pmn>     c = {50,  },
%<bch|ebg|pmn>     d = {  ,50},
%<m-t|bch|cmr|ebg|pmn|ptm>     f = {  ,50},
%<bch|ebg|pmn>     g = {50,  },
%<m-t|cmr|ebg|pmn|ppl|ptm>     j = {50,  },
%<bch>     j = {100,  },
%<m-t|bch|cmr|ebg|pmn|ppl>     l = {  ,50},
%<ptm>     l = {  ,80},
%<m-t|bch|cmr|pmn|ppl>   013 = {  ,50}, % fl
%<ptm>   013 = {  ,80}, % fl
%<bch|ebg|pmn>     o = {50,50},
%<ebg|pmn>   \oe = {50,  },
%<ppl>     p = { 0, 0},
%<bch|ebg|pmn>     q = {50,70},
%<ppl>     q = { 0,  },
%<m-t|cmr|ebg|pmn|ppl|ptm>     r = {  , 0},
     t = {50,50},
%<m-t|bch|cmr|ebg|pmn|ppl>     y = {50,50}
%<ptm>     y = {80,80}
   }

%<*ebg>
\SetProtrusion
   [ name     = EBGaramond-sc-OT1-Tab,
     load     = EBGaramond-OT1-TOsF ]
   { encoding = OT1,
     family   = {EBGaramond-TLF,EBGaramond-TOsF},
     shape    = sc }
   {
     a = {50,50},
   \ae = {50,  },
     d = {  ,50},
     f = {  ,50},
     g = {50,  },
     j = {50,  },
     l = {  ,50},
     o = {50,50},
   \oe = {50,  },
     q = {50,70},
     r = {  , 0},
     t = {50,50},
     y = {50,50}
   }

%</ebg>
\SetProtrusion
%<m-t>   [ name     = T1-sc,
%<bch>   [ name     = bch-sc-T1,
%<cmr>   [ name     = cmr-sc-T1,
%<ebg>   [ name     = EBGaramond-sc-T1,
%<pmn>   [ name     = pmnj-sc-T1,
%<ppl>   [ name     = ppl-sc-T1,
%<ptm>   [ name     = ptm-sc-T1,
%<m-t>     load     = T1-default ]
%<bch>     load     = bch-T1     ]
%<cmr>     load     = cmr-T1     ]
%<ebg>     load     = EBGaramond-T1     ]
%<pmn>     load     = pmnj-T1    ]
%<ppl>     load     = ppl-T1     ]
%<ptm>     load     = ptm-T1     ]
%<!ebg>   { encoding = {T1,LY1},
%<ebg>   { encoding = {LY1},
%<bch>     family   = bch,
%<cmr>     family   = cmr,
%<ebg>     family   = {EBGaramond-LF,EBGaramond-TLF,EBGaramond-OsF,EBGaramond-TOsF},
%<pmn>     family   = pmnj,
%<ppl>     family   = {ppl,pplx,pplj},
%<ptm>     family   = {ptm,ptmx,ptmj},
     shape    = sc }
   {
     a = {50,50},
%<cmr|ebg|ppl|ptm>   \ae = {50,  },
%<bch|pmn>     c = {50,  },
%<bch|ebg|pmn>     d = {  ,50},
%<m-t|bch|cmr|ebg|pmn|ptm>     f = {  ,50},
%<bch|ebg|pmn>     g = {50,  },
%<m-t|cmr|ebg|pmn|ppl|ptm>     j = {50,  },
%<bch>     j = {100,  },
%<m-t|bch|cmr|ebg|pmn|ppl>     l = {  ,50},
%<ptm>     l = {  ,80},
%<m-t|bch|cmr|pmn|ppl>   029 = {  ,50}, % fl
%<ptm>   029 = {  ,80}, % fl
%<bch|ebg|pmn>     o = {50,50},
%<bch|ebg|pmn>   \oe = {50,  },
%<ppl>     p = { 0, 0},
%<bch|ebg|pmn>     q = {50,70},
%<ppl>     q = { 0,  },
%<m-t|cmr|ebg|pmn|ppl|ptm>     r = {  , 0},
     t = {50,50},
%<m-t|bch|cmr|ebg|pmn|ppl>     y = {50,50}
%<ptm>     y = {80,80}
   }

%</!(blg|ugm)>
%<*m-t|cmr>
\SetProtrusion
%<m-t>   [ name     = T2A-sc,
%<cmr>   [ name     = cmr-sc-T2A,
%<m-t>     load     = T2A-default ]
%<cmr>     load     = cmr-T2A     ]
   { encoding = T2A,
%<cmr>     family   = cmr,
     shape    = sc }
   {
     \cyra = {50,50},
     \cyrg = {  ,50},
     \cyrt = {50,50},
     \cyry = {  ,50}
   }

%</m-t|cmr>
%<*m-t>
\SetProtrusion
   [ name     = QX-sc,
     load     = QX-default ]
   { encoding = QX,
     shape    = sc  }
   {
     a = {50,50},
     f = {  ,50},
     j = {50,  },
     l = {  ,50},
   013 = {  ,50}, % fl
     r = {  , 0},
     t = {50,50},
     y = {50,50}
   }

%</m-t>
%<*cmr|bch>
\SetProtrusion
%<bch>   [ name     = bch-sc-T5,
%<bch>     load     = bch-T5 ]
%<cmr>   [ name     = cmr-sc-T5,
%<cmr>     load     = cmr-T5 ]
   { encoding = T5,
%<bch>     family   = bch,
%<cmr>     family   = cmr,
     shape    = sc }
   {
     a = {50,50},
%<bch>     c = {50,  },
%<bch>     d = {  ,50},
     f = {  ,50},
%<bch>     g = {50,  },
%<bch>     j = {100, },
%<cmr>     j = {50,  },
     l = {  ,50},
%<bch>     o = {50,50},
%<bch>     q = { 0,  },
%<cmr>     r = {  , 0},
     t = {50,50},
     y = {50,50}
   }

%</cmr|bch>
%<*ebg>
\SetProtrusion
   [ name     = EBGaramond-sc-T1-Prop,
     load     = EBGaramond-T1-LF ]
   { encoding = T1,
     family   = {EBGaramond-LF,EBGaramond-OsF},
     shape    = sc }
   {
     a = {50,50},
   \ae = {50,  },
     d = {  ,50},
     f = {  ,50},
     g = {50,  },
     j = {50,  },
     l = {  ,50},
     o = {50,50},
   \oe = {50,  },
     q = {50,70},
     r = {  , 0},
     t = {50,50},
     y = {50,50}
   }

\SetProtrusion
   [ name     = EBGaramond-sc-T1-Tab,
     load     = EBGaramond-T1-TOsF ]
   { encoding = T1,
     family   = {EBGaramond-TLF,EBGaramond-TOsF},
     shape    = sc }
   {
     a = {50,50},
   \ae = {50,  },
     d = {  ,50},
     f = {  ,50},
     g = {50,  },
     j = {50,  },
     l = {  ,50},
     o = {50,50},
   \oe = {50,  },
     q = {50,70},
     r = {  , 0},
     t = {50,50},
     y = {50,50}
   }

%</ebg>
%<*pmn>
\SetProtrusion
   [ name     = pmnx-sc,
     load     = pmnj-sc ]
   { encoding = OT1,
     family   = pmnx,
     shape    = sc }
   {
     1 = {230,180}
   }

\SetProtrusion
   [ name     = pmnx-sc-T1,
     load     = pmnj-sc-T1 ]
   { encoding = {T1,LY1},
     family   = pmnx,
     shape    = sc }
   {
     1 = {230,180}
   }

%    \end{macrocode}
%
%\subsubsection{Italic small caps}
% Minion provides real small caps in italics.
% The \pkg{slantsc} package calls them |scit|, Philipp Lehman's
% \pkg{fontinstallationguide} suggests |si|.
%    \begin{macrocode}
\SetProtrusion
   [ name     = pmnj-scit,
     load     = pmnj-it   ]
   { encoding = OT1,
     family   = pmnj,
     shape    = {scit,si} }
   {
     a = {50,  },
   \ae = {  ,-50},
     b = {20,-50},
     c = {50,-50},
     d = {20, 0},
     e = {20,-50},
     f = {10, 0},
   012 = {10,-50}, % fi
   013 = {10,-50}, % fl
   014 = {10,-50}, % ffi
   015 = {10,-50}, % ffl
     g = {50,-50},
     i = {20,-50},
     j = {20, 0},
     k = {20,  },
     l = {20,50},
     m = {  ,-30},
     n = {  ,-30},
     o = {50,  },
   \oe = {50,-50},
     p = {20,-50},
     q = {50,  },
     r = {20, 0},
     s = {20,-30},
     t = {70,  },
     u = {50,-50},
     v = {100,  },
     w = {100,  },
     y = {50,  },
     z = {  ,-50}
   }

\SetProtrusion
   [ name     = pmnj-scit-T1,
     load     = pmnj-it-T1   ]
   { encoding = {T1,LY1},
     family   = pmnj,
     shape    = {scit,si}    }
   {
     a = {50,  },
   \ae = {  ,-50},
     b = {20,-50},
     c = {50,-50},
     d = {20, 0},
     e = {20,-50},
     f = {10, 0},
   028 = {10,-50}, % fi
   029 = {10,-50}, % fl
   030 = {10,-50}, % ffi
   031 = {10,-50}, % ffl
     g = {50,-50},
     i = {20,-50},
   188 = {20, 0},  % ij
     j = {20, 0},
     k = {20,  },
     l = {20,50},
     m = {  ,-30},
     n = {  ,-30},
     o = {50,  },
   \oe = {50,-50},
     p = {20,-50},
     q = {50,  },
     r = {20, 0},
     s = {20,-30},
     t = {70,  },
     u = {50,-50},
     v = {100,  },
     w = {100,  },
     y = {50,  },
     z = {  ,-50}
   }

\SetProtrusion
   [ name     = pmnx-scit,
     load     = pmnj-scit ]
   { encoding = OT1,
     family   = pmnx,
     shape    = {scit,si} }
   {
     1 = {100,150}
   }

\SetProtrusion
   [ name     = pmnx-scit-T1,
     load     = pmnj-scit-T1 ]
   { encoding = {T1,LY1},
     family   = pmnx,
     shape    = {scit,si}    }
   {
     1 = {100,150}
   }

%</pmn>
%<*ebg>
%    \end{macrocode}
% For small caps italics, we copy the definitions from the small caps settings,
%  except that we first load the italics settings.
%\changes{v3.0}{2021/06/23}{settings for <EB> Garamond small caps italics}
%    \begin{macrocode}
\SetProtrusion
   [ name     = EBGaramond-scit-OT1-Prop,
     load     = EBGaramond-it-OT1-LF ]
   { encoding = OT1,
     family   = {EBGaramond-LF,EBGaramond-OsF},
     shape    = scit }
   {
     a = {50,50},
   \ae = {50,  },
     d = {  ,50},
     f = {  ,50},
     g = {50,  },
     j = {50,  },
     l = {  ,50},
     o = {50,50},
   \oe = {50,  },
     q = {50,70},
     r = {  , 0},
     t = {50,50},
     y = {50,50}
   }

\SetProtrusion
   [ name     = EBGaramond-scit-OT1-Tab,
     load     = EBGaramond-it-OT1-TOsF ]
   { encoding = OT1,
     family   = {EBGaramond-TLF,EBGaramond-TOsF},
     shape    = scit }
   {
     a = {50,50},
   \ae = {50,  },
     d = {  ,50},
     f = {  ,50},
     g = {50,  },
     j = {50,  },
     l = {  ,50},
     o = {50,50},
   \oe = {50,  },
     q = {50,70},
     r = {  , 0},
     t = {50,50},
     y = {50,50}
   }

\SetProtrusion
   [ name     = EBGaramond-scit-T1-Prop,
     load     = EBGaramond-it-T1-LF ]
   { encoding = T1,
     family   = {EBGaramond-LF,EBGaramond-OsF},
     shape    = scit }
   {
     a = {50,50},
   \ae = {50,  },
     d = {  ,50},
     f = {  ,50},
     g = {50,  },
     j = {50,  },
     l = {  ,50},
     o = {50,50},
   \oe = {50,  },
     q = {50,70},
     r = {  , 0},
     t = {50,50},
     y = {50,50}
   }

\SetProtrusion
   [ name     = EBGaramond-scit-T1-Tab,
     load     = EBGaramond-it-T1-TOsF ]
   { encoding = T1,
     family   = {EBGaramond-TLF,EBGaramond-TOsF},
     shape    = scit }
   {
     a = {50,50},
   \ae = {50,  },
     d = {  ,50},
     f = {  ,50},
     g = {50,  },
     j = {50,  },
     l = {  ,50},
     o = {50,50},
   \oe = {50,  },
     q = {50,70},
     r = {  , 0},
     t = {50,50},
     y = {50,50}
   }

%</ebg>
%    \end{macrocode}
%
%\subsubsection{Text companion}
%
% Finally the <TS1> encoding.
% Still quite incomplete for Times and especially Palatino. Anybody?
%\changes{v1.2}{2004/09/28}{add settings for Computer Modern Roman and
%                           Adobe Garamond in <TS1> encoding}
%    \begin{macrocode}
\SetProtrusion
%<m-t>   [ name     = textcomp ]
%<bch>   [ name     = bch-textcomp ]
%<blg>   [ name     = blg-textcomp ]
%<cmr>   [ name     = cmr-textcomp ]
%<ebg>   [ name     = EBGaramond-textcomp ]
%<pmn>   [ name     = pmn-textcomp ]
%<ppl>   [ name     = ppl-textcomp ]
%<ptm>   [ name     = ptm-textcomp ]
%<ugm>   [ name     = ugm-textcomp ]
%<m-t>   { encoding = TS1      }
%<!m-t>   { encoding = TS1,
%<bch>     family   = bch }
%<blg>     family   = blg }
%<cmr>     family   = cmr }
%<ebg>     family   = {EBGaramond-LF,EBGaramond-TLF,EBGaramond-OsF,EBGaramond-TOsF} }
%<pmn>     family   = {pmnx,pmnj} }
%<ppl>     family   = {ppl,pplx,pplj} }
%<ptm>     family   = {ptm,ptmx,ptmj} }
%<ugm>     family   = ugm }
   {
%<blg>     \textquotestraightbase    = {400,500},
%<cmr>     \textquotestraightbase    = {300,300},
%<ebg|pmn>     \textquotestraightbase    = {400,400},
%<blg>     \textquotestraightdblbase = {300,400},
%<cmr|pmn>     \textquotestraightdblbase = {300,300},
%<ebg>     \textquotestraightdblbase = {400,400},
%<bch|cmr|ebg|pmn|ugm>     \texttwelveudash          = {200,200},
%<bch|cmr|ebg|pmn>     \textthreequartersemdash  = {150,150},
%<ugm>     \textthreequartersemdash  = {200,200},
%<blg>     \textquotesingle          = {500,600},
%<cmr|pmn>     \textquotesingle          = {300,400},
%<ebg>     \textquotesingle          = {400,500},
%<ptm>     \textquotesingle          = {500,500},
%<ugm>     \textquotesingle          = {300,500},
%<bch|cmr|pmn>     \textasteriskcentered     = {200,300},
%<blg>     \textasteriskcentered     = {150,200},
%<ebg>     \textasteriskcentered     = {300,300},
%<ugm>     \textasteriskcentered     = {100,200},
%<pmn>     \textfractionsolidus      = {-200,-200},
%<cmr>     \textoneoldstyle          = {100,100},
%<pmn>     \textoneoldstyle          = {   , 50},
%<cmr>     \textthreeoldstyle        = {   , 50},
%<ebg|pmn>     \textthreeoldstyle        = { 50,   },
%<cmr>     \textfouroldstyle         = { 50, 50},
%<ebg|pmn>     \textfouroldstyle         = { 50,   },
%<cmr|ebg|pmn>     \textsevenoldstyle        = { 50, 80},
%<cmr>     \textlangle               = {400,   },
%<cmr>     \textrangle               = {   ,400},
%<m-t|bch|pmn|ptm>     \textminus                = {200,200},
%<cmr|ebg|ppl>     \textminus                = {300,300},
%<blg|ugm>     \textminus                = {250,300},
%<bch|ebg|pmn>     \textlbrackdbl            = {100,   },
%<blg>     \textlbrackdbl            = {200,   },
%<bch|ebg|pmn>     \textrbrackdbl            = {   ,100},
%<blg>     \textrbrackdbl            = {   ,200},
%<pmn>     \textasciigrave           = {200,500},
%<bch|blg|cmr|ebg|pmn>     \texttildelow             = {200,250},
%<pmn>     \textasciibreve           = {300,400},
%<pmn>     \textasciicaron           = {300,400},
%<pmn>     \textacutedbl             = {200,300},
%<pmn>     \textgravedbl             = {150,300},
%<bch|pmn|ugm>     \textdagger               = { 80, 80},
%<blg>     \textdagger               = {200,200},
%<cmr|ebg>     \textdagger               = {100,100},
%<ptm>     \textdagger               = {150,150},
%<blg>     \textdaggerdbl            = {150,150},
%<cmr|ebg|pmn>     \textdaggerdbl            = { 80, 80},
%<ptm>     \textdaggerdbl            = {100,100},
%<bch>     \textbardbl               = {100,100},
%<blg|ugm>     \textbardbl               = {150,150},
%<bch>     \textbullet               = {200,200},
%<blg>     \textbullet               = {400,500},
%<cmr|ebg|pmn>     \textbullet               = {   ,100},
%<ptm>     \textbullet               = {150,150},
%<ugm>     \textbullet               = { 50,100},
%<bch|cmr|pmn>     \textcelsius              = { 50,   },
%<ebg>     \textcelsius              = { 80,   },
%<bch>     \textflorin               = { 50, 50},
%<blg>     \textflorin               = {100,100},
%<ebg|ugm>     \textflorin               = {   ,100},
%<pmn>     \textflorin               = { 50,100},
%<ptm>     \textflorin               = { 50, 70},
%<cmr>     \textcolonmonetary        = {   , 50},
%<ebg|pmn>     \textcolonmonetary        = { 50,   },
%<pmn>     \textinterrobang          = {   ,100},
%<pmn>     \textinterrobangdown      = {100,   },
%<m-t|ebg|ptm>     \texttrademark            = {100,100},
%<bch>     \texttrademark            = {150,150},
%<blg|cmr|ppl>     \texttrademark            = {200,200},
%<pmn>     \texttrademark            = { 50, 50},
%<ugm>     \texttrademark            = {100,150},
%<bch|ugm>     \textcent                 = { 50,   },
%<ptm>     \textcent                 = {100,100},
%<bch>     \textsterling             = { 50,   },
%<ugm>     \textsterling             = {   , 50},
%<bch>     \textbrokenbar            = {200,200},
%<blg>     \textbrokenbar            = {250,250},
%<ugm>     \textbrokenbar            = {200,300},
%<pmn>     \textasciidieresis        = {300,400},
%<m-t|bch|cmr|ebg|ptm|ugm>     \textcopyright            = {100,100},
%<pmn>     \textcopyright            = {100,150},
%<ppl>     \textcopyright            = {200,200},
%<bch|cmr|ugm>     \textordfeminine          = {100,200},
%<ebg|pmn>     \textordfeminine          = {200,200},
%<bch|cmr|ebg|pmn|ugm>     \textlnot                 = {200,   },
%<blg>     \textlnot                 = {200,100},
%<m-t|bch|cmr|ebg|ptm|ugm>     \textregistered           = {100,100},
%<pmn>     \textregistered           = { 50,150},
%<ppl>     \textregistered           = {200,200},
%<pmn>     \textasciimacron          = {150,200},
%<m-t|ppl|ptm>     \textdegree               = {300,300},
%<bch>     \textdegree               = {150,200},
%<blg|ugm>     \textdegree               = {200,200},
%<cmr|ebg>     \textdegree               = {400,400},
%<pmn>     \textdegree               = {150,400},
%<bch|cmr|ebg|pmn|ugm>     \textpm                   = {150,200},
%<blg>     \textpm                   = {100,100},
%<ptm>     \textpm                   = { 50, 80},
%<bch|blg|ugm>     \texttwosuperior          = {100,200},
%<cmr>     \texttwosuperior          = { 50,100},
%<ebg|pmn>     \texttwosuperior          = {200,200},
%<ptm>     \texttwosuperior          = { 50, 50},
%<bch|blg|ugm>     \textthreesuperior        = {100,200},
%<cmr>     \textthreesuperior        = { 50,100},
%<ebg|pmn>     \textthreesuperior        = {200,200},
%<ptm>     \textthreesuperior        = { 50, 50},
%<pmn>     \textasciiacute           = {300,400},
%<bch|ugm>     \textmu                   = {   ,100},
%<bch|ebg|pmn>     \textparagraph            = {   ,100},
%<bch|cmr|ebg|pmn>     \textperiodcentered       = {300,400},
%<blg>     \textperiodcentered       = {400,500},
%<ptm>     \textperiodcentered       = {300,300},
%<ugm>     \textperiodcentered       = {200,500},
%<bch|blg|ugm>     \textonesuperior          = {200,300},
%<cmr|ebg|pmn>     \textonesuperior          = {200,200},
%<ptm>     \textonesuperior          = {100,100},
%<bch|ebg|pmn|ugm>     \textordmasculine         = {200,200},
%<blg|cmr>     \textordmasculine         = {100,200},
%<bch|cmr|pmn>     \texteuro                 = {100,   },
%<ebg>     \texteuro                 = { 50,100},
%<bch>     \texttimes                = {200,200},
%<blg|ptm>     \texttimes                = {100,100},
%<cmr>     \texttimes                = {150,250},
%<ebg>     \texttimes                = {100,150},
%<pmn>     \texttimes                = { 70,100},
%<ugm>     \texttimes                = {200,300},
%<bch|ebg|pmn>     \textdiv                  = {150,200}
%<blg>     \textdiv                  = {100,100}
%<cmr>     \textdiv                  = {150,250}
%<ptm>     \textdiv                  = { 50,100},
%<ugm>     \textdiv                  = {200,300},
%<ptm>     \textperthousand          = {    ,50}
%<ugm>     \textsection              = {   ,100},
%<ugm>     \textonehalf              = { 50,100},
%<ugm>     \textonequarter           = { 50,100},
%<ugm>     \textthreequarters        = { 50,100},
%<ugm>     \textsurd                 = {   ,100}
%    \end{macrocode}
% Remaining slots in the source file.
%\iffalse
%    \textyen                     = {  ,  },
%    \texttwooldstyle             = {  ,  },
%    \textfiveoldstyle            = {  ,  },
%    \textsixoldstyle             = {  ,  },
%    \texteightoldstyle           = {  ,  },
%    \textnineoldstyle            = {  ,  },
%    \textleftarrow               = {  ,  },
%    \textrightarrow              = {  ,  },
%    \textblank                   = {  ,  },
%    \textdollar                  = {  ,  },
%    \textdblhyphen               = {  ,  },
%    \textdblhyphenchar           = {  ,  },
%    \textohm                     = {  ,  },
%    \textmho                     = {  ,  },
%    \textbigcircle               = {  ,  },
%    \textuparrow                 = {  ,  },
%    \textdownarrow               = {  ,  },
%    \textborn                    = {  ,  },
%    \textdied                    = {  ,  },
%    \textmarried                 = {  ,  },
%    \textdivorced                = {  ,  },
%    \textleaf                    = {  ,  },
%    \textmusicalnote             = {  ,  },
%    \textdollaroldstyle          = {  ,  },
%    \textcentoldstyle            = {  ,  },
%    \textwon                     = {  ,  },
%    \textnaira                   = {  ,  },
%    \textguarani                 = {  ,  },
%    \textpeso                    = {  ,  },
%    \textlira                    = {  ,  },
%    \textrecipe                  = {  ,  },
%    \textdong                    = {  ,  },
%    \textpertenthousand          = {  ,  },
%    \textpilcrow                 = {  ,  },
%    \textbaht                    = {  ,  },
%    \textnumero                  = {  ,  },
%    \textdiscount                = {  ,  },
%    \textestimated               = {  ,  },
%    \textopenbullet              = {  ,  },
%    \textservicemark             = {  ,  },
%    \textlquill                  = {  ,  },
%    \textrquill                  = {  ,  },
%    \textcopyleft                = {  ,  },
%    \textcircledP                = {  ,  },
%    \textreferencemark           = {  ,  },
%\fi
%    \begin{macrocode}
   }

%<*cmr|ebg|pmn|ugm>
\SetProtrusion
%<cmr>   [ name     = cmr-textcomp-it ]
%<ebg>   [ name     = EBGaramond-textcomp-it ]
%<pmn>   [ name     = pmn-textcomp-it ]
%<ugm>   [ name     = ugm-textcomp-it ]
   { encoding = TS1,
%<cmr>     family   = cmr,
%<ebg>     family   = {EBGaramond-LF,EBGaramond-TLF,EBGaramond-OsF,EBGaramond-TOsF},
%<pmn>     family   = {pmnx,pmnj},
%<ugm>     family   = ugm,
%<cmr|pmn>     shape    = {it,sl} }
%<ebg|ugm>     shape    = it }
   {
%<cmr>     \textquotestraightbase    = {300,600},
%<ebg|pmn>     \textquotestraightbase    = {400,400},
%<cmr>     \textquotestraightdblbase = {300,600},
%<ebg>     \textquotestraightdblbase = {300,400},
%<pmn>     \textquotestraightdblbase = {300,300},
     \texttwelveudash          = {200,200},
%<cmr|ebg|pmn>     \textthreequartersemdash  = {150,150},
%<ugm>     \textthreequartersemdash  = {200,200},
%<cmr>     \textquotesingle          = {600,300},
%<ebg>     \textquotesingle          = {800,100},
%<pmn>     \textquotesingle          = {300,200},
%<ugm>     \textquotesingle          = {500,500},
%<cmr>     \textasteriskcentered     = {300,200},
%<ebg>     \textasteriskcentered     = {500,100},
%<pmn>     \textasteriskcentered     = {200,300},
%<ugm>     \textasteriskcentered     = {300,150},
%<pmn>     \textfractionsolidus      = {-200,-200},
%<cmr>     \textoneoldstyle          = {100, 50},
%<ebg>     \textoneoldstyle          = {100,   },
%<pmn>     \textoneoldstyle          = { 50,   },
%<ebg>     \texttwooldstyle          = { 50,   },
%<pmn>     \texttwooldstyle          = {-50,   },
%<cmr>     \textthreeoldstyle        = {100, 50},
%<pmn>     \textthreeoldstyle        = {-100,  },
%<cmr>     \textfouroldstyle         = { 50, 50},
%<ebg>     \textfouroldstyle         = { 50,100},
%<cmr>     \textsevenoldstyle        = { 50, 80},
%<ebg>     \textsevenoldstyle        = { 50,   },
%<pmn>     \textsevenoldstyle        = { 20,   },
%<cmr>     \textlangle               = {400,   },
%<cmr>     \textrangle               = {   ,400},
%<cmr|ebg>     \textminus                = {300,300},
%<pmn>     \textminus                = {200,200},
%<ugm>     \textminus                = {250,300},
%<ebg|pmn>     \textlbrackdbl            = {100,   },
%<ebg|pmn>     \textrbrackdbl            = {   ,100},
%<pmn>     \textasciigrave           = {300,300},
%<cmr|ebg|pmn>     \texttildelow             = {200,250},
%<pmn>     \textasciibreve           = {300,300},
%<pmn>     \textasciicaron           = {300,300},
%<pmn>     \textacutedbl             = {200,300},
%<pmn>     \textgravedbl             = {150,300},
%<cmr>     \textdagger               = {100,100},
%<ebg>     \textdagger               = {200,100},
%<pmn>     \textdagger               = { 80, 50},
%<ugm>     \textdagger               = { 80, 80},
%<cmr|ebg>     \textdaggerdbl            = { 80, 80},
%<pmn>     \textdaggerdbl            = { 80, 50},
%<ugm>     \textbardbl               = {150,150},
%<cmr>     \textbullet               = {200,100},
%<ebg>     \textbullet               = {300,   },
%<pmn>     \textbullet               = { 30, 70},
%<ugm>     \textbullet               = { 50,100},
%<cmr>     \textcelsius              = {100,   },
%<ebg>     \textcelsius              = {200,   },
%<pmn>     \textcelsius              = { 50,-50},
%<ebg>     \textflorin               = {100,   },
%<pmn>     \textflorin               = { 50,100},
%<ugm>     \textflorin               = {   ,100},
%<cmr>     \textcolonmonetary        = {150,   },
%<ebg>     \textcolonmonetary        = {100,   },
%<pmn>     \textcolonmonetary        = { 50,-50},
%<cmr|ebg>     \texttrademark            = {200,   },
%<pmn>     \texttrademark            = { 50,100},
%<ugm>     \texttrademark            = {150, 50},
%<ugm>     \textcent                 = { 50,   },
%<ugm>     \textsterling             = {   , 50},
%<ugm>     \textbrokenbar            = {200,300},
%<pmn>     \textasciidieresis        = {300,200},
%<cmr>     \textcopyright            = {100,   },
%<ebg>     \textcopyright            = {200,100},
%<pmn>     \textcopyright            = {100,150},
%<ugm>     \textcopyright            = {300,   },
%<cmr>     \textordfeminine          = {100,100},
%<pmn>     \textordfeminine          = {200,200},
%<ugm>     \textordfeminine          = {100,200},
%<cmr|ebg>     \textlnot                 = {300,   },
%<pmn|ugm>     \textlnot                 = {200,   },
%<cmr>     \textregistered           = {100,   },
%<ebg>     \textregistered           = {200,100},
%<pmn>     \textregistered           = { 50,150},
%<ugm>     \textregistered           = {300,   },
%<pmn>     \textasciimacron          = {150,200},
%<cmr|ebg>     \textdegree               = {500,100},
%<pmn>     \textdegree               = {150,150},
%<ugm>     \textdegree               = {300,200},
%<cmr>     \textpm                   = {150,100},
%<ebg>     \textpm                   = {200,150},
%<pmn|ugm>     \textpm                   = {150,200},
%<cmr>     \textonesuperior          = {400,   },
%<ebg>     \textonesuperior          = {300,100},
%<pmn>     \textonesuperior          = {200,100},
%<ugm>     \textonesuperior          = {300,300},
%<cmr>     \texttwosuperior          = {400,   },
%<ebg>     \texttwosuperior          = {300,   },
%<pmn>     \texttwosuperior          = {200,100},
%<ugm>     \texttwosuperior          = {300,200},
%<cmr>     \textthreesuperior        = {400,   },
%<ebg>     \textthreesuperior        = {300,   },
%<pmn>     \textthreesuperior        = {200,100},
%<ugm>     \textthreesuperior        = {300,200},
%<ugm>     \textmu                   = {   ,100},
%<pmn>     \textasciiacute           = {300,200},
%<cmr>     \textparagraph            = {200,   },
%<pmn>     \textparagraph            = {   ,100},
%<cmr>     \textperiodcentered       = {500,500},
%<ebg|pmn|ugm>     \textperiodcentered       = {300,400},
%<cmr>     \textordmasculine         = {100,100},
%<pmn>     \textordmasculine         = {200,200},
%<ugm>     \textordmasculine         = {300,200},
%<cmr>     \texteuro                 = {200,   },
%<ebg>     \texteuro                 = {100,   },
%<pmn>     \texteuro                 = {100,-50},
%<cmr>     \texttimes                = {200,200},
%<ebg>     \texttimes                = {200,100},
%<pmn>     \texttimes                = { 70,100},
%<ugm>     \texttimes                = {200,300},
%<cmr|ebg>     \textdiv                  = {200,200}
%<pmn>     \textdiv                  = {150,200}
%<ugm>     \textdiv                  = {200,300},
%<ugm>     \textsection              = {   ,200},
%<ugm>     \textonehalf              = { 50,100},
%<ugm>     \textonequarter           = { 50,100},
%<ugm>     \textthreequarters        = { 50,100},
%<ugm>     \textsurd                 = {   ,100}
   }

%</cmr|ebg|pmn|ugm>
%    \end{macrocode}
%
%\subsubsection{Computer Modern math}
%
% Now to the math symbols for Computer Modern Roman. Definitions have been
% extracted from \file{fontmath.ltx}.
%\changes{v1.2}{2004/10/02}{add settings for Computer Modern Roman math symbols}
% I did not spend too much time fiddling with these settings, so they can surely
% be improved.
%
% The math font `|operators|' (also used for the \cmd\mathrm\ and
% \cmd\mathbf\ alphabets) is |OT1/cmr|, which we've already set up above.
% It's declared as:
%\begin{verbatim}
%\DeclareSymbolFont{operators}  {OT1}{cmr}{m} {n}
%\SetSymbolFont{operators}{bold}{OT1}{cmr}{bx}{n}
%\end{verbatim}
%
% \cmd\mathit\ (|OT1/cmr/m/it|) is also already set up.
%
% There are (for the moment) no settings for \cmd\mathsf\ and \cmd\mathtt.
%
% Math font `|letters|' (also used as \cmd\mathnormal) is declared as:
%\begin{verbatim}
%\DeclareSymbolFont{letters}    {OML}{cmm}{m}{it}
%\SetSymbolFont{letters}  {bold}{OML}{cmm}{b}{it}
%\end{verbatim}
%\changes{v1.6}{2004/12/26}{tune <CMR> math letters (<OML> encoding)}
%    \begin{macrocode}
%<*cmr>
\SetProtrusion
   [ name     = cmr-math-letters ]
   { encoding = OML,
     family   = cmm,
     series   = {m,b},
     shape    = it    }
   {
       A = {100, 50}, % \mathnormal
       B = { 50,   },
       C = { 50,   },
       D = { 50, 50},
       E = { 50,   },
       F = {100, 50},
       G = { 50, 50},
       H = { 50, 50},
       I = { 50, 50},
       J = {150, 50},
       K = { 50,100},
       L = { 50, 50},
       M = { 50,   },
       N = { 50,   },
       O = { 50,   },
       P = { 50,   },
       Q = { 50, 50},
       R = { 50,   },
       S = { 50,   },
       T = { 50,100},
       U = { 50, 50},
       V = {100,100},
       W = { 50,100},
       X = { 50,100},
       Y = {100,100},
       f = {100,100},
       h = {   ,100},
       i = {   , 50},
       j = {   , 50},
       k = {   , 50},
       r = {   , 50},
       v = {   , 50},
       w = {   , 50},
       x = {   , 50},
     "0B = { 50,100}, % \alpha
     "0C = { 50, 50}, % \beta
     "0D = {200,150}, % \gamma
     "0E = { 50, 50}, % \delta
     "0F = { 50, 50}, % \epsilon
     "10 = { 50,150}, % \zeta
     "12 = { 50,   }, % \theta
     "13 = {   ,100}, % \iota
     "14 = {   ,100}, % \kappa
     "15 = {100, 50}, % \lambda
     "16 = {   , 50}, % \mu
     "17 = {   , 50}, % \nu
     "18 = {   , 50}, % \xi
     "19 = { 50,100}, % \pi
     "1A = { 50, 50}, % \rho
     "1B = {   ,150}, % \sigma
     "1C = { 50,150}, % \tau
     "1D = { 50, 50}, % \upsilon
     "1F = { 50,100}, % \chi
     "20 = { 50, 50}, % \psi
     "21 = {   , 50}, % \omega
     "22 = {   , 50}, % \varepsilon
     "23 = {   , 50}, % \vartheta
     "24 = {   , 50}, % \varpi
     "25 = {100,   }, % \varrho
     "26 = {100,100}, % \varsigma
     "27 = { 50, 50}, % \varphi
     "28 = {100,100}, % \leftharpoonup
     "29 = {100,100}, % \leftharpoondown
     "2A = {100,100}, % \rightharpoonup
     "2B = {100,100}, % \rightharpoondown
     "2C = {300,200}, % \lhook
     "2D = {200,300}, % \rhook
     "2E = {   ,100}, % \triangleright
     "2F = {100,   }, % \triangleleft
     "3A = {   ,500}, % ., \ldotp
     "3B = {   ,500}, % ,
     "3C = {200,100}, % <
     "3D = {300,400}, % /
     "3E = {100,200}, % >
     "3F = {200,200}, % \star
     "5B = {   ,100}, % \flat
     "5E = {200,200}, % \smile
     "5F = {200,200}, % \frown
     "7C = {100,   }, % \jmath
     "7D = {   ,100}  % \wp
%    \end{macrocode}
% Remaining slots in the source file.
%\iffalse
%    "11 = {   ,   }, % \eta
%    "1E = {   ,   }, % \phi
%    "40 = {   ,   }, % \partial
%    "5C = {   ,   }, % \natural
%    "5D = {   ,   }, % \sharp
%    "60 = {   ,   }, % \ell
%    "7B = {   ,   }, % \imath
%\fi
%    \begin{macrocode}
   }

%    \end{macrocode}
% Math font `|symbols|' (also used for the \cmd\mathcal\ alphabet) is declared
% as:
%\begin{verbatim}
%\DeclareSymbolFont{symbols}    {OMS}{cmsy}{m}{n}
%\SetSymbolFont{symbols}  {bold}{OMS}{cmsy}{b}{n}
%\end{verbatim}
%    \begin{macrocode}
\SetProtrusion
   [ name     = cmr-math-symbols ]
   { encoding = OMS,
     family   = cmsy,
     series   = {m,b},
     shape    = n  }
   {
       A = {150, 50}, % \mathcal
       C = {   ,100},
       D = {   , 50},
       F = { 50,150},
       I = {   ,100},
       J = {100,150},
       K = {   ,100},
       L = {100,   },
       M = { 50, 50},
       N = { 50,100},
       P = {   , 50},
       Q = { 50,   },
       R = {   , 50},
       T = { 50,150},
       V = { 50, 50},
       W = {   , 50},
       X = {100,100},
       Y = {100,   },
       Z = {100,150},
     "00 = {300,300}, % -
     "01 = {   ,700}, % \cdot, \cdotp
     "02 = {150,250}, % \times
     "03 = {150,250}, % *, \ast
     "04 = {200,300}, % \div
     "05 = {150,250}, % \diamond
     "06 = {200,200}, % \pm
     "07 = {200,200}, % \mp
     "08 = {100,100}, % \oplus
     "09 = {100,100}, % \ominus
     "0A = {100,100}, % \otimes
     "0B = {100,100}, % \oslash
     "0C = {100,100}, % \odot
     "0D = {100,100}, % \bigcirc
     "0E = {100,100}, % \circ
     "0F = {100,100}, % \bullet
     "10 = {100,100}, % \asymp
     "11 = {100,100}, % \equiv
     "12 = {200,100}, % \subseteq
     "13 = {100,200}, % \supseteq
     "14 = {200,100}, % \leq
     "15 = {100,200}, % \geq
     "16 = {200,100}, % \preceq
     "17 = {100,200}, % \succeq
     "18 = {200,200}, % \sim
     "19 = {150,150}, % \approx
     "1A = {200,100}, % \subset
     "1B = {100,200}, % \supset
     "1C = {200,100}, % \ll
     "1D = {100,200}, % \gg
     "1E = {300,100}, % \prec
     "1F = {100,300}, % \succ
     "20 = {100,200}, % \leftarrow
     "21 = {200,100}, % \rightarrow
     "22 = {100,100}, % \uparrow
     "23 = {100,100}, % \downarrow
     "24 = {100,100}, % \leftrightarrow
     "25 = {100,100}, % \nearrow
     "26 = {100,100}, % \searrow
     "27 = {100,100}, % \simeq
     "28 = {100,100}, % \Leftarrow
     "29 = {100,100}, % \Rightarrow
     "2A = {100,100}, % \Uparrow
     "2B = {100,100}, % \Downarrow
     "2C = {100,100}, % \Leftrightarrow
     "2D = {100,100}, % \nwarrow
     "2E = {100,100}, % \swarrow
     "2F = {   ,100}, % \propto
     "30 = {   ,400}, % \prime
     "31 = {100,100}, % \infty
     "32 = {150,100}, % \in
     "33 = {100,150}, % \ni
     "34 = {100,100}, % \triangle, \bigtriangleup
     "35 = {100,100}, % \bigtriangledown
     "38 = {   ,100}, % \forall
     "39 = {100,   }, % \exists
     "3A = {200,   }, % \neg
     "3E = {200,200}, % \top
     "3F = {200,200}, % \bot, \perp
     "5E = {100,200}, % \wedge
     "5F = {100,200}, % \vee
     "60 = {   ,300}, % \vdash
     "61 = {300,   }, % \dashv
     "62 = {100,100}, % \lfloor
     "63 = {100,100}, % \rfloor
     "64 = {100,100}, % \lceil
     "65 = {100,100}, % \rceil
     "66 = {150,   }, % \lbrace
     "67 = {   ,150}, % \rbrace
     "68 = {400,   }, % \langle
     "69 = {   ,400}, % \rangle
     "6C = {100,100}, % \updownarrow
     "6D = {100,100}, % \Updownarrow
     "6E = {100,300}, % \, \backslash, \setminus
     "72 = {100,100}, % \nabla
     "79 = {200,200}, % \dagger
     "7A = {100,100}, % \ddagger
     "7B = {100,   }, % \mathparagraph
     "7C = {100,100}, % \clubsuit
     "7D = {100,100}, % \diamondsuit
     "7E = {100,100}, % \heartsuit
     "7F = {100,100}  % \spadesuit
%    \end{macrocode}
% Remaining slots in the source file.
%\iffalse
%    "36 = {   ,   }, % \not
%    "37 = {   ,   }, % \mapstochar
%    "3B = {   ,   }, % \emptyset
%    "3C = {   ,   }, % \Re
%    "3D = {   ,   }, % \Im
%    "40 = {   ,   }, % \aleph
%    "5B = {   ,   }, % \cup
%    "5C = {   ,   }, % \cap
%    "5D = {   ,   }, % \uplus
%    "6A = {   ,   }, % \arrowvert, \mid, \vert, |
%    "6B = {   ,   }, % \Arrowvert, \parallel, \Vert
%    "6F = {   ,   }, % \wr
%    "70 = {   ,   }, % \sqrtsign
%    "71 = {   ,   }, % \amalg
%    "73 = {   ,   }, % \smallint
%    "74 = {   ,   }, % \sqcup
%    "75 = {   ,   }, % \sqcap
%    "76 = {   ,   }, % \sqsubseteq
%    "77 = {   ,   }, % \sqsupseteq
%    "78 = {   ,   }, % \mathsection
%\fi
%    \begin{macrocode}
   }

%    \end{macrocode}
% We don't bother about `|largesymbols|', since it will only be used in display
% math, where protrusion doesn't work anyway. It's declared as:
%\begin{verbatim}
%\DeclareSymbolFont{largesymbols}{OMX}{cmex}{m}{n}
%\end{verbatim}
%\iffalse
%\SetProtrusion
%   [ name     = cmr-math-largesymbols ]
%   { encoding = OMX,
%     family   = cmex }
%   {
%     "00 % (
%     "01 % )
%     "02 % [
%     "03 % ]
%     "04 % \lfloor
%     "05 % \rfloor
%     "06 % \lceil
%     "07 % \rceil
%     "08 % \lbrace
%     "09 % \rbrace
%     "0A % <, \langle
%     "0B % >, \rangle
%     "0C % \vert, |
%     "0D % \Vert
%     "0E % /
%     "0F % \backslash
%     "3A % \lgroup
%     "3B % \rgroup
%     "3C % \arrowvert
%     "3D % \Arrowvert
%     "3E % \bracevert
%     "3F % \updownarrow
%     "40 % \lmoustache
%     "41 % \rmoustache
%     "46 % \bigsqcup
%     "48 % \ointop
%     "4A % \bigodot
%     "4C % \bigoplus
%     "4E % \bigotimes
%     "50 % \sum
%     "51 % \prod
%     "52 % \intop
%     "53 % \bigcup
%     "54 % \bigcap
%     "55 % \biguplus
%     "56 % \bigwedge
%     "57 % \bigvee
%     "60 % \coprod
%     "70 % \sqrtsign
%     "77 % \Updownarrow
%     "78 % \uparrow
%     "79 % \downarrow
%     "7A % \braceld, \lmoustache
%     "7B % \bracerd, \rmoustache
%     "7C % \bracelu
%     "7D % \braceru
%     "7E % \Uparrow
%     "7F % \Downarrow
%  }
%\fi
%    \begin{macrocode}
%</cmr>
%</cfg-t>
%    \end{macrocode}
%
% \subsubsection{<AMS> symbols}
%
% Settings for the <AMS> math fonts (\pkg{amssymb}).
%\changes{v1.8}{2005/06/01}{settings for <AMS> math fonts}
%\changes{v1.9d}{2006/02/04}{tweak <AMS> settings}
%    \begin{macrocode}
%<*cfg-u>
%    \end{macrocode}
% Symbol font `a'.
%    \begin{macrocode}
%<*msa>
\SetProtrusion
   [ name     = AMS-a ]
   { encoding = U,
     family   = msa  }
   {
     "05  =  {150,250},  % \centerdot
     "06  =  {100,100},  % \lozenge
     "07  =  { 50, 50},  % \blacklozenge
     "08  =  { 50, 50},  % \circlearrowright
     "09  =  { 50, 50},  % \circlearrowleft
     "0A  =  {100,100},  % \rightleftharpoons
     "0B  =  {100,100},  % \leftrightharpoons
     "0D  =  {-50,200},  % \Vdash
     "0E  =  {-50,200},  % \Vvdash
     "0F  =  {-70,150},  % \vDash
     "10  =  {100,150},  % \twoheadrightarrow
     "11  =  {100,150},  % \twoheadleftarrow
     "12  =  { 50,100},  % \leftleftarrows
     "13  =  { 50, 80},  % \rightrightarrows
     "14  =  {120,120},  % \upuparrows
     "15  =  {120,120},  % \downdownarrows
     "16  =  {200,200},  % \upharpoonright
     "17  =  {200,200},  % \downharpoonright
     "18  =  {200,200},  % \upharpoonleft
     "19  =  {200,200},  % \downharpoonleft
     "1A  =  { 80,100},  % \rightarrowtail
     "1B  =  { 80,100},  % \leftarrowtail
     "1C  =  { 50, 50},  % \leftrightarrows
     "1D  =  { 50, 50},  % \rightleftarrows
     "1E  =  {250,   },  % \Lsh
     "1F  =  {   ,250},  % \Rsh
     "20  =  {100,100},  % \rightsquigarrow
     "21  =  {100,100},  % \leftrightsquigarrow
     "22  =  {100, 50},  % \looparrowleft
     "23  =  { 50,100},  % \looparrowright
     "24  =  { 50, 80},  % \circeq
     "25  =  {   ,100},  % \succsim
     "26  =  {   ,100},  % \gtrsim
     "27  =  {   ,100},  % \gtrapprox
     "28  =  {150, 50},  % \multimap
     "2B  =  {100,150},  % \doteqdot
     "2C  =  {100,150},  % \triangleq
     "2D  =  {100, 50},  % \precsim
     "2E  =  {100, 50},  % \lesssim
     "2F  =  { 50, 50},  % \lessapprox
     "30  =  {100, 50},  % \eqslantless
     "31  =  { 50, 50},  % \eqslantgtr
     "32  =  {100, 50},  % \curlyeqprec
     "33  =  { 50,100},  % \curlyeqsucc
     "34  =  {100, 50},  % \preccurlyeq
     "36  =  { 50,   },  % \leqslant
     "38  =  {   , 50},  % \backprime
     "39  =  {250,250},  % \dabar@ : the dash bar in \dash(left,right)arrow
     "3C  =  { 50,100},  % \succcurlyeq
     "3E  =  {   , 50},  % \geqslant
     "40  =  {   , 50},  % \sqsubset
     "41  =  { 50,   },  % \sqsupset
     "42  =  {   ,150},  % \vartriangleright, \rhd
     "43  =  {150,   },  % \vartriangleleft, \lhd
     "44  =  {   ,100},  % \trianglerighteq, \unrhd
     "45  =  {100,   },  % \trianglelefteq, \unlhd
     "46  =  {100,100},  % \bigstar
     "48  =  { 50, 50},  % \blacktriangledown
     "49  =  {   ,100},  % \blacktriangleright
     "4A  =  {100,   },  % \blacktriangleleft
     "4B  =  {   ,150},  % \dashrightarrow (the arrow)
     "4C  =  {150,   },  % \dashleftarrow
     "4D  =  { 50, 50},  % \vartriangle
     "4E  =  { 50, 50},  % \blacktriangle
     "4F  =  { 50, 50},  % \triangledown
     "50  =  { 50, 50},  % \eqcirc
     "56  =  {   ,150},  % \Rrightarrow
     "57  =  {150,   },  % \Lleftarrow
     "58  =  {100,300},  % \checkmark
     "5C  =  { 50, 50},  % \angle
     "5D  =  { 50, 50},  % \measuredangle
     "5E  =  { 50, 50},  % \sphericalangle
     "5F  =  {   , 50},  % \varpropto
     "60  =  {100,100},  % \smallsmile
     "61  =  {100,100},  % \smallfrown
     "62  =  { 50,   },  % \Subset
     "63  =  {   , 50},  % \Supset
     "66  =  {150,150},  % \curlywedge
     "67  =  {150,150},  % \curlyvee
     "68  =  { 50,150},  % \leftthreetimes
     "69  =  {100, 50},  % \rightthreetimes
     "6C  =  { 50, 50},  % \bumpeq
     "6D  =  { 50, 50},  % \Bumpeq
     "6E  =  {100,   },  % \lll
     "6F  =  {   ,100},  % \ggg
     "70  =  { 50,100},  % \ulcorner
     "71  =  {100, 50},  % \urcorner
     "75  =  {150,200},  % \dotplus
     "76  =  { 50,100},  % \backsim
     "78  =  { 50,100},  % \llcorner
     "79  =  {100, 50},  % \lrcorner
     "7C  =  {100,100},  % \intercal
     "7D  =  { 50, 50},  % \circledcirc
     "7E  =  { 50, 50},  % \circledast
     "7F  =  { 50, 50}   % \circleddash
%    \end{macrocode}
% Remaining slots in the source file.
%\iffalse
%    "00  =  {   ,   },  % \boxdot
%    "01  =  {   ,   },  % \boxplus
%    "02  =  {   ,   },  % \boxtimes
%    "03  =  {   ,   },  % \square
%    "04  =  {   ,   },  % \blacksquare
%    "0C  =  {   ,   },  % \boxminus
%    "29  =  {   ,   },  % \therefore
%    "2A  =  {   ,   },  % \because
%    "35  =  {   ,   },  % \leqq
%    "37  =  {   ,   },  % \lessgtr
%    "3A  =  {   ,   },  % \risingdotseq
%    "3B  =  {   ,   },  % \fallingdotseq
%    "3D  =  {   ,   },  % \geqq
%    "3F  =  {   ,   },  % \gtrless
%    "47  =  {   ,   },  % \between
%    "51  =  {   ,   },  % \lesseqgtr
%    "52  =  {   ,   },  % \gtreqless
%    "53  =  {   ,   },  % \lesseqqgtr
%    "54  =  {   ,   },  % \gtreqqless
%    "55  =  {   ,   },  % \yen
%    "59  =  {   ,   },  % \veebar
%    "5A  =  {   ,   },  % \barwedge
%    "5B  =  {   ,   },  % \doublebarwedge
%    "64  =  {   ,   },  % \Cup
%    "65  =  {   ,   },  % \Cap
%    "6A  =  {   ,   },  % \subseteqq
%    "6B  =  {   ,   },  % \supseteqq
%    "72  =  {   ,   },  % \circledR
%    "73  =  {   ,   },  % \circledS
%    "74  =  {   ,   },  % \pitchfork
%    "77  =  {   ,   },  % \backsimeq
%    "7A  =  {   ,   },  % \maltese
%    "7B  =  {   ,   },  % \complement
%\fi
%    \begin{macrocode}
   }

%</msa>
%    \end{macrocode}
% Symbol font `b'.
%    \begin{macrocode}
%<*msb>
\SetProtrusion
   [ name     = AMS-b ]
   { encoding = U,
     family   = msb  }
   {
       A  =  { 50, 50},  % \mathbb
       C  =  { 50, 50},
       G  =  {   , 50},
       L  =  {   , 50},
       P  =  {   , 50},
       R  =  {   , 50},
       T  =  {   , 50},
       V  =  { 50, 50},
       X  =  { 50, 50},
       Y  =  { 50, 50},
     "00  =  { 50, 50},  % \lvertneqq
     "01  =  { 50, 50},  % \gvertneqq
     "02  =  { 50, 50},  % \nleq
     "03  =  { 50, 50},  % \ngeq
     "04  =  {100, 50},  % \nless
     "05  =  { 50,150},  % \ngtr
     "06  =  {100, 50},  % \nprec
     "07  =  { 50,150},  % \nsucc
     "08  =  { 50, 50},  % \lneqq
     "09  =  { 50, 50},  % \gneqq
     "0A  =  {100,100},  % \nleqslant
     "0B  =  {100,100},  % \ngeqslant
     "0C  =  {100, 50},  % \lneq
     "0D  =  { 50,100},  % \gneq
     "0E  =  {100, 50},  % \npreceq
     "0F  =  { 50,100},  % \nsucceq
     "10  =  { 50,   },  % \precnsim
     "11  =  { 50, 50},  % \succnsim
     "12  =  { 50, 50},  % \lnsim
     "13  =  { 50, 50},  % \gnsim
     "14  =  { 50, 50},  % \nleqq
     "15  =  { 50, 50},  % \ngeqq
     "16  =  { 50, 50},  % \precneqq
     "17  =  { 50, 50},  % \succneqq
     "18  =  { 50, 50},  % \precnapprox
     "19  =  { 50, 50},  % \succnapprox
     "1A  =  { 50, 50},  % \lnapprox
     "1B  =  { 50, 50},  % \gnapprox
     "1C  =  {150,200},  % \nsim
     "1D  =  { 50, 50},  % \ncong
     "1E  =  {100,150},  % \diagup
     "1F  =  {100,150},  % \diagdown
     "20  =  {100, 50},  % \varsubsetneq
     "21  =  { 50,100},  % \varsupsetneq
     "22  =  {100, 50},  % \nsubseteqq
     "23  =  { 50,100},  % \nsupseteqq
     "24  =  {100, 50},  % \subsetneqq
     "25  =  { 50,100},  % \supsetneqq
     "26  =  {100, 50},  % \varsubsetneqq
     "27  =  { 50,100},  % \varsupsetneqq
     "28  =  {100, 50},  % \subsetneq
     "29  =  { 50,100},  % \supsetneq
     "2A  =  {100, 50},  % \nsubseteq
     "2B  =  { 50,100},  % \nsupseteq
     "2C  =  { 50,100},  % \nparallel
     "2D  =  {100,150},  % \nmid
     "2E  =  {150,150},  % \nshortmid
     "2F  =  {100,100},  % \nshortparallel
     "30  =  {   ,150},  % \nvdash
     "31  =  {   ,150},  % \nVdash
     "32  =  {   ,100},  % \nvDash
     "33  =  {   ,100},  % \nVDash
     "34  =  {   ,100},  % \ntrianglerighteq
     "35  =  {100,   },  % \ntrianglelefteq
     "36  =  {100,   },  % \ntriangleleft
     "37  =  {   ,100},  % \ntriangleright
     "38  =  {100,200},  % \nleftarrow
     "39  =  {100,200},  % \nrightarrow
     "3A  =  {100,100},  % \nLeftarrow
     "3B  =  { 50,100},  % \nRightarrow
     "3C  =  {100,100},  % \nLeftrightarrow
     "3D  =  {100,200},  % \nleftrightarrow
     "3E  =  { 50, 50},  % \divideontimes
     "3F  =  { 50, 50},  % \varnothing
     "60  =  {200,   },  % \Finv
     "61  =  {   , 50},  % \Game
     "68  =  {100,100},  % \eqsim
     "69  =  { 50,   },  % \beth
     "6A  =  { 50,   },  % \gimel
     "6B  =  {150,   },  % \daleth
     "6C  =  {200,   },  % \lessdot
     "6D  =  {   ,200},  % \gtrdot
     "6E  =  {100,200},  % \ltimes
     "6F  =  {150,100},  % \rtimes
     "70  =  { 50,100},  % \shortmid
     "71  =  { 50, 50},  % \shortparallel
     "72  =  {200,300},  % \smallsetminus
     "73  =  {100,200},  % \thicksim
     "74  =  { 50,100},  % \thickapprox
     "75  =  { 50, 50},  % \approxeq
     "76  =  { 50,100},  % \succapprox
     "77  =  { 50, 50},  % \precapprox
     "78  =  {100,100},  % \curvearrowleft
     "79  =  { 50,150},  % \curvearrowright
     "7A  =  { 50,200},  % \digamma
     "7B  =  {100, 50},  % \varkappa
     "7F  =  {200,   }   % \backepsilon
%    \end{macrocode}
% Remaining slots in the source file.
%\iffalse
%    "40  =  {   ,   },  % \nexists
%    "66  =  {   ,   },  % \mho
%    "67  =  {   ,   },  % \eth
%    "7C  =  {   ,   },  % \Bbbk
%    "7D  =  {   ,   },  % \hslash
%    "7E  =  {   ,   },  % \hbar
%\fi
%    \begin{macrocode}
   }

%</msb>
%    \end{macrocode}
% \subsubsection{Euler}
%
% Euler Roman font (package \pkg{euler}).
%\changes{v1.9e}{2006/07/28}{settings for Euler Roman font}
%    \begin{macrocode}
%<*eur>
\SetProtrusion
   [ name     = euler ]
   { encoding = U,
     family   = eur  }
   {
     "01  =  {100,100},
     "03  =  {100,150},
     "06  =  {   ,100},
     "07  =  {100,150},
     "08  =  {100,100},
     "0A  =  {100,100},
     "0B  =  {   , 50},
     "0C  =  {   ,100},
     "0D  =  {100,100},
     "0E  =  {   ,100},
     "0F  =  {100,100},
     "10  =  {100,100},
     "13  =  {   ,100},
     "14  =  {   ,100},
     "15  =  {   , 50},
     "16  =  {   , 50},
     "17  =  { 50,100},
     "18  =  { 50,100},
     "1A  =  {   , 50},
     "1B  =  {   , 50},
     "1C  =  { 50,100},
     "1D  =  { 50,100},
     "1E  =  { 50,100},
     "1F  =  { 50,100},
     "20  =  {   , 50},
     "21  =  {   , 50},
     "22  =  { 50,100},
     "24  =  {   , 50},
     "27  =  { 50,100},
       1  =  {100,100},
       7  =  { 50,100},
     "3A  =  {300,500},
     "3B  =  {200,400},
     "3C  =  {200,100},
     "3D  =  {200,200},
     "3E  =  {100,200},
       A  =  {   ,100},
       D  =  {   , 50},
       J  =  { 50,   },
       K  =  {   , 50},
       L  =  {   , 50},
       Q  =  {   , 50},
       T  =  { 50,   },
       X  =  { 50, 50},
       Y  =  { 50,   },
       h  =  {   , 50},
       k  =  {   , 50}
   }

%    \end{macrocode}
% Extended by the \pkg{eulervm} package.
%\changes{v1.9f}{2006/07/31}{fix: \texttt{euler-vm} did not load \texttt{euler} settings}
%    \begin{macrocode}
\SetProtrusion
   [ name     = euler-vm,
     load     = euler ]
   { encoding = U,
     family   = zeur  }
   {
     "28  =  {100,200},
     "29  =  {100,200},
     "2A  =  {100,150},
     "2B  =  {100,150},
     "2C  =  {200,300},
     "2D  =  {200,300},
     "2E  =  {   ,100},
     "2F  =  {100,   },
     "3F  =  {150,150},
     "5B  =  {   ,100},
     "5E  =  {100,100},
     "5F  =  {100,100},
     "80  =  {   , 50},
     "81  =  {200,250},
     "82  =  {100,200}
   }

%</eur>
%    \end{macrocode}
% Euler Script font (\pkg{eucal}).
%    \begin{macrocode}
%<*eus>
\SetProtrusion
   [ name     = euscript ]
   { encoding = U,
     family   = eus  }
   {
       A  =  {100,100},
       B  =  { 50,100},
       C  =  { 50, 50},
       D  =  { 50,100},
       E  =  { 50,100},
       F  =  { 50,   },
       G  =  { 50,   },
       H  =  {   ,100},
       K  =  {   , 50},
       L  =  {   ,150},
       M  =  {   , 50},
       N  =  {   , 50},
       O  =  { 50, 50},
       P  =  { 50, 50},
       T  =  {   ,100},
       U  =  {   , 50},
       V  =  { 50, 50},
       W  =  { 50, 50},
       X  =  { 50, 50},
       Y  =  { 50,   },
       Z  =  { 50,100},
     "00  =  {250,250},
     "18  =  {200,200},
     "3A  =  {200,150},
     "40  =  {   ,100},
     "5E  =  {100,100},
     "5F  =  {100,100},
     "66  =  { 50,   },
     "67  =  {   , 50},
     "6E  =  {200,200}
   }

\SetProtrusion
   [ name     = euscript-vm,
     load     = euscript ]
   { encoding = U,
     family   = zeus  }
   {
     "01  =  {600,600},
     "02  =  {200,200},
     "03  =  {200,200},
     "04  =  {200,200},
     "05  =  {150,150},
     "06  =  {200,200},
     "07  =  {200,200},
     "08  =  {100,100},
     "09  =  {100,100},
     "0A  =  {100,100},
     "0B  =  {100,100},
     "0C  =  {100,100},
     "0D  =  {100,100},
     "0E  =  {150,150},
     "0F  =  {100,100},
     "10  =  {150,150},
     "11  =  {100,100},
     "12  =  {150,100},
     "13  =  {100,150},
     "14  =  {150,100},
     "15  =  {100,150},
     "16  =  {200,100},
     "17  =  {100,200},
     "19  =  {150,150},
     "1A  =  {150,100},
     "1B  =  {100,150},
     "1C  =  {100,100},
     "1D  =  {100,100},
     "1E  =  {250,100},
     "1F  =  {100,250},
     "20  =  {150,200},
     "21  =  {150,200},
     "22  =  {150,150},
     "23  =  {150,150},
     "24  =  {100,200},
     "25  =  {150,150},
     "26  =  {150,150},
     "27  =  {100,100},
     "28  =  {100,100},
     "29  =  {100,150},
     "2A  =  {100,100},
     "2B  =  {100,100},
     "2C  =  {100,100},
     "2D  =  {150,150},
     "2E  =  {150,150},
     "2F  =  {100,100},
     "30  =  {100,100},
     "31  =  {100,100},
     "32  =  {100,100},
     "33  =  {100,100},
     "34  =  {100,100},
     "35  =  {100,100},
     "3E  =  {150,150},
     "3F  =  {150,150},
     "60  =  {   ,200},
     "61  =  {200,   },
     "62  =  {100,100},
     "63  =  {100,100},
     "64  =  {100,100},
     "65  =  {100,100},
     "68  =  {300,   },
     "69  =  {   ,300},
     "6C  =  {100,100},
     "6D  =  {100,100},
     "6F  =  {100,100},
     "72  =  {100,100},
     "73  =  {200,100},
     "76  =  {   ,100},
     "77  =  {100,   },
     "78  =  { 50, 50},
     "79  =  {100,100},
     "7A  =  {100,100},
     "7D  =  {150,150},
     "7E  =  {100,100},
     "A8  =  {100,100},
     "A9  =  {100,100},
     "AB  =  {200,200},
     "BA  =  {   ,200},
     "BB  =  {   ,200},
     "BD  =  {200,200},
     "DE  =  {200,200}
   }

%</eus>
%    \end{macrocode}
% Euler Fraktur font (\pkg{eufrak}).
%\changes{v1.9e}{2006/07/28}{complete settings for Euler Fraktur and Script fonts}
%    \begin{macrocode}
%<*euf>
\SetProtrusion
   [ name     = mathfrak ]
   { encoding = U,
     family   = euf  }
   {
       A  =  {   , 50},
       B  =  {   , 50},
       C  =  { 50, 50},
       D  =  {   , 80},
       E  =  { 50,   },
       G  =  {   , 50},
       L  =  {   , 80},
       O  =  {   , 50},
       T  =  {   , 80},
       X  =  { 80, 50},
       Z  =  { 80, 50},
       b  =  {   , 50},
       c  =  {   , 50},
       k  =  {   , 50},
       p  =  {   , 50},
       q  =  { 50,   },
       v  =  {   , 50},
       w  =  {   , 50},
       x  =  {   , 50},
       1  =  {100,100},
       2  =  { 80, 80},
       3  =  { 80, 50},
       4  =  { 80, 50},
       7  =  { 50, 50},
     "12  =  {500,500},
     "13  =  {500,500},
       !  =  {   ,200},
       '  =  {200,300},
       (  =  {200,   },
       )  =  {   ,200},
       *  =  {200,200},
       +  =  {200,250},
       -  =  {200,200},
      {,} =  {300,300},
       .  =  {400,400},
      {=} =  {200,200},
       :  =  {   ,200},
       ;  =  {   ,200},
       ]  =  {   ,200}
   }

%</euf>
%</cfg-u>
%    \end{macrocode}
%\subsubsection{Euro symbols}
%\changes{v1.9d}{2006/05/04}{settings for Euro symbols (Adobe, <ITC>, \pkg{marvosym})}
%\changes{v1.9e}{2006/07/05}{fix: forgotten comma in \file{mt-mvs.cfg};
%                            adapt to \pkg{marvosym}'s changed encoding}
% Settings for various Euro symbols (Adobe Euro fonts (packages \pkg{eurosans},
% \pkg{europs}), <ITC> Euro fonts (package \pkg{euroitc}) and \pkg{marvosym}\footnote{
%   Of course, there are many more symbols in this font. Feel free to contribute
%   protrusion settings!}).
% The \pkg{euroitc} settings are hidden in the package itself (\ref{ssub:permutation})
% for `free software' compliance reasons.
% (Not quite sure whether this is what Karl really had in mind~\dots)
%\changes{v2.8a}{2021/02/22}{hide \pkg{euroitc} settings
%                (requested by \contributor Karl Berry <karl\at freefriends.org>)}
%                ^^A private mail, 2021/02/22
%    \begin{macrocode}
%<*cfg-e>
\SetProtrusion
%<zpeu>   { encoding = U,
%<mvs>   { encoding = {OT1,U},
%<zpeu>     family   = zpeu }
%<mvs>     family   = mvs }
   {
%<zpeu>     E = {50, }
%<mvs>     164 = {50,50},   % \EUR
%<mvs>     068 = {50,-100}  % \EURdig
   }

%<*zpeu>
\SetProtrusion
   { encoding = U,
     family   = zpeu,
     shape    = it* }
   {
     E = {100,-50}
   }

\SetProtrusion
   { encoding = U,
     family   = {zpeus,eurosans} }
   {
     E = {100,50}
   }

\SetProtrusion
   { encoding = U,
     family   = {zpeus,eurosans},
     shape    = it* }
   {
     E = {200, }
   }

%</zpeu>
%</cfg-e>
%    \end{macrocode}
%
%\subsection{Interword spacing}\label{sub:conf-spacing}
%\GeneralChanges{Spacing}
%
% Default unit is space.
%
%    \begin{macrocode}
%<*m-t|cmr>
%%% -----------------------------------------------------------------------
%%% INTERWORD SPACING

%</m-t|cmr>
%<*m-t>
\SetExtraSpacing
   [ name = default ]
   { encoding = {OT1,T1,LY1,OT4,QX,T5} }
   {
%    \end{macrocode}
% These settings are only a first approximation. The following reasoning is from
% a mail from \contributor Ulrich Dirr <ud\at art-satz.de>^^A private mail, 2005/06/14
%\ifpdf\IfFileExists{justification.png}{^^A
% , who also provided the sample in figure~\ref{fig:example-spacing}^^A
%\changes{v2.2}{2007/04/05}{add sample}^^A
%   \begin{figure}
%     \caption[Example of interword spacing]
%             {Example of interword spacing
%              (from: M.~Siemoneit, \emph{Typographisches Gestalten}, Frankfurt/M. 1989).
%         ^^A Manfred Siemoneit, Typographisches Gestalten.
%         ^^A   Regeln und Tips f\"ur die richtige Gestaltung von Drucksachen,
%         ^^A   Frankfurt/M.: Polygraph Verlag, 1989
%       \\The numbers indicate the preference for shrinking the interword space.}
%     \label{fig:example-spacing}
%     \includegraphics[width=.66\textwidth]{justification.png}
%   \end{figure}^^A
%}\relax\fi.
% I~do not claim to have coped with the task.
%\todo{fix settings}
%
%\begin{quote}
% `The idea is -- analog to the tables for expansion and protrusion -- to
% have tables for optical reduction\slash expansion of spaces in dependence of the
% actual character so that the distance between words is optically equal.
%
% When reducing distances the (weighting) order is:
%\begin{itemize}
%  \item after commas
%    \begin{macrocode}
     {,} = { ,-500,500},
%    \end{macrocode}
%  \item in front of capitals which have optical more room on their left
%        side, \eg, `A', `J', `T', `V', `W', and `Y'
%        [this is not yet possible -- RS]
%  \item in front of capitals which have circle/oval shapes on their left
%        side, \eg, `C', `G', `O', and `Q'
%        [ditto -- RS]
%  \item after `r' (because of the bigger optical room on the righthand side)
%    \begin{macrocode}
      r  = { ,-300,300},
%    \end{macrocode}
%  \item\relax [before or] after lowercase characters with ascenders
%    \begin{macrocode}
      b  = { ,-200,200},
      d  = { ,-200,200},
      f  = { ,-200,200},
      h  = { ,-200,200},
      k  = { ,-200,200},
      l  = { ,-200,200},
      t  = { ,-200,200},
%    \end{macrocode}
%  \item\relax [before or] after lowercase characters with x-height plus descender
%        with additional optical space, \eg, `v', or `w'
%    \begin{macrocode}
      c  = { ,-100,100},
      p  = { ,-100,100},
      v  = { ,-100,100},
      w  = { ,-100,100},
      z  = { ,-100,100},
      x  = { ,-100,100},
      y  = { ,-100,100},
%    \end{macrocode}
%  \item\relax [before or] after lowercase characters with x-height plus descender
%        without additional optical space
%    \begin{macrocode}
      i  = { , 50, -50},
      m  = { , 50, -50},
      n  = { , 50, -50},
      u  = { , 50, -50},
%    \end{macrocode}
%  \item after colon and semicolon
%    \begin{macrocode}
      :  = { ,200,-200},
      ;  = { ,200,-200},
%    \end{macrocode}
%  \item after punctuation which ends a sentence, \eg, period, exclamation
%        mark, question mark
%    \begin{macrocode}
      .  = { ,250,-250},
      !  = { ,250,-250},
      ?  = { ,250,-250}
%    \end{macrocode}
%\end{itemize}
% The order has to be reversed when enlarging is needed.'
%\end{quote}
%    \begin{macrocode}
   }

%</m-t>
%    \end{macrocode}
% Questions are:
%\begin{itemize}
%  \item Is the result really better?
%  \item Is it overdone? (Try with a |factor| \textless\ 1000.)
%  \item Should the first parameter also be used? (Probably.)
%  \item What about quotation marks, parentheses etc.?
%\end{itemize}
%
% Furthermore, there seems to be a \pdftex\ bug with spacing in combination
% with a non-zero \cmd\spaceskip\
% (reported by \contributor Axel Berger <Axel_Berger\at b.maus.de>):
%  ^^A dctt, `myheadings, markboth', 2008/10/06, MID: <200810062134.a58193@b.maus.de>
%\todo{report \pdftex\ bug}
%\begin{verbatim}
%\parfillskip0pt
%\rightskip0pt plus 1em
%\spaceskip\fontdimen2\font
% test test\par
%\pdfadjustinterwordglue2
%\stbscode\font`t=-50
% test test
%\bye
%\end{verbatim}
% Some more characters in <T2A>.\footnote{Contributed by
%                     \contributor Karl Karlsson <karl-karlsson\at yandex.ru>.}
%\changes{v2.3e}{2009/10/28}{settings for <T2A> encoding (contributed by
%                            \contributor Karl Karlsson <karl-karlsson\at yandex.ru>)}
%                                                       ^^A private mail, 2009/10/21
%    \begin{macrocode}
%<*cmr>
\SetExtraSpacing
   [ name     = T2A,
     load     = default ]
   { encoding = T2A,
     family   = cmr }
   {
      \cyrg  = { ,-300,300},
      \cyrb  = { ,-200,200},
      \cyrk  = { ,-200,200},
      \cyrs  = { ,-100,100},
      \cyrr  = { ,-100,100},
      \cyrh  = { ,-100,100},
      \cyru  = { ,-100,100},
      \cyrt  = { , 50, -50},
      \cyrp  = { , 50, -50},
      \cyri  = { , 50, -50},
      \cyrishrt  = { , 50, -50},
   }

%    \end{macrocode}
%
% \subsubsection{Nonfrenchspacing}
% The following settings simulate \cmd\nonfrenchspacing\ (since space factors
% will be ignored when spacing adjustment is in effect). They may be used for
% English contexts.
%
% From the \TeX book:
%\begin{quote}
%                                                                   `If the
% space factor $f$ is different from 1000, the interword glue is computed as
% follows:  Take the normal space glue for the current font, and add the
% extra space if $f\ge2000$.
%  [\,\dots]
% Then the stretch component is multiplied by $f/1000$, while the shrink
% component is multiplied by $1000/f$.'
%\end{quote}
% The `extra space' (\fontdim7) for Computer Modern Roman is a third of
% \fontdim2, \ie, 333.
%    \begin{macrocode}
\SetExtraSpacing
   [ name     = nonfrench-cmr,
     load     = default,
     context  = nonfrench ]
   { encoding = {OT1,T1,LY1,OT4,QX,T5},
     family   = cmr }
   {
%    \end{macrocode}
% \file{latex.ltx} has:
%\begin{verbatim}[morekeywords={[1]{\nonfrenchspacing}}]
%\def\nonfrenchspacing{
%  \sfcode`\. 3000
%  \sfcode`\? 3000
%  \sfcode`\! 3000
%\end{verbatim}
%    \begin{macrocode}
     . = {333,2000,-667},
     ? = {333,2000,-667},
     ! = {333,2000,-667},
%    \end{macrocode}
%\begin{verbatim}
%  \sfcode`\: 2000
%\end{verbatim}
%    \begin{macrocode}
     : = {333,1000,-500},
%    \end{macrocode}
%\begin{verbatim}
%  \sfcode`\; 1500
%\end{verbatim}
%    \begin{macrocode}
     ; = {   , 500,-333},
%    \end{macrocode}
%\begin{verbatim}
%  \sfcode`\, 1250
%\end{verbatim}
%    \begin{macrocode}
    {,}= {   , 250,-200}
%    \end{macrocode}
%\begin{verbatim}
%}
%\end{verbatim}
%    \begin{macrocode}
   }

%</cmr>
%    \end{macrocode}
% \pkg{fontinst}, however, which is also used to create the \pkg{psnfss} font
% metrics, sets \fontdim7 to 240 by default. Therefore, the fallback settings
% use this value for the first component.
%    \begin{macrocode}
%<*m-t>
\SetExtraSpacing
   [ name     = nonfrench-default,
     load     = default,
     context  = nonfrench ]
   { encoding = {OT1,T1,LY1,OT4,QX,T5} }
   {
     . = {240,2000,-667},
     ? = {240,2000,-667},
     ! = {240,2000,-667},
     : = {240,1000,-500},
     ; = {   , 500,-333},
    {,}= {   , 250,-200}
   }

%    \end{macrocode}
% Empty settings to prevent spurious warnings.
%\changes{v2.8a}{2021/02/22}{add dummy settings
%                            (reported by \contributor DORpapst <@\at @>)}
%                            ^^A https://tex.stackexchange.com/questions/584373/package-microtype-warning-i-cannot-find-a-spacing-list-for-font-microtype
%    \begin{macrocode}
\SetExtraSpacing
   [ name = empty ]
   { encoding = {TS1} }
   { }

%    \end{macrocode}
%
% \subsection{Additional kerning}
%\GeneralChanges{Kerning}
%
% Default unit is \EM{1}.
%
%    \begin{macrocode}
%%% -----------------------------------------------------------------------
%%% ADDITIONAL KERNING

%    \end{macrocode}
% A dummy list to be loaded when no context is active.
%    \begin{macrocode}
\SetExtraKerning
   [ name = empty ]
   { encoding = {OT1,T1,T2A,LY1,OT4,QX,T5,TS1} }
   { }

%    \end{macrocode}
%
%\subsubsection{French}
%
% The ratio of \fontdim2 to \fontdim6 varies for different fonts, so that
% either the kerning of the colon (which should be a space, \ie, \fontdim2) or
% that of the other punctuation characters (\TeX's \cmd\thinspace, \ie, one
% sixth of \fontdim6) may be inaccurate, depending on which |unit| we choose
% (|space| or |1em|). For Times, for example, a thin space would be 665. I
% don't know whether French typography really wants a thin space, or rather (as
% it happens to turn out with <CMR>) half a space.
% (Wikipedia\footnote{\url{https://fr.wikipedia.org/wiki/Espace_typographique}, 5 July 2007.}
% claims it should be a quarter of an em, which seems too much to me; then
% again, it also says that this \emph{was} a thin space in French typography.)
%    \begin{macrocode}
\SetExtraKerning
   [ name     = french-default,
     context  = french,
     unit     = space   ]
   { encoding = {OT1,T1,LY1} }
   {
     :  = {1000,}, % = \fontdimen2
     ;  = {500, }, % ~ \thinspace
     !  = {500, },
     ?  = {500, }
   }

%    \end{macrocode}
% These settings have the disadvantage that a word following a left guillemet
% will not be hyphenated. This might be fixed in \pdftex.
%    \begin{macrocode}
\SetExtraKerning
   [ name     = french-guillemets,
     context  = french-guillemets,
     load     = french-default,
     unit     = space   ]
   { encoding = {T1,LY1} }
   {
    \guillemotleft  = { ,800}, % = 0.8\fontdimen2
    \guillemotright = {800, }
   }

\SetExtraKerning
   [ name     = french-guillemets-OT1,
     context  = french-guillemets,
     load     = french-default,
     unit     = space   ]
   { encoding = OT1     }
   { }

%    \end{macrocode}
%
%\subsubsection{Turkish}
%
%    \begin{macrocode}
\SetExtraKerning
   [ name     = turkish,
     context  = turkish ]
   { encoding = {OT1,T1,LY1} }
   {
     :  = {167, }, % = \thinspace
     !  = {167, },
    {=} = {167, }
   }

%</m-t>
%</config>
%    \end{macrocode}
%^^A\changes{v2.0}{2006/12/28}{remove \texttt{letterspacing} settings}
%
%\ifpdf
%\GeneralChanges{Documentation}
%^^A The OpenType configuration files are outsourced to an external file,
%^^A since they have to be typeset with \luatex.
%
%\begingroup
%\def\setcounter#1#2{\expandafter\ifnum\csname c@#1\endcsname=#2 \else\@tempswatrue\fi}
%\InputIfFileExists{microtype-code.tmp}\@tempswafalse\@tempswatrue
%\if@tempswa
%\newwrite          \codetmp
%\immediate\openout \codetmp=microtype-code.tmp
%\immediate\write   \codetmp{\string\setcounter{section}{\the\c@section}}
%\immediate\write   \codetmp{\string\setcounter{CodelineNo}{\the\c@CodelineNo}}
%\immediate\write   \codetmp{\string\setcounter{page}{\the\c@page}}
%\immediate\write   \codetmp{\string\setcounter{footnote}{\the\c@footnote}}
%\immediate\closeout\codetmp
%\fi
%\endgroup
%
%\InputIfFileExists{microtype-utf.tmp}
%  {\def\UTF@setbookmarks##1{\def\UTFBookmarks{##1}}}
%  {\let\UTFBookmarks\@empty}
%
%\IfFileExists{microtype-utf.pdf}
%   {\edef\x{\noexpand\includepdf[pages=-,addtotoc={\UTFBookmarks}]{microtype-utf.pdf}}\x}
%   {\section{OpenType configuration settings}
%       To view the OpenType configuration settings, first typeset
%       \file{microtype-utf.dtx} with \luatex.}
%
%\GeneralChanges*
%\else
% \fallbacktext{The original documentation\footnote{
%     \ctanurl{macros/latex/contrib/microtype/microtype.pdf}.}
%   also includes the OpenType configuration files.}
%\fi
%
%\section{Auxiliary file for micro fine tuning}
%
% This file may be used to test protrusion and (less so) expansion settings.
%    \begin{macrocode}
%<*test>
\documentclass{article}
%% options are passed through to microtype
\usepackage[stretch=50]{microtype-show}

%% options for microtype-show
\ShowGlyphIndextrue
\ShowMissingGlyphstrue
\def\GlyphScaleFactor{2}

%% load any required font packages:
\ifpdftex
 \usepackage[T1]{fontenc}
\else
 \usepackage{fontspec}
\fi

\begin{document}
\microtypesetup{expansion=false}

%% load your font here:

\ShowCharacterInheritance

\newpage
\ShowProtrusion

\newpage
%% show single glyphs
 %\ShowDummyLine
 %\ShowProtrusionLineGlyph{A}
 %\ShowProtrusionLineIndex{27}

%% loop through all glyphs of the font;
%% protrusion values are shown in 1000th of 1em
 \ShowProtrusionDefined

 %\ShowProtrusionMissing

 %\ShowProtrusionAll

\newpage %% -------------------------------------------------------------------
This is the current font stretched by 5\%, normal, and shrunk by 5\%:

\newlength{\MTln}
\newcommand*\teststring
  {ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz}
\settowidth{\MTln}{\teststring}
\microtypesetup{expansion=true}

\bigskip\noindent\parbox{1.05\MTln}{\teststring\linebreak\\\teststring}\par
\bigskip\noindent\parbox{0.95\MTln}{\teststring}
\end{document}
%</test>
%    \end{macrocode}
% Needless to say that things may always be improved. For suggestions, mail to
% \mailtoRS\ or file an issue at \url{\githuburl/issues}.
%
% ^^A -------------------------------------------------------------------------
%
% \newpage
% \appendix
% \AppendixSettings
% \GeneralChanges{Documentation}
%\changes{v2.5}{2013/02/23}{include \file{microtype-logo.dtx} and \file{microtype-lssample.dtx}}
% \InputIfFileExists{microtype-logo.dtx}\relax\relax
% \InputIfFileExists{microtype-lssample.dtx}\relax\relax
% \PrintChanges
%
% ^^A -------------------------------------------------------------------------
%\makeatother
%
% \CharacterTable
%  {Upper-case    \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
%   Lower-case    \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
%   Digits        \0\1\2\3\4\5\6\7\8\9
%   Exclamation   \!     Double quote  \"     Hash (number) \#
%   Dollar        \$     Percent       \%     Ampersand     \&
%   Acute accent  \'     Left paren    \(     Right paren   \)
%   Asterisk      \*     Plus          \+     Comma         \,
%   Minus         \-     Point         \.     Solidus       \/
%   Colon         \:     Semicolon     \;     Less than     \<
%   Equals        \=     Greater than  \>     Question mark \?
%   Commercial at \@     Left bracket  \[     Backslash     \\
%   Right bracket \]     Circumflex    \^     Underscore    \_
%   Grave accent  \`     Left brace    \{     Vertical bar  \|
%   Right brace   \}     Tilde         \~}
%
% \CheckSum{13422}
%
% \Finale
%
% \InputIfFileExists{lppl.tex}\LPPLSettings\relax
%
\endinput
%
% -----------------------------------------------------------------------------

 *** Typesetting the documentation ***

  The documentation of this package (microtype.pdf and microtype-code.pdf)
  can be found on CTAN, if it isn't already installed in your TeX system,
  so there should be no need to re-typeset it.
  If you still want to do this, there are some requirements to consider
  and some steps to follow:

#  (1) In microtype.ins, uncomment the lines
%\generate{\makefile{microtype-gind.ist}{docist}}
#      and
%\generate{\makefile{microtype-doc.sty}{docsty}}
#  (2) Install the package by running
pdflatex microtype.ins
#  (3) Extract microtype-lssample.dtx and microtype-logo.dtx from
#      microtype-code.pdf (ie., from one of the files you are about to recreate ...).
#      This can be done, eg., with Adobe Reader or with the pdftk tool.
#  (4) To typeset the user documentation (microtype.pdf) run
pdflatex microtype.dtx
#      [ The following fonts are required:
#        - Bitstream Charter
#        - Bitstream LetterGothic
#        - Adobe Source Sans Pro
#        - Adobe Wittenberger Fraktur MT (alternatively yfrak)
#        - Adobe Zapf Chancery (alternatively URW Zapf Chancery)
#        - Adobe Kepler MM (for microtype-logo.dtx, input by microtype.dtx)
#        - Adobe Caslon (for microtype-lssample.dtx, input by microtype.dtx) ]
#  (5) To create the index run
makeindex -s microtype-gind.ist microtype
#  (6) To typeset the implementation documentation (microtype-code.pdf) run
pdflatex --jobname=microtype-code microtype.dtx
#  (7) To typeset the OpenType configuration (to be included in microtype-code.pdf) run
lualatex microtype-utf.dtx
#      [ The following fonts are required:
#        - Bitstream Charter (Type 1)
#        - Bitstream LetterGothic (Type 1)
#        - Adobe Source Sans Pro (Type 1)
#        - Latin Modern Roman (OpenType)
#        - Charis SIL (OpenType)
#        - EB Garamond (OpenType)
#        - New Computer Modern (OpenType)
#        - TeX Gyre Pagella (OpenType) ]
#  (8) To create the code index and history run
makeindex -r -s microtype-gind.ist -t microtype-code.ilg -o microtype-code.ind microtype.idx microtype-code.idx
makeindex -s gglo.ist -t microtype-code.glg -o microtype-code.gls microtype.glo microtype-code.glo microtype-utf.glo
#
# All three output files (microtype.pdf, microtype-code.pdf, microtype-utf.pdf)
# are interdependent, so you need to repeat steps 4 to 8 until all Rerun
# warnings have been resolved.
#
# That's it, although I still may have forgotten some things ...
%
% -- RS
% -----------------------------------------------------------------------------
%
% vim: ts=2:sw=2:et:
%
