%\iffalse meta-comment % % ------------------------------------------------------------------------ % The `microtype' package % Subliminal refinements towards typographical perfection % Copyright (c) 2004--2024 R Schlicht % % 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. % ------------------------------------------------------------------------ % %\NeedsTeXFormat{LaTeX2e} %<*driver> \ProvidesFile{\jobname.dtx} % %\ProvidesPackage %\ProvidesFile % {microtype} % {letterspace} % {microtype-show} % {microtype.cfg} % {microtype-pdftex.def} % {microtype-luatex.def} % {microtype-xetex.def} %<*package|letterspace|m-t|pdf-|lua-|xe-|show> [2024/03/29 v3.1b % Micro-typographical refinements % Robust letterspacing % Visual debugging for the microtype package % microtype main configuration file % Definitions specific to % pdftex % luatex % xetex (RS)] % %microtype = microtype or {} %local microtype = microtype %microtype.module = { % name = "microtype", % version = "3.1b", % date = "2024/03/29", % description = "microtype module.", % author = "E. Roux, R. Schlicht and P. Gesang", % copyright = "E. Roux, R. Schlicht and P. Gesang", % license = "LPPL", %} %luatexbase.provides_module(microtype.module) %<*config> % {mt-bch.cfg}[2007/03/03 v1.5 microtype config. file: Bitstream Charter (RS)] % {mt-blg.cfg}[2007/07/14 v1.0 microtype config. file: Bitstream Letter Gothic (RS)] % {mt-cmr.cfg}[2013/05/19 v2.2 microtype config. file: Computer Modern Roman (RS)] % {mt-EBGaramond.cfg}[2021/10/25 v2.0 microtype config. file: EB Garamond / Adobe Garamond (RS)] % {mt-pmn.cfg}[2009/11/14 v1.3 microtype config. file: Adobe Minion (HH/KK)] % {mt-ppl.cfg}[2005/11/16 v1.6 microtype config. file: Palatino (RS)] % {mt-ptm.cfg}[2006/04/20 v1.7 microtype config. file: Times (RS)] % {mt-ugm.cfg}[2006/01/26 v1.0 microtype config. file: URW Garamond (RS)] % {mt-msa.cfg}[2006/02/04 v1.1 microtype config. file: AMS symbols (a) (RS)] % {mt-msb.cfg}[2005/06/01 v1.0 microtype config. file: AMS symbols (b) (RS)] % {mt-euf.cfg}[2006/07/03 v1.1 microtype config. file: AMS Euler Fraktur (RS)] % {mt-eur.cfg}[2006/07/31 v1.1 microtype config. file: AMS Euler Roman (RS)] % {mt-eus.cfg}[2006/07/28 v1.2 microtype config. file: AMS Euler Script (RS)] % {mt-zpeu.cfg}[2006/05/04 v1.0 microtype config. file: Adobe Euro (RS)] % {mt-mvs.cfg}[2006/07/05 v1.1 microtype config. file: Marvosym Euro (RS)] % % %<*driver|docsty> %<*driver> \makeatletter \documentclass[10pt,a4paper,doc2]{ltxdoc} % % 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 %\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 % \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<>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 % % 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}}} % % microtype's index style (microtype-gind.ist): %actual '=' %quote '!' %level '>' %preamble "\n \\begin{theindex} \n \\makeatletter\\scan@allowedfalse\n\\indexspace" %postamble "\n\n \\end{theindex}\n" %item_x1 "\\efill \n \\subitem " %delim_0 "\\pfill " %delim_1 "\\pfill " %heading_prefix "{\\bfseries\\hfil " %heading_suffix "\\hfil}\\nopagebreak\n" %headings_flag 1 %symhead_positive "Options" %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}} % \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 }, 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--2024 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} % % % \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 )} % ^^A private mail, 2023/09/29 % %\GeneralChanges{Documentation} %\changes{v1.9b}{2006/01/13}{activate expansion in the distributed } %\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 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) or \luatex\ ($\geq$\,0.62). % % 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--2024 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 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 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 % 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 % resp. 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 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). % It is not available with \xetex\ (you may use the `|LetterSpace|' % option of the \cite{fontspec} package instead). % With \pdftex, it is only available in mode. % %\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 )} % ^^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 & / & _ & _ & _ & _ & _ & _\\ % & $\geq$ 0.14f & / & ! & ? & _ & _ & _ & _\\ % & $\geq$ 1.20 & & ! & ? & _ & _ & _ & _\\ % & & & ! & ? & ! & _ & _ & _\\ % & $\geq$ 1.40 & & ! & ? & _ & _ & ? & ?\\ % & & & ! & ? & ! & ? & ? & ?\\ %\cmidrule(r){1-3} % \luatex ^^A we will have to re-model kerning and spacing with \luatex % & $\geq$ 0.30 & & ! & ? & _ & _ & _ & _\\ % & & & ! & ? & ! & _ & _ & _\\ % & $\geq$ 0.62 & & ! & _ & \hskip1em\llap{(}\textcolor{theblue}{$\boxtimes$})\raisebox{0.4ex}{\sffamily\itshape\footnotesize a} & ? & _ & _\\ % & & & ! & _ & ! & ? & _ & _\\ %\cmidrule(r){1-3} % \let\textoractual\@firstoftwo ^^A why? % \xetex % & $\geq$ 0.9997 & & ! & _ & _ & _ & _ & _\\ %\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}[1000] % 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 .\footnote{ % With \pdftex, automatic font expansion does not work with bitmap fonts. % Therefore, if you are using the Computer Modern Roman fonts in 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 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 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 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}[20] %\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 % 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}. % %\enlargethispage{\baselineskip} ^^A layout %\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}} % \label{sub:options-tracking} % %\Describe{Option}{letterspace}{:integer}[100] % 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 )} % ^^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 )} % ^^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. 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 output but can also % spit out files. In fact, all recent \TeX\ systems are using \pdftex\ as % the default engine also for output, and \luatex\ too can be called % in 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.\looseness=-1 ^^A layout % %\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 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 % 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: %\enlargethispage{\baselineskip} ^^A layout %\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 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, \linebreak (, , ) % & ! % & ! % & ! % & ! \\ %\cmidrule(r){1-1} % \s{alltext-nott}\linebreak(\s{allmath-nott}) % & Text encodings, \linebreak (, , ) % & /\cmd\rm|*|/,\linebreak/\cmd\sf|*|/ % & ! % & ! % & ! \\ %\cmidrule(r){1-1} % \s{basictext}\linebreak(\s{basicmath}) % & Text encodings \linebreak (, ) % & /\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, % & ! % & ! % & ! % & |-|/\cmd\small/\\ %\cmidrule(r){1-1} % \s{scriptsize} % & Text encodings, % & ! % & ! % & ! % & |-|/\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' = , , , , , , , , , %\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. %\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 encoding:~|029|, |"1D|, |'35|). % \mbox{8-bit} (and even ) 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 % ~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 )} % ^^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}} % \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}] % By default, ligatures in letterspaced fonts will 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, \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. % The default settings disable ligatures for the character `|f|' only, % \ie, `ff', `fi', ffi', etc.\footnote{ % With \pdftex\ versions older than 1.40.4, \emph{all} ligatures, and % hence all kerning, will be disabled. It is therefore recommended to % 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}). %\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 % %\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{0.1} (adjustable with the package option \opt{letterspace}, see % section~\ref{sub:options-misc}). 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. %\looseness=-1 ^^A layout % % %\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 ( 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 % & , , , , , ()\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|)} % & , , , , , , % & n, it, sl, sc \\ % Bitstream Charter (|bch|)\footnote{Aliases: \pkg{mathdesign}/Charter (|mdbch|), % MicroPress's \pkg{chmath} (|chr|), \pkg{XCharter}} % & , , , , % & n, it, (sl)\fnref{fn:t1-itsl}, sc \\ % Garamond\footnote{Alias: Adobe Garamond (|pad|, |padx|, |padj|)} % & , , , , % & n, it, sc, si \\ % Garamond (|ugm|)\footnote{Aliases: \pkg{mathdesign}/ Garamond (|mdugm|), \pkg{garamondx} (|zgmx|, |zgmj|)} % & , , % & n, it\\ % Bitstream Letter Gothic (|blg|)\footnote{Alias: \pkg{ulgothic} (|ulg|)} % & , , % & n, it \\ % Adobe Minion (|pmnx|, |pmnj|) % & , , , , % & 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}, Neu (|fp9x|, |fp9j|), \pkg{domitian}} % & , , , , ()\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}} % & , , , , , ()\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|)} % & / % & n/it \\ % symbols (|msa|, |msb|) % & % & n\\ % Euler (|eur|, |eus|, |euf|)\footnote{Alias: \pkg{eulervm} (|zeur|, |zeus|)} % & % & n\\ % Euro symbols (Adobe, , \pkg{marvosym}) % & / % & 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{, , , , , , } % & \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: Serif} % & Latin, Greek % & n, it, (sl)\fnref{fn:ot-itsl}\\ % Charis % & Latin, Cyrillic % & n, it, sc\\ % Garamond % & Latin, Cyrillic, Greek % & n, it, sc, si\\ % Palatino\footnote{Aliases: Palatino Linotype, Palatino 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} % %\enlargethispage{\baselineskip} ^^A layout %\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{file 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}\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 )} % ^^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}} % \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{100/1000}\,=\,\EM{0.1}; 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 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 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{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}} %\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 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 leader dot % (first discovered by \contributor Morten H\o gholm )} % ^^A private mail, 2006/08/26 %\changes{v3.0}{2021/05/15}{remove hint about extra 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 and similar lists in such a way that an excess leader dot % will fit in. The solution is to temporarily disable protrusion for the : %\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, , , 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 )} % ^^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 `' 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={eqnum}} %\end{verbatim} % % \item %\begin{verbatim} %! Font csnameendcsname= not loadable: Metric (TFM) file not found. %\end{verbatim} %\changes{v1.9a}{2005/11/15}{add explanation for error message in mode} % This error message will occur if you are trying to employ font expansion % while creating output. Remember that \emph{automatic} font expansion % only works when running \pdftex\ or \luatex\ in mode. Although expansion is also % possible in 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 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 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 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|. % % \item %\begin{verbatim} %Warning: pdflatex (file ): Font 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 = 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 % hadn't created the \pdftex\ programme 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 % 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 % 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 % has made numerous suggestion, especially concerning the new extensions of % interword spacing adjustment and additional character kerning. % \contributor Georg Duffner has patiently tested % \microtype\ under \xetex\ and \luatex\ with his beautiful OpenType font % ~Garamond. % My thanks also go to % \contributor Maciej Eder % for contributing settings for the encoding, as well as to % \contributor Karl Karlsson % for providing settings for the Cyrillic encoding, and to % \contributor Hendrik Vogt , % who made substantial improvements to the Computer Modern Roman italic settings. % I thank % \contributor Loren~B. Davis % for providing protrusion settings for OpenType versions of Palatino Linotype, % as well as % \contributor Antonis Tsolomitis % 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 . ^^A also https://tex.stackexchange.com/users/176404/d909 % I am also very much indebted to % \contributor \'Elie Roux , % who not only contributed the |lua| module in the first place, but also, % together with % \contributor Philipp Gesang , % took care of updating it for the developments in \luatex\ land. % % I thank % \contributor Philipp Lehman % 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 % 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 % 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 , % \contributor Herb Schulz , % \contributor Michael Hoppe , % \contributor Gary~L. Gray , % \contributor Georg Verweyen , % \contributor Christoph Bier , % \contributor Peter Muthesius , % \contributor Bernard Gaulle , ^^A\,\textdagger, % \contributor Adam Kucharczyk , % \contributor Mark Rossi , % \contributor Stephan Hennig , % \contributor Michael Zedler , % \contributor Herbert Vo\ss{} , % \contributor Ralf Stubner , % \contributor Holger Uhr , % \contributor Peter Dyballa , % \contributor Morten H\o gholm , % \contributor Steven Bath , % \contributor Daniel Flipo , % \contributor Michalis Miatidis , % \contributor Sven Naumann , % \contributor Ross Hetherington , % \contributor Wiebke Petersen , % \contributor Geoff Vallis , % \contributor Steven~E. Harris , % \contributor Karl Berry , % \contributor Peter Meier , % \contributor Nathan Rosenblum , % \contributor Wolfram Schaalo , % \contributor Vasile Gaburici , % \contributor Sveinung Heggen , % \contributor Axel Berger , % \contributor Colin Rourke , % \contributor Maverick Woo , % \contributor Silas~S. Brown , % \contributor Lars R\"onnb\"ack , % \contributor Christian Stark , % \contributor Leo , % \contributor Marcin Borkowski , % \contributor hscm , % \contributor George Gratzer , % \contributor Josep Maria Font , % \contributor Juan Acevedo , % \contributor Heiko Oberdiek , % \contributor Till~A. Heilmann , % \contributor Rolf Dieterich , % \contributor Seamus Bradley <@\at @>, ^^A https://tex.stackexchange.com/users/215/seamus % \contributor Meho~R , % \contributor Steffen Hoffmann , % \contributor Scott Pakin , % \contributor Ma\"ieul Rouquette , % \contributor Jonas Hogstrom , % \contributor Gabriel Kerneis , % `\contributor RazorXsr <@\at @>', ^^A https://tex.stackexchange.com/users/17609/razorxsr % \contributor Sebastian Schubert , % `\contributor Dave <@\at @>', ^^A https://tex.stackexchange.com/users/15562/dave % \contributor Giuseppe Palma , % \contributor Stephan Stiller , % \contributor Christopher Schramm , % `\contributor uli <@\at @>', ^^A https://tex.stackexchange.com/users/9391/uli % \contributor Sam Mason , ^^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 , % \contributor David Carlisle , % `\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 , % `\contributor user11126 <@\at @>', ^^A https://tex.stackexchange.com/users/1000/user11126 % \contributor Ulrike Fischer , % `\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 , % `\contributor jcr <@\at @>', ^^A https://tex.stackexchange.com/users/56514/jcr % \contributor Nils Anders Danielsson , % \contributor Paolo Ney <@\at @>, ^^A https://tex.stackexchange.com/users/29161/paulo-ney % \contributor Frank Mittelbach , % \contributor Franz Wexler <@\at @>, ^^A https://tex.stackexchange.com/users/182307/franz-wexler % \contributor Moritz Wemheuer , % `\contributor Andy N <@\at @>', ^^A https://tex.stackexchange.com/users/182462/andy-n % \contributor Phelype Oleinik , % \contributor Falk Hanisch , % \contributor Markus Kohm , % \contributor Paolo Polesana <@\at @>, ^^A https://tex.stackexchange.com/users/95083/paolo-polesana % \contributor Oliver Kopp , % \contributor Hironori Kitagawa , % \contributor Aman Mehra , ^^A also https://tex.stackexchange.com/users/192717/reportaman % \contributor Md Ayquassar , % \contributor Holger Gerhardt , % \contributor Marcel Kr\"uger , % \contributor Ekkehart Schlicht , % `\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 , % `\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 , % \contributor Denis Bitouz\'e <@\at @>, ^^A https://tex.stackexchange.com/users/18401/denis-bitouz%c3%a9 % \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 , % \contributor Uwe Siart , % `\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 % and % \contributor Linas Stonys . % %\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} % \thanh, Sebastian Rahtz, Hans Hagen, Hartmut Henkel, Pawe\l\ Jackowski, Martin Schr\"oder, Karl Berry, % \emph{The \pdftex\ user manual}, % 28~February 2023. % (\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}, % October 2023. % (\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}, % 15~January 2022. % (\ctanpkgurl{fontspec}) % % \bibitem[\pkg{luaotfload}]{luaotfload} % \LaTeX3 Project, \'Elie Roux, Khaled Hosny, Philipp Gesang, Ulrike Fischer, Marcel Kr\"uger, % \emph{The \pkg{luaotfload} package}, % 31~August 2023. % (\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} % %\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 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 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 encoded Minion % %\Version{2.3e}{2009/11/09} % \item Support for the Cyrillic 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 encoding % (protrusion, inheritance) % \item Protrusion settings for various Euro symbol fonts (Adobe, , \pkg{marvosym}) % \item Support for Unicode input in the configuration (\pkg{inputenc}/|utf8|) % %\Version{1.9c}{2006/02/02} % \item Protrusion settings for 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 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 encoding (protrusion, expansion, inheritance) % \item Support for the Vietnamese 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 math fonts %^^A \item Protrusion settings for Times in encoding completed % \item The `|allmath|' font set also includes 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 , 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 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 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 } % \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{\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{\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,\ifdefmacro,\ifdefparam,\patchcmd} ^^A etoolbox %\DoNotIndex{\txfigures,\lnfigures,\tbfigures,\prfigures,\fontfigurestyle, % \fontfigurealignment,\fontbasefamily,\figureversion,\textfigures, % \liningfigures,\tabularfigures,\proportionalfigures} ^^A fontaxes %\DoNotIndex{\hyper@@anchor,\hyper@nopatch@footnote,\Hy@footnote@currentHref, % \ifHy@hyperfootnotes,\ifHy@implicit,\pdfstringdefDisableCommands, % \pdfstringdefWarn} ^^A hyperref %\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{\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{\pdf@escapestring} ^^A pdftexcmds %\DoNotIndex{\py@macron} ^^A pinyin %\DoNotIndex{\polyglossia@language@switched} ^^A polyglossia %\DoNotIndex{\@topic@item} ^^A simplecv %\DoNotIndex{\SOUL@,\SOUL@doword,\soulregister} ^^A soul %\DoNotIndex{\tikz@expandcount} ^^A tikz %\DoNotIndex{\conditionally@traceoff} ^^A trace %\DoNotIndex{\@xspace,\@xspace@firsttrue} ^^A xspace %\DoNotIndex{\frakfamily,\gothfamily,\swabfamily,\textfrak,\textgoth,\textswab}^^A yfonts %\DoNotIndex{\booknumberline,\chapternumberline,\foottextfont,\partnumberline, % \cftbookafterpnum,\cftchapterafterpnum,\cftfigureafterpnum,\cftparagraphafterpnum, % \cftpartafterpnum,\cftsectionafterpnum,\cftsubparagraphafterpnum,\cftsubsectionafterpnum, % \cftsubsubsectionafterpnum,\cfttableafterpnum} ^^A memoir %\DoNotIndex{\KOMAClassName,\setuptoc,\unsettoc,\scr@saved@footnotetext} ^^A koma (tocbasic) %\DoNotIndex{\theequationdis,\theIEEEsubequationdis} ^^A IEEEtran %\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,\DeclareMicrotypeFilePrefix,\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 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 . % \item[|ugm|] Settings for Garamond (\file{mt-ugm.cfg}). % \end{description} % \item[|cfg-u|] Surrounds non-text configurations ( encoding). % \begin{description} % \item[|msa|] Settings for `a' symbol font (\file{mt-msa.cfg}). % \item[|msb|] Settings for `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 % {microtype} % {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) %\MT@fix@catcode{33}{12}% ! %\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}% > %\MT@fix@catcode{63}{12}% ? \MT@fix@catcode{94} {7}% ^ (superscript) \MT@fix@catcode{96}{12}% ` %\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}{% % \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 % % \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 annotations} % Another debug method: font switches can be marked in the 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 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 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 version 1.5 (you could use |/Text| if you're % using an older 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 } % % % % \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 } % % \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 } % % \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 %^^Q\MT@warning@nl{This package requires the etex extensions. %^^Q \MessageBreak Exiting}\MT@restore@catcodes\endinput %\MT@dinfo@nl{0}{this is %^^Q not % 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{% % \MT@requires@latex1{% \AtEndOfPackage{\let\@unprocessedoptions\relax\MT@restore@catcodes}% \let\CurrentOption\@empty % }\relax } % \end{macrocode} %\end{macro} %\changes{v1.9}{2005/08/29}{compatibility with \texlive\ hack % (reported by \contributor Herbert Vo\ss{} )} % ^^A MID: % 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} % \def\MT@engine@minversion{0.14f} % \let\MT@pdf@or@lua\@firstoftwo \ifnum\pdftexversion % > 13 % > 139 \MT@engine@unfitfalse % \ifnum \pdftexversion=14 % \ifnum \expandafter`\pdftexrevision < `f % \MT@engine@unfittrue % \fi % \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 % \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 % % % \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 )} % ^^A private mail, 2004/09/13 % \begin{macrocode} %<*pdf-> %\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 %\MT@dinfo@nl{0}{pdftex no.: \MT@pdftex@no} % % \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-> %\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 %%\MT@dinfo@nl{0}{xetex no.: \MT@xetex@no} % % \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 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-> %\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} %\MT@dinfo@nl{0}{luatex no.: \MT@luatex@no} % % \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% % , luatex or xetex% % \space or luatex% .\MessageBreak `\MT@MT' only works with these engines.% \else are using a \MT@engine tex version older than % \MT@engine@minversion % \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} %<*package|letterspace> \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 % \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}). % \begin{macrocode} % \let\MT@letterspace\m@ne \def\MT@letterspace@default{100} %<*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 % % % \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 % \MT@requires@pdftex% % \MT@requires@luatex% #1{\ifnum % \MT@pdftex@no % \MT@luatex@no <#1 \expandafter\@secondoftwo\else\expandafter\@firstoftwo\fi} %\MT@requires@luatex4{\MT@lua{tex.enableprimitives('pdf',{'tracingfonts'})}}\relax %\MT@requires@pdftex6{ %\pdftracingfonts=1 %}\relax % % \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 )} % ^^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} %\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} %\IfFormatAtLeastTF{2017/01/01}\relax{\RequirePackage{luaotfload}} %\MT@pdf@or@lua\relax{ %\ifx\newluafunction\@undefined \input ltluatex \fi %\MT@lua{require("microtype")} %} % \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 )} %\changes{v2.7b}{2019/02/28}{update lua function \texttt{microtype.info} after changes in \pkg{luaotfload} % (reported by \contributor Moritz Wemheuer and % \contributor Ulrike Fischer )} % ^^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 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 % % \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} %\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} % \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} % \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} % \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 } % \def\MT@ifdefined@c@TF#1{% ^^X \ifdefined#1\expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi %^^Q \ifx#1\@undefined %^^Q \expandafter\@secondoftwo\else\expandafter\@firstoftwo\fi } \def\MT@ifdefined@n@T#1{% ^^X \ifcsname#1\endcsname\expandafter\@firstofone\else\expandafter\@gobble\fi %^^Q \begingroup\MT@exp@two@c\endgroup\ifx\csname #1\endcsname\relax %^^Q \expandafter\@gobble\else\expandafter\@firstofone\fi } \def\MT@ifdefined@n@TF#1{% ^^X \ifcsname#1\endcsname\expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi %^^Q \begingroup\MT@exp@two@c\endgroup\ifx\csname #1\endcsname\relax %^^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} \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} %<*package> % \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 )} % ^^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 )} % ^^A MID: <2qrkp9F134l6lU1@uni-berlin.de> % \begin{macrocode} % \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} % % %\MT@requires@pdftex6{ %\MT@pdf@or@lua{ %<*pdf-|letterspace> \def\MT@ifint#1{% \ifcase\pdfmatch{^-*[0-9]+ *$}{#1}\relax \expandafter\@secondoftwo \else \expandafter\@firstoftwo \fi } }{ % %<*pdf-|xe-|letterspace> \def\MT@ifint#1{% \if!\ifnum9<1#1!\else?\fi \expandafter\@firstoftwo \else \expandafter\@secondoftwo \fi } % %} %\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 % % \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 )} % ^^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-|xe-> \def\MT@ifdimen#1{% \setbox\z@=\hbox{% \MT@count=1#1\relax \ifnum\MT@count=\@ne \aftergroup\@secondoftwo \else \aftergroup\@firstoftwo \fi }% } % %} %\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 % % \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 } % % \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 )} % ^^A MID: %\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-> %\MT@requires@pdftex5{ \def\MT@ifstreq#1#2{% \ifnum % \pdfstrcmp % \strcmp {#1}{#2}=\z@ \expandafter\@firstoftwo \else \expandafter\@secondoftwo \fi } % %<*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 } } % %\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 % % \end{macrocode} %\end{macro} % With this, we can now also check whether versions match (using the command from % \ref{ssub:def-files}). % \begin{macrocode} %\MT@check@MT@version % {\MT@lua{tex.write(microtype.module['date'] .. ' v' .. microtype.module['version'])}} % {\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 } % % \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 )} %^^A ^^A MID: % 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 )} % ^^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} % \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 } % % \end{macrocode} %\end{macro} %\changes{v2.6a}{2016/05/03}{fixes for \letterspace\ package with \luatex} %\begin{macro}{\MT@if@luaotf@font} %\changes{v2.8}{2019/11/27}{use \texttt{lua} function} % For fonts loaded by \pkg{luaotfload} we query the font's table. % \begin{macrocode} %\MT@pdf@or@lua{\let\MT@if@luaotf@font\@secondoftwo}{ %<*lua-|letterspace> \def\MT@if@luaotf@font{\csname\MT@lua{% microtype.if_luaotf_font() }\endcsname } % %} %<*luafile> local function if_luaotf_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_luaotf_font = if_luaotf_font % % \end{macrocode} %\end{macro} %\begin{macro}{\MT@do@font} % Execute \meta{\#1} 256 times, % \begin{macrocode} %\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{} )} % ^^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@luaotf@font{% \def\MT@dofont@function{#1}% \MT@lua{microtype.do_font()}% }{\MT@while@num\z@\@cclvi{#1}}% } % % \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 % % \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 } % %<*package> % \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} \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 )} % ^^A MID: % 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 )} % ^^A MID: % \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 % \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 )} % ^^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> %\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} %}{\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> % \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} \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 } % \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 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 )} % ^^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} % %\MT@requires@pdftex5{ %<*pdf-|lua-|xe-> \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} % 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 )} % ^^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 % and \contributor Karl Berry )} % ^^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 )} ^^A MID: <7d81lgF2ad3ckU1@mid.dfncis.de>, 2009/07/28 %^^A Also: \contributor Karl Karlsson ^^A private mail, 2009/10/29 %^^A \contributor hscm ^^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 )} % ^^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} % \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{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 )} % ^^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 % 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 )} % ^^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 % % \MT@requires@latex2{ \MT@with@package@T{hyperref}{% \pdfstringdefDisableCommands{% %<*package> \MT@ltx@pickupfont \let\textmicrotypecontext\@secondoftwo \let\microtypecontext\@gobble % \def\lsstyle{\pdfstringdefWarn\lsstyle}% \def\textls#1#{\pdfstringdefWarn\textls}% }% % \MT@if@true }% % }\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 )} % ^^A MID: % 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 )} % ^^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 )} % ^^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 )} % ^^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} % \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 )} % ^^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 )} % ^^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 -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> % \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} \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 ). %\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} % 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 } % \end{macrocode} %\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 , 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\beamer@callorigitem{\ignorespaces}{\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|] and friends %\changes{v3.0}{2021/05/20}{protrusion patch for } % \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 )} %\changes{v3.0a}{2021/11/22}{protrusion patch \texttt{eqnum} for \cls{IEEEtran}} % \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. % \begin{macrocode} \@ifpackageloaded{amsmath} {\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/ % \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}} {\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 \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} \MT@define@patch{footnote}{% \@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\@footnotetext{\ignorespaces}{\ignorespaces\leftprotrusion}% \MT@patch@patch\@footnotetext{\@empty\ignorespaces}{\@empty\ignorespaces\leftprotrusion}% \MT@patch@patch\@mpfootnotetext{\ignorespaces}{\ignorespaces\leftprotrusion}% \MT@patch@patch\@mpfootnotetext {{\expandafter\hyper@@anchor\expandafter {\Hy@footnote@currentHref}{\relax}}\ignorespaces} {{\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{beamerx@\string\beamer@framefootnotetext} {\ignorespaces}{\ignorespaces\leftprotrusion}% \MT@exp@cs\MT@patch@patch{beamerx@\string\@mpfootnotetext} {\ignorespaces}{\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\scr@saved@footnotetext{\ignorespaces}{\ignorespaces\leftprotrusion}}% % \end{macrocode} % \item the base classes % \begin{macrocode} {\MT@patch@patch\@footnotetext{\ignorespaces}{\ignorespaces\leftprotrusion}}% \MT@patch@patch\@mpfootnotetext{\ignorespaces}{\ignorespaces\leftprotrusion}}}}% }{}% % \end{macrocode} % \end{itemize} % \item [|verbatim|] disable all microtypographic extensions in % verbatim blocks. (This could have been a 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 }} % % % \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} %\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 )} % ^^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 )} % ^^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} % \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} %\MT@requires@pdftex7{ %\g@addto@macro\MT@setupfont\MT@copy@font %}\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} %\MT@requires@pdftex6 %\MT@requires@luatex3 % {\g@addto@macro\MT@setupfont\MT@tracking}\relax \g@addto@macro\MT@setupfont{% \MT@check@font \ifMT@inlist@ %\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 % \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 % % \end{macrocode} % Disable ligatures (\pdftex\ 1.30). % \begin{macrocode} %\MT@requires@pdftex5{ %\g@addto@macro\MT@setupfont\MT@noligatures %}\relax \g@addto@macro\MT@setupfont{% % \end{macrocode} % Debugging. % \begin{macrocode} %\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 } % % \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 %\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 )} % ^^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 % \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 )} % ^^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} % \MT@exp@two@c\MT@lua@copyfont\meaning\font@name\@nil %\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 } %}\relax % \end{macrocode} %\end{macro} %\begin{macro}{\MT@lua@copy@font} % \meta{\#1} and \meta{\#2} are `|select|' and `|font|', respectively, % \meta{\#3} is the font spec. % \begin{macrocode} %\def\MT@lua@copyfont #1 #2 #3\@nil{% % \global\expandafter\font\MT@font@copy=#3\relax} % % \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 )} % ^^A MID: %\changes{v2.8}{2020/05/25}{try to fix zero \fontdim6} %\changes{v3.1b}{2023/12/04}{compatibility with \luatex\ in mode % (reported by \contributor Linas Stonys )} % ^^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 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=% % \pdffontsize\MT@font % \MT@requires@luatex4{\ifnum\outputmode=\@ne \pdffeedback fontsize\else % \MT@size pt% % \expandafter\@gobble\fi}{\pdffontsize}\MT@font \MT@info{Fixing zero \@backslashchar fontdimen 6 for font `\MT@@font'\MessageBreak (new value: \the\fontdimen6\MT@font)}% % \MT@requires@pdftex8\relax{\MT@glet@nc{\MT@@font-fake6}\@empty}% \fi \edef\MT@dimen@six{\number\fontdimen6\MT@font}% } % % \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} %\def\MT@dinfo@list#1#2#3{\MT@dinfo@nl{1}{\@nameuse{MT@abbr@#1}: #2 % \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{% % \MT@ifdefined@n@T % \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@ %\MT@dinfo@list{#2}{#1}{in}% \MT@dotrue \else %\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} % {\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{% % \MT@ifdefined@n@T % \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@ %\MT@dinfo@list{#1}{family}{in}% \MT@dotrue \else %\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@ % \MT@dinfo@list{#1}{family alias}{in}% \MT@dotrue %\else\MT@dinfo@list{#1}{family alias}{not in}% \fi \fi \fi \ifMT@do \else \expandafter\MT@clist@break \fi }% % {\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{% % \MT@ifdefined@n@T % \MT@ifdefined@n@TF {MT@#1list@size@\@tempa}{% \MT@exp@cs\MT@in@rlist{MT@#1list@size@\@tempa}% \ifMT@inlist@ %\MT@dinfo@list{#1}{size}{in}% \MT@dotrue \else %\MT@dinfo@list{#1}{size}{not in}% \MT@dofalse \expandafter\MT@clist@break \fi }% % {\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{% % \MT@ifdefined@n@T % \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@ %\MT@dinfo@list{#1}{font}{in}% \expandafter\MT@clist@break \else %\MT@dinfo@list{#1}{font}{not in}% \MT@dofalse \fi }% % {\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 )} % ^^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}} % % \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> %\def\MTS@show@pr %\def\MT@set@pr@codes {% % \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 )} % ^^A private mail, 2013/01/24 % (for each encoding). % \begin{macrocode} % \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 % % \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,% % \vrule width 4cm height .5pt \\ % \MTS@printtext{End of list `\texttt{\MT@pr@c@name}'}\\[.5em] % \MT@ifdefined@c@T\MT@pr@inh@name{% % \MT@ifdefined@n@T{MT@inh@\MT@pr@inh@name @prefixes}{% % \par \MTS@printtext{(with prefixes:)}% % \@tempcntb=\z@ % \end{macrocode} % Set unconditional heirs. % \begin{macrocode} \MT@set@pr@prefixheirs % }}% % \ifShowMissingGlyphs\MTS@show@missing\fi }% % {\MTS@printtext{NOT DEFINED}% \MT@reset@pr@codes % }\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 )} % ^^A MID: % ^^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{% %\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-> %\MT@requires@pdftex6 %\MT@requires@luatex3 {\def\MT@the@pr@code@tr{% \numexpr\@tempcntb+\MT@letterspace@/2\relax } }\relax % % \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 % \ifnum\MT@char > \m@ne % \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 % %\def\MTS@pr@split@val#1,#2\relax {\def\@tempb{#1}% \MT@ifempty\@tempb % \relax % {\MTS@lp@=\z@ \let\MTS@lpcode\@empty}% {\MT@scale@to@em % \lpcode\MT@font\MT@char=\MT@the@pr@code % \MTS@lp@=\dimexpr\@tempcntb em/1000\relax\relax % \edef\MTS@lpcode{[\@tempb] \the\@tempcntb/\the\MTS@lp@}% %\MT@dinfo@nl{4}{;;; lp (\MT@char): \number\lpcode\MT@font\MT@char: [#1]}% }% \def\@tempb{#2}% \MT@ifempty\@tempb % \relax % {\MTS@rp@=\z@ \let\MTS@rpcode\@empty}% {\MT@scale@to@em % \rpcode\MT@font\MT@char=\MT@the@pr@code % \MTS@rp@=\dimexpr\@tempcntb em/1000\relax\relax % \edef\MTS@rpcode{[\@tempb] \the\@tempcntb/\the\MTS@rp@}% %\MT@dinfo@nl{4}{;;; rp (\MT@char): \number\rpcode\MT@font\MT@char: [#2]}% }% % \llap{\MTS@show@char@pr\MT@char\quad}% % \parbox[b][][b]{3.5cm}{\MTS@printtext{% % \footnotesize\makebox[.4cm][l]{L:} \MT@ifempty{\MTS@lpcode}{---}{\MTS@lpcode}\\ % \makebox[.4cm][l]{R:} \MT@ifempty{\MTS@rpcode}{---}{\MTS@rpcode}}}% % \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 @}% % \MT@set@pr@heirs % \MTS@show@char@pr }% }% % }\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} %\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@ % % \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 % \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} } % % % % \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 reported that % the `fl' ligature is missing in Palatino )} % ^^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 )} % ^^A % ^^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 %\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 %\MT@dinfo@nl{2}{-- heir of \MT@char: #1}% %\MT@dinfo@nl{4}{;;; lp/rp (#1): \number\lpcode\MT@font\MT@char/% % \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 }% }% } % % \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> %\def\MT@set@pr@prefixes#1{\MT@set@pr@prefixes@#1} %\def\MT@set@pr@prefixes@#1#2#3#4% %\def\MTS@set@pr@prefixes@#1#2#3#4% {% % \MTS@lp@=\z@ \MTS@rp@=\z@ % \ifnum#1=\@tempcntb \else % \par\leavevmode % \llap{\MTS@show@char@pr{#1} \MTS@printtext{=} }% % \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}% % \@tempcnta=\z@ \ifnum#3>\z@ \@tempcnta=\numexpr % (\fontcharwd\MT@font#2-\fontcharwd\MT@font#1)% % (\fontcharwd\MT@font\@tempb-\fontcharwd\MT@font\@tempa)% *#3/\MT@dimen@six\relax \fi % \lpcode\MT@font #2=\numexpr\lpcode\MT@font#1+\@tempcnta\relax % \MTS@lp@=\dimexpr\numexpr\lpcode\MT@font#1+\@tempcnta\relax em/1000\relax \@tempcnta=\z@ \ifnum#4>\z@ \@tempcnta=\numexpr % (\fontcharwd\MT@font#2-\fontcharwd\MT@font#1)% % (\fontcharwd\MT@font\@tempb-\fontcharwd\MT@font\@tempa)% *#4/\MT@dimen@six\relax \fi % \rpcode\MT@font #2=\numexpr\rpcode\MT@font#1+\@tempcnta\relax % \MTS@rp@=\dimexpr\numexpr\rpcode\MT@font#1+\@tempcnta\relax em/1000\relax %\MT@dinfo@nl{2}{-- (prefix) heir of #1: #2}% %\MT@dinfo@nl{4}{;;; lp/rp (#2): \number\lpcode\MT@font#2/% % \number\rpcode\MT@font#2}% % \MTS@show@char@pr{#2}% % \@tempcntb=#1\relax } % % \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 groups anymore.) %\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 \MT@noindent #1\relax\MT@csq@eqgroup}% \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 %%\vbox to0pt{\vss\llap{\fbox{% %% \MT@ifstreq{#2}{left}{\kern\@tempdima}\relax %% \kern-\fboxsep\unhbox\MT@tempbox\kern-\fboxsep %% \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 : % 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 )} % ^^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@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} \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@X} % 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@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 % and \contributor Uwe Siart )} % ^^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}} % 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##2{% \let\MT@maybe@textcmd##1% \the\MT@toks \MT@toks{}% \MT@prot@toks{##1{##2}}% \MT@prot@get@firstgroup@tc##2\MT@nil }% \fi } % \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}} % 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\MT@nil } % \end{macrocode} %\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. % \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 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 \MT@addto@setup{% \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\textsw}{F\textssc}{F\textulc}% {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} % 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 . %\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}}}% % \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}}}% } % \end{macrocode} %\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 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*% } % % \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. % \begin{macrocode} %<*pdf-|lua-|xe-> \def\MT@prot@addtoken@next#1{% \MT@toks\expandafter{\the\MT@toks#1}% \setbox\MT@tempbox\hbox{% % \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}% % \relax % }\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}}% } % % \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 } % % \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} %\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 }{ % \def\MT@expandfont{% \pdffontexpand\MT@font \MT@stretch@ \MT@shrink@ \MT@step@ \MT@auto@\relax } %} % \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{% %\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} %\MT@requires@pdftex4 %\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 %\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@}% % \MT@requires@luatex3\relax{% \MT@get@ex@opt@{auto}{\MT@ifstreq{\MT@auto@}{autoexpand}{En}{Dis}abling automatic expansion}% % }% \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 %\MT@dinfo@nl{2}{-- heir of \MT@char: #1}% %\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 } % % \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 %\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 %\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 %\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 %\MT@dinfo@nl{2}{-- heir of \MT@char: #1}% %\MT@dinfo@nl{4}{;;; knbs/stbs/shbs (#1): \number\knbscode\MT@font\MT@char/% % \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{% %\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 %\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 %\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 %\MT@dinfo@nl{2}{-- heir of \MT@char: #1}% %\MT@dinfo@nl{4}{;;; knbc (#1): \number\knbccode\MT@font\MT@char/% % \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{% %\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 % % \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) % or \luatex\ 0.62. % \begin{macrocode} %<*pdf-|lua-> %\MT@requires@pdftex6 %\MT@requires@luatex3 { % \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 } % %\let\MT@tracking % \MT@tracking@ % \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-|letterspace> \def\MT@set@tr@codes{% %<*pdf-|lua-> \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 }% }{% % \MT@if@list@exists \MT@get@tr@opt \relax % \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 % \MT@vinfo{... Tracking by \number\MT@letterspace@}% % \end{macrocode} % Letterspacing only works in mode. % \begin{macrocode} \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 %\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-|letterspace> \MT@if@luaotf@font{% %\MT@dinfo@nl{1}{... luaotf font: \MessageBreak % \expandafter\fontname\font@name}% \global\expandafter\font\MT@lsfont=\MT@ls@fontspec@font }{% % %\MT@dinfo@nl{1}{... legacy font}% \global\expandafter\letterspacefont\MT@lsfont\font@name\MT@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-> \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,% % %<*letterspace> % spacing = {*,,} \fontdimen2\MT@lsfont=\dimexpr\numexpr 1000+\MT@letterspace@\relax sp * \fontdimen2\MT@lsfont/1000\relax % % \end{macrocode} %\changes{v2.3}{2007/11/03}{possibility to customise outer kerning % (suggested by \contributor Stephan Hennig )} % ^^A MID: <46aa1cbb$0$31620$9b4e6d93@newsspool3.arcor-online.net> % Adjust outer kerning (\microtype\ only). % \begin{macrocode} %<*pdf-|lua-> \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). % \begin{macrocode} \MT@ifdefined@c@T\MT@tr@ligatures\MT@tr@noligatures % %<*letterspace> % no ligatures = {f} \tagcode\MT@lsfont`f=\m@ne % % \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 )} % ^^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 )} % ^^A private mail, 2008/05/12 % \begin{macrocode} % \MT@if@luaotf@font\relax{% %\MT@dinfo@nl{2}{... compensating for tracking (\number\MT@letterspace@)}% \MT@do@font{\lpcode\MT@lsfont\@tempcnta=\numexpr\MT@letterspace@/2\relax \rpcode\MT@lsfont\@tempcnta=\numexpr\MT@letterspace@/2\relax}% \let\MT@the@pr@code\MT@the@pr@code@tr % }% \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 % \let\MT@font\MT@lsfont % \MT@if@luaotf@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-> \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 % % \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 % % \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-> \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 % %<*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 }% % \fi %<*pdf-|lua-> % \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 }% % \fi % }% } % \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{% % \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}% }% % }% } % % \end{macrocode} %\end{macro} %\begin{macro}{\MT@ls@fontspec@font} %\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 )} % ^^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 )} % ^^A https://tex.stackexchange.com/questions/567698/luatex-microtype-fontspec-luaotfload-buggy-interaction-canceling-each-others-s % Add the |kernfactor| feature to a font loaded by \pkg{fontspec}. % \begin{macrocode} %<*lua-|letterspace> \def\MT@ls@fontspec@font{% \MT@lua{microtype.add_ls([[\MT@letterspace@]])}% } % %<*luafile> local function add_ls(k) local f = tex.fontname(font.current()) local spec,size = match(f,'^(.+)( at .+)$') if not spec then spec = f end local a,b,c = match(spec,'^([^:]+):?([^:]*):?(.*)$') local ls = "kernfactor=" .. k/1000 .. ';' microtype.sprint(a..':') if (a == "name" or a == "file") then microtype.sprint(b..':'..ls..c) else microtype.sprint(ls..b) end if size then microtype.sprint(size) end end microtype.add_ls = add_ls % % \end{macrocode} %\end{macro} %\begin{macro}{\MT@get@tr@opt} % Various settings (only for the \microtype\ version). % \begin{macrocode} %<*pdf-|lua-> \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}% } % \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}}% } % % \end{macrocode} %\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-|letterspace> %\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 )} % ^^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 % \MT@maybe@gobble@with@tikz{\aftergroup\glb@settings}% % \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 } % % \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 ) % \githubissue{12}} % and insert the correct kerning. % \begin{macrocode} \DeclareRobustCommand\lslig[1]{% {\MT@ifdefined@c@TF\MT@curr@ls{% \escapechar\m@ne % \MT@requires@latex2{% \xdef\font@name{\csname\curr@fontshape/\f@size\endcsname}% % }\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 %\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 )} % ^^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{% %\MT@dinfo@nl{1}{... zero tracking}% \xdef\MT@ls@basefont{\csname\expandafter\string\font@name @base\endcsname}% \expandafter\ifx\MT@ls@basefont\relax \else %\MT@dinfo@nl{1}{... fixing base font}% \aftergroup\MT@set@lsbasefont \fi } % % \end{macrocode} %\end{macro} %\end{macro} %\begin{macro}{\MT@tr@noligatures} % \pdftex\ 1.40.0--1.40.3 disabled all ligatures in letterspaced fonts. % \begin{macrocode} %<*pdf-|lua-> %\MT@requires@pdftex7{ \def\MT@tr@noligatures{% \ifx\MT@tr@ligatures\@empty \MT@noligatures@\MT@lsfont\@undefined \else \MT@noligatures@\MT@lsfont\MT@tr@ligatures \fi } %<*pdf-> }{ \def\MT@tr@noligatures{% \MT@warning@nl{% Disabling selected ligatures is only possible since\MessageBreak pdftex 1.40.4. Disabling all ligatures instead}% \MT@glet\MT@tr@noligatures\relax } } % % \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 ? , MID: %^^A or in fact, shouldn't we test whether \spaceskip<>0pt ? % \begin{macrocode} \def\MT@tr@set@space#1,#2,#3,#4,#5,#6,{% %\MT@dinfo@nl2{... orig. space: \the\fontdimen2\MT@lsfont, % \the\fontdimen3\MT@lsfont, \the\fontdimen4\MT@lsfont % \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 %\MT@dinfo@nl2{... inner space: \the\fontdimen2\MT@lsfont, % \the\fontdimen3\MT@lsfont, \the\fontdimen4\MT@lsfont}% %\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). % \begin{macrocode} \ifnum#2=\tw@ \advance\@tempdima -\dimexpr\MT@letterspace@ sp*\MT@dimen@six/#3\relax \fi }{% \MT@ifempty\@tempa{\let\@tempa\MT@letterspace@}\relax \@tempdima=\dimexpr \numexpr1000+\@tempa sp *\fontdimen#2\MT@lsfont/1000\relax }% %\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@ %\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 %\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 )} % ^^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 )} % ^^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 )} % ^^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 %\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 )} % ^^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 )} % ^^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 )} % ^^A % \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 %\MT@dinfo2{]]] adjusting post space (2): \the\MT@outer@space}% \fi}% }{% \MT@if@outer@next~{% \def\MT@temp*~{\nobreak\hskip\MT@outer@space %\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 %\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 )} % ^^A https://tex.stackexchange.com/questions/213164 % ^^A MID: %\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} }{ \DeclareRobustCommand\lsstyle{% \MT@error{Letterspacing only works with \MT@engine tex version % 1.40% % 0.62% \MessageBreak or newer} {Upgrade \MT@engine tex, or try the `soul' package instead.}% \MT@glet\lsstyle\relax } } % \end{macrocode} % And for \xetex, too. % \begin{macrocode} % %<*xe-> \DeclareRobustCommand\lsstyle{% \MT@error{Letterspacing currently doesn't work with xetex} {Run pdftex or luatex, or use the `soul' package instead.}% \MT@glet\lsstyle\relax } % % \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 )} % ^^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}} % 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 % %<*pdf-|lua-> \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 %\MT@dinfo@nl2{... outer kerning: (#1,#2) % = \@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 }% \advance\@tempdima -\dimexpr \MT@letterspace@ sp * \fontdimen6\MT@lsfont/2000\relax \edef\MT@temp{\MT@temp{\the\@tempdima}}% } % % \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-|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 } % % \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)} % \begin{macrocode} %<*pdf-|lua-> %\MT@requires@pdftex5{ \def\MT@noligatures{% \MT@dotrue \let\@tempa\MT@nl@setname \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} %\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 \def\MT@curr@list@name{\@backslashchar DisableLigatures}% \MT@map@clist@c#2{% \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} % \MT@if@luaotf@font % {\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% % \MT@if@luaotf@font % {\MT@lua{microtype.noligatures([[#1]],"_all_")}}\relax \MT@vinfo{... Disabling all ligatures}% }% } %}\relax % % \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 % % \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> %\def\MT@load@list#1% %\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 % :\par\medskip\leavevmode \else \MT@ifdefined@n@TF{MT@\MT@feat @c@\@tempb}{% % \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{% % \@nameuse{MT@abbr@\MT@feat} list \noexpand\MessageBreak `\@tempb'}% \MT@let@cn\@tempc{MT@\MT@feat @c@\@tempb}% \expandafter\MT@set@codes\@tempc,\relax,% % \vrule width 4cm height .5pt \\ % \MTS@printtext{End of list \texttt{\MT@curr@list@name}}% % \par\medskip\leavevmode }{% \MT@error{\@nameuse{MT@abbr@\MT@feat} list `\@tempb' undefined.\MessageBreak Cannot load it from list `\@tempa'}{}% }% \fi }% } % % \end{macrocode} %\end{macro} %\changes{v1.1}{2004/09/13}{configuration file names in lowercase % (suggested by \contributor Harald Harders )} % ^^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 )} % ^^A MID: % |&| (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 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 )} % ^^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 's idea)} % ^^A private mail, 2005/03/12 %\changes{v1.8}{2005/04/16}{made recursive} % \begin{macrocode} \def\MT@get@listname#1{% %\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 )} % ^^A private mail, 2005/03/10 %\changes{v1.7}{2005/03/11}{always check for size, too % (suggested by \contributor Andreas B\"uhmann )} % ^^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}% %\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}% %\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}% %\MT@dinfo@nl{1}{... Using \@nameuse{MT@abbr@\MT@feat} inheritance list % `\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 %\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 )} % ^^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 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 } % % \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, ) font, proceed as usual. % \begin{macrocode} % \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 )} % ^^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}% %\MT@dinfo@nl{3}{> `\the\MT@toks' is a glyph name (\the\@tempcnta)}% \fi \fi \else % % \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 )} % ^^A http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=725395#15 % \begin{macrocode} \ifMT@norest \else \MT@warn@rest % \let\MT@char\m@ne % \let\MT@char\@empty \fi % \fi \else \MT@warn@unknown % \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}% %\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 %\MT@dinfo@nl{3}{> (glyph number: \the\@tempcnta, % 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 % } % % \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 , 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 )} % ^^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 % % \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- 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 % {127 } % {1114111 } \def\MT@max@slot % {255 } % {1114111 } % % \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\\% %\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}% %\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 )} % ^^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 %\MT@dinfo@nl{3}{> ... a hexadecimal number: \MT@char@}% \else \if#1'\relax \def\MT@char@{\number#1#2#3}% %\MT@dinfo@nl{3}{> ... an octal number: \MT@char@}% \else \MT@ifint{#1#2#3}{% \def\MT@char@{\number#1#2#3}% %\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 )} % ^^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 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 )} % ^^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 % /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 encoding} % With \pkg{fontspec}'s 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 % /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% % \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 )} % ^^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 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|letterspace> %\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} % \MT@with@package@T{luatexja}{\MT@warn@unknown@once{luatexja}}% % \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 % 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)% % }% \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} % \MT@if@expanding@F{% \escapechar\m@ne %<*package> % \global\MT@inannottrue % \MT@glet\MT@pdf@annot\@empty % \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 % \MT@addto@annot{= substituted with \MT@@font}% \MT@register@subst@font \fi \fi \MT@setupfont}% % % \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 )} % ^^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 )} % ^^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 }% % } %}\relax % %<*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 % and \contributor Josep Maria Font )} % ^^A 1. % ^^A 2. % ^^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 )} % ^^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 } % % \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-> %\MT@requires@pdftex6 %\MT@requires@luatex3 % {\def\MT@active@features{,tr}}{% \let\MT@active@features\@empty % } % % \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 )} % ^^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 )} % ^^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} \def\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 % \MessageBreak= \MT@pr@context/\MT@ex@context % /\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 %\MT@dinfo{1}{>>> no change of #1 context: `\MT@val'}% \else \MT@vinfo{>>> Changing #1 context to `\MT@val'\MessageBreak\on@line % \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}}% % \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 %\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 )} % ^^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 %\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 }% %\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 )} % ^^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} % 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 % 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 (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 %\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}{% %\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{% %\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 )} % ^^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}% } % % \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-> %\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 } %}{ % % \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}{% % Upgrade % Use pdftex.}% } %} % % \end{macrocode} %\end{macro} % %\subsubsection{Interaction with \pkg{babel}} % %\begin{macro}{\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. %\changes{v2.0}{2005/10/04}{new command: interaction with \pkg{babel}} ^^A (beta:1) % \begin{macrocode} %<*package> \def\DeclareMicrotypeBabelHook#1#2{% \MT@map@clist@n{#1}{% \KV@@sp@def\@tempa{##1}% \MT@gdef@n{MT@babel@\@tempa}{#2}% }% } % \end{macrocode} %\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}% %\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 } % % \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 }% %\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 } % \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 )} % ^^A private mail, 2007/06/15 % \begin{macrocode} \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}% %\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 } % % \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}% %\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}% %\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 } % % \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 )} % ^^A % ^^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 )} % ^^A MID: % ^^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}% %\MT@dinfo@nl{1}{initialising: use list for font \@tempb=\MT@val % \ifx\MT@extra@context\@empty\else\MessageBreak % (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 )} % ^^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}}}% } % % \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-> %\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-> }{ \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-|xe-> \define@key{MT@pr@c}{context}[]{% \MT@error{Protrusion contexts only work with pdftex % 1.40.4\MessageBreak or later. % \MessageBreak or luatex. Ignoring `context' key\on@line}% % {Upgrade pdftex.}% % {Use pdftex or luatex.}% } % %} % \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} %<*pdf-|lua-> \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}}% } % % \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}}% }% }% }% } % % \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} % \MT@requires@pdftex4% % \MT@requires@luatex3\relax {\MT@gdef@n{MT@ex@c@\MT@curr@set@name @auto}{autoexpand}}% % {\MT@warning{pdftex too old for automatic font expansion}}% \else % \MT@requires@pdftex4% %<*lua-> \MT@requires@luatex3{% \MT@warning{Non-automatic font expansion doesn't work with\MessageBreak luatex}}% % {\MT@glet@nc{MT@ex@c@\MT@curr@set@name @auto}\@empty}% % \relax \fi } % \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} \MT@define@opt@key{tr}{spacing} \MT@define@opt@key{tr}{outerspacing} \MT@define@opt@key{tr}{outerkerning} % \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}}} % % \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}}% %\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} % %<*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 % \ifnum\MT@char > \m@ne % \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 % \ifnum\MT@char > \m@ne % \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 }% %\MT@dinfo@nl{2}{children of #1 (\MT@val): % \@nameuse{MT@inh@\MT@listname @\ifx\MT@inh@prefix\@empty\MT@val @\else prefixes\fi}}% \fi \fi } % % \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 )} % ^^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 %\MT@dinfo@nl{1}{initialising: use list for font \@tempa,\MessageBreak % sizes: \csname MT@\MT@permutelist @\@tempa\MT@extra@context % @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'}% }% }% %\MT@dinfo@nl{1}{initialising: use list for font \@tempa % \ifx\MT@extra@context\@empty\else\MessageBreak % (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|letterspace> %\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}}% } %}\relax % %<*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 )} % ^^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 )} % ^^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} % %<*pdf-|lua-|xe-> %\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 % % \MT@warning@nl{Ignoring `DVIoutput' option}% \fi } % % \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 } % % \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-> %\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-|xe-> \MT@def@bool@opt{copyfonts}{% \csname if\@tempa\endcsname \MT@error % {The pdftex version you are using is too old\MessageBreak % to use the `copyfonts' option}{Upgrade pdftex.}% % {The `copyfonts' option does not work with xetex} % {Use pdftex or luatex instead.}% \fi } %} % % \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 )} % ^^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 )} % ^^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}}% }% }% }% } % % \end{macrocode} %\changes{v1.5}{2004/12/02}{defaults: \opt{step}: 4 % (suggested by \contributor H\`an \thanhthe{} Th\`anh )} % ^^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> %\MT@requires@latex1{ \MT@map@clist@n{% % 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}}% }% } %}\relax % % \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 , 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 % output, so that the user might not even be aware of the fact that she's % running \pdftex.) % \begin{macrocode} \MT@protrusiontrue % %<*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} % \MT@requires@pdftex4{ \MT@expansiontrue % \MT@autotrue % }\relax \fi %\MT@autotrue % % \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 )} % ^^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} %\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} \def\microtypesetup{\setkeys{MT}} \MT@addto@setup{\def\microtypesetup#1{\setkeys{MTX}{#1}\selectfont}} % %<*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 % \let\MT@protrudechars\pdfprotrudechars \let\MT@adjustspacing\pdfadjustspacing % %<*xe-> \let\MT@protrudechars\XeTeXprotrudechars \define@key{MTX}{expansion}[true]{\MT@warning{Ignoring expansion setup}} % % \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-|lua-> %\MT@requires@pdftex6{ %\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} % \MT@define@optionX@{spacing}{\pdfadjustinterwordglue\@tempcnta} % \MT@define@optionX@{kerning}{\pdfprependkern\@tempcnta % \pdfappendkern\@tempcnta} }{ % %<*pdf-|lua-|xe-> % \end{macrocode} % Disable for older \pdftex\ versions and for \xetex\ and \luatex. % \begin{macrocode} \define@key{MTX}{tracking}[true]{\MT@warning{Ignoring tracking setup}} %} \define@key{MTX}{kerning}[true]{\MT@warning{Ignoring kerning setup}} \define@key{MTX}{spacing}[true]{\MT@warning{Ignoring spacing setup}} %} \define@key{MTX}{activate}[true]{% \setkeys{MTX}{protrusion={#1}}% % \setkeys{MTX}{expansion={#1}}% } % % \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 } % % \end{macrocode} % %\subsubsection{Processing the options}\label{ssub:impl.options} % %\begin{macro}{\MT@ProcessOptionsWithKV} % Parse options. % \begin{macrocode} %<*package|letterspace> %\MT@requires@latex1{ \def\MT@ProcessOptionsWithKV#1{% \let\@tempc\relax \let\MT@temp\@empty % \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}}} % \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} %}\relax % %<*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 } % % \end{macrocode} %\begin{macro}{\MT@setup@PDF} % \pdftex\ can create output, too. However, both the 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 } % %<*xe-> \let\MT@setup@PDF\relax \let\MT@setup@copies\relax % % \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 } % % \end{macrocode} %\end{macro} %\begin{macro}{\MT@setup@expansion} % For 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 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 mode with \luatex\ % (reported by \contributor Daniel Benjamin Miller )} ^^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 % \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 % \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}% }% % \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 )} % ^^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 )} % ^^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 . %\changes{v1.5}{2004/12/02}{disable automatic expansion for output} %\changes{v2.7}{2017/07/02}{don't disable automatic expansion for 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 }% }% % % \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 }% }% % %<*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 % \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 % and \contributor Falk Hanisch )} % ^^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 } % %<*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 } % % \end{macrocode} %\end{macro} %\begin{macro}{\MT@setup@tracking} % Tracking, spacing and kerning. % \begin{macrocode} %<*pdf-|lua-> %\MT@requires@pdftex6{% %\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 } % % \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 )} % ^^A MID: % ^^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 packages % and babel', started by Philipp Lehman on 16~August 2005, % :~\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 } % % \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} %}{ %<*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 } } % %<*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} % {Upgrade pdftex.}% % {Use pdftex instead.}% \csname MT@#1false\endcsname \MT@let@nc{MT@#1}\relax \else \MT@info@nl{No adjustment of #1% % \space(pdftex too old)% }% \fi } % \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}} %} % % \end{macrocode} %\end{macro} %\begin{macro}{\MT@setup@warntracking} % \begin{macrocode} %\MT@addto@setup %\def\MT@setup@warntracking % \end{macrocode} %\begin{macro}{\MT@warn@tracking@DVI} %\changes{v2.2}{2007/02/11}{warning when letterspacing in mode} %\changes{v2.7}{2017/07/06}{don't warn for letterspacing in mode with \luatex} % With \pdftex, we issue a warning, when letterspacing in 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-|letterspace> {% %<*pdf-|letterspace> \ifnum\pdfoutput<\@ne \def\MT@warn@tracking@DVI{% % \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}% % }\relax \MT@glet\MT@warn@tracking@DVI\relax }% \else % \def\MT@warn@tracking@DVI{% \ifnum\pdfprotrudechars<\@ne \global\pdfprotrudechars\@ne \fi \MT@glet\MT@warn@tracking@DVI\relax }% % \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 } % %\let\MT@setup@warntracking\relax % \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{% % \MT@requires@pdftex5{% \ifMT@noligatures \else \let\MT@noligatures\relax \fi % }\relax } % %\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 )} % ^^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} % % \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 )} % ^^A private mail, 2009/02/03 % \begin{macrocode} %<*package|letterspace> %\MT@requires@latex1{ \AtBeginDocument{\MT@setup@ \MT@glet\MT@setup@\@empty} %}\relax % % \end{macrocode} % Must come at the very, very end. % \begin{macrocode} %\MT@ifdefined@c@T\MT@setup@spacing@check % {\AtBeginDocument{\MT@setup@spacing@check}} % \end{macrocode} % Restore catcodes. % \begin{macrocode} %\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 )} % ^^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 encoding to \texttt{allmath}} %\changes{v1.9}{2005/08/17}{add encoding to text sets} %\changes{v1.9}{2005/08/17}{add encoding to text sets} %\changes{v1.9d}{2006/04/20}{add encoding to text sets} %\changes{v2.3e}{2009/10/28}{add encoding} %\changes{v2.5}{2010/05/13}{add and encodings} %\changes{v2.6}{2016/04/22}{add encoding % (notified by \contributor Will Robertson )} % ^^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 )} % ^^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 )} % ^^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 // 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 , 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 )} % ^^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 )} % ^^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 )} % ^^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 Serif as an alias of New Computer Modern} % 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 ` Neu' fonts, a `re-implementation' of Palatino. %\changes{v2.2}{2007/05/27}{declare \texttt{fp9x}, \texttt{fp9j} ( 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 )} % ^^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 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 )} % ^^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 Garamond. % \begin{macrocode} \DeclareMicrotypeAlias{mdbch}{bch} % mathdesign/Charter %% -- Garamond \DeclareMicrotypeAlias{mdugm}{ugm} % mathdesign/URW Garamond % \end{macrocode} % The \pkg{garamondx} package, an extension of 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 Garamond as the base font. % \begin{macrocode} \DeclareMicrotypeAlias{pad} {EBGaramond-LF}% Adobe Garamond \DeclareMicrotypeAlias{padx}{EBGaramond-TLF}% " \DeclareMicrotypeAlias{padj}{EBGaramond-TOsF}% " %% -- % \end{macrocode} % 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 () 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 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 )} % ^^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|ebg|zpeu|mvs> %%% ----------------------------------------------------------------------- %%% CHARACTER INHERITANCE % %<*m-t> % \end{macrocode} % %\subsubsection{} % 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{} % 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 list, add \cmd\DJ} %\changes{v1.8}{2005/04/26}{remove \cmd\DJ\ from 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{} % 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{} %\changes{v1.9}{2005/08/16}{add list for } %\changes{v2.7b}{2019/02/28}{add textquotedblleft ligature to % (reported by \contributor Franz Wexler <@\at @>)} % ^^A https://tex.stackexchange.com/questions/476648/ % The Polish 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{} %\changes{v1.9d}{2006/04/20}{add list for encoding (contributed by % \contributor Maciej Eder )} % ^^A private mail, 2006/04/19 % The Central European encoding.\footnote{ % Contributed by \contributor Maciej Eder .} % 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 encoding % (reported by \contributor Vasile Gaburici )} % ^^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 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{} %\changes{v1.9}{2005/08/17}{add list for (requested by % \contributor H\`an \thanhthe{} Th\`anh )} % ^^A private email, 2005/08/16 % The Vietnamese encoding . 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{, , } %\changes{v2.5}{2010/11/05}{add rudimentary list for and } ^^A (beta:03) %\changes{v2.6}{2016/04/22}{add encoding} % The (\xetex), (\luatex), and, since \pkg{fontspec} version 2.5, % 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 ). 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} } % % \end{macrocode} %\subsubsection{} %\changes{v3.0}{2021/06/24}{add settings for } % The Greek encoding. Garamond contains some more glyphs. % \begin{macrocode} %<*m-t|ebg> \DeclareCharacterInheritance { encoding = LGR, % family = {EBGaramond-OsF,EBGaramond-TOsF,EBGaramond-LF,EBGaramond-TLF} } { % A = {012}, % A = {009,012,253}, % (l)E = {199}, % H = {010}, % (l)H = {159}, I = {219}, % (l)I = {155}, O = J, % (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}, % i = {200,201,202,203,208,209,210,211,216,217,218,240,241,242,243}, % 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}, % \textstigma = \textvarstigma, . = {059} % ano teleia } % % \end{macrocode} % %\subsubsection{Euro symbols} % Make Euro symbols settings simpler. % \begin{macrocode} %<*zpeu> \DeclareCharacterInheritance { encoding = U, family = {zpeu,zpeus,eurosans} } { E = 128 } % %<*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) instead of . %\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 % % \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 encoding to default list} ^^A (beta:09) %\changes{v2.6}{2016/04/22}{add 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. % \begin{macrocode} %<*m-t> %%% ----------------------------------------------------------------------- %%% TRACKING/LETTERSPACING \SetTracking [ name = default, no ligatures = {f} ] { encoding = {OT1,T1,T2A,LY1,OT4,QX,EU2,TU} } { } % \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 encoding.\footnote{Contributed by % \contributor Karl Karlsson .} %\changes{v2.3e}{2009/10/28}{settings for encoding % (contributed by \contributor Karl Karlsson )} % \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} % 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 } % % \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 encoding (Computer Modern Roman, % Palatino, Times)} %\changes{v1.9}{2005/08/17}{settings for encoded Computer Modern Roman} %\changes{v1.9a}{2005/12/02}{settings for 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 % [ name = default ] % \end{macrocode} % We also create configuration files for the fonts %\begin{itemize} % \item Bitstream Charter ( code |bch|) %\changes{v1.5}{2004/11/28}{settings for Bitstream Charter} % \begin{macrocode} % [ name = bch-default ] % \end{macrocode} % \item Bitstream Letter Gothic (|blg|) %\changes{v2.2}{2007/03/03}{settings for Bitstream Letter Gothic} % \begin{macrocode} % [ name = blg-default ] % \end{macrocode} % \item Computer Modern Roman (|cmr|) % \begin{macrocode} % [ name = cmr-default ] % \end{macrocode} % \item Garamond % \begin{macrocode} % [ name = EBGaramond-default ] % \end{macrocode} % \item Minion\footnote{Contributed by \contributor Harald Harders % and \contributor Karl Karlsson .} % (|pmnx|, |pmnj|) %\changes{v1.1}{2004/09/14}{settings for Adobe Minion (contributed by % \contributor Harald Harders )} % ^^A private mail, 2004/09/14 % \begin{macrocode} % [ name = pmnj-default ] % \end{macrocode} % \item Palatino (|ppl|, |pplx|, |pplj|) % \begin{macrocode} % [ name = ppl-default ] % \end{macrocode} % \item Times (|ptm|, |ptmx|, |ptmj|) % \begin{macrocode} % [ name = ptm-default ] % \end{macrocode} % \item Garamond (|ugm|) %\changes{v1.9c}{2006/01/26}{settings for Garamond} %\end{itemize} % \begin{macrocode} % [ name = ugm-default ] % { } % { encoding = OT1, % { encoding = {OT1,OT4}, % family = bch } % family = blg } % family = {ppl,pplx,pplj} } % family = {ptm,ptmx,ptmj} } % family = ugm } { % A = {50,50}, % A = {50,100}, % \AE = {50, }, % \AE = {150,50}, % B = { ,50}, % C = {50, }, % D = { ,50}, % D = { ,70}, % E = { ,50}, % F = { ,50}, % F = { ,70}, % G = {50, }, % G = {50,50}, % I = {150,150}, % J = {50, }, % J = {100, }, % K = { ,50}, % K = {50, }, % L = { ,50}, % L = { ,150}, % L = { ,80}, % L = { ,120}, % O = {50,50}, % \OE = {50, }, % \OE = {50,50}, % P = { ,100}, % P = { ,50}, % Q = {50,70}, % Q = {50,50}, % R = { ,50}, % R = { ,70}, % T = {50,50}, % T = {100,100}, % T = {70,70}, % V = {50,50}, % V = {70,70}, % W = {50,50}, % W = {70,70}, % X = {50,50}, % X = {50,70}, % Y = {50,50}, % Y = {80,80}, % Z = {50,50}, % f = {150,100}, % i = {150,150}, % j = {100,100}, % k = { ,50}, % k = { ,70}, % l = {150,150}, % l = { ,-50}, % p = {50,50}, % p = { ,50}, % q = {50, }, % r = { ,50}, % r = {100, 80}, % t = { ,70}, % t = { ,50}, % t = {150, 80}, % t = { ,100}, % v = {50,50}, % v = {100,100}, % v = {50,70}, % w = {50,50}, % w = {50,70}, % x = {50,50}, % x = {100,100}, % y = { ,50}, % y = { 50,100}, % y = {50,70}, % y = { ,70}, % \end{macrocode} %\changes{v1.6}{2005/01/11}{improve settings for numbers % (pointed out by \contributor Peter Muthesius )} % ^^A MID: <34b1h7F48s44tU1@individual.net> % \begin{macrocode} % 0 = { ,50}, % 1 = {50,50}, % 1 = {150,150}, % 1 = {100,200}, % 1 = { ,50}, % 1 = {100,100}, % 2 = {50,50}, % 2 = { ,100}, % 3 = {50, }, % 3 = {50,50}, % 3 = {100, }, % 4 = {50,50}, % 4 = {100,50}, % 4 = {100, }, % 4 = {70,70}, % 4 = {50, }, % 4 = {70, }, % 5 = { ,50}, % 6 = {50, }, % 6 = { ,50}, % 7 = {50,50}, % 7 = {50,80}, % 7 = {100,100}, % 7 = {50,100}, % 7 = { ,50}, % 8 = { ,50}, % 9 = {50,50}, % 9 = { ,50}, % . = { ,700}, % . = { ,600}, % . = {400,500}, % {,}= { ,500}, % {,}= {300,400}, % : = { ,500}, % : = { ,400}, % : = {300,400}, % ; = { ,300}, % ; = {200,300}, % ; = { ,500}, % ; = { ,400}, % ! = { ,100}, % ! = {200,200}, % ? = { ,100}, % ? = { ,200}, % ? = {150,150}, % " = {300,300}, % @ = {50,50}, % @ = {100,100}, % ~ = {200,250}, % ~ = {300,350}, % & = {50,100}, % & = { ,100}, % \% = {50,50}, % \% = { ,50}, % \% = {100,100}, % \% = {50,100}, % \# = {100,100}, % * = {200,200}, % * = {200,300}, % * = {150,200}, % * = {300,300}, % + = {250,250}, % + = {150,250}, % + = {150,200}, % + = {250,300}, % {=}= {200,200}, % ( = {100, }, ) = { ,200}, % ( = {200, }, ) = { ,200}, % ( = {300, }, ) = { ,300}, % ( = {100, }, ) = { ,300}, % [ = {100, }, ] = { ,100}, % [ = {300,100}, ] = { ,300}, % \end{macrocode} %\changes{v1.7}{2005/03/15}{fix: remove \textbackslash\ from , % add \cmd\textbackslash\ to encoding} % \begin{macrocode} % / = {100,200}, % / = { ,200}, % / = {300,300}, % / = {200,300}, % / = {100,300}, % - = {500,500}, % - = {400,500}, % - = {300,400}, % - = {300,500}, % - = {200,400}, % - = {500,600}, % < = {200,100}, > = {100,200}, % _ = {150,250}, % | = {250,250}, % \textendash = {200,200}, \textemdash = {150,150}, % \textendash = {200,300}, \textemdash = {150,250}, % \textendash = {400,300}, \textemdash = {300,200}, % \textendash = {300,300}, \textemdash = {200,200}, % \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} % \textquoteleft = {300,400}, \textquoteright = {300,400}, % \textquoteleft = {400,600}, \textquoteright = {400,600}, % \textquoteleft = {500,700}, \textquoteright = {500,600}, % \textquoteleft = {300,500}, \textquoteright = {400,400}, % \textquoteleft = {500,700}, \textquoteright = {500,700}, % \textquoteleft = {500,500}, \textquoteright = {300,500}, % \textquoteleft = {300,600}, \textquoteright = {300,600}, % \textquotedblleft = {300,300}, \textquotedblright = {300,300} % \textquotedblright = {300,400} % \textquotedblleft = {500,300}, \textquotedblright = {200,600} % \textquotedblleft = {300,400}, \textquotedblright = {300,400} % \textquotedblleft = {400,400}, \textquotedblright = {400,400} } % \end{macrocode} % Greek uppercase letters are in encoding only. %\changes{v1.9}{2005/07/10}{fix: remove uppercase Greek letters from encoded } % \begin{macrocode} %<*m-t|cmr|ebg|pmn> \SetProtrusion % [ name = OT1-default, % [ name = cmr-OT1, % [ name = EBGaramond-OT1, % [ name = pmnj-OT1, % load = default ] % load = cmr-default ] % load = EBGaramond-default ] % load = pmnj-default ] % { encoding = OT1 } % { encoding = {OT1,OT4}, % { encoding = OT1, % family = cmr } % family = pmnj } % { } { % \AE = {50, }, % \OE = {50, } %<*cmr|ebg> "00 = { ,150}, % \Gamma "01 = {100,100}, % \Delta "02 = { 50, 50}, % \Theta "03 = {100,100}, % \Lambda % "04 = { 50, 50}, % \Xi % "06 = { 50, 50}, % \Sigma "07 = {100,100}, % \Upsilon "08 = { 50, 50}, % \Phi "09 = { 50, 50}, % \Psi % "0A = { 50, 50}, % \Omega % 138 = { , 50}, % \L % \end{macrocode} % Remaining slots can be found in the source file. %\iffalse ^^A ... namely, here: % "05 = { , }, % \Pi %\fi % \begin{macrocode} % } % \end{macrocode} % Settings for figure variants. %\changes{v3.0}{2021/06/10}{settings for 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}, } % % % \end{macrocode} % and encodings contain some more characters. The default list % will be loaded first. %\changes{v1.9a}{2005/11/07}{fix: remove `\texttt{\_}' from encoding} % For \xetex\ () and \luatex\ () we simply use the list as % default (for now). %\changes{v2.5}{2010/11/05}{add default lists for and } ^^A (beta:03) %\changes{v2.6}{2016/04/22}{add encoding to lists} % \begin{macrocode} \SetProtrusion % [ name = T1-default, % [ name = bch-T1, % [ name = blg-T1, % [ name = cmr-T1, % [ name = EBGaramond-T1, % [ name = pmnj-T1, % [ name = ppl-T1, % [ name = ptm-T1, % [ name = ugm-T1, % load = default ] % load = bch-default ] % load = blg-default ] % load = cmr-default ] % load = EBGaramond-default ] % load = pmnj-default ] % load = ppl-default ] % load = ptm-default ] % load = ugm-default ] % { encoding = {T1,LY1,EU1,EU2,TU} } % { encoding = {T1,LY1}, % { encoding = {T1}, % { encoding = {LY1}, % family = bch } % family = blg } % family = cmr } % family = {EBGaramond-LF,EBGaramond-TLF,EBGaramond-OsF,EBGaramond-TOsF} } % family = pmnj } % family = {ppl,pplx,pplj} } % family = {ptm,ptmx,ptmj} } % family = ugm } { % \AE = {50, }, % \OE = {50, }, % \TH = { ,50}, % \v L = { ,250}, % \v d = { ,250}, % \v l = { ,250}, % \v t = { ,250}, % 127 = {300,400}, % 156 = {100, }, % IJ % 188 = { 80, 80}, % ij % _ = {100,100}, % _ = {200,200}, % _ = {100,200}, % \textbackslash = {100,200}, % \textbackslash = {150,200}, % \textbackslash = {250,300}, % \textbackslash = {200,300}, % \textbackslash = {100,300}, % \textbar = {200,200}, % \textendash = {300,300}, \textemdash = {150,150}, % \textquotedbl = {300,400}, \textquotedblleft = {300,400}, % \textquotedbl = {300,300}, \textquotedblleft = {200,600}, % \end{macrocode} %\changes{v1.4}{2004/10/30}{tweak quote characters for \texttt{cmr} % variants (, , \texttt{lmr})} % The fonts do something weird: they insert an implicit kern between quote % and boundary character. Therefore, we must override the settings from . % \begin{macrocode} % \quotesinglbase = {400,400}, \quotedblbase = {400,400}, % \quotesinglbase = {400,400}, \quotedblbase = {300,400}, % \quotesinglbase = {400,400}, \quotedblbase = {300,300}, % \guilsinglleft = {400,300}, \guilsinglright = {300,400}, % \guilsinglleft = {300,500}, \guilsinglright = {300,500}, % \guilsinglleft = {400,400}, \guilsinglright = {300,500}, % \guilsinglleft = {400,400}, \guilsinglright = {300,600}, % \guillemotleft = {200,200}, \guillemotright = {200,200}, % \guillemotleft = {300,200}, \guillemotright = {100,400}, % \guillemotleft = {200,200}, \guillemotright = {150,300}, % \guillemotleft = {300,300}, \guillemotright = {200,400}, % \guillemotleft = {300,300}, \guillemotright = {200,300}, % \guillemotleft = {300,400}, \guillemotright = {300,400}, % \textexclamdown = {100, }, \textquestiondown = {100, }, % \textexclamdown = {200, }, \textquestiondown = {100, }, % \textexclamdown = {200, }, \textquestiondown = {200, }, % \textbraceleft = {400,200}, \textbraceright = {200,400}, % \textbraceleft = {200, }, \textbraceright = { ,300}, % \textless = {200,100}, \textgreater = {100,200} % \textless = {100, }, \textgreater = { ,100}, % \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 % fonts. Now, they require even other settings, though. %\changes{v2.3a}{2008/02/19}{adjust quotation marks again} % \begin{macrocode} %<*cmr> \SetProtrusion [ name = lmr-T1, load = cmr-T1 ] { encoding = {T1,LY1}, family = lmr } { \textquotedblleft = {300,400}, \textquotedblright = {300,400} } % %<*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}, } % % \end{macrocode} % Settings for the encoding (generic, Computer Modern Roman, and Minion).\footnote{Contributed by % \contributor Karl Karlsson .} %\changes{v2.3e}{2009/10/28}{settings for encoding (contributed by % \contributor Karl Karlsson )} % ^^A private mail, 2009/10/21 %\changes{v2.4}{2009/11/15}{settings for encoded Minion (contributed by % \contributor Karl Karlsson )} % ^^A private mail, 2009/11/14 % \begin{macrocode} %<*m-t|cmr|pmn> \SetProtrusion % [ name = T2A-default, % [ name = cmr-T2A, % [ name = pmnj-T2A, % load = default ] % load = cmr-default ] % load = pmnj-default ] { encoding = T2A, % } % family = cmr } % family = pmnj } { \CYRA = {50,50}, \CYRG = { ,50}, \CYRK = { ,50}, \CYRT = {50,50}, \CYRH = {50,50}, \CYRU = {50,50}, % \CYRS = {50, }, % \CYRO = {50,50}, \cyrk = { ,50}, \cyrg = { ,50}, \cyrh = {50,50}, % \cyru = {50,50}, % \cyru = {50,70}, % _ = {100,100}, % _ = {200,200}, % \textbackslash = {100,200}, \quotedblbase = {400,400}, % \textbackslash = {200,300}, \quotedblbase = {400,400}, % \textbackslash = {100,200}, \quotedblbase = {300,300}, % \textquotedbl = {300,300}, \textquotedblleft = {200,600}, % \guillemotleft = {200,200}, \guillemotright = {200,200}, % \guillemotleft = {300,200}, \guillemotright = {100,400}, % \guillemotleft = {200,200}, \guillemotright = {150,300}, % \textbraceleft = {400,200}, \textbraceright = {200,400}, % \textbraceleft = {200, }, \textbraceright = { ,300}, % \textless = {200,100}, \textgreater = {100,200} % \textless = {100, }, \textgreater = { ,100} } % % \end{macrocode} % Settings for the encoding (generic and Times).\footnote{Contributed by % \contributor Maciej Eder .} %\changes{v1.9d}{2006/04/20}{settings for encoding (contributed by % \contributor Maciej Eder )} % ^^A private mail, 2006/04/19 % It also includes some glyphs otherwise in . % \begin{macrocode} %<*m-t|ptm> \SetProtrusion % [ name = QX-default, % [ name = ptm-QX, % load = default ] % load = ptm-default ] % { encoding = QX } % { encoding = QX, % family = {ptm,ptmx,ptmj} } { \AE = {50, }, % * = {200,200}, {=} = {100,100}, \textunderscore = {100,100}, \textbackslash = {100,200}, \quotedblbase = {400,400}, % \guillemotleft = {200,200}, \guillemotright = {200,200}, % \guillemotleft = {300,300}, \guillemotright = {200,400}, \textexclamdown = {100, }, \textquestiondown = {100, }, % \textbraceleft = {400,200}, \textbraceright = {200,400}, % \textbraceleft = {200,200}, \textbraceright = {200,300}, \textless = {200,100}, \textgreater = {100,200}, \textminus = {200,200}, \textdegree = {300,300}, % \copyright = {100,100}, \textregistered = {100,100} % \copyright = {100,150}, \textregistered = {100,150}, % \textxgeq = { ,100}, \textxleq = {100, }, % \textalpha = { , 50}, \textDelta = { 70, 70}, % \textpi = { 50, 80}, \textSigma = { , 70}, % \textmu = { , 80}, \texteuro = { 50, 50}, % \textellipsis = {150,200}, \textasciitilde = { 80, 80}, % \textapprox = { 50, 50}, \textinfty = {100,100}, % \textdagger = {150,150}, \textdaggerdbl = {100,100}, % \textdiv = { 50,150}, \textsection = { 80, 80}, % \texttimes = {100,150}, \textpm = { 50, 80}, % \textbullet = {150,150}, \textperiodcentered = {300,300}, % \textquotesingle = {500,500}, \textquotedbl = {300,300}, % \textperthousand = { ,50} } % % \end{macrocode} % is based on ; it shares some but not all extra characters of . % All accented characters are already taken care of by the inheritance list. % \begin{macrocode} %<*cmr|bch> \SetProtrusion % [ name = cmr-T5, % load = cmr-default ] % [ name = bch-T5, % load = bch-default ] { encoding = T5, % family = cmr } % family = bch } { % _ = {100,100}, % \textbackslash = {150,200}, % \textbackslash = {200,300}, % \textquotedblleft = {200,600}, % \textquotedbl = {300,300}, % \quotesinglbase = {400,400}, \quotedblbase = {300,300}, % \quotesinglbase = {400,400}, \quotedblbase = {400,400}, % \guilsinglleft = {400,300}, \guilsinglright = {300,400}, % \guilsinglleft = {400,400}, \guilsinglright = {300,500}, % \guillemotleft = {200,200}, \guillemotright = {150,300}, % \guillemotleft = {300,200}, \guillemotright = {100,400}, % \textbraceleft = {200, }, \textbraceright = { ,300}, % \textbraceleft = {400,200}, \textbraceright = {200,400}, \textless = {200,100}, \textgreater = {100,200} } % % \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} } % % \end{macrocode} % Times is the default font for , therefore we provide settings for the % additional characters in this encoding, too. %\changes{v1.8}{2005/04/26}{add 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} } % % \end{macrocode} %\changes{v3.0}{2021/06/25}{ settings for Garamond} % For the Greek 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}, } % % \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 .} %\changes{v2.5}{2011/04/09}{improvements to Computer Modern Roman italics % (contributed by \contributor Hendrik Vogt )} % ^^A private mail, 2011/02/24 % ^^A (beta:07) % % \begin{macrocode} \SetProtrusion % [ name = OT1-it ] % [ name = bch-it ] % [ name = blg-it, % load = blg-default ] % [ name = cmr-it ] % [ name = EBGaramond-it ] % [ name = pmnj-it ] % [ name = ppl-it ] % [ name = ptm-it ] % [ name = ugm-it ] % { encoding = OT1, % { encoding = {OT1,OT4}, % family = bch, % family = blg, % family = {ppl,pplx,pplj}, % family = {ptm,ptmx,ptmj}, % family = ugm, % shape = {it,sl} } % shape = it } % { } { % A = {100,100}, % A = {100,50}, % A = {50, }, % A = { ,150}, % A = {50,50}, % \AE = {100, }, % \AE = {50, }, % B = {83,-40}, % B = {50, }, % B = {20,-50}, % C = {50, }, % C = {165,-75}, % C = {100, }, % C = {50,-50}, % D = {75, -28}, % D = {50,50}, % D = {20, }, % E = {80,-55}, % E = {50, }, % E = {20,-50}, % F = {85,-80}, % F = {100, }, % F = {10, }, % F = {50, }, % G = {50, }, % G = {153,-15}, % G = {100, }, % G = {50,-50}, % H = {73,-60}, % H = {50, }, % I = {140,-120}, % I = {50, }, % I = {20,-50}, % J = {135,-80}, % J = {50, }, % J = {20, }, % J = {100, }, % K = {70,-30}, % K = {50, }, % K = {20, }, % L = {87, 40}, % L = {50, }, % L = {20,50}, % L = { ,100}, % M = {67,-45}, % M = { ,-30}, % M = {50, }, % N = {75,-55}, % N = { ,-30}, % N = {50, }, % O = {50, }, % O = {150,-30}, % O = {100, }, % O = {70,50}, % \OE = {50, }, % \OE = {100, }, % P = {82,-50}, % P = {50, }, % P = {20,-50}, % Q = {50, }, % Q = {150,-30}, % Q = {100, }, % Q = {70,50}, % R = {75, 15}, % R = {50, }, % R = {20, }, % S = {50, }, % S = {90,-65}, % S = {20,-30}, % $ = {50, }, % $ = {100,-20}, % $ = {20,-30}, % T = {70, }, % T = {220,-85}, % T = {100, }, % U = {230,-55}, % U = {50, }, % U = {50,-50}, % V = {260,-60}, % V = {100, }, % V = {100,50}, % W = {185,-55}, % W = {100, }, % W = {50, }, % W = {100,50}, % X = {70,-30}, % X = {50, }, % Y = {250,-60}, % Y = {50, }, % Y = {100,50}, % Y = {100, }, % Z = {90,-60}, % Z = { ,-50}, % a = {150,-10}, % b = {170, }, % c = {173,-10}, % d = {150,-55}, % d = { ,-50}, % e = {180, }, % f = { ,-250}, % f = { ,-100}, % g = {150,-10}, % h = {100, }, % i = {210, }, % i = { ,-30}, % j = { ,-40}, % j = { ,-30}, % k = {110,-50}, % l = {240,-110}, % l = { ,-100}, % m = {80, }, % n = {115, }, % o = {50,50}, % o = {155, }, % p = { ,50}, % p = {-50, }, % q = {50, }, % q = {170,-40}, % r = {155,-40}, % r = { ,50}, % s = {130, }, % t = { ,50}, % t = {230,-10}, % u = {120, }, % v = {140,-25}, % v = {50, }, % w = { ,50}, % w = {98,-20}, % w = {50, }, % x = {65,-40}, % y = { ,50}, % y = {130,-20}, % z = {110,-80}, % 0 = {170,-85}, % 1 = {150,100}, % 1 = {230,110}, % 1 = {150, }, % 1 = {50, }, % 1 = {100, }, % 1 = {150,150}, % 2 = {130,-70}, % 2 = {50, }, % 2 = {-50, }, % 3 = {50, }, % 3 = {140,-70}, % 3 = {-100, }, % 3 = {100,50}, % 4 = {100, }, % 4 = {130,80}, % 4 = {150, }, % 4 = {50, }, % 5 = {160, }, % 5 = {50, }, % 6 = {50, }, % 6 = {175,-30}, % 7 = {100, }, % 7 = {250,-150}, % 7 = {20, }, % 7 = {50, }, % 8 = {130,-40}, % 9 = {155,-80}, % . = { ,500}, % . = {400,600}, % . = { ,700}, % {,}= {300,500}, % {,}= { ,500}, % {,}= { ,450}, % {,}= { ,600}, % {,}= { ,700}, % : = { ,300}, % : = { ,400}, % : = { ,200}, % : = { ,500}, % ; = { ,300}, % ; = { ,400}, % ; = { ,200}, % ; = { ,500}, % ! = { ,100}, % ? = { ,200}, % ? = { ,100}, % ? = { ,300}, % " = {400,200}, % & = {50,50}, % & = { ,80}, % & = {130,30}, % & = {50,100}, % \% = {100, }, % \% = {180,50}, % \% = {50,50}, % \% = {100,100}, % \% = {100,50}, % * = {200,200}, % * = {300,200}, % * = {380,20}, % * = {500,100}, % * = {400,200}, % + = {150,200}, % + = {180,200}, % + = {250,250}, % + = {250,200}, % @ = {50,50}, % @ = {80,50}, % @ = {180,10}, % @ = {150,150}, % ~ = {150,150}, % ~ = {200,150}, % {=}= {200,200}, % ( = {200, }, ) = { ,200}, % ( = {300, }, ) = { ,70}, % / = {100,200}, % / = {100,100}, % / = { ,150}, % / = {100,150}, % - = {300,300}, % - = {300,400}, % - = {200,300}, % - = {500,300}, % - = {300,500}, % - = {500,500}, % - = {400,700}, % _ = {0,300}, % \textendash = {200,200}, \textemdash = {150,150}, % \textendash = {200,300}, \textemdash = {150,200}, % \textendash = {500,300}, \textemdash = {400,170}, % \textendash = {300,300}, \textemdash = {200,200}, % \textquoteleft = {400,200}, \textquoteright = {400,200}, % \textquoteleft = {400,400}, \textquoteright = {400,400}, % \textquoteleft = {800,200}, \textquoteright = {800,-20}, % \textquoteleft = {800,200}, \textquoteright = {800,200}, % \textquoteleft = {700,400}, \textquoteright = {700,400}, % \textquoteleft = {800,500}, \textquoteright = {800,500}, % \textquotedblleft = {400,200}, \textquotedblright = {400,200} % \textquotedblright = {300,300} % \textquotedblleft = {540,100}, \textquotedblright = {500,100} % \textquotedblleft = {700,200}, \textquotedblright = {700,200} % \textquotedblleft = {500,300}, \textquotedblright = {500,300} % \textquotedblleft = {700,400}, \textquotedblright = {700,400} % \textquotedblleft = {600,200}, \textquotedblright = {600,200} } %<*cmr|ebg|pmn> \SetProtrusion % [ name = cmr-it-OT1, % [ name = EBGaramond-it-OT1, % [ name = pmnj-it-OT1, % load = cmr-it ] % load = EBGaramond-it ] % load = pmnj-it ] % { encoding = {OT1,OT4}, % { encoding = OT1, % family = cmr, % family = pmnj, % shape = it } % shape = {it,sl} } % { } { % \AE = {100, }, % \AE = { ,-50}, % \OE = {100, }, % \OE = {50, } %<*cmr|ebg> % "00 = {200,150}, % \Gamma % "00 = { ,150}, % \Gamma % "01 = {150,100}, % \Delta % "01 = {100,100}, % \Delta % "02 = {150, 50}, % \Theta % "02 = { 50, 50}, % \Theta % "03 = {150, 50}, % \Lambda % "03 = {100,100}, % \Lambda % "04 = {100,100}, % \Xi % "04 = { 50, 50}, % \Xi % "05 = {100,100}, % \Pi % "06 = {100, 50}, % \Sigma % "07 = {200,150}, % \Upsilon % "07 = {100,100}, % \Upsilon % "08 = {150, 50}, % \Phi % "08 = { 50, 50}, % \Phi % "09 = {150,100}, % \Psi % "09 = { 50, 50}, % \Psi "0A = { 50, 50}, % \Omega % 138 = { , 50}, % \L % } % %<*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}, } % \SetProtrusion % [ name = T1-it-default, % [ name = bch-it-T1, % [ name = blg-it-T1, % [ name = cmr-it-T1, % [ name = EBGaramond-it-T1, % [ name = pmnj-it-T1, % [ name = ppl-it-T1, % [ name = ptm-it-T1, % [ name = ugm-it-T1, % load = OT1-it ] % load = bch-it ] % load = blg-T1 ] % load = cmr-it ] % load = pmnj-it ] % load = EBGaramond-it ] % load = ppl-it ] % load = ptm-it ] % load = ugm-it ] % { encoding = {T1,LY1}, % { encoding = {LY1}, % { encoding = T1, % family = bch, % family = blg, % family = cmr, % family = pmnj, % family = {EBGaramond-LF,EBGaramond-TLF,EBGaramond-OsF,EBGaramond-TOsF}, % family = {ppl,pplx,pplj}, % family = {ptm,ptmx,ptmj}, % family = ugm, % shape = {it,sl} } % shape = it } { % _ = { ,100}, % _ = {0,300}, % _ = {100,200}, % _ = {100,100}, % . = {400,600}, % {,}= {300,500}, % \AE = {100, }, % \AE = { ,-50}, % \OE = { 50, }, % \OE = {100, }, % 031 = { ,-100}, % ffl % 156 = {100, }, % IJ % 156 = {50, }, % IJ % 156 = {20, }, % IJ % 188 = { ,-30}, % ij % \v t = { ,100}, % \textbackslash = {100,200}, % \textbackslash = {300,300}, % \textbackslash = {150,150}, % \textbackslash = {100,150}, % \textbar = {200,200}, % \textquotedblleft = {500,300}, % \textquoteleft = {400,400}, \textquoteright = {400,400}, % \textquotedbl = {300,300}, \textquotedblleft = {300,300}, % \textquotedblright = {300,300}, \quotedblbase = {200,600}, % \quotesinglbase = {300,700}, \quotedblbase = {400,500}, % \quotesinglbase = {300,700}, \quotedblbase = {200,600}, % \quotesinglbase = {200,500}, \quotedblbase = {150,500}, % \quotesinglbase = {500,500}, \quotedblbase = {400,400}, % \quotesinglbase = {300,700}, \quotedblbase = {300,500}, % \guilsinglleft = {400,400}, \guilsinglright = {300,500}, % \guilsinglleft = {300,400}, \guilsinglright = {200,500}, % \guilsinglleft = {500,300}, \guilsinglright = {400,400}, % \guilsinglleft = {500,400}, \guilsinglright = {300,500}, % \guilsinglleft = {400,400}, \guilsinglright = {300,600}, % \guillemotleft = {300,300}, \guillemotright = {300,300}, % \guillemotleft = {200,300}, \guillemotright = {150,400}, % \guillemotleft = {400,100}, \guillemotright = {200,300}, % \guillemotleft = {300,300}, \guillemotright = {200,400}, % \guillemotleft = {300,400}, \guillemotright = {200,400}, % \guillemotleft = {300,400}, \guillemotright = {300,400}, % \textexclamdown = {100, }, \textquestiondown = {200, }, % \textexclamdown = {200, }, \textquestiondown = {200, }, % \textexclamdown = {-50, }, \textquestiondown = {-50, }, % \textbraceleft = {200,100}, \textbraceright = {200,200}, % \textbraceleft = {200, }, \textbraceright = { ,200}, % \textbraceleft = {400,100}, \textbraceright = {200,200}, % \textless = {100, }, \textgreater = { ,100}, % \textless = {300,100}, \textgreater = {200,100} % \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}, } % %<*m-t|cmr|pmn> \SetProtrusion % [ name = T2A-it-default, % [ name = cmr-it-T2A, % [ name = pmnj-it-T2A, % load = OT1-it ] % load = cmr-it ] % load = pmnj-it ] { encoding = T2A, % family = cmr, % family = pmnj, % shape = {it,sl} } % shape = it } { % \CYRA = {100,50}, % \CYRA = {50, }, % \CYRB = {50, }, % \CYRV = {50, }, % \CYRV = {20,-50}, % \CYRG = {100, }, % \CYRG = {10, }, % \CYRD = {50, }, % \CYRE = {50, }, % \CYRE = {20,-50}, % \CYRZH = {50, }, % \CYRZ = {50, }, % \CYRZ = {20,-50}, % \CYRI = {50, }, % \CYRI = { ,-30}, % \CYRISHRT = {50, }, % \CYRK = {50, }, % \CYRK = {20, }, % \CYRL = {50, }, % \CYRM = {50, }, % \CYRM = { ,-30}, % \CYRN = {50, }, % \CYRO = {100, }, % \CYRO = {50, }, % \CYRP = {50, }, % \CYRR = {50, }, % \CYRR = {20,-50}, % \CYRS = {100, }, % \CYRS = {50, }, % \CYRT = {100, }, % \CYRT = {70, }, % \CYRU = {100, }, % \CYRU = {50, }, % \CYRF = {100, }, % \CYRH = {50, }, % \CYRC = {50, }, % \CYRCH = {100, }, % \CYRSH = {50, }, % \CYRSHCH = {50, }, % \CYRHRDSN = {100, }, % \CYRERY = {50, }, % \CYRSFTSN = {50, }, % \CYREREV = {50, }, % \CYRYU = {50, }, % \CYRYA = {50, }, % \CYRYA = { ,20}, % \cyrr = {-50, }, % _ = { ,100}, % _ = {100,200}, % 031 = { ,-100}, % ffl % \v t = { ,100}, % \textbackslash = {100,200}, \quotedblbase = {400,500}, % \textbackslash = {300,300}, \quotedblbase = {200,600}, % \textbackslash = {100,150}, \quotedblbase = {150,500}, % \guillemotleft = {300,300}, \guillemotright = {300,300}, % \guillemotleft = {400,100}, \guillemotright = {200,300}, % \guillemotleft = {200,300}, \guillemotright = {150,400}, % \textbraceleft = {200,100}, \textbraceright = {200,200}, % \textbraceleft = {400,100}, \textbraceright = {200,200}, % \textbraceleft = {200, }, \textbraceright = { ,200}, % \textquotedblleft = {500,300}, % \textless = {300,100}, \textgreater = {200,100} % \textless = {100, }, \textgreater = { ,100} } % %<*m-t|ptm> \SetProtrusion % [ name = QX-it-default, % [ name = ptm-it-QX, % load = OT1-it ] % load = ptm-it ] { encoding = {QX}, % family = {ptm,ptmx,ptmj}, shape = {it,sl} } { % 009 = { , 50}, % fk {=} = {100,100}, % \textunderscore = {100,100}, % \textunderscore = {100,150}, \textbackslash = {100,200}, \quotedblbase = {300,400}, % \guillemotleft = {300,300}, \guillemotright = {300,300}, % \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}, % \copyright = {100,100}, \textregistered = {100,100} % \textregistered = {100,150}, \copyright = {100,150}, % \textDelta = { 70, }, \textdelta = { , 50}, % \textpi = { 50, 80}, \textmu = { , 80}, % \texteuro = {200, }, \textellipsis = {100,200}, % \textquoteleft = {500,400}, \textquoteright = {500,400}, % \textquotedblleft = {500,300}, \textquotedblright = {400,400}, % \textapprox = { 50, 50}, \textinfty = {100,100}, % \textdagger = {150,150}, \textdaggerdbl = {100,100}, % \textdiv = {150,150}, \textasciitilde = { 80, 80}, % \texttimes = {100,150}, \textpm = { 50, 80}, % \textbullet = {300,100}, \textperiodcentered = {300,300}, % \textquotesingle = {500,500}, \textquotedbl = {300,300}, % \textperthousand = { ,50} } % %<*cmr|bch> \SetProtrusion % [ name = cmr-it-T5, % load = cmr-it ] % [ name = bch-it-T5, % load = bch-it ] { encoding = T5, % family = bch, % family = cmr, shape = it } { % _ = { ,100}, % _ = {100,200}, % \textbackslash = {150,150}, % \textbackslash = {300,300}, % \quotesinglbase = {200,500}, \quotedblbase = {150,500}, % \quotesinglbase = {300,700}, \quotedblbase = {200,600}, % \guilsinglleft = {300,400}, \guilsinglright = {200,500}, % \guilsinglleft = {500,300}, \guilsinglright = {400,400}, % \guillemotleft = {200,300}, \guillemotright = {150,400}, % \guillemotleft = {400,100}, \guillemotright = {200,300}, % \textbraceleft = {200, }, \textbraceright = { ,200}, % \textbraceleft = {400,100}, \textbraceright = {200,200}, % \textless = {100, }, \textgreater = { ,100} % \textless = {300,100}, \textgreater = {200,100} } % % \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} } % %<*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} } % %<*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} } % % \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 % [ name = OT1-sc, % [ name = bch-sc, % [ name = cmr-sc-OT1, % [ name = EBGaramond-sc-OT1-Prop, % [ name = pmnj-sc, % [ name = ppl-sc, % [ name = ptm-sc, % load = default ] % load = bch-default ] % load = cmr-OT1 ] % load = EBGaramond-OT1-LF ] % load = pmnj-default ] % load = ppl-default ] % load = ptm-default ] % { encoding = OT1, % { encoding = {OT1,OT4}, % family = bch, % family = cmr, % family = {EBGaramond-LF,EBGaramond-OsF}, % family = pmnj, % family = {ppl,pplx,pplj}, % family = {ptm,ptmx,ptmj}, shape = sc } { a = {50,50}, % \ae = {50, }, % c = {50, }, % d = { ,50}, % f = { ,50}, % g = {50, }, % j = {50, }, % j = {100, }, % l = { ,50}, % l = { ,80}, % 013 = { ,50}, % fl % 013 = { ,80}, % fl % o = {50,50}, % \oe = {50, }, % p = { 0, 0}, % q = {50,70}, % q = { 0, }, % r = { , 0}, t = {50,50}, % y = {50,50} % 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} } % \SetProtrusion % [ name = T1-sc, % [ name = bch-sc-T1, % [ name = cmr-sc-T1, % [ name = EBGaramond-sc-T1, % [ name = pmnj-sc-T1, % [ name = ppl-sc-T1, % [ name = ptm-sc-T1, % load = T1-default ] % load = bch-T1 ] % load = cmr-T1 ] % load = EBGaramond-T1 ] % load = pmnj-T1 ] % load = ppl-T1 ] % load = ptm-T1 ] % { encoding = {T1,LY1}, % { encoding = {LY1}, % family = bch, % family = cmr, % family = {EBGaramond-LF,EBGaramond-TLF,EBGaramond-OsF,EBGaramond-TOsF}, % family = pmnj, % family = {ppl,pplx,pplj}, % family = {ptm,ptmx,ptmj}, shape = sc } { a = {50,50}, % \ae = {50, }, % c = {50, }, % d = { ,50}, % f = { ,50}, % g = {50, }, % j = {50, }, % j = {100, }, % l = { ,50}, % l = { ,80}, % 029 = { ,50}, % fl % 029 = { ,80}, % fl % o = {50,50}, % \oe = {50, }, % p = { 0, 0}, % q = {50,70}, % q = { 0, }, % r = { , 0}, t = {50,50}, % y = {50,50} % y = {80,80} } % %<*m-t|cmr> \SetProtrusion % [ name = T2A-sc, % [ name = cmr-sc-T2A, % load = T2A-default ] % load = cmr-T2A ] { encoding = T2A, % family = cmr, shape = sc } { \cyra = {50,50}, \cyrg = { ,50}, \cyrt = {50,50}, \cyry = { ,50} } % %<*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} } % %<*cmr|bch> \SetProtrusion % [ name = bch-sc-T5, % load = bch-T5 ] % [ name = cmr-sc-T5, % load = cmr-T5 ] { encoding = T5, % family = bch, % family = cmr, shape = sc } { a = {50,50}, % c = {50, }, % d = { ,50}, f = { ,50}, % g = {50, }, % j = {100, }, % j = {50, }, l = { ,50}, % o = {50,50}, % q = { 0, }, % r = { , 0}, t = {50,50}, y = {50,50} } % %<*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} } % %<*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} } % %<*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 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} } % % \end{macrocode} % %\subsubsection{Text companion} % % Finally the 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 encoding} % \begin{macrocode} \SetProtrusion % [ name = textcomp ] % [ name = bch-textcomp ] % [ name = blg-textcomp ] % [ name = cmr-textcomp ] % [ name = EBGaramond-textcomp ] % [ name = pmn-textcomp ] % [ name = ppl-textcomp ] % [ name = ptm-textcomp ] % [ name = ugm-textcomp ] % { encoding = TS1 } % { encoding = TS1, % family = bch } % family = blg } % family = cmr } % family = {EBGaramond-LF,EBGaramond-TLF,EBGaramond-OsF,EBGaramond-TOsF} } % family = {pmnx,pmnj} } % family = {ppl,pplx,pplj} } % family = {ptm,ptmx,ptmj} } % family = ugm } { % \textquotestraightbase = {400,500}, % \textquotestraightbase = {300,300}, % \textquotestraightbase = {400,400}, % \textquotestraightdblbase = {300,400}, % \textquotestraightdblbase = {300,300}, % \textquotestraightdblbase = {400,400}, % \texttwelveudash = {200,200}, % \textthreequartersemdash = {150,150}, % \textthreequartersemdash = {200,200}, % \textquotesingle = {500,600}, % \textquotesingle = {300,400}, % \textquotesingle = {400,500}, % \textquotesingle = {500,500}, % \textquotesingle = {300,500}, % \textasteriskcentered = {200,300}, % \textasteriskcentered = {150,200}, % \textasteriskcentered = {300,300}, % \textasteriskcentered = {100,200}, % \textfractionsolidus = {-200,-200}, % \textoneoldstyle = {100,100}, % \textoneoldstyle = { , 50}, % \textthreeoldstyle = { , 50}, % \textthreeoldstyle = { 50, }, % \textfouroldstyle = { 50, 50}, % \textfouroldstyle = { 50, }, % \textsevenoldstyle = { 50, 80}, % \textlangle = {400, }, % \textrangle = { ,400}, % \textminus = {200,200}, % \textminus = {300,300}, % \textminus = {250,300}, % \textlbrackdbl = {100, }, % \textlbrackdbl = {200, }, % \textrbrackdbl = { ,100}, % \textrbrackdbl = { ,200}, % \textasciigrave = {200,500}, % \texttildelow = {200,250}, % \textasciibreve = {300,400}, % \textasciicaron = {300,400}, % \textacutedbl = {200,300}, % \textgravedbl = {150,300}, % \textdagger = { 80, 80}, % \textdagger = {200,200}, % \textdagger = {100,100}, % \textdagger = {150,150}, % \textdaggerdbl = {150,150}, % \textdaggerdbl = { 80, 80}, % \textdaggerdbl = {100,100}, % \textbardbl = {100,100}, % \textbardbl = {150,150}, % \textbullet = {200,200}, % \textbullet = {400,500}, % \textbullet = { ,100}, % \textbullet = {150,150}, % \textbullet = { 50,100}, % \textcelsius = { 50, }, % \textcelsius = { 80, }, % \textflorin = { 50, 50}, % \textflorin = {100,100}, % \textflorin = { ,100}, % \textflorin = { 50,100}, % \textflorin = { 50, 70}, % \textcolonmonetary = { , 50}, % \textcolonmonetary = { 50, }, % \textinterrobang = { ,100}, % \textinterrobangdown = {100, }, % \texttrademark = {100,100}, % \texttrademark = {150,150}, % \texttrademark = {200,200}, % \texttrademark = { 50, 50}, % \texttrademark = {100,150}, % \textcent = { 50, }, % \textcent = {100,100}, % \textsterling = { 50, }, % \textsterling = { , 50}, % \textbrokenbar = {200,200}, % \textbrokenbar = {250,250}, % \textbrokenbar = {200,300}, % \textasciidieresis = {300,400}, % \textcopyright = {100,100}, % \textcopyright = {100,150}, % \textcopyright = {200,200}, % \textordfeminine = {100,200}, % \textordfeminine = {200,200}, % \textlnot = {200, }, % \textlnot = {200,100}, % \textregistered = {100,100}, % \textregistered = { 50,150}, % \textregistered = {200,200}, % \textasciimacron = {150,200}, % \textdegree = {300,300}, % \textdegree = {150,200}, % \textdegree = {200,200}, % \textdegree = {400,400}, % \textdegree = {150,400}, % \textpm = {150,200}, % \textpm = {100,100}, % \textpm = { 50, 80}, % \texttwosuperior = {100,200}, % \texttwosuperior = { 50,100}, % \texttwosuperior = {200,200}, % \texttwosuperior = { 50, 50}, % \textthreesuperior = {100,200}, % \textthreesuperior = { 50,100}, % \textthreesuperior = {200,200}, % \textthreesuperior = { 50, 50}, % \textasciiacute = {300,400}, % \textmu = { ,100}, % \textparagraph = { ,100}, % \textperiodcentered = {300,400}, % \textperiodcentered = {400,500}, % \textperiodcentered = {300,300}, % \textperiodcentered = {200,500}, % \textonesuperior = {200,300}, % \textonesuperior = {200,200}, % \textonesuperior = {100,100}, % \textordmasculine = {200,200}, % \textordmasculine = {100,200}, % \texteuro = {100, }, % \texteuro = { 50,100}, % \texttimes = {200,200}, % \texttimes = {100,100}, % \texttimes = {150,250}, % \texttimes = {100,150}, % \texttimes = { 70,100}, % \texttimes = {200,300}, % \textdiv = {150,200} % \textdiv = {100,100} % \textdiv = {150,250} % \textdiv = { 50,100}, % \textdiv = {200,300}, % \textperthousand = { ,50} % \textsection = { ,100}, % \textonehalf = { 50,100}, % \textonequarter = { 50,100}, % \textthreequarters = { 50,100}, % \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 % [ name = cmr-textcomp-it ] % [ name = EBGaramond-textcomp-it ] % [ name = pmn-textcomp-it ] % [ name = ugm-textcomp-it ] { encoding = TS1, % family = cmr, % family = {EBGaramond-LF,EBGaramond-TLF,EBGaramond-OsF,EBGaramond-TOsF}, % family = {pmnx,pmnj}, % family = ugm, % shape = {it,sl} } % shape = it } { % \textquotestraightbase = {300,600}, % \textquotestraightbase = {400,400}, % \textquotestraightdblbase = {300,600}, % \textquotestraightdblbase = {300,400}, % \textquotestraightdblbase = {300,300}, \texttwelveudash = {200,200}, % \textthreequartersemdash = {150,150}, % \textthreequartersemdash = {200,200}, % \textquotesingle = {600,300}, % \textquotesingle = {800,100}, % \textquotesingle = {300,200}, % \textquotesingle = {500,500}, % \textasteriskcentered = {300,200}, % \textasteriskcentered = {500,100}, % \textasteriskcentered = {200,300}, % \textasteriskcentered = {300,150}, % \textfractionsolidus = {-200,-200}, % \textoneoldstyle = {100, 50}, % \textoneoldstyle = {100, }, % \textoneoldstyle = { 50, }, % \texttwooldstyle = { 50, }, % \texttwooldstyle = {-50, }, % \textthreeoldstyle = {100, 50}, % \textthreeoldstyle = {-100, }, % \textfouroldstyle = { 50, 50}, % \textfouroldstyle = { 50,100}, % \textsevenoldstyle = { 50, 80}, % \textsevenoldstyle = { 50, }, % \textsevenoldstyle = { 20, }, % \textlangle = {400, }, % \textrangle = { ,400}, % \textminus = {300,300}, % \textminus = {200,200}, % \textminus = {250,300}, % \textlbrackdbl = {100, }, % \textrbrackdbl = { ,100}, % \textasciigrave = {300,300}, % \texttildelow = {200,250}, % \textasciibreve = {300,300}, % \textasciicaron = {300,300}, % \textacutedbl = {200,300}, % \textgravedbl = {150,300}, % \textdagger = {100,100}, % \textdagger = {200,100}, % \textdagger = { 80, 50}, % \textdagger = { 80, 80}, % \textdaggerdbl = { 80, 80}, % \textdaggerdbl = { 80, 50}, % \textbardbl = {150,150}, % \textbullet = {200,100}, % \textbullet = {300, }, % \textbullet = { 30, 70}, % \textbullet = { 50,100}, % \textcelsius = {100, }, % \textcelsius = {200, }, % \textcelsius = { 50,-50}, % \textflorin = {100, }, % \textflorin = { 50,100}, % \textflorin = { ,100}, % \textcolonmonetary = {150, }, % \textcolonmonetary = {100, }, % \textcolonmonetary = { 50,-50}, % \texttrademark = {200, }, % \texttrademark = { 50,100}, % \texttrademark = {150, 50}, % \textcent = { 50, }, % \textsterling = { , 50}, % \textbrokenbar = {200,300}, % \textasciidieresis = {300,200}, % \textcopyright = {100, }, % \textcopyright = {200,100}, % \textcopyright = {100,150}, % \textcopyright = {300, }, % \textordfeminine = {100,100}, % \textordfeminine = {200,200}, % \textordfeminine = {100,200}, % \textlnot = {300, }, % \textlnot = {200, }, % \textregistered = {100, }, % \textregistered = {200,100}, % \textregistered = { 50,150}, % \textregistered = {300, }, % \textasciimacron = {150,200}, % \textdegree = {500,100}, % \textdegree = {150,150}, % \textdegree = {300,200}, % \textpm = {150,100}, % \textpm = {200,150}, % \textpm = {150,200}, % \textonesuperior = {400, }, % \textonesuperior = {300,100}, % \textonesuperior = {200,100}, % \textonesuperior = {300,300}, % \texttwosuperior = {400, }, % \texttwosuperior = {300, }, % \texttwosuperior = {200,100}, % \texttwosuperior = {300,200}, % \textthreesuperior = {400, }, % \textthreesuperior = {300, }, % \textthreesuperior = {200,100}, % \textthreesuperior = {300,200}, % \textmu = { ,100}, % \textasciiacute = {300,200}, % \textparagraph = {200, }, % \textparagraph = { ,100}, % \textperiodcentered = {500,500}, % \textperiodcentered = {300,400}, % \textordmasculine = {100,100}, % \textordmasculine = {200,200}, % \textordmasculine = {300,200}, % \texteuro = {200, }, % \texteuro = {100, }, % \texteuro = {100,-50}, % \texttimes = {200,200}, % \texttimes = {200,100}, % \texttimes = { 70,100}, % \texttimes = {200,300}, % \textdiv = {200,200} % \textdiv = {150,200} % \textdiv = {200,300}, % \textsection = { ,200}, % \textonehalf = { 50,100}, % \textonequarter = { 50,100}, % \textthreequarters = { 50,100}, % \textsurd = { ,100} } % % \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 math letters ( 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} % % % \end{macrocode} % % \subsubsection{ symbols} % % Settings for the math fonts (\pkg{amssymb}). %\changes{v1.8}{2005/06/01}{settings for math fonts} %\changes{v1.9d}{2006/02/04}{tweak 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} } % % \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} } % % \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} } % % \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} } % % \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} } % % % \end{macrocode} %\subsubsection{Euro symbols} %\changes{v1.9d}{2006/05/04}{settings for Euro symbols (Adobe, , \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}), 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 )} % ^^A private mail, 2021/02/22 % \begin{macrocode} %<*cfg-e> \SetProtrusion % { encoding = U, % { encoding = {OT1,U}, % family = zpeu } % family = mvs } { % E = {50, } % 164 = {50,50}, % \EUR % 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, } } % % % \end{macrocode} % %\subsection{Interword spacing}\label{sub:conf-spacing} %\GeneralChanges{Spacing} % % Default unit is space. % % \begin{macrocode} %<*m-t|cmr> %%% ----------------------------------------------------------------------- %%% INTERWORD SPACING % %<*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 ^^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} } % % \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 ): % ^^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 .\footnote{Contributed by % \contributor Karl Karlsson .} %\changes{v2.3e}{2009/10/28}{settings for encoding (contributed by % \contributor Karl Karlsson )} % ^^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} } % % \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 ) 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, } } % % % \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} % % \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{13078} % % \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.pdf (ie., from the file 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: %