# -*- mode: Perl -*-
# /=====================================================================\ #
# |  caption.sty                                                        | #
# | 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;

# Basically all of this is ignorable (other than needing the macros defined).
# In principle, we could make use of some of the fonts...
#RequirePackage('ragged2e');
#RequirePackage('keyval');

# Should learn how to use the new KeyVals code to get these to make appropriate assignments!
# Most caption keyvals are ignorable, though.
DefKeyVal('caption', 'format',      '',          '');      # plain, hang,...
DefKeyVal('caption', 'indentation', 'Dimension', '0pt');
DefKeyVal('caption', 'labelformat', '', 'default'); # default, empty, simple, brace, parens; Use this!
DefKeyVal('caption', 'labelsep',      '', '');    # none, colon, period, space, quad, newline,endash
DefKeyVal('caption', 'textformat',    '', '');    # empty, simple, period
DefKeyVal('caption', 'justification', '', '');    # justified, centering, centerlast, centerfirst,
# raggedright, RaggedRight, raggedleft
DefKeyVal('caption', 'singlelinecheck', '', '');
# These font values are, in effect, keyvals lists!
DefKeyVal('caption', 'font',       '',          '');
DefKeyVal('caption', 'labelfont',  '',          '');
DefKeyVal('caption', 'textfont',   '',          '');
DefKeyVal('caption', 'font+',      '',          '');      # These add to the font
DefKeyVal('caption', 'labelfont+', '',          '');
DefKeyVal('caption', 'textfont+',  '',          '');
DefKeyVal('caption', 'margin',     'Dimension', '0pt');
DefKeyVal('caption', 'margin*',    'Dimension', '0pt');
DefKeyVal('caption', 'minmargin',  'Dimension', '0pt');
DefKeyVal('caption', 'maxmargin',  'Dimension', '0pt');
DefKeyVal('caption', 'parskip',    'Dimension', '0pt');
DefKeyVal('caption', 'width',      'Dimension', '0pt');
DefKeyVal('caption', 'oneside',    '',          '');
DefKeyVal('caption', 'twoside',    '',          '');
DefKeyVal('caption', 'hangindent', 'Dimension', '0pt');

DefKeyVal('caption', 'style', '', '');    # base, ...

DefKeyVal('caption', 'skip',           'Dimension', '0pt');
DefKeyVal('caption', 'position',       '',          '');      #  top, above, bottom, below
DefKeyVal('caption', 'figureposition', '',          '');
DefKeyVal('caption', 'tableposition',  '',          '');

DefKeyVal('caption', 'list',       '', '');                   # boolean (no)
DefKeyVal('caption', 'listformat', '', '');                   # name of list
DefKeyVal('caption', 'name',       '', '');                   # \<float>name ?
DefKeyVal('caption', 'type',       '', '');                   # table or figure

DefMacro('\captionsetup[]{}', Tokens());
DefPrimitive('\captionsetup[] RequiredKeyVals:caption', sub {
    my ($stomach, $ignore, $kv) = @_;
    my $hash = $kv->getKeyVals;
    foreach my $key (keys %$hash) {
      my $value = $kv->getValue($key);
      AssignValue('CAPTION_' . $key => $value); }
    return; });

DefMacro('\DeclareCaptionStyle{}[]{}',        Tokens());
DefMacro('\DeclareCaptionLabelFormat{}{}',    Tokens());
DefMacro('\DeclareCaptionLabelSeparator{}{}', Tokens());

DefMacro('\DeclareCaptionFont{}{}',          Tokens());
DefMacro('\DeclareCaptionFormat{}{}',        Tokens());
DefMacro('\DeclareCaptionJustification{}{}', Tokens());
DefMacro('\DeclareCaptionOption{}[]{}',      Tokens());
DefMacro('\DeclareCaptionPackage{}',         Tokens());

DefMacro('\bothIfFirst{}{}', sub {
    my ($gullet, $first, $second) = @_;
    (IsEmpty($first) ? () : ($first->unlist, $second->unlist)); });

DefMacro('\bothIfSecond{}{}', sub {
    my ($gullet, $first, $second) = @_;
    (IsEmpty($second) ? () : ($first->unlist, $second->unlist)); });

DefMacro('\AtBeginCaption{}',       Tokens());
DefMacro('\AtEndCaption{}',         Tokens());
DefMacro('\ContinuedFloat',         Tokens());
DefMacro('\ProcessOptionsWithKV{}', Tokens());

DefMacro('\captionfont', Tokens());
DefMacro('\captionsize', Tokens());

DefRegister('\captionparindent'  => Dimension(0));
DefRegister('\captionindent'     => Dimension(0));
DefRegister('\captionhangindent' => Dimension(0));
DefRegister('\captionmargin'     => Dimension(0));
DefRegister('\captionwidth'      => Dimension(0));

DefMacro('\caption',
  '\lx@donecaptiontrue
 \@ifundefined{@captype}
    {\maybe@@generic@caption}
    {\@ifstar{\@scaption}{\expandafter\@caption\expandafter{\@captype}}}');
DefMacro('\@scaption {}', '\@@caption{#1}');

# Check if caption type set by \captionsetup
DefMacro('\maybe@@generic@caption', sub {
    if (my $type = LookupValue('CAPTION_type')) {
      return Tokens(T_CS('\@captionof'), T_BEGIN, $type, T_END); }
    else {
      return T_CS('\@@generic@caption'); } });
# This is a horrible thing that fakes a caption anywhere.
# It isn't necessarily IN a figure or any float, so we'll wrap it in an otherwise empty one!
DefMacro('\captionof', '\@ifstar{\@scaptionof}{\@captionof}');
DefMacro('\@captionof{}[]{}',
  '\@ifnext\label{\@captionof@postlabel{#1}{#2}{#3}}{\@captionof@{#1}{#2}{#3}}');
# Check for trailing \label!
DefMacro('\@captionof@postlabel{}{}{} SkipMatch:\label Semiverbatim',
  '\@captionof@{#1}{#2}{#3\label{#4}}');
DefMacro('\@captionof@ {}{}{}',
  '\begin{#1}\@caption@{#1}{#2}{#3}\end{#1}');

DefMacro('\@scaptionof {}{}',
  '\begin{#1*}\@scaption{#2}\end{#1*}');

DefMacro('\clearcaptionsetup',    Tokens());
DefMacro('\rotcaption',           Tokens());
DefMacro('\showcaptionsetup[]{}', Tokens());

1;
