# -*- mode: Perl -*-
# /=====================================================================\ #
# |  units                                                              | #
# | 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');
RequirePackage('nicefrac');

# in text mode, should be plain text,
# we could try to be consistent putting it in math with text font,
# but that runs into issues for cases where the author has already interleaved math inside the body
# e.g. (\unit[10$^{14}$]{ions/cm$^2$)}
# note: the closing paren is left inside the unit argument (typo from real arXiv doc)
# Adding a text helper
DefConstructor('\helper@ams@text {}',
  "<ltx:text _noautoclean='1' _noautoclose='1'>#1</ltx:text>", mode => 'text', reversion => "#1");
DefMacro('\unit [] {}',
  '\ifx.#1.\else#1\ltx@units@spacing\fi'
    . '\lx@units@assertunits{\ifmmode\mathrm{#2}\else #2\fi}');

DefMacro('\unitfrac [] {}{}',
  '\ifx.#1.\else#1\ltx@units@spacing\fi'
    . '\lx@units@assertunits{\ifmmode\nicefrac[\mathrm]{#2}{#3}\else\nicefrac{#2}{#3}\fi}');

DefConstructor('\lx@units@assertunits{}', '#1',
  afterConstruct => sub {
    my ($document) = @_;
    units_assert_units($document, $document->getNode); },
  reversion => '#1');

# Try to force some semantics of unit-ness down to the math tokens!
sub units_assert_units {
  my ($document, $node) = @_;
  my $qname = $document->getNodeQName($node);
  if (($qname eq 'ltx:XMTok') && (($node->getAttribute('role') || 'UNKNOWN') eq 'UNKNOWN')) {
    $node->setAttribute(role => 'ID');
    $document->addClass($node, 'ltx_unit'); }
  elsif ($qname) {
    map { units_assert_units($document, $_) } element_nodes($node); }
  return; }

DeclareOption('tight', sub { Let('\ltx@units@spacing', '\,'); });
DeclareOption('loose', sub { Let('\ltx@units@spacing', '~'); });

ExecuteOptions('tight');
ProcessOptions();

#======================================================================
1;
