LatexParser constructor

LatexParser(
  1. String input, {
  2. ParseOptions options = const ParseOptions(),
  3. MacroTable? macros,
})

Creates a parser for input. Pass a shared macros table to keep \gdef / \newcommand definitions across formulas.

Implementation

LatexParser(
  String input, {
  this.options = const ParseOptions(),
  MacroTable? macros,
}) : source = SourceText(input),
     _sharedMacros = macros,
     _macros = macros ?? MacroTable(builtinMacros) {
  _macros.extensions = extensionMacros(
    options.extensions,
    physics: options.physics,
  );
  _macros.fallbacks = _fallbacks;
  final label = options.captionLabel;
  if (label != null) {
    // Numbered captions: each \caption takes the next number.
    var number = 0;
    _macros.set(
      r'\caption',
      FunctionMacro((e, call) {
        e.readOptionalArgument();
        final text = e.readArgument();
        number++;
        return [
          ...Lexer('\\\\\\text{$label $number: ').tokenize()
            ..removeWhere((t) => t.isEof),
          ...text.tokens,
          ...Lexer('}\\\\').tokenize()..removeWhere((t) => t.isEof),
        ];
      }),
    );
  }
  options.macros.forEach((name, body) {
    _macros.set(name, TokenMacro.parse(body));
  });
  _doubled = _looksDoubled(source.text);
  _x = MacroExpander(
    Lexer(
      source.text,
      paragraphs: true,
      undoubleBackslashes: _doubled != null,
    ),
    _macros,
    maxExpand: options.maxExpand,
    maxTokens: options.maxTokens,
    report: _report,
    isDefined: _isDefined,
    overBudget: options.timeBudget == null
        ? null
        : () => _clock.elapsed > options.timeBudget!,
  );
}