Skip to content

Commit 6e13726

Browse files
committed
Merge support calc.sty's redefinitions (PR brucemiller#2652)
2 parents cbedddd + fc680c5 commit 6e13726

File tree

11 files changed

+531
-400
lines changed

11 files changed

+531
-400
lines changed

lib/LaTeXML/Core/Definition/Register.pm

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -58,10 +58,11 @@ sub valueOf {
5858
sub setValue {
5959
my ($self, $value, $scope, @args) = @_;
6060
my $tracing = (($STATE->lookupValue('TRACING') || 0) & TRACE_COMMANDS);
61+
my $name = '';
6162
if ($tracing) {
6263
my $scope = $STATE->getPrefix('global') ? 'globally ' : '';
63-
my $csname = ToString($$self{cs});
64-
Debug("{$scope" . "changing " . $csname . "=" . ToString($self->valueOf(@args)) . "}"); }
64+
$name = ToString($$self{cs}).join(',',map { ToString($_); } @args);
65+
Debug("{$scope" . "changing " . $name . "=" . ToString($self->valueOf(@args)) . "}"); }
6566
if (my $setter = $$self{setter}) {
6667
&{ $$self{setter} }($value, $scope, @args); }
6768
elsif ($$self{readonly}) {
@@ -70,7 +71,7 @@ sub setValue {
7071
else {
7172
my $loc = (@args ? join('', $$self{address}, map { ToString($_) } @args) : $$self{address});
7273
$STATE->assignValue($loc => $value, $scope); }
73-
Debug("{into " . ToString($$self{cs}) . "=" . ToString($self->valueOf(@args)) . "}") if $tracing;
74+
Debug("{into " . $name . "=" . ToString($self->valueOf(@args)) . "}") if $tracing;
7475
return; }
7576

7677
sub addValue {

lib/LaTeXML/Engine/Base_ParameterTypes.pool.ltxml

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,44 @@ DefParameterType('XToken', sub { $_[0]->readXToken; });
9696
# Read a number
9797
DefParameterType('Number', sub { $_[0]->readNumber; });
9898

99+
# Note that LaTeX defines several utilities, fairly heavily used,
100+
# \setcounter, \setlength, along with \addtocounter,\addtolength
101+
# which basically just assign a register to a Number or Dimension.
102+
# These are typically defined in LaTeXML as {Number}, {Dimension}, or [Number],[Dimension]
103+
# since they are read as a normal arg, but then reparsed as Number or Dimension.
104+
# The calc package REDEFINES these to support a bit of arithmetic, or extra braces.
105+
# Thus MANY commands suddenly accept a much wider range of expressions!
106+
# Note also that calc actually accepts Glue expressions for Dimensions.
107+
# [We could have calc redefine the ParameterTypes, but the internal data has already
108+
# been incorporated into definition's Parameters objects; Thus the current hackery:]
109+
110+
# Read a regular arg, but content should be Number,
111+
# or extended calc syntax if calc.sty is loaded.
112+
DefParameterType('{Number}', sub {
113+
my ($gullet) = @_;
114+
my $value = $gullet->readArg();
115+
return $gullet->readingFromMouth($value, sub {
116+
(LookupValue('calc.sty.ltxml_loaded')
117+
? readCalcExpression($gullet, 'Number')
118+
: $gullet->readNumber()); }); },
119+
reversion => sub {
120+
my ($arg) = @_;
121+
(T_BEGIN, Revert($arg), T_END); });
122+
123+
# Similar to {Number}, but for optional
124+
DefParameterType('[Number]', sub {
125+
my ($gullet) = @_;
126+
my $value = $gullet->readOptional;
127+
return unless $value;
128+
return $gullet->readingFromMouth($value, sub {
129+
(LookupValue('calc.sty.ltxml_loaded')
130+
? readCalcExpression($gullet, 'Number')
131+
: $gullet->readNumber()); }); },
132+
optional => 1,
133+
reversion => sub {
134+
my ($arg) = @_;
135+
return ($arg ? (T_OTHER('['), Revert($arg), T_OTHER(']')) : ()); });
136+
99137
# Read a floating point number
100138
DefParameterType('Float', sub { $_[0]->readFloat; });
101139

@@ -107,9 +145,61 @@ sub ReadFloat {
107145
# Read a dimension
108146
DefParameterType('Dimension', sub { $_[0]->readDimension; });
109147

148+
# This expects a TeX dimension, but wrapped in {}; redefinable by calc.sty
149+
DefParameterType('{Dimension}', sub {
150+
my ($gullet) = @_;
151+
my $value = $gullet->readArg();
152+
return $gullet->readingFromMouth($value, sub {
153+
(LookupValue('calc.sty.ltxml_loaded')
154+
? readCalcExpression($gullet, 'Glue') # Yes, calc parses a Glue for Dimensions!
155+
: $gullet->readDimension()); }); },
156+
reversion => sub {
157+
my ($arg) = @_;
158+
(T_BEGIN, Revert($arg), T_END); });
159+
160+
# Similar to {Dimension}, but for optional
161+
DefParameterType('[Dimension]', sub {
162+
my ($gullet) = @_;
163+
my $value = $gullet->readOptional;
164+
return unless $value;
165+
return $gullet->readingFromMouth($value, sub {
166+
(LookupValue('calc.sty.ltxml_loaded')
167+
? readCalcExpression($gullet, 'Glue')
168+
: $gullet->readDimension()); }); },
169+
optional => 1,
170+
reversion => sub {
171+
my ($arg) = @_;
172+
return ($arg ? (T_OTHER('['), Revert($arg), T_OTHER(']')) : ()); });
173+
110174
# Read a Glue (aka skip)
111175
DefParameterType('Glue', sub { $_[0]->readGlue; });
112176

177+
# This expects a TeX Glue, but wrapped in {}; redefinable by calc.sty
178+
DefParameterType('{Glue}', sub {
179+
my ($gullet) = @_;
180+
my $value = $gullet->readArg();
181+
return $gullet->readingFromMouth($value, sub {
182+
(LookupValue('calc.sty.ltxml_loaded')
183+
? readCalcExpression($gullet, 'Glue')
184+
: $gullet->readGlue()); }); },
185+
reversion => sub {
186+
my ($arg) = @_;
187+
(T_BEGIN, Revert($arg), T_END); });
188+
189+
# Similar to {Glue}, but for optional
190+
DefParameterType('[Glue]', sub {
191+
my ($gullet) = @_;
192+
my $value = $gullet->readOptional;
193+
return unless $value;
194+
return $gullet->readingFromMouth($value, sub {
195+
(LookupValue('calc.sty.ltxml_loaded')
196+
? readCalcExpression($gullet, 'Glue')
197+
: $gullet->readGlue()); }); },
198+
optional => 1,
199+
reversion => sub {
200+
my ($arg) = @_;
201+
return ($arg ? (T_OTHER('['), Revert($arg), T_OTHER(']')) : ()); });
202+
113203
# Read a MuDimension (math)
114204
DefParameterType('MuDimension', sub { $_[0]->readMuDimension; });
115205

lib/LaTeXML/Package.pm

Lines changed: 22 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -209,23 +209,33 @@ sub parseParameters {
209209
$p =~ s/^\s+//; $p =~ s/\s+$//;
210210
while ($p) {
211211
# Handle possibly nested cases, such as {Number}
212+
# That can be explicitly defined as {Number},
213+
# OR will be handled as readArg, then the content reparsed as Number
212214
if ($p =~ s/^(\{([^\}]*)\})\s*//) {
213215
my ($spec, $inner_spec) = ($1, $2);
214-
my $inner = ($inner_spec ? parseParameters($inner_spec, $for) : undef);
215-
# If single inner spec is optional, make whole thing optional
216-
my $opt = $inner && (scalar(@$inner) == 1) && $$inner[0]{optional};
217-
push(@params, LaTeXML::Core::Parameter->new('Plain', $spec, extra => [$inner],
218-
optional => $opt)); }
216+
if(LookupMapping('PARAMETER_TYPES', $spec)) { # If specially defined with braces?
217+
push(@params, LaTeXML::Core::Parameter->new($spec, $spec)); }
218+
else {
219+
my $inner = ($inner_spec ? parseParameters($inner_spec, $for) : undef);
220+
# If single inner spec is optional, make whole thing optional
221+
my $opt = $inner && (scalar(@$inner) == 1) && $$inner[0]{optional};
222+
push(@params, LaTeXML::Core::Parameter->new('Plain', $spec, extra => [$inner],
223+
optional => $opt)); } }
219224
elsif ($p =~ s/^(\[([^\]]*)\])\s*//) { # Ditto for Optional
225+
# Optional also can be defined explicitly as [Type]
226+
# OR read using readOptional, then content (if any) reparsed as Type.
220227
my ($spec, $inner_spec) = ($1, $2);
221-
if ($inner_spec =~ /^Default:(.*)$/) {
222-
push(@params, LaTeXML::Core::Parameter->new('Optional', $spec,
223-
extra => [TokenizeInternal($1), undef])); }
224-
elsif ($inner_spec) {
225-
push(@params, LaTeXML::Core::Parameter->new('Optional', $spec,
226-
extra => [undef, parseParameters($inner_spec, $for)])); }
228+
if(LookupMapping('PARAMETER_TYPES', $spec)) { # If specially defined with []?
229+
push(@params, LaTeXML::Core::Parameter->new($spec, $spec, optional => 1)); }
227230
else {
228-
push(@params, LaTeXML::Core::Parameter->new('Optional', $spec)); } }
231+
if ($inner_spec =~ /^Default:(.*)$/) {
232+
push(@params, LaTeXML::Core::Parameter->new('Optional', $spec,
233+
extra => [TokenizeInternal($1), undef])); }
234+
elsif ($inner_spec) {
235+
push(@params, LaTeXML::Core::Parameter->new('Optional', $spec,
236+
extra => [undef, parseParameters($inner_spec, $for)])); }
237+
else {
238+
push(@params, LaTeXML::Core::Parameter->new('Optional', $spec)); } } }
229239
elsif ($p =~ s/^((\w*)(:([^\s\{\[]*))?)\s*//) {
230240
my ($spec, $type, $extra) = ($1, $2, $4);
231241
my @extra = map { TokenizeInternal($_) } split('\|', $extra || '');

lib/LaTeXML/Package/calc.sty.ltxml

Lines changed: 17 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -27,30 +27,12 @@ DefPrimitive('\heightof', '');
2727
DefPrimitive('\ratio', '');
2828
DefPrimitive('\real', '');
2929

30-
# \setcounter{<ctr>}{<integer expression>}
31-
DefPrimitive('\setcounter{}{}', sub {
32-
my ($stomach, $ctr, $arg) = @_;
33-
SetCounter($ctr, readExpression($stomach->getGullet, 'Number', $arg));
34-
return; });
35-
36-
# \addtocounter{<ctr>}{<integer expression>}
37-
DefPrimitive('\addtocounter{}{}', sub {
38-
my ($stomach, $ctr, $arg) = @_;
39-
AddToCounter($ctr, readExpression($stomach->getGullet, 'Number', $arg));
40-
return; });
41-
42-
DefPrimitive('\setlength{Variable}{}', sub {
43-
my ($stomach, $var, $arg) = @_;
44-
my ($defn, @args) = @$var;
45-
return unless $defn && ($defn ne 'missing');
46-
$defn->setValue(readExpression($stomach->getGullet, 'Glue', $arg), undef, @args); });
47-
48-
DefPrimitive('\addtolength{Variable}{}', sub {
49-
my ($stomach, $var, $arg) = @_;
50-
my ($defn, @args) = @$var;
51-
return unless $defn && ($defn ne 'missing');
52-
$defn->setValue($defn->valueOf(@args)->add(readExpression($stomach->getGullet, 'Glue', $arg)),
53-
undef, @args); });
30+
# These don't need to be redefined (from latex), since they get extended via
31+
# the {Number},{Dimension} parameter types.
32+
# \setcounter{<reg>}{<integer expression>}
33+
# \addtocounter{<reg>}{<integer expression>}
34+
# \setlength{<reg}{<glue expression>}
35+
# \addtolength{<reg}{<glue expression>}
5436

5537
DefPrimitive('\settowidth{Variable} HBoxContents', sub {
5638
my ($stomach, $var, $box) = @_;
@@ -120,6 +102,14 @@ sub readExpression {
120102
$term = ($op eq '+' ? $term->add($term2) : $term->subtract($term2)); }
121103
return $term; }); }
122104

105+
sub readCalcExpression {
106+
my ($gullet, $type) = @_;
107+
my $term = readTerm($gullet, $type);
108+
while (my $op = $gullet->readKeyword('+', '-')) {
109+
my $term2 = readTerm($gullet, $type);
110+
$term = ($op eq '+' ? $term->add($term2) : $term->subtract($term2)); }
111+
return $term; }
112+
123113
sub readTerm {
124114
my ($gullet, $type) = @_;
125115
$gullet->skipSpaces;
@@ -182,6 +172,9 @@ sub readValue {
182172
# Read & Evaluate parenthesized subexpressions
183173
elsif (Equals($peek, T_OTHER('('))) {
184174
return readExpression($gullet, $type, $gullet->readUntil(T_OTHER(')'))); }
175+
elsif (Equals($peek, T_BEGIN)) {
176+
$gullet->unread($gullet->readBalanced); # Effectively strip the brace.
177+
return readValue($gullet, $type); } # then retry
185178
# Else read literal values.
186179
else {
187180
$gullet->unread($peek);

lib/LaTeXML/Package/graphics.sty.ltxml

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,8 @@ use LaTeXML::Util::Image;
2222
# (See LaTeXML::Post::Graphics for suggested postprocessing)
2323
# Package options: draft, final, hiderotate, hidescale, hiresbb
2424

25-
# Dimensions, but \calc syntax SHOULD be allowed (if calc loaded)
25+
# "!" (punt to other axes) or Dimension, but \calc syntax allowed if calc loaded
26+
# [See discussions in Base_ParameterTypes for {Dimension}
2627
DefParameterType('GraphixDimension', sub {
2728
my ($gullet) = @_;
2829
$gullet->skipSpaces;
@@ -32,7 +33,9 @@ DefParameterType('GraphixDimension', sub {
3233
undef; } # essentially: let other dimensions determine size.
3334
else {
3435
$gullet->unread($next);
35-
$gullet->readDimension; } },
36+
(LookupValue('calc.sty.ltxml_loaded')
37+
? readCalcExpression($gullet, 'Glue')
38+
: $gullet->readDimension()); } },
3639
optional => 1);
3740

3841
# For trim, viewport: a sequence of 4 dimensions
@@ -284,7 +287,7 @@ sub graphicX_options {
284287
my ($key, $value) = (shift(@kv), shift(@kv));
285288
$saw_w = 1 if $key =~ /width$/;
286289
$saw_h = 1 if $key =~ /height$/;
287-
$value = ToString($value);
290+
$value = $value->toAttribute if ref $value;
288291
$value =~ s/,/\\,/g; # Slashify any "," within the value
289292
push(@options, $key . '=' . $value); }
290293
push(@options, 'keepaspectratio=true') if ($saw_w xor $saw_h) && !$kv->hasKey('keepaspectratio');

t/complex/figure_dual_caption.xml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,12 @@
1212
<tag role="typerefnum">Figure 2</tag>
1313
</tags>
1414
<figure align="center" class="ltx_figure_panel ltx_minipage" vattach="middle" width="172.5pt" xml:id="S0.F2.fig1">
15-
<graphics candidates="../graphics/none.png" class="ltx_centering" graphic="../graphics/none.png" options="width=411.93767pt,keepaspectratio=true" xml:id="S0.F2.g1"/>
15+
<graphics candidates="../graphics/none.png" class="ltx_centering" graphic="../graphics/none.png" options="width=411.9pt,keepaspectratio=true" xml:id="S0.F2.g1"/>
1616
<toccaption class="ltx_centering"><tag close=" ">1</tag>Left figure.</toccaption>
1717
<caption class="ltx_centering"><tag close=": ">Figure 1</tag>Left figure.</caption>
1818
</figure>
1919
<figure align="center" class="ltx_figure_panel ltx_minipage" vattach="middle" width="172.5pt" xml:id="S0.F2.fig2">
20-
<graphics candidates="../graphics/none.png" class="ltx_centering" graphic="../graphics/none.png" options="width=411.93767pt,keepaspectratio=true" xml:id="S0.F2.g2"/>
20+
<graphics candidates="../graphics/none.png" class="ltx_centering" graphic="../graphics/none.png" options="width=411.9pt,keepaspectratio=true" xml:id="S0.F2.g2"/>
2121
<toccaption class="ltx_centering"><tag close=" ">2</tag>Right figure.</toccaption>
2222
<caption class="ltx_centering"><tag close=": ">Figure 2</tag>Right figure.</caption>
2323
</figure>

t/complex/figure_mixed_content.xml

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@
7979
<tag><text fontsize="90%">(a)</text></tag>
8080
<tag role="refnum">1(a)</tag>
8181
</tags>
82-
<graphics candidates="../graphics/none.png" graphic="../graphics/none.png" options="width=85.35826pt,keepaspectratio=true" xml:id="S0.F1.sf1.g1"/>
82+
<graphics candidates="../graphics/none.png" graphic="../graphics/none.png" options="width=85.4pt,keepaspectratio=true" xml:id="S0.F1.sf1.g1"/>
8383
<toccaption><tag close=" ">(a)</tag></toccaption>
8484
<caption><tag close=" "><text fontsize="90%">(a)</text></tag></caption>
8585
</figure>
@@ -89,7 +89,7 @@
8989
<tag><text fontsize="90%">(b)</text></tag>
9090
<tag role="refnum">1(b)</tag>
9191
</tags>
92-
<graphics candidates="../graphics/none.png" graphic="../graphics/none.png" options="width=85.35826pt,keepaspectratio=true" xml:id="S0.F1.sf2.g1"/>
92+
<graphics candidates="../graphics/none.png" graphic="../graphics/none.png" options="width=85.4pt,keepaspectratio=true" xml:id="S0.F1.sf2.g1"/>
9393
<toccaption><tag close=" ">(b)</tag></toccaption>
9494
<caption><tag close=" "><text fontsize="90%">(b)</text></tag></caption>
9595
</figure>
@@ -159,10 +159,10 @@
159159
<tag role="typerefnum">Figure 3</tag>
160160
</tags>
161161
<block class="ltx_figure_panel ltx_minipage" vattach="top" width="138.0pt">
162-
<graphics candidates="../graphics/none.png" graphic="../graphics/none.png" options="width=55.1983pt,keepaspectratio=true" xml:id="S0.F3.g1"/>
162+
<graphics candidates="../graphics/none.png" graphic="../graphics/none.png" options="width=55.2pt,keepaspectratio=true" xml:id="S0.F3.g1"/>
163163
</block>
164164
<block class="ltx_figure_panel ltx_minipage" vattach="top" width="138.0pt">
165-
<graphics candidates="../graphics/none.png" graphic="../graphics/none.png" options="width=55.1983pt,keepaspectratio=true" xml:id="S0.F3.g2"/>
165+
<graphics candidates="../graphics/none.png" graphic="../graphics/none.png" options="width=55.2pt,keepaspectratio=true" xml:id="S0.F3.g2"/>
166166
</block>
167167
<break/>
168168
<itemize class="ltx_centering ltx_figure_panel" xml:id="S0.I1">
@@ -407,8 +407,8 @@
407407
<tag role="refnum">5</tag>
408408
<tag role="typerefnum">Figure 5</tag>
409409
</tags>
410-
<graphics candidates="../graphics/none.png" class="ltx_figure_panel" graphic="../graphics/none.png" options="width=113.85063pt,keepaspectratio=true" xml:id="S0.F5.g1"/>
411-
<graphics candidates="../graphics/none.png" class="ltx_figure_panel" graphic="../graphics/none.png" options="width=113.85063pt,keepaspectratio=true" xml:id="S0.F5.g2"/>
410+
<graphics candidates="../graphics/none.png" class="ltx_figure_panel" graphic="../graphics/none.png" options="width=113.9pt,keepaspectratio=true" xml:id="S0.F5.g1"/>
411+
<graphics candidates="../graphics/none.png" class="ltx_figure_panel" graphic="../graphics/none.png" options="width=113.9pt,keepaspectratio=true" xml:id="S0.F5.g2"/>
412412
<break class="ltx_break"/>
413413
<p class="ltx_figure_panel">.</p>
414414
<toccaption><tag close=" ">5</tag>Caption</toccaption>
@@ -425,13 +425,13 @@
425425
<tag role="refnum">6</tag>
426426
<tag role="typerefnum">Figure 6</tag>
427427
</tags>
428-
<graphics candidates="../graphics/none.png" class="ltx_figure_panel" graphic="../graphics/none.png" options="width=113.85063pt,keepaspectratio=true" xml:id="S0.F6.g1"/>
429-
<graphics candidates="../graphics/none.png" class="ltx_figure_panel" graphic="../graphics/none.png" options="width=113.85063pt,keepaspectratio=true" xml:id="S0.F6.g2"/>
428+
<graphics candidates="../graphics/none.png" class="ltx_figure_panel" graphic="../graphics/none.png" options="width=113.9pt,keepaspectratio=true" xml:id="S0.F6.g1"/>
429+
<graphics candidates="../graphics/none.png" class="ltx_figure_panel" graphic="../graphics/none.png" options="width=113.9pt,keepaspectratio=true" xml:id="S0.F6.g2"/>
430430
<break/>
431431
<toccaption><tag close=" ">6</tag>mid-fig caption</toccaption>
432432
<caption><tag close=": "><text fontsize="90%">Figure 6</text></tag><text fontsize="90%">mid-fig caption</text></caption>
433-
<graphics candidates="../graphics/none.png" class="ltx_figure_panel" graphic="../graphics/none.png" options="width=113.85063pt,keepaspectratio=true" xml:id="S0.F6.g3"/>
434-
<graphics candidates="../graphics/none.png" class="ltx_figure_panel" graphic="../graphics/none.png" options="width=113.85063pt,keepaspectratio=true" xml:id="S0.F6.g4"/>
433+
<graphics candidates="../graphics/none.png" class="ltx_figure_panel" graphic="../graphics/none.png" options="width=113.9pt,keepaspectratio=true" xml:id="S0.F6.g3"/>
434+
<graphics candidates="../graphics/none.png" class="ltx_figure_panel" graphic="../graphics/none.png" options="width=113.9pt,keepaspectratio=true" xml:id="S0.F6.g4"/>
435435
</figure>
436436
<pagination role="newpage"/>
437437
<figure inlist="lof" xml:id="S0.F9">
@@ -442,13 +442,13 @@
442442
</tags>
443443
<toccaption><tag close=" ">7</tag>leading caption</toccaption>
444444
<caption><tag close=": "><text fontsize="90%">Figure 7</text></tag><text fontsize="90%">leading caption</text></caption>
445-
<graphics candidates="../graphics/none.png" class="ltx_figure_panel" graphic="../graphics/none.png" options="width=113.85063pt,keepaspectratio=true" xml:id="S0.F9.g1"/>
446-
<graphics candidates="../graphics/none.png" class="ltx_figure_panel" graphic="../graphics/none.png" options="width=113.85063pt,keepaspectratio=true" xml:id="S0.F9.g2"/>
445+
<graphics candidates="../graphics/none.png" class="ltx_figure_panel" graphic="../graphics/none.png" options="width=113.9pt,keepaspectratio=true" xml:id="S0.F9.g1"/>
446+
<graphics candidates="../graphics/none.png" class="ltx_figure_panel" graphic="../graphics/none.png" options="width=113.9pt,keepaspectratio=true" xml:id="S0.F9.g2"/>
447447
<break/>
448448
<toccaption><tag close=" ">8</tag>mid-fig caption</toccaption>
449449
<caption><tag close=": "><text fontsize="90%">Figure 8</text></tag><text fontsize="90%">mid-fig caption</text></caption>
450-
<graphics candidates="../graphics/none.png" class="ltx_figure_panel" graphic="../graphics/none.png" options="width=113.85063pt,keepaspectratio=true" xml:id="S0.F9.g3"/>
451-
<graphics candidates="../graphics/none.png" class="ltx_figure_panel" graphic="../graphics/none.png" options="width=113.85063pt,keepaspectratio=true" xml:id="S0.F9.g4"/>
450+
<graphics candidates="../graphics/none.png" class="ltx_figure_panel" graphic="../graphics/none.png" options="width=113.9pt,keepaspectratio=true" xml:id="S0.F9.g3"/>
451+
<graphics candidates="../graphics/none.png" class="ltx_figure_panel" graphic="../graphics/none.png" options="width=113.9pt,keepaspectratio=true" xml:id="S0.F9.g4"/>
452452
<toccaption><tag close=" ">9</tag>trailing caption</toccaption>
453453
<caption><tag close=": "><text fontsize="90%">Figure 9</text></tag><text fontsize="90%">trailing caption</text></caption>
454454
</figure>

t/graphics/calc.pdf

8.12 KB
Binary file not shown.

0 commit comments

Comments
 (0)