diff options
author | Karl Berry <karl@freefriends.org> | 2024-02-14 21:28:58 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2024-02-14 21:28:58 +0000 |
commit | 45167e7e3302f278649e669816603c8fe3b097bc (patch) | |
tree | 4ff44ef99e5ec2cd576e1d48dcdf1b8271734713 /Master/texmf-dist/source/latex/l3packages/xfrac/xfrac.dtx | |
parent | 91494cd6db11b2eab523a4d7115b704a96f1a1df (diff) |
l3 (14feb24)
git-svn-id: svn://tug.org/texlive/trunk@69859 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/source/latex/l3packages/xfrac/xfrac.dtx')
-rw-r--r-- | Master/texmf-dist/source/latex/l3packages/xfrac/xfrac.dtx | 1141 |
1 files changed, 0 insertions, 1141 deletions
diff --git a/Master/texmf-dist/source/latex/l3packages/xfrac/xfrac.dtx b/Master/texmf-dist/source/latex/l3packages/xfrac/xfrac.dtx deleted file mode 100644 index 6bce5f93ee9..00000000000 --- a/Master/texmf-dist/source/latex/l3packages/xfrac/xfrac.dtx +++ /dev/null @@ -1,1141 +0,0 @@ -% \iffalse meta-comment -% -%% File: xfrac.dtx -% -% Copyright (C) 2004,2008-2010 Morten Hoegholm -% (C) 2011,2012,2014-2023 The LaTeX Project -% -% It may be distributed and/or modified under the conditions of the -% LaTeX Project Public License (LPPL), either version 1.3c of this -% license or (at your option) any later version. The latest version -% of this license is in the file -% -% https://www.latex-project.org/lppl.txt -% -% This file is part of the "l3packages bundle" (The Work in LPPL) -% and all files in that bundle must be distributed together. -% -% ----------------------------------------------------------------------- -% -% The development version of the bundle can be found at -% -% https://github.com/latex3/latex3 -% -% for those people who are interested. -% -%<*driver|package> -% The version of expl3 required is tested as early as possible, as -% some really old versions do not define \ProvidesExplPackage. -\RequirePackage{expl3}[2018/02/21] -%<package>\@ifpackagelater{expl3}{2018/02/21} -%<package> {} -%<package> {% -%<package> \PackageError{xfrac}{Support package l3kernel too old} -%<package> {% -%<package> Please install an up to date version of l3kernel\MessageBreak -%<package> using your TeX package manager or from CTAN.\MessageBreak -%<package> \MessageBreak -%<package> Loading xfrac will abort!% -%<package> }% -%<package> \endinput -%<package> } -\RequirePackage{amstext,graphicx,l3keys2e,textcomp,xparse,xtemplate} -%</driver|package> -%<*driver> -\documentclass[full]{l3doc} -\usepackage{nicefrac,xfrac} ^^A Need nicefrac for demo purposes -\providecommand*\key[1]{\textbf{#1}} -\newcommand*\switch[2]{{\fontfamily{#1}\selectfont #2}} -\begin{document} - \DocInput{\jobname.dtx} -\end{document} -%</driver> -% \fi -% -% \title{^^A -% The \textsf{xfrac} package\\ Split-level fractions^^A -% } -% -% \author{^^A -% The \LaTeX{} Project\thanks -% {^^A -% E-mail: -% \href{mailto:latex-team@latex-project.org} -% {latex-team@latex-project.org}^^A -% }^^A -% } -% -% \date{Released 2023-10-10} -% -% \maketitle -% -% \begin{documentation} -% -% The \pkg{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} -% Let's 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. -% -% \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 presented is fairly -% simple, using a \emph{virgule} (a slash) for separating the two -% components. It looks okay because the text font and math font of -% Computer Modern look almost identical. -% -% The proper symbol to use instead of the virgule is a \emph{solidus} -% which does not exist in Computer Modern. It is however available in -% the European Computer Modern fonts, but I'll get back to that. -% -% \subsection{The Present} -% -% The most common way to produce split level fractions within \LaTeXe{} -% is by means of the \pkg{nicefrac} package. Part of the reason it -% has found widespread use is due to the strange design of the -% built-in text fractions of the EC fonts, which look like this: -% \textonehalf{}. The package is very simple to use but there are a few -% issues: -% \begin{itemize} -% \item It uses the virgule instead of the solidus. -% \item Font size of numerator and denominator is bigger than in the -% built-in symbol. Compare Palatino: \switch{ppl}{\nicefrac{1}{2}} -% \emph{vs.}~\switch{ppl}{\textonehalf}. -% \item It doesn't correct for fonts using text figures such as in the -% \pkg{eco} package. Compare \switch{cmor}{\nicefrac{1}{2}} and -% \switch{cmor}{\nicefrac{8}{9}}. -% \item In math mode, it doesn't always pick up the correct math -% alphabet. -% \end{itemize} -% In short: \pkg{nicefrac} doesn't attempt to be the answer to -% everything and so this is not a criticism of the package. It works -% quite well for Computer Modern which was pretty much what was widely -% available at the time it was developed. Users these days, however, -% have a choice of many fonts when they write their documents. -% -% \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, \emph{etc.} If we -% are to have a single package for this in the future 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 \pkg{xfrac} is just that. -% -% \section{Advanced User Interface} -% -% \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. Let's try with -% Times: -% \begin{quote} -% \DeclareInstance{xfrac}{cmr2}{text} -% {slash-symbol-font = ptm} -% \enquote{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 object 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 \pkg{eco} -% package you might define an instance similar to this (`cmor' is -% the name of the roman font activated by \pkg{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 = 0.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 = 0 pt, -% denominator-bot-sep = 0 pt -% } -% \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. -% -% \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 \texttt{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 = 0 pt, -% numerator-bot-sep = 0 pt, -% numerator-top-sep = \c_max_dim, -% scaling = false, -% slash-right-mkern = 0 mu, -% slash-left-mkern = 0 mu -% } -% \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{c_max_dim}. We activate (obeying -% normal scoping rules) it with: -% \begin{verbatim} -% \UseCollection{xfrac}{plainmath} -% \end{verbatim} -% Then |$\sfrac{8}{13}$| produces^^A -% \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 -% \pkg{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}{tokenlist} -% {Font family specification to use for the numerator.} -% {\cs{f@family}} -% -% \TemplateKey{numerator-format}{function 1 arg} -% {Action to be taken on the numerator.} -% {Process argument unchanged} -% -% \TemplateKey{slash-symbol}{tokenlist} -% {The separator symbol. If not specified the default value will be -% used instead.} -% {Solidus (\cs{textfractionsolidus})} -% -% \TemplateKey{slash-symbol-font}{tokenlist} -% {Font family specification to use for the separator symbol.} -% {\cs{f@family}} -% -% \TemplateKey{slash-symbol-format}{function 1 arg} -% {Action to be taken on the separator symbol.} -% {Process argument unchanged} -% -% \TemplateKey{denominator-font}{tokenlist} -% {Font family specification to use for the denominator.} -% {\cs{f@family}} -% -% \TemplateKey{denominator-format}{function 1 arg} -% {Action to be taken on the denominator.} -% {Process argument unchanged} -% -% \TemplateKey{h-scale}{real} -% {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, \emph{i.e.}, -% by a factor of 1.1.} -% {1} -% -% \TemplateKey{v-scale}{real} -% {Same as \key{h-scale} only vertically. Probably not of much use -% but added for completeness.} -% {1} -% -% \TemplateKey{scale-factor}{real} -% {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}{choice} -% {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} -% {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} -% {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} -% {Dimension specifying the lift of the numerator from the -% baseline.} -% {Unspecified} -% -% \TemplateKey{denominator-bot-sep}{length} -% {Dimension specifying the lift of the denominator from the -% baseline.} -% {Unspecified} -% -% \TemplateKey{slash-right-kern}{length} -% {Dimension specifying the kerning between the \key{slash-symbol} -% and the numerator.} -% {\texttt{0pt}} -% -% \TemplateKey{slash-left-kern}{length} -% {Dimension specifying the kerning between the \key{slash-symbol} -% and the denominator.} -% {\texttt{0pt}} -% -% \TemplateKey{math-mode}{choice} -% {Are we in math mode or not?} -% {false} -% -% \TemplateKey{phantom}{tokenlist} -% {A character that suits the common cases. As we would mostly want -% to use numbers in text mode we choose a \enquote{tall} number, while in -% math it is somewhat different.} -% {8} -% -% \TemplateSemantics -% -% This template is also the foundation for the \enquote{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}{tokenlist} -% {Font family specification to use for the numerator.} -% {\cs{number}\cs{fam}} -% -% \TemplateKey{slash-symbol}{tokenlist} -% {The separator symbol. If not specified the default value will be -% used instead.} -% {Virgule ($/$)} -% -% \TemplateKey{slash-symbol-font}{tokenlist} -% {Font family specification to use for the separator symbol.} -% {\cs{number}\cs{fam}} -% -% \TemplateKey{denominator-font}{tokenlist} -% {Font family specification to use for the denominator.} -% {\cs{number}\cs{fam}} -% -% \TemplateKey{scale-factor}{real} -% {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}{choice} -% {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} -% {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} -% {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} -% {Dimension specifying the lift of the denominator from the -% baseline.} -% {\texttt{0pt}} -% -% \TemplateKey{slash-right-mkern}{muskip} -% {Same as \key{slash-right-kern} but for math mode only and should -% be specified in \texttt{mu} units.} -% {\texttt{-2mu}} -% -% \TemplateKey{slash-left-mkern}{muskip} -% {Same as \key{slash-left-kern} but for math mode only and should -% be specified in \texttt{mu} units.} -% {\texttt{-1mu}} -% -% \TemplateKey{math-mode}{choice} -% {Are we in math mode or not?} -% {true} -% -% \TemplateKey{phantom}{tokenlist} -% {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.} -% {(^^A) -% } -% -% \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} -% -% \end{documentation} -% -% \begin{implementation} -% -% \section{\pkg{xfrac} implementation} -% -% \begin{macrocode} -%<*package> -% \end{macrocode} -% -% \begin{macrocode} -%<@@=xfrac> -% \end{macrocode} -% -% \begin{macrocode} -\ProvidesExplPackage{xfrac}{2023-10-10}{} - {L3 Experimental split-level fractions} -% \end{macrocode} -% -% \begin{variable}{\l_@@_cm_std_bool} -% There is one option to support. -% \begin{macrocode} -\keys_define:nn { xfrac } - { - cm-recommended .choice:, - cm-recommended / - false .code:n = - { \bool_set_true:N \l_@@_cm_std_bool }, - cm-recommended / - true .code:n = - { \bool_set_false:N \l_@@_cm_std_bool }, - cm-recommended .default:n = { true }, - cm-standard .bool_set:N = \l_@@_cm_std_bool - } -\ProcessKeysOptions { xfrac } -% \end{macrocode} -% \end{variable} -% -% \begin{variable}{\l_@@_slash_box} -% \begin{variable}{\l_@@_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{macrocode} -\box_new:N \l_@@_slash_box -\box_new:N \l_@@_tmp_box -% \end{macrocode} -% \end{variable} -% \end{variable} -% -% \begin{macro}{\@@_tmp:w} -% Used for the raised boxes: weird as it does not take an argument -% but the \cs{raisebox} does. -% \begin{macrocode} -\cs_new:Npn \@@_tmp:w { } -% \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{variable}{\l_@@_denominator_bot_sep_dim} -% \begin{variable}{\l_@@_numerator_bot_sep_dim} -% \begin{variable}{\l_@@_numerator_top_sep_dim} -% \begin{variable}{\l_@@_slash_left_sep_dim} -% \begin{variable}{\l_@@_slash_right_sep_dim} -% Fixed lengths. -% \begin{macrocode} -\dim_new:N \l_@@_denominator_bot_sep_dim -\dim_new:N \l_@@_numerator_bot_sep_dim -\dim_new:N \l_@@_numerator_top_sep_dim -\dim_new:N \l_@@_slash_left_sep_dim -\dim_new:N \l_@@_slash_right_sep_dim -% \end{macrocode} -% \end{variable} -% \end{variable} -% \end{variable} -% \end{variable} -% \end{variable} -% -% \begin{variable}{\l_@@_slash_left_muskip} -% \begin{variable}{\l_@@_slash_right_muskip} -% Math mode skips. -% \begin{macrocode} -\muskip_new:N \l_@@_slash_left_muskip -\muskip_new:N \l_@@_slash_right_muskip -% \end{macrocode} -% \end{variable} -% \end{variable} -% -% \begin{variable}{\l_@@_hscale_fp} -% \begin{variable}{\l_@@_scale_factor_fp} -% \begin{variable}{\l_@@_vscale_fp} -% Floating point values. -% \begin{macrocode} -\fp_new:N \l_@@_hscale_fp -\fp_new:N \l_@@_scale_factor_fp -\fp_new:N \l_@@_vscale_fp -% \end{macrocode} -% \end{variable} -% \end{variable} -% \end{variable} -% -% \begin{variable}{\l_@@_denominator_font_tl} -% \begin{variable}{\l_@@_numerator_font_tl} -% \begin{variable}{\l_@@_phantom_tl } -% \begin{variable}{\l_@@_slash_symbol_tl} -% \begin{variable}{\l_@@_slash_symbol_font_tl} -% Token lists, which include floating-point numbers and math(s) -% skips. -% \begin{macrocode} -\tl_new:N \l_@@_denominator_font_tl -\tl_new:N \l_@@_numerator_font_tl -\tl_new:N \l_@@_phantom_tl -\tl_new:N \l_@@_slash_symbol_tl -\tl_new:N \l_@@_slash_symbol_font_tl -% \end{macrocode} -% \end{variable} -% \end{variable} -% \end{variable} -% \end{variable} -% \end{variable} -% -% \begin{macro}{\@@_fontscale:} -% \begin{macro}{\@@_math:n} -% \begin{macro}{\@@_denominator_font_change:} -% \begin{macro}{\@@_denominator_format:n} -% \begin{macro}{\@@_numerator_font_change:} -% \begin{macro}{\@@_numerator_format:n} -% \begin{macro}{\@@_relscale:} -% \begin{macro}{\@@_slash_symbol_font_change:} -% \begin{macro}{\@@_slash_symbol_format:n} -% \begin{macro}{\@@_text_or_math:n} -% Functions, either things which are calculated \enquote{on the fly} -% (no argument required) or are functions taking one argument in the -% code. -% \begin{macrocode} -\cs_new:Npn \@@_fontscale: { } -\cs_new:Npn \@@_math:n #1 { } -\cs_new:Npn \@@_denominator_font_change: { } -\cs_new:Npn \@@_denominator_format:n #1 { } -\cs_new:Npn \@@_numerator_font_change: { } -\cs_new:Npn \@@_numerator_format:n #1 { } -\cs_new:Npn \@@_relscale: { } -\cs_new:Npn \@@_slash_symbol_font_change: { } -\cs_new:Npn \@@_slash_symbol_format:n #1 { } -\cs_new:Npn \@@_text_or_math:n #1 { } -% \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}. -% \begin{macrocode} -\DeclareObjectType { xfrac } { 3 } -% \end{macrocode} -% -% A single template interface is used for both text and math(s), which -% does make a few things a little complex later. -% \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 : real = 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 : real = 0.83333 , - scale-relative : choice { false , true } - = true , - scaling : choice { false , true } - = true , - slash-left-kern : length = 0 pt , - slash-left-mkern : muskip = -2 mu , - slash-right-kern : length = 0 pt , - slash-right-mkern : muskip = -1 mu , - slash-symbol : tokenlist = \textfractionsolidus , - slash-symbol-font : tokenlist = \f@family , - slash-symbol-format : function 1 = #1 , - v-scale : real = 1 , - } -% \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 \enquote{on the fly} functions. -% \begin{macrocode} -\DeclareTemplateCode { xfrac } { text } { 3 } - { - denominator-bot-sep = \l_@@_denominator_bot_sep_dim , - denominator-font = \l_@@_denominator_font_tl , - denominator-format = \@@_denominator_format:n , - h-scale = \l_@@_hscale_fp , - math-mode = - { - false = \cs_set_eq:NN \@@_math:n \use:n, - true = \cs_set_eq:NN \@@_math:n \ensuremath - }, - numerator-font = \l_@@_numerator_font_tl , - numerator-format = \@@_numerator_format:n , - numerator-bot-sep = \l_@@_numerator_bot_sep_dim , - numerator-top-sep = \l_@@_numerator_top_sep_dim , - phantom = \l_@@_phantom_tl , - scale-factor = \l_@@_scale_factor_fp , - scale-relative = - { - false = - \cs_set:Npn \@@_relscale: - { - \dim_eval:n - { \box_ht:N \l_@@_tmp_box + \box_dp:N \l_@@_tmp_box } - }, - true = - \cs_set:Npn \@@_relscale: - { \dim_eval:n { \box_ht:N \l_@@_slash_box } } - }, - scaling = - { - false = \cs_set_eq:NN \@@_fontscale: \prg_do_nothing:, - true = - \cs_set:Npn \@@_fontscale: - { - \fontsize - { \fp_to_dim:n { \l_@@_scale_factor_fp * \@@_relscale: } } - { \c_zero_dim } - \selectfont - } - }, - slash-left-kern = \l_@@_slash_left_sep_dim , - slash-left-mkern = \l_@@_slash_left_muskip , - slash-right-kern = \l_@@_slash_right_sep_dim , - slash-right-mkern = \l_@@_slash_right_muskip , - slash-symbol = \l_@@_slash_symbol_tl , - slash-symbol-font = \l_@@_slash_symbol_font_tl , - slash-symbol-format = \@@_slash_symbol_format:n , - v-scale = \l_@@_vscale_fp - } -% \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. -% \begin{macrocode} - { - \mode_if_math:TF - { - \cs_set_eq:NN \@@_text_or_math:n \text - \cs_set:Npe \@@_denominator_font_change: - { \tex_fam:D \l_@@_denominator_font_tl } - \cs_set:Npe \@@_numerator_font_change: - { \tex_fam:D \l_@@_numerator_font_tl } - \cs_set:Npe \@@_slash_symbol_font_change: - { \tex_fam:D \l_@@_slash_symbol_font_tl } - } - { - \cs_set_eq:NN \@@_text_or_math:n \mbox - \cs_set:Npn \@@_denominator_font_change: - { - \fontfamily { \l_@@_denominator_font_tl } - \selectfont - } - \cs_set:Npn \@@_numerator_font_change: - { - \fontfamily { \l_@@_numerator_font_tl } - \selectfont - } - \cs_set:Npn \@@_slash_symbol_font_change: - { - \fontfamily { \l_@@_slash_symbol_font_tl } - \selectfont - } - } -% \end{macrocode} -% 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} - \@@_text_or_math:n - { - \m@th - \hbox_set:Nn \l_@@_tmp_box - { \@@_math:n { \vphantom { ( ) } } } - \hbox_set:Nn \l_@@_slash_box - { - \@@_math:n - { - \@@_slash_symbol_format:n - { - \@@_math:n - { - \@@_slash_symbol_font_change: - \IfNoValueTF {#2} - { \l_@@_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. -% \begin{macrocode} - \cs_set:Npn \@@_tmp:w - { - \raisebox - { - \dim_eval:n - { - \box_ht:N \l_@@_slash_box - - \box_dp:N \l_@@_slash_box - - \height - } - } - } - \dim_compare:nNnTF - { \l_@@_numerator_top_sep_dim } = { \c_max_dim } - { - \dim_compare:nNnF - { \l_@@_numerator_bot_sep_dim } = { \c_max_dim } - { - \cs_set:Npn \@@_tmp:w - { - \raisebox - { \dim_use:N \l_@@_numerator_bot_sep_dim } - } - } - } - { - \dim_compare:nNnTF - { \l_@@_numerator_bot_sep_dim } = { \c_max_dim } - { - \cs_set:Npn \@@_tmp:w - { - \raisebox - { - \dim_eval:n - { - \box_ht:N \l_@@_slash_box - - \dim_use:N \l_@@_numerator_top_sep_dim - - \height - } - } - } - } - { - \msg_error:nn { xfrac } - { over-specified-numerator-sep } - } - } -% \end{macrocode} -% Typeset the numerator. -% \begin{macrocode} - \@@_tmp:w - { - \@@_fontscale: - \@@_numerator_format:n - { - \scalebox - { \fp_use:N \l_@@_hscale_fp } - [ \fp_use:N \l_@@_vscale_fp ] - { - \@@_math:n - { - \@@_numerator_font_change: - { - \vphantom { \l_@@_phantom_tl } - #1 - } - } - } - } - } - \@@_math:n - { % THIS IS JUST WRONG! - \mode_if_math:TF - { \tex_mskip:D \l_@@_slash_right_muskip } - { \tex_hskip:D \l_@@_slash_right_sep_dim } - } -% \end{macrocode} -% Typeset the separator. -% \begin{macrocode} - \box_use:N \l_@@_slash_box - \@@_math:n - { - \mode_if_math:TF - { \tex_mskip:D \l_@@_slash_left_muskip } - { \tex_hskip:D \l_@@_slash_left_sep_dim } - } -% \end{macrocode} -% Typeset the denominator. -% \begin{macrocode} - \dim_compare:nNnTF - { \l_@@_denominator_bot_sep_dim } = { \c_max_dim } - { - \cs_set:Npn \@@_tmp:w - { \raisebox { - \box_dp:N \l_@@_slash_box } } - } - { - \cs_set:Npn \@@_tmp:w - { - \raisebox - { \dim_use:N \l_@@_denominator_bot_sep_dim } - } - } - \@@_tmp:w - { - \@@_fontscale: - \@@_denominator_format:n - { - \scalebox - { \fp_use:N \l_@@_hscale_fp } - [ \fp_use:N \l_@@_vscale_fp ] - { - \@@_math:n - { - \@@_denominator_font_change: - { - \vphantom { \l_@@_phantom_tl } - #3 - } - } - } - } - } - } - } -% \end{macrocode} -% -% Since math(s) and text mode are wildly different entities we define a -% separate template for each. You already saw the \enquote{text} -% template, and here is the \enquote{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 , - denominator-bot-sep = 0 pt , - math-mode = true , - phantom = ( % ) - } -% \end{macrocode} -% -%\subsection{The standard instances} -% -% For the default instances we just use the relevant templates with -% the default settings. -% -% The default \enquote{text} instance. -% \begin{macrocode} -\DeclareInstance { xfrac } { default } { text } { } -% \end{macrocode} -% -% The default \enquote{math(s)} instance. We annot set the -% |numerator-top-sep| in the restricted template above as it clashes -% with the requirements of the |plainmath| collection which comes next. -% \begin{macrocode} -\DeclareInstance { xfrac } { mathdefault } { math } - { numerator-top-sep = 0pt } -% \end{macrocode} -% -% \begin{macrocode} -\DeclareCollectionInstance { plainmath } { xfrac } { mathdefault } { math } - { - numerator-bot-sep = 0 pt , - numerator-top-sep = \c_max_dim , - scale-factor = 1 , - scale-relative = false , - scaling = true , - slash-right-mkern = 0 mu , - slash-left-mkern = 0 mu - } -% \end{macrocode} -% -% 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 } { 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 } { 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 - } -% \end{macrocode} -% -% We can do better for the Computer Modern fonts. For cmr and cmss -% we choose Times, and for cmtt use Palatino. -% \begin{macrocode} -\bool_if:NF \l_@@_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 } - } -% \end{macrocode} -% -% Things works slightly better with Latin Modern. -% \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 - } -\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} -% -% \subsection{The user command} -% -% \begin{macro}{\sfrac} -% 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 -% \enquote{cmr2} may use -% \begin{verbatim} -% \sfrac[cmr2]{7}{12} -% \end{verbatim} -% and get the settings from \enquote{cmr2} instead of the settings of -% the current font family. -% \begin{macrocode} -\NewDocumentCommand \sfrac { o m o m } - { - \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} - } - } -% \end{macrocode} -% \end{macro} -% -% \subsection{Messages} -% -% 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} -% -% \begin{macrocode} -%</package> -% \end{macrocode} -% -% \end{implementation} -% -% \PrintIndex |