diff options
author | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
commit | e0c6872cf40896c7be36b11dcc744620f10adf1d (patch) | |
tree | 60335e10d2f4354b0674ec22d7b53f0f8abee672 /macros/latex/contrib/microtype |
Initial commit
Diffstat (limited to 'macros/latex/contrib/microtype')
-rw-r--r-- | macros/latex/contrib/microtype/README.md | 80 | ||||
-rw-r--r-- | macros/latex/contrib/microtype/microtype-utf.dtx | 1306 | ||||
-rw-r--r-- | macros/latex/contrib/microtype/microtype.dtx | 17082 | ||||
-rw-r--r-- | macros/latex/contrib/microtype/microtype.ins | 170 | ||||
-rw-r--r-- | macros/latex/contrib/microtype/microtype.pdf | bin | 0 -> 1674734 bytes |
5 files changed, 18638 insertions, 0 deletions
diff --git a/macros/latex/contrib/microtype/README.md b/macros/latex/contrib/microtype/README.md new file mode 100644 index 0000000000..8a41cadef5 --- /dev/null +++ b/macros/latex/contrib/microtype/README.md @@ -0,0 +1,80 @@ + +The `microtype` package +======================= + +**Subliminal refinements towards typographical perfection** + + (v2.7b -- 2019/02/28) + + +Overview +-------- + +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 (at least version 1.30) or LuaTeX, while +the adjustment of interword spacing and of kerning only works with pdfTeX +(at least 1.40). Letterspacing is available with pdfTeX (1.40) or LuaTeX (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. + +The documentation can be found in `microtype.pdf`. + + +Installation +------------ + +To install the package, use one of the following methods +(in decreasing order of simplicity): + +- Use the package manager of your TeX system + (TeXLive: `tlmgr install microtype`; + MiKTeX: MiKTeX Package Manager). + +- Download `microtype.tds.zip` from CTAN, + extract it in the root of one of your TDS trees, + and update the filename database. + +- Get the source (`microtype.zip`) from CTAN and extract it, + run `latex` on `microtype.ins` to generate the package and configuration files, + and move all generated files into a directory where LaTeX will find them, + e.g., `TEXMF/tex/latex/microtype/`. + + +License +------- + +This work may be distributed and/or modified under the conditions of the +LaTeX Project Public License, either version 1.3c of this license or (at +your option) any later version. The latest version of this license is in: +http://www.latex-project.org/lppl.txt, and version 1.3c or later is part +of all distributions of LaTeX version 2005/12/01 or later. + +This work has the LPPL maintenance status 'author-maintained'. + +This work consists of the files `microtype.dtx` and `microtype.ins` and the +derived files `microtype.sty`, `microtype-pdftex.def`, `microtype-luatex.def`, +`microtype-xetex.def`, `microtype.lua` and `letterspace.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. + +------------------------------------------------------ +Copyright (c) 2004--2018 R Schlicht `<w.m.l@gmx.net>` +------------------------------------------------------ diff --git a/macros/latex/contrib/microtype/microtype-utf.dtx b/macros/latex/contrib/microtype/microtype-utf.dtx new file mode 100644 index 0000000000..bcac8618c8 --- /dev/null +++ b/macros/latex/contrib/microtype/microtype-utf.dtx @@ -0,0 +1,1306 @@ +%\iffalse meta-comment +% !Mode:: "TeX:DTX:UK" +% !smartQuote:: "English" +% !DTXversion:: "2.7b" +% ------------------------------------------------------------------------ +% The `microtype' package +% Subliminal refinements towards typographical perfection +% Copyright (c) 2004--2018 R Schlicht <w.m.l@gmx.net> +% +% This work may be distributed and/or modified under the conditions of the +% LaTeX Project Public License, either version 1.3c of this license or (at +% your option) any later version. The latest version of this license is in: +% http://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 `author-maintained'. +% +% This work consists of the files microtype.dtx and microtype.ins and the +% derived files microtype.sty, microtype-pdftex.def, microtype-luatex.def, +% microtype-xetex.def, microtype.lua and letterspace.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. +% ------------------------------------------------------------------------ +% +\ProvidesFile +%<*driver> + {\jobname.dtx}[2019/02/28 v2.7b] +%</driver> +%<CharisSIL> {mt-CharisSIL.cfg}[2017/07/07 v1.1 microtype config. file: Charis SIL (RS)] +%<LatinModernRoman> {mt-LatinModernRoman.cfg}[2013/03/13 v1.0 microtype config. file: Latin Modern Roman (RS)] +%<PalatinoLinotype> {mt-PalatinoLinotype.cfg}[2012/03/10 v1.0 microtype config. file: Palatino Linotype and similar fonts (LBD)] +%<*driver> +\documentclass[10pt,a4paper]{ltxdoc} +\usepackage{fontspec} +\usepackage{luatexbase} +\RequireLuaModule{luainputenc} +\ifnum\luatexversion>84 + \protected\edef\pdfminorversion {\pdfvariable minorversion} + \protected\def\pdfobj {\pdfextension obj } + \protected\def\pdfcatalog {\pdfextension catalog } + \protected\def\pdfmapline {\pdfextension mapline } + \protected\def\pdfglyphtounicode {\pdfextension glyphtounicode } + \protected\def\pdflastobj {\numexpr\pdffeedback lastobj\relax} +\fi +\makeatletter +% microtype-doc.sty is 8-bit, and the following is a hack +\luatexbase@directlua{luatexbase.add_to_callback('process_input_buffer', luainputenc.fake_utf_read, 'luainputenc.fake_utf_read')} +\usepackage{microtype-doc} +\luatexbase@directlua{luatexbase.remove_from_callback('process_input_buffer', 'luainputenc.fake_utf_read')} +\let\lsstyle\relax % !!!!!!! ATTENTION, PLEASE !!!!!!!!! (letterspacing is broken in luatex 1.07) + \def\setmacrofont#1{\par\def\macro@font{#1}\footnotesize} + \newfontface\LMR{Latin Modern Roman} + \newfontface\CharisSIL{Charis SIL} + \newfontface\PalatinoLinotype{TeX Gyre Pagella} +\textheight=626pt % this isn't set correctly for some reason +\usepackage{luacode} +\tracinglostchars2 +% we replace any missing characters (in Palatino) with CharisSIL +% the lua code is mostly stolen from http://tex.stackexchange.com/a/120529 and http://tex.stackexchange.com/a/119945 +{\CharisSIL\footnotesize\global\expandafter\let\expandafter\fallbackfont\the\font} +\begin{luacode} +local fontcharacters = { } +local nullfont = 0 +local glyph_t = nodes.nodecodes.glyph +local whatsit_t = nodes.nodecodes.whatsit +local colorst_t = node.subtype("pdf_colorstack") +local color_push = node.new(whatsit_t,colorst_t) +local color_pop = node.new(whatsit_t,colorst_t) +color_push.stack, color_pop.stack = 0,0 +color_push.command,color_pop.command = 1,2 +color_push.data = "0.97 0.04 0.07 rg" -- red +local fallbackfont = font.id("fallbackfont") +table.setmetatableindex(fontcharacters, function (t, k) + if k == true then + return fontcharacters[currentfont()] + else + local tfmdata = fonts.hashes.identifiers[k] + if not tfmdata then --- unsafe + tfmdata = font.fonts[k] + if not (tfmdata and type (tfmdata) == "table") then + return false + end + end + local characters = tfmdata.characters + t[k] = characters + return characters + end +end) +local nodeprocessor = function (head) + local lastfont, characters = nil, nil + for n in node.traverse_id(glyph_t, head) do + local currfont = n.font + local char = n.char + if currfont ~= lastfont and currfont ~= nullfont then + characters = fontcharacters[currfont] + end + if characters ~= false then + lastfont = currfont + if not characters[char] then + head = node.insert_before(head,n,node.copy(color_push)) + node.insert_after(head,n,node.copy(color_pop)) + n.font = fallbackfont + if not fontcharacters[fallbackfont][char] then -- not even in Charis SIL + n.char = 0xFFFD + end + end + end + end + return head, false +end +luatexbase.add_to_callback("pre_linebreak_filter", nodeprocessor, "replace missing glyphs") +\end{luacode} +\DisableCrossrefs +\RecordChanges +\begin{document} + \DocInput{\jobname.dtx} +\end{document} +%</driver> +% \fi +%\StopEventually{} +% +%\GeneralChanges{Documentation} +%\changes{v2.5a}{2013/05/15}{include OpenType configuration files} +%\changes{v2.6}{2015/12/07}{missing characters printed with Charis <SIL>} +%\ImplementationSettings +%\InputIfFileExists{microtype-utf.tmp}\relax\relax +%\edef\startpage{\thepage} +%\stepcounter{page} +% +%\newwrite\utftmp +%\immediate\openout\utftmp=microtype.tmp +% +%\section{OpenType configuration files} +% +% These are the configuration files for the following OpenType fonts:\footnote{This is file \file{\jobname.dtx}.} +% +%\begin{itemize} +% \item {\LMR +% Latin Modern Roman} +% \item {\CharisSIL +% Charis <SIL>}\footnote{Available at \url{http://software.sil.org/charis}.} +% \item {\PalatinoLinotype +% Palatino Linotype}\footnote{These settings have been contributed by +% \contributor Loren B. Davis <davislo\at eecs.oregonstate.edu>.} +%\end{itemize} +% +%\noindent +% The settings are typeset in the respective font. +% +%\subsection{Character inheritance} +%\GeneralChanges{Inheritance} +%\edef\x{\string\def\string\utfsectioni{\number\numexpr\thepage-\startpage\relax}} +%\immediate\write\expandafter\utftmp\expandafter{\x} +% +% OpenType fonts may differ considerably in how complete their arsenal of glyphs is. +% Therefore, each font family should have their own inheritance settings. +% +%\NoIndexing +% \begin{macrocode} + +%%% ----------------------------------------------------------------------- +%%% INHERITANCE + +%% for xetex (EU1) and luatex (EU2), resp. both (TU) +%<*LatinModernRoman> +\DeclareCharacterInheritance + { encoding = {EU1,EU2,TU}, + family = Latin Modern Roman } +% \end{macrocode} +%{\setmacrofont\LMR +% \begin{macrocode} + { A = {À,Á,Â,Ã,Ä,Å,Ā,Ă,Ą,Ǻ,Ȁ,Ạ,Ả,Ấ,Ầ,Ẩ,Ẫ,Ậ,Ắ,Ằ,Ẳ,Ặ, + Α}, % Greek + Æ = {Ǽ}, + B = {฿, + Β}, % Greek + C = {Ç,Ć,Ĉ,Ċ,Č}, + D = {Ð,Ď,Đ,Ḍ,Ḏ}, + E = {È,É,Ê,Ë,Ē,Ĕ,Ė,Ę,Ě,Ȅ,Ẹ,Ẻ,Ẽ,Ề,Ế,Ễ,Ể,Ệ, + Ε}, % Greek + G = {Ĝ,Ğ,Ġ,Ģ,Ǧ,Ǵ}, + H = {Ĥ,Ħ,Ḥ,Ḧ,Ḫ, + Η}, % Greek + I = {Ì,Í,Î,Ï,Ĩ,Ī,Ĭ,Į,İ,Ȉ,Ỉ,Ị, + Ι}, % Greek + J = {Ĵ}, + K = {Ķ, + Κ}, % Greek + L = {Ĺ,Ļ,Ł,Ḷ}, % Ľ,Ŀ,Ḹ + M = {Μ}, % Greek + N = {Ñ,Ń,Ņ,Ň,Ṅ,Ṇ, + Ν}, % Greek + O = {Ò,Ó,Ô,Õ,Ö,Ø,Ō,Ŏ,Ő,Ọ,Ơ,Ǫ,Ǿ,Ȍ,Ỏ,Ố,Ồ,Ổ,Ỗ,Ộ,Ớ,Ờ,Ỡ,Ở,Ợ, + Ο}, % Greek + P = {Ρ}, % Greek + R = {Ŕ,Ŗ,Ř,Ȑ,Ṛ,Ṙ,Ṝ}, + S = {Ś,Ŝ,Ş,Š,Ș,Ṣ}, + T = {Ţ,Ť,Ț,Ṭ,Ṯ, + Τ}, % Greek + U = {Ù,Ú,Û,Ü,Ũ,Ū,Ŭ,Ů,Ű,Ų,Ư,Ȕ,Ụ,Ủ,Ứ,Ừ,Ử,Ữ,Ự}, + W = {Ŵ,Ẁ,Ẃ,Ẅ}, + X = {Χ}, % Greek + Y = {Ý,Ŷ,Ÿ,Ỵ,Ỷ,Ỹ}, + Z = {Ź,Ż,Ž,Ẓ, + Ζ}, % Greek + a = {à,á,â,ã,ä,å,ā,ă,ą,ǻ,ȁ,ạ,ả,ấ,ầ,ẩ,ẫ,ậ,ắ,ằ,ẳ,ẵ}, + æ = {ǽ}, + c = {ç,ć,ĉ,ċ,č}, + d = {đ,ḍ,ḏ}, + e = {è,é,ê,ë,ē,ĕ,ė,ę,ě,ȅ,ẹ,ẻ,ẽ,ế,ề,ể,ễ,ệ}, + f = {/f_f}, + g = {ĝ,ğ,ġ,ģ,ǧ,ǵ}, + h = {ĥ,ħ,ḥ,ḧ,ḫ}, + i = {ì,í,î,ï,ĩ,ī,ĭ,į,ı,ȉ,ỉ,ị}, + j = {ĵ}, + k = {ķ}, + l = {ĺ,ļ,ł,ḷ,ḹ}, % ľ,l· + n = {ñ,ń,ņ,ň,ṅ,ṇ}, + o = {ò,ó,ô,õ,ö,ø,ō,ŏ,ő,ọ,ơ,ǫ,ǿ,ȍ,ỏ,ố,ồ,ổ,ỗ,ộ,ớ,ờ,ỡ,ở,ợ}, + r = {ŕ,ŗ,ř,ȑ,ṛ,ṙ,ṝ}, + s = {ś,ŝ,ş,š,ș,ṣ}, + t = {ţ,ț,ṭ,ṯ,ẗ}, % ť + u = {ù,ú,û,ü,ũ,ū,ŭ,ů,ű,ų,ư,ȕ,ụ,ủ,ứ,ừ,ử,ữ,ự}, + w = {ŵ,ẁ,ẃ,ẅ}, + y = {ý,ŷ,ÿ,ỳ,ỵ,ỷ,ỹ}, + z = {ź,ż,ž,ẓ}, + } +% \end{macrocode} +%} +% \begin{macrocode} +%</LatinModernRoman> +%<*CharisSIL> +\DeclareCharacterInheritance + { encoding = {EU1,EU2,TU}, + family = Charis SIL } +% \end{macrocode} +%{\setmacrofont\CharisSIL +% \begin{macrocode} + { A = {À,Á,Â,Ã,Ä,Å,Ā,Ă,Ą,Ǎ,Ǟ,Ǡ,Ȧ,Ǻ,Ȁ,Ȃ,Ḁ,Ạ,Ả,Ấ,Ầ,Ẩ,Ẫ,Ậ,Ắ,Ằ,Ẳ,Ẵ,Ặ,Ꜳ, + А,Ӑ,Ӓ}, % Cyrillic + Æ = {Ǣ, + Ǽ,Ӕ}, % Cyrillic + B = {Ḃ,Ḅ,Ḇ, + В}, % Cyr + C = {Ç,Ć,Ĉ,Ḉ,Ċ,Č, + С,Ҫ}, % Cyr + D = {Ď,Ḋ,Ḍ,Ḏ,Ḑ,Ḓ,Đ}, + E = {È,É,Ê,Ë,Ē,Ĕ,Ė,Ę,Ě,Ȅ,Ȩ,Ȇ,Ḕ,Ḗ,Ḙ,Ḛ,Ḝ,Ẹ,Ẻ,Ẽ,Ế,Ề,Ể,Ễ,Ệ, + Е,Ѐ,Ё,Ӗ}, % Cyr + F = {Ḟ}, + G = {Ĝ,Ğ,Ġ,Ģ,Ǧ,Ǵ,Ḡ,Ԍ}, + H = {Ĥ,Ȟ,Ḣ,Ḥ,Ḧ,Ḩ,Ḫ, + Н,Ң,Ҥ,Ӈ,Ӊ}, % Cyr + I = {Ì,Í,Î,Ȉ,Ï,Į,Ĩ,Ị,Ī,İ,Ǐ,Ỉ,Ȋ,Ĭ,Ḭ,Ï, + І,Ї,Ӏ,ӏ}, % Cyr + J = {Ĵ, + Ј}, % Cyr + K = {Ķ,Ǩ,Ḱ,Ḳ,Ḵ, + К,Ќ,Қ,Ҝ,Ҟ,Ҡ,Ӄ,Ԟ}, % Cyr + L = {Ĺ,Ļ,Ľ,Ḷ,Ḹ,Ḻ,Ḽ}, % L· + M = {Ḿ,Ṁ,Ṃ, + М,Ӎ}, % Cyr + N = {Ñ,Ń,Ņ,Ň,Ǹ,Ṅ,Ṇ,Ṉ,Ṋ, + И,Й,Ѝ,Ҋ,Ӣ,Ӥ}, % Cyr + O = {Ò,Ó,Ô,Õ,Ö,Ō,Ŏ,Ő,Ǒ,Ǫ,Ǭ,Ȍ,Ȏ,Ȫ,Ȭ,Ȯ,Ȱ,Ṍ,Ṏ,Ṑ,Ṓ,Ọ,Ỏ,Ố,Ồ,Ổ,Ỗ,Ộ,Ớ,Ờ,Ở,Ỡ,Ơ, + О,Ѳ,Ӧ,Ө,Ӫ, % Cyr + Θ}, % Greek + P = {Ṕ,Ṗ, + Р,Ҏ}, % Cyr + Q = {Ԛ}, % Cyr + R = {Ŕ,Ŗ,Ř,Ȑ,Ȓ,Ṙ,Ṛ,Ṝ,Ṟ}, + S = {Ś,Ŝ,Ş,Š,Ș,Ṡ,Ṣ,Ṥ,Ṧ,Ṩ, + Ѕ}, % Cyr + T = {Ţ,Ť,Ț,Ṫ,Ṭ,Ṯ,Ṱ, + Т,Ҭ}, % Cyr + U = {Ù,Ú,Û,Ü,Ũ,Ū,Ŭ,Ů,Ű,Ų,Ǔ,Ǖ,Ǘ,Ǚ,Ǜ,Ȕ,Ȗ,Ṳ,Ṵ,Ṷ,Ṹ,Ṻ,Ụ,Ủ,Ứ,Ừ,Ử,Ữ,Ự}, + V = {Ṽ,Ṿ}, + W = {Ŵ,Ẁ,Ẃ,Ẅ,Ẇ,Ẉ, + Ԝ}, % Cyr + X = {Ẋ,Ẍ, + Х,Ҳ,Ӽ,Ӿ}, % Cyr + Y = {Ý,Ŷ,Ÿ,Ȳ,Ẏ,Ỳ,Ỵ,Ỷ,Ỹ, + Ү,Ұ}, % Cyr + Z = {Ź,Ż,Ž,Ẑ,Ẓ,Ẕ}, + a = {à,á,â,ã,ä,å,ā,ă,ą,ǎ,ǟ,ǡ,ȧ,ǻ,ȁ,ȃ,ḁ,ạ,ả,ầ,ấ,ẩ,ẫ,ậ,ắ,ằ,ẳ,ẵ,ặ, % aʾ + а,ӑ,ӓ}, % Cyr + æ = {ǽ, + ӕ}, % Cyr + b = {ḃ,ḅ,ḇ}, + c = {ç,ć,ĉ,ċ,č,ḉ, + с,ҫ}, % Cyr + d = {ď,ḋ,ḍ,ḏ,ḑ,ḓ}, + e = {è,é,ê,ë,ē,ĕ,ė,ę,ě,ȅ,ȩ,ȇ,ḕ,ḗ,ḙ,ḛ,ḝ,ẹ,ẻ,ẽ,ề,ế,ể,ễ,ệ, + е,ѐ,ё,ӗ}, % Cyr + f = {ḟ,ff}, % /f_f + g = {ĝ,ğ,ġ,ģ,ǧ,ǵ,ḡ}, + h = {ĥ,ȟ,ḣ,ḥ,ḧ,ḩ,ḫ,ẖ, + Һ,һ}, % Cyr + i = {ı,ì,í,î,ȉ,ǐ,ï,į,ī,ị,ĩ,ḭ,ḯ,ỉ,ȋ,ĭ, + і,ї}, % Cyr + j = {ĵ,ǰ, + ј}, % Cyr + k = {ķ,ǩ,ḱ,ḳ,ḵ}, + l = {ĺ,ļ,ḻ,ḷ,ḹ,ḽ}, % ľ,l· + m = {ḿ,ṁ,ṃ}, + n = {ñ,ń,ņ,ň,ǹ,ṅ,ṇ,ṉ,ṋ}, % ʼn + o = {ò,ó,ô,õ,ö,ō,ŏ,ő,ǒ,ǫ,ǭ,ȍ,ȏ,ȫ,ȭ,ȯ,ȱ,ṍ,ṏ,ṑ,ṓ,ọ,ỏ,ồ,ố,ổ,ỗ,ộ,ớ,ờ,ở,ỡ,ợ, + о,ѳ,ӧ,ө,ӫ}, % Cyr + p = {ṕ,ṗ, + р,ҏ}, % Cyr + q = {ԛ}, % Cyr + r = {ŕ,ŗ,ř,ȑ,ȓ,ṙ,ṛ,ṝ,ṟ}, + s = {ś,ŝ,ş,š,ș,ṡ,ṣ,ṥ,ṧ,ṩ, + ѕ}, % Cyr + t = {ţ,ț,ṫ,ṭ,ṯ,ṱ,ẗ}, % ť + u = {ù,ú,û,ü,ũ,ū,ŭ,ů,ű,ų,ǔ,ǖ,ǘ,ǚ,ǜ,ȕ,ȗ,ṳ,ṵ,ṷ,ṹ,ṻ,ụ,ủ,ứ,ừ,ử,ữ,ự}, + v = {ṽ,ṿ}, + w = {ŵ,ẁ,ẃ,ẅ,ẇ,ẉ,ẘ, + ԝ}, % Cyr + x = {ẋ,ẍ, + х,ҳ}, % Cyr + y = {ý,ÿ,ŷ,ȳ,ẏ,ẙ,ỳ,ỵ,ỷ,ỹ, + у,ў,ӯ,ӱ,ӳ}, % Cyr + z = {ź,ż,ž,ẑ,ẓ,ẕ}, + % Cyrillic + Г = {Ѓ,Ґ,Ғ,Ӷ,Ӻ}, + Ж = {Җ,Ӝ,Ӂ}, + З = {Ӟ,Ҙ}, + Л = {Ӆ}, + П = {Ԥ}, + У = {Ў,Ӯ,Ӱ,Ӳ}, + Ч = {Ҷ,Ҹ,Ӌ,Ӵ}, + Ы = {Ӹ}, + Ә = {Ӛ}, + Ҽ = {Ҿ}, + г = {ѓ,ґ,ғ,ӷ,ӻ}, + ж = {җ,ӂ,ӝ}, + з = {ҙ,ӟ}, + и = {й,ѝ,ҋ,ӣ,ӥ}, + к = {ќ,қ,ҝ,ҟ,ҡ,ӄ,ԟ}, + л = {ӆ}, + м = {ӎ}, + н = {ң,ҥ,ӈ,ӊ}, + п = {ԥ}, + т = {ҭ}, + х = {ӽ,ӿ}, + ч = {ҷ,ҹ,ӌ,ӵ}, + ш = {щ}, + ы = {ӹ}, + э = {ӭ}, + ҽ = {ҿ}, + ә = {ӛ}, + ү = {ұ}, + Г = {Γ}, % Greek + П = {Π}, % Greek + } + + % missing: tipa, math, symbols, ... +% \end{macrocode} +%} +% \begin{macrocode} +%</CharisSIL> +%<*PalatinoLinotype> +\DeclareCharacterInheritance + { encoding = {EU1,EU2,TU}, + family = {PalatinoLinotype} } +% \end{macrocode} +% Unfortunately, I don't have a Palatino variant containing all of the following +% glyphs. The settings are typeset in \TeX\ Gyre Pagella; +% missing glyphs, printed in red, are taken from Charis <SIL>; +% glyphs missing even in Charis <SIL> appear as `\char"FFFD'. +% To see the real settings, consult \file{mt-PalatinoLinotype.cfg}. +%{\setmacrofont\PalatinoLinotype +% \begin{macrocode} + { A = {À,Á,Â,Ã,Ä,Ā,Ă,Ą,Ǎ,Ǟ,Ǡ,Ȧ,Ǻ,Ȁ,Ȃ,Ḁ,Ạ,Ả,Ấ,Ầ,Ẩ,Ẫ,Ậ,Ắ,Ằ,Ẳ,Ẵ,Ặ,Ꜳ}, + B = {Ḃ,Ḅ,Ḇ}, + C = {Ç,Ć,Ĉ,Ḉ,Ċ,Č}, + D = {Ď,Ḋ,Ḍ,Ḏ,Ḑ,Ḓ}, + E = {È,É,Ê,Ë,Ē,Ĕ,Ė,Ę,Ě,Ȅ,Ȩ,Ȇ,Ḕ,Ḗ,Ḙ,Ḛ,Ḝ,Ẹ,Ẻ,Ẽ,Ế,Ề,Ể,Ễ,Ệ}, + F = {Ḟ}, + G = {Ĝ,Ğ,Ġ,Ģ,Ǧ,Ǵ,Ḡ}, + H = {Ĥ,Ȟ,Ḣ,Ḥ,Ḧ,Ḩ,Ḫ}, + I = {Ì,Í,Î,Ȉ,Ï,Į,Ĩ,Ị,Ī,İ,Ǐ,Ỉ,Ȋ,Ĭ,Ḭ,Ï}, + J = {Ĵ}, + K = {Ķ,Ǩ,Ḱ,Ḳ,Ḵ}, + L = {Ĺ,Ļ,Ľ,Ḷ,Ḹ,Ḻ,Ḽ,Ỻ,Ŀ,Ł}, % L· + M = {Ḿ,Ṁ,Ṃ}, + N = {Ñ,Ń,Ņ,Ň,Ǹ,Ṅ,Ṇ,Ṉ,Ṋ}, + O = {Ò,Ó,Ô,Õ,Ö,Ō,Ŏ,Ő,Ǒ,Ǫ,Ǭ,Ȍ,Ȏ,Ȫ,Ȭ,Ȯ,Ȱ,Ṍ,Ṏ,Ṑ,Ṓ,Ọ,Ỏ,Ố,Ồ,Ổ,Ỗ,Ộ,Ớ,Ờ,Ở,Ỡ,Ơ}, + P = {Ṕ,Ṗ}, + R = {Ŕ,Ŗ,Ř,Ȑ,Ȓ,Ṙ,Ṛ,Ṝ,Ṟ}, + S = {Ś,Ŝ,Ş,Š,Ș,Ṡ,Ṣ,Ṥ,Ṧ,Ṩ}, + T = {Ţ,Ť,Ț,Ṫ,Ṭ,Ṯ,Ṱ}, + U = {Ù,Ú,Û,Ü,Ũ,Ū,Ŭ,Ů,Ű,Ų,Ǔ,Ǖ,Ǘ,Ǚ,Ǜ,Ȕ,Ȗ,Ṳ,Ṵ,Ṷ,Ṹ,Ṻ,Ụ,Ủ,Ứ,Ừ,Ử,Ữ,Ự}, + V = {Ṽ,Ṿ}, + W = {Ŵ,Ẁ,Ẃ,Ẅ,Ẇ,Ẉ}, + X = {Ẋ,Ẍ}, + Y = {Ý,Ŷ,Ÿ,Ȳ,Ẏ,Ỳ,Ỵ,Ỷ,Ỹ}, + Z = {Ź,Ż,Ž,Ẑ,Ẓ,Ẕ}, + a = {à,á,â,ã,ä,å,ā,ă,ą,ǎ,ǟ,ǡ,ȧ,ǻ,ȁ,ȃ,ḁ,ạ,ả,ầ,ấ,ẩ,ẫ,ậ,ắ,ằ,ẳ,ẵ,ặ}, % aʾ + b = {ḃ,ḅ,ḇ}, + c = {ç,ć,ĉ,ċ,č,ḉ}, + d = {ď,ḋ,ḍ,ḏ,ḑ,ḓ}, + e = {è,é,ê,ë,ē,ĕ,ė,ę,ě,ȅ,ȩ,ȇ,ḕ,ḗ,ḙ,ḛ,ḝ,ẹ,ẻ,ẽ,ề,ế,ể,ễ,ệ}, + f = {ḟ,ff}, + g = {ĝ,ğ,ġ,ģ,ǧ,ǵ,ḡ}, + h = {ĥ,ȟ,ḣ,ḥ,ḧ,ḩ,ḫ,ẖ}, + i = {ı,ì,í,î,ȉ,ǐ,ï,į,ī,ị,ĩ,ḭ,ḯ,ỉ,ȋ,ĭ}, + j = {ĵ,ǰ}, + k = {ķ,ǩ,ḱ,ḳ,ḵ}, + l = {ĺ,ļ,ḻ,ḷ,ḹ,ḽ}, % ľ,l· + m = {ḿ,ṁ,ṃ}, + n = {ñ,ń,ņ,ň,ǹ,ṅ,ṇ,ṉ,ṋ}, % ʼn + o = {ò,ó,ô,õ,ö,ō,ŏ,ő,ǒ,ǫ,ǭ,ȍ,ȏ,ȫ,ȭ,ȯ,ȱ,ṍ,ṏ,ṑ,ṓ,ọ,ỏ,ồ,ố,ổ,ỗ,ộ,ớ,ờ,ở,ỡ,ợ}, + p = {ṕ,ṗ}, + r = {ŕ,ŗ,ř,ȑ,ȓ,ṙ,ṛ,ṝ,ṟ}, + s = {ś,ŝ,ş,š,ș,ṡ,ṣ,ṥ,ṧ,ṩ}, + t = {ţ,ț,ṫ,ṭ,ṯ,ṱ,ẗ}, % ť + u = {ù,ú,û,ü,ũ,ū,ŭ,ů,ű,ų,ǔ,ǖ,ǘ,ǚ,ǜ,ȕ,ȗ,ṳ,ṵ,ṷ,ṹ,ṻ,ụ,ủ,ứ,ừ,ử,ữ,ự}, + v = {ṽ,ṿ}, + w = {ŵ,ẁ,ẃ,ẅ,ẇ,ẉ,ẘ}, + x = {ẋ,ẍ}, + y = {ý,ÿ,ŷ,ȳ,ẏ,ẙ,ỳ,ỵ,ỷ,ỹ}, + z = {ź,ż,ž,ẑ,ẓ,ẕ}, + } +% \end{macrocode} +%} +% \begin{macrocode} +%</PalatinoLinotype> +% \end{macrocode} +% +%\subsection{Character protrusion} +%\GeneralChanges{Protrusion} +%\edef\x{\string\def\string\utfsectionii{\number\numexpr\thepage-\startpage\relax}} +%\immediate\write\expandafter\utftmp\expandafter{\x} +% +% \begin{macrocode} + +%%% ----------------------------------------------------------------------- +%%% PROTRUSION + +%<*LatinModernRoman> +\SetProtrusion + [ name = LMR-default ] + { encoding = {EU1,EU2,TU}, + family = Latin Modern Roman } + { +% \end{macrocode} +%{\setmacrofont\LMR +% \begin{macrocode} + A = {50,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 = { ,70}, + v = {50,50}, + w = {50,50}, + x = {50,50}, + y = {50,70}, + 0 = { ,50}, + 1 = {100,200}, + 2 = {50,50}, + 3 = {50,50}, + 4 = {70,70}, + 5 = { ,50}, + 6 = { ,50}, + 7 = {50,100}, + 8 = { ,50}, + 9 = { ,50}, + . = { ,700}, + {,}= { ,500}, + : = { ,500}, + ; = { ,500}, + ! = { ,100}, + ? = { ,200}, + @ = {50,50}, + ~ = {200,250}, + \% = {50,50}, + * = {300,300}, + + = {250,250}, + - = {400,500}, % /hyphen + – = {400,300}, % /endash + — = {300,200}, % /emdash + _ = {200,200}, % /underscore + / = {200,300}, + /backslash = {200,300}, + ' = {300,400}, % /quotesingle + ‘ = {500,700}, ’ = {500,600}, + “ = {500,300}, ” = {200,600}, + ‚ = {400,400}, „ = {400,400}, + ‹ = {400,400}, › = {300,500}, + « = {300,200}, » = {100,400}, + ¡ = {100, }, ¿ = {100, }, + ( = {300, }, ) = { ,300}, + < = {200,100}, > = {100,200}, + /braceleft = {400,200}, /braceright = {200,400}, + /angleleft = {400, }, /angleright = { ,400}, + † = {100,100}, + ‡ = { 80, 80}, + • = {200,200}, + · = {400,450}, % / periodcentered + ℃ = { 80, 50}, + ₡ = { , 50}, + ° = {400,400}, + ™ = {100,200}, + © = {100,100}, + ® = {100,100}, + ª = {100,200}, + º = {100,200}, + ¹ = {200,250}, + ² = { 50,100}, + ³ = { 50,100}, + ¬ = {200, }, + − = {300,300}, + ± = {150,200}, + × = {150,250}, + ÷ = {150,250}, + € = {100, }, + /one.oldstyle = {100,100}, + /two.oldstyle = { 50, 50}, + /three.oldstyle = { 30, 80}, + /four.oldstyle = { 50, 50}, + /seven.oldstyle = { 50, 80}, + Γ = { ,180}, % /Gamma + Δ = {100,100}, % /Delta + Θ = { 50, 50}, % /Theta + Λ = {100,100}, % /Lambda +% Ξ = {,}, % /Xi +% Π = {,}, % /Pi + Σ = { 50, 50}, % /Sigma + Υ = {100,100}, % /Upsilon + Φ = { 50, 50}, % /Phi + Ψ = { 50, 50}, % /Psi +% Ω = {,}, % /Omega +% \end{macrocode} +%} +% \begin{macrocode} + } + +\SetProtrusion + [ name = LMR-it ] + { encoding = {EU1,EU2,TU}, + family = Latin Modern Roman, + shape = {it,sl} } + { +% \end{macrocode} +%{\setmacrofont\LMR +% \begin{macrocode} + A = {125,100}, + Æ = {125,-55}, + B = {90,-40}, + C = {145,-75}, + D = {75, -28}, + E = {80,-55}, + F = {85,-80}, + G = {153,-15}, + H = {73,-60}, + I = {140,-120}, + IJ = {140,-80}, + J = {135,-80}, + K = {70,-30}, + L = {87, 40}, + M = {67,-45}, + N = {75,-55}, + O = {150,-30}, + Œ = {150,-55}, + P = {82,-50}, + Q = {150,-30}, + R = {75, 15}, + S = {90,-65}, + $ = {100,-20}, + T = {220,-85}, + U = {230,-55}, + V = {260,-60}, + W = {185,-55}, + X = {70,-30}, + Y = {250,-60}, + Z = {90,-60}, + a = {150,-10}, + b = {170, }, + c = {173,-10}, + d = {150,-55}, + e = {180, }, + f = { ,-250}, + g = {150,-10}, + h = {100, }, + i = {210, }, + ij = {210,-40}, + j = { ,-40}, + k = {110,-50}, + l = {240,-110}, + m = {80, }, + n = {115, }, + o = {155, }, + q = {170,-40}, + r = {155,-40}, + s = {130, }, + t = {230,-10}, + u = {120, }, + v = {140,-25}, + w = {98,-20}, + x = {65,-40}, + y = {130,-20}, + z = {110,-80}, + 0 = {170,-85}, + 1 = {230,110}, + 2 = {130,-70}, + 3 = {140,-70}, + 4 = {130,80}, + 5 = {160, }, + 6 = {175,-30}, + 7 = {250,-150}, + 8 = {130,-40}, + 9 = {155,-80}, + . = { ,500}, + {,}= { ,450}, + : = { ,300}, + ; = { ,300}, + & = {130,30}, + \% = {180,50}, + * = {380,20}, + + = {180,200}, + @ = {180,10}, + ~ = {200,150}, + ( = {300, }, ) = { ,70}, + / = {100,100}, + - = {500,300}, % /hyphen + – = {500,300}, % /endash + — = {400,170}, % /emdash + _ = {100,200}, % /underscore + ' = {300,400}, % /quotesingle + " = {500,300}, + ‘ = {800,200}, ’ = {800,-20}, + “ = {540,100}, ” = {500,100}, + ‚ = {300,700}, „ = {200,600}, + ‹ = {500,300}, › = {400,400}, + « = {400,100}, » = {200,300}, + ¡ = {200, }, ¿ = {200, }, + < = {300,100}, > = {200,100}, + /backslash = {300,300}, + /braceleft = {400,100}, /braceright = {200,200}, + † = {200, 80}, + ‡ = {120, 80}, + • = {220,100}, + · = {550,300}, % / periodcentered + ℃ = {170, }, + ₡ = {100, 50}, + ¶ = {200, }, + ° = {500,300}, + ™ = {200, 70}, + © = { 50, 70}, + ® = { 50, 70}, + ª = {140,100}, + º = {140,100}, + ¹ = {400,150}, + ² = {250, 80}, + ³ = {250, 80}, + ¬ = {250, 80}, + − = {300,200}, + ± = {150,170}, + × = {200,200}, + ÷ = {200,200}, + € = {150, }, + /one.oldstyle = {100,100}, + /two.oldstyle = {100, 80}, + /three.oldstyle = { 80, 50}, + /four.oldstyle = { 80, 80}, + /five.oldstyle = { 50, }, + /six.oldstyle = { 50, }, + /seven.oldstyle = { 80, 80}, + /eight.oldstyle = { 50, }, + Γ = {100,120}, % /Gamma + Δ = {120,100}, % /Delta + Θ = {120, 50}, % /Theta + Λ = {130,100}, % /Lambda + Ξ = {100,}, % /Xi + Π = {100,}, % /Pi + Σ = {100, 50}, % /Sigma + Υ = {180,100}, % /Upsilon + Φ = {130, 70}, % /Phi + Ψ = {130, 50}, % /Psi + Ω = { 50,}, % /Omega +% \end{macrocode} +%} +% \begin{macrocode} + } +%</LatinModernRoman> +%<*CharisSIL> +\SetProtrusion + [ name = Charis-default ] + { encoding = {EU1,EU2,TU}, + family = Charis SIL } + { +% \end{macrocode} +%{\setmacrofont\CharisSIL +% \begin{macrocode} + A = {50,50}, + Æ = {50,50}, + C = {50, }, + D = { ,50}, + F = { ,50}, + G = {50, }, + J = {100, }, + K = { ,50}, + L = { ,50}, + Ŀ = { ,100}, + O = {50,50}, + Œ = {50, }, + P = { ,50}, + Q = {50,70}, + R = { ,50}, + ẞ = { ,40}, % capital sharp s + T = {50,50}, + V = {50,50}, + W = {50,50}, + X = {50,50}, + Y = {50,50}, + k = { ,50}, + ŀ = { ,150}, + r = { ,50}, + t = { ,50}, + v = {50,50}, + w = {50,50}, + x = {50,50}, + y = { ,50}, + 1 = {150,150}, + 2 = {50,50}, + 3 = {50, }, + 4 = {100,50}, + 6 = {50, }, + 7 = {50,80}, + 9 = {50,50}, + . = { ,600}, + {,}= { ,500}, + : = { ,400}, + ; = { ,300}, + ! = { ,100}, + ? = { ,200}, + @ = {50,50}, + ~ = {200,250}, + \% = { ,50}, + * = {300,300}, + + = {200,250}, + / = { ,200}, + /backslash = {150,200}, + | = {200,200}, + - = {400,500}, % hyphen + – = {200,300}, % endash + — = {150,250}, % emdash + ― = {200,200}, % Horizontal Bar = \texttwelveudash + ‒ = {150,150}, % Figure Dash = \textthreequartersemdash + _ = {100,100}, + {=} = {100,100}, + ‘ = {300,400}, ’ = {300,400}, + “ = {300,300}, ” = {300,300}, + ‚ = {400,400}, „ = {300,300}, + ‹ = {400,300}, › = {300,400}, + « = {200,200}, » = {150,300}, + ¡ = {100, }, ¿ = {100, }, + ( = {200, }, ) = { ,200}, + < = {200,150}, > = {100,200}, + [ = {100, }, ] = { ,100}, + /braceleft = {200, }, /braceright = { ,300}, + † = { 80, 80}, + ‡ = {100,100}, + • = {200,200}, + ° = {150,200}, + ™ = {150,150}, + ¢ = { 50, }, + £ = { 50, }, + ¦ = {200,200}, + © = {100,100}, + ® = {100,100}, + ª = {100,200}, + º = {200,200}, + ¬ = {200, 50}, + µ = { ,100}, + ¶ = { ,100}, + · = {300,400}, + ¹ = {200,300}, + ² = {100,200}, + ³ = {100,200}, + € = {100, }, + ± = {150,200}, + × = {200,200}, + ÷ = {250,250}, + /minus = {200,200}, + − = {200,200}, + % Cyrillic + Б = { ,50}, + Г = { ,130}, + Ж = {50,50}, + З = {30,50}, + Л = {50, }, + У = {50,50}, + Ф = {50,50}, + Ч = {100, }, + Ъ = { ,50}, + Ь = { ,50}, + Э = {50,50}, + Ю = { ,40}, + Я = {50, }, + Ѵ = {50,50}, + Ҽ = {50, }, + Ђ = {50,100}, + Є = {50, }, + Љ = {50,50}, + Њ = { ,50}, + Ћ = {50,50}, + Ԅ = {100,100}, + Ԇ = {50,50}, + Ѣ = { ,50}, + Ҍ = { ,50}, + Ԉ = {50,80}, + Ԋ = { ,80}, + Ԏ = {50,50}, + Ԓ = {50, }, + Ԕ = {50,40}, + Ԗ = { ,50}, + Ԙ = {50, }, + Ԡ = { ,50}, + Ԣ = { ,50}, + Ԃ = { ,100}, + б = {50,50}, + г = { ,70}, + к = { ,50}, + л = {50, }, + т = {50,50}, + ф = {50,50}, + ч = {50, }, + ъ = { ,50}, + ь = { ,50}, + э = { ,50}, + я = {50, }, + љ = {50, }, + њ = { ,50}, + ѣ = { ,50}, + ѵ = {50,50}, + ҽ = {50, }, + ҍ = { ,50}, + ү = {50,50}, + ҕ = { ,50}, + ҧ = { ,50}, + ԃ = { ,100}, + ԅ = {100,100}, + ԇ = {50,50}, + ԉ = {50,70}, + ԋ = { ,70}, + ԙ = {50,30}, + ԡ = { ,50}, + ԣ = { ,50}, + % Д П Ц Ш Щ Ы Ҕ Ҧ Ҩ Ә Ҵ Џ Ӭ Ӡ Ԑ Ԁ + % в д ж з и м н п ц ш ы ю ђ є ћ џ ә ԑ ҩ ҵ ӡ ԁ ԍ ԏ ԓ ԕ ԗ + % Greek + Δ = {50,50}, + Ψ = {50,50}, + γ = {70,70}, + λ = {40,70}, + π = {40,50}, + ρ = { ,50}, + σ = { ,50}, + χ = {50,50}, +% \end{macrocode} +%} +% \begin{macrocode} +} + +\SetProtrusion + [ name = Charis-it ] + { encoding = {EU1,EU2,TU}, + family = Charis SIL, + shape = {it,sl} } + { +% \end{macrocode} +%{\setmacrofont\CharisSIL +% \begin{macrocode} + C = {50, }, + G = {50, }, + J = {50, }, + L = {50,50}, + O = {50, }, + Œ = {50, }, + Q = {50, }, + S = {50, }, + $ = {50, }, + T = {70, }, + o = {50,50}, + p = { ,50}, + q = {50, }, + t = { ,50}, + w = { ,50}, + y = { ,50}, + 1 = {150,100}, + 3 = {50, }, + 4 = {100, }, + 6 = {50, }, + 7 = {100, }, + . = { ,700}, + {,}= { ,600}, + : = { ,400}, + ; = { ,400}, + ? = { ,150}, + & = { ,80}, + \% = {50,50}, + * = {300,200}, + + = {250,250}, + @ = {80,50}, + ~ = {150,150}, + / = { ,150}, + /backslash = {150,150}, + - = {300,400}, % hyphen + – = {200,300}, % endash + — = {150,200}, % emdash + _ = { ,100}, + {=} = {200,200}, + ± = {150,200}, + × = {250,250}, + ÷ = {250,250}, + ° = {150,200}, + · = {300,400}, + ‘ = {400,200}, ’ = {400,200}, + “ = {300,200}, ” = {400,200}, + ‚ = {200,500}, „ = {150,500}, + ‹ = {300,400}, › = {200,500}, + « = {200,300}, » = {150,400}, + ( = {200, }, ) = { ,200}, + < = {200,200}, > = {200,200}, + /braceleft = {300, }, /braceright = { ,200}, + % Cyrillic + Ж = {50,30}, + Л = {50, }, + У = {50,30}, + Ф = {50, }, + Ч = {100, }, + Ъ = { ,50}, + Ь = { ,50}, + Э = {50,50}, + Я = {50, }, + Ѵ = {50,50}, + Љ = {50,50}, + Ԅ = {140,100}, + Ԇ = {70,50}, + Ԉ = {50,80}, + Ԋ = { ,80}, + Ԏ = {50,50}, + г = {50,50}, + д = {50,30}, + м = {50, }, + ф = {50, }, + ч = {50, }, + ъ = { ,50}, + ь = { ,50}, + э = { ,50}, + я = {50, }, + љ = {50,50}, + њ = { ,50}, + ѵ = {50,50}, + ҍ = { ,50}, + ԅ = {140,100}, + ԇ = {70,50}, + ԉ = {50,70}, + ԋ = { ,70}, + % Greek + Γ = { ,130}, + Δ = {50,50}, + Ψ = {50,50}, + γ = {70,70}, + λ = {40,70}, + π = {40,50}, + ρ = { ,50}, + σ = { ,50}, + χ = {50,50}, +% \end{macrocode} +%} +% \begin{macrocode} + } +% \end{macrocode} +% The small caps glyph names in Charis <SIL> have changed with version 5.0 +% of the font. We try to get the names right both with \luatex\ (where we +% can simply query the font version) and with \xetex\ (where we check for +% glyph name). +%\changes{v2.7}{2017/07/06}{automatically choose correct names for Charis <SIL> small caps +% (reported by `\contributor ltcomdata <@\at @>')} +% ^^A https://tex.stackexchange.com/questions/324294/ +% \begin{macrocode} + + % quick and dirty -- maybe we'll promote this to a + % regular key some time +\define@key{MT@pr@c}{command}{\csname #1\endcsname} + + % glyph names have changed with version 5.0 of Charis SIL: + % before: /a.SC, /b.SC, ... + % after: /a.sc, /b.sc, ... +\ifx\MT@lua\@undefined + \gdef\MT@get@CHARIS@SC{ + % test whether glyph "a.sc" exists + \ifnum\numexpr\XeTeXglyphindex "a.sc"\relax > 0 + \gdef\MT@CHARIS@SC{sc}% + \else + \gdef\MT@CHARIS@SC{SC}% + \fi + } +\else + \gdef\MT@get@CHARIS@SC{ + \gdef\MT@CHARIS@SC{\MT@lua{ + % check font version +% -- why doesn't this work?: +% f = font.getfont(font.current()); +% i = fontloader.info(f.filename); +% if (tonumber(i.version) < 5) then; + if (tonumber(fontloader.info(font.getfont(font.current()).filename).version) < 5) then; + tex.print("SC"); + else; + tex.print("sc"); + end + }} + } +\fi + +\SetProtrusion + [ name = Charis-sc, + load = Charis-default, + command = {MT@get@CHARIS@SC} ] + { encoding = {EU1,EU2,TU}, + family = Charis SIL, + shape = {sc} } + { +% \end{macrocode} +%{\setmacrofont\CharisSIL +% \begin{macrocode} + % ᴀ = {100,100}, % etc., doesn't work with \textsc + /a.\MT@CHARIS@SC = {100,100}, + /c.\MT@CHARIS@SC = {50, }, + /d.\MT@CHARIS@SC = { ,50}, + /f.\MT@CHARIS@SC = { ,50}, + /g.\MT@CHARIS@SC = {50, }, + /j.\MT@CHARIS@SC = {100, }, + /k.\MT@CHARIS@SC = { ,50}, + /l.\MT@CHARIS@SC = { ,50}, + /f_l.\MT@CHARIS@SC = { ,50}, + /o.\MT@CHARIS@SC = {50,50}, + /oe.\MT@CHARIS@SC = {50, }, + /q.\MT@CHARIS@SC = {50,70}, + /r.\MT@CHARIS@SC = { ,50}, + /t.\MT@CHARIS@SC = {50,100}, + /v.\MT@CHARIS@SC = {50,50}, + /w.\MT@CHARIS@SC = {50,50}, + /x.\MT@CHARIS@SC = {50,50}, + /y.\MT@CHARIS@SC = {50,50} +% \end{macrocode} +%} +% \begin{macrocode} + } +%</CharisSIL> +%<*PalatinoLinotype> +\SetProtrusion + [ name = palatino-default ] + { encoding = {EU1,EU2,TU}, + family = {PalatinoLinotype} } + { +% \end{macrocode} +%{\setmacrofont\PalatinoLinotype +% \begin{macrocode} + A = {50,50}, + D = { ,50}, + J = {50, }, + K = { ,50}, + L = { ,50}, + O = {25, }, + T = {50,50}, + V = {50,50}, + W = {50,50}, + X = {50,50}, + Y = {50,50}, + b = { ,25}, + d = {25,30}, + f = { ,50}, + g = { ,100}, + k = { ,50}, + p = { ,50}, + q = {50, }, + r = { ,50}, + t = { ,50}, st = { ,50}, ſt = { ,50}, + v = {75,50}, + w = {50,50}, + x = {50,50}, + y = {50,70}, + 1 = {100,50}, + 2 = {25,50}, + 4 = {50, }, + 6 = {50, }, + 9 = {25, }, + Æ = {100, }, + Œ = {25, }, + . = { ,700}, ‥ = { ,350}, … = {,150}, + {,}= { ,500}, + : = { ,500}, + ; = { ,500}, + ! = { ,100}, ‼ = { ,100}, + ? = { ,200}, ‽ = { ,200}, + @ = {50,50}, + ~ = {200,250}, + & = {50,100}, + \% = {100,100}, + * = {200,200}, + + = {250,250}, + ( = {100, }, ) = { ,300}, + / = {200,300}, + - = {400,500}, + \textendash = {300,300}, \textemdash = {200,200}, + \textquoteleft = {500,700}, \textquoteright = {500,700}, + \textquotedblleft = {300,400}, \textquotedblright = {300,400}, + \textbackslash = {200,300}, + \quotesinglbase = {400,400}, \quotedblbase = {400,400}, + \guilsinglleft = {400,400}, \guilsinglright = {300,500}, + \guillemotleft = {300,300}, \guillemotright = {200,400}, + \textexclamdown = {100, }, \textquestiondown = {100, }, + \textbraceleft = {400,200}, \textbraceright = {200,400}, + \textless = {200,100}, \textgreater = {100,200}, + ≤ = {200,100}, ≥ = {100,200}, + \textminus = {300,300}, + \texttrademark = {200,200}, + \textcopyright = {200,200}, + \textregistered = {200,200}, + \textdegree = {300,300}, + ¦ = {450,500}, ¬ = {250,150}, + ⌐ = {150,250}, + · = {850, 700}, + ¶ = {100,0}, + × = {150, 300}, + ª = {300,300}, º = {300,300}, + ⁰ = {200,400}, + ¹ = {400,350}, ² = {200,300}, ³ = {250,400}, + ⁴ = {250,350}, ⁵ = {200,300}, ⁶ = {250,400}, + ⁷ = {200,450}, ⁸ = {250,400}, ⁹ = {200,350}, + ₀ = {200,400}, + ₁ = {400,250}, ₂ = {200,300}, ₃ = {250,400}, + ₄ = {250,350}, ₅ = {200,300}, ₆ = {250,400}, + ₇ = {200,450}, ₈ = {250,400}, ₉ = {200,350}, + ± = {150,100}, ÷ = {300,300}, + þ = { ,25}, + ₊ = {300,450}, ₋ = {300,450}, + ⁺ = {300,450}, ⁻ = {300,450}, + † = {200,250}, ‡ = {200,250}, + π = {50, }, + ſ = { ,50}, + № = {100,150}, + \textservicemark = {100,200}, + ‐ = {400,500}, ‑ = {400,500}, ‒ = {200,300}, + – = {205,305}, — = {200,300}, ― = {50,150}, + • = {125,200}, +% /a.sc = {50,50}, +% \end{macrocode} +%} +% \begin{macrocode} + } + +\SetProtrusion + [ name = palatino-it ] + { encoding = {EU1,EU2,TU}, + family = {PalatinoLinotype}, + shape = {it,sl} } + { +% \end{macrocode} +%{\setmacrofont\PalatinoLinotype +% \begin{macrocode} + A = {50,50}, + Æ = {50, }, + B = {50, }, + C = {50, }, + D = {50,50}, + E = {50, }, + F = {50, }, + G = {50, }, + H = {50, }, + K = {50, }, + L = {50, }, + O = {50, }, + Œ = {50, }, + P = {50, }, + Q = {50, }, + R = {50, }, + S = {50, }, + $ = {50, }, + T = {100, }, + U = {50, }, + V = {100,50}, + W = {50, }, + X = {50, }, + Y = {100,50}, + b = { ,50}, + c = {25, }, + g = {75, }, + i = {25, }, + m = { ,50}, + n = { ,50}, + p = { ,25}, + q = {25, }, + x = { ,50}, + 1 = {100, }, + 2 = {50, }, + 4 = {50, }, + 7 = {50, }, + . = { ,500}, ‥ = { ,350}, … = { ,200}, + {,}= { ,500}, + : = { ,300}, + ; = { ,300}, + ? = { ,300}, ‽ = { ,300}, + & = {50,50}, + \% = {100,100}, + * = {200,200}, + + = {150,200}, + @ = {50,50}, + ~ = {200,150}, + ( = {200, }, ) = { ,200}, + / = {100,200}, + - = {300,500}, + \textendash = {300,300}, \textemdash = {200,200}, + \textquoteleft = {700,400}, \textquoteright = {700,400}, + \textquotedblleft = {500,300}, \textquotedblright = {500,300}, + _ = {100,100}, + \textbackslash = {100,200}, + \quotesinglbase = {500,500}, \quotedblbase = {400,400}, + \guilsinglleft = {400,400}, \guilsinglright = {300,500}, + \guillemotleft = {300,300}, \guillemotright = {300,300}, + \textexclamdown = {100, }, \textquestiondown = {200, }, + \textbraceleft = {200,100}, \textbraceright = {200,200}, + \textless = {300,100}, \textgreater = {200,100}, + ≤ = {200,100}, ≥ = {100,200}, + ¦ = {450,500}, ¬ = {250,150}, + · = {850, 700}, + ¶ = {100,0}, + × = {150, 300}, + ª = {300,250}, ° = {300,300}, º = {300,250}, + ⁰ = {300,200}, + ¹ = {300,150}, ² = {350,200}, ³ = {250,150}, + ⁴ = {350,100}, ⁵ = {300, 50}, ⁶ = {400,100}, + ⁷ = {400, 50}, ⁸ = {250, 50}, ⁹ = {300, 50}, + ₀ = {300,300}, + ₁ = {300,350}, ₂ = {300,150}, ₃ = {250,250}, + ₄ = {400,200}, ₅ = {300,100}, ₆ = {450,200}, + ₇ = {450,150}, ₈ = {400,250}, ₉ = {400,200}, + ± = {150,100}, ÷ = {300,300}, + þ = { 50, }, + † = {250,200}, ‡ = {250,200}, + ₊ = {300,450}, ₋ = {300,450}, + ⁺ = {300,450}, ⁻ = {300,450}, + ‐ = {300,500}, ‑ = {300,500}, ‒ = {100,300}, + – = {125,305}, — = {200,300}, ― = {125,150}, + • = {125,200} +% \end{macrocode} +%} +% \begin{macrocode} + } + +\SetProtrusion + [ name = palatino-sc, + load = palatino-default ] + { encoding = {EU1,EU2,TU}, + family = {PalatinoLinotype}, + shape = sc } + { +% \end{macrocode} +%{\setmacrofont\PalatinoLinotype +% \begin{macrocode} + a = {50,50}, + æ = {50, }, + b = { 0, 0}, + d = { 0, 0}, + f = { 0, 0}, + g = { 0, 0}, + j = {50, }, + l = { ,50}, + o = { 0, 0}, + p = { 0, 0}, + q = { 0, }, + r = { , 0}, + t = {50,50}, + y = {50,50}, + fl = { 0,50}, + ffl = { 0,50}, + ſt = { 0,50}, + st = { 0,50} +% \end{macrocode} +%} +% \begin{macrocode} + } +%</PalatinoLinotype> + +% \end{macrocode} +%\immediate\write \utftmp{\string\setcounter{CodelineNo}{\the\c@CodelineNo}} +%\immediate\write \utftmp{\string\setcounter{footnote}{\the\c@footnote}} +%\immediate\closeout\utftmp +% +\endinput diff --git a/macros/latex/contrib/microtype/microtype.dtx b/macros/latex/contrib/microtype/microtype.dtx new file mode 100644 index 0000000000..cc267648a3 --- /dev/null +++ b/macros/latex/contrib/microtype/microtype.dtx @@ -0,0 +1,17082 @@ +%\iffalse meta-comment +% !Mode:: "TeX:DTX:UK" +% !smartQuote:: "English" +% !DTXversion:: "2.7b" +% ------------------------------------------------------------------------ +% The `microtype' package +% Subliminal refinements towards typographical perfection +% Copyright (c) 2004--2018 R Schlicht <w.m.l@gmx.net> +% +% This work may be distributed and/or modified under the conditions of the +% LaTeX Project Public License, either version 1.3c of this license or (at +% your option) any later version. The latest version of this license is in: +% http://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 `author-maintained'. +% +% This work consists of the files microtype.dtx and microtype.ins and the +% derived files microtype.sty, microtype-pdftex.def, microtype-luatex.def, +% microtype-xetex.def, microtype.lua and letterspace.sty. +% +% Modified versions of the configuration files (*.cfg) may be distributed +% provided that: (1) the original copyright statement is not removed, and +% (2) the identification string is changed. +% ------------------------------------------------------------------------ +% +%<package|letterspace>\NeedsTeXFormat{LaTeX2e} +%<*driver> +\ProvidesFile{\jobname.dtx} +%</driver> +%<package|letterspace>\ProvidesPackage +%<config|pdftex-def|luatex-def|xetex-def>\ProvidesFile +%<package> {microtype} +%<letterspace> {letterspace} +%<m-t> {microtype.cfg} +%<pdftex-def> {microtype-pdftex.def} +%<luatex-def> {microtype-luatex.def} +%<xetex-def> {microtype-xetex.def} +%<*package|letterspace|m-t|pdftex-def|luatex-def|xetex-def> + [2019/02/28 v2.7b +%<package> Micro-typographical refinements +%<letterspace> Robust letterspacing +%<m-t> microtype main configuration file +%<pdftex-def|luatex-def|xetex-def> Definitions specific to +%<pdftex-def> pdftex +%<luatex-def> luatex +%<xetex-def> xetex + (RS)] +%</package|letterspace|m-t|pdftex-def|luatex-def|xetex-def> +%<luafile>microtype = microtype or {} +%<luafile>local microtype = microtype +%<luafile>microtype.module = { +%<luafile> name = "microtype", +%<luafile> version = "2.7b", +%<luafile> date = "2019/02/28", +%<luafile> description = "microtype module.", +%<luafile> author = "E. Roux, R. Schlicht and P. Gesang", +%<luafile> copyright = "E. Roux, R. Schlicht and P. Gesang", +%<luafile> license = "LPPL", +%<luafile>} +%<*config> +%<bch> {mt-bch.cfg}[2007/03/03 v1.5 microtype config. file: Bitstream Charter (RS)] +%<blg> {mt-blg.cfg}[2007/07/14 v1.0 microtype config. file: Bitstream Letter Gothic (RS)] +%<cmr> {mt-cmr.cfg}[2013/05/19 v2.2 microtype config. file: Computer Modern Roman (RS)] +%<pad> {mt-pad.cfg}[2005/11/07 v1.5 microtype config. file: Adobe Garamond (RS)] +%<pmn> {mt-pmn.cfg}[2009/11/14 v1.3 microtype config. file: Adobe Minion (HH/KK)] +%<ppl> {mt-ppl.cfg}[2005/11/16 v1.6 microtype config. file: Palatino (RS)] +%<ptm> {mt-ptm.cfg}[2006/04/20 v1.7 microtype config. file: Times (RS)] +%<ugm> {mt-ugm.cfg}[2006/01/26 v1.0 microtype config. file: URW Garamond (RS)] +%<msa> {mt-msa.cfg}[2006/02/04 v1.1 microtype config. file: AMS symbols (a) (RS)] +%<msb> {mt-msb.cfg}[2005/06/01 v1.0 microtype config. file: AMS symbols (b) (RS)] +%<euf> {mt-euf.cfg}[2006/07/03 v1.1 microtype config. file: AMS Euler Fraktur (RS)] +%<eur> {mt-eur.cfg}[2006/07/31 v1.1 microtype config. file: AMS Euler Roman (RS)] +%<eus> {mt-eus.cfg}[2006/07/28 v1.2 microtype config. file: AMS Euler Script (RS)] +%<zpeu> {mt-zpeu.cfg}[2006/05/04 v1.0 microtype config. file: Adobe Euro (RS)] +%<euroitc> {mt-euroitc.cfg}[2006/05/04 v1.0 microtype config. file: ITC Euro (RS)] +%<mvs> {mt-mvs.cfg}[2006/07/05 v1.1 microtype config. file: Marvosym Euro (RS)] +%</config> +% +%<*driver|docsty> +%<*driver> +\documentclass[10pt,a4paper]{ltxdoc} +\makeatletter +%</driver> +% Let's abolish CM! We use Charter and Letter Gothic +% (for the pre-built documentation on CTAN): + \usepackage[T1]{fontenc} + \usepackage[charter]{mathdesign} + \def\rmdefault{bch} % not scaled + \def\sfdefault{SourceSansPro-TLF} + \def\SourceSansPro@scale{1.02} + \def\ttdefault{blg} + {\ttfamily\selectfont + \DeclareFontShape{T1}{blg}{k}{n}{<-> ssub * blg/b/n}{}} + \usepackage{textcomp} +\usepackage{ifpdf,ifluatex,ifxetex} +%<*!docsty> +\ifxetex\else +\usepackage[latin1]{\ifluatex lua\fi inputenc} +\fi +%</!docsty> +\GetFileInfo{\jobname.dtx} +\usepackage[expansion=false,kerning=true]{microtype}[\filedate] + \DeclareMicrotypeSet*[protrusion] + { doc } + { encoding = {*, TS1, OMS}, + family = {rm*, 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}} + \ifpdf + \SetTracking[no ligatures={f,s,c}]{encoding=T1,family=mwr}{120} + \fi} + {\IfFileExists{yfonts.sty} + {\usepackage{yfonts} + \ifpdf + \SetTracking[no ligatures={f,s,c}]{encoding=LY,family=yfrak}{120} + \fi} + {\def\textfrak{\rule{.5em}{1.5ex}\@gobble}}} +\tolerance=700 +\ifpdf + \ifluatex % microtype.dtx finally compiles with 0.35! + \microtypesetup{kerning=false} + \def\pdftexversion{200} % in TeX Live 2015, they let this to \luatexversion + \fi + \ifnum\pdftexversion<140 \else % pdftex 1.40, including textmatrix patch, + \microtypesetup{expansion=alltext,step=1} % hence we can activate expansion ... + \tolerance=300 % ... and make TeX almost as intolerant as it normally is + \g@addto@macro\macrocode{\microtypesetup{expansion=false}} + \pdfminorversion=5 % for the OCGs (default since TeX Live 2010) + \fi + % bonus material + \InputIfFileExists{microtype-logo.dtx}\relax\relax + \InputIfFileExists{microtype-lssample.dtx}\relax\relax +\else + \let\lsstyle\relax +\fi +\ifxetex + \microtypesetup{kerning=false} +\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} +% general layout +\frenchspacing +\DeclareRobustCommand\textoractual[2]{\ifpdf + \pdfliteral direct{/Span<</ActualText(#2)>>BDC}#1\pdfliteral direct{EMC}% + \else #1\fi} +\expandafter\newif\csname ifcmr\endcsname +\long\def\@tempa{cmr} +\ifx\rmdefault\@tempa + \cmrtrue + \def\PackageFont{\sffamily} + \def\match{\textbullet} + \usepackage{amssymb} % \varnothing + \let\OrigTeX\TeX + \DeclareRobustCommand\TeX{\textoractual{\OrigTeX}{TeX}} + \setlength\textheight{49\baselineskip} +\else + \def\bfdefault{b} + \def\Module#1{{\color{theblue}\textoractual{$\langle$}{<}\textit{#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}} + \linespread{1.07}\normalfont + \setlength\textheight{48\baselineskip} +\fi +\addtolength\textheight{\topskip} +\setlength\topmargin{5pt} +% sections +%\def\@seccntformat#1{\setbox0\hbox to0pt{\hss\colorbox{theshade}{\space\color{sectioning}\csname the#1\endcsname\strut\space}\hskip\marginparsep}\ht0=0pt \dp0=0pt \box0} +\def\@seccntformat#1{\llap{\csname the#1\endcsname\hskip\marginparsep}} +\def\section{\@startsection {section}{1}{\z@}% + {-3.5ex \@plus -1ex \@minus -.2ex}% + {2.3ex \@plus.2ex}% + {\normalfont\Large\ifcmr\fontseries{bx}\else\fontseries{k}\fi\sffamily\color{sectioning}}} +\def\subsection{\@startsection{subsection}{2}{\z@}% + {-3.25ex\@plus -1ex \@minus -.2ex}% + {1.5ex \@plus .2ex}% + {\normalfont\large\ifcmr\fontseries{bx}\else\fontseries{k}\fi\sffamily\color{sectioning}}} +\def\subsubsection{\@startsection{subsubsection}{3}{\z@}% + {-3.25ex\@plus -1ex \@minus -.2ex}% + {1.5ex \@plus .2ex}% + {\normalfont\normalsize\ifcmr\fontseries{bx}\else\fontseries{k}\fi\sffamily\color{sectioning}}} +\def\paragraph{\@startsection{paragraph}{4}% + {0pt}{8pt plus 2pt minus 1pt}{-1em}% + {\normalfont\normalsize\itshape}} +% title +\def\@maketitle{% + \newpage\null\vskip 2em + \begin{center}\let\footnote\thanks\sffamily + {\huge \@title\par}\vskip 1.5em + {\large \parbox{.33\textwidth}{\centering\@author}% + \parbox{.33\textwidth}{\centering\@date}}% + \vskip2.5em\rule{\textwidth}{.4pt}% + \end{center}\par\vskip1.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.7em}} +\def\l@subsubsection#1#2{% + \leftskip 4.2em + \rightskip 2em plus 2em + \parindent 0pt + {\let\numberline\@gobble{\small #1~[#2]}}} +\def\l@table{\@dottedtocline{1}{0pt}{1.5em}} +\def\@pnumwidth{1.7em} +\ifpdf + \let\ORIGpdfoutline\pdfoutline + \def\special@outlines{attr{/F 01}} + \def\normaloutline {\protected@write\@outlinefile{}{\let\pdfoutline \ORIGpdfoutline}} + \def\specialoutline{\protected@write\@outlinefile{}{\def\pdfoutline{\ORIGpdfoutline\special@outlines}}} + \g@addto@macro\appendix{\specialoutline} +\fi +\def\defspecial@toc#1#2#3{\long\def#1{% + \ifpdf\phantomsection\specialoutline\pdfbookmark[1]{#2}{#3}\normaloutline\fi + \section*{#2}\@mkboth{\textls*[70]{\MakeUppercase{#2}}}{}% + \@starttoc{#3}}} +\defspecial@toc\tableofcontents\contentsname{toc} +\defspecial@toc\listoftables\listtablename{lot} +% 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 +\long\def\@makefntext#1{% + \leftskip 0pt + \parindent 0pt + \everypar{\parindent 0pt}% + \leavevmode\llap{\@thefnmark\hskip\marginparsep}#1} +\renewcommand\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) % still? +\setlength\fboxrule{0.4pt} +\setlength\fboxsep{3pt} +\setlength\arrayrulewidth{0.4pt} +% tables +\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}% + Numbers in upright shape refer to the page where the corresponding entry is described + (bold face) resp. occurs. Numbers in italics refer to the code line + where the corresponding entry is defined (underlined) resp. used.} +\GlossaryPrologue{\section{Change history}\label{sec:changes}\vspace*{-\multicolsep}} + %\setcounter{finalcolumnbadness}{100} + %\raggedcolumns +\setcounter{IndexColumns}{2} +\def\IndexMin{12\baselineskip} +\g@addto@macro\IndexParms{% + \footnotesize + \def\indexspace#1{% + \end{multicols} + \vspace*{-2\baselineskip}% + \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] + \GlossaryParms \rightskip 15pt plus 5pt + \let\item\@idxitem + \ignorespaces \makeatletter \scan@allowedfalse}% + \def\subitem{\par\hangindent 15pt}% + \def\subsubitem{\subitem\hspace*{7.5pt}}} +% 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} +\def\AltMacroFont{\ttfamily\footnotesize} +\def\PrintMacroName#1{\strut\MacroFont\string #1\hskip15pt} +\def\ImplementationSettings{% + \linespread{1}% + \hfuzz=10pt + \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}}% + \CatIndex{#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 hyperpage}} +\def\CatIndeX#1#2#3{\index{#2\actualchar#1\ (#3)\encapchar hyperpage}} +\def\SpecialOptionIndex#1{\@bsphack + \index{\quotechar/#1% sort options as `Symbols' + \actualchar{\protect\ttfamily#1}\encapchar usage}% + \CatIndex{#1}{option}\@esphack} +\def\SpecialUsageIndex#1{\@bsphack + \index{\quotechar1% sort commands as `Numbers' + \actualchar\string\verb + \quotechar*\verbatimchar\string#1\verbatimchar\encapchar usage}% + {\let\special@index\index\SpecialIndex@{#1}{\encapchar usage}}\@esphack} +\def\SpecialEnvIndex#1{\CatIndex{#1}{environment}} +%</driver|docsty> +% microtype's index style (microtype-gind.ist): +%<docist>actual '=' +%<docist>quote '!' +%<docist>level '>' +%<docist>preamble "\n \\begin{theindex} \n \\makeatletter\\scan@allowedfalse\n\\indexspace" +%<docist>postamble "\n\n \\end{theindex}\n" +%<docist>item_x1 "\\efill \n \\subitem " +%<docist>delim_0 "\\pfill " +%<docist>delim_1 "\\pfill " +%<docist>heading_prefix "{\\bfseries\\hfil " +%<docist>heading_suffix "\\hfil}\\nopagebreak\n" +%<docist>headings_flag 1 +%<docist>symhead_positive "Options" +%<docist>numhead_positive "Commands" +%<*driver|docsty> +\def\PrintDescribeMacro#1{\strut\MacroFont\color{thegreen}\string #1} +\def\PrintDescribeEnv#1{\strut\MacroFont\bslash begin\{{\color{thegreen}#1}\}% + \\*[.25\baselineskip]\strut\bslash end\{{\color{thegreen}#1}\}} +\def\PrintDescribeOption#1{\strut\MacroFont\color{thered}#1} +\def\Indexing{\let\special@index\codeline@wrindex} +\def\NoIndexing{\let\special@index\@gobble} +\def\GeneralChanges#1{\edef\generalname{\if*#1 General\else#1\fi}}% mind the space! +\DeclareRobustCommand\key[1]{\textcolor{thered}{\ttfamily#1}} +\DeclareRobustCommand\pkg[1]{{\PackageFont#1}\@bsphack\CatIndex{#1}{package}\@esphack} +\DeclareRobustCommand\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 +{\catcode`\"\active + \gdef\verbatim#1 + {\catcode`\"\active \def"##1"{\colorbox{theshade}{% + \textrm{Text lost! Please install the \pkg{listings} package.}}}% + \@beginparpenalty\predisplaypenalty\@verbatim\MacroFont + \frenchspacing\@vobeyspaces\expandafter\@xverbatim\@gobble}} +\IfFileExists{listings.sty}{ + \usepackage{listings} + \lstset{ + 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,\microtypecontext,\textmicrotypecontext, + \textls,\lsstyle,\lslig,\Microtype@Hook}, + keywordstyle=[0]\color{thegreen}, + keywords=[1]{protrusion,expansion,activate,DVIoutput,draft,final,verbose, + config,factor,auto,stretch,shrink,step,selected,unit,tracking,kerning, + spacing,letterspace,babel,context, + %defersetup,copyfonts,enable,disable,% undocumented + noligatures,outerspacing,outerkerning}, % 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 + } + \let\verbatim\relax + \lstnewenvironment{verbatim}[1][]{\lstset{##1}}{} + \ifpdf \IfFileExists{dummy-space.pfb}{% + \pdfmapline{=dummy-space <dummy-space.pfb} + \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} + }\relax \fi +}{ + \let\lstset\@gobble +} +\def\todo#1{\changes{zTo Do}{0000/00/00}{#1}% + \marginpar{\rightskip2\marginparsep plus1em\hangindent1.5em\hangafter-2 + \smash{\rlap{\raisebox{-3.3ex}{\colorbox{thered}{\Large\color{white}!}}}}% + \footnotesize\textcolor{thered}{#1}}} +\let\todo\@gobble +\newcommand\microtypesample[1]{\begin{quote}#1\end{quote}} +\let\emptypdfpageresources\relax +% fancy PDF document +\ifpdf + \ifx\eTeXversion\@undefined \else % errors when not using etex (conflict with multicol) + \ifnum\pdftexversion < 140 % no longer required with pdftex 1.40 + \usepackage{pdfcolmk} + \fi\fi + \usepackage[bookmarks,bookmarksopen,pdfdisplaydoctitle, + colorlinks,linkcolor=theblue,citecolor=theblue,urlcolor=thered, + hyperindex=false,hyperfootnotes=false] + {hyperref} + \usepackage{hyperxmp} + \usepackage{attachfile} + \usepackage{pdfpages} + \hypersetup{ + pdftitle={The microtype package}, + pdfauthor={R Schlicht <w.m.l@gmx.net>}, + pdfsubject={Subliminal refinements towards typographical perfection}, + pdfkeywords={TeX, LaTeX, pdfTeX, LuaTeX, XeTeX, typography, micro-typography, + character protrusion, margin kerning, optical alignment, font expansion, + font scaling, hz, kerning, spacing, glue, letterspacing, tracking, ligatures}, + pdfcopyright={\textcopyright\ 2004--2018 R Schlicht\012% + 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.\012% + This work has the LPPL maintenance status `author-maintained'.}, + pdflicenseurl={http://www.latex-project.org/lppl/} + } + \pdfcatalog{/Lang(en-GB)} + \ifnum\pdftexversion < 130 \else + \IfFileExists{hypdestopt.sty}{\usepackage{hypdestopt}}\relax\fi + \def\usage#1{\textbf{\hyperpage{#1}}}% for indexing of \DescribeMacro ... + \def\changes@#1#2#3{% ... 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 hyperpage}}% + \@tempa\endgroup\@esphack} + \def\theCodelineNo{% ... and everything else + \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\main#1{\underline{\itshape\hyperlink{L:#1}{#1}}} + \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\SpecialIndex#1{\@bsphack\special@index{\expandafter\@gobble + \string#1\actualchar + \string\verb\quotechar*\verbatimchar\string#1\verbatimchar + \encapchar codeline}% + \@esphack} + \def\ctanurl#1{Available from \acronym{CTAN} at + \href{http://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:<w.m.l@gmx.net>\%20Robert\%20Schlicht?subject=[microtype\%20\fileversion]} + {\texttt{w.m.l@gmx.net}}} + % the samples in the introduction, utilising nested optional content groups (aka. layers): + \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}} + \renewcommand\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{}} + \fi +\else + \usepackage{url} + \newcommand\hyperref[2][]{#2} + \let\hyperpage\@firstofone + \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\texttt + \newcommand\textattachfile[3][]{#3 \textit{[File \file{#2} not attached, + because \file{microtype.dtx} hasn't been compiled with \pdftex.]}} +\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\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}}} +%\DeclareRobustCommand\@contributor[2]{\textit{#1}% +% \expandafter\index\expandafter{\@getlastname#1 \@nil\actualchar %\href{mailto:#2}{#1} +% #1 (contributor)\encapchar hyperpage}} +%\def\@getlastname#1 #2\@nil{\ifx\@nil#2\@nil#1\else\@getlastname#2\@nil\fi} +%<*driver> +\CodelineIndex +\EnableCrossrefs +\RecordChanges +%\OnlyDescription +\begin{document} + \DocInput{\jobname.dtx} +\end{document} +%</driver> +%</driver|docsty> +% \fi +% +% ^^A ------------------------------------------------------------------------- +%\GeneralChanges* +%\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} +%\GeneralChanges{Documentation} +%\changes{v1.9b}{2006/01/13}{activate expansion in the distributed <PDF>} +%\changes{v2.2}{2007/04/01}{logo transparency and amusement} +% ^^A Adobe Reader 8.0 had serious bugs with transparency. Fixed in 8.1. +% +% \GetFileInfo{microtype.dtx} +% \title{\ifx\printlogo\undefined\else\printlogo\fi +% \textls[40]{The \microtype\ package}\\[.3\baselineskip]\large +% Subliminal refinements towards typographical perfection} +% \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}). +% +%\bigskip\noindent +% This package is copyright \textcopyright\ 2004\kern.09em--2018 R Schlicht. +% It may be distributed and/or modified under the conditions of the +% \IfFileExists{lppl.tex}{\hyperref[LPPL:LPPL]}{\href{http://www.latex-project.org/lppl/}} +% {\LaTeX\ Project Public License}, +% either version~1.3c of this license or (at your option) any later version. +% This work has the <LPPL> maintenance status `author-maintained'. +%\end{abstract} +% +% +%\newpage +%\emptypdfpageresources ^^A layers of the logo +%{\sffamily\def\familydefault{\sfdefault}\ifcmr\else\def\bfdefault{sb}\fi +% \tableofcontents +% \listoftables +%} +% +% +%\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 +% 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 this feature 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 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, preceded by an asterisk +% if it is contingent on the \TeX\ engine, version and/or the output mode). +% +% +%\subsection{Enabling the micro-typographic features}\label{sub:options-microtype} +% +%\Describe{Option}{protrusion} +% {*true,false,compatibility,nocompatibility,:font set name} +%\DescribeOption{expansion} +% These are the main options to control the level of micro-typographic +% refinement which the fonts in your document should gain. By default, the +% package is moderately greedy: character protrusion will always be enabled, +% font expansion will only be disabled when the fonts cannot be expanded +% automatically, that is, with \pdftex\ versions older than 1.20 or in <DVI> +% output mode (see section~\ref{sub:options-misc}), or with \xetex. +% In other words, \microtype\ will try to apply as much micro-typography as +% can safely be expected to work under the respective conditions (hence, it is +% usually not necessary to load the package with different options for <PDF> +% resp. <DVI> mode). +% +% Protrusion and expansion may be enabled or disabled independently from each +% other by setting the respective key to |true| resp. |false|. The +% \opt{activate} option +%\DescribeOption{activate} +% is a shortcut for setting both options at the same time. Therefore, the +% following lines all have the same effect (when creating <PDF> files with a +% recent version of \pdftex): +%\begin{verbatim} +%\usepackage[protrusion=true,expansion]{microtype} +%\end{verbatim} +%\begin{verbatim} +%\usepackage[activate={true,nocompatibility}]{microtype} +%\end{verbatim} +%\begin{verbatim} +%\usepackage{microtype} +%\end{verbatim} +%\smallskip +% With activated font expansion and/or character protrusion, line breaks +% (and consequently, page breaks) may turn out differently. If this is not +% desired -- because you are re-typesetting a book whose pagination must not +% change -- you may pass the value |compatibility| to the \opt{protrusion} +% and/or \opt{expansion} options. Typographically, however, the results will be +% suboptimal, hence the default value is |nocompatibility|. +% +% Finally, you may also specify the name of a font set to which character +% protrusion and/or font expansion should be restricted. See +% section~\ref{sec:font-sets} for a detailed discussion. Specifying a font set +% for a feature implicitly activates this feature. +% +%\medskip +%\Describe{Option}{tracking}{true,!false,:font set name} +% This option will systematically change the tracking of the fonts specified in +% the active font set (by default, all small capitals). +% 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 <PDF> 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} +%\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}}*2{@{}L{43pt}}*4{@{}L{37pt}}@{}} +% \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 +% & \footnotesize Expansion +% & \footnotesize (= auto) +% & \footnotesize Kerning +% & \footnotesize Spacing +% & \footnotesize Tracking\\ +%\cmidrule(r){1-1}\cmidrule(r){2-2}\cmidrule(r){3-3}\cmidrule(r){4-4} +%\cmidrule(r){5-5}\cmidrule(r){6-6}\cmidrule(r){7-7}\cmidrule(r){8-8}\cmidrule{9-9} +% \pdftex +% & $\less$ 0.14f & <DVI>/<PDF> & _ & _ & _ & _ & _ & _\\ +% & $\geq$ 0.14f & <DVI>/<PDF> & ! & ? & _ & _ & _ & _\\ +% & $\geq$ 1.20 & <DVI> & ! & ? & _ & _ & _ & _\\ +% & & <PDF> & ! & ! & ! & _ & _ & _\\ +% & $\geq$ 1.40 & <DVI> & ! & ? & _ & ? & ? & _\\ +% & & <PDF> & ! & ! & ! & ? & ? & ?\\^^A\,\textsuperscript{\itshape a}\\ +%\cmidrule(r){1-3} +% \luatex ^^A we will have to re-model kerning, spacing and tracking with \luatex +% & $\geq$ 0.30 & <DVI> & ! & ? & _ & _ & _ & _\\ +% & & <PDF> & ! & ! & ! & _ & _ & _\\ +% & $\geq$ 0.62 & <DVI> & ! & ? & ?\,\textsuperscript{\itshape a} & _ & _ & ?\,\textsuperscript{\itshape a}\\ +% & & <PDF> & ! & ! & ! & _ & _ & ?\\ +%\cmidrule(r){1-3} +% \let\textoractual\@firstoftwo ^^A why? +% \xetex +% & $\geq$ 0.9997 & <PDF> & ! & _ & _ & _ & _ & _\\ +%\bottomrule +%\end{tabular}^^A +%\vskip4pt\footnotesize +%\hskip-.8em +% ! = enabled\quad +% ? = not enabled\quad +% _ = not available +%\hfill +% ^^A \textit{a}\quad $\geq$ 1.40.4 recommended +% \textit{a}\quad for legacy (<TFM>) fonts only +%\vskip3pt +%\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}{unit}{!character,:dimension} +% This option is described in section~\ref{sub:protrusion}, apropos the command +% \cs{SetProtrusion}. Use with care. +% +% +%\subsection[Font expansion] +% {Font expansion \requires{\pdftex~0.14f,\luatex~0.30}} +% \label{sub:options-expansion} +% +%\Describe{Option}{auto}{*true,false} +% Beginning with \pdftex\ version 1.20 (inherited by \luatex), the expanded +% instances of the fonts may be calculated automatically and at run-time instead +% of the user having to prepare them in advance. This option is true +% by default provided that you are using a \TeX\ engine with this capability +% and the output mode is <PDF>. +% 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 +% +%\changes{v1.9}{2005/08/27}{add remark about Type\,1 fonts required for +% automatic font expansion} +% With \pdftex, automatic font expansion does not work with bitmap fonts. Therefore, if you +% are using the Computer Modern Roman fonts in <T1> encoding, +%\iffalse +% \footnote{ +% En passant, it may be noted that Type\,1 format and <T1> encoding are in +% no other way related than that both start with a `T' and end with a `1'.} +%\fi +% you should either install the \pkg{cm-super} fonts or use the Latin Modern +% fonts (package \pkg{lmodern}). +%\changes{v2.7}{2017/07/06}{add remark about automatic font expansion with \texttt{dvilualatex}} +% With \luatex, expansion is always automatic, and also works in <DVI> mode +% (|dvilualatex|), however, because postprocessing programs like |dvips| +% or |dvipdfmx| are not (yet) capable of dealing with OpenType fonts, +% only for legacy fonts. +% +%\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 +% <PDF> file, which may increase the file size quite dramatically. Therefore, +% in case you are using a pre-1.40 \pdftex\ version, \opt{step} is by default +% set to one fifth of the smaller value of \opt{stretch} and \opt{shrink}. +% +%\medskip +%\Describe{Option}{selected}{true,!false} +% When applying font expansion, it is possible to restrict the expansion of some +% characters that are more sensitive to deformation than others (\eg, the `O', +% in contrast to the `I'). This is called \emph{selected expansion}, and its +% usage 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:option-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. +% +% +%\enlargethispage{\baselineskip} ^^A layout +%\subsection{Miscellaneous options}\label{sub:options-misc} +% +%\Describe{Option}{DVIoutput}{true,*false} +% \pdftex\ and \luatex\ are not only able to generate <PDF> output but can also +% spit out <DVI> files.\footnote{ +% Recent \TeX\ systems are using \pdftex\ as the default engine even for +% <DVI> output.} +% The latter can be ordered with the option \opt{DVIoutput}, which will set +% \cmd\pdfoutput\ to zero. +% For \xetex, this option is not applicable. +% +%\changes{v1.5}{2004/12/15}{add note about \opt{DVIoutput} option} +% Note that this will confuse packages that depend on the value of +% \cmd\pdfoutput\ if they were loaded earlier, as they had been made believe +% that they were called to generate <PDF> output where they actually weren't. +% These packages are, among others: \pkg{graphics}, \pkg{color}, +% \pkg{hyperref}, \pkg{pstricks} and, obviously, \pkg{ifpdf}. Either load these +% packages after \microtype\ or else issue the command |\pdfoutput=0| earlier +% -- in the latter case, the \opt{DVIoutput} option is redundant. +% +% When generating <DVI> files, font expansion has to be enabled explicitly. +% With \pdftex, neither letterspacing nor \emph{automatic} font expansion will work because +% the postprocessing drivers (|dvips|, |dvipdfm|, etc.) resp. the <DVI> viewer +% are not able to generate the fonts on the fly. +% +%\changes{v2.0}{2006/11/28}{add remark about `\opt{draft}' option disabling \microtype\ +% (noted by \contributor Michalis Miatidis <miatidis\at informatik.rwth-aachen.de>)} +% ^^A private mail, 2006/11/26 +%\medskip +%\Describe{Option}{draft}{true,!false} +%\DescribeOption{final} +% If the \opt{draft} option is passed to the package, \emph{all +% micro-typographic extensions will be disabled}, which may lead to different +% line, and hence page, breaks. The \opt{draft} and \opt{final} options may +% also be inherited from the class options; of course, you can override them in +% the package options. E.g., if you are using the class option |draft| to +% show any overfull boxes, you should load \microtype\ with the |final| +% 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. 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|. +% +%\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. +%\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. +% Using this command, you could for instance temporarily disable font expansion +% by saying: +%\begin{verbatim} +%\microtypesetup{expansion=false} +%\end{verbatim} +% +% +%\section{Selecting fonts for micro-typography}\label{sec:font-sets} +% +% By default, character protrusion will be applied to all text fonts used in +% the document, and a basic set of fonts will be subject to font +% expansion. You may want to customise which fonts should get the benefit of +% micro-typographic treatment. This can be achieved by declaring and activating +% `font sets'; these font sets are specified via font attributes that have to +% match. +% +%\medskip +%\Describe{Macro}{\DeclareMicrotypeSet}{?features,set name,set of fonts} +%\DescribeMacro{\DeclareMicrotypeSet*} +% This command declares a new set of fonts to which the micro-typographic +% extensions should be applied. The optional argument may contain a +% comma-separated list of features to which this set should be restricted. +% The starred version of the command declares \emph{and} activates the font +% set at the same time. +% +% \paragraph{The set of fonts} is specified by assigning values to the <NFSS> +% font attributes: encoding, family, series, shape and size (cf.~\cite{fntguide}). +% Let's start with an example. In the main configuration file \file{microtype.cfg}, +% a font set called `|basictext|' is defined as follows: +%\begin{verbatim} +%\DeclareMicrotypeSet{basictext} +% { encoding = {OT1,T1,T2A,LY1,OT4,QX,T5,EU1,EU2,TU}, +% family = {rm*,sf*}, +% series = {md*}, +% size = {normalsize,footnotesize,small,large} +% } +%\end{verbatim} +% If you now call +%\begin{verbatim}[deletekeywords={[1]{protrusion}}] +%\UseMicrotypeSet[protrusion]{basictext} +%\end{verbatim} +% in the document's preamble, only fonts in the text encodings, roman or sans +% serif families, normal (or `medium') series, and in sizes called by +% \cmd\normalsize, \cmd\footnotesize, \cmd\small\ or \cmd\large, will be +% protruded. Math fonts, on the other hand, will not, since they are in another +% encoding. Neither will fonts in bold face, or huge fonts. Etc. +% +% If an attribute list is empty or missing -- like the `shape' attribute +% in the above example -- it does not constitute a restriction. In other +% words, this is equivalent to specifying \emph{all} possible values for that +% attribute. +% Therefore, the predefined set `|alltext|', which is declared as: +%\begin{verbatim} +%\DeclareMicrotypeSet{alltext} +% { encoding = {OT1,T1,T2A,LY1,OT4,QX,T5,TS1,EU1,EU2,TU} } +%\end{verbatim} +% is far less restrictive. The only condition here is that the encoding must +% match. +% +% If a value is followed by an asterisk (like `|rm*|' and `|sf*|' in the first +% example), it does not designate an <NFSS> code, but will be translated into +% the document's |\|\meta{value}|default|, \eg, \cmd\rmdefault.\footnote{ +% These translations will take place \cmd\AtBeginDocument, which means that +% changes to the defaults inside the preamble will also be taken into account. +% Only in cases where you change font defaults \cmd\AtBeginDocument\ yourself, +% you need to load \microtype\ after these changes.} +% A single asterisk means |\|\meta{attribute}|default|, \eg, +% \cmd\encodingdefault, respectively \cmd\normalsize\ for the size axis. +% Sizes may either be specified as a dimension (`|10|' or `|10pt|'), or as a +% size selection command \emph{without} the backslash. You may also specify +% ranges (\eg, `|small-Large|'); while the lower boundary is included in the +% range, the upper boundary is not. Thus, `|12-16|' would match 12\,pt, +% 13.5\,pt and 15.999\,pt, for example, but not 16\,pt. You are allowed to omit +% the lower or upper bound (`|-10|', `|large-|'). +% +% Additionally to this declaration scheme, you can add single fonts to +% a set using the `|font|' key, which expects the concatenation of all font +% attributes, separated by forward slashes, \ie, +%`|font|\,|=|\,\meta{encoding}|/|\meta{family}|/|\meta{series}|/|\meta{shape}|/|\meta{size}'. +% This allows you to add fonts to the set that are otherwise disjunct from it. +% For instance, if you wanted to have the roman family in all sizes protruded, +% but only the normal sized, possibly italic, typewriter font (in contrast to, +% say, the small one), this is how you could declare the set: +%\begin{verbatim}[deletekeywords={[1]{protrusion}}] +%\DeclareMicrotypeSet[protrusion] +% { myset } +% { encoding = T1, +% family = rm*, +% font = {T1/tt*/m/n/*, +% T1/tt*/m/it/*} } +%\end{verbatim} +% As you can tell from the example, the asterisk notation is also permitted for +% the |font| key. A single asterisk is equivalent to `|*/*/*/*/*|', \ie, the +% normal font. Size selection commands are possible, too, however, ranges are +% not allowed. +% +%\medskip\noindent +% Table~\ref{tab:predefined-font-sets} lists the eleven 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} +% +%\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}}} +%\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{80pt}*2{L{40pt}}L{43pt}L{67pt}@{}} +% \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} +% |all| +% & ! +% & ! +% & ! +% & ! +% & ! \\ +%\cmidrule(r){1-1} +% |alltext|\linebreak(|allmath|) +% & Text encodings, <TS1>\linebreak (<OML>, <OMS>, <U>) +% & ! +% & ! +% & ! +% & ! \\ +%\cmidrule(r){1-1} +% |alltext-nott|\linebreak(|allmath-nott|) +% & Text encodings, <TS1>\linebreak (<OML>, <OMS>, <U>) +% & /\cmd\rm|*|/,\linebreak/\cmd\sf|*|/ +% & ! +% & ! +% & ! \\ +%\cmidrule(r){1-1} +% |basictext|\linebreak(|basicmath|) +% & Text encodings \linebreak (<OML>, <OMS>) +% & /\cmd\rm|*|/,\linebreak/\cmd\sf|*|/ +% & /\cmd\md|*|/ +% & ! +% & /\cmd\normalsize/, /\cmd\footnotesize/, /\cmd\small/, /\cmd\large/\\ +%\cmidrule(r){1-1} +% |smallcaps| +% & Text encodings +% & ! +% & ! +% & /\cmd\sc|*|/,/si/,/scit/ +% & ! \\ +%\cmidrule(r){1-1} +% |footnotesize| +% & Text encodings, <TS1> +% & ! +% & ! +% & ! +% & |-|/\cmd\small/\\ +%\cmidrule(r){1-1} +% |scriptsize| +% & Text encodings, <TS1> +% & ! +% & ! +% & ! +% & |-|/\cmd\footnotesize/\\ +%\cmidrule(r){1-1} +% |normalfont| +% & /\cmd\encoding|*|/ +% & /\cmd\family|*|/ +% & /\cmd\series|*|/ +% & /\cmd\shape|*|/ +% & /\cmd\normalsize/\\ +%\bottomrule +%\end{tabular} +%\vskip4pt\footnotesize +% `Text encodings' = <OT1>, <T1>, <T2A>, <LY1>, <OT4>, <QX>, <T5>, <EU1>, <EU2>, <TU> +%\hfill +% `/\bslash\,\dots|*|/' = `/\bslash\,\dots|default|/' +%\vskip3pt +%\end{minipage}^^A +%}\kern-\dimexpr\fboxsep+\fboxrule\relax ^^A end \fcolorbox +%\end{table} +% +%\ifcmr\else\pagebreak\fi ^^A layout +%\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 used for character protrusion and additional kerning, the +% `|basictext|' 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 <T1> encoding:~|029|, |"1D|, |'35|). +% \mbox{8-bit} (and even <UTF-8>) characters may be entered directly or in +% \LaTeX's traditional \mbox{7-bit} notation: both |\"A| and \expandafter|\"A| +% are valid, provided the character is actually declared in both the input and +% the font encoding. +% With \luatex\ or \xetex, you may additionally specify a (font-specific) +% glyph name, prefixed with `|/|' (\eg, the `fl' ligature as |/f_l|). +% Note that you also have the possibility to declare lists +% of characters that should inherit settings (see section~\ref{sub:inherit}). +% +%\subsection[Character protrusion] +% {Character protrusion \requires{\pdftex~0.14f,\luatex~0.30,\xetex~0.9997}} +% \label{sub:protrusion} +% +%\Describe{Macro}{\SetProtrusion}{?options,set of fonts,protrusion settings} +% Using this command, you can set the protrusion factors for each character of a +% font or a set of fonts. A very incomplete example would be the following: +%\begin{verbatim} +%\SetProtrusion +% { encoding = T1, +% family = cmr } +% { A = {50,50}, +% \textquoteleft = {700, } } +%\end{verbatim} +% which would result in the character `A' being protruded by 5\% of its width +% on both sides, and the left quote character by 70\% of its width into the +% left margin. This would apply to all font shapes, series and sizes of the +% <T1>~encoded Computer Modern Roman family. +% +%\paragraph{The protrusion settings} +% consist of \meta{character}\,|=|\,\meta{protrusion factors} pairs. +% The protrusion factors designate the amount that a character should be +% protruded into the left margin (first value) respectively into the right +% margin (second value). By default, the values are relative to the character +% widths, so that a value of 1000 means that the character should be shifted +% fully into the margin, while, for example, with a value of 50 it would be +% protruded by 5\% of its width. Negative values are admitted, as well as +% numbers larger than 1000 (but effectively not more than \EM{1} of the font). +% You may omit either number if the character should not be protruded on that +% side, but must not drop the separating comma. +% +%\paragraph{Options:} +%\begin{options} +% \item[\key{name}] You may assign a name to the protrusion settings, so that you +% are able to load it by another list. +% \item[\key{load}] You can load another list (provided, you assigned +% a name to it) before the current list will be loaded, so that the +% fonts will inherit the values from the loaded list. +% \par +% In this way, the configuration may be simplified considerably. You can for +% instance create a default list for a font; settings for other shapes +% or series can then load these settings, and extend or overwrite them +% (since the value that comes last will take precedence). Font settings +% will be loaded recursively. +% The following options will affect all loaded lists, in other words, +% any options from the loaded lists will be ignored: +%\changes{v1.8}{2005/06/23}{add example for \texttt{factor} option} +% \item[\key{factor}] This option can be used to influence all protrusion +% factors of the list, overriding any global \opt{factor} setting (see +% section~\ref{sub:options-protrusion}). For instance, if you want fonts +% in larger sizes to be protruded less, you could load the normal lists, +% just with a different factor applied to them: +%\begin{verbatim} +%\SetProtrusion +% [ factor = 700, +% load = cmr-T1 ] +% { encoding = T1, +% family = cmr, +% size = large- } +% { } +%\end{verbatim} +% \item[\key{unit}] By default, the protrusion factors are relative to the +% respective character's width. The |unit| option may be used to override +% this and make \microtype\ regard all values in the list as thousandths +% of the specified width. Issuing, for instance, `|unit=1em|' would have +% the effect that a value of, say, 50 now results in the character being +% protruded by 5\% of an em of the font (thus simulating the internal +% measuring of \pdftex's \cmd\lpcode\ and \cmd\rpcode\ primitives). +% The default behaviour can be restored with |unit=character|.\footnote{ +% The |unit| option can even be passed globally to the package (cf. +% section~\ref{sub:options-protrusion}). +% However, all provided settings are created under the assumption +% that the values are relative to the character width. Therefore, you +% should only change it if you are certain that the +% default settings will not be used in your document.} +% \item[\key{preset}] Presets the protrusion codes of all characters to the +% specified values (|={|\meta{left}|,|\meta{right}|}|), possibly +% scaled by a |factor|. A |unit| setting will only be taken into account +% if it is not |=character|. +% \item[\key{inputenc}] Selects an input encoding that should apply to this +% list, regardless of what the document's input encoding is. You may +% specify any encoding that can be loaded via the \pkg{inputenc} package, +% \eg, |ansinew|, |koi8-r|, |utf8|. +% \item[\key{context}] The scope of the list may be limited to a certain +% context. For further details, see section~\ref{sec:context}. +%\end{options} +% +% +%\subsection[Font expansion] +% {Font expansion \requires{\pdftex~0.14f,\luatex~0.30}} +% \label{sub:expansion} +% +%\Describe{Macro}{\SetExpansion}{?options,set of fonts,expansion settings} +% By default, all characters of a font are allowed to be stretched or shrunk by +% the same amount. However, it is also possible to limit the expansion of +% certain characters if they are more sensitive to deformation. This is the +% purpose of the \cs{SetExpansion} command. Note that it will only have an +% effect if the package has been loaded with the \opt{selected} option (cf. +% section~\ref{sub:options-expansion}). Otherwise, the expansion settings will +% be ignored~-- unlike the options in the optional first argument, which will +% still be evaluated. +% If the \opt{selected} option has been set to true, and settings for a font +% don't exist, font expansion will not be applied to this font at all. Should +% the extraordinary situation arise that you want to employ selected expansion +% in general but for a particular font (set) all characters should be +% expanded or shrunk by the same amount, you would have to declare an empty +% list for these fonts. +% +%\paragraph{The expansion settings} +% consist of \meta{character}\,|=|\,\meta{expansion factor} pairs. +% You may specify one number for each character, which determines the amount +% that a character may be expanded. The numbers denominate thousandths of the +% full expansion. +% For example, if you set the expansion factor for the character `O' to 500, +% it will only be expanded or shrunk by one half of the amount that the rest +% of the characters will be expanded or shrunk. +% While the default value for character protrusion is~0~-- that is, if you +% didn't specify any characters, none would be protruded~-- the default value +% for expansion is 1000, which means that all characters would be expanded by +% the same amount. +% +%\paragraph{Options:} +%\begin{options} +% \item[\key{name}, \key{load}, \key{preset}, \key{inputenc}, \key{context}] +% Analogous to \cs{SetProtrusion}, the optional argument may be used to +% assign a name to the list, to load another list, to preset all +% expansion factors, to set the input encoding, or to determine the +% context of the list (expansion contexts are only possible with \pdftex\ +% version 1.40.4 or newer). +%\changes{v1.8}{2005/04/12}{add example of how to get rid of a widow +% (suggested by \contributor Adam Kucharczyk <adamk\at ijp-pan.krakow.pl>)} +% ^^A private mail, 2005/04/09 +% \item[\key{auto}, \key{stretch}, \key{shrink}, \key{step}] +% These keys can be used to override the global settings from the package +% options (see section~\ref{sub:options-expansion}). If you don't specify +% either one of |stretch|, |shrink| and |step|, their respective global +% value will be used (that is, no calculation will take place). +% +% As a practical example, suppose you have a paragraph containing a 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 +% section~\ref{ssec:font-setup} on page~\pageref{exp-hack}.} +% Also note that \pdftex\ prohibits the use of fonts with different expansion +% limits or steps (even of different fonts) within one paragraph, hence +% the |sloppy| context has 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} +%\medskip\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 +% [ noligatures = {"\anchorarrow{nolig}"f}, +% spacing = {60"\anchorarrow{ispace}"0*,-1"\anchorarrow{istretch}"00*, "\anchorarrow{ishrink}"}, +% outerspacing = {4"\anchorarrow{ospace}"50,2"\anchorarrow{ostretch}"50,1"\anchorarrow{oshrink}"50}, +% outerkerning = {"\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[ noligatures = 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 in another way, this feature allows to modify 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[\key{name}, \key{load}, \key{factor}, \key{preset}, \key{inputenc}, \key{context}] +% 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: +%\pagebreak ^^A layout +%\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:inherit} +% +% \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}. Unless you are using a different encoding or a very +% peculiarly shaped font, there should be no need to change the default +% character inheritance settings. +% +% 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). +% +% +% +%\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 separate 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. +% This package ships with configuration files for a number of font families. +% Table~\ref{tab:fonts} lists them all. +% +%\begin{table}[t]\small +%\changes{v1.6a}{2005/02/02}{add table of fonts with tailored protrusion settings} +%\caption{Fonts with tailored protrusion settings}\label{tab: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{% +% \leftskip 0pt +% \parindent 0pt +% \everypar{\parindent 0pt}% +% \leavevmode\hbox to 15pt{\@thefnmark\hss}#1} +%\let\footnoterule\relax +%\def\fnref#1{\textsuperscript{\itshape\ifpdf\ref*{#1}\else\ref{#1}\fi}} +%\begin{tabular*}{\textwidth}{@{\extracolsep{\fill}}*3l@{}} +% \footnotesize Font family (<NFSS> code) +% & \multicolumn{2}{l}{\footnotesize Features}\\ +%\cmidrule{2-3} +% & \footnotesize Encodings [Scripts] +% & \footnotesize Shapes\\ +%\cmidrule{1-1}\cmidrule{2-2}\cmidrule{3-3} +% Generic +% & <OT1>, <T1>, <T2A>, <LY1>, <QX>, (<TS1>)\footnote{Incomplete\label{fn:incmpl}} +% & n, (it, sl, sc)\fnref{fn:incmpl} \\ +% Computer Modern Roman (|cmr|)\footnote{Aliases: Latin Modern (|lmr|), +% \pkg{ae} (|aer|), \pkg{zefonts} (|zer|), +% \pkg{eco} (|cmor|), \pkg{hfoldsty} (|hfor|)} +% & <OT1>, <OT4>, <T1>, <T2A>, <T5>, <LY1>, <TS1> +% & n, it, sl, sc \\ +% Bitstream Charter (|bch|)\footnote{Aliases: \pkg{mathdesign}/Charter (|mdbch|), +% MicroPress's \pkg{chmath} (|chr|), \pkg{XCharter}} +% & <OT1>, <T1>, <T5>, <LY1>, <TS1> +% & n, it, (sl)\footnote{Settings inherited from italic shape\label{fn:it-sl}}, sc \\ +% Adobe Garamond (|pad|, |padx|, |padj|) +% & <OT1>, <T1>, <LY1>, <TS1> +% & n, it, (sl)\fnref{fn:it-sl}, sc \\ +% <URW> Garamond (|ugm|)\footnote{Aliases: \pkg{mathdesign}/<URW> Garamond (|mdugm|), \pkg{garamondx} (|zgmx|, |zgmj|)} +% & <OT1>, <T1>, <TS1> +% & n, it\\ +% Bitstream Letter Gothic (|blg|)\footnote{Alias: \pkg{ulgothic} (|ulg|)} +% & <OT1>, <T1>, <TS1> +% & n, it \\ +% Adobe Minion (|pmnx|, |pmnj|) +% & <OT1>, <T1>, <T2A>, <LY1>, <TS1> +% & n, it, (sl)\fnref{fn:it-sl}, sc, si\\ +% Palatino (|ppl|, |pplx|, |pplj|)\footnote{Aliases: \pkg{pxfonts} (|pxr|), +% \pkg{qfonts}/QuasiPalatino, \TeX\ Gyre Pagella (|qpl|), +% \pkg{newpx}, <FPL> Neu (|fp9x|, |fp9j|)} +% & <OT1>, <OT4>, <T1>, <LY1>, (<TS1>)\fnref{fn:incmpl} +% & n, it, (sl)\fnref{fn:it-sl}, sc \\ +% Times (|ptm|, |ptmx|, |ptmj|)\footnote{Aliases: \pkg{txfonts} (|txr|), +% \pkg{qfonts}/QuasiTimes, \TeX\ Gyre Termes (|qtm|), +% \pkg{newtx}, \pkg{tempora}} +% & <OT1>, <OT4>, <T1>, <LY1>, <QX>, (<TS1>)\fnref{fn:incmpl} +% & n, it, (sl)\fnref{fn:it-sl}, sc \\ +% Latin Modern Roman +% & <EU1>/<2>, <TU> [Latin, Greek] +% & n, it, (sl)\fnref{fn:it-sl}\\ +% Charis <SIL> +% & <EU1>/<2>, <TU> [Latin, Cyrillic, Greek] +% & n, it, sc\\ +%\iffalse ^^A provided with the EB Garamond package +% <EB> Garamond +% & <EU1>/<2>, <TU> [Latin, Cyrillic, Greek] +% & n, it, sc, si\\ +%\fi +% Palatino Linotype\footnote{Aliases: \TeX\ Gyre Pagella, Palatino <LT> Std, Palatino} +% & <EU1>/<2>, <TU> [Latin] +% & n, it, sc\\ +% Computer Modern math (|cmsy|, |cmm|)\footnote{Aliases: Latin Modern (|lmsy|, |lmm|)} +% & <OML>/<OMS> +% & n/it \\ +% <AMS> symbols (|msa|, |msb|) +% & <U> +% & n\\ +% Euler (|eur|, |eus|, |euf|)\footnote{Alias: \pkg{eulervm} (|zeur|, |zeus|)} +% & <U> +% & n\\ +% Euro symbols (Adobe, <ITC>, \pkg{marvosym}) +% & <U>/<OT1> +% & n, it \\ +%\bottomrule +%\end{tabular*}^^A +%\end{minipage}^^A +%}\kern-\dimexpr\fboxsep+\fboxrule\relax ^^A end \fcolorbox +%\end{table} +% +%\medskip +%\Describe{Macro}{\DeclareMicrotypeVariants}{list of suffixes} +%\DescribeMacro{\DeclareMicrotypeVariants*} +% On its search for a configuration file, the package will also try to remove +% from the font name a suffix of one or more letters that denotes a `variant' +% of the base font (cf. Karl Berry's \cite{fontname}). It is thus possible to +% put settings for, \eg, the fonts |padx|~(expert set), |padj| (oldstyle +% numerals) and |pad| (plain) into one and the same file \file{mt-pad.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} +%\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 |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|'. +% +% +%\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 <verweyen\at gmail.com>)} +% ^^A private mail, 2006/01/25 +%\medskip\noindent +% Suppose you want the footnote markers in the text to be protruded by a larger +% amount. You could define settings for the numbers: +%\begin{verbatim} +%\SetProtrusion +% [ context = footnote ] +% { font = */*/*/*/scriptsize } % adapt if necessary +% { 1 = { ,650}, 2 = { ,400}, 3 = { ,400}, 4 = { ,400}, 5 = { ,400}, +% 6 = { ,400}, 7 = { ,500}, 8 = { ,400}, 9 = { ,400}, 0 = { ,400} } +%\end{verbatim} +% and have the context changed in the footnote marker command. This command +% differs among the various classes; for the base classes, \eg, \pkg{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 \pkg{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} 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} +% +%\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. +% +%\pagebreak ^^A layout +%\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, you 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. When +% letterspacing text typeset in Fraktur fonts, for example, 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 +% 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 shown in green, inhibited ligatures in red). +% +%\begin{verbatim}[morekeywords={[0]{\kern}}] +%\SetTracking[noligatures={f}]{encoding = LY, family = yfrak}{120} +%\textfrak{\lsstyle Aus:s{\kern0pt}ichts:los{\kern0pt}igkeit} +%\end{verbatim} +%\begin{verbatim} +%\SetTracking[noligatures={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:option-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 prefer to +% forgo \microtype's specialties, you may load the \letterspace\ package +% instead. Both packages should not be used at the same time. +% +% In contrast to \microtype, which requires \LaTeX, the \letterspace\ +% package also works with \pkg{eplain} or even only \pkg{miniltx}: for use with +% \pkg{eplain}, load the package with \cmd\usepackage\ inside the +% \cmd\beginpackages~\dots\ \cmd\endpackages\ environment; with \pkg{miniltx} +% (which does not support package options) simply \cmd\input\ \file{letterspace.sty}. +% +% +%\section[Disabling ligatures] +% {Disabling ligatures \requires{\pdftex~1.30,\luatex~0.30}} +% \label{sec:disable-ligatures} +% +%\Describe{Macro}{\DisableLigatures}{?characters,set of fonts} +% While completely disabling all ligatures of a font (which will also switch +% off kerning for this font), purposely \textit{lowers} the micro-typographic +% quality instead of raising it, it is especially useful for typewriter fonts, +% so that, \eg, in a <T1> encoded font, `|\texttt{--}|' will indeed be printed +% as `|--|', not as `\texttt{--}'. \cs{DisableLigatures} may be used to +% specify, in the usual way, a set of fonts for which ligatures should be +% disabled, for example, of the typewriter font in <T1> encoding: +%\begin{verbatim} +%\DisableLigatures{encoding = T1, family = tt* } +%\end{verbatim} +% It is also possible to disable selected ligatures only. The optional argument +% may contain a comma-separated list of characters for which the ligature +% mechanism should be inhibited: +%\begin{verbatim} +%\DisableLigatures[?,!]{encoding = T1} % "\ifx\tagcode\undefined\else ^^A +% \normalfont\color{thegrey}inhibit ?` and !`, but not fi, --, >>, etc.\fi" +%\end{verbatim} +% Only the character that begins the ligature(s) should be specified. This +% command may only be used in the preamble, and only once.\footnote{ +% With \luatex, you have to load the fonts with the \cite{fontspec} option +% `|Renderer=Basic|'.} +% ^^A Otherwise, it won't work at all +% +% +%\section{Hints and caveats}\label{sec:caveats} +% +%\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. +% The file \file{test-microtype.tex} might be of some help when adjusting the +% protrusion settings for a font. +% +%\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} +%\paragraph{Don't use font expansion for web documents (with older \pdftex\ versions).} +% With \pdftex\ versions older than 1.40, each expanded instance of the font +% will be embedded in the <PDF> file, hence the file size may increase by quite +% a large factor (depending on expansion limits and step). Therefore, courtesy +% and thriftiness of bandwidth command it not to enable font expansion when +% creating files to be distributed electronically. With \pdftex\ 1.40 and \luatex, which +% use a different technique of expansion, the increase of file size can be +% neglected. +% +%\changes{v2.2}{2007/07/06}{add hint about extra <TOC> leader dot +% (first discovered by \contributor Morten H\o gholm <morten.hoegholm\at latex-project.org>)} +% ^^A private mail, 2006/08/26 +%\paragraph{You might want to disable protrusion in the Table of Contents.} +% In unfortunate situations, enabled protrusion might internally alter the line +% length in the <TOC> and similar lists in such a way that an excess leader dot +% will fit in. The solution is to temporarily disable protrusion for the <TOC>: +%\begin{verbatim} +%\microtypesetup{protrusion=false} +%\tableofcontents +%\microtypesetup{protrusion=true} +%\end{verbatim} +% +%\changes{v1.9}{2005/07/10}{add hint about \texttt{verbatim} environment} +%\todo{option to patch \texttt{verbatim}?} ^^A for Karl +%\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. +% +%\changes{v1.9e}{2006/07/10}{add hint about unknown encodings} +%\paragraph{Settings for Greek/Thai/Armenian etc. encodings are not yet included.} +% The default sets of fonts for which the micro-typographic features will be +% enabled (see table~\ref{tab:predefined-font-sets}) only contain those +% encodings for which configurations exist. Therefore, if you are using any +% other encoding (\eg, <LGR>, <T2B>, etc.), \microtype\ will not apply to these +% fonts. You have to define and activate a new font set including the +% encoding(s) you are using (for details, see section~\ref{sec:font-sets}). For +% protrusion at least, you would also have to create settings for the fonts in +% question (see section~\ref{sub:protrusion}). It goes without saying that +% contributions for these encodings are more than welcome. +% +%\paragraph{Only employ kerning adjustment if it is customary in the language's +%typographic tradition.} +% In contrast to protrusion and expansion, additional kerning does not +% unconditionally improve the micro-typographical quality of your document. You +% should only switch it on if you are writing a document in a language whose +% typographic tradition warrants such kerning. If you are, for example, writing +% an English text, your readers would probably be rather confused by additional +% spaces before the punctuation characters. +% +%\changes{v2.3c}{2008/10/27}{add hint about \opt{spacing} being experimental} +%\paragraph{Adjustment of interword spacing is still experimental.} +% The implementation of this feature in \pdftex\ is not complete, and may not +% yield the positive effects on the typographical quality you might expect -- +% in certain situations, there may even be undesired side effects, +%\changes{v2.5}{2011/11/27}{add hint about \opt{spacing} and \pkg{ragged2e}} ^^A (beta:09) +% in particular, when used together with the \pkg{ragged2e} package. Therefore, +% the \opt{spacing} option should not be chosen blindly; it is also recommended +% to experiment with the settings in order to understand the workings of this +% feature. +% +%\changes{v1.7}{2005/03/23}{add hint about compatibility} +%\paragraph{Compatibility and interaction with other packages:} +% The \microtype\ package is supposed to work happily together with all other +% \LaTeX\ packages (except for \pkg{pdfcprot}). However, life isn't perfect, so +% problems are to be expected. Currently, I am aware of the following issues: +%\begin{itemize} +%\changes{v2.7b}{2018/09/18}{update hint about non-7-bit characters +% (notified by \contributor Frank Mittelbach <frank.mittelbach\at latex-project.org>)} +% ^^A private mail, 2018/08/14 +% \item Even though all configuration files are still provided in legacy (7-bit) +% format, using multi-byte (Unicode) characters in the settings should run +% smoothly with an up-to-date \LaTeX\ system. +% For older systems or documents in legacy encodings, in contrast, this requires +% loading the \pkg{inputenc} package 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} 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 error messages and how to get rid of them (\textcolor{thegreen}{specs} may differ):} +%\begin{itemize} +%\lstset{deletekeywords={[1]{expansion,auto}},belowskip=-\smallskipamount,frame=none, +% xleftmargin=0pt,backgroundcolor=,basicstyle=\MacroFont\footnotesize, +% delim=[is][\itshape\color{thegreen}]{<}{>}} +%\changes{v1.9a}{2005/11/15}{add explanation for error message in <DVI> mode} +% \item +%\begin{verbatim} +%! Font csnameendcsname=<cmr10+20 at 10.0pt> not loadable: Metric (TFM) file not found. +%\end{verbatim} +% This error message will occur if you are trying to employ font expansion +% while creating <DVI> output. Remember that \emph{automatic} font expansion +% only works when running \pdftex\ in <PDF> mode. Although expansion is also +% possible in <DVI> mode, it requires that all instances of the expanded fonts +% exist on your \TeX\ system. +% +%\changes{v2.2}{2007/06/13}{add hint about error message with \pdftex\ 1.40} +% \item +%\begin{verbatim} +%! pdfTeX error (font expansion): auto expansion is only possible with scalable fonts. +%\end{verbatim} +% Automatic font expansion has been improved in \pdftex\ 1.40, in that it now +% 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. +% +%\changes{v2.0}{2006/12/13}{qualify hints about expansion error messages with +% regard to older \pdftex\ versions} +% \item +%\begin{verbatim} +%Warning: pdflatex: font <ptmr8r> cannot be expanded (not an included Type1 font) +%\end{verbatim} +% and the <PDF> viewer complains about a missing font, \eg, Adobe Reader thusly: +%\begin{verbatim}[aboveskip=\smallskipamount] +%Could not find a font in the Resources dictionary - using Helvetica instead. +%\end{verbatim} +% With \pdftex\ versions older than 1.40, font expansion can only be applied if +% the font is actually embedded in the <PDF> file. If you get the above error +% message, your \TeX\ system is not set up to embed (or `download') the base +% PostScript fonts (\eg, Times, Helvetica, Courier). In most \TeX\ +% distributions, this can be changed in the file \file{updmap.cfg} by setting +% |pdftexDownloadBase14| to |true|. +% +%\changes{v1.9a}{2005/11/15}{add explanation for error message with non-Type\,1 fonts} +% \item +%\begin{verbatim} +%Warning: pdflatex (file <ecrm1000+20>): Font <ecrm1000+20 at 1200> not found +%\end{verbatim} +% 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. +% +%\changes{v2.0}{2006/11/05}{add hint about how to increase \texttt{font\textunderscore max} +% and \texttt{font\textunderscore mem\textunderscore size}} +% \item +%\begin{verbatim} +%! Font <T1/cmr/m/n/10>=<ecrm1000 at 10.0pt> not loaded: Not enough room left. +%\end{verbatim} +% 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). +% +%\changes{v2.0}{2007/01/05}{add hint about warning when tracking \emph{and} +% expansion is applied to a font} +% \item +%\begin{verbatim}[deletekeywords={[1]{expansion}}] +%pdfTeX warning (font expansion): font should be expanded before its first use +%\end{verbatim} +% 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{http://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 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{Contributions} +% +% I would 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, this package also includes a test file that can be +% used to check at least the protrusion settings (\file{test-microtype.tex}). +%^^A +% 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 +% +% +%\section{Acknowledgments} +% +% This package would be pointless if +% \contributor H\`an \thanhthe{} Th\`anh <thanh\at pdftex.org> +% 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 <h.harders\at tu-bs.de> +% has contributed protrusion settings for Adobe Minion. I~would also like to +% thank him for a number of bug reports and suggestions he had to make. +% \contributor Andreas B\"uhmann <andreas.buehmann\at web.de> +% has suggested the possibility to specify ranges of font sizes, and +% resourcefully assisted in implementing this. He also came up with some good +% ideas for the management of complex configurations. +% \contributor Ulrich Dirr <ud\at art-satz.de> +% has made numerous suggestion, especially concerning the new extensions of +% interword spacing adjustment and additional character kerning. +% \contributor Georg Duffner <g.duffner\at gmail.com> has patiently tested +% \microtype\ under \xetex\ and \luatex\ with his beautiful OpenType font +% <EB>~Garamond\footnote{\ctanpkgurl{ebgaramond}, including configuration +% files for \microtype.}. +% My thanks also go to +% \contributor Maciej Eder <maciej_eder\at poczta.onet.pl> +% for contributing settings for the <QX> encoding, as well as to +% \contributor Karl Karlsson <karl-karlsson\at yandex.ru> +% for providing settings for the Cyrillic <T2A> encoding, and to +% \contributor Hendrik Vogt <hendrik.vogt\at tu-dresden.de>, +% who made substantial improvements to the Computer Modern Roman italic settings. +% I thank +% \contributor Loren~B. Davis <davislo\at eecs.oregonstate.edu> +% for providing protrusion settings for OpenType versions of Palatino Linotype. +% I am also very much indebted to +% \contributor \'Elie Roux <elie.roux\at telecom-bretagne.eu>, +% who not only contributed the |lua| module in the first place, but also, +% together with +% \contributor Philipp Gesang <philipp.gesang\at alumni.uni-heidelberg.de>, +% took care of updating it for the developments in \luatex\ land. +% +% I thank +% \contributor Philipp Lehman <plehman\at gmx.net> +% for adding to his \pkg{csquotes} package the possibility to restore the +% original meanings of all activated characters, thus allowing for these +% characters to be used in the configuration files. +% \contributor Peter Wilson <herries.press\at earthlink.net> +% kindly provided a hook in his \pkg{ledmac}/\pkg{ledpar} packages, so that +% critical editions can finally also benefit from character protrusion. +% Likewise, +% \contributor Donald Arseneau <asnd\at triumf.ca> +% patched his \pkg{shapepar} package to accommodate protrusion. +% +% Additionally, the following people have reported bugs, made suggestions or +% helped otherwise (in chronological order, quotes indicate +% \href{https://tex.stackexchange.com/users/}{TeX.SX} user names):\linebreak +% \contributor Tom Kink <kink\at hia.rwth-aachen.de>, +% \contributor Herb Schulz <herbs\at wideopenwest.com>, +% \contributor Michael Hoppe <mh\at michael-hoppe.de>, +% \contributor Gary~L. Gray <gray\at engr.psu.edu>, +% \contributor Georg Verweyen <verweyen\at gmail.com>, +% \contributor Christoph Bier <christoph.bier\at web.de>, +% \contributor Peter Muthesius <Pemu\at gmx.de>, +% \contributor Bernard Gaulle <gaulle\at idris.fr>, ^^A\,\textdagger, +% \contributor Adam Kucharczyk <adamk\at ijp-pan.krakow.pl>, +% \contributor Mark Rossi <mark.rossi\at de.bosch.com>, +% \contributor Stephan Hennig <stephanhennig\at arcor.de>, +% \contributor Michael Zedler <Michael.Zedler\at tum.de>, +% \contributor Herbert Vo\ss{} <Herbert.Voss\at gmx.net>, +% \contributor Ralf Stubner <ralf.stubner\at physik.uni-erlangen.de>, +% \contributor Holger Uhr <huhr\at uni-paderborn.de>, +% \contributor Peter Dyballa <Peter_Dyballa\at Web.DE>, +% \contributor Morten H\o gholm <morten.hoegholm\at latex-project.org>, +% \contributor Steven Bath <steven128\at iname.com>, +% \contributor Daniel Flipo <daniel.flipo\at univ-lille1.fr>, +% \contributor Michalis Miatidis <miatidis\at informatik.rwth-aachen.de>, +% \contributor Sven Naumann <svenau\at gmx.net>, +% \contributor Ross Hetherington <ross\at heth.eclipse.co.uk>, +% \contributor Wiebke Petersen <petersew\at uni-duesseldorf.de>, +% \contributor Geoff Vallis <gkv\at Princeton.EDU>, +% \contributor Steven~E. Harris <seh\at panix.com>, +% \contributor Karl Berry <karl\at freefriends.org>, +% \contributor Peter Meier <Peter.Meier998\at gmx.de>, +% \contributor Nathan Rosenblum <nater\at cs.wisc.edu>, +% \contributor Wolfram Schaalo <schaalo\at gmx.net>, +% \contributor Vasile Gaburici <vgaburici\at gmail.com>, +% \contributor Sveinung Heggen <sveinung.heggen\at orkla.no>, +% \contributor Axel Berger <Axel_Berger\at b.maus.de>, +% \contributor Colin Rourke <gt\at msp.warwick.ac.uk>, +% \contributor Maverick Woo <maverick\at cs.cmu.edu>, +% \contributor Silas~S. Brown <ssb22\at cam.ac.uk>, +% \contributor Lars R\"onnb\"ack <lars.ronnback\at affecto.com>, +% \contributor Christian Stark <cstark\at gmx.de>, +% \contributor Leo <sdl.web\at gmail.com>, +% \contributor Marcin Borkowski <mbork\at atos.wmid.amu.edu.pl>, +% \contributor hscm <henkmetselaar\at gmail.com>, +% \contributor George Gratzer <gratzer\at me.com>, +% \contributor Josep Maria Font <jmfont\at ub.edu>, +% \contributor Juan Acevedo <juan.acevedo.juan\at gmail.com>, +% \contributor Heiko Oberdiek <heiko.oberdiek\at googlemail.com>, +% \contributor Till~A. Heilmann <till.heilmann\at unibas.ch>, +% \contributor Rolf Dieterich <rolf.dieterich\at gmx.de>, +% \contributor Seamus Bradley <@\at @>, ^^A https://tex.stackexchange.com/users/215/seamus +% \contributor Meho~R <meho.2005\at gmail.com>, +% \contributor Steffen Hoffmann <speraviro-delenda\at expires-2011-11-30.arcornews.de>, +% \contributor Scott Pakin <scott\at pakin.org>, +% \contributor Ma\"ieul Rouquette <maieul\at maieul.net>, +% \contributor Jonas Hogstrom <hjb981\at gmail.com>, +% \contributor Gabriel Kerneis <gabriel\at kerneis.info>, +% `\contributor RazorXsr <@\at @>', ^^A https://tex.stackexchange.com/users/17609/razorxsr +% \contributor Sebastian Schubert <schubert.seb\at googlemail.com>, +% `\contributor Dave <@\at @>', ^^A https://tex.stackexchange.com/users/15562/dave +% \contributor Giuseppe Palma <pippi.palma\at gmail.com>, +% \contributor Stephan Stiller <stephan.stiller\at gmail.com>, +% \contributor Christopher Schramm <debian\at shakaweb.org>, +% `\contributor uli <@\at @>', ^^A https://tex.stackexchange.com/users/9391/uli +% \contributor Sam Mason <sam\at samason.me.uk>, ^^A https://tex.stackexchange.com/users/16433/sam-mason +% `\contributor kleenstar <@\at @>', ^^A https://tex.stackexchange.com/users/56468/kleenstar +% `\contributor Henning <@\at @>', ^^A https://tex.stackexchange.com/users/64603/henning +% \contributor Ronnie Marksch <Ronnie.Marksch\at yahoo.de>, +% \contributor David Carlisle <d.p.carlisle\at gmail.com>, +% `\contributor Max <@\at @>', ^^A https://tex.stackexchange.com/users/16809/max +% `\contributor HcN <@\at @>', ^^A https://tex.stackexchange.com/users/87090/hcn +% \contributor Will Robertson <will\at wspr.io>, +% `\contributor user11126 <@\at @>', ^^A https://tex.stackexchange.com/users/1000/user11126 +% \contributor Ulrike Fischer <fischer\at troubleshooting-tex.de>, +% `\contributor Daniel <@\at @>', ^^A https://tex.stackexchange.com/users/113787/daniel +% `\contributor ltcomdata <@\at @>', ^^A https://tex.stackexchange.com/users/17061/ltcomdata +% \contributor Reinhard Kotucha <reinhard.kotucha\at web.de>, +% `\contributor jcr <@\at @>', ^^A https://tex.stackexchange.com/users/56514/jcr +% \contributor Nils Anders Danielsson <nad\at cse.gu.se>, +% \contributor Paolo Ney <@\at @>, ^^A https://tex.stackexchange.com/users/29161/paulo-ney +% \contributor Frank Mittelbach <frank.mittelbach\at latex-project.org>, +% \contributor Franz Wexler <@\at @> ^^A https://tex.stackexchange.com/users/182307/franz-wexler +% and +% \contributor Moritz Wemheuer <moritz.wemheuer\at gmail.com>. +% +% +%\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', +% \newblock Diss. Masaryk University Brno 2000, +% \newblock in: \textit{TUGBoat}, vol.~21 (2000), no.~4, pp.~317--434. +% \newblock (Online at \url{http://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', +% \newblock in: \textit{TUGBoat}, vol.~22 (2001), no.~3: +% `Proceedings of the 2001 Annual Meeting', pp.~146--148. +% \newblock (Online at \url{http://www.tug.org/TUGboat/Articles/tb22-3/tb72thanh.pdf}) +%\fi +% +% \bibitem[Th\`anh 2004]{ThanhPracTeX} +% \thanh, `Micro-typographic extensions of \pdftex\ in practice', +% \newblock in: \textit{TUGBoat}, vol.~25 (2004), no.~1: +% `Proceedings of the Practical \TeX\ 2004 Conference', pp.~35--38. +% \newblock (Online at \url{http://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', +% \newblock 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. +% \newblock (Online at \url{http://www.tug.org/TUGboat/Articles/tb27-0/thanh.pdf}) +% ^^A = \url{http://www.dante.de/dante/events/eurotex/papers/TUT07.pdf} +%\fi +% +% \bibitem[Th\`anh 2008]{ThanhEuroTeX07} +% \thanh, `Font-specific issues in \pdftex', +% \newblock in: \textit{TUGBoat}, vol.~29 (2008), no.~1: +% `EuroBacho\TeX\ 2007 Proceedings', pp.~36--41. +% \newblock (Online at \url{http://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, +% \emph{The \pdftex\ user manual}, +% \newblock 2~January 2018. +% \newblock (\ctanurl{systems/doc/pdftex/manual/pdftex-a.pdf}) +% ^^A latest version at \url{http://sarovar.org/projects/pdftex/} +% ^^A or even \url{http://foundry.supelec.fr/scm/?group_id=23} +% +% \bibitem[Fontname]{fontname} +% Karl Berry, \emph{Fontname: Filenames for \TeX\ fonts}, +% \newblock July 2009. +% \newblock (\ctanurl{info/fontname/fontname.pdf}) +% +% \bibitem[\LaTeXe\ font selection]{fntguide} +% \LaTeX3 Project Team, \emph{\LaTeXe\ font selection}, +% \newblock 27 November 2005. +% \newblock (\ctanurl{macros/latex/doc/fntguide.pdf}) +% +% \bibitem[\pkg{fontspec}]{fontspec} +% Will Robertson, +% \emph{The \pkg{fontspec} package: Font selection for \xe\LaTeX\ and Lua\LaTeX}, +% \newblock 12~February 2019. +% \newblock (\ctanpkgurl{fontspec}) +% +% \bibitem[\pkg{luaotfload}]{luaotfload} +% \'Elie Roux, Khaled Hosny, Philipp Gesang, Ulrike Fischer, +% \emph{The \pkg{luaotfload} package}, +% \newblock 14~February 2019. +% \newblock (\ctanpkgurl{luaotfload}) +% +% \bibitem[\pkg{pdfcprot}]{pdfcprot} +% Carsten Schurig, Tobias Schlemmer, \emph{The \pkg{pdfcprot}|.sty| package}, +% \newblock 10 June 2005. +% \newblock (\ctanpkgurl{pdfcprot}) +% +% \bibitem[\pkg{soul}]{soul} +% Melchior Franz, \emph{The \pkg{soul} package}, +% \newblock 17 November 2003. +% \newblock (\ctanpkgurl{soul}). +%\changes{v2.3a}{2008/01/06}{mention \pkg{soulutf8}} +% \newblock See also Heiko Oberdiek's extension of this package, +% \pkg{soulutf8}, which adds Unicode support. +% \newblock (\ctanpkgurl{soulutf8}) +% +%\end{thebibliography} +% +% +%\section{Short history} +%\changes{v1.5}{2004/12/11}{add `Short history'} +% +% The comprehensive list of changes can be +% \expandafter\ifx\csname r@sec:changes\endcsname\relax +% obtained by running `\texttt{makeindex \mbox{-s gglo.ist} +% \mbox{-o microtype.gls} microtype.glo}'\else +% found in appendix~\ref{sec:changes}\fi. +% 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}} +% +%\begin{History} +% +%\VersionDate{\expandafter\@gobble\fileversion}{\filedate} +% +%\VersionDate{2.7a}{2018/01/14} +% +%\Version{2.7}{2017/07/07} +% \item Allow automatic expansion and letterspacing with \luatex\ in <DVI> mode +% (aka. \texttt{dvilualatex}) +% \refsection{\ref{sub:options-microtype}, \ref{sub:options-expansion}, table~\ref{tab:available-features}} +% \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 if protrusion settings are generic +% \item Protrusion settings for Latin Modern Roman (OpenType) +% \item Protrusion settings for Charis SIL (OpenType) +% \item Protrusion settings for Palatino Linotype (OpenType) +% +%\Version{2.4}{2010/01/10} +% ^^A \item |lua| functions moved to a dedicated file +% \item Protrusion settings for <T2A> encoded Minion +% +%\Version{2.3e}{2009/11/09} +% \item Support for the Cyrillic <T2A> encoding (protrusion, expansion, spacing) +% +%\Version{2.3d}{2009/03/27} +% \item New default for expansion option `\opt{step}': 1, if \pdftex\ $\geq$ 1.40 +% \refsection{\ref{sub:options-expansion}} +% +%\Version{2.3c}{2008/11/11} +% \item Support for \luatex\ enabled by default +% +%\VersionDate{2.3b}{2008/06/04} +% +%\VersionDate{2.3a}{2008/02/29} +% +%\Version{2.3}{2007/12/23} +% \item New 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 New option `\opt{verbose}|=silent|' to turn all warnings into mere messages +% \refsection{\ref{sub:options-misc}} +% \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 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 Possibility to expand a font with different parameters (\pdftex\ $\geq$ 1.40.4) +% ^^A ; new option `\opt{copyfonts}' +% \refsection{\ref{sub:expansion}} +% \item New optional argument for \cs{DisableLigatures} to disable selected ligatures +% \refsection{\ref{sec:disable-ligatures}} +% \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 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:option-tracking}, \ref{sec:lettersp}} +% \item New option `\opt{babel}' for automatic micro-typographic adjustment to +% the selected language +% \refsection{\ref{sub:options-misc}, \ref{sec:context}} +% \item New font sets: `|smallcaps|', `|footnotesize|', `|scriptsize|' +% \refsection{\ref{sec:font-sets}, table~\ref{tab:predefined-font-sets}} +% \item New package `\letterspace' providing the commands for robust and +% hyphenatable letterspacing +% \refsection{\ref{sec:lettersp}} +% +%\VersionDate{1.9f}{2006/09/09} +% +%\Version{1.9e}{2006/07/28} +% \item New key `|inputenc|' to specify the lists' input encodings +% \refsection{\ref{sec:fine-tuning}} +% \item Protrusion settings for Euler math fonts +% +%\Version{1.9d}{2006/05/05} +% \item Support for the Central European <QX> encoding +% (protrusion, inheritance) +% \item Protrusion settings for various Euro symbol fonts (Adobe, <ITC>, \pkg{marvosym}) +% \item Support for Unicode input in the configuration (\pkg{inputenc}/|utf8|) +% +%\Version{1.9c}{2006/02/02} +% \item Protrusion settings for <URW> Garamond +% +%\VersionDate{1.9b}{2006/01/20} +% +%\Version{1.9a}{2005/12/05} +% \item Defer setup until the end of the preamble +% ^^A ; consequently, no need to +% ^^A change font defaults before loading \microtype, or to put it the other +% ^^A way round, \microtype\ may now be loaded at any time +% ^^A ; new option `\opt{defersetup}' +% \item Inside the preamble, \cs{microtypesetup} accepts all package options +% \refsection{\ref{sub:options-cmd}} +% \item Protrusion settings for <T5> encoded Charter +% +%\Version{1.9}{2005/10/28} +% \item New command \cs{DisableLigatures} to disable ligatures +% (\pdftex\ $\geq$ 1.30) +% \refsection{\ref{sec:disable-ligatures}} +% \item New command \cs{microtypecontext} to change the configuration context; +% new key `|context|' for the configuration commands +% \refsection{\ref{sec:context}} +% \item New key `|font|' to add single fonts to the font sets +% \refsection{\ref{sec:font-sets}} +% \item New key `|preset|' to set all characters to the specified value before +% loading the lists +% \item Value `|relative|' renamed to `|character|' for `|unit|' keys +% \item Support for the Polish <OT4> encoding (protrusion, expansion, inheritance) +% \item Support for the Vietnamese <T5> encoding (protrusion, expansion, inheritance) +%^^A \item `\opt{DVIoutput}' option will work with \texlive\ 2004 +% +%\Version{1.8}{2005/06/23} +%^^A \item If font substitution has occurred, the settings for the substitute will +%^^A be used instead of those for the selected font +% \item New command \cs{DeclareMicrotypeSetDefault} to declare the default font sets +% \refsection{\ref{sec:font-sets}} +% \item New option `\opt{config}' to load a different configuration file +% \refsection{\ref{sub:options-misc}} +% \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 \cs{..MicroType..} to \cs{..Microtype..} +% \item Protrusion settings for <AMS> math fonts +% \item Protrusion settings for Times in <LY1> encoding completed +% \item The `|allmath|' font set also includes <U> encoding +%^^A \item 8-bit characters in the configuration finally work as advertised, +%^^A even if made active by the \pkg{csquotes} package +% \item Support for protrusion with the \pkg{ledmac} package (\pdftex\ $\geq$ 1.30) +% +%\Version{1.7}{2005/03/23} +% \item Possibility to specify ranges of font sizes in the set declarations +% \refsection{\ref{sec:font-sets}, \ref{sec:fine-tuning}} +%^^A \item Always take font size into account when trying to find protrusion resp. +%^^A expansion settings for a given font +%^^A \refsection{\ref{sec:fine-tuning}} +% \item New command \cs{LoadMicrotypeFile} to load a configuration file manually +% \refsection{\ref{sub:config-file}} +% \item New command \cs{Microtype@Hook} for font package authors +% \refsection{\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 draft mode +% +%\VersionDate{1.6a}{2005/02/02} +% +%\Version{1.6}{2005/01/24} +% \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}} +% \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}} +%^^A \item Protrusion settings of digits improved +% \item Use \etex\ extensions, if available +% +%\Version{1.5}{2004/12/15} +% \item When output mode is <DVI>, font expansion has to be enabled explicitly, +% automatic expansion will be disabled +% \refsection{\ref{sub:options-microtype}} +% \item New option `\opt{selected}' to enable selected expansion, +% default: |false| +% \refsection{\ref{sub:options-expansion}, \ref{sub:expansion}} +% \item New default for expansion option `\opt{step}': 4 (min(\opt{stretch},\opt{shrink})/5) +% \refsection{\ref{sub:options-expansion}} +% \item Protrusion settings for Bitstream Charter +% +%\VersionDate{1.4b}{2004/11/26} +%^^A\Version{1.4b}{2004/11/26} +%^^A \item \cs{UseMicrotypeSet} requires the set to be declared +%^^A \refsection{\ref{sec:font-sets}} +% +%\VersionDate{1.4a}{2004/11/17} +% +%\Version{1.4}{2004/11/12} +% \item Set up fonts independently from \LaTeX\ font loading +%^^A (therefore, no risk of overlooking fonts anymore, and the package may +%^^A be loaded at any time) +%^^A \item \cs{microtypesetup} now sets the correct level of protrusion +%^^A \refsection{\ref{sub:options-cmd}} +% \item New option: `\opt{final}' +% \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 +% \item Protrusion settings for <TS1> encoding completed for Computer Modern +% 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 Protrusion settings for Adobe Minion +% \item New command: \cs{DeclareCharacterInheritance} +% \refsection{\ref{sub:inherit}} +% \item Characters may also be specified as octal or hexadecimal numbers +% \refsection{\ref{sec:fine-tuning}} +%^^A \item Configuration file names in lowercase [\ref{sub:config-file}] +% +%\Version{1.0}{2004/09/11} +% \item First <CTAN> release +%\end{History} +% +% +%\def\AppendixSettings{ +% \addtolength\textwidth{50pt} +% \addtolength{\oddsidemargin}{-50pt} +% \setlength{\columnwidth}{\textwidth} +% \setlength{\hsize}{\textwidth} +% \setlength{\linewidth}{\textwidth} +% \footnotesize +%} +%\def\LPPLSettings{ +%\changes{v1.9e}{2006/06/13}{include <LPPL>} +% \let\LPPLicense\empty +% \def\endLPPLicense{\endmulticols\endgroup} +% \def\LPPLsection##1{\begin{multicols}{2}[\section{##1}][12\baselineskip]} +% \def\LPPLsubsection##1{\end{multicols}\begin{multicols}{2}[\subsection*{##1}][6\baselineskip]} +% \def\LPPLsubsubsection{\subsubsection*} +% \let\LPPLparagraph\textit +% \let\LPPLfile\file +% \def\textsc##1{\acronym{\MakeUppercase{##1}}} +% \lstset{gobble=2,basicstyle=\MacroFont\tiny,commentstyle=,aboveskip=\smallskipamount} +% \let\oldmakeatletter\makeatletter +% \long\def\makeatletter##1\makeatother{\let\makeatletter\oldmakeatletter} +% \MakePercentComment +%} +% +%\StopEventually{ +% \GeneralChanges{Documentation} +% \ifx\Finale\relax +% \newpage +% \appendix +% \AppendixSettings +% \fi +% \PrintIndex +% \InputIfFileExists{lppl.tex}\LPPLSettings\relax +%} +% +% \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,\csname,\def,\divide,\edef,\egroup,\else,\endcsname,\endgroup, +% \endinput,\escapechar,\everypar,\expandafter,\fi,\futurelet,\gdef,\global, +% \hbadness,\hbox,\hsize,\hskip,\if,\ifcase,\ifcat,\ifdim,\iffalse,\ifhbox, +% \ifhmode,\ifmmode,\ifnum,\iftrue,\ifx,\immediate,\input,\inputlineno,\jobname, +% \kern,\lastkern,\lastskip,\let,\lowercase,\maxdimen,\meaning,\multiply, +% \newlinechar,\noexpand,\number,\or,\parfillskip,\pretolerance,\relax,\setbox, +% \showboxdepth,\string,\the,\tolerance,\unkern,\unskip,\uppercase,\vbox,\wd, +% \write,\xdef} +%^^A\DoNotIndex{\font,\fontdimen,\nullfont,\sfcode,\spacefactor,\spaceskip, +%^^A \xspaceskip} ^^A tex +%\DoNotIndex{\currentgrouplevel,\currentgrouptype,\detokenize,\dimexpr, +% \eTeXversion,\ifcsname,\ifdefined,\numexpr} +%^^A\DoNotIndex{\fontcharwd,\iffontchar} ^^A e-tex +%\DoNotIndex{\pdfannot,\pdfescapestring,\pdfmatch,\pdfoutput,\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 \pdftracingfonts} ^^A pdftex +%\DoNotIndex{\XeTeXversion,\XeTeXrevision} ^^A xetex +%^^A\DoNotIndex{\XeTeXcharglyph,\XeTeXcountglyphs,\XeTeXfonttype,\XeTeXglyph, +%^^A \XeTeXglyphindex,\XeTeXglyphname,\XeTeXprotrudechars} +%\DoNotIndex{\directlua,\luatexversion} ^^A luatex +%^^A\DoNotIndex{\adjustspacing,\copyfont,\expandglyphsinfont, +%^^A \ignoreligaturesinfont,\outputmode,\protrudechars,\tracingfonts} +%\DoNotIndex{\eplain,\usepkg@pkg} ^^A eplain +%\DoNotIndex{\@backslashchar,\@cclv,\@cclvi,\@classoptionslist,\@currext, +% \@currname,\@defaultunits,\@empty,\@expandtwoargs,\@firstofone,\@firstoftwo, +% \@gobble,\@gobbletwo,\@ifclassloaded,\@ifl@t@r,\@ifl@aded,\@ifpackagelater, +% \@ifpackageloaded,\@ifstar,\@ifundefined,\@let@token,\@m,\@makeother, +% \@minus,\@nameuse,\@ne,\@nil,\@nnil,\@onelevel@sanitize,\@onlypreamble, +% \@percentchar,\@pkgextension,\@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,\tw@,\z@,\z@skip, +% \zap@space,\active,\documentclass,\leavevmode,\makeatletter,\mbox,\newcommand, +% \newcount,\newdimen,\newif,\newskip,\newtoks,\nobreak,\nonfrenchspacing, +% \normalsize,\renewcommand,\space,\AtBeginDocument,\AtEndOfPackage, +% \CheckCommand,\CurrentOption,\DeclareRobustCommand,\IfFileExists, +% \InputIfFileExists,\MessageBreak,\PackageError,\PackageInfo,\PackageWarning, +% \RequirePackage,\@@enc@update,\cf@encoding,\f@encoding} +%^^A\DoNotIndex{\add@accent,\curr@fontshape,\define@newfont,\do@subst@correction, +%^^A \every@math@size,\f@size,\font@name,\glb@currsize,\glb@settings,\normalfont, +%^^A \pickup@font,\selectfont,\set@fontsize,\showhyphens} ^^A latex +%\DoNotIndex{\normalpdfoutput,\normalpdftexversion,\normalpdftexrevision} ^^A tex live 2004 +%\DoNotIndex{\foreign@language,\languagename,\select@language,\shorthandoff} ^^A babel +%\DoNotIndex{\percentsign} ^^A babel/spanish,galician,mexican +%\DoNotIndex{\CJK@ifundefined,\CJK@plane,\CJK@temp,\CJK@addcmap} ^^A CJK,CJKutf8 +%\DoNotIndex{\@disablequotes} ^^A csquotes +%\DoNotIndex{\pdfstringdefDisableCommands,\pdfstringdefWarn} ^^A hyperref +%\DoNotIndex{\ifpdf} ^^A ifpdf +%\DoNotIndex{\@inpenc@undefined@,\IeC,\inputencoding,\inputencodingname} ^^A inputenc +%\DoNotIndex{\UTFviii@defined} ^^A inputenc/utf8 +%\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{\RequireLuaModule} ^^A luatexbase +%\DoNotIndex{\pdf@escapestring} ^^A pdftexcmds +%\DoNotIndex{\py@macron} ^^A pinyin +%\DoNotIndex{\SOUL@,\soulregister} ^^A soul +%\DoNotIndex{\tikz@expandcount} ^^A tikz +%\DoNotIndex{\conditionally@traceoff} ^^A trace +%\DoNotIndex{\@xspace,\@xspace@firsttrue} ^^A xspace +%\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,\DeclareMicroTypeSet,\DeclareMicroTypeAlias, +% \UseMicroTypeSet,\LoadMicroTypeFile,\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[|pdftex-def|] Definitions specific to \pdftex\ (\file{microtype-pdftex.def}). +% \item[|xetex-def|] Definitions specific to \xetex\ (\file{microtype-xetex.def}). +% \item[|luatex-def|] Definitions specific to \luatex\ (\file{microtype-luatex.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[|pad|] Settings for Adobe Garamond (\file{mt-pad.cfg}). +% \item[|ppl|] Settings for Palatino (\file{mt-ppl.cfg}). +% \item[|ptm|] Settings for Times (\file{mt-ptm.cfg}). +% \item[|pmn|] Settings for Adobe Minion (\file{mt-pmn.cfg}). +% \\Contributed by \contributor Harald Harders <h.harders\at tu-bs.de>. +% \item[|ugm|] Settings for <URW> Garamond (\file{mt-ugm.cfg}). +% \end{description} +% \item[|cfg-u|] Surrounds non-text configurations (<U> encoding). +% \begin{description} +% \item[|msa|] Settings for <AMS> `a' symbol font (\file{mt-msa.cfg}). +% \item[|msb|] Settings for <AMS> `b' symbol font (\file{mt-msb.cfg}). +% \item[|euf|] Settings for Euler Fraktur font (\file{mt-euf.cfg}). +% \item[|eur|] Settings for Euler Roman font (\file{mt-eur.cfg}). +% \item[|eus|] Settings for Euler Script font (\file{mt-eus.cfg}). +% \end{description} +% \item[|cfg-e|] Surrounds Euro symbol configurations. +% \begin{description} +% \item[|zpeu|] Settings for Adobe Euro symbol fonts (\file{mt-zpeu.cfg}). +% \item[|euroitc|] Settings for <ITC> Euro symbol fonts (\file{mt-euroitc.cfg}). +% \item[|mvs|] Settings for \pkg{marvosym} Euro symbol (\file{mt-mvs.cfg}). +% \end{description} +% \end{description} +% \item[|test|] A helper file that may be used to create and test +% protrusion settings\\(\file{test-microtype.tex}). +% \end{description} +% And now for something completely different. +% +% \begin{macrocode} +%<*package|letterspace> +% \end{macrocode} +% +%\subsection{Preliminaries} +% +%\begin{macro}{\MT@MT} +% This is us. +% \begin{macrocode} +\def\MT@MT +%<package> {microtype} +%<letterspace> {letterspace} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\MT@fix@catcode} +%\changes{v1.3}{2004/10/27}{check some category codes (compatibility with \pkg{german})} +%\changes{v1.5}{2004/12/03}{reset catcode of `\texttt{\^}' (compatibility with \pkg{chemsym})} +%\changes{v2.3a}{2007/12/29}{fix catcodes earlier, and also for the \letterspace\ package} +% We have to make sure that the category codes of some characters are correct +% (the \pkg{german} package, for instance, makes |"| active). Probably overly +% cautious. Ceterum censeo: it should be forbidden for packages to change +% catcodes within the preamble. +%\begin{macro}{\MT@restore@catcodes} +% Polite as we are, we'll restore them afterwards. +% \begin{macrocode} +\let\MT@restore@catcodes\@empty +% \end{macrocode} +%\end{macro} +% \begin{macrocode} +\def\MT@fix@catcode#1#2{% + \edef\MT@restore@catcodes{% + \MT@restore@catcodes + \catcode#1 \the\catcode#1\relax + }% + \catcode#1 #2\relax +} +%<package>\MT@fix@catcode{17}{14}% ^^Q (comment) +\MT@fix@catcode{24} {9}% ^^X (ignore) +%<package>\MT@fix@catcode{33}{12}% ! +%<package>\MT@fix@catcode{34}{12}% " +\MT@fix@catcode{36} {3}% $ (math shift) +\MT@fix@catcode{39}{12}% ' +\MT@fix@catcode{42}{12}% * +\MT@fix@catcode{43}{12}% + +\MT@fix@catcode{44}{12}% , +\MT@fix@catcode{45}{12}% - +\MT@fix@catcode{58}{12}% : +\MT@fix@catcode{60}{12}% < +\MT@fix@catcode{61}{12}% = +\MT@fix@catcode{62}{12}% > +%<package>\MT@fix@catcode{63}{12}% ? +\MT@fix@catcode{94} {7}% ^ (superscript) +\MT@fix@catcode{96}{12}% ` +%<package>\MT@fix@catcode{124}{12}% | +% \end{macrocode} +%\end{macro} +% These are all commands for the outside world. We define them here as blank +% commands, so that they won't generate an error if we are not running \pdftex. +% \begin{macrocode} +%<*package> +\newcommand*\DeclareMicrotypeSet[3][]{} +\newcommand*\UseMicrotypeSet[2][]{} +\newcommand*\DeclareMicrotypeSetDefault[2][]{} +\newcommand*\SetProtrusion[3][]{} +\newcommand*\SetExpansion[3][]{} +\newcommand*\SetTracking[3][]{} +\newcommand*\SetExtraKerning[3][]{} +\newcommand*\SetExtraSpacing[3][]{} +\newcommand*\DisableLigatures[2][]{} +\newcommand*\DeclareCharacterInheritance[3][]{} +\newcommand*\DeclareMicrotypeVariants[1]{} +\newcommand*\DeclareMicrotypeAlias[2]{} +\newcommand*\LoadMicrotypeFile[1]{} +\newcommand*\DeclareMicrotypeBabelHook[2]{} +\newcommand*\microtypesetup[1]{} +\newcommand*\microtypecontext[1]{} +\newcommand*\textmicrotypecontext[2]{#2} +\@ifpackageloaded{letterspace}{\let\MT@textls\relax}{% +%</package> +\newcommand*\lsstyle{} +\newcommand\textls[2][]{} +\def\textls#1#{} +\newcommand*\lslig[1]{#1} +%<*package> +} +% \end{macrocode} +% These commands also have a starred version. +% \begin{macrocode} +\def\DeclareMicrotypeSet#1#{\@gobbletwo} +\def\DeclareMicrotypeVariants#1#{\@gobble} +% \end{macrocode} +% Set declarations are only allowed in the preamble (resp. the main +% configuration file). The configuration commands, on the other hand, must be +% allowed in the document, too, since they may be called inside font +% configuration files, which, in principle, may be loaded at any time. +% \begin{macrocode} +\@onlypreamble\DeclareMicrotypeSet +\@onlypreamble\UseMicrotypeSet +\@onlypreamble\DeclareMicrotypeSetDefault +\@onlypreamble\DisableLigatures +\@onlypreamble\DeclareMicrotypeVariants +\@onlypreamble\DeclareMicrotypeBabelHook +% \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. +%\changes{v1.8}{2005/04/28}{renamed commands from \cs{..MicroType..} to \cs{..Microtype..}} +% \begin{macrocode} +\def\MT@old@cmd#1#2{% + \newcommand*#1{\MT@warning{% + \string#1 is deprecated. Please use\MessageBreak + \string#2 instead}% + \let #1#2#2}} +% \end{macrocode} +%\end{macro} +% \begin{macrocode} +\MT@old@cmd\DeclareMicroTypeAlias\DeclareMicrotypeAlias +\MT@old@cmd\DeclareMicroTypeSet \DeclareMicrotypeSet +\MT@old@cmd\UseMicroTypeSet \UseMicrotypeSet +\MT@old@cmd\LoadMicroTypeFile \LoadMicrotypeFile +%</package> +% \end{macrocode} +%\begin{macro}{\MT@warning} +%\begin{macro}{\MT@warning@nl} +%\begin{macro}{\MT@info} +%\begin{macro}{\MT@info@nl} +%\begin{macro}{\MT@vinfo} +%\changes{v1.6}{2005/01/06}{new macro instead of \cs{ifMT@verbose}} +%\begin{macro}{\MT@error} +%\begin{macro}{\MT@warn@err} +%\changes{v1.7}{2005/03/16}{new macro: for \opt{verbose}\texttt{\quotechar=errors}} +% Communicate. +% \begin{macrocode} +\def\MT@warning{\PackageWarning\MT@MT} +\def\MT@warning@nl#1{\MT@warning{#1\@gobble}} +%<*package> +\def\MT@info{\PackageInfo\MT@MT} +\def\MT@info@nl#1{\MT@info{#1\@gobble}} +\let\MT@vinfo\@gobble +\def\MT@error{\PackageError\MT@MT} +\def\MT@warn@err#1{\MT@error{#1}{% + This error message appears because you loaded the `\MT@MT'\MessageBreak + package with the option `verbose=errors'. Consult the documentation\MessageBreak + in \MT@MT.pdf to find out what went wrong.}} +% \end{macrocode} +%\end{macro} +%\end{macro} +%\end{macro} +%\end{macro} +%\end{macro} +%\end{macro} +%\end{macro} +% +%\subsubsection{Debugging} +% +%\begin{macro}{\tracingmicrotype} +%\begin{macro}{\MT@dinfo} +%\begin{macro}{\MT@dinfo@nl} +% Cases for \cs{tracingmicrotype}: +%\begin{enum} +% \item almost none +% \item + sets \& lists +% \item + heirs +% \item + slots +% \item + factors +%\end{enum} +% \begin{macrocode} +%<*debug> +\MT@warning@nl{This is the debug version} +\newcount\tracingmicrotype +\tracingmicrotype=2 +\def\MT@info#1{\PackageInfo\MT@MT{#1}\MT@addto@annot{#1}} +\def\MT@info@nl#1{\PackageInfo\MT@MT{#1\@gobble}\MT@addto@annot{#1}} +\let\MT@vinfo\MT@info@nl +\def\MT@warning#1{\PackageWarning\MT@MT{#1}\MT@addto@annot{Warning: #1}} +\def\MT@warning@nl#1{\PackageWarning\MT@MT{#1\@gobble}\MT@addto@annot{Warning: #1}} +\def\MT@dinfo#1#2{\ifnum\tracingmicrotype<#1 \else\MT@info{#2}\fi} +\def\MT@dinfo@nl#1#2{\ifnum\tracingmicrotype<#1 \else\MT@info@nl{#2}\fi} +% \end{macrocode} +%\end{macro} +%\end{macro} +%\end{macro} +%\begin{macro}{\tracingmicrotypeinpdf} +%\changes{v2.0}{2006/09/21}{new debug method: mark all fonts with <PDF> annotations} +% Another debug method: font switches can be marked in the <PDF> file with a +% small caret, an accompanying popup text box displaying all debug messages. +% +% Cases for \cs{tracingmicrotypeinpdf}: +%\begin{enum}[1] +% \item show new fonts +% \item + show known fonts +%\end{enum} +% \begin{macrocode} +\newcount\tracingmicrotypeinpdf +% \end{macrocode} +%\end{macro} +%\ifpdf\ifx\tracingmicrotypeinpdf\undefined +% \fallbacktext{If \file{microtype.sty} had been generated with the `|debug|' +% option,\\this method would be demonstrated here.} +%\else +% Let's see how it works~\dots\ (if you don't see anything special on this page, +% your <PDF> viewer doesn't support annotations). +%\begin{verbatim} +%\tracingmicrotypeinpdf=2 +%\end{verbatim} +%\tracingmicrotypeinpdf=2 +%\fi\fi +%\begin{macro}{\MT@pdf@annot} +%\begin{macro}{\MT@addto@annot} +%\begin{macro}{\ifMT@inannot} +% During font setup, we save the text for the popup in \cs{MT@pdf@annot}. +% (This requires \pdftex\ $\geq$~1.30.) +% The \pkg{pdftexcmds} package provides \pdftex's utility commands in \luatex, too. +%\changes{v2.3d}{2009/02/27}{use \pkg{pdftexcmds} for debugging} +% \begin{macrocode} +\RequirePackage{pdftexcmds} +\newif\ifMT@inannot \MT@inannottrue +\let\MT@pdf@annot\@empty +\def\MT@addto@annot#1{\ifnum\tracingmicrotypeinpdf>\z@ \ifMT@inannot + {\def\MessageBreak{^^J\@spaces}% + \MT@xadd\MT@pdf@annot{\pdf@escapestring{#1^^J}}}\fi\fi} +% \end{macrocode} +%\end{macro} +%\end{macro} +%\end{macro} +%\begin{macro}{\iftracingmicrotypeinpdfall} +% With \cs{tracingmicrotypeinpdfallfalse}, the <PDF> output is (hopefully) +% identical, but some font switches will not be displayed; otherwise the output +% is affected, but \emph{all} font switches are visible. In the latter case, we +% also insert a small kern so that multiple font switches are discernable. +% \begin{macrocode} +\newif\iftracingmicrotypeinpdfall +% \end{macrocode} +%\end{macro} +%\begin{macro}{\MT@show@pdfannot} +% A red caret is shown for fonts which are actually set up by +% {\ifpdf\ifx\tracingmicrotypeinpdf\undefined\else\fontfamily{pzc}\itshape\fi\fi +% Microtype}, +% a green one marks fonts that we have already seen. The |/Caret| annotation +% requires a viewer for <PDF> version 1.5 (you could use |/Text| if you're +% using an older <PDF> viewer). +% \begin{macrocode} +\def\MT@show@pdfannot#1{% + \ifnum\tracingmicrotypeinpdf<#1 \else + \iftracingmicrotypeinpdfall\leavevmode\fi + \pdfannot height 4pt width 4pt depth 2pt {% + /Subtype/Caret + /T(\expandafter\string\font@name) + \ifcase#1\or + /Subj(New font)/C[1 0 0] + \else + /Subj(Known font)/C[0 1 0] + \fi + /Contents(\MT@pdf@annot) + }% + \iftracingmicrotypeinpdfall\kern1pt \fi + \global\MT@inannotfalse + \fi +} +%</debug> +%</package> +% \end{macrocode} +%\end{macro} +%\ifpdf\ifx\tracingmicrotypeinpdf\undefined\else +% \tracingmicrotypeinpdf0 +% \tracingmicrotype0 +%\fi\fi +% +%\subsubsection{Requirements} +% +%\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} +%<*plain> +\def\MT@plain{2} +\ifx\documentclass\@undefined + \def\MT@plain{1} + \def\hmode@bgroup{\leavevmode\bgroup} + \def\nfss@text#1{{\mbox{#1}}} + \let\@typeset@protect\relax + \ifx\eplain\@undefined + \def\MT@plain{0} + \def\PackageWarning#1#2{% + \begingroup + \newlinechar=10 % + \def\MessageBreak{^^J(#1)\@spaces\@spaces\@spaces\@spaces}% + \immediate\write16{^^JPackage #1 Warning: #2\on@line.^^J}% + \endgroup + } + \def\on@line{ on input line \the\inputlineno} + \def\@spaces{\space\space\space\space} + \fi +\fi +% \end{macrocode} +%\end{macro} +%\begin{macro}{\MT@requires@latex} +%\changes{v2.3b}{2008/05/26}{new macro} +% Better use groups than plain ifs. +% \begin{macrocode} +\def\MT@requires@latex#1{% + \ifnum\MT@plain<#1 \expandafter\@secondoftwo\else\expandafter\@firstoftwo\fi +} +%</plain> +% \end{macrocode} +%\end{macro} +%\changes{v2.2}{2007/05/01}{use catcode trickery for \etex\ test} +%^^A\changes{v2.3a}{2007/12/29}{removed} ^^A \MT@maybe@etex +% 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 +%<debug>\MT@dinfo@nl{0}{this is +%<debug>^^Q not +%<debug> etex} +% \end{macrocode} +%\changes{v2.5}{2010/05/05}{new files: \file{microtype-pdftex.def}, \file{microtype-xetex.def}, \file{microtype-luatex.def}, +% containing engine-specific definitions} +% We check whether we are running \pdftex, \xetex, or \luatex, and +% load the appropriate definition file. +%\begin{macro}{\MT@clear@options} +% If we are using neither of these engines, we disable everything and exit. +% \begin{macrocode} +\def\MT@clear@options{% +%<plain> \MT@requires@latex1{% + \AtEndOfPackage{\let\@unprocessedoptions\relax\MT@restore@catcodes}% + \let\CurrentOption\@empty +%<package> \let\MT@endinput\endinput +%<plain> }\relax +} +% \end{macrocode} +%\end{macro} +%\changes{v1.9}{2005/08/29}{compatibility with \texlive\ hack +% (reported by \contributor Herbert Vo\ss{} <Herbert.Voss\at gmx.net>)} +% ^^A MID: <deprh8$c69$00$1@news.t-online.com> +% A hack circumventing the \texlive\ 2004 hack which undefines the \pdftex\ +% primitives in the format in order to hide the fact that \pdftex\ is being run +% from the user. This has been \emph{fixed} in \texlive\ 2005. +% \begin{macrocode} +\ifx\normalpdftexversion\@undefined \else + \let\pdftexversion \normalpdftexversion + \let\pdftexrevision\normalpdftexrevision + \let\pdfoutput \normalpdfoutput +\fi +% \end{macrocode} +%\begin{macro}{\MT@engine} +%\changes{v2.6}{2016/03/25}{fix test with \luatex\ 0.85} +%\begin{macro}{\MT@engine@tooold} +% Old packages might have let \cmd\pdftexversion\ to \cmd\relax. +% \begin{macrocode} +\let\MT@engine\relax +%<letterspace>\def\MT@engine@tooold{0} +\ifx\pdftexversion\@undefined \else + \ifx\pdftexversion\relax \else + \def\MT@engine{pdf} +%<letterspace> \let\MT@pdf@or@lua\@firstoftwo +%<letterspace> \ifnum\pdftexversion > 139 \def\MT@engine@tooold{1}\fi + \fi +\fi +\ifx\directlua\@undefined \else + \ifx\directlua\relax \else + \def\MT@engine{lua} +% \end{macrocode} +% Since approx. \luatex\ 0.80, \cmd\pdftexversion\ is let to \cmd\luatexversion, +% so that we would be fooled to think that \pdftex\ is too old. +% \begin{macrocode} +%<*letterspace> + \let\MT@pdf@or@lua\@secondoftwo + \ifnum\luatexversion < 62 \def\MT@engine@tooold{0} + \else + \def\MT@engine@tooold{1} + \ifnum\luatexversion > 84 + \let\pdfoutput\outputmode + \let\pdfprotrudechars\protrudechars + \fi + \fi +%</letterspace> + \fi +\fi +%<*package> +\ifx\MT@engine\relax + \ifx\XeTeXversion\@undefined \else + \ifx\XeTeXversion\relax \else + \def\MT@engine{xe} + \fi + \fi +\fi +%</package> +%</package|letterspace> +% \end{macrocode} +%\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 seven cases for \pdftex: +%\begin{enum} +% \item not running \pdftex +% \item \pdftex\ ($\less$~0.14f) +% \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) +%\changes{v1.8}{2005/04/15}{case 5: \pdftex\ 1.30} +% \item + \cmd{\(left,right)marginkern}; +% \cmd\pdfnoligatures; +% \cmd\pdfstrcmp; +% \cmd\pdfescapestring\ ($\geq$~1.30) +%\changes{v2.0}{2005/08/20}{case 6: \pdftex\ 1.40} ^^A (beta:1) +% \item + adjustment of interword spacing; +% 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) +%\changes{v2.2}{2007/02/23}{case 7: \pdftex\ 1.40.4} +% \item + \cmd\letterspacefont\ doesn't disable ligatures and kerns; +% \cmd\pdfcopyfont\ +% ($\geq$~1.40.4) +%\end{enum} +%\changes{v1.1}{2004/09/13}{fix: version check +% (reported by \contributor Harald Harders <h.harders\at tu-bs.de>)} +% ^^A private mail, 2004/09/13 +% \begin{macrocode} +%<*pdftex-def> +%<debug>\MT@dinfo@nl{0}{this is pdftex \the\pdftexversion(\pdftexrevision)} +\def\MT@pdftex@no{7} +\ifnum\pdftexversion = 140 + \ifnum\pdftexrevision < 4 + \def\MT@pdftex@no{6} + \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} + \ifnum \expandafter`\pdftexrevision < `f + \def\MT@pdftex@no{1} + \fi + \fi + \else + \ifnum\pdftexversion < 14 + \def\MT@pdftex@no{1} + \fi + \fi + \fi + \fi + \fi +\fi +%<debug>\MT@dinfo@nl{0}{pdftex no.: \MT@pdftex@no} +%</pdftex-def> +% \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. +% \begin{macrocode} +%<*xetex-def> +%<debug>\MT@dinfo@nl{0}{this is xetex (\the\XeTeXversion\XeTeXrevision)} +\ifdim 0\XeTeXrevision pt < 0.9997pt + \def\MT@xetex@no{1} +\else + \def\MT@xetex@no{2} +\fi +%<debug>\MT@dinfo@nl{0}{xetex no.: \MT@xetex@no} +%</xetex-def> +% \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\ ($\geq$~0.62) +% \item + almost all of the \pdftex\ primitives have been renamed ($\geq$~0.85) +% \item + default \cmd\efcode\,=\,1000; +% \cmd\protrusionboundary\ [not yet supported] ($\geq$~0.90) +%\todo{interface for \cmd\protrusionboundary} +%\end{enum} +%\changes{v2.6}{2016/04/22}{update for \luatex\ 0.85 (renamed primitives)} +% \begin{macrocode} +%<*luatex-def> +%<debug>\MT@dinfo@nl0{this is luatex (\the\luatexversion)} +% \end{macrocode} +%\begin{macro}{\MT@lua} +% Communicate with |lua|. +%\changes{v2.2}{2007/05/10}{(basic) support for \luatex} +% Beginning with \luatex\ 0.36, \cmd\directlua\ no longer requires a state +% number. +%\changes{v2.3d}{2009/03/25}{update for \luatex\ 0.36} +% \begin{macrocode} +\def\MT@lua{\directlua} +\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 +% \end{macrocode} +%\end{macro} +% \begin{macrocode} +%<debug>\MT@dinfo@nl{0}{luatex no.: \MT@luatex@no} +%</luatex-def> +% \end{macrocode} +%\end{macro} +% \begin{macrocode} +%<*pdftex-def|xetex-def|letterspace> +\ifnum +%<pdftex-def|xetex-def> \csname MT@\MT@engine tex@no\endcsname < 2 +%<letterspace> \MT@engine@tooold=\z@ + \MT@warning@nl{You +%<*letterspace> + \ifx\MT@engine\relax + don't seem to be using pdftex or luatex.\MessageBreak + Try running `pdftex' or `luatex' instead of\MessageBreak + `\ifx\XeTeXversion\@undefined\else xe\fi tex'% + \else +%</letterspace> + are using a \MT@engine tex version older than +%<pdftex-def> 0.14f% +%<xetex-def> 0.9997% +%<letterspace> \MT@pdf@or@lua{1.40}{0.62}% + .\MessageBreak + `\MT@MT' does not work with this version.\MessageBreak + Please install a newer version of \MT@engine tex% +%<letterspace> \fi + .\MessageBreak I will quit now} + \MT@clear@options +\endinput\fi +%</pdftex-def|xetex-def|letterspace> +% \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}} +% \begin{macrocode} +%<*package|letterspace> +\RequirePackage{keyval}[1997/11/10] +%<*package> +% \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}{\ifMT@if@} +% 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@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@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} +%\begin{macro}{\MT@pr@level} +%\begin{macro}{\MT@ex@level} +%\begin{macro}{\MT@pr@factor} +%\begin{macro}{\MT@ex@factor} +%\begin{macro}{\MT@sp@factor} +%\begin{macro}{\MT@kn@factor} +% \dots~and numbers. +% \begin{macrocode} +\let\MT@pr@level\tw@ +\let\MT@ex@level\tw@ +\let\MT@pr@factor\@m +\let\MT@ex@factor\@m +\let\MT@sp@factor\@m +\let\MT@kn@factor\@m +% \end{macrocode} +%\end{macro} +%\end{macro} +%\end{macro} +%\end{macro} +%\end{macro} +%\end{macro} +%\begin{macro}{\MT@pr@unit} +%\begin{macro}{\MT@sp@unit} +%\begin{macro}{\MT@kn@unit} +% Default unit for protrusion settings is character width, for spacing +% |space|, for kerning (and tracking) \EM{1}. +% \begin{macrocode} +\let\MT@pr@unit\@empty +\let\MT@sp@unit\m@ne +\def\MT@kn@unit{1em} +% \end{macrocode} +%\end{macro} +%\end{macro} +%\end{macro} +%\begin{macro}{\MT@stretch} +%\begin{macro}{\MT@shrink} +%\begin{macro}{\MT@step} +% Expansion settings. +% \begin{macrocode} +\let\MT@stretch\m@ne +\let\MT@shrink \m@ne +\let\MT@step \m@ne +% \end{macrocode} +%\end{macro} +%\end{macro} +%\end{macro} +%\begin{macro}{\MT@pr@min} +%\begin{macro}{\MT@pr@max} +%\begin{macro}{\MT@ex@min} +%\begin{macro}{\MT@ex@max} +%\begin{macro}{\MT@sp@min} +%\begin{macro}{\MT@sp@max} +%\begin{macro}{\MT@kn@min} +%\begin{macro}{\MT@kn@max} +%\begin{macro}{\MT@tr@min} +%\begin{macro}{\MT@tr@max} +% Minimum and maximum values allowed by \pdftex. +% \begin{macrocode} +\def\MT@pr@min{-\@m} +\let\MT@pr@max\@m +\let\MT@ex@min\z@ +\let\MT@ex@max\@m +\def\MT@sp@min{-\@m} +\let\MT@sp@max\@m +\def\MT@kn@min{-\@m} +\let\MT@kn@max\@m +%</package> +\def\MT@tr@min{-\@m} +\let\MT@tr@max\@m +%<*package> +% \end{macrocode} +%\end{macro} +%\end{macro} +%\end{macro} +%\end{macro} +%\end{macro} +%\end{macro} +%\end{macro} +%\end{macro} +%\end{macro} +%\end{macro} +%\begin{macro}{\MT@factor@default} +% Default factor. +% \begin{macrocode} +\def\MT@factor@default{1000 } +% \end{macrocode} +%\end{macro} +%\begin{macro}{\MT@stretch@default} +%\begin{macro}{\MT@shrink@default} +% Default values for expansion. +% \begin{macrocode} +\def\MT@stretch@default{20 } +\def\MT@shrink@default{20 } +% \end{macrocode} +%\end{macro} +%\end{macro} +%\begin{macro}{\MT@letterspace} +%\begin{macro}{\MT@letterspace@default} +% Default value for letterspacing (in thousandths of \EM{1}). +% \begin{macrocode} +%</package> +\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 +%</package> +%</package|letterspace> +% \end{macrocode} +%\end{macro} +% +%\subsubsection{Auxiliary macros} +% +%\begin{macro}{\MT@requires@pdftex} +%\begin{macro}{\MT@requires@luatex} +% For definitions that depend on a particular \pdftex\ resp. \luatex\ version. +% \begin{macrocode} +%<*pdftex-def|luatex-def> +\def +%<pdftex-def> \MT@requires@pdftex% +%<luatex-def> \MT@requires@luatex% + #1{\ifnum +%<pdftex-def> \MT@pdftex@no +%<luatex-def> \MT@luatex@no + <#1 \expandafter\@secondoftwo\else\expandafter\@firstoftwo\fi} +%<luatex-def&debug>\MT@requires@luatex4{\directlua{tex.enableprimitives('pdf',{'tracingfonts'})}}\relax +%<pdftex-def&debug>\MT@requires@pdftex6{ +%<debug>\pdftracingfonts=1 +%<pdftex-def&debug>}\relax +%</pdftex-def|luatex-def> +% \end{macrocode} +%\end{macro} +%\end{macro} +% Some functions are loaded from a dedicated |lua| file. This avoids character +% escaping problems and incompatibilities between versions of \luatex. +%\changes{v2.5a}{2013/04/19}{use \pkg{luatexbase} instead of \pkg{luatextra} +% (contributed by \contributor \'Elie Roux <elie.roux\at telecom-bretagne.eu>)} +% ^^A MID: <516AAF6B.8040605@telecom-bretagne.eu> +% Unless running a recent \LaTeX, +%\changes{v2.7}{2017/02/08}{drop \pkg{luatexbase} with recent \LaTeX} +% we load the \pkg{luatexbase} package. +% \begin{macrocode} +%<*luatex-def> +\@ifl@t@r\fmtversion{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} +% \begin{macrocode} +\RequirePackage{luaotfload} +\MT@lua{require("microtype")} +%</luatex-def> +% \end{macrocode} +% Here it begins. The module was contributed by \'Elie Roux. +%\changes{v2.4}{2009/11/12}{new file \file{microtype.lua} containing the \texttt{lua} functions +% (contributed by \contributor \'Elie Roux <elie.roux\at telecom-bretagne.eu>)} +%\changes{v2.7b}{2019/02/28}{update lua function \texttt{microtype.warning} after changes in \pkg{luaotfload} +% (reported by \contributor Moritz Wemheuer <moritz.wemheuer\at gmail.com> and +% \contributor Ulrike Fischer <news3\at nililand.de>)} +% ^^A private mail, 2019/02/19 +% ^^A private mail, 2019/02/26 +% \begin{macrocode} +%<*luafile> + +function microtype.warning(...) + luatexbase.module_warning("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.CatcodeTableAtletter -- luatexbase +end +function microtype.sprint (...) + tex.sprint(catpackage, ...) +end + +%</luafile> +% \end{macrocode} +% To be continued, but first back to primitives. +%\begin{macro}{\MT@glet} +%\changes{v1.9f}{2006/08/09}{new macro} +% Here's the forgotten one. +% \begin{macrocode} +%<*package|letterspace> +\def\MT@glet{\global\let} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\MT@exp@cs} +%\begin{macro}{\MT@exp@gcs} +%\changes{v2.3b}{2008/03/07}{new macro: reduce save stack size} +% Commands to create command sequences. Those that are going to be defined +% globally should be created inside a group so that the save stack won't +% explode. +% \begin{macrocode} +\def\MT@exp@cs#1#2{\expandafter#1\csname#2\endcsname} +%<*package> +\def\MT@exp@gcs#1#2{\begingroup\expandafter\endgroup\expandafter#1\csname#2\endcsname} +% \end{macrocode} +%\end{macro} +%\end{macro} +%\changes{v1.4b}{2004/11/21}{optimisation: use less \cmd\expandafter s and \cmd\csname s} +%\begin{macro}{\MT@def@n} +%\begin{macro}{\MT@gdef@n} +%\changes{v1.9f}{2006/08/09}{new macros: global variants} +% This is \cmd\@namedef\ and global. +% \begin{macrocode} +\def\MT@def@n{\MT@exp@cs\def} +\def\MT@gdef@n{\MT@exp@gcs\gdef} +% \end{macrocode} +%\end{macro} +%\end{macro} +%\begin{macro}{\MT@edef@n} +%\begin{macro}{\MT@xdef@n} +% Its expanding versions. +% \begin{macrocode} +%</package> +\def\MT@edef@n{\MT@exp@cs\edef} +%<*package> +\def\MT@xdef@n{\MT@exp@gcs\xdef} +% \end{macrocode} +%\end{macro} +%\end{macro} +%\begin{macro}{\MT@let@nc} +%\begin{macro}{\MT@glet@nc} +% \cmd\let\ a \cmd\csname\ sequence to a command. +% \begin{macrocode} +\def\MT@let@nc{\MT@exp@cs\let} +\def\MT@glet@nc{\MT@exp@gcs\MT@glet} +% \end{macrocode} +%\end{macro} +%\end{macro} +%\begin{macro}{\MT@let@cn} +% \cmd\let\ a command to a \cmd\csname\ sequence. +% \begin{macrocode} +%</package> +\def\MT@let@cn#1#2{\expandafter\let\expandafter#1\csname #2\endcsname} +%<*package> +% \end{macrocode} +%\end{macro} +%\begin{macro}{\MT@let@nn} +%\begin{macro}{\MT@glet@nn} +% \cmd\let\ a \cmd\csname\ sequence to a \cmd\csname\ sequence. +% \begin{macrocode} +\def\MT@let@nn{\MT@exp@cs\MT@let@cn} +\def\MT@glet@nn{\MT@exp@gcs{\global\expandafter\MT@let@cn}} +% \end{macrocode} +%\end{macro} +%\end{macro} +%\begin{macro}{\MT@@font} +% Remove trailing space from the font name. +% \begin{macrocode} +\def\MT@@font{\expandafter\string\MT@font} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\MT@exp@one@n} +% Expand the second token once and enclose it in braces. +% \begin{macrocode} +%</package> +\def\MT@exp@one@n#1#2{\expandafter#1\expandafter{#2}} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\MT@exp@two@c} +% Expand the next two tokens after \meta{\#1} once. +% \begin{macrocode} +\def\MT@exp@two@c#1{\expandafter\expandafter\expandafter#1\expandafter} +%<*package> +% \end{macrocode} +%\end{macro} +%\begin{macro}{\MT@exp@two@n} +%\changes{v1.9}{2005/09/28}{new macros: less \cmd\expandafter s} +% Expand the next two tokens after \meta{\#1} once and enclose them in braces. +% \begin{macrocode} +\def\MT@exp@two@n#1#2#3{% + \expandafter\expandafter\expandafter + #1\expandafter\expandafter\expandafter + {\expandafter#2\expandafter}\expandafter{#3}} +% \end{macrocode} +%\end{macro} +% You do not wonder why |\MT@exp@one@c| doesn't exist, do you? +%\changes{v1.6}{2005/01/19}{use \etex's \cs{ifcsname} and \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 \cs{ifdefined} and +% \cs{ifcsname}, which decreases memory use substantially. +% \begin{macrocode} +\def\MT@ifdefined@c@T#1{% +^^X \ifdefined#1\expandafter\@firstofone\else\expandafter\@gobble\fi +^^Q \ifx#1\@undefined\expandafter\@gobble\else\expandafter\@firstofone\fi +} +%</package> +\def\MT@ifdefined@c@TF#1{% +^^X \ifdefined#1\expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi +%<package>^^Q \ifx#1\@undefined +%<package>^^Q \expandafter\@secondoftwo\else\expandafter\@firstoftwo\fi +} +\def\MT@ifdefined@n@T#1{% +^^X \ifcsname#1\endcsname\expandafter\@firstofone\else\expandafter\@gobble\fi +%<package>^^Q \begingroup\MT@exp@two@c\endgroup\ifx\csname #1\endcsname\relax +%<package>^^Q \expandafter\@gobble\else\expandafter\@firstofone\fi +} +\def\MT@ifdefined@n@TF#1{% +^^X \ifcsname#1\endcsname\expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi +%<package>^^Q \begingroup\MT@exp@two@c\endgroup\ifx\csname #1\endcsname\relax +%<package>^^Q \expandafter\@secondoftwo\else\expandafter\@firstoftwo\fi +} +%<*package> +% \end{macrocode} +%\end{macro} +%\end{macro} +%\end{macro} +%\end{macro} +%\begin{macro}{\MT@detokenize@n} +%\changes{v1.9d}{2006/03/08}{new macro: use \cmd\detokenize\ if available} +%\begin{macro}{\MT@detokenize@c} +%\changes{v1.9}{2005/08/17}{fix the \nonetex\ version} +%\changes{v2.3c}{2008/08/23}{fix: remove last space only +% (reported by \contributor Ulrich Dirr <ud\at mucschach.de>)} +% ^^A private mail, 2008/08/22 +%\begin{macro}{\MT@rem@last@space} +% Translate a macro into a token list. With \etex, we can use \cmd\detokenize. +% We also need to remove the last trailing space; and only the last one -- +% therefore the fiddling (and the \cmd\string\ isn't perfect, of course). +% \begin{macrocode} +\def\MT@detokenize@n#1{% +^^X \expandafter\MT@rem@last@space\detokenize{#1} \@nil +^^Q \string#1% +} +\def\MT@detokenize@c#1{% +^^X \MT@exp@one@n\MT@detokenize@n#1% +^^Q \MT@exp@two@c\MT@rem@last@space\strip@prefix\meaning#1 \@nil +} +\def\MT@rem@last@space#1 #2{#1% + \ifx\@nil#2\else \space + \expandafter\MT@rem@last@space\expandafter#2\fi +} +% \end{macrocode} +%\end{macro} +%\end{macro} +%\end{macro} +%\begin{macro}{\MT@ifempty} +% Test whether argument is empty. +%\changes{v1.1}{2004/09/15}{fix: use category code 12 for the percent character +% (reported by \contributor Tom Kink <kink\at hia.rwth-aachen.de>)} +% ^^A MID: <2qrkp9F134l6lU1@uni-berlin.de> +% \begin{macrocode} +%</package> +\begingroup +\catcode`\%=12 +\catcode`\&=14 +\gdef\MT@ifempty#1{& + \if %#1%& + \expandafter\@firstoftwo + \else + \expandafter\@secondoftwo + \fi +} +\endgroup +%<*package> +% \end{macrocode} +%\end{macro} +%\begin{macro}{\MT@ifint} +% Test whether argument is an integer, using an old trick by Mr. Arseneau, +%\changes{v1.9a}{2005/11/03}{use \cmd\pdfmatch\ if available} +% or the latest and greatest from \pdftex\ +%\changes{v2.2}{2007/05/10}{employ \luatex\ features if available} +% or \luatex\ (which also allows negative numbers, as required by the +% \opt{letterspace} option). +% \begin{macrocode} +%</package> +%</package|letterspace> +%<pdftex-def>\MT@requires@pdftex6{ +%<letterspace>\MT@pdf@or@lua{ +%<*pdftex-def|letterspace> +\def\MT@ifint#1{% + \ifcase\pdfmatch{^-*[0-9]+ *$}{#1}\relax + \expandafter\@secondoftwo + \else + \expandafter\@firstoftwo + \fi +} +}{ +%</pdftex-def|letterspace> +%<*pdftex-def|xetex-def|letterspace> +\def\MT@ifint#1{% + \if!\ifnum9<1#1!\else?\fi + \expandafter\@firstoftwo + \else + \expandafter\@secondoftwo + \fi +} +%</pdftex-def|xetex-def|letterspace> +%<pdftex-def|letterspace>} +%<luatex-def>\def\MT@ifint#1{\csname\MT@lua{microtype.if_int([[#1]])}\endcsname} +%<*luafile> +local function if_int(s) + if find(s,"^-*[0-9]+ *$") then + tex_write("@firstoftwo") + else + tex_write("@secondoftwo") + end +end +microtype.if_int = if_int + +%</luafile> +% \end{macrocode} +%\end{macro} +%\begin{macro}{\MT@ifdimen} +% Test whether argument is dimension (or number). +%\changes{v1.4b}{2004/11/22}{don't set \cs{MT@count} globally (save stack problem)} +%\changes{v1.7}{2005/03/15}{comparison with 1 to allow size smaller than 1 +% (suggested by \contributor Andreas B\"uhmann <andreas.buehmann\at web.de>)} +% ^^A private mail, 2005/03/15 +%\changes{v1.9b}{2006/01/05}{use \cmd\pdfmatch\ if available} +% (|nd| and |nc| are new Didot resp. Cicero, added in \pdftex\ 1.30; |px| is a pixel.) +%\changes{v2.2}{2007/05/10}{employ \luatex\ features if available} +%\todo{fix \texttt{lua} expression} +% \begin{macrocode} +%<*pdftex-def> +\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 +} +}{ +%</pdftex-def> +%<*pdftex-def|xetex-def> +\def\MT@ifdimen#1{% + \setbox\z@=\hbox{% + \MT@count=1#1\relax + \ifnum\MT@count=\@ne + \aftergroup\@secondoftwo + \else + \aftergroup\@firstoftwo + \fi + }% +} +%</pdftex-def|xetex-def> +%<pdftex-def>} +%<luatex-def>\def\MT@ifdimen#1{\csname\MT@lua{microtype.if_dimen([[#1]])}\endcsname} +%<*luafile> +local function if_dimen(s) + if (find(s, "^-*[0-9]+(%a*) *$") or + find(s, "^-*[0-9]*[.,][0-9]+(%a*) *$")) then + tex_write("@firstoftwo") + else + tex_write("@secondoftwo") + end +end +microtype.if_dimen = if_dimen + +%</luafile> +% \end{macrocode} +%\end{macro} +%\begin{macro}{\MT@ifdim} +% Compare floating point numbers. +% \begin{macrocode} +%<*package> +\def\MT@ifdim#1#2#3{% + \ifdim #1\p@ #2 #3\p@ + \expandafter\@firstoftwo + \else + \expandafter\@secondoftwo + \fi +} +%</package> +% \end{macrocode} +%\end{macro} +%\begin{macro}{\MT@ifstreq} +% Test whether two strings (fully expanded) are equal. +%\changes{v1.9a}{2005/11/03}{use \cmd\pdfstrcmp\ if available} +%\changes{v2.2}{2007/03/07}{fix: \nonetex\ version shouldn't use \cmd\x\ and \cmd\y\ +% (found by \contributor Wiebke Petersen <petersew\at uni-duesseldorf.de>)} +% ^^A MID: <esmd6k$954$1@news1.rz.uni-duesseldorf.de> +%\changes{v2.2}{2007/05/10}{employ \luatex\ features if available} +% \begin{macrocode} +%<*pdftex-def> +\MT@requires@pdftex5{ +\def\MT@ifstreq#1#2{% + \ifcase\pdfstrcmp{#1}{#2}\relax + \expandafter\@firstoftwo + \else + \expandafter\@secondoftwo + \fi +} +}{ +%</pdftex-def> +%<*pdftex-def|xetex-def> +\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 +} +%</pdftex-def|xetex-def> +%<pdftex-def>} +%<luatex-def>\def\MT@ifstreq#1#2{\csname\MT@lua{microtype.if_str_eq([[#1]],[[#2]])}\endcsname} +%<*luafile> +local function if_str_eq(s1, s2) + if s1 == s2 then + tex_write("@firstoftwo") + else + tex_write("@secondoftwo") + end +end +microtype.if_str_eq = if_str_eq + +%</luafile> +% \end{macrocode} +%\end{macro} +%\begin{macro}{\MT@xadd} +%\changes{v1.8}{2005/04/17}{simplified} +% Add item to a list. +% \begin{macrocode} +%<*package> +\def\MT@xadd#1#2{% + \ifx#1\relax + \xdef#1{#2}% + \else + \xdef#1{#1#2}% + \fi +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\MT@xaddb} +% Add item to the beginning. +% \begin{macrocode} +\def\MT@xaddb#1#2{% + \ifx#1\relax + \xdef#1{#2}% + \else + \xdef#1{#2#1}% + \fi +} +%</package> +% \end{macrocode} +%\end{macro} +%\begin{macro}{\MT@map@clist@n} +%\changes{v1.8}{2005/04/17}{new macro: used instead of \cmd\@for} +%\changes{v1.9a}{2005/11/03}{following \LaTeX3} +%\begin{macro}{\MT@map@clist@c} +%\begin{macro}{\MT@map@clist@} +%\begin{macro}{\MT@clist@function} +%\begin{macro}{\MT@clist@break} +% Run \meta{\#2} on all elements of the comma list \meta{\#1}. This and the +% following is modelled after \LaTeX3 commands. +% \begin{macrocode} +%<*package|letterspace> +\def\MT@map@clist@n#1#2{% + \ifx\@empty#1\else + \def\MT@clist@function##1{#2}% + \MT@map@clist@#1,\@nil,\@nnil + \fi +} +% \end{macrocode} +%\todo{think \cs{@nil} should be defined as itself} +% \begin{macrocode} +\def\MT@map@clist@c#1{\MT@exp@one@n\MT@map@clist@n#1} +\def\MT@map@clist@#1,{% + \ifx\@nil#1% + \expandafter\MT@clist@break + \fi + \MT@clist@function{#1}% + \MT@map@clist@ +} +\let\MT@clist@function\@gobble +\def\MT@clist@break#1\@nnil{} +%<*package> +% \end{macrocode} +%\end{macro} +%\end{macro} +%\end{macro} +%\end{macro} +%\end{macro} +%\begin{macro}{\MT@map@tlist@n} +%\changes{v1.8}{2005/04/16}{new macro: used instead of \cmd\@tfor} +%\begin{macro}{\MT@map@tlist@c} +%\begin{macro}{\MT@map@tlist@} +%\begin{macro}{\MT@tlist@break} +% Execute \meta{\#2} on all elements of the token list \meta{\#1}. +% \cs{MT@tlist@break} can be used to jump out of the loop. +% \begin{macrocode} +\def\MT@map@tlist@n#1#2{\MT@map@tlist@#2#1\@nnil} +\def\MT@map@tlist@c#1#2{\expandafter\MT@map@tlist@\expandafter#2#1\@nnil} +\def\MT@map@tlist@#1#2{% + \ifx\@nnil#2\else + #1{#2}% + \expandafter\MT@map@tlist@ + \expandafter#1% + \fi +} +\def\MT@tlist@break#1\@nnil{\fi} +% \end{macrocode} +%\end{macro} +%\end{macro} +%\end{macro} +%\end{macro} +%\begin{macro}{\ifMT@inlist@} +%\begin{macro}{\MT@in@clist} +% Test whether item \meta{\#1} is in comma list \meta{\#2}. +%^^A\changes{v1.4b}{2004/11/22}{fix: compare with \cmd\\ instead of \cmd\relax\ +%^^A (discovered by \contributor Herb Schulz <herbs\at wideopenwest.com>)} +%^^A ^^A MID: <BDBFA967.C01F%herbs@wideopenwest.com> +% Using \cmd\pdfmatch\ would be slower. +%\changes{v1.9a}{2005/11/03}{fix} +%\changes{v2.3}{2007/11/14}{don't use \cmd\x\ +% (reported by \contributor Peter Meier <Peter.Meier998\at gmx.de>)} +% ^^A private mail, 2007/11/12 +% \begin{macrocode} +\newif\ifMT@inlist@ +\def\MT@in@clist#1#2{% + \def\MT@res@a##1,#1,##2##3\@nnil{% + \ifx##2\@empty + \MT@inlist@false + \else + \MT@inlist@true + \fi + }% + \expandafter\MT@res@a\expandafter,#2,#1,\@empty\@nnil +} +% \end{macrocode} +%\end{macro} +%\end{macro} +%\begin{macro}{\MT@rem@from@clist} +% Remove item \meta{\#1} from comma list \meta{\#2}. This is basically +% \cmd\@removeelement\ from \file{ltcntrl.dtx}. +%\changes{v1.9}{2005/10/28}{new macro: remove an item from a comma list} +%\changes{v1.9a}{2005/11/03}{fix} +%\changes{v1.9e}{2006/07/26}{model after \cmd\@removeelement} +% Using \cmd\pdfmatch\ and \cmd\pdflastmatch\ here would be really slow! +% \begin{macrocode} +\def\MT@rem@from@clist#1#2{% + \def\MT@res@a##1,#1,##2\MT@res@a{##1,##2\MT@res@b}% + \def\MT@res@b##1,\MT@res@b##2\MT@res@b{\ifx,##1\@empty\else##1\fi}% + \xdef#2{\MT@exp@two@c\MT@res@b\MT@res@a\expandafter,#2,\MT@res@b,#1,\MT@res@a}% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\MT@in@tlist} +%\begin{macro}{\MT@in@tlist@} +% Test whether item is in token list. Since this isn't too elegant, I thought +% that at least here, \cmd\pdfmatch\ would be more efficient -- however, it +% turned out to be even slower than this solution. +% \begin{macrocode} +\def\MT@in@tlist#1#2{% + \MT@inlist@false + \def\MT@res@a{#1}% + \MT@map@tlist@c#2\MT@in@tlist@ +} +\def\MT@in@tlist@#1{% + \edef\MT@res@b{#1}% + \ifx\MT@res@a\MT@res@b + \MT@inlist@true + \expandafter\MT@tlist@break + \fi +} +% \end{macrocode} +%\end{macro} +%\end{macro} +%\begin{macro}{\MT@in@rlist} +%\changes{v1.8}{2005/04/20}{made recursive} +%\begin{macro}{\MT@in@rlist@} +%\begin{macro}{\MT@in@rlist@@} +%\begin{macro}{\MT@size@name} +% Test whether size \cs{MT@size} is in a list of ranges. Store the name of the +% list in \cs{MT@size@name} +% \begin{macrocode} +\def\MT@in@rlist#1{% + \MT@inlist@false + \MT@map@tlist@c#1\MT@in@rlist@ +} +\def\MT@in@rlist@#1{\expandafter\MT@in@rlist@@#1} +\def\MT@in@rlist@@#1#2#3{% + \MT@ifdim{#2}=\m@ne{% + \MT@ifdim{#1}=\MT@size + \MT@inlist@true + \relax + }{% + \MT@ifdim\MT@size<{#1}\relax{% + \MT@ifdim\MT@size<{#2}% + \MT@inlist@true + \relax + }% + }% + \ifMT@inlist@ + \def\MT@size@name{#3}% + \expandafter\MT@tlist@break + \fi +} +% \end{macrocode} +%\end{macro} +%\end{macro} +%\end{macro} +%\end{macro} +%\begin{macro}{\MT@loop} +%\changes{v1.2}{2004/09/23}{fix: new macro, used instead of \cmd\loop} +%\begin{macro}{\MT@iterate} +%\begin{macro}{\MT@repeat} +% This is the same as \LaTeX's \cmd\loop, which we mustn't use, since this +% could confuse an outer \cmd\loop\ in the document. +% \begin{macrocode} +%</package> +\def\MT@loop#1\MT@repeat{% + \def\MT@iterate{#1\relax\expandafter\MT@iterate\fi}% + \MT@iterate \let\MT@iterate\relax +} +\let\MT@repeat\fi +% \end{macrocode} +%\end{macro} +%\end{macro} +%\end{macro} +%\begin{macro}{\MT@while@num} +% Execute \meta{\#3} from \meta{\#1} up to (excluding) \meta{\#2} (much faster +% than \LaTeX's \cmd\@whilenum). +% \begin{macrocode} +\def\MT@while@num#1#2#3{% + \@tempcnta#1\relax + \MT@loop #3% + \advance\@tempcnta \@ne + \ifnum\@tempcnta < #2\MT@repeat +} +%</package|letterspace> +% \end{macrocode} +%\end{macro} +%\changes{v2.6a}{2016/05/03}{fixes for \letterspace\ package with \luatex} +%\begin{macro}{\MT@do@font} +% Execute \meta{\#1} 256 times, +% \begin{macrocode} +%<pdftex-def|letterspace>\def\MT@do@font{\MT@while@num\z@\@cclvi} +% \end{macrocode} +% resp. for the whole font for \luatex, if loaded by \pkg{fontspec}/\pkg{luaotfload}. +%\changes{v2.5}{2010/08/14}{adapt for \luatex} +%\changes{v2.6}{2013/07/14}{speed up for \luatex} +%\changes{v2.6a}{2015/05/10}{fix \texttt{lua} function +% (reported by \contributor Herbert Vo\ss{} <Herbert.Voss\at FU-Berlin.DE>)} +% ^^A private mail, 2016/05/10 +% \begin{macrocode} +%<*luatex-def> +\def\MT@do@font#1{% + \MT@if@fontspec@font{% + \def\MT@dofont@function{#1}% + \MT@lua{microtype.do_font()}% + }{\MT@while@num\z@\@cclvi{#1}}% +} +%</luatex-def> +% \end{macrocode} +% This is the |lua| function, which is much faster than looping through all glyphs +% in \TeX. Legacy fonts (which this function might be fed with, because \pkg{fontspec} +% isn't always getting it right) don't contain a |v.index| field. +% \begin{macrocode} +%<*luafile> +local function do_font() + if fonts then + local thefont + if fonts.ids then --- legacy luaotfload + thefont = fonts.ids[font.current()] + else --- new location + thefont = fonts.hashes.identifiers[font.current()] + end + if thefont then + for i,v in next,thefont.characters do + if v.index == nil or v.index > 0 then + microtype.sprint([[\@tempcnta=]]..i..[[\relax\MT@dofont@function]]) + end + end + end + end +end +microtype.do_font = do_font + +%</luafile> +% \end{macrocode} +% The \xetex\ variant. +%\changes{v2.5}{2010/05/18}{adapt for \xetex} +% \begin{macrocode} +%<*xetex-def> +\def\MT@do@font#1{% + \@tempcnta=\z@ + \MT@loop #1% + \advance\@tempcnta \@ne + \ifnum\@tempcnta < \XeTeXcountglyphs\MT@font \MT@repeat +} +%</xetex-def> +%<*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 \cs{numexpr} if available} +%\changes{v1.8}{2005/03/30}{fix: remove spaces in \nonetex\ variant +% (reported by \contributor Mark Rossi <mark.rossi\at de.bosch.com>)} +% ^^A MID: <d6uhag$qoi$1@ns2.fe.internet.bosch.com> +% Multiply and divide a counter. If we are using \etex, we will use its +% \cmd\numexpr\ primitive. This has the advantage that it is less likely to +% run into arithmetic overflow. The result of the division will be rounded +% instead of truncated. Therefore, we'll get a different (more accurate) +% result in about half of the cases. +% \begin{macrocode} +\def\MT@scale#1#2#3{% +^^Q \multiply #1 #2\relax + \ifnum #3 = \z@ +^^X #1=\numexpr #1 * #2\relax + \else +^^X #1=\numexpr #1 * #2 / #3\relax +^^Q \divide #1 #3\relax + \fi +} +% \end{macrocode} +%\end{macro} +%\changes{v1.7}{2005/03/07}{shorter command names} +%\begin{macro}{\MT@abbr@pr} +%\begin{macro}{\MT@abbr@ex} +%\begin{macro}{\MT@abbr@pr@c} +%\begin{macro}{\MT@abbr@ex@c} +%\begin{macro}{\MT@abbr@pr@inh} +%\begin{macro}{\MT@abbr@ex@inh} +%\begin{macro}{\MT@abbr@nl} +%\begin{macro}{\MT@abbr@sp} +%\begin{macro}{\MT@abbr@sp@c} +%\begin{macro}{\MT@abbr@sp@inh} +%\begin{macro}{\MT@abbr@kn} +%\begin{macro}{\MT@abbr@kn@c} +%\begin{macro}{\MT@abbr@kn@inh} +%\begin{macro}{\MT@abbr@tr} +%\begin{macro}{\MT@abbr@tr@c} +% Some abbreviations. Thus, we can have short command names but full-length +% log output. +% \begin{macrocode} +\def\MT@abbr@pr{protrusion} +\def\MT@abbr@ex{expansion} +\def\MT@abbr@pr@c{protrusion codes} +\def\MT@abbr@ex@c{expansion codes} +\def\MT@abbr@pr@inh{protrusion inheritance} +\def\MT@abbr@ex@inh{expansion inheritance} +\def\MT@abbr@nl{noligatures} +\def\MT@abbr@sp{spacing} +\def\MT@abbr@sp@c{interword spacing codes} +\def\MT@abbr@sp@inh{interword spacing inheritance} +\def\MT@abbr@kn{kerning} +\def\MT@abbr@kn@c{kerning codes} +\def\MT@abbr@kn@inh{kerning inheritance} +\def\MT@abbr@tr{tracking} +\def\MT@abbr@tr@c{tracking amount} +% \end{macrocode} +%\end{macro} +%\end{macro} +%\end{macro} +%\end{macro} +%\end{macro} +%\end{macro} +%\end{macro} +%\end{macro} +%\end{macro} +%\end{macro} +%\end{macro} +%\end{macro} +%\end{macro} +%\end{macro} +%\end{macro} +%\begin{macro}{\MT@rbba@protrusion} +%\begin{macro}{\MT@rbba@expansion} +%\begin{macro}{\MT@rbba@spacing} +%\begin{macro}{\MT@rbba@kerning} +%\begin{macro}{\MT@rbba@tracking} +% These we also need the other way round. +% \begin{macrocode} +\def\MT@rbba@protrusion{pr} +\def\MT@rbba@expansion{ex} +\def\MT@rbba@spacing{sp} +\def\MT@rbba@kerning{kn} +\def\MT@rbba@tracking{tr} +% \end{macrocode} +%\end{macro} +%\end{macro} +%\end{macro} +%\end{macro} +%\end{macro} +%\begin{macro}{\MT@features} +%\changes{v1.9b}{2006/01/17}{use throughout the package to adjust to beta-ness} +%\begin{macro}{\MT@features@long} +% We can work on these lists to save some guards in the \file{dtx} file. +% \begin{macrocode} +\def\MT@features{pr,ex,sp,kn,tr} +\def\MT@features@long{protrusion,expansion,spacing,kerning,tracking} +% \end{macrocode} +%\end{macro} +%\end{macro} +%\begin{macro}{\MT@is@feature} +%\changes{v1.9a}{2005/11/03}{new macro: check for \pdftex\ feature} +% Whenever an optional argument accepts a list of features, we can use this +% command to check whether a feature exists in order to prevent a rather +% confusing `|Missing \endcsname inserted|' error message. The feature (long +% form) must be in \meta{\#1}, the type of list to ignore in \meta{\#2}, +% then comes the action. +% \begin{macrocode} +\def\MT@is@feature#1#2{% + \MT@in@clist{#1}\MT@features@long + \ifMT@inlist@ + \expandafter\@firstofone + \else + \MT@error{`#1' is not an available micro-typographic\MessageBreak + feature. Ignoring #2}{Available features are: `\MT@features@long'.}% + \expandafter\@gobble + \fi +} +% \end{macrocode} +%\end{macro} +% +%\subsubsection{Compatibility}\label{sub: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{sssec:impl.hook}) +% \item \cmd\showhyphens\ (in section~\ref{sssec:impl.options}) +%\end{itemize} +% +% The \pkg{wordcount} package redefines the font-switching commands, which will +% break \microtype. Since \microtype\ doesn't have an effect on the number of +% words in the document anyway, we will simply disable ourselves. +%\changes{v2.2}{2007/02/11}{disable \microtype\ if \pkg{wordcount} is loaded +% (reported by \contributor Ross Hetherington <ross\at heth.eclipse.co.uk>)} +% ^^A MID: <A9-dnaHX5LxN01LYnZ2dnUVZ8tqqnZ2d@eclipse.net.uk> +% \begin{macrocode} +\@ifl@aded{tex}{wordcount}{% + \MT@warning@nl{Detected the `wordcount' utility.\MessageBreak + Disabling `\MT@MT', since it wouldn't work}% + \MT@clear@options\endinput}\relax +% \end{macrocode} +% The \pkg{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 \pkg{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 \pkg{combine} class)} +%\changes{v2.3e}{2009/08/31}{make space-unaware +% (requested by \contributor Marcin Borkowski <mbork\at atos.wmid.amu.edu.pl>)} +% ^^A private mail, 2009/08/31 +% The setup is deferred until the end of the preamble. This has a couple of +% advantages: \cs{microtypesetup} can be used to change options later on in the +% preamble, and fonts don't have to be set up before \microtype. +% \begin{macrocode} +%</package> +%<*package|letterspace> +%<plain>\MT@requires@latex1{ +\let\MT@setup@\@empty +% \end{macrocode} +%\end{macro} +%\begin{macro}{\MT@addto@setup} +% We use our private hook to have better control over the timing. +% This will also work with \pkg{eplain}, but not with \pkg{miniltx} alone. +% \begin{macrocode} +\def\MT@addto@setup{\g@addto@macro\MT@setup@} +% \end{macrocode} +%\end{macro} +% Don't hesitate with \pkg{miniltx}. +% \begin{macrocode} +%<plain>}{\let\MT@addto@setup\@firstofone} +% \end{macrocode} +%\begin{macro}{\MT@with@package@T} +% We almost never do anything if a package is not loaded. +% \begin{macrocode} +\def\MT@with@package@T#1{\@ifpackageloaded{#1}\@firstofone\@gobble} +%</package|letterspace> +%<*package> +% \end{macrocode} +%\end{macro} +%\begin{macro}{\MT@with@babel@and@T} +%\changes{v2.2}{2007/05/25}{also inspect class options} +% \LaTeX's \cmd\@ifpackagewith\ ignores the class options. +% \begin{macrocode} +\def\MT@with@babel@and@T#1{% + \MT@ifdefined@n@T{opt@babel.\@pkgextension}{% + \@expandtwoargs\MT@in@clist{#1} + {\csname opt@babel.\@pkgextension\endcsname,\@classoptionslist}% + \ifMT@inlist@\expandafter\@gobble\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 <herries.press\at earthlink.net> was so kind to provide the \cmd\l@dunhbox@line\ hook in +% \pkg{ledmac} to allow for protrusion. \cmd\leftmarginkern\ and +% \cmd\rightmarginkern\ are new primitives of \pdftex\ 1.21b (aka. 1.30.0). +%\changes{v2.5}{2012/07/02}{fix to work with \xetex\ +% (reported by \contributor Ma\"ieul Rouquette <maieul\at maieul.net>)} +% ^^A private mail, 2012/06/30 +% They are also part of recent \xetex. +%\changes{v2.5a}{2013/03/25}{support for \pkg{eledmac}} +%\changes{v2.6}{2015/08/10}{support for \pkg{reledmac}} +% The successor packages \pkg{eledmac} and \pkg{reledmac} are also supported. +% \begin{macrocode} +%</package> +%<pdftex-def>\MT@requires@pdftex5{ +%<*pdftex-def|luatex-def|xetex-def> + \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 + } +%</pdftex-def|luatex-def|xetex-def> +%<*pdftex-def> +}{ + \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 + } +} +%</pdftex-def> +% \end{macrocode} +%\end{macro} +% The \pkg{shapepar} package (v2.2) fixes this in a similar manner by itself, +% so we don't have to bother. +% ^^A missing protrusion with \pkg{shapepar} (reported by \contributor Giuseppe Palma <pippi.palma\at gmail.com>)} +% ^^A ^^A private mail, 2013/03/22 +% ^^A fixed in shapepar v2.2 (Mar 2013) +%\begin{macro}{\MT@restore@p@h} +% Restore meaning of \cmd\% and \cmd\#. +% \begin{macrocode} +%<*package|letterspace> +%<*package> +\def\MT@restore@p@h{\chardef\%`\% \chardef\#`\# } +% \end{macrocode} +%\end{macro} +%\begin{macro}{\ifMT@xunicode} +%\begin{macro}{\ifMT@fontspec} +% Two new conditionals for use with \xetex\ or \luatex. +% \begin{macrocode} +\newif\ifMT@xunicode +\MT@with@package@T{xunicode}\MT@xunicodetrue +%</package> +\newif\ifMT@fontspec +%<letterspace>\MT@requires@latex2{ +\MT@with@package@T{fontspec}\MT@fontspectrue +%<letterspace>}{\MT@fontspecfalse} +% \end{macrocode} +%\end{macro} +%\end{macro} +%\begin{macro}{\MT@if@fontspec@font} +%\begin{macro}{\MT@fontspec@setup} +%\changes{v2.6}{2016/04/23}{fix \cs{MT@if@fontspec@font} ABD} +% For fonts loaded by \pkg{fontspec} (or, rather, \pkg{luaotfload}) we can +% use some of the features the latter package provides. +% \begin{macrocode} +\let\MT@if@fontspec@font\@secondoftwo +\def\MT@fontspec@setup{% + \@ifpackagelater{fontspec}{2013/05/23}{ + \MT@let@cn\MT@if@fontspec@font{fontspec_if_fontspec_font:TF}% + }\relax +} +\ifMT@fontspec\MT@fontspec@setup\fi +% \end{macrocode} +%\end{macro} +%\end{macro} +%\begin{macro}{\MT@maybe@gobble@with@tikz} +%\begin{macro}{\MT@tikz@setup} +%\changes{v2.3e}{2009/11/02}{compatibility with \pkg{tikz} (first reported by +% \contributor Christian Stark <cstark\at gmx.de>)} ^^A MID: <7d81lgF2ad3ckU1@mid.dfncis.de>, 2009/07/28 +%^^A Also: \contributor Karl Karlsson <karl-karlsson\at yandex.ru> ^^A private mail, 2009/10/29 +%^^A \contributor hscm <henkmetselaar\at gmail.com> ^^A MID: <6a24e972-b1a7-4172-a5a0-d2707e016301@12g2000pri.googlegroups.com>, 2009/11/02 +%\changes{v2.7}{2016/06/08}{compatibility with \pkg{tikz} (again)} +% If \cmd\tikz@expandcount\ is greater than zero, we're inside or at the end of +% a \pkg{tikz} node, where we don't want to adjust spacing after letterspacing, +% lest we disturb \pkg{tikz}. This is used in \cs{MT@afteraftergroup}, and we +% don't need it for \letterspace. +% \begin{macrocode} +%<*package> +\let\MT@maybe@gobble@with@tikz\@firstofone +\def\MT@tikz@setup{% + \def\MT@maybe@gobble@with@tikz{% + \ifnum\tikz@expandcount>\z@ + \expandafter\@gobble + \else + \expandafter\@firstofone + \fi}} +% \end{macrocode} +%\end{macro} +%\end{macro} +%\begin{macro}{\MT@setupfont@hook} +% This hook will be executed every time a font is set up (inside a group). +% +% In the preamble, we check for the packages each time a font is set up. +% Thus, it will work regardless when the packages are loaded. +% +% Even for packages that don't activate any characters in the preamble (like +% \pkg{babel} and \pkg{csquotes}), we have to check here, too, in case they were +% loaded before \microtype, and a font is loaded \cmd\AtBeginDocument, before +% \microtype. +% (This is no longer needed, since the complete setup is now deferred until the +% end of the preamble. However, it is still necessary for \opt{defersetup}|=false|.) +% \begin{macrocode} +\def\MT@setupfont@hook{% +% \end{macrocode} +%\iffalse +%\changes{v1.7}{2005/02/06}{compatibility with the \pkg{chemsym} package} +% The \pkg{chemsym} package redefines, among other commands, the Hungarian +% umlaut \cmd\H\ in a way that cannot be parsed by \microtype. As a work-around, +% we restore the usual definition of \cmd\H\ before setting up the font (which +% will be done inside a group). +%\changes{v1.8}{2005/03/24}{remove superfluous \pkg{chemsym} hook} +% --- Since version 1.7, this is no longer needed, since our character parsing +% is robust enough now. +% +%\changes{v1.7}{2005/03/10}{compatibility with the \pkg{statex} package} +% Same for \pkg{statex}. +%\changes{v1.8}{2005/03/24}{remove superfluous \pkg{statex} hook} +% --- No longer needed, either. +%\fi +%\changes{v1.8}{2005/03/30}{restore percent character if Spanish \pkg{babel} is loaded} +%\changes{v2.2}{2007/02/02}{restore percent character if Galician \pkg{babel} is loaded} +%\changes{v2.3a}{2008/01/29}{restore percent character if Mexican \pkg{babel} is loaded} +% Spanish (as well as Galician and Mexican) \pkg{babel} modify \cmd\%, storing +% the original meaning in \cmd\percentsign. +% \begin{macrocode} + \MT@if@false + \MT@with@babel@and@T{spanish} \MT@if@true + \MT@with@babel@and@T{galician}\MT@if@true + \MT@with@babel@and@T{mexican} \MT@if@true + \ifMT@if@\MT@ifdefined@c@T\percentsign{\let\%\percentsign}\fi +% \end{macrocode} +%\changes{v1.8}{2005/04/22}{restore \pkg{csquotes}'s active characters} +% Using \cmd\@disablequotes, we can restore the original meaning of all +% characters made active by \pkg{csquotes}. +% (It would be doable for older versions, too, but we won't bother.) +% \begin{macrocode} + \MT@with@package@T{csquotes}{% + \@ifpackagelater{csquotes}{2005/05/11}\@disablequotes\relax}% +% \end{macrocode} +% \pkg{hyperref} redefines \cmd\% and \cmd\# inside a \cmd\url. We restore +% the original meanings (which we can only hope are correct). +%\changes{v1.8}{2005/05/20}{restore \cmd\% and \cmd\# when \pkg{hyperref} is loaded} +% Same for \pkg{tex4ht} +%\changes{v1.9d}{2006/02/27}{restore \cmd\% and \cmd\# when \pkg{tex4ht} is loaded +% (reported by \contributor Peter Dyballa <Peter_Dyballa\at Web.DE>)} +% ^^A private mail, 2006/02/26 +% and \pkg{mathastext}. +%\changes{v2.5}{2011/07/29}{restore \cmd\% and \cmd\# when \pkg{mathastext} is loaded +% (found by \contributor Seamus Bradley <@\at @>)} +% ^^A https://tex.stackexchange.com/questions/24248 +% ^^A (beta:07) +% \begin{macrocode} + \MT@if@false + \MT@with@package@T{hyperref} \MT@if@true + \MT@with@package@T{tex4ht} \MT@if@true + \MT@with@package@T{mathastext}\MT@if@true + \ifMT@if@\MT@restore@p@h\fi + \MT@with@package@T{tikz}\MT@tikz@setup +} +% \end{macrocode} +%\end{macro} +% Check again at the end of the preamble. +% \begin{macrocode} +%</package> +\MT@addto@setup{% +%<*package> +% \end{macrocode} +%\changes{v1.4}{2004/11/04}{check for \pkg{pdfcprot}} +% Our competitor, the \pkg{pdfcprot} package, must not be tolerated! +% \begin{macrocode} + \MT@with@package@T{pdfcprot}{% + \MT@error{Detected the `pdfcprot' package!\MessageBreak + `\MT@MT' and `pdfcprot' may not be used together}{% +The `pdfcprot' package provides an interface to character protrusion.\MessageBreak +So does the `\MT@MT' package. Using both packages at the same\MessageBreak +time will almost certainly lead to undesired results. Have your choice!}% + }% + \MT@with@package@T {ledmac}\MT@ledmac@setup + \MT@with@package@T {eledmac}\MT@ledmac@setup + \MT@with@package@T{reledmac}\MT@ledmac@setup + \MT@with@package@T{xunicode}\MT@xunicodetrue +%</package> +%<plain> \MT@requires@latex2{ + \MT@with@package@T{fontspec}{\MT@fontspectrue\MT@fontspec@setup}% +%<plain> }\relax +%<*package> +% \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 \pkg{tikzposter} +% (reported by \contributor Sam Mason <sam\at samason.me.uk>)} +% ^^A https://tex.stackexchange.com/questions/165846/ +% \begin{macrocode} + \MT@glet\MT@setupfont@hook\@empty + \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 + }{% + \MT@warning@nl{% + Should you receive warnings about unknown slot\MessageBreak + numbers, try upgrading the `csquotes' package}% + }% + }% +% \end{macrocode} +% We disable \microtype's additions inside \pkg{hyperref}'s \cmd\pdfstringdef, +% which redefines lots of commands. +%\changes{v1.9}{2005/09/10}{disable \microtype\ setup inside \pkg{hyperref}'s \cmd\pdfstringdef\ +% (reported by \contributor H\`an \thanhthe{} Th\`anh <hanthethanh\at gmail.com>)} +% ^^A private mail, 2005/09/10 +%\changes{v2.3}{2007/11/11}{disable \cs{microtypecontext} in \pkg{hyperref}'s \cmd\pdfstringdef} +% \pkg{hyperref} doesn't work with plain \TeX, so in that case we don't bother. +% \begin{macrocode} + \MT@if@false +%</package> +%<plain> \MT@requires@latex2{ + \MT@with@package@T{hyperref}{% + \pdfstringdefDisableCommands{% +%<*package> + \MT@ltx@pickupfont + \let\textmicrotypecontext\@secondoftwo + \let\microtypecontext\@gobble +%</package> + \def\lsstyle{\pdfstringdefWarn\lsstyle}% + \def\textls#1#{\pdfstringdefWarn\textls}% + }% +%<package> \MT@if@true + }% +%<plain> }\relax +%<*package> + \MT@with@package@T{tex4ht}\MT@if@true + \MT@with@package@T{mathastext}\MT@if@true + \ifMT@if@\g@addto@macro\MT@setupfont@hook\MT@restore@p@h\fi +% \end{macrocode} +%\changes{v1.9b}{2005/12/19}{compatibility with \pkg{listings}: sanitise more catcodes +% (reported by \contributor Holger Uhr <huhr\at uni-paderborn.de>)} +% ^^A MID: <do4gvo$tv$1@news.uni-paderborn.de> +% The \pkg{listings} package makes numbers and letters active, +% \begin{macrocode} + \MT@with@package@T{listings}{% + \g@addto@macro\MT@cfg@catcodes{% + \MT@while@num{"30}{"3A}{\catcode\@tempcnta 12\relax}% + \MT@while@num{"41}{"5B}{\catcode\@tempcnta 11\relax}% + \MT@while@num{"61}{"7B}{\catcode\@tempcnta 11\relax}% + }% +% \end{macrocode} +% \dots~and the backslash (which would lead to problems in \cs{MT@get@slot}). +%\changes{v2.0}{2006/09/15}{compatibility with \pkg{listings}: set catcode of backslash to zero +% (reported by \contributor Steven Bath <steven128\at iname.com>)} +% ^^A private mail, 2006/09/15 +% \begin{macrocode} + \g@addto@macro\MT@setupfont@hook{% + \catcode`\\\z@ +% \end{macrocode} +% Inside a listing, \cmd\space\ is redefined. +%\changes{v2.5}{2011/05/03}{restore \cmd\space\ inside \pkg{listings} +% (reported by \contributor Rolf Dieterich <rolf.dieterich\at gmx.de>)} +% ^^A private mail, 2011/04/30 +% ^^A (beta:07) +% \begin{macrocode} + \def\space{ }% +% \end{macrocode} +%\changes{v1.9b}{2005/12/23}{compatibility with the \texttt{extendedchar} option of +% the \pkg{listings} package} +% When loaded with the |extendedchar| option, \pkg{listings} will also redefine +% 8-bit active characters (\pkg{inputenc}). Luckily, this simple redefinition +% will make them expand to their original definition, so that they could be used +% in the configuration. +% \begin{macrocode} + \let\lst@ProcessLetter\@empty + }% + }% +% \end{macrocode} +%\changes{v2.0}{2005/12/21}{compatibility with \pkg{soul}: register \cs{textls} and \cs{lsstyle}} ^^A (beta:3) +% Of course, using both \pkg{soul}'s and \microtype's letterspacing mechanisms +% at the same time doesn't make much sense. But \pkg{soul} can do more, \eg, +% underlining. The optional argument to \cs{textls} may not be used. +% \begin{macrocode} +%</package> +%<plain> \MT@requires@latex2{ + \MT@with@package@T{soul}{% + \soulregister\lsstyle 0% + \soulregister\textls 1% + }% +% \end{macrocode} +%\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, hence +% we have to use a different test in this case. +% \begin{macrocode} +%<*plain> + }{\ifx\SOUL@\@undefined\else + \soulregister\lsstyle 0% + \soulregister\textls 1% + \fi}% +%</plain> +%<*package> + \MT@with@package@T{tikz}\MT@tikz@setup +% \end{macrocode} +%\changes{v2.1}{2007/01/15}{compatibility with \pkg{pinyin}: disable \microtype\ in \cmd\py@macron\ +% (reported by \contributor Sven Naumann <svenau\at gmx.net>)} +% ^^A MID: <87d55hxxdd.fsf@linux.site> +% Compatibility with the \pkg{pinyin} package (from \pkg{CJK}): disable +% \microtype\ in \cmd\py@macron, which loads a different font for the accent. +% In older versions of \pkg{pinyin} (pre-4.6.0), +%\changes{v2.3d}{2009/03/19}{fix \pkg{pinyin} compatibility check +% (reported by \contributor Silas~S. Brown <ssb22\at cam.ac.uk>)} +% ^^A private mail, 2009/03/19 +% \cmd\py@macron\ had only one argument. +% \begin{macrocode} + \MT@with@package@T{pinyin}{% + \let\MT@orig@py@macron\py@macron + \@ifpackagelater{pinyin}{2005/08/11}{% 4.6.0 + \def\py@macron#1#2{% + \MT@ltx@pickupfont + \MT@orig@py@macron{#1}{#2}% + \MT@MT@pickupfont}% + }{% + \def\py@macron#1{% + \MT@ltx@pickupfont + \MT@orig@py@macron{#1}% + \MT@MT@pickupfont}% + }% + }% +%</package> +} +%</package|letterspace> +% \end{macrocode} +%\changes{v1.6}{2005/01/19}{load a font if none is selected} +% We need a font (the \pkg{minimal} class doesn't load one). +% \begin{macrocode} +%<package>\expandafter\ifx\the\font\nullfont\normalfont\fi +% \end{macrocode} +% +%\subsection{Font setup}\label{ssec:font-setup} +% +%\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} +%<*pdftex-def|xetex-def|luatex-def> +\def\MT@setupfont{% +% \end{macrocode} +%\changes{v2.5}{2012/08/22}{select font with \pkg{fontspec} (found by \contributor Georg Duffner <g.duffner\at gmail.com>)} +% ^^A private mail, 2012/08/17 +%\changes{v2.7b}{2018/02/21}{always select current font with \xetex\ and \luatex\ (reported by \contributor Paolo Ney <@\at @>, +% solution by \contributor Ulrike Fischer <news3\at nililand.de>)} +% ^^A (1) https://tex.stackexchange.com/questions/416310/problem-of-amsart-and-microtype-under-xelatex +% ^^A (2) private mail, 2018/02/20 +% With \xetex\ and \luatex\ the font may not be actually loaded, +% hence we might see a wrong font (in \cs{MT@get@slot}). +% Therefore, we first load the current font. +% \begin{macrocode} +%<xetex-def|luatex-def> \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} +%<pdftex-def>\MT@requires@pdftex7{ +%<pdftex-def|luatex-def>\g@addto@macro\MT@setupfont\MT@copy@font +%<pdftex-def>}\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} +%<pdftex-def>\MT@requires@pdftex6 +%<luatex-def>\MT@requires@luatex3 +%<pdftex-def|luatex-def> {\g@addto@macro\MT@setupfont\MT@tracking}\relax +\g@addto@macro\MT@setupfont{% + \MT@check@font + \ifMT@inlist@ +%<debug>\MT@show@pdfannot2% + \else + \MT@vinfo{Setting up font `\MT@@font'\on@line}% + \MT@info@notracking +% \end{macrocode} +% Now we can begin setting up the font for all features that the current +% \pdftex\ provides. The following commands are \cmd\let\ to \cmd\relax\ if the +% respective feature is disabled via package options. +% +% For versions older than 1.20, protrusion has to be set up first, beginning +% with 1.20, the order doesn't matter. +% \begin{macrocode} + \MT@protrusion +%<pdftex-def|luatex-def> \MT@expansion +} +% \end{macrocode} +% Interword spacing and kerning (\pdftex\ 1.40). +% \begin{macrocode} +%<*pdftex-def> +\MT@requires@pdftex6{ +\g@addto@macro\MT@setupfont{\MT@spacing\MT@kerning} +}\relax +%</pdftex-def> +% \end{macrocode} +% Disable ligatures (\pdftex\ 1.30). +% \begin{macrocode} +%<pdftex-def>\MT@requires@pdftex5{ +%<pdftex-def|luatex-def>\g@addto@macro\MT@setupfont\MT@noligatures +%<pdftex-def>}\relax +\g@addto@macro\MT@setupfont{% +% \end{macrocode} +% Debugging. +% \begin{macrocode} +%<debug>\MT@show@pdfannot1% +% \end{macrocode} +% Finally, register the font so that we don't set it up anew each time. +% \begin{macrocode} + \MT@register@font + \fi +} +%</pdftex-def|xetex-def|luatex-def> +% \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} +%<*pdftex-def|luatex-def> +\let\MT@copy@font\relax +%<luatex-def>\MT@requires@luatex4{\let\pdfcopyfont\copyfont}\relax +%<pdftex-def>\MT@requires@pdftex7{ +\def\MT@copy@font@{% +% \end{macrocode} +%\begin{macro}{\MT@font@copy} +% For every new protrusion and expansion context, we create a new copy. +%\changes{v2.3b}{2008/04/15}{enable font copies also with protrusion contexts +% (reported by \contributor Nathan Rosenblum <nater\at cs.wisc.edu>)} +% ^^A private mail, 2008/04/14 +% \begin{macrocode} + \xdef\MT@font@copy{\csname\MT@@font/\MT@pr@context/\MT@ex@context\endcsname}% + \expandafter\ifx\MT@font@copy\relax +% \end{macrocode} +%\end{macro} +%\begin{macro}{\MT@font@orig} +% \pdftex\ doesn't allow copying a font that has already been copied and +% expanded\slash letterspaced. Hence, we have to get the original. +% \begin{macrocode} + \edef\MT@font@orig{\csname\expandafter\string\font@name @orig\endcsname}% + \expandafter\ifx\MT@font@orig\relax + \MT@exp@two@c\MT@glet\MT@font@orig\font@name + \else + \MT@exp@two@c\let\font@name\MT@font@orig + \fi + \global\MT@exp@two@c\pdfcopyfont\MT@font@copy\font@name +%<debug>\MT@dinfo1{creating new copy: \MT@font@copy}% +% \end{macrocode} +%\end{macro} +% 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 +} +%<pdftex-def>}\relax +%</pdftex-def|luatex-def> +% \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@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}% +% \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 +% \cs{MT@checklist@...} tests will set it to false if the property is not in +% the list. The first non-empty list that does not contain a match will stop us +% (except for |font|). +% \begin{macrocode} + \MT@dotrue + \edef\@tempa{\csname MT@#1@setname\endcsname}% + \MT@map@clist@n{font,encoding,family,series,shape,size}{% + \MT@ifdefined@n@TF{MT@checklist@##1}% + {\csname MT@checklist@##1\endcsname}% + {\MT@checklist@{##1}}% + {#1}% + }% + \else + \MT@dofalse + \fi + \ifMT@do +% \end{macrocode} +% \cs{MT@feat} stores the current feature. +% \begin{macrocode} + \def\MT@feat{#1}% + \csname MT@set@#1@codes\endcsname + \else + \MT@ifstreq{#1}{tr}% + {\let\MT@info@notracking\MT@info@notracking@}% + {\MT@vinfo{... No \@nameuse{MT@abbr@#1}}}% + \fi +} +% \end{macrocode} +%\end{macro} +%\end{macro} +%\end{macro} +%\begin{macro}{\MT@info@notracking} +%\begin{macro}{\MT@info@notracking@} +%\changes{v2.7a}{2017/11/17}{defer `No tracking' message} +% To defer the message to after the font has actually been logged. +% \begin{macrocode} +\let\MT@info@notracking\relax +\def\MT@info@notracking@{\MT@vinfo{... No tracking}} +% \end{macrocode} +%\end{macro} +%\end{macro} +%\begin{macro}{\MT@dinfo@list} +% \begin{macrocode} +%<debug>\def\MT@dinfo@list#1#2#3{\MT@dinfo@nl{1}{\@nameuse{MT@abbr@#1}: #2 +%<debug> \ifx\\#3\\list empty\else `\@nameuse{MT@#2}' #3 list\fi}} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\MT@checklist@} +% The generic test (\meta{\#1} is the axis, \meta{\#2} the feature, \cmd\@tempa\ +% contains the set name). +% \begin{macrocode} +\def\MT@checklist@#1#2{% +%<!debug> \MT@ifdefined@n@T +%<debug> \MT@ifdefined@n@TF + {MT@#2list@#1@\@tempa}{% +% \end{macrocode} +% Begin a (neatly masqueraded) \cmd\expandafter\ orgy to test whether the font +% attribute is in the list. +% \begin{macrocode} + \expandafter\MT@exp@one@n\expandafter\MT@in@clist + \csname MT@#1\expandafter\endcsname + \csname MT@#2list@#1@\@tempa\endcsname + \ifMT@inlist@ +%<debug>\MT@dinfo@list{#2}{#1}{in}% + \MT@dotrue + \else +%<debug>\MT@dinfo@list{#2}{#1}{not in}% + \MT@dofalse + \expandafter\MT@clist@break + \fi + }% +% \end{macrocode} +% If no limitations have been specified, \ie, the list for a font attribute +% has not been defined at all, the font should be set up. +% \begin{macrocode} +%<debug> {\MT@dinfo@list{#2}{#1}{}}% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\MT@checklist@family} +% Also test for the alias font, if the original font is not in the list. +%\changes{v1.4b}{2004/11/22}{fix: don't try alias family name if encoding failed} +%\changes{v1.9}{2005/07/12}{fix: add two missing \cmd\expandafter s} +% \begin{macrocode} +\def\MT@checklist@family#1{% +%<!debug> \MT@ifdefined@n@T +%<debug> \MT@ifdefined@n@TF + {MT@#1list@family@\@tempa}{% + \MT@exp@two@n\MT@in@clist + \MT@family{\csname MT@#1list@family@\@tempa\endcsname}% + \ifMT@inlist@ +%<debug>\MT@dinfo@list{#1}{family}{in}% + \MT@dotrue + \else +%<debug>\MT@dinfo@list{#1}{family}{not in}% + \MT@dofalse + \ifx\MT@familyalias\@empty \else + \MT@exp@two@n\MT@in@clist + \MT@familyalias{\csname MT@#1list@family@\@tempa\endcsname}% + \ifMT@inlist@ +%<debug> \MT@dinfo@list{#1}{family alias}{in}% + \MT@dotrue +%<debug>\else\MT@dinfo@list{#1}{family alias}{not in}% + \fi + \fi + \fi + \ifMT@do \else + \expandafter\MT@clist@break + \fi + }% +%<debug> {\MT@dinfo@list{#1}{family}{}}% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\MT@checklist@size} +% Test whether font size is in list of size ranges. +% \begin{macrocode} +\def\MT@checklist@size#1{% +%<!debug> \MT@ifdefined@n@T +%<debug> \MT@ifdefined@n@TF + {MT@#1list@size@\@tempa}{% + \MT@exp@cs\MT@in@rlist{MT@#1list@size@\@tempa}% + \ifMT@inlist@ +%<debug>\MT@dinfo@list{#1}{size}{in}% + \MT@dotrue + \else +%<debug>\MT@dinfo@list{#1}{size}{not in}% + \MT@dofalse + \expandafter\MT@clist@break + \fi + }% +%<debug> {\MT@dinfo@list{#1}{size}{}}% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\MT@checklist@font} +% If the font matches, we skip the rest of the test. +% \begin{macrocode} +\def\MT@checklist@font#1{% +%<!debug> \MT@ifdefined@n@T +%<debug> \MT@ifdefined@n@TF + {MT@#1list@font@\@tempa}{% +% \end{macrocode} +% Since \cs{MT@font} may be appended with context and/or letterspacing specs, +% we construct the name from the font characteristics. +%\changes{v2.2}{2007/07/03}{fix: construct font name from characteristics} +% \begin{macrocode} + \edef\@tempb{\MT@encoding/\MT@family/\MT@series/\MT@shape/\MT@size}% + \expandafter\MT@exp@one@n\expandafter\MT@in@clist\expandafter + \@tempb \csname MT@#1list@font@\@tempa\endcsname + \ifMT@inlist@ +%<debug>\MT@dinfo@list{#1}{font}{in}% + \expandafter\MT@clist@break + \else +%<debug>\MT@dinfo@list{#1}{font}{not in}% + \MT@dofalse + \fi + }% +%<debug> {\MT@dinfo@list{#1}{font}{}}% +} +% \end{macrocode} +%\end{macro} +% +%\subsubsection{Protrusion} +% +%\begin{macro}{\ifMT@nofamily} +% Info for settings that are not family-specific. +% (Warnings seem to be too irritating.) ^^A at least one thing I found out in the ridiculously long `beta' phase +% The switch is set in \cs{MT@next@listname}. +%\changes{v2.5}{2011/05/28}{info if settings are not family-specific +% (suggested by \contributor H\`an \thanhthe{} Th\`anh <thanh\at river-valley.org>)} +% ^^A private mail, 2010/09/07 +% ^^A (beta:07) +% \begin{macrocode} +\newif\ifMT@nofamily +%</package> +% \end{macrocode} +%\end{macro} +%\begin{macro}{\MT@protrusion} +% Set up for protrusion? +% \begin{macrocode} +%<*pdftex-def|xetex-def|luatex-def> +\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} +\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 <schubert.seb\at googlemail.com>)} +% ^^A private mail, 2013/01/24 +% (for each encoding). +% \begin{macrocode} + \MT@if@list@exists{% + \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 + \MT@get@font@dimen@six{% + \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,}% + }\MT@reset@pr@codes +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\MT@get@font@dimen@six} +%\changes{v1.8}{2005/05/03}{new macro: test whether \fontdim6 is defined} +%\changes{v2.3e}{2009/08/31}{fix: gobbling settings with tracking failed +% (reported by \contributor Leo <sdl.web\at gmail.com>)} +% ^^A MID: <m0vdk4g8t2.fsf@cam.ac.uk> +%\begin{macro}{\MT@dimen@six} +% If \fontdim6 is zero, character protrusion, spacing, kerning and tracking +% won't work, and we can skip the settings (for example, the \pkg{dsfont} and +% \pkg{fourier} fonts don't specify this dimension; this is probably a bug in +% the fonts). +% \begin{macrocode} +\def\MT@get@font@dimen@six{% + \ifnum\fontdimen6\MT@font=\z@ + \MT@warning@nl{% + Font `\MT@@font' does not specify its\MessageBreak + \@backslashchar fontdimen 6 (width of an `em')! Therefore,\MessageBreak + \@nameuse{MT@abbr@\MT@feat} will not work with this font}% + \expandafter\@gobble + \else + \edef\MT@dimen@six{\number\fontdimen6\MT@font}% + \expandafter\@firstofone + \fi +} +% \end{macrocode} +%\end{macro} +%\end{macro} +%\begin{macro}{\MT@set@all@pr} +%\changes{v2.2}{2007/06/16}{(et al.) allow empty values} +% Set all protrusion codes of the font. +%\changes{v2.5}{2011/08/19}{fix: remove space +% (found by \contributor Meho~R <meho.2005\at gmail.com>)} +% ^^A MID: <b3c1627e-192f-4004-ab46-4ea86925e298@dc3g2000vbb.googlegroups.com> +% ^^A https://tex.stackexchange.com/questions/25036/microtype-package-v-2-5-beta-06-and-footnote-protrusion +% ^^A (beta:08) +% \begin{macrocode} +\def\MT@set@all@pr#1#2{% +%<debug>\MT@dinfo@nl{3}{-- lp/rp: setting all to #1/#2}% + \let\MT@temp\@empty + \MT@ifempty{#1}\relax{\g@addto@macro\MT@temp{\lpcode\MT@font\@tempcnta=#1}}% + \MT@ifempty{#2}\relax{\g@addto@macro\MT@temp{\rpcode\MT@font\@tempcnta=#2}}% + \MT@do@font\MT@temp +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\MT@reset@pr@codes@} +%\begin{macro}{\MT@reset@pr@codes} +% All protrusion codes are zero for new fonts. However, if we have to reload +% the font due to different contexts, we have to reset them. +% This command will be changed by \cs{microtypecontext} if necessary. +% \begin{macrocode} +\def\MT@reset@pr@codes@{\MT@set@all@pr\z@\z@} +\let\MT@reset@pr@codes\relax +% \end{macrocode} +%\end{macro} +%\end{macro} +%\begin{macro}{\MT@the@pr@code} +%\begin{macro}{\MT@the@pr@code@tr} +%\changes{v2.2}{2007/04/05}{adjust protrusion of letterspaced fonts} +% If the font is letterspaced, we have to add half the letterspacing amount to +% the margin kerns. This will be activated in \cs{MT@set@tr@codes}. +% \begin{macrocode} +\def\MT@the@pr@code{\@tempcntb} +%<*pdftex-def|luatex-def> +%<pdftex-def>\MT@requires@pdftex6 +%<luatex-def>\MT@requires@luatex3 + {\def\MT@the@pr@code@tr{% + \numexpr\@tempcntb+\MT@letterspace@/2\relax + } +}\relax +%</pdftex-def|luatex-def> +% \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 +%<pdftex-def|luatex-def> \ifnum\MT@char > \m@ne +%<xetex-def> \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\@tempb{#1}% + \MT@ifempty\@tempb\relax{% + \MT@scale@to@em + \lpcode\MT@font\MT@char=\MT@the@pr@code +%<debug>\MT@dinfo@nl{4}{;;; lp (\MT@char): \number\lpcode\MT@font\MT@char\space: [#1]}% + }% + \def\@tempb{#2}% + \MT@ifempty\@tempb\relax{% + \MT@scale@to@em + \rpcode\MT@font\MT@char=\MT@the@pr@code +%<debug>\MT@dinfo@nl{4}{;;; rp (\MT@char): \number\rpcode\MT@font\MT@char\space: [#2]}% + }% +% \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 + }% + }% +} +% \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 +% \cs{lpcode} resp. \cs{rpcode}, since this would disallow protrusion factors +% larger than the character width (since \cs{[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} +%<pdftex-def>\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 \cs{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{% +%<*pdftex-def> +^^X \MT@count=\fontcharwd\MT@font\MT@char\relax +^^Q \setbox\z@=\hbox{\MT@font \char\MT@char}% +^^Q \MT@count=\wd\z@ +%</pdftex-def> +%<luatex-def> \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} +%<*xetex-def> + \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 +%</xetex-def> + \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} +%<*pdftex-def> +\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} +} +%</pdftex-def> +%</pdftex-def|xetex-def|luatex-def> +% \end{macrocode} +%\begin{macro}{\MT@get@font@dimen} +% For the |space| unit. +%\changes{v1.9d}{2006/02/13}{warning for zero fontdimen} +% \begin{macrocode} +%<*package> +\def\MT@get@font@dimen#1{% + \ifnum\fontdimen#1\MT@font=\z@ + \MT@warning@nl{Font `\MT@@font' does not specify its\MessageBreak + \@backslashchar fontdimen #1 (it's zero)!\MessageBreak + You should use a different `unit' for \MT@curr@list@name}% + \else + \MT@count=\fontdimen#1\MT@font + \fi +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\MT@info@missing@char} +%\changes{v1.9a}{2005/11/17}{info instead of warning +% (after \contributor Michael Hoppe <mh\at michael-hoppe.de> reported that +% the `fl' ligature is missing in Palatino <SC>)} +% ^^A MID: <1h64d0x.16xsx9n1151dieN%mh@michael-hoppe.de> +% Info about missing characters, or characters with zero width. +%\changes{v2.5}{2010/11/11}{fix error message for \xetex\ +% (reported by \contributor Juan Acevedo <juan.acevedo.juan\at gmail.com>)} +% ^^A <http://permalink.gmane.org/gmane.comp.tex.xetex/17202> +% ^^A (beta:05) +%\changes{v2.7b}{2018/02/20}{fix message for glyphs specified as names in \xetex\ +% (reported by \contributor Paolo Ney <@\at @>)} +% ^^A https://tex.stackexchange.com/questions/416310/problem-of-amsart-and-microtype-under-xelatex +% \begin{macrocode} +\def\MT@info@missing@char{% + \MT@info@nl{Character `\the\MT@toks' +^^X \ifnum\MT@char@<\z@ is missing\else +^^X \iffontchar\MT@font\MT@char@ + has a width of 0pt +^^X \else is missing\fi\fi +^^Q \MessageBreak (it's probably missing) + \MessageBreak in font `\MT@@font'.\MessageBreak + Ignoring protrusion settings for this character}% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\MT@scale@factor} +%\changes{v1.5}{2004/12/10}{warning for factors outside limits} +%\changes{v1.9}{2005/09/28}{generalised} +% Furthermore, we might have to multiply with a factor. +% \begin{macrocode} +\def\MT@scale@factor{% + \ifnum\csname MT@\MT@feat @factor@\endcsname=\@m \else + \expandafter\MT@scale\expandafter \@tempcntb + \csname MT@\MT@feat @factor@\endcsname \@m + \fi + \ifnum\@tempcntb>\csname MT@\MT@feat @max\endcsname\relax + \MT@exp@cs\MT@warn@code@too@large{MT@\MT@feat @max}% + \else + \ifnum\@tempcntb<\csname MT@\MT@feat @min\endcsname\relax + \MT@exp@cs\MT@warn@code@too@large{MT@\MT@feat @min}% + \fi + \fi +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\MT@warn@code@too@large} +% Type out a warning if a chosen protrusion factor is too large after the +% conversion. As a special service, we also type out the maximum amount that +% may be specified in the configuration. +%\changes{v1.7}{2005/02/17}{new macro: type out maximum protrusion factor} +%\changes{v1.9b}{2006/01/03}{fix calculation with present factor} +% \begin{macrocode} +\def\MT@warn@code@too@large#1{% + \@tempcnta=#1\relax + \ifnum\csname MT@\MT@feat @factor@\endcsname=\@m \else + \expandafter\MT@scale\expandafter\@tempcnta\expandafter + \@m \csname MT@\MT@feat @factor@\endcsname + \fi + \MT@scale\@tempcnta \MT@dimen@six \MT@count + \MT@warning@nl{The \@nameuse{MT@abbr@\MT@feat} code \@tempb\space + is too large for character\MessageBreak + `\the\MT@toks' in \MT@curr@list@name.\MessageBreak + Setting it to the maximum of \number\@tempcnta}% + \@tempcntb=#1\relax +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\MT@get@opt} +% The optional argument to the configuration commands (except for +% \cs{SetExpansion}, which is being dealt with in \cs{MT@get@ex@opt}). +% \begin{macrocode} +\def\MT@get@opt{% + \MT@set@listname +% \end{macrocode} +%\begin{macro}{\MT@pr@factor@} +%\begin{macro}{\MT@sp@factor@} +%\begin{macro}{\MT@kn@factor@} +% Apply a factor? +% \begin{macrocode} + \MT@ifdefined@n@TF{MT@\MT@feat @c@\csname MT@\MT@feat @c@name\endcsname @factor}{% + \MT@let@nn{MT@\MT@feat @factor@} + {MT@\MT@feat @c@\csname MT@\MT@feat @c@name\endcsname @factor}% + \MT@vinfo{... : Multiplying \@nameuse{MT@abbr@\MT@feat} codes by + \number\csname MT@\MT@feat @factor@\endcsname/1000}% + }{% + \MT@let@nn{MT@\MT@feat @factor@}{MT@\MT@feat @factor}% + }% +% \end{macrocode} +%\end{macro} +%\end{macro} +%\end{macro} +%\begin{macro}{\MT@pr@unit@} +%\begin{macro}{\MT@sp@unit@} +%\begin{macro}{\MT@kn@unit@} +% The |unit| can only be evaluated here, since it might be font-specific. +% If it's \cmd\@empty, it's relative to character widths, if it's \textminus1, +% relative to space dimensions. +% \begin{macrocode} + \MT@ifdefined@n@TF{MT@\MT@feat @c@\csname MT@\MT@feat @c@name\endcsname @unit}{% + \MT@let@nn{MT@\MT@feat @unit@}% + {MT@\MT@feat @c@\csname MT@\MT@feat @c@name\endcsname @unit}% + \MT@exp@cs\ifx{MT@\MT@feat @unit@}\@empty + \MT@vinfo{... : Setting \@nameuse{MT@abbr@\MT@feat} codes + relative to character widths}% + \else + \MT@exp@cs\ifx{MT@\MT@feat @unit@}\m@ne + \MT@vinfo{... : Setting \@nameuse{MT@abbr@\MT@feat} codes + relative to width of space}% + \fi + \fi + }{% + \MT@let@nn{MT@\MT@feat @unit@}{MT@\MT@feat @unit}% + }% +% \end{macrocode} +%\end{macro} +%\end{macro} +%\end{macro} +%\begin{macro}{\MT@get@space@unit} +%\begin{macro}{\MT@get@char@unit} +% The codes are either relative to character widths, or to a fixed width. +% For spacing and kerning lists, they may also be relative to the width of +% the interword glue. +% Only the setting from the top list will be taken into account. +% \begin{macrocode} + \let\MT@get@char@unit\relax + \let\MT@get@space@unit\@gobble + \MT@exp@cs\ifx{MT@\MT@feat @unit@}\@empty + \let\MT@get@char@unit\MT@get@charwd + \else + \MT@exp@cs\ifx{MT@\MT@feat @unit@}\m@ne + \let\MT@get@space@unit\MT@get@font@dimen + \else + \MT@exp@cs\MT@get@unit{MT@\MT@feat @unit@}% + \fi + \fi +% \end{macrocode} +%\end{macro} +%\end{macro} +% Preset all characters? If so, we surely don't need to reset, too. +%\changes{v1.9}{2005/10/08}{new key `\texttt{preset}' to set all characters to +% the specified value before loading the lists} +%\changes{v1.9d}{2006/02/13}{set list name before presetting} +%\changes{v1.9d}{2006/02/18}{optimise: don't reset when \texttt{preset} option is set} +% \begin{macrocode} + \MT@ifdefined@n@T{MT@\MT@feat @c@\csname MT@\MT@feat @c@name\endcsname @preset}{% + \csname MT@preset@\MT@feat\endcsname + \MT@let@nc{MT@reset@\MT@feat @codes}\relax + }% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\MT@get@unit} +%\changes{v1.8}{2005/04/14}{new macro: get unit for codes} +%\begin{macro}{\MT@get@unit@} +% If |unit| contains an |em| or |ex|, we use the corresponding \cmd\fontdimen\ +% to obtain the real size. Simply converting the em into points might give a +% wrong result, since the font probably isn't set up yet, so that these +% dimensions haven't been updated, either. +% \begin{macrocode} +\def\MT@get@unit#1{% + \expandafter\MT@get@unit@#1 e!\@nil + \ifx\x\@empty\else\let#1\x\fi + \@defaultunits\@tempdima#1 pt\relax\@nnil + \ifdim\@tempdima=\z@ + \MT@warning@nl{% + Cannot set \@nameuse{MT@abbr@\MT@feat} factors relative to zero\MessageBreak + width. Setting factors of list `\@nameuse{MT@\MT@feat @c@name}'\MessageBreak + relative to character widths instead}% + \let#1\@empty + \let\MT@get@char@unit\MT@get@charwd + \else + \MT@vinfo{... : Setting \@nameuse{MT@abbr@\MT@feat} factors relative + to \the\@tempdima}% + \MT@count=\@tempdima\relax + \fi +} +\def\MT@get@unit@#1e#2#3\@nil{% + \ifx\\#3\\\let\x\@empty \else + \if m#2% + \edef\x{#1\fontdimen6\MT@font}% + \else + \if x#2% + \edef\x{#1\fontdimen5\MT@font}% + \fi + \fi + \fi +} +% \end{macrocode} +%\end{macro} +%\end{macro} +%\begin{macro}{\MT@set@inputenc} +% The configurations may be under the regime of an input encoding. +% \begin{macrocode} +\def\MT@set@inputenc#1{% +% \end{macrocode} +%\begin{macro}{\MT@cat} +% We remember the current category (|c| or |inh|), in case of warnings later. +% \begin{macrocode} + \def\MT@cat{#1}% +% \end{macrocode} +%\end{macro} +% \begin{macrocode} + \edef\@tempa{MT@\MT@feat @#1@\csname MT@\MT@feat @#1@name\endcsname @inputenc}% + \MT@ifdefined@n@T\@tempa\MT@set@inputenc@ +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\MT@set@inputenc@} +%\changes{v2.2}{2007/06/08}{only load \pkg{inputenc} files if necessary} +% More recent versions of \pkg{inputenc} remember the current encoding, so that +% we can test whether we really have to load the encoding file. +% \begin{macrocode} +\MT@addto@setup{% + \@ifpackageloaded{inputenc}{% + \@ifpackagelater{inputenc}{2006/02/22}{% + \def\MT@set@inputenc@{% + \MT@ifstreq\inputencodingname{\csname\@tempa\endcsname}\relax + \MT@load@inputenc + }% + }{% + \let\MT@set@inputenc@\MT@load@inputenc + }% + }{% + \def\MT@set@inputenc@{% + \MT@warning@nl{Key `inputenc' used in \MT@curr@list@name, but the `inputenc' + \MessageBreak package isn't loaded. Ignoring input encoding}% + }% + }% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\MT@load@inputenc} +% Set up normal catcodes, since, \eg, \pkg{listings} would otherwise want to +% actually typeset the \pkg{inputenc} file when it is being loaded inside a +% listing. +%\changes{v2.0}{2006/09/15}{sanitise catcodes before loading input encoding +% (problem with \pkg{listings})} +% \begin{macrocode} +\def\MT@load@inputenc{% + \MT@cfg@catcodes +%<debug>\MT@dinfo@nl{1}{loading input encoding: \@nameuse{\@tempa}}% + \inputencoding{\@nameuse{\@tempa}}% +} +%</package> +% \end{macrocode} +%\end{macro} +%\begin{macro}{\MT@set@pr@heirs} +% Set the inheriting characters. +% \begin{macrocode} +%<*pdftex-def|xetex-def|luatex-def> +\def\MT@set@pr@heirs#1{% + \lpcode\MT@font #1 =\lpcode\MT@font\MT@char\relax + \rpcode\MT@font #1 =\rpcode\MT@font\MT@char\relax +%<debug>\MT@dinfo@nl{2}{-- heir of \MT@char: #1}% +%<debug>\MT@dinfo@nl{4}{;;; lp/rp (#1): \number\lpcode\MT@font\MT@char\space/% +%<debug> \number\rpcode\MT@font\MT@char\space}% +} +% \end{macrocode} +%\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} +\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}% +} +%</pdftex-def|xetex-def|luatex-def> +% \end{macrocode} +%\end{macro} +% +%\subsubsection{Expansion} +% +%\begin{macro}{\MT@expansion} +% Set up for expansion? +% \begin{macrocode} +%<*pdftex-def|luatex-def> +\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 +} +%</pdftex-def|luatex-def> +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\MT@set@ex@codes@n} +% If, on the other hand, all characters should be expanded by the same amount, +% we only take the first optional argument to \cs{SetExpansion} into account. +%\begin{macro}{\ifMT@nonselected} +% We need this boolean in \cs{MT@if@list@exists} so that no warning for missing +% lists will be issued. +% \begin{macrocode} +%<package>\newif\ifMT@nonselected +% \end{macrocode} +%\end{macro} +% \begin{macrocode} +%<*pdftex-def|luatex-def> +\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 +%<pdftex-def> \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. +% \begin{macrocode} +%<luatex-def>\MT@requires@luatex4{\let\pdffontexpand\expandglyphsinfont}\relax +\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{% +%<debug>\MT@dinfo@nl{3}{-- ex: setting all to \number#1}% + \MT@do@font{\efcode\MT@font\@tempcnta=#1\relax}% +} +\def\MT@reset@ef@codes@{\MT@set@all@ex\MT@ex@factor@} +% \end{macrocode} +%\end{macro} +%\end{macro} +%\begin{macro}{\MT@reset@ef@codes} +% However, this is only necessary for \pdftex\ versions prior to~1.20, +% or \luatex\ $\less$~0.90 (actually, I think, 0.87). +%\changes{v1.6a}{2005/01/30}{only reset \cmd\efcode s for older \pdftex\ versions} +%\changes{v2.7}{2017/02/13}{only reset \cmd\efcode s for older \luatex\ versions} +% \begin{macrocode} +%<pdftex-def>\MT@requires@pdftex4 +%<luatex-def>\MT@requires@luatex5 +{ + \def\MT@reset@ef@codes{% + \ifnum\MT@ex@factor@=\@m \else + \MT@reset@ef@codes@ + \fi + } +}{ + \let\MT@reset@ef@codes\MT@reset@ef@codes@ +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\MT@ex@split@val} +% There's only one number per character. +% \begin{macrocode} +\def\MT@ex@split@val#1\relax{% + \@tempcntb=#1\relax +% \end{macrocode} +% Take an optional factor into account. +% \begin{macrocode} + \ifnum\MT@ex@factor@=\@m \else + \MT@scale\@tempcntb \MT@ex@factor@ \@m + \fi + \ifnum\@tempcntb > \MT@ex@max + \MT@warn@ex@too@large\MT@ex@max + \else + \ifnum\@tempcntb < \MT@ex@min + \MT@warn@ex@too@large\MT@ex@min + \fi + \fi + \efcode\MT@font\MT@char=\@tempcntb +%<debug>\MT@dinfo@nl{4}{::: ef (\MT@char): \number\efcode\MT@font\MT@char: [#1]}% +% \end{macrocode} +% Heirs, heirs, I love thy heirs. +% \begin{macrocode} + \MT@ifdefined@c@T\MT@ex@inh@name{% + \MT@ifdefined@n@T{MT@inh@\MT@ex@inh@name @\MT@char @}{% + \MT@exp@cs\MT@map@tlist@c{MT@inh@\MT@ex@inh@name @\MT@char @}\MT@set@ex@heirs + }% + }% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\MT@warn@ex@too@large} +% \begin{macrocode} +\def\MT@warn@ex@too@large#1{% + \MT@warning@nl{Expansion factor \number\@tempcntb\space too large for + character\MessageBreak `\the\MT@toks' in \MT@curr@list@name.\MessageBreak + Setting it to the maximum of \number#1}% + \@tempcntb=#1\relax +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\MT@get@ex@opt} +%\changes{v1.9d}{2006/02/13}{fix: evaluate \texttt{preset}} +%\begin{macro}{\MT@ex@factor@} +%\begin{macro}{\MT@stretch@} +%\begin{macro}{\MT@shrink@} +%\begin{macro}{\MT@step@} +%\begin{macro}{\MT@auto@} +% Apply different values to this font? +% \begin{macrocode} +\def\MT@get@ex@opt{% + \MT@set@listname + \MT@ifdefined@n@TF{MT@ex@c@\MT@ex@c@name @factor}{% + \MT@let@cn\MT@ex@factor@{MT@ex@c@\MT@ex@c@name @factor}% + \MT@vinfo{... : Multiplying expansion factors by \number\MT@ex@factor@/1000}% + }{% + \let\MT@ex@factor@\MT@ex@factor + }% + \MT@get@ex@opt@{stretch}{Setting stretch limit to \number\MT@stretch@}% + \MT@get@ex@opt@{shrink} {Setting shrink limit to \number\MT@shrink@}% + \MT@get@ex@opt@{step} {Setting expansion step to \number\MT@step@}% +%<pdftex-def> \def\@tempa{autoexpand}% +%<pdftex-def> \MT@get@ex@opt@{auto}{\ifx\@tempa\MT@auto@ En\else Dis\fi 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 +%<debug>\MT@dinfo@nl{2}{-- heir of \MT@char: #1}% +%<debug>\MT@dinfo@nl{4}{::: ef (#1) \number\efcode\MT@font\MT@char}% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\MT@preset@ex} +% \begin{macrocode} +\def\MT@preset@ex{% + \@tempcntb=\csname MT@ex@c@\MT@ex@c@name @preset\endcsname\relax + \MT@scale@factor + \MT@set@all@ex\@tempcntb +} +%</pdftex-def|luatex-def> +% \end{macrocode} +%\end{macro} +% +%\subsubsection{Interword spacing (glue)} +% +%\begin{macro}{\MT@spacing} +% Adjustment of interword spacing? Only works with \pdftex. +% \begin{macrocode} +%<*pdftex-def> +\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@font@dimen@six{% + \MT@get@opt + \MT@reset@sp@codes + \MT@get@inh@list + \MT@set@inputenc{c}% + \MT@load@list\MT@sp@c@name + \MT@set@listname + \MT@let@cn\@tempc{MT@sp@c@\MT@sp@c@name}% + \expandafter\MT@set@codes\@tempc,\relax,}% + }\MT@reset@sp@codes +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\MT@sp@split@val} +% If |unit=space|, \cs{MT@get@space@unit} will be defined to fetch the +% corresponding fontdimen (2 for the first, 3 for the second and 4 for the +% third argument). +% \begin{macrocode} +\def\MT@sp@split@val#1,#2,#3\relax{% + \def\@tempb{#1}% + \MT@ifempty\@tempb\relax{% + \MT@get@space@unit2% + \MT@scale@to@em + \knbscode\MT@font\MT@char=\@tempcntb +%<debug>\MT@dinfo@nl{4}{;;; knbs (\MT@char): \number\knbscode\MT@font\MT@char: [#1]}% + }% + \def\@tempb{#2}% + \MT@ifempty\@tempb\relax{% + \MT@get@space@unit3% + \MT@scale@to@em + \stbscode\MT@font\MT@char=\@tempcntb +%<debug>\MT@dinfo@nl{4}{;;; stbs (\MT@char): \number\stbscode\MT@font\MT@char: [#2]}% + }% + \def\@tempb{#3}% + \MT@ifempty\@tempb\relax{% + \MT@get@space@unit4% + \MT@scale@to@em + \shbscode\MT@font\MT@char=\@tempcntb +%<debug>\MT@dinfo@nl{4}{;;; shbs (\MT@char): \number\shbscode\MT@font\MT@char: [#3]}% + }% + \MT@ifdefined@c@T\MT@sp@inh@name{% + \MT@ifdefined@n@T{MT@inh@\MT@sp@inh@name @\MT@char @}{% + \MT@exp@cs\MT@map@tlist@c{MT@inh@\MT@sp@inh@name @\MT@char @}\MT@set@sp@heirs + }% + }% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\MT@set@sp@heirs} +% \begin{macrocode} +\def\MT@set@sp@heirs#1{% + \knbscode\MT@font#1=\knbscode\MT@font\MT@char + \stbscode\MT@font#1=\stbscode\MT@font\MT@char + \shbscode\MT@font#1=\shbscode\MT@font\MT@char +%<debug>\MT@dinfo@nl{2}{-- heir of \MT@char: #1}% +%<debug>\MT@dinfo@nl{4}{;;; knbs/stbs/shbs (#1): \number\knbscode\MT@font\MT@char/% +%<debug> \number\stbscode\MT@font\MT@char/\number\shbscode\MT@font\MT@char}% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\MT@set@all@sp} +%\begin{macro}{\MT@reset@sp@codes} +%\begin{macro}{\MT@reset@sp@codes@} +% \begin{macrocode} +\def\MT@set@all@sp#1#2#3{% +%<debug>\MT@dinfo@nl{3}{-- knbs/stbs/shbs: setting all to #1/#2/#3}% + \let\MT@temp\@empty + \MT@ifempty{#1}\relax{\g@addto@macro\MT@temp{\knbscode\MT@font\@tempcnta=#1\relax}}% + \MT@ifempty{#2}\relax{\g@addto@macro\MT@temp{\stbscode\MT@font\@tempcnta=#2\relax}}% + \MT@ifempty{#3}\relax{\g@addto@macro\MT@temp{\shbscode\MT@font\@tempcnta=#3\relax}}% + \MT@do@font\MT@temp +} +\def\MT@reset@sp@codes@{\MT@set@all@sp\z@\z@\z@} +\let\MT@reset@sp@codes\relax +% \end{macrocode} +%\end{macro} +%\end{macro} +%\end{macro} +%\begin{macro}{\MT@preset@sp} +%\begin{macro}{\MT@preset@sp@} +% \begin{macrocode} +\def\MT@preset@sp{% + \expandafter\expandafter\expandafter\MT@preset@sp@ + \csname MT@sp@c@\MT@sp@c@name @preset\endcsname\@nil +} +\def\MT@preset@sp@#1,#2,#3\@nil{% + \ifx\MT@sp@unit@\@empty + \MT@warn@preset@towidth{sp}% + \MT@ifempty{#1}{\let\@tempa\@empty}{\MT@preset@aux@factor{#1}\@tempa}% + \MT@ifempty{#2}{\let\@tempc\@empty}{\MT@preset@aux@factor{#2}\@tempc}% + \MT@ifempty{#3}{\let\@tempb\@empty}{\MT@preset@aux@factor{#3}\@tempb}% + \else + \MT@ifempty{#1}{\let\@tempa\@empty}{\MT@preset@aux@space2{#1}\@tempa}% + \MT@ifempty{#2}{\let\@tempc\@empty}{\MT@preset@aux@space3{#2}\@tempc}% + \MT@ifempty{#3}{\let\@tempb\@empty}{\MT@preset@aux@space4{#3}\@tempb}% + \fi + \MT@set@all@sp\@tempa\@tempc\@tempb +} +}\relax +% \end{macrocode} +%\end{macro} +%\end{macro} +% +%\subsubsection{Additional kerning} +% +%\begin{macro}{\MT@kerning} +% Again, only check for additional kerning for new versions of \pdftex. +% \begin{macrocode} +\MT@requires@pdftex6{ +\def\MT@kerning{\MT@maybe@do{kn}} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\MT@set@kn@codes} +% It's getting boring, I know. +% \begin{macrocode} +\def\MT@set@kn@codes{% + \MT@if@list@exists{% + \MT@get@font@dimen@six{% + \MT@get@opt + \MT@reset@kn@codes + \MT@get@inh@list + \MT@set@inputenc{c}% + \MT@load@list\MT@kn@c@name + \MT@set@listname + \MT@let@cn\@tempc{MT@kn@c@\MT@kn@c@name}% + \expandafter\MT@set@codes\@tempc,\relax,}% + }\MT@reset@kn@codes +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\MT@kn@split@val} +% Again, the unit may be measured in the space dimension; this time only +% \fontdim2. +% \begin{macrocode} +\def\MT@kn@split@val#1,#2\relax{% + \def\@tempb{#1}% + \MT@ifempty\@tempb\relax{% + \MT@get@space@unit2% + \MT@scale@to@em + \knbccode\MT@font\MT@char=\@tempcntb +%<debug>\MT@dinfo@nl{4}{;;; knbc (\MT@char): \number\knbccode\MT@font\MT@char: [#1]}% + }% + \def\@tempb{#2}% + \MT@ifempty\@tempb\relax{% + \MT@get@space@unit2% + \MT@scale@to@em + \knaccode\MT@font\MT@char=\@tempcntb +%<debug>\MT@dinfo@nl{4}{;;; knac (\MT@char): \number\knaccode\MT@font\MT@char: [#2]}% + }% + \MT@ifdefined@c@T\MT@kn@inh@name{% + \MT@ifdefined@n@T{MT@inh@\MT@kn@inh@name @\MT@char @}{% + \MT@exp@cs\MT@map@tlist@c{MT@inh@\MT@kn@inh@name @\MT@char @}\MT@set@kn@heirs + }% + }% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\MT@set@kn@heirs} +% \begin{macrocode} +\def\MT@set@kn@heirs#1{% + \knbccode\MT@font#1=\knbccode\MT@font\MT@char + \knaccode\MT@font#1=\knaccode\MT@font\MT@char +%<debug>\MT@dinfo@nl{2}{-- heir of \MT@char: #1}% +%<debug>\MT@dinfo@nl{4}{;;; knbc (#1): \number\knbccode\MT@font\MT@char/% +%<debug> \number\knaccode\MT@font\MT@char}% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\MT@set@all@kn} +%\begin{macro}{\MT@reset@kn@codes} +%\begin{macro}{\MT@reset@kn@codes@} +% \begin{macrocode} +\def\MT@set@all@kn#1#2{% +%<debug>\MT@dinfo@nl{3}{-- knac/knbc: setting all to #1/#2}% + \let\MT@temp\@empty + \MT@ifempty{#1}\relax{\g@addto@macro\MT@temp{\knbccode\MT@font\@tempcnta=#1\relax}}% + \MT@ifempty{#2}\relax{\g@addto@macro\MT@temp{\knaccode\MT@font\@tempcnta=#2\relax}}% + \MT@do@font\MT@temp +} +\def\MT@reset@kn@codes@{\MT@set@all@kn\z@\z@} +\let\MT@reset@kn@codes\relax +% \end{macrocode} +%\end{macro} +%\end{macro} +%\end{macro} +%\begin{macro}{\MT@preset@kn} +%\begin{macro}{\MT@preset@kn@} +% \begin{macrocode} +\def\MT@preset@kn{% + \expandafter\expandafter\expandafter\MT@preset@kn@ + \csname MT@kn@c@\MT@kn@c@name @preset\endcsname\@nil +} +\def\MT@preset@kn@#1,#2\@nil{% + \ifx\MT@kn@unit@\@empty + \MT@warn@preset@towidth{kn}% + \let\MT@preset@aux\MT@preset@aux@factor + \else + \def\MT@preset@aux{\MT@preset@aux@space2}% + \fi + \MT@ifempty{#1}{\let\@tempa\@empty}{\MT@preset@aux{#1}\@tempa}% + \MT@ifempty{#2}{\let\@tempb\@empty}{\MT@preset@aux{#2}\@tempb}% + \MT@set@all@kn\@tempa\@tempb +} +}\relax +%</pdftex-def> +% \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} +%<*pdftex-def|luatex-def> +%<pdftex-def>\MT@requires@pdftex6 +%<luatex-def>\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 +} +%</pdftex-def|luatex-def> +%<pdftex-def|luatex-def|letterspace>\let\MT@tracking +%<pdftex-def|luatex-def> \MT@tracking@ +%<letterspace> \relax +% \end{macrocode} +%\end{macro} +%\end{macro} +%\end{macro} +%\begin{macro}{\MT@set@tr@codes} +% The tracking amount is determined by the optional argument to \cs{textls}, +% settings from \cs{SetTracking}, or the global \opt{letterspace} option, in +% this order. +% \begin{macrocode} +%<*pdftex-def|luatex-def|letterspace> +\def\MT@set@tr@codes{% +%<*pdftex-def|luatex-def> + \MT@vinfo{Tracking font `\MT@@font'\on@line}% + \MT@get@font@dimen@six{% + \MT@if@list@exists + \MT@get@tr@opt + \relax +%</pdftex-def|luatex-def> + \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 +%<pdftex-def|luatex-def> \MT@vinfo{... Tracking by \number\MT@letterspace@}% +% \end{macrocode} +% Letterspacing only works in <PDF> 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 +%<debug>\MT@dinfo@nl{1}{... new letterspacing instance}% +% \end{macrocode} +%\end{macro} +% In case of nested letterspacing with different amounts, we have to extract +% the base font again. +% \begin{macrocode} + \MT@get@ls@basefont +% \end{macrocode} +%\changes{v2.6}{2013/07/15}{use \pkg{luaotfload}'s \texttt{kernfactor} feature if available} +% \pkg{luaotfload} provides the faux font feature |kernfactor|, which we will +% use when dealing with non-legacy fonts, as it is less problematic and faster +% than the \pdftex\ primitive \cmd\letterspacefont. +% \begin{macrocode} +%<*luatex-def|letterspace> + \MT@if@fontspec@font{% +%<luatex-def&debug>\MT@dinfo@nl{1}{... fontspec font: \MessageBreak +%<luatex-def&debug> \expandafter\fontname\font@name}% + \ifnum\MT@letterspace@<\z@\def\MT@minus{-}\else\let\MT@minus\@empty\fi + \global\expandafter\font\MT@lsfont=% + \expandafter\MT@exp@two@c\expandafter\MT@ls@fontspec@font + \expandafter\fontname\expandafter\font@name\space \@nil + }{% +%</luatex-def|letterspace> +%<luatex-def&debug>\MT@dinfo@nl{1}{... legacy font}% + \global\expandafter\letterspacefont\MT@lsfont\font@name\MT@letterspace@ +%<luatex-def|letterspace> }% +% \end{macrocode} +%\changes{v2.2}{2007/06/16}{possibility to customise interword spacing} +% Scale interword spacing (not configurable in \letterspace). +% \begin{macrocode} +%<*pdftex-def|luatex-def> + \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,% +%</pdftex-def|luatex-def> +%<*letterspace> + % spacing = {<letterspace amount>*,,} + \fontdimen2\MT@lsfont=\dimexpr\numexpr 1000+\MT@letterspace@\relax sp + * \fontdimen2\MT@lsfont/1000\relax +%</letterspace> +% \end{macrocode} +%\changes{v2.3}{2007/11/03}{possibility to customise outer kerning +% (suggested by \contributor Stephan Hennig <stephanhennig\at arcor.de>)} +% ^^A MID: <46aa1cbb$0$31620$9b4e6d93@newsspool3.arcor-online.net> +% Adjust outer kerning (\microtype\ only). +% \begin{macrocode} +%<*pdftex-def|luatex-def> + \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 +%</pdftex-def|luatex-def> +%<*letterspace> + % no ligatures = {f} + \tagcode\MT@lsfont`f=\m@ne +%</letterspace> +% \end{macrocode} +% Adjust protrusion values now, and maybe later (in \cs{MT@pr@split@val}) +% (not for \luatex, though, where letterspacing does not interfere with protrusion). +%\changes{v2.3}{2007/07/27}{also adjust tracking if protrusion is not enabled, +% and even for \letterspace\ +% (reported by \contributor Stephan Hennig <stephanhennig\at arcor.de>)} +% ^^A MID: <46a9c6c6$0$21005$9b4e6d93@newsspool1.arcor-online.net> +%\changes{v2.3b}{2008/05/12}{fix: protrusion adjustment only for new fonts +% (reported by \contributor Wolfram Schaalo <schaalo\at gmx.net>)} +% ^^A private mail, 2008/05/12 +% \begin{macrocode} +%<luatex-def|letterspace> \MT@if@fontspec@font\relax{% +%<debug>\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 +%<luatex-def|letterspace> }% + \fi +% \end{macrocode} +% Finally, let the letterspaced font propagate. +% With \luatex, we also need to load. +%\changes{v2.5a}{2013/05/15}{fix: load font for \pkg{fontspec}} ^^A for MT@get@slot +% \begin{macrocode} + \aftergroup\MT@set@lsfont +%<pdftex-def|luatex-def> \let\MT@font\MT@lsfont +%<luatex-def> \MT@if@fontspec@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} +%<*pdftex-def|luatex-def> + \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 +%</pdftex-def|luatex-def> +% \end{macrocode} +%\end{macro} +% If \cs{MT@ls@adjust} is empty, it's the starred version of \cs{textls}. +% Use scaling to avoid a `Dimension too large'. +% \begin{macrocode} + \ifx\MT@ls@adjust\@empty +%<letterspace> % \textls : outer kerning = {*,*} ; \textls* : outer kerning = {0,0} + \MT@outer@kern=-\dimexpr\MT@letterspace@ sp * \fontdimen6\font@name/2000\relax + \MT@ls@outer@k +% \end{macrocode} +% Otherwise, get the current outer kerning and adjust it, for left and right +% side (\microtype\ only). +% \begin{macrocode} +%<*pdftex-def|luatex-def> + \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 +%</pdftex-def|luatex-def> +%<*letterspace> + \xdef\MT@set@curr@ok{\MT@outer@kern=\the\MT@outer@kern\relax}% + \MT@afteraftergroup{% + \MT@set@curr@ok + \noexpand\MT@ls@outer@k + }% +%</letterspace> + \fi +%<*pdftex-def|luatex-def> +% \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 + }% +%</pdftex-def|luatex-def> + \fi +%<pdftex-def|luatex-def> }% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\MT@afteraftergroup} +% This helper macro carries stuff outside of the current group to the end of +% the next group, but will then respect grouping, which is crucial for nested +% letterspacing. (Following an idea of Will Robertson.)^^A https://tex.stackexchange.com/a/56319 +%\changes{v2.5a}{2013/05/15}{fix: get outer kerning and spacing of nested letterspacing right} +% \begin{macrocode} +\def\MT@afteraftergroup#1{% +%<!letterspace> \MT@maybe@gobble@with@tikz{% + \MT@ifdefined@n@TF{MT@aftergroup@\number\currentgrouplevel}\relax{% + \MT@exp@cs\xdef{MT@aftergroup@\number\currentgrouplevel}% + {\MT@exp@cs\MT@glet{MT@aftergroup@\number\currentgrouplevel}\noexpand\@undefined#1}% + \expandafter\aftergroup\expandafter\aftergroup\MT@exp@cs\aftergroup + {MT@aftergroup@\number\currentgrouplevel}% + }% +%<!letterspace> }% +} +%</pdftex-def|luatex-def|letterspace> +% \end{macrocode} +%\end{macro} +%\begin{macro}{\MT@ls@fontspec@colon} +%\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 <reinhard.kotucha\at web.de>)} +% ^^A http://tug.org/pipermail/lualatex-dev/2017-February/001670.html +% Add the |kernfactor| feature to a font loaded by \pkg{fontspec} +% (we might have to add the colon ourselves). +% \begin{macrocode} +%<*luatex-def|letterspace> +\def\MT@ls@fontspec@colon#1:#2:#3:#4\@nil{\ifx\\#3\\#1:#2\else#1:#2:#3\fi} +\def\MT@ls@fontspec@font#1 #2\@nil{% + "\MT@ls@fontspec@colon#1:::\relax\@nil + kernfactor=\MT@minus \ifnum\MT@letterspace@=1000 1\else 0.% + \ifnum\MT@minus\MT@letterspace@<100 0\fi + \ifnum\MT@minus\MT@letterspace@<10 0\fi + \number\MT@minus\MT@letterspace@ \fi;" + \ifx\\#2\\ at \f@size pt\else#2\fi\relax +} +%</luatex-def|letterspace> +% \end{macrocode} +%\end{macro} +%\end{macro} +%\begin{macro}{\MT@get@tr@opt} +% Various settings (only for the \microtype\ version). +% \begin{macrocode} +%<*pdftex-def|luatex-def> +\def\MT@get@tr@opt{% + \MT@set@listname + \MT@ifdefined@n@T{MT@tr@c@\MT@tr@c@name}{% + \MT@let@cn\MT@letterspace{MT@tr@c@\MT@tr@c@name}% +% \end{macrocode} +%\begin{macro}{\MT@tr@unit@} +% Different unit? +% \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@let@cn\@tempb{MT@tr@c@\MT@tr@c@name}% + \MT@get@unit\MT@tr@unit@ + \let\MT@tr@factor@\@m + \MT@scale@to@em + \edef\MT@letterspace{\number\@tempcntb}% + \fi + }% + }% +% \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}}% +} +%</pdftex-def|luatex-def> +% \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} +%<*pdftex-def|luatex-def|letterspace> +%<plain>\MT@requires@latex2{ +\def\MT@set@lsfont{\MT@exp@two@c\let\font@name\MT@lsfont} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\lsstyle} +%\changes{v2.0}{2005/09/21}{new command: letterspacing} ^^A (beta:1) +%\changes{v2.0}{2006/09/19}{fix: font switches don't pose a problem anymore} ^^A (beta:8) +%\changes{v2.0}{2006/09/21}{fix: letterspacing commands may be nested} ^^A (beta:8) +%\changes{v2.0}{2006/12/28}{totally redone, using the new \cmd\letterspacefont} +%\changes{v2.3d}{2008/11/16}{make invalid in math mode} +%\changes{v2.3d}{2009/01/07}{disable for \luatex} +% Disable the tests whether the font should be letterspaced, then trigger the +% setup. +% Only \cs{textls} can be used in math mode (\cs{lsstyle} may be used inside +% another text switch, of course). +%\changes{v2.5}{2012/11/14}{fix: ensure to set up math fonts (reported by \contributor RazorXsr <@\at @>)} +% ^^A https://tex.stackexchange.com/questions/82686/settracking-in-the-math-environment +%\changes{v2.6}{2014/09/07}{fix: ensure to set up math fonts (reported by \contributor kleenstar <@\at @>)} +% ^^A https://tex.stackexchange.com/questions/187655/microtype-gives-wrong-letterspacing-in-math-mode +% Still, we have to ensure that math fonts are set up again. +%\changes{v2.7}{2016/08/03}{fix: prevent infinite loop with \pkg{psnfss} and \pkg{exscale} packages +% (reported by \contributor user11126 <@\at @>, +% solution by \contributor Ulrike Fischer <fischer\at troubleshooting-tex.de>)} +% Setting \cmd\glb@currsize\ 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. +% \begin{macrocode} +\DeclareRobustCommand\lsstyle{% + \not@math@alphabet\lsstyle\textls +%<pdftex-def|luatex-def> \MT@maybe@gobble@with@tikz{\aftergroup\glb@settings}% +%<pdftex-def|luatex-def> \def\MT@feat{tr}% + \let\MT@tracking\MT@set@tr@codes + \selectfont +} +% \end{macrocode} +% Now the definitions for the \letterspace\ package with plain \TeX. +% \begin{macrocode} +%<*plain> +}{ +\def\MT@set@lsfont{\MT@lsfont} +\def\lsstyle{% + \begingroup + \escapechar\m@ne + \xdef\font@name{\csname\expandafter\string\the\font\endcsname}% + \MT@set@tr@codes + \endgroup +} +\let\textls\@undefined +\let\lslig\@undefined +} +%</plain> +% \end{macrocode} +%\end{macro} +%\begin{macro}{\lslig} +%\changes{v2.1}{2007/01/17}{new command: protect ligatures in letterspaced text} +%\changes{v2.2}{2007/02/25}{always defined} +%\changes{v2.3}{2007/11/03}{redone: extract outer kerns from current letterspacing +% amount} +% For Fraktur fonts, some ligatures shouldn't be broken up. This command will +% temporarily select the base font and insert the correct kerning. +% \begin{macrocode} +\DeclareRobustCommand\lslig[1]{% + {\MT@ifdefined@c@TF\MT@curr@ls{% + \escapechar\m@ne + \MT@get@ls@basefont + \MT@outer@kern=\dimexpr\MT@curr@ls sp * \fontdimen6\font@name/2000\relax + \kern\MT@outer@kern + \font@name #1% + \kern\MT@outer@kern + }{#1}}% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\MT@ls@basefont} +%\begin{macro}{\MT@get@ls@basefont} +%\changes{v2.1}{2007/01/19}{redone: use \cmd\pdfmatch\ to make it bullet-proof} +% \pdftex\ cannot letterspace fonts that already are letterspaced. Therefore, +% we have to save the base font in |\|\meta{font name}|@base|. +% +%\changes{v2.2}{2007/02/18}{fix again: remember base font in a macro} +% The previous solution (checking the macro's meaning with \cmd\pdfmatch), +% where we were loading the base font via the \cmd\font\ primitive again, +% would destroy all previously set up micro-typographic features of the font. +% \begin{macrocode} +\def\MT@get@ls@basefont{% + \xdef\MT@ls@basefont{\csname\expandafter\string\font@name @base\endcsname}% + \expandafter\ifx\MT@ls@basefont\relax + \MT@exp@two@c\MT@glet\MT@ls@basefont\font@name + \else +%<debug>\MT@dinfo@nl{1}{... fixing base font}% + \MT@exp@two@c\let\font@name\MT@ls@basefont + \fi +} +% \end{macrocode} +%\end{macro} +%\end{macro} +%\begin{macro}{\MT@set@lsbasefont} +%\begin{macro}{\MT@set@tr@zero} +%\changes{v2.3d}{2009/03/05}{fix: allow switching off tracking +% (reported by \contributor Ulrich Dirr <ud\at mucschach.de>)} +% ^^A private mail, 2009/02/22 +% If tracking is switched off in the middle of the document, or if \cs{textls} +% is called with a zero letterspacing amount, we have to retrieve the base font +% and select it. +% \begin{macrocode} +\def\MT@set@lsbasefont{\MT@exp@two@c\let\font@name\MT@ls@basefont} +\def\MT@set@tr@zero{% +%<debug>\MT@dinfo@nl{1}{... zero tracking}% + \xdef\MT@ls@basefont{\csname\expandafter\string\font@name @base\endcsname}% + \expandafter\ifx\MT@ls@basefont\relax \else +%<debug>\MT@dinfo@nl{1}{... fixing base font}% + \aftergroup\MT@set@lsbasefont + \fi +} +%</pdftex-def|luatex-def|letterspace> +% \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} +%<*pdftex-def|luatex-def> +%<pdftex-def>\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 + } +%<*pdftex-def> +}{ + \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 + } +} +%</pdftex-def> +% \end{macrocode} +%\end{macro} +%\begin{macro}{\MT@outer@space} +% A new skip for outer spacing. +% \begin{macrocode} +\newskip\MT@outer@space +% \end{macrocode} +%\end{macro} +%\begin{macro}{\MT@tr@set@space} +% Adjust interword spacing (\fontdim2,3,4) for inner and outer space. +% For inner spacing, the font dimensions will be adjusted, the settings for +% outer spacing will be remembered in a macro. +%\todo{don't add stretch components if \pkg{ragged2e} is active?} ^^A reported by \contributor Leo ? <sdl.web\at gmail.com>, MID: <wqlfwxsuo6h.fsf@pip.srcf.ucam.org> +%^^A or in fact, shouldn't we test whether \spaceskip<>0pt ? +% \begin{macrocode} +\def\MT@tr@set@space#1,#2,#3,#4,#5,#6,{% +%<debug>\MT@dinfo@nl2{... orig. space: \the\fontdimen2\MT@lsfont, +%<debug> \the\fontdimen3\MT@lsfont, \the\fontdimen4\MT@lsfont +%<debug> \MessageBreak... (#1,#2,#3) (#4,#5,#6)}% + \let\MT@temp\@empty + \MT@tr@set@space@{#1}{#4}{2}\@empty + \MT@tr@set@space@{#2}{#5}{3}\@plus + \MT@tr@set@space@{#3}{#6}{4}\@minus + \MT@glet@nc{MT@outer@space\expandafter\string\font@name}\MT@temp +%<debug>\MT@dinfo@nl2{... inner space: \the\fontdimen2\MT@lsfont, +%<debug> \the\fontdimen3\MT@lsfont, \the\fontdimen4\MT@lsfont}% +%<debug>\MT@dinfo@nl2{... outer space: \MT@temp}% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\MT@tr@set@space@} +% If settings for outer spacing \meta{\#2} don't exist, they will be inherited +% from the inner spacing settings \meta{\#1}. +% \begin{macrocode} +\def\MT@tr@set@space@#1#2#3#4{% + \MT@ifempty{#2}{% + \MT@ifempty{#1}{% + \edef\MT@temp{\MT@temp#4\the\fontdimen#3\MT@lsfont}% + }{% + \MT@tr@set@space@@{#1}{#3}{1000}% + \edef\MT@temp{\MT@temp#4\the\@tempdima}% + \fontdimen#3\MT@lsfont=\@tempdima + }% + }{% + \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 \dimexpr\@tempcntb sp*\MT@dimen@six/1000\relax + -\fontdimen#2\MT@lsfont\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 + \@tempdima=\dimexpr \fontdimen#2\MT@lsfont+\@tempdima\relax + }{% + \MT@ifempty\@tempa{\let\@tempa\MT@letterspace@}\relax + \@tempdima=\dimexpr \numexpr1000+\@tempa sp *\fontdimen#2\MT@lsfont/1000\relax + }% +%<debug>\MT@dinfo@nl3{... : font dimen #2 (#1): \the\@tempdima}% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\MT@tr@outer@l} +% Recall the last skip (must really be an interword space, not just a marker, +%\changes{v2.3}{2007/10/23}{only change pre outer space if it contains shrink} +% nor a `hard' space, \ie, one that doesn't contain stretch or shrink parts). +%\changes{v2.3b}{2008/05/12}{fix: only in horizontal mode} +% \begin{macrocode} +\def\MT@tr@outer@l{% + \ifhmode + \ifdim\lastskip>5sp + \edef\x{\the\lastskip minus 0pt}% + \setbox\z@\hbox{\MT@outer@space=\x}% + \ifdim\wd\z@>\z@ +%<debug>\MT@dinfo2{[[[ adjusting pre space: \the\MT@outer@space}% + \unskip \hskip\MT@outer@space\relax +% \end{macrocode} +% Disable left outer kerning. +% \begin{macrocode} + \let\MT@ls@outer@k\relax + \else +% \end{macrocode} +%\changes{v2.3b}{2008/05/18}{make \cmd\spaceskip-aware (\pkg{ragged2e})} +% The \pkg{ragged2e} package sets \cmd\spaceskip\ without glue. +% \begin{macrocode} + \ifdim\lastskip=% + \ifnum\spacefactor<2000 + \spaceskip + \else + \ifdim\xspaceskip=\z@ + \dimexpr\spaceskip+\fontdimen7\font@name\relax + \else + \xspaceskip + \fi + \fi +%<debug>\MT@dinfo2{[[[ adjusting pre space (skip): \the\MT@outer@space}% + \unskip \hskip\MT@outer@space\relax + \let\MT@ls@outer@k\relax + \fi + \fi + \fi + \fi +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\MT@tr@outer@next} +%\begin{macro}{\MT@tr@outer@r} +% \microtype\ also adjusts spacing. +% The following is borrowed from \pkg{soul}. I've added the cases for italic +% correction, since tracking may also be triggered by text commands (\eg, +% \cmd\textsc). +% \begin{macrocode} +\def\MT@tr@outer@r{% + \futurelet\MT@tr@outer@next\MT@tr@outer@r@ +} +% \end{macrocode} +%\end{macro} +%\end{macro} +%\begin{macro}{\MT@if@outer@next} +% We avoid using \cs{ifx} tests, in case \cs{MT@tr@outer@next} is \cmd\let\ to +% \cs{fi} etc. +%\changes{v2.5}{2012/02/20}{fix: conflict with \pkg{amsmath} +% (reported by \contributor Scott Pakin <scott\at pakin.org>)} +% ^^A private mail, 2012/02/09 +% ^^A (beta:09) +% \begin{macrocode} +\def\MT@if@outer@next#1{% + \ifx\MT@tr@outer@next#1\expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\MT@tr@outer@r@} +% \begin{macrocode} +\def\MT@tr@outer@r@{% + \def\MT@temp*{}% +% \end{macrocode} +% Don't adjust in math mode. +%\changes{v2.3d}{2008/11/16}{fix: don't adjust in math mode +% (reported by \contributor Christoph Bier <christoph.bier\at web.de>)} +% ^^A MID: <6oapk7F2lvo6U1@mid.individual.net> +% There was a tricky bug when \cs{textls} was the last command in a +% \cmd\mathchoice\ group. +% \begin{macrocode} + \ifmmode \else +% \end{macrocode} +% A similar bug occurred when adjustment would happen inside a discretionary +% group, which we prevent here. +%\changes{v2.3d}{2009/02/08}{fix: don't adjust inside discretionary +% (reported by \contributor Maverick Woo <maverick\at cs.cmu.edu>)} +% ^^A private mail, 2009/02/07 +% This only works with \etex\ (which we know is available). +%\changes{v2.3b}{2008/05/18}{additional test for horizontal mode} +% \begin{macrocode} + \ifnum\currentgrouptype=10 \else + \def\MT@temp*##1{\ifhmode\hskip\MT@outer@space +%<debug>\MT@dinfo2{]]] adjusting post space (1): \the\MT@outer@space}% + \fi}% + \expandafter\ifcat\expandafter\noexpand\csname MT@tr@outer@next\endcsname\egroup +% \end{macrocode} +%\changes{v2.3c}{2008/09/18}{additional test for horizontal mode +% (reported by \contributor Sveinung Heggen <sveinung.heggen\at orkla.no>)} +% ^^A private mail, 2008/09/18 +% \begin{macrocode} + \ifhmode\unkern\fi\egroup + \MT@set@curr@ok \MT@set@curr@os + \def\MT@temp*{\afterassignment\MT@tr@outer@r\let\MT@temp=}% + \else +% \end{macrocode} +% If the next token is \cmd\maybe@ic\ (from an enclosing text command), we +% gobble it, read the next one, feed it to \cmd\maybe@ic@\ (via +% \cs{MT@tr@outer@icr}) and then call ourselves again. +%\changes{v2.3d}{2009/02/25}{don't use \cmd\x\ +% (reported by \contributor Ulrich Dirr <ud\at mucschach.de>)} +% ^^A private mail, 2009/02/22 +%\changes{v2.3e}{2009/05/29}{fix: set current kerning and spacing again +% (found by \contributor Lars R\"onnb\"ack <lars.ronnback\at affecto.com>)} +% ^^A <http://code.google.com/p/tufte-latex/issues/detail?id=25> +% \begin{macrocode} + \MT@if@outer@next\maybe@ic{% + \MT@set@curr@ok \MT@set@curr@os + \def\MT@temp*{\afterassignment\MT@tr@outer@icr\let\MT@temp=}% + }{% +% \end{macrocode} +% If the next token is \cmd\check@icr\ (from an inner text command), we insert +% ourselves just before it. This will then call \cmd\maybe@ic\ again the next +% round (which however will always insert an italic correction, since it +% doesn't read beyond our group). +% \begin{macrocode} + \MT@if@outer@next\check@icr{% + \def\MT@temp*{\aftergroup\MT@tr@outer@r\check@icr\let\MT@temp=}% + }{% + \MT@if@outer@next\@sptoken{% + \def\MT@temp* {\ifhmode\hskip\MT@outer@space +%<debug>\MT@dinfo2{]]] adjusting post space (2): \the\MT@outer@space}% + \fi}% + }{% + \MT@if@outer@next~{% + \def\MT@temp*~{\nobreak\hskip\MT@outer@space +%<debug>\MT@dinfo2{]]] adjusting post space (3): \the\MT@outer@space}% + }% + }{% + \MT@if@outer@next\ \relax{% + \MT@if@outer@next\space\relax{% + \MT@if@outer@next\@xobeysp\relax{% +% \end{macrocode} +% \pkg{xspace} requires special treatment. +% \begin{macrocode} + \MT@if@outer@next\xspace{% + \def\MT@temp*\xspace{\MT@xspace}% + }{% +% \end{macrocode} +% If there's no outer spacing, there may be outer kerning. +% \begin{macrocode} + \def\MT@temp*{\ifdim\MT@outer@kern=\z@\else\MT@ls@outer@k +%<debug>\MT@dinfo2{--- adjusting post kern: \the\MT@outer@kern}% + \fi}% + \MT@let@nc{MT@tr@outer@next}\relax + }}}}}}}}\fi + \fi\fi + \MT@temp*% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\MT@tr@outer@icr} +%\begin{macro}{\MT@tr@outer@icr@} +% Helper macros for the italic correction mess. +% \begin{macrocode} +\def\MT@tr@outer@icr{\afterassignment\MT@tr@outer@icr@\MT@tr@outer@r} +\def\MT@tr@outer@icr@{% + \let\@let@token= \MT@tr@outer@next + \maybe@ic@ +} +% \end{macrocode} +%\end{macro} +%\end{macro} +%\begin{macro}{\MT@xspace} +%\changes{v2.5a}{2013/05/15}{fix \texttt{outer spacing} problem with \pkg{xspace} +% (reported by \contributor Dave <@\at @>)} +% ^^A https://tex.stackexchange.com/questions/59655 +%\changes{v2.6}{2014/11/22}{fix \texttt{outer spacing} problem with (not only) \pkg{algorithm} +% (reported by \contributor Henning <@\at @> +% and \contributor Ronnie Marksch <Ronnie.Marksch\at yahoo.de>)} +% ^^A https://tex.stackexchange.com/questions/213164 +% ^^A MID: <mk1sqc$jve$1@speranza.aioe.org> +%\begin{macro}{\MT@xspace@} +% If the group is followed by \cmd\xspace, we first feed \cmd\xspace\ with the +% next token, then check whether it has inserted a space. +% \cmd\@let@token\ might be something evil, so it should be encapsulated here. +% \begin{macrocode} +\def\MT@xspace{\futurelet\@let@token\MT@xspace@} +\def\MT@xspace@{\@xspace@firsttrue\@xspace + \ifdim\lastskip>5sp + \unskip \hskip\MT@outer@space + \else + \ifdim\MT@outer@kern=\z@\else\MT@ls@outer@k \fi + \fi +} +% \end{macrocode} +%\end{macro} +%\end{macro} +% For older \pdftex\ versions and \luatex, throw an error. +% \begin{macrocode} +}{ + \DeclareRobustCommand\lsstyle{% + \MT@error{Letterspacing only works with \MT@engine tex version +%<pdftex-def> 1.40% +%<luatex-def> 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} +%</pdftex-def|luatex-def> +%<*xetex-def> +\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 +} +%</xetex-def> +% \end{macrocode} +%\begin{macro}{\textls} +%\changes{v2.0}{2005/09/21}{new command: letterspacing} ^^A (beta:1) +%\changes{v2.0}{2006/12/28}{starred version: remove spaces around text} +%\changes{v2.1}{2007/01/19}{fix: use \cmd\hmode@bgroup} +%\changes{v2.3d}{2008/11/16}{make math mode aware} +%\begin{macro}{\MT@ls@adjust@} +% This command may be used like the other text commands. +% The starred version removes kerning on the sides. +% The optional argument changes the letterspacing factor. +% \begin{macrocode} +%<*package|letterspace> +\DeclareRobustCommand\textls{% + \@ifstar{\let\MT@ls@adjust@\MT@ls@adjust@empty\MT@textls}% + {\let\MT@ls@adjust@\MT@ls@adjust@relax\MT@textls}% +} +% \end{macrocode} +%\end{macro} +%\end{macro} +%\begin{macro}{\MT@textls} +%\begin{macro}{\MT@letterspace@} +% This is now almost \LaTeX's \cmd\DeclareTextFontCommand, with the difference +% that we adjust the outer spacing and kerning also for \cs{lsstyle}, while +% \LaTeX's text \emph{switches} don't bother about italic correction. +% \begin{macrocode} +\newcommand\MT@textls[2][]{% + \ifmmode + \nfss@text{\MT@ls@set@ls{#1}\lsstyle#2}% + \else + \hmode@bgroup + \MT@ls@set@ls{#1}% + \lsstyle #2% + \expandafter + \egroup + \fi +} +% \end{macrocode} +%\end{macro} +%\end{macro} +%\begin{macro}{\MT@ls@adjust} +%\begin{macro}{\MT@ls@adjust@empty} +%\begin{macro}{\MT@ls@adjust@relax} +%\begin{macro}{\MT@ls@set@ls} +% Set current letterspacing amount and outer kerning. This has to be done inside +% the same group as the letterspacing command. +%\changes{v2.5}{2010/12/02}{allow formulas in optional argument to \cs{textls} +% (fix by \contributor Heiko Oberdiek <heiko.oberdiek\at googlemail.com>)} +% ^^A private mail, 2010/12/02 +% ^^A (beta:05) +% \begin{macrocode} +\def\MT@ls@adjust@empty{\let\MT@ls@adjust\@empty} +\def\MT@ls@adjust@relax{\let\MT@ls@adjust\relax} +\def\MT@ls@set@ls#1{% + \MT@ifempty{#1}% + {\let\MT@letterspace@\@undefined}% + {\KV@@sp@def\MT@letterspace@{#1}% + \edef\MT@letterspace@{\number\MT@letterspace@}% + \MT@ls@too@large\MT@letterspace@}% + \MT@ls@adjust@ +} +% \end{macrocode} +%\end{macro} +%\end{macro} +%\end{macro} +%\end{macro} +%\begin{macro}{\MT@ls@too@large} +% Test whether letterspacing amount is too large. +% \begin{macrocode} +\def\MT@ls@too@large#1{% + \ifnum#1>\MT@tr@max + \MT@warning{Maximum for option `letterspace' is \number\MT@tr@max}% + \let#1\MT@tr@max + \else + \ifnum#1<\MT@tr@min + \MT@warning{Minimum for option `letterspace' is \number\MT@tr@min}% + \let#1\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 +%</package|letterspace> +%<*pdftex-def|luatex-def> +\def\MT@tr@set@okern#1,#2,{% + \let\MT@temp\@empty + \MT@ifempty{#1}{\MT@tr@set@okern@{*}}{\MT@tr@set@okern@{#1}}% + \MT@ifempty{#2}{\MT@tr@set@okern@{*}}{\MT@tr@set@okern@{#2}}% + \MT@glet@nc{MT@outer@kern\expandafter\string\font@name}\MT@temp +%<debug>\MT@dinfo@nl2{... outer kerning: (#1,#2) +%<debug> = \@nameuse{MT@outer@kern\expandafter\string\font@name}}% +} +% \end{macrocode} +%\end{macro} +%\end{macro} +%\begin{macro}{\MT@tr@set@okern@} +% \begin{macrocode} +\def\MT@tr@set@okern@#1{% + \MT@test@ast#1*\@nil{% + \MT@ifdefined@c@TF\MT@tr@unit@ + {\edef\@tempb{#1}\MT@scale@to@em} + {\@tempcntb=#1\relax}% + \@tempdima=\dimexpr \@tempcntb sp * \MT@dimen@six/1000\relax + }{% + \MT@ifempty\@tempa{\let\@tempa\@m}\relax + \@tempdima=\dimexpr \numexpr\@tempa*\MT@letterspace@/1000\relax sp + * \fontdimen6\MT@lsfont/2000\relax + }% + \advance\@tempdima -\dimexpr \MT@letterspace@ sp + * \fontdimen6\MT@lsfont/2000\relax + \edef\MT@temp{\MT@temp{\the\@tempdima}}% +} +%</pdftex-def|luatex-def> +% \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} +%<*pdftex-def|luatex-def|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 +} +%</pdftex-def|luatex-def|letterspace> +% \end{macrocode} +%\end{macro} +% +%\subsubsection{Disabling ligatures} +% +%\begin{macro}{\MT@noligatures} +% The possibility to disable ligatures is a new features of \pdftex\ 1.30, and +% also works with \luatex. +%\changes{v2.3}{2007/10/23}{fix: set evaluation didn't work (bug introduced in v2.2)} +% \begin{macrocode} +%<*pdftex-def|luatex-def> +%<pdftex-def>\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} +%<luatex-def>\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} +%<luatex-def> \MT@if@fontspec@font +%<luatex-def> {\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% +%<luatex-def> \MT@if@fontspec@font +%<luatex-def> {\MT@lua{microtype.noligatures([[#1]],"_all_")}}\relax + \MT@vinfo{... Disabling all ligatures}% + }% +} +%<pdftex-def>}\relax +%</pdftex-def|luatex-def> +% \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@. +% \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.warning("overwriting function `keepligature'") + end + luaotfload.letterspace.keepligature = keepligature +end + +%</luafile> +% \end{macrocode} +% +%\subsubsection{Loading the configuration} +% +%\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> +\def\MT@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 \else + \MT@ifdefined@n@TF{MT@\MT@feat @c@\@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,% + }{% + \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 <h.harders\at tu-bs.de>)} +% ^^A private mail, 2004/09/13 +%\begin{macro}{\MT@find@file} +%\changes{v1.1}{2004/09/14}{fix: also check whether the file for the base +% font family has already been loaded} +% Micro-typographic settings may be written into a file |mt-|\meta{font family}|.cfg|. +%\changes{v1.8}{2005/04/16}{no longer wrap names in commands} +%\begin{macro}{\MT@file@list} +% We must also record whether we've already loaded the file. +% \begin{macrocode} +\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 + \InputIfFileExists{mt-#1.cfg}{% + \edef\MT@curr@file{mt-#1.cfg}% + \MT@vinfo{... Loading configuration file \MT@curr@file}% + \MT@xadd\MT@file@list{#1,}% + }{% + \MT@get@basefamily#1\@empty\@empty\@empty\@nil + \MT@exp@one@n\MT@in@clist\@tempa\MT@file@list + \ifMT@inlist@ + \MT@xadd\MT@file@list{#1,}% + \else + \InputIfFileExists{mt-\@tempa.cfg}{% + \edef\MT@curr@file{mt-\@tempa.cfg}% + \MT@vinfo{... Loading configuration file \MT@curr@file}% + \MT@xadd\MT@file@list{\@tempa,#1,}% + }{% + \MT@vinfo{... No configuration file mt-#1.cfg}% + \MT@xadd\MT@file@list{#1,}% + }% + \fi + }% + \endgroup + \fi +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\MT@cfg@catcodes} +% We have to make sure that all characters have the correct category code. +% Especially, new lines and spaces should be ignored, since files might be +% loaded in the middle of the document. This is basically \cmd\nfss@catcodes\ +% (from the \LaTeX\ kernel). I've added: +%\changes{v1.4a}{2004/11/16}{fix: reset some more catcodes when reading files +% (reported by \contributor Michael Hoppe <mh\at michael-hoppe.de>)} +% ^^A MID: <p06002000bdbff1f93eb7@[192.168.0.34]> +% |&| (in |tabular|s), |!|, |?|, |;|, +%\changes{v1.7}{2005/02/06}{reset catcode of `\texttt{:}' +% (compatibility with \pkg{french}* packages)} +% |:| (|french|), |,|, |$|, |_|, |~|, +%\changes{v1.5}{2004/11/28}{reset catcode of `\texttt{\quotechar=}' +% (compatibility with Turkish \pkg{babel})} +% and |=| (Turkish \pkg{babel}). +% +%\changes{v1.8}{2005/03/29}{reset catcodes of the remaining <ASCII> characters} +% OK, now all printable characters up to 127 are `other'. We hope that letters +% are always letters and numbers other. (\pkg{listings} makes them active, see +% section~\ref{sub:compatibility}.) +% +% We leave |^| at catcode 7, so that stuff like `|^^ff|' remains possible. +% \begin{macrocode} +\def\MT@cfg@catcodes{% + \makeatletter + \catcode`\^7% + \catcode`\ 9% + \catcode`\^^I9% + \catcode`\^^M9% + \catcode`\\\z@ + \catcode`\{\@ne + \catcode`\}\tw@ + \catcode`\#6% + \catcode`\%14% + \MT@map@tlist@n + {\!\"\$\&\'\(\)\*\+\,\-\.\/\:\;\<\=\>\?\[\]\_\`\|\~}% + \@makeother +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\MT@begin@catcodes} +% This will be used before reading the files as well as in all configuration +% commands, so that catcodes are also harmless when these commands are used +% outside the configuration files. +%\changes{v1.7}{2005/02/17}{also use inside configuration commands} +%\changes{v2.3}{2007/11/20}{fix: don't disable \cmd\KV@@sp@def} +% \begin{macrocode} +\def\MT@begin@catcodes{% + \begingroup + \MT@cfg@catcodes +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\MT@end@catcodes} +% End group if outside configuration file (otherwise relax). +% \begin{macrocode} +\let\MT@end@catcodes\endgroup +% \end{macrocode} +%\end{macro} +%\begin{macro}{\MT@get@basefamily} +% The family name might have a suffix +%\changes{v1.1}{2004/09/14}{only remove suffixes `\texttt{x}' or `\texttt{j}'} +% \eg, for expert set (|x|), old style numbers (|j|) +%\changes{v1.2}{2004/09/26}{also remove `w' (swash capitals)} +% swash capitals (|w|) etc. We mustn't simply remove the last letter, as this +% would make for instance |cms| out of |cmss| \textit{and} |cmsy| (OK, |cmex| +% will still become |cme|~\dots). +%\changes{v1.4b}{2004/11/25}{fix: failed for font names of the form \texttt{abczz} +% (reported by \contributor Georg Verweyen <Georg.Verweyen\at WEB.DE>)} +% ^^A MID: <41A64DC7.7040404@web.de> +%\changes{v2.2}{2007/02/04}{redone, working on font names and suffixes of arbitrary length} +% +% We only work on the font name if it is longer than three characters. +% \begin{macrocode} +\def\MT@get@basefamily#1#2#3#4\@nil{% + \ifx\@empty#4% + \def\@tempa{#1#2#3}% + \else + \let\@tempa\@empty + \edef\@tempb{#1#2#3#4}% + \expandafter\MT@get@basefamily@\@tempb\@nil + \fi +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\MT@get@basefamily@} +% This will only remove one suffix (the longest match), so that +% \emph{combinations} of suffixes would have be to added manually (\eg, +% |\DeclareMicrotypeVariants*{aw}|). But otherwise, something like `|padx|' +% would be truncated to `|p|'. +% \begin{macrocode} +\def\MT@get@basefamily@#1#2\@nil{% + \edef\@tempa{\@tempa#1}% + \ifx\\#2\\\expandafter\@gobble\else\expandafter\@firstofone\fi + {\MT@in@tlist{#2}\MT@variants + \ifMT@inlist@\else\MT@get@basefamily@#2\@nil\fi}% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\MT@listname} +%\begin{macro}{\MT@get@listname} +%\begin{macro}{\MT@get@listname@} +% Try all combinations of font family, series, shape and size to get a list for +% the current font. +%\changes{v1.1}{2004/09/15}{don't check for empty attributes list} +%\changes{v1.2}{2004/09/30}{alternatively check for alias font name} +%\changes{v1.7}{2005/03/15}{use \cmd\@tfor\ +% (\contributor Andreas B\"uhmann <andreas.buehmann\at web.de>'s idea)} +% ^^A private mail, 2005/03/12 +%\changes{v1.8}{2005/04/16}{made recursive} +% \begin{macrocode} +\def\MT@get@listname#1{% +%<debug>\MT@dinfo@nl{1}{trying to find \@nameuse{MT@abbr@#1} list for font `\MT@@font'}% + \let\MT@listname\@undefined + \def\@tempb{#1}% + \MT@map@tlist@c\MT@try@order\MT@get@listname@ +} +\def\MT@get@listname@#1{% + \expandafter\MT@next@listname#1% + \ifx\MT@listname\@undefined \else + \expandafter\MT@tlist@break + \fi +} +% \end{macrocode} +%\end{macro} +%\end{macro} +%\end{macro} +%\begin{macro}{\MT@try@order} +%\changes{v1.7}{2005/03/11}{fix: also check for //\meta{series}/\meta{shape}// +% (reported by \contributor Andreas B\"uhmann <andreas.buehmann\at web.de>)} +% ^^A private mail, 2005/03/10 +%\changes{v1.7}{2005/03/11}{always check for size, too +% (suggested by \contributor Andreas B\"uhmann <andreas.buehmann\at web.de>)} +% ^^A private mail, 2005/03/10 +% +%\begin{table}\small +%\caption{Order for matching font attributes}\label{tab:match-order} +%\catcode`\!=13 \let!\match +%\setlength\fboxsep{4pt} +%\leavevmode\kern-\dimexpr\fboxsep+\fboxrule\relax +%\fcolorbox{theframe}{white}{^^A +%\begin{minipage}{\textwidth} +%\def\arraystretch{1.2} +%\begin{tabular}{@{}L{38pt}*{16}{p{19.5pt}<{\centering}@{}}} +% & 1.& 2.& 3.& 4.& 5.& 6.& 7.& 8.& 9.&10.&11.&12.&13.&14.&15.&16.\\ +%\cmidrule(r){2-2} \cmidrule(r){3-3} \cmidrule(r){4-4} \cmidrule(r){5-5} +%\cmidrule(r){6-6} \cmidrule(r){7-7} \cmidrule(r){8-8} \cmidrule(r){9-9} +%\cmidrule(r){10-10}\cmidrule(r){11-11}\cmidrule(r){12-12}\cmidrule(r){13-13} +%\cmidrule(r){14-14}\cmidrule(r){15-15}\cmidrule(r){16-16}\cmidrule {17-17} +% Encoding & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! \\ +% Family & ! & ! & ! & ! & ! & ! & ! & ! & - & - & - & - & - & - & - & - \\ +% Series & ! & ! & ! & ! & - & - & - & - & ! & ! & ! & ! & - & - & - & - \\ +% Shape & ! & ! & - & - & ! & ! & - & - & ! & ! & - & - & ! & ! & - & - \\ +% Size & ! & - & ! & - & ! & - & ! & - & ! & - & ! & - & ! & - & ! & - \\ +%\end{tabular} +%\end{minipage}^^A +%}\kern-\dimexpr\fboxsep+\fboxrule\relax ^^A end \fcolorbox +%\end{table} +% +% Beginning with version 1.7, we always check for the font size. Since the +% matching order has become more logical now, it can be described in words, so +% that we don't need table~\ref{tab:match-order} in the documentation part any +% longer and can cast it off here. +% \begin{macrocode} +\def\MT@try@order{% + {1111}{1110}{1101}{1100}{1011}{1010}{1001}{1000}% + {0111}{0110}{0101}{0100}{0011}{0010}{0001}{0000}% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\MT@next@listname} +% The current context is added to the font attributes. That is, the context must +% match. +% \begin{macrocode} +\def\MT@next@listname#1#2#3#4{% + \ifnum#1=\z@\MT@nofamilytrue\fi + \edef\@tempa{\MT@encoding +/\ifnum#1=\@ne \MT@family \fi +/\ifnum#2=\@ne \MT@series \fi +/\ifnum#3=\@ne \MT@shape \fi +/\ifnum#4=\@ne *\fi + \MT@context}% +%<debug>\MT@dinfo@nl{1}{trying \@tempa}% + \MT@ifdefined@n@TF{MT@\@tempb @\@tempa}{% + \MT@next@listname@#4% + }{% +% \end{macrocode} +% Also try with an alias family. +% \begin{macrocode} + \ifnum#1=\@ne + \ifx\MT@familyalias\@empty \else + \edef\@tempa{\MT@encoding + /\MT@familyalias + /\ifnum#2=\@ne \MT@series\fi + /\ifnum#3=\@ne \MT@shape\fi + /\ifnum#4=\@ne *\fi + \MT@context}% +%<debug>\MT@dinfo@nl{1}{(alias) \@tempa}% + \MT@ifdefined@n@T{MT@\@tempb @\@tempa}{% + \MT@next@listname@#4% + }% + \fi + \fi + }% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\MT@next@listname@} +% If size is to be evaluated, do that, otherwise use the current list. +% \begin{macrocode} +\def\MT@next@listname@#1{% + \ifnum#1=\@ne + \MT@exp@cs\MT@in@rlist{MT@\@tempb @\@tempa @sizes}% + \ifMT@inlist@ + \let\MT@listname\MT@size@name + \fi + \else + \MT@let@cn\MT@listname{MT@\@tempb @\@tempa}% + \fi +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\MT@if@list@exists} +%\changes{v1.7}{2005/02/06}{don't define \cs{MT@\#1@c@name} \cmd\global ly, +% here and elsewhere} +%\begin{macro}{\MT@context} +% \begin{macrocode} +\def\MT@if@list@exists{% + \MT@let@cn\MT@context{MT@\MT@feat @context}% + \MT@ifstreq{@}\MT@context{\let\MT@context\@empty}\relax + \MT@get@listname{\MT@feat @c}% + \MT@ifdefined@c@TF\MT@listname{% + \MT@edef@n{MT@\MT@feat @c@name}{\MT@listname}% + \ifMT@nonselected + \MT@vinfo{... Applying non-selected expansion (list `\MT@listname')}% + \else + \MT@vinfo{... Loading \@nameuse{MT@abbr@\MT@feat} list `\MT@listname'}% + \fi + \@firstoftwo + }{% +% \end{macrocode} +% Since the name cannot be \cmd\@empty, this is a sound proof that no matching +% list exists. +% \begin{macrocode} + \MT@let@nc{MT@\MT@feat @c@name}\@empty +% \end{macrocode} +% Don't warn if \opt{selected}|=false|. +% \begin{macrocode} + \ifMT@nonselected + \MT@vinfo{... Applying non-selected expansion (no list)}% + \else +% \end{macrocode} +% Tracking doesn't require a list, either. +% \begin{macrocode} + \MT@ifstreq\MT@feat{tr}\relax{% + \MT@warning{I cannot find a \@nameuse{MT@abbr@\MT@feat} list + for font\MessageBreak`\MT@@font'% + \ifx\MT@context\@empty\else\space(context: `\MT@context')\fi. + Switching off\MessageBreak\@nameuse{MT@abbr@\MT@feat} for this font}% + }% + \fi + \@secondoftwo + }% +} +% \end{macrocode} +%\end{macro} +%\end{macro} +%\begin{macro}{\MT@get@inh@list} +%\changes{v1.6}{2004/12/18}{correct message if \opt{selected} is false} +%\begin{macro}{\MT@context} +% The inheritance lists are global (no context). +% \begin{macrocode} +\def\MT@get@inh@list{% + \let\MT@context\@empty +% \end{macrocode} +%\end{macro} +% \begin{macrocode} + \MT@get@listname{\MT@feat @inh}% + \MT@ifdefined@c@TF\MT@listname{% + \MT@edef@n{MT@\MT@feat @inh@name}{\MT@listname}% +%<debug>\MT@dinfo@nl{1}{... Using \@nameuse{MT@abbr@\MT@feat} inheritance list +%<debug> `\MT@listname'}% + \MT@let@cn\@tempc{MT@\MT@feat @inh@\MT@listname}% +% \end{macrocode} +% If the list is \cmd\@empty, it has already been parsed. +%\changes{v1.2}{2004/09/26}{fix: set inheritance list \cmd\global ly to \cmd\@empty} +% \begin{macrocode} + \ifx\@tempc\@empty \else +%<debug>\MT@dinfo@nl{1}{parsing inheritance list ...}% +% \end{macrocode} +% The group is only required in case an input encoding is given. +%\changes{v1.9f}{2006/08/03}{fix: input encoding must be set after the inheritance +% list has been parsed} +% \begin{macrocode} + \begingroup + \edef\MT@curr@list@name{inheritance list\noexpand\MessageBreak`\MT@listname'}% + \MT@set@inputenc{inh}% + \expandafter\MT@inh@do\@tempc,\relax,% + \MT@glet@nc{MT@\MT@feat @inh@\MT@listname}\@empty + \endgroup + \fi + }{% + \MT@let@nc{MT@\MT@feat @inh@name}\@undefined + }% +} +% \end{macrocode} +%\end{macro} +% +% \subsubsection{Translating characters into slots} +% +%\changes{v1.4}{2004/11/04}{don't use scratch registers in global definitions} +% Get the slot number of the character in the current encoding. +% +%\begin{macro}{\MT@get@slot} +%^^A\changes{v1.2}{2004/09/26}{fix: group must also include \cs{MT@get@composite}} +%\changes{v1.4b}{2004/11/22}{don't define \cs{MT@char} globally (save stack problem)} +%\changes{v1.6a}{2005/01/30}{completely redone, hopefully more robust +% (compatible with \pkg{frenchpro}; problem reported by +% \contributor Bernard Gaulle <gaulle\at idris.fr>)} +% ^^A private mail, 2005/01/28 +%\changes{v1.7}{2005/03/21}{remove backslash hack} +% There are lots of possibilities how a character may be specified in the +% configuration files, which makes translating them into slot numbers quite +% expensive. Also, we want to have this as robust as possible, so that the user +% does not have to solve a sphinx's riddle if anything goes wrong. +% +%\begin{macro}{\MT@char} +%\begin{macro}{\MT@char@} +% The character is in \cs{@tempa}, we want its slot number in \cs{MT@char}. +% \begin{macrocode} +\def\MT@get@slot{% + \escapechar`\\ + \let\MT@char@\m@ne + \MT@noresttrue +% \end{macrocode} +%\end{macro} +%\end{macro} +% Save unexpanded string in case we need to issue a warning message. +% \begin{macrocode} + \MT@toks=\expandafter{\@tempa}% +% \end{macrocode} +%\changes{v1.8}{2005/03/30}{fix: expand active characters} +%\changes{v2.7a}{2018/01/12}{expand active characters earlier} +% \item It might be an active character, \ie, an 8-bit character defined by +% \pkg{inputenc}. If so, we will expand it here to its <LICR> form. +% \begin{macrocode} + \MT@exp@two@c\MT@is@active\string\@tempa\@nil +% \end{macrocode} +% Now, let's walk through (hopefully) all possible cases. +%\begin{itemize} +% \item It's a letter, a character or a number. +% \begin{macrocode} + \expandafter\MT@is@letter\@tempa\relax\relax + \ifnum\MT@char@ < \z@ +% \end{macrocode} +% \item OK, so it must be a macro. We do not allow random commands but only +% those defined in \LaTeX's idiosyncratic font encoding scheme: +% +% If |\|\meta{encoding}|\|\meta{command} (that's \emph{one} command) is +% defined, we try to extract the slot number. +%\changes{v1.7}{2005/02/27}{test whether \cs{}\meta{encoding}\cs{}\meta{...} is defined} +%\changes{v1.8}{2005/04/04}{test whether \cs{}\meta{encoding}\cs{}\meta{...} is defined +% made more robust} +% +% We must be cautious not to stumble over accented characters consisting +% of two commands, like \cmd\`\cmd\i\ or \cmd\U\cmd\CYRI, hence, +% \cmd\string\ wouldn't be safe enough. +% \begin{macrocode} + \MT@ifdefined@n@TF{\MT@encoding\MT@detokenize@c\@tempa}% + \MT@is@symbol +% \end{macrocode} +% \item Now, we'll catch the rest, which hopefully is an accented character +% (\eg~|\"a|). +% \begin{macrocode} + {\expandafter\MT@is@composite\@tempa\relax\relax}% + \ifnum\MT@char@ < \z@ +% \end{macrocode} +% \item It could also be a \cmd\chardef ed command (\eg, the percent character). +% This seems the least likely case, so it's last. +%\changes{v1.7}{2005/03/20}{test for \cmd\chardef ed commands} +% \begin{macrocode} + \expandafter\MT@exp@two@c\expandafter\MT@is@char\expandafter + \meaning\expandafter\@tempa\MT@charstring\relax\relax\relax + \fi + \fi +% \end{macrocode} +%\end{itemize} +% \begin{macrocode} + \let\MT@char\MT@char@ + \MT@get@slot@ + \escapechar\m@ne +} +%</package> +% \end{macrocode} +%\end{macro} +%\begin{macro}{\MT@get@slot@} +%\changes{v2.5}{2010/05/18}{adapt for \xetex} +% \begin{macrocode} +%<*pdftex-def|luatex-def|xetex-def> +\def\MT@get@slot@{% +% \end{macrocode} +% If it's a legacy (\ie, <TFM>) font, proceed as usual. +% \begin{macrocode} +%<xetex-def> \ifnum\XeTeXfonttype\MT@font=\z@ + \ifnum\MT@char > \m@ne +% \end{macrocode} +% In \luatex, it may also be a glyph name, prefixed with `|/|'. +%\changes{v2.5}{2012/08/14}{adapt for \luatex\ (requested by \contributor Georg Duffner <g.duffner\at gmail.com>)} +% ^^A private mail, 2012/07/17 +% ^^A (beta:10) +% \begin{macrocode} +%<*luatex-def> + \ifnum\MT@char=47\relax + \ifMT@norest \else + \@tempcnta=\MT@lua{ + local glyph = microtype.name_to_slot([[\expandafter\@gobble\@tempa]],true) + if glyph then tex.write(glyph) + else tex.write(-1) + end + }\relax + \ifnum\@tempcnta<\z@ + \MT@warn@unknown + \let\MT@char\m@ne + \else + \edef\MT@char{\the\@tempcnta}% +%<debug>\MT@dinfo@nl{3}{> `\the\MT@toks' is a glyph name (\the\@tempcnta)}% + \fi + \fi + \else +%</luatex-def> +% \end{macrocode} +% If the user has specified something like `|fi|', or wanted to define a number +% but forgot to use three digits, we'll have something left of the string. In +% this case, we issue a warning and forget the complete string. +%\changes{v2.6}{2016/04/23}{fix: could fail with \xetex\ +% (reported by \contributor Christopher Schramm <debian\at shakaweb.org>)} +% ^^A http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=725395#15 +% \begin{macrocode} + \ifMT@norest \else + \MT@warn@rest +%<pdftex-def|luatex-def> \let\MT@char\m@ne +%<xetex-def> \let\MT@char\@empty + \fi +%<luatex-def> \fi + \else + \MT@warn@unknown +%<xetex-def> \let\MT@char\@empty + \fi +%<*xetex-def> + \else +% \end{macrocode} +% There are more possibilities for \xetex: +% It may also be a glyph name (prefixed with~`|/|'). We indicate this to +% \cs{MT@get@charwd} by reversing the sign of \cs{MT@char@}. +% \begin{macrocode} + \ifnum\MT@char=47\relax + \ifMT@norest \edef\MT@char{U47}% + \else + \@tempcnta=\XeTeXglyphindex"\expandafter\@gobble\@tempa"\relax + \ifnum\@tempcnta=\z@ + \MT@warn@unknown + \let\MT@char\@empty + \else + \edef\MT@char{\@tempa\space}% + \edef\MT@char@{-\the\@tempcnta}% +%<debug>\MT@dinfo@nl{3}{> `\the\MT@toks' is a glyph name (\the\@tempcnta)}% + \fi + \fi + \else + \ifnum\MT@char > \m@ne + \ifMT@norest +% \end{macrocode} +% Or, it's a Unicode number, which we mustn't translate into a glyph number, +% since the latter is font-specific. +% \begin{macrocode} + \@tempcnta=\XeTeXcharglyph\MT@char\relax + \ifnum\@tempcnta=\z@ + \MT@info@missing@char + \let\MT@char\@empty + \else +%<debug>\MT@dinfo@nl{3}{> (glyph number: \the\@tempcnta, +%<debug> glyph name: \XeTeXglyphname\MT@font\@tempcnta)}% + \edef\MT@char{U\MT@char}% + \fi + \else + \MT@warn@rest + \let\MT@char\@empty + \fi + \else + \MT@warn@unknown + \let\MT@char\@empty + \fi + \fi + \fi +%</xetex-def> +} +%</pdftex-def|luatex-def|xetex-def> +% \end{macrocode} +% This is the lua function to translate glyph name into slot number. +% Beginning with v2.2, \pkg{luaotfload} provides this function in an <API>, which +% we use if available, but (for now, at least) keep the old code for backward +% compatibility. +%\changes{v2.5a}{2013/04/19}{adapt to \pkg{luaotfload} v2.2 +% (contributed by \contributor \'Elie Roux <elie.roux\at telecom-bretagne.eu>)} +% ^^A MID: <516AAF6B.8040605@telecom-bretagne.eu> +% \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) + return slot_of_name(font.current(), name, unsafe) + end +else + -- we dig into internal structure (should be avoided) + local function name_to_slot(name, unsafe) + if fonts then + local unicodes + if fonts.ids then --- legacy luaotfload + local tfmdata = fonts.ids[font.current()] + if not tfmdata then return end + unicodes = tfmdata.shared.otfdata.luatex.unicodes + else --- new location + local tfmdata = fonts.hashes.identifiers[font.current()] + if not tfmdata then return end + unicodes = tfmdata.resources.unicodes + end + local unicode = unicodes[name] + if unicode then --- does the 'or' branch actually exist? + return type(unicode) == "number" and unicode or unicode[1] + end + end + end + microtype.name_to_slot = name_to_slot +end + +%</luafile> +% \end{macrocode} +%\end{macro} +%\begin{macro}{\MT@is@letter} +% Input is a letter, a character or a number. +%\changes{v1.8}{2005/04/04}{warning for non-<ASCII> characters} +%\changes{v1.9}{2005/10/22}{using \cmd\catcode\ should be more efficient than +% inspecting the \cmd\meaning} +%\begin{macro}{\MT@max@char} +%\begin{macro}{\MT@max@slot} +% Warning if resulting character or slot number is too large. +% \begin{macrocode} +%<*pdftex-def|luatex-def|xetex-def> +\def\MT@max@char +%<pdftex-def> {127 } +%<luatex-def|xetex-def> {1114111 } +\def\MT@max@slot +%<pdftex-def> {255 } +%<luatex-def|xetex-def> {1114111 } +%</pdftex-def|luatex-def|xetex-def> +% \end{macrocode} +%\end{macro} +%\end{macro} +%\begin{macro}{\ifMT@norest} +% Test whether all of the string has been used up. +% \begin{macrocode} +%<*package> +\newif\ifMT@norest +% \end{macrocode} +%\end{macro} +% \begin{macrocode} +\def\MT@is@letter#1#2\relax{% + \ifcat a\noexpand#1\relax + \edef\MT@char@{\number`#1}% + \ifx\\#2\\% +%<debug>\MT@dinfo@nl{3}{> `\the\MT@toks' is a letter (\MT@char@)}% + \else + \MT@norestfalse + \fi + \else + \ifcat !\noexpand#1\relax + \edef\MT@char@{\number`#1}% +%<debug>\MT@dinfo@nl{3}{> `\the\MT@toks' is a character (\MT@char@)}% + \ifx\\#2\\% + \ifnum\MT@char@ > \MT@max@char \MT@warn@ascii \fi + \else + \MT@norestfalse + \expandafter\MT@is@number#1#2\relax\relax + \fi + \fi + \fi +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\MT@is@number} +% Numbers may be specified as a three-digit decimal number (|029|), +%\changes{v1.1}{2004/09/13}{numbers may also be specified in hexadecimal or octal +% (suggested by \contributor Harald Harders <h.harders\at tu-bs.de>)} +% ^^A private mail, 2004/09/13 +% as a hexadecimal number (prefixed with~|"|: |"1D|) or as a octal number +% (prefixed with~|'|: |'35|). They must consist of at least three characters +% (including the prefix), that is, |"F| is not permitted. +% \begin{macrocode} +\def\MT@is@number#1#2#3\relax{% + \ifx\relax#3\relax \else + \ifx\relax#2\relax \else + \MT@noresttrue + \if#1"\relax + \def\x{\uppercase{\edef\MT@char@{\number#1#2#3}}}\x +%<debug>\MT@dinfo@nl{3}{> ... a hexadecimal number: \MT@char@}% + \else + \if#1'\relax + \def\MT@char@{\number#1#2#3}% +%<debug>\MT@dinfo@nl{3}{> ... an octal number: \MT@char@}% + \else + \MT@ifint{#1#2#3}{% + \def\MT@char@{\number#1#2#3}% +%<debug>\MT@dinfo@nl{3}{> ... a decimal number: \MT@char@}% + }\MT@norestfalse + \fi + \fi + \ifnum\MT@char@ > \MT@max@slot + \MT@warn@number@too@large{\noexpand#1\noexpand#2\noexpand#3}% + \let\MT@char@\m@ne + \fi + \fi + \fi +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\MT@is@active} +%\changes{v1.8}{2005/03/30}{new macro: translate \pkg{inputenc}-defined characters} +% Expand an active character. (This was completely broken in v1.7, and only +% worked by chance before.) +%\changes{v1.9}{2005/09/08}{redone: use \cmd\set@display@protect} +% We \cmd\set@display@protect\ to translate, \eg, \expandafter|\"A| into |\"A|, +% that is to whatever it is defined in the \pkg{inputenc} encoding file. +% +%\iffalse +% Previous solution, slightly more robust (but doesn't understand Unicode): +%\begin{verbatim} +%\def\MT@is@active#1#2\@nil{% +% \ifx\\#2\\% +% \ifnum\catcode`#1 = \active +% \toks@=\expandafter\expandafter\expandafter{\@tempa}% +% \expandafter\MT@active@inpenc\the\toks@\relax\relax +% \edef\@tempa{\the\toks@}% +% \edef\x{\MT@toks={\the\MT@toks\space(= \the\toks@)}}\x +% \fi +% \fi +%} +%\def\MT@active@inpenc#1#2#3\relax{% +% \ifx#1\IeC +% \def\IeC##1{\toks@={##1}}% +% \the\toks@ +% \expandafter\MT@active@inpenc\the\toks@\relax\relax +% \fi +% \ifx#1\@tabacckludge +% \def\@tabacckludge##1##2{% +% \toks@=\expandafter{\csname\string##1\endcsname#3}}% +% \the\toks@ +% \fi +% \ifx#1\@inpenc@undefined@ +% \def\@inpenc@undefined@##1{% +% \edef\x{\toks@={% +% undefined^^J(\MT@MT)\@spaces\@spaces\@spaces\@spaces +% in input encoding ``##1''}}\x}% +% \the\toks@ +% \fi +%} +%\end{verbatim} +%\fi +% +% Unfortunately, the (older) \pkg{inputenc} definitions prefer the +% protected\slash generic variants (\eg, \cmd\copyright\ instead of +% \cmd\textcopyright), which our parser won't be able to understand. +% (I'm fed up now, so you have to complain if you really, really want to be able +% to write `\expandafter|\textcopyright|' instead of \cmd\textcopyright, thus +% rendering your configuration files unportable.) +% +% Unicode characters (\pkg{inputenc}/|utf8|,|utf8x|) are also supported. +%\changes{v1.9d}{2006/03/06}{support for Unicode (\pkg{inputenc}\slash\texttt{utf8})} +%\changes{v2.3}{2007/11/11}{support for extended Unicode (\pkg{inputenc}\slash\texttt{utf8x} resp. \pkg{ucs}) -- experimental} +% +%\iffalse ^^A obsolete because of `inputenc' key +% We presume that only one input encoding is being used throughout the entire +% document. We could of course save the input encoding together with the list, +% but this would entail a couple of problems: (1)~the overhead of resetting the +% input encoding every time, (2)~the problem (or rather, impossibility) to +% decide which input encoding should be chosen -- the one active when the list +% was declared or the one active when the font is selected, and (3)~the +% improbability of multiple input encodings being used at all. +%\fi +% \begin{macrocode} +\def\MT@is@active#1#2\@nil{% + \ifnum\catcode`#1 = \active + \begingroup + \set@display@protect + \let\IeC\@firstofone + \let\@inpenc@undefined@\MT@undefined@char +% \end{macrocode} +% 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}% +% \end{macrocode} +% The \cmd\expandafter\ hocus-pocus should please \pkg{newunicodechar}. +%\changes{v2.7a}{2017/11/25}{compatibility with \pkg{newunicodechar} +% (reported by \contributor Nils Anders Danielsson <nad\at cse.gu.se>)} +% ^^A private mail, 2017/09/05 +% \begin{macrocode} + \edef\x{\endgroup + \def\noexpand\@tempa{\expandafter\expandafter\expandafter\@empty\@tempa}% +% \end{macrocode} +% Append what we think the translation is to the token register we use for the +% log. +% \begin{macrocode} + \MT@toks={\the\MT@toks\space(= + \expandafter\expandafter\expandafter\@empty\@tempa)}% + }% + \x + \fi +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\MT@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 \cs{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}% + \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.2}{2007/03/07}{expand once more (for \pkg{frenchpro})} +% \dots~or, if it hasn't been defined by \cs{DeclareTextSymbol}, 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 +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\MT@is@char} +%\begin{macro}{\MT@charstring} +% A helper macro that inspects the \cmd\meaning\ of its argument. +% \begin{macrocode} +\begingroup + \catcode`\/=\z@ +% \end{macrocode} +%\SpecialEscapechar{\/} +% \begin{macrocode} + /MT@map@tlist@n{/\CHARLEX}/@makeother + /lowercase{% + /def/x{/endgroup + /def/MT@charstring{\CHAR"}% + /def/MT@is@char##1\CHAR"##2##3##4/relax{% + /ifx/relax##4/relax + /ifMT@xunicode + /expandafter/MT@is@charx/MT@strip@prefix##1>/relax\CHAR "% + /relax/relax/relax/relax/relax + /fi + /else + /ifx/relax##1/relax + /if##3\/relax + /edef/MT@char@{/number"##2}% + /MT@ifstreq/MT@charstring{##3##4}/relax/MT@norestfalse + /else + /edef/MT@char@{/number"##2##3}% + /MT@ifstreq/MT@charstring{##4}/relax + {/MT@is@xchar##2##3|##4\CHAR"/relax}% + /fi +%<debug> /MT@dinfo@nl{3}{> `/the/MT@toks' is a \char (/MT@char@)}% + /fi + /fi + }% +% \end{macrocode} +%\end{macro} +%\end{macro} +%\begin{macro}{\MT@is@xchar} +%\changes{v2.6}{2016/04/23}{update for \pkg{fontspec}'s <TU> encoding} +% With \pkg{fontspec}'s <TU> encoding, glyph numbers may be up to four digits. +%\SpecialEscapechar{\/} +% \begin{macrocode} + /def/MT@is@xchar##1|##2\CHAR"##3##4/relax{% + /MT@ifstreq/MT@charstring{##3##4}% + {/edef/MT@char@{/number"##1##2}}/MT@norestfalse + }% +% \end{macrocode} +%\end{macro} +%\begin{macro}{\MT@charxstring} +%\begin{macro}{\MT@strip@prefix} +%\begin{macro}{\MT@is@charx} +% For \pkg{xunicode}, which doesn't \cmd\countdef, but rather \cmd\def s the chars. +%\changes{v2.5}{2010/02/27}{compatibility with \pkg{xunicode}} +%\SpecialEscapechar{\/} +% \begin{macrocode} + /def/MT@charxstring{\CHAR "}% + /def/MT@strip@prefix##1>##2/relax{##2}% + /def/MT@is@charx##1\CHAR "##2##3##4##5##6/relax{% + /ifx/relax##1/relax + /ifx/relax##6/relax/else + /edef/MT@char@{/number"##2##3##4##5}% + /MT@ifstreq{\RELAX >\CHAR "}{##6}/relax/MT@norestfalse +%<debug> /MT@dinfo@nl{3}{> `/the/MT@toks' is a xunicode \char (/MT@char@)}% + /fi + /fi + }% + }% + } +/x +% \end{macrocode} +%\end{macro} +%\end{macro} +%\end{macro} +%\begin{macro}{\MT@is@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 \cs{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 (\cs{DeclareUnicodeComposite}), which we take care of here +% (\cs{UnicodeEncodingName} has been introduced at the same time): +%\changes{v2.7}{2017/04/29}{compatibility with \LaTeX\ 2017/01/01 (\cs{DeclareUnicodeComposite}) +% (reported by \contributor Ulrike Fischer <news3\at nililand.de> and +% `\contributor jcr <@\at @>')} +% ^^A (1) private mail, 2017/04/25 +% ^^A (2) https://tex.stackexchange.com/questions/373594/ +% \begin{macrocode} + \ifx\UnicodeEncodingName\@undefined\else + \expandafter\expandafter\expandafter + \MT@is@uni@comp\MT@char\iffontchar\else\fi\relax + \fi + \expandafter\expandafter\expandafter\MT@is@letter\MT@char\relax\relax +% \end{macrocode} +% Again, \pkg{xunicode}. +% \begin{macrocode} + \ifnum\MT@char@ < \z@ + \ifMT@xunicode + \edef\MT@char{\MT@exp@two@c\MT@strip@prefix\meaning\MT@char>\relax}% + \expandafter\MT@exp@two@c\expandafter\MT@is@charx\expandafter + \MT@char\MT@charxstring\relax\relax\relax\relax\relax + \fi + \fi + \fi +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{MT@is@uni@comp} +% Helper for \cs{DeclareUnicodeComposite}. +% \begin{macrocode} +\def\MT@is@uni@comp#1\iffontchar#2\else#3\fi\relax{% + \ifx\\#2\\\else\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 +% \cs{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: \cs{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 9: `Hints and caveats')}% + \MT@glet\MT@warn@unknown\relax}% +} +% +%\subsubsection{Hook into \LaTeX's font selection}\label{sssec: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 \pkg{IEEEtran} class which loads all fonts in the class file itself (to +% fine tune inter-word spacing), and the \pkg{memoir} class, too. To cut this +% short: it seemed to get out of hand, and I decided that it would be better to +% use \cmd\pickup@font\ and decide for ourselves whether we've already seen +% that font. I hope the overhead isn't too large. +%\changes{v1.8}{2005/05/15}{if font substitution has occurred, set up the +% substitute font, not the selected one} +%\changes{v1.9}{2005/10/03}{allow context-specific font setup} +%\begin{macro}{\MT@font@list} +%\begin{macro}{\MT@font} +% We use a comma separated list. +% \begin{macrocode} +\let\MT@font@list\@empty +\let\MT@font\@empty +% \end{macrocode} +%\end{macro} +%\end{macro} +% All this is done at the beginning of the document. +% It doesn't work for plain, of course, which doesn't have \cmd\pickup@font. +% \begin{macrocode} +%</package> +%<*package|letterspace> +%<plain>\MT@requires@latex2{ +\MT@addto@setup{% +% \end{macrocode} +%\begin{macro}{\MT@orig@pickupfont} +% The \pkg{luatexja} package redefines \cmd\char, which will upset our parsing +% of text symbols and commands; instead of fixing this, we won't bother, +% at least for the moment, but simply issue a warning and disable all +% further warnings. The fix is left to the user by not specifying any text +% commands but only (Unicode) letters. +%\changes{v2.6}{2015/12/05}{(in)compatibility with \pkg{luatexja}: disable unknown slots warnings +% (reported by \contributor Max <@\at @>)} +% ^^A https://tex.stackexchange.com/questions/272102/luatexja-with-microtype-generates-lots-of-warnings +% The \pkg{xeCJK} package, or rather its \pkg{xunicode-addon}, also modifies the way +% text symbols are defined (like \pkg{luatexja} but in a different way). +% Again, we only issue a warning. +%\changes{v2.6}{2015/11/03}{(in)compatibility with \pkg{xeCJK}: disable unknown slots warnings +% (reported by \contributor HcN <@\at @>)} +% ^^A https://tex.stackexchange.com/questions/275653/warning-using-microtype-and-excjk-packages +% \begin{macrocode} +%<package> \MT@with@package@T{luatexja}{\MT@warn@unknown@once{luatexja}}% +%<package> \MT@with@package@T{xeCJK} {\MT@warn@unknown@once{xeCJK}}% +% \end{macrocode} +%\changes{v2.1}{2007/01/15}{compatibility with \pkg{CJK}: also check for its definition} +%\changes{v2.3b}{2008/05/26}{compatibility with \pkg{CJKutf8}: also check for its definition} +% \microtype\ also works with \pkg{CJK} in the sense that nothing will break +% when both packages are used at the same time. However, since \pkg{CJK} has +% its own way of encoding, it is currently not possible to create +% character-specific settings. That is, the only feature available with +% \pkg{CJK} fonts is (non-selected) expansion. +% (Tracking doesn't really work for other reasons.) +%\todo{fix tracking with \pkg{CJK}, if worth the trouble}^^A +% Like us, \pkg{CJK} redefines \cmd\pickup@font. +% \begin{macrocode} + \@ifpackageloaded{CJK}{% +% \end{macrocode} +%\changes{v2.6}{2013/06/06}{compatibility with \pkg{xeCJK}: pretend that \pkg{CJK} wasn't loaded} +% The \pkg{xeCJK} package in turn pretends that \pkg{CJK} was loaded, but does not +% change the definition of \cmd\pickup@font. +% With \pkg{xeCJK}, protrusion should be possible also for C/J/K characters; +% I haven't tried it, though. +%^^A also, \XeTeXinterchartoks probably interferes ... +% \begin{macrocode} + \@ifpackageloaded{xeCJK}{\@firstofone}{% + \@ifpackagelater{CJK}{2006/10/17}% 4.7.0 + {\def\MT@orig@pickupfont{\CJK@ifundefined\CJK@plane}}% + {\def\MT@orig@pickupfont{\@ifundefined{CJK@plane}}}% + \g@addto@macro\MT@orig@pickupfont + {{\expandafter\ifx\font@name\relax\define@newfont\fi}}% +% \end{macrocode} +% \pkg{CJKutf8} redefines \cmd\pickup@font\ once more (recent versions, in +% <PDF> mode, as determined by \pkg{ifpdf}, which \pkg{CJKutf8} loads). +% \begin{macrocode} + \@ifpackageloaded{CJKutf8}% + {\@ifpackagelater{CJKutf8}{2008/05/22}% 4.8.0 + {\ifpdf\expandafter\@secondoftwo\else\expandafter\@firstoftwo\fi}% + {\@firstoftwo}}% + {\@firstoftwo}% + {\g@addto@macro\MT@orig@pickupfont{% + {\expandafter\ifx\csname\curr@fontshape/\f@size/\CJK@plane\endcsname\relax + \define@newfont\else\xdef\font@name{% + \csname \curr@fontshape/\f@size/\CJK@plane\endcsname}\fi}}}% + {\g@addto@macro\MT@orig@pickupfont{% + {\expandafter\ifx\csname \curr@fontshape/\f@size/\CJK@plane\endcsname\relax + \define@newfont\def\CJK@temp{v}% + \ifx\CJK@temp\CJK@plane + \expandafter\ifx\csname CJK@cmap@\f@family\CJK@plane\endcsname\relax + \else\csname CJK@cmap@\f@family\CJK@plane\endcsname\fi + \else \CJK@addcmap\CJK@plane \fi + \else\xdef\font@name{% + \csname \curr@fontshape/\f@size/\CJK@plane\endcsname}\fi}}}% + \@gobble + }% + }{\@firstofone}% +% \end{macrocode} +% This is the normal \LaTeX\ definition. +% \begin{macrocode} + {\def\MT@orig@pickupfont{\expandafter\ifx\font@name\relax\define@newfont\fi}}% +% \end{macrocode} +% Check whether \cmd\pickup@font\ is defined as expected. +% The warning issued by \cmd{\CheckCommand*} would be a bit too generic. +% \begin{macrocode} + \ifx\pickup@font\MT@orig@pickupfont \else + \MT@warning@nl{% + Command \string\pickup@font\space is not defined as expected.% + \MessageBreak Patching it anyway. Some things may break% +%<*package> + .\MessageBreak Double-check whether micro-typography is indeed% + \MessageBreak applied to the document.% + \MessageBreak (Hint: Turn on `verbose' mode)% +%</package> + }% + \fi +% \end{macrocode} +%\end{macro} +%\begin{macro}{\pickup@font} +% Then we append our stuff. Everything is done inside a group. +%\changes{v2.2}{2007/04/15}{\letterspace: setup inside group} +% \begin{macrocode} + \g@addto@macro\pickup@font{\begingroup}% +% \end{macrocode} +% If the \pkg{trace} package is loaded, we turn off tracing of \microtype's +% setup, which is extremely noisy. +%\changes{v1.9e}{2006/05/25}{no tracing with \pkg{trace} package} +% \begin{macrocode} + \MT@with@package@T{trace}{\g@addto@macro\pickup@font{\conditionally@traceoff}}% + \g@addto@macro\pickup@font{% + \escapechar\m@ne +%<*package> +%<debug> \global\MT@inannottrue +%<debug> \MT@glet\MT@pdf@annot\@empty +%<debug> \MT@addto@annot{(line \number\inputlineno)}% +% \end{macrocode} +% If \cs{MT@font} is empty, no substitution has taken place, hence +% \cmd\font@name\ is correct. Otherwise, if they are different, +% \cmd\font@name\ does not describe the font actually used. This test will +% catch first order substitutions, like |bx| to |b|, but it will still fail if +% the substituting font is itself substituted. +% \begin{macrocode} + \MT@let@cn\MT@font{MT@subst@\expandafter\string\font@name}% + \ifx\MT@font\relax + \let\MT@font\font@name + \else + \ifx\MT@font\font@name \else +%<debug> \MT@addto@annot{= substituted with \MT@@font}% + \MT@register@subst@font + \fi + \fi + \MT@setupfont +%</package> +%<letterspace> \MT@tracking + \endgroup + }% +%<*package> +% \end{macrocode} +%\end{macro} +%\begin{macro}{\MT@pickupfont} +%\begin{macro}{\MT@MT@pickupfont} +%\begin{macro}{\MT@ltx@pickupfont} +% Remember the patched command, because we may have to disable +% ourselves in certain situations. +% \begin{macrocode} + \let\MT@pickupfont\pickup@font + \def\MT@MT@pickupfont {\let\pickup@font\MT@pickupfont}% + \def\MT@ltx@pickupfont{\let\pickup@font\MT@orig@pickupfont}% +% \end{macrocode} +%\end{macro} +%\end{macro} +%\end{macro} +%\begin{macro}{\do@subst@correction} +% Additionally, we hook into \cmd\do@subst@correction, which is called if +% a substitution has taken place, to record the name of the ersatz font. +% Unfortunately, this will only work for one-level substitutions. +%\changes{v2.3}{2007/08/05}{remember substitute font for all times +% (reported by \contributor Stephan Hennig <stephanhennig\at arcor.de>)} +% ^^A MID: <46ab4fbb$0$31632$9b4e6d93@newsspool3.arcor-online.net> +% We have to remember the substitute for the rest of the document, not just for +% the first time it is called, since we need it every time a font is +% letterspaced. +% \begin{macrocode} + \g@addto@macro\do@subst@correction + {\edef\MT@font{\csname\curr@fontshape/\f@size\endcsname}% + \MT@glet@nc{MT@subst@\expandafter\string\font@name}\MT@font}% +% \end{macrocode} +%\end{macro} +%\begin{macro}{\add@accent} +%\changes{v1.8}{2005/06/14}{fix: disable micro-typographic setup inside \cmd\add@accent\ +% (reported by \contributor Stephan Hennig <stephanhennig\at arcor.de>)} +% ^^A MID: <42adb0e3$0$27784$9b4e6d93@newsread2.arcor-online.net> +%\begin{macro}{\MT@orig@add@accent} +% Inside \cmd\add@accent, we have to disable \microtype's setup, since the +% grouping in the patched \cmd\pickup@font\ would break the accent if +% different fonts are used for the base character and the accent. Fortunately, +% \LaTeX\ takes care that the fonts used for the \cmd\accent\ are already set +% up, so that we cannot be overlooking them. +% \begin{macrocode} + \let\MT@orig@add@accent\add@accent + \def\add@accent#1#2{% + \MT@ltx@pickupfont + \MT@orig@add@accent{#1}{#2}% + \MT@MT@pickupfont + }% +%</package> +} +%<plain>}\relax +%<*package> +% \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 if it isn't registered already +% (reported by \contributor George Gratzer <gratzer\at me.com> +% and \contributor Josep Maria Font <jmfont\at ub.edu>)} +% ^^A 1. <http://permalink.gmane.org/gmane.comp.tex.macosx/38293> +% ^^A 2. <http://permalink.gmane.org/gmane.comp.tex.macosx/38303> +% ^^A (beta:02) +% (only if it isn't registered already). +% \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,}\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 this command. +% \begin{macrocode} +\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} +\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. +%\todo{remove from other lists?} +%\changes{v2.5}{2010/08/23}{only register if it isn't registered already} ^^A (beta:02) +% \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,}% + \fi + }% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\MT@register@font@cx} +% For each feature, add the current font to the list, unless we didn't set it +% up. +% \begin{macrocode} +\def\MT@register@font@cx{% + \MT@map@clist@c\MT@active@features{% + \MT@exp@cs\ifx{MT@\@nameuse{MT@abbr@##1}}\relax\else + \MT@exp@cs\MT@xadd + {MT@##1@\csname MT@##1@context\endcsname font@list}% + {\MT@font,}% + \def\@tempa{##1}% + \MT@exp@cs\MT@map@tlist@c{MT@##1@doc@contexts}\MT@maybe@rem@from@list + \fi + }% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\MT@maybe@rem@from@list} +% Recurse through all context font lists of the document and remove the font, +% unless it's the current context. +% \begin{macrocode} +\def\MT@maybe@rem@from@list#1{% + \MT@ifstreq{\@tempa/#1}{\@tempa/\csname MT@\@tempa @context\endcsname}\relax{% + \expandafter\MT@exp@one@n\expandafter\MT@rem@from@clist\expandafter + \MT@font \csname MT@\@tempa @#1font@list\endcsname + }% +} +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\microtypecontext} +%\changes{v1.9}{2005/10/03}{new command: change setup context in the document} +%\changes{v2.3}{2007/08/05}{made robust (reported by \contributor Stephan Hennig <stephanhennig\at arcor.de>)} +% ^^A MID: <46ab4fbb$0$31632$9b4e6d93@newsspool3.arcor-online.net> +%\changes{v2.6}{2014/03/26}{allow \texttt{activate} shortcut (reported by \contributor Karl Berry <karl\at freefriends.org>)} +% ^^A private mail, 2014/03/21 +% The user may change the context, so that different setups are possible. This +% is especially useful for multi-lingual documents. +% +% Inside the preamble, it shouldn't actually do anything but remember it for +% later. +% \begin{macrocode} +\def\microtypecontext#1{\MT@addto@setup{\microtypecontext{#1}}} +\MT@addto@setup{% + \DeclareRobustCommand\microtypecontext[1]{% + \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} +%\begin{macro}{\textmicrotypecontext} +%\changes{v2.2}{2007/07/03}{new command: wrapper around \cs{microtypecontext}} +% This is just a wrapper around \cs{microtypecontext}. +% \begin{macrocode} +\DeclareRobustCommand\textmicrotypecontext[2]{{\microtypecontext{#1}#2}} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\MT@reset@context} +%\changes{v1.9f}{2006/08/03}{only reset context if it has actually been changed} +%\begin{macro}{\MT@reset@context@} +% We have to reset the font at the end of the group, provided there actually was +% a change. +% \begin{macrocode} +\def\MT@reset@context@{% + \MT@vinfo{<<< Resetting contexts\on@line +%<debug> \MessageBreak= \MT@pr@context/\MT@ex@context +%<debug> /\MT@tr@context/\MT@kn@context/\MT@sp@context + }% + \selectfont +} +% \end{macrocode} +%\end{macro} +%\end{macro} +%\begin{macro}{\MT@setup@contexts} +% The first time \cs{microtypecontext} is called, we initialise the context +% lists and redefine the commands used in \cmd\pickup@font. +% \begin{macrocode} +\def\MT@setup@contexts{% + \MT@map@clist@c\MT@active@features + {\MT@glet@nc{MT@##1@@font@list}\MT@font@list}% + \MT@glet\MT@check@font\MT@check@font@cx + \MT@glet\MT@register@font\MT@register@font@cx + \MT@glet\MT@register@subst@font\MT@register@subst@font@cx + \MT@glet\MT@setup@contexts\relax +} +% \end{macrocode} +%\end{macro} +% Define context keys. +% \begin{macrocode} +\MT@map@clist@c\MT@features@long{% + \define@key{MTC}{#1}[]{% + \edef\@tempb{\@nameuse{MT@rbba@#1}}% + \MT@exp@one@n\MT@in@clist\@tempb\MT@active@features + \ifMT@inlist@ +% \end{macrocode} +% Using an empty context is only asking for trouble, therefore we choose the +% `|@|' instead (hoping for the \LaTeX\ users' natural awe of this character). +% \begin{macrocode} + \MT@ifempty{##1}{\def\MT@val{@}}{\def\MT@val{##1}}% + \MT@exp@cs\ifx{MT@\@tempb @context}\MT@val +%<debug>\MT@dinfo{1}{>>> no change of #1 context: `\MT@val'}% + \else + \MT@vinfo{>>> Changing #1 context to `\MT@val'\MessageBreak\on@line +%<debug> \space(previous: `\@nameuse{MT@\@tempb @context}')% + }% + \def\MT@reset@context{\aftergroup\MT@reset@context@}% +% \end{macrocode} +% The next time we see the font, we have to reset \emph{all} factors. +% \begin{macrocode} + \MT@glet@nn{MT@reset@\@tempb @codes}{MT@reset@\@tempb @codes@}% +% \end{macrocode} +% We must also keep track of all contexts in the document. +% \begin{macrocode} + \expandafter\MT@exp@one@n\expandafter\MT@in@tlist\expandafter + \MT@val \csname MT@\@tempb @doc@contexts\endcsname + \ifMT@inlist@ \else + \MT@exp@cs\MT@xadd{MT@\@tempb @doc@contexts}{{\MT@val}}% +%<debug> \MT@dinfo{1}{||| added #1 context: \@nameuse{MT@\@tempb @doc@contexts}}% + \fi + \MT@edef@n{MT@\@tempb @context}{\MT@val}% + \fi + \fi + }% +} +% \end{macrocode} +% We also allow the |activate| shortcut. +% \begin{macrocode} +\define@key{MTC}{activate}[]{% + \setkeys{MT}{protrusion={#1}}% + \setkeys{MT}{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{{\MT@declare@sets{##1}{#2}{#3}}}% + }{% + \MT@map@clist@n{#1}{{% + \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}% + }% + }% + }}% + }% + \MT@end@catcodes +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\MT@DeclareSetAndUseIt} +% \begin{macrocode} +\newcommand\MT@DeclareSetAndUseIt[3][]{% + \MT@DeclareSet[#1]{#2}{#3}% + \UseMicrotypeSet[#1]{#2}% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\MT@curr@set@name} +% We need to remember the name of the set currently being declared. +% \begin{macrocode} +\let\MT@curr@set@name\@empty +% \end{macrocode} +%\end{macro} +%\begin{macro}{\MT@declare@sets} +% Define the current set name and parse the keys. +%\changes{v1.1}{2004/09/20}{remove spaces around set name} +%\changes{v1.8}{2005/05/15}{warning when redefining a set} +%\changes{v2.0}{2006/10/16}{fix: empty size list when redefining set} +%\changes{v2.6}{2016/04/20}{fix: undefine lists for redefining} +%\todo{share one set between features} +% \begin{macrocode} +\def\MT@declare@sets#1#2#3{% + \def\MT@curr@set@name{#2}% + \MT@ifdefined@n@T{MT@#1@set@@\MT@curr@set@name}{% + \MT@warning{Redefining \@nameuse{MT@abbr@#1} set `\MT@curr@set@name'}% + \MT@map@clist@n{font,encoding,family,series,shape,size}{% + \MT@glet@nc{MT@#1list@##1@\MT@curr@set@name}\@undefined + }% + }% + \MT@glet@nc{MT@#1@set@@\MT@curr@set@name}\@empty +%<debug>\MT@dinfo{1}{declaring \@nameuse{MT@abbr@#1} set `\MT@curr@set@name'}% + \setkeys{MT@#1@set}{#3}% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\MT@define@set@key@} +% \meta{\#1} = font axis, \meta{\#2} = feature. +%\changes{v1.8}{2005/04/16}{use comma lists instead of token lists} +%\changes{v1.9a}{2005/11/21}{don't expand variables immediately +% (requested by \contributor Georg Verweyen <verweyen\at gmail.com>)} +% ^^A MID: <437a522d$0$7419$9b4e6d93@newsread4.arcor-online.net> +% \begin{macrocode} +\def\MT@define@set@key@#1#2{% + \define@key{MT@#2@set}{#1}[]{% + \MT@glet@nc{MT@#2list@#1@\MT@curr@set@name}\@empty + \MT@map@clist@n{##1}{% + \KV@@sp@def\MT@val{####1}% + \MT@get@highlevel{#1}% +% \end{macrocode} +% We do not add the expanded value to the list~\dots +% \begin{macrocode} + \MT@exp@two@n\g@addto@macro + {\csname MT@#2list@#1@\MT@curr@set@name\expandafter\endcsname}% + {\MT@val,}% + }% +% \end{macrocode} +% \dots~but keep in mind that the list has to be expanded at the end of the +% preamble. +% \begin{macrocode} + \expandafter\g@addto@macro\expandafter\MT@font@sets + \csname MT@#2list@#1@\MT@curr@set@name\endcsname +%<debug>\MT@dinfo@nl{1}{-- #1: \@nameuse{MT@#2list@#1@\MT@curr@set@name}}% + }% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\MT@get@highlevel} +% Saying, for instance, `|family=rm*|' or `|shape=bf*|' will expand to +% \cmd\rmdefault\ resp. \cmd\bfdefault. +% \begin{macrocode} +\def\MT@get@highlevel#1{% + \expandafter\MT@test@ast\MT@val*\@nil\relax{% +% \end{macrocode} +% And `|family = *|' will become \cmd\familydefault. +% \begin{macrocode} + \MT@ifempty\@tempa{\def\@tempa{#1}}\relax +% \end{macrocode} +% Test whether the command is actually defined. +%\changes{v2.7a}{2017/11/17}{test whether \cs{\dots default} is defined} +% \begin{macrocode} + \MT@ifdefined@n@TF{\@tempa default}% + {\edef\MT@val{\expandafter\noexpand\csname \@tempa default\endcsname}}% + {\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 version, these values will not be expanded immediately +% but at the end of the preamble. +%\changes{v1.2}{2004/09/26}{check whether defaults have changed} +%\changes{v1.5}{2004/12/02}{don't test defaults if called after begin document} +%\changes{v1.9a}{2005/11/21}{no longer check whether defaults have changed} +% \begin{macrocode} + }% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\MT@test@ast} +% It the last character is an asterisk, execute the second argument, otherwise +% the first one. +%\changes{v1.7}{2005/03/10}{make it simpler} +% \begin{macrocode} +\def\MT@test@ast#1*#2\@nil{% + \def\@tempa{#1}% + \MT@ifempty{#2}% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\MT@font@sets} +%\begin{macro}{\MT@fix@font@set} +% Fully expand the font specification and fix catcodes for all font sets. Also +% remove \pkg{fontspec}'s counters. +% \begin{macrocode} +\let\MT@font@sets\@empty +\def\MT@fix@font@set#1{% + \MT@ifdefined@c@T{#1}{% + \xdef#1{#1}% + \ifMT@fontspec + \xdef#1{\expandafter\MT@scrubfeatures#1()\relax}% + \fi + \global\@onelevel@sanitize#1% + }% +} +% \end{macrocode} +%\end{macro} +%\end{macro} +%\begin{macro}{\MT@define@set@key@size} +% |size| requires special treatment. +% \begin{macrocode} +\def\MT@define@set@key@size#1{% + \define@key{MT@#1@set}{size}[]{% + \MT@map@clist@n{##1}{% + \def\MT@val{####1}% + \expandafter\MT@get@range\MT@val--\@nil + \ifx\MT@val\relax \else + \MT@exp@cs\MT@xadd + {MT@#1list@size@\MT@curr@set@name}% + {{{\MT@lower}{\MT@upper}\relax}}% + \fi + }% +%<debug>\MT@dinfo@nl{1}{-- size: \@nameuse{MT@#1list@size@\MT@curr@set@name}}% + }% +} +% \end{macrocode} +%\end{macro} +%\changes{v1.7}{2005/03/11}{allow specification of size ranges +% (suggested by \contributor Andreas B\"uhmann <andreas.buehmann\at web.de>)} +% ^^A private mail, 2005/03/10 +% Font sizes may also be specified as ranges. This has been requested by Andreas +% B\"uhmann, who has also offered valuable help in implementing this. Now, it +% is for instance possible to set up different lists for fonts with optical +% sizes. (The \pkg{MinionPro} project does this for the OpenType version +% of Adobe's Minion. (\ctanpkgurl{minionpro})) +% +%\begin{macro}{\MT@get@range} +%\begin{macro}{\MT@upper} +%\begin{macro}{\MT@lower} +% Ranges will be stored as triplets of |{|\meta{lower bound}|}|\allowbreak +% |{|\meta{upper bound}|}|\allowbreak|{|\meta{list name}|}|. +% For simple sizes, the upper boundary is \textminus1. +% \begin{macrocode} +\def\MT@get@range#1-#2-#3\@nil{% + \MT@ifempty{#1}{% + \MT@ifempty{#2}{% + \let\MT@val\relax + }{% + \def\MT@lower{0}% + \def\MT@val{#2}% + \MT@get@size + \edef\MT@upper{\MT@val}% + }% + }{% + \def\MT@val{#1}% + \MT@get@size + \ifx\MT@val\relax \else + \edef\MT@lower{\MT@val}% + \MT@ifempty{#2}{% + \MT@ifempty{#3}% + {\def\MT@upper{-1}}% +% \end{macrocode} +% 2048\,pt is \TeX's maximum font size. +% \begin{macrocode} + {\def\MT@upper{2048}}% + }{% + \def\MT@val{#2}% + \MT@get@size + \ifx\MT@val\relax \else + \MT@ifdim\MT@lower>\MT@val{% + \MT@error{% + Invalid size range (\MT@lower\space > \MT@val) in font set + `\MT@curr@set@name'.\MessageBreak Swapping sizes}{}% + \edef\MT@upper{\MT@lower}% + \edef\MT@lower{\MT@val}% + }{% + \edef\MT@upper{\MT@val}% + }% + \MT@ifdim\MT@lower=\MT@upper + {\def\MT@upper{-1}}% + \relax + \fi + }% + \fi + }% +} +% \end{macrocode} +%\end{macro} +%\end{macro} +%\end{macro} +%\begin{macro}{\MT@get@size} +% Translate a size selection command and normalise it. +% \begin{macrocode} +\def\MT@get@size{% +% \end{macrocode} +% A single star would mean \cs{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 +% \end{macrocode} +% The \pkg{relsize} solution of parsing \cmd\@setfontsize\ does not work with the +% <AMS> classes, among others. I hope my hijacking doesn't do any harm. +%\changes{v1.2}{2004/09/26}{hijack \cmd\set@fontsize\ instead of \cmd\@setfontsize} +% We redefine \cmd\set@fontsize\ instead of \cmd\@setfontsize\ because some classes +% might define the size selection commands by simply using \cmd\fontsize\ +% (\eg, the \pkg{a0poster} class). +%\changes{v2.3b}{2008/03/07}{grouping} +% \begin{macrocode} + \begingroup + \def\set@fontsize##1##2##3##4\@nil{\endgroup\def\MT@val{##2}}% + \@tempa\@nil + \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} +%\changes{v1.9}{2005/07/13}{\cs{DeclareMicrotypeSet}: new key: \texttt{font}} +%\begin{macro}{\MT@define@set@key@font} +%\changes{v2.3}{2007/11/20}{\texttt{font}: single asterisk means normal font} +% \begin{macrocode} +\def\MT@define@set@key@font#1{% + \define@key{MT@#1@set}{font}[]{% + \MT@glet@nc{MT@#1list@font@\MT@curr@set@name}\@empty + \MT@map@clist@n{##1}{% + \def\MT@val{####1}% + \MT@ifstreq\MT@val*{\def\MT@val{*/*/*/*/*}}\relax + \expandafter\MT@get@font\MT@val/////\@nil + \MT@exp@two@n\g@addto@macro + {\csname MT@#1list@font@\MT@curr@set@name\expandafter\endcsname}% + {\MT@val,}% + }% + \expandafter\g@addto@macro\expandafter\MT@font@sets + \csname MT@#1list@font@\MT@curr@set@name\endcsname +%<debug>\MT@dinfo@nl{1}{-- font: \@nameuse{MT@#1list@font@\MT@curr@set@name}}% + }% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\MT@get@font} +% Translate any asterisks. +% \begin{macrocode} +\def\MT@get@font#1/#2/#3/#4/#5/#6\@nil{% + \MT@get@font@{#1}{#2}{#3}{#4}{#5}{0}% + \ifx\MT@val\relax\def\MT@val{0}\fi + \expandafter\g@addto@macro\expandafter\@tempb\expandafter{\MT@val}% + \let\MT@val\@tempb +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\MT@get@font@} +% Helper macro, also used by \cs{MT@get@font@and@size}. +% \begin{macrocode} +\def\MT@get@font@#1#2#3#4#5#6{% + \let\@tempb\@empty + \def\MT@temp{#1/#2/#3/#4/#5}% + \MT@get@axis{encoding}{#1}% + \MT@get@axis{family} {#2}% + \MT@get@axis{series} {#3}% + \MT@get@axis{shape} {#4}% + \ifnum#6>\z@\edef\@tempb{\@tempb*}\fi + \MT@ifempty{#5}{% + \MT@warn@axis@empty{size}{\string\normalsize}% + \def\MT@val{*}% + }{% + \def\MT@val{#5}% + }% + \MT@get@size +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\MT@get@axis} +% \begin{macrocode} +\def\MT@get@axis#1#2{% + \def\MT@val{#2}% + \MT@get@highlevel{#1}% + \MT@ifempty\MT@val{% + \MT@warn@axis@empty{#1}{\csname #1default\endcsname}% + \expandafter\def\expandafter\MT@val\expandafter{\csname #1default\endcsname}% + }\relax + \expandafter\g@addto@macro\expandafter\@tempb\expandafter{\MT@val/}% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\MT@warn@axis@empty} +% \begin{macrocode} +\def\MT@warn@axis@empty#1#2{% + \MT@warning{#1 axis is empty in font specification\MessageBreak + `\MT@temp'. Using `#2' instead}% +} +% \end{macrocode} +%\end{macro} +% We can finally assemble all pieces to define \cs{DeclareMicrotypeSet}'s +% keys. +% They are also used for \cs{DisableLigatures}. +% \begin{macrocode} +\MT@exp@one@n\MT@map@clist@n{\MT@features,nl}{% + \MT@define@set@key@{encoding}{#1}% + \MT@define@set@key@{family} {#1}% + \MT@define@set@key@{series} {#1}% + \MT@define@set@key@{shape} {#1}% + \MT@define@set@key@size {#1}% + \MT@define@set@key@font {#1}% +} +% \end{macrocode} +%\begin{macro}{\UseMicrotypeSet} +% To use a particular set we simply redefine |MT@|\meta{feature}|@setname|. +% If the optional argument is empty, set names for all features will be +% redefined. +%^^A \changes{v1.1}{2004/09/20}{remove spaces around first argument} +%\changes{v2.6}{2013/08/05}{ignore spaces} +% \begin{macrocode} +\def\UseMicrotypeSet{% + \MT@begin@catcodes + \MT@UseMicrotypeSet +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\MT@UseMicrotypeSet} +% \begin{macrocode} +\newcommand*\MT@UseMicrotypeSet[2][]{% + \MT@ifempty{#1}{% + \MT@map@clist@c\MT@features{{\MT@use@set{##1}{#2}}}% + }{% + \MT@map@clist@n{#1}{{% + \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}% + }% + }% + }}% + }% + \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{{\MT@set@default@set{##1}{#2}}}% + }{% + \MT@map@clist@n{#1}{{% + \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}% + }% + }% + }}% + }% + \MT@end@catcodes +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\MT@default@pr@set} +%\begin{macro}{\MT@default@ex@set} +%\begin{macro}{\MT@default@tr@set} +%\begin{macro}{\MT@default@sp@set} +%\begin{macro}{\MT@default@kn@set} +%\begin{macro}{\MT@set@default@set} +% \begin{macrocode} +\def\MT@set@default@set#1#2{% + \MT@ifdefined@n@TF{MT@#1@set@@#2}{% +%<debug>\MT@dinfo{1}{declaring default \@nameuse{MT@abbr@#1} set `#2'}% + \MT@xdef@n{MT@default@#1@set}{#2}% + }{% + \MT@error{% + The \@nameuse{MT@abbr@#1} set `#2' is not declared.\MessageBreak + Cannot make it the default set. Using set\MessageBreak `all' instead}{}% + \MT@xdef@n{MT@default@#1@set}{all}% + }% +} +% \end{macrocode} +%\end{macro} +%\end{macro} +%\end{macro} +%\end{macro} +%\end{macro} +%\end{macro} +% +%\subsubsection{Variants and aliases} +% +%\begin{macro}{\DeclareMicrotypeVariants} +%\changes{v2.2}{2007/02/04}{new command} +%\changes{v2.6}{2013/08/05}{ignore spaces} +%\begin{macro}{\MT@variants} +% Specify suffixes for variants (see \file{fontname/variants.map}). +% The starred version appends to the list. +% \begin{macrocode} +\let\MT@variants\@empty +\def\DeclareMicrotypeVariants{% + \MT@begin@catcodes + \@ifstar + \MT@DeclareVariants + {\let\MT@variants\@empty\MT@DeclareVariants}% +} +% \end{macrocode} +%\end{macro} +%\end{macro} +%\begin{macro}{\MT@DeclareVariants} +% \begin{macrocode} +\def\MT@DeclareVariants#1{% + \MT@map@clist@n{#1}{% + \def\@tempa{##1}% + \@onelevel@sanitize\@tempa + \xdef\MT@variants{\MT@variants{\@tempa}}% + }% + \MT@end@catcodes +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\DeclareMicrotypeAlias} +% This can be used to set an alias name for a font, so that the file and the +% settings for the aliased font will be loaded. +%\changes{v1.5}{2004/12/03}{remove spaces around arguments} +%\changes{v1.8}{2005/05/09}{warning when overriding an alias font} +%\changes{v2.5}{2010/05/17}{ignore spaces} +% \begin{macrocode} +\def\DeclareMicrotypeAlias{% + \MT@begin@catcodes + \MT@DeclareMicrotypeAlias +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\MT@DeclareMicrotypeAlias} +% \begin{macrocode} +\newcommand*\MT@DeclareMicrotypeAlias[2]{% + \def\@tempb{#2}% + \@onelevel@sanitize\@tempb + \MT@ifdefined@n@T{MT@#1@alias}{% + \MT@warning{Alias font family `\@tempb' will override + alias `\@nameuse{MT@#1@alias}'\MessageBreak + for font family `#1'}}% + \MT@xdef@n{MT@#1@alias}{\@tempb}% +% \end{macrocode} +% If we encounter this command while a font is being set up, we also set the +% alias for the current font so that if \cs{DeclareMicrotypeAlias} has been +% issued inside a configuration file, the configuration file for the alias font +% will be loaded, too. +%\changes{v1.7}{2005/03/23}{may also be used inside configuration files} +% \begin{macrocode} + \MT@ifdefined@c@T\MT@family{% +%<debug>\MT@dinfo{1}{Activating alias font `\@tempb' for `\MT@family'}% + \MT@glet\MT@familyalias\@tempb + }% + \MT@end@catcodes +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\LoadMicrotypeFile} +%\changes{v1.7}{2005/03/22}{new command (suggested by +% \contributor Andreas B\"uhmann <andreas.buehmann\at web.de>)} +% ^^A private mail, 2005/03/21 +%\changes{v2.5}{2010/05/13}{remove all spaces in font name} +% May be used to load a configuration file manually. +% \begin{macrocode} +\def\LoadMicrotypeFile#1{% + \edef\@tempa{\zap@space#1 \@empty}% + \@onelevel@sanitize\@tempa + \MT@exp@one@n\MT@in@clist\@tempa\MT@file@list + \ifMT@inlist@ + \MT@vinfo{... Configuration file mt-\@tempa.cfg already loaded}% + \else + \MT@xadd\MT@file@list{\@tempa,}% + \MT@begin@catcodes + \InputIfFileExists{mt-\@tempa.cfg}{% + \edef\MT@curr@file{mt-\@tempa.cfg}% + \MT@vinfo{... Loading configuration file \MT@curr@file}% + }{% + \MT@warning{Configuration file mt-\@tempa.cfg\MessageBreak + does not exist}% + }% + \MT@end@catcodes + \fi +} +%</package> +%</package|letterspace> +% \end{macrocode} +%\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} +%<*pdftex-def|luatex-def> +%<pdftex-def>\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 +} +%<pdftex-def>}{ +%</pdftex-def|luatex-def> +% \end{macrocode} +%\end{macro} +%\end{macro} +%\end{macro} +% If \pdftex\ is too old, we throw an error. +% \begin{macrocode} +%<*pdftex-def|xetex-def> +\renewcommand*\DisableLigatures[2][]{% + \MT@error{Disabling ligatures of a font is only possible\MessageBreak + with pdftex version 1.30 or newer.\MessageBreak + Ignoring \string\DisableLigatures}{% +%<pdftex-def> Upgrade +%<xetex-def> Use + pdftex.}% +} +%<pdftex-def>} +%</pdftex-def|xetex-def> +% \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}% + }% +} +%</package> +% \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} +%<*pdftex-def|xetex-def|luatex-def> +\def\SetProtrusion{% + \MT@begin@catcodes + \MT@SetProtrusion +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\MT@SetProtrusion} +%\begin{macro}{\MT@pr@c@name} +%\begin{macro}{\MT@extra@context} +%\begin{macro}{\MT@permutelist} +% We want the catcodes to be correct even if this is called in the preamble. +% \begin{macrocode} +\newcommand*\MT@SetProtrusion[3][]{% + \let\MT@extra@context\@empty +% \end{macrocode} +% Parse the optional first argument. We first have to know the name before we +% can deal with the extra options. +% \begin{macrocode} + \MT@set@named@keys{MT@pr@c}{#1}% +%<debug>\MT@dinfo{1}{creating protrusion list `\MT@pr@c@name'}% + \def\MT@permutelist{pr@c}% + \setkeys{MT@cfg}{#2}% +% \end{macrocode} +% We have parsed the second argument, and can now define macros for all +% permutations of the font attributes to point to |\MT@pr@c@|\meta{name},~\dots +% \begin{macrocode} + \MT@permute +% \end{macrocode} +% \dots~which we can now define to be \meta{\#3}. +% Here, as elsewhere, we have to make the definitions global, since they will +% occur inside a group. +% \begin{macrocode} + \MT@gdef@n{MT@pr@c@\MT@pr@c@name}{#3}% + \MT@end@catcodes +} +%</pdftex-def|xetex-def|luatex-def> +% \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} +%<*pdftex-def|luatex-def> +\def\SetExpansion{% + \MT@begin@catcodes + \MT@SetExpansion +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\MT@SetExpansion} +%\begin{macro}{\MT@ex@c@name} +%\begin{macro}{\MT@extra@context} +%\begin{macro}{\MT@permutelist} +% \begin{macrocode} +\newcommand*\MT@SetExpansion[3][]{% + \let\MT@extra@context\@empty + \MT@set@named@keys{MT@ex@c}{#1}% + \MT@ifdefined@n@T{MT@ex@c@\MT@ex@c@name @factor}{% + \ifnum\csname MT@ex@c@\MT@ex@c@name @factor\endcsname > \@m + \MT@warning@nl{Expansion factor \number\@nameuse{MT@ex@c@\MT@ex@c@name @factor} + too large in list\MessageBreak `\MT@ex@c@name'. Setting it to the + maximum of 1000}% + \MT@glet@nc{MT@ex@c@\MT@ex@c@name @factor}\@m + \fi + }% +%<debug>\MT@dinfo{1}{creating expansion list `\MT@ex@c@name'}% + \def\MT@permutelist{ex@c}% + \setkeys{MT@cfg}{#2}% + \MT@permute + \MT@gdef@n{MT@ex@c@\MT@ex@c@name}{#3}% + \MT@end@catcodes +} +% \end{macrocode} +%\end{macro} +%\end{macro} +%\end{macro} +%\end{macro} +%\begin{macro}{\SetTracking} +%\changes{v2.0}{2006/12/28}{new command: tracking} +%\changes{v2.2}{2007/02/23}{third argument may be empty} +%\changes{v2.2}{2007/02/23}{new key `\texttt{no ligatures}' to disable +% ligatures of letterspaced fonts} +%\changes{v2.2}{2007/06/16}{new keys `\texttt{spacing}' and `\texttt{outer spacing}' +% to adjust interword spacing +% (suggested by \contributor Steven~E. Harris <seh\at panix.com>)} +% ^^A private mail, 2007/06/15 +% \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}% +%<debug>\MT@dinfo{1}{creating tracking list `\MT@tr@c@name'}% + \def\MT@permutelist{tr@c}% + \setkeys{MT@cfg}{#2}% + \MT@permute + \KV@@sp@def\@tempa{#3}% + \MT@ifempty\@tempa\relax{% + \MT@ifint\@tempa + {\MT@xdef@n{MT@tr@c@\MT@tr@c@name}{\@tempa}}% + {\MT@warning{Value `\@tempa' is not a number in\MessageBreak + tracking set `\MT@curr@set@name'}}}% + \MT@end@catcodes +} +%</pdftex-def|luatex-def> +% \end{macrocode} +%\end{macro} +%\begin{macro}{\SetExtraSpacing} +%\changes{v2.0}{2005/09/28}{new command: adjustment of interword spacing} ^^A (beta:1) +% \begin{macrocode} +%<*pdftex-def> +\def\SetExtraSpacing{% + \MT@begin@catcodes + \MT@SetExtraSpacing +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\MT@SetExtraSpacing} +%\begin{macro}{\MT@sp@c@name} +%\begin{macro}{\MT@extra@context} +%\begin{macro}{\MT@permutelist} +% \begin{macrocode} +\newcommand*\MT@SetExtraSpacing[3][]{% + \let\MT@extra@context\@empty + \MT@set@named@keys{MT@sp@c}{#1}% +%<debug>\MT@dinfo{1}{creating spacing list `\MT@sp@c@name'}% + \def\MT@permutelist{sp@c}% + \setkeys{MT@cfg}{#2}% + \MT@permute + \MT@gdef@n{MT@sp@c@\MT@sp@c@name}{#3}% + \MT@end@catcodes +} +% \end{macrocode} +%\end{macro} +%\end{macro} +%\end{macro} +%\end{macro} +%\begin{macro}{\SetExtraKerning} +%\changes{v2.0}{2005/09/28}{new command: additional kerning} ^^A (beta:1) +% \begin{macrocode} +\def\SetExtraKerning{% + \MT@begin@catcodes + \MT@SetExtraKerning +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\MT@SetExtraKerning} +%\begin{macro}{\MT@kn@c@name} +%\begin{macro}{\MT@extra@context} +%\begin{macro}{\MT@permutelist} +% \begin{macrocode} +\newcommand*\MT@SetExtraKerning[3][]{% + \let\MT@extra@context\@empty + \MT@set@named@keys{MT@kn@c}{#1}% +%<debug>\MT@dinfo{1}{creating kerning list `\MT@kn@c@name'}% + \def\MT@permutelist{kn@c}% + \setkeys{MT@cfg}{#2}% + \MT@permute + \MT@gdef@n{MT@kn@c@\MT@kn@c@name}{#3}% + \MT@end@catcodes +} +%</pdftex-def> +% \end{macrocode} +%\end{macro} +%\end{macro} +%\end{macro} +%\end{macro} +%\begin{macro}{\MT@set@named@keys} +%\changes{v1.9f}{2006/08/10}{new macro: set name first, simplify parsing of +% optional argument} +%\begin{macro}{\MT@options} +% We first set the name (if specified), then remove it from the list, and set +% the remaining keys. +% \begin{macrocode} +%<*package> +\def\MT@set@named@keys#1#2{% + \def\x##1name=##2,##3\@nil{% + \setkeys{#1}{name=##2}% + \gdef\MT@options{##1##3}% + \MT@rem@from@clist{name=}\MT@options + }% + \x#2,name=,\@nil + \@expandtwoargs\setkeys{#1}\MT@options +} +% \end{macrocode} +%\end{macro} +%\end{macro} +%\begin{macro}{\MT@define@code@key} +% Define the keys for the configuration lists (which are setting the codes, in +% \pdftex\ speak). +% \begin{macrocode} +\def\MT@define@code@key#1#2{% + \define@key{MT@#2}{#1}[]{% + \@tempcnta=\@ne + \MT@map@clist@n{##1}{% + \KV@@sp@def\MT@val{####1}% +% \end{macrocode} +% Here, too, we allow for something like `|bf*|'. It will be expanded +% immediately. +% \begin{macrocode} + \MT@get@highlevel{#1}% + \MT@edef@n{MT@temp#1\the\@tempcnta}{\MT@val}% + \advance\@tempcnta \@ne + }% + }% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\MT@define@code@key@family} +%\changes{v2.5}{2011/02/07}{compatibility with \pkg{fontspec}: remove its internal counter +% (reported by \contributor Till~A. Heilmann <till.heilmann\at unibas.ch>)} +% ^^A <http://permalink.gmane.org/gmane.comp.tex.lualatex.devel/668> +% ^^A (beta:06) +% Remove \pkg{fontspec}'s internal feature counter. +% \begin{macrocode} +\def\MT@define@code@key@family#1{% + \define@key{MT@#1}{family}[]{% + \@tempcnta=\@ne + \MT@map@clist@n{##1}{% + \KV@@sp@def\MT@val{####1}% + \MT@get@highlevel{family}% + \ifMT@fontspec + \edef\x{\edef\noexpand\MT@val{\noexpand\MT@scrubfeature\MT@val()\relax}}\x + \fi + \MT@edef@n{MT@tempfamily\the\@tempcnta}{\MT@val}% + \advance\@tempcnta \@ne + }% + }% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\MT@define@code@key@size} +%\changes{v1.9c}{2006/01/25}{fix: embrace \cs{MT@tempsize} in \cmd\csname\ +% (bug introduced in v1.9b)} +% \cs{MT@tempsize} must be in a \cmd\csname, so that it is at least +% \cmd\relax, not undefined. +% \begin{macrocode} +\def\MT@define@code@key@size#1{% + \define@key{MT@#1}{size}[]{% + \MT@map@clist@n{##1}{% + \KV@@sp@def\MT@val{####1}% + \expandafter\MT@get@range\MT@val--\@nil + \ifx\MT@val\relax \else + \MT@exp@cs\MT@xadd{MT@tempsize}% + {{{\MT@lower}{\MT@upper}{\MT@curr@set@name}}}% + \fi + }% + }% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\MT@define@code@key@font} +%\changes{v1.9c}{2006/01/25}{fix: context was ignored} +%\changes{v2.5}{2011/09/04}{scrub \pkg{fontspec} feature count +% (found by \contributor Meho~R <meho.2005\at gmail.com>)} +% ^^A MID: <e16242e2-49cf-47bf-9ab4-66f81ced4c7a@glegroupsg2000goo.googlegroups.com> +% ^^A (beta:08) +% \begin{macrocode} +\def\MT@define@code@key@font#1{% + \define@key{MT@#1}{font}[]{% + \MT@map@clist@n{##1}{% + \KV@@sp@def\MT@val{####1}% + \MT@ifstreq\MT@val*{\def\MT@val{*/*/*/*/*}}\relax + \expandafter\MT@get@font@and@size\MT@val/////\@nil + \ifMT@fontspec + \edef\@tempb{\expandafter\MT@scrubfeatures\@tempb()\relax}% + \fi + \MT@xdef@n{MT@\MT@permutelist @\@tempb\MT@extra@context}% + {\csname MT@\MT@permutelist @name\endcsname}% +%<debug>\MT@dinfo@nl{1}{initialising: use list for font \@tempb=\MT@val +%<debug> \ifx\MT@extra@context\@empty\else\MessageBreak +%<debug> (context: \MT@extra@context)\fi}% + \MT@exp@cs\MT@xaddb + {MT@\MT@permutelist @\@tempb\MT@extra@context @sizes}% + {{{\MT@val}{\m@ne}{\MT@curr@set@name}}}% + }% + }% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\MT@get@font@and@size} +% Translate any asterisks and split off the size. +% \begin{macrocode} +\def\MT@get@font@and@size#1/#2/#3/#4/#5/#6\@nil{% + \MT@get@font@{#1}{#2}{#3}{#4}{#5}{1}% +} +% \end{macrocode} +%\end{macro} +% \begin{macrocode} +\MT@define@code@key{encoding}{cfg} +\MT@define@code@key@family {cfg} +\MT@define@code@key{series} {cfg} +\MT@define@code@key{shape} {cfg} +\MT@define@code@key@size {cfg} +\MT@define@code@key@font {cfg} +% \end{macrocode} +%\begin{macro}{\MT@define@opt@key} +% \begin{macrocode} +\def\MT@define@opt@key#1#2{% + \define@key{MT@#1@c}{#2}[]{\MT@ifempty{##1}\relax{% + \MT@xdef@n{MT@#1@c@\MT@curr@set@name @#2}{##1}}}% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\MT@listname@count} +% The options in the optional first argument. +% \begin{macrocode} +\newcount\MT@listname@count +\MT@map@clist@c\MT@features{% +% \end{macrocode} +%\end{macro} +%\changes{v1.9a}{2005/11/21}{`\meta{file name}\texttt{/}\meta{line number}' as default list name} +% Use file name and line number as the list name if the user didn't bother +% to invent one -- also check whether the name already exists (in case more +% than one unnamed list is loaded in the same line, for example +% \cmd\AtBeginDocument). +%\changes{v2.5}{2011/02/26}{fix: check whether `\meta{file}\texttt{/}\meta{line}' list name already exists +% (reported by \contributor Till~A. Heilmann <till.heilmann\at unibas.ch>)} +% ^^A private mail, 2011/02/25 +% ^^A (beta:07) +%\changes{v1.3}{2004/10/27}{fix: specifying \texttt{load} option does no +% longer require to give a \texttt{name}, too} +%\changes{v2.2}{2007/01/28}{simplify key declarations} +% \begin{macrocode} + \define@key{MT@#1@c}{name}[]{% + \MT@ifempty{##1}{% + \MT@ifdefined@n@TF{MT@#1@c@\MT@curr@file/\the\inputlineno}{% + \global\advance\MT@listname@count\@ne + \MT@edef@n{MT@#1@c@name}{\MT@curr@file/\the\inputlineno + (\number\MT@listname@count)}% + }{% + \MT@edef@n{MT@#1@c@name}{\MT@curr@file/\the\inputlineno}% + }% + }{% + \MT@edef@n{MT@#1@c@name}{##1}% + \MT@ifdefined@n@T{MT@#1@c@\csname MT@#1@c@name\endcsname}{% + \MT@warning{Redefining \@nameuse{MT@abbr@#1} list `\@nameuse{MT@#1@c@name}'}% + }% + }% + \MT@let@cn\MT@curr@set@name{MT@#1@c@name}% + }% + \MT@define@opt@key{#1}{load}% + \MT@define@opt@key{#1}{factor}% + \MT@define@opt@key{#1}{preset}% + \MT@define@opt@key{#1}{inputenc}% +% \end{macrocode} +% Only one context is allowed. This might change in the future. +% \begin{macrocode} + \define@key{MT@#1@c}{context}[]{\MT@ifempty{##1}\relax{\def\MT@extra@context{##1}}}% +} +%</package> +% \end{macrocode} +% Automatically enable font copying if we find a protrusion or expansion context. +% After the preamble, check whether font copying is enabled. +% For older \pdftex\ versions, disallow. +%\changes{v2.5}{2010/02/27}{allow contexts for \luatex} +% It also works with \luatex\ 0.30 or newer. +% \begin{macrocode} +%<*pdftex-def|luatex-def> +%<pdftex-def>\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 + }% + } +%</pdftex-def|luatex-def> +%<*pdftex-def> +}{ + \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.}% + } +%</pdftex-def> +%<*pdftex-def|xetex-def> + \define@key{MT@pr@c}{context}[]{% + \MT@error{Protrusion contexts only work with pdftex +%<pdftex-def> 1.40.4\MessageBreak or later. +%<xetex-def> \MessageBreak or luatex. + Ignoring `context' key\on@line}% +%<pdftex-def> {Upgrade pdftex.}% +%<xetex-def> {Use pdftex or luatex.}% + } +%</pdftex-def|xetex-def> +%<pdftex-def>} +% \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}% +} +%</package> +% \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} +%<*pdftex-def|xetex-def|luatex-def> +\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}}% + }% +} +%</pdftex-def|xetex-def|luatex-def> +% \end{macrocode} +% Tracking may only be relative to a dimension. +% \begin{macrocode} +%<*pdftex-def|luatex-def> +\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}}% +} +%</pdftex-def|luatex-def> +% \end{macrocode} +% Spacing and kerning codes may additionally be relative to space dimensions. +% \begin{macrocode} +%<*pdftex-def> +\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}}% + }% + }% + }% +} +%</pdftex-def> +% \end{macrocode} +% The first argument to \cs{SetExpansion} accepts some more options. +% \begin{macrocode} +%<*pdftex-def|luatex-def> +\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} +%<*pdftex-def> + \MT@requires@pdftex4{% + \MT@gdef@n{MT@ex@c@\MT@curr@set@name @auto}{autoexpand}% + }{% + \MT@warning{pdftex too old for automatic font expansion}% + } +%</pdftex-def> + \else +%<*pdftex-def> + \MT@requires@pdftex4{% + \MT@glet@nc{MT@ex@c@\MT@curr@set@name @auto}\@empty + }\relax +%</pdftex-def> +%<*luatex-def> + \MT@warning{Non-automatic font expansion doesn't work with\MessageBreak + luatex}% +%</luatex-def> + \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}}} +%</pdftex-def|luatex-def> +% \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} +% 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} +% Safe category codes. +% \begin{macrocode} +\def\MT@set@inh@list#1#2{% + \MT@ifempty\MT@inh@feat{% + \MT@map@clist@c\MT@features{{\MT@declare@char@inh{##1}{#1}{#2}}}% + }{% + \MT@map@clist@c\MT@inh@feat{{% + \KV@@sp@def\@tempa{##1}% + \MT@ifempty\@tempa\relax{% + \MT@exp@one@n\MT@declare@char@inh + {\csname MT@rbba@\@tempa\endcsname}{#1}{#2}% + }% + }}% + }% + \MT@end@catcodes +} +% \end{macrocode} +%\changes{v1.9f}{2006/08/09}{fix: forgotten comma in the features list} +%\end{macro} +% The keys for the optional argument. +% \begin{macrocode} +\MT@map@clist@c\MT@features@long{% + \define@key{MT@inh@}{#1}[]{\edef\MT@inh@feat{\MT@inh@feat#1,}}} +\define@key{MT@inh@}{inputenc}{\def\MT@extra@inputenc{#1}} +% \end{macrocode} +%\begin{macro}{\MT@declare@char@inh} +%\todo{share one list between features} +% The lists cannot be given a name by the user. +% \begin{macrocode} +\def\MT@declare@char@inh#1#2#3{% + \MT@edef@n{MT@#1@inh@name}% + {\MT@curr@file/\the\inputlineno (\@nameuse{MT@abbr@#1})}% + \MT@let@cn\MT@curr@set@name{MT@#1@inh@name}% + \MT@ifdefined@c@T\MT@extra@inputenc{% + \MT@xdef@n{MT@#1@inh@\MT@curr@set@name @inputenc}{\MT@extra@inputenc}}% +%<debug>\MT@dinfo{1}{creating inheritance list `\@nameuse{MT@#1@inh@name}'}% + \MT@gdef@n{MT@#1@inh@\csname MT@#1@inh@name\endcsname}{#3}% + \def\MT@permutelist{#1@inh}% + \setkeys{MT@inh}{#2}% + \MT@permute +} +% \end{macrocode} +%\end{macro} +% Parse the second argument. \cs{DeclareCharacterInheritance} may also be set +% up for various combinations. +% We can reuse the key setup from the configuration lists +% (|\Set...|). +% \begin{macrocode} +\MT@define@code@key{encoding}{inh} +\MT@define@code@key@family {inh} +\MT@define@code@key{series} {inh} +\MT@define@code@key{shape} {inh} +\MT@define@code@key@size {inh} +\MT@define@code@key@font {inh} +% \end{macrocode} +%\begin{macro}{\MT@inh@do} +% Now parse the third argument, the inheritance lists. We define the commands +% |\MT@inh@|\meta{name}|@|\meta{slot}|@|, containing the inheriting characters. +% They will also be translated to slot numbers here, to save some time. The +% following will be executed only once, namely the first time this inheritance +% list is encountered (in |\MT@set@|\meta{feature}|@codes|). +% \begin{macrocode} +\def\MT@inh@do#1,{% + \ifx\relax#1\@empty \else + \MT@inh@split #1==\relax + \expandafter\MT@inh@do + \fi +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\MT@inh@split} +% Only gather the inheriting characters here. Their codes will actually be set +% in |\MT@set@|\meta{feature}|@codes|. +% \begin{macrocode} +%</package> +%<*pdftex-def|xetex-def|luatex-def> +\def\MT@inh@split#1=#2=#3\relax{% + \def\@tempa{#1}% + \ifx\@tempa\@empty \else + \MT@get@slot +%<pdftex-def|luatex-def> \ifnum\MT@char > \m@ne +%<xetex-def> \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 +%<pdftex-def|luatex-def> \ifnum\MT@char > \m@ne +%<xetex-def> \ifx\MT@char\@empty\else + \MT@exp@cs\MT@xadd{MT@inh@\MT@listname @\MT@val @}{{\MT@char}}% + \fi + \fi + }% +%<debug>\MT@dinfo@nl{2}{children of #1 (\MT@val): +%<debug> \@nameuse{MT@inh@\MT@listname @\MT@val @}}% + \fi + \fi +} +%</pdftex-def|xetex-def|luatex-def> +% \end{macrocode} +%\end{macro} +% +%\subsubsection{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. +% \begin{macrocode} +%<*package> +\def\MT@permute{% + \let\MT@cnt@encoding\@ne + \MT@permute@ +% \end{macrocode} +% Undefine commands for the next round. +% \begin{macrocode} + \MT@map@tlist@n{{encoding}{family}{series}{shape}}\MT@permute@reset + \MT@glet\MT@tempsize\@undefined +} +\def\MT@permute@{% + \let\MT@cnt@family\@ne + \MT@permute@@ + \MT@increment\MT@cnt@encoding + \MT@ifdefined@n@T{MT@tempencoding\MT@cnt@encoding}% + \MT@permute@ +} +\def\MT@permute@@{% + \let\MT@cnt@series\@ne + \MT@permute@@@ + \MT@increment\MT@cnt@family + \MT@ifdefined@n@T{MT@tempfamily\MT@cnt@family}% + \MT@permute@@ +} +\def\MT@permute@@@{% + \let\MT@cnt@shape\@ne + \MT@permute@@@@ + \MT@increment\MT@cnt@series + \MT@ifdefined@n@T{MT@tempseries\MT@cnt@series}% + \MT@permute@@@ +} +\def\MT@permute@@@@{% + \MT@permute@@@@@ + \MT@increment\MT@cnt@shape + \MT@ifdefined@n@T{MT@tempshape\MT@cnt@shape}% + \MT@permute@@@@ +} +% \end{macrocode} +%\end{macro} +%\end{macro} +%\end{macro} +%\end{macro} +%\end{macro} +%\begin{macro}{\MT@permute@@@@@} +%\changes{v1.9a}{2005/12/05}{don't define permutations for unused encodings} +% In order to save some memory, we can ignore unused encodings (inside the +% document). +% \begin{macrocode} +\def\MT@permute@@@@@{% + \MT@permute@define{encoding}% + \ifMT@document + \ifx\MT@tempencoding\@empty \else + \MT@ifdefined@n@TF{T@\MT@tempencoding}\relax + {\expandafter\expandafter\expandafter\@gobble}% + \fi + \fi + \MT@permute@@@@@@ +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\MT@permute@@@@@@} +% \begin{macrocode} +\def\MT@permute@@@@@@{% + \MT@permute@define{family}% + \MT@permute@define{series}% + \MT@permute@define{shape}% + \edef\@tempa{\MT@tempencoding + /\MT@tempfamily + /\MT@tempseries + /\MT@tempshape + /\MT@ifdefined@c@T\MT@tempsize *}% +% \end{macrocode} +%\changes{v1.2}{2004/09/29}{more sanity checks for \cs{SetProtrusion} and +% \cs{SetExpansion}} +% Some sanity checks: an encoding must be specified (unless nothing else is). +% \begin{macrocode} + \MT@ifstreq\@tempa{////}\relax{% + \ifx\MT@tempencoding\@empty + \MT@warning{% + You have to specify an encoding for\MessageBreak + \@nameuse{MT@abbr@\MT@permutelist} list + `\@nameuse{MT@\MT@permutelist @name}'.\MessageBreak + Ignoring it}% + \else + \MT@ifdefined@c@TF\MT@tempsize{% +% \end{macrocode} +% Add the list of ranges to the beginning of the current combination, after +% checking for conflicts. +%\changes{v1.8}{2005/04/20}{add ranges to the beginning of the lists} +% \begin{macrocode} + \MT@ifdefined@n@T{MT@\MT@permutelist @\@tempa\MT@extra@context @sizes}{% + \MT@map@tlist@c\MT@tempsize\MT@check@rlist + }% + \MT@exp@cs\MT@xaddb + {MT@\MT@permutelist @\@tempa\MT@extra@context @sizes}% + \MT@tempsize +%<debug>\MT@dinfo@nl{1}{initialising: use list for font \@tempa,\MessageBreak +%<debug> sizes: \csname MT@\MT@permutelist @\@tempa\MT@extra@context +%<debug> @sizes\endcsname}% + }{% +% \end{macrocode} +% Only one list can apply to a given combination. +%\changes{v2.7}{2017/07/07}{don't warn for override if conflicting list is loaded} +% But we don't warn if the overridden list is to be loaded by the current one. +% \begin{macrocode} + \MT@ifdefined@n@T{MT@\MT@permutelist @\@tempa\MT@extra@context}{% + \MT@ifstreq{\csname MT@\MT@permutelist @\@tempa\MT@extra@context\endcsname}% + {\csname MT@\MT@permutelist @\csname MT@\MT@permutelist @name\endcsname @load\endcsname}% + \relax{% + \MT@warning{\@nameuse{MT@abbr@\MT@permutelist} list + `\@nameuse{MT@\MT@permutelist @name}' will\MessageBreak override + list `\@nameuse{MT@\MT@permutelist @\@tempa\MT@extra@context}' + for \MessageBreak font `\@tempa'}% + }% + }% +%<debug>\MT@dinfo@nl{1}{initialising: use list for font \@tempa +%<debug> \ifx\MT@extra@context\@empty\else\MessageBreak +%<debug> (context: \MT@extra@context)\fi}% + }% + \MT@xdef@n{MT@\MT@permutelist @\@tempa\MT@extra@context}% + {\csname MT@\MT@permutelist @name\endcsname}% + \fi + }% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\MT@permute@define} +% Define the commands. +% \begin{macrocode} +\def\MT@permute@define#1{% + \@tempcnta=\csname MT@cnt@#1\endcsname\relax + \MT@ifdefined@n@TF{MT@temp#1\the\@tempcnta}% + {\MT@edef@n{MT@temp#1}{\csname MT@temp#1\the\@tempcnta\endcsname}}% + {\MT@let@nc{MT@temp#1}\@empty}% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\MT@permute@reset} +% Reset the commands. +% \begin{macrocode} +\def\MT@permute@reset#1{% + \@tempcnta=\@ne + \MT@loop + \MT@let@nc{MT@temp#1\the\@tempcnta}\@undefined + \advance\@tempcnta\@ne + \MT@ifdefined@n@TF{MT@temp#1\the\@tempcnta}% + \iftrue + \iffalse + \MT@repeat +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\MT@check@rlist} +%\changes{v1.8}{2005/04/20}{made recursive} +% For every new range item in \cs{MT@tempsize}, check whether it overlaps with +% ranges in the existing list. +% \begin{macrocode} +\def\MT@check@rlist#1{\expandafter\MT@check@rlist@ #1} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\MT@check@rlist@} +% Define the current new range and~\dots +% \begin{macrocode} +\def\MT@check@rlist@#1#2#3{% + \def\@tempb{#1}% + \def\@tempc{#2}% + \MT@if@false + \MT@exp@cs\MT@map@tlist@c + {MT@\MT@permutelist @\@tempa\MT@extra@context @sizes}% + \MT@check@range +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\MT@check@range} +% \dots~recurse through the list of existing ranges. +% \begin{macrocode} +\def\MT@check@range#1{\expandafter\MT@check@range@ #1} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\MT@check@range@} +% \cmd\@tempb\ and \cmd\@tempc\ are lower resp. upper bound of the new range, +% \meta{\#1} and \meta{\#2} those of the existing range. \meta{\#3} is the list name. +%\changes{v2.7}{2017/07/07}{don't warn for override if conflicting list is loaded} +% \begin{macrocode} +\def\MT@check@range@#1#2#3{% + \MT@ifdim{#2}=\m@ne{% + \MT@ifdim\@tempc=\m@ne{% +% \end{macrocode} +%\begin{itemize} +% \item Both items are simple sizes. +% \begin{macrocode} + \MT@ifdim\@tempb={#1}\MT@if@true\relax + }{% +% \end{macrocode} +% \item Item in list is a simple size, new item is a range. +% \begin{macrocode} + \MT@ifdim\@tempb>{#1}\relax{% + \MT@ifdim\@tempc>{#1}{% + \MT@if@true + \edef\@tempb{#1 (with range: \@tempb\space to \@tempc)}% + }\relax + }% + }% + }{% + \MT@ifdim\@tempc=\m@ne{% +% \end{macrocode} +% \item Item in list is a range, new item is a simple size. +% \begin{macrocode} + \MT@ifdim\@tempb<{#2}{% + \MT@ifdim\@tempb<{#1}\relax\MT@if@true + }\relax + }{% +% \end{macrocode} +% \item Both items are ranges. +% \begin{macrocode} + \MT@ifdim\@tempb<{#2}{% + \MT@ifdim\@tempc>{#1}{% + \MT@if@true + \edef\@tempb{#1 to #2 (with range: \@tempb\space to \@tempc)}% + }\relax + }\relax + }% + }% + \ifMT@if@ + \MT@ifstreq{#3}% + {\csname MT@\MT@permutelist @\csname MT@\MT@permutelist @name\endcsname @load\endcsname}% + \relax{% + \MT@warning{\@nameuse{MT@abbr@\MT@permutelist} list + `\@nameuse{MT@\MT@permutelist @name}' will override\MessageBreak + list `#3' for font \@tempa,\MessageBreak size \@tempb}% + }% +% \end{macrocode} +% If we've already found a conflict with this item, we can skip the rest of the +% list. +% \begin{macrocode} + \expandafter\MT@tlist@break + \fi +} +% \end{macrocode} +%\end{itemize} +%\end{macro} +% +%\subsection{Package options} +% +%\subsubsection{Declaring the options} +% +%\begin{macro}{\ifMT@opt@expansion} +%\begin{macro}{\ifMT@opt@auto} +%\begin{macro}{\ifMT@opt@DVI} +% Keep track of whether the user explicitly set these options. +% \begin{macrocode} +\newif\ifMT@opt@expansion +\newif\ifMT@opt@auto +\newif\ifMT@opt@DVI +% \end{macrocode} +%\end{macro} +%\end{macro} +%\end{macro} +%\begin{macro}{\MT@optwarn@admissible} +% Some warnings. +% \begin{macrocode} +\def\MT@optwarn@admissible#1#2{% + \MT@warning@nl{`#1' is not an admissible value for option\MessageBreak + `#2'. Assuming `false'}% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\MT@optwarn@nan} +% \begin{macrocode} +%</package> +%<*package|letterspace> +%<plain>\MT@requires@latex1{ +\def\MT@optwarn@nan#1#2{% + \MT@warning@nl{Value `#1' for option `#2' is not a\MessageBreak number. + Using default value of \number\@nameuse{MT@#2@default}}% +} +%<plain>}\relax +%</package|letterspace> +%<*package> +% \end{macrocode} +%\end{macro} +%\begin{macro}{\MT@opt@def@set} +% \begin{macrocode} +\def\MT@opt@def@set#1{% + \MT@ifdefined@n@TF{MT@\@tempb @set@@\MT@val}{% + \MT@xdef@n{MT@\@tempb @setname}{\MT@val}% + }{% + \MT@xdef@n{MT@\@tempb @setname}{\@nameuse{MT@default@\@tempb @set}}% + \MT@warning@nl{The #1 set `\MT@val' is undeclared.\MessageBreak + Using set `\@nameuse{MT@\@tempb @setname}' instead}% + }% +} +% \end{macrocode} +%\end{macro} +% \opt{expansion} and \opt{protrusion} may be |true|, |false|, |compatibility|, +% |nocompatibility| and/or a \meta{set name}. +%\changes{v1.9}{2005/10/06}{fix: use \texttt{true} as the default value} +% \begin{macrocode} +\MT@map@clist@n{protrusion,expansion}{% + \define@key{MT}{#1}[true]{% + \csname MT@opt@#1true\endcsname + \MT@map@clist@n{##1}{% + \KV@@sp@def\MT@val{####1}% + \MT@ifempty\MT@val\relax{% + \csname MT@#1true\endcsname + \edef\@tempb{\csname MT@rbba@#1\endcsname}% + \MT@ifstreq\MT@val{true}\relax + {% + \MT@ifstreq\MT@val{false}{% + \csname MT@#1false\endcsname + }{% + \MT@ifstreq\MT@val{compatibility}{% + \MT@let@nc{MT@\@tempb @level}\@ne + }{% + \MT@ifstreq\MT@val{nocompatibility}{% + \MT@let@nc{MT@\@tempb @level}\tw@ + }{% +% \end{macrocode} +% If everything failed, it should be a set name. +% \begin{macrocode} + \MT@opt@def@set{#1}% + }% + }% + }% + }% + }% + }% + }% +} +% \end{macrocode} +% \opt{activate} is a shortcut for \opt{protrusion} and \opt{expansion}. +%\changes{v1.9e}{2006/07/18}{fix: default value for \opt{activate}: \texttt{true}} +%\todo{add \opt{spacing} to \opt{activate}, when the feature has stabilised in \pdftex?} ^^A probably won't happen ... +% \begin{macrocode} +\define@key{MT}{activate}[true]{% + \setkeys{MT}{protrusion={#1}}% + \setkeys{MT}{expansion={#1}}% +} +% \end{macrocode} +% \opt{spacing}, \opt{kerning} and \opt{tracking} do not have a compatibility level. +% \begin{macrocode} +\MT@map@clist@n{spacing,kerning,tracking}{% + \define@key{MT}{#1}[true]{% + \MT@map@clist@n{##1}{% + \KV@@sp@def\MT@val{####1}% + \MT@ifempty\MT@val\relax{% + \csname MT@#1true\endcsname + \MT@ifstreq\MT@val{true}\relax + {% + \MT@ifstreq\MT@val{false}{% + \csname MT@#1false\endcsname + }{% + \edef\@tempb{\csname MT@rbba@#1\endcsname}% + \MT@opt@def@set{#1}% + }% + }% + }% + }% + }% +} +% \end{macrocode} +%\changes{v1.5}{2004/12/02}{new option: \opt{selected}, by default false +% (suggested by \contributor H\`an \thanhthe{} Th\`anh <hanthethanh\at gmx.net>)} +% ^^A private mail, 2004/11/30 +%\changes{v2.0}{2005/10/04}{new option: \opt{babel}, by default false +% (language-dependent setup suggested by \contributor Ulrich Dirr <ud\at art-satz.de>)} +% ^^A private mail, 2005/08/27 +% ^^A (beta:1) +%\begin{macro}{\MT@def@bool@opt} +% The |true|/|false| options: +% \opt{draft}, \opt{final} (may be inherited from the class options), +% \opt{auto}, +% \opt{selected}, +% \opt{babel}, +% \opt{DVIoutput}, +% \opt{defersetup}, +% \opt{copyfonts}. +% \begin{macrocode} +\def\MT@def@bool@opt#1#2{% + \define@key{MT}{#1}[true]{% + \def\@tempa{##1}% + \MT@ifstreq\@tempa{true}\relax{% + \MT@ifstreq\@tempa{false}\relax{% + \MT@optwarn@admissible{##1}{#1}% + \def\@tempa{false}% + }% + }% + #2% + }% +} +% \end{macrocode} +%\end{macro} +% Boolean options that only set the switch. +% \begin{macrocode} +\MT@map@clist@n{draft,selected,babel}{% + \MT@def@bool@opt{#1}{\csname MT@#1\@tempa\endcsname}} +\MT@def@bool@opt{auto}{\csname MT@auto\@tempa\endcsname \MT@opt@autotrue} +% \end{macrocode} +% The \opt{DVIoutput} option will change \cmd\pdfoutput\ immediately to minimise +% the risk of confusing other packages. +%\changes{v2.5}{2010/09/17}{disable `\opt{DVIoutput}' option for \xetex} ^^A (beta:03) +% \begin{macrocode} +%</package> +%<*pdftex-def|luatex-def|xetex-def> +%<luatex-def>\MT@requires@luatex4{\let\pdfoutput\outputmode}\relax +\MT@def@bool@opt{DVIoutput}{% + \csname if\@tempa\endcsname +%<*pdftex-def|luatex-def> + \ifnum\pdfoutput>\z@ \MT@opt@DVItrue \fi + \pdfoutput\z@ + \else + \ifnum\pdfoutput<\@ne \MT@opt@DVItrue \fi + \pdfoutput\@ne +%</pdftex-def|luatex-def> +%<xetex-def> \MT@warning@nl{Ignoring `DVIoutput' option}% + \fi +} +%</pdftex-def|luatex-def|xetex-def> +% \end{macrocode} +%\changes{v1.9a}{2005/11/21}{new option: \opt{defersetup}, by default true} +% Setting the \opt{defersetup} option to false will restore the old behaviour, +% where the setup took place at the time when the package was loaded. This is +% \emph{undocumented}, since I would like to learn about the cases where this is +% necessary. +% +% The only problem with the new deferred setup I can think of is when a box +% is being constructed inside the preamble and this box contains a font that is +% not loaded before the box is being used. +% \begin{macrocode} +%<*package> +\MT@def@bool@opt{defersetup}{% + \csname if\@tempa\endcsname \else + \AtEndOfPackage{% + \MT@setup@ + \let\MT@setup@\@empty + \let\MT@addto@setup\@firstofone + }% + \fi +} +%</package> +% \end{macrocode} +% \opt{copyfonts} will copy all fonts before setting them up. This allows +% protrusion and expansion with different parameters. +%\changes{v2.2}{2007/07/03}{new option: \opt{copyfonts}} +% This options is also \emph{undocumented} in the hope that we can always find +% out automatically whether it's required. +% It also works with \luatex\ 0.30 or newer. +% \begin{macrocode} +%<*pdftex-def|luatex-def> +%<pdftex-def>\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 + } +%<pdftex-def>}{ +%</pdftex-def|luatex-def> +%<*pdftex-def|xetex-def> + \MT@def@bool@opt{copyfonts}{% + \csname if\@tempa\endcsname + \MT@error +%<pdftex-def> {The pdftex version you are using is too old\MessageBreak +%<pdftex-def> to use the `copyfonts' option}{Upgrade pdftex.}% +%<xetex-def> {The `copyfonts' option does not work with xetex} +%<xetex-def> {Use pdftex or luatex instead.}% + \fi + } +%<pdftex-def>} +%</pdftex-def|xetex-def> +% \end{macrocode} +% \opt{final} is the opposite to \opt{draft}. +%\changes{v1.4a}{2004/11/16}{new option: \opt{final}} +% \begin{macrocode} +%<*package> +\MT@def@bool@opt{final}{% + \csname if\@tempa\endcsname + \MT@draftfalse + \else + \MT@drafttrue + \fi +} +% \end{macrocode} +% For \opt{verbose} output, we redefine \cs{MT@vinfo}. +%\changes{v2.3}{2007/11/05}{turned some warnings into errors} +% \begin{macrocode} +\define@key{MT}{verbose}[true]{% + \let\MT@vinfo\MT@info@nl + \def\@tempa{#1}% + \MT@ifstreq\@tempa{true}\relax{% +% \end{macrocode} +%\changes{v1.7}{2005/03/16}{new value for \opt{verbose} option: \texttt{errors}} +% Take problems seriously. +% \begin{macrocode} + \MT@ifstreq\@tempa{errors}{% + \let\MT@warning \MT@warn@err + \let\MT@warning@nl\MT@warn@err + }{% + \let\MT@vinfo\@gobble +% \end{macrocode} +%\changes{v2.3}{2007/11/05}{new value for \opt{verbose} option: \texttt{silent} +% (suggested by \contributor Karl Berry <karl\at freefriends.org>)} +% ^^A private mail, 2007/11/05 +% Cast warnings to the winds. +% \begin{macrocode} + \MT@ifstreq\@tempa{silent}{% + \let\MT@warning \MT@info + \let\MT@warning@nl\MT@info@nl + }{% + \MT@ifstreq\@tempa{false}\relax{\MT@optwarn@admissible{#1}{verbose}}% + }% + }% + }% +} +%</package> +% \end{macrocode} +%\changes{v1.5}{2004/12/02}{defaults: \opt{step}: 4 +% (suggested by \contributor H\`an \thanhthe{} Th\`anh <hanthethanh\at gmx.net>)} +% ^^A private mail, 2004/11/30 +%\changes{v1.6}{2004/12/18}{new option: \opt{factor}, by default 1000} +%\changes{v2.0}{2005/09/21}{new option: \opt{letterspace}, by default 100} ^^A (beta:1) +%^^A\changes{v2.0}{2007/01/05}{option `\texttt{letterspacing}' renamed to `\opt{letterspace}'} +% Options with numerical keys: +% \opt{factor}, +% \opt{stretch}, +% \opt{shrink}, +% \opt{step}, +% \opt{letterspace}. +% \begin{macrocode} +%<*package|letterspace> +%<plain>\MT@requires@latex1{ +\MT@map@clist@n{% +%<package> stretch,shrink,step,% + letterspace}{% + \define@key{MT}{#1}[\csname MT@#1@default\endcsname]{% + \def\@tempa{##1 }% +% \end{macrocode} +% No nonsense in \cs{MT@factor} et al.? +%\changes{v1.6}{2005/01/06}{test whether numeric options receive a number} +% A space terminates the number. +% \begin{macrocode} + \MT@ifint\@tempa + {\MT@edef@n{MT@#1}{\@tempa}}% + {\MT@optwarn@nan{##1}{#1}}% + }% +} +%<plain>}\relax +%</package|letterspace> +% \end{macrocode} +% \opt{factor} will define the protrusion factor only. +% \begin{macrocode} +%<*package> +\define@key{MT}{factor}[\MT@factor@default]{% + \def\@tempa{#1 }% + \MT@ifint\@tempa + {\edef\MT@pr@factor{\@tempa}} + {\MT@optwarn@nan{#1}{factor}}% +} +% \end{macrocode} +% Unit for protrusion codes. +%\changes{v1.8}{2005/04/14}{new option: \opt{unit}, by default \texttt{character}} +%\changes{v1.9}{2005/09/28}{option \opt{unit}: rename value \texttt{relative} to \texttt{character}} +% \begin{macrocode} +\define@key{MT}{unit}[character]{% + \def\@tempa{#1}% + \MT@ifstreq\@tempa{character}\relax{% + \MT@ifdimen\@tempa + {\let\MT@pr@unit\@tempa}% + {\MT@warning@nl{`\@tempa' is not a dimension.\MessageBreak + Ignoring it and setting values relative to\MessageBreak + character widths}}% + }% +} +% \end{macrocode} +% +%\subsubsection{Loading the definition file} +% +%\begin{macro}{\MT@endinput} +% Abort if no capable engine found. +% \begin{macrocode} +\let\MT@endinput\relax +% \end{macrocode} +%\end{macro} +% \begin{macrocode} +\ifx\MT@engine\relax + \MT@warning@nl{You don't seem to be using pdftex, luatex or xetex.\MessageBreak + `\MT@MT' only works with these engines.\MessageBreak + I will quit now} + \MT@clear@options +\else +% \end{macrocode} +% Otherwise load the engine-specific code (as strewn across this file). +% \begin{macrocode} + \input{microtype-\MT@engine tex.def} +\fi +\MT@endinput +% \end{macrocode} +% +% \subsubsection{Reading the configuration file} +% +% The package should just work if called without any options. Therefore, +% expansion will be switched off by default if output is <DVI>, since it isn't +% likely that expanded fonts are available. (This grows more important as +% modern \TeX\ systems have switched to the \pdftex\ engine even for <DVI> +% output, so that the user might not even be aware of the fact that she's +% running \pdftex.) +% \begin{macrocode} +\MT@protrusiontrue +%</package> +%<*pdftex-def|luatex-def> +\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} +%<pdftex-def> \MT@requires@pdftex4{ + \MT@expansiontrue +%<pdftex-def> \MT@autotrue +%<pdftex-def> }\relax +\fi +%<luatex-def>\MT@autotrue +%</pdftex-def|luatex-def> +% \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} +%\begin{macro}{\MT@get@config} +% 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@get@config#1config=#2,#3\@nil{% + \MT@ifempty{#2}% + {\def\MT@config@file{\MT@MT.cfg}}% + {\def\MT@config@file{#2.cfg}}% +} +\expandafter\expandafter\expandafter\MT@get@config + \csname opt@\@currname.\@currext\endcsname,config=,\@nil +% \end{macrocode} +%\end{macro} +%\end{macro} +%\changes{v1.4b}{2004/11/25}{fix: set catcodes before reading global configuration file +% (reported by \contributor Christoph Bier <christoph.bier\at web.de>)} +% ^^A MID: <30k2tqF30v483U1@uni-berlin.de> +% Load the file. +% \begin{macrocode} +\IfFileExists{\MT@config@file}{% + \MT@info@nl{Loading configuration file \MT@config@file}% + \MT@begin@catcodes + \let\MT@begin@catcodes\relax + \let\MT@end@catcodes\relax + \let\MT@curr@file\MT@config@file + \input{\MT@config@file}% + \endgroup +}{\MT@warning@nl{% + Could not find configuration file `\MT@config@file'!\MessageBreak + This will almost certainly cause undesired results.\MessageBreak + Please fix your installation}% +} +% \end{macrocode} +%\begin{macro}{\MT@check@active@set} +% We have to make sure that font sets are active. If the user didn't activate +% any, we use those sets declared by \cs{DeclareMicrotypeSetDefault} (this +% is done at the end of the preamble). +% \begin{macrocode} +\def\MT@check@active@set#1{% + \MT@ifdefined@n@TF{MT@#1@setname}{% + \MT@info@nl{Using \@nameuse{MT@abbr@#1} set `\@nameuse{MT@#1@setname}'}% + }{% + \MT@ifdefined@n@TF{MT@default@#1@set}{% + \MT@glet@nn{MT@#1@setname}{MT@default@#1@set}% + \MT@info@nl{Using default \@nameuse{MT@abbr@#1} set `\@nameuse{MT@#1@setname}'}% + }{% +% \end{macrocode} +% If no default font set has been declared in the main configuration file, +% we use the (empty, non-existent) set `|@|', +%\changes{v2.3d}{2008/11/24}{warning for missing default sets} +% and issue a warning. +% \begin{macrocode} + \MT@gdef@n{MT@#1@setname}{@}% + \MT@warning@nl{No \@nameuse{MT@abbr@#1} set chosen, no default set declared. + \MessageBreak Using empty set}% + }% + }% +} +% \end{macrocode} +%\end{macro} +% +%\subsubsection{Hook for other packages}\label{sub:hook} +% +% {\let\special@index\index\SpecialIndex@{\Microtype@Hook}{\encapchar usage}} +%\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} +% \cs{MicroType@Hook} with a capital |T| (which only existed in version 1.7) is +% provided for compatibility reasons. At some point in the future, it will no +% longer be available, hence it should not be used. +% \begin{macrocode} +\MT@ifdefined@c@T\MicroType@Hook{\MT@warning{% + Command \string\MicroType@Hook\space is deprecated.\MessageBreak + Use \string\Microtype@Hook\space instead}\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|. +% Specifying font sets is not allowed. +% \begin{macrocode} +\def\microtypesetup{\setkeys{MT}} +\MT@addto@setup{\def\microtypesetup#1{\setkeys{MTX}{#1}\selectfont}} +%</package> +%<*pdftex-def|luatex-def|xetex-def> +\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 +%</pdftex-def|luatex-def|xetex-def> +%<*pdftex-def|luatex-def> +\MT@define@optionX{expansion}\MT@adjustspacing +% \end{macrocode} +%\begin{macro}{\MT@protrudechars} +%\begin{macro}{\MT@adjustspacing} +% \begin{macrocode} +%<*luatex-def> +\MT@requires@luatex4{ + \let\pdfprotrudechars\protrudechars + \let\pdfadjustspacing\adjustspacing +}\relax +%</luatex-def> +\let\MT@protrudechars\pdfprotrudechars +\let\MT@adjustspacing\pdfadjustspacing +%</pdftex-def|luatex-def> +%<*xetex-def> +\let\MT@protrudechars\XeTeXprotrudechars +\define@key{MTX}{expansion}[true]{\MT@warning{Ignoring expansion setup}} +%</xetex-def> +% \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} +%<*pdftex-def|luatex-def> +%<pdftex-def>\MT@requires@pdftex6{ +%<luatex-def>\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} +%<pdftex-def> \MT@define@optionX@{spacing}{\pdfadjustinterwordglue\@tempcnta} +%<pdftex-def> \MT@define@optionX@{kerning}{\pdfprependkern\@tempcnta +%<pdftex-def> \pdfappendkern\@tempcnta} +}{ +%</pdftex-def|luatex-def> +%<*pdftex-def|luatex-def|xetex-def> +% \end{macrocode} +% Disable for older \pdftex\ versions and for \xetex\ and \luatex. +% \begin{macrocode} +\define@key{MTX}{tracking}[true]{\MT@warning{Ignoring tracking setup}} +%<luatex-def>} +\define@key{MTX}{kerning}[true]{\MT@warning{Ignoring kerning setup}} +\define@key{MTX}{spacing}[true]{\MT@warning{Ignoring spacing setup}} +%<pdftex-def>} +\define@key{MTX}{activate}[true]{% + \setkeys{MTX}{protrusion={#1}}% +%<pdftex-def|luatex-def> \setkeys{MTX}{expansion={#1}}% +} +%</pdftex-def|luatex-def|xetex-def> +% \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. This is \emph{undocumented}, as it completely +% deprives 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}{disable}[]{% + \MT@info{Inactivate `\MT@MT' package}% + \let\MT@setupfont\relax +} +\define@key{MTX}{enable}[]{% + \MT@info{Reactivate `\MT@MT' package}% + \let\MT@setupfont\MT@saved@setupfont +} +%</package> +% \end{macrocode} +% +%\subsubsection{Processing the options}\label{sssec:impl.options} +% +%\begin{macro}{\MT@ProcessOptionsWithKV} +% Parse options. +% \begin{macrocode} +%<*package|letterspace> +%<plain>\MT@requires@latex1{ +\def\MT@ProcessOptionsWithKV#1{% + \let\@tempc\relax + \let\MT@temp\@empty +%<plain> \MT@requires@latex2{ + \MT@map@clist@c\@classoptionslist{% + \def\CurrentOption{##1}% + \MT@ifdefined@n@T{KV@#1@\expandafter\MT@getkey\CurrentOption=\@nil}{% + \edef\MT@temp{\MT@temp,\CurrentOption,}% + \@expandtwoargs\@removeelement\CurrentOption + \@unusedoptionlist\@unusedoptionlist + }% + }% + \edef\MT@temp{\noexpand\setkeys{#1}% + {\MT@temp\@ptionlist{\@currname.\@currext}}}% +% \end{macrocode} +% \pkg{eplain} can handle package options. +% \begin{macrocode} +%<*plain> + }{\edef\MT@temp{\noexpand\setkeys{#1}% + {\csname usepkg@options@\usepkg@pkg\endcsname}}} +%</plain> + \MT@temp + \MT@clear@options +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\MT@getkey} +% For |key=val| in class options. +%\changes{v2.3a}{2008/02/09}{fix: \texttt{key\quotechar=val} in class options list} +% \begin{macrocode} +\def\MT@getkey#1=#2\@nil{#1} +% \end{macrocode} +%\end{macro} +% \begin{macrocode} +\MT@ProcessOptionsWithKV{MT} +%<plain>}\relax +%</package|letterspace> +%<*package> +% \end{macrocode} +% Now we can take the appropriate actions. We also tell the log file which +% options the user has chosen (in case it's interested). +% \begin{macrocode} +\MT@addto@setup{% +\ifMT@draft +% \end{macrocode} +% We disable most of what we've just defined in the \arabic{CodelineNo} lines +% above if we are running in draft mode. +%\changes{v1.7}{2005/02/06}{warning when running in draft mode} +% \begin{macrocode} + \MT@warning@nl{`draft' option active.\MessageBreak + Disabling all micro-typographic extensions.\MessageBreak + This might lead to different line and page breaks}% + \let\MT@setupfont\relax + \renewcommand*\LoadMicrotypeFile[1]{}% + \renewcommand*\microtypesetup[1]{}% + \renewcommand*\microtypecontext[1]{}% + \renewcommand*\lsstyle{}% +\else + \MT@setup@PDF + \MT@setup@copies +% \end{macrocode} +% Fix the font sets. +% \begin{macrocode} + \MT@map@tlist@c\MT@font@sets\MT@fix@font@set + \MT@setup@protrusion + \MT@setup@expansion + \MT@setup@tracking + \MT@setup@warntracking + \MT@setup@spacing + \MT@setup@kerning + \MT@setup@noligatures +} +%</package> +% \end{macrocode} +%\begin{macro}{\MT@setup@PDF} +% \pdftex\ can create <DVI> output, too. However, both the <DVI> viewer and +% |dvips| need to find actual fonts. Therefore, expansion will only work if the +% fonts for different degrees of expansion are readily available. +% +%\changes{v1.4b}{2004/11/19}{new message if \cmd\pdfoutput\ is changed} +% Some packages depend on the value of \cmd\pdfoutput\ and will get confused if +% it is changed after they have been loaded. These packages are, among others: +% \pkg{color}, \pkg{graphics}, \pkg{hyperref}, \pkg{crop}, \pkg{contour}, +% \pkg{pstricks} and, as a matter of course, \pkg{ifpdf}. Instead of testing +% for each package (that's not our job), we only say that it was \microtype\ +% that changed it. This must be sufficient! +% \begin{macrocode} +%<*pdftex-def|luatex-def> +\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 +} +%</pdftex-def|luatex-def> +%<*xetex-def> +\let\MT@setup@PDF\relax +\let\MT@setup@copies\relax +%</xetex-def> +% \end{macrocode} +%\end{macro} +%\begin{macro}{\MT@setup@protrusion} +% Protrusion. +% \begin{macrocode} +%<*pdftex-def|xetex-def|luatex-def> +\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 +} +%</pdftex-def|xetex-def|luatex-def> +% \end{macrocode} +%\end{macro} +%\begin{macro}{\MT@setup@expansion} +% For <DVI> output, the user must have explicitly passed the \opt{expansion} +% option to the package. +%\changes{v1.5}{2004/12/02}{defaults: turn off expansion for <DVI> output} +% \begin{macrocode} +%<*pdftex-def|luatex-def> +\def\MT@setup@expansion{% + \ifnum\pdfoutput<\@ne + \ifMT@opt@expansion \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 +%<pdftex-def> \MT@requires@pdftex6{% + \def\MT@step{1 }% +%<*pdftex-def> + }{% + \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}% + }% +%</pdftex-def> + \fi + \ifnum\MT@step=\z@ + \MT@warning@nl{The expansion step cannot be set to zero.\MessageBreak + Setting it to one}% + \def\MT@step{1 }% + \fi +% \end{macrocode} +%\begin{macro}{\MT@auto} +% Automatic expansion of the font? This new feature of \pdftex\ 1.20 makes the +% \textit{\fontfamily{pzc}\selectfont hz}~programme really usable. +% It must be either `|autoexpand|' or empty (or `|1000|' for older versions of +% \pdftex). +%\changes{v2.7a}{2017/07/18}{with \luatex, non-automatic font expansion is no longer possible +% (as confirmed by \contributor Hans Hagen <pragma\at wxs.nl>)} +% ^^A http://tug.org/pipermail/luatex/2017-July/006579.html and following +% With \luatex, we just leave it empty, as there's actually no difference -- +% non-automatic font expansion doesn't work anymore. +%\changes{v2.7a}{2017/11/01}{remove `\texttt{autoexpand}' for \luatex\ 1.0.6 +% (reported by \contributor Ulrike Fischer <news3\at nililand.de>)} +% ^^A private mail, 2017/10/29 +% In \luatex\ 1.0.6, the `|autoexpand|' option seems to have been removed altogether +% and would trigger an error. +% \begin{macrocode} +%<luatex-def> \let\MT@auto@\@empty +%<pdftex-def> \let\MT@auto\@empty + \ifMT@auto +% \end{macrocode} +%\end{macro} +% We turn off automatic expansion if output mode is <DVI> and we're running \pdftex. +%\changes{v1.5}{2004/12/02}{disable automatic expansion for <DVI> output} +%\changes{v2.7}{2017/07/02}{don't disable automatic expansion for <DVI> output with \luatex} +% \begin{macrocode} +%<*pdftex-def> + \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 }% + }% +%</pdftex-def> + \else +%<*pdftex-def> +% \end{macrocode} +% No automatic expansion. +% \begin{macrocode} + \MT@requires@pdftex4\relax{% + \def\MT@auto{1000 }% + }% +%</pdftex-def> +%<*luatex-def> + \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.}% + \fi +%</luatex-def> + \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} +%\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.) +% \begin{macrocode} + \CheckCommand*\showhyphens[1]{\setbox0\vbox{% + \color@begingroup\everypar{}\parfillskip\z@skip + \hsize\maxdimen\normalfont\pretolerance\m@ne\tolerance\m@ne + \hbadness\z@\showboxdepth\z@\ ##1\color@endgroup}}% +% \end{macrocode} +%\begin{macro}{\showhyphens} +% I wonder why it's defined globally (in \file{ltfssbas.dtx})? +% \begin{macrocode} + \gdef\showhyphens##1{\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 +} +%</pdftex-def|luatex-def> +%<*xetex-def> +\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 +} +%</xetex-def> +% \end{macrocode} +%\end{macro} +%\begin{macro}{\MT@setup@tracking} +% Tracking, spacing and kerning. +% \begin{macrocode} +%<*pdftex-def|luatex-def> +%<pdftex-def>\MT@requires@pdftex6{% +%<luatex-def>\MT@requires@luatex3{% + \def\MT@setup@tracking{% + \ifMT@tracking + \edef\MT@active@features{\MT@active@features,tr}% + \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 + } +%</pdftex-def|luatex-def> +% \end{macrocode} +%\end{macro} +%\begin{macro}{\MT@setup@spacing} +% \begin{macrocode} +%<*pdftex-def> + \def\MT@setup@spacing{% + \ifMT@spacing + \edef\MT@active@features{\MT@active@features,sp}% + \pdfadjustinterwordglue\@ne + \MT@info@nl{Adjustment of interword spacing enabled}% +% \end{macrocode} +%\changes{v2.5}{2011/11/29}{warning with \pkg{ragged2e} +% (reported by \contributor Steffen Hoffmann <speraviro-delenda\at expires-2011-11-30.arcornews.de>)} +% ^^A MID: <dctt-20353621.20111126$90.sph@virsperans.my-fqdn.de> +% ^^A (beta:09) +% The \pkg{ragged2e} package sets interword spaces to a fixed value without glue. +% \microtype's modifications can therefore have undesired effects. Therefore, +% we issue a warning. +% \begin{macrocode} + \MT@with@package@T{ragged2e}{% + \MT@warning@nl{You are using the `ragged2e' package.\MessageBreak + Adjustment of interword spacing may lead to\MessageBreak + undesired results when used with `ragged2e'.\MessageBreak + In this case, disable the `spacing' option}% + }% + \MT@check@active@set{sp}% + \else + \let\MT@spacing\relax + \MT@info@nl{No adjustment of interword spacing}% + \fi + } +% \end{macrocode} +%\end{macro} +%\begin{macro}{\MT@setup@spacing@check} +% Warning if \cmd\nonfrenchspacing\ is active, since space factors will be +% ignored with \cmd\pdfadjustinterwordglue\,|>|\,0. Why 1500? Because some +% packages redefine \cmd\frenchspacing.\footnote{ +% Cf. the \texttt{c.t.t.} thread `\cmd\frenchspacing\ with <AMS> packages +% and babel', started by Philipp Lehman on 16~August 2005, +% <MID>:~\nolinkurl{ddtbaj$rob$1@online.de}} +% \begin{macrocode} + \def\MT@setup@spacing@check{% + \ifMT@spacing + \ifMT@babel \else + \ifnum\sfcode`\. > 1500 + \MT@ifstreq\MT@sp@context{nonfrench}\relax{% + \MT@warning@nl{% + \string\nonfrenchspacing\space is active. Adjustment of\MessageBreak + interword spacing will disable it. You might want\MessageBreak + to add `\@backslashchar\MT@MT context{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 + } +%</pdftex-def> +% \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} +%<pdftex-def|luatex-def>}{ +%<*luatex-def> + \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 + } +} +%</luatex-def> +%<*pdftex-def|xetex-def|luatex-def> + \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} +%<pdftex-def> {Upgrade pdftex.}% +%<luatex-def|xetex-def> {Use pdftex instead.}% + \csname MT@#1false\endcsname + \MT@let@nc{MT@#1}\relax + \else + \MT@info@nl{No adjustment of #1% +%<pdftex-def> \space(pdftex too old)% + }% + \fi + } +%<pdftex-def|xetex-def> \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}} +%<pdftex-def>} +%</pdftex-def|xetex-def|luatex-def> +% \end{macrocode} +%\end{macro} +%\begin{macro}{\MT@setup@warntracking} +% \begin{macrocode} +%<letterspace>\MT@addto@setup +%<pdftex-def|luatex-def>\def\MT@setup@warntracking +% \end{macrocode} +%\begin{macro}{\MT@warn@tracking@DVI} +%\changes{v2.2}{2007/02/11}{warning when letterspacing in <DVI> mode} +%\changes{v2.7}{2017/07/06}{don't warn for letterspacing in <DVI> mode with \luatex} +% With \pdftex, we issue a warning, when letterspacing in <DVI> mode, since it will probably +% not work. We also switch on protrusion if it isn't already, to compensate for +% the letterspacing kerns. +% \begin{macrocode} +%<*pdftex-def|luatex-def|letterspace> +{% +%<*pdftex-def|letterspace> + \ifnum\pdfoutput<\@ne + \def\MT@warn@tracking@DVI{% +%<letterspace> \MT@pdf@or@lua{% + \MT@warning@nl{% + You are using tracking/letterspacing in DVI mode.\MessageBreak + This will probably not work, unless the post-\MessageBreak + processing program (dvips, dvipdfm(x), ...) is\MessageBreak + able to create the virtual fonts on the fly}% +%<letterspace> }\relax + \MT@glet\MT@warn@tracking@DVI\relax + }% + \else +%</pdftex-def|letterspace> + \def\MT@warn@tracking@DVI{% + \ifnum\pdfprotrudechars<\@ne \global\pdfprotrudechars\@ne \fi + \MT@glet\MT@warn@tracking@DVI\relax + }% +%<pdftex-def|letterspace> \fi +% \end{macrocode} +%\end{macro} +% \begin{macrocode} + \ifnum\MT@letterspace=\m@ne + \let\MT@letterspace\MT@letterspace@default + \else + \MT@ls@too@large\MT@letterspace + \fi +} +%</pdftex-def|luatex-def|letterspace> +%<xetex-def>\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} +%<*pdftex-def|luatex-def> +\def\MT@setup@noligatures{% +%<pdftex-def> \MT@requires@pdftex5{% + \ifMT@noligatures \else + \let\MT@noligatures\relax + \fi +%<pdftex-def> }\relax +} +%</pdftex-def|luatex-def> +%<xetex-def>\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 the language switching commands to enable language-dependent setup. +% \begin{macrocode} +\MT@addto@setup{% + \ifMT@babel + \@ifpackageloaded{babel}{% + \MT@info@nl{Redefining babel's language switching commands}% + \let\MT@orig@select@language\select@language + \def\select@language#1{% + \MT@orig@select@language{#1}% + \MT@set@babel@context{#1}% + }% + \let\MT@orig@foreign@language\foreign@language + \def\foreign@language#1{% + \MT@orig@foreign@language{#1}% + \MT@set@babel@context{#1}% + }% + \ifMT@kerning +% \end{macrocode} +%\todo{make switching off of \pkg{babel}'s shorthands configurable} +% Disable French \pkg{babel}'s active characters. +%\changes{v2.0}{2006/10/10}{option `\opt{babel}': fix: switch off French +% \pkg{babel}'s shorthands properly +% (reported by \contributor Daniel Flipo <daniel.flipo\at univ-lille1.fr>)} +% ^^A private mail, 2006/10/09 +% ^^A (beta:8) +% \begin{macrocode} + \MT@if@false + \MT@with@babel@and@T{french} \MT@if@true + \MT@with@babel@and@T{frenchb} \MT@if@true + \MT@with@babel@and@T{francais}\MT@if@true + \MT@with@babel@and@T{canadien}\MT@if@true + \MT@with@babel@and@T{acadian} \MT@if@true + \ifMT@if@\MT@shorthandoff{French}{:;!?}\fi +% \end{macrocode} +% Disable Turkish \pkg{babel}'s active characters. +%\changes{v2.0}{2006/10/10}{option `\opt{babel}': switch off Turkish \pkg{babel}'s shorthands} ^^A (beta:8) +%\changes{v2.3}{2007/10/03}{fix: really switch off Turkish shorthands} +% \begin{macrocode} + \MT@if@false + \MT@with@babel@and@T{turkish} \MT@if@true + \ifMT@if@\MT@shorthandoff{Turkish}{:!=}\fi + \fi +% \end{macrocode} +% In case \pkg{babel} was loaded before \microtype: +% \begin{macrocode} + \MT@set@babel@context\languagename + }{% + \MT@warning@nl{You did not load the babel package.\MessageBreak + The `babel' option won't have any effect}% + }% + \fi +} +% \end{macrocode} +% Now we close the \cs{fi} from \cs{ifMT@draft}. +% \begin{macrocode} +\MT@addto@setup{\fi +% \end{macrocode} +% Set up the current font, most likely the normal font. This has to come after +% all of the setup (including anything from the preamble) has been dealt with. +% \begin{macrocode} + \selectfont} +% \end{macrocode} +%\begin{macro}{\MT@curr@file} +% This is the current file (hopefully with the correct extension). +% \begin{macrocode} +\edef\MT@curr@file{\jobname.tex} +%</package> +% \end{macrocode} +%\end{macro} +% Finally, execute the setup macro at the end of the preamble, and empty it +% (the \pkg{combine} class calls it repeatedly). +%\changes{v2.3d}{2009/02/05}{move setup to the very end +% (for \contributor Colin Rourke <gt\at msp.warwick.ac.uk>)} +% ^^A private mail, 2009/02/03 +% \begin{macrocode} +%<*package|letterspace> +%<plain>\MT@requires@latex1{ +\AtBeginDocument{\MT@setup@ \MT@glet\MT@setup@\@empty} +%<plain>}\relax +%</package|letterspace> +% \end{macrocode} +% Must come at the very, very end. +% \begin{macrocode} +%<package>\MT@ifdefined@c@T\MT@setup@spacing@check +%<package> {\AtBeginDocument{\MT@setup@spacing@check}} +% \end{macrocode} +% Restore catcodes. +% \begin{macrocode} +%<package|letterspace>\MT@restore@catcodes +% \end{macrocode} +% That was that. +% +% ^^A ------------------------------------------------------------------------- +%\NoIndexing ^^A from now on, don't bother indexing +% +%\newpage +% +%\section{Configuration files} +%\changes{v1.6}{2005/01/24}{restructure \file{dtx} file} +% +% Let's now write the font configuration files. +% \begin{macrocode} +%<*config> + +% \end{macrocode} +%\subsection{Font sets} +%\GeneralChanges{Font sets} +% +% We first declare some sets in the main configuration file. +% +% \begin{macrocode} +%<*m-t> +%%% ----------------------------------------------------------------------- +%%% FONT SETS + +\DeclareMicrotypeSet{all} + { } + +% \end{macrocode} +%\changes{v1.2}{2004/10/02}{new: \texttt{allmath} and \texttt{basicmath}} +%\changes{v1.8}{2005/05/25}{add <U> encoding to \texttt{allmath}} +%\changes{v1.9}{2005/08/17}{add <OT4> encoding to text sets} +%\changes{v1.9}{2005/08/17}{add <T5> encoding to text sets} +%\changes{v1.9d}{2006/04/20}{add <QX> encoding to text sets} +%\changes{v2.3e}{2009/10/28}{add <T2A> encoding} +%\changes{v2.5}{2010/05/13}{add <EU1> and <EU2> encodings} +%\changes{v2.6}{2016/04/22}{add <TU> encoding +% (notified by \contributor Will Robertson <will\at wspr.io>)} +% ^^A semi-private mail, 2016/01/28 +% \begin{macrocode} +\DeclareMicrotypeSet{allmath} + { encoding = {OT1,T1,T2A,LY1,OT4,QX,T5,EU1,EU2,TU,TS1,OML,OMS,U} } + +\DeclareMicrotypeSet{alltext} + { encoding = {OT1,T1,T2A,LY1,OT4,QX,T5,TS1,EU1,EU2,TU} } + +% \end{macrocode} +%\changes{v2.6}{2014/04/07}{new: \texttt{allmath-nott} and \texttt{alltext-nott} +% (reqested by \contributor Karl Berry <karl\at freefriends.org>)} +% ^^A private mail, 2014/03/21 +% \begin{macrocode} +\DeclareMicrotypeSet{allmath-nott} + { encoding = {OT1,T1,T2A,LY1,OT4,QX,T5,EU1,EU2,TU,TS1,OML,OMS,U}, + family = {rm*,sf*} + } + +\DeclareMicrotypeSet{alltext-nott} + { encoding = {OT1,T1,T2A,LY1,OT4,QX,T5,TS1,EU1,EU2,TU}, + family = {rm*,sf*} + } + +% \end{macrocode} +%\changes{v1.9d}{2006/02/22}{\texttt{md*} instead of \texttt{m} series in basic sets} +% \begin{macrocode} +\DeclareMicrotypeSet{basicmath} + { encoding = {OT1,T1,T2A,LY1,OT4,QX,T5,EU1,EU2,TU,OML,OMS}, + family = {rm*,sf*}, + series = {md*}, + size = {normalsize,footnotesize,small,large} + } + +\DeclareMicrotypeSet{basictext} + { encoding = {OT1,T1,T2A,LY1,OT4,QX,T5,EU1,EU2,TU}, + family = {rm*,sf*}, + series = {md*}, + size = {normalsize,footnotesize,small,large} + } + +% \end{macrocode} +%\changes{v2.0}{2006/12/28}{new: \texttt{smallcaps}} +%\changes{v2.3e}{2009/06/01}{\texttt{sc*} instead of \texttt{sc} in \texttt{smallcaps} set} +%\changes{v2.6}{2014/02/18}{add \texttt{si} and \texttt{scit} to \texttt{smallcaps} set +% (reported by \contributor uli <@\at @>)} +% ^^A https://tex.stackexchange.com/questions/157397 +% \begin{macrocode} +\DeclareMicrotypeSet{smallcaps} + { encoding = {OT1,T1,T2A,LY1,OT4,QX,T5,TS1,EU1,EU2,TU}, + shape = {sc*,si,scit} + } + +% \end{macrocode} +%\changes{v2.0}{2006/12/21}{new: \texttt{footnotesize} and \texttt{scriptsize}} +% \begin{macrocode} +\DeclareMicrotypeSet{footnotesize} + { encoding = {OT1,T1,T2A,LY1,OT4,QX,T5,TS1,EU1,EU2,TU}, + size = {-small} + } + +\DeclareMicrotypeSet{scriptsize} + { encoding = {OT1,T1,T2A,LY1,OT4,QX,T5,TS1,EU1,EU2,TU}, + size = {-footnotesize} + } + +\DeclareMicrotypeSet{normalfont} + { font = */*/*/*/* } + +% \end{macrocode} +% The default sets. +%\changes{v2.2}{2007/04/15}{default set for tracking: \texttt{smallcaps}} +% \begin{macrocode} +%%% ----------------------------------------------------------------------- +%%% DEFAULT SETS + +\DeclareMicrotypeSetDefault[protrusion]{alltext} +\DeclareMicrotypeSetDefault[expansion] {basictext} +\DeclareMicrotypeSetDefault[spacing] {basictext} +\DeclareMicrotypeSetDefault[kerning] {alltext} +\DeclareMicrotypeSetDefault[tracking] {smallcaps} + +% \end{macrocode} +% +%\subsection{Font variants and aliases} +%\GeneralChanges{Font aliases} +% +% \begin{macrocode} +%%% ----------------------------------------------------------------------- +%%% FONT VARIANTS AND ALIASES +% \end{macrocode} +% These are the variants I happen to be using (expert encoding, oldstyle +% numerals, swashes, alternative, display, inferior and superior numerals): +% \begin{macrocode} + +\DeclareMicrotypeVariants{x,j,w,a,d,0,1} +% \end{macrocode} +% Other candidates: |2|~(proportional digits), |e|~(engraved), |f|~(Fraktur), +% |g|~(small text), |h|~(shadow), |l|~(outline), |n|~(informal), +% |p|~(ornaments), |r|~(roman), |s|~(sans serif), |t|~(typewriter). +% I've omitted them since they seem hardly be used and/or they are actually +% more than just a variant, \ie, they shouldn't share a file. +% +%\bigskip\noindent +% Fonts that are `the same': +% The \pkg{fontspec} package will set |lmr| as the default font, whose +% declarations for <EU1>/<EU2>/<TU> encoding are in \file{mt-LatinModernRoman.cfg}. +%\changes{v2.5}{2012/08/23}{declare Latin Modern Roman (OpenType version) as alias of \texttt{lmr} +% when \pkg{fontspec} is loaded} +% Since 2016/12/03, the default encoding with \xetex\ and \luatex\ in the +% \LaTeX\ format is <TU>, even if \pkg{fontspec} is not loaded. +%\changes{v2.7}{2017/01/27}{declare Latin Modern Roman as alias of \texttt{lmr} +% with new \LaTeX\ format +% (reported by \contributor Ulrike Fischer <news3\at nililand.de>)} +% ^^A private mail, 2017/01/25 +% \begin{macrocode} + +\MT@if@false +\ifx\UnicodeEncodingName\@undefined\else + \MT@ifstreq{\encodingdefault}{\UnicodeEncodingName}\MT@if@true\relax +\fi +\ifMT@fontspec\MT@if@true\fi +\ifMT@if@ +\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) 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}} +% We mustn't forget the Latin Modern math fonts. +%\changes{v2.5}{2012/07/17}{declare \texttt{lmsy} and \texttt{lmm} as aliases +% of \texttt{cmsy} resp. \texttt{cmm} +% (reported by \contributor Jonas Hogstrom <hjb981\at gmail.com>)} +% ^^A https://tex.stackexchange.com/questions/63558/how-to-get-microtype-to-work-with-mathematical-minus-sign-and-package-lmodern +% \begin{macrocode} +\DeclareMicrotypeAlias{lmsy}{cmsy} +\DeclareMicrotypeAlias{lmm} {cmm} +\DeclareMicrotypeAlias{aer} {cmr} % ae +\DeclareMicrotypeAlias{zer} {cmr} % zefonts +\DeclareMicrotypeAlias{cmor}{cmr} % eco +\DeclareMicrotypeAlias{hfor}{cmr} % hfoldsty +% \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} +\DeclareMicrotypeAlias{pxr} {ppl} % pxfonts +\DeclareMicrotypeAlias{qpl} {ppl} % TeX Gyre Pagella (formerly: qfonts/QuasiPalatino) +% \end{macrocode} +% The `<FPL> Neu' fonts, a `re-implementation' of Palatino. +%\changes{v2.2}{2007/05/27}{declare \texttt{fp9x}, \texttt{fp9j} (<FPL> Neu) as aliases of \texttt{ppl[xj]}} +% \begin{macrocode} +\DeclareMicrotypeAlias{fp9x}{pplx} % FPL Neu +\DeclareMicrotypeAlias{fp9j}{pplj} % " +% \end{macrocode} +% The \pkg{newpx} package, a replacement for \pkg{pxfonts}. +%\changes{v2.7}{2017/03/13}{declare aliases for \pkg{newpx}} +% \begin{macrocode} +\DeclareMicrotypeAlias{zpllf}{ppl} % newpxtext +\DeclareMicrotypeAlias{zplosf}{ppl} % " +\DeclareMicrotypeAlias{zpltlf}{ppl} % " +\DeclareMicrotypeAlias{zpltosf}{ppl} % " +\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}{ptm} % newtxtext +\DeclareMicrotypeAlias{ntxosf}{ptm} % " +\DeclareMicrotypeAlias{ntxtlf}{ptm} % " +\DeclareMicrotypeAlias{ntxtosf}{ptm} % " +% \end{macrocode} +% The \pkg{tempora} package. +%\changes{v2.7}{2017/02/25}{declare aliases for \pkg{tempora}} +% \begin{macrocode} +\DeclareMicrotypeAlias{Tempora-TLF}{ptm} % tempora +\DeclareMicrotypeAlias{Tempora-TOsF}{ptm}% " +\DeclareMicrotypeAlias{qtm} {ptm} % TeX Gyre Termes (formerly: qfonts/QuasiTimes) +% \end{macrocode} +% The OpenType versions: +% +%\changes{v2.5}{2012/03/29}{declare TeX Gyre Pagella, Asana Math, Palatino <LT> Std, and Palatino +% as aliases of Palatino Linotype (OpenType version)} +% \begin{macrocode} +\DeclareMicrotypeAlias{TeX Gyre Pagella}{Palatino Linotype} +\DeclareMicrotypeAlias{Palatino LT Std} {Palatino Linotype} +\DeclareMicrotypeAlias{Palatino} {Palatino Linotype} +\DeclareMicrotypeAlias{Asana Math} {Palatino Linotype} +% \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. +% +% 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} +% MicroPress's Charter version (\pkg{chmath}). +%\changes{v2.2}{2007/06/08}{declare \texttt{chr} (\pkg{chmath}) as an alias of \texttt{bch} +% (reported by \contributor Geoff Vallis <gkv\at Princeton.EDU>)} +% ^^A private mail, 2007/06/07 +% \begin{macrocode} +\DeclareMicrotypeAlias{chr} {bch} % CH Math +% \end{macrocode} +%\changes{v2.7}{2017/03/13}{declare aliases for \pkg{XCharter}} +% The \pkg{XCharter} package extends the Charter fonts. +% \begin{macrocode} +\DeclareMicrotypeAlias{XCharter-TLF} {bch} % XCharter +\DeclareMicrotypeAlias{XCharter-TOsF}{bch} % " +% \end{macrocode} +% The \pkg{mathdesign} package provides math fonts matching Bitstream Charter +%\changes{v1.9a}{2005/10/31}{declare \texttt{mdbch} (\pkg{mathdesign}) +% as an alias of \texttt{bch}} +% and <URW> Garamond. +% \begin{macrocode} +\DeclareMicrotypeAlias{mdbch}{bch} % mathdesign/Charter +\DeclareMicrotypeAlias{mdugm}{ugm} % mathdesign/URW Garamond +% \end{macrocode} +% The \pkg{garamondx} package, an extension of <URW> Garamond, providing +% small caps and oldstyle figures. +%\changes{v2.5}{2013/02/20}{declare \texttt{zgmx} etc. (\pkg{garamondx}) +% as aliases of \texttt{ugm}} +% \begin{macrocode} +\DeclareMicrotypeAlias{zgmx}{ugm} % garamondx +\DeclareMicrotypeAlias{zgmj}{ugm} % " +\DeclareMicrotypeAlias{zgmI}{ugm} % " +\DeclareMicrotypeAlias{zgmq}{ugm} % " +% \end{macrocode} +% <URW> Letter Gothic is similar enough to Bitstream Letter Gothic to share the +% configuration. +% \begin{macrocode} +\DeclareMicrotypeAlias{ulg} {blg} % URW LetterGothic -> Bitstream LetterGothic12Pitch +% \end{macrocode} +% Euro symbol fonts, to save some files. +% \begin{macrocode} +\DeclareMicrotypeAlias{zpeus} {zpeu} % Adobe Euro sans -> serif +\DeclareMicrotypeAlias{eurosans}{zpeu} % Adobe Euro sans -> serif +\DeclareMicrotypeAlias{euroitcs}{euroitc}% ITC Euro sans -> serif + +% \end{macrocode} +% +%\subsection{Interaction with \pkg{babel}} +% +% Contexts that are to be set when switching to a language. +% \begin{macrocode} +%%% ----------------------------------------------------------------------- +%%% INTERACTION WITH THE `babel' PACKAGE + +\DeclareMicrotypeBabelHook + {english,UKenglish,british,USenglish,american} + {kerning=, spacing=nonfrench} + +\DeclareMicrotypeBabelHook + {french,francais,acadian,canadien} + {kerning=french, spacing=} + +\DeclareMicrotypeBabelHook + {turkish} + {kerning=turkish, spacing=} + +% \end{macrocode} +%\GeneralChanges* +% +% \subsection{Note on admissible characters} +% +% All printable <ASCII> characters are allowed in the settings, with the +% following exceptions (on the left hand side, the replacements on the right): +% +%\begin{tabbing} +% |\|\quad\=:\quad\=\cmd\textbackslash \\ +% |{| \>:\> \cmd\textbraceleft \\ +% |}| \>:\> \cmd\textbraceright \\ +% |^| \>:\> \cmd\textasciicircum \\ +% |%| \>:\> \cmd\% \\ +% |#| \>:\> \cmd\# +%\end{tabbing} +% +%\noindent +% Comma and equal sign must be guarded with braces (`|{,}|', `|{=}|') to keep +% \pkg{keyval} happy. +% +% Character commands are allowed as far as they have been defined in the proper +% \LaTeX\ way, that is, when they have been assigned a slot in the font +% encoding with \cmd\DeclareTextSymbol\ or \cmd\DeclareTextComposite. +% Characters defined via \cmd\chardef\ are also possible. +% +% Ligatures and \cmd\mathchardef ed symbols have to be specified numerically. +% Of course, numerical identification is possible in any other case, too. +% +%\changes{v1.1}{2004/09/14}{remove 8-bit characters from the configuration files +% (suggested by \contributor Harald Harders <h.harders\at tu-bs.de>)} +% ^^A private mail, 2004/09/13 +% 8-bit characters are also admissible, provided they have been declared in the +% input encoding file. They should, however, only be used in private +% configuration files, where the proper input encoding is guaranteed, or else in +% combination with the `|inputenc|' key. +% +% With \xetex\ or \luatex, in contrast, it is advisable to use the proper +% Unicode characters. +% +%\subsection{Character inheritance} +%\GeneralChanges{Inheritance} +% +% First the lists of inheriting characters. We only declare those characters +% that are the same on \emph{both} sides, \ie, not \OE\ for O. +% \begin{macrocode} +%</m-t> +%<*m-t|zpeu|mvs> +%%% ----------------------------------------------------------------------- +%%% CHARACTER INHERITANCE + +%</m-t|zpeu|mvs> +%<*m-t> +% \end{macrocode} +% +%\subsubsection{<OT1>} +% Glyphs that should possibly inherit settings on one side only: +% |012|~(`fi' ligature), |013|~(`fl'), |014|~(`ffi'), |015|~(`ffl'), +% \AE, \ae, \OE, \oe. +% \begin{macrocode} +\DeclareCharacterInheritance + { encoding = OT1 } + { f = {011}, % ff + i = {\i}, + j = {\j}, + O = {\O}, + o = {\o} + } + +% \end{macrocode} +% +%\subsubsection{<T1>} +% Candidates here: |028|~(`fi'), |029|~(`fl'), |030|~(`ffi'), |031|~(`ffl'), +% |156| (`\IJ'~ligature, since \LaTeX\ 2005/12/01 accessible as |\IJ|), +% |188|~(`\ij', |\ij|), \AE, \ae, \OE, \oe. +%\changes{v1.5}{2004/12/11}{remove \cmd\ss\ from <T1> list, add \cmd\DJ} +%\changes{v1.8}{2005/04/26}{remove \cmd\DJ\ from <T1> list (it's the same as \cmd\DH)} +% \begin{macrocode} +\DeclareCharacterInheritance + { encoding = T1 } + { A = {\`A,\'A,\^A,\~A,\"A,\r A,\k A,\u A}, + a = {\`a,\'a,\^a,\~a,\"a,\r a,\k a,\u a}, + C = {\'C,\c C,\v C}, + c = {\'c,\c c,\v c}, + D = {\v D,\DH}, + d = {\v d,\dj}, + E = {\`E,\'E,\^E,\"E,\k E,\v E}, + e = {\`e,\'e,\^e,\"e,\k e,\v e}, + f = {027}, % ff + G = {\u G}, + g = {\u g}, + I = {\`I,\'I,\^I,\"I,\.I}, + i = {\`i,\'i,\^i,\"i,\i}, + j = {\j}, + L = {\L,\'L,\v L}, + l = {\l,\'l,\v l}, + N = {\'N,\~N,\v N}, + n = {\'n,\~n,\v n}, + O = {\O,\`O,\'O,\^O,\~O,\"O,\H O}, + o = {\o,\`o,\'o,\^o,\~o,\"o,\H o}, + R = {\'R,\v R}, + r = {\'r,\v r}, + S = {\'S,\c S,\v S,\SS}, + s = {\'s,\c s,\v s}, + T = {\c T,\v T}, + t = {\c t,\v t}, + U = {\`U,\'U,\^U,\"U,\H U,\r U}, + u = {\`u,\'u,\^u,\"u,\H u,\r u}, + Y = {\'Y,\"Y}, + y = {\'y,\"y}, + Z = {\'Z,\.Z,\v Z}, + z = {\'z,\.z,\v z} +% \end{macrocode} +%\changes{v2.2}{2007/02/04}{remove `\texttt{-}' $\rightarrow$ `\texttt{127}'} +% The `soft hyphen' often has reduced right side bearing so that it may already +% be protruded, hence no inheritance. +% \begin{macrocode} +% - = {127}, + } + +% \end{macrocode} +% +%\subsubsection{<LY1>} +% More characters: |008|~(`fl'), |012|~(`fi'), |014|~(`ffi'), |015|~(`ffl'), +% \AE, \ae, \OE, \oe. +% \begin{macrocode} +\DeclareCharacterInheritance + { encoding = LY1 } + { A = {\`A,\'A,\^A,\~A,\"A,\r A}, + a = {\`a,\'a,\^a,\~a,\"a,\r a}, + C = {\c C}, + c = {\c c}, + D = {\DH}, + E = {\`E,\'E,\^E,\"E}, + e = {\`e,\'e,\^e,\"e}, + f = {011}, % ff + I = {\`I,\'I,\^I,\"I}, + i = {\`i,\'i,\^i,\"i,\i}, + L = {\L}, + l = {\l}, + N = {\~N}, + n = {\~n}, + O = {\`O,\'O,\^O,\~O,\"O,\O}, + o = {\`o,\'o,\^o,\~o,\"o,\o}, + S = {\v S}, + s = {\v s}, + U = {\`U,\'U,\^U,\"U}, + u = {\`u,\'u,\^u,\"u}, + Y = {\'Y,\"Y}, + y = {\'y,\"y}, + Z = {\v Z}, + z = {\v z} + } + +% \end{macrocode} +% +%\subsubsection{<OT4>} +%\changes{v1.9}{2005/08/16}{add list for <OT4>} +%\changes{v2.7b}{2019/02/28}{add textquotedblleft ligature to <OT4> +% (reported by \contributor Franz Wexler <@\at @>)} +% ^^A https://tex.stackexchange.com/questions/476648/ +% The Polish <OT1> extension. More interesting characters here: +% |009|~(`fk'), |012|~(`fi'), |013|~(`fl'), |014|~(`ffi'), |015|~(`ffl'), +% \AE, \ae, \OE, \oe. +% \begin{macrocode} +\DeclareCharacterInheritance + { encoding = OT4 } + { A = {\k A}, + a = {\k a}, + C = {\'C}, + c = {\'c}, + E = {\k E}, + e = {\k e}, + f = {011}, % ff + i = {\i}, + j = {\j}, + L = {\L}, + l = {\l}, + N = {\'N}, + n = {\'n}, + O = {\O,\'O}, + o = {\o,\'o}, + S = {\'S}, + s = {\'s}, + Z = {\'Z,\.Z}, + z = {\'z,\.z}, + \textquotedblleft = "FF + } + +% \end{macrocode} +% +%\subsubsection{<QX>} +%\changes{v1.9d}{2006/04/20}{add list for <QX> encoding (contributed by +% \contributor Maciej Eder <maciej_eder\at poczta.onet.pl>)} +% ^^A private mail, 2006/04/19 +% The Central European <QX> encoding.\footnote{ +% Contributed by \contributor Maciej Eder <maciej_eder\at poczta.onet.pl>.} +% Ligatures: |009|~(`fk'), |012|~(`fi'), |013|~(`fl'), |014|~(`ffi'), +% |015|~(`ffl'), \AE, \ae, \OE, \oe. +% \begin{macrocode} +\DeclareCharacterInheritance + { encoding = QX } + { A = {\`A,\'A,\^A,\~A,\"A,\k A,\AA}, + a = {\`a,\'a,\^a,\~a,\"a,\k a,\aa}, + C = {\'C,\c C}, + c = {\'c,\c c}, + D = {\DH}, + E = {\`E,\'E,\^E,\"E,\k E}, + e = {\`e,\'e,\^e,\"e,\k e}, + f = {011}, % ff + I = {\`I,\'I,\^I,\"I,\k I}, + i = {\`i,\'i,\^i,\"i,\k i,\i}, + j = {\j}, + L = {\L}, + l = {\l}, + N = {\'N,\~N}, + n = {\'n,\~n}, + O = {\O,\`O,\'O,\^O,\~O,\"O}, + o = {\o,\`o,\'o,\^o,\~o,\"o}, +% \end{macrocode} +%\changes{v2.3c}{2008/09/01}{add \cmd\textcommabelow[\texttt{STst}] to <QX> encoding +% (reported by \contributor Vasile Gaburici <vgaburici\at gmail.com>)} +% ^^A private mail, 2008/09/01, and +% ^^A http://tug.org/pipermail/tex-live/2008-September/017385.html +% The Romanian \cmd\textcommabelow\ accents are actually replacements for the +% \cmd\c\ variants, which had previously (and erroneously\footnote{ +% Cf. \url{http://tug.org/pipermail/tex-live/2008-August/017204.html}}) +% been included in <QX> encoding. They are still kept for backwards +% compatibility. +%\iffalse +% If \cmd\textcommabelow\ is undefined, it will be silently ignored. +% This is due to a quirk in \cs{\MT@map@clist@}. +%\todo{fix \cs{\MT@map@clist@}?} +%\fi +% \begin{macrocode} + S = {\'S,\c S,\textcommabelow S,\v S}, + s = {\'s,\c s,\textcommabelow s,\v s}, + T = {\c T,\textcommabelow T}, + t = {\c t,\textcommabelow t}, + U = {\`U,\'U,\^U,\"U,\k U}, + u = {\`u,\'u,\^u,\"u,\k u}, + Y = {\'Y,\"Y}, + y = {\'y,\"y}, + Z = {\'Z,\.Z,\v Z}, + z = {\'z,\.z,\v z}, + . = \textellipsis + } + +% \end{macrocode} +% +%\subsubsection{<T5>} +%\changes{v1.9}{2005/08/17}{add list for <T5> (requested by +% \contributor H\`an \thanhthe{} Th\`anh <hanthethanh\at gmail.com>)} +% ^^A private email, 2005/08/16 +% The Vietnamese encoding <T5>. It is so crowded with accented and double-accented +% characters that there is no room for any ligatures. +% \begin{macrocode} +\DeclareCharacterInheritance + { encoding = T5 } + { A = {\`A,\'A,\~A,\h A,\d A,\^A,\u A, + \`\Acircumflex,\'\Acircumflex,\~\Acircumflex,\h\Acircumflex,\d\Acircumflex, + \`\Abreve,\'\Abreve,\~\Abreve,\h\Abreve,\d\Abreve}, + a = {\`a,\'a,\~a,\h a,\d a,\^a,\u a, + \`\acircumflex,\'\acircumflex,\~\acircumflex,\h\acircumflex,\d\acircumflex, + \`\abreve,\'\abreve,\~\abreve,\h\abreve,\d\abreve}, + D = {\DJ}, + d = {\dj}, + E = {\`E,\'E,\~E,\h E,\d E,\^E, + \`\Ecircumflex,\'\Ecircumflex,\~\Ecircumflex,\h\Ecircumflex,\d\Ecircumflex}, + e = {\`e,\'e,\~e,\h e,\d e,\^e, + \`\ecircumflex,\'\ecircumflex,\~\ecircumflex,\h\ecircumflex,\d\ecircumflex}, + I = {\`I,\'I,\~I,\h I,\d I}, + i = {\`i,\'i,\~i,\h i,\d i,\i}, + O = {\`O,\'O,\~O,\h O,\d O,\^O,\horn O, + \`\Ocircumflex,\'\Ocircumflex,\~\Ocircumflex,\h\Ocircumflex,\d\Ocircumflex, + \`\Ohorn,\'\Ohorn,\~\Ohorn,\h\Ohorn,\d\Ohorn}, + o = {\`o,\'o,\~o,\h o,\d o,\^o,\horn o, + \`\ocircumflex,\'\ocircumflex,\~\ocircumflex,\h\ocircumflex,\d\ocircumflex, + \`\ohorn,\'\ohorn,\~\ohorn,\h\ohorn,\d\ohorn}, + U = {\`U,\'U,\~U,\h U,\d U,\horn U, + \`\Uhorn,\'\Uhorn,\~\Uhorn,\h\Uhorn,\d\Uhorn}, + u = {\`u,\'u,\~u,\h u,\d u,\horn u, + \`\uhorn,\'\uhorn,\~\uhorn,\h\uhorn,\d\uhorn}, + Y = {\`Y,\'Y,\~Y,\h Y,\d Y}, + y = {\`y,\'y,\~y,\h y,\d y} + } + +% \end{macrocode} +%\subsubsection{<EU1>, <EU2>, <TU>} +%\changes{v2.5}{2010/11/05}{add rudimentary list for <EU1> and <EU2>} ^^A (beta:03) +%\changes{v2.6}{2016/04/22}{add <TU> encoding} +% The <EU1> (\xetex), <EU2> (\luatex), and, since \pkg{fontspec} version 2.5, +% <TU> encodings are not well-defined in the sense that they don't +% contain a fixed number of glyphs, all of which must be present. +% OpenType fonts may contain thousands of glyphs, but we only define those +% that should be present in every font (basically <T1>). This inheritance list +% should be overridden by font-specific ones. +% \begin{macrocode} +\DeclareCharacterInheritance + { encoding = {EU1,EU2,TU} } + { A = {\`A,\'A,\^A,\~A,\"A,\r A,\k A,\u A}, + a = {\`a,\'a,\^a,\~a,\"a,\r a,\k a,\u a}, + C = {\'C,\c C,\v C}, + c = {\'c,\c c,\v c}, + D = {\v D,\DH}, + d = {\v d,\dj}, + E = {\`E,\'E,\^E,\"E,\k E,\v E}, + e = {\`e,\'e,\^e,\"e,\k e,\v e}, +% f = {/f_f}, % sometimes /f_f, sometimes /ff + G = {\u G}, + g = {\u g}, + I = {\`I,\'I,\^I,\"I,\.I}, + i = {\`i,\'i,\^i,\"i,\i}, +% j = {\j}, + L = {\L,\'L,\v L}, + l = {\l,\'l,\v l}, + N = {\'N,\~N,\v N}, + n = {\'n,\~n,\v n}, + O = {\O,\`O,\'O,\^O,\~O,\"O,\H O}, + o = {\o,\`o,\'o,\^o,\~o,\"o,\H o}, + R = {\'R,\v R}, + r = {\'r,\v r}, + S = {\'S,\c S,\v S}, % \SS + s = {\'s,\c s,\v s}, + T = {\c T,\v T}, + t = {\c t,\v t}, + U = {\`U,\'U,\^U,\"U,\H U,\r U}, + u = {\`u,\'u,\^u,\"u,\H u,\r u}, + Y = {\'Y,\"Y}, + y = {\'y,\"y}, + Z = {\'Z,\.Z,\v Z}, + z = {\'z,\.z,\v z} + } + +%</m-t> +% \end{macrocode} +% +%\subsubsection{Euro symbols} +% Make Euro symbols settings simpler. +% \begin{macrocode} +%<*zpeu> +\DeclareCharacterInheritance + { encoding = U, + family = {zpeu,zpeus,eurosans} } + { E = 128 } + +%</zpeu> +%<*mvs> +% \end{macrocode} +% Since 2006/05/11 (that is, one week after I've added these settings, after the +% package had been dormant for six years!), \pkg{marvosym}'s encoding is +% (correctly) <U> instead of <OT1>. +%\changes{v1.9e}{2006/07/05}{adapt to \pkg{marvosym}'s changed encoding} +% \begin{macrocode} +\DeclareCharacterInheritance + { encoding = {OT1,U}, + family = mvs } + { 164 = {099,100,101} } % \EURhv,\EURcr,\EURtm + +%</mvs> +% \end{macrocode} +% +%\subsection{Tracking} +%\GeneralChanges{Tracking} +% +%\changes{v2.2}{2007/02/23}{add ligatures that are to be disabled} +%\changes{v2.5}{2011/09/07}{add <EU2> encoding to default list} ^^A (beta:09) +%\changes{v2.6}{2016/04/22}{add <TU> encoding to default list} +% By default, we only disable the `f*' ligatures, for those fonts that have +% any. Thus, ligatures and especially kerning for all other characters will be +% retained. +% \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 <T2A> encoding.\footnote{Contributed by +% \contributor Karl Karlsson <karl-karlsson\at yandex.ru>.} +%\changes{v2.3e}{2009/10/28}{settings for <T2A> encoding +% (contributed by \contributor Karl Karlsson <karl-karlsson\at yandex.ru>)} +% \begin{macrocode} +\SetExpansion + [ name = T2A ] + { encoding = T2A } + { + A = 500, a = 700, + B = 700, b = 700, + C = 700, c = 700, + D = 500, d = 700, + E = 700, e = 700, + F = 700, + G = 500, g = 700, + H = 700, h = 700, + K = 700, k = 700, + M = 700, m = 700, + N = 700, n = 700, + O = 500, o = 700, + P = 700, p = 700, + Q = 500, q = 700, + R = 700, + S = 700, s = 700, + U = 700, u = 700, + W = 700, w = 700, + Z = 700, z = 700, + 2 = 700, + 3 = 700, + 6 = 700, + 8 = 700, + 9 = 700, + \CYRA = 500, \cyra = 700, + \CYRB = 700, \cyrb = 700, + \CYRV = 700, \cyrv = 700, + \CYRG = 700, \cyrg = 700, + \CYRD = 700, \cyrd = 700, + \CYRE = 700, \cyre = 700, + \CYRZH = 700, \cyrzh = 700, + \CYRZ = 700, \cyrz = 700, + \CYRI = 700, \cyri = 700, + \CYRISHRT = 700, \cyrishrt = 700, + \CYRK = 700, \cyrk = 700, + \CYRL = 700, \cyrl = 700, + \CYRM = 700, \cyrm = 700, + \CYRN = 700, \cyrn = 700, + \CYRO = 500, \cyro = 700, + \CYRP = 700, \cyrp = 700, + \CYRR = 700, \cyrr = 700, + \CYRS = 700, \cyrs = 700, + \CYRT = 700, \cyrt = 700, + \CYRU = 700, \cyru = 700, + \CYRF = 700, \cyrf = 700, + \CYRH = 700, \cyrh = 700, + \CYRC = 700, \cyrc = 700, + \CYRCH = 700, \cyrch = 700, + \CYRSH = 700, \cyrsh = 700, + \CYRSHCH = 700, \cyrshch = 700, + \CYRHRDSN = 700, \cyrhrdsn = 700, + \CYRERY = 700, \cyrery = 700, + \CYRSFTSN = 700, \cyrsftsn = 700, + \CYREREV = 700, \cyrerev = 700, + \CYRYU = 700, \cyryu = 700, + \CYRYA = 700, \cyrya = 700 + } + +% \end{macrocode} +% <T5> encoding does not contain \cmd\AE, \cmd\ae, \cmd\OE\ and \cmd\oe. +% \begin{macrocode} +\SetExpansion + [ name = T5 ] + { encoding = T5 } + { + A = 500, a = 700, + B = 700, b = 700, + C = 700, c = 700, + D = 500, d = 700, + E = 700, e = 700, + F = 700, + G = 500, g = 700, + H = 700, h = 700, + K = 700, k = 700, + M = 700, m = 700, + N = 700, n = 700, + O = 500, o = 700, + P = 700, p = 700, + Q = 500, q = 700, + R = 700, + S = 700, s = 700, + U = 700, u = 700, + W = 700, w = 700, + Z = 700, z = 700, + 2 = 700, + 3 = 700, + 6 = 700, + 8 = 700, + 9 = 700 + } + +%</m-t> +% \end{macrocode} +% +%\subsection{Character protrusion} +%\GeneralChanges{Protrusion} +% +%\changes{v1.1}{2004/09/14}{add factors for some more characters} +%\changes{v1.4b}{2004/11/19}{harmonise dashes in upshape and italic +% (\texttt{cmr}, \texttt{pad}, \texttt{ppl})} +%\changes{v1.9}{2005/08/16}{settings for <OT4> encoding (Computer Modern Roman, +% Palatino, Times)} +%\changes{v1.9}{2005/08/17}{settings for <T5> encoded Computer Modern Roman} +%\changes{v1.9a}{2005/12/02}{settings for <T5> encoded Charter} +% +% \begin{macrocode} +%%% ----------------------------------------------------------------------- +%%% PROTRUSION + +% \end{macrocode} +% For future historians, \thanh's original settings (from \file{protcode.tex}, +% converted to \microtype\ notation). +%\begin{verbatim} +%\SetProtrusion +% [ name = thanh ] +% { encoding = OT1 } +% { +% A = {50,50}, +% F = { ,50}, +% J = {50, }, +% K = { ,50}, +% L = { ,50}, +% T = {50,50}, +% V = {50,50}, +% W = {50,50}, +% X = {50,50}, +% Y = {50,50}, +% k = { ,50}, +% r = { ,50}, +% t = { ,50}, +% v = {50,50}, +% w = {50,50}, +% x = {50,50}, +% y = {50,50}, +% . = { ,700}, {,}= { ,700}, +% : = { ,500}, ; = { ,500}, +% ! = { ,200}, ? = { ,200}, +% ( = {50, }, ) = { ,50}, +% - = { ,700}, +% \textendash = { ,300}, \textemdash = { ,200}, +% \textquoteleft = {700, }, \textquoteright = { ,700}, +% \textquotedblleft = {500, }, \textquotedblright = { ,500} +% } +%\end{verbatim} +% +%\subsubsection{Normal} +% +% The default settings always use the most moderate value. +% +% \begin{macrocode} +%<*cfg-t> +\SetProtrusion +%<m-t> [ name = default ] +% \end{macrocode} +% We also create configuration files for the fonts +%\begin{itemize} +% \item Bitstream Charter (<NFSS> code |bch|) +%\changes{v1.5}{2004/11/28}{settings for Bitstream Charter} +% \begin{macrocode} +%<bch> [ name = bch-default ] +% \end{macrocode} +% \item Bitstream Letter Gothic (|blg|) +%\changes{v2.2}{2007/03/03}{settings for Bitstream Letter Gothic} +% \begin{macrocode} +%<blg> [ name = blg-default ] +% \end{macrocode} +% \item Computer Modern Roman (|cmr|) +% \begin{macrocode} +%<cmr> [ name = cmr-default ] +% \end{macrocode} +% \item Adobe Garamond (|pad|, |padx|, |padj|) +% \begin{macrocode} +%<pad> [ name = pad-default ] +% \end{macrocode} +% \item Minion\footnote{Contributed by \contributor Harald Harders <h.harders\at tu-bs.de> +% and \contributor Karl Karlsson <karl-karlsson\at yandex.ru>.} +% (|pmnx|, |pmnj|) +%\changes{v1.1}{2004/09/14}{settings for Adobe Minion (contributed by +% \contributor Harald Harders <h.harders\at tu-bs.de>)} +% ^^A private mail, 2004/09/14 +% \begin{macrocode} +%<pmn> [ name = pmnj-default ] +% \end{macrocode} +% \item Palatino (|ppl|, |pplx|, |pplj|) +% \begin{macrocode} +%<ppl> [ name = ppl-default ] +% \end{macrocode} +% \item Times (|ptm|, |ptmx|, |ptmj|) +% \begin{macrocode} +%<ptm> [ name = ptm-default ] +% \end{macrocode} +% \item <URW> Garamond (|ugm|) +%\changes{v1.9c}{2006/01/26}{settings for <URW> Garamond} +%\end{itemize} +% \begin{macrocode} +%<ugm> [ name = ugm-default ] +%<m-t|cmr|pmn> { } +%<bch|blg|pad|ugm> { encoding = OT1, +%<ppl|ptm> { encoding = {OT1,OT4}, +%<bch> family = bch } +%<blg> family = blg } +%<pad> family = {pad,padx,padj} } +%<ppl> family = {ppl,pplx,pplj} } +%<ptm> family = {ptm,ptmx,ptmj} } +%<ugm> family = ugm } + { +%<m-t|bch|blg|cmr|pad|pmn|ppl|ptm> A = {50,50}, +%<ugm> A = {50,100}, +%<pad|ptm> \AE = {50, }, +%<ugm> \AE = {150,50}, +%<ugm> B = { ,50}, +%<bch|pad|pmn|ugm> C = {50, }, +%<bch|pad|pmn> D = { ,50}, +%<ugm> D = { ,70}, +%<ugm> E = { ,50}, +%<m-t|bch|cmr|pad|pmn|ptm> F = { ,50}, +%<ugm> F = { ,70}, +%<bch|pad|pmn> G = {50, }, +%<ugm> G = {50,50}, +%<blg> I = {150,150}, +%<m-t|cmr|pad|pmn|ppl|ptm|ugm> J = {50, }, +%<bch|blg> J = {100, }, +%<!blg> K = { ,50}, +%<blg> K = {50, }, +%<m-t|bch|cmr|pad|pmn|ppl> L = { ,50}, +%<blg> L = { ,150}, +%<ptm> L = { ,80}, +%<ugm> L = { ,120}, +%<bch|pad|pmn|ugm> O = {50,50}, +%<pad> \OE = {50, }, +%<ugm> \OE = {50,50}, +%<blg> P = { ,100}, +%<ugm> P = { ,50}, +%<bch|pad|pmn> Q = {50,70}, +%<ugm> Q = {50,50}, +%<bch> R = { ,50}, +%<ugm> R = { ,70}, +%<m-t|bch|cmr|pad|pmn|ppl|ptm> T = {50,50}, +%<blg> T = {100,100}, +%<ugm> T = {70,70}, +%<m-t|bch|cmr|pad|pmn|ppl|ptm> V = {50,50}, +%<blg|ugm> V = {70,70}, +%<m-t|bch|cmr|pad|pmn|ppl|ptm> W = {50,50}, +%<ugm> W = {70,70}, +%<m-t|bch|cmr|pad|pmn|ppl|ptm> X = {50,50}, +%<ugm> X = {50,70}, +%<m-t|bch|cmr|pad|pmn|ppl> Y = {50,50}, +%<blg|ptm|ugm> Y = {80,80}, +%<ugm> Z = {50,50}, +%<blg> f = {150,100}, +%<blg> i = {150,150}, +%<blg> j = {100,100}, +%<m-t|bch|cmr|pad|pmn|ppl|ptm> k = { ,50}, +%<ugm> k = { ,70}, +%<blg> l = {150,150}, +%<pmn> l = { ,-50}, +%<pad|ppl> p = {50,50}, +%<ugm> p = { ,50}, +%<pad|ppl> q = {50, }, +%<!blg> r = { ,50}, +%<blg> r = {100, 80}, +%<cmr|pad|pmn> t = { ,70}, +%<bch> t = { ,50}, +%<blg> t = {150, 80}, +%<ugm> t = { ,100}, +%<m-t|bch|cmr|pad|pmn|ppl|ptm> v = {50,50}, +%<blg> v = {100,100}, +%<ugm> v = {50,70}, +%<m-t|bch|cmr|pad|pmn|ppl|ptm> w = {50,50}, +%<ugm> w = {50,70}, +%<!blg> x = {50,50}, +%<blg> x = {100,100}, +%<m-t|bch|pad|pmn> y = { ,50}, +%<blg> y = { 50,100}, +%<cmr|ppl|ptm> y = {50,70}, +%<ugm> y = { ,70}, +% \end{macrocode} +%\changes{v1.6}{2005/01/11}{improve settings for numbers +% (pointed out by \contributor Peter Muthesius <newsname\at gmx.de>)} +% ^^A MID: <34b1h7F48s44tU1@individual.net> +% \begin{macrocode} +%<cmr> 0 = { ,50}, +%<m-t> 1 = {50,50}, +%<bch|blg|pad|ptm|ugm> 1 = {150,150}, +%<cmr> 1 = {100,200}, +%<pmn> 1 = { ,50}, +%<ppl> 1 = {100,100}, +%<bch|cmr|pad|ugm> 2 = {50,50}, +%<blg> 2 = { ,100}, +%<bch|pmn> 3 = {50, }, +%<cmr|pad|ugm> 3 = {50,50}, +%<blg> 3 = {100, }, +%<m-t|pad> 4 = {50,50}, +%<bch> 4 = {100,50}, +%<blg> 4 = {100, }, +%<cmr|ugm> 4 = {70,70}, +%<pmn> 4 = {50, }, +%<ptm> 4 = {70, }, +%<cmr> 5 = { ,50}, +%<pad> 5 = {50,50}, +%<bch> 6 = {50, }, +%<cmr> 6 = { ,50}, +%<pad> 6 = {50,50}, +%<m-t> 7 = {50,50}, +%<bch|pad|pmn|ugm> 7 = {50,80}, +%<blg> 7 = {100,100}, +%<cmr|ptm> 7 = {50,100}, +%<ppl> 7 = { ,50}, +%<cmr> 8 = { ,50}, +%<bch|pad> 9 = {50,50}, +%<cmr> 9 = { ,50}, +%<m-t|cmr|pad|pmn|ppl|ptm|ugm> . = { ,700}, +%<bch> . = { ,600}, +%<blg> . = {400,500}, +%<!blg> {,}= { ,500}, +%<blg> {,}= {300,400}, +%<m-t|cmr|pad|pmn|ppl|ptm|ugm> : = { ,500}, +%<bch> : = { ,400}, +%<blg> : = {300,400}, +%<m-t|bch|pad|pmn|ptm> ; = { ,300}, +%<blg> ; = {200,300}, +%<cmr|ppl> ; = { ,500}, +%<ugm> ; = { ,400}, +%<!blg> ! = { ,100}, +%<blg> ! = {200,200}, +%<m-t|pad|pmn|ptm> ? = { ,100}, +%<bch|cmr|ppl|ugm> ? = { ,200}, +%<blg> ? = {150,150}, +%<pmn> " = {300,300}, +%<m-t|bch|cmr|pad|pmn|ppl> @ = {50,50}, +%<ptm> @ = {100,100}, +%<m-t|bch|blg|cmr|pad|pmn|ppl|ptm> ~ = {200,250}, +%<ugm> ~ = {300,350}, +%<pad|ppl|ptm> & = {50,100}, +%<ugm> & = { ,100}, +%<m-t|cmr|pad|pmn> \% = {50,50}, +%<bch> \% = { ,50}, +%<ppl|ptm> \% = {100,100}, +%<ugm> \% = {50,100}, +%<blg> \# = {100,100}, +%<m-t|ppl|ptm|ugm> * = {200,200}, +%<bch|pmn> * = {200,300}, +%<blg> * = {150,200}, +%<cmr|pad> * = {300,300}, +%<m-t|cmr|ppl|ptm> + = {250,250}, +%<bch> + = {150,250}, +%<pad> + = {300,300}, +%<blg|pmn> + = {150,200}, +%<ugm> + = {250,300}, +%<blg|ugm> {=}= {200,200}, +%<m-t|pad|pmn|ptm> ( = {100, }, ) = { ,200}, +%<bch|ugm> ( = {200, }, ) = { ,200}, +%<cmr|blg> ( = {300, }, ) = { ,300}, +%<ppl> ( = {100, }, ) = { ,300}, +%<bch|pmn> [ = {100, }, ] = { ,100}, +%<blg> [ = {300,100}, ] = { ,300}, +% \end{macrocode} +%\changes{v1.7}{2005/03/15}{fix: remove \textbackslash\ from <OT1>, +% add \cmd\textbackslash\ to <T1> encoding} +% \begin{macrocode} +%<m-t|pad|pmn|ptm> / = {100,200}, +%<bch> / = { ,200}, +%<blg> / = {300,300}, +%<cmr|ppl> / = {200,300}, +%<ugm> / = {100,300}, +%<m-t|ptm> - = {500,500}, +%<bch|cmr|ppl> - = {400,500}, +%<blg> - = {300,400}, +%<pad> - = {300,500}, +%<pmn> - = {200,400}, +%<ugm> - = {500,600}, +%<blg> < = {200,100}, > = {100,200}, +%<blg> _ = {150,250}, +%<blg> | = {250,250}, +%<m-t|pmn> \textendash = {200,200}, \textemdash = {150,150}, +%<bch> \textendash = {200,300}, \textemdash = {150,250}, +%<cmr> \textendash = {400,300}, \textemdash = {300,200}, +%<pad|ppl|ptm> \textendash = {300,300}, \textemdash = {200,200}, +%<ugm> \textendash = {250,300}, \textemdash = {250,250}, +% \end{macrocode} +% Why settings for left \emph{and} right quotes? Because in some languages they +% might be used like that (see the \pkg{csquotes} package for examples). +% \begin{macrocode} +%<m-t|bch|pmn> \textquoteleft = {300,400}, \textquoteright = {300,400}, +%<blg> \textquoteleft = {400,600}, \textquoteright = {400,600}, +%<cmr> \textquoteleft = {500,700}, \textquoteright = {500,600}, +%<pad|ppl> \textquoteleft = {500,700}, \textquoteright = {500,700}, +%<ptm> \textquoteleft = {500,500}, \textquoteright = {300,500}, +%<ugm> \textquoteleft = {300,600}, \textquoteright = {300,600}, +%<m-t|bch|pmn> \textquotedblleft = {300,300}, \textquotedblright = {300,300} +%<blg> \textquotedblright = {300,400} +%<cmr> \textquotedblleft = {500,300}, \textquotedblright = {200,600} +%<pad|ppl|ptm> \textquotedblleft = {300,400}, \textquotedblright = {300,400} +%<ugm> \textquotedblleft = {400,400}, \textquotedblright = {400,400} + } + +% \end{macrocode} +% Greek uppercase letters are in <OT1> encoding only. +%\changes{v1.9}{2005/07/10}{fix: remove uppercase Greek letters from <T1> encoded <CMR>} +% \begin{macrocode} +%<*m-t|cmr|pmn> +\SetProtrusion +%<m-t> [ name = OT1-default, +%<cmr> [ name = cmr-OT1, +%<pmn> [ name = pmnj-OT1, +%<m-t> load = default ] +%<cmr> load = cmr-default ] +%<pmn> load = pmnj-default ] +%<m-t> { encoding = OT1 } +%<cmr> { encoding = {OT1,OT4}, +%<pmn> { encoding = OT1, +%<cmr> family = cmr } +%<pmn> family = pmnj } + { +%<m-t|cmr> \AE = {50, }, +%<pmn> \OE = {50, } +%<*cmr> + "00 = { ,150}, % \Gamma + "01 = {100,100}, % \Delta + "02 = { 50, 50}, % \Theta + "03 = {100,100}, % \Lambda + "06 = { 50, 50}, % \Sigma + "07 = {100,100}, % \Upsilon + "08 = { 50, 50}, % \Phi + "09 = { 50, 50} % \Psi +% \end{macrocode} +% Remaining slots can be found in the source file. +%\iffalse ^^A ... namely, here: +% "04 = { , }, % \Xi +% "05 = { , }, % \Pi +% "0A = { , }, % \Omega +%\fi +% \begin{macrocode} +%</cmr> + } + +%</m-t|cmr|pmn> +% \end{macrocode} +% <T1> and <LY1> encodings contain some more characters. The default list +% will be loaded first. +%\changes{v1.9a}{2005/11/07}{fix: remove `\texttt{\_}' from <OT1> encoding} +% For \xetex\ (<EU1>) and \luatex\ (<EU2>) we simply use the <T1> list as +% default (for now). +%\changes{v2.5}{2010/11/05}{add default lists for <EU1> and <EU2>} ^^A (beta:03) +%\changes{v2.6}{2016/04/22}{add <TU> encoding to lists} +% \begin{macrocode} +\SetProtrusion +%<m-t> [ name = T1-default, +%<bch> [ name = bch-T1, +%<blg> [ name = blg-T1, +%<cmr> [ name = cmr-T1, +%<pad> [ name = pad-T1, +%<pmn> [ name = pmnj-T1, +%<ppl> [ name = ppl-T1, +%<ptm> [ name = ptm-T1, +%<ugm> [ name = ugm-T1, +%<m-t> load = default ] +%<bch> load = bch-default ] +%<blg> load = blg-default ] +%<cmr> load = cmr-default ] +%<pad> load = pad-default ] +%<pmn> load = pmnj-default ] +%<ppl> load = ppl-default ] +%<ptm> load = ptm-default ] +%<ugm> load = ugm-default ] +%<m-t> { encoding = {T1,LY1,EU1,EU2,TU} } +%<bch|cmr|pad|pmn|ppl> { encoding = {T1,LY1}, +%<blg|ptm|ugm> { encoding = {T1}, +%<bch> family = bch } +%<blg> family = blg } +%<cmr> family = cmr } +%<pad> family = {pad,padx,padj} } +%<pmn> family = pmnj } +%<ppl> family = {ppl,pplx,pplj} } +%<ptm> family = {ptm,ptmx,ptmj} } +%<ugm> family = ugm } + { +%<m-t|cmr> \AE = {50, }, +%<bch|pmn> \OE = {50, }, +%<pmn> \TH = { ,50}, +%<blg> \v L = { ,250}, +%<blg> \v d = { ,250}, +%<blg> \v l = { ,250}, +%<blg> \v t = { ,250}, +%<blg> 127 = {300,400}, +%<blg> 156 = {100, }, % IJ +%<blg> 188 = { 80, 80}, % ij +%<m-t|bch|pad|pmn|ppl|ptm> _ = {100,100}, +%<cmr> _ = {200,200}, +%<ugm> _ = {100,200}, +%<m-t|pad|pmn|ptm> \textbackslash = {100,200}, +%<bch> \textbackslash = {150,200}, +%<blg> \textbackslash = {250,300}, +%<cmr|ppl> \textbackslash = {200,300}, +%<ugm> \textbackslash = {100,300}, +%<ugm> \textbar = {200,200}, +%<blg> \textendash = {300,300}, \textemdash = {150,150}, +%<blg> \textquotedbl = {300,400}, \textquotedblleft = {300,400}, +%<cmr> \textquotedbl = {300,300}, \textquotedblleft = {200,600}, +% \end{macrocode} +%\changes{v1.4}{2004/10/30}{tweak quote characters for \texttt{cmr} +% variants (<OT1>, <T1>, \texttt{lmr})} +% The <EC> fonts do something weird: they insert an implicit kern between quote +% and boundary character. Therefore, we must override the settings from <OT1>. +% \begin{macrocode} +%<m-t|cmr|pad|ppl|ptm|ugm> \quotesinglbase = {400,400}, \quotedblbase = {400,400}, +%<blg> \quotesinglbase = {400,400}, \quotedblbase = {300,400}, +%<bch|pmn> \quotesinglbase = {400,400}, \quotedblbase = {300,300}, +%<m-t|bch|pmn> \guilsinglleft = {400,300}, \guilsinglright = {300,400}, +%<blg> \guilsinglleft = {300,500}, \guilsinglright = {300,500}, +%<cmr|pad|ppl|ptm> \guilsinglleft = {400,400}, \guilsinglright = {300,500}, +%<ugm> \guilsinglleft = {400,400}, \guilsinglright = {300,600}, +%<m-t> \guillemotleft = {200,200}, \guillemotright = {200,200}, +%<cmr> \guillemotleft = {300,200}, \guillemotright = {100,400}, +%<bch|pmn> \guillemotleft = {200,200}, \guillemotright = {150,300}, +%<blg|pad|ppl|ptm> \guillemotleft = {300,300}, \guillemotright = {200,400}, +%<ugm> \guillemotleft = {300,400}, \guillemotright = {300,400}, +%<m-t|bch|cmr|pad|pmn|ppl|ugm> \textexclamdown = {100, }, \textquestiondown = {100, }, +%<blg> \textexclamdown = {200, }, \textquestiondown = {100, }, +%<ptm> \textexclamdown = {200, }, \textquestiondown = {200, }, +%<m-t|cmr|pad|ppl|ptm|ugm> \textbraceleft = {400,200}, \textbraceright = {200,400}, +%<bch|blg|pmn> \textbraceleft = {200, }, \textbraceright = { ,300}, +%<m-t|bch|cmr|pad|ppl|ptm|ugm> \textless = {200,100}, \textgreater = {100,200} +%<pmn> \textless = {100, }, \textgreater = { ,100}, +%<pmn> \textvisiblespace = {100,100} % not in LY1 +% \end{macrocode} +%\iffalse +% \dh = { , }, +% \th = { , }, +% \NG = { , }, +% \ng = { , }, +% \textasciicircum = { , }, +% \textsterling = { , }, % also in TS1 +% \textsection = { , }, % also in TS1 +%\fi +% \begin{macrocode} + } + +% \end{macrocode} +% The \pkg{lmodern} fonts used to restore the original settings from <OT1> +% fonts. Now, they require even other settings, though. +%\changes{v2.3a}{2008/02/19}{adjust <LMR> quotation marks again} +% \begin{macrocode} +%<*cmr> +\SetProtrusion + [ name = lmr-T1, + load = cmr-T1 ] + { encoding = {T1,LY1}, + family = lmr } + { + \textquotedblleft = {300,400}, \textquotedblright = {300,400} + } + +%</cmr> +% \end{macrocode} +% Settings for the <T2A> encoding (generic, Computer Modern Roman, and Minion).\footnote{Contributed by +% \contributor Karl Karlsson <karl-karlsson\at yandex.ru>.} +%\changes{v2.3e}{2009/10/28}{settings for <T2A> encoding (contributed by +% \contributor Karl Karlsson <karl-karlsson\at yandex.ru>)} +% ^^A private mail, 2009/10/21 +%\changes{v2.4}{2009/11/15}{settings for <T2A> encoded Minion (contributed by +% \contributor Karl Karlsson <karl-karlsson\at yandex.ru>)} +% ^^A private mail, 2009/11/14 +% \begin{macrocode} +%<*m-t|cmr|pmn> +\SetProtrusion +%<m-t> [ name = T2A-default, +%<cmr> [ name = cmr-T2A, +%<pmn> [ name = pmnj-T2A, +%<m-t> load = default ] +%<cmr> load = cmr-default ] +%<pmn> load = pmnj-default ] + { encoding = T2A, +%<m-t> } +%<cmr> family = cmr } +%<pmn> family = pmnj } + { + \CYRA = {50,50}, + \CYRG = { ,50}, + \CYRK = { ,50}, + \CYRT = {50,50}, + \CYRH = {50,50}, + \CYRU = {50,50}, +%<pmn> \CYRS = {50, }, +%<pmn> \CYRO = {50,50}, + \cyrk = { ,50}, + \cyrg = { ,50}, + \cyrh = {50,50}, +%<m-t|pmn> \cyru = {50,50}, +%<cmr> \cyru = {50,70}, +%<m-t> _ = {100,100}, +%<cmr> _ = {200,200}, +%<m-t> \textbackslash = {100,200}, \quotedblbase = {400,400}, +%<cmr> \textbackslash = {200,300}, \quotedblbase = {400,400}, +%<pmn> \textbackslash = {100,200}, \quotedblbase = {300,300}, +%<cmr> \textquotedbl = {300,300}, \textquotedblleft = {200,600}, +%<m-t> \guillemotleft = {200,200}, \guillemotright = {200,200}, +%<cmr> \guillemotleft = {300,200}, \guillemotright = {100,400}, +%<pmn> \guillemotleft = {200,200}, \guillemotright = {150,300}, +%<m-t|cmr> \textbraceleft = {400,200}, \textbraceright = {200,400}, +%<pmn> \textbraceleft = {200, }, \textbraceright = { ,300}, +%<m-t|cmr> \textless = {200,100}, \textgreater = {100,200} +%<pmn> \textless = {100, }, \textgreater = { ,100} + } + +%</m-t|cmr|pmn> +% \end{macrocode} +% Settings for the <QX> encoding (generic and Times).\footnote{Contributed by +% \contributor Maciej Eder <maciej_eder\at poczta.onet.pl>.} +%\changes{v1.9d}{2006/04/20}{settings for <QX> encoding (contributed by +% \contributor Maciej Eder <maciej_eder\at poczta.onet.pl>)} +% ^^A private mail, 2006/04/19 +% It also includes some glyphs otherwise in <TS1>. +% \begin{macrocode} +%<*m-t|ptm> +\SetProtrusion +%<m-t> [ name = QX-default, +%<ptm> [ name = ptm-QX, +%<m-t> load = default ] +%<ptm> load = ptm-default ] +%<m-t> { encoding = QX } +%<ptm> { encoding = QX, +%<ptm> family = {ptm,ptmx,ptmj} } + { + \AE = {50, }, +%<ptm> * = {200,200}, + {=} = {100,100}, + \textunderscore = {100,100}, + \textbackslash = {100,200}, + \quotedblbase = {400,400}, +%<m-t> \guillemotleft = {200,200}, \guillemotright = {200,200}, +%<ptm> \guillemotleft = {300,300}, \guillemotright = {200,400}, + \textexclamdown = {100, }, \textquestiondown = {100, }, +%<m-t> \textbraceleft = {400,200}, \textbraceright = {200,400}, +%<ptm> \textbraceleft = {200,200}, \textbraceright = {200,300}, + \textless = {200,100}, \textgreater = {100,200}, + \textminus = {200,200}, \textdegree = {300,300}, +%<m-t> \copyright = {100,100}, \textregistered = {100,100} +%<ptm> \copyright = {100,150}, \textregistered = {100,150}, +%<ptm> \textxgeq = { ,100}, \textxleq = {100, }, +%<ptm> \textalpha = { , 50}, \textDelta = { 70, 70}, +%<ptm> \textpi = { 50, 80}, \textSigma = { , 70}, +%<ptm> \textmu = { , 80}, \texteuro = { 50, 50}, +%<ptm> \textellipsis = {150,200}, \textasciitilde = { 80, 80}, +%<ptm> \textapprox = { 50, 50}, \textinfty = {100,100}, +%<ptm> \textdagger = {150,150}, \textdaggerdbl = {100,100}, +%<ptm> \textdiv = { 50,150}, \textsection = { 80, 80}, +%<ptm> \texttimes = {100,150}, \textpm = { 50, 80}, +%<ptm> \textbullet = {150,150}, \textperiodcentered = {300,300}, +%<ptm> \textquotesingle = {500,500}, \textquotedbl = {300,300}, +%<ptm> \textperthousand = { ,50} + } + +%</m-t|ptm> +% \end{macrocode} +% <T5> is based on <OT1>; it shares some but not all extra characters of <T1>. +% All accented characters are already taken care of by the inheritance list. +% \begin{macrocode} +%<*cmr|bch> +\SetProtrusion +%<cmr> [ name = cmr-T5, +%<cmr> load = cmr-default ] +%<bch> [ name = bch-T5, +%<bch> load = bch-default ] + { encoding = T5, +%<cmr> family = cmr } +%<bch> family = bch } + { +%<bch> _ = {100,100}, +%<bch> \textbackslash = {150,200}, +%<cmr> \textbackslash = {200,300}, +%<cmr> \textquotedblleft = {200,600}, +%<cmr> \textquotedbl = {300,300}, +%<bch> \quotesinglbase = {400,400}, \quotedblbase = {300,300}, +%<cmr> \quotesinglbase = {400,400}, \quotedblbase = {400,400}, +%<bch> \guilsinglleft = {400,300}, \guilsinglright = {300,400}, +%<cmr> \guilsinglleft = {400,400}, \guilsinglright = {300,500}, +%<bch> \guillemotleft = {200,200}, \guillemotright = {150,300}, +%<cmr> \guillemotleft = {300,200}, \guillemotright = {100,400}, +%<bch> \textbraceleft = {200, }, \textbraceright = { ,300}, +%<cmr> \textbraceleft = {400,200}, \textbraceright = {200,400}, + \textless = {200,100}, \textgreater = {100,200} + } + +%</cmr|bch> +% \end{macrocode} +% Minion with lining numbers. +% \begin{macrocode} +%<*pmn> +\SetProtrusion + [ name = pmnx-OT1, + load = pmnj-default ] + { encoding = OT1, + family = pmnx } + { + 1 = {230,180} + } + +\SetProtrusion + [ name = pmnx-T1, + load = pmnj-T1 ] + { encoding = {T1,LY1}, + family = pmnx } + { + 1 = {230,180} + } + +\SetProtrusion + [ name = pmnx-T2A, + load = pmnj-T2A ] + { encoding = {T2A}, + family = pmnx } + { + 1 = {230,180} + } + +%</pmn> +% \end{macrocode} +% Times is the default font for <LY1>, therefore we provide settings for the +% additional characters in this encoding, too. +%\changes{v1.8}{2005/04/26}{add <LY1> characters for Times} +% \begin{macrocode} +%<*ptm> + \SetProtrusion + [ name = ptm-LY1, + load = ptm-T1 ] + { encoding = LY1, + family = {ptm,ptmx,ptmj} } + { + _ = {100,100}, + \texttrademark = {100,100}, + \textregistered = {100,100}, + \textcopyright = {100,100}, + \textdegree = {300,300}, + \textminus = {200,200}, + \textellipsis = {150,200}, +% \texteuro = { , }, % ? + \textcent = {100,100}, + \textquotesingle = {500,500}, + \textflorin = { 50, 70}, + \textdagger = {150,150}, + \textdaggerdbl = {100,100}, + \textperthousand = { , 50}, + \textbullet = {150,150}, + \textonesuperior = {100,100}, + \texttwosuperior = { 50, 50}, + \textthreesuperior = { 50, 50}, + \textperiodcentered = {300,300}, + \textplusminus = { 50, 80}, + \textmultiply = {100,100}, + \textdivide = { 50,150} +% \end{macrocode} +% Remaining slots in the source file. +%\iffalse +% \textbrokenbar = { , }, +% \textyen = { , }, +% \textfractionsolidus = { , }, +% \textordfeminine = { , }, +% \textordmasculine = { , }, +% \textmu = { , }, +% \textparagraph = { , }, +% \textonequarter = { , }, +% \textonehalf = { , }, +% \textthreequarters = { , }, +%\fi +% \begin{macrocode} + } + +%</ptm> +% \end{macrocode} +% +%\subsubsection{Italics} +% +%\changes{v1.4b}{2004/11/22}{slanted like italics} +%\changes{v1.6}{2004/12/26}{add italic uppercase Greek letters} +% +% To find default settings for italic is difficult, since the character shapes +% and their behaviour at the beginning or end of line may be wildly different +% for different fonts. In the generic settings we therefore omit the letters, +% and only set up the punctuation characters. +% +% The italic glyphs of Computer Modern Roman feature a lot of side bearing, +% therefore almost all of them have to protrude.\footnote{Settings +% contributed by \contributor Hendrik Vogt <hendrik.vogt\at tu-dresden.de>.} +%\changes{v2.5}{2011/04/09}{improvements to Computer Modern Roman italics +% (contributed by \contributor Hendrik Vogt <hendrik.vogt\at tu-dresden.de>)} +% ^^A private mail, 2011/02/24 +% ^^A (beta:07) +% +% \begin{macrocode} +\SetProtrusion +%<m-t> [ name = OT1-it ] +%<bch> [ name = bch-it ] +%<blg> [ name = blg-it, +%<blg> load = blg-default ] +%<cmr> [ name = cmr-it ] +%<pad> [ name = pad-it ] +%<pmn> [ name = pmnj-it ] +%<ppl> [ name = ppl-it ] +%<ptm> [ name = ptm-it ] +%<ugm> [ name = ugm-it ] +%<m-t|bch|blg|pad|ugm> { encoding = OT1, +%<ppl|ptm> { encoding = {OT1,OT4}, +%<bch> family = bch, +%<blg> family = blg, +%<pad> family = {pad,padx,padj}, +%<ppl> family = {ppl,pplx,pplj}, +%<ptm> family = {ptm,ptmx,ptmj}, +%<ugm> family = ugm, +%<m-t|bch|pad|ppl|ptm> shape = {it,sl} } +%<blg|ugm> shape = it } +%<cmr|pmn> { } + { +%<cmr> A = {100,100}, +%<ptm> A = {100,50}, +%<pad|pmn> A = {50, }, +%<ugm> A = { ,150}, +%<ppl> A = {50,50}, +%<ptm> \AE = {100, }, +%<pad|ppl> \AE = {50, }, +%<cmr> B = {83,-40}, +%<pad|ppl|ptm> B = {50, }, +%<pmn> B = {20,-50}, +%<bch|ppl|ptm|ugm> C = {50, }, +%<cmr> C = {165,-75}, +%<pad> C = {100, }, +%<pmn> C = {50,-50}, +%<cmr> D = {75, -28}, +%<pad|ppl|ptm> D = {50,50}, +%<pmn> D = {20, }, +%<cmr> E = {80,-55}, +%<pad|ppl|ptm> E = {50, }, +%<pmn> E = {20,-50}, +%<cmr> F = {85,-80}, +%<pad|ptm> F = {100, }, +%<pmn> F = {10, }, +%<ppl> F = {50, }, +%<bch|ppl|ptm|ugm> G = {50, }, +%<cmr> G = {153,-15}, +%<pad> G = {100, }, +%<pmn> G = {50,-50}, +%<cmr> H = {73,-60}, +%<pad|ppl|ptm> H = {50, }, +%<cmr> I = {140,-120}, +%<pad|ptm> I = {50, }, +%<pmn> I = {20,-50}, +%<cmr> J = {135,-80}, +%<pad> J = {50, }, +%<pmn> J = {20, }, +%<ptm> J = {100, }, +%<cmr> K = {70,-30}, +%<pad|ppl|ptm> K = {50, }, +%<pmn> K = {20, }, +%<cmr> L = {87, 40}, +%<pad|ppl|ptm> L = {50, }, +%<pmn> L = {20,50}, +%<ugm> L = { ,100}, +%<cmr> M = {67,-45}, +%<pmn> M = { ,-30}, +%<ptm> M = {50, }, +%<cmr> N = {75,-55}, +%<pmn> N = { ,-30}, +%<ptm> N = {50, }, +%<bch|pmn|ppl|ptm> O = {50, }, +%<cmr> O = {150,-30}, +%<pad> O = {100, }, +%<ugm> O = {70,50}, +%<ppl|ptm> \OE = {50, }, +%<pad> \OE = {100, }, +%<cmr> P = {82,-50}, +%<pad|ppl|ptm> P = {50, }, +%<pmn> P = {20,-50}, +%<bch|pmn|ppl|ptm> Q = {50, }, +%<cmr> Q = {150,-30}, +%<pad> Q = {100, }, +%<ugm> Q = {70,50}, +%<cmr> R = {75, 15}, +%<pad|ppl|ptm> R = {50, }, +%<pmn> R = {20, }, +%<bch|pad|ppl|ptm> S = {50, }, +%<cmr> S = {90,-65}, +%<pmn> S = {20,-30}, +%<bch|pad|ppl|ptm> $ = {50, }, +%<cmr> $ = {100,-20}, +%<pmn> $ = {20,-30}, +%<bch|pmn|ugm> T = {70, }, +%<cmr> T = {220,-85}, +%<pad|ppl|ptm> T = {100, }, +%<cmr> U = {230,-55}, +%<pad|ppl|ptm> U = {50, }, +%<pmn> U = {50,-50}, +%<cmr> V = {260,-60}, +%<pad|pmn|ugm> V = {100, }, +%<ppl|ptm> V = {100,50}, +%<cmr> W = {185,-55}, +%<pad|pmn|ugm> W = {100, }, +%<ppl> W = {50, }, +%<ptm> W = {100,50}, +%<cmr> X = {70,-30}, +%<ppl|ptm> X = {50, }, +%<cmr> Y = {250,-60}, +%<pmn> Y = {50, }, +%<ppl> Y = {100,50}, +%<ptm> Y = {100, }, +%<cmr> Z = {90,-60}, +%<pmn> Z = { ,-50}, +%<cmr> a = {150,-10}, +%<cmr> b = {170, }, +%<cmr> c = {173,-10}, +%<cmr> d = {150,-55}, +%<pmn> d = { ,-50}, +%<cmr> e = {180, }, +%<cmr> f = { ,-250}, +%<pad|pmn> f = { ,-100}, +%<cmr> g = {150,-10}, +%<cmr> h = {100, }, +%<cmr> i = {210, }, +%<pmn> i = { ,-30}, +%<cmr> j = { ,-40}, +%<pmn> j = { ,-30}, +%<cmr> k = {110,-50}, +%<cmr> l = {240,-110}, +%<pmn> l = { ,-100}, +%<cmr> m = {80, }, +%<cmr> n = {115, }, +%<bch> o = {50,50}, +%<cmr> o = {155, }, +%<bch> p = { ,50}, +%<pmn> p = {-50, }, +%<bch> q = {50, }, +%<cmr> q = {170,-40}, +%<cmr> r = {155,-40}, +%<pmn> r = { ,50}, +%<cmr> s = {130, }, +%<bch> t = { ,50}, +%<cmr> t = {230,-10}, +%<cmr> u = {120, }, +%<cmr> v = {140,-25}, +%<pmn|ugm> v = {50, }, +%<bch> w = { ,50}, +%<cmr> w = {98,-20}, +%<pmn|ugm> w = {50, }, +%<cmr> x = {65,-40}, +%<bch> y = { ,50}, +%<cmr> y = {130,-20}, +%<cmr> z = {110,-80}, +%<cmr> 0 = {170,-85}, +%<bch|ptm> 1 = {150,100}, +%<cmr> 1 = {230,110}, +%<pad> 1 = {150, }, +%<pmn> 1 = {50, }, +%<ppl> 1 = {100, }, +%<ugm> 1 = {150,150}, +%<cmr> 2 = {130,-70}, +%<pad|ppl|ptm> 2 = {50, }, +%<pmn> 2 = {-50, }, +%<bch> 3 = {50, }, +%<cmr> 3 = {140,-70}, +%<pmn> 3 = {-100, }, +%<ptm> 3 = {100,50}, +%<bch> 4 = {100, }, +%<cmr> 4 = {130,80}, +%<pad> 4 = {150, }, +%<ppl|ptm> 4 = {50, }, +%<cmr> 5 = {160, }, +%<ptm> 5 = {50, }, +%<bch> 6 = {50, }, +%<cmr> 6 = {175,-30}, +%<bch|pad|ptm> 7 = {100, }, +%<cmr> 7 = {250,-150}, +%<pmn> 7 = {20, }, +%<ppl> 7 = {50, }, +%<cmr> 8 = {130,-40}, +%<cmr> 9 = {155,-80}, +%<m-t|cmr|pad|pmn|ppl> . = { ,500}, +%<blg> . = {400,600}, +%<bch|ptm|ugm> . = { ,700}, +%<blg> {,}= {300,500}, +%<m-t|pad|pmn|ppl> {,}= { ,500}, +%<cmr> {,}= { ,450}, +%<bch|ugm> {,}= { ,600}, +%<ptm> {,}= { ,700}, +%<m-t|cmr|pad|ppl> : = { ,300}, +%<bch|ugm> : = { ,400}, +%<pmn> : = { ,200}, +%<ptm> : = { ,500}, +%<m-t|cmr|pad|ppl> ; = { ,300}, +%<bch|ugm> ; = { ,400}, +%<pmn> ; = { ,200}, +%<ptm> ; = { ,500}, +%<ptm> ! = { ,100}, +%<bch> ? = { ,200}, +%<ptm> ? = { ,100}, +%<ppl> ? = { ,300}, +%<pmn> " = {400,200}, +%<m-t|pad|pmn|ppl|ptm> & = {50,50}, +%<bch> & = { ,80}, +%<cmr> & = {130,30}, +%<ugm> & = {50,100}, +%<m-t|pad|pmn> \% = {100, }, +%<cmr> \% = {180,50}, +%<bch> \% = {50,50}, +%<ppl|ptm> \% = {100,100}, +%<ugm> \% = {100,50}, +%<m-t|pmn|ppl> * = {200,200}, +%<bch> * = {300,200}, +%<cmr> * = {380,20}, +%<pad> * = {500,100}, +%<ptm|ugm> * = {400,200}, +%<m-t|pmn|ppl> + = {150,200}, +%<cmr> + = {180,200}, +%<bch|ugm> + = {250,250}, +%<pad|ptm> + = {250,200}, +%<m-t|pad|pmn|ppl> @ = {50,50}, +%<bch> @ = {80,50}, +%<cmr> @ = {180,10}, +%<ptm> @ = {150,150}, +%<m-t|bch|ugm> ~ = {150,150}, +%<cmr|pad|pmn|ppl|ptm> ~ = {200,150}, +%<ugm> {=}= {200,200}, +%<m-t|bch|pad|pmn|ppl|ptm|ugm> ( = {200, }, ) = { ,200}, +%<cmr> ( = {300, }, ) = { ,70}, +%<m-t|pad|ppl|ptm|ugm> / = {100,200}, +%<cmr> / = {100,100}, +%<bch> / = { ,150}, +%<pmn> / = {100,150}, +%<m-t> - = {300,300}, +%<bch|pad> - = {300,400}, +%<pmn> - = {200,300}, +%<cmr> - = {500,300}, +%<ppl> - = {300,500}, +%<ptm> - = {500,500}, +%<ugm> - = {400,700}, +%<blg> _ = {0,300}, +%<m-t|pmn> \textendash = {200,200}, \textemdash = {150,150}, +%<bch> \textendash = {200,300}, \textemdash = {150,200}, +%<cmr> \textendash = {500,300}, \textemdash = {400,170}, +%<pad|ppl|ptm|ugm> \textendash = {300,300}, \textemdash = {200,200}, +%<m-t|bch|pmn|ugm> \textquoteleft = {400,200}, \textquoteright = {400,200}, +%<blg> \textquoteleft = {400,400}, \textquoteright = {400,400}, +%<cmr> \textquoteleft = {800,200}, \textquoteright = {800,-20}, +%<pad> \textquoteleft = {800,200}, \textquoteright = {800,200}, +%<ppl> \textquoteleft = {700,400}, \textquoteright = {700,400}, +%<ptm> \textquoteleft = {800,500}, \textquoteright = {800,500}, +%<m-t|bch|pmn> \textquotedblleft = {400,200}, \textquotedblright = {400,200} +%<blg> \textquotedblright = {300,300} +%<cmr> \textquotedblleft = {540,100}, \textquotedblright = {500,100} +%<pad> \textquotedblleft = {700,200}, \textquotedblright = {700,200} +%<ppl> \textquotedblleft = {500,300}, \textquotedblright = {500,300} +%<ptm> \textquotedblleft = {700,400}, \textquotedblright = {700,400} +%<ugm> \textquotedblleft = {600,200}, \textquotedblright = {600,200} + } + +%<*cmr|pmn> +\SetProtrusion +%<cmr> [ name = cmr-it-OT1, +%<pmn> [ name = pmnj-it-OT1, +%<cmr> load = cmr-it ] +%<pmn> load = pmnj-it ] +%<cmr> { encoding = {OT1,OT4}, +%<pmn> { encoding = OT1, +%<cmr> family = cmr, +%<pmn> family = pmnj, +%<cmr> shape = it } +%<pmn> shape = {it,sl} } + { +%<cmr> \AE = {100, }, +%<pmn> \AE = { ,-50}, +%<cmr> \OE = {100, }, +%<pmn> \OE = {50, } +%<*cmr> + "00 = {200,150}, % \Gamma + "01 = {150,100}, % \Delta + "02 = {150, 50}, % \Theta + "03 = {150, 50}, % \Lambda + "04 = {100,100}, % \Xi + "05 = {100,100}, % \Pi + "06 = {100, 50}, % \Sigma + "07 = {200,150}, % \Upsilon + "08 = {150, 50}, % \Phi + "09 = {150,100}, % \Psi + "0A = { 50, 50} % \Omega +%</cmr> + } + +%</cmr|pmn> +\SetProtrusion +%<m-t> [ name = T1-it-default, +%<bch> [ name = bch-it-T1, +%<blg> [ name = blg-it-T1, +%<cmr> [ name = cmr-it-T1, +%<pad> [ name = pad-it-T1, +%<pmn> [ name = pmnj-it-T1, +%<ppl> [ name = ppl-it-T1, +%<ptm> [ name = ptm-it-T1, +%<ugm> [ name = ugm-it-T1, +%<m-t> load = OT1-it ] +%<bch> load = bch-it ] +%<blg> load = blg-T1 ] +%<cmr> load = cmr-it ] +%<pmn> load = pmnj-it ] +%<pad> load = pad-it ] +%<ppl> load = ppl-it ] +%<ptm> load = ptm-it ] +%<ugm> load = ugm-it ] +%<m-t|bch|cmr|pad|pmn|ppl> { encoding = {T1,LY1}, +%<blg|ptm|ugm> { encoding = T1, +%<bch> family = bch, +%<blg> family = blg, +%<cmr> family = cmr, +%<pmn> family = pmnj, +%<pad> family = {pad,padx,padj}, +%<ppl> family = {ppl,pplx,pplj}, +%<ptm> family = {ptm,ptmx,ptmj}, +%<ugm> family = ugm, +%<m-t|bch|pad|pmn|ppl|ptm> shape = {it,sl} } +%<blg|cmr|ugm> shape = it } + { +%<m-t|bch|pmn> _ = { ,100}, +%<blg> _ = {0,300}, +%<cmr|ugm> _ = {100,200}, +%<pad|ppl|ptm> _ = {100,100}, +%<blg> . = {400,600}, +%<blg> {,}= {300,500}, +%<cmr> \AE = {100, }, +%<pmn> \AE = { ,-50}, +%<bch|pmn> \OE = { 50, }, +%<cmr> \OE = {100, }, +%<pmn> 031 = { ,-100}, % ffl +%<cmr|ptm> 156 = {100, }, % IJ +%<pad> 156 = {50, }, % IJ +%<pmn> 156 = {20, }, % IJ +%<pmn> 188 = { ,-30}, % ij +%<pmn> \v t = { ,100}, +%<m-t|pad|ppl|ptm> \textbackslash = {100,200}, +%<cmr|ugm> \textbackslash = {300,300}, +%<bch> \textbackslash = {150,150}, +%<pmn> \textbackslash = {100,150}, +%<ugm> \textbar = {200,200}, +%<cmr> \textquotedblleft = {500,300}, +%<blg> \textquoteleft = {400,400}, \textquoteright = {400,400}, +%<blg> \textquotedbl = {300,300}, \textquotedblleft = {300,300}, +%<blg> \textquotedblright = {300,300}, \quotedblbase = {200,600}, +%<m-t|ptm> \quotesinglbase = {300,700}, \quotedblbase = {400,500}, +%<cmr> \quotesinglbase = {300,700}, \quotedblbase = {200,600}, +%<bch|pmn> \quotesinglbase = {200,500}, \quotedblbase = {150,500}, +%<pad|ppl> \quotesinglbase = {500,500}, \quotedblbase = {400,400}, +%<ugm> \quotesinglbase = {300,700}, \quotedblbase = {300,500}, +%<m-t|ppl|ptm> \guilsinglleft = {400,400}, \guilsinglright = {300,500}, +%<bch|pmn> \guilsinglleft = {300,400}, \guilsinglright = {200,500}, +%<cmr> \guilsinglleft = {500,300}, \guilsinglright = {400,400}, +%<pad> \guilsinglleft = {500,400}, \guilsinglright = {300,500}, +%<ugm> \guilsinglleft = {400,400}, \guilsinglright = {300,600}, +%<m-t|ppl> \guillemotleft = {300,300}, \guillemotright = {300,300}, +%<bch|pmn> \guillemotleft = {200,300}, \guillemotright = {150,400}, +%<cmr> \guillemotleft = {400,100}, \guillemotright = {200,300}, +%<pad> \guillemotleft = {300,300}, \guillemotright = {200,400}, +%<ptm> \guillemotleft = {300,400}, \guillemotright = {200,400}, +%<ugm> \guillemotleft = {300,400}, \guillemotright = {300,400}, +%<m-t|pad|ppl|ugm> \textexclamdown = {100, }, \textquestiondown = {200, }, +%<cmr|ptm> \textexclamdown = {200, }, \textquestiondown = {200, }, +%<pmn> \textexclamdown = {-50, }, \textquestiondown = {-50, }, +%<m-t|ppl|ugm> \textbraceleft = {200,100}, \textbraceright = {200,200}, +%<bch|pmn> \textbraceleft = {200, }, \textbraceright = { ,200}, +%<cmr|pad|ptm> \textbraceleft = {400,100}, \textbraceright = {200,200}, +%<bch|pmn> \textless = {100, }, \textgreater = { ,100}, +%<cmr|pad|ppl|ptm> \textless = {300,100}, \textgreater = {200,100} +%<pmn> \textvisiblespace = {100,100} + } + +%<*m-t|cmr|pmn> +\SetProtrusion +%<m-t> [ name = T2A-it-default, +%<cmr> [ name = cmr-it-T2A, +%<pmn> [ name = pmnj-it-T2A, +%<m-t> load = OT1-it ] +%<cmr> load = cmr-it ] +%<pmn> load = pmnj-it ] + { encoding = T2A, +%<cmr> family = cmr, +%<pmn> family = pmnj, +%<m-t|pmn> shape = {it,sl} } +%<cmr> shape = it } + { +%<cmr> \CYRA = {100,50}, +%<pmn> \CYRA = {50, }, +%<cmr> \CYRB = {50, }, +%<cmr> \CYRV = {50, }, +%<pmn> \CYRV = {20,-50}, +%<cmr> \CYRG = {100, }, +%<pmn> \CYRG = {10, }, +%<cmr> \CYRD = {50, }, +%<cmr> \CYRE = {50, }, +%<pmn> \CYRE = {20,-50}, +%<cmr> \CYRZH = {50, }, +%<cmr> \CYRZ = {50, }, +%<pmn> \CYRZ = {20,-50}, +%<cmr> \CYRI = {50, }, +%<pmn> \CYRI = { ,-30}, +%<cmr> \CYRISHRT = {50, }, +%<cmr> \CYRK = {50, }, +%<pmn> \CYRK = {20, }, +%<cmr> \CYRL = {50, }, +%<cmr> \CYRM = {50, }, +%<pmn> \CYRM = { ,-30}, +%<cmr> \CYRN = {50, }, +%<cmr> \CYRO = {100, }, +%<pmn> \CYRO = {50, }, +%<cmr> \CYRP = {50, }, +%<cmr> \CYRR = {50, }, +%<pmn> \CYRR = {20,-50}, +%<cmr> \CYRS = {100, }, +%<pmn> \CYRS = {50, }, +%<cmr> \CYRT = {100, }, +%<pmn> \CYRT = {70, }, +%<cmr> \CYRU = {100, }, +%<pmn> \CYRU = {50, }, +%<cmr> \CYRF = {100, }, +%<cmr> \CYRH = {50, }, +%<cmr> \CYRC = {50, }, +%<cmr> \CYRCH = {100, }, +%<cmr> \CYRSH = {50, }, +%<cmr> \CYRSHCH = {50, }, +%<cmr> \CYRHRDSN = {100, }, +%<cmr> \CYRERY = {50, }, +%<cmr> \CYRSFTSN = {50, }, +%<cmr> \CYREREV = {50, }, +%<cmr> \CYRYU = {50, }, +%<cmr> \CYRYA = {50, }, +%<pmn> \CYRYA = { ,20}, +%<pmn> \cyrr = {-50, }, +%<m-t|pmn> _ = { ,100}, +%<cmr> _ = {100,200}, +%<pmn> 031 = { ,-100}, % ffl +%<pmn> \v t = { ,100}, +%<m-t> \textbackslash = {100,200}, \quotedblbase = {400,500}, +%<cmr> \textbackslash = {300,300}, \quotedblbase = {200,600}, +%<pmn> \textbackslash = {100,150}, \quotedblbase = {150,500}, +%<m-t> \guillemotleft = {300,300}, \guillemotright = {300,300}, +%<cmr> \guillemotleft = {400,100}, \guillemotright = {200,300}, +%<pmn> \guillemotleft = {200,300}, \guillemotright = {150,400}, +%<m-t> \textbraceleft = {200,100}, \textbraceright = {200,200}, +%<cmr> \textbraceleft = {400,100}, \textbraceright = {200,200}, +%<pmn> \textbraceleft = {200, }, \textbraceright = { ,200}, +%<cmr> \textquotedblleft = {500,300}, +%<cmr> \textless = {300,100}, \textgreater = {200,100} +%<pmn> \textless = {100, }, \textgreater = { ,100} + } + +%</m-t|cmr|pmn> +%<*m-t|ptm> +\SetProtrusion +%<m-t> [ name = QX-it-default, +%<ptm> [ name = ptm-it-QX, +%<m-t> load = OT1-it ] +%<ptm> load = ptm-it ] + { encoding = {QX}, +%<ptm> family = {ptm,ptmx,ptmj}, + shape = {it,sl} } + { +%<ptm> 009 = { , 50}, % fk + {=} = {100,100}, +%<m-t> \textunderscore = {100,100}, +%<ptm> \textunderscore = {100,150}, + \textbackslash = {100,200}, + \quotedblbase = {300,400}, +%<m-t> \guillemotleft = {300,300}, \guillemotright = {300,300}, +%<ptm> \guillemotleft = {200,400}, \guillemotright = {200,400}, + \textexclamdown = {200, }, \textquestiondown = {200, }, + \textbraceleft = {200,100}, \textbraceright = {200,200}, + \textless = {100,100}, \textgreater = {100,100}, + \textminus = {200,200}, \textdegree = {300,150}, +%<m-t> \copyright = {100,100}, \textregistered = {100,100} +%<ptm> \textregistered = {100,150}, \copyright = {100,150}, +%<ptm> \textDelta = { 70, }, \textdelta = { , 50}, +%<ptm> \textpi = { 50, 80}, \textmu = { , 80}, +%<ptm> \texteuro = {200, }, \textellipsis = {100,200}, +%<ptm> \textquoteleft = {500,400}, \textquoteright = {500,400}, +%<ptm> \textquotedblleft = {500,300}, \textquotedblright = {400,400}, +%<ptm> \textapprox = { 50, 50}, \textinfty = {100,100}, +%<ptm> \textdagger = {150,150}, \textdaggerdbl = {100,100}, +%<ptm> \textdiv = {150,150}, \textasciitilde = { 80, 80}, +%<ptm> \texttimes = {100,150}, \textpm = { 50, 80}, +%<ptm> \textbullet = {300,100}, \textperiodcentered = {300,300}, +%<ptm> \textquotesingle = {500,500}, \textquotedbl = {300,300}, +%<ptm> \textperthousand = { ,50} + } + +%</m-t|ptm> +%<*cmr|bch> +\SetProtrusion +%<cmr> [ name = cmr-it-T5, +%<cmr> load = cmr-it ] +%<bch> [ name = bch-it-T5, +%<bch> load = bch-it ] + { encoding = T5, +%<bch> family = bch, +%<cmr> family = cmr, + shape = it } + { +%<bch> _ = { ,100}, +%<cmr> _ = {100,200}, +%<bch> \textbackslash = {150,150}, +%<cmr> \textbackslash = {300,300}, +%<bch> \quotesinglbase = {200,500}, \quotedblbase = {150,500}, +%<cmr> \quotesinglbase = {300,700}, \quotedblbase = {200,600}, +%<bch> \guilsinglleft = {300,400}, \guilsinglright = {200,500}, +%<cmr> \guilsinglleft = {500,300}, \guilsinglright = {400,400}, +%<bch> \guillemotleft = {200,300}, \guillemotright = {150,400}, +%<cmr> \guillemotleft = {400,100}, \guillemotright = {200,300}, +%<bch> \textbraceleft = {200, }, \textbraceright = { ,200}, +%<cmr> \textbraceleft = {400,100}, \textbraceright = {200,200}, +%<bch> \textless = {100, }, \textgreater = { ,100} +%<cmr> \textless = {300,100}, \textgreater = {200,100} + } + +%</cmr|bch> +% \end{macrocode} +%\changes{v1.8}{2005/06/01}{verified settings for slanted Computer Modern Roman} +% Slanted is very similar to italic. +% \begin{macrocode} +%<*cmr> +\SetProtrusion + [ name = cmr-sl, + load = cmr-it-OT1 ] + { encoding = {OT1,OT4}, + family = cmr, + shape = sl } + { + L = { ,50}, + f = { ,-50}, + - = {300, }, + \textendash = {400, }, \textemdash = {300, } + } + +\SetProtrusion + [ name = cmr-sl-T1, + load = cmr-it-T1 ] + { encoding = {T1,LY1}, + family = cmr, + shape = sl } + { + L = { ,50}, + f = { ,-50}, + - = {300, }, + \textendash = {400, }, \textemdash = {300, } + } + +\SetProtrusion + [ name = cmr-sl-T2A, + load = cmr-it-T2A ] + { encoding = T2A, + family = cmr, + shape = sl } + { + L = { ,50}, + f = { ,-50}, + - = {300, }, + \textendash = {400, }, \textemdash = {300, } + } + +\SetProtrusion + [ name = cmr-sl-T5, + load = cmr-it-T5 ] + { encoding = T5, + family = cmr, + shape = sl } + { + L = { ,50}, + f = { ,-50}, + - = {300, }, + \textendash = {400, }, \textemdash = {300, } + } + +\SetProtrusion + [ name = lmr-it-T1, + load = cmr-it-T1 ] + { encoding = {T1,LY1}, + family = lmr, + shape = {it,sl} } + { + \textquotedblleft = { ,200}, \textquotedblright = { ,200}, + \quotesinglbase = { ,400}, \quotedblbase = { ,500} + } + +% \end{macrocode} +% Oldstyle numerals are slightly different. +% \begin{macrocode} +\SetProtrusion + [ name = cmr(oldstyle)-it, + load = cmr-it-T1 ] + { encoding = T1, + family = {hfor,cmor}, + shape = {it,sl} } + { + 1 = {250, 50}, + 2 = {150,-100}, + 3 = {100,-50}, + 4 = {150,150}, + 6 = {200, }, + 7 = {200, 50}, + 8 = {150,-50}, + 9 = {100, 50} + } + +%</cmr> +%<*pmn> +\SetProtrusion + [ name = pmnx-it, + load = pmnj-it ] + { encoding = OT1, + family = pmnx, + shape = {it,sl} } + { + 1 = {100,150} + } + +\SetProtrusion + [ name = pmnx-it-T1, + load = pmnj-it-T1 ] + { encoding = {T1,LY1}, + family = pmnx, + shape = {it,sl} } + { + 1 = {100,150} + } + +\SetProtrusion + [ name = pmnx-it-T2A, + load = pmnj-it-T2A ] + { encoding = {T2A}, + family = pmnx, + shape = {it,sl} } + { + 1 = {100,150} + } + +%</pmn> +%<*ptm> +\SetProtrusion + [ name = ptm-it-LY1, + load = ptm-it-T1 ] + { encoding = {LY1}, + family = {ptm,ptmx,ptmj}, + shape = {it,sl} } + { + _ = {100,100}, + \texttrademark = {100,100}, + \textregistered = {100,100}, + \textcopyright = {100,100}, + \textdegree = {300,100}, + \textminus = {200,200}, + \textellipsis = {100,200}, +% \texteuro = { , }, % ? + \textcent = {100,100}, + \textquotesingle = {500, }, + \textflorin = {100, 70}, + \textdagger = {150,150}, + \textdaggerdbl = {100,100}, + \textbullet = {150,150}, + \textonesuperior = {150,100}, + \texttwosuperior = {150, 50}, + \textthreesuperior = {150, 50}, + \textparagraph = {100, }, + \textperiodcentered = {500,300}, + \textonequarter = { 50, }, + \textonehalf = { 50, }, + \textplusminus = {100,100}, + \textmultiply = {150,150}, + \textdivide = {150,150} + } + +%</ptm> +% \end{macrocode} +% +%\subsubsection{Small caps} +% +% Small caps should inherit the values from their big brothers. Since values are +% relative to character width, we don't need to adjust them any further (but +% we have to reset some characters). +% \begin{macrocode} +%<*!(blg|ugm)> +\SetProtrusion +%<m-t> [ name = OT1-sc, +%<bch> [ name = bch-sc, +%<cmr> [ name = cmr-sc-OT1, +%<pad> [ name = pad-sc, +%<pmn> [ name = pmnj-sc, +%<ppl> [ name = ppl-sc, +%<ptm> [ name = ptm-sc, +%<m-t> load = default ] +%<bch> load = bch-default ] +%<cmr> load = cmr-OT1 ] +%<pad> load = pad-default ] +%<pmn> load = pmnj-default ] +%<ppl> load = ppl-default ] +%<ptm> load = ptm-default ] +%<m-t|bch|pad|pmn> { encoding = OT1, +%<cmr|ppl|ptm> { encoding = {OT1,OT4}, +%<bch> family = bch, +%<cmr> family = cmr, +%<pad> family = {pad,padx,padj}, +%<pmn> family = pmnj, +%<ppl> family = {ppl,pplx,pplj}, +%<ptm> family = {ptm,ptmx,ptmj}, + shape = sc } + { + a = {50,50}, +%<cmr|pad|ppl|ptm> \ae = {50, }, +%<bch|pmn> c = {50, }, +%<bch|pad|pmn> d = { ,50}, +%<m-t|bch|cmr|pad|pmn|ptm> f = { ,50}, +%<bch|pad|pmn> g = {50, }, +%<m-t|cmr|pad|pmn|ppl|ptm> j = {50, }, +%<bch> j = {100, }, +%<m-t|bch|cmr|pad|pmn|ppl> l = { ,50}, +%<ptm> l = { ,80}, +%<m-t|bch|cmr|pad|pmn|ppl> 013 = { ,50}, % fl +%<ptm> 013 = { ,80}, % fl +%<bch|pad|pmn> o = {50,50}, +%<pad|pmn> \oe = {50, }, +%<ppl> p = { 0, 0}, +%<bch|pad|pmn> q = {50,70}, +%<ppl> q = { 0, }, +%<m-t|cmr|pad|pmn|ppl|ptm> r = { , 0}, + t = {50,50}, +%<m-t|bch|cmr|pad|pmn|ppl> y = {50,50} +%<ptm> y = {80,80} + } + +\SetProtrusion +%<m-t> [ name = T1-sc, +%<bch> [ name = bch-sc-T1, +%<cmr> [ name = cmr-sc-T1, +%<pad> [ name = pad-sc-T1, +%<pmn> [ name = pmnj-sc-T1, +%<ppl> [ name = ppl-sc-T1, +%<ptm> [ name = ptm-sc-T1, +%<m-t> load = T1-default ] +%<bch> load = bch-T1 ] +%<cmr> load = cmr-T1 ] +%<pad> load = pad-T1 ] +%<pmn> load = pmnj-T1 ] +%<ppl> load = ppl-T1 ] +%<ptm> load = ptm-T1 ] + { encoding = {T1,LY1}, +%<bch> family = bch, +%<cmr> family = cmr, +%<pad> family = {pad,padx,padj}, +%<pmn> family = pmnj, +%<ppl> family = {ppl,pplx,pplj}, +%<ptm> family = {ptm,ptmx,ptmj}, + shape = sc } + { + a = {50,50}, +%<cmr|pad|ppl|ptm> \ae = {50, }, +%<bch|pmn> c = {50, }, +%<bch|pad|pmn> d = { ,50}, +%<m-t|bch|cmr|pad|pmn|ptm> f = { ,50}, +%<bch|pad|pmn> g = {50, }, +%<m-t|cmr|pad|pmn|ppl|ptm> j = {50, }, +%<bch> j = {100, }, +%<m-t|bch|cmr|pad|pmn|ppl> l = { ,50}, +%<ptm> l = { ,80}, +%<m-t|bch|cmr|pad|pmn|ppl> 029 = { ,50}, % fl +%<ptm> 029 = { ,80}, % fl +%<bch|pad|pmn> o = {50,50}, +%<bch|pad|pmn> \oe = {50, }, +%<ppl> p = { 0, 0}, +%<bch|pad|pmn> q = {50,70}, +%<ppl> q = { 0, }, +%<m-t|cmr|pad|pmn|ppl|ptm> r = { , 0}, + t = {50,50}, +%<m-t|bch|cmr|pad|pmn|ppl> y = {50,50} +%<ptm> y = {80,80} + } + +%</!(blg|ugm)> +%<*m-t|cmr> +\SetProtrusion +%<m-t> [ name = T2A-sc, +%<cmr> [ name = cmr-sc-T2A, +%<m-t> load = T2A-default ] +%<cmr> load = cmr-T2A ] + { encoding = T2A, +%<cmr> family = cmr, + shape = sc } + { + \cyra = {50,50}, + \cyrg = { ,50}, + \cyrt = {50,50}, + \cyry = { ,50} + } + +%</m-t|cmr> +%<*m-t> +\SetProtrusion + [ name = QX-sc, + load = QX-default ] + { encoding = QX, + shape = sc } + { + a = {50,50}, + f = { ,50}, + j = {50, }, + l = { ,50}, + 013 = { ,50}, % fl + r = { , 0}, + t = {50,50}, + y = {50,50} + } + +%</m-t> +%<*cmr|bch> +\SetProtrusion +%<bch> [ name = bch-sc-T5, +%<bch> load = bch-T5 ] +%<cmr> [ name = cmr-sc-T5, +%<cmr> load = cmr-T5 ] + { encoding = T5, +%<bch> family = bch, +%<cmr> family = cmr, + shape = sc } + { + a = {50,50}, +%<bch> c = {50, }, +%<bch> d = { ,50}, + f = { ,50}, +%<bch> g = {50, }, +%<bch> j = {100, }, +%<cmr> j = {50, }, + l = { ,50}, +%<bch> o = {50,50}, +%<bch> q = { 0, }, +%<cmr> r = { , 0}, + t = {50,50}, + y = {50,50} + } + +%</cmr|bch> +%<*pmn> +\SetProtrusion + [ name = pmnx-sc, + load = pmnj-sc ] + { encoding = OT1, + family = pmnx, + shape = sc } + { + 1 = {230,180} + } + +\SetProtrusion + [ name = pmnx-sc-T1, + load = pmnj-sc-T1 ] + { encoding = {T1,LY1}, + family = pmnx, + shape = sc } + { + 1 = {230,180} + } + +% \end{macrocode} +% +%\subsubsection{Italic small caps} +% Minion provides real small caps in italics. +% The \pkg{slantsc} package calls them |scit|, Philipp Lehman's +% \pkg{fontinstallationguide} suggests |si|. +% \begin{macrocode} +\SetProtrusion + [ name = pmnj-scit, + load = pmnj-it ] + { encoding = OT1, + family = pmnj, + shape = {scit,si} } + { + a = {50, }, + \ae = { ,-50}, + b = {20,-50}, + c = {50,-50}, + d = {20, 0}, + e = {20,-50}, + f = {10, 0}, + 012 = {10,-50}, % fi + 013 = {10,-50}, % fl + 014 = {10,-50}, % ffi + 015 = {10,-50}, % ffl + g = {50,-50}, + i = {20,-50}, + j = {20, 0}, + k = {20, }, + l = {20,50}, + m = { ,-30}, + n = { ,-30}, + o = {50, }, + \oe = {50,-50}, + p = {20,-50}, + q = {50, }, + r = {20, 0}, + s = {20,-30}, + t = {70, }, + u = {50,-50}, + v = {100, }, + w = {100, }, + y = {50, }, + z = { ,-50} + } + +\SetProtrusion + [ name = pmnj-scit-T1, + load = pmnj-it-T1 ] + { encoding = {T1,LY1}, + family = pmnj, + shape = {scit,si} } + { + a = {50, }, + \ae = { ,-50}, + b = {20,-50}, + c = {50,-50}, + d = {20, 0}, + e = {20,-50}, + f = {10, 0}, + 028 = {10,-50}, % fi + 029 = {10,-50}, % fl + 030 = {10,-50}, % ffi + 031 = {10,-50}, % ffl + g = {50,-50}, + i = {20,-50}, + 188 = {20, 0}, % ij + j = {20, 0}, + k = {20, }, + l = {20,50}, + m = { ,-30}, + n = { ,-30}, + o = {50, }, + \oe = {50,-50}, + p = {20,-50}, + q = {50, }, + r = {20, 0}, + s = {20,-30}, + t = {70, }, + u = {50,-50}, + v = {100, }, + w = {100, }, + y = {50, }, + z = { ,-50} + } + +\SetProtrusion + [ name = pmnx-scit, + load = pmnj-scit ] + { encoding = OT1, + family = pmnx, + shape = {scit,si} } + { + 1 = {100,150} + } + +\SetProtrusion + [ name = pmnx-scit-T1, + load = pmnj-scit-T1 ] + { encoding = {T1,LY1}, + family = pmnx, + shape = {scit,si} } + { + 1 = {100,150} + } + +%</pmn> +% \end{macrocode} +% +%\subsubsection{Text companion} +% +% Finally the <TS1> encoding. +% Still quite incomplete for Times and especially Palatino. Anybody? +%\changes{v1.2}{2004/09/28}{add settings for Computer Modern Roman and +% Adobe Garamond in <TS1> encoding} +% \begin{macrocode} +\SetProtrusion +%<m-t> [ name = textcomp ] +%<bch> [ name = bch-textcomp ] +%<blg> [ name = blg-textcomp ] +%<cmr> [ name = cmr-textcomp ] +%<pad> [ name = pad-textcomp ] +%<pmn> [ name = pmn-textcomp ] +%<ppl> [ name = ppl-textcomp ] +%<ptm> [ name = ptm-textcomp ] +%<ugm> [ name = ugm-textcomp ] +%<m-t> { encoding = TS1 } +%<!m-t> { encoding = TS1, +%<bch> family = bch } +%<blg> family = blg } +%<cmr> family = cmr } +%<pad> family = {pad,padx,padj} } +%<pmn> family = {pmnx,pmnj} } +%<ppl> family = {ppl,pplx,pplj} } +%<ptm> family = {ptm,ptmx,ptmj} } +%<ugm> family = ugm } + { +%<blg> \textquotestraightbase = {400,500}, +%<cmr> \textquotestraightbase = {300,300}, +%<pad|pmn> \textquotestraightbase = {400,400}, +%<blg> \textquotestraightdblbase = {300,400}, +%<cmr|pmn> \textquotestraightdblbase = {300,300}, +%<pad> \textquotestraightdblbase = {400,400}, +%<bch|cmr|pad|pmn|ugm> \texttwelveudash = {200,200}, +%<bch|cmr|pad|pmn> \textthreequartersemdash = {150,150}, +%<ugm> \textthreequartersemdash = {200,200}, +%<blg> \textquotesingle = {500,600}, +%<cmr|pmn> \textquotesingle = {300,400}, +%<pad> \textquotesingle = {400,500}, +%<ptm> \textquotesingle = {500,500}, +%<ugm> \textquotesingle = {300,500}, +%<bch|cmr|pmn> \textasteriskcentered = {200,300}, +%<blg> \textasteriskcentered = {150,200}, +%<pad> \textasteriskcentered = {300,300}, +%<ugm> \textasteriskcentered = {100,200}, +%<pmn> \textfractionsolidus = {-200,-200}, +%<cmr> \textoneoldstyle = {100,100}, +%<pmn> \textoneoldstyle = { , 50}, +%<cmr> \textthreeoldstyle = { , 50}, +%<pad|pmn> \textthreeoldstyle = { 50, }, +%<cmr> \textfouroldstyle = { 50, 50}, +%<pad|pmn> \textfouroldstyle = { 50, }, +%<cmr|pad|pmn> \textsevenoldstyle = { 50, 80}, +%<cmr> \textlangle = {400, }, +%<cmr> \textrangle = { ,400}, +%<m-t|bch|pmn|ptm> \textminus = {200,200}, +%<cmr|pad|ppl> \textminus = {300,300}, +%<blg|ugm> \textminus = {250,300}, +%<bch|pad|pmn> \textlbrackdbl = {100, }, +%<blg> \textlbrackdbl = {200, }, +%<bch|pad|pmn> \textrbrackdbl = { ,100}, +%<blg> \textrbrackdbl = { ,200}, +%<pmn> \textasciigrave = {200,500}, +%<bch|blg|cmr|pad|pmn> \texttildelow = {200,250}, +%<pmn> \textasciibreve = {300,400}, +%<pmn> \textasciicaron = {300,400}, +%<pmn> \textacutedbl = {200,300}, +%<pmn> \textgravedbl = {150,300}, +%<bch|pmn|ugm> \textdagger = { 80, 80}, +%<blg> \textdagger = {200,200}, +%<cmr|pad> \textdagger = {100,100}, +%<ptm> \textdagger = {150,150}, +%<blg> \textdaggerdbl = {150,150}, +%<cmr|pad|pmn> \textdaggerdbl = { 80, 80}, +%<ptm> \textdaggerdbl = {100,100}, +%<bch> \textbardbl = {100,100}, +%<blg|ugm> \textbardbl = {150,150}, +%<bch> \textbullet = {200,200}, +%<blg> \textbullet = {400,500}, +%<cmr|pad|pmn> \textbullet = { ,100}, +%<ptm> \textbullet = {150,150}, +%<ugm> \textbullet = { 50,100}, +%<bch|cmr|pmn> \textcelsius = { 50, }, +%<pad> \textcelsius = { 80, }, +%<bch> \textflorin = { 50, 50}, +%<blg> \textflorin = {100,100}, +%<pad|ugm> \textflorin = { ,100}, +%<pmn> \textflorin = { 50,100}, +%<ptm> \textflorin = { 50, 70}, +%<cmr> \textcolonmonetary = { , 50}, +%<pad|pmn> \textcolonmonetary = { 50, }, +%<pmn> \textinterrobang = { ,100}, +%<pmn> \textinterrobangdown = {100, }, +%<m-t|pad|ptm> \texttrademark = {100,100}, +%<bch> \texttrademark = {150,150}, +%<blg|cmr|ppl> \texttrademark = {200,200}, +%<pmn> \texttrademark = { 50, 50}, +%<ugm> \texttrademark = {100,150}, +%<bch|ugm> \textcent = { 50, }, +%<ptm> \textcent = {100,100}, +%<bch> \textsterling = { 50, }, +%<ugm> \textsterling = { , 50}, +%<bch> \textbrokenbar = {200,200}, +%<blg> \textbrokenbar = {250,250}, +%<ugm> \textbrokenbar = {200,300}, +%<pmn> \textasciidieresis = {300,400}, +%<m-t|bch|cmr|pad|ptm|ugm> \textcopyright = {100,100}, +%<pmn> \textcopyright = {100,150}, +%<ppl> \textcopyright = {200,200}, +%<bch|cmr|ugm> \textordfeminine = {100,200}, +%<pad|pmn> \textordfeminine = {200,200}, +%<bch|cmr|pad|pmn|ugm> \textlnot = {200, }, +%<blg> \textlnot = {200,100}, +%<m-t|bch|cmr|pad|ptm|ugm> \textregistered = {100,100}, +%<pmn> \textregistered = { 50,150}, +%<ppl> \textregistered = {200,200}, +%<pmn> \textasciimacron = {150,200}, +%<m-t|ppl|ptm> \textdegree = {300,300}, +%<bch> \textdegree = {150,200}, +%<blg|ugm> \textdegree = {200,200}, +%<cmr|pad> \textdegree = {400,400}, +%<pmn> \textdegree = {150,400}, +%<bch|cmr|pad|pmn|ugm> \textpm = {150,200}, +%<blg> \textpm = {100,100}, +%<ptm> \textpm = { 50, 80}, +%<bch|blg|ugm> \texttwosuperior = {100,200}, +%<cmr> \texttwosuperior = { 50,100}, +%<pad|pmn> \texttwosuperior = {200,200}, +%<ptm> \texttwosuperior = { 50, 50}, +%<bch|blg|ugm> \textthreesuperior = {100,200}, +%<cmr> \textthreesuperior = { 50,100}, +%<pad|pmn> \textthreesuperior = {200,200}, +%<ptm> \textthreesuperior = { 50, 50}, +%<pmn> \textasciiacute = {300,400}, +%<bch|ugm> \textmu = { ,100}, +%<bch|pad|pmn> \textparagraph = { ,100}, +%<bch|cmr|pad|pmn> \textperiodcentered = {300,400}, +%<blg> \textperiodcentered = {400,500}, +%<ptm> \textperiodcentered = {300,300}, +%<ugm> \textperiodcentered = {200,500}, +%<bch|blg|ugm> \textonesuperior = {200,300}, +%<cmr|pad|pmn> \textonesuperior = {200,200}, +%<ptm> \textonesuperior = {100,100}, +%<bch|pad|pmn|ugm> \textordmasculine = {200,200}, +%<blg|cmr> \textordmasculine = {100,200}, +%<bch|cmr|pmn> \texteuro = {100, }, +%<pad> \texteuro = { 50,100}, +%<bch> \texttimes = {200,200}, +%<blg|ptm> \texttimes = {100,100}, +%<cmr> \texttimes = {150,250}, +%<pad> \texttimes = {100,150}, +%<pmn> \texttimes = { 70,100}, +%<ugm> \texttimes = {200,300}, +%<bch|pad|pmn> \textdiv = {150,200} +%<blg> \textdiv = {100,100} +%<cmr> \textdiv = {150,250} +%<ptm> \textdiv = { 50,100}, +%<ugm> \textdiv = {200,300}, +%<ptm> \textperthousand = { ,50} +%<ugm> \textsection = { ,100}, +%<ugm> \textonehalf = { 50,100}, +%<ugm> \textonequarter = { 50,100}, +%<ugm> \textthreequarters = { 50,100}, +%<ugm> \textsurd = { ,100} +% \end{macrocode} +% Remaining slots in the source file. +%\iffalse +% \textyen = { , }, +% \texttwooldstyle = { , }, +% \textfiveoldstyle = { , }, +% \textsixoldstyle = { , }, +% \texteightoldstyle = { , }, +% \textnineoldstyle = { , }, +% \textleftarrow = { , }, +% \textrightarrow = { , }, +% \textblank = { , }, +% \textdollar = { , }, +% \textdblhyphen = { , }, +% \textdblhyphenchar = { , }, +% \textohm = { , }, +% \textmho = { , }, +% \textbigcircle = { , }, +% \textuparrow = { , }, +% \textdownarrow = { , }, +% \textborn = { , }, +% \textdied = { , }, +% \textmarried = { , }, +% \textdivorced = { , }, +% \textleaf = { , }, +% \textmusicalnote = { , }, +% \textdollaroldstyle = { , }, +% \textcentoldstyle = { , }, +% \textwon = { , }, +% \textnaira = { , }, +% \textguarani = { , }, +% \textpeso = { , }, +% \textlira = { , }, +% \textrecipe = { , }, +% \textdong = { , }, +% \textpertenthousand = { , }, +% \textpilcrow = { , }, +% \textbaht = { , }, +% \textnumero = { , }, +% \textdiscount = { , }, +% \textestimated = { , }, +% \textopenbullet = { , }, +% \textservicemark = { , }, +% \textlquill = { , }, +% \textrquill = { , }, +% \textcopyleft = { , }, +% \textcircledP = { , }, +% \textreferencemark = { , }, +%\fi +% \begin{macrocode} + } + +%<*cmr|pad|pmn|ugm> +\SetProtrusion +%<cmr> [ name = cmr-textcomp-it ] +%<pad> [ name = pad-textcomp-it ] +%<pmn> [ name = pmn-textcomp-it ] +%<ugm> [ name = ugm-textcomp-it ] + { encoding = TS1, +%<cmr> family = cmr, +%<pad> family = {pad,padx,padj}, +%<pmn> family = {pmnx,pmnj}, +%<ugm> family = ugm, +%<!ugm> shape = {it,sl} } +%<ugm> shape = it } + { +%<cmr> \textquotestraightbase = {300,600}, +%<pad|pmn> \textquotestraightbase = {400,400}, +%<cmr> \textquotestraightdblbase = {300,600}, +%<pad> \textquotestraightdblbase = {300,400}, +%<pmn> \textquotestraightdblbase = {300,300}, + \texttwelveudash = {200,200}, +%<cmr|pad|pmn> \textthreequartersemdash = {150,150}, +%<ugm> \textthreequartersemdash = {200,200}, +%<cmr> \textquotesingle = {600,300}, +%<pad> \textquotesingle = {800,100}, +%<pmn> \textquotesingle = {300,200}, +%<ugm> \textquotesingle = {500,500}, +%<cmr> \textasteriskcentered = {300,200}, +%<pad> \textasteriskcentered = {500,100}, +%<pmn> \textasteriskcentered = {200,300}, +%<ugm> \textasteriskcentered = {300,150}, +%<pmn> \textfractionsolidus = {-200,-200}, +%<cmr> \textoneoldstyle = {100, 50}, +%<pad> \textoneoldstyle = {100, }, +%<pmn> \textoneoldstyle = { 50, }, +%<pad> \texttwooldstyle = { 50, }, +%<pmn> \texttwooldstyle = {-50, }, +%<cmr> \textthreeoldstyle = {100, 50}, +%<pmn> \textthreeoldstyle = {-100, }, +%<cmr> \textfouroldstyle = { 50, 50}, +%<pad> \textfouroldstyle = { 50,100}, +%<cmr> \textsevenoldstyle = { 50, 80}, +%<pad> \textsevenoldstyle = { 50, }, +%<pmn> \textsevenoldstyle = { 20, }, +%<cmr> \textlangle = {400, }, +%<cmr> \textrangle = { ,400}, +%<cmr|pad> \textminus = {300,300}, +%<pmn> \textminus = {200,200}, +%<ugm> \textminus = {250,300}, +%<pad|pmn> \textlbrackdbl = {100, }, +%<pad|pmn> \textrbrackdbl = { ,100}, +%<pmn> \textasciigrave = {300,300}, +%<cmr|pad|pmn> \texttildelow = {200,250}, +%<pmn> \textasciibreve = {300,300}, +%<pmn> \textasciicaron = {300,300}, +%<pmn> \textacutedbl = {200,300}, +%<pmn> \textgravedbl = {150,300}, +%<cmr> \textdagger = {100,100}, +%<pad> \textdagger = {200,100}, +%<pmn> \textdagger = { 80, 50}, +%<ugm> \textdagger = { 80, 80}, +%<cmr|pad> \textdaggerdbl = { 80, 80}, +%<pmn> \textdaggerdbl = { 80, 50}, +%<ugm> \textbardbl = {150,150}, +%<cmr> \textbullet = {200,100}, +%<pad> \textbullet = {300, }, +%<pmn> \textbullet = { 30, 70}, +%<ugm> \textbullet = { 50,100}, +%<cmr> \textcelsius = {100, }, +%<pad> \textcelsius = {200, }, +%<pmn> \textcelsius = { 50,-50}, +%<pad> \textflorin = {100, }, +%<pmn> \textflorin = { 50,100}, +%<ugm> \textflorin = { ,100}, +%<cmr> \textcolonmonetary = {150, }, +%<pad> \textcolonmonetary = {100, }, +%<pmn> \textcolonmonetary = { 50,-50}, +%<cmr|pad> \texttrademark = {200, }, +%<pmn> \texttrademark = { 50,100}, +%<ugm> \texttrademark = {150, 50}, +%<ugm> \textcent = { 50, }, +%<ugm> \textsterling = { , 50}, +%<ugm> \textbrokenbar = {200,300}, +%<pmn> \textasciidieresis = {300,200}, +%<cmr> \textcopyright = {100, }, +%<pad> \textcopyright = {200,100}, +%<pmn> \textcopyright = {100,150}, +%<ugm> \textcopyright = {300, }, +%<cmr> \textordfeminine = {100,100}, +%<pmn> \textordfeminine = {200,200}, +%<ugm> \textordfeminine = {100,200}, +%<cmr|pad> \textlnot = {300, }, +%<pmn|ugm> \textlnot = {200, }, +%<cmr> \textregistered = {100, }, +%<pad> \textregistered = {200,100}, +%<pmn> \textregistered = { 50,150}, +%<ugm> \textregistered = {300, }, +%<pmn> \textasciimacron = {150,200}, +%<cmr|pad> \textdegree = {500,100}, +%<pmn> \textdegree = {150,150}, +%<ugm> \textdegree = {300,200}, +%<cmr> \textpm = {150,100}, +%<pad> \textpm = {200,150}, +%<pmn|ugm> \textpm = {150,200}, +%<cmr> \textonesuperior = {400, }, +%<pad> \textonesuperior = {300,100}, +%<pmn> \textonesuperior = {200,100}, +%<ugm> \textonesuperior = {300,300}, +%<cmr> \texttwosuperior = {400, }, +%<pad> \texttwosuperior = {300, }, +%<pmn> \texttwosuperior = {200,100}, +%<ugm> \texttwosuperior = {300,200}, +%<cmr> \textthreesuperior = {400, }, +%<pad> \textthreesuperior = {300, }, +%<pmn> \textthreesuperior = {200,100}, +%<ugm> \textthreesuperior = {300,200}, +%<ugm> \textmu = { ,100}, +%<pmn> \textasciiacute = {300,200}, +%<cmr> \textparagraph = {200, }, +%<pmn> \textparagraph = { ,100}, +%<cmr> \textperiodcentered = {500,500}, +%<pad|pmn|ugm> \textperiodcentered = {300,400}, +%<cmr> \textordmasculine = {100,100}, +%<pmn> \textordmasculine = {200,200}, +%<ugm> \textordmasculine = {300,200}, +%<cmr> \texteuro = {200, }, +%<pad> \texteuro = {100, }, +%<pmn> \texteuro = {100,-50}, +%<cmr> \texttimes = {200,200}, +%<pad> \texttimes = {200,100}, +%<pmn> \texttimes = { 70,100}, +%<ugm> \texttimes = {200,300}, +%<cmr|pad> \textdiv = {200,200} +%<pmn> \textdiv = {150,200} +%<ugm> \textdiv = {200,300}, +%<ugm> \textsection = { ,200}, +%<ugm> \textonehalf = { 50,100}, +%<ugm> \textonequarter = { 50,100}, +%<ugm> \textthreequarters = { 50,100}, +%<ugm> \textsurd = { ,100} + } + +%</cmr|pad|pmn|ugm> +% \end{macrocode} +% +%\subsubsection{Computer Modern math} +% +% Now to the math symbols for Computer Modern Roman. Definitions have been +% extracted from \file{fontmath.ltx}. +%\changes{v1.2}{2004/10/02}{add settings for Computer Modern Roman math symbols} +% I did not spend too much time fiddling with these settings, so they can surely +% be improved. +% +% The math font `|operators|' (also used for the \cmd\mathrm\ and +% \cmd\mathbf\ alphabets) is |OT1/cmr|, which we've already set up above. +% It's declared as: +%\begin{verbatim} +%\DeclareSymbolFont{operators} {OT1}{cmr}{m} {n} +%\SetSymbolFont{operators}{bold}{OT1}{cmr}{bx}{n} +%\end{verbatim} +% +% \cmd\mathit\ (|OT1/cmr/m/it|) is also already set up. +% +% There are (for the moment) no settings for \cmd\mathsf\ and \cmd\mathtt. +% +% Math font `|letters|' (also used as \cmd\mathnormal) is declared as: +%\begin{verbatim} +%\DeclareSymbolFont{letters} {OML}{cmm}{m}{it} +%\SetSymbolFont{letters} {bold}{OML}{cmm}{b}{it} +%\end{verbatim} +%\changes{v1.6}{2004/12/26}{tune <CMR> math letters (<OML> encoding)} +% \begin{macrocode} +%<*cmr> +\SetProtrusion + [ name = cmr-math-letters ] + { encoding = OML, + family = cmm, + series = {m,b}, + shape = it } + { + A = {100, 50}, % \mathnormal + B = { 50, }, + C = { 50, }, + D = { 50, 50}, + E = { 50, }, + F = {100, 50}, + G = { 50, 50}, + H = { 50, 50}, + I = { 50, 50}, + J = {150, 50}, + K = { 50,100}, + L = { 50, 50}, + M = { 50, }, + N = { 50, }, + O = { 50, }, + P = { 50, }, + Q = { 50, 50}, + R = { 50, }, + S = { 50, }, + T = { 50,100}, + U = { 50, 50}, + V = {100,100}, + W = { 50,100}, + X = { 50,100}, + Y = {100,100}, + f = {100,100}, + h = { ,100}, + i = { , 50}, + j = { , 50}, + k = { , 50}, + r = { , 50}, + v = { , 50}, + w = { , 50}, + x = { , 50}, + "0B = { 50,100}, % \alpha + "0C = { 50, 50}, % \beta + "0D = {200,150}, % \gamma + "0E = { 50, 50}, % \delta + "0F = { 50, 50}, % \epsilon + "10 = { 50,150}, % \zeta + "12 = { 50, }, % \theta + "13 = { ,100}, % \iota + "14 = { ,100}, % \kappa + "15 = {100, 50}, % \lambda + "16 = { , 50}, % \mu + "17 = { , 50}, % \nu + "18 = { , 50}, % \xi + "19 = { 50,100}, % \pi + "1A = { 50, 50}, % \rho + "1B = { ,150}, % \sigma + "1C = { 50,150}, % \tau + "1D = { 50, 50}, % \upsilon + "1F = { 50,100}, % \chi + "20 = { 50, 50}, % \psi + "21 = { , 50}, % \omega + "22 = { , 50}, % \varepsilon + "23 = { , 50}, % \vartheta + "24 = { , 50}, % \varpi + "25 = {100, }, % \varrho + "26 = {100,100}, % \varsigma + "27 = { 50, 50}, % \varphi + "28 = {100,100}, % \leftharpoonup + "29 = {100,100}, % \leftharpoondown + "2A = {100,100}, % \rightharpoonup + "2B = {100,100}, % \rightharpoondown + "2C = {300,200}, % \lhook + "2D = {200,300}, % \rhook + "2E = { ,100}, % \triangleright + "2F = {100, }, % \triangleleft + "3A = { ,500}, % ., \ldotp + "3B = { ,500}, % , + "3C = {200,100}, % < + "3D = {300,400}, % / + "3E = {100,200}, % > + "3F = {200,200}, % \star + "5B = { ,100}, % \flat + "5E = {200,200}, % \smile + "5F = {200,200}, % \frown + "7C = {100, }, % \jmath + "7D = { ,100} % \wp +% \end{macrocode} +% Remaining slots in the source file. +%\iffalse +% "11 = { , }, % \eta +% "1E = { , }, % \phi +% "40 = { , }, % \partial +% "5C = { , }, % \natural +% "5D = { , }, % \sharp +% "60 = { , }, % \ell +% "7B = { , }, % \imath +%\fi +% \begin{macrocode} + } + +% \end{macrocode} +% Math font `|symbols|' (also used for the \cmd\mathcal\ alphabet) is declared +% as: +%\begin{verbatim} +%\DeclareSymbolFont{symbols} {OMS}{cmsy}{m}{n} +%\SetSymbolFont{symbols} {bold}{OMS}{cmsy}{b}{n} +%\end{verbatim} +% \begin{macrocode} +\SetProtrusion + [ name = cmr-math-symbols ] + { encoding = OMS, + family = cmsy, + series = {m,b}, + shape = n } + { + A = {150, 50}, % \mathcal + C = { ,100}, + D = { , 50}, + F = { 50,150}, + I = { ,100}, + J = {100,150}, + K = { ,100}, + L = {100, }, + M = { 50, 50}, + N = { 50,100}, + P = { , 50}, + Q = { 50, }, + R = { , 50}, + T = { 50,150}, + V = { 50, 50}, + W = { , 50}, + X = {100,100}, + Y = {100, }, + Z = {100,150}, + "00 = {300,300}, % - + "01 = { ,700}, % \cdot, \cdotp + "02 = {150,250}, % \times + "03 = {150,250}, % *, \ast + "04 = {200,300}, % \div + "05 = {150,250}, % \diamond + "06 = {200,200}, % \pm + "07 = {200,200}, % \mp + "08 = {100,100}, % \oplus + "09 = {100,100}, % \ominus + "0A = {100,100}, % \otimes + "0B = {100,100}, % \oslash + "0C = {100,100}, % \odot + "0D = {100,100}, % \bigcirc + "0E = {100,100}, % \circ + "0F = {100,100}, % \bullet + "10 = {100,100}, % \asymp + "11 = {100,100}, % \equiv + "12 = {200,100}, % \subseteq + "13 = {100,200}, % \supseteq + "14 = {200,100}, % \leq + "15 = {100,200}, % \geq + "16 = {200,100}, % \preceq + "17 = {100,200}, % \succeq + "18 = {200,200}, % \sim + "19 = {150,150}, % \approx + "1A = {200,100}, % \subset + "1B = {100,200}, % \supset + "1C = {200,100}, % \ll + "1D = {100,200}, % \gg + "1E = {300,100}, % \prec + "1F = {100,300}, % \succ + "20 = {100,200}, % \leftarrow + "21 = {200,100}, % \rightarrow + "22 = {100,100}, % \uparrow + "23 = {100,100}, % \downarrow + "24 = {100,100}, % \leftrightarrow + "25 = {100,100}, % \nearrow + "26 = {100,100}, % \searrow + "27 = {100,100}, % \simeq + "28 = {100,100}, % \Leftarrow + "29 = {100,100}, % \Rightarrow + "2A = {100,100}, % \Uparrow + "2B = {100,100}, % \Downarrow + "2C = {100,100}, % \Leftrightarrow + "2D = {100,100}, % \nwarrow + "2E = {100,100}, % \swarrow + "2F = { ,100}, % \propto + "30 = { ,400}, % \prime + "31 = {100,100}, % \infty + "32 = {150,100}, % \in + "33 = {100,150}, % \ni + "34 = {100,100}, % \triangle, \bigtriangleup + "35 = {100,100}, % \bigtriangledown + "38 = { ,100}, % \forall + "39 = {100, }, % \exists + "3A = {200, }, % \neg + "3E = {200,200}, % \top + "3F = {200,200}, % \bot, \perp + "5E = {100,200}, % \wedge + "5F = {100,200}, % \vee + "60 = { ,300}, % \vdash + "61 = {300, }, % \dashv + "62 = {100,100}, % \lfloor + "63 = {100,100}, % \rfloor + "64 = {100,100}, % \lceil + "65 = {100,100}, % \rceil + "66 = {150, }, % \lbrace + "67 = { ,150}, % \rbrace + "68 = {400, }, % \langle + "69 = { ,400}, % \rangle + "6C = {100,100}, % \updownarrow + "6D = {100,100}, % \Updownarrow + "6E = {100,300}, % \, \backslash, \setminus + "72 = {100,100}, % \nabla + "79 = {200,200}, % \dagger + "7A = {100,100}, % \ddagger + "7B = {100, }, % \mathparagraph + "7C = {100,100}, % \clubsuit + "7D = {100,100}, % \diamondsuit + "7E = {100,100}, % \heartsuit + "7F = {100,100} % \spadesuit +% \end{macrocode} +% Remaining slots in the source file. +%\iffalse +% "36 = { , }, % \not +% "37 = { , }, % \mapstochar +% "3B = { , }, % \emptyset +% "3C = { , }, % \Re +% "3D = { , }, % \Im +% "40 = { , }, % \aleph +% "5B = { , }, % \cup +% "5C = { , }, % \cap +% "5D = { , }, % \uplus +% "6A = { , }, % \arrowvert, \mid, \vert, | +% "6B = { , }, % \Arrowvert, \parallel, \Vert +% "6F = { , }, % \wr +% "70 = { , }, % \sqrtsign +% "71 = { , }, % \amalg +% "73 = { , }, % \smallint +% "74 = { , }, % \sqcup +% "75 = { , }, % \sqcap +% "76 = { , }, % \sqsubseteq +% "77 = { , }, % \sqsupseteq +% "78 = { , }, % \mathsection +%\fi +% \begin{macrocode} + } + +% \end{macrocode} +% We don't bother about `|largesymbols|', since it will only be used in display +% math, where protrusion doesn't work anyway. It's declared as: +%\begin{verbatim} +%\DeclareSymbolFont{largesymbols}{OMX}{cmex}{m}{n} +%\end{verbatim} +%\iffalse +%\SetProtrusion +% [ name = cmr-math-largesymbols ] +% { encoding = OMX, +% family = cmex } +% { +% "00 % ( +% "01 % ) +% "02 % [ +% "03 % ] +% "04 % \lfloor +% "05 % \rfloor +% "06 % \lceil +% "07 % \rceil +% "08 % \lbrace +% "09 % \rbrace +% "0A % <, \langle +% "0B % >, \rangle +% "0C % \vert, | +% "0D % \Vert +% "0E % / +% "0F % \backslash +% "3A % \lgroup +% "3B % \rgroup +% "3C % \arrowvert +% "3D % \Arrowvert +% "3E % \bracevert +% "3F % \updownarrow +% "40 % \lmoustache +% "41 % \rmoustache +% "46 % \bigsqcup +% "48 % \ointop +% "4A % \bigodot +% "4C % \bigoplus +% "4E % \bigotimes +% "50 % \sum +% "51 % \prod +% "52 % \intop +% "53 % \bigcup +% "54 % \bigcap +% "55 % \biguplus +% "56 % \bigwedge +% "57 % \bigvee +% "60 % \coprod +% "70 % \sqrtsign +% "77 % \Updownarrow +% "78 % \uparrow +% "79 % \downarrow +% "7A % \braceld, \lmoustache +% "7B % \bracerd, \rmoustache +% "7C % \bracelu +% "7D % \braceru +% "7E % \Uparrow +% "7F % \Downarrow +% } +%\fi +% \begin{macrocode} +%</cmr> +%</cfg-t> +% \end{macrocode} +% +% \subsubsection{<AMS> symbols} +% +% Settings for the <AMS> math fonts (\pkg{amssymb}). +%\changes{v1.8}{2005/06/01}{settings for <AMS> math fonts} +%\changes{v1.9d}{2006/02/04}{tweak <AMS> settings} +% \begin{macrocode} +%<*cfg-u> +% \end{macrocode} +% Symbol font `a'. +% \begin{macrocode} +%<*msa> +\SetProtrusion + [ name = AMS-a ] + { encoding = U, + family = msa } + { + "05 = {150,250}, % \centerdot + "06 = {100,100}, % \lozenge + "07 = { 50, 50}, % \blacklozenge + "08 = { 50, 50}, % \circlearrowright + "09 = { 50, 50}, % \circlearrowleft + "0A = {100,100}, % \rightleftharpoons + "0B = {100,100}, % \leftrightharpoons + "0D = {-50,200}, % \Vdash + "0E = {-50,200}, % \Vvdash + "0F = {-70,150}, % \vDash + "10 = {100,150}, % \twoheadrightarrow + "11 = {100,150}, % \twoheadleftarrow + "12 = { 50,100}, % \leftleftarrows + "13 = { 50, 80}, % \rightrightarrows + "14 = {120,120}, % \upuparrows + "15 = {120,120}, % \downdownarrows + "16 = {200,200}, % \upharpoonright + "17 = {200,200}, % \downharpoonright + "18 = {200,200}, % \upharpoonleft + "19 = {200,200}, % \downharpoonleft + "1A = { 80,100}, % \rightarrowtail + "1B = { 80,100}, % \leftarrowtail + "1C = { 50, 50}, % \leftrightarrows + "1D = { 50, 50}, % \rightleftarrows + "1E = {250, }, % \Lsh + "1F = { ,250}, % \Rsh + "20 = {100,100}, % \rightsquigarrow + "21 = {100,100}, % \leftrightsquigarrow + "22 = {100, 50}, % \looparrowleft + "23 = { 50,100}, % \looparrowright + "24 = { 50, 80}, % \circeq + "25 = { ,100}, % \succsim + "26 = { ,100}, % \gtrsim + "27 = { ,100}, % \gtrapprox + "28 = {150, 50}, % \multimap + "2B = {100,150}, % \doteqdot + "2C = {100,150}, % \triangleq + "2D = {100, 50}, % \precsim + "2E = {100, 50}, % \lesssim + "2F = { 50, 50}, % \lessapprox + "30 = {100, 50}, % \eqslantless + "31 = { 50, 50}, % \eqslantgtr + "32 = {100, 50}, % \curlyeqprec + "33 = { 50,100}, % \curlyeqsucc + "34 = {100, 50}, % \preccurlyeq + "36 = { 50, }, % \leqslant + "38 = { , 50}, % \backprime + "39 = {250,250}, % \dabar@ : the dash bar in \dash(left,right)arrow + "3C = { 50,100}, % \succcurlyeq + "3E = { , 50}, % \geqslant + "40 = { , 50}, % \sqsubset + "41 = { 50, }, % \sqsupset + "42 = { ,150}, % \vartriangleright, \rhd + "43 = {150, }, % \vartriangleleft, \lhd + "44 = { ,100}, % \trianglerighteq, \unrhd + "45 = {100, }, % \trianglelefteq, \unlhd + "46 = {100,100}, % \bigstar + "48 = { 50, 50}, % \blacktriangledown + "49 = { ,100}, % \blacktriangleright + "4A = {100, }, % \blacktriangleleft + "4B = { ,150}, % \dashrightarrow (the arrow) + "4C = {150, }, % \dashleftarrow + "4D = { 50, 50}, % \vartriangle + "4E = { 50, 50}, % \blacktriangle + "4F = { 50, 50}, % \triangledown + "50 = { 50, 50}, % \eqcirc + "56 = { ,150}, % \Rrightarrow + "57 = {150, }, % \Lleftarrow + "58 = {100,300}, % \checkmark + "5C = { 50, 50}, % \angle + "5D = { 50, 50}, % \measuredangle + "5E = { 50, 50}, % \sphericalangle + "5F = { , 50}, % \varpropto + "60 = {100,100}, % \smallsmile + "61 = {100,100}, % \smallfrown + "62 = { 50, }, % \Subset + "63 = { , 50}, % \Supset + "66 = {150,150}, % \curlywedge + "67 = {150,150}, % \curlyvee + "68 = { 50,150}, % \leftthreetimes + "69 = {100, 50}, % \rightthreetimes + "6C = { 50, 50}, % \bumpeq + "6D = { 50, 50}, % \Bumpeq + "6E = {100, }, % \lll + "6F = { ,100}, % \ggg + "70 = { 50,100}, % \ulcorner + "71 = {100, 50}, % \urcorner + "75 = {150,200}, % \dotplus + "76 = { 50,100}, % \backsim + "78 = { 50,100}, % \llcorner + "79 = {100, 50}, % \lrcorner + "7C = {100,100}, % \intercal + "7D = { 50, 50}, % \circledcirc + "7E = { 50, 50}, % \circledast + "7F = { 50, 50} % \circleddash +% \end{macrocode} +% Remaining slots in the source file. +%\iffalse +% "00 = { , }, % \boxdot +% "01 = { , }, % \boxplus +% "02 = { , }, % \boxtimes +% "03 = { , }, % \square +% "04 = { , }, % \blacksquare +% "0C = { , }, % \boxminus +% "29 = { , }, % \therefore +% "2A = { , }, % \because +% "35 = { , }, % \leqq +% "37 = { , }, % \lessgtr +% "3A = { , }, % \risingdotseq +% "3B = { , }, % \fallingdotseq +% "3D = { , }, % \geqq +% "3F = { , }, % \gtrless +% "47 = { , }, % \between +% "51 = { , }, % \lesseqgtr +% "52 = { , }, % \gtreqless +% "53 = { , }, % \lesseqqgtr +% "54 = { , }, % \gtreqqless +% "55 = { , }, % \yen +% "59 = { , }, % \veebar +% "5A = { , }, % \barwedge +% "5B = { , }, % \doublebarwedge +% "64 = { , }, % \Cup +% "65 = { , }, % \Cap +% "6A = { , }, % \subseteqq +% "6B = { , }, % \supseteqq +% "72 = { , }, % \circledR +% "73 = { , }, % \circledS +% "74 = { , }, % \pitchfork +% "77 = { , }, % \backsimeq +% "7A = { , }, % \maltese +% "7B = { , }, % \complement +%\fi +% \begin{macrocode} + } + +%</msa> +% \end{macrocode} +% Symbol font `b'. +% \begin{macrocode} +%<*msb> +\SetProtrusion + [ name = AMS-b ] + { encoding = U, + family = msb } + { + A = { 50, 50}, % \mathbb + C = { 50, 50}, + G = { , 50}, + L = { , 50}, + P = { , 50}, + R = { , 50}, + T = { , 50}, + V = { 50, 50}, + X = { 50, 50}, + Y = { 50, 50}, + "00 = { 50, 50}, % \lvertneqq + "01 = { 50, 50}, % \gvertneqq + "02 = { 50, 50}, % \nleq + "03 = { 50, 50}, % \ngeq + "04 = {100, 50}, % \nless + "05 = { 50,150}, % \ngtr + "06 = {100, 50}, % \nprec + "07 = { 50,150}, % \nsucc + "08 = { 50, 50}, % \lneqq + "09 = { 50, 50}, % \gneqq + "0A = {100,100}, % \nleqslant + "0B = {100,100}, % \ngeqslant + "0C = {100, 50}, % \lneq + "0D = { 50,100}, % \gneq + "0E = {100, 50}, % \npreceq + "0F = { 50,100}, % \nsucceq + "10 = { 50, }, % \precnsim + "11 = { 50, 50}, % \succnsim + "12 = { 50, 50}, % \lnsim + "13 = { 50, 50}, % \gnsim + "14 = { 50, 50}, % \nleqq + "15 = { 50, 50}, % \ngeqq + "16 = { 50, 50}, % \precneqq + "17 = { 50, 50}, % \succneqq + "18 = { 50, 50}, % \precnapprox + "19 = { 50, 50}, % \succnapprox + "1A = { 50, 50}, % \lnapprox + "1B = { 50, 50}, % \gnapprox + "1C = {150,200}, % \nsim + "1D = { 50, 50}, % \ncong + "1E = {100,150}, % \diagup + "1F = {100,150}, % \diagdown + "20 = {100, 50}, % \varsubsetneq + "21 = { 50,100}, % \varsupsetneq + "22 = {100, 50}, % \nsubseteqq + "23 = { 50,100}, % \nsupseteqq + "24 = {100, 50}, % \subsetneqq + "25 = { 50,100}, % \supsetneqq + "26 = {100, 50}, % \varsubsetneqq + "27 = { 50,100}, % \varsupsetneqq + "28 = {100, 50}, % \subsetneq + "29 = { 50,100}, % \supsetneq + "2A = {100, 50}, % \nsubseteq + "2B = { 50,100}, % \nsupseteq + "2C = { 50,100}, % \nparallel + "2D = {100,150}, % \nmid + "2E = {150,150}, % \nshortmid + "2F = {100,100}, % \nshortparallel + "30 = { ,150}, % \nvdash + "31 = { ,150}, % \nVdash + "32 = { ,100}, % \nvDash + "33 = { ,100}, % \nVDash + "34 = { ,100}, % \ntrianglerighteq + "35 = {100, }, % \ntrianglelefteq + "36 = {100, }, % \ntriangleleft + "37 = { ,100}, % \ntriangleright + "38 = {100,200}, % \nleftarrow + "39 = {100,200}, % \nrightarrow + "3A = {100,100}, % \nLeftarrow + "3B = { 50,100}, % \nRightarrow + "3C = {100,100}, % \nLeftrightarrow + "3D = {100,200}, % \nleftrightarrow + "3E = { 50, 50}, % \divideontimes + "3F = { 50, 50}, % \varnothing + "60 = {200, }, % \Finv + "61 = { , 50}, % \Game + "68 = {100,100}, % \eqsim + "69 = { 50, }, % \beth + "6A = { 50, }, % \gimel + "6B = {150, }, % \daleth + "6C = {200, }, % \lessdot + "6D = { ,200}, % \gtrdot + "6E = {100,200}, % \ltimes + "6F = {150,100}, % \rtimes + "70 = { 50,100}, % \shortmid + "71 = { 50, 50}, % \shortparallel + "72 = {200,300}, % \smallsetminus + "73 = {100,200}, % \thicksim + "74 = { 50,100}, % \thickapprox + "75 = { 50, 50}, % \approxeq + "76 = { 50,100}, % \succapprox + "77 = { 50, 50}, % \precapprox + "78 = {100,100}, % \curvearrowleft + "79 = { 50,150}, % \curvearrowright + "7A = { 50,200}, % \digamma + "7B = {100, 50}, % \varkappa + "7F = {200, } % \backepsilon +% \end{macrocode} +% Remaining slots in the source file. +%\iffalse +% "40 = { , }, % \nexists +% "66 = { , }, % \mho +% "67 = { , }, % \eth +% "7C = { , }, % \Bbbk +% "7D = { , }, % \hslash +% "7E = { , }, % \hbar +%\fi +% \begin{macrocode} + } + +%</msb> +% \end{macrocode} +% \subsubsection{Euler} +% +% Euler Roman font (package \pkg{euler}). +%\changes{v1.9e}{2006/07/28}{settings for Euler Roman font} +% \begin{macrocode} +%<*eur> +\SetProtrusion + [ name = euler ] + { encoding = U, + family = eur } + { + "01 = {100,100}, + "03 = {100,150}, + "06 = { ,100}, + "07 = {100,150}, + "08 = {100,100}, + "0A = {100,100}, + "0B = { , 50}, + "0C = { ,100}, + "0D = {100,100}, + "0E = { ,100}, + "0F = {100,100}, + "10 = {100,100}, + "13 = { ,100}, + "14 = { ,100}, + "15 = { , 50}, + "16 = { , 50}, + "17 = { 50,100}, + "18 = { 50,100}, + "1A = { , 50}, + "1B = { , 50}, + "1C = { 50,100}, + "1D = { 50,100}, + "1E = { 50,100}, + "1F = { 50,100}, + "20 = { , 50}, + "21 = { , 50}, + "22 = { 50,100}, + "24 = { , 50}, + "27 = { 50,100}, + 1 = {100,100}, + 7 = { 50,100}, + "3A = {300,500}, + "3B = {200,400}, + "3C = {200,100}, + "3D = {200,200}, + "3E = {100,200}, + A = { ,100}, + D = { , 50}, + J = { 50, }, + K = { , 50}, + L = { , 50}, + Q = { , 50}, + T = { 50, }, + X = { 50, 50}, + Y = { 50, }, + h = { , 50}, + k = { , 50} + } + +% \end{macrocode} +% Extended by the \pkg{eulervm} package. +%\changes{v1.9f}{2006/07/31}{fix: \texttt{euler-vm} did not load \texttt{euler} settings} +% \begin{macrocode} +\SetProtrusion + [ name = euler-vm, + load = euler ] + { encoding = U, + family = zeur } + { + "28 = {100,200}, + "29 = {100,200}, + "2A = {100,150}, + "2B = {100,150}, + "2C = {200,300}, + "2D = {200,300}, + "2E = { ,100}, + "2F = {100, }, + "3F = {150,150}, + "5B = { ,100}, + "5E = {100,100}, + "5F = {100,100}, + "80 = { , 50}, + "81 = {200,250}, + "82 = {100,200} + } + +%</eur> +% \end{macrocode} +% Euler Script font (\pkg{eucal}). +% \begin{macrocode} +%<*eus> +\SetProtrusion + [ name = euscript ] + { encoding = U, + family = eus } + { + A = {100,100}, + B = { 50,100}, + C = { 50, 50}, + D = { 50,100}, + E = { 50,100}, + F = { 50, }, + G = { 50, }, + H = { ,100}, + K = { , 50}, + L = { ,150}, + M = { , 50}, + N = { , 50}, + O = { 50, 50}, + P = { 50, 50}, + T = { ,100}, + U = { , 50}, + V = { 50, 50}, + W = { 50, 50}, + X = { 50, 50}, + Y = { 50, }, + Z = { 50,100}, + "00 = {250,250}, + "18 = {200,200}, + "3A = {200,150}, + "40 = { ,100}, + "5E = {100,100}, + "5F = {100,100}, + "66 = { 50, }, + "67 = { , 50}, + "6E = {200,200} + } + +\SetProtrusion + [ name = euscript-vm, + load = euscript ] + { encoding = U, + family = zeus } + { + "01 = {600,600}, + "02 = {200,200}, + "03 = {200,200}, + "04 = {200,200}, + "05 = {150,150}, + "06 = {200,200}, + "07 = {200,200}, + "08 = {100,100}, + "09 = {100,100}, + "0A = {100,100}, + "0B = {100,100}, + "0C = {100,100}, + "0D = {100,100}, + "0E = {150,150}, + "0F = {100,100}, + "10 = {150,150}, + "11 = {100,100}, + "12 = {150,100}, + "13 = {100,150}, + "14 = {150,100}, + "15 = {100,150}, + "16 = {200,100}, + "17 = {100,200}, + "19 = {150,150}, + "1A = {150,100}, + "1B = {100,150}, + "1C = {100,100}, + "1D = {100,100}, + "1E = {250,100}, + "1F = {100,250}, + "20 = {150,200}, + "21 = {150,200}, + "22 = {150,150}, + "23 = {150,150}, + "24 = {100,200}, + "25 = {150,150}, + "26 = {150,150}, + "27 = {100,100}, + "28 = {100,100}, + "29 = {100,150}, + "2A = {100,100}, + "2B = {100,100}, + "2C = {100,100}, + "2D = {150,150}, + "2E = {150,150}, + "2F = {100,100}, + "30 = {100,100}, + "31 = {100,100}, + "32 = {100,100}, + "33 = {100,100}, + "34 = {100,100}, + "35 = {100,100}, + "3E = {150,150}, + "3F = {150,150}, + "60 = { ,200}, + "61 = {200, }, + "62 = {100,100}, + "63 = {100,100}, + "64 = {100,100}, + "65 = {100,100}, + "68 = {300, }, + "69 = { ,300}, + "6C = {100,100}, + "6D = {100,100}, + "6F = {100,100}, + "72 = {100,100}, + "73 = {200,100}, + "76 = { ,100}, + "77 = {100, }, + "78 = { 50, 50}, + "79 = {100,100}, + "7A = {100,100}, + "7D = {150,150}, + "7E = {100,100}, + "A8 = {100,100}, + "A9 = {100,100}, + "AB = {200,200}, + "BA = { ,200}, + "BB = { ,200}, + "BD = {200,200}, + "DE = {200,200} + } + +%</eus> +% \end{macrocode} +% Euler Fraktur font (\pkg{eufrak}). +%\changes{v1.9e}{2006/07/28}{complete settings for Euler Fraktur and Script fonts} +% \begin{macrocode} +%<*euf> +\SetProtrusion + [ name = mathfrak ] + { encoding = U, + family = euf } + { + A = { , 50}, + B = { , 50}, + C = { 50, 50}, + D = { , 80}, + E = { 50, }, + G = { , 50}, + L = { , 80}, + O = { , 50}, + T = { , 80}, + X = { 80, 50}, + Z = { 80, 50}, + b = { , 50}, + c = { , 50}, + k = { , 50}, + p = { , 50}, + q = { 50, }, + v = { , 50}, + w = { , 50}, + x = { , 50}, + 1 = {100,100}, + 2 = { 80, 80}, + 3 = { 80, 50}, + 4 = { 80, 50}, + 7 = { 50, 50}, + "12 = {500,500}, + "13 = {500,500}, + ! = { ,200}, + ' = {200,300}, + ( = {200, }, + ) = { ,200}, + * = {200,200}, + + = {200,250}, + - = {200,200}, + {,} = {300,300}, + . = {400,400}, + {=} = {200,200}, + : = { ,200}, + ; = { ,200}, + ] = { ,200} + } + +%</euf> +%</cfg-u> +% \end{macrocode} +%\subsubsection{Euro symbols} +%\changes{v1.9d}{2006/05/04}{settings for Euro symbols (Adobe, <ITC>, \pkg{marvosym})} +%\changes{v1.9e}{2006/07/05}{fix: forgotten comma in \file{mt-mvs.cfg}; +% adapt to \pkg{marvosym}'s changed encoding} +% Settings for various Euro symbols (Adobe Euro fonts (packages \pkg{eurosans}, +% \pkg{europs}), <ITC> Euro fonts (package \pkg{euroitc}) and \pkg{marvosym}\footnote{ +% Of course, there are many more symbols in this font. Feel free to contribute +% protrusion settings!}). +% \begin{macrocode} +%<*cfg-e> +\SetProtrusion +%<zpeu|euroitc> { encoding = U, +%<mvs> { encoding = {OT1,U}, +%<zpeu> family = zpeu } +%<euroitc> family = {euroitc,euroitcs} } +%<mvs> family = mvs } + { +%<zpeu> E = {50, } +%<euroitc> E = {100,50} +%<mvs> 164 = {50,50}, % \EUR +%<mvs> 068 = {50,-100} % \EURdig + } + +%<*zpeu|euroitc> +\SetProtrusion + { encoding = U, +%<zpeu> family = zpeu, +%<euroitc> family = {euroitc,euroitcs}, + shape = it* } + { +%<zpeu> E = {100,-50} +%<euroitc> E = {100,} + } + +%</zpeu|euroitc> +%<*zpeu> +\SetProtrusion + { encoding = U, + family = {zpeus,eurosans} } + { + E = {100,50} + } + +\SetProtrusion + { encoding = U, + family = {zpeus,eurosans}, + shape = it* } + { + E = {200, } + } + +%</zpeu> +%</cfg-e> +% \end{macrocode} +% +%\subsection{Interword spacing}\label{sub:conf-spacing} +%\GeneralChanges{Spacing} +% +% Default unit is space. +% +% \begin{macrocode} +%<*m-t|cmr> +%%% ----------------------------------------------------------------------- +%%% INTERWORD SPACING + +%</m-t|cmr> +%<*m-t> +\SetExtraSpacing + [ name = default ] + { encoding = {OT1,T1,LY1,OT4,QX,T5} } + { +% \end{macrocode} +% These settings are only a first approximation. The following reasoning is from +% a mail from \contributor Ulrich Dirr <ud\at art-satz.de>^^A private mail, 2005/06/14 +%\ifpdf\IfFileExists{justification.png}{^^A +% , who also provided the sample in figure~\ref{fig:example-spacing}^^A +%\changes{v2.2}{2007/04/05}{add sample}^^A +% \begin{figure} +% \caption{^^A +% Example of interword spacing (from: M.~Siemoneit, \emph{Typographisches Gestalten}, Frankfurt/M. 1989). +% ^^A Manfred Siemoneit, Typographisches Gestalten. +% ^^A Regeln und Tips f\"ur die richtige Gestaltung von Drucksachen, +% ^^A Frankfurt/M.: Polygraph Verlag, 1989 +% The numbers indicate the preference for shrinking the interword space.} +% \label{fig:example-spacing} +% \includegraphics[width=.66\textwidth]{justification.png} +% \end{figure}^^A +%}\relax\fi. +% I~do not claim to have coped with the task. +%\todo{fix settings} +% +%\begin{quote} +% `The idea is -- analog to the tables for expansion and protrusion -- to +% have tables for optical reduction\slash expansion of spaces in dependence of the +% actual character so that the distance between words is optically equal. +% +% When reducing distances the (weighting) order is: +%\begin{itemize} +% \item after commas +% \begin{macrocode} + {,} = { ,-500,500}, +% \end{macrocode} +% \item in front of capitals which have optical more room on their left +% side, \eg, `A', `J', `T', `V', `W', and `Y' +% [this is not yet possible -- RS] +% \item in front of capitals which have circle/oval shapes on their left +% side, \eg, `C', `G', `O', and `Q' +% [ditto -- RS] +% \item after `r' (because of the bigger optical room on the righthand side) +% \begin{macrocode} + r = { ,-300,300}, +% \end{macrocode} +% \item\relax [before or] after lowercase characters with ascenders +% \begin{macrocode} + b = { ,-200,200}, + d = { ,-200,200}, + f = { ,-200,200}, + h = { ,-200,200}, + k = { ,-200,200}, + l = { ,-200,200}, + t = { ,-200,200}, +% \end{macrocode} +% \item\relax [before or] after lowercase characters with x-height plus descender +% with additional optical space, \eg, `v', or `w' +% \begin{macrocode} + c = { ,-100,100}, + p = { ,-100,100}, + v = { ,-100,100}, + w = { ,-100,100}, + z = { ,-100,100}, + x = { ,-100,100}, + y = { ,-100,100}, +% \end{macrocode} +% \item\relax [before or] after lowercase characters with x-height plus descender +% without additional optical space +% \begin{macrocode} + i = { , 50, -50}, + m = { , 50, -50}, + n = { , 50, -50}, + u = { , 50, -50}, +% \end{macrocode} +% \item after colon and semicolon +% \begin{macrocode} + : = { ,200,-200}, + ; = { ,200,-200}, +% \end{macrocode} +% \item after punctuation which ends a sentence, \eg, period, exclamation +% mark, question mark +% \begin{macrocode} + . = { ,250,-250}, + ! = { ,250,-250}, + ? = { ,250,-250} +% \end{macrocode} +%\end{itemize} +% The order has to be reversed when enlarging is needed.' +%\end{quote} +% \begin{macrocode} + } + +%</m-t> +% \end{macrocode} +% Questions are: +%\begin{itemize} +% \item Is the result really better? +% \item Is it overdone? (Try with a |factor| \textless\ 1000.) +% \item Should the first parameter also be used? (Probably.) +% \item What about quotation marks, parentheses etc.? +%\end{itemize} +% +% Furthermore, there seems to be a \pdftex\ bug with spacing in combination +% with a non-zero \cmd\spaceskip\ +% (reported by \contributor Axel Berger <Axel_Berger\at b.maus.de>): +% ^^A dctt, `myheadings, markboth', 2008/10/06, MID: <200810062134.a58193@b.maus.de> +%\todo{report \pdftex\ bug} +%\begin{verbatim} +%\parfillskip0pt +%\rightskip0pt plus 1em +%\spaceskip\fontdimen2\font +% test test\par +%\pdfadjustinterwordglue2 +%\stbscode\font`t=-50 +% test test +%\bye +%\end{verbatim} +% Some more characters in <T2A>.\footnote{Contributed by +% \contributor Karl Karlsson <karl-karlsson\at yandex.ru>.} +%\changes{v2.3e}{2009/10/28}{settings for <T2A> encoding (contributed by +% \contributor Karl Karlsson <karl-karlsson\at yandex.ru>)} +% ^^A private mail, 2009/10/21 +% \begin{macrocode} +%<*cmr> +\SetExtraSpacing + [ name = T2A, + load = default ] + { encoding = T2A, + family = cmr } + { + \cyrg = { ,-300,300}, + \cyrb = { ,-200,200}, + \cyrk = { ,-200,200}, + \cyrs = { ,-100,100}, + \cyrr = { ,-100,100}, + \cyrh = { ,-100,100}, + \cyru = { ,-100,100}, + \cyrt = { , 50, -50}, + \cyrp = { , 50, -50}, + \cyri = { , 50, -50}, + \cyrishrt = { , 50, -50}, + } + +% \end{macrocode} +% +% \subsubsection{Nonfrenchspacing} +% The following settings simulate \cmd\nonfrenchspacing\ (since space factors +% will be ignored when spacing adjustment is in effect). They may be used for +% English contexts. +% +% From the \TeX book: +%\begin{quote} +% `If the +% space factor $f$ is different from 1000, the interword glue is computed as +% follows: Take the normal space glue for the current font, and add the +% extra space if $f\ge2000$. +% [\,\dots] +% Then the stretch component is multiplied by $f/1000$, while the shrink +% component is multiplied by $1000/f$.' +%\end{quote} +% The `extra space' (\fontdim7) for Computer Modern Roman is a third of +% \fontdim2, \ie, 333. +% \begin{macrocode} +\SetExtraSpacing + [ name = nonfrench-cmr, + load = default, + context = nonfrench ] + { encoding = {OT1,T1,LY1,OT4,QX,T5}, + family = cmr } + { +% \end{macrocode} +% \file{latex.ltx} has: +%\begin{verbatim}[morekeywords={[1]{\nonfrenchspacing}}] +%\def\nonfrenchspacing{ +% \sfcode`\. 3000 +% \sfcode`\? 3000 +% \sfcode`\! 3000 +%\end{verbatim} +% \begin{macrocode} + . = {333,2000,-667}, + ? = {333,2000,-667}, + ! = {333,2000,-667}, +% \end{macrocode} +%\begin{verbatim} +% \sfcode`\: 2000 +%\end{verbatim} +% \begin{macrocode} + : = {333,1000,-500}, +% \end{macrocode} +%\begin{verbatim} +% \sfcode`\; 1500 +%\end{verbatim} +% \begin{macrocode} + ; = { , 500,-333}, +% \end{macrocode} +%\begin{verbatim} +% \sfcode`\, 1250 +%\end{verbatim} +% \begin{macrocode} + {,}= { , 250,-200} +% \end{macrocode} +%\begin{verbatim} +%} +%\end{verbatim} +% \begin{macrocode} + } + +%</cmr> +% \end{macrocode} +% \pkg{fontinst}, however, which is also used to create the \pkg{psnfss} font +% metrics, sets \fontdim7 to 240 by default. Therefore, the fallback settings +% use this value for the first component. +% \begin{macrocode} +%<*m-t> +\SetExtraSpacing + [ name = nonfrench-default, + load = default, + context = nonfrench ] + { encoding = {OT1,T1,LY1,OT4,QX,T5} } + { + . = {240,2000,-667}, + ? = {240,2000,-667}, + ! = {240,2000,-667}, + : = {240,1000,-500}, + ; = { , 500,-333}, + {,}= { , 250,-200} + } + +% \end{macrocode} +% +% \subsection{Additional kerning} +%\GeneralChanges{Kerning} +% +% Default unit is \EM{1}. +% +% \begin{macrocode} +%%% ----------------------------------------------------------------------- +%%% ADDITIONAL KERNING + +% \end{macrocode} +% A dummy list to be loaded when no context is active. +% \begin{macrocode} +\SetExtraKerning + [ name = empty ] + { encoding = {OT1,T1,T2A,LY1,OT4,QX,T5,TS1} } + { } + +% \end{macrocode} +% +%\subsubsection{French} +% +% The ratio of \fontdim2 to \fontdim6 varies for different fonts, so that +% either the kerning of the colon (which should be a space, \ie, \fontdim2) or +% that of the other punctuation characters (\TeX's \cmd\thinspace, \ie, one +% sixth of \fontdim6) may be inaccurate, depending on which |unit| we choose +% (|space| or |1em|). For Times, for example, a thin space would be 665. I +% don't know whether French typography really wants a thin space, or rather (as +% it happens to turn out with <CMR>) half a space. +% (Wikipedia\footnote{\url{http://fr.wikipedia.org/wiki/Espace_typographique}, 5 July 2007.} +% claims it should be a quarter of an em, which seems too much to me; then +% again, it also says that this \emph{was} a thin space in French typography.) +% \begin{macrocode} +\SetExtraKerning + [ name = french-default, + context = french, + unit = space ] + { encoding = {OT1,T1,LY1} } + { + : = {1000,}, % = \fontdimen2 + ; = {500, }, % ~ \thinspace + ! = {500, }, + ? = {500, } + } + +% \end{macrocode} +% These settings have the disadvantage that a word following a left guillemet +% will not be hyphenated. This might be fixed in \pdftex. +% \begin{macrocode} +\SetExtraKerning + [ name = french-guillemets, + context = french-guillemets, + load = french-default, + unit = space ] + { encoding = {T1,LY1} } + { + \guillemotleft = { ,800}, % = 0.8\fontdimen2 + \guillemotright = {800, } + } + +\SetExtraKerning + [ name = french-guillemets-OT1, + context = french-guillemets, + load = french-default, + unit = space ] + { encoding = OT1 } + { } + +% \end{macrocode} +% +%\subsubsection{Turkish} +% +% \begin{macrocode} +\SetExtraKerning + [ name = turkish, + context = turkish ] + { encoding = {OT1,T1,LY1} } + { + : = {167, }, % = \thinspace + ! = {167, }, + {=} = {167, } + } + +%</m-t> +%</config> +% \end{macrocode} +%^^A\changes{v2.0}{2006/12/28}{remove \texttt{letterspacing} settings} +% +%\ifpdf +%\GeneralChanges{Documentation} +%^^A The OpenType configuration files are outsourced to an external file, +%^^A since they are typeset with \luatex. +% +%\newwrite \utftmp +%\immediate\openout \utftmp=microtype-utf.tmp +%\immediate\write \utftmp{\string\setcounter{section}{\the\c@section}} +%\immediate\write \utftmp{\string\setcounter{CodelineNo}{\the\c@CodelineNo}} +%\immediate\write \utftmp{\string\setcounter{page}{\the\c@page}} +%\immediate\write \utftmp{\string\setcounter{footnote}{\the\c@footnote}} +%\immediate\closeout\utftmp +% +%\InputIfFileExists{microtype.tmp}\relax{\def\utfsectioni{1}\def\utfsectionii{1}} +% +%\IfFileExists{microtype-utf.pdf} +% {\includepdf[pages=-, +% addtotoc={1,section,1,OpenType configuration files,section.\thesection, +% \utfsectioni,subsection,2,Character inheritance,subsection.\thesection.1, +% \utfsectionii,subsection,2,Character protrusion,subsection.\thesection.2}] +% {microtype-utf.pdf}} +% {\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 can be used to test protrusion and expansion settings. +% \begin{macrocode} +%<*test> +\documentclass{article} + +%% Here you can specify the font you want to test, using +%% the commands \fontfamily, \fontseries and \fontshape. +%% Make sure to end all lines with a comment character! +\newcommand*\TestFont{% + \fontfamily{ppl}% +%% \fontseries{b}% +%% \fontshape{it}% sc, sl +} + +\usepackage{ifthen} +\usepackage[T1]{fontenc} +\usepackage[latin1]{inputenc} +\usepackage[verbose,expansion=alltext,stretch=50]{microtype} + +\pagestyle{empty} +\setlength{\parindent}{0pt} +\newcommand*\crulefill{\cleaders\hbox{$\mkern-2mu\smash-\mkern-2mu$}\hfill} +\newcommand*\testprotrusion[2][]{% + \ifthenelse{\equal{#1}{r}}{}{#2}% + lorem ipsum dolor sit amet, + \ifthenelse{\equal{#1}{r}}{\crulefill}{\leftarrowfill} #2 + \ifthenelse{\equal{#1}{l}}{\crulefill}{\rightarrowfill} + you know the rest% + \ifthenelse{\equal{#1}{l}}{}{#2}% + \linebreak + {\fontencoding{\encodingdefault}% + \fontseries{\seriesdefault}% + \fontshape{\shapedefault}% + \selectfont + Here is the beginning of a line, \dotfill and here is its end}\linebreak +} +\newcommand*\showTestFont{\expandafter\stripprefix\meaning\TestFont} +\def\stripprefix#1>{} +\newcount\charcount +\begin{document} + +\microtypesetup{expansion=false} + +{\centering The font in this document is called by:\\ + \texttt{\showTestFont}\par}\bigskip + +\TestFont\selectfont + This line intentionally left empty\linebreak +%% A -- Z +\charcount=65 +\loop + \testprotrusion{\char\charcount} + \advance\charcount 1 + \ifnum\charcount < 91 \repeat +%% a -- z +\charcount=97 +\loop + \testprotrusion{\char\charcount} + \advance\charcount 1 + \ifnum\charcount < 123 \repeat +%% 0 -- 9 +\charcount=48 +\loop + \testprotrusion{\char\charcount} + \advance\charcount 1 + \ifnum\charcount < 58 \repeat +%% + \testprotrusion[r]{,} + \testprotrusion[r]{.} + \testprotrusion[r]{;} + \testprotrusion[r]{:} + \testprotrusion[r]{?} + \testprotrusion[r]{!} + \testprotrusion[l]{\textexclamdown} + \testprotrusion[l]{\textquestiondown} + \testprotrusion[r]{)} + \testprotrusion[l]{(} + \testprotrusion{/} + \testprotrusion{\char`\\} + \testprotrusion{-} + \testprotrusion{\textendash} + \testprotrusion{\textemdash} + \testprotrusion{\textquoteleft} + \testprotrusion{\textquoteright} + \testprotrusion{\textquotedblleft} + \testprotrusion{\textquotedblright} + \testprotrusion{\quotesinglbase} + \testprotrusion{\quotedblbase} + \testprotrusion{\guilsinglleft} + \testprotrusion{\guilsinglright} + \testprotrusion{\guillemotleft} + \testprotrusion{\guillemotright} + +\newpage +The following displays the current font stretched by 5\%, +normal, and shrunk by 5\%: + +\bigskip +\newlength{\MTln} +\newcommand*\teststring + {ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789} +\settowidth{\MTln}{\teststring} +\microtypesetup{expansion=true} + +\parbox{1.05\MTln}{\teststring\linebreak\\ + \teststring}\par\bigskip +\parbox{0.95\MTln}{\teststring} + +\end{document} +%</test> +% \end{macrocode} +% Needless to say that things may always be improved. For suggestions, mail to +% \mailtoRS. +% +% ^^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{10590} +% +% \Finale +% +\endinput +% +% ----------------------------------------------------------------------------- + + *** Typesetting the documentation *** + + The documentation of this package (microtype.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) Run +pdflatex microtype.dtx +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) Run +makeindex -s microtype-gind.ist microtype +# (6) Run +makeindex -s gglo.ist -o microtype.gls microtype.glo microtype-utf.glo +# (7) 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) +# - TeX Gyre Pagella (OpenType) ] +# (8) Run +pdflatex microtype.dtx +# (9) Run +makeindex -s microtype-gind.ist microtype +# (10) Run +makeindex -s gglo.ist -o microtype.gls microtype.glo microtype-utf.glo +# (11) Run +pdflatex microtype.dtx +# +# That's it, although I still may have forgotten some things ... +% +% -- RS +% ----------------------------------------------------------------------------- +% +% vim: ts=2:sw=2:et: +% diff --git a/macros/latex/contrib/microtype/microtype.ins b/macros/latex/contrib/microtype/microtype.ins new file mode 100644 index 0000000000..a3e78ea1e5 --- /dev/null +++ b/macros/latex/contrib/microtype/microtype.ins @@ -0,0 +1,170 @@ +% !Mode:: "TeX:STY:UK" +% ------------------------------------------------------------------------ +\input docstrip +\keepsilent +\askonceonly +\let\MetaPrefix\relax +\preamble + +------------------------------------------------------------------------ + + The `microtype' package + Subliminal refinements towards typographical perfection + Copyright (c) 2004--2018 R Schlicht <w.m.l@gmx.net> + +This work may be distributed and/or modified under the conditions of the +LaTeX Project Public License, either version 1.3c of this license or (at +your option) any later version. The latest version of this license is in: +http://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 `author-maintained'. + +This work consists of the files microtype.dtx and microtype.ins and the +derived files microtype.sty, microtype-pdftex.def, microtype-luatex.def, +microtype-xetex.def, microtype.lua and letterspace.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. +------------------------------------------------------------------------ + +\endpreamble +{\catcode`\^^M=13 % + \gdef\declarepreambleX#1#2 +\endpreamble{\endgroup% + \def^^M{^^J\MetaPrefix\space}% + \edef#1{\firstpreamblepart\checkeoln#2\lastpreamblepart\empty}}} +\def\defaultlastpreamblepart{^^J\MetaPrefix\space +------------------------------------------------------------------------ +^^J\MetaPrefix} +\let\firstpreamblepart\defaultpreamble +\let\lastpreamblepart \defaultlastpreamblepart +\declarepreamble\lsppreamble + This is a stand-alone version that only provides the letterspacing + commands. Do not use this package together with the `microtype' package. + Please refer to section 7 of the `microtype' documentation. +\endpreamble +\declarepreamble\defpreamble + This file contains enginge-specific definitions. +\endpreamble +\declarepreamble\luapreamble + This file contains auxiliary lua functions. + It was originally contributed by Elie Roux <elie.roux{at}telecom-bretagne.eu>. + (Bugs are mine.) +\endpreamble +\declarepreamble\cfgpreamble + This is the main configuration file for the `microtype' package. + It contains settings for font expansion and character protrusion, + tracking, interword spacing and additional kerning, as well as + character inheritance and font set declarations. + You may customise these settings here, or in a different file. + Please consult the documentation for details.^^M + If you think you have found improvements to these settings, please + let me know.^^M + When modifying this file, also change the identification line below. +\endpreamble +\declarepreamble\fontpreamble + This is a font-specific configuration file for the `microtype' package. + It may contain settings for font expansion and character protrusion, + tracking, interword spacing and additional kerning, as well as + character inheritance declarations. + Please consult the documentation for details.^^M + If you think you have found improvements to these settings, please + let me know.^^M + When modifying this file, also change the identification line below. +\endpreamble +\declarepreamble\testpreamble + This file might be useful to test protrusion settings for a font. + You can do whatever you want with it. +\endpreamble +\let\firstpreamblepart\fontpreamble +\let\lastpreamblepart \empty +\declarepreamble\contribpreamble^^M + These settings have been prepared by, and are copied with the + generous permission of: +\endpreamble +\let\firstpreamblepart\contribpreamble +\let\lastpreamblepart \defaultlastpreamblepart +\declarepreamble\haraldandkarlpreamble^^M + Harald Harders <h.harders{at}tu-bs.de> and + Karl Karlsson <karl-karlsson{at}yandex.ru>.^^M +\endpreamble +\declarepreamble\lorenpreamble^^M + Loren B. Davis. (c) 2012 + + ------------------------------------------------------------------------ + Palatino is a registered trademark of Linotype GmbH. + Used without permission. +\endpreamble +\declarepostamble\emptypostamble +\endpostamble + +% ------------------------------------------------------------------------ + +\def\makefile#1#2{\file{#1}{\from{microtype.dtx}{#2}}} +\def\makecfg#1#2{\makefile{mt-#2.cfg}{config,cfg-#1,#2}} +\def\makeutfcfg#1{\file{mt-#1.cfg}{\from{microtype-utf.dtx}{#1}}} + +\usedir{tex/latex/microtype} +\let\MetaPrefix\DoubleperCent +\let\DEBUG\empty +%\def\DEBUG{,debug} + +\generate{ + \makefile{microtype.sty}{package\DEBUG} + \usepreamble\defpreamble + \makefile{microtype-pdftex.def}{pdftex-def\DEBUG} + \makefile{microtype-luatex.def}{luatex-def\DEBUG} + \makefile{microtype-xetex.def} {xetex-def\DEBUG} + \usepreamble\lsppreamble + \makefile{letterspace.sty}{letterspace,plain} + \usepreamble\cfgpreamble + \makefile{microtype.cfg}{config,cfg-t,m-t} + \usepreamble\fontpreamble + \makecfg{t}{bch} + \makecfg{t}{blg} + \makecfg{t}{cmr} + \makecfg{t}{pad} + \makecfg{t}{ppl} + \makecfg{t}{ptm} + \makecfg{t}{ugm} + \makecfg{u}{msa} + \makecfg{u}{msb} + \makecfg{u}{euf} + \makecfg{u}{eur} + \makecfg{u}{eus} + \makecfg{e}{zpeu} + \makecfg{e}{euroitc} + \makecfg{e}{mvs} + \makeutfcfg{LatinModernRoman} + \makeutfcfg{CharisSIL} + \usepreamble\haraldandkarlpreamble + \makecfg{t}{pmn} + \usepreamble\lorenpreamble + \makeutfcfg{PalatinoLinotype} + \usepreamble\testpreamble + \makefile{test-microtype.tex}{test} +} + +\usepostamble\emptypostamble + +%% package for the extra documentation +%% (microtype-utf.dtx, microtype-logo.dtx, microtype-lssample.dtx): +%\generate{\makefile{microtype-doc.sty}{docsty}} +%% makeindex style +%\generate{\makefile{microtype-gind.ist}{docist}} + +\def\MetaPrefix{--} +\generate{ + \usepreamble\luapreamble + \makefile{microtype.lua}{luafile} +} + +\obeyspaces +\Msg{***********************************************************************} +\Msg{* To finish installation, move all files to their appropriate places. *} +\Msg{* See the documentation for details. *} +\Msg{***********************************************************************} + +\endbatchfile diff --git a/macros/latex/contrib/microtype/microtype.pdf b/macros/latex/contrib/microtype/microtype.pdf Binary files differnew file mode 100644 index 0000000000..0cd1804f64 --- /dev/null +++ b/macros/latex/contrib/microtype/microtype.pdf |