summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/fontaxes
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /macros/latex/contrib/fontaxes
Initial commit
Diffstat (limited to 'macros/latex/contrib/fontaxes')
-rw-r--r--macros/latex/contrib/fontaxes/README55
-rw-r--r--macros/latex/contrib/fontaxes/fontaxes.dtx1296
-rw-r--r--macros/latex/contrib/fontaxes/fontaxes.ins56
-rw-r--r--macros/latex/contrib/fontaxes/fontaxes.pdfbin0 -> 116269 bytes
4 files changed, 1407 insertions, 0 deletions
diff --git a/macros/latex/contrib/fontaxes/README b/macros/latex/contrib/fontaxes/README
new file mode 100644
index 0000000000..68a4b3fb1c
--- /dev/null
+++ b/macros/latex/contrib/fontaxes/README
@@ -0,0 +1,55 @@
+fontaxes - Additional font axes for LaTeX
+=========================================
+
+The fontaxes package adds several new font axes on top of LaTeX's New Font
+Selection Scheme. In particular, it splits the shape axis into a primary and
+a secondary shape axis, and it adds three new axes to deal with the different
+figure versions offered by many professional fonts.
+
+Usage
+-----
+
+To use this package, include
+
+ \usepackage{fontaxes}
+
+in the preamble of your LaTeX document. See the PDF documentation for details.
+
+Installation
+------------
+
+1. Run `latex fontaxes.ins` to generate the LaTeX package.
+
+2. Create the following directories in a local texmf tree:
+
+ - doc/latex/fontaxes
+ - tex/latex/fontaxes
+
+3. Copy all necessary files into the texmf tree:
+
+ - fontaxes.pdf and test-fontaxes.tex go to doc/latex/fontaxes
+ - fontaxes.sty goes to tex/latex/fontaxes
+
+4. Afterwards, you may need to regenerate the file database:
+
+ texhash
+
+License
+-------
+
+Copyright (c) 2007 by Andreas Buehmann
+Copyright (c) 2014 by Michael Ummels <michael.ummels@rwth-aachen.de>
+
+This work may be distributed and modified under the terms and conditions of the
+LaTeX Project Public License, version 1.3c or greater (your choice).
+The latest version of this license is in
+ http://www.latex-project.org/lppl.txt
+and version 1.3 or later is part of all distributions of LaTeX
+version 2005/12/01 or later.
+
+This work has the LPPL maintenance status `maintained'.
+
+The Current Maintainer of this work is Michael Ummels.
+
+This work consists of the files fontaxes.dtx, fontaxes.ins and
+the derived files fontaxes.sty, test-fontaxes.tex and fontaxes.pdf.
diff --git a/macros/latex/contrib/fontaxes/fontaxes.dtx b/macros/latex/contrib/fontaxes/fontaxes.dtx
new file mode 100644
index 0000000000..d39353339f
--- /dev/null
+++ b/macros/latex/contrib/fontaxes/fontaxes.dtx
@@ -0,0 +1,1296 @@
+% \iffalse meta-comment
+%
+% Copyright (c) 2007 by Andreas B\"uhmann
+% Copyright (c) 2014 by Michael Ummels <michael.ummels@rwth-aachen.de>
+%
+% 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.3 or later is part of all distributions of LaTeX
+% version 2005/12/01 or later.
+%
+% This work has the LPPL maintenance status `maintained'.
+%
+% The Current Maintainer of this work is Michael Ummels.
+%
+% This work consists of the files fontaxes.dtx, fontaxes.ins and
+% the derived files fontaxes.sty, test-fontaxes.tex and fontaxes.pdf.
+%
+% \fi
+%
+%\iffalse
+%<*driver>
+\ProvidesFile{fontaxes.dtx}[2014/03/23 v1.0d Font selection axes]
+%</driver>
+%<package>\NeedsTeXFormat{LaTeX2e}
+%<package>\ProvidesPackage{fontaxes}[2014/03/23 v1.0d Font selection axes]
+%<*driver>
+\documentclass{ltxdoc}
+
+\usepackage[T1]{fontenc}
+\usepackage{charter}
+\usepackage[scaled=1.05]{inconsolata}
+\usepackage{array}
+\usepackage{booktabs}
+\usepackage{floatrow}
+\usepackage{hypdoc}
+\usepackage{microtype}
+
+\hypersetup{
+ bookmarksnumbered,
+ colorlinks=false,
+ pdfborder={0 0 0},
+ pdftitle={Axes, axes, axes},
+ pdfauthor={Andreas B\"uhmann, Michael Ummels}
+}
+
+\newcommand*\pkg[1]{\mbox{#1}}
+\newcommand*\acro[1]{#1}
+\newcommand*\axis[1]{\textit{#1}}
+\floatsetup[table]{capposition=top}
+
+\begin{document}
+\DocInput{fontaxes.dtx}
+\end{document}
+%</driver>
+%\fi
+%
+% \CheckSum{738}
+% \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 \~}
+%
+% \GetFileInfo{fontaxes.dtx}
+%
+% \title{Axes, axes, axes}
+% \author{Andreas B\"uhmann \and Michael Ummels}
+% \date{\fileversion\ -- \filedate}
+% \maketitle
+%
+% \begin{abstract}
+% The \pkg{fontaxes} package simulates multiple independent font selection
+% axes on top of certain single \acro{NFSS} axes: \axis{base family},
+% \axis{figure style}, and \axis{figure alignment} on top of \axis{family};
+% \axis{primary shape} and \axis{secondary shape} on top of \axis{shape};
+% and \axis{math weight} and \axis{math figure alignment} on top of
+% \axis{math version}.
+% \end{abstract}
+%
+% \tableofcontents
+%
+% \section{Introduction}
+%
+% The introduction of the New Font Selection Scheme (\acro{NFSS}) has
+% greatly simplified the usage of \LaTeX\ with fonts different from the
+% Computer Modern fonts originally designed for \TeX. However, the \acro{NFSS}
+% has some limitations. In particular, it~defines only one axis for the font
+% shape, which caters for both the actual \emph{shape} of the font (e.g.\
+% upright, italic or slanted) and the \emph{case} of the font (e.g.\
+% upper-lower case and small-caps). For example, if the current font shape is
+% italic, then selecting small capitals using |\scshape| or |\textsc| will
+% revert to an upright shape, even if the font has italic small capitals.
+%
+% The \pkg{fontaxes} package alleviates the deficiencies of the \acro{NFSS}
+% by simulating multiple axes on top of single \acro{NFSS} axes. In particular,
+% it replaces the single \acro{NFSS} shape axis by a primary and a secondary
+% shape axis, catering for the shape and the case of the font, respectively.
+% Moreover, the package introduces three new axes to deal
+% with different \emph{figure versions}, which are provided by many
+% professional fonts.
+%
+% \section{Usage}
+%
+% You can load this package by adding
+% \begin{quote}
+% |\usepackage{fontaxes}|
+% \end{quote}
+% to the preamble of your document. This redefines and makes available
+% certain font selection commands, which are described in the rest of
+% this section.
+%
+% \subsection{Shape}
+%
+% The \pkg{fontaxes} package splits the \acro{NFSS}'s single shape axis into
+% two: the primary shape axis (|n|, |it|, etc.) and the secondary shape axis
+% (|ulc|, |sc|, etc.).
+%
+% \DescribeMacro\upshape %
+% \DescribeMacro\itshape %
+% \DescribeMacro\slshape %
+% \DescribeMacro\swshape %
+% The commands |\upshape|, |\itshape|, and |\slshape| are redefined
+% to access the primary axis only. For access to a swash shape, the command
+% |\swshape| has been added.
+%
+% \DescribeMacro\ulcshape %
+% \DescribeMacro\scshape %
+% \DescribeMacro\sscshape %
+% The commands |\scshape| and |\sscshape| (spaced small caps) access the
+% secondary axis. To return from any small-caps shape to upper-lower case,
+% you can use the command |\ulcshape|.
+%
+% \DescribeMacro\fontprimaryshape %
+% \DescribeMacro\fontsecondaryshape %
+% All these commands update the two shape axes using the low-level commands
+% |\fontprimaryshape|\marg{value} and |\fontsecondaryshape|\marg{value}.
+%
+% \DescribeMacro\swdefault %
+% \DescribeMacro\sscdefault %
+% \DescribeMacro\ulcdefault %
+% If you want to change which values are used by the various commands
+% |\|\meta{abbr}|shape|, redefine the corresponding |\|\meta{abbr}|default|.
+% The additional commands |\swdefault|, |\sscdefault|, and |\ulcdefault| are
+% provided with their default values |sw|, |ssc|, and |ulc|, respectively.
+%
+% \subsection{Figure version}
+%
+% Different figure versions are usually implemented as different font families
+% (e.g.\ |MinionPro-{OsF,LF,TOsF,TLF}| or |ppl{j,x}|).
+% The \pkg{fontaxes} package splits off the axes \axis{figure style} and
+% \axis{figure alignment}, which leaves the \axis{base family} (e.g.\
+% |MinionPro| or |ppl|).\pagebreak
+%
+% \changes{v0.2}{2005/05/04}{Rename figures switching commands
+% |\|\meta{\dots}|fig|.}
+% \DescribeMacro\txfigures %
+% \DescribeMacro\lnfigures %
+% \DescribeMacro\tbfigures %
+% \DescribeMacro\prfigures %
+% The \pkg{fontaxes} package knows two figure styles, |text| and |lining|
+% (accessible via |\txfigures| and |\lnfigures|), and two modes of figure
+% alignment, |tabular| and |proportional| (accessible via the switches
+% |\tbfigures| and |\prfigures|).
+%
+% \DescribeMacro\fontfigurestyle %
+% \DescribeMacro\fontfigurealignment %
+% Additionally, you can access both axes directly using the low-level commands
+% |\fontfigurestyle|\marg{value} and |\fontfigurealignment|\marg{value}.
+%
+% \DescribeMacro\fontbasefamily %
+% If you want to change the font family without changing the figure version,
+% use |\fontbasefamily|\marg{value}. (All |\font|\dots\ commands
+% require a successive |\selectfont| to make the changes take effect.)
+%
+% For choosing the figure versions to be used in math mode, you can use the
+% corresponding axis \axis{math figure alignment}. Note that there is
+% currently no means for changing the figure style used in math.
+%
+% \subsection{Math version}
+%
+% \DescribeMacro\boldmath %
+% \DescribeMacro\unboldmath %
+% By default, \LaTeX\ provides two math versions, |normal| and |bold|, as well
+% as commands |\boldmath| and |\unboldmath| for switching between them. The
+% \pkg{fontaxes} packages redefines these commands to operate on the axis
+% \axis{math weight}.
+%
+% \DescribeMacro\tabularmath %
+% \DescribeMacro\proportionalmath %
+% A second axis \axis{math figure alignment} is introduced that allows you to
+% switch between |tabular| and |proportional| figures using |\tabularmath| and
+% |\proportionalmath|. (This assumes the presence of additional math versions
+% |tabular| and |boldtabular|; the package will copy the setups of math
+% versions |normal| and |bold| at the end of the preamble in case you do not
+% provide your own declarations.)
+%
+% \DescribeMacro\mathweight %
+% \DescribeMacro\mathfigurealignment %
+% You can directly assign values to the axes using the low-level commands
+% |\mathweight|\marg{value} and |\mathfigurealignment|\marg{value}.
+%
+% Table~\ref{tab:cmds} summarizes which commands set which values on which
+% axes.\par
+% \newcommand\nextaxis{\addlinespace[1\jot]}%
+% \begin{table}\centering
+% \begin{tabular}{@{}llll@{}}
+% \toprule
+% Command & Axis & Value & Default\\
+% \midrule
+% |\upshape| & |\fontprimaryshape| & |\updefault| & |n| \\
+% |\itshape| & & |\itdefault| & |it| \\
+% |\slshape| & & |\sldefault| & |sl| \\
+% |\swshape| & & |\swdefault| & |sw| \\
+% \nextaxis
+% |\ulcshape| & |\fontsecondaryshape| & |\ulcdefault| & |ulc| \\
+% |\scshape| & & |\scdefault| & |sc| \\
+% |\sscshape| & & |\sscdefault| & |ssc| \\
+% \midrule
+% |\txfigures| & |\fontfigurestyle| & |text| \\
+% |\lnfigures| & & |lining| \\
+% \nextaxis
+% |\tbfigures| & |\fontfigurealignment| & |tabular| \\
+% |\prfigures| & & |proportional| \\
+% \nextaxis
+% \meta{none} & |\fontbasefamily| & \meta{font-dependent}\\
+% \midrule
+% |\boldmath| & |\mathweight| & |bold| \\
+% |\unboldmath| & & |normal| \\
+% \nextaxis
+% |\tabularmath| & |\mathfigurealignment| & |tabular| \\
+% |\proportionalmath| & & |proportional| \\
+% \bottomrule
+% \end{tabular}
+% \caption{Summary of commands}
+% \label{tab:cmds}
+% \end{table}
+%
+% \subsection{Additional commands}
+%
+% \DescribeMacro\textsw %
+% \DescribeMacro\textssc %
+% \DescribeMacro\textulc %
+% \DescribeMacro\textfigures %
+% \DescribeMacro\liningfigures %
+% \DescribeMacro\tabularfigures %
+% \DescribeMacro\proportionalfigures %
+% Similar to the well-known |\textit|, |\textsc|, etc.\ this package provides
+% commands |\textsw|, |\textssc|, |\textulc|, |\textfigures|, |\liningfigures|,
+% |\tabularfigures| and |\proportionalfigures| that take one argument and
+% apply the font change only to the argument.
+% For example, |\textsw|\marg{text} is roughly equivalent to
+% |{\swshape|\meta{text}|}| (but automatically adds italic corrections).
+%
+% \DescribeMacro\figureversion %
+% The command |\figureversion|\marg{options} allows easy switching of multiple
+% aspects of figures simultaneously. It takes as an argument a comma-separated
+% list of one or more of the following options:
+% \begin{quote}
+% \begin{tabular}{@{}ll}
+% |text|, |osf| & for text figures,\\
+% |lining|, |lf| & for lining figures,\\
+% |tabular|, |tab| & for tabular figures,\\
+% |proportional|, |prop| & for proportional figures.
+% \end{tabular}
+% \end{quote}
+% For example, |\figureversion{lf,tab}| selects tabular lining figures.
+%
+% \iffalse
+% \section{Naming conventions}
+%
+% How to name your font families and shapes so they will work with this
+% package. (To be done \dots)
+% \fi
+%
+% \StopEventually{}
+%
+% \section{Implementation}
+%
+% \subsection{High-level author commands (Level 1)}
+%
+% \subsubsection{Shape}
+%
+% \begin{macro}{\upshape}
+% \begin{macro}{\itshape}
+% \begin{macro}{\slshape}
+% \begin{macro}{\swshape}
+% Axis 1: primary shape
+% \begin{macrocode}
+%<*package>
+\DeclareRobustCommand\upshape{\not@math@alphabet\upshape\relax
+ \fontprimaryshape\updefault\selectfont}
+\DeclareRobustCommand\itshape{\not@math@alphabet\itshape\mathit
+ \fontprimaryshape\itdefault\selectfont}
+\DeclareRobustCommand\slshape{\not@math@alphabet\slshape\relax
+ \fontprimaryshape\sldefault\selectfont}
+\DeclareRobustCommand\swshape{\not@math@alphabet\swshape\relax
+ \fontprimaryshape\swdefault\selectfont}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \changes{v0.2}{2005/05/04}{Renamed |nosc| to |ulc| (upper and lower case).}
+% \begin{macro}{\scshape}
+% \begin{macro}{\sscshape}
+% \begin{macro}{\ulcshape}
+% Axis 2: secondary shape
+% \begin{macrocode}
+\DeclareRobustCommand\scshape{\not@math@alphabet\scshape\relax
+ \fontsecondaryshape\scdefault\selectfont}
+\DeclareRobustCommand\sscshape{\not@math@alphabet\sscshape\relax
+ \fontsecondaryshape\sscdefault\selectfont}
+\DeclareRobustCommand\ulcshape{\not@math@alphabet\ulcshape\relax
+ \fontsecondaryshape\ulcdefault\selectfont}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \changes{v1.0}{2011/09/16}{Added compatibility macro}
+% \begin{macro}{\noscshape}
+% Provide an alias for compatibility with the \pkg{slantsc} package.
+% \begin{macrocode}
+\let\noscshape\ulcshape
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\swdefault}
+% \begin{macro}{\ulcdefault}
+% \begin{macro}{\sscdefault}
+% \begin{macrocode}
+\providecommand\swdefault{sw}
+\providecommand\ulcdefault{ulc}
+\providecommand\sscdefault{ssc}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\textsw}
+% \begin{macro}{\textssc}
+% \begin{macro}{\textulc}
+% \begin{macrocode}
+\DeclareTextFontCommand{\textsw}{\swshape}
+\DeclareTextFontCommand{\textssc}{\sscshape}
+\DeclareTextFontCommand{\textulc}{\ulcshape}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \subsubsection{Figure version}
+%
+% \begin{macro}{\txfigures}
+% \begin{macro}{\lnfigures}
+% Axis 1: figure style
+% \begin{macrocode}
+\def\txfigures{\@nomath\txfigures
+ \fontfigurestyle{text}\selectfont}
+\def\lnfigures{\@nomath\lnfigures
+ \fontfigurestyle{lining}\selectfont}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\tbfigures}
+% \begin{macro}{\prfigures}
+% Axis 2: figure alignment
+% \begin{macrocode}
+\def\tbfigures{\@nomath\tbfigures
+ \fontfigurealignment{tabular}\selectfont}
+\def\prfigures{\@nomath\prfigures
+ \fontfigurealignment{proportional}\selectfont}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \changes{v0.2}{2005/05/04}{Renamed |oldstyle| to |text|}
+% \begin{macro}{\figureversion}
+% \changes{v0.2}{2005/05/04}{Added abbreviated options |tab| and |prop|.}
+% This code originally appeared in the package \pkg{MinionPro}. We have
+% adapted it to work within \pkg{fontaxes}' framework and also changed some
+% option names.
+% \begin{macrocode}
+\newcommand\fontaxes@fv@prefix{fontaxes@fv@switch@}
+\newcommand*\fontaxes@fv@newoption[1]%
+ {\expandafter\newcommand\csname\fontaxes@fv@prefix #1\endcsname}
+\fontaxes@fv@newoption{text}{\txfigures}
+\fontaxes@fv@newoption{osf}{\txfigures}
+\fontaxes@fv@newoption{lining}{\lnfigures}
+\fontaxes@fv@newoption{lf}{\lnfigures}
+\fontaxes@fv@newoption{tabular}{\tbfigures\tabularmath}
+\fontaxes@fv@newoption{tab}{\tbfigures\tabularmath}
+\fontaxes@fv@newoption{proportional}{\prfigures\proportionalmath}
+\fontaxes@fv@newoption{prop}{\prfigures\proportionalmath}
+% \end{macrocode}
+% We simply iterate over the list of figure versions specified in the argument
+% to |\figureversion| and check if we have specified a matching option.
+% \begin{macrocode}
+\newcommand\fontaxes@fv@list{}
+\newcommand\fontaxes@fv{}
+\DeclareRobustCommand*\figureversion[1]{%
+ \edef\fontaxes@fv@list{\zap@space#1 \@empty}%
+ \@for\fontaxes@fv:=\fontaxes@fv@list\do{%
+ \@ifundefined{\fontaxes@fv@prefix\fontaxes@fv}{%
+ \PackageWarning{fontaxes}%
+ {Unknown figure style `\fontaxes@fv'\MessageBreak
+ specified as the argument to \string\figureversion.\MessageBreak
+ Figure style not changed}%
+ }{%
+ \@nameuse{\fontaxes@fv@prefix\fontaxes@fv}%
+ }%
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \noindent Axis 3: base family |\fontbasefamily{...}|
+%
+% \changes{v0.2}{2005/04/30}{Align command names with MinionPro.sty.}
+% \begin{macro}{\textfigures}
+% \begin{macro}{\liningfigures}
+% \begin{macro}{\tabularfigures}
+% \begin{macro}{\proportionalfigures}
+% \begin{macrocode}
+\DeclareTextFontCommand{\textfigures}{\txfigures}
+\DeclareTextFontCommand{\liningfigures}{\lnfigures}
+\DeclareTextFontCommand{\tabularfigures}{\tbfigures\tabularmath}
+\DeclareTextFontCommand{\proportionalfigures}
+ {\prfigures\proportionalmath}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \subsubsection{Math version}
+%
+% \begin{macro}{\boldmath}
+% \begin{macro}{\unboldmath}
+% Axis 1: weight
+% \begin{macrocode}
+\def\boldmath{\@nomath\boldmath
+ \mathweight{bold}}
+\def\unboldmath{\@nomath\unboldmath
+ \mathweight{normal}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\tabularmath}
+% \begin{macro}{\proportionalmath}
+% Axis 2: figure alignment
+% \begin{macrocode}
+\def\tabularmath{\@nomath\tabularmath
+ \mathfigurealignment{tabular}}
+\def\proportionalmath{\@nomath\proportionalmath
+ \mathfigurealignment{proportional}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \subsection{Low-level author commands (Level 2)}
+%
+% \begingroup\parindent0pt\obeylines
+% |\mathweight{bold,normal}| sets |\mathversion|;
+% |\mathfigurealignment{tabular,proportional}| sets |\mathversion|;
+% |\fontfigurestyle{text,lining}| sets |\fontfamily|;
+% |\fontfigurealignment{tabular,proportional}| sets |\fontfamily|;
+% |\fontbasefamily{...}| sets |\fontfamily|;
+% |\fontprimaryshape{n,it,sl,sw}| sets |\fontshape|;
+% |\fontsecondaryshape{ulc,sc,ssc}| sets |\fontshape|.
+% \endgroup
+%
+% \begin{macro}{\mathweight}
+% \begin{macro}{\mathfigurealignment}
+% \begin{macrocode}
+\DeclareRobustCommand\mathweight[1]{%
+ \fontaxes@get@math\edef\fontaxes@math@weight{#1}\fontaxes@set@math}
+\DeclareRobustCommand\mathfigurealignment[1]{%
+ \fontaxes@get@math\edef\fontaxes@math@align{#1}\fontaxes@set@math}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\fontfigurestyle}
+% \begin{macro}{\fontfigurealignment}
+% \begin{macro}{\fontbasefamily}
+% \begin{macrocode}
+\DeclareRobustCommand\fontfigurestyle[1]{%
+ \fontaxes@get@family\edef\fontaxes@figure@style{#1}\fontaxes@set@family}
+\DeclareRobustCommand\fontfigurealignment[1]{%
+ \fontaxes@get@family\edef\fontaxes@figure@align{#1}\fontaxes@set@family}
+\DeclareRobustCommand\fontbasefamily[1]{%
+ \fontaxes@get@family\edef\fontaxes@family@base{#1}\fontaxes@set@family}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\fontprimaryshape}
+% \begin{macro}{\fontsecondaryshape}
+% \begin{macrocode}
+\DeclareRobustCommand\fontprimaryshape[1]{%
+ \fontaxes@get@shape\edef\fontaxes@shape@one{#1}\fontaxes@set@shape}
+\DeclareRobustCommand\fontsecondaryshape[1]{%
+ \fontaxes@get@shape\edef\fontaxes@shape@two{#1}\fontaxes@set@shape}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \changes{v1.0c}{2011/12/16}{Disabled more commands for hyperref}
+% We have made most commands robust to protect them in moving arguments
+% (e.g.\ section titles). Additionally, we want these commands to
+% be ignored when \pkg{hyperref} is building \acro{PDF} strings
+% (e.g.\ for bookmarks).
+% \begin{macrocode}
+\AtBeginDocument{
+ \@ifpackageloaded{hyperref}{%
+ \pdfstringdefDisableCommands{%
+ \let\fontprimaryshape\@gobble
+ \let\fontsecondaryshape\@gobble
+ \let\fontfigurestyle\@gobble
+ \let\fontfigurealignment\@gobble
+ \let\fontbasefamily\@gobble
+ \let\textfigures\@firstofone
+ \let\liningfigures\@firstofone
+ \let\tabularfigures\@firstofone
+ \let\proportionalfigures\@firstofone
+ \let\textsw\@firstofone
+ \let\textssc\@firstofone
+ \let\textulc\@firstofone
+ }%
+ }{}%
+}
+% \end{macrocode}
+%
+% \subsection{Internals (Layer 3)}
+% \begingroup\parindent0pt\obeylines
+% |\fontaxes@set@math| sets |\mathversion|;
+% |\fontaxes@set@family| sets |\fontfamily|;
+% |\fontaxes@set@shape| sets |\fontshape|.
+% \endgroup
+%
+% \changes{v1.0a}{2011/10/05}{Changed default values}
+% \begin{macro}{\fontaxes@math@weight}
+% \begin{macro}{\fontaxes@math@align}
+% \begin{macro}{\fontaxes@family@base}
+% \begin{macro}{\fontaxes@figure@style}
+% \begin{macro}{\fontaxes@figure@align}
+% \begin{macro}{\fontaxes@shape@one}
+% \begin{macro}{\fontaxes@shape@two}
+% The macros that hold the current values of the axes (here with some
+% default values that will most certainly be overwritten during
+% initializiation; see |\fontaxes@get@|\dots).
+% \begin{macrocode}
+\newcommand*\fontaxes@math@weight{normal}
+\newcommand*\fontaxes@math@align{proportional}
+\newcommand*\fontaxes@family@base{cmr}
+\newcommand*\fontaxes@figure@style{lining}
+\newcommand*\fontaxes@figure@align{proportional}
+\newcommand*\fontaxes@shape@one{n}
+\newcommand*\fontaxes@shape@two{ulc}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\fontaxes@set@math}
+% \begin{macro}{\fontaxes@set@family}
+% \begin{macro}{\fontaxes@set@shape}
+% \begin{macrocode}
+\newcommand*\fontaxes@set@math{%
+ \fontaxes@encode@math
+ \mathversion{\fontaxes@code}%
+ \fontaxes@save\math@version}
+\newcommand*\fontaxes@set@family{%
+ \fontaxes@encode@family
+ \fontfamily{\fontaxes@code}%
+ \fontaxes@save\f@family}
+\newcommand*\fontaxes@set@shape{%
+ \fontaxes@encode@shape
+ \fontshape{\fontaxes@code}%
+ \fontaxes@save\f@shape}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\fontaxes@get@math}
+% \begin{macro}{\fontaxes@get@family}
+% \begin{macro}{\fontaxes@get@shape}
+% Check for changes: if changed, try to decode and update axes.
+% \begin{macrocode}
+\newcommand*\fontaxes@get@math{%
+ \iffontaxes@changed\math@version{%
+ \fontaxes@decode@{math}{\math@version}%
+ \ifx\fontaxes@edoc\relax\else
+ \edef\fontaxes@math@weight{\expandafter\@firstoftwo\fontaxes@edoc}%
+ \edef\fontaxes@math@align{\expandafter\@secondoftwo\fontaxes@edoc}%
+ \fi
+ \fontaxes@save\math@version
+ }{}%
+}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\newcommand*\fontaxes@get@family{%
+ \iffontaxes@changed\f@family{%
+ \let\fontaxes@edoc\relax
+ \expandafter\fontaxes@split@family\f@family--\@nnil
+ \ifx\fontaxes@split@suffix\relax\else
+ \fontaxes@decode@{figures}{\fontaxes@split@suffix}%
+ \fi
+ \ifx\fontaxes@edoc\relax
+% \end{macrocode}
+% Try alternative.
+% \begin{macrocode}
+ \expandafter\fontaxes@split@familyalt\f@family
+ \@empty\@empty\@empty\@empty\@nnil
+ \ifx\fontaxes@split@suffix\relax\else
+ \fontaxes@decode@{figuresalt}{\fontaxes@split@suffix}%
+ \fi
+ \ifx\fontaxes@edoc\relax
+ \fontaxes@warn@undecodable{family `\f@family'}%
+ \edef\fontaxes@family@base{\f@family}%
+ \else
+ \edef\fontaxes@family@base{\fontaxes@split@prefix}%
+ \edef\fontaxes@figure@style{\expandafter\@firstoftwo\fontaxes@edoc}%
+% \end{macrocode}
+% Do not overwrite align (does not occur in alternative naming scheme).
+% \begin{macrocode}
+ \fi
+ \else
+% \end{macrocode}
+% Store values.
+% \begin{macrocode}
+ \edef\fontaxes@family@base{\fontaxes@split@prefix}%
+ \edef\fontaxes@figure@style{\expandafter\@firstoftwo\fontaxes@edoc}%
+ \edef\fontaxes@figure@align{\expandafter\@secondoftwo\fontaxes@edoc}%
+ \fi
+ }{}%
+}
+% \end{macrocode}
+% \begin{macrocode}
+\newcommand*\fontaxes@get@shape{%
+ \iffontaxes@changed\f@shape{%
+ \fontaxes@decode@{shape}{\f@shape}%
+ \ifx\fontaxes@edoc\relax\else
+ \edef\fontaxes@shape@one{\expandafter\@firstoftwo\fontaxes@edoc}%
+ \edef\fontaxes@shape@two{\expandafter\@secondoftwo\fontaxes@edoc}%
+ \fi
+ \fontaxes@save\f@shape
+ }{}%
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \subsection{Encoding}
+%
+% \begin{macro}{\fontaxes@encode@math}
+% \begin{macro}{\fontaxes@encode@family}
+% \begin{macro}{\fontaxes@encode@figures}
+% \begin{macro}{\fontaxes@encode@figuresalt}
+% \begin{macro}{\fontaxes@encode@shape}
+% \begin{macrocode}
+\newcommand*\fontaxes@encode@math{%
+ \fontaxes@encode@{math}{{\fontaxes@math@weight}{\fontaxes@math@align}}%
+}
+% \end{macrocode}
+% Default is concatenation.
+% \begin{macrocode}
+\newcommand*\fontaxes@encode@math@default{%
+ \edef\fontaxes@code{\fontaxes@math@weight\fontaxes@math@align}}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\newcommand*\fontaxes@encode@family{%
+ \fontaxes@encode@{family}
+ {{\fontaxes@family@base}{\fontaxes@figure@style}{\fontaxes@figure@align}}%
+}
+% \end{macrocode}
+% Try different naming conventions.
+% \begin{macrocode}
+\newcommand*\fontaxes@encode@family@default{%
+ \fontaxes@encode@figures
+ \edef\fontaxes@code{\fontaxes@family@base-\fontaxes@code}%
+ \fontaxes@check@family\fontaxes@code
+ \iffontaxes@exists\else
+ \fontaxes@encode@figuresalt
+ \edef\fontaxes@code{\fontaxes@family@base\fontaxes@code}%
+ \fontaxes@check@family\fontaxes@code
+ \iffontaxes@exists\else
+ \edef\fontaxes@code{\fontaxes@family@base}%
+ \fi
+ \fi
+}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\newcommand*\fontaxes@encode@figures{%
+ \fontaxes@encode@{figures}{{\fontaxes@figure@style}{\fontaxes@figure@align}}%
+}
+\newcommand*\fontaxes@encode@figures@default{%
+ \edef\fontaxes@code{OsF}%
+ \PackageWarning{fontaxes}{Unknown figure version
+ `\fontaxes@figure@style\space + \fontaxes@figure@align'\MessageBreak
+ Encoding to `\fontaxes@code'}%
+}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\newcommand*\fontaxes@encode@figuresalt{%
+ \fontaxes@encode@{figuresalt}{{\fontaxes@figure@style}{\fontaxes@figure@align}}%
+}
+\newcommand*\fontaxes@encode@figuresalt@default{%
+ \PackageWarning{fontaxes}{Unknown figure version
+ `\fontaxes@figure@style\space + \fontaxes@figure@align'\MessageBreak
+ Encoding to `\fontaxes@code'}%
+ \edef\fontaxes@code{j}%
+}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\newcommand*\fontaxes@encode@shape{%
+ \fontaxes@encode@{shape}{{\fontaxes@shape@one}{\fontaxes@shape@two}}%
+}
+% \end{macrocode}
+% Default is (reverse) concatenation.
+% \begin{macrocode}
+\newcommand*\fontaxes@encode@shape@default{%
+ \edef\fontaxes@code{\fontaxes@shape@two\fontaxes@shape@one}%
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\fontaxes@encode@}
+% \begin{macrocode}
+\newcommand*\fontaxes@encode@[2]{%
+ \@ifundefined{fontaxes@encode@#1#2}
+ {\@nameuse{fontaxes@encode@#1@default}}
+ {\edef\fontaxes@code{\@nameuse{fontaxes@encode@#1#2}}}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\fontaxes@naming@exception}
+% \changes{v1.0b}{2011/11/14}{Added compatibility macro}
+% To do: Add a user interface to specify naming exceptions.
+% \begin{macrocode}
+\newcommand*\fontaxes@naming@exception[3]{%
+ \expandafter\edef\csname fontaxes@encode@#1#2\endcsname{#3}%
+}
+% \end{macrocode}
+% The following alias is defined for compatibility with
+% package files generated by autoinst.
+% \begin{macrocode}
+\let\fa@naming@exception\fontaxes@naming@exception
+% \end{macrocode}
+% The defaults |n| and |ulc| disappear when combined.
+% \begin{macrocode}
+\fontaxes@naming@exception{shape}{{n}{ulc}}{n}
+\fontaxes@naming@exception{shape}{{n}{sc}}{sc}
+\fontaxes@naming@exception{shape}{{n}{ssc}}{ssc}
+\fontaxes@naming@exception{shape}{{it}{ulc}}{it}
+\fontaxes@naming@exception{shape}{{sl}{ulc}}{sl}
+\fontaxes@naming@exception{shape}{{sw}{ulc}}{sw}
+% \end{macrocode}
+% The defaults disappear in the concatenation. |boldtabular| is formed
+% regularly.
+% \begin{macrocode}
+\fontaxes@naming@exception{math}{{normal}{proportional}}{normal}
+\fontaxes@naming@exception{math}{{normal}{tabular}}{tabular}
+\fontaxes@naming@exception{math}{{bold}{proportional}}{bold}
+% \end{macrocode}
+% Provide abbreviations for font family suffixes.
+% \begin{macrocode}
+\fontaxes@naming@exception{figures}{{text}{proportional}}{OsF}
+\fontaxes@naming@exception{figures}{{text}{tabular}}{TOsF}
+\fontaxes@naming@exception{figures}{{lining}{proportional}}{LF}
+\fontaxes@naming@exception{figures}{{lining}{tabular}}{TLF}
+% \end{macrocode}
+% The |j|/|x| naming convention does not know about different figure
+% alignments; let us silently ignore these.
+% \begin{macrocode}
+\fontaxes@naming@exception{figuresalt}{{text}{proportional}}{j}
+\fontaxes@naming@exception{figuresalt}{{text}{tabular}}{j}
+\fontaxes@naming@exception{figuresalt}{{lining}{proportional}}{x}
+\fontaxes@naming@exception{figuresalt}{{lining}{tabular}}{x}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Decoding}
+%
+% Detect if |\mathversion|, |\fontshape|, |\fontfamily| have been used not
+% under control of this package.
+%
+% \begin{macro}{\fontaxes@figure@style@domain}
+% \begin{macro}{\fontaxes@figure@align@domain}
+% \begin{macro}{\fontaxes@shape@one@domain}
+% \begin{macro}{\fontaxes@shape@two@domain}
+% \begin{macro}{\fontaxes@math@weight@domain}
+% \begin{macro}{\fontaxes@math@align@domain}
+% Assuming an injective encoding function, we can construct decoding tables
+% when we know the function's domain. To do: Warn if decoding entries are
+% overwritten (if the function is not injective).
+% \begin{macrocode}
+\newcommand*\fontaxes@figure@style@domain{text,lining}
+\newcommand*\fontaxes@figure@align@domain{proportional,tabular}
+% \end{macrocode}
+% \begin{macrocode}
+\newcommand*\fontaxes@shape@one@domain{n,it,sl,sw}
+\newcommand*\fontaxes@shape@two@domain{ulc,sc,ssc}
+% \end{macrocode}
+% \begin{macrocode}
+\newcommand*\fontaxes@math@weight@domain{normal,bold}
+\newcommand*\fontaxes@math@align@domain{proportional,tabular}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\fontaxes@create@decode@table}
+% \changes{v0.2b}{2007/03/31}{Restore values of axes.}
+% |#1| name, |#2| list of axes
+% \begin{macrocode}
+\newcommand*\fontaxes@create@decode@table[2]{%
+ \begingroup
+ \fontaxes@foreach{#2}{%
+ \@nameuse{fontaxes@encode@#1}%
+ \global\expandafter
+ \edef\csname fontaxes@decode@#1{\fontaxes@code}\endcsname{#2}%
+ }%
+ \endgroup
+}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\AtEndOfPackage{
+ \fontaxes@create@decode@table{figures}
+ {{\fontaxes@figure@style}{\fontaxes@figure@align}}
+ \fontaxes@create@decode@table{figuresalt}
+ {{\fontaxes@figure@style}{\fontaxes@figure@align}}
+ \fontaxes@create@decode@table{shape}
+ {{\fontaxes@shape@one}{\fontaxes@shape@two}}
+ \fontaxes@create@decode@table{math}
+ {{\fontaxes@math@weight}{\fontaxes@math@align}}
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\fontaxes@warn@undecodable}
+% \begin{macrocode}
+\newcommand*\fontaxes@warn@undecodable[1]{%
+ \PackageWarning{fontaxes}{I don't know how to decode\MessageBreak #1}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\fontaxes@decode@}
+% \changes{v0.2a}{2007/03/21}{Fix error message.}
+% Interpret the decoding tables.
+% \begin{macrocode}
+\newcommand*\fontaxes@decode@[2]{%
+ \@ifundefined{fontaxes@decode@#1{#2}}{%
+ \let\fontaxes@edoc\relax
+ \fontaxes@warn@undecodable{#1 `#2'}%
+ }{\edef\fontaxes@edoc{\@nameuse{fontaxes@decode@#1{#2}}}}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\fontaxes@save}
+% \begin{macro}{\iffontaxes@changed}
+% Save states of macros for future comparison.
+% \begin{macrocode}
+\newcommand*\iffontaxes@changed[1]{%
+ \expandafter\ifx\csname fontaxes@last@\string#1\endcsname#1%
+ \expandafter\@secondoftwo
+ \else
+ \expandafter\@firstoftwo
+ \fi
+}
+\newcommand*\fontaxes@save[1]{%
+ \expandafter\let\csname fontaxes@last@\string#1\endcsname#1%
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \subsection{Compatibility}
+%
+% \begin{macro}{\fontaxes@provide@mv@copy}
+% \changes{v0.2}{2005/04/28}{Provide default math versions by copy.}
+% \changes{v1.0d}{2014/03/23}{Change order of macro definition and invocation.}
+% Declare math version |#1| to be a copy of math version |#2| if |#1| does not
+% exist already. To accomplish this, we have to know that a math version's
+% configuration is basically stored in a macro |\mv@|\meta{name} (which makes
+% us dependent on the NFSS implementation; sigh \dots).
+% \begin{macrocode}
+\newcommand*\fontaxes@provide@mv@copy[2]{%
+ \@ifundefined{mv@#1}{%
+ \DeclareMathVersion{#1}%
+ \expandafter\let\csname mv@#1\expandafter\endcsname
+ \csname mv@#2\endcsname
+ }{}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% If no math versions |tabular| and |boldtabular| are defined in the preamble,
+% we provide defaults by copying the states of |normal| and |bold| (assuming,
+% in turn, that these two exist).
+% \begin{macrocode}
+\AtBeginDocument{%
+ \fontaxes@provide@mv@copy{tabular}{normal}%
+ \fontaxes@provide@mv@copy{boldtabular}{bold}%
+}
+% \end{macrocode}
+%
+% \subsection{Tools}
+%
+% \begin{macro}{\fontaxes@check@family}
+% \begin{macro}{\iffontaxes@exists}
+% Check if family switching would yield an existing shape.
+% \begin{macrocode}
+\newif\iffontaxes@exists
+\newcommand*\fontaxes@check@family[1]{%
+ \begingroup
+ \fontfamily{#1}\try@load@fontshape
+ \expandafter
+ \ifx\csname\curr@fontshape\endcsname\relax
+ \aftergroup\fontaxes@existsfalse
+ \else
+ \aftergroup\fontaxes@existstrue
+ \fi
+ \endgroup
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\fontaxes@split@prefix}
+% \begin{macro}{\fontaxes@split@suffix}
+% The results of splitting a family name.
+% \begin{macrocode}
+\newcommand*\fontaxes@split@prefix{}
+\newcommand*\fontaxes@split@suffix{}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\fontaxes@split@family}
+% Font name contains one hyphen; split there.
+% \begin{macrocode}
+\newcommand*\fontaxes@split@family{}
+\def\fontaxes@split@family#1-#2-#3\@nnil{%
+ \let\fontaxes@split@prefix\relax
+ \let\fontaxes@split@suffix\relax
+ \def\@tempa{#3}%
+ \ifx\@tempa\@empty\else
+ \def\fontaxes@split@suffix{#2}%
+ \ifx\fontaxes@split@suffix\@empty
+ \let\fontaxes@split@suffix\relax
+ \else
+ \def\fontaxes@split@prefix{#1}%
+ \fi
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\fontaxes@split@familyalt}
+% \changes{v1.0a}{2011/10/05}{Provide default suffix for lining figures.}
+% Name consists of four characters; split off the last one.
+% If there are just three characters, the default suffix is `x'.
+% \begin{macrocode}
+\newcommand*\fontaxes@split@familyalt{}
+\def\fontaxes@split@familyalt#1#2#3#4#5\@nnil{%
+ \let\fontaxes@split@prefix\relax
+ \let\fontaxes@split@suffix\relax
+ \edef\@tempa{#5}%
+ \ifx\@tempa\@empty
+ \ifx\@empty#4%
+ \def\fontaxes@split@prefix{#1#2#3}%
+ \def\fontaxes@split@suffix{x}%
+ \else
+ \def\fontaxes@split@prefix{#1#2#3}%
+ \def\fontaxes@split@suffix{#4}%
+ \fi
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\fontaxes@foreach}
+% \changes{v0.2}{2005/04/30}{More generic: allows an arbitrary number of axes.}
+% Execute |#2| for each combination of values of the axes given in |#1| (in the
+% form |{\cs}{\cs}|\dots).
+% \begin{macrocode}
+\newcommand\fontaxes@foreach[2]{%
+ \begingroup
+ \def\fontaxes@foreach@{#2}%
+ \@tfor\@tempa:=#1\do{%
+ \@temptokena\expandafter{\fontaxes@foreach@}%
+ \edef\fontaxes@foreach@{%
+ \noexpand\@for
+ \expandafter\noexpand\@tempa:=%
+ \expandafter\noexpand\csname
+ \expandafter\expandafter
+ \expandafter\@gobble
+ \expandafter\string\@tempa
+ @domain%
+ \endcsname
+ \noexpand\do{\the\@temptokena}%
+ }%
+ }%
+ \expandafter\endgroup\fontaxes@foreach@
+}
+%</package>
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Tests}
+%
+% The file |test-fontaxes.tex| (docstrip target |test|) exercises some
+% features of \pkg{fontaxes}. Since it is rather ad-hoc code, it is not shown
+% here. (It also requires the \pkg{MinionPro} package.)
+%
+% \Finale
+% \endinput
+%
+% \begin{macrocode}
+%<*test>
+\documentclass[a4paper]{article}
+\usepackage{MinionPro}
+\usepackage[T1]{fontenc}
+
+\usepackage{longtable}
+\usepackage{fontaxes}
+\usepackage{hyperref}
+
+\makeatletter
+\newcommand\showshape{\hphantom{\normalfont\textsuperscript{sscsw}}%
+ \llap{\expandafter\normalfont\expandafter\textsuperscript
+ \expandafter{\f@shape}}}
+
+\newcommand\shapecmdlist{\upshape,\itshape,\slshape,\swshape,%
+ \ulcshape,\scshape,\sscshape}
+\newcommand\reacheableshapes{}
+\newtoks\tab
+\newcommand\atab[1]{%
+ \tab\expandafter{\the\tab#1}%
+}
+\newcommand\etab[1]{%
+ \edef\line{#1}%
+ \expandafter\atab\expandafter{\line}%
+}
+\newif\ifadded
+\newcommand\testall{%
+ \edef\reacheableshapes{\shapedefault}
+ \addedtrue
+ \@whilesw\ifadded\fi{%
+ \addedfalse
+ \@for\@sh:=\reacheableshapes\do{%
+ \begingroup
+ \fontshape\@sh\relax
+ \@for\@cmd:=\shapecmdlist\do{%
+ \@cmd\relax
+ \@expandtwoargs\in@{,\f@shape,}{,\reacheableshapes,}%
+ \ifin@\else
+ \xdef\reacheableshapes{\reacheableshapes,\f@shape}%
+ \global\addedtrue
+ \fi
+ }%
+ \endgroup
+ }%
+ }
+ \tab{\begin{longtable}[t]{ll}}
+ \@for\@sh:=\reacheableshapes\do{%
+ \etab{\noexpand\fontshape{\@sh}}%
+ \atab{\selectfont\showshape Am Anfang &}%
+ \etab{\noexpand\fontshape{\@sh}}%
+ \atab{\begin{tabular}[t]{ll}}%
+ \@for\@cmd:=\shapecmdlist\do{%
+ \atab{\normalfont\ttfamily}%
+ \etab{\expandafter\string\@cmd &
+ \expandafter\noexpand\@cmd\noexpand\showshape war das Wort%
+ \noexpand\\\relax}%
+ }%
+ \atab{\end{tabular} \\\relax}%
+ }
+ \atab{\end{longtable}\endgraf}%
+ \the\tab
+}
+
+\makeatother
+\parindent=0pt
+
+\begin{document}
+
+\section{Shape}
+\subsection{Switches}
+\fontbasefamily{MinionPro}\selectfont
+\figureversion{text,proportional}%
+\testall
+
+\subsection{Text font commands}
+
+\makeatletter
+\def\amp{&}
+\def\visible#1#2\\{%
+ #1#2 \amp {\def\@tempa{#1}\edef\@tempa{\expandafter
+ \strip@prefix\meaning\@tempa}\normalfont\ttfamily{\@tempa}}\\}
+\makeatother
+\begin{tabular}{ll}
+Am \visible{\textit{Anfang \textsc{war}}} das Wort\\
+Am \visible{\textsl{Anfang \textulc{war}}} das Wort\\
+Am \visible{\textsw{Anfang \textssc{war}}} das Wort\\
+Am \visible{\textsc{Anfang \textsl{war}}} das Wort\\
+Am \visible{\textssc{Anfang \textit{war}}} das Wort\\
+\end{tabular}
+
+\section{Figure version}
+
+\tracingmacros=2
+\begin{tabular}{lll}
+\visible\txfigures 12345 \visible\lnfigures 67890\\
+\visible\txfigures 12345 \visible\tbfigures 67890\\
+\visible\txfigures 12345 \visible\prfigures 67890\\
+\visible\txfigures 12345 \visible\txfigures 67890\\
+\visible\lnfigures 12345 \visible\lnfigures 67890\\
+\visible\lnfigures 12345 \visible\tbfigures 67890\\
+\visible\lnfigures 12345 \visible\prfigures 67890\\
+\visible\lnfigures 12345 \visible\txfigures 67890\\
+\visible\tbfigures 12345 \visible\lnfigures 67890\\
+\visible\tbfigures 12345 \visible\tbfigures 67890\\
+\visible\tbfigures 12345 \visible\prfigures 67890\\
+\visible\tbfigures 12345 \visible\txfigures 67890\\
+\visible{\tbfigures\lnfigures}12345
+ \visible\lnfigures 67890\\
+\visible{\tbfigures\lnfigures}12345
+ \visible\tbfigures 67890\\
+\visible{\tbfigures\lnfigures}12345
+ \visible\prfigures 67890\\
+\visible{\tbfigures\lnfigures}12345
+ \visible\txfigures 67890\\
+\end{tabular}
+
+\begingroup
+\figureversion{osf,lf,tab,prop, tabular,proportional , text ,lining,
+non-existent}
+\endgroup
+
+\subsection{Switch base family}
+
+\begingroup
+\def\nums{1234567890\par}
+\txfigures MinionPro \nums
+\fontbasefamily{ppl}\selectfont
+Palatino \nums
+\lnfigures
+lining \nums
+\fontbasefamily{MinionPro}\selectfont
+MinionPro \nums
+\figureversion{lining,tabular}%
+lining and tabular \nums
+\fontbasefamily{ppl}\selectfont
+Palatino \nums
+\txfigures
+text \nums
+\fontbasefamily{MinionPro}\selectfont
+MinionPro again, should be text \emph{and tabular} \nums
+\endgroup
+
+\subsection{Text font commands}
+
+\def\nums{t123 $m123$}
+\begin{tabular}{lll}
+\nums\quad\visible{(\textfigures{\nums})}\quad \nums\\
+\nums\quad\visible{(\liningfigures{\nums})}\quad \nums\\
+\nums\quad\visible{(\tabularfigures{\nums})}\quad \nums\\
+\nums\quad\visible{(\proportionalfigures{\nums})}\quad \nums\\
+\nums\quad\visible{(\tabularfigures{\liningfigures{\nums}})}\quad \nums\\
+\end{tabular}
+
+\begingroup Same but start from lining tabular figures\par
+\lnfigures\tbfigures
+\begin{tabular}{lll}
+\nums\quad\visible{(\textfigures{\nums})}\quad \nums\\
+\nums\quad\visible{(\liningfigures{\nums})}\quad \nums\\
+\nums\quad\visible{(\tabularfigures{\nums})}\quad \nums\\
+\nums\quad\visible{(\proportionalfigures{\nums})}\quad \nums\\
+\nums\quad\visible{(\tabularfigures{\liningfigures{\nums}})}\quad \nums\\
+\end{tabular}
+\endgroup
+
+\subsection{In moving argument: o123 \liningfigures{l456}
+ \tabularfigures{t789}
+ \figureversion{text,text,lining,text,proportional}op012 \textsw{Swash}
+ \textssc{Spaced \textulc{Small} Caps}}
+
+\tableofcontents
+
+\section{Math version}
+
+\def\formula{$123 + a - \sqrt{\beta}$}
+\begin{tabular}{lll}
+\visible\unboldmath \formula\quad \visible\boldmath \formula\\
+\visible\unboldmath \formula\quad \visible\tabularmath \formula\\
+\visible\unboldmath \formula\quad \visible\proportionalmath \formula\\
+\visible\unboldmath \formula\quad \visible\unboldmath \formula\\
+\visible\boldmath \formula\quad \visible\boldmath \formula\\
+\visible\boldmath \formula\quad \visible\tabularmath \formula\\
+\visible\boldmath \formula\quad \visible\proportionalmath \formula\\
+\visible\boldmath \formula\quad \visible\unboldmath \formula\\
+\visible\tabularmath \formula\quad \visible\boldmath \formula\\
+\visible\tabularmath \formula\quad \visible\tabularmath \formula\\
+\visible\tabularmath \formula\quad \visible\proportionalmath \formula\\
+\visible\tabularmath \formula\quad \visible\unboldmath \formula\\
+\visible{\tabularmath\boldmath}\formula\quad \visible\boldmath \formula\\
+\visible{\tabularmath\boldmath}\formula\quad \visible\tabularmath \formula\\
+\visible{\tabularmath\boldmath}\formula\quad \visible\proportionalmath \formula\\
+\visible{\tabularmath\boldmath}\formula\quad \visible\unboldmath \formula\\
+\end{tabular}
+
+\section{Recovery}
+
+\makeatletter
+\def\showfont{\edef\@tempa{\curr@fontshape}\hfill
+{\normalfont\ttfamily\@tempa}}
+\def\showmath{$123xyz$ \edef\@tempa{\math@version}\hfill
+{\normalfont\ttfamily\@tempa}}
+\makeatother
+
+\begingroup
+\scshape scshape \showfont\par
+\fontshape{scit}\selectfont selecting scit explicitly \showfont\par
+\sscshape Sscshape should adapt\showfont\par
+\endgroup
+
+\bigskip
+\begingroup
+\boldmath boldmath \showmath\par
+\mathversion{tabular} selecting tabular explicitly \showmath\par
+\boldmath boldmath \showmath\par
+\endgroup
+
+\bigskip
+\begingroup
+\fontfamily{MinionPro-LF}\selectfont selecting MinionPro-LF explicitly \showfont\par
+\tbfigures tabularfigures 1234 \showfont\par
+\endgroup
+
+\bigskip
+\begingroup
+\tbfigures tabularfigures 1234 \showfont\par
+\fontfamily{pplx}\selectfont selecting pplx explicitly \showfont\par
+\txfigures textfigures 1234 \showfont\par
+\fontbasefamily{MinionPro}\selectfont
+Back to MinionPro (is tabular still there?) 1234 \showfont\par
+\fontfamily{ptm}\selectfont selecting ptm explicitly \showfont\par
+\lnfigures liningfigures 1234 \showfont\par
+\tbfigures tabularfigures 1234 \showfont\par
+\fontbasefamily{MinionPro}\selectfont Back \dots 1234 \showfont\par
+\endgroup
+
+\end{document}
+%</test>
+% \end{macrocode}
diff --git a/macros/latex/contrib/fontaxes/fontaxes.ins b/macros/latex/contrib/fontaxes/fontaxes.ins
new file mode 100644
index 0000000000..c6ff8090ed
--- /dev/null
+++ b/macros/latex/contrib/fontaxes/fontaxes.ins
@@ -0,0 +1,56 @@
+%
+% Copyright (c) 2007 by Andreas B\"uhmann
+% Copyright (c) 2014 by Michael Ummels <michael.ummels@rwth-aachen.de>
+%
+% 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.3 or later is part of all distributions of LaTeX
+% version 2005/12/01 or later.
+%
+% This work has the LPPL maintenance status `maintained'.
+%
+% The Current Maintainer of this work is Michael Ummels.
+%
+% This work consists of the files fontaxes.dtx, fontaxes.ins and
+% the derived files fontaxes.sty, test-fontaxes.tex and fontaxes.pdf.
+%
+
+\input docstrip
+
+\preamble
+
+Copyright (c) 2007 by Andreas Buehmann
+Copyright (c) 2014 by Michael Ummels <michael.ummels@rwth-aachen.de>
+
+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.3 or later is part of all distributions of LaTeX
+version 2005/12/01 or later.
+
+This work has the LPPL maintenance status `maintained'.
+
+The Current Maintainer of this work is Michael Ummels.
+
+This work consists of the files fontaxes.dtx, fontaxes.ins and
+the derived files fontaxes.sty, test-fontaxes.tex and fontaxes.pdf.
+
+\endpreamble
+
+\postamble
+\endpostamble
+
+\keepsilent
+\askforoverwritefalse
+
+\generate{
+ \file{fontaxes.sty}{\from{fontaxes.dtx}{package}}
+ \file{test-fontaxes.tex}{\from{fontaxes.dtx}{test}}
+}
+
+\endbatchfile
diff --git a/macros/latex/contrib/fontaxes/fontaxes.pdf b/macros/latex/contrib/fontaxes/fontaxes.pdf
new file mode 100644
index 0000000000..d45cb17285
--- /dev/null
+++ b/macros/latex/contrib/fontaxes/fontaxes.pdf
Binary files differ