diff --git a/lib/LaTeXML/Core/Definition/Register.pm b/lib/LaTeXML/Core/Definition/Register.pm index c998de408..24182a56f 100644 --- a/lib/LaTeXML/Core/Definition/Register.pm +++ b/lib/LaTeXML/Core/Definition/Register.pm @@ -58,10 +58,11 @@ sub valueOf { sub setValue { my ($self, $value, $scope, @args) = @_; my $tracing = (($STATE->lookupValue('TRACING') || 0) & TRACE_COMMANDS); + my $name = ''; if ($tracing) { my $scope = $STATE->getPrefix('global') ? 'globally ' : ''; - my $csname = ToString($$self{cs}); - Debug("{$scope" . "changing " . $csname . "=" . ToString($self->valueOf(@args)) . "}"); } + $name = ToString($$self{cs}).join(',',map { ToString($_); } @args); + Debug("{$scope" . "changing " . $name . "=" . ToString($self->valueOf(@args)) . "}"); } if (my $setter = $$self{setter}) { &{ $$self{setter} }($value, $scope, @args); } elsif ($$self{readonly}) { @@ -70,7 +71,7 @@ sub setValue { else { my $loc = (@args ? join('', $$self{address}, map { ToString($_) } @args) : $$self{address}); $STATE->assignValue($loc => $value, $scope); } - Debug("{into " . ToString($$self{cs}) . "=" . ToString($self->valueOf(@args)) . "}") if $tracing; + Debug("{into " . $name . "=" . ToString($self->valueOf(@args)) . "}") if $tracing; return; } sub addValue { diff --git a/lib/LaTeXML/Engine/Base_ParameterTypes.pool.ltxml b/lib/LaTeXML/Engine/Base_ParameterTypes.pool.ltxml index 8f0d168d4..d9ff0d4de 100644 --- a/lib/LaTeXML/Engine/Base_ParameterTypes.pool.ltxml +++ b/lib/LaTeXML/Engine/Base_ParameterTypes.pool.ltxml @@ -96,6 +96,44 @@ DefParameterType('XToken', sub { $_[0]->readXToken; }); # Read a number DefParameterType('Number', sub { $_[0]->readNumber; }); +# Note that LaTeX defines several utilities, fairly heavily used, +# \setcounter, \setlength, along with \addtocounter,\addtolength +# which basically just assign a register to a Number or Dimension. +# These are typically defined in LaTeXML as {Number}, {Dimension}, or [Number],[Dimension] +# since they are read as a normal arg, but then reparsed as Number or Dimension. +# The calc package REDEFINES these to support a bit of arithmetic, or extra braces. +# Thus MANY commands suddenly accept a much wider range of expressions! +# Note also that calc actually accepts Glue expressions for Dimensions. +# [We could have calc redefine the ParameterTypes, but the internal data has already +# been incorporated into definition's Parameters objects; Thus the current hackery:] + +# Read a regular arg, but content should be Number, +# or extended calc syntax if calc.sty is loaded. +DefParameterType('{Number}', sub { + my ($gullet) = @_; + my $value = $gullet->readArg(); + return $gullet->readingFromMouth($value, sub { + (LookupValue('calc.sty.ltxml_loaded') + ? readCalcExpression($gullet, 'Number') + : $gullet->readNumber()); }); }, + reversion => sub { + my ($arg) = @_; + (T_BEGIN, Revert($arg), T_END); }); + +# Similar to {Number}, but for optional +DefParameterType('[Number]', sub { + my ($gullet) = @_; + my $value = $gullet->readOptional; + return unless $value; + return $gullet->readingFromMouth($value, sub { + (LookupValue('calc.sty.ltxml_loaded') + ? readCalcExpression($gullet, 'Number') + : $gullet->readNumber()); }); }, + optional => 1, + reversion => sub { + my ($arg) = @_; + return ($arg ? (T_OTHER('['), Revert($arg), T_OTHER(']')) : ()); }); + # Read a floating point number DefParameterType('Float', sub { $_[0]->readFloat; }); @@ -107,9 +145,61 @@ sub ReadFloat { # Read a dimension DefParameterType('Dimension', sub { $_[0]->readDimension; }); +# This expects a TeX dimension, but wrapped in {}; redefinable by calc.sty +DefParameterType('{Dimension}', sub { + my ($gullet) = @_; + my $value = $gullet->readArg(); + return $gullet->readingFromMouth($value, sub { + (LookupValue('calc.sty.ltxml_loaded') + ? readCalcExpression($gullet, 'Glue') # Yes, calc parses a Glue for Dimensions! + : $gullet->readDimension()); }); }, + reversion => sub { + my ($arg) = @_; + (T_BEGIN, Revert($arg), T_END); }); + +# Similar to {Dimension}, but for optional +DefParameterType('[Dimension]', sub { + my ($gullet) = @_; + my $value = $gullet->readOptional; + return unless $value; + return $gullet->readingFromMouth($value, sub { + (LookupValue('calc.sty.ltxml_loaded') + ? readCalcExpression($gullet, 'Glue') + : $gullet->readDimension()); }); }, + optional => 1, + reversion => sub { + my ($arg) = @_; + return ($arg ? (T_OTHER('['), Revert($arg), T_OTHER(']')) : ()); }); + # Read a Glue (aka skip) DefParameterType('Glue', sub { $_[0]->readGlue; }); +# This expects a TeX Glue, but wrapped in {}; redefinable by calc.sty +DefParameterType('{Glue}', sub { + my ($gullet) = @_; + my $value = $gullet->readArg(); + return $gullet->readingFromMouth($value, sub { + (LookupValue('calc.sty.ltxml_loaded') + ? readCalcExpression($gullet, 'Glue') + : $gullet->readGlue()); }); }, + reversion => sub { + my ($arg) = @_; + (T_BEGIN, Revert($arg), T_END); }); + +# Similar to {Glue}, but for optional +DefParameterType('[Glue]', sub { + my ($gullet) = @_; + my $value = $gullet->readOptional; + return unless $value; + return $gullet->readingFromMouth($value, sub { + (LookupValue('calc.sty.ltxml_loaded') + ? readCalcExpression($gullet, 'Glue') + : $gullet->readGlue()); }); }, + optional => 1, + reversion => sub { + my ($arg) = @_; + return ($arg ? (T_OTHER('['), Revert($arg), T_OTHER(']')) : ()); }); + # Read a MuDimension (math) DefParameterType('MuDimension', sub { $_[0]->readMuDimension; }); diff --git a/lib/LaTeXML/Package.pm b/lib/LaTeXML/Package.pm index 963f64aeb..164480be9 100644 --- a/lib/LaTeXML/Package.pm +++ b/lib/LaTeXML/Package.pm @@ -209,23 +209,33 @@ sub parseParameters { $p =~ s/^\s+//; $p =~ s/\s+$//; while ($p) { # Handle possibly nested cases, such as {Number} + # That can be explicitly defined as {Number}, + # OR will be handled as readArg, then the content reparsed as Number if ($p =~ s/^(\{([^\}]*)\})\s*//) { my ($spec, $inner_spec) = ($1, $2); - my $inner = ($inner_spec ? parseParameters($inner_spec, $for) : undef); - # If single inner spec is optional, make whole thing optional - my $opt = $inner && (scalar(@$inner) == 1) && $$inner[0]{optional}; - push(@params, LaTeXML::Core::Parameter->new('Plain', $spec, extra => [$inner], - optional => $opt)); } + if(LookupMapping('PARAMETER_TYPES', $spec)) { # If specially defined with braces? + push(@params, LaTeXML::Core::Parameter->new($spec, $spec)); } + else { + my $inner = ($inner_spec ? parseParameters($inner_spec, $for) : undef); + # If single inner spec is optional, make whole thing optional + my $opt = $inner && (scalar(@$inner) == 1) && $$inner[0]{optional}; + push(@params, LaTeXML::Core::Parameter->new('Plain', $spec, extra => [$inner], + optional => $opt)); } } elsif ($p =~ s/^(\[([^\]]*)\])\s*//) { # Ditto for Optional + # Optional also can be defined explicitly as [Type] + # OR read using readOptional, then content (if any) reparsed as Type. my ($spec, $inner_spec) = ($1, $2); - if ($inner_spec =~ /^Default:(.*)$/) { - push(@params, LaTeXML::Core::Parameter->new('Optional', $spec, - extra => [TokenizeInternal($1), undef])); } - elsif ($inner_spec) { - push(@params, LaTeXML::Core::Parameter->new('Optional', $spec, - extra => [undef, parseParameters($inner_spec, $for)])); } + if(LookupMapping('PARAMETER_TYPES', $spec)) { # If specially defined with []? + push(@params, LaTeXML::Core::Parameter->new($spec, $spec, optional => 1)); } else { - push(@params, LaTeXML::Core::Parameter->new('Optional', $spec)); } } + if ($inner_spec =~ /^Default:(.*)$/) { + push(@params, LaTeXML::Core::Parameter->new('Optional', $spec, + extra => [TokenizeInternal($1), undef])); } + elsif ($inner_spec) { + push(@params, LaTeXML::Core::Parameter->new('Optional', $spec, + extra => [undef, parseParameters($inner_spec, $for)])); } + else { + push(@params, LaTeXML::Core::Parameter->new('Optional', $spec)); } } } elsif ($p =~ s/^((\w*)(:([^\s\{\[]*))?)\s*//) { my ($spec, $type, $extra) = ($1, $2, $4); my @extra = map { TokenizeInternal($_) } split('\|', $extra || ''); diff --git a/lib/LaTeXML/Package/calc.sty.ltxml b/lib/LaTeXML/Package/calc.sty.ltxml index 116aa851a..bed4fdaca 100644 --- a/lib/LaTeXML/Package/calc.sty.ltxml +++ b/lib/LaTeXML/Package/calc.sty.ltxml @@ -27,30 +27,12 @@ DefPrimitive('\heightof', ''); DefPrimitive('\ratio', ''); DefPrimitive('\real', ''); -# \setcounter{}{} -DefPrimitive('\setcounter{}{}', sub { - my ($stomach, $ctr, $arg) = @_; - SetCounter($ctr, readExpression($stomach->getGullet, 'Number', $arg)); - return; }); - -# \addtocounter{}{} -DefPrimitive('\addtocounter{}{}', sub { - my ($stomach, $ctr, $arg) = @_; - AddToCounter($ctr, readExpression($stomach->getGullet, 'Number', $arg)); - return; }); - -DefPrimitive('\setlength{Variable}{}', sub { - my ($stomach, $var, $arg) = @_; - my ($defn, @args) = @$var; - return unless $defn && ($defn ne 'missing'); - $defn->setValue(readExpression($stomach->getGullet, 'Glue', $arg), undef, @args); }); - -DefPrimitive('\addtolength{Variable}{}', sub { - my ($stomach, $var, $arg) = @_; - my ($defn, @args) = @$var; - return unless $defn && ($defn ne 'missing'); - $defn->setValue($defn->valueOf(@args)->add(readExpression($stomach->getGullet, 'Glue', $arg)), - undef, @args); }); +# These don't need to be redefined (from latex), since they get extended via +# the {Number},{Dimension} parameter types. +# \setcounter{}{} +# \addtocounter{}{} +# \setlength{} +# \addtolength{} DefPrimitive('\settowidth{Variable} HBoxContents', sub { my ($stomach, $var, $box) = @_; @@ -120,6 +102,14 @@ sub readExpression { $term = ($op eq '+' ? $term->add($term2) : $term->subtract($term2)); } return $term; }); } +sub readCalcExpression { + my ($gullet, $type) = @_; + my $term = readTerm($gullet, $type); + while (my $op = $gullet->readKeyword('+', '-')) { + my $term2 = readTerm($gullet, $type); + $term = ($op eq '+' ? $term->add($term2) : $term->subtract($term2)); } + return $term; } + sub readTerm { my ($gullet, $type) = @_; $gullet->skipSpaces; @@ -182,6 +172,9 @@ sub readValue { # Read & Evaluate parenthesized subexpressions elsif (Equals($peek, T_OTHER('('))) { return readExpression($gullet, $type, $gullet->readUntil(T_OTHER(')'))); } + elsif (Equals($peek, T_BEGIN)) { + $gullet->unread($gullet->readBalanced); # Effectively strip the brace. + return readValue($gullet, $type); } # then retry # Else read literal values. else { $gullet->unread($peek); diff --git a/lib/LaTeXML/Package/graphics.sty.ltxml b/lib/LaTeXML/Package/graphics.sty.ltxml index f3878e1ea..5e8e4c3d3 100644 --- a/lib/LaTeXML/Package/graphics.sty.ltxml +++ b/lib/LaTeXML/Package/graphics.sty.ltxml @@ -22,7 +22,8 @@ use LaTeXML::Util::Image; # (See LaTeXML::Post::Graphics for suggested postprocessing) # Package options: draft, final, hiderotate, hidescale, hiresbb -# Dimensions, but \calc syntax SHOULD be allowed (if calc loaded) +# "!" (punt to other axes) or Dimension, but \calc syntax allowed if calc loaded +# [See discussions in Base_ParameterTypes for {Dimension} DefParameterType('GraphixDimension', sub { my ($gullet) = @_; $gullet->skipSpaces; @@ -32,7 +33,9 @@ DefParameterType('GraphixDimension', sub { undef; } # essentially: let other dimensions determine size. else { $gullet->unread($next); - $gullet->readDimension; } }, + (LookupValue('calc.sty.ltxml_loaded') + ? readCalcExpression($gullet, 'Glue') + : $gullet->readDimension()); } }, optional => 1); # For trim, viewport: a sequence of 4 dimensions @@ -284,7 +287,7 @@ sub graphicX_options { my ($key, $value) = (shift(@kv), shift(@kv)); $saw_w = 1 if $key =~ /width$/; $saw_h = 1 if $key =~ /height$/; - $value = ToString($value); + $value = $value->toAttribute if ref $value; $value =~ s/,/\\,/g; # Slashify any "," within the value push(@options, $key . '=' . $value); } push(@options, 'keepaspectratio=true') if ($saw_w xor $saw_h) && !$kv->hasKey('keepaspectratio'); diff --git a/t/complex/figure_dual_caption.xml b/t/complex/figure_dual_caption.xml index 4b0f9928d..900f7a19f 100644 --- a/t/complex/figure_dual_caption.xml +++ b/t/complex/figure_dual_caption.xml @@ -12,12 +12,12 @@ Figure 2
- + 1Left figure. Figure 1Left figure.
- + 2Right figure. Figure 2Right figure.
diff --git a/t/complex/figure_mixed_content.xml b/t/complex/figure_mixed_content.xml index a7964162a..3743afdee 100644 --- a/t/complex/figure_mixed_content.xml +++ b/t/complex/figure_mixed_content.xml @@ -79,7 +79,7 @@ (a) 1(a) - + (a) (a) @@ -89,7 +89,7 @@ (b) 1(b) - + (b) (b) @@ -159,10 +159,10 @@ Figure 3 - + - + @@ -407,8 +407,8 @@ 5 Figure 5 - - + +

.

5Caption @@ -425,13 +425,13 @@ 6 Figure 6 - - + + 6mid-fig caption Figure 6mid-fig caption - - + +
@@ -442,13 +442,13 @@ 7leading caption Figure 7leading caption - - + + 8mid-fig caption Figure 8mid-fig caption - - + + 9trailing caption Figure 9trailing caption
diff --git a/t/graphics/calc.pdf b/t/graphics/calc.pdf index 38455a6ab..4a18c8501 100644 Binary files a/t/graphics/calc.pdf and b/t/graphics/calc.pdf differ diff --git a/t/graphics/calc.tex b/t/graphics/calc.tex index 9c4bc0eca..11a409179 100644 --- a/t/graphics/calc.tex +++ b/t/graphics/calc.tex @@ -1,5 +1,6 @@ \documentclass{article} \usepackage{calc} +\usepackage{graphicx} \begin{document} \section{Counters} @@ -88,4 +89,15 @@ \section{Macros?} \setcounter{ctra}{3*\maxof{\four+5}{3*\four}} Count 3*maxof(\four+5)(3*\four) =\thectra. +\section{Magical Redefinition} +All but 1st 2 would fail in stock LaTeX: +\makebox{Foo} +\makebox[1in]{Foo} +\makebox[{1in}]{Foo} +\makebox[{{1in}}]{Foo} +\makebox[0.5in*2]{Foo} + +\includegraphics{none} +\includegraphics[width=2in]{none} +\includegraphics[width=1in*2]{none} \end{document} diff --git a/t/graphics/calc.xml b/t/graphics/calc.xml index 8a2d08ea6..351b0f34e 100644 --- a/t/graphics/calc.xml +++ b/t/graphics/calc.xml @@ -1,6 +1,7 @@ + @@ -111,4 +112,25 @@

Count 3*maxof(4+5)(3*4) =36.

+
+ + 6 + 6 + ยง6 + + <tag close=" ">6</tag>Magical Redefinition + +

All but 1st 2 would fail in stock LaTeX: +Foo +Foo +Foo +Foo +Foo

+
+ + + + + +
diff --git a/t/structure/figure_grids.xml b/t/structure/figure_grids.xml index a51e090dd..853433c26 100644 --- a/t/structure/figure_grids.xml +++ b/t/structure/figure_grids.xml @@ -8,168 +8,168 @@
- - + +
- + - +
- - + + - - + +
- - - + + + - - - + + + - - - + + +
- - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + +
- - - - + + + + - - - - + + + +
- - + + - - + + - - + + - - + +
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
@@ -179,7 +179,7 @@ (a) 1(a) - + (a)subcaption (a)subcaption @@ -188,7 +188,7 @@ (b) 1(b) - + (b)subcaption (b)subcaption @@ -201,7 +201,7 @@ (a) 2(a) - + (a)subcaption (a)subcaption @@ -211,7 +211,7 @@ (b) 2(b) - + (b)subcaption (b)subcaption @@ -224,7 +224,7 @@ (a) 3(a) - + (a)subcaption (a)subcaption @@ -233,7 +233,7 @@ (b) 3(b) - + (b)subcaption (b)subcaption @@ -243,7 +243,7 @@ (c) 3(c) - + (c)subcaption (c)subcaption @@ -252,7 +252,7 @@ (d) 3(d) - + (d)subcaption (d)subcaption @@ -265,7 +265,7 @@ (a) 4(a) - + (a)subcaption (a)subcaption @@ -274,7 +274,7 @@ (b) 4(b) - + (b)subcaption (b)subcaption @@ -283,7 +283,7 @@ (c) 4(c) - + (c)subcaption (c)subcaption @@ -293,7 +293,7 @@ (d) 4(d) - + (d)subcaption (d)subcaption @@ -302,7 +302,7 @@ (e) 4(e) - + (e)subcaption (e)subcaption @@ -311,7 +311,7 @@ (f) 4(f) - + (f)subcaption (f)subcaption @@ -321,7 +321,7 @@ (g) 4(g) - + (g)subcaption (g)subcaption @@ -330,7 +330,7 @@ (h) 4(h) - + (h)subcaption (h)subcaption @@ -339,7 +339,7 @@ (i) 4(i) - + (i)subcaption (i)subcaption @@ -352,7 +352,7 @@ (a) 5(a) - + (a)subcaption (a)subcaption @@ -361,7 +361,7 @@ (b) 5(b) - + (b)subcaption (b)subcaption @@ -370,7 +370,7 @@ (c) 5(c) - + (c)subcaption (c)subcaption @@ -379,7 +379,7 @@ (d) 5(d) - + (d)subcaption (d)subcaption @@ -389,7 +389,7 @@ (e) 5(e) - + (e)subcaption (e)subcaption @@ -398,7 +398,7 @@ (f) 5(f) - + (f)subcaption (f)subcaption @@ -407,7 +407,7 @@ (g) 5(g) - + (g)subcaption (g)subcaption @@ -416,7 +416,7 @@ (h) 5(h) - + (h)subcaption (h)subcaption @@ -426,7 +426,7 @@ (i) 5(i) - + (i)subcaption (i)subcaption @@ -435,7 +435,7 @@ (j) 5(j) - + (j)subcaption (j)subcaption @@ -444,7 +444,7 @@ (k) 5(k) - + (k)subcaption (k)subcaption @@ -453,7 +453,7 @@ (l) 5(l) - + (l)subcaption (l)subcaption @@ -463,7 +463,7 @@ (m) 5(m) - + (m)subcaption (m)subcaption @@ -472,7 +472,7 @@ (n) 5(n) - + (n)subcaption (n)subcaption @@ -481,7 +481,7 @@ (o) 5(o) - + (o)subcaption (o)subcaption @@ -490,7 +490,7 @@ (p) 5(p) - + (p)subcaption (p)subcaption @@ -503,7 +503,7 @@ (a) 6(a) - + (a)subcaption (a)subcaption @@ -512,7 +512,7 @@ (b) 6(b) - + (b)subcaption (b)subcaption @@ -521,7 +521,7 @@ (c) 6(c) - + (c)subcaption (c)subcaption @@ -530,7 +530,7 @@ (d) 6(d) - + (d)subcaption (d)subcaption @@ -540,7 +540,7 @@ (e) 6(e) - + (e)subcaption (e)subcaption @@ -549,7 +549,7 @@ (f) 6(f) - + (f)subcaption (f)subcaption @@ -558,7 +558,7 @@ (g) 6(g) - + (g)subcaption (g)subcaption @@ -567,7 +567,7 @@ (h) 6(h) - + (h)subcaption (h)subcaption @@ -580,7 +580,7 @@ (a) 7(a) - + (a)subcaption (a)subcaption @@ -589,7 +589,7 @@ (b) 7(b) - + (b)subcaption (b)subcaption @@ -599,7 +599,7 @@ (c) 7(c) - + (c)subcaption (c)subcaption @@ -608,7 +608,7 @@ (d) 7(d) - + (d)subcaption (d)subcaption @@ -618,7 +618,7 @@ (e) 7(e) - + (e)subcaption (e)subcaption @@ -627,7 +627,7 @@ (f) 7(f) - + (f)subcaption (f)subcaption @@ -637,7 +637,7 @@ (g) 7(g) - + (g)subcaption (g)subcaption @@ -646,7 +646,7 @@ (h) 7(h) - + (h)subcaption (h)subcaption @@ -659,7 +659,7 @@ (a) 8(a) - + (a)subcaption (a)subcaption @@ -668,7 +668,7 @@ (b) 8(b) - + (b)subcaption (b)subcaption @@ -677,7 +677,7 @@ (c) 8(c) - + (c)subcaption (c)subcaption @@ -686,7 +686,7 @@ (d) 8(d) - + (d)subcaption (d)subcaption @@ -695,7 +695,7 @@ (e) 8(e) - + (e)subcaption (e)subcaption @@ -705,7 +705,7 @@ (f) 8(f) - + (f)subcaption (f)subcaption @@ -714,7 +714,7 @@ (g) 8(g) - + (g)subcaption (g)subcaption @@ -723,7 +723,7 @@ (h) 8(h) - + (h)subcaption (h)subcaption @@ -732,7 +732,7 @@ (i) 8(i) - + (i)subcaption (i)subcaption @@ -741,7 +741,7 @@ (j) 8(j) - + (j)subcaption (j)subcaption @@ -751,7 +751,7 @@ (k) 8(k) - + (k)subcaption (k)subcaption @@ -760,7 +760,7 @@ (l) 8(l) - + (l)subcaption (l)subcaption @@ -769,7 +769,7 @@ (m) 8(m) - + (m)subcaption (m)subcaption @@ -778,7 +778,7 @@ (n) 8(n) - + (n)subcaption (n)subcaption @@ -787,7 +787,7 @@ (o) 8(o) - + (o)subcaption (o)subcaption @@ -797,7 +797,7 @@ (p) 8(p) - + (p)subcaption (p)subcaption @@ -806,7 +806,7 @@ (q) 8(q) - + (q)subcaption (q)subcaption @@ -815,7 +815,7 @@ (r) 8(r) - + (r)subcaption (r)subcaption @@ -824,7 +824,7 @@ (s) 8(s) - + (s)subcaption (s)subcaption @@ -833,7 +833,7 @@ (t) 8(t) - + (t)subcaption (t)subcaption @@ -843,7 +843,7 @@ (u) 8(u) - + (u)subcaption (u)subcaption @@ -852,7 +852,7 @@ (v) 8(v) - + (v)subcaption (v)subcaption @@ -861,7 +861,7 @@ (w) 8(w) - + (w)subcaption (w)subcaption @@ -870,7 +870,7 @@ (x) 8(x) - + (x)subcaption (x)subcaption @@ -879,7 +879,7 @@ (y) 8(y) - + (y)subcaption (y)subcaption @@ -892,7 +892,7 @@ (a) 9(a) - + (a)subcaption (a)subcaption @@ -901,7 +901,7 @@ (b) 9(b) - + (b)subcaption (b)subcaption @@ -910,7 +910,7 @@ (c) 9(c) - + (c)subcaption (c)subcaption @@ -919,7 +919,7 @@ (d) 9(d) - + (d)subcaption (d)subcaption @@ -928,7 +928,7 @@ (e) 9(e) - + (e)subcaption (e)subcaption @@ -937,7 +937,7 @@ (f) 9(f) - + (f)subcaption (f)subcaption @@ -947,7 +947,7 @@ (g) 9(g) - + (g)subcaption (g)subcaption @@ -956,7 +956,7 @@ (h) 9(h) - + (h)subcaption (h)subcaption @@ -965,7 +965,7 @@ (i) 9(i) - + (i)subcaption (i)subcaption @@ -974,7 +974,7 @@ (j) 9(j) - + (j)subcaption (j)subcaption @@ -983,7 +983,7 @@ (k) 9(k) - + (k)subcaption (k)subcaption @@ -992,7 +992,7 @@ (l) 9(l) - + (l)subcaption (l)subcaption @@ -1002,7 +1002,7 @@ (m) 9(m) - + (m)subcaption (m)subcaption @@ -1011,7 +1011,7 @@ (n) 9(n) - + (n)subcaption (n)subcaption @@ -1020,7 +1020,7 @@ (o) 9(o) - + (o)subcaption (o)subcaption @@ -1029,7 +1029,7 @@ (p) 9(p) - + (p)subcaption (p)subcaption @@ -1038,7 +1038,7 @@ (q) 9(q) - + (q)subcaption (q)subcaption @@ -1047,7 +1047,7 @@ (r) 9(r) - + (r)subcaption (r)subcaption @@ -1057,7 +1057,7 @@ (s) 9(s) - + (s)subcaption (s)subcaption @@ -1066,7 +1066,7 @@ (t) 9(t) - + (t)subcaption (t)subcaption @@ -1075,7 +1075,7 @@ (u) 9(u) - + (u)subcaption (u)subcaption @@ -1084,7 +1084,7 @@ (v) 9(v) - + (v)subcaption (v)subcaption @@ -1093,7 +1093,7 @@ (w) 9(w) - + (w)subcaption (w)subcaption @@ -1102,7 +1102,7 @@ (x) 9(x) - + (x)subcaption (x)subcaption @@ -1112,7 +1112,7 @@ (y) 9(y) - + (y)subcaption (y)subcaption @@ -1121,7 +1121,7 @@ (z) 9(z) - + (z)subcaption (z)subcaption @@ -1130,7 +1130,7 @@ (aa) 9(aa) - + (aa)subcaption (aa)subcaption @@ -1139,7 +1139,7 @@ (ab) 9(ab) - + (ab)subcaption (ab)subcaption @@ -1148,7 +1148,7 @@ (ac) 9(ac) - + (ac)subcaption (ac)subcaption @@ -1157,7 +1157,7 @@ (ad) 9(ad) - + (ad)subcaption (ad)subcaption @@ -1167,7 +1167,7 @@ (ae) 9(ae) - + (ae)subcaption (ae)subcaption @@ -1176,7 +1176,7 @@ (af) 9(af) - + (af)subcaption (af)subcaption @@ -1185,7 +1185,7 @@ (ag) 9(ag) - + (ag)subcaption (ag)subcaption @@ -1194,7 +1194,7 @@ (ah) 9(ah) - + (ah)subcaption (ah)subcaption @@ -1203,7 +1203,7 @@ (ai) 9(ai) - + (ai)subcaption (ai)subcaption @@ -1212,7 +1212,7 @@ (aj) 9(aj) - + (aj)subcaption (aj)subcaption @@ -1221,386 +1221,386 @@
- + - +
- + - +
- + - + - + - +
- + - + - + - + - + - + - + - + - +
- + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - +
- + - + - + - + - + - + - + - +
- + - + - + - + - + - + - + - +
- + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - +
- + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - +