# -*- mode: Perl -*-
# /=====================================================================\ #
# | nicefrac | #
# | Implementation for LaTeXML | #
# |=====================================================================| #
# | Part of LaTeXML: | #
# | Public domain software, produced as part of work done by the | #
# | United States Government & not subject to copyright in the US. | #
# |---------------------------------------------------------------------| #
# | Bruce Miller <bruce.miller@nist.gov> #_# | #
# | http://dlmf.nist.gov/LaTeXML/ (o o) | #
# \=========================================================ooo==U==ooo=/ #
package LaTeXML::Package::Pool;
use strict;
use warnings;
use LaTeXML::Package;
RequirePackage('ifthen');
# Handy for cases where macros want to use math, but track the current text font
# (examples, nicefrac, units...)
DefPrimitiveI('\nf@mathcopytextfont', undef, sub {
if (my $textfont = LookupValue('savedfont')) {
MergeFont(family => $textfont->getFamily,
series => $textfont->getSeries,
shape => $textfont->getShape); }
return; });
# This version generates inline /, with up-shifted numerator
# The shift is an approximation of em - script(em)
# Given current browser implementations of mfrac @bevelled,
# it more accurately captures the appearance of \nicefrac
DefConstructor('\ltx@nicefrac@inline InFractionStyle InFractionStyle',
"<ltx:XMApp>"
# Note: / should be kerned with -2mu, -1mu on left & right
# Note that we're using width negative as an ADJUSTMENT of width, not total width!!!
. "<ltx:XMTok stretchy='true' meaning='divide' role='MULOP' _font='#slashfont'"
. " xoffset='-0.1em' width='-0.15em'>/</ltx:XMTok>"
. "<ltx:XMArg yoffset='0.3em' rpadding='-0.5em'>#1</ltx:XMArg>"
. "<ltx:XMArg>#2</ltx:XMArg>"
. "</ltx:XMApp>",
alias => '\nicefrac',
properties => { slashfont => sub { LookupValue('font')->specialize('/'); } });
# This version generates a MathML mfrac with bevelled='true'
DefConstructor('\ltx@nicefrac@bevelled InFractionStyle InFractionStyle',
"<ltx:XMApp>"
. "<ltx:XMTok meaning='divide' role='FRACOP' mathstyle='#mathstyle' class='ltx_bevelled'/>"
. "<ltx:XMArg>#1</ltx:XMArg><ltx:XMArg>#2</ltx:XMArg>"
. "</ltx:XMApp>",
alias => '\nicefrac', #);
sizer => sub { fracSizer($_[0]->getArg(1), $_[0]->getArg(2)); },
properties => { mathstyle => sub { LookupValue('font')->getMathstyle; } });
# Note that we want to typeset all \nicefrac as math
# However, when \nicefrac is in text mode, it inherits the text font; NOT in math!
# OTOH, when the optional font is given, it can't be \mathtt (eg) when in text mode.
# Can we make \texttt act like \mathtt when in math? (ie. avoid wrapping in mtext!)
DefMacro('\@UnitsNiceFrac Optional {}{}',
'\ifmmode\ltx@nicefrac@inline{#1{#2}}{#1{#3}}'
. '\else\if.#1.$\ltx@nicefrac@inline{\nf@mathcopytextfont{#2}}{\nf@mathcopytextfont{#3}}$'
. '\else$\ltx@nicefrac@inline{#1{#2}}{#1{#3}}$\fi\fi');
DefMacro('\@UnitsNiceFrac@bevelled Optional {}{}',
'\ifmmode\ltx@nicefrac@bevelled{#1{#2}}{#1{#3}}'
. '\else\if.#1.$\ltx@nicefrac@bevelled{\nf@mathcopytextfont{#2}}{\nf@mathcopytextfont{#3}}$'
. '\else$\ltx@nicefrac@bevelled{#1{#2}}{#1{#3}}$\fi\fi');
Let('\@UnitsUglyFrac', '\@UnitsNiceFrac');
DeclareOption('nice', sub { Let('\nicefrac', '\@UnitsNiceFrac'); });
DeclareOption('ugly', sub { Let('\nicefrac', '\@UnitsUglyFrac'); });
# NON-STANDARD option; generate MathML mfrac with bevelled='true'
DeclareOption('bevelled', sub { Let('\nicefrac', '\@UnitsNiceFrac@bevelled'); });
ExecuteOptions('nice');
ProcessOptions();
#======================================================================
1;