summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/source/latex/mh/xfrac.dtx
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/source/latex/mh/xfrac.dtx')
-rw-r--r--Master/texmf-dist/source/latex/mh/xfrac.dtx882
1 files changed, 326 insertions, 556 deletions
diff --git a/Master/texmf-dist/source/latex/mh/xfrac.dtx b/Master/texmf-dist/source/latex/mh/xfrac.dtx
index f70ba65582c..0a4b2e3ad59 100644
--- a/Master/texmf-dist/source/latex/mh/xfrac.dtx
+++ b/Master/texmf-dist/source/latex/mh/xfrac.dtx
@@ -1,12 +1,14 @@
% \iffalse meta-comment
%
-% Copyright (C) 2004, 2008-2010 by Morten Hoegholm <mh.ctan@gmail.com>
+% Copyright (C) 2004, 2008, 2009 by Morten Hoegholm <mh.ctan@gmail.com>
%
% 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 1.3 of this license or (at your option) any later
% version. The latest version of this license is in
% http://www.latex-project.org/lppl.txt
+% and version 1.3 or later is part of all distributions of
+% LaTeX version 2005/12/01 or later.
%
% This work has the LPPL maintenance status "maintained".
%
@@ -64,7 +66,7 @@
\input docstrip.tex
\Msg{************************************************************************}
\Msg{* Installation}
-\Msg{* Package: xfrac 2009/08/10 v0.3 textstyle fractions (MH)}
+\Msg{* Package: xfrac 2009/08/10 v0.2a textstyle fractions (MH)}
\Msg{************************************************************************}
\keepsilent
@@ -74,13 +76,15 @@
This is a generated file.
-Copyright (C) 2004, 2008-2010 by Morten Hoegholm <mh.ctan@gmail.com>
+Copyright (C) 2004, 2008, 2009 by Morten Hoegholm <mh.ctan@gmail.com>
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 1.3 of this license or (at your option) any later
version. The latest version of this license is in
http://www.latex-project.org/lppl.txt
+and version 1.3 or later is part of all distributions of
+LaTeX version 2005/12/01 or later.
This work has the LPPL maintenance status "maintained".
@@ -122,7 +126,7 @@ and the derived files
%<*driver>
\NeedsTeXFormat{LaTeX2e}
\ProvidesFile{xfrac.drv}%
- [2010/02/02 v0.3 Text style fractions]
+ [2009/08/10 v0.2a textstyle fractions (MH)]
\RequirePackage{fix-cm}
\documentclass{ltxdoc}
@@ -170,7 +174,7 @@ and the derived files
\providecommand*\pkg[1]{\textsf{#1}}
\newcommand*\switch[2]{{\fontfamily{#1}\selectfont #2}}
-\usepackage{lmodern}
+
\begin{document}
\catcode`\_=12
\DocInput{xfrac.dtx}
@@ -180,10 +184,6 @@ and the derived files
%
% \GetFileInfo{xfrac.drv}
% \CheckSum{249}
-%
-% \changes{v0.3}{2010/02/02}{Update to new \pkg{xtemplate} system}
-% \changes{v0.3}{2010/02/02}{Include custom values for
-% \pkg{lmodern}}
%
% \changes{v0.2a}{2009/08/10}{Update for new version of expl3}
%
@@ -491,36 +491,36 @@ and the derived files
%
% \begin{TemplateDescription}{xfrac}{text}
%
-% \TemplateKey{numerator-font}{tokenlist}
+% \TemplateKey{numerator-font}{n}
% {Font family specification to use for the numerator.}
% {\cs{f@family}}
%
-% \TemplateKey{numerator-format}{function 1 arg}
+% \TemplateKey{numerator-format}{f1}
% {Action to be taken on the numerator.}
% {Process argument unchanged}
%
-% \TemplateKey{slash-symbol}{tokenlist}
+% \TemplateKey{slash-symbol}{n}
% {The separator symbol. If not specified the default value will be
% used instead.}
% {Solidus (\cs{textfractionsolidus})}
%
-% \TemplateKey{slash-symbol-font}{tokenlist}
+% \TemplateKey{slash-symbol-font}{n}
% {Font family specification to use for the separator symbol.}
% {\cs{f@family}}
%
-% \TemplateKey{slash-symbol-format}{function 1 arg}
+% \TemplateKey{slash-symbol-format}{f1}
% {Action to be taken on the separator symbol.}
% {Process argument unchanged}
%
-% \TemplateKey{denominator-font}{tokenlist}
+% \TemplateKey{denominator-font}{n}
% {Font family specification to use for the denominator.}
% {\cs{f@family}}
%
-% \TemplateKey{denominator-format}{function 1 arg}
+% \TemplateKey{denominator-format}{f1}
% {Action to be taken on the denominator.}
% {Process argument unchanged}
%
-% \TemplateKey{h-scale}{tokenlist}
+% \TemplateKey{h-scale}{n}
% {Factor by which the numerator and denominator should be
% horizontally scaled. It should only be used if the real superior
% and inferior fonts are not available. For instance Stempel
@@ -528,12 +528,12 @@ and the derived files
% by a factor of 1.1.}
% {1}
%
-% \TemplateKey{v-scale}{tokenlist}
+% \TemplateKey{v-scale}{n}
% {Same as \key{h-scale} only vertically. Probably not of much use
% but added for completetion.}
% {1}
%
-% \TemplateKey{scale-factor}{tokenlist}
+% \TemplateKey{scale-factor}{n}
% {Fraction of the size of \key{slash-symbol}. Used for setting the
% font size of numerator and denominator. Usually a value of app.\
% \sfrac{5}{6} produces fine results. It should only be used if the
@@ -541,50 +541,54 @@ and the derived files
% Stempel Garamond looks better if the factor is 0.9.}
% {0.83333}
%
-% \TemplateKey{scale-relative}{choice}
+% \TemplateKey{scale-relative}{s}
% {If set to `true' the font size of the numerator and denominator
% is scaled with respect to the height of the \key{slash-symbol}. If
% set to `false' the font is scaled with respect to the total height
% of the \key{slash-symbol}.}
% {true}
%
-% \TemplateKey{scaling}{choice}
+% \TemplateKey{scaling}{s}
% {If set to `true' the fonts are allowed to scale. If set to
% `false' they are not. See the `Janson' example for an application.}
% {true}
%
-% \TemplateKey{numerator-top-sep}{length}
+% \TemplateKey{numerator-top-sep}{L}
% {Dimension specifying the space between the top of the
% \key{slash-symbol} and the top of the numerator. If not specified,
% the depth of the solidus will be used, because this value will
% make the fraction look even.}
% {Unspecified}
%
-% \TemplateKey{numerator-bot-sep}{length}
+% \TemplateKey{numerator-bot-sep}{L}
% {Dimension specifying the lift of the numerator from the
% baseline.}
% {Unspecified}
%
-% \TemplateKey{denominator-bot-sep}{length}
+% \TemplateKey{denominator-bot-sep}{L}
% {Dimension specifying the lift of the denominator from the
% baseline.}
% {Unspecified}
%
-% \TemplateKey{slash-right-kern}{length}
+% \TemplateKey{slash-right-kern}{L}
% {Dimension specifying the kerning between the \key{slash-symbol}
-% and the numerator.}
+% and the numerator. If specified in terms of font specific
+% dimensions such as \texttt{em} it is better to use
+% \cs{DelayEvaluation}.}
% {\texttt{0pt}}
%
-% \TemplateKey{slash-left-kern}{length}
+% \TemplateKey{slash-left-kern}{L}
% {Dimension specifying the kerning between the \key{slash-symbol}
-% and the denominator.}
+% and the denominator. If specified in terms of font specific
+% dimensions such as \texttt{em} it is better to use
+% \cs{DelayEvaluation}.}
% {\texttt{0pt}}
%
-% \TemplateKey{math-mode}{choice}
+% \TemplateKey{math-mode}{s}
% {Are we in math mode or not?}
% {false}
%
-% \TemplateKey{phantom}{tokenlist}
+% \TemplateKey{phantom}{n}
% {A character that suits the common cases. As we would mostly want
% to use numbers in text mode we choose a `tall' number, while in
% math it is somewhat different.}
@@ -601,24 +605,24 @@ and the derived files
%
% \begin{TemplateDescription}{xfrac}{math}
%
-% \TemplateKey{numerator-font}{tokenlist}
+% \TemplateKey{numerator-font}{n}
% {Font family specification to use for the numerator.}
% {\cs{number}\cs{fam}}
%
-% \TemplateKey{slash-symbol}{tokenlist}
+% \TemplateKey{slash-symbol}{n}
% {The separator symbol. If not specified the default value will be
% used instead.}
% {Virgule ($/$)}
%
-% \TemplateKey{slash-symbol-font}{tokenlist}
+% \TemplateKey{slash-symbol-font}{n}
% {Font family specification to use for the separator symbol.}
% {\cs{number}\cs{fam}}
%
-% \TemplateKey{denominator-font}{tokenlist}
+% \TemplateKey{denominator-font}{n}
% {Font family specification to use for the denominator.}
% {\cs{number}\cs{fam}}
%
-% \TemplateKey{scale-factor}{tokenlist}
+% \TemplateKey{scale-factor}{n}
% {Fraction of the size of \key{slash-symbol}. In math mode we
% cannot rely on the fonts to be able to scale, but giving a default
% scale of 0.7 fits into the regular size changing scheme---the
@@ -627,47 +631,47 @@ and the derived files
% That's close enough.}
% {0.7}
%
-% \TemplateKey{scale-relative}{choice}
+% \TemplateKey{scale-relative}{s}
% {If set to `true' the font size of the numerator and denominator
% is scaled with respect to the height of the \key{slash-symbol}. If
% set to `false' the font is scaled with respect to the total height
% of the \key{slash-symbol}.}
% {false}
%
-% \TemplateKey{scaling}{choice}
+% \TemplateKey{scaling}{s}
% {If set to `true' the fonts are allowed to scale. If set to
% `false' they are not. See the `plainmath' example for an application.}
% {true}
%
-% \TemplateKey{numerator-top-sep}{length}
+% \TemplateKey{numerator-top-sep}{L}
% {Dimension specifying the space between the top of the
% \key{slash-symbol} and the top of the numerator. If not specified,
% the depth of the virgule will be used, because this value will
% make the fraction look even.}
% {\texttt{0pt}}
%
-% \TemplateKey{denominator-bot-sep}{length}
+% \TemplateKey{denominator-bot-sep}{L}
% {Dimension specifying the lift of the denominator from the
% baseline.}
% {\texttt{0pt}}
%
-% \TemplateKey{slash-right-mkern}{tokenlist}
+% \TemplateKey{slash-right-mkern}{n}
% {Same as \key{slash-right-kern} but for math mode only and should
% be specified in \texttt{mu} units. This is because \pkg{calc}
% can't use mu-expressions.}
% {\texttt{-2mu}}
%
-% \TemplateKey{slash-left-mkern}{tokenlist}
+% \TemplateKey{slash-left-mkern}{n}
% {Same as \key{slash-left-kern} but for math mode only and should
% be specified in \texttt{mu} units. This is because \pkg{calc}
% can't use mu-expressions.}
% {\texttt{-1mu}}
%
-% \TemplateKey{math-mode}{choice}
+% \TemplateKey{math-mode}{s}
% {Are we in math mode or not?}
% {true}
%
-% \TemplateKey{phantom}{tokenlist}
+% \TemplateKey{phantom}{n}
% {A character that suits the common cases. In math we have a high
% risk of using a parenthesis, so we choose that. Text mode is
% another story.}
@@ -681,588 +685,354 @@ and the derived files
% and \key{slash-right-kern} have no meaning in this template.
%
% \end{TemplateDescription}
-%
+%
+%
+%
% \StopEventually{}
%
-%\section{Implementation}
+% \section{Implementation}
%
-% \begin{macrocode}
-%<*package>
-% \end{macrocode}
-%
-% The usual lead-off: provides an experimental package!
+% \changes{v0.10b}{2004/04/07}{Now uses \cs{InternalSyntaxOn}}
+% \changes{v0.2}{2008/08/04}{Now uses \cs{ProvidesExplPackage}}
+% We set up the programming interface. We need the
+% \pkg{template} and \pkg{xparse} packages from the
+% experimental code, more precisely from the `xbase' bundle. The
+% other packages are well-known.
% \begin{macrocode}
\RequirePackage{expl3}[2009/08/05]
-\ProvidesExplPackage{xfrac}{2010/02/02}{0.3}{Text fractions}
+\ProvidesExplPackage{xfrac}{2009/08/10}{0.2a}{Text fractions}
% \end{macrocode}
%
-% Some support is needed: a bit wider than the normal \pkg{xpackage}
-% stuff, but not by much.
% \begin{macrocode}
-\RequirePackage { amstext , graphicx , l3keys2e , textcomp , xtemplate }
-% \end{macrocode}
+\RequirePackage{textcomp,graphicx,amstext}
+\RequirePackage{template}[2008/08/03]
+\RequirePackage{xparse}[2008/08/03]
+% \end{macrocode}
+% With v0.10b the new internal syntax using |_| and |:| was
+% introduced. Starting from v0.2 the expl3 code base is used and,
+% hence, also its programming setup. White space is ignored as well,
+% so any |@|-signs in the code are remnants of old \LaTeX{} coding
+% conventions.
%
-%\begin{macro}{\l_xfrac_cm_std_bool}
-% There is one option to support.
+% An option:
% \begin{macrocode}
-\keys_define:nn { xfrac } {
- cm-recommended .choice:,
- cm-recommended /
- false .code:n =
- { \bool_set_true:N \l_xfrac_cm_std_bool },
- cm-recommended /
- true .code:n =
- { \bool_set_false:N \l_xfrac_cm_std_bool },
- cm-recommended .default:n = { true },
- cm-standard .bool_set:N = \l_xfrac_cm_std_bool
-}
-\ProcessKeysOptions { xfrac }
+\bool_new:N \g_cm_recommended_bool
+\DeclareOption{cm-recommended}
+ { \bool_gset_true:N \g_cm_recommended_bool }
+\DeclareOption{cm-standard}
+ { \bool_gset_false:N \g_cm_recommended_bool }
+\ExecuteOptions{cm-recommended}
+\ProcessOptions\relax
% \end{macrocode}
-%\end{macro}
%
-%\begin{macro}{\l_xfrac_slash_box}
-%\begin{macro}{\l_xfrac_tmp_box}
-% In keeping with the \LaTeX3 philosophy, rather than use generic
-% scratch boxes and get confused, \pkg{xfrac} reserves its own named
-% working space.
+% \begin{macro}{\l_xfrac_temp_box}
+% \begin{macro}{\l_xfrac_slash_box}
+% We use two box registers. We could probably get away with using
+% scratch boxes, but this feels safer. Anyway we're all using
+% \eTeX{} now so why not?
% \begin{macrocode}
+\box_new:N \l_xfrac_temp_box
\box_new:N \l_xfrac_slash_box
-\box_new:N \l_xfrac_tmp_box
% \end{macrocode}
-%\end{macro}
-%\end{macro}
+% \end{macro}
+% \end{macro}
%
-%\begin{macro}{\xfrac_tmp:w}
-% Used for the raised boxes: weird as it does not take an argument
-% but the \cs{raisebox} does.
+% \subsection{The Templates}
+% Then we declare the template.
% \begin{macrocode}
-\cs_new:Npn \xfrac_tmp:w { }
+\DeclareTemplateType{xfrac}{3}
% \end{macrocode}
-%\end{macro}
-%
-%\subsection{Initialisation of variables}
-%
-% Variables used in templates have to be set up: there is not
-% much to say about these, other than that they must exist.
-%
-%\begin{macro}{\l_xfrac_denominator_bot_sep_dim}
-%\begin{macro}{\l_xfrac_numerator_bot_sep_dim}
-%\begin{macro}{\l_xfrac_numerator_top_sep_dim}
-%\begin{macro}{\l_xfrac_slash_left_sep_dim}
-%\begin{macro}{\l_xfrac_slash_right_sep_dim}
-% Fixed lengths.
+% The template type `text'. Make two separate templates: text and
+% math!! It is okay they share keys but it just gets too complicated
+% within the template declaration.
% \begin{macrocode}
-\dim_new:N \l_xfrac_denominator_bot_sep_dim
-\dim_new:N \l_xfrac_numerator_bot_sep_dim
-\dim_new:N \l_xfrac_numerator_top_sep_dim
-\dim_new:N \l_xfrac_slash_left_sep_dim
-\dim_new:N \l_xfrac_slash_right_sep_dim
+\DeclareTemplate{xfrac}{text}{3}{
+ numerator-font = n [\f@family] \xfrac_numeratorfont:,
+ numerator-format = f1 [#1] \xfrac_numeratorformat:n,
+ slash-symbol = n [\textfractionsolidus]
+ \xfrac_slashsymbol:,
+ slash-symbol-font = n [\f@family] \xfrac_slashsymbolfont:,
+ slash-symbol-format = f1 [#1] \xfrac_slashsymbolformat:n,
+ denominator-font = n [\f@family] \xfrac_denominatorfont:,
+ denominator-format = f1 [#1] \xfrac_denominatorformat:n,
+ h-scale = n [1] \xfrac_hscale:,
+ v-scale = n [1] \xfrac_vscale:,
+ scale-factor = n [.83333] \xfrac_scalefactor:,
+ scale-relative = s [true]
+ { \cs_set:Npn \xfrac_relscale: {\box_ht:N\l_xfrac_slash_box}}
+ { \cs_set:Npn \xfrac_relscale: {
+ \dim_eval:n { \box_ht:N\l_xfrac_temp_box + \box_dp:N\l_xfrac_temp_box }} },
+ scaling = s [true]
+ {\cs_set:Npn\xfrac_fontscale: {
+ \fontsize{\xfrac_scalefactor: \xfrac_relscale:}{\c_zero_dim}\selectfont}}
+ { \cs_set_eq:NN \xfrac_fontscale: \prg_do_nothing: },
% \end{macrocode}
-%\end{macro}
-%\end{macro}
-%\end{macro}
-%\end{macro}
-%\end{macro}
-%
-%\begin{macro}{\l_xfrac_denominator_font_tl}
-%\begin{macro}{\l_xfrac_hscale_tl}
-%\begin{macro}{\l_xfrac_numerator_font_tl}
-%\begin{macro}{\l_xfrac_phantom_tl }
-%\begin{macro}{\l_xfrac_scale_factor_tl}
-%\begin{macro}{\l_xfrac_slash_left_msep_tl}
-%\begin{macro}{\l_xfrac_slash_right_msep_tl}
-%\begin{macro}{\l_xfrac_slash_symbol_tl}
-%\begin{macro}{\l_xfrac_slash_symbol_font_tl}
-%\begin{macro}{\l_xfrac_vscale_tl}
-% Token lists, which include floating-point numbers and math(s)
-% skips.
+% Here comes some fake lengths. I've decided to call them with the
+% suffix |_fdim|, so that I will remember to use them right.
% \begin{macrocode}
-\tl_new:N \l_xfrac_denominator_font_tl
-\tl_new:N \l_xfrac_hscale_tl
-\tl_new:N \l_xfrac_numerator_font_tl
-\tl_new:N \l_xfrac_phantom_tl
-\tl_new:N \l_xfrac_scale_factor_tl
-\tl_new:N \l_xfrac_slash_left_msep_tl
-\tl_new:N \l_xfrac_slash_right_msep_tl
-\tl_new:N \l_xfrac_slash_symbol_tl
-\tl_new:N \l_xfrac_slash_symbol_font_tl
-\tl_new:N \l_xfrac_vscale_tl
+ numerator-top-sep = L [\c_max_dim] \l_xfrac_numeratortopsep_fdim,
+ numerator-bot-sep = L [\c_max_dim] \l_xfrac_numeratorbotsep_fdim,
+ denominator-bot-sep = L [\c_max_dim] \l_xfrac_denominatorbotsep_fdim,
+ slash-right-kern = L [0pt] \l_xfrac_slashrightsep_fdim,
+ slash-left-kern = L [0pt] \l_xfrac_slashleftsep_fdim,
% \end{macrocode}
-%\end{macro}
-%\end{macro}
-%\end{macro}
-%\end{macro}
-%\end{macro}
-%\end{macro}
-%\end{macro}
-%\end{macro}
-%\end{macro}
-%\end{macro}
-%
-%\begin{macro}{\xfrac_fontscale:}
-%\begin{macro}{\xfrac_math:n}
-%\begin{macro}{\xfrac_denominator_font_change:}
-%\begin{macro}{\xfrac_denominator_format:n}
-%\begin{macro}{\xfrac_numerator_font_change:}
-%\begin{macro}{\xfrac_numerator_format:n}
-%\begin{macro}{\xfrac_relscale:}
-%\begin{macro}{\xfrac_slash_symbol_font_change:}
-%\begin{macro}{\xfrac_slash_symbol_format:n}
-%\begin{macro}{\xfrac_text_or_math:n}
-% Functions, either things which are calculated `on the fly'
-% (no argument required) or are functions taking one argument in the
-% code.
+% As calc can't handle |\muskip|s, I've made them of type `n' and
+% added the suffix |_fmu| to indicate `fake mu skip'.
% \begin{macrocode}
-\cs_new_nopar:Npn \xfrac_fontscale:
-\cs_new:Npn \xfrac_math:n #1 { }
-\cs_new_nopar:Npn \xfrac_denominator_font_change: { }
-\cs_new:Npn \xfrac_denominator_format:n #1 { }
-\cs_new_nopar:Npn \xfrac_numerator_font_change: { }
-\cs_new:Npn \xfrac_numerator_format:n #1 { }
-\cs_new_nopar:Npn \xfrac_relscale: { }
-\cs_new_nopar:Npn \xfrac_slash_symbol_font_change: { }
-\cs_new:Npn \xfrac_slash_symbol_format:n #1 { }
-\cs_new:Npn \xfrac_text_or_math:n #1 { }
+ slash-right-mkern = n [-2mu] \l_xfrac_slashrightmsep_fmu,
+ slash-left-mkern = n [-1mu] \l_xfrac_slashleftmsep_fmu,
+ math-mode = s [false] { \cs_set_eq:NN \xfrac_math: \ensuremath }
+ { \cs_set_eq:NN \xfrac_math: \use:n },
+ phantom = n [8] \xfrac_phantom:,
+}{
+ \DoParameterAssignments
+ \mode_if_math:TF{
+ \cs_set_eq:NN \xfrac_textormath: \text
+ \cs_set:Npx \xfrac_slashfontchange: {\tex_fam:D \xfrac_slashsymbolfont: }
+ \cs_set:Npx \xfrac_numeratorfontchange: {\tex_fam:D \xfrac_numeratorfont: }
+ \cs_set:Npx \xfrac_denominatorfontchange: {\tex_fam:D \xfrac_denominatorfont: }
+ }{
+ \cs_set_eq:NN \xfrac_textormath: \mbox
+ \cs_set:Npn\xfrac_slashfontchange: {
+ \fontfamily{\xfrac_slashsymbolfont: }\selectfont}
+ \cs_set:Npn\xfrac_numeratorfontchange: {
+ \fontfamily{\xfrac_numeratorfont: }\selectfont}
+ \cs_set:Npn\xfrac_denominatorfontchange: {
+ \fontfamily{\xfrac_denominatorfont: }\selectfont}
+ }
+ \xfrac_textormath: {
% \end{macrocode}
-%\end{macro}
-%\end{macro}
-%\end{macro}
-%\end{macro}
-%\end{macro}
-%\end{macro}
-%\end{macro}
-%\end{macro}
-%\end{macro}
-%\end{macro}
-%
-%\subsection{The template}
-%
-% There is only one object type in \pkg{xfrac}, rather unimaginatively
-% named \texttt{xfrac}.
+% \changes{v0.11a}{2004/08/24}{Added \cs{m@th}}
% \begin{macrocode}
-\DeclareObjectType { xfrac } { 3 }
+ \m@th
+ \sbox\l_xfrac_temp_box {\xfrac_math: {\vphantom{(}}}
+ \sbox\l_xfrac_slash_box {
+ \xfrac_math: {
+ \xfrac_slashsymbolformat:n {
+ \xfrac_math: {
+ \xfrac_slashfontchange:
+ \IfValueTF{#2}{#2}{\xfrac_slashsymbol: }
+ }
+ }
+ }
+ }
+ \dim_compare:nNnTF \l_xfrac_numeratortopsep_fdim = \c_max_dim
+ {
+ \dim_compare:nNnTF \l_xfrac_numeratorbotsep_fdim = \c_max_dim
+ {
% \end{macrocode}
-%
-% A single template interface is used for both text and math(s), which
-% does make a few things a little complex later.
+% Both unspecified.
% \begin{macrocode}
-\DeclareTemplateInterface { xfrac } { text } { 3 } {
- denominator-bot-sep : length = \c_max_dim ,
- denominator-font : tokenlist = \f@family ,
- denominator-format : function 1 = #1 ,
- h-scale : tokenlist = 1 ,
- math-mode : choice { false , true }
- = false ,
- numerator-font : tokenlist = \f@family ,
- numerator-format : function 1 = #1 ,
- numerator-bot-sep : length = \c_max_dim ,
- numerator-top-sep : length = \c_max_dim ,
- phantom : tokenlist = 8 ,
- scale-factor : tokenlist = 0.83333 ,
- scale-relative : choice { false , true }
- = true ,
- scaling : choice { false , true }
- = true ,
- slash-left-kern : length = 0 pt ,
- slash-left-mkern : tokenlist = -2 mu ,
- slash-right-kern : length = 0 pt ,
- slash-right-mkern : tokenlist = -1 mu ,
- slash-symbol : tokenlist = \textfractionsolidus ,
- slash-symbol-font : tokenlist = \f@family ,
- slash-symbol-format : function 1 = #1 ,
- v-scale : tokenlist = 1 ,
-}
+ \cs_set:Npn\xfrac_next: {\raisebox{\box_ht:N\l_xfrac_slash_box
+ -\box_dp:N\l_xfrac_slash_box-\height}}
+ }{
% \end{macrocode}
-%
-% Most of the variable binding is quite simple: of course, the choices
-% are a little more complicated. That is particularly true where
-% these have to set up `on the fly' functions.
+% Use only bottom specification.
% \begin{macrocode}
-\DeclareTemplateCode { xfrac } { text } { 3 }
- {
- denominator-bot-sep = \l_xfrac_denominator_bot_sep_dim ,
- denominator-font = \l_xfrac_denominator_font_tl ,
- denominator-format = \xfrac_denominator_format:n ,
- h-scale = \l_xfrac_hscale_tl ,
- math-mode =
- {
- false = \cs_set_eq:NN \xfrac_math:n \use:n,
- true = \cs_set_eq:NN \xfrac_math:n \ensuremath
- },
- numerator-font = \l_xfrac_numerator_font_tl ,
- numerator-format = \xfrac_numerator_format:n ,
- numerator-bot-sep = \l_xfrac_numerator_bot_sep_dim ,
- numerator-top-sep = \l_xfrac_numerator_top_sep_dim ,
- phantom = \l_xfrac_phantom_tl ,
- scale-factor = \l_xfrac_scale_factor_tl ,
- scale-relative =
- {
- false =
- \cs_set_nopar:Npn \xfrac_relscale:
- {
- \dim_eval:n
- {
- \box_ht:N \l_xfrac_tmp_box
- + \box_dp:N \l_xfrac_tmp_box
- }
- },
- true =
- \cs_set_nopar:Npn \xfrac_relscale:
- { \box_ht:N \l_xfrac_slash_box }
- },
- scaling =
- {
- false = \cs_set_eq:NN \xfrac_fontscale: \prg_do_nothing:,
- true =
- \cs_set_nopar:Npn \xfrac_fontscale:
- {
- \fontsize { \l_xfrac_scale_factor_tl \xfrac_relscale: }
- { \c_zero_dim }
- \selectfont
- }
- },
- slash-left-kern = \l_xfrac_slash_left_sep_dim ,
- slash-left-mkern = \l_xfrac_slash_left_msep_tl ,
- slash-right-kern = \l_xfrac_slash_right_sep_dim ,
- slash-right-mkern = \l_xfrac_slash_right_msep_tl ,
- slash-symbol = \l_xfrac_slash_symbol_tl ,
- slash-symbol-font = \l_xfrac_slash_symbol_font_tl ,
- slash-symbol-format = \xfrac_slash_symbol_format:n ,
- v-scale = \l_xfrac_vscale_tl
- }
+ \cs_set:Npn\xfrac_next: {\raisebox{\l_xfrac_numeratorbotsep_fdim }}
+ }
+ }
+ {
% \end{macrocode}
-% The implementation part starts with applying all of the settings
-% from above. The first part of the set up is then to determine
-% whether the surroundings are text or math(s), and react accordingly.
+% Use only top specification.
% \begin{macrocode}
- {
- \AssignTemplateKeys
- \mode_if_math:TF
+ \dim_compare:nNnTF \l_xfrac_numeratorbotsep_fdim = \c_max_dim
{
- \cs_set_eq:NN \xfrac_text_or_math:n \text
- \cs_set_nopar:Npx \xfrac_denominator_font_change:
- { \tex_fam:D \l_xfrac_denominator_font_tl }
- \cs_set_nopar:Npx \xfrac_numerator_font_change:
- { \tex_fam:D \l_xfrac_numerator_font_tl }
- \cs_set_nopar:Npx \xfrac_slash_symbol_font_change:
- { \tex_fam:D \l_xfrac_slash_symbol_font_tl }
- }
- {
- \cs_set_eq:NN \xfrac_text_or_math:n \mbox
- \cs_set_nopar:Npn \xfrac_denominator_font_change:
- {
- \fontfamily { \l_xfrac_denominator_font_tl }
- \selectfont
- }
- \cs_set_nopar:Npn \xfrac_numerator_font_change:
- {
- \fontfamily { \l_xfrac_numerator_font_tl }
- \selectfont
- }
- \cs_set_nopar:Npn \xfrac_slash_symbol_font_change:
- {
- \fontfamily { \l_xfrac_slash_symbol_font_tl }
- \selectfont
+ \cs_set:Npn\xfrac_next: {
+ \raisebox{
+ \box_ht:N\l_xfrac_slash_box - \l_xfrac_numeratortopsep_fdim
+ - \height
}
+ }
}
-% \end{macrocode}
-%\changes{v0.11a}{2004/08/24}{Added \cs{m@th}}
-% Everything is now either inside \cs{text} or an \cs{mbox}, depending
-% upon the surroundings. First, there are some boxes to set up.
-% \begin{macrocode}
- \xfrac_text_or_math:n
{
- \m@th
- \hbox_set:Nn \l_xfrac_tmp_box
- { \xfrac_math:n { \vphantom { ( ) } } }
- \hbox_set:Nn \l_xfrac_slash_box
- {
- \xfrac_math:n
- {
- \xfrac_slash_symbol_format:n
- {
- \xfrac_math:n
- {
- \xfrac_slash_symbol_font_change:
- \IfNoValueTF {#2}
- { \l_xfrac_slash_symbol_tl } {#2}
- }
- }
- }
- }
% \end{macrocode}
-% Check on the numerator separator dimensions. The code starts with the
-% assumption that neither has been given, as this can then be used to
-% set up a default, which is also used when both values are set
-% erroneously.
+% Over-specification.
% \begin{macrocode}
- \cs_set_nopar:Npn \xfrac_tmp:w
- {
- \raisebox
- {
- \box_ht:N \l_xfrac_slash_box
- - \box_dp:N \l_xfrac_slash_box
- - \height
- }
- }
- \dim_compare:nNnTF
- { \l_xfrac_numerator_top_sep_dim } = { \c_max_dim }
- {
- \dim_compare:nNnF
- { \l_xfrac_numerator_bot_sep_dim } = { \c_max_dim }
- {
- \cs_set_nopar:Npn \xfrac_tmp:w
- {
- \raisebox
- { \dim_use:N \l_xfrac_numerator_bot_sep_dim }
- }
- }
- }
- {
- \dim_compare:nNnTF
- { \l_xfrac_numerator_bot_sep_dim } = { \c_max_dim }
- {
- \cs_set_nopar:Npn \xfrac_tmp:w
- {
- \raisebox
- {
- \box_ht:N \l_xfrac_slash_box
- - \dim_use:N \l_xfrac_numerator_top_sep_dim
- - \height
- }
- }
- }
- {
- \msg_error:nn { xfrac }
- { over-specified-numerator-sep }
- }
- }
+ \PackageError{xfrac}
+ {You~ have~ specified~ both~ numerator-top-sep~ and~
+ numerator-bot-sep}
+ {I~ will~ pretend~ you~ didn't~ specify~ any~ of ~them}
+ \cs_set:Npn\xfrac_next: {\raisebox{\box_ht:N\l_xfrac_slash_box
+ -\box_dp:N\l_xfrac_slash_box-\height}}
+ }
+ }
% \end{macrocode}
-% Typeset the numerator.
+% Typeset the numerator
% \begin{macrocode}
- \xfrac_tmp:w
- {
- \xfrac_fontscale:
- \xfrac_numerator_format:n
- {
- \scalebox { \l_xfrac_hscale_tl } [ \l_xfrac_vscale_tl ]
- {
- \xfrac_math:n
- {
- \xfrac_numerator_font_change:
- {
- \vphantom { \l_xfrac_phantom_tl }
- #1
- }
- }
- }
- }
- }
- \xfrac_math:n
- { % THIS IS JUST WRONG!
- \mode_if_math:TF
- { \tex_mskip:D \l_xfrac_slash_right_msep_tl }
- { \tex_hskip:D \l_xfrac_slash_right_sep_dim }
- }
+ \xfrac_next: {
+ \xfrac_fontscale:
+ \xfrac_numeratorformat:n {
+ \scalebox{\xfrac_hscale: }[\xfrac_vscale: ]
+ { \xfrac_math:{ \xfrac_numeratorfontchange:
+ {\vphantom{\xfrac_phantom: }#1} } }
+ }
+ }
+ \xfrac_math: { % THIS IS JUST WRONG!
+ \mode_if_math:TF { \mskip \l_xfrac_slashrightmsep_fmu }
+ {\hskip \l_xfrac_slashrightsep_fdim}
+ }
% \end{macrocode}
-% Typeset the separator.
+% Typeset the separator
% \begin{macrocode}
- \box_use:N \l_xfrac_slash_box
- \xfrac_math:n
- {
- \mode_if_math:TF
- { \tex_mskip:D \l_xfrac_slash_left_msep_tl }
- { \tex_hskip:D \l_xfrac_slash_left_sep_dim }
- }
+ \usebox\l_xfrac_slash_box
+ \xfrac_math: {
+ \mode_if_math:TF {
+ \mskip \l_xfrac_slashleftmsep_fmu
+ }{
+ \hskip \l_xfrac_slashleftsep_fdim
+ } }
% \end{macrocode}
-% Typeset the denominator.
+% Typeset the denominator
% \begin{macrocode}
- \dim_compare:nNnTF
- { \l_xfrac_denominator_bot_sep_dim } = { \c_max_dim }
- {
- \cs_set_nopar:Npn \xfrac_tmp:w
- { \raisebox { - \box_dp:N \l_xfrac_slash_box } }
- }
- {
- \cs_set_nopar:Npn \xfrac_tmp:w
- {
- \raisebox
- { \dim_use:N \l_xfrac_denominator_bot_sep_dim }
- }
- }
- \xfrac_tmp:w
- {
- \xfrac_fontscale:
- \xfrac_denominator_format:n
- {
- \scalebox { \l_xfrac_hscale_tl } [ \l_xfrac_vscale_tl ]
- {
- \xfrac_math:n
- {
- \xfrac_denominator_font_change:
- {
- \vphantom { \l_xfrac_phantom_tl }
- #3
- }
- }
- }
- }
- }
- }
+ \dim_compare:nNnTF \l_xfrac_denominatorbotsep_fdim=\c_max_dim
+ { \raisebox{-\box_dp:N \l_xfrac_slash_box} }
+ {
+ \raisebox{\l_xfrac_denominatorbotsep_fdim}
+ }
+ {
+ \xfrac_fontscale:
+ \xfrac_denominatorformat:n {
+ \scalebox{\xfrac_hscale:}[\xfrac_vscale:]
+ { \xfrac_math: { \xfrac_denominatorfontchange:
+ {\vphantom{\xfrac_phantom: }#3} } }
+ }
+ }
}
+}
% \end{macrocode}
-%
-% Since math(s) and text mode are wildly different entities we define a
-% separate template for each. You already saw the `text'
-% template, and here is the `math' template.
+%
+% Since math and text mode are wildly different entities we define a
+% separate template for each. You already saw the `text' template,
+% and here is the `math' template.
% \begin{macrocode}
-\DeclareRestrictedTemplate { xfrac } { text } { math } {
- numerator-font = \number \fam ,
- slash-symbol = / ,
- slash-symbol-font = \number \fam ,
- denominator-font = \number \fam ,
- scale-factor = 0.7 ,
- scale-relative = false ,
- scaling = true ,
- numerator-top-sep = 0 pt ,
- denominator-bot-sep = 0 pt ,
- math-mode = true ,
- phantom = (
+\DeclareRestrictedTemplate{xfrac}{math}{text}{
+ numerator-font = \number\fam,
+ slash-symbol = /,
+ slash-symbol-font = \number\fam,
+ denominator-font = \number\fam,
+ scale-factor = 0.7,
+ scale-relative = false,
+ scaling = true,
+ numerator-top-sep = 0pt,
+ denominator-bot-sep = 0pt,
+ math-mode = true,
+ phantom = (,
}
% \end{macrocode}
-%
-%\subsection{The standard instances}
%
-% For the default instances we just use the relevant templates with
-% the default settings.
-%
+% \subsection{The Default Instances}
+%
+% For the default instances we just use the relevant templates with
+% the default settings.
+%
% The default `text' instance.
% \begin{macrocode}
-\DeclareInstance { xfrac } { default } { text } { }
+\DeclareInstance{xfrac}{default}{text}{ }
% \end{macrocode}
-%
-% The default `math(s)' instance.
+% The default `math' instance.
% \begin{macrocode}
-\DeclareInstance { xfrac } { mathdefault } { math } { }
+\DeclareInstance{xfrac}{mathdefault}{math}{ }
% \end{macrocode}
% \begin{macrocode}
-\DeclareCollectionInstance { plainmath } { xfrac } { mathdefault }
- { math }{
- denominator-bot-sep = 0 pt ,
- numerator-bot-sep = 0 pt ,
- numerator-top-sep = \c_max_dim ,
- scale-factor = 1 ,
- scale-relative = false ,
- scaling = true ,
- slash-right-mkern = 0mu ,
- slash-left-mkern = 0mu
+\DeclareCollectionInstance{plainmath}{xfrac}{mathdefault}{math}{
+ denominator-bot-sep=0pt,
+ numerator-bot-sep=0pt,
+ numerator-top-sep=\c_max_dim,
+ scale-factor = 1,
+ scale-relative = false,
+ scaling = true,
+ slash-right-mkern=0mu,
+ slash-left-mkern=0mu,
}
% \end{macrocode}
-%
-% Default Computer Modern setup. Far from optimal, but better than
-% nothing.
+% Default Computer Modern setup. Far from optimal, but better than
+% nothing.
% \begin{macrocode}
-\DeclareInstance { xfrac } { cmr } { text } {
- denominator-bot-sep = 0 pt ,
- numerator-top-sep = 0.2 ex ,
- slash-left-kern = -0.1 em ,
- slash-right-kern = -0.1 em
+\DeclareInstance{xfrac}{cmr}{text}{
+ denominator-bot-sep=0pt,
+ numerator-top-sep=\DelayEvaluation{.2ex},
+ slash-left-kern=\DelayEvaluation{-.1em},
+ slash-right-kern=\DelayEvaluation{-.1em},
}
-\DeclareInstance { xfrac } { cmss } { text } {
- denominator-bot-sep = 0 pt ,
- numerator-top-sep = 0.2 ex ,
- slash-left-kern = -0.1 em ,
- slash-right-kern = -0.1 em
+\DeclareInstance{xfrac}{cmss}{text}{
+ denominator-bot-sep=0pt,
+ numerator-top-sep=\DelayEvaluation{.2ex},
+ slash-left-kern=\DelayEvaluation{-.1em},
+ slash-right-kern=\DelayEvaluation{-.1em},
}
-\DeclareInstance { xfrac } { cmtt } { text } {
- denominator-bot-sep = 0 pt ,
- numerator-top-sep = 0.2 ex ,
- slash-left-kern = -0.1 em ,
- slash-right-kern = -0.1 em
+\DeclareInstance{xfrac}{cmtt}{text}{
+ denominator-bot-sep=0pt,
+ numerator-top-sep=\DelayEvaluation{.2ex},
+ slash-left-kern=\DelayEvaluation{-.1em},
+ slash-right-kern=\DelayEvaluation{-.1em},
}
% \end{macrocode}
-%
-% We can do better for the Computer Modern fonts. For cmr and cmss
-% we choose Times, and for cmtt use Palatino.
+% We can do better for the Computer Modern fonts. For the roman
+% family we choose Times.
% \begin{macrocode}
-\bool_if:NF \l_xfrac_cm_std_bool
- {
- \DeclareInstance { xfrac } { cmr } { text }
- { slash-symbol-font = ptm }
- \DeclareInstance { xfrac } { cmss } { text }
- { slash-symbol-font = ptm }
- \DeclareInstance { xfrac } { cmtt } { text }
- { slash-symbol-font = ppl }
- }
+\DeclareCollectionInstance{cm-recommended}{xfrac}{cmr}{text}{
+ slash-symbol-font = ptm,
+}
% \end{macrocode}
-%
-% Things works slightly better with Latin Modern.
+% Times also blends well with `cmss'.
% \begin{macrocode}
-\DeclareInstance { xfrac } { lmr } { text } {
- denominator-bot-sep = 0 pt ,
- numerator-top-sep = 0.1 ex ,
- slash-left-kern = -0.15 em ,
- slash-right-kern = -0.15 em
+\DeclareCollectionInstance{cm-recommended}{xfrac}{cmss}{text}{
+ slash-symbol-font = ptm,
}
-\DeclareInstance { xfrac } { lmss } { text } {
- denominator-bot-sep = 0 pt ,
- numerator-top-sep = 0 pt ,
- slash-left-kern = -0.15 em ,
- slash-right-kern = -0.15 em
-}
-\DeclareInstance { xfrac } { lmtt } { text } {
- denominator-bot-sep = 0 pt ,
- numerator-top-sep = 0 pt ,
- slash-left-kern = -0.15 em ,
- slash-right-kern = -0.15 em
+% \end{macrocode}
+% For `cmtt' we choose the Palatino solidus as it is slightly
+% thicker than Times.
+% \begin{macrocode}
+\DeclareCollectionInstance{cm-recommended}{xfrac}{cmtt}{text}{
+ slash-symbol-font = ppl,
}
% \end{macrocode}
+% If we used the \texttt{cm-recommended} setup we activate it.
+% \begin{macrocode}
+\bool_if:NT \g_cm_recommended_bool
+ {\UseCollection{xfrac}{cm-recommended}}
+% \end{macrocode}
%
-%\subsection{Messages}
+% \subsection{The User Command}
%
-% Just the one.
-% \begin{macrocode}
-\msg_new:nnnn { xfrac } { over-specified-numerator-sep }
- {You have specified both numerator-top-sep and numerator-bot-sep}
- {I will pretend that you didn't specify either of them}
-% \end{macrocode}
-%
-%\subsection{The user command}
-%
-% Currently there is just a single user command. \cs{sfrac} takes
-% two mandatory arguments: numerator and denominator. It can take an
-% optional argument between the mandatory specifying the separator
-% like this:
-%\begin{verbatim}
-% \sfrac{7}[/]{12}
-%\end{verbatim}
-% It also has an optional argument that comes before the first
-% mandatory argument. If used it will use that instance instead of
-% the auto-detected one, so a user who has defined the instance
-% `cmr2' may use
-%\begin{verbatim}
-% \sfrac[cmr2]{7}{12}
-%\end{verbatim}
-% and get the settings from `cmr2' instead of the settings of
-% the current font family.
+% Currently there is just a single user command. \cs{sfrac} takes
+% two mandatory arguments: numerator and denominator. It can take an
+% optional argument between the mandatory specifying the separator
+% like this:
+% \begin{verbatim}
+% \sfrac{7}[/]{12}
+% \end{verbatim}
+% It also has an optional argument that comes before the first
+% mandatory argument. If used it will use that instance instead of
+% the auto-detected one, so a user who has defined the instance
+% `cmr2' may use
+% \begin{verbatim}
+% \sfrac[cmr2]{7}{12}
+% \end{verbatim}
+% and get the settings from `cmr2' instead of the settings of the
+% current font family.
% \begin{macrocode}
-\NewDocumentCommand \sfrac { o m o m } {
+\DeclareDocumentCommand \sfrac {o mom}{
\mode_if_math:TF
- {
- \IfInstanceExistTF { xfrac } { mathfam \number \fam }
- { \UseInstance { xfrac } { mathfam \number \fam } }
- { \UseInstance { xfrac } { mathdefault } }
- {#2} {#3} {#4}
- }
- {
- \IfInstanceExistTF { xfrac } {#1}
- { \UseInstance { xfrac } {#1} }
- {
- \IfInstanceExistTF { xfrac } { \f@family }
- { \UseInstance { xfrac } { \f@family } }
- { \UseInstance { xfrac } { default } }
- }
- {#2} {#3} {#4}
+{
+ \cs_set:Npx \xfrac_next: {mathfam\number\fam}
+ \IfExistsInstanceTF{xfrac}{\xfrac_next: }
+ {\UseInstance{xfrac}{\xfrac_next: }}
+ {\UseInstance{xfrac}{mathdefault}}
+ {#2}{#3}{#4}
+}
+{
+ \IfExistsInstanceTF{xfrac}{#1}
+ {\UseInstance{xfrac}{#1}{#2}{#3}{#4}}
+ {\IfExistsInstanceTF{xfrac}{\f@family}
+ {\UseInstance{xfrac}{\f@family}}
+ {\UseInstance{xfrac}{default}}
+ {#2}{#3}{#4}
}
+ }
}
-% \end{macrocode} \ No newline at end of file
+% \end{macrocode}
+%
+% \Finale
+\endinput