diff options
author | Karl Berry <karl@freefriends.org> | 2006-01-11 23:59:06 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2006-01-11 23:59:06 +0000 |
commit | 59aa2576ef260def2b412abb242644e53aa0d071 (patch) | |
tree | 2c87a474c32b716b0fa629ba0c2ad783161feee2 /Master/texmf-dist/source/latex | |
parent | b8abc3579bf636e5d9a30f990d9201c57f4e5019 (diff) |
trunk/Master/texmf-dist/source/latex/xfrac
git-svn-id: svn://tug.org/texlive/trunk@593 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/source/latex')
-rw-r--r-- | Master/texmf-dist/source/latex/xfrac/xfrac.dtx | 955 | ||||
-rw-r--r-- | Master/texmf-dist/source/latex/xfrac/xfrac.ins | 55 |
2 files changed, 1010 insertions, 0 deletions
diff --git a/Master/texmf-dist/source/latex/xfrac/xfrac.dtx b/Master/texmf-dist/source/latex/xfrac/xfrac.dtx new file mode 100644 index 00000000000..72c2105d2ec --- /dev/null +++ b/Master/texmf-dist/source/latex/xfrac/xfrac.dtx @@ -0,0 +1,955 @@ +%\iffalse meta-comment +% File `xfrac.dtx'. +% Copyright 2004 Morten H\o gholm. +% moho01ab@student.cbs.dk +% +% It may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either 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 2003/12/01 or later. +% +% This work has the LPPL maintenance status "maintained". +% +% The Current Maintainer of this work is Morten H\o gholm. +% +% This work consists of the files xfrac.dtx, xfrac.ins and the +% derived file xfrac.sty. +% +%<package>\NeedsTeXFormat{LaTeX2e}[2003/12/01] +%<package>\ProvidesPackage{xfrac} +%<package> [2004/10/10 v0.11b Slashed Fractions (MH)] +% +%<*driver> +\RequirePackage{fix-cm} +\documentclass{ltxdoc} +\usepackage{xfrac} +\usepackage{nicefrac} +\usepackage[latin1]{inputenc} +\usepackage[T1]{fontenc} +\makeatletter +\newenvironment{TemplateInterfaceDescription}[1] + {\subsection{The Template Type `#1'}% + \begingroup + \@beginparpenalty\@M + \description + \def\TemplateArgument##1##2{\item[Arg: ##1]##2\par}% + \def\TemplateSemantics{\enddescription\endgroup + \subsubsection*{Semantics:}}% + } + {\par\bigskip} + +\newenvironment{TemplateDescription}[2] + {\subsection{The Template `#2' (type #1)}% + \subsubsection*{Attributes:}% + \begingroup + \@beginparpenalty\@M + \description + \def\TemplateKey##1##2##3##4{\item[##1 (##2)]##3% + \ifx\TemplateKey##4\TemplateKey\else +% \hskip0ptplus3em\penalty-500\hskip 0pt plus 1filll Default:~##4% + \hfill\penalty500\relax\qquad \hbox{}\hfill Default:~##4% + \nobreak\hskip-\parfillskip\hskip0pt\relax + \fi + \par}% + \def\TemplateSemantics{\enddescription\endgroup + \subsubsection*{Semantics \& Comments:}}% + } + {\par\bigskip} + +\renewcommand*\MakePrivateLetters{\makeatletter\catcode`\_=11\relax} +\makeatother + +\providecommand*\eTeX{\ensuremath{\varepsilon}-\kern-.125em\TeX} +\providecommand*\LaTeXplus{\LaTeXe$*$} +\providecommand*\key[1]{\textbf{#1}} +\providecommand*\package[1]{\textsf{#1}} +\newcommand*\switch[2]{{\fontfamily{#1}\selectfont #2}} + + +\begin{document} + \DocInput{xfrac.dtx} +\end{document} +%</driver> +% \fi +% +% \GetFileInfo{xfrac.sty} +% \CheckSum{320} +% +% \changes{v0.11}{2004/05/08}{Consistent naming} +% +% \changes{v0.10a}{2004/04/06}{Added a dependency of the latest +% \LaTeX{} release} +% \changes{v0.10a}{2004/04/06}{First version on \textsc{ctan}} +% +% \changes{v0.10}{2004/04/05}{First publicly available prototype +% implementation} +% +% \title{The \package{xfrac} package\thanks{This file has version number +% \fileversion, last revised \filedate.}} +% +% \author{Morten H\o gholm} +% \date{\filedate} +% +% \maketitle +% +% \begin{abstract} +% This package uses a template interface to produce nicely looking +% \emph{split level} fractions like \nicefrac{7}{9}\ldots{} +% ehrm\ldots{} I mean \sfrac{7}{9}. +% \end{abstract} +% +% \tableofcontents +% +% \section{A Bit of History} +% +% \subsection{The Past} +% +% One of the first exercises in \emph{The \TeX Book} is to design a +% macro for split level fractions. The solution shows a level of +% simplicity only rivaled by its fundamental design flaws: It can +% only be used when the text font and the math font are the same and +% worse still it uses a \emph{virgule} (a slash) for separating the +% two components. The proper symbol for that is a \emph{solidus} +% which sadly is absent from Computer Modern. It is however +% available in the European Computer Modern fonts, but I'll get back +% to that. +% +% \subsection{The Present} +% +% So how does people produce split level fractions nowadays? The +% answer is that they use the \package{nicefrac} package. For text +% it gives you \nicefrac{1}{2}, while the built-in +% \package{textcomp} symbol is \textonehalf. Hmmm, bad example due +% to the strange design of the EC fonts. Lets try Palatino instead. +% Then |\nicefrac{1}{2}| produces \switch{ppl}{\nicefrac{1}{2}} +% while the built-in symbol is \switch{ppl}{\textonehalf}, and it's +% plain to see the problems; a)~it uses the virgule instead of the +% solidus and b)~the font size of the numerator and the denominator +% is bigger than in the built-in symbol. We'll have to take care of +% this somehow. +% +% Another problem arises when the font has old style figures as the +% \package{eco} package provides for Computer Modern. Here we get +% results like \switch{cmor}{\nicefrac{1}{2}} and +% \switch{cmor}{\nicefrac{8}{9}}. We'll have to do better than that. +% +% That was text mode. I wonder what happens in math mode? +% \begin{verbatim} +% \[ +% \mathbf{ 2 \times \nicefrac{1}{2} } +% \times \mathit{2\times \nicefrac{1}{2}} +% \] +% \end{verbatim} +% \[ +% \mathbf{ 2 \times \nicefrac{1}{2} } +% \times \mathit{2\times \nicefrac{1}{2}} +% \] +% Whoops! Didn't see that coming, did you? I certainly didn't. +% +% +% This section sounds very much like me tearing the +% \package{nicefrac} package apart and well, yes, that's precisely +% what I'm doing. It \emph{is} simple and it \emph{does} produce +% somewhat acceptable results for Computer Modern, but if we want a +% single package for producing such fractions we need a radical new +% approach. +% +% +% +% +% \subsection{The Future} +% +% Fonts are wildly different; one macro that works fine for Computer +% Modern obviously doesn't work well at all in Palatino. For one we +% have to make the separator symbol configurable, and we need to +% take care of several details as well: font scaling of the +% numerator/denominator pair (ND), font selection of ND etc. If we +% are to have a single package for this in the future\footnote{As +% this is intended to be about the future, the \package{xfrac} package +% requires the \eTeX{} extensions.} we have to define a totally +% generic interface for the fraction commands and then adjust +% parameters depending on the current font. What you see in this +% prototype implementation of \package{xfrac} is just that. +% +% +% \section{The User Interface} +% +% The \package{xfrac} package defines a document command \cs{sfrac} +% with the following syntax: +% \begin{quote} +% \cs{sfrac}\oarg{instance}\marg{num}\oarg{sep}\marg{denom} +% \end{quote} +% Lets show a few examples: +% \begin{verbatim} +% \sfrac{1}{2}, $\sfrac{1}{2}$, +% $\mathbf{3\times\sfrac{1}{2}}$ +% \quad \fontfamily{ppl}\selectfont Palatino: \sfrac{1}{2} +% \quad \fontfamily{ptm}\selectfont Times: \sfrac{1}{2} +% \end{verbatim} +% \begin{quote} +% \sfrac{1}{2}, $\sfrac{1}{2}$, $\mathbf{3\times\sfrac{1}{2}}$ +% \quad \fontfamily{ppl}\selectfont Palatino: \sfrac{1}{2} +% \quad \fontfamily{ptm}\selectfont Times: \sfrac{1}{2} +% \end{quote} +% You'll notice something interesting: Not only does the \cs{sfrac} +% command work as it should in math mode, it also gets the job done +% for other fonts as well. +% +% \subsection{Text mode} +% +% The usual problem in text mode has a name: Computer Modern. The +% solidi of all the Computer Modern fonts leave a lot to be desired, +% although things are potentially looking better as the Latin Modern +% fonts are becoming more stable and widespread. As long as the +% default fonts are Computer Modern variants we must however work +% around this. One idea that comes to mind is to see what happens +% when you use a solidus from another font instead. Lets try with +% Times: +% \begin{quote} +% \DeclareInstance{xfrac}{cmr2}{text}{ +% slash-symbol-font = ptm, +% } +% ``You take \sfrac[cmr2]{1}{2} cup of sugar, \ldots'' +% \end{quote} +% That looks quite good actually, so it was probably very difficult +% to obtain that result. Nope, it was extremely easy---if you happen +% to know about \emph{instances}: +% \begin{verbatim} +% \DeclareInstance{xfrac}{cmr}{text}{ +% slash-symbol-font = ptm, +% } +% \end{verbatim} +% So we define an instance with the name `cmr' from the template +% `text' which in turn is of template type `xfrac'. You'll notice +% the `cmr' is also the name of the font family for Computer Modern +% Roman and the reasoning behind is that every font family should +% have it's own settings, and if a document command is to work well +% in that scheme, letting it use the name of the current font family +% seems like a good idea. Thus the \cs{sfrac} command checks to see +% whether an instance with same name as the current font family +% exists and uses it if the test is true; otherwise the default +% setting is used. Here we defined the instance to be used for the +% font family `cmr' and just told it to use the Times font for +% typesetting the slash symbol which turns out to be a solidus by +% default. +% +% The option \texttt{cm-recommended} which is loaded by default uses +% the Times solidus for Computer Modern Roman and Computer Modern +% Sans Serif and the Palatino solidus for Computer Modern Typewriter +% Type. This looks quite good. Should you however not want this you +% can use the option \texttt{cm-standard} which produces somewhat +% acceptable results using Computer Modern exclusively. +% +% So what about old style figures? If you use the \package{eco} +% package you might define an instance similar to this (`cmor' is +% the name of the roman font activated by \package{eco}): +% \DeclareInstance{xfrac}{cmor}{text}{ +% slash-symbol-font = ptm, +% numerator-font = cmr, +% denominator-font = cmr, +% } +% \begin{verbatim} +% \DeclareInstance{xfrac}{cmor}{text}{ +% slash-symbol-font = ptm, +% numerator-font = cmr, +% denominator-font = cmr, +% } +% \end{verbatim} +% We also use regular Computer Modern Roman for typesetting ND, so +% we end up with \switch{cmor}{\sfrac{1}{2}} and +% \switch{cmor}{\sfrac{8}{9}} instead of +% \switch{cmor}{\nicefrac{1}{2}} and \switch{cmor}{\nicefrac{8}{9}}. +% Much better. +% +% There are also situations where other tricks are useful. If you +% don't have the inferior and superior figures available in a font, +% or the font doesn't have a wider design for small font sizes, you +% can cheat by manually scaling the ND-pair. I got nice results for +% Adobe's Stempel Garamond (with small caps and old style figures) +% with the following setup: +% \begin{verbatim} +% \DeclareInstance{xfrac}{pegj}{text}{ +% numerator-font = pegx, +% denominator-font = pegx, +% scale-factor = .9, +% h-scale = 1.1, +% } +% \end{verbatim} +% We use the font family `pegx' (Stempel Garamond with real small +% caps) for typesetting the ND-pair. Additionally the key +% \key{scale-factor} specifies that the font size used for the +% ND-pair should be $0.9$ of the height of the solidus, and the key +% \key{h-scale} specifies that the ND-pair should be scaled an extra +% 10\% horizontally. +% +% Should you be so fortunate the have a font with inferior and +% superior figures like in the Monotype Janson example from Philipp +% Lehman's excellent \emph{The Font Installation Guide}. In that +% example Philipp defines the font families `mjn0' for the inferior +% figures and `mjn1' for the superior. Thus to get the \cs{sfrac} +% command to use them on the fly for the font family `mjnj' (Janson, +% old style figures) we would say +% \begin{verbatim} +% \DeclareInstance{xfrac}{mjnj}{text}{ +% numerator-font = mjn1, +% denominator-font = mjn0, +% scaling = false, +% numerator-bot-sep = 0pt, +% denominator-bot-sep = 0pt, +% } +% \end{verbatim} +% I think this example is a very clean way to do it. An alternative +% approach could be to use the keys \key{numerator-format} and +% \key{denominator-format} to process the arguments and let them +% determine what to do. +% +% As a side note Harald Harders was so kind to test it, and it +% \emph{does} actually work---I hadn't tested it myself. +% +% \subsection{Math Mode} +% +% In math mode the choices are a lot fewer because first of all +% \TeX{} comes with a built-in limitation of 16 math families. +% Additionally we will not need a solidus for typesetting split +% fractions in math, as tradition is to use a virgule instead. We +% define the basic `mathdefault' instance to simply use the math +% family in use when the instance is run. So if we're in normal math +% like |$\sfrac{7}{9}$| we simply get family~$-1$. If we're inside a +% \cs{mathbf} we're in family~$4$ (in the standard setup at least), +% and so the fraction is typeset with the same math family. Simple, +% isn't? +% +% You can also declare instances for the math families, but I really +% don't see why you would. If you do then name them according to the +% scheme `mathfam\meta{N}', where \meta{N} is the family number, and +% only do it if you \emph{really} know how to set up math fonts. +% That is, if \cs{DeclareMathAlphabet} is unbeknownst to you, then +% just don't go there. +% +% +% Another example: If we want \cs{sfrac} to produce split fractions +% without doing anything at all, we can choose the collection +% `plainmath', which is defined as +% \begin{verbatim} +% \DeclareCollectionInstance{plainmath}{xfrac}{mathdefault}{math}{ +% denominator-bot-sep = 0pt, +% numerator-bot-sep = 0pt, +% numerator-top-sep = \maxdimen, +% scaling = false, +% slash-right-mkern = 0mu, +% slash-left-mkern = 0mu, +% } +% \end{verbatim} +% This creates an alternative version of the instance `mathdefault' +% with settings as specified by the keys. In the default math setup +% \key{numerator-top-sep} is set to 0~pt, and here we set +% \key{numerator-bot-sep} to 0~pt as well, so in order to avoid +% over-specification (and an error message) we must set +% \key{numerator-top-sep} to \cs{maxdimen}. We activate (obeying +% normal scoping rules) it with: +% \begin{verbatim} +% \UseCollection{xfrac}{plainmath} +% \end{verbatim} +% Then |$\sfrac{8}{13}$| produces\begingroup +% \UseCollection{xfrac}{plainmath} +% $\sfrac{8}{13}$ and just typing |$8/13$| gives the same result: +% $8/13$. +% \endgroup +% +% +% \section{The Template Interface} +% +% \begin{TemplateInterfaceDescription}{xfrac} +% +% \TemplateArgument{1} +% {The numerator} +% +% \TemplateArgument{2} +% {The separator} +% +% \TemplateArgument{3} +% {The denominator} +% +% \TemplateSemantics +% +% Typesets arguments 1 and 3 separated by argument 2, which in text +% mode by default is a \emph{solidus}. This is taken from +% \package{textcomp} where it is denoted \cs{textfractionsolidus}. +% This is the character used for the ready made split level +% fractions such as \textonehalf---except in the (European) Computer +% Modern fonts. In math mode a \emph{virgule} is used instead as +% this is more appropriate and it is always available in the math +% fonts. The solidus is a text symbol only. +% +% \end{TemplateInterfaceDescription} +% +% \begin{TemplateDescription}{xfrac}{text} +% +% \TemplateKey{numerator-font}{n} +% {Font family specification to use for the numerator.} +% {\cs{f@family}} +% +% \TemplateKey{numerator-format}{f1} +% {Action to be taken on the numerator.} +% {Process argument unchanged} +% +% \TemplateKey{slash-symbol}{n} +% {The separator symbol. If not specified the default value will be +% used instead.} +% {Solidus (\cs{textfractionsolidus})} +% +% \TemplateKey{slash-symbol-font}{n} +% {Font family specification to use for the separator symbol.} +% {\cs{f@family}} +% +% \TemplateKey{slash-symbol-format}{f1} +% {Action to be taken on the separator symbol.} +% {Process argument unchanged} +% +% \TemplateKey{denominator-font}{n} +% {Font family specification to use for the denominator.} +% {\cs{f@family}} +% +% \TemplateKey{denominator-format}{f1} +% {Action to be taken on the denominator.} +% {Process argument unchanged} +% +% \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 +% Garamond looks excellent if scaled 10\% extra horizontally, i.e., +% by a factor of 1.1.} +% {1} +% +% \TemplateKey{v-scale}{n} +% {Same as \key{h-scale} only vertically. Probably not of much use +% but added for completetion.} +% {1} +% +% \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 +% real superior and inferior fonts are not available. As an example +% Stempel Garamond looks better if the factor is 0.9.} +% {0.83333} +% +% \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}{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}{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}{L} +% {Dimension specifying the lift of the numerator from the +% baseline.} +% {Unspecified} +% +% \TemplateKey{denominator-bot-sep}{L} +% {Dimension specifying the lift of the denominator from the +% baseline.} +% {Unspecified} +% +% \TemplateKey{slash-right-kern}{L} +% {Dimension specifying the kerning between the \key{slash-symbol} +% 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}{L} +% {Dimension specifying the kerning between the \key{slash-symbol} +% 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}{s} +% {Are we in math mode or not?} +% {false} +% +% \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.} +% {8} +% +% \TemplateSemantics +% +% This template is also the foundation for the `math' template. The +% keys \key{slash-right-mkern} and \key{slash-left-mkern} can only +% be used in math mode and are not shown here. +% +% \end{TemplateDescription} +% +% +% \begin{TemplateDescription}{xfrac}{math} +% +% \TemplateKey{numerator-font}{n} +% {Font family specification to use for the numerator.} +% {\cs{number}\cs{fam}} +% +% \TemplateKey{slash-symbol}{n} +% {The separator symbol. If not specified the default value will be +% used instead.} +% {Virgule ($/$)} +% +% \TemplateKey{slash-symbol-font}{n} +% {Font family specification to use for the separator symbol.} +% {\cs{number}\cs{fam}} +% +% \TemplateKey{denominator-font}{n} +% {Font family specification to use for the denominator.} +% {\cs{number}\cs{fam}} +% +% \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 +% default scheme has values $(D,T,S,SS)=(1,1,0.7,0.5)$ whereas we +% with a default \key{scale-factor} of 0.7 get $(1,1,0.7,0.49)$. +% That's close enough.} +% {0.7} +% +% \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}{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}{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}{L} +% {Dimension specifying the lift of the denominator from the +% baseline.} +% {\texttt{0pt}} +% +% \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 \package{calc} +% can't use mu-expressions.} +% {\texttt{-2mu}} +% +% \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 \package{calc} +% can't use mu-expressions.} +% {\texttt{-1mu}} +% +% \TemplateKey{math-mode}{s} +% {Are we in math mode or not?} +% {true} +% +% \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.} +% {(} +% +% \TemplateSemantics +% +% This template is a restricted version of the `text' template. Only +% the keys that are different from the `text' template are shown +% here. Also bear in mind that the attributes \key{slash-left-kern} +% and \key{slash-right-kern} have no meaning in this template. +% +% \end{TemplateDescription} +% +% +% +% \StopEventually{} +% +% \section{Implementation} +% +% We set up the programming interface. We need the +% \package{template} and \package{xparse} packages from the +% experimental code, more precisely from the `xbase' bundle. The +% other packages are well-known. +% \begin{macrocode} +\RequirePackage{textcomp,graphicx,amstext} +\RequirePackage{template}[2001/07/25] +\RequirePackage{xparse}[2000/01/29] +% \end{macrocode} +% \changes{v0.10b}{2004/04/07}{Now uses \cs{InternalSyntaxOn}} With +% v0.10b I introduced the new internal syntax using |_| and |:|. +% White space is ignored as well, so any |@|-signs in the code are +% remnants of old \LaTeX{} coding conventions. +% \begin{macrocode} +\InternalSyntaxOn +% \end{macrocode} +% Some programming tools which will probably be included in the +% \LaTeX3 API. +% \begin{macrocode} +\@ifundefined{else:}{\let\else:=\else}{} +\@ifundefined{fi:}{\let\fi:=\fi}{} +\@ifundefined{if_dim:w}{\let\if_dim:w =\ifdim}{} +\@ifundefined{if_mathmode:}{\let\if_mathmode: =\ifmmode}{} +\def\xfrac_namelet:cN #1#2{% + \expandafter\let\csname#1\endcsname#2} +% \end{macrocode} +% Boolean data type. No error checking! +% \begin{macrocode} +\def\xfrac_new_boolean:c #1{ + \expandafter\@ifdefinable\csname if_boolean_#1:\endcsname{ + \@namedef{boolean_#1_true:} + {\xfrac_namelet:cN{if_boolean_#1:}\iftrue}% + \@namedef{boolean_#1_false:} + {\xfrac_namelet:cN{if_boolean_#1:}\iffalse}% + \@nameuse{boolean_#1_false:}% + } +} +\def\xfrac_set_boolean:cc #1#2{ \@nameuse{boolean_#1_#2:}} +\def\if_boolean:cTF #1{ + \@nameuse{if_boolean_#1:} + \expandafter\@firstoftwo + \else: + \expandafter\@secondoftwo + \fi: +} +\def\if_boolean:cT #1#2{ \if_boolean:cTF {#1}{#2}{} } +\def\if_boolean:cF #1#2{ \if_boolean:cTF {#1}{}{#2} } +% \end{macrocode} +% +% An option: +% \begin{macrocode} +\xfrac_new_boolean:c {cm_recommended} +\DeclareOption{cm-recommended} + { \xfrac_set_boolean:cc {cm_recommended}{true} } +\DeclareOption{cm-standard} + { \xfrac_set_boolean:cc {cm_recommended}{false} } +\ExecuteOptions{cm-recommended} +\ProcessOptions\relax +% \end{macrocode} +% +% \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} +\newsavebox\l_xfrac_temp_box +\newsavebox\l_xfrac_slash_box +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \subsection{The Templates} +% Then we declare the template. +% \begin{macrocode} +\DeclareTemplateType{xfrac}{3} +% \end{macrocode} +% The template type `text'. +% \begin{macrocode} +\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] + { \def \xfrac_relscale: {\ht\l_xfrac_slash_box}} + { \def \xfrac_relscale: { + \dimexpr \ht\l_xfrac_temp_box + \dp\l_xfrac_temp_box\relax} }, + scaling = s [true] + {\def\xfrac_fontscale: { + \fontsize{\xfrac_scalefactor: \xfrac_relscale:}{\z@}\selectfont}} + { \let\xfrac_fontscale: \relax }, +% \end{macrocode} +% 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} + numerator-top-sep = L [\maxdimen] \l_xfrac_numeratortopsep_fdim, + numerator-bot-sep = L [\maxdimen] \l_xfrac_numeratorbotsep_fdim, + denominator-bot-sep = L [\maxdimen] \l_xfrac_denominatorbotsep_fdim, + slash-right-kern = L [0pt] \l_xfrac_slashrightsep_fdim, + slash-left-kern = L [0pt] \l_xfrac_slashleftsep_fdim, +% \end{macrocode} +% 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} + slash-right-mkern = n [-2mu] \l_xfrac_slashrightmsep_fmu, + slash-left-mkern = n [-1mu] \l_xfrac_slashleftmsep_fmu, + math-mode = s [false] { \let\xfrac_math: \ensuremath } + { \let\xfrac_math: \@firstofone }, + phantom = n [8] \xfrac_phantom:, +}{ + \DoParameterAssignments + \if_mathmode: + \let\xfrac_textormath: \text + \edef\xfrac_slashfontchange: {\fam\xfrac_slashsymbolfont: } + \edef\xfrac_numeratorfontchange: {\fam\xfrac_numeratorfont: } + \edef\xfrac_denominatorfontchange: {\fam\xfrac_denominatorfont: } + \else: + \let\xfrac_textormath: \mbox + \def\xfrac_slashfontchange: { + \fontfamily{\xfrac_slashsymbolfont: }\selectfont} + \def\xfrac_numeratorfontchange: { + \fontfamily{\xfrac_numeratorfont: }\selectfont} + \def\xfrac_denominatorfontchange: { + \fontfamily{\xfrac_denominatorfont: }\selectfont} + \fi: + \xfrac_textormath: { +% \end{macrocode} +% \changes{v0.11a}{2004/08/24}{Added \cs{m@th}} +% \begin{macrocode} + \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: } + } + } + } + } + \if_dim:w \l_xfrac_numeratortopsep_fdim = \maxdimen + \if_dim:w \l_xfrac_numeratorbotsep_fdim = \maxdimen +% \end{macrocode} +% Both unspecified. +% \begin{macrocode} + \def\xfrac_next: {\raisebox{\ht\l_xfrac_slash_box + -\dp\l_xfrac_slash_box-\height}} + \else: +% \end{macrocode} +% Use only bottom specification. +% \begin{macrocode} + \def\xfrac_next: {\raisebox{\l_xfrac_numeratorbotsep_fdim }} + \fi: + \else: +% \end{macrocode} +% Use only top specification. +% \begin{macrocode} + \if_dim:w \l_xfrac_numeratorbotsep_fdim = \maxdimen + \def\xfrac_next: { + \raisebox{ + \ht\l_xfrac_slash_box - \l_xfrac_numeratortopsep_fdim + - \height + } + } + \else: +% \end{macrocode} +% Over-specification. +% \begin{macrocode} + \PackageError{xfrac} + {You~ have~ specified~ both~ numerator-top-sep~ and~ + numerator-bot-sep} + {I~ will~ pretend~ you~ didn't~ specify~ any~ of ~them} + \def\xfrac_next: {\raisebox{\ht\l_xfrac_slash_box + -\dp\l_xfrac_slash_box-\height}} + \fi: + \fi: +% \end{macrocode} +% Typeset the numerator +% \begin{macrocode} + \xfrac_next: { + \xfrac_fontscale: + \xfrac_numeratorformat:n { + \scalebox{\xfrac_hscale: }[\xfrac_vscale: ] + { \xfrac_math:{ \xfrac_numeratorfontchange: + {\vphantom{\xfrac_phantom: }#1} } } + } + } + \xfrac_math: { + \if_mathmode: + \mskip \l_xfrac_slashrightmsep_fmu + \else: + \hskip \l_xfrac_slashrightsep_fdim + \fi: } +% \end{macrocode} +% Typeset the separator +% \begin{macrocode} + \usebox\l_xfrac_slash_box + \xfrac_math: { + \if_mathmode: + \mskip \l_xfrac_slashleftmsep_fmu + \else: + \hskip \l_xfrac_slashleftsep_fdim + \fi: } +% \end{macrocode} +% Typeset the denominator +% \begin{macrocode} + \if_dim:w \l_xfrac_denominatorbotsep_fdim=\maxdimen\relax + \def\xfrac_next: {\raisebox{-\dp\l_xfrac_slash_box}} + \else: + \def\xfrac_next: {\raisebox{\l_xfrac_denominatorbotsep_fdim}} + \fi: + \xfrac_next: { + \xfrac_fontscale: + \xfrac_denominatorformat:n { + \scalebox{\xfrac_hscale:}[\xfrac_vscale:] + { \xfrac_math: { \xfrac_denominatorfontchange: + {\vphantom{\xfrac_phantom: }#3} } } + } + } + } +} +% \end{macrocode} +% +% 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}{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 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}{ } +% \end{macrocode} +% The default `math' instance. +% \begin{macrocode} +\DeclareInstance{xfrac}{mathdefault}{math}{ } +% \end{macrocode} +% \begin{macrocode} +\DeclareCollectionInstance{plainmath}{xfrac}{mathdefault}{math}{ + denominator-bot-sep=0pt, + numerator-bot-sep=0pt, + numerator-top-sep=\maxdimen, + 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. +% \begin{macrocode} +\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=0pt, + numerator-top-sep=\DelayEvaluation{.2ex}, + slash-left-kern=\DelayEvaluation{-.1em}, + slash-right-kern=\DelayEvaluation{-.1em}, +} +\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 the roman +% family we choose Times. +% \begin{macrocode} +\DeclareCollectionInstance{cm-recommended}{xfrac}{cmr}{text}{ + slash-symbol-font = ptm, +} +% \end{macrocode} +% Times also blends well with `cmss'. +% \begin{macrocode} +\DeclareCollectionInstance{cm-recommended}{xfrac}{cmss}{text}{ + slash-symbol-font = ptm, +} +% \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} +\if_boolean:cT {cm_recommended} + {\UseCollection{xfrac}{cm-recommended}} +% \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. +% \begin{macrocode} +\DeclareDocumentCommand \sfrac {o mom}{ + \if_mathmode: + \edef\xfrac_next: {mathfam\number\fam} + \IfExistsInstanceTF{xfrac}{\xfrac_next: } + {\UseInstance{xfrac}{\xfrac_next: }} + {\UseInstance{xfrac}{mathdefault}} + {#2}{#3}{#4} + \else: + \IfExistsInstanceTF{xfrac}{#1} + {\UseInstance{xfrac}{#1}{#2}{#3}{#4}} + {\IfExistsInstanceTF{xfrac}{\f@family} + {\UseInstance{xfrac}{\f@family}} + {\UseInstance{xfrac}{default}} + {#2}{#3}{#4} + } + \fi: +} +% \end{macrocode} +% +% \Finale +\endinput diff --git a/Master/texmf-dist/source/latex/xfrac/xfrac.ins b/Master/texmf-dist/source/latex/xfrac/xfrac.ins new file mode 100644 index 00000000000..6743f5afe37 --- /dev/null +++ b/Master/texmf-dist/source/latex/xfrac/xfrac.ins @@ -0,0 +1,55 @@ +%%
+%% This file will generate fast loadable files and documentation
+%% driver files from the doc files in this package when run through
+%% LaTeX or TeX.
+%%
+%% File `xfrac.ins'.
+%% Copyright 2004 Morten H\o gholm.
+%% moho01ab@student.cbs.dk
+%%
+%% It may be distributed and/or modified under the
+%% conditions of the LaTeX Project Public License, either 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 2003/12/01 or later.
+%%
+%% This work has the LPPL maintenance status "maintained".
+%%
+%% The Current Maintainer of this work is Morten H\o gholm.
+%%
+%% This work consists of the files xfrac.dtx, xfrac.ins and the
+%% derived file xfrac.sty.
+%%
+%% --------------- start of docstrip commands ------------------
+%%
+\input docstrip
+
+\keepsilent
+
+\preamble
+
+It may be distributed and/or modified under the
+conditions of the LaTeX Project Public License, either 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 2003/12/01 or later.
+
+This work has the LPPL maintenance status "maintained".
+
+The Current Maintainer of this work is Morten H\string\o gholm.
+
+This work consists of the files xfrac.dtx, xfrac.ins and the
+derived file xfrac.sty.
+
+\endpreamble
+
+%%%%%%%%%%%%%%%
+\generate{%
+ \file{xfrac.sty}{\from{xfrac.dtx}{package}}%
+}
+
+\endbatchfile
|