Skip to content

Commit

Permalink
Adopt a more consistent naming convention for latexml-specific contro…
Browse files Browse the repository at this point in the history
…l-sequences. (#2361)

They usually should start with \lx@, to avoid conflicts with external styles,
classes, formats, etc.

To assist in updating any user bindings, a warning is issued when the old names are used
(but the new name will be executed).
For reference (and tool building) The old and new names are listed here:
\@error \lx@ERROR
\@@Eqno \lx@eqno
\LTX@nonumber \lx@equation@nonumber
\normnal@par \lx@normal@par
\inner@par \lx@normal@par
\hidden@bgroup \lx@hidden@bgroup
\hidden@egroup \lx@hidden@egroup
\right@hidden@egroup \lx@hidden@egroup@right
\hidden@align \lx@hidden@align
\hidden@noalign \lx@hidden@noalign
\hidden@cr \lx@hidden@cr
\hidden@crcr \lx@hidden@crcr
\@start@alignment \lx@start@alignment
\@finish@alignment \lx@finish@alignment
\@close@alignment \lx@close@alignment
\if@in@alignment \if@in@lx@alignment
\@Alignment@hline \lx@alignment@hline
\@Alignment@newline \lx@alignment@newline
\@Alignment@newline@noskip \lx@alignment@newline@noskip
\@Alignment@newline@marker \lx@alignment@newline@marker
\@Alignment@newline@markertall \lx@alignment@newline@markertall
\@Alignment@column \lx@alignment@column
\@Alignment@ncolumns \lx@alignment@ncolumns
\@Alignment@bindings \lx@alignment@bindings
\@Row@before \lx@alignment@row@before
\@Row@after \lx@alignment@row@after
\@column@before \lx@alignment@column@before
\@column@after \lx@alignment@column@after
\@tabular@begin@heading \lx@alignment@begin@heading
\@tabular@end@heading \lx@alignment@end@heading
\@multicolumn \lx@alignment@multicolumn
\@dollar@in@normalmode \lx@dollar@in@normalmode
\@dollar@in@mathmode \lx@dollar@in@mathmode
\@dollar@in@textmode \lx@dollar@in@textmode
\math@underline \lx@math@underline
\text@underline \lx@text@underline
\math@overleftarrow \lx@math@overleftarrow
\math@overrightarrow \lx@math@overrightarrow
\@@BEGININLINEMATH \lx@begin@inline@math
\@@ENDINLINEMATH \lx@end@inline@math
\@@BEGINDISPLAYMATH \lx@begin@display@math
\@@ENDDISPLAYMATH \lx@end@display@math
\@@BEGININLINETEXT \lx@begin@inmath@text
\@@ENDINLINETEXT \lx@end@inmath@text
\@@FLOATINGSUBSCRIPT \lx@floating@subscript
\@@FLOATINGSUPERSCRIPT \lx@floating@superscript
\@@POSTSUBSCRIPT \lx@post@subscript
\@@POSTSUPERSCRIPT \lx@post@superscript
\@Assert@MEANING \lx@assert@meaning
  • Loading branch information
brucemiller authored Apr 30, 2024
1 parent 3b753cf commit f75b0c6
Show file tree
Hide file tree
Showing 43 changed files with 616 additions and 500 deletions.
14 changes: 7 additions & 7 deletions lib/LaTeXML/Core/Alignment.pm
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,8 @@ use LaTeXML::Common::XML;
use LaTeXML::Common::Dimension;
use LaTeXML::Core::Alignment::Template;
use List::Util qw(max sum);
use base qw(LaTeXML::Core::Whatsit);
use base qw(Exporter);
use base qw(LaTeXML::Core::Whatsit);
use base qw(Exporter);
our @EXPORT = (qw(
&ReadAlignmentTemplate &MatrixTemplate));

Expand All @@ -36,7 +36,7 @@ our @EXPORT = (qw(
#
# An Alignment object is a sort of fake Whatsit;
# It takes some magic to sneak it into the Digestion stream
# (see TeX.pool \@start@alignment), but it needs to be created
# (see TeX.pool \lx@begin@alignment), but it needs to be created
# BEFORE the contents of the alignment are digested,
# since we stuff a lot of information into it
# (row, column boxes, borders, spacing, etc...)
Expand Down Expand Up @@ -196,15 +196,15 @@ sub getColumnBefore {
my ($self) = @_;
my $column;
if (($column = $self->currentColumn) && !$$column{omitted}) {
return Tokens(T_CS('\@column@before'), @{ $$column{before} }); }
return Tokens(T_CS('\lx@alignment@column@before'), @{ $$column{before} }); }
else {
return Tokens(); } }

sub getColumnAfter {
my ($self) = @_;
my $column;
if (($column = $self->currentColumn) && !$$column{omitted}) {
return Tokens(@{ $$column{after} }, T_CS('\@column@after')); }
return Tokens(@{ $$column{after} }, T_CS('\lx@alignment@column@after')); }
else {
return Tokens(); } }

Expand All @@ -219,7 +219,7 @@ sub startRow {
if ($pseudorow) {
$self->currentRow->{pseudorow} = 1; }
else {
push(@LaTeXML::LIST, $stomach->digest(T_CS('\@row@before'))); }
push(@LaTeXML::LIST, $stomach->digest(T_CS('\lx@alignment@row@before'))); }
$$self{in_row} = 1;
$STATE->assignValue(alignmentStartColumn => 0); # ???
return; }
Expand All @@ -229,7 +229,7 @@ sub endRow {
return unless $$self{in_row};
$self->endColumn() if $$self{in_column};
$STATE->getStomach->egroup; # Grouping around ROW!
# Digest(T_CS('\@row@after'));
# Digest(T_CS('\lx@alignment@row@after'));
$$self{in_row} = undef;
return; }

Expand Down
18 changes: 9 additions & 9 deletions lib/LaTeXML/Core/Gullet.pm
Original file line number Diff line number Diff line change
Expand Up @@ -225,14 +225,14 @@ sub handleTemplate {
local $LaTeXML::CURRENT_TOKEN = $token;
my $post = $alignment->getColumnAfter;
$LaTeXML::ALIGN_STATE = 1000000;
### NOTE: Truly fishy smuggling w/ \hidden@cr
### NOTE: Truly fishy smuggling w/ \lx@hidden@cr
my $arg;
if (($type eq 'cr') && $hidden) { # \hidden@cr gets an argument as payload!!!!!
if (($type eq 'cr') && $hidden) { # \lx@hidden@cr gets an argument as payload!!!!!
$arg = readArg($self); }
Debug("Halign $alignment: column after " . ToString($post)) if $LaTeXML::DEBUG{halign};
if ((($type eq 'cr') || ($type eq 'crcr'))
&& $$alignment{in_row} && !$alignment->currentRow->{pseudorow}) {
unshift(@{ $$self{pushback} }, T_CS('\@row@after')); }
unshift(@{ $$self{pushback} }, T_CS('\lx@alignment@row@after')); }
if ($arg) {
unshift(@{ $$self{pushback} }, T_BEGIN, $arg->unlist, T_END); }
unshift(@{ $$self{pushback} }, $token);
Expand All @@ -241,12 +241,12 @@ sub handleTemplate {

# If it is a column ending token, Returns the token, a keyword and whether it is "hidden"
our @column_ends = ( # besides T_ALIGN
[T_CS('\cr'), 'cr', 0],
[T_CS('\crcr'), 'crcr', 0],
[T_CS('\hidden@cr'), 'cr', 1],
[T_CS('\hidden@crcr'), 'crcr', 1],
[T_CS('\hidden@align'), 'insert', 1],
[T_CS('\span'), 'span', 0]);
[T_CS('\cr'), 'cr', 0],
[T_CS('\crcr'), 'crcr', 0],
[T_CS('\lx@hidden@cr'), 'cr', 1],
[T_CS('\lx@hidden@crcr'), 'crcr', 1],
[T_CS('\lx@hidden@align'), 'insert', 1],
[T_CS('\span'), 'span', 0]);

sub isColumnEnd {
my ($self, $token) = @_;
Expand Down
4 changes: 2 additions & 2 deletions lib/LaTeXML/Core/Stomach.pm
Original file line number Diff line number Diff line change
Expand Up @@ -98,8 +98,8 @@ sub digestNextBody {

while (defined($token = $$self{gullet}->getPendingComment || $$self{gullet}->readXToken(1))) {
if ($alignment && scalar(@LaTeXML::LIST) && (Equals($token, T_ALIGN) ||
Equals($token, T_CS('\cr')) || Equals($token, T_CS('\hidden@cr')) ||
Equals($token, T_CS('\hidden@crcr')))) {
Equals($token, T_CS('\cr')) || Equals($token, T_CS('\lx@hidden@cr')) ||
Equals($token, T_CS('\lx@hidden@crcr')))) {
# at least \over calls in here without the intent to passing through the alignment.
# So if we already have some digested boxes available, return them here.
$$self{gullet}->unread($token);
Expand Down
110 changes: 110 additions & 0 deletions lib/LaTeXML/Engine/Base_Deprecated.pool.ltxml
Original file line number Diff line number Diff line change
Expand Up @@ -33,11 +33,121 @@ DefMacro('\lx@DEPRECATE{}{}', \&Deprecate);
DefMacro('\@ERROR',
'\lx@DEPRECATE{\@ERROR}{\lx@ERROR}\lx@ERROR');

DefMacro('\@@eqno',
'\lx@DEPRECATE{\@@eqno}{\lx@eqno}\lx@eqno');

DefMacro('\LTX@nonumber',
'\lx@DEPRECATE{\LTX@nonumber}{\lx@equation@nonumber}\lx@equation@nonumber');

DefMacro('\normal@par',
'\lx@DEPRECATE{\normnal@par}{\lx@normal@par}\lx@normal@par');
DefMacro('\inner@par',
'\lx@DEPRECATE{\inner@par}{\lx@normal@par}\lx@normal@par'); # Obsolete, but in case still used...

DefMacro('\hidden@bgroup',
'\lx@DEPRECATE{\hidden@bgroup}{\lx@hidden@bgroup}\lx@hidden@bgroup');
DefMacro('\hidden@egroup',
'\lx@DEPRECATE{\hidden@egroup}{\lx@hidden@egroup}\lx@hidden@egroup');
DefMacro('\right@hidden@egroup',
'\lx@DEPRECATE{\right@hidden@egroup}{\lx@hidden@egroup@right}\lx@hidden@egroup@right');

DefMacro('\hidden@align',
'\lx@DEPRECATE{\hidden@align}{\lx@hidden@align}\lx@hidden@align');
DefMacro('\hidden@noalign',
'\lx@DEPRECATE{\hidden@noalign}{\lx@hidden@noalign}\lx@hidden@noalign');
DefMacro('\hidden@cr',
'\lx@DEPRECATE{\hidden@cr}{\lx@hidden@cr}\lx@hidden@cr');
DefMacro('\hidden@crc',
'\lx@DEPRECATE{\hidden@crcr}{\lx@hidden@crcr}\lx@hidden@crcr');

DefMacro('\@start@alignment',
'\lx@DEPRECATE{\@start@alignment}{\lx@start@alignment}\lx@start@alignment');
DefMacro('\@finish@alignment',
'\lx@DEPRECATE{\@finish@alignment}{\lx@finish@alignment}\lx@finish@alignment');
DefMacro('\@close@alignment',
'\lx@DEPRECATE{\@close@alignment}{\lx@close@alignment}\lx@close@alignment');
DefMacro('\if@in@alignment',
'\lx@DEPRECATE{\if@in@alignment}{\if@in@lx@alignment}\if@in@lx@alignment ');

DefMacro('\@alignment@hline',
'\lx@DEPRECATE{\@alignment@hline}{\lx@alignment@hline}\lx@alignment@hline');
DefMacro('\@alignment@newline',
'\lx@DEPRECATE{\@alignment@newline}{\lx@alignment@newline}\lx@alignment@newline');
DefMacro('\@alignment@newline@noskip',
'\lx@DEPRECATE{\@alignment@newline@noskip}{\lx@alignment@newline@noskip}\lx@alignment@newline@noskip');
DefMacro('\@alignment@newline@marker',
'\lx@DEPRECATE{\@alignment@newline@marker}{\lx@alignment@newline@marker}\lx@alignment@newline@marker');
DefMacro('\@alignment@newline@markertall',
'\lx@DEPRECATE{\@alignment@newline@markertall}{\lx@alignment@newline@markertall}\lx@alignment@newline@markertall');
DefMacro('\@alignment@column',
'\lx@DEPRECATE{\@alignment@column}{\lx@alignment@column}\lx@alignment@column');
DefMacro('\@alignment@ncolumns',
'\lx@DEPRECATE{\@alignment@ncolumns}{\lx@alignment@ncolumns}\lx@alignment@ncolumns');
DefMacro('\@alignment@bindings',
'\lx@DEPRECATE{\@alignment@bindings}{\lx@alignment@bindings}\lx@alignment@bindings');

DefMacro('\@row@before',
'\lx@DEPRECATE{\@row@before}{\lx@alignment@row@before}\lx@alignment@row@before');
DefMacro('\@row@after',
'\lx@DEPRECATE{\@row@after}{\lx@alignment@row@after}\lx@alignment@row@after');
DefMacro('\@column@before',
'\lx@DEPRECATE{\@column@before}{\lx@alignment@column@before}\lx@alignment@column@before');
DefMacro('\@column@after',
'\lx@DEPRECATE{\@column@after}{\lx@alignment@column@after}\lx@alignment@column@after');

DefMacro('\@tabular@begin@heading',
'\lx@DEPRECATE{\@tabular@begin@heading}{\lx@alignment@begin@heading}\lx@alignment@begin@heading');
DefMacro('\@tabular@end@heading',
'\lx@DEPRECATE{\@tabular@end@heading}{\lx@alignment@end@heading}\lx@alignment@end@heading');

DefMacro('\@multicolumn',
'\lx@DEPRECATE{\@multicolumn}{\lx@alignment@multicolumn}\lx@alignment@multicolumn');

DefMacro('\@dollar@in@normalmode',
'\lx@DEPRECATE{\@dollar@in@normalmode}{\lx@dollar@in@normalmode}\lx@dollar@in@normalmode');
DefMacro('\@dollar@in@mathmode',
'\lx@DEPRECATE{\@dollar@in@mathmode}{\lx@dollar@in@mathmode}\lx@dollar@in@mathmode');
DefMacro('\@dollar@in@textmode',
'\lx@DEPRECATE{\@dollar@in@textmode}{\lx@dollar@in@textmode}\lx@dollar@in@tecxtmode');

DefMacro('\math@underline',
'\lx@DEPRECATE{\math@underline}{\lx@math@underline}\lx@math@underline');
DefMacro('\text@underline',
'\lx@DEPRECATE{\text@underline}{\lx@text@underline}\lx@text@underline');
DefMacro('\math@overleftarrow',
'\lx@DEPRECATE{\math@overleftarrow}{\lx@math@overleftarrow}\lx@math@overleftarrow');
DefMacro('\math@overrightarrow',
'\lx@DEPRECATE{\math@overrightarrow}{\lx@math@overrightarrow}\lx@math@overrightarrow');

DefMacro('\@@BEGININLINEMATH',
'\lx@DEPRECATE{\@@BEGININLINEMATH}{\lx@begin@inline@math}\lx@begin@inlineh@math');
DefMacro('\@@ENDINLINEMATH',
'\lx@DEPRECATE{\@@ENDINLINEMATH}{\lx@end@inline@math}\lx@end@inline@math');
DefMacro('\@@BEGINDISPLAYMATH',
'\lx@DEPRECATE{\@@BEGINDISPLAYMATH}{\lx@begin@display@math}\lx@begin@display@math');
DefMacro('\@@ENDDISPLAYMATH',
'\lx@DEPRECATE{\@@ENDDISPLAYMATH}{\lx@end@display@math}\lx@end@display@math');

DefMacro('\@@BEGININLINETEXT',
'\lx@DEPRECATE{\@@BEGININLINETEXT}{\lx@begin@inmath@text}\lx@begin@inmath@text');
DefMacro('\@@ENDINLINETEXT',
'\lx@DEPRECATE{\@@ENDINLINETEXT}{\lx@end@inmath@text}\lx@end@inmath@text');

DefMacro('\@@FLOATINGSUBSCRIPT',
'\lx@DEPRECATE{\@@FLOATINGSUBSCRIPT}{\lx@floating@subscript}\lx@floating@subscript');
DefMacro('\@@FLOATINGSUPERSCRIPT',
'\lx@DEPRECATE{\@@FLOATINGSUPERSCRIPT}{\lx@floating@superscript}\lx@floating@superscript');
DefMacro('\@@POSTSUBSCRIPT',
'\lx@DEPRECATE{\@@POSTSUBSCRIPT}{\lx@post@subscript}\lx@post@subscript');
DefMacro('\@@POSTSUPERSCRIPT',
'\lx@DEPRECATE{\@@POSTSUPERSCRIPT}{\lx@post@superscript}\lx@post@superscript');

DefMacro('\@ASSERT@MEANING',
'\lx@DEPRECATE{\@ASSERT@MEANING}{\lx@assert@meaning}\lx@assert@meaning');

#======================================================================
# Older deprecations
# (but there was no warning mechanism then)
#----------------------------------------------------------------------
# This group should be renamed to \lx@somethings and deprecated
# NOTE: work through this systematically!
Expand Down
11 changes: 5 additions & 6 deletions lib/LaTeXML/Engine/Base_Schema.pool.ltxml
Original file line number Diff line number Diff line change
Expand Up @@ -40,20 +40,19 @@ Tag('ltx:document', afterOpen => sub {
if ($bg ne 'white') {
$document->setAttribute($root, backgroundcolor => $bg); } } } });
#======================================================================

DefMacroI("\\\@empty", undef, Tokens());

#======================================================================
# Core ID functionality.
#======================================================================

DefMacroI('\lx@empty', undef, Tokens());

# DOCUMENTID is the ID of the document
# AND prefixes IDs on all other elements.
if (my $docid = LookupValue('DOCUMENTID')) {
# Wrap in T_OTHER so funny chars don't screw up (no space!)
DefMacroI('\thedocument@ID', undef, T_OTHER($docid)); }
else {
Let('\thedocument@ID', '\@empty'); }
NewCounter('@XMARG', 'document', idprefix => 'XM');
Let('\thedocument@ID', '\lx@empty'); }
NewCounter('@lx@xmarg', 'document', idprefix => 'XM');

#======================================================================

Expand Down
6 changes: 3 additions & 3 deletions lib/LaTeXML/Engine/Base_Utility.pool.ltxml
Original file line number Diff line number Diff line change
Expand Up @@ -16,11 +16,11 @@ use warnings;
use LaTeXML::Package;

#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
#**********************************************************************
# LaTeX has a very particular notion of "Undefined",
#======================================================================
# LaTeX has a very particular, but useful, notion of "Undefined",
# so let's get that squared away at the outset; it's useful for TeX, too!
# Naturally, it uses \csname to check, which ends up DEFINING the possibly undefined macro as \relax
DefMacro('\@ifundefined{}{}{}', sub {
DefMacro('\lx@ifundefined{}{}{}', sub {
my ($gullet, $name, $if, $else) = @_;
my $cs = T_CS('\\' . ToString(Expand($name)));
if (IsDefined($cs)) {
Expand Down
29 changes: 15 additions & 14 deletions lib/LaTeXML/Engine/Base_XMath.pool.ltxml
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,8 @@ use LaTeXML::Package;
#
# The following constructor (see how it's used in DefMath), adds meaning attributes
# whereever it seems sensible on the presentation branch, after it has been generated.
DefConstructor('\@ASSERT@MEANING{}{}', '#2',
# This appears to be obsolete/no-longer-used, but keep for future reference.
DefConstructor('\lx@assert@meaning{}{}', '#2',
reversion => '#2',
afterConstruct => sub {
my ($document, $whatsit) = @_;
Expand Down Expand Up @@ -577,18 +578,18 @@ DefPrimitive('\lx@gen@matrix@bindings RequiredKeyVals:lx@GEN', sub {
: (repeated => [{@colspec}]))),
'math',
(keys %attributes ? (attributes => {%attributes}) : ())); # });
Let("\\\\", '\@alignment@newline');
Let('\lx@intercol', '\lx@math@intercol');
Let('\@row@before', '\@empty'); # Disable special row treatment (eg. numbering) unless requested
Let('\@row@after', '\@empty');
Let("\\\\", '\lx@alignment@newline');
Let('\lx@intercol', '\lx@math@intercol');
Let('\lx@alignment@row@before', '\lx@empty'); # Disable special row treatment (eg. numbering) unless requested
Let('\lx@alignment@row@after', '\lx@empty');
});

DefPrimitive('\lx@end@gen@matrix', sub { $_[0]->egroup; });

DefMacro('\lx@gen@plain@matrix{}{}',
'\lx@gen@matrix@bindings{#1}'
. '\lx@gen@plain@matrix@{#1}{\@start@alignment#2\@finish@alignment}'
# . '\lx@gen@plain@matrix@{#1}{\@start@alignment#2\cr\@finish@alignment}'
. '\lx@gen@plain@matrix@{#1}{\lx@begin@alignment#2\lx@end@alignment}'
# . '\lx@gen@plain@matrix@{#1}{\lx@begin@alignment#2\cr\lx@end@alignment}'
. '\lx@end@gen@matrix');

# The delimiters on a matrix are presumably just for notation or readability (not an operator);
Expand Down Expand Up @@ -659,15 +660,15 @@ DefPrimitive('\lx@gen@cases@bindings RequiredKeyVals:lx@GEN', sub {
($condtext ? (T_CS('\lx@cases@end@condition')) : ()),
T_CS('\hfil')) }]),
'math');
Let("\\\\", '\@alignment@newline');
Let("\\\\", '\lx@alignment@newline');
Let('\lx@intercol', '\lx@math@intercol');
DefMacro('\@row@before', ''); # Don't inherit counter stepping from containing environments
DefMacro('\@row@after', '');
DefMacro('\lx@alignment@row@before', ''); # Don't inherit counter stepping from containing environments
DefMacro('\lx@alignment@row@after', '');
});

DefMacro('\lx@gen@plain@cases{}{}',
'\lx@gen@cases@bindings{#1}'
. '\lx@gen@plain@cases@{#1}{\@start@alignment#2\@finish@alignment}'
. '\lx@gen@plain@cases@{#1}{\lx@begin@alignment#2\lx@end@alignment}'
. '\lx@end@gen@cases');
DefPrimitive('\lx@end@gen@cases', sub { $_[0]->egroup; });

Expand Down Expand Up @@ -754,7 +755,7 @@ sub closeMathFork {
# that is synthesized from other math content within a ltx:MathFork.
sub MathWhatsit {
my (@items) = @_;
my $hbgd = LookupDefinition(T_CS('\@hidden@bgroup'));
my $hbgd = LookupDefinition(T_CS('\lx@hidden@bgroup'));
@items = map { ((ref $_ eq 'LaTeXML::Core::Whatsit') && ($_->getDefinition eq $hbgd)
? $_->getBody->unlist : ($_)) }
map { $_->unlist } grep { $_ } @items;
Expand All @@ -765,9 +766,9 @@ sub MathWhatsit {
my @styles = grep { UnTeX($_) eq '\displaystyle' } @items;
if (@styles) {
@items = ($styles[0], grep { UnTeX($_) ne '\displaystyle' } @items); }
return LaTeXML::Core::Whatsit->new(LookupDefinition(T_CS('\@@BEGININLINEMATH')), [],
return LaTeXML::Core::Whatsit->new(LookupDefinition(T_CS('\lx@begin@inline@math')), [],
body => List(@items, mode => 'math'),
trailer => T_CS('\@@ENDINLINEMATH'),
trailer => T_CS('\\lx@end@inline@math'),
locator => $locator, isMath => 1); }

#======================================================================
Expand Down
2 changes: 1 addition & 1 deletion lib/LaTeXML/Engine/BibTeX.pool.ltxml
Original file line number Diff line number Diff line change
Expand Up @@ -170,7 +170,7 @@ DefPrimitive('\bibentry@create Semiverbatim', sub {
# Processing Entries
#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
# Math ID's within the bibliography.
DefMacro('\the@XMARG@ID', '\the@lx@bibliography@ID.XM\arabic{@XMARG}');
DefMacro('\the@lx@xmarg@ID', '\the@lx@bibliography@ID.XM\arabic{@lx@xmarg}');

DefEnvironment('{bibtex@bibliography}',
"<ltx:bibliography xml:id='#id' "
Expand Down
Loading

0 comments on commit f75b0c6

Please sign in to comment.