summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--FILES.byname1318
-rw-r--r--FILES.byname.gzbin2523084 -> 2523268 bytes
-rw-r--r--FILES.last07days856
-rw-r--r--biblio/ctan-bibdata/ctan.bib16
-rw-r--r--biblio/ctan-bibdata/ctan.pdfbin3663579 -> 3663764 bytes
-rw-r--r--macros/latex/contrib/photobook/photobook.cls85
-rw-r--r--macros/latex/contrib/photobook/photobook.pdfbin143035 -> 142873 bytes
-rw-r--r--macros/luatex/latex/piton/piton-french.pdf1370
-rw-r--r--macros/luatex/latex/piton/piton-french.tex3483
-rw-r--r--macros/luatex/latex/piton/piton.dtx10335
-rw-r--r--macros/luatex/latex/piton/piton.pdf6081
-rw-r--r--support/latexindent/LatexIndent/Document.pm8
-rw-r--r--support/latexindent/LatexIndent/FileExtension.pm13
-rw-r--r--support/latexindent/LatexIndent/LogFile.pm9
-rw-r--r--support/latexindent/LatexIndent/Version.pm4
-rw-r--r--support/latexindent/README2
-rw-r--r--support/latexindent/bin/linux/latexindentbin6163996 -> 6164028 bytes
-rw-r--r--support/latexindent/bin/macos/latexindentbin6393199 -> 6393230 bytes
-rw-r--r--support/latexindent/defaultSettings.yaml2
-rw-r--r--support/latexindent/documentation/latexindent-yaml-schema.json2
-rw-r--r--support/latexindent/documentation/latexindent.pdfbin1243960 -> 1244704 bytes
-rwxr-xr-xsupport/latexindent/latexindent.pl2
-rw-r--r--support/texlab/CHANGELOG.md7
-rw-r--r--support/texlab/Cargo.lock755
-rw-r--r--support/texlab/Cargo.toml87
-rw-r--r--support/texlab/benches/bench_main.rs25
-rw-r--r--support/texlab/crates/base-db/Cargo.toml25
-rw-r--r--support/texlab/crates/base-db/src/config.rs (renamed from support/texlab/src/config.rs)105
-rw-r--r--support/texlab/crates/base-db/src/diagnostics.rs25
-rw-r--r--support/texlab/crates/base-db/src/diagnostics/bib.rs69
-rw-r--r--support/texlab/crates/base-db/src/diagnostics/log.rs68
-rw-r--r--support/texlab/crates/base-db/src/diagnostics/tex.rs116
-rw-r--r--support/texlab/crates/base-db/src/document.rs196
-rw-r--r--support/texlab/crates/base-db/src/graph.rs161
-rw-r--r--support/texlab/crates/base-db/src/lib.rs9
-rw-r--r--support/texlab/crates/base-db/src/line_index.rs (renamed from support/texlab/src/util/line_index.rs)0
-rw-r--r--support/texlab/crates/base-db/src/semantics.rs17
-rw-r--r--support/texlab/crates/base-db/src/semantics/auxiliary.rs39
-rw-r--r--support/texlab/crates/base-db/src/semantics/tex.rs292
-rw-r--r--support/texlab/crates/base-db/src/workspace.rs302
-rw-r--r--support/texlab/crates/citeproc/Cargo.toml26
-rw-r--r--support/texlab/crates/citeproc/src/driver.rs (renamed from support/texlab/src/citation/driver.rs)5
-rw-r--r--support/texlab/crates/citeproc/src/entry.rs (renamed from support/texlab/src/citation/entry.rs)58
-rw-r--r--support/texlab/crates/citeproc/src/field.rs (renamed from support/texlab/src/citation/field.rs)0
-rw-r--r--support/texlab/crates/citeproc/src/field/author.rs (renamed from support/texlab/src/citation/field/author.rs)24
-rw-r--r--support/texlab/crates/citeproc/src/field/date.rs (renamed from support/texlab/src/citation/field/date.rs)16
-rw-r--r--support/texlab/crates/citeproc/src/field/number.rs (renamed from support/texlab/src/citation/field/number.rs)20
-rw-r--r--support/texlab/crates/citeproc/src/field/text.rs (renamed from support/texlab/src/citation/field/text.rs)59
-rw-r--r--support/texlab/crates/citeproc/src/lib.rs (renamed from support/texlab/src/citation.rs)5
-rw-r--r--support/texlab/crates/citeproc/src/output.rs (renamed from support/texlab/src/citation/output.rs)0
-rw-r--r--support/texlab/crates/citeproc/src/snapshots/citeproc__tests__article_aksin_2006.snap (renamed from support/texlab/src/citation/snapshots/texlab__citation__tests__article_aksin_2006.snap)3
-rw-r--r--support/texlab/crates/citeproc/src/snapshots/citeproc__tests__article_betram_1996.snap (renamed from support/texlab/src/citation/snapshots/texlab__citation__tests__article_betram_1996.snap)3
-rw-r--r--support/texlab/crates/citeproc/src/snapshots/citeproc__tests__article_blom_2021.snap (renamed from support/texlab/src/citation/snapshots/texlab__citation__tests__article_blom_2021.snap)3
-rw-r--r--support/texlab/crates/citeproc/src/snapshots/citeproc__tests__article_jain_1999.snap (renamed from support/texlab/src/citation/snapshots/texlab__citation__tests__article_jain_1999.snap)3
-rw-r--r--support/texlab/crates/citeproc/src/snapshots/citeproc__tests__article_kastenholz_2006.snap (renamed from support/texlab/src/citation/snapshots/texlab__citation__tests__article_kastenholz_2006.snap)3
-rw-r--r--support/texlab/crates/citeproc/src/snapshots/citeproc__tests__article_rivest_1978.snap (renamed from support/texlab/src/citation/snapshots/texlab__citation__tests__article_rivest_1978.snap)3
-rw-r--r--support/texlab/crates/citeproc/src/snapshots/citeproc__tests__book_aho_2006.snap (renamed from support/texlab/src/citation/snapshots/texlab__citation__tests__book_aho_2006.snap)3
-rw-r--r--support/texlab/crates/citeproc/src/snapshots/citeproc__tests__book_averroes_1998.snap (renamed from support/texlab/src/citation/snapshots/texlab__citation__tests__book_averroes_1998.snap)3
-rw-r--r--support/texlab/crates/citeproc/src/snapshots/citeproc__tests__book_knuth_1984.snap (renamed from support/texlab/src/citation/snapshots/texlab__citation__tests__book_knuth_1984.snap)3
-rw-r--r--support/texlab/crates/citeproc/src/snapshots/citeproc__tests__collection_matuz_1990.snap (renamed from support/texlab/src/citation/snapshots/texlab__citation__tests__collection_matuz_1990.snap)3
-rw-r--r--support/texlab/crates/citeproc/src/snapshots/citeproc__tests__inproceedings_combi_2004.snap (renamed from support/texlab/src/citation/snapshots/texlab__citation__tests__inproceedings_combi_2004.snap)3
-rw-r--r--support/texlab/crates/citeproc/src/snapshots/citeproc__tests__inproceedings_erwin_2007.snap (renamed from support/texlab/src/citation/snapshots/texlab__citation__tests__inproceedings_erwin_2007.snap)3
-rw-r--r--support/texlab/crates/citeproc/src/snapshots/citeproc__tests__mvbook_nietzsche_1988.snap (renamed from support/texlab/src/citation/snapshots/texlab__citation__tests__mvbook_nietzsche_1988.snap)3
-rw-r--r--support/texlab/crates/citeproc/src/snapshots/citeproc__tests__patent_almendro_1998.snap (renamed from support/texlab/src/citation/snapshots/texlab__citation__tests__patent_almendro_1998.snap)3
-rw-r--r--support/texlab/crates/citeproc/src/tests.rs (renamed from support/texlab/src/citation/tests.rs)4
-rw-r--r--support/texlab/crates/distro/Cargo.toml14
-rw-r--r--support/texlab/crates/distro/src/file_name_db.rs (renamed from support/texlab/src/distro/file_name_db.rs)2
-rw-r--r--support/texlab/crates/distro/src/kpsewhich.rs (renamed from support/texlab/src/distro/kpsewhich.rs)0
-rw-r--r--support/texlab/crates/distro/src/language.rs42
-rw-r--r--support/texlab/crates/distro/src/lib.rs (renamed from support/texlab/src/distro.rs)3
-rw-r--r--support/texlab/crates/distro/src/miktex.rs (renamed from support/texlab/src/distro/miktex.rs)0
-rw-r--r--support/texlab/crates/distro/src/texlive.rs (renamed from support/texlab/src/distro/texlive.rs)0
-rw-r--r--support/texlab/crates/parser/Cargo.toml20
-rw-r--r--support/texlab/crates/parser/src/bibtex.rs (renamed from support/texlab/src/parser/bibtex.rs)14
-rw-r--r--support/texlab/crates/parser/src/build_log.rs (renamed from support/texlab/src/parser/build_log.rs)3
-rw-r--r--support/texlab/crates/parser/src/latex.rs (renamed from support/texlab/src/parser/latex.rs)9
-rw-r--r--support/texlab/crates/parser/src/latex/lexer.rs (renamed from support/texlab/src/parser/latex/lexer.rs)5
-rw-r--r--support/texlab/crates/parser/src/latex/lexer/commands.rs (renamed from support/texlab/src/parser/latex/lexer/commands.rs)0
-rw-r--r--support/texlab/crates/parser/src/latex/lexer/types.rs (renamed from support/texlab/src/parser/latex/lexer/types.rs)1
-rw-r--r--support/texlab/crates/parser/src/lib.rs (renamed from support/texlab/src/parser.rs)0
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@comment.txt.snap (renamed from support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@comment.txt.snap)4
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@issue_809.txt.snap (renamed from support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@issue_809.txt.snap)3
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@preamble.txt.snap (renamed from support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@preamble.txt.snap)4
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@samples__aho_2006.txt.snap (renamed from support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@samples__aho_2006.txt.snap)4
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@samples__aksin_2006.txt.snap (renamed from support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@samples__aksin_2006.txt.snap)4
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@samples__almendro_1998.txt.snap (renamed from support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@samples__almendro_1998.txt.snap)4
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@samples__averroes_1998.txt.snap (renamed from support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@samples__averroes_1998.txt.snap)4
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@samples__betram_1996.txt.snap (renamed from support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@samples__betram_1996.txt.snap)4
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@samples__blom_2021.txt.snap (renamed from support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@samples__blom_2021.txt.snap)4
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@samples__combi_2004.txt.snap (renamed from support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@samples__combi_2004.txt.snap)4
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@samples__erwin_2007.txt.snap (renamed from support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@samples__erwin_2007.txt.snap)4
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@samples__jain_1999.txt.snap (renamed from support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@samples__jain_1999.txt.snap)4
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@samples__kastenholz_2006.txt.snap (renamed from support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@samples__kastenholz_2006.txt.snap)4
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@samples__knuth_1984.txt.snap (renamed from support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@samples__knuth_1984.txt.snap)4
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@samples__matuz_1990.txt.snap (renamed from support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@samples__matuz_1990.txt.snap)4
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@samples__nietzsche_1998.txt.snap (renamed from support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@samples__nietzsche_1998.txt.snap)4
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@samples__rivest_1978.txt.snap (renamed from support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@samples__rivest_1978.txt.snap)4
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__build_log__tests__parse@001.txt.snap (renamed from support/texlab/src/parser/snapshots/texlab__parser__build_log__tests__parse@001.txt.snap)4
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__build_log__tests__parse@002.txt.snap (renamed from support/texlab/src/parser/snapshots/texlab__parser__build_log__tests__parse@002.txt.snap)4
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__build_log__tests__parse@003.txt.snap (renamed from support/texlab/src/parser/snapshots/texlab__parser__build_log__tests__parse@003.txt.snap)4
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__build_log__tests__parse@004.txt.snap (renamed from support/texlab/src/parser/snapshots/texlab__parser__build_log__tests__parse@004.txt.snap)4
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__build_log__tests__parse@005.txt.snap (renamed from support/texlab/src/parser/snapshots/texlab__parser__build_log__tests__parse@005.txt.snap)4
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__build_log__tests__parse@006.txt.snap (renamed from support/texlab/src/parser/snapshots/texlab__parser__build_log__tests__parse@006.txt.snap)4
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__build_log__tests__parse@007.txt.snap (renamed from support/texlab/src/parser/snapshots/texlab__parser__build_log__tests__parse@007.txt.snap)3
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@block_comments.txt.snap (renamed from support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@block_comments.txt.snap)4
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@caption__caption_default.txt.snap (renamed from support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@caption__caption_default.txt.snap)4
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@caption__caption_default_error.txt.snap (renamed from support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@caption__caption_default_error.txt.snap)4
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@caption__caption_figure.txt.snap (renamed from support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@caption__caption_figure.txt.snap)4
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@caption__caption_minimal.txt.snap (renamed from support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@caption__caption_minimal.txt.snap)4
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@caption__caption_minimal_error.txt.snap (renamed from support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@caption__caption_minimal_error.txt.snap)4
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@citation__citation_empty.txt.snap (renamed from support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@citation__citation_empty.txt.snap)4
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@citation__citation_missing_brace.txt.snap (renamed from support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@citation__citation_missing_brace.txt.snap)4
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@citation__citation_multiple_keys.txt.snap (renamed from support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@citation__citation_multiple_keys.txt.snap)4
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@citation__citation_prenote.txt.snap (renamed from support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@citation__citation_prenote.txt.snap)4
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@citation__citation_prenote_postnote.txt.snap (renamed from support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@citation__citation_prenote_postnote.txt.snap)4
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@citation__citation_redundant_comma.txt.snap (renamed from support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@citation__citation_redundant_comma.txt.snap)4
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@citation__citation_simple.txt.snap (renamed from support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@citation__citation_simple.txt.snap)4
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@citation__citation_star.txt.snap (renamed from support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@citation__citation_star.txt.snap)4
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@color__color_definition_simple.txt.snap (renamed from support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@color__color_definition_simple.txt.snap)4
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@color__color_reference_simple.txt.snap (renamed from support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@color__color_reference_simple.txt.snap)4
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@color__color_set_definition_error1.txt.snap (renamed from support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@color__color_set_definition_error1.txt.snap)4
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@color__color_set_definition_error2.txt.snap (renamed from support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@color__color_set_definition_error2.txt.snap)4
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@color__color_set_definition_error3.txt.snap (renamed from support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@color__color_set_definition_error3.txt.snap)4
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@color__color_set_definition_error4.txt.snap (renamed from support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@color__color_set_definition_error4.txt.snap)4
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@color__color_set_definition_simple.txt.snap (renamed from support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@color__color_set_definition_simple.txt.snap)4
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@command_definition__command_definition_no_argc.txt.snap (renamed from support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@command_definition__command_definition_no_argc.txt.snap)4
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@command_definition__command_definition_no_impl.txt.snap (renamed from support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@command_definition__command_definition_no_impl.txt.snap)4
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@command_definition__command_definition_no_impl_error.txt.snap (renamed from support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@command_definition__command_definition_no_impl_error.txt.snap)4
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@command_definition__command_definition_optional.txt.snap (renamed from support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@command_definition__command_definition_optional.txt.snap)4
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@command_definition__command_definition_simple.txt.snap (renamed from support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@command_definition__command_definition_simple.txt.snap)4
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@command_definition__command_definition_with_begin.txt.snap (renamed from support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@command_definition__command_definition_with_begin.txt.snap)4
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@command_definition__math_operator_no_impl.txt.snap (renamed from support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@command_definition__math_operator_no_impl.txt.snap)4
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@command_definition__math_operator_simple.txt.snap (renamed from support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@command_definition__math_operator_simple.txt.snap)4
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@environment__environment_asymptote.txt.snap (renamed from support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@environment__environment_asymptote.txt.snap)4
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@environment__environment_definition.txt.snap (renamed from support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@environment__environment_definition.txt.snap)4
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@environment__environment_definition_optional_arg.txt.snap (renamed from support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@environment__environment_definition_optional_arg.txt.snap)4
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@environment__environment_nested.txt.snap (renamed from support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@environment__environment_nested.txt.snap)4
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@environment__environment_nested_missing_braces.txt.snap (renamed from support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@environment__environment_nested_missing_braces.txt.snap)4
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@environment__environment_simple.txt.snap (renamed from support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@environment__environment_simple.txt.snap)4
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@equation.txt.snap (renamed from support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@equation.txt.snap)4
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@equation_missing_begin.txt.snap (renamed from support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@equation_missing_begin.txt.snap)4
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@generic_command_args.txt.snap (renamed from support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@generic_command_args.txt.snap)4
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@generic_command_empty.txt.snap (renamed from support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@generic_command_empty.txt.snap)4
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@generic_command_escape.txt.snap10
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@glossary__acronym_declaration.txt.snap (renamed from support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@glossary__acronym_declaration.txt.snap)4
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@glossary__acronym_definition_options.txt.snap (renamed from support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@glossary__acronym_definition_options.txt.snap)4
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@glossary__acronym_definition_simple.txt.snap (renamed from support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@glossary__acronym_definition_simple.txt.snap)4
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@glossary__acronym_package.txt.snap (renamed from support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@glossary__acronym_package.txt.snap)4
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@glossary__acronym_reference_options.txt.snap (renamed from support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@glossary__acronym_reference_options.txt.snap)4
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@glossary__acronym_reference_simple.txt.snap (renamed from support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@glossary__acronym_reference_simple.txt.snap)4
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@glossary__glossary_entry_definition_simple.txt.snap (renamed from support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@glossary__glossary_entry_definition_simple.txt.snap)4
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@glossary__glossary_entry_reference_options.txt.snap (renamed from support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@glossary__glossary_entry_reference_options.txt.snap)4
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@glossary__glossary_entry_reference_simple.txt.snap (renamed from support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@glossary__glossary_entry_reference_simple.txt.snap)4
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@graphics_path.txt.snap (renamed from support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@graphics_path.txt.snap)4
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@graphics_path_command.txt.snap (renamed from support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@graphics_path_command.txt.snap)4
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@graphics_path_options.txt.snap (renamed from support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@graphics_path_options.txt.snap)4
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@group__curly_group_missing_end.txt.snap (renamed from support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@group__curly_group_missing_end.txt.snap)4
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@group__curly_group_simple.txt.snap (renamed from support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@group__curly_group_simple.txt.snap)4
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@group__equation_missing_end.txt.snap (renamed from support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@group__equation_missing_end.txt.snap)4
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@group__escaped_brackets.txt.snap (renamed from support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@group__escaped_brackets.txt.snap)4
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@group__unmatched_braces.txt.snap (renamed from support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@group__unmatched_braces.txt.snap)4
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@group__unmatched_brackets.txt.snap (renamed from support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@group__unmatched_brackets.txt.snap)4
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@group__unmatched_brackets_with_group.txt.snap (renamed from support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@group__unmatched_brackets_with_group.txt.snap)4
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@hello_world.txt.snap (renamed from support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@hello_world.txt.snap)4
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__biblatex_include_options.txt.snap (renamed from support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__biblatex_include_options.txt.snap)4
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__biblatex_include_simple.txt.snap (renamed from support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__biblatex_include_simple.txt.snap)4
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__bibtex_include_simple.txt.snap (renamed from support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__bibtex_include_simple.txt.snap)4
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__class_include_empty.txt.snap (renamed from support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__class_include_empty.txt.snap)4
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__class_include_options.txt.snap (renamed from support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__class_include_options.txt.snap)4
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__class_include_simple.txt.snap (renamed from support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__class_include_simple.txt.snap)4
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__graphics_include_command.txt.snap (renamed from support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__graphics_include_command.txt.snap)4
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__graphics_include_complicated_options.txt.snap (renamed from support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__graphics_include_complicated_options.txt.snap)4
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__graphics_include_options.txt.snap (renamed from support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__graphics_include_options.txt.snap)4
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__graphics_include_simple.txt.snap (renamed from support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__graphics_include_simple.txt.snap)4
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__import_incomplete.txt.snap (renamed from support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__import_incomplete.txt.snap)4
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__import_simple.txt.snap (renamed from support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__import_simple.txt.snap)4
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__inkscape_include_options.txt.snap (renamed from support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__inkscape_include_options.txt.snap)4
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__inkscape_include_simple.txt.snap (renamed from support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__inkscape_include_simple.txt.snap)4
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__latex_include_equality_sign.txt.snap (renamed from support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__latex_include_equality_sign.txt.snap)4
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__latex_include_simple.txt.snap (renamed from support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__latex_include_simple.txt.snap)4
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__latex_input_path_brackets.txt.snap (renamed from support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__latex_input_path_brackets.txt.snap)4
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__package_include_empty.txt.snap (renamed from support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__package_include_empty.txt.snap)4
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__package_include_multiple.txt.snap (renamed from support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__package_include_multiple.txt.snap)4
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__package_include_options.txt.snap (renamed from support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__package_include_options.txt.snap)4
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__package_include_simple.txt.snap (renamed from support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__package_include_simple.txt.snap)4
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__pgf_library_import_simple.txt.snap (renamed from support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__pgf_library_import_simple.txt.snap)4
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__svg_include_options.txt.snap (renamed from support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__svg_include_options.txt.snap)4
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__svg_include_simple.txt.snap (renamed from support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__svg_include_simple.txt.snap)4
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__tikz_library_import_simple.txt.snap (renamed from support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__tikz_library_import_simple.txt.snap)4
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__verbatim_include_simple.txt.snap (renamed from support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__verbatim_include_simple.txt.snap)4
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@inline.txt.snap (renamed from support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@inline.txt.snap)4
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@inline_double_dollar.txt.snap (renamed from support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@inline_double_dollar.txt.snap)4
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@issue_745.txt.snap (renamed from support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@issue_745.txt.snap)4
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@issue_789.txt.snap (renamed from support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@issue_789.txt.snap)4
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@issue_853.txt.snap (renamed from support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@issue_853.txt.snap)4
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@issue_857.txt.snap (renamed from support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@issue_857.txt.snap)4
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@issue_874.txt.snap28
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@label__label_definition_line_break.txt.snap (renamed from support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@label__label_definition_line_break.txt.snap)4
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@label__label_definition_simple.txt.snap (renamed from support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@label__label_definition_simple.txt.snap)4
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@label__label_number.txt.snap (renamed from support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@label__label_number.txt.snap)4
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@label__label_reference_equation.txt.snap (renamed from support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@label__label_reference_equation.txt.snap)4
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@label__label_reference_incomplete.txt.snap (renamed from support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@label__label_reference_incomplete.txt.snap)4
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@label__label_reference_multiple.txt.snap (renamed from support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@label__label_reference_multiple.txt.snap)4
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@label__label_reference_range_error.txt.snap (renamed from support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@label__label_reference_range_error.txt.snap)4
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@label__label_reference_range_incomplete.txt.snap (renamed from support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@label__label_reference_range_incomplete.txt.snap)4
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@label__label_reference_range_simple.txt.snap (renamed from support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@label__label_reference_range_simple.txt.snap)4
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@label__label_reference_simple.txt.snap (renamed from support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@label__label_reference_simple.txt.snap)4
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@parameter.txt.snap10
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@parameter_error.txt.snap10
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@structure__structure_enum_item.txt.snap (renamed from support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@structure__structure_enum_item.txt.snap)4
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@structure__structure_invalid_nesting.txt.snap (renamed from support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@structure__structure_invalid_nesting.txt.snap)4
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@structure__structure_nested.txt.snap (renamed from support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@structure__structure_nested.txt.snap)4
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@structure__structure_siblings.txt.snap (renamed from support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@structure__structure_siblings.txt.snap)4
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@theorem_definition__theorem_definition_full.txt.snap (renamed from support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@theorem_definition__theorem_definition_full.txt.snap)4
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@theorem_definition__theorem_definition_name_with_counter.txt.snap (renamed from support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@theorem_definition__theorem_definition_name_with_counter.txt.snap)4
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@theorem_definition__theorem_definition_name_with_description.txt.snap (renamed from support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@theorem_definition__theorem_definition_name_with_description.txt.snap)4
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@theorem_definition__theorem_definition_name_with_description_and_counter.txt.snap (renamed from support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@theorem_definition__theorem_definition_name_with_description_and_counter.txt.snap)4
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@theorem_definition__theorem_definition_only_name.txt.snap (renamed from support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@theorem_definition__theorem_definition_only_name.txt.snap)4
-rw-r--r--support/texlab/crates/parser/src/test_data/bibtex/comment.txt (renamed from support/texlab/src/parser/test_data/bibtex/comment.txt)0
-rw-r--r--support/texlab/crates/parser/src/test_data/bibtex/issue_809.txt (renamed from support/texlab/src/parser/test_data/bibtex/issue_809.txt)0
-rw-r--r--support/texlab/crates/parser/src/test_data/bibtex/preamble.txt (renamed from support/texlab/src/parser/test_data/bibtex/preamble.txt)0
-rw-r--r--support/texlab/crates/parser/src/test_data/bibtex/samples/aho_2006.txt (renamed from support/texlab/src/parser/test_data/bibtex/samples/aho_2006.txt)0
-rw-r--r--support/texlab/crates/parser/src/test_data/bibtex/samples/aksin_2006.txt (renamed from support/texlab/src/parser/test_data/bibtex/samples/aksin_2006.txt)0
-rw-r--r--support/texlab/crates/parser/src/test_data/bibtex/samples/almendro_1998.txt (renamed from support/texlab/src/parser/test_data/bibtex/samples/almendro_1998.txt)0
-rw-r--r--support/texlab/crates/parser/src/test_data/bibtex/samples/averroes_1998.txt (renamed from support/texlab/src/parser/test_data/bibtex/samples/averroes_1998.txt)0
-rw-r--r--support/texlab/crates/parser/src/test_data/bibtex/samples/betram_1996.txt (renamed from support/texlab/src/parser/test_data/bibtex/samples/betram_1996.txt)0
-rw-r--r--support/texlab/crates/parser/src/test_data/bibtex/samples/blom_2021.txt (renamed from support/texlab/src/parser/test_data/bibtex/samples/blom_2021.txt)0
-rw-r--r--support/texlab/crates/parser/src/test_data/bibtex/samples/combi_2004.txt (renamed from support/texlab/src/parser/test_data/bibtex/samples/combi_2004.txt)0
-rw-r--r--support/texlab/crates/parser/src/test_data/bibtex/samples/erwin_2007.txt (renamed from support/texlab/src/parser/test_data/bibtex/samples/erwin_2007.txt)0
-rw-r--r--support/texlab/crates/parser/src/test_data/bibtex/samples/jain_1999.txt (renamed from support/texlab/src/parser/test_data/bibtex/samples/jain_1999.txt)0
-rw-r--r--support/texlab/crates/parser/src/test_data/bibtex/samples/kastenholz_2006.txt (renamed from support/texlab/src/parser/test_data/bibtex/samples/kastenholz_2006.txt)0
-rw-r--r--support/texlab/crates/parser/src/test_data/bibtex/samples/knuth_1984.txt (renamed from support/texlab/src/parser/test_data/bibtex/samples/knuth_1984.txt)0
-rw-r--r--support/texlab/crates/parser/src/test_data/bibtex/samples/matuz_1990.txt (renamed from support/texlab/src/parser/test_data/bibtex/samples/matuz_1990.txt)0
-rw-r--r--support/texlab/crates/parser/src/test_data/bibtex/samples/nietzsche_1998.txt (renamed from support/texlab/src/parser/test_data/bibtex/samples/nietzsche_1998.txt)0
-rw-r--r--support/texlab/crates/parser/src/test_data/bibtex/samples/rivest_1978.txt (renamed from support/texlab/src/parser/test_data/bibtex/samples/rivest_1978.txt)0
-rw-r--r--support/texlab/crates/parser/src/test_data/build_log/001.txt (renamed from support/texlab/src/parser/test_data/build_log/001.txt)0
-rw-r--r--support/texlab/crates/parser/src/test_data/build_log/002.txt (renamed from support/texlab/src/parser/test_data/build_log/002.txt)0
-rw-r--r--support/texlab/crates/parser/src/test_data/build_log/003.txt (renamed from support/texlab/src/parser/test_data/build_log/003.txt)0
-rw-r--r--support/texlab/crates/parser/src/test_data/build_log/004.txt (renamed from support/texlab/src/parser/test_data/build_log/004.txt)0
-rw-r--r--support/texlab/crates/parser/src/test_data/build_log/005.txt (renamed from support/texlab/src/parser/test_data/build_log/005.txt)0
-rw-r--r--support/texlab/crates/parser/src/test_data/build_log/006.txt (renamed from support/texlab/src/parser/test_data/build_log/006.txt)0
-rw-r--r--support/texlab/crates/parser/src/test_data/build_log/007.txt (renamed from support/texlab/src/parser/test_data/build_log/007.txt)0
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/block_comments.txt (renamed from support/texlab/src/parser/test_data/latex/block_comments.txt)0
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/caption/caption_default.txt (renamed from support/texlab/src/parser/test_data/latex/caption/caption_default.txt)0
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/caption/caption_default_error.txt (renamed from support/texlab/src/parser/test_data/latex/caption/caption_default_error.txt)0
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/caption/caption_figure.txt (renamed from support/texlab/src/parser/test_data/latex/caption/caption_figure.txt)0
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/caption/caption_minimal.txt (renamed from support/texlab/src/parser/test_data/latex/caption/caption_minimal.txt)0
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/caption/caption_minimal_error.txt (renamed from support/texlab/src/parser/test_data/latex/caption/caption_minimal_error.txt)0
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/citation/citation_empty.txt (renamed from support/texlab/src/parser/test_data/latex/citation/citation_empty.txt)0
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/citation/citation_missing_brace.txt (renamed from support/texlab/src/parser/test_data/latex/citation/citation_missing_brace.txt)0
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/citation/citation_multiple_keys.txt (renamed from support/texlab/src/parser/test_data/latex/citation/citation_multiple_keys.txt)0
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/citation/citation_prenote.txt (renamed from support/texlab/src/parser/test_data/latex/citation/citation_prenote.txt)0
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/citation/citation_prenote_postnote.txt (renamed from support/texlab/src/parser/test_data/latex/citation/citation_prenote_postnote.txt)0
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/citation/citation_redundant_comma.txt (renamed from support/texlab/src/parser/test_data/latex/citation/citation_redundant_comma.txt)0
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/citation/citation_simple.txt (renamed from support/texlab/src/parser/test_data/latex/citation/citation_simple.txt)0
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/citation/citation_star.txt (renamed from support/texlab/src/parser/test_data/latex/citation/citation_star.txt)0
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/color/color_definition_simple.txt (renamed from support/texlab/src/parser/test_data/latex/color/color_definition_simple.txt)0
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/color/color_reference_simple.txt (renamed from support/texlab/src/parser/test_data/latex/color/color_reference_simple.txt)0
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/color/color_set_definition_error1.txt (renamed from support/texlab/src/parser/test_data/latex/color/color_set_definition_error1.txt)0
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/color/color_set_definition_error2.txt (renamed from support/texlab/src/parser/test_data/latex/color/color_set_definition_error2.txt)0
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/color/color_set_definition_error3.txt (renamed from support/texlab/src/parser/test_data/latex/color/color_set_definition_error3.txt)0
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/color/color_set_definition_error4.txt (renamed from support/texlab/src/parser/test_data/latex/color/color_set_definition_error4.txt)0
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/color/color_set_definition_simple.txt (renamed from support/texlab/src/parser/test_data/latex/color/color_set_definition_simple.txt)0
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/command_definition/command_definition_no_argc.txt (renamed from support/texlab/src/parser/test_data/latex/command_definition/command_definition_no_argc.txt)0
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/command_definition/command_definition_no_impl.txt (renamed from support/texlab/src/parser/test_data/latex/command_definition/command_definition_no_impl.txt)0
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/command_definition/command_definition_no_impl_error.txt (renamed from support/texlab/src/parser/test_data/latex/command_definition/command_definition_no_impl_error.txt)0
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/command_definition/command_definition_optional.txt (renamed from support/texlab/src/parser/test_data/latex/command_definition/command_definition_optional.txt)0
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/command_definition/command_definition_simple.txt (renamed from support/texlab/src/parser/test_data/latex/command_definition/command_definition_simple.txt)0
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/command_definition/command_definition_with_begin.txt (renamed from support/texlab/src/parser/test_data/latex/command_definition/command_definition_with_begin.txt)0
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/command_definition/math_operator_no_impl.txt (renamed from support/texlab/src/parser/test_data/latex/command_definition/math_operator_no_impl.txt)0
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/command_definition/math_operator_simple.txt (renamed from support/texlab/src/parser/test_data/latex/command_definition/math_operator_simple.txt)0
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/environment/environment_asymptote.txt (renamed from support/texlab/src/parser/test_data/latex/environment/environment_asymptote.txt)0
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/environment/environment_definition.txt (renamed from support/texlab/src/parser/test_data/latex/environment/environment_definition.txt)0
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/environment/environment_definition_optional_arg.txt (renamed from support/texlab/src/parser/test_data/latex/environment/environment_definition_optional_arg.txt)0
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/environment/environment_nested.txt (renamed from support/texlab/src/parser/test_data/latex/environment/environment_nested.txt)0
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/environment/environment_nested_missing_braces.txt (renamed from support/texlab/src/parser/test_data/latex/environment/environment_nested_missing_braces.txt)0
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/environment/environment_simple.txt (renamed from support/texlab/src/parser/test_data/latex/environment/environment_simple.txt)0
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/equation.txt (renamed from support/texlab/src/parser/test_data/latex/equation.txt)0
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/equation_missing_begin.txt (renamed from support/texlab/src/parser/test_data/latex/equation_missing_begin.txt)0
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/generic_command_args.txt (renamed from support/texlab/src/parser/test_data/latex/generic_command_args.txt)0
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/generic_command_empty.txt (renamed from support/texlab/src/parser/test_data/latex/generic_command_empty.txt)0
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/generic_command_escape.txt (renamed from support/texlab/src/parser/test_data/latex/generic_command_escape.txt)0
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/glossary/acronym_declaration.txt (renamed from support/texlab/src/parser/test_data/latex/glossary/acronym_declaration.txt)0
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/glossary/acronym_definition_options.txt (renamed from support/texlab/src/parser/test_data/latex/glossary/acronym_definition_options.txt)0
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/glossary/acronym_definition_simple.txt (renamed from support/texlab/src/parser/test_data/latex/glossary/acronym_definition_simple.txt)0
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/glossary/acronym_package.txt (renamed from support/texlab/src/parser/test_data/latex/glossary/acronym_package.txt)0
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/glossary/acronym_reference_options.txt (renamed from support/texlab/src/parser/test_data/latex/glossary/acronym_reference_options.txt)0
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/glossary/acronym_reference_simple.txt (renamed from support/texlab/src/parser/test_data/latex/glossary/acronym_reference_simple.txt)0
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/glossary/glossary_entry_definition_simple.txt (renamed from support/texlab/src/parser/test_data/latex/glossary/glossary_entry_definition_simple.txt)0
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/glossary/glossary_entry_reference_options.txt (renamed from support/texlab/src/parser/test_data/latex/glossary/glossary_entry_reference_options.txt)0
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/glossary/glossary_entry_reference_simple.txt (renamed from support/texlab/src/parser/test_data/latex/glossary/glossary_entry_reference_simple.txt)0
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/graphics_path.txt (renamed from support/texlab/src/parser/test_data/latex/graphics_path.txt)0
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/graphics_path_command.txt (renamed from support/texlab/src/parser/test_data/latex/graphics_path_command.txt)0
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/graphics_path_options.txt (renamed from support/texlab/src/parser/test_data/latex/graphics_path_options.txt)0
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/group/curly_group_missing_end.txt (renamed from support/texlab/src/parser/test_data/latex/group/curly_group_missing_end.txt)0
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/group/curly_group_simple.txt (renamed from support/texlab/src/parser/test_data/latex/group/curly_group_simple.txt)0
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/group/equation_missing_end.txt (renamed from support/texlab/src/parser/test_data/latex/group/equation_missing_end.txt)0
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/group/escaped_brackets.txt (renamed from support/texlab/src/parser/test_data/latex/group/escaped_brackets.txt)0
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/group/unmatched_braces.txt (renamed from support/texlab/src/parser/test_data/latex/group/unmatched_braces.txt)0
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/group/unmatched_brackets.txt (renamed from support/texlab/src/parser/test_data/latex/group/unmatched_brackets.txt)0
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/group/unmatched_brackets_with_group.txt (renamed from support/texlab/src/parser/test_data/latex/group/unmatched_brackets_with_group.txt)0
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/hello_world.txt (renamed from support/texlab/src/parser/test_data/latex/hello_world.txt)0
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/include/biblatex_include_options.txt (renamed from support/texlab/src/parser/test_data/latex/include/biblatex_include_options.txt)0
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/include/biblatex_include_simple.txt (renamed from support/texlab/src/parser/test_data/latex/include/biblatex_include_simple.txt)0
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/include/bibtex_include_simple.txt (renamed from support/texlab/src/parser/test_data/latex/include/bibtex_include_simple.txt)0
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/include/class_include_empty.txt (renamed from support/texlab/src/parser/test_data/latex/include/class_include_empty.txt)0
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/include/class_include_options.txt (renamed from support/texlab/src/parser/test_data/latex/include/class_include_options.txt)0
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/include/class_include_simple.txt (renamed from support/texlab/src/parser/test_data/latex/include/class_include_simple.txt)0
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/include/graphics_include_command.txt (renamed from support/texlab/src/parser/test_data/latex/include/graphics_include_command.txt)0
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/include/graphics_include_complicated_options.txt (renamed from support/texlab/src/parser/test_data/latex/include/graphics_include_complicated_options.txt)0
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/include/graphics_include_options.txt (renamed from support/texlab/src/parser/test_data/latex/include/graphics_include_options.txt)0
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/include/graphics_include_simple.txt (renamed from support/texlab/src/parser/test_data/latex/include/graphics_include_simple.txt)0
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/include/import_incomplete.txt (renamed from support/texlab/src/parser/test_data/latex/include/import_incomplete.txt)0
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/include/import_simple.txt (renamed from support/texlab/src/parser/test_data/latex/include/import_simple.txt)0
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/include/inkscape_include_options.txt (renamed from support/texlab/src/parser/test_data/latex/include/inkscape_include_options.txt)0
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/include/inkscape_include_simple.txt (renamed from support/texlab/src/parser/test_data/latex/include/inkscape_include_simple.txt)0
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/include/latex_include_equality_sign.txt (renamed from support/texlab/src/parser/test_data/latex/include/latex_include_equality_sign.txt)0
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/include/latex_include_simple.txt (renamed from support/texlab/src/parser/test_data/latex/include/latex_include_simple.txt)0
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/include/latex_input_path_brackets.txt (renamed from support/texlab/src/parser/test_data/latex/include/latex_input_path_brackets.txt)0
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/include/package_include_empty.txt (renamed from support/texlab/src/parser/test_data/latex/include/package_include_empty.txt)0
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/include/package_include_multiple.txt (renamed from support/texlab/src/parser/test_data/latex/include/package_include_multiple.txt)0
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/include/package_include_options.txt (renamed from support/texlab/src/parser/test_data/latex/include/package_include_options.txt)0
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/include/package_include_simple.txt (renamed from support/texlab/src/parser/test_data/latex/include/package_include_simple.txt)0
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/include/pgf_library_import_simple.txt (renamed from support/texlab/src/parser/test_data/latex/include/pgf_library_import_simple.txt)0
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/include/svg_include_options.txt (renamed from support/texlab/src/parser/test_data/latex/include/svg_include_options.txt)0
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/include/svg_include_simple.txt (renamed from support/texlab/src/parser/test_data/latex/include/svg_include_simple.txt)0
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/include/tikz_library_import_simple.txt (renamed from support/texlab/src/parser/test_data/latex/include/tikz_library_import_simple.txt)0
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/include/verbatim_include_simple.txt (renamed from support/texlab/src/parser/test_data/latex/include/verbatim_include_simple.txt)0
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/inline.txt (renamed from support/texlab/src/parser/test_data/latex/inline.txt)0
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/inline_double_dollar.txt (renamed from support/texlab/src/parser/test_data/latex/inline_double_dollar.txt)0
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/issue_745.txt (renamed from support/texlab/src/parser/test_data/latex/issue_745.txt)0
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/issue_789.txt (renamed from support/texlab/src/parser/test_data/latex/issue_789.txt)0
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/issue_853.txt (renamed from support/texlab/src/parser/test_data/latex/issue_853.txt)0
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/issue_857.txt (renamed from support/texlab/src/parser/test_data/latex/issue_857.txt)0
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/issue_874.txt1
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/label/label_definition_line_break.txt (renamed from support/texlab/src/parser/test_data/latex/label/label_definition_line_break.txt)0
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/label/label_definition_simple.txt (renamed from support/texlab/src/parser/test_data/latex/label/label_definition_simple.txt)0
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/label/label_number.txt (renamed from support/texlab/src/parser/test_data/latex/label/label_number.txt)0
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/label/label_reference_equation.txt (renamed from support/texlab/src/parser/test_data/latex/label/label_reference_equation.txt)0
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/label/label_reference_incomplete.txt (renamed from support/texlab/src/parser/test_data/latex/label/label_reference_incomplete.txt)0
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/label/label_reference_multiple.txt (renamed from support/texlab/src/parser/test_data/latex/label/label_reference_multiple.txt)0
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/label/label_reference_range_error.txt (renamed from support/texlab/src/parser/test_data/latex/label/label_reference_range_error.txt)0
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/label/label_reference_range_incomplete.txt (renamed from support/texlab/src/parser/test_data/latex/label/label_reference_range_incomplete.txt)0
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/label/label_reference_range_simple.txt (renamed from support/texlab/src/parser/test_data/latex/label/label_reference_range_simple.txt)0
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/label/label_reference_simple.txt (renamed from support/texlab/src/parser/test_data/latex/label/label_reference_simple.txt)0
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/parameter.txt (renamed from support/texlab/src/parser/test_data/latex/parameter.txt)0
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/parameter_error.txt (renamed from support/texlab/src/parser/test_data/latex/parameter_error.txt)0
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/structure/structure_enum_item.txt (renamed from support/texlab/src/parser/test_data/latex/structure/structure_enum_item.txt)0
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/structure/structure_invalid_nesting.txt (renamed from support/texlab/src/parser/test_data/latex/structure/structure_invalid_nesting.txt)0
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/structure/structure_nested.txt (renamed from support/texlab/src/parser/test_data/latex/structure/structure_nested.txt)0
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/structure/structure_siblings.txt (renamed from support/texlab/src/parser/test_data/latex/structure/structure_siblings.txt)0
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/theorem_definition/theorem_definition_full.txt (renamed from support/texlab/src/parser/test_data/latex/theorem_definition/theorem_definition_full.txt)0
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/theorem_definition/theorem_definition_name_with_counter.txt (renamed from support/texlab/src/parser/test_data/latex/theorem_definition/theorem_definition_name_with_counter.txt)0
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/theorem_definition/theorem_definition_name_with_description.txt (renamed from support/texlab/src/parser/test_data/latex/theorem_definition/theorem_definition_name_with_description.txt)0
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/theorem_definition/theorem_definition_name_with_description_and_counter.txt (renamed from support/texlab/src/parser/test_data/latex/theorem_definition/theorem_definition_name_with_description_and_counter.txt)0
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/theorem_definition/theorem_definition_only_name.txt (renamed from support/texlab/src/parser/test_data/latex/theorem_definition/theorem_definition_only_name.txt)0
-rw-r--r--support/texlab/crates/syntax/Cargo.toml14
-rw-r--r--support/texlab/crates/syntax/src/bibtex.rs (renamed from support/texlab/src/syntax/bibtex.rs)0
-rw-r--r--support/texlab/crates/syntax/src/latex.rs (renamed from support/texlab/src/syntax/latex.rs)0
-rw-r--r--support/texlab/crates/syntax/src/latex/cst.rs (renamed from support/texlab/src/syntax/latex/cst.rs)0
-rw-r--r--support/texlab/crates/syntax/src/latex/kind.rs (renamed from support/texlab/src/syntax/latex/kind.rs)0
-rw-r--r--support/texlab/crates/syntax/src/lib.rs (renamed from support/texlab/src/syntax.rs)13
-rw-r--r--support/texlab/crates/texlab/Cargo.toml78
-rw-r--r--support/texlab/crates/texlab/benches/bench_main.rs43
-rw-r--r--support/texlab/crates/texlab/data/components.json.gz (renamed from support/texlab/data/components.json.gz)bin6970534 -> 6970534 bytes
-rw-r--r--support/texlab/crates/texlab/data/lang_data.json (renamed from support/texlab/data/lang_data.json)0
-rw-r--r--support/texlab/crates/texlab/src/client.rs (renamed from support/texlab/src/client.rs)0
-rw-r--r--support/texlab/crates/texlab/src/features.rs (renamed from support/texlab/src/features.rs)0
-rw-r--r--support/texlab/crates/texlab/src/features/build.rs (renamed from support/texlab/src/features/build.rs)79
-rw-r--r--support/texlab/crates/texlab/src/features/build/progress.rs (renamed from support/texlab/src/features/build/progress.rs)0
-rw-r--r--support/texlab/crates/texlab/src/features/completion.rs (renamed from support/texlab/src/features/completion.rs)17
-rw-r--r--support/texlab/crates/texlab/src/features/completion/acronym_ref.rs31
-rw-r--r--support/texlab/crates/texlab/src/features/completion/argument.rs (renamed from support/texlab/src/features/completion/argument.rs)13
-rw-r--r--support/texlab/crates/texlab/src/features/completion/begin_snippet.rs (renamed from support/texlab/src/features/completion/begin_snippet.rs)0
-rw-r--r--support/texlab/crates/texlab/src/features/completion/builder.rs (renamed from support/texlab/src/features/completion/builder.rs)157
-rw-r--r--support/texlab/crates/texlab/src/features/completion/citation.rs (renamed from support/texlab/src/features/completion/citation.rs)21
-rw-r--r--support/texlab/crates/texlab/src/features/completion/color.rs (renamed from support/texlab/src/features/completion/color.rs)6
-rw-r--r--support/texlab/crates/texlab/src/features/completion/color_model.rs (renamed from support/texlab/src/features/completion/color_model.rs)3
-rw-r--r--support/texlab/crates/texlab/src/features/completion/component_command.rs (renamed from support/texlab/src/features/completion/component_command.rs)2
-rw-r--r--support/texlab/crates/texlab/src/features/completion/component_environment.rs (renamed from support/texlab/src/features/completion/component_environment.rs)2
-rw-r--r--support/texlab/crates/texlab/src/features/completion/entry_type.rs (renamed from support/texlab/src/features/completion/entry_type.rs)6
-rw-r--r--support/texlab/crates/texlab/src/features/completion/field.rs (renamed from support/texlab/src/features/completion/field.rs)6
-rw-r--r--support/texlab/crates/texlab/src/features/completion/glossary_ref.rs37
-rw-r--r--support/texlab/crates/texlab/src/features/completion/import.rs (renamed from support/texlab/src/features/completion/import.rs)8
-rw-r--r--support/texlab/crates/texlab/src/features/completion/include.rs (renamed from support/texlab/src/features/completion/include.rs)33
-rw-r--r--support/texlab/crates/texlab/src/features/completion/label.rs72
-rw-r--r--support/texlab/crates/texlab/src/features/completion/theorem.rs21
-rw-r--r--support/texlab/crates/texlab/src/features/completion/tikz_library.rs (renamed from support/texlab/src/features/completion/tikz_library.rs)6
-rw-r--r--support/texlab/crates/texlab/src/features/completion/user_command.rs21
-rw-r--r--support/texlab/crates/texlab/src/features/completion/user_environment.rs26
-rw-r--r--support/texlab/crates/texlab/src/features/definition.rs (renamed from support/texlab/src/features/definition.rs)21
-rw-r--r--support/texlab/crates/texlab/src/features/definition/command.rs45
-rw-r--r--support/texlab/crates/texlab/src/features/definition/document.rs (renamed from support/texlab/src/features/definition/document.rs)13
-rw-r--r--support/texlab/crates/texlab/src/features/definition/entry.rs42
-rw-r--r--support/texlab/crates/texlab/src/features/definition/label.rs37
-rw-r--r--support/texlab/crates/texlab/src/features/definition/string.rs (renamed from support/texlab/src/features/definition/string.rs)17
-rw-r--r--support/texlab/crates/texlab/src/features/folding.rs (renamed from support/texlab/src/features/folding.rs)27
-rw-r--r--support/texlab/crates/texlab/src/features/formatting.rs29
-rw-r--r--support/texlab/crates/texlab/src/features/formatting/bibtex_internal.rs (renamed from support/texlab/src/features/formatting/bibtex_internal.rs)22
-rw-r--r--support/texlab/crates/texlab/src/features/formatting/latexindent.rs (renamed from support/texlab/src/features/formatting/latexindent.rs)29
-rw-r--r--support/texlab/crates/texlab/src/features/forward_search.rs (renamed from support/texlab/src/features/forward_search.rs)54
-rw-r--r--support/texlab/crates/texlab/src/features/highlight.rs15
-rw-r--r--support/texlab/crates/texlab/src/features/highlight/label.rs30
-rw-r--r--support/texlab/crates/texlab/src/features/hover.rs (renamed from support/texlab/src/features/hover.rs)13
-rw-r--r--support/texlab/crates/texlab/src/features/hover/citation.rs (renamed from support/texlab/src/features/hover/citation.rs)12
-rw-r--r--support/texlab/crates/texlab/src/features/hover/component.rs23
-rw-r--r--support/texlab/crates/texlab/src/features/hover/entry_type.rs (renamed from support/texlab/src/features/hover/entry_type.rs)6
-rw-r--r--support/texlab/crates/texlab/src/features/hover/field.rs (renamed from support/texlab/src/features/hover/field.rs)6
-rw-r--r--support/texlab/crates/texlab/src/features/hover/label.rs26
-rw-r--r--support/texlab/crates/texlab/src/features/hover/string_ref.rs (renamed from support/texlab/src/features/hover/string_ref.rs)13
-rw-r--r--support/texlab/crates/texlab/src/features/inlay_hint.rs48
-rw-r--r--support/texlab/crates/texlab/src/features/inlay_hint/label.rs39
-rw-r--r--support/texlab/crates/texlab/src/features/link.rs38
-rw-r--r--support/texlab/crates/texlab/src/features/link/include.rs22
-rw-r--r--support/texlab/crates/texlab/src/features/reference.rs (renamed from support/texlab/src/features/reference.rs)24
-rw-r--r--support/texlab/crates/texlab/src/features/reference/entry.rs (renamed from support/texlab/src/features/reference/entry.rs)34
-rw-r--r--support/texlab/crates/texlab/src/features/reference/label.rs36
-rw-r--r--support/texlab/crates/texlab/src/features/reference/string.rs (renamed from support/texlab/src/features/reference/string.rs)19
-rw-r--r--support/texlab/crates/texlab/src/features/rename.rs (renamed from support/texlab/src/features/rename.rs)29
-rw-r--r--support/texlab/crates/texlab/src/features/rename/command.rs39
-rw-r--r--support/texlab/crates/texlab/src/features/rename/entry.rs (renamed from support/texlab/src/features/rename/entry.rs)38
-rw-r--r--support/texlab/crates/texlab/src/features/rename/label.rs37
-rw-r--r--support/texlab/crates/texlab/src/features/symbol.rs (renamed from support/texlab/src/features/symbol.rs)57
-rw-r--r--support/texlab/crates/texlab/src/features/symbol/bibtex.rs (renamed from support/texlab/src/features/symbol/bibtex.rs)25
-rw-r--r--support/texlab/crates/texlab/src/features/symbol/latex.rs (renamed from support/texlab/src/features/symbol/latex.rs)289
-rw-r--r--support/texlab/crates/texlab/src/features/symbol/project_order.rs203
-rw-r--r--support/texlab/crates/texlab/src/features/symbol/types.rs (renamed from support/texlab/src/features/symbol/types.rs)15
-rw-r--r--support/texlab/crates/texlab/src/features/workspace_command.rs (renamed from support/texlab/src/features/workspace_command.rs)0
-rw-r--r--support/texlab/crates/texlab/src/features/workspace_command/change_environment.rs (renamed from support/texlab/src/features/workspace_command/change_environment.rs)14
-rw-r--r--support/texlab/crates/texlab/src/features/workspace_command/clean.rs (renamed from support/texlab/src/features/workspace_command/clean.rs)28
-rw-r--r--support/texlab/crates/texlab/src/features/workspace_command/dep_graph.rs57
-rw-r--r--support/texlab/crates/texlab/src/lib.rs33
-rw-r--r--support/texlab/crates/texlab/src/main.rs (renamed from support/texlab/src/main.rs)0
-rw-r--r--support/texlab/crates/texlab/src/server.rs (renamed from support/texlab/src/server.rs)380
-rw-r--r--support/texlab/crates/texlab/src/server/dispatch.rs (renamed from support/texlab/src/server/dispatch.rs)5
-rw-r--r--support/texlab/crates/texlab/src/server/options.rs (renamed from support/texlab/src/server/options.rs)3
-rw-r--r--support/texlab/crates/texlab/src/util.rs (renamed from support/texlab/src/util.rs)2
-rw-r--r--support/texlab/crates/texlab/src/util/capabilities.rs (renamed from support/texlab/src/util/capabilities.rs)0
-rw-r--r--support/texlab/crates/texlab/src/util/chktex.rs (renamed from support/texlab/src/util/chktex.rs)45
-rw-r--r--support/texlab/crates/texlab/src/util/components.rs (renamed from support/texlab/src/util/components.rs)22
-rw-r--r--support/texlab/crates/texlab/src/util/cursor.rs (renamed from support/texlab/src/util/cursor.rs)52
-rw-r--r--support/texlab/crates/texlab/src/util/diagnostics.rs120
-rw-r--r--support/texlab/crates/texlab/src/util/label.rs202
-rw-r--r--support/texlab/crates/texlab/src/util/lang_data.rs (renamed from support/texlab/src/util/lang_data.rs)0
-rw-r--r--support/texlab/crates/texlab/src/util/line_index_ext.rs (renamed from support/texlab/src/util/line_index_ext.rs)15
-rw-r--r--support/texlab/crates/texlab/src/util/lsp_enums.rs (renamed from support/texlab/src/util/lsp_enums.rs)0
-rw-r--r--support/texlab/crates/texlab/src/util/regex_filter.rs (renamed from support/texlab/src/util/regex_filter.rs)0
-rw-r--r--support/texlab/crates/texlab/tests/lsp/fixture.rs (renamed from support/texlab/tests/lsp/fixture.rs)41
-rw-r--r--support/texlab/crates/texlab/tests/lsp/main.rs (renamed from support/texlab/tests/lsp/main.rs)0
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document.rs (renamed from support/texlab/tests/lsp/text_document.rs)0
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/completion.rs (renamed from support/texlab/tests/lsp/text_document/completion.rs)0
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/definition.rs (renamed from support/texlab/tests/lsp/text_document/definition.rs)0
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/document_highlight.rs (renamed from support/texlab/tests/lsp/text_document/document_highlight.rs)0
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/document_link.rs (renamed from support/texlab/tests/lsp/text_document/document_link.rs)0
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/document_symbol.rs (renamed from support/texlab/tests/lsp/text_document/document_symbol.rs)0
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/folding_range.rs (renamed from support/texlab/tests/lsp/text_document/folding_range.rs)0
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/formatting.rs (renamed from support/texlab/tests/lsp/text_document/formatting.rs)3
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/hover.rs (renamed from support/texlab/tests/lsp/text_document/hover.rs)0
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/inlay_hint.rs (renamed from support/texlab/tests/lsp/text_document/inlay_hint.rs)0
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/references.rs (renamed from support/texlab/tests/lsp/text_document/references.rs)0
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/rename.rs (renamed from support/texlab/tests/lsp/text_document/rename.rs)0
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__acronym_package_ref.snap (renamed from support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__acronym_package_ref.snap)0
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__acronym_ref_empty.snap (renamed from support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__acronym_ref_empty.snap)0
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__acronym_ref_open_brace.snap (renamed from support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__acronym_ref_open_brace.snap)0
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__acronym_ref_simple.snap (renamed from support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__acronym_ref_simple.snap)0
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__argument_empty.snap (renamed from support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__argument_empty.snap)0
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__argument_open_brace.snap (renamed from support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__argument_open_brace.snap)0
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__argument_word.snap (renamed from support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__argument_word.snap)0
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__begin_environment_without_snippet_support.snap (renamed from support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__begin_environment_without_snippet_support.snap)0
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__citation.snap (renamed from support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__citation.snap)0
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__citation_acronym.snap (renamed from support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__citation_acronym.snap)0
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__citation_open_brace.snap (renamed from support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__citation_open_brace.snap)0
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__citation_open_brace_multiple.snap (renamed from support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__citation_open_brace_multiple.snap)0
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__color_model_definition_open_brace.snap (renamed from support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__color_model_definition_open_brace.snap)0
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__color_model_definition_set_open_brace.snap (renamed from support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__color_model_definition_set_open_brace.snap)0
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__color_model_definition_set_simple.snap (renamed from support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__color_model_definition_set_simple.snap)0
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__color_model_definition_simple.snap (renamed from support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__color_model_definition_simple.snap)0
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__color_open_brace.snap (renamed from support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__color_open_brace.snap)0
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__color_simple.snap (renamed from support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__color_simple.snap)0
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__color_word.snap (renamed from support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__color_word.snap)0
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__component_command_bibtex.snap (renamed from support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__component_command_bibtex.snap)0
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__component_command_simple.snap (renamed from support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__component_command_simple.snap)0
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__component_command_simple_package.snap (renamed from support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__component_command_simple_package.snap)0
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__component_environment_class.snap (renamed from support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__component_environment_class.snap)0
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__component_environment_command_definition.snap (renamed from support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__component_environment_command_definition.snap)0
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__component_environment_simple.snap (renamed from support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__component_environment_simple.snap)0
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__component_environment_simple_end.snap (renamed from support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__component_environment_simple_end.snap)0
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__entry_type_after_preamble.snap (renamed from support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__entry_type_after_preamble.snap)0
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__entry_type_after_string.snap (renamed from support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__entry_type_after_string.snap)0
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__entry_type_at_empty.snap (renamed from support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__entry_type_at_empty.snap)0
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__entry_type_before_article.snap (renamed from support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__entry_type_before_article.snap)0
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__entry_type_before_preamble.snap (renamed from support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__entry_type_before_preamble.snap)0
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__entry_type_before_string.snap (renamed from support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__entry_type_before_string.snap)0
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__entry_type_complete_entry.snap (renamed from support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__entry_type_complete_entry.snap)0
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__field_empty_entry_closed.snap (renamed from support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__field_empty_entry_closed.snap)0
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__field_empty_entry_open.snap (renamed from support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__field_empty_entry_open.snap)0
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__field_entry_field_name.snap (renamed from support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__field_entry_field_name.snap)0
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__field_entry_two_fields_name_closed.snap (renamed from support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__field_entry_two_fields_name_closed.snap)0
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__field_entry_two_fields_name_open.snap (renamed from support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__field_entry_two_fields_name_open.snap)0
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__glossary_ref_open_brace.snap (renamed from support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__glossary_ref_open_brace.snap)0
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__glossary_ref_simple.snap (renamed from support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__glossary_ref_simple.snap)0
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__import_class_closed_brace.snap (renamed from support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__import_class_closed_brace.snap)0
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__import_class_open_brace.snap (renamed from support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__import_class_open_brace.snap)0
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__import_package_closed_brace.snap (renamed from support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__import_package_closed_brace.snap)0
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__import_package_open_brace.snap (renamed from support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__import_package_open_brace.snap)0
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__issue_857_1.snap (renamed from support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__issue_857_1.snap)0
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__issue_864.snap (renamed from support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__issue_864.snap)2
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__label.snap (renamed from support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__label.snap)0
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__project_resolution_import.snap (renamed from support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__project_resolution_import.snap)0
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__project_resolution_texlabroot.snap (renamed from support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__project_resolution_texlabroot.snap)0
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__theorem_begin.snap (renamed from support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__theorem_begin.snap)0
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__theorem_end.snap (renamed from support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__theorem_end.snap)0
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__tikz_library_closed_brace.snap (renamed from support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__tikz_library_closed_brace.snap)0
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__tikz_library_open_brace.snap (renamed from support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__tikz_library_open_brace.snap)0
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__user_command.snap (renamed from support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__user_command.snap)2
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__user_environment.snap (renamed from support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__user_environment.snap)0
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__document_link__document_import.snap (renamed from support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__document_link__document_import.snap)4
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__document_link__document_include.snap (renamed from support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__document_link__document_include.snap)4
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__document_symbol__enumerate_flat.snap (renamed from support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__document_symbol__enumerate_flat.snap)12
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__document_symbol__enumerate_nested.snap (renamed from support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__document_symbol__enumerate_nested.snap)0
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__document_symbol__equation_flat.snap (renamed from support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__document_symbol__equation_flat.snap)8
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__document_symbol__equation_nested.snap (renamed from support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__document_symbol__equation_nested.snap)0
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__document_symbol__float_flat.snap (renamed from support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__document_symbol__float_flat.snap)8
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__document_symbol__float_nested.snap (renamed from support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__document_symbol__float_nested.snap)0
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__document_symbol__ignored_patterns.snap (renamed from support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__document_symbol__ignored_patterns.snap)4
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__document_symbol__section_flat.snap (renamed from support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__document_symbol__section_flat.snap)8
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__document_symbol__section_nested.snap (renamed from support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__document_symbol__section_nested.snap)0
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__document_symbol__theorem_flat.snap (renamed from support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__document_symbol__theorem_flat.snap)10
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__document_symbol__theorem_nested.snap (renamed from support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__document_symbol__theorem_nested.snap)0
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__folding_range__bibtex.snap (renamed from support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__folding_range__bibtex.snap)0
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__folding_range__latex.snap (renamed from support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__folding_range__latex.snap)0
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__formatting__bibtex_internal_command.snap (renamed from support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__formatting__bibtex_internal_command.snap)0
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__formatting__bibtex_internal_insert_braces.snap (renamed from support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__formatting__bibtex_internal_insert_braces.snap)0
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__formatting__bibtex_internal_join_strings.snap (renamed from support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__formatting__bibtex_internal_join_strings.snap)0
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__formatting__bibtex_internal_multiple_entries.snap (renamed from support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__formatting__bibtex_internal_multiple_entries.snap)0
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__formatting__bibtex_internal_parens.snap (renamed from support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__formatting__bibtex_internal_parens.snap)0
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__formatting__bibtex_internal_preamble.snap (renamed from support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__formatting__bibtex_internal_preamble.snap)0
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__formatting__bibtex_internal_string.snap (renamed from support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__formatting__bibtex_internal_string.snap)0
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__formatting__bibtex_internal_trailing_comma.snap (renamed from support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__formatting__bibtex_internal_trailing_comma.snap)0
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__formatting__bibtex_internal_wrap_long_lines.snap (renamed from support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__formatting__bibtex_internal_wrap_long_lines.snap)0
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__hover__citation_inside_cite.snap (renamed from support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__hover__citation_inside_cite.snap)0
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__hover__citation_inside_entry.snap (renamed from support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__hover__citation_inside_entry.snap)0
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__hover__component_known_package.snap (renamed from support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__hover__component_known_package.snap)0
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__hover__entry_type_known_type.snap (renamed from support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__hover__entry_type_known_type.snap)0
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__hover__field_known.snap (renamed from support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__hover__field_known.snap)0
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__hover__label_theorem_child_file.snap (renamed from support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__hover__label_theorem_child_file.snap)0
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__hover__label_theorem_child_file_mumber.snap (renamed from support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__hover__label_theorem_child_file_mumber.snap)0
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__hover__section.snap (renamed from support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__hover__section.snap)0
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__hover__string_inside_reference.snap (renamed from support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__hover__string_inside_reference.snap)0
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__inlay_hint__label_definition.snap (renamed from support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__inlay_hint__label_definition.snap)0
-rw-r--r--support/texlab/crates/texlab/tests/lsp/workspace.rs (renamed from support/texlab/tests/lsp/workspace.rs)0
-rw-r--r--support/texlab/crates/texlab/tests/lsp/workspace/snapshots/lsp__workspace__symbol__filter_bibtex.snap (renamed from support/texlab/tests/lsp/workspace/snapshots/lsp__workspace__symbol__filter_bibtex.snap)6
-rw-r--r--support/texlab/crates/texlab/tests/lsp/workspace/snapshots/lsp__workspace__symbol__filter_type_figure.snap (renamed from support/texlab/tests/lsp/workspace/snapshots/lsp__workspace__symbol__filter_type_figure.snap)4
-rw-r--r--support/texlab/crates/texlab/tests/lsp/workspace/snapshots/lsp__workspace__symbol__filter_type_item.snap (renamed from support/texlab/tests/lsp/workspace/snapshots/lsp__workspace__symbol__filter_type_item.snap)8
-rw-r--r--support/texlab/crates/texlab/tests/lsp/workspace/snapshots/lsp__workspace__symbol__filter_type_math.snap (renamed from support/texlab/tests/lsp/workspace/snapshots/lsp__workspace__symbol__filter_type_math.snap)6
-rw-r--r--support/texlab/crates/texlab/tests/lsp/workspace/snapshots/lsp__workspace__symbol__filter_type_section.snap (renamed from support/texlab/tests/lsp/workspace/snapshots/lsp__workspace__symbol__filter_type_section.snap)10
-rw-r--r--support/texlab/crates/texlab/tests/lsp/workspace/symbol.rs (renamed from support/texlab/tests/lsp/workspace/symbol.rs)0
-rw-r--r--support/texlab/src/db.rs15
-rw-r--r--support/texlab/src/db/analysis.rs221
-rw-r--r--support/texlab/src/db/analysis/label.rs122
-rw-r--r--support/texlab/src/db/context.rs18
-rw-r--r--support/texlab/src/db/diagnostics.rs177
-rw-r--r--support/texlab/src/db/diagnostics/bib.rs112
-rw-r--r--support/texlab/src/db/diagnostics/log.rs100
-rw-r--r--support/texlab/src/db/diagnostics/tex.rs147
-rw-r--r--support/texlab/src/db/discovery.rs258
-rw-r--r--support/texlab/src/db/document.rs199
-rw-r--r--support/texlab/src/db/parse.rs79
-rw-r--r--support/texlab/src/db/workspace.rs211
-rw-r--r--support/texlab/src/features/completion/acronym_ref.rs29
-rw-r--r--support/texlab/src/features/completion/glossary_ref.rs35
-rw-r--r--support/texlab/src/features/completion/label.rs79
-rw-r--r--support/texlab/src/features/completion/theorem.rs21
-rw-r--r--support/texlab/src/features/completion/user_command.rs30
-rw-r--r--support/texlab/src/features/completion/user_environment.rs25
-rw-r--r--support/texlab/src/features/definition/command.rs41
-rw-r--r--support/texlab/src/features/definition/entry.rs43
-rw-r--r--support/texlab/src/features/definition/label.rs38
-rw-r--r--support/texlab/src/features/formatting.rs33
-rw-r--r--support/texlab/src/features/highlight.rs10
-rw-r--r--support/texlab/src/features/highlight/label.rs32
-rw-r--r--support/texlab/src/features/hover/component.rs28
-rw-r--r--support/texlab/src/features/hover/label.rs23
-rw-r--r--support/texlab/src/features/inlay_hint.rs45
-rw-r--r--support/texlab/src/features/inlay_hint/label.rs48
-rw-r--r--support/texlab/src/features/link.rs41
-rw-r--r--support/texlab/src/features/link/include.rs25
-rw-r--r--support/texlab/src/features/reference/label.rs36
-rw-r--r--support/texlab/src/features/rename/command.rs37
-rw-r--r--support/texlab/src/features/rename/label.rs76
-rw-r--r--support/texlab/src/features/symbol/project_order.rs202
-rw-r--r--support/texlab/src/features/workspace_command/dep_graph.rs57
-rw-r--r--support/texlab/src/lib.rs125
-rw-r--r--support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@generic_command_escape.txt.snap10
-rw-r--r--support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@parameter.txt.snap10
-rw-r--r--support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@parameter_error.txt.snap10
-rw-r--r--support/texlab/src/server/query.rs32
-rw-r--r--support/texlab/src/util/label.rs267
-rw-r--r--support/texlab/texlab.14
-rw-r--r--support/texlab/texlab.pdfbin26434 -> 26391 bytes
-rw-r--r--systems/texlive/tlnet/tlpkg/installer/ctan-mirrors.pl3
-rw-r--r--systems/texlive/tlnet/tlpkg/texlive.tlpdb60
-rw-r--r--systems/texlive/tlnet/tlpkg/texlive.tlpdb.md52
-rw-r--r--systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha5122
-rw-r--r--systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc14
-rw-r--r--systems/texlive/tlnet/tlpkg/texlive.tlpdb.xzbin2439876 -> 2440232 bytes
-rw-r--r--timestamp2
607 files changed, 16786 insertions, 16602 deletions
diff --git a/FILES.byname b/FILES.byname
index 47a1884ffc..5c14a44256 100644
--- a/FILES.byname
+++ b/FILES.byname
@@ -86,7 +86,7 @@
2022/09/02 | 16825 | biblio/bibtex/bibtex-x/bibtex.c
2022/05/17 | 68194 | biblio/bibtex/bibtex-x/bibtex.h
2023/02/25 | 4015 | biblio/bibtex/bibtex-x/bibtexu.1
-2023/02/25 | 20268 | biblio/bibtex/bibtex-x/ChangeLog
+2023/04/10 | 20399 | biblio/bibtex/bibtex-x/ChangeLog
2021/06/30 | 4848 | biblio/bibtex/bibtex-x/config.h.in
2007/07/03 | 710 | biblio/bibtex/bibtex-x/configure
2022/04/29 | 1499 | biblio/bibtex/bibtex-x/configure.ac
@@ -156,9 +156,9 @@
2022/04/16 | 504 | biblio/bibtex/bibtex-x/tests/sortu-fi.bbl
2022/04/16 | 504 | biblio/bibtex/bibtex-x/tests/sortu-tr.bbl
2022/04/16 | 65 | biblio/bibtex/bibtex-x/tests/substra.aux
-2022/05/17 | 5432 | biblio/bibtex/bibtex-x/tests/substra.bbl
+2023/04/10 | 5972 | biblio/bibtex/bibtex-x/tests/substra.bbl
2022/04/16 | 65 | biblio/bibtex/bibtex-x/tests/substru.aux
-2022/05/17 | 17563 | biblio/bibtex/bibtex-x/tests/substru.bbl
+2023/04/10 | 19075 | biblio/bibtex/bibtex-x/tests/substru.bbl
2022/05/08 | 151 | biblio/bibtex/bibtex-x/tests/testcasea.bib
2022/05/08 | 778 | biblio/bibtex/bibtex-x/tests/testcase.bst
2022/05/08 | 1054 | biblio/bibtex/bibtex-x/tests/testcaseu.bib
@@ -175,7 +175,7 @@
2022/04/16 | 716 | biblio/bibtex/bibtex-x/tests/testsortu.bib
2010/03/17 | 531 | biblio/bibtex/bibtex-x/tests/teststyle.bst
2022/05/17 | 309 | biblio/bibtex/bibtex-x/tests/testsubstra.bib
-2022/05/08 | 3740 | biblio/bibtex/bibtex-x/tests/testsubstr.bst
+2023/04/10 | 4135 | biblio/bibtex/bibtex-x/tests/testsubstr.bst
2022/05/17 | 1086 | biblio/bibtex/bibtex-x/tests/testsubstru.bib
2022/05/08 | 1051 | biblio/bibtex/bibtex-x/tests/testtxtprfx.bst
2022/04/29 | 5237 | biblio/bibtex/bibtex-x/tests/testwidtha.bib
@@ -204,7 +204,7 @@
2022/05/22 | 94162 | biblio/bibtex/bibtex-x/utils.c
2022/04/29 | 5163 | biblio/bibtex/bibtex-x/utils.h
2022/05/22 | 3731 | biblio/bibtex/bibtex-x/version.h
-2023/03/20 | 517965 | biblio/bibtex/bibtex-x.zip
+2023/04/11 | 518368 | biblio/bibtex/bibtex-x.zip
1991/09/08 | 918 | biblio/bibtex/contrib/abstyles/a4c.sty
1991/09/28 | 1000 | biblio/bibtex/contrib/abstyles/a4c.tex
1992/05/25 | 17727 | biblio/bibtex/contrib/abstyles/aabbrv.bst
@@ -2051,12 +2051,12 @@
2023/04/02 | 1675 | biblio/citation-style-language/README.md
2023/04/02 | 11957 | biblio/citation-style-language/vancouver.csl
2023/04/03 | 4503971 | biblio/citation-style-language.zip
-2023/04/10 | 1678 | biblio/ctan-bibdata/biblatex-ctan/ctan.bbx
+2023/04/11 | 1678 | biblio/ctan-bibdata/biblatex-ctan/ctan.bbx
2022/10/08 | 127 | biblio/ctan-bibdata/biblatex-ctan/ctan.cbx
-2023/04/10 | 2777199 | biblio/ctan-bibdata/ctan.bib
-2023/04/10 | 3662677 | biblio/ctan-bibdata/ctan.pdf
+2023/04/11 | 2777637 | biblio/ctan-bibdata/ctan.bib
+2023/04/11 | 3663579 | biblio/ctan-bibdata/ctan.pdf
2023/01/16 | 1489 | biblio/ctan-bibdata/README
-2023/04/10 | 4059583 | biblio/ctan-bibdata.zip
+2023/04/11 | 4061171 | biblio/ctan-bibdata.zip
2023/02/23 | 3126 | biblio/pbibtex/pbibtex-base/cpp.awk
2023/02/23 | 1009 | biblio/pbibtex/pbibtex-base/generate.sh
2023/02/23 | 22362 | biblio/pbibtex/pbibtex-base/jabbrv.bst
@@ -5412,7 +5412,7 @@
1990/10/02 | 5440 | dviware/vutex/vaxvms.hlp
1990/10/02 | 812 | dviware/vutex/vaxvms.ins
1990/10/02 | 127576 | dviware/vutex/vutex.web
-2023/04/10 | 100544 | FILES.last07days
+2023/04/11 | 98906 | FILES.last07days
2021/07/24 | 1139410 | fonts/aboensis/Aboensis.glyphs
2021/07/24 | 18907382 | fonts/aboensis/aboensis.pdf
2021/07/24 | 137860 | fonts/aboensis/Aboensis-Regular.otf
@@ -232202,17 +232202,17 @@
2017/04/21 | 1634 | macros/latex/contrib/phonrule/phonrule.sty
2017/04/21 | 492 | macros/latex/contrib/phonrule/README.md
2017/04/21 | 44782 | macros/latex/contrib/phonrule.zip
-2023/04/09 | 462 | macros/latex/contrib/photobook/DEPENDS.txt
-2023/04/09 | 1527 | macros/latex/contrib/photobook/LICENSE
-2023/04/09 | 10191 | macros/latex/contrib/photobook/Makefile
-2023/04/09 | 165042 | macros/latex/contrib/photobook/photobook.cls
-2023/04/09 | 143035 | macros/latex/contrib/photobook/photobook.pdf
-2023/04/09 | 1705 | macros/latex/contrib/photobook/README.md
-2023/04/09 | 4219 | macros/latex/contrib/photobook/scripts/cls2tex.sh
-2023/04/09 | 890 | macros/latex/contrib/photobook/scripts/make-spreads.cfg.example
-2023/04/09 | 16847 | macros/latex/contrib/photobook/scripts/make-spreads.sh
-2023/04/09 | 14221 | macros/latex/contrib/photobook/scripts/README.md
-2023/04/09 | 191900 | macros/latex/contrib/photobook.zip
+2023/04/11 | 462 | macros/latex/contrib/photobook/DEPENDS.txt
+2023/04/11 | 1527 | macros/latex/contrib/photobook/LICENSE
+2023/04/11 | 10191 | macros/latex/contrib/photobook/Makefile
+2023/04/11 | 164576 | macros/latex/contrib/photobook/photobook.cls
+2023/04/11 | 142873 | macros/latex/contrib/photobook/photobook.pdf
+2023/04/11 | 1705 | macros/latex/contrib/photobook/README.md
+2023/04/11 | 4219 | macros/latex/contrib/photobook/scripts/cls2tex.sh
+2023/04/11 | 890 | macros/latex/contrib/photobook/scripts/make-spreads.cfg.example
+2023/04/11 | 16847 | macros/latex/contrib/photobook/scripts/make-spreads.sh
+2023/04/11 | 14221 | macros/latex/contrib/photobook/scripts/README.md
+2023/04/11 | 191658 | macros/latex/contrib/photobook.zip
2004/07/15 | 1773 | macros/latex/contrib/photo/Makefile
2004/07/15 | 26571 | macros/latex/contrib/photo/photo.dtx
1999/07/25 | 595 | macros/latex/contrib/photo/photo.ins
@@ -244613,13 +244613,13 @@
2012/02/06 | 135018 | macros/luatex/latex/pgfmolbio/SampleScf.scf
2012/03/09 | 867 | macros/luatex/latex/pgfmolbio/SampleUniprot.txt
2013/07/31 | 923987 | macros/luatex/latex/pgfmolbio.zip
-2023/04/04 | 169134 | macros/luatex/latex/piton/piton.dtx
-2023/04/04 | 309157 | macros/luatex/latex/piton/piton-french.pdf
-2023/04/04 | 59937 | macros/luatex/latex/piton/piton-french.tex
+2023/04/11 | 174764 | macros/luatex/latex/piton/piton.dtx
+2023/04/11 | 309931 | macros/luatex/latex/piton/piton-french.pdf
+2023/04/10 | 62080 | macros/luatex/latex/piton/piton-french.tex
2023/02/11 | 1440 | macros/luatex/latex/piton/piton.ins
-2023/04/04 | 703435 | macros/luatex/latex/piton/piton.pdf
+2023/04/11 | 703833 | macros/luatex/latex/piton/piton.pdf
2022/11/09 | 890 | macros/luatex/latex/piton/README.md
-2023/04/04 | 738356 | macros/luatex/latex/piton.zip
+2023/04/11 | 740804 | macros/luatex/latex/piton.zip
2017/08/26 | 36035 | macros/luatex/latex/placeat/placeat.dtx
2017/08/26 | 4438 | macros/luatex/latex/placeat/placeat.lua
2017/08/26 | 97006 | macros/luatex/latex/placeat/placeat.pdf
@@ -281520,61 +281520,61 @@
2018/04/15 | 1313 | support/latex-git-log/po/de.po
2020/02/26 | 3353 | support/latex-git-log/README.md
2020/02/27 | 87742 | support/latex-git-log.zip
-2023/04/07 | 6163996 | support/latexindent/bin/linux/latexindent
-2023/04/07 | 6393199 | support/latexindent/bin/macos/latexindent
-2023/04/07 | 8703632 | support/latexindent/bin/windows/latexindent.exe
-2023/04/07 | 22877 | support/latexindent/defaultSettings.yaml
-2023/04/07 | 5908 | support/latexindent/documentation/contributors.bib
-2023/04/07 | 7161 | support/latexindent/documentation/figure-schematic.png
-2023/04/07 | 4402 | support/latexindent/documentation/latex-indent.bib
-2023/04/07 | 1243960 | support/latexindent/documentation/latexindent.pdf
-2023/04/07 | 430280 | support/latexindent/documentation/latexindent.tex
-2023/04/07 | 54385 | support/latexindent/documentation/latexindent-yaml-schema.json
-2023/04/07 | 44096 | support/latexindent/documentation/logo.png
-2023/04/07 | 65092 | support/latexindent/LatexIndent/AlignmentAtAmpersand.pm
-2023/04/07 | 24410 | support/latexindent/LatexIndent/Arguments.pm
-2023/04/07 | 7428 | support/latexindent/LatexIndent/BackUpFileProcedure.pm
-2023/04/07 | 4816 | support/latexindent/LatexIndent/BlankLines.pm
-2023/04/07 | 12646 | support/latexindent/LatexIndent/Braces.pm
-2023/04/07 | 5390 | support/latexindent/LatexIndent/Check.pm
-2023/04/07 | 10620 | support/latexindent/LatexIndent/Command.pm
-2023/04/07 | 25284 | support/latexindent/LatexIndent/Document.pm
-2023/04/07 | 1485 | support/latexindent/LatexIndent/DoubleBackSlash.pm
-2023/04/07 | 6271 | support/latexindent/LatexIndent/Else.pm
-2023/04/07 | 6807 | support/latexindent/LatexIndent/Environment.pm
-2023/04/07 | 11300 | support/latexindent/LatexIndent/FileContents.pm
-2023/04/07 | 8462 | support/latexindent/LatexIndent/FileExtension.pm
-2023/04/07 | 52668 | support/latexindent/LatexIndent/GetYamlSettings.pm
-2023/04/07 | 11142 | support/latexindent/LatexIndent/Heading.pm
-2023/04/07 | 13419 | support/latexindent/LatexIndent/HiddenChildren.pm
-2023/04/07 | 3482 | support/latexindent/LatexIndent/HorizontalWhiteSpace.pm
-2023/04/07 | 8829 | support/latexindent/LatexIndent/IfElseFi.pm
-2023/04/07 | 20797 | support/latexindent/LatexIndent/Indent.pm
-2023/04/07 | 6717 | support/latexindent/LatexIndent/Item.pm
-2023/04/07 | 5429 | support/latexindent/LatexIndent/KeyEqualsValuesBraces.pm
-2023/04/07 | 9839 | support/latexindent/LatexIndent/Lines.pm
-2023/04/07 | 13103 | support/latexindent/LatexIndent/LogFile.pm
-2023/04/07 | 2320 | support/latexindent/LatexIndent/Logger.pm
-2023/04/07 | 7280 | support/latexindent/LatexIndent/MandatoryArgument.pm
-2023/04/07 | 18522 | support/latexindent/LatexIndent/ModifyLineBreaks.pm
-2023/04/07 | 1558 | support/latexindent/latexindent-module-installer.pl
-2023/04/07 | 4339 | support/latexindent/LatexIndent/NamedGroupingBracesBrackets.pm
-2023/04/07 | 6522 | support/latexindent/LatexIndent/OptionalArgument.pm
-2023/04/07 | 3413 | support/latexindent/latexindent.pl
-2023/04/07 | 2690 | support/latexindent/LatexIndent/Preamble.pm
-2023/04/07 | 3747 | support/latexindent/LatexIndent/Replacement.pm
-2023/04/07 | 4365 | support/latexindent/LatexIndent/RoundBrackets.pm
-2023/04/07 | 20766 | support/latexindent/LatexIndent/Sentence.pm
-2023/04/07 | 13890 | support/latexindent/LatexIndent/Special.pm
-2023/04/07 | 2701 | support/latexindent/LatexIndent/Switches.pm
-2023/04/07 | 3339 | support/latexindent/LatexIndent/Tokens.pm
-2023/04/07 | 6882 | support/latexindent/LatexIndent/TrailingComments.pm
-2023/04/07 | 5808 | support/latexindent/LatexIndent/UnNamedGroupingBracesBrackets.pm
-2023/04/07 | 27328 | support/latexindent/LatexIndent/Verbatim.pm
-2023/04/07 | 838 | support/latexindent/LatexIndent/Version.pm
-2023/04/07 | 31148 | support/latexindent/LatexIndent/Wrap.pm
-2023/04/07 | 2008 | support/latexindent/README
-2023/04/07 | 11162198 | support/latexindent.zip
+2023/04/11 | 6164028 | support/latexindent/bin/linux/latexindent
+2023/04/11 | 6393230 | support/latexindent/bin/macos/latexindent
+2023/04/11 | 8703661 | support/latexindent/bin/windows/latexindent.exe
+2023/04/11 | 22877 | support/latexindent/defaultSettings.yaml
+2023/04/11 | 5908 | support/latexindent/documentation/contributors.bib
+2023/04/11 | 7161 | support/latexindent/documentation/figure-schematic.png
+2023/04/11 | 4402 | support/latexindent/documentation/latex-indent.bib
+2023/04/11 | 1244704 | support/latexindent/documentation/latexindent.pdf
+2023/04/11 | 430280 | support/latexindent/documentation/latexindent.tex
+2023/04/11 | 54385 | support/latexindent/documentation/latexindent-yaml-schema.json
+2023/04/11 | 44096 | support/latexindent/documentation/logo.png
+2023/04/11 | 65092 | support/latexindent/LatexIndent/AlignmentAtAmpersand.pm
+2023/04/11 | 24410 | support/latexindent/LatexIndent/Arguments.pm
+2023/04/11 | 7428 | support/latexindent/LatexIndent/BackUpFileProcedure.pm
+2023/04/11 | 4816 | support/latexindent/LatexIndent/BlankLines.pm
+2023/04/11 | 12646 | support/latexindent/LatexIndent/Braces.pm
+2023/04/11 | 5390 | support/latexindent/LatexIndent/Check.pm
+2023/04/11 | 10620 | support/latexindent/LatexIndent/Command.pm
+2023/04/11 | 25007 | support/latexindent/LatexIndent/Document.pm
+2023/04/11 | 1485 | support/latexindent/LatexIndent/DoubleBackSlash.pm
+2023/04/11 | 6271 | support/latexindent/LatexIndent/Else.pm
+2023/04/11 | 6807 | support/latexindent/LatexIndent/Environment.pm
+2023/04/11 | 11300 | support/latexindent/LatexIndent/FileContents.pm
+2023/04/11 | 8762 | support/latexindent/LatexIndent/FileExtension.pm
+2023/04/11 | 52668 | support/latexindent/LatexIndent/GetYamlSettings.pm
+2023/04/11 | 11142 | support/latexindent/LatexIndent/Heading.pm
+2023/04/11 | 13419 | support/latexindent/LatexIndent/HiddenChildren.pm
+2023/04/11 | 3482 | support/latexindent/LatexIndent/HorizontalWhiteSpace.pm
+2023/04/11 | 8829 | support/latexindent/LatexIndent/IfElseFi.pm
+2023/04/11 | 20797 | support/latexindent/LatexIndent/Indent.pm
+2023/04/11 | 6717 | support/latexindent/LatexIndent/Item.pm
+2023/04/11 | 5429 | support/latexindent/LatexIndent/KeyEqualsValuesBraces.pm
+2023/04/11 | 9839 | support/latexindent/LatexIndent/Lines.pm
+2023/04/11 | 13072 | support/latexindent/LatexIndent/LogFile.pm
+2023/04/11 | 2320 | support/latexindent/LatexIndent/Logger.pm
+2023/04/11 | 7280 | support/latexindent/LatexIndent/MandatoryArgument.pm
+2023/04/11 | 18522 | support/latexindent/LatexIndent/ModifyLineBreaks.pm
+2023/04/11 | 1558 | support/latexindent/latexindent-module-installer.pl
+2023/04/11 | 4339 | support/latexindent/LatexIndent/NamedGroupingBracesBrackets.pm
+2023/04/11 | 6522 | support/latexindent/LatexIndent/OptionalArgument.pm
+2023/04/11 | 3413 | support/latexindent/latexindent.pl
+2023/04/11 | 2690 | support/latexindent/LatexIndent/Preamble.pm
+2023/04/11 | 3747 | support/latexindent/LatexIndent/Replacement.pm
+2023/04/11 | 4365 | support/latexindent/LatexIndent/RoundBrackets.pm
+2023/04/11 | 20766 | support/latexindent/LatexIndent/Sentence.pm
+2023/04/11 | 13890 | support/latexindent/LatexIndent/Special.pm
+2023/04/11 | 2701 | support/latexindent/LatexIndent/Switches.pm
+2023/04/11 | 3339 | support/latexindent/LatexIndent/Tokens.pm
+2023/04/11 | 6882 | support/latexindent/LatexIndent/TrailingComments.pm
+2023/04/11 | 5808 | support/latexindent/LatexIndent/UnNamedGroupingBracesBrackets.pm
+2023/04/11 | 27328 | support/latexindent/LatexIndent/Verbatim.pm
+2023/04/11 | 838 | support/latexindent/LatexIndent/Version.pm
+2023/04/11 | 31148 | support/latexindent/LatexIndent/Wrap.pm
+2023/04/11 | 2008 | support/latexindent/README
+2023/04/11 | 11162542 | support/latexindent.zip
2021/10/26 | 16439 | support/latex-make/figlatex.dtx
2021/10/26 | 238535 | support/latex-make/figlatex.pdf
2001/06/07 | 302 | support/latexmake/latexmake.diz
@@ -284481,7 +284481,7 @@
2021/05/03 | 629 | support/TeX4ht/doc/README
2020/08/24 | 358454 | support/TeX4ht/doc/TeX4ht-doc.tex
2021/05/11 | 262 | support/TeX4ht/README
-2023/04/08 | 221392 | support/TeX4ht/source/ChangeLog
+2023/04/11 | 221829 | support/TeX4ht/source/ChangeLog
2021/05/03 | 1375 | support/TeX4ht/source/checklog.lua
2021/05/03 | 1189 | support/TeX4ht/source/common-code.tex
2021/05/03 | 2727 | support/TeX4ht/source/common-info.tex
@@ -284493,7 +284493,7 @@
2021/05/03 | 1121 | support/TeX4ht/source/README
2021/05/03 | 1744 | support/TeX4ht/source/t1fontmake.lua
2021/05/03 | 297 | support/TeX4ht/source/t1fontsample.tex
-2023/04/06 | 1157029 | support/TeX4ht/source/tex4ht-4ht.tex
+2023/04/11 | 1157234 | support/TeX4ht/source/tex4ht-4ht.tex
2021/05/03 | 7127 | support/TeX4ht/source/tex4ht-auto-script.tex
2021/05/16 | 1539 | support/TeX4ht/source/tex4ht-bibtex2.tex
2022/06/05 | 21307 | support/TeX4ht/source/tex4ht-cond4ht.tex
@@ -284682,540 +284682,548 @@
1994/01/18 | 7272 | support/tex-it/texitrc.unx
1994/01/18 | 25068 | support/tex-it/texit.tex
2006/03/12 | 50172 | support/tex-it.zip
-2023/03/26 | 869 | support/texlab/benches/bench_main.rs
-2023/03/26 | 50058 | support/texlab/Cargo.lock
-2023/03/26 | 2147 | support/texlab/Cargo.toml
-2023/03/26 | 26995 | support/texlab/CHANGELOG.md
-2023/03/26 | 181 | support/texlab/CONTRIBUTING.md
-2023/03/26 | 6970534 | support/texlab/data/components.json.gz
-2023/03/26 | 56243 | support/texlab/data/lang_data.json
-2023/03/26 | 380190 | support/texlab/images/demo.gif
-2023/03/26 | 35149 | support/texlab/LICENSE
-2023/03/26 | 3767 | support/texlab/README.md
-2023/03/26 | 22224 | support/texlab/src/citation/driver.rs
-2023/03/26 | 3231 | support/texlab/src/citation/entry.rs
-2023/03/26 | 1631 | support/texlab/src/citation/field/author.rs
-2023/03/26 | 2490 | support/texlab/src/citation/field/date.rs
-2023/03/26 | 1385 | support/texlab/src/citation/field/number.rs
-2023/03/26 | 60 | support/texlab/src/citation/field.rs
-2023/03/26 | 6933 | support/texlab/src/citation/field/text.rs
-2023/03/26 | 1760 | support/texlab/src/citation/output.rs
-2023/03/26 | 905 | support/texlab/src/citation.rs
-2023/03/26 | 1064 | support/texlab/src/citation/snapshots/texlab__citation__tests__article_aksin_2006.snap
-2023/03/26 | 800 | support/texlab/src/citation/snapshots/texlab__citation__tests__article_betram_1996.snap
-2023/03/26 | 1330 | support/texlab/src/citation/snapshots/texlab__citation__tests__article_blom_2021.snap
-2023/03/26 | 1062 | support/texlab/src/citation/snapshots/texlab__citation__tests__article_jain_1999.snap
-2023/03/26 | 1314 | support/texlab/src/citation/snapshots/texlab__citation__tests__article_kastenholz_2006.snap
-2023/03/26 | 988 | support/texlab/src/citation/snapshots/texlab__citation__tests__article_rivest_1978.snap
-2023/03/26 | 585 | support/texlab/src/citation/snapshots/texlab__citation__tests__book_aho_2006.snap
-2023/03/26 | 1411 | support/texlab/src/citation/snapshots/texlab__citation__tests__book_averroes_1998.snap
-2023/03/26 | 1223 | support/texlab/src/citation/snapshots/texlab__citation__tests__book_knuth_1984.snap
-2023/03/26 | 720 | support/texlab/src/citation/snapshots/texlab__citation__tests__collection_matuz_1990.snap
-2023/03/26 | 1176 | support/texlab/src/citation/snapshots/texlab__citation__tests__inproceedings_combi_2004.snap
-2023/03/26 | 1051 | support/texlab/src/citation/snapshots/texlab__citation__tests__inproceedings_erwin_2007.snap
-2023/03/26 | 1428 | support/texlab/src/citation/snapshots/texlab__citation__tests__mvbook_nietzsche_1988.snap
-2023/03/26 | 967 | support/texlab/src/citation/snapshots/texlab__citation__tests__patent_almendro_1998.snap
-2023/03/26 | 11874 | support/texlab/src/citation/tests.rs
-2023/03/26 | 3163 | support/texlab/src/client.rs
-2023/03/26 | 5215 | support/texlab/src/config.rs
-2023/03/26 | 3197 | support/texlab/src/db/analysis/label.rs
-2023/03/26 | 6456 | support/texlab/src/db/analysis.rs
-2023/03/26 | 778 | support/texlab/src/db/context.rs
-2023/03/26 | 3197 | support/texlab/src/db/diagnostics/bib.rs
-2023/03/26 | 2905 | support/texlab/src/db/diagnostics/log.rs
-2023/03/26 | 5843 | support/texlab/src/db/diagnostics.rs
-2023/03/26 | 4524 | support/texlab/src/db/diagnostics/tex.rs
-2023/03/26 | 7243 | support/texlab/src/db/discovery.rs
-2023/03/26 | 5440 | support/texlab/src/db/document.rs
-2023/03/26 | 1769 | support/texlab/src/db/parse.rs
-2023/03/26 | 255 | support/texlab/src/db.rs
-2023/03/26 | 6226 | support/texlab/src/db/workspace.rs
-2023/03/26 | 1816 | support/texlab/src/distro/file_name_db.rs
-2023/03/26 | 710 | support/texlab/src/distro/kpsewhich.rs
-2023/03/26 | 2467 | support/texlab/src/distro/miktex.rs
-2023/03/26 | 1955 | support/texlab/src/distro.rs
-2023/03/26 | 820 | support/texlab/src/distro/texlive.rs
-2023/03/26 | 1668 | support/texlab/src/features/build/progress.rs
-2023/03/26 | 5486 | support/texlab/src/features/build.rs
-2023/03/26 | 844 | support/texlab/src/features/completion/acronym_ref.rs
-2023/03/26 | 1752 | support/texlab/src/features/completion/argument.rs
-2023/03/26 | 283 | support/texlab/src/features/completion/begin_snippet.rs
-2023/03/26 | 25164 | support/texlab/src/features/completion/builder.rs
-2023/03/26 | 1710 | support/texlab/src/features/completion/citation.rs
-2023/03/26 | 1236 | support/texlab/src/features/completion/color_model.rs
-2023/03/26 | 499 | support/texlab/src/features/completion/color.rs
-2023/03/26 | 692 | support/texlab/src/features/completion/component_command.rs
-2023/03/26 | 533 | support/texlab/src/features/completion/component_environment.rs
-2023/03/26 | 711 | support/texlab/src/features/completion/entry_type.rs
-2023/03/26 | 849 | support/texlab/src/features/completion/field.rs
-2023/03/26 | 1221 | support/texlab/src/features/completion/glossary_ref.rs
-2023/03/26 | 1567 | support/texlab/src/features/completion/import.rs
-2023/03/26 | 4276 | support/texlab/src/features/completion/include.rs
-2023/03/26 | 3055 | support/texlab/src/features/completion/label.rs
-2023/03/26 | 1702 | support/texlab/src/features/completion.rs
-2023/03/26 | 576 | support/texlab/src/features/completion/theorem.rs
-2023/03/26 | 730 | support/texlab/src/features/completion/tikz_library.rs
-2023/03/26 | 864 | support/texlab/src/features/completion/user_command.rs
-2023/03/26 | 661 | support/texlab/src/features/completion/user_environment.rs
-2023/03/26 | 1331 | support/texlab/src/features/definition/command.rs
-2023/03/26 | 999 | support/texlab/src/features/definition/document.rs
-2023/03/26 | 1215 | support/texlab/src/features/definition/entry.rs
-2023/03/26 | 1258 | support/texlab/src/features/definition/label.rs
-2023/03/26 | 1870 | support/texlab/src/features/definition.rs
-2023/03/26 | 995 | support/texlab/src/features/definition/string.rs
-2023/03/26 | 2164 | support/texlab/src/features/folding.rs
-2023/03/26 | 7195 | support/texlab/src/features/formatting/bibtex_internal.rs
-2023/03/26 | 2071 | support/texlab/src/features/formatting/latexindent.rs
-2023/03/26 | 1088 | support/texlab/src/features/formatting.rs
-2023/03/26 | 5313 | support/texlab/src/features/forward_search.rs
-2023/03/26 | 1069 | support/texlab/src/features/highlight/label.rs
-2023/03/26 | 308 | support/texlab/src/features/highlight.rs
-2023/03/26 | 785 | support/texlab/src/features/hover/citation.rs
-2023/03/26 | 852 | support/texlab/src/features/hover/component.rs
-2023/03/26 | 556 | support/texlab/src/features/hover/entry_type.rs
-2023/03/26 | 613 | support/texlab/src/features/hover/field.rs
-2023/03/26 | 672 | support/texlab/src/features/hover/label.rs
-2023/03/26 | 1184 | support/texlab/src/features/hover.rs
-2023/03/26 | 1158 | support/texlab/src/features/hover/string_ref.rs
-2023/03/26 | 1536 | support/texlab/src/features/inlay_hint/label.rs
-2023/03/26 | 1173 | support/texlab/src/features/inlay_hint.rs
-2023/03/26 | 639 | support/texlab/src/features/link/include.rs
-2023/03/26 | 1025 | support/texlab/src/features/link.rs
-2023/03/26 | 1900 | support/texlab/src/features/reference/entry.rs
-2023/03/26 | 1027 | support/texlab/src/features/reference/label.rs
-2023/03/26 | 1123 | support/texlab/src/features/reference.rs
-2023/03/26 | 1367 | support/texlab/src/features/reference/string.rs
-2023/03/26 | 1318 | support/texlab/src/features/rename/command.rs
-2023/03/26 | 2263 | support/texlab/src/features/rename/entry.rs
-2023/03/26 | 2914 | support/texlab/src/features/rename/label.rs
-2023/03/26 | 1818 | support/texlab/src/features/rename.rs
-2023/03/26 | 262 | support/texlab/src/features.rs
-2023/03/26 | 2628 | support/texlab/src/features/symbol/bibtex.rs
-2023/03/26 | 13568 | support/texlab/src/features/symbol/latex.rs
-2023/03/26 | 5482 | support/texlab/src/features/symbol/project_order.rs
-2023/03/26 | 3337 | support/texlab/src/features/symbol.rs
-2023/03/26 | 4510 | support/texlab/src/features/symbol/types.rs
-2023/03/26 | 2867 | support/texlab/src/features/workspace_command/change_environment.rs
-2023/03/26 | 2612 | support/texlab/src/features/workspace_command/clean.rs
-2023/03/26 | 1534 | support/texlab/src/features/workspace_command/dep_graph.rs
-2023/03/26 | 62 | support/texlab/src/features/workspace_command.rs
-2023/03/26 | 3021 | support/texlab/src/lib.rs
-2023/03/26 | 1865 | support/texlab/src/main.rs
-2023/03/26 | 11459 | support/texlab/src/parser/bibtex.rs
-2023/03/26 | 5692 | support/texlab/src/parser/build_log.rs
-2023/03/26 | 5993 | support/texlab/src/parser/latex/lexer/commands.rs
-2023/03/26 | 1896 | support/texlab/src/parser/latex/lexer.rs
-2023/03/26 | 2565 | support/texlab/src/parser/latex/lexer/types.rs
-2023/03/26 | 32490 | support/texlab/src/parser/latex.rs
-2023/03/26 | 125 | support/texlab/src/parser.rs
-2023/03/26 | 220 | support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@comment.txt.snap
-2023/03/26 | 693 | support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@issue_809.txt.snap
-2023/03/26 | 359 | support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@preamble.txt.snap
-2023/03/26 | 3653 | support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@samples__aho_2006.txt.snap
-2023/03/26 | 7517 | support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@samples__aksin_2006.txt.snap
-2023/03/26 | 7308 | support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@samples__almendro_1998.txt.snap
-2023/03/26 | 10366 | support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@samples__averroes_1998.txt.snap
-2023/03/26 | 5850 | support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@samples__betram_1996.txt.snap
-2023/03/26 | 6630 | support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@samples__blom_2021.txt.snap
-2023/03/26 | 7143 | support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@samples__combi_2004.txt.snap
-2023/03/26 | 6822 | support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@samples__erwin_2007.txt.snap
-2023/03/26 | 7514 | support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@samples__jain_1999.txt.snap
-2023/03/26 | 8854 | support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@samples__kastenholz_2006.txt.snap
-2023/03/26 | 9465 | support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@samples__knuth_1984.txt.snap
-2023/03/26 | 5046 | support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@samples__matuz_1990.txt.snap
-2023/03/26 | 11001 | support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@samples__nietzsche_1998.txt.snap
-2023/03/26 | 6458 | support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@samples__rivest_1978.txt.snap
-2023/03/26 | 702 | support/texlab/src/parser/snapshots/texlab__parser__build_log__tests__parse@001.txt.snap
-2023/03/26 | 434 | support/texlab/src/parser/snapshots/texlab__parser__build_log__tests__parse@002.txt.snap
-2023/03/26 | 659 | support/texlab/src/parser/snapshots/texlab__parser__build_log__tests__parse@003.txt.snap
-2023/03/26 | 961 | support/texlab/src/parser/snapshots/texlab__parser__build_log__tests__parse@004.txt.snap
-2023/03/26 | 939 | support/texlab/src/parser/snapshots/texlab__parser__build_log__tests__parse@005.txt.snap
-2023/03/26 | 1658 | support/texlab/src/parser/snapshots/texlab__parser__build_log__tests__parse@006.txt.snap
-2023/03/26 | 399 | support/texlab/src/parser/snapshots/texlab__parser__build_log__tests__parse@007.txt.snap
-2023/03/26 | 732 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@block_comments.txt.snap
-2023/03/26 | 612 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@caption__caption_default_error.txt.snap
-2023/03/26 | 633 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@caption__caption_default.txt.snap
-2023/03/26 | 758 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@caption__caption_figure.txt.snap
-2023/03/26 | 485 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@caption__caption_minimal_error.txt.snap
-2023/03/26 | 506 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@caption__caption_minimal.txt.snap
-2023/03/26 | 281 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@citation__citation_empty.txt.snap
-2023/03/26 | 307 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@citation__citation_missing_brace.txt.snap
-2023/03/26 | 439 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@citation__citation_multiple_keys.txt.snap
-2023/03/26 | 594 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@citation__citation_prenote_postnote.txt.snap
-2023/03/26 | 458 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@citation__citation_prenote.txt.snap
-2023/03/26 | 390 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@citation__citation_redundant_comma.txt.snap
-2023/03/26 | 330 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@citation__citation_simple.txt.snap
-2023/03/26 | 328 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@citation__citation_star.txt.snap
-2023/03/26 | 720 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@color__color_definition_simple.txt.snap
-2023/03/26 | 342 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@color__color_reference_simple.txt.snap
-2023/03/26 | 835 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@color__color_set_definition_error1.txt.snap
-2023/03/26 | 574 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@color__color_set_definition_error2.txt.snap
-2023/03/26 | 443 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@color__color_set_definition_error3.txt.snap
-2023/03/26 | 234 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@color__color_set_definition_error4.txt.snap
-2023/03/26 | 966 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@color__color_set_definition_simple.txt.snap
-2023/03/26 | 490 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@command_definition__command_definition_no_argc.txt.snap
-2023/03/26 | 342 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@command_definition__command_definition_no_impl_error.txt.snap
-2023/03/26 | 363 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@command_definition__command_definition_no_impl.txt.snap
-2023/03/26 | 746 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@command_definition__command_definition_optional.txt.snap
-2023/03/26 | 631 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@command_definition__command_definition_simple.txt.snap
-2023/03/26 | 1163 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@command_definition__command_definition_with_begin.txt.snap
-2023/03/26 | 362 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@command_definition__math_operator_no_impl.txt.snap
-2023/03/26 | 488 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@command_definition__math_operator_simple.txt.snap
-2023/03/26 | 1060 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@environment__environment_asymptote.txt.snap
-2023/03/26 | 897 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@environment__environment_definition_optional_arg.txt.snap
-2023/03/26 | 1089 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@environment__environment_definition.txt.snap
-2023/03/26 | 1177 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@environment__environment_nested_missing_braces.txt.snap
-2023/03/26 | 1107 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@environment__environment_nested.txt.snap
-2023/03/26 | 728 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@environment__environment_simple.txt.snap
-2023/03/26 | 800 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@equation_missing_begin.txt.snap
-2023/03/26 | 365 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@equation.txt.snap
-2023/03/26 | 446 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@generic_command_args.txt.snap
-2023/03/26 | 202 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@generic_command_empty.txt.snap
-2023/03/26 | 201 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@generic_command_escape.txt.snap
-2023/03/26 | 1450 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@glossary__acronym_declaration.txt.snap
-2023/03/26 | 1345 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@glossary__acronym_definition_options.txt.snap
-2023/03/26 | 744 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@glossary__acronym_definition_simple.txt.snap
-2023/03/26 | 746 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@glossary__acronym_package.txt.snap
-2023/03/26 | 801 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@glossary__acronym_reference_options.txt.snap
-2023/03/26 | 358 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@glossary__acronym_reference_simple.txt.snap
-2023/03/26 | 951 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@glossary__glossary_entry_definition_simple.txt.snap
-2023/03/26 | 897 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@glossary__glossary_entry_reference_options.txt.snap
-2023/03/26 | 351 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@glossary__glossary_entry_reference_simple.txt.snap
-2023/03/26 | 610 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@graphics_path_command.txt.snap
-2023/03/26 | 538 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@graphics_path_options.txt.snap
-2023/03/26 | 433 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@graphics_path.txt.snap
-2023/03/26 | 298 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@group__curly_group_missing_end.txt.snap
-2023/03/26 | 318 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@group__curly_group_simple.txt.snap
-2023/03/26 | 807 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@group__equation_missing_end.txt.snap
-2023/03/26 | 370 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@group__escaped_brackets.txt.snap
-2023/03/26 | 228 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@group__unmatched_braces.txt.snap
-2023/03/26 | 230 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@group__unmatched_brackets.txt.snap
-2023/03/26 | 316 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@group__unmatched_brackets_with_group.txt.snap
-2023/03/26 | 228 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@hello_world.txt.snap
-2023/03/26 | 847 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__biblatex_include_options.txt.snap
-2023/03/26 | 372 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__biblatex_include_simple.txt.snap
-2023/03/26 | 362 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__bibtex_include_simple.txt.snap
-2023/03/26 | 309 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__class_include_empty.txt.snap
-2023/03/26 | 1052 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__class_include_options.txt.snap
-2023/03/26 | 361 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__class_include_simple.txt.snap
-2023/03/26 | 886 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__graphics_include_command.txt.snap
-2023/03/26 | 748 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__graphics_include_complicated_options.txt.snap
-2023/03/26 | 703 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__graphics_include_options.txt.snap
-2023/03/26 | 373 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__graphics_include_simple.txt.snap
-2023/03/26 | 302 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__import_incomplete.txt.snap
-2023/03/26 | 456 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__import_simple.txt.snap
-2023/03/26 | 689 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__inkscape_include_options.txt.snap
-2023/03/26 | 359 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__inkscape_include_simple.txt.snap
-2023/03/26 | 415 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__latex_include_equality_sign.txt.snap
-2023/03/26 | 349 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__latex_include_simple.txt.snap
-2023/03/26 | 463 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__latex_input_path_brackets.txt.snap
-2023/03/26 | 310 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__package_include_empty.txt.snap
-2023/03/26 | 469 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__package_include_multiple.txt.snap
-2023/03/26 | 1053 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__package_include_options.txt.snap
-2023/03/26 | 362 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__package_include_simple.txt.snap
-2023/03/26 | 368 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__pgf_library_import_simple.txt.snap
-2023/03/26 | 688 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__svg_include_options.txt.snap
-2023/03/26 | 358 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__svg_include_simple.txt.snap
-2023/03/26 | 370 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__tikz_library_import_simple.txt.snap
-2023/03/26 | 371 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__verbatim_include_simple.txt.snap
-2023/03/26 | 635 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@inline_double_dollar.txt.snap
-2023/03/26 | 617 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@inline.txt.snap
-2023/03/26 | 4286 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@issue_745.txt.snap
-2023/03/26 | 333 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@issue_789.txt.snap
-2023/03/26 | 1777 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@issue_853.txt.snap
-2023/03/26 | 890 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@issue_857.txt.snap
-2023/03/26 | 438 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@label__label_definition_line_break.txt.snap
-2023/03/26 | 342 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@label__label_definition_simple.txt.snap
-2023/03/26 | 549 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@label__label_number.txt.snap
-2023/03/26 | 347 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@label__label_reference_equation.txt.snap
-2023/03/26 | 811 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@label__label_reference_incomplete.txt.snap
-2023/03/26 | 442 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@label__label_reference_multiple.txt.snap
-2023/03/26 | 465 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@label__label_reference_range_error.txt.snap
-2023/03/26 | 366 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@label__label_reference_range_incomplete.txt.snap
-2023/03/26 | 493 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@label__label_reference_range_simple.txt.snap
-2023/03/26 | 335 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@label__label_reference_simple.txt.snap
-2023/03/26 | 173 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@parameter_error.txt.snap
-2023/03/26 | 168 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@parameter.txt.snap
-2023/03/26 | 1246 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@structure__structure_enum_item.txt.snap
-2023/03/26 | 551 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@structure__structure_invalid_nesting.txt.snap
-2023/03/26 | 1731 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@structure__structure_nested.txt.snap
-2023/03/26 | 692 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@structure__structure_siblings.txt.snap
-2023/03/26 | 757 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@theorem_definition__theorem_definition_full.txt.snap
-2023/03/26 | 512 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@theorem_definition__theorem_definition_name_with_counter.txt.snap
-2023/03/26 | 655 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@theorem_definition__theorem_definition_name_with_description_and_counter.txt.snap
-2023/03/26 | 512 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@theorem_definition__theorem_definition_name_with_description.txt.snap
-2023/03/26 | 373 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@theorem_definition__theorem_definition_only_name.txt.snap
-2023/03/26 | 82 | support/texlab/src/parser/test_data/bibtex/comment.txt
-2023/03/26 | 50 | support/texlab/src/parser/test_data/bibtex/issue_809.txt
-2023/03/26 | 25 | support/texlab/src/parser/test_data/bibtex/preamble.txt
-2023/03/26 | 314 | support/texlab/src/parser/test_data/bibtex/samples/aho_2006.txt
-2023/03/26 | 679 | support/texlab/src/parser/test_data/bibtex/samples/aksin_2006.txt
-2023/03/26 | 706 | support/texlab/src/parser/test_data/bibtex/samples/almendro_1998.txt
-2023/03/26 | 1008 | support/texlab/src/parser/test_data/bibtex/samples/averroes_1998.txt
-2023/03/26 | 556 | support/texlab/src/parser/test_data/bibtex/samples/betram_1996.txt
-2023/03/26 | 860 | support/texlab/src/parser/test_data/bibtex/samples/blom_2021.txt
-2023/03/26 | 674 | support/texlab/src/parser/test_data/bibtex/samples/combi_2004.txt
-2023/03/26 | 615 | support/texlab/src/parser/test_data/bibtex/samples/erwin_2007.txt
-2023/03/26 | 674 | support/texlab/src/parser/test_data/bibtex/samples/jain_1999.txt
-2023/03/26 | 898 | support/texlab/src/parser/test_data/bibtex/samples/kastenholz_2006.txt
-2023/03/26 | 993 | support/texlab/src/parser/test_data/bibtex/samples/knuth_1984.txt
-2023/03/26 | 517 | support/texlab/src/parser/test_data/bibtex/samples/matuz_1990.txt
-2023/03/26 | 1112 | support/texlab/src/parser/test_data/bibtex/samples/nietzsche_1998.txt
-2023/03/26 | 557 | support/texlab/src/parser/test_data/bibtex/samples/rivest_1978.txt
-2023/03/26 | 3194 | support/texlab/src/parser/test_data/build_log/001.txt
-2023/03/26 | 2455 | support/texlab/src/parser/test_data/build_log/002.txt
-2023/03/26 | 2515 | support/texlab/src/parser/test_data/build_log/003.txt
-2023/03/26 | 3057 | support/texlab/src/parser/test_data/build_log/004.txt
-2023/03/26 | 13353 | support/texlab/src/parser/test_data/build_log/005.txt
-2023/03/26 | 4130 | support/texlab/src/parser/test_data/build_log/006.txt
-2023/03/26 | 7762 | support/texlab/src/parser/test_data/build_log/007.txt
-2023/03/26 | 48 | support/texlab/src/parser/test_data/latex/block_comments.txt
-2023/03/26 | 26 | support/texlab/src/parser/test_data/latex/caption/caption_default_error.txt
-2023/03/26 | 27 | support/texlab/src/parser/test_data/latex/caption/caption_default.txt
-2023/03/26 | 39 | support/texlab/src/parser/test_data/latex/caption/caption_figure.txt
-2023/03/26 | 21 | support/texlab/src/parser/test_data/latex/caption/caption_minimal_error.txt
-2023/03/26 | 22 | support/texlab/src/parser/test_data/latex/caption/caption_minimal.txt
-2023/03/26 | 7 | support/texlab/src/parser/test_data/latex/citation/citation_empty.txt
-2023/03/26 | 9 | support/texlab/src/parser/test_data/latex/citation/citation_missing_brace.txt
-2023/03/26 | 15 | support/texlab/src/parser/test_data/latex/citation/citation_multiple_keys.txt
-2023/03/26 | 20 | support/texlab/src/parser/test_data/latex/citation/citation_prenote_postnote.txt
-2023/03/26 | 15 | support/texlab/src/parser/test_data/latex/citation/citation_prenote.txt
-2023/03/26 | 12 | support/texlab/src/parser/test_data/latex/citation/citation_redundant_comma.txt
-2023/03/26 | 10 | support/texlab/src/parser/test_data/latex/citation/citation_simple.txt
-2023/03/26 | 10 | support/texlab/src/parser/test_data/latex/citation/citation_star.txt
-2023/03/26 | 33 | support/texlab/src/parser/test_data/latex/color/color_definition_simple.txt
-2023/03/26 | 13 | support/texlab/src/parser/test_data/latex/color/color_reference_simple.txt
-2023/03/26 | 39 | support/texlab/src/parser/test_data/latex/color/color_set_definition_error1.txt
-2023/03/26 | 30 | support/texlab/src/parser/test_data/latex/color/color_set_definition_error2.txt
-2023/03/26 | 25 | support/texlab/src/parser/test_data/latex/color/color_set_definition_error3.txt
-2023/03/26 | 15 | support/texlab/src/parser/test_data/latex/color/color_set_definition_error4.txt
-2023/03/26 | 44 | support/texlab/src/parser/test_data/latex/color/color_set_definition_simple.txt
-2023/03/26 | 22 | support/texlab/src/parser/test_data/latex/command_definition/command_definition_no_argc.txt
-2023/03/26 | 16 | support/texlab/src/parser/test_data/latex/command_definition/command_definition_no_impl_error.txt
-2023/03/26 | 17 | support/texlab/src/parser/test_data/latex/command_definition/command_definition_no_impl.txt
-2023/03/26 | 29 | support/texlab/src/parser/test_data/latex/command_definition/command_definition_optional.txt
-2023/03/26 | 23 | support/texlab/src/parser/test_data/latex/command_definition/command_definition_simple.txt
-2023/03/26 | 80 | support/texlab/src/parser/test_data/latex/command_definition/command_definition_with_begin.txt
-2023/03/26 | 26 | support/texlab/src/parser/test_data/latex/command_definition/math_operator_no_impl.txt
-2023/03/26 | 31 | support/texlab/src/parser/test_data/latex/command_definition/math_operator_simple.txt
-2023/03/26 | 50 | support/texlab/src/parser/test_data/latex/environment/environment_asymptote.txt
-2023/03/26 | 44 | support/texlab/src/parser/test_data/latex/environment/environment_definition_optional_arg.txt
-2023/03/26 | 47 | support/texlab/src/parser/test_data/latex/environment/environment_definition.txt
-2023/03/26 | 52 | support/texlab/src/parser/test_data/latex/environment/environment_nested_missing_braces.txt
-2023/03/26 | 43 | support/texlab/src/parser/test_data/latex/environment/environment_nested.txt
-2023/03/26 | 33 | support/texlab/src/parser/test_data/latex/environment/environment_simple.txt
-2023/03/26 | 28 | support/texlab/src/parser/test_data/latex/equation_missing_begin.txt
-2023/03/26 | 13 | support/texlab/src/parser/test_data/latex/equation.txt
-2023/03/26 | 14 | support/texlab/src/parser/test_data/latex/generic_command_args.txt
-2023/03/26 | 4 | support/texlab/src/parser/test_data/latex/generic_command_empty.txt
-2023/03/26 | 2 | support/texlab/src/parser/test_data/latex/generic_command_escape.txt
-2023/03/26 | 64 | support/texlab/src/parser/test_data/latex/glossary/acronym_declaration.txt
-2023/03/26 | 76 | support/texlab/src/parser/test_data/latex/glossary/acronym_definition_options.txt
-2023/03/26 | 44 | support/texlab/src/parser/test_data/latex/glossary/acronym_definition_simple.txt
-2023/03/26 | 35 | support/texlab/src/parser/test_data/latex/glossary/acronym_package.txt
-2023/03/26 | 32 | support/texlab/src/parser/test_data/latex/glossary/acronym_reference_options.txt
-2023/03/26 | 19 | support/texlab/src/parser/test_data/latex/glossary/acronym_reference_simple.txt
-2023/03/26 | 39 | support/texlab/src/parser/test_data/latex/glossary/glossary_entry_definition_simple.txt
-2023/03/26 | 25 | support/texlab/src/parser/test_data/latex/glossary/glossary_entry_reference_options.txt
-2023/03/26 | 9 | support/texlab/src/parser/test_data/latex/glossary/glossary_entry_reference_simple.txt
-2023/03/26 | 32 | support/texlab/src/parser/test_data/latex/graphics_path_command.txt
-2023/03/26 | 33 | support/texlab/src/parser/test_data/latex/graphics_path_options.txt
-2023/03/26 | 28 | support/texlab/src/parser/test_data/latex/graphics_path.txt
-2023/03/26 | 12 | support/texlab/src/parser/test_data/latex/group/curly_group_missing_end.txt
-2023/03/26 | 13 | support/texlab/src/parser/test_data/latex/group/curly_group_simple.txt
-2023/03/26 | 28 | support/texlab/src/parser/test_data/latex/group/equation_missing_end.txt
-2023/03/26 | 6 | support/texlab/src/parser/test_data/latex/group/escaped_brackets.txt
-2023/03/26 | 2 | support/texlab/src/parser/test_data/latex/group/unmatched_braces.txt
-2023/03/26 | 2 | support/texlab/src/parser/test_data/latex/group/unmatched_brackets.txt
-2023/03/26 | 4 | support/texlab/src/parser/test_data/latex/group/unmatched_brackets_with_group.txt
-2023/03/26 | 12 | support/texlab/src/parser/test_data/latex/hello_world.txt
-2023/03/26 | 42 | support/texlab/src/parser/test_data/latex/include/biblatex_include_options.txt
-2023/03/26 | 28 | support/texlab/src/parser/test_data/latex/include/biblatex_include_simple.txt
-2023/03/26 | 22 | support/texlab/src/parser/test_data/latex/include/bibtex_include_simple.txt
-2023/03/26 | 16 | support/texlab/src/parser/test_data/latex/include/class_include_empty.txt
-2023/03/26 | 44 | support/texlab/src/parser/test_data/latex/include/class_include_options.txt
-2023/03/26 | 23 | support/texlab/src/parser/test_data/latex/include/class_include_simple.txt
-2023/03/26 | 52 | support/texlab/src/parser/test_data/latex/include/graphics_include_command.txt
-2023/03/26 | 39 | support/texlab/src/parser/test_data/latex/include/graphics_include_complicated_options.txt
-2023/03/26 | 39 | support/texlab/src/parser/test_data/latex/include/graphics_include_options.txt
-2023/03/26 | 29 | support/texlab/src/parser/test_data/latex/include/graphics_include_simple.txt
-2023/03/26 | 11 | support/texlab/src/parser/test_data/latex/include/import_incomplete.txt
-2023/03/26 | 17 | support/texlab/src/parser/test_data/latex/include/import_simple.txt
-2023/03/26 | 30 | support/texlab/src/parser/test_data/latex/include/inkscape_include_options.txt
-2023/03/26 | 20 | support/texlab/src/parser/test_data/latex/include/inkscape_include_simple.txt
-2023/03/26 | 17 | support/texlab/src/parser/test_data/latex/include/latex_include_equality_sign.txt
-2023/03/26 | 17 | support/texlab/src/parser/test_data/latex/include/latex_include_simple.txt
-2023/03/26 | 20 | support/texlab/src/parser/test_data/latex/include/latex_input_path_brackets.txt
-2023/03/26 | 13 | support/texlab/src/parser/test_data/latex/include/package_include_empty.txt
-2023/03/26 | 28 | support/texlab/src/parser/test_data/latex/include/package_include_multiple.txt
-2023/03/26 | 41 | support/texlab/src/parser/test_data/latex/include/package_include_options.txt
-2023/03/26 | 20 | support/texlab/src/parser/test_data/latex/include/package_include_simple.txt
-2023/03/26 | 19 | support/texlab/src/parser/test_data/latex/include/pgf_library_import_simple.txt
-2023/03/26 | 34 | support/texlab/src/parser/test_data/latex/include/svg_include_options.txt
-2023/03/26 | 24 | support/texlab/src/parser/test_data/latex/include/svg_include_simple.txt
-2023/03/26 | 20 | support/texlab/src/parser/test_data/latex/include/tikz_library_import_simple.txt
-2023/03/26 | 27 | support/texlab/src/parser/test_data/latex/include/verbatim_include_simple.txt
-2023/03/26 | 21 | support/texlab/src/parser/test_data/latex/inline_double_dollar.txt
-2023/03/26 | 19 | support/texlab/src/parser/test_data/latex/inline.txt
-2023/03/26 | 271 | support/texlab/src/parser/test_data/latex/issue_745.txt
-2023/03/26 | 19 | support/texlab/src/parser/test_data/latex/issue_789.txt
-2023/03/26 | 135 | support/texlab/src/parser/test_data/latex/issue_853.txt
-2023/03/26 | 55 | support/texlab/src/parser/test_data/latex/issue_857.txt
-2023/03/26 | 19 | support/texlab/src/parser/test_data/latex/label/label_definition_line_break.txt
-2023/03/26 | 11 | support/texlab/src/parser/test_data/latex/label/label_definition_simple.txt
-2023/03/26 | 21 | support/texlab/src/parser/test_data/latex/label/label_number.txt
-2023/03/26 | 11 | support/texlab/src/parser/test_data/latex/label/label_reference_equation.txt
-2023/03/26 | 47 | support/texlab/src/parser/test_data/latex/label/label_reference_incomplete.txt
-2023/03/26 | 14 | support/texlab/src/parser/test_data/latex/label/label_reference_multiple.txt
-2023/03/26 | 19 | support/texlab/src/parser/test_data/latex/label/label_reference_range_error.txt
-2023/03/26 | 15 | support/texlab/src/parser/test_data/latex/label/label_reference_range_incomplete.txt
-2023/03/26 | 20 | support/texlab/src/parser/test_data/latex/label/label_reference_range_simple.txt
-2023/03/26 | 9 | support/texlab/src/parser/test_data/latex/label/label_reference_simple.txt
-2023/03/26 | 1 | support/texlab/src/parser/test_data/latex/parameter_error.txt
-2023/03/26 | 2 | support/texlab/src/parser/test_data/latex/parameter.txt
-2023/03/26 | 60 | support/texlab/src/parser/test_data/latex/structure/structure_enum_item.txt
-2023/03/26 | 27 | support/texlab/src/parser/test_data/latex/structure/structure_invalid_nesting.txt
-2023/03/26 | 90 | support/texlab/src/parser/test_data/latex/structure/structure_nested.txt
-2023/03/26 | 35 | support/texlab/src/parser/test_data/latex/structure/structure_siblings.txt
-2023/03/26 | 31 | support/texlab/src/parser/test_data/latex/theorem_definition/theorem_definition_full.txt
-2023/03/26 | 21 | support/texlab/src/parser/test_data/latex/theorem_definition/theorem_definition_name_with_counter.txt
-2023/03/26 | 26 | support/texlab/src/parser/test_data/latex/theorem_definition/theorem_definition_name_with_description_and_counter.txt
-2023/03/26 | 21 | support/texlab/src/parser/test_data/latex/theorem_definition/theorem_definition_name_with_description.txt
-2023/03/26 | 16 | support/texlab/src/parser/test_data/latex/theorem_definition/theorem_definition_only_name.txt
-2023/03/26 | 2416 | support/texlab/src/server/dispatch.rs
-2023/03/26 | 6452 | support/texlab/src/server/options.rs
-2023/03/26 | 627 | support/texlab/src/server/query.rs
-2023/03/26 | 38464 | support/texlab/src/server.rs
-2023/03/26 | 7955 | support/texlab/src/syntax/bibtex.rs
-2023/03/26 | 16983 | support/texlab/src/syntax/latex/cst.rs
-2023/03/26 | 1668 | support/texlab/src/syntax/latex/kind.rs
-2023/03/26 | 689 | support/texlab/src/syntax/latex.rs
-2023/03/26 | 485 | support/texlab/src/syntax.rs
-2023/03/26 | 6018 | support/texlab/src/util/capabilities.rs
-2023/03/26 | 3430 | support/texlab/src/util/chktex.rs
-2023/03/26 | 3590 | support/texlab/src/util/components.rs
-2023/03/26 | 9926 | support/texlab/src/util/cursor.rs
-2023/03/26 | 8297 | support/texlab/src/util/label.rs
-2023/03/26 | 1969 | support/texlab/src/util/lang_data.rs
-2023/03/26 | 1280 | support/texlab/src/util/line_index_ext.rs
-2023/03/26 | 6484 | support/texlab/src/util/line_index.rs
-2023/03/26 | 4008 | support/texlab/src/util/lsp_enums.rs
-2023/03/26 | 415 | support/texlab/src/util/regex_filter.rs
-2023/03/26 | 319 | support/texlab/src/util.rs
-2023/03/26 | 8318 | support/texlab/tests/lsp/fixture.rs
-2023/03/26 | 47 | support/texlab/tests/lsp/main.rs
-2023/03/26 | 13426 | support/texlab/tests/lsp/text_document/completion.rs
-2023/03/26 | 3387 | support/texlab/tests/lsp/text_document/definition.rs
-2023/03/26 | 1322 | support/texlab/tests/lsp/text_document/document_highlight.rs
-2023/03/26 | 1157 | support/texlab/tests/lsp/text_document/document_link.rs
-2023/03/26 | 8171 | support/texlab/tests/lsp/text_document/document_symbol.rs
-2023/03/26 | 1208 | support/texlab/tests/lsp/text_document/folding_range.rs
-2023/03/26 | 3004 | support/texlab/tests/lsp/text_document/formatting.rs
-2023/03/26 | 3943 | support/texlab/tests/lsp/text_document/hover.rs
-2023/03/26 | 1737 | support/texlab/tests/lsp/text_document/inlay_hint.rs
-2023/03/26 | 4169 | support/texlab/tests/lsp/text_document/references.rs
-2023/03/26 | 1743 | support/texlab/tests/lsp/text_document/rename.rs
-2023/03/26 | 186 | support/texlab/tests/lsp/text_document.rs
-2023/03/26 | 226 | support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__acronym_package_ref.snap
-2023/03/26 | 265 | support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__acronym_ref_empty.snap
-2023/03/26 | 278 | support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__acronym_ref_open_brace.snap
-2023/03/26 | 279 | support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__acronym_ref_simple.snap
-2023/03/26 | 399 | support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__argument_empty.snap
-2023/03/26 | 404 | support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__argument_open_brace.snap
-2023/03/26 | 211 | support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__argument_word.snap
-2023/03/26 | 550 | support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__begin_environment_without_snippet_support.snap
-2023/03/26 | 313 | support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__citation_acronym.snap
-2023/03/26 | 291 | support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__citation_open_brace_multiple.snap
-2023/03/26 | 269 | support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__citation_open_brace.snap
-2023/03/26 | 583 | support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__citation.snap
-2023/03/26 | 407 | support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__color_model_definition_open_brace.snap
-2023/03/26 | 403 | support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__color_model_definition_set_open_brace.snap
-2023/03/26 | 404 | support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__color_model_definition_set_simple.snap
-2023/03/26 | 408 | support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__color_model_definition_simple.snap
-2023/03/26 | 404 | support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__color_open_brace.snap
-2023/03/26 | 405 | support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__color_simple.snap
-2023/03/26 | 414 | support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__color_word.snap
-2023/03/26 | 594 | support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__component_command_bibtex.snap
-2023/03/26 | 583 | support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__component_command_simple_package.snap
-2023/03/26 | 494 | support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__component_command_simple.snap
-2023/03/26 | 257 | support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__component_environment_class.snap
-2023/03/26 | 279 | support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__component_environment_command_definition.snap
-2023/03/26 | 544 | support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__component_environment_simple_end.snap
-2023/03/26 | 223 | support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__component_environment_simple.snap
-2023/03/26 | 194 | support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__entry_type_after_preamble.snap
-2023/03/26 | 186 | support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__entry_type_after_string.snap
-2023/03/26 | 384 | support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__entry_type_at_empty.snap
-2023/03/26 | 182 | support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__entry_type_before_article.snap
-2023/03/26 | 185 | support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__entry_type_before_preamble.snap
-2023/03/26 | 179 | support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__entry_type_before_string.snap
-2023/03/26 | 205 | support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__entry_type_complete_entry.snap
-2023/03/26 | 421 | support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__field_empty_entry_closed.snap
-2023/03/26 | 420 | support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__field_empty_entry_open.snap
-2023/03/26 | 441 | support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__field_entry_field_name.snap
-2023/03/26 | 486 | support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__field_entry_two_fields_name_closed.snap
-2023/03/26 | 485 | support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__field_entry_two_fields_name_open.snap
-2023/03/26 | 263 | support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__glossary_ref_open_brace.snap
-2023/03/26 | 264 | support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__glossary_ref_simple.snap
-2023/03/26 | 459 | support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__import_class_closed_brace.snap
-2023/03/26 | 464 | support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__import_class_open_brace.snap
-2023/03/26 | 449 | support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__import_package_closed_brace.snap
-2023/03/26 | 448 | support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__import_package_open_brace.snap
-2023/03/26 | 512 | support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__issue_857_1.snap
-2023/03/26 | 299 | support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__issue_864.snap
-2023/03/26 | 1814 | support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__label.snap
-2023/03/26 | 699 | support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__project_resolution_import.snap
-2023/03/26 | 711 | support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__project_resolution_texlabroot.snap
-2023/03/26 | 250 | support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__theorem_begin.snap
-2023/03/26 | 255 | support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__theorem_end.snap
-2023/03/26 | 452 | support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__tikz_library_closed_brace.snap
-2023/03/26 | 451 | support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__tikz_library_open_brace.snap
-2023/03/26 | 259 | support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__user_command.snap
-2023/03/26 | 351 | support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__user_environment.snap
-2023/03/26 | 351 | support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__document_link__document_import.snap
-2023/03/26 | 338 | support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__document_link__document_include.snap
-2023/03/26 | 1980 | support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__document_symbol__enumerate_flat.snap
-2023/03/26 | 3204 | support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__document_symbol__enumerate_nested.snap
-2023/03/26 | 1381 | support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__document_symbol__equation_flat.snap
-2023/03/26 | 1936 | support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__document_symbol__equation_nested.snap
-2023/03/26 | 1809 | support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__document_symbol__float_flat.snap
-2023/03/26 | 2368 | support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__document_symbol__float_nested.snap
-2023/03/26 | 766 | support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__document_symbol__ignored_patterns.snap
-2023/03/26 | 1465 | support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__document_symbol__section_flat.snap
-2023/03/26 | 2132 | support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__document_symbol__section_nested.snap
-2023/03/26 | 1821 | support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__document_symbol__theorem_flat.snap
-2023/03/26 | 2516 | support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__document_symbol__theorem_nested.snap
-2023/03/26 | 650 | support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__folding_range__bibtex.snap
-2023/03/26 | 841 | support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__folding_range__latex.snap
-2023/03/26 | 167 | support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__formatting__bibtex_internal_command.snap
-2023/03/26 | 157 | support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__formatting__bibtex_internal_insert_braces.snap
-2023/03/26 | 181 | support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__formatting__bibtex_internal_join_strings.snap
-2023/03/26 | 946 | support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__formatting__bibtex_internal_multiple_entries.snap
-2023/03/26 | 132 | support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__formatting__bibtex_internal_parens.snap
-2023/03/26 | 160 | support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__formatting__bibtex_internal_preamble.snap
-2023/03/26 | 143 | support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__formatting__bibtex_internal_string.snap
-2023/03/26 | 157 | support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__formatting__bibtex_internal_trailing_comma.snap
-2023/03/26 | 520 | support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__formatting__bibtex_internal_wrap_long_lines.snap
-2023/03/26 | 308 | support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__hover__citation_inside_cite.snap
-2023/03/26 | 314 | support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__hover__citation_inside_entry.snap
-2023/03/26 | 875 | support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__hover__component_known_package.snap
-2023/03/26 | 659 | support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__hover__entry_type_known_type.snap
-2023/03/26 | 234 | support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__hover__field_known.snap
-2023/03/26 | 406 | support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__hover__label_theorem_child_file_mumber.snap
-2023/03/26 | 332 | support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__hover__label_theorem_child_file.snap
-2023/03/26 | 212 | support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__hover__section.snap
-2023/03/26 | 272 | support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__hover__string_inside_reference.snap
-2023/03/26 | 1586 | support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__inlay_hint__label_definition.snap
-2023/03/26 | 12 | support/texlab/tests/lsp/workspace.rs
-2023/03/26 | 699 | support/texlab/tests/lsp/workspace/snapshots/lsp__workspace__symbol__filter_bibtex.snap
-2023/03/26 | 409 | support/texlab/tests/lsp/workspace/snapshots/lsp__workspace__symbol__filter_type_figure.snap
-2023/03/26 | 998 | support/texlab/tests/lsp/workspace/snapshots/lsp__workspace__symbol__filter_type_item.snap
-2023/03/26 | 719 | support/texlab/tests/lsp/workspace/snapshots/lsp__workspace__symbol__filter_type_math.snap
-2023/03/26 | 1313 | support/texlab/tests/lsp/workspace/snapshots/lsp__workspace__symbol__filter_type_section.snap
-2023/03/26 | 2970 | support/texlab/tests/lsp/workspace/symbol.rs
-2023/03/26 | 615 | support/texlab/texlab.1
-2023/03/26 | 26434 | support/texlab/texlab.pdf
-2023/03/26 | 2586 | support/texlab/texlab.tex
-2023/03/26 | 7708706 | support/texlab.zip
+2023/04/11 | 49947 | support/texlab/Cargo.lock
+2023/04/11 | 332 | support/texlab/Cargo.toml
+2023/04/11 | 27244 | support/texlab/CHANGELOG.md
+2023/04/11 | 181 | support/texlab/CONTRIBUTING.md
+2023/04/11 | 463 | support/texlab/crates/base-db/Cargo.toml
+2023/04/11 | 4941 | support/texlab/crates/base-db/src/config.rs
+2023/04/11 | 1955 | support/texlab/crates/base-db/src/diagnostics/bib.rs
+2023/04/11 | 2201 | support/texlab/crates/base-db/src/diagnostics/log.rs
+2023/04/11 | 430 | support/texlab/crates/base-db/src/diagnostics.rs
+2023/04/11 | 3546 | support/texlab/crates/base-db/src/diagnostics/tex.rs
+2023/04/11 | 4755 | support/texlab/crates/base-db/src/document.rs
+2023/04/11 | 5020 | support/texlab/crates/base-db/src/graph.rs
+2023/04/11 | 182 | support/texlab/crates/base-db/src/lib.rs
+2023/04/11 | 6484 | support/texlab/crates/base-db/src/line_index.rs
+2023/04/11 | 1170 | support/texlab/crates/base-db/src/semantics/auxiliary.rs
+2023/04/11 | 364 | support/texlab/crates/base-db/src/semantics.rs
+2023/04/11 | 9563 | support/texlab/crates/base-db/src/semantics/tex.rs
+2023/04/11 | 8868 | support/texlab/crates/base-db/src/workspace.rs
+2023/04/11 | 538 | support/texlab/crates/citeproc/Cargo.toml
+2023/04/11 | 22210 | support/texlab/crates/citeproc/src/driver.rs
+2023/04/11 | 4724 | support/texlab/crates/citeproc/src/entry.rs
+2023/04/11 | 2074 | support/texlab/crates/citeproc/src/field/author.rs
+2023/04/11 | 2665 | support/texlab/crates/citeproc/src/field/date.rs
+2023/04/11 | 1626 | support/texlab/crates/citeproc/src/field/number.rs
+2023/04/11 | 60 | support/texlab/crates/citeproc/src/field.rs
+2023/04/11 | 8955 | support/texlab/crates/citeproc/src/field/text.rs
+2023/04/11 | 890 | support/texlab/crates/citeproc/src/lib.rs
+2023/04/11 | 1760 | support/texlab/crates/citeproc/src/output.rs
+2023/04/11 | 1052 | support/texlab/crates/citeproc/src/snapshots/citeproc__tests__article_aksin_2006.snap
+2023/04/11 | 788 | support/texlab/crates/citeproc/src/snapshots/citeproc__tests__article_betram_1996.snap
+2023/04/11 | 1317 | support/texlab/crates/citeproc/src/snapshots/citeproc__tests__article_blom_2021.snap
+2023/04/11 | 1050 | support/texlab/crates/citeproc/src/snapshots/citeproc__tests__article_jain_1999.snap
+2023/04/11 | 1301 | support/texlab/crates/citeproc/src/snapshots/citeproc__tests__article_kastenholz_2006.snap
+2023/04/11 | 976 | support/texlab/crates/citeproc/src/snapshots/citeproc__tests__article_rivest_1978.snap
+2023/04/11 | 572 | support/texlab/crates/citeproc/src/snapshots/citeproc__tests__book_aho_2006.snap
+2023/04/11 | 1398 | support/texlab/crates/citeproc/src/snapshots/citeproc__tests__book_averroes_1998.snap
+2023/04/11 | 1210 | support/texlab/crates/citeproc/src/snapshots/citeproc__tests__book_knuth_1984.snap
+2023/04/11 | 707 | support/texlab/crates/citeproc/src/snapshots/citeproc__tests__collection_matuz_1990.snap
+2023/04/11 | 1163 | support/texlab/crates/citeproc/src/snapshots/citeproc__tests__inproceedings_combi_2004.snap
+2023/04/11 | 1038 | support/texlab/crates/citeproc/src/snapshots/citeproc__tests__inproceedings_erwin_2007.snap
+2023/04/11 | 1415 | support/texlab/crates/citeproc/src/snapshots/citeproc__tests__mvbook_nietzsche_1988.snap
+2023/04/11 | 954 | support/texlab/crates/citeproc/src/snapshots/citeproc__tests__patent_almendro_1998.snap
+2023/04/11 | 11868 | support/texlab/crates/citeproc/src/tests.rs
+2023/04/11 | 227 | support/texlab/crates/distro/Cargo.toml
+2023/04/11 | 1812 | support/texlab/crates/distro/src/file_name_db.rs
+2023/04/11 | 710 | support/texlab/crates/distro/src/kpsewhich.rs
+2023/04/11 | 1124 | support/texlab/crates/distro/src/language.rs
+2023/04/11 | 1997 | support/texlab/crates/distro/src/lib.rs
+2023/04/11 | 2467 | support/texlab/crates/distro/src/miktex.rs
+2023/04/11 | 820 | support/texlab/crates/distro/src/texlive.rs
+2023/04/11 | 386 | support/texlab/crates/parser/Cargo.toml
+2023/04/11 | 11420 | support/texlab/crates/parser/src/bibtex.rs
+2023/04/11 | 5684 | support/texlab/crates/parser/src/build_log.rs
+2023/04/11 | 5993 | support/texlab/crates/parser/src/latex/lexer/commands.rs
+2023/04/11 | 1897 | support/texlab/crates/parser/src/latex/lexer.rs
+2023/04/11 | 2552 | support/texlab/crates/parser/src/latex/lexer/types.rs
+2023/04/11 | 32603 | support/texlab/crates/parser/src/latex.rs
+2023/04/11 | 125 | support/texlab/crates/parser/src/lib.rs
+2023/04/11 | 234 | support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@comment.txt.snap
+2023/04/11 | 761 | support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@issue_809.txt.snap
+2023/04/11 | 373 | support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@preamble.txt.snap
+2023/04/11 | 3667 | support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@samples__aho_2006.txt.snap
+2023/04/11 | 7531 | support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@samples__aksin_2006.txt.snap
+2023/04/11 | 7322 | support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@samples__almendro_1998.txt.snap
+2023/04/11 | 10380 | support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@samples__averroes_1998.txt.snap
+2023/04/11 | 5864 | support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@samples__betram_1996.txt.snap
+2023/04/11 | 6644 | support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@samples__blom_2021.txt.snap
+2023/04/11 | 7157 | support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@samples__combi_2004.txt.snap
+2023/04/11 | 6836 | support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@samples__erwin_2007.txt.snap
+2023/04/11 | 7528 | support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@samples__jain_1999.txt.snap
+2023/04/11 | 8868 | support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@samples__kastenholz_2006.txt.snap
+2023/04/11 | 9479 | support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@samples__knuth_1984.txt.snap
+2023/04/11 | 5060 | support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@samples__matuz_1990.txt.snap
+2023/04/11 | 11015 | support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@samples__nietzsche_1998.txt.snap
+2023/04/11 | 6472 | support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@samples__rivest_1978.txt.snap
+2023/04/11 | 716 | support/texlab/crates/parser/src/snapshots/parser__build_log__tests__parse@001.txt.snap
+2023/04/11 | 448 | support/texlab/crates/parser/src/snapshots/parser__build_log__tests__parse@002.txt.snap
+2023/04/11 | 673 | support/texlab/crates/parser/src/snapshots/parser__build_log__tests__parse@003.txt.snap
+2023/04/11 | 975 | support/texlab/crates/parser/src/snapshots/parser__build_log__tests__parse@004.txt.snap
+2023/04/11 | 953 | support/texlab/crates/parser/src/snapshots/parser__build_log__tests__parse@005.txt.snap
+2023/04/11 | 1672 | support/texlab/crates/parser/src/snapshots/parser__build_log__tests__parse@006.txt.snap
+2023/04/11 | 464 | support/texlab/crates/parser/src/snapshots/parser__build_log__tests__parse@007.txt.snap
+2023/04/11 | 746 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@block_comments.txt.snap
+2023/04/11 | 626 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@caption__caption_default_error.txt.snap
+2023/04/11 | 647 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@caption__caption_default.txt.snap
+2023/04/11 | 772 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@caption__caption_figure.txt.snap
+2023/04/11 | 499 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@caption__caption_minimal_error.txt.snap
+2023/04/11 | 520 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@caption__caption_minimal.txt.snap
+2023/04/11 | 295 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@citation__citation_empty.txt.snap
+2023/04/11 | 321 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@citation__citation_missing_brace.txt.snap
+2023/04/11 | 453 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@citation__citation_multiple_keys.txt.snap
+2023/04/11 | 608 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@citation__citation_prenote_postnote.txt.snap
+2023/04/11 | 472 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@citation__citation_prenote.txt.snap
+2023/04/11 | 404 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@citation__citation_redundant_comma.txt.snap
+2023/04/11 | 344 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@citation__citation_simple.txt.snap
+2023/04/11 | 342 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@citation__citation_star.txt.snap
+2023/04/11 | 734 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@color__color_definition_simple.txt.snap
+2023/04/11 | 356 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@color__color_reference_simple.txt.snap
+2023/04/11 | 849 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@color__color_set_definition_error1.txt.snap
+2023/04/11 | 588 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@color__color_set_definition_error2.txt.snap
+2023/04/11 | 457 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@color__color_set_definition_error3.txt.snap
+2023/04/11 | 248 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@color__color_set_definition_error4.txt.snap
+2023/04/11 | 980 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@color__color_set_definition_simple.txt.snap
+2023/04/11 | 504 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@command_definition__command_definition_no_argc.txt.snap
+2023/04/11 | 356 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@command_definition__command_definition_no_impl_error.txt.snap
+2023/04/11 | 377 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@command_definition__command_definition_no_impl.txt.snap
+2023/04/11 | 760 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@command_definition__command_definition_optional.txt.snap
+2023/04/11 | 645 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@command_definition__command_definition_simple.txt.snap
+2023/04/11 | 1177 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@command_definition__command_definition_with_begin.txt.snap
+2023/04/11 | 376 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@command_definition__math_operator_no_impl.txt.snap
+2023/04/11 | 502 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@command_definition__math_operator_simple.txt.snap
+2023/04/11 | 1074 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@environment__environment_asymptote.txt.snap
+2023/04/11 | 911 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@environment__environment_definition_optional_arg.txt.snap
+2023/04/11 | 1103 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@environment__environment_definition.txt.snap
+2023/04/11 | 1191 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@environment__environment_nested_missing_braces.txt.snap
+2023/04/11 | 1121 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@environment__environment_nested.txt.snap
+2023/04/11 | 742 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@environment__environment_simple.txt.snap
+2023/04/11 | 814 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@equation_missing_begin.txt.snap
+2023/04/11 | 379 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@equation.txt.snap
+2023/04/11 | 460 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@generic_command_args.txt.snap
+2023/04/11 | 216 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@generic_command_empty.txt.snap
+2023/04/11 | 215 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@generic_command_escape.txt.snap
+2023/04/11 | 1464 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@glossary__acronym_declaration.txt.snap
+2023/04/11 | 1359 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@glossary__acronym_definition_options.txt.snap
+2023/04/11 | 758 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@glossary__acronym_definition_simple.txt.snap
+2023/04/11 | 760 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@glossary__acronym_package.txt.snap
+2023/04/11 | 815 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@glossary__acronym_reference_options.txt.snap
+2023/04/11 | 372 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@glossary__acronym_reference_simple.txt.snap
+2023/04/11 | 965 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@glossary__glossary_entry_definition_simple.txt.snap
+2023/04/11 | 911 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@glossary__glossary_entry_reference_options.txt.snap
+2023/04/11 | 365 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@glossary__glossary_entry_reference_simple.txt.snap
+2023/04/11 | 624 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@graphics_path_command.txt.snap
+2023/04/11 | 552 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@graphics_path_options.txt.snap
+2023/04/11 | 447 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@graphics_path.txt.snap
+2023/04/11 | 312 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@group__curly_group_missing_end.txt.snap
+2023/04/11 | 332 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@group__curly_group_simple.txt.snap
+2023/04/11 | 821 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@group__equation_missing_end.txt.snap
+2023/04/11 | 384 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@group__escaped_brackets.txt.snap
+2023/04/11 | 242 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@group__unmatched_braces.txt.snap
+2023/04/11 | 244 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@group__unmatched_brackets.txt.snap
+2023/04/11 | 330 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@group__unmatched_brackets_with_group.txt.snap
+2023/04/11 | 242 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@hello_world.txt.snap
+2023/04/11 | 861 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__biblatex_include_options.txt.snap
+2023/04/11 | 386 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__biblatex_include_simple.txt.snap
+2023/04/11 | 376 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__bibtex_include_simple.txt.snap
+2023/04/11 | 323 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__class_include_empty.txt.snap
+2023/04/11 | 1066 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__class_include_options.txt.snap
+2023/04/11 | 375 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__class_include_simple.txt.snap
+2023/04/11 | 900 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__graphics_include_command.txt.snap
+2023/04/11 | 762 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__graphics_include_complicated_options.txt.snap
+2023/04/11 | 717 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__graphics_include_options.txt.snap
+2023/04/11 | 387 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__graphics_include_simple.txt.snap
+2023/04/11 | 316 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__import_incomplete.txt.snap
+2023/04/11 | 470 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__import_simple.txt.snap
+2023/04/11 | 703 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__inkscape_include_options.txt.snap
+2023/04/11 | 373 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__inkscape_include_simple.txt.snap
+2023/04/11 | 429 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__latex_include_equality_sign.txt.snap
+2023/04/11 | 363 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__latex_include_simple.txt.snap
+2023/04/11 | 477 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__latex_input_path_brackets.txt.snap
+2023/04/11 | 324 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__package_include_empty.txt.snap
+2023/04/11 | 483 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__package_include_multiple.txt.snap
+2023/04/11 | 1067 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__package_include_options.txt.snap
+2023/04/11 | 376 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__package_include_simple.txt.snap
+2023/04/11 | 382 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__pgf_library_import_simple.txt.snap
+2023/04/11 | 702 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__svg_include_options.txt.snap
+2023/04/11 | 372 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__svg_include_simple.txt.snap
+2023/04/11 | 384 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__tikz_library_import_simple.txt.snap
+2023/04/11 | 385 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__verbatim_include_simple.txt.snap
+2023/04/11 | 649 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@inline_double_dollar.txt.snap
+2023/04/11 | 631 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@inline.txt.snap
+2023/04/11 | 4300 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@issue_745.txt.snap
+2023/04/11 | 347 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@issue_789.txt.snap
+2023/04/11 | 1791 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@issue_853.txt.snap
+2023/04/11 | 904 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@issue_857.txt.snap
+2023/04/11 | 745 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@issue_874.txt.snap
+2023/04/11 | 452 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@label__label_definition_line_break.txt.snap
+2023/04/11 | 356 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@label__label_definition_simple.txt.snap
+2023/04/11 | 563 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@label__label_number.txt.snap
+2023/04/11 | 361 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@label__label_reference_equation.txt.snap
+2023/04/11 | 825 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@label__label_reference_incomplete.txt.snap
+2023/04/11 | 456 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@label__label_reference_multiple.txt.snap
+2023/04/11 | 479 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@label__label_reference_range_error.txt.snap
+2023/04/11 | 380 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@label__label_reference_range_incomplete.txt.snap
+2023/04/11 | 507 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@label__label_reference_range_simple.txt.snap
+2023/04/11 | 349 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@label__label_reference_simple.txt.snap
+2023/04/11 | 187 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@parameter_error.txt.snap
+2023/04/11 | 182 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@parameter.txt.snap
+2023/04/11 | 1260 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@structure__structure_enum_item.txt.snap
+2023/04/11 | 565 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@structure__structure_invalid_nesting.txt.snap
+2023/04/11 | 1745 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@structure__structure_nested.txt.snap
+2023/04/11 | 706 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@structure__structure_siblings.txt.snap
+2023/04/11 | 771 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@theorem_definition__theorem_definition_full.txt.snap
+2023/04/11 | 526 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@theorem_definition__theorem_definition_name_with_counter.txt.snap
+2023/04/11 | 669 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@theorem_definition__theorem_definition_name_with_description_and_counter.txt.snap
+2023/04/11 | 526 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@theorem_definition__theorem_definition_name_with_description.txt.snap
+2023/04/11 | 387 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@theorem_definition__theorem_definition_only_name.txt.snap
+2023/04/11 | 82 | support/texlab/crates/parser/src/test_data/bibtex/comment.txt
+2023/04/11 | 50 | support/texlab/crates/parser/src/test_data/bibtex/issue_809.txt
+2023/04/11 | 25 | support/texlab/crates/parser/src/test_data/bibtex/preamble.txt
+2023/04/11 | 314 | support/texlab/crates/parser/src/test_data/bibtex/samples/aho_2006.txt
+2023/04/11 | 679 | support/texlab/crates/parser/src/test_data/bibtex/samples/aksin_2006.txt
+2023/04/11 | 706 | support/texlab/crates/parser/src/test_data/bibtex/samples/almendro_1998.txt
+2023/04/11 | 1008 | support/texlab/crates/parser/src/test_data/bibtex/samples/averroes_1998.txt
+2023/04/11 | 556 | support/texlab/crates/parser/src/test_data/bibtex/samples/betram_1996.txt
+2023/04/11 | 860 | support/texlab/crates/parser/src/test_data/bibtex/samples/blom_2021.txt
+2023/04/11 | 674 | support/texlab/crates/parser/src/test_data/bibtex/samples/combi_2004.txt
+2023/04/11 | 615 | support/texlab/crates/parser/src/test_data/bibtex/samples/erwin_2007.txt
+2023/04/11 | 674 | support/texlab/crates/parser/src/test_data/bibtex/samples/jain_1999.txt
+2023/04/11 | 898 | support/texlab/crates/parser/src/test_data/bibtex/samples/kastenholz_2006.txt
+2023/04/11 | 993 | support/texlab/crates/parser/src/test_data/bibtex/samples/knuth_1984.txt
+2023/04/11 | 517 | support/texlab/crates/parser/src/test_data/bibtex/samples/matuz_1990.txt
+2023/04/11 | 1112 | support/texlab/crates/parser/src/test_data/bibtex/samples/nietzsche_1998.txt
+2023/04/11 | 557 | support/texlab/crates/parser/src/test_data/bibtex/samples/rivest_1978.txt
+2023/04/11 | 3194 | support/texlab/crates/parser/src/test_data/build_log/001.txt
+2023/04/11 | 2455 | support/texlab/crates/parser/src/test_data/build_log/002.txt
+2023/04/11 | 2515 | support/texlab/crates/parser/src/test_data/build_log/003.txt
+2023/04/11 | 3057 | support/texlab/crates/parser/src/test_data/build_log/004.txt
+2023/04/11 | 13353 | support/texlab/crates/parser/src/test_data/build_log/005.txt
+2023/04/11 | 4130 | support/texlab/crates/parser/src/test_data/build_log/006.txt
+2023/04/11 | 7762 | support/texlab/crates/parser/src/test_data/build_log/007.txt
+2023/04/11 | 48 | support/texlab/crates/parser/src/test_data/latex/block_comments.txt
+2023/04/11 | 26 | support/texlab/crates/parser/src/test_data/latex/caption/caption_default_error.txt
+2023/04/11 | 27 | support/texlab/crates/parser/src/test_data/latex/caption/caption_default.txt
+2023/04/11 | 39 | support/texlab/crates/parser/src/test_data/latex/caption/caption_figure.txt
+2023/04/11 | 21 | support/texlab/crates/parser/src/test_data/latex/caption/caption_minimal_error.txt
+2023/04/11 | 22 | support/texlab/crates/parser/src/test_data/latex/caption/caption_minimal.txt
+2023/04/11 | 7 | support/texlab/crates/parser/src/test_data/latex/citation/citation_empty.txt
+2023/04/11 | 9 | support/texlab/crates/parser/src/test_data/latex/citation/citation_missing_brace.txt
+2023/04/11 | 15 | support/texlab/crates/parser/src/test_data/latex/citation/citation_multiple_keys.txt
+2023/04/11 | 20 | support/texlab/crates/parser/src/test_data/latex/citation/citation_prenote_postnote.txt
+2023/04/11 | 15 | support/texlab/crates/parser/src/test_data/latex/citation/citation_prenote.txt
+2023/04/11 | 12 | support/texlab/crates/parser/src/test_data/latex/citation/citation_redundant_comma.txt
+2023/04/11 | 10 | support/texlab/crates/parser/src/test_data/latex/citation/citation_simple.txt
+2023/04/11 | 10 | support/texlab/crates/parser/src/test_data/latex/citation/citation_star.txt
+2023/04/11 | 33 | support/texlab/crates/parser/src/test_data/latex/color/color_definition_simple.txt
+2023/04/11 | 13 | support/texlab/crates/parser/src/test_data/latex/color/color_reference_simple.txt
+2023/04/11 | 39 | support/texlab/crates/parser/src/test_data/latex/color/color_set_definition_error1.txt
+2023/04/11 | 30 | support/texlab/crates/parser/src/test_data/latex/color/color_set_definition_error2.txt
+2023/04/11 | 25 | support/texlab/crates/parser/src/test_data/latex/color/color_set_definition_error3.txt
+2023/04/11 | 15 | support/texlab/crates/parser/src/test_data/latex/color/color_set_definition_error4.txt
+2023/04/11 | 44 | support/texlab/crates/parser/src/test_data/latex/color/color_set_definition_simple.txt
+2023/04/11 | 22 | support/texlab/crates/parser/src/test_data/latex/command_definition/command_definition_no_argc.txt
+2023/04/11 | 16 | support/texlab/crates/parser/src/test_data/latex/command_definition/command_definition_no_impl_error.txt
+2023/04/11 | 17 | support/texlab/crates/parser/src/test_data/latex/command_definition/command_definition_no_impl.txt
+2023/04/11 | 29 | support/texlab/crates/parser/src/test_data/latex/command_definition/command_definition_optional.txt
+2023/04/11 | 23 | support/texlab/crates/parser/src/test_data/latex/command_definition/command_definition_simple.txt
+2023/04/11 | 80 | support/texlab/crates/parser/src/test_data/latex/command_definition/command_definition_with_begin.txt
+2023/04/11 | 26 | support/texlab/crates/parser/src/test_data/latex/command_definition/math_operator_no_impl.txt
+2023/04/11 | 31 | support/texlab/crates/parser/src/test_data/latex/command_definition/math_operator_simple.txt
+2023/04/11 | 50 | support/texlab/crates/parser/src/test_data/latex/environment/environment_asymptote.txt
+2023/04/11 | 44 | support/texlab/crates/parser/src/test_data/latex/environment/environment_definition_optional_arg.txt
+2023/04/11 | 47 | support/texlab/crates/parser/src/test_data/latex/environment/environment_definition.txt
+2023/04/11 | 52 | support/texlab/crates/parser/src/test_data/latex/environment/environment_nested_missing_braces.txt
+2023/04/11 | 43 | support/texlab/crates/parser/src/test_data/latex/environment/environment_nested.txt
+2023/04/11 | 33 | support/texlab/crates/parser/src/test_data/latex/environment/environment_simple.txt
+2023/04/11 | 28 | support/texlab/crates/parser/src/test_data/latex/equation_missing_begin.txt
+2023/04/11 | 13 | support/texlab/crates/parser/src/test_data/latex/equation.txt
+2023/04/11 | 14 | support/texlab/crates/parser/src/test_data/latex/generic_command_args.txt
+2023/04/11 | 4 | support/texlab/crates/parser/src/test_data/latex/generic_command_empty.txt
+2023/04/11 | 2 | support/texlab/crates/parser/src/test_data/latex/generic_command_escape.txt
+2023/04/11 | 64 | support/texlab/crates/parser/src/test_data/latex/glossary/acronym_declaration.txt
+2023/04/11 | 76 | support/texlab/crates/parser/src/test_data/latex/glossary/acronym_definition_options.txt
+2023/04/11 | 44 | support/texlab/crates/parser/src/test_data/latex/glossary/acronym_definition_simple.txt
+2023/04/11 | 35 | support/texlab/crates/parser/src/test_data/latex/glossary/acronym_package.txt
+2023/04/11 | 32 | support/texlab/crates/parser/src/test_data/latex/glossary/acronym_reference_options.txt
+2023/04/11 | 19 | support/texlab/crates/parser/src/test_data/latex/glossary/acronym_reference_simple.txt
+2023/04/11 | 39 | support/texlab/crates/parser/src/test_data/latex/glossary/glossary_entry_definition_simple.txt
+2023/04/11 | 25 | support/texlab/crates/parser/src/test_data/latex/glossary/glossary_entry_reference_options.txt
+2023/04/11 | 9 | support/texlab/crates/parser/src/test_data/latex/glossary/glossary_entry_reference_simple.txt
+2023/04/11 | 32 | support/texlab/crates/parser/src/test_data/latex/graphics_path_command.txt
+2023/04/11 | 33 | support/texlab/crates/parser/src/test_data/latex/graphics_path_options.txt
+2023/04/11 | 28 | support/texlab/crates/parser/src/test_data/latex/graphics_path.txt
+2023/04/11 | 12 | support/texlab/crates/parser/src/test_data/latex/group/curly_group_missing_end.txt
+2023/04/11 | 13 | support/texlab/crates/parser/src/test_data/latex/group/curly_group_simple.txt
+2023/04/11 | 28 | support/texlab/crates/parser/src/test_data/latex/group/equation_missing_end.txt
+2023/04/11 | 6 | support/texlab/crates/parser/src/test_data/latex/group/escaped_brackets.txt
+2023/04/11 | 2 | support/texlab/crates/parser/src/test_data/latex/group/unmatched_braces.txt
+2023/04/11 | 2 | support/texlab/crates/parser/src/test_data/latex/group/unmatched_brackets.txt
+2023/04/11 | 4 | support/texlab/crates/parser/src/test_data/latex/group/unmatched_brackets_with_group.txt
+2023/04/11 | 12 | support/texlab/crates/parser/src/test_data/latex/hello_world.txt
+2023/04/11 | 42 | support/texlab/crates/parser/src/test_data/latex/include/biblatex_include_options.txt
+2023/04/11 | 28 | support/texlab/crates/parser/src/test_data/latex/include/biblatex_include_simple.txt
+2023/04/11 | 22 | support/texlab/crates/parser/src/test_data/latex/include/bibtex_include_simple.txt
+2023/04/11 | 16 | support/texlab/crates/parser/src/test_data/latex/include/class_include_empty.txt
+2023/04/11 | 44 | support/texlab/crates/parser/src/test_data/latex/include/class_include_options.txt
+2023/04/11 | 23 | support/texlab/crates/parser/src/test_data/latex/include/class_include_simple.txt
+2023/04/11 | 52 | support/texlab/crates/parser/src/test_data/latex/include/graphics_include_command.txt
+2023/04/11 | 39 | support/texlab/crates/parser/src/test_data/latex/include/graphics_include_complicated_options.txt
+2023/04/11 | 39 | support/texlab/crates/parser/src/test_data/latex/include/graphics_include_options.txt
+2023/04/11 | 29 | support/texlab/crates/parser/src/test_data/latex/include/graphics_include_simple.txt
+2023/04/11 | 11 | support/texlab/crates/parser/src/test_data/latex/include/import_incomplete.txt
+2023/04/11 | 17 | support/texlab/crates/parser/src/test_data/latex/include/import_simple.txt
+2023/04/11 | 30 | support/texlab/crates/parser/src/test_data/latex/include/inkscape_include_options.txt
+2023/04/11 | 20 | support/texlab/crates/parser/src/test_data/latex/include/inkscape_include_simple.txt
+2023/04/11 | 17 | support/texlab/crates/parser/src/test_data/latex/include/latex_include_equality_sign.txt
+2023/04/11 | 17 | support/texlab/crates/parser/src/test_data/latex/include/latex_include_simple.txt
+2023/04/11 | 20 | support/texlab/crates/parser/src/test_data/latex/include/latex_input_path_brackets.txt
+2023/04/11 | 13 | support/texlab/crates/parser/src/test_data/latex/include/package_include_empty.txt
+2023/04/11 | 28 | support/texlab/crates/parser/src/test_data/latex/include/package_include_multiple.txt
+2023/04/11 | 41 | support/texlab/crates/parser/src/test_data/latex/include/package_include_options.txt
+2023/04/11 | 20 | support/texlab/crates/parser/src/test_data/latex/include/package_include_simple.txt
+2023/04/11 | 19 | support/texlab/crates/parser/src/test_data/latex/include/pgf_library_import_simple.txt
+2023/04/11 | 34 | support/texlab/crates/parser/src/test_data/latex/include/svg_include_options.txt
+2023/04/11 | 24 | support/texlab/crates/parser/src/test_data/latex/include/svg_include_simple.txt
+2023/04/11 | 20 | support/texlab/crates/parser/src/test_data/latex/include/tikz_library_import_simple.txt
+2023/04/11 | 27 | support/texlab/crates/parser/src/test_data/latex/include/verbatim_include_simple.txt
+2023/04/11 | 21 | support/texlab/crates/parser/src/test_data/latex/inline_double_dollar.txt
+2023/04/11 | 19 | support/texlab/crates/parser/src/test_data/latex/inline.txt
+2023/04/11 | 271 | support/texlab/crates/parser/src/test_data/latex/issue_745.txt
+2023/04/11 | 19 | support/texlab/crates/parser/src/test_data/latex/issue_789.txt
+2023/04/11 | 135 | support/texlab/crates/parser/src/test_data/latex/issue_853.txt
+2023/04/11 | 55 | support/texlab/crates/parser/src/test_data/latex/issue_857.txt
+2023/04/11 | 37 | support/texlab/crates/parser/src/test_data/latex/issue_874.txt
+2023/04/11 | 19 | support/texlab/crates/parser/src/test_data/latex/label/label_definition_line_break.txt
+2023/04/11 | 11 | support/texlab/crates/parser/src/test_data/latex/label/label_definition_simple.txt
+2023/04/11 | 21 | support/texlab/crates/parser/src/test_data/latex/label/label_number.txt
+2023/04/11 | 11 | support/texlab/crates/parser/src/test_data/latex/label/label_reference_equation.txt
+2023/04/11 | 47 | support/texlab/crates/parser/src/test_data/latex/label/label_reference_incomplete.txt
+2023/04/11 | 14 | support/texlab/crates/parser/src/test_data/latex/label/label_reference_multiple.txt
+2023/04/11 | 19 | support/texlab/crates/parser/src/test_data/latex/label/label_reference_range_error.txt
+2023/04/11 | 15 | support/texlab/crates/parser/src/test_data/latex/label/label_reference_range_incomplete.txt
+2023/04/11 | 20 | support/texlab/crates/parser/src/test_data/latex/label/label_reference_range_simple.txt
+2023/04/11 | 9 | support/texlab/crates/parser/src/test_data/latex/label/label_reference_simple.txt
+2023/04/11 | 1 | support/texlab/crates/parser/src/test_data/latex/parameter_error.txt
+2023/04/11 | 2 | support/texlab/crates/parser/src/test_data/latex/parameter.txt
+2023/04/11 | 60 | support/texlab/crates/parser/src/test_data/latex/structure/structure_enum_item.txt
+2023/04/11 | 27 | support/texlab/crates/parser/src/test_data/latex/structure/structure_invalid_nesting.txt
+2023/04/11 | 90 | support/texlab/crates/parser/src/test_data/latex/structure/structure_nested.txt
+2023/04/11 | 35 | support/texlab/crates/parser/src/test_data/latex/structure/structure_siblings.txt
+2023/04/11 | 31 | support/texlab/crates/parser/src/test_data/latex/theorem_definition/theorem_definition_full.txt
+2023/04/11 | 21 | support/texlab/crates/parser/src/test_data/latex/theorem_definition/theorem_definition_name_with_counter.txt
+2023/04/11 | 26 | support/texlab/crates/parser/src/test_data/latex/theorem_definition/theorem_definition_name_with_description_and_counter.txt
+2023/04/11 | 21 | support/texlab/crates/parser/src/test_data/latex/theorem_definition/theorem_definition_name_with_description.txt
+2023/04/11 | 16 | support/texlab/crates/parser/src/test_data/latex/theorem_definition/theorem_definition_only_name.txt
+2023/04/11 | 227 | support/texlab/crates/syntax/Cargo.toml
+2023/04/11 | 7955 | support/texlab/crates/syntax/src/bibtex.rs
+2023/04/11 | 16983 | support/texlab/crates/syntax/src/latex/cst.rs
+2023/04/11 | 1668 | support/texlab/crates/syntax/src/latex/kind.rs
+2023/04/11 | 689 | support/texlab/crates/syntax/src/latex.rs
+2023/04/11 | 864 | support/texlab/crates/syntax/src/lib.rs
+2023/04/11 | 1205 | support/texlab/crates/texlab/benches/bench_main.rs
+2023/04/11 | 1812 | support/texlab/crates/texlab/Cargo.toml
+2023/04/11 | 6970534 | support/texlab/crates/texlab/data/components.json.gz
+2023/04/11 | 56243 | support/texlab/crates/texlab/data/lang_data.json
+2023/04/11 | 3163 | support/texlab/crates/texlab/src/client.rs
+2023/04/11 | 1668 | support/texlab/crates/texlab/src/features/build/progress.rs
+2023/04/11 | 4825 | support/texlab/crates/texlab/src/features/build.rs
+2023/04/11 | 838 | support/texlab/crates/texlab/src/features/completion/acronym_ref.rs
+2023/04/11 | 1717 | support/texlab/crates/texlab/src/features/completion/argument.rs
+2023/04/11 | 283 | support/texlab/crates/texlab/src/features/completion/begin_snippet.rs
+2023/04/11 | 24957 | support/texlab/crates/texlab/src/features/completion/builder.rs
+2023/04/11 | 1654 | support/texlab/crates/texlab/src/features/completion/citation.rs
+2023/04/11 | 1238 | support/texlab/crates/texlab/src/features/completion/color_model.rs
+2023/04/11 | 490 | support/texlab/crates/texlab/src/features/completion/color.rs
+2023/04/11 | 680 | support/texlab/crates/texlab/src/features/completion/component_command.rs
+2023/04/11 | 521 | support/texlab/crates/texlab/src/features/completion/component_environment.rs
+2023/04/11 | 702 | support/texlab/crates/texlab/src/features/completion/entry_type.rs
+2023/04/11 | 840 | support/texlab/crates/texlab/src/features/completion/field.rs
+2023/04/11 | 1191 | support/texlab/crates/texlab/src/features/completion/glossary_ref.rs
+2023/04/11 | 1556 | support/texlab/crates/texlab/src/features/completion/import.rs
+2023/04/11 | 4028 | support/texlab/crates/texlab/src/features/completion/include.rs
+2023/04/11 | 2815 | support/texlab/crates/texlab/src/features/completion/label.rs
+2023/04/11 | 1904 | support/texlab/crates/texlab/src/features/completion.rs
+2023/04/11 | 559 | support/texlab/crates/texlab/src/features/completion/theorem.rs
+2023/04/11 | 721 | support/texlab/crates/texlab/src/features/completion/tikz_library.rs
+2023/04/11 | 575 | support/texlab/crates/texlab/src/features/completion/user_command.rs
+2023/04/11 | 635 | support/texlab/crates/texlab/src/features/completion/user_environment.rs
+2023/04/11 | 1300 | support/texlab/crates/texlab/src/features/definition/command.rs
+2023/04/11 | 984 | support/texlab/crates/texlab/src/features/definition/document.rs
+2023/04/11 | 1191 | support/texlab/crates/texlab/src/features/definition/entry.rs
+2023/04/11 | 1161 | support/texlab/crates/texlab/src/features/definition/label.rs
+2023/04/11 | 1856 | support/texlab/crates/texlab/src/features/definition.rs
+2023/04/11 | 1037 | support/texlab/crates/texlab/src/features/definition/string.rs
+2023/04/11 | 2143 | support/texlab/crates/texlab/src/features/folding.rs
+2023/04/11 | 7196 | support/texlab/crates/texlab/src/features/formatting/bibtex_internal.rs
+2023/04/11 | 2007 | support/texlab/crates/texlab/src/features/formatting/latexindent.rs
+2023/04/11 | 1083 | support/texlab/crates/texlab/src/features/formatting.rs
+2023/04/11 | 5245 | support/texlab/crates/texlab/src/features/forward_search.rs
+2023/04/11 | 1049 | support/texlab/crates/texlab/src/features/highlight/label.rs
+2023/04/11 | 358 | support/texlab/crates/texlab/src/features/highlight.rs
+2023/04/11 | 749 | support/texlab/crates/texlab/src/features/hover/citation.rs
+2023/04/11 | 819 | support/texlab/crates/texlab/src/features/hover/component.rs
+2023/04/11 | 547 | support/texlab/crates/texlab/src/features/hover/entry_type.rs
+2023/04/11 | 604 | support/texlab/crates/texlab/src/features/hover/field.rs
+2023/04/11 | 851 | support/texlab/crates/texlab/src/features/hover/label.rs
+2023/04/11 | 1171 | support/texlab/crates/texlab/src/features/hover.rs
+2023/04/11 | 1189 | support/texlab/crates/texlab/src/features/hover/string_ref.rs
+2023/04/11 | 1327 | support/texlab/crates/texlab/src/features/inlay_hint/label.rs
+2023/04/11 | 1283 | support/texlab/crates/texlab/src/features/inlay_hint.rs
+2023/04/11 | 555 | support/texlab/crates/texlab/src/features/link/include.rs
+2023/04/11 | 932 | support/texlab/crates/texlab/src/features/link.rs
+2023/04/11 | 1898 | support/texlab/crates/texlab/src/features/reference/entry.rs
+2023/04/11 | 1007 | support/texlab/crates/texlab/src/features/reference/label.rs
+2023/04/11 | 1070 | support/texlab/crates/texlab/src/features/reference.rs
+2023/04/11 | 1402 | support/texlab/crates/texlab/src/features/reference/string.rs
+2023/04/11 | 1305 | support/texlab/crates/texlab/src/features/rename/command.rs
+2023/04/11 | 2292 | support/texlab/crates/texlab/src/features/rename/entry.rs
+2023/04/11 | 1066 | support/texlab/crates/texlab/src/features/rename/label.rs
+2023/04/11 | 1740 | support/texlab/crates/texlab/src/features/rename.rs
+2023/04/11 | 262 | support/texlab/crates/texlab/src/features.rs
+2023/04/11 | 2582 | support/texlab/crates/texlab/src/features/symbol/bibtex.rs
+2023/04/11 | 13414 | support/texlab/crates/texlab/src/features/symbol/latex.rs
+2023/04/11 | 5537 | support/texlab/crates/texlab/src/features/symbol/project_order.rs
+2023/04/11 | 3430 | support/texlab/crates/texlab/src/features/symbol.rs
+2023/04/11 | 4445 | support/texlab/crates/texlab/src/features/symbol/types.rs
+2023/04/11 | 2897 | support/texlab/crates/texlab/src/features/workspace_command/change_environment.rs
+2023/04/11 | 2456 | support/texlab/crates/texlab/src/features/workspace_command/clean.rs
+2023/04/11 | 1590 | support/texlab/crates/texlab/src/features/workspace_command/dep_graph.rs
+2023/04/11 | 62 | support/texlab/crates/texlab/src/features/workspace_command.rs
+2023/04/11 | 826 | support/texlab/crates/texlab/src/lib.rs
+2023/04/11 | 1865 | support/texlab/crates/texlab/src/main.rs
+2023/04/11 | 2411 | support/texlab/crates/texlab/src/server/dispatch.rs
+2023/04/11 | 6453 | support/texlab/crates/texlab/src/server/options.rs
+2023/04/11 | 37434 | support/texlab/crates/texlab/src/server.rs
+2023/04/11 | 6018 | support/texlab/crates/texlab/src/util/capabilities.rs
+2023/04/11 | 3729 | support/texlab/crates/texlab/src/util/chktex.rs
+2023/04/11 | 3500 | support/texlab/crates/texlab/src/util/components.rs
+2023/04/11 | 9648 | support/texlab/crates/texlab/src/util/cursor.rs
+2023/04/11 | 4157 | support/texlab/crates/texlab/src/util/diagnostics.rs
+2023/04/11 | 6224 | support/texlab/crates/texlab/src/util/label.rs
+2023/04/11 | 1969 | support/texlab/crates/texlab/src/util/lang_data.rs
+2023/04/11 | 1605 | support/texlab/crates/texlab/src/util/line_index_ext.rs
+2023/04/11 | 4008 | support/texlab/crates/texlab/src/util/lsp_enums.rs
+2023/04/11 | 415 | support/texlab/crates/texlab/src/util/regex_filter.rs
+2023/04/11 | 320 | support/texlab/crates/texlab/src/util.rs
+2023/04/11 | 8392 | support/texlab/crates/texlab/tests/lsp/fixture.rs
+2023/04/11 | 47 | support/texlab/crates/texlab/tests/lsp/main.rs
+2023/04/11 | 13426 | support/texlab/crates/texlab/tests/lsp/text_document/completion.rs
+2023/04/11 | 3387 | support/texlab/crates/texlab/tests/lsp/text_document/definition.rs
+2023/04/11 | 1322 | support/texlab/crates/texlab/tests/lsp/text_document/document_highlight.rs
+2023/04/11 | 1157 | support/texlab/crates/texlab/tests/lsp/text_document/document_link.rs
+2023/04/11 | 8171 | support/texlab/crates/texlab/tests/lsp/text_document/document_symbol.rs
+2023/04/11 | 1208 | support/texlab/crates/texlab/tests/lsp/text_document/folding_range.rs
+2023/04/11 | 3003 | support/texlab/crates/texlab/tests/lsp/text_document/formatting.rs
+2023/04/11 | 3943 | support/texlab/crates/texlab/tests/lsp/text_document/hover.rs
+2023/04/11 | 1737 | support/texlab/crates/texlab/tests/lsp/text_document/inlay_hint.rs
+2023/04/11 | 4169 | support/texlab/crates/texlab/tests/lsp/text_document/references.rs
+2023/04/11 | 1743 | support/texlab/crates/texlab/tests/lsp/text_document/rename.rs
+2023/04/11 | 186 | support/texlab/crates/texlab/tests/lsp/text_document.rs
+2023/04/11 | 226 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__acronym_package_ref.snap
+2023/04/11 | 265 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__acronym_ref_empty.snap
+2023/04/11 | 278 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__acronym_ref_open_brace.snap
+2023/04/11 | 279 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__acronym_ref_simple.snap
+2023/04/11 | 399 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__argument_empty.snap
+2023/04/11 | 404 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__argument_open_brace.snap
+2023/04/11 | 211 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__argument_word.snap
+2023/04/11 | 550 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__begin_environment_without_snippet_support.snap
+2023/04/11 | 313 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__citation_acronym.snap
+2023/04/11 | 291 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__citation_open_brace_multiple.snap
+2023/04/11 | 269 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__citation_open_brace.snap
+2023/04/11 | 583 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__citation.snap
+2023/04/11 | 407 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__color_model_definition_open_brace.snap
+2023/04/11 | 403 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__color_model_definition_set_open_brace.snap
+2023/04/11 | 404 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__color_model_definition_set_simple.snap
+2023/04/11 | 408 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__color_model_definition_simple.snap
+2023/04/11 | 404 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__color_open_brace.snap
+2023/04/11 | 405 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__color_simple.snap
+2023/04/11 | 414 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__color_word.snap
+2023/04/11 | 594 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__component_command_bibtex.snap
+2023/04/11 | 583 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__component_command_simple_package.snap
+2023/04/11 | 494 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__component_command_simple.snap
+2023/04/11 | 257 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__component_environment_class.snap
+2023/04/11 | 279 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__component_environment_command_definition.snap
+2023/04/11 | 544 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__component_environment_simple_end.snap
+2023/04/11 | 223 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__component_environment_simple.snap
+2023/04/11 | 194 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__entry_type_after_preamble.snap
+2023/04/11 | 186 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__entry_type_after_string.snap
+2023/04/11 | 384 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__entry_type_at_empty.snap
+2023/04/11 | 182 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__entry_type_before_article.snap
+2023/04/11 | 185 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__entry_type_before_preamble.snap
+2023/04/11 | 179 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__entry_type_before_string.snap
+2023/04/11 | 205 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__entry_type_complete_entry.snap
+2023/04/11 | 421 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__field_empty_entry_closed.snap
+2023/04/11 | 420 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__field_empty_entry_open.snap
+2023/04/11 | 441 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__field_entry_field_name.snap
+2023/04/11 | 486 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__field_entry_two_fields_name_closed.snap
+2023/04/11 | 485 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__field_entry_two_fields_name_open.snap
+2023/04/11 | 263 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__glossary_ref_open_brace.snap
+2023/04/11 | 264 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__glossary_ref_simple.snap
+2023/04/11 | 459 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__import_class_closed_brace.snap
+2023/04/11 | 464 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__import_class_open_brace.snap
+2023/04/11 | 449 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__import_package_closed_brace.snap
+2023/04/11 | 448 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__import_package_open_brace.snap
+2023/04/11 | 512 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__issue_857_1.snap
+2023/04/11 | 313 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__issue_864.snap
+2023/04/11 | 1814 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__label.snap
+2023/04/11 | 699 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__project_resolution_import.snap
+2023/04/11 | 711 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__project_resolution_texlabroot.snap
+2023/04/11 | 250 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__theorem_begin.snap
+2023/04/11 | 255 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__theorem_end.snap
+2023/04/11 | 452 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__tikz_library_closed_brace.snap
+2023/04/11 | 451 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__tikz_library_open_brace.snap
+2023/04/11 | 273 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__user_command.snap
+2023/04/11 | 351 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__user_environment.snap
+2023/04/11 | 368 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__document_link__document_import.snap
+2023/04/11 | 355 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__document_link__document_include.snap
+2023/04/11 | 2009 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__document_symbol__enumerate_flat.snap
+2023/04/11 | 3204 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__document_symbol__enumerate_nested.snap
+2023/04/11 | 1404 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__document_symbol__equation_flat.snap
+2023/04/11 | 1936 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__document_symbol__equation_nested.snap
+2023/04/11 | 1832 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__document_symbol__float_flat.snap
+2023/04/11 | 2368 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__document_symbol__float_nested.snap
+2023/04/11 | 783 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__document_symbol__ignored_patterns.snap
+2023/04/11 | 1488 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__document_symbol__section_flat.snap
+2023/04/11 | 2132 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__document_symbol__section_nested.snap
+2023/04/11 | 1847 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__document_symbol__theorem_flat.snap
+2023/04/11 | 2516 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__document_symbol__theorem_nested.snap
+2023/04/11 | 650 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__folding_range__bibtex.snap
+2023/04/11 | 841 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__folding_range__latex.snap
+2023/04/11 | 167 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__formatting__bibtex_internal_command.snap
+2023/04/11 | 157 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__formatting__bibtex_internal_insert_braces.snap
+2023/04/11 | 181 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__formatting__bibtex_internal_join_strings.snap
+2023/04/11 | 946 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__formatting__bibtex_internal_multiple_entries.snap
+2023/04/11 | 132 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__formatting__bibtex_internal_parens.snap
+2023/04/11 | 160 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__formatting__bibtex_internal_preamble.snap
+2023/04/11 | 143 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__formatting__bibtex_internal_string.snap
+2023/04/11 | 157 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__formatting__bibtex_internal_trailing_comma.snap
+2023/04/11 | 520 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__formatting__bibtex_internal_wrap_long_lines.snap
+2023/04/11 | 308 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__hover__citation_inside_cite.snap
+2023/04/11 | 314 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__hover__citation_inside_entry.snap
+2023/04/11 | 875 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__hover__component_known_package.snap
+2023/04/11 | 659 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__hover__entry_type_known_type.snap
+2023/04/11 | 234 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__hover__field_known.snap
+2023/04/11 | 406 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__hover__label_theorem_child_file_mumber.snap
+2023/04/11 | 332 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__hover__label_theorem_child_file.snap
+2023/04/11 | 212 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__hover__section.snap
+2023/04/11 | 272 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__hover__string_inside_reference.snap
+2023/04/11 | 1586 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__inlay_hint__label_definition.snap
+2023/04/11 | 12 | support/texlab/crates/texlab/tests/lsp/workspace.rs
+2023/04/11 | 719 | support/texlab/crates/texlab/tests/lsp/workspace/snapshots/lsp__workspace__symbol__filter_bibtex.snap
+2023/04/11 | 426 | support/texlab/crates/texlab/tests/lsp/workspace/snapshots/lsp__workspace__symbol__filter_type_figure.snap
+2023/04/11 | 1021 | support/texlab/crates/texlab/tests/lsp/workspace/snapshots/lsp__workspace__symbol__filter_type_item.snap
+2023/04/11 | 739 | support/texlab/crates/texlab/tests/lsp/workspace/snapshots/lsp__workspace__symbol__filter_type_math.snap
+2023/04/11 | 1339 | support/texlab/crates/texlab/tests/lsp/workspace/snapshots/lsp__workspace__symbol__filter_type_section.snap
+2023/04/11 | 2970 | support/texlab/crates/texlab/tests/lsp/workspace/symbol.rs
+2023/04/11 | 380190 | support/texlab/images/demo.gif
+2023/04/11 | 35149 | support/texlab/LICENSE
+2023/04/11 | 3767 | support/texlab/README.md
+2023/04/11 | 615 | support/texlab/texlab.1
+2023/04/11 | 26391 | support/texlab/texlab.pdf
+2023/04/11 | 2586 | support/texlab/texlab.tex
+2023/04/11 | 7720139 | support/texlab.zip
2011/11/27 | 456 | support/texlipse/plugin/1.5.0/README.TXT
2011/11/27 | 1726937 | support/texlipse/plugin/1.5.0/texlipse_1.5.0 src.zip
1999/01/30 | 6077 | support/texlist/README
@@ -290799,7 +290807,7 @@
2023/03/28 | 1588 | systems/texlive/tlnet/archive/collection-pictures.r66684.tar.xz
2023/01/26 | 976 | systems/texlive/tlnet/archive/collection-plaingeneric.r65622.tar.xz
2022/12/27 | 816 | systems/texlive/tlnet/archive/collection-pstricks.r65367.tar.xz
-2023/04/06 | 1688 | systems/texlive/tlnet/archive/collection-publishers.r66780.tar.xz
+2023/04/11 | 1696 | systems/texlive/tlnet/archive/collection-publishers.r66821.tar.xz
2020/03/04 | 340 | systems/texlive/tlnet/archive/collection-texworks.r54074.tar.xz
2023/02/20 | 388 | systems/texlive/tlnet/archive/collection-wintools.r65952.tar.xz
2022/11/08 | 660 | systems/texlive/tlnet/archive/collection-xetex.r64951.tar.xz
@@ -292325,8 +292333,10 @@
2020/11/25 | 10880 | systems/texlive/tlnet/archive/elsarticle.source.r56999.tar.xz
2022/04/06 | 349288 | systems/texlive/tlnet/archive/els-cas-templates.doc.r62931.tar.xz
2022/04/06 | 54856 | systems/texlive/tlnet/archive/els-cas-templates.r62931.tar.xz
-2022/05/01 | 1107648 | systems/texlive/tlnet/archive/elteikthesis.doc.r63186.tar.xz
-2022/05/01 | 5780 | systems/texlive/tlnet/archive/elteikthesis.r63186.tar.xz
+2023/04/11 | 1015496 | systems/texlive/tlnet/archive/elteiktdk.doc.r66821.tar.xz
+2023/04/11 | 2752 | systems/texlive/tlnet/archive/elteiktdk.r66821.tar.xz
+2023/04/11 | 1116288 | systems/texlive/tlnet/archive/elteikthesis.doc.r66820.tar.xz
+2023/04/11 | 5788 | systems/texlive/tlnet/archive/elteikthesis.r66820.tar.xz
2019/02/28 | 176308 | systems/texlive/tlnet/archive/eltex.doc.r15878.tar.xz
2019/02/28 | 12888 | systems/texlive/tlnet/archive/eltex.r15878.tar.xz
2019/02/28 | 2380 | systems/texlive/tlnet/archive/elvish.doc.r15878.tar.xz
@@ -294655,12 +294665,12 @@
2023/02/18 | 43256 | systems/texlive/tlnet/archive/kpathsea.amd64-freebsd.r65877.tar.xz
2023/02/20 | 38760 | systems/texlive/tlnet/archive/kpathsea.amd64-netbsd.r65923.tar.xz
2023/02/18 | 32400 | systems/texlive/tlnet/archive/kpathsea.armhf-linux.r65877.tar.xz
-2023/02/27 | 1040296 | systems/texlive/tlnet/archive/kpathsea.doc.r66209.tar.xz
+2023/04/11 | 1040300 | systems/texlive/tlnet/archive/kpathsea.doc.r66822.tar.xz
2023/02/18 | 39536 | systems/texlive/tlnet/archive/kpathsea.i386-freebsd.r65877.tar.xz
2023/02/18 | 43088 | systems/texlive/tlnet/archive/kpathsea.i386-linux.r65877.tar.xz
2023/02/20 | 35528 | systems/texlive/tlnet/archive/kpathsea.i386-netbsd.r65923.tar.xz
2023/02/18 | 41308 | systems/texlive/tlnet/archive/kpathsea.i386-solaris.r65877.tar.xz
-2023/02/27 | 32520 | systems/texlive/tlnet/archive/kpathsea.r66209.tar.xz
+2023/04/11 | 32584 | systems/texlive/tlnet/archive/kpathsea.r66822.tar.xz
2023/02/20 | 83868 | systems/texlive/tlnet/archive/kpathsea.universal-darwin.r65895.tar.xz
2023/02/20 | 518324 | systems/texlive/tlnet/archive/kpathsea.windows.r65891.tar.xz
2023/03/11 | 45896 | systems/texlive/tlnet/archive/kpathsea.x86_64-cygwin.r66544.tar.xz
@@ -299927,13 +299937,13 @@
2022/02/27 | 108804 | systems/texlive/tlnet/archive/tex4ht.amd64-freebsd.r62206.tar.xz
2023/02/20 | 87356 | systems/texlive/tlnet/archive/tex4ht.amd64-netbsd.r65923.tar.xz
2022/04/21 | 69948 | systems/texlive/tlnet/archive/tex4ht.armhf-linux.r63092.tar.xz
-2023/04/09 | 136384 | systems/texlive/tlnet/archive/tex4ht.doc.r66806.tar.xz
+2023/04/11 | 136384 | systems/texlive/tlnet/archive/tex4ht.doc.r66823.tar.xz
2022/02/27 | 93760 | systems/texlive/tlnet/archive/tex4ht.i386-freebsd.r62206.tar.xz
2022/02/27 | 91280 | systems/texlive/tlnet/archive/tex4ht.i386-linux.r62210.tar.xz
2023/02/20 | 76164 | systems/texlive/tlnet/archive/tex4ht.i386-netbsd.r65923.tar.xz
2022/02/27 | 83964 | systems/texlive/tlnet/archive/tex4ht.i386-solaris.r62206.tar.xz
-2023/04/09 | 1133944 | systems/texlive/tlnet/archive/tex4ht.r66806.tar.xz
-2023/04/09 | 1443208 | systems/texlive/tlnet/archive/tex4ht.source.r66806.tar.xz
+2023/04/11 | 1133984 | systems/texlive/tlnet/archive/tex4ht.r66823.tar.xz
+2023/04/11 | 1447948 | systems/texlive/tlnet/archive/tex4ht.source.r66823.tar.xz
2023/02/20 | 184636 | systems/texlive/tlnet/archive/tex4ht.universal-darwin.r65895.tar.xz
2023/02/20 | 62196 | systems/texlive/tlnet/archive/tex4ht.windows.r65891.tar.xz
2023/03/11 | 58016 | systems/texlive/tlnet/archive/tex4ht.x86_64-cygwin.r66544.tar.xz
@@ -300150,12 +300160,12 @@
2022/02/10 | 342980 | systems/texlive/tlnet/archive/texlive.infra.amd64-freebsd.r61925.tar.xz
2022/04/17 | 377636 | systems/texlive/tlnet/archive/texlive.infra.amd64-netbsd.r62368.tar.xz
2022/02/10 | 159564 | systems/texlive/tlnet/archive/texlive.infra.armhf-linux.r61925.tar.xz
-2023/03/10 | 206432 | systems/texlive/tlnet/archive/texlive.infra.doc.r66512.tar.xz
+2023/04/11 | 206464 | systems/texlive/tlnet/archive/texlive.infra.doc.r66822.tar.xz
2022/02/10 | 310740 | systems/texlive/tlnet/archive/texlive.infra.i386-freebsd.r61925.tar.xz
2022/02/10 | 155752 | systems/texlive/tlnet/archive/texlive.infra.i386-linux.r61925.tar.xz
2022/04/17 | 362812 | systems/texlive/tlnet/archive/texlive.infra.i386-netbsd.r62368.tar.xz
2022/02/10 | 306488 | systems/texlive/tlnet/archive/texlive.infra.i386-solaris.r61925.tar.xz
-2023/03/10 | 352940 | systems/texlive/tlnet/archive/texlive.infra.r66512.tar.xz
+2023/04/11 | 353060 | systems/texlive/tlnet/archive/texlive.infra.r66822.tar.xz
2022/04/17 | 308304 | systems/texlive/tlnet/archive/texlive.infra.universal-darwin.r62358.tar.xz
2023/02/20 | 3084040 | systems/texlive/tlnet/archive/texlive.infra.windows.r65931.tar.xz
2022/02/10 | 180056 | systems/texlive/tlnet/archive/texlive.infra.x86_64-cygwin.r61925.tar.xz
@@ -300193,7 +300203,7 @@
2022/09/13 | 600 | systems/texlive/tlnet/archive/texlive-scripts.amd64-freebsd.r64356.tar.xz
2022/09/13 | 596 | systems/texlive/tlnet/archive/texlive-scripts.amd64-netbsd.r64356.tar.xz
2022/09/13 | 596 | systems/texlive/tlnet/archive/texlive-scripts.armhf-linux.r64356.tar.xz
-2023/04/10 | 423552 | systems/texlive/tlnet/archive/texlive-scripts.doc.r66811.tar.xz
+2023/04/11 | 423552 | systems/texlive/tlnet/archive/texlive-scripts.doc.r66817.tar.xz
2020/01/27 | 916 | systems/texlive/tlnet/archive/texlive-scripts-extra.aarch64-linux.r53577.tar.xz
2020/01/27 | 924 | systems/texlive/tlnet/archive/texlive-scripts-extra.amd64-freebsd.r53577.tar.xz
2020/01/27 | 916 | systems/texlive/tlnet/archive/texlive-scripts-extra.amd64-netbsd.r53577.tar.xz
@@ -300215,7 +300225,7 @@
2022/09/13 | 592 | systems/texlive/tlnet/archive/texlive-scripts.i386-linux.r64356.tar.xz
2022/09/13 | 596 | systems/texlive/tlnet/archive/texlive-scripts.i386-netbsd.r64356.tar.xz
2022/09/13 | 596 | systems/texlive/tlnet/archive/texlive-scripts.i386-solaris.r64356.tar.xz
-2023/04/10 | 114016 | systems/texlive/tlnet/archive/texlive-scripts.r66811.tar.xz
+2023/04/11 | 114032 | systems/texlive/tlnet/archive/texlive-scripts.r66817.tar.xz
2022/09/13 | 580 | systems/texlive/tlnet/archive/texlive-scripts.universal-darwin.r64356.tar.xz
2023/03/08 | 60300 | systems/texlive/tlnet/archive/texlive-scripts.windows.r66427.tar.xz
2022/09/13 | 596 | systems/texlive/tlnet/archive/texlive-scripts.x86_64-cygwin.r64356.tar.xz
@@ -301021,9 +301031,9 @@
2019/02/28 | 13868 | systems/texlive/tlnet/archive/uaclasses.source.r15878.tar.xz
2021/01/08 | 30020 | systems/texlive/tlnet/archive/uafthesis.doc.r57349.tar.xz
2021/01/08 | 7548 | systems/texlive/tlnet/archive/uafthesis.r57349.tar.xz
-2022/08/23 | 4343048 | systems/texlive/tlnet/archive/uantwerpendocs.doc.r64165.tar.xz
-2022/08/23 | 6475900 | systems/texlive/tlnet/archive/uantwerpendocs.r64165.tar.xz
-2022/08/23 | 43988 | systems/texlive/tlnet/archive/uantwerpendocs.source.r64165.tar.xz
+2023/04/11 | 4360632 | systems/texlive/tlnet/archive/uantwerpendocs.doc.r66819.tar.xz
+2023/04/11 | 6475944 | systems/texlive/tlnet/archive/uantwerpendocs.r66819.tar.xz
+2023/04/11 | 44216 | systems/texlive/tlnet/archive/uantwerpendocs.source.r66819.tar.xz
2019/02/28 | 106832 | systems/texlive/tlnet/archive/uassign.doc.r38459.tar.xz
2019/02/28 | 1984 | systems/texlive/tlnet/archive/uassign.r38459.tar.xz
2023/03/21 | 273308 | systems/texlive/tlnet/archive/ucalgmthesis.doc.r66602.tar.xz
@@ -302071,16 +302081,16 @@
2020/07/18 | 47816 | systems/texlive/tlnet/archive/zztex.doc.r55862.tar.xz
2020/07/18 | 101724 | systems/texlive/tlnet/archive/zztex.r55862.tar.xz
2023/03/12 | 125532 | systems/texlive/tlnet/install-tl
-2023/04/10 | 5735742 | systems/texlive/tlnet/install-tl-unx.tar.gz
-2023/04/10 | 152 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512
-2023/04/10 | 455 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512.asc
+2023/04/11 | 5735810 | systems/texlive/tlnet/install-tl-unx.tar.gz
+2023/04/11 | 152 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512
+2023/04/11 | 455 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512.asc
2023/02/19 | 5098 | systems/texlive/tlnet/install-tl-windows.bat
-2023/04/10 | 21036061 | systems/texlive/tlnet/install-tl-windows.exe
-2023/04/10 | 153 | systems/texlive/tlnet/install-tl-windows.exe.sha512
-2023/04/10 | 455 | systems/texlive/tlnet/install-tl-windows.exe.sha512.asc
-2023/04/10 | 26025645 | systems/texlive/tlnet/install-tl.zip
-2023/04/10 | 145 | systems/texlive/tlnet/install-tl.zip.sha512
-2023/04/10 | 455 | systems/texlive/tlnet/install-tl.zip.sha512.asc
+2023/04/11 | 21036561 | systems/texlive/tlnet/install-tl-windows.exe
+2023/04/11 | 153 | systems/texlive/tlnet/install-tl-windows.exe.sha512
+2023/04/11 | 455 | systems/texlive/tlnet/install-tl-windows.exe.sha512.asc
+2023/04/11 | 26025652 | systems/texlive/tlnet/install-tl.zip
+2023/04/11 | 145 | systems/texlive/tlnet/install-tl.zip.sha512
+2023/04/11 | 455 | systems/texlive/tlnet/install-tl.zip.sha512.asc
2023/03/19 | 1229 | systems/texlive/tlnet/README.md
2023/03/19 | 0 | systems/texlive/tlnet/TEXLIVE_2023
2023/01/17 | 8401 | systems/texlive/tlnet/tlpkg/gpg/pubring.gpg
@@ -302090,7 +302100,7 @@
2023/01/17 | 1280 | systems/texlive/tlnet/tlpkg/gpg/trustdb.gpg
2023/01/17 | 49938 | systems/texlive/tlnet/tlpkg/installer/config.guess
2010/11/11 | 11651 | systems/texlive/tlnet/tlpkg/installer/COPYING.MinGW-runtime.txt
-2023/04/09 | 7179 | systems/texlive/tlnet/tlpkg/installer/ctan-mirrors.pl
+2023/04/10 | 7143 | systems/texlive/tlnet/tlpkg/installer/ctan-mirrors.pl
2023/01/11 | 216583 | systems/texlive/tlnet/tlpkg/installer/curl/curl-ca-bundle.crt
2020/04/15 | 2606592 | systems/texlive/tlnet/tlpkg/installer/curl/curl.exe
2017/04/16 | 2629 | systems/texlive/tlnet/tlpkg/installer/installer-options.txt
@@ -302132,12 +302142,12 @@
2023/02/21 | 20371 | systems/texlive/tlnet/tlpkg/TeXLive/TLCrypto.pm
2021/12/21 | 5429 | systems/texlive/tlnet/tlpkg/TeXLive/TLDownload.pm
2023/04/08 | 28167 | systems/texlive/tlnet/tlpkg/TeXLive/TLPaper.pm
-2023/04/10 | 18035035 | systems/texlive/tlnet/tlpkg/texlive.tlpdb
-2023/04/10 | 48 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5
+2023/04/11 | 18038054 | systems/texlive/tlnet/tlpkg/texlive.tlpdb
+2023/04/11 | 48 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5
2023/02/20 | 86803 | systems/texlive/tlnet/tlpkg/TeXLive/TLPDB.pm
-2023/04/10 | 144 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512
-2023/04/10 | 455 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc
-2023/04/10 | 2438476 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz
+2023/04/11 | 144 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512
+2023/04/11 | 455 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc
+2023/04/11 | 2439876 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz
2023/02/20 | 58928 | systems/texlive/tlnet/tlpkg/TeXLive/TLPOBJ.pm
2023/02/26 | 42350 | systems/texlive/tlnet/tlpkg/TeXLive/TLPSRC.pm
2023/02/21 | 16138 | systems/texlive/tlnet/tlpkg/TeXLive/TLTREE.pm
@@ -304858,12 +304868,12 @@
2023/04/06 | 90624 | systems/texlive/tlnet/tlpkg/translations/vi.po
2023/04/06 | 63592 | systems/texlive/tlnet/tlpkg/translations/zh_CN.po
2023/04/06 | 61459 | systems/texlive/tlnet/tlpkg/translations/zh_TW.po
-2023/03/13 | 4669456 | systems/texlive/tlnet/update-tlmgr-r66512.exe
-2023/03/13 | 154 | systems/texlive/tlnet/update-tlmgr-r66512.exe.sha512
-2023/03/13 | 455 | systems/texlive/tlnet/update-tlmgr-r66512.exe.sha512.asc
-2023/03/13 | 9440395 | systems/texlive/tlnet/update-tlmgr-r66512.sh
-2023/03/13 | 153 | systems/texlive/tlnet/update-tlmgr-r66512.sh.sha512
-2023/03/13 | 455 | systems/texlive/tlnet/update-tlmgr-r66512.sh.sha512.asc
+2023/04/11 | 4669661 | systems/texlive/tlnet/update-tlmgr-r66822.exe
+2023/04/11 | 154 | systems/texlive/tlnet/update-tlmgr-r66822.exe.sha512
+2023/04/11 | 455 | systems/texlive/tlnet/update-tlmgr-r66822.exe.sha512.asc
+2023/04/11 | 9441276 | systems/texlive/tlnet/update-tlmgr-r66822.sh
+2023/04/11 | 153 | systems/texlive/tlnet/update-tlmgr-r66822.sh.sha512
+2023/04/11 | 455 | systems/texlive/tlnet/update-tlmgr-r66822.sh.sha512.asc
2020/11/23 | 215 | systems/unix/tex-fpc/ch.ch/mkchatty
2020/11/17 | 215 | systems/unix/tex-fpc/ch.ch/mkdebug
2020/11/17 | 206 | systems/unix/tex-fpc/ch.ch/mkini
@@ -312541,7 +312551,7 @@
2014/07/05 | 611 | systems/win32/yandy/README
2014/07/05 | 1004628 | systems/win32/yandy/yandy-src.tar.xz
2014/07/05 | 1012416 | systems/win32/yandy.zip
-2023/04/11 | 186 | timestamp
+2023/04/12 | 186 | timestamp
2002/08/26 | 61898 | usergrps/dante/antrag.pdf
2002/08/26 | 118217 | usergrps/dante/antrag.ps
2021/11/11 | 917 | usergrps/dante/dtk/doc/beispiel.bib
diff --git a/FILES.byname.gz b/FILES.byname.gz
index 45ddfe7969..b45fc25864 100644
--- a/FILES.byname.gz
+++ b/FILES.byname.gz
Binary files differ
diff --git a/FILES.last07days b/FILES.last07days
index 65c9c982f0..4ef7f82df4 100644
--- a/FILES.last07days
+++ b/FILES.last07days
@@ -1,25 +1,676 @@
+2023/04/11 | 9 | support/texlab/crates/parser/src/test_data/latex/label/label_reference_simple.txt
+2023/04/11 | 9 | support/texlab/crates/parser/src/test_data/latex/glossary/glossary_entry_reference_simple.txt
+2023/04/11 | 9 | support/texlab/crates/parser/src/test_data/latex/citation/citation_missing_brace.txt
+2023/04/11 | 993 | support/texlab/crates/parser/src/test_data/bibtex/samples/knuth_1984.txt
+2023/04/11 | 984 | support/texlab/crates/texlab/src/features/definition/document.rs
+2023/04/11 | 9839 | support/latexindent/LatexIndent/Lines.pm
+2023/04/11 | 980 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@color__color_set_definition_simple.txt.snap
+2023/04/11 | 976 | support/texlab/crates/citeproc/src/snapshots/citeproc__tests__article_rivest_1978.snap
+2023/04/11 | 975 | support/texlab/crates/parser/src/snapshots/parser__build_log__tests__parse@004.txt.snap
+2023/04/11 | 965 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@glossary__glossary_entry_definition_simple.txt.snap
+2023/04/11 | 9648 | support/texlab/crates/texlab/src/util/cursor.rs
+2023/04/11 | 9563 | support/texlab/crates/base-db/src/semantics/tex.rs
+2023/04/11 | 954 | support/texlab/crates/citeproc/src/snapshots/citeproc__tests__patent_almendro_1998.snap
+2023/04/11 | 953 | support/texlab/crates/parser/src/snapshots/parser__build_log__tests__parse@005.txt.snap
+2023/04/11 | 9479 | support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@samples__knuth_1984.txt.snap
+2023/04/11 | 946 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__formatting__bibtex_internal_multiple_entries.snap
+2023/04/11 | 9441276 | systems/texlive/tlnet/update-tlmgr-r66822.sh
+2023/04/11 | 932 | support/texlab/crates/texlab/src/features/link.rs
+2023/04/11 | 911 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@glossary__glossary_entry_reference_options.txt.snap
+2023/04/11 | 911 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@environment__environment_definition_optional_arg.txt.snap
+2023/04/11 | 90 | support/texlab/crates/parser/src/test_data/latex/structure/structure_nested.txt
+2023/04/11 | 904 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@issue_857.txt.snap
+2023/04/11 | 900 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__graphics_include_command.txt.snap
+2023/04/11 | 898 | support/texlab/crates/parser/src/test_data/bibtex/samples/kastenholz_2006.txt
+2023/04/11 | 8955 | support/texlab/crates/citeproc/src/field/text.rs
+2023/04/11 | 890 | support/texlab/crates/citeproc/src/lib.rs
+2023/04/11 | 890 | macros/latex/contrib/photobook/scripts/make-spreads.cfg.example
+2023/04/11 | 8868 | support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@samples__kastenholz_2006.txt.snap
+2023/04/11 | 8868 | support/texlab/crates/base-db/src/workspace.rs
+2023/04/11 | 8829 | support/latexindent/LatexIndent/IfElseFi.pm
+2023/04/11 | 8762 | support/latexindent/LatexIndent/FileExtension.pm
+2023/04/11 | 875 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__hover__component_known_package.snap
+2023/04/11 | 8703661 | support/latexindent/bin/windows/latexindent.exe
+2023/04/11 | 864 | support/texlab/crates/syntax/src/lib.rs
+2023/04/11 | 861 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__biblatex_include_options.txt.snap
+2023/04/11 | 860 | support/texlab/crates/parser/src/test_data/bibtex/samples/blom_2021.txt
+2023/04/11 | 851 | support/texlab/crates/texlab/src/features/hover/label.rs
+2023/04/11 | 849 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@color__color_set_definition_error1.txt.snap
+2023/04/11 | 841 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__folding_range__latex.snap
+2023/04/11 | 840 | support/texlab/crates/texlab/src/features/completion/field.rs
+2023/04/11 | 8392 | support/texlab/crates/texlab/tests/lsp/fixture.rs
+2023/04/11 | 838 | support/texlab/crates/texlab/src/features/completion/acronym_ref.rs
+2023/04/11 | 838 | support/latexindent/LatexIndent/Version.pm
+2023/04/11 | 82 | support/texlab/crates/parser/src/test_data/bibtex/comment.txt
+2023/04/11 | 826 | support/texlab/crates/texlab/src/lib.rs
+2023/04/11 | 825 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@label__label_reference_incomplete.txt.snap
+2023/04/11 | 821 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@group__equation_missing_end.txt.snap
+2023/04/11 | 820 | support/texlab/crates/distro/src/texlive.rs
+2023/04/11 | 819 | support/texlab/crates/texlab/src/features/hover/component.rs
+2023/04/11 | 8171 | support/texlab/crates/texlab/tests/lsp/text_document/document_symbol.rs
+2023/04/11 | 815 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@glossary__acronym_reference_options.txt.snap
+2023/04/11 | 814 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@equation_missing_begin.txt.snap
+2023/04/11 | 80 | support/texlab/crates/parser/src/test_data/latex/command_definition/command_definition_with_begin.txt
+2023/04/11 | 7 | support/texlab/crates/parser/src/test_data/latex/citation/citation_empty.txt
+2023/04/11 | 7955 | support/texlab/crates/syntax/src/bibtex.rs
+2023/04/11 | 788 | support/texlab/crates/citeproc/src/snapshots/citeproc__tests__article_betram_1996.snap
+2023/04/11 | 783 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__document_symbol__ignored_patterns.snap
+2023/04/11 | 7762 | support/texlab/crates/parser/src/test_data/build_log/007.txt
+2023/04/11 | 772 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@caption__caption_figure.txt.snap
+2023/04/11 | 7720139 | support/texlab.zip
+2023/04/11 | 771 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@theorem_definition__theorem_definition_full.txt.snap
+2023/04/11 | 76 | support/texlab/crates/parser/src/test_data/latex/glossary/acronym_definition_options.txt
+2023/04/11 | 762 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__graphics_include_complicated_options.txt.snap
+2023/04/11 | 761 | support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@issue_809.txt.snap
+2023/04/11 | 760 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@glossary__acronym_package.txt.snap
+2023/04/11 | 760 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@command_definition__command_definition_optional.txt.snap
+2023/04/11 | 758 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@glossary__acronym_definition_simple.txt.snap
+2023/04/11 | 7531 | support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@samples__aksin_2006.txt.snap
+2023/04/11 | 7528 | support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@samples__jain_1999.txt.snap
+2023/04/11 | 749 | support/texlab/crates/texlab/src/features/hover/citation.rs
+2023/04/11 | 746 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@block_comments.txt.snap
+2023/04/11 | 745 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@issue_874.txt.snap
+2023/04/11 | 742 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@environment__environment_simple.txt.snap
+2023/04/11 | 7428 | support/latexindent/LatexIndent/BackUpFileProcedure.pm
+2023/04/11 | 740804 | macros/luatex/latex/piton.zip
+2023/04/11 | 739 | support/texlab/crates/texlab/tests/lsp/workspace/snapshots/lsp__workspace__symbol__filter_type_math.snap
+2023/04/11 | 734 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@color__color_definition_simple.txt.snap
+2023/04/11 | 7322 | support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@samples__almendro_1998.txt.snap
+2023/04/11 | 7280 | support/latexindent/LatexIndent/MandatoryArgument.pm
+2023/04/11 | 721 | support/texlab/crates/texlab/src/features/completion/tikz_library.rs
+2023/04/11 | 719 | support/texlab/crates/texlab/tests/lsp/workspace/snapshots/lsp__workspace__symbol__filter_bibtex.snap
+2023/04/11 | 7196 | support/texlab/crates/texlab/src/features/formatting/bibtex_internal.rs
+2023/04/11 | 717 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__graphics_include_options.txt.snap
+2023/04/11 | 716 | support/texlab/crates/parser/src/snapshots/parser__build_log__tests__parse@001.txt.snap
+2023/04/11 | 7161 | support/latexindent/documentation/figure-schematic.png
+2023/04/11 | 7157 | support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@samples__combi_2004.txt.snap
+2023/04/11 | 711 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__project_resolution_texlabroot.snap
+2023/04/11 | 710 | support/texlab/crates/distro/src/kpsewhich.rs
+2023/04/11 | 707 | support/texlab/crates/citeproc/src/snapshots/citeproc__tests__collection_matuz_1990.snap
+2023/04/11 | 706 | support/texlab/crates/parser/src/test_data/bibtex/samples/almendro_1998.txt
+2023/04/11 | 706 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@structure__structure_siblings.txt.snap
+2023/04/11 | 703 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__inkscape_include_options.txt.snap
+2023/04/11 | 703833 | macros/luatex/latex/piton/piton.pdf
+2023/04/11 | 702 | support/texlab/crates/texlab/src/features/completion/entry_type.rs
+2023/04/11 | 702 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__svg_include_options.txt.snap
+2023/04/11 | 6 | support/texlab/crates/parser/src/test_data/latex/group/escaped_brackets.txt
+2023/04/11 | 699 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__project_resolution_import.snap
+2023/04/11 | 6970534 | support/texlab/crates/texlab/data/components.json.gz
+2023/04/11 | 689 | support/texlab/crates/syntax/src/latex.rs
+2023/04/11 | 6882 | support/latexindent/LatexIndent/TrailingComments.pm
+2023/04/11 | 6836 | support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@samples__erwin_2007.txt.snap
+2023/04/11 | 680 | support/texlab/crates/texlab/src/features/completion/component_command.rs
+2023/04/11 | 6807 | support/latexindent/LatexIndent/Environment.pm
+2023/04/11 | 679 | support/texlab/crates/parser/src/test_data/bibtex/samples/aksin_2006.txt
+2023/04/11 | 674 | support/texlab/crates/parser/src/test_data/bibtex/samples/jain_1999.txt
+2023/04/11 | 674 | support/texlab/crates/parser/src/test_data/bibtex/samples/combi_2004.txt
+2023/04/11 | 673 | support/texlab/crates/parser/src/snapshots/parser__build_log__tests__parse@003.txt.snap
+2023/04/11 | 6717 | support/latexindent/LatexIndent/Item.pm
+2023/04/11 | 669 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@theorem_definition__theorem_definition_name_with_description_and_counter.txt.snap
+2023/04/11 | 6644 | support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@samples__blom_2021.txt.snap
+2023/04/11 | 659 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__hover__entry_type_known_type.snap
+2023/04/11 | 6522 | support/latexindent/LatexIndent/OptionalArgument.pm
+2023/04/11 | 650 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__folding_range__bibtex.snap
+2023/04/11 | 65092 | support/latexindent/LatexIndent/AlignmentAtAmpersand.pm
+2023/04/11 | 64 | support/texlab/crates/parser/src/test_data/latex/glossary/acronym_declaration.txt
+2023/04/11 | 649 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@inline_double_dollar.txt.snap
+2023/04/11 | 6484 | support/texlab/crates/base-db/src/line_index.rs
+2023/04/11 | 647 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@caption__caption_default.txt.snap
+2023/04/11 | 6475944 | systems/texlive/tlnet/archive/uantwerpendocs.r66819.tar.xz
+2023/04/11 | 6472 | support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@samples__rivest_1978.txt.snap
+2023/04/11 | 645 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@command_definition__command_definition_simple.txt.snap
+2023/04/11 | 6453 | support/texlab/crates/texlab/src/server/options.rs
+2023/04/11 | 6393230 | support/latexindent/bin/macos/latexindent
+2023/04/11 | 635 | support/texlab/crates/texlab/src/features/completion/user_environment.rs
+2023/04/11 | 631 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@inline.txt.snap
+2023/04/11 | 62 | support/texlab/crates/texlab/src/features/workspace_command.rs
+2023/04/11 | 6271 | support/latexindent/LatexIndent/Else.pm
+2023/04/11 | 626 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@caption__caption_default_error.txt.snap
+2023/04/11 | 624 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@graphics_path_command.txt.snap
+2023/04/11 | 6224 | support/texlab/crates/texlab/src/util/label.rs
+2023/04/11 | 6164028 | support/latexindent/bin/linux/latexindent
+2023/04/11 | 615 | support/texlab/texlab.1
+2023/04/11 | 615 | support/texlab/crates/parser/src/test_data/bibtex/samples/erwin_2007.txt
+2023/04/11 | 60 | support/texlab/crates/parser/src/test_data/latex/structure/structure_enum_item.txt
+2023/04/11 | 60 | support/texlab/crates/citeproc/src/field.rs
+2023/04/11 | 608 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@citation__citation_prenote_postnote.txt.snap
+2023/04/11 | 604 | support/texlab/crates/texlab/src/features/hover/field.rs
+2023/04/11 | 6018 | support/texlab/crates/texlab/src/util/capabilities.rs
+2023/04/11 | 5993 | support/texlab/crates/parser/src/latex/lexer/commands.rs
+2023/04/11 | 594 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__component_command_bibtex.snap
+2023/04/11 | 5908 | support/latexindent/documentation/contributors.bib
+2023/04/11 | 588 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@color__color_set_definition_error2.txt.snap
+2023/04/11 | 5864 | support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@samples__betram_1996.txt.snap
+2023/04/11 | 583 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__component_command_simple_package.snap
+2023/04/11 | 583 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__citation.snap
+2023/04/11 | 5808 | support/latexindent/LatexIndent/UnNamedGroupingBracesBrackets.pm
+2023/04/11 | 5788 | systems/texlive/tlnet/archive/elteikthesis.r66820.tar.xz
+2023/04/11 | 575 | support/texlab/crates/texlab/src/features/completion/user_command.rs
+2023/04/11 | 5735810 | systems/texlive/tlnet/install-tl-unx.tar.gz
+2023/04/11 | 572 | support/texlab/crates/citeproc/src/snapshots/citeproc__tests__book_aho_2006.snap
+2023/04/11 | 5684 | support/texlab/crates/parser/src/build_log.rs
+2023/04/11 | 565 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@structure__structure_invalid_nesting.txt.snap
+2023/04/11 | 563 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@label__label_number.txt.snap
+2023/04/11 | 56243 | support/texlab/crates/texlab/data/lang_data.json
+2023/04/11 | 55 | support/texlab/crates/parser/src/test_data/latex/issue_857.txt
+2023/04/11 | 559 | support/texlab/crates/texlab/src/features/completion/theorem.rs
+2023/04/11 | 557 | support/texlab/crates/parser/src/test_data/bibtex/samples/rivest_1978.txt
+2023/04/11 | 556 | support/texlab/crates/parser/src/test_data/bibtex/samples/betram_1996.txt
+2023/04/11 | 555 | support/texlab/crates/texlab/src/features/link/include.rs
+2023/04/11 | 5537 | support/texlab/crates/texlab/src/features/symbol/project_order.rs
+2023/04/11 | 552 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@graphics_path_options.txt.snap
+2023/04/11 | 550 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__begin_environment_without_snippet_support.snap
+2023/04/11 | 547 | support/texlab/crates/texlab/src/features/hover/entry_type.rs
+2023/04/11 | 544 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__component_environment_simple_end.snap
+2023/04/11 | 54385 | support/latexindent/documentation/latexindent-yaml-schema.json
+2023/04/11 | 5429 | support/latexindent/LatexIndent/KeyEqualsValuesBraces.pm
+2023/04/11 | 5390 | support/latexindent/LatexIndent/Check.pm
+2023/04/11 | 538 | support/texlab/crates/citeproc/Cargo.toml
+2023/04/11 | 52 | support/texlab/crates/parser/src/test_data/latex/include/graphics_include_command.txt
+2023/04/11 | 52 | support/texlab/crates/parser/src/test_data/latex/environment/environment_nested_missing_braces.txt
+2023/04/11 | 526 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@theorem_definition__theorem_definition_name_with_description.txt.snap
+2023/04/11 | 526 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@theorem_definition__theorem_definition_name_with_counter.txt.snap
+2023/04/11 | 52668 | support/latexindent/LatexIndent/GetYamlSettings.pm
+2023/04/11 | 5245 | support/texlab/crates/texlab/src/features/forward_search.rs
+2023/04/11 | 521 | support/texlab/crates/texlab/src/features/completion/component_environment.rs
+2023/04/11 | 520 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__formatting__bibtex_internal_wrap_long_lines.snap
+2023/04/11 | 520 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@caption__caption_minimal.txt.snap
+2023/04/11 | 518368 | biblio/bibtex/bibtex-x.zip
+2023/04/11 | 517 | support/texlab/crates/parser/src/test_data/bibtex/samples/matuz_1990.txt
+2023/04/11 | 512 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__issue_857_1.snap
+2023/04/11 | 50 | support/texlab/crates/parser/src/test_data/latex/environment/environment_asymptote.txt
+2023/04/11 | 50 | support/texlab/crates/parser/src/test_data/bibtex/issue_809.txt
+2023/04/11 | 507 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@label__label_reference_range_simple.txt.snap
+2023/04/11 | 5060 | support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@samples__matuz_1990.txt.snap
+2023/04/11 | 504 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@command_definition__command_definition_no_argc.txt.snap
+2023/04/11 | 502 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@command_definition__math_operator_simple.txt.snap
+2023/04/11 | 5020 | support/texlab/crates/base-db/src/graph.rs
+2023/04/11 | 4 | support/texlab/crates/parser/src/test_data/latex/group/unmatched_brackets_with_group.txt
+2023/04/11 | 4 | support/texlab/crates/parser/src/test_data/latex/generic_command_empty.txt
+2023/04/11 | 499 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@caption__caption_minimal_error.txt.snap
+2023/04/11 | 49947 | support/texlab/Cargo.lock
+2023/04/11 | 494 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__component_command_simple.snap
+2023/04/11 | 4941 | support/texlab/crates/base-db/src/config.rs
+2023/04/11 | 490 | support/texlab/crates/texlab/src/features/completion/color.rs
+2023/04/11 | 48 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5
+2023/04/11 | 48 | support/texlab/crates/parser/src/test_data/latex/block_comments.txt
+2023/04/11 | 486 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__field_entry_two_fields_name_closed.snap
+2023/04/11 | 485 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__field_entry_two_fields_name_open.snap
+2023/04/11 | 483 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__package_include_multiple.txt.snap
+2023/04/11 | 4825 | support/texlab/crates/texlab/src/features/build.rs
+2023/04/11 | 4816 | support/latexindent/LatexIndent/BlankLines.pm
+2023/04/11 | 47 | support/texlab/crates/texlab/tests/lsp/main.rs
+2023/04/11 | 47 | support/texlab/crates/parser/src/test_data/latex/label/label_reference_incomplete.txt
+2023/04/11 | 47 | support/texlab/crates/parser/src/test_data/latex/environment/environment_definition.txt
+2023/04/11 | 479 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@label__label_reference_range_error.txt.snap
+2023/04/11 | 477 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__latex_input_path_brackets.txt.snap
+2023/04/11 | 4755 | support/texlab/crates/base-db/src/document.rs
+2023/04/11 | 472 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@citation__citation_prenote.txt.snap
+2023/04/11 | 4724 | support/texlab/crates/citeproc/src/entry.rs
+2023/04/11 | 470 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__import_simple.txt.snap
+2023/04/11 | 4669661 | systems/texlive/tlnet/update-tlmgr-r66822.exe
+2023/04/11 | 464 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__import_class_open_brace.snap
+2023/04/11 | 464 | support/texlab/crates/parser/src/snapshots/parser__build_log__tests__parse@007.txt.snap
+2023/04/11 | 463 | support/texlab/crates/base-db/Cargo.toml
+2023/04/11 | 462 | macros/latex/contrib/photobook/DEPENDS.txt
+2023/04/11 | 460 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@generic_command_args.txt.snap
+2023/04/11 | 459 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__import_class_closed_brace.snap
+2023/04/11 | 457 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@color__color_set_definition_error3.txt.snap
+2023/04/11 | 456 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@label__label_reference_multiple.txt.snap
+2023/04/11 | 455 | systems/texlive/tlnet/update-tlmgr-r66822.sh.sha512.asc
+2023/04/11 | 455 | systems/texlive/tlnet/update-tlmgr-r66822.exe.sha512.asc
+2023/04/11 | 455 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc
+2023/04/11 | 455 | systems/texlive/tlnet/install-tl.zip.sha512.asc
+2023/04/11 | 455 | systems/texlive/tlnet/install-tl-windows.exe.sha512.asc
+2023/04/11 | 455 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512.asc
+2023/04/11 | 453 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@citation__citation_multiple_keys.txt.snap
+2023/04/11 | 452 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__tikz_library_closed_brace.snap
+2023/04/11 | 452 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@label__label_definition_line_break.txt.snap
+2023/04/11 | 451 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__tikz_library_open_brace.snap
+2023/04/11 | 44 | support/texlab/crates/parser/src/test_data/latex/include/class_include_options.txt
+2023/04/11 | 44 | support/texlab/crates/parser/src/test_data/latex/glossary/acronym_definition_simple.txt
+2023/04/11 | 44 | support/texlab/crates/parser/src/test_data/latex/environment/environment_definition_optional_arg.txt
+2023/04/11 | 44 | support/texlab/crates/parser/src/test_data/latex/color/color_set_definition_simple.txt
+2023/04/11 | 449 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__import_package_closed_brace.snap
+2023/04/11 | 448 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__import_package_open_brace.snap
+2023/04/11 | 448 | support/texlab/crates/parser/src/snapshots/parser__build_log__tests__parse@002.txt.snap
+2023/04/11 | 447 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@graphics_path.txt.snap
+2023/04/11 | 4445 | support/texlab/crates/texlab/src/features/symbol/types.rs
+2023/04/11 | 44216 | systems/texlive/tlnet/archive/uantwerpendocs.source.r66819.tar.xz
+2023/04/11 | 441 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__field_entry_field_name.snap
+2023/04/11 | 44096 | support/latexindent/documentation/logo.png
+2023/04/11 | 4402 | support/latexindent/documentation/latex-indent.bib
+2023/04/11 | 43 | support/texlab/crates/parser/src/test_data/latex/environment/environment_nested.txt
+2023/04/11 | 4365 | support/latexindent/LatexIndent/RoundBrackets.pm
+2023/04/11 | 4360632 | systems/texlive/tlnet/archive/uantwerpendocs.doc.r66819.tar.xz
+2023/04/11 | 4339 | support/latexindent/LatexIndent/NamedGroupingBracesBrackets.pm
+2023/04/11 | 430 | support/texlab/crates/base-db/src/diagnostics.rs
+2023/04/11 | 430280 | support/latexindent/documentation/latexindent.tex
+2023/04/11 | 4300 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@issue_745.txt.snap
+2023/04/11 | 42 | support/texlab/crates/parser/src/test_data/latex/include/biblatex_include_options.txt
+2023/04/11 | 429 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__latex_include_equality_sign.txt.snap
+2023/04/11 | 426 | support/texlab/crates/texlab/tests/lsp/workspace/snapshots/lsp__workspace__symbol__filter_type_figure.snap
+2023/04/11 | 423552 | systems/texlive/tlnet/archive/texlive-scripts.doc.r66817.tar.xz
+2023/04/11 | 421 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__field_empty_entry_closed.snap
+2023/04/11 | 4219 | macros/latex/contrib/photobook/scripts/cls2tex.sh
+2023/04/11 | 420 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__field_empty_entry_open.snap
+2023/04/11 | 41 | support/texlab/crates/parser/src/test_data/latex/include/package_include_options.txt
+2023/04/11 | 4169 | support/texlab/crates/texlab/tests/lsp/text_document/references.rs
+2023/04/11 | 415 | support/texlab/crates/texlab/src/util/regex_filter.rs
+2023/04/11 | 4157 | support/texlab/crates/texlab/src/util/diagnostics.rs
+2023/04/11 | 414 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__color_word.snap
+2023/04/11 | 4130 | support/texlab/crates/parser/src/test_data/build_log/006.txt
+2023/04/11 | 408 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__color_model_definition_simple.snap
+2023/04/11 | 407 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__color_model_definition_open_brace.snap
+2023/04/11 | 406 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__hover__label_theorem_child_file_mumber.snap
+2023/04/11 | 4061171 | biblio/ctan-bibdata.zip
+2023/04/11 | 405 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__color_simple.snap
+2023/04/11 | 404 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__color_open_brace.snap
+2023/04/11 | 404 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__color_model_definition_set_simple.snap
+2023/04/11 | 404 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__argument_open_brace.snap
+2023/04/11 | 404 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@citation__citation_redundant_comma.txt.snap
+2023/04/11 | 403 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__color_model_definition_set_open_brace.snap
+2023/04/11 | 4028 | support/texlab/crates/texlab/src/features/completion/include.rs
+2023/04/11 | 4008 | support/texlab/crates/texlab/src/util/lsp_enums.rs
+2023/04/11 | 39 | support/texlab/crates/parser/src/test_data/latex/include/graphics_include_options.txt
+2023/04/11 | 39 | support/texlab/crates/parser/src/test_data/latex/include/graphics_include_complicated_options.txt
+2023/04/11 | 39 | support/texlab/crates/parser/src/test_data/latex/glossary/glossary_entry_definition_simple.txt
+2023/04/11 | 39 | support/texlab/crates/parser/src/test_data/latex/color/color_set_definition_error1.txt
+2023/04/11 | 39 | support/texlab/crates/parser/src/test_data/latex/caption/caption_figure.txt
+2023/04/11 | 399 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__argument_empty.snap
+2023/04/11 | 3943 | support/texlab/crates/texlab/tests/lsp/text_document/hover.rs
+2023/04/11 | 387 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@theorem_definition__theorem_definition_only_name.txt.snap
+2023/04/11 | 387 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__graphics_include_simple.txt.snap
+2023/04/11 | 386 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__biblatex_include_simple.txt.snap
+2023/04/11 | 386 | support/texlab/crates/parser/Cargo.toml
+2023/04/11 | 385 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__verbatim_include_simple.txt.snap
+2023/04/11 | 384 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__entry_type_at_empty.snap
+2023/04/11 | 384 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__tikz_library_import_simple.txt.snap
+2023/04/11 | 384 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@group__escaped_brackets.txt.snap
+2023/04/11 | 382 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__pgf_library_import_simple.txt.snap
+2023/04/11 | 380 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@label__label_reference_range_incomplete.txt.snap
+2023/04/11 | 380190 | support/texlab/images/demo.gif
+2023/04/11 | 37 | support/texlab/crates/parser/src/test_data/latex/issue_874.txt
+2023/04/11 | 379 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@equation.txt.snap
+2023/04/11 | 377 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@command_definition__command_definition_no_impl.txt.snap
+2023/04/11 | 376 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__package_include_simple.txt.snap
+2023/04/11 | 376 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__bibtex_include_simple.txt.snap
+2023/04/11 | 376 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@command_definition__math_operator_no_impl.txt.snap
+2023/04/11 | 3767 | support/texlab/README.md
+2023/04/11 | 375 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__class_include_simple.txt.snap
+2023/04/11 | 3747 | support/latexindent/LatexIndent/Replacement.pm
+2023/04/11 | 37434 | support/texlab/crates/texlab/src/server.rs
+2023/04/11 | 373 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__inkscape_include_simple.txt.snap
+2023/04/11 | 373 | support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@preamble.txt.snap
+2023/04/11 | 372 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__svg_include_simple.txt.snap
+2023/04/11 | 372 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@glossary__acronym_reference_simple.txt.snap
+2023/04/11 | 3729 | support/texlab/crates/texlab/src/util/chktex.rs
+2023/04/11 | 368 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__document_link__document_import.snap
+2023/04/11 | 3667 | support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@samples__aho_2006.txt.snap
+2023/04/11 | 3663579 | biblio/ctan-bibdata/ctan.pdf
+2023/04/11 | 365 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@glossary__glossary_entry_reference_simple.txt.snap
+2023/04/11 | 364 | support/texlab/crates/base-db/src/semantics.rs
+2023/04/11 | 363 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__latex_include_simple.txt.snap
+2023/04/11 | 361 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@label__label_reference_equation.txt.snap
+2023/04/11 | 35 | support/texlab/crates/parser/src/test_data/latex/structure/structure_siblings.txt
+2023/04/11 | 35 | support/texlab/crates/parser/src/test_data/latex/glossary/acronym_package.txt
+2023/04/11 | 358 | support/texlab/crates/texlab/src/features/highlight.rs
+2023/04/11 | 356 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@label__label_definition_simple.txt.snap
+2023/04/11 | 356 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@command_definition__command_definition_no_impl_error.txt.snap
+2023/04/11 | 356 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@color__color_reference_simple.txt.snap
+2023/04/11 | 355 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__document_link__document_include.snap
+2023/04/11 | 3546 | support/texlab/crates/base-db/src/diagnostics/tex.rs
+2023/04/11 | 353060 | systems/texlive/tlnet/archive/texlive.infra.r66822.tar.xz
+2023/04/11 | 351 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__user_environment.snap
+2023/04/11 | 35149 | support/texlab/LICENSE
+2023/04/11 | 3500 | support/texlab/crates/texlab/src/util/components.rs
+2023/04/11 | 34 | support/texlab/crates/parser/src/test_data/latex/include/svg_include_options.txt
+2023/04/11 | 349 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@label__label_reference_simple.txt.snap
+2023/04/11 | 3482 | support/latexindent/LatexIndent/HorizontalWhiteSpace.pm
+2023/04/11 | 347 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@issue_789.txt.snap
+2023/04/11 | 344 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@citation__citation_simple.txt.snap
+2023/04/11 | 3430 | support/texlab/crates/texlab/src/features/symbol.rs
+2023/04/11 | 342 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@citation__citation_star.txt.snap
+2023/04/11 | 3413 | support/latexindent/latexindent.pl
+2023/04/11 | 33 | support/texlab/crates/parser/src/test_data/latex/graphics_path_options.txt
+2023/04/11 | 33 | support/texlab/crates/parser/src/test_data/latex/environment/environment_simple.txt
+2023/04/11 | 33 | support/texlab/crates/parser/src/test_data/latex/color/color_definition_simple.txt
+2023/04/11 | 3387 | support/texlab/crates/texlab/tests/lsp/text_document/definition.rs
+2023/04/11 | 3339 | support/latexindent/LatexIndent/Tokens.pm
+2023/04/11 | 332 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__hover__label_theorem_child_file.snap
+2023/04/11 | 332 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@group__curly_group_simple.txt.snap
+2023/04/11 | 332 | support/texlab/Cargo.toml
+2023/04/11 | 330 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@group__unmatched_brackets_with_group.txt.snap
+2023/04/11 | 32 | support/texlab/crates/parser/src/test_data/latex/graphics_path_command.txt
+2023/04/11 | 32 | support/texlab/crates/parser/src/test_data/latex/glossary/acronym_reference_options.txt
+2023/04/11 | 32603 | support/texlab/crates/parser/src/latex.rs
+2023/04/11 | 32584 | systems/texlive/tlnet/archive/kpathsea.r66822.tar.xz
+2023/04/11 | 324 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__package_include_empty.txt.snap
+2023/04/11 | 323 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__class_include_empty.txt.snap
+2023/04/11 | 321 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@citation__citation_missing_brace.txt.snap
+2023/04/11 | 320 | support/texlab/crates/texlab/src/util.rs
+2023/04/11 | 3204 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__document_symbol__enumerate_nested.snap
+2023/04/11 | 31 | support/texlab/crates/parser/src/test_data/latex/theorem_definition/theorem_definition_full.txt
+2023/04/11 | 31 | support/texlab/crates/parser/src/test_data/latex/command_definition/math_operator_simple.txt
+2023/04/11 | 3194 | support/texlab/crates/parser/src/test_data/build_log/001.txt
+2023/04/11 | 316 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__import_incomplete.txt.snap
+2023/04/11 | 3163 | support/texlab/crates/texlab/src/client.rs
+2023/04/11 | 314 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__hover__citation_inside_entry.snap
+2023/04/11 | 314 | support/texlab/crates/parser/src/test_data/bibtex/samples/aho_2006.txt
+2023/04/11 | 313 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__issue_864.snap
+2023/04/11 | 313 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__citation_acronym.snap
+2023/04/11 | 312 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@group__curly_group_missing_end.txt.snap
+2023/04/11 | 31148 | support/latexindent/LatexIndent/Wrap.pm
+2023/04/11 | 30 | support/texlab/crates/parser/src/test_data/latex/include/inkscape_include_options.txt
+2023/04/11 | 30 | support/texlab/crates/parser/src/test_data/latex/color/color_set_definition_error2.txt
+2023/04/11 | 309931 | macros/luatex/latex/piton/piton-french.pdf
+2023/04/11 | 308 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__hover__citation_inside_cite.snap
+2023/04/11 | 3057 | support/texlab/crates/parser/src/test_data/build_log/004.txt
+2023/04/11 | 3003 | support/texlab/crates/texlab/tests/lsp/text_document/formatting.rs
+2023/04/11 | 2 | support/texlab/crates/parser/src/test_data/latex/parameter.txt
+2023/04/11 | 2 | support/texlab/crates/parser/src/test_data/latex/group/unmatched_brackets.txt
+2023/04/11 | 2 | support/texlab/crates/parser/src/test_data/latex/group/unmatched_braces.txt
+2023/04/11 | 2 | support/texlab/crates/parser/src/test_data/latex/generic_command_escape.txt
+2023/04/11 | 29 | support/texlab/crates/parser/src/test_data/latex/include/graphics_include_simple.txt
+2023/04/11 | 29 | support/texlab/crates/parser/src/test_data/latex/command_definition/command_definition_optional.txt
+2023/04/11 | 2970 | support/texlab/crates/texlab/tests/lsp/workspace/symbol.rs
+2023/04/11 | 295 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@citation__citation_empty.txt.snap
+2023/04/11 | 291 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__citation_open_brace_multiple.snap
+2023/04/11 | 28 | support/texlab/crates/parser/src/test_data/latex/include/package_include_multiple.txt
+2023/04/11 | 28 | support/texlab/crates/parser/src/test_data/latex/include/biblatex_include_simple.txt
+2023/04/11 | 28 | support/texlab/crates/parser/src/test_data/latex/group/equation_missing_end.txt
+2023/04/11 | 28 | support/texlab/crates/parser/src/test_data/latex/graphics_path.txt
+2023/04/11 | 28 | support/texlab/crates/parser/src/test_data/latex/equation_missing_begin.txt
+2023/04/11 | 2897 | support/texlab/crates/texlab/src/features/workspace_command/change_environment.rs
+2023/04/11 | 283 | support/texlab/crates/texlab/src/features/completion/begin_snippet.rs
+2023/04/11 | 2815 | support/texlab/crates/texlab/src/features/completion/label.rs
+2023/04/11 | 27 | support/texlab/crates/parser/src/test_data/latex/structure/structure_invalid_nesting.txt
+2023/04/11 | 27 | support/texlab/crates/parser/src/test_data/latex/include/verbatim_include_simple.txt
+2023/04/11 | 27 | support/texlab/crates/parser/src/test_data/latex/caption/caption_default.txt
+2023/04/11 | 279 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__component_environment_command_definition.snap
+2023/04/11 | 279 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__acronym_ref_simple.snap
+2023/04/11 | 278 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__acronym_ref_open_brace.snap
+2023/04/11 | 2777637 | biblio/ctan-bibdata/ctan.bib
+2023/04/11 | 2752 | systems/texlive/tlnet/archive/elteiktdk.r66821.tar.xz
+2023/04/11 | 273 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__user_command.snap
+2023/04/11 | 27328 | support/latexindent/LatexIndent/Verbatim.pm
+2023/04/11 | 272 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__hover__string_inside_reference.snap
+2023/04/11 | 27244 | support/texlab/CHANGELOG.md
+2023/04/11 | 271 | support/texlab/crates/parser/src/test_data/latex/issue_745.txt
+2023/04/11 | 2701 | support/latexindent/LatexIndent/Switches.pm
+2023/04/11 | 26 | support/texlab/crates/parser/src/test_data/latex/theorem_definition/theorem_definition_name_with_description_and_counter.txt
+2023/04/11 | 26 | support/texlab/crates/parser/src/test_data/latex/command_definition/math_operator_no_impl.txt
+2023/04/11 | 26 | support/texlab/crates/parser/src/test_data/latex/caption/caption_default_error.txt
+2023/04/11 | 269 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__citation_open_brace.snap
+2023/04/11 | 2690 | support/latexindent/LatexIndent/Preamble.pm
+2023/04/11 | 2665 | support/texlab/crates/citeproc/src/field/date.rs
+2023/04/11 | 265 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__acronym_ref_empty.snap
+2023/04/11 | 264 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__glossary_ref_simple.snap
+2023/04/11 | 263 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__glossary_ref_open_brace.snap
+2023/04/11 | 26391 | support/texlab/texlab.pdf
+2023/04/11 | 262 | support/texlab/crates/texlab/src/features.rs
+2023/04/11 | 26025652 | systems/texlive/tlnet/install-tl.zip
+2023/04/11 | 25 | support/texlab/crates/parser/src/test_data/latex/glossary/glossary_entry_reference_options.txt
+2023/04/11 | 25 | support/texlab/crates/parser/src/test_data/latex/color/color_set_definition_error3.txt
+2023/04/11 | 25 | support/texlab/crates/parser/src/test_data/bibtex/preamble.txt
+2023/04/11 | 2586 | support/texlab/texlab.tex
+2023/04/11 | 2582 | support/texlab/crates/texlab/src/features/symbol/bibtex.rs
+2023/04/11 | 257 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__component_environment_class.snap
+2023/04/11 | 255 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__theorem_end.snap
+2023/04/11 | 2552 | support/texlab/crates/parser/src/latex/lexer/types.rs
+2023/04/11 | 2516 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__document_symbol__theorem_nested.snap
+2023/04/11 | 2515 | support/texlab/crates/parser/src/test_data/build_log/003.txt
+2023/04/11 | 250 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__theorem_begin.snap
+2023/04/11 | 25007 | support/latexindent/LatexIndent/Document.pm
+2023/04/11 | 24 | support/texlab/crates/parser/src/test_data/latex/include/svg_include_simple.txt
+2023/04/11 | 24957 | support/texlab/crates/texlab/src/features/completion/builder.rs
+2023/04/11 | 248 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@color__color_set_definition_error4.txt.snap
+2023/04/11 | 2467 | support/texlab/crates/distro/src/miktex.rs
+2023/04/11 | 2456 | support/texlab/crates/texlab/src/features/workspace_command/clean.rs
+2023/04/11 | 2455 | support/texlab/crates/parser/src/test_data/build_log/002.txt
+2023/04/11 | 244 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@group__unmatched_brackets.txt.snap
+2023/04/11 | 24410 | support/latexindent/LatexIndent/Arguments.pm
+2023/04/11 | 2439876 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz
+2023/04/11 | 242 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@hello_world.txt.snap
+2023/04/11 | 242 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@group__unmatched_braces.txt.snap
+2023/04/11 | 2411 | support/texlab/crates/texlab/src/server/dispatch.rs
+2023/04/11 | 23 | support/texlab/crates/parser/src/test_data/latex/include/class_include_simple.txt
+2023/04/11 | 23 | support/texlab/crates/parser/src/test_data/latex/command_definition/command_definition_simple.txt
+2023/04/11 | 2368 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__document_symbol__float_nested.snap
+2023/04/11 | 234 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__hover__field_known.snap
+2023/04/11 | 234 | support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@comment.txt.snap
+2023/04/11 | 2320 | support/latexindent/LatexIndent/Logger.pm
+2023/04/11 | 22 | support/texlab/crates/parser/src/test_data/latex/include/bibtex_include_simple.txt
+2023/04/11 | 22 | support/texlab/crates/parser/src/test_data/latex/command_definition/command_definition_no_argc.txt
+2023/04/11 | 22 | support/texlab/crates/parser/src/test_data/latex/caption/caption_minimal.txt
+2023/04/11 | 2292 | support/texlab/crates/texlab/src/features/rename/entry.rs
+2023/04/11 | 22877 | support/latexindent/defaultSettings.yaml
+2023/04/11 | 227 | support/texlab/crates/syntax/Cargo.toml
+2023/04/11 | 227 | support/texlab/crates/distro/Cargo.toml
+2023/04/11 | 226 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__acronym_package_ref.snap
+2023/04/11 | 223 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__component_environment_simple.snap
+2023/04/11 | 22210 | support/texlab/crates/citeproc/src/driver.rs
+2023/04/11 | 221829 | support/TeX4ht/source/ChangeLog
+2023/04/11 | 2201 | support/texlab/crates/base-db/src/diagnostics/log.rs
+2023/04/11 | 21 | support/texlab/crates/parser/src/test_data/latex/theorem_definition/theorem_definition_name_with_description.txt
+2023/04/11 | 21 | support/texlab/crates/parser/src/test_data/latex/theorem_definition/theorem_definition_name_with_counter.txt
+2023/04/11 | 21 | support/texlab/crates/parser/src/test_data/latex/label/label_number.txt
+2023/04/11 | 21 | support/texlab/crates/parser/src/test_data/latex/inline_double_dollar.txt
+2023/04/11 | 21 | support/texlab/crates/parser/src/test_data/latex/caption/caption_minimal_error.txt
+2023/04/11 | 216 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@generic_command_empty.txt.snap
+2023/04/11 | 215 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@generic_command_escape.txt.snap
+2023/04/11 | 2143 | support/texlab/crates/texlab/src/features/folding.rs
+2023/04/11 | 2132 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__document_symbol__section_nested.snap
+2023/04/11 | 212 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__hover__section.snap
+2023/04/11 | 211 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__argument_word.snap
+2023/04/11 | 21036561 | systems/texlive/tlnet/install-tl-windows.exe
+2023/04/11 | 20 | support/texlab/crates/parser/src/test_data/latex/label/label_reference_range_simple.txt
+2023/04/11 | 20 | support/texlab/crates/parser/src/test_data/latex/include/tikz_library_import_simple.txt
+2023/04/11 | 20 | support/texlab/crates/parser/src/test_data/latex/include/package_include_simple.txt
+2023/04/11 | 20 | support/texlab/crates/parser/src/test_data/latex/include/latex_input_path_brackets.txt
+2023/04/11 | 20 | support/texlab/crates/parser/src/test_data/latex/include/inkscape_include_simple.txt
+2023/04/11 | 20 | support/texlab/crates/parser/src/test_data/latex/citation/citation_prenote_postnote.txt
+2023/04/11 | 20797 | support/latexindent/LatexIndent/Indent.pm
+2023/04/11 | 20766 | support/latexindent/LatexIndent/Sentence.pm
+2023/04/11 | 2074 | support/texlab/crates/citeproc/src/field/author.rs
+2023/04/11 | 206464 | systems/texlive/tlnet/archive/texlive.infra.doc.r66822.tar.xz
+2023/04/11 | 205 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__entry_type_complete_entry.snap
+2023/04/11 | 2009 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__document_symbol__enumerate_flat.snap
+2023/04/11 | 2008 | support/latexindent/README
+2023/04/11 | 2007 | support/texlab/crates/texlab/src/features/formatting/latexindent.rs
+2023/04/11 | 1 | support/texlab/crates/parser/src/test_data/latex/parameter_error.txt
+2023/04/11 | 19 | support/texlab/crates/parser/src/test_data/latex/label/label_reference_range_error.txt
+2023/04/11 | 19 | support/texlab/crates/parser/src/test_data/latex/label/label_definition_line_break.txt
+2023/04/11 | 19 | support/texlab/crates/parser/src/test_data/latex/issue_789.txt
+2023/04/11 | 19 | support/texlab/crates/parser/src/test_data/latex/inline.txt
+2023/04/11 | 19 | support/texlab/crates/parser/src/test_data/latex/include/pgf_library_import_simple.txt
+2023/04/11 | 19 | support/texlab/crates/parser/src/test_data/latex/glossary/acronym_reference_simple.txt
+2023/04/11 | 1997 | support/texlab/crates/distro/src/lib.rs
+2023/04/11 | 1969 | support/texlab/crates/texlab/src/util/lang_data.rs
+2023/04/11 | 1955 | support/texlab/crates/base-db/src/diagnostics/bib.rs
+2023/04/11 | 194 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__entry_type_after_preamble.snap
+2023/04/11 | 1936 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__document_symbol__equation_nested.snap
+2023/04/11 | 191658 | macros/latex/contrib/photobook.zip
+2023/04/11 | 1904 | support/texlab/crates/texlab/src/features/completion.rs
+2023/04/11 | 1898 | support/texlab/crates/texlab/src/features/reference/entry.rs
+2023/04/11 | 1897 | support/texlab/crates/parser/src/latex/lexer.rs
+2023/04/11 | 187 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@parameter_error.txt.snap
+2023/04/11 | 186 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__entry_type_after_string.snap
+2023/04/11 | 186 | support/texlab/crates/texlab/tests/lsp/text_document.rs
+2023/04/11 | 1865 | support/texlab/crates/texlab/src/main.rs
+2023/04/11 | 185 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__entry_type_before_preamble.snap
+2023/04/11 | 1856 | support/texlab/crates/texlab/src/features/definition.rs
+2023/04/11 | 18522 | support/latexindent/LatexIndent/ModifyLineBreaks.pm
+2023/04/11 | 1847 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__document_symbol__theorem_flat.snap
+2023/04/11 | 1832 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__document_symbol__float_flat.snap
+2023/04/11 | 182 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__entry_type_before_article.snap
+2023/04/11 | 182 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@parameter.txt.snap
+2023/04/11 | 182 | support/texlab/crates/base-db/src/lib.rs
+2023/04/11 | 181 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__formatting__bibtex_internal_join_strings.snap
+2023/04/11 | 181 | support/texlab/CONTRIBUTING.md
+2023/04/11 | 1814 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__label.snap
+2023/04/11 | 1812 | support/texlab/crates/texlab/Cargo.toml
+2023/04/11 | 1812 | support/texlab/crates/distro/src/file_name_db.rs
+2023/04/11 | 18038054 | systems/texlive/tlnet/tlpkg/texlive.tlpdb
+2023/04/11 | 17 | support/texlab/crates/parser/src/test_data/latex/include/latex_include_simple.txt
+2023/04/11 | 17 | support/texlab/crates/parser/src/test_data/latex/include/latex_include_equality_sign.txt
+2023/04/11 | 17 | support/texlab/crates/parser/src/test_data/latex/include/import_simple.txt
+2023/04/11 | 17 | support/texlab/crates/parser/src/test_data/latex/command_definition/command_definition_no_impl.txt
+2023/04/11 | 179 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__entry_type_before_string.snap
+2023/04/11 | 1791 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@issue_853.txt.snap
+2023/04/11 | 1760 | support/texlab/crates/citeproc/src/output.rs
+2023/04/11 | 174764 | macros/luatex/latex/piton/piton.dtx
+2023/04/11 | 1745 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@structure__structure_nested.txt.snap
+2023/04/11 | 1743 | support/texlab/crates/texlab/tests/lsp/text_document/rename.rs
+2023/04/11 | 1740 | support/texlab/crates/texlab/src/features/rename.rs
+2023/04/11 | 1737 | support/texlab/crates/texlab/tests/lsp/text_document/inlay_hint.rs
+2023/04/11 | 1717 | support/texlab/crates/texlab/src/features/completion/argument.rs
+2023/04/11 | 1705 | macros/latex/contrib/photobook/README.md
+2023/04/11 | 16 | support/texlab/crates/parser/src/test_data/latex/theorem_definition/theorem_definition_only_name.txt
+2023/04/11 | 16 | support/texlab/crates/parser/src/test_data/latex/include/class_include_empty.txt
+2023/04/11 | 16 | support/texlab/crates/parser/src/test_data/latex/command_definition/command_definition_no_impl_error.txt
+2023/04/11 | 16983 | support/texlab/crates/syntax/src/latex/cst.rs
+2023/04/11 | 1696 | systems/texlive/tlnet/archive/collection-publishers.r66821.tar.xz
+2023/04/11 | 16847 | macros/latex/contrib/photobook/scripts/make-spreads.sh
+2023/04/11 | 167 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__formatting__bibtex_internal_command.snap
+2023/04/11 | 1678 | biblio/ctan-bibdata/biblatex-ctan/ctan.bbx
+2023/04/11 | 1672 | support/texlab/crates/parser/src/snapshots/parser__build_log__tests__parse@006.txt.snap
+2023/04/11 | 1668 | support/texlab/crates/texlab/src/features/build/progress.rs
+2023/04/11 | 1668 | support/texlab/crates/syntax/src/latex/kind.rs
+2023/04/11 | 1654 | support/texlab/crates/texlab/src/features/completion/citation.rs
+2023/04/11 | 164576 | macros/latex/contrib/photobook/photobook.cls
+2023/04/11 | 1626 | support/texlab/crates/citeproc/src/field/number.rs
+2023/04/11 | 160 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__formatting__bibtex_internal_preamble.snap
+2023/04/11 | 1605 | support/texlab/crates/texlab/src/util/line_index_ext.rs
+2023/04/11 | 15 | support/texlab/crates/parser/src/test_data/latex/label/label_reference_range_incomplete.txt
+2023/04/11 | 15 | support/texlab/crates/parser/src/test_data/latex/color/color_set_definition_error4.txt
+2023/04/11 | 15 | support/texlab/crates/parser/src/test_data/latex/citation/citation_prenote.txt
+2023/04/11 | 15 | support/texlab/crates/parser/src/test_data/latex/citation/citation_multiple_keys.txt
+2023/04/11 | 1590 | support/texlab/crates/texlab/src/features/workspace_command/dep_graph.rs
+2023/04/11 | 1586 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__inlay_hint__label_definition.snap
+2023/04/11 | 157 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__formatting__bibtex_internal_trailing_comma.snap
+2023/04/11 | 157 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__formatting__bibtex_internal_insert_braces.snap
+2023/04/11 | 1558 | support/latexindent/latexindent-module-installer.pl
+2023/04/11 | 1556 | support/texlab/crates/texlab/src/features/completion/import.rs
+2023/04/11 | 154 | systems/texlive/tlnet/update-tlmgr-r66822.exe.sha512
+2023/04/11 | 153 | systems/texlive/tlnet/update-tlmgr-r66822.sh.sha512
+2023/04/11 | 153 | systems/texlive/tlnet/install-tl-windows.exe.sha512
+2023/04/11 | 152 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512
+2023/04/11 | 1527 | macros/latex/contrib/photobook/LICENSE
+2023/04/11 | 14 | support/texlab/crates/parser/src/test_data/latex/label/label_reference_multiple.txt
+2023/04/11 | 14 | support/texlab/crates/parser/src/test_data/latex/generic_command_args.txt
+2023/04/11 | 1488 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__document_symbol__section_flat.snap
+2023/04/11 | 1485 | support/latexindent/LatexIndent/DoubleBackSlash.pm
+2023/04/11 | 1464 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@glossary__acronym_declaration.txt.snap
+2023/04/11 | 145 | systems/texlive/tlnet/install-tl.zip.sha512
+2023/04/11 | 144 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512
+2023/04/11 | 1447948 | systems/texlive/tlnet/archive/tex4ht.source.r66823.tar.xz
+2023/04/11 | 143 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__formatting__bibtex_internal_string.snap
+2023/04/11 | 142873 | macros/latex/contrib/photobook/photobook.pdf
+2023/04/11 | 14221 | macros/latex/contrib/photobook/scripts/README.md
+2023/04/11 | 1415 | support/texlab/crates/citeproc/src/snapshots/citeproc__tests__mvbook_nietzsche_1988.snap
+2023/04/11 | 1404 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__document_symbol__equation_flat.snap
+2023/04/11 | 1402 | support/texlab/crates/texlab/src/features/reference/string.rs
+2023/04/11 | 13 | support/texlab/crates/parser/src/test_data/latex/include/package_include_empty.txt
+2023/04/11 | 13 | support/texlab/crates/parser/src/test_data/latex/group/curly_group_simple.txt
+2023/04/11 | 13 | support/texlab/crates/parser/src/test_data/latex/equation.txt
+2023/04/11 | 13 | support/texlab/crates/parser/src/test_data/latex/color/color_reference_simple.txt
+2023/04/11 | 1398 | support/texlab/crates/citeproc/src/snapshots/citeproc__tests__book_averroes_1998.snap
+2023/04/11 | 13890 | support/latexindent/LatexIndent/Special.pm
+2023/04/11 | 136384 | systems/texlive/tlnet/archive/tex4ht.doc.r66823.tar.xz
+2023/04/11 | 135 | support/texlab/crates/parser/src/test_data/latex/issue_853.txt
+2023/04/11 | 1359 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@glossary__acronym_definition_options.txt.snap
+2023/04/11 | 13426 | support/texlab/crates/texlab/tests/lsp/text_document/completion.rs
+2023/04/11 | 13419 | support/latexindent/LatexIndent/HiddenChildren.pm
+2023/04/11 | 13414 | support/texlab/crates/texlab/src/features/symbol/latex.rs
+2023/04/11 | 1339 | support/texlab/crates/texlab/tests/lsp/workspace/snapshots/lsp__workspace__symbol__filter_type_section.snap
+2023/04/11 | 13353 | support/texlab/crates/parser/src/test_data/build_log/005.txt
+2023/04/11 | 132 | support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__formatting__bibtex_internal_parens.snap
+2023/04/11 | 1327 | support/texlab/crates/texlab/src/features/inlay_hint/label.rs
+2023/04/11 | 1322 | support/texlab/crates/texlab/tests/lsp/text_document/document_highlight.rs
+2023/04/11 | 1317 | support/texlab/crates/citeproc/src/snapshots/citeproc__tests__article_blom_2021.snap
+2023/04/11 | 13072 | support/latexindent/LatexIndent/LogFile.pm
+2023/04/11 | 1305 | support/texlab/crates/texlab/src/features/rename/command.rs
+2023/04/11 | 1301 | support/texlab/crates/citeproc/src/snapshots/citeproc__tests__article_kastenholz_2006.snap
+2023/04/11 | 1300 | support/texlab/crates/texlab/src/features/definition/command.rs
+2023/04/11 | 12 | support/texlab/crates/texlab/tests/lsp/workspace.rs
+2023/04/11 | 12 | support/texlab/crates/parser/src/test_data/latex/hello_world.txt
+2023/04/11 | 12 | support/texlab/crates/parser/src/test_data/latex/group/curly_group_missing_end.txt
+2023/04/11 | 12 | support/texlab/crates/parser/src/test_data/latex/citation/citation_redundant_comma.txt
+2023/04/11 | 1283 | support/texlab/crates/texlab/src/features/inlay_hint.rs
+2023/04/11 | 12646 | support/latexindent/LatexIndent/Braces.pm
+2023/04/11 | 1260 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@structure__structure_enum_item.txt.snap
+2023/04/11 | 125 | support/texlab/crates/parser/src/lib.rs
+2023/04/11 | 1244704 | support/latexindent/documentation/latexindent.pdf
+2023/04/11 | 1238 | support/texlab/crates/texlab/src/features/completion/color_model.rs
+2023/04/11 | 1210 | support/texlab/crates/citeproc/src/snapshots/citeproc__tests__book_knuth_1984.snap
+2023/04/11 | 1208 | support/texlab/crates/texlab/tests/lsp/text_document/folding_range.rs
+2023/04/11 | 1205 | support/texlab/crates/texlab/benches/bench_main.rs
+2023/04/11 | 11 | support/texlab/crates/parser/src/test_data/latex/label/label_reference_equation.txt
+2023/04/11 | 11 | support/texlab/crates/parser/src/test_data/latex/label/label_definition_simple.txt
+2023/04/11 | 11 | support/texlab/crates/parser/src/test_data/latex/include/import_incomplete.txt
+2023/04/11 | 1191 | support/texlab/crates/texlab/src/features/definition/entry.rs
+2023/04/11 | 1191 | support/texlab/crates/texlab/src/features/completion/glossary_ref.rs
+2023/04/11 | 1191 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@environment__environment_nested_missing_braces.txt.snap
+2023/04/11 | 1189 | support/texlab/crates/texlab/src/features/hover/string_ref.rs
+2023/04/11 | 11868 | support/texlab/crates/citeproc/src/tests.rs
+2023/04/11 | 1177 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@command_definition__command_definition_with_begin.txt.snap
+2023/04/11 | 1171 | support/texlab/crates/texlab/src/features/hover.rs
+2023/04/11 | 1170 | support/texlab/crates/base-db/src/semantics/auxiliary.rs
+2023/04/11 | 1163 | support/texlab/crates/citeproc/src/snapshots/citeproc__tests__inproceedings_combi_2004.snap
+2023/04/11 | 1161 | support/texlab/crates/texlab/src/features/definition/label.rs
+2023/04/11 | 1157 | support/texlab/crates/texlab/tests/lsp/text_document/document_link.rs
+2023/04/11 | 1157234 | support/TeX4ht/source/tex4ht-4ht.tex
+2023/04/11 | 11420 | support/texlab/crates/parser/src/bibtex.rs
+2023/04/11 | 114032 | systems/texlive/tlnet/archive/texlive-scripts.r66817.tar.xz
+2023/04/11 | 1133984 | systems/texlive/tlnet/archive/tex4ht.r66823.tar.xz
+2023/04/11 | 11300 | support/latexindent/LatexIndent/FileContents.pm
+2023/04/11 | 1124 | support/texlab/crates/distro/src/language.rs
+2023/04/11 | 1121 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@environment__environment_nested.txt.snap
+2023/04/11 | 1116288 | systems/texlive/tlnet/archive/elteikthesis.doc.r66820.tar.xz
+2023/04/11 | 11162542 | support/latexindent.zip
+2023/04/11 | 11142 | support/latexindent/LatexIndent/Heading.pm
+2023/04/11 | 1112 | support/texlab/crates/parser/src/test_data/bibtex/samples/nietzsche_1998.txt
+2023/04/11 | 1103 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@environment__environment_definition.txt.snap
+2023/04/11 | 11015 | support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@samples__nietzsche_1998.txt.snap
+2023/04/11 | 10 | support/texlab/crates/parser/src/test_data/latex/citation/citation_star.txt
+2023/04/11 | 10 | support/texlab/crates/parser/src/test_data/latex/citation/citation_simple.txt
+2023/04/11 | 1083 | support/texlab/crates/texlab/src/features/formatting.rs
+2023/04/11 | 1074 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@environment__environment_asymptote.txt.snap
+2023/04/11 | 1070 | support/texlab/crates/texlab/src/features/reference.rs
+2023/04/11 | 1067 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__package_include_options.txt.snap
+2023/04/11 | 1066 | support/texlab/crates/texlab/src/features/rename/label.rs
+2023/04/11 | 1066 | support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__class_include_options.txt.snap
+2023/04/11 | 10620 | support/latexindent/LatexIndent/Command.pm
+2023/04/11 | 1052 | support/texlab/crates/citeproc/src/snapshots/citeproc__tests__article_aksin_2006.snap
+2023/04/11 | 1050 | support/texlab/crates/citeproc/src/snapshots/citeproc__tests__article_jain_1999.snap
+2023/04/11 | 1049 | support/texlab/crates/texlab/src/features/highlight/label.rs
+2023/04/11 | 1040300 | systems/texlive/tlnet/archive/kpathsea.doc.r66822.tar.xz
+2023/04/11 | 1038 | support/texlab/crates/citeproc/src/snapshots/citeproc__tests__inproceedings_erwin_2007.snap
+2023/04/11 | 10380 | support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@samples__averroes_1998.txt.snap
+2023/04/11 | 1037 | support/texlab/crates/texlab/src/features/definition/string.rs
+2023/04/11 | 1021 | support/texlab/crates/texlab/tests/lsp/workspace/snapshots/lsp__workspace__symbol__filter_type_item.snap
+2023/04/11 | 10191 | macros/latex/contrib/photobook/Makefile
+2023/04/11 | 1015496 | systems/texlive/tlnet/archive/elteiktdk.doc.r66821.tar.xz
+2023/04/11 | 1008 | support/texlab/crates/parser/src/test_data/bibtex/samples/averroes_1998.txt
+2023/04/11 | 1007 | support/texlab/crates/texlab/src/features/reference/label.rs
2023/04/10 | 93792 | macros/latex/contrib/elteikthesis/elteikthesis_minted.pdf
2023/04/10 | 83904 | systems/texlive/tlnet/archive/luatexja.source.r66814.tar.xz
2023/04/10 | 73764 | systems/texlive/tlnet/archive/metapost.r66815.tar.xz
+2023/04/10 | 7143 | systems/texlive/tlnet/tlpkg/installer/ctan-mirrors.pl
2023/04/10 | 6290 | macros/latex/contrib/elteiktdk/samples_hu/impl.tex
2023/04/10 | 6285 | macros/latex/contrib/elteikthesis/samples_hu/impl.tex
+2023/04/10 | 62080 | macros/luatex/latex/piton/piton-french.tex
2023/04/10 | 6199 | macros/latex/contrib/elteiktdk/samples_en/impl.tex
2023/04/10 | 6198 | macros/latex/contrib/elteikthesis/samples_en/impl.tex
+2023/04/10 | 5972 | biblio/bibtex/bibtex-x/tests/substra.bbl
2023/04/10 | 5878 | macros/latex/contrib/elteiktdk/elteiktdk.cls
2023/04/10 | 587852 | systems/texlive/tlnet/archive/nostarch.doc.r66812.tar.xz
-2023/04/10 | 5735742 | systems/texlive/tlnet/install-tl-unx.tar.gz
2023/04/10 | 528 | macros/latex/contrib/elteikthesis/elteikthesis_minted.tex
-2023/04/10 | 48 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5
2023/04/10 | 463564 | macros/latex/contrib/elteikthesis/elteikthesis_hu.pdf
-2023/04/10 | 455 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc
-2023/04/10 | 455 | systems/texlive/tlnet/install-tl.zip.sha512.asc
-2023/04/10 | 455 | systems/texlive/tlnet/install-tl-windows.exe.sha512.asc
-2023/04/10 | 455 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512.asc
2023/04/10 | 434374 | macros/latex/contrib/elteikthesis/elteikthesis_en.pdf
-2023/04/10 | 423552 | systems/texlive/tlnet/archive/texlive-scripts.doc.r66811.tar.xz
-2023/04/10 | 4059583 | biblio/ctan-bibdata.zip
+2023/04/10 | 4135 | biblio/bibtex/bibtex-x/tests/testsubstr.bst
2023/04/10 | 3909 | macros/latex/contrib/elteikthesis/README_hu.md
-2023/04/10 | 3662677 | biblio/ctan-bibdata/ctan.pdf
2023/04/10 | 3569 | macros/latex/contrib/elteikthesis/README.md
2023/04/10 | 3454 | macros/latex/contrib/elteiktdk/README_hu.md
2023/04/10 | 3336 | macros/latex/contrib/elteikthesis/elteikthesis_hu.tex
@@ -31,32 +682,24 @@
2023/04/10 | 3111 | macros/latex/contrib/elteiktdk/elteiktdk_hu.tex
2023/04/10 | 306031 | macros/latex/contrib/elteiktdk/elteiktdk_en.pdf
2023/04/10 | 3046 | macros/latex/contrib/elteiktdk/elteiktdk_en.tex
-2023/04/10 | 2777199 | biblio/ctan-bibdata/ctan.bib
-2023/04/10 | 26025645 | systems/texlive/tlnet/install-tl.zip
2023/04/10 | 2480 | macros/latex/contrib/elteikthesis/samples_hu/sim.tex
2023/04/10 | 2480 | macros/latex/contrib/elteiktdk/samples_hu/sim.tex
2023/04/10 | 2473 | macros/latex/contrib/elteikthesis/samples_en/sim.tex
2023/04/10 | 2473 | macros/latex/contrib/elteiktdk/samples_en/sim.tex
2023/04/10 | 2447124 | systems/texlive/tlnet/archive/metapost.doc.r66815.tar.xz
-2023/04/10 | 2438476 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz
2023/04/10 | 22224 | systems/texlive/tlnet/archive/nostarch.source.r66812.tar.xz
-2023/04/10 | 21036061 | systems/texlive/tlnet/install-tl-windows.exe
+2023/04/10 | 20399 | biblio/bibtex/bibtex-x/ChangeLog
2023/04/10 | 193088 | systems/texlive/tlnet/archive/luatexja.r66814.tar.xz
-2023/04/10 | 18035035 | systems/texlive/tlnet/tlpkg/texlive.tlpdb
+2023/04/10 | 19075 | biblio/bibtex/bibtex-x/tests/substru.bbl
2023/04/10 | 172359 | macros/latex/contrib/elteikthesis/README_hu.pdf
2023/04/10 | 169068 | macros/latex/contrib/elteiktdk/README_hu.pdf
2023/04/10 | 168297 | macros/latex/contrib/elteikthesis/README.pdf
-2023/04/10 | 1678 | biblio/ctan-bibdata/biblatex-ctan/ctan.bbx
2023/04/10 | 16734 | macros/latex/contrib/elteikthesis/elteikthesis.cls
2023/04/10 | 166760 | macros/latex/contrib/elteiktdk/README.pdf
-2023/04/10 | 153 | systems/texlive/tlnet/install-tl-windows.exe.sha512
2023/04/10 | 153756 | systems/texlive/tlnet/archive/photobook.doc.r66813.tar.xz
-2023/04/10 | 152 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512
2023/04/10 | 1514579 | macros/latex/contrib/elteikthesis.zip
2023/04/10 | 1512 | macros/latex/contrib/elteikthesis/elteikthesis.bib
2023/04/10 | 1512 | macros/latex/contrib/elteiktdk/elteiktdk.bib
-2023/04/10 | 145 | systems/texlive/tlnet/install-tl.zip.sha512
-2023/04/10 | 144 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512
2023/04/10 | 1424 | macros/latex/contrib/elteikthesis/LICENSE
2023/04/10 | 1261484 | macros/latex/contrib/elteiktdk.zip
2023/04/10 | 1198 | macros/latex/contrib/elteikthesis/samples_en/intro.tex
@@ -67,7 +710,6 @@
2023/04/10 | 11690 | macros/latex/contrib/elteikthesis/samples_hu/user.tex
2023/04/10 | 11687 | macros/latex/contrib/elteikthesis/samples_en/user.tex
2023/04/10 | 11683 | macros/latex/contrib/elteiktdk/samples_hu/spec.tex
-2023/04/10 | 114016 | systems/texlive/tlnet/archive/texlive-scripts.r66811.tar.xz
2023/04/10 | 1093458 | macros/latex/contrib/elteikthesis/images/elte_cimer_szines.eps
2023/04/10 | 1093458 | macros/latex/contrib/elteiktdk/images/elte_cimer_szines.eps
2023/04/10 | 1081 | macros/latex/contrib/elteiktdk/samples_hu/sum.tex
@@ -82,7 +724,6 @@
2023/04/09 | 945 | macros/luatex/generic/luatexja/doc/jfm-testf.lua
2023/04/09 | 91292 | macros/latex/contrib/nostarch/nostarch.dtx
2023/04/09 | 896 | macros/luatex/generic/luatexja/tool/otf-KozMinPr6N-Regular.txt
-2023/04/09 | 890 | macros/latex/contrib/photobook/scripts/make-spreads.cfg.example
2023/04/09 | 885 | macros/luatex/generic/luatexja/src/patches/lltjp-stfloats.sty
2023/04/09 | 88423 | systems/win32/miktex/tm/packages/next/miktex-png-bin-x64-2.9.tar.lzma
2023/04/09 | 8831 | systems/win32/miktex/tm/packages/next/miktex-md5-bin-x64-2.9.tar.lzma
@@ -112,7 +753,6 @@
2023/04/09 | 73334 | systems/win32/miktex/tm/packages/next/miktex-graphite2-bin-x64-2.9.tar.lzma
2023/04/09 | 72979 | systems/win32/miktex/tm/packages/latexindent.tar.lzma
2023/04/09 | 72919 | systems/win32/miktex/tm/packages/next/miktex-ps2pk-bin-x64-2.9.tar.lzma
-2023/04/09 | 7179 | systems/texlive/tlnet/tlpkg/installer/ctan-mirrors.pl
2023/04/09 | 71228 | systems/win32/miktex/tm/packages/next/miktex-tex4ht-bin-x64-2.9.tar.lzma
2023/04/09 | 702738 | systems/win32/miktex/tm/packages/next/miktex-lcdf-typetools-bin-x64-2.9.tar.lzma
2023/04/09 | 702568 | macros/latex/contrib/nostarch.zip
@@ -168,7 +808,6 @@
2023/04/09 | 4808 | macros/luatex/generic/luatexja/src/jfm-tmin.lua
2023/04/09 | 47872 | systems/texlive/tlnet/archive/thuthesis.source.r66804.tar.xz
2023/04/09 | 473095 | systems/win32/miktex/tm/packages/next/miktex-doc.tar.lzma
-2023/04/09 | 462 | macros/latex/contrib/photobook/DEPENDS.txt
2023/04/09 | 460413 | macros/luatex/generic/luatexja/doc/ltjsclasses.pdf
2023/04/09 | 45763 | systems/win32/miktex/tm/packages/next/miktex-dvipng-bin-x64-2.9.tar.lzma
2023/04/09 | 4521 | macros/luatex/generic/luatexja/src/ltj-stack.lua
@@ -185,7 +824,6 @@
2023/04/09 | 4262 | macros/luatex/generic/luatexja/tool/kyoikukanji.txt
2023/04/09 | 425 | macros/luatex/generic/luatexja/src/patches/lltjp-everyshi.sty
2023/04/09 | 42507 | systems/win32/miktex/tm/packages/next/miktex-upmendex-bin-x64.tar.lzma
-2023/04/09 | 4219 | macros/latex/contrib/photobook/scripts/cls2tex.sh
2023/04/09 | 4215 | macros/luatex/generic/luatexja/src/ltj-charrange.lua
2023/04/09 | 4212 | systems/texlive/tlnet/archive/ifptex.r66803.tar.xz
2023/04/09 | 42038 | systems/win32/miktex/tm/packages/nahuatl__source.tar.lzma
@@ -278,7 +916,6 @@
2023/04/09 | 19588 | systems/win32/miktex/tm/packages/mpchess__source.tar.lzma
2023/04/09 | 192 | macros/luatex/generic/luatexja/src/jfm-mono.lua
2023/04/09 | 19234 | macros/luatex/generic/luatexja/src/patches/lltjp-geometry.sty
-2023/04/09 | 191900 | macros/latex/contrib/photobook.zip
2023/04/09 | 189 | macros/luatex/generic/luatexja/src/patches/lltjp-preview.sty
2023/04/09 | 1897404 | systems/win32/miktex/tm/packages/miktex-zzdb2-2.9.tar.lzma
2023/04/09 | 1896552 | systems/win32/miktex/tm/packages/next/miktex-zzdb2-2.9.tar.lzma
@@ -295,13 +932,10 @@
2023/04/09 | 175385 | systems/win32/miktex/tm/packages/next/miktex-hunspell-bin-x64-2.9.tar.lzma
2023/04/09 | 1740 | macros/luatex/generic/luatexja/tool/test_exist_nodelib.tex
2023/04/09 | 173400 | systems/win32/miktex/tm/packages/next/miktex-tex-bin-x64-2.9.tar.lzma
-2023/04/09 | 1705 | macros/latex/contrib/photobook/README.md
-2023/04/09 | 16847 | macros/latex/contrib/photobook/scripts/make-spreads.sh
2023/04/09 | 166557 | macros/luatex/generic/luatexja/doc/lltjp-geometry.pdf
2023/04/09 | 1655032 | systems/win32/miktex/tm/packages/miktex-zzdb3-2.9.tar.lzma
2023/04/09 | 1654980 | systems/win32/miktex/tm/packages/thuthesis__doc.tar.lzma
2023/04/09 | 1654538 | systems/win32/miktex/tm/packages/next/miktex-zzdb3-2.9.tar.lzma
-2023/04/09 | 165042 | macros/latex/contrib/photobook/photobook.cls
2023/04/09 | 1646024 | systems/texlive/tlnet/archive/thuthesis.doc.r66804.tar.xz
2023/04/09 | 1637 | macros/luatex/generic/luatexja/src/addons/luatexja-fontspec.sty
2023/04/09 | 1611 | macros/luatex/generic/luatexja/src/patches/lltjp-footmisc.sty
@@ -313,16 +947,12 @@
2023/04/09 | 154928 | macros/luatex/generic/luatexja/src/ltj-ivd_aj1.lua
2023/04/09 | 15429 | macros/luatex/generic/luatexja/src/ltj-rmlgbm.lua
2023/04/09 | 1536 | macros/luatex/generic/luatexja/COPYING
-2023/04/09 | 1527 | macros/latex/contrib/photobook/LICENSE
2023/04/09 | 151736 | systems/texlive/tlnet/archive/texlive-msg-translations.r66808.tar.xz
2023/04/09 | 1515013 | systems/win32/miktex/tm/packages/next/miktex-runtime-bin-x64-2.9.tar.lzma
2023/04/09 | 14914 | macros/luatex/generic/luatexja/src/patches/lltjp-listings.sty
2023/04/09 | 14573 | systems/win32/miktex/tm/packages/tikz-trackschematic__source.tar.lzma
2023/04/09 | 1455707 | systems/win32/miktex/tm/packages/next/miktex-dvisvgm-bin-x64-2.9.tar.lzma
2023/04/09 | 14447 | systems/win32/miktex/tm/packages/next/miktex-zzip-bin-x64-2.9.tar.lzma
-2023/04/09 | 1443208 | systems/texlive/tlnet/archive/tex4ht.source.r66806.tar.xz
-2023/04/09 | 143035 | macros/latex/contrib/photobook/photobook.pdf
-2023/04/09 | 14221 | macros/latex/contrib/photobook/scripts/README.md
2023/04/09 | 140765 | systems/win32/miktex/tm/packages/next/miktex-mktex-bin-x64-2.9.tar.lzma
2023/04/09 | 1397 | macros/luatex/generic/luatexja/tool/ivslist.tex
2023/04/09 | 1395565 | systems/win32/miktex/tm/packages/mpchess__doc.tar.lzma
@@ -330,7 +960,6 @@
2023/04/09 | 13815 | macros/latex/contrib/nostarch/nssample.tex
2023/04/09 | 13726 | macros/luatex/generic/luatexja/doc/lltjp-geometry.tex
2023/04/09 | 1367 | macros/latex/contrib/nostarch/Makefile
-2023/04/09 | 136384 | systems/texlive/tlnet/archive/tex4ht.doc.r66806.tar.xz
2023/04/09 | 135905 | systems/win32/miktex/tm/packages/next/miktex-dvips-bin-x64-2.9.tar.lzma
2023/04/09 | 134137 | systems/win32/miktex/tm/packages/pst-bar__doc.tar.lzma
2023/04/09 | 1338191 | systems/win32/miktex/tm/packages/next/miktex-poppler-bin-x64-2.9.tar.lzma
@@ -352,7 +981,6 @@
2023/04/09 | 1150 | systems/win32/miktex/tm/packages/next/pr.ini
2023/04/09 | 11506 | macros/luatex/generic/luatexja/src/jfm-ujisv.lua
2023/04/09 | 1148687 | macros/luatex/generic/luatexja/doc/luatexja-ja.pdf
-2023/04/09 | 1133944 | systems/texlive/tlnet/archive/tex4ht.r66806.tar.xz
2023/04/09 | 11335 | macros/luatex/generic/luatexja/tool/unicodeBlocks.tex
2023/04/09 | 1130 | macros/luatex/generic/luatexja/tool/function_uax50.lua
2023/04/09 | 112942 | systems/win32/miktex/tm/packages/next/miktex-gd-bin-x64-2.9.tar.lzma
@@ -362,7 +990,6 @@
2023/04/09 | 105428 | systems/win32/miktex/tm/packages/next/miktex-mfware-bin-x64-2.9.tar.lzma
2023/04/09 | 103723 | systems/win32/miktex/tm/packages/next/miktex-lua53-bin-x64-2.9.tar.lzma
2023/04/09 | 103608 | systems/win32/miktex/tm/packages/next/miktex-cweb-bin-x64-2.9.tar.lzma
-2023/04/09 | 10191 | macros/latex/contrib/photobook/Makefile
2023/04/09 | 101615 | systems/win32/miktex/tm/packages/next/miktex-bibtex8bit-bin-x64-2.9.tar.lzma
2023/04/09 | 10148 | systems/win32/miktex/tm/packages/pst-bar__source.tar.lzma
2023/04/08 | 9552 | macros/generic/ifptex.zip
@@ -461,7 +1088,6 @@
2023/04/08 | 28167 | systems/texlive/tlnet/tlpkg/TeXLive/TLPaper.pm
2023/04/08 | 2801 | fonts/gelasio/enc/gls_5xld5w.enc
2023/04/08 | 2747624 | systems/texlive/tlnet/archive/simpleicons.r66795.tar.xz
-2023/04/08 | 221392 | support/TeX4ht/source/ChangeLog
2023/04/08 | 2107404 | install/fonts/gelasio.tds.zip
2023/04/08 | 2076924 | fonts/gelasio.zip
2023/04/08 | 20547 | fonts/gelasio/map/gelasio.map
@@ -747,7 +1373,6 @@
2023/04/08 | 1292 | fonts/gelasio/tfm/Gelasio-Bold-sup-ot1.tfm
2023/04/08 | 1288 | fonts/gelasio/tfm/Gelasio-Regular-sup-ot1.tfm
2023/04/08 | 1284 | fonts/gelasio/tfm/Gelasio-Medium-sup-ot1.tfm
-2023/04/07 | 9839 | support/latexindent/LatexIndent/Lines.pm
2023/04/07 | 948980 | systems/win32/miktex/tm/packages/milsymb__doc.tar.lzma
2023/04/07 | 941771 | graphics/pgf/contrib/yquant.zip
2023/04/07 | 93900 | systems/win32/miktex/tm/packages/biblatex-gb7714-2015__source.tar.lzma
@@ -758,12 +1383,8 @@
2023/04/07 | 898326 | systems/win32/miktex/tm/packages/babel__doc.tar.lzma
2023/04/07 | 89510 | systems/win32/miktex/tm/packages/stex.tar.lzma
2023/04/07 | 890297 | systems/win32/miktex/tm/packages/l3backend__doc.tar.lzma
-2023/04/07 | 8829 | support/latexindent/LatexIndent/IfElseFi.pm
-2023/04/07 | 8703632 | support/latexindent/bin/windows/latexindent.exe
2023/04/07 | 863 | macros/latex/contrib/thuthesis/thuthesis-inline.cbx
2023/04/07 | 856773 | systems/win32/miktex/tm/packages/scikgtex__doc.tar.lzma
-2023/04/07 | 8462 | support/latexindent/LatexIndent/FileExtension.pm
-2023/04/07 | 838 | support/latexindent/LatexIndent/Version.pm
2023/04/07 | 80783 | systems/win32/miktex/tm/packages/l3experimental__source.tar.lzma
2023/04/07 | 804453 | systems/win32/miktex/tm/packages/widows-and-orphans__doc.tar.lzma
2023/04/07 | 79994 | systems/win32/miktex/tm/packages/graph35__source.tar.lzma
@@ -771,44 +1392,27 @@
2023/04/07 | 778 | macros/latex/contrib/thuthesis/thuthesis-bachelor.bbx
2023/04/07 | 764 | fonts/simpleicons/tfm/SimpleIcons--simpleiconsOneZero.tfm
2023/04/07 | 7514 | macros/latex/contrib/thuthesis/README.md
-2023/04/07 | 7428 | support/latexindent/LatexIndent/BackUpFileProcedure.pm
2023/04/07 | 736242 | systems/win32/miktex/tm/packages/l3build__doc.tar.lzma
-2023/04/07 | 7280 | support/latexindent/LatexIndent/MandatoryArgument.pm
2023/04/07 | 727272 | systems/win32/miktex/tm/packages/babel__source.tar.lzma
-2023/04/07 | 7161 | support/latexindent/documentation/figure-schematic.png
2023/04/07 | 7121 | systems/win32/miktex/tm/packages/scikgtex.tar.lzma
2023/04/07 | 7112 | systems/win32/miktex/tm/packages/filecontents__source.tar.lzma
-2023/04/07 | 6882 | support/latexindent/LatexIndent/TrailingComments.pm
2023/04/07 | 685908 | systems/win32/miktex/tm/packages/ragged2e__doc.tar.lzma
-2023/04/07 | 6807 | support/latexindent/LatexIndent/Environment.pm
-2023/04/07 | 6717 | support/latexindent/LatexIndent/Item.pm
2023/04/07 | 665 | fonts/simpleicons/README.md
2023/04/07 | 66285 | systems/win32/miktex/tm/packages/siunitx.tar.lzma
-2023/04/07 | 6522 | support/latexindent/LatexIndent/OptionalArgument.pm
-2023/04/07 | 65092 | support/latexindent/LatexIndent/AlignmentAtAmpersand.pm
2023/04/07 | 642594 | systems/win32/miktex/tm/packages/texinfo__source.tar.lzma
-2023/04/07 | 6393199 | support/latexindent/bin/macos/latexindent
2023/04/07 | 63069 | systems/win32/miktex/tm/packages/acmart__source.tar.lzma
-2023/04/07 | 6271 | support/latexindent/LatexIndent/Else.pm
-2023/04/07 | 6163996 | support/latexindent/bin/linux/latexindent
2023/04/07 | 612478 | systems/win32/miktex/tm/packages/milsymb__source.tar.lzma
2023/04/07 | 602 | macros/latex/contrib/thuthesis/latexmkrc
2023/04/07 | 602832 | systems/win32/miktex/tm/packages/l3kernel__source.tar.lzma
2023/04/07 | 599854 | systems/win32/miktex/tm/packages/tikz-ext__doc.tar.lzma
2023/04/07 | 596844 | systems/win32/miktex/tm/packages/piton__doc.tar.lzma
-2023/04/07 | 5908 | support/latexindent/documentation/contributors.bib
-2023/04/07 | 5808 | support/latexindent/LatexIndent/UnNamedGroupingBracesBrackets.pm
2023/04/07 | 5744 | systems/win32/miktex/tm/packages/muling__source.tar.lzma
2023/04/07 | 548 | macros/latex/contrib/thuthesis/data/acknowledgements.tex
2023/04/07 | 5447 | systems/win32/miktex/tm/packages/songproj.tar.lzma
2023/04/07 | 5438 | macros/latex/contrib/thuthesis/data/denotation.tex
-2023/04/07 | 54385 | support/latexindent/documentation/latexindent-yaml-schema.json
-2023/04/07 | 5429 | support/latexindent/LatexIndent/KeyEqualsValuesBraces.pm
-2023/04/07 | 5390 | support/latexindent/LatexIndent/Check.pm
2023/04/07 | 5383 | systems/win32/miktex/tm/packages/osda.tar.lzma
2023/04/07 | 53243 | systems/win32/miktex/tm/packages/markdown.tar.lzma
2023/04/07 | 52953 | systems/win32/miktex/tm/packages/emo__source.tar.lzma
-2023/04/07 | 52668 | support/latexindent/LatexIndent/GetYamlSettings.pm
2023/04/07 | 516860 | systems/win32/miktex/tm/packages/regstats__doc.tar.lzma
2023/04/07 | 510870 | systems/win32/miktex/tm/packages/pgf-periodictable.tar.lzma
2023/04/07 | 5006608 | fonts/simpleicons.zip
@@ -817,7 +1421,6 @@
2023/04/07 | 4960 | macros/latex/contrib/thuthesis/data/chap02.tex
2023/04/07 | 4863345 | systems/win32/miktex/tm/packages/acmart__doc.tar.lzma
2023/04/07 | 48254 | systems/win32/miktex/tm/packages/piton__source.tar.lzma
-2023/04/07 | 4816 | support/latexindent/LatexIndent/BlankLines.pm
2023/04/07 | 4796 | macros/latex/contrib/thuthesis/thusetup.tex
2023/04/07 | 46921 | systems/win32/miktex/tm/packages/bithesis__source.tar.lzma
2023/04/07 | 4656 | macros/latex/contrib/thuthesis/data/chap01.tex
@@ -827,12 +1430,7 @@
2023/04/07 | 46116 | macros/latex/contrib/thuthesis/thuthesis-numeric.bst
2023/04/07 | 46113 | macros/latex/contrib/thuthesis/thuthesis-bachelor.bst
2023/04/07 | 460041 | macros/latex/contrib/thuthesis/thuthesis-example.pdf
-2023/04/07 | 44096 | support/latexindent/documentation/logo.png
-2023/04/07 | 4402 | support/latexindent/documentation/latex-indent.bib
-2023/04/07 | 4365 | support/latexindent/LatexIndent/RoundBrackets.pm
-2023/04/07 | 4339 | support/latexindent/LatexIndent/NamedGroupingBracesBrackets.pm
2023/04/07 | 43278 | systems/win32/miktex/tm/packages/acmart.tar.lzma
-2023/04/07 | 430280 | support/latexindent/documentation/latexindent.tex
2023/04/07 | 43012 | systems/win32/miktex/tm/packages/genmisc.tar.lzma
2023/04/07 | 4228 | systems/win32/miktex/tm/packages/regstats.tar.lzma
2023/04/07 | 420 | macros/latex/contrib/thuthesis/ref/appendix.bib
@@ -843,18 +1441,14 @@
2023/04/07 | 39110 | systems/win32/miktex/tm/packages/biblatex-apa__source.tar.lzma
2023/04/07 | 38984 | systems/win32/miktex/tm/packages/nicematrix.tar.lzma
2023/04/07 | 3836 | macros/latex/contrib/thuthesis/data/chap03.tex
-2023/04/07 | 3747 | support/latexindent/LatexIndent/Replacement.pm
2023/04/07 | 366 | macros/latex/contrib/thuthesis/thuthesis-bachelor.cbx
2023/04/07 | 365 | macros/latex/contrib/thuthesis/thuthesis-numeric.cbx
2023/04/07 | 36438 | systems/win32/miktex/tm/packages/l3build.tar.lzma
2023/04/07 | 3511446 | systems/win32/miktex/tm/packages/pst-func__doc.tar.lzma
2023/04/07 | 3497002 | systems/win32/miktex/tm/packages/l3experimental__doc.tar.lzma
-2023/04/07 | 3482 | support/latexindent/LatexIndent/HorizontalWhiteSpace.pm
2023/04/07 | 34580 | systems/win32/miktex/tm/packages/tikz-ext__source.tar.lzma
2023/04/07 | 34420 | systems/win32/miktex/tm/packages/l3backend__source.tar.lzma
-2023/04/07 | 3413 | support/latexindent/latexindent.pl
2023/04/07 | 3366 | systems/win32/miktex/tm/packages/tangocolors__source.tar.lzma
-2023/04/07 | 3339 | support/latexindent/LatexIndent/Tokens.pm
2023/04/07 | 32685 | systems/win32/miktex/tm/packages/pst-func__source.tar.lzma
2023/04/07 | 32623 | systems/win32/miktex/tm/packages/biblatex-apa.tar.lzma
2023/04/07 | 325417 | systems/win32/miktex/tm/packages/osda__doc.tar.lzma
@@ -866,7 +1460,6 @@
2023/04/07 | 31379 | systems/win32/miktex/tm/packages/proflycee.tar.lzma
2023/04/07 | 3124 | systems/texlive/tlnet/archive/realhats.source.r66785.tar.xz
2023/04/07 | 3114 | systems/win32/miktex/tm/packages/widows-and-orphans.tar.lzma
-2023/04/07 | 31148 | support/latexindent/LatexIndent/Wrap.pm
2023/04/07 | 2979 | systems/win32/miktex/tm/packages/muling.tar.lzma
2023/04/07 | 2956 | macros/latex/contrib/thuthesis/data/chap04.tex
2023/04/07 | 29450 | systems/win32/miktex/tm/packages/tikz-ext.tar.lzma
@@ -879,12 +1472,9 @@
2023/04/07 | 27877 | systems/win32/miktex/tm/packages/luamplib__source.tar.lzma
2023/04/07 | 274 | fonts/simpleicons/tex/usimpleiconsOneZero.fd
2023/04/07 | 2749 | fonts/simpleicons/enc/simpleiconsFour.enc
-2023/04/07 | 27328 | support/latexindent/LatexIndent/Verbatim.pm
2023/04/07 | 27158 | systems/win32/miktex/tm/packages/latexmk__source.tar.lzma
2023/04/07 | 271541 | systems/win32/miktex/tm/packages/erewhon-math.tar.lzma
2023/04/07 | 2713 | fonts/simpleicons/enc/simpleiconsEight.enc
-2023/04/07 | 2701 | support/latexindent/LatexIndent/Switches.pm
-2023/04/07 | 2690 | support/latexindent/LatexIndent/Preamble.pm
2023/04/07 | 2673 | fonts/simpleicons/enc/simpleiconsTwo.enc
2023/04/07 | 26611 | systems/win32/miktex/tm/packages/bithesis.tar.lzma
2023/04/07 | 2660 | fonts/simpleicons/enc/simpleiconsSix.enc
@@ -901,20 +1491,16 @@
2023/04/07 | 254 | fonts/simpleicons/tex/usimpleiconsSix.fd
2023/04/07 | 254 | fonts/simpleicons/tex/usimpleiconsOne.fd
2023/04/07 | 253150 | systems/win32/miktex/tm/packages/tikz-nfold__doc.tar.lzma
-2023/04/07 | 25284 | support/latexindent/LatexIndent/Document.pm
2023/04/07 | 2523 | systems/win32/miktex/tm/packages/realhats.tar.lzma
2023/04/07 | 2510 | fonts/simpleicons/enc/simpleiconsNine.enc
2023/04/07 | 2482408 | systems/win32/miktex/tm/packages/wargame__doc.tar.lzma
2023/04/07 | 2470 | fonts/simpleicons/enc/simpleiconsFive.enc
2023/04/07 | 2457 | fonts/simpleicons/enc/simpleiconsThree.enc
-2023/04/07 | 24410 | support/latexindent/LatexIndent/Arguments.pm
2023/04/07 | 2409 | fonts/simpleicons/enc/simpleiconsOneZero.enc
2023/04/07 | 23967 | systems/win32/miktex/tm/packages/l3experimental.tar.lzma
2023/04/07 | 2383 | systems/win32/miktex/tm/packages/filecontents.tar.lzma
2023/04/07 | 237679 | systems/win32/miktex/tm/packages/citation-style-language__doc.tar.lzma
2023/04/07 | 236566 | systems/win32/miktex/tm/packages/wargame.tar.lzma
-2023/04/07 | 2320 | support/latexindent/LatexIndent/Logger.pm
-2023/04/07 | 22877 | support/latexindent/defaultSettings.yaml
2023/04/07 | 2280 | macros/latex/contrib/thuthesis/data/abstract.tex
2023/04/07 | 226499 | systems/win32/miktex/tm/packages/euler-math.tar.lzma
2023/04/07 | 22396 | systems/win32/miktex/tm/packages/milsymb.tar.lzma
@@ -927,15 +1513,12 @@
2023/04/07 | 2118263 | systems/doc/luatex.zip
2023/04/07 | 210492 | macros/latex/contrib/thuthesis/thuthesis.dtx
2023/04/07 | 2088825 | systems/win32/miktex/tm/packages/kpfonts-otf__doc.tar.lzma
-2023/04/07 | 20797 | support/latexindent/LatexIndent/Indent.pm
-2023/04/07 | 20766 | support/latexindent/LatexIndent/Sentence.pm
2023/04/07 | 20747 | systems/win32/miktex/tm/packages/univie-ling__source.tar.lzma
2023/04/07 | 20646 | systems/win32/miktex/tm/packages/kpfonts-otf__source.tar.lzma
2023/04/07 | 20618 | systems/win32/miktex/tm/packages/pst-func.tar.lzma
2023/04/07 | 2024 | macros/latex/contrib/thuthesis/Makefile
2023/04/07 | 202069 | systems/win32/miktex/tm/packages/babel.tar.lzma
2023/04/07 | 201698 | systems/win32/miktex/tm/packages/wargame__source.tar.lzma
-2023/04/07 | 2008 | support/latexindent/README
2023/04/07 | 2004495 | fonts/simpleicons/doc/simpleicons.pdf
2023/04/07 | 1984438 | systems/win32/miktex/tm/packages/erewhon-math__doc.tar.lzma
2023/04/07 | 197605 | systems/win32/miktex/tm/packages/pst-hsb__doc.tar.lzma
@@ -950,7 +1533,6 @@
2023/04/07 | 1876014 | systems/win32/miktex/tm/packages/realhats__doc.tar.lzma
2023/04/07 | 1861350 | systems/win32/miktex/tm/packages/concmath-otf__doc.tar.lzma
2023/04/07 | 1860078 | systems/win32/miktex/tm/packages/nicematrix__doc.tar.lzma
-2023/04/07 | 18522 | support/latexindent/LatexIndent/ModifyLineBreaks.pm
2023/04/07 | 1844 | fonts/simpleicons/doc/simpleicons.tex
2023/04/07 | 18433 | systems/win32/miktex/tm/packages/tikzducks.tar.lzma
2023/04/07 | 1836 | macros/latex/contrib/thuthesis/data/appendix-translation.tex
@@ -971,13 +1553,11 @@
2023/04/07 | 16267 | systems/win32/miktex/tm/packages/regstats__source.tar.lzma
2023/04/07 | 161454 | systems/win32/miktex/tm/packages/nicematrix__source.tar.lzma
2023/04/07 | 157123 | systems/win32/miktex/tm/packages/luamplib__doc.tar.lzma
-2023/04/07 | 1558 | support/latexindent/latexindent-module-installer.pl
2023/04/07 | 1557 | fonts/simpleicons/tex/simpleicons.sty
2023/04/07 | 1539089 | systems/win32/miktex/tm/packages/euler-math__doc.tar.lzma
2023/04/07 | 153153 | systems/win32/miktex/tm/packages/muling__doc.tar.lzma
2023/04/07 | 150923 | systems/win32/miktex/tm/packages/structmech__doc.tar.lzma
2023/04/07 | 1506228 | systems/win32/miktex/tm/packages/proflycee__doc.tar.lzma
-2023/04/07 | 1485 | support/latexindent/LatexIndent/DoubleBackSlash.pm
2023/04/07 | 1478 | macros/latex/contrib/thuthesis/data/appendix.tex
2023/04/07 | 1455 | macros/latex/contrib/thuthesis/thuthesis-author-year.bbx
2023/04/07 | 1452 | macros/latex/contrib/thuthesis/data/resume.tex
@@ -985,21 +1565,16 @@
2023/04/07 | 141769 | systems/win32/miktex/tm/packages/concmath-otf.tar.lzma
2023/04/07 | 14110 | systems/win32/miktex/tm/packages/erewhon-math__source.tar.lzma
2023/04/07 | 13987 | systems/win32/miktex/tm/packages/widows-and-orphans__source.tar.lzma
-2023/04/07 | 13890 | support/latexindent/LatexIndent/Special.pm
2023/04/07 | 1387 | macros/latex/contrib/thuthesis/thuthesis.ins
2023/04/07 | 13708 | systems/texlive/tlnet/archive/luatex.r66784.tar.xz
-2023/04/07 | 13419 | support/latexindent/LatexIndent/HiddenChildren.pm
2023/04/07 | 132 | macros/latex/contrib/thuthesis/thuthesis-author-year.cbx
2023/04/07 | 1318490 | systems/win32/miktex/tm/packages/biblatex-gb7714-2015__doc.tar.lzma
-2023/04/07 | 13103 | support/latexindent/LatexIndent/LogFile.pm
2023/04/07 | 130189 | fonts/simpleicons/doc/bindings.tex
2023/04/07 | 12936 | systems/win32/miktex/tm/packages/piton.tar.lzma
2023/04/07 | 12877 | systems/win32/miktex/tm/packages/xcharter-math__source.tar.lzma
2023/04/07 | 128658 | systems/win32/miktex/tm/packages/songproj__doc.tar.lzma
2023/04/07 | 1272492 | systems/win32/miktex/tm/packages/siunitx__doc.tar.lzma
2023/04/07 | 12704 | macros/latex/contrib/thuthesis/spine.pdf
-2023/04/07 | 12646 | support/latexindent/LatexIndent/Braces.pm
-2023/04/07 | 1243960 | support/latexindent/documentation/latexindent.pdf
2023/04/07 | 1236 | fonts/simpleicons/tfm/SimpleIcons--simpleiconsSeven.tfm
2023/04/07 | 12358 | systems/win32/miktex/tm/packages/luamplib.tar.lzma
2023/04/07 | 1232 | fonts/simpleicons/tfm/SimpleIcons--simpleiconsTwo.tfm
@@ -1019,17 +1594,13 @@
2023/04/07 | 1165492 | macros/latex/contrib/thuthesis/thuthesis.pdf
2023/04/07 | 11616 | systems/win32/miktex/tm/packages/concmath-otf__source.tar.lzma
2023/04/07 | 11335 | systems/win32/miktex/tm/packages/tikz-nfold.tar.lzma
-2023/04/07 | 11300 | support/latexindent/LatexIndent/FileContents.pm
2023/04/07 | 112339 | systems/win32/miktex/tm/packages/markdown__source.tar.lzma
2023/04/07 | 1119 | fonts/simpleicons/map/simpleicons.map
-2023/04/07 | 11162198 | support/latexindent.zip
-2023/04/07 | 11142 | support/latexindent/LatexIndent/Heading.pm
2023/04/07 | 1107501 | systems/win32/miktex/tm/packages/kpfonts-otf.tar.lzma
2023/04/07 | 110471 | systems/win32/miktex/tm/packages/latexmk.tar.lzma
2023/04/07 | 11016 | systems/win32/miktex/tm/packages/euler-math__source.tar.lzma
2023/04/07 | 109963 | systems/win32/miktex/tm/packages/emo.tar.lzma
2023/04/07 | 1090890 | systems/win32/miktex/tm/packages/bithesis__doc.tar.lzma
-2023/04/07 | 10620 | support/latexindent/LatexIndent/Command.pm
2023/04/07 | 10124 | systems/win32/miktex/tm/packages/songproj__source.tar.lzma
2023/04/07 | 10001 | macros/latex/contrib/thuthesis/ref/refs.bib
2023/04/06 | 984 | systems/texlive/tlnet/archive/collection-luatex.r66777.tar.xz
@@ -1103,13 +1674,11 @@
2023/04/06 | 1870590 | macros/latex/contrib/proflycee.zip
2023/04/06 | 1790 | graphics/metapost/contrib/macros/mpchess/README.md
2023/04/06 | 1775307 | systems/doc/luatex/luatex.pdf
-2023/04/06 | 1688 | systems/texlive/tlnet/archive/collection-publishers.r66780.tar.xz
2023/04/06 | 15233 | graphics/metapost/contrib/macros/mpchess/metapost/mpchess-skak.mp
2023/04/06 | 1309 | graphics/metapost/contrib/macros/mpchess/doc/fond.pdf
2023/04/06 | 13068 | systems/texlive/tlnet/archive/graph35.source.r66772.tar.xz
2023/04/06 | 119333 | macros/latex/contrib/proflycee/tex/ProfLycee.sty
2023/04/06 | 11844 | systems/texlive/tlnet/archive/texfindpkg.doc.r66777.tar.xz
-2023/04/06 | 1157029 | support/TeX4ht/source/tex4ht-4ht.tex
2023/04/06 | 10867 | macros/latex/contrib/proflycee/tex/proflycee-tools-listings.tex
2023/04/06 | 107622 | systems/texlive/tlnet/tlpkg/translations/ru.po
2023/04/06 | 103515 | systems/texlive/tlnet/tlpkg/translations/sr.po
@@ -1177,104 +1746,3 @@
2023/04/05 | 1091688 | systems/texlive/tlnet/archive/bithesis.doc.r66765.tar.xz
2023/04/05 | 10352 | macros/latex/contrib/realhats/realhats.dtx
2023/04/05 | 101701 | graphics/pgf/contrib/tikzducks/tikzducks-generic.tex
-2023/04/04 | 996 | macros/latex/contrib/siunitx/README.md
-2023/04/04 | 9808 | macros/luatex/generic/luamplib/NEWS
-2023/04/04 | 96197 | macros/luatex/generic/luamplib/luamplib.dtx
-2023/04/04 | 9198 | macros/latex/contrib/siunitx/siunitx-symbol.dtx
-2023/04/04 | 8866 | macros/latex/contrib/siunitx/siunitx-command.dtx
-2023/04/04 | 802084 | systems/texlive/tlnet/archive/widows-and-orphans.doc.r66753.tar.xz
-2023/04/04 | 792 | graphics/graph35/CHANGELOG.md
-2023/04/04 | 738356 | macros/luatex/latex/piton.zip
-2023/04/04 | 72210 | macros/latex/contrib/siunitx/CHANGELOG.md
-2023/04/04 | 703435 | macros/luatex/latex/piton/piton.pdf
-2023/04/04 | 701509 | macros/latex/contrib/ragged2e/ragged2e.pdf
-2023/04/04 | 700131 | macros/latex/contrib/ragged2e.zip
-2023/04/04 | 691514 | macros/latex/contrib/siunitx/siunitx.pdf
-2023/04/04 | 67525 | graphics/graph35/graph35.dtx
-2023/04/04 | 642304 | macros/latex/contrib/siunitx/siunitx-code.pdf
-2023/04/04 | 6321 | macros/latex/contrib/regstats/regstats-example.log
-2023/04/04 | 61769 | macros/latex/contrib/regstats/regstats.dtx
-2023/04/04 | 59937 | macros/luatex/latex/piton/piton-french.tex
-2023/04/04 | 59861 | macros/latex/contrib/regstats/regstats-example.pdf
-2023/04/04 | 5951 | macros/luatex/generic/lua-tinyyaml.zip
-2023/04/04 | 5611 | macros/luatex/generic/luamplib/test-luamplib-latex.tex
-2023/04/04 | 5544 | macros/latex/contrib/siunitx/siunitx-locale.dtx
-2023/04/04 | 547441 | install/macros/latex/contrib/regstats.tds.zip
-2023/04/04 | 54007 | macros/latex/contrib/siunitx/siunitx-table.dtx
-2023/04/04 | 5324 | macros/latex/contrib/regstats/README
-2023/04/04 | 52928 | systems/texlive/tlnet/archive/markdown.r66751.tar.xz
-2023/04/04 | 512258 | support/latexmk.zip
-2023/04/04 | 50939 | macros/latex/contrib/ragged2e/ragged2e.dtx
-2023/04/04 | 49736 | systems/texlive/tlnet/archive/biblatex-gb7714-2015.r66752.tar.xz
-2023/04/04 | 483924 | support/latexmk/latexmk.pl
-2023/04/04 | 4748 | macros/latex/contrib/siunitx/siunitx-abbreviations.cfg
-2023/04/04 | 474650 | macros/latex/contrib/regstats/regstats.pdf
-2023/04/04 | 41032 | support/latexmk/CHANGES
-2023/04/04 | 3872 | macros/luatex/generic/luamplib/test-luamplib-plain.tex
-2023/04/04 | 38160 | macros/latex/contrib/siunitx/siunitx-complex.dtx
-2023/04/04 | 3720 | macros/unicodetex/latex/bithesis/bithesis.ins
-2023/04/04 | 3687 | macros/latex/contrib/siunitx/siunitx.ins
-2023/04/04 | 35994 | macros/latex/contrib/siunitx/siunitx-print.dtx
-2023/04/04 | 3543368 | systems/texlive/tlnet/archive/pst-func.doc.r66750.tar.xz
-2023/04/04 | 33867 | macros/latex/contrib/siunitx/siunitx-compound.dtx
-2023/04/04 | 31776 | macros/latex/contrib/siunitx/siunitx-emulation.dtx
-2023/04/04 | 31738 | macros/latex/contrib/siunitx/siunitx-version-1.cfg
-2023/04/04 | 3131864 | graphics/graph35.zip
-2023/04/04 | 309157 | macros/luatex/latex/piton/piton-french.pdf
-2023/04/04 | 2951 | macros/latex/contrib/siunitx/siunitx-binary.dtx
-2023/04/04 | 2908 | systems/texlive/tlnet/archive/widows-and-orphans.r66753.tar.xz
-2023/04/04 | 2819 | macros/latex/contrib/osda/README.md
-2023/04/04 | 2799724 | systems/texlive/tlnet/archive/citation-style-language.r66749.tar.xz
-2023/04/04 | 27773 | macros/latex/contrib/osda/osda.dtx
-2023/04/04 | 2752 | macros/luatex/generic/luamplib/Makefile
-2023/04/04 | 273398 | macros/latex/contrib/siunitx/siunitx-v2.sty
-2023/04/04 | 2649 | macros/unicodetex/latex/bithesis/contributing-zh.md
-2023/04/04 | 2636 | macros/latex/contrib/siunitx/siunitx-code.tex
-2023/04/04 | 2634 | macros/latex/contrib/osda/osda.ins
-2023/04/04 | 2505 | support/latexmk/README
-2023/04/04 | 248144 | systems/texlive/tlnet/archive/citation-style-language.doc.r66749.tar.xz
-2023/04/04 | 2348 | macros/unicodetex/latex/bithesis/contributing.md
-2023/04/04 | 232876 | support/latexmk/latexmk.txt
-2023/04/04 | 231693 | graphics/graph35/sources.zip
-2023/04/04 | 2294 | graphics/graph35/graph35.ins
-2023/04/04 | 218501 | graphics/graph35/graph35-pixelart.sty
-2023/04/04 | 21753 | graphics/graph35/graph35-en.tex
-2023/04/04 | 21746 | macros/latex/contrib/siunitx/siunitx.dtx
-2023/04/04 | 21726 | macros/luatex/generic/lua-tinyyaml/tinyyaml.lua
-2023/04/04 | 215307 | macros/unicodetex/latex/bithesis/bithesis.dtx
-2023/04/04 | 212107 | support/latexmk/latexmk.pdf
-2023/04/04 | 20396 | systems/texlive/tlnet/archive/pst-func.r66750.tar.xz
-2023/04/04 | 202132 | install/macros/luatex/generic/luamplib.tds.zip
-2023/04/04 | 1996 | macros/luatex/generic/luamplib/README
-2023/04/04 | 1946 | macros/unicodetex/latex/bithesis/README.md
-2023/04/04 | 192843 | macros/latex/contrib/osda/osda.pdf
-2023/04/04 | 1914 | graphics/graph35/README.md
-2023/04/04 | 19106 | graphics/graph35/LICENSE.txt
-2023/04/04 | 188084 | support/latexmk/latexmk.1
-2023/04/04 | 187497 | macros/luatex/generic/luamplib.zip
-2023/04/04 | 18711 | macros/latex/contrib/ragged2e/LICENSE.md
-2023/04/04 | 17951 | support/latexmk/INSTALL
-2023/04/04 | 17885 | macros/latex/contrib/siunitx/siunitx-angle.dtx
-2023/04/04 | 176 | macros/luatex/generic/lua-tinyyaml/README.md
-2023/04/04 | 1729 | macros/latex/contrib/siunitx/siunitx-binary.cfg
-2023/04/04 | 169134 | macros/luatex/latex/piton/piton.dtx
-2023/04/04 | 1658 | macros/latex/contrib/ragged2e/README.md
-2023/04/04 | 162079 | macros/latex/contrib/osda/example.png
-2023/04/04 | 160377 | macros/latex/contrib/siunitx/siunitx.tex
-2023/04/04 | 1566342 | install/macros/latex/contrib/siunitx.tds.zip
-2023/04/04 | 153447 | macros/luatex/generic/luamplib/luamplib.pdf
-2023/04/04 | 153028 | macros/latex/contrib/siunitx/siunitx-number.dtx
-2023/04/04 | 1520898 | macros/latex/contrib/siunitx.zip
-2023/04/04 | 1520378 | graphics/graph35/graph35-fr.pdf
-2023/04/04 | 14969 | macros/latex/contrib/siunitx/siunitx-quantity.dtx
-2023/04/04 | 1467891 | graphics/graph35/graph35-en.pdf
-2023/04/04 | 1405756 | systems/texlive/tlnet/archive/biblatex-gb7714-2015.doc.r66752.tar.xz
-2023/04/04 | 1297 | macros/latex/contrib/ragged2e/ragged2e.ins
-2023/04/04 | 12568 | systems/texlive/tlnet/archive/widows-and-orphans.source.r66753.tar.xz
-2023/04/04 | 12154 | graphics/graph35/graph35-keys.sty
-2023/04/04 | 1166144 | systems/texlive/tlnet/archive/markdown.doc.r66751.tar.xz
-2023/04/04 | 1143630 | macros/unicodetex/latex/bithesis.zip
-2023/04/04 | 111884 | systems/texlive/tlnet/archive/markdown.source.r66751.tar.xz
-2023/04/04 | 1109118 | macros/unicodetex/latex/bithesis/bithesis.pdf
-2023/04/04 | 10931 | macros/latex/contrib/siunitx/siunitx-abbreviation.dtx
-2023/04/04 | 103304 | macros/latex/contrib/siunitx/siunitx-unit.dtx
diff --git a/biblio/ctan-bibdata/ctan.bib b/biblio/ctan-bibdata/ctan.bib
index cdd10836e1..8e7cd4a6ec 100644
--- a/biblio/ctan-bibdata/ctan.bib
+++ b/biblio/ctan-bibdata/ctan.bib
@@ -1,7 +1,7 @@
%% bib file of all CTAN packages
%% (C) Herbert Voß
%%
-%% created at 11-04-2023, 02:00:11
+%% created at 12-04-2023, 02:00:11
%%
%% This file is provided under the terms of the LPPL v1.3 or
@@ -21303,7 +21303,7 @@
title = {The \texttt{elteiktdk} package},
subtitle = {TDK-thesis template for Hungarian TDK conferences, Section of Computer Science},
author = {Máté Cserép},
- date = {2023-04-10},
+ date = {2023-04-11},
version = {2.0},
license = {mit},
mirror = {https://mirror.ctan.org/macros/latex/contrib/elteiktdk},
@@ -37803,8 +37803,8 @@
title = {The \texttt{latexindent} package},
subtitle = {Indent a \LaTeX{} document, highlighting the programming structure},
author = {Chris Hughes},
- date = {2023-04-07},
- version = {3.20.5},
+ date = {2023-04-11},
+ version = {3.20.6},
license = {gpl3},
mirror = {https://mirror.ctan.org/support/latexindent},
url = {https://ctan.org/pkg/latexindent},
@@ -52339,8 +52339,8 @@
title = {The \texttt{photobook} package},
subtitle = {A document class for typesetting photo books},
author = {Alex A. Naanou},
- date = {2023-04-09},
- version = {0.1.17},
+ date = {2023-04-11},
+ version = {0.1.18},
license = {bsd3},
mirror = {https://mirror.ctan.org/macros/latex/contrib/photobook},
url = {https://ctan.org/pkg/photobook},
@@ -52702,8 +52702,8 @@
title = {The \texttt{piton} package},
subtitle = {Typeset Python listings with LPEG},
author = {François Pantigny},
- date = {2023-04-04},
- version = {1.5},
+ date = {2023-04-11},
+ version = {1.5a},
license = {lppl1.3},
mirror = {https://mirror.ctan.org/macros/luatex/latex/piton},
url = {https://ctan.org/pkg/piton},
diff --git a/biblio/ctan-bibdata/ctan.pdf b/biblio/ctan-bibdata/ctan.pdf
index 707b9cd234..674ff089e8 100644
--- a/biblio/ctan-bibdata/ctan.pdf
+++ b/biblio/ctan-bibdata/ctan.pdf
Binary files differ
diff --git a/macros/latex/contrib/photobook/photobook.cls b/macros/latex/contrib/photobook/photobook.cls
index 74f8b8f5e1..8dfe501db3 100644
--- a/macros/latex/contrib/photobook/photobook.cls
+++ b/macros/latex/contrib/photobook/photobook.cls
@@ -1,10 +1,13 @@
%----------------------------------------------------------------------
%
+% photobook.cls
+% -------------
%
% This does the following:
% - sets up the document/pdf for viewing as a book
-% - adds support for page bleeds
-% - adds basic templates for image pages
+% - sets up page bleeds
+% - defines cells as basic template building blocks
+% - adds basic templates for image pages and spreads
%
%
% This file contains both the code and the reference, but in a slightly
@@ -22,7 +25,7 @@
% Docs are built by the Makefile, so reference it for more info.
%
% To make the reference use:
-
+%
% $ make pdf
%
%
@@ -33,32 +36,18 @@
% to edit it directly, edit the source instead.
%
%
+% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
%
-% XXX ASAP \bindingoffset should also affect fill/bleed images... (DONE)
-% ...shift the macros that optionally account for \bindingoffset to
-% account for \gutteroffset (DONE)
-% ...everything should respect \bindingoffset (DONE)
-% XXX ASAP add \gutteroffset and \gutterimageoffset to offset content
-% from the gutter
-% \gutterimageoffset is an additional offset added to bleed images...
-% ...currently \bindingoffset is used for both...
-% Q: should the gutter offsets be counted from the \bindingoffset???
-%
-% +-------------------------------=--
-% | . . . =
-% | . . . =
-% | . . <-> \bindingoffset
-% | . . . =
-% | . <--> = \gutteroffset
-% | . . . =
-% | <--> . = \gutterimageoffset
-% | . . . =
-% +-------------------------------=--
-%
-% XXX DOC...
-%
-%
+% XXX ASAP should cover/jacket/endpaper/spread templates/cells account
+% for \bindingoffset (likely no) and/or \gutteroffset ???
+% ...especially relevant to endpaper/spread...
+% XXX ASAP revise how bleeds are handled by cells...
%
+% XXX captions behave in an odd way...
+% the internal (macro) minipage for some reason does not affect text
+% justification while adding a minipage in the macro argument works
+% as expected -- some odd input mode???
+% XXX Q: should \blockwidth include \bindingoffset (current) or not???
% XXX revise \clearcaption / \captionclearpage...
% XXX unify API -- see CellContent env...
% XXX make this loadable both as a class and as a package...
@@ -68,7 +57,8 @@
% - general macros -- \usecell{..}
% - templates -- \ImagePage{..}
% XXX see where we need to \ignorespaces...
-% XXX might be a good idea to add a spine calculator...
+% XXX might be a good idea to add a spine calculator (auto)...
+% ...i.e. input paper and cover board thickness and auto-calc spine...
% XXX might be fun to add a 'box' layout to build book boxes...
% XXX add a grid cell / image cell (???)
% make it trivial to define AxB cell layouts and fill them (fully/partially)
@@ -80,17 +70,6 @@
% - pre-print
% - customizing
% - extending
-% XXX add basic page templates:
-% - acknowledgements
-% Fields
-% - \Title
-% - \Authors
-% - \Thanks
-% - \ISBN
-% - \Edition / \Issue
-% - \CopyrightNotice
-% - ...
-% - info
% XXX DOC add notes about external libs section:
% - textpos
% cell/cell* depend on absolute mode being set globally
@@ -100,8 +79,8 @@
%%% NOTE: \def\<module-name>@[A-Z]+ macros will be visible to both the
%%% code and the generated docs...
-\edef\photobook@FILEVERSION{v0.1.17}
-\edef\photobook@FILEDATE{2023-04-09}
+\edef\photobook@FILEVERSION{v0.1.18}
+\edef\photobook@FILEDATE{2023-04-11}
%% \documentclass{ltxdoc}
@@ -249,7 +228,6 @@
%% \DescribeMacro{blockheight=<len>}
%% \DescribeMacro{bindingoffset=<len>}
%% \DescribeMacro{gutteroffset=<len>}
-%%% \DescribeMacro{gutterimageoffset=<len>}
%% \DescribeMacro{bleed=<len>}
%
%% This is similar to what |geometry| does, but adds bleed support.
@@ -271,7 +249,7 @@
%% . | blockheight . . = . |
%% . | . | . . <--> bindingoffset |
%% . | | . . = . |
-%% . | . . . . . . | . <--> gutteroffset v
+%% . | . . . . . . | . <--> gutteroffset v
%% . | v . . = .
%% . +-----------------------------------------+----- ^ . . ---
%% . . . . | bleed
@@ -295,7 +273,6 @@
\DeclareStringOption{blockheight}
\DeclareStringOption[0pt]{bindingoffset}[0mm]
\DeclareStringOption[0pt]{gutteroffset}[0mm]
-\DeclareStringOption[0pt]{gutterimageoffset}[0mm]
\DeclareStringOption[5mm]{bleed}[5mm]
%% \DescribeMacro{flatfold=<len>}
@@ -332,6 +309,7 @@
%% \DescribeMacro{endpaper}
%% \DescribeMacro{cover}
%% \DescribeMacro{jacket}
+%%% \DescribeMacro{web}
%
%% Sat page layout mode.
%
@@ -821,7 +799,6 @@
\setlength\bindingoffset{\photobook@bindingoffset}
%% \DescribeMacro{\gutteroffset=<len>}
-%%% \DescribeMacro{\gutterimageoffset=<len>}
%
%% Gutter offsets
%%
@@ -830,8 +807,6 @@
%%
\newlength\gutteroffset
\setlength\gutteroffset{\photobook@gutteroffset}
-\newlength\gutterimageoffset
-\setlength\gutterimageoffset{\photobook@gutterimageoffset}
%% \DescribeMacro{\defaultfoldout=<fold-spec>}
%
@@ -992,7 +967,7 @@
\setlength\clearance{0pt}
-%% \DescribeMacro{\clearfoldoutbinding=<len>}
+%% \DescribeMacro{\clearfoldoutgutter=<len>}
%% \DescribeMacro{\clearfoldoutfold=<len>}
%% \DescribeMacro{\clearfoldoutedge=<len>}
%
@@ -1000,8 +975,8 @@
%%
%% For more info see \nameref{subsec:Foldout page cells} section.
%%
-\newlength\clearfoldoutbinding
-\setlength\clearfoldoutbinding{8mm}
+\newlength\clearfoldoutgutter
+\setlength\clearfoldoutgutter{8mm}
\newlength\clearfoldoutfold
\setlength\clearfoldoutfold{5mm}
\newlength\clearfoldoutedge
@@ -3132,7 +3107,7 @@
%% automatically calculated and missing folds are the same as the previous
%% fold or the default if no folds are specified.
%%
-%% If not |<fold-spec>| is given, then the value of |\defaultfoldout| is
+%% If no |<fold-spec>| is given, then the value of |\defaultfoldout| is
%% used (default: |2|).
%%
%% \begin{minipage}{\textwidth}
@@ -3224,7 +3199,7 @@
%% \end{minipage}
%%
%
-%% \DescribeMacro{\clearfoldoutbinding=<len>}
+%% \DescribeMacro{\clearfoldoutgutter=<len>}
%% \DescribeMacro{\clearfoldoutedge=<len>}
%% \DescribeMacro{\clearfoldoutfold=<len>}
%
@@ -3235,7 +3210,7 @@
%%
%% \clearfoldoutedge <->
%% \clearfoldoutfold <->
-%% <--> \clearfoldoutbinding
+%% <--> \clearfoldoutgutter
%% (3) /\ (2)
%% +---------------------------------+ / \
%% +------------------------------- | /
@@ -3256,7 +3231,7 @@
%% \begin{verbatim}
%%
%% \clearfoldoutedge <-> /
-%% <--> \clearfoldoutbinding (3) /
+%% <--> \clearfoldoutgutter (3) /
%% \
%% +---------------------------------- \ (2)
%% +---------------------------------+ /
@@ -3420,7 +3395,7 @@
\ifnum \thephotobook@foldoutpanel = 2%
\setlength\photobook@foldout@maxpanelwidth{%
\photobook@foldout@maxpanelwidth
- - \clearfoldoutbinding}\fi%
+ - \clearfoldoutgutter}\fi%
% calculate widths...
\ifdim #1 = 0pt%
% first two panels do not need fold compensation...
diff --git a/macros/latex/contrib/photobook/photobook.pdf b/macros/latex/contrib/photobook/photobook.pdf
index 82e080074f..a6f4a5d2d1 100644
--- a/macros/latex/contrib/photobook/photobook.pdf
+++ b/macros/latex/contrib/photobook/photobook.pdf
Binary files differ
diff --git a/macros/luatex/latex/piton/piton-french.pdf b/macros/luatex/latex/piton/piton-french.pdf
index 89aee2d64a..9d1a1b1c27 100644
--- a/macros/luatex/latex/piton/piton-french.pdf
+++ b/macros/luatex/latex/piton/piton-french.pdf
@@ -228,20 +228,21 @@ endobj
<< /S /GoTo /D [ 133 0 R /Fit ] >>
endobj
136 0 obj
-<< /Filter /FlateDecode /Length 3574 >>
+<< /Filter /FlateDecode /Length 3578 >>
stream
xÚ½[;$¹ Î÷WTx cµ©'Ð`zÛ}€3Û›/²a'¾ÀNìŸoêA½ê1Õs=4fª[")’úHª(¹üs‘ËŸdù{ýþéë]¹E9Êh½|ÿÇ'E¿ÈE- ” §ýè—ï¿,?]¤ÔNª»•AJ§¥´!ÿ¯oôüK£âóË”gHõ~õ/Î_ÊL|ùùû#s¿ÉµÝÌÜèÌ 2-L
-™°¸ÁZLOÆkÆ,ŒÐÖ0™ë5M«+µN`P Q–G!­ÒxZØÈ_À]òJˆmú?ŠÅÁkûÎÙ"’†M‘
-^Xw=?=¤SU-ÄVJßüJEª󷲉œ2±ǪïÜš¿õHÓ¨¶J³Jïç1™OE^c/-ÛKGS€Å½4‰ýPéÍU¢ë²È°¦ÔKHòløVBJß#ß›*âF–â~ú…+žÃMþ•KÉü¯µ™äRNÈPå²÷—†ë‘¾®4+T»ºš©ÉЊuÜMlð0ÑDÜ:9èÅû•‡õåþ$"ÎÞG6­Ï‘½Ï|J¡}´ÃÑ¢0ÒÌú›7Ö@ô½;ÜÆZ¢Ð¸¢¶:´ÙVDç–G%›6^H·ÅãŠM§£´‘ìj4DhúØå?ñ`—þücT#îk è[EœÙ
-å|R¼j©|¢,e¦d]•ËÓ¨"Uü—djs0°š«¯]x¾R´ÔÀ
-­õ×Ç´¡P ëVôt·á¸Â)îù¦^ÈM)EXKȆÿuv³!{±ó—˜†î”lÁiÕL„•GV’ÅdåßÁdÅÜã\FyÎàËÁÙ¦éXÕ#…XKDŒƒ[›ŽÉåç¿I²íŸzI)2›`g>¨›£®#-þw˜ë¨f^Í5‡Ãöª¬àW†‰9"lE)Œç/
-‡µ"ˬFwùò´?,9w÷n÷íýA9œ_„AXòžÓ.Ù;©/»dä³ùñ€)ˆÖ®­ñ{ŽÔŸ²Íç‚ù
-S5CÄî û™“&¼‡ð1™ÓH»f~pºÎ­84RÚÎ{;‰Ž\™?%óÊõÛÄ¿œK­«½’§ÍҞʼJÖ6ÎÝ©öŠVhËzõåT#/î°òœ­Y3k‰u+Kveà,lœ­¡ƒÏãƒÝßâPT ³?´Ç­ül¢![n‚ëÓV¼i¡)þO³c´MYÍÞ™#(Þž÷øÛ¬ûQöwë|½‚ç”ÃœóŽô[?Õa¾\2ài5;¶ãœvmŸ’/— x¤ 1=ØÉ™ù`Z÷3¤©§“Ívr[%E„„I-§te(}[ñ¹>c |L1kt{ `„õ1Úä*dÞ3§*˜ReœòÐZe|€‡‚Ž}öxVŸ”—S
-3.Ý:¿Rãh¯à{%^š°4ò].J›úc|”ðG9«SÂ4æc|ÔS…àíû|4 Å2{ÖG ·Hæ¢e—¡õƒ|lF3ñzÂ)цôp¢÷\Q¹¨¤zÏ¥-Úv»]‹Çé±3Ù™÷£éÞ‘kÙ™Jß)”%»eÜ%wûJh¦ìÛ\ºÙÃÈzUC–—ëõVTýxŸ\îbKÔâûÐÖóvÜËB(¤¾­±|·‹ß8Ö+f{µ!¢v¥Á|¡„«OÉ^4P+áú˜@äûÆZ&É J©}º]îš\”ŠPÕ^®Õl5»K»¢1
-$;MA/ŠëlÍûo¼¾ÇlJOiwûdÅMטò7õðû“‚©Ÿ·\»žÂw(¬„Y3­Mµ8õqKB "_ÏT†ûDýåšëØ$êt¯íþEw7§\÷a%qµ†Yi¤Ê<º›zNå»çotPQÉcµY­é1h)~GЪ‚j'hGÍlãÝ5nµÓýëÙ5Þ¶î°%:>·ûÝè·«­¼ùðóµèÌÌsûÆÄmªÑ¾qn[Q=.U|Ýyðy”¾²?|ÿôïY}ä^Jûåo¿|úégúþïôùcL‚_þ›FþBÈCæRqÞ¿–¿|úS¾fLÉ‚¡|ΙáBÕ,&bP¼k†½òý„ÅÑ$/v L(% J‘§c=ÈbXC£kƒq¼ƒ|éz]º˜.ý­šŠrtü5‰Dm(¼3‡WÏÿµKQzºÙ¿¢l—z°4¥ »¾—¸"ixcá`¼°¤Àiå»û`[}ñ,Ù©•äW‡+c`¬ °õ[[玷ƒcÁ—Ÿ1ŒÿOM²A
-é!õ[€õ}ÇU.“néMw¾ 5sqúfØ´é›S]ÀÖöí²–oÄòÛè>‹ëFÜûÙým’üÆ·ôj§±¥V ø—Ûf¡T3¸•4ߢ)2ô}C·ÒÜÞõ^¥@so‹Ç{ ÑQe93­MÍÖ\ÆC)Žëµ¥ÜÖåõ[¥öygýÏ÷©’¶vûª«]›ðÚÏn Ý»»ƒ–/ OüÛ­ D„rl/[Ñ{Xré7ì¦bئšj¦ÓÛ­ƒb“/èu×Û;ŽóŒùmŽ<ãÚFö÷@Ÿãͯ”ðTUÏÒÚº¿ñjÕæ|@¡L˜çGcïLw~¾åힶ<´ñ\~æ[
-ï0~±|„ñÖÕ½õ)Çïç40ŽÑ¾5$•Ù“¯8wBNƧ ¨8é^Š÷ð”ã]ü%m
-¼÷-e§LuJú®M§@RGñ´Ë]uú ýÚ
+™°¸ÁZLOÆkÆ,ŒÐÖ0™ë5M«+µN`P Q–G!­ÒxZØÈ_À]òJˆmú?ŠÅÁkûÎÙ"’†M‘
+¯¾‡×4p^ÓÄD>-ZÁ1{¡ö^xÛëë‚RCäϨW‘<ýš‘<>ÁŠë‚šÈÆÌó*‚·ÜiŸKÖ•fÁëè ™+$¹ž¸9o–˜ÃÚ·G"Õ#ÜŽÙ¦ìMeŽ$GœèB_¢ÁÁp^¶¾VÔ)*zÃ$Ù· åvñGS–é]Ãß¡¨o˜–ñè-h‡)ÊÄ'ŠÆ4ß„ .m­ KlÌ¥¹ ûSÇœÓ^Ù^áÈE‹¾åQ™CâW\#ºhû5¿váxË÷ók,JãÇäª9ÛVú’ç÷ ºˆ·ª•>=ìšíÉ2ͬë#ËkO
+…v¦·3^GF«¶¤A÷.¯³àW0J¢Ð¶ëyf„„ÇåpF(·^—ˆ:YUMØ 1ï‡ó¡)d/…k³é—¾€ˆ°Zãl‹ºzVÉ,î×>
+w¡,ѬEcÓÓÓ#^WÙIÁ{Œ½ºJ {žpï÷ýVÜŠªòÔ‚G–ñèÀÌ“µÌŸ¤òûäZ¶”5.=21ÉQÞp
+)”]I™‚Ö]ÏOéTU ±•Ò7¿RA‘êÀü­l"§L¬Æ±ê;·æo=Ò4ª­Ò¬ÒûyLæS‘×ØKËöÒÑÀ`q/Mb?Tzs•èº,2¬)õ’<~£•Ò÷È÷f†Š¸Q€¥¸Ÿ~áʆçpE“åR2?Ák­E&¹”2T¹ìýÅã¥áz¤¯+ÍŠ
+‡ªÅ86Ø•÷nt
+Ϝ W
+JK}9:BN(?Ÿ[«µÌö°SB+LÕLlÄd#sÒ„÷>&si×ÌN×¹‡FJÛÙa¯s'Ñ‘+ó§d^¹~›ø—s©uµWò´YÚS™WÉÚƹ;Õ^Ñ
+mY¯~£œjäÅ
+tö‡ö¸•ŸM4dËMp}ºÓŠ7-4ÅÿivŒ¶)«Ù;sÂÛóÿa;€u?ÊcÂþ.`¯Wðœr˜sÞ‘~ë§:Ì—K<­fÇvœÓN£íSòå’´!¦;93Lë~†4õÔ`²ÙNn«¤ˆ0©åT‚® ¥o+>×g¬)fn¯Œð >F›\…Ì{æTSªŒSZ«ŒðPбÏÏê“òrJaæÑ¥[çWJbí|`¯Ä‹"–F¾ËE©bóAŒþ(0guJøƒÆ|Œzª¼}Ÿ¤XfÏú(áɼã£SÔ£ì2´~Íh&^O8%ÚNôž+*•TﹸEÛn·kñ¸3=vf83ó~´3Ý;r-;Sé;…²„c·lâ‘{£än_ Í”}›K7{Y¯jÈòr½ÞÌ‚ªÏcâ“Ë]l‰Z|ÚzÞŽ{Y…TÀ·5–ïwñÇzÍl¯6¤BÔ®4˜/”pcõ)Ù‹j%\_³ˆ|ßXË$¹A)µO·Ë]“‹RªÚKõší fwiW4Fd§)èEq­yÿWø˜Mé)ínŸŒ¢¸éSþ¦¾`R0õò6ƒk×S¸ã…•0k¦µ©§>niBTäë™ÊpŸ¨¿\s›DîµÝ¿èîæ”ë>¬$n¢Ö0+T™€Gw`SÏ©|÷âü**y¬6«5=-ÅïZUPíí¨™m¼»Æ­vºý/»ÃÛÖ¶DÇçv¿£ývµ•7~¾™ynߘ¸M5Ú7Îm+ªÇ¥Š¯û1Þ¡3ÒWö‡ïŸþ=«ÜKi¿üí—O?ýLßÿ>Œé@ðËÓÈ_yÈ\*Îû×ò—OÊW)Y0”Ï93\(£šÅD¬ŠwÍ°W¾ß€°8š$ãåÑ® …£dA)òt¬Y khtm0Ž÷/]¯KÂ¥¿USqBŽŽ¡&‘¨ …wæðêù¿v)JO· ûW”íRòÛèýÃÜÒ­Y®àù­ÅC¼‚æÅïn…m ‚§¼Â¬4x{km µ¶~këÜñ~p,ùò3†ü¾k¼j“ RH©ãìx1™„1éžÞt+ì Z3w§o†m›¾9Õlmß0kùN,¿îó¸nĽŸÝß'Éï|K·v[ª
+
+,wõYèS€ôkìû•ïU_.*몞̵xÝwÜï×1Á)Yô$íª~Ûü'h5i26ÿà­ëhçyç}h0”†¸%^jw~:/ ´åÿ§
endstream
endobj
133 0 obj
@@ -363,26 +364,21 @@ endobj
<< /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /Font << /F15 147 0 R /F62 150 0 R /F63 151 0 R /F65 152 0 R /F55 149 0 R /F54 148 0 R /F67 175 0 R /F53 146 0 R /F68 176 0 R /F22 154 0 R /F16 177 0 R /F32 156 0 R /F61 159 0 R >> /ProcSet [ /PDF /Text ] >>
endobj
184 0 obj
-<< /Filter /FlateDecode /Length 4171 >>
-stream
-xڵˎ$·í>_Q?°ŠD½Á
-ÈMm!
-­õæÒ©íëïÛß_¥R—·OVÊW)—R}~û¤­Ç+¸à åíòöË×_¤ˆ´þÿÃË—¯/ÿ­P•6 nÞzáƒÞþñû =°QXð›’€Úþø×öëË_ñA‡¤ƒ’J[ç&,&ðƒ8ºˆ×?¯ñ·&lñ¹¹&lX ¢fàþŠC 0ñîJ øNxÝ/Öž8Èã¬cCÏHÍ3¯ÄÔ7H÷n™*»ßó"Ž> ~·åŽ5oŸ€~h^:–G
-ÿer&'q 'áÊàtæ[Þå9„BbIÈ×i]¹€A¼¯¼–(ÞoÞD¡¤cf,«2{i¿Óe½|a÷šX™˜æå[¥.üqR77mYz…É.Ýe:ÝÍ’²–C0R8³Ãž9W*rx-«#TÐ;u…µ,jéDpv^! Á)nZáÔ7Úµ„_(x}®FZ|^‘DßT~·]#^{áÊ®ÒÚ$ü WèD=Í©²×îÉÓ°–-í…²;-‘æk°È2Ã4§——:*KJÃR~é¨HO˜
->zì!%Ú®=üA6Óz„3"ƒø§¡õxÖnióz
-¥žÝ°t‡é3–I~’¤'ýò¡×R+¼ ÇMy}(Îãz€ aÎN+^Ö—+e«eSÙKSá<`ˆ •ãÕ£jÁèâƒtº‘îv¡N Iøôíý“…#vê…¨˜Ž;muók¸äÏ5ŽÅ£ò ZÑŽLŸ\ÙB_á\¹Zs',¹ã_G­U5qäÂó’ô^"|S?ç†FuæšYsÍ”ï„CѵÚõñ)W­B«¦ÝŽ«kçØ9‰~e;Ù%ŸµlËË&6cLq9\Ùþ4’LÖð¡×OC¢896jŠ=†â“óÉó°²@i…ÞábÝs`IŒaeIj6Ëë'³YÖXô[b5Á
-çã7˜ m…ÕqÂ2&"1a岂®[pe-»UVƒçÝóh`^qHqùA(¼éÔ4gyÆdÂ4ž¢¢ªŠnã˜b¼þSÊò¾‹©¬Ð!ìxûm
-ÓX+<ìøVOâ}Çê®â¿S ½‘Nyœ«Ãâkó¸JT6
-OÞæ¸ÐwÒ‰”(³ÒíȲò1ö³Èä»$‚ùפ;YDû ®‹›Òˆä>?!ÒC᫳P´žŽ­œc&ö/xîHœÇANDëV{1Çžs!·²ÎíÜÉHY‹™íîØê;×2™gÙþc}fRv~‚õ]õ™†ÜäqE^³
-Í%>NáŸê8ë;gÇ—¹5äI¹uMBëY¸òŒ–ê%hñ¯¾šE ]¡Œ| À.¾-9‘ÉéÍ<z/!hâôÙü0æD N5ׇe‚¥` $¡ådÖrvÉÉiñ)*| Â<¥àÑß5óêR”>Y Ó­ ÿ‚P`Ѷº b6>r K›Ò®é›â[¾W¿³ !üQçáÿÿÞÚïŸ&G¢0׆ ”µìH¸ ŒÔ›42°t$”[g;<žv·Ù¨HSñçÆ>Í .öáuàXœèÒñ<"õ¸#¸YóEQ@ÐOäT¥KùŸ Ö÷T„CFO+ž)ŠLQõ5¡4 ˜.óž¯zKÔbü)Ñô>U‰<òKÛ
-ÜPÓo»ð·íúTìª`xšÄœ¢]U^ÏÅ^¨³YpöeÇgŠ‡Îæ£æ.'ÅC}”òŵEvo²um@R¯ã¹Ëyñ.óÓ{¤itE?]=lσÝa‹á™ëì¹ò©¿ðy{,³‰iGù0ûRŠvиÜÜÒR¦.i%ÇiôEvòØž*AŽÅˆ\{~µæº¾±bTåêÜe`)s¿uIâxeýdEë 58(9ÈgR,+»jbQ÷ý‹\ÆP}{VMî]š3„0A?‘ÐLK˜±_î÷ hN“î·GP!Òà–O¯wÒt¨þÔn’cJ—¡`è·Ù<ÖvŒ®bÉ9†Ãú±¼ <†…4é¨0é%Tè´\rû}»÷
-õó©D·@ êßsÜš–L0Ú”DZ—ÔÄãÏ-‹¡â“ÝeÃ’ƒ¡’»”â€!‡ïU
-ÐùªMVz`¢~˜‰Y¡±­šœj08°oU®†€°Ü“m–S;£ŸEnÎÔˆVq¸ÓšsÿãðDN uìFìÖ¤:û\ iH£HakÅÙ‡Œ×BKx EÀLºö+Œ”Ô —¥îˉí(‰P2Çhçï?~ÛŽýüC§ tÖ3]¦$Y³±l£CV0ãèŠIÀ%
-ͨуÀî5)á;Æ]4Èî}O1`YÀ+d¦çÐh'¬¶›¢üµ«!`ç¤ä0§£¯šú³š¿ç:A" U½ CøK}Q?.…äõâg
-Œ1]UäMŠU'°“ó2FØaª´I´'H®¶o‰€£
-Zô³Ë(Eí¬»¹“³´ÊP(<Ù¼êsìPÚ¥†¦“µƒö_pãÐ'Ýc88vu£ÆùHaBÃ`]U*nÜéGp2^xÿ±nA8ÙøôþA>‚íœåÇ„[
-iô¹.V„»üì…›Æ8wmÏ„¼åatã? 9¨¬Öûy’T™Û‹ös)‘»¹9¬XSåÑ‚º°›ÑlÒ#HÆ
-Ùôäè‘ØØi´*M ñuöùã€)WÁûu{¯™«vm^¦A½¶’3'3R°¨Õœ8HôÞk#)g£¤E—ÒŸe9ØTJèÜ×:=îÙÚ7ÙÕ×bä„Þoñ»ú7oŽ¤OÚáqâ¸rû»Y6rÅå´Qš êÔ§RŽ"uC¶¼ž3ýQLoÏ
+<< /Filter /FlateDecode /Length 4168 >>
+stream
+xڵˎ$·í>_Q?°ŠÞ`0Àôö¶ûgoOIìCâC|ÉD‰R©ª»×³XôvW•D‘ÅwÜ~ÛäöÃËåëË_nÊmI$¯½Ý¾þú¢àÜÔ“0ÆlÁ+!½Ú¾þ¾ýýU*uyûä¤|•Ò)Õç·OƸҸ¥¼]Þ~ùúã‹ W€ÿxùòõå¿ ª2Vh¶à‚Ñlÿøý¸$œ›’Âjµýñ¯í×—¿Â†¤×+$•q
+8©›Ÿ¶,?Ñ•É>ße:ß-’²–Cm¥ðv‡=q ¬TåðZW¨Útî´Ö²h¤Ñ»y…"§¸…W;Üp×2~±âõq¸ZéðyE}ÛøÝw y=î…¯»Šk£ðg\5õ<§É^¿S%Ïèµl™ ”Ûi‰<ߘŒE‘¢9L¸´QERÚ’ò £"?!*è 4è‰CÊ´]9üA6óv„ "ƒøç¡íx¶nyó8
+Ž$¸—÷¿.ߧœ«Œ¤„•zFƒ¶ tê\
+LqÕ;4ý@qi­Ø)ÑúHqÕ¥+‚¤šô­¼3Ÿå 7ŸþæÓ:#”U»mù8“Dïxš¾Ëcæí)n
+̧ ÓÌïh>5˜O¥Ò¼â  ›¡àŽšÕ],›¿XFÞÞ¢yíæ¨+õ²“Üz߶`&¶iÚ<â=®ÍÁÊì³LDlà£ùøŽŸÃÑig8j â£
+6oƒd%¢VJDJóLˆâ4ÜôÕðÄŠÃãŸ
+O@®còÕÝî&¶(sùä×ͲÂk´f~7ZIõ §‹
+efBŽŒ\ëƒê”H[´|ò)”fvÃò¢Ï^H&éI–žü+D®¥Vx[Š›Êúº: „ë6ˆ999¤xI_®”­‘]e/M…BLÝ8Þ<ªLiS}¦ñ. ujHB§oïŸ,±S/D¥pÌØhgºØÂ¥p®q„•OЪv$úÌàÊVú*çêÕš;qÉð:j­¦É#š—¥·Êˆ¦%2ÍÁwõsnhŒ Qg®Ù5×lýÎ8T]k<ŒO¹êX5ãw\];ÇÞKð+ûÉ®þ¬ey,/»ØŒ1ÅQäp%ûÓYˆ2ÙÂÿ…^? ‰Òäب)öv|ˆO2Ì'ÏÃÊå¸ÃEºçÀ’X+âÊ’´lV0Of³œE°à·¤f.¢>¤o0Æ gÒ„e>LHbÆÊݶàJ.Zq9š¤Ï>¸çÉêyÅ!Å¡–©iÊòŒÈ …y<FEMÝÆ1Õ<ó§”å}S9abÜñöÛ¦uN½ã[;‰ô«»†ÿN-ðF˜ò8W‡Õÿ6öq•¨\½Íq¡ï¤1Qæ¤ß‘å(ä#ìg‘)wQ˯!ÉwŠˆò ŽÅMyDö‹Ÿ€ž NáPèê,ÔÖÆLGW.1ù´;çqÉùÕ^ÌñE \È­®s;·E2aÖbf»?6Gôï™Ì³lÿ±>³9;?Áú®úL ‹nò¸"­FY…î§ðOuœ ÌÙ un yrnݠЮ2£§úc ZÂk§¯ePW(+ߢ&ßÕœÈäô½×4óLól~s¢‹ §™ëÃ2ÁR0@’Àrk)»äå´ø>ažŠR àïÚyõ?)JŸœÆÓm,ýÒ±ÂÂmõ¦NÅL„D1,nJ¿ÆoŒoé^û.&ñÿÿ{ë¿š‰Ê\£PΑ#ᣰÒlJƒ‘ÑKGBùu¶#Ài÷›KJhiÛ!þÜ9Âg(ÁE>¼‰‹#]&G¤v6k^£*
+Í9Uésþg‚õ=EÒ£§ÏE¡¨ùšº4t´,ó^®¸%ê1þ”è‹fŸª…¥mÐ^·ç÷äRܱ¿ÖaÁž9}ã4«¾šZŽD%îvuqVºÂ°:6͸î2 c¹dçñ“õ¥¸ž•bv»^V  ØaÑæÒ³›0^)7k.]5
+÷{—$ŒW.LV´íÑPI󈚃|&Ų²«6E‘ ï_¤2΀zäíY-¹wé^ÌÂDóDB7A0-õ„ˆûr¿ç
+`ú|ÜÍèÆäiF-®õ‡
+ þõ×L¤HBH̦Éî¤;´;U‰#ì9pzE®,<=¢k8ÑËϾú¦âû`ès¤*V›¥±yC}èfiP@,=ŠÚ
+Ì¢YDáï¿ÀíÂçG< )nÿËÁßEá´ÿlŒ2ø—göX$P äÁ‚v•òN{—©1{ù“ò&¬Ê_²E6®VBM‹¯¯K6Z­ÑU>e37á{àžgGÛÈ׎çX«ÛhSMÅ–-ÞÌW¼œ“X9§Ž=(礃rŽËOŽ^õH,2λ`TíÞH¯³³žL©|Í×åî.•Ûú¼BƒzíµbÊBä(Ϩ9âÏôÞëÿ¨ £æ3—Ò_d9º\`~g›žölåÝqí}Ö9ÁSÂnþÊÌ‘”Âé;<NWî£ÈF)•œ¢–"I;ALêQÄ6Æžó–Åœªô—›r—x¢îzÖÔâ,oj)WºÄwûË°néT "NJ ”Ñÿ¬v£
endstream
endobj
183 0 obj
@@ -418,19 +414,31 @@ endobj
194 0 obj
<< /Filter /FlateDecode /Length 4605 >>
stream
-xڵˎ#¹í>_áã,‚ÑH¢ž@§v{ 9e3·Íž’lɲ—äóC=¨w•ËÝîíª’(Šâ›,sæ¥>ýóÄãß?|úÏ'qâø_œ¬g`OV&¥?ýí×Oá¶Ã4è“PL)súí§_>ýùg D
-G‰i´|Í{¾Íbw‹'óH“š ¯ ¾ÝÅbýäžÅÅrÒÄ5ƵxVt>)¹¨/ÇXP[¦­±ëÉŸ`+¾f<n-^Ó~ä9í/\%¯õ0”\!»DPrü=tTmºC58:iøº£x%ÂÒVN\£„Íj•>á€•Ë „¹šL”|àÁÂ-tÏIâŽ)î#IÀ<à~0©Š‘“¸%LÝüǪë4Qõ­MB8áø8¥Mª´Çõ²¯I|Ž¨lfZÙé¸ÖëªèWØƦ4<”͸`Òé–ÏäoñYàc•ö°Ö”öŒ}ÐJ>‚-ž²qÓæ[YT(~ž{^ó•f1*švóˆ]8Ǽž`o™ ¯ð¤Vd½a…öÉ!‘ÓÑ_¹õ 5…4°qL“ S(‚~LØa9FÙ §û@96!C+ƯÜã~þ)f
-YÑ–§$ÈÝu”e¡÷dy@X§
-2·Åqžîêlèë¸5GÆÍ}½‚X:ÚDmß ÿù¯\óÒ$¹¤°4=ÊŽÄŸÿ÷Ãî2F3/ô¸Œøá‹”òóïòÜ5}¥xÓ ô}Ã^5cå´Wñuw· iîïØ-HÏ$‡Õn­ýüûýÕPÁ SAì¯L¶ïñ«Ü%*àkG¦UÏ_¤{Jœ› Ðó.²8[ÂHš¸Ëç]ŒÑµdRôÛä»+ô0„Ÿ6÷:¶È
-­hÐfÔRøB«†§ŠN+w»ø N¡`”`¶h©š`FÙnx#]½CƒGÀ @Œ¨êr¥LÂóp]cw£ 1âV0QkÎjæM•G¥¯¬ÑXáwÙ¤è³\5"ÊTº¦±ö%ë^¤7ë<|å·ødà· o»TP¸ràB´KºIF®öÜvÙŒz µ.ŒrÃÓk£FÕy½½´B@4n«yV±™}k£Õ)Š‚Ciôµ©Îí¨À?a5jó+ÉÑù2®u÷ù‘ËF(ŒÖ"‘áBú­ŒëN%«ñë¹RÍÒâѽ2%¯W´6o­Þ°JÕ®RT*Sp®Æ.©þB•R²rÏŽtº…•½¨©¡ç87ŠqÑÔè> ¿¡¾ØèU!ÜcøuèâÛW¶ÊsfÅäë€y¿¯ƒÑEýU µA ‘·Cv"—i€xEÆε9¶—Â0R¬玲TŸdò D$W`2…Æ-5°Çp`¦`£2@EOGÓF
-à¶Ü´QRè˜=RÍ•½µ½ì¢sùâÝ*ä#½†]<g1²Òºm_&63;)y·Pò+Gi~¾M®qÚ•{Ú‡¨O„œå
-µ»R~: •úmp•àe_¢`ZÊ ê~eDYÑ%¬p1maôZÛ,o(rÊÒ`îÄ#³§’Xwu1]®—4)r¡´ûÎ> ¥åj‚ŽGª„~ªf,®åÂ]CÅ™FO¤±û¦´™Ù-A“gºÒ{L”/ÔqzÒFºÄÁª[–ܤÖO³r¦æc±ë®´+FÒ{F"„¿ÙôÒ!IxÖbTÏ7ØW‡­WÊÑmÆXEF ’B1Úô¼d;$…”+œyPëx@ÖX4Èbé:ÒªU ñŠ|Œ¨€šôJåt»®EjfÀh¼›íÚ \ º/ÙÏq¼Å >ëG.ýš#ï;Õæn\É 3f"f©DÎÏJÔÛwB‰ª[¦DÃÂ$ãW|]¬pÚ±ëäj(Ø®˜uµ·~ì±Zù™ƒ‹ßïî©Ð5ù $¾Ñ+ ‚ÉyÅ&_ÑnhÕ÷ #Ä°Ksä9›ÙëTþÞ?Öa7ÝëÎKë-ƒêº.Ä;‘žs¶ “7nOgbѲôFÕ;Mh—1hØpb†¸Ý¢¸ iÄëêHCqDÔäM΀ÚK›906<ÜOI†• ž5þRÖ„<!eh'Y„ÐY—›ŽÊ¦Ý#A­Nÿ~V*ŸXí jçÿfúȼg ñ„lÊ+¾b‡ÁšeU—Æ¿#žÅ#fRÏ{T‰{(û¿ÛþÚøÌ0¡ôšz»)M\ˆïÆ™”)»ã”ÍÞÇÁ£ki¦ÝÅÖÛ½ô  (´k9Êæ•mV¿ ¤Ì¥zxÑ‹WçqTÞ$eIʉꨢûí
-·ëioÏ×76uH®cßÍ°­Á%¼ÕÈ!¥@§ËPšÎm?¹']ü8t×Hi˜rˆD`åWdhÅ‘'Á£‘¦öšŒPj­Yffëw–¥7ý´Æ"®Evľ…ò¶s ý;zjdH°£O=îí=5è€3aõ||1¤F%a&Ò®ÛÆ
-2Å@VÓo.µ”•V¬Òý˜ËàQ9ÏêÎ>å5 âÙHz;ï-1,0Bm#‘;u$Åû>¥ôÌ1BÝ©†5yÁ²6ok„}“Õ:¬[Wõö6@õæäˆiÒ«²nhõ0úД¾úFi"8¯}¬¦d¶Uœé:I ñªÆ@áÉtþuªßÿ´ê æP×ßý1á‡%
-Fhm^)Qw«0P~‹£4îðíVÛå£U«¿ômSS 
-–Ãt§´x®¨ËRëŒ6¬/+––">4¥Yÿ®²‹B;æÖ^kÍÈC-S»DžIZéiùHGJ)bà o#c©¼¥ë¹ÙC#[.ƒ™IwKÛ|¼
->„Þð!úm™„µfU/<ªÝ”¢3ÌI5žå¦4î÷< P²öZD
-Ɖ¾7m}²•a¯[[ëÇžù)^ôc_ºs7„oAcàÓ— Ave+üèG>P üh(Š‡2T,Ž¿Ðß}Að¨ Õ,6ߧänÅ­N<·ì<ô¦{3³.3‹O´ ÿÔŽq¦ë 撦ʄA2#¢ºð˜‹'ºÅË•ËmÜwS©ìyÛæ}û.çIƒÒ¬øº¯¤A2îå°Üý/
+xڵˎ#¹í>_áã,‚Ñèý
+à„ãã6ªÑ×˾%øQ×L´vdª‘ëuPM ƒ+k,ÓæAÊZ± @d¸`Ò›†ødjnñÙàc6Yë
+{Æ>j -Á‚NÙúi {„­(“0Ï=¯ùÊ+æ "švóˆ]xÏ‚™`o™Ÿ á¤Vd½aöÉ!ÓÁ‘˜¹õÖ 4…´jã˜&ó¥AÃ4:›¯Ãr ²O÷rl=@V½tCŒÇù¤˜i`m@[ž² ×I–…Ù“e‚°ÉÁ)ˆï8Ÿä±à·$Ú¡¦¾¿×3Žˆw•Ä+U¸- x×#ßÆ­92mîëU‰¥£alÒöòŸÿÊ ÿ!O’K
+K ‘£Hüù?ì.c ÂÐeÄ_¤”ŸWæ®é+½€›–Ð÷ {Uà¨Y'§½Š¯»»UR1ÃûU20ÉÕj·Î}þýþj ŽÊ’©Jì¯Mvñ«Ü%ª‚±ÎQ¦ÕÏ_¤Êœ› Ðó.²0[*Jš´Ëç]ŒÁ­dRŒÛä»kð0D˜¶÷:µÀ
+•Èú‡bdý*
+úG)÷1< ä´îm<<sÁäQŠ‹K¿É£·Í³ÔÀˆu!|6fpï+…
+ ¡ðeL*LJa² þòœqÆÞ¿±‡h¸¢íI€x2&'dI|åÝ]¹ˆu¯”*ɵz²§AŒ}¯g¼Û§Ñt—a·…áü¤{*©7-òz JJ>ñFƒ¶ž*ȧXûÒcï$¨²$ÓÝè;ž×Á§f”õT‹p1ý…TÆŠ_­[ɦŒ\bB,ï´pÂ÷‰Iä’)‘þ‚t¬#®Ý.UMú'jHWÎ3+®çPLp¯W)©’cã 'u ›ncã®%€_âÄd)¾Ày‘º¦3åäciî,¦aÊŸQT_'~‰%ãt§{dQèE7£—ÂÛ4ž+:½Üíâ' 8…†À¨ÁlÕR-Á ²ÝñF¾z‡‰Ž8€¨@¬hêr¥LâóxÝcw£JBÄ­ÕD­9«Y6UÕž²NcÅOÚe—¢/rÕQ9¨PéšÇº—¢gx•Þ¢CÊh¿¥'„ß
+¼íRAåJÂ…`—L—Œ\í]q7d3Ú¶º8Ê“-æ;×Nêóz{y…ˆhÚV÷4®â
+û¶
+F?kP‡Ú ZCŸ:÷£"ÿÄհů$#ä ]ëîóG"ˆ(Pk‘ÉpAýVÇ §RÔøõ< ifiqÈà^ٚ׫Z›÷V¬’Eu¨ÕÊ”:7c—U¥J-Yùg:Ý©•½h©¡ç47‰qÕÔà>€¿§b}±Ó *V…`7žÁWÒ^µ¯luà̉É×Qöý¾D#ôPT)ÔVš,„ÞÚ‰|^¶w
+Ô
+ÛF¯­Åò†"7±,­ìxöÔë! ®¦Ë·ã’6G.ø‘nßÙW`i¹ž Ã‘jažšKkùx×bq¦Óyì¾)FvËÐä¯Ì•Ç uœŸô‘.r°–E7©÷ÓÜ©‚åXܺ+ìŠW”tÈž‰ño1½xHR=AÕó ö5±@+éJ%º-ëÄHRU6>¯Ù‰!åJ*΂Òëx@¶X4Êbí:2ºW é
+}Œ¤€ºôJãt·®Ef•§h¼D›íû Sùt_ŠŸãyAz6Ž\ú18+EÞwªÍݸ’[fíDÌ(S™:ƒŸ•©·ï„"U·L‰Q _õYLµÂEPpoÈ®“WhTÅvÅ, «ƒ ´Çjåg„£‚a°§*@×ì/ ø&¯,
+&ç ›r…»Á4ß3Ž$a—çÈs1³×©:ýE…ðD!¬Ãn»×—×[Õt[ˆ.">Gæì¦lÜužÎÄ¢ué 7©w.ºÐ®`бáÄ i»UqWÒˆ×Õ‘ÆâˆhÉ›’u—>sD0¶¼ØOM†Õ žG5ÿbÖ=!mq'E„0E—Ûʶß#BmNÿ~V*ŸXíLµÎÿÍ.ö‘IgW žðTÅ”7|Ńu;*ª.G< G̤™÷¨3÷`ö5}wãµ 7,˜eB›5õvSš°³ÁÓ™˜)O»ã˜ÍÞÇ!€ki§Ý¥ÖÛ½ô‰7Pßr˜Í¯*û¬~HÙKóà4’¯ÏtTÞde‰Ê *UÑcÈv€ŽpˆÌ;í¦£ãèN–5øM¾vÊP¨]Þ½/æí;¸J‡þ­·§Qj}/0¯à¼•ë[Õ¥}þbdò˜^ ÿºFwYuÚv¥WóL¥ñÛÀ¤I¥(Awó=é;—)ž­‰=G±'®C…Hß6ÚK)a˜§Ï] a½~˸×À1¥ps+»±IP,æ
+£ôú۹̟ÔfƒQ4_uFºÌ\é<ö–‘.·¼º!dÑê2ï'Üžo·*í)®˜5-¼­\ÐãßØóòä¥/Ë¡
+´$‡ßF¡²“Œã¨fo­5Ž²e’îg«HÒ¿Qrpü¹¦ü律 ,Dõ–ö1‚’ôV^Ü­{äaq9+²@.*î§;¼I:œâïnXUB謥£Z˜é.`8? !fw™¾®¤ÀË Ñái†±ã·ášn·ÓÞ0ž¯olêܤ¾²-âÞjäR€Óå)”®sÛ¤OéßÉ?’î)-Ó>‘
+üЯbzò8“+ p%–;ÝSiÝjrŽ™1—ç4ŽR…bJ6Óo/­”•WlÒý˜ËÂQyEÏêÎ> ‹â9!$½÷–X¡·‘(:c}ŸR欠Pwªa]^°®ÍûáØdµëÖU½ý€Mzó’bÚ‡ôº…¬›š= >42Vß0M¤Îk«+™mç•ô ¤QéÇ©èo6ðlºNÿ:µïZuˆFshÚoþØø£
+Žy'— bÚUo§d
+ì ”˜¯E»¯- N‡Bw»68xU嶾i´Ý'%S—®Qº @9¾³
+¬7üV#å½-‘@rB~[ä`ONYó#=y^Mfù)Å9äßk^7ÝÝʹjç»
+x;uå´âC·MnƲ-„‚ŽNÝ¢QÆ[;äN›Ê™é{3ÔÓð.2Ñ;óûÚë^ õöÆn>uu/kõÄ/ßèWX
+ŸÈ®&×ÔÝ 1þB ”‰UÜã’žÇëÂ]ñ¾“]Eøƒ¸<&¥©6Ó[eÜ€Ï ÀÔSŒkWJ®º §SK|£\ À™tcr·ãûš°¿(¬m
+òª}âz¦],C¶i‘mÙ.VlI˜ƒXÏNmý2„–·ZÝâkÊRø÷óén#òxËt•æÛÛ¶e8óZN¸ºUwÄM~—V1­…Öç•2u·
+õ·8jãßnµ]>ZµúËÐ75Õ
+e³§IðøƒzrµÎ†ZaÇ8É· ¶¯Oö2Lok홟âÅ@›øò»!|‹ž¾D ²+[ñG·8¨pBø#¢±(ËP©8þ‚÷!€‚ÖXj¾Ï)ÝŠ[xnÙyìð:ga/þ\gVŸhAÿ©ã M×Ì%Mµ?‚d)’ºð˜«'ºÅË”ËTŽ¼, ¡—óΤAmV|ÝWÒJ2$Yîþ€Kt¡Z=[ÛÙ¡7‡ÑÑ(—˜|O é[,³ŽRåÕ->?%Äv'Í žü>89ÿÏ|{Ô
endstream
endobj
193 0 obj
@@ -666,17 +674,22 @@ endobj
<< /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /Font << /F63 151 0 R /F62 150 0 R /F15 147 0 R /F54 148 0 R /F67 175 0 R /F53 146 0 R /F55 149 0 R /F16 177 0 R /F32 156 0 R /F61 159 0 R /F48 157 0 R >> /ProcSet [ /PDF /Text ] >>
endobj
231 0 obj
-<< /Filter /FlateDecode /Length 3056 >>
-stream
-xÚÕ[9o,¹Îõ+æˆ&«xjµfudXÙb£5ìÀ~#ÿ}ï£Ù==Zia鍊,ëøX‡_þqá—Ÿž–§?Ý„¾8æ4hyùøû“ ü".Æ14£ãZ\>~\~¹rŽŽse9ׯésyyœszþý-—øO¼ÑçJÏo4 h(¼<£Åk~R¾A|Æ/i,Ïo5O`IÔWÿïÁ¿[g”óºÍS"¢žú±®Ò“G*®Œ—óñ2}*×öïPÇqÒ†=ýúñ³¨:¨¦µÊU¯‘V•V¢¡äŒ†‚'6TäÈí!'5
-
-€ñ ‰ÃõI)]ÞYf¹™-Ÿ¯œ*?³
-îÁ‰ŒÂÒùAe˜pSq˜£µ>^Û"EI.Mv+q*
-Ҍ冟Ž®Ôv3)«8<z%¹¦3^>©I»3”Ñ w\WKŠ‹aëº%Êõv!Ï»p‚üïBF:¸z®;ºç:ŠÂ`ØPØŽâLX7Á5ׄ^Ðnù»Ôκ+$Ú¢6÷Ѻ›ÐU%Góô£ðŽg)£j :œ·ñ¬Ö(ÈòJ\!M›K¸kÅÜ1¥ì£K­Ÿ{áiì ~G;·Ÿ‘»àmÕ"~[6ïO%Œ®‰…RÂ8Üœ„~dˆÂ²µÕµ}\šã63Ï©ÔmÃ[ÎóBœ$›23˜óÕ,¬¡ƒb…cª J§…býwõŠ9–Îœ–Ìr–.ã´ªƒxQ…”Rb/”©iQ;ª‰Dy·Þa0e O ¡ J·Áƒi…Ã:ñsŠAÖ%fnMŠÞʵÛæ«Cà”ãà%TA×·Iìƒ`2<dÁLëd)Õ¢·›aM¦üWV®»`ÐÓ5²‡£t¸ípSÌÍõ¿™µ7
-´w‚ÃÈI¿ôm©©ES(Bõ@˜ö=áŽÓdR‰Q N¦ú”ÅÒªãì3ecBEp¶®¹¿®3”bnÖÄ¥Û@kl³Ô4ô^—¥uå,eàCjá†d(ÆÄjR¤®éû´|ßš¨4øI´þ.!‰Iw—~MêM¸}ÜšGc™²v·5ÿZZó(jÓüdï(6ØÝwµíÿ¯Zö4 ŸnÙšs»¡òhËž¢ µá¥m¿HÅï´ì j&ór3+ùDË^ù¨Û~ºeo JmÈ­-Àӿ³Eú,¥;Ùίb+Fü¶ã‘¿Y£9®9k4ËY/%…>X20©O4£C†³ÆªB9HYµEƒïhDƒAŠ.å¸ËOv¢Q(F=RÛiE§Ýµ g5­>íÉå^Ã9Î;ÕpV86œëâmf¨4aùç[Ñ‚ò\9¡ø=ø
-„¾¨6¬66 ¥rMZj¾Ó€ŽoƳ=Ÿ4 ã›I:¯8m3ŠÇ…xtŠ9ŠâGI꽦cà ¿ÍB‘äì†øp“°Ô"ì±Ô÷ bG‘"êùIÆKa$Bçí÷[’q'0åôf¥cL[œñ7æ¼ðBI"3êQ^@Ðá*§¼ì÷,ã‹R¾N$`}]f¼}‘þô‡|c)Ó¢4#/HrGòØÐx1:ÿ"ØLZ#îfĘ¢wC-Îmµ¿É…‚Dʺm)¾ûÝáËéæ’ämÿ—z­¯‹ÖBä"xŸd'K0S|šYâö:hÚl]Æ-ùµ¯ZШ”Q½(~mF¢kC-åÇ(ñR¢ZœUy€pØšz£ì(KßÁ)ÏVJ3óƒðQ3jÞf‘]î—M놟o‘ä‹æÍôóíÐþæžþÃÛ>qàÖ|{»ƒ3öÛÚ
-|Ú›C ƒž&y¼<>…µöAƼ9¶ê^müìKQY‰—­SøÛ†õ®×‘øú™«õ³´•C…ø_8yAö„å-@á³Bñ9ý阤ª'ë}€ó.cE(߈—ÝÝwÙEñ[T[²ÚR#¯voõ(9þÜJµÅ¡Òq–ñѺ÷g玈»Ó Á¶ÛØþ¼aŸûí%û
-E+ªÅ˜ö Xrî !—GíÞ֢ͩҷ=‘GjmÖåí„7Ýn"Ý»ü©¦™4»ú~bTx¼-œäRϯ¶A•öШ">é¹Óç[“Gž&}%‚âáAuï‡~äûw 7ú:^ (‚Л‰ëñjR;Ê$ûIåNJÕk#ýœ'å»…Þ£±Ì1æ=½úh8³ZO¯>&Ïà¶{õ0ŽºÀq¦»ÜcÃÌ’ÿ¯öŒ)a1Ö„»`qÞ\̘W™m5nM¦YÐ1ýú¯¡®c7hZ#Ø1½SØØ€´m«t÷ÇZi2v².Ûâ“ŠÞA1Ø¡vƒ
+<< /Filter /FlateDecode /Length 3144 >>
+stream
+xÚÕ[ÉŽ$¹ ½×Wä´¬…Ô$
+¨ì¨`|2Ü·ÁœÆ°v|òï›Ú׈Œ¬ž؇(Š"1ùå~ùéåöíåOw¡/Ž9-5\¾ýýEÐ ~ã˜2£ãZ\¾}¿ürå\9ÎÑr®ßÒçíõ‹àœÓ+éÑßp‹ÿÄWúÜèù¦I*_¿(«®ùIù&ãû0þ–ÆòüVóøDÞõÍÿ{UÒ¿ÛV”óºÍS"‚Šžú±®Ò‘&T\ëñ>âÚþÒqØ°§_¿ýìŠÉ´Æ,P|‹´ª´ „ !3NLT`äö¡4RŽT¢,“$¸½Ö]æBq¿å“ÄÃS?V|-cnùI¢/Y­÷)A0‡8r(Õëi¯K…9Ú°4’)˜Ä&·–á¢J…é‡ê…$£ ¼p E¼æѯנ&e†©p$
+*A±Q%Û%ÊM¤fÀ8<
+A®™ßzP·j iÎB-¸J¼Ž~Iƒö!I7×Ò\¥.Ú †2oTr^B–pœ[²ë-šR×3Ø“GžÇ<C~=V¥Z9p•*ϽÅ‹fÎ(‹%­™&
+Ú!PLÊ3ôöÀ]’´…YÐj)],QÌÒýß‘()ºVvà4HÔÓͨòTð$•‘ÚvÌÅÑjŸ‡‚_<Hâp}X#Ÿ]ÞYf¹Y-Ÿí®8?ó<BŒ¢Ò'ùQh˜pKq”£µ>^Û*
+’ž]šôÔR:ùÑ å†Ÿ®pÞLJ*=/Ð 2Í/< ÝJèŠ;¦«9¡†žM·¹^/༠'Äÿ,`$¿fàº3¡G¦ƒˉŽp
+‡*Ñ U,Ø­b ëHÉÐ@·¿Äg°†ì1õ‰}/é Á´À3ô½„È{¡gÒöïʼ¤ Ò­Ö%¤QŸY÷ â×Óô‰†v¦÷fž7
+“%^ká-{ŸR|{”Ã.ÞçBVB•Y Í+S+/@€hTq£¸Õ­ª¹[5`o*‰¹­ÂY|2²Qßd³Jã¶j†µvá#ŽÈN5;5‰¬Iå;¡A²AvúÏK÷õσ
+=¦}¯sšã‚˜b€b<¨‹_­:Î>Sˆ3†IzµZ×<^×iÝEž6ë¶Ò”WÚšÞjvðèÚ±Ïý`•Có!×vCy 戸¸µ©­åÉcMh¢Ò`'Qû» =æB]Ab¸7éçq¯ŠRä1q¿Wå­ôª(Q»HN^¦ÆŽ÷Y},ÿW=,Š°ñã=,ŠIn'*Ïö°Pš‚/í}$ ÐÃBP³Ì?y—‹ö°  Õ~¸‡…R^©q"·µ ×bŠøñž/
+(Aa©#oóÈ.û‹îeºÌäç/Ir‰Eóƒ“ó”¦P¬ýÇ_xgŸ?ÿÂCXÂõy Óæ¿ðBÔïyá!(À0xpáÑ–DBÁEåãÅe†
+kp¤3Vg\{{xêN–z‘éåê]nÜˉnv ‘šoR |ÚW›‘Qž&YŒ
+÷['¸UÏÝ^j¤=4GŸôÜéó×YG–>{•v<º÷C;òw£¾‡p˜Nèx5©èiâv¼ÅߎÒö~Réc¨çÚH?GÖ¹AÓë`”¢*sÌz/H gVëeÿh²Ün»ý›qÔ}Ž37’=6¬ !ÙÿÖaÏèH ‹UMÑ
+—áMûeƼrùÕVä½ÉM
+:æ½J-4,6hZhÙ1½“Nî l@Úözm÷''¾|Û¼mñ £uP ö_IS»9
endstream
endobj
230 0 obj
@@ -689,28 +702,34 @@ endobj
<< /D [ 230 0 R /XYZ 79.37 771.024 null ] >>
endobj
77 0 obj
-<< /D [ 230 0 R /XYZ 79.37 388.053 null ] >>
+<< /D [ 230 0 R /XYZ 79.37 340.415 null ] >>
endobj
229 0 obj
<< /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /Font << /F16 177 0 R /F15 147 0 R /F54 148 0 R /F62 150 0 R /F55 149 0 R /F70 187 0 R /F67 175 0 R /F32 156 0 R /F61 159 0 R >> /ProcSet [ /PDF /Text ] >>
endobj
236 0 obj
-<< /Filter /FlateDecode /Length 3891 >>
-stream
-xÚ½¹Ž#»1߯PhKó>€Á
-ZeDZLf(· ß"‚¦Ü2uklTÝ=a?Î)»»Â^ËøºÓHæ¸zÑvQÖ®hgiÅyã3n÷1>áŒÏ¬±rÅ­SzfΡT9bºáŠ9%FÈÆTA³QšIêXB ¥Uºôt¢tGx ãXðf\qGAðA2;CB[£%î¸8áGÌ’ˆ_3'U%‹Ý²øsÍ Ì4G•¹ÛS'ÎsºÉA\1‘×:Wd(O¨\Ud~E3’Øq#ý’È™‰~ÿ²KìÂ\!™—Ž’ÚJxV+{@˜ì‹ŠÅw¶¬í ,Ò2ÿºtn ²ŠùÆõ÷Ä[Þ^?i^Ú›HÒ"[„/¥¸bÂÏe5R®˜qŒkÚ¢¬E…xñqÇöÓÁT°_ÉB¡×H§¢¢¶0]k´á82z´ü6ãŸLQ§$P’ÌJ"k«ÁOöÌYš_Þ£ åÑÕÖUTMLZœs#²Öм»n/ëG™E¡˜2r¤yä§Qe•ÐV91…Úh¦ùÄÁ“j^=bñHîaCÇŽha:-üѺ†?°«ê6,ƪì%A!u«Ë;ÁOª&o¨ÉàD®=C’ZGK£õKoï’EÛˆ"\¸ÖÍæU’lK¸™äF¯H®¸a¸1%YÄŽy‡ŒS20'ÔÅñWc_Š'Ê$1M™ÙPÕé¬ld(5ìkb-=Rì,É£ªO¬J¼‰(m;³#ë˜öUDo[ƒ2«PÆLÚðÒL9šé(Øù“qùm¤¡ÍpáÉ<Wx†æ ßGo˜aN×ÃÐ1©ŽãBt]ùo¤UÛ3U…üv¥
-`̉Âæq”O5= ¹ðÑÀ‰'DdÚqÆõÄc©
-l%vžän%1Æ0£ªÝYhKa$áN `±©·9$¢‘I„wÛöÅ2|«!S)Bùé¢L|d)®žö´UÑ[Bsk ko¯¾†[E|#‰uD”@6+ŠUE’ä(wò›¤oÅnn™k/ß lƒ„HÃçEfÑŠ¡ÇÍ!1ò¼‘pY"ЯY ¡+!Úµ¸ìöîö€${±GRHA½+M(œ•ž9Ù% RdõH±ÊVþwýóYâ
-%"‹÷åùì צ®SÜ¢rvÏ-æPnâÛÀ/«1ýsX¶n
-÷.CÝí2öÍȱù õž}o£¼ñ±èoeÒØ¥@ɧ9'¨¤§»¥@¥ây¿Æs¤
-Ò¨XÞ;·€‘[ü´µ0èø£FLžS³¢bÀifDbÿŒ£\Û-˜ëô‡ÿüñØA¶ÍýH•”¨Ð£™‡·æV*½R%°«ôW*¦4'=mEMŒbßòzjŒt/‚‚k&ȇ“¬õV’¬Š®šŽŠR*-1ä–õSdB•þ®¤ªÓÞ)h}ÙrTÔ¡r¢¨­ ÐNOÑýÚÒ¡¢ÕÞW13R£ëuÌÎfliŒÒ]¹Îš $9¦MÊç²%-ÜÐún¼¯%\€gV`:èì
-r(H¾† ­æ"bßÃLM$¿›ô”c™Wl:ù}"hw *­…ÌQ=‚(P•ÉÍš.ñZ¦ÐÌÍ¡ŒˆüŠ[ ¤±UÐrD4éÑ€
-vÃåDöû,y®iy’\kˆÒĸµèyçQíš5[ÛbêYó¬7ì©PŽµgaø?è©ŒeÆ‹r­X·Ÿ~(i!k§s_M5¿õ„n~7¹”£¬F Í”iÊú64€œ9t‰zr‰§g(†òŸYµ­ž ‰5ØXtn.ºœÁ,ÝÏa! ÜŠô~Ä72O©½5KxŽêe›ç8!0†§ÇÑ_µ²K_ˆ©‡À®¤d° Y_¡³G/•¹4eRعÓÒ¼9Ûôd.™ž˜6ÚŸM°Wz~ÀˆeÝ¢ N?”k
- ƒ›¶s”XÈîw¿…ßÉ Ïckpª›ï%ÎgÁðx3ÀVåpvÕC ×S¦/˜ì¯NÝÖ\š! §ü„q]¬7 òi
-0ÌfǶdhË|LèlKÙÕè“ÄO8T„G€B|°e
-óõÛ§ÿŽèsϬӗ¿}ÿôÛïðþïðóë…ƒñõ—ÿ¥‘ßÁ,‚õqÞ¿/ýô—üUJ^ ñú]ßGCz â²¾ºH/¥X°ÔקQ«£_Ü‘Ÿf;*V ÇË:òÌné‡
-³k„„‡SønŠÚ£7­—…¾üƒwqÒ·TaØÃY”´ÆGzÇœQ=,ê
-^»=çÊ¥á*OáÖW Tò£@ _x’ñÔ~…§6 ñ–ÝÉC˜®
+<< /Filter /FlateDecode /Length 3429 >>
+stream
+xÚ½»Ž$·1߯˜ÐD‘Å7°XàZ£1 G†/Ù°û 8òï»ø(²Hv÷Ììî Âj®Ùd‘õ~°Z
+{ùçEâÿÿô²}}ùñæå%ˆèœ—¯ÿxQ‰ÿ©K .Þ)!º|ývùõUJ'¥Ô€¿ÿ®åÙ\ß~°`ñ­7RâKü}ûíë//Rx‹ÛÄ ï_—áñÏÓ6V
+%¶S¶1¸ÜðÏ•íòó&¥U¸ Eö¹i |ݼ#I[ù(´¿x…2úl/«ñ¹¢™öÊï
+Ü ¡‚9ƒ¥}9£ú Ç·ò~–òÀžÁJ¿é<‰™[Ÿ“ÎJ¸'ÌïoÊ]"rœáœ-û9çðUc­½UX[9k:³­ûhxûAƒÇY_ýËš:G¥§Ñ×òàòäðZŽÛ—š
+\÷Z¿ža…ŒÄ§#Pærp23
+dOdAHå›@ìÃùÁȸμuaG9ŒQò•´ˆ™Ì„·L>ïÞòšŠV‘7ƒå¶Ñ(!X`ÂV è[g£ûiM=Ý•öZç·“&2§ÝÓŒ~ŠºwC»H+­›_p{Œñd|aƒ=Öã…6+sN…d°LGL·R ¯Õ ÙÚ&è«ÍpF¢ynv“SCkÍ•.?ÝQº3¼•õ";ïx  gxª­ÈÖ Ó"·3'ü„Yñká¤n³ Ú-G×òk“4ËêÂÝ‘:i7]Ò„ \ÛZU4¢>‘r5‘ô*‰f6ÍLÜØAZÓ±+s:38Ýÿ‚Þ³ŒÉ¡ªXsOxdå´@òÍû‰7ÜÈÿÓH"i‚=7ŒNNP ~¾;Ìl>LÁ1í鮃ãdîÄ~ÚèС:‚o~*"¡7D'r •éÆ §™É£•Ñ‚z²U²@[•EÖ5CoŽÌY^_ÇIÐÊŠäjÛ®ªa&-­¹1Y h9Ýp‚õ½Ì¢ÒB[˜i~'˜:⟱F¹ppĤ™×@'<²{ØÈð‘#Ú16¾…?xªæ6Å*Œ’ ‰ºÍ•“Лf„Ù7’ ÂudHVëdiŒyí]¶hS„+7¦Û¼F’mn!¹5{$×Ò¢×±3Y²E˜wÊ8 Qx¥g(^¾Y÷Z=Q!‰íÊÔÉFªÞIç “¡´°¯‹e²ôD±{‘H™Õ|bSâ£HD7x˜=1ò ´j"zÛ:”U…
+fàâk7åd¦“`—7ó)Êh¢¡Íp›Ø:_yFæ‰Æ“7,°¬äûQè˜UÇK¥,Kôd¡U?3W…2º§
+h̙–yœŸjzlŽ#&N|BDf<F(fá1T*¶;/r·'1N
+Ýó®ýmWY¼Ó"ÏŒêm‰xh’àݶc¹,3¿´˜©±þ á å >ñ”v§l½ÊÞ%Œ¦GºîöZ¼Uå7ÑØÄÈd …³Ñ©šU"IyÅÙSF²R|©†sëÕ .àl‡DHãû*´dÆÈÓáˆeÝL¸"dŠ÷šY!‘/aê‘Ô¸žö ?í IŽ‚>ƒ¤ƒzWžP9«µ0c–
+$·D
+$N úyÌZ JLKôQ"È^9¯nQ{wäË+’›4š˜êe åžêÖÀS¯™VZf¿27˜÷G½Z{–{†œãBÿžrD¡G'½ÿª´(¨X{ÔyG9¢Júñ`¹û1]ò”R%Ëø»Ïm5D~¯ò¹uZPFôhãißQ¦sunôXMÖ­YËÆ®kxþðÙÙ F­žñÿ„d0Ÿvƒu`¤/ODkSN3‹*«pýzOW£ª‘ ˆ1…ó”û][ÎÅt¨fkž›Z•£½iÔ>XIy@öº×¡Âq~o¨ŠHùµðBaITKò·"t_5µ1¬÷Pp)öÃk·ò)Ó¢œª‹c“  ù<Q
+vO—û½s1­j9ÀÝÛ™ïiµôB+˜ÉóN+¨°»k5ܹ‚Y6“ü’]1ûȘúÛä.i»ë)°~H®4¥=3~dó‰ü„$KŽ(Ëéæ’uPÁ—9¡yòž3aF^€^ðE™Û¦ÓÑ7•­™ï.îê+8LÞ¼žw¹{{}„l©iknå]˜·Ìì0LÍY±¦³í\#0²Ì·d8T¢Ít»ÓÇ^Œ¡™¼ÌWÖõ»ŽÑR\_íì®Ôa2…R‹ÖA Œïë©•ÚZµHñ[Ø52y€æ
+ã®(Ý´ÇgÐ\E/,øòpmSb;ý=R.wòèP誰ü^xtúa—qlFÎÍ«øôø{›åMÎe…¬±»R
+¼âRŸ–ëçãŸ#!Çò ù¤w¥ ÏJÞâ{{ lém¿ÅàóÏîbÊš–UÎs#ýaßn¹(üÈ ?üççö(
+#ÃL•œªðîŠÂÃ[w+^¹8Ôús¢“Ÿæ›EÃŒaß3{nŒÌ(‚J¦[B”´£»Šm©U­N“¦ÔbKŠº¡½%.4ñªÚ¤;}äLC«ìCOHS§âýMí½ƒŠŸ×]Yßu-ãïÍDáºcõ6ó­Æ,Þí’ÐiÉ@d~oÂ]±ËÂTêñš—x‡è}_Ĥ«0Vß‘q¥•Ð2ÎZ^,uÄñ3ß#…ü§¶~b\éÞ)A{
+"ð35²»­Š–g¢ÉÛ‚(<„…ì™òRÖ¶p'¿6¦©ynÒËÉ“Úus¶oŒ¹k-«¾„sWErl•*|¦«²NX 'È­hàüqþÐt!¿½Ùf€[›n[œÊY^Ê![^c¾L—@Þž:E³8Å»S Ðî]]{j IuØTxîNº6Ð-,?Ïi1ÌèaÆ7qŽ.Ÿr!z릾µ™ßÊÙzÕsžX+"†¥ÓŽä°zée,Æ´N°++ìÐl¬ŽðÕ³›*\Zr)º½›Ór8×eT
+îÊ»¬Ú­] ê‡ò „+´uó9?A}!34ÌŸÍ7x•Ð^‚Ô©ˆÈk5N“0¹úN”NÆ3<P•S>ˆ¨à¨*ç¶Uå΋…'–F9),kY*sá°2G©VXR­xÒÐ⇆ÿx….ŒÕ«ÓÞ
+!°ß
+¦&ìaj¬Ìý´³\Ä¥¬ÀNa¸F¥ÊåŽ:X¿1="¦ •hÙ"ÙÑÔÈPP?cW+À4›'á)¾5JÄ·‘RO%Y|[ç·ïàÔš„1‚‘v>ˆî¾‚šjžP"
+s”äî°ÒTMëv˜WÈP™—hðóRëAºjw*J=r×OÀÊljz¯O¬é¶±%¶³†üvg—™VQQc^‹IJñÏ)ˉ+·RÍ‚bŠÒ&]îm^ß¾yáÐÞkÈF©N Ïð=*!µ—}¦Î*ÀœYNÖHÎ?1Rí}¥%aøÈUMq[+ÞÉR“íO[¼Í!ëw#›VJ€ž6Øûœ©™§e䬖1uö)ÚÆú¡k!§ÎgA'VMc gÖ~oúdK‡>õ²öAëY¿¯·B÷I¶S©ÔŒ' öN'xúòÕº †EÑ)¾Û(ü?Wádë
endstream
endobj
235 0 obj
@@ -720,43 +739,32 @@ endobj
<< /D [ 235 0 R /XYZ 78.37 808.885 null ] >>
endobj
81 0 obj
-<< /D [ 235 0 R /XYZ 79.37 492.794 null ] >>
+<< /D [ 235 0 R /XYZ 79.37 396.082 null ] >>
endobj
85 0 obj
-<< /D [ 235 0 R /XYZ 79.37 468.565 null ] >>
+<< /D [ 235 0 R /XYZ 79.37 371.853 null ] >>
endobj
89 0 obj
-<< /D [ 235 0 R /XYZ 79.37 286.317 null ] >>
+<< /D [ 235 0 R /XYZ 79.37 188.655 null ] >>
endobj
234 0 obj
-<< /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /Font << /F16 177 0 R /F15 147 0 R /F62 150 0 R /F54 148 0 R /F53 146 0 R /F22 154 0 R /F67 175 0 R /F55 149 0 R /F32 156 0 R /F61 159 0 R /F48 157 0 R >> /ProcSet [ /PDF /Text ] >>
+<< /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /Font << /F70 187 0 R /F16 177 0 R /F15 147 0 R /F62 150 0 R /F54 148 0 R /F53 146 0 R /F22 154 0 R /F67 175 0 R /F55 149 0 R /F32 156 0 R /F61 159 0 R /F48 157 0 R >> /ProcSet [ /PDF /Text ] >>
endobj
240 0 obj
-<< /Filter /FlateDecode /Length 4256 >>
-stream
-xÚí¹Ž¹5Ÿ¯hg+Àâ’7  žV pfa2Ñáu´ìÿüx<ÞU]=Ó#là´ÓUÅëÝÉOÿ:ñÓ÷§óëÓ¯W¡OžyF^{øŸÄÉy&¥<Y#7âôúûéo_¸ççÏšó/œã/!þ°üþ•À9àgП”Ã&/ødBc8§7×óóß_ÿ‚sXÍ)´`†ëaR®pduÁQ®i–ðÛxüËñÄßøW |6õ{øf¤¾á½<ûbÐœyãìp!(p<q5«õ$ „5‰—¼6ÈkºFRëf¬?´Ry¦Õ¶˜ ã|«¾ ]Ïm“Z˜–Þ„ÐÛÒ)Ñ'­®à«+k<?ƒ m¯ }N3Ƕ±EÚ×uñZ¨ÈkOVy&¸!<†Y£ØëS;Žìº‰%ìÍÌ‹Ê湸ƒÙ¤ŒËëG- È¥2cI{/³í3šä ´g.¤æLü–F Fn»ÐShlf*‚ÄŽ–:ºDFÉ!¼QD†4/â*É2Åö’˜9ãøšDÁ\*ÃÖ^#+§vX9Rœ Ý´üYë iaŸç
-Pz/7ôr6ˆq6PIrÑ*r£äöA„Ù 7aö ‹Âï`Sß°ÂðÎæßÝhŒÀna\"Zø-¯»l&gŽÃ¸Ê Ùâ–i Û²…¨»G¶4SÖ £(
-œ”ùe¥8“\U¦NI¼|C¾<ãJnÍ~H¾¸$_éé|)ò• ò•Úì)[%v”-ÑâÚθ’»Ú.2ý%šÀ¦½xY
-‘ñšiüKBtΈàiôFpèË%Aã24E c«"Ðñ)´Y 4„Z0ŽŠÃ
-m˜ÓEˆ‰m ¥ÍQyJÇ8"d€CòêõÜ~ ¯|="_MÑÁ)Þ0ξ‘–É |ûÙåkQù"¦Ñ¹æB®°îÂaZd-C"”>™ŒÊLŽêt–à.´LNõ¹–pªŸ ‰M§ÎÂðM³Av¤¾nãLï2Á¼4#¤õzËä…JòBí }혘qh R$Œ¨Ut©¢3Y:lãždŽ³’P8´u£ƒÑpuÒáM‡dUžQ3yÙ꣟ ¬ÈAFžc‘s]OïìŒ bV ÒÊg:¤Yðÿß7i™Ö¢½etGhYe˜Ì¡æ‰¢£e+ Ô'-GÖ"HâZÃ…¬Æ#5foŒWþh âm
-«‹ ¸ê HUû„q‚‰—:Q?ÄK™{9ó0þ~úöúôŸªp}~íOÚ
-D©<ýã÷§ð‡f5‡PL)súï?O¿=ý¿¤4¶`
-ÿá‡ð‚~䙑k· ˜V8‘aFëÞÞ‡”A^«‹Ã¸ùçï;q¥d
-?-ÆTMöÆ|«i‰ð›èAršù +zÐn"†ÑƒõŸGHv¨pòŒ+˼˜0µ˜0Á
-Rå°IAU¢•·::&Höå˜
-ˆZG%œÔÇ"û„Áá­_+ŒÌ?2üwÿÆÙÖŸ~TNh§ŒPÃ4R-õŒðè=X=®ÉÜ©ÀA1œâ#8áГ—ª@eÉ"uÐmRÀ*&GYiTÒÕIƼõ÷–ëè$¸ihâï OQ£c,í.E/zNâ#)C8š9'[ˆÉ®Þ¢
-ñ`?–­Û¦ ¢¦Daí úÙɦõZ¿¶Ã9ê©1ø£SYǼG's€¢Rg{92“óè0L}Í×õL^a`<Ïôý#¹fBM8‹£zÞ·)e àQ
-F–ø–ôeÚ•ÏKè¤2h7ÍÔ»q’"c âsS\½u¨e€k'¿¶~†ªžÀ9­´ Ü[OfíÜoµ”÷Œ{sL¶÷ì’× ‰³%J”£˜?€)@dm;αa•
-óZ ;ogK$¥•5KWJ^Ÿ?Ó¨ú’•Œ¯6Ò¶adzŠÕ[ùùºÝ¦Û­/mº
- [}öMÞ ’é$CÝþi·…†:¨Ø6©æýU×½ûݪ‹Œ4…v¼ì–„²UÊϨ´¡”žm~!
-QkØ™L«‚FÉ-:FÕI~I…jÄH3‡&IZ0Q’žº²Ïø†JÞÚ‚ÒUɯ´îË¢¢1%A²(R…)©ßX‘ÜžgéD·­{»ì·ÌP«ØóSo†–íÖ¦(¶Ù¬ŒàRUu ƒlÐ<UÁo˜‡Ä6!;µxê€Û
-€•².)Ó)Ñ}yFYQRM¯dœ`B ÎÔ0èŒû~wº}‡¾?Hw:Ó›Åq*{-‡2½ÞaÍ4Ñ0ê#µq(cCÃd|ÂѾrÛ'Œ±Ì¡»? O'Ü Ãîê¼D?j¤ ‘™¹=]’ ]³»­ªc¬gV¾Y#­¤gFMК‘2ïU˹XRi.¾’
-
-&“W@ì½­.òÚhÓ
-ÅZK†MåîS“ŠOß '¥7ã(¢´òˆ¢Œ­6¥•ïU”‚ç§uÞÐ-Õ¶3kè › oý,ñÖû@s-C–ÔÙ54`®Cb8Ô¿>ˆÊ­«òœÞ–SuéiÖ# 1PÀ´ïJ3þ¯a¤aÀƪ9:öv®eT6®ïº£‰)AòB¿ÒA®|”°äˆö¢9Ì·áÃzTEó:ßëšCÈ,›yXhÃõ‚@Iú- z›”J”RîÇéL¥CIad*Б¡îœ[¸´ƒy$×Ðð!¾
-¬C•ò³DG>WäÜT* —-ÚT]
-FÛ£d‹”2m®…¤Ý©.U3ÀQéá§aïæ|%˜n–ôŸ“MÒÙòq{4)¸“ÕêˆÞŒ­(çßÚ|H“Ïç¡K`ìÖ©RJñ,n\÷£Ø7çŒúÌwA ­®Ÿ?+#¿ ‡º]ÿ“‘¦5uÒÖ›h«5Ú—xOBn[ò®FùÔ¢ ÎuWBAM•Æ®Yñº
-ÊiÅôix;1Eá–û  䃚™1„Ð-Ċׄf²!=þÈýQÇÌX7œ'\d=Ž&[|là×=…N…V cŒ¹Y=ÍÞ“X¡-`Xn»ä¨ðˆa Ö» ‚ Ånµ™¼¡Ö«äK{s³Áˆ…•K*\s;Ø·a‡«&§ŸŸ®í̹VÆŽ*)æmù#µ¼ü3®ùÎx-œý—FŽ£¤;šÔx žÊÔj3ûÊß¹I­cµÆ°âGn*G‰i2dÄs"ƒ«µ{_•²¦í_Þ]ñ£¸™²LôdžbÚ°ö€:AÍg¡ Š§R¾L[™BŒ1H|óöÝÆ›ßÊZÆ1”P}òîDŸ”†Yo¦Ñ^’vï]ÑYüRö² ÄVU¨èJšŠUÓú|¢»{MˆÆ¥¡p¶dÅ:ÚL[Bôûàã„ëµh/å‘]<¸«²ï(+ ½ŠXteÅXbt©1îÙ+ºEV·au“‘9âadgm‹¯‰£%$¼×ksB”¢Æ€=·ãõúD2nêÜ_ˆ”_jM[_{—ñÐŽjêÑJI}³ÞÚ§VѢˤ°âˆ×&vV°—£UsÖk˜ú«ëšùt~ksTWV!ƒZ•e$™OÆÝŠã 3(Y=©î-À°œƒaZ?Á U- žp>ˆÃ
+<< /Filter /FlateDecode /Length 4443 >>
+stream
+xÚíÉŽ+·ñ>_¡Üb ¦¹/À`€§ÑÓr‹ñnANAœ“ÉÿR\Š,.Ýj49ØÀ󨻹Ô^Åb‘üôï?}{9ùå*Ì)°`¥Õ§ï¿½øÀOâäSJœŒ[qúþûéï¯\ˆóÛφóWÎá—~8þ&=üU’s Ÿµ°ð¤=4yOî5¾Ïo®ç·|ÿ+ÌiåjNa,“Á “r©8·<Ï Þa$xÐ<¨á¾äoV–÷å]ümt~¶~‹ø¾@°ÆZZÎ7ŠWž‹âG¶—<[ü‹Ð’V×øŸruFèñKÄ¡À)ÓsÀ™#æi삉-˜Æ×ój¾D« ¾]s%ÍuÎÿ°}u—S\3é€S:0Ám¥“^QÞ°Æ·ÒírAXÍ´VãèÆ8 ¶Òª×<g¢Oz£øç·ˆióqüeà
+ß”-àzÂÈ5KŒ0Ì91rmâ8Xpg2qÚ¦Ô6L)æ¢_èF½Ã†íëDÐÌ€]Fo>¡­ö·Â^I«‰ž›«ƒ=®Ä¢ôo.ÑÃÌT¡mQ~âÛØ"ý½Ž¶¤Á=0ÆcÜ 0'j|ܨ¶+z8ìŸ%¾Ã!SÐè5$“Z£ßƒÆ(ØΣ(×|A²ÏUeÐW+ŽþªÚæo_“m,âKFš—þEW
+B%)ÆÙbä5'3­7iÏ‹r*@ù¶’.÷ÅðC\V'¶Åö{LyĹöÓ °ˆð\ŽPnè–
+æ]Õ
+I8´õc€A¤:[ø¦#²®O[{[ŠÚ£…œH›öÇ’WTçOìŒbWBu‰37Ûáÿß6yY`á@w{3}mÊ®öèÙ#d‘û÷$äå™37.VRöŸ7I×ÔUQ|‹”n}ÒŽcÃdwÌY™²ñï·—¯ß_þÓ ®t̘pÒ^3mÜ響¿Ä04ð(âö²=ý÷_§ß^þ_r1´`þÁ‡ø~-eÀ™”¯Ñ0Q`Ò‡ÞßÇ|AÕ§ÆqÜòó×o»;•>-ÆÔ$uc¿¶œDü=î¾yGìhÒ/’d=í­O#d?T%ùÅ-ˆ:Ðv 8¨8ì‰â‘LÂo¤Lz¨7»äqà”®\Ú?ù¥©…ãm{U&*©‘¦7¶åÍ‚Œå š«Ò³T[¿¨n†¾WËfFòf¢g…ÆÍIÛÿ2ÌF!ì)"u1óŸ8{ }þ9@8®­ëÓ²¸ +÷…“ôúó_~*]6¦™±¡ïò§Ÿªb,`“ûÖ1Â5ìh,ŒnëÏž+1äl¥ÊÔ-‘.¤Ä¤HO“®N©Ž©„öÌqÐE$Ë£3MÚcU‹}ÆÄ¿R­­F!ÿ;ÓtëO¿6aବÐã<J/­œqg&¨ìv\ÙTó‰vɧÁ<Z?mºñ½M&8Í”Wã(+Ê&{»Œ` §Ô2Éý8ƒ$Ëð€Ñ@8玀v—½—q!d>“3HS j$ÅÝë-® ö#l¹¼mÎ
+Äl„¶øÖÓ*SˆK³\óàvDLK]m+þË_1¢~Lؼg^† · ±nχJÈã²ãó"ü€Hp­ŽB•]à´,FBY‡‘î ø”3Ì[ý4¯ < ØOõ
+Ã7¼ÂÑgz…a®^ah}·Wú¹ëÆÙžéFßㆾ7¼ÂD³ÄgZ¤¹êã³uÒâþ8MÁz#ððƒ¼—‚‹ÓâƒÞkì}¯÷û?ä½6@¼˜½P¦âöÙ¸‚·c6Oôh¸¼˜ð]SWK¼–cë»4üáh÷£…nÍXæ¼ÝËXMY¥"ŠCOߣü”Õf¼~®-¢¬Mý
+²µ`ö¹{Zú˜òûªíæ£ë´qJeØÆäÍ(c+Ä
+qð€Qä?¶q£–‘§ÆE«RF k;Zë{.QCš…³\) `æ">uŸé »ÑRÒU±¯rþuQˈgI“bm)ZÞéDm§eœ¶î]rØò@Ô¦—§Þ-Û­½Pj³Y5˜Ð¥7<p*†aÞNŒÌÒD :‰Ô‘ˆA€ËQm ýM.Aý ž³{Êag Ë  F •-9éÒÙϧU%ÓJO¯tF„ÀD+n+Ô6þZX#ï=¹ ¿‡À¥;—ìâ¬Ö¼Öã˜ÁìÝ×,ac²HzãDƆ‰“Šñ™LûöíƽI–Qj¢ŸÉXø‹ýÛuaâ†Ôí»ŽÖi;Ô8ûÛö:­öìÆ=û5Òì¶Õ3¾väΣ¶#@tÊÅšS£’­N¬ ï˜l5w°Z0,Î #_+Y.á!wÔÓ)ÀèÎ$ôA¥b?+½ñ©Ý!çŒwP`°DÎ9„ýy綡¯åÍuÈ]×WO=÷÷,]¹&ƒ’ [|m´¡j±¶–ÌAË™³–šO?`-ãµ-Ã(µtꈵL­6­¥SZKÁ,èÞç ëÒ|Ü1÷±úÖÏ’.pOtÛ1á:½ÆæÜvÌ ãŸÅejG¤Ó }Îoë¹:§×vd¡V0¡º­?,Ì“,L*˜«É@qn÷d41nïºÃ‰9GòŽ¿òQ®r˜°¦‰ö‚çÛˆeƒN1å
+´”‡q:zaf1
+È]=í¤[¼´-
+ëEL‡O Ž4¬ÔµÿaDÂCŸ+vn•xÙŸìÊ­ó¢”&“ç– ²4ß‚Úîu· ÕÏs’KfàÓ
endstream
endobj
239 0 obj
@@ -766,29 +774,26 @@ endobj
<< /D [ 239 0 R /XYZ 78.37 808.885 null ] >>
endobj
93 0 obj
-<< /D [ 239 0 R /XYZ 79.37 377.492 null ] >>
-endobj
-97 0 obj
-<< /D [ 239 0 R /XYZ 79.37 131.809 null ] >>
+<< /D [ 239 0 R /XYZ 79.37 294.653 null ] >>
endobj
238 0 obj
-<< /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /Font << /F15 147 0 R /F62 150 0 R /F63 151 0 R /F65 152 0 R /F32 156 0 R /F22 154 0 R /F25 242 0 R /F53 146 0 R /F54 148 0 R >> /ProcSet [ /PDF /Text ] >>
+<< /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /Font << /F15 147 0 R /F62 150 0 R /F54 148 0 R /F63 151 0 R /F65 152 0 R /F32 156 0 R /F22 154 0 R /F25 242 0 R /F53 146 0 R >> /ProcSet [ /PDF /Text ] >>
endobj
245 0 obj
-<< /Filter /FlateDecode /Length 2937 >>
-stream
-xÚí[K¹ ¾Ï¯è?`E¢ÞÀ`
-×üŸåê}@=äsê®Ï)U%ï5Ê~Óî¶ü"Z]m¬î®ô½åJ 0}hßsõâªÙV_”Ú Á—Æ9/tôðÐyЦÉgU®^f$(ü7ÒJDk•ß ­Aøhmâ ?P×0ůˆ~ªJÖálIß Å9¿y;Y<ßY3dÇã½úÍ)Ð!¦,ëHóÜ,˜sÊ˧
-Üi¹™yè´ÓN®•õ<®'“#Š±T5n¤²#›bº\1Z=¢C©gVÊ:œ¸[Çse[+¹+²÷òÞ†4ÊX-”Q³í˜ŸZ­Èü7ë†0Š+Ïc¾!¥€X3xÒ)éOëžótu[ÖçJÍ”9·§<UXÄU–°06 :› :[Œ3®vº«kµ³¤êÓ<QæÜõRè)ë6g³æ5%_®ÕG¡på½Bhy‘²h%ß•ÈÌfÑ)ƒpÕ˜¹|½_ºj-¬³3.>FÅ‚î—#.ÌUWžJ?ÿ¥¯Í*PvLzÐ+'Ž¶0[«
-Ži®ǵÊÜ ïñNèÐrú°Oèö|lË(bû­(øÎÎW oÝ̘YÉ߉̱°RyxfÏ/5âõr'Í8#Œ®…œ*Ûâ Êùªn„ÓA¦ŸR…)Y¤°PÇÖ¤^=èK¥:Þ`j3eåG{®Ã)«HÕeBâ|JHw·&aR!# aP"&›¿8٪ƤN3W¯÷woÚájZo8Í`Ó”]›„׫P#g5t§:>bA¿TÄ,Mó¾T轶º„dz]FÐZÞTå8ÜÃß4ª—2ßi¦lˆ[Ï.2å ©+Ðêoú’IëiOTÆ–hͧb#Flé‚9n8ÑÏ©9èpà´
-É®ºÀÔìmj¨°¯“ŽØ׉³â Fjåçh«ÞôtÄì¶Ìc•¹›
-ãÐà£FýDUZ#ÂTŽ††w{Ê2Z,‰©‹OkREn{!Éul9¨
-i±Tþüå[ç XBÅeîvDÜT
-äÚ~UÍ
-€ñ®Ou,,pd÷ÞäóCž5Mö÷>ßëjZ £VF·é!ß+x²p†Ó¼™h¹í Þ
-Àêl½_À! ®¯rXÆ(¹X:×d‡,.Œ tS¸d£×Éî{­Q`ŸWKäá%C݇—]õvqÇG<nLàï†VËpjè¡õU{ÝŠ¼a>²5îÅGìÂãyØΘ;òz»¹?G°ÝFaÝ<u*þ\Æv„¶çb»ÓBµsYò°qòÇbû´Ö ؾrŸ÷¢g8_©ç5܇
-VxµÎ½n{TLþ²s†·H‹žö²€Th'µ¥ÕwrÕ}m
-­ºß%µö¡§·õY%rŸÕ¾Mð˜üÌ=½àÜ^7S~”^Rªò8uHЊ·ÖÇS†•.pþ¹v°äßθ© ~§È ”ììÌ'ýž`ÕTy_z}ÒØ(näfmØÝžÜ{<ú¬ŠjáÙä†6.w·ÞqºÒ‹¼hgïw>>Õ3ßn± 7´4ÓpSjÿ£ˆü$5²\ç¦ÈÕ¬Ùó×­ s®»¾&3DÙz76›ûf©µ kë§d; IsWëŽRÔ[·ðöZOïµGµH•~`¦ußÓš9ï8›Ô>‡^ºÚ`MºÚPÕ¶Œ÷Û§¨¶ÁýéÛ§üF±I2 ªÝÿXÐ陥u+57¼æh«Ÿ¡Ê?IìFâÂwÆÒŠµ¡Cp«Áhõ¢½ò~j«í<•Œ?§ÕKañ«ì)^ª@öÏéôúÞÖ¤ xÜgj8µÃK9ÀbIÿ9z¼ÎïïÚP¢UB¯/½ÞéíRwÖý¿·k
+<< /Filter /FlateDecode /Length 3359 >>
+stream
+xÚí\K¹ ¾Ï¯ècrXE¢¨0ÀíöHNYø¶È)Èæl€äÿB=¨gUwµ]6öfgªJ¢(>>R,–ååŸyùürýòò§w£/J‰`Œr—/¿¾(z"/êâ‚Ðîâ¬Ҫ˗ß.¿¼J©ƒ”ÆKiÍÛOJJI·¬ H¿ÕG)AÓõMJôùÚÒpšBc‘î[xûÛ—?ÓšÊ\‚,n,©°!ð’øA*ç_iyxû ⪠ջÍÔÑÇ»:²é ­[ÇÉ|®…‹kþ‰ÜEŽà]Ê÷+¦«Fµ<Õéï7p¯y?i É3âNóªý¬|4ZúÊ£"§†$ål¡øÎbêc^ÏÉ7𯼃ŽËiMÞ·Á¢‡k?"­gÊ]Øs¡Uü])ÑC|Á­hÊà–¦­°ÒκŠëcÙwÙÑ=}£“<ÌTx¼‹H5K~Cê‘þd?`„CdjP´-)5¥L³Ž('ú]e¯TÑ÷A».ó£œ-04Âu?ø)Ê•é›êÖ|¿¶U¢õæq#7lYÑ’’EAÖe¡ò![RäÏ\3¥6÷±˜Î6÷=çìae|‘aôª¤ßVˆž•ç±e’çd‹
+©*Ø¡Êᇇc8ŠvšŸ&w¼•'Izü$AÝ­{PWŠ˜¢À<s5À(d}ÕÕY^2ÛSü;ŽKz}¬K°V„
+ic„™ii…INIzØÂ`òù&Í»È" å4,ôŸ÷D–]GdöÈœ9¯ñ14”`]îFÅ t„²y¡Ö5öuµALIDõ¹œvÝI)f;pLG…)5ƃ‰¾—üàœÄ”ñëz÷2Jª™«bœfj[G >†D™ÇÄ<f/ؾIgmÏ­;Êœ&`M-«å_·ti)
+aµŽ¯í|—\T<Œk}ðK¼ÏWGcˆ±bYý¬h¡¼Ð”^NÔçD)ï#ÞÑWÆ Þ…í²Â²¯ÞÔS6§îÚœRuç½DÙnÚÝ_äS««Õí5þÞ²£„
+ƒoßͲmÍXr‰…FÒø’¹[iWÏ×ÊB<™Æôe†‚îä÷ zaè€éƒn´sõÂ@]‹aᵤ%ìp¸S7Eg&•ç;[g³CÕ’£Ð¦JU–e$¾6 æ˜Ò%êiµ™yè´Ó®•ó<n+ßÏj±c*p†_É&Ÿ.WŒVψPêY„•ò†'îÖñ{…-ͽ¸·±›ƒ…F§SÀ¨:f§&+²$ûE4¢8ñ<fšÀ*4ÓPÙåµÖ=ãéê(´*JÏ•š)shO?òÔ€¤d$¬{Ù:Ê°¢•mŒÎúâx«­î²ZíƘ
+ºg[Ž˜0g\yjŒöù/}m:é«Mª3Ú¬?Î(ØŸ9K×*s7L‡¢ úæŠÃ¡;ï±&w\h¯@ü wWŽÎéÆÎ\
+ãÌœ ónšõ¥ï½å$qOïˈ¸–Ãj±ì‡{è›Fõ»Ìwš*ÞÖºE¦¼±ë
+³zÀ›>]Òó‹¢2¶x«½õjÁ‘sÜp¢ŸS#Ð2`ÇiÖ¤°îÞ@Î×;Ï—„B)BRî¿.Ãå_ÈꜼx²:«ýšlÄW1Fª¯¯hæºJL ø$€¶äb¼Ó[CÔè5q}Èè1<'Ò‰¯È´i»8aÀ<å‡<C#ÿ5Ÿ&GªÇSŸZ3"ÙÅ7ªôÿϳ\Mu/W¦Ñ#ŃšÔD“€Éx#D”Ä°?YO~ÕF£?ÄÜ>õv‡Õ‚@ ä„…!´¶…\)†z/,„”rBB¸ ¥ ÖÚdWÀ¸qˆ®åýÄçq3±¸¹ŠS¢$*\}j9]^ç§ -l!}kÅbSDv•…2ÂI7äP~_&+°/‰Â¡?&“šúÅ7Ç×&©#Š7eˬÌÝ;võó„©C|»fa2âíˆK{:PècÒâRMJÈM¿Çh;¦)@æŸWQ>é îµÝ‹Å‘~lr 2glµÇàV%Þd?ÀC^ÿb­–×ëœI’´S»¼ûÒáp¡‘Ñ+Døúôåå?3y4‚Îpÿí%ÞYŠ¡coLSÑ^þû˯/0u•XšM³$7»`ãéÄL
+Iiñ™æ§½ðXqÜ^ÙÙ4Ùõ?…гö[Íg¤O/@,‚nqͧñ7™Ѷ¸ˆÃ}ƒž9:bh¹ã<wÏÈ ³ËèÃF¢“öTû¢<LJŠÇöÃSö5Mv÷~¾ÖÞ´¨VF·Ãé!ûcX™¹?ÃîvFÚ(·­Á&Ì£÷S£8•ð1r%MçÄìÆZ!3…KVúpô¾×-ÊEïc¦<¼g¨Çñr¸ÞÎð¸ÒcÇ8þÐó”L¯‹Ït=š´mýªO¹Þ8ù\hŸÏ‡\Œvåò<ˆg฽ÝÞ™£#Æv™;¥‚ ¼Œ£B<Љ#¾ï=ÓÐ$\¯º×–ÏÚ8ùûbü´Ö ¿rŸ¦g 'ŒÓöˆIy:ž«uîuÛ¤B²—e3gl"X¡9íE©HOjKªbÖ}i
+˧Y©àæÎÊÚ òNk <‚®ÒÒYx™»“¾ðù`mO9{äÓÄD;—(·¹G©×2OáFYŒ^´½èÄ.A¯Z~"¾Í+]OŒo‹LïÆ·ï"OãE@³H(‘y/†Úh‰£ßÅF ­¶GåI£ü
+¸Ïà„pE÷Œ·#Œq_e£ZÊôÇ÷°QM$•?(SM¾‹jeºðU6ªA 'ÃAu‹€«‰~CФó+™ýÍÝ{›#RÈ°æ±q·Ëƒõd& "<îQ‰Ü ~S€Öž’"‡[iÃø>jS%¨HÀ`·5ÞZA«Àȃ~]  F‚›ûuã«Nî ¶ùkcn¨¯üCkØְߧ;·y•æ
+ÝíÙZÚ‡ßÖz•8È­Wú8!æÄíu=·ø‚µ»ßߥGéµ¥*SÓD\ñÖ}rgm÷éX÷Z›Zò§4vjŠßIò¼O gŸñó‚URå ¢ïåqH`‚Pt˜›¥av[tïñ d³*¨…gÌ=nœîn½õ´¥5y‘ÎÞg?.'ÕßvÑ ÷¸4Õp—jÿD~’z[®sŸäªÖòáfº³cºµ‡nÃt×WÅt_¨íÛý„}ÿÔÚ™µõeÙNÒÜæºc€DkìÂÛ{-<Þk/jÙUúÞLë¾Í5sÞq<ö­}ðýîjÏ´ÝÕ«vd¼ßQ•*YÆüî;ªÜÞ±ig1S öÛœ®ìîyYº¹R»Ã{ö¶Ú êû§ü…b0®ã0”î¬ ‚]eî@÷—¢ìÝhwj÷—B:½9ÿcº¿”¦c.œÒü¥ÀkÕjþúÚ^¥ (¤ NmúR’NŒ¨M_ç7|­B$„wŸìõòJøÖyøÿ^¯ü]Èt6þÊV¯zŒÙ‰§¤'K‘ úÄÄ]–©Ÿ¾¼ü?-ª‘
endstream
endobj
244 0 obj
@@ -797,17 +802,20 @@ endobj
246 0 obj
<< /D [ 244 0 R /XYZ 78.37 808.885 null ] >>
endobj
+97 0 obj
+<< /D [ 244 0 R /XYZ 79.37 771.024 null ] >>
+endobj
101 0 obj
-<< /D [ 244 0 R /XYZ 79.37 682.839 null ] >>
+<< /D [ 244 0 R /XYZ 79.37 620.939 null ] >>
endobj
105 0 obj
-<< /D [ 244 0 R /XYZ 79.37 643.554 null ] >>
+<< /D [ 244 0 R /XYZ 79.37 581.653 null ] >>
endobj
109 0 obj
-<< /D [ 244 0 R /XYZ 79.37 303.165 null ] >>
+<< /D [ 244 0 R /XYZ 79.37 243.786 null ] >>
endobj
243 0 obj
-<< /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /Font << /F15 147 0 R /F62 150 0 R /F53 146 0 R /F54 148 0 R /F70 187 0 R /F61 159 0 R /F63 151 0 R >> /ProcSet [ /PDF /Text ] >>
+<< /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /Font << /F53 146 0 R /F15 147 0 R /F54 148 0 R /F22 154 0 R /F62 150 0 R /F70 187 0 R /F61 159 0 R /F63 151 0 R >> /ProcSet [ /PDF /Text ] >>
endobj
251 0 obj
<< /Filter /FlateDecode /Length 3274 >>
@@ -985,140 +993,140 @@ endobj
274 0 obj
<< /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /Font << /F15 147 0 R /F62 150 0 R /F63 151 0 R /F54 148 0 R >> /ProcSet [ /PDF /Text ] >>
endobj
-286 0 obj
-<< /Filter /FlateDecode /Length 2139 >>
+283 0 obj
+<< /Filter /FlateDecode /Length 2181 >>
stream
-xÚíZÉŽ#¹½×W䛌n@A@©Õ`|ò¸nƒ9Ùì>Øÿ¾#¸%™É”Ô¶Ú˜Ã4 ®L.±¼X¸Dêåo‹^~x9¼|º»D8Z>~}1Ü¡³ø¨Ð/Þ¥Y>¾.?¿i W­¯g­Ñkm>kí.ü‹Ü~9½"XAAzäÍñ›×'+­2VzÊ]Ç E„öv®o2ÛÉèx/”\¥PÇ&ZyDia¡4A¥Y¥r;ºöœ¥ •Vч½nœ¹ºU[¨s/=EéM=1Ó°FF4L
-QbWtð”1­”…ÆuÈڹR«cd†à“þ–^– a']ÓµÓþ—·ö¦¨ŒvÕÞnÕÂ[•<»å‘†[Q|Ò%sÆâ/™{,²$ÙBiMóªLk·…Ú‹Íüæ3çŒH–€*²P츗÷\ämøTz·}4ÉÜÛ{.v´¢U{è©4™:;U»…öÞ#ÞIPæž^Óà$¶®Ýá&FF¯ŒmA\[g’IÜó^ŒJˆo½Šézö—‚xêªQ(ä²MÖ¶,¨Œzm|³
-nbÁ·ÞØ+ [ÁW1‹šmNï©aðÔäyšVVÒ$ÿÿgI7²¤f@±E 07ú\¢[òЗb«ÀÜ÷Ñ7{´Àezø^í]r›Ï}2¾>ƒÏr—äþéjíâTôl/3*ãqñF+o¡Åºx|£æ.Ze‚é5w¦Ø˜5³Xsê/Ò/ïkFé _o™mL,þ¾ ¯hœC¥­Ûò^âÆI±¹x€ÍžêÓÍÎ+RFY;-·8ßZAã¹Î×¹ä×µ@2‘¶­oÍgEŸº6¤¿×#ïóñ5¯¥œ©û€Ï ~Çþ¤°/uö¯*é„Š—‹wÎ|Á^svO}~Evb ¥ ²- (4¡ß‘$n¾ÚWvû\ο/eÆ.c„uݱ6[ĺ†Lã FÁŧÐ5mmÕ héuŸ‡ª<uGtKºÚ{,_óÞkÿ–ä½ÌeÕ¤H7œhĨE^Z[Üëœ>4-6‚¢.Sè5Â×U¸£=“Ç­(¶8èWú”8» ,=È™ÁØq/^c‰”ÃFçñáâ$¸9'å¼'±Èà0ó .—ÇòoŽ|«ƒònXójÔuë›">æó_>^þ¹aG8.þú"­ÄîaÑ.†}œÜò¯¿.¿¾ü±%d¡ˆÜ! õå§rÞá
-´}Ìu¸…º÷Š1^ñê+v
-xRE/½Ìðiý¦’tóлø:ÖïyðòD¸ïaÈÅKƒ{¤Mß,Æ*4“N k†Gù·lÿ&7˜wõNF¹á—y€0ÎÎÚ½D5 ,¹>öœx¯‚ÛÎõqΉøÄ`v£?
-¼ <Ï?,Ÿà üžá+¼ZEnÚò™¯æùŽ…äg’—À} Ñ2 |†¼6¼^~—i{§Çð§ #±¡ô°¿* áiXñàû»ÛÈæ Þ¶‘û Êzeý–4éyÖp ‚Þ~Øá çB|ÐáGj[R£"ÿ<à³
->a3û {Tˆ‘Š=î¬
+xÚÍZÉŽ¹½÷Wäˆ"Á h4Ð¥R 0>y¬Û`N¶gcì‹ßÁ%¸%3«4.ÐêN.±¼XÉH¹ý¶É퇗˗—7e¶ ‚Õ·/¿¾(š›Ú\à6g•Vm_¾n?¿J©oRÞ.R‚“R}’Ò^é'ÐøõíhC+ÐÇ™ødéÉÉ7GãÚ8ºì‘¼>R]Ÿ.üwÛ¸:¼i)Y¦Àk­¼¢ŒP5Ód©ìŽ®¹d)°Ñ*ú`¥×­S7Û´Õ¼÷ÚSŒ³i&dFÅ“Bc”ØfL™r¤qÛã0¢vaj¼&îˆø¤ße–$HØEŠ¶êÚiÿË—g{cJZ¶·mºhÿÊ’‡b·<¥¡Q—tÉœ¡øKæŠ,I6_FÓ>–©ÍИçY`4ó“Ëœ3"Yddu±ã^ÞK‘·âÃôÎ}4ÉÜÛ{¯v´Â¦½î©T™:;±Ý|}îï$({5¼}H‹“Ø’§;Ã-Œ N(Sƒ:¹¶Ì$“¸—½)”
+Øçrúù\Îiè2†oçŽ1Ù"ÆVd*o­„V°Yi„Ū­a Š–NöyˆåáŠèL:ž=–¯zï­Jò^—²š
+)¹Úí_ß~}ùsÍÈ´B ýÐDà‡ŸÊ …UBó(€Š"tV(½Ê/cÎ_gÅh‰0S±¬¥O«¢TåÏŸú g¨ŠØíýc¶¤­œd·™Ã"óÝ·‡¡_¨³GF]Ÿ¡n‘jlxõ? ;¡i£—Vø´þ¯²tõлø¢àÝÓð5š²p8Ã÷0fŽ¦â=ÒÆoˆeè\Á•t³jyˆÿ¶ùwòƒõTï j3ó€ë:BgkÌ^"Ζșÿì9Qµè½÷º°æDVj·úáø#žHádâï¾¢Išù¬Ïó‡|‡pt+ÉK pC­zõ4 5…¬Òß'ÆFÚcõô^šr>!1QzØߨà lö4¬(òÁ¸ïïoŸ'øÛ,ù3rU¹Æíh£\g«…—»Õz=Páf-¤b;Jž’¥zšO
+OÞ(øÁwGºk_“F"õsŽâ÷ºê]ì×Iß>@Û­óçÕQ‡c<µYF±|`³à“½Ï3ž}ÉÐpx¦xJ…Ã)š(­° hÚk—¾?w¯ÜîLµF åg”K¡px4Zm,IF}ï˜å]˜ã?¦R‚
endstream
endobj
-285 0 obj
-<< /Type /Page /Contents 286 0 R /Resources 284 0 R /MediaBox [ 0 0 595.276 841.89 ] /Parent 233 0 R /Annots 288 0 R >>
+282 0 obj
+<< /Type /Page /Contents 283 0 R /Resources 281 0 R /MediaBox [ 0 0 595.276 841.89 ] /Parent 233 0 R /Annots 285 0 R >>
endobj
-288 0 obj
-[ 278 0 R 279 0 R 280 0 R 281 0 R 282 0 R ]
+285 0 obj
+[ 278 0 R ]
endobj
278 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [ 78.374 160.62 158.683 169.686 ]/A << /S /GoTo /D (section.1) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [ 78.374 102.186 158.683 111.252 ]/A << /S /GoTo /D (section.1) >> >>
endobj
-279 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [ 78.374 138.652 220.7 147.668 ]/A << /S /GoTo /D (section.2) >> >>
-endobj
-280 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [ 93.318 124.754 233.98 135.823 ]/A << /S /GoTo /D (subsection.2.1) >> >>
+284 0 obj
+<< /D [ 282 0 R /XYZ 78.37 808.885 null ] >>
endobj
281 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [ 93.318 112.918 405.437 123.798 ]/A << /S /GoTo /D (subsection.2.2) >> >>
-endobj
-282 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [ 93.318 100.405 270.892 112.361 ]/A << /S /GoTo /D (subsection.2.3) >> >>
-endobj
-287 0 obj
-<< /D [ 285 0 R /XYZ 78.37 808.885 null ] >>
-endobj
-284 0 obj
-<< /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /Font << /F15 147 0 R /F62 150 0 R /F55 149 0 R /F63 151 0 R /F53 146 0 R /F54 148 0 R /F16 177 0 R /F32 156 0 R /F61 159 0 R >> /ProcSet [ /PDF /Text ] >>
+<< /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /Font << /F15 147 0 R /F62 150 0 R /F55 149 0 R /F63 151 0 R /F53 146 0 R /F54 148 0 R /F69 186 0 R /F70 187 0 R /F16 177 0 R /F32 156 0 R /F61 159 0 R >> /ProcSet [ /PDF /Text ] >>
endobj
317 0 obj
-<< /Filter /FlateDecode /Length 1335 >>
+<< /Filter /FlateDecode /Length 1454 >>
stream
-xÚíZËŽì&ÝÏWøš@Q ]YO#eÝ»(Ûd•ÿ߆§Á÷ë¶&™È‹–ÛmlpŸSç|økàïoÓåí—YÐ`™% .¾ wbЖI=hŒ“.¿ÿàœÞÇ“å¾)9JpG îWî>î¨çxŽñáŽÆ} ^óçdãyl7ž¤DËãSÿ¸üæG¢z#±È¤ÀA£e‚SŠ{ë@ÁxüXPû~üs¥;ƒ)õ4ÅO‘Ì~ÔK+ôï’ÆiË;(÷N
-·cöï2ž´òw*3ž\«ãÛÃß„RT`ßÂ,5Jla¦is Ý"ðF0H¼ÜÂ8þúïF iºÔ
-éüï:Ý•M8¼Õ9÷xBqÚ£äÅžB‘'-é-ðWÍËà SÒœ9‚ä3å4g¢=9‰¨%+cš„M'ÔÍh2ôtWA˜¾À§äŠBh`"ÍP@KƒJbBÎv¢N›ñ× ÿ U ñò Ø ê@NÃr—ÂÒÿ¸*ÅPé=\C˜\×SïAóÔ¢Œµ.»ðw‘ùàH –2ôx ø
-¦° ÚjÖð^ÂmqÝ0à%_j¸žJdÔ+ç5=‘Þä}
+xÚí[Mó&¾ï¯ðx)Ì H«HñfS©ç½U½¶§þÿkÁ€Á;É6Ú¾[ùùŒý<3Ï0Cäð× ‡__Æ—_®Š'Óðñç‹òä ãšÁ°’Õðñ÷ðû«”<ž~8ÐaïÍÿœ”þgã–ýOUçµòÛËéZô-à*%B>òmÔ•Ã) Å6aŸ.±Ÿº=8¥9>ý߈uoÄŽ* 9¡$—!ûŽü
+¾”käž‹‹·™..h„u›–VI%ªgkž‰ÙÏ„#? ›,x …£ÆdBêd%x\N¶õ™ú£ä8ÇýÚ\Û2g_BKªL†ì1ùW¦¹*Øͦ©P8kZü[|øˆFÿ œ%ÁÎi|ç-«õáôÒ—a\:9)¤iMÚ–¼â[‚ØíG;¹d>éãuûžbâ·§9­<[ï{…~óm
+{5¼Ýš'+4–Ìz†7ço§LF žç“5ãá‘¿-ÐÝQ
+#ÍdÉ>Ú¹¦òòšœÃXÙ%£•Í“ö
+XD$€JÛ¶¬TÍ©¯lá91½Wu½Gf¤æWRoM
+úÕ½š–Q‡ÏûØ bcíõ¿Ýè➨ ^ 6¯‡¼DšLkª¬= ûb2tÙ´-®ÉPeø­véy1v+>ýP.Ø󴲢ʈßò{뻌9Öw}&¥;"´,ˆË’~ýù!T mæu£0æ«šÒÕ._–‹UÌT•áX´†¹>{#ŠAC¢Z‘®› æ¡×¨˜¸L.çôûötjÉÜÞË9<Üßg\ö\2­õø*xyøí¢|n®»È5WÉË
+²[-9èÇI¦¿=Äà@°f/SÂUëÒÇ9þþñòâ
endstream
endobj
316 0 obj
<< /Type /Page /Contents 317 0 R /Resources 315 0 R /MediaBox [ 0 0 595.276 841.89 ] /Parent 319 0 R /Annots 320 0 R >>
endobj
320 0 obj
-[ 283 0 R 289 0 R 290 0 R 291 0 R 292 0 R 293 0 R 294 0 R 295 0 R 296 0 R 297 0 R 298 0 R 299 0 R 300 0 R 301 0 R 302 0 R 303 0 R 304 0 R 305 0 R 306 0 R 307 0 R 308 0 R 309 0 R 310 0 R 311 0 R 312 0 R 313 0 R 314 0 R ]
+[ 279 0 R 280 0 R 286 0 R 287 0 R 288 0 R 289 0 R 290 0 R 291 0 R 292 0 R 293 0 R 294 0 R 295 0 R 296 0 R 297 0 R 298 0 R 299 0 R 300 0 R 301 0 R 302 0 R 303 0 R 304 0 R 305 0 R 306 0 R 307 0 R 308 0 R 309 0 R 310 0 R 311 0 R 312 0 R 313 0 R 314 0 R ]
endobj
-283 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [ 78.374 759.955 177.522 768.971 ]/A << /S /GoTo /D (section.3) >> >>
+279 0 obj
+<< /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [ 78.374 759.955 220.7 768.971 ]/A << /S /GoTo /D (section.2) >> >>
+endobj
+280 0 obj
+<< /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [ 93.318 746.057 233.98 757.126 ]/A << /S /GoTo /D (subsection.2.1) >> >>
+endobj
+286 0 obj
+<< /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [ 93.318 734.222 405.437 745.101 ]/A << /S /GoTo /D (subsection.2.2) >> >>
+endobj
+287 0 obj
+<< /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [ 93.318 721.708 270.892 733.664 ]/A << /S /GoTo /D (subsection.2.3) >> >>
+endobj
+288 0 obj
+<< /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [ 78.374 702.172 177.522 711.188 ]/A << /S /GoTo /D (section.3) >> >>
endobj
289 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [ 93.318 745.619 245.866 757.574 ]/A << /S /GoTo /D (subsection.3.1) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [ 93.318 687.835 245.866 699.791 ]/A << /S /GoTo /D (subsection.3.1) >> >>
endobj
290 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [ 93.318 734.112 160.018 745.061 ]/A << /S /GoTo /D (subsection.3.2) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [ 93.318 676.329 160.018 687.278 ]/A << /S /GoTo /D (subsection.3.2) >> >>
endobj
291 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [ 93.318 723.98 290.319 733.215 ]/A << /S /GoTo /D (subsection.3.3) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [ 93.318 666.197 290.319 675.432 ]/A << /S /GoTo /D (subsection.3.3) >> >>
endobj
292 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [ 78.374 702.172 217.522 711.288 ]/A << /S /GoTo /D (section.4) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [ 78.374 644.388 217.522 653.504 ]/A << /S /GoTo /D (section.4) >> >>
endobj
293 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [ 93.318 690.107 264.755 699.342 ]/A << /S /GoTo /D (subsection.4.1) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [ 93.318 632.324 264.755 641.559 ]/A << /S /GoTo /D (subsection.4.1) >> >>
endobj
294 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [ 93.318 676.438 250.11 687.317 ]/A << /S /GoTo /D (subsection.4.2) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [ 93.318 618.655 250.11 629.534 ]/A << /S /GoTo /D (subsection.4.2) >> >>
endobj
295 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [ 116.232 666.197 276.738 675.213 ]/A << /S /GoTo /D (subsubsection.4.2.1) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [ 116.232 608.413 276.738 617.43 ]/A << /S /GoTo /D (subsubsection.4.2.1) >> >>
endobj
296 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [ 116.232 654.241 265.45 663.407 ]/A << /S /GoTo /D (subsubsection.4.2.2) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [ 116.232 596.458 265.45 605.624 ]/A << /S /GoTo /D (subsubsection.4.2.2) >> >>
endobj
297 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [ 116.232 640.573 286.86 651.452 ]/A << /S /GoTo /D (subsubsection.4.2.3) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [ 116.232 582.789 286.86 593.669 ]/A << /S /GoTo /D (subsubsection.4.2.3) >> >>
endobj
298 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [ 93.318 628.618 282.1 639.566 ]/A << /S /GoTo /D (subsection.4.3) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [ 93.318 570.834 282.1 581.783 ]/A << /S /GoTo /D (subsection.4.3) >> >>
endobj
299 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [ 116.232 616.104 361.512 628.06 ]/A << /S /GoTo /D (subsubsection.4.3.1) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [ 116.232 558.321 361.512 570.276 ]/A << /S /GoTo /D (subsubsection.4.3.1) >> >>
endobj
300 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [ 116.232 604.149 443.664 616.104 ]/A << /S /GoTo /D (subsubsection.4.3.2) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [ 116.232 546.366 443.664 558.321 ]/A << /S /GoTo /D (subsubsection.4.3.2) >> >>
endobj
301 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [ 116.232 592.194 456.307 604.149 ]/A << /S /GoTo /D (subsubsection.4.3.3) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [ 116.232 534.411 456.307 546.366 ]/A << /S /GoTo /D (subsubsection.4.3.3) >> >>
endobj
302 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [ 93.318 580.677 256.267 591.746 ]/A << /S /GoTo /D (subsection.4.4) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [ 93.318 522.894 256.267 533.963 ]/A << /S /GoTo /D (subsection.4.4) >> >>
endobj
303 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [ 116.232 568.722 231.599 579.791 ]/A << /S /GoTo /D (subsubsection.4.4.1) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [ 116.232 510.939 231.599 522.007 ]/A << /S /GoTo /D (subsubsection.4.4.1) >> >>
endobj
304 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [ 116.232 556.767 232.157 567.835 ]/A << /S /GoTo /D (subsubsection.4.4.2) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [ 116.232 498.984 232.157 510.052 ]/A << /S /GoTo /D (subsubsection.4.4.2) >> >>
endobj
305 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [ 93.318 544.812 362.538 555.771 ]/A << /S /GoTo /D (subsection.4.5) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [ 93.318 487.029 362.538 497.987 ]/A << /S /GoTo /D (subsection.4.5) >> >>
endobj
306 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [ 93.318 534.69 169.492 543.816 ]/A << /S /GoTo /D (subsection.4.6) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [ 93.318 476.906 169.492 486.032 ]/A << /S /GoTo /D (subsection.4.6) >> >>
endobj
307 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [ 78.374 511.058 143.002 521.898 ]/A << /S /GoTo /D (section.5) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [ 78.374 453.275 143.002 464.114 ]/A << /S /GoTo /D (section.5) >> >>
endobj
308 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [ 93.318 498.984 223.799 509.982 ]/A << /S /GoTo /D (subsection.5.1) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [ 93.318 441.2 223.799 452.199 ]/A << /S /GoTo /D (subsection.5.1) >> >>
endobj
309 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [ 93.318 487.029 277.208 497.987 ]/A << /S /GoTo /D (subsection.5.2) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [ 93.318 429.245 277.208 440.204 ]/A << /S /GoTo /D (subsection.5.2) >> >>
endobj
310 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [ 93.318 475.073 214.513 486.032 ]/A << /S /GoTo /D (subsection.5.3) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [ 93.318 417.29 214.513 428.249 ]/A << /S /GoTo /D (subsection.5.3) >> >>
endobj
311 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [ 93.318 463.118 261.178 474.117 ]/A << /S /GoTo /D (subsection.5.4) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [ 93.318 405.335 261.178 416.334 ]/A << /S /GoTo /D (subsection.5.4) >> >>
endobj
312 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [ 78.374 441.26 219.843 452.159 ]/A << /S /GoTo /D (section.6) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [ 78.374 383.477 219.843 394.376 ]/A << /S /GoTo /D (section.6) >> >>
endobj
313 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [ 93.318 429.255 259.525 440.204 ]/A << /S /GoTo /D (subsection.6.1) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [ 93.318 371.472 259.525 382.421 ]/A << /S /GoTo /D (subsection.6.1) >> >>
endobj
314 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [ 93.318 416.852 364.391 428.807 ]/A << /S /GoTo /D (subsection.6.2) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [ 93.318 359.068 364.391 371.024 ]/A << /S /GoTo /D (subsection.6.2) >> >>
endobj
318 0 obj
<< /D [ 316 0 R /XYZ 78.37 808.885 null ] >>
@@ -1518,39 +1526,46 @@ endobj
<< /Type /Font /Subtype /CIDFontType0 /BaseFont /PRHOTU+LMMono9-Regular /FontDescriptor 354 0 R /W 353 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >>
endobj
359 0 obj
-[ 28 [ 613 ] 35 [ 580 ] 47 [ 624 ] 50 [ 558 ] 55 [ 536 ] 72 [ 513 ] 77 [ 613 ] 81 [ 636 553 ] 84 [ 558 ] 96 [ 602 ] 104 [ 786 ] 116 [ 613 ] ]
+[ 28 [ 613 ] 35 [ 580 ] 47 [ 624 ] 50 [ 558 ] 55 [ 536 ] 72 [ 513 ] 77 [ 613 ] 81 [ 636 553 ] 84 [ 558 ] 96 [ 602 ] 98 [ 458 ] 104 [ 786 ] 112 [ 613 ] 116 [ 613 ] ]
endobj
361 0 obj
<< /Filter /FlateDecode /Length 23 >>
stream
-xÚc``à`Td`hÉ`hhà
+xÚc``à`Td`hÉ`XÐÐ
+ÚÏ
endstream
endobj
362 0 obj
-<< /Subtype /CIDFontType0C /Filter /FlateDecode /Length 1791 >>
-stream
-xÚ}UP×ßånw“pIî`w%–‰E8$¡©-FA0ˆ¨ I£9¹.œw°wx`øsáÏ•ãÝ- 9PádQÄ`Ú@-¶ÕÉí4!E)µq¦M3êLÓ í˜÷Ì£îm'i¦ow¾Ýyó}ï÷ý¾ï÷Þ# ¥’ I2ngVnNÞóvØm™Æ
-Ǧ”¤si•Õ(„²Ñ:T,Š%P‰Ø0Ä)¯Ä *ŸJ¹ØŒ/ÆR9GÅy~MÈN?W©âå?æSÕúÐÄoTß"ÂÃ’ˆ#≒&5ä“$K&ü?èÔä””g3í5‚¥´Ìɧ¦¤<³1d7óÛ“ù]Æ’r»ËQná6¿+™ßÌçÛ]ò¬…ÚnãšËŒÖC¼ý_d~‰¯r˜_*Ø«*’ù¢2‹ƒwÙ…r^þ
-f«Ùè0›ø*›É,ðÎ23¿ó…E|¶Ýæäó,%f›ÃÌ'%ñ¼Ãlæ˜Ίï ΪÒd»Pj8$û8 Öe'‡!—”½'¿()/73+¿0+ÙYíäÙÞdv-VGò7ýÊd¾]8l´f˜ì͹&³ÍiqÖòˆ%ž" D*ñ‘Cì&öDñQF8rQå¡&Ô¡ò*‰z’ûÉÛa™a¢"FQª˜TÆ*¯Q)Ô|KÁ-¼ë"Ç`
-̇裉)lì¸PÏámèEª¿ÅÓéÖ×y[ê=N[Üä®8º?Ïû¤Àøƒ#¾ þ“VJbŒþÖ±Ÿèº€ì Kè`!Õåêµ´èì¥à(+0EjìoÛ‡À}Z¼‡þ l¡Ôè6àAX*‘0âwÐó'†¬öî>ÛÃþ¾ïÚäuÝYS˜dñ˜@Ow´äiæ §%‡àU*fnÌpë¡_[Z¹ý)+a:=Þ!^`ÿJßëÛâà°_»ÿõ)ìºÌ#ŽsðEømfîÌV#§~¤Ò/%+㮺 ¯}¢@3°S Ùõp ^ÿMhc \÷†Ã8î»1›kGÊÙª7^+6èŸ_^©™%äÛôüÅÕ¸ =hLЩÑU™_µMRôÅY0;3 -µJšûn™è>­@ãÈ£ŽWðZ=&VrÜ=ÃÜ:îÊá$øŠ@ç4¸2Ø,¸y™Ö­ùÇË0ÙÃIt5ÜB-îýw¦Š•LÑ«Œ†p«Ñ[2²-ô.!ÃÒÒÚ9Íç¨~¦]ŠÌþz¤\O® õRs[-¸ÌÁôiæVÏ‘Üå\rÝG2ؘ¹œËg4 )ÇÊnNº„Vjn¢ÃK¼¾ßôf*æõy+åa˜Ë}à¬Ä`@3‡"%0_-120²W–z`
-wÿŒ{âÂ/Þ91é —¯`mô†âû½&Aw´©¡¹‰M_·j©Æã £]w"Ð}Ê'ユª0ùü‡e_ïj1å ‹ 0ƒ ”fÐf~Ý’ë —]éœoXþ’·- +Úåw÷èNtõôÙщs???Wãçžh÷ˆž&]³§Æî]n>54ÞæåÔ¡›;
-éU òýK¤…îâ¿GWQO
+<< /Subtype /CIDFontType0C /Filter /FlateDecode /Length 2095 >>
+stream
+xÚ}V P×ßãØ]Ð ë‘x »+±N
+H¢©­& ‚`£ ’ŠÜ ÈÉ÷Á‡|rwÞÝ»;x² b ‰P‹­ÒÔèLý(J¨Ó6©Ì¨¦1oÍ£îm'i¦owþ»óæÿ¿ßÿë½'ÁÂÃ1‰DŸ™•¹3ocbî–íÚýÊÊ ¥Î°*eåvu©I£Ô‡²„%B1B&ÄK&L`¥Ž–ɤ#²ð :‡öÍ]<Ã$g†ä'ÏÁHY‚ø¹B¶44qMö," “`ñXöXBH(Éb #Yöÿ S“RR^ÍÐêêôå¥eF.5%å•!¹–ÛÄmV–Thk 圲RÅmNâ¶$qyÚq¶œ{I[É«Ë”š½œv/W ~›3ÔzWª×št†åI\AY¹«Ñê+8ñ«WkÔJƒZÅ™*Uj=g,Ss›väpYÚJ#—[^¢®4¨¹•+9ΠVseF£îGÉÉFSi’V_š¼WÔ1$kæ” É!»•Y[ó
+Vææddæåg&kÜ^­žS©Êr!é{ýÖdžV¿_©IWi‹Õ9*u¥±ÜX‡‰#{KÆR±×°ll ¶ ÛŽ`{°b¬ ÓaF©XqDcÑ¡‡cM”Iî„e„y¤±ÒRéXx\øe¼ƒ&r |/Jx
+×óð~d¦À<¸[*|Ë“ù‡¼ÃM,JÞ»­6Ÿ™ntX›l,Z=³Ê¬;P”ëX¬'ÝÁWþÜŽó¤Òmú©¢ ¸‡î1°„æãm5åV…¶`ôä>tÖáìeÑn¸SŽ¶…V<J¸xX„¥¼Îû-´ýQ*ôAF~ãÍK¯¶3Ÿt]»¢¸–yI4¤'&¼Öbv† ‹mÖlF/‘P:ys’]
+ÝòÒª /2(®#F¼žaæoă®õ¶¹åEû6¥0ˉ2›g„…oÁ—É»ýo(Ù¨§á€ÿ/ĉ¸‘·àåÏ¥Â$ôÉ!³.DK¿mˆ„KžÀÏþ0vmƒ²º‚1Õï)L¦_Ÿ[Zˆ"g‘ïÓç~R`ƒÚ r™"J¸$úWËCsn
+LMNxHðvžzhÝ)×hÁûh°g·L’·;j²Y¾«'²›kÒ™L¸vέÇõ!#úʤå‰Z¸ŸÙöo¦ÒgL…]$…™£„÷DäÊÐ;‹ Wð_ó‹îR_ ø…|Ö2ë»–b<=pa(—Ôôp‘…ë&ÈÛíÕ9s\rÌÕéL6̘ãòÃ*P¸Ÿü€žyHÝöÏúõã–ƒ©ˆ£sŸ…‡$/vß3<‰D
+ª¹.1LÿN,!áþM¹ø›ÌÎC‡™<K©ÓB×êl·²-ÝÖSM×[†Ž§ DL»:öÅdê ´€A–ÿ!óÄóõ©l¸Oò}NÍ { »ù îŒ†©;6Ò0F_ïºÚâ\x]®²e Xæ˜Eðn¿ßËxŽôƒcôí»vNäYÔÈ;yÆÃÁNþKÞŒ‡õãÚqŠ5 ‰0A~M5
+˜½Ö{ÖôT{ËÚ¬îˆÂžú³§çG.L@ꊬhe,n`m§;÷8 ãÈnÐvÐêtš›í`ÃakÄê]ÅtJΦõùgöu4³§÷÷þKõ¯›üŽ“ÕT0Í{¸_·[Q¨Ú‘Uµ£uxS4l¿àìhs¶¸ìt°Ô±T:†h’2cõ Åïs¹‚]Œ8åõú»Z}”9­jàWÆô—WïüAÜŸúÁ €%ð«{°·Kú´Jx[ìZþç‰ZdÂy® ôôÁUôñàð³A;h6*fzC%“À”hÏècpž>ÿw`eKÈ„Ù:ë%O‚Ž ‡qûÀq¦œ¨Bëbøžú«;/6ÃD©0=ÛnŽj³šÖi]nØoÃö#Õµ
+³½ÅffPz€^†3xË1ànUô£b['Øñªâ9åK>˾
+
+íÈ´û‚³¹@“,‹²ùü¼{óƒ—Ëåvq{Çý2ïë9ÑîñxZ[=Ù‚æ!D
endstream
endobj
360 0 obj
-<< /Type /FontDescriptor /FontName /GEIHLW+LMRomanCaps10-Regular /Flags 4 /FontBBox [ -496 -290 1501 1100 ] /Ascent 1100 /CapHeight 683 /Descent -290 /ItalicAngle 0 /StemV 106 /XHeight 514 /FontFile3 362 0 R /CIDSet 361 0 R >>
+<< /Type /FontDescriptor /FontName /EFEVND+LMRomanCaps10-Regular /Flags 4 /FontBBox [ -496 -290 1501 1100 ] /Ascent 1100 /CapHeight 683 /Descent -290 /ItalicAngle 0 /StemV 106 /XHeight 514 /FontFile3 362 0 R /CIDSet 361 0 R >>
endobj
363 0 obj
-<< /Filter /FlateDecode /Length 429 >>
+<< /Filter /FlateDecode /Length 437 >>
stream
-xÚ’Ûjã0†ïõ³ôµlçPJ0ld×ÐIØÝ[Gš¤‚X2²}‘·_I·PJ¨ÁÆŸçŸÓo~¼n£ŸÒì1Ên9l°5½OUÃF£¥}º{F”(‡h{¯Öˆ-v0.Êe©UwãÄ¥§^â úZô€G¥?$¾Œwø/úµ*?þŸ6¦®tQ5m£ ûSe#îSwª;¹”o¨ÁIàšBÁ?h[eô=$·œs÷a¥eaj¿pËâËÐk”–ö29ìý,IA*Ñ](<EíœóÉÛsÛa]êƒa‹Ä®³j;{óß°øÅJ´Ja|mP'ÜöMsB?p–ç ñàê;ßž«!ön”ÒEUw¾jËGâîÜ ¤]‰mS ´•>"[8;x‹µ»r†Z~ŠsÊÚ`xM²!$Þ*ë %…+Äù,É=¥QJ´&šÊR¢)ÑœhhrGT-‰V¦ ÑšˆªdÔo: 4çfœˆºÏ¨æ”ºÏ/Ê»œö óûÕýÿ|·[ôÖ:¯ÃO^z•Æ÷sјÆg…;¨á¬{zY³ÿ¯Ÿ
+xÚ“_k«0Æïó)²‹BwáŒZëE8ÇV¶n´eìÖ&o{5‘¨ýö'É«ŒQ&(þÌóþ{gwoûàÐG’FwÐéÁpŠ—º%³ÙZó¡Õoˆiµ{¢oFó=ôt^TëJÉþÞŠ+Å/ƒ€Iõ³è/œ¥ú’¸:t~€`SnÞ·ëàùe§›ZuÛE,ØÁy¸Ô&`.ô û‹ ù…šZ ½%¡>á;˜NjõD£Ƙý°Q¢Ð¸#áØ4 §1NR 3vNnÅTHÞ䟼±Î¹àýµë¡©ÔI“ÕŠ†¶²ìzsõýß“ðÕ0RéüV£V¸Úö®)ÊHžS'›ßú¶­ ¡s£vUö×›¶|®-ÐØs„­s- kk¦Vg +kË骴WN@‰oë £Ž'D+˜^£tZâÿjãE…MÄØ2ÊÅ RŒT"-<%1RŠ”!-=-‘
+¤5ÒÆS!•H˜%ÁzéÂSÆ<-V_¢2K°BŠ½d£«gc–Çgõ³9[Ü^nŒ±ûà„÷Ù9,|ž™V·.Êßþ°Mÿ£×’üùè U
endstream
endobj
186 0 obj
-<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /GEIHLW+LMRomanCaps10-Regular /DescendantFonts [ 364 0 R ] /ToUnicode 363 0 R >>
+<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /EFEVND+LMRomanCaps10-Regular /DescendantFonts [ 364 0 R ] /ToUnicode 363 0 R >>
endobj
364 0 obj
-<< /Type /Font /Subtype /CIDFontType0 /BaseFont /GEIHLW+LMRomanCaps10-Regular /FontDescriptor 360 0 R /W 359 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >>
+<< /Type /Font /Subtype /CIDFontType0 /BaseFont /EFEVND+LMRomanCaps10-Regular /FontDescriptor 360 0 R /W 359 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >>
endobj
365 0 obj
[ 28 [ 559 ] 34 [ 818 ] 36 [ 575 ] 38 [ 575 575 ] 42 [ 831 511 ] 47 [ 639 ] 49 [ 756 527 575 ] 54 [ 724 351 575 575 ] 59 [ 575 ] 63 [ 639 383 436 319 ] 71 [ 692 319 ] 75 [ 958 900 639 ] 81 [ 575 575 786 639 ] 88 [ 319 ] 91 [ 607 ] 95 [ 863 474 ] 98 [ 454 ] 100 [ 575 575 ] 104 [ 800 447 575 575 885 639 ] 112 [ 607 ] 114 [ 831 869 607 ] 118 [ 607 ] 168 [ 559 ] 251 [ 527 ] 319 [ 639 639 ] 499 [ 571 571 ] 502 [ 319 ] ]
@@ -2421,47 +2436,46 @@ endobj
<< /Type /Font /Subtype /CIDFontType0 /BaseFont /CKBVSC+LMMono12-Regular /FontDescriptor 476 0 R /W 475 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >>
endobj
481 0 obj
-[ 28 [ 490 ] 54 [ 639 ] 57 [ 490 ] 59 [ 490 ] 66 [ 272 ] 72 [ 272 ] 77 [ 544 ] 83 [ 666 ] 88 [ 272 ] 96 [ 381 ] 105 [ 381 490 490 ] 112 [ 517 ] 118 [ 517 ] 121 [ 490 ] 187 [ 489 ] ]
+[ 28 [ 490 ] 54 [ 639 ] 59 [ 490 ] 66 [ 272 ] 72 [ 272 ] 77 [ 544 ] 82 [ 490 666 ] 88 [ 272 ] 96 [ 381 ] 105 [ 381 490 490 ] 112 [ 517 ] 118 [ 517 ] 121 [ 490 ] 187 [ 489 ] ]
endobj
483 0 obj
<< /Filter /FlateDecode /Length 27 >>
stream
-xÚc``à```
-Phhh(hr`€
+xÚc``à```Ph1hh(hr`€
endstream
endobj
484 0 obj
-<< /Subtype /CIDFontType0C /Filter /FlateDecode /Length 2381 >>
-stream
-xÚuV TWž’I©Í˜¶fìÌصnÕòP«ÖÚ¥Hcki}€„ ä HJB—Ã#$„<û°b·¥TmkÅÅêq«¥ÒC{<ÝîÞÑáìîD÷¸=g»÷̹3çŸÿ~ßÿÿûï¹<$4áñx3ekdë7oX¸1Y•“J/\‘,Wè²SÕÁŸë˜ÙÌó Œ`f!Ìs<†aH>C…²qaüÃB'_e»f ÔXÁsÂkz28_x
-n
-{žûz‚ ›4|ö"
-AxÈL„@~BþÉCyÓxbžôÿÑ.ŠŒŽ~9N•[ ÎT(µÔ¢èèÅ/çåTl$•º;KeÐdeR©t:•ImŒ¤’TΚI½¨¢©4¹25;ƒReP2ù6J§‘«5”B­ÒåjæER2e¦†2¨ÔY÷V˳å©y:¥£ÓåjJ«”Sñ[·È¨u*ZK%fî–Ó9AQ¹œRjµ¹¯FEiuŠH•Z•Áùh¢²9i¢‚ë"Ö½‘$‹HÜ·6iËÚHm¾–ÊP©©t¹653[ù?›|lHR©sR³W§«ÒäÒå´6S[€pc²YŽ¬@b‘õÈFd ² Ù…d"{,$Ñ#ÈI>—Pnˆq0µ¡HÂò6…Ä„4†Œò·ó‡ù?†îíÈ„‹…Ñu¢)ì¿ÂËïéá~gûëñ‘¯`Úðˆkeè;’sº-h²Æb”ƒ3ŒC@ßÎcD§r‡c'¾<qkí4¶yš›=Ç ˆ|¿ídK~â‚|!¹e·WÄ,[)ÅV½öƒúÓ/>ê;é$0ÿ»Õ‡à®AÇu’]vZ2/vÏ®”´ž“ðY¸²¡ÇF„—ƒ
-ɶ£;L  Q›ÿ$àõƒÀz„ÄžÝÂÜ“thœ•^—›çÖy;œñú¾€ƒCÞvVq°¯ƒÈûŠ]fÉ ì%{i
-9éú/l?§†ŽSÀê'Ã_äêÛz€ ÃÝÃئ…Ãx[ :*I˜ˆÞ~m'qŒ~÷@&>_þŠÁBVþ"Ä&ü™õ<Föp…
-ƒeðO(|â£÷ÈȧS+d—, ÛIz\—V°ëa1&xßMðab¿Ä§u©iƒVÓžßæs»üD8ÛÈEs±¯%˜¿ •vŽb3àßLÒ‘ëßµ”ŽÊßGTB¾ °ÒßK€ÿ,—ZßW•b¥!–k­çºm!:Ñ7vÍn•Õ„¥|ï¾\)Ýfjjm=ä ršÝŒ4
-GátÉy £SÓãÁÝfvÁÙv6WL©VF(DWˆ (vå{XÈò¿Ñžêúìk"\ï»óSŠ®ðÀic`Lã_‹¿Û1vê.&@Œ‘ü°úëÍÄwíç®üE:º|pþW'žj÷aK£ËÓØÑ©qèöYAeq©wœk®á¢yù[è]dÎÎÌŠÜJvÙ•S!(¬,¯,‘šk@ qBx«wíö™xeÊ;ËÛ¾ IŒB:Ë-=RìŒ) oUiòŒòEwb!ŸÀ(
-N½=v;X¾‚Æ¡ î¿vŒï¾‰•2‰ð5‰NXQh‘™÷ŠJJ“AÎnúÚ>ýÜëaàK:wúg)D£¯±"Vÿâ’m‚ý.oc§?ß©*y´sàÄ0~ëôš¨¥)«“_'Ù¬^ axh8+®×3Ñ^ £å3eÌ\I
-Páóƒ íeÙ‡H8o2dçl`-·ÌÌ)Ì•ïÀ³ó[
-76YIZ Õ{ozµõ:‡Æ>Ó†zìnG[½¨£ñB³OÚ`iÜk4-&B™—©RhDØ®ÇàYi}y³¾ Ôh$°é2Çæ­R…'Ó¯ôŠì&£ÃˆïµZË›JÈ3ym&·Ñc™iE5Qkåm*Ì•Û‹š‡½žèöñ÷pÒrm5n–IMÕ…®–Z‡ƒƒ=köhŽ¨ºóD–z‡Ñ7ÙÈðàµn:ƒ‡Íå.gÈ
-nš&Ö»˜¸F¨ª³»„D‚,;*ì 650exª³ÊVSUu ºÊÖ×æö9ljöÛlժæ1ï͸ÿŒäßU׌
+<< /Subtype /CIDFontType0C /Filter /FlateDecode /Length 2377 >>
+stream
+xÚuV TWž’I+¥6cl±3ck»UËC­ZkWTZŠT[˶*JH0<IIx‡K‰€áò !‚ˆµµb}â¶H•¶V\Z=nµº´ÇÓíîÎîN´§Ûs¶{Ïœ;sîü÷ûþûýß½ç
+ÐPD ÌÚüzÒšÄ ×'«³Ó˜…‹"’å
+½*Mü¹ŽÃ>ÂHv6Â>)`É–²t(&|?,tê%®{¶Hs=‰ ‚æGƒýùÇà†°§ø¯‡ÆÃæ>
+{‘„ dB"? ÿ ‚GRþÿhEFG¿§ÎÉ×d*”:zQtôâçƒýr:6’NHÛ™¥6j³2é4&Nˆ¤×GÒIj#?šI?§fèreš*ƒVgÐ)ò-´^+×hi…F­ÏÑ΋¤S”™ZÚ¨ÖdÑü[#WÉÓ´òtZϤË5´N)§ã7oJ¡×©˜¹SÎhåtDMkårZ©Óå¼¥Ó+"ÕET£R=ÒFçE¬{=)%"ñÕ¸µI›ÖFêòtt†ZC§Ëui™*mäÿ,ò×$µ&;Mµ:]½CþjºœÑeêò¾ÍF–"+Xäd=’ŒlB¶ Û‘Ld’…ä $9.ä囑¥ EªNð}ÈÚ2¡D¸^8  M
+m­?-þ]ŠÞãþ^x×
+rH&/Ûb ƒ;žVp¤ÅOœõ.2ßÏê(ˆL=,ÛóvÔ‚ØsvÛá>épïŸס¼@…O¡ ÀJL?D'¥7'c†°vX63€&TÔ¦ØP;ÇÍ6‹ô¾²TŠkG·šAÉ ¶Žã @4 ëA
+{b{GÖ©ujÕ}N®[ïëtz½ä}è»"Z
+CØ!XÍþV> î"(6ÂQAØKöÒTjÊõ_ؾp'€µƒ
+Ž/|w`è>
+¸ë®`ÒßÐf/¡Y÷éòƒ´ž¶V„Íå„°]Tæ
+ÔÄüà„A{¹j?çM…l›¬%³² rä[ U^+ @OMîÍÛŸObM #?”qêì‘!W³+EýV;‰p`¸k…öQ!ïˆË²ëå_+FÉë;âÜ©ÄÆ5Ì‹”:ѲžCðùu±½kȘÃ#Ú“Ä7'N¨Þ+¶ñ˜FÙ+ ÆÌŸ !y‰yJ"+¡
+ò(óŸÁègø5ðeóyòbËGŽ}ƒº%Nj2x9ç"ÏØX£ªO(ÜØtv\$k3ÖìÞG¾áÓ5èZû,êµ»žIgÓù?ÞXÒ´Ûd2•˜Ien¦Z¡•`ÛO;Ïà -†üR“‰Ä¦§86nÆÞÌ¥Ob7›&bwIa‘±­¢¹˜:•ë1»MÞ’YVT[¢7éÌ’ì 9x‘½°ÙápØÈßÁŽ^ÞZ®Í¦)¸¹¦ÀÕZçpð°gLƒ§ñ^íAuO®¤¤ÁarÍö¦F*<x›ÎaÏò—1dEðb6%5¸Ø¸&¨®·»ÄdBŠ**ì!6-ððð4gµ­¶ºzoMµ­¿),ÌíwØöÖî±ÙjöÖ„=¾;ãîã²ÿ
endstream
endobj
482 0 obj
-<< /Type /FontDescriptor /FontName /TDTHQI+LMRoman12-Regular /Flags 4 /FontBBox [ -422 -280 1394 1127 ] /Ascent 1127 /CapHeight 683 /Descent -280 /ItalicAngle 0 /StemV 91 /XHeight 431 /FontFile3 484 0 R /CIDSet 483 0 R >>
+<< /Type /FontDescriptor /FontName /UONDLP+LMRoman12-Regular /Flags 4 /FontBBox [ -422 -280 1394 1127 ] /Ascent 1127 /CapHeight 683 /Descent -280 /ItalicAngle 0 /StemV 91 /XHeight 431 /FontFile3 484 0 R /CIDSet 483 0 R >>
endobj
485 0 obj
<< /Filter /FlateDecode /Length 449 >>
stream
-xÚ…“Mo£0†ïþÞC¤ö@1ⶊÒj‘¶› j¯Äžd-8ä߯íVZm´H æ™×c³øö¾‹¥ÙC”Ý0º…ÞŒV@T¾4Y,6FŒ-èá@‚œ£ý}·Fì` Weµ©´®¸Òâ4J˜Uÿ­á¨ô—Ä÷¡W5üŠêMýýgýxÙš¶ÑImá8ž1ŸV«áääÿQR¦—Â4ú
-t›ºeH¨L1–³@<EÂ~ûåØ=CÂî*ù”‡>9ºæè…O®±ßÚç¥i œCX·™ßÿÏ-£µnÂ! {৯4|ž£Ît>+Üá
+xÚ…“Án£0†ï<Åì!Rz HB[EH i%¤6‰’ìj¯Äžd-8äí×ö„Vª ÄÇü3þ=cF¿6»ðYè†é=ƒ-¶º7Ãâ½j‚Ñh©y_£êVˆÅmŸ`c4ßaã¢\–JvwV\*~îªïE <Iõ)qëÀxÃßëÕòm¾½ou]©8 ·xêÏ• ™KÛËîlå?(Á†áV|¡?hZ©ÕÄ÷Œ1ûáE‰B×n“m]B4X?J%ÌÕ-œ÷ N@HÞ]É?ym»å’w—¶ÃºTGÌçÙ•eÛ™‹÷}Dk#ÐHu‚ñ-“V´ë›æŒÎ° ÏAàÑÖ¶}ZU5Bä:P
+•Ýåf+>“ö—!ñ“e®¶MÅÑTê„Áܶå0µW _⌲GB+^ãlñ•q…âÂblçŽÒ™§ÉŒhA±ÌÓ$!z$z *ˆ–D/ž¦¤L©æ4õ4eD”—rÆ<e Ñ#ф虪¤Dä%%evÍ#Ÿ¹ÎÈYFURZoáò’$Îrêƒß·k™›ÿLjxoŒ?$~®ûRáÇ9jtã²üíàð?8Z¿ÿs á
endstream
endobj
141 0 obj
-<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /TDTHQI+LMRoman12-Regular /DescendantFonts [ 486 0 R ] /ToUnicode 485 0 R >>
+<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /UONDLP+LMRoman12-Regular /DescendantFonts [ 486 0 R ] /ToUnicode 485 0 R >>
endobj
486 0 obj
-<< /Type /Font /Subtype /CIDFontType0 /BaseFont /TDTHQI+LMRoman12-Regular /FontDescriptor 482 0 R /W 481 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >>
+<< /Type /Font /Subtype /CIDFontType0 /BaseFont /UONDLP+LMRoman12-Regular /FontDescriptor 482 0 R /W 481 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >>
endobj
487 0 obj
[ 66 [ 223 ] 77 [ 484 ] 81 [ 470 ] 84 [ 484 ] 105 [ 340 ] ]
@@ -2707,7 +2721,7 @@ endobj
<< /Type /Pages /Parent 507 0 R /Count 10 /Kids [ 133 0 R 165 0 R 172 0 R 183 0 R 193 0 R 200 0 R 206 0 R 213 0 R 220 0 R 226 0 R ] >>
endobj
233 0 obj
-<< /Type /Pages /Parent 507 0 R /Count 10 /Kids [ 230 0 R 235 0 R 239 0 R 244 0 R 250 0 R 255 0 R 263 0 R 271 0 R 275 0 R 285 0 R ] >>
+<< /Type /Pages /Parent 507 0 R /Count 10 /Kids [ 230 0 R 235 0 R 239 0 R 244 0 R 250 0 R 255 0 R 263 0 R 271 0 R 275 0 R 282 0 R ] >>
endobj
319 0 obj
<< /Type /Pages /Parent 507 0 R /Count 1 /Kids [ 316 0 R ] >>
@@ -2815,7 +2829,7 @@ endobj
<< /Title 7 0 R /A 4 0 R /Parent 508 0 R /Next 10 0 R >>
endobj
509 0 obj
-<< /Names [ (Doc-Start) 138 0 R (page.1) 137 0 R (page.10) 228 0 R (page.11) 232 0 R (page.12) 237 0 R (page.13) 241 0 R (page.14) 246 0 R (page.15) 252 0 R (page.16) 257 0 R (page.17) 265 0 R (page.18) 273 0 R (page.19) 277 0 R (page.2) 167 0 R (page.20) 287 0 R (page.21) 318 0 R (page.3) 174 0 R (page.4) 185 0 R (page.5) 195 0 R (page.6) 202 0 R (page.7) 208 0 R (page.8) 215 0 R (page.9) 222 0 R (section.1) 5 0 R (section.2) 9 0 R (section.3) 25 0 R (section.4) 41 0 R (section.5) 101 0 R (section.6) 121 0 R (subsection.2.1) 13 0 R (subsection.2.2) 17 0 R (subsection.2.3) 21 0 R (subsection.3.1) 29 0 R ] /Limits [ (Doc-Start) (subsection.3.1) ] >>
+<< /Names [ (Doc-Start) 138 0 R (page.1) 137 0 R (page.10) 228 0 R (page.11) 232 0 R (page.12) 237 0 R (page.13) 241 0 R (page.14) 246 0 R (page.15) 252 0 R (page.16) 257 0 R (page.17) 265 0 R (page.18) 273 0 R (page.19) 277 0 R (page.2) 167 0 R (page.20) 284 0 R (page.21) 318 0 R (page.3) 174 0 R (page.4) 185 0 R (page.5) 195 0 R (page.6) 202 0 R (page.7) 208 0 R (page.8) 215 0 R (page.9) 222 0 R (section.1) 5 0 R (section.2) 9 0 R (section.3) 25 0 R (section.4) 41 0 R (section.5) 101 0 R (section.6) 121 0 R (subsection.2.1) 13 0 R (subsection.2.2) 17 0 R (subsection.2.3) 21 0 R (subsection.3.1) 29 0 R ] /Limits [ (Doc-Start) (subsection.3.1) ] >>
endobj
510 0 obj
<< /Names [ (subsection.3.2) 33 0 R (subsection.3.3) 37 0 R (subsection.4.1) 45 0 R (subsection.4.2) 49 0 R (subsection.4.3) 65 0 R (subsection.4.4) 81 0 R (subsection.4.5) 93 0 R (subsection.4.6) 97 0 R (subsection.5.1) 105 0 R (subsection.5.2) 109 0 R (subsection.5.3) 113 0 R (subsection.5.4) 117 0 R (subsection.6.1) 125 0 R (subsection.6.2) 129 0 R (subsubsection.4.2.1) 53 0 R (subsubsection.4.2.2) 57 0 R (subsubsection.4.2.3) 61 0 R (subsubsection.4.3.1) 69 0 R (subsubsection.4.3.2) 73 0 R (subsubsection.4.3.3) 77 0 R (subsubsection.4.4.1) 85 0 R (subsubsection.4.4.2) 89 0 R (table.caption.1) 198 0 R ] /Limits [ (subsection.3.2) (table.caption.1) ] >>
@@ -2830,527 +2844,527 @@ endobj
<< /Type /Catalog /Pages 507 0 R /Outlines 508 0 R /Names 512 0 R /PageMode/UseOutlines /OpenAction 132 0 R >>
endobj
514 0 obj
-<< /Author(\376\377\000F\000.\000\040\000P\000a\000n\000t\000i\000g\000n\000y)/Title(\376\377\000L\040\031\000e\000x\000t\000e\000n\000s\000i\000o\000n\000\040\000p\000i\000t\000o\000n)/Subject(\376\377\000U\000n\000e\000\040\000e\000x\000t\000e\000n\000s\000i\000o\000n\000\040\000L\000a\000T\000e\000X)/Creator(LaTeX with hyperref)/Keywords() /Producer (LuaTeX-1.16.0) /CreationDate (D:20230404180411+02'00') /ModDate (D:20230404180411+02'00') /Trapped /False /PTEX.FullBanner (This is LuaHBTeX, Version 1.16.0 (MiKTeX 23.1)) >>
+<< /Author(\376\377\000F\000.\000\040\000P\000a\000n\000t\000i\000g\000n\000y)/Title(\376\377\000L\040\031\000e\000x\000t\000e\000n\000s\000i\000o\000n\000\040\000p\000i\000t\000o\000n)/Subject(\376\377\000U\000n\000e\000\040\000e\000x\000t\000e\000n\000s\000i\000o\000n\000\040\000L\000a\000T\000e\000X)/Creator(LaTeX with hyperref)/Keywords() /Producer (LuaTeX-1.16.0) /CreationDate (D:20230411101241+02'00') /ModDate (D:20230411101241+02'00') /Trapped /False /PTEX.FullBanner (This is LuaHBTeX, Version 1.16.0 (MiKTeX 23.1)) >>
endobj
xref
0 515
0000000000 65535 f
-0000097843 00000 n
-0000097888 00000 n
-0000097908 00000 n
+0000098293 00000 n
+0000098338 00000 n
+0000098358 00000 n
0000000020 00000 n
-0000012032 00000 n
-0000296461 00000 n
+0000012036 00000 n
+0000297235 00000 n
0000000065 00000 n
0000000155 00000 n
-0000016827 00000 n
-0000296338 00000 n
+0000016831 00000 n
+0000297112 00000 n
0000000200 00000 n
0000000364 00000 n
-0000016887 00000 n
-0000296264 00000 n
+0000016891 00000 n
+0000297038 00000 n
0000000415 00000 n
0000000574 00000 n
-0000016948 00000 n
-0000296177 00000 n
+0000016952 00000 n
+0000296951 00000 n
0000000625 00000 n
0000001005 00000 n
-0000017009 00000 n
-0000296103 00000 n
+0000017013 00000 n
+0000296877 00000 n
0000001056 00000 n
0000001262 00000 n
-0000021872 00000 n
-0000295978 00000 n
+0000021876 00000 n
+0000296752 00000 n
0000001308 00000 n
0000001416 00000 n
-0000021933 00000 n
-0000295904 00000 n
+0000021937 00000 n
+0000296678 00000 n
0000001467 00000 n
0000001629 00000 n
-0000033461 00000 n
-0000295817 00000 n
+0000033462 00000 n
+0000296591 00000 n
0000001680 00000 n
0000001761 00000 n
-0000037481 00000 n
-0000295743 00000 n
+0000037482 00000 n
+0000296517 00000 n
0000001812 00000 n
0000002037 00000 n
-0000040725 00000 n
-0000295617 00000 n
+0000040726 00000 n
+0000296391 00000 n
0000002083 00000 n
0000002240 00000 n
-0000040786 00000 n
-0000295543 00000 n
+0000040787 00000 n
+0000296317 00000 n
0000002291 00000 n
0000002501 00000 n
-0000044856 00000 n
-0000295419 00000 n
+0000044857 00000 n
+0000296193 00000 n
0000002552 00000 n
0000002727 00000 n
-0000044917 00000 n
-0000295345 00000 n
+0000044918 00000 n
+0000296119 00000 n
0000002783 00000 n
0000002943 00000 n
-0000049381 00000 n
-0000295258 00000 n
+0000049382 00000 n
+0000296032 00000 n
0000002999 00000 n
0000003152 00000 n
-0000049442 00000 n
-0000295184 00000 n
+0000049443 00000 n
+0000295958 00000 n
0000003208 00000 n
0000003391 00000 n
-0000053332 00000 n
-0000295060 00000 n
+0000053333 00000 n
+0000295834 00000 n
0000003442 00000 n
0000003652 00000 n
-0000053393 00000 n
-0000294986 00000 n
+0000053394 00000 n
+0000295760 00000 n
0000003708 00000 n
0000004002 00000 n
-0000057029 00000 n
-0000294899 00000 n
+0000057118 00000 n
+0000295673 00000 n
0000004058 00000 n
0000004421 00000 n
-0000057090 00000 n
-0000294825 00000 n
+0000057179 00000 n
+0000295599 00000 n
0000004477 00000 n
0000004860 00000 n
-0000061535 00000 n
-0000294701 00000 n
+0000061162 00000 n
+0000295475 00000 n
0000004911 00000 n
0000005109 00000 n
-0000061596 00000 n
-0000294627 00000 n
+0000061223 00000 n
+0000295401 00000 n
0000005165 00000 n
0000005284 00000 n
-0000061657 00000 n
-0000294553 00000 n
+0000061284 00000 n
+0000295327 00000 n
0000005340 00000 n
0000005464 00000 n
-0000066493 00000 n
-0000294466 00000 n
+0000066320 00000 n
+0000295240 00000 n
0000005515 00000 n
0000005840 00000 n
-0000066554 00000 n
-0000294392 00000 n
+0000070233 00000 n
+0000295166 00000 n
0000005891 00000 n
0000005974 00000 n
-0000070045 00000 n
-0000294261 00000 n
+0000070294 00000 n
+0000295035 00000 n
0000006021 00000 n
0000006090 00000 n
-0000070107 00000 n
-0000294182 00000 n
+0000070356 00000 n
+0000294956 00000 n
0000006142 00000 n
0000006295 00000 n
-0000070169 00000 n
-0000294089 00000 n
+0000070418 00000 n
+0000294863 00000 n
0000006347 00000 n
0000006545 00000 n
-0000074343 00000 n
-0000293996 00000 n
+0000074605 00000 n
+0000294770 00000 n
0000006597 00000 n
0000006750 00000 n
-0000081880 00000 n
-0000293917 00000 n
+0000082142 00000 n
+0000294691 00000 n
0000006802 00000 n
0000007009 00000 n
-0000084981 00000 n
-0000293799 00000 n
+0000085243 00000 n
+0000294573 00000 n
0000007056 00000 n
0000007216 00000 n
-0000085043 00000 n
-0000293720 00000 n
+0000085305 00000 n
+0000294494 00000 n
0000007268 00000 n
0000007466 00000 n
-0000085105 00000 n
-0000293641 00000 n
+0000085367 00000 n
+0000294415 00000 n
0000007518 00000 n
0000007843 00000 n
-0000011551 00000 n
-0000011717 00000 n
-0000012092 00000 n
+0000011555 00000 n
+0000011721 00000 n
+0000012096 00000 n
0000007895 00000 n
-0000011908 00000 n
-0000011970 00000 n
-0000260846 00000 n
-0000257555 00000 n
-0000255451 00000 n
-0000251528 00000 n
-0000248194 00000 n
-0000245763 00000 n
-0000240642 00000 n
-0000238541 00000 n
-0000231659 00000 n
-0000221018 00000 n
-0000217668 00000 n
-0000214577 00000 n
-0000204575 00000 n
-0000201239 00000 n
-0000292676 00000 n
-0000292532 00000 n
-0000195578 00000 n
-0000193684 00000 n
-0000184867 00000 n
-0000181639 00000 n
-0000177887 00000 n
-0000293102 00000 n
-0000011688 00000 n
-0000016448 00000 n
-0000016607 00000 n
-0000017070 00000 n
-0000016274 00000 n
-0000012476 00000 n
-0000016765 00000 n
-0000016411 00000 n
-0000026733 00000 n
-0000026892 00000 n
-0000021994 00000 n
-0000021689 00000 n
-0000017285 00000 n
-0000021810 00000 n
-0000170673 00000 n
-0000164410 00000 n
-0000161610 00000 n
-0000027051 00000 n
-0000027209 00000 n
-0000027368 00000 n
-0000027529 00000 n
-0000027753 00000 n
-0000026527 00000 n
-0000022274 00000 n
-0000027691 00000 n
-0000154213 00000 n
-0000150941 00000 n
-0000026664 00000 n
-0000032902 00000 n
-0000033061 00000 n
-0000033220 00000 n
-0000033521 00000 n
-0000032720 00000 n
-0000028033 00000 n
-0000033399 00000 n
-0000143048 00000 n
-0000032857 00000 n
-0000037419 00000 n
-0000037542 00000 n
-0000037236 00000 n
-0000033840 00000 n
-0000037357 00000 n
-0000040345 00000 n
-0000040504 00000 n
-0000040847 00000 n
-0000040171 00000 n
-0000037731 00000 n
-0000040663 00000 n
-0000040308 00000 n
-0000044476 00000 n
-0000044635 00000 n
-0000044978 00000 n
-0000044302 00000 n
-0000041062 00000 n
-0000044794 00000 n
-0000044439 00000 n
-0000049001 00000 n
-0000049160 00000 n
-0000049503 00000 n
-0000048827 00000 n
-0000045167 00000 n
-0000049319 00000 n
-0000292818 00000 n
-0000048964 00000 n
-0000053454 00000 n
-0000053149 00000 n
-0000049783 00000 n
-0000053270 00000 n
-0000057151 00000 n
-0000056846 00000 n
-0000053708 00000 n
-0000056967 00000 n
-0000293254 00000 n
-0000061718 00000 n
-0000061352 00000 n
-0000057379 00000 n
-0000061473 00000 n
-0000066615 00000 n
-0000066310 00000 n
-0000061972 00000 n
-0000066431 00000 n
-0000292959 00000 n
-0000070231 00000 n
-0000069862 00000 n
-0000066843 00000 n
-0000069983 00000 n
-0000073963 00000 n
-0000074122 00000 n
-0000074405 00000 n
-0000073789 00000 n
-0000070433 00000 n
-0000074281 00000 n
-0000073926 00000 n
-0000077766 00000 n
-0000077583 00000 n
-0000074607 00000 n
-0000077704 00000 n
-0000139695 00000 n
-0000081324 00000 n
-0000081482 00000 n
-0000081640 00000 n
-0000081942 00000 n
-0000081142 00000 n
-0000077994 00000 n
-0000081818 00000 n
-0000137629 00000 n
-0000125468 00000 n
-0000110741 00000 n
-0000081279 00000 n
-0000085167 00000 n
-0000084798 00000 n
-0000082235 00000 n
-0000084919 00000 n
-0000087920 00000 n
-0000087737 00000 n
-0000085369 00000 n
-0000087858 00000 n
-0000090502 00000 n
-0000090654 00000 n
-0000090805 00000 n
-0000090962 00000 n
-0000091120 00000 n
-0000093359 00000 n
-0000091340 00000 n
-0000090304 00000 n
-0000088083 00000 n
-0000091278 00000 n
-0000090441 00000 n
-0000093512 00000 n
-0000093670 00000 n
-0000093828 00000 n
-0000093985 00000 n
-0000094138 00000 n
-0000094296 00000 n
-0000094453 00000 n
-0000094617 00000 n
-0000094780 00000 n
-0000094943 00000 n
-0000095099 00000 n
-0000095262 00000 n
-0000095426 00000 n
-0000095590 00000 n
-0000095748 00000 n
-0000095912 00000 n
-0000096076 00000 n
-0000096234 00000 n
-0000096391 00000 n
-0000096544 00000 n
-0000096702 00000 n
-0000096860 00000 n
-0000097018 00000 n
-0000097176 00000 n
-0000097328 00000 n
-0000097486 00000 n
-0000097706 00000 n
-0000092985 00000 n
-0000091568 00000 n
-0000097644 00000 n
-0000293406 00000 n
-0000093122 00000 n
-0000097961 00000 n
-0000109943 00000 n
-0000098188 00000 n
-0000098290 00000 n
-0000110182 00000 n
-0000110903 00000 n
-0000111134 00000 n
-0000124643 00000 n
-0000111456 00000 n
-0000111562 00000 n
-0000124874 00000 n
-0000125622 00000 n
-0000125845 00000 n
-0000136876 00000 n
-0000125991 00000 n
-0000126088 00000 n
-0000137113 00000 n
-0000137788 00000 n
-0000138016 00000 n
-0000139008 00000 n
-0000138059 00000 n
-0000138154 00000 n
-0000139248 00000 n
-0000139850 00000 n
-0000140051 00000 n
-0000140076 00000 n
-0000140102 00000 n
-0000142291 00000 n
-0000140270 00000 n
-0000140373 00000 n
-0000142536 00000 n
-0000143209 00000 n
-0000143416 00000 n
-0000149968 00000 n
-0000143896 00000 n
-0000144012 00000 n
-0000150205 00000 n
-0000151096 00000 n
-0000151297 00000 n
-0000153458 00000 n
-0000151456 00000 n
-0000151561 00000 n
-0000153702 00000 n
-0000154374 00000 n
-0000154581 00000 n
-0000160693 00000 n
-0000155017 00000 n
-0000155137 00000 n
-0000160930 00000 n
-0000161764 00000 n
-0000161964 00000 n
-0000163670 00000 n
-0000162087 00000 n
-0000162193 00000 n
-0000163916 00000 n
-0000164572 00000 n
-0000164780 00000 n
-0000169820 00000 n
-0000165148 00000 n
-0000165268 00000 n
-0000170061 00000 n
-0000170829 00000 n
-0000171031 00000 n
-0000176941 00000 n
-0000171466 00000 n
-0000171576 00000 n
-0000177178 00000 n
-0000178042 00000 n
-0000178243 00000 n
-0000180878 00000 n
-0000178435 00000 n
-0000178540 00000 n
-0000181118 00000 n
-0000181794 00000 n
-0000181995 00000 n
-0000184100 00000 n
-0000182229 00000 n
-0000182334 00000 n
-0000184337 00000 n
-0000185022 00000 n
-0000185223 00000 n
-0000192691 00000 n
-0000185768 00000 n
-0000185899 00000 n
-0000192929 00000 n
-0000193840 00000 n
-0000194042 00000 n
-0000194895 00000 n
-0000194075 00000 n
-0000194169 00000 n
-0000195134 00000 n
-0000195734 00000 n
-0000195936 00000 n
-0000196166 00000 n
-0000196254 00000 n
-0000200408 00000 n
-0000196584 00000 n
-0000196693 00000 n
-0000200647 00000 n
-0000201394 00000 n
-0000201595 00000 n
-0000203824 00000 n
-0000201783 00000 n
-0000201887 00000 n
-0000204061 00000 n
-0000204730 00000 n
-0000204931 00000 n
-0000213517 00000 n
-0000205408 00000 n
-0000205528 00000 n
-0000213755 00000 n
-0000214733 00000 n
-0000214935 00000 n
-0000216942 00000 n
-0000215048 00000 n
-0000215151 00000 n
-0000217181 00000 n
-0000217824 00000 n
-0000218026 00000 n
-0000220245 00000 n
-0000218250 00000 n
-0000218355 00000 n
-0000220483 00000 n
-0000221174 00000 n
-0000221376 00000 n
-0000230576 00000 n
-0000222005 00000 n
-0000222141 00000 n
-0000230815 00000 n
-0000231816 00000 n
-0000232019 00000 n
-0000237640 00000 n
-0000232436 00000 n
-0000232556 00000 n
-0000237877 00000 n
-0000238695 00000 n
-0000238895 00000 n
-0000239941 00000 n
-0000238972 00000 n
-0000239071 00000 n
-0000240178 00000 n
-0000240797 00000 n
-0000240998 00000 n
-0000244938 00000 n
-0000241326 00000 n
-0000241442 00000 n
-0000245176 00000 n
-0000245919 00000 n
-0000246121 00000 n
-0000247495 00000 n
-0000246199 00000 n
-0000246301 00000 n
-0000247731 00000 n
-0000248347 00000 n
-0000248546 00000 n
-0000250780 00000 n
-0000248724 00000 n
-0000248829 00000 n
-0000251018 00000 n
-0000251684 00000 n
-0000251886 00000 n
-0000254681 00000 n
-0000252085 00000 n
-0000252194 00000 n
-0000254920 00000 n
-0000255608 00000 n
-0000255811 00000 n
-0000256852 00000 n
-0000255888 00000 n
-0000255987 00000 n
-0000257090 00000 n
-0000257711 00000 n
-0000257913 00000 n
-0000260100 00000 n
-0000258055 00000 n
-0000258164 00000 n
-0000260339 00000 n
-0000261003 00000 n
-0000269006 00000 n
-0000261206 00000 n
-0000277730 00000 n
-0000269261 00000 n
-0000285016 00000 n
-0000278007 00000 n
-0000292299 00000 n
-0000285238 00000 n
-0000293485 00000 n
-0000293566 00000 n
-0000296533 00000 n
-0000297207 00000 n
-0000297888 00000 n
-0000297979 00000 n
-0000298017 00000 n
-0000298145 00000 n
+0000011912 00000 n
+0000011974 00000 n
+0000261620 00000 n
+0000258329 00000 n
+0000256225 00000 n
+0000252313 00000 n
+0000248979 00000 n
+0000246548 00000 n
+0000241427 00000 n
+0000239326 00000 n
+0000232444 00000 n
+0000221803 00000 n
+0000218453 00000 n
+0000215362 00000 n
+0000205360 00000 n
+0000202024 00000 n
+0000293450 00000 n
+0000293306 00000 n
+0000196363 00000 n
+0000194469 00000 n
+0000185652 00000 n
+0000182424 00000 n
+0000178672 00000 n
+0000293876 00000 n
+0000011692 00000 n
+0000016452 00000 n
+0000016611 00000 n
+0000017074 00000 n
+0000016278 00000 n
+0000012480 00000 n
+0000016769 00000 n
+0000016415 00000 n
+0000026734 00000 n
+0000026893 00000 n
+0000021998 00000 n
+0000021693 00000 n
+0000017289 00000 n
+0000021814 00000 n
+0000171458 00000 n
+0000165195 00000 n
+0000162395 00000 n
+0000027052 00000 n
+0000027210 00000 n
+0000027369 00000 n
+0000027530 00000 n
+0000027754 00000 n
+0000026528 00000 n
+0000022278 00000 n
+0000027692 00000 n
+0000154998 00000 n
+0000151391 00000 n
+0000026665 00000 n
+0000032903 00000 n
+0000033062 00000 n
+0000033221 00000 n
+0000033522 00000 n
+0000032721 00000 n
+0000028034 00000 n
+0000033400 00000 n
+0000143498 00000 n
+0000032858 00000 n
+0000037420 00000 n
+0000037543 00000 n
+0000037237 00000 n
+0000033841 00000 n
+0000037358 00000 n
+0000040346 00000 n
+0000040505 00000 n
+0000040848 00000 n
+0000040172 00000 n
+0000037732 00000 n
+0000040664 00000 n
+0000040309 00000 n
+0000044477 00000 n
+0000044636 00000 n
+0000044979 00000 n
+0000044303 00000 n
+0000041063 00000 n
+0000044795 00000 n
+0000044440 00000 n
+0000049002 00000 n
+0000049161 00000 n
+0000049504 00000 n
+0000048828 00000 n
+0000045168 00000 n
+0000049320 00000 n
+0000293592 00000 n
+0000048965 00000 n
+0000053455 00000 n
+0000053150 00000 n
+0000049784 00000 n
+0000053271 00000 n
+0000057240 00000 n
+0000056935 00000 n
+0000053709 00000 n
+0000057056 00000 n
+0000294028 00000 n
+0000061345 00000 n
+0000060979 00000 n
+0000057468 00000 n
+0000061100 00000 n
+0000066381 00000 n
+0000066137 00000 n
+0000061612 00000 n
+0000066258 00000 n
+0000293733 00000 n
+0000070480 00000 n
+0000070050 00000 n
+0000066609 00000 n
+0000070171 00000 n
+0000074225 00000 n
+0000074384 00000 n
+0000074667 00000 n
+0000074051 00000 n
+0000070695 00000 n
+0000074543 00000 n
+0000074188 00000 n
+0000078028 00000 n
+0000077845 00000 n
+0000074869 00000 n
+0000077966 00000 n
+0000140145 00000 n
+0000081586 00000 n
+0000081744 00000 n
+0000081902 00000 n
+0000082204 00000 n
+0000081404 00000 n
+0000078256 00000 n
+0000082080 00000 n
+0000138079 00000 n
+0000125918 00000 n
+0000111191 00000 n
+0000081541 00000 n
+0000085429 00000 n
+0000085060 00000 n
+0000082497 00000 n
+0000085181 00000 n
+0000088182 00000 n
+0000087999 00000 n
+0000085631 00000 n
+0000088120 00000 n
+0000090774 00000 n
+0000093185 00000 n
+0000093336 00000 n
+0000090989 00000 n
+0000090608 00000 n
+0000088345 00000 n
+0000090927 00000 n
+0000090745 00000 n
+0000093493 00000 n
+0000093651 00000 n
+0000093809 00000 n
+0000093962 00000 n
+0000094120 00000 n
+0000094278 00000 n
+0000094436 00000 n
+0000094589 00000 n
+0000094747 00000 n
+0000094904 00000 n
+0000095067 00000 n
+0000095230 00000 n
+0000095393 00000 n
+0000095549 00000 n
+0000095713 00000 n
+0000095877 00000 n
+0000096041 00000 n
+0000096199 00000 n
+0000096363 00000 n
+0000096527 00000 n
+0000096685 00000 n
+0000096843 00000 n
+0000096996 00000 n
+0000097152 00000 n
+0000097310 00000 n
+0000097467 00000 n
+0000097625 00000 n
+0000097778 00000 n
+0000097936 00000 n
+0000098156 00000 n
+0000092779 00000 n
+0000091243 00000 n
+0000098094 00000 n
+0000294180 00000 n
+0000092916 00000 n
+0000098411 00000 n
+0000110393 00000 n
+0000098638 00000 n
+0000098740 00000 n
+0000110632 00000 n
+0000111353 00000 n
+0000111584 00000 n
+0000125093 00000 n
+0000111906 00000 n
+0000112012 00000 n
+0000125324 00000 n
+0000126072 00000 n
+0000126295 00000 n
+0000137326 00000 n
+0000126441 00000 n
+0000126538 00000 n
+0000137563 00000 n
+0000138238 00000 n
+0000138466 00000 n
+0000139458 00000 n
+0000138509 00000 n
+0000138604 00000 n
+0000139698 00000 n
+0000140300 00000 n
+0000140501 00000 n
+0000140526 00000 n
+0000140552 00000 n
+0000142741 00000 n
+0000140720 00000 n
+0000140823 00000 n
+0000142986 00000 n
+0000143659 00000 n
+0000143866 00000 n
+0000150418 00000 n
+0000144346 00000 n
+0000144462 00000 n
+0000150655 00000 n
+0000151546 00000 n
+0000151747 00000 n
+0000154235 00000 n
+0000151929 00000 n
+0000152034 00000 n
+0000154479 00000 n
+0000155159 00000 n
+0000155366 00000 n
+0000161478 00000 n
+0000155802 00000 n
+0000155922 00000 n
+0000161715 00000 n
+0000162549 00000 n
+0000162749 00000 n
+0000164455 00000 n
+0000162872 00000 n
+0000162978 00000 n
+0000164701 00000 n
+0000165357 00000 n
+0000165565 00000 n
+0000170605 00000 n
+0000165933 00000 n
+0000166053 00000 n
+0000170846 00000 n
+0000171614 00000 n
+0000171816 00000 n
+0000177726 00000 n
+0000172251 00000 n
+0000172361 00000 n
+0000177963 00000 n
+0000178827 00000 n
+0000179028 00000 n
+0000181663 00000 n
+0000179220 00000 n
+0000179325 00000 n
+0000181903 00000 n
+0000182579 00000 n
+0000182780 00000 n
+0000184885 00000 n
+0000183014 00000 n
+0000183119 00000 n
+0000185122 00000 n
+0000185807 00000 n
+0000186008 00000 n
+0000193476 00000 n
+0000186553 00000 n
+0000186684 00000 n
+0000193714 00000 n
+0000194625 00000 n
+0000194827 00000 n
+0000195680 00000 n
+0000194860 00000 n
+0000194954 00000 n
+0000195919 00000 n
+0000196519 00000 n
+0000196721 00000 n
+0000196951 00000 n
+0000197039 00000 n
+0000201193 00000 n
+0000197369 00000 n
+0000197478 00000 n
+0000201432 00000 n
+0000202179 00000 n
+0000202380 00000 n
+0000204609 00000 n
+0000202568 00000 n
+0000202672 00000 n
+0000204846 00000 n
+0000205515 00000 n
+0000205716 00000 n
+0000214302 00000 n
+0000206193 00000 n
+0000206313 00000 n
+0000214540 00000 n
+0000215518 00000 n
+0000215720 00000 n
+0000217727 00000 n
+0000215833 00000 n
+0000215936 00000 n
+0000217966 00000 n
+0000218609 00000 n
+0000218811 00000 n
+0000221030 00000 n
+0000219035 00000 n
+0000219140 00000 n
+0000221268 00000 n
+0000221959 00000 n
+0000222161 00000 n
+0000231361 00000 n
+0000222790 00000 n
+0000222926 00000 n
+0000231600 00000 n
+0000232601 00000 n
+0000232804 00000 n
+0000238425 00000 n
+0000233221 00000 n
+0000233341 00000 n
+0000238662 00000 n
+0000239480 00000 n
+0000239680 00000 n
+0000240726 00000 n
+0000239757 00000 n
+0000239856 00000 n
+0000240963 00000 n
+0000241582 00000 n
+0000241783 00000 n
+0000245723 00000 n
+0000242111 00000 n
+0000242227 00000 n
+0000245961 00000 n
+0000246704 00000 n
+0000246906 00000 n
+0000248280 00000 n
+0000246984 00000 n
+0000247086 00000 n
+0000248516 00000 n
+0000249132 00000 n
+0000249331 00000 n
+0000251565 00000 n
+0000249509 00000 n
+0000249614 00000 n
+0000251803 00000 n
+0000252469 00000 n
+0000252671 00000 n
+0000255455 00000 n
+0000252863 00000 n
+0000252972 00000 n
+0000255694 00000 n
+0000256382 00000 n
+0000256585 00000 n
+0000257626 00000 n
+0000256662 00000 n
+0000256761 00000 n
+0000257864 00000 n
+0000258485 00000 n
+0000258687 00000 n
+0000260874 00000 n
+0000258829 00000 n
+0000258938 00000 n
+0000261113 00000 n
+0000261777 00000 n
+0000269780 00000 n
+0000261980 00000 n
+0000278504 00000 n
+0000270035 00000 n
+0000285790 00000 n
+0000278781 00000 n
+0000293073 00000 n
+0000286012 00000 n
+0000294259 00000 n
+0000294340 00000 n
+0000297307 00000 n
+0000297981 00000 n
+0000298662 00000 n
+0000298753 00000 n
+0000298791 00000 n
+0000298919 00000 n
trailer
-<< /Size 515 /Root 513 0 R /Info 514 0 R /ID [ <5D1DE3161FCB9626A289358A417330C7> <5D1DE3161FCB9626A289358A417330C7> ] >>
+<< /Size 515 /Root 513 0 R /Info 514 0 R /ID [ <68798E2E477CE3B48821B97DA5E2E1DD> <68798E2E477CE3B48821B97DA5E2E1DD> ] >>
startxref
-298693
+299467
%%EOF
diff --git a/macros/luatex/latex/piton/piton-french.tex b/macros/luatex/latex/piton/piton-french.tex
index 5c7debb147..bb193283a5 100644
--- a/macros/luatex/latex/piton/piton-french.tex
+++ b/macros/luatex/latex/piton/piton-french.tex
@@ -1,1735 +1,1750 @@
-% -*- coding: utf-8 ; -*-
-\documentclass[dvipsnames]{article}
-
-\usepackage{fontspec}
-
-\usepackage[french]{babel}
-\frenchsetup{og = « , fg = »}
-
-\usepackage[footnotehyper,escape-inside=$$,math-comments]{piton}
-
-\usepackage[executable=python.exe]{pyluatex}
-
-\usepackage{xcolor}
-
-\usepackage{geometry}
-\geometry{left=2.8cm,right=2.8cm,top=2.5cm,bottom=2.5cm,papersize={21cm,29.7cm}}
-
-\usepackage{enumitem}
-\usepackage{verbatim}
-\usepackage{amsmath}
-\usepackage{tabularx}
-\usepackage{booktabs}
-\usepackage{tcolorbox}
-\usepackage{luacolor,lua-ul}
-
-\usepackage{caption}
-
-% We use \MakeShortVerb of shortvrb and not \DefineShortVerb of fancyvrb
-% because we don't want the contents of short verbatim colored in gray
-\usepackage{shortvrb}
-\MakeShortVerb{\|}
-
-\usepackage{varwidth}
-
-\skip\footins = 2\bigskipamount
-
-\usepackage{fancyvrb}
-\fvset{commandchars=\~\#\@,formatcom=\color{gray}}
-\def\emphase{\bgroup\color{RoyalPurple}\let\next=}
-
-
-\usepackage{titlesec}
-\titlespacing*{\section}{0pt}{6.5ex plus 1ex minus .2ex}{4.3ex plus .2ex}
-\titlespacing*{\subsection}{0pt}{4.5ex plus 1ex minus .2ex}{2ex plus .2ex}
-
-\def\interitem{\vspace{7mm plus 2 mm minus 3mm}}
-
-
-\usepackage[hyperfootnotes = false]{hyperref}
-
-\hypersetup
- {
- pdfinfo =
- {
- Title = L’extension piton ,
- Subject = Une extension LaTeX ,
- Author = F. Pantigny
- }
- }
-
-
-
-
-\NewDocumentCommand {\pkg} {m} {\textsf{#1}}
-\NewDocumentCommand {\cls} {m} {\textsf{#1}}
-
-\setlength{\parindent}{0pt}
-
-
-\begin{document}
-
-\PitonOptions{splittable = 4}
-
-\VerbatimFootnotes
-
-
-\title{L'extension LaTeX \pkg{piton}\thanks{Ce document correspond à la
-version~\myfileversion\space de \pkg{piton}, à la date du~\myfiledate.}}
-\author{F. Pantigny \\ \texttt{fpantigny@wanadoo.fr}}
-
-\maketitle
-
-\begin{abstract}
-L'extension \pkg{piton} propose des outils pour composer du code Python avec une coloration syntaxique
-en utilisant la bibliothèque Lua LPEG. L'extension \pkg{piton} nécessite l'emploi de LuaLaTeX.
-\end{abstract}
-
-
-
-\section{Présentation}
-
-L'extension \pkg{piton} utilise la librairie Lua nommée LPEG\footnote{LPEG est une librairie de capture de motifs
- (\emph{pattern-matching} en anglais) pour Lua, écrite en C, fondée sur les PEG (\emph{parsing expression
- grammars}): \url{http://www.inf.puc-rio.br/~roberto/lpeg/}} pour «parser» le code Python et le composer avec un
-coloriage syntaxique. Comme elle utilise du code Lua, elle fonctionne uniquement avec |lualatex| (et ne va pas
-fonctionner avec les autres moteurs de compilation LaTeX, que ce soit |latex|, |pdflatex| ou |xelatex|). Elle
-n'utilise aucun programme extérieur et la compilation ne requiert donc pas |--shell-escape|. La compilation est
-très rapide puisque tout le travail du parseur est fait par la librairie LPEG, écrite en C.
-
-\bigskip
-Voici un exemple de code Python composé avec l'environnement |{Piton}| proposé par \pkg{piton}.
-
-
-\bigskip
-\begin{Piton}
-from math import pi
-
-def arctan(x,n=10):
- """Calcule la valeur mathématique de arctan(x)
-
- n est le nombre de termes de la somme
- """
- if x < 0:
- return -arctan(-x) # appel récursif
- elif x > 1:
- return pi/2 - arctan(1/x)
- #> (on a utilisé le fait que $\arctan(x)+\arctan(1/x)=\pi/2$ pour $x>0$)\footnote{Cet échappement vers LaTeX a été obtenu en débutant par \ttfamily\#>.}
- else:
- s = 0
- for k in range(n):
- s += (-1)**k/(2*k+1)*x**(2*k+1)
- return s
-\end{Piton}
-
-
-\bigskip
-
-L'extension LaTeX \pkg{piton} est entièrement contenue dans le fichier |piton.sty|. Ce
-fichier peut être placé dans le répertoire courant ou dans une arborescence |texmf|. Le mieux reste néanmoins
-d'installer \pkg{piton} avec une distribution TeX comme MiKTeX, TeX~Live ou MacTeX.
-
-
-\section{Utilisation de l'extension}
-
-\subsection{Chargement de l'extension}
-
-L'extension \pkg{piton} se charge simplement avec la commande |\usepackage| : |\usepackage{piton}|.
-
-On a cependant deux remarques à formuler :
-\begin{itemize}
-\item l'extension \pkg{piton} utilise l'extension \pkg{xcolor} (mais \pkg{piton} ne charge pas \pkg{xcolor} : si
-\pkg{xcolor} n'est pas chargée avant le |\begin{document}|, une erreur fatale sera levée) ;
-
-\item l'extension \pkg{piton} n'est utilisable qu'avec LuaLaTeX : si un autre moteur de compilation (comme |latex|,
-|pdflatex| ou |xelatex|) est utilisé, une erreur fatale sera levée.
-\end{itemize}
-
-\subsection{Les commandes et environnements à la disposition de l'utilisateur}
-
-L'extension \pkg{piton} fournit plusieurs outils pour composer du code Python: les commandes |\piton|,
-l'environnement |{Piton}| et la commande |\PitonInputFile|.
-
-\begin{itemize} \setlength{\fboxsep}{1pt}
-\item La commande \colorbox{gray!20}{\ttfamily \textbackslash piton} doit être utilisée pour composer de petits éléments de code à l'intérieur d'un
-paragraphe. Par exemple :
-
-{\color{gray}\verb|\piton{def carré(x): return x*x}|}\qquad
-\piton{def carré(x): return x*x}
-
-La syntaxe et les particularités de la commande sont détaillées ci-après.
-
-
-\item L'environnement \colorbox{gray!20}{\ttfamily \{Piton\}} doit être utilisé pour composer des codes de
-plusieurs lignes. Comme cet environnement prend son argument selon un mode verbatim, il ne peut pas être utilisé
-dans l'argument d'une commande LaTeX. Pour les besoins de personnalisation, il est possible de définir de nouveaux
-environnements similaires à |{Piton}| en utilisant la commande |\NewPitonEnvironment| : cf. partie
-\ref{NewPitonEnvironment} p.~\pageref{NewPitonEnvironment}.
-
-\item La commande \colorbox{gray!20}{\ttfamily \textbackslash PitonInputFile} doit être utilisée pour insérer et
-composer un fichier extérieur.
-
-Cette commande prend en argument optionnel entre crochets deux clés |first-line| et |last-line| qui permettent de
-n'insérer que la partie du fichier comprise entre les lignes correspondantes.
-\end{itemize}
-
-
-\subsection{La syntaxe de la commande \textbackslash piton}
-
-
-La commande |\piton| possède en fait une syntaxe double. Elle est peut être utilisée comme une commande standard de
-LaTeX prenant son argument entre accolades (|\piton{...}|), ou bien selon la syntaxe de la commande |\verb| où l'argument est
-délimité entre deux caractères identiques (par ex. : \verb!\piton|...|!). On détaille maintenant ces deux syntaxes.
-
-\bigskip
-\begin{itemize}
-\item {\color{blue} \textsf{Syntaxe} \verb|\piton{...}|}\par\nobreak
-
-Quant son argument est donné entre accolades, la commande |\piton| ne prend pas son argument en mode verbatim. Les
-points suivants doivent être remarqués :
-
-\begin{itemize}
-\item plusieurs espaces successives sont remplacées par une unique espace,
-
-{\color{cyan} mais la commande |\|⣠est fournie pour forcer l'insertion d'une espace} ;
-
-\item il n'est pas possible d'utiliser le caractère |%| à l'intérieur,
-
-{\color{cyan} mais la commande |\%| est fournie pour insérer un |%|} ;
-
-\item les accolades doivent apparaître par paires correctement imbriquées,
-
-{\color{cyan} mais les commandes |\{| et |\}| sont aussi fournies pour insérer des accolades individuelles} ;
-
-\item les commandes LaTeX\footnote{Cela s'applique aux commandes commençant par une contre-oblique |\| mais également aux caractères actifs.} sont
-complètement développées sans être exécutées
-
-{\color{cyan} et on peut donc utiliser |\\| pour insérer une contre-oblique}.
-\end{itemize}
-
-Les autres caractères (y compris |#|, |^|, |_|, |&|, |$| % $
-et |@|) doivent être insérés sans contre-oblique.
-
-\bigskip
-\begin{tabular}{>{\color{gray}}w{l}{75mm}@{\hspace*{1cm}}l}
-\omit Exemples : \hfil \\
-\noalign{\vskip1mm}
-\verb|\piton{ma_chaîne = '\\n'}| &
-\piton{ma_chaîne = '\\n' } \\
-\verb|\piton{def pair(n): return n\%2==0}| &
-\piton{def pair(n): return n\%2==0 } \\
-\verb|\piton{c="#" # une affectation }| &
-\piton{c="#" # une affectation } \\
-\verb|\piton{c="#" \ \ \ # une affectation }| &
-\piton{c="#" \ \ \ # une affectation } \\
-\verb|\piton{my_dict = {'a': 3, 'b': 4}}| &
-\piton{my_dict = {'a': 3, 'b': 4}}
-\end{tabular}
-
-\bigskip
-La commande |\piton| avec son argument entre accolades peut être utilisée dans les arguments des autres commandes LaTeX.\footnote{La commande
- |\piton| peut par exemple être
- utilisée dans une note de bas de page. Exemple : \piton{s = 'Une chaîne'}.}
-
-\bigskip
-\item {\color{blue} \textsf{Syntaxe} \verb!\piton|...|!}\par\nobreak
-
-Quand la commande |\piton| prend son argument entre deux caractères identiques, cet argument est pris \emph{en mode
- verbatim}. De ce fait, avec cette syntaxe, la commande |\piton| ne peut \emph{pas} être utilisée dans l'argument d'une
-autre fonction.
-
-\medskip
-\begin{tabular}{>{\color{gray}}w{l}{75mm}@{\hspace*{1cm}}l}
-\omit Exemples : \hfil \\
-\noalign{\vskip1mm}
-\verb!\piton|ma_chaîne = '\n'|! &
-\piton|ma_chaîne = '\n'| \\
-\verb|\piton!def pair(n): return n%2==0!| &
-\piton!def pair(n): return n%2==0! \\
-\verb|\piton+c="#" # une affectation +| &
-\piton+c="#" # une affectation + \\
-\verb|\piton?my_dict = {'a': 3, 'b': 4}?| &
-\piton!my_dict = {'a': 3, 'b': 4}!
-\end{tabular}
-
-\end{itemize}
-
-
-
-\section{Personnalisation}
-
-\subsection{La commande \textbackslash PitonOptions}
-
-\NewDocumentCommand{\Definition}{m}
- {{\setlength{\fboxsep}{1pt}\colorbox{gray!20}{\ttfamily \vphantom{gl}#1}}}
-
-
-La commande |\PitonOptions| prend en argument une liste de couples \textsl{clé=valeur}. La portée des réglages
-effectués par cette commande est le groupe TeX courant.\footnote{On rappelle que tout environnement LaTeX est, en particulier, un groupe.}
-
-\begin{itemize}
-\item La clé \Definition{gobble} prend comme valeur un entier positif $n$ : les $n$ premiers caractères de chaque
-ligne sont alors retirés (avant formatage du code) dans les environnements |{Piton}|. Ces $n$ caractères ne sont
-pas nécessairement des espaces.
-
-\item Quand la clé \Definition{auto-gobble} est activée, l'extension \pkg{piton} détermine la valeur minimale $n$
-du nombre d'espaces successifs débutant chaque ligne (non vide) de l'environnement |{Piton}| et applique |gobble|
-avec cette valeur de~$n$.
-
-\item Quand la clé \Definition{env-gobble} est activée, \pkg{piton} analyse la dernière ligne de l'environnement,
-c'est-à-dire celle qui contient le |\end{Piton}| et détermine si cette ligne ne comporte que des espaces suivis par
-|\end{Piton}|. Si c'est le cas, \pkg{piton} calcule le nombre $n$ de ces espaces et applique |gobble| avec cette
-valeur de~$n$. Le nom de cette clé vient de \emph{environment gobble}: le nombre d'espaces à retirer ne dépend que
-de la position des délimiteurs |\begin{Piton}| et |\end{Piton}| de l'environnement.
-
-\item Avec la clé \Definition{line-numbers}, les lignes \emph{non vides} (et toutes les lignes des
-\emph{docstrings}, y compris celles qui sont vides) sont numérotées dans les environnements \verb|{Piton}| et dans
-les listings produits par la commande |\PitonInputFile|.
-
-\item Avec la clé \Definition{all-line-numbers}, \emph{toutes} les lignes sont numérotées, y compris les lignes vides.
-
-\item \colorbox{yellow!50}{\textbf{Nouveau 1.5}}\par\nobreak
-
-La clé \Definition{numbers-sep} est la distance horizontale entre les numéros de lignes (insérés par |line-numbers|
-ou |all-line-numbers|) et les lignes du code informatique. La valeur initiale est 0.7~em.
-
-\item La clé \Definition{left-margin} fixe une marge sur la gauche. Cette clé peut être utile, en particulier, en
-conjonction avec l'une des clés |line-numbers| et |all-line-numbers| si on ne souhaite pas que les numéros de ligne
-soient dans une position en débordement sur la gauche.
-
-Il est possible de donner à la clé |left-margin| la valeur spéciale~|auto|. Avec cette valeur, une marge est
-insérée automatiquement pour les numéros de ligne quand l'une des clés |line-numbers| ou |all-line-numbers| est
-utilisée. Voir un exemple à la partie \ref{example-numbering} p.~\pageref{example-numbering}.
-
-\item Avec la clé \Definition{resume}, le compteur de lignes n'est pas remis à zéro comme il l'est normalement au
-début d'un environnement |{Piton}| ou bien au début d'un listing produit par |\PitonInputFile|. Cela permet de
-poursuivre la numérotation d'un environnement à l'autre.
-
-\item La clé \Definition{background-color} fixe la couleur de fond des environnements |{Piton}| et des listings
-produits par |\PitonInputFile| (ce fond a une largeur égale à la valeur courante de |\linewidth|). La clé
-|background-color| accepte une couleur définie «à la volée», c'est-à-dire que l'on peut écrire par exemple
-|background-color = [cmyk]{0.1,0.05,0,0}|
-
-\smallskip
-\colorbox{yellow!50}{\textbf{Nouveau 1.4}}\enskip La clé |background-color| accepte aussi en argument une
-\emph{liste} de couleurs. Les lignes sont alors coloriées de manière cyclique avec ces couleurs.
-
-\emph{Exemple} : |\PitonOptions{background-color = {gray!5,white}}|
-
-\item Avec la clé \Definition{prompt-background-color}, \pkg{piton} ajoute un fond coloré aux lignes débutant par
-le prompt «|>>>|» (et sa continuation «|...|») caractéristique des consoles Python avec boucle \textsc{repl}
-(\emph{read-only-eval loop}). Pour un exemple d'utilisation de cette clé, voir la partie \ref{pythonrepl}
-p.~\pageref{pythonrepl}.
-
-\item En activant la clé \Definition{show-spaces-in-strings}, les espaces dans les chaînes courtes (c'est-à-dire
-celles délimitées par |'| ou |"|) sont matérialisés par le caractère ⣠(U+2423 : \textsc{open box}). Bien sûr, le
-caractère U+2423 doit être présent dans la fonte mono-chasse utilisée.\footnote{L'extension \pkg{piton} utilise
- simplement la fonte mono-chasse courante. Pour la changer, le mieux est d'utiliser |\setmonofont| de
- \pkg{fontspec}.}\par\nobreak
-%
-\begingroup
-\PitonOptions{show-spaces-in-strings}
-Exemple : \piton{my_string = 'Très bonne réponse'}
-\endgroup
-
-\smallskip
-Avec la clé \Definition{show-spaces}, tous les espaces sont matérialisés (et aucune coupure de ligne ne peut plus
-intervenir sur ces espaces matérialisés, même si la clé |break-lines|\footnote{cf. \ref{line-breaks} p.~\pageref{line-breaks}.} est active).
-\end{itemize}
-
-\bigskip
-
-\begingroup
-\fvset{commandchars=\~\&\@,formatcom=\small\color{gray}}
-\begin{Verbatim}
-~emphase&\PitonOptions{line-numbers,auto-gobble,background-color = gray!15}@
-\begin{Piton}
- from math import pi
-
- def arctan(x,n=10):
- """Calcule la valeur mathématique de arctan(x)
-
- n est le nombre de termes de la somme
- """
- if x < 0:
- return -arctan(-x) # appel récursif
- elif x > 1:
- return pi/2 - arctan(1/x)
- #> (on a utilisé le fait que $\arctan(x)+\arctan(1/x)=\pi/2$ pour $x>0$)
- else:
- s = 0
- for k in range(n):
- s += (-1)**k/(2*k+1)*x**(2*k+1)
- return s
-\end{Piton}
-\end{Verbatim}
-\endgroup
-
-
-\begingroup
-\PitonOptions{line-numbers,auto-gobble,background-color = gray!15}
-\begin{Piton}
- from math import pi
-
- def arctan(x,n=10):
- """Compute the value of arctan(x)
-
- n is the number of terms in the sum
- """
- if x < 0:
- return -arctan(-x) # appel récursif
- elif x > 1:
- return pi/2 - arctan(1/x)
- #> (on a utilisé le fait que $\arctan(x)+\arctan(1/x)=\pi/2$ pour $x>0$)
- else:
- s = 0
- for k in range(n):
- s += (-1)**k/(2*k+1)*x**(2*k+1)
- return s
-\end{Piton}
-\endgroup
-
-
-
-\bigskip
-La commande |\PitonOptions| propose d'autres clés qui seront décrites plus loin (voir en particulier la coupure des
-pages et des lignes p.~\pageref{breakable}).
-
-
-\subsection{Les styles}
-
-\label{styles}
-
-L'extension \pkg{piton} fournit la commande |\SetPitonStyle| pour personnaliser les différents styles utilisés pour
-formater les éléments syntaxiques des listings Python. Ces personnalisations ont une portée qui correspond au
-groupe TeX courant.\footnote{On rappelle que tout environnement LaTeX est, en particulier, un groupe.}
-
-\bigskip
-La commande |\SetPitonStyle| prend en argument une liste de couples \textsl{clé=valeur}. Les clés sont les noms des
-styles et les valeurs sont les instructions LaTeX de formatage correspondantes.
-
-\bigskip
-Ces instructions LaTeX doivent être des instructions de formatage du type de |\bfseries|, |\slshape|,
-|\color{...}|, etc. (les commandes de ce type sont parfois qualifiées de \emph{semi-globales}). Il est aussi
-possible de mettre, \emph{à la fin de la liste d'instructions}, une commande LaTeX prenant exactement un argument.
-
-\bigskip
-Voici un exemple qui change le style utilisé pour le nom d'une fonction Python, au moment de sa définition
-(c'est-à-dire après le mot-clé |def|). Elle utilise la commande |\highLight| de \pkg{lua-ul} (qui nécessite
-lui-même le chargement de \pkg{luacolor}).
-
-\begin{Verbatim}
-\SetPitonStyle
- { Name.Function = \bfseries \hightLight[red!50] }
-\end{Verbatim}
-
-Ici, |\highLight[red!50]| doit être considéré comme le nom d'une fonction LaTeX qui prend exactement un argument,
-puisque, habituellement, elle est utilisée avec |\highLight[red!50]{|\texttt{\slshape text}|}|.
-
-\medskip
-\begingroup
-\SetPitonStyle
- { Name.Function = \bfseries \highLight[red!50] }
-Avec ce réglage, on obtient : \piton{def cube(x) : return x * x * x }
-\endgroup
-
-
-\bigskip
-Les différents styles sont décrits dans la table \ref{Semantic}. Les réglages initiaux effectués par \pkg{piton}
-dans |piton.sty| sont inspirés par le style \pkg{manni} de Pygments.\footnote{Voir
- \url{https://pygments.org/styles/}. À remarquer que, par défaut, Pygments propose pour le style \pkg{manni} un
- fond coloré dont la couleur est la couleur HTML |#F0F3F3|. Il est possible d'avoir la même couleur dans |{Piton}|
- avec l'instruction : |\PitonOptions{background-color = [HTML]{F0F3F3}}|}
-
-\begin{table}[htb]
-\centering
-\caption{Les styles proposés par \pkg{piton}}
-\label{Semantic}
-\begin{tabularx}{0.9\textwidth}{@{}>{\ttfamily}l>{\raggedright\arraybackslash}X@{}}
-\toprule
-\normalfont Style & Usage \\
-\midrule
-Number & les nombres \\
-String.Short & les chaînes de caractères courtes (entre \texttt{'} ou \texttt{"}) \\
-String.Long & les chaînes de caractères longues (entre \texttt{'''} ou \texttt{"""}) sauf les chaînes de
- documentation \\
-String & cette clé fixe à la fois |String.Short| et |String.Long| \\
-String.Doc & les chaînes de documentation (seulement entre |"""| suivant PEP~257) \\
-String.Interpol & les éléments syntaxiques des champs des f-strings (c'est-à-dire les caractères \texttt{\{}et \texttt{\}}) \\
-Operator & les opérateurs suivants : \texttt{!= == << >> - \~{} + / * \% = < > \& .} \verb+|+ \verb|@| \\
-Operator.Word & les opérateurs suivants : |in|, |is|, |and|, |or| et |not| \\
-Name.Builtin & la plupart des fonctions prédéfinies par Python \\
-Name.Function & le nom des fonctions définies par l'utilisateur \emph{au moment de leur définition}, c'est-à-dire
- après le mot-clé \verb|def| \\
-Name.Decorator & les décorateurs (instructions débutant par \verb|@|) \\
-Name.Namespace & le nom des modules (= bibliothèques extérieures) \\
-Name.Class & le nom des classes au moment de leur définition, c'est-à-dire après le mot-clé \verb|class| \\
-Exception & le nom des exceptions prédéfinies (ex.: SyntaxError) \\
-Comment & les commentaires commençant par \texttt{\#} \\
-Comment.LaTeX & les commentaires commençant par \texttt{\#>} qui sont composés en LaTeX par \pkg{piton} (et
- appelés simplement «commentaires LaTeX» dans ce document) \\
-Keyword.Constant & |True|, |False| et |None| \\
-Keyword & les mots-clés suivants :
- \ttfamily assert, break, case, continue, del,
- elif, else, except, exec, finally, for, from,
- global, if, import, lambda, non local,
- pass, raise, return, try, while,
- with, yield, yield from.\\
-\bottomrule
-\end{tabularx}
-\end{table}
-
-\bigskip
-\colorbox{yellow!50}{\textbf{Nouveau 1.4}}\enskip La commande |\PitonStyle| prend en argument le nom d'un style
-et permet de récupérer la valeur (en tant que liste d'instructions LaTeX) de ce style.
-
-\smallskip
-Par exemple, on peut écrire, dans le texte courant, |{\PitonStyle{Keyword}{function}}| et on aura
-le mot {\PitonStyle{Keyword}{function}} formaté comme un mot-clé.
-
-\smallskip
-La syntaxe |{\PitonStyle{|\textsl{\texttt{style}}|}{...}}| est nécessaire pour pouvoir tenir compte à la fois des commandes
-semi-globales et des commandes à argument présentes dans la valeur courante du style \texttt{\textsl{style}}.
-
-
-\subsection{Définition de nouveaux environnements}
-
-\label{NewPitonEnvironment}
-
-Comme l'environnement |{Piton}| a besoin d'absorber son contenu d'une manière spéciale (à peu près comme du texte
-verbatim), il n'est pas possible de définir de nouveaux environnements directement au-dessus de l'environnement
-|{Piton}| avec les commandes classiques |\newenvironment| et |\NewDocumentEnvironment|.
-
-C'est pourquoi \pkg{piton} propose une commande |\NewPitonEnvironment|. Cette commande a la même syntaxe que la
-commande classique |\NewDocumentEnvironment|.
-
-\bigskip
-Par exemple, avec l'instruction suivante, un nouvel environnement |{Python}| sera défini avec le même comportement
-que l'environnement |{Piton}|:
-
-{\color{gray}\verb|\NewPitonEnvironment{Python}{}{}{}|}
-
-
-\bigskip
-Si on souhaite un environnement |{Python}| qui prenne en argument optionnel entre crochets les clés de
-|\PitonOptions|, on peut écrire :
-
-{\color{gray}\verb|\NewPitonEnvironment{Python}{O{}}{\PitonOptions{#1}}{}|}
-
-\bigskip
-Si on souhaite un environnement |{Python}| qui compose le code inclus dans une boîte de \pkg{tcolorbox}, on peut
-écrire (à condition, bien entendu, d'avoir chargé l'extension \pkg{tcolorbox}):
-
-\begin{Verbatim}
-\NewPitonEnvironment{Python}{}
- {\begin{tcolorbox}}
- {\end{tcolorbox}}
-\end{Verbatim}
-
-\bigskip
-Avec ce nouvel environnement |{Python}|, on peut écrire :
-
-\begin{Verbatim}
-~emphase#\begin{Python}@
-def carré(x):
- """Calcule le carré d'un nombre"""
- return x*x
-~emphase#\end{Python}@
-\end{Verbatim}
-
-\NewPitonEnvironment{Python}{}
- {\begin{tcolorbox}}
- {\end{tcolorbox}}
-
-\begin{Python}
-def carré(x):
- """Calcule le carré d'un nombre"""
- return x*x
-\end{Python}
-
-
-\section{Fonctionnalités avancées}
-
-
-\subsection{Mise en évidence d'identificateurs}
-
-\colorbox{yellow!50}{\textbf{Nouveau 1.4}}
-
-On peut demander le changement de formatage de certains identificateurs avec la clé |identifiers| de
-|\PitonOptions|.
-
-\smallskip
-Cette clé prend en argument une valeur au format suivant :
-
-\quad |{ names = |\textsl{\ttfamily noms}|, style = |\textsl{\ttfamily instructions}| }|
-
-\begin{itemize}
-\item \textsl{\ttfamily noms} est une liste de noms d'identificateurs (séparés par des virgules) ;
-
-\item \textsl{\ttfamily instructions} est une liste d'instructions LaTeX de formatage du même type que pour les
-styles précédemment définis (cf.~\ref{styles} p.~\pageref{styles}).
-\end{itemize}
-
-\emph{Attention} : Seuls les identifiants peuvent voir leur formatage affecté. Les mots-clés et les noms de
-fonctions prédéfinies ne seront pas affectés, même s'ils figurent dans la liste \textsl{\ttfamily noms}.
-
-\begin{Verbatim}
-\PitonOptions
- {
- ~emphase#identifiers@ =
- {
- ~emphase#names@ = { l1 , l2 } ,
- ~emphase#style@ = \color{red}
- }
- }
-
-\begin{Piton}
-def tri(l):
- """Tri par segmentation"""
- if len(l) <= 1:
- return l
- else:
- a = l[0]
- l1 = [ x for x in l[1:] if x < a ]
- l2 = [ x for x in l[1:] if x >= a ]
- return tri(l1) + [a] + tri(l2)
-\end{Piton}
-\end{Verbatim}
-
-
-\bigskip
-
-\begingroup
-
-\PitonOptions
- {
- identifiers =
- {
- names = { l1 , l2 } ,
- style = \color{red}
- }
- }
-
-\begin{Piton}
-def tri(l):
- """Tri par segmentation"""
- if len(l) <= 1:
- return l
- else:
- a = l[0]
- l1 = [ x for x in l[1:] if x < a ]
- l2 = [ x for x in l[1:] if x >= a ]
- return tri(l1) + [a] + tri(l2)
-\end{Piton}
-
-\endgroup
-
-\bigskip
-En utilisant la clé |identifiers|, on peut ajouter de nouvelles fonctions prédéfinies (ou de nouveaux mots-clés,
-etc.) qui seront détectées par \pkg{piton}.
-
-
-\begin{Verbatim}
-\PitonOptions
- {
- ~emphase#identifiers@ =
- {
- names = { cos, sin, tan, floor, ceil, trunc, pow, exp, ln, factorial } ,
- style = \PitonStyle{Name.Builtin}
- }
- }
-
-\begin{Piton}
-from math import *
-cos(pi/2)
-factorial(5)
-ceil(-2.3)
-floor(5.4)
-\end{Piton}
-\end{Verbatim}
-
-\begingroup
-
-\PitonOptions
- {
- identifiers =
- {
- names = { cos, sin, tan, floor, ceil, trunc, pow, exp, ln, factorial } ,
- style = \PitonStyle{Name.Builtin}
- }
- }
-
-\begin{Piton}
-from math import *
-cos(pi/2)
-factorial(5)
-ceil(-2.3)
-floor(5.4)
-\end{Piton}
-
-
-\endgroup
-
-\subsection{Les échappements vers LaTeX}
-
-L'extension \pkg{piton} propose plusieurs mécanismes d'échappement vers LaTeX :
-\begin{itemize}
-\item Il est possible d'avoir des commentaires entièrement composés en LaTeX.
-\item Il est possible d'avoir, dans les commentaires Python, les éléments entre \texttt{\$} composés en mode
-mathématique de LaTeX.
-\item Il est possible d'insérer du code LaTeX à n'importe quel endroit d'un listing Python.
-\end{itemize}
-Ces mécanismes vont être détaillés dans les sous-parties de cette partie.
-
-\smallskip
-À remarquer également que, dans le cas où \pkg{piton} est utilisée dans la classe \cls{beamer}, \pkg{piton} détecte
-la plupart des commandes et environnements de Beamer : voir la sous-section \ref{beamer}, p.~\pageref{beamer}.
-
-
-\subsubsection{Les «commentaires LaTeX»}
-
-Dans ce document, on appelle «commentaire LaTeX» des commentaires qui débutent par |#>|. Tout ce qui suit ces deux
-caractères, et jusqu'à la fin de la ligne, sera composé comme du code LaTeX standard.
-
-Il y a deux outils pour personnaliser ces commentaires.
-
-\begin{itemize}
-\item Il est possible de changer le marquage syntaxique utilisé (qui vaut initialement~|#>|). Pour ce faire, il
-existe une clé |comment-latex|, disponible seulement au chargement de \pkg{piton} (c'est-à-dire au moment du
-|\usepackage|), qui permet de choisir les caractères qui (précédés par~|#|) serviront de marqueur syntaxique.
-
-Par exemple, avec le chargement suivant :
-
-\quad \verb|\usepackage[comment-latex = LaTeX]{piton}|
-
-les commentaires LaTeX commenceront par~|#LaTeX|.
-
-Si on donne la valeur nulle à la clé |comment-latex|, tous les commentaires Python (débutant par~|#|) seront en
-fait des «commentaires LaTeX».
-
-\smallskip
-\item Il est possible de changer le formatage du commentaire LaTeX lui-même en changeant le style \pkg{piton}
-|Comment.LaTeX|.
-
-Par exemple, avec |\SetPitonStyle{Comment.LaTeX = \normalfont\color{blue}}|, les commentaires LaTeX seront composés
-en bleu.
-
-Si on souhaite qu'un croisillon (|#|) soit affiché en début de commentaire dans le \textsc{pdf}, on peut régler
-|Comment.LaTeX| de la manière suivante :
-
-\begin{Verbatim}
-\SetPitonStyle{Comment.LaTeX = \color{gray}\~#\normalfont\space }
-\end{Verbatim}
-
-Pour d'autres exemples de personnalisation des commentaires LaTeX, voir la partie \ref{example-comments}
-p.~\pageref{example-comments}.
-\end{itemize}
-
-
-\bigskip
-Si l'utilisateur a demandé l'affichage des numéros de ligne (avec |line-numbers| ou |all-line-numbers|), il est
-possible de faire référence à ce numéro de ligne avec la commande |\label| placée dans un commentaire
-LaTeX.\footnote{Cette fonctionnalité est implémentée en redéfinissant, dans les environnements |{Piton}|, la
- commande |\label|. Il peut donc y avoir des incompatibilités avec les extensions qui redéfinissent (globalement)
- cette commande |\label| (comme \pkg{varioref}, \pkg{refcheck}, \pkg{showlabels}, etc.)}
-
-
-
-
-\subsubsection{La clé «math-comments»}
-
-Il est possible de demander que, dans les commentaires Python normaux, c'est-à-dire débutant par~|#| (et non par
-|#>|), les éléments placés entre symboles \texttt{\$} soient composés en mode mathématique de LaTeX (le reste du
-commentaire restant composé en verbatim).
-
-La clé |math-comments|, qui n'est disponible qu'au chargement de \pkg{piton} (c'est-à-dire au moment du
-|\usepackage|), active ce comportement.
-
-\bigskip
-Dans l'exemple suivant, on suppose que la clé |math-comments| a été utilisée au chargement de \pkg{piton}.
-
-\begin{Verbatim}
-\begin{Piton}
-def carré(x):
- return x*x ~# renvoie $x^2$
-\end{Piton}
-\end{Verbatim}
-
-\begin{Piton}
-def carré(x):
- return x*x # renvoie $x^2$
-\end{Piton}
-
-
-\subsubsection{Le mécanisme «espace-inside»}
-
-Il est aussi possible de surcharger les listings Python pour y insérer du code LaTeX à peu près n'importe où (mais
-entre deux lexèmes, bien entendu). Cette fonctionnalité n'est pas activée par défaut par \pkg{piton}. Pour
-l'utiliser, il faut spécifier les deux caractères marquant l'échappement (le premier le commençant et le deuxième
-le terminant) en utilisant la clé |escape-inside| au chargement de \pkg{piton} (c'est-à-dire au moment du
-|\usepackage|). Les deux caractères peuvent être identiques.
-
-
-\bigskip
-Dans l'exemple suivant, on suppose que l'extension \pkg{piton} a été chargée de la manière suivante :
-
-\begin{Verbatim}
-\usepackage[~emphase#escape-inside=$$@]{piton}
-\end{Verbatim}
-
-\medskip
-Dans le code suivant, qui est une programmation récursive de la factorielle, on décide de surligner en jaune
-l'instruction qui contient l'appel récursif. Cet exemple utilise la commande |\highLight| de \pkg{lua-ul} (cette
-extension requiert aussi l'extension \pkg{luacolor}).
-\begin{Verbatim}
-\begin{Piton}
-def fact(n):
- if n==0:
- return 1
- else:
- ~emphase#$\highLight{$@return n*fact(n-1)~emphase#$}$@
-\end{Piton}
-\end{Verbatim}
-
-\begin{Piton}
-def fact(n):
- if n==0:
- return 1
- else:
- $\highLight{$return n*fact(n-1)$}$
-\end{Piton}
-
-\bigskip
-En fait, dans le cas présent, il serait sans doute plus habile d'utiliser la commande |\@highLight| de
-\pkg{lua-ul}: cette commande bascule vers un fond jaune jusqu'à la fin du groupe TeX courant. Comme le nom de cette
-commande contient le caractère |@|, il convient de lui donner un synonyme sans caractère |@| pour pouvoir
-l'utiliser directement dans |{Piton}|.
-
-\begingroup
-\fvset{commandchars=\~\#\+,formatcom=\color{gray}}
-\begin{Verbatim}
-\makeatletter
-~emphase#\let\Jaune\@highLight+
-\makeatother
-\end{Verbatim}
-\endgroup
-
-\begin{Verbatim}
-\begin{Piton}
-def fact(n):
- if n==0:
- return 1
- else:
- ~emphase#$\Jaune$@return n*fact(n-1)
-\end{Piton}
-\end{Verbatim}
-
-\makeatletter
-\let\Jaune\@highLight
-\makeatother
-
-
-\begin{Piton}
-def fact(n):
- if n==0:
- return 1
- else:
- $\Jaune$return n*fact(n-1)
-\end{Piton}
-
-
-
-\bigskip
-\emph{Attention} : L'échappement vers LaTeX permis par les caractères de |escape-inside| n'est pas actif dans les
-chaînes de caractères ni dans les commentaires (pour avoir un commentaire entièrement en échappement vers LaTeX,
-c'est-à-dire ce qui est
-appelé dans ce document «commentaire LaTeX», il suffit de le faire débuter par |#>|).
-
-
-
-
-\subsection{Comportement dans la classe Beamer}
-
-\label{beamer}
-
-\emph{Première remarque}\par\nobreak
-Remarquons que, comme l'environnement |{Piton}| prend son argument selon un mode verbatim, il convient, ce qui
-n'est pas surprenant, de l'utiliser dans des environnements |{frame}| de Beamer protégés par la clé |fragile|.\footnote{On
- rappelle que pour un environnement |{frame}| de Beamer qui utilise la clé |fragile|, l'instruction |\end{frame}|
- doit être seule sur une ligne (à l'exception d'éventuels espaces en début de ligne).}
-
-
-\medskip
-Quand l'extension \pkg{piton} est utilisée dans la classe \cls{beamer}\footnote{L'extension \pkg{piton} détecte la
- classe \cls{beamer} mais il est aussi possible, si le besoin s'en faisait sentir, d'activer ce comportement avec
- la clé |beamer| au chargement de \pkg{piton} : |\usepackage[beamer]{piton}|}, le comportement de \pkg{piton} est
-légèrement modifié, comme décrit maintenant.
-
-\subsubsection{\{Piton\} et \textbackslash PitonInputFile sont ``overlay-aware''}
-
-Quand \pkg{piton} est utilisé avec Beamer, l'environnement |{Piton}| et la commande |\PitonInputFile| acceptent
-l'argument optionnel |<...>| de Beamer pour indiquer les «\emph{overlays}» concernés.
-
-On peut par exemple écrire :
-
-\begin{Verbatim}
-\begin{Piton}~emphase#<2-5>@
-...
-\end{Piton}
-\end{Verbatim}
-
-ou aussi
-
-\begin{Verbatim}
-\PitonInputFile~emphase#<2-5>@{mon_fichier.py}
-\end{Verbatim}
-
-
-\subsubsection{Commandes de Beamer reconnues dans \{Piton\} et \textbackslash PitonInputFile}
-
-Quand \pkg{piton} est utilisé dans la classe \cls{beamer}, les commandes suivantes de \cls{beamer} (classées selon
-leur nombre d'arguments obligatoires) sont directement reconnues dans les environnements |{Piton}| (ainsi que dans
-les listings composés par la commande |\PitonInputFile|, même si c'est sans doute moins utile).
-%
-\begin{itemize}
-\item aucun argument obligatoire : |\pause|\footnote{On remarquera que, bien sûr, on peut aussi utiliser |\pause|
- dans un «commentaire LaTeX», c'est-à-dire en écrivant |#> \pause|. Ainsi, si le code Python est copié, il est
- interprétable par Python.} ;
-\item un argument obligatoire : |\action|, |\alert|, |\invisible|, |\only|, |\uncover| et |\visible| ;
-\item deux arguments obligatoire : |\alt| ;
-\item trois arguments obligatoires : |\temporal|.
-\end{itemize}
-
-\medskip
-Les accolades dans les arguments obligatoires de ces commandes doivent être équilibrées (cependant, les accolades
-présentes dans des chaînes courtes\footnote{Les chaînes courtes de Python sont les chaînes (string) délimitées par
- les caractères \texttt{'} ou \texttt{"} non triplés. En Python, les chaînes de caractères courtes ne peuvent pas
- s'étendre sur plusieurs lignes de code.} de Python ne sont pas prises en compte).
-
-
-\medskip
-Voici un exemple complet de fichier :
-
-\begin{Verbatim}[formatcom = \small\color{gray}]
-\documentclass{beamer}
-\usepackage{piton}
-\begin{document}
-\begin{frame}[fragile]
-\begin{Piton}
-def string_of_list(l):
- """Convertit une liste de nombres en chaîne"""
-~emphase# \only<2->{s = "{" + str(l[0])}@
-~emphase# \only<3->{for x in l[1:]: s = s + "," + str(x)}@
-~emphase# \only<4->{s = s + "}"}@
- return s
-\end{Piton}
-\end{frame}
-\end{document}
-\end{Verbatim}
-
-Dans l'exemple précédent, les accolades des deux chaînes de caractères Python |"{"| et |"}"| sont correctement
-interprétées (sans aucun caractère d'échappement).
-
-
-
-\bigskip
-\subsubsection{Environnements de Beamer reconnus dans \{Piton\} et \textbackslash PitonInputFile}
-
-Quand \pkg{piton} est utilisé dans la classe \pkg{beamer}, les environnements suivants de Beamer sont directement
-reconnus dans les environnements |{Piton}| (ainsi que dans les listings composés par la commande |\PitonInputFile|
-même si c'est sans doute moins utile) : |{actionenv}|, |{alertenv}|, |{invisibleenv}|, |{onlyenv}|, |{uncoverenv}|
-et |{visibleenv}|.
-
-
-\medskip
-Il y a néanmoins une restriction : ces environnements doivent englober des \emph{lignes entières de code Python}.
-
-
-\medskip
-On peut par exemple écrire :
-
-\begin{Verbatim}[formatcom = \small\color{gray}]
-\documentclass{beamer}
-\usepackage{piton}
-\begin{document}
-\begin{frame}[fragile]
-\begin{Piton}
-def carré(x):
- """Calcule le carré de l'argument"""
- ~emphase#\begin{uncoverenv}<2>@
- return x*x
- ~emphase#\end{uncoverenv}@
-\end{Piton}
-\end{frame}
-\end{document}
-\end{Verbatim}
-
-
-
-\vspace{1cm}
-\textbf{Remarque à propos de la commande \textbackslash alert et de l'environnement \{alertenv\} de Beamer}\par\nobreak
-
-\smallskip
-Beamer propose un moyen aisé de changer la couleur utilisée par l'environnement |{alertenv}| (et par la commande
-|\alert| qui s'appuie dessus). Par exemple, on peut écrire:
-
-\begin{Verbatim}
-\setbeamercolor{~emphase#alerted text@}{fg=blue}
-\end{Verbatim}
-
-Néanmoins, dans le cas d'une utilisation à l'intérieur d'un environnement |{Piton}| un tel réglage n'est sans doute
-pas pertinent, puisque, justement, \pkg{piton} va (le plus souvent) changer la couleur des élements selon leur
-valeur lexicale. On préfèrera sans doute un environnement |{alertenv}| qui change la couleur de fond des
-éléments à mettre en évidence.
-
-\smallskip
-Voici un code qui effectuera ce travail en mettant un fond jaune. Ce code utilise la commande |\@highLight| de
-l'extension \pkg{lua-ul} (cette extension nécessite elle-même l'extension \pkg{luacolor}).
-
-\begingroup
-\fvset{commandchars=\~\#\+,formatcom=\color{gray}}
-\begin{Verbatim}
-\setbeamercolor{alerted text}{bg=yellow!50}
-\makeatletter
-\AddToHook{env/Piton/begin}
- {\renewenvironment<>{alertenv}{\only~#1{~emphase#\@highLight+[alerted text.bg]}}{}}
-\makeatother
-\end{Verbatim}
-\endgroup
-
-Ce code redéfinit localement l'environnement |{alertenv}| à l'intérieur de l'environnement |{Piton}| (on rappelle
-que la commande |\alert| s'appuie sur cet environnement |{alertenv}|).
-
-
-
-\bigskip
-\subsection{Coupure des pages et des lignes}
-
-\label{breakable}
-
-\subsubsection{Coupure des pages}
-
-Par défaut les listings produits par l'environnement |{Piton}| et par la commande |\PitonInputFile| sont
-insécables.
-
-Néanmoins, la commande |\PitonOptions| propose la clé |splittable| pour autoriser de telles coupures.
-
-\begin{itemize}
-\item Si la clé |splittable| est utilisée sans valeur, les listings sont sécables n'importe où.
-
-\item Si la clé |splittable| est utilisée avec une valeur numérique $n$ (qui doit être un entier naturel non nul),
-alors les listings seront sécables mais aucune coupure ne pourra avoir lieu entre les $n$~premières lignes, ni
-entre les $n$~dernières. De ce fait, |splittable=1| est équivalent à |splittable|.
-\end{itemize}
-
-\medskip
-\emph{Remarque}\par\nobreak
-
-Même avec une couleur de fond (fixée avec |background-color|), les sauts de page sont possibles, à partir du moment
-où la clé |splittable| est utilisée.\footnote{Avec la clé |splittable|, un environnement |{Piton}| est sécable même dans un environnement de
- \pkg{tcolorbox} (à partir du moment où la clé |breakable| de \pkg{tcolorbox} est utilisée). On précise cela parce
- que, en revanche, un environnement de \pkg{tcolorbox} inclus dans un autre environnement de \pkg{tcolorbox} n'est
- pas sécable, même quand les deux utilisent la clé |breakable|.}
-
-\subsubsection{Coupure des lignes}
-
-\label{line-breaks}
-
-Par défaut, les éléments produits par \pkg{piton} ne peuvent pas être coupés par une fin de ligne. Il existe
-néanmoins des clés pour autoriser de telles coupures (les points de coupure possibles sont les espaces, y compris
-les espaces dans les chaînes Python).
-\begin{itemize}
-\item Avec la clé |break-lines-in-piton|, les coupures de ligne sont autorisées dans la commande |\piton{...}|
-(mais pas dans la commande \verb+\piton|...|+, c'est-à-dire avec la syntaxe verbatim).
-
-\item Avec la clé |break-lines-in-Piton|, les coupures de ligne sont autorisées dans l'environnement |{Piton}|
-(d'où la lettre |P| capitale dans le nom) et dans les listings produits par |\PitonInputFile|.
-
-\item La clé |break-lines| est la conjonction des deux clés précédentes.
-\end{itemize}
-
-\medskip
-L'extension \pkg{piton} fournit aussi plusieurs clés pour contrôler l'apparence des coupures de ligne autorisées par |break-lines-in-Piton|.
-
-\begin{itemize}
-\item Avec la clé |indent-broken-lines|, l'indentation de la ligne coupée est respectée à chaque retour à la ligne.
-
-\item La clé |end-of-broken-line| correspond au symbole placé à la fin d'une ligne coupée. Sa valeur initiale est :
-|\hspace*{0.5em}\textbackslash|.
-
-\item La clé |continuation-symbol| correspond au symbole placé à chaque retour de ligne dans la marge gauche. Sa
-valeur initiale est : |+\;|.
-
-\item La clé |continuation-symbol-on-indentation| correspond au symbole placé à chaque retour de ligne au niveau de
-l'indentation (uniquement dans le cas où la clé |indent-broken-lines| est active). Sa valeur initiale est :
-|$\hookrightarrow\;$|.
-\end{itemize}
-
-\bigskip
-Le code suivant a été composé dans une |{minipage}| standard de LaTeX de largeur 12~cm avec le réglage suivant :
-
-\begin{Verbatim}
-\PitonOptions{break-lines,indent-broken-lines,background-color=gray!15}
-\end{Verbatim}
-
-\begin{center}
-\PitonOptions{break-lines,indent-broken-lines,background-color=gray!15}
-\begin{minipage}{12cm}
-\begin{Piton}
-def dict_of_liste(liste):
- """Convertit une liste de subrs et de descriptions de glyphes en dictionnaire"""
- dict = {}
- for liste_lettre in liste:
- if (liste_lettre[0][0:3] == 'dup'): # si c'est un subr
- nom = liste_lettre[0][4:-3]
- print("On traite le subr de numéro " + nom)
- else:
- nom = liste_lettre[0][1:-3] # si c'est un glyphe
- print("On traite le glyphe du caractère " + nom)
- dict[nom] = [traite_ligne_Postscript(k) for k in liste_lettre[1:-1]]
- return dict
-\end{Piton}
-\end{minipage}
-\end{center}
-
-
-
-\bigskip
-\subsection{Notes de pied de page dans les environnements de piton}
-
-\label{footnote}
-
-Si vous voulez mettre des notes de pied de page dans un environnement de \pkg{piton} (ou bien dans un listing
-produit par |\PitonInputFile|, bien que cela paraisse moins pertinent dans ce cas-là) vous pouvez utiliser une
-paire |\footnotemark|--|\footnotetext|.
-
-\smallskip
-Néanmoins, il est également possible d'extraire les notes de pieds de page avec l'extension \pkg{footnote} ou bien
-l'extension \pkg{footnotehyper}.
-
-\smallskip
-Si \pkg{piton} est chargée avec l'option |footnote| (avec |\usepackage[footnote]{piton}|) l'extension
-\pkg{footnote} est chargée (si elle ne l'est pas déjà) et elle est utilisée pour extraire les notes de pied de
-page.
-
-\smallskip
-Si \pkg{piton} est chargée avec l'option |footnotehyper|, l'extension \pkg{footnotehyper} est chargée (si
-elle ne l'est pas déjà) et elle est utilisée pour extraire les notes de pied de page.
-
-\smallskip
-Attention : Les extensions \pkg{footnote} et \pkg{footnotehyper} sont incompatibles.
-L'extension \pkg{footnotehyper} est le successeur de l'extension \pkg{footnote}
-et devrait être utilisée préférentiellement. L'extension \pkg{footnote} a quelques défauts ;
-en particulier, elle doit être chargée après l'extension \pkg{xcolor} et elle n'est pas parfaitement
-compatible avec \pkg{hyperref}.
-
-\medskip
-Dans ce document, l'extension \pkg{piton} a été chargée avec l'option |footnotehyper| et c'est pourquoi des notes
-peuvent être mises dans les environnements |{Piton}| : voir un exemple sur la première page de ce document.
-
-\subsection{Tabulations}
-
-\smallskip
-Même s'il est recommandé d'indenter les listings Python avec des espaces (cf. PEP~8), \pkg{piton} accepte les
-caractères de tabulations (U+0009) en début de ligne. Chaque caractère U+0009 est remplacé par $n$ espaces. La
-valeur initiale de~$n$ est~4 mais on peut la changer avec la clé |tab-size| de |\PitonOptions|.
-
-\smallskip
-Il existe aussi une clé |tabs-auto-gobble| qui détermine le nombre minimal de caractères U+0009 débutant chaque
-ligne (non vide) de l'environnement |{Piton}| et applique |gobble| avec cette valeur (avant le remplacement des
-caractères U+0009 par des espaces, bien entendu). Cette clé est donc similaire à la clé |auto-gobble| mais agit sur
-des caractères U+0009 au lieu de caractères U+0020 (espaces).
-
-\section{Exemples}
-
-
-\subsection{Numérotation des lignes}
-
-\label{example-numbering}
-
-On rappelle que l'on peut demander la numérotation des lignes des listings avec la clé |line-numbers| ou la clé |all-line-numbers|.
-
-Par défaut, les numéros de ligne sont composés par \pkg{piton} en débordement à gauche (en utilisant en interne la commande |\llap| de LaTeX).
-
-Si on ne veut pas de débordement, on peut utiliser l'option |left-margin=auto| qui va insérer une marge adaptée aux
-numéros qui seront insérés (elle est plus large quand les numéros dépassent 10).
-
-
-\begingroup
-\fvset{commandchars=\~\&\@,formatcom=\small\color{gray}}
-\begin{Verbatim}
-~emphase&\PitonOptions{background-color=gray!10, left-margin = auto, line-numbers}@
-\begin{Piton}
-def arctan(x,n=10):
- if x < 0:
- return -arctan(-x) #> (appel récursif)
- elif x > 1:
- return pi/2 - arctan(1/x) #> (autre appel récursif)
- else:
- return sum( (-1)**k/(2*k+1)*x**(2*k+1) for k in range(n) )
-\end{Piton}
-\end{Verbatim}
-\endgroup
-
-
-
-\begingroup
-\PitonOptions{background-color=gray!10,left-margin = auto, line-numbers}
-\begin{Piton}
-def arctan(x,n=10):
- if x < 0:
- return -arctan(-x) #> (appel récursif)
- elif x > 1:
- return pi/2 - arctan(1/x) #> (autre appel récursif)
- else:
- return sum( (-1)**k/(2*k+1)*x**(2*k+1) for k in range(n) )
-\end{Piton}
-\endgroup
-
-
-\bigskip
-
-\subsection{Formatage des commentaires LaTeX}
-
-\label{example-comments}
-
-On peut modifier le style |Comment.LaTeX| (avec |\SetPitonStyle|) pour faire afficher les commentaires
-LaTeX (qui débutent par |#>|) en butée à droite.
-
-\begingroup
-\fvset{commandchars=\~\&\@,formatcom=\small\color{gray}}
-\begin{Verbatim}
-\PitonOptions{background-color=gray!10}
-~emphase&\SetPitonStyle{Comment.LaTeX = \hfill \normalfont\color{gray}}@
-\begin{Piton}
-def arctan(x,n=10):
- if x < 0:
- return -arctan(-x) #> appel récursif
- elif x > 1:
- return pi/2 - arctan(1/x) #> autre appel récursif
- else:
- return sum( (-1)**k/(2*k+1)*x**(2*k+1) for k in range(n) )
-\end{Piton}
-\end{Verbatim}
-\endgroup
-
-\begingroup
-\PitonOptions{background-color=gray!10}
-\SetPitonStyle{Comment.LaTeX = \hfill \normalfont\color{gray}}
-\begin{Piton}
-def arctan(x,n=10):
- if x < 0:
- return -arctan(-x) #> appel récursif
- elif x > 1:
- return pi/2 - arctan(1/x) #> autre appel récursif
- else:
- return sum( (-1)**k/(2*k+1)*x**(2*k+1) for k in range(n) )
-\end{Piton}
-\endgroup
-
-
-\vspace{1cm}
-On peut aussi faire afficher les commentaires dans une deuxième colonne à droite si on limite la largeur du code
-proprement dit avec un environnement |{minipage}| de LaTeX.
-
-
-\begingroup
-\fvset{commandchars=\~\&\@,formatcom=\small\color{gray}}
-\begin{Verbatim}
-\PitonOptions{background-color=gray!10}
-~emphase&\NewDocumentCommand{\MyLaTeXCommand}{m}{\hfill \normalfont\itshape\rlap{\quad #1}}@
-~emphase&\SetPitonStyle{Comment.LaTeX = \MyLaTeXCommand}@
-~emphase&\begin{minipage}{12cm}@
-\begin{Piton}
-def arctan(x,n=10):
- if x < 0:
- return -arctan(-x) #> appel récursif
- elif x > 1:
- return pi/2 - arctan(1/x) #> autre appel récursif
- else:
- s = 0
- for k in range(n):
- s += (-1)**k/(2*k+1)*x**(2*k+1)
- return s
-\end{Piton}
-~emphase&\end{minipage}@
-\end{Verbatim}
-\endgroup
-
-
-
-\begingroup
-\PitonOptions{background-color=gray!10}
-\NewDocumentCommand{\MyLaTeXCommand}{m}{\hfill \normalfont\itshape\rlap{\quad #1}}
-\SetPitonStyle{Comment.LaTeX = \MyLaTeXCommand}
-\begin{minipage}{12cm}
-\begin{Piton}
-def arctan(x,n=10):
- if x < 0:
- return -arctan(-x) #> appel récursif
- elif x > 1:
- return pi/2 - arctan(1/x) #> autre appel récursif
- else:
- s = 0
- for k in range(n):
- s += (-1)**k/(2*k+1)*x**(2*k+1)
- return s
-\end{Piton}
-\end{minipage}
-\endgroup
-
-\bigskip
-
-\subsection{Notes dans les listings}
-
-Pour pouvoir extraire les notes (introduites par |\footnote|), l'extension |piton| doit être chargée, soit avec la
-clé |footnote|, soit avec la clé |footnotehyper|, comme expliqué à la section \ref{footnote} p.~\pageref{footnote}.
-Dans le présent document, l'extension \pkg{piton} a été chargée par la clé |footnotehyper|.
-
-Bien entendu, une commande |\footnote| ne peut apparaître que dans un commentaire LaTeX (qui débute par |#>|). Un
-tel commentaire peut se limiter à cette unique commande |\footnote|, comme dans l'exemple suivant.
-
-\begingroup
-\fvset{commandchars=\~\&\@,formatcom=\small\color{gray}}
-\begin{Verbatim}
-\PitonOptions{background-color=gray!10}
-\begin{Piton}
-def arctan(x,n=10):
- if x < 0:
- return -arctan(-x)~emphase&#>\footnote{Un premier appel récursif.}]@
- elif x > 1:
- return pi/2 - arctan(1/x)~emphase&#>\footnote{Un deuxième appel récursif.}@
- else:
- return sum( (-1)**k/(2*k+1)*x**(2*k+1) for k in range(n) )
-\end{Piton}
-\end{Verbatim}
-\endgroup
-
-\begingroup
-\PitonOptions{background-color=gray!10}
-\begin{Piton}
-def arctan(x,n=10):
- if x < 0:
- return -arctan(-x)#>\footnote{Un premier appel récursif.}
- elif x > 1:
- return pi/2 - arctan(1/x)#>\footnote{Un deuxième appel récursif.}
- else:
- return sum( (-1)**k/(2*k+1)*x**(2*k+1) for k in range(n) )
-\end{Piton}
-\endgroup
-
-
-\vspace{1cm}
-
-Si on utilise l'environnement |{Piton}| dans un environnement |{minipage}| de LaTeX, les notes sont, bien entendu,
-composées au bas de l'environnement |{minipage}|. Rappelons qu'une telle |{minipage}| ne peut être coupée par un
-saut de page.
-
-
-\begingroup
-\fvset{commandchars=\~\&\@,formatcom=\small\color{gray}}
-\begin{Verbatim}
-\PitonOptions{background-color=gray!10}
-\emphase\begin{minipage}{\linewidth}
-\begin{Piton}
-def arctan(x,n=10):
- if x < 0:
- return -arctan(-x)~emphase&#>\footnote{Un premier appel récursif.}@
- elif x > 1:
- return pi/2 - arctan(1/x)~emphase&#>\footnote{Un deuxième appel récursif.}@
- else:
- return sum( (-1)**k/(2*k+1)*x**(2*k+1) for k in range(n) )
-\end{Piton}
-\end{minipage}
-\end{Verbatim}
-\endgroup
-
-\begingroup
-\PitonOptions{background-color=gray!10}
-\begin{minipage}{\linewidth}
-\begin{Piton}
-def arctan(x,n=10):
- if x < 0:
- return -arctan(-x)#>\footnote{Un premier appel récursif.}
- elif x > 1:
- return pi/2 - arctan(1/x)#>\footnote{Un deuxième appel récursif.}
- else:
- return sum( (-1)**k/(2*k+1)*x**(2*k+1) for k in range(n) )
-\end{Piton}
-\end{minipage}
-\endgroup
-
-
-\vspace{1cm}
-Si on encapsule l'environnement |{Piton}| dans un environnement |{minipage}| pour, typiquement, limiter la largeur
-d'un fond coloré, il faut encadrer l'ensemble dans un environnement |{savenotes}| (de \pkg{footnote} ou
-\pkg{footnotehyper}) si on veut avoir les notes reportées en pied de page.
-
-\begingroup
-\fvset{commandchars=\~\&\@,formatcom=\small\color{gray}}
-\begin{Verbatim}
-\PitonOptions{background-color=gray!10}
-~emphase&\begin{savenotes}@
-\begin{minipage}{13cm}
-\begin{Piton}
-def arctan(x,n=10):
- if x < 0:
- return -arctan(-x)~emphase&#>\footnote{Un premier appel récursif.}@
- elif x > 1:
- return pi/2 - arctan(1/x)~emphase&#>\footnote{Un deuxième appel récursif.}@
- else:
- return sum( (-1)**k/(2*k+1)*x**(2*k+1) for k in range(n) )
-\end{Piton}
-\end{minipage}
-~emphase&\end{savenotes}@
-\end{Verbatim}
-\endgroup
-
-
-
-\begin{savenotes}
-\PitonOptions{background-color=gray!10}
-\begin{minipage}{13cm}
-\begin{Piton}
-def arctan(x,n=10):
- if x < 0:
- return -arctan(-x)#>\footnote{Un premier appel récursif.}
- elif x > 1:
- return pi/2 - arctan(1/x)#>\footnote{Un deuxième appel récursif.}
- else:
- return sum( (-1)**k/(2*k+1)*x**(2*k+1) for k in range(n) )
-\end{Piton}
-\end{minipage}
-\end{savenotes}
-
-\bigskip
-
-\subsection{Un exemple de réglage des styles}
-
-Les styles graphiques ont été présentés à la partie \ref{styles}, p.~\pageref{styles}.
-
-\smallskip
-On présente ici un réglage de ces styles adapté pour les documents en noir et blanc. On l'utilise avec la fonte
-\emph{DejaVu Sans Mono}\footnote{Voir: \url{https://dejavu-fonts.github.io}} spécifiée avec la commande
- |\setmonofont| de \pkg{fontspec}.
-
-Ce réglage utilise la commande |\highLight| de \pkg{lua-ul} (cette extension nécessite elle-même l'extension \pkg{luacolor}).
-
-
-\begin{Verbatim}
-\setmonofont[Scale=0.85]{DejaVu Sans Mono}
-
-\SetPitonStyle
- {
- Number = ,
- String = \itshape ,
- String.Doc = \color{gray} \itshape ,
- Operator = ,
- Operator.Word = \bfseries ,
- Name.Builtin = ,
- Name.Function = \bfseries \highLight[gray!20] ,
- Comment = \color{gray} ,
- Comment.LaTeX = \normalfont \color{gray},
- Keyword = \bfseries ,
- Name.Namespace = ,
- Name.Class = ,
- Name.Type = ,
- InitialValues = \color{gray}
- }
-\end{Verbatim}
-
-
-\begingroup
-
-
-\setmonofont[Scale=0.85]{DejaVu Sans Mono}
-
-\SetPitonStyle
- {
- Number = ,
- String = \itshape ,
- String.Doc = \color{gray} \itshape ,
- Operator = ,
- Operator.Word = \bfseries ,
- Name.Builtin = ,
- Name.Function = \bfseries \highLight[gray!20] ,
- Comment = \color{gray} ,
- Comment.LaTeX = \normalfont \color{gray},
- Keyword = \bfseries ,
- Name.Namespace = ,
- Name.Class = ,
- Name.Type = ,
- InitialValues = \color{gray}
- }
-
-
-\bigskip
-
-\begin{Piton}
-from math import pi
-
-def arctan(x,n=10):
- """Compute the mathematical value of arctan(x)
-
- n is the number of terms in the sum
- """
- if x < 0:
- return -arctan(-x) # appel récursif
- elif x > 1:
- return pi/2 - arctan(1/x)
- #> (on a utilisé le fait que $\arctan(x)+\arctan(1/x)=\pi/2$ pour $x>0$)
- else:
- s = 0
- for k in range(n):
- s += (-1)**k/(2*k+1)*x**(2*k+1)
- return s
-\end{Piton}
-
-
-\endgroup
-
-\section{Utilisation avec pyluatex}
-
-\subsection{Utilisation standard de pyluatex}
-
-L'extension \pkg{pyluatex} est une extension qui permet l'exécution de code Python à partir de |lualatex| (pourvu
-que Python soit installé sur la machine et que la compilation soit effectuée avec |lualatex| et |--shell-escape|).
-
-Voici, à titre d'exemple, un environnement |{PitonExecute}| qui formate un listing Python (avec \pkg{piton}) et qui
-affiche également dessous le résultat de l'exécution de ce code avec Python.
-
-
-\begin{Verbatim}
-\ExplSyntaxOn
-\NewDocumentEnvironment { ~emphase#PitonExecute@ } { ! O { } } % le ! est obligatoire
- {
- \PyLTVerbatimEnv
- \begin{pythonq}
- }
- {
- \end{pythonq}
- \directlua
- {
- tex.print("\\PitonOptions{~#1}")
- tex.print("\\begin{Piton}")
- tex.print(pyluatex.get_last_code())
- tex.print("\\end{Piton}")
- tex.print("")
- }
- \begin{center}
- \directlua{tex.print(pyluatex.get_last_output())}
- \end{center}
- }
-\ExplSyntaxOff
-\end{Verbatim}
-
-\ExplSyntaxOn
-\NewDocumentEnvironment { PitonExecute } { ! O { } }
- {
- \PyLTVerbatimEnv
- \begin{pythonq}
- }
- {
- \end{pythonq}
- \directlua
- {
- tex.print("\\PitonOptions{#1}")
- tex.print("\\begin{Piton}")
- tex.print(pyluatex.get_last_code())
- tex.print("\\end{Piton}")
- tex.print("")
- }
- \begin{center}
- \directlua{tex.print(pyluatex.get_last_output())}
- \end{center}
- }
-\ExplSyntaxOff
-
-Cet environnement |{PitonExecute}| prend en argument optionnel (entre crochets) les options proposées par la
-commande |\PitonOptions|.
-
-\bigskip
-Voici un exemple d'utilisation de cet environnement |{PitonExecute}| :
-
-\begin{Verbatim}
-\begin{~emphase#PitonExecute@}[background-color=gray!15]
-def square(x):
- return x*x
-print(f'Le carré de 12 est {square(12)}.')
-\end{~emphase#PitonExecute@}
-\end{Verbatim}
-
-
-\medskip
-\begin{PitonExecute}[background-color=gray!15]
-def square(x):
- return x*x
-print(f'Le carré de 12 est {square(12)}.')
-\end{PitonExecute}
-
-\bigskip
-
-\subsection{Utilisation de l'environnement \{pythonrepl\} de pyluatex}
-
-\label{pythonrepl}
-
-L'environnement |{pythonrepl}| de \pkg{pyluatex} passe son contenu à Python et renvoie ce que l'on obtient quand on
-fournit ce code à une boucle \textsc{repl} (\emph{read-eval-print loop}) de Python. On obtient un entrelacement
-d'instructions précédées par le prompt |>>>| de Python et des valeurs renvoyées par Python (et de ce qui a été
-demandé d'être affiché avec des \piton{print} de Python).
-
-\medskip
-Il est ensuite possible de passer cela à un environnement |{Piton}| qui va faire un coloriage syntaxique
-et mettre sur fond grisé les lignes correspondant aux instructions fournies à l'interpréteur Python (gràce à la clé
-|prompt-background-color| de |\PitonOptions|).
-
-
-\medskip
-Voici la programmation d'un environnement |{PitonREPL}| qui effectue ce travail (pour des raisons techniques, le
-|!| est ici obligatoire dans la signature de l'environnement).
-
-\begin{Verbatim}
-\NewDocumentEnvironment { PitonREPL } { ! O { } } % le ! est obligatoire
- {
- \PitonOptions
- { background-color=white,
- ~emphase#prompt-background-color = gray!10@,
- ~#1
- }
- \PyLTVerbatimEnv
- \begin{pythonrepl}
- }
- {
- \directlua
- {
- tex.print("\\begin{Piton}")
- tex.print(pyluatex.get_last_output())
- tex.print("\\end{Piton}")
- tex.print("")
- }
- \end{pythonrepl}
- }
-\end{Verbatim}
-
-\medskip
-Voici un exemple d'utilisation de ce nouvel environnement |{PitonREPL}|.
-
-\medskip
-\begin{Verbatim}
-~emphase#\begin{PitonREPL}@
- def valeur_absolue(x):
- "Renvoie la valeur absolue de x"
- if x > 0:
- return x
- else:
- return -x
-
- valeur_absolue(-3)
- valeur_absolue(0)
- valeur_absolue(5)
-~emphase#\end{PitonREPL}@
-\end{Verbatim}
-
-\bigskip
-
-
-\NewDocumentEnvironment { PitonREPL } { }
- {
- \PitonOptions{background-color=white,prompt-background-color = gray!10}
- \PyLTVerbatimEnv
- \begin{pythonrepl}
- }
- {
- \directlua
- {
- tex.print("\\begin{Piton}")
- tex.print(pyluatex.get_last_output())
- tex.print("\\end{Piton}")
- tex.print("")
- }
- \end{pythonrepl}
- }
-
-
-\begin{PitonREPL}
- def valeur_absolue(x):
- "Renvoie la valeur absolue de x"
- if x > 0:
- return x
- else:
- return -x
-
- valeur_absolue(-3)
- valeur_absolue(0)
- valeur_absolue(5)
-\end{PitonREPL}
-
-
-\bigskip
-En fait, il est possible de ne pas faire afficher les prompts eux-mêmes (c'est-à-dire les chaînes de caractères
-|>>>| et |...|). En effet, \pkg{piton} propose un style pour ces éléments, qui est appelé |Prompt|. Par défaut, la
-valeur de ce style est vide, ce qui fait qu'aucune action n'est exécutée sur ces éléments qui sont donc affichés
-tels quels. En fournissant comme valeur une fonction qui se contente de gober son argument, on peut demander à ce
-qu'ils ne soient pas affichés.
-
-\bigskip
-\begin{savenotes}
-\begin{Verbatim}
-\NewDocumentCommand{\Gobe}{m}{}#~color#black@~footnote#On a défini ici une fonction ~texttt#~string~Gobe@ mais, en fait, elle existe déjà en L3 sous le nom ~texttt#~string~use~_none:n@.@@
-\SetPitonStyle{ ~emphase#Prompt = \Gobe@ }
-\end{Verbatim}
-\end{savenotes}
-
-
-
-
-\NewDocumentCommand{\Gobe}{m}{}
-\ExplSyntaxOn
-\SetPitonStyle{ Prompt = \use_none:n }
-\ExplSyntaxOff
-
-\bigskip
-L'exemple précédent donne alors :
-
-\medskip
-\begin{Verbatim}
-~emphase#\begin{PitonREPL}@
- def valeur_absolue(x):
- "Renvoie la valeur absolue de x"
- if x > 0:
- return x
- else:
- return -x
-
- valeur_absolue(-3)
- valeur_absolue(0)
- valeur_absolue(5)
-~emphase#\end{PitonREPL}@
-\end{Verbatim}
-
-
-
-\begin{PitonREPL}
- def valeur_absolue(x):
- "Renvoie la valeur absolue de x"
- if x > 0:
- return x
- else:
- return -x
-
- valeur_absolue(-3)
- valeur_absolue(0)
- valeur_absolue(5)
-\end{PitonREPL}
-
-
-
-\section*{Autre documentation}
-
-Le document |piton.pdf| (fourni avec l'extension \pkg{piton}) contient une traduction anglaise de la
-documentation ici présente, ainsi que le code source commenté et un historique des versions.
-
-
-\tableofcontents
-
+% -*- coding: utf-8 ; -*-
+\documentclass[dvipsnames]{article}
+
+\usepackage{fontspec}
+
+\usepackage[french]{babel}
+\frenchsetup{og = « , fg = »}
+
+\usepackage[footnotehyper,escape-inside=$$,math-comments]{piton}
+
+\usepackage[executable=python.exe]{pyluatex}
+
+\usepackage{xcolor}
+
+\usepackage{geometry}
+\geometry{left=2.8cm,right=2.8cm,top=2.5cm,bottom=2.5cm,papersize={21cm,29.7cm}}
+
+\usepackage{enumitem}
+\usepackage{verbatim}
+\usepackage{amsmath}
+\usepackage{tabularx}
+\usepackage{booktabs}
+\usepackage{tcolorbox}
+\usepackage{luacolor,lua-ul}
+
+\usepackage{caption}
+
+% We use \MakeShortVerb of shortvrb and not \DefineShortVerb of fancyvrb
+% because we don't want the contents of short verbatim colored in gray
+\usepackage{shortvrb}
+\MakeShortVerb{\|}
+
+\usepackage{varwidth}
+
+\skip\footins = 2\bigskipamount
+
+\usepackage{fancyvrb}
+\fvset{commandchars=\~\#\@,formatcom=\color{gray}}
+\def\emphase{\bgroup\color{RoyalPurple}\let\next=}
+
+
+\usepackage{titlesec}
+\titlespacing*{\section}{0pt}{6.5ex plus 1ex minus .2ex}{4.3ex plus .2ex}
+\titlespacing*{\subsection}{0pt}{4.5ex plus 1ex minus .2ex}{2ex plus .2ex}
+
+\def\interitem{\vspace{7mm plus 2 mm minus 3mm}}
+
+
+\usepackage[hyperfootnotes = false]{hyperref}
+
+\hypersetup
+ {
+ pdfinfo =
+ {
+ Title = L’extension piton ,
+ Subject = Une extension LaTeX ,
+ Author = F. Pantigny
+ }
+ }
+
+
+
+
+\NewDocumentCommand {\pkg} {m} {\textsf{#1}}
+\NewDocumentCommand {\cls} {m} {\textsf{#1}}
+
+\setlength{\parindent}{0pt}
+
+
+\begin{document}
+
+\PitonOptions{splittable = 4}
+
+\VerbatimFootnotes
+
+
+\title{L'extension LaTeX \pkg{piton}\thanks{Ce document correspond à la
+version~\myfileversion\space de \pkg{piton}, à la date du~\myfiledate.}}
+\author{F. Pantigny \\ \texttt{fpantigny@wanadoo.fr}}
+
+\maketitle
+
+\begin{abstract}
+L'extension \pkg{piton} propose des outils pour composer du code Python avec une coloration syntaxique
+en utilisant la bibliothèque Lua LPEG. L'extension \pkg{piton} nécessite l'emploi de LuaLaTeX.
+\end{abstract}
+
+
+
+\section{Présentation}
+
+L'extension \pkg{piton} utilise la librairie Lua nommée LPEG\footnote{LPEG est une librairie de capture de motifs
+ (\emph{pattern-matching} en anglais) pour Lua, écrite en C, fondée sur les PEG (\emph{parsing expression
+ grammars}): \url{http://www.inf.puc-rio.br/~roberto/lpeg/}} pour «parser» le code Python et le composer avec un
+coloriage syntaxique. Comme elle utilise du code Lua, elle fonctionne uniquement avec |lualatex| (et ne va pas
+fonctionner avec les autres moteurs de compilation LaTeX, que ce soit |latex|, |pdflatex| ou |xelatex|). Elle
+n'utilise aucun programme extérieur et la compilation ne requiert donc pas |--shell-escape|. La compilation est
+très rapide puisque tout le travail du parseur est fait par la librairie LPEG, écrite en C.
+
+\bigskip
+Voici un exemple de code Python composé avec l'environnement |{Piton}| proposé par \pkg{piton}.
+
+
+\bigskip
+\begin{Piton}
+from math import pi
+
+def arctan(x,n=10):
+ """Calcule la valeur mathématique de arctan(x)
+
+ n est le nombre de termes de la somme
+ """
+ if x < 0:
+ return -arctan(-x) # appel récursif
+ elif x > 1:
+ return pi/2 - arctan(1/x)
+ #> (on a utilisé le fait que $\arctan(x)+\arctan(1/x)=\pi/2$ pour $x>0$)\footnote{Cet échappement vers LaTeX a été obtenu en débutant par \ttfamily\#>.}
+ else:
+ s = 0
+ for k in range(n):
+ s += (-1)**k/(2*k+1)*x**(2*k+1)
+ return s
+\end{Piton}
+
+
+\bigskip
+
+L'extension LaTeX \pkg{piton} est entièrement contenue dans le fichier |piton.sty|. Ce
+fichier peut être placé dans le répertoire courant ou dans une arborescence |texmf|. Le mieux reste néanmoins
+d'installer \pkg{piton} avec une distribution TeX comme MiKTeX, TeX~Live ou MacTeX.
+
+
+\section{Utilisation de l'extension}
+
+\subsection{Chargement de l'extension}
+
+L'extension \pkg{piton} se charge simplement avec la commande |\usepackage| : |\usepackage{piton}|.
+
+On a cependant deux remarques à formuler :
+\begin{itemize}
+\item l'extension \pkg{piton} utilise l'extension \pkg{xcolor} (mais \pkg{piton} ne charge pas \pkg{xcolor} : si
+\pkg{xcolor} n'est pas chargée avant le |\begin{document}|, une erreur fatale sera levée) ;
+
+\item l'extension \pkg{piton} n'est utilisable qu'avec LuaLaTeX : si un autre moteur de compilation (comme |latex|,
+|pdflatex| ou |xelatex|) est utilisé, une erreur fatale sera levée.
+\end{itemize}
+
+\subsection{Les commandes et environnements à la disposition de l'utilisateur}
+
+L'extension \pkg{piton} fournit plusieurs outils pour composer du code Python: les commandes |\piton|,
+l'environnement |{Piton}| et la commande |\PitonInputFile|.
+
+\begin{itemize} \setlength{\fboxsep}{1pt}
+\item La commande \colorbox{gray!20}{\ttfamily \textbackslash piton} doit être utilisée pour composer de petits éléments de code à l'intérieur d'un
+paragraphe. Par exemple :
+
+{\color{gray}\verb|\piton{def carré(x): return x*x}|}\qquad
+\piton{def carré(x): return x*x}
+
+La syntaxe et les particularités de la commande sont détaillées ci-après.
+
+
+\item L'environnement \colorbox{gray!20}{\ttfamily \{Piton\}} doit être utilisé pour composer des codes de
+plusieurs lignes. Comme cet environnement prend son argument selon un mode verbatim, il ne peut pas être utilisé
+dans l'argument d'une commande LaTeX. Pour les besoins de personnalisation, il est possible de définir de nouveaux
+environnements similaires à |{Piton}| en utilisant la commande |\NewPitonEnvironment| : cf. partie
+\ref{NewPitonEnvironment} p.~\pageref{NewPitonEnvironment}.
+
+\item La commande \colorbox{gray!20}{\ttfamily \textbackslash PitonInputFile} doit être utilisée pour insérer et
+composer un fichier extérieur.
+
+Cette commande prend en argument optionnel entre crochets deux clés |first-line| et |last-line| qui permettent de
+n'insérer que la partie du fichier comprise entre les lignes correspondantes.
+\end{itemize}
+
+
+\subsection{La syntaxe de la commande \textbackslash piton}
+
+
+La commande |\piton| possède en fait une syntaxe double. Elle est peut être utilisée comme une commande standard de
+LaTeX prenant son argument entre accolades (|\piton{...}|), ou bien selon la syntaxe de la commande |\verb| où l'argument est
+délimité entre deux caractères identiques (par ex. : \verb!\piton|...|!). On détaille maintenant ces deux syntaxes.
+
+\bigskip
+\begin{itemize}
+\item {\color{blue} \textsf{Syntaxe} \verb|\piton{...}|}\par\nobreak
+
+Quant son argument est donné entre accolades, la commande |\piton| ne prend pas son argument en mode verbatim. Les
+points suivants doivent être remarqués :
+
+\begin{itemize}
+\item plusieurs espaces successives sont remplacées par une unique espace,
+
+{\color{cyan} mais la commande |\|⣠est fournie pour forcer l'insertion d'une espace} ;
+
+\item il n'est pas possible d'utiliser le caractère |%| à l'intérieur,
+
+{\color{cyan} mais la commande |\%| est fournie pour insérer un |%|} ;
+
+\item les accolades doivent apparaître par paires correctement imbriquées,
+
+{\color{cyan} mais les commandes |\{| et |\}| sont aussi fournies pour insérer des accolades individuelles} ;
+
+\item les commandes LaTeX\footnote{Cela s'applique aux commandes commençant par une contre-oblique |\| mais également aux caractères actifs.} sont
+complètement développées sans être exécutées
+
+{\color{cyan} et on peut donc utiliser |\\| pour insérer une contre-oblique}.
+\end{itemize}
+
+Les autres caractères (y compris |#|, |^|, |_|, |&|, |$| % $
+et |@|) doivent être insérés sans contre-oblique.
+
+\bigskip
+\begin{tabular}{>{\color{gray}}w{l}{75mm}@{\hspace*{1cm}}l}
+\omit Exemples : \hfil \\
+\noalign{\vskip1mm}
+\verb|\piton{ma_chaîne = '\\n'}| &
+\piton{ma_chaîne = '\\n' } \\
+\verb|\piton{def pair(n): return n\%2==0}| &
+\piton{def pair(n): return n\%2==0 } \\
+\verb|\piton{c="#" # une affectation }| &
+\piton{c="#" # une affectation } \\
+\verb|\piton{c="#" \ \ \ # une affectation }| &
+\piton{c="#" \ \ \ # une affectation } \\
+\verb|\piton{my_dict = {'a': 3, 'b': 4}}| &
+\piton{my_dict = {'a': 3, 'b': 4}}
+\end{tabular}
+
+\bigskip
+La commande |\piton| avec son argument entre accolades peut être utilisée dans les arguments des autres commandes LaTeX.\footnote{La commande
+ |\piton| peut par exemple être
+ utilisée dans une note de bas de page. Exemple : \piton{s = 'Une chaîne'}.}
+
+\bigskip
+\item {\color{blue} \textsf{Syntaxe} \verb!\piton|...|!}\par\nobreak
+
+Quand la commande |\piton| prend son argument entre deux caractères identiques, cet argument est pris \emph{en mode
+ verbatim}. De ce fait, avec cette syntaxe, la commande |\piton| ne peut \emph{pas} être utilisée dans l'argument d'une
+autre fonction.
+
+\medskip
+\begin{tabular}{>{\color{gray}}w{l}{75mm}@{\hspace*{1cm}}l}
+\omit Exemples : \hfil \\
+\noalign{\vskip1mm}
+\verb!\piton|ma_chaîne = '\n'|! &
+\piton|ma_chaîne = '\n'| \\
+\verb|\piton!def pair(n): return n%2==0!| &
+\piton!def pair(n): return n%2==0! \\
+\verb|\piton+c="#" # une affectation +| &
+\piton+c="#" # une affectation + \\
+\verb|\piton?my_dict = {'a': 3, 'b': 4}?| &
+\piton!my_dict = {'a': 3, 'b': 4}!
+\end{tabular}
+
+\end{itemize}
+
+
+
+\section{Personnalisation}
+
+\subsection{La commande \textbackslash PitonOptions}
+
+\NewDocumentCommand{\Definition}{m}
+ {{\setlength{\fboxsep}{1pt}\colorbox{gray!20}{\ttfamily \vphantom{gl}#1}}}
+
+
+La commande |\PitonOptions| prend en argument une liste de couples \textsl{clé=valeur}. La portée des réglages
+effectués par cette commande est le groupe TeX courant.\footnote{On rappelle que tout environnement LaTeX est, en particulier, un groupe.}
+
+\begin{itemize}
+\item La clé \Definition{gobble} prend comme valeur un entier positif $n$ : les $n$ premiers caractères de chaque
+ligne sont alors retirés (avant formatage du code) dans les environnements |{Piton}|. Ces $n$ caractères ne sont
+pas nécessairement des espaces.
+
+\item Quand la clé \Definition{auto-gobble} est activée, l'extension \pkg{piton} détermine la valeur minimale $n$
+du nombre d'espaces successifs débutant chaque ligne (non vide) de l'environnement |{Piton}| et applique |gobble|
+avec cette valeur de~$n$.
+
+\item Quand la clé \Definition{env-gobble} est activée, \pkg{piton} analyse la dernière ligne de l'environnement,
+c'est-à-dire celle qui contient le |\end{Piton}| et détermine si cette ligne ne comporte que des espaces suivis par
+|\end{Piton}|. Si c'est le cas, \pkg{piton} calcule le nombre $n$ de ces espaces et applique |gobble| avec cette
+valeur de~$n$. Le nom de cette clé vient de \emph{environment gobble}: le nombre d'espaces à retirer ne dépend que
+de la position des délimiteurs |\begin{Piton}| et |\end{Piton}| de l'environnement.
+
+\item Avec la clé \Definition{line-numbers}, les lignes \emph{non vides} (et toutes les lignes des
+\emph{docstrings}, y compris celles qui sont vides) sont numérotées dans les environnements \verb|{Piton}| et dans
+les listings produits par la commande |\PitonInputFile|.
+
+\item Avec la clé \Definition{all-line-numbers}, \emph{toutes} les lignes sont numérotées, y compris les lignes vides.
+
+\item \colorbox{yellow!50}{\textbf{Nouveau 1.5}}\par\nobreak
+
+La clé \Definition{numbers-sep} est la distance horizontale entre les numéros de lignes (insérés par |line-numbers|
+ou |all-line-numbers|) et les lignes du code informatique. La valeur initiale est 0.7~em.
+
+\item La clé \Definition{left-margin} fixe une marge sur la gauche. Cette clé peut être utile, en particulier, en
+conjonction avec l'une des clés |line-numbers| et |all-line-numbers| si on ne souhaite pas que les numéros de ligne
+soient dans une position en débordement sur la gauche.
+
+Il est possible de donner à la clé |left-margin| la valeur spéciale~|auto|. Avec cette valeur, une marge est
+insérée automatiquement pour les numéros de ligne quand l'une des clés |line-numbers| ou |all-line-numbers| est
+utilisée. Voir un exemple à la partie \ref{example-numbering} p.~\pageref{example-numbering}.
+
+\item Avec la clé \Definition{resume}, le compteur de lignes n'est pas remis à zéro comme il l'est normalement au
+début d'un environnement |{Piton}| ou bien au début d'un listing produit par |\PitonInputFile|. Cela permet de
+poursuivre la numérotation d'un environnement à l'autre.
+
+\item La clé \Definition{background-color} fixe la couleur de fond des environnements |{Piton}| et des listings
+produits par |\PitonInputFile| (ce fond a une largeur égale à la valeur courante de |\linewidth|). La clé
+|background-color| accepte une couleur définie «à la volée», c'est-à-dire que l'on peut écrire par exemple
+|background-color = [cmyk]{0.1,0.05,0,0}|
+
+\smallskip
+\colorbox{yellow!50}{\textbf{Nouveau 1.4}}\enskip La clé |background-color| accepte aussi en argument une
+\emph{liste} de couleurs. Les lignes sont alors coloriées de manière cyclique avec ces couleurs.
+
+\emph{Exemple} : |\PitonOptions{background-color = {gray!5,white}}|
+
+\item Avec la clé \Definition{prompt-background-color}, \pkg{piton} ajoute un fond coloré aux lignes débutant par
+le prompt «|>>>|» (et sa continuation «|...|») caractéristique des consoles Python avec boucle \textsc{repl}
+(\emph{read-only-eval loop}). Pour un exemple d'utilisation de cette clé, voir la partie \ref{pythonrepl}
+p.~\pageref{pythonrepl}.
+
+\item En activant la clé \Definition{show-spaces-in-strings}, les espaces dans les chaînes courtes (c'est-à-dire
+celles délimitées par |'| ou |"|) sont matérialisés par le caractère ⣠(U+2423 : \textsc{open box}). Bien sûr, le
+caractère U+2423 doit être présent dans la fonte mono-chasse utilisée.\footnote{L'extension \pkg{piton} utilise
+ simplement la fonte mono-chasse courante. Pour la changer, le mieux est d'utiliser |\setmonofont| de
+ \pkg{fontspec}.}\par\nobreak
+%
+\begingroup
+\PitonOptions{show-spaces-in-strings}
+Exemple : \piton{my_string = 'Très bonne réponse'}
+\endgroup
+
+\smallskip
+Avec la clé \Definition{show-spaces}, tous les espaces sont matérialisés (et aucune coupure de ligne ne peut plus
+intervenir sur ces espaces matérialisés, même si la clé |break-lines|\footnote{cf. \ref{line-breaks} p.~\pageref{line-breaks}.} est active).
+\end{itemize}
+
+\bigskip
+
+\begingroup
+\fvset{commandchars=\~\&\@,formatcom=\small\color{gray}}
+\begin{Verbatim}
+~emphase&\PitonOptions{line-numbers,auto-gobble,background-color = gray!15}@
+\begin{Piton}
+ from math import pi
+
+ def arctan(x,n=10):
+ """Calcule la valeur mathématique de arctan(x)
+
+ n est le nombre de termes de la somme
+ """
+ if x < 0:
+ return -arctan(-x) # appel récursif
+ elif x > 1:
+ return pi/2 - arctan(1/x)
+ #> (on a utilisé le fait que $\arctan(x)+\arctan(1/x)=\pi/2$ pour $x>0$)
+ else:
+ s = 0
+ for k in range(n):
+ s += (-1)**k/(2*k+1)*x**(2*k+1)
+ return s
+\end{Piton}
+\end{Verbatim}
+\endgroup
+
+
+\begingroup
+\PitonOptions{line-numbers,auto-gobble,background-color = gray!15}
+\begin{Piton}
+ from math import pi
+
+ def arctan(x,n=10):
+ """Compute the value of arctan(x)
+
+ n is the number of terms in the sum
+ """
+ if x < 0:
+ return -arctan(-x) # appel récursif
+ elif x > 1:
+ return pi/2 - arctan(1/x)
+ #> (on a utilisé le fait que $\arctan(x)+\arctan(1/x)=\pi/2$ pour $x>0$)
+ else:
+ s = 0
+ for k in range(n):
+ s += (-1)**k/(2*k+1)*x**(2*k+1)
+ return s
+\end{Piton}
+\endgroup
+
+
+
+\bigskip
+La commande |\PitonOptions| propose d'autres clés qui seront décrites plus loin (voir en particulier la coupure des
+pages et des lignes p.~\pageref{breakable}).
+
+
+\subsection{Les styles}
+
+\label{styles}
+
+L'extension \pkg{piton} fournit la commande |\SetPitonStyle| pour personnaliser les différents styles utilisés pour
+formater les éléments syntaxiques des listings Python. Ces personnalisations ont une portée qui correspond au
+groupe TeX courant.\footnote{On rappelle que tout environnement LaTeX est, en particulier, un groupe.}
+
+\bigskip
+La commande |\SetPitonStyle| prend en argument une liste de couples \textsl{clé=valeur}. Les clés sont les noms des
+styles et les valeurs sont les instructions LaTeX de formatage correspondantes.
+
+\bigskip
+Ces instructions LaTeX doivent être des instructions de formatage du type de |\bfseries|, |\slshape|,
+|\color{...}|, etc. (les commandes de ce type sont parfois qualifiées de \emph{semi-globales}). Il est aussi
+possible de mettre, \emph{à la fin de la liste d'instructions}, une commande LaTeX prenant exactement un argument.
+
+\bigskip
+Voici un exemple qui change le style utilisé pour le nom d'une fonction Python, au moment de sa définition
+(c'est-à-dire après le mot-clé |def|). Elle utilise la commande |\highLight| de \pkg{lua-ul} (qui nécessite
+lui-même le chargement de \pkg{luacolor}).
+
+\begin{Verbatim}
+\SetPitonStyle
+ { Name.Function = \bfseries \hightLight[red!50] }
+\end{Verbatim}
+
+Ici, |\highLight[red!50]| doit être considéré comme le nom d'une fonction LaTeX qui prend exactement un argument,
+puisque, habituellement, elle est utilisée avec |\highLight[red!50]{|\texttt{\slshape text}|}|.
+
+\medskip
+\begingroup
+\SetPitonStyle
+ { Name.Function = \bfseries \highLight[red!50] }
+Avec ce réglage, on obtient : \piton{def cube(x) : return x * x * x }
+\endgroup
+
+
+\bigskip
+Les différents styles sont décrits dans la table \ref{Semantic}. Les réglages initiaux effectués par \pkg{piton}
+dans |piton.sty| sont inspirés par le style \pkg{manni} de Pygments.\footnote{Voir
+ \url{https://pygments.org/styles/}. À remarquer que, par défaut, Pygments propose pour le style \pkg{manni} un
+ fond coloré dont la couleur est la couleur HTML |#F0F3F3|. Il est possible d'avoir la même couleur dans |{Piton}|
+ avec l'instruction : |\PitonOptions{background-color = [HTML]{F0F3F3}}|}
+
+\begin{table}[htb]
+\centering
+\caption{Les styles proposés par \pkg{piton}}
+\label{Semantic}
+\begin{tabularx}{0.9\textwidth}{@{}>{\ttfamily}l>{\raggedright\arraybackslash}X@{}}
+\toprule
+\normalfont Style & Usage \\
+\midrule
+Number & les nombres \\
+String.Short & les chaînes de caractères courtes (entre \texttt{'} ou \texttt{"}) \\
+String.Long & les chaînes de caractères longues (entre \texttt{'''} ou \texttt{"""}) sauf les chaînes de
+ documentation \\
+String & cette clé fixe à la fois |String.Short| et |String.Long| \\
+String.Doc & les chaînes de documentation (seulement entre |"""| suivant PEP~257) \\
+String.Interpol & les éléments syntaxiques des champs des f-strings (c'est-à-dire les caractères \texttt{\{}et \texttt{\}}) \\
+Operator & les opérateurs suivants : \texttt{!= == << >> - \~{} + / * \% = < > \& .} \verb+|+ \verb|@| \\
+Operator.Word & les opérateurs suivants : |in|, |is|, |and|, |or| et |not| \\
+Name.Builtin & la plupart des fonctions prédéfinies par Python \\
+Name.Function & le nom des fonctions définies par l'utilisateur \emph{au moment de leur définition}, c'est-à-dire
+ après le mot-clé \verb|def| \\
+Name.Decorator & les décorateurs (instructions débutant par \verb|@|) \\
+Name.Namespace & le nom des modules (= bibliothèques extérieures) \\
+Name.Class & le nom des classes au moment de leur définition, c'est-à-dire après le mot-clé \verb|class| \\
+Exception & le nom des exceptions prédéfinies (ex.: SyntaxError) \\
+Comment & les commentaires commençant par \texttt{\#} \\
+Comment.LaTeX & les commentaires commençant par \texttt{\#>} qui sont composés en LaTeX par \pkg{piton} (et
+ appelés simplement «commentaires LaTeX» dans ce document) \\
+Keyword.Constant & |True|, |False| et |None| \\
+Keyword & les mots-clés suivants :
+ \ttfamily assert, break, case, continue, del,
+ elif, else, except, exec, finally, for, from,
+ global, if, import, lambda, non local,
+ pass, raise, return, try, while,
+ with, yield, yield from.\\
+\bottomrule
+\end{tabularx}
+\end{table}
+
+\bigskip
+\colorbox{yellow!50}{\textbf{Nouveau 1.4}}\enskip La commande |\PitonStyle| prend en argument le nom d'un style
+et permet de récupérer la valeur (en tant que liste d'instructions LaTeX) de ce style.
+
+\smallskip
+Par exemple, on peut écrire, dans le texte courant, |{\PitonStyle{Keyword}{function}}| et on aura
+le mot {\PitonStyle{Keyword}{function}} formaté comme un mot-clé.
+
+\smallskip
+La syntaxe |{\PitonStyle{|\textsl{\texttt{style}}|}{...}}| est nécessaire pour pouvoir tenir compte à la fois des commandes
+semi-globales et des commandes à argument présentes dans la valeur courante du style \texttt{\textsl{style}}.
+
+
+\subsection{Définition de nouveaux environnements}
+
+\label{NewPitonEnvironment}
+
+Comme l'environnement |{Piton}| a besoin d'absorber son contenu d'une manière spéciale (à peu près comme du texte
+verbatim), il n'est pas possible de définir de nouveaux environnements directement au-dessus de l'environnement
+|{Piton}| avec les commandes classiques |\newenvironment| et |\NewDocumentEnvironment|.
+
+C'est pourquoi \pkg{piton} propose une commande |\NewPitonEnvironment|. Cette commande a la même syntaxe que la
+commande classique |\NewDocumentEnvironment|.
+
+\bigskip
+Par exemple, avec l'instruction suivante, un nouvel environnement |{Python}| sera défini avec le même comportement
+que l'environnement |{Piton}|:
+
+{\color{gray}\verb|\NewPitonEnvironment{Python}{}{}{}|}
+
+
+\bigskip
+Si on souhaite un environnement |{Python}| qui prenne en argument optionnel entre crochets les clés de
+|\PitonOptions|, on peut écrire :
+
+{\color{gray}\verb|\NewPitonEnvironment{Python}{O{}}{\PitonOptions{#1}}{}|}
+
+\bigskip
+Si on souhaite un environnement |{Python}| qui compose le code inclus dans une boîte de \pkg{tcolorbox}, on peut
+écrire (à condition, bien entendu, d'avoir chargé l'extension \pkg{tcolorbox}):
+
+\begin{Verbatim}
+\NewPitonEnvironment{Python}{}
+ {\begin{tcolorbox}}
+ {\end{tcolorbox}}
+\end{Verbatim}
+
+\bigskip
+Avec ce nouvel environnement |{Python}|, on peut écrire :
+
+\begin{Verbatim}
+~emphase#\begin{Python}@
+def carré(x):
+ """Calcule le carré d'un nombre"""
+ return x*x
+~emphase#\end{Python}@
+\end{Verbatim}
+
+\NewPitonEnvironment{Python}{}
+ {\begin{tcolorbox}}
+ {\end{tcolorbox}}
+
+\begin{Python}
+def carré(x):
+ """Calcule le carré d'un nombre"""
+ return x*x
+\end{Python}
+
+
+\section{Fonctionnalités avancées}
+
+
+\subsection{Mise en évidence d'identificateurs}
+
+\colorbox{yellow!50}{\textbf{Nouveau 1.4}}
+
+On peut demander le changement de formatage de certains identificateurs avec la clé |identifiers| de
+|\PitonOptions|.
+
+\smallskip
+Cette clé prend en argument une valeur au format suivant :
+
+\quad |{ names = |\textsl{\ttfamily noms}|, style = |\textsl{\ttfamily instructions}| }|
+
+\begin{itemize}
+\item \textsl{\ttfamily noms} est une liste de noms d'identificateurs (séparés par des virgules) ;
+
+\item \textsl{\ttfamily instructions} est une liste d'instructions LaTeX de formatage du même type que pour les
+styles précédemment définis (cf.~\ref{styles} p.~\pageref{styles}).
+\end{itemize}
+
+\emph{Attention} : Seuls les identifiants peuvent voir leur formatage affecté. Les mots-clés et les noms de
+fonctions prédéfinies ne seront pas affectés, même s'ils figurent dans la liste \textsl{\ttfamily noms}.
+
+\begin{Verbatim}
+\PitonOptions
+ {
+ ~emphase#identifiers@ =
+ {
+ ~emphase#names@ = { l1 , l2 } ,
+ ~emphase#style@ = \color{red}
+ }
+ }
+
+\begin{Piton}
+def tri(l):
+ """Tri par segmentation"""
+ if len(l) <= 1:
+ return l
+ else:
+ a = l[0]
+ l1 = [ x for x in l[1:] if x < a ]
+ l2 = [ x for x in l[1:] if x >= a ]
+ return tri(l1) + [a] + tri(l2)
+\end{Piton}
+\end{Verbatim}
+
+
+\bigskip
+
+\begingroup
+
+\PitonOptions
+ {
+ identifiers =
+ {
+ names = { l1 , l2 } ,
+ style = \color{red}
+ }
+ }
+
+\begin{Piton}
+def tri(l):
+ """Tri par segmentation"""
+ if len(l) <= 1:
+ return l
+ else:
+ a = l[0]
+ l1 = [ x for x in l[1:] if x < a ]
+ l2 = [ x for x in l[1:] if x >= a ]
+ return tri(l1) + [a] + tri(l2)
+\end{Piton}
+
+\endgroup
+
+\bigskip
+En utilisant la clé |identifiers|, on peut ajouter de nouvelles fonctions prédéfinies (ou de nouveaux mots-clés,
+etc.) qui seront détectées par \pkg{piton}.
+
+
+\begin{Verbatim}
+\PitonOptions
+ {
+ ~emphase#identifiers@ =
+ {
+ names = { cos, sin, tan, floor, ceil, trunc, pow, exp, ln, factorial } ,
+ style = \PitonStyle{Name.Builtin}
+ }
+ }
+
+\begin{Piton}
+from math import *
+cos(pi/2)
+factorial(5)
+ceil(-2.3)
+floor(5.4)
+\end{Piton}
+\end{Verbatim}
+
+\begingroup
+
+\PitonOptions
+ {
+ identifiers =
+ {
+ names = { cos, sin, tan, floor, ceil, trunc, pow, exp, ln, factorial } ,
+ style = \PitonStyle{Name.Builtin}
+ }
+ }
+
+\begin{Piton}
+from math import *
+cos(pi/2)
+factorial(5)
+ceil(-2.3)
+floor(5.4)
+\end{Piton}
+
+
+\endgroup
+
+\subsection{Les échappements vers LaTeX}
+
+L'extension \pkg{piton} propose plusieurs mécanismes d'échappement vers LaTeX :
+\begin{itemize}
+\item Il est possible d'avoir des commentaires entièrement composés en LaTeX.
+\item Il est possible d'avoir, dans les commentaires Python, les éléments entre \texttt{\$} composés en mode
+mathématique de LaTeX.
+\item Il est possible d'insérer du code LaTeX à n'importe quel endroit d'un listing Python.
+\end{itemize}
+Ces mécanismes vont être détaillés dans les sous-parties de cette partie.
+
+\smallskip
+À remarquer également que, dans le cas où \pkg{piton} est utilisée dans la classe \cls{beamer}, \pkg{piton} détecte
+la plupart des commandes et environnements de Beamer : voir la sous-section \ref{beamer}, p.~\pageref{beamer}.
+
+
+\subsubsection{Les «commentaires LaTeX»}
+
+Dans ce document, on appelle «commentaire LaTeX» des commentaires qui débutent par |#>|. Tout ce qui suit ces deux
+caractères, et jusqu'à la fin de la ligne, sera composé comme du code LaTeX standard.
+
+Il y a deux outils pour personnaliser ces commentaires.
+
+\begin{itemize}
+\item Il est possible de changer le marquage syntaxique utilisé (qui vaut initialement~|#>|). Pour ce faire, il
+existe une clé |comment-latex|, disponible seulement au chargement de \pkg{piton} (c'est-à-dire au moment du
+|\usepackage|), qui permet de choisir les caractères qui (précédés par~|#|) serviront de marqueur syntaxique.
+
+Par exemple, avec le chargement suivant :
+
+\quad \verb|\usepackage[comment-latex = LaTeX]{piton}|
+
+les commentaires LaTeX commenceront par~|#LaTeX|.
+
+Si on donne la valeur nulle à la clé |comment-latex|, tous les commentaires Python (débutant par~|#|) seront en
+fait des «commentaires LaTeX».
+
+\smallskip
+\item Il est possible de changer le formatage du commentaire LaTeX lui-même en changeant le style \pkg{piton}
+|Comment.LaTeX|.
+
+Par exemple, avec |\SetPitonStyle{Comment.LaTeX = \normalfont\color{blue}}|, les commentaires LaTeX seront composés
+en bleu.
+
+Si on souhaite qu'un croisillon (|#|) soit affiché en début de commentaire dans le \textsc{pdf}, on peut régler
+|Comment.LaTeX| de la manière suivante :
+
+\begin{Verbatim}
+\SetPitonStyle{Comment.LaTeX = \color{gray}\~#\normalfont\space }
+\end{Verbatim}
+
+Pour d'autres exemples de personnalisation des commentaires LaTeX, voir la partie \ref{example-comments}
+p.~\pageref{example-comments}.
+\end{itemize}
+
+
+\bigskip
+Si l'utilisateur a demandé l'affichage des numéros de ligne (avec |line-numbers| ou |all-line-numbers|), il est
+possible de faire référence à ce numéro de ligne avec la commande |\label| placée dans un commentaire
+LaTeX.\footnote{Cette fonctionnalité est implémentée en redéfinissant, dans les environnements |{Piton}|, la
+ commande |\label|. Il peut donc y avoir des incompatibilités avec les extensions qui redéfinissent (globalement)
+ cette commande |\label| (comme \pkg{varioref}, \pkg{refcheck}, \pkg{showlabels}, etc.)}
+
+
+
+
+\subsubsection{La clé «math-comments»}
+
+Il est possible de demander que, dans les commentaires Python normaux, c'est-à-dire débutant par~|#| (et non par
+|#>|), les éléments placés entre symboles \texttt{\$} soient composés en mode mathématique de LaTeX (le reste du
+commentaire restant composé en verbatim).
+
+La clé |math-comments|, qui n'est disponible qu'au chargement de \pkg{piton} (c'est-à-dire au moment du
+|\usepackage|), active ce comportement.
+
+\bigskip
+Dans l'exemple suivant, on suppose que la clé |math-comments| a été utilisée au chargement de \pkg{piton}.
+
+\begin{Verbatim}
+\begin{Piton}
+def carré(x):
+ return x*x ~# renvoie $x^2$
+\end{Piton}
+\end{Verbatim}
+
+\begin{Piton}
+def carré(x):
+ return x*x # renvoie $x^2$
+\end{Piton}
+
+
+\subsubsection{Le mécanisme «espace-inside»}
+
+Il est aussi possible de surcharger les listings Python pour y insérer du code LaTeX à peu près n'importe où (mais
+entre deux lexèmes, bien entendu). Cette fonctionnalité n'est pas activée par défaut par \pkg{piton}. Pour
+l'utiliser, il faut spécifier les deux caractères marquant l'échappement (le premier le commençant et le deuxième
+le terminant) en utilisant la clé |escape-inside| au chargement de \pkg{piton} (c'est-à-dire au moment du
+|\usepackage|). Les deux caractères peuvent être identiques.
+
+
+\bigskip
+Dans l'exemple suivant, on suppose que l'extension \pkg{piton} a été chargée de la manière suivante :
+
+\begin{Verbatim}
+\usepackage[~emphase#escape-inside=$$@]{piton}
+\end{Verbatim}
+
+\medskip
+Dans le code suivant, qui est une programmation récursive de la factorielle, on décide de surligner en jaune
+l'instruction qui contient l'appel récursif. Cet exemple utilise la commande |\highLight| de \pkg{lua-ul} (cette
+extension requiert aussi l'extension \pkg{luacolor}).
+\begin{Verbatim}
+\begin{Piton}
+def fact(n):
+ if n==0:
+ return 1
+ else:
+ ~emphase#$\highLight{$@return n*fact(n-1)~emphase#$}$@
+\end{Piton}
+\end{Verbatim}
+
+\begin{Piton}
+def fact(n):
+ if n==0:
+ return 1
+ else:
+ $\highLight{$return n*fact(n-1)$}$
+\end{Piton}
+
+\bigskip
+En fait, dans le cas présent, il serait sans doute plus habile d'utiliser la commande |\@highLight| de
+\pkg{lua-ul}: cette commande bascule vers un fond jaune jusqu'à la fin du groupe TeX courant. Comme le nom de cette
+commande contient le caractère |@|, il convient de lui donner un synonyme sans caractère |@| pour pouvoir
+l'utiliser directement dans |{Piton}|.
+
+\begingroup
+\fvset{commandchars=\~\#\+,formatcom=\color{gray}}
+\begin{Verbatim}
+\makeatletter
+~emphase#\let\Jaune\@highLight+
+\makeatother
+\end{Verbatim}
+\endgroup
+
+\begin{Verbatim}
+\begin{Piton}
+def fact(n):
+ if n==0:
+ return 1
+ else:
+ ~emphase#$\Jaune$@return n*fact(n-1)
+\end{Piton}
+\end{Verbatim}
+
+\makeatletter
+\let\Jaune\@highLight
+\makeatother
+
+
+\begin{Piton}
+def fact(n):
+ if n==0:
+ return 1
+ else:
+ $\Jaune$return n*fact(n-1)
+\end{Piton}
+
+
+
+\bigskip
+\emph{Attention} : L'échappement vers LaTeX permis par les caractères de |escape-inside| n'est pas actif dans les
+chaînes de caractères ni dans les commentaires (pour avoir un commentaire entièrement en échappement vers LaTeX,
+c'est-à-dire ce qui est
+appelé dans ce document «commentaire LaTeX», il suffit de le faire débuter par |#>|).
+
+
+
+
+\subsection{Comportement dans la classe Beamer}
+
+\label{beamer}
+
+\emph{Première remarque}\par\nobreak
+Remarquons que, comme l'environnement |{Piton}| prend son argument selon un mode verbatim, il convient, ce qui
+n'est pas surprenant, de l'utiliser dans des environnements |{frame}| de Beamer protégés par la clé |fragile|.\footnote{On
+ rappelle que pour un environnement |{frame}| de Beamer qui utilise la clé |fragile|, l'instruction |\end{frame}|
+ doit être seule sur une ligne (à l'exception d'éventuels espaces en début de ligne).}
+
+
+\medskip
+Quand l'extension \pkg{piton} est utilisée dans la classe \cls{beamer}\footnote{L'extension \pkg{piton} détecte la
+ classe \cls{beamer} mais il est aussi possible, si le besoin s'en faisait sentir, d'activer ce comportement avec
+ la clé |beamer| au chargement de \pkg{piton} : |\usepackage[beamer]{piton}|}, le comportement de \pkg{piton} est
+légèrement modifié, comme décrit maintenant.
+
+\subsubsection{\{Piton\} et \textbackslash PitonInputFile sont ``overlay-aware''}
+
+Quand \pkg{piton} est utilisé avec Beamer, l'environnement |{Piton}| et la commande |\PitonInputFile| acceptent
+l'argument optionnel |<...>| de Beamer pour indiquer les «\emph{overlays}» concernés.
+
+On peut par exemple écrire :
+
+\begin{Verbatim}
+\begin{Piton}~emphase#<2-5>@
+...
+\end{Piton}
+\end{Verbatim}
+
+ou aussi
+
+\begin{Verbatim}
+\PitonInputFile~emphase#<2-5>@{mon_fichier.py}
+\end{Verbatim}
+
+
+\subsubsection{Commandes de Beamer reconnues dans \{Piton\} et \textbackslash PitonInputFile}
+
+Quand \pkg{piton} est utilisé dans la classe \cls{beamer}, les commandes suivantes de \cls{beamer} (classées selon
+leur nombre d'arguments obligatoires) sont directement reconnues dans les environnements |{Piton}| (ainsi que dans
+les listings composés par la commande |\PitonInputFile|, même si c'est sans doute moins utile).
+%
+\begin{itemize}
+\item aucun argument obligatoire : |\pause|\footnote{On remarquera que, bien sûr, on peut aussi utiliser |\pause|
+ dans un «commentaire LaTeX», c'est-à-dire en écrivant |#> \pause|. Ainsi, si le code Python est copié, il est
+ interprétable par Python.} ;
+\item un argument obligatoire : |\action|, |\alert|, |\invisible|, |\only|, |\uncover| et |\visible| ;
+\item deux arguments obligatoire : |\alt| ;
+\item trois arguments obligatoires : |\temporal|.
+\end{itemize}
+
+\medskip
+Les accolades dans les arguments obligatoires de ces commandes doivent être équilibrées (cependant, les accolades
+présentes dans des chaînes courtes\footnote{Les chaînes courtes de Python sont les chaînes (string) délimitées par
+ les caractères \texttt{'} ou \texttt{"} non triplés. En Python, les chaînes de caractères courtes ne peuvent pas
+ s'étendre sur plusieurs lignes de code.} de Python ne sont pas prises en compte).
+
+\medskip
+Concernant les fonctions |\alt| et |\temporal|, aucun retour à la ligne ne doit se trouver dans les arguments de ces fonctions.
+
+
+\medskip
+Voici un exemple complet de fichier :
+
+\begin{Verbatim}[formatcom = \small\color{gray}]
+\documentclass{beamer}
+\usepackage{piton}
+\begin{document}
+\begin{frame}[fragile]
+\begin{Piton}
+def string_of_list(l):
+ """Convertit une liste de nombres en chaîne"""
+~emphase# \only<2->{s = "{" + str(l[0])}@
+~emphase# \only<3->{for x in l[1:]: s = s + "," + str(x)}@
+~emphase# \only<4->{s = s + "}"}@
+ return s
+\end{Piton}
+\end{frame}
+\end{document}
+\end{Verbatim}
+
+Dans l'exemple précédent, les accolades des deux chaînes de caractères Python |"{"| et |"}"| sont correctement
+interprétées (sans aucun caractère d'échappement).
+
+
+
+\bigskip
+\subsubsection{Environnements de Beamer reconnus dans \{Piton\} et \textbackslash PitonInputFile}
+
+Quand \pkg{piton} est utilisé dans la classe \pkg{beamer}, les environnements suivants de Beamer sont directement
+reconnus dans les environnements |{Piton}| (ainsi que dans les listings composés par la commande |\PitonInputFile|
+même si c'est sans doute moins utile) : |{actionenv}|, |{alertenv}|, |{invisibleenv}|, |{onlyenv}|, |{uncoverenv}|
+et |{visibleenv}|.
+
+
+\medskip
+Il y a néanmoins une restriction : ces environnements doivent englober des \emph{lignes entières de code Python}.
+
+
+\medskip
+On peut par exemple écrire :
+
+\begin{Verbatim}[formatcom = \small\color{gray}]
+\documentclass{beamer}
+\usepackage{piton}
+\begin{document}
+\begin{frame}[fragile]
+\begin{Piton}
+def carré(x):
+ """Calcule le carré de l'argument"""
+ ~emphase#\begin{uncoverenv}<2>@
+ return x*x
+ ~emphase#\end{uncoverenv}@
+\end{Piton}
+\end{frame}
+\end{document}
+\end{Verbatim}
+
+
+
+\vspace{1cm}
+\textbf{Remarque à propos de la commande \textbackslash alert et de l'environnement \{alertenv\} de Beamer}\par\nobreak
+
+\smallskip
+Beamer propose un moyen aisé de changer la couleur utilisée par l'environnement |{alertenv}| (et par la commande
+|\alert| qui s'appuie dessus). Par exemple, on peut écrire:
+
+\begin{Verbatim}
+\setbeamercolor{~emphase#alerted text@}{fg=blue}
+\end{Verbatim}
+
+Néanmoins, dans le cas d'une utilisation à l'intérieur d'un environnement |{Piton}| un tel réglage n'est sans doute
+pas pertinent, puisque, justement, \pkg{piton} va (le plus souvent) changer la couleur des élements selon leur
+valeur lexicale. On préfèrera sans doute un environnement |{alertenv}| qui change la couleur de fond des
+éléments à mettre en évidence.
+
+\smallskip
+Voici un code qui effectuera ce travail en mettant un fond jaune. Ce code utilise la commande |\@highLight| de
+l'extension \pkg{lua-ul} (cette extension nécessite elle-même l'extension \pkg{luacolor}).
+
+\begingroup
+\fvset{commandchars=\~\#\+,formatcom=\color{gray}}
+\begin{Verbatim}
+\setbeamercolor{alerted text}{bg=yellow!50}
+\makeatletter
+\AddToHook{env/Piton/begin}
+ {\renewenvironment<>{alertenv}{\only~#1{~emphase#\@highLight+[alerted text.bg]}}{}}
+\makeatother
+\end{Verbatim}
+\endgroup
+
+Ce code redéfinit localement l'environnement |{alertenv}| à l'intérieur de l'environnement |{Piton}| (on rappelle
+que la commande |\alert| s'appuie sur cet environnement |{alertenv}|).
+
+
+
+\bigskip
+\subsection{Coupure des pages et des lignes}
+
+\label{breakable}
+
+\subsubsection{Coupure des pages}
+
+Par défaut les listings produits par l'environnement |{Piton}| et par la commande |\PitonInputFile| sont
+insécables.
+
+Néanmoins, la commande |\PitonOptions| propose la clé |splittable| pour autoriser de telles coupures.
+
+\begin{itemize}
+\item Si la clé |splittable| est utilisée sans valeur, les listings sont sécables n'importe où.
+
+\item Si la clé |splittable| est utilisée avec une valeur numérique $n$ (qui doit être un entier naturel non nul),
+alors les listings seront sécables mais aucune coupure ne pourra avoir lieu entre les $n$~premières lignes, ni
+entre les $n$~dernières. De ce fait, |splittable=1| est équivalent à |splittable|.
+\end{itemize}
+
+\medskip
+\emph{Remarque}\par\nobreak
+
+Même avec une couleur de fond (fixée avec |background-color|), les sauts de page sont possibles, à partir du moment
+où la clé |splittable| est utilisée.\footnote{Avec la clé |splittable|, un environnement |{Piton}| est sécable même dans un environnement de
+ \pkg{tcolorbox} (à partir du moment où la clé |breakable| de \pkg{tcolorbox} est utilisée). On précise cela parce
+ que, en revanche, un environnement de \pkg{tcolorbox} inclus dans un autre environnement de \pkg{tcolorbox} n'est
+ pas sécable, même quand les deux utilisent la clé |breakable|.}
+
+\subsubsection{Coupure des lignes}
+
+\label{line-breaks}
+
+Par défaut, les éléments produits par \pkg{piton} ne peuvent pas être coupés par une fin de ligne. Il existe
+néanmoins des clés pour autoriser de telles coupures (les points de coupure possibles sont les espaces, y compris
+les espaces dans les chaînes Python).
+\begin{itemize}
+\item Avec la clé |break-lines-in-piton|, les coupures de ligne sont autorisées dans la commande |\piton{...}|
+(mais pas dans la commande \verb+\piton|...|+, c'est-à-dire avec la syntaxe verbatim).
+
+\item Avec la clé |break-lines-in-Piton|, les coupures de ligne sont autorisées dans l'environnement |{Piton}|
+(d'où la lettre |P| capitale dans le nom) et dans les listings produits par |\PitonInputFile|.
+
+\item La clé |break-lines| est la conjonction des deux clés précédentes.
+\end{itemize}
+
+\medskip
+L'extension \pkg{piton} fournit aussi plusieurs clés pour contrôler l'apparence des coupures de ligne autorisées par |break-lines-in-Piton|.
+
+\begin{itemize}
+\item Avec la clé |indent-broken-lines|, l'indentation de la ligne coupée est respectée à chaque retour à la ligne.
+
+\item La clé |end-of-broken-line| correspond au symbole placé à la fin d'une ligne coupée. Sa valeur initiale est :
+|\hspace*{0.5em}\textbackslash|.
+
+\item La clé |continuation-symbol| correspond au symbole placé à chaque retour de ligne dans la marge gauche. Sa
+valeur initiale est : |+\;|.
+
+\item La clé |continuation-symbol-on-indentation| correspond au symbole placé à chaque retour de ligne au niveau de
+l'indentation (uniquement dans le cas où la clé |indent-broken-lines| est active). Sa valeur initiale est :
+|$\hookrightarrow\;$|.
+\end{itemize}
+
+\bigskip
+Le code suivant a été composé dans une |{minipage}| standard de LaTeX de largeur 12~cm avec le réglage suivant :
+
+\begin{Verbatim}
+\PitonOptions{break-lines,indent-broken-lines,background-color=gray!15}
+\end{Verbatim}
+
+\begin{center}
+\PitonOptions{break-lines,indent-broken-lines,background-color=gray!15}
+\begin{minipage}{12cm}
+\begin{Piton}
+def dict_of_liste(liste):
+ """Convertit une liste de subrs et de descriptions de glyphes en dictionnaire"""
+ dict = {}
+ for liste_lettre in liste:
+ if (liste_lettre[0][0:3] == 'dup'): # si c'est un subr
+ nom = liste_lettre[0][4:-3]
+ print("On traite le subr de numéro " + nom)
+ else:
+ nom = liste_lettre[0][1:-3] # si c'est un glyphe
+ print("On traite le glyphe du caractère " + nom)
+ dict[nom] = [traite_ligne_Postscript(k) for k in liste_lettre[1:-1]]
+ return dict
+\end{Piton}
+\end{minipage}
+\end{center}
+
+
+
+\bigskip
+\subsection{Notes de pied de page dans les environnements de piton}
+
+\label{footnote}
+
+Si vous voulez mettre des notes de pied de page dans un environnement de \pkg{piton} (ou bien dans un listing
+produit par |\PitonInputFile|, bien que cela paraisse moins pertinent dans ce cas-là) vous pouvez utiliser une
+paire |\footnotemark|--|\footnotetext|.
+
+\smallskip
+Néanmoins, il est également possible d'extraire les notes de pieds de page avec l'extension \pkg{footnote} ou bien
+l'extension \pkg{footnotehyper}.
+
+\smallskip
+Si \pkg{piton} est chargée avec l'option |footnote| (avec |\usepackage[footnote]{piton}|) l'extension
+\pkg{footnote} est chargée (si elle ne l'est pas déjà) et elle est utilisée pour extraire les notes de pied de
+page.
+
+\smallskip
+Si \pkg{piton} est chargée avec l'option |footnotehyper|, l'extension \pkg{footnotehyper} est chargée (si
+elle ne l'est pas déjà) et elle est utilisée pour extraire les notes de pied de page.
+
+\smallskip
+Attention : Les extensions \pkg{footnote} et \pkg{footnotehyper} sont incompatibles.
+L'extension \pkg{footnotehyper} est le successeur de l'extension \pkg{footnote}
+et devrait être utilisée préférentiellement. L'extension \pkg{footnote} a quelques défauts ;
+en particulier, elle doit être chargée après l'extension \pkg{xcolor} et elle n'est pas parfaitement
+compatible avec \pkg{hyperref}.
+
+\medskip
+Dans ce document, l'extension \pkg{piton} a été chargée avec l'option |footnotehyper| et c'est pourquoi des notes
+peuvent être mises dans les environnements |{Piton}| : voir un exemple sur la première page de ce document.
+
+\subsection{Tabulations}
+
+\smallskip
+Même s'il est recommandé d'indenter les listings Python avec des espaces (cf. PEP~8), \pkg{piton} accepte les
+caractères de tabulations (U+0009) en début de ligne. Chaque caractère U+0009 est remplacé par $n$ espaces. La
+valeur initiale de~$n$ est~4 mais on peut la changer avec la clé |tab-size| de |\PitonOptions|.
+
+\smallskip
+Il existe aussi une clé |tabs-auto-gobble| qui détermine le nombre minimal de caractères U+0009 débutant chaque
+ligne (non vide) de l'environnement |{Piton}| et applique |gobble| avec cette valeur (avant le remplacement des
+caractères U+0009 par des espaces, bien entendu). Cette clé est donc similaire à la clé |auto-gobble| mais agit sur
+des caractères U+0009 au lieu de caractères U+0020 (espaces).
+
+\section{Exemples}
+
+
+\subsection{Numérotation des lignes}
+
+\label{example-numbering}
+
+On rappelle que l'on peut demander la numérotation des lignes des listings avec la clé |line-numbers| ou la clé |all-line-numbers|.
+
+Par défaut, les numéros de ligne sont composés par \pkg{piton} en débordement à gauche (en utilisant en interne la commande |\llap| de LaTeX).
+
+Si on ne veut pas de débordement, on peut utiliser l'option |left-margin=auto| qui va insérer une marge adaptée aux
+numéros qui seront insérés (elle est plus large quand les numéros dépassent 10).
+
+
+\begingroup
+\fvset{commandchars=\~\&\@,formatcom=\small\color{gray}}
+\begin{Verbatim}
+~emphase&\PitonOptions{background-color=gray!10, left-margin = auto, line-numbers}@
+\begin{Piton}
+def arctan(x,n=10):
+ if x < 0:
+ return -arctan(-x) #> (appel récursif)
+ elif x > 1:
+ return pi/2 - arctan(1/x) #> (autre appel récursif)
+ else:
+ return sum( (-1)**k/(2*k+1)*x**(2*k+1) for k in range(n) )
+\end{Piton}
+\end{Verbatim}
+\endgroup
+
+
+
+\begingroup
+\PitonOptions{background-color=gray!10,left-margin = auto, line-numbers}
+\begin{Piton}
+def arctan(x,n=10):
+ if x < 0:
+ return -arctan(-x) #> (appel récursif)
+ elif x > 1:
+ return pi/2 - arctan(1/x) #> (autre appel récursif)
+ else:
+ return sum( (-1)**k/(2*k+1)*x**(2*k+1) for k in range(n) )
+\end{Piton}
+\endgroup
+
+
+\bigskip
+
+\subsection{Formatage des commentaires LaTeX}
+
+\label{example-comments}
+
+On peut modifier le style |Comment.LaTeX| (avec |\SetPitonStyle|) pour faire afficher les commentaires
+LaTeX (qui débutent par |#>|) en butée à droite.
+
+\begingroup
+\fvset{commandchars=\~\&\@,formatcom=\small\color{gray}}
+\begin{Verbatim}
+\PitonOptions{background-color=gray!10}
+~emphase&\SetPitonStyle{Comment.LaTeX = \hfill \normalfont\color{gray}}@
+\begin{Piton}
+def arctan(x,n=10):
+ if x < 0:
+ return -arctan(-x) #> appel récursif
+ elif x > 1:
+ return pi/2 - arctan(1/x) #> autre appel récursif
+ else:
+ return sum( (-1)**k/(2*k+1)*x**(2*k+1) for k in range(n) )
+\end{Piton}
+\end{Verbatim}
+\endgroup
+
+\begingroup
+\PitonOptions{background-color=gray!10}
+\SetPitonStyle{Comment.LaTeX = \hfill \normalfont\color{gray}}
+\begin{Piton}
+def arctan(x,n=10):
+ if x < 0:
+ return -arctan(-x) #> appel récursif
+ elif x > 1:
+ return pi/2 - arctan(1/x) #> autre appel récursif
+ else:
+ return sum( (-1)**k/(2*k+1)*x**(2*k+1) for k in range(n) )
+\end{Piton}
+\endgroup
+
+
+\vspace{1cm}
+On peut aussi faire afficher les commentaires dans une deuxième colonne à droite si on limite la largeur du code
+proprement dit avec un environnement |{minipage}| de LaTeX.
+
+
+\begingroup
+\fvset{commandchars=\~\&\@,formatcom=\small\color{gray}}
+\begin{Verbatim}
+\PitonOptions{background-color=gray!10}
+~emphase&\NewDocumentCommand{\MyLaTeXCommand}{m}{\hfill \normalfont\itshape\rlap{\quad #1}}@
+~emphase&\SetPitonStyle{Comment.LaTeX = \MyLaTeXCommand}@
+~emphase&\begin{minipage}{12cm}@
+\begin{Piton}
+def arctan(x,n=10):
+ if x < 0:
+ return -arctan(-x) #> appel récursif
+ elif x > 1:
+ return pi/2 - arctan(1/x) #> autre appel récursif
+ else:
+ s = 0
+ for k in range(n):
+ s += (-1)**k/(2*k+1)*x**(2*k+1)
+ return s
+\end{Piton}
+~emphase&\end{minipage}@
+\end{Verbatim}
+\endgroup
+
+
+
+\begingroup
+\PitonOptions{background-color=gray!10}
+\NewDocumentCommand{\MyLaTeXCommand}{m}{\hfill \normalfont\itshape\rlap{\quad #1}}
+\SetPitonStyle{Comment.LaTeX = \MyLaTeXCommand}
+\begin{minipage}{12cm}
+\begin{Piton}
+def arctan(x,n=10):
+ if x < 0:
+ return -arctan(-x) #> appel récursif
+ elif x > 1:
+ return pi/2 - arctan(1/x) #> autre appel récursif
+ else:
+ s = 0
+ for k in range(n):
+ s += (-1)**k/(2*k+1)*x**(2*k+1)
+ return s
+\end{Piton}
+\end{minipage}
+\endgroup
+
+\bigskip
+
+\subsection{Notes dans les listings}
+
+Pour pouvoir extraire les notes (introduites par |\footnote|), l'extension |piton| doit être chargée, soit avec la
+clé |footnote|, soit avec la clé |footnotehyper|, comme expliqué à la section \ref{footnote} p.~\pageref{footnote}.
+Dans le présent document, l'extension \pkg{piton} a été chargée par la clé |footnotehyper|.
+
+Bien entendu, une commande |\footnote| ne peut apparaître que dans un commentaire LaTeX (qui débute par |#>|). Un
+tel commentaire peut se limiter à cette unique commande |\footnote|, comme dans l'exemple suivant.
+
+\begingroup
+\fvset{commandchars=\~\&\@,formatcom=\small\color{gray}}
+\begin{Verbatim}
+\PitonOptions{background-color=gray!10}
+\begin{Piton}
+def arctan(x,n=10):
+ if x < 0:
+ return -arctan(-x)~emphase&#>\footnote{Un premier appel récursif.}]@
+ elif x > 1:
+ return pi/2 - arctan(1/x)~emphase&#>\footnote{Un deuxième appel récursif.}@
+ else:
+ return sum( (-1)**k/(2*k+1)*x**(2*k+1) for k in range(n) )
+\end{Piton}
+\end{Verbatim}
+\endgroup
+
+\begingroup
+\PitonOptions{background-color=gray!10}
+\begin{Piton}
+def arctan(x,n=10):
+ if x < 0:
+ return -arctan(-x)#>\footnote{Un premier appel récursif.}
+ elif x > 1:
+ return pi/2 - arctan(1/x)#>\footnote{Un deuxième appel récursif.}
+ else:
+ return sum( (-1)**k/(2*k+1)*x**(2*k+1) for k in range(n) )
+\end{Piton}
+\endgroup
+
+
+\vspace{1cm}
+
+Si on utilise l'environnement |{Piton}| dans un environnement |{minipage}| de LaTeX, les notes sont, bien entendu,
+composées au bas de l'environnement |{minipage}|. Rappelons qu'une telle |{minipage}| ne peut être coupée par un
+saut de page.
+
+
+\begingroup
+\fvset{commandchars=\~\&\@,formatcom=\small\color{gray}}
+\begin{Verbatim}
+\PitonOptions{background-color=gray!10}
+\emphase\begin{minipage}{\linewidth}
+\begin{Piton}
+def arctan(x,n=10):
+ if x < 0:
+ return -arctan(-x)~emphase&#>\footnote{Un premier appel récursif.}@
+ elif x > 1:
+ return pi/2 - arctan(1/x)~emphase&#>\footnote{Un deuxième appel récursif.}@
+ else:
+ return sum( (-1)**k/(2*k+1)*x**(2*k+1) for k in range(n) )
+\end{Piton}
+\end{minipage}
+\end{Verbatim}
+\endgroup
+
+\begingroup
+\PitonOptions{background-color=gray!10}
+\begin{minipage}{\linewidth}
+\begin{Piton}
+def arctan(x,n=10):
+ if x < 0:
+ return -arctan(-x)#>\footnote{Un premier appel récursif.}
+ elif x > 1:
+ return pi/2 - arctan(1/x)#>\footnote{Un deuxième appel récursif.}
+ else:
+ return sum( (-1)**k/(2*k+1)*x**(2*k+1) for k in range(n) )
+\end{Piton}
+\end{minipage}
+\endgroup
+
+
+\vspace{1cm}
+Si on encapsule l'environnement |{Piton}| dans un environnement |{minipage}| pour, typiquement, limiter la largeur
+d'un fond coloré, il faut encadrer l'ensemble dans un environnement |{savenotes}| (de \pkg{footnote} ou
+\pkg{footnotehyper}) si on veut avoir les notes reportées en pied de page.
+
+\begingroup
+\fvset{commandchars=\~\&\@,formatcom=\small\color{gray}}
+\begin{Verbatim}
+\PitonOptions{background-color=gray!10}
+~emphase&\begin{savenotes}@
+\begin{minipage}{13cm}
+\begin{Piton}
+def arctan(x,n=10):
+ if x < 0:
+ return -arctan(-x)~emphase&#>\footnote{Un premier appel récursif.}@
+ elif x > 1:
+ return pi/2 - arctan(1/x)~emphase&#>\footnote{Un deuxième appel récursif.}@
+ else:
+ return sum( (-1)**k/(2*k+1)*x**(2*k+1) for k in range(n) )
+\end{Piton}
+\end{minipage}
+~emphase&\end{savenotes}@
+\end{Verbatim}
+\endgroup
+
+
+
+\begin{savenotes}
+\PitonOptions{background-color=gray!10}
+\begin{minipage}{13cm}
+\begin{Piton}
+def arctan(x,n=10):
+ if x < 0:
+ return -arctan(-x)#>\footnote{Un premier appel récursif.}
+ elif x > 1:
+ return pi/2 - arctan(1/x)#>\footnote{Un deuxième appel récursif.}
+ else:
+ return sum( (-1)**k/(2*k+1)*x**(2*k+1) for k in range(n) )
+\end{Piton}
+\end{minipage}
+\end{savenotes}
+
+\bigskip
+
+\subsection{Un exemple de réglage des styles}
+
+Les styles graphiques ont été présentés à la partie \ref{styles}, p.~\pageref{styles}.
+
+\smallskip
+On présente ici un réglage de ces styles adapté pour les documents en noir et blanc. On l'utilise avec la fonte
+\emph{DejaVu Sans Mono}\footnote{Voir: \url{https://dejavu-fonts.github.io}} spécifiée avec la commande
+ |\setmonofont| de \pkg{fontspec}.
+
+Ce réglage utilise la commande |\highLight| de \pkg{lua-ul} (cette extension nécessite elle-même l'extension \pkg{luacolor}).
+
+
+\begin{Verbatim}
+\setmonofont[Scale=0.85]{DejaVu Sans Mono}
+
+\SetPitonStyle
+ {
+ Number = ,
+ String = \itshape ,
+ String.Doc = \color{gray} \itshape ,
+ Operator = ,
+ Operator.Word = \bfseries ,
+ Name.Builtin = ,
+ Name.Function = \bfseries \highLight[gray!20] ,
+ Comment = \color{gray} ,
+ Comment.LaTeX = \normalfont \color{gray},
+ Keyword = \bfseries ,
+ Name.Namespace = ,
+ Name.Class = ,
+ Name.Type = ,
+ InitialValues = \color{gray}
+ }
+\end{Verbatim}
+
+
+\begingroup
+
+
+\setmonofont[Scale=0.85]{DejaVu Sans Mono}
+
+\SetPitonStyle
+ {
+ Number = ,
+ String = \itshape ,
+ String.Doc = \color{gray} \itshape ,
+ Operator = ,
+ Operator.Word = \bfseries ,
+ Name.Builtin = ,
+ Name.Function = \bfseries \highLight[gray!20] ,
+ Comment = \color{gray} ,
+ Comment.LaTeX = \normalfont \color{gray},
+ Keyword = \bfseries ,
+ Name.Namespace = ,
+ Name.Class = ,
+ Name.Type = ,
+ InitialValues = \color{gray}
+ }
+
+
+\bigskip
+
+\begin{Piton}
+from math import pi
+
+def arctan(x,n=10):
+ """Compute the mathematical value of arctan(x)
+
+ n is the number of terms in the sum
+ """
+ if x < 0:
+ return -arctan(-x) # appel récursif
+ elif x > 1:
+ return pi/2 - arctan(1/x)
+ #> (on a utilisé le fait que $\arctan(x)+\arctan(1/x)=\pi/2$ pour $x>0$)
+ else:
+ s = 0
+ for k in range(n):
+ s += (-1)**k/(2*k+1)*x**(2*k+1)
+ return s
+\end{Piton}
+
+
+\endgroup
+
+\section{Utilisation avec pyluatex}
+
+\subsection{Utilisation standard de pyluatex}
+
+L'extension \pkg{pyluatex} est une extension qui permet l'exécution de code Python à partir de |lualatex| (pourvu
+que Python soit installé sur la machine et que la compilation soit effectuée avec |lualatex| et |--shell-escape|).
+
+Voici, à titre d'exemple, un environnement |{PitonExecute}| qui formate un listing Python (avec \pkg{piton}) et qui
+affiche également dessous le résultat de l'exécution de ce code avec Python.
+
+
+\begin{Verbatim}
+\ExplSyntaxOn
+\NewDocumentEnvironment { ~emphase#PitonExecute@ } { ! O { } } % le ! est obligatoire
+ {
+ \PyLTVerbatimEnv
+ \begin{pythonq}
+ }
+ {
+ \end{pythonq}
+ \directlua
+ {
+ tex.print("\\PitonOptions{~#1}")
+ tex.print("\\begin{Piton}")
+ tex.print(pyluatex.get_last_code())
+ tex.print("\\end{Piton}")
+ tex.print("")
+ }
+ \begin{center}
+ \directlua{tex.print(pyluatex.get_last_output())}
+ \end{center}
+ }
+\ExplSyntaxOff
+\end{Verbatim}
+
+\ExplSyntaxOn
+\NewDocumentEnvironment { PitonExecute } { ! O { } }
+ {
+ \PyLTVerbatimEnv
+ \begin{pythonq}
+ }
+ {
+ \end{pythonq}
+ \directlua
+ {
+ tex.print("\\PitonOptions{#1}")
+ tex.print("\\begin{Piton}")
+ tex.print(pyluatex.get_last_code())
+ tex.print("\\end{Piton}")
+ tex.print("")
+ }
+ \begin{center}
+ \directlua{tex.print(pyluatex.get_last_output())}
+ \end{center}
+ }
+\ExplSyntaxOff
+
+Cet environnement |{PitonExecute}| prend en argument optionnel (entre crochets) les options proposées par la
+commande |\PitonOptions|.
+
+\bigskip
+Voici un exemple d'utilisation de cet environnement |{PitonExecute}| :
+
+\begin{Verbatim}
+\begin{~emphase#PitonExecute@}[background-color=gray!15]
+def square(x):
+ return x*x
+print(f'Le carré de 12 est {square(12)}.')
+\end{~emphase#PitonExecute@}
+\end{Verbatim}
+
+
+\medskip
+\begin{PitonExecute}[background-color=gray!15]
+def square(x):
+ return x*x
+print(f'Le carré de 12 est {square(12)}.')
+\end{PitonExecute}
+
+\bigskip
+
+\subsection{Utilisation de l'environnement \{pythonrepl\} de pyluatex}
+
+\label{pythonrepl}
+
+L'environnement |{pythonrepl}| de \pkg{pyluatex} passe son contenu à Python et renvoie ce que l'on obtient quand on
+fournit ce code à une boucle \textsc{repl} (\emph{read-eval-print loop}) de Python. On obtient un entrelacement
+d'instructions précédées par le prompt |>>>| de Python et des valeurs renvoyées par Python (et de ce qui a été
+demandé d'être affiché avec des \piton{print} de Python).
+
+\medskip
+Il est ensuite possible de passer cela à un environnement |{Piton}| qui va faire un coloriage syntaxique
+et mettre sur fond grisé les lignes correspondant aux instructions fournies à l'interpréteur Python (gràce à la clé
+|prompt-background-color| de |\PitonOptions|).
+
+
+\medskip
+Voici la programmation d'un environnement |{PitonREPL}| qui effectue ce travail (pour des raisons techniques, le
+|!| est ici obligatoire dans la signature de l'environnement).
+
+\begin{Verbatim}
+\NewDocumentEnvironment { PitonREPL } { ! O { } } % le ! est obligatoire
+ {
+ \PitonOptions
+ { background-color=white,
+ ~emphase#prompt-background-color = gray!10@,
+ ~#1
+ }
+ \PyLTVerbatimEnv
+ \begin{pythonrepl}
+ }
+ {
+ \directlua
+ {
+ tex.print("\\begin{Piton}")
+ tex.print(pyluatex.get_last_output())
+ tex.print("\\end{Piton}")
+ tex.print("")
+ }
+ \end{pythonrepl}
+ }
+\end{Verbatim}
+
+\medskip
+Voici un exemple d'utilisation de ce nouvel environnement |{PitonREPL}|.
+
+\medskip
+\begin{Verbatim}
+~emphase#\begin{PitonREPL}@
+ def valeur_absolue(x):
+ "Renvoie la valeur absolue de x"
+ if x > 0:
+ return x
+ else:
+ return -x
+
+ valeur_absolue(-3)
+ valeur_absolue(0)
+ valeur_absolue(5)
+~emphase#\end{PitonREPL}@
+\end{Verbatim}
+
+\bigskip
+
+
+\NewDocumentEnvironment { PitonREPL } { }
+ {
+ \PitonOptions{background-color=white,prompt-background-color = gray!10}
+ \PyLTVerbatimEnv
+ \begin{pythonrepl}
+ }
+ {
+ \directlua
+ {
+ tex.print("\\begin{Piton}")
+ tex.print(pyluatex.get_last_output())
+ tex.print("\\end{Piton}")
+ tex.print("")
+ }
+ \end{pythonrepl}
+ }
+
+
+\begin{PitonREPL}
+ def valeur_absolue(x):
+ "Renvoie la valeur absolue de x"
+ if x > 0:
+ return x
+ else:
+ return -x
+
+ valeur_absolue(-3)
+ valeur_absolue(0)
+ valeur_absolue(5)
+\end{PitonREPL}
+
+
+\bigskip
+En fait, il est possible de ne pas faire afficher les prompts eux-mêmes (c'est-à-dire les chaînes de caractères
+|>>>| et |...|). En effet, \pkg{piton} propose un style pour ces éléments, qui est appelé |Prompt|. Par défaut, la
+valeur de ce style est vide, ce qui fait qu'aucune action n'est exécutée sur ces éléments qui sont donc affichés
+tels quels. En fournissant comme valeur une fonction qui se contente de gober son argument, on peut demander à ce
+qu'ils ne soient pas affichés.
+
+\bigskip
+\begin{savenotes}
+\begin{Verbatim}
+\NewDocumentCommand{\Gobe}{m}{}#~color#black@~footnote#On a défini ici une fonction ~texttt#~string~Gobe@ mais, en fait, elle existe déjà en L3 sous le nom ~texttt#~string~use~_none:n@.@@
+\SetPitonStyle{ ~emphase#Prompt = \Gobe@ }
+\end{Verbatim}
+\end{savenotes}
+
+
+
+
+\NewDocumentCommand{\Gobe}{m}{}
+\ExplSyntaxOn
+\SetPitonStyle{ Prompt = \use_none:n }
+\ExplSyntaxOff
+
+\bigskip
+L'exemple précédent donne alors :
+
+\medskip
+\begin{Verbatim}
+~emphase#\begin{PitonREPL}@
+ def valeur_absolue(x):
+ "Renvoie la valeur absolue de x"
+ if x > 0:
+ return x
+ else:
+ return -x
+
+ valeur_absolue(-3)
+ valeur_absolue(0)
+ valeur_absolue(5)
+~emphase#\end{PitonREPL}@
+\end{Verbatim}
+
+
+
+\begin{PitonREPL}
+ def valeur_absolue(x):
+ "Renvoie la valeur absolue de x"
+ if x > 0:
+ return x
+ else:
+ return -x
+
+ valeur_absolue(-3)
+ valeur_absolue(0)
+ valeur_absolue(5)
+\end{PitonREPL}
+
+
+
+\section*{Autre documentation}
+
+Le document |piton.pdf| (fourni avec l'extension \pkg{piton}) contient une traduction anglaise de la
+documentation ici présente, ainsi que le code source commenté et un historique des versions.
+
+
+\medskip
+Les versions successives du fichier |piton.sty| fournies par
+TeXLive sont disponibles sur le serveur \textsc{svn} de TeXLive :
+
+\smallskip
+{
+\small
+\nolinkurl{https://tug.org/svn/texlive/trunk/Master/texmf-dist/tex/lualatex/piton/piton.sty}
+}
+
+
+
+\tableofcontents
+
\end{document} \ No newline at end of file
diff --git a/macros/luatex/latex/piton/piton.dtx b/macros/luatex/latex/piton/piton.dtx
index 8d8caee54f..4f1d4290a1 100644
--- a/macros/luatex/latex/piton/piton.dtx
+++ b/macros/luatex/latex/piton/piton.dtx
@@ -1,5161 +1,5174 @@
-% \iffalse -*- coding: utf-8 ; -*- \fi \iffalse meta-comment
-%
-% Copyright (C) 2023 by F. Pantigny
-% -----------------------------------
-%
-% This file may be distributed and/or modified under the
-% conditions of the LaTeX Project Public License, either version 1.3
-% of this license or (at your option) any later version.
-% The latest version of this license is in:
-%
-% http://www.latex-project.org/lppl.txt
-%
-% and version 1.3 or later is part of all distributions of LaTeX
-% version 2005/12/01 or later.
-%
-% \fi
-% \iffalse
-\def\myfileversion{1.5}
-\def\myfiledate{2023/04/04}
-%
-%
-%<*batchfile>
-\begingroup
-\input l3docstrip.tex
-\keepsilent
-\usedir{tex/latex/cascade}
-\preamble
-
-Copyright (C) 2022-2023 by F. Pantigny
------------------------------------
-
-This file may be distributed and/or modified under the
-conditions of the LaTeX Project Public License, either version 1.3
-of this license or (at your option) any later version.
-The latest version of this license is in:
-
-http://www.latex-project.org/lppl.txt
-
-and version 1.3 or later is part of all distributions of LaTeX
-version 2005/12/01 or later.
-
-\endpreamble
-\askforoverwritefalse
-\endgroup
-%</batchfile>
-%
-%<@@=piton>
-%<*driver>
-\documentclass{l3doc}
-\usepackage{geometry}
-\geometry{left=2.8cm,right=2.8cm,top=2.5cm,bottom=2.5cm,papersize={21cm,29.7cm}}
-\usepackage{fontspec}
-\usepackage[dvipsnames]{xcolor}
-\usepackage{caption,tabularx,tcolorbox,luacolor,lua-ul}
-\def\emphase{\bgroup\color{RoyalPurple}\let\next=}
-\fvset{commandchars=\~\#\@,formatcom=\color{gray}}
-\captionsetup{labelfont = bf}
-\usepackage{ragged2e}
-\usepackage[footnotehyper,escape-inside=$$,math-comments]{piton} % $$
-
-\parindent 0pt
-\skip\footins = 2\bigskipamount
-
-\PitonOptions{gobble=2}
-
-\EnableCrossrefs
-
-\begin{document}
-\DocInput{piton.dtx}
-\end{document}
-%</driver>
-% \fi
-%
-% \catcode`\" = 11
-%
-% \title{The package \pkg{piton}\thanks{This document corresponds to the
-% version~\myfileversion\space of \pkg{piton}, at the date of~\myfiledate.}}
-% \author{F. Pantigny \\ \texttt{fpantigny@wanadoo.fr}}
-%
-% \maketitle
-%
-% \begin{abstract}
-% The package \pkg{piton} provides tools to typeset Python listings with
-% syntactic highlighting by using the Lua library LPEG. It requires LuaLaTeX.
-% \end{abstract}
-%
-%
-%
-% \section{Presentation}
-%
-%
-% The package \pkg{piton} uses the Lua library LPEG\footnote{LPEG is a
-% pattern-matching library for Lua, written in C, based on \emph{parsing
-% expression grammars}: \url{http://www.inf.puc-rio.br/~roberto/lpeg/}} for
-% parsing Python listings and typeset them with syntactic highlighting. Since it
-% uses Lua code, it works with |lualatex| only (and won't work with the other
-% engines: |latex|, |pdflatex| and |xelatex|). It does not use external program
-% and the compilation does not require |--shell-escape|. The compilation is very
-% fast since all the parsing is done by the library LPEG, written in C.
-%
-% \bigskip
-% Here is an example of code typeset by \pkg{piton}, with the environment |{Piton}|.
-%
-% \bigskip
-%
-% \begin{Piton}
-% from math import pi
-%
-% def arctan(x,n=10):
-% """Compute the mathematical value of arctan(x)
-%
-% n is the number of terms in the sum
-% """
-% if x < 0:
-% return -arctan(-x) # recursive call
-% elif x > 1:
-% return pi/2 - arctan(1/x)
-% #> (we have used that $\arctan(x)+\arctan(1/x)=\frac{\pi}{2}$ for $x>0$)\footnote{This LaTeX escape has been done by beginning the comment by \ttfamily\#>.}
-% else:
-% s = 0
-% for k in range(n):
-% s += (-1)**k/(2*k+1)*x**(2*k+1)
-% return s
-% \end{Piton}
-%
-%
-% \bigskip
-% The package \pkg{piton} is entirely contained in the file
-% |piton.sty|. This file may be put in the current directory or in a
-% |texmf| tree. However, the best is to install \pkg{piton} with a TeX
-% distribution such as MiKTeX, TeX Live or MacTeX.
-%
-%
-% \section{Use of the package}
-%
-%
-% \subsection{Loading the package}
-%
-% The package \pkg{piton} should be loaded with the classical command
-% |\usepackage|: |\usepackage{piton}|.
-%
-% \smallskip
-% Nevertheless, we have two remarks:
-% \begin{itemize}
-% \item the package \pkg{piton} uses the package \pkg{xcolor} (but \pkg{piton}
-% does \emph{not} load \pkg{xcolor}: if \pkg{xcolor} is not loaded before the
-% |\begin{document}|, a fatal error will be raised).
-% \item the package \pkg{piton} must be used with LuaLaTeX exclusively: if
-% another LaTeX engine (|latex|, |pdflatex|, |xelatex|,\dots ) is used, a
-% fatal error will be raised.
-% \end{itemize}
-%
-% \subsection{The tools provided to the user}
-%
-% The package \pkg{piton} provides several tools to typeset Python code: the
-% command |\piton|, the environment |{Piton}| and the command |\PitonInputFile|.
-%
-% \begin{itemize}\setlength{\fboxsep}{1pt}
-% \item The command \colorbox{gray!20}{\texttt\textbackslash piton} should be
-% used to typeset small pieces of code inside a paragraph. For example:
-%
-% {\color{gray}\verb|\piton{def square(x): return x*x}|}\qquad
-% \piton{def square(x): return x*x}
-%
-% The syntax and particularities of the command |\piton| are detailed below.
-%
-% \item The environment \colorbox{gray!20}{\ttfamily\{Piton\}} should be used to
-% typeset multi-lines code. Since it takes its argument in a verbatim mode, it
-% can't be used within the argument of a LaTeX command. For sake of
-% customization, it's possible to define new environments similar to the
-% environment |{Piton}| with the command |\NewPitonEnvironment|:
-% cf.~\ref{NewPitonEnvironment} p.~\pageref{NewPitonEnvironment}.
-%
-% \item The command \colorbox{gray!20}{\ttfamily\textbackslash PitonInputFile}
-% is used to insert and typeset a whole external file.
-%
-% That command takes in as optional argument (between square brackets) two keys
-% |first-line| and |last-line|: only the part between the corresponding lines
-% will be inserted.
-% \end{itemize}
-%
-% \subsection{The syntax of the command \textbackslash piton}
-%
-% In fact, the command |\piton| is provided with a double syntax. It may be used
-% as a standard command of LaTeX taking its argument between curly braces
-% (|\piton{...}|) but it may also be used with a syntax similar to the syntax of
-% the command
-% |\verb|, that is to say with the argument delimited by two identical characters (e.g.: \verb!\piton|...|!).
-%
-% \begin{itemize}
-% \item {\color{blue} \textsf{Syntax} \verb|\piton{...}|}\par\nobreak
-% When its argument is given between curly braces, the command |\piton| does not
-% take its argument in verbatim mode. In particular:
-% \begin{itemize}
-% \item several consecutive spaces will be replaced by only one space,
-%
-% {\color{cyan} but the command |\|⣠is provided to force the insertion of a space};
-%
-% \item it's not possible to use |%| inside the argument,
-%
-% {\color{cyan} but the command |\%| is provided to insert a |%|};
-%
-% \item the braces must be appear by pairs correctly nested
-%
-% {\color{cyan} but the commands |\{| and |\}| are also provided for individual braces};
-%
-% \item the LaTeX commands\footnote{That concerns the commands beginning with a
-% backslash but also the active characters.} are fully expanded and not
-% executed,
-%
-% {\color{cyan} so it's possible to use |\\| to insert a backslash}.
-% \end{itemize}
-%
-%
-% The other characters (including |#|, |^|, |_|, |&|, |$| and |@|)
-% must be inserted without backslash.
-%
-% \bigskip
-%\begin{tabular}{>{\color{gray}}w{l}{75mm}@{\hspace*{1cm}}l}
-% \omit Examples : \hfil \\
-% \noalign{\vskip1mm}
-% \verb|\piton{MyString = '\\n'}| &
-% \piton{MyString = '\\n'} \\
-% \verb|\piton{def even(n): return n\%2==0}| &
-% \piton{def even(n): return n\%2==0} \\
-% \verb|\piton{c="#" # an affectation }| &
-% \piton{c="#" # an affectation } \\
-% \verb|\piton{c="#" \ \ \ # an affectation }| &
-% \piton{c="#" \ \ \ # an affectation } \\
-% \verb|\piton{MyDict = {'a': 3, 'b': 4 }}| &
-% \piton{MyDict = {'a': 3, 'b': 4 }}
-% \end{tabular}
-%
-% \bigskip
-% It's possible to use the command |\piton| in the arguments of a
-% LaTeX command.\footnote{For example, it's possible to use the command
-% \texttt{\textbackslash piton} in a footnote. Example :
-% \piton{s = 'A string'}.}
-%
-% \bigskip
-% \item {\color{blue} \textsf{Syntaxe} \verb!\piton|...|!}\par\nobreak
-%
-% When the argument of the command |\piton| is provided between two identical
-% characters, that argument is taken in a \emph{verbatim mode}. Therefore, with
-% that syntax, the command |\piton| can't be used within the argument of another
-% command.
-%
-% \medskip
-%
-% \begin{tabular}{>{\color{gray}}w{l}{75mm}@{\hspace*{1cm}}l}
-% \omit Examples : \hfil \\
-% \noalign{\vskip1mm}
-% \verb!\piton|MyString = '\n'|! &
-% \piton|MyString = '\n'| \\
-% \verb|\piton!def even(n): return n%2==0!| &
-% \piton!def even(n): return n%2==0! \\
-% \verb|\piton+c="#" # an affectation +| &
-% \piton+c="#" # an affectation + \\
-% \verb|\piton?MyDict = {'a': 3, 'b': 4}?| &
-% \piton!MyDict = {'a': 3, 'b': 4}!
-% \end{tabular}
-%
-% \end{itemize}
-%
-% \section{Customization}
-%
-% \subsection{The command \textbackslash PitonOptions}
-%
-%
-% \NewDocumentCommand{\Definition}{m}
-% {{\setlength{\fboxsep}{1pt}\colorbox{gray!20}{\ttfamily \vphantom{gl}#1}}}
-%
-% The command |\PitonOptions| takes in as argument a comma-separated list of
-% \textsl{key=value} pairs. The scope of the settings done by that command is
-% the current TeX group.\footnote{We remind that a LaTeX environment is, in
-% particular, a TeX group.}
-%
-% \begin{itemize}
-% \item The key \Definition{gobble} takes in as value a
-% positive integer~$n$: the first $n$ characters are discarded (before the
-% process of highlightning of the code) for each line of the environment
-% |{Piton}|. These characters are not necessarily spaces.
-%
-% \item When the key \Definition{auto-gobble} is in force, the
-% extension \pkg{piton} computes the minimal value $n$ of the number of
-% consecutive spaces beginning each (non empty) line of the environment
-% |{Piton}| and applies |gobble| with that value of~$n$.
-%
-% \item When the key \Definition{env-gobble} is in force, \pkg{piton} analyzes the last
-% line of the environment |{Piton}|, that is to say the line which contains
-% |\end{Piton}| and determines whether that line contains only spaces followed
-% by the |\end{Piton}|. If we are in that situation, \pkg{piton} computes the
-% number~$n$ of spaces on that line and applies |gobble| with that value of~$n$.
-% The name of that key comes from \emph{environment gobble}: the effect of
-% gobble is set by the position of the commands |\begin{Piton}| and
-% |\end{Piton}| which delimit the current environment.
-%
-% \item With the key \Definition{line-numbers}, the \emph{non empty} lines (and
-% all the lines of the \emph{docstrings}, even the empty ones) are numbered in
-% the environments |{Piton}| and in the listings resulting from the use of
-% |\PitonInputFile|.
-%
-% \item With the key \Definition{all-line-numbers}, \emph{all} the lines are numbered,
-% including the empty ones.
-%
-% \item \colorbox{yellow!50}{\bfseries{New 1.5}}\par\nobreak
-%
-% The key \Definition{numbers-sep} is the horizontal distance between the
-% numbers of lines (inserted by |line-numbers| of |all-line-numbers|) and the
-% beginning of the lines of code. The initial value is 0.7~em.
-%
-% \item With the key \Definition{resume}, the counter of lines is not set to zero
-% at the beginning of each environment |{Piton}| or use of |\PitonInputFile| as
-% it is otherwise. That allows a numbering of the lines across several
-% environments.
-%
-% \item The key \Definition{left-margin} corresponds to a margin on the left.
-% That key may be useful in conjonction with the key |line-numbers| or the key
-% |line-all-numbers| if one does not want the numbers in an overlapping position
-% on the left.
-%
-% It's possible to use the key |left-margin| with the value |auto|. With that
-% value, if the key |line-numbers| or the key |all-line-numbers| is used, a
-% margin will be automatically inserted to fit the numbers of lines. See an
-% example part \ref{example-numbering} on page~\pageref{example-numbering}.
-%
-% \item The key \Definition{background-color} sets the background color of the
-% environments |{Piton}| and the listings produced by |\PitonInputFile| (that
-% background has a width of |\linewidth|).
-%
-% \smallskip
-% \colorbox{yellow!50}{\textbf{New 1.4}}\enskip The key |background-color|
-% supports also as value a \emph{list} of colors. In this case, the successive
-% rows are colored by using the colors of the list in a cyclic way.
-%
-% \emph{Example} : |\PitonOptions{background-color = {gray!5,white}}|
-%
-%
-% The key |background-color| accepts a color defined «on the fly». For example,
-% it's possible to write |background-color = [cmyk]{0.1,0.05,0,0}|.
-%
-% \item With the key \Definition{prompt-background-color}, \pkg{piton} adds a
-% color background to the lines beginning with the prompt ``|>>>|'' (and its
-% continuation ``|...|'') characteristic of the Python consoles with
-% \textsc{repl} (\emph{read-eval-print loop}).
-%
-% \item When the key \Definition{show-spaces-in-strings} is activated, the
-% spaces in the short strings (that is to say those delimited by |'| or |"|) are
-% replaced by the character~⣠(U+2423 : \textsc{open box}). Of course, that
-% character~U+2423 must be present in the monospaced font which is
-% used.\footnote{The package \pkg{piton} simply uses the current monospaced
-% font. The best way to change that font is to use the command
-% \texttt{\textbackslash setmonofont} of the package \pkg{fontspec}.}\par\nobreak
-% \begingroup \PitonOptions{show-spaces-in-strings} Example :
-% \piton|my_string = 'Very good answer'| \endgroup
-%
-% With the key \Definition{show-spaces}, all the spaces are replaced by U+2423
-% (and no line break can occur on those ``visible spaces'', even when the key
-% |break-lines|\footnote{cf. \ref{line-breaks} p.~\pageref{line-breaks}} is in
-% force).
-% \end{itemize}
-%
-% \bigskip
-%
-% \begingroup
-% \fvset{commandchars=\~\&\@,formatcom=\small\color{gray}}
-% \begin{Verbatim}
-% ~emphase&\PitonOptions{line-numbers,auto-gobble,background-color = gray!15}@
-% \begin{Piton}
-% from math import pi
-% def arctan(x,n=10):
-% """Compute the mathematical value of arctan(x)
-%
-% n is the number of terms in the sum
-% """
-% if x < 0:
-% return -arctan(-x) # recursive call
-% elif x > 1:
-% return pi/2 - arctan(1/x)
-% #> (we have used that $\arctan(x)+\arctan(1/x)=\frac{\pi}{2}$ pour $x>0$)
-% else
-% s = 0
-% for k in range(n):
-% s += (-1)**k/(2*k+1)*x**(2*k+1)
-% return s
-% \end{Piton}
-% \end{Verbatim}
-% \endgroup
-%
-% \begingroup
-% \PitonOptions{line-numbers,background-color = gray!15}
-% \begin{Piton}
-% from math import pi
-%
-% def arctan(x,n=10):
-% """Compute the mathematical value of arctan(x)
-%
-% n is the number of terms in the sum
-% """
-% if x < 0:
-% return -arctan(-x) # recursive call
-% elif x > 1:
-% return pi/2 - arctan(1/x)
-% #> (we have used that $\arctan(x)+\arctan(1/x)=\frac{\pi}{2}$ for $x>0$)
-% else
-% s = 0
-% for k in range(n):
-% s += (-1)**k/(2*k+1)*x**(2*k+1)
-% return s
-% \end{Piton}
-% \endgroup
-%
-% \bigskip
-% The command |\PitonOptions| provides in fact several other keys which will be
-% described further (see in particular the ``Pages breaks and line breaks''
-% p.~\pageref{breakable}).
-%
-% \subsection{The styles}
-%
-% \label{styles}
-%
-% The package \pkg{piton} provides the command |\SetPitonStyle| to customize the
-% different styles used to format the syntactic elements of the Python listings.
-% The customizations done by that command are limited to the current TeX
-% group.\footnote{We remind that a LaTeX environment is, in particular, a TeX group.}
-%
-% \bigskip
-% The command |\SetPitonStyle| takes in as argument a comma-separated list of
-% \textsl{key=value} pairs. The keys are names of styles and the value are LaTeX
-% formatting instructions.
-%
-% \bigskip
-% These LaTeX instructions must be formatting instructions such as
-% |\color{...}|, |\bfseries|, |\slshape|, etc. (the commands of this kind are
-% sometimes called \emph{semi-global} commands). It's also possible to put,
-% \emph{at the end of the list of instructions}, a LaTeX command taking exactly
-% one argument.
-%
-% \bigskip
-% Here an example which changes the style used to highlight, in the definition
-% of a Python function, the name of the function which is defined. That code
-% uses the command |\highLight| of \pkg{lua-ul} (that package requires also the
-% package \pkg{luacolor}).
-%
-% \begin{verbatim}
-% \SetPitonStyle{ Name.Function = \bfseries \highLight[red!50] }
-% \end{verbatim}
-%
-% In that example, |\highLight[red!50]| must be considered as the name of a
-% LaTeX command which takes in exactly one argument, since, usually, it is used
-% with |\highLight[red!50]{...}|.
-%
-% \medskip
-% \begingroup
-% \SetPitonStyle
-% { Name.Function = \bfseries \highLight[red!50] }
-% With that setting, we will have : \piton{def cube(x) : return x * x * x }
-% \endgroup
-%
-% \bigskip
-% The different styles are described in the table \ref{Semantic}. The initial
-% settings done by \pkg{piton} in |piton.sty| are inspired by the style
-% \pkg{manni} de Pygments.\footnote{See:
-% \url{https://pygments.org/styles/}. Remark that, by default, Pygments provides for its style \pkg{manni} a colored background whose color is the HTML color \texttt{\#F0F3F3}. It's possible to have the same color in \texttt{\{Pion\}} with the instruction \texttt{\textbackslash PitonOptions\{background-color = [HTML]\{F0F3F3\}\}}.}
-%
-% \bigskip
-% \colorbox{yellow!50}{\textbf{New 1.4}}\enskip The command |\PitonStyle| takes
-% in as argument the name of a style and allows to retrieve the value (as a list
-% of LaTeX instructions) of that style.
-%
-% \smallskip
-% For example, it's possible to write |{\PitonStyle{Keyword}{function}}| and we
-% will have the word {\PitonStyle{Keyword}{function}} formatted as a keyword.
-%
-% \smallskip
-% The syntax |{\PitonStyle{|\textsl{\texttt{style}}|}{...}}| is mandatory in
-% order to be able to deal both with the semi-global commands and the commands
-% with arguments which may be present in the definition of the style
-% \texttt{\textsl{style}}.
-%
-% \begin{table}[b]
-% \centering
-% \caption{Usage of the different styles}
-% \label{Semantic}
-% \begin{tabular}{@{}>{\ttfamily}l>{\RaggedRight\arraybackslash}p{9cm}@{}}
-% \toprule
-% \normalfont Style & Usage \\
-% \midrule
-% Number & the numbers \\
-% String.Short & the short strings (between \texttt{'} or \verb|"|) \\
-% String.Long & the long strings (between \texttt{'''} or \verb|"""|) except the
-% documentation strings \\
-% String & that keys sets both |String.Short| and |String.Long| \\
-% String.Doc & the documentation strings (only between \texttt{"""} following
-% PEP~257) \\
-% String.Interpol & the syntactic elements of the fields of the f-strings (that
-% is to say the characters \texttt{\{} and \texttt{\}}) \\
-% Operator & the following operators : \texttt{!= == << >> - \~{} + / * \% = < > \& .} \verb+|+ \verb|@|\\
-% Operator.Word & the following operators : \texttt{in}, \texttt{is},
-% \texttt{and}, \texttt{or} and \texttt{not} \\
-% Name.Builtin & the predefined functions of Python \\
-% Name.Function & the name of the functions defined by the user, at the point of
-% their definition (that is to say after the keyword |def|) \\
-% Name.Decorator & the decorators (instructions beginning by \verb|@|) \\
-% Name.Namespace & the name of the modules (= external libraries) \\
-% Name.Class & the name of the classes at the point of their definition (that is
-% to say after the keyword |class|) \\
-% Exception & the names of the exceptions (eg: \texttt{SyntaxError}) \\
-% Comment & the comments beginning with \verb|#| \\
-% Comment.LaTeX & the comments beginning by \verb|#>|, which are composed in LaTeX by
-% \pkg{piton} (and simply called ``LaTeX comments'' in this document) \\
-% Keyword.Constant & |True|, |False| and |None| \\
-% Keyword & the following keywords :
-% \ttfamily as, assert, break, case, continue, def, del,
-% elif, else, except, exec, finally, for, from,
-% global, if, import, lambda, non local,
-% pass, raise, return, try, while,
-% with, yield, yield from.\\
-% \bottomrule
-% \end{tabular}
-% \end{table}
-%
-%
-%
-%
-% \subsection{Creation of new environments}
-%
-% \label{NewPitonEnvironment}
-%
-% Since the environment |{Piton}| has to catch its body in a special way (more
-% or less as verbatim text), it's not possible to construct new environments
-% directly over the environment |{Piton}| with the classical commands
-% |\newenvironment| or |\NewDocumentEnvironment|.
-%
-% That's why \pkg{piton} provides a command |\NewPitonEnvironment|. That
-% command takes in three mandatory arguments.
-
-% That command has the same syntax as the classical environment
-% |\NewDocumentEnvironment|.
-%
-% \bigskip
-% With the following instruction, a new environment |{Python}| will be
-% constructed with the same behaviour as |{Piton}|:
-%
-% {\color{gray}\verb|\NewPitonEnvironment{Python}{}{}{}|}
-%
-% \bigskip
-% If one wishes an environment |{Python}| with takes in as optional argument
-% (between square brackets) the keys of the command |\PitonOptions|, it's
-% possible to program as follows:
-%
-% {\color{gray}\verb|\NewPitonEnvironment{Python}{O{}}{\PitonOptions{#1}}{}|}
-%
-% \bigskip
-% If one wishes to format Python code in a box of \pkg{tcolorbox}, it's possible
-% to define an environment |{Python}| with the following code (of course, the
-% package \pkg{tcolorbox} must be loaded).
-%
-%\begin{verbatim}
-% \NewPitonEnvironment{Python}{}
-% {\begin{tcolorbox}}
-% {\end{tcolorbox}}
-% \end{verbatim}
-%
-% \bigskip
-% With this new environment |{Python}|, it's possible to write:
-%
-% \begin{Verbatim}
-% ~emphase#\begin{Python}@
-% def square(x):
-% """Compute the square of a number"""
-% return x*x
-% ~emphase#\end{Python}@
-% \end{Verbatim}
-%
-% \NewPitonEnvironment{Python}{}
-% {\begin{tcolorbox}}
-% {\end{tcolorbox}}
-%
-% \begin{Python}
-% def square(x):
-% """Compute the square of a number"""
-% return x*x
-% \end{Python}
-%
-%
-% \section{Advanced features}
-%
-% \subsection{Highlighting some identifiers}
-%
-% \colorbox{yellow!50}{\textbf{New 1.4}} It's possible to require a changement
-% of formating for some identifiers with the key |identifiers| of
-% |\PitonOptions|.
-%
-% \smallskip
-% That key takes in as argument a value of the following format:
-%
-% \quad |{ names = |\textsl{\ttfamily names}|, style = |\textsl{\ttfamily
-% instructions}| }|
-%
-% \begin{itemize}
-% \item \textsl{\ttfamily names} is a (comma-separated) list of identifiers
-% names;
-%
-% \item \textsl{\ttfamily instructions} is a list of LaTeX instructions of the
-% same type that \pkg{piton} ``styles'' previously presented (cf~\ref{styles}
-% p.~\pageref{styles}).
-% \end{itemize}
-%
-% \emph{Caution}: Only the identifiers may be concerned by that key. The
-% keywords and the built-in functions won't be affected, even if their name is
-% in the list |\textsl{\ttfamily names}|.
-%
-% \begin{Verbatim}
-% \PitonOptions
-% {
-% ~emphase#identifiers@ =
-% {
-% ~emphase#names@ = { l1 , l2 } ,
-% ~emphase#style@ = \color{red}
-% }
-% }
-%
-% \begin{Piton}
-% def tri(l):
-% """Segmentation sort"""
-% if len(l) <= 1:
-% return l
-% else:
-% a = l[0]
-% l1 = [ x for x in l[1:] if x < a ]
-% l2 = [ x for x in l[1:] if x >= a ]
-% return tri(l1) + [a] + tri(l2)
-% \end{Piton}
-% \end{Verbatim}
-%
-%
-% \bigskip
-%
-% \begingroup
-%
-% \PitonOptions
-% {
-% identifiers =
-% {
-% names = { l1 , l2 } ,
-% style = \color{red}
-% }
-% }
-%
-% \begin{Piton}
-% def tri(l):
-% """Segmentation sort"""
-% if len(l) <= 1:
-% return l
-% else:
-% a = l[0]
-% l1 = [ x for x in l[1:] if x < a ]
-% l2 = [ x for x in l[1:] if x >= a ]
-% return tri(l1) + [a] + tri(l2)
-% \end{Piton}
-%
-% \endgroup
-%
-% \bigskip
-% By using the key |identifier|, it's possible to add other built-in functions
-% (or other new keywords, etc.) that will be detected by \pkg{piton}.
-%
-%
-% \begin{Verbatim}
-% \PitonOptions
-% {
-% ~emphase#identifiers@ =
-% {
-% names = { cos, sin, tan, floor, ceil, trunc, pow, exp, ln, factorial } ,
-% style = \PitonStyle{Name.Builtin}
-% }
-% }
-%
-% \begin{Piton}
-% from math import *
-% cos(pi/2)
-% factorial(5)
-% ceil(-2.3)
-% floor(5.4)
-% \end{Piton}
-% \end{Verbatim}
-%
-% \begingroup
-%
-% \PitonOptions
-% {
-% identifiers =
-% {
-% names = { cos, sin, tan, floor, ceil, trunc, pow, exp, ln, factorial } ,
-% style = \PitonStyle{Name.Builtin}
-% }
-% }
-%
-% \begin{Piton}
-% from math import *
-% cos(pi/2)
-% factorial(5)
-% ceil(-2.3)
-% floor(5.4)
-% \end{Piton}
-%
-%
-% \endgroup
-%
-%
-% \subsection{Mechanisms to escape to LaTeX}
-%
-% The package \pkg{piton} provides several mechanisms for escaping to LaTeX:
-% \begin{itemize}
-% \item It's possible to compose comments entirely in LaTeX.
-% \item It's possible to have the elements between \texttt{\$} in the comments
-% composed in LateX mathematical mode.
-% \item It's also possible to insert LaTeX code almost everywhere in a Python listing.
-% \end{itemize}
-%
-% One should aslo remark that, when the extension \pkg{piton} is used with the
-% class \cls{beamer}, \pkg{piton} detects in |{Piton}| many commands and
-% environments of Beamer: cf. \ref{beamer} p.~\pageref{beamer}.
-%
-% \subsubsection{The ``LaTeX comments''}
-%
-% In this document, we call ``LaTeX comments'' the comments which begins by
-% |#>|. The code following those characters, until the end of the line, will be
-% composed as standard LaTeX code. There is two tools to customize those
-% comments.
-%
-% \begin{itemize}
-% \item It's possible to change the syntatic mark (which, by default, is |#>|).
-% For this purpose, there is a key |comment-latex| available at load-time (that
-% is to say at the |\usepackage|) which allows to choice the characters which,
-% preceded by |#|, will be the syntatic marker.
-%
-% For example, with the following loading:
-%
-% \quad \verb|\usepackage[comment-latex = LaTeX]{piton}|
-%
-% the LaTeX comments will begin by |#LaTeX|.
-%
-% If the key |comment-latex| is used with the empty value, all the Python
-% comments (which begins by |#|) will, in fact, be ``LaTeX comments''.
-%
-% \smallskip
-% \item It's possible to change the formatting of the LaTeX comment itself by
-% changing the \pkg{piton} style |Comment.LaTeX|.
-%
-% For example, with |\SetPitonStyle{Comment.LaTeX = \normalfont\color{blue}}|,
-% the LaTeX comments will be composed in blue.
-%
-% If you want to have a character |#| at the beginning of the LaTeX comment in
-% the \textsc{pdf}, you can use set |Comment.LaTeX| as follows:
-%
-% \begin{Verbatim}
-% \SetPitonStyle{Comment.LaTeX = \color{gray}\~#\normalfont\space }
-% \end{Verbatim}
-%
-% For other examples of customization of the LaTeX comments, see the part
-% \ref{example-comments} p.~\pageref{example-comments}
-% \end{itemize}
-%
-% \bigskip
-% If the user has required line numbers in the left margin (with the
-% key |line-numbers| or the key |all-line-numbers| of |\PitonOptions|), it's
-% possible to refer to a number of line with the command |\label| used in a
-% LaTeX comment.\footnote{That feature is implemented by using a redefinition of
-% the standard command \texttt{\textbackslash label} in the environments
-% \texttt{\{Piton\}}. Therefore, incompatibilities may occur with extensions
-% which redefine (globally) that command \texttt{\textbackslash label} (for
-% example: \pkg{varioref}, \pkg{refcheck}, \pkg{showlabels}, etc.)}
-%
-% \subsubsection{The key ``math-comments''}
-%
-% It's possible to request that, in the standard Python comments (that is to say
-% those beginning by |#| and not |#>|), the elements between \texttt{\$} be
-% composed in LaTeX mathematical mode (the other elements of the comment being
-% composed verbatim).
-%
-% That feature is activated by the key |math-comments| at load-time (that is to
-% say with the |\usepackage|).
-%
-% \medskip
-% In the following example, we assume that the key |math-comments| has been used
-% when loading \pkg{piton}.
-%
-% \begin{Verbatim}
-% \begin{Piton}
-% def square(x):
-% return x*x ~# compute $x^2$
-% \end{Piton}
-% \end{Verbatim}
-%
-% \begin{Piton}
-% def square(x):
-% return x*x # compute $x^2$
-% \end{Piton}
-%
-% \subsubsection{The mechanism ``escape-inside''}
-%
-% It's also possible to overwrite the Python listings to insert LaTeX code
-% almost everywhere (but between lexical units, of course). By default,
-% \pkg{piton} does not fix any character for that kind of escape.
-%
-% In order to use this mechanism, it's necessary to specify two characters which
-% will delimit the escape (one for the beginning and one for the end) by using
-% the key |escape-inside| at load-time (that is to say at the
-% |\begin{docuemnt}|).
-%
-% \medskip
-% In the following example, we assume that the extension \pkg{piton} has been
-% loaded by the following instruction.
-%
-% \begin{Verbatim}
-% \usepackage[~emphase#escape-inside=$$@]{piton}
-% \end{Verbatim}
-%
-% \medskip
-% In the following code, which is a recursive programmation of the mathematical
-% factorial, we decide to highlight in yellow the instruction which contains the
-% recursive call. That example uses the command |\highLight| of \pkg{lua-ul}
-% (that package requires itself the package \pkg{luacolor}).
-% \begin{Verbatim}
-% \begin{Piton}
-% def fact(n):
-% if n==0:
-% return 1
-% else:
-% ~emphase#$\highLight{$@return n*fact(n-1)~emphase#$}$@
-% \end{Piton}
-% \end{Verbatim}
-%
-% \begin{Piton}
-% def fact(n):
-% if n==0:
-% return 1
-% else:
-% $\highLight{$return n*fact(n-1)$}$
-% \end{Piton}
-%
-% \bigskip
-% In fact, in that case, it's probably easier to use the command |\@highLight|
-% of \pkg{lua-ul}: that command sets a yellow background until the end of the
-% current TeX group. Since the name of that command contains the character |@|,
-% it's necessary to define a synonym without |@| in order to be able to use it
-% directly in |{Piton}|.
-% \begingroup
-% \fvset{commandchars=\~\#\+,formatcom=\color{gray}}
-% \begin{Verbatim}
-% \makeatletter
-% ~emphase#\let\Yellow\@highLight+
-% \makeatother
-% \end{Verbatim}
-% \endgroup
-%
-% \begin{Verbatim}
-% \begin{Piton}
-% def fact(n):
-% if n==0:
-% return 1
-% else:
-% ~emphase#$\Yellow$@return n*fact(n-1)
-% \end{Piton}
-% \end{Verbatim}
-%
-% \makeatletter
-% \let\Yellow\@highLight
-% \makeatother
-%
-%
-% \begin{Piton}
-% def fact(n):
-% if n==0:
-% return 1
-% else:
-% $\Yellow$return n*fact(n-1)
-% \end{Piton}
-%
-%
-%
-% \bigskip
-% \emph{Caution} : The escape to LaTeX allowed by the characters of
-% |escape-inside| is not active in the strings nor in the Python comments
-% (however, it's possible to have a whole Python comment composed in LaTeX by
-% beginning it with |#>|; such comments are merely called ``LaTeX comments'' in
-% this document).
-%
-%
-% \subsection{Behaviour in the class Beamer}
-%
-% \label{beamer}
-%
-% \emph{First remark}\par\nobreak
-% Since the environment |{Piton}| catches its body with a verbatim mode,
-% it's necessary to use the environments |{Piton}| within environments |{frame}|
-% of Beamer protected by the key |fragile|.\footnote{Remind that for an
-% environment \texttt{\{frame\}} of Beamer using the key |fragile|, the
-% instruction \texttt{\textbackslash end\{frame\}} must be alone on a single
-% line (except for any leading whitespace).}
-%
-%
-% \bigskip
-% When the package \pkg{piton} is used within the class
-% \cls{beamer}\footnote{The extension \pkg{piton} detects the class \cls{beamer}
-% but, if needed, it's also possible to activate that mechanism with the key
-% |beamer| provided by \pkg{piton} at load-time: |\textbackslash
-% usepackage[beamer]\{piton\}|}, the behaviour of \pkg{piton} is slightly
-% modified, as described now.
-%
-% \subsubsection{\{Piton\} et \textbackslash PitonInputFile are
-% ``overlay-aware''}
-%
-% When \pkg{piton} is used in the class \cls{beamer}, the environment |{Piton}|
-% and the command |\PitonInputFile| accept the optional argument |<...>| of
-% Beamer for the overlays which are involved.
-%
-% For example, it's possible to write:
-%
-% \begin{Verbatim}
-% \begin{Piton}~emphase#<2-5>@
-% ...
-% \end{Piton}
-% \end{Verbatim}
-%
-% and
-%
-% \begin{Verbatim}
-% \PitonInputFile~emphase#<2-5>@{my_file.py}
-% \end{Verbatim}
-%
-% \subsubsection{Commands of Beamer allowed in \{Piton\} and \textbackslash PitonInputFile}
-%
-% When \pkg{piton} is used in the class \cls{beamer} , the following commands of
-% \cls{beamer} (classified upon their number of arguments) are automatically
-% detected in the environments |{Piton}| (and in the listings processed by
-% |\PitonInputFile|):
-% \begin{itemize}
-% \item no mandatory argument : |\pause|\footnote{One should remark that it's
-% also possible to use the command \texttt{\textbackslash pause} in a ``LaTeX
-% comment'', that is to say by writing \texttt{\#> \textbackslash pause}. By
-% this way, if the Python code is copied, it's still executable by Python}. ;
-% \item one mandatory argument : |\action|, |\alert|, |\invisible|, |\only|, |\uncover| and |\visible| ;
-% \item two mandatory arguments : |\alt| ;
-% \item three mandatory arguments : |\temporal|.
-% \end{itemize}
-
-% \medskip
-% In the mandatory arguments of these commands, the braces must be balanced.
-% However, the braces included in short strings\footnote{The short strings of
-% Python are the strings delimited by characters \texttt{'} or the characters
-% \texttt{"} and not \texttt{'''} nor \texttt{"""}. In Python, the short strings
-% can't extend on several lines.} of Python are not considered.
-%
-% \medskip
-% Here is a complete example of file:
-%
-% \begin{Verbatim}[formatcom = \small\color{gray}]
-% \documentclass{beamer}
-% \usepackage{piton}
-% \begin{document}
-% \begin{frame}[fragile]
-% \begin{Piton}
-% def string_of_list(l):
-% """Convert a list of numbers in string"""
-% ~emphase# \only<2->{s = "{" + str(l[0])}@
-% ~emphase# \only<3->{for x in l[1:]: s = s + "," + str(x)}@
-% ~emphase# \only<4->{s = s + "}"}@
-% return s
-% \end{Piton}
-% \end{frame}
-% \end{document}
-% \end{Verbatim}
-%
-% In the previous example, the braces in the Python strings |"{"| and |"}"| are
-% correctly interpreted (without any escape character).
-%
-%
-%
-%
-% \bigskip
-% \subsubsection{Environments of Beamer allowed in \{Piton\} and \textbackslash PitonInputFile}
-%
-% When \pkg{piton} is used in the class \pkg{beamer}, the following environments
-% of Beamer are directly detected in the environments |{Piton}| (and in the
-% listings processed by |\PitonInputFile|): |{actionenv}|, |{alertenv}|,
-% |{invisibleenv}|, |{onlyenv}|, |{uncoverenv}| and |{visibleenv}|.
-%
-% However, there is a restriction: these environments must contain only \emph{whole
-% lines of Python code} in their body.
-%
-%\medskip
-% Here is an example:
-%
-% \begin{Verbatim}[formatcom = \small\color{gray}]
-% \documentclass{beamer}
-% \usepackage{piton}
-% \begin{document}
-% \begin{frame}[fragile]
-% \begin{Piton}
-% def square(x):
-% """Compure the square of its argument"""
-% ~emphase#\begin{uncoverenv}<2>@
-% return x*x
-% ~emphase#\end{uncoverenv}@
-% \end{Piton}
-% \end{frame}
-% \end{document}
-% \end{Verbatim}
-%
-%
-% \vspace{1cm}
-% \textbf{Remark concerning the command \textbackslash alert and the environment
-% \{alertenv\} of Beamer}\par\nobreak
-%
-% \smallskip
-% Beamer provides an easy way to change the color used by the environment
-% |{alertenv}| (and by the command |\alert| which relies upon it) to highlight
-% its argument. Here is an example:
-%
-% \begin{Verbatim}
-% \setbeamercolor{~emphase#alerted text@}{fg=blue}
-% \end{Verbatim}
-%
-% However, when used inside an environment |{Piton}|, such tuning will probably
-% not be the best choice because \pkg{piton} will, by design, change (most of
-% the time) the color the different elements of text. One may prefer an environment
-% |{alertenv}| that will change the background color for the elements to be
-% hightlighted.
-%
-% \smallskip
-% Here is a code that will do that job and add a yellow background. That code
-% uses the command |\@highLight| of \pkg{lua-ul} (that extension requires also
-% the package \pkg{luacolor}).
-%
-% \begingroup
-% \fvset{commandchars=\~\#\+,formatcom=\color{gray}}
-% \begin{Verbatim}
-% \setbeamercolor{alerted text}{bg=yellow!50}
-% \makeatletter
-% \AddToHook{env/Piton/begin}
-% {\renewenvironment<>{alertenv}{\only~#1{~emphase#\@highLight+[alerted text.bg]}}{}}
-% \makeatother
-% \end{Verbatim}
-% \endgroup
-%
-% That code redefines locally the environment |{alertenv}| within the
-% environments |{Piton}| (we recall that the command |\alert| relies upon that
-% environment |{alertenv}|).
-%
-% \subsection{Page breaks and line breaks}
-%
-% \label{breakable}
-%
-% \subsubsection{Page breaks}
-%
-% By default, the listings produced by the environment |{Piton}| and the command
-% |\PitonInputFile| are not breakable.
-%
-% However, the command |\PitonOptions| provides the key |splittable| to allow such
-% breaks.
-%
-% \begin{itemize}
-% \item If the key |splittable| is used without any value, the listings are
-% breakable everywhere.
-% \item If the key |splittable| is used with a numeric value~$n$ (which must be
-% a non-negative integer number), the listings are breakable but no break will
-% occur within the first $n$ lines and within the last $n$ lines. Therefore,
-% |splittable=1| is equivalent to |splittable|.
-% \end{itemize}
-%
-% \medskip
-% Even with a background color (set by the key |background-color|), the pages
-% breaks are allowed, as soon as the key |splittable| is in force.\footnote{With
-% the key |splittable|, the environments \texttt{\{Piton\}} are breakable, even
-% within a (breakable) environment of \pkg{tcolorbox}. Remind that an
-% environment of \pkg{tcolorbox} included in another environment of
-% \pkg{tcolorbox} is \emph{not} breakable, even when both environments use the
-% key |breakable| of \pkg{tcolorbox}.}
-%
-% \subsubsection{Line breaks}
-%
-% \label{line-breaks}
-%
-% By default, the elements produced by \pkg{piton} can't be broken by an end on
-% line. However, there are keys to allow such breaks (the possible breaking
-% points are the spaces, even the spaces in the Python strings).
-% \begin{itemize}
-% \item With the key |break-lines-in-piton|, the line breaks are allowed in the
-% command |\piton{...}| (but not in the command \verb+\piton|...|+, that is to say
-% the command |\piton| in verbatim mode).
-% \item With the key |break-lines-in-Piton|, the line breaks are allowed in the
-% environment |{Piton}| (hence the capital letter |P| in the name) and in the
-% listings produced by |\PitonInputFile|.
-% \item The key |break-lines| is a conjonction of the two previous keys.
-% \end{itemize}
-%
-% \bigskip
-% The package \pkg{piton} provides also several keys to control the appearance
-% on the line breaks allowed by |break-lines-in-Piton|.
-%
-% \begin{itemize}
-% \item With the key |indent-broken-lines|, the indentation of a broken line is
-% respected at carriage return.
-%
-% \item The key |end-of-broken-line| corresponds to the symbol placed at the end
-% of a broken line. The initial value is: |\hspace*{0.5em}\textbackslash|.
-%
-% \item The key |continuation-symbol| corresponds to the symbol placed at each
-% carriage return. The initial value is: |+\;|.
-%
-% \item The key |continuation-symbol-on-indentation| coresponds to the symbol
-% placed at each carriage return, on the position of the indentation (only when
-% the key |indent-broken-line| is in force). The initial value is:
-% |$\hookrightarrow\;$|.
-% \end{itemize}
-%
-%
-% \bigskip
-% The following code has been composed in a standard LaTeX |{minipage}| of width
-% 12~cm with the following tuning:
-%
-% \begin{Verbatim}
-% \PitonOptions{break-lines,indent-broken-lines,background-color=gray!15}
-% \end{Verbatim}
-%
-% \begin{center}
-% \PitonOptions{break-lines,indent-broken-lines,background-color=gray!15}
-% \begin{minipage}{12cm}
-% \begin{Piton}
-% def dict_of_list(l):
-% """Converts a list of subrs and descriptions of glyphs in a dictionary"""
-% our_dict = {}
-% for list_letter in l:
-% if (list_letter[0][0:3] == 'dup'): # if it's a subr
-% name = list_letter[0][4:-3]
-% print("We treat the subr of number " + name)
-% else:
-% name = list_letter[0][1:-3] # if it's a glyph
-% print("We treat the glyph of number " + name)
-% our_dict[name] = [treat_Postscript_line(k) for k in list_letter[1:-1]]
-% return dict
-% \end{Piton}
-% \end{minipage}
-% \end{center}
-%
-% \subsection{Footnotes in the environments of piton}
-%
-% \label{footnote}
-% If you want to put footnotes in an environment |{Piton}| or
-% (or, more unlikely, in a listing produced by |\PitonInputFile|), you can use a
-% pair |\footnotemark|--|\footnotetext|.
-%
-% \smallskip
-% However, it's also possible to extract the footnotes with the help of the
-% package \pkg{footnote} or the package \pkg{footnotehyper}.
-%
-% \smallskip
-% If \pkg{piton} is loaded with the option |footnote| (with
-% |\usepackage[footnote]{piton}| or with |\PassOptionsToPackage|), the
-% package \pkg{footnote} is loaded (if it is not yet loaded) and it is used to
-% extract the footnotes.
-%
-% \smallskip
-% If \pkg{piton} is loaded with the option |footnotehyper|, the package
-% \pkg{footnotehyper} is loaded (if it is not yet loaded) ant it is used to
-% extract footnotes.
-%
-% \smallskip
-% Caution: The packages \pkg{footnote} and \pkg{footnotehyper} are incompatible.
-% The package \pkg{footnotehyper} is the successor of the package \pkg{footnote}
-% and should be used preferently. The package \pkg{footnote} has some drawbacks,
-% in particular: it must be loaded after the package \pkg{xcolor} and it is not
-% perfectly compatible with \pkg{hyperref}.
-%
-% \medskip
-% In this document, the package \pkg{piton} has been loaded with the
-% option |footnotehyper|. For examples of notes, cf. \ref{notes-examples},
-% p.~\pageref{notes-examples}.
-%
-% \subsection{Tabulations}
-%
-% \smallskip
-% Even though it's recommended to indent the Python listings with spaces (see
-% PEP~8), \pkg{piton} accepts the characters of tabulation (that is to say the
-% characters U+0009) at the beginning of the lines. Each character U+0009 is
-% replaced by $n$~spaces. The initial value of $n$ is $4$ but it's possible to
-% change it with the key |tab-size| of |\PitonOptions|.
-%
-% \smallskip
-% There exists also a key |tabs-auto-gobble| which computes the minimal value
-% $n$ of the number of consecutive characters U+0009 beginning each (non empty)
-% line of the environment |{Piton}| and applies |gobble| with that value of~$n$
-% (before replacement of the tabulations by spaces, of course). Hence, that key
-% is similar to the key |auto-gobble| but acts on U+0009 instead of U+0020
-% (spaces).
-%
-% \section{Examples}
-%
-% \subsection{Line numbering}
-%
-% \label{example-numbering}
-%
-% We remind that it's possible to have an automatic numbering of the lines in
-% the Python listings by using the key |line-numbers| or the key |all-line-numbers|.
-%
-% By default, the numbers of the lines are composed by \pkg{piton} in an
-% overlapping position on the left (by using internally the command |\llap| of LaTeX).
-%
-% In order to avoid that overlapping, it's possible to use the option |left-margin=auto|
-% which will insert automatically a margin adapted to the numbers of lines that
-% will be written (that margin is larger when the numbers are greater than~10).
-%
-%
-% \begingroup
-% \fvset{commandchars=\~\&\@,formatcom=\small\color{gray}}
-% \begin{Verbatim}
-% ~emphase&\PitonOptions{background-color=gray!10, left-margin = auto, line-numbers}@
-% \begin{Piton}
-% def arctan(x,n=10):
-% if x < 0:
-% return -arctan(-x) #> (appel récursif)
-% elif x > 1:
-% return pi/2 - arctan(1/x) #> (autre appel récursif)
-% else:
-% return sum( (-1)**k/(2*k+1)*x**(2*k+1) for k in range(n) )
-% \end{Piton}
-% \end{Verbatim}
-% \endgroup
-%
-%
-%
-% \begingroup
-% \PitonOptions{background-color=gray!10,left-margin = auto, line-numbers}
-% \begin{Piton}
-% def arctan(x,n=10):
-% if x < 0:
-% return -arctan(-x) #> (appel récursif)
-% elif x > 1:
-% return pi/2 - arctan(1/x) #> (autre appel récursif)
-% else:
-% return sum( (-1)**k/(2*k+1)*x**(2*k+1) for k in range(n) )
-% \end{Piton}
-% \endgroup
-%
-%
-%
-% \bigskip
-% \subsection{Formatting of the LaTeX comments}
-%
-% \label{example-comments}
-%
-% It's possible to modify the style |Comment.LaTeX| (with |\SetPitonStyle|) in
-% order to display the LaTeX comments (which begin with |#>|) aligned on the
-% right margin.
-%
-%
-% \begingroup
-% \fvset{commandchars=\~\&\@,formatcom=\small\color{gray}}
-% \begin{Verbatim}
-% \PitonOptions{background-color=gray!10}
-% ~emphase&\SetPitonStyle{Comment.LaTeX = \hfill \normalfont\color{gray}}@
-% \begin{Piton}
-% def arctan(x,n=10):
-% if x < 0:
-% return -arctan(-x) #> appel récursif
-% elif x > 1:
-% return pi/2 - arctan(1/x) #> autre appel récursif
-% else:
-% return sum( (-1)**k/(2*k+1)*x**(2*k+1) for k in range(n) )
-% \end{Piton}
-% \end{Verbatim}
-% \endgroup
-%
-% \begingroup
-% \PitonOptions{background-color=gray!10}
-% \SetPitonStyle{Comment.LaTeX = \hfill \normalfont\color{gray}}
-% \begin{Piton}
-% def arctan(x,n=10):
-% if x < 0:
-% return -arctan(-x) #> appel récursif
-% elif x > 1:
-% return pi/2 - arctan(1/x) #> autre appel récursif
-% else:
-% return sum( (-1)**k/(2*k+1)*x**(2*k+1) for k in range(n) )
-% \end{Piton}
-% \endgroup
-%
-%
-% \vspace{1cm}
-% It's also possible to display these LaTeX comments in a kind of second column
-% by limiting the width of the Python code by an environment |{minipage}| of LaTeX.
-%
-%
-% \begingroup
-% \fvset{commandchars=\~\&\@,formatcom=\small\color{gray}}
-% \begin{Verbatim}
-% \PitonOptions{background-color=gray!10}
-% ~emphase&\NewDocumentCommand{\MyLaTeXCommand}{m}{\hfill \normalfont\itshape\rlap{\quad #1}}@
-% ~emphase&\SetPitonStyle{Comment.LaTeX = \MyLaTeXCommand}@
-% ~emphase&\begin{minipage}{12cm}@
-% \begin{Piton}
-% def arctan(x,n=10):
-% if x < 0:
-% return -arctan(-x) #> appel récursif
-% elif x > 1:
-% return pi/2 - arctan(1/x) #> autre appel récursif
-% else:
-% s = 0
-% for k in range(n):
-% s += (-1)**k/(2*k+1)*x**(2*k+1)
-% return s
-% \end{Piton}
-% ~emphase&\end{minipage}@
-% \end{Verbatim}
-% \endgroup
-%
-%
-%
-% \begingroup
-% \PitonOptions{background-color=gray!10}
-% \NewDocumentCommand{\MyLaTeXCommand}{m}{\hfill \normalfont\itshape\rlap{\quad #1}}
-% \SetPitonStyle{Comment.LaTeX = \MyLaTeXCommand}
-% \begin{minipage}{12cm}
-% \begin{Piton}
-% def arctan(x,n=10):
-% if x < 0:
-% return -arctan(-x) #> appel récursif
-% elif x > 1:
-% return pi/2 - arctan(1/x) #> autre appel récursif
-% else:
-% s = 0
-% for k in range(n):
-% s += (-1)**k/(2*k+1)*x**(2*k+1)
-% return s
-% \end{Piton}
-% \end{minipage}
-% \endgroup
-%
-%
-% \bigskip
-% \subsection{Notes in the listings}
-%
-% \label{notes-examples}
-%
-% In order to be able to extract the notes (which are typeset with the command
-% |\footnote|), the extension \pkg{piton} must be loaded with the key |footnote|
-% or the key |footenotehyper| as explained in the section \ref{footnote}
-% p.~\pageref{footnote}. In this document, the extension \pkg{piton} has been
-% loaded with the key |footnotehyper|.
-%
-% Of course, in an environment |{Piton}|, a command |\footnote| may appear only
-% within a LaTeX comment (which begins with |#>|). It's possible to have comments
-% which contain only that command |\footnote|. That's the case in the following example.
-%
-%
-%
-% \begingroup
-% \fvset{commandchars=\~\&\@,formatcom=\small\color{gray}}
-% \begin{Verbatim}
-% \PitonOptions{background-color=gray!10}
-% \begin{Piton}
-% def arctan(x,n=10):
-% if x < 0:
-% return -arctan(-x)~emphase&#>\footnote{First recursive call.}]@
-% elif x > 1:
-% return pi/2 - arctan(1/x)~emphase&#>\footnote{Second recursive call.}@
-% else:
-% return sum( (-1)**k/(2*k+1)*x**(2*k+1) for k in range(n) )
-% \end{Piton}
-% \end{Verbatim}
-% \endgroup
-%
-% \begingroup
-% \PitonOptions{background-color=gray!10}
-% \begin{Piton}
-% def arctan(x,n=10):
-% if x < 0:
-% return -arctan(-x)#>\footnote{First recursive call.}
-% elif x > 1:
-% return pi/2 - arctan(1/x)#>\footnote{Second recursive call.}
-% else:
-% return sum( (-1)**k/(2*k+1)*x**(2*k+1) for k in range(n) )
-% \end{Piton}
-% \endgroup
-%
-%
-% \vspace{1cm}
-%
-% If an environment |{Piton}| is used in an environment |{minipage}| of LaTeX,
-% the notes are composed, of course, at the foot of the environment
-% |{minipage}|. Recall that such |{minipage}| can't be broken by a page break.
-%
-%
-% \begingroup
-% \fvset{commandchars=\~\&\@,formatcom=\small\color{gray}}
-% \begin{Verbatim}
-% \PitonOptions{background-color=gray!10}
-% \emphase\begin{minipage}{\linewidth}
-% \begin{Piton}
-% def arctan(x,n=10):
-% if x < 0:
-% return -arctan(-x)~emphase&#>\footnote{First recursive call.}@
-% elif x > 1:
-% return pi/2 - arctan(1/x)~emphase&#>\footnote{Second recursive call.}@
-% else:
-% return sum( (-1)**k/(2*k+1)*x**(2*k+1) for k in range(n) )
-% \end{Piton}
-% \end{minipage}
-% \end{Verbatim}
-% \endgroup
-%
-% \begingroup
-% \PitonOptions{background-color=gray!10}
-% \begin{minipage}{\linewidth}
-% \begin{Piton}
-% def arctan(x,n=10):
-% if x < 0:
-% return -arctan(-x)#>\footnote{First recursive call.}
-% elif x > 1:
-% return pi/2 - arctan(1/x)#>\footnote{Second recursive call.}
-% else:
-% return sum( (-1)**k/(2*k+1)*x**(2*k+1) for k in range(n) )
-% \end{Piton}
-% \end{minipage}
-% \endgroup
-%
-%
-% \vspace{1cm}
-% If we embed an environment |{Piton}| in an environment |{minipage}|
-% (typically in order to limit the width of a colored background), it's
-% necessary to embed the whole environment |{minipage}| in an environment
-% |{savenotes}| (of \pkg{footnote} or \pkg{footnotehyper}) in order to have the
-% footnotes composed at the bottom of the page.
-%
-% \begingroup
-% \fvset{commandchars=\~\&\@,formatcom=\small\color{gray}}
-% \begin{Verbatim}
-% \PitonOptions{background-color=gray!10}
-% ~emphase&\begin{savenotes}@
-% \begin{minipage}{13cm}
-% \begin{Piton}
-% def arctan(x,n=10):
-% if x < 0:
-% return -arctan(-x)~emphase&#>\footnote{First recursive call.}@
-% elif x > 1:
-% return pi/2 - arctan(1/x)~emphase&#>\footnote{Second recursive call.}@
-% else:
-% return sum( (-1)**k/(2*k+1)*x**(2*k+1) for k in range(n) )
-% \end{Piton}
-% \end{minipage}
-% ~emphase&\end{savenotes}@
-% \end{Verbatim}
-% \endgroup
-%
-%
-%
-% \begin{savenotes}
-% \PitonOptions{background-color=gray!10}
-% \begin{minipage}{13cm}
-% \begin{Piton}
-% def arctan(x,n=10):
-% if x < 0:
-% return -arctan(-x)#>\footnote{First recursive call.}
-% elif x > 1:
-% return pi/2 - arctan(1/x)#>\footnote{Second recursive call.}
-% else:
-% return sum( (-1)**k/(2*k+1)*x**(2*k+1) for k in range(n) )
-% \end{Piton}
-% \end{minipage}
-% \end{savenotes}
-%
-% \bigskip
-%
-% \subsection{An example of tuning of the styles}
-%
-% The graphical styles have been presented in the section \ref{styles},
-% p.~\pageref{styles}.
-%
-% \smallskip
-% We present now an example of tuning of these styles adapted to the documents
-% in black and white. We use the font \emph{DejaVu Sans Mono}\footnote{See:
-% \url{https://dejavu-fonts.github.io}} specified by the command |\setmonofont| of
-% \pkg{fontspec}.
-%
-% That tuning uses the command |\highLight| of \pkg{lua-ul} (that package
-% requires itself the package \pkg{luacolor}).
-%
-% \begin{Verbatim}
-% \setmonofont[Scale=0.85]{DejaVu Sans Mono}
-%
-% \SetPitonStyle
-% {
-% Number = ,
-% String = \itshape ,
-% String.Doc = \color{gray} \slshape ,
-% Operator = ,
-% Operator.Word = \bfseries ,
-% Name.Builtin = ,
-% Name.Function = \bfseries \highLight[gray!20] ,
-% Comment = \color{gray} ,
-% Comment.LaTeX = \normalfont \color{gray},
-% Keyword = \bfseries ,
-% Name.Namespace = ,
-% Name.Class = ,
-% Name.Type = ,
-% InitialValues = \color{gray}
-% }
-% \end{Verbatim}
-%
-%
-% \begingroup
-%
-% \setmonofont[Scale=0.85]{DejaVu Sans Mono}
-%
-% \PitonOptions{splittable}
-%
-% \SetPitonStyle
-% {
-% Number = ,
-% String = \itshape ,
-% String.Doc = \color{gray} \slshape ,
-% Operator.Word = \bfseries ,
-% Operator = ,
-% Name.Builtin = ,
-% Name.Function = \bfseries \highLight[gray!20] ,
-% Comment = \color{gray} ,
-% Comment.LaTeX = \normalfont \color{gray} ,
-% Keyword = \bfseries ,
-% Name.Namespace = ,
-% Name.Class = ,
-% Name.Type = ,
-% InitialValues = \color{gray}
-% }
-%
-%
-% \bigskip
-%
-% \begin{Piton}
-% from math import pi
-%
-% def arctan(x,n=10):
-% """Compute the mathematical value of arctan(x)
-%
-% n is the number of terms in the sum
-% """
-% if x < 0:
-% return -arctan(-x) # appel récursif
-% elif x > 1:
-% return pi/2 - arctan(1/x)
-% #> (we have used that $\arctan(x)+\arctan(1/x)=\pi/2$ for $x>0$)
-% else:
-% s = 0
-% for k in range(n):
-% s += (-1)**k/(2*k+1)*x**(2*k+1)
-% return s
-% \end{Piton}
-%
-% \endgroup
-%
-% \subsection{Use with pyluatex}
-%
-% The package \pkg{pyluatex} is an extension which allows the execution of some
-% Python code from |lualatex| (provided that Python is installed on the machine
-% and that the compilation is done with |lualatex| and |--shell-escape|).
-%
-% Here is, for example, an environment |{PitonExecute}| which formats a Python
-% listing (with \pkg{piton}) but display also the output of the execution of the
-% code with Python (for technical reasons, the |!| is mandatory in the signature
-% of the environment).
-%
-%
-% \begin{Verbatim}
-% \ExplSyntaxOn
-% \NewDocumentEnvironment { ~emphase#PitonExecute@ } { ! O { } } % the ! is mandatory
-% {
-% \PyLTVerbatimEnv
-% \begin{pythonq}
-% }
-% {
-% \end{pythonq}
-% \directlua
-% {
-% tex.print("\\PitonOptions{~#1}")
-% tex.print("\\begin{Piton}")
-% tex.print(pyluatex.get_last_code())
-% tex.print("\\end{Piton}")
-% tex.print("")
-% }
-% \begin{center}
-% \directlua{tex.print(pyluatex.get_last_output())}
-% \end{center}
-% }
-% \ExplSyntaxOff
-% \end{Verbatim}
-%
-% \ExplSyntaxOn
-% \NewDocumentEnvironment { PitonExecute } { ! O { } }
-% {
-% \PyLTVerbatimEnv
-% \begin{pythonq}
-% }
-% {
-% \end{pythonq}
-% \directlua
-% {
-% tex.print("\\PitonOptions{#1}")
-% tex.print("\\begin{Piton}")
-% tex.print(pyluatex.get_last_code())
-% tex.print("\\end{Piton}")
-% tex.print("")
-% }
-% \begin{center}
-% \directlua{tex.print(pyluatex.get_last_output())}
-% \end{center}
-% }
-% \ExplSyntaxOff
-%
-% This environment |{PitonExecute}| takes in as optional argument (between
-% square brackets) the options of the command |\PitonOptions|.
-%
-%
-% \bigskip
-% \clearpage
-%
-% \section{Implementation}
-%
-% \subsection{Introduction}
-%
-% The main job of the package \pkg{piton} is to take in as input a Python
-% listing and to send back to LaTeX as output that code \emph{with interlaced LaTeX
-% instructions of formatting}.
-%
-% In fact, all that job is done by a \textsc{lpeg} called |python|. That
-% \textsc{lpeg}, when matched against the string of a Python listing,
-% returns as capture a Lua table containing data to send to LaTeX.
-% The only thing to do after will be to apply |tex.tprint| to each element of
-% that table.\footnote{Recall that |tex.tprint| takes in as argument a Lua table whose
-% first component is a ``catcode table'' and the second element a string. The
-% string will be sent to LaTeX with the regime of catcodes specified by the
-% catcode table. If no catcode table is provided, the standard catcodes of LaTeX
-% will be used.}
-%
-% \bigskip
-% Consider, for example, the following Python code:
-%
-% \begin{Piton}
-% def parity(x):
-% return x%2
-% \end{Piton}
-%
-% The capture returned by the \pkg{lpeg} |python| against that code is the
-% Lua table containing the following elements :
-%
-% \bigskip
-% \begin{minipage}{\linewidth}
-% \color{gray}
-%
-% |{ "\\__piton_begin_line:" }|\footnote{Each line of the Python listings will
-% be encapsulated in a pair: \texttt{\textbackslash_@@_begin_line:} --
-% \texttt{\textbackslash@@_end_line:}. The token
-% \texttt{\textbackslash@@_end_line:} must be explicit because it will be used as
-% marker in order to delimit the argument of the command \texttt{\textbackslash
-% @@\_begin\_line:}. Both tokens \texttt{\textbackslash_@@_begin_line:} and
-% \texttt{\textbackslash@@_end_line:} will be nullified in the command
-% \texttt{\textbackslash piton} (since there can't be lines breaks in the
-% argument of a command \texttt{\textbackslash piton}).}
-%
-% \texttt{\{ "\{\textbackslash PitonStyle\{Keyword\}\{" \}}\footnote{The
-% lexical elements of Python for which we have a \pkg{piton} style will be
-% formatted via the use of the command \texttt{\textbackslash PitonStyle}.
-% Such an element is typeset in LaTeX via the syntax \texttt{\{\textbackslash
-% PitonStyle\{\textsl{style}\}\{...\}\}} because the instructions inside an \texttt{\textbackslash
-% PitonStyle} may be both semi-global declarations like
-% \texttt{\textbackslash bfseries} and commands with one argument like
-% \texttt{\textbackslash fbox}.}
-%
-% \texttt{\{
-% luatexbase.catcodetables.CatcodeTableOther\footnote{\texttt{luatexbase.catcodetables.CatcodeTableOther} is a mere number which corresponds to the ``catcode table'' whose all characters have the catcode ``other'' (which means that they will be typeset by LaTeX verbatim).}, "def" \} }
-%
-% |{ "}}" }|
-%
-% |{ luatexbase.catcodetables.CatcodeTableOther, " " }|
-%
-% |{ "{\PitonStyle{Name.Function}{" }|
-%
-% |{ luatexbase.catcodetables.CatcodeTableOther, "parity" }|
-%
-% |{ "}}" }|
-%
-% |{ luatexbase.catcodetables.CatcodeTableOther, "(" }|
-%
-% |{ luatexbase.catcodetables.CatcodeTableOther, "x" }|
-%
-% |{ luatexbase.catcodetables.CatcodeTableOther, ")" }|
-%
-% |{ luatexbase.catcodetables.CatcodeTableOther, ":" }|
-%
-% |{ "\\__piton_end_line: \\__piton_newline: \\__piton_begin_line:" }|
-%
-% |{ luatexbase.catcodetables.CatcodeTableOther, " " }|
-%
-% |{ "{\PitonStyle{Keyword}{" }|
-%
-% |{ luatexbase.catcodetables.CatcodeTableOther, "return" }|
-%
-% |{ "}}" }|
-%
-% |{ luatexbase.catcodetables.CatcodeTableOther, " " }|
-%
-% |{ luatexbase.catcodetables.CatcodeTableOther, "x" }|
-%
-% |{ "{\PitonStyle{Operator}{" }|
-%
-% |{ luatexbase.catcodetables.CatcodeTableOther, "&" }|
-%
-% |{ "}}" }|
-%
-% |{ "{\PitonStyle{Number}{" }|
-%
-% |{ luatexbase.catcodetables.CatcodeTableOther, "2" }|
-%
-% |{ "}}" }|
-%
-% |{ "\\__piton_end_line:" }|
-%
-% \end{minipage}
-%
-% \bigskip
-% We give now the LaTeX code which is sent back by Lua to TeX (we have written
-% on several lines for legibility but no character |\r| will be sent to LaTeX). The
-% characters which are greyed-out are sent to LaTeX with the catcode ``other''
-% (=12). All the others characters are sent with the regime of catcodes of L3
-% (as set by |\ExplSyntaxOn|)
-%
-%
-% \begingroup
-% \def\gbox#1{\colorbox{gray!20}{\strut #1}}
-% \setlength{\fboxsep}{1pt}
-%
-% \begin{Verbatim*}[formatcom = \color{black}]
-% \__piton_begin_line:{\PitonStyle{Keyword}{~gbox#def@}}
-% ~gbox# @{\PitonStyle{Name.Function}{~gbox#parity@}}~gbox#(x):@\__piton_end_line:\__piton_newline:
-% \__piton_begin_line:~gbox# @{\PitonStyle{Keyword}{~gbox#return@}}
-% ~gbox# x@{\PitonStyle{Operator}{~gbox#%@}}{\PitonStyle{Number}{~gbox#2@}}\__piton_end_line:
-% \end{Verbatim*}
-% \endgroup
-%
-%
-%
-%
-% \subsection{The L3 part of the implementation}
-%
-% \subsubsection{Declaration of the package}
-% \begin{macrocode}
-\NeedsTeXFormat{LaTeX2e}
-\RequirePackage{l3keys2e}
-\ProvidesExplPackage
- {piton}
- {\myfiledate}
- {\myfileversion}
- {Highlight Python codes with LPEG on LuaLaTeX}
-% \end{macrocode}
-%
-% \bigskip
-% \begin{macrocode}
-\msg_new:nnn { piton } { LuaLaTeX~mandatory }
- {
- LuaLaTeX~is~mandatory.\\
- The~package~'piton'~requires~the~engine~LuaLaTeX.\\
- \str_if_eq:VnT \c_sys_jobname_str { output }
- { If~you~use~Overleaf,~you~can~switch~to~LuaLaTeX~in~the~"Menu". \\}
- If~you~go~on,~the~package~'piton'~won't~be~loaded.
- }
-\sys_if_engine_luatex:F { \msg_critical:nn { piton } { LuaLaTeX~mandatory } }
-% \end{macrocode}
-%
-% \bigskip
-% \begin{macrocode}
-\RequirePackage { luatexbase }
-% \end{macrocode}
-%
-% \bigskip
-% The boolean |\c_@@_footnotehyper_bool| will indicate if the option
-% |footnotehyper| is used.
-% \begin{macrocode}
-\bool_new:N \c_@@_footnotehyper_bool
-% \end{macrocode}
-%
-% \medskip
-% The boolean |\c_@@_footnote_bool| will indicate if the option |footnote| is
-% used, but quicky, it will also be set to |true| if the option |footnotehyper|
-% is used.
-% \begin{macrocode}
-\bool_new:N \c_@@_footnote_bool
-% \end{macrocode}
-%
-% \medskip
-% The following boolean corresponds to the key |math-comments| (only at load-time).
-% \begin{macrocode}
-\bool_new:N \c_@@_math_comments_bool
-% \end{macrocode}
-%
-% \medskip
-% The following boolean corresponds to the key |beamer|.
-% \begin{macrocode}
-\bool_new:N \c_@@_beamer_bool
-% \end{macrocode}
-%
-% \bigskip
-% We define a set of keys for the options at load-time.
-% \begin{macrocode}
-\keys_define:nn { piton / package }
- {
- footnote .bool_set:N = \c_@@_footnote_bool ,
- footnotehyper .bool_set:N = \c_@@_footnotehyper_bool ,
- escape-inside .tl_set:N = \c_@@_escape_inside_tl ,
- escape-inside .initial:n = ,
- comment-latex .code:n = { \lua_now:n { comment_latex = "#1" } } ,
- comment-latex .value_required:n = true ,
- math-comments .bool_set:N = \c_@@_math_comments_bool ,
- math-comments .default:n = true ,
- beamer .bool_set:N = \c_@@_beamer_bool ,
- beamer .default:n = true ,
- unknown .code:n = \msg_error:nn { piton } { unknown~key~for~package }
- }
-% \end{macrocode}
-%
-% \begin{macrocode}
-\msg_new:nnn { piton } { unknown~key~for~package }
- {
- Unknown~key.\\
- You~have~used~the~key~'\l_keys_key_str'~but~the~only~keys~available~here~
- are~'beamer',~'comment-latex',~'escape-inside',~'footnote',~'footnotehyper'~and~
- 'math-comments'.~Other~keys~are~available~in~\token_to_str:N \PitonOptions.\\
- That~key~will~be~ignored.
- }
-% \end{macrocode}
-%
-% \bigskip
-% We process the options provided by the user at load-time.
-% \begin{macrocode}
-\ProcessKeysOptions { piton / package }
-% \end{macrocode}
-%
-% \bigskip
-% \begin{macrocode}
-\begingroup
-\cs_new_protected:Npn \@@_set_escape_char:nn #1 #2
- {
- \lua_now:n { piton_begin_escape = "#1" }
- \lua_now:n { piton_end_escape = "#2" }
- }
-\cs_generate_variant:Nn \@@_set_escape_char:nn { x x }
-\@@_set_escape_char:xx
- { \tl_head:V \c_@@_escape_inside_tl }
- { \tl_tail:V \c_@@_escape_inside_tl }
-\endgroup
-% \end{macrocode}
-%
-% \bigskip
-% \begin{macrocode}
-\@ifclassloaded { beamer } { \bool_set_true:N \c_@@_beamer_bool } { }
-\bool_if:NT \c_@@_beamer_bool { \lua_now:n { piton_beamer = true } }
-% \end{macrocode}
-%
-% \bigskip
-% \begin{macrocode}
-\hook_gput_code:nnn { begindocument } { . }
- {
- \@ifpackageloaded { xcolor }
- { }
- { \msg_fatal:nn { piton } { xcolor~not~loaded } }
- }
-% \end{macrocode}
-%
-% \begin{macrocode}
-\msg_new:nnn { piton } { xcolor~not~loaded }
- {
- xcolor~not~loaded \\
- The~package~'xcolor'~is~required~by~'piton'.\\
- This~error~is~fatal.
- }
-% \end{macrocode}
-%
-%
-% \begin{macrocode}
-\msg_new:nnn { piton } { footnote~with~footnotehyper~package }
- {
- Footnote~forbidden.\\
- You~can't~use~the~option~'footnote'~because~the~package~
- footnotehyper~has~already~been~loaded.~
- If~you~want,~you~can~use~the~option~'footnotehyper'~and~the~footnotes~
- within~the~environments~of~piton~will~be~extracted~with~the~tools~
- of~the~package~footnotehyper.\\
- If~you~go~on,~the~package~footnote~won't~be~loaded.
- }
-% \end{macrocode}
-%
-% \begin{macrocode}
-\msg_new:nnn { piton } { footnotehyper~with~footnote~package }
- {
- You~can't~use~the~option~'footnotehyper'~because~the~package~
- footnote~has~already~been~loaded.~
- If~you~want,~you~can~use~the~option~'footnote'~and~the~footnotes~
- within~the~environments~of~piton~will~be~extracted~with~the~tools~
- of~the~package~footnote.\\
- If~you~go~on,~the~package~footnotehyper~won't~be~loaded.
- }
-% \end{macrocode}
-%
-% \medskip
-% \begin{macrocode}
-\bool_if:NT \c_@@_footnote_bool
- {
-% \end{macrocode}
-% The class \cls{beamer} has its own system to extract footnotes and that's why
-% we have nothing to do if \cls{beamer} is used.
-% \begin{macrocode}
- \@ifclassloaded { beamer }
- { \bool_set_false:N \c_@@_footnote_bool }
- {
- \@ifpackageloaded { footnotehyper }
- { \@@_error:n { footnote~with~footnotehyper~package } }
- { \usepackage { footnote } }
- }
- }
-% \end{macrocode}
-%
-% \begin{macrocode}
-\bool_if:NT \c_@@_footnotehyper_bool
- {
-% \end{macrocode}
-% The class \cls{beamer} has its own system to extract footnotes and that's why
-% we have nothing to do if \cls{beamer} is used.
-% \begin{macrocode}
- \@ifclassloaded { beamer }
- { \bool_set_false:N \c_@@_footnote_bool }
- {
- \@ifpackageloaded { footnote }
- { \@@_error:n { footnotehyper~with~footnote~package } }
- { \usepackage { footnotehyper } }
- \bool_set_true:N \c_@@_footnote_bool
- }
- }
-% \end{macrocode}
-% The flag |\c_@@_footnote_bool| is raised and so, we will only have to test
-% |\c_@@_footnote_bool| in order to know if we have to insert an environment
-% |{savenotes}|.
-%
-% \bigskip
-% \subsubsection{Parameters and technical definitions}
-%
-% The following string will contain the name of the informatic language
-% considered (the initial value is |python|).
-%
-% \begin{macrocode}
-\str_new:N \l_@@_language_str
-\str_set:Nn \l_@@_language_str { python }
-% \end{macrocode}
-%
-% We will compute (with Lua) the numbers of lines of the Python code and store
-% it in the following counter.
-% \begin{macrocode}
-\int_new:N \l_@@_nb_lines_int
-% \end{macrocode}
-%
-% The same for the number of non-empty lines of the Python codes.
-% \begin{macrocode}
-\int_new:N \l_@@_nb_non_empty_lines_int
-% \end{macrocode}
-%
-% The following counter will be used to count the lines during the composition.
-% It will count all the lines, empty or not empty. It won't be used to print the
-% numbers of the lines.
-% \begin{macrocode}
-\int_new:N \g_@@_line_int
-% \end{macrocode}
-%
-% \medskip
-% The following token list will contains the (potential) informations to write
-% on the |aux| (to be used in the next compilation).
-% \begin{macrocode}
-\tl_new:N \g_@@_aux_tl
-% \end{macrocode}
-%
-% \medskip
-% The following counter corresponds to the key |splittable| of |\PitonOptions|.
-% If the value of |\l_@@_splittable_int| is equal to $n$, then no line break can
-% occur within the first $n$~lines or the last $n$~lines of the listings.
-% \begin{macrocode}
-\int_new:N \l_@@_splittable_int
-% \end{macrocode}
-%
-% \medskip
-% An initial value of |splittable| equal to 100 is equivalent to say that the
-% environments |{Piton}| are unbreakable.
-% \begin{macrocode}
-\int_set:Nn \l_@@_splittable_int { 100 }
-% \end{macrocode}
-%
-% \medskip
-% The following string corresponds to the key |background-color| of |\PitonOptions|.
-% \begin{macrocode}
-\clist_new:N \l_@@_bg_color_clist
-% \end{macrocode}
-%
-% \medskip
-% The package \pkg{piton} will also detect the lines of code which correspond to
-% the user input in a Python console, that is to say the lines of code beginning
-% with |>>>| and |...|. It's possible, with the key |prompt-background-color|,
-% to require a background for these lines of code (and the other lines of code
-% will have the standard background color specified by |background-color|).
-% \begin{macrocode}
-\tl_new:N \l_@@_prompt_bg_color_tl
-% \end{macrocode}
-%
-% \medskip
-% We will compute the maximal width of the lines of an environment |{Piton}| in
-% |\g_@@_width_dim|. We need a global variable because, when the key |footnote|
-% is in force, each line when be composed in an environment |{savenotes}| and
-% (when |slim| is in force) we need to exit |\g_@@_width_dim| from that
-% environment.
-% \begin{macrocode}
-\dim_new:N \g_@@_width_dim
-% \end{macrocode}
-% The value of that dimension as written on the |aux| file will be stored in
-% |\l_@@_width_on_aux_dim|.
-% \begin{macrocode}
-\dim_new:N \l_@@_width_on_aux_dim
-% \end{macrocode}
-%
-% \medskip
-% We will count the environments |{Piton}| (and, in fact, also the commands
-% |\PitonInputFile|, despite the name |\g_@@_env_int|).
-% \begin{macrocode}
-\int_new:N \g_@@_env_int
-% \end{macrocode}
-%
-% \medskip
-% The following boolean corresponds to the key |show-spaces|.
-% \begin{macrocode}
-\bool_new:N \l_@@_show_spaces_bool
-% \end{macrocode}
-%
-% \medskip
-% The following booleans correspond to the keys |break-lines| and
-% |indent-broken-lines|.
-% \begin{macrocode}
-\bool_new:N \l_@@_break_lines_in_Piton_bool
-\bool_new:N \l_@@_indent_broken_lines_bool
-% \end{macrocode}
-%
-% \medskip
-% The following token list corresponds to the key |continuation-symbol|.
-% \begin{macrocode}
-\tl_new:N \l_@@_continuation_symbol_tl
-\tl_set:Nn \l_@@_continuation_symbol_tl { + }
-% \end{macrocode}
-%
-% \medskip
-% \begin{macrocode}
-% The following token list corresponds to the key
-% |continuation-symbol-on-indentation|. The name has been shorten to |csoi|.
-\tl_new:N \l_@@_csoi_tl
-\tl_set:Nn \l_@@_csoi_tl { $ \hookrightarrow \; $ }
-% \end{macrocode}
-%
-% \medskip
-% The following token list corresponds to the key |end-of-broken-line|.
-% \begin{macrocode}
-\tl_new:N \l_@@_end_of_broken_line_tl
-\tl_set:Nn \l_@@_end_of_broken_line_tl { \hspace*{0.5em} \textbackslash }
-% \end{macrocode}
-%
-% \medskip
-% The following boolean corresponds to the key |break-lines-in-piton|.
-% \begin{macrocode}
-\bool_new:N \l_@@_break_lines_in_piton_bool
-% \end{macrocode}
-%
-% \medskip
-% The following boolean corresponds to the key |slim| of |\PitonOptions|.
-% \begin{macrocode}
-\bool_new:N \l_@@_slim_bool
-% \end{macrocode}
-%
-% \medskip
-% The following dimension corresponds to the key |left-margin| of |\PitonOptions|.
-% \begin{macrocode}
-\dim_new:N \l_@@_left_margin_dim
-% \end{macrocode}
-%
-% \medskip
-% The following boolean will be set when the key |left-margin=auto|
-% is used.
-% \begin{macrocode}
-\bool_new:N \l_@@_left_margin_auto_bool
-% \end{macrocode}
-%
-% \medskip
-% The following dimension corresponds to the key |numbers-sep| of
-% |\PitonOptions|.
-% \begin{macrocode}
-\dim_new:N \l_@@_numbers_sep_dim
-\dim_set:Nn \l_@@_numbers_sep_dim { 0.7 em }
-% \end{macrocode}
-%
-% \medskip
-% The tabulators will be replaced by the content of the following token list.
-% \begin{macrocode}
-\tl_new:N \l_@@_tab_tl
-% \end{macrocode}
-%
-% \medskip
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_set_tab_tl:n #1
- {
- \tl_clear:N \l_@@_tab_tl
- \prg_replicate:nn { #1 }
- { \tl_put_right:Nn \l_@@_tab_tl { ~ } }
- }
-\@@_set_tab_tl:n { 4 }
-% \end{macrocode}
-%
-% \medskip
-% The following integer corresponds to the key |gobble|.
-% \begin{macrocode}
-\int_new:N \l_@@_gobble_int
-% \end{macrocode}
-%
-% \medskip
-% \begin{macrocode}
-\tl_new:N \l_@@_space_tl
-\tl_set:Nn \l_@@_space_tl { ~ }
-% \end{macrocode}
-%
-%
-% \medskip
-% At each line, the following counter will count the spaces at the beginning.
-% \begin{macrocode}
-\int_new:N \g_@@_indentation_int
-% \end{macrocode}
-%
-% \medskip
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_an_indentation_space:
- { \int_gincr:N \g_@@_indentation_int }
-% \end{macrocode}
-%
-% \medskip
-% The following command |\@@_beamer_command:n| executes the argument
-% corresponding to its argument but also stores it in |\l_@@_beamer_command_str|.
-% That string is used only in the error message ``|cr~not~allowed|'' raised when
-% there is a carriage return in the mandatory argument of that command.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_beamer_command:n #1
- {
- \str_set:Nn \l_@@_beamer_command_str { #1 }
- \use:c { #1 }
- }
-% \end{macrocode}
-%
-% \bigskip
-% In the environment |{Piton}|, the command |\label| will be linked to the
-% following command.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_label:n #1
- {
- \bool_if:NTF \l_@@_line_numbers_bool
- {
- \@bsphack
- \protected@write \@auxout { }
- {
- \string \newlabel { #1 }
- {
-% \end{macrocode}
-% Remember that the content of a line is typeset in a box \emph{before} the
-% composition of the potential number of line.
-% \begin{macrocode}
- { \int_eval:n { \g_@@_visual_line_int + 1 } }
- { \thepage }
- }
- }
- \@esphack
- }
- { \msg_error:nn { piton } { label~with~lines~numbers } }
- }
-% \end{macrocode}
-%
-%
-% \bigskip
-% The following commands are a easy way to insert safely braces (|{| and |}|) in
-% the TeX flow.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_open_brace:
- { \directlua { piton.open_brace() } }
-\cs_new_protected:Npn \@@_close_brace:
- { \directlua { piton.close_brace() } }
-% \end{macrocode}
-%
-% \bigskip
-% The following token list will be evaluated at the beginning of
-% |\@@_begin_line:|... |\@@_end_line:| and cleared at the end. It will be used
-% by LPEG acting between the lines of the Python code in order to add
-% instructions to be executed at the beginning of the line.
-% \begin{macrocode}
-\tl_new:N \g_@@_begin_line_hook_tl
-% \end{macrocode}
-%
-% \smallskip
-% For example, the LPEG |Prompt| will trigger the following command which will
-% insert an instruction in the hook |\g_@@_begin_line_hook| to specify that a
-% background must be inserted to the current line of code.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_prompt:
- {
- \tl_gset:Nn \g_@@_begin_line_hook_tl
- { \clist_set:NV \l_@@_bg_color_clist \l_@@_prompt_bg_color_tl }
- }
-% \end{macrocode}
-%
-%
-% \bigskip
-% You will keep track of the current style for the treatment of EOL (for the
-% multi-line syntactic elements).
-% \begin{macrocode}
-\clist_new:N \g_@@_current_style_clist
-\clist_set:Nn \g_@@_current_style_clist { __end }
-% \end{macrocode}
-% The element |__end| is an arbitrary syntactic marker.
-%
-% \medskip
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_close_current_styles:
- {
- \int_set:Nn \l_tmpa_int { \clist_count:N \g_@@_current_style_clist - 1 }
- \exp_args:NV \@@_close_n_styles:n \l_tmpa_int
- }
-% \end{macrocode}
-%
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_close_n_styles:n #1
- {
- \int_compare:nNnT { #1 } > 0
- {
- \@@_close_brace:
- \@@_close_brace:
- \@@_close_n_styles:n { #1 - 1 }
- }
- }
-% \end{macrocode}
-%
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_open_current_styles:
- { \exp_last_unbraced:NV \@@_open_styles:w \g_@@_current_style_clist , }
-% \end{macrocode}
-%
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_open_styles:w #1 ,
- {
- \tl_if_eq:nnF { #1 } { __end }
- { \@@_open_brace: #1 \@@_open_brace: \@@_open_styles:w }
- }
-% \end{macrocode}
-%
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_pop_style:
- {
- \clist_greverse:N \g_@@_current_style_clist
- \clist_gpop:NN \g_@@_current_style_clist \l_tmpa_tl
- \clist_gpop:NN \g_@@_current_style_clist \l_tmpa_tl
- \clist_gpush:Nn \g_@@_current_style_clist { __end }
- \clist_greverse:N \g_@@_current_style_clist
- }
-% \end{macrocode}
-%
-% \medskip
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_push_style:n #1
- {
- \clist_greverse:N \g_@@_current_style_clist
- \clist_gpop:NN \g_@@_current_style_clist \l_tmpa_tl
- \clist_gpush:Nn \g_@@_current_style_clist { #1 }
- \clist_gpush:Nn \g_@@_current_style_clist { __end }
- \clist_greverse:N \g_@@_current_style_clist
- }
-% \end{macrocode}
-%
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_push_and_exec:n #1
- {
- \@@_push_style:n { #1 }
- \@@_open_brace: #1 \@@_open_brace:
- }
-% \end{macrocode}
-%
-% \bigskip
-% \subsubsection{Treatment of a line of code}
-%
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_replace_spaces:n #1
- {
- \tl_set:Nn \l_tmpa_tl { #1 }
- \bool_if:NTF \l_@@_show_spaces_bool
- { \regex_replace_all:nnN { \x20 } { ⣠} \l_tmpa_tl } % U+2423
- {
-% \end{macrocode}
-% If the key |break-lines-in-Piton| is in force, we replace all the characters
-% U+0020 (that is to say the spaces) by |\@@_breakable_space:|. Remark that,
-% except the spaces inserted in the LaTeX comments (and maybe in the math
-% comments), all these spaces are of catcode ``other'' (=12) and are
-% unbreakable.
-% \begin{macrocode}
- \bool_if:NT \l_@@_break_lines_in_Piton_bool
- {
- \regex_replace_all:nnN
- { \x20 }
- { \c { @@_breakable_space: } }
- \l_tmpa_tl
- }
- }
- \l_tmpa_tl
- }
-\cs_generate_variant:Nn \@@_replace_spaces:n { x }
-% \end{macrocode}
-%
-% \bigskip
-% In the contents provided by Lua, each line of the Python code will be
-% surrounded by |\@@_begin_line:| and |\@@_end_line:|. |\@@_begin_line:| is a
-% LaTeX command that we will define now but |\@@_end_line:| is only a syntactic
-% marker that has no definition.
-%
-% \begin{macrocode}
-\cs_set_protected:Npn \@@_begin_line: #1 \@@_end_line:
- {
- \group_begin:
- \g_@@_begin_line_hook_tl
- \int_gzero:N \g_@@_indentation_int
-% \end{macrocode}
-%
-%
-% Be careful: there is curryfication in the following lines.
-% \begin{macrocode}
- \bool_if:NTF \l_@@_slim_bool
- { \hcoffin_set:Nn \l_tmpa_coffin }
- {
- \clist_if_empty:NTF \l_@@_bg_color_clist
- {
- \vcoffin_set:Nnn \l_tmpa_coffin
- { \dim_eval:n { \linewidth - \l_@@_left_margin_dim } }
- }
- {
- \vcoffin_set:Nnn \l_tmpa_coffin
- { \dim_eval:n { \linewidth - \l_@@_left_margin_dim - 0.5 em } }
- }
- }
- {
- \language = -1
- \raggedright
- \strut
- \@@_replace_spaces:n { #1 }
- \strut \hfil
- }
- \hbox_set:Nn \l_tmpa_box
- {
- \skip_horizontal:N \l_@@_left_margin_dim
- \bool_if:NT \l_@@_line_numbers_bool
- {
- \bool_if:NF \l_@@_all_line_numbers_bool
- { \tl_if_empty:nF { #1 } }
- \@@_print_number:
- }
- \clist_if_empty:NF \l_@@_bg_color_clist
- {
- \dim_compare:nNnT \l_@@_left_margin_dim = \c_zero_dim
- {
- \bool_if:NF \l_@@_left_margin_auto_bool
- { \skip_horizontal:n { 0.5 em } }
- }
- }
- \coffin_typeset:Nnnnn \l_tmpa_coffin T l \c_zero_dim \c_zero_dim
- }
-% \end{macrocode}
-% We compute in |\g_@@_width_dim| the maximal width of the lines of the
-% environment.
-% \begin{macrocode}
- \dim_compare:nNnT { \box_wd:N \l_tmpa_box } > \g_@@_width_dim
- { \dim_gset:Nn \g_@@_width_dim { \box_wd:N \l_tmpa_box } }
- \box_set_dp:Nn \l_tmpa_box { \box_dp:N \l_tmpa_box + 1.25 pt }
- \box_set_ht:Nn \l_tmpa_box { \box_ht:N \l_tmpa_box + 1.25 pt }
- \clist_if_empty:NTF \l_@@_bg_color_clist
- { \box_use_drop:N \l_tmpa_box }
- {
- \vbox_top:n
- {
- \hbox:n
- {
- \@@_color:N \l_@@_bg_color_clist
- \vrule height \box_ht:N \l_tmpa_box
- depth \box_dp:N \l_tmpa_box
- width \l_@@_width_on_aux_dim
- }
- \skip_vertical:n { - \box_ht_plus_dp:N \l_tmpa_box }
- \box_set_wd:Nn \l_tmpa_box \l_@@_width_on_aux_dim
- \box_use_drop:N \l_tmpa_box
- }
- }
- \vspace { - 2.5 pt }
- \group_end:
- \tl_gclear:N \g_@@_begin_line_hook_tl
- }
-% \end{macrocode}
-%
-% \bigskip
-% The command |\@@_color:N| will take in as argument a reference to a
-% comma-separated list of colors. A color will be picked by using the value of
-% |\g_@@_line_int| (modulo the number of colors in the list).
-% \begin{macrocode}
-\cs_set_protected:Npn \@@_color:N #1
- {
- \int_set:Nn \l_tmpa_int { \clist_count:N #1 }
- \int_set:Nn \l_tmpb_int { \int_mod:nn \g_@@_line_int \l_tmpa_int + 1 }
- \tl_set:Nx \l_tmpa_tl { \clist_item:Nn #1 \l_tmpb_int }
- \tl_if_eq:NnTF \l_tmpa_tl { none }
-% \end{macrocode}
-% By setting |\l_@@_width_on_aux_dim| to zero, the colored rectangle will be
-% drawn with zero width and, thus, it will be a mere strut (and we need that strut).
-% \begin{macrocode}
- { \dim_zero:N \l_@@_width_on_aux_dim }
- { \exp_args:NV \@@_color_i:n \l_tmpa_tl }
- }
-% \end{macrocode}
-%
-% The following command |\@@_color:n| will accept both the instruction
-% |\@@_color:n { red!15 }| and the instruction |\@@_color:n { [rgb]{0.9,0.9,0} }|.
-% \begin{macrocode}
-\cs_set_protected:Npn \@@_color_i:n #1
- {
- \tl_if_head_eq_meaning:nNTF { #1 } [
- {
- \tl_set:Nn \l_tmpa_tl { #1 }
- \tl_set_rescan:Nno \l_tmpa_tl { } \l_tmpa_tl
- \exp_last_unbraced:NV \color \l_tmpa_tl
- }
- { \color { #1 } }
- }
-\cs_generate_variant:Nn \@@_color:n { V }
-% \end{macrocode}
-%
-% \bigskip
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_newline:
- {
- \int_gincr:N \g_@@_line_int
- \int_compare:nNnT \g_@@_line_int > { \l_@@_splittable_int - 1 }
- {
- \int_compare:nNnT
- { \l_@@_nb_lines_int - \g_@@_line_int } > \l_@@_splittable_int
- {
- \egroup
- \bool_if:NT \c_@@_footnote_bool { \end { savenotes } }
- \newline
- \bool_if:NT \c_@@_footnote_bool { \begin { savenotes } }
- \vtop \bgroup
- }
- }
- }
-% \end{macrocode}
-%
-% \bigskip
-% \begin{macrocode}
-\cs_set_protected:Npn \@@_breakable_space:
- {
- \discretionary
- { \hbox:n { \color { gray } \l_@@_end_of_broken_line_tl } }
- {
- \hbox_overlap_left:n
- {
- {
- \normalfont \footnotesize \color { gray }
- \l_@@_continuation_symbol_tl
- }
- \skip_horizontal:n { 0.3 em }
- \clist_if_empty:NF \l_@@_bg_color_clist
- { \skip_horizontal:n { 0.5 em } }
- }
- \bool_if:NT \l_@@_indent_broken_lines_bool
- {
- \hbox:n
- {
- \prg_replicate:nn { \g_@@_indentation_int } { ~ }
- { \color { gray } \l_@@_csoi_tl }
- }
- }
- }
- { \hbox { ~ } }
- }
-% \end{macrocode}
-%
-% \bigskip
-% \subsubsection{PitonOptions}
-%
-% \medskip
-% The following parameters correspond to the keys |line-numbers| and
-% |all-line-numbers|.
-% \begin{macrocode}
-\bool_new:N \l_@@_line_numbers_bool
-\bool_new:N \l_@@_all_line_numbers_bool
-% \end{macrocode}
-%
-% \medskip
-% The following flag corresponds to the key |resume|.
-% \begin{macrocode}
-\bool_new:N \l_@@_resume_bool
-% \end{macrocode}
-%
-% \bigskip
-% Be careful! The name of the following set of keys must be considered as
-% public! Hence, it should \emph{not} be changed.
-%
-% \begin{macrocode}
-\keys_define:nn { PitonOptions }
- {
- language .str_set:N = \l_@@_language_str ,
- language .value_required:n = true ,
- gobble .int_set:N = \l_@@_gobble_int ,
- gobble .value_required:n = true ,
- auto-gobble .code:n = \int_set:Nn \l_@@_gobble_int { -1 } ,
- auto-gobble .value_forbidden:n = true ,
- env-gobble .code:n = \int_set:Nn \l_@@_gobble_int { -2 } ,
- env-gobble .value_forbidden:n = true ,
- tabs-auto-gobble .code:n = \int_set:Nn \l_@@_gobble_int { -3 } ,
- tabs-auto-gobble .value_forbidden:n = true ,
- line-numbers .bool_set:N = \l_@@_line_numbers_bool ,
- line-numbers .default:n = true ,
- all-line-numbers .code:n =
- \bool_set_true:N \l_@@_line_numbers_bool
- \bool_set_true:N \l_@@_all_line_numbers_bool ,
- all-line-numbers .value_forbidden:n = true ,
- resume .bool_set:N = \l_@@_resume_bool ,
- resume .value_forbidden:n = true ,
- splittable .int_set:N = \l_@@_splittable_int ,
- splittable .default:n = 1 ,
- background-color .clist_set:N = \l_@@_bg_color_clist ,
- background-color .value_required:n = true ,
- prompt-background-color .tl_set:N = \l_@@_prompt_bg_color_tl ,
- prompt-background-color .value_required:n = true ,
- slim .bool_set:N = \l_@@_slim_bool ,
- slim .default:n = true ,
- left-margin .code:n =
- \str_if_eq:nnTF { #1 } { auto }
- {
- \dim_zero:N \l_@@_left_margin_dim
- \bool_set_true:N \l_@@_left_margin_auto_bool
- }
- { \dim_set:Nn \l_@@_left_margin_dim { #1 } } ,
- left-margin .value_required:n = true ,
- numbers-sep .dim_set:N = \l_@@_numbers_sep_dim ,
- numbers-sep .value_required:n = true ,
- tab-size .code:n = \@@_set_tab_tl:n { #1 } ,
- tab-size .value_required:n = true ,
- show-spaces .bool_set:N = \l_@@_show_spaces_bool ,
- show-spaces .default:n = true ,
- show-spaces-in-strings .code:n = \tl_set:Nn \l_@@_space_tl { ⣠} , % U+2423
- show-spaces-in-strings .value_forbidden:n = true ,
- break-lines-in-Piton .bool_set:N = \l_@@_break_lines_in_Piton_bool ,
- break-lines-in-Piton .default:n = true ,
- break-lines-in-piton .bool_set:N = \l_@@_break_lines_in_piton_bool ,
- break-lines-in-piton .default:n = true ,
- break-lines .meta:n = { break-lines-in-piton , break-lines-in-Piton } ,
- break-lines .value_forbidden:n = true ,
- indent-broken-lines .bool_set:N = \l_@@_indent_broken_lines_bool ,
- indent-broken-lines .default:n = true ,
- end-of-broken-line .tl_set:N = \l_@@_end_of_broken_line_tl ,
- end-of-broken-line .value_required:n = true ,
- continuation-symbol .tl_set:N = \l_@@_continuation_symbol_tl ,
- continuation-symbol .value_required:n = true ,
- continuation-symbol-on-indentation .tl_set:N = \l_@@_csoi_tl ,
- continuation-symbol-on-indentation .value_required:n = true ,
- unknown .code:n =
- \msg_error:nn { piton } { Unknown~key~for~PitonOptions }
- }
-% \end{macrocode}
-%
-%
-% \bigskip
-%
-% \bigskip
-% The argument of |\PitonOptions| is provided by curryfication.
-% \begin{macrocode}
-\NewDocumentCommand \PitonOptions { } { \keys_set:nn { PitonOptions } }
-% \end{macrocode}
-%
-% \bigskip
-% \subsubsection{The numbers of the lines}
-%
-% \medskip
-% The following counter will be used to count the lines in the code when the
-% user requires the numbers of the lines to be printed (with |line-numbers| or
-% |all-line-numbers|).
-%
-% \begin{macrocode}
-\int_new:N \g_@@_visual_line_int
-% \end{macrocode}
-%
-%
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_print_number:
- {
- \int_gincr:N \g_@@_visual_line_int
- \hbox_overlap_left:n
- {
- { \color { gray } \footnotesize \int_to_arabic:n \g_@@_visual_line_int }
- \skip_horizontal:N \l_@@_numbers_sep_dim
- }
- }
-% \end{macrocode}
-%
-%
-% \bigskip
-% \subsubsection{The command to write on the aux file}
-%
-%
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_write_aux:
- {
- \tl_if_empty:NF \g_@@_aux_tl
- {
- \iow_now:Nn \@mainaux { \ExplSyntaxOn }
- \iow_now:Nx \@mainaux
- {
- \tl_gset:cn { c_@@_ \int_use:N \g_@@_env_int _ tl }
- { \exp_not:V \g_@@_aux_tl }
- }
- \iow_now:Nn \@mainaux { \ExplSyntaxOff }
- }
- \tl_gclear:N \g_@@_aux_tl
- }
-% \end{macrocode}
-%
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_width_to_aux:
- {
- \bool_if:NT \l_@@_slim_bool
- {
- \clist_if_empty:NF \l_@@_bg_color_clist
- {
- \tl_gput_right:Nx \g_@@_aux_tl
- {
- \dim_set:Nn \l_@@_width_on_aux_dim
- { \dim_eval:n { \g_@@_width_dim + 0.5 em } }
- }
- }
- }
- }
-% \end{macrocode}
-%
-% \bigskip
-% \subsubsection{The main commands and environments for the final user}
-%
-% \bigskip
-% \begin{macrocode}
-\NewDocumentCommand { \piton } { }
- { \peek_meaning:NTF \bgroup \@@_piton_standard \@@_piton_verbatim }
-% \end{macrocode}
-%
-% \begin{macrocode}
-\NewDocumentCommand { \@@_piton_standard } { m }
- {
- \group_begin:
- \ttfamily
-% \end{macrocode}
-% The following tuning of LuaTeX in order to avoid all break of lines on the
-% hyphens.
-% \begin{macrocode}
- \automatichyphenmode = 1
- \cs_set_eq:NN \\ \c_backslash_str
- \cs_set_eq:NN \% \c_percent_str
- \cs_set_eq:NN \{ \c_left_brace_str
- \cs_set_eq:NN \} \c_right_brace_str
- \cs_set_eq:NN \$ \c_dollar_str
- \cs_set_eq:cN { ~ } \space
- \cs_set_protected:Npn \@@_begin_line: { }
- \cs_set_protected:Npn \@@_end_line: { }
- \tl_set:Nx \l_tmpa_tl
- {
- \lua_now:e
- { piton.ParseBis('\l_@@_language_str',token.scan_string()) }
- { #1 }
- }
- \bool_if:NTF \l_@@_show_spaces_bool
- { \regex_replace_all:nnN { \x20 } { ⣠} \l_tmpa_tl } % U+2423
-% \end{macrocode}
-% The following code replaces the characters U+0020 (spaces) by characters
-% U+0020 of catcode~10: thus, they become breakable by an end of line.
-% \begin{macrocode}
- {
- \bool_if:NT \l_@@_break_lines_in_piton_bool
- { \regex_replace_all:nnN { \x20 } { \x20 } \l_tmpa_tl }
- }
- \l_tmpa_tl
- \group_end:
- }
-% \end{macrocode}
-%
-%
-% \begin{macrocode}
-\NewDocumentCommand { \@@_piton_verbatim } { v }
- {
- \group_begin:
- \ttfamily
- \automatichyphenmode = 1
- \cs_set_protected:Npn \@@_begin_line: { }
- \cs_set_protected:Npn \@@_end_line: { }
- \tl_set:Nx \l_tmpa_tl
- {
- \lua_now:e
- { piton.Parse('\l_@@_language_str',token.scan_string()) }
- { #1 }
- }
- \bool_if:NT \l_@@_show_spaces_bool
- { \regex_replace_all:nnN { \x20 } { ⣠} \l_tmpa_tl } % U+2423
- \l_tmpa_tl
- \group_end:
- }
-% \end{macrocode}
-%
-
-% \bigskip
-%
-%
-% \bigskip
-% The following command is not a user command. It will be used when we will
-% have to ``rescan'' some chunks of Python code. For example, it will be the
-% initial value of the Piton style |InitialValues| (the default values of the
-% arguments of a Python function).
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_piton:n #1
- {
- \group_begin:
- \cs_set_protected:Npn \@@_begin_line: { }
- \cs_set_protected:Npn \@@_end_line: { }
- \bool_lazy_or:nnTF
- \l_@@_break_lines_in_piton_bool
- \l_@@_break_lines_in_Piton_bool
- {
- \tl_set:Nx \l_tmpa_tl
- {
- \lua_now:e
- { piton.ParseTer('\l_@@_language_str',token.scan_string()) }
- { #1 }
- }
- }
- {
- \tl_set:Nx \l_tmpa_tl
- {
- \lua_now:e
- { piton.Parse('\l_@@_language_str',token.scan_string()) }
- { #1 }
- }
- }
- \bool_if:NT \l_@@_show_spaces_bool
- { \regex_replace_all:nnN { \x20 } { ⣠} \l_tmpa_tl } % U+2423
- \l_tmpa_tl
- \group_end:
- }
-% \end{macrocode}
-%
-% \bigskip
-% The following command is similar to the previous one but raise a fatal error if
-% its argument contains a carriage return.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_piton_no_cr:n #1
- {
- \group_begin:
- \cs_set_protected:Npn \@@_begin_line: { }
- \cs_set_protected:Npn \@@_end_line: { }
- \cs_set_protected:Npn \@@_newline:
- { \msg_fatal:nn { piton } { cr~not~allowed } }
- \bool_lazy_or:nnTF
- \l_@@_break_lines_in_piton_bool
- \l_@@_break_lines_in_Piton_bool
- {
- \tl_set:Nx \l_tmpa_tl
- {
- \lua_now:e
- { piton.ParseTer('\l_@@_language_str',token.scan_string()) }
- { #1 }
- }
- }
- {
- \tl_set:Nx \l_tmpa_tl
- {
- \lua_now:e
- { piton.Parse('\l_@@_language_str',token.scan_string()) }
- { #1 }
- }
- }
- \bool_if:NT \l_@@_show_spaces_bool
- { \regex_replace_all:nnN { \x20 } { ⣠} \l_tmpa_tl } % U+2423
- \l_tmpa_tl
- \group_end:
- }
-% \end{macrocode}
-%
-% \bigskip
-% Despite its name, |\@@_pre_env:| will be used both in |\PitonInputFile| and
-% in the environments such as |{Piton}|.
-% \begin{macrocode}
-\cs_new:Npn \@@_pre_env:
- {
- \automatichyphenmode = 1
- \int_gincr:N \g_@@_env_int
- \tl_gclear:N \g_@@_aux_tl
- \cs_if_exist_use:c { c_@@ _ \int_use:N \g_@@_env_int _ tl }
- \dim_compare:nNnT \l_@@_width_on_aux_dim = \c_zero_dim
- { \dim_set_eq:NN \l_@@_width_on_aux_dim \linewidth }
- \bool_if:NF \l_@@_resume_bool { \int_gzero:N \g_@@_visual_line_int }
- \dim_gzero:N \g_@@_width_dim
- \int_gzero:N \g_@@_line_int
- \dim_zero:N \parindent
- \dim_zero:N \lineskip
- \dim_zero:N \parindent
- \cs_set_eq:NN \label \@@_label:n
- }
-% \end{macrocode}
-%
-% \bigskip
-% \begin{macrocode}
-\keys_define:nn { PitonInputFile }
- {
- first-line .int_set:N = \l_@@_first_line_int ,
- first-line .value_required:n = true ,
- last-line .int_set:N = \l_@@_last_line_int ,
- last-line .value_required:n = true ,
- }
-% \end{macrocode}
-%
-% \bigskip
-% \begin{macrocode}
-\NewDocumentCommand { \PitonInputFile } { d < > O { } m }
- {
- \tl_if_novalue:nF { #1 }
- {
- \bool_if:NTF \c_@@_beamer_bool
- { \begin { uncoverenv } < #1 > }
- { \msg_error:nn { piton } { overlay~without~beamer } }
- }
- \group_begin:
- \int_zero_new:N \l_@@_first_line_int
- \int_zero_new:N \l_@@_last_line_int
- \int_set_eq:NN \l_@@_last_line_int \c_max_int
- \keys_set:nn { PitonInputFile } { #2 }
- \@@_pre_env:
- \mode_if_vertical:TF \mode_leave_vertical: \newline
-% \end{macrocode}
-% We count with Lua the number of lines of the argument. The result will be
-% stored by Lua in |\l_@@_nb_lines_int|. That information will be used to allow
-% or disallow page breaks.
-% \begin{macrocode}
- \lua_now:n { piton.CountLinesFile(token.scan_argument()) } { #3 }
-% \end{macrocode}
-% If the final user has used both |left-margin=auto| and |line-numbers| or
-% |all-line-numbers|, we have to compute the width of the maximal number of
-% lines at the end of the composition of the listing to fix the correct value to
-% |left-margin|.
-% \begin{macrocode}
- \bool_lazy_and:nnT \l_@@_left_margin_auto_bool \l_@@_line_numbers_bool
- {
- \hbox_set:Nn \l_tmpa_box
- {
- \footnotesize
- \bool_if:NTF \l_@@_all_line_numbers_bool
- {
- \int_to_arabic:n
- { \g_@@_visual_line_int + \l_@@_nb_lines_int }
- }
- {
- \lua_now:n
- { piton.CountNonEmptyLinesFile(token.scan_argument()) }
- { #3 }
- \int_to_arabic:n
- { \g_@@_visual_line_int + \l_@@_nb_non_empty_lines_int }
- }
- }
- \dim_set:Nn \l_@@_left_margin_dim
- { \box_wd:N \l_tmpa_box + \l_@@_numbers_sep_dim + 0.1 em }
- }
-% \end{macrocode}
-% Now, the main job.
-% \begin{macrocode}
- \ttfamily
- \bool_if:NT \c_@@_footnote_bool { \begin { savenotes } }
- \vtop \bgroup
- \lua_now:e
- {
- piton.ParseFile('\l_@@_language_str',token.scan_argument() ,
- \int_use:N \l_@@_first_line_int ,
- \int_use:N \l_@@_last_line_int )
- }
- { #3 }
- \egroup
- \bool_if:NT \c_@@_footnote_bool { \end { savenotes } }
- \@@_width_to_aux:
- \group_end:
- \tl_if_novalue:nF { #1 }
- { \bool_if:NT \c_@@_beamer_bool { \end { uncoverenv } } }
- \@@_write_aux:
- }
-% \end{macrocode}
-%
-%
-% \bigskip
-% \begin{macrocode}
-\NewDocumentCommand { \NewPitonEnvironment } { m m m m }
- {
-% \end{macrocode}
-% We construct a TeX macro which will catch as argument all the tokens until
-% |\end{|\texttt{\textsl{name_env}}|}| with, in that
-% |\end{|\texttt{\textsl{name_env}}|}|, the catcodes of |\|, |{| and |}| equal to
-% 12 (``\texttt{other}''). The latter explains why the definition of that
-% function is a bit complicated.
-% \begin{macrocode}
- \use:x
- {
- \cs_set_protected:Npn
- \use:c { _@@_collect_ #1 :w }
- ####1
- \c_backslash_str end \c_left_brace_str #1 \c_right_brace_str
- }
- {
- \group_end:
- \mode_if_vertical:TF \mode_leave_vertical: \newline
-% \end{macrocode}
-% We count with Lua the number of lines of the argument. The result will be
-% stored by Lua in |\l_@@_nb_lines_int|. That information will be used to allow
-% or disallow page breaks.
-% \begin{macrocode}
- \lua_now:n { piton.CountLines(token.scan_argument()) } { ##1 }
-% \end{macrocode}
-% If the final user has used both |left-margin=auto| and |line-numbers|, we have
-% to compute the width of the maximal number of lines at the end of the
-% environment to fix the correct value to |left-margin|.
-% \begin{macrocode}
- \bool_lazy_and:nnT \l_@@_left_margin_auto_bool \l_@@_line_numbers_bool
- {
- \bool_if:NTF \l_@@_all_line_numbers_bool
- {
- \hbox_set:Nn \l_tmpa_box
- {
- \footnotesize
- \int_to_arabic:n
- { \g_@@_visual_line_int + \l_@@_nb_lines_int }
- }
- }
- {
- \lua_now:n
- { piton.CountNonEmptyLines(token.scan_argument()) }
- { ##1 }
- \hbox_set:Nn \l_tmpa_box
- {
- \footnotesize
- \int_to_arabic:n
- { \g_@@_visual_line_int + \l_@@_nb_non_empty_lines_int }
- }
- }
- \dim_set:Nn \l_@@_left_margin_dim
- { \box_wd:N \l_tmpa_box + \l_@@_numbers_sep_dim + 0.1 em }
- }
-% \end{macrocode}
-% Now, the main job.
-% \begin{macrocode}
- \ttfamily
- \bool_if:NT \c_@@_footnote_bool { \begin { savenotes } }
- \vtop \bgroup
- \lua_now:e
- {
- piton.GobbleParse
- (
- '\l_@@_language_str' ,
- \int_use:N \l_@@_gobble_int ,
- token.scan_argument()
- )
- }
- { ##1 }
- \vspace { 2.5 pt }
- \egroup
- \bool_if:NT \c_@@_footnote_bool { \end { savenotes } }
- \@@_width_to_aux:
-% \end{macrocode}
-% The following |\end{#1}| is only for the groups and the stack of environments
-% of LaTeX.
-% \begin{macrocode}
- \end { #1 }
- \@@_write_aux:
- }
-% \end{macrocode}
-%
-%
-% \bigskip
-% We can now define the new environment.
-%
-% We are still in the definition of the command |\NewPitonEnvironment|...
-% \begin{macrocode}
- \NewDocumentEnvironment { #1 } { #2 }
- {
- #3
- \@@_pre_env:
- \group_begin:
- \tl_map_function:nN
- { \ \\ \{ \} \$ \& \# \^ \_ \% \~ \^^I }
- \char_set_catcode_other:N
- \use:c { _@@_collect_ #1 :w }
- }
- { #4 }
-% \end{macrocode}
-%
-% \medskip
-% The following code is for technical reasons. We want to change the catcode of
-% |^^M| before catching the arguments of the new environment we are defining.
-% Indeed, if not, we will have problems if there is a final optional argument in
-% our environment (if that final argument is not used by the user in an
-% instance of the environment, a spurious space is inserted, probably because
-% the |^^M| is converted to space).
-% \begin{macrocode}
- \AddToHook { env / #1 / begin } { \char_set_catcode_other:N \^^M }
- }
-% \end{macrocode}
-% This is the end of the definition of the command |\NewPitonEnvironment|.
-%
-% \bigskip
-% Now, we define the environment |{Piton}|, which is the main environment
-% provided by the package \pkg{piton}. Of course, you use
-% |\NewPitonEnvironment|.
-% \begin{macrocode}
-\bool_if:NTF \c_@@_beamer_bool
- {
- \NewPitonEnvironment { Piton } { d < > }
- {
- \IfValueTF { #1 }
- { \begin { uncoverenv } < #1 > }
- { \begin { uncoverenv } }
- }
- { \end { uncoverenv } }
- }
- { \NewPitonEnvironment { Piton } { } { } { } }
-% \end{macrocode}
-%
-%
-%
-% \bigskip
-% \subsubsection{The styles}
-%
-% \medskip
-% The following command is fundamental: it will be used by the Lua code.
-% \begin{macrocode}
-\NewDocumentCommand { \PitonStyle } { m } { \use:c { pitonStyle #1 } }
-% \end{macrocode}
-%
-% \medskip
-% The following command takes in its argument by curryfication.
-% \begin{macrocode}
-\NewDocumentCommand { \SetPitonStyle } { } { \keys_set:nn { piton / Styles } }
-% \end{macrocode}
-%
-% \medskip
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_math_scantokens:n #1
- { \normalfont \scantextokens { $#1$ } }
-% \end{macrocode}
-%
-% \medskip
-% \begin{macrocode}
-\keys_define:nn { piton / Styles }
- {
- String.Interpol .tl_set:c = pitonStyle String.Interpol ,
- String.Interpol .value_required:n = true ,
- FormattingType .tl_set:c = pitonStyle FormattingType ,
- FormattingType .value_required:n = true ,
- Dict.Value .tl_set:c = pitonStyle Dict.Value ,
- Dict.Value .value_required:n = true ,
- Name.Decorator .tl_set:c = pitonStyle Name.Decorator ,
- Name.Decorator .value_required:n = true ,
- Name.Function .tl_set:c = pitonStyle Name.Function ,
- Name.Function .value_required:n = true ,
- Name.UserFunction .tl_set:c = pitonStyle Name.UserFunction ,
- Name.UserFunction .value_required:n = true ,
- Keyword .tl_set:c = pitonStyle Keyword ,
- Keyword .value_required:n = true ,
- Keyword.Constant .tl_set:c = pitonStyle Keyword.Constant ,
- Keyword.constant .value_required:n = true ,
- String.Doc .tl_set:c = pitonStyle String.Doc ,
- String.Doc .value_required:n = true ,
- Interpol.Inside .tl_set:c = pitonStyle Interpol.Inside ,
- Interpol.Inside .value_required:n = true ,
- String.Long .tl_set:c = pitonStyle String.Long ,
- String.Long .value_required:n = true ,
- String.Short .tl_set:c = pitonStyle String.Short ,
- String.Short .value_required:n = true ,
- String .meta:n = { String.Long = #1 , String.Short = #1 } ,
- Comment.Math .tl_set:c = pitonStyle Comment.Math ,
- Comment.Math .default:n = \@@_math_scantokens:n ,
- Comment.Math .initial:n = ,
- Comment .tl_set:c = pitonStyle Comment ,
- Comment .value_required:n = true ,
- InitialValues .tl_set:c = pitonStyle InitialValues ,
- InitialValues .value_required:n = true ,
- Number .tl_set:c = pitonStyle Number ,
- Number .value_required:n = true ,
- Name.Namespace .tl_set:c = pitonStyle Name.Namespace ,
- Name.Namespace .value_required:n = true ,
- Name.Class .tl_set:c = pitonStyle Name.Class ,
- Name.Class .value_required:n = true ,
- Name.Builtin .tl_set:c = pitonStyle Name.Builtin ,
- Name.Builtin .value_required:n = true ,
- TypeParameter .tl_set:c = pitonStyle TypeParameter ,
- TypeParameter .value_required:n = true ,
- Name.Type .tl_set:c = pitonStyle Name.Type ,
- Name.Type .value_required:n = true ,
- Operator .tl_set:c = pitonStyle Operator ,
- Operator .value_required:n = true ,
- Operator.Word .tl_set:c = pitonStyle Operator.Word ,
- Operator.Word .value_required:n = true ,
- Exception .tl_set:c = pitonStyle Exception ,
- Exception .value_required:n = true ,
- Comment.LaTeX .tl_set:c = pitonStyle Comment.LaTeX ,
- Comment.LaTeX .value_required:n = true ,
- Identifier .tl_set:c = pitonStyle Identifier ,
- Comment.LaTeX .value_required:n = true ,
- ParseAgain.noCR .tl_set:c = pitonStyle ParseAgain.noCR ,
- ParseAgain.noCR .value_required:n = true ,
- ParseAgain .tl_set:c = pitonStyle ParseAgain ,
- ParseAgain .value_required:n = true ,
- Prompt .tl_set:c = pitonStyle Prompt ,
- Prompt .value_required:n = true ,
- unknown .code:n =
- \msg_error:nn { piton } { Unknown~key~for~SetPitonStyle }
- }
-% \end{macrocode}
-%
-%
-% \bigskip
-% \begin{macrocode}
-\msg_new:nnn { piton } { Unknown~key~for~SetPitonStyle }
- {
- The~style~'\l_keys_key_str'~is~unknown.\\
- This~key~will~be~ignored.\\
- The~available~styles~are~(in~alphabetic~order):~
- Comment,~
- Comment.LaTeX,~
- Dict.Value,~
- Exception,~
- Identifier,~
- InitialValues,~
- Keyword,~
- Keyword.Constant,~
- Name.Builtin,~
- Name.Class,~
- Name.Decorator,~
- Name.Function,~
- Name.Namespace,~
- Number,~
- Operator,~
- Operator.Word,~
- Prompt,~
- String,~
- String.Doc,~
- String.Long,~
- String.Short,~and~
- String.Interpol.
- }
-% \end{macrocode}
-%
-% \bigskip
-% \subsubsection{The initial style}
-%
-% The initial style is inspired by the style ``manni'' of Pygments.
-%
-% \medskip
-% \begin{macrocode}
-\SetPitonStyle
- {
- Comment = \color[HTML]{0099FF} \itshape ,
- Exception = \color[HTML]{CC0000} ,
- Keyword = \color[HTML]{006699} \bfseries ,
- Keyword.Constant = \color[HTML]{006699} \bfseries ,
- Name.Builtin = \color[HTML]{336666} ,
- Name.Decorator = \color[HTML]{9999FF},
- Name.Class = \color[HTML]{00AA88} \bfseries ,
- Name.Function = \color[HTML]{CC00FF} ,
- Name.Namespace = \color[HTML]{00CCFF} ,
- Number = \color[HTML]{FF6600} ,
- Operator = \color[HTML]{555555} ,
- Operator.Word = \bfseries ,
- String = \color[HTML]{CC3300} ,
- String.Doc = \color[HTML]{CC3300} \itshape ,
- String.Interpol = \color[HTML]{AA0000} ,
- Comment.LaTeX = \normalfont \color[rgb]{.468,.532,.6} ,
- Name.Type = \color[HTML]{336666} ,
- InitialValues = \@@_piton:n ,
- Dict.Value = \@@_piton:n ,
- Interpol.Inside = \color{black}\@@_piton:n ,
- TypeParameter = \color[HTML]{008800} \itshape ,
- Identifier = \@@_identifier:n ,
- Name.UserFunction = ,
- Prompt = ,
- ParseAgain.noCR = \@@_piton_no_cr:n ,
- ParseAgain = \@@_piton:n ,
- }
-% \end{macrocode}
-% The last styles |ParseAgain.noCR| and |ParseAgain| should be considered as
-% ``internal style'' (not available for the final user). However, maybe we will
-% change that and document these styles for the final user (why not?).
-%
-% \medskip
-% If the key |math-comments| has been used at load-time, we change the style
-% |Comment.Math| which should be considered only at an ``internal style''.
-% However, maybe we will document in a future version the possibility to write
-% change the style \emph{locally} in a document)].
-% \begin{macrocode}
-\bool_if:NT \c_@@_math_comments_bool { \SetPitonStyle { Comment.Math } }
-% \end{macrocode}
-%
-% \bigskip
-%
-% \bigskip
-% \subsubsection{Highlighting some identifiers}
-%
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_identifier:n #1
- { \cs_if_exist_use:c { PitonIdentifier _ \l_@@_language_str _ #1 } { #1 } }
-% \end{macrocode}
-%
-% \bigskip
-% \begin{macrocode}
-\keys_define:nn { PitonOptions }
- { identifiers .code:n = \@@_set_identifiers:n { #1 } }
-% \end{macrocode}
-%
-% \bigskip
-% \begin{macrocode}
-\keys_define:nn { Piton / identifiers }
- {
- names .clist_set:N = \l_@@_identifiers_names_tl ,
- style .tl_set:N = \l_@@_style_tl ,
- }
-% \end{macrocode}
-%
-% \bigskip
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_set_identifiers:n #1
- {
- \clist_clear_new:N \l_@@_identifiers_names_tl
- \tl_clear_new:N \l_@@_style_tl
- \keys_set:nn { Piton / identifiers } { #1 }
- \clist_map_inline:Nn \l_@@_identifiers_names_tl
- {
- \tl_set_eq:cN
- { PitonIdentifier _ \l_@@_language_str _ ##1 }
- \l_@@_style_tl
- }
- }
-% \end{macrocode}
-%
-%
-% \bigskip
-% In particular, we have an hightlighting of the indentifiers which are the
-% names of Python functions previously defined by the user. Indeed, when a
-% Python function is defined, the style |Name.Function.Internal| is applied to
-% that name. We define now that style (you define it directly and you short-cut
-% the function |\SetPitonStyle|).
-% \begin{macrocode}
-\cs_new_protected:cpn { pitonStyle Name.Function.Internal } #1
- {
-% \end{macrocode}
-% First, the element is composed in the TeX flow with the style |Name.Function|
-% which is provided to the final user.
-% \begin{macrocode}
- { \PitonStyle { Name.Function } { #1 } }
-% \end{macrocode}
-% Now, we specify that the name of the new Python function is a known identifier
-% that will be formated with the Piton style |Name.UserFunction|. Of course,
-% here the affectation is global because we have to exit many groups and even
-% the environments |{Piton}|).
-% \begin{macrocode}
- \cs_gset_protected:cpn { PitonIdentifier _ \l_@@_language_str _ #1 }
- { \PitonStyle{ Name.UserFunction } }
-% \end{macrocode}
-% Now, we put the name of that new user function in the dedicated sequence
-% (specific of the current language). That sequence will be used only by
-% |\PitonClearUserFunctions|.
-% \begin{macrocode}
- \seq_if_exist:cF { g_@@_functions _ \l_@@_language_str _ seq }
- { \seq_new:c { g_@@_functions _ \l_@@_language_str _ seq } }
- \seq_gput_right:cn { g_@@_functions _ \l_@@_language_str _ seq } { #1 }
- }
-% \end{macrocode}
-%
-% \bigskip
-% \begin{macrocode}
-\NewDocumentCommand \PitonClearUserFunctions { ! O { \l_@@_language_str } }
- {
- \seq_if_exist:cT { g_@@_functions _ #1 _ seq }
- {
- \seq_map_inline:cn { g_@@_functions _ #1 _ seq }
- { \cs_undefine:c { PitonIdentifier _ #1 _ ##1} }
- \seq_gclear:c { g_@@_functions _ #1 _ seq }
- }
- }
-% \end{macrocode}
-%
-% \bigskip
-% \subsubsection{Security}
-%
-% \begin{macrocode}
-\AddToHook { env / piton / begin }
- { \msg_fatal:nn { piton } { No~environment~piton } }
-
-\msg_new:nnn { piton } { No~environment~piton }
- {
- There~is~no~environment~piton!\\
- There~is~an~environment~{Piton}~and~a~command~
- \token_to_str:N \piton\ but~there~is~no~environment~
- {piton}.~This~error~is~fatal.
- }
-% \end{macrocode}
-%
-% \bigskip
-% \subsubsection{The error messages of the package}
-%
-% \begin{macrocode}
-\msg_new:nnnn { piton } { Unknown~key~for~PitonOptions }
- {
- Unknown~key. \\
- The~key~'\l_keys_key_str'~is~unknown~for~\token_to_str:N \PitonOptions.~
- It~will~be~ignored.\\
- For~a~list~of~the~available~keys,~type~H~<return>.
- }
- {
- The~available~keys~are~(in~alphabetic~order):~
- all-line-numbers,~
- auto-gobble,~
- background-color,~
- break-lines,~
- break-lines-in-piton,~
- break-lines-in-Piton,~
- continuation-symbol,~
- continuation-symbol-on-indentation,~
- end-of-broken-line,~
- env-gobble,~
- gobble,~
- identifiers,~
- indent-broken-lines,~
- language,~
- left-margin,~
- line-numbers,~
- prompt-background-color,~
- resume,~
- show-spaces,~
- show-spaces-in-strings,~
- slim,~
- splittable,~
- tabs-auto-gobble~
- and~tab-size.
- }
-% \end{macrocode}
-%
-% \bigskip
-% \begin{macrocode}
-\msg_new:nnn { piton } { label~with~lines~numbers }
- {
- You~can't~use~the~command~\token_to_str:N \label\
- because~the~key~'line-numbers'~(or~'all-line-numbers')~
- is~not~active.\\
- If~you~go~on,~that~command~will~ignored.
- }
-% \end{macrocode}
-%
-% \bigskip
-% \begin{macrocode}
-\msg_new:nnn { piton } { cr~not~allowed }
- {
- You~can't~put~any~carriage~return~in~the~argument~
- of~a~command~\c_backslash_str
- \l_@@_beamer_command_str\ within~an~
- environment~of~'piton'.~You~should~consider~using~the~
- corresponding~environment.\\
- That~error~is~fatal.
- }
-% \end{macrocode}
-%
-% \bigskip
-% \begin{macrocode}
-\msg_new:nnn { piton } { overlay~without~beamer }
- {
- You~can't~use~an~argument~<...>~for~your~command~
- \token_to_str:N \PitonInputFile\ because~you~are~not~
- in~Beamer.\\
- If~you~go~on,~that~argument~will~be~ignored.
- }
-% \end{macrocode}
-%
-% \bigskip
-% \begin{macrocode}
-\msg_new:nnn { Piton } { Python~error }
- { A~Python~error~has~been~detected. }
-% \end{macrocode}
-%
-% \bigskip
-% \subsection{The Lua part of the implementation}
-%
-% \bigskip
-% \begin{macrocode}
-\ExplSyntaxOff
-\RequirePackage{luacode}
-% \end{macrocode}
-%
-%
-% \bigskip
-% The Lua code will be loaded via a |{luacode*}| environment. The environment
-% is by itself a Lua block and the local declarations will be local to that
-% block. All the global functions (used by the L3 parts of the implementation)
-% will be put in a Lua table |piton|.
-%
-% \medskip
-% \begin{macrocode}
-\begin{luacode*}
-piton = piton or { }
-% \end{macrocode}
-%
-% \begin{macrocode}
-if piton.comment_latex == nil then piton.comment_latex = ">" end
-piton.comment_latex = "#" .. piton.comment_latex
-% \end{macrocode}
-%
-%
-% \bigskip
-% The following functions are an easy way to safely insert braces (|{| and |}|)
-% in the TeX flow.
-% \begin{macrocode}
-function piton.open_brace ()
- tex.sprint("{")
-end
-function piton.close_brace ()
- tex.sprint("}")
-end
-% \end{macrocode}
-%
-% \bigskip
-% \subsubsection{Special functions dealing with LPEG}
-%
-% \medskip
-% We will use the Lua library \pkg{lpeg} which is built in LuaTeX. That's why we
-% define first aliases for several functions of that library.
-% \begin{macrocode}
-local P, S, V, C, Ct, Cc = lpeg.P, lpeg.S, lpeg.V, lpeg.C, lpeg.Ct, lpeg.Cc
-local Cf, Cs , Cg , Cmt , Cb = lpeg.Cf, lpeg.Cs, lpeg.Cg , lpeg.Cmt , lpeg.Cb
-local R = lpeg.R
-% \end{macrocode}
-%
-%
-%
-% \bigskip
-% The function |Q| takes in as argument a pattern and returns a \textsc{lpeg}
-% \emph{which does a capture} of the pattern. That capture will be sent to LaTeX
-% with the catcode ``other'' for all the characters: it's suitable for elements
-% of the Python listings that \pkg{piton} will typeset verbatim (thanks to the
-% catcode ``other'').
-% \begin{macrocode}
-local function Q(pattern)
- return Ct ( Cc ( luatexbase.catcodetables.CatcodeTableOther ) * C ( pattern ) )
-end
-% \end{macrocode}
-%
-%
-% \bigskip
-% The function |L| takes in as argument a pattern and returns a \textsc{lpeg}
-% \emph{which does a capture} of the pattern. That capture will be sent to LaTeX
-% with standard LaTeX catcodes for all the characters: the elements captured
-% will be formatted as normal LaTeX codes. It's suitable for the ``LaTeX
-% comments'' in the environments |{Piton}| and the elements beetween
-% ``|escape-inside|''. That function won't be much used.
-% \begin{macrocode}
-local function L(pattern)
- return Ct ( C ( pattern ) )
-end
-% \end{macrocode}
-%
-% \bigskip
-% The function |Lc| (the c is for \emph{constant}) takes in as argument a string
-% and returns a \textsc{lpeg} \emph{with does a constant capture} which returns
-% that string. The elements captured will be formatted as L3 code. It will be
-% used to send to LaTeX all the formatting LaTeX instructions we have to insert
-% in order to do the syntactic highlighting (that's the main job of
-% \pkg{piton}). That function will be widely used.
-% \begin{macrocode}
-local function Lc(string)
- return Cc ( { luatexbase.catcodetables.expl , string } )
-end
-% \end{macrocode}
-%
-% \bigskip
-% The function |K| creates a \textsc{lpeg} which will return as capture the
-% whole LaTeX code corresponding to a Python chunk (that is to say with the
-% LaTeX formatting instructions corresponding to the syntactic nature of that
-% Python chunk). The first argument is a Lua string corresponding to the name of
-% a \pkg{piton} style and the second element is a pattern (that is to say a
-% \textsc{lpeg} without capture)
-% \begin{macrocode}
-local function K(style, pattern)
- return
- Lc ( "{\\PitonStyle{" .. style .. "}{" )
- * Q ( pattern )
- * Lc ( "}}" )
-end
-% \end{macrocode}
-% The formatting commands in a given \pkg{piton} style (eg. the style |Keyword|)
-% may be semi-global declarations (such as |\bfseries| or |\slshape|) or LaTeX
-% macros with an argument (such as |\fbox| or |\colorbox{yellow}|). In order to
-% deal with both syntaxes, we have used two pairs of braces:
-% |{\PitonStyle{Keyword}{|\texttt{\slshape text to format}|}}|.
-%
-%
-% \bigskip
-% \begin{macrocode}
-local function WithStyle(style,pattern)
- return
- Ct ( Cc "Open" * Cc ( "{\\PitonStyle{" .. style .. "}{" ) * Cc "}}" )
- * pattern
- * Ct ( Cc "Close" )
-end
-% \end{macrocode}
-%
-% \bigskip
-% The following \textsc{lpeg} catches the Python chunks which are in LaTeX
-% escapes (and that chunks will be considered as normal LaTeX constructions). We
-% recall that |piton.begin_espace| and |piton_end_escape| are Lua strings
-% corresponding to the key |escape-inside|\footnote{The \pkg{piton} key
-% |escape-inside| is available at load-time only.}. Since the elements that will
-% be catched must be sent to LaTeX with standard LaTeX catcodes, we put the
-% capture (done by the function |C|) in a table (by using |Ct|, which is an
-% alias for |lpeg.Ct|) without number of catcode table at the first component of
-% the table.
-% \begin{macrocode}
-local Escape =
- P(piton_begin_escape)
- * L ( ( 1 - P(piton_end_escape) ) ^ 1 )
- * P(piton_end_escape)
-% \end{macrocode}
-%
-% \vspace{1cm}
-% The following line is mandatory.
-% \begin{macrocode}
-lpeg.locale(lpeg)
-% \end{macrocode}
-%
-% \bigskip
-% \paragraph{The basic syntactic LPEG}
-%
-% \begin{macrocode}
-local alpha, digit = lpeg.alpha, lpeg.digit
-local space = P " "
-% \end{macrocode}
-%
-% Remember that, for \textsc{lpeg}, the Unicode characters such as |à|, |â|,
-% |ç|, etc. are in fact strings of length 2 (2 bytes) because \pkg{lpeg} is not
-% Unicode-aware.
-% \begin{macrocode}
-local letter = alpha + P "_"
- + P "â" + P "à" + P "ç" + P "é" + P "è" + P "ê" + P "ë" + P "ï" + P "î"
- + P "ô" + P "û" + P "ü" + P "Â" + P "À" + P "Ç" + P "É" + P "È" + P "Ê"
- + P "Ë" + P "Ã" + P "ÃŽ" + P "Ô" + P "Û" + P "Ãœ"
-
-local alphanum = letter + digit
-% \end{macrocode}
-%
-% \bigskip
-% The following \textsc{lpeg} |identifier| is a mere pattern (that is to say
-% more or less a regular expression) which matches the Python identifiers (hence
-% the name).
-% \begin{macrocode}
-local identifier = letter * alphanum ^ 0
-% \end{macrocode}
-%
-% \medskip
-% On the other hand, the \textsc{lpeg} |Identifier| (with a capital) also returns
-% a \emph{capture}.
-% \begin{macrocode}
-local Identifier = K ( 'Identifier' , identifier)
-% \end{macrocode}
-%
-% \bigskip
-% By convention, we will use names with an initial capital for \textsc{lpeg}
-% which return captures.
-%
-%
-% \bigskip
-% Here is the first use of our function~|K|. That function will be used to
-% construct \textsc{lpeg} which capture Python chunks for which we have a
-% dedicated \pkg{piton} style. For example, for the numbers, \pkg{piton}
-% provides a style which is called |Number|. The name of the style is provided
-% as a Lua string in the second argument of the function~|K|. By convention, we
-% use single quotes for delimiting the Lua strings which are names of
-% \pkg{piton} styles (but this is only a convention).
-% \begin{macrocode}
-local Number =
- K ( 'Number' ,
- ( digit^1 * P "." * digit^0 + digit^0 * P "." * digit^1 + digit^1 )
- * ( S "eE" * S "+-" ^ -1 * digit^1 ) ^ -1
- + digit^1
- )
-% \end{macrocode}
-%
-% \bigskip
-% We recall that |piton.begin_espace| and |piton_end_escape| are Lua strings
-% corresponding to the key |escape-inside|\footnote{The \pkg{piton} key
-% |escape-inside| is available at load-time only.}. Of course, if the final user
-% has not used the key |escape-inside|, these strings are empty.
-% \begin{macrocode}
-local Word
-if piton_begin_escape ~= ''
-then Word = Q ( ( ( 1 - space - P(piton_begin_escape) - P(piton_end_escape) )
- - S "'\"\r[()]" - digit ) ^ 1 )
-else Word = Q ( ( ( 1 - space ) - S "'\"\r[()]" - digit ) ^ 1 )
-end
-% \end{macrocode}
-%
-% \bigskip
-% \begin{macrocode}
-local Space = ( Q " " ) ^ 1
-
-local SkipSpace = ( Q " " ) ^ 0
-
-local Punct = Q ( S ".,:;!" )
-
-local Tab = P "\t" * Lc ( '\\l_@@_tab_tl' )
-% \end{macrocode}
-%
-% \bigskip
-% \begin{macrocode}
-local SpaceIndentation = Lc ( '\\@@_an_indentation_space:' ) * ( Q " " )
-% \end{macrocode}
-%
-%
-% \bigskip
-% \begin{macrocode}
-local Delim = Q ( S "[()]" )
-% \end{macrocode}
-%
-% \bigskip
-% The following \textsc{lpeg} catches a space (U+0020) and replace it by
-% |\l_@@_space_tl|. It will be used in the strings. Usually,
-% |\l_@@_space_tl| will contain a space and therefore there won't be difference.
-% However, when the key |show-spaces-in-strings| is in force, |\\l_@@_space_tl| will
-% contain ⣠(U+2423) in order to visualize the spaces.
-% \begin{macrocode}
-local VisualSpace = space * Lc "\\l_@@_space_tl"
-% \end{macrocode}
-%
-%
-% \bigskip
-% \subsubsection{The LPEG python}
-%
-% \bigskip
-% Some strings of length 2 are explicit because we want the corresponding
-% ligatures available in some fonts such as \emph{Fira Code} to be active.
-% \begin{macrocode}
-local Operator =
- K ( 'Operator' ,
- P "!=" + P "<>" + P "==" + P "<<" + P ">>" + P "<=" + P ">=" + P ":="
- + P "//" + P "**" + S "-~+/*%=<>&.@|"
- )
-
-local OperatorWord =
- K ( 'Operator.Word' ,P "in" + P "is" + P "and" + P "or" + P "not" )
-
-local Keyword =
- K ( 'Keyword' ,
- P "as" + P "assert" + P "break" + P "case" + P "class" + P "continue"
- + P "def" + P "del" + P "elif" + P "else" + P "except" + P "exec"
- + P "finally" + P "for" + P "from" + P "global" + P "if" + P "import"
- + P "lambda" + P "non local" + P "pass" + P "return" + P "try"
- + P "while" + P "with" + P "yield" + P "yield from" )
- + K ( 'Keyword.Constant' ,P "True" + P "False" + P "None" )
-
-local Builtin =
- K ( 'Name.Builtin' ,
- P "__import__" + P "abs" + P "all" + P "any" + P "bin" + P "bool"
- + P "bytearray" + P "bytes" + P "chr" + P "classmethod" + P "compile"
- + P "complex" + P "delattr" + P "dict" + P "dir" + P "divmod"
- + P "enumerate" + P "eval" + P "filter" + P "float" + P "format"
- + P "frozenset" + P "getattr" + P "globals" + P "hasattr" + P "hash"
- + P "hex" + P "id" + P "input" + P "int" + P "isinstance" + P "issubclass"
- + P "iter" + P "len" + P "list" + P "locals" + P "map" + P "max"
- + P "memoryview" + P "min" + P "next" + P "object" + P "oct" + P "open"
- + P "ord" + P "pow" + P "print" + P "property" + P "range" + P "repr"
- + P "reversed" + P "round" + P "set" + P "setattr" + P "slice" + P "sorted"
- + P "staticmethod" + P "str" + P "sum" + P "super" + P "tuple" + P "type"
- + P "vars" + P "zip" )
-
-
-local Exception =
- K ( 'Exception' ,
- P "ArithmeticError" + P "AssertionError" + P "AttributeError"
- + P "BaseException" + P "BufferError" + P "BytesWarning" + P "DeprecationWarning"
- + P "EOFError" + P "EnvironmentError" + P "Exception" + P "FloatingPointError"
- + P "FutureWarning" + P "GeneratorExit" + P "IOError" + P "ImportError"
- + P "ImportWarning" + P "IndentationError" + P "IndexError" + P "KeyError"
- + P "KeyboardInterrupt" + P "LookupError" + P "MemoryError" + P "NameError"
- + P "NotImplementedError" + P "OSError" + P "OverflowError"
- + P "PendingDeprecationWarning" + P "ReferenceError" + P "ResourceWarning"
- + P "RuntimeError" + P "RuntimeWarning" + P "StopIteration"
- + P "SyntaxError" + P "SyntaxWarning" + P "SystemError" + P "SystemExit"
- + P "TabError" + P "TypeError" + P "UnboundLocalError" + P "UnicodeDecodeError"
- + P "UnicodeEncodeError" + P "UnicodeError" + P "UnicodeTranslateError"
- + P "UnicodeWarning" + P "UserWarning" + P "ValueError" + P "VMSError"
- + P "Warning" + P "WindowsError" + P "ZeroDivisionError"
- + P "BlockingIOError" + P "ChildProcessError" + P "ConnectionError"
- + P "BrokenPipeError" + P "ConnectionAbortedError" + P "ConnectionRefusedError"
- + P "ConnectionResetError" + P "FileExistsError" + P "FileNotFoundError"
- + P "InterruptedError" + P "IsADirectoryError" + P "NotADirectoryError"
- + P "PermissionError" + P "ProcessLookupError" + P "TimeoutError"
- + P "StopAsyncIteration" + P "ModuleNotFoundError" + P "RecursionError" )
-
-
-local RaiseException = K ( 'Keyword' , P "raise" ) * SkipSpace * Exception * Q ( P "(" )
-
-% \end{macrocode}
-%
-% \bigskip
-% In Python, a ``decorator'' is a statement whose begins by |@| which patches
-% the function defined in the following statement.
-% \begin{macrocode}
-local Decorator = K ( 'Name.Decorator' , P "@" * letter^1 )
-% \end{macrocode}
-%
-% \bigskip
-% The following \textsc{lpeg} |DefClass| will be used to detect the definition of a
-% new class (the name of that new class will be formatted with the \pkg{piton}
-% style |Name.Class|).
-%
-% \smallskip
-% Example:\enskip \piton{class myclass:}
-% \begin{macrocode}
-local DefClass =
- K ( 'Keyword' , P "class" ) * Space * K ( 'Name.Class' , identifier )
-% \end{macrocode}
-%
-% If the word |class| is not followed by a identifier, it will be catched as
-% keyword by the \textsc{lpeg} |Keyword| (useful if we want to type a
-% list of keywords).
-%
-%
-% \bigskip
-% The following \textsc{lpeg} |ImportAs| is used for the lines beginning by |import|.
-% % We have to detect the potential keyword |as| because both the name of the
-% module and its alias must be formatted with the \pkg{piton} style |Name.Namespace|.
-%
-% \smallskip
-% Example:\enskip \piton{import numpy as np}
-%
-% \smallskip
-% Moreover, after the keyword |import|, it's possible to have a comma-separated
-% list of modules (if the keyword |as| is not used).
-%
-% \smallskip
-% Example:\enskip \piton{import math, numpy}
-% \begin{macrocode}
-local ImportAs =
- K ( 'Keyword' , P "import" )
- * Space
- * K ( 'Name.Namespace' ,
- identifier * ( P "." * identifier ) ^ 0 )
- * (
- ( Space * K ( 'Keyword' , P "as" ) * Space
- * K ( 'Name.Namespace' , identifier ) )
- +
- ( SkipSpace * Q ( P "," ) * SkipSpace
- * K ( 'Name.Namespace' , identifier ) ) ^ 0
- )
-% \end{macrocode}
-% Be careful: there is no commutativity of |+| in the previous expression.
-%
-% \bigskip
-% The \textsc{lpeg} |FromImport| is used for the lines beginning by |from|. We
-% need a special treatment because the identifier following the keyword |from|
-% must be formatted with the \pkg{piton} style |Name.Namespace| and the
-% following keyword |import| must be formatted with the \pkg{piton} style
-% |Keyword| and must \emph{not} be catched by the \textsc{lpeg} |ImportAs|.
-%
-% \smallskip
-% Example:\enskip \piton{from math import pi}
-%
-% \smallskip
-% \begin{macrocode}
-local FromImport =
- K ( 'Keyword' , P "from" )
- * Space * K ( 'Name.Namespace' , identifier )
- * Space * K ( 'Keyword' , P "import" )
-% \end{macrocode}
-%
-% \bigskip
-% \paragraph{The strings of Python}
-%
-% For the strings in Python, there are four categories of delimiters (without
-% counting the prefixes for f-strings and raw strings). We will use, in the
-% names of our \textsc{lpeg}, prefixes to distinguish the \textsc{lpeg} dealing
-% with that categories of strings, as presented in the following tabular.
-% \begin{center}
-% \begin{tabular}{ccc}
-% \toprule
-% & |Single| & |Double| \\
-% \midrule
-% |Short| & |'text'| & |"text"| \\
-% |Long| & |'''test'''| & |"""text"""| \\
-% \bottomrule
-% \end{tabular}
-% \end{center}
-%
-%
-% \bigskip
-% We have also to deal with the interpolations in the f-strings. Here
-% is an example of a f-string with an interpolation and a format
-% instruction\footnote{There is no special \pkg{piton} style for the formatting
-% instruction (after the colon): the style which will be applied will be the
-% style of the encompassing string, that is to say |String.Short| or
-% |String.Long|.} in that interpolation:
-%
-% \piton{f'Total price: {total+1:.2f} €'}
-%
-%
-% \bigskip
-% The interpolations beginning by |%| (even though there is more modern
-% technics now in Python).
-% \begin{macrocode}
-local PercentInterpol =
- K ( 'String.Interpol' ,
- P "%"
- * ( P "(" * alphanum ^ 1 * P ")" ) ^ -1
- * ( S "-#0 +" ) ^ 0
- * ( digit ^ 1 + P "*" ) ^ -1
- * ( P "." * ( digit ^ 1 + P "*" ) ) ^ -1
- * ( S "HlL" ) ^ -1
- * S "sdfFeExXorgiGauc%"
- )
-% \end{macrocode}
-%
-% \bigskip
-% We can now define the \textsc{lpeg} for the four kinds of strings. It's not
-% possible to use our function~|K| because of the interpolations which must be
-% formatted with another \pkg{piton} style that the rest of the
-% string.\footnote{The interpolations are formatted with the \pkg{piton} style
-% |Interpol.Inside|. The initial value of that style is \texttt{\textbackslash
-% @@\_piton:n} wich means that the interpolations are parsed once again by \pkg{piton}.}
-% \begin{macrocode}
-local SingleShortString =
- WithStyle ( 'String.Short' ,
-% \end{macrocode}
-% First, we deal with the f-strings of Python, which are prefixed by |f| or |F|.
-% \begin{macrocode}
- Q ( P "f'" + P "F'" )
- * (
- K ( 'String.Interpol' , P "{" )
- * K ( 'Interpol.Inside' , ( 1 - S "}':" ) ^ 0 )
- * Q ( P ":" * (1 - S "}:'") ^ 0 ) ^ -1
- * K ( 'String.Interpol' , P "}" )
- +
- VisualSpace
- +
- Q ( ( P "\\'" + P "{{" + P "}}" + 1 - S " {}'" ) ^ 1 )
- ) ^ 0
- * Q ( P "'" )
- +
-% \end{macrocode}
-% Now, we deal with the standard strings of Python, but also the ``raw strings''.
-% \begin{macrocode}
- Q ( P "'" + P "r'" + P "R'" )
- * ( Q ( ( P "\\'" + 1 - S " '\r%" ) ^ 1 )
- + VisualSpace
- + PercentInterpol
- + Q ( P "%" )
- ) ^ 0
- * Q ( P "'" ) )
-
-
-local DoubleShortString =
- WithStyle ( 'String.Short' ,
- Q ( P "f\"" + P "F\"" )
- * (
- K ( 'String.Interpol' , P "{" )
- * Q ( ( 1 - S "}\":" ) ^ 0 , 'Interpol.Inside' )
- * ( K ( 'String.Interpol' , P ":" ) * Q ( (1 - S "}:\"") ^ 0 ) ) ^ -1
- * K ( 'String.Interpol' , P "}" )
- +
- VisualSpace
- +
- Q ( ( P "\\\"" + P "{{" + P "}}" + 1 - S " {}\"" ) ^ 1 )
- ) ^ 0
- * Q ( P "\"" )
- +
- Q ( P "\"" + P "r\"" + P "R\"" )
- * ( Q ( ( P "\\\"" + 1 - S " \"\r%" ) ^ 1 )
- + VisualSpace
- + PercentInterpol
- + Q ( P "%" )
- ) ^ 0
- * Q ( P "\"" ) )
-
-local ShortString = SingleShortString + DoubleShortString
-% \end{macrocode}
-%
-% \bigskip
-% \paragraph{Beamer}
-%
-% The following \textsc{lpeg} |BalancedBraces| will be used for the (mandatory)
-% argument of the commands |\only| and \emph{al.} of Beamer. It's necessary to
-% use a \emph{grammar} because that pattern mainly checks the correct nesting of
-% the delimiters (and it's known in the theory of formal languages that this
-% can't be done with regular expressions \emph{stricto sensu} only).
-% \begin{macrocode}
-local BalancedBraces =
- P { "E" ,
- E =
- (
- P "{" * V "E" * P "}"
- +
- ShortString
- +
- ( 1 - S "{}" )
- ) ^ 0
- }
-% \end{macrocode}
-%
-%
-% \bigskip
-% If Beamer is used (or if the key |beamer| is used at load-time), the following
-% LPEG will be redefined.
-% \begin{macrocode}
-local Beamer = P ( false )
-local BeamerBeginEnvironments = P ( true )
-local BeamerEndEnvironments = P ( true )
-local BeamerNamesEnvironments =
- P "uncoverenv" + P "onlyenv" + P "visibleenv" + P "invisibleenv"
- + P "alertenv" + P "actionenv"
-
-% \end{macrocode}
-%
-% \begin{macrocode}
-UserCommands =
- Ct ( Cc "Open" * C ( "\\emph{" ) * Cc "}" )
- * ( C ( BalancedBraces ) / (function (s) return MainLoopPython:match(s) end ) )
- * P "}" * Ct ( Cc "Close" )
-% \end{macrocode}
-%
-% \begin{macrocode}
-function OneBeamerEnvironment(name)
- return
- Ct ( Cc "Open"
- * C (
- P ( "\\begin{" .. name .. "}" )
- * ( P "<" * (1 - P ">") ^ 0 * P ">" ) ^ -1
- )
- * Cc ( "\\end{" .. name .. "}" )
- )
- * (
- C ( ( 1 - P ( "\\end{" .. name .. "}" ) ) ^ 0 )
- / (function (s) return MainLoopPython:match(s) end )
- )
- * P ( "\\end{" .. name .. "}" ) * Ct ( Cc "Close" )
-end
-% \end{macrocode}
-%
-%
-% \bigskip
-% \begin{macrocode}
-if piton_beamer
-then
- Beamer =
- L ( P "\\pause" * ( P "[" * (1 - P "]") ^ 0 * P "]" ) ^ -1 )
- +
- Ct ( Cc "Open"
- * C (
- (
- P "\\uncover" + P "\\only" + P "\\alert" + P "\\visible"
- + P "\\invisible" + P "\\action"
- )
- * ( P "<" * (1 - P ">") ^ 0 * P ">" ) ^ -1
- * P "{"
- )
- * Cc "}"
- )
- * ( C ( BalancedBraces ) / (function (s) return MainLoopPython:match(s) end ) )
- * P "}" * Ct ( Cc "Close" )
- +
- OneBeamerEnvironment "uncoverenv"
- + OneBeamerEnvironment "onlyenv"
- + OneBeamerEnvironment "visibleenv"
- + OneBeamerEnvironment "invisibleenv"
- + OneBeamerEnvironment "alertenv"
- + OneBeamerEnvironment "actionenv"
- +
- L (
-% \end{macrocode}
-% For |\\alt|, the specification of the overlays (between angular brackets) is mandatory.
-% \begin{macrocode}
- ( P "\\alt" )
- * P "<" * (1 - P ">") ^ 0 * P ">"
- * P "{"
- )
- * K ( 'ParseAgain.noCR' , BalancedBraces )
- * L ( P "}{" )
- * K ( 'ParseAgain.noCR' , BalancedBraces )
- * L ( P "}" )
- +
- L (
-% \end{macrocode}
-% For |\\alt|, the specification of the overlays (between angular brackets) is mandatory.
-% \begin{macrocode}
- ( P "\\temporal" )
- * P "<" * (1 - P ">") ^ 0 * P ">"
- * P "{"
- )
- * K ( 'ParseAgain.noCR' , BalancedBraces )
- * L ( P "}{" )
- * K ( 'ParseAgain.noCR' , BalancedBraces )
- * L ( P "}{" )
- * K ( 'ParseAgain.noCR' , BalancedBraces )
- * L ( P "}" )
-% \end{macrocode}
-% Now for the environemnts.
-% \begin{macrocode}
- BeamerBeginEnvironments =
- ( space ^ 0 *
- L
- (
- P "\\begin{" * BeamerNamesEnvironments * "}"
- * ( P "<" * ( 1 - P ">") ^ 0 * P ">" ) ^ -1
- )
- * P "\r"
- ) ^ 0
- BeamerEndEnvironments =
- ( space ^ 0 *
- L ( P "\\end{" * BeamerNamesEnvironments * P "}" )
- * P "\r"
- ) ^ 0
-end
-% \end{macrocode}
-%
-% \bigskip
-% \paragraph{EOL}
-%
-% \bigskip
-% The following LPEG will detect the Python prompts when the user is typesetting
-% an interactive session of Python (directly or through |{pyconsole}| of
-% \pkg{pyluatex}). We have to detect that prompt twice. The first detection
-% (called \emph{hasty detection}) will be before the |\@@_begin_line:| because
-% you want to trigger a special background color for that row (and, after the
-% |\@@_begin_line:|, it's too late to change de background).
-% \begin{macrocode}
-local PromptHastyDetection = ( # ( P ">>>" + P "..." ) * Lc ( '\\@@_prompt:' ) ) ^ -1
-% \end{macrocode}
-% We remind that the marker |#| of \textsc{lpeg} specifies that the pattern will be
-% detected but won't consume any character.
-%
-% \medskip
-% With the following \textsc{lpeg}, a style will actually be applied to the
-% prompt (for instance, it's possible to decide to discard these prompts).
-% \begin{macrocode}
-local Prompt = K ( 'Prompt' , ( ( P ">>>" + P "..." ) * P " " ^ -1 ) ^ -1 )
-% \end{macrocode}
-%
-%
-%
-% \bigskip
-% The following \textsc{lpeg} |EOL| is for the end of lines.
-% \begin{macrocode}
-local EOL =
- P "\r"
- *
- (
- ( space^0 * -1 )
- +
-% \end{macrocode}
-% We recall that each line in the Python code we have to parse will be sent
-% back to LaTeX between a pair |\@@_begin_line:| --
-% |\@@_end_line:|\footnote{Remember that the \texttt{\textbackslash
-% @@\_end\_line:} must be explicit because it will be used as marker in order to
-% delimit the argument of the command \texttt{\textbackslash @@\_begin\_line:}}.
-% \begin{macrocode}
- Ct (
- Cc "EOL"
- *
- Ct (
- Lc "\\@@_end_line:"
- * BeamerEndEnvironments
- * BeamerBeginEnvironments
- * PromptHastyDetection
- * Lc "\\@@_newline: \\@@_begin_line:"
- * Prompt
- )
- )
- )
- *
- SpaceIndentation ^ 0
-% \end{macrocode}
-%
-%
-% \bigskip
-% \paragraph{The long strings}
-%
-%
-% \begin{macrocode}
-local SingleLongString =
- WithStyle ( 'String.Long' ,
- ( Q ( S "fF" * P "'''" )
- * (
- K ( 'String.Interpol' , P "{" )
- * K ( 'Interpol.Inside' , ( 1 - S "}:\r" - P "'''" ) ^ 0 )
- * Q ( P ":" * (1 - S "}:\r" - P "'''" ) ^ 0 ) ^ -1
- * K ( 'String.Interpol' , P "}" )
- +
- Q ( ( 1 - P "'''" - S "{}'\r" ) ^ 1 )
- +
- EOL
- ) ^ 0
- +
- Q ( ( S "rR" ) ^ -1 * P "'''" )
- * (
- Q ( ( 1 - P "'''" - S "\r%" ) ^ 1 )
- +
- PercentInterpol
- +
- P "%"
- +
- EOL
- ) ^ 0
- )
- * Q ( P "'''" ) )
-
-
-local DoubleLongString =
- WithStyle ( 'String.Long' ,
- (
- Q ( S "fF" * P "\"\"\"" )
- * (
- K ( 'String.Interpol', P "{" )
- * K ( 'Interpol.Inside' , ( 1 - S "}:\r" - P "\"\"\"" ) ^ 0 )
- * Q ( P ":" * (1 - S "}:\r" - P "\"\"\"" ) ^ 0 ) ^ -1
- * K ( 'String.Interpol' , P "}" )
- +
- Q ( ( 1 - P "\"\"\"" - S "{}\"\r" ) ^ 1 )
- +
- EOL
- ) ^ 0
- +
- Q ( ( S "rR" ) ^ -1 * P "\"\"\"" )
- * (
- Q ( ( 1 - P "\"\"\"" - S "%\r" ) ^ 1 )
- +
- PercentInterpol
- +
- P "%"
- +
- EOL
- ) ^ 0
- )
- * Q ( P "\"\"\"" )
- )
-% \end{macrocode}
-%
-% \begin{macrocode}
-local LongString = SingleLongString + DoubleLongString
-% \end{macrocode}
-%
-% \bigskip
-% We have a \textsc{lpeg} for the Python docstrings. That \textsc{lpeg} will
-% be used in the \textsc{lpeg} |DefFunction| which deals with the whole preamble
-% of a function definition (which begins with |def|).
-% \begin{macrocode}
-local StringDoc =
- K ( 'String.Doc' , P "\"\"\"" )
- * ( K ( 'String.Doc' , (1 - P "\"\"\"" - P "\r" ) ^ 0 ) * EOL
- * Tab ^ 0
- ) ^ 0
- * K ( 'String.Doc' , ( 1 - P "\"\"\"" - P "\r" ) ^ 0 * P "\"\"\"" )
-% \end{macrocode}
-%
-% \bigskip
-% \paragraph{The comments in the Python listings}
-%
-% We define different \textsc{lpeg} dealing with comments in the Python
-% listings.
-% \begin{macrocode}
-local CommentMath =
- P "$" * K ( 'Comment.Math' , ( 1 - S "$\r" ) ^ 1 ) * P "$"
-
-local Comment =
- WithStyle ( 'Comment' ,
- Q ( P "#" )
- * ( CommentMath + Q ( ( 1 - S "$\r" ) ^ 1 ) ) ^ 0 )
- * ( EOL + -1 )
-% \end{macrocode}
-%
-%
-%
-% \bigskip
-% The following \textsc{lpeg} |CommentLaTeX| is for what is called in that
-% document the ``LaTeX comments''. Since the elements that will be catched must
-% be sent to LaTeX with standard LaTeX catcodes, we put the capture (done by
-% the function~|C|) in a table (by using~|Ct|, which is an alias for |lpeg.Ct|).
-% \begin{macrocode}
-local CommentLaTeX =
- P(piton.comment_latex)
- * Lc "{\\PitonStyle{Comment.LaTeX}{\\ignorespaces"
- * L ( ( 1 - P "\r" ) ^ 0 )
- * Lc "}}"
- * ( EOL + -1 ) -- you could put EOL instead of EOL
-% \end{macrocode}
-%
-% \bigskip
-% \paragraph{DefFunction}
-%
-% The following \textsc{lpeg} |Expression| will be used for the parameters in
-% the \emph{argspec} of a Python function. It's necessary to use a \emph{grammar}
-% because that pattern mainly checks the correct nesting of the delimiters
-% (and it's known in the theory of formal languages that this can't be done with
-% regular expressions \emph{stricto sensu} only).
-% \begin{macrocode}
-local Expression =
- P { "E" ,
- E = ( 1 - S "{}()[]\r," ) ^ 0
- * (
- ( P "{" * V "F" * P "}"
- + P "(" * V "F" * P ")"
- + P "[" * V "F" * P "]" ) * ( 1 - S "{}()[]\r," ) ^ 0
- ) ^ 0 ,
- F = ( 1 - S "{}()[]\r\"'" ) ^ 0
- * ( (
- P "'" * (P "\\'" + 1 - S"'\r" )^0 * P "'"
- + P "\"" * (P "\\\"" + 1 - S"\"\r" )^0 * P "\""
- + P "{" * V "F" * P "}"
- + P "(" * V "F" * P ")"
- + P "[" * V "F" * P "]"
- ) * ( 1 - S "{}()[]\r\"'" ) ^ 0 ) ^ 0 ,
- }
-% \end{macrocode}
-%
-% \bigskip
-% We will now define a \textsc{lpeg} |Params| that will catch the list of
-% parameters (that is to say the \emph{argspec}) in the definition of a Python
-% function. For example, in the line of code
-% \begin{center}
-% \piton{def MyFunction(a,b,x=10,n:int): return n}
-% \end{center}
-% the \textsc{lpeg} |Params| will be used to catch the chunk\enskip |a,b,x=10,n:int|.
-%
-% Or course, a |Params| is simply a comma-separated list of |Param|, and that's
-% why we define first the \textsc{lpeg} |Param|.
-%
-% \medskip
-% \begin{macrocode}
-local Param =
- SkipSpace * Identifier * SkipSpace
- * (
- K ( 'InitialValues' , P "=" * Expression )
- + Q ( P ":" ) * SkipSpace * K ( 'Name.Type' , letter^1 )
- ) ^ -1
-% \end{macrocode}
-%
-% \medskip
-% \begin{macrocode}
-local Params = ( Param * ( Q "," * Param ) ^ 0 ) ^ -1
-% \end{macrocode}
-%
-% \bigskip
-% The following \textsc{lpeg} |DefFunction| catches a keyword |def| and the
-% following name of function \emph{but also everything else until a potential
-% docstring}. That's why this definition of \textsc{lpeg} must occur (in the file
-% |piton.sty|) after the definition of several other \textsc{lpeg} such as
-% |Comment|, |CommentLaTeX|, |Params|, |StringDoc|...
-% \begin{macrocode}
-local DefFunction =
- K ( 'Keyword' , P "def" )
- * Space
- * K ( 'Name.Function.Internal' , identifier )
- * SkipSpace
- * Q ( P "(" ) * Params * Q ( P ")" )
- * SkipSpace
- * ( Q ( P "->" ) * SkipSpace * K ( 'Name.Type' , identifier ) ) ^ -1
-% \end{macrocode}
-% Here, we need a \pkg{piton} style |ParseAgain| which will be linked to
-% |\@@_piton:n| (that means that the capture will be parsed once again by
-% \pkg{piton}). We could avoid that kind of trick by using a non-terminal of a
-% grammar but we have probably here a better legibility.
-% \begin{macrocode}
- * K ( 'ParseAgain' , ( 1 - S ":\r" )^0 )
- * Q ( P ":" )
- * ( SkipSpace
- * ( EOL + CommentLaTeX + Comment ) -- in all cases, that contains an EOL
- * Tab ^ 0
- * SkipSpace
- * StringDoc ^ 0 -- there may be additionnal docstrings
- ) ^ -1
-% \end{macrocode}
-% Remark that, in the previous code, |CommentLaTeX| \emph{must} appear
-% before |Comment|: there is no commutativity of the addition for the
-% \emph{parsing expression grammars} (\textsc{peg}).
-%
-% \smallskip
-% If the word |def| is not followed by an identifier and parenthesis, it will be
-% catched as keyword by the \textsc{lpeg} |Keyword| (useful if, for example, the
-% final user wants to speak of the keyword \piton{def}).
-%
-% \bigskip
-% \paragraph{The dictionaries of Python}
-%
-% We have \textsc{lpeg} dealing with dictionaries of Python because, in
-% typesettings of explicit Python dictionaries, one may prefer to have all the
-% values formatted in black (in order to see more clearly the keys which are
-% usually Python strings). That's why we have a \pkg{piton} style |Dict.Value|.
-%
-% The initial value of that \pkg{piton} style is |\@@_piton:n|, which means that
-% the value of the entry of the dictionary is parsed once again by \pkg{piton}
-% (and nothing special is done for the dictionary). In the following example, we
-% have set the \pkg{piton} style |Dict.Value| to |\color{black}|:
-%
-% \medskip
-% \begingroup
-% \SetPitonStyle{Dict.Value = \color{black}}
-% \piton{mydict = { 'name' : 'Paul', 'sex' : 'male', 'age' : 31 } }
-% \endgroup
-%
-% \medskip
-% At this time, this mechanism works only for explicit dictionaries on a single line!
-%
-% \begin{macrocode}
-local ItemDict =
- ShortString * SkipSpace * Q ( P ":" ) * K ( 'Dict.Value' , Expression )
-
-local ItemOfSet = SkipSpace * ( ItemDict + ShortString ) * SkipSpace
-
-local Set =
- Q ( P "{" )
- * ItemOfSet * ( Q ( P "," ) * ItemOfSet ) ^ 0
- * Q ( P "}" )
-% \end{macrocode}
-%
-% \paragraph{Miscellaneous}
-%
-% \begin{macrocode}
-local ExceptionInConsole = Exception * Q ( ( 1 - P "\r" ) ^ 0 ) * EOL
-% \end{macrocode}
-%
-%
-% \bigskip
-% \paragraph{The main LPEG}
-%
-% First, the main loop :
-% \begin{macrocode}
-MainLoopPython =
- ( ( space^1 * -1 )
- + EOL
- + Space
- + Tab
- + Escape
- + CommentLaTeX
- + Beamer
- + UserCommands
- + LongString
- + Comment
- + ExceptionInConsole
- + Set
- + Delim
-% \end{macrocode}
-% |Operator| must be before |Punct|.
-% \begin{macrocode}
- + Operator
- + ShortString
- + Punct
- + FromImport
- + RaiseException
- + DefFunction
- + DefClass
- + Keyword * ( Space + Punct + Delim + EOL+ -1 )
- + Decorator
- + OperatorWord * ( Space + Punct + Delim + EOL+ -1 )
- + Builtin * ( Space + Punct + Delim + EOL+ -1 )
- + Identifier
- + Number
- + Word
- ) ^ 0
-% \end{macrocode}
-%
-% \bigskip
-% We recall that each line in the Python code to parse will be sent back to
-% LaTeX between a pair |\@@_begin_line:| -- |\@@_end_line:|\footnote{Remember
-% that the \texttt{\textbackslash @@\_end\_line:} must be explicit because it
-% will be used as marker in order to delimit the argument of the command
-% \texttt{\textbackslash @@\_begin\_line:}}.
-% \begin{macrocode}
-local python = P ( true )
-
-python =
- Ct (
- ( ( space - P "\r" ) ^0 * P "\r" ) ^ -1
- * BeamerBeginEnvironments
- * PromptHastyDetection
- * Lc '\\@@_begin_line:'
- * Prompt
- * SpaceIndentation ^ 0
- * MainLoopPython
- * -1
- * Lc '\\@@_end_line:'
- )
-% \end{macrocode}
-%
-% \begin{macrocode}
-local languages = { }
-languages['python'] = python
-% \end{macrocode}
-%
-% % \bigskip
-% \subsubsection{The LPEG ocaml}
-%
-% \begin{macrocode}
-local Delim = Q ( P "[|" + P "|]" + S "[()]" )
-% \end{macrocode}
-%
-% \begin{macrocode}
-local Punct = Q ( S ",:;!" )
-% \end{macrocode}
-%
-% \begin{macrocode}
-local identifier =
- ( R "az" + R "AZ" + P "_") * ( R "az" + R "AZ" + S "_'" + digit ) ^ 0
-
-local Identifier = K ( 'Identifier' , identifier )
-
-local Operator =
- K ( 'Operator' ,
- P "!=" + P "<>" + P "==" + P "<<" + P ">>" + P "<=" + P ">=" + P ":="
- + P "||" + P "&&" + P "//" + P "**" + P ";;" + P "::" + P "->"
- + P "+." + P "-." + P "*." + P "/."
- + S "-~+/*%=<>&@|"
- )
-
-local OperatorWord =
- K ( 'Operator.Word' ,
- P "and" + P "asr" + P "land" + P "lor" + P "lsl" + P "lxor"
- + P "mod" + P "or" )
-
-local Keyword =
- K ( 'Keyword' ,
- P "as" + P "assert" + P "begin" + P "class" + P "constraint" + P "done"
- + P "do" + P "downto" + P "else" + P "end" + P "exception" + P "external"
- + P "false" + P "for" + P "function" + P "fun" + P "functor" + P "if"
- + P "in" + P "include" + P "inherit" + P "initializer" + P "lazy" + P "let"
- + P "match" + P "method" + P "module" + P "mutable" + P "new" + P "object"
- + P "of" + P "open" + P "private" + P "raise" + P "rec" + P "sig"
- + P "struct" + P "then" + P "to" + P "true" + P "try" + P "type"
- + P "value" + P "val" + P "virtual" + P "when" + P "while" + P "with" )
- + K ( 'Keyword.Constant' , P "true" + P "false" )
-
-
-local Builtin =
- K ( 'Name.Builtin' ,
- P "not" + P "incr" + P "decr" + P "fst" + P "snd"
- + P "String.length"
- + P "List.tl" + P "List.hd" + P "List.mem" + P "List.exists"
- + P "List.for_all" + P "List.filter" + P "List.length" + P "List.map"
- + P "List.iter"
- + P "Array.length" + P "Array.make" + P "Array.make_matrix"
- + P "Array.init" + P "Array.copy" + P "Array.copy" + P "Array.mem"
- + P "Array.exists" + P "Array.for_all" + P "Array.map" + P "Array.iter"
- + P "Queue.create" + P "Queue.is_empty" + P "Queue.push" + P "Queue.pop"
- + P "Stack.create" + P "Stack.is_empty" + P "Stack.push" + P "Stack.pop"
- + P "Hashtbl.create" + P "Hashtbl.add" + P "Hashtbl.remove"
- + P "Hashtbl.mem" + P "Hashtbl.find" + P "Hashtbl.find_opt"
- + P "Hashtbl.iter" )
-% \end{macrocode}
-%
-% \bigskip
-% The following exceptions are exceptions in the standard library of OCaml (Stdlib).
-% \begin{macrocode}
-local Exception =
- K ( 'Exception' ,
- P "Division_by_zero" + P "End_of_File" + P "Failure"
- + P "Invalid_argument" + P "Match_failure" + P "Not_found"
- + P "Out_of_memory" + P "Stack_overflow" + P "Sys_blocked_io"
- + P "Sys_error" + P "Undefined_recursive_module" )
-% \end{macrocode}
-%
-% \bigskip
-% \paragraph{The characters in OCaml}
-%
-% \begin{macrocode}
-local Char =
- K ( 'String.Short' , P "'" * ( ( 1 - P "'" ) ^ 0 + P "\\'" ) * P "'" )
-% \end{macrocode}
-%
-%
-% \bigskip
-% \paragraph{Beamer}
-%
-% \begin{macrocode}
-local BalancedBraces =
- P { "E" ,
- E =
- (
- P "{" * V "E" * P "}"
- +
- P "\"" * ( 1 - S "\"" ) ^ 0 * P "\"" -- OCaml strings
- +
- ( 1 - S "{}" )
- ) ^ 0
- }
-% \end{macrocode}
-%
-%
-% \begin{macrocode}
-if piton_beamer
-then
- Beamer =
- L ( P "\\pause" * ( P "[" * (1 - P "]") ^ 0 * P "]" ) ^ -1 )
- +
- ( P "\\uncover" * Lc ( '\\@@_beamer_command:n{uncover}' )
- + P "\\only" * Lc ( '\\@@_beamer_command:n{only}' )
- + P "\\alert" * Lc ( '\\@@_beamer_command:n{alert}' )
- + P "\\visible" * Lc ( '\\@@_beamer_command:n{visible}' )
- + P "\\invisible" * Lc ( '\\@@_beamer_command:n{invisible}' )
- + P "\\action" * Lc ( '\\@@_beamer_command:n{action}' )
- )
- *
- L ( ( P "<" * (1 - P ">") ^ 0 * P ">" ) ^ -1 * P "{" )
- * K ( 'ParseAgain.noCR' , BalancedBraces )
- * L ( P "}" )
- +
- L (
- ( P "\\alt" )
- * P "<" * (1 - P ">") ^ 0 * P ">"
- * P "{"
- )
- * K ( 'ParseAgain.noCR' , BalancedBraces )
- * L ( P "}{" )
- * K ( 'ParseAgain.noCR' , BalancedBraces )
- * L ( P "}" )
- +
- L (
- ( P "\\temporal" )
- * P "<" * (1 - P ">") ^ 0 * P ">"
- * P "{"
- )
- * K ( 'ParseAgain.noCR' , BalancedBraces )
- * L ( P "}{" )
- * K ( 'ParseAgain.noCR' , BalancedBraces )
- * L ( P "}{" )
- * K ( 'ParseAgain.noCR' , BalancedBraces )
- * L ( P "}" )
- BeamerBeginEnvironments =
- ( space ^ 0 *
- L
- (
- P "\\begin{" * BeamerNamesEnvironments * "}"
- * ( P "<" * ( 1 - P ">") ^ 0 * P ">" ) ^ -1
- )
- * P "\r"
- ) ^ 0
- BeamerEndEnvironments =
- ( space ^ 0 *
- L ( P "\\end{" * BeamerNamesEnvironments * P "}" )
- * P "\r"
- ) ^ 0
-end
-% \end{macrocode}
-%
-% \bigskip
-% \paragraph{EOL}
-% \begin{macrocode}
-local EOL =
- P "\r"
- *
- (
- ( space^0 * -1 )
- +
- Ct (
- Cc "EOL"
- *
- Ct (
- Lc "\\@@_end_line:"
- * BeamerEndEnvironments
- * BeamerBeginEnvironments
- * PromptHastyDetection
- * Lc "\\@@_newline: \\@@_begin_line:"
- * Prompt
- )
- )
- )
- *
- SpaceIndentation ^ 0
-% \end{macrocode}
-%
-%
-% \begin{macrocode}
-%
-% \paragraph{The strings}
-%
-% We need a pattern |string| without captures because it will be used within the
-% comments of OCaml.
-% \begin{macrocode}
-local string =
- Q ( P "\"" )
- * (
- VisualSpace
- +
- Q ( ( 1 - S " \"\r" ) ^ 1 )
- +
- EOL
- ) ^ 0
- * Q ( P "\"" )
-% \end{macrocode}
-%
-% \begin{macrocode}
-local String = WithStyle ( 'String.Long' , string )
-% \end{macrocode}
-%
-%
-% \bigskip
-% Now, the ``quoted strings'' of OCaml (for example \verb+{ext|Essai|ext}+).
-%
-% For those strings, we will do two consecutive analysis. First an analysis to
-% determine the whole string and, then, an analysis for the potential visual
-% spaces and the EOL in the string.
-%
-% The first analysis require a match-time capture. For explanations about that
-% programmation, see the paragraphe \emph{Lua's long % strings} in
-% |www.inf.puc-rio.br/~roberto/lpeg|.
-% \begin{macrocode}
-local ext = ( R "az" + P "_" ) ^ 0
-local open = "{" * Cg(ext, 'init') * "|"
-local close = "|" * C(ext) * "}"
-local closeeq =
- Cmt ( close * Cb('init'),
- function (s, i, a, b) return a==b end )
-% \end{macrocode}
-%
-% \medskip
-% The \textsc{lpeg} |QuotedStringBis| will do the second analysis.
-% \begin{macrocode}
-local QuotedStringBis =
- WithStyle ( 'String.Long' ,
- (
- VisualSpace
- +
- Q ( ( 1 - S " \r" ) ^ 1 )
- +
- EOL
- ) ^ 0 )
-
-% \end{macrocode}
-%
-% \medskip
-% We use a ``function capture'' (as called in the official documentation of the
-% \textsc{lpeg}) in order to do the second analysis on the result of the first one.
-% \begin{macrocode}
-local QuotedString =
- C ( open * ( 1 - closeeq ) ^ 0 * close ) /
- ( function (s) return QuotedStringBis : match(s) end )
-% \end{macrocode}
-%
-%
-% \bigskip
-% \paragraph{The comments in the OCaml listings}
-%
-% In OCaml, the delimiters for the comments are |(*| and |*)|. There are
-% unsymmetrical and, therefore, the comments may be nested. That's why we need a
-% grammar.
-%
-% In these comments, we embed the math comments (between |$| and |$|) and we
-% embed also a treatment for the end of lines (since the comments may be multi-lines).
-%
-% \begin{macrocode}
-local Comment =
- WithStyle ( 'Comment' ,
- P {
- "A" ,
- A = Q "(*"
- * ( V "A"
- + Q ( ( 1 - P "(*" - P "*)" - S "\r$\"" ) ^ 1 ) -- $
- + string
- + P "$" * K ( 'Comment.Math' , ( 1 - S "$\r" ) ^ 1 ) * P "$" -- $
- + EOL
- ) ^ 0
- * Q "*)"
- } )
-% \end{macrocode}
-%
-% \bigskip
-% \paragraph{The DefFunction}
-%
-% \begin{macrocode}
-local DefFunction =
- K ( 'Keyword' , P "let rec" + P "let" + P "and" )
- * Space
- * K ( 'Name.Function.Internal' , identifier )
- * Space
- * # ( P "=" * space * P "function" + ( 1 - P "=" ) )
-% \end{macrocode}
-%
-% \bigskip
-% \paragraph{The parameters of the types}
-%
-% \begin{macrocode}
-local TypeParameter = K ( 'TypeParameter' , P "'" * alpha * # ( 1 - P "'" ) )
-% \end{macrocode}
-%
-% \bigskip
-% \paragraph{The main LPEG}
-%
-% First, the main loop :
-% \begin{macrocode}
-MainLoopOCaml =
- ( ( space^1 * -1 )
- + EOL
- + Space
- + Tab
- + Escape
- + Beamer
- + TypeParameter
- + String + QuotedString + Char
- + Comment
- + Delim
- + Operator
- + Punct
- + FromImport
- + ImportAs
- + Exception
- + DefFunction
- + Keyword * ( Space + Punct + Delim + EOL + -1 )
- + OperatorWord * ( Space + Punct + Delim + EOL + -1 )
- + Builtin * ( Space + Punct + Delim + EOL + -1 )
- + Identifier
- + Number
- + Word
- ) ^ 0
-% \end{macrocode}
-%
-% \bigskip
-% We recall that each line in the Python code to parse will be sent back to
-% LaTeX between a pair |\@@_begin_line:| -- |\@@_end_line:|\footnote{Remember
-% that the \texttt{\textbackslash @@\_end\_line:} must be explicit because it
-% will be used as marker in order to delimit the argument of the command
-% \texttt{\textbackslash @@\_begin\_line:}}.
-% \begin{macrocode}
-local ocaml = P ( true )
-
-ocaml =
- Ct (
- ( ( space - P "\r" ) ^0 * P "\r" ) ^ -1
- * BeamerBeginEnvironments
- * Lc ( '\\@@_begin_line:' )
- * SpaceIndentation ^ 0
- * MainLoopOCaml
- * -1
- * Lc ( '\\@@_end_line:' )
- )
-% \end{macrocode}
-%
-% \begin{macrocode}
-languages['ocaml'] = ocaml
-% \end{macrocode}
-%
-% \bigskip
-% \subsubsection{The function Parse}
-%
-%
-% The function |Parse| is the main function of the package \pkg{piton}.
-% It parses its argument and sends back to LaTeX the code with interlaced
-% formatting LaTeX instructions. In fact, everything is done by the
-% \textsc{lpeg} |python| which returns as capture a Lua table containing
-% data to send to LaTeX.
-%
-% \bigskip
-% \begin{macrocode}
-function piton.Parse(language,code)
- local t = languages[language] : match ( code )
- local left_stack = {}
- local right_stack = {}
- for _ , one_item in ipairs(t)
- do
- if one_item[1] == "EOL"
- then
- for _ , s in ipairs(right_stack)
- do tex.sprint( s )
- end
- for _ , s in ipairs(one_item[2])
- do tex.tprint(s)
- end
- for _ , s in ipairs(left_stack)
- do tex.sprint( s )
- end
- else
- if one_item[1] == "Open"
- then
- tex.sprint( one_item[2] )
- table.insert(left_stack,one_item[2])
- table.insert(right_stack,one_item[3])
- else
- if one_item[1] == "Close"
- then
- tex.sprint( right_stack[#right_stack] )
- left_stack[#left_stack] = nil
- right_stack[#right_stack] = nil
- else
- tex.tprint(one_item)
- end
- end
- end
- end
-end
-% \end{macrocode}
-%
-%
-%
-% \bigskip
-% The function |ParseFile| will be used by the LaTeX command |\PitonInputFile|.
-% That function merely reads the whole file (that is to say all its lines) and
-% then apply the function~|Parse| to the resulting Lua string.
-% \begin{macrocode}
-function piton.ParseFile(language,name,first_line,last_line)
- s = ''
- local i = 0
- for line in io.lines(name)
- do i = i + 1
- if i >= first_line
- then s = s .. '\r' .. line
- end
- if i >= last_line then break end
- end
- piton.Parse(language,s)
-end
-% \end{macrocode}
-%
-% \bigskip
-% \subsubsection{Two variants of the function Parse with integrated preprocessors}
-%
-% The following command will be used by the user command |\piton|.
-% For that command, we have to undo the duplication of the symbols |#|.
-% \begin{macrocode}
-function piton.ParseBis(language,code)
- local s = ( Cs ( ( P '##' / '#' + 1 ) ^ 0 ) ) : match ( code )
- return piton.Parse(language,s)
-end
-% \end{macrocode}
-%
-% \bigskip
-% The following command will be used when we have to parse some small chunks of
-% code that have yet been parsed. They are re-scanned by LaTeX because it has
-% been required by |\@@_piton:n| in the \pkg{piton} style of the syntaxic
-% element. In that case, you have to remove the potential |\@@_breakable_space:|
-% that have been inserted when the key |break-lines| is in force.
-% \begin{macrocode}
-function piton.ParseTer(language,code)
- local s = ( Cs ( ( P '\\@@_breakable_space:' / ' ' + 1 ) ^ 0 ) )
- : match ( code )
- return piton.Parse(language,s)
-end
-% \end{macrocode}
-%
-%
-% \bigskip
-% \subsubsection{Preprocessors of the function Parse for gobble}
-%
-% We deal now with preprocessors of the function |Parse| which are needed when
-% the ``gobble mechanism'' is used.
-%
-%
-% \bigskip
-% The function |gobble| gobbles $n$ characters on the left of the code. It uses
-% a \textsc{lpeg} that we have to compute dynamically because if depends on the
-% value of~$n$.
-% \begin{macrocode}
-local function gobble(n,code)
- function concat(acc,new_value)
- return acc .. new_value
- end
- if n==0
- then return code
- else
- return Cf (
- Cc ( "" ) *
- ( 1 - P "\r" ) ^ (-n) * C ( ( 1 - P "\r" ) ^ 0 )
- * ( C ( P "\r" )
- * ( 1 - P "\r" ) ^ (-n)
- * C ( ( 1 - P "\r" ) ^ 0 )
- ) ^ 0 ,
- concat
- ) : match ( code )
- end
-end
-% \end{macrocode}
-%
-%
-%
-% \bigskip
-% The following function |add| will be used in the following \textsc{lpeg}
-% |AutoGobbleLPEG|, |TabsAutoGobbleLPEG| and |EnvGobbleLPEG|.
-% \begin{macrocode}
-local function add(acc,new_value)
- return acc + new_value
-end
-% \end{macrocode}
-%
-% \bigskip
-% The following \textsc{lpeg} returns as capture the minimal number of spaces at
-% the beginning of the lines of code. The main work is done by two \emph{fold
-% captures} (|lpeg.Cf|), one using |add| and the other (encompassing the
-% previous one) using |math.min| as folding operator.
-% \begin{macrocode}
-local AutoGobbleLPEG =
- ( space ^ 0 * P "\r" ) ^ -1
- * Cf (
- (
-% \end{macrocode}
-% We don't take into account the empty lines (with only spaces).
-% \begin{macrocode}
- ( P " " ) ^ 0 * P "\r"
- +
- Cf ( Cc(0) * ( P " " * Cc(1) ) ^ 0 , add )
- * ( 1 - P " " ) * ( 1 - P "\r" ) ^ 0 * P "\r"
- ) ^ 0
-% \end{macrocode}
-% Now for the last line of the Python code...
-% \begin{macrocode}
- *
- ( Cf ( Cc(0) * ( P " " * Cc(1) ) ^ 0 , add )
- * ( 1 - P " " ) * ( 1 - P "\r" ) ^ 0 ) ^ -1 ,
- math.min
- )
-% \end{macrocode}
-%
-% \bigskip
-% The following \textsc{lpeg} is similar but works with the indentations.
-% \begin{macrocode}
-local TabsAutoGobbleLPEG =
- ( space ^ 0 * P "\r" ) ^ -1
- * Cf (
- (
- ( P "\t" ) ^ 0 * P "\r"
- +
- Cf ( Cc(0) * ( P "\t" * Cc(1) ) ^ 0 , add )
- * ( 1 - P "\t" ) * ( 1 - P "\r" ) ^ 0 * P "\r"
- ) ^ 0
- *
- ( Cf ( Cc(0) * ( P "\t" * Cc(1) ) ^ 0 , add )
- * ( 1 - P "\t" ) * ( 1 - P "\r" ) ^ 0 ) ^ -1 ,
- math.min
- )
-% \end{macrocode}
-%
-%
-%
-% \bigskip
-% The following \textsc{lpeg} returns as capture the number of spaces at the
-% last line, that is to say before the |\end{Piton}| (and usually it's also the
-% number of spaces before the corresponding |\begin{Piton}| because that's the
-% traditionnal way to indent in LaTeX). The main work is done by a \emph{fold
-% capture} (|lpeg.Cf|) using the function |add| as folding operator.
-% \begin{macrocode}
-local EnvGobbleLPEG =
- ( ( 1 - P "\r" ) ^ 0 * P "\r" ) ^ 0
- * Cf ( Cc(0) * ( P " " * Cc(1) ) ^ 0 , add ) * -1
-% \end{macrocode}
-%
-% \bigskip
-% \begin{macrocode}
-function piton.GobbleParse(language,n,code)
- if n==-1
- then n = AutoGobbleLPEG : match(code)
- else if n==-2
- then n = EnvGobbleLPEG : match(code)
- else if n==-3
- then n = TabsAutoGobbleLPEG : match(code)
- end
- end
- end
- piton.Parse(language,gobble(n,code))
-end
-% \end{macrocode}
-%
-% \bigskip
-% \subsubsection{To count the number of lines}
-%
-% \medskip
-% \begin{macrocode}
-function piton.CountLines(code)
- local count = 0
- for i in code : gmatch ( "\r" ) do count = count + 1 end
- tex.sprint(
- luatexbase.catcodetables.expl ,
- '\\int_set:Nn \\l_@@_nb_lines_int {' .. count .. '}' )
-end
-% \end{macrocode}
-%
-% \begin{macrocode}
-function piton.CountNonEmptyLines(code)
- local count = 0
- count =
- ( Cf ( Cc(0) *
- (
- ( P " " ) ^ 0 * P "\r"
- + ( 1 - P "\r" ) ^ 0 * P "\r" * Cc(1)
- ) ^ 0
- * (1 - P "\r" ) ^ 0 ,
- add
- ) * -1 ) : match (code)
- tex.sprint(
- luatexbase.catcodetables.expl ,
- '\\int_set:Nn \\l_@@_nb_non_empty_lines_int {' .. count .. '}' )
-end
-% \end{macrocode}
-%
-% \bigskip
-% \begin{macrocode}
-function piton.CountLinesFile(name)
- local count = 0
- for line in io.lines(name) do count = count + 1 end
- tex.sprint(
- luatexbase.catcodetables.expl ,
- '\\int_set:Nn \\l_@@_nb_lines_int {' .. count .. '}' )
-end
-% \end{macrocode}
-%
-%
-% \bigskip
-% \begin{macrocode}
-function piton.CountNonEmptyLinesFile(name)
- local count = 0
- for line in io.lines(name)
- do if not ( ( ( P " " ) ^ 0 * -1 ) : match ( line ) )
- then count = count + 1
- end
- end
- tex.sprint(
- luatexbase.catcodetables.expl ,
- '\\int_set:Nn \\l_@@_nb_non_empty_lines_int {' .. count .. '}' )
-end
-% \end{macrocode}
-%
-% \begin{macrocode}
-\end{luacode*}
-% \end{macrocode}
-%
-%
-% \vspace{1cm}
-% \section{History}
-%
-% % \subsection*{Changes between versions 1.4 and 1.5}
-%
-% New key |numbers-sep|.
-%
-%
-% \subsection*{Changes between versions 1.3 and 1.4}
-%
-% New key |identifiers| in |\PitonOptions|.
-%
-% New command |\PitonStyle|.
-%
-% |background-color| now accepts as value a \emph{list} of colors.
-%
-% \subsection*{Changes between versions 1.2 and 1.3}
-%
-% When the class Beamer is used, the environment |{Piton}| and the command
-% |\PitonInputFile| are ``overlay-aware'' (that is to say, they accept a
-% specification of overlays between angular brackets).
-%
-% New key |prompt-background-color|
-%
-% It's now possible to use the command |\label| to reference a line of code in
-% an environment |{Piton}|.
-%
-% A new command |\|⣠is available in the argument of the command |\piton{...}| to
-% insert a space (otherwise, several spaces are replaced by a single space).
-%
-% \subsection*{Changes between versions 1.1 and 1.2}
-%
-% New keys |break-lines-in-piton| and |break-lines-in-Piton|.
-%
-% New key |show-spaces-in-string| and modification of the key |show-spaces|.
-%
-% When the class \cls{beamer} is used, the environements |{uncoverenv}|,
-% |{onlyenv}|, |{visibleenv}| and |{invisibleenv}|
-%
-%
-% \subsection*{Changes between versions 1.0 and 1.1}
-%
-% The extension \pkg{piton} detects the class \cls{beamer} and activates the
-% commands |\action|, |\alert|, |\invisible|, |\only|, |\uncover| and |\visible|
-% in the environments |{Piton}| when the class \cls{beamer} is used.
-%
-% \subsection*{Changes between versions 0.99 and 1.0}
-%
-% New key |tabs-auto-gobble|.
-%
-% \subsection*{Changes between versions 0.95 and 0.99}
-%
-% New key |break-lines| to allow breaks of the lines of code (and other keys to
-% customize the appearance).
-%
-% \subsection*{Changes between versions 0.9 and 0.95}
-%
-% New key |show-spaces|.
-%
-% The key |left-margin| now accepts the special value |auto|.
-%
-% New key |latex-comment| at load-time and replacement of |##| by |#>|
-%
-% New key |math-comments| at load-time.
-%
-% New keys |first-line| and |last-line| for the command |\InputPitonFile|.
-%
-% \subsection*{Changes between versions 0.8 and 0.9}
-%
-% New key |tab-size|.
-%
-% Integer value for the key |splittable|.
-%
-% \subsection*{Changes between versions 0.7 and 0.8}
-%
-% New keys |footnote| and |footnotehyper| at load-time.
-%
-% New key |left-margin|.
-%
-% \subsection*{Changes between versions 0.6 and 0.7}
-%
-% New keys |resume|, |splittable| and |background-color| in |\PitonOptions|.
-%
-% The file |piton.lua| has been embedded in the file |piton.sty|. That means
-% that the extension \pkg{piton} is now entirely contained in the file |piton.sty|.
-%
-%
-%
-% \tableofcontents
-%
-% \end{document}
-%
-%
-% Local Variables:
-% TeX-fold-mode: t
-% TeX-fold-preserve-comments: nil
-% flyspell-mode: nil
-% fill-column: 80
-% End:
-
-
-
-
-
-
+% \iffalse -*- coding: utf-8 ; -*- \fi \iffalse meta-comment
+%
+% Copyright (C) 2023 by F. Pantigny
+% -----------------------------------
+%
+% This file may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3
+% of this license or (at your option) any later version.
+% The latest version of this license is in:
+%
+% http://www.latex-project.org/lppl.txt
+%
+% and version 1.3 or later is part of all distributions of LaTeX
+% version 2005/12/01 or later.
+%
+% \fi
+% \iffalse
+\def\myfileversion{1.5a}
+\def\myfiledate{2023/04/11}
+%
+%
+%<*batchfile>
+\begingroup
+\input l3docstrip.tex
+\keepsilent
+\usedir{tex/latex/cascade}
+\preamble
+
+Copyright (C) 2022-2023 by F. Pantigny
+-----------------------------------
+
+This file may be distributed and/or modified under the
+conditions of the LaTeX Project Public License, either version 1.3
+of this license or (at your option) any later version.
+The latest version of this license is in:
+
+http://www.latex-project.org/lppl.txt
+
+and version 1.3 or later is part of all distributions of LaTeX
+version 2005/12/01 or later.
+
+\endpreamble
+\askforoverwritefalse
+\endgroup
+%</batchfile>
+%
+%<@@=piton>
+%<*driver>
+\documentclass{l3doc}
+\usepackage{geometry}
+\geometry{left=2.8cm,right=2.8cm,top=2.5cm,bottom=2.5cm,papersize={21cm,29.7cm}}
+\usepackage{fontspec}
+\usepackage[dvipsnames]{xcolor}
+\usepackage{caption,tabularx,tcolorbox,luacolor,lua-ul}
+\def\emphase{\bgroup\color{RoyalPurple}\let\next=}
+\fvset{commandchars=\~\#\@,formatcom=\color{gray}}
+\captionsetup{labelfont = bf}
+\usepackage{ragged2e}
+\usepackage[footnotehyper,escape-inside=$$,math-comments]{piton} % $$
+
+\parindent 0pt
+\skip\footins = 2\bigskipamount
+
+\PitonOptions{gobble=2}
+
+\EnableCrossrefs
+
+\begin{document}
+\DocInput{piton.dtx}
+\end{document}
+%</driver>
+% \fi
+%
+% \catcode`\" = 11
+%
+% \title{The package \pkg{piton}\thanks{This document corresponds to the
+% version~\myfileversion\space of \pkg{piton}, at the date of~\myfiledate.}}
+% \author{F. Pantigny \\ \texttt{fpantigny@wanadoo.fr}}
+%
+% \maketitle
+%
+% \begin{abstract}
+% The package \pkg{piton} provides tools to typeset Python listings with
+% syntactic highlighting by using the Lua library LPEG. It requires LuaLaTeX.
+% \end{abstract}
+%
+%
+%
+% \section{Presentation}
+%
+%
+% The package \pkg{piton} uses the Lua library LPEG\footnote{LPEG is a
+% pattern-matching library for Lua, written in C, based on \emph{parsing
+% expression grammars}: \url{http://www.inf.puc-rio.br/~roberto/lpeg/}} for
+% parsing Python listings and typeset them with syntactic highlighting. Since it
+% uses Lua code, it works with |lualatex| only (and won't work with the other
+% engines: |latex|, |pdflatex| and |xelatex|). It does not use external program
+% and the compilation does not require |--shell-escape|. The compilation is very
+% fast since all the parsing is done by the library LPEG, written in C.
+%
+% \bigskip
+% Here is an example of code typeset by \pkg{piton}, with the environment |{Piton}|.
+%
+% \bigskip
+%
+% \begin{Piton}
+% from math import pi
+%
+% def arctan(x,n=10):
+% """Compute the mathematical value of arctan(x)
+%
+% n is the number of terms in the sum
+% """
+% if x < 0:
+% return -arctan(-x) # recursive call
+% elif x > 1:
+% return pi/2 - arctan(1/x)
+% #> (we have used that $\arctan(x)+\arctan(1/x)=\frac{\pi}{2}$ for $x>0$)\footnote{This LaTeX escape has been done by beginning the comment by \ttfamily\#>.}
+% else:
+% s = 0
+% for k in range(n):
+% s += (-1)**k/(2*k+1)*x**(2*k+1)
+% return s
+% \end{Piton}
+%
+%
+% \bigskip
+% The package \pkg{piton} is entirely contained in the file
+% |piton.sty|. This file may be put in the current directory or in a
+% |texmf| tree. However, the best is to install \pkg{piton} with a TeX
+% distribution such as MiKTeX, TeX Live or MacTeX.
+%
+%
+% \section{Use of the package}
+%
+%
+% \subsection{Loading the package}
+%
+% The package \pkg{piton} should be loaded with the classical command
+% |\usepackage|: |\usepackage{piton}|.
+%
+% \smallskip
+% Nevertheless, we have two remarks:
+% \begin{itemize}
+% \item the package \pkg{piton} uses the package \pkg{xcolor} (but \pkg{piton}
+% does \emph{not} load \pkg{xcolor}: if \pkg{xcolor} is not loaded before the
+% |\begin{document}|, a fatal error will be raised).
+% \item the package \pkg{piton} must be used with LuaLaTeX exclusively: if
+% another LaTeX engine (|latex|, |pdflatex|, |xelatex|,\dots ) is used, a
+% fatal error will be raised.
+% \end{itemize}
+%
+% \subsection{The tools provided to the user}
+%
+% The package \pkg{piton} provides several tools to typeset Python code: the
+% command |\piton|, the environment |{Piton}| and the command |\PitonInputFile|.
+%
+% \begin{itemize}\setlength{\fboxsep}{1pt}
+% \item The command \colorbox{gray!20}{\texttt\textbackslash piton} should be
+% used to typeset small pieces of code inside a paragraph. For example:
+%
+% {\color{gray}\verb|\piton{def square(x): return x*x}|}\qquad
+% \piton{def square(x): return x*x}
+%
+% The syntax and particularities of the command |\piton| are detailed below.
+%
+% \item The environment \colorbox{gray!20}{\ttfamily\{Piton\}} should be used to
+% typeset multi-lines code. Since it takes its argument in a verbatim mode, it
+% can't be used within the argument of a LaTeX command. For sake of
+% customization, it's possible to define new environments similar to the
+% environment |{Piton}| with the command |\NewPitonEnvironment|:
+% cf.~\ref{NewPitonEnvironment} p.~\pageref{NewPitonEnvironment}.
+%
+% \item The command \colorbox{gray!20}{\ttfamily\textbackslash PitonInputFile}
+% is used to insert and typeset a whole external file.
+%
+% That command takes in as optional argument (between square brackets) two keys
+% |first-line| and |last-line|: only the part between the corresponding lines
+% will be inserted.
+% \end{itemize}
+%
+% \subsection{The syntax of the command \textbackslash piton}
+%
+% In fact, the command |\piton| is provided with a double syntax. It may be used
+% as a standard command of LaTeX taking its argument between curly braces
+% (|\piton{...}|) but it may also be used with a syntax similar to the syntax of
+% the command
+% |\verb|, that is to say with the argument delimited by two identical characters (e.g.: \verb!\piton|...|!).
+%
+% \begin{itemize}
+% \item {\color{blue} \textsf{Syntax} \verb|\piton{...}|}\par\nobreak
+% When its argument is given between curly braces, the command |\piton| does not
+% take its argument in verbatim mode. In particular:
+% \begin{itemize}
+% \item several consecutive spaces will be replaced by only one space,
+%
+% {\color{cyan} but the command |\|⣠is provided to force the insertion of a space};
+%
+% \item it's not possible to use |%| inside the argument,
+%
+% {\color{cyan} but the command |\%| is provided to insert a |%|};
+%
+% \item the braces must be appear by pairs correctly nested
+%
+% {\color{cyan} but the commands |\{| and |\}| are also provided for individual braces};
+%
+% \item the LaTeX commands\footnote{That concerns the commands beginning with a
+% backslash but also the active characters.} are fully expanded and not
+% executed,
+%
+% {\color{cyan} so it's possible to use |\\| to insert a backslash}.
+% \end{itemize}
+%
+%
+% The other characters (including |#|, |^|, |_|, |&|, |$| and |@|)
+% must be inserted without backslash.
+%
+% \bigskip
+%\begin{tabular}{>{\color{gray}}w{l}{75mm}@{\hspace*{1cm}}l}
+% \omit Examples : \hfil \\
+% \noalign{\vskip1mm}
+% \verb|\piton{MyString = '\\n'}| &
+% \piton{MyString = '\\n'} \\
+% \verb|\piton{def even(n): return n\%2==0}| &
+% \piton{def even(n): return n\%2==0} \\
+% \verb|\piton{c="#" # an affectation }| &
+% \piton{c="#" # an affectation } \\
+% \verb|\piton{c="#" \ \ \ # an affectation }| &
+% \piton{c="#" \ \ \ # an affectation } \\
+% \verb|\piton{MyDict = {'a': 3, 'b': 4 }}| &
+% \piton{MyDict = {'a': 3, 'b': 4 }}
+% \end{tabular}
+%
+% \bigskip
+% It's possible to use the command |\piton| in the arguments of a
+% LaTeX command.\footnote{For example, it's possible to use the command
+% \texttt{\textbackslash piton} in a footnote. Example :
+% \piton{s = 'A string'}.}
+%
+% \bigskip
+% \item {\color{blue} \textsf{Syntaxe} \verb!\piton|...|!}\par\nobreak
+%
+% When the argument of the command |\piton| is provided between two identical
+% characters, that argument is taken in a \emph{verbatim mode}. Therefore, with
+% that syntax, the command |\piton| can't be used within the argument of another
+% command.
+%
+% \medskip
+%
+% \begin{tabular}{>{\color{gray}}w{l}{75mm}@{\hspace*{1cm}}l}
+% \omit Examples : \hfil \\
+% \noalign{\vskip1mm}
+% \verb!\piton|MyString = '\n'|! &
+% \piton|MyString = '\n'| \\
+% \verb|\piton!def even(n): return n%2==0!| &
+% \piton!def even(n): return n%2==0! \\
+% \verb|\piton+c="#" # an affectation +| &
+% \piton+c="#" # an affectation + \\
+% \verb|\piton?MyDict = {'a': 3, 'b': 4}?| &
+% \piton!MyDict = {'a': 3, 'b': 4}!
+% \end{tabular}
+%
+% \end{itemize}
+%
+% \section{Customization}
+%
+% \subsection{The command \textbackslash PitonOptions}
+%
+%
+% \NewDocumentCommand{\Definition}{m}
+% {{\setlength{\fboxsep}{1pt}\colorbox{gray!20}{\ttfamily \vphantom{gl}#1}}}
+%
+% The command |\PitonOptions| takes in as argument a comma-separated list of
+% \textsl{key=value} pairs. The scope of the settings done by that command is
+% the current TeX group.\footnote{We remind that a LaTeX environment is, in
+% particular, a TeX group.}
+%
+% \begin{itemize}
+% \item The key \Definition{gobble} takes in as value a
+% positive integer~$n$: the first $n$ characters are discarded (before the
+% process of highlightning of the code) for each line of the environment
+% |{Piton}|. These characters are not necessarily spaces.
+%
+% \item When the key \Definition{auto-gobble} is in force, the
+% extension \pkg{piton} computes the minimal value $n$ of the number of
+% consecutive spaces beginning each (non empty) line of the environment
+% |{Piton}| and applies |gobble| with that value of~$n$.
+%
+% \item When the key \Definition{env-gobble} is in force, \pkg{piton} analyzes the last
+% line of the environment |{Piton}|, that is to say the line which contains
+% |\end{Piton}| and determines whether that line contains only spaces followed
+% by the |\end{Piton}|. If we are in that situation, \pkg{piton} computes the
+% number~$n$ of spaces on that line and applies |gobble| with that value of~$n$.
+% The name of that key comes from \emph{environment gobble}: the effect of
+% gobble is set by the position of the commands |\begin{Piton}| and
+% |\end{Piton}| which delimit the current environment.
+%
+% \item With the key \Definition{line-numbers}, the \emph{non empty} lines (and
+% all the lines of the \emph{docstrings}, even the empty ones) are numbered in
+% the environments |{Piton}| and in the listings resulting from the use of
+% |\PitonInputFile|.
+%
+% \item With the key \Definition{all-line-numbers}, \emph{all} the lines are numbered,
+% including the empty ones.
+%
+% \item \colorbox{yellow!50}{\bfseries{New 1.5}}\par\nobreak
+%
+% The key \Definition{numbers-sep} is the horizontal distance between the
+% numbers of lines (inserted by |line-numbers| of |all-line-numbers|) and the
+% beginning of the lines of code. The initial value is 0.7~em.
+%
+% \item With the key \Definition{resume}, the counter of lines is not set to zero
+% at the beginning of each environment |{Piton}| or use of |\PitonInputFile| as
+% it is otherwise. That allows a numbering of the lines across several
+% environments.
+%
+% \item The key \Definition{left-margin} corresponds to a margin on the left.
+% That key may be useful in conjonction with the key |line-numbers| or the key
+% |line-all-numbers| if one does not want the numbers in an overlapping position
+% on the left.
+%
+% It's possible to use the key |left-margin| with the value |auto|. With that
+% value, if the key |line-numbers| or the key |all-line-numbers| is used, a
+% margin will be automatically inserted to fit the numbers of lines. See an
+% example part \ref{example-numbering} on page~\pageref{example-numbering}.
+%
+% \item The key \Definition{background-color} sets the background color of the
+% environments |{Piton}| and the listings produced by |\PitonInputFile| (that
+% background has a width of |\linewidth|).
+%
+% \smallskip
+% \colorbox{yellow!50}{\textbf{New 1.4}}\enskip The key |background-color|
+% supports also as value a \emph{list} of colors. In this case, the successive
+% rows are colored by using the colors of the list in a cyclic way.
+%
+% \emph{Example} : |\PitonOptions{background-color = {gray!5,white}}|
+%
+%
+% The key |background-color| accepts a color defined «on the fly». For example,
+% it's possible to write |background-color = [cmyk]{0.1,0.05,0,0}|.
+%
+% \item With the key \Definition{prompt-background-color}, \pkg{piton} adds a
+% color background to the lines beginning with the prompt ``|>>>|'' (and its
+% continuation ``|...|'') characteristic of the Python consoles with
+% \textsc{repl} (\emph{read-eval-print loop}).
+%
+% \item When the key \Definition{show-spaces-in-strings} is activated, the
+% spaces in the short strings (that is to say those delimited by |'| or |"|) are
+% replaced by the character~⣠(U+2423 : \textsc{open box}). Of course, that
+% character~U+2423 must be present in the monospaced font which is
+% used.\footnote{The package \pkg{piton} simply uses the current monospaced
+% font. The best way to change that font is to use the command
+% \texttt{\textbackslash setmonofont} of the package \pkg{fontspec}.}\par\nobreak
+% \begingroup \PitonOptions{show-spaces-in-strings} Example :
+% \piton|my_string = 'Very good answer'| \endgroup
+%
+% With the key \Definition{show-spaces}, all the spaces are replaced by U+2423
+% (and no line break can occur on those ``visible spaces'', even when the key
+% |break-lines|\footnote{cf. \ref{line-breaks} p.~\pageref{line-breaks}} is in
+% force).
+% \end{itemize}
+%
+% \bigskip
+%
+% \begingroup
+% \fvset{commandchars=\~\&\@,formatcom=\small\color{gray}}
+% \begin{Verbatim}
+% ~emphase&\PitonOptions{line-numbers,auto-gobble,background-color = gray!15}@
+% \begin{Piton}
+% from math import pi
+% def arctan(x,n=10):
+% """Compute the mathematical value of arctan(x)
+%
+% n is the number of terms in the sum
+% """
+% if x < 0:
+% return -arctan(-x) # recursive call
+% elif x > 1:
+% return pi/2 - arctan(1/x)
+% #> (we have used that $\arctan(x)+\arctan(1/x)=\frac{\pi}{2}$ pour $x>0$)
+% else
+% s = 0
+% for k in range(n):
+% s += (-1)**k/(2*k+1)*x**(2*k+1)
+% return s
+% \end{Piton}
+% \end{Verbatim}
+% \endgroup
+%
+% \begingroup
+% \PitonOptions{line-numbers,background-color = gray!15}
+% \begin{Piton}
+% from math import pi
+%
+% def arctan(x,n=10):
+% """Compute the mathematical value of arctan(x)
+%
+% n is the number of terms in the sum
+% """
+% if x < 0:
+% return -arctan(-x) # recursive call
+% elif x > 1:
+% return pi/2 - arctan(1/x)
+% #> (we have used that $\arctan(x)+\arctan(1/x)=\frac{\pi}{2}$ for $x>0$)
+% else
+% s = 0
+% for k in range(n):
+% s += (-1)**k/(2*k+1)*x**(2*k+1)
+% return s
+% \end{Piton}
+% \endgroup
+%
+% \bigskip
+% The command |\PitonOptions| provides in fact several other keys which will be
+% described further (see in particular the ``Pages breaks and line breaks''
+% p.~\pageref{breakable}).
+%
+% \subsection{The styles}
+%
+% \label{styles}
+%
+% The package \pkg{piton} provides the command |\SetPitonStyle| to customize the
+% different styles used to format the syntactic elements of the Python listings.
+% The customizations done by that command are limited to the current TeX
+% group.\footnote{We remind that a LaTeX environment is, in particular, a TeX group.}
+%
+% \bigskip
+% The command |\SetPitonStyle| takes in as argument a comma-separated list of
+% \textsl{key=value} pairs. The keys are names of styles and the value are LaTeX
+% formatting instructions.
+%
+% \bigskip
+% These LaTeX instructions must be formatting instructions such as
+% |\color{...}|, |\bfseries|, |\slshape|, etc. (the commands of this kind are
+% sometimes called \emph{semi-global} commands). It's also possible to put,
+% \emph{at the end of the list of instructions}, a LaTeX command taking exactly
+% one argument.
+%
+% \bigskip
+% Here an example which changes the style used to highlight, in the definition
+% of a Python function, the name of the function which is defined. That code
+% uses the command |\highLight| of \pkg{lua-ul} (that package requires also the
+% package \pkg{luacolor}).
+%
+% \begin{verbatim}
+% \SetPitonStyle{ Name.Function = \bfseries \highLight[red!50] }
+% \end{verbatim}
+%
+% In that example, |\highLight[red!50]| must be considered as the name of a
+% LaTeX command which takes in exactly one argument, since, usually, it is used
+% with |\highLight[red!50]{...}|.
+%
+% \medskip
+% \begingroup
+% \SetPitonStyle
+% { Name.Function = \bfseries \highLight[red!50] }
+% With that setting, we will have : \piton{def cube(x) : return x * x * x }
+% \endgroup
+%
+% \bigskip
+% The different styles are described in the table \ref{Semantic}. The initial
+% settings done by \pkg{piton} in |piton.sty| are inspired by the style
+% \pkg{manni} de Pygments.\footnote{See:
+% \url{https://pygments.org/styles/}. Remark that, by default, Pygments provides for its style \pkg{manni} a colored background whose color is the HTML color \texttt{\#F0F3F3}. It's possible to have the same color in \texttt{\{Pion\}} with the instruction \texttt{\textbackslash PitonOptions\{background-color = [HTML]\{F0F3F3\}\}}.}
+%
+% \bigskip
+% \colorbox{yellow!50}{\textbf{New 1.4}}\enskip The command |\PitonStyle| takes
+% in as argument the name of a style and allows to retrieve the value (as a list
+% of LaTeX instructions) of that style.
+%
+% \smallskip
+% For example, it's possible to write |{\PitonStyle{Keyword}{function}}| and we
+% will have the word {\PitonStyle{Keyword}{function}} formatted as a keyword.
+%
+% \smallskip
+% The syntax |{\PitonStyle{|\textsl{\texttt{style}}|}{...}}| is mandatory in
+% order to be able to deal both with the semi-global commands and the commands
+% with arguments which may be present in the definition of the style
+% \texttt{\textsl{style}}.
+%
+% \begin{table}[b]
+% \centering
+% \caption{Usage of the different styles}
+% \label{Semantic}
+% \begin{tabular}{@{}>{\ttfamily}l>{\RaggedRight\arraybackslash}p{9cm}@{}}
+% \toprule
+% \normalfont Style & Usage \\
+% \midrule
+% Number & the numbers \\
+% String.Short & the short strings (between \texttt{'} or \verb|"|) \\
+% String.Long & the long strings (between \texttt{'''} or \verb|"""|) except the
+% documentation strings \\
+% String & that keys sets both |String.Short| and |String.Long| \\
+% String.Doc & the documentation strings (only between \texttt{"""} following
+% PEP~257) \\
+% String.Interpol & the syntactic elements of the fields of the f-strings (that
+% is to say the characters \texttt{\{} and \texttt{\}}) \\
+% Operator & the following operators : \texttt{!= == << >> - \~{} + / * \% = < > \& .} \verb+|+ \verb|@|\\
+% Operator.Word & the following operators : \texttt{in}, \texttt{is},
+% \texttt{and}, \texttt{or} and \texttt{not} \\
+% Name.Builtin & the predefined functions of Python \\
+% Name.Function & the name of the functions defined by the user, at the point of
+% their definition (that is to say after the keyword |def|) \\
+% Name.Decorator & the decorators (instructions beginning by \verb|@|) \\
+% Name.Namespace & the name of the modules (= external libraries) \\
+% Name.Class & the name of the classes at the point of their definition (that is
+% to say after the keyword |class|) \\
+% Exception & the names of the exceptions (eg: \texttt{SyntaxError}) \\
+% Comment & the comments beginning with \verb|#| \\
+% Comment.LaTeX & the comments beginning by \verb|#>|, which are composed in LaTeX by
+% \pkg{piton} (and simply called ``LaTeX comments'' in this document) \\
+% Keyword.Constant & |True|, |False| and |None| \\
+% Keyword & the following keywords :
+% \ttfamily as, assert, break, case, continue, def, del,
+% elif, else, except, exec, finally, for, from,
+% global, if, import, lambda, non local,
+% pass, raise, return, try, while,
+% with, yield, yield from.\\
+% \bottomrule
+% \end{tabular}
+% \end{table}
+%
+%
+%
+%
+% \subsection{Creation of new environments}
+%
+% \label{NewPitonEnvironment}
+%
+% Since the environment |{Piton}| has to catch its body in a special way (more
+% or less as verbatim text), it's not possible to construct new environments
+% directly over the environment |{Piton}| with the classical commands
+% |\newenvironment| or |\NewDocumentEnvironment|.
+%
+% That's why \pkg{piton} provides a command |\NewPitonEnvironment|. That
+% command takes in three mandatory arguments.
+
+% That command has the same syntax as the classical environment
+% |\NewDocumentEnvironment|.
+%
+% \bigskip
+% With the following instruction, a new environment |{Python}| will be
+% constructed with the same behaviour as |{Piton}|:
+%
+% {\color{gray}\verb|\NewPitonEnvironment{Python}{}{}{}|}
+%
+% \bigskip
+% If one wishes an environment |{Python}| with takes in as optional argument
+% (between square brackets) the keys of the command |\PitonOptions|, it's
+% possible to program as follows:
+%
+% {\color{gray}\verb|\NewPitonEnvironment{Python}{O{}}{\PitonOptions{#1}}{}|}
+%
+% \bigskip
+% If one wishes to format Python code in a box of \pkg{tcolorbox}, it's possible
+% to define an environment |{Python}| with the following code (of course, the
+% package \pkg{tcolorbox} must be loaded).
+%
+%\begin{verbatim}
+% \NewPitonEnvironment{Python}{}
+% {\begin{tcolorbox}}
+% {\end{tcolorbox}}
+% \end{verbatim}
+%
+% \bigskip
+% With this new environment |{Python}|, it's possible to write:
+%
+% \begin{Verbatim}
+% ~emphase#\begin{Python}@
+% def square(x):
+% """Compute the square of a number"""
+% return x*x
+% ~emphase#\end{Python}@
+% \end{Verbatim}
+%
+% \NewPitonEnvironment{Python}{}
+% {\begin{tcolorbox}}
+% {\end{tcolorbox}}
+%
+% \begin{Python}
+% def square(x):
+% """Compute the square of a number"""
+% return x*x
+% \end{Python}
+%
+%
+% \section{Advanced features}
+%
+% \subsection{Highlighting some identifiers}
+%
+% \colorbox{yellow!50}{\textbf{New 1.4}} It's possible to require a changement
+% of formating for some identifiers with the key |identifiers| of
+% |\PitonOptions|.
+%
+% \smallskip
+% That key takes in as argument a value of the following format:
+%
+% \quad |{ names = |\textsl{\ttfamily names}|, style = |\textsl{\ttfamily
+% instructions}| }|
+%
+% \begin{itemize}
+% \item \textsl{\ttfamily names} is a (comma-separated) list of identifiers
+% names;
+%
+% \item \textsl{\ttfamily instructions} is a list of LaTeX instructions of the
+% same type that \pkg{piton} ``styles'' previously presented (cf~\ref{styles}
+% p.~\pageref{styles}).
+% \end{itemize}
+%
+% \emph{Caution}: Only the identifiers may be concerned by that key. The
+% keywords and the built-in functions won't be affected, even if their name is
+% in the list |\textsl{\ttfamily names}|.
+%
+% \begin{Verbatim}
+% \PitonOptions
+% {
+% ~emphase#identifiers@ =
+% {
+% ~emphase#names@ = { l1 , l2 } ,
+% ~emphase#style@ = \color{red}
+% }
+% }
+%
+% \begin{Piton}
+% def tri(l):
+% """Segmentation sort"""
+% if len(l) <= 1:
+% return l
+% else:
+% a = l[0]
+% l1 = [ x for x in l[1:] if x < a ]
+% l2 = [ x for x in l[1:] if x >= a ]
+% return tri(l1) + [a] + tri(l2)
+% \end{Piton}
+% \end{Verbatim}
+%
+%
+% \bigskip
+%
+% \begingroup
+%
+% \PitonOptions
+% {
+% identifiers =
+% {
+% names = { l1 , l2 } ,
+% style = \color{red}
+% }
+% }
+%
+% \begin{Piton}
+% def tri(l):
+% """Segmentation sort"""
+% if len(l) <= 1:
+% return l
+% else:
+% a = l[0]
+% l1 = [ x for x in l[1:] if x < a ]
+% l2 = [ x for x in l[1:] if x >= a ]
+% return tri(l1) + [a] + tri(l2)
+% \end{Piton}
+%
+% \endgroup
+%
+% \bigskip
+% By using the key |identifier|, it's possible to add other built-in functions
+% (or other new keywords, etc.) that will be detected by \pkg{piton}.
+%
+%
+% \begin{Verbatim}
+% \PitonOptions
+% {
+% ~emphase#identifiers@ =
+% {
+% names = { cos, sin, tan, floor, ceil, trunc, pow, exp, ln, factorial } ,
+% style = \PitonStyle{Name.Builtin}
+% }
+% }
+%
+% \begin{Piton}
+% from math import *
+% cos(pi/2)
+% factorial(5)
+% ceil(-2.3)
+% floor(5.4)
+% \end{Piton}
+% \end{Verbatim}
+%
+% \begingroup
+%
+% \PitonOptions
+% {
+% identifiers =
+% {
+% names = { cos, sin, tan, floor, ceil, trunc, pow, exp, ln, factorial } ,
+% style = \PitonStyle{Name.Builtin}
+% }
+% }
+%
+% \begin{Piton}
+% from math import *
+% cos(pi/2)
+% factorial(5)
+% ceil(-2.3)
+% floor(5.4)
+% \end{Piton}
+%
+%
+% \endgroup
+%
+%
+% \subsection{Mechanisms to escape to LaTeX}
+%
+% The package \pkg{piton} provides several mechanisms for escaping to LaTeX:
+% \begin{itemize}
+% \item It's possible to compose comments entirely in LaTeX.
+% \item It's possible to have the elements between \texttt{\$} in the comments
+% composed in LateX mathematical mode.
+% \item It's also possible to insert LaTeX code almost everywhere in a Python listing.
+% \end{itemize}
+%
+% One should aslo remark that, when the extension \pkg{piton} is used with the
+% class \cls{beamer}, \pkg{piton} detects in |{Piton}| many commands and
+% environments of Beamer: cf. \ref{beamer} p.~\pageref{beamer}.
+%
+% \subsubsection{The ``LaTeX comments''}
+%
+% In this document, we call ``LaTeX comments'' the comments which begins by
+% |#>|. The code following those characters, until the end of the line, will be
+% composed as standard LaTeX code. There is two tools to customize those
+% comments.
+%
+% \begin{itemize}
+% \item It's possible to change the syntatic mark (which, by default, is |#>|).
+% For this purpose, there is a key |comment-latex| available at load-time (that
+% is to say at the |\usepackage|) which allows to choice the characters which,
+% preceded by |#|, will be the syntatic marker.
+%
+% For example, with the following loading:
+%
+% \quad \verb|\usepackage[comment-latex = LaTeX]{piton}|
+%
+% the LaTeX comments will begin by |#LaTeX|.
+%
+% If the key |comment-latex| is used with the empty value, all the Python
+% comments (which begins by |#|) will, in fact, be ``LaTeX comments''.
+%
+% \smallskip
+% \item It's possible to change the formatting of the LaTeX comment itself by
+% changing the \pkg{piton} style |Comment.LaTeX|.
+%
+% For example, with |\SetPitonStyle{Comment.LaTeX = \normalfont\color{blue}}|,
+% the LaTeX comments will be composed in blue.
+%
+% If you want to have a character |#| at the beginning of the LaTeX comment in
+% the \textsc{pdf}, you can use set |Comment.LaTeX| as follows:
+%
+% \begin{Verbatim}
+% \SetPitonStyle{Comment.LaTeX = \color{gray}\~#\normalfont\space }
+% \end{Verbatim}
+%
+% For other examples of customization of the LaTeX comments, see the part
+% \ref{example-comments} p.~\pageref{example-comments}
+% \end{itemize}
+%
+% \bigskip
+% If the user has required line numbers in the left margin (with the
+% key |line-numbers| or the key |all-line-numbers| of |\PitonOptions|), it's
+% possible to refer to a number of line with the command |\label| used in a
+% LaTeX comment.\footnote{That feature is implemented by using a redefinition of
+% the standard command \texttt{\textbackslash label} in the environments
+% \texttt{\{Piton\}}. Therefore, incompatibilities may occur with extensions
+% which redefine (globally) that command \texttt{\textbackslash label} (for
+% example: \pkg{varioref}, \pkg{refcheck}, \pkg{showlabels}, etc.)}
+%
+% \subsubsection{The key ``math-comments''}
+%
+% It's possible to request that, in the standard Python comments (that is to say
+% those beginning by |#| and not |#>|), the elements between \texttt{\$} be
+% composed in LaTeX mathematical mode (the other elements of the comment being
+% composed verbatim).
+%
+% That feature is activated by the key |math-comments| at load-time (that is to
+% say with the |\usepackage|).
+%
+% \medskip
+% In the following example, we assume that the key |math-comments| has been used
+% when loading \pkg{piton}.
+%
+% \begin{Verbatim}
+% \begin{Piton}
+% def square(x):
+% return x*x ~# compute $x^2$
+% \end{Piton}
+% \end{Verbatim}
+%
+% \begin{Piton}
+% def square(x):
+% return x*x # compute $x^2$
+% \end{Piton}
+%
+% \subsubsection{The mechanism ``escape-inside''}
+%
+% It's also possible to overwrite the Python listings to insert LaTeX code
+% almost everywhere (but between lexical units, of course). By default,
+% \pkg{piton} does not fix any character for that kind of escape.
+%
+% In order to use this mechanism, it's necessary to specify two characters which
+% will delimit the escape (one for the beginning and one for the end) by using
+% the key |escape-inside| at load-time (that is to say at the
+% |\begin{docuemnt}|).
+%
+% \medskip
+% In the following example, we assume that the extension \pkg{piton} has been
+% loaded by the following instruction.
+%
+% \begin{Verbatim}
+% \usepackage[~emphase#escape-inside=$$@]{piton}
+% \end{Verbatim}
+%
+% \medskip
+% In the following code, which is a recursive programmation of the mathematical
+% factorial, we decide to highlight in yellow the instruction which contains the
+% recursive call. That example uses the command |\highLight| of \pkg{lua-ul}
+% (that package requires itself the package \pkg{luacolor}).
+% \begin{Verbatim}
+% \begin{Piton}
+% def fact(n):
+% if n==0:
+% return 1
+% else:
+% ~emphase#$\highLight{$@return n*fact(n-1)~emphase#$}$@
+% \end{Piton}
+% \end{Verbatim}
+%
+% \begin{Piton}
+% def fact(n):
+% if n==0:
+% return 1
+% else:
+% $\highLight{$return n*fact(n-1)$}$
+% \end{Piton}
+%
+% \bigskip
+% In fact, in that case, it's probably easier to use the command |\@highLight|
+% of \pkg{lua-ul}: that command sets a yellow background until the end of the
+% current TeX group. Since the name of that command contains the character |@|,
+% it's necessary to define a synonym without |@| in order to be able to use it
+% directly in |{Piton}|.
+% \begingroup
+% \fvset{commandchars=\~\#\+,formatcom=\color{gray}}
+% \begin{Verbatim}
+% \makeatletter
+% ~emphase#\let\Yellow\@highLight+
+% \makeatother
+% \end{Verbatim}
+% \endgroup
+%
+% \begin{Verbatim}
+% \begin{Piton}
+% def fact(n):
+% if n==0:
+% return 1
+% else:
+% ~emphase#$\Yellow$@return n*fact(n-1)
+% \end{Piton}
+% \end{Verbatim}
+%
+% \makeatletter
+% \let\Yellow\@highLight
+% \makeatother
+%
+%
+% \begin{Piton}
+% def fact(n):
+% if n==0:
+% return 1
+% else:
+% $\Yellow$return n*fact(n-1)
+% \end{Piton}
+%
+%
+%
+% \bigskip
+% \emph{Caution} : The escape to LaTeX allowed by the characters of
+% |escape-inside| is not active in the strings nor in the Python comments
+% (however, it's possible to have a whole Python comment composed in LaTeX by
+% beginning it with |#>|; such comments are merely called ``LaTeX comments'' in
+% this document).
+%
+%
+% \subsection{Behaviour in the class Beamer}
+%
+% \label{beamer}
+%
+% \emph{First remark}\par\nobreak
+% Since the environment |{Piton}| catches its body with a verbatim mode,
+% it's necessary to use the environments |{Piton}| within environments |{frame}|
+% of Beamer protected by the key |fragile|.\footnote{Remind that for an
+% environment \texttt{\{frame\}} of Beamer using the key |fragile|, the
+% instruction \texttt{\textbackslash end\{frame\}} must be alone on a single
+% line (except for any leading whitespace).}
+%
+%
+% \bigskip
+% When the package \pkg{piton} is used within the class
+% \cls{beamer}\footnote{The extension \pkg{piton} detects the class \cls{beamer}
+% but, if needed, it's also possible to activate that mechanism with the key
+% |beamer| provided by \pkg{piton} at load-time: |\textbackslash
+% usepackage[beamer]\{piton\}|}, the behaviour of \pkg{piton} is slightly
+% modified, as described now.
+%
+% \subsubsection{\{Piton\} et \textbackslash PitonInputFile are
+% ``overlay-aware''}
+%
+% When \pkg{piton} is used in the class \cls{beamer}, the environment |{Piton}|
+% and the command |\PitonInputFile| accept the optional argument |<...>| of
+% Beamer for the overlays which are involved.
+%
+% For example, it's possible to write:
+%
+% \begin{Verbatim}
+% \begin{Piton}~emphase#<2-5>@
+% ...
+% \end{Piton}
+% \end{Verbatim}
+%
+% and
+%
+% \begin{Verbatim}
+% \PitonInputFile~emphase#<2-5>@{my_file.py}
+% \end{Verbatim}
+%
+% \subsubsection{Commands of Beamer allowed in \{Piton\} and \textbackslash PitonInputFile}
+%
+% When \pkg{piton} is used in the class \cls{beamer} , the following commands of
+% \cls{beamer} (classified upon their number of arguments) are automatically
+% detected in the environments |{Piton}| (and in the listings processed by
+% |\PitonInputFile|):
+% \begin{itemize}
+% \item no mandatory argument : |\pause|\footnote{One should remark that it's
+% also possible to use the command \texttt{\textbackslash pause} in a ``LaTeX
+% comment'', that is to say by writing \texttt{\#> \textbackslash pause}. By
+% this way, if the Python code is copied, it's still executable by Python}. ;
+% \item one mandatory argument : |\action|, |\alert|, |\invisible|, |\only|, |\uncover| and |\visible| ;
+% \item two mandatory arguments : |\alt| ;
+% \item three mandatory arguments : |\temporal|.
+% \end{itemize}
+
+% \medskip
+% In the mandatory arguments of these commands, the braces must be balanced.
+% However, the braces included in short strings\footnote{The short strings of
+% Python are the strings delimited by characters \texttt{'} or the characters
+% \texttt{"} and not \texttt{'''} nor \texttt{"""}. In Python, the short strings
+% can't extend on several lines.} of Python are not considered.
+%
+% \medskip
+% Regarding the fonctions |\alt| and |\temporal| there should be no carriage
+% returns in the mandatory arguments of these functions.
+%
+% \medskip
+% Here is a complete example of file:
+%
+% \begin{Verbatim}[formatcom = \small\color{gray}]
+% \documentclass{beamer}
+% \usepackage{piton}
+% \begin{document}
+% \begin{frame}[fragile]
+% \begin{Piton}
+% def string_of_list(l):
+% """Convert a list of numbers in string"""
+% ~emphase# \only<2->{s = "{" + str(l[0])}@
+% ~emphase# \only<3->{for x in l[1:]: s = s + "," + str(x)}@
+% ~emphase# \only<4->{s = s + "}"}@
+% return s
+% \end{Piton}
+% \end{frame}
+% \end{document}
+% \end{Verbatim}
+%
+% In the previous example, the braces in the Python strings |"{"| and |"}"| are
+% correctly interpreted (without any escape character).
+%
+%
+%
+%
+% \bigskip
+% \subsubsection{Environments of Beamer allowed in \{Piton\} and \textbackslash PitonInputFile}
+%
+% When \pkg{piton} is used in the class \pkg{beamer}, the following environments
+% of Beamer are directly detected in the environments |{Piton}| (and in the
+% listings processed by |\PitonInputFile|): |{actionenv}|, |{alertenv}|,
+% |{invisibleenv}|, |{onlyenv}|, |{uncoverenv}| and |{visibleenv}|.
+%
+% However, there is a restriction: these environments must contain only \emph{whole
+% lines of Python code} in their body.
+%
+%\medskip
+% Here is an example:
+%
+% \begin{Verbatim}[formatcom = \small\color{gray}]
+% \documentclass{beamer}
+% \usepackage{piton}
+% \begin{document}
+% \begin{frame}[fragile]
+% \begin{Piton}
+% def square(x):
+% """Compure the square of its argument"""
+% ~emphase#\begin{uncoverenv}<2>@
+% return x*x
+% ~emphase#\end{uncoverenv}@
+% \end{Piton}
+% \end{frame}
+% \end{document}
+% \end{Verbatim}
+%
+%
+% \vspace{1cm}
+% \textbf{Remark concerning the command \textbackslash alert and the environment
+% \{alertenv\} of Beamer}\par\nobreak
+%
+% \smallskip
+% Beamer provides an easy way to change the color used by the environment
+% |{alertenv}| (and by the command |\alert| which relies upon it) to highlight
+% its argument. Here is an example:
+%
+% \begin{Verbatim}
+% \setbeamercolor{~emphase#alerted text@}{fg=blue}
+% \end{Verbatim}
+%
+% However, when used inside an environment |{Piton}|, such tuning will probably
+% not be the best choice because \pkg{piton} will, by design, change (most of
+% the time) the color the different elements of text. One may prefer an environment
+% |{alertenv}| that will change the background color for the elements to be
+% hightlighted.
+%
+% \smallskip
+% Here is a code that will do that job and add a yellow background. That code
+% uses the command |\@highLight| of \pkg{lua-ul} (that extension requires also
+% the package \pkg{luacolor}).
+%
+% \begingroup
+% \fvset{commandchars=\~\#\+,formatcom=\color{gray}}
+% \begin{Verbatim}
+% \setbeamercolor{alerted text}{bg=yellow!50}
+% \makeatletter
+% \AddToHook{env/Piton/begin}
+% {\renewenvironment<>{alertenv}{\only~#1{~emphase#\@highLight+[alerted text.bg]}}{}}
+% \makeatother
+% \end{Verbatim}
+% \endgroup
+%
+% That code redefines locally the environment |{alertenv}| within the
+% environments |{Piton}| (we recall that the command |\alert| relies upon that
+% environment |{alertenv}|).
+%
+% \subsection{Page breaks and line breaks}
+%
+% \label{breakable}
+%
+% \subsubsection{Page breaks}
+%
+% By default, the listings produced by the environment |{Piton}| and the command
+% |\PitonInputFile| are not breakable.
+%
+% However, the command |\PitonOptions| provides the key |splittable| to allow such
+% breaks.
+%
+% \begin{itemize}
+% \item If the key |splittable| is used without any value, the listings are
+% breakable everywhere.
+% \item If the key |splittable| is used with a numeric value~$n$ (which must be
+% a non-negative integer number), the listings are breakable but no break will
+% occur within the first $n$ lines and within the last $n$ lines. Therefore,
+% |splittable=1| is equivalent to |splittable|.
+% \end{itemize}
+%
+% \medskip
+% Even with a background color (set by the key |background-color|), the pages
+% breaks are allowed, as soon as the key |splittable| is in force.\footnote{With
+% the key |splittable|, the environments \texttt{\{Piton\}} are breakable, even
+% within a (breakable) environment of \pkg{tcolorbox}. Remind that an
+% environment of \pkg{tcolorbox} included in another environment of
+% \pkg{tcolorbox} is \emph{not} breakable, even when both environments use the
+% key |breakable| of \pkg{tcolorbox}.}
+%
+% \subsubsection{Line breaks}
+%
+% \label{line-breaks}
+%
+% By default, the elements produced by \pkg{piton} can't be broken by an end on
+% line. However, there are keys to allow such breaks (the possible breaking
+% points are the spaces, even the spaces in the Python strings).
+% \begin{itemize}
+% \item With the key |break-lines-in-piton|, the line breaks are allowed in the
+% command |\piton{...}| (but not in the command \verb+\piton|...|+, that is to say
+% the command |\piton| in verbatim mode).
+% \item With the key |break-lines-in-Piton|, the line breaks are allowed in the
+% environment |{Piton}| (hence the capital letter |P| in the name) and in the
+% listings produced by |\PitonInputFile|.
+% \item The key |break-lines| is a conjonction of the two previous keys.
+% \end{itemize}
+%
+% \bigskip
+% The package \pkg{piton} provides also several keys to control the appearance
+% on the line breaks allowed by |break-lines-in-Piton|.
+%
+% \begin{itemize}
+% \item With the key |indent-broken-lines|, the indentation of a broken line is
+% respected at carriage return.
+%
+% \item The key |end-of-broken-line| corresponds to the symbol placed at the end
+% of a broken line. The initial value is: |\hspace*{0.5em}\textbackslash|.
+%
+% \item The key |continuation-symbol| corresponds to the symbol placed at each
+% carriage return. The initial value is: |+\;|.
+%
+% \item The key |continuation-symbol-on-indentation| coresponds to the symbol
+% placed at each carriage return, on the position of the indentation (only when
+% the key |indent-broken-line| is in force). The initial value is:
+% |$\hookrightarrow\;$|.
+% \end{itemize}
+%
+%
+% \bigskip
+% The following code has been composed in a standard LaTeX |{minipage}| of width
+% 12~cm with the following tuning:
+%
+% \begin{Verbatim}
+% \PitonOptions{break-lines,indent-broken-lines,background-color=gray!15}
+% \end{Verbatim}
+%
+% \begin{center}
+% \PitonOptions{break-lines,indent-broken-lines,background-color=gray!15}
+% \begin{minipage}{12cm}
+% \begin{Piton}
+% def dict_of_list(l):
+% """Converts a list of subrs and descriptions of glyphs in a dictionary"""
+% our_dict = {}
+% for list_letter in l:
+% if (list_letter[0][0:3] == 'dup'): # if it's a subr
+% name = list_letter[0][4:-3]
+% print("We treat the subr of number " + name)
+% else:
+% name = list_letter[0][1:-3] # if it's a glyph
+% print("We treat the glyph of number " + name)
+% our_dict[name] = [treat_Postscript_line(k) for k in list_letter[1:-1]]
+% return dict
+% \end{Piton}
+% \end{minipage}
+% \end{center}
+%
+% \subsection{Footnotes in the environments of piton}
+%
+% \label{footnote}
+% If you want to put footnotes in an environment |{Piton}| or
+% (or, more unlikely, in a listing produced by |\PitonInputFile|), you can use a
+% pair |\footnotemark|--|\footnotetext|.
+%
+% \smallskip
+% However, it's also possible to extract the footnotes with the help of the
+% package \pkg{footnote} or the package \pkg{footnotehyper}.
+%
+% \smallskip
+% If \pkg{piton} is loaded with the option |footnote| (with
+% |\usepackage[footnote]{piton}| or with |\PassOptionsToPackage|), the
+% package \pkg{footnote} is loaded (if it is not yet loaded) and it is used to
+% extract the footnotes.
+%
+% \smallskip
+% If \pkg{piton} is loaded with the option |footnotehyper|, the package
+% \pkg{footnotehyper} is loaded (if it is not yet loaded) ant it is used to
+% extract footnotes.
+%
+% \smallskip
+% Caution: The packages \pkg{footnote} and \pkg{footnotehyper} are incompatible.
+% The package \pkg{footnotehyper} is the successor of the package \pkg{footnote}
+% and should be used preferently. The package \pkg{footnote} has some drawbacks,
+% in particular: it must be loaded after the package \pkg{xcolor} and it is not
+% perfectly compatible with \pkg{hyperref}.
+%
+% \medskip
+% In this document, the package \pkg{piton} has been loaded with the
+% option |footnotehyper|. For examples of notes, cf. \ref{notes-examples},
+% p.~\pageref{notes-examples}.
+%
+% \subsection{Tabulations}
+%
+% \smallskip
+% Even though it's recommended to indent the Python listings with spaces (see
+% PEP~8), \pkg{piton} accepts the characters of tabulation (that is to say the
+% characters U+0009) at the beginning of the lines. Each character U+0009 is
+% replaced by $n$~spaces. The initial value of $n$ is $4$ but it's possible to
+% change it with the key |tab-size| of |\PitonOptions|.
+%
+% \smallskip
+% There exists also a key |tabs-auto-gobble| which computes the minimal value
+% $n$ of the number of consecutive characters U+0009 beginning each (non empty)
+% line of the environment |{Piton}| and applies |gobble| with that value of~$n$
+% (before replacement of the tabulations by spaces, of course). Hence, that key
+% is similar to the key |auto-gobble| but acts on U+0009 instead of U+0020
+% (spaces).
+%
+% \section{Examples}
+%
+% \subsection{Line numbering}
+%
+% \label{example-numbering}
+%
+% We remind that it's possible to have an automatic numbering of the lines in
+% the Python listings by using the key |line-numbers| or the key |all-line-numbers|.
+%
+% By default, the numbers of the lines are composed by \pkg{piton} in an
+% overlapping position on the left (by using internally the command |\llap| of LaTeX).
+%
+% In order to avoid that overlapping, it's possible to use the option |left-margin=auto|
+% which will insert automatically a margin adapted to the numbers of lines that
+% will be written (that margin is larger when the numbers are greater than~10).
+%
+%
+% \begingroup
+% \fvset{commandchars=\~\&\@,formatcom=\small\color{gray}}
+% \begin{Verbatim}
+% ~emphase&\PitonOptions{background-color=gray!10, left-margin = auto, line-numbers}@
+% \begin{Piton}
+% def arctan(x,n=10):
+% if x < 0:
+% return -arctan(-x) #> (appel récursif)
+% elif x > 1:
+% return pi/2 - arctan(1/x) #> (autre appel récursif)
+% else:
+% return sum( (-1)**k/(2*k+1)*x**(2*k+1) for k in range(n) )
+% \end{Piton}
+% \end{Verbatim}
+% \endgroup
+%
+%
+%
+% \begingroup
+% \PitonOptions{background-color=gray!10,left-margin = auto, line-numbers}
+% \begin{Piton}
+% def arctan(x,n=10):
+% if x < 0:
+% return -arctan(-x) #> (appel récursif)
+% elif x > 1:
+% return pi/2 - arctan(1/x) #> (autre appel récursif)
+% else:
+% return sum( (-1)**k/(2*k+1)*x**(2*k+1) for k in range(n) )
+% \end{Piton}
+% \endgroup
+%
+%
+%
+% \bigskip
+% \subsection{Formatting of the LaTeX comments}
+%
+% \label{example-comments}
+%
+% It's possible to modify the style |Comment.LaTeX| (with |\SetPitonStyle|) in
+% order to display the LaTeX comments (which begin with |#>|) aligned on the
+% right margin.
+%
+%
+% \begingroup
+% \fvset{commandchars=\~\&\@,formatcom=\small\color{gray}}
+% \begin{Verbatim}
+% \PitonOptions{background-color=gray!10}
+% ~emphase&\SetPitonStyle{Comment.LaTeX = \hfill \normalfont\color{gray}}@
+% \begin{Piton}
+% def arctan(x,n=10):
+% if x < 0:
+% return -arctan(-x) #> appel récursif
+% elif x > 1:
+% return pi/2 - arctan(1/x) #> autre appel récursif
+% else:
+% return sum( (-1)**k/(2*k+1)*x**(2*k+1) for k in range(n) )
+% \end{Piton}
+% \end{Verbatim}
+% \endgroup
+%
+% \begingroup
+% \PitonOptions{background-color=gray!10}
+% \SetPitonStyle{Comment.LaTeX = \hfill \normalfont\color{gray}}
+% \begin{Piton}
+% def arctan(x,n=10):
+% if x < 0:
+% return -arctan(-x) #> appel récursif
+% elif x > 1:
+% return pi/2 - arctan(1/x) #> autre appel récursif
+% else:
+% return sum( (-1)**k/(2*k+1)*x**(2*k+1) for k in range(n) )
+% \end{Piton}
+% \endgroup
+%
+%
+% \vspace{1cm}
+% It's also possible to display these LaTeX comments in a kind of second column
+% by limiting the width of the Python code by an environment |{minipage}| of LaTeX.
+%
+%
+% \begingroup
+% \fvset{commandchars=\~\&\@,formatcom=\small\color{gray}}
+% \begin{Verbatim}
+% \PitonOptions{background-color=gray!10}
+% ~emphase&\NewDocumentCommand{\MyLaTeXCommand}{m}{\hfill \normalfont\itshape\rlap{\quad #1}}@
+% ~emphase&\SetPitonStyle{Comment.LaTeX = \MyLaTeXCommand}@
+% ~emphase&\begin{minipage}{12cm}@
+% \begin{Piton}
+% def arctan(x,n=10):
+% if x < 0:
+% return -arctan(-x) #> appel récursif
+% elif x > 1:
+% return pi/2 - arctan(1/x) #> autre appel récursif
+% else:
+% s = 0
+% for k in range(n):
+% s += (-1)**k/(2*k+1)*x**(2*k+1)
+% return s
+% \end{Piton}
+% ~emphase&\end{minipage}@
+% \end{Verbatim}
+% \endgroup
+%
+%
+%
+% \begingroup
+% \PitonOptions{background-color=gray!10}
+% \NewDocumentCommand{\MyLaTeXCommand}{m}{\hfill \normalfont\itshape\rlap{\quad #1}}
+% \SetPitonStyle{Comment.LaTeX = \MyLaTeXCommand}
+% \begin{minipage}{12cm}
+% \begin{Piton}
+% def arctan(x,n=10):
+% if x < 0:
+% return -arctan(-x) #> appel récursif
+% elif x > 1:
+% return pi/2 - arctan(1/x) #> autre appel récursif
+% else:
+% s = 0
+% for k in range(n):
+% s += (-1)**k/(2*k+1)*x**(2*k+1)
+% return s
+% \end{Piton}
+% \end{minipage}
+% \endgroup
+%
+%
+% \bigskip
+% \subsection{Notes in the listings}
+%
+% \label{notes-examples}
+%
+% In order to be able to extract the notes (which are typeset with the command
+% |\footnote|), the extension \pkg{piton} must be loaded with the key |footnote|
+% or the key |footenotehyper| as explained in the section \ref{footnote}
+% p.~\pageref{footnote}. In this document, the extension \pkg{piton} has been
+% loaded with the key |footnotehyper|.
+%
+% Of course, in an environment |{Piton}|, a command |\footnote| may appear only
+% within a LaTeX comment (which begins with |#>|). It's possible to have comments
+% which contain only that command |\footnote|. That's the case in the following example.
+%
+%
+%
+% \begingroup
+% \fvset{commandchars=\~\&\@,formatcom=\small\color{gray}}
+% \begin{Verbatim}
+% \PitonOptions{background-color=gray!10}
+% \begin{Piton}
+% def arctan(x,n=10):
+% if x < 0:
+% return -arctan(-x)~emphase&#>\footnote{First recursive call.}]@
+% elif x > 1:
+% return pi/2 - arctan(1/x)~emphase&#>\footnote{Second recursive call.}@
+% else:
+% return sum( (-1)**k/(2*k+1)*x**(2*k+1) for k in range(n) )
+% \end{Piton}
+% \end{Verbatim}
+% \endgroup
+%
+% \begingroup
+% \PitonOptions{background-color=gray!10}
+% \begin{Piton}
+% def arctan(x,n=10):
+% if x < 0:
+% return -arctan(-x)#>\footnote{First recursive call.}
+% elif x > 1:
+% return pi/2 - arctan(1/x)#>\footnote{Second recursive call.}
+% else:
+% return sum( (-1)**k/(2*k+1)*x**(2*k+1) for k in range(n) )
+% \end{Piton}
+% \endgroup
+%
+%
+% \vspace{1cm}
+%
+% If an environment |{Piton}| is used in an environment |{minipage}| of LaTeX,
+% the notes are composed, of course, at the foot of the environment
+% |{minipage}|. Recall that such |{minipage}| can't be broken by a page break.
+%
+%
+% \begingroup
+% \fvset{commandchars=\~\&\@,formatcom=\small\color{gray}}
+% \begin{Verbatim}
+% \PitonOptions{background-color=gray!10}
+% \emphase\begin{minipage}{\linewidth}
+% \begin{Piton}
+% def arctan(x,n=10):
+% if x < 0:
+% return -arctan(-x)~emphase&#>\footnote{First recursive call.}@
+% elif x > 1:
+% return pi/2 - arctan(1/x)~emphase&#>\footnote{Second recursive call.}@
+% else:
+% return sum( (-1)**k/(2*k+1)*x**(2*k+1) for k in range(n) )
+% \end{Piton}
+% \end{minipage}
+% \end{Verbatim}
+% \endgroup
+%
+% \begingroup
+% \PitonOptions{background-color=gray!10}
+% \begin{minipage}{\linewidth}
+% \begin{Piton}
+% def arctan(x,n=10):
+% if x < 0:
+% return -arctan(-x)#>\footnote{First recursive call.}
+% elif x > 1:
+% return pi/2 - arctan(1/x)#>\footnote{Second recursive call.}
+% else:
+% return sum( (-1)**k/(2*k+1)*x**(2*k+1) for k in range(n) )
+% \end{Piton}
+% \end{minipage}
+% \endgroup
+%
+%
+% \vspace{1cm}
+% If we embed an environment |{Piton}| in an environment |{minipage}|
+% (typically in order to limit the width of a colored background), it's
+% necessary to embed the whole environment |{minipage}| in an environment
+% |{savenotes}| (of \pkg{footnote} or \pkg{footnotehyper}) in order to have the
+% footnotes composed at the bottom of the page.
+%
+% \begingroup
+% \fvset{commandchars=\~\&\@,formatcom=\small\color{gray}}
+% \begin{Verbatim}
+% \PitonOptions{background-color=gray!10}
+% ~emphase&\begin{savenotes}@
+% \begin{minipage}{13cm}
+% \begin{Piton}
+% def arctan(x,n=10):
+% if x < 0:
+% return -arctan(-x)~emphase&#>\footnote{First recursive call.}@
+% elif x > 1:
+% return pi/2 - arctan(1/x)~emphase&#>\footnote{Second recursive call.}@
+% else:
+% return sum( (-1)**k/(2*k+1)*x**(2*k+1) for k in range(n) )
+% \end{Piton}
+% \end{minipage}
+% ~emphase&\end{savenotes}@
+% \end{Verbatim}
+% \endgroup
+%
+%
+%
+% \begin{savenotes}
+% \PitonOptions{background-color=gray!10}
+% \begin{minipage}{13cm}
+% \begin{Piton}
+% def arctan(x,n=10):
+% if x < 0:
+% return -arctan(-x)#>\footnote{First recursive call.}
+% elif x > 1:
+% return pi/2 - arctan(1/x)#>\footnote{Second recursive call.}
+% else:
+% return sum( (-1)**k/(2*k+1)*x**(2*k+1) for k in range(n) )
+% \end{Piton}
+% \end{minipage}
+% \end{savenotes}
+%
+% \bigskip
+%
+% \subsection{An example of tuning of the styles}
+%
+% The graphical styles have been presented in the section \ref{styles},
+% p.~\pageref{styles}.
+%
+% \smallskip
+% We present now an example of tuning of these styles adapted to the documents
+% in black and white. We use the font \emph{DejaVu Sans Mono}\footnote{See:
+% \url{https://dejavu-fonts.github.io}} specified by the command |\setmonofont| of
+% \pkg{fontspec}.
+%
+% That tuning uses the command |\highLight| of \pkg{lua-ul} (that package
+% requires itself the package \pkg{luacolor}).
+%
+% \begin{Verbatim}
+% \setmonofont[Scale=0.85]{DejaVu Sans Mono}
+%
+% \SetPitonStyle
+% {
+% Number = ,
+% String = \itshape ,
+% String.Doc = \color{gray} \slshape ,
+% Operator = ,
+% Operator.Word = \bfseries ,
+% Name.Builtin = ,
+% Name.Function = \bfseries \highLight[gray!20] ,
+% Comment = \color{gray} ,
+% Comment.LaTeX = \normalfont \color{gray},
+% Keyword = \bfseries ,
+% Name.Namespace = ,
+% Name.Class = ,
+% Name.Type = ,
+% InitialValues = \color{gray}
+% }
+% \end{Verbatim}
+%
+%
+% \begingroup
+%
+% \setmonofont[Scale=0.85]{DejaVu Sans Mono}
+%
+% \PitonOptions{splittable}
+%
+% \SetPitonStyle
+% {
+% Number = ,
+% String = \itshape ,
+% String.Doc = \color{gray} \slshape ,
+% Operator.Word = \bfseries ,
+% Operator = ,
+% Name.Builtin = ,
+% Name.Function = \bfseries \highLight[gray!20] ,
+% Comment = \color{gray} ,
+% Comment.LaTeX = \normalfont \color{gray} ,
+% Keyword = \bfseries ,
+% Name.Namespace = ,
+% Name.Class = ,
+% Name.Type = ,
+% InitialValues = \color{gray}
+% }
+%
+%
+% \bigskip
+%
+% \begin{Piton}
+% from math import pi
+%
+% def arctan(x,n=10):
+% """Compute the mathematical value of arctan(x)
+%
+% n is the number of terms in the sum
+% """
+% if x < 0:
+% return -arctan(-x) # appel récursif
+% elif x > 1:
+% return pi/2 - arctan(1/x)
+% #> (we have used that $\arctan(x)+\arctan(1/x)=\pi/2$ for $x>0$)
+% else:
+% s = 0
+% for k in range(n):
+% s += (-1)**k/(2*k+1)*x**(2*k+1)
+% return s
+% \end{Piton}
+%
+% \endgroup
+%
+% \subsection{Use with pyluatex}
+%
+% The package \pkg{pyluatex} is an extension which allows the execution of some
+% Python code from |lualatex| (provided that Python is installed on the machine
+% and that the compilation is done with |lualatex| and |--shell-escape|).
+%
+% Here is, for example, an environment |{PitonExecute}| which formats a Python
+% listing (with \pkg{piton}) but display also the output of the execution of the
+% code with Python (for technical reasons, the |!| is mandatory in the signature
+% of the environment).
+%
+%
+% \begin{Verbatim}
+% \ExplSyntaxOn
+% \NewDocumentEnvironment { ~emphase#PitonExecute@ } { ! O { } } % the ! is mandatory
+% {
+% \PyLTVerbatimEnv
+% \begin{pythonq}
+% }
+% {
+% \end{pythonq}
+% \directlua
+% {
+% tex.print("\\PitonOptions{~#1}")
+% tex.print("\\begin{Piton}")
+% tex.print(pyluatex.get_last_code())
+% tex.print("\\end{Piton}")
+% tex.print("")
+% }
+% \begin{center}
+% \directlua{tex.print(pyluatex.get_last_output())}
+% \end{center}
+% }
+% \ExplSyntaxOff
+% \end{Verbatim}
+%
+% \ExplSyntaxOn
+% \NewDocumentEnvironment { PitonExecute } { ! O { } }
+% {
+% \PyLTVerbatimEnv
+% \begin{pythonq}
+% }
+% {
+% \end{pythonq}
+% \directlua
+% {
+% tex.print("\\PitonOptions{#1}")
+% tex.print("\\begin{Piton}")
+% tex.print(pyluatex.get_last_code())
+% tex.print("\\end{Piton}")
+% tex.print("")
+% }
+% \begin{center}
+% \directlua{tex.print(pyluatex.get_last_output())}
+% \end{center}
+% }
+% \ExplSyntaxOff
+%
+% This environment |{PitonExecute}| takes in as optional argument (between
+% square brackets) the options of the command |\PitonOptions|.
+%
+%
+% \bigskip
+% \clearpage
+%
+% \section{Implementation}
+%
+% \subsection{Introduction}
+%
+% The main job of the package \pkg{piton} is to take in as input a Python
+% listing and to send back to LaTeX as output that code \emph{with interlaced LaTeX
+% instructions of formatting}.
+%
+% In fact, all that job is done by a \textsc{lpeg} called |python|. That
+% \textsc{lpeg}, when matched against the string of a Python listing,
+% returns as capture a Lua table containing data to send to LaTeX.
+% The only thing to do after will be to apply |tex.tprint| to each element of
+% that table.\footnote{Recall that |tex.tprint| takes in as argument a Lua table whose
+% first component is a ``catcode table'' and the second element a string. The
+% string will be sent to LaTeX with the regime of catcodes specified by the
+% catcode table. If no catcode table is provided, the standard catcodes of LaTeX
+% will be used.}
+%
+% \bigskip
+% Consider, for example, the following Python code:
+%
+% \begin{Piton}
+% def parity(x):
+% return x%2
+% \end{Piton}
+%
+% The capture returned by the \pkg{lpeg} |python| against that code is the
+% Lua table containing the following elements :
+%
+% \bigskip
+% \begin{minipage}{\linewidth}
+% \color{gray}
+%
+% |{ "\\__piton_begin_line:" }|\footnote{Each line of the Python listings will
+% be encapsulated in a pair: \texttt{\textbackslash_@@_begin_line:} --
+% \texttt{\textbackslash@@_end_line:}. The token
+% \texttt{\textbackslash@@_end_line:} must be explicit because it will be used as
+% marker in order to delimit the argument of the command \texttt{\textbackslash
+% @@\_begin\_line:}. Both tokens \texttt{\textbackslash_@@_begin_line:} and
+% \texttt{\textbackslash@@_end_line:} will be nullified in the command
+% \texttt{\textbackslash piton} (since there can't be lines breaks in the
+% argument of a command \texttt{\textbackslash piton}).}
+%
+% \texttt{\{ "\{\textbackslash PitonStyle\{Keyword\}\{" \}}\footnote{The
+% lexical elements of Python for which we have a \pkg{piton} style will be
+% formatted via the use of the command \texttt{\textbackslash PitonStyle}.
+% Such an element is typeset in LaTeX via the syntax \texttt{\{\textbackslash
+% PitonStyle\{\textsl{style}\}\{...\}\}} because the instructions inside an \texttt{\textbackslash
+% PitonStyle} may be both semi-global declarations like
+% \texttt{\textbackslash bfseries} and commands with one argument like
+% \texttt{\textbackslash fbox}.}
+%
+% \texttt{\{
+% luatexbase.catcodetables.CatcodeTableOther\footnote{\texttt{luatexbase.catcodetables.CatcodeTableOther} is a mere number which corresponds to the ``catcode table'' whose all characters have the catcode ``other'' (which means that they will be typeset by LaTeX verbatim).}, "def" \} }
+%
+% |{ "}}" }|
+%
+% |{ luatexbase.catcodetables.CatcodeTableOther, " " }|
+%
+% |{ "{\PitonStyle{Name.Function}{" }|
+%
+% |{ luatexbase.catcodetables.CatcodeTableOther, "parity" }|
+%
+% |{ "}}" }|
+%
+% |{ luatexbase.catcodetables.CatcodeTableOther, "(" }|
+%
+% |{ luatexbase.catcodetables.CatcodeTableOther, "x" }|
+%
+% |{ luatexbase.catcodetables.CatcodeTableOther, ")" }|
+%
+% |{ luatexbase.catcodetables.CatcodeTableOther, ":" }|
+%
+% |{ "\\__piton_end_line: \\__piton_newline: \\__piton_begin_line:" }|
+%
+% |{ luatexbase.catcodetables.CatcodeTableOther, " " }|
+%
+% |{ "{\PitonStyle{Keyword}{" }|
+%
+% |{ luatexbase.catcodetables.CatcodeTableOther, "return" }|
+%
+% |{ "}}" }|
+%
+% |{ luatexbase.catcodetables.CatcodeTableOther, " " }|
+%
+% |{ luatexbase.catcodetables.CatcodeTableOther, "x" }|
+%
+% |{ "{\PitonStyle{Operator}{" }|
+%
+% |{ luatexbase.catcodetables.CatcodeTableOther, "&" }|
+%
+% |{ "}}" }|
+%
+% |{ "{\PitonStyle{Number}{" }|
+%
+% |{ luatexbase.catcodetables.CatcodeTableOther, "2" }|
+%
+% |{ "}}" }|
+%
+% |{ "\\__piton_end_line:" }|
+%
+% \end{minipage}
+%
+% \bigskip
+% We give now the LaTeX code which is sent back by Lua to TeX (we have written
+% on several lines for legibility but no character |\r| will be sent to LaTeX). The
+% characters which are greyed-out are sent to LaTeX with the catcode ``other''
+% (=12). All the others characters are sent with the regime of catcodes of L3
+% (as set by |\ExplSyntaxOn|)
+%
+%
+% \begingroup
+% \def\gbox#1{\colorbox{gray!20}{\strut #1}}
+% \setlength{\fboxsep}{1pt}
+%
+% \begin{Verbatim*}[formatcom = \color{black}]
+% \__piton_begin_line:{\PitonStyle{Keyword}{~gbox#def@}}
+% ~gbox# @{\PitonStyle{Name.Function}{~gbox#parity@}}~gbox#(x):@\__piton_end_line:\__piton_newline:
+% \__piton_begin_line:~gbox# @{\PitonStyle{Keyword}{~gbox#return@}}
+% ~gbox# x@{\PitonStyle{Operator}{~gbox#%@}}{\PitonStyle{Number}{~gbox#2@}}\__piton_end_line:
+% \end{Verbatim*}
+% \endgroup
+%
+%
+%
+%
+% \subsection{The L3 part of the implementation}
+%
+% \subsubsection{Declaration of the package}
+% \begin{macrocode}
+\NeedsTeXFormat{LaTeX2e}
+\RequirePackage{l3keys2e}
+\ProvidesExplPackage
+ {piton}
+ {\myfiledate}
+ {\myfileversion}
+ {Highlight Python codes with LPEG on LuaLaTeX}
+% \end{macrocode}
+%
+% \bigskip
+% \begin{macrocode}
+\msg_new:nnn { piton } { LuaLaTeX~mandatory }
+ {
+ LuaLaTeX~is~mandatory.\\
+ The~package~'piton'~requires~the~engine~LuaLaTeX.\\
+ \str_if_eq:VnT \c_sys_jobname_str { output }
+ { If~you~use~Overleaf,~you~can~switch~to~LuaLaTeX~in~the~"Menu". \\}
+ If~you~go~on,~the~package~'piton'~won't~be~loaded.
+ }
+\sys_if_engine_luatex:F { \msg_critical:nn { piton } { LuaLaTeX~mandatory } }
+% \end{macrocode}
+%
+% \bigskip
+% \begin{macrocode}
+\RequirePackage { luatexbase }
+% \end{macrocode}
+%
+% \bigskip
+% The boolean |\c_@@_footnotehyper_bool| will indicate if the option
+% |footnotehyper| is used.
+% \begin{macrocode}
+\bool_new:N \c_@@_footnotehyper_bool
+% \end{macrocode}
+%
+% \medskip
+% The boolean |\c_@@_footnote_bool| will indicate if the option |footnote| is
+% used, but quicky, it will also be set to |true| if the option |footnotehyper|
+% is used.
+% \begin{macrocode}
+\bool_new:N \c_@@_footnote_bool
+% \end{macrocode}
+%
+% \medskip
+% The following boolean corresponds to the key |math-comments| (only at load-time).
+% \begin{macrocode}
+\bool_new:N \c_@@_math_comments_bool
+% \end{macrocode}
+%
+% \medskip
+% The following boolean corresponds to the key |beamer|.
+% \begin{macrocode}
+\bool_new:N \c_@@_beamer_bool
+% \end{macrocode}
+%
+% \bigskip
+% We define a set of keys for the options at load-time.
+% \begin{macrocode}
+\keys_define:nn { piton / package }
+ {
+ footnote .bool_set:N = \c_@@_footnote_bool ,
+ footnotehyper .bool_set:N = \c_@@_footnotehyper_bool ,
+ escape-inside .tl_set:N = \c_@@_escape_inside_tl ,
+ escape-inside .initial:n = ,
+ comment-latex .code:n = { \lua_now:n { comment_latex = "#1" } } ,
+ comment-latex .value_required:n = true ,
+ math-comments .bool_set:N = \c_@@_math_comments_bool ,
+ math-comments .default:n = true ,
+ beamer .bool_set:N = \c_@@_beamer_bool ,
+ beamer .default:n = true ,
+ unknown .code:n = \msg_error:nn { piton } { unknown~key~for~package }
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\msg_new:nnn { piton } { unknown~key~for~package }
+ {
+ Unknown~key.\\
+ You~have~used~the~key~'\l_keys_key_str'~but~the~only~keys~available~here~
+ are~'beamer',~'comment-latex',~'escape-inside',~'footnote',~'footnotehyper'~and~
+ 'math-comments'.~Other~keys~are~available~in~\token_to_str:N \PitonOptions.\\
+ That~key~will~be~ignored.
+ }
+% \end{macrocode}
+%
+% \bigskip
+% We process the options provided by the user at load-time.
+% \begin{macrocode}
+\ProcessKeysOptions { piton / package }
+% \end{macrocode}
+%
+% \bigskip
+% \begin{macrocode}
+\begingroup
+\cs_new_protected:Npn \@@_set_escape_char:nn #1 #2
+ {
+ \lua_now:n { piton_begin_escape = "#1" }
+ \lua_now:n { piton_end_escape = "#2" }
+ }
+\cs_generate_variant:Nn \@@_set_escape_char:nn { x x }
+\@@_set_escape_char:xx
+ { \tl_head:V \c_@@_escape_inside_tl }
+ { \tl_tail:V \c_@@_escape_inside_tl }
+\endgroup
+% \end{macrocode}
+%
+% \bigskip
+% \begin{macrocode}
+\@ifclassloaded { beamer } { \bool_set_true:N \c_@@_beamer_bool } { }
+\bool_if:NT \c_@@_beamer_bool { \lua_now:n { piton_beamer = true } }
+% \end{macrocode}
+%
+% \bigskip
+% \begin{macrocode}
+\hook_gput_code:nnn { begindocument } { . }
+ {
+ \@ifpackageloaded { xcolor }
+ { }
+ { \msg_fatal:nn { piton } { xcolor~not~loaded } }
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\msg_new:nnn { piton } { xcolor~not~loaded }
+ {
+ xcolor~not~loaded \\
+ The~package~'xcolor'~is~required~by~'piton'.\\
+ This~error~is~fatal.
+ }
+% \end{macrocode}
+%
+%
+% \begin{macrocode}
+\msg_new:nnn { piton } { footnote~with~footnotehyper~package }
+ {
+ Footnote~forbidden.\\
+ You~can't~use~the~option~'footnote'~because~the~package~
+ footnotehyper~has~already~been~loaded.~
+ If~you~want,~you~can~use~the~option~'footnotehyper'~and~the~footnotes~
+ within~the~environments~of~piton~will~be~extracted~with~the~tools~
+ of~the~package~footnotehyper.\\
+ If~you~go~on,~the~package~footnote~won't~be~loaded.
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\msg_new:nnn { piton } { footnotehyper~with~footnote~package }
+ {
+ You~can't~use~the~option~'footnotehyper'~because~the~package~
+ footnote~has~already~been~loaded.~
+ If~you~want,~you~can~use~the~option~'footnote'~and~the~footnotes~
+ within~the~environments~of~piton~will~be~extracted~with~the~tools~
+ of~the~package~footnote.\\
+ If~you~go~on,~the~package~footnotehyper~won't~be~loaded.
+ }
+% \end{macrocode}
+%
+% \medskip
+% \begin{macrocode}
+\bool_if:NT \c_@@_footnote_bool
+ {
+% \end{macrocode}
+% The class \cls{beamer} has its own system to extract footnotes and that's why
+% we have nothing to do if \cls{beamer} is used.
+% \begin{macrocode}
+ \@ifclassloaded { beamer }
+ { \bool_set_false:N \c_@@_footnote_bool }
+ {
+ \@ifpackageloaded { footnotehyper }
+ { \@@_error:n { footnote~with~footnotehyper~package } }
+ { \usepackage { footnote } }
+ }
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\bool_if:NT \c_@@_footnotehyper_bool
+ {
+% \end{macrocode}
+% The class \cls{beamer} has its own system to extract footnotes and that's why
+% we have nothing to do if \cls{beamer} is used.
+% \begin{macrocode}
+ \@ifclassloaded { beamer }
+ { \bool_set_false:N \c_@@_footnote_bool }
+ {
+ \@ifpackageloaded { footnote }
+ { \@@_error:n { footnotehyper~with~footnote~package } }
+ { \usepackage { footnotehyper } }
+ \bool_set_true:N \c_@@_footnote_bool
+ }
+ }
+% \end{macrocode}
+% The flag |\c_@@_footnote_bool| is raised and so, we will only have to test
+% |\c_@@_footnote_bool| in order to know if we have to insert an environment
+% |{savenotes}|.
+%
+% \bigskip
+% \subsubsection{Parameters and technical definitions}
+%
+% The following string will contain the name of the informatic language
+% considered (the initial value is |python|).
+%
+% \begin{macrocode}
+\str_new:N \l_@@_language_str
+\str_set:Nn \l_@@_language_str { python }
+% \end{macrocode}
+%
+% We will compute (with Lua) the numbers of lines of the Python code and store
+% it in the following counter.
+% \begin{macrocode}
+\int_new:N \l_@@_nb_lines_int
+% \end{macrocode}
+%
+% The same for the number of non-empty lines of the Python codes.
+% \begin{macrocode}
+\int_new:N \l_@@_nb_non_empty_lines_int
+% \end{macrocode}
+%
+% The following counter will be used to count the lines during the composition.
+% It will count all the lines, empty or not empty. It won't be used to print the
+% numbers of the lines.
+% \begin{macrocode}
+\int_new:N \g_@@_line_int
+% \end{macrocode}
+%
+% \medskip
+% The following token list will contains the (potential) informations to write
+% on the |aux| (to be used in the next compilation).
+% \begin{macrocode}
+\tl_new:N \g_@@_aux_tl
+% \end{macrocode}
+%
+% \medskip
+% The following counter corresponds to the key |splittable| of |\PitonOptions|.
+% If the value of |\l_@@_splittable_int| is equal to $n$, then no line break can
+% occur within the first $n$~lines or the last $n$~lines of the listings.
+% \begin{macrocode}
+\int_new:N \l_@@_splittable_int
+% \end{macrocode}
+%
+% \medskip
+% An initial value of |splittable| equal to 100 is equivalent to say that the
+% environments |{Piton}| are unbreakable.
+% \begin{macrocode}
+\int_set:Nn \l_@@_splittable_int { 100 }
+% \end{macrocode}
+%
+% \medskip
+% The following string corresponds to the key |background-color| of |\PitonOptions|.
+% \begin{macrocode}
+\clist_new:N \l_@@_bg_color_clist
+% \end{macrocode}
+%
+% \medskip
+% The package \pkg{piton} will also detect the lines of code which correspond to
+% the user input in a Python console, that is to say the lines of code beginning
+% with |>>>| and |...|. It's possible, with the key |prompt-background-color|,
+% to require a background for these lines of code (and the other lines of code
+% will have the standard background color specified by |background-color|).
+% \begin{macrocode}
+\tl_new:N \l_@@_prompt_bg_color_tl
+% \end{macrocode}
+%
+% \medskip
+% We will compute the maximal width of the lines of an environment |{Piton}| in
+% |\g_@@_width_dim|. We need a global variable because, when the key |footnote|
+% is in force, each line when be composed in an environment |{savenotes}| and
+% (when |slim| is in force) we need to exit |\g_@@_width_dim| from that
+% environment.
+% \begin{macrocode}
+\dim_new:N \g_@@_width_dim
+% \end{macrocode}
+% The value of that dimension as written on the |aux| file will be stored in
+% |\l_@@_width_on_aux_dim|.
+% \begin{macrocode}
+\dim_new:N \l_@@_width_on_aux_dim
+% \end{macrocode}
+%
+% \medskip
+% We will count the environments |{Piton}| (and, in fact, also the commands
+% |\PitonInputFile|, despite the name |\g_@@_env_int|).
+% \begin{macrocode}
+\int_new:N \g_@@_env_int
+% \end{macrocode}
+%
+% \medskip
+% The following boolean corresponds to the key |show-spaces|.
+% \begin{macrocode}
+\bool_new:N \l_@@_show_spaces_bool
+% \end{macrocode}
+%
+% \medskip
+% The following booleans correspond to the keys |break-lines| and
+% |indent-broken-lines|.
+% \begin{macrocode}
+\bool_new:N \l_@@_break_lines_in_Piton_bool
+\bool_new:N \l_@@_indent_broken_lines_bool
+% \end{macrocode}
+%
+% \medskip
+% The following token list corresponds to the key |continuation-symbol|.
+% \begin{macrocode}
+\tl_new:N \l_@@_continuation_symbol_tl
+\tl_set:Nn \l_@@_continuation_symbol_tl { + }
+% \end{macrocode}
+%
+% \medskip
+% \begin{macrocode}
+% The following token list corresponds to the key
+% |continuation-symbol-on-indentation|. The name has been shorten to |csoi|.
+\tl_new:N \l_@@_csoi_tl
+\tl_set:Nn \l_@@_csoi_tl { $ \hookrightarrow \; $ }
+% \end{macrocode}
+%
+% \medskip
+% The following token list corresponds to the key |end-of-broken-line|.
+% \begin{macrocode}
+\tl_new:N \l_@@_end_of_broken_line_tl
+\tl_set:Nn \l_@@_end_of_broken_line_tl { \hspace*{0.5em} \textbackslash }
+% \end{macrocode}
+%
+% \medskip
+% The following boolean corresponds to the key |break-lines-in-piton|.
+% \begin{macrocode}
+\bool_new:N \l_@@_break_lines_in_piton_bool
+% \end{macrocode}
+%
+% \medskip
+% The following boolean corresponds to the key |slim| of |\PitonOptions|.
+% \begin{macrocode}
+\bool_new:N \l_@@_slim_bool
+% \end{macrocode}
+%
+% \medskip
+% The following dimension corresponds to the key |left-margin| of |\PitonOptions|.
+% \begin{macrocode}
+\dim_new:N \l_@@_left_margin_dim
+% \end{macrocode}
+%
+% \medskip
+% The following boolean will be set when the key |left-margin=auto|
+% is used.
+% \begin{macrocode}
+\bool_new:N \l_@@_left_margin_auto_bool
+% \end{macrocode}
+%
+% \medskip
+% The following dimension corresponds to the key |numbers-sep| of
+% |\PitonOptions|.
+% \begin{macrocode}
+\dim_new:N \l_@@_numbers_sep_dim
+\dim_set:Nn \l_@@_numbers_sep_dim { 0.7 em }
+% \end{macrocode}
+%
+% \medskip
+% The tabulators will be replaced by the content of the following token list.
+% \begin{macrocode}
+\tl_new:N \l_@@_tab_tl
+% \end{macrocode}
+%
+% \medskip
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_set_tab_tl:n #1
+ {
+ \tl_clear:N \l_@@_tab_tl
+ \prg_replicate:nn { #1 }
+ { \tl_put_right:Nn \l_@@_tab_tl { ~ } }
+ }
+\@@_set_tab_tl:n { 4 }
+% \end{macrocode}
+%
+% \medskip
+% The following integer corresponds to the key |gobble|.
+% \begin{macrocode}
+\int_new:N \l_@@_gobble_int
+% \end{macrocode}
+%
+% \medskip
+% \begin{macrocode}
+\tl_new:N \l_@@_space_tl
+\tl_set:Nn \l_@@_space_tl { ~ }
+% \end{macrocode}
+%
+%
+% \medskip
+% At each line, the following counter will count the spaces at the beginning.
+% \begin{macrocode}
+\int_new:N \g_@@_indentation_int
+% \end{macrocode}
+%
+% \medskip
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_an_indentation_space:
+ { \int_gincr:N \g_@@_indentation_int }
+% \end{macrocode}
+%
+% \medskip
+% The following command |\@@_beamer_command:n| executes the argument
+% corresponding to its argument but also stores it in |\l_@@_beamer_command_str|.
+% That string is used only in the error message ``|cr~not~allowed|'' raised when
+% there is a carriage return in the mandatory argument of that command.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_beamer_command:n #1
+ {
+ \str_set:Nn \l_@@_beamer_command_str { #1 }
+ \use:c { #1 }
+ }
+% \end{macrocode}
+%
+% \bigskip
+% In the environment |{Piton}|, the command |\label| will be linked to the
+% following command.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_label:n #1
+ {
+ \bool_if:NTF \l_@@_line_numbers_bool
+ {
+ \@bsphack
+ \protected@write \@auxout { }
+ {
+ \string \newlabel { #1 }
+ {
+% \end{macrocode}
+% Remember that the content of a line is typeset in a box \emph{before} the
+% composition of the potential number of line.
+% \begin{macrocode}
+ { \int_eval:n { \g_@@_visual_line_int + 1 } }
+ { \thepage }
+ }
+ }
+ \@esphack
+ }
+ { \msg_error:nn { piton } { label~with~lines~numbers } }
+ }
+% \end{macrocode}
+%
+%
+% \bigskip
+% The following commands are a easy way to insert safely braces (|{| and |}|) in
+% the TeX flow.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_open_brace:
+ { \directlua { piton.open_brace() } }
+\cs_new_protected:Npn \@@_close_brace:
+ { \directlua { piton.close_brace() } }
+% \end{macrocode}
+%
+% \bigskip
+% The following token list will be evaluated at the beginning of
+% |\@@_begin_line:|... |\@@_end_line:| and cleared at the end. It will be used
+% by LPEG acting between the lines of the Python code in order to add
+% instructions to be executed at the beginning of the line.
+% \begin{macrocode}
+\tl_new:N \g_@@_begin_line_hook_tl
+% \end{macrocode}
+%
+% \smallskip
+% For example, the LPEG |Prompt| will trigger the following command which will
+% insert an instruction in the hook |\g_@@_begin_line_hook| to specify that a
+% background must be inserted to the current line of code.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_prompt:
+ {
+ \tl_gset:Nn \g_@@_begin_line_hook_tl
+ { \clist_set:NV \l_@@_bg_color_clist \l_@@_prompt_bg_color_tl }
+ }
+% \end{macrocode}
+%
+%
+% \bigskip
+% You will keep track of the current style for the treatment of EOL (for the
+% multi-line syntactic elements).
+% \begin{macrocode}
+\clist_new:N \g_@@_current_style_clist
+\clist_set:Nn \g_@@_current_style_clist { __end }
+% \end{macrocode}
+% The element |__end| is an arbitrary syntactic marker.
+%
+% \medskip
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_close_current_styles:
+ {
+ \int_set:Nn \l_tmpa_int { \clist_count:N \g_@@_current_style_clist - 1 }
+ \exp_args:NV \@@_close_n_styles:n \l_tmpa_int
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_close_n_styles:n #1
+ {
+ \int_compare:nNnT { #1 } > 0
+ {
+ \@@_close_brace:
+ \@@_close_brace:
+ \@@_close_n_styles:n { #1 - 1 }
+ }
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_open_current_styles:
+ { \exp_last_unbraced:NV \@@_open_styles:w \g_@@_current_style_clist , }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_open_styles:w #1 ,
+ {
+ \tl_if_eq:nnF { #1 } { __end }
+ { \@@_open_brace: #1 \@@_open_brace: \@@_open_styles:w }
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_pop_style:
+ {
+ \clist_greverse:N \g_@@_current_style_clist
+ \clist_gpop:NN \g_@@_current_style_clist \l_tmpa_tl
+ \clist_gpop:NN \g_@@_current_style_clist \l_tmpa_tl
+ \clist_gpush:Nn \g_@@_current_style_clist { __end }
+ \clist_greverse:N \g_@@_current_style_clist
+ }
+% \end{macrocode}
+%
+% \medskip
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_push_style:n #1
+ {
+ \clist_greverse:N \g_@@_current_style_clist
+ \clist_gpop:NN \g_@@_current_style_clist \l_tmpa_tl
+ \clist_gpush:Nn \g_@@_current_style_clist { #1 }
+ \clist_gpush:Nn \g_@@_current_style_clist { __end }
+ \clist_greverse:N \g_@@_current_style_clist
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_push_and_exec:n #1
+ {
+ \@@_push_style:n { #1 }
+ \@@_open_brace: #1 \@@_open_brace:
+ }
+% \end{macrocode}
+%
+% \bigskip
+% \subsubsection{Treatment of a line of code}
+%
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_replace_spaces:n #1
+ {
+ \tl_set:Nn \l_tmpa_tl { #1 }
+ \bool_if:NTF \l_@@_show_spaces_bool
+ { \regex_replace_all:nnN { \x20 } { ⣠} \l_tmpa_tl } % U+2423
+ {
+% \end{macrocode}
+% If the key |break-lines-in-Piton| is in force, we replace all the characters
+% U+0020 (that is to say the spaces) by |\@@_breakable_space:|. Remark that,
+% except the spaces inserted in the LaTeX comments (and maybe in the math
+% comments), all these spaces are of catcode ``other'' (=12) and are
+% unbreakable.
+% \begin{macrocode}
+ \bool_if:NT \l_@@_break_lines_in_Piton_bool
+ {
+ \regex_replace_all:nnN
+ { \x20 }
+ { \c { @@_breakable_space: } }
+ \l_tmpa_tl
+ }
+ }
+ \l_tmpa_tl
+ }
+\cs_generate_variant:Nn \@@_replace_spaces:n { x }
+% \end{macrocode}
+%
+% \bigskip
+% In the contents provided by Lua, each line of the Python code will be
+% surrounded by |\@@_begin_line:| and |\@@_end_line:|. |\@@_begin_line:| is a
+% LaTeX command that we will define now but |\@@_end_line:| is only a syntactic
+% marker that has no definition.
+%
+% \begin{macrocode}
+\cs_set_protected:Npn \@@_begin_line: #1 \@@_end_line:
+ {
+ \group_begin:
+ \g_@@_begin_line_hook_tl
+ \int_gzero:N \g_@@_indentation_int
+% \end{macrocode}
+%
+%
+% Be careful: there is curryfication in the following lines.
+% \begin{macrocode}
+ \bool_if:NTF \l_@@_slim_bool
+ { \hcoffin_set:Nn \l_tmpa_coffin }
+ {
+ \clist_if_empty:NTF \l_@@_bg_color_clist
+ {
+ \vcoffin_set:Nnn \l_tmpa_coffin
+ { \dim_eval:n { \linewidth - \l_@@_left_margin_dim } }
+ }
+ {
+ \vcoffin_set:Nnn \l_tmpa_coffin
+ { \dim_eval:n { \linewidth - \l_@@_left_margin_dim - 0.5 em } }
+ }
+ }
+ {
+ \language = -1
+ \raggedright
+ \strut
+ \@@_replace_spaces:n { #1 }
+ \strut \hfil
+ }
+ \hbox_set:Nn \l_tmpa_box
+ {
+ \skip_horizontal:N \l_@@_left_margin_dim
+ \bool_if:NT \l_@@_line_numbers_bool
+ {
+ \bool_if:NF \l_@@_all_line_numbers_bool
+ { \tl_if_eq:nnF { #1 } { \PitonStyle {Prompt}{} } } % corrected 2023/04/10
+ \@@_print_number:
+ }
+ \clist_if_empty:NF \l_@@_bg_color_clist
+ {
+ \dim_compare:nNnT \l_@@_left_margin_dim = \c_zero_dim
+ {
+ \bool_if:NF \l_@@_left_margin_auto_bool
+ { \skip_horizontal:n { 0.5 em } }
+ }
+ }
+ \coffin_typeset:Nnnnn \l_tmpa_coffin T l \c_zero_dim \c_zero_dim
+ }
+% \end{macrocode}
+% We compute in |\g_@@_width_dim| the maximal width of the lines of the
+% environment.
+% \begin{macrocode}
+ \dim_compare:nNnT { \box_wd:N \l_tmpa_box } > \g_@@_width_dim
+ { \dim_gset:Nn \g_@@_width_dim { \box_wd:N \l_tmpa_box } }
+ \box_set_dp:Nn \l_tmpa_box { \box_dp:N \l_tmpa_box + 1.25 pt }
+ \box_set_ht:Nn \l_tmpa_box { \box_ht:N \l_tmpa_box + 1.25 pt }
+ \clist_if_empty:NTF \l_@@_bg_color_clist
+ { \box_use_drop:N \l_tmpa_box }
+ {
+ \vbox_top:n
+ {
+ \hbox:n
+ {
+ \@@_color:N \l_@@_bg_color_clist
+ \vrule height \box_ht:N \l_tmpa_box
+ depth \box_dp:N \l_tmpa_box
+ width \l_@@_width_on_aux_dim
+ }
+ \skip_vertical:n { - \box_ht_plus_dp:N \l_tmpa_box }
+ \box_set_wd:Nn \l_tmpa_box \l_@@_width_on_aux_dim
+ \box_use_drop:N \l_tmpa_box
+ }
+ }
+ \vspace { - 2.5 pt }
+ \group_end:
+ \tl_gclear:N \g_@@_begin_line_hook_tl
+ }
+% \end{macrocode}
+%
+% \bigskip
+% The command |\@@_color:N| will take in as argument a reference to a
+% comma-separated list of colors. A color will be picked by using the value of
+% |\g_@@_line_int| (modulo the number of colors in the list).
+% \begin{macrocode}
+\cs_set_protected:Npn \@@_color:N #1
+ {
+ \int_set:Nn \l_tmpa_int { \clist_count:N #1 }
+ \int_set:Nn \l_tmpb_int { \int_mod:nn \g_@@_line_int \l_tmpa_int + 1 }
+ \tl_set:Nx \l_tmpa_tl { \clist_item:Nn #1 \l_tmpb_int }
+ \tl_if_eq:NnTF \l_tmpa_tl { none }
+% \end{macrocode}
+% By setting |\l_@@_width_on_aux_dim| to zero, the colored rectangle will be
+% drawn with zero width and, thus, it will be a mere strut (and we need that strut).
+% \begin{macrocode}
+ { \dim_zero:N \l_@@_width_on_aux_dim }
+ { \exp_args:NV \@@_color_i:n \l_tmpa_tl }
+ }
+% \end{macrocode}
+%
+% The following command |\@@_color:n| will accept both the instruction
+% |\@@_color:n { red!15 }| and the instruction |\@@_color:n { [rgb]{0.9,0.9,0} }|.
+% \begin{macrocode}
+\cs_set_protected:Npn \@@_color_i:n #1
+ {
+ \tl_if_head_eq_meaning:nNTF { #1 } [
+ {
+ \tl_set:Nn \l_tmpa_tl { #1 }
+ \tl_set_rescan:Nno \l_tmpa_tl { } \l_tmpa_tl
+ \exp_last_unbraced:NV \color \l_tmpa_tl
+ }
+ { \color { #1 } }
+ }
+\cs_generate_variant:Nn \@@_color:n { V }
+% \end{macrocode}
+%
+% \bigskip
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_newline:
+ {
+ \int_gincr:N \g_@@_line_int
+ \int_compare:nNnT \g_@@_line_int > { \l_@@_splittable_int - 1 }
+ {
+ \int_compare:nNnT
+ { \l_@@_nb_lines_int - \g_@@_line_int } > \l_@@_splittable_int
+ {
+ \egroup
+ \bool_if:NT \c_@@_footnote_bool { \end { savenotes } }
+ \newline
+ \bool_if:NT \c_@@_footnote_bool { \begin { savenotes } }
+ \vtop \bgroup
+ }
+ }
+ }
+% \end{macrocode}
+%
+% \bigskip
+% \begin{macrocode}
+\cs_set_protected:Npn \@@_breakable_space:
+ {
+ \discretionary
+ { \hbox:n { \color { gray } \l_@@_end_of_broken_line_tl } }
+ {
+ \hbox_overlap_left:n
+ {
+ {
+ \normalfont \footnotesize \color { gray }
+ \l_@@_continuation_symbol_tl
+ }
+ \skip_horizontal:n { 0.3 em }
+ \clist_if_empty:NF \l_@@_bg_color_clist
+ { \skip_horizontal:n { 0.5 em } }
+ }
+ \bool_if:NT \l_@@_indent_broken_lines_bool
+ {
+ \hbox:n
+ {
+ \prg_replicate:nn { \g_@@_indentation_int } { ~ }
+ { \color { gray } \l_@@_csoi_tl }
+ }
+ }
+ }
+ { \hbox { ~ } }
+ }
+% \end{macrocode}
+%
+% \bigskip
+% \subsubsection{PitonOptions}
+%
+% \medskip
+% The following parameters correspond to the keys |line-numbers| and
+% |all-line-numbers|.
+% \begin{macrocode}
+\bool_new:N \l_@@_line_numbers_bool
+\bool_new:N \l_@@_all_line_numbers_bool
+% \end{macrocode}
+%
+% \medskip
+% The following flag corresponds to the key |resume|.
+% \begin{macrocode}
+\bool_new:N \l_@@_resume_bool
+% \end{macrocode}
+%
+% \bigskip
+% Be careful! The name of the following set of keys must be considered as
+% public! Hence, it should \emph{not} be changed.
+%
+% \begin{macrocode}
+\keys_define:nn { PitonOptions }
+ {
+ language .str_set:N = \l_@@_language_str ,
+ language .value_required:n = true ,
+ gobble .int_set:N = \l_@@_gobble_int ,
+ gobble .value_required:n = true ,
+ auto-gobble .code:n = \int_set:Nn \l_@@_gobble_int { -1 } ,
+ auto-gobble .value_forbidden:n = true ,
+ env-gobble .code:n = \int_set:Nn \l_@@_gobble_int { -2 } ,
+ env-gobble .value_forbidden:n = true ,
+ tabs-auto-gobble .code:n = \int_set:Nn \l_@@_gobble_int { -3 } ,
+ tabs-auto-gobble .value_forbidden:n = true ,
+ line-numbers .bool_set:N = \l_@@_line_numbers_bool ,
+ line-numbers .default:n = true ,
+ all-line-numbers .code:n =
+ \bool_set_true:N \l_@@_line_numbers_bool
+ \bool_set_true:N \l_@@_all_line_numbers_bool ,
+ all-line-numbers .value_forbidden:n = true ,
+ resume .bool_set:N = \l_@@_resume_bool ,
+ resume .value_forbidden:n = true ,
+ splittable .int_set:N = \l_@@_splittable_int ,
+ splittable .default:n = 1 ,
+ background-color .clist_set:N = \l_@@_bg_color_clist ,
+ background-color .value_required:n = true ,
+ prompt-background-color .tl_set:N = \l_@@_prompt_bg_color_tl ,
+ prompt-background-color .value_required:n = true ,
+ slim .bool_set:N = \l_@@_slim_bool ,
+ slim .default:n = true ,
+ left-margin .code:n =
+ \str_if_eq:nnTF { #1 } { auto }
+ {
+ \dim_zero:N \l_@@_left_margin_dim
+ \bool_set_true:N \l_@@_left_margin_auto_bool
+ }
+ { \dim_set:Nn \l_@@_left_margin_dim { #1 } } ,
+ left-margin .value_required:n = true ,
+ numbers-sep .dim_set:N = \l_@@_numbers_sep_dim ,
+ numbers-sep .value_required:n = true ,
+ tab-size .code:n = \@@_set_tab_tl:n { #1 } ,
+ tab-size .value_required:n = true ,
+ show-spaces .bool_set:N = \l_@@_show_spaces_bool ,
+ show-spaces .default:n = true ,
+ show-spaces-in-strings .code:n = \tl_set:Nn \l_@@_space_tl { ⣠} , % U+2423
+ show-spaces-in-strings .value_forbidden:n = true ,
+ break-lines-in-Piton .bool_set:N = \l_@@_break_lines_in_Piton_bool ,
+ break-lines-in-Piton .default:n = true ,
+ break-lines-in-piton .bool_set:N = \l_@@_break_lines_in_piton_bool ,
+ break-lines-in-piton .default:n = true ,
+ break-lines .meta:n = { break-lines-in-piton , break-lines-in-Piton } ,
+ break-lines .value_forbidden:n = true ,
+ indent-broken-lines .bool_set:N = \l_@@_indent_broken_lines_bool ,
+ indent-broken-lines .default:n = true ,
+ end-of-broken-line .tl_set:N = \l_@@_end_of_broken_line_tl ,
+ end-of-broken-line .value_required:n = true ,
+ continuation-symbol .tl_set:N = \l_@@_continuation_symbol_tl ,
+ continuation-symbol .value_required:n = true ,
+ continuation-symbol-on-indentation .tl_set:N = \l_@@_csoi_tl ,
+ continuation-symbol-on-indentation .value_required:n = true ,
+ unknown .code:n =
+ \msg_error:nn { piton } { Unknown~key~for~PitonOptions }
+ }
+% \end{macrocode}
+%
+%
+% \bigskip
+%
+% \bigskip
+% The argument of |\PitonOptions| is provided by curryfication.
+% \begin{macrocode}
+\NewDocumentCommand \PitonOptions { } { \keys_set:nn { PitonOptions } }
+% \end{macrocode}
+%
+% \bigskip
+% \subsubsection{The numbers of the lines}
+%
+% \medskip
+% The following counter will be used to count the lines in the code when the
+% user requires the numbers of the lines to be printed (with |line-numbers| or
+% |all-line-numbers|).
+%
+% \begin{macrocode}
+\int_new:N \g_@@_visual_line_int
+% \end{macrocode}
+%
+%
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_print_number:
+ {
+ \int_gincr:N \g_@@_visual_line_int
+ \hbox_overlap_left:n
+ {
+ { \color { gray } \footnotesize \int_to_arabic:n \g_@@_visual_line_int }
+ \skip_horizontal:N \l_@@_numbers_sep_dim
+ }
+ }
+% \end{macrocode}
+%
+%
+% \bigskip
+% \subsubsection{The command to write on the aux file}
+%
+%
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_write_aux:
+ {
+ \tl_if_empty:NF \g_@@_aux_tl
+ {
+ \iow_now:Nn \@mainaux { \ExplSyntaxOn }
+ \iow_now:Nx \@mainaux
+ {
+ \tl_gset:cn { c_@@_ \int_use:N \g_@@_env_int _ tl }
+ { \exp_not:V \g_@@_aux_tl }
+ }
+ \iow_now:Nn \@mainaux { \ExplSyntaxOff }
+ }
+ \tl_gclear:N \g_@@_aux_tl
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_width_to_aux:
+ {
+ \bool_if:NT \l_@@_slim_bool
+ {
+ \clist_if_empty:NF \l_@@_bg_color_clist
+ {
+ \tl_gput_right:Nx \g_@@_aux_tl
+ {
+ \dim_set:Nn \l_@@_width_on_aux_dim
+ { \dim_eval:n { \g_@@_width_dim + 0.5 em } }
+ }
+ }
+ }
+ }
+% \end{macrocode}
+%
+% \bigskip
+% \subsubsection{The main commands and environments for the final user}
+%
+% \bigskip
+% \begin{macrocode}
+\NewDocumentCommand { \piton } { }
+ { \peek_meaning:NTF \bgroup \@@_piton_standard \@@_piton_verbatim }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\NewDocumentCommand { \@@_piton_standard } { m }
+ {
+ \group_begin:
+ \ttfamily
+% \end{macrocode}
+% The following tuning of LuaTeX in order to avoid all break of lines on the
+% hyphens.
+% \begin{macrocode}
+ \automatichyphenmode = 1
+ \cs_set_eq:NN \\ \c_backslash_str
+ \cs_set_eq:NN \% \c_percent_str
+ \cs_set_eq:NN \{ \c_left_brace_str
+ \cs_set_eq:NN \} \c_right_brace_str
+ \cs_set_eq:NN \$ \c_dollar_str
+ \cs_set_eq:cN { ~ } \space
+ \cs_set_protected:Npn \@@_begin_line: { }
+ \cs_set_protected:Npn \@@_end_line: { }
+ \tl_set:Nx \l_tmpa_tl
+ {
+ \lua_now:e
+ { piton.ParseBis('\l_@@_language_str',token.scan_string()) }
+ { #1 }
+ }
+ \bool_if:NTF \l_@@_show_spaces_bool
+ { \regex_replace_all:nnN { \x20 } { ⣠} \l_tmpa_tl } % U+2423
+% \end{macrocode}
+% The following code replaces the characters U+0020 (spaces) by characters
+% U+0020 of catcode~10: thus, they become breakable by an end of line.
+% \begin{macrocode}
+ {
+ \bool_if:NT \l_@@_break_lines_in_piton_bool
+ { \regex_replace_all:nnN { \x20 } { \x20 } \l_tmpa_tl }
+ }
+ \l_tmpa_tl
+ \group_end:
+ }
+% \end{macrocode}
+%
+%
+% \begin{macrocode}
+\NewDocumentCommand { \@@_piton_verbatim } { v }
+ {
+ \group_begin:
+ \ttfamily
+ \automatichyphenmode = 1
+ \cs_set_protected:Npn \@@_begin_line: { }
+ \cs_set_protected:Npn \@@_end_line: { }
+ \tl_set:Nx \l_tmpa_tl
+ {
+ \lua_now:e
+ { piton.Parse('\l_@@_language_str',token.scan_string()) }
+ { #1 }
+ }
+ \bool_if:NT \l_@@_show_spaces_bool
+ { \regex_replace_all:nnN { \x20 } { ⣠} \l_tmpa_tl } % U+2423
+ \l_tmpa_tl
+ \group_end:
+ }
+% \end{macrocode}
+%
+
+% \bigskip
+%
+%
+% \bigskip
+% The following command is not a user command. It will be used when we will
+% have to ``rescan'' some chunks of Python code. For example, it will be the
+% initial value of the Piton style |InitialValues| (the default values of the
+% arguments of a Python function).
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_piton:n #1
+ {
+ \group_begin:
+ \cs_set_protected:Npn \@@_begin_line: { }
+ \cs_set_protected:Npn \@@_end_line: { }
+ \bool_lazy_or:nnTF
+ \l_@@_break_lines_in_piton_bool
+ \l_@@_break_lines_in_Piton_bool
+ {
+ \tl_set:Nx \l_tmpa_tl
+ {
+ \lua_now:e
+ { piton.ParseTer('\l_@@_language_str',token.scan_string()) }
+ { #1 }
+ }
+ }
+ {
+ \tl_set:Nx \l_tmpa_tl
+ {
+ \lua_now:e
+ { piton.Parse('\l_@@_language_str',token.scan_string()) }
+ { #1 }
+ }
+ }
+ \bool_if:NT \l_@@_show_spaces_bool
+ { \regex_replace_all:nnN { \x20 } { ⣠} \l_tmpa_tl } % U+2423
+ \l_tmpa_tl
+ \group_end:
+ }
+% \end{macrocode}
+%
+% \bigskip
+% The following command is similar to the previous one but raise a fatal error if
+% its argument contains a carriage return.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_piton_no_cr:n #1
+ {
+ \group_begin:
+ \cs_set_protected:Npn \@@_begin_line: { }
+ \cs_set_protected:Npn \@@_end_line: { }
+ \cs_set_protected:Npn \@@_newline:
+ { \msg_fatal:nn { piton } { cr~not~allowed } }
+ \bool_lazy_or:nnTF
+ \l_@@_break_lines_in_piton_bool
+ \l_@@_break_lines_in_Piton_bool
+ {
+ \tl_set:Nx \l_tmpa_tl
+ {
+ \lua_now:e
+ { piton.ParseTer('\l_@@_language_str',token.scan_string()) }
+ { #1 }
+ }
+ }
+ {
+ \tl_set:Nx \l_tmpa_tl
+ {
+ \lua_now:e
+ { piton.Parse('\l_@@_language_str',token.scan_string()) }
+ { #1 }
+ }
+ }
+ \bool_if:NT \l_@@_show_spaces_bool
+ { \regex_replace_all:nnN { \x20 } { ⣠} \l_tmpa_tl } % U+2423
+ \l_tmpa_tl
+ \group_end:
+ }
+% \end{macrocode}
+%
+% \bigskip
+% Despite its name, |\@@_pre_env:| will be used both in |\PitonInputFile| and
+% in the environments such as |{Piton}|.
+% \begin{macrocode}
+\cs_new:Npn \@@_pre_env:
+ {
+ \automatichyphenmode = 1
+ \int_gincr:N \g_@@_env_int
+ \tl_gclear:N \g_@@_aux_tl
+ \cs_if_exist_use:c { c_@@ _ \int_use:N \g_@@_env_int _ tl }
+ \dim_compare:nNnT \l_@@_width_on_aux_dim = \c_zero_dim
+ { \dim_set_eq:NN \l_@@_width_on_aux_dim \linewidth }
+ \bool_if:NF \l_@@_resume_bool { \int_gzero:N \g_@@_visual_line_int }
+ \dim_gzero:N \g_@@_width_dim
+ \int_gzero:N \g_@@_line_int
+ \dim_zero:N \parindent
+ \dim_zero:N \lineskip
+ \dim_zero:N \parindent
+ \cs_set_eq:NN \label \@@_label:n
+ }
+% \end{macrocode}
+%
+% \bigskip
+% \begin{macrocode}
+\keys_define:nn { PitonInputFile }
+ {
+ first-line .int_set:N = \l_@@_first_line_int ,
+ first-line .value_required:n = true ,
+ last-line .int_set:N = \l_@@_last_line_int ,
+ last-line .value_required:n = true ,
+ }
+% \end{macrocode}
+%
+% \bigskip
+% \begin{macrocode}
+\NewDocumentCommand { \PitonInputFile } { d < > O { } m }
+ {
+ \tl_if_novalue:nF { #1 }
+ {
+ \bool_if:NTF \c_@@_beamer_bool
+ { \begin { uncoverenv } < #1 > }
+ { \msg_error:nn { piton } { overlay~without~beamer } }
+ }
+ \group_begin:
+ \int_zero_new:N \l_@@_first_line_int
+ \int_zero_new:N \l_@@_last_line_int
+ \int_set_eq:NN \l_@@_last_line_int \c_max_int
+ \keys_set:nn { PitonInputFile } { #2 }
+ \@@_pre_env:
+ \mode_if_vertical:TF \mode_leave_vertical: \newline
+% \end{macrocode}
+% We count with Lua the number of lines of the argument. The result will be
+% stored by Lua in |\l_@@_nb_lines_int|. That information will be used to allow
+% or disallow page breaks.
+% \begin{macrocode}
+ \lua_now:n { piton.CountLinesFile(token.scan_argument()) } { #3 }
+% \end{macrocode}
+% If the final user has used both |left-margin=auto| and |line-numbers| or
+% |all-line-numbers|, we have to compute the width of the maximal number of
+% lines at the end of the composition of the listing to fix the correct value to
+% |left-margin|.
+% \begin{macrocode}
+ \bool_lazy_and:nnT \l_@@_left_margin_auto_bool \l_@@_line_numbers_bool
+ {
+ \hbox_set:Nn \l_tmpa_box
+ {
+ \footnotesize
+ \bool_if:NTF \l_@@_all_line_numbers_bool
+ {
+ \int_to_arabic:n
+ { \g_@@_visual_line_int + \l_@@_nb_lines_int }
+ }
+ {
+ \lua_now:n
+ { piton.CountNonEmptyLinesFile(token.scan_argument()) }
+ { #3 }
+ \int_to_arabic:n
+ { \g_@@_visual_line_int + \l_@@_nb_non_empty_lines_int }
+ }
+ }
+ \dim_set:Nn \l_@@_left_margin_dim
+ { \box_wd:N \l_tmpa_box + \l_@@_numbers_sep_dim + 0.1 em }
+ }
+% \end{macrocode}
+% Now, the main job.
+% \begin{macrocode}
+ \ttfamily
+ \bool_if:NT \c_@@_footnote_bool { \begin { savenotes } }
+ \vtop \bgroup
+ \lua_now:e
+ {
+ piton.ParseFile('\l_@@_language_str',token.scan_argument() ,
+ \int_use:N \l_@@_first_line_int ,
+ \int_use:N \l_@@_last_line_int )
+ }
+ { #3 }
+ \egroup
+ \bool_if:NT \c_@@_footnote_bool { \end { savenotes } }
+ \@@_width_to_aux:
+ \group_end:
+ \tl_if_novalue:nF { #1 }
+ { \bool_if:NT \c_@@_beamer_bool { \end { uncoverenv } } }
+ \@@_write_aux:
+ }
+% \end{macrocode}
+%
+%
+% \bigskip
+% \begin{macrocode}
+\NewDocumentCommand { \NewPitonEnvironment } { m m m m }
+ {
+% \end{macrocode}
+% We construct a TeX macro which will catch as argument all the tokens until
+% |\end{|\texttt{\textsl{name_env}}|}| with, in that
+% |\end{|\texttt{\textsl{name_env}}|}|, the catcodes of |\|, |{| and |}| equal to
+% 12 (``\texttt{other}''). The latter explains why the definition of that
+% function is a bit complicated.
+% \begin{macrocode}
+ \use:x
+ {
+ \cs_set_protected:Npn
+ \use:c { _@@_collect_ #1 :w }
+ ####1
+ \c_backslash_str end \c_left_brace_str #1 \c_right_brace_str
+ }
+ {
+ \group_end:
+ \mode_if_vertical:TF \mode_leave_vertical: \newline
+% \end{macrocode}
+% We count with Lua the number of lines of the argument. The result will be
+% stored by Lua in |\l_@@_nb_lines_int|. That information will be used to allow
+% or disallow page breaks.
+% \begin{macrocode}
+ \lua_now:n { piton.CountLines(token.scan_argument()) } { ##1 }
+% \end{macrocode}
+% If the final user has used both |left-margin=auto| and |line-numbers|, we have
+% to compute the width of the maximal number of lines at the end of the
+% environment to fix the correct value to |left-margin|.
+% \begin{macrocode}
+ \bool_lazy_and:nnT \l_@@_left_margin_auto_bool \l_@@_line_numbers_bool
+ {
+ \bool_if:NTF \l_@@_all_line_numbers_bool
+ {
+ \hbox_set:Nn \l_tmpa_box
+ {
+ \footnotesize
+ \int_to_arabic:n
+ { \g_@@_visual_line_int + \l_@@_nb_lines_int }
+ }
+ }
+ {
+ \lua_now:n
+ { piton.CountNonEmptyLines(token.scan_argument()) }
+ { ##1 }
+ \hbox_set:Nn \l_tmpa_box
+ {
+ \footnotesize
+ \int_to_arabic:n
+ { \g_@@_visual_line_int + \l_@@_nb_non_empty_lines_int }
+ }
+ }
+ \dim_set:Nn \l_@@_left_margin_dim
+ { \box_wd:N \l_tmpa_box + \l_@@_numbers_sep_dim + 0.1 em }
+ }
+% \end{macrocode}
+% Now, the main job.
+% \begin{macrocode}
+ \ttfamily
+ \bool_if:NT \c_@@_footnote_bool { \begin { savenotes } }
+ \vtop \bgroup
+ \lua_now:e
+ {
+ piton.GobbleParse
+ (
+ '\l_@@_language_str' ,
+ \int_use:N \l_@@_gobble_int ,
+ token.scan_argument()
+ )
+ }
+ { ##1 }
+ \vspace { 2.5 pt }
+ \egroup
+ \bool_if:NT \c_@@_footnote_bool { \end { savenotes } }
+ \@@_width_to_aux:
+% \end{macrocode}
+% The following |\end{#1}| is only for the groups and the stack of environments
+% of LaTeX.
+% \begin{macrocode}
+ \end { #1 }
+ \@@_write_aux:
+ }
+% \end{macrocode}
+%
+%
+% \bigskip
+% We can now define the new environment.
+%
+% We are still in the definition of the command |\NewPitonEnvironment|...
+% \begin{macrocode}
+ \NewDocumentEnvironment { #1 } { #2 }
+ {
+ #3
+ \@@_pre_env:
+ \group_begin:
+ \tl_map_function:nN
+ { \ \\ \{ \} \$ \& \# \^ \_ \% \~ \^^I }
+ \char_set_catcode_other:N
+ \use:c { _@@_collect_ #1 :w }
+ }
+ { #4 }
+% \end{macrocode}
+%
+% \medskip
+% The following code is for technical reasons. We want to change the catcode of
+% |^^M| before catching the arguments of the new environment we are defining.
+% Indeed, if not, we will have problems if there is a final optional argument in
+% our environment (if that final argument is not used by the user in an
+% instance of the environment, a spurious space is inserted, probably because
+% the |^^M| is converted to space).
+% \begin{macrocode}
+ \AddToHook { env / #1 / begin } { \char_set_catcode_other:N \^^M }
+ }
+% \end{macrocode}
+% This is the end of the definition of the command |\NewPitonEnvironment|.
+%
+% \bigskip
+% Now, we define the environment |{Piton}|, which is the main environment
+% provided by the package \pkg{piton}. Of course, you use
+% |\NewPitonEnvironment|.
+% \begin{macrocode}
+\bool_if:NTF \c_@@_beamer_bool
+ {
+ \NewPitonEnvironment { Piton } { d < > }
+ {
+ \IfValueTF { #1 }
+ { \begin { uncoverenv } < #1 > }
+ { \begin { uncoverenv } }
+ }
+ { \end { uncoverenv } }
+ }
+ { \NewPitonEnvironment { Piton } { } { } { } }
+% \end{macrocode}
+%
+%
+%
+% \bigskip
+% \subsubsection{The styles}
+%
+% \medskip
+% The following command is fundamental: it will be used by the Lua code.
+% \begin{macrocode}
+\NewDocumentCommand { \PitonStyle } { m } { \use:c { pitonStyle #1 } }
+% \end{macrocode}
+%
+% \medskip
+% The following command takes in its argument by curryfication.
+% \begin{macrocode}
+\NewDocumentCommand { \SetPitonStyle } { } { \keys_set:nn { piton / Styles } }
+% \end{macrocode}
+%
+% \medskip
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_math_scantokens:n #1
+ { \normalfont \scantextokens { $#1$ } }
+% \end{macrocode}
+%
+% \medskip
+% \begin{macrocode}
+\keys_define:nn { piton / Styles }
+ {
+ String.Interpol .tl_set:c = pitonStyle String.Interpol ,
+ String.Interpol .value_required:n = true ,
+ FormattingType .tl_set:c = pitonStyle FormattingType ,
+ FormattingType .value_required:n = true ,
+ Dict.Value .tl_set:c = pitonStyle Dict.Value ,
+ Dict.Value .value_required:n = true ,
+ Name.Decorator .tl_set:c = pitonStyle Name.Decorator ,
+ Name.Decorator .value_required:n = true ,
+ Name.Function .tl_set:c = pitonStyle Name.Function ,
+ Name.Function .value_required:n = true ,
+ Name.UserFunction .tl_set:c = pitonStyle Name.UserFunction ,
+ Name.UserFunction .value_required:n = true ,
+ Keyword .tl_set:c = pitonStyle Keyword ,
+ Keyword .value_required:n = true ,
+ Keyword.Constant .tl_set:c = pitonStyle Keyword.Constant ,
+ Keyword.constant .value_required:n = true ,
+ String.Doc .tl_set:c = pitonStyle String.Doc ,
+ String.Doc .value_required:n = true ,
+ Interpol.Inside .tl_set:c = pitonStyle Interpol.Inside ,
+ Interpol.Inside .value_required:n = true ,
+ String.Long .tl_set:c = pitonStyle String.Long ,
+ String.Long .value_required:n = true ,
+ String.Short .tl_set:c = pitonStyle String.Short ,
+ String.Short .value_required:n = true ,
+ String .meta:n = { String.Long = #1 , String.Short = #1 } ,
+ Comment.Math .tl_set:c = pitonStyle Comment.Math ,
+ Comment.Math .default:n = \@@_math_scantokens:n ,
+ Comment.Math .initial:n = ,
+ Comment .tl_set:c = pitonStyle Comment ,
+ Comment .value_required:n = true ,
+ InitialValues .tl_set:c = pitonStyle InitialValues ,
+ InitialValues .value_required:n = true ,
+ Number .tl_set:c = pitonStyle Number ,
+ Number .value_required:n = true ,
+ Name.Namespace .tl_set:c = pitonStyle Name.Namespace ,
+ Name.Namespace .value_required:n = true ,
+ Name.Class .tl_set:c = pitonStyle Name.Class ,
+ Name.Class .value_required:n = true ,
+ Name.Builtin .tl_set:c = pitonStyle Name.Builtin ,
+ Name.Builtin .value_required:n = true ,
+ TypeParameter .tl_set:c = pitonStyle TypeParameter ,
+ TypeParameter .value_required:n = true ,
+ Name.Type .tl_set:c = pitonStyle Name.Type ,
+ Name.Type .value_required:n = true ,
+ Operator .tl_set:c = pitonStyle Operator ,
+ Operator .value_required:n = true ,
+ Operator.Word .tl_set:c = pitonStyle Operator.Word ,
+ Operator.Word .value_required:n = true ,
+ Exception .tl_set:c = pitonStyle Exception ,
+ Exception .value_required:n = true ,
+ Comment.LaTeX .tl_set:c = pitonStyle Comment.LaTeX ,
+ Comment.LaTeX .value_required:n = true ,
+ Identifier .tl_set:c = pitonStyle Identifier ,
+ Comment.LaTeX .value_required:n = true ,
+ ParseAgain.noCR .tl_set:c = pitonStyle ParseAgain.noCR ,
+ ParseAgain.noCR .value_required:n = true ,
+ ParseAgain .tl_set:c = pitonStyle ParseAgain ,
+ ParseAgain .value_required:n = true ,
+ Prompt .tl_set:c = pitonStyle Prompt ,
+ Prompt .value_required:n = true ,
+ unknown .code:n =
+ \msg_error:nn { piton } { Unknown~key~for~SetPitonStyle }
+ }
+% \end{macrocode}
+%
+%
+% \bigskip
+% \begin{macrocode}
+\msg_new:nnn { piton } { Unknown~key~for~SetPitonStyle }
+ {
+ The~style~'\l_keys_key_str'~is~unknown.\\
+ This~key~will~be~ignored.\\
+ The~available~styles~are~(in~alphabetic~order):~
+ Comment,~
+ Comment.LaTeX,~
+ Dict.Value,~
+ Exception,~
+ Identifier,~
+ InitialValues,~
+ Keyword,~
+ Keyword.Constant,~
+ Name.Builtin,~
+ Name.Class,~
+ Name.Decorator,~
+ Name.Function,~
+ Name.Namespace,~
+ Number,~
+ Operator,~
+ Operator.Word,~
+ Prompt,~
+ String,~
+ String.Doc,~
+ String.Long,~
+ String.Short,~and~
+ String.Interpol.
+ }
+% \end{macrocode}
+%
+% \bigskip
+% \subsubsection{The initial style}
+%
+% The initial style is inspired by the style ``manni'' of Pygments.
+%
+% \medskip
+% \begin{macrocode}
+\SetPitonStyle
+ {
+ Comment = \color[HTML]{0099FF} \itshape ,
+ Exception = \color[HTML]{CC0000} ,
+ Keyword = \color[HTML]{006699} \bfseries ,
+ Keyword.Constant = \color[HTML]{006699} \bfseries ,
+ Name.Builtin = \color[HTML]{336666} ,
+ Name.Decorator = \color[HTML]{9999FF},
+ Name.Class = \color[HTML]{00AA88} \bfseries ,
+ Name.Function = \color[HTML]{CC00FF} ,
+ Name.Namespace = \color[HTML]{00CCFF} ,
+ Number = \color[HTML]{FF6600} ,
+ Operator = \color[HTML]{555555} ,
+ Operator.Word = \bfseries ,
+ String = \color[HTML]{CC3300} ,
+ String.Doc = \color[HTML]{CC3300} \itshape ,
+ String.Interpol = \color[HTML]{AA0000} ,
+ Comment.LaTeX = \normalfont \color[rgb]{.468,.532,.6} ,
+ Name.Type = \color[HTML]{336666} ,
+ InitialValues = \@@_piton:n ,
+ Dict.Value = \@@_piton:n ,
+ Interpol.Inside = \color{black}\@@_piton:n ,
+ TypeParameter = \color[HTML]{008800} \itshape ,
+ Identifier = \@@_identifier:n ,
+ Name.UserFunction = ,
+ Prompt = ,
+ ParseAgain.noCR = \@@_piton_no_cr:n ,
+ ParseAgain = \@@_piton:n ,
+ }
+% \end{macrocode}
+% The last styles |ParseAgain.noCR| and |ParseAgain| should be considered as
+% ``internal style'' (not available for the final user). However, maybe we will
+% change that and document these styles for the final user (why not?).
+%
+% \medskip
+% If the key |math-comments| has been used at load-time, we change the style
+% |Comment.Math| which should be considered only at an ``internal style''.
+% However, maybe we will document in a future version the possibility to write
+% change the style \emph{locally} in a document)].
+% \begin{macrocode}
+\bool_if:NT \c_@@_math_comments_bool { \SetPitonStyle { Comment.Math } }
+% \end{macrocode}
+%
+% \bigskip
+%
+% \bigskip
+% \subsubsection{Highlighting some identifiers}
+%
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_identifier:n #1
+ { \cs_if_exist_use:c { PitonIdentifier _ \l_@@_language_str _ #1 } { #1 } }
+% \end{macrocode}
+%
+% \bigskip
+% \begin{macrocode}
+\keys_define:nn { PitonOptions }
+ { identifiers .code:n = \@@_set_identifiers:n { #1 } }
+% \end{macrocode}
+%
+% \bigskip
+% \begin{macrocode}
+\keys_define:nn { Piton / identifiers }
+ {
+ names .clist_set:N = \l_@@_identifiers_names_tl ,
+ style .tl_set:N = \l_@@_style_tl ,
+ }
+% \end{macrocode}
+%
+% \bigskip
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_set_identifiers:n #1
+ {
+ \clist_clear_new:N \l_@@_identifiers_names_tl
+ \tl_clear_new:N \l_@@_style_tl
+ \keys_set:nn { Piton / identifiers } { #1 }
+ \clist_map_inline:Nn \l_@@_identifiers_names_tl
+ {
+ \tl_set_eq:cN
+ { PitonIdentifier _ \l_@@_language_str _ ##1 }
+ \l_@@_style_tl
+ }
+ }
+% \end{macrocode}
+%
+%
+% \bigskip
+% In particular, we have an hightlighting of the indentifiers which are the
+% names of Python functions previously defined by the user. Indeed, when a
+% Python function is defined, the style |Name.Function.Internal| is applied to
+% that name. We define now that style (you define it directly and you short-cut
+% the function |\SetPitonStyle|).
+% \begin{macrocode}
+\cs_new_protected:cpn { pitonStyle Name.Function.Internal } #1
+ {
+% \end{macrocode}
+% First, the element is composed in the TeX flow with the style |Name.Function|
+% which is provided to the final user.
+% \begin{macrocode}
+ { \PitonStyle { Name.Function } { #1 } }
+% \end{macrocode}
+% Now, we specify that the name of the new Python function is a known identifier
+% that will be formated with the Piton style |Name.UserFunction|. Of course,
+% here the affectation is global because we have to exit many groups and even
+% the environments |{Piton}|).
+% \begin{macrocode}
+ \cs_gset_protected:cpn { PitonIdentifier _ \l_@@_language_str _ #1 }
+ { \PitonStyle{ Name.UserFunction } }
+% \end{macrocode}
+% Now, we put the name of that new user function in the dedicated sequence
+% (specific of the current language). That sequence will be used only by
+% |\PitonClearUserFunctions|.
+% \begin{macrocode}
+ \seq_if_exist:cF { g_@@_functions _ \l_@@_language_str _ seq }
+ { \seq_new:c { g_@@_functions _ \l_@@_language_str _ seq } }
+ \seq_gput_right:cn { g_@@_functions _ \l_@@_language_str _ seq } { #1 }
+ }
+% \end{macrocode}
+%
+% \bigskip
+% \begin{macrocode}
+\NewDocumentCommand \PitonClearUserFunctions { ! O { \l_@@_language_str } }
+ {
+ \seq_if_exist:cT { g_@@_functions _ #1 _ seq }
+ {
+ \seq_map_inline:cn { g_@@_functions _ #1 _ seq }
+ { \cs_undefine:c { PitonIdentifier _ #1 _ ##1} }
+ \seq_gclear:c { g_@@_functions _ #1 _ seq }
+ }
+ }
+% \end{macrocode}
+%
+% \bigskip
+% \subsubsection{Security}
+%
+% \begin{macrocode}
+\AddToHook { env / piton / begin }
+ { \msg_fatal:nn { piton } { No~environment~piton } }
+
+\msg_new:nnn { piton } { No~environment~piton }
+ {
+ There~is~no~environment~piton!\\
+ There~is~an~environment~{Piton}~and~a~command~
+ \token_to_str:N \piton\ but~there~is~no~environment~
+ {piton}.~This~error~is~fatal.
+ }
+% \end{macrocode}
+%
+% \bigskip
+% \subsubsection{The error messages of the package}
+%
+% \begin{macrocode}
+\msg_new:nnnn { piton } { Unknown~key~for~PitonOptions }
+ {
+ Unknown~key. \\
+ The~key~'\l_keys_key_str'~is~unknown~for~\token_to_str:N \PitonOptions.~
+ It~will~be~ignored.\\
+ For~a~list~of~the~available~keys,~type~H~<return>.
+ }
+ {
+ The~available~keys~are~(in~alphabetic~order):~
+ all-line-numbers,~
+ auto-gobble,~
+ background-color,~
+ break-lines,~
+ break-lines-in-piton,~
+ break-lines-in-Piton,~
+ continuation-symbol,~
+ continuation-symbol-on-indentation,~
+ end-of-broken-line,~
+ env-gobble,~
+ gobble,~
+ identifiers,~
+ indent-broken-lines,~
+ language,~
+ left-margin,~
+ line-numbers,~
+ prompt-background-color,~
+ resume,~
+ show-spaces,~
+ show-spaces-in-strings,~
+ slim,~
+ splittable,~
+ tabs-auto-gobble~
+ and~tab-size.
+ }
+% \end{macrocode}
+%
+% \bigskip
+% \begin{macrocode}
+\msg_new:nnn { piton } { label~with~lines~numbers }
+ {
+ You~can't~use~the~command~\token_to_str:N \label\
+ because~the~key~'line-numbers'~(or~'all-line-numbers')~
+ is~not~active.\\
+ If~you~go~on,~that~command~will~ignored.
+ }
+% \end{macrocode}
+%
+% \bigskip
+% \begin{macrocode}
+\msg_new:nnn { piton } { cr~not~allowed }
+ {
+ You~can't~put~any~carriage~return~in~the~argument~
+ of~a~command~\c_backslash_str
+ \l_@@_beamer_command_str\ within~an~
+ environment~of~'piton'.~You~should~consider~using~the~
+ corresponding~environment.\\
+ That~error~is~fatal.
+ }
+% \end{macrocode}
+%
+% \bigskip
+% \begin{macrocode}
+\msg_new:nnn { piton } { overlay~without~beamer }
+ {
+ You~can't~use~an~argument~<...>~for~your~command~
+ \token_to_str:N \PitonInputFile\ because~you~are~not~
+ in~Beamer.\\
+ If~you~go~on,~that~argument~will~be~ignored.
+ }
+% \end{macrocode}
+%
+% \bigskip
+% \begin{macrocode}
+\msg_new:nnn { Piton } { Python~error }
+ { A~Python~error~has~been~detected. }
+% \end{macrocode}
+%
+% \bigskip
+% \subsection{The Lua part of the implementation}
+%
+% \bigskip
+% \begin{macrocode}
+\ExplSyntaxOff
+\RequirePackage{luacode}
+% \end{macrocode}
+%
+%
+% \bigskip
+% The Lua code will be loaded via a |{luacode*}| environment. The environment
+% is by itself a Lua block and the local declarations will be local to that
+% block. All the global functions (used by the L3 parts of the implementation)
+% will be put in a Lua table |piton|.
+%
+% \medskip
+% \begin{macrocode}
+\begin{luacode*}
+piton = piton or { }
+% \end{macrocode}
+%
+% \begin{macrocode}
+if piton.comment_latex == nil then piton.comment_latex = ">" end
+piton.comment_latex = "#" .. piton.comment_latex
+% \end{macrocode}
+%
+%
+% \bigskip
+% The following functions are an easy way to safely insert braces (|{| and |}|)
+% in the TeX flow.
+% \begin{macrocode}
+function piton.open_brace ()
+ tex.sprint("{")
+end
+function piton.close_brace ()
+ tex.sprint("}")
+end
+% \end{macrocode}
+%
+% \bigskip
+% \subsubsection{Special functions dealing with LPEG}
+%
+% \medskip
+% We will use the Lua library \pkg{lpeg} which is built in LuaTeX. That's why we
+% define first aliases for several functions of that library.
+% \begin{macrocode}
+local P, S, V, C, Ct, Cc = lpeg.P, lpeg.S, lpeg.V, lpeg.C, lpeg.Ct, lpeg.Cc
+local Cf, Cs , Cg , Cmt , Cb = lpeg.Cf, lpeg.Cs, lpeg.Cg , lpeg.Cmt , lpeg.Cb
+local R = lpeg.R
+% \end{macrocode}
+%
+%
+%
+% \bigskip
+% The function |Q| takes in as argument a pattern and returns a \textsc{lpeg}
+% \emph{which does a capture} of the pattern. That capture will be sent to LaTeX
+% with the catcode ``other'' for all the characters: it's suitable for elements
+% of the Python listings that \pkg{piton} will typeset verbatim (thanks to the
+% catcode ``other'').
+% \begin{macrocode}
+local function Q(pattern)
+ return Ct ( Cc ( luatexbase.catcodetables.CatcodeTableOther ) * C ( pattern ) )
+end
+% \end{macrocode}
+%
+%
+% \bigskip
+% The function |L| takes in as argument a pattern and returns a \textsc{lpeg}
+% \emph{which does a capture} of the pattern. That capture will be sent to LaTeX
+% with standard LaTeX catcodes for all the characters: the elements captured
+% will be formatted as normal LaTeX codes. It's suitable for the ``LaTeX
+% comments'' in the environments |{Piton}| and the elements beetween
+% ``|escape-inside|''. That function won't be much used.
+% \begin{macrocode}
+local function L(pattern)
+ return Ct ( C ( pattern ) )
+end
+% \end{macrocode}
+%
+% \bigskip
+% The function |Lc| (the c is for \emph{constant}) takes in as argument a string
+% and returns a \textsc{lpeg} \emph{with does a constant capture} which returns
+% that string. The elements captured will be formatted as L3 code. It will be
+% used to send to LaTeX all the formatting LaTeX instructions we have to insert
+% in order to do the syntactic highlighting (that's the main job of
+% \pkg{piton}). That function will be widely used.
+% \begin{macrocode}
+local function Lc(string)
+ return Cc ( { luatexbase.catcodetables.expl , string } )
+end
+% \end{macrocode}
+%
+% \bigskip
+% The function |K| creates a \textsc{lpeg} which will return as capture the
+% whole LaTeX code corresponding to a Python chunk (that is to say with the
+% LaTeX formatting instructions corresponding to the syntactic nature of that
+% Python chunk). The first argument is a Lua string corresponding to the name of
+% a \pkg{piton} style and the second element is a pattern (that is to say a
+% \textsc{lpeg} without capture)
+% \begin{macrocode}
+local function K(style, pattern)
+ return
+ Lc ( "{\\PitonStyle{" .. style .. "}{" )
+ * Q ( pattern )
+ * Lc ( "}}" )
+end
+% \end{macrocode}
+% The formatting commands in a given \pkg{piton} style (eg. the style |Keyword|)
+% may be semi-global declarations (such as |\bfseries| or |\slshape|) or LaTeX
+% macros with an argument (such as |\fbox| or |\colorbox{yellow}|). In order to
+% deal with both syntaxes, we have used two pairs of braces:
+% |{\PitonStyle{Keyword}{|\texttt{\slshape text to format}|}}|.
+%
+%
+% \bigskip
+% \begin{macrocode}
+local function WithStyle(style,pattern)
+ return
+ Ct ( Cc "Open" * Cc ( "{\\PitonStyle{" .. style .. "}{" ) * Cc "}}" )
+ * pattern
+ * Ct ( Cc "Close" )
+end
+% \end{macrocode}
+%
+% \bigskip
+% The following \textsc{lpeg} catches the Python chunks which are in LaTeX
+% escapes (and that chunks will be considered as normal LaTeX constructions). We
+% recall that |piton.begin_espace| and |piton_end_escape| are Lua strings
+% corresponding to the key |escape-inside|\footnote{The \pkg{piton} key
+% |escape-inside| is available at load-time only.}. Since the elements that will
+% be catched must be sent to LaTeX with standard LaTeX catcodes, we put the
+% capture (done by the function |C|) in a table (by using |Ct|, which is an
+% alias for |lpeg.Ct|) without number of catcode table at the first component of
+% the table.
+% \begin{macrocode}
+local Escape =
+ P(piton_begin_escape)
+ * L ( ( 1 - P(piton_end_escape) ) ^ 1 )
+ * P(piton_end_escape)
+% \end{macrocode}
+%
+% \vspace{1cm}
+% The following line is mandatory.
+% \begin{macrocode}
+lpeg.locale(lpeg)
+% \end{macrocode}
+%
+% \bigskip
+% \paragraph{The basic syntactic LPEG}
+%
+% \begin{macrocode}
+local alpha, digit = lpeg.alpha, lpeg.digit
+local space = P " "
+% \end{macrocode}
+%
+% Remember that, for \textsc{lpeg}, the Unicode characters such as |à|, |â|,
+% |ç|, etc. are in fact strings of length 2 (2 bytes) because \pkg{lpeg} is not
+% Unicode-aware.
+% \begin{macrocode}
+local letter = alpha + P "_"
+ + P "â" + P "à" + P "ç" + P "é" + P "è" + P "ê" + P "ë" + P "ï" + P "î"
+ + P "ô" + P "û" + P "ü" + P "Â" + P "À" + P "Ç" + P "É" + P "È" + P "Ê"
+ + P "Ë" + P "Ã" + P "ÃŽ" + P "Ô" + P "Û" + P "Ãœ"
+
+local alphanum = letter + digit
+% \end{macrocode}
+%
+% \bigskip
+% The following \textsc{lpeg} |identifier| is a mere pattern (that is to say
+% more or less a regular expression) which matches the Python identifiers (hence
+% the name).
+% \begin{macrocode}
+local identifier = letter * alphanum ^ 0
+% \end{macrocode}
+%
+% \medskip
+% On the other hand, the \textsc{lpeg} |Identifier| (with a capital) also returns
+% a \emph{capture}.
+% \begin{macrocode}
+local Identifier = K ( 'Identifier' , identifier)
+% \end{macrocode}
+%
+% \bigskip
+% By convention, we will use names with an initial capital for \textsc{lpeg}
+% which return captures.
+%
+%
+% \bigskip
+% Here is the first use of our function~|K|. That function will be used to
+% construct \textsc{lpeg} which capture Python chunks for which we have a
+% dedicated \pkg{piton} style. For example, for the numbers, \pkg{piton}
+% provides a style which is called |Number|. The name of the style is provided
+% as a Lua string in the second argument of the function~|K|. By convention, we
+% use single quotes for delimiting the Lua strings which are names of
+% \pkg{piton} styles (but this is only a convention).
+% \begin{macrocode}
+local Number =
+ K ( 'Number' ,
+ ( digit^1 * P "." * digit^0 + digit^0 * P "." * digit^1 + digit^1 )
+ * ( S "eE" * S "+-" ^ -1 * digit^1 ) ^ -1
+ + digit^1
+ )
+% \end{macrocode}
+%
+% \bigskip
+% We recall that |piton.begin_espace| and |piton_end_escape| are Lua strings
+% corresponding to the key |escape-inside|\footnote{The \pkg{piton} key
+% |escape-inside| is available at load-time only.}. Of course, if the final user
+% has not used the key |escape-inside|, these strings are empty.
+% \begin{macrocode}
+local Word
+if piton_begin_escape ~= ''
+then Word = Q ( ( ( 1 - space - P(piton_begin_escape) - P(piton_end_escape) )
+ - S "'\"\r[()]" - digit ) ^ 1 )
+else Word = Q ( ( ( 1 - space ) - S "'\"\r[()]" - digit ) ^ 1 )
+end
+% \end{macrocode}
+%
+% \bigskip
+% \begin{macrocode}
+local Space = ( Q " " ) ^ 1
+
+local SkipSpace = ( Q " " ) ^ 0
+
+local Punct = Q ( S ".,:;!" )
+
+local Tab = P "\t" * Lc ( '\\l_@@_tab_tl' )
+% \end{macrocode}
+%
+% \bigskip
+% \begin{macrocode}
+local SpaceIndentation = Lc ( '\\@@_an_indentation_space:' ) * ( Q " " )
+% \end{macrocode}
+%
+%
+% \bigskip
+% \begin{macrocode}
+local Delim = Q ( S "[()]" )
+% \end{macrocode}
+%
+% \bigskip
+% The following \textsc{lpeg} catches a space (U+0020) and replace it by
+% |\l_@@_space_tl|. It will be used in the strings. Usually,
+% |\l_@@_space_tl| will contain a space and therefore there won't be difference.
+% However, when the key |show-spaces-in-strings| is in force, |\\l_@@_space_tl| will
+% contain ⣠(U+2423) in order to visualize the spaces.
+% \begin{macrocode}
+local VisualSpace = space * Lc "\\l_@@_space_tl"
+% \end{macrocode}
+%
+%
+% \bigskip
+% \subsubsection{The LPEG python}
+%
+% \bigskip
+% Some strings of length 2 are explicit because we want the corresponding
+% ligatures available in some fonts such as \emph{Fira Code} to be active.
+% \begin{macrocode}
+local Operator =
+ K ( 'Operator' ,
+ P "!=" + P "<>" + P "==" + P "<<" + P ">>" + P "<=" + P ">=" + P ":="
+ + P "//" + P "**" + S "-~+/*%=<>&.@|"
+ )
+
+local OperatorWord =
+ K ( 'Operator.Word' ,P "in" + P "is" + P "and" + P "or" + P "not" )
+
+local Keyword =
+ K ( 'Keyword' ,
+ P "as" + P "assert" + P "break" + P "case" + P "class" + P "continue"
+ + P "def" + P "del" + P "elif" + P "else" + P "except" + P "exec"
+ + P "finally" + P "for" + P "from" + P "global" + P "if" + P "import"
+ + P "lambda" + P "non local" + P "pass" + P "return" + P "try"
+ + P "while" + P "with" + P "yield" + P "yield from" )
+ + K ( 'Keyword.Constant' ,P "True" + P "False" + P "None" )
+
+local Builtin =
+ K ( 'Name.Builtin' ,
+ P "__import__" + P "abs" + P "all" + P "any" + P "bin" + P "bool"
+ + P "bytearray" + P "bytes" + P "chr" + P "classmethod" + P "compile"
+ + P "complex" + P "delattr" + P "dict" + P "dir" + P "divmod"
+ + P "enumerate" + P "eval" + P "filter" + P "float" + P "format"
+ + P "frozenset" + P "getattr" + P "globals" + P "hasattr" + P "hash"
+ + P "hex" + P "id" + P "input" + P "int" + P "isinstance" + P "issubclass"
+ + P "iter" + P "len" + P "list" + P "locals" + P "map" + P "max"
+ + P "memoryview" + P "min" + P "next" + P "object" + P "oct" + P "open"
+ + P "ord" + P "pow" + P "print" + P "property" + P "range" + P "repr"
+ + P "reversed" + P "round" + P "set" + P "setattr" + P "slice" + P "sorted"
+ + P "staticmethod" + P "str" + P "sum" + P "super" + P "tuple" + P "type"
+ + P "vars" + P "zip" )
+
+
+local Exception =
+ K ( 'Exception' ,
+ P "ArithmeticError" + P "AssertionError" + P "AttributeError"
+ + P "BaseException" + P "BufferError" + P "BytesWarning" + P "DeprecationWarning"
+ + P "EOFError" + P "EnvironmentError" + P "Exception" + P "FloatingPointError"
+ + P "FutureWarning" + P "GeneratorExit" + P "IOError" + P "ImportError"
+ + P "ImportWarning" + P "IndentationError" + P "IndexError" + P "KeyError"
+ + P "KeyboardInterrupt" + P "LookupError" + P "MemoryError" + P "NameError"
+ + P "NotImplementedError" + P "OSError" + P "OverflowError"
+ + P "PendingDeprecationWarning" + P "ReferenceError" + P "ResourceWarning"
+ + P "RuntimeError" + P "RuntimeWarning" + P "StopIteration"
+ + P "SyntaxError" + P "SyntaxWarning" + P "SystemError" + P "SystemExit"
+ + P "TabError" + P "TypeError" + P "UnboundLocalError" + P "UnicodeDecodeError"
+ + P "UnicodeEncodeError" + P "UnicodeError" + P "UnicodeTranslateError"
+ + P "UnicodeWarning" + P "UserWarning" + P "ValueError" + P "VMSError"
+ + P "Warning" + P "WindowsError" + P "ZeroDivisionError"
+ + P "BlockingIOError" + P "ChildProcessError" + P "ConnectionError"
+ + P "BrokenPipeError" + P "ConnectionAbortedError" + P "ConnectionRefusedError"
+ + P "ConnectionResetError" + P "FileExistsError" + P "FileNotFoundError"
+ + P "InterruptedError" + P "IsADirectoryError" + P "NotADirectoryError"
+ + P "PermissionError" + P "ProcessLookupError" + P "TimeoutError"
+ + P "StopAsyncIteration" + P "ModuleNotFoundError" + P "RecursionError" )
+
+
+local RaiseException = K ( 'Keyword' , P "raise" ) * SkipSpace * Exception * Q ( P "(" )
+
+% \end{macrocode}
+%
+% \bigskip
+% In Python, a ``decorator'' is a statement whose begins by |@| which patches
+% the function defined in the following statement.
+% \begin{macrocode}
+local Decorator = K ( 'Name.Decorator' , P "@" * letter^1 )
+% \end{macrocode}
+%
+% \bigskip
+% The following \textsc{lpeg} |DefClass| will be used to detect the definition of a
+% new class (the name of that new class will be formatted with the \pkg{piton}
+% style |Name.Class|).
+%
+% \smallskip
+% Example:\enskip \piton{class myclass:}
+% \begin{macrocode}
+local DefClass =
+ K ( 'Keyword' , P "class" ) * Space * K ( 'Name.Class' , identifier )
+% \end{macrocode}
+%
+% If the word |class| is not followed by a identifier, it will be catched as
+% keyword by the \textsc{lpeg} |Keyword| (useful if we want to type a
+% list of keywords).
+%
+%
+% \bigskip
+% The following \textsc{lpeg} |ImportAs| is used for the lines beginning by |import|.
+% % We have to detect the potential keyword |as| because both the name of the
+% module and its alias must be formatted with the \pkg{piton} style |Name.Namespace|.
+%
+% \smallskip
+% Example:\enskip \piton{import numpy as np}
+%
+% \smallskip
+% Moreover, after the keyword |import|, it's possible to have a comma-separated
+% list of modules (if the keyword |as| is not used).
+%
+% \smallskip
+% Example:\enskip \piton{import math, numpy}
+% \begin{macrocode}
+local ImportAs =
+ K ( 'Keyword' , P "import" )
+ * Space
+ * K ( 'Name.Namespace' ,
+ identifier * ( P "." * identifier ) ^ 0 )
+ * (
+ ( Space * K ( 'Keyword' , P "as" ) * Space
+ * K ( 'Name.Namespace' , identifier ) )
+ +
+ ( SkipSpace * Q ( P "," ) * SkipSpace
+ * K ( 'Name.Namespace' , identifier ) ) ^ 0
+ )
+% \end{macrocode}
+% Be careful: there is no commutativity of |+| in the previous expression.
+%
+% \bigskip
+% The \textsc{lpeg} |FromImport| is used for the lines beginning by |from|. We
+% need a special treatment because the identifier following the keyword |from|
+% must be formatted with the \pkg{piton} style |Name.Namespace| and the
+% following keyword |import| must be formatted with the \pkg{piton} style
+% |Keyword| and must \emph{not} be catched by the \textsc{lpeg} |ImportAs|.
+%
+% \smallskip
+% Example:\enskip \piton{from math import pi}
+%
+% \smallskip
+% \begin{macrocode}
+local FromImport =
+ K ( 'Keyword' , P "from" )
+ * Space * K ( 'Name.Namespace' , identifier )
+ * Space * K ( 'Keyword' , P "import" )
+% \end{macrocode}
+%
+% \bigskip
+% \paragraph{The strings of Python}
+%
+% For the strings in Python, there are four categories of delimiters (without
+% counting the prefixes for f-strings and raw strings). We will use, in the
+% names of our \textsc{lpeg}, prefixes to distinguish the \textsc{lpeg} dealing
+% with that categories of strings, as presented in the following tabular.
+% \begin{center}
+% \begin{tabular}{ccc}
+% \toprule
+% & |Single| & |Double| \\
+% \midrule
+% |Short| & |'text'| & |"text"| \\
+% |Long| & |'''test'''| & |"""text"""| \\
+% \bottomrule
+% \end{tabular}
+% \end{center}
+%
+%
+% \bigskip
+% We have also to deal with the interpolations in the f-strings. Here
+% is an example of a f-string with an interpolation and a format
+% instruction\footnote{There is no special \pkg{piton} style for the formatting
+% instruction (after the colon): the style which will be applied will be the
+% style of the encompassing string, that is to say |String.Short| or
+% |String.Long|.} in that interpolation:
+%
+% \piton{f'Total price: {total+1:.2f} €'}
+%
+%
+% \bigskip
+% The interpolations beginning by |%| (even though there is more modern
+% technics now in Python).
+% \begin{macrocode}
+local PercentInterpol =
+ K ( 'String.Interpol' ,
+ P "%"
+ * ( P "(" * alphanum ^ 1 * P ")" ) ^ -1
+ * ( S "-#0 +" ) ^ 0
+ * ( digit ^ 1 + P "*" ) ^ -1
+ * ( P "." * ( digit ^ 1 + P "*" ) ) ^ -1
+ * ( S "HlL" ) ^ -1
+ * S "sdfFeExXorgiGauc%"
+ )
+% \end{macrocode}
+%
+% \bigskip
+% We can now define the \textsc{lpeg} for the four kinds of strings. It's not
+% possible to use our function~|K| because of the interpolations which must be
+% formatted with another \pkg{piton} style that the rest of the
+% string.\footnote{The interpolations are formatted with the \pkg{piton} style
+% |Interpol.Inside|. The initial value of that style is \texttt{\textbackslash
+% @@\_piton:n} wich means that the interpolations are parsed once again by \pkg{piton}.}
+% \begin{macrocode}
+local SingleShortString =
+ WithStyle ( 'String.Short' ,
+% \end{macrocode}
+% First, we deal with the f-strings of Python, which are prefixed by |f| or |F|.
+% \begin{macrocode}
+ Q ( P "f'" + P "F'" )
+ * (
+ K ( 'String.Interpol' , P "{" )
+ * K ( 'Interpol.Inside' , ( 1 - S "}':" ) ^ 0 )
+ * Q ( P ":" * (1 - S "}:'") ^ 0 ) ^ -1
+ * K ( 'String.Interpol' , P "}" )
+ +
+ VisualSpace
+ +
+ Q ( ( P "\\'" + P "{{" + P "}}" + 1 - S " {}'" ) ^ 1 )
+ ) ^ 0
+ * Q ( P "'" )
+ +
+% \end{macrocode}
+% Now, we deal with the standard strings of Python, but also the ``raw strings''.
+% \begin{macrocode}
+ Q ( P "'" + P "r'" + P "R'" )
+ * ( Q ( ( P "\\'" + 1 - S " '\r%" ) ^ 1 )
+ + VisualSpace
+ + PercentInterpol
+ + Q ( P "%" )
+ ) ^ 0
+ * Q ( P "'" ) )
+
+
+local DoubleShortString =
+ WithStyle ( 'String.Short' ,
+ Q ( P "f\"" + P "F\"" )
+ * (
+ K ( 'String.Interpol' , P "{" )
+ * Q ( ( 1 - S "}\":" ) ^ 0 , 'Interpol.Inside' )
+ * ( K ( 'String.Interpol' , P ":" ) * Q ( (1 - S "}:\"") ^ 0 ) ) ^ -1
+ * K ( 'String.Interpol' , P "}" )
+ +
+ VisualSpace
+ +
+ Q ( ( P "\\\"" + P "{{" + P "}}" + 1 - S " {}\"" ) ^ 1 )
+ ) ^ 0
+ * Q ( P "\"" )
+ +
+ Q ( P "\"" + P "r\"" + P "R\"" )
+ * ( Q ( ( P "\\\"" + 1 - S " \"\r%" ) ^ 1 )
+ + VisualSpace
+ + PercentInterpol
+ + Q ( P "%" )
+ ) ^ 0
+ * Q ( P "\"" ) )
+
+local ShortString = SingleShortString + DoubleShortString
+% \end{macrocode}
+%
+% \bigskip
+% \paragraph{Beamer}
+%
+% The following \textsc{lpeg} |BalancedBraces| will be used for the (mandatory)
+% argument of the commands |\only| and \emph{al.} of Beamer. It's necessary to
+% use a \emph{grammar} because that pattern mainly checks the correct nesting of
+% the delimiters (and it's known in the theory of formal languages that this
+% can't be done with regular expressions \emph{stricto sensu} only).
+% \begin{macrocode}
+local BalancedBraces =
+ P { "E" ,
+ E =
+ (
+ P "{" * V "E" * P "}"
+ +
+ ShortString
+ +
+ ( 1 - S "{}" )
+ ) ^ 0
+ }
+% \end{macrocode}
+%
+%
+% \bigskip
+% If Beamer is used (or if the key |beamer| is used at load-time), the following
+% LPEG will be redefined.
+% \begin{macrocode}
+local Beamer = P ( false )
+local BeamerBeginEnvironments = P ( true )
+local BeamerEndEnvironments = P ( true )
+local BeamerNamesEnvironments =
+ P "uncoverenv" + P "onlyenv" + P "visibleenv" + P "invisibleenv"
+ + P "alertenv" + P "actionenv"
+
+% \end{macrocode}
+%
+% \begin{macrocode}
+UserCommands =
+ Ct ( Cc "Open" * C ( "\\emph{" ) * Cc "}" )
+ * ( C ( BalancedBraces ) / (function (s) return MainLoopPython:match(s) end ) )
+ * P "}" * Ct ( Cc "Close" )
+% \end{macrocode}
+%
+% \begin{macrocode}
+function OneBeamerEnvironment(name)
+ return
+ Ct ( Cc "Open"
+ * C (
+ P ( "\\begin{" .. name .. "}" )
+ * ( P "<" * (1 - P ">") ^ 0 * P ">" ) ^ -1
+ )
+ * Cc ( "\\end{" .. name .. "}" )
+ )
+ * (
+ C ( ( 1 - P ( "\\end{" .. name .. "}" ) ) ^ 0 )
+ / (function (s) return MainLoopPython:match(s) end )
+ )
+ * P ( "\\end{" .. name .. "}" ) * Ct ( Cc "Close" )
+end
+% \end{macrocode}
+%
+%
+% \bigskip
+% \begin{macrocode}
+if piton_beamer
+then
+ Beamer =
+ L ( P "\\pause" * ( P "[" * (1 - P "]") ^ 0 * P "]" ) ^ -1 )
+ +
+ Ct ( Cc "Open"
+ * C (
+ (
+ P "\\uncover" + P "\\only" + P "\\alert" + P "\\visible"
+ + P "\\invisible" + P "\\action"
+ )
+ * ( P "<" * (1 - P ">") ^ 0 * P ">" ) ^ -1
+ * P "{"
+ )
+ * Cc "}"
+ )
+ * ( C ( BalancedBraces ) / (function (s) return MainLoopPython:match(s) end ) )
+ * P "}" * Ct ( Cc "Close" )
+ +
+ OneBeamerEnvironment "uncoverenv"
+ + OneBeamerEnvironment "onlyenv"
+ + OneBeamerEnvironment "visibleenv"
+ + OneBeamerEnvironment "invisibleenv"
+ + OneBeamerEnvironment "alertenv"
+ + OneBeamerEnvironment "actionenv"
+ +
+ L (
+% \end{macrocode}
+% For |\\alt|, the specification of the overlays (between angular brackets) is mandatory.
+% \begin{macrocode}
+ ( P "\\alt" )
+ * P "<" * (1 - P ">") ^ 0 * P ">"
+ * P "{"
+ )
+ * K ( 'ParseAgain.noCR' , BalancedBraces )
+ * L ( P "}{" )
+ * K ( 'ParseAgain.noCR' , BalancedBraces )
+ * L ( P "}" )
+ +
+ L (
+% \end{macrocode}
+% For |\\alt|, the specification of the overlays (between angular brackets) is mandatory.
+% \begin{macrocode}
+ ( P "\\temporal" )
+ * P "<" * (1 - P ">") ^ 0 * P ">"
+ * P "{"
+ )
+ * K ( 'ParseAgain.noCR' , BalancedBraces )
+ * L ( P "}{" )
+ * K ( 'ParseAgain.noCR' , BalancedBraces )
+ * L ( P "}{" )
+ * K ( 'ParseAgain.noCR' , BalancedBraces )
+ * L ( P "}" )
+% \end{macrocode}
+% Now for the environemnts.
+% \begin{macrocode}
+ BeamerBeginEnvironments =
+ ( space ^ 0 *
+ L
+ (
+ P "\\begin{" * BeamerNamesEnvironments * "}"
+ * ( P "<" * ( 1 - P ">") ^ 0 * P ">" ) ^ -1
+ )
+ * P "\r"
+ ) ^ 0
+ BeamerEndEnvironments =
+ ( space ^ 0 *
+ L ( P "\\end{" * BeamerNamesEnvironments * P "}" )
+ * P "\r"
+ ) ^ 0
+end
+% \end{macrocode}
+%
+% \bigskip
+% \paragraph{EOL}
+%
+% \bigskip
+% The following LPEG will detect the Python prompts when the user is typesetting
+% an interactive session of Python (directly or through |{pyconsole}| of
+% \pkg{pyluatex}). We have to detect that prompt twice. The first detection
+% (called \emph{hasty detection}) will be before the |\@@_begin_line:| because
+% you want to trigger a special background color for that row (and, after the
+% |\@@_begin_line:|, it's too late to change de background).
+% \begin{macrocode}
+local PromptHastyDetection = ( # ( P ">>>" + P "..." ) * Lc ( '\\@@_prompt:' ) ) ^ -1
+% \end{macrocode}
+% We remind that the marker |#| of \textsc{lpeg} specifies that the pattern will be
+% detected but won't consume any character.
+%
+% \medskip
+% With the following \textsc{lpeg}, a style will actually be applied to the
+% prompt (for instance, it's possible to decide to discard these prompts).
+% \begin{macrocode}
+local Prompt = K ( 'Prompt' , ( ( P ">>>" + P "..." ) * P " " ^ -1 ) ^ -1 )
+% \end{macrocode}
+%
+%
+%
+% \bigskip
+% The following \textsc{lpeg} |EOL| is for the end of lines.
+% \begin{macrocode}
+local EOL =
+ P "\r"
+ *
+ (
+ ( space^0 * -1 )
+ +
+% \end{macrocode}
+% We recall that each line in the Python code we have to parse will be sent
+% back to LaTeX between a pair |\@@_begin_line:| --
+% |\@@_end_line:|\footnote{Remember that the \texttt{\textbackslash
+% @@\_end\_line:} must be explicit because it will be used as marker in order to
+% delimit the argument of the command \texttt{\textbackslash @@\_begin\_line:}}.
+% \begin{macrocode}
+ Ct (
+ Cc "EOL"
+ *
+ Ct (
+ Lc "\\@@_end_line:"
+ * BeamerEndEnvironments
+ * BeamerBeginEnvironments
+ * PromptHastyDetection
+ * Lc "\\@@_newline: \\@@_begin_line:"
+ * Prompt
+ )
+ )
+ )
+ *
+ SpaceIndentation ^ 0
+% \end{macrocode}
+%
+%
+% \bigskip
+% \paragraph{The long strings}
+%
+%
+% \begin{macrocode}
+local SingleLongString =
+ WithStyle ( 'String.Long' ,
+ ( Q ( S "fF" * P "'''" )
+ * (
+ K ( 'String.Interpol' , P "{" )
+ * K ( 'Interpol.Inside' , ( 1 - S "}:\r" - P "'''" ) ^ 0 )
+ * Q ( P ":" * (1 - S "}:\r" - P "'''" ) ^ 0 ) ^ -1
+ * K ( 'String.Interpol' , P "}" )
+ +
+ Q ( ( 1 - P "'''" - S "{}'\r" ) ^ 1 )
+ +
+ EOL
+ ) ^ 0
+ +
+ Q ( ( S "rR" ) ^ -1 * P "'''" )
+ * (
+ Q ( ( 1 - P "'''" - S "\r%" ) ^ 1 )
+ +
+ PercentInterpol
+ +
+ P "%"
+ +
+ EOL
+ ) ^ 0
+ )
+ * Q ( P "'''" ) )
+
+
+local DoubleLongString =
+ WithStyle ( 'String.Long' ,
+ (
+ Q ( S "fF" * P "\"\"\"" )
+ * (
+ K ( 'String.Interpol', P "{" )
+ * K ( 'Interpol.Inside' , ( 1 - S "}:\r" - P "\"\"\"" ) ^ 0 )
+ * Q ( P ":" * (1 - S "}:\r" - P "\"\"\"" ) ^ 0 ) ^ -1
+ * K ( 'String.Interpol' , P "}" )
+ +
+ Q ( ( 1 - P "\"\"\"" - S "{}\"\r" ) ^ 1 )
+ +
+ EOL
+ ) ^ 0
+ +
+ Q ( ( S "rR" ) ^ -1 * P "\"\"\"" )
+ * (
+ Q ( ( 1 - P "\"\"\"" - S "%\r" ) ^ 1 )
+ +
+ PercentInterpol
+ +
+ P "%"
+ +
+ EOL
+ ) ^ 0
+ )
+ * Q ( P "\"\"\"" )
+ )
+% \end{macrocode}
+%
+% \begin{macrocode}
+local LongString = SingleLongString + DoubleLongString
+% \end{macrocode}
+%
+% \bigskip
+% We have a \textsc{lpeg} for the Python docstrings. That \textsc{lpeg} will
+% be used in the \textsc{lpeg} |DefFunction| which deals with the whole preamble
+% of a function definition (which begins with |def|).
+% \begin{macrocode}
+local StringDoc =
+ K ( 'String.Doc' , P "\"\"\"" )
+ * ( K ( 'String.Doc' , (1 - P "\"\"\"" - P "\r" ) ^ 0 ) * EOL
+ * Tab ^ 0
+ ) ^ 0
+ * K ( 'String.Doc' , ( 1 - P "\"\"\"" - P "\r" ) ^ 0 * P "\"\"\"" )
+% \end{macrocode}
+%
+% \bigskip
+% \paragraph{The comments in the Python listings}
+%
+% We define different \textsc{lpeg} dealing with comments in the Python
+% listings.
+% \begin{macrocode}
+local CommentMath =
+ P "$" * K ( 'Comment.Math' , ( 1 - S "$\r" ) ^ 1 ) * P "$"
+
+local Comment =
+ WithStyle ( 'Comment' ,
+ Q ( P "#" )
+ * ( CommentMath + Q ( ( 1 - S "$\r" ) ^ 1 ) ) ^ 0 )
+ * ( EOL + -1 )
+% \end{macrocode}
+%
+%
+%
+% \bigskip
+% The following \textsc{lpeg} |CommentLaTeX| is for what is called in that
+% document the ``LaTeX comments''. Since the elements that will be catched must
+% be sent to LaTeX with standard LaTeX catcodes, we put the capture (done by
+% the function~|C|) in a table (by using~|Ct|, which is an alias for |lpeg.Ct|).
+% \begin{macrocode}
+local CommentLaTeX =
+ P(piton.comment_latex)
+ * Lc "{\\PitonStyle{Comment.LaTeX}{\\ignorespaces"
+ * L ( ( 1 - P "\r" ) ^ 0 )
+ * Lc "}}"
+ * ( EOL + -1 ) -- you could put EOL instead of EOL
+% \end{macrocode}
+%
+% \bigskip
+% \paragraph{DefFunction}
+%
+% The following \textsc{lpeg} |Expression| will be used for the parameters in
+% the \emph{argspec} of a Python function. It's necessary to use a \emph{grammar}
+% because that pattern mainly checks the correct nesting of the delimiters
+% (and it's known in the theory of formal languages that this can't be done with
+% regular expressions \emph{stricto sensu} only).
+% \begin{macrocode}
+local Expression =
+ P { "E" ,
+ E = ( 1 - S "{}()[]\r," ) ^ 0
+ * (
+ ( P "{" * V "F" * P "}"
+ + P "(" * V "F" * P ")"
+ + P "[" * V "F" * P "]" ) * ( 1 - S "{}()[]\r," ) ^ 0
+ ) ^ 0 ,
+ F = ( 1 - S "{}()[]\r\"'" ) ^ 0
+ * ( (
+ P "'" * (P "\\'" + 1 - S"'\r" )^0 * P "'"
+ + P "\"" * (P "\\\"" + 1 - S"\"\r" )^0 * P "\""
+ + P "{" * V "F" * P "}"
+ + P "(" * V "F" * P ")"
+ + P "[" * V "F" * P "]"
+ ) * ( 1 - S "{}()[]\r\"'" ) ^ 0 ) ^ 0 ,
+ }
+% \end{macrocode}
+%
+% \bigskip
+% We will now define a \textsc{lpeg} |Params| that will catch the list of
+% parameters (that is to say the \emph{argspec}) in the definition of a Python
+% function. For example, in the line of code
+% \begin{center}
+% \piton{def MyFunction(a,b,x=10,n:int): return n}
+% \end{center}
+% the \textsc{lpeg} |Params| will be used to catch the chunk\enskip |a,b,x=10,n:int|.
+%
+% Or course, a |Params| is simply a comma-separated list of |Param|, and that's
+% why we define first the \textsc{lpeg} |Param|.
+%
+% \medskip
+% \begin{macrocode}
+local Param =
+ SkipSpace * Identifier * SkipSpace
+ * (
+ K ( 'InitialValues' , P "=" * Expression )
+ + Q ( P ":" ) * SkipSpace * K ( 'Name.Type' , letter^1 )
+ ) ^ -1
+% \end{macrocode}
+%
+% \medskip
+% \begin{macrocode}
+local Params = ( Param * ( Q "," * Param ) ^ 0 ) ^ -1
+% \end{macrocode}
+%
+% \bigskip
+% The following \textsc{lpeg} |DefFunction| catches a keyword |def| and the
+% following name of function \emph{but also everything else until a potential
+% docstring}. That's why this definition of \textsc{lpeg} must occur (in the file
+% |piton.sty|) after the definition of several other \textsc{lpeg} such as
+% |Comment|, |CommentLaTeX|, |Params|, |StringDoc|...
+% \begin{macrocode}
+local DefFunction =
+ K ( 'Keyword' , P "def" )
+ * Space
+ * K ( 'Name.Function.Internal' , identifier )
+ * SkipSpace
+ * Q ( P "(" ) * Params * Q ( P ")" )
+ * SkipSpace
+ * ( Q ( P "->" ) * SkipSpace * K ( 'Name.Type' , identifier ) ) ^ -1
+% \end{macrocode}
+% Here, we need a \pkg{piton} style |ParseAgain| which will be linked to
+% |\@@_piton:n| (that means that the capture will be parsed once again by
+% \pkg{piton}). We could avoid that kind of trick by using a non-terminal of a
+% grammar but we have probably here a better legibility.
+% \begin{macrocode}
+ * K ( 'ParseAgain' , ( 1 - S ":\r" )^0 )
+ * Q ( P ":" )
+ * ( SkipSpace
+ * ( EOL + CommentLaTeX + Comment ) -- in all cases, that contains an EOL
+ * Tab ^ 0
+ * SkipSpace
+ * StringDoc ^ 0 -- there may be additionnal docstrings
+ ) ^ -1
+% \end{macrocode}
+% Remark that, in the previous code, |CommentLaTeX| \emph{must} appear
+% before |Comment|: there is no commutativity of the addition for the
+% \emph{parsing expression grammars} (\textsc{peg}).
+%
+% \smallskip
+% If the word |def| is not followed by an identifier and parenthesis, it will be
+% catched as keyword by the \textsc{lpeg} |Keyword| (useful if, for example, the
+% final user wants to speak of the keyword \piton{def}).
+%
+% \bigskip
+% \paragraph{The dictionaries of Python}
+%
+% We have \textsc{lpeg} dealing with dictionaries of Python because, in
+% typesettings of explicit Python dictionaries, one may prefer to have all the
+% values formatted in black (in order to see more clearly the keys which are
+% usually Python strings). That's why we have a \pkg{piton} style |Dict.Value|.
+%
+% The initial value of that \pkg{piton} style is |\@@_piton:n|, which means that
+% the value of the entry of the dictionary is parsed once again by \pkg{piton}
+% (and nothing special is done for the dictionary). In the following example, we
+% have set the \pkg{piton} style |Dict.Value| to |\color{black}|:
+%
+% \medskip
+% \begingroup
+% \SetPitonStyle{Dict.Value = \color{black}}
+% \piton{mydict = { 'name' : 'Paul', 'sex' : 'male', 'age' : 31 } }
+% \endgroup
+%
+% \medskip
+% At this time, this mechanism works only for explicit dictionaries on a single line!
+%
+% \begin{macrocode}
+local ItemDict =
+ ShortString * SkipSpace * Q ( P ":" ) * K ( 'Dict.Value' , Expression )
+
+local ItemOfSet = SkipSpace * ( ItemDict + ShortString ) * SkipSpace
+
+local Set =
+ Q ( P "{" )
+ * ItemOfSet * ( Q ( P "," ) * ItemOfSet ) ^ 0
+ * Q ( P "}" )
+% \end{macrocode}
+%
+% \paragraph{Miscellaneous}
+%
+% \begin{macrocode}
+local ExceptionInConsole = Exception * Q ( ( 1 - P "\r" ) ^ 0 ) * EOL
+% \end{macrocode}
+%
+%
+% \bigskip
+% \paragraph{The main LPEG}
+%
+% First, the main loop :
+% \begin{macrocode}
+MainLoopPython =
+ ( ( space^1 * -1 )
+ + EOL
+ + Space
+ + Tab
+ + Escape
+ + CommentLaTeX
+ + Beamer
+ + UserCommands
+ + LongString
+ + Comment
+ + ExceptionInConsole
+ + Set
+ + Delim
+% \end{macrocode}
+% |Operator| must be before |Punct|.
+% \begin{macrocode}
+ + Operator
+ + ShortString
+ + Punct
+ + FromImport
+ + RaiseException
+ + DefFunction
+ + DefClass
+ + Keyword * ( Space + Punct + Delim + EOL+ -1 )
+ + Decorator
+ + OperatorWord * ( Space + Punct + Delim + EOL+ -1 )
+ + Builtin * ( Space + Punct + Delim + EOL+ -1 )
+ + Identifier
+ + Number
+ + Word
+ ) ^ 0
+% \end{macrocode}
+%
+% \bigskip
+% We recall that each line in the Python code to parse will be sent back to
+% LaTeX between a pair |\@@_begin_line:| -- |\@@_end_line:|\footnote{Remember
+% that the \texttt{\textbackslash @@\_end\_line:} must be explicit because it
+% will be used as marker in order to delimit the argument of the command
+% \texttt{\textbackslash @@\_begin\_line:}}.
+% \begin{macrocode}
+local python = P ( true )
+
+python =
+ Ct (
+ ( ( space - P "\r" ) ^0 * P "\r" ) ^ -1
+ * BeamerBeginEnvironments
+ * PromptHastyDetection
+ * Lc '\\@@_begin_line:'
+ * Prompt
+ * SpaceIndentation ^ 0
+ * MainLoopPython
+ * -1
+ * Lc '\\@@_end_line:'
+ )
+% \end{macrocode}
+%
+% \begin{macrocode}
+local languages = { }
+languages['python'] = python
+% \end{macrocode}
+%
+% % \bigskip
+% \subsubsection{The LPEG ocaml}
+%
+% \begin{macrocode}
+local Delim = Q ( P "[|" + P "|]" + S "[()]" )
+% \end{macrocode}
+%
+% \begin{macrocode}
+local Punct = Q ( S ",:;!" )
+% \end{macrocode}
+%
+% \begin{macrocode}
+local identifier =
+ ( R "az" + R "AZ" + P "_") * ( R "az" + R "AZ" + S "_'" + digit ) ^ 0
+
+local Identifier = K ( 'Identifier' , identifier )
+
+local Operator =
+ K ( 'Operator' ,
+ P "!=" + P "<>" + P "==" + P "<<" + P ">>" + P "<=" + P ">=" + P ":="
+ + P "||" + P "&&" + P "//" + P "**" + P ";;" + P "::" + P "->"
+ + P "+." + P "-." + P "*." + P "/."
+ + S "-~+/*%=<>&@|"
+ )
+
+local OperatorWord =
+ K ( 'Operator.Word' ,
+ P "and" + P "asr" + P "land" + P "lor" + P "lsl" + P "lxor"
+ + P "mod" + P "or" )
+
+local Keyword =
+ K ( 'Keyword' ,
+ P "as" + P "assert" + P "begin" + P "class" + P "constraint" + P "done"
+ + P "do" + P "downto" + P "else" + P "end" + P "exception" + P "external"
+ + P "false" + P "for" + P "function" + P "fun" + P "functor" + P "if"
+ + P "in" + P "include" + P "inherit" + P "initializer" + P "lazy" + P "let"
+ + P "match" + P "method" + P "module" + P "mutable" + P "new" + P "object"
+ + P "of" + P "open" + P "private" + P "raise" + P "rec" + P "sig"
+ + P "struct" + P "then" + P "to" + P "true" + P "try" + P "type"
+ + P "value" + P "val" + P "virtual" + P "when" + P "while" + P "with" )
+ + K ( 'Keyword.Constant' , P "true" + P "false" )
+
+
+local Builtin =
+ K ( 'Name.Builtin' ,
+ P "not" + P "incr" + P "decr" + P "fst" + P "snd"
+ + P "String.length"
+ + P "List.tl" + P "List.hd" + P "List.mem" + P "List.exists"
+ + P "List.for_all" + P "List.filter" + P "List.length" + P "List.map"
+ + P "List.iter"
+ + P "Array.length" + P "Array.make" + P "Array.make_matrix"
+ + P "Array.init" + P "Array.copy" + P "Array.copy" + P "Array.mem"
+ + P "Array.exists" + P "Array.for_all" + P "Array.map" + P "Array.iter"
+ + P "Queue.create" + P "Queue.is_empty" + P "Queue.push" + P "Queue.pop"
+ + P "Stack.create" + P "Stack.is_empty" + P "Stack.push" + P "Stack.pop"
+ + P "Hashtbl.create" + P "Hashtbl.add" + P "Hashtbl.remove"
+ + P "Hashtbl.mem" + P "Hashtbl.find" + P "Hashtbl.find_opt"
+ + P "Hashtbl.iter" )
+% \end{macrocode}
+%
+% \bigskip
+% The following exceptions are exceptions in the standard library of OCaml (Stdlib).
+% \begin{macrocode}
+local Exception =
+ K ( 'Exception' ,
+ P "Division_by_zero" + P "End_of_File" + P "Failure"
+ + P "Invalid_argument" + P "Match_failure" + P "Not_found"
+ + P "Out_of_memory" + P "Stack_overflow" + P "Sys_blocked_io"
+ + P "Sys_error" + P "Undefined_recursive_module" )
+% \end{macrocode}
+%
+% \bigskip
+% \paragraph{The characters in OCaml}
+%
+% \begin{macrocode}
+local Char =
+ K ( 'String.Short' , P "'" * ( ( 1 - P "'" ) ^ 0 + P "\\'" ) * P "'" )
+% \end{macrocode}
+%
+%
+% \bigskip
+% \paragraph{Beamer}
+%
+% \begin{macrocode}
+local BalancedBraces =
+ P { "E" ,
+ E =
+ (
+ P "{" * V "E" * P "}"
+ +
+ P "\"" * ( 1 - S "\"" ) ^ 0 * P "\"" -- OCaml strings
+ +
+ ( 1 - S "{}" )
+ ) ^ 0
+ }
+% \end{macrocode}
+%
+%
+% \begin{macrocode}
+if piton_beamer
+then
+ Beamer =
+ L ( P "\\pause" * ( P "[" * (1 - P "]") ^ 0 * P "]" ) ^ -1 )
+ +
+ ( P "\\uncover" * Lc ( '\\@@_beamer_command:n{uncover}' )
+ + P "\\only" * Lc ( '\\@@_beamer_command:n{only}' )
+ + P "\\alert" * Lc ( '\\@@_beamer_command:n{alert}' )
+ + P "\\visible" * Lc ( '\\@@_beamer_command:n{visible}' )
+ + P "\\invisible" * Lc ( '\\@@_beamer_command:n{invisible}' )
+ + P "\\action" * Lc ( '\\@@_beamer_command:n{action}' )
+ )
+ *
+ L ( ( P "<" * (1 - P ">") ^ 0 * P ">" ) ^ -1 * P "{" )
+ * K ( 'ParseAgain.noCR' , BalancedBraces )
+ * L ( P "}" )
+ +
+ L (
+ ( P "\\alt" )
+ * P "<" * (1 - P ">") ^ 0 * P ">"
+ * P "{"
+ )
+ * K ( 'ParseAgain.noCR' , BalancedBraces )
+ * L ( P "}{" )
+ * K ( 'ParseAgain.noCR' , BalancedBraces )
+ * L ( P "}" )
+ +
+ L (
+ ( P "\\temporal" )
+ * P "<" * (1 - P ">") ^ 0 * P ">"
+ * P "{"
+ )
+ * K ( 'ParseAgain.noCR' , BalancedBraces )
+ * L ( P "}{" )
+ * K ( 'ParseAgain.noCR' , BalancedBraces )
+ * L ( P "}{" )
+ * K ( 'ParseAgain.noCR' , BalancedBraces )
+ * L ( P "}" )
+ BeamerBeginEnvironments =
+ ( space ^ 0 *
+ L
+ (
+ P "\\begin{" * BeamerNamesEnvironments * "}"
+ * ( P "<" * ( 1 - P ">") ^ 0 * P ">" ) ^ -1
+ )
+ * P "\r"
+ ) ^ 0
+ BeamerEndEnvironments =
+ ( space ^ 0 *
+ L ( P "\\end{" * BeamerNamesEnvironments * P "}" )
+ * P "\r"
+ ) ^ 0
+end
+% \end{macrocode}
+%
+% \bigskip
+% \paragraph{EOL}
+% \begin{macrocode}
+local EOL =
+ P "\r"
+ *
+ (
+ ( space^0 * -1 )
+ +
+ Ct (
+ Cc "EOL"
+ *
+ Ct (
+ Lc "\\@@_end_line:"
+ * BeamerEndEnvironments
+ * BeamerBeginEnvironments
+ * PromptHastyDetection
+ * Lc "\\@@_newline: \\@@_begin_line:"
+ * Prompt
+ )
+ )
+ )
+ *
+ SpaceIndentation ^ 0
+% \end{macrocode}
+%
+%
+% \begin{macrocode}
+%
+% \paragraph{The strings}
+%
+% We need a pattern |string| without captures because it will be used within the
+% comments of OCaml.
+% \begin{macrocode}
+local string =
+ Q ( P "\"" )
+ * (
+ VisualSpace
+ +
+ Q ( ( 1 - S " \"\r" ) ^ 1 )
+ +
+ EOL
+ ) ^ 0
+ * Q ( P "\"" )
+% \end{macrocode}
+%
+% \begin{macrocode}
+local String = WithStyle ( 'String.Long' , string )
+% \end{macrocode}
+%
+%
+% \bigskip
+% Now, the ``quoted strings'' of OCaml (for example \verb+{ext|Essai|ext}+).
+%
+% For those strings, we will do two consecutive analysis. First an analysis to
+% determine the whole string and, then, an analysis for the potential visual
+% spaces and the EOL in the string.
+%
+% The first analysis require a match-time capture. For explanations about that
+% programmation, see the paragraphe \emph{Lua's long % strings} in
+% |www.inf.puc-rio.br/~roberto/lpeg|.
+% \begin{macrocode}
+local ext = ( R "az" + P "_" ) ^ 0
+local open = "{" * Cg(ext, 'init') * "|"
+local close = "|" * C(ext) * "}"
+local closeeq =
+ Cmt ( close * Cb('init'),
+ function (s, i, a, b) return a==b end )
+% \end{macrocode}
+%
+% \medskip
+% The \textsc{lpeg} |QuotedStringBis| will do the second analysis.
+% \begin{macrocode}
+local QuotedStringBis =
+ WithStyle ( 'String.Long' ,
+ (
+ VisualSpace
+ +
+ Q ( ( 1 - S " \r" ) ^ 1 )
+ +
+ EOL
+ ) ^ 0 )
+
+% \end{macrocode}
+%
+% \medskip
+% We use a ``function capture'' (as called in the official documentation of the
+% \textsc{lpeg}) in order to do the second analysis on the result of the first one.
+% \begin{macrocode}
+local QuotedString =
+ C ( open * ( 1 - closeeq ) ^ 0 * close ) /
+ ( function (s) return QuotedStringBis : match(s) end )
+% \end{macrocode}
+%
+%
+% \bigskip
+% \paragraph{The comments in the OCaml listings}
+%
+% In OCaml, the delimiters for the comments are |(*| and |*)|. There are
+% unsymmetrical and, therefore, the comments may be nested. That's why we need a
+% grammar.
+%
+% In these comments, we embed the math comments (between |$| and |$|) and we
+% embed also a treatment for the end of lines (since the comments may be multi-lines).
+%
+% \begin{macrocode}
+local Comment =
+ WithStyle ( 'Comment' ,
+ P {
+ "A" ,
+ A = Q "(*"
+ * ( V "A"
+ + Q ( ( 1 - P "(*" - P "*)" - S "\r$\"" ) ^ 1 ) -- $
+ + string
+ + P "$" * K ( 'Comment.Math' , ( 1 - S "$\r" ) ^ 1 ) * P "$" -- $
+ + EOL
+ ) ^ 0
+ * Q "*)"
+ } )
+% \end{macrocode}
+%
+% \bigskip
+% \paragraph{The DefFunction}
+%
+% \begin{macrocode}
+local DefFunction =
+ K ( 'Keyword' , P "let rec" + P "let" + P "and" )
+ * Space
+ * K ( 'Name.Function.Internal' , identifier )
+ * Space
+ * # ( P "=" * space * P "function" + ( 1 - P "=" ) )
+% \end{macrocode}
+%
+% \bigskip
+% \paragraph{The parameters of the types}
+%
+% \begin{macrocode}
+local TypeParameter = K ( 'TypeParameter' , P "'" * alpha * # ( 1 - P "'" ) )
+% \end{macrocode}
+%
+% \bigskip
+% \paragraph{The main LPEG}
+%
+% First, the main loop :
+% \begin{macrocode}
+MainLoopOCaml =
+ ( ( space^1 * -1 )
+ + EOL
+ + Space
+ + Tab
+ + Escape
+ + Beamer
+ + TypeParameter
+ + String + QuotedString + Char
+ + Comment
+ + Delim
+ + Operator
+ + Punct
+ + FromImport
+ + ImportAs
+ + Exception
+ + DefFunction
+ + Keyword * ( Space + Punct + Delim + EOL + -1 )
+ + OperatorWord * ( Space + Punct + Delim + EOL + -1 )
+ + Builtin * ( Space + Punct + Delim + EOL + -1 )
+ + Identifier
+ + Number
+ + Word
+ ) ^ 0
+% \end{macrocode}
+%
+% \bigskip
+% We recall that each line in the Python code to parse will be sent back to
+% LaTeX between a pair |\@@_begin_line:| -- |\@@_end_line:|\footnote{Remember
+% that the \texttt{\textbackslash @@\_end\_line:} must be explicit because it
+% will be used as marker in order to delimit the argument of the command
+% \texttt{\textbackslash @@\_begin\_line:}}.
+% \begin{macrocode}
+local ocaml = P ( true )
+
+ocaml =
+ Ct (
+ ( ( space - P "\r" ) ^0 * P "\r" ) ^ -1
+ * BeamerBeginEnvironments
+ * Lc ( '\\@@_begin_line:' )
+ * SpaceIndentation ^ 0
+ * MainLoopOCaml
+ * -1
+ * Lc ( '\\@@_end_line:' )
+ )
+% \end{macrocode}
+%
+% \begin{macrocode}
+languages['ocaml'] = ocaml
+% \end{macrocode}
+%
+% \bigskip
+% \subsubsection{The function Parse}
+%
+%
+% The function |Parse| is the main function of the package \pkg{piton}.
+% It parses its argument and sends back to LaTeX the code with interlaced
+% formatting LaTeX instructions. In fact, everything is done by the
+% \textsc{lpeg} |python| which returns as capture a Lua table containing
+% data to send to LaTeX.
+%
+% \bigskip
+% \begin{macrocode}
+function piton.Parse(language,code)
+ local t = languages[language] : match ( code )
+ local left_stack = {}
+ local right_stack = {}
+ for _ , one_item in ipairs(t)
+ do
+ if one_item[1] == "EOL"
+ then
+ for _ , s in ipairs(right_stack)
+ do tex.sprint( s )
+ end
+ for _ , s in ipairs(one_item[2])
+ do tex.tprint(s)
+ end
+ for _ , s in ipairs(left_stack)
+ do tex.sprint( s )
+ end
+ else
+ if one_item[1] == "Open"
+ then
+ tex.sprint( one_item[2] )
+ table.insert(left_stack,one_item[2])
+ table.insert(right_stack,one_item[3])
+ else
+ if one_item[1] == "Close"
+ then
+ tex.sprint( right_stack[#right_stack] )
+ left_stack[#left_stack] = nil
+ right_stack[#right_stack] = nil
+ else
+ tex.tprint(one_item)
+ end
+ end
+ end
+ end
+end
+% \end{macrocode}
+%
+%
+%
+% \bigskip
+% The function |ParseFile| will be used by the LaTeX command |\PitonInputFile|.
+% That function merely reads the whole file (that is to say all its lines) and
+% then apply the function~|Parse| to the resulting Lua string.
+% \begin{macrocode}
+function piton.ParseFile(language,name,first_line,last_line)
+ s = ''
+ local i = 0
+ for line in io.lines(name)
+ do i = i + 1
+ if i >= first_line
+ then s = s .. '\r' .. line
+ end
+ if i >= last_line then break end
+ end
+ piton.Parse(language,s)
+end
+% \end{macrocode}
+%
+% \bigskip
+% \subsubsection{Two variants of the function Parse with integrated preprocessors}
+%
+% The following command will be used by the user command |\piton|.
+% For that command, we have to undo the duplication of the symbols |#|.
+% \begin{macrocode}
+function piton.ParseBis(language,code)
+ local s = ( Cs ( ( P '##' / '#' + 1 ) ^ 0 ) ) : match ( code )
+ return piton.Parse(language,s)
+end
+% \end{macrocode}
+%
+% \bigskip
+% The following command will be used when we have to parse some small chunks of
+% code that have yet been parsed. They are re-scanned by LaTeX because it has
+% been required by |\@@_piton:n| in the \pkg{piton} style of the syntaxic
+% element. In that case, you have to remove the potential |\@@_breakable_space:|
+% that have been inserted when the key |break-lines| is in force.
+% \begin{macrocode}
+function piton.ParseTer(language,code)
+ local s = ( Cs ( ( P '\\@@_breakable_space:' / ' ' + 1 ) ^ 0 ) )
+ : match ( code )
+ return piton.Parse(language,s)
+end
+% \end{macrocode}
+%
+%
+% \bigskip
+% \subsubsection{Preprocessors of the function Parse for gobble}
+%
+% We deal now with preprocessors of the function |Parse| which are needed when
+% the ``gobble mechanism'' is used.
+%
+%
+% \bigskip
+% The function |gobble| gobbles $n$ characters on the left of the code. It uses
+% a \textsc{lpeg} that we have to compute dynamically because if depends on the
+% value of~$n$.
+% \begin{macrocode}
+local function gobble(n,code)
+ function concat(acc,new_value)
+ return acc .. new_value
+ end
+ if n==0
+ then return code
+ else
+ return Cf (
+ Cc ( "" ) *
+ ( 1 - P "\r" ) ^ (-n) * C ( ( 1 - P "\r" ) ^ 0 )
+ * ( C ( P "\r" )
+ * ( 1 - P "\r" ) ^ (-n)
+ * C ( ( 1 - P "\r" ) ^ 0 )
+ ) ^ 0 ,
+ concat
+ ) : match ( code )
+ end
+end
+% \end{macrocode}
+%
+%
+%
+% \bigskip
+% The following function |add| will be used in the following \textsc{lpeg}
+% |AutoGobbleLPEG|, |TabsAutoGobbleLPEG| and |EnvGobbleLPEG|.
+% \begin{macrocode}
+local function add(acc,new_value)
+ return acc + new_value
+end
+% \end{macrocode}
+%
+% \bigskip
+% The following \textsc{lpeg} returns as capture the minimal number of spaces at
+% the beginning of the lines of code. The main work is done by two \emph{fold
+% captures} (|lpeg.Cf|), one using |add| and the other (encompassing the
+% previous one) using |math.min| as folding operator.
+% \begin{macrocode}
+local AutoGobbleLPEG =
+ ( space ^ 0 * P "\r" ) ^ -1
+ * Cf (
+ (
+% \end{macrocode}
+% We don't take into account the empty lines (with only spaces).
+% \begin{macrocode}
+ ( P " " ) ^ 0 * P "\r"
+ +
+ Cf ( Cc(0) * ( P " " * Cc(1) ) ^ 0 , add )
+ * ( 1 - P " " ) * ( 1 - P "\r" ) ^ 0 * P "\r"
+ ) ^ 0
+% \end{macrocode}
+% Now for the last line of the Python code...
+% \begin{macrocode}
+ *
+ ( Cf ( Cc(0) * ( P " " * Cc(1) ) ^ 0 , add )
+ * ( 1 - P " " ) * ( 1 - P "\r" ) ^ 0 ) ^ -1 ,
+ math.min
+ )
+% \end{macrocode}
+%
+% \bigskip
+% The following \textsc{lpeg} is similar but works with the indentations.
+% \begin{macrocode}
+local TabsAutoGobbleLPEG =
+ ( space ^ 0 * P "\r" ) ^ -1
+ * Cf (
+ (
+ ( P "\t" ) ^ 0 * P "\r"
+ +
+ Cf ( Cc(0) * ( P "\t" * Cc(1) ) ^ 0 , add )
+ * ( 1 - P "\t" ) * ( 1 - P "\r" ) ^ 0 * P "\r"
+ ) ^ 0
+ *
+ ( Cf ( Cc(0) * ( P "\t" * Cc(1) ) ^ 0 , add )
+ * ( 1 - P "\t" ) * ( 1 - P "\r" ) ^ 0 ) ^ -1 ,
+ math.min
+ )
+% \end{macrocode}
+%
+%
+%
+% \bigskip
+% The following \textsc{lpeg} returns as capture the number of spaces at the
+% last line, that is to say before the |\end{Piton}| (and usually it's also the
+% number of spaces before the corresponding |\begin{Piton}| because that's the
+% traditionnal way to indent in LaTeX). The main work is done by a \emph{fold
+% capture} (|lpeg.Cf|) using the function |add| as folding operator.
+% \begin{macrocode}
+local EnvGobbleLPEG =
+ ( ( 1 - P "\r" ) ^ 0 * P "\r" ) ^ 0
+ * Cf ( Cc(0) * ( P " " * Cc(1) ) ^ 0 , add ) * -1
+% \end{macrocode}
+%
+% \bigskip
+% \begin{macrocode}
+function piton.GobbleParse(language,n,code)
+ if n==-1
+ then n = AutoGobbleLPEG : match(code)
+ else if n==-2
+ then n = EnvGobbleLPEG : match(code)
+ else if n==-3
+ then n = TabsAutoGobbleLPEG : match(code)
+ end
+ end
+ end
+ piton.Parse(language,gobble(n,code))
+end
+% \end{macrocode}
+%
+% \bigskip
+% \subsubsection{To count the number of lines}
+%
+% \medskip
+% \begin{macrocode}
+function piton.CountLines(code)
+ local count = 0
+ for i in code : gmatch ( "\r" ) do count = count + 1 end
+ tex.sprint(
+ luatexbase.catcodetables.expl ,
+ '\\int_set:Nn \\l_@@_nb_lines_int {' .. count .. '}' )
+end
+% \end{macrocode}
+%
+% \begin{macrocode}
+function piton.CountNonEmptyLines(code)
+ local count = 0
+ count =
+ ( Cf ( Cc(0) *
+ (
+ ( P " " ) ^ 0 * P "\r"
+ + ( 1 - P "\r" ) ^ 0 * P "\r" * Cc(1)
+ ) ^ 0
+ * (1 - P "\r" ) ^ 0 ,
+ add
+ ) * -1 ) : match (code)
+ tex.sprint(
+ luatexbase.catcodetables.expl ,
+ '\\int_set:Nn \\l_@@_nb_non_empty_lines_int {' .. count .. '}' )
+end
+% \end{macrocode}
+%
+% \bigskip
+% \begin{macrocode}
+function piton.CountLinesFile(name)
+ local count = 0
+ for line in io.lines(name) do count = count + 1 end
+ tex.sprint(
+ luatexbase.catcodetables.expl ,
+ '\\int_set:Nn \\l_@@_nb_lines_int {' .. count .. '}' )
+end
+% \end{macrocode}
+%
+%
+% \bigskip
+% \begin{macrocode}
+function piton.CountNonEmptyLinesFile(name)
+ local count = 0
+ for line in io.lines(name)
+ do if not ( ( ( P " " ) ^ 0 * -1 ) : match ( line ) )
+ then count = count + 1
+ end
+ end
+ tex.sprint(
+ luatexbase.catcodetables.expl ,
+ '\\int_set:Nn \\l_@@_nb_non_empty_lines_int {' .. count .. '}' )
+end
+% \end{macrocode}
+%
+% \begin{macrocode}
+\end{luacode*}
+% \end{macrocode}
+%
+%
+% \vspace{1cm}
+% \section{History}
+%
+% The successive versions of the file |piton.sty| provided by TeXLive are available on the
+% \textsc{svn} server of TeXLive:\par\nobreak
+%
+% \smallskip
+% {
+% \small
+% \nolinkurl{https://tug.org/svn/texlive/trunk/Master/texmf-dist/tex/lualatex/piton/piton.sty}
+% }
+%
+% % \subsection*{Changes between versions 1.4 and 1.5}
+%
+% New key |numbers-sep|.
+%
+%
+% \subsection*{Changes between versions 1.3 and 1.4}
+%
+% New key |identifiers| in |\PitonOptions|.
+%
+% New command |\PitonStyle|.
+%
+% |background-color| now accepts as value a \emph{list} of colors.
+%
+% \subsection*{Changes between versions 1.2 and 1.3}
+%
+% When the class Beamer is used, the environment |{Piton}| and the command
+% |\PitonInputFile| are ``overlay-aware'' (that is to say, they accept a
+% specification of overlays between angular brackets).
+%
+% New key |prompt-background-color|
+%
+% It's now possible to use the command |\label| to reference a line of code in
+% an environment |{Piton}|.
+%
+% A new command |\|⣠is available in the argument of the command |\piton{...}| to
+% insert a space (otherwise, several spaces are replaced by a single space).
+%
+% \subsection*{Changes between versions 1.1 and 1.2}
+%
+% New keys |break-lines-in-piton| and |break-lines-in-Piton|.
+%
+% New key |show-spaces-in-string| and modification of the key |show-spaces|.
+%
+% When the class \cls{beamer} is used, the environements |{uncoverenv}|,
+% |{onlyenv}|, |{visibleenv}| and |{invisibleenv}|
+%
+%
+% \subsection*{Changes between versions 1.0 and 1.1}
+%
+% The extension \pkg{piton} detects the class \cls{beamer} and activates the
+% commands |\action|, |\alert|, |\invisible|, |\only|, |\uncover| and |\visible|
+% in the environments |{Piton}| when the class \cls{beamer} is used.
+%
+% \subsection*{Changes between versions 0.99 and 1.0}
+%
+% New key |tabs-auto-gobble|.
+%
+% \subsection*{Changes between versions 0.95 and 0.99}
+%
+% New key |break-lines| to allow breaks of the lines of code (and other keys to
+% customize the appearance).
+%
+% \subsection*{Changes between versions 0.9 and 0.95}
+%
+% New key |show-spaces|.
+%
+% The key |left-margin| now accepts the special value |auto|.
+%
+% New key |latex-comment| at load-time and replacement of |##| by |#>|
+%
+% New key |math-comments| at load-time.
+%
+% New keys |first-line| and |last-line| for the command |\InputPitonFile|.
+%
+% \subsection*{Changes between versions 0.8 and 0.9}
+%
+% New key |tab-size|.
+%
+% Integer value for the key |splittable|.
+%
+% \subsection*{Changes between versions 0.7 and 0.8}
+%
+% New keys |footnote| and |footnotehyper| at load-time.
+%
+% New key |left-margin|.
+%
+% \subsection*{Changes between versions 0.6 and 0.7}
+%
+% New keys |resume|, |splittable| and |background-color| in |\PitonOptions|.
+%
+% The file |piton.lua| has been embedded in the file |piton.sty|. That means
+% that the extension \pkg{piton} is now entirely contained in the file |piton.sty|.
+%
+%
+%
+% \tableofcontents
+%
+% \end{document}
+%
+%
+% Local Variables:
+% TeX-fold-mode: t
+% TeX-fold-preserve-comments: nil
+% flyspell-mode: nil
+% fill-column: 80
+% End:
+
+
+
+
+
+
diff --git a/macros/luatex/latex/piton/piton.pdf b/macros/luatex/latex/piton/piton.pdf
index 3697dd93ed..e573842f13 100644
--- a/macros/luatex/latex/piton/piton.pdf
+++ b/macros/luatex/latex/piton/piton.pdf
@@ -389,19 +389,27 @@ endobj
<< /S /GoTo /D [ 225 0 R /FitBH 771.02165 ] >>
endobj
230 0 obj
-<< /Filter /FlateDecode /Length 3399 >>
-stream
-xڽˎ#·ñ>_ÑÇYC“Å7 ­,Î)ÎÞl ñ!Ù
-ÏÜòéóòÓsã8—üÂñErÀ´â\|äNG0x¯Lº—§8ê—O?jŠC‚aJ­
-™Çk×g#a‚y­…íÀÎœ7‹Í”ÑÌóψþCš¦Ätˤ ¢aHIƎиv¸¼¸-`iIHG¼túÂóÖzN#HÃpâb¬aÒ–¥J[9¨Î#è
-ªl¢&œß*ò †™òRˆ€9Ø‚#«\i§<:àÎ*¯]{_!T
-ÂL}º“%P8ÎC[´õLYUtãœ(káH%•щÅ”MãÅÇòQõ•ô4ü"îfNà©D>ÊWòé‰H|'l<IBŸŽÈ?^¥>R®#>wt†äieÄ@š‡îmY¡7š‡Ë—Èe˜Pô1 9œ "N¿(2)‘eÆwŠ.ôâQÑÑLÐbƉi|ð£AÚMƒœbÒ¡ÑûǦAÎéF2/õŠÒsc$…ÚN5â?jxsM5Êœª²þñû’.~ü>Ðkü•NwÎÓ)æp oA89to­¼Dc0ãjcœ1F r ”¯Ì$Øp=¶F•c\*‡sÀ$e'k)d >¨õ¤’b¬È‚¾Ñ;»Å;ÙÃz¹ÁòU‚-êH
-Np­ œ(iT- 0b,Às¨!|41&‘—äœ,­Ÿ°í› zˉIÅÇÄh`dŒCÙE¹ê/¢{R»6(Q§­ó#ĤQ Z°žD©Ö½Þ$V´«Ã'âbòÚõtíë¦;Ÿ(çÌÖ´%ÂlT1ØXÈ”²µ|Mª wy,”ÄäÓ¸îä«0žaš7Bó>n«p·Z§"³wÓ˜À;9l„¸G ›7fÅ
-«ˆÁw’ç`µ8“íT7:‰1%Ó]ò”òu7¸šn«ØL`Ô¿b'yTM
-§rÚ” ÖìÃbÜ>õcJ¿‘W`Í­É2IcúõáÿvwŠ{f‚géå(KÆâ¿&dÜõ&fÝv§šQàWmÒ\–{Òï ‡Q< €Œ-T9D4…K¤¨NÕLÃ8Ušèwéh(ã.šÚÆy'„ÌØ\´M2–œd‘¸¯ò 0Œ¿+ú²Z¿MbÈ5!ÛRÚ›(óšaÊ>ÀÈŒCùp]vÂ"9wS³;Ì¥ù©Ð2—;
-c„YÍ6ñW–Ùžû¬{”s_Ç÷ ¸à{ÖÔ·EÀÛ¤KùçˆÃÜ"/,MÃëòqîi./ë˜UY<bN2oÝ{Ë“:·r'|½âM÷ùw1iáêGÈ)´B„Ú¹œVžX‰ø>sÝäɽ}€·LKy‡}0eÜ‚s`I&ÒÝÿ¸ýª-[É€1fñp¤­ ²•r‰ïuh+e|Ú¾‚Õ†Lª7r+Í<¶p‹µµèhyþõßþóë¿>¼Ø矹æÔ #ùæ¼ï§ÿïÃ.FúƒT?ñˆ/
-q…çôˆ5ÐFÊ£ó5€fÄûp“ʈ•ÍÜT‚¤2á6 ÍeÂ{h((ƒ¶"oå§!‰GSÛÊ)ÑmEÞa+¡ÉÝ„¤úKTÔÚ‚zEÿ#@ßÊSô?Rë÷ÑQç˜væËtÔËØlr£ŽúðÔlèèõ$6Ú~ŒfÀõömžõpC71ˆöe~ßL oo&6F(¾ —دÝ)Í&‘ÆÜÑvŠf–æFÇ4²ô5£c"Õ´¦ÆYh»cüªY#>·çÒƲۄÁÑ”B x…é\Iîî-]+µ–*l?ˆ¡ã3øF’•S²§8¯ñ”vIJ‡Râ“,5yj}}›ÿ©ì{rOÙV磘fˆõoÚT.½(ó¶Zn†HäÊCÛg­:ºT|Åq¥]Î0 nÄ][©çf¿5F8ÃT¨1ÖP2õ±•/ŠÇPU8˜’ûlsSݨ¢­Äp\„»U/¤¦ï­°À”ù
-­Ÿq›°÷³˜üï÷
+<< /Filter /FlateDecode /Length 3404 >>
+stream
+xڽˎ#·ñ>_ÑÇYC“Å7 ­,Î)ÎÞl ñ!Ù
+ªl¢6œß*ò Š™òRˆ€9؃#«\i§<:àÎjï]û\!T
+ÂL}º“%P8ÎC[´õLYUtãœ(káH%•Ñ‘Å_”MãÅÇò Qõ•ô4üGÜÍœÀS‰|”¯ä7Ò‘øNØx’„>%‘¼J}¤ ÝG|îè ÉÓʈ4]*zh…zÜh._"”aZ@Ñ;Ä€äpR€Š8ýG‘Iш,3¾St¡ŠFMÐbƉiŒð£AÚMƒœbÒ¡ÑûǦAÎéF2/õŠÒsc$…ÚN5â/jxsM5Êœª²þñû’n~ü>Ðkü•NwÎÓ)æp oA89|o­¼Dc0ãjc¬1N r ”¯Ì$Øp=¶F•ã\*‡sÐ$e'k)d >¨õ¤’b¬È‚¾Ñ;»Å;ÙÃz¹ÁòU‚-êH
+Np­ œ(iT- 0b,Às¨!|41&‘—äœ,­Ÿ°í› zˉIÅÇäh`dŒCÙE¹ê/¢{R»6(Q§­ó#ĤQ Z°žD©Ö½Þ$V´«Ã7âbòÚõtíë¦_;Ÿ(çÌÖ´%ÂlT1ØXÈ”2¶|Oª wy,”ÄÔ¸îä«0žaª7Bó>n«p·Z§"³wÓ˜Ä;9l„¸G ›7fÅ
+«ˆÁw’ç`µ8“íT7:‰1%Ô]ò”_òu7¸šn«ØL`Ô¿b'yTM
+šçvOðZ2Þ&¬a½.™ÍwU
+<ãªMšËrOCú½áï0ꀇ±…*‡ƒˆ¦p‹Õ©ši§ªSý. ebÜISÛ8ïã„‚;‚‹¶IÆ’“,÷Už`†ñwE_Vë·I ¹&dÒ‚BJ{e^3LÙ™q(N¢ÛNX$çnjv‡¹´ ¿3Zær ¤¾Á5Á¹Nd2ü-ãÿH×üUK'Z‡öf@#Uv«ÍT•ÆÛnªMN¤§08O?_’Á‚Õ" ‰å½ä$VªÂvú®Ê~‰ºúôÁîs
+)é~®&UúÚܤ½ÄFôõñŃÙ؃ûÓ¶©øgì:SjHÛ¼9*ËïòäS…—šì8æ|³&Ö KîΚlÕ°{HSšI=‘Ú[7ù¤¶ºÝ
+5“†u±À±ðH­F*ý®›\Qt‹“†y¾š»å½ ×Òãè¹ë’©xŸJïQÒÁ
+ëÖÕèä;©ššÐ™”#l¹
+.¤)$Y8UÉæ:Ïòê
+Ûˆ£Ü=>5J)ù>>§‡]êù;|OÖ÷5•ó=Ù# Ôž÷=ÂHÑ-¾GaŒ0«¹Ã&þÊ2ûÑs߃urîëøž×|Ïšú¶x›t)ÿq˜[ä…¥iød>Î=Íåe³j"‹G¬ÂIæ­aoyRçãVW¼é>?
+kŸ¿¥ÉÆξ´†$C·«Mž,™ß}zú÷d(gÔòÛ租~Á7Ã뇠äÞ-ÿc?/
+cŒÇ».}úKê³2f ¿6€Ä+žTû>ì~H“­A:×|ÞÝã°Ô˜ß£rbŽ¬:îóËA«z¼Ï|ŸT«˜…•AvF{Ë÷p‰ÎÖpˆRjË5ï§>àmÖ½Kê3ÀΩ}#º'õ MÃ?` 2p£{˵õCR§Tˆ øi'i]¶¥DkEíM©SJ»†¹eqÅ uæë$E®Áô®Ê:sfM±ª…Å& ”F ³éÃÉî‡8*¹VxI7€X ’>ÔÇI‚5Âà5¹hºzV:^NWÝÏá2¦%[û„ ÐõÔ†¦«ÿnyßÓ£ý¶dž¯W𘒖’Ö>¥Š×ޔŽ«Ù%¥ãhó„7¥°l©ëFÒK¥ü¸îGP“ ÿQfÉ©àa«{dËM¶ÐX!®ðœ±ÚhXqt¾ÐÌxnR±²™›JT&ܦ¡¹Lx eÐVä­üÔ"$1ãhj[y#%Ú¢­È;l%4º›T‰ŠZ@[Pèè[yŠþGjý>:êÓÎ|™Žz›MnÔQ>€š ¢žÄÂFÛ¯“Ñ ¸Þ¾Í3£nè&Ñ~ÌáíÍÄÆÈÅô»àµ; ¥Ù$Ò˜"ÚNÑÌÒÜè˜F–þ£ftL¤šVÂÔ8 mwŒ_5kÄ÷ö\ÚXv›08šR¨¯ð!-Éݽ¥ke£ÖÃÂR…í14c¼`ßH²rJöç5žÒ.IéPJ|’¥³&O­Ÿoó/•=°bOîâ)Ûê|Ó̱¾óM›Ê¥eÞVË͉\yhû¬UG—ŠŸ8®´Ë&Á¸kë#õÜì·Æg˜
+5ÆJ¦>¶òEñê¡
+SrŸmîbªU´•Ž‹p·â¯ê…Ôô½˜20`iÙSmø²±eÍ]¨ Ž¦_âæ¶(´#”U{”OMdeîè œË(
+véâs¯[ì•;O:
+,ú°=Z‹¯8Í^1CÂÜ4æ¼u"L6FjÇWÿ¦mÖS0Û,:œÆ½6-óê¸êvˈN£‘«fw¯L Œýn–%8ÓZݬr>~5:üW«ƒ~Z.'qÖ~²—iM´+í` ,µaR5ý°’7î¢mqKÝ’a¸l¼wëP‚4C`QÙ.-–¢þå©6¥*ÚöÍåO€Em"òx</¬Â‘bƹԷH ñ3†
+íŸq«°÷³˜üþÈ!š
endstream
endobj
225 0 obj
@@ -619,26 +627,22 @@ endobj
<< /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /Font << /F15 242 0 R /F74 245 0 R /F22 271 0 R /F79 270 0 R /F65 243 0 R /F81 294 0 R /F16 244 0 R /F82 295 0 R /F71 255 0 R /F53 253 0 R /F59 254 0 R /F73 258 0 R >> /ProcSet [ /PDF /Text ] >>
endobj
306 0 obj
-<< /Filter /FlateDecode /Length 4795 >>
+<< /Filter /FlateDecode /Length 4786 >>
stream
xÚµ\I%¹q¾÷¯xÇÅ!ƒÁ (ÐÕ5%@:Yž›¬ƒ ÅyH`ÿ|÷5·î,
ý2“ ƒƒ±eræ@=þûÁÿ¿ùôÏOâÁé?ñ0ŽIó0J3
-š>Ÿúâ+çâ+ÑpÄÑ{ÇEé)C’ýö¨×Ä!h‰´šè!DnF™xÙhwN.´p\Ú™ÃH ÓHúéçLˆ$`¼Lè˜àºðÔ¯ôž$0)î¸4L¨*§/7¼' ï)ð@? nÎ8ʉ¹Ô›ð̸ÓÏÜycô}° Fðî¯ñmä ”=¥87!x«=™ôÿ{ŒÿÎÖZN•aʘq‰¶ˆÒö´ò϶¯fùÔW‘Œ[ÏÊHÚN=H(ðõô¦
-Šhž•§"ª¦ÖïàDV]Ù,È,Q߆Qc˜5úc0JúÇ”)é)ÍÇ`”N¥Í·aÔYfœ9‰QIŠ‹ƒÝÄèññ¬ÉᤃøÎãY“ëflw<_ÊK>ÖDÆúþhêŠ{xÙóuÓJ bVÖT©ÍU/O`Ås æúš\'ãí1xß7'}ÉW#}ðÁ:™ª(\¢ì­;žªwRN¾0pqòׇQ¥PÙ£W©®'×S”Ù%Ø® ™ê~~1Pšïæ(—™çZ¹sW™R0ñÛš žûÓæ.ýŒnG7ÛÇš£Ôê½}ŠPòc‰Hÿë¹[¢2­Äzžnmctu–%/·äØÛÜyÖÉXP#%™ƒw‘B€^ø9âÜT…⛟ÃXïÒC$.œo=†(¶ØÇ—Öä-A·O€¦;9Oü*4>¶3Q¶™~Ô½æôº`É"\ÃÑLìÛë2Ôï„q!èèUÂ,6,×dMÔQß/ŒõD
-¦”V'Plg‘Ãôe¬×”ˆ·í|HjÉ|©
-OÆ}Ô”WMEW¸; +·SeLâuV.hTˆFOñ“¶P“¨p3rÎ3?Âi«Ô‹²¥Öº‰Tæ2Ð~Ži¡e,àóWv9®_Õ ÞÓ“„Üô4ë ¼E¥ò?ÚüO(Õ¸Ãø™ulKW›ƒ3 ïõnå–Ά´by~Cê¦{c'$JY×/
-ôÖ™ªv®­/ä0'‚קC_TÒ`ÒfLÆ~öÅÊ|äÊ’Ðz­¯vx»úvÞ2dÂ!¡5^ÚmôíêTÚ½R-.”ø=F—a€v¤ÿú€4—ÓLrvY¿ÃC—Ye;!â<à¦<+(z­%´£¾É-3…¥”xÕ5­%RJ¾ÚGÝ®ÌtÓNó·Ë¬"„yóoçí%)1˜J?ä»ÒEŒ‹‰zžB-ªêð[ðŽ­Oìh \ö¶SÚ˹í[s²ÂŠ>Œ;.vu
-lØeóîÞÕ6w¹ºa½ß—'Ǩ ­\|1ÇoϪ]·$OÖ™AM²/¹°'­¤†sh8OO/ñRz%¢žùIç4hp„ó­ ¹çZ³Þú6ºöÅü\+3éCÊ"õʬl|[ç
-oµî´ IÖn]À™2“lòZgsÓ–qIÛN‰¢ÎöñÀ”˜„¿+Æâ6¦¥Àx†‹wÝN·èRØ°·¥fÔS&銰³ Öîz„'Óà LcÂÓ•{îß¾ªØukCÅ2…z:›žàÜdból¬ã“wF9_öøH¹ïuQ·íšEÎ1m'‘Bˆ0¹d¼Dim
-ÿÔºŒ†XŽ¥þò›{[±ýVl,>­wÆÔr†þd`Xµé¬–ö££ûd—$Œœy
-£½7EØáºJʯ¹t¦ …þ3O9 aÞâ<FÜå¾U_ª„¥tËõŒ²Nñ>ÜÀtګÚ¢OTØÖ°¯1†þn·C›¹×>/¹ÕæÚcÞ¯ºP¥'Sˆ'8ÔÚ6FXql±Æµ“ªƒŽÉu y2ß襡£Z‹QÄþèžÀeúëRR¹eÔ(fÈ<(wþÌ:ç½YaÝØ3Ûàųz;>Èœ$³ÍN<¨eqè
-Ù„zQFj¸:gD|H4ò¯-«jàlÌ -6NžYUù´¿5ò(ðÕ†JXbÇ6«¡\‡>¶™m-ŽŒ)>ÓkÜP¹_»-ã+¨¶DhƒªØÍi]ÿŸs–Íwk6ý{TŒ6Å(É{@~= “JŽÜ,í]К)WԨݜ×oB4+S2ýC Ê}~cÌŸyC#WK^®RðeWVˆqž?á5©4µÈ*ü¥‚”xñû¡\ÄWCù
-Ð’$_
-FÀ×–ÀCpz¨J½Hb(ÖŠ¬gVÈõ3K»*~³á Åg˜ö¨í)Ô¯|¤w[¿~G•ˆ÷"é$÷íU"RÒ°ÂÍkqã«Ÿý!“h×uP’Ή˭—§2À@Ú£irÿ6’svtç Õ’¼ªQÓ­„*¸)ί”€Äæõ@šÂ&åN8žd— Ú®‚ mÌÂ(†­G«˜9µö.Ê¥ø²¢lã\€SŶ¥Zu'¨þxå}6t×K"û™;1ñ}­^‘ö¿t#•5ú¨¤¤ðÇOE!m÷ýð3‚üDu7¯ á2Ùóž¼+ì}°j€Ìù¡mÿkGÚ¯"1¤K¬šxj ¼ˆœ}Ë×{åvšôÞa
-´È×µ 6å…Ne”•eýÈŠŽ;}ÀƒÇÓññ÷Gýý»UU%pr]­ª¤±
-5¬g.=í²®‰íºèbl0¸%yyK7ÝxCÙAˆÕRýÜa[5¼$-‡¾?tº õWä™ ÀQëÀ”@¼@iœc¥XÔe¤ÍÄ\xÇnêJ¡Dˆ‹šlJ³kYÔPX ]Ô&5¨œÊ›ö °aýGœkžþ¢;²ÞÌB8fI)Ž´á’Ý)|4EŽD’î[Øþ‚»Ý|ƒL ÑâÃóGþˆO×µö¿£ãOÅèlö®?¾«å[X>ëGîMx…»~dN¼X—W^ac–m’¡­pe7©\ðµÖ›m­7%Ÿ+Š\Sì_¾äÞC;9rÏl5›Iµ¥ªñêÜ+-mÿÊó¯Û¥ÈËâ€i>:‰«B]Móef‘ßìibıÇßù×ï6ß·¾Z<ñžhËEœŠÐBTÇ?oöœ[¯¹ž
-A8zµeÒ==X)ëÉ9žzb4”KÙP«0~ý™ä aÆbªƒ‹i™0ÚÊ.2žÚ'\ôý6‚%àŽUë+nãՕزù¸Dº“µ`lƒs+FŽþBt¨ ã ÑmFTÖòGë_bÑüÓþØj—¾ÖâõúÍúoý†½,YúÔó–ª…bmIIövb‰,ÙÈOJ‹ÃT\©ÐÉ[šøÅ«¦zi[o Ô…w†ú úoiúDºÏf…„ú—üï®ÈA“þu­VZm, {OPò#OCë Æù'¿&B4®Dl+–òÒ0¤rwä/¦ˆèc"&xèjšWÇo¬HÎ=ê M6ÓÆÌÎvg“¿û
-ä•=(³TL ¯¶'‚vøœ=Gÿ¤^ÚZ
+š>Ÿúâ+çâ+ÑpÄÑ{ÇEé)C’ýö¨×Ä!h‰´šè!DnF™xÙhwN.´p\Ú™ÃH ÓHúéçLˆ$`<
+Qõ""ØìªÄž¶z«ð%+Ù¨ô[Rwƪ¯^÷*1ÞoïyEémìCÿ¯×o•–W¦9®A]¡ªt¿›O,0· ¹½u ºÝU–´Ó Õ½˜ã‚-K+í%ÌõïÅ\OÛ¯eÀ_û-l½E|x<L÷ùŒ•‚OÛfzá|[ÓmÞ&câÌ¢‘°ÐÝŠ#m‰²,bWWÖlè{ç’õ¤«–¸,1Lá­0×ÆåŠT¼$²¡óBf×í´,³ž6^° „bFâŠ;¯ðÊj~×¹œ¬Ó‘K·k-L9ÅQ0kõØwëG:¹ÅÔúüé­5!ÇÞ»)µ"YE*/!¬ëÛì.Àgø0O*Î¥£›O¶à&þ’Í6ò~ì’IדF¾ÆBòOúÆÛöÀ üGú9ö€;ö¸ÄÑ$é–SWïRG;~Kß™cÊÀ8þ{BHZÒ0ó´¤þôòªÅðz¢µVÚË:-ÓnÝ@J2ÔÅ<Ÿ.í ¾ó½:º§LV{MWçÍ7syŸ®Îtàöm_ƒŽÑÕŠ|o4cß!”3鉾õ]í"p Ô$s„ZM²RÜíøŠGpë |¬ÆƺAeÏÜw¡œï‚ar®Ç1ô`Lå±ïëXV2nžÍ³°–95ÑÞ:‚ÒJ­Äzp í‹édHÌh½ã#š åÆ2M‡’ãé¦Ö­c}bÒzÁ­ûS
+Û}<h¡£}Ü8±I‡Ù1¸•»ë°›ÅþnXöñ x–—'Z¦çèyŠ¯ñ®áãÓ°ë!òïå®ËýJh÷ÇwXyÈ/Ÿÿô¯?ÿûOÿøáÉ|þ/®ø±¿äËþ(I#÷Òûü?쉄ÝOß$~x€Ï¿Šÿô<ˆ]&$§Ip:Š¿ÞçBÒÄ ˆ%Æ|þuê¬ ¬„9éÃMgr†ò„=:ÈH‹¦Î2²Ù¾6õ<*ù?ü‘žü…þ~ë·#)¹ÿ my s´£øãÿIø˜×zk|ïk$7ágH,¯A'‘”Š3#è¤ÉY€—] +ò0ÑËDõ²/gã·z?îg¾Ï*) Ãí´?.Çí´_c}¯¹ èÜt¹ _/©™žÀ½ÖiO;[§QA\çÌŠ{u4ñ©±ÓÑ×"Û}£y·?R8£_â†AÌï‘ÛSÁdŒ÷}Íå
+¼‡ù·óö’”ÌF¥ŸÇâñ]é¢ÆÅD=Ï¡Tuø-øÇÖ'v´‡.{Û)íåÜö-9YaEÆ—N»:6ì²ywoÈj›»\Ý°ÞïË“cÔ¿…V.¼ÎŽã·çFÕ®[’'ëÌÇ &Ù—\Ø“ŽVRÃ94œ§§—x)½’ QÏŠü¤s4¸ ÂùV†Üs­Wo}] ûb~®•™ô! åF‘zeV6¾­s
+œ¨ï'IPkF|/y’ɳ‚¦®NÚJH&¤¾ÈKœt¤ˆÑtª¾M¾¦Ý«Ž¥#@0r¢è6Ïõk¤OæŠæ.ûŠíF¶ûfCR ¡UQ!¶5©0« ë’;‘ÑT‡µ£*ˆ½¡Ž([#«U\…·ZsZŽ„$k·® àL™I6y­³9ƒé
+RâÅï‡r_ å+L@K’|)_[Áé¡¿ÚkEÖ3+äú™¥]¿×pâ3L{Ôöê>Ò{­_¿£JÄ{‘tŒN’ûö*)iXá浸ñÕO‰þI´ë:(IçŒÄå‡VŠËÓ ` aÍщ4¹É9»ºóƒ„jI^Õ¨éVBÜçWJ@bóz Ma“r'O²ËmWA6f
+aÃV£ULœZ{— åR|YQ¶Îq.À©bÛR­ºT¼ò>ºë%‘ý̘ø¾V¯€Hû_º‘ʉ}TRRx‡ã§¢ȶû~ø™A~¢º›×…ðN™ìyOÞö>X5@æüжÿµÎ#íW‘Ò%VM<5^Dξåë½r;Í zï0ZäëÚ›òB§2ÊÊ2‡~dEG‹>=Àãéøøû£þþݪª8¹ˆ®VUÒX€dÐÀò¤#tUéS›.”#ÖÔæ×d¹–h™Êß¾Ká?ßttôº¤·ïHzÓiéøD«Òðj¢Û*ãÌýV¢;̤$ºÃUIty6ÑmÆ€S¢;øB‘bö…òhùþÆVj¸Ê¾OsÇÖà„Ivg×fÉŽp†¡] qåo_L{;«xŒ²ø~]™Ÿî¼–>M½Ÿ0¾œÖÉðMÛ•"_úÂgL}ß/ùféE²…'¹1P+,^\“
+wO¥yÆšœ˜Ï‹+*ö fÿV†¯hì'äݳó[4¶GUk 4©ßwïÞÅ6‡Ánsì
+rr\´9žë¼›fÜ4<~‘¾ÛØЭó;t$Öš<AÉ·$l÷UÚíøÜ™˜˜
+Ðú+òL‰à¨u`J ^ 4αÒ?
+,ê2Òfb.<c7u¥P"ÄEM6¥Ùµ,j(,†.j
+“š TNåMûØ°ˆþÎ5OÑYof!³¤GÚpÉî>š"G"I÷-lÁÝî>„A¦…è?ñaÈù#ħëZûßÑñ§‰bt6û×ßÕò-,Ÿõ#÷&¼Â]?0'^¬Ë+¯°± Ë6ÉÐV¸²›T.øŒ¿ZëͶ֛’ÏE®)ö/Ÿ_ï¡‚¹g¶ƒÍ¤ÚRÕxuî•–¶åyƒ×íRäƒeqÀ4ăU¡®¦ù*³Èoö41âØãïüëw›ïÛ _­FžxO4‡åƒ"NEh!ªãŸ¿7{έ×\O… ½Ú2鞬”õäO=1Ê¥l¨U¿ü̃ò„0c1ÕÁÅ´¿L meOí.ú~Áƒp Ç*ÈáÕ·ñêJlÙ|\"ÝÉZ0¶ÁF‡¹•#G!:T†qƒè6#*kù£õ/1è þilµK_kñzýf}„·~¿^–,}ŒêyKÕB±¶¤${;±D –lä'%áÅa*.ƒTèä-MüâUÓ½´­7PêÂ;Cýýw4}"Ýg³BBýKþwWä IÿºV«F­6†½'(ù‘'È¡õãü“_!W"¶KyiR¹;òSDt1“ˆ<t5Í«ã·V$gõ„&›icf绳Éß|€øæ7f“{"k†y{{DCuµ*¼.Ê4Â/Ÿoí_ó¬k¤nÆb­¯{…aÒÊ”Y*&ÐWÛA;|6žŒ£ÿwË#
endstream
endobj
305 0 obj
@@ -830,17 +834,19 @@ endobj
<< /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /Font << /F74 245 0 R /F75 246 0 R /F77 247 0 R /F30 249 0 R /F66 251 0 R /F22 271 0 R /F15 242 0 R /F65 243 0 R >> /ProcSet [ /PDF /Text ] >>
endobj
345 0 obj
-<< /Filter /FlateDecode /Length 3634 >>
+<< /Filter /FlateDecode /Length 3588 >>
stream
-xÚÅ\I\¹ ¾÷¯¨?Ð-Ô ¸\]&§$}Ì)Aæø\ò÷C-Ôþ–*ÛÈ¡ÜUzïQÅå#Åg~ùãÂ/__®/¿Ü­¿xæ4pùøÇ‹À ü".Ö3e/ÖƸ||»üö‰sù™sñ…ssÃç$çZàßÛÛï¿"-¡W´„0Ìê™Ú—·Wå~3ŽsuÇ|{•*Œ(¤lð#¯iF xÅ}jo hA¿ÀfÖÜ›#V…«òSº.}ðiqÌÊ·L§¹ÓR嫆FÂ<•¹xÏ5ÝFãœ<ý ÌÆ»e3å‰ $e³,¬„¤”aÊ™QH³ Òþ‰â‡[ºq‘˽­
-%Æ»c`ë9SÚO’pîþçKúò—¯NͼU¸Å„ t3\:!$xNžœ©B€m«ž‰ê\"Lön„Éq$ìFÛÉI€©’(0k 7’ ;Í(ö¶r`'†w#•’ $¾oìË£[¶´µÖE Ü[ŸtŽy¥GÎ:P¸ˆ¬ç·^ Ü9‰.Aœñ¢Ýzs=µõJZŽ3‹Á¡p½B‡i;¤?éí˜Lš41ZÁ÷éàÓRíëB¶OȘC^A†„CßS8‹™$…«{”Ó"Ðà®Yv#)KqI÷>C¦ì²“jõ`)‘Ì^L6
-ŒÜŽL¯ª%"X‹¿$¬ï‡ü7zæ\i!ÈGy]¢Ðfq$¢y\aLÂh(Ù
-u¬)<ꯂnz9R© ³òW )•’…Jö ÿ„)ˆpbääÈ?m¢V@ã3“€ƒ/‘ÚL ÿü!À¼ ç
-•qäQL'3ˆéNžÆtˆ$b ‘ÜmYY SœO/‡#¡w‘R+º ¤Âd[Kù£(GÔ×I/ôjGÆÄ°Ýñ.®6šPïÂÓôDð\Š*}ïÖ-ÛøÖ €¿š3®C̸uT·Æ"®}x<³‰5·ødIy·ju¶= MÏt¸*Ž<ž*V6•̃Åüdº
-ÓSØŒPLI¹L
-ÒÔ²òs¼Û#‚Q† #Ç*¼¢Â q’Ër»ÂráðÀŒT—•éÐ ”[@ÐI4L•1}ZLp¯Òݵ‚°6²?Õ ªÖÔ"©l›&©å‚V–ùº5í-jh
-å˜h2Ñ{#Eibݧ=AKh ŒÂxÒf¡ÀjzŠÐ€?®)Þ0.—Â2#ã‡-nk)HÍ€šÄ@ÕîæãbM6¨^š¯tÝ»Øâû¶%g
-ZßÈØaÿÚz™¡Z
+xÚÅ[ÉŽ¹½÷WÔ4‡Kp„T*•€ñɶnƒ9Ùðlì‹ßÁ%¸çR% >´ÔK0Ëã‹ “_þ¸ðË—·Û×·_Ö_<óF¸|ýÇ›Àü".Ö3e/ÖƸ|ývùíçò#çâçæŽ?žsœkÿ߯¿ýe ½’%„aVÏÒ>]ß•Wø›qœ«þÈë»TáŠBÉä-¨ï¸í#A-è/°Y5wu$ÀªpW~HwÀ¥|GZ¼få5KÄaô¤Tù®¡+aœª\|æ–ž Wã˜<ý”OËtÍ”7‚‘”ÍF²°2’R†)gF#͆H×ð¿h~¸§ûgµÜspÃŒ÷ã( [mƒÌ ±ñdÝvváY˳ê;Q—µÍ¢·dºj½Õ-ŽôÂ<ÜíH~}Í›Ñ@‹a´t_«àÁz'i~>Ì$^¹¥•¤ÅE«MïÏ1l@¿‡YÉ ßz²¦çâa:YÂq*²q›J™ÔMh§¿R˜eÊ x|t =ge3ÙNÞ¶9ø¡9VOMSÉ9´ð¤²Lè.ÎâÀfÌYÙä,˜1ÓóRHÁCJPñ2ëo [';m°›ŠR*Ä+3)Blé¤&Å4mƒŠë¨yôû½…2¹3AiÌBÀEÿƹÑóéjò~c¶[€xñ]ñP‡Ž8Ô ¥@kõêbŠ¸ 0‹
+ †—Ñ
+æãõ'C;GpN4“‰×å-.wˆ=Êêf‚é¯{Ò• u0s4hÆÕ|'Q\F¡¸³ ë˜ó¶LÁdƒrÂUAGËðk‚ ™F P³¶yc˜‡´¢&•¼åpSfÄÛx¥ ²\7Íʃ» (œDM`ÔHše”Æ$]Úý¤Ätö\OÒÈ>>¥£û@³ÊÉgFcÕ+…jœ>rº);M~+´"·íº¡ªÑÞÀ”ÎiÝ 3÷Ny9-3Q|Ä@I.«+ …BRÔ´«L|ÏÜ ÊnžóÖh`Þ™–¦sÏ@ÁƒÍ
+.‘&{7Òäx%x#‘í`ª%ŠÌ:ÂdÂN#‰}®ä‰aÀÝ(¥Iï{GûòÕ­\Úšëb¡Ü›ŸtŽy¥GÍ:R¸XYÏ»^ ôœDˆ@g¼h]on§\¯¤Eâ8«
+í˜÷œ/À&’t‰¶ÌI3 ý„GÎÝ[7ênRÄÜýœ° ê—Ýéþdê=¶J3¥¶ØòøÂÖ>n-*9÷J«Âß6ñ¬°±f“©ãU…‡º¶Gš¥òÆv‘ünîx¼ŠÀêH½Æé<“胄§9`FRˆÓáå§KWK÷YLÊxåYN'3ÈéM^ætÈ$r QÜ}ÙY
+Ó"9ï^[Bï2¥Öt'
+H…Ŷ–òGMÐŽ¯S\è•GÆ°õx·®M¬wôÀ‘¨¢K‘B¥ß»ùÅÌ6¾EãøW³'Âuè“7²Ž*ãÞdÄ­o{6±çß,%ïV¯Î¶¤éŽWÅ+Ï—
+‡Måó F3¿X.€’Lb¤ ÒBÄthhü‰ÙR‚6¡7 Öü\vø•¬ÓìLµÍõÍFénƒëçÅ8ØO‚v‰©§`žš)œžD?j¬›”Å}!-Ÿ0þu\9s…8ë
+Õ§Íziã¤eYsn¥‚D u«âóàžº !kzNI8l_¤Ð9ÞèXÏÒÞ›´BþúöïQqLûËß¾½ýö;^þ;þüzAƇåÕãƒß.ÂB<.Æ/ÿºüõíÏùÛäq{6ôÞkÄ"êy,íx…Öö|Äç—V€_ä(°yKg‹H*ür¡FDv;$vbZ7¦ð WaÜû²Pr˜Þ¢ ñÇýÅ»=¿¥âRàTaTüðÐÙÚ
+Rs &3_ín«<NÖ4@^@×Nkn¼&M±?R¶ÔLbNŒŠž([O3Ôï€X;-úÈ­Um>È ÚÜwÊãõ4
+—Ý‹½"ä~‘~™…å2 †`—W&Þ˜Ta(y¡(§FvÚ@ÿþÄÎ `YåM¸#@SXÔ[·$…i?|ÕH´|¿‘˜Ÿ¨EÝÞgÕén×ɳSSå䈴¾â0–3MÒÙˆ[¦Çæï—‘¸è)?ZVÞÇ6­˜ó[¥Êç˳ #µzQgŸIx=¾Ï&@„¬é­Å ‹Ú“ÝÕB;&°²™,G?ûÚ`ÅmídÁæóÿݱÃ÷AFÌ ŸÝ±5‰Oo#0è¸v@Mäïe8ÔUÛ Ëi!iFÃe†v@µÌ—Ù_ äüem1XYk¸DèÂ7#¼Ù )'ÏÅx×hÜÞj—hWs »»¶Ûb°žº}ÿ‘ ÷
endstream
endobj
344 0 obj
@@ -874,32 +880,32 @@ endobj
<< /D [ 344 0 R /XYZ 79.37 445.014 null ] >>
endobj
347 0 obj
-<< /D [ 344 0 R /XYZ 93.716 147.579 null ] >>
+<< /D [ 344 0 R /XYZ 93.716 204.477 null ] >>
endobj
348 0 obj
-<< /D [ 344 0 R /XYZ 93.716 128.487 null ] >>
+<< /D [ 344 0 R /XYZ 93.716 185.386 null ] >>
endobj
349 0 obj
-<< /D [ 344 0 R /XYZ 93.716 109.395 null ] >>
+<< /D [ 344 0 R /XYZ 93.716 166.294 null ] >>
endobj
350 0 obj
-<< /D [ 344 0 R /XYZ 93.716 90.244 null ] >>
+<< /D [ 344 0 R /XYZ 93.716 147.142 null ] >>
endobj
343 0 obj
-<< /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /Font << /F79 270 0 R /F15 242 0 R /F74 245 0 R /F64 241 0 R /F16 244 0 R /F65 243 0 R /F22 271 0 R /F82 295 0 R /F71 255 0 R /F53 253 0 R /F73 258 0 R /F59 254 0 R >> /ProcSet [ /PDF /Text ] >>
+<< /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /Font << /F79 270 0 R /F15 242 0 R /F74 245 0 R /F64 241 0 R /F16 244 0 R /F65 243 0 R /F22 271 0 R /F71 255 0 R /F53 253 0 R /F73 258 0 R /F59 254 0 R >> /ProcSet [ /PDF /Text ] >>
endobj
354 0 obj
-<< /Filter /FlateDecode /Length 2665 >>
+<< /Filter /FlateDecode /Length 2594 >>
stream
-xÚ½ZÍ®» Þç)üQ$R¿@p€8Ž ´ÛìŠnÛÅEß[J%F3¶Ïõ-‚Û3Š¤>‘©Ñ*¸‹Vé¢éßômøù/×ß_¾Ý#\¢JÞc¼üþ÷Sn™KŠ
-.Á¥½¹üþïåŸßµ«µ3ZÛýE­ƒ§Ï¤µ¿Ò§Öé:Ð5_8z­|sõž»µ+I¾y ¿,‡d8Dz!˧k@Žn@øø×ï¿Oê9­Œ†‡êýت‡Çy-
-„¦¦…ü|ûUqt~²2𳫽7³_ëæÓoÏ™쉹˜”±øÈ\LWãPÍ Ÿez­Üå?—üÿß&U *­¨’µG±äÆ¿»i²Ñ–†K0A¸Ñ6î*Èë‘¥Š¡“_ª,íx&+¯yÖÊÐ*Ú+ß_ÊòÉ)ÔáLVþÌúÀ•­yyLÖUœ—]GŽûv7î’h‡·ã«óT˜d:kØqÖáw†÷,\®8Û4»§@ùÆkÊ£Ê]ÛÍOe„£³ô¸–ØÕ¨.U¶Æ¡nÈ”;nkË
-ƒüà±cÔÈYƒï–«‘ÿœ©3Öu¨#eëT©Ç±m”|%”`¿xÆÖÏ‚ƒÐ×Ë–?Åiu®vÊ„–X‚‘­]´æçýòy££òÑÏJÀÙhzª…AZ\“f)¶†tJâϺ4z–Ç A‰ïgÀe?ÂnÖö€Inܬ `Cø g†”ÌŸfqYaïv
-—*9€U6½lVŽ›mô€âvF°³«ŽÀ^îŽÁ‹çÎiPæ[®*õ>§ëƒ@å*0qAÉ"èç¬S®|Òg‘ßP–nMš< $‡0Hfi9
-íhˆ§â¬‘P³ÂÒKÚ4¯ìNò¹6ƒ¢Òn¥æ åÏL EÏôCÅf /êTè…U~_ð¼¢ á×Ø—u Z.u)ÜÿÖY\Ð}_Ð Ñ+4;½ž¥©íi©ß›ÖКHD8Í3TÚ6!ܧ±zÂ_œÀ"3£–Bƒîß³·JBœÊŠ!ÝØ4²ËéH¾5ö;«}žkwÂ<Œó|:¥ÚüË^+G¿‰FrGP2²ø²ÆÂ`Êì[|Ëʧ£%?û<…V~ÅjYpCòˆçÛF‚?)äx,Q{§Ë3δ3©ri‡Ûùå„"ºÖ××Ê
-)á2CxYÏt÷â7æòK„bRF€n †8Bm,‚†âç°¶þ¹ëšµ×ª2yk¥M*}Ø\ØÚÚ”À{;hr”é…)Ø-½v¶§J[“JÓįèýÁ<6yå¶æU5³8Áâ =•I|¤Øæùëþw÷Æ{í9YÒ´š7Xªîá™yŸîaY*è¿+Þó®ìBW½ÓÉøÔ5ü¹ïZ*X760ä~T¥®M«;¡N:0Ð35ZÑŒ*‹á½ÛØž8Xæ®]ÝIgÝë­™Ö¨ý3kò|Þîím¼7D-j!<×ÍËE7sÛùU+©>>žu'_d%+‹*"©¶O:½¥C‹‰r•{Kƒ£W)™·6hÏ:O™ž…¾²Nѵ£ÙúÖ¦¹Ž¢pIécõ¾ëÀNÏ_û ûFоh8níç›_Ï5ÈÆÆÕqÁÒ%öFÖSí´Ç *„¼¹{p<êTÌÕï†ÄµNÈÈžÙýÐÛÉŽ›¡ÒÖÀ„shƒJl̼ƒÇA%~Òñ”ªÛl›•àÂûÚišH±´]³k.Ôe¾N_Ï‹iظ[?_ºZ*Ç’v³ä¹/ò„å‹AZGèaòxW–É`s(ž…­7ài•îˆsî QçbEúåÂ3[¸®¤7œÔ߆¶{ãç¼–CÓ6¸¿÷) 8ïÃåwÅ$mK‡×)¼×Cļ¿Zkÿ?û¬ã¥FÚð\è™ù3ïöeFü ¹Ú™£˜¦?Ú0æݪöWL­ò3€# ™ÙºÐ3iYLÛK~ÛdÔçŽ&Á;Ê´ð™bb^áñª‘ÏW%;¶fEj|W ¿ÞãÀE
-Ïö~²ß‹)®™´æ•RµÝÆŒ‘í’–€Ð·‘-°Õí œ ÈÕžíxµK݆½ _½{«HNre8Òh 3$“Ý ÞÎ`]Ç|W<ÂxñœU„ËåqŠœ"vXœŸ8¯tœ%¾zàdiCÑ­IÊÖõ-fÎ?&ŽçÐÃgAGæŒå]9–f‘I#o2»c­r¿õþ+ÒK°ow¶c—,ã@®œé„sÑ M+y‡"yÜoal‰™Í)Sׯ…¸š*°Ø¬¥5µBZö¶›8‹ŒLÃôvD‰‚ õ&Íh| 1‰R¼ŸÕ|MÊ q,+W6NûçÁ–žâPÃŒ-o‚pˆ­Ï] ’ðuM 1´"c‰2öt˜¯ìç;BÓ¦ÁÚt-dFãÅ ¡¢ÜôÒmË|ºð5’uÐGã”é´uæ9ÖŒ<‡åž5cg -Ëþȼ²|u^Ù*æÎbΞ´VrC¾b§Q«µó}¯*í.FlϤ+  Q0á%œâ…w¼çÚ4®4>pŽ¨ƒß¹¬;ñ“„¿®,%pØò}0 Þ¶¿Õ
-ÝNpü Nók}‚QÜŠ+•é<r94ž6¿PC19´]<'2Ò÷(‘A­¥Š·í±, ¨ª¿Ã3¾qXŠ»2lS·•+ï.ƒQÜlõØ-‚WÉìü9¿™*gä {cúk^³è¨4\™ü‰ž@>0t9šl¥ñK¸½ góô¶0®œov*9¼ñ‡%ÁArýl3ÔÓÎJnšô3ÍЕ٠út»ó˜¹´—ÿü@¥s;ÿüGªP&Á¯è1”wþB,2…N@2‘bÿúýå<U”q
+xÚ½[ËŽ»Ýû+ô¦Éâ°FV€dë]m²¸ÈÿoSd±øj6%MÆÆÅ\IÝìz³êT±-…½üç"ñÿûrýõåÛ=À%ˆèœ—_ÿþ¢.ÿS…öï”N]~ý÷òÏ7)Áàß]J«ðó*¥»IiðS~âwéº Rªwü ôÿ4­K×ù¼,Áÿׯ¿Ï|­JBÏ7ñJ´ÒsÖÌËÑw]h&^é¾’'Éšd[óÑQ(£ýŠœ‰ž)zeù齤A¨`ž¡¯=Ù£·à5ã½ú\(k⊯òÀ>Ã×êgm%
+‹i%/IŠÑ¸ÒC‰,«ÍQ5ˆŸœŠ)6Û!˜Ñ5á¤g¥vúüþ¥—é…†·¶E2+N•u·Òš”Ið¼)¸
+GÄ»•Biµ ÎTLI?Ú¦Pêw¶‹½eiM—”èþÿoõ1ÝØYÐ5ÂÁ°S 0jSÃ2“K;{8s(ठ¬¼éy³RÞ¬«»´ð Ø!ôÁn}ìdª³`ÏwûäE¼Sd~«ÄU¨Þ§ät}”¨
+;¶­˜{ˆ–ct“ùܾ :#píÁ,¿'3“œfk]Ù™œX´…“°r__‚:eóAkÚ¸1«P¸•gê·­L%´1[*p³D ͨU|I¥æ+s ¼—Fi/|JKGyLÇ›-}&hÈr¾ (l,ƒQ>P^È…VîØð¼" Ư2/Ëâ¥
+l#ÜD'”¯»Bÿ¤Õêeûž§n¹‚mEWnLìÑ€‰eBß*úŒÕ>O½»ñ~æ=Ÿ—T“~™kÁè·6Ú¡;%=ŠÏ>f“¹ñÍžg JTn¶y
+µý
+E3ßœ8ã¹z§ï6­Ehoe~æ»UµÀïs&vC6¢Ã4|9EQ0TíUz_%Ôf0.k•îžíFX~¡s‹ }„±¦uk}Ôu?§Íõûal²ŸhãEˆñO´±ð‹h~û@Û€Åô¯~Û@Û(‹þø@ÛH„BNê@[GÒìÚ¶X§¡ñil¸Xë
+ñR„OÐîFO€#šÖp%º¶h6®Îi®%º,œkzß¾F°Óó×Æá8 :v ç“£#~úõÜ„¬Ÿ\w,b›d=5O{<¡«1~ZØŸ*æöw@qu¼²Uv× wR†£i§/¸Õâìæ œð uP<¹-וÛà 꼯 §ñ‰Q;L»æNý”æëøußMKL8&<ðÿ÷®û±(íLyŒ<¡ù1G€QÂtÅô|Wmûd0)ÏÄÖpÛ¦Ûˆ-ÔLˆ‘:u+<0gœYÓuAízÀ¤îÖÍÝ+@oà5šÖÅ5Põ[c™ƒóÞ1È¿kPLÔF8¼.á­!BèýÕóg
+~5̧«\ ëÀ¢$6ºËQB¿>9Í¥"Ïú~pæ«¥ÆÔ¦ÔªUrãvë‹FÒ‹ÇŒàzÀ@Z×S€|:ÀW[Á#oçÞM·I|±î­Ärä+ݱFuLWO‹ÚHƒdíK^¶ 0èY¤d°t/kôdù$±…ÅþÔ  ¶ðÅWò v¦2Z¸Œ¦@Í%H…þlZÍÑÑžÙ‚L#¿îÂÇÀ<0R±‡Nêp´•ï×ù‰ôœïëqíhœÐåsÿcîxpÅÏê®Oî÷›ïÇbj8ijòÕWª…Î:KO­"ȧ=Zwò”I˜ÞÈY¡¡*ÔŸŸCTÄ*ïf1?)EfÂì¹¼q"ë?gÒt‡æ8ü6MHû4 Ê5_¶W*HË4–QF–öó•#¿³h†¬UÖŒg¤ž²Ø"hœºõå#øiÄ× ˆ ÔÉ,QY¬þÆŸÍê¡ýJskúFÆêÆ–í‘Ù³tuöl!s'2»'áÚ®˜©MdÁJû|?ŠŠ»‹¢Æsé‚pLñâ·ñB;ÞQ{VŸÇLÐÁLÖŒøAÌ_<«ƒðãŒÔ:ûñ÷£6À¤ÌÔKrÜV<«„uq~’a]ÖM‡½ >é"ØE>ÐxŸ²¸Þ}GGr_
endstream
endobj
353 0 obj
@@ -909,23 +915,35 @@ endobj
<< /D [ 353 0 R /XYZ 78.37 808.885 null ] >>
endobj
77 0 obj
-<< /D [ 353 0 R /XYZ 79.37 633.034 null ] >>
+<< /D [ 353 0 R /XYZ 79.37 559.897 null ] >>
endobj
352 0 obj
<< /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /Font << /F82 295 0 R /F15 242 0 R /F74 245 0 R /F22 271 0 R /F65 243 0 R /F79 270 0 R >> /ProcSet [ /PDF /Text ] >>
endobj
360 0 obj
-<< /Filter /FlateDecode /Length 3241 >>
-stream
-xÚÅ[9c¹ÎçW(´ƒæ’Åâ4:Ðh5Àf¶'[ldÛx ؉ÿ¾‹÷)¾§ž;PKM=V±Š_¤øå÷ ¿|ùtýú駻ƋÌ)%Ìåëß? ú†_ÄÅ8&ÍÅhÁ¸—¯ß.¿¾r.çÊú÷·Á9§!%ߤ wñ™†¯ô‚·i€ä\s?¿EúG—oÃÈžºç$ÂqôÊo_¡µ\sH†yéLk5/=¾+èD€Q+˜ µaÈ@»Ìh¾ÑDƒH÷HQšHUߢðš–7ÿ”{ÿÉ{Z ¶
-Ò¿-ʺ&ņ§Æ5+ñö6±ó,àÙ£â½yÍKÉ©F&é9žÈGæx­ÏØ@!©ÇàJ=R(&„˜¤ý6$ê®R³U¶TDöx Öa+(eV¦×Fàr¯fÎný( É!àzù˜ÞÞÜÒ2tÚ9–sK˜Ø
-1I¢HÒÀAÕ§‘ný»|½Þ/ΙTE.ùsÀQØXñÝÏ5¼~ö|jçNÑq-ïS´°È,©eXÑ#M+ž´œì"X+(ÍLr76eOÀÏ–«á±¼¨=é½1HÎ4Ú‘»·o¿‚bï.¾ú܆՟#eýB\iØ _Í.gÉ »$Ï}‡.=#Ê ¦ÈT´± ±„ÏæíE·ëCšQ¤@^;òú
-5¡"-Yòµ{¡%kþÃ?ÿ¸õ¨™âzS©ºÑiYÕ'D!®UˆÂü %/ 5+Ù›`ÉsîqК°ì‘g
- ýšž˜º:+j¯ÃŸ c.Ú §ËÖå„åWoûµ¦
-µúÏÀt»&ò)¡r‹œÚ •“ níÓ©Bé£2£z¸fÇãe—ÓÁ‡eцüìŠù÷&O*äçåÞ”P=BãÆr碳­ÿ~‰þüÅ󥜅9#­êË;NÃóµ^« õ‘O°}+‰H0‹ø¨•¤¯¥•„fèa}_‰l”ª;µ‘Œ;ÓFrSÈó$4>õÚwxÂÞ†'íéV’üFK¯à 5rǃ`^]E¿‡“A&í¤Ú\wSP7§ ­]n?
-a! ‹'®Ð#·¤rxz-L{˜”úKRä„c¬l<½â¹Ä|*×R-Õ¤èÒ’¶Ë~Þ®ãC®¶6]ÆmYJë€E×vIrvÍé€gV-µuFlIçúÿ9+ ,v\ÁÚAIc(µ'’*5eêéBP1‡8òD¨ áwƒãàc§~ÿ·FÜ%ˆ‘{Ȩô”0j¾\YEx›ÒX*Ûº7Uzûš/:RÝé€Zi´…àÍ9Qk9ÙßÌêÒ>ryrNWÂ^BÙàÏƉtÖʱ°wù`1Ó5ºP1ö üÙgq„’ŽÔ%ô qžÅÑC(˜µ#ãì
-xl{¡£½±‰ëK‘ïùàk gõ¨àIÝÛ-Šr­çz‰csë ÍÇbË[z}åêœ
--ÄÆ»Jlä†(×4¾U<Ü›Š>|ãïÊèk–,$©×qV?£q$ hÁLS“-€`W@(­À|=¬m'ÃáLùÛ<ô÷ËAóEXz´ïþMIÜ™gš6pûÈNF¤÷}×èâåÍ<ÇÓñ¡Zª|?ª +ß‘úù맊Ԗi{ùë·O¿þFã×/´ÒÙ˃ß(ÏC¦…ŸöË_>ý)þæÐ93gŒ²íæX#绚®¹{^okýtWòbh"'‚ÍDªÔŒÐ¡5Œ-*t0Ä9t¹ì¦8·d$Ð’1É‘ÓS7äÖ"JV¹Å‘²O8˜åºs.àŽÐ$¯`vòù›æ¦U¢­eŸ83Rkãžœù¹ZÔD{UÊ5†HçÑåõ¨/ïÆã§ráè'r:S~^×yfr´IOn¥§dKè˜n.î¸ÑheƒœL—ùûÁ=¸ÈëzlõBN£‚>îµOMLJ6pucÁµ—áâïÑOœyB? ­[<«!ˆíª´¨½†Àp†vä€Í1oÎÛ²óŽúéî©4zÉwYÚk{YŸïÓ•9§+ô1}õÑ~ÇÁ—ʪî–3Ñ'ÝóÌzõgË×»1Áø¬óÜ­Çœ¥øŸoSšiSÁ¤ðµS[{ ‚¯ýî=á™Óìú+²2Ò«`ŒY’Ÿ‹Y ŒÏƒF¡Nüik0Ê2KÔªg¬YûŸ–MJþH„’TŽN,ÔA'ÑÓJ“ …ó±&ý ØO¤è¿I˜QÓ
+<< /Filter /FlateDecode /Length 3427 >>
+stream
+xÚÅ\;“#¹ Î÷W(´ƒåà»jj­NWu™íÍ®.²Ë—x]e'þûŸM‚TwkVgÚ‘º›^ì•—ß.òòÓ§ë×O?ÜÁ\‚­¾|ýû' ò„rgAH —¯ß.¿¼Ii½”ê.%|¡ïáý3IWñ*¥úå㺭0þq€Œ¿êU)ÝMJ}Ëß-Ö ´ï'¸æùãÅøq¶>fC¦®ÚÀ8¾½££ïŽHiÌ$ d2úº=ãÓ ï¿~ý™xvzÅ3: çí¶"U(¤µ`¦)£+3¯¥©ÐŠ
+ølÆDVó’¶Íkº1lxšŸ)¡¤mJF%TJ1aå+Y-³Pt¥y¸ï
+¬:NõJ v¥Á ˜gª|'~q³…­Ðèb YìœÅ‘ñ~¿_`
+ðè'ö_`^
+PÈg6QÕ|I#
+G‰ô
+«=§í;® Ù{ÈŸq€ß
+´aš9d\È+íC¾n—+gXa£ðsßÓ.;kT
+_ê¨ê]mçMmœk}*j…™´¢,YÉ5¼Ð’ÙšÿðÏ?î↶„–³™³‰-a0!3qݘÈJXïPñ¹¥!3ï³”[¢ª®5æΣæ¹6‡}ky[&¶QYzƒþÙ0:ù¸…ÛÞՈ喗ïÇÅ`‹á™)Œ0òŒáà†—Æ2¼46=Ya#]ÉB{<S}®*^ÉòÊóCÖ?irÉñü8ßàn%3Á.ö[ë£&}ĨÝ>è£Ö†¬nÞº!U¨’–<ôÛch¥ &èDe½#̦½<f´ŠVÜÏyÀlôb†| [ÆÌlBØÏ:Gì~ÆߘX$o#›çØ­Á ´"Îý)̤NÉÔ.v)PáÄØàD“ã(êXL~pƒ,Éè\!iôn”eQ…ñ·_{RO’[FÖÆZáMÓ`£;Í%‡°réj‚Ìô-®-­± nDŽ„6r 1š(ßGྪE+âzuXY¦§…jÊEÓ•'|2zÊ_,p l|ìñÝ‚ƒ]/F”€âjF±a¹–KžŒîk
+‹ÈÚ±ü)ò…·þé’§01”…QcaY§*S¼*–v”n®ˆoeR”Îfa ù›
+’ÕúÅ`^ÿþí’¿üù§H—"œòfLò( ²‘.Åð°©CTü<—,ÅùýŠ’A/‚·*JöÚ*JÚ±RÖ÷U“Hä¦b’ gŠIaòÛ®Õµ+¬^Ç:O©aÓ“þtAÉ1ä(Åŵ"Ät-"òÀWÒ®!­ß×&§…ò\6[¡aC{«NÄ:<Kêç<GÂt¥¤l´£[3¤—@3Ëô‹»îè¶MÒ…ZYqg*+~Äàm<ßCt H^™fl”m–¶¯ HûÁè®aµWó
+
+,’-{î-eÁ=r'Æ%OO†N
+ÜpóôEã°Åû‘Bë;íXÈ[Ëï(h“ST&ÎõJ†¥Pï·ÏA¾fVš\¾ ¡¯'ôy-æ:OWÇF7ðì¦=pþã<#aÌ´ª‡<Ƴ9pLJÈ
+¤T…¯Mí+ J134&\‹ÔñV\Ó/;¶/ú–Çá\§ÚçŽÒ¿hÝ“]Í€˜pÎúïÔ¶ÕÁ /aÚ5fIz(,0k+ì}(‰Gá”ⳟG§ƒD^ ã5Ÿ}LäsÅjè
+jÀÁ›8_C.˜sý¬-™„!,éÓ°Šó~íj²mt—ÏU½mK醲ø唳 ô».ÐvxnUÿX[gÑ-ÿˆÀ+œç+X”"5Å31•™‚óthDК‘Ô¸ƒ«×M°!y g»ÿP#â
+OᔢE+— ÛÔ»g›Nßc›iu}+Õ¨¡3`Vg¹Úú_ýéß\iè̦‚mSXÛJG¡®±Jêçc`Æ£#…F 7ü e²ðÒLžt­Z± l\ŸV‰´Þh6¹Â±£wáY%ÚW Â{F·B_é´7ÍÞË6¶1᧟Œ*_)ˆ[ÛéÞ:HMç}kÁ¾¯7¥Í÷¡ßü™H˜ª›>ôºë›î†CÝõ*¡+u¢ð]hi–þ¶‹07ä©*º…Óëã3ýøT¿û²¯D´°Š¯'Œê¾®ã¡Ì©†«m®¸Ž.­èÊwÞ³8ö˜Õ}¿Ï¥)Ñ!;b«\[,KP†t`m
+%5Ÿ½ùú@ßÞVИMmÓé,˜¢Êû&§…óæõóF0-SË$Uz. |ht€½Ñ¥g«³
+ééÎ×E>ÆÛÏZ¹qw—ãÇÙ×þÞæåPØÀ‰›P¬DD/^(ÓèµÖkHg*vµ›9^ÔËgÖoNª9¢QÐ"ÐØ+…‰¢_¯ü”µàà¢pòxÎEåÇY .j{‡[ zϬE¯O!aµî#•É¦Tر©|t
+!µÅ™€_¶Z øåíìÆÎy/'¬oF°<l`ׇ­þÇñR˜-AO+–[LW^åY•;)ö½Ó¹É=jBFÛ8Ïhh¡pêËŠIÌ-=Øeç]'å9£f­\o½è¨|>|Ú{ñŽŸÞÜâOÇ:#“ynaqßtÊS›¾Ù¾z[»
+µ]ÏaøwßÎM«ƒj ¬D.:,^¡W1~Déèå@é„‹/x3oa|/x¼wÉ|ºOÈØkå,©W>jÑÉB5yMË­m~éA«ÖSa}Õ¸Ø&á¡:¨ºÄãMA«¿O’7æ™j Þ^YÄÈó}ßé¹|j³Ž‰óDO­L=Õ«Œúñë§qA¢ñò×oŸ~ù•®ÿ>?Ó¨à/ÿIO~£×ÂB÷Ë_>ý)¿üìàbDp.ž¶Ýñt
endstream
endobj
359 0 obj
@@ -935,25 +953,25 @@ endobj
[ 357 0 R ]
endobj
357 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 249.572 591.547 259.999 603.997 ]/A << /S /GoTo /D (Hfootnote.15) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 249.572 551.689 259.999 564.139 ]/A << /S /GoTo /D (Hfootnote.15) >> >>
endobj
361 0 obj
<< /D [ 359 0 R /XYZ 78.37 808.885 null ] >>
endobj
81 0 obj
-<< /D [ 359 0 R /XYZ 79.37 771.024 null ] >>
+<< /D [ 359 0 R /XYZ 79.37 732.66 null ] >>
endobj
85 0 obj
-<< /D [ 359 0 R /XYZ 79.37 752.217 null ] >>
+<< /D [ 359 0 R /XYZ 79.37 712.359 null ] >>
endobj
89 0 obj
-<< /D [ 359 0 R /XYZ 79.37 578.588 null ] >>
+<< /D [ 359 0 R /XYZ 79.37 538.73 null ] >>
endobj
362 0 obj
-<< /D [ 359 0 R /XYZ 93.716 168.567 null ] >>
+<< /D [ 359 0 R /XYZ 93.716 128.709 null ] >>
endobj
358 0 obj
-<< /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /Font << /F64 241 0 R /F22 271 0 R /F15 242 0 R /F74 245 0 R /F30 249 0 R /F16 244 0 R /F65 243 0 R /F71 255 0 R /F53 253 0 R /F73 258 0 R /F59 254 0 R /F72 257 0 R >> /ProcSet [ /PDF /Text ] >>
+<< /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /Font << /F15 242 0 R /F74 245 0 R /F64 241 0 R /F22 271 0 R /F30 249 0 R /F16 244 0 R /F65 243 0 R /F71 255 0 R /F53 253 0 R /F73 258 0 R /F59 254 0 R /F72 257 0 R >> /ProcSet [ /PDF /Text ] >>
endobj
368 0 obj
<< /Filter /FlateDecode /Length 4388 >>
@@ -2133,17 +2151,17 @@ endobj
<< /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /Font << /F15 242 0 R /F74 245 0 R /F59 254 0 R /F82 295 0 R >> /ProcSet [ /PDF /Text ] >>
endobj
690 0 obj
-<< /Filter /FlateDecode /Length 2366 >>
+<< /Filter /FlateDecode /Length 2430 >>
stream
-xÚÝZÍnä6 ¾ç)梕Hýƒ
-PµÐ«‡“æ±è{àD
-´^] ””IÆIÏòxú5h8ýVÆF£=0„¬Ê_B"3çQ¾˜ª©óóúl¸½¡ê8Ÿ™·‚p¸åè Ë)éjà(`§Å
+xÚÝ[Ënì8Ýç+ê¢+‘zA€T’j`ÖÙ5f;³šÿߎ^ÔƒvU¬º4º¹‰mùˆ¤Hñò•§ÿžäé§ó×Ó¯ À)ˆ`ÁêÓמT| Oêä‚@wrV iÕéë§?_¤´FJããïsýýöú¬¤”é‘ 6ýŽ—Rª÷øwRŸËµþxEHÏÃë3zŒ™ø&:ºRïô—ŽÀ:¿‘ÞÜ I
+“T‹ÿþ53á¤Eð
+aÔÌÞœœFaÕÎI)](@ÕB¿.N>šÇ¢A‚<]D³Q|ûI*DÐzmt1PR&'=Ëãéï¨ DÃé÷26íÙ€!dU~™9òÅÜPMŸ×gÓ}¨è UÇù̺å„“À-G@ßXNI'PG»,(íÏÅ°çcb(+œq%Ù9»­ïv̶ }eæUi#«³“ÕÛ=ßF[fwºï–UWR8¯7ª¿­©>£dÃâœé‡K±ˆ®«oã}´{&˜4½u)Hî§ÌïN3¯Ć <Xn<Ì
¬P8
- JRÄaÜé}‘˜®ó–æ)úêßÛÚ/Ò<÷’7¢Å?øH0¯Oç¼±½gÚ/›öPæÇ@vœ^ ï…·nµ~n1F”º?ü¸*s;]Y§Dh±¬‡”‘÷ØkŸR´}w®«IðNoÁ+0"ÄGãÉgû|§ãE´7Ë`ÅÇóýz/ý6X®“XÙçßïꨟ>¿¾hS’l½J›³Œ\¼ÒÓœ¤æi<œïyq¡Ï½߶(\*îµz\(Ç¥{v™·zœ«äùeNc–Y
-¡èµ]t/F¤·l^Ž"I]Wæ&&ZØ™æ :¨óíÊØ4"sðoúÂ(ÏgäÙ|Ë‘òÜXl~/«ÃÛ}Ç1ZDï嘸Šq3×JÐ.ËšiÛ,1X¿øɬ‹ö@’#s›Àß+6…›6¥§-ßÊž*ùxE\Í¡]•Ô¿ø&#ny€ö¢ã—ƒ—¯‚¯“dG“XRÕM<‰…29\19DvŽç%¾ÊŠÎ|5DNnÖÏOhÜ-Á\,ùdlx”²¹Èº4ç­)ï‘/,:4
-Þdk^Qéx¶ôŠ©+vt÷ÚW]uƒ6EQ-,l/ÂhéN¨EE‹•%¬ß—UÜ`fžuĬ äŠuX³/Ñ¡Æ[Ž²Ÿ†}EÁ¶”ÎHé‰fÈ1ø±•žBÓTÜŒôŠX½Ï`Úˆ¨ G™¯¬D¡¼_Ü'FÜQµ²å›8â¤j&€
-ÙH¼²#Ã~\Ö]óïy8)P)nƒ½•4Ù`DÙYÌŠùà¢î­¶kè2”‹‰®Äxª-Ê1Ð š‹±·Þ¬8Cù¦…‹:kgW¢ú©n C9`1³Z…ûÎ\YÛm „·Û°Q¤…D6RUÇ8ÙÑ\X8ÆíÏãÛnËv”öÒaó¸_ßêX[åû7¡zF*ËF;ʸÅmËè¥9Yžºj!¸.4¼â.ÅO¼ã*ñN|+ë$2TXKPYH¼Ç[%¨sKŸDn)Iüšž˜AÿMZ¥Tž®2ã—iº?÷³'½×òƒµïÄBïØá^¨S˜¾x[5 q‡ž‰q¶öE½WÅYamÛg;"}·Z•J„X±·¹¤bÉ $T6V2Vú}S6o…1ø•l²"8%tà“QÓÁêPO,¬‘·ËÎ8Îoq}USÞç-Ž‚ß7ièÎèÆåmòK÷¾ÄSŸ®R4»‚VïfÚ“w¼»¯ŽdµpÒ}—+)¬G>Kkî üd2ìËŽSîæó"¤26í
-ý®Ö7òv¡Ñ¬ÍQã?]7<ÞpÊwÛ&Wµn½â«@ÅSúŸ4˜¯0µAá´_eM=“5ÏšýÇc©&‚qû`䘷ÍØWƒp>¬ÈN‘#†2_jT™É31öVm•N2”d½dù>}{eX¤ðn¬ üþŽÄQšØÇœ);ʵëRØ_aÏZÆmK!Wqo…F*Ž(™èÃÂ;‰»:¿ðÖ$z‰²>¶ £aä'„ÚNàalá,3ï @„Ž÷S±oRÛ£²ÀÒÆxyÖzÕ€”ýûã>Ÿ÷˜Ž{¥==í¦}£qÑ¥ÇX®†Æ*ö!Ô^iì:·Y²ÃFkl~×FB²ZÇOŸL3”ÇÏ6e/èía¤LÑV+¥ç*s†2¦•%6•TNýVðk‡õÛÈÇ›;h¥PÜ“'ÒÆ|^A„Òk!üTƒš¡ ÷±w glÙúBCõddÊIó–W§ÄpÝ%>¶$™6z¡ü*‹ííâ×ÎC9°VàÀ*Óìíצ4CÉýZy$j9³ˆû^ÎAÌYqªÊPXGøZZ×ý®—I»\zð·Z5d„>=PÉ„´žÜU"+¿rnê0çp¡ðé*ã9iŽ"÷#:Ï(ˆÜØ{'9ýˆ2/ôx‚fö3È*C™=ð(Ð;.Æ^–Wc¡ü—b ž`/c©±ÇPþϱ·Ì‘¾Z1%©Ö;ø°(«„¶aµ,¯sá1¢ÃÄaŠK1IeFB`f<€ÊRÌ}UÆPlà… ò’Ìù3èŽJA²´Ó±~…U}K/xäÛ]PNØñà*‹¯çÄQè軉{Y:EtÎ’ï]ð3VXgV s"(Yd"®rhˆNˆ¦‚N­Ò×Þ,ZEc(ß}æô«+¯s}Ú+­÷çlRzD¹±¬øk nº:U… ž ½7Ã×݃¡°…˜)c²3ÀPZi\ë÷öÕɯ•Ã mZI£„_™z²0‚ÌïÓJK@q)pÒKGòÒü¡/,íTê7Òfç|×r Œß¼}#;™5¤Æ®Œ4×`(û€m«µ›•~/¡–pù¤øM,¥B¤Lzå»s½
+LJRÄaÜéc‘˜®ó–æ)úêÏûÖ/Ò<÷œ7¢î|$˜·§kÞØÞ3í/›öPæÇ@v\^ ï…·n³~m1f”º?üº(s=]Y§Dh±¬§”‘÷Ø˘R´}÷RW“àÞƒW`Dˆæ ’ÏŽùNÇ‹ho–ÁŠçûõ^úÛ`¹NbeŸÿ¸© |úüzצ$Ùz•6gÙ½ÒÓœ¤æi<¼Üòâ4B¿Œ~|Ý¢p®¸—êu²#QŽK÷lŸ·zœ«?äùeNcú,…PŒÚvÝ‹é-›—£HRו¹‰‰v¦9è ‡êåúFel‘9NøWýFa”ç3òl¾çHyn,6¿•Õáý¶ã-¢÷r L\Å
+Š£Ú©AEÿËI]Õ+“/`8\7I'YÐÈFâ•öã²î–¯›ÀIJq­¤É3ÊÁ2`UÔÈÐ
+þؤ¡;³—·É/ÝG§2>]¥hv­ÞÍ´'ïx7 ^Éjá¤û)W0RX|–ÖÜA:ùÉdØ—§ÜÍçEHelÚÆ]ml:å=ìL£Y›£Æºnx¼á”ï¶;M®jÝzÅWŠ§ô›4X¯0µAá´ßdM½’5ÏšãÇc©‚qÿ`ä>o[±¯á|Ø#\"G e½ Õ¨2“gb­Ú*d(ÉzÉòc3úúÊÜa=»¹&ðÇK8{FibÞçLÙQ.C—Âþ{Ö2n[
+¹ŠG+4RqFÉD:ï$îê|ç­Iôec4ìFÃÌOµÀÃÜÂé3 @„÷SqlRÛ£²ÀÒÆx}ÖzÓ€”ãûó>Ÿ÷˜{¥==í¦c£±ë2bô«©±ŠãAµW»…ÁmzvØi­ïÚèAHVëøå“i†òøãÙ¦ìù½=Œ”)Új£ôZeÎPæ£Ñ´²Ä¦’ÊégÜ
+~ï°~ùþæZ)7Çâ‰ô„±žWP¡ôV¿Ô f(ÄÈ}ìÀÈ[¶>ÓÁP=YrÒ¼åŸçÕ)1\w‰Ï=I–„^(¿ÉbG»øµ³ÅPîX+p`“iŽöÆkSš¡ä~­¼'j9«ˆû^ÎAÌYq©ÊPXGøRZ×ã®—I»ì=øk­2˜(‰dBZOî*‘•ß97u˜s¸PøŒ •ñœ4G‘ûg”FÄn죌“œ~FY‚Ž z>A3Çdƒ¡¬Çxèã(Ë«±ÇPþN±„Ï p”±ÔØc(ÿäØës¤¯VLIªõ>,JÁ*¡mØ,ËÛZxÌ(wˆaâ0Å¥X¤23ÈB`f>€ÊR¬}UÆPîØ*À 3@å%Y;óg(0'”‚¤·Ó±~…U}Kw¼çÛ]PNØùà*‹¯×ÄŸQè軉{î":gÉ÷.÷ð3VXg6 k"Ï(Yd"®rjˆ.ˆ¦‚NmÒ×Ñ,ZEc(?}æô»+¯s}:*­çlRzF¹²¬øk n¹:U… ž }4Ã×݃¡Üa; 1S.Æbg€¡´Ò¸Öïí«“ß+‡Ú²’F ¿1õb#`Yߧ•–"€âRࢗÎ(ä¥ùC_èíTê7ÒfçüÐr Œß¼ÿ ;Y5¤ÆnŒ´Ö`(û€m¯µ›•þ(¡–pù¤øM,¥B¤Lzã»k½
endstream
endobj
689 0 obj
@@ -3420,7 +3438,7 @@ endobj
<< /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /Font << /F59 254 0 R /F82 295 0 R /F15 242 0 R /F74 245 0 R >> /ProcSet [ /PDF /Text ] >>
endobj
1091 0 obj
-<< /Filter /FlateDecode /Length 2390 >>
+<< /Filter /FlateDecode /Length 2393 >>
stream
xÚÍ[Ër#©Ýû+ôMÉ3Âá•eMĬ½»q·wVóÿÛá•$% äöÜ^È’KU‡äo?ýuâ§?^8ÓñSøûÇËöùòóªýI1ïÈÓçÿ^D¸‰ŸÄÉi&>Y#7âôù÷é?¯œ͹õá}{ûïçŸ/¼`þ¼:yrÌ®Â0«-E‘*¼®œ+^[@û¨Žsÿιáû÷ðÝûÛ-uyB‡—xÏw¤'/Êgã³LÍüMNs&¸&w^›\’&'%óÄâ{š˜ÏÿÇÏzà ÒI*—')¡L̵ßJ‘_g¼³`^–i
7%…·ÌKG0¡&ÓcM]Ô°U“âÿ™¾D!’nð“†|o\ƨŸé¾ò5Ó\òw`
@@ -3432,10 +3450,8 @@ PԜҊ7†s4:T« éZõ-ˆºl^ÆqfTlX£°GY§0<üE¢¤™bD@Ÿ¯#j2ˆëîSzm±¾@ñLqMéQkôô(èÿ}í
Þö4S'$ N(_±…‡¬:û}’FUËWw;‘G÷EeÎWw­ODgW|Ï9»1O ¢»ºC¶7·žÚ}Ùp_ö²ÛÒ=ª¤7ÌhAGlº’÷ä¡Ùø0õTIÜK]},Ðr­rW<p‚ñà­ÈÅðïŠæ%³FN¬8†±—þ%Y•5L)GG”Á&¥Ù• µ‚ïzTâ
CGéuB… DM©ÐIJßd)‘i“ÔäÚ8Ñö|½ttš˜#d4 Ö·žl+
¦AHÓÙZF‹Q’5v–)³ëMôGVµa±ŽÔå¼ÉV¶6vÒæ•6I ½gC"XŸã†J6ïŽî»ÓV|=ÚB°;͇|¶¡X¢-A¹Ù`Ææž+æGë,Ûâ2fT35yËd[aSǾÇÒK“¥Ž ꉇŠÿ¦¿û-p0!F(E—g¶ Yúÿe}´
-@}»á<ß…TœI¯(JjC^+CØ·¬»Ü¬Y›d?[sœê£E[ž¤fH³à<ß´ §åŽ¢<Á5HfHà<ß&Ôž‰Pù”ĵ­š˜˜»4©•¬¾;·—Å–"ÍŸŠ}^»Gy~§êÈ|ÛôåÿdÎ!EµƒÍvíŒc:\êAÖL†tÈöùIŠÉ¦˜‹ŠEA»®ŸEŸŒ§ü°õóÜ)?ésýfxÒµÉYHncZLPú]08Øé´¼IO.Mj0Ý ÖþaˆYkZ<Ý•Ö2ga P-©"AyB c˜jÐEX£GyÂ$´f^†9f‹Iô “-‡UIUøÎwA
-ü|$FÕïQžìw¼×{ ­ |Îî~›~È*Å Xˆ.”âÙ<
-Ú:ê2!pJ§"ÔÚzô(ãɪ¶ª³íiÙ÷'ª¹%¼—ÂãâìG^*ÃÖçXԜޒ_;È)´e õ`
-°TÑ”©–¾P’AýE߸»“[­·Úe{›R¶›UJ•½_x¦ó$@0%Ÿ°x¾Š àQÒ4[…aÎa—SC!9S¦÷n>áB1{”ùºöÑéˇEýí&×úAH²§?6~Ź;Á=Ó\QÂÏŽ”8EËkR£Õ0ùá@ܪà>#JS¹wõ 35Äz«ÆÙäC¨ ç%Ôƒ¬—\Ö0#b61)¡¸¹U¼ÄsICÑù"úãñ°¼QW¶æ‡"²þè#a]¾£¸!?$¹½7}mNŠ3ßT µÝôñùòLê …
+@}»á<ß…TœI¯(JjC^+CØ·¬»Ü¬Y›d?[sœê£E[ž¤fH³à<ß´ §åŽ¢<Á5HfHà<ß&Ôž‰Pù”ĵ­š˜˜»4©•¬¾;·—Å–"ÍŸŠ}^»Gy~§êÈ|ÛôåÿdÎ!EµƒÍvíŒc:\êAÖL†tÈöùIŠÉ¦˜µÌk (‡m×ÆÑ¢SÆc~ØûytŽ¹~7<)Ûd“,M¶APúm08Øê´¼ÉO.Mn0Ý ÖþaŒYëZ<Ý•a…Bµ¤‹å 1Œa^¨AaMŒå ›Ð:hõ`™³qm¢G™l:¬ŠªÂw¾ Sàçc1ê~òdÇã½Þm ås~÷ÛtDV)ÅB|¡ÏfHqò ³"ž„P×;*Þl†€ÊÚ£üË\H&„¦p^c¸Gù ø¥Ⱦ5DŒäÛ=Lô{ñ°p$ÞÆSèʺ‡" ßý†ù3ñ"”JŠò„Ö‡ùÀ xzé
+Ü—Ôƒ)ÀRQOP¦ºúBIõ79~ãOî¶Þê˜íJÙîW)U¶á™æ“
endstream
endobj
1090 0 obj
@@ -8005,13 +8021,19 @@ endobj
<< /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /Font << /F15 242 0 R /F59 254 0 R /F82 295 0 R /F81 294 0 R /F74 245 0 R /F79 270 0 R /F22 271 0 R >> /ProcSet [ /PDF /Text ] >>
endobj
2489 0 obj
-<< /Filter /FlateDecode /Length 2097 >>
+<< /Filter /FlateDecode /Length 1745 >>
stream
-xÚíZËn$·Ýû+ú¬‘(êܶ;@ÖÞÙæ®îÿoCJbI¥’ÛUm{0‰Çõ<⛇*kåNÿ;iú÷»óÛÝ‹K'T) §·îÌIÓæAy<o”öæôöÿÓ_Z;ÐÚZúIZãëãßoÞi#¨—§¨’÷6ö8)¨q²„/ZÃ¥€t2} :e`+PÔ:¤C­lÐÚ¿T¡Ît̸3|íñÞãå°\å»åý¦¥á©œ B~û¹=cù÷¹¼Ï÷‚§óP°ò}ÆäÕ\Y߃K¹îüQYTÆÃÌDv™Èè ,ˆ„±JFšg>»ˆÌM¹cQŽÄ=ûõ
-œ÷Q¡ŽS›á¡h‘溔΅˜¦lI·Fêlí¾Å—‡c½Â4íÅ;ÉA­ m¸¹pû;̼uÊÙMëón7;0V«ÒÉoãuï…î‰çå‰Ú(¹åsÄÛKïÁO7z¨\°3m6ú‰åe‰z“©I&¡,™®îÆ*op&ñÞ–^™
- ´ú†1g2ÆX_¯Õ¬áj‡5;9^nªvΊ8­í{™R­vÒOkã´jïe/¢Ç‰}›¥mj•‡ËUè}-ÞgÿÎòö߉….üö{]Éê´å©·'õñÓN³—…‰•×HßÖI$Ä´/ìeSµ/ H¿Qot:óÝÖaÜÏßÄÒ÷÷Æß­çaŠŠª÷ÌÖ;Ùcm1ÐÍ)KD3v’Ch ôklí}KOD—”Ivj²cÛOÒOQÅ™{÷ŸD5ÒOí‰u¶AApSã1×HëžÌ²·íCað~¶;4;ú’½²ÏMÊ×=×ÐŽ{€z…5Ón³—Q‚Q¸EÊ]ö"¥ðØÑA=SÖM+ý^Æ)z®‘n/õ•MqûÇØÙ€t³D6Y…6Í$Ú˾ªDÒ·ñEK¿0nwßìa®4 ýF|Ñ£ÀÌ{wÀÄÒ{)·VU":Êy;óÉ17
-~aÀXˆƒ¹ˆWŒõØ|u ‘¼´šß6(äÑ%vËÙR3ûûKM1ŸàI€Ž²<ZÉþìžä Štd­tJР‡®1Zh/ì¹×&çV1å°éZM)iÓé^ +³È¾ºÀög_Ü^0xåh:Ly[wqÆ*cý
-_ßîþu¦a;
+xÚíZÉn9½û+ô¡É*®€!@²­æìÛ`®3§ùÿkª¸t“lJn*V
+sbˈ3©¯ ­™Ó·C
+uÈä+(Wús=¾Ê›™uÜš{
+œµ^hé‡6ÓSÑÚ#u”Î8¡uF0ÎI×"U¶6ñåtìj+töâä@i) l¸¹pû›f0¸i}Öìf
+¥ð.lì6Žµ¬½PÍx]fäFÉ-Ÿ#/µ¸Ñ[ÐÂ8i;Ùè;$–—%r:Ñ›HMr4Ê)ÐtuW(¬Ò#‰÷¶t°B9葘šp;/Ö.Òæ1È6ö+})^©}Àc1ú0a.ÄÌWÑ õ™ÎIÆ mpš³A‡ôžrtë%û¾êu~Mät¥µËS>Í•~ø:b\¯ ¥åï‘Åw´6Îó[jÇ¡'\`Yî%+˜`î •í¼¨·kpf3É%l°#ŸàÔ®¢º{›c,
+/ÕP ?%P ô€mÎ`ƒ6å¬áj§svr¼ÜUíŒáõ°¶ïeJ¹ÚuH?y[c´Þ«ö^öRôh‘Ø·QÚµC5y¸ŒBíëâ}öï(o¯ø®XèÂOÏØëFV‡-O½?¨vš½,¬X¹EzXo4*þ°—Må¾Ð!ýF½ÑÈ@Ìw[‡õ~þVlÐ!=¾7þn=O/¨zl½“=æÓݲÔI„20h'9,µ@¿ÆÑÞCz¢6A¨€C“Í?uH?¹'jí é±÷ü©èÑ"ýÔž8©3:Î uös:·HmOfÙ×ãÃÂàíèthtõ%ge?¶S¾í¹mÞÔ+P »Í^F Jè-Rì²—R
+ÀŽ&õTF Vú½Œ³èÙ"Ý_ê¥ü0öçØY‡t·DPh #‰ö²¯,Q‡ô0¾ˆô¡ýöô §¹R‡ôñEtJ€‘ öž€tHÿŸ¥Ü[U‰ècqä“9×ÝŸÚZ cNSµ@ìåU¨dÿ:wú| ÿdÛ¸àó…äRT¹´mæW8î
+)å‡O—XXUMô»‰ÆÄ1n¥Pd@¼iÀH³‚ì͸œ´ë‹6L,ä!;R·6ÿ„”xÎ¥1g÷û¬óK3+¥ÚɬuÁ“káÕy}Z›iÁˆózÌsÚÄÄ—|åÄ­.ý¶«B%jú9£œ¹6>Ì%®`Jc”X]Yá`}uyJ–eë¦êBqáLJ!Š.ᯗ±Â¥Ót
+ƒuöµÂãL.÷&ýC)BÄümçøeT/×òk¶+¯ˆ²Ú®!ºXk\Δ
+ÂQïê1ßrÀœS¶7ZÊŠé›ò*®k´§ïÐßãAå$ÑØ_ÈÔ«?w`Øã@B®G_ãÀ³jË¡äL†ZëÛôRX¥FèK}¾"W
+rfpË‘AõÇïOß3ïÄå
endstream
endobj
2488 0 obj
@@ -8129,263 +8151,261 @@ endobj
<< /D [ 2488 0 R /XYZ 79.37 310.551 null ] >>
endobj
2526 0 obj
-<< /D [ 2488 0 R /XYZ 79.37 283.486 null ] >>
+<< /D [ 2488 0 R /XYZ 79.37 230.677 null ] >>
endobj
2527 0 obj
-<< /D [ 2488 0 R /XYZ 79.37 237.187 null ] >>
-endobj
-2528 0 obj
-<< /D [ 2488 0 R /XYZ 79.37 166.978 null ] >>
+<< /D [ 2488 0 R /XYZ 79.37 184.378 null ] >>
endobj
2487 0 obj
-<< /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /Font << /F59 254 0 R /F82 295 0 R /F64 241 0 R /F15 242 0 R /F74 245 0 R /F79 270 0 R >> /ProcSet [ /PDF /Text ] >>
+<< /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /Font << /F59 254 0 R /F82 295 0 R /F64 241 0 R /F15 242 0 R /F74 245 0 R /F81 294 0 R /F79 270 0 R >> /ProcSet [ /PDF /Text ] >>
endobj
-2541 0 obj
-<< /Filter /FlateDecode /Length 3105 >>
+2533 0 obj
+<< /Filter /FlateDecode /Length 2479 >>
stream
-xÚÍ\ËŽc¹ Ý÷WøZÑû4
-(·§È2è]mf5›üÿ"”DÞ‡îë¸ÆAjQ(ûúX"EŠ‡¤T¥oÜôí÷o÷_ßþöýÍUB0éöëßß }¢oæ–Šré–¢Q:šÛ¯?oÿü¡µ}×Ú}hm~jíôúN?Vëhß¾»*ÂÑ+óƒ—·ö:Ù·éYýñ'=uˆ>¥Ÿ`úóÀ¡>Íõ·<!ìLj‰÷·ýú;éf­¨-é¸UÍ[cÕüÏ.Eªã;WŸÄ7›Y¶›,}Ôä÷F5Ö©˜ý8®u]³:J“˜Þxzïs×´-£eÍõü¬¾¾¿EVäT/댊ºŒ,ÖéL~´*9½T~÷”ü.ÊfCn߬ç´J5Þ¹áLQ)”aȪOuõ*wbÝê³j“ºö~¬wdãâ¹»_ØΪbü ÄÊÅ»^÷*ÒÛ÷¦œýèã§G—§Âë¼ó’¯Õw.É»Š©º¹Ï,— Qéä>½\§Ëà m"=šwßL&³M^’ŒèÔõö6 šö'Uê»m­–Å]L =•ÇÉj”›Ö«IÔӧꙕó@Yâ/¦íöµUŸwua]mj‘”GÒsôlŸßgœŒrÉœÎ*x»Q:vé<{[3µžc·cO¯Ïl:ßéÉ(§76´s¹R•kO,Q¸¶†ê'D¡•TÑø'Eñ´]³O{²L†`*«´Ê5“&W)4Cg
-§Æ
-0›yž¤~“’2qÄ~Ès<¹OûŸ…_Æ”hýóñ‘|J632@ÚBëÝ8ÜÒ†]pá¡;ò ÖuÔt?æ
-¨OväÝý¦;ó!Œ­ ùú<]‹q»‹/Sæ•Ú2¥¯iÃÜ9ÌK ¶jUyjRür[“FïÍ@5é»!`Þ!ÂûK{J±ü—Ú_ØÞrØ[>•\~iäÆ|Qw©VI¶¸qôÝö’OŽö¡Û«û>¡UR™2—aÌ©ÞN\1蹉̜gkEÄœòfôG ùÇÒ²Z“û¹$<jö•^lË‚õ0$°Z‚ÅEpŠmuš¨ø ›Å^“ây'ÉQÙ²U~ߤÑ^ì¨Ã˜y]‚ÖÆ@5ëXnN‚óÔÄ£t2ã,}†IêÜÇn¦ýàÍÁhŸkiüu;Yh¢µòz3mSô¡›|jYGÕTŽ›õ©ò}œ[Ô'éÑðMŠ‰Ý•/ºÓô­ íÞ¼î3_ÉݽÖG†1z÷qå×AM|d=˳>r´g¨´.&¿ü”l·†@¿ ¯)®’‘‹0Hë0Ž ÖͦÔêÆmô]–xÏËdÉ&ö´mÙ>ºÇ ªsÿ·QåhÇ[k†ÓàÑu§pvÒ&¾.;¼ÊÑ,ÃlXZDò(mÂJ‹œCÒ" Š8Ú“Ñ”—F‘aÌe1éÚ% Éë9±GÜÝÿŽ~Õh,š˜u˦­ú}™ÏŸdü)âýϬO.ÊR0H¬&¾Z3 ¨öÄ%ÙŽ#cÞí‚QéKÜœÏþÚ»i
-nWÆð¶³Fù×v³†!_U¼ô’l=8¶Åè{”ë}¥Žd ×[Œ¶áõ³)(cÌË·Ø0®¤ÿ-½™ºòç AéÇ‘.IŒ2ÁmæA6Q¥Æ‘áã’HrÙ6n.…j÷¬º’œ^LÇ:cêž'Z;-oÈ&lÖoµUŽJ*O%îVV¿ŸÆ=W÷ƒ×ž§t–Ösã»AÆÆ®Ë^Äצ[z 6<Š0Q‘Çñ¶gàœ‚qJa~^
-í£^÷îdƒI›²]Íù×÷«/¯Òš ñõ k¶ëàzHqrqÀY ëAóÛw_ìÂ|u•î‹F²½¦Œ¨·Æ¯”žÖð/\ðÅ«H\~¹HX¥¤ÌŽ÷®8 î¶ËÆ#J¿¼ëÔÏ”Çzmnk¶h¥/®ñÙåí¼mþ :J _º†„¥^ÑMlæ
+xÚ͹®ã6°ß¯ð,C‡ðð€x/2x]6[¥Éÿžâe‰ò:À+ [5÷Mš_~\øåû—ëÇ—_î/B0§”0—¿¿zÂ/âb“æb´`\‹ËÇ?—?ß8‡_9—wÎÅ7ÎñF¿¯ôÎ5¼•Fù’~‰·tÛ½‡ßÞË=ÿÁ[^nøöDsˆžÒG‰ˆ`¬ü]Kw®ùN&îÚ_ßÿúøxêâ˜Ó@<Ž¬!0­Uf͈ÈZ¡Oó7ÏA¾ëïxJXF±ëÌzX ‰»@W ÏïaYë¯ô-¾í×
+“Ô=:®óz$zöøS˜rjÆŸ×Az»³,É™É>#îÒUCæ¾³¹GCJÏ<Q¼º†ø½¡"XH“қºÚDV¸ü¤Z¸Š¢(WPã{·þ^0½²6»
+™³ú5
+š‰ëB>Ô’bž[M÷”Ý0’iï. Ø\•”&#UŒmjH|óížÿ=zÙ~“‚š×°šM'=›WR/OQ/•Oç½øæ)iùÚB­ƒ\ý 7‰¹¹cŒë\lòÚ-TÌ ì©h <rÖW ÏëM vV`RiÆ|^`ûY*ÍÏÍ@P{gÍTŸ ÃÉ, …Áy „GÒâjz—nt°[SXÍd«”‘ÞÉŒÑN99*Ãó¡ <Œc’[êÕ¡gYW]Hª' Kaïhü`“¼×ÜŠOÕ„¨RðÚ¥OBbdZà9B¨à zÅL():z£sT9Gt‡`1Œ'ÏàœhÆDXpŠÈÝê@À'ªŒ;®,TŠ
+„Røh»¹Ÿ†Ü™Ô¿ËªN­¢ïn`AGêðœÌùÂ&tîÛÈ#Ou’ç'âëhB±ö|\$›bÕ€ùÉÈŽ:E”=¸Z‡‘ðœKržóýVÖvf÷›ûÆÃÀˆR1ú ,ãHÕ‚æ\‡>@;ˆ>VP¹"Ñ=9õI+=ú9üÉ7ÑŒ\ã˾ûÚ•Pö÷©ÒPœ›‘Óf…ƒF_2;r€ZÓM1Åã4¹ïB1
+Õ=ÄÕú]"“JÌèyR%@ºÆœ2“‚aã£øý¹¹ÔqAB¢–£`žœM!w ø`iº­¤ü “h¨«¡ö¢§ýÉ0©<ñBÌ”¢g#’Sb+Ò»êrmà·S´Ÿ É8þæ?lj޸…DI¦æ¥ÝdÓ›QæŽ1Э2Ý4êó¿ýºU/å’!åáãšf‘z9)ð“iVÚÇší,`A»”"œ°síæ-"³®]kts}HrÐRÑnŠ·ÍÀ¼±àÚ¸McÞj^f”ÄÑ£k†
+•ÍL áQl‚ãd2,Ë#Êp"ç^Í Ë±y¹)j_—i“YgVå‘;“ƒÝMßUO€Ú÷¯è R_IB‘¥k5DÎAOÕ j×7LþÄétÈ4åòCa¬„U*ÉèþÀU
+©ÓiY¿C‰õ)'[ŸÂ- Z]Î~ßúS¼Øü§e¬MÅ0îƒBËÙOš
+ؤ:¨uZF&‘ºÌQƘÐMS—¤’éfÛu³aùïKüñÇwÂDuØCm:Î
+0M¢CNζmݨò·Æß>¾ü 2Ô
endstream
endobj
-2540 0 obj
-<< /Type /Page /Contents 2541 0 R /Resources 2539 0 R /MediaBox [ 0 0 595.276 841.89 ] /Parent 2486 0 R /Annots 2552 0 R >>
-endobj
-2552 0 obj
-[ 2529 0 R 2530 0 R 2531 0 R 2532 0 R 2533 0 R 2534 0 R 2535 0 R 2536 0 R 2537 0 R ]
-endobj
-2529 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 78.374 195.265 168.645 204.152 ]/A << /S /GoTo /D (section.0.1) >> >>
-endobj
-2530 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 78.374 171.405 199.908 182.374 ]/A << /S /GoTo /D (section.0.2) >> >>
-endobj
-2531 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 103.28 159.4 217.99 170.359 ]/A << /S /GoTo /D (subsection.0.2.1) >> >>
-endobj
2532 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 103.28 147.564 260.909 158.403 ]/A << /S /GoTo /D (subsection.0.2.2) >> >>
+<< /Type /Page /Contents 2533 0 R /Resources 2531 0 R /MediaBox [ 0 0 595.276 841.89 ] /Parent 2486 0 R /Annots 2545 0 R >>
endobj
-2533 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 103.28 135.051 282.11 147.006 ]/A << /S /GoTo /D (subsection.0.2.3) >> >>
+2545 0 obj
+[ 2528 0 R ]
+endobj
+2528 0 obj
+<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 78.374 89.191 168.645 98.077 ]/A << /S /GoTo /D (section.0.1) >> >>
endobj
2534 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 78.374 115.514 177.731 124.56 ]/A << /S /GoTo /D (section.0.3) >> >>
+<< /D [ 2532 0 R /XYZ 78.37 808.885 null ] >>
endobj
2535 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 103.28 101.178 257.353 113.133 ]/A << /S /GoTo /D (subsection.0.3.1) >> >>
+<< /D [ 2532 0 R /XYZ 79.37 775.009 null ] >>
endobj
2536 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 103.28 89.671 172.561 100.62 ]/A << /S /GoTo /D (subsection.0.3.2) >> >>
+<< /D [ 2532 0 R /XYZ 79.37 668.934 null ] >>
endobj
2537 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 103.28 79.539 258.917 88.775 ]/A << /S /GoTo /D (subsection.0.3.3) >> >>
-endobj
-2542 0 obj
-<< /D [ 2540 0 R /XYZ 78.37 808.885 null ] >>
-endobj
-2543 0 obj
-<< /D [ 2540 0 R /XYZ 79.37 775.009 null ] >>
+<< /D [ 2532 0 R /XYZ 79.37 586.77 null ] >>
endobj
-2544 0 obj
-<< /D [ 2540 0 R /XYZ 79.37 692.844 null ] >>
-endobj
-2545 0 obj
-<< /D [ 2540 0 R /XYZ 79.37 622.635 null ] >>
+2538 0 obj
+<< /D [ 2532 0 R /XYZ 79.37 516.56 null ] >>
endobj
-2546 0 obj
-<< /D [ 2540 0 R /XYZ 79.37 576.336 null ] >>
+2539 0 obj
+<< /D [ 2532 0 R /XYZ 79.37 470.261 null ] >>
endobj
-2547 0 obj
-<< /D [ 2540 0 R /XYZ 79.37 518.082 null ] >>
+2540 0 obj
+<< /D [ 2532 0 R /XYZ 79.37 412.007 null ] >>
endobj
-2548 0 obj
-<< /D [ 2540 0 R /XYZ 79.37 423.963 null ] >>
+2541 0 obj
+<< /D [ 2532 0 R /XYZ 79.37 317.888 null ] >>
endobj
-2549 0 obj
-<< /D [ 2540 0 R /XYZ 79.37 365.709 null ] >>
+2542 0 obj
+<< /D [ 2532 0 R /XYZ 79.37 259.634 null ] >>
endobj
-2550 0 obj
-<< /D [ 2540 0 R /XYZ 79.37 307.454 null ] >>
+2543 0 obj
+<< /D [ 2532 0 R /XYZ 79.37 201.38 null ] >>
endobj
221 0 obj
-<< /D [ 2540 0 R /XYZ 79.37 248.929 null ] >>
+<< /D [ 2532 0 R /XYZ 79.37 142.854 null ] >>
endobj
-2551 0 obj
-<< /D [ 2540 0 R /XYZ 79.37 236.172 null ] >>
+2544 0 obj
+<< /D [ 2532 0 R /XYZ 79.37 130.097 null ] >>
endobj
-2539 0 obj
+2531 0 obj
<< /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /Font << /F64 241 0 R /F15 242 0 R /F74 245 0 R /F65 243 0 R /F22 271 0 R >> /ProcSet [ /PDF /Text ] >>
endobj
2599 0 obj
-<< /Filter /FlateDecode /Length 6310 >>
-stream
-xÚåÝÍ®ÛVšFáy®Â7Eü• øÄq=ldÖèiÕ¨&}ÿƒ&¹ßµER?\'n4h‚$®Ç¶äHßÚ›¤¨æËyúßýóK³üÿÿý—?ùíGÛ~¹nc;ö_þüÇ/åÿk¾\n§îòå26§óØ|ùó__þãoçswûúksk‡é›¯];ý½ýq>_Î_Ç~þ±ßÏçþûôcmçÿïë¯Ýµ›â¥üÈ,ÆÛôפÆsù±±ýúŸþÛ/ç/ÿœ~ã¿×04çSsyxã°èæá¹üö£ž=‘æÜŸÚù×éo§æ<ÞŸÊù<\§¿Úé)Ûù©tLz@Ýüð§§Õ_×ÿþµ½þ­<øùÇæ§Ù}LO¯›ŸÞ8ýÈôxÏýòÄùѾ-<Ýâ·?ÿò=Oþüò §?€ö¶àÃõ…¾œ®W‹/Ãi쫯ݩ»¶VßšSÓuZ_§‡muw§ÇÝ[ÝôÓã¬nÛéqZߦÇ}±º»LÛþ×éúazÜZÝô¸íˤ›^TW¯§±·/“î2žº›}™t×þÔôZO/ªëM¿Ln·éqÛ—I¾LÛ¾Lúf˜·}™ôÓ‹êzÓº;Oû¢õuzÜöeÒ÷ãô¸íù~zQi; èqh´¾ú³Ö—Ë©쫤Ÿ^S·³}•ô·vzÜöU2çèÖ>è—9zÈO7?“fŸŸñ£æ§ÿ–j~”TÌ ¢¨}["3f¬™c24ü[3×wþyCÿõ×ò ½ø ý%A¾~½ò \º÷ÁØ>‹£`8M0¤N0”®Ápš`8M0¤N0œ&N § †Ó †Ä †ÓÃi‚á4Á:ÁPºÃi‚á4Ápš`H`8M0œ.Áp–`H`8M0œ&N ¥k0vƒ¿;
-Fs9µíô_©^7Ó«ì!«}KÓÏÛ®ñZbQç|ó£{9Ý3ûçH°cé?÷(SHšýû}ÉöìK&3N“§ÉŒÔÉŒÒ53N“§ÉŒÔÉŒÓdÆi2ã4™q:™‘8™qšÌ8Mfœ&3R'3J×Ì8Mfœ&3N“©“§ÉŒÓ%3Î’©“§ÉŒÓdÆi2£tÍÌ.:3Mwš~ú‹Ê,Û“•9÷c6*sYÆM{>î‡ú–#içŸ+YØ<Ö£*(LN ®IP˜"(LN&
-S…‰Âi³I”@aB 0p80¸V@a" 0 P˜8œ(L
-3üfö+Ìè7¸Nþí׃ÿÜœÚëËýÅøíÝäÿ0‡ªÖExspªä“*ËO½Ÿ8y™÷öYMn¥ëèvšÙí4Ã[êLo§ßN3¿f€; .qF¸ÓÌp§âN3Å¥ÎWºÎq§äN3Éf”KYî4ÃÜé2ÍeœKyî4Ýi&ºÓŒt¥ëLßêþy–a¼ÞNÓTÜÏôoõ$CÛ–‘[&v™Þ—Œßyu^N̯Ï`OkôÕÙƒmæi>Ÿ%_ÖúíúÔ¿ÏR…Îu¿;B´}èˆÎNÀáEâÒ…ɉé‰Ã‰‰Ä¥%'%§$'$—ŽH[2âp*âp"âp"qIˆÂÄáÄáôÃáäCâR‡‡—v8štH\ÊápÂápºáp²¡ðpN·þáWžËÜän`œžIwyÜ |{8ÛÐŽÓ¿vYçßrLg¾èë²9}«%èŸû>úTg®Ë˜æ\וYêrÞŸßêu?
-5«Ò£ücÙ\ÔoËßï¿âË £gûçr4{œfø8Íôqšñ#uæÒu
-g²;›Á®0s]aƺÂLu‡3Ô ®3]aFºÂLt…ègž+Ì8W¸LsEæg–+Ì(W˜I®0ƒÜà:Ç·¸]>!Çx7ýçáaŽßïÑÿþWOËñqŠ±ÝOü×Ó˜ÝÐöa톜f7ä4»!§Ù 9ÍnHê²r˜ÝÓ솜&•R§•J×X:M-&—R§—NL§)¦Ó$Óé4SâDÓiªé4ÙtšnJp*]Ëé4étšv:M<¥N=&ŸN—~:K@¥NA&¡NÓP§‰¨Òµ¢;Ý.‡AeFÛéOõ¡¢«)6ëV.;—§ÇT_ï…–˜ßÿʾ©ôwuOŒ÷Gok6Ïé¨ ' ×"(L¦'
-S…‰Â´@á¤ÀÙ”@aB 0P˜ 8œ
-\# 0 P˜(LN
-‰sŒBê£:Ç(¬.Ç(œæ…Ô9F!5+m©³Òvš•¶Ó¬´f¥ítVÚg¥í4+m§Yi;ÍJ[êÄZék§‰µÓÄÚib-ubí4±vºÄÚYb-ubí4±všX;M¬•®±Þ÷›¹c ±®§áòªÕýïÚíã%˜»EìÓš¿ïçæñåSaê©0ñT˜v*L:.åT–p*L7&›§š×h*L3&™§˜
-L…é¥ÂäRáÔÒÙÄRaZ©0©T˜R:œP\;©0™T˜J*L$N#&‘
-—B*J N&
-SG…‰£ÁµÛ¾}[öŸ2ÓŸýØ ¯?,·|û×qÉc÷G àòi¶÷Ó¸åßïdžo—9¶÷#SÛ¸òY‡õ±¥>Ÿ}XX~;ç·ÏáhÐKI¯tõN3ëfØKiï4ãÞiæ½Ó |§3ñ%ÎÈwš™ï4Cßi¦¾ÔûJ×¹ï4ƒßi&¿ÓŒ~©3ûfø;]¦¿³Œ©3ÿ&
-³]S˜íšÃe»¦,Û5…ɸÂTÜáDÜàÚp…I¸ÂÜá\aú­0ùV˜z+œx;›v+Lº¦Ü
-n‡Ómƒk¶¦Ú
-m…i¶ÃI¶Â[álEéµÃɵÂÔZab­0­6¸¦zƒçï?¾×¥ž^—óÛíÚüÉõñÅÑ̺¡:ïOÙ×´ç¯ûMK>s]ï_¸ýI»Ûgv4wfðJÉë4£×if¯Ó _§3}%Îøušùë4Øi&°ÔÁJ×ì4CØi¦°ÓŒa©3‡f;]&±³Œb©3‹f;Í4všq¬tÇ[írn>Ø5çÓåq;º÷à÷õçÕÿoÜ•õæ­¬ ®#^a&¼Â x‡3ßf¼+ÌtW˜á®pf»³í
-3Ùf°+Ì\w8cÝà:Õf¨+ÌLW˜‘îp&ºÂ t…Ë<W”qîp¦¹Â s…™å
-3Ê ®“|ƒçA®/è›'ÚåÖ?Nò‡»ÎGÀ†~õÙ·åö×t—û÷‡=Þ9~½ªæHùùÏNŸ<ÿúš9$ó§ß»9ßÞNÓݳ;§V—y*uªÔ™¨Rg¤J]fªÅe¨J©*uƪԙ«V—Áê4“UêŒV©3[¥ÎpµºLW©3^¥^æ«´°V— +uF¬Ô™±RgÈ:Í”ÝéyÌŽvÌ^ÇÓuz«¾³«Ûî=_8¯æÝ“/ñb‘ün™›Cï»rpì]ê|—:Gß­^¿KœãïRç
-N³Sš¸9MܤNÜœ&nN7§‰›Ó‰›Ä‰›ÓÄÍiâæ4q“:qSºÆÍiâæ4qsš¸I¸9MÜœ.qs–¸I¸9MÜœ&nN7¥kܶzŽ[gη—~/÷›{ʸÕ;~Üo<Û¿?½{§ ¥¦ƒNÓA§é Ô¥ƒÓA§é ÓtPêtPéÚA§é ÓtPêtÐi:è4tš:Jœ:M¦ƒNÓA©ÓA¥k¦ƒNÓA§é Ôé ÓtÐéÒAgé Ôé ÓtÐi:è4Tºvp«»ëg:8¶§[ûr“·ºyã“SÔo›Õ.îîÉžo{~ºíƒ:
-Ó„ÎiB'u ÄÎiBç4¡“:¡Sº†ÎiBç4¡“:¡sšÐ9Mèœ&tN't'tN:§ Ó„Nê„Né:§ Ó„ÎiB'uBç4¡sº„ÎYB'uBç4¡sšÐ9Mè”®¡Ûêîú‰ §Ûá|º]^nø6·T,7·¿´%\«›Z¿ã*eõLÒÓ›­]ðSù|¶iwYA—þ¬¿0k9öc}Y7óçŸ7Úõgår´—Ÿõ©ïíŸøÑ{ÃéòÞp–÷†Ôyo8Í{ÃiÞNóÞPº¾7_ßúRŶ»ÎÍë#ýÃæÞåuò¿ø–x¼ÇQ—{-µ]ùëݽäúöOä è'èNt§ ºÓ]ê]ét§ ºÓÝi‚.u†–Ó -§ËÐr–¡%u†–Ó -§ZN3´”®Cëqðø¡Õ^Nç±{9´ú‡ ßCÎÝ×ʬÙWÍ“ë÷Žï©ü|ÄÙ»'³ËÛ>§£]žÔÙå)]wyN³Ësš]žÔÙå9Í.ÏivyN§‰§‰‚ÓDÁi¢ u¢ t‚ÓDÁi¢à4Q:Qpš(8]¢à,Q:Qpš(8Mœ&
-J×(<ì¯. üíGÛ~¹nc;NKßÔ_ër;u—åó¦Íêüsní°º=¸ú6šy)ùâ#±Ã¹?õýõáêå4¿ýh†g¤]þæ;pO«óëú'æíþòßyT£:
+<< /Filter /FlateDecode /Length 7243 >>
+stream
+xÚåÝÍ®ÛXzFáy]…o Tâ( hðiÛ dÔ,È´{”Iî’û][$%‘븀 @ªÜyêXrIßÚ›¤¨æËyü¿ÿþ×—fþ‡ÿÇoþöÇ϶ýr?݇vè¿üùÏßÊÿ¯ùr½Ÿºë—ëÐœÎCóåÏÿúò;Ÿ‡¯¿7÷ö2ýãßÇ¿Úó¹k¿þÞݺñ¹4㯮üj¸¿ú¹úÿ÷çs3þ[íÇ×®Ýå×ÝǬþóÏûíüå_ãoþú Æyj®¯Ƥ›§çóÇÏæòêÉ4çþÔN?§¿Ÿšóðø9㣺±9·óƒº–'2?Ðñá÷ãSì¿Or|ÝÓë6O¬½¹'Ö¶ÍøÇ{Ù> ËíU;XÝ §Ûó“}§ûþ4´7«/íø¸ïVã¾Öëëé¦ÈõrºÆê[wên­Õ÷æÔtÖ·ña[݇ñq÷V7ýø¸íˤkÛñqZßÇÇm_&]w·ý¯Óõ—ñqk}éÆÇm_&Ýø¢ºy|; ½}™t×áÔÝíˤ»õ§¦×z|QÝîúer¿Û¾Lúóu|ÜöeÒ7—ñqÛ—I?¾¨nw­»óø¸¯ZßÆÇm_&}?ŒÛþ—ïÇ•¶c^†K£õýÔŸµ¾^OÍžJúñ5u?ÛWIoÇÇm_%SLïmÿÁ71}Šg7=“fÏyMPâ9ܶiœbyi¾þ>wqêj?ý«rŽ±œÈ,ÆøÎÅmç2ý}ûƒÞ5xøÎrdú‰»}Y?£¾8M_œ¦/R§/J×¾8M_œ¦/R§/NÓ§é‹ÓôÅéôEâôÅiúâ4}qš¾H¾(]ûâ4}qš¾8M_¤N_œ¦/N—¾8K_¤N_œ¦/NÓ§é‹Òµ/ÛNؾ´ãëf|•mûòm¯/㸿Ó­d
+ôõºö51ìJß„£ýH˜>Ê_Ó¿=møéiûª)L%Cóï·;Ù×Oåh²+]'»ÓLv§™ìRg²;ÍdwšÉî4“ÝéLv‰3Ùf²;ÍdwšÉ.u&»Òu²;ÍdwšÉî4“]êLv§™ìN—Éî,“]êLv§™ìN3Ùf²+]'ûvB¿= ·{LñÜóþVÊ·zL±ýöXÈ×IûQ&ïõVfóô¿O¿Þ™Âõ¨áÓoôkG ‡ñ 8NÈÇÏy:jø&™•n›•ñïçì‹VOtÞ5ícÛ<Èýclg$uö@R§”V—R:M)¥N)¥N)­.¥”:¥”:¥”:¥”º”ÒâRJ©SJ©SJ©SJ«K)¦”R§”R§”R§”V—RJRJ=—RÚ”ÒêRJ©SJ©SJ©SJ§)åS2äh˜9\·©Ù?Æ6$Іrˆm> ö:͵?Ýž~§7ϧ¹Ï¾m¬¾ŸÇÀ·ZßÆruR·çËø°{«›n|Ü«s6Îêr6N꜓:gã¤ÎÙ8©Y)H]V
+³Rpš•‚Ó¬¤ÎJAéºRpš•‚Ó¬¤ÎJÁiV
+N³Rpš•‚ÓY)Hœ•‚Ó¬œf¥à4+©³RPº®œf¥à4+§Y)H•‚Ó¬œ.+gY)H•‚Ó¬œf¥à4+¥ëJa­»›])Œó¹ož6¥‹£¥ónú\Ö/vÎ/ΗºL»íººèÚÇÑUNÏ•SvE÷k3ý.o·ª%)ëG~”§IŠÓ$Eê$E隧IŠÓ$Eê$Åi’â4Iqš¤8¤Hœ¤8MRœ&)N“©“¥kRœ&)N“§IŠÔIŠÓ$Åé’gIŠÔIŠÓ$Åi’â4IQº&e“†Ë/¦Æ·xïk˜îõ0m“ 8§«4®ç¯Cÿ·ÅñÍÅ•óeŸÝu ù
+NS§©‚Ô©‚Òµ
+NS§©‚ÓTAêTÁiªàt©‚³TAêTÁiªà4Upš*(]«°Ñí'¾\¨»§¾½=Uáq¥ä;ð=fõµ}\œØý|\²¸žÞS ê¼ç–잧Ú<ƒóTV—Í—ÔÙ|IÍ—ÔÙ|IÍ—ÕóæKâl¾¤Nf¥Nf­.™ušÌJÌJÌZ]2+u2+u2+u2+uɬÅ%³R'³R'³R'³V—Ì:Mf¥Nf¥Nf¥Nf­.™•:™•zά´É¬Õ%³R'³R'³R'³N“Ù­ž
+ØÿÒe.ݵ?l/ä*—¾y¾ºeqiþÚÜ©§/¾}ï
+˜Íï÷±s秣 `º¡=].—Çc¾
+K”MŒeþËô7–Ùol&¿¢™ûÆ2õeæËÄW6ó^Ø:íeÖˤ7–9¯l¦¼±ÌxcË„7’ù®l¦»±Ìvc™ìÆ2×…­S}5™?Ì­Ks+š®›Þ+—ç©þ|ƒý|ùÖâC–ç—sWNvzÀ×yM·±YÜknwå¿~ØG+§™öRgÞ+]'¾ÓÌ|§™úRgî;ÍäwšÙï4Óßé̉S
+3cfÄ*Ì„U8ÖÙÌW…¯
+3]f¸:œÙjp­
+3Yf°*Ì\u8cUa¦ªÂe¨*ÊLu8#Ua&ªÂ T…™§×qº‰æcILÓqî\»·kîÕWà–-oö8·§ã¯×ÜÍß÷¿6`ó›s1G‹ðõó8Z„;Í"\ê,•®‹p§©ƒÓäAêôÁiá4…pšD8FHœH8M%œ&NÓ ©
+¥k)œ&NÓ
+§‰…Ô©…ÓäÂéÒ g †Ô)†Ó$Ãišá4ÑPºVc3ú?v®xÊƹ=]¯oWáó¥Ú¬ÂŸ¿Œèrιµq=£½þMÎhK3ÚNsFÛiÎh;Ím§9£-u9£í0Iuš¤:MR¥NR•®Iuš¤:MR¥NR&©N“T§IªÓIªÄIªÓ$Õi’ê4I•:IUº&Õi’ê4Iuš¤J¤:MR.Iu–¤J¤:MR&©N“T¥kR7Yü0ß[Ÿ¤¶÷ñÍ×öo“z[ìÄžÎK››6 ­>ͽڠ½ïr©ÊæTEêTEêTÅêR§©ŠÔ©ŠÔ©ŠÕ¥*R§*R§*R§*R—ªX\ª"uª"uª"uªbu©ŠÓTEêTEêTEêTÅêR©S©çªH›ªX]ª"uª"uª"uªâ4UÙ–áÛ'Ζ´×qØíœ.¹ìTe{ƒ ×§G¦£tO[qwÀrâdœ½›[ÌÇ¿ÏŸ¼âg}ßý^Ú:9×Oïhr:ÍätšÉé4“ÓéLN‰39fr:ÍätšÉ)u&§Òur:ÍätšÉé4“SêLN§™œN—Éé,“SêLN§™œN39fr*]'çfú}jrÃéÞ¼]ýÞzœi¹þ>ï·ótÿ$ô_ûºŽîÊ-åÞÏ_NX¯OgÏßÞÖo3ß}ó®ÿ°ŽÞ¼Nóæuš7¯Ó¼y¥Î›×iÞ¼N—7¯³¼y¥Î›×iÞ¼Nóæuš7¯ÒõÍ»y~êÍ{ßåýñénçÍûÉ|ðY®ÍoyðY.©sä[êù¶ºù–:G¾¥Î‘o©sä[êù¶º£p˜cNsŒÂiŽQHcJ×cNsŒÂiVÚRg¥í4+m§Yi;ÍJÛ鬴%ÎJÛiVÚN³Òvš•¶Ô‰µÒ5ÖNk§‰µÓÄZêÄÚibít‰µ³ÄZêÄÚibí4±všX+]c½ î7sgbÝw§óùíJ»ÿ±·ÒnŸ/µÜ¬b_æ|? ëtP§ ¨ÓÔiê4•ºÔaê4uš€J€*]ê4uš€J€:M@& NP§P‰P§ ¨ÓÔi*uªt ¨ÓÔiê4•:uš€:]ê,•:uš€:M@& J×€n"ømޥʀvÍiìÚûÎͬþ}˜Úý(•œ?Ùöóq²·üúqéùΘCû8~µ.0|XêóAˆÅéçݬŸÃQ¤N”®pš8M¤Nœ&N§‰€Ó‰€Ä‰€ÓDÀi"à4:PºFÀi"à4pšH8Mœ.p–H8Mœ&N¥k6ƒüÛg®jî§ó½Û‹Àô ê¡y|€z>Ì_OÛ²QÚ½ËÕæ÷:¸Ë•ÓõȨÓušÔÙØ9ÍÆÎi6vN³±sšÔecç0;§iºÓ4]ê4]éÚt§iºÓ4]ê4Ýišî4Mwš¦;¦Kœ¦;MÓ¦éNÓt©Ót¥kÓ¦éNÓt§iºÔiºÓ4ÝéÒtgiºÔiºÓ4Ýišî4MWº6}­§¯Ž?¾ËM_iM·»±›>ð>¼98Z·^çí%
+N¥k^ öw—þñ³m¿ÜO÷¡ú/þ³þ¬ëýÔ]¿Üî§ËâvÿSîíeq“…añÍ7ÓJòÍçj/çþÔ÷·íϻԋiþøÙ\^=ŒvþÆ7Àé~]]°˜´?þüí
endstream
endobj
2598 0 obj
<< /Type /Page /Contents 2599 0 R /Resources 2597 0 R /MediaBox [ 0 0 595.276 841.89 ] /Parent 2486 0 R /Annots 2601 0 R >>
endobj
2601 0 obj
-[ 2538 0 R 2553 0 R 2554 0 R 2555 0 R 2556 0 R 2557 0 R 2558 0 R 2559 0 R 2560 0 R 2561 0 R 2562 0 R 2563 0 R 2564 0 R 2565 0 R 2566 0 R 2567 0 R 2568 0 R 2569 0 R 2570 0 R 2571 0 R 2572 0 R 2573 0 R 2574 0 R 2575 0 R 2576 0 R 2577 0 R 2578 0 R 2579 0 R 2580 0 R 2581 0 R 2582 0 R 2583 0 R 2584 0 R 2585 0 R 2586 0 R 2587 0 R 2588 0 R 2589 0 R 2590 0 R 2591 0 R 2592 0 R 2593 0 R 2594 0 R 2595 0 R 2596 0 R ]
+[ 2529 0 R 2530 0 R 2546 0 R 2547 0 R 2548 0 R 2549 0 R 2550 0 R 2551 0 R 2552 0 R 2553 0 R 2554 0 R 2555 0 R 2556 0 R 2557 0 R 2558 0 R 2559 0 R 2560 0 R 2561 0 R 2562 0 R 2563 0 R 2564 0 R 2565 0 R 2566 0 R 2567 0 R 2568 0 R 2569 0 R 2570 0 R 2571 0 R 2572 0 R 2573 0 R 2574 0 R 2575 0 R 2576 0 R 2577 0 R 2578 0 R 2579 0 R 2580 0 R 2581 0 R 2582 0 R 2583 0 R 2584 0 R 2585 0 R 2586 0 R 2587 0 R 2588 0 R 2589 0 R 2590 0 R 2591 0 R 2592 0 R 2593 0 R 2594 0 R 2595 0 R 2596 0 R ]
endobj
-2538 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 78.374 759.955 197.477 769.031 ]/A << /S /GoTo /D (section.0.4) >> >>
+2529 0 obj
+<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 78.374 758.062 199.908 769.031 ]/A << /S /GoTo /D (section.0.2) >> >>
+endobj
+2530 0 obj
+<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 103.28 746.057 217.99 757.016 ]/A << /S /GoTo /D (subsection.0.2.1) >> >>
+endobj
+2546 0 obj
+<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 103.28 734.222 260.909 745.061 ]/A << /S /GoTo /D (subsection.0.2.2) >> >>
+endobj
+2547 0 obj
+<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 103.28 721.708 282.11 733.664 ]/A << /S /GoTo /D (subsection.0.2.3) >> >>
+endobj
+2548 0 obj
+<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 78.374 702.172 177.731 711.218 ]/A << /S /GoTo /D (section.0.3) >> >>
+endobj
+2549 0 obj
+<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 103.28 687.835 257.353 699.791 ]/A << /S /GoTo /D (subsection.0.3.1) >> >>
+endobj
+2550 0 obj
+<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 103.28 676.329 172.561 687.278 ]/A << /S /GoTo /D (subsection.0.3.2) >> >>
+endobj
+2551 0 obj
+<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 103.28 666.197 258.917 675.432 ]/A << /S /GoTo /D (subsection.0.3.3) >> >>
+endobj
+2552 0 obj
+<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 78.374 644.388 197.477 653.464 ]/A << /S /GoTo /D (section.0.4) >> >>
endobj
2553 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 103.28 746.057 252.591 757.126 ]/A << /S /GoTo /D (subsection.0.4.1) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 103.28 630.491 252.591 641.559 ]/A << /S /GoTo /D (subsection.0.4.1) >> >>
endobj
2554 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 103.28 734.222 269.318 745.061 ]/A << /S /GoTo /D (subsection.0.4.2) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 103.28 618.655 269.318 629.494 ]/A << /S /GoTo /D (subsection.0.4.2) >> >>
endobj
2555 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 116.232 723.98 256.257 733.106 ]/A << /S /GoTo /D (subsubsection.0.4.2.1) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 116.232 608.413 256.257 617.539 ]/A << /S /GoTo /D (subsubsection.0.4.2.1) >> >>
endobj
2556 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 116.232 710.202 267.465 721.151 ]/A << /S /GoTo /D (subsubsection.0.4.2.2) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 116.232 594.635 267.465 605.584 ]/A << /S /GoTo /D (subsubsection.0.4.2.2) >> >>
endobj
2557 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 116.232 698.356 287.5 709.195 ]/A << /S /GoTo /D (subsubsection.0.4.2.3) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 116.232 582.789 287.5 593.629 ]/A << /S /GoTo /D (subsubsection.0.4.2.3) >> >>
endobj
2558 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 103.28 688.114 260.89 697.24 ]/A << /S /GoTo /D (subsection.0.4.3) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 103.28 572.548 260.89 581.674 ]/A << /S /GoTo /D (subsection.0.4.3) >> >>
endobj
2559 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 116.232 673.888 356.78 685.843 ]/A << /S /GoTo /D (subsubsection.0.4.3.1) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 116.232 558.321 356.78 570.276 ]/A << /S /GoTo /D (subsubsection.0.4.3.1) >> >>
endobj
2560 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 116.232 661.933 423.071 673.888 ]/A << /S /GoTo /D (subsubsection.0.4.3.2) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 116.232 546.366 423.071 558.321 ]/A << /S /GoTo /D (subsubsection.0.4.3.2) >> >>
endobj
2561 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 116.232 649.977 434.598 661.933 ]/A << /S /GoTo /D (subsubsection.0.4.3.3) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 116.232 534.411 434.598 546.366 ]/A << /S /GoTo /D (subsubsection.0.4.3.3) >> >>
endobj
2562 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 103.28 638.461 249.98 649.42 ]/A << /S /GoTo /D (subsection.0.4.4) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 103.28 522.894 249.98 533.853 ]/A << /S /GoTo /D (subsection.0.4.4) >> >>
endobj
2563 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 116.232 626.505 202.349 637.464 ]/A << /S /GoTo /D (subsubsection.0.4.4.1) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 116.232 510.939 202.349 521.898 ]/A << /S /GoTo /D (subsubsection.0.4.4.1) >> >>
endobj
2564 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 116.232 616.493 200.416 625.509 ]/A << /S /GoTo /D (subsubsection.0.4.4.2) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 116.232 500.926 200.416 509.943 ]/A << /S /GoTo /D (subsubsection.0.4.4.2) >> >>
endobj
2565 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 103.28 602.715 298.12 613.664 ]/A << /S /GoTo /D (subsection.0.4.5) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 103.28 487.148 298.12 498.097 ]/A << /S /GoTo /D (subsection.0.4.5) >> >>
endobj
2566 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 103.28 592.473 179.455 601.599 ]/A << /S /GoTo /D (subsection.0.4.6) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 103.28 476.906 179.455 486.032 ]/A << /S /GoTo /D (subsection.0.4.6) >> >>
endobj
2567 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 78.374 568.842 153.283 579.681 ]/A << /S /GoTo /D (section.0.5) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 78.374 453.275 153.283 464.114 ]/A << /S /GoTo /D (section.0.5) >> >>
endobj
2568 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 103.28 556.767 196.72 567.726 ]/A << /S /GoTo /D (subsection.0.5.1) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 103.28 441.2 196.72 452.159 ]/A << /S /GoTo /D (subsection.0.5.1) >> >>
endobj
2569 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 103.28 544.812 285.168 555.88 ]/A << /S /GoTo /D (subsection.0.5.2) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 103.28 429.245 285.168 440.314 ]/A << /S /GoTo /D (subsection.0.5.2) >> >>
endobj
2570 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 103.28 532.857 215.52 543.816 ]/A << /S /GoTo /D (subsection.0.5.3) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 103.28 417.29 215.52 428.249 ]/A << /S /GoTo /D (subsection.0.5.3) >> >>
endobj
2571 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 103.28 520.901 278.842 532.08 ]/A << /S /GoTo /D (subsection.0.5.4) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 103.28 405.335 278.842 416.513 ]/A << /S /GoTo /D (subsection.0.5.4) >> >>
endobj
2572 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 103.28 508.956 207.39 519.905 ]/A << /S /GoTo /D (subsection.0.5.5) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 103.28 393.39 207.39 404.339 ]/A << /S /GoTo /D (subsection.0.5.5) >> >>
endobj
2573 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 78.374 487.148 184.546 497.987 ]/A << /S /GoTo /D (section.0.6) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 78.374 371.581 184.546 382.421 ]/A << /S /GoTo /D (section.0.6) >> >>
endobj
2574 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 103.28 476.906 182.752 486.032 ]/A << /S /GoTo /D (subsection.0.6.1) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 103.28 361.34 182.752 370.466 ]/A << /S /GoTo /D (subsection.0.6.1) >> >>
endobj
2575 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 103.28 463.238 281.114 474.187 ]/A << /S /GoTo /D (subsection.0.6.2) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 103.28 347.671 281.114 358.62 ]/A << /S /GoTo /D (subsection.0.6.2) >> >>
endobj
2576 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 116.232 451.163 266.498 462.232 ]/A << /S /GoTo /D (subsubsection.0.6.2.1) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 116.232 335.596 266.498 346.665 ]/A << /S /GoTo /D (subsubsection.0.6.2.1) >> >>
endobj
2577 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 116.232 441.041 308.71 450.276 ]/A << /S /GoTo /D (subsubsection.0.6.2.2) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 116.232 325.474 308.71 334.71 ]/A << /S /GoTo /D (subsubsection.0.6.2.2) >> >>
endobj
2578 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 116.232 429.086 268.292 438.321 ]/A << /S /GoTo /D (subsubsection.0.6.2.3) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 116.232 313.519 268.292 322.755 ]/A << /S /GoTo /D (subsubsection.0.6.2.3) >> >>
endobj
2579 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 116.232 415.417 208.436 426.366 ]/A << /S /GoTo /D (subsubsection.0.6.2.4) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 116.232 299.85 208.436 310.799 ]/A << /S /GoTo /D (subsubsection.0.6.2.4) >> >>
endobj
2580 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 116.232 405.175 258.718 414.411 ]/A << /S /GoTo /D (subsubsection.0.6.2.5) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 116.232 289.609 258.718 298.844 ]/A << /S /GoTo /D (subsubsection.0.6.2.5) >> >>
endobj
2581 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 116.232 393.22 316.441 402.456 ]/A << /S /GoTo /D (subsubsection.0.6.2.6) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 116.232 277.654 316.441 286.889 ]/A << /S /GoTo /D (subsubsection.0.6.2.6) >> >>
endobj
2582 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 116.232 381.265 397.756 390.5 ]/A << /S /GoTo /D (subsubsection.0.6.2.7) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 116.232 265.699 397.756 274.934 ]/A << /S /GoTo /D (subsubsection.0.6.2.7) >> >>
endobj
2583 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 116.232 367.487 194.479 378.436 ]/A << /S /GoTo /D (subsubsection.0.6.2.8) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 116.232 251.92 194.479 262.869 ]/A << /S /GoTo /D (subsubsection.0.6.2.8) >> >>
endobj
2584 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 116.232 355.532 219.345 366.481 ]/A << /S /GoTo /D (subsubsection.0.6.2.9) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 116.232 239.965 219.345 250.914 ]/A << /S /GoTo /D (subsubsection.0.6.2.9) >> >>
endobj
2585 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 116.232 343.566 274.508 354.635 ]/A << /S /GoTo /D (subsubsection.0.6.2.10) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 116.232 228 274.508 239.068 ]/A << /S /GoTo /D (subsubsection.0.6.2.10) >> >>
endobj
2586 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 116.232 331.621 185.562 342.68 ]/A << /S /GoTo /D (subsubsection.0.6.2.11) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 116.232 216.055 185.562 227.113 ]/A << /S /GoTo /D (subsubsection.0.6.2.11) >> >>
endobj
2587 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 116.232 319.656 300.033 330.725 ]/A << /S /GoTo /D (subsubsection.0.6.2.12) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 116.232 204.09 300.033 215.158 ]/A << /S /GoTo /D (subsubsection.0.6.2.12) >> >>
endobj
2588 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 103.28 307.821 286.653 318.769 ]/A << /S /GoTo /D (subsection.0.6.3) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 103.28 192.254 286.653 203.203 ]/A << /S /GoTo /D (subsection.0.6.3) >> >>
endobj
2589 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 116.232 295.746 311.739 306.814 ]/A << /S /GoTo /D (subsubsection.0.6.3.1) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 116.232 180.179 311.739 191.248 ]/A << /S /GoTo /D (subsubsection.0.6.3.1) >> >>
endobj
2590 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 116.232 283.801 231.968 294.859 ]/A << /S /GoTo /D (subsubsection.0.6.3.2) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 116.232 168.234 231.968 179.293 ]/A << /S /GoTo /D (subsubsection.0.6.3.2) >> >>
endobj
2591 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 116.232 273.669 227.246 282.904 ]/A << /S /GoTo /D (subsubsection.0.6.3.3) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 116.232 158.102 227.246 167.337 ]/A << /S /GoTo /D (subsubsection.0.6.3.3) >> >>
endobj
2592 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 116.232 261.713 233.353 270.949 ]/A << /S /GoTo /D (subsubsection.0.6.3.4) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 116.232 146.147 233.353 155.382 ]/A << /S /GoTo /D (subsubsection.0.6.3.4) >> >>
endobj
2593 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 116.232 247.925 432.127 258.994 ]/A << /S /GoTo /D (subsubsection.0.6.3.5) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 116.232 132.359 432.127 143.427 ]/A << /S /GoTo /D (subsubsection.0.6.3.5) >> >>
endobj
2594 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 116.232 235.97 350.832 247.038 ]/A << /S /GoTo /D (subsubsection.0.6.3.6) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 116.232 120.403 350.832 131.472 ]/A << /S /GoTo /D (subsubsection.0.6.3.6) >> >>
endobj
2595 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 116.232 225.848 276.381 235.083 ]/A << /S /GoTo /D (subsubsection.0.6.3.7) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 116.232 110.281 276.381 119.517 ]/A << /S /GoTo /D (subsubsection.0.6.3.7) >> >>
endobj
2596 0 obj
-<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 78.374 202.157 142.892 212.976 ]/A << /S /GoTo /D (section.0.7) >> >>
+<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 78.374 86.59 142.892 97.41 ]/A << /S /GoTo /D (section.0.7) >> >>
endobj
2600 0 obj
<< /D [ 2598 0 R /XYZ 78.37 808.885 null ] >>
@@ -8788,38 +8808,43 @@ endobj
<< /Type /Font /Subtype /CIDFontType0 /BaseFont /GJKKSV+LMMono9-Regular /FontDescriptor 2634 0 R /W 2633 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >>
endobj
2639 0 obj
-[ 35 [ 580 ] 47 [ 624 ] 50 [ 558 ] 55 [ 536 ] 59 [ 641 ] 72 [ 513 ] 77 [ 613 ] 81 [ 636 ] 84 [ 558 ] 96 [ 602 ] 116 [ 613 ] ]
+[ 35 [ 580 ] 47 [ 624 ] 50 [ 558 ] 55 [ 536 ] 59 [ 641 ] 72 [ 513 ] 77 [ 613 ] 81 [ 636 ] 84 [ 558 ] 96 [ 602 ] 98 [ 458 ] 112 [ 613 ] 116 [ 613 ] ]
endobj
2641 0 obj
<< /Filter /FlateDecode /Length 23 >>
stream
-xÚc````T`hñ`h`à
+xÚc````T`hñ`XÀÐ
endstream
endobj
2642 0 obj
-<< /Subtype /CIDFontType0C /Filter /FlateDecode /Length 1648 >>
+<< /Subtype /CIDFontType0C /Filter /FlateDecode /Length 1946 >>
stream
-xÚ}UP×ßåîvY¦w²»Ê„*%±©UC%@¥V&Õæä–»“ã÷îP”ƒx·wË!¹ T<]üg*Ö’Vm†13US”gÚ40“´3éŒÆ™&ßšÇtºçÑv’fúvçÛ7ï{¿ï÷û~oŽiµŽãÙ5Û^®,Ù¶¢jÓf¾Éê.µ6{~P˜¿™³û\V!± LY¦,õ´²S²q…NQÂjQ®^3¦×ÎùÑ奺¾šÑec~nQ"Þ\ ôËÕ?²XŸ“˜˜ÐKMÁp,[Ž=Ä œÂ¿‹Óxîÿƒ.*(,|¦”onœv‡—-*,|ze"®f×°•ÖúF¾ÅÓèd­nÀn*`«ùuÖÉ>ŻٜÃêj`ù¶–ÛÆú<œàaíïköä°µ§‡má…FVý
-œ‹³z8ësÛ8õ:8ö…Ÿl©eËx·—­rÖsnÇæ糬‡ãX‡×Ûüc‹Åë³ð‚ÝÒ ®ñX\ÉEK"/¿ì¥êÚüªŠÒÕ[6x[½l/°6Îkuº<ßJôk“Õ¼Ðdu•Øø\…s{Þ6LOb¬{[ƒ•c›°¬{ójTAÕ¡Çô iµXö ¾¿‘âHӬф4ŸktupÞ Üex=v‡´ßCÏŸ4Ê(ÐÆ÷_œx&Fÿaèúø{¦›o!œFo Äd¤{'3G;{ºËi&HÐLÝžbr l´ï^ÿ$´°–‹Hè¿ZçaFPظc× …táè‘Æx¾OÎœ,¶2†GZQþµ¬,UqÜëÑ(SÐg:¡œoC{›„e_@*d3?ÊZÝnÝÓHû^µÎb~.¹µb #ß#f/ÿ¬m‰óqk®É L¨üZe°É™—§Åé©éAù LÝïT‰n5
-JÍó
-ZbFØ|›¦È»oµ”32¼"åûZJè°:Ië!AýƒÔQÂcŒL´Â:Ý\Í¿+ÕÌWªl')¬Ó œW‘݉÷12¬”¿”—ÌPŸ+~øÌø8³ì›™ªž,:¨“IêþóíâUÖN’wc{*’µTtî)¡Ë¡4YËg¤œnDÚ¨ª¥±C†b®È™×fáòìöijƒò7¨4Êd`W}p·Ù^#JF!?ìí¬gšHjÜ+zê½ô^ŸÓï6W£œóàVœ¼òÁÇ?EÔQÆuGÍÔ?ÄÈQÖ‘Ãbÿþî``mÛ¦»Ô°5^kFy( ¥¡|”‹‘
-/ÜL\d:Þ<㊙ßû‡Б{û~K”¨(+ó  î(Me_Óµ¿±æªùî‘äÕ!ñ´L"•?5ƒ4’N ¿î
+xÚ}V p×]Y–V!À‹h¢Å»‹C˜cËuBR
+ŒÁØÄvO
+A¶ä–%y%ÿâ2’…¥ÕGÂŒ,óñ4˜RÓ‚“2¤S>5¸ Ó–Ïä3“f Ì4¹Kž§ÓrÛIšéÛ»;wî}÷ÜóÎy,1“H$)Ù¯o,.Ü–VP¸Õ\£3åè,Ög¦o5TÔul, WX,¤rJJX„ )Jh©À$¢¥Jéˆ2qÚ‰.,’Ýûö¾,Ã$§çÆìø|˜¥Lÿ^å’˜ãwÊg1E&ÁR°Tì‘D.!$OK(ÉÒÿW:+#3óų¥‰­ª¨´1Y™™/,Ù•Ìú f³®¬ÚÜ`­®bt&=³9ƒ)Ì`ŠÌ ¢·ŠyÎlbJ •:c9c.gŠ o0uVke*Xsź,ƒ)®¬²2 f¶š¿¬ÁhÐY z¦Î¤7°Œ­ÒÀlÚ¾­˜É5›lLAU™Ád50éé c5˜J›ÍòS­ÖVW‘af+´åbŒUkŒYµ±¼ôÜ׊ŠÓ òs6mÛ˜ak´1åf–Ñlº*£5ãýŽ³ÈÌÖèŒÙzs©!_o0ÙªlM˜¸žÁ´Xö2¶
+ËÃ
+±-X1¶+Å,˜M*’*.¦ŠÑ›ˆµbŸHvI®%T&ŒHWI½Ò¯»eÕ²{òÃpF%ÜåxhŽB/¤?€ë/Rá8Pꛯ^y1Bý±÷êèšëo …βòñ`G)=-ÇK]y WpNÜš —€O]Q»þ
+%ÂjùHÐ?Lý]þYï+=€|ê]{6eRËä•.ÿ ¯ÃóøýÁµ:Zõ8‘ãÍ ‹Äº³nÃÕ¿I… ©ZsÑ’ªv‡Å_ƒRèŸ,\Ù¢«¯¦êšw—hÉWâ[ *üIå»ò© ?oê¡£æ¨n©F%\ûkäAÏ'_˜ä&'&{xó<ñÀ.6ºCÍÊÑœ·­o¢$Âf0Nàw6äÑ<¼ÉÊóö6dSae¼­Grâ] Ç+‘$BóòFX#›Þòo¤Ò¤ÂNœÀì*áŒXÙ{ŸT†åü7ü‚ûÄW‚¾P?ÉÌý~¦È§ævÊxœx°®…»LÃêqüN¤>?Ž%ß^ŸMåANËrH8YÃ"—êVÖòp‰O›‚ S;'‰ Âç°YÍãî=ežZ²b 篤Ùü£€½Œ®Á‰Qg-³QmuUNY„–œ*0CÚà¥?þ"ÓNŸ·#Lÿè悇iXƒ÷q]íw»ƒÒ¿!;_¾#ZL¢eh!JBéhÌG*Ⱦ¼rŽn}gÈ!ßáºziáç¡÷(•æxaæ
+I`K\(·åÌ­-£U±Fmjã3gúP¤ðé-u ·Ù=ûöSEÎ
+“lØ×é }'Ún8†ÛÇÖTLô_ý½f"ë&šC!çÿ€ùÚÿÍ¡¬ÿç{Œ§è#uœõ-Í6®é´‘jêi%oô^ QÜPë]9h!õäÊy_8¤ü¹~òÎýNFĹ«•÷ðÀÃòh7ÿ%ï‹&Aó˜yŒ íB¤ª¯ëÏsTù»Íþ—ꃕ]>EÉ@ó¹!ÍÅ‘Kã@ô£YÕÊéã:"d\À‹fì©k¡\®ö–ýŠ_v,%3ó7­ÙvzÏÁ½ôPÍÀþÏëÛv­WÑuÁýƒ–·4%úí¹µÛû©]×<ƒŠ.ÃÛI¶qÎ&šÈƉv¬™s„C^o´—]Á`¸7Röuµ'ß³Ý$¿¼v÷ÏbKÃõB'/6CšT˜z¢Xw½ÅSOZÌ^ŸE”ìpçúF½Óá²S(}†ž‡i™£Ÿó4ƒg¹Câd¤vÊjKãÁWBÎ==4MÈÚB>g7Ùã õ„Dê…¬Á룾^ïÓÿ™”“½ ²ÙÄ]ᯠyÜdãúéÖn”{ß#HyjøWçz" ÖèaImlòúÜ=Vó¶c¯ÓA­^¼Ô²}¹`@s¨'|Ø+ba:e½×W#bù «C‚
+mE8Òʈ#&Þª|·‚Å}ü÷8yú¢ÛÓ#NVƒÏÞ= 9Ôé‹R§ÎýòôÌF/?pù]ÓÕdvÇU-;6âqŸ¢U±kÆ<T./ ØŠØÅáHr]Tˆô
endstream
endobj
2640 0 obj
-<< /Type /FontDescriptor /FontName /QXPJAX+LMRomanCaps10-Regular /Flags 4 /FontBBox [ -496 -290 1501 1100 ] /Ascent 1100 /CapHeight 683 /Descent -290 /ItalicAngle 0 /StemV 106 /XHeight 514 /FontFile3 2642 0 R /CIDSet 2641 0 R >>
+<< /Type /FontDescriptor /FontName /APETMS+LMRomanCaps10-Regular /Flags 4 /FontBBox [ -496 -290 1501 1100 ] /Ascent 1100 /CapHeight 683 /Descent -290 /ItalicAngle 0 /StemV 106 /XHeight 514 /FontFile3 2642 0 R /CIDSet 2641 0 R >>
endobj
2643 0 obj
-<< /Filter /FlateDecode /Length 419 >>
+<< /Filter /FlateDecode /Length 427 >>
stream
-xÚ’Ñkê0ÆßóWœ=î¡kZŽ!…­NèØœWåâkMŽÞ€MJÚ>øß/ɱŒ!·ÐÒ_ÏwN¾|éàfµ‰ž¤Ùc4ºã°ÆÆtV`”¿—5 æFtêv‰(QöÕæVÖˆ ¶0Ì‹y¡U{ëÄ…§Nb¯ú]ôŒG¥¿%~nqýÙ­^ŸvÑÛûÚT¥Î˺Ix´Æcw*mÄ}ëVµ'×òjp¸&0ð/ÚFýÉçÜ}xÑ27•ßpÃâ‹iˆûm”–öâö~,IA*Ñ^(<Eå’óÍ›sÓbUèƒa³ÄneÕ´öüß²øÃJ´Jaxͨnºº>¡7œeH<¸ù.·eY!Ä>BºªjÏWcùnÜžk„4pBÖ…‘ØÔ¥@[ê#²™‹ƒg0[¸+c¨å:§®ýÐ ú×$éKâ_iý täq>I³@ ¢q QJtO4%š=Mˆr¢9ÑK û„hA44å&œˆVŸ^jyýöü™}E*:k]žá`C^>)¥ñëìkSû®p‡Ÿ¦ÿŸ=},Ø'Ú­L
+xÚ’]k£@†ïýg/é…uÔ4–„Ö$ lÚò·fæ$;gdÔ‹üû™£-”%¬ øxÞóõ:³û*|ú„aúÈà€ Ç°ØÕm0›­5Tý;¢@1E»ØÍ+ìa^”ëRÉþÁŠKůƒÀIõoÑ^¤ú’¸>0?âïðu¿9îªðçî ›ZuÛÅ,<àe¸Ö&d.õ(û«Mù5X Ü“€/ø M'µzø‘1f?l”(tãî‚h¢i³TÂŒ“ÃÉíÄ Éû‘ü“7Ö9—\ݺ›Ru°ZAd;Ë®77?ÿC}Fª Ìï j…ÕжWtC òžm}ëÛ{Ý DÎRبìowmùJ<ÞZ„ÄsL£s-°kkŽ¦V VÖ–Ãjk¯<@%¾Åe΄V0½Æéâjã
+%©-ÄØ2É=m‰žÒ„è‰(#Z½ežÏDÑšhãé)&Ú-<eÌÓ’Q÷%õËROÙ£~Ù˜÷œÓ>~~·ºûŸŸvóÁëµÿéÞKç¢Tøy.Zݺ,û5uGÛà/+ÏV
endstream
endobj
294 0 obj
-<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /QXPJAX+LMRomanCaps10-Regular /DescendantFonts [ 2644 0 R ] /ToUnicode 2643 0 R >>
+<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /APETMS+LMRomanCaps10-Regular /DescendantFonts [ 2644 0 R ] /ToUnicode 2643 0 R >>
endobj
2644 0 obj
-<< /Type /Font /Subtype /CIDFontType0 /BaseFont /QXPJAX+LMRomanCaps10-Regular /FontDescriptor 2640 0 R /W 2639 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >>
+<< /Type /Font /Subtype /CIDFontType0 /BaseFont /APETMS+LMRomanCaps10-Regular /FontDescriptor 2640 0 R /W 2639 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >>
endobj
2645 0 obj
[ 28 [ 500 ] 50 [ 444 ] 52 [ 778 ] 70 [ 528 ] 72 [ 278 ] 109 [ 556 ] 112 [ 528 ] 118 [ 528 ] ]
@@ -9725,50 +9750,48 @@ endobj
<< /Type /Font /Subtype /CIDFontType0 /BaseFont /CKBVSC+LMMono12-Regular /FontDescriptor 2762 0 R /W 2761 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >>
endobj
2767 0 obj
-[ 27 [ 734 490 ] 45 [ 272 ] 54 [ 639 ] 57 [ 490 ] 59 [ 490 ] 66 [ 272 ] 72 [ 272 ] 77 [ 544 ] 83 [ 666 544 ] 88 [ 272 ] 96 [ 381 ] 105 [ 381 490 490 ] 118 [ 517 ] 121 [ 490 ] ]
+[ 27 [ 734 490 ] 45 [ 272 ] 54 [ 639 ] 59 [ 490 ] 66 [ 272 ] 72 [ 272 ] 77 [ 544 ] 82 [ 490 666 544 ] 88 [ 272 ] 96 [ 381 ] 105 [ 381 490 490 ] 118 [ 517 ] 121 [ 490 ] ]
endobj
2769 0 obj
<< /Filter /FlateDecode /Length 24 >>
stream
-xÚc````a
-Ph‘hh(`r
+xÚc````aPh±hh(`r
endstream
endobj
2770 0 obj
-<< /Subtype /CIDFontType0C /Filter /FlateDecode /Length 2381 >>
+<< /Subtype /CIDFontType0C /Filter /FlateDecode /Length 2379 >>
stream
-xÚ}V TåŸe™JÜlÇ­œÑ™±£ÞÔxøÎìŠ.%…ˆ‰˜D¾@–‡À,ìŒMVp|¬,"ÊsÙeawS{˜xÕŒJ"µ4ñRz,¤‹Ouï76œÛÅs¼÷œÛ½sæ|3ç›ïûý¿ßoÎ'ABC‰D2åÕÕªuªsÖ$iòÓØyó#’ÔY†¼4mðã*~:ÿ4§ø©?MÂS!<-å™P!6\ú^xèØóÂᩨö7† ’ÆÇ‚ã§CyøÓâÛ£O†ÏNœ Ÿ‰„… d
-B!w‘J0ÉD‰BBü¯°ó#££Æj
-Šµ9YÙzf~tô‚gƒãRFÉħmÏÕ˜t¹9L›ÁÄG2k"™DIœÍažÑ°Lº:;-/“Ñd2ÉêÆ SkuL–Vc(ÐÍŽd’³stŒI£ÍeħV§NÓ©3›¡Ö2úl5·a}2³JÃꙄœíjV§f""F§V3Ùz}ÁóQQzCV¤F›•)®ÑEå=X¤‹
-î‹Xµ619"á•Ø—׿©/Ò3™-“¡Ö§åäé"ÿ«È‡‰m~ZÞÊ Mºú• 5«ÏÑ#âE"S‘d1²Y†¨—‘5Èz$IA¶!9È$1"ÅR±¥â…#x°¹¡H©$L’ 92)äwiª´!tZh%úº=„ò2¦ÀÞ›)ü.ÜÆñ)&Éý¤'8,¾7Ó{_†´9ªÍ¤ÙaÓJ ê±ÍéšÂÕSXìoN4p8ÚiK«ÔzD5pºê¨p
-
-]²…y¨kp؉ü ¥XÌÙ:dà2p´Ò€ J¡DÃà·¨Üʽe„{Ým׿6)Þþ¦ zñž½­<gX%éÊÌjp¦‚±ØYгµ›êÌÞR¿•\š°!žu›[}MM¾ãY „~§õdsyâcõ<z;&l¶Ç,YNà+^øAûéçï÷œtSx`SÕ¡¬wIO_ý×´°ä´r¶jǶÔô£'áSpùÁ£NJ>† +ŒpèƶHáF›ò¼±;ƒ-2¸  ö¹ª©½{
-b”Ü&öñTð–À©ßÀd/œá|“á·( ¡ó³-²Ë{-™ôX;–i·ÄR&VæôÝä‘[ÀÁÑ\>¶Ðqð( ·°‘ÚKh/l4È–XvDP `­ì°sß{|\gp¯ Óëi¹âxIO~.åÓá2%7‹s—¹Ìv•QÂÙ±,”…ÑX¦Ã¢÷€‡¯ƒ<p&,Ö^{ŒÆ^ᔂMmüDT.¤yà†¿õ@§Gáï-¹c/^KoV/>y¯áç(›Íì¹%fª5?»NMÎ{9nyÒ‘ÌÚÝ4þcé®’b6ƒXwD[c¥6¿µ9k#±j$ >'ütæj[ùÇkQí)¯ƒEdb9pÓ–ÚÝnÑTÝT[Oå}Ðß_¸xÍ_Ö•ÛI÷t
-‹Íj)%̵»kš]^JX.„(‹AúΊ-Ê·Éà^k38Þä§9wG­‡ÄûKoYz"c*_Ù5WÕûQ³»«ª÷î_7
-Ò"í€ãÃ8¶b£Š[£1ýxÜô€ÍÕMó¡þ‘0µe±ÏöïI¥…6lK)ˆêY?G获iü©õü=e‡Î­Ó …^C{‡Ûç£Æ¡ï£"´Júñc°R„]½ ¼OßG0ü’@a/Ö”§ÒcžÃöŠjè8ZþŒÈïa®
-ÿŒÁGþ1tŽ|" 2a %аí¤Gdp1ÐmbÅÂkŒjáI®Ô«øe
-Ÿü~G¯»‹¼úI´:.ŒQÉw£R˜Ð«ôë=ZÖ¤×æ·µú½ž
-†Ó9aº(<Û «ˆÈšm3aø•›Â!™ ýJ¦ÿðùË”Üè¿}7Õ—ùàÄa0¬ó).ÇÝé>uG>Æ(Xyynõ]Û¹+%†–öÍùÓÊD…“+¶*kðø::uõ†=Pa§.vˆV=<P2»È¾žÝFçoͱT„á—<ùvtg…­b7aqfê„ìf×Ks…'ã²SßXÚú9Kã Òiåšø™RÎآњÕóo« ”ÂN¸5|OüÉ} (§è¹vŒl¿—ó ð¥AfßY–ly3lwyÈ'…52맟µûÂðßà³9wú'bÑׄ0!,î™E)~ö†Î@‘[³ûAÒî³'È›§_ŒZœº2i5-lŒ¨Ž—`rA!¬6v òëYNá¾
-®Â}Wqoåg)9ÌÁšA.ù¼S$õ˜c¿¾˜Øí°Ú,ÔLÁ…â3)lC÷Ôƒ}€À“Û€JÜP˜
-4äœà†¾k^ g…l¶²)ù; Ô[ȼ¢f@ƒ#UG_Q]1…7ì4ZXõ±Ì3çŽ÷ö·Óp%¿½àÿ ÒMÊñ¾Ê$9>k¥"IW”7¬ßd R7Òc½©äºÙç2iM‚e€sö©Ž¾HÅt_Ò&¿;uº£^uÞí#b*_1¥¢ãCŠŠ²ÉÜøf()¢K?ƒ_×ÁWSšþrè]²«O¿ÈM×%âyðÔ7‰'Ãg‰g7dYð7Waôð± PS[ã‘QñÉyQá€ð ܣܕNWeeuU¥³§!<Üë¯wV»ö:UÕUáù·&ßRù/_›ì
+xÚ}V PGžeÙq“ì¸&Θ™1e¼¨áá;&9Qˆ’
+£yô3j†ÎTæf¨²iu6ªL£õZ¥FKçhÔúBíÜH:57OKÕš|Zxk”*e†V™Eë™,¥†Öå*éøõëRé5jFG'åmS2Z%AÓZ¥’ÎÕé
+ŸŠÒés"Õšœ¨laŽ6Jõ`’6*±æÕäÔˆ¤WâV'¯[©+ÖÑÙj ¥Ôeä©´‘ÿµÉß’Õš‚ Õª,u¦ò•,%£ËÓ• B#™H²y‰E^FÖ")È:$IC¶"yÈv$1 %bR¡a$7)…‰’DÇCŠ%âÕâs¡SCK%a’9’&ɘԆ Î0ÿ/Ù(`áV–K3Šî¥LgÑ„p´Œâ™{RÉ‹­¶Œ(³Yß2S¼ròû²LuQbÕ ýÁ. ¶vŠE3ª5î
+4 £Š‚Ièè:Éfcm1Oùœ±‚ªúIŠM<Hø>2ïû ¹ý´P+ìéÕu? ˜Œþ2töüùÆ´d’ßùGe7½ì£ª‡Ä\ätV….²
+^âΡ^Pm$ µ²g ê=ÚÏP“N4Ǻs© èŸ
+ÚŠ½~;@Êø&™‹½Î Â?XF:G°iðï¦è( l]ÊDï&« XŠ±<þGŠÎ^ñ<ýX«4J±„XÛ~¡Ò ½£×êì ª†¬°¼µ»g¼åÍ­­ þàš&‡³0É(ÿiPï3=Ø/p>ªøHŸŠÆ1Yñ`¬…„]pËÏ<†åê¥U9ó£­aF»r“?(åÅ_èN t¿LÊ þÛwÒýðœ:
+Fµ>ù¥Ñø±ŽÑc˜áRaŒâ»U—ç·ß´½ò7|dyÿ¼?­JŽ%1b嶃Mn_SG§¶Q¿Ûª¬ä¥îq¡Þ»Kç[×1[©‚-yÖª0lÈ]`•ì¨²TíÂMà$Iov¯žÏ?Ÿ›þ—åÞO
+£‘N3ë<Œc§ÊYC«Z[T¦\x;ŠIŒ¦á”[£w‡VÞ7~íßv«ä’à‹
+½Ôº£"ÕôVØ®ÊP@ðk¥~ï¹ í¾0ìWø,¤Ïžü‡hô5>Œ‹fIÚû`»½©3PìRïz´ëô±AâæÉ—¢–¦¯JI¤øͼA¢åD¨Œ—ó‰†îaîõa†•»®‚«pïULΙ¹9
+µ1e ŸxÞ.ˆzĶOW‚ï²™-&òiÞ!ÁfóbØ&ÙÝöKm?ZI! (¨‰yÁ€þ:³ª‚s'C¶Ì6KÅŒ‚…ÊÍ„ªØ (p¨æî+n(!±¦£<’}êìѾv
+®âVH.ú?¬v2`¸k†uÃbA¤+Šæ¯r†É™qžtâõ—˜ç²)u’i-àóöÆ~‰ŒéÒž$¾9q²Ÿ¥_µßéÇc(^1å±RœTœKä'8¡¨˜*ÿ †__4L^lùëÁ÷ˆî~ÝÕ^ŒÇeÁ[Þ£>G¸«!/ïm„Üàæâš º¾Î-%RUQáð)ìÃS\ÕvGuumMµ½·)<Üão´×:öØí5µ5áS¹·§Ý{\ñoŠA’Z
endstream
endobj
2768 0 obj
-<< /Type /FontDescriptor /FontName /PKBQBW+LMRoman12-Regular /Flags 4 /FontBBox [ -422 -280 1394 1127 ] /Ascent 1127 /CapHeight 683 /Descent -280 /ItalicAngle 0 /StemV 91 /XHeight 431 /FontFile3 2770 0 R /CIDSet 2769 0 R >>
+<< /Type /FontDescriptor /FontName /KKGPYG+LMRoman12-Regular /Flags 4 /FontBBox [ -422 -280 1394 1127 ] /Ascent 1127 /CapHeight 683 /Descent -280 /ItalicAngle 0 /StemV 91 /XHeight 431 /FontFile3 2770 0 R /CIDSet 2769 0 R >>
endobj
2771 0 obj
-<< /Filter /FlateDecode /Length 454 >>
+<< /Filter /FlateDecode /Length 452 >>
stream
-xÚ…“Mo£0†ïþÞC¤ô@1…¶ŠÒJ¨Û6›D»½{’Z
-62pÈ¿¯íVZm´‘ˆx˜wf^ÆÃìÇz<½‡ ¹ft ‡ |©[2›­4Pý+€
-œŠŸ‚ Û†¯ãƒ1ö´üÊøqg!|mU«[—å/¿ŽÓ×áèí‰|æð`
+xÚ…“Kkë0…÷úê".\ËØm †Öi‹é+$¡ô.i’+ˆ%#Û‹üûJš¸…rà 8øóœ3:É“‹å:¸z ArÅè
+:=AùZ·d2Yh>4 ú7
+ØÙÞvNou4t¨„­Êþxv?¦Í±{Ž02׺¶æ`jµ2·c`?Ú_A@‰_u†®íÑ
+ÆÛèz,ñ¿µq¢{Ûˆ±4*<•ž2¤xá).=%*3$ôe¹§4FºAºFB_Š]²O3T&¸Â,ñ4cH©§üDØ%F_Æ°#Ý ¥HwØ3AÂd *sLc²} +p*~
+n€î4|oŒ±»åŒß·RÁ÷©juë\þòÇqü:½?’/0«v
endstream
endobj
236 0 obj
-<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /PKBQBW+LMRoman12-Regular /DescendantFonts [ 2772 0 R ] /ToUnicode 2771 0 R >>
+<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /KKGPYG+LMRoman12-Regular /DescendantFonts [ 2772 0 R ] /ToUnicode 2771 0 R >>
endobj
2772 0 obj
-<< /Type /Font /Subtype /CIDFontType0 /BaseFont /PKBQBW+LMRoman12-Regular /FontDescriptor 2768 0 R /W 2767 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >>
+<< /Type /Font /Subtype /CIDFontType0 /BaseFont /KKGPYG+LMRoman12-Regular /FontDescriptor 2768 0 R /W 2767 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >>
endobj
2773 0 obj
[500 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1000 ]
@@ -10159,7 +10182,7 @@ endobj
<< /Type /Pages /Parent 2800 0 R /Count 10 /Kids [ 1936 0 R 1985 0 R 2020 0 R 2066 0 R 2124 0 R 2184 0 R 2248 0 R 2295 0 R 2348 0 R 2400 0 R ] >>
endobj
2486 0 obj
-<< /Type /Pages /Parent 2800 0 R /Count 4 /Kids [ 2438 0 R 2488 0 R 2540 0 R 2598 0 R ] >>
+<< /Type /Pages /Parent 2800 0 R /Count 4 /Kids [ 2438 0 R 2488 0 R 2532 0 R 2598 0 R ] >>
endobj
2800 0 obj
<< /Type /Pages /Count 64 /Kids [ 261 0 R 356 0 R 477 0 R 968 0 R 1515 0 R 1983 0 R 2486 0 R ] >>
@@ -10516,10 +10539,10 @@ endobj
<< /Names [ (page.12) 361 0 R (page.13) 369 0 R (page.14) 374 0 R (page.15) 382 0 R (page.16) 397 0 R (page.17) 408 0 R (page.18) 415 0 R (page.19) 419 0 R (page.2) 269 0 R (page.20) 427 0 R (page.21) 436 0 R (page.22) 481 0 R (page.23) 537 0 R (page.24) 569 0 R (page.25) 601 0 R (page.26) 638 0 R (page.27) 691 0 R (page.28) 746 0 R (page.29) 803 0 R (page.3) 279 0 R (page.30) 857 0 R (page.31) 920 0 R (page.32) 972 0 R (page.33) 1031 0 R (page.34) 1092 0 R (page.35) 1149 0 R (page.36) 1205 0 R (page.37) 1252 0 R (page.38) 1316 0 R (page.39) 1375 0 R (page.4) 293 0 R (page.40) 1414 0 R ] /Limits [ (page.12) (page.40) ] >>
endobj
2863 0 obj
-<< /Names [ (page.41) 1472 0 R (page.42) 1520 0 R (page.43) 1549 0 R (page.44) 1579 0 R (page.45) 1627 0 R (page.46) 1676 0 R (page.47) 1708 0 R (page.48) 1765 0 R (page.49) 1829 0 R (page.5) 307 0 R (page.50) 1873 0 R (page.51) 1938 0 R (page.52) 1987 0 R (page.53) 2022 0 R (page.54) 2068 0 R (page.55) 2126 0 R (page.56) 2186 0 R (page.57) 2250 0 R (page.58) 2297 0 R (page.59) 2350 0 R (page.6) 318 0 R (page.60) 2402 0 R (page.61) 2440 0 R (page.62) 2490 0 R (page.63) 2542 0 R (page.64) 2600 0 R (page.7) 323 0 R (page.8) 332 0 R (page.9) 338 0 R (section*.10) 2033 0 R (section*.11) 2035 0 R (section*.12) 2145 0 R ] /Limits [ (page.41) (section*.12) ] >>
+<< /Names [ (page.41) 1472 0 R (page.42) 1520 0 R (page.43) 1549 0 R (page.44) 1579 0 R (page.45) 1627 0 R (page.46) 1676 0 R (page.47) 1708 0 R (page.48) 1765 0 R (page.49) 1829 0 R (page.5) 307 0 R (page.50) 1873 0 R (page.51) 1938 0 R (page.52) 1987 0 R (page.53) 2022 0 R (page.54) 2068 0 R (page.55) 2126 0 R (page.56) 2186 0 R (page.57) 2250 0 R (page.58) 2297 0 R (page.59) 2350 0 R (page.6) 318 0 R (page.60) 2402 0 R (page.61) 2440 0 R (page.62) 2490 0 R (page.63) 2534 0 R (page.64) 2600 0 R (page.7) 323 0 R (page.8) 332 0 R (page.9) 338 0 R (section*.10) 2033 0 R (section*.11) 2035 0 R (section*.12) 2145 0 R ] /Limits [ (page.41) (section*.12) ] >>
endobj
2864 0 obj
-<< /Names [ (section*.13) 2148 0 R (section*.14) 2217 0 R (section*.15) 2279 0 R (section*.16) 2298 0 R (section*.17) 2305 0 R (section*.18) 2307 0 R (section*.19) 2526 0 R (section*.2) 1555 0 R (section*.20) 2527 0 R (section*.21) 2528 0 R (section*.22) 2543 0 R (section*.23) 2544 0 R (section*.24) 2545 0 R (section*.25) 2546 0 R (section*.26) 2547 0 R (section*.27) 2548 0 R (section*.28) 2549 0 R (section*.29) 2550 0 R (section*.3) 1684 0 R (section*.30) 2551 0 R (section*.4) 1750 0 R (section*.5) 1859 0 R (section*.6) 1889 0 R (section*.7) 1957 0 R (section*.8) 1972 0 R (section*.9) 2023 0 R (section.0.1) 5 0 R (section.0.2) 9 0 R (section.0.3) 25 0 R (section.0.4) 41 0 R (section.0.5) 101 0 R (section.0.6) 125 0 R ] /Limits [ (section*.13) (section.0.6) ] >>
+<< /Names [ (section*.13) 2148 0 R (section*.14) 2217 0 R (section*.15) 2279 0 R (section*.16) 2298 0 R (section*.17) 2305 0 R (section*.18) 2307 0 R (section*.19) 2526 0 R (section*.2) 1555 0 R (section*.20) 2527 0 R (section*.21) 2535 0 R (section*.22) 2536 0 R (section*.23) 2537 0 R (section*.24) 2538 0 R (section*.25) 2539 0 R (section*.26) 2540 0 R (section*.27) 2541 0 R (section*.28) 2542 0 R (section*.29) 2543 0 R (section*.3) 1684 0 R (section*.30) 2544 0 R (section*.4) 1750 0 R (section*.5) 1859 0 R (section*.6) 1889 0 R (section*.7) 1957 0 R (section*.8) 1972 0 R (section*.9) 2023 0 R (section.0.1) 5 0 R (section.0.2) 9 0 R (section.0.3) 25 0 R (section.0.4) 41 0 R (section.0.5) 101 0 R (section.0.6) 125 0 R ] /Limits [ (section*.13) (section.0.6) ] >>
endobj
2865 0 obj
<< /Names [ (section.0.7) 217 0 R (subsection.0.2.1) 13 0 R (subsection.0.2.2) 17 0 R (subsection.0.2.3) 21 0 R (subsection.0.3.1) 29 0 R (subsection.0.3.2) 33 0 R (subsection.0.3.3) 37 0 R (subsection.0.4.1) 45 0 R (subsection.0.4.2) 49 0 R (subsection.0.4.3) 65 0 R (subsection.0.4.4) 81 0 R (subsection.0.4.5) 93 0 R (subsection.0.4.6) 97 0 R (subsection.0.5.1) 105 0 R (subsection.0.5.2) 109 0 R (subsection.0.5.3) 113 0 R (subsection.0.5.4) 117 0 R (subsection.0.5.5) 121 0 R (subsection.0.6.1) 129 0 R (subsection.0.6.2) 133 0 R (subsection.0.6.3) 185 0 R (subsubsection.0.4.2.1) 53 0 R (subsubsection.0.4.2.2) 57 0 R (subsubsection.0.4.2.3) 61 0 R (subsubsection.0.4.3.1) 69 0 R (subsubsection.0.4.3.2) 73 0 R (subsubsection.0.4.3.3) 77 0 R (subsubsection.0.4.4.1) 85 0 R (subsubsection.0.4.4.2) 89 0 R (subsubsection.0.6.2.1) 137 0 R (subsubsection.0.6.2.10) 173 0 R (subsubsection.0.6.2.11) 177 0 R ] /Limits [ (section.0.7) (subsubsection.0.6.2.11) ] >>
@@ -10546,2886 +10569,2886 @@ endobj
<< /Type /Catalog /Pages 2800 0 R /Outlines 2801 0 R /Names 2871 0 R /PageMode/UseOutlines /OpenAction 224 0 R >>
endobj
2873 0 obj
-<< /Author(\376\377\000F\000.\000\040\000P\000a\000n\000t\000i\000g\000n\000y\000\040\000,\000\040\000f\000p\000a\000n\000t\000i\000g\000n\000y\000@\000w\000a\000n\000a\000d\000o\000o\000.\000f\000r)/Title(\376\377\000T\000h\000e\000\040\000p\000a\000c\000k\000a\000g\000e\000\040\000p\000i\000t\000o\000n)/Subject()/Creator(LaTeX with hyperref)/Keywords() /Producer (LuaTeX-1.16.0) /CreationDate (D:20230404180353+02'00') /ModDate (D:20230404180353+02'00') /Trapped /False /PTEX.FullBanner (This is LuaHBTeX, Version 1.16.0 (MiKTeX 23.1)) >>
+<< /Author(\376\377\000F\000.\000\040\000P\000a\000n\000t\000i\000g\000n\000y\000\040\000,\000\040\000f\000p\000a\000n\000t\000i\000g\000n\000y\000@\000w\000a\000n\000a\000d\000o\000o\000.\000f\000r)/Title(\376\377\000T\000h\000e\000\040\000p\000a\000c\000k\000a\000g\000e\000\040\000p\000i\000t\000o\000n)/Subject()/Creator(LaTeX with hyperref)/Keywords() /Producer (LuaTeX-1.16.0) /CreationDate (D:20230411101223+02'00') /ModDate (D:20230411101223+02'00') /Trapped /False /PTEX.FullBanner (This is LuaHBTeX, Version 1.16.0 (MiKTeX 23.1)) >>
endobj
xref
0 2874
0000000000 65535 f
-0000364030 00000 n
-0000364075 00000 n
-0000364095 00000 n
+0000364110 00000 n
+0000364155 00000 n
+0000364175 00000 n
0000000020 00000 n
-0000018143 00000 n
-0000601390 00000 n
+0000018148 00000 n
+0000601788 00000 n
0000000067 00000 n
0000000167 00000 n
-0000023116 00000 n
-0000601266 00000 n
+0000023121 00000 n
+0000601664 00000 n
0000000214 00000 n
0000000354 00000 n
-0000023176 00000 n
-0000601192 00000 n
+0000023181 00000 n
+0000601590 00000 n
0000000407 00000 n
0000000559 00000 n
-0000023237 00000 n
-0000601105 00000 n
+0000023242 00000 n
+0000601503 00000 n
0000000612 00000 n
0000000828 00000 n
-0000023298 00000 n
-0000601031 00000 n
+0000023303 00000 n
+0000601429 00000 n
0000000881 00000 n
0000001110 00000 n
-0000028535 00000 n
-0000600905 00000 n
+0000028540 00000 n
+0000601303 00000 n
0000001158 00000 n
0000001264 00000 n
-0000028596 00000 n
-0000600831 00000 n
+0000028601 00000 n
+0000601229 00000 n
0000001317 00000 n
0000001502 00000 n
-0000040513 00000 n
-0000600744 00000 n
+0000040509 00000 n
+0000601142 00000 n
0000001555 00000 n
0000001659 00000 n
-0000044757 00000 n
-0000600670 00000 n
+0000044753 00000 n
+0000601068 00000 n
0000001712 00000 n
0000001912 00000 n
-0000044818 00000 n
-0000600543 00000 n
+0000044814 00000 n
+0000600941 00000 n
0000001960 00000 n
0000002089 00000 n
-0000044879 00000 n
-0000600469 00000 n
+0000044875 00000 n
+0000600867 00000 n
0000002142 00000 n
0000002344 00000 n
-0000052163 00000 n
-0000600345 00000 n
+0000052159 00000 n
+0000600743 00000 n
0000002397 00000 n
0000002605 00000 n
-0000052224 00000 n
-0000600271 00000 n
+0000052220 00000 n
+0000600669 00000 n
0000002663 00000 n
0000002840 00000 n
-0000052285 00000 n
-0000600184 00000 n
+0000052281 00000 n
+0000600582 00000 n
0000002898 00000 n
0000003090 00000 n
-0000055602 00000 n
-0000600110 00000 n
+0000055598 00000 n
+0000600508 00000 n
0000003148 00000 n
0000003370 00000 n
-0000060473 00000 n
-0000599986 00000 n
+0000060423 00000 n
+0000600384 00000 n
0000003423 00000 n
0000003631 00000 n
-0000060533 00000 n
-0000599912 00000 n
+0000060483 00000 n
+0000600310 00000 n
0000003689 00000 n
0000004011 00000 n
-0000060594 00000 n
-0000599825 00000 n
+0000060544 00000 n
+0000600223 00000 n
0000004069 00000 n
0000004445 00000 n
-0000064103 00000 n
-0000599751 00000 n
+0000063970 00000 n
+0000600149 00000 n
0000004503 00000 n
0000004899 00000 n
-0000068061 00000 n
-0000599627 00000 n
+0000068114 00000 n
+0000600025 00000 n
0000004952 00000 n
0000005150 00000 n
-0000068122 00000 n
-0000599553 00000 n
+0000068174 00000 n
+0000599951 00000 n
0000005208 00000 n
0000005327 00000 n
-0000068183 00000 n
-0000599479 00000 n
+0000068235 00000 n
+0000599877 00000 n
0000005385 00000 n
0000005504 00000 n
-0000073600 00000 n
-0000599392 00000 n
+0000073651 00000 n
+0000599790 00000 n
0000005557 00000 n
0000005813 00000 n
-0000073661 00000 n
-0000599318 00000 n
+0000073712 00000 n
+0000599716 00000 n
0000005866 00000 n
0000005972 00000 n
-0000073722 00000 n
-0000599186 00000 n
+0000073773 00000 n
+0000599584 00000 n
0000006021 00000 n
0000006103 00000 n
-0000073784 00000 n
-0000599107 00000 n
+0000073835 00000 n
+0000599505 00000 n
0000006157 00000 n
0000006282 00000 n
-0000077358 00000 n
-0000599014 00000 n
+0000077409 00000 n
+0000599412 00000 n
0000006336 00000 n
0000006560 00000 n
-0000081980 00000 n
-0000598921 00000 n
+0000082031 00000 n
+0000599319 00000 n
0000006614 00000 n
0000006780 00000 n
-0000087539 00000 n
-0000598828 00000 n
+0000087590 00000 n
+0000599226 00000 n
0000006834 00000 n
0000007074 00000 n
-0000090703 00000 n
-0000598749 00000 n
+0000090754 00000 n
+0000599147 00000 n
0000007128 00000 n
0000007271 00000 n
-0000098882 00000 n
-0000598616 00000 n
+0000098933 00000 n
+0000599014 00000 n
0000007320 00000 n
0000007432 00000 n
-0000098944 00000 n
-0000598537 00000 n
+0000098995 00000 n
+0000598935 00000 n
0000007486 00000 n
0000007598 00000 n
-0000102408 00000 n
-0000598404 00000 n
+0000102459 00000 n
+0000598802 00000 n
0000007652 00000 n
0000007884 00000 n
-0000102470 00000 n
-0000598325 00000 n
+0000102521 00000 n
+0000598723 00000 n
0000007943 00000 n
0000008144 00000 n
-0000115339 00000 n
-0000598232 00000 n
+0000115390 00000 n
+0000598630 00000 n
0000008203 00000 n
0000008454 00000 n
-0000133659 00000 n
-0000598139 00000 n
+0000133774 00000 n
+0000598537 00000 n
0000008513 00000 n
0000008725 00000 n
-0000148322 00000 n
-0000598046 00000 n
+0000148437 00000 n
+0000598444 00000 n
0000008784 00000 n
0000008906 00000 n
-0000157517 00000 n
-0000597953 00000 n
+0000157632 00000 n
+0000598351 00000 n
0000008965 00000 n
0000009159 00000 n
-0000158207 00000 n
-0000597860 00000 n
+0000158322 00000 n
+0000598258 00000 n
0000009218 00000 n
0000009481 00000 n
-0000160030 00000 n
-0000597767 00000 n
+0000160145 00000 n
+0000598165 00000 n
0000009540 00000 n
0000009891 00000 n
-0000191128 00000 n
-0000597674 00000 n
+0000191246 00000 n
+0000598072 00000 n
0000009950 00000 n
0000010065 00000 n
-0000202091 00000 n
-0000597581 00000 n
+0000202209 00000 n
+0000597979 00000 n
0000010124 00000 n
0000010277 00000 n
-0000207360 00000 n
-0000597488 00000 n
+0000207478 00000 n
+0000597886 00000 n
0000010337 00000 n
0000010555 00000 n
-0000212542 00000 n
-0000597395 00000 n
+0000212660 00000 n
+0000597793 00000 n
0000010615 00000 n
0000010722 00000 n
-0000213253 00000 n
-0000597316 00000 n
+0000213371 00000 n
+0000597714 00000 n
0000010782 00000 n
0000011029 00000 n
-0000219657 00000 n
-0000597198 00000 n
+0000219775 00000 n
+0000597596 00000 n
0000011083 00000 n
0000011320 00000 n
-0000224117 00000 n
-0000597119 00000 n
+0000224235 00000 n
+0000597517 00000 n
0000011379 00000 n
0000011628 00000 n
-0000235678 00000 n
-0000597026 00000 n
+0000235796 00000 n
+0000597424 00000 n
0000011687 00000 n
0000011830 00000 n
-0000295559 00000 n
-0000596933 00000 n
+0000295677 00000 n
+0000597331 00000 n
0000011889 00000 n
0000012027 00000 n
-0000324153 00000 n
-0000596840 00000 n
+0000324271 00000 n
+0000597238 00000 n
0000012086 00000 n
0000012244 00000 n
-0000330524 00000 n
-0000596747 00000 n
+0000330642 00000 n
+0000597145 00000 n
0000012303 00000 n
0000012709 00000 n
-0000331171 00000 n
-0000596654 00000 n
+0000331289 00000 n
+0000597052 00000 n
0000012768 00000 n
0000013078 00000 n
-0000338022 00000 n
-0000596575 00000 n
+0000338140 00000 n
+0000596973 00000 n
0000013137 00000 n
0000013354 00000 n
-0000343313 00000 n
-0000596481 00000 n
+0000343079 00000 n
+0000596879 00000 n
0000013403 00000 n
0000013480 00000 n
-0000349192 00000 n
-0000596401 00000 n
+0000346999 00000 n
+0000596799 00000 n
0000013524 00000 n
0000013593 00000 n
-0000017138 00000 n
-0000017328 00000 n
-0000017639 00000 n
-0000017484 00000 n
-0000018329 00000 n
+0000017143 00000 n
+0000017333 00000 n
+0000017644 00000 n
+0000017489 00000 n
+0000018334 00000 n
0000013657 00000 n
-0000018019 00000 n
-0000018081 00000 n
-0000535373 00000 n
-0000532481 00000 n
-0000594443 00000 n
-0000530277 00000 n
-0000526345 00000 n
-0000522999 00000 n
-0000520367 00000 n
-0000515204 00000 n
-0000513091 00000 n
-0000505799 00000 n
-0000495134 00000 n
-0000491571 00000 n
-0000488468 00000 n
-0000477876 00000 n
-0000474281 00000 n
-0000594801 00000 n
-0000594083 00000 n
-0000594264 00000 n
-0000594977 00000 n
-0000594623 00000 n
-0000468405 00000 n
-0000460397 00000 n
-0000456162 00000 n
-0000018203 00000 n
-0000453052 00000 n
-0000449634 00000 n
-0000017831 00000 n
-0000018266 00000 n
-0000595151 00000 n
-0000017275 00000 n
-0000022576 00000 n
-0000022737 00000 n
-0000022898 00000 n
-0000023421 00000 n
-0000022394 00000 n
-0000018765 00000 n
-0000023054 00000 n
-0000442056 00000 n
-0000435436 00000 n
-0000023358 00000 n
-0000022531 00000 n
-0000028162 00000 n
-0000028318 00000 n
-0000028781 00000 n
-0000027988 00000 n
-0000023662 00000 n
-0000028473 00000 n
-0000427024 00000 n
-0000028657 00000 n
-0000028719 00000 n
-0000028125 00000 n
-0000033149 00000 n
-0000033310 00000 n
-0000033470 00000 n
-0000033625 00000 n
-0000033781 00000 n
-0000033947 00000 n
-0000034301 00000 n
-0000032943 00000 n
-0000029074 00000 n
-0000034113 00000 n
-0000424228 00000 n
-0000421113 00000 n
-0000034175 00000 n
-0000034238 00000 n
-0000033080 00000 n
-0000039643 00000 n
-0000039804 00000 n
-0000039960 00000 n
-0000040118 00000 n
-0000040273 00000 n
-0000040698 00000 n
-0000039445 00000 n
-0000034568 00000 n
-0000040451 00000 n
-0000409763 00000 n
-0000040574 00000 n
-0000040637 00000 n
-0000039582 00000 n
-0000094116 00000 n
-0000044373 00000 n
-0000044534 00000 n
-0000044940 00000 n
-0000044199 00000 n
-0000041056 00000 n
-0000044695 00000 n
-0000044336 00000 n
-0000047331 00000 n
-0000047148 00000 n
-0000045168 00000 n
-0000047269 00000 n
-0000051301 00000 n
-0000051462 00000 n
-0000051623 00000 n
-0000051784 00000 n
-0000051945 00000 n
-0000052409 00000 n
-0000051103 00000 n
-0000047507 00000 n
-0000052101 00000 n
-0000052346 00000 n
-0000051240 00000 n
-0000055663 00000 n
-0000055419 00000 n
-0000052663 00000 n
-0000055540 00000 n
-0000059784 00000 n
-0000059941 00000 n
-0000060098 00000 n
-0000060254 00000 n
-0000060906 00000 n
-0000059594 00000 n
-0000055878 00000 n
-0000060411 00000 n
-0000060655 00000 n
-0000060718 00000 n
-0000060781 00000 n
-0000060844 00000 n
-0000059731 00000 n
-0000064164 00000 n
-0000063920 00000 n
-0000061173 00000 n
-0000064041 00000 n
-0000595304 00000 n
-0000067842 00000 n
-0000068307 00000 n
-0000067676 00000 n
-0000064353 00000 n
-0000067999 00000 n
-0000068244 00000 n
-0000067813 00000 n
-0000073218 00000 n
-0000073378 00000 n
-0000073846 00000 n
-0000073044 00000 n
-0000068574 00000 n
-0000073538 00000 n
-0000073181 00000 n
-0000077420 00000 n
-0000077175 00000 n
-0000074087 00000 n
-0000077296 00000 n
-0000081283 00000 n
-0000081444 00000 n
-0000081605 00000 n
-0000081762 00000 n
-0000082166 00000 n
-0000081093 00000 n
-0000077609 00000 n
-0000081918 00000 n
-0000082042 00000 n
-0000082104 00000 n
-0000081230 00000 n
-0000086067 00000 n
-0000086224 00000 n
-0000086381 00000 n
-0000086538 00000 n
-0000086695 00000 n
-0000086856 00000 n
-0000087017 00000 n
-0000087174 00000 n
-0000087787 00000 n
-0000085845 00000 n
-0000082407 00000 n
-0000087351 00000 n
-0000406071 00000 n
-0000087413 00000 n
-0000087476 00000 n
-0000087601 00000 n
-0000087664 00000 n
-0000087726 00000 n
-0000085982 00000 n
-0000090765 00000 n
-0000090520 00000 n
-0000088054 00000 n
-0000090641 00000 n
-0000403872 00000 n
-0000391699 00000 n
-0000376960 00000 n
-0000091774 00000 n
-0000091591 00000 n
-0000090993 00000 n
-0000091712 00000 n
-0000094178 00000 n
-0000093933 00000 n
-0000091911 00000 n
-0000094054 00000 n
-0000098193 00000 n
-0000098350 00000 n
-0000098506 00000 n
-0000098663 00000 n
-0000099256 00000 n
-0000098003 00000 n
-0000094341 00000 n
-0000098820 00000 n
-0000099006 00000 n
-0000099069 00000 n
-0000099132 00000 n
-0000099195 00000 n
-0000098140 00000 n
-0000104983 00000 n
-0000102225 00000 n
-0000099549 00000 n
-0000102346 00000 n
-0000593938 00000 n
-0000102532 00000 n
-0000102595 00000 n
-0000102658 00000 n
-0000102721 00000 n
-0000102784 00000 n
-0000102847 00000 n
-0000102910 00000 n
-0000102971 00000 n
-0000103034 00000 n
-0000103097 00000 n
-0000103160 00000 n
-0000103223 00000 n
-0000103286 00000 n
-0000103348 00000 n
-0000103411 00000 n
-0000103474 00000 n
-0000103537 00000 n
-0000103600 00000 n
-0000103663 00000 n
-0000103726 00000 n
-0000103789 00000 n
-0000103852 00000 n
-0000103915 00000 n
-0000103978 00000 n
-0000104041 00000 n
-0000104104 00000 n
-0000104167 00000 n
-0000104230 00000 n
-0000104293 00000 n
-0000104356 00000 n
-0000104418 00000 n
-0000104481 00000 n
-0000104544 00000 n
-0000104607 00000 n
-0000104670 00000 n
-0000104733 00000 n
-0000104796 00000 n
-0000104859 00000 n
-0000104921 00000 n
-0000595457 00000 n
-0000110792 00000 n
-0000107340 00000 n
-0000105186 00000 n
-0000107461 00000 n
-0000107523 00000 n
-0000107586 00000 n
-0000107648 00000 n
-0000107711 00000 n
-0000107774 00000 n
-0000107836 00000 n
-0000107898 00000 n
-0000107961 00000 n
-0000108024 00000 n
-0000108087 00000 n
-0000108150 00000 n
-0000108213 00000 n
-0000108276 00000 n
-0000108339 00000 n
-0000108402 00000 n
-0000108464 00000 n
-0000108527 00000 n
-0000108590 00000 n
-0000108653 00000 n
-0000108716 00000 n
-0000108779 00000 n
-0000108842 00000 n
-0000108905 00000 n
-0000108968 00000 n
-0000109031 00000 n
-0000109094 00000 n
-0000109157 00000 n
-0000109220 00000 n
-0000109283 00000 n
-0000109346 00000 n
-0000109409 00000 n
-0000109472 00000 n
-0000109535 00000 n
-0000109598 00000 n
-0000109660 00000 n
-0000109723 00000 n
-0000109786 00000 n
-0000109849 00000 n
-0000109912 00000 n
-0000109975 00000 n
-0000110038 00000 n
-0000110101 00000 n
-0000110164 00000 n
-0000110227 00000 n
-0000110290 00000 n
-0000110352 00000 n
-0000110415 00000 n
-0000110478 00000 n
-0000110541 00000 n
-0000110604 00000 n
-0000110667 00000 n
-0000110730 00000 n
-0000116029 00000 n
-0000114025 00000 n
-0000110955 00000 n
-0000114146 00000 n
-0000114208 00000 n
-0000114271 00000 n
-0000114333 00000 n
-0000114396 00000 n
-0000114459 00000 n
-0000114522 00000 n
-0000114585 00000 n
-0000114648 00000 n
-0000114711 00000 n
-0000114774 00000 n
-0000114837 00000 n
-0000114898 00000 n
-0000114961 00000 n
-0000115024 00000 n
-0000115087 00000 n
-0000115150 00000 n
-0000115213 00000 n
-0000115276 00000 n
-0000115401 00000 n
-0000115464 00000 n
-0000115527 00000 n
-0000115590 00000 n
-0000115653 00000 n
-0000115716 00000 n
-0000115779 00000 n
-0000115842 00000 n
-0000115905 00000 n
-0000115967 00000 n
-0000120618 00000 n
-0000118675 00000 n
-0000116231 00000 n
-0000118796 00000 n
-0000118858 00000 n
-0000118921 00000 n
-0000118984 00000 n
-0000119045 00000 n
-0000119108 00000 n
-0000119171 00000 n
-0000119234 00000 n
-0000119297 00000 n
-0000119360 00000 n
-0000119423 00000 n
-0000119486 00000 n
-0000119548 00000 n
-0000119611 00000 n
-0000119674 00000 n
-0000119737 00000 n
-0000119800 00000 n
-0000119863 00000 n
-0000119926 00000 n
-0000119989 00000 n
-0000120052 00000 n
-0000120115 00000 n
-0000120178 00000 n
-0000120240 00000 n
-0000120303 00000 n
-0000120366 00000 n
-0000120429 00000 n
-0000120492 00000 n
-0000120555 00000 n
-0000125461 00000 n
-0000123200 00000 n
-0000120781 00000 n
-0000123321 00000 n
-0000123383 00000 n
-0000123446 00000 n
-0000123509 00000 n
-0000123572 00000 n
-0000123635 00000 n
-0000123698 00000 n
-0000123761 00000 n
-0000123824 00000 n
-0000123887 00000 n
-0000123950 00000 n
-0000124013 00000 n
-0000124076 00000 n
-0000124139 00000 n
-0000124201 00000 n
-0000124264 00000 n
-0000124327 00000 n
-0000124390 00000 n
-0000124453 00000 n
-0000124516 00000 n
-0000124579 00000 n
-0000124642 00000 n
-0000124705 00000 n
-0000124768 00000 n
-0000124831 00000 n
-0000124894 00000 n
-0000124957 00000 n
-0000125020 00000 n
-0000125083 00000 n
-0000125146 00000 n
-0000125209 00000 n
-0000125272 00000 n
-0000125335 00000 n
-0000125398 00000 n
-0000130865 00000 n
-0000127600 00000 n
-0000125637 00000 n
-0000127721 00000 n
-0000127783 00000 n
-0000127846 00000 n
-0000127909 00000 n
-0000127972 00000 n
-0000128035 00000 n
-0000128098 00000 n
-0000128161 00000 n
-0000128224 00000 n
-0000128287 00000 n
-0000128350 00000 n
-0000128413 00000 n
-0000128476 00000 n
-0000128539 00000 n
-0000128602 00000 n
-0000128665 00000 n
-0000128728 00000 n
-0000128790 00000 n
-0000128853 00000 n
-0000128916 00000 n
-0000128979 00000 n
-0000129042 00000 n
-0000129105 00000 n
-0000129168 00000 n
-0000129231 00000 n
-0000129294 00000 n
-0000129357 00000 n
-0000129420 00000 n
-0000129482 00000 n
-0000129545 00000 n
-0000129608 00000 n
-0000129671 00000 n
-0000129734 00000 n
-0000129797 00000 n
-0000129860 00000 n
-0000129923 00000 n
-0000129986 00000 n
-0000130049 00000 n
-0000130112 00000 n
-0000130174 00000 n
-0000130237 00000 n
-0000130300 00000 n
-0000130363 00000 n
-0000130426 00000 n
-0000130489 00000 n
-0000130552 00000 n
-0000130615 00000 n
-0000130678 00000 n
-0000130741 00000 n
-0000130803 00000 n
-0000136926 00000 n
-0000133476 00000 n
-0000131028 00000 n
-0000133597 00000 n
-0000133721 00000 n
-0000133783 00000 n
-0000133846 00000 n
-0000133909 00000 n
-0000133972 00000 n
-0000134035 00000 n
-0000134098 00000 n
-0000134161 00000 n
-0000134224 00000 n
-0000134287 00000 n
-0000134350 00000 n
-0000134413 00000 n
-0000134475 00000 n
-0000134538 00000 n
-0000134601 00000 n
-0000134664 00000 n
-0000134727 00000 n
-0000134790 00000 n
-0000134853 00000 n
-0000134916 00000 n
-0000134979 00000 n
-0000135041 00000 n
-0000135104 00000 n
-0000135167 00000 n
-0000135230 00000 n
-0000135293 00000 n
-0000135356 00000 n
-0000135418 00000 n
-0000135481 00000 n
-0000135544 00000 n
-0000135607 00000 n
-0000135670 00000 n
-0000135733 00000 n
-0000135796 00000 n
-0000135859 00000 n
-0000135922 00000 n
-0000135984 00000 n
-0000136047 00000 n
-0000136110 00000 n
-0000136173 00000 n
-0000136236 00000 n
-0000136299 00000 n
-0000136362 00000 n
-0000136425 00000 n
-0000136488 00000 n
-0000136550 00000 n
-0000136613 00000 n
-0000136676 00000 n
-0000136739 00000 n
-0000136802 00000 n
-0000136864 00000 n
-0000143173 00000 n
-0000139659 00000 n
-0000137102 00000 n
-0000139780 00000 n
-0000139842 00000 n
-0000139905 00000 n
-0000139967 00000 n
-0000140030 00000 n
-0000140093 00000 n
-0000140156 00000 n
-0000140219 00000 n
-0000140282 00000 n
-0000140345 00000 n
-0000140408 00000 n
-0000140471 00000 n
-0000140534 00000 n
-0000140597 00000 n
-0000140660 00000 n
-0000140722 00000 n
-0000140785 00000 n
-0000140848 00000 n
-0000140911 00000 n
-0000140974 00000 n
-0000141037 00000 n
-0000141100 00000 n
-0000141163 00000 n
-0000141226 00000 n
-0000141289 00000 n
-0000141352 00000 n
-0000141415 00000 n
-0000141478 00000 n
-0000141541 00000 n
-0000141604 00000 n
-0000141667 00000 n
-0000141730 00000 n
-0000141793 00000 n
-0000141856 00000 n
-0000141917 00000 n
-0000141980 00000 n
-0000142043 00000 n
-0000142106 00000 n
-0000142169 00000 n
-0000142232 00000 n
-0000142295 00000 n
-0000142358 00000 n
-0000142420 00000 n
-0000142483 00000 n
-0000142546 00000 n
-0000142609 00000 n
-0000142672 00000 n
-0000142735 00000 n
-0000142798 00000 n
-0000142861 00000 n
-0000142923 00000 n
-0000142986 00000 n
-0000143049 00000 n
-0000143111 00000 n
-0000148760 00000 n
-0000145373 00000 n
-0000143336 00000 n
-0000145494 00000 n
-0000145556 00000 n
-0000145619 00000 n
-0000145681 00000 n
-0000145744 00000 n
-0000145806 00000 n
-0000145869 00000 n
-0000145932 00000 n
-0000145995 00000 n
-0000146058 00000 n
-0000146121 00000 n
-0000146184 00000 n
-0000146247 00000 n
-0000146310 00000 n
-0000146373 00000 n
-0000146436 00000 n
-0000146499 00000 n
-0000146562 00000 n
-0000146625 00000 n
-0000146688 00000 n
-0000146751 00000 n
-0000146814 00000 n
-0000146877 00000 n
-0000146939 00000 n
-0000147002 00000 n
-0000147065 00000 n
-0000147128 00000 n
-0000147191 00000 n
-0000147254 00000 n
-0000147317 00000 n
-0000147380 00000 n
-0000147443 00000 n
-0000147505 00000 n
-0000147568 00000 n
-0000147631 00000 n
-0000147694 00000 n
-0000147757 00000 n
-0000147820 00000 n
-0000147883 00000 n
-0000147946 00000 n
-0000148009 00000 n
-0000148070 00000 n
-0000148133 00000 n
-0000148196 00000 n
-0000148259 00000 n
-0000148384 00000 n
-0000148447 00000 n
-0000148510 00000 n
-0000148573 00000 n
-0000148636 00000 n
-0000148698 00000 n
-0000155022 00000 n
-0000151130 00000 n
-0000148949 00000 n
-0000151251 00000 n
-0000151313 00000 n
-0000151376 00000 n
-0000151438 00000 n
-0000151501 00000 n
-0000151564 00000 n
-0000151627 00000 n
-0000151690 00000 n
-0000151753 00000 n
-0000151816 00000 n
-0000151879 00000 n
-0000151942 00000 n
-0000152004 00000 n
-0000152067 00000 n
-0000152130 00000 n
-0000152193 00000 n
-0000152256 00000 n
-0000152319 00000 n
-0000152382 00000 n
-0000152445 00000 n
-0000152508 00000 n
-0000152570 00000 n
-0000152633 00000 n
-0000152696 00000 n
-0000152759 00000 n
-0000152822 00000 n
-0000152885 00000 n
-0000152948 00000 n
-0000153011 00000 n
-0000153074 00000 n
-0000153136 00000 n
-0000153199 00000 n
-0000153262 00000 n
-0000153325 00000 n
-0000153388 00000 n
-0000153451 00000 n
-0000153514 00000 n
-0000153577 00000 n
-0000153640 00000 n
-0000153702 00000 n
-0000153765 00000 n
-0000153828 00000 n
-0000153891 00000 n
-0000153954 00000 n
-0000154017 00000 n
-0000154080 00000 n
-0000154143 00000 n
-0000154206 00000 n
-0000154268 00000 n
-0000154331 00000 n
-0000154394 00000 n
-0000154457 00000 n
-0000154520 00000 n
-0000154583 00000 n
-0000154646 00000 n
-0000154709 00000 n
-0000154772 00000 n
-0000154834 00000 n
-0000154897 00000 n
-0000154960 00000 n
-0000160657 00000 n
-0000157334 00000 n
-0000155185 00000 n
-0000157455 00000 n
-0000157579 00000 n
-0000157641 00000 n
-0000157703 00000 n
-0000157766 00000 n
-0000157829 00000 n
-0000157892 00000 n
-0000157955 00000 n
-0000158018 00000 n
-0000158081 00000 n
-0000158144 00000 n
-0000158269 00000 n
-0000158332 00000 n
-0000158395 00000 n
-0000158458 00000 n
-0000158521 00000 n
-0000158584 00000 n
-0000158647 00000 n
-0000158710 00000 n
-0000158772 00000 n
-0000158835 00000 n
-0000158898 00000 n
-0000158961 00000 n
-0000159024 00000 n
-0000159087 00000 n
-0000159150 00000 n
-0000159213 00000 n
-0000159276 00000 n
-0000159339 00000 n
-0000159401 00000 n
-0000159464 00000 n
-0000159527 00000 n
-0000159590 00000 n
-0000159653 00000 n
-0000159716 00000 n
-0000159779 00000 n
-0000159842 00000 n
-0000159905 00000 n
-0000159967 00000 n
-0000160092 00000 n
-0000160155 00000 n
-0000160218 00000 n
-0000160281 00000 n
-0000160344 00000 n
-0000160407 00000 n
-0000160470 00000 n
-0000160533 00000 n
-0000160595 00000 n
-0000595610 00000 n
-0000166612 00000 n
-0000162945 00000 n
-0000160833 00000 n
-0000163066 00000 n
-0000163128 00000 n
-0000163191 00000 n
-0000163253 00000 n
-0000163316 00000 n
-0000163379 00000 n
-0000163442 00000 n
-0000163505 00000 n
-0000163568 00000 n
-0000163631 00000 n
-0000163694 00000 n
-0000163757 00000 n
-0000163819 00000 n
-0000163882 00000 n
-0000163945 00000 n
-0000164008 00000 n
-0000164071 00000 n
-0000164134 00000 n
-0000164197 00000 n
-0000164260 00000 n
-0000164322 00000 n
-0000164385 00000 n
-0000164448 00000 n
-0000164511 00000 n
-0000164574 00000 n
-0000164637 00000 n
-0000164700 00000 n
-0000164763 00000 n
-0000164825 00000 n
-0000164889 00000 n
-0000164953 00000 n
-0000165017 00000 n
-0000165081 00000 n
-0000165145 00000 n
-0000165209 00000 n
-0000165273 00000 n
-0000165337 00000 n
-0000165400 00000 n
-0000165464 00000 n
-0000165528 00000 n
-0000165592 00000 n
-0000165656 00000 n
-0000165720 00000 n
-0000165784 00000 n
-0000165847 00000 n
-0000165911 00000 n
-0000165975 00000 n
-0000166039 00000 n
-0000166103 00000 n
-0000166167 00000 n
-0000166231 00000 n
-0000166295 00000 n
-0000166359 00000 n
-0000166422 00000 n
-0000166486 00000 n
-0000166549 00000 n
-0000172828 00000 n
-0000168943 00000 n
-0000166775 00000 n
-0000169067 00000 n
-0000169131 00000 n
-0000169196 00000 n
-0000169260 00000 n
-0000169325 00000 n
-0000169390 00000 n
-0000169455 00000 n
-0000169520 00000 n
-0000169585 00000 n
-0000169650 00000 n
-0000169715 00000 n
-0000169780 00000 n
-0000169844 00000 n
-0000169909 00000 n
-0000169974 00000 n
-0000170039 00000 n
-0000170104 00000 n
-0000170169 00000 n
-0000170234 00000 n
-0000170298 00000 n
-0000170363 00000 n
-0000170428 00000 n
-0000170493 00000 n
-0000170558 00000 n
-0000170623 00000 n
-0000170688 00000 n
-0000170753 00000 n
-0000170818 00000 n
-0000170882 00000 n
-0000170947 00000 n
-0000171012 00000 n
-0000171077 00000 n
-0000171142 00000 n
-0000171207 00000 n
-0000171272 00000 n
-0000171337 00000 n
-0000171402 00000 n
-0000171466 00000 n
-0000171531 00000 n
-0000171596 00000 n
-0000171661 00000 n
-0000171726 00000 n
-0000171791 00000 n
-0000171856 00000 n
-0000171921 00000 n
-0000171986 00000 n
-0000172051 00000 n
-0000172116 00000 n
-0000172181 00000 n
-0000172246 00000 n
-0000172311 00000 n
-0000172376 00000 n
-0000172441 00000 n
-0000172506 00000 n
-0000172570 00000 n
-0000172635 00000 n
-0000172700 00000 n
-0000172764 00000 n
-0000179088 00000 n
-0000175465 00000 n
-0000172992 00000 n
-0000175589 00000 n
-0000175653 00000 n
-0000175718 00000 n
-0000175782 00000 n
-0000175847 00000 n
-0000175912 00000 n
-0000175976 00000 n
-0000176041 00000 n
-0000176106 00000 n
-0000176171 00000 n
-0000176236 00000 n
-0000176301 00000 n
-0000176365 00000 n
-0000176430 00000 n
-0000176495 00000 n
-0000176560 00000 n
-0000176625 00000 n
-0000176690 00000 n
-0000176755 00000 n
-0000176820 00000 n
-0000176885 00000 n
-0000176949 00000 n
-0000177014 00000 n
-0000177079 00000 n
-0000177144 00000 n
-0000177209 00000 n
-0000177274 00000 n
-0000177339 00000 n
-0000177404 00000 n
-0000177469 00000 n
-0000177534 00000 n
-0000177599 00000 n
-0000177664 00000 n
-0000177729 00000 n
-0000177794 00000 n
-0000177859 00000 n
-0000177922 00000 n
-0000177987 00000 n
-0000178052 00000 n
-0000178117 00000 n
-0000178182 00000 n
-0000178247 00000 n
-0000178312 00000 n
-0000178377 00000 n
-0000178442 00000 n
-0000178506 00000 n
-0000178571 00000 n
-0000178636 00000 n
-0000178701 00000 n
-0000178765 00000 n
-0000178830 00000 n
-0000178895 00000 n
-0000178960 00000 n
-0000179024 00000 n
-0000185497 00000 n
-0000181938 00000 n
-0000179252 00000 n
-0000182062 00000 n
-0000182126 00000 n
-0000182191 00000 n
-0000182255 00000 n
-0000182320 00000 n
-0000182385 00000 n
-0000182450 00000 n
-0000182515 00000 n
-0000182580 00000 n
-0000182645 00000 n
-0000182710 00000 n
-0000182775 00000 n
-0000182839 00000 n
-0000182904 00000 n
-0000182969 00000 n
-0000183033 00000 n
-0000183098 00000 n
-0000183163 00000 n
-0000183228 00000 n
-0000183293 00000 n
-0000183358 00000 n
-0000183423 00000 n
-0000183487 00000 n
-0000183552 00000 n
-0000183617 00000 n
-0000183682 00000 n
-0000183747 00000 n
-0000183812 00000 n
-0000183877 00000 n
-0000183941 00000 n
-0000184006 00000 n
-0000184071 00000 n
-0000184136 00000 n
-0000184201 00000 n
-0000184266 00000 n
-0000184331 00000 n
-0000184396 00000 n
-0000184461 00000 n
-0000184525 00000 n
-0000184590 00000 n
-0000184655 00000 n
-0000184720 00000 n
-0000184785 00000 n
-0000184850 00000 n
-0000184915 00000 n
-0000184980 00000 n
-0000185045 00000 n
-0000185109 00000 n
-0000185174 00000 n
-0000185239 00000 n
-0000185304 00000 n
-0000185369 00000 n
-0000185433 00000 n
-0000191255 00000 n
-0000188218 00000 n
-0000185674 00000 n
-0000188342 00000 n
-0000188406 00000 n
-0000188471 00000 n
-0000188535 00000 n
-0000188600 00000 n
-0000188665 00000 n
-0000188730 00000 n
-0000188795 00000 n
-0000188860 00000 n
-0000188925 00000 n
-0000188990 00000 n
-0000189055 00000 n
-0000189119 00000 n
-0000189184 00000 n
-0000189249 00000 n
-0000189314 00000 n
-0000189379 00000 n
-0000189444 00000 n
-0000189509 00000 n
-0000189574 00000 n
-0000189639 00000 n
-0000189704 00000 n
-0000189769 00000 n
-0000189834 00000 n
-0000189899 00000 n
-0000189964 00000 n
-0000190029 00000 n
-0000190094 00000 n
-0000190157 00000 n
-0000190222 00000 n
-0000190287 00000 n
-0000190352 00000 n
-0000190417 00000 n
-0000190482 00000 n
-0000190547 00000 n
-0000190612 00000 n
-0000190677 00000 n
-0000190742 00000 n
-0000190807 00000 n
-0000190868 00000 n
-0000190933 00000 n
-0000190998 00000 n
-0000191063 00000 n
-0000191191 00000 n
-0000197487 00000 n
-0000193410 00000 n
-0000191445 00000 n
-0000193534 00000 n
-0000193598 00000 n
-0000193661 00000 n
-0000193726 00000 n
-0000193791 00000 n
-0000193856 00000 n
-0000193921 00000 n
-0000193986 00000 n
-0000194051 00000 n
-0000194116 00000 n
-0000194181 00000 n
-0000194245 00000 n
-0000194310 00000 n
-0000194375 00000 n
-0000194440 00000 n
-0000194505 00000 n
-0000194570 00000 n
-0000194635 00000 n
-0000194700 00000 n
-0000194765 00000 n
-0000194829 00000 n
-0000194894 00000 n
-0000194959 00000 n
-0000195024 00000 n
-0000195089 00000 n
-0000195154 00000 n
-0000195219 00000 n
-0000195284 00000 n
-0000195349 00000 n
-0000195413 00000 n
-0000195478 00000 n
-0000195543 00000 n
-0000195608 00000 n
-0000195673 00000 n
-0000195738 00000 n
-0000195803 00000 n
-0000195868 00000 n
-0000195933 00000 n
-0000195998 00000 n
-0000196062 00000 n
-0000196127 00000 n
-0000196192 00000 n
-0000196257 00000 n
-0000196322 00000 n
-0000196387 00000 n
-0000196452 00000 n
-0000196517 00000 n
-0000196582 00000 n
-0000196645 00000 n
-0000196710 00000 n
-0000196775 00000 n
-0000196840 00000 n
-0000196905 00000 n
-0000196970 00000 n
-0000197035 00000 n
-0000197100 00000 n
-0000197165 00000 n
-0000197229 00000 n
-0000197294 00000 n
-0000197359 00000 n
-0000197423 00000 n
-0000203384 00000 n
-0000199568 00000 n
-0000197638 00000 n
-0000199692 00000 n
-0000199756 00000 n
-0000199821 00000 n
-0000199885 00000 n
-0000199950 00000 n
-0000200015 00000 n
-0000200080 00000 n
-0000200145 00000 n
-0000200210 00000 n
-0000200275 00000 n
-0000200339 00000 n
-0000200404 00000 n
-0000200469 00000 n
-0000200534 00000 n
-0000200599 00000 n
-0000200664 00000 n
-0000200729 00000 n
-0000200794 00000 n
-0000200859 00000 n
-0000200923 00000 n
-0000200988 00000 n
-0000201053 00000 n
-0000201118 00000 n
-0000201183 00000 n
-0000201248 00000 n
-0000201313 00000 n
-0000201378 00000 n
-0000201443 00000 n
-0000201507 00000 n
-0000201572 00000 n
-0000201637 00000 n
-0000201702 00000 n
-0000201767 00000 n
-0000201832 00000 n
-0000201897 00000 n
-0000201962 00000 n
-0000202027 00000 n
-0000202154 00000 n
-0000202219 00000 n
-0000202283 00000 n
-0000202348 00000 n
-0000202413 00000 n
-0000202478 00000 n
-0000202543 00000 n
-0000202608 00000 n
-0000202673 00000 n
-0000202738 00000 n
-0000202803 00000 n
-0000202866 00000 n
-0000202931 00000 n
-0000202996 00000 n
-0000203061 00000 n
-0000203126 00000 n
-0000203191 00000 n
-0000203256 00000 n
-0000203320 00000 n
-0000208982 00000 n
-0000206458 00000 n
-0000203548 00000 n
-0000206582 00000 n
-0000206646 00000 n
-0000206711 00000 n
-0000206775 00000 n
-0000206840 00000 n
-0000206905 00000 n
-0000206970 00000 n
-0000207035 00000 n
-0000207100 00000 n
-0000207165 00000 n
-0000207230 00000 n
-0000207295 00000 n
-0000207423 00000 n
-0000207488 00000 n
-0000207553 00000 n
-0000207618 00000 n
-0000207683 00000 n
-0000207748 00000 n
-0000207813 00000 n
-0000207878 00000 n
-0000207943 00000 n
-0000208008 00000 n
-0000208073 00000 n
-0000208138 00000 n
-0000208203 00000 n
-0000208268 00000 n
-0000208333 00000 n
-0000208397 00000 n
-0000208462 00000 n
-0000208527 00000 n
-0000208592 00000 n
-0000208657 00000 n
-0000208722 00000 n
-0000208787 00000 n
-0000208852 00000 n
-0000208917 00000 n
-0000215195 00000 n
-0000211382 00000 n
-0000209172 00000 n
-0000211506 00000 n
-0000211570 00000 n
-0000211635 00000 n
-0000211699 00000 n
-0000211764 00000 n
-0000211829 00000 n
-0000211894 00000 n
-0000211958 00000 n
-0000212023 00000 n
-0000212088 00000 n
-0000212152 00000 n
-0000212217 00000 n
-0000212282 00000 n
-0000212347 00000 n
-0000212412 00000 n
-0000212477 00000 n
-0000212605 00000 n
-0000212669 00000 n
-0000212734 00000 n
-0000212799 00000 n
-0000212864 00000 n
-0000212929 00000 n
-0000212994 00000 n
-0000213059 00000 n
-0000213124 00000 n
-0000213189 00000 n
-0000213316 00000 n
-0000213381 00000 n
-0000213446 00000 n
-0000213511 00000 n
-0000213576 00000 n
-0000213641 00000 n
-0000213706 00000 n
-0000213770 00000 n
-0000213835 00000 n
-0000213900 00000 n
-0000213965 00000 n
-0000214030 00000 n
-0000214095 00000 n
-0000214160 00000 n
-0000214225 00000 n
-0000214290 00000 n
-0000214353 00000 n
-0000214418 00000 n
-0000214483 00000 n
-0000214548 00000 n
-0000214613 00000 n
-0000214678 00000 n
-0000214743 00000 n
-0000214808 00000 n
-0000214873 00000 n
-0000214937 00000 n
-0000215002 00000 n
-0000215067 00000 n
-0000215131 00000 n
-0000220497 00000 n
-0000217520 00000 n
-0000215372 00000 n
-0000217645 00000 n
-0000217709 00000 n
-0000217774 00000 n
-0000217838 00000 n
-0000217903 00000 n
-0000217968 00000 n
-0000218033 00000 n
-0000218098 00000 n
-0000218163 00000 n
-0000218228 00000 n
-0000218293 00000 n
-0000218358 00000 n
-0000218423 00000 n
-0000218488 00000 n
-0000218552 00000 n
-0000218617 00000 n
-0000218682 00000 n
-0000218747 00000 n
-0000218812 00000 n
-0000218877 00000 n
-0000218942 00000 n
-0000219007 00000 n
-0000219072 00000 n
-0000219137 00000 n
-0000219202 00000 n
-0000219267 00000 n
-0000219332 00000 n
-0000219397 00000 n
-0000219462 00000 n
-0000219527 00000 n
-0000219592 00000 n
-0000219720 00000 n
-0000219785 00000 n
-0000219850 00000 n
-0000219915 00000 n
-0000219979 00000 n
-0000220043 00000 n
-0000220108 00000 n
-0000220172 00000 n
-0000220237 00000 n
-0000220302 00000 n
-0000220367 00000 n
-0000220432 00000 n
-0000595771 00000 n
-0000229596 00000 n
-0000225739 00000 n
-0000223928 00000 n
-0000220674 00000 n
-0000224053 00000 n
-0000224180 00000 n
-0000224245 00000 n
-0000224310 00000 n
-0000224375 00000 n
-0000224440 00000 n
-0000224505 00000 n
-0000224569 00000 n
-0000224634 00000 n
-0000224699 00000 n
-0000224764 00000 n
-0000224829 00000 n
-0000224894 00000 n
-0000224959 00000 n
-0000225024 00000 n
-0000225089 00000 n
-0000225154 00000 n
-0000225219 00000 n
-0000225284 00000 n
-0000225349 00000 n
-0000225414 00000 n
-0000225479 00000 n
-0000225544 00000 n
-0000225609 00000 n
-0000225674 00000 n
-0000229752 00000 n
-0000231594 00000 n
-0000229414 00000 n
-0000225968 00000 n
-0000229910 00000 n
-0000229974 00000 n
-0000230039 00000 n
-0000230104 00000 n
-0000230169 00000 n
-0000230234 00000 n
-0000230299 00000 n
-0000230363 00000 n
-0000230428 00000 n
-0000230492 00000 n
-0000230557 00000 n
-0000230622 00000 n
-0000230687 00000 n
-0000230752 00000 n
-0000230817 00000 n
-0000230882 00000 n
-0000230947 00000 n
-0000231012 00000 n
-0000231076 00000 n
-0000231141 00000 n
-0000231206 00000 n
-0000231271 00000 n
-0000231336 00000 n
-0000231401 00000 n
-0000231466 00000 n
-0000231530 00000 n
-0000229556 00000 n
-0000237619 00000 n
-0000234516 00000 n
-0000231862 00000 n
-0000234641 00000 n
-0000234705 00000 n
-0000234770 00000 n
-0000234834 00000 n
-0000234899 00000 n
-0000234964 00000 n
-0000235029 00000 n
-0000235093 00000 n
-0000235158 00000 n
-0000235223 00000 n
-0000235288 00000 n
-0000235353 00000 n
-0000235418 00000 n
-0000235483 00000 n
-0000235548 00000 n
-0000235613 00000 n
-0000235740 00000 n
-0000235805 00000 n
-0000235870 00000 n
-0000235935 00000 n
-0000236000 00000 n
-0000236065 00000 n
-0000236130 00000 n
-0000236195 00000 n
-0000236260 00000 n
-0000236325 00000 n
-0000236390 00000 n
-0000236453 00000 n
-0000236518 00000 n
-0000236583 00000 n
-0000236648 00000 n
-0000236713 00000 n
-0000236778 00000 n
-0000236843 00000 n
-0000236908 00000 n
-0000236973 00000 n
-0000237037 00000 n
-0000237102 00000 n
-0000237167 00000 n
-0000237232 00000 n
-0000237297 00000 n
-0000237362 00000 n
-0000237427 00000 n
-0000237492 00000 n
-0000237556 00000 n
-0000243929 00000 n
-0000240952 00000 n
-0000237822 00000 n
-0000241077 00000 n
-0000241141 00000 n
-0000241206 00000 n
-0000241270 00000 n
-0000241335 00000 n
-0000241400 00000 n
-0000241465 00000 n
-0000241530 00000 n
-0000241595 00000 n
-0000241660 00000 n
-0000241725 00000 n
-0000241790 00000 n
-0000241854 00000 n
-0000241919 00000 n
-0000241984 00000 n
-0000242049 00000 n
-0000242114 00000 n
-0000242179 00000 n
-0000242244 00000 n
-0000242309 00000 n
-0000242374 00000 n
-0000242438 00000 n
-0000242503 00000 n
-0000242568 00000 n
-0000242633 00000 n
-0000242698 00000 n
-0000242763 00000 n
-0000242828 00000 n
-0000242893 00000 n
-0000242958 00000 n
-0000243022 00000 n
-0000243087 00000 n
-0000243152 00000 n
-0000243217 00000 n
-0000243282 00000 n
-0000243347 00000 n
-0000243412 00000 n
-0000243477 00000 n
-0000243542 00000 n
-0000243607 00000 n
-0000243671 00000 n
-0000243736 00000 n
-0000243801 00000 n
-0000243865 00000 n
-0000247952 00000 n
-0000248109 00000 n
-0000250079 00000 n
-0000247770 00000 n
-0000244132 00000 n
-0000248266 00000 n
-0000248330 00000 n
-0000248395 00000 n
-0000248459 00000 n
-0000248524 00000 n
-0000248589 00000 n
-0000248653 00000 n
-0000248718 00000 n
-0000248783 00000 n
-0000248847 00000 n
-0000248912 00000 n
-0000248977 00000 n
-0000249041 00000 n
-0000249106 00000 n
-0000249171 00000 n
-0000249236 00000 n
-0000249301 00000 n
-0000249366 00000 n
-0000249431 00000 n
-0000249496 00000 n
-0000249561 00000 n
-0000249626 00000 n
-0000249690 00000 n
-0000249755 00000 n
-0000249820 00000 n
-0000249885 00000 n
-0000249950 00000 n
-0000250015 00000 n
-0000247912 00000 n
-0000256168 00000 n
-0000252540 00000 n
-0000250360 00000 n
-0000252665 00000 n
-0000252729 00000 n
-0000252794 00000 n
-0000252858 00000 n
-0000252923 00000 n
-0000252988 00000 n
-0000253053 00000 n
-0000253118 00000 n
-0000253183 00000 n
-0000253248 00000 n
-0000253313 00000 n
-0000253378 00000 n
-0000253443 00000 n
-0000253508 00000 n
-0000253572 00000 n
-0000253637 00000 n
-0000253702 00000 n
-0000253767 00000 n
-0000253832 00000 n
-0000253897 00000 n
-0000253962 00000 n
-0000254027 00000 n
-0000254092 00000 n
-0000254156 00000 n
-0000254221 00000 n
-0000254286 00000 n
-0000254351 00000 n
-0000254416 00000 n
-0000254481 00000 n
-0000254546 00000 n
-0000254611 00000 n
-0000254676 00000 n
-0000254741 00000 n
-0000254806 00000 n
-0000254871 00000 n
-0000254936 00000 n
-0000255001 00000 n
-0000255066 00000 n
-0000255131 00000 n
-0000255196 00000 n
-0000255261 00000 n
-0000255326 00000 n
-0000255390 00000 n
-0000255454 00000 n
-0000255519 00000 n
-0000255584 00000 n
-0000255649 00000 n
-0000255714 00000 n
-0000255779 00000 n
-0000255844 00000 n
-0000255908 00000 n
-0000255973 00000 n
-0000256038 00000 n
-0000256103 00000 n
-0000262299 00000 n
-0000258283 00000 n
-0000256371 00000 n
-0000258408 00000 n
-0000258472 00000 n
-0000258537 00000 n
-0000258601 00000 n
-0000258666 00000 n
-0000258731 00000 n
-0000258796 00000 n
-0000258861 00000 n
-0000258926 00000 n
-0000258991 00000 n
-0000259056 00000 n
-0000259121 00000 n
-0000259186 00000 n
-0000259251 00000 n
-0000259315 00000 n
-0000259380 00000 n
-0000259445 00000 n
-0000259510 00000 n
-0000259575 00000 n
-0000259640 00000 n
-0000259705 00000 n
-0000259770 00000 n
-0000259835 00000 n
-0000259899 00000 n
-0000259964 00000 n
-0000260029 00000 n
-0000260094 00000 n
-0000260159 00000 n
-0000260224 00000 n
-0000260289 00000 n
-0000260352 00000 n
-0000260417 00000 n
-0000260482 00000 n
-0000260547 00000 n
-0000260612 00000 n
-0000260677 00000 n
-0000260742 00000 n
-0000260807 00000 n
-0000260872 00000 n
-0000260937 00000 n
-0000261002 00000 n
-0000261067 00000 n
-0000261132 00000 n
-0000261197 00000 n
-0000261262 00000 n
-0000261327 00000 n
-0000261392 00000 n
-0000261457 00000 n
-0000261522 00000 n
-0000261586 00000 n
-0000261651 00000 n
-0000261716 00000 n
-0000261781 00000 n
-0000261846 00000 n
-0000261911 00000 n
-0000261976 00000 n
-0000262041 00000 n
-0000262106 00000 n
-0000262171 00000 n
-0000262235 00000 n
-0000265483 00000 n
-0000268234 00000 n
-0000265310 00000 n
-0000262463 00000 n
-0000265641 00000 n
-0000265705 00000 n
-0000265770 00000 n
-0000265834 00000 n
-0000265899 00000 n
-0000265964 00000 n
-0000266029 00000 n
-0000266094 00000 n
-0000266159 00000 n
-0000266224 00000 n
-0000266289 00000 n
-0000266354 00000 n
-0000266418 00000 n
-0000266483 00000 n
-0000266548 00000 n
-0000266613 00000 n
-0000266678 00000 n
-0000266743 00000 n
-0000266808 00000 n
-0000266873 00000 n
-0000266938 00000 n
-0000267003 00000 n
-0000267067 00000 n
-0000267132 00000 n
-0000267197 00000 n
-0000267262 00000 n
-0000267327 00000 n
-0000267392 00000 n
-0000267457 00000 n
-0000267522 00000 n
-0000267587 00000 n
-0000267651 00000 n
-0000267716 00000 n
-0000267781 00000 n
-0000267846 00000 n
-0000267910 00000 n
-0000267975 00000 n
-0000268040 00000 n
-0000268105 00000 n
-0000268170 00000 n
-0000265452 00000 n
-0000274296 00000 n
-0000270153 00000 n
-0000268502 00000 n
-0000270278 00000 n
-0000270342 00000 n
-0000270407 00000 n
-0000270471 00000 n
-0000270536 00000 n
-0000270601 00000 n
-0000270666 00000 n
-0000270731 00000 n
-0000270796 00000 n
-0000270861 00000 n
-0000270926 00000 n
-0000270991 00000 n
-0000271055 00000 n
-0000271120 00000 n
-0000271185 00000 n
-0000271250 00000 n
-0000271315 00000 n
-0000271379 00000 n
-0000271444 00000 n
-0000271509 00000 n
-0000271574 00000 n
-0000271638 00000 n
-0000271703 00000 n
-0000271768 00000 n
-0000271833 00000 n
-0000271898 00000 n
-0000271963 00000 n
-0000272028 00000 n
-0000272093 00000 n
-0000272158 00000 n
-0000272222 00000 n
-0000272287 00000 n
-0000272352 00000 n
-0000272417 00000 n
-0000272482 00000 n
-0000272547 00000 n
-0000272612 00000 n
-0000272677 00000 n
-0000272742 00000 n
-0000272807 00000 n
-0000272871 00000 n
-0000272936 00000 n
-0000273001 00000 n
-0000273066 00000 n
-0000273131 00000 n
-0000273196 00000 n
-0000273261 00000 n
-0000273326 00000 n
-0000273391 00000 n
-0000273454 00000 n
-0000273519 00000 n
-0000273584 00000 n
-0000273649 00000 n
-0000273714 00000 n
-0000273779 00000 n
-0000273844 00000 n
-0000273909 00000 n
-0000273974 00000 n
-0000274038 00000 n
-0000274103 00000 n
-0000274168 00000 n
-0000274232 00000 n
-0000280172 00000 n
-0000277136 00000 n
-0000274460 00000 n
-0000277261 00000 n
-0000277325 00000 n
-0000277390 00000 n
-0000277454 00000 n
-0000277519 00000 n
-0000277584 00000 n
-0000277649 00000 n
-0000277714 00000 n
-0000277779 00000 n
-0000277844 00000 n
-0000277909 00000 n
-0000277974 00000 n
-0000278038 00000 n
-0000278101 00000 n
-0000278166 00000 n
-0000278231 00000 n
-0000278296 00000 n
-0000278361 00000 n
-0000278425 00000 n
-0000278490 00000 n
-0000278554 00000 n
-0000278619 00000 n
-0000278684 00000 n
-0000278749 00000 n
-0000278814 00000 n
-0000278879 00000 n
-0000278944 00000 n
-0000279007 00000 n
-0000279072 00000 n
-0000279137 00000 n
-0000279202 00000 n
-0000279267 00000 n
-0000279332 00000 n
-0000279397 00000 n
-0000279461 00000 n
-0000279525 00000 n
-0000279590 00000 n
-0000279655 00000 n
-0000279720 00000 n
-0000279785 00000 n
-0000279850 00000 n
-0000279915 00000 n
-0000279980 00000 n
-0000280044 00000 n
-0000280108 00000 n
-0000595935 00000 n
-0000285852 00000 n
-0000283716 00000 n
-0000280375 00000 n
-0000283841 00000 n
-0000283905 00000 n
-0000283970 00000 n
-0000284034 00000 n
-0000284099 00000 n
-0000284164 00000 n
-0000284229 00000 n
-0000284294 00000 n
-0000284359 00000 n
-0000284424 00000 n
-0000284489 00000 n
-0000284554 00000 n
-0000284619 00000 n
-0000284684 00000 n
-0000284749 00000 n
-0000284814 00000 n
-0000284879 00000 n
-0000284944 00000 n
-0000285009 00000 n
-0000285074 00000 n
-0000285139 00000 n
-0000285203 00000 n
-0000285268 00000 n
-0000285333 00000 n
-0000285397 00000 n
-0000285462 00000 n
-0000285527 00000 n
-0000285592 00000 n
-0000285657 00000 n
-0000285722 00000 n
-0000285787 00000 n
-0000294300 00000 n
-0000291442 00000 n
-0000288528 00000 n
-0000286068 00000 n
-0000288653 00000 n
-0000288717 00000 n
-0000288781 00000 n
-0000288846 00000 n
-0000288911 00000 n
-0000288976 00000 n
-0000289041 00000 n
-0000289106 00000 n
-0000289171 00000 n
-0000289236 00000 n
-0000289300 00000 n
-0000289365 00000 n
-0000289429 00000 n
-0000289494 00000 n
-0000289558 00000 n
-0000289623 00000 n
-0000289688 00000 n
-0000289753 00000 n
-0000289818 00000 n
-0000289883 00000 n
-0000289948 00000 n
-0000290013 00000 n
-0000290078 00000 n
-0000290142 00000 n
-0000290207 00000 n
-0000290272 00000 n
-0000290337 00000 n
-0000290402 00000 n
-0000290467 00000 n
-0000290532 00000 n
-0000290597 00000 n
-0000290662 00000 n
-0000290727 00000 n
-0000290792 00000 n
-0000290857 00000 n
-0000290922 00000 n
-0000290987 00000 n
-0000291052 00000 n
-0000291117 00000 n
-0000291182 00000 n
-0000291247 00000 n
-0000291312 00000 n
-0000291377 00000 n
-0000298022 00000 n
-0000294127 00000 n
-0000291645 00000 n
-0000294458 00000 n
-0000294522 00000 n
-0000294587 00000 n
-0000294652 00000 n
-0000294717 00000 n
-0000294781 00000 n
-0000294846 00000 n
-0000294911 00000 n
-0000294976 00000 n
-0000295041 00000 n
-0000295106 00000 n
-0000295171 00000 n
-0000295236 00000 n
-0000295301 00000 n
-0000295365 00000 n
-0000295430 00000 n
-0000295494 00000 n
-0000295622 00000 n
-0000295687 00000 n
-0000295752 00000 n
-0000295817 00000 n
-0000295882 00000 n
-0000295947 00000 n
-0000296012 00000 n
-0000296077 00000 n
-0000296141 00000 n
-0000296206 00000 n
-0000296271 00000 n
-0000296336 00000 n
-0000296401 00000 n
-0000296466 00000 n
-0000296531 00000 n
-0000296596 00000 n
-0000296661 00000 n
-0000296725 00000 n
-0000296790 00000 n
-0000296855 00000 n
-0000296920 00000 n
-0000296985 00000 n
-0000297050 00000 n
-0000297115 00000 n
-0000297180 00000 n
-0000297245 00000 n
-0000297309 00000 n
-0000297374 00000 n
-0000297439 00000 n
-0000297504 00000 n
-0000297569 00000 n
-0000297634 00000 n
-0000297699 00000 n
-0000297764 00000 n
-0000297829 00000 n
-0000297893 00000 n
-0000297958 00000 n
-0000294269 00000 n
-0000304189 00000 n
-0000300371 00000 n
-0000298251 00000 n
-0000300496 00000 n
-0000300560 00000 n
-0000300625 00000 n
-0000300689 00000 n
-0000300754 00000 n
-0000300819 00000 n
-0000300884 00000 n
-0000300949 00000 n
-0000301014 00000 n
-0000301079 00000 n
-0000301144 00000 n
-0000301209 00000 n
-0000301273 00000 n
-0000301338 00000 n
-0000301403 00000 n
-0000301468 00000 n
-0000301533 00000 n
-0000301598 00000 n
-0000301663 00000 n
-0000301728 00000 n
-0000301792 00000 n
-0000301857 00000 n
-0000301922 00000 n
-0000301986 00000 n
-0000302051 00000 n
-0000302115 00000 n
-0000302180 00000 n
-0000302245 00000 n
-0000302310 00000 n
-0000302375 00000 n
-0000302440 00000 n
-0000302505 00000 n
-0000302570 00000 n
-0000302635 00000 n
-0000302699 00000 n
-0000302764 00000 n
-0000302828 00000 n
-0000302893 00000 n
-0000302958 00000 n
-0000303023 00000 n
-0000303088 00000 n
-0000303153 00000 n
-0000303218 00000 n
-0000303283 00000 n
-0000303348 00000 n
-0000303412 00000 n
-0000303477 00000 n
-0000303542 00000 n
-0000303607 00000 n
-0000303672 00000 n
-0000303737 00000 n
-0000303802 00000 n
-0000303867 00000 n
-0000303932 00000 n
-0000303996 00000 n
-0000304061 00000 n
-0000304125 00000 n
-0000310143 00000 n
-0000306064 00000 n
-0000304353 00000 n
-0000306189 00000 n
-0000306253 00000 n
-0000306318 00000 n
-0000306382 00000 n
-0000306447 00000 n
-0000306512 00000 n
-0000306577 00000 n
-0000306642 00000 n
-0000306707 00000 n
-0000306772 00000 n
-0000306837 00000 n
-0000306902 00000 n
-0000306966 00000 n
-0000307031 00000 n
-0000307096 00000 n
-0000307161 00000 n
-0000307226 00000 n
-0000307291 00000 n
-0000307356 00000 n
-0000307421 00000 n
-0000307486 00000 n
-0000307550 00000 n
-0000307615 00000 n
-0000307680 00000 n
-0000307745 00000 n
-0000307810 00000 n
-0000307875 00000 n
-0000307940 00000 n
-0000308005 00000 n
-0000308070 00000 n
-0000308134 00000 n
-0000308199 00000 n
-0000308263 00000 n
-0000308328 00000 n
-0000308393 00000 n
-0000308458 00000 n
-0000308522 00000 n
-0000308587 00000 n
-0000308652 00000 n
-0000308717 00000 n
-0000308782 00000 n
-0000308847 00000 n
-0000308912 00000 n
-0000308977 00000 n
-0000309042 00000 n
-0000309106 00000 n
-0000309171 00000 n
-0000309236 00000 n
-0000309301 00000 n
-0000309366 00000 n
-0000309431 00000 n
-0000309496 00000 n
-0000309561 00000 n
-0000309626 00000 n
-0000309691 00000 n
-0000309756 00000 n
-0000309820 00000 n
-0000309885 00000 n
-0000309950 00000 n
-0000310015 00000 n
-0000310079 00000 n
-0000315812 00000 n
-0000312899 00000 n
-0000310307 00000 n
-0000313024 00000 n
-0000313088 00000 n
-0000313153 00000 n
-0000313217 00000 n
-0000313282 00000 n
-0000313347 00000 n
-0000313412 00000 n
-0000313477 00000 n
-0000313542 00000 n
-0000313607 00000 n
-0000313672 00000 n
-0000313737 00000 n
-0000313802 00000 n
-0000313867 00000 n
-0000313932 00000 n
-0000313997 00000 n
-0000314062 00000 n
-0000314126 00000 n
-0000314191 00000 n
-0000314256 00000 n
-0000314321 00000 n
-0000314386 00000 n
-0000314451 00000 n
-0000314516 00000 n
-0000314581 00000 n
-0000314646 00000 n
-0000314710 00000 n
-0000314775 00000 n
-0000314840 00000 n
-0000314904 00000 n
-0000314968 00000 n
-0000315033 00000 n
-0000315098 00000 n
-0000315163 00000 n
-0000315228 00000 n
-0000315293 00000 n
-0000315358 00000 n
-0000315423 00000 n
-0000315488 00000 n
-0000315553 00000 n
-0000315618 00000 n
-0000315683 00000 n
-0000315748 00000 n
-0000318293 00000 n
-0000321627 00000 n
-0000318120 00000 n
-0000316015 00000 n
-0000318451 00000 n
-0000318515 00000 n
-0000318579 00000 n
-0000318644 00000 n
-0000318709 00000 n
-0000318774 00000 n
-0000318839 00000 n
-0000318904 00000 n
-0000318969 00000 n
-0000319032 00000 n
-0000319097 00000 n
-0000319161 00000 n
-0000319226 00000 n
-0000319291 00000 n
-0000319356 00000 n
-0000319421 00000 n
-0000319486 00000 n
-0000319551 00000 n
-0000319615 00000 n
-0000319680 00000 n
-0000319745 00000 n
-0000319810 00000 n
-0000319875 00000 n
-0000319940 00000 n
-0000320005 00000 n
-0000320070 00000 n
-0000320135 00000 n
-0000320198 00000 n
-0000320263 00000 n
-0000320328 00000 n
-0000320393 00000 n
-0000320458 00000 n
-0000320523 00000 n
-0000320588 00000 n
-0000320653 00000 n
-0000320718 00000 n
-0000320783 00000 n
-0000320848 00000 n
-0000320913 00000 n
-0000320977 00000 n
-0000321042 00000 n
-0000321107 00000 n
-0000321172 00000 n
-0000321237 00000 n
-0000321302 00000 n
-0000321367 00000 n
-0000321432 00000 n
-0000321497 00000 n
-0000321562 00000 n
-0000318262 00000 n
-0000327331 00000 n
-0000323964 00000 n
-0000321856 00000 n
-0000324089 00000 n
-0000324216 00000 n
-0000324281 00000 n
-0000324346 00000 n
-0000324410 00000 n
-0000324475 00000 n
-0000324540 00000 n
-0000324605 00000 n
-0000324670 00000 n
-0000324735 00000 n
-0000324800 00000 n
-0000324865 00000 n
-0000324930 00000 n
-0000324994 00000 n
-0000325059 00000 n
-0000325124 00000 n
-0000325189 00000 n
-0000325254 00000 n
-0000325319 00000 n
-0000325384 00000 n
-0000325449 00000 n
-0000325514 00000 n
-0000325578 00000 n
-0000325643 00000 n
-0000325708 00000 n
-0000325773 00000 n
-0000325838 00000 n
-0000325903 00000 n
-0000325968 00000 n
-0000326033 00000 n
-0000326098 00000 n
-0000326163 00000 n
-0000326227 00000 n
-0000326292 00000 n
-0000326357 00000 n
-0000326422 00000 n
-0000326487 00000 n
-0000326552 00000 n
-0000326617 00000 n
-0000326682 00000 n
-0000326747 00000 n
-0000326811 00000 n
-0000326876 00000 n
-0000326941 00000 n
-0000327006 00000 n
-0000327071 00000 n
-0000327136 00000 n
-0000327201 00000 n
-0000327266 00000 n
-0000332855 00000 n
-0000330335 00000 n
-0000327534 00000 n
-0000330460 00000 n
-0000330587 00000 n
-0000330651 00000 n
-0000330716 00000 n
-0000330781 00000 n
-0000330846 00000 n
-0000330911 00000 n
-0000330976 00000 n
-0000331041 00000 n
-0000331106 00000 n
-0000331234 00000 n
-0000331299 00000 n
-0000331364 00000 n
-0000331429 00000 n
-0000331493 00000 n
-0000331558 00000 n
-0000331623 00000 n
-0000331688 00000 n
-0000331753 00000 n
-0000331818 00000 n
-0000331883 00000 n
-0000331948 00000 n
-0000332013 00000 n
-0000332077 00000 n
-0000332142 00000 n
-0000332207 00000 n
-0000332272 00000 n
-0000332337 00000 n
-0000332402 00000 n
-0000332467 00000 n
-0000332532 00000 n
-0000332597 00000 n
-0000332662 00000 n
-0000332726 00000 n
-0000332791 00000 n
-0000338472 00000 n
-0000335300 00000 n
-0000333084 00000 n
-0000335425 00000 n
-0000335489 00000 n
-0000335554 00000 n
-0000335619 00000 n
-0000335684 00000 n
-0000335749 00000 n
-0000335814 00000 n
-0000335879 00000 n
-0000335944 00000 n
-0000336009 00000 n
-0000336074 00000 n
-0000336139 00000 n
-0000336204 00000 n
-0000336269 00000 n
-0000336334 00000 n
-0000336399 00000 n
-0000336464 00000 n
-0000336529 00000 n
-0000336594 00000 n
-0000336658 00000 n
-0000336723 00000 n
-0000336788 00000 n
-0000336853 00000 n
-0000336918 00000 n
-0000336983 00000 n
-0000337048 00000 n
-0000337113 00000 n
-0000337178 00000 n
-0000337243 00000 n
-0000337308 00000 n
-0000337373 00000 n
-0000337438 00000 n
-0000337503 00000 n
-0000337568 00000 n
-0000337633 00000 n
-0000337698 00000 n
-0000337762 00000 n
-0000337827 00000 n
-0000337892 00000 n
-0000337957 00000 n
-0000338085 00000 n
-0000338149 00000 n
-0000338214 00000 n
-0000338279 00000 n
-0000338344 00000 n
-0000338408 00000 n
-0000596099 00000 n
-0000343568 00000 n
-0000340855 00000 n
-0000338675 00000 n
-0000340980 00000 n
-0000341044 00000 n
-0000341109 00000 n
-0000341174 00000 n
-0000341238 00000 n
-0000341303 00000 n
-0000341368 00000 n
-0000341433 00000 n
-0000341498 00000 n
-0000341563 00000 n
-0000341628 00000 n
-0000341693 00000 n
-0000341758 00000 n
-0000341821 00000 n
-0000341886 00000 n
-0000341951 00000 n
-0000342016 00000 n
-0000342081 00000 n
-0000342146 00000 n
-0000342210 00000 n
-0000342275 00000 n
-0000342340 00000 n
-0000342405 00000 n
-0000342470 00000 n
-0000342535 00000 n
-0000342599 00000 n
-0000342664 00000 n
-0000342729 00000 n
-0000342794 00000 n
-0000342859 00000 n
-0000342924 00000 n
-0000342989 00000 n
-0000343054 00000 n
-0000343119 00000 n
-0000343183 00000 n
-0000343248 00000 n
-0000343376 00000 n
-0000343440 00000 n
-0000343504 00000 n
-0000347191 00000 n
-0000347347 00000 n
-0000347503 00000 n
-0000347661 00000 n
-0000347822 00000 n
-0000347982 00000 n
-0000348137 00000 n
-0000348298 00000 n
-0000348457 00000 n
-0000356458 00000 n
-0000349319 00000 n
-0000346946 00000 n
-0000343758 00000 n
-0000348616 00000 n
-0000348680 00000 n
-0000348744 00000 n
-0000348808 00000 n
-0000348872 00000 n
-0000348936 00000 n
-0000349000 00000 n
-0000349064 00000 n
-0000349128 00000 n
-0000349255 00000 n
-0000347088 00000 n
-0000356614 00000 n
-0000356775 00000 n
-0000356936 00000 n
-0000357102 00000 n
-0000357269 00000 n
-0000357434 00000 n
-0000357593 00000 n
-0000357759 00000 n
-0000357926 00000 n
-0000358093 00000 n
-0000358252 00000 n
-0000358419 00000 n
-0000358586 00000 n
-0000358746 00000 n
-0000358907 00000 n
-0000359063 00000 n
-0000359223 00000 n
-0000359383 00000 n
-0000359543 00000 n
-0000359703 00000 n
-0000359863 00000 n
-0000360019 00000 n
-0000360180 00000 n
-0000360341 00000 n
-0000360508 00000 n
-0000360674 00000 n
-0000360841 00000 n
-0000361008 00000 n
-0000361175 00000 n
-0000361341 00000 n
-0000361506 00000 n
-0000361673 00000 n
-0000361840 00000 n
-0000362008 00000 n
-0000362175 00000 n
-0000362343 00000 n
-0000362504 00000 n
-0000362671 00000 n
-0000362838 00000 n
-0000363005 00000 n
-0000363172 00000 n
-0000363339 00000 n
-0000363505 00000 n
-0000363672 00000 n
-0000363892 00000 n
-0000355889 00000 n
-0000349496 00000 n
-0000363828 00000 n
-0000356031 00000 n
-0000364148 00000 n
-0000364173 00000 n
-0000376158 00000 n
-0000364401 00000 n
-0000364504 00000 n
-0000376400 00000 n
-0000377124 00000 n
-0000377358 00000 n
-0000390870 00000 n
-0000377681 00000 n
-0000377788 00000 n
-0000391104 00000 n
-0000391855 00000 n
-0000392081 00000 n
-0000403115 00000 n
-0000392228 00000 n
-0000392326 00000 n
-0000403355 00000 n
-0000404033 00000 n
-0000404264 00000 n
-0000405375 00000 n
-0000404319 00000 n
-0000404416 00000 n
-0000405618 00000 n
-0000406228 00000 n
-0000406432 00000 n
-0000408983 00000 n
-0000406639 00000 n
-0000406745 00000 n
-0000409231 00000 n
-0000409926 00000 n
-0000410136 00000 n
-0000419946 00000 n
-0000410762 00000 n
-0000410897 00000 n
-0000420186 00000 n
-0000421270 00000 n
-0000421474 00000 n
-0000423479 00000 n
-0000421618 00000 n
-0000421724 00000 n
-0000423726 00000 n
-0000424391 00000 n
-0000424601 00000 n
-0000426286 00000 n
-0000424714 00000 n
-0000424820 00000 n
-0000426535 00000 n
-0000427188 00000 n
-0000427399 00000 n
-0000434480 00000 n
-0000427837 00000 n
-0000427952 00000 n
-0000434720 00000 n
-0000435592 00000 n
-0000435795 00000 n
-0000441197 00000 n
-0000436148 00000 n
-0000436262 00000 n
-0000441441 00000 n
-0000442214 00000 n
-0000442419 00000 n
-0000448674 00000 n
-0000442868 00000 n
-0000442976 00000 n
-0000448914 00000 n
-0000449791 00000 n
-0000449995 00000 n
-0000452307 00000 n
-0000450151 00000 n
-0000450257 00000 n
-0000452550 00000 n
-0000453209 00000 n
-0000453413 00000 n
-0000455433 00000 n
-0000453527 00000 n
-0000453631 00000 n
-0000455675 00000 n
-0000456320 00000 n
-0000456525 00000 n
-0000459578 00000 n
-0000456816 00000 n
-0000456923 00000 n
-0000459818 00000 n
-0000460554 00000 n
-0000460758 00000 n
-0000467467 00000 n
-0000461184 00000 n
-0000461299 00000 n
-0000467708 00000 n
-0000468563 00000 n
-0000593687 00000 n
-0000468768 00000 n
-0000593775 00000 n
-0000468795 00000 n
-0000593572 00000 n
-0000468822 00000 n
-0000468847 00000 n
-0000469080 00000 n
-0000469297 00000 n
-0000473453 00000 n
-0000469617 00000 n
-0000469723 00000 n
-0000473695 00000 n
-0000474438 00000 n
-0000474642 00000 n
-0000477110 00000 n
-0000474854 00000 n
-0000474960 00000 n
-0000477350 00000 n
-0000478033 00000 n
-0000478237 00000 n
-0000487392 00000 n
-0000478716 00000 n
-0000478837 00000 n
-0000487633 00000 n
-0000488626 00000 n
-0000488831 00000 n
-0000490841 00000 n
-0000488945 00000 n
-0000489049 00000 n
-0000491083 00000 n
-0000491729 00000 n
-0000491934 00000 n
-0000494352 00000 n
-0000492170 00000 n
-0000492276 00000 n
-0000494593 00000 n
-0000495292 00000 n
-0000495497 00000 n
-0000504730 00000 n
-0000496048 00000 n
-0000496174 00000 n
-0000504972 00000 n
-0000505958 00000 n
-0000506164 00000 n
-0000512185 00000 n
-0000506556 00000 n
-0000506664 00000 n
-0000512425 00000 n
-0000513247 00000 n
-0000513450 00000 n
-0000514499 00000 n
-0000513528 00000 n
-0000513628 00000 n
-0000514739 00000 n
-0000515361 00000 n
-0000515565 00000 n
-0000519551 00000 n
-0000515855 00000 n
-0000515961 00000 n
-0000519792 00000 n
-0000520525 00000 n
-0000520730 00000 n
-0000522289 00000 n
-0000520823 00000 n
-0000520924 00000 n
-0000522528 00000 n
-0000523154 00000 n
-0000523356 00000 n
-0000525593 00000 n
-0000523535 00000 n
-0000523641 00000 n
-0000525834 00000 n
-0000526503 00000 n
-0000526708 00000 n
-0000529498 00000 n
-0000526903 00000 n
-0000527010 00000 n
-0000529740 00000 n
-0000530436 00000 n
-0000530642 00000 n
-0000530730 00000 n
-0000531774 00000 n
-0000530808 00000 n
-0000530908 00000 n
-0000532015 00000 n
-0000532639 00000 n
-0000532844 00000 n
-0000534647 00000 n
-0000532955 00000 n
-0000533058 00000 n
-0000534889 00000 n
-0000535532 00000 n
-0000542709 00000 n
-0000535738 00000 n
-0000546482 00000 n
-0000542942 00000 n
-0000549242 00000 n
-0000546762 00000 n
-0000572900 00000 n
-0000549483 00000 n
-0000587282 00000 n
-0000573207 00000 n
-0000590554 00000 n
-0000587520 00000 n
-0000593320 00000 n
-0000590820 00000 n
-0000596208 00000 n
-0000596325 00000 n
-0000601463 00000 n
-0000602128 00000 n
-0000602797 00000 n
-0000603466 00000 n
-0000604132 00000 n
-0000604801 00000 n
-0000605469 00000 n
-0000606140 00000 n
-0000606804 00000 n
-0000607473 00000 n
-0000608142 00000 n
-0000608808 00000 n
-0000609477 00000 n
-0000610146 00000 n
-0000610811 00000 n
-0000611482 00000 n
-0000612150 00000 n
-0000612819 00000 n
-0000613485 00000 n
-0000614154 00000 n
-0000614823 00000 n
-0000615489 00000 n
-0000616158 00000 n
-0000616826 00000 n
-0000617497 00000 n
-0000618162 00000 n
-0000618831 00000 n
-0000619500 00000 n
-0000620166 00000 n
-0000620835 00000 n
-0000621504 00000 n
-0000622157 00000 n
-0000622761 00000 n
-0000623367 00000 n
-0000623973 00000 n
-0000624576 00000 n
-0000625183 00000 n
-0000625788 00000 n
-0000626394 00000 n
-0000626998 00000 n
-0000627604 00000 n
-0000628210 00000 n
-0000628814 00000 n
-0000629444 00000 n
-0000630078 00000 n
-0000630715 00000 n
-0000631345 00000 n
-0000631980 00000 n
-0000632615 00000 n
-0000633247 00000 n
-0000633882 00000 n
-0000634517 00000 n
-0000635148 00000 n
-0000635785 00000 n
-0000636419 00000 n
-0000637054 00000 n
-0000637686 00000 n
-0000638321 00000 n
-0000638956 00000 n
-0000639618 00000 n
-0000640409 00000 n
-0000641057 00000 n
-0000641738 00000 n
-0000642529 00000 n
-0000643511 00000 n
-0000644148 00000 n
-0000644503 00000 n
-0000644871 00000 n
-0000644960 00000 n
-0000645054 00000 n
-0000645094 00000 n
-0000645226 00000 n
+0000018024 00000 n
+0000018086 00000 n
+0000535771 00000 n
+0000532879 00000 n
+0000594841 00000 n
+0000530675 00000 n
+0000526754 00000 n
+0000523408 00000 n
+0000520776 00000 n
+0000515613 00000 n
+0000513500 00000 n
+0000506208 00000 n
+0000495543 00000 n
+0000491980 00000 n
+0000488877 00000 n
+0000478285 00000 n
+0000474690 00000 n
+0000595199 00000 n
+0000594481 00000 n
+0000594662 00000 n
+0000595375 00000 n
+0000595021 00000 n
+0000468814 00000 n
+0000460806 00000 n
+0000456571 00000 n
+0000018208 00000 n
+0000453461 00000 n
+0000450043 00000 n
+0000017836 00000 n
+0000018271 00000 n
+0000595549 00000 n
+0000017280 00000 n
+0000022581 00000 n
+0000022742 00000 n
+0000022903 00000 n
+0000023426 00000 n
+0000022399 00000 n
+0000018770 00000 n
+0000023059 00000 n
+0000442465 00000 n
+0000435845 00000 n
+0000023363 00000 n
+0000022536 00000 n
+0000028167 00000 n
+0000028323 00000 n
+0000028786 00000 n
+0000027993 00000 n
+0000023667 00000 n
+0000028478 00000 n
+0000427433 00000 n
+0000028662 00000 n
+0000028724 00000 n
+0000028130 00000 n
+0000033154 00000 n
+0000033315 00000 n
+0000033475 00000 n
+0000033630 00000 n
+0000033786 00000 n
+0000033952 00000 n
+0000034306 00000 n
+0000032948 00000 n
+0000029079 00000 n
+0000034118 00000 n
+0000424637 00000 n
+0000421193 00000 n
+0000034180 00000 n
+0000034243 00000 n
+0000033085 00000 n
+0000039639 00000 n
+0000039800 00000 n
+0000039956 00000 n
+0000040114 00000 n
+0000040269 00000 n
+0000040694 00000 n
+0000039441 00000 n
+0000034573 00000 n
+0000040447 00000 n
+0000409843 00000 n
+0000040570 00000 n
+0000040633 00000 n
+0000039578 00000 n
+0000094167 00000 n
+0000044369 00000 n
+0000044530 00000 n
+0000044936 00000 n
+0000044195 00000 n
+0000041052 00000 n
+0000044691 00000 n
+0000044332 00000 n
+0000047327 00000 n
+0000047144 00000 n
+0000045164 00000 n
+0000047265 00000 n
+0000051297 00000 n
+0000051458 00000 n
+0000051619 00000 n
+0000051780 00000 n
+0000051941 00000 n
+0000052405 00000 n
+0000051099 00000 n
+0000047503 00000 n
+0000052097 00000 n
+0000052342 00000 n
+0000051236 00000 n
+0000055659 00000 n
+0000055415 00000 n
+0000052659 00000 n
+0000055536 00000 n
+0000059734 00000 n
+0000059891 00000 n
+0000060048 00000 n
+0000060204 00000 n
+0000060857 00000 n
+0000059544 00000 n
+0000055874 00000 n
+0000060361 00000 n
+0000060605 00000 n
+0000060668 00000 n
+0000060731 00000 n
+0000060794 00000 n
+0000059681 00000 n
+0000064031 00000 n
+0000063787 00000 n
+0000061111 00000 n
+0000063908 00000 n
+0000595702 00000 n
+0000067895 00000 n
+0000068358 00000 n
+0000067729 00000 n
+0000064220 00000 n
+0000068052 00000 n
+0000068295 00000 n
+0000067866 00000 n
+0000073269 00000 n
+0000073429 00000 n
+0000073897 00000 n
+0000073095 00000 n
+0000068625 00000 n
+0000073589 00000 n
+0000073232 00000 n
+0000077471 00000 n
+0000077226 00000 n
+0000074138 00000 n
+0000077347 00000 n
+0000081334 00000 n
+0000081495 00000 n
+0000081656 00000 n
+0000081813 00000 n
+0000082217 00000 n
+0000081144 00000 n
+0000077660 00000 n
+0000081969 00000 n
+0000082093 00000 n
+0000082155 00000 n
+0000081281 00000 n
+0000086118 00000 n
+0000086275 00000 n
+0000086432 00000 n
+0000086589 00000 n
+0000086746 00000 n
+0000086907 00000 n
+0000087068 00000 n
+0000087225 00000 n
+0000087838 00000 n
+0000085896 00000 n
+0000082458 00000 n
+0000087402 00000 n
+0000406151 00000 n
+0000087464 00000 n
+0000087527 00000 n
+0000087652 00000 n
+0000087715 00000 n
+0000087777 00000 n
+0000086033 00000 n
+0000090816 00000 n
+0000090571 00000 n
+0000088105 00000 n
+0000090692 00000 n
+0000403952 00000 n
+0000391779 00000 n
+0000377040 00000 n
+0000091825 00000 n
+0000091642 00000 n
+0000091044 00000 n
+0000091763 00000 n
+0000094229 00000 n
+0000093984 00000 n
+0000091962 00000 n
+0000094105 00000 n
+0000098244 00000 n
+0000098401 00000 n
+0000098557 00000 n
+0000098714 00000 n
+0000099307 00000 n
+0000098054 00000 n
+0000094392 00000 n
+0000098871 00000 n
+0000099057 00000 n
+0000099120 00000 n
+0000099183 00000 n
+0000099246 00000 n
+0000098191 00000 n
+0000105034 00000 n
+0000102276 00000 n
+0000099600 00000 n
+0000102397 00000 n
+0000594336 00000 n
+0000102583 00000 n
+0000102646 00000 n
+0000102709 00000 n
+0000102772 00000 n
+0000102835 00000 n
+0000102898 00000 n
+0000102961 00000 n
+0000103022 00000 n
+0000103085 00000 n
+0000103148 00000 n
+0000103211 00000 n
+0000103274 00000 n
+0000103337 00000 n
+0000103399 00000 n
+0000103462 00000 n
+0000103525 00000 n
+0000103588 00000 n
+0000103651 00000 n
+0000103714 00000 n
+0000103777 00000 n
+0000103840 00000 n
+0000103903 00000 n
+0000103966 00000 n
+0000104029 00000 n
+0000104092 00000 n
+0000104155 00000 n
+0000104218 00000 n
+0000104281 00000 n
+0000104344 00000 n
+0000104407 00000 n
+0000104469 00000 n
+0000104532 00000 n
+0000104595 00000 n
+0000104658 00000 n
+0000104721 00000 n
+0000104784 00000 n
+0000104847 00000 n
+0000104910 00000 n
+0000104972 00000 n
+0000595855 00000 n
+0000110843 00000 n
+0000107391 00000 n
+0000105237 00000 n
+0000107512 00000 n
+0000107574 00000 n
+0000107637 00000 n
+0000107699 00000 n
+0000107762 00000 n
+0000107825 00000 n
+0000107887 00000 n
+0000107949 00000 n
+0000108012 00000 n
+0000108075 00000 n
+0000108138 00000 n
+0000108201 00000 n
+0000108264 00000 n
+0000108327 00000 n
+0000108390 00000 n
+0000108453 00000 n
+0000108515 00000 n
+0000108578 00000 n
+0000108641 00000 n
+0000108704 00000 n
+0000108767 00000 n
+0000108830 00000 n
+0000108893 00000 n
+0000108956 00000 n
+0000109019 00000 n
+0000109082 00000 n
+0000109145 00000 n
+0000109208 00000 n
+0000109271 00000 n
+0000109334 00000 n
+0000109397 00000 n
+0000109460 00000 n
+0000109523 00000 n
+0000109586 00000 n
+0000109649 00000 n
+0000109711 00000 n
+0000109774 00000 n
+0000109837 00000 n
+0000109900 00000 n
+0000109963 00000 n
+0000110026 00000 n
+0000110089 00000 n
+0000110152 00000 n
+0000110215 00000 n
+0000110278 00000 n
+0000110341 00000 n
+0000110403 00000 n
+0000110466 00000 n
+0000110529 00000 n
+0000110592 00000 n
+0000110655 00000 n
+0000110718 00000 n
+0000110781 00000 n
+0000116080 00000 n
+0000114076 00000 n
+0000111006 00000 n
+0000114197 00000 n
+0000114259 00000 n
+0000114322 00000 n
+0000114384 00000 n
+0000114447 00000 n
+0000114510 00000 n
+0000114573 00000 n
+0000114636 00000 n
+0000114699 00000 n
+0000114762 00000 n
+0000114825 00000 n
+0000114888 00000 n
+0000114949 00000 n
+0000115012 00000 n
+0000115075 00000 n
+0000115138 00000 n
+0000115201 00000 n
+0000115264 00000 n
+0000115327 00000 n
+0000115452 00000 n
+0000115515 00000 n
+0000115578 00000 n
+0000115641 00000 n
+0000115704 00000 n
+0000115767 00000 n
+0000115830 00000 n
+0000115893 00000 n
+0000115956 00000 n
+0000116018 00000 n
+0000120669 00000 n
+0000118726 00000 n
+0000116282 00000 n
+0000118847 00000 n
+0000118909 00000 n
+0000118972 00000 n
+0000119035 00000 n
+0000119096 00000 n
+0000119159 00000 n
+0000119222 00000 n
+0000119285 00000 n
+0000119348 00000 n
+0000119411 00000 n
+0000119474 00000 n
+0000119537 00000 n
+0000119599 00000 n
+0000119662 00000 n
+0000119725 00000 n
+0000119788 00000 n
+0000119851 00000 n
+0000119914 00000 n
+0000119977 00000 n
+0000120040 00000 n
+0000120103 00000 n
+0000120166 00000 n
+0000120229 00000 n
+0000120291 00000 n
+0000120354 00000 n
+0000120417 00000 n
+0000120480 00000 n
+0000120543 00000 n
+0000120606 00000 n
+0000125512 00000 n
+0000123251 00000 n
+0000120832 00000 n
+0000123372 00000 n
+0000123434 00000 n
+0000123497 00000 n
+0000123560 00000 n
+0000123623 00000 n
+0000123686 00000 n
+0000123749 00000 n
+0000123812 00000 n
+0000123875 00000 n
+0000123938 00000 n
+0000124001 00000 n
+0000124064 00000 n
+0000124127 00000 n
+0000124190 00000 n
+0000124252 00000 n
+0000124315 00000 n
+0000124378 00000 n
+0000124441 00000 n
+0000124504 00000 n
+0000124567 00000 n
+0000124630 00000 n
+0000124693 00000 n
+0000124756 00000 n
+0000124819 00000 n
+0000124882 00000 n
+0000124945 00000 n
+0000125008 00000 n
+0000125071 00000 n
+0000125134 00000 n
+0000125197 00000 n
+0000125260 00000 n
+0000125323 00000 n
+0000125386 00000 n
+0000125449 00000 n
+0000130916 00000 n
+0000127651 00000 n
+0000125688 00000 n
+0000127772 00000 n
+0000127834 00000 n
+0000127897 00000 n
+0000127960 00000 n
+0000128023 00000 n
+0000128086 00000 n
+0000128149 00000 n
+0000128212 00000 n
+0000128275 00000 n
+0000128338 00000 n
+0000128401 00000 n
+0000128464 00000 n
+0000128527 00000 n
+0000128590 00000 n
+0000128653 00000 n
+0000128716 00000 n
+0000128779 00000 n
+0000128841 00000 n
+0000128904 00000 n
+0000128967 00000 n
+0000129030 00000 n
+0000129093 00000 n
+0000129156 00000 n
+0000129219 00000 n
+0000129282 00000 n
+0000129345 00000 n
+0000129408 00000 n
+0000129471 00000 n
+0000129533 00000 n
+0000129596 00000 n
+0000129659 00000 n
+0000129722 00000 n
+0000129785 00000 n
+0000129848 00000 n
+0000129911 00000 n
+0000129974 00000 n
+0000130037 00000 n
+0000130100 00000 n
+0000130163 00000 n
+0000130225 00000 n
+0000130288 00000 n
+0000130351 00000 n
+0000130414 00000 n
+0000130477 00000 n
+0000130540 00000 n
+0000130603 00000 n
+0000130666 00000 n
+0000130729 00000 n
+0000130792 00000 n
+0000130854 00000 n
+0000137041 00000 n
+0000133591 00000 n
+0000131079 00000 n
+0000133712 00000 n
+0000133836 00000 n
+0000133898 00000 n
+0000133961 00000 n
+0000134024 00000 n
+0000134087 00000 n
+0000134150 00000 n
+0000134213 00000 n
+0000134276 00000 n
+0000134339 00000 n
+0000134402 00000 n
+0000134465 00000 n
+0000134528 00000 n
+0000134590 00000 n
+0000134653 00000 n
+0000134716 00000 n
+0000134779 00000 n
+0000134842 00000 n
+0000134905 00000 n
+0000134968 00000 n
+0000135031 00000 n
+0000135094 00000 n
+0000135156 00000 n
+0000135219 00000 n
+0000135282 00000 n
+0000135345 00000 n
+0000135408 00000 n
+0000135471 00000 n
+0000135533 00000 n
+0000135596 00000 n
+0000135659 00000 n
+0000135722 00000 n
+0000135785 00000 n
+0000135848 00000 n
+0000135911 00000 n
+0000135974 00000 n
+0000136037 00000 n
+0000136099 00000 n
+0000136162 00000 n
+0000136225 00000 n
+0000136288 00000 n
+0000136351 00000 n
+0000136414 00000 n
+0000136477 00000 n
+0000136540 00000 n
+0000136603 00000 n
+0000136665 00000 n
+0000136728 00000 n
+0000136791 00000 n
+0000136854 00000 n
+0000136917 00000 n
+0000136979 00000 n
+0000143288 00000 n
+0000139774 00000 n
+0000137217 00000 n
+0000139895 00000 n
+0000139957 00000 n
+0000140020 00000 n
+0000140082 00000 n
+0000140145 00000 n
+0000140208 00000 n
+0000140271 00000 n
+0000140334 00000 n
+0000140397 00000 n
+0000140460 00000 n
+0000140523 00000 n
+0000140586 00000 n
+0000140649 00000 n
+0000140712 00000 n
+0000140775 00000 n
+0000140837 00000 n
+0000140900 00000 n
+0000140963 00000 n
+0000141026 00000 n
+0000141089 00000 n
+0000141152 00000 n
+0000141215 00000 n
+0000141278 00000 n
+0000141341 00000 n
+0000141404 00000 n
+0000141467 00000 n
+0000141530 00000 n
+0000141593 00000 n
+0000141656 00000 n
+0000141719 00000 n
+0000141782 00000 n
+0000141845 00000 n
+0000141908 00000 n
+0000141971 00000 n
+0000142032 00000 n
+0000142095 00000 n
+0000142158 00000 n
+0000142221 00000 n
+0000142284 00000 n
+0000142347 00000 n
+0000142410 00000 n
+0000142473 00000 n
+0000142535 00000 n
+0000142598 00000 n
+0000142661 00000 n
+0000142724 00000 n
+0000142787 00000 n
+0000142850 00000 n
+0000142913 00000 n
+0000142976 00000 n
+0000143038 00000 n
+0000143101 00000 n
+0000143164 00000 n
+0000143226 00000 n
+0000148875 00000 n
+0000145488 00000 n
+0000143451 00000 n
+0000145609 00000 n
+0000145671 00000 n
+0000145734 00000 n
+0000145796 00000 n
+0000145859 00000 n
+0000145921 00000 n
+0000145984 00000 n
+0000146047 00000 n
+0000146110 00000 n
+0000146173 00000 n
+0000146236 00000 n
+0000146299 00000 n
+0000146362 00000 n
+0000146425 00000 n
+0000146488 00000 n
+0000146551 00000 n
+0000146614 00000 n
+0000146677 00000 n
+0000146740 00000 n
+0000146803 00000 n
+0000146866 00000 n
+0000146929 00000 n
+0000146992 00000 n
+0000147054 00000 n
+0000147117 00000 n
+0000147180 00000 n
+0000147243 00000 n
+0000147306 00000 n
+0000147369 00000 n
+0000147432 00000 n
+0000147495 00000 n
+0000147558 00000 n
+0000147620 00000 n
+0000147683 00000 n
+0000147746 00000 n
+0000147809 00000 n
+0000147872 00000 n
+0000147935 00000 n
+0000147998 00000 n
+0000148061 00000 n
+0000148124 00000 n
+0000148185 00000 n
+0000148248 00000 n
+0000148311 00000 n
+0000148374 00000 n
+0000148499 00000 n
+0000148562 00000 n
+0000148625 00000 n
+0000148688 00000 n
+0000148751 00000 n
+0000148813 00000 n
+0000155137 00000 n
+0000151245 00000 n
+0000149064 00000 n
+0000151366 00000 n
+0000151428 00000 n
+0000151491 00000 n
+0000151553 00000 n
+0000151616 00000 n
+0000151679 00000 n
+0000151742 00000 n
+0000151805 00000 n
+0000151868 00000 n
+0000151931 00000 n
+0000151994 00000 n
+0000152057 00000 n
+0000152119 00000 n
+0000152182 00000 n
+0000152245 00000 n
+0000152308 00000 n
+0000152371 00000 n
+0000152434 00000 n
+0000152497 00000 n
+0000152560 00000 n
+0000152623 00000 n
+0000152685 00000 n
+0000152748 00000 n
+0000152811 00000 n
+0000152874 00000 n
+0000152937 00000 n
+0000153000 00000 n
+0000153063 00000 n
+0000153126 00000 n
+0000153189 00000 n
+0000153251 00000 n
+0000153314 00000 n
+0000153377 00000 n
+0000153440 00000 n
+0000153503 00000 n
+0000153566 00000 n
+0000153629 00000 n
+0000153692 00000 n
+0000153755 00000 n
+0000153817 00000 n
+0000153880 00000 n
+0000153943 00000 n
+0000154006 00000 n
+0000154069 00000 n
+0000154132 00000 n
+0000154195 00000 n
+0000154258 00000 n
+0000154321 00000 n
+0000154383 00000 n
+0000154446 00000 n
+0000154509 00000 n
+0000154572 00000 n
+0000154635 00000 n
+0000154698 00000 n
+0000154761 00000 n
+0000154824 00000 n
+0000154887 00000 n
+0000154949 00000 n
+0000155012 00000 n
+0000155075 00000 n
+0000160772 00000 n
+0000157449 00000 n
+0000155300 00000 n
+0000157570 00000 n
+0000157694 00000 n
+0000157756 00000 n
+0000157818 00000 n
+0000157881 00000 n
+0000157944 00000 n
+0000158007 00000 n
+0000158070 00000 n
+0000158133 00000 n
+0000158196 00000 n
+0000158259 00000 n
+0000158384 00000 n
+0000158447 00000 n
+0000158510 00000 n
+0000158573 00000 n
+0000158636 00000 n
+0000158699 00000 n
+0000158762 00000 n
+0000158825 00000 n
+0000158887 00000 n
+0000158950 00000 n
+0000159013 00000 n
+0000159076 00000 n
+0000159139 00000 n
+0000159202 00000 n
+0000159265 00000 n
+0000159328 00000 n
+0000159391 00000 n
+0000159454 00000 n
+0000159516 00000 n
+0000159579 00000 n
+0000159642 00000 n
+0000159705 00000 n
+0000159768 00000 n
+0000159831 00000 n
+0000159894 00000 n
+0000159957 00000 n
+0000160020 00000 n
+0000160082 00000 n
+0000160207 00000 n
+0000160270 00000 n
+0000160333 00000 n
+0000160396 00000 n
+0000160459 00000 n
+0000160522 00000 n
+0000160585 00000 n
+0000160648 00000 n
+0000160710 00000 n
+0000596008 00000 n
+0000166727 00000 n
+0000163060 00000 n
+0000160948 00000 n
+0000163181 00000 n
+0000163243 00000 n
+0000163306 00000 n
+0000163368 00000 n
+0000163431 00000 n
+0000163494 00000 n
+0000163557 00000 n
+0000163620 00000 n
+0000163683 00000 n
+0000163746 00000 n
+0000163809 00000 n
+0000163872 00000 n
+0000163934 00000 n
+0000163997 00000 n
+0000164060 00000 n
+0000164123 00000 n
+0000164186 00000 n
+0000164249 00000 n
+0000164312 00000 n
+0000164375 00000 n
+0000164437 00000 n
+0000164500 00000 n
+0000164563 00000 n
+0000164626 00000 n
+0000164689 00000 n
+0000164752 00000 n
+0000164815 00000 n
+0000164878 00000 n
+0000164940 00000 n
+0000165004 00000 n
+0000165068 00000 n
+0000165132 00000 n
+0000165196 00000 n
+0000165260 00000 n
+0000165324 00000 n
+0000165388 00000 n
+0000165452 00000 n
+0000165515 00000 n
+0000165579 00000 n
+0000165643 00000 n
+0000165707 00000 n
+0000165771 00000 n
+0000165835 00000 n
+0000165899 00000 n
+0000165962 00000 n
+0000166026 00000 n
+0000166090 00000 n
+0000166154 00000 n
+0000166218 00000 n
+0000166282 00000 n
+0000166346 00000 n
+0000166410 00000 n
+0000166474 00000 n
+0000166537 00000 n
+0000166601 00000 n
+0000166664 00000 n
+0000172943 00000 n
+0000169058 00000 n
+0000166890 00000 n
+0000169182 00000 n
+0000169246 00000 n
+0000169311 00000 n
+0000169375 00000 n
+0000169440 00000 n
+0000169505 00000 n
+0000169570 00000 n
+0000169635 00000 n
+0000169700 00000 n
+0000169765 00000 n
+0000169830 00000 n
+0000169895 00000 n
+0000169959 00000 n
+0000170024 00000 n
+0000170089 00000 n
+0000170154 00000 n
+0000170219 00000 n
+0000170284 00000 n
+0000170349 00000 n
+0000170413 00000 n
+0000170478 00000 n
+0000170543 00000 n
+0000170608 00000 n
+0000170673 00000 n
+0000170738 00000 n
+0000170803 00000 n
+0000170868 00000 n
+0000170933 00000 n
+0000170997 00000 n
+0000171062 00000 n
+0000171127 00000 n
+0000171192 00000 n
+0000171257 00000 n
+0000171322 00000 n
+0000171387 00000 n
+0000171452 00000 n
+0000171517 00000 n
+0000171581 00000 n
+0000171646 00000 n
+0000171711 00000 n
+0000171776 00000 n
+0000171841 00000 n
+0000171906 00000 n
+0000171971 00000 n
+0000172036 00000 n
+0000172101 00000 n
+0000172166 00000 n
+0000172231 00000 n
+0000172296 00000 n
+0000172361 00000 n
+0000172426 00000 n
+0000172491 00000 n
+0000172556 00000 n
+0000172621 00000 n
+0000172685 00000 n
+0000172750 00000 n
+0000172815 00000 n
+0000172879 00000 n
+0000179206 00000 n
+0000175583 00000 n
+0000173107 00000 n
+0000175707 00000 n
+0000175771 00000 n
+0000175836 00000 n
+0000175900 00000 n
+0000175965 00000 n
+0000176030 00000 n
+0000176094 00000 n
+0000176159 00000 n
+0000176224 00000 n
+0000176289 00000 n
+0000176354 00000 n
+0000176419 00000 n
+0000176483 00000 n
+0000176548 00000 n
+0000176613 00000 n
+0000176678 00000 n
+0000176743 00000 n
+0000176808 00000 n
+0000176873 00000 n
+0000176938 00000 n
+0000177003 00000 n
+0000177067 00000 n
+0000177132 00000 n
+0000177197 00000 n
+0000177262 00000 n
+0000177327 00000 n
+0000177392 00000 n
+0000177457 00000 n
+0000177522 00000 n
+0000177587 00000 n
+0000177652 00000 n
+0000177717 00000 n
+0000177782 00000 n
+0000177847 00000 n
+0000177912 00000 n
+0000177977 00000 n
+0000178040 00000 n
+0000178105 00000 n
+0000178170 00000 n
+0000178235 00000 n
+0000178300 00000 n
+0000178365 00000 n
+0000178430 00000 n
+0000178495 00000 n
+0000178560 00000 n
+0000178624 00000 n
+0000178689 00000 n
+0000178754 00000 n
+0000178819 00000 n
+0000178883 00000 n
+0000178948 00000 n
+0000179013 00000 n
+0000179078 00000 n
+0000179142 00000 n
+0000185615 00000 n
+0000182056 00000 n
+0000179370 00000 n
+0000182180 00000 n
+0000182244 00000 n
+0000182309 00000 n
+0000182373 00000 n
+0000182438 00000 n
+0000182503 00000 n
+0000182568 00000 n
+0000182633 00000 n
+0000182698 00000 n
+0000182763 00000 n
+0000182828 00000 n
+0000182893 00000 n
+0000182957 00000 n
+0000183022 00000 n
+0000183087 00000 n
+0000183151 00000 n
+0000183216 00000 n
+0000183281 00000 n
+0000183346 00000 n
+0000183411 00000 n
+0000183476 00000 n
+0000183541 00000 n
+0000183605 00000 n
+0000183670 00000 n
+0000183735 00000 n
+0000183800 00000 n
+0000183865 00000 n
+0000183930 00000 n
+0000183995 00000 n
+0000184059 00000 n
+0000184124 00000 n
+0000184189 00000 n
+0000184254 00000 n
+0000184319 00000 n
+0000184384 00000 n
+0000184449 00000 n
+0000184514 00000 n
+0000184579 00000 n
+0000184643 00000 n
+0000184708 00000 n
+0000184773 00000 n
+0000184838 00000 n
+0000184903 00000 n
+0000184968 00000 n
+0000185033 00000 n
+0000185098 00000 n
+0000185163 00000 n
+0000185227 00000 n
+0000185292 00000 n
+0000185357 00000 n
+0000185422 00000 n
+0000185487 00000 n
+0000185551 00000 n
+0000191373 00000 n
+0000188336 00000 n
+0000185792 00000 n
+0000188460 00000 n
+0000188524 00000 n
+0000188589 00000 n
+0000188653 00000 n
+0000188718 00000 n
+0000188783 00000 n
+0000188848 00000 n
+0000188913 00000 n
+0000188978 00000 n
+0000189043 00000 n
+0000189108 00000 n
+0000189173 00000 n
+0000189237 00000 n
+0000189302 00000 n
+0000189367 00000 n
+0000189432 00000 n
+0000189497 00000 n
+0000189562 00000 n
+0000189627 00000 n
+0000189692 00000 n
+0000189757 00000 n
+0000189822 00000 n
+0000189887 00000 n
+0000189952 00000 n
+0000190017 00000 n
+0000190082 00000 n
+0000190147 00000 n
+0000190212 00000 n
+0000190275 00000 n
+0000190340 00000 n
+0000190405 00000 n
+0000190470 00000 n
+0000190535 00000 n
+0000190600 00000 n
+0000190665 00000 n
+0000190730 00000 n
+0000190795 00000 n
+0000190860 00000 n
+0000190925 00000 n
+0000190986 00000 n
+0000191051 00000 n
+0000191116 00000 n
+0000191181 00000 n
+0000191309 00000 n
+0000197605 00000 n
+0000193528 00000 n
+0000191563 00000 n
+0000193652 00000 n
+0000193716 00000 n
+0000193779 00000 n
+0000193844 00000 n
+0000193909 00000 n
+0000193974 00000 n
+0000194039 00000 n
+0000194104 00000 n
+0000194169 00000 n
+0000194234 00000 n
+0000194299 00000 n
+0000194363 00000 n
+0000194428 00000 n
+0000194493 00000 n
+0000194558 00000 n
+0000194623 00000 n
+0000194688 00000 n
+0000194753 00000 n
+0000194818 00000 n
+0000194883 00000 n
+0000194947 00000 n
+0000195012 00000 n
+0000195077 00000 n
+0000195142 00000 n
+0000195207 00000 n
+0000195272 00000 n
+0000195337 00000 n
+0000195402 00000 n
+0000195467 00000 n
+0000195531 00000 n
+0000195596 00000 n
+0000195661 00000 n
+0000195726 00000 n
+0000195791 00000 n
+0000195856 00000 n
+0000195921 00000 n
+0000195986 00000 n
+0000196051 00000 n
+0000196116 00000 n
+0000196180 00000 n
+0000196245 00000 n
+0000196310 00000 n
+0000196375 00000 n
+0000196440 00000 n
+0000196505 00000 n
+0000196570 00000 n
+0000196635 00000 n
+0000196700 00000 n
+0000196763 00000 n
+0000196828 00000 n
+0000196893 00000 n
+0000196958 00000 n
+0000197023 00000 n
+0000197088 00000 n
+0000197153 00000 n
+0000197218 00000 n
+0000197283 00000 n
+0000197347 00000 n
+0000197412 00000 n
+0000197477 00000 n
+0000197541 00000 n
+0000203502 00000 n
+0000199686 00000 n
+0000197756 00000 n
+0000199810 00000 n
+0000199874 00000 n
+0000199939 00000 n
+0000200003 00000 n
+0000200068 00000 n
+0000200133 00000 n
+0000200198 00000 n
+0000200263 00000 n
+0000200328 00000 n
+0000200393 00000 n
+0000200457 00000 n
+0000200522 00000 n
+0000200587 00000 n
+0000200652 00000 n
+0000200717 00000 n
+0000200782 00000 n
+0000200847 00000 n
+0000200912 00000 n
+0000200977 00000 n
+0000201041 00000 n
+0000201106 00000 n
+0000201171 00000 n
+0000201236 00000 n
+0000201301 00000 n
+0000201366 00000 n
+0000201431 00000 n
+0000201496 00000 n
+0000201561 00000 n
+0000201625 00000 n
+0000201690 00000 n
+0000201755 00000 n
+0000201820 00000 n
+0000201885 00000 n
+0000201950 00000 n
+0000202015 00000 n
+0000202080 00000 n
+0000202145 00000 n
+0000202272 00000 n
+0000202337 00000 n
+0000202401 00000 n
+0000202466 00000 n
+0000202531 00000 n
+0000202596 00000 n
+0000202661 00000 n
+0000202726 00000 n
+0000202791 00000 n
+0000202856 00000 n
+0000202921 00000 n
+0000202984 00000 n
+0000203049 00000 n
+0000203114 00000 n
+0000203179 00000 n
+0000203244 00000 n
+0000203309 00000 n
+0000203374 00000 n
+0000203438 00000 n
+0000209100 00000 n
+0000206576 00000 n
+0000203666 00000 n
+0000206700 00000 n
+0000206764 00000 n
+0000206829 00000 n
+0000206893 00000 n
+0000206958 00000 n
+0000207023 00000 n
+0000207088 00000 n
+0000207153 00000 n
+0000207218 00000 n
+0000207283 00000 n
+0000207348 00000 n
+0000207413 00000 n
+0000207541 00000 n
+0000207606 00000 n
+0000207671 00000 n
+0000207736 00000 n
+0000207801 00000 n
+0000207866 00000 n
+0000207931 00000 n
+0000207996 00000 n
+0000208061 00000 n
+0000208126 00000 n
+0000208191 00000 n
+0000208256 00000 n
+0000208321 00000 n
+0000208386 00000 n
+0000208451 00000 n
+0000208515 00000 n
+0000208580 00000 n
+0000208645 00000 n
+0000208710 00000 n
+0000208775 00000 n
+0000208840 00000 n
+0000208905 00000 n
+0000208970 00000 n
+0000209035 00000 n
+0000215313 00000 n
+0000211500 00000 n
+0000209290 00000 n
+0000211624 00000 n
+0000211688 00000 n
+0000211753 00000 n
+0000211817 00000 n
+0000211882 00000 n
+0000211947 00000 n
+0000212012 00000 n
+0000212076 00000 n
+0000212141 00000 n
+0000212206 00000 n
+0000212270 00000 n
+0000212335 00000 n
+0000212400 00000 n
+0000212465 00000 n
+0000212530 00000 n
+0000212595 00000 n
+0000212723 00000 n
+0000212787 00000 n
+0000212852 00000 n
+0000212917 00000 n
+0000212982 00000 n
+0000213047 00000 n
+0000213112 00000 n
+0000213177 00000 n
+0000213242 00000 n
+0000213307 00000 n
+0000213434 00000 n
+0000213499 00000 n
+0000213564 00000 n
+0000213629 00000 n
+0000213694 00000 n
+0000213759 00000 n
+0000213824 00000 n
+0000213888 00000 n
+0000213953 00000 n
+0000214018 00000 n
+0000214083 00000 n
+0000214148 00000 n
+0000214213 00000 n
+0000214278 00000 n
+0000214343 00000 n
+0000214408 00000 n
+0000214471 00000 n
+0000214536 00000 n
+0000214601 00000 n
+0000214666 00000 n
+0000214731 00000 n
+0000214796 00000 n
+0000214861 00000 n
+0000214926 00000 n
+0000214991 00000 n
+0000215055 00000 n
+0000215120 00000 n
+0000215185 00000 n
+0000215249 00000 n
+0000220615 00000 n
+0000217638 00000 n
+0000215490 00000 n
+0000217763 00000 n
+0000217827 00000 n
+0000217892 00000 n
+0000217956 00000 n
+0000218021 00000 n
+0000218086 00000 n
+0000218151 00000 n
+0000218216 00000 n
+0000218281 00000 n
+0000218346 00000 n
+0000218411 00000 n
+0000218476 00000 n
+0000218541 00000 n
+0000218606 00000 n
+0000218670 00000 n
+0000218735 00000 n
+0000218800 00000 n
+0000218865 00000 n
+0000218930 00000 n
+0000218995 00000 n
+0000219060 00000 n
+0000219125 00000 n
+0000219190 00000 n
+0000219255 00000 n
+0000219320 00000 n
+0000219385 00000 n
+0000219450 00000 n
+0000219515 00000 n
+0000219580 00000 n
+0000219645 00000 n
+0000219710 00000 n
+0000219838 00000 n
+0000219903 00000 n
+0000219968 00000 n
+0000220033 00000 n
+0000220097 00000 n
+0000220161 00000 n
+0000220226 00000 n
+0000220290 00000 n
+0000220355 00000 n
+0000220420 00000 n
+0000220485 00000 n
+0000220550 00000 n
+0000596169 00000 n
+0000229714 00000 n
+0000225857 00000 n
+0000224046 00000 n
+0000220792 00000 n
+0000224171 00000 n
+0000224298 00000 n
+0000224363 00000 n
+0000224428 00000 n
+0000224493 00000 n
+0000224558 00000 n
+0000224623 00000 n
+0000224687 00000 n
+0000224752 00000 n
+0000224817 00000 n
+0000224882 00000 n
+0000224947 00000 n
+0000225012 00000 n
+0000225077 00000 n
+0000225142 00000 n
+0000225207 00000 n
+0000225272 00000 n
+0000225337 00000 n
+0000225402 00000 n
+0000225467 00000 n
+0000225532 00000 n
+0000225597 00000 n
+0000225662 00000 n
+0000225727 00000 n
+0000225792 00000 n
+0000229870 00000 n
+0000231712 00000 n
+0000229532 00000 n
+0000226086 00000 n
+0000230028 00000 n
+0000230092 00000 n
+0000230157 00000 n
+0000230222 00000 n
+0000230287 00000 n
+0000230352 00000 n
+0000230417 00000 n
+0000230481 00000 n
+0000230546 00000 n
+0000230610 00000 n
+0000230675 00000 n
+0000230740 00000 n
+0000230805 00000 n
+0000230870 00000 n
+0000230935 00000 n
+0000231000 00000 n
+0000231065 00000 n
+0000231130 00000 n
+0000231194 00000 n
+0000231259 00000 n
+0000231324 00000 n
+0000231389 00000 n
+0000231454 00000 n
+0000231519 00000 n
+0000231584 00000 n
+0000231648 00000 n
+0000229674 00000 n
+0000237737 00000 n
+0000234634 00000 n
+0000231980 00000 n
+0000234759 00000 n
+0000234823 00000 n
+0000234888 00000 n
+0000234952 00000 n
+0000235017 00000 n
+0000235082 00000 n
+0000235147 00000 n
+0000235211 00000 n
+0000235276 00000 n
+0000235341 00000 n
+0000235406 00000 n
+0000235471 00000 n
+0000235536 00000 n
+0000235601 00000 n
+0000235666 00000 n
+0000235731 00000 n
+0000235858 00000 n
+0000235923 00000 n
+0000235988 00000 n
+0000236053 00000 n
+0000236118 00000 n
+0000236183 00000 n
+0000236248 00000 n
+0000236313 00000 n
+0000236378 00000 n
+0000236443 00000 n
+0000236508 00000 n
+0000236571 00000 n
+0000236636 00000 n
+0000236701 00000 n
+0000236766 00000 n
+0000236831 00000 n
+0000236896 00000 n
+0000236961 00000 n
+0000237026 00000 n
+0000237091 00000 n
+0000237155 00000 n
+0000237220 00000 n
+0000237285 00000 n
+0000237350 00000 n
+0000237415 00000 n
+0000237480 00000 n
+0000237545 00000 n
+0000237610 00000 n
+0000237674 00000 n
+0000244047 00000 n
+0000241070 00000 n
+0000237940 00000 n
+0000241195 00000 n
+0000241259 00000 n
+0000241324 00000 n
+0000241388 00000 n
+0000241453 00000 n
+0000241518 00000 n
+0000241583 00000 n
+0000241648 00000 n
+0000241713 00000 n
+0000241778 00000 n
+0000241843 00000 n
+0000241908 00000 n
+0000241972 00000 n
+0000242037 00000 n
+0000242102 00000 n
+0000242167 00000 n
+0000242232 00000 n
+0000242297 00000 n
+0000242362 00000 n
+0000242427 00000 n
+0000242492 00000 n
+0000242556 00000 n
+0000242621 00000 n
+0000242686 00000 n
+0000242751 00000 n
+0000242816 00000 n
+0000242881 00000 n
+0000242946 00000 n
+0000243011 00000 n
+0000243076 00000 n
+0000243140 00000 n
+0000243205 00000 n
+0000243270 00000 n
+0000243335 00000 n
+0000243400 00000 n
+0000243465 00000 n
+0000243530 00000 n
+0000243595 00000 n
+0000243660 00000 n
+0000243725 00000 n
+0000243789 00000 n
+0000243854 00000 n
+0000243919 00000 n
+0000243983 00000 n
+0000248070 00000 n
+0000248227 00000 n
+0000250197 00000 n
+0000247888 00000 n
+0000244250 00000 n
+0000248384 00000 n
+0000248448 00000 n
+0000248513 00000 n
+0000248577 00000 n
+0000248642 00000 n
+0000248707 00000 n
+0000248771 00000 n
+0000248836 00000 n
+0000248901 00000 n
+0000248965 00000 n
+0000249030 00000 n
+0000249095 00000 n
+0000249159 00000 n
+0000249224 00000 n
+0000249289 00000 n
+0000249354 00000 n
+0000249419 00000 n
+0000249484 00000 n
+0000249549 00000 n
+0000249614 00000 n
+0000249679 00000 n
+0000249744 00000 n
+0000249808 00000 n
+0000249873 00000 n
+0000249938 00000 n
+0000250003 00000 n
+0000250068 00000 n
+0000250133 00000 n
+0000248030 00000 n
+0000256286 00000 n
+0000252658 00000 n
+0000250478 00000 n
+0000252783 00000 n
+0000252847 00000 n
+0000252912 00000 n
+0000252976 00000 n
+0000253041 00000 n
+0000253106 00000 n
+0000253171 00000 n
+0000253236 00000 n
+0000253301 00000 n
+0000253366 00000 n
+0000253431 00000 n
+0000253496 00000 n
+0000253561 00000 n
+0000253626 00000 n
+0000253690 00000 n
+0000253755 00000 n
+0000253820 00000 n
+0000253885 00000 n
+0000253950 00000 n
+0000254015 00000 n
+0000254080 00000 n
+0000254145 00000 n
+0000254210 00000 n
+0000254274 00000 n
+0000254339 00000 n
+0000254404 00000 n
+0000254469 00000 n
+0000254534 00000 n
+0000254599 00000 n
+0000254664 00000 n
+0000254729 00000 n
+0000254794 00000 n
+0000254859 00000 n
+0000254924 00000 n
+0000254989 00000 n
+0000255054 00000 n
+0000255119 00000 n
+0000255184 00000 n
+0000255249 00000 n
+0000255314 00000 n
+0000255379 00000 n
+0000255444 00000 n
+0000255508 00000 n
+0000255572 00000 n
+0000255637 00000 n
+0000255702 00000 n
+0000255767 00000 n
+0000255832 00000 n
+0000255897 00000 n
+0000255962 00000 n
+0000256026 00000 n
+0000256091 00000 n
+0000256156 00000 n
+0000256221 00000 n
+0000262417 00000 n
+0000258401 00000 n
+0000256489 00000 n
+0000258526 00000 n
+0000258590 00000 n
+0000258655 00000 n
+0000258719 00000 n
+0000258784 00000 n
+0000258849 00000 n
+0000258914 00000 n
+0000258979 00000 n
+0000259044 00000 n
+0000259109 00000 n
+0000259174 00000 n
+0000259239 00000 n
+0000259304 00000 n
+0000259369 00000 n
+0000259433 00000 n
+0000259498 00000 n
+0000259563 00000 n
+0000259628 00000 n
+0000259693 00000 n
+0000259758 00000 n
+0000259823 00000 n
+0000259888 00000 n
+0000259953 00000 n
+0000260017 00000 n
+0000260082 00000 n
+0000260147 00000 n
+0000260212 00000 n
+0000260277 00000 n
+0000260342 00000 n
+0000260407 00000 n
+0000260470 00000 n
+0000260535 00000 n
+0000260600 00000 n
+0000260665 00000 n
+0000260730 00000 n
+0000260795 00000 n
+0000260860 00000 n
+0000260925 00000 n
+0000260990 00000 n
+0000261055 00000 n
+0000261120 00000 n
+0000261185 00000 n
+0000261250 00000 n
+0000261315 00000 n
+0000261380 00000 n
+0000261445 00000 n
+0000261510 00000 n
+0000261575 00000 n
+0000261640 00000 n
+0000261704 00000 n
+0000261769 00000 n
+0000261834 00000 n
+0000261899 00000 n
+0000261964 00000 n
+0000262029 00000 n
+0000262094 00000 n
+0000262159 00000 n
+0000262224 00000 n
+0000262289 00000 n
+0000262353 00000 n
+0000265601 00000 n
+0000268352 00000 n
+0000265428 00000 n
+0000262581 00000 n
+0000265759 00000 n
+0000265823 00000 n
+0000265888 00000 n
+0000265952 00000 n
+0000266017 00000 n
+0000266082 00000 n
+0000266147 00000 n
+0000266212 00000 n
+0000266277 00000 n
+0000266342 00000 n
+0000266407 00000 n
+0000266472 00000 n
+0000266536 00000 n
+0000266601 00000 n
+0000266666 00000 n
+0000266731 00000 n
+0000266796 00000 n
+0000266861 00000 n
+0000266926 00000 n
+0000266991 00000 n
+0000267056 00000 n
+0000267121 00000 n
+0000267185 00000 n
+0000267250 00000 n
+0000267315 00000 n
+0000267380 00000 n
+0000267445 00000 n
+0000267510 00000 n
+0000267575 00000 n
+0000267640 00000 n
+0000267705 00000 n
+0000267769 00000 n
+0000267834 00000 n
+0000267899 00000 n
+0000267964 00000 n
+0000268028 00000 n
+0000268093 00000 n
+0000268158 00000 n
+0000268223 00000 n
+0000268288 00000 n
+0000265570 00000 n
+0000274414 00000 n
+0000270271 00000 n
+0000268620 00000 n
+0000270396 00000 n
+0000270460 00000 n
+0000270525 00000 n
+0000270589 00000 n
+0000270654 00000 n
+0000270719 00000 n
+0000270784 00000 n
+0000270849 00000 n
+0000270914 00000 n
+0000270979 00000 n
+0000271044 00000 n
+0000271109 00000 n
+0000271173 00000 n
+0000271238 00000 n
+0000271303 00000 n
+0000271368 00000 n
+0000271433 00000 n
+0000271497 00000 n
+0000271562 00000 n
+0000271627 00000 n
+0000271692 00000 n
+0000271756 00000 n
+0000271821 00000 n
+0000271886 00000 n
+0000271951 00000 n
+0000272016 00000 n
+0000272081 00000 n
+0000272146 00000 n
+0000272211 00000 n
+0000272276 00000 n
+0000272340 00000 n
+0000272405 00000 n
+0000272470 00000 n
+0000272535 00000 n
+0000272600 00000 n
+0000272665 00000 n
+0000272730 00000 n
+0000272795 00000 n
+0000272860 00000 n
+0000272925 00000 n
+0000272989 00000 n
+0000273054 00000 n
+0000273119 00000 n
+0000273184 00000 n
+0000273249 00000 n
+0000273314 00000 n
+0000273379 00000 n
+0000273444 00000 n
+0000273509 00000 n
+0000273572 00000 n
+0000273637 00000 n
+0000273702 00000 n
+0000273767 00000 n
+0000273832 00000 n
+0000273897 00000 n
+0000273962 00000 n
+0000274027 00000 n
+0000274092 00000 n
+0000274156 00000 n
+0000274221 00000 n
+0000274286 00000 n
+0000274350 00000 n
+0000280290 00000 n
+0000277254 00000 n
+0000274578 00000 n
+0000277379 00000 n
+0000277443 00000 n
+0000277508 00000 n
+0000277572 00000 n
+0000277637 00000 n
+0000277702 00000 n
+0000277767 00000 n
+0000277832 00000 n
+0000277897 00000 n
+0000277962 00000 n
+0000278027 00000 n
+0000278092 00000 n
+0000278156 00000 n
+0000278219 00000 n
+0000278284 00000 n
+0000278349 00000 n
+0000278414 00000 n
+0000278479 00000 n
+0000278543 00000 n
+0000278608 00000 n
+0000278672 00000 n
+0000278737 00000 n
+0000278802 00000 n
+0000278867 00000 n
+0000278932 00000 n
+0000278997 00000 n
+0000279062 00000 n
+0000279125 00000 n
+0000279190 00000 n
+0000279255 00000 n
+0000279320 00000 n
+0000279385 00000 n
+0000279450 00000 n
+0000279515 00000 n
+0000279579 00000 n
+0000279643 00000 n
+0000279708 00000 n
+0000279773 00000 n
+0000279838 00000 n
+0000279903 00000 n
+0000279968 00000 n
+0000280033 00000 n
+0000280098 00000 n
+0000280162 00000 n
+0000280226 00000 n
+0000596333 00000 n
+0000285970 00000 n
+0000283834 00000 n
+0000280493 00000 n
+0000283959 00000 n
+0000284023 00000 n
+0000284088 00000 n
+0000284152 00000 n
+0000284217 00000 n
+0000284282 00000 n
+0000284347 00000 n
+0000284412 00000 n
+0000284477 00000 n
+0000284542 00000 n
+0000284607 00000 n
+0000284672 00000 n
+0000284737 00000 n
+0000284802 00000 n
+0000284867 00000 n
+0000284932 00000 n
+0000284997 00000 n
+0000285062 00000 n
+0000285127 00000 n
+0000285192 00000 n
+0000285257 00000 n
+0000285321 00000 n
+0000285386 00000 n
+0000285451 00000 n
+0000285515 00000 n
+0000285580 00000 n
+0000285645 00000 n
+0000285710 00000 n
+0000285775 00000 n
+0000285840 00000 n
+0000285905 00000 n
+0000294418 00000 n
+0000291560 00000 n
+0000288646 00000 n
+0000286186 00000 n
+0000288771 00000 n
+0000288835 00000 n
+0000288899 00000 n
+0000288964 00000 n
+0000289029 00000 n
+0000289094 00000 n
+0000289159 00000 n
+0000289224 00000 n
+0000289289 00000 n
+0000289354 00000 n
+0000289418 00000 n
+0000289483 00000 n
+0000289547 00000 n
+0000289612 00000 n
+0000289676 00000 n
+0000289741 00000 n
+0000289806 00000 n
+0000289871 00000 n
+0000289936 00000 n
+0000290001 00000 n
+0000290066 00000 n
+0000290131 00000 n
+0000290196 00000 n
+0000290260 00000 n
+0000290325 00000 n
+0000290390 00000 n
+0000290455 00000 n
+0000290520 00000 n
+0000290585 00000 n
+0000290650 00000 n
+0000290715 00000 n
+0000290780 00000 n
+0000290845 00000 n
+0000290910 00000 n
+0000290975 00000 n
+0000291040 00000 n
+0000291105 00000 n
+0000291170 00000 n
+0000291235 00000 n
+0000291300 00000 n
+0000291365 00000 n
+0000291430 00000 n
+0000291495 00000 n
+0000298140 00000 n
+0000294245 00000 n
+0000291763 00000 n
+0000294576 00000 n
+0000294640 00000 n
+0000294705 00000 n
+0000294770 00000 n
+0000294835 00000 n
+0000294899 00000 n
+0000294964 00000 n
+0000295029 00000 n
+0000295094 00000 n
+0000295159 00000 n
+0000295224 00000 n
+0000295289 00000 n
+0000295354 00000 n
+0000295419 00000 n
+0000295483 00000 n
+0000295548 00000 n
+0000295612 00000 n
+0000295740 00000 n
+0000295805 00000 n
+0000295870 00000 n
+0000295935 00000 n
+0000296000 00000 n
+0000296065 00000 n
+0000296130 00000 n
+0000296195 00000 n
+0000296259 00000 n
+0000296324 00000 n
+0000296389 00000 n
+0000296454 00000 n
+0000296519 00000 n
+0000296584 00000 n
+0000296649 00000 n
+0000296714 00000 n
+0000296779 00000 n
+0000296843 00000 n
+0000296908 00000 n
+0000296973 00000 n
+0000297038 00000 n
+0000297103 00000 n
+0000297168 00000 n
+0000297233 00000 n
+0000297298 00000 n
+0000297363 00000 n
+0000297427 00000 n
+0000297492 00000 n
+0000297557 00000 n
+0000297622 00000 n
+0000297687 00000 n
+0000297752 00000 n
+0000297817 00000 n
+0000297882 00000 n
+0000297947 00000 n
+0000298011 00000 n
+0000298076 00000 n
+0000294387 00000 n
+0000304307 00000 n
+0000300489 00000 n
+0000298369 00000 n
+0000300614 00000 n
+0000300678 00000 n
+0000300743 00000 n
+0000300807 00000 n
+0000300872 00000 n
+0000300937 00000 n
+0000301002 00000 n
+0000301067 00000 n
+0000301132 00000 n
+0000301197 00000 n
+0000301262 00000 n
+0000301327 00000 n
+0000301391 00000 n
+0000301456 00000 n
+0000301521 00000 n
+0000301586 00000 n
+0000301651 00000 n
+0000301716 00000 n
+0000301781 00000 n
+0000301846 00000 n
+0000301910 00000 n
+0000301975 00000 n
+0000302040 00000 n
+0000302104 00000 n
+0000302169 00000 n
+0000302233 00000 n
+0000302298 00000 n
+0000302363 00000 n
+0000302428 00000 n
+0000302493 00000 n
+0000302558 00000 n
+0000302623 00000 n
+0000302688 00000 n
+0000302753 00000 n
+0000302817 00000 n
+0000302882 00000 n
+0000302946 00000 n
+0000303011 00000 n
+0000303076 00000 n
+0000303141 00000 n
+0000303206 00000 n
+0000303271 00000 n
+0000303336 00000 n
+0000303401 00000 n
+0000303466 00000 n
+0000303530 00000 n
+0000303595 00000 n
+0000303660 00000 n
+0000303725 00000 n
+0000303790 00000 n
+0000303855 00000 n
+0000303920 00000 n
+0000303985 00000 n
+0000304050 00000 n
+0000304114 00000 n
+0000304179 00000 n
+0000304243 00000 n
+0000310261 00000 n
+0000306182 00000 n
+0000304471 00000 n
+0000306307 00000 n
+0000306371 00000 n
+0000306436 00000 n
+0000306500 00000 n
+0000306565 00000 n
+0000306630 00000 n
+0000306695 00000 n
+0000306760 00000 n
+0000306825 00000 n
+0000306890 00000 n
+0000306955 00000 n
+0000307020 00000 n
+0000307084 00000 n
+0000307149 00000 n
+0000307214 00000 n
+0000307279 00000 n
+0000307344 00000 n
+0000307409 00000 n
+0000307474 00000 n
+0000307539 00000 n
+0000307604 00000 n
+0000307668 00000 n
+0000307733 00000 n
+0000307798 00000 n
+0000307863 00000 n
+0000307928 00000 n
+0000307993 00000 n
+0000308058 00000 n
+0000308123 00000 n
+0000308188 00000 n
+0000308252 00000 n
+0000308317 00000 n
+0000308381 00000 n
+0000308446 00000 n
+0000308511 00000 n
+0000308576 00000 n
+0000308640 00000 n
+0000308705 00000 n
+0000308770 00000 n
+0000308835 00000 n
+0000308900 00000 n
+0000308965 00000 n
+0000309030 00000 n
+0000309095 00000 n
+0000309160 00000 n
+0000309224 00000 n
+0000309289 00000 n
+0000309354 00000 n
+0000309419 00000 n
+0000309484 00000 n
+0000309549 00000 n
+0000309614 00000 n
+0000309679 00000 n
+0000309744 00000 n
+0000309809 00000 n
+0000309874 00000 n
+0000309938 00000 n
+0000310003 00000 n
+0000310068 00000 n
+0000310133 00000 n
+0000310197 00000 n
+0000315930 00000 n
+0000313017 00000 n
+0000310425 00000 n
+0000313142 00000 n
+0000313206 00000 n
+0000313271 00000 n
+0000313335 00000 n
+0000313400 00000 n
+0000313465 00000 n
+0000313530 00000 n
+0000313595 00000 n
+0000313660 00000 n
+0000313725 00000 n
+0000313790 00000 n
+0000313855 00000 n
+0000313920 00000 n
+0000313985 00000 n
+0000314050 00000 n
+0000314115 00000 n
+0000314180 00000 n
+0000314244 00000 n
+0000314309 00000 n
+0000314374 00000 n
+0000314439 00000 n
+0000314504 00000 n
+0000314569 00000 n
+0000314634 00000 n
+0000314699 00000 n
+0000314764 00000 n
+0000314828 00000 n
+0000314893 00000 n
+0000314958 00000 n
+0000315022 00000 n
+0000315086 00000 n
+0000315151 00000 n
+0000315216 00000 n
+0000315281 00000 n
+0000315346 00000 n
+0000315411 00000 n
+0000315476 00000 n
+0000315541 00000 n
+0000315606 00000 n
+0000315671 00000 n
+0000315736 00000 n
+0000315801 00000 n
+0000315866 00000 n
+0000318411 00000 n
+0000321745 00000 n
+0000318238 00000 n
+0000316133 00000 n
+0000318569 00000 n
+0000318633 00000 n
+0000318697 00000 n
+0000318762 00000 n
+0000318827 00000 n
+0000318892 00000 n
+0000318957 00000 n
+0000319022 00000 n
+0000319087 00000 n
+0000319150 00000 n
+0000319215 00000 n
+0000319279 00000 n
+0000319344 00000 n
+0000319409 00000 n
+0000319474 00000 n
+0000319539 00000 n
+0000319604 00000 n
+0000319669 00000 n
+0000319733 00000 n
+0000319798 00000 n
+0000319863 00000 n
+0000319928 00000 n
+0000319993 00000 n
+0000320058 00000 n
+0000320123 00000 n
+0000320188 00000 n
+0000320253 00000 n
+0000320316 00000 n
+0000320381 00000 n
+0000320446 00000 n
+0000320511 00000 n
+0000320576 00000 n
+0000320641 00000 n
+0000320706 00000 n
+0000320771 00000 n
+0000320836 00000 n
+0000320901 00000 n
+0000320966 00000 n
+0000321031 00000 n
+0000321095 00000 n
+0000321160 00000 n
+0000321225 00000 n
+0000321290 00000 n
+0000321355 00000 n
+0000321420 00000 n
+0000321485 00000 n
+0000321550 00000 n
+0000321615 00000 n
+0000321680 00000 n
+0000318380 00000 n
+0000327449 00000 n
+0000324082 00000 n
+0000321974 00000 n
+0000324207 00000 n
+0000324334 00000 n
+0000324399 00000 n
+0000324464 00000 n
+0000324528 00000 n
+0000324593 00000 n
+0000324658 00000 n
+0000324723 00000 n
+0000324788 00000 n
+0000324853 00000 n
+0000324918 00000 n
+0000324983 00000 n
+0000325048 00000 n
+0000325112 00000 n
+0000325177 00000 n
+0000325242 00000 n
+0000325307 00000 n
+0000325372 00000 n
+0000325437 00000 n
+0000325502 00000 n
+0000325567 00000 n
+0000325632 00000 n
+0000325696 00000 n
+0000325761 00000 n
+0000325826 00000 n
+0000325891 00000 n
+0000325956 00000 n
+0000326021 00000 n
+0000326086 00000 n
+0000326151 00000 n
+0000326216 00000 n
+0000326281 00000 n
+0000326345 00000 n
+0000326410 00000 n
+0000326475 00000 n
+0000326540 00000 n
+0000326605 00000 n
+0000326670 00000 n
+0000326735 00000 n
+0000326800 00000 n
+0000326865 00000 n
+0000326929 00000 n
+0000326994 00000 n
+0000327059 00000 n
+0000327124 00000 n
+0000327189 00000 n
+0000327254 00000 n
+0000327319 00000 n
+0000327384 00000 n
+0000332973 00000 n
+0000330453 00000 n
+0000327652 00000 n
+0000330578 00000 n
+0000330705 00000 n
+0000330769 00000 n
+0000330834 00000 n
+0000330899 00000 n
+0000330964 00000 n
+0000331029 00000 n
+0000331094 00000 n
+0000331159 00000 n
+0000331224 00000 n
+0000331352 00000 n
+0000331417 00000 n
+0000331482 00000 n
+0000331547 00000 n
+0000331611 00000 n
+0000331676 00000 n
+0000331741 00000 n
+0000331806 00000 n
+0000331871 00000 n
+0000331936 00000 n
+0000332001 00000 n
+0000332066 00000 n
+0000332131 00000 n
+0000332195 00000 n
+0000332260 00000 n
+0000332325 00000 n
+0000332390 00000 n
+0000332455 00000 n
+0000332520 00000 n
+0000332585 00000 n
+0000332650 00000 n
+0000332715 00000 n
+0000332780 00000 n
+0000332844 00000 n
+0000332909 00000 n
+0000338590 00000 n
+0000335418 00000 n
+0000333202 00000 n
+0000335543 00000 n
+0000335607 00000 n
+0000335672 00000 n
+0000335737 00000 n
+0000335802 00000 n
+0000335867 00000 n
+0000335932 00000 n
+0000335997 00000 n
+0000336062 00000 n
+0000336127 00000 n
+0000336192 00000 n
+0000336257 00000 n
+0000336322 00000 n
+0000336387 00000 n
+0000336452 00000 n
+0000336517 00000 n
+0000336582 00000 n
+0000336647 00000 n
+0000336712 00000 n
+0000336776 00000 n
+0000336841 00000 n
+0000336906 00000 n
+0000336971 00000 n
+0000337036 00000 n
+0000337101 00000 n
+0000337166 00000 n
+0000337231 00000 n
+0000337296 00000 n
+0000337361 00000 n
+0000337426 00000 n
+0000337491 00000 n
+0000337556 00000 n
+0000337621 00000 n
+0000337686 00000 n
+0000337751 00000 n
+0000337816 00000 n
+0000337880 00000 n
+0000337945 00000 n
+0000338010 00000 n
+0000338075 00000 n
+0000338203 00000 n
+0000338267 00000 n
+0000338332 00000 n
+0000338397 00000 n
+0000338462 00000 n
+0000338526 00000 n
+0000596497 00000 n
+0000343270 00000 n
+0000340621 00000 n
+0000338793 00000 n
+0000340746 00000 n
+0000340810 00000 n
+0000340875 00000 n
+0000340940 00000 n
+0000341004 00000 n
+0000341069 00000 n
+0000341134 00000 n
+0000341199 00000 n
+0000341264 00000 n
+0000341329 00000 n
+0000341394 00000 n
+0000341459 00000 n
+0000341524 00000 n
+0000341587 00000 n
+0000341652 00000 n
+0000341717 00000 n
+0000341782 00000 n
+0000341847 00000 n
+0000341912 00000 n
+0000341976 00000 n
+0000342041 00000 n
+0000342106 00000 n
+0000342171 00000 n
+0000342236 00000 n
+0000342301 00000 n
+0000342365 00000 n
+0000342430 00000 n
+0000342495 00000 n
+0000342560 00000 n
+0000342625 00000 n
+0000342690 00000 n
+0000342755 00000 n
+0000342820 00000 n
+0000342885 00000 n
+0000342949 00000 n
+0000343014 00000 n
+0000343142 00000 n
+0000343206 00000 n
+0000346208 00000 n
+0000355270 00000 n
+0000355426 00000 n
+0000347126 00000 n
+0000346035 00000 n
+0000343473 00000 n
+0000346362 00000 n
+0000346426 00000 n
+0000346490 00000 n
+0000346554 00000 n
+0000346617 00000 n
+0000346680 00000 n
+0000346744 00000 n
+0000346808 00000 n
+0000346872 00000 n
+0000346936 00000 n
+0000347062 00000 n
+0000346177 00000 n
+0000355586 00000 n
+0000355747 00000 n
+0000355907 00000 n
+0000356063 00000 n
+0000356224 00000 n
+0000356385 00000 n
+0000356546 00000 n
+0000356702 00000 n
+0000356863 00000 n
+0000357024 00000 n
+0000357191 00000 n
+0000357358 00000 n
+0000357523 00000 n
+0000357683 00000 n
+0000357849 00000 n
+0000358016 00000 n
+0000358183 00000 n
+0000358343 00000 n
+0000358510 00000 n
+0000358677 00000 n
+0000358837 00000 n
+0000358998 00000 n
+0000359154 00000 n
+0000359312 00000 n
+0000359473 00000 n
+0000359632 00000 n
+0000359793 00000 n
+0000359952 00000 n
+0000360108 00000 n
+0000360268 00000 n
+0000360428 00000 n
+0000360595 00000 n
+0000360760 00000 n
+0000360927 00000 n
+0000361093 00000 n
+0000361260 00000 n
+0000361427 00000 n
+0000361594 00000 n
+0000361760 00000 n
+0000361927 00000 n
+0000362091 00000 n
+0000362259 00000 n
+0000362426 00000 n
+0000362587 00000 n
+0000362754 00000 n
+0000362921 00000 n
+0000363088 00000 n
+0000363255 00000 n
+0000363422 00000 n
+0000363589 00000 n
+0000363756 00000 n
+0000363972 00000 n
+0000354629 00000 n
+0000347303 00000 n
+0000363908 00000 n
+0000354771 00000 n
+0000364228 00000 n
+0000364253 00000 n
+0000376238 00000 n
+0000364481 00000 n
+0000364584 00000 n
+0000376480 00000 n
+0000377204 00000 n
+0000377438 00000 n
+0000390950 00000 n
+0000377761 00000 n
+0000377868 00000 n
+0000391184 00000 n
+0000391935 00000 n
+0000392161 00000 n
+0000403195 00000 n
+0000392308 00000 n
+0000392406 00000 n
+0000403435 00000 n
+0000404113 00000 n
+0000404344 00000 n
+0000405455 00000 n
+0000404399 00000 n
+0000404496 00000 n
+0000405698 00000 n
+0000406308 00000 n
+0000406512 00000 n
+0000409063 00000 n
+0000406719 00000 n
+0000406825 00000 n
+0000409311 00000 n
+0000410006 00000 n
+0000410216 00000 n
+0000420026 00000 n
+0000410842 00000 n
+0000410977 00000 n
+0000420266 00000 n
+0000421350 00000 n
+0000421554 00000 n
+0000423880 00000 n
+0000421721 00000 n
+0000421827 00000 n
+0000424127 00000 n
+0000424800 00000 n
+0000425010 00000 n
+0000426695 00000 n
+0000425123 00000 n
+0000425229 00000 n
+0000426944 00000 n
+0000427597 00000 n
+0000427808 00000 n
+0000434889 00000 n
+0000428246 00000 n
+0000428361 00000 n
+0000435129 00000 n
+0000436001 00000 n
+0000436204 00000 n
+0000441606 00000 n
+0000436557 00000 n
+0000436671 00000 n
+0000441850 00000 n
+0000442623 00000 n
+0000442828 00000 n
+0000449083 00000 n
+0000443277 00000 n
+0000443385 00000 n
+0000449323 00000 n
+0000450200 00000 n
+0000450404 00000 n
+0000452716 00000 n
+0000450560 00000 n
+0000450666 00000 n
+0000452959 00000 n
+0000453618 00000 n
+0000453822 00000 n
+0000455842 00000 n
+0000453936 00000 n
+0000454040 00000 n
+0000456084 00000 n
+0000456729 00000 n
+0000456934 00000 n
+0000459987 00000 n
+0000457225 00000 n
+0000457332 00000 n
+0000460227 00000 n
+0000460963 00000 n
+0000461167 00000 n
+0000467876 00000 n
+0000461593 00000 n
+0000461708 00000 n
+0000468117 00000 n
+0000468972 00000 n
+0000594085 00000 n
+0000469177 00000 n
+0000594173 00000 n
+0000469204 00000 n
+0000593970 00000 n
+0000469231 00000 n
+0000469256 00000 n
+0000469489 00000 n
+0000469706 00000 n
+0000473862 00000 n
+0000470026 00000 n
+0000470132 00000 n
+0000474104 00000 n
+0000474847 00000 n
+0000475051 00000 n
+0000477519 00000 n
+0000475263 00000 n
+0000475369 00000 n
+0000477759 00000 n
+0000478442 00000 n
+0000478646 00000 n
+0000487801 00000 n
+0000479125 00000 n
+0000479246 00000 n
+0000488042 00000 n
+0000489035 00000 n
+0000489240 00000 n
+0000491250 00000 n
+0000489354 00000 n
+0000489458 00000 n
+0000491492 00000 n
+0000492138 00000 n
+0000492343 00000 n
+0000494761 00000 n
+0000492579 00000 n
+0000492685 00000 n
+0000495002 00000 n
+0000495701 00000 n
+0000495906 00000 n
+0000505139 00000 n
+0000496457 00000 n
+0000496583 00000 n
+0000505381 00000 n
+0000506367 00000 n
+0000506573 00000 n
+0000512594 00000 n
+0000506965 00000 n
+0000507073 00000 n
+0000512834 00000 n
+0000513656 00000 n
+0000513859 00000 n
+0000514908 00000 n
+0000513937 00000 n
+0000514037 00000 n
+0000515148 00000 n
+0000515770 00000 n
+0000515974 00000 n
+0000519960 00000 n
+0000516264 00000 n
+0000516370 00000 n
+0000520201 00000 n
+0000520934 00000 n
+0000521139 00000 n
+0000522698 00000 n
+0000521232 00000 n
+0000521333 00000 n
+0000522937 00000 n
+0000523563 00000 n
+0000523765 00000 n
+0000526002 00000 n
+0000523944 00000 n
+0000524050 00000 n
+0000526243 00000 n
+0000526912 00000 n
+0000527117 00000 n
+0000529898 00000 n
+0000527305 00000 n
+0000527412 00000 n
+0000530140 00000 n
+0000530834 00000 n
+0000531040 00000 n
+0000531128 00000 n
+0000532172 00000 n
+0000531206 00000 n
+0000531306 00000 n
+0000532413 00000 n
+0000533037 00000 n
+0000533242 00000 n
+0000535045 00000 n
+0000533353 00000 n
+0000533456 00000 n
+0000535287 00000 n
+0000535930 00000 n
+0000543107 00000 n
+0000536136 00000 n
+0000546880 00000 n
+0000543340 00000 n
+0000549640 00000 n
+0000547160 00000 n
+0000573298 00000 n
+0000549881 00000 n
+0000587680 00000 n
+0000573605 00000 n
+0000590952 00000 n
+0000587918 00000 n
+0000593718 00000 n
+0000591218 00000 n
+0000596606 00000 n
+0000596723 00000 n
+0000601861 00000 n
+0000602526 00000 n
+0000603195 00000 n
+0000603864 00000 n
+0000604530 00000 n
+0000605199 00000 n
+0000605867 00000 n
+0000606538 00000 n
+0000607202 00000 n
+0000607871 00000 n
+0000608540 00000 n
+0000609206 00000 n
+0000609875 00000 n
+0000610544 00000 n
+0000611209 00000 n
+0000611880 00000 n
+0000612548 00000 n
+0000613217 00000 n
+0000613883 00000 n
+0000614552 00000 n
+0000615221 00000 n
+0000615887 00000 n
+0000616556 00000 n
+0000617224 00000 n
+0000617895 00000 n
+0000618560 00000 n
+0000619229 00000 n
+0000619898 00000 n
+0000620564 00000 n
+0000621233 00000 n
+0000621902 00000 n
+0000622555 00000 n
+0000623159 00000 n
+0000623765 00000 n
+0000624371 00000 n
+0000624974 00000 n
+0000625581 00000 n
+0000626186 00000 n
+0000626792 00000 n
+0000627396 00000 n
+0000628002 00000 n
+0000628608 00000 n
+0000629212 00000 n
+0000629842 00000 n
+0000630476 00000 n
+0000631113 00000 n
+0000631743 00000 n
+0000632378 00000 n
+0000633013 00000 n
+0000633645 00000 n
+0000634280 00000 n
+0000634915 00000 n
+0000635546 00000 n
+0000636183 00000 n
+0000636817 00000 n
+0000637452 00000 n
+0000638084 00000 n
+0000638719 00000 n
+0000639354 00000 n
+0000640016 00000 n
+0000640807 00000 n
+0000641455 00000 n
+0000642136 00000 n
+0000642927 00000 n
+0000643909 00000 n
+0000644546 00000 n
+0000644901 00000 n
+0000645269 00000 n
+0000645358 00000 n
+0000645452 00000 n
+0000645492 00000 n
+0000645624 00000 n
trailer
-<< /Size 2874 /Root 2872 0 R /Info 2873 0 R /ID [ <FB25EC07E8D3F7378AD544A90F746A61> <FB25EC07E8D3F7378AD544A90F746A61> ] >>
+<< /Size 2874 /Root 2872 0 R /Info 2873 0 R /ID [ <42D6E246E3124F0765D2813A534851DE> <42D6E246E3124F0765D2813A534851DE> ] >>
startxref
-645787
+646185
%%EOF
diff --git a/support/latexindent/LatexIndent/Document.pm b/support/latexindent/LatexIndent/Document.pm
index 4a99721a34..16a01bf209 100644
--- a/support/latexindent/LatexIndent/Document.pm
+++ b/support/latexindent/LatexIndent/Document.pm
@@ -240,15 +240,7 @@ sub output_indented_text {
}
elsif ( $switches{outputToFile} ) {
- # diacritics in file names (highlighted in https://github.com/cmhughes/latexindent.pl/pull/439)
- #
- # note, related:
- #
- # git config --add core.quotePath false
- ${$self}{outputToFile} = decode( "utf-8", ${$self}{outputToFile} );
-
$logger->info("Outputting to file ${$self}{outputToFile}");
-
open( OUTPUTFILE, ">", ${$self}{outputToFile} );
print OUTPUTFILE ${$self}{body};
close(OUTPUTFILE);
diff --git a/support/latexindent/LatexIndent/FileExtension.pm b/support/latexindent/LatexIndent/FileExtension.pm
index b0f49f246d..b61ffc1bb4 100644
--- a/support/latexindent/LatexIndent/FileExtension.pm
+++ b/support/latexindent/LatexIndent/FileExtension.pm
@@ -21,6 +21,7 @@ use PerlIO::encoding;
use open ':std', ':encoding(UTF-8)';
use File::Basename; # to get the filename and directory path
use Exporter qw/import/;
+use Encode qw/decode/;
use LatexIndent::GetYamlSettings qw/%mainSettings/;
use LatexIndent::Switches qw/%switches $is_check_switch_active/;
use LatexIndent::LogFile qw/$logger/;
@@ -114,7 +115,12 @@ sub file_extension_check {
$logger->info("*-o switch active: output file check");
- ${$self}{outputToFile} = $switches{outputToFile};
+ # diacritics in file names (highlighted in https://github.com/cmhughes/latexindent.pl/pull/439)
+ #
+ # note, related:
+ #
+ # git config --add core.quotePath false
+ ${$self}{outputToFile} = decode( "utf-8", $switches{outputToFile} );
if ( $fileName eq "-" and $switches{outputToFile} =~ m/^\+/ ) {
$logger->info("STDIN input mode active, -o switch is removing all + symbols");
@@ -124,7 +130,7 @@ sub file_extension_check {
# the -o file name might begin with a + symbol
if ( $switches{outputToFile} =~ m/^\+(.*)/ and $1 ne "+" ) {
$logger->info("-o switch called with + symbol at the beginning: ${$self}{outputToFile}");
- ${$self}{outputToFile} = ${$self}{baseName} . $1;
+ ${$self}{outputToFile} = decode( "utf-8", ${$self}{baseName} . $1 );
$logger->info("output file is now: ${$self}{outputToFile}");
}
@@ -137,7 +143,8 @@ sub file_extension_check {
# if there is no extension, then add the extension from the file to be operated upon
if ( !$ext ) {
- $logger->info("-o switch called with file name without extension: $switches{outputToFile}");
+ $logger->info(
+ "-o switch called with file name without extension: " . decode( "utf-8", $switches{outputToFile} ) );
${$self}{outputToFile} = $name . ( $name =~ m/\.\z/ ? q() : "." ) . $strippedFileExtension;
$logger->info(
"Updated to ${$self}{outputToFile} as the file extension of the input file is $strippedFileExtension");
diff --git a/support/latexindent/LatexIndent/LogFile.pm b/support/latexindent/LatexIndent/LogFile.pm
index 93b6ad0930..5847ca42f4 100644
--- a/support/latexindent/LatexIndent/LogFile.pm
+++ b/support/latexindent/LatexIndent/LogFile.pm
@@ -129,12 +129,9 @@ ENDQUOTE
# cruft directory
${$self}{cruftDirectory} = $switches{cruftDirectory} || ( dirname ${$self}{fileName} );
- # diacritics in cruft directory (highlighted in https://github.com/cmhughes/latexindent.pl/pull/439)
- ${$self}{cruftDirectory} = decode( "utf-8", ${$self}{cruftDirectory} );
-
# if cruft directory does not exist
if ( !( -d ${$self}{cruftDirectory} ) ) {
- $logger->fatal("*Could not find directory ${$self}{cruftDirectory}");
+ $logger->fatal( "*Could not find directory " . decode( "utf-8", ${$self}{cruftDirectory} ) );
$logger->fatal("Exiting, no indentation done.");
$self->output_logfile();
exit(6);
@@ -143,6 +140,8 @@ ENDQUOTE
my $logfileName = ( $switches{cruftDirectory} ? ${$self}{cruftDirectory} . "/" : '' )
. ( $switches{logFileName} || "indent.log" );
+ $logfileName = decode( "utf-8", $logfileName );
+
# details of the script to log file
$logger->info("*$FindBin::Script version $versionNumber, $versionDate, a script to indent .tex files");
$logger->info("$FindBin::Script lives here: $FindBin::RealBin/");
@@ -247,7 +246,7 @@ ENDQUOTE
}
$logger->info("*Directory for backup files and $logfileName:");
- $logger->info("${$self}{cruftDirectory}");
+ $logger->info( $switches{cruftDirectory} ? decode( "utf-8", ${$self}{cruftDirectory} ) : ${$self}{cruftDirectory} );
# output location of modules
if ( $FindBin::Script eq 'latexindent.pl' or ( $FindBin::Script eq 'latexindent.exe' and $switches{trace} ) ) {
diff --git a/support/latexindent/LatexIndent/Version.pm b/support/latexindent/LatexIndent/Version.pm
index 457e9c83bf..998d3dbfe3 100644
--- a/support/latexindent/LatexIndent/Version.pm
+++ b/support/latexindent/LatexIndent/Version.pm
@@ -20,6 +20,6 @@ use warnings;
use Exporter qw/import/;
our @EXPORT_OK = qw/$versionNumber $versionDate/;
-our $versionNumber = '3.20.5';
-our $versionDate = '2023-04-07';
+our $versionNumber = '3.20.6';
+our $versionDate = '2023-04-11';
1
diff --git a/support/latexindent/README b/support/latexindent/README
index 4a3d96433c..95461bf24f 100644
--- a/support/latexindent/README
+++ b/support/latexindent/README
@@ -1,5 +1,5 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- latexindent.pl, version 3.20.5, 2023-04-07
+ latexindent.pl, version 3.20.6, 2023-04-11
PERL script to indent code within environments, and align delimited
environments in .tex files.
diff --git a/support/latexindent/bin/linux/latexindent b/support/latexindent/bin/linux/latexindent
index 3941080085..b4d88492d7 100644
--- a/support/latexindent/bin/linux/latexindent
+++ b/support/latexindent/bin/linux/latexindent
Binary files differ
diff --git a/support/latexindent/bin/macos/latexindent b/support/latexindent/bin/macos/latexindent
index ef6d8e84b2..e4d021aaba 100644
--- a/support/latexindent/bin/macos/latexindent
+++ b/support/latexindent/bin/macos/latexindent
Binary files differ
diff --git a/support/latexindent/defaultSettings.yaml b/support/latexindent/defaultSettings.yaml
index 51a8b22229..309ba003af 100644
--- a/support/latexindent/defaultSettings.yaml
+++ b/support/latexindent/defaultSettings.yaml
@@ -1,5 +1,5 @@
#
-# latexindent.pl, version 3.20.5, 2023-04-07
+# latexindent.pl, version 3.20.6, 2023-04-11
#
# defaultSettings.yaml, the default settings for latexindent.pl
#
diff --git a/support/latexindent/documentation/latexindent-yaml-schema.json b/support/latexindent/documentation/latexindent-yaml-schema.json
index f2089565dc..ec760e70ac 100644
--- a/support/latexindent/documentation/latexindent-yaml-schema.json
+++ b/support/latexindent/documentation/latexindent-yaml-schema.json
@@ -2,7 +2,7 @@
"$schema": "http://json-schema.org/schema",
"$id": "latexindent-yaml-schema.json",
"title": "latexindent.pl YAML schema",
- "description": "latexindent.pl YAML schema helper, V3.20.5 2023-04-07",
+ "description": "latexindent.pl YAML schema helper, V3.20.6 2023-04-11",
"type": "object",
"properties": {
"fileExtensionPreference": {
diff --git a/support/latexindent/documentation/latexindent.pdf b/support/latexindent/documentation/latexindent.pdf
index e6d1ead45d..deaf1a130f 100644
--- a/support/latexindent/documentation/latexindent.pdf
+++ b/support/latexindent/documentation/latexindent.pdf
Binary files differ
diff --git a/support/latexindent/latexindent.pl b/support/latexindent/latexindent.pl
index 90e9408b0a..8a041b5435 100755
--- a/support/latexindent/latexindent.pl
+++ b/support/latexindent/latexindent.pl
@@ -1,5 +1,5 @@
#!/usr/bin/env perl
-# latexindent.pl, version 3.20.5, 2023-04-07
+# latexindent.pl, version 3.20.6, 2023-04-11
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
diff --git a/support/texlab/CHANGELOG.md b/support/texlab/CHANGELOG.md
index 39bb7e4e54..557b8ea682 100644
--- a/support/texlab/CHANGELOG.md
+++ b/support/texlab/CHANGELOG.md
@@ -5,6 +5,13 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
+## [5.4.2] - 2023-04-11
+
+### Fixed
+
+- Fix memory leak when editing documents over a long time ([#856](https://github.com/latex-lsp/texlab/issues/856))
+- Fix parsing parentheses in file paths ([#874](https://github.com/latex-lsp/texlab/issues/874))
+
## [5.4.1] - 2023-03-26
### Fixed
diff --git a/support/texlab/Cargo.lock b/support/texlab/Cargo.lock
index 7349b26f7d..724266ddb8 100644
--- a/support/texlab/Cargo.lock
+++ b/support/texlab/Cargo.lock
@@ -9,17 +9,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe"
[[package]]
-name = "ahash"
-version = "0.7.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fcb51a0695d8f838b1ee009b3fbf66bda078cd64590202a864a8f3e8c4315c47"
-dependencies = [
- "getrandom",
- "once_cell",
- "version_check",
-]
-
-[[package]]
name = "aho-corasick"
version = "0.7.20"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -44,16 +33,50 @@ dependencies = [
]
[[package]]
-name = "anyhow"
-version = "1.0.69"
+name = "anstream"
+version = "0.2.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "224afbd727c3d6e4b90103ece64b8d1b67fbb1973b1046c2281eed3f3803f800"
+checksum = "342258dd14006105c2b75ab1bd7543a03bdf0cfc94383303ac212a04939dff6f"
+dependencies = [
+ "anstyle",
+ "anstyle-parse",
+ "anstyle-wincon",
+ "concolor-override",
+ "concolor-query",
+ "is-terminal",
+ "utf8parse",
+]
[[package]]
-name = "arc-swap"
-version = "1.6.0"
+name = "anstyle"
+version = "0.3.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "23ea9e81bd02e310c216d080f6223c179012256e5151c41db88d12c88a1684d2"
+
+[[package]]
+name = "anstyle-parse"
+version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bddcadddf5e9015d310179a59bb28c4d4b9920ad0f11e8e14dbadf654890c9a6"
+checksum = "a7d1bb534e9efed14f3e5f44e7dd1a4f709384023a4165199a4241e18dff0116"
+dependencies = [
+ "utf8parse",
+]
+
+[[package]]
+name = "anstyle-wincon"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c3127af6145b149f3287bb9a0d10ad9c5692dba8c53ad48285e5bec4063834fa"
+dependencies = [
+ "anstyle",
+ "windows-sys 0.45.0",
+]
+
+[[package]]
+name = "anyhow"
+version = "1.0.70"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7de8ce5e0f9f8d88245311066a578d72b7af3e7088f32783804676302df237e4"
[[package]]
name = "assert_unordered"
@@ -82,6 +105,25 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
[[package]]
+name = "base-db"
+version = "0.0.0"
+dependencies = [
+ "dirs",
+ "distro",
+ "itertools",
+ "log",
+ "notify",
+ "once_cell",
+ "parser",
+ "regex",
+ "rowan",
+ "rustc-hash",
+ "syntax",
+ "text-size",
+ "url",
+]
+
+[[package]]
name = "beef"
version = "0.5.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -104,9 +146,9 @@ dependencies = [
[[package]]
name = "bstr"
-version = "1.3.0"
+version = "1.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5ffdb39cb703212f3c11973452c2861b972f757b021158f3516ba10f2fa8b2c1"
+checksum = "c3d4260bcc2e8fc9df1eac4919a720effeb63a3f0952f5bf4944adfa18897f09"
dependencies = [
"memchr",
"serde",
@@ -138,9 +180,9 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
[[package]]
name = "chrono"
-version = "0.4.23"
+version = "0.4.24"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "16b0a3d9ed01224b22057780a37bb8c5dbfe1be8ba48678e7bf57ec4b385411f"
+checksum = "4e3c5919066adf22df73762e50cffcde3a758f2a848b113b586d1f86728b673b"
dependencies = [
"num-integer",
"num-traits",
@@ -174,6 +216,24 @@ dependencies = [
]
[[package]]
+name = "citeproc"
+version = "0.0.0"
+dependencies = [
+ "chrono",
+ "human_name",
+ "insta",
+ "isocountry",
+ "itertools",
+ "parser",
+ "rowan",
+ "rustc-hash",
+ "syntax",
+ "titlecase",
+ "unicode-normalization",
+ "url",
+]
+
+[[package]]
name = "clap"
version = "3.2.23"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -187,30 +247,38 @@ dependencies = [
[[package]]
name = "clap"
-version = "4.1.8"
+version = "4.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c3d7ae14b20b94cb02149ed21a86c423859cbe18dc7ed69845cace50e52b40a5"
+checksum = "046ae530c528f252094e4a77886ee1374437744b2bff1497aa898bbddbbb29b3"
dependencies = [
- "bitflags",
+ "clap_builder",
"clap_derive",
- "clap_lex 0.3.2",
- "is-terminal",
"once_cell",
+]
+
+[[package]]
+name = "clap_builder"
+version = "4.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "223163f58c9a40c3b0a43e1c4b50a9ce09f007ea2cb1ec258a687945b4b7929f"
+dependencies = [
+ "anstream",
+ "anstyle",
+ "bitflags",
+ "clap_lex 0.4.1",
"strsim",
- "termcolor",
]
[[package]]
name = "clap_derive"
-version = "4.1.8"
+version = "4.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "44bec8e5c9d09e439c4335b1af0abaab56dcf3b94999a936e1bb47b9134288f0"
+checksum = "3f9644cd56d6b87dbe899ef8b053e331c0637664e9e21a33dfcdc36093f5c5c4"
dependencies = [
"heck",
- "proc-macro-error",
"proc-macro2",
"quote",
- "syn",
+ "syn 2.0.13",
]
[[package]]
@@ -224,11 +292,23 @@ dependencies = [
[[package]]
name = "clap_lex"
-version = "0.3.2"
+version = "0.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "350b9cf31731f9957399229e9b2adc51eeabdfbe9d71d9a0552275fd12710d09"
+checksum = "8a2dd5a6fe8c6e3502f568a6353e5273bbb15193ad9a89e457b9970798efbea1"
+
+[[package]]
+name = "concolor-override"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a855d4a1978dc52fb0536a04d384c2c0c1aa273597f08b77c8c4d3b2eec6037f"
+
+[[package]]
+name = "concolor-query"
+version = "0.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "88d11d52c3d7ca2e6d0040212be9e4dbbcd78b6447f535b6b561f449427944cf"
dependencies = [
- "os_str_bytes",
+ "windows-sys 0.45.0",
]
[[package]]
@@ -251,9 +331,9 @@ checksum = "7704b5fdd17b18ae31c4c1da5a2e0305a2bf17b5249300a9ee9ed7b72114c636"
[[package]]
name = "cpufeatures"
-version = "0.2.5"
+version = "0.2.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "28d997bd5e24a5928dd43e46dc529867e207907fe0b239c3477d924f7f2ca320"
+checksum = "280a9f2d8b3a38871a3c8a46fb80db65e5e5ed97da80c4d08bf27fb63e35e181"
dependencies = [
"libc",
]
@@ -304,24 +384,10 @@ dependencies = [
]
[[package]]
-name = "crossbeam"
-version = "0.8.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2801af0d36612ae591caa9568261fddce32ce6e08a7275ea334a06a4ad021a2c"
-dependencies = [
- "cfg-if",
- "crossbeam-channel",
- "crossbeam-deque",
- "crossbeam-epoch",
- "crossbeam-queue",
- "crossbeam-utils",
-]
-
-[[package]]
name = "crossbeam-channel"
-version = "0.5.7"
+version = "0.5.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cf2b3e8478797446514c91ef04bafcb59faba183e621ad488df88983cc14128c"
+checksum = "a33c2bf77f2df06183c3aa30d1e96c0695a313d4f9c453cc3762a6db39f99200"
dependencies = [
"cfg-if",
"crossbeam-utils",
@@ -347,21 +413,11 @@ dependencies = [
"autocfg",
"cfg-if",
"crossbeam-utils",
- "memoffset 0.8.0",
+ "memoffset",
"scopeguard",
]
[[package]]
-name = "crossbeam-queue"
-version = "0.3.8"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d1cfb3ea8a53f37c40dea2c7bedcbd88bdfae54f5e2175d6ecaff1c988353add"
-dependencies = [
- "cfg-if",
- "crossbeam-utils",
-]
-
-[[package]]
name = "crossbeam-utils"
version = "0.8.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -405,22 +461,30 @@ dependencies = [
[[package]]
name = "dirs"
-version = "4.0.0"
+version = "5.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ca3aa72a6f96ea37bbc5aa912f6788242832f75369bdfdadcb0e38423f100059"
+checksum = "dece029acd3353e3a58ac2e3eb3c8d6c35827a892edc6cc4138ef9c33df46ecd"
dependencies = [
"dirs-sys",
]
[[package]]
name = "dirs-sys"
-version = "0.3.7"
+version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1b1d1d91c932ef41c0f2663aa8b0ca0342d444d842c06914aa0a7e352d0bada6"
+checksum = "04414300db88f70d74c5ff54e50f9e1d1737d9a5b90f53fcf2e95ca2a9ab554b"
dependencies = [
"libc",
"redox_users",
- "winapi",
+ "windows-sys 0.45.0",
+]
+
+[[package]]
+name = "distro"
+version = "0.0.0"
+dependencies = [
+ "anyhow",
+ "rustc-hash",
]
[[package]]
@@ -455,13 +519,13 @@ dependencies = [
[[package]]
name = "errno"
-version = "0.2.8"
+version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f639046355ee4f37944e44f60642c6f3a7efa3cf6b78c78a0d989a8ce6c396a1"
+checksum = "4bcfec3a70f97c962c307b2d2c56e358cf1d00b558d74262b5f929ee8cc7e73a"
dependencies = [
"errno-dragonfly",
"libc",
- "winapi",
+ "windows-sys 0.48.0",
]
[[package]]
@@ -475,16 +539,6 @@ dependencies = [
]
[[package]]
-name = "eyre"
-version = "0.6.8"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4c2b6b5a29c02cdc822728b7d7b8ae1bab3e3b05d44522770ddd49722eeac7eb"
-dependencies = [
- "indenter",
- "once_cell",
-]
-
-[[package]]
name = "fastrand"
version = "1.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -495,23 +549,23 @@ dependencies = [
[[package]]
name = "fern"
-version = "0.6.1"
+version = "0.6.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3bdd7b0849075e79ee9a1836df22c717d1eba30451796fdc631b04565dd11e2a"
+checksum = "d9f0c14694cbd524c8720dd69b0e3179344f04ebb5f90f2e4a440c6ea3b2f1ee"
dependencies = [
"log",
]
[[package]]
name = "filetime"
-version = "0.2.20"
+version = "0.2.21"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8a3de6e8d11b22ff9edc6d916f890800597d60f8b2da1caf2955c274638d6412"
+checksum = "5cbc844cecaee9d4443931972e1289c8ff485cb4cc2767cb03ca139ed6885153"
dependencies = [
"cfg-if",
"libc",
- "redox_syscall",
- "windows-sys 0.45.0",
+ "redox_syscall 0.2.16",
+ "windows-sys 0.48.0",
]
[[package]]
@@ -525,19 +579,6 @@ dependencies = [
]
[[package]]
-name = "flume"
-version = "0.10.14"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1657b4441c3403d9f7b3409e47575237dac27b1b5726df654a6ecbf92f0f7577"
-dependencies = [
- "futures-core",
- "futures-sink",
- "nanorand",
- "pin-project",
- "spin",
-]
-
-[[package]]
name = "fnv"
version = "1.0.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -562,18 +603,6 @@ dependencies = [
]
[[package]]
-name = "futures-core"
-version = "0.3.26"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ec90ff4d0fe1f57d600049061dc6bb68ed03c7d2fbd697274c41805dcb3f8608"
-
-[[package]]
-name = "futures-sink"
-version = "0.3.26"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f310820bb3e8cfd46c80db4d7fb8353e15dfff853a127158425f31e0be6c8364"
-
-[[package]]
name = "fuzzy-matcher"
version = "0.3.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -584,9 +613,9 @@ dependencies = [
[[package]]
name = "generic-array"
-version = "0.14.6"
+version = "0.14.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bff49e947297f3312447abdca79f45f4738097cc82b06e72054d2223f601f1b9"
+checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a"
dependencies = [
"typenum",
"version_check",
@@ -594,15 +623,13 @@ dependencies = [
[[package]]
name = "getrandom"
-version = "0.2.8"
+version = "0.2.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c05aeb6a22b8f62540c194aac980f2115af067bfe15a0734d7277a768d396b31"
+checksum = "c85e1d9ab2eadba7e5040d4e09cbd6d072b76a557ad64e797c2cb9d4da21d7e4"
dependencies = [
"cfg-if",
- "js-sys",
"libc",
"wasi",
- "wasm-bindgen",
]
[[package]]
@@ -629,18 +656,6 @@ name = "hashbrown"
version = "0.12.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888"
-dependencies = [
- "ahash",
-]
-
-[[package]]
-name = "hashlink"
-version = "0.8.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "69fe1fcf8b4278d860ad0548329f892a3631fb63f82574df68275f34cdbe0ffa"
-dependencies = [
- "hashbrown",
-]
[[package]]
name = "heck"
@@ -703,16 +718,10 @@ dependencies = [
]
[[package]]
-name = "indenter"
-version = "0.3.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683"
-
-[[package]]
name = "indexmap"
-version = "1.9.2"
+version = "1.9.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1885e79c1fc4b10f0e172c475f458b7f7b93061064d98c3293e98c5ba0c8b399"
+checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99"
dependencies = [
"autocfg",
"hashbrown",
@@ -740,9 +749,9 @@ dependencies = [
[[package]]
name = "insta"
-version = "1.28.0"
+version = "1.29.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fea5b3894afe466b4bcf0388630fc15e11938a6074af0cd637c825ba2ec8a099"
+checksum = "9a28d25139df397cbca21408bb742cf6837e04cdbebf1b07b760caf971d6a972"
dependencies = [
"console",
"globset",
@@ -767,24 +776,25 @@ dependencies = [
[[package]]
name = "io-lifetimes"
-version = "1.0.6"
+version = "1.0.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cfa919a82ea574332e2de6e74b4c36e74d41982b335080fa59d4ef31be20fdf3"
+checksum = "9c66c74d2ae7e79a5a8f7ac924adbe38ee42a859c6539ad869eb51f0b52dc220"
dependencies = [
+ "hermit-abi 0.3.1",
"libc",
- "windows-sys 0.45.0",
+ "windows-sys 0.48.0",
]
[[package]]
name = "is-terminal"
-version = "0.4.4"
+version = "0.4.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "21b6b32576413a8e69b90e952e4a026476040d81017b80445deda5f2d3921857"
+checksum = "adcf93614601c8129ddf72e2d5633df827ba6551541c6d8c59520a371475be1f"
dependencies = [
"hermit-abi 0.3.1",
"io-lifetimes",
"rustix",
- "windows-sys 0.45.0",
+ "windows-sys 0.48.0",
]
[[package]]
@@ -855,9 +865,9 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
[[package]]
name = "libc"
-version = "0.2.140"
+version = "0.2.141"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "99227334921fae1a979cf0bfdfcc6b3e5ce376ef57e16fb6fb3ea2ed6095f80c"
+checksum = "3304a64d199bb964be99741b7a14d26972741915b3649639149b2479bb46f4b5"
[[package]]
name = "linked-hash-map"
@@ -867,9 +877,9 @@ checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f"
[[package]]
name = "linux-raw-sys"
-version = "0.1.4"
+version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f051f77a7c8e6957c0696eac88f26b0117e54f52d3fc682ab19397a8812846a4"
+checksum = "d59d8c75012853d2e872fb56bc8a2e53718e2cafe1a4c823143141c6d90c322f"
[[package]]
name = "lock_api"
@@ -892,25 +902,34 @@ dependencies = [
[[package]]
name = "logos"
-version = "0.12.1"
+version = "0.13.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bf8b031682c67a8e3d5446840f9573eb7fe26efe7ec8d195c9ac4c0647c502f1"
+checksum = "c000ca4d908ff18ac99b93a062cb8958d331c3220719c52e77cb19cc6ac5d2c1"
dependencies = [
"logos-derive",
]
[[package]]
-name = "logos-derive"
-version = "0.12.1"
+name = "logos-codegen"
+version = "0.13.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a1d849148dbaf9661a6151d1ca82b13bb4c4c128146a88d05253b38d4e2f496c"
+checksum = "dc487311295e0002e452025d6b580b77bb17286de87b57138f3b5db711cded68"
dependencies = [
"beef",
"fnv",
"proc-macro2",
"quote",
"regex-syntax",
- "syn",
+ "syn 2.0.13",
+]
+
+[[package]]
+name = "logos-derive"
+version = "0.13.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dbfc0d229f1f42d790440136d941afd806bc9e949e2bcb8faa813b0f00d1267e"
+dependencies = [
+ "logos-codegen",
]
[[package]]
@@ -946,15 +965,6 @@ checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d"
[[package]]
name = "memoffset"
-version = "0.6.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce"
-dependencies = [
- "autocfg",
-]
-
-[[package]]
-name = "memoffset"
version = "0.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d61c719bcfbcf5d62b3a09efa6088de8c54bc0bfcd3ea7ae39fcc186108b8de1"
@@ -984,15 +994,6 @@ dependencies = [
]
[[package]]
-name = "nanorand"
-version = "0.7.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6a51313c5820b0b02bd422f4b44776fbf47961755c74ce64afc73bfad10226c3"
-dependencies = [
- "getrandom",
-]
-
-[[package]]
name = "notify"
version = "5.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1053,9 +1054,9 @@ checksum = "0ab1bc2a289d34bd04a330323ac98a1b4bc82c9d9fcb1e66b63caa84da26b575"
[[package]]
name = "os_str_bytes"
-version = "6.4.1"
+version = "6.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9b7820b9daea5457c9f21c69448905d723fbd21136ccf521748f23fd49e723ee"
+checksum = "ceedf44fb00f2d1984b0bc98102627ce622e083e49a5bacdb3e514fa4238e267"
[[package]]
name = "parking_lot"
@@ -1075,12 +1076,24 @@ checksum = "9069cbb9f99e3a5083476ccb29ceb1de18b9118cafa53e90c9551235de2b9521"
dependencies = [
"cfg-if",
"libc",
- "redox_syscall",
+ "redox_syscall 0.2.16",
"smallvec",
"windows-sys 0.45.0",
]
[[package]]
+name = "parser"
+version = "0.0.0"
+dependencies = [
+ "insta",
+ "logos",
+ "once_cell",
+ "regex",
+ "rowan",
+ "syntax",
+]
+
+[[package]]
name = "percent-encoding"
version = "2.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1088,9 +1101,9 @@ checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e"
[[package]]
name = "pest"
-version = "2.5.6"
+version = "2.5.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8cbd939b234e95d72bc393d51788aec68aeeb5d51e748ca08ff3aad58cb722f7"
+checksum = "7b1403e8401ad5dedea73c626b99758535b342502f8d1e361f4a2dd952749122"
dependencies = [
"thiserror",
"ucd-trie",
@@ -1098,9 +1111,9 @@ dependencies = [
[[package]]
name = "pest_derive"
-version = "2.5.6"
+version = "2.5.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a81186863f3d0a27340815be8f2078dd8050b14cd71913db9fbda795e5f707d7"
+checksum = "be99c4c1d2fc2769b1d00239431d711d08f6efedcecb8b6e30707160aee99c15"
dependencies = [
"pest",
"pest_generator",
@@ -1108,22 +1121,22 @@ dependencies = [
[[package]]
name = "pest_generator"
-version = "2.5.6"
+version = "2.5.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "75a1ef20bf3193c15ac345acb32e26b3dc3223aff4d77ae4fc5359567683796b"
+checksum = "e56094789873daa36164de2e822b3888c6ae4b4f9da555a1103587658c805b1e"
dependencies = [
"pest",
"pest_meta",
"proc-macro2",
"quote",
- "syn",
+ "syn 2.0.13",
]
[[package]]
name = "pest_meta"
-version = "2.5.6"
+version = "2.5.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5e3b284b1f13a20dc5ebc90aff59a51b8d7137c221131b52a7260c08cbc1cc80"
+checksum = "6733073c7cff3d8459fda0e42f13a047870242aed8b509fe98000928975f359e"
dependencies = [
"once_cell",
"pest",
@@ -1169,26 +1182,6 @@ dependencies = [
]
[[package]]
-name = "pin-project"
-version = "1.0.12"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ad29a609b6bcd67fee905812e544992d216af9d755757c05ed2d0e15a74c6ecc"
-dependencies = [
- "pin-project-internal",
-]
-
-[[package]]
-name = "pin-project-internal"
-version = "1.0.12"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "069bdb1e05adc7a8990dce9cc75370895fbe4e3d58b9b73bf1aee56359344a55"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
-]
-
-[[package]]
name = "plotters"
version = "0.3.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1217,43 +1210,19 @@ dependencies = [
]
[[package]]
-name = "proc-macro-error"
-version = "1.0.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c"
-dependencies = [
- "proc-macro-error-attr",
- "proc-macro2",
- "quote",
- "syn",
- "version_check",
-]
-
-[[package]]
-name = "proc-macro-error-attr"
-version = "1.0.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869"
-dependencies = [
- "proc-macro2",
- "quote",
- "version_check",
-]
-
-[[package]]
name = "proc-macro2"
-version = "1.0.51"
+version = "1.0.56"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5d727cae5b39d21da60fa540906919ad737832fe0b1c165da3a34d6548c849d6"
+checksum = "2b63bdb0cd06f1f4dedf69b254734f9b45af66e4a031e42a7480257d9898b435"
dependencies = [
"unicode-ident",
]
[[package]]
name = "quote"
-version = "1.0.23"
+version = "1.0.26"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8856d8364d252a14d474036ea1358d63c9e6965c8e5c1885c18f73d70bff9c7b"
+checksum = "4424af4bf778aae2051a77b60283332f386554255d722233d09fbfc7e30da2fc"
dependencies = [
"proc-macro2",
]
@@ -1305,21 +1274,30 @@ dependencies = [
]
[[package]]
+name = "redox_syscall"
+version = "0.3.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29"
+dependencies = [
+ "bitflags",
+]
+
+[[package]]
name = "redox_users"
version = "0.4.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b"
dependencies = [
"getrandom",
- "redox_syscall",
+ "redox_syscall 0.2.16",
"thiserror",
]
[[package]]
name = "regex"
-version = "1.7.1"
+version = "1.7.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "48aaa5748ba571fb95cd2c85c09f629215d3a6ece942baa100950af03a34f733"
+checksum = "8b1f693b24f6ac912f4893ef08244d70b6067480d2f1a46e950c9691e6749d1d"
dependencies = [
"aho-corasick",
"memchr",
@@ -1328,19 +1306,19 @@ dependencies = [
[[package]]
name = "regex-syntax"
-version = "0.6.28"
+version = "0.6.29"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "456c603be3e8d448b072f410900c09faf164fbce2d480456f50eea6e25f9c848"
+checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1"
[[package]]
name = "rowan"
-version = "0.15.10"
+version = "0.15.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5811547e7ba31e903fe48c8ceab10d40d70a101f3d15523c847cce91aa71f332"
+checksum = "64449cfef9483a475ed56ae30e2da5ee96448789fb2aa240a04beb6a055078bf"
dependencies = [
"countme",
"hashbrown",
- "memoffset 0.6.5",
+ "memoffset",
"rustc-hash",
"text-size",
]
@@ -1353,61 +1331,25 @@ checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2"
[[package]]
name = "rustix"
-version = "0.36.9"
+version = "0.37.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fd5c6ff11fecd55b40746d1995a02f2eb375bf8c00d192d521ee09f42bef37bc"
+checksum = "85597d61f83914ddeba6a47b3b8ffe7365107221c2e557ed94426489fefb5f77"
dependencies = [
"bitflags",
"errno",
"io-lifetimes",
"libc",
"linux-raw-sys",
- "windows-sys 0.45.0",
+ "windows-sys 0.48.0",
]
[[package]]
-name = "rustversion"
-version = "1.0.12"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4f3208ce4d8448b3f3e7d168a73f5e0c43a61e32930de3bceeccedb388b6bf06"
-
-[[package]]
name = "ryu"
version = "1.0.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f91339c0467de62360649f8d3e185ca8de4224ff281f66000de5eb2a77a79041"
[[package]]
-name = "salsa-2022"
-version = "0.1.0"
-source = "git+https://github.com/salsa-rs/salsa?rev=ef7c0f12c8159e7025316e959c26f6278a576fa5#ef7c0f12c8159e7025316e959c26f6278a576fa5"
-dependencies = [
- "arc-swap",
- "crossbeam",
- "crossbeam-utils",
- "dashmap",
- "hashlink",
- "indexmap",
- "log",
- "parking_lot",
- "rustc-hash",
- "salsa-2022-macros",
- "smallvec",
-]
-
-[[package]]
-name = "salsa-2022-macros"
-version = "0.1.0"
-source = "git+https://github.com/salsa-rs/salsa?rev=ef7c0f12c8159e7025316e959c26f6278a576fa5#ef7c0f12c8159e7025316e959c26f6278a576fa5"
-dependencies = [
- "eyre",
- "heck",
- "proc-macro2",
- "quote",
- "syn",
-]
-
-[[package]]
name = "same-file"
version = "1.0.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1424,29 +1366,29 @@ checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd"
[[package]]
name = "serde"
-version = "1.0.154"
+version = "1.0.159"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8cdd151213925e7f1ab45a9bbfb129316bd00799784b174b7cc7bcd16961c49e"
+checksum = "3c04e8343c3daeec41f58990b9d77068df31209f2af111e059e9fe9646693065"
dependencies = [
"serde_derive",
]
[[package]]
name = "serde_derive"
-version = "1.0.154"
+version = "1.0.159"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4fc80d722935453bcafdc2c9a73cd6fac4dc1938f0346035d84bf99fa9e33217"
+checksum = "4c614d17805b093df4b147b51339e7e44bf05ef59fba1e45d83500bcfb4d8585"
dependencies = [
"proc-macro2",
"quote",
- "syn",
+ "syn 2.0.13",
]
[[package]]
name = "serde_json"
-version = "1.0.94"
+version = "1.0.95"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1c533a59c9d8a93a09c6ab31f0fd5e5f4dd1b8fc9434804029839884765d04ea"
+checksum = "d721eca97ac802aa7777b701877c8004d950fc142651367300d21c1cc0194744"
dependencies = [
"itoa",
"ryu",
@@ -1465,13 +1407,13 @@ dependencies = [
[[package]]
name = "serde_repr"
-version = "0.1.11"
+version = "0.1.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "395627de918015623b32e7669714206363a7fc00382bf477e72c1f7533e8eafc"
+checksum = "bcec881020c684085e55a25f7fd888954d56609ef363479dc5a1305eb0d40cab"
dependencies = [
"proc-macro2",
"quote",
- "syn",
+ "syn 2.0.13",
]
[[package]]
@@ -1522,47 +1464,27 @@ dependencies = [
]
[[package]]
-name = "spin"
-version = "0.9.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7dccf47db1b41fa1573ed27ccf5e08e3ca771cb994f776668c5ebda893b248fc"
-dependencies = [
- "lock_api",
-]
-
-[[package]]
name = "strsim"
version = "0.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623"
[[package]]
-name = "strum"
-version = "0.24.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "063e6045c0e62079840579a7e47a355ae92f60eb74daaf156fb1e84ba164e63f"
-dependencies = [
- "strum_macros",
-]
-
-[[package]]
-name = "strum_macros"
-version = "0.24.3"
+name = "syn"
+version = "1.0.109"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1e385be0d24f186b4ce2f9982191e7101bb737312ad61c1f2f984f34bcf85d59"
+checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237"
dependencies = [
- "heck",
"proc-macro2",
"quote",
- "rustversion",
- "syn",
+ "unicode-ident",
]
[[package]]
name = "syn"
-version = "1.0.109"
+version = "2.0.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237"
+checksum = "4c9da457c5285ac1f936ebd076af6dac17a61cfe7826f2076b4d015cf47bc8ec"
dependencies = [
"proc-macro2",
"quote",
@@ -1570,70 +1492,68 @@ dependencies = [
]
[[package]]
-name = "tempfile"
-version = "3.4.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "af18f7ae1acd354b992402e9ec5864359d693cd8a79dcbef59f76891701c1e95"
+name = "syntax"
+version = "0.0.0"
dependencies = [
- "cfg-if",
- "fastrand",
- "redox_syscall",
- "rustix",
- "windows-sys 0.42.0",
+ "itertools",
+ "rowan",
]
[[package]]
-name = "termcolor"
-version = "1.2.0"
+name = "tempfile"
+version = "3.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "be55cf8942feac5c765c2c993422806843c9a9a45d4d5c407ad6dd2ea95eb9b6"
+checksum = "b9fbec84f381d5795b08656e4912bec604d162bff9291d6189a78f4c8ab87998"
dependencies = [
- "winapi-util",
+ "cfg-if",
+ "fastrand",
+ "redox_syscall 0.3.5",
+ "rustix",
+ "windows-sys 0.45.0",
]
[[package]]
name = "texlab"
-version = "5.4.1"
+version = "5.4.2"
dependencies = [
"anyhow",
"assert_unordered",
- "chrono",
- "clap 4.1.8",
+ "base-db",
+ "citeproc",
+ "clap 4.2.1",
"criterion",
"crossbeam-channel",
"dashmap",
"dirs",
+ "distro",
"encoding_rs",
"encoding_rs_io",
"fern",
"flate2",
- "flume",
"fuzzy-matcher",
"human_name",
"insta",
- "isocountry",
"itertools",
"log",
- "logos",
"lsp-server",
"lsp-types",
"notify",
"once_cell",
+ "parking_lot",
+ "parser",
"regex",
"rowan",
"rustc-hash",
- "salsa-2022",
"serde",
"serde_json",
"serde_regex",
"serde_repr",
"smol_str",
- "strum",
+ "syntax",
"tempfile",
"thiserror",
"threadpool",
"titlecase",
- "unicode-normalization",
]
[[package]]
@@ -1650,22 +1570,22 @@ checksum = "222a222a5bfe1bba4a77b45ec488a741b3cb8872e5e499451fd7d0129c9c7c3d"
[[package]]
name = "thiserror"
-version = "1.0.39"
+version = "1.0.40"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a5ab016db510546d856297882807df8da66a16fb8c4101cb8b30054b0d5b2d9c"
+checksum = "978c9a314bd8dc99be594bc3c175faaa9794be04a5a5e153caba6915336cebac"
dependencies = [
"thiserror-impl",
]
[[package]]
name = "thiserror-impl"
-version = "1.0.39"
+version = "1.0.40"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5420d42e90af0c38c3290abcca25b9b3bdf379fc9f55c528f53a269d9c9a267e"
+checksum = "f9456a42c5b0d803c8cd86e73dd7cc9edd429499f37a3550d286d5e86720569f"
dependencies = [
"proc-macro2",
"quote",
- "syn",
+ "syn 2.0.13",
]
[[package]]
@@ -1737,9 +1657,9 @@ checksum = "9e79c4d996edb816c91e4308506774452e55e95c3c9de07b6729e17e15a5ef81"
[[package]]
name = "unicode-bidi"
-version = "0.3.11"
+version = "0.3.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "524b68aca1d05e03fdf03fcdce2c6c94b6daf6d16861ddaa7e4f2b6638a9052c"
+checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460"
[[package]]
name = "unicode-case-mapping"
@@ -1787,6 +1707,12 @@ dependencies = [
]
[[package]]
+name = "utf8parse"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a"
+
+[[package]]
name = "version_check"
version = "0.9.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1794,12 +1720,11 @@ checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f"
[[package]]
name = "walkdir"
-version = "2.3.2"
+version = "2.3.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "808cf2735cd4b6866113f648b791c6adc5714537bc222d9347bb203386ffda56"
+checksum = "36df944cda56c7d8d8b7496af378e6b16de9284591917d307c9b4d313c44e698"
dependencies = [
"same-file",
- "winapi",
"winapi-util",
]
@@ -1830,7 +1755,7 @@ dependencies = [
"once_cell",
"proc-macro2",
"quote",
- "syn",
+ "syn 1.0.109",
"wasm-bindgen-shared",
]
@@ -1852,7 +1777,7 @@ checksum = "2aff81306fcac3c7515ad4e177f521b5c9a15f2b08f4e32d823066102f35a5f6"
dependencies = [
"proc-macro2",
"quote",
- "syn",
+ "syn 1.0.109",
"wasm-bindgen-backend",
"wasm-bindgen-shared",
]
@@ -1910,13 +1835,13 @@ version = "0.42.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7"
dependencies = [
- "windows_aarch64_gnullvm",
- "windows_aarch64_msvc",
- "windows_i686_gnu",
- "windows_i686_msvc",
- "windows_x86_64_gnu",
- "windows_x86_64_gnullvm",
- "windows_x86_64_msvc",
+ "windows_aarch64_gnullvm 0.42.2",
+ "windows_aarch64_msvc 0.42.2",
+ "windows_i686_gnu 0.42.2",
+ "windows_i686_msvc 0.42.2",
+ "windows_x86_64_gnu 0.42.2",
+ "windows_x86_64_gnullvm 0.42.2",
+ "windows_x86_64_msvc 0.42.2",
]
[[package]]
@@ -1925,65 +1850,131 @@ version = "0.45.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0"
dependencies = [
- "windows-targets",
+ "windows-targets 0.42.2",
+]
+
+[[package]]
+name = "windows-sys"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9"
+dependencies = [
+ "windows-targets 0.48.0",
+]
+
+[[package]]
+name = "windows-targets"
+version = "0.42.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071"
+dependencies = [
+ "windows_aarch64_gnullvm 0.42.2",
+ "windows_aarch64_msvc 0.42.2",
+ "windows_i686_gnu 0.42.2",
+ "windows_i686_msvc 0.42.2",
+ "windows_x86_64_gnu 0.42.2",
+ "windows_x86_64_gnullvm 0.42.2",
+ "windows_x86_64_msvc 0.42.2",
]
[[package]]
name = "windows-targets"
-version = "0.42.1"
+version = "0.48.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8e2522491fbfcd58cc84d47aeb2958948c4b8982e9a2d8a2a35bbaed431390e7"
+checksum = "7b1eb6f0cd7c80c79759c929114ef071b87354ce476d9d94271031c0497adfd5"
dependencies = [
- "windows_aarch64_gnullvm",
- "windows_aarch64_msvc",
- "windows_i686_gnu",
- "windows_i686_msvc",
- "windows_x86_64_gnu",
- "windows_x86_64_gnullvm",
- "windows_x86_64_msvc",
+ "windows_aarch64_gnullvm 0.48.0",
+ "windows_aarch64_msvc 0.48.0",
+ "windows_i686_gnu 0.48.0",
+ "windows_i686_msvc 0.48.0",
+ "windows_x86_64_gnu 0.48.0",
+ "windows_x86_64_gnullvm 0.48.0",
+ "windows_x86_64_msvc 0.48.0",
]
[[package]]
name = "windows_aarch64_gnullvm"
-version = "0.42.1"
+version = "0.42.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8"
+
+[[package]]
+name = "windows_aarch64_gnullvm"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc"
+
+[[package]]
+name = "windows_aarch64_msvc"
+version = "0.42.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8c9864e83243fdec7fc9c5444389dcbbfd258f745e7853198f365e3c4968a608"
+checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43"
[[package]]
name = "windows_aarch64_msvc"
-version = "0.42.1"
+version = "0.48.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4c8b1b673ffc16c47a9ff48570a9d85e25d265735c503681332589af6253c6c7"
+checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3"
[[package]]
name = "windows_i686_gnu"
-version = "0.42.1"
+version = "0.42.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "de3887528ad530ba7bdbb1faa8275ec7a1155a45ffa57c37993960277145d640"
+checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f"
+
+[[package]]
+name = "windows_i686_gnu"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241"
+
+[[package]]
+name = "windows_i686_msvc"
+version = "0.42.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060"
[[package]]
name = "windows_i686_msvc"
-version = "0.42.1"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00"
+
+[[package]]
+name = "windows_x86_64_gnu"
+version = "0.42.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bf4d1122317eddd6ff351aa852118a2418ad4214e6613a50e0191f7004372605"
+checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36"
[[package]]
name = "windows_x86_64_gnu"
-version = "0.42.1"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1"
+
+[[package]]
+name = "windows_x86_64_gnullvm"
+version = "0.42.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c1040f221285e17ebccbc2591ffdc2d44ee1f9186324dd3e84e99ac68d699c45"
+checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3"
[[package]]
name = "windows_x86_64_gnullvm"
-version = "0.42.1"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953"
+
+[[package]]
+name = "windows_x86_64_msvc"
+version = "0.42.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "628bfdf232daa22b0d64fdb62b09fcc36bb01f05a3939e20ab73aaf9470d0463"
+checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0"
[[package]]
name = "windows_x86_64_msvc"
-version = "0.42.1"
+version = "0.48.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "447660ad36a13288b1db4d4248e857b510e8c3a225c822ba4fb748c0aafecffd"
+checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a"
[[package]]
name = "yaml-rust"
diff --git a/support/texlab/Cargo.toml b/support/texlab/Cargo.toml
index dfa23f744a..59e182bf20 100644
--- a/support/texlab/Cargo.toml
+++ b/support/texlab/Cargo.toml
@@ -1,84 +1,14 @@
-[package]
-name = "texlab"
-description = "LaTeX Language Server"
-version = "5.4.1"
+[workspace]
+members = ["crates/*"]
+
+[workspace.package]
license = "GPL-3.0"
-readme = "README.md"
authors = [
- "Eric Förster <eric.foerster@outlook.com>",
- "Patrick Förster <patrick.foerster@outlook.de>",
+ "Eric Förster <eric.foerster@outlook.com>",
+ "Patrick Förster <patrick.foerster@outlook.de>",
]
edition = "2021"
rust-version = "1.65"
-homepage = "https://github.com/latex-lsp/texlab"
-repository = "https://github.com/latex-lsp/texlab"
-documentation = "https://github.com/latex-lsp/texlab"
-keywords = ["lsp", "server", "latex", "bibtex"]
-categories = ["development-tools"]
-exclude = [
- ".gitattributes",
- ".gitignore",
- ".github/**",
- "tests/it/**",
- "*.snap",
- "texlab.1",
- "texlab.pdf",
- "texlab.tex",
-]
-
-[[bin]]
-name = "texlab"
-test = false
-
-[lib]
-doctest = false
-
-[dependencies]
-anyhow = "1.0.69"
-chrono = { version = "0.4.23", default-features = false, features = ["std"] }
-clap = { version = "4.1.6", features = ["derive"] }
-crossbeam-channel = "0.5.6"
-dashmap = "5.4.0"
-dirs = "4.0.0"
-encoding_rs = "0.8.32"
-encoding_rs_io = "0.1.7"
-fern = "0.6.1"
-flate2 = "1.0.25"
-flume = "0.10.14"
-fuzzy-matcher = { version = "0.3.7", features = ["compact"] }
-human_name = { version = "2.0.1", default-features = false }
-isocountry = "0.3.2"
-itertools = "0.10.5"
-log = "0.4.17"
-logos = "0.12.1"
-lsp-server = "0.7.0"
-lsp-types = "0.94.0"
-notify = "5.1.0"
-once_cell = "1.17.1"
-regex = "1.7.1"
-rowan = "0.15.10"
-rustc-hash = "1.1.0"
-serde = "1.0.152"
-serde_json = "1.0.93"
-serde_regex = "1.1.0"
-serde_repr = "0.1.10"
-smol_str = { version = "0.1.24", features = ["serde"] }
-strum = { version = "0.24.1", features = ["derive"] }
-tempfile = "3.3.0"
-thiserror = "1.0.38"
-threadpool = "1.8.1"
-titlecase = "2.2.1"
-unicode-normalization = "0.1.22"
-
-[dependencies.salsa]
-git = "https://github.com/salsa-rs/salsa"
-rev = "ef7c0f12c8159e7025316e959c26f6278a576fa5"
-package = "salsa-2022"
-
-[dev-dependencies]
-assert_unordered = "0.3.5"
-criterion = { version = "0.4.0" }
-insta = { version = "1.28.0", features = ["glob", "redactions", "json"] }
[profile.release]
lto = "thin"
@@ -87,8 +17,3 @@ incremental = true
[profile.bench]
lto = "thin"
incremental = true
-
-[[bench]]
-name = "bench_main"
-path = "benches/bench_main.rs"
-harness = false
diff --git a/support/texlab/benches/bench_main.rs b/support/texlab/benches/bench_main.rs
deleted file mode 100644
index 196afb1f43..0000000000
--- a/support/texlab/benches/bench_main.rs
+++ /dev/null
@@ -1,25 +0,0 @@
-use criterion::{black_box, criterion_group, criterion_main, Criterion};
-use lsp_types::{Position, Url};
-use texlab::{
- db::{Language, Owner, Workspace},
- parser::parse_latex,
- Database,
-};
-
-fn criterion_benchmark(c: &mut Criterion) {
- c.bench_function("LaTeX/Parser", |b| {
- b.iter(|| parse_latex(black_box(include_str!("../texlab.tex"))));
- });
-
- c.bench_function("LaTeX/Completion/Command", |b| {
- let uri = Url::parse("http://example.com/texlab.tex").unwrap();
- let text = include_str!("../texlab.tex").to_string();
- let mut db = Database::default();
- Workspace::get(&db).open(&mut db, uri.clone(), text, Language::Tex, Owner::Client);
- b.iter(|| texlab::features::completion::complete(&db, &uri, Position::new(0, 1)));
- });
-}
-
-criterion_group!(benches, criterion_benchmark);
-
-criterion_main!(benches);
diff --git a/support/texlab/crates/base-db/Cargo.toml b/support/texlab/crates/base-db/Cargo.toml
new file mode 100644
index 0000000000..2c7efe9ac0
--- /dev/null
+++ b/support/texlab/crates/base-db/Cargo.toml
@@ -0,0 +1,25 @@
+[package]
+name = "base-db"
+version = "0.0.0"
+license.workspace = true
+authors.workspace = true
+edition.workspace = true
+rust-version.workspace = true
+
+[dependencies]
+dirs = "5.0.0"
+distro = { path = "../distro" }
+itertools = "0.10.5"
+log = "0.4.17"
+notify = "5.1.0"
+once_cell = "1.17.1"
+parser = { path = "../parser" }
+regex = "1.7.3"
+rowan = "0.15.11"
+rustc-hash = "1.1.0"
+syntax = { path = "../syntax" }
+text-size = "1.1.0"
+url = "2.3.1"
+
+[lib]
+doctest = false
diff --git a/support/texlab/src/config.rs b/support/texlab/crates/base-db/src/config.rs
index 33cbacd3be..56ee5ee237 100644
--- a/support/texlab/src/config.rs
+++ b/support/texlab/crates/base-db/src/config.rs
@@ -159,57 +159,11 @@ impl Default for SymbolConfig {
impl Default for SyntaxConfig {
fn default() -> Self {
- let math_environments = [
- "align",
- "align*",
- "alignat",
- "alignat*",
- "aligned",
- "aligned*",
- "alignedat",
- "alignedat*",
- "array",
- "array*",
- "Bmatrix",
- "Bmatrix*",
- "bmatrix",
- "bmatrix*",
- "cases",
- "cases*",
- "CD",
- "CD*",
- "eqnarray",
- "eqnarray*",
- "equation",
- "equation*",
- "IEEEeqnarray",
- "IEEEeqnarray*",
- "subequations",
- "subequations*",
- "gather",
- "gather*",
- "gathered",
- "gathered*",
- "matrix",
- "matrix*",
- "multline",
- "multline*",
- "pmatrix",
- "pmatrix*",
- "smallmatrix",
- "smallmatrix*",
- "split",
- "split*",
- "subarray",
- "subarray*",
- "Vmatrix",
- "Vmatrix*",
- "vmatrix",
- "vmatrix*",
- ]
- .into_iter()
- .map(String::from)
- .collect();
+ let math_environments = DEFAULT_MATH_ENVIRONMENTS
+ .iter()
+ .copied()
+ .map(String::from)
+ .collect();
let enum_environments = ["enumerate", "itemize", "description"]
.into_iter()
@@ -228,3 +182,52 @@ impl Default for SyntaxConfig {
}
}
}
+
+static DEFAULT_MATH_ENVIRONMENTS: &[&str] = &[
+ "align",
+ "align*",
+ "alignat",
+ "alignat*",
+ "aligned",
+ "aligned*",
+ "alignedat",
+ "alignedat*",
+ "array",
+ "array*",
+ "Bmatrix",
+ "Bmatrix*",
+ "bmatrix",
+ "bmatrix*",
+ "cases",
+ "cases*",
+ "CD",
+ "CD*",
+ "eqnarray",
+ "eqnarray*",
+ "equation",
+ "equation*",
+ "IEEEeqnarray",
+ "IEEEeqnarray*",
+ "subequations",
+ "subequations*",
+ "gather",
+ "gather*",
+ "gathered",
+ "gathered*",
+ "matrix",
+ "matrix*",
+ "multline",
+ "multline*",
+ "pmatrix",
+ "pmatrix*",
+ "smallmatrix",
+ "smallmatrix*",
+ "split",
+ "split*",
+ "subarray",
+ "subarray*",
+ "Vmatrix",
+ "Vmatrix*",
+ "vmatrix",
+ "vmatrix*",
+];
diff --git a/support/texlab/crates/base-db/src/diagnostics.rs b/support/texlab/crates/base-db/src/diagnostics.rs
new file mode 100644
index 0000000000..f5d13400a6
--- /dev/null
+++ b/support/texlab/crates/base-db/src/diagnostics.rs
@@ -0,0 +1,25 @@
+pub mod bib;
+pub mod log;
+pub mod tex;
+
+use rowan::TextRange;
+use syntax::BuildError;
+
+#[derive(Debug, Clone)]
+pub struct Diagnostic {
+ pub range: TextRange,
+ pub code: ErrorCode,
+}
+
+#[derive(Debug, Clone)]
+pub enum ErrorCode {
+ UnexpectedRCurly,
+ RCurlyInserted,
+ MismatchedEnvironment,
+ ExpectingLCurly,
+ ExpectingKey,
+ ExpectingRCurly,
+ ExpectingEq,
+ ExpectingFieldValue,
+ Build(BuildError),
+}
diff --git a/support/texlab/crates/base-db/src/diagnostics/bib.rs b/support/texlab/crates/base-db/src/diagnostics/bib.rs
new file mode 100644
index 0000000000..f931a43c51
--- /dev/null
+++ b/support/texlab/crates/base-db/src/diagnostics/bib.rs
@@ -0,0 +1,69 @@
+use rowan::{ast::AstNode, TextRange};
+use syntax::bibtex::{self, HasDelims, HasEq, HasName, HasType, HasValue};
+
+use crate::{Document, DocumentData};
+
+use super::{Diagnostic, ErrorCode};
+
+pub fn analyze(document: &mut Document) {
+ let DocumentData::Bib(data) = &document.data else { return };
+
+ for node in bibtex::SyntaxNode::new_root(data.green.clone()).descendants() {
+ if let Some(entry) = bibtex::Entry::cast(node.clone()) {
+ analyze_entry(document, entry);
+ } else if let Some(field) = bibtex::Field::cast(node.clone()) {
+ analyze_field(document, field);
+ }
+ }
+}
+
+fn analyze_entry(document: &mut Document, entry: bibtex::Entry) {
+ if entry.left_delim_token().is_none() {
+ document.diagnostics.push(Diagnostic {
+ range: entry.type_token().unwrap().text_range(),
+ code: ErrorCode::ExpectingLCurly,
+ });
+
+ return;
+ }
+
+ if entry.name_token().is_none() {
+ document.diagnostics.push(Diagnostic {
+ range: entry.left_delim_token().unwrap().text_range(),
+ code: ErrorCode::ExpectingKey,
+ });
+
+ return;
+ }
+
+ if entry.right_delim_token().is_none() {
+ document.diagnostics.push(Diagnostic {
+ range: TextRange::empty(entry.syntax().text_range().end()),
+ code: ErrorCode::ExpectingRCurly,
+ });
+
+ return;
+ }
+}
+
+fn analyze_field(document: &mut Document, field: bibtex::Field) {
+ if field.eq_token().is_none() {
+ let code = ErrorCode::ExpectingEq;
+ document.diagnostics.push(Diagnostic {
+ range: field.name_token().unwrap().text_range(),
+ code,
+ });
+
+ return;
+ }
+
+ if field.value().is_none() {
+ let code = ErrorCode::ExpectingFieldValue;
+ document.diagnostics.push(Diagnostic {
+ range: field.name_token().unwrap().text_range(),
+ code,
+ });
+
+ return;
+ }
+}
diff --git a/support/texlab/crates/base-db/src/diagnostics/log.rs b/support/texlab/crates/base-db/src/diagnostics/log.rs
new file mode 100644
index 0000000000..9e97a4e788
--- /dev/null
+++ b/support/texlab/crates/base-db/src/diagnostics/log.rs
@@ -0,0 +1,68 @@
+use rowan::{TextLen, TextRange, TextSize};
+use rustc_hash::FxHashMap;
+use syntax::BuildError;
+use url::Url;
+
+use crate::{Document, DocumentData, Workspace};
+
+use super::{Diagnostic, ErrorCode};
+
+pub fn analyze<'a>(
+ workspace: &'a Workspace,
+ log_document: &'a Document,
+) -> FxHashMap<&'a Document, Vec<Diagnostic>> {
+ let mut results = FxHashMap::default();
+
+ let DocumentData::Log(data) = &log_document.data else { return results };
+
+ let parents = workspace.parents(log_document);
+ let Some(root_document) = parents.iter().next() else { return results };
+
+ let Some(base_path) = root_document.path
+ .as_deref()
+ .and_then(|path| path.parent()) else { return results };
+
+ for error in &data.errors {
+ let full_path = base_path.join(&error.relative_path);
+ let Ok(full_path_uri) = Url::from_file_path(&full_path) else { continue };
+ let tex_document = workspace.lookup(&full_path_uri).unwrap_or(root_document);
+
+ let range = find_range_of_hint(tex_document, error).unwrap_or_else(|| {
+ let line = error.line.unwrap_or(0);
+ let offset = *tex_document
+ .line_index
+ .newlines
+ .get(line as usize)
+ .unwrap_or(&TextSize::from(0));
+
+ TextRange::empty(offset)
+ });
+
+ let diagnostic = Diagnostic {
+ range,
+ code: ErrorCode::Build(error.clone()),
+ };
+
+ results.entry(tex_document).or_default().push(diagnostic);
+ }
+
+ results
+}
+
+fn find_range_of_hint(document: &Document, error: &BuildError) -> Option<TextRange> {
+ let line = error.line? as usize;
+ let hint = error.hint.as_deref()?;
+ let line_index = &document.line_index;
+
+ let line_start = line_index.newlines.get(line).copied()?;
+ let line_end = line_index
+ .newlines
+ .get(line + 1)
+ .copied()
+ .unwrap_or((&document.text).text_len());
+
+ let line_text = &document.text[line_start.into()..line_end.into()];
+ let hint_start = line_start + TextSize::try_from(line_text.find(hint)?).unwrap();
+ let hint_end = hint_start + hint.text_len();
+ Some(TextRange::new(hint_start, hint_end))
+}
diff --git a/support/texlab/crates/base-db/src/diagnostics/tex.rs b/support/texlab/crates/base-db/src/diagnostics/tex.rs
new file mode 100644
index 0000000000..81b6e4401a
--- /dev/null
+++ b/support/texlab/crates/base-db/src/diagnostics/tex.rs
@@ -0,0 +1,116 @@
+use rowan::{ast::AstNode, NodeOrToken, TextRange};
+use syntax::latex;
+
+use crate::{Config, Document, DocumentData};
+
+use super::{Diagnostic, ErrorCode};
+
+pub fn analyze(document: &mut Document, config: &Config) {
+ if !document.uri.as_str().ends_with(".tex") {
+ return;
+ }
+
+ let DocumentData::Tex(data) = &document.data else { return };
+
+ let mut traversal = latex::SyntaxNode::new_root(data.green.clone()).preorder();
+ while let Some(event) = traversal.next() {
+ match event {
+ rowan::WalkEvent::Enter(node) => {
+ if let Some(environment) = latex::Environment::cast(node.clone()) {
+ if environment
+ .begin()
+ .and_then(|begin| begin.name())
+ .and_then(|name| name.key())
+ .map_or(false, |name| {
+ config
+ .syntax
+ .verbatim_environments
+ .contains(&name.to_string())
+ })
+ {
+ traversal.skip_subtree();
+ continue;
+ }
+ }
+
+ analyze_environment(document, node.clone())
+ .or_else(|| analyze_curly_group(document, node.clone(), config))
+ .or_else(|| analyze_curly_braces(document, node));
+ }
+ rowan::WalkEvent::Leave(_) => {
+ continue;
+ }
+ };
+ }
+}
+
+fn analyze_environment(document: &mut Document, node: latex::SyntaxNode) -> Option<()> {
+ let environment = latex::Environment::cast(node)?;
+ let begin = environment.begin()?.name()?.key()?;
+ let end = environment.end()?.name()?.key()?;
+ if begin != end {
+ document.diagnostics.push(Diagnostic {
+ range: latex::small_range(&begin),
+ code: ErrorCode::MismatchedEnvironment,
+ });
+ }
+
+ Some(())
+}
+
+fn analyze_curly_group(
+ document: &mut Document,
+ node: latex::SyntaxNode,
+ config: &Config,
+) -> Option<()> {
+ if !matches!(
+ node.kind(),
+ latex::CURLY_GROUP
+ | latex::CURLY_GROUP_COMMAND
+ | latex::CURLY_GROUP_KEY_VALUE
+ | latex::CURLY_GROUP_WORD
+ | latex::CURLY_GROUP_WORD_LIST
+ ) {
+ return None;
+ }
+
+ let is_inside_verbatim_environment = node
+ .ancestors()
+ .filter_map(latex::Environment::cast)
+ .filter_map(|env| env.begin())
+ .filter_map(|begin| begin.name())
+ .filter_map(|name| name.key())
+ .any(|name| {
+ config
+ .syntax
+ .verbatim_environments
+ .contains(&name.to_string())
+ });
+
+ if !is_inside_verbatim_environment
+ && !node
+ .children_with_tokens()
+ .filter_map(NodeOrToken::into_token)
+ .any(|token| token.kind() == latex::R_CURLY)
+ {
+ document.diagnostics.push(Diagnostic {
+ range: TextRange::empty(node.text_range().end()),
+ code: ErrorCode::RCurlyInserted,
+ });
+ }
+
+ Some(())
+}
+
+fn analyze_curly_braces(document: &mut Document, node: latex::SyntaxNode) -> Option<()> {
+ if node.kind() == latex::ERROR && node.first_token()?.text() == "}" {
+ document.diagnostics.push(Diagnostic {
+ range: node.text_range(),
+ code: ErrorCode::UnexpectedRCurly,
+ });
+
+ Some(())
+ } else {
+ None
+ }
+}
diff --git a/support/texlab/crates/base-db/src/document.rs b/support/texlab/crates/base-db/src/document.rs
new file mode 100644
index 0000000000..39d9ec3cf7
--- /dev/null
+++ b/support/texlab/crates/base-db/src/document.rs
@@ -0,0 +1,196 @@
+use std::path::PathBuf;
+
+use distro::Language;
+use rowan::TextSize;
+use syntax::{bibtex, latex, BuildError};
+use url::Url;
+
+use crate::{
+ diagnostics::{self, Diagnostic},
+ line_index::LineIndex,
+ semantics, Config,
+};
+
+#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone, Copy, Hash)]
+pub enum Owner {
+ Client,
+ Server,
+}
+
+#[derive(Debug, Clone)]
+pub struct Document {
+ pub uri: Url,
+ pub dir: Url,
+ pub path: Option<PathBuf>,
+ pub text: String,
+ pub line_index: LineIndex,
+ pub owner: Owner,
+ pub cursor: TextSize,
+ pub language: Language,
+ pub data: DocumentData,
+ pub diagnostics: Vec<Diagnostic>,
+}
+
+impl Document {
+ pub fn parse(
+ uri: Url,
+ text: String,
+ language: Language,
+ owner: Owner,
+ cursor: TextSize,
+ config: &Config,
+ ) -> Self {
+ let dir = uri.join(".").unwrap();
+
+ let path = if uri.scheme() == "file" {
+ uri.to_file_path().ok()
+ } else {
+ None
+ };
+
+ let line_index = LineIndex::new(&text);
+
+ let diagnostics = Vec::new();
+ let data = match language {
+ Language::Tex => {
+ let green = parser::parse_latex(&text);
+ let mut semantics = semantics::tex::Semantics::default();
+ semantics.process_root(&latex::SyntaxNode::new_root(green.clone()));
+ DocumentData::Tex(TexDocumentData { green, semantics })
+ }
+ Language::Bib => {
+ let green = parser::parse_bibtex(&text);
+ DocumentData::Bib(BibDocumentData { green })
+ }
+ Language::Aux => {
+ let green = parser::parse_latex(&text);
+ let mut semantics = semantics::auxiliary::Semantics::default();
+ semantics.process_root(&latex::SyntaxNode::new_root(green.clone()));
+ DocumentData::Aux(AuxDocumentData { green, semantics })
+ }
+ Language::Log => {
+ let errors = parser::parse_build_log(&text).errors;
+ DocumentData::Log(LogDocumentData { errors })
+ }
+ Language::Root => DocumentData::Root,
+ Language::Tectonic => DocumentData::Tectonic,
+ };
+
+ let mut document = Self {
+ uri,
+ dir,
+ path,
+ text,
+ line_index,
+ owner,
+ cursor,
+ language,
+ data,
+ diagnostics,
+ };
+
+ match language {
+ Language::Tex => diagnostics::tex::analyze(&mut document, config),
+ Language::Bib => diagnostics::bib::analyze(&mut document),
+ Language::Aux | Language::Log | Language::Root | Language::Tectonic => (),
+ };
+
+ document
+ }
+}
+
+impl std::borrow::Borrow<Url> for Document {
+ fn borrow(&self) -> &Url {
+ &self.uri
+ }
+}
+
+impl std::borrow::Borrow<str> for Document {
+ fn borrow(&self) -> &str {
+ self.uri.as_str()
+ }
+}
+
+impl PartialEq for Document {
+ fn eq(&self, other: &Self) -> bool {
+ self.uri == other.uri
+ }
+}
+
+impl Eq for Document {}
+
+impl std::hash::Hash for Document {
+ fn hash<H: std::hash::Hasher>(&self, state: &mut H) {
+ self.uri.hash(state)
+ }
+}
+
+#[derive(Debug, Clone)]
+pub enum DocumentData {
+ Tex(TexDocumentData),
+ Bib(BibDocumentData),
+ Aux(AuxDocumentData),
+ Log(LogDocumentData),
+ Root,
+ Tectonic,
+}
+
+impl DocumentData {
+ pub fn as_tex(&self) -> Option<&TexDocumentData> {
+ if let DocumentData::Tex(data) = self {
+ Some(data)
+ } else {
+ None
+ }
+ }
+
+ pub fn as_bib(&self) -> Option<&BibDocumentData> {
+ if let DocumentData::Bib(data) = self {
+ Some(data)
+ } else {
+ None
+ }
+ }
+
+ pub fn as_aux(&self) -> Option<&AuxDocumentData> {
+ if let DocumentData::Aux(data) = self {
+ Some(data)
+ } else {
+ None
+ }
+ }
+}
+
+#[derive(Debug, Clone)]
+pub struct TexDocumentData {
+ pub green: rowan::GreenNode,
+ pub semantics: semantics::tex::Semantics,
+}
+
+impl TexDocumentData {
+ pub fn root_node(&self) -> latex::SyntaxNode {
+ latex::SyntaxNode::new_root(self.green.clone())
+ }
+}
+
+#[derive(Debug, Clone)]
+pub struct BibDocumentData {
+ pub green: rowan::GreenNode,
+}
+
+impl BibDocumentData {
+ pub fn root_node(&self) -> bibtex::SyntaxNode {
+ bibtex::SyntaxNode::new_root(self.green.clone())
+ }
+}
+
+#[derive(Debug, Clone)]
+pub struct LogDocumentData {
+ pub errors: Vec<BuildError>,
+}
+
+#[derive(Debug, Clone)]
+pub struct AuxDocumentData {
+ pub green: rowan::GreenNode,
+ pub semantics: semantics::auxiliary::Semantics,
+}
diff --git a/support/texlab/crates/base-db/src/graph.rs b/support/texlab/crates/base-db/src/graph.rs
new file mode 100644
index 0000000000..2103aa8a73
--- /dev/null
+++ b/support/texlab/crates/base-db/src/graph.rs
@@ -0,0 +1,161 @@
+use std::{ffi::OsStr, path::PathBuf};
+
+use distro::Language;
+use itertools::Itertools;
+use once_cell::sync::Lazy;
+use rustc_hash::FxHashSet;
+use url::Url;
+
+use crate::{semantics, Document, DocumentData, Workspace};
+
+pub static HOME_DIR: Lazy<Option<PathBuf>> = Lazy::new(dirs::home_dir);
+
+#[derive(Debug, PartialEq, Eq, Clone, Hash)]
+pub struct Edge<'a> {
+ pub source: &'a Document,
+ pub target: &'a Document,
+ pub weight: Option<EdgeWeight<'a>>,
+}
+
+#[derive(Debug, PartialEq, Eq, Clone, Hash)]
+pub struct EdgeWeight<'a> {
+ pub link: &'a semantics::tex::Link,
+ pub old_base_dir: Url,
+ pub new_base_dir: Url,
+}
+
+#[derive(Debug)]
+pub struct Graph<'a> {
+ pub workspace: &'a Workspace,
+ pub start: &'a Document,
+ pub edges: Vec<Edge<'a>>,
+ pub missing: Vec<Url>,
+}
+
+impl<'a> Graph<'a> {
+ pub fn new(workspace: &'a Workspace, start: &'a Document) -> Self {
+ let mut graph = Self {
+ workspace,
+ start,
+ edges: Vec::new(),
+ missing: Vec::new(),
+ };
+
+ let base_dir = workspace.current_dir(&start.dir);
+ let mut stack = vec![(start, base_dir)];
+ let mut visited = FxHashSet::default();
+
+ while let Some((source, base_dir)) = stack.pop() {
+ let index = graph.edges.len();
+ graph.explicit_edges(source, &base_dir);
+ for edge in &graph.edges[index..] {
+ let Some(weight) = edge.weight.as_ref() else { continue };
+ if visited.insert(&edge.target.uri) {
+ stack.push((edge.target, weight.new_base_dir.clone()));
+ }
+ }
+
+ graph.implicit_edges(source, &base_dir);
+ }
+
+ graph
+ }
+
+ pub fn preorder(&self) -> impl DoubleEndedIterator<Item = &'a Document> + '_ {
+ std::iter::once(self.start)
+ .chain(self.edges.iter().map(|group| group.target))
+ .unique_by(|document| &document.uri)
+ }
+
+ fn explicit_edges(&mut self, source: &'a Document, base_dir: &Url) {
+ let DocumentData::Tex(data) = &source.data else { return };
+ for link in &data.semantics.links {
+ self.explicit_edge(source, base_dir, link);
+ }
+ }
+
+ fn explicit_edge(
+ &mut self,
+ source: &'a Document,
+ base_dir: &Url,
+ link: &'a semantics::tex::Link,
+ ) {
+ let home_dir = HOME_DIR.as_deref();
+
+ let stem = &link.path.text;
+ let mut file_names = vec![stem.clone()];
+ link.kind
+ .extensions()
+ .iter()
+ .map(|ext| format!("{stem}.{ext}"))
+ .for_each(|name| file_names.push(name));
+
+ let file_name_db = &self.workspace.distro().file_name_db;
+ let distro_files = file_names
+ .iter()
+ .filter_map(|name| file_name_db.get(name))
+ .filter(|path| home_dir.map_or(false, |dir| path.starts_with(dir)))
+ .flat_map(Url::from_file_path);
+
+ for target_uri in file_names
+ .iter()
+ .flat_map(|file_name| base_dir.join(file_name))
+ .chain(distro_files)
+ {
+ match self.workspace.lookup(&target_uri) {
+ Some(target) => {
+ let new_base_dir = link
+ .base_dir
+ .as_deref()
+ .and_then(|path| base_dir.join(&path).ok())
+ .unwrap_or_else(|| base_dir.clone());
+
+ let weight = Some(EdgeWeight {
+ link,
+ old_base_dir: base_dir.clone(),
+ new_base_dir,
+ });
+
+ self.edges.push(Edge {
+ source,
+ target,
+ weight,
+ });
+ }
+ None => {
+ self.missing.push(target_uri);
+ }
+ };
+ }
+ }
+
+ fn implicit_edges(&mut self, source: &'a Document, base_dir: &Url) {
+ let uri = source.uri.as_str();
+ if source.language == Language::Tex && !uri.ends_with(".aux") {
+ self.implicit_edge(source, base_dir, "log");
+ self.implicit_edge(source, base_dir, "aux");
+ }
+ }
+
+ fn implicit_edge(&mut self, source: &'a Document, base_dir: &Url, extension: &str) {
+ let Some(target_uri) = source.uri.to_file_path().ok().and_then(|mut path| {
+ path.set_extension(extension);
+ path.file_name()
+ .and_then(OsStr::to_str)
+ .and_then(|name| self.workspace.output_dir(base_dir).join(&name).ok())
+ }) else { return };
+
+ match self.workspace.lookup(&target_uri) {
+ Some(target) => {
+ self.edges.push(Edge {
+ source,
+ target,
+ weight: None,
+ });
+ }
+ None => {
+ self.missing.push(target_uri);
+ }
+ }
+ }
+}
diff --git a/support/texlab/crates/base-db/src/lib.rs b/support/texlab/crates/base-db/src/lib.rs
new file mode 100644
index 0000000000..fae6ad5416
--- /dev/null
+++ b/support/texlab/crates/base-db/src/lib.rs
@@ -0,0 +1,9 @@
+mod config;
+pub mod diagnostics;
+mod document;
+pub mod graph;
+mod line_index;
+pub mod semantics;
+mod workspace;
+
+pub use self::{config::*, document::*, line_index::*, workspace::*};
diff --git a/support/texlab/src/util/line_index.rs b/support/texlab/crates/base-db/src/line_index.rs
index 70e8f8128b..70e8f8128b 100644
--- a/support/texlab/src/util/line_index.rs
+++ b/support/texlab/crates/base-db/src/line_index.rs
diff --git a/support/texlab/crates/base-db/src/semantics.rs b/support/texlab/crates/base-db/src/semantics.rs
new file mode 100644
index 0000000000..94a9c15973
--- /dev/null
+++ b/support/texlab/crates/base-db/src/semantics.rs
@@ -0,0 +1,17 @@
+pub mod auxiliary;
+pub mod tex;
+
+#[derive(Debug, PartialEq, Eq, Clone, Hash)]
+pub struct Span {
+ pub text: String,
+ pub range: rowan::TextRange,
+}
+
+impl From<&syntax::latex::Key> for Span {
+ fn from(key: &syntax::latex::Key) -> Self {
+ Span {
+ text: key.to_string(),
+ range: syntax::latex::small_range(key),
+ }
+ }
+}
diff --git a/support/texlab/crates/base-db/src/semantics/auxiliary.rs b/support/texlab/crates/base-db/src/semantics/auxiliary.rs
new file mode 100644
index 0000000000..719953974c
--- /dev/null
+++ b/support/texlab/crates/base-db/src/semantics/auxiliary.rs
@@ -0,0 +1,39 @@
+use rowan::ast::AstNode;
+use rustc_hash::FxHashMap;
+use syntax::latex;
+
+#[derive(Debug, Clone, Default)]
+pub struct Semantics {
+ pub label_numbers: FxHashMap<String, String>,
+}
+
+impl Semantics {
+ pub fn process_root(&mut self, root: &latex::SyntaxNode) {
+ for node in root.descendants() {
+ self.process_node(&node);
+ }
+ }
+
+ fn process_node(&mut self, node: &latex::SyntaxNode) {
+ if let Some(label_number) = latex::LabelNumber::cast(node.clone()) {
+ self.process_label_number(&label_number);
+ }
+ }
+
+ fn process_label_number(&mut self, label_number: &latex::LabelNumber) {
+ let Some(name) = label_number
+ .name()
+ .and_then(|group| group.key())
+ .map(|key| key.to_string()) else { return };
+
+ let Some(text) = label_number
+ .text()
+ .map(|node| node.syntax().descendants())
+ .into_iter()
+ .flatten()
+ .find(|node| node.kind() == latex::TEXT || node.kind() == latex::MIXED_GROUP)
+ .map(|node| node.text().to_string()) else { return };
+
+ self.label_numbers.insert(name, text);
+ }
+}
diff --git a/support/texlab/crates/base-db/src/semantics/tex.rs b/support/texlab/crates/base-db/src/semantics/tex.rs
new file mode 100644
index 0000000000..2b506ee878
--- /dev/null
+++ b/support/texlab/crates/base-db/src/semantics/tex.rs
@@ -0,0 +1,292 @@
+use rowan::{ast::AstNode, TextLen};
+use rustc_hash::FxHashSet;
+use syntax::latex::{self, HasBrack, HasCurly};
+use text_size::TextRange;
+
+use super::Span;
+
+#[derive(Debug, Clone, Default)]
+pub struct Semantics {
+ pub links: Vec<Link>,
+ pub labels: Vec<Label>,
+ pub commands: Vec<(TextRange, String)>,
+ pub environments: FxHashSet<String>,
+ pub theorem_definitions: Vec<TheoremDefinition>,
+ pub graphics_paths: FxHashSet<String>,
+ pub can_be_root: bool,
+ pub can_be_compiled: bool,
+}
+
+impl Semantics {
+ pub fn process_root(&mut self, root: &latex::SyntaxNode) {
+ for node in root.descendants_with_tokens() {
+ match node {
+ latex::SyntaxElement::Node(node) => {
+ self.process_node(&node);
+ }
+ latex::SyntaxElement::Token(token) => {
+ if token.kind() == latex::COMMAND_NAME {
+ let range = token.text_range();
+ let range = TextRange::new(range.start() + "\\".text_len(), range.end());
+ let text = String::from(&token.text()[1..]);
+ self.commands.push((range, text));
+ }
+ }
+ };
+ }
+
+ self.can_be_compiled = self.environments.contains("document");
+
+ self.can_be_root = self.can_be_compiled
+ && !self
+ .links
+ .iter()
+ .any(|link| link.kind == LinkKind::Cls && link.path.text == "subfiles");
+ }
+
+ fn process_node(&mut self, node: &latex::SyntaxNode) {
+ if let Some(include) = latex::Include::cast(node.clone()) {
+ self.process_include(include);
+ } else if let Some(import) = latex::Import::cast(node.clone()) {
+ self.process_import(import);
+ } else if let Some(label) = latex::LabelDefinition::cast(node.clone()) {
+ self.process_label_definition(label);
+ } else if let Some(label) = latex::LabelReference::cast(node.clone()) {
+ self.process_label_reference(label);
+ } else if let Some(label) = latex::LabelReferenceRange::cast(node.clone()) {
+ self.process_label_reference_range(label);
+ } else if let Some(environment) = latex::Environment::cast(node.clone()) {
+ self.process_environment(environment);
+ } else if let Some(theorem_def) = latex::TheoremDefinition::cast(node.clone()) {
+ self.process_theorem_definition(theorem_def);
+ }
+ }
+
+ fn process_include(&mut self, include: latex::Include) {
+ let Some(list) = include.path_list() else { return };
+
+ for path in list.keys() {
+ let kind = match include.syntax().kind() {
+ latex::PACKAGE_INCLUDE => LinkKind::Sty,
+ latex::CLASS_INCLUDE => LinkKind::Cls,
+ latex::LATEX_INCLUDE => LinkKind::Tex,
+ latex::BIBLATEX_INCLUDE => LinkKind::Bib,
+ latex::BIBTEX_INCLUDE => LinkKind::Bib,
+ _ => continue,
+ };
+
+ self.links.push(Link {
+ kind,
+ path: Span::from(&path),
+ base_dir: None,
+ });
+ }
+ }
+
+ fn process_import(&mut self, import: latex::Import) {
+ let Some(mut base_dir) = import
+ .directory()
+ .and_then(|dir| dir.key())
+ .map(|key| key.to_string()) else { return };
+
+ if !base_dir.ends_with('/') {
+ base_dir.push('/');
+ }
+
+ let Some(path) = import.file().and_then(|path| path.key()) else { return };
+
+ self.links.push(Link {
+ kind: LinkKind::Tex,
+ path: Span::from(&path),
+ base_dir: Some(base_dir),
+ });
+ }
+
+ fn process_label_definition(&mut self, label: latex::LabelDefinition) {
+ let Some(name) = label.name().and_then(|group| group.key()) else { return };
+
+ let mut objects = Vec::new();
+ for node in label.syntax().ancestors() {
+ if let Some(section) = latex::Section::cast(node.clone()) {
+ let Some(text) = section.name().and_then(|group| group.content_text()) else { continue };
+ let range = latex::small_range(&section);
+ let prefix = String::from(match section.syntax().kind() {
+ latex::PART => "Part",
+ latex::CHAPTER => "Chapter",
+ latex::SECTION => "Section",
+ latex::SUBSECTION => "Subsection",
+ latex::SUBSUBSECTION => "Subsubsection",
+ latex::PARAGRAPH => "Paragraph",
+ latex::SUBPARAGRAPH => "Subparagraph",
+ _ => unreachable!(),
+ });
+
+ let kind = LabelObject::Section { prefix, text };
+ objects.push(LabelTarget {
+ object: kind,
+ range,
+ });
+ } else if let Some(environment) = latex::Environment::cast(node.clone()) {
+ let Some(name) = environment.begin()
+ .and_then(|begin| begin.name())
+ .and_then(|group| group.key())
+ .map(|key| key.to_string()) else { continue };
+
+ let caption = environment
+ .syntax()
+ .children()
+ .filter_map(latex::Caption::cast)
+ .find_map(|node| node.long())
+ .and_then(|node| node.content_text());
+
+ let options = environment
+ .begin()
+ .and_then(|begin| begin.options())
+ .and_then(|options| options.content_text());
+
+ let range = latex::small_range(&environment);
+ let kind = LabelObject::Environment {
+ name,
+ options,
+ caption,
+ };
+
+ objects.push(LabelTarget {
+ object: kind,
+ range,
+ });
+ } else if let Some(enum_item) = latex::EnumItem::cast(node.clone()) {
+ let range = latex::small_range(&enum_item);
+ let kind = LabelObject::EnumItem;
+ objects.push(LabelTarget {
+ object: kind,
+ range,
+ });
+ }
+ }
+
+ self.labels.push(Label {
+ kind: LabelKind::Definition,
+ name: Span::from(&name),
+ targets: objects,
+ });
+ }
+
+ fn process_label_reference(&mut self, label: latex::LabelReference) {
+ let Some(name_list) = label.name_list() else { return };
+
+ for name in name_list.keys() {
+ self.labels.push(Label {
+ kind: LabelKind::Reference,
+ name: Span::from(&name),
+ targets: Vec::new(),
+ });
+ }
+ }
+
+ fn process_label_reference_range(&mut self, label: latex::LabelReferenceRange) {
+ if let Some(from) = label.from().and_then(|group| group.key()) {
+ self.labels.push(Label {
+ kind: LabelKind::ReferenceRange,
+ name: Span::from(&from),
+ targets: Vec::new(),
+ });
+ }
+
+ if let Some(to) = label.to().and_then(|group| group.key()) {
+ self.labels.push(Label {
+ kind: LabelKind::ReferenceRange,
+ name: Span::from(&to),
+ targets: Vec::new(),
+ });
+ }
+ }
+
+ fn process_environment(&mut self, environment: latex::Environment) {
+ let Some(name) = environment
+ .begin()
+ .and_then(|begin| begin.name())
+ .and_then(|group| group.key()) else { return };
+
+ self.environments.insert(String::from(name.syntax().text()));
+ }
+
+ fn process_theorem_definition(&mut self, theorem_def: latex::TheoremDefinition) {
+ let Some(name) = theorem_def.name().and_then(|name| name.key()) else { return };
+
+ let Some(description) = theorem_def
+ .description()
+ .and_then(|group| group.content_text()) else { return };
+
+ self.theorem_definitions.push(TheoremDefinition {
+ name: Span::from(&name),
+ description,
+ });
+ }
+}
+
+#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone, Copy, Hash)]
+pub enum LinkKind {
+ Sty,
+ Cls,
+ Tex,
+ Bib,
+}
+
+impl LinkKind {
+ pub fn extensions(self) -> &'static [&'static str] {
+ match self {
+ Self::Sty => &["sty"],
+ Self::Cls => &["cls"],
+ Self::Tex => &["tex"],
+ Self::Bib => &["bib"],
+ }
+ }
+}
+
+#[derive(Debug, PartialEq, Eq, Clone, Hash)]
+pub struct Link {
+ pub kind: LinkKind,
+ pub path: Span,
+ pub base_dir: Option<String>,
+}
+
+#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone, Copy, Hash)]
+pub enum LabelKind {
+ Definition,
+ Reference,
+ ReferenceRange,
+}
+
+#[derive(Debug, Clone)]
+pub struct Label {
+ pub kind: LabelKind,
+ pub name: Span,
+ pub targets: Vec<LabelTarget>,
+}
+
+#[derive(Debug, Clone)]
+pub struct LabelTarget {
+ pub object: LabelObject,
+ pub range: TextRange,
+}
+
+#[derive(Debug, Clone)]
+pub enum LabelObject {
+ Section {
+ prefix: String,
+ text: String,
+ },
+ EnumItem,
+ Environment {
+ name: String,
+ options: Option<String>,
+ caption: Option<String>,
+ },
+}
+
+#[derive(Debug, Clone)]
+pub struct TheoremDefinition {
+ pub name: Span,
+ pub description: String,
+}
diff --git a/support/texlab/crates/base-db/src/workspace.rs b/support/texlab/crates/base-db/src/workspace.rs
new file mode 100644
index 0000000000..1872c33df1
--- /dev/null
+++ b/support/texlab/crates/base-db/src/workspace.rs
@@ -0,0 +1,302 @@
+use std::{
+ borrow::{Borrow, Cow},
+ path::{Path, PathBuf},
+};
+
+use distro::{Distro, Language};
+use itertools::Itertools;
+use rowan::{TextRange, TextSize};
+use rustc_hash::FxHashSet;
+use url::Url;
+
+use crate::{graph, Config, Document, DocumentData, Owner};
+
+#[derive(Debug, Default)]
+pub struct Workspace {
+ documents: FxHashSet<Document>,
+ config: Config,
+ distro: Distro,
+ folders: Vec<PathBuf>,
+}
+
+impl Workspace {
+ pub fn lookup<Q>(&self, key: &Q) -> Option<&Document>
+ where
+ Q: std::hash::Hash + Eq,
+ Document: Borrow<Q>,
+ {
+ self.documents.get(key)
+ }
+
+ pub fn lookup_path(&self, path: &Path) -> Option<&Document> {
+ self.iter()
+ .find(|document| document.path.as_deref() == Some(path))
+ }
+
+ pub fn iter(&self) -> impl Iterator<Item = &Document> + '_ {
+ self.documents.iter()
+ }
+
+ pub fn config(&self) -> &Config {
+ &self.config
+ }
+
+ pub fn distro(&self) -> &Distro {
+ &self.distro
+ }
+
+ pub fn open(
+ &mut self,
+ uri: Url,
+ text: String,
+ language: Language,
+ owner: Owner,
+ cursor: TextSize,
+ ) {
+ log::debug!("Opening document {uri}...");
+ self.documents.remove(&uri);
+ self.documents.insert(Document::parse(
+ uri,
+ text,
+ language,
+ owner,
+ cursor,
+ &self.config,
+ ));
+ }
+
+ pub fn load(&mut self, path: &Path, language: Language, owner: Owner) -> std::io::Result<()> {
+ log::debug!("Loading document {} from disk...", path.display());
+ let uri = Url::from_file_path(path).unwrap();
+ let data = std::fs::read(path)?;
+ let text = match String::from_utf8_lossy(&data) {
+ Cow::Borrowed(_) => unsafe { String::from_utf8_unchecked(data) },
+ Cow::Owned(text) => text,
+ };
+
+ Ok(self.open(uri, text, language, owner, TextSize::default()))
+ }
+
+ pub fn edit(&mut self, uri: &Url, delete: TextRange, insert: &str) -> Option<()> {
+ let document = self.lookup(uri)?;
+ let mut text = document.text.clone();
+ text.replace_range(std::ops::Range::<usize>::from(delete), insert);
+ self.open(
+ document.uri.clone(),
+ text,
+ document.language,
+ Owner::Client,
+ delete.start(),
+ );
+
+ Some(())
+ }
+
+ pub fn watch(
+ &mut self,
+ watcher: &mut dyn notify::Watcher,
+ watched_dirs: &mut FxHashSet<PathBuf>,
+ ) {
+ self.iter()
+ .filter(|document| document.uri.scheme() == "file")
+ .flat_map(|document| {
+ let dir1 = self.output_dir(&self.current_dir(&document.dir));
+ let dir2 = &document.dir;
+ [dir1.to_file_path(), dir2.to_file_path()]
+ })
+ .flatten()
+ .for_each(|path| {
+ if !watched_dirs.contains(&path) {
+ let _ = watcher.watch(&path, notify::RecursiveMode::NonRecursive);
+ watched_dirs.insert(path);
+ }
+ });
+ }
+
+ pub fn current_dir(&self, base_dir: &Url) -> Url {
+ let root_dir = self.config.root_dir.as_deref();
+ if let Some(dir) = root_dir.and_then(|path| base_dir.join(path).ok()) {
+ return dir;
+ }
+
+ self.iter()
+ .filter(|document| matches!(document.data, DocumentData::Root | DocumentData::Tectonic))
+ .flat_map(|document| document.uri.join("."))
+ .find(|root_dir| base_dir.as_str().starts_with(root_dir.as_str()))
+ .unwrap_or_else(|| base_dir.clone())
+ }
+
+ pub fn output_dir(&self, base_dir: &Url) -> Url {
+ let mut path = self.config.build.output_dir.clone();
+ if !path.ends_with('/') {
+ path.push('/');
+ }
+
+ base_dir.join(&path).unwrap_or_else(|_| base_dir.clone())
+ }
+
+ pub fn contains(&self, path: &Path) -> bool {
+ if self.folders.is_empty() {
+ return true;
+ }
+
+ self.folders.iter().any(|dir| path.starts_with(dir))
+ }
+
+ pub fn project(&self, child: &Document) -> Project {
+ let mut documents = FxHashSet::default();
+ for graph in self
+ .iter()
+ .map(|start| graph::Graph::new(self, start))
+ .filter(|graph| graph.preorder().contains(&child))
+ {
+ documents.extend(graph.preorder());
+ }
+
+ Project { documents }
+ }
+
+ pub fn parents(&self, child: &Document) -> FxHashSet<&Document> {
+ self.iter()
+ .filter(|document| {
+ let DocumentData::Tex(data) = &document.data else { return false };
+ data.semantics.can_be_root
+ })
+ .filter(|parent| {
+ let graph = graph::Graph::new(self, parent);
+ let mut nodes = graph.preorder();
+ nodes.contains(&child)
+ })
+ .collect()
+ }
+
+ pub fn set_config(&mut self, config: Config) {
+ self.config = config;
+ self.reload();
+ }
+
+ pub fn set_distro(&mut self, distro: Distro) {
+ self.distro = distro;
+ self.reload();
+ }
+
+ pub fn set_folders(&mut self, folders: Vec<PathBuf>) {
+ self.folders = folders;
+ }
+
+ pub fn set_cursor(&mut self, uri: &Url, cursor: TextSize) -> Option<()> {
+ let mut document = self.lookup(uri)?.clone();
+ document.cursor = cursor;
+ self.documents.insert(document);
+ Some(())
+ }
+
+ pub fn reload(&mut self) {
+ let uris = self
+ .documents
+ .iter()
+ .filter(|document| document.language == Language::Tex)
+ .map(|document| document.uri.clone())
+ .collect::<Vec<Url>>();
+
+ for uri in uris {
+ let document = self.lookup(&uri).unwrap();
+ self.open(
+ uri,
+ document.text.clone(),
+ document.language,
+ document.owner,
+ document.cursor,
+ );
+ }
+ }
+
+ pub fn remove(&mut self, uri: &Url) {
+ self.documents.remove(uri);
+ }
+
+ pub fn close(&mut self, uri: &Url) -> Option<()> {
+ let mut document = self.lookup(uri)?.clone();
+ document.owner = Owner::Server;
+ self.documents.insert(document);
+ Some(())
+ }
+
+ pub fn discover(&mut self) {
+ loop {
+ let mut changed = false;
+ changed |= self.discover_parents();
+ changed |= self.discover_children();
+ if !changed {
+ break;
+ }
+ }
+ }
+
+ fn discover_parents(&mut self) -> bool {
+ let dirs = self
+ .iter()
+ .filter_map(|document| document.path.as_deref())
+ .flat_map(|path| path.ancestors().skip(1))
+ .filter(|path| self.contains(path))
+ .map(|path| path.to_path_buf())
+ .collect::<FxHashSet<_>>();
+
+ let mut changed = false;
+ for dir in dirs {
+ if self
+ .iter()
+ .filter(|document| matches!(document.language, Language::Root | Language::Tectonic))
+ .filter_map(|document| document.path.as_deref())
+ .filter_map(|path| path.parent())
+ .any(|marker| dir.starts_with(marker))
+ {
+ continue;
+ }
+
+ let Ok(entries) = std::fs::read_dir(dir) else { continue };
+
+ for file in entries
+ .flatten()
+ .filter(|entry| entry.file_type().map_or(false, |type_| type_.is_file()))
+ .map(|entry| entry.path())
+ {
+ let Some(lang) = Language::from_path(&file) else { continue };
+ if !matches!(lang, Language::Tex | Language::Root | Language::Tectonic) {
+ continue;
+ }
+
+ if self.lookup_path(&file).is_none() {
+ changed |= self.load(&file, lang, Owner::Server).is_ok();
+ }
+ }
+ }
+
+ changed
+ }
+
+ fn discover_children(&mut self) -> bool {
+ let paths = self
+ .iter()
+ .map(|start| graph::Graph::new(self, start))
+ .flat_map(|graph| graph.missing)
+ .filter(|uri| uri.scheme() == "file")
+ .flat_map(|uri| uri.to_file_path())
+ .collect::<FxHashSet<_>>();
+
+ let mut changed = false;
+ for path in paths {
+ let language = Language::from_path(&path).unwrap_or(Language::Tex);
+ if self.lookup_path(&path).is_none() {
+ changed |= self.load(&path, language, Owner::Server).is_ok();
+ }
+ }
+
+ changed
+ }
+}
+
+#[derive(Debug)]
+pub struct Project<'a> {
+ pub documents: FxHashSet<&'a Document>,
+}
diff --git a/support/texlab/crates/citeproc/Cargo.toml b/support/texlab/crates/citeproc/Cargo.toml
new file mode 100644
index 0000000000..353292c484
--- /dev/null
+++ b/support/texlab/crates/citeproc/Cargo.toml
@@ -0,0 +1,26 @@
+[package]
+name = "citeproc"
+version = "0.0.0"
+license.workspace = true
+authors.workspace = true
+edition.workspace = true
+rust-version.workspace = true
+
+[dependencies]
+chrono = { version = "0.4.24", default-features = false, features = ["std"] }
+human_name = "2.0.1"
+isocountry = "0.3.2"
+itertools = "0.10.5"
+rowan = "0.15.11"
+rustc-hash = "1.1.0"
+syntax = { path = "../syntax" }
+titlecase = "2.2.1"
+unicode-normalization = "0.1.22"
+url = "2.3.1"
+
+[lib]
+doctest = false
+
+[dev-dependencies]
+insta = "1.29.0"
+parser = { path = "../parser" }
diff --git a/support/texlab/src/citation/driver.rs b/support/texlab/crates/citeproc/src/driver.rs
index ab3fe6d80f..af09b9ed32 100644
--- a/support/texlab/src/citation/driver.rs
+++ b/support/texlab/crates/citeproc/src/driver.rs
@@ -1,9 +1,8 @@
use isocountry::CountryCode;
use itertools::Itertools;
-use lsp_types::Url;
+use syntax::bibtex;
use titlecase::titlecase;
-
-use crate::syntax::bibtex;
+use url::Url;
use super::{
entry::{EntryData, EntryKind},
diff --git a/support/texlab/src/citation/entry.rs b/support/texlab/crates/citeproc/src/entry.rs
index 1fee032488..e29864e2c2 100644
--- a/support/texlab/src/citation/entry.rs
+++ b/support/texlab/crates/citeproc/src/entry.rs
@@ -1,9 +1,5 @@
-use std::str::FromStr;
-
use rustc_hash::FxHashMap;
-use strum::EnumString;
-
-use crate::syntax::bibtex::{Entry, Field, HasName, HasType, HasValue, Value};
+use syntax::bibtex::{Entry, Field, HasName, HasType, HasValue, Value};
use super::field::{
author::{AuthorField, AuthorFieldData},
@@ -12,8 +8,7 @@ use super::field::{
text::{TextField, TextFieldData},
};
-#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone, Copy, Hash, EnumString)]
-#[strum(ascii_case_insensitive)]
+#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone, Copy, Hash)]
pub enum EntryKind {
Article,
Book,
@@ -52,6 +47,48 @@ pub enum EntryKind {
Unknown,
}
+impl EntryKind {
+ pub fn parse(input: &str) -> Self {
+ match input.to_ascii_lowercase().as_str() {
+ "article" => Self::Article,
+ "book" => Self::Book,
+ "mvbook" => Self::MVBook,
+ "inbook" => Self::InBook,
+ "bookinbook" => Self::BookInBook,
+ "suppbook" => Self::SuppBook,
+ "booklet" => Self::Booklet,
+ "collection" => Self::Collection,
+ "mvcollection" => Self::MVCollection,
+ "incollection" => Self::InCollection,
+ "suppcollection" => Self::SuppCollection,
+ "dataset" => Self::DataSet,
+ "manual" => Self::Manual,
+ "misc" => Self::Misc,
+ "online" => Self::Online,
+ "electronic" => Self::Electronic,
+ "www" => Self::Www,
+ "patent" => Self::Patent,
+ "periodical" => Self::Periodical,
+ "suppperiodical" => Self::SuppPeriodical,
+ "proceedings" => Self::Proceedings,
+ "mvproceedings" => Self::MVProceedings,
+ "inproceedings" => Self::InProceedings,
+ "conference" => Self::Conference,
+ "reference" => Self::Reference,
+ "mvreference" => Self::MVReference,
+ "inreference" => Self::InReference,
+ "report" => Self::Report,
+ "set" => Self::Set,
+ "software" => Self::Software,
+ "thesis" => Self::Thesis,
+ "masterthesis" => Self::MasterThesis,
+ "phdthesis" => Self::PhdThesis,
+ "techreport" => Self::TechReport,
+ _ => Self::Unknown,
+ }
+ }
+}
+
impl Default for EntryKind {
fn default() -> Self {
Self::Unknown
@@ -70,10 +107,9 @@ pub struct EntryData {
impl From<&Entry> for EntryData {
fn from(entry: &Entry) -> Self {
let mut data = EntryData {
- kind: entry
- .type_token()
- .and_then(|token| EntryKind::from_str(&token.text()[1..]).ok())
- .unwrap_or(EntryKind::Unknown),
+ kind: entry.type_token().map_or(EntryKind::Unknown, |token| {
+ EntryKind::parse(&token.text()[1..])
+ }),
..EntryData::default()
};
diff --git a/support/texlab/src/citation/field.rs b/support/texlab/crates/citeproc/src/field.rs
index d9f3adacab..d9f3adacab 100644
--- a/support/texlab/src/citation/field.rs
+++ b/support/texlab/crates/citeproc/src/field.rs
diff --git a/support/texlab/src/citation/field/author.rs b/support/texlab/crates/citeproc/src/field/author.rs
index a0e4120559..d8576cbaa4 100644
--- a/support/texlab/src/citation/field/author.rs
+++ b/support/texlab/crates/citeproc/src/field/author.rs
@@ -1,15 +1,12 @@
-use std::{borrow::Cow, fmt, str::FromStr};
+use std::{borrow::Cow, fmt};
use human_name::Name;
use itertools::Itertools;
-use strum::EnumString;
-
-use crate::syntax::bibtex::Value;
+use syntax::bibtex::Value;
use super::text::TextFieldData;
-#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone, Copy, Hash, EnumString)]
-#[strum(ascii_case_insensitive)]
+#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone, Copy, Hash)]
pub enum AuthorField {
Afterword,
Annotator,
@@ -26,7 +23,20 @@ pub enum AuthorField {
impl AuthorField {
pub fn parse(input: &str) -> Option<Self> {
- Self::from_str(input).ok()
+ Some(match input.to_ascii_lowercase().as_str() {
+ "afterword" => Self::Afterword,
+ "annotator" => Self::Annotator,
+ "author" => Self::Author,
+ "commentator" => Self::Commentator,
+ "editor" => Self::Editor,
+ "editora" => Self::EditorA,
+ "editorb" => Self::EditorB,
+ "editorc" => Self::EditorC,
+ "foreword" => Self::Foreword,
+ "introduction" => Self::Introduction,
+ "translator" => Self::Translator,
+ _ => return None,
+ })
}
}
diff --git a/support/texlab/src/citation/field/date.rs b/support/texlab/crates/citeproc/src/field/date.rs
index 4eba9cdea4..8e2c0b7d72 100644
--- a/support/texlab/src/citation/field/date.rs
+++ b/support/texlab/crates/citeproc/src/field/date.rs
@@ -1,14 +1,11 @@
use std::{fmt, ops::Add, str::FromStr};
use chrono::{Datelike, Month, NaiveDate};
-use strum::EnumString;
-
-use crate::syntax::bibtex::Value;
+use syntax::bibtex::Value;
use super::text::TextFieldData;
-#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone, Copy, Hash, EnumString)]
-#[strum(ascii_case_insensitive)]
+#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone, Copy, Hash)]
pub enum DateField {
Date,
EventDate,
@@ -19,7 +16,14 @@ pub enum DateField {
impl DateField {
pub fn parse(input: &str) -> Option<Self> {
- Self::from_str(input).ok()
+ Some(match input.to_ascii_lowercase().as_str() {
+ "date" => Self::Date,
+ "eventdate" => Self::EventDate,
+ "month" => Self::Month,
+ "urldate" => Self::UrlDate,
+ "year" => Self::Year,
+ _ => return None,
+ })
}
}
diff --git a/support/texlab/src/citation/field/number.rs b/support/texlab/crates/citeproc/src/field/number.rs
index ad892c879f..227f3d5b75 100644
--- a/support/texlab/src/citation/field/number.rs
+++ b/support/texlab/crates/citeproc/src/field/number.rs
@@ -1,13 +1,10 @@
-use std::{fmt, str::FromStr};
+use std::fmt;
-use strum::EnumString;
-
-use crate::syntax::bibtex::Value;
+use syntax::bibtex::Value;
use super::text::TextFieldData;
-#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone, Copy, Hash, EnumString)]
-#[strum(ascii_case_insensitive)]
+#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone, Copy, Hash)]
pub enum NumberField {
Edition,
Number,
@@ -20,7 +17,16 @@ pub enum NumberField {
impl NumberField {
pub fn parse(input: &str) -> Option<Self> {
- Self::from_str(input).ok()
+ Some(match input.to_ascii_lowercase().as_str() {
+ "edition" => Self::Edition,
+ "number" => Self::Number,
+ "pages" => Self::Pages,
+ "pagetotal" => Self::PageTotal,
+ "part" => Self::Part,
+ "volume" => Self::Volume,
+ "volumes" => Self::Volumes,
+ _ => return None,
+ })
}
}
diff --git a/support/texlab/src/citation/field/text.rs b/support/texlab/crates/citeproc/src/field/text.rs
index 9b3a0b02b2..9689264779 100644
--- a/support/texlab/src/citation/field/text.rs
+++ b/support/texlab/crates/citeproc/src/field/text.rs
@@ -1,16 +1,12 @@
-use std::str::FromStr;
-
use rowan::{ast::AstNode, NodeOrToken};
use rustc_hash::FxHashSet;
-use strum::EnumString;
-use crate::syntax::bibtex::{
+use syntax::bibtex::{
Accent, Command, CurlyGroup, HasAccentName, HasCommandName, HasName, HasValue, HasWord, Join,
Literal, QuoteGroup, Root, SyntaxKind::*, SyntaxToken, Value,
};
-#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone, Copy, Hash, EnumString)]
-#[strum(ascii_case_insensitive)]
+#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone, Copy, Hash)]
pub enum TextField {
Abstract,
Addendum,
@@ -63,7 +59,56 @@ pub enum TextField {
impl TextField {
pub fn parse(input: &str) -> Option<Self> {
- Self::from_str(input).ok()
+ Some(match input.to_ascii_lowercase().as_str() {
+ "abstract" => Self::Abstract,
+ "addendum" => Self::Addendum,
+ "booksubtitle" => Self::BookSubtitle,
+ "booktitle" => Self::BookTitle,
+ "booktitleaddon" => Self::BookTitleAddon,
+ "chapter" => Self::Chapter,
+ "doi" => Self::Doi,
+ "editortype" => Self::EditorType,
+ "editortypea" => Self::EditorTypeA,
+ "editortypeb" => Self::EditorTypeB,
+ "editortypec" => Self::EditorTypeC,
+ "eid" => Self::Eid,
+ "eprint" => Self::Eprint,
+ "eprintclass" => Self::EprintClass,
+ "eprinttype" => Self::EprintType,
+ "eventtitle" => Self::EventTitle,
+ "eventtitleaddon" => Self::EventTitleAddon,
+ "holder" => Self::Holder,
+ "howpublished" => Self::HowPublished,
+ "isbn" => Self::Isbn,
+ "issn" => Self::Issn,
+ "issue" => Self::Issue,
+ "issuesubtitle" => Self::IssueSubtitle,
+ "issuetitle" => Self::IssueTitle,
+ "issuetitleaddon" => Self::IssueTitleAddon,
+ "journal" => Self::Journal,
+ "journalsubtitle" => Self::JournalSubtitle,
+ "journaltitle" => Self::JournalTitle,
+ "journaltitleaddon" => Self::JournalTitleAddon,
+ "language" => Self::Language,
+ "location" => Self::Location,
+ "maintitle" => Self::MainTitle,
+ "mainsubtitle" => Self::MainSubtitle,
+ "maintitleaddon" => Self::MainTitleAddon,
+ "note" => Self::Note,
+ "origlanguage" => Self::OrigLanguage,
+ "publisher" => Self::Publisher,
+ "pubstate" => Self::Pubstate,
+ "series" => Self::Series,
+ "subtitle" => Self::Subtitle,
+ "title" => Self::Title,
+ "titleaddon" => Self::TitleAddon,
+ "type" => Self::Type,
+ "unknown" => Self::Unknown,
+ "url" => Self::Url,
+ "venue" => Self::Venue,
+ "version" => Self::Version,
+ _ => return None,
+ })
}
}
diff --git a/support/texlab/src/citation.rs b/support/texlab/crates/citeproc/src/lib.rs
index cb6c5c3623..1e0ac6b070 100644
--- a/support/texlab/src/citation.rs
+++ b/support/texlab/crates/citeproc/src/lib.rs
@@ -1,12 +1,11 @@
mod driver;
mod entry;
-pub(crate) mod field;
+pub mod field;
mod output;
+use syntax::bibtex;
use unicode_normalization::UnicodeNormalization;
-use crate::syntax::bibtex;
-
use self::{driver::Driver, output::Inline};
#[must_use]
diff --git a/support/texlab/src/citation/output.rs b/support/texlab/crates/citeproc/src/output.rs
index 2fc8a02361..2fc8a02361 100644
--- a/support/texlab/src/citation/output.rs
+++ b/support/texlab/crates/citeproc/src/output.rs
diff --git a/support/texlab/src/citation/snapshots/texlab__citation__tests__article_aksin_2006.snap b/support/texlab/crates/citeproc/src/snapshots/citeproc__tests__article_aksin_2006.snap
index 4598d47ed9..72c0c5e41a 100644
--- a/support/texlab/src/citation/snapshots/texlab__citation__tests__article_aksin_2006.snap
+++ b/support/texlab/crates/citeproc/src/snapshots/citeproc__tests__article_aksin_2006.snap
@@ -1,6 +1,5 @@
---
-source: src/citation/tests.rs
-assertion_line: 64
+source: crates/citeproc/src/tests.rs
expression: "render_entry(r#\"\n@string{jomch = {J.~Organomet. Chem.}}\n\n@article{aksin,\n author = {Aks{\\i}n, {\\\"O}zge and T{\\\"u}rkmen, Hayati and Artok, Levent\n and {\\c{C}}etinkaya, Bekir and Ni, Chaoying and\n B{\\\"u}y{\\\"u}kg{\\\"u}ng{\\\"o}r, Orhan and {\\\"O}zkal, Erhan},\n title = {Effect of immobilization on catalytic characteristics of\n saturated {Pd-N}-heterocyclic carbenes in {Mizoroki-Heck}\n reactions},\n journaltitle = jomch,\n date = 2006,\n volume = 691,\n number = 13,\n pages = {3027-3036},\n indextitle = {Effect of immobilization on catalytic characteristics},\n}\"#)"
---
O. Aksın, H. Türkmen, L. Artok, B. Çetinkaya, C. Ni, O. Büyükgüngör, E. Özkal: "Effect of immobilization on catalytic characteristics of saturated Pd-N-heterocyclic carbenes in Mizoroki-Heck reactions". *J. Organomet. Chem.* 691.13 (2006): 3027-3036.
diff --git a/support/texlab/src/citation/snapshots/texlab__citation__tests__article_betram_1996.snap b/support/texlab/crates/citeproc/src/snapshots/citeproc__tests__article_betram_1996.snap
index dd857419a5..1ae89dd711 100644
--- a/support/texlab/src/citation/snapshots/texlab__citation__tests__article_betram_1996.snap
+++ b/support/texlab/crates/citeproc/src/snapshots/citeproc__tests__article_betram_1996.snap
@@ -1,6 +1,5 @@
---
-source: src/citation/tests.rs
-assertion_line: 87
+source: crates/citeproc/src/tests.rs
expression: "render_entry(r#\"\n@string{jams = {J.~Amer. Math. Soc.}}\n\n@article{bertram,\n author = {Bertram, Aaron and Wentworth, Richard},\n title = {Gromov invariants for holomorphic maps on {Riemann} surfaces},\n journaltitle = jams,\n date = 1996,\n volume = 9,\n number = 2,\n pages = {529-571},\n langid = {english},\n langidopts = {variant=american},\n shorttitle = {Gromov invariants},\n annotation = {An \\texttt{article} entry with a \\texttt{volume} and a\n \\texttt{number} field},\n}\"#)"
---
A. Bertram, R. Wentworth: "Gromov invariants for holomorphic maps on Riemann surfaces". *J. Amer. Math. Soc.* 9.2 (1996): 529-571.
diff --git a/support/texlab/src/citation/snapshots/texlab__citation__tests__article_blom_2021.snap b/support/texlab/crates/citeproc/src/snapshots/citeproc__tests__article_blom_2021.snap
index 851b874fff..0e841a20a9 100644
--- a/support/texlab/src/citation/snapshots/texlab__citation__tests__article_blom_2021.snap
+++ b/support/texlab/crates/citeproc/src/snapshots/citeproc__tests__article_blom_2021.snap
@@ -1,6 +1,5 @@
---
-source: src/citation/tests.rs
-assertion_line: 138
+source: crates/citeproc/src/tests.rs
expression: "render_entry(r#\"\n@article{DBLP:journals/corr/abs-2107-11903,\n author = {Michelle L. Blom and\n Jurlind Budurushi and\n Ronald L. Rivest and\n Philip B. Stark and\n Peter J. Stuckey and\n Vanessa Teague and\n Damjan Vukcevic},\n title = {Assertion-based Approaches to Auditing Complex Elections, with application\n to party-list proportional elections},\n journal = {CoRR},\n volume = {abs/2107.11903},\n year = {2021},\n url = {https://arxiv.org/abs/2107.11903},\n eprinttype = {arXiv},\n eprint = {2107.11903},\n timestamp = {Thu, 29 Jul 2021 16:14:15 +0200},\n biburl = {https://dblp.org/rec/journals/corr/abs-2107-11903.bib},\n bibsource = {dblp computer science bibliography, https://dblp.org}\n}\"#)"
---
M. Blom, J. Budurushi, R. Rivest, P. Stark, P. Stuckey, V. Teague, D. Vukcevic: "Assertion-based Approaches to Auditing Complex Elections, with application to party-list proportional elections". *CoRR* abs/2107.11903 (2021): arXiv: [2107.11903](https://arxiv.org/abs/2107.11903). URL: [https://arxiv.org/abs/2107.11903](https://arxiv.org/abs/2107.11903).
diff --git a/support/texlab/src/citation/snapshots/texlab__citation__tests__article_jain_1999.snap b/support/texlab/crates/citeproc/src/snapshots/citeproc__tests__article_jain_1999.snap
index 2eefc3a871..6ae38a25e5 100644
--- a/support/texlab/src/citation/snapshots/texlab__citation__tests__article_jain_1999.snap
+++ b/support/texlab/crates/citeproc/src/snapshots/citeproc__tests__article_jain_1999.snap
@@ -1,6 +1,5 @@
---
-source: src/citation/tests.rs
-assertion_line: 39
+source: crates/citeproc/src/tests.rs
expression: "render_entry(r#\"\n@article{10.1145/331499.331504,\n author = {Jain, A. K. and Murty, M. N. and Flynn, P. J.},\n title = {Data Clustering: A Review},\n year = {1999},\n issue_date = {Sept. 1999},\n publisher = {Association for Computing Machinery},\n address = {New York, NY, USA},\n volume = {31},\n number = {3},\n issn = {0360-0300},\n url = {https://doi.org/10.1145/331499.331504},\n doi = {10.1145/331499.331504},\n journal = {ACM Comput. Surv.},\n month = {sep},\n pages = {264-323},\n numpages = {60},\n keywords = {incremental clustering, clustering applications, exploratory data analysis, cluster analysis, similarity indices, unsupervised learning}\n}\"#)"
---
A. Jain, M. Murty, P. Flynn: "Data Clustering: A Review". *ACM Comput. Surv.* 31.3 (Sep. 1999): 264-323. ISSN: 0360-0300. DOI: [10.1145/331499.331504](https://doi.org/10.1145/331499.331504). URL: [https://doi.org/10.1145/331499.331504](https://doi.org/10.1145/331499.331504).
diff --git a/support/texlab/src/citation/snapshots/texlab__citation__tests__article_kastenholz_2006.snap b/support/texlab/crates/citeproc/src/snapshots/citeproc__tests__article_kastenholz_2006.snap
index d1cae5db36..8abd770d8f 100644
--- a/support/texlab/src/citation/snapshots/texlab__citation__tests__article_kastenholz_2006.snap
+++ b/support/texlab/crates/citeproc/src/snapshots/citeproc__tests__article_kastenholz_2006.snap
@@ -1,6 +1,5 @@
---
-source: src/citation/tests.rs
-assertion_line: 110
+source: crates/citeproc/src/tests.rs
expression: "render_entry(r#\"\n@string{jchph = {J.~Chem. Phys.}}\n\n@article{kastenholz,\n author = {Kastenholz, M. A. and H{\\\"u}nenberger, Philippe H.},\n title = {Computation of methodology\\hyphen independent ionic solvation\n free energies from molecular simulations},\n journaltitle = jchph,\n date = 2006,\n subtitle = {{I}. {The} electrostatic potential in molecular liquids},\n volume = 124,\n eid = 124106,\n doi = {10.1063/1.2172593},\n langid = {english},\n langidopts = {variant=american},\n indextitle = {Computation of ionic solvation free energies},\n annotation = {An \\texttt{article} entry with an \\texttt{eid} and a\n \\texttt{doi} field. Note that the \\textsc{doi} is transformed\n into a clickable link if \\texttt{hyperref} support has been\n enabled},\n}\n \"#)"
---
M. Kastenholz, P. Hünenberger: "Computation of methodology- independent ionic solvation free energies from molecular simulations. I. The electrostatic potential in molecular liquids". *J. Chem. Phys.* 124, 124106 (2006): DOI: [10.1063/1.2172593](https://doi.org/10.1063/1.2172593).
diff --git a/support/texlab/src/citation/snapshots/texlab__citation__tests__article_rivest_1978.snap b/support/texlab/crates/citeproc/src/snapshots/citeproc__tests__article_rivest_1978.snap
index 3dfcb2967c..64b9784479 100644
--- a/support/texlab/src/citation/snapshots/texlab__citation__tests__article_rivest_1978.snap
+++ b/support/texlab/crates/citeproc/src/snapshots/citeproc__tests__article_rivest_1978.snap
@@ -1,6 +1,5 @@
---
-source: src/citation/tests.rs
-assertion_line: 15
+source: crates/citeproc/src/tests.rs
expression: "render_entry(r#\"\n@article{10.1145/359340.359342,\n author = {Rivest, R. L. and Shamir, A. and Adleman, L.},\n title = {A Method for Obtaining Digital Signatures and Public-Key Cryptosystems},\n year = {1978},\n issue_date = {Feb. 1978},\n publisher = {Association for Computing Machinery},\n address = {New York, NY, USA},\n volume = {21},\n number = {2},\n issn = {0001-0782},\n url = {https://doi.org/10.1145/359340.359342},\n doi = {10.1145/359340.359342},\n journal = {Commun. ACM},\n month = {feb},\n pages = {120-126},\n numpages = {7},\n}\"#)"
---
R. Rivest, A. Shamir, L. Adleman: "A Method for Obtaining Digital Signatures and Public-Key Cryptosystems". *Commun. ACM* 21.2 (Feb. 1978): 120-126. ISSN: 0001-0782. DOI: [10.1145/359340.359342](https://doi.org/10.1145/359340.359342). URL: [https://doi.org/10.1145/359340.359342](https://doi.org/10.1145/359340.359342).
diff --git a/support/texlab/src/citation/snapshots/texlab__citation__tests__book_aho_2006.snap b/support/texlab/crates/citeproc/src/snapshots/citeproc__tests__book_aho_2006.snap
index 34c0aeda3b..b168edc665 100644
--- a/support/texlab/src/citation/snapshots/texlab__citation__tests__book_aho_2006.snap
+++ b/support/texlab/crates/citeproc/src/snapshots/citeproc__tests__book_aho_2006.snap
@@ -1,6 +1,5 @@
---
-source: src/citation/tests.rs
-assertion_line: 165
+source: crates/citeproc/src/tests.rs
expression: "render_entry(r#\"\n@book{10.5555/1177220,\n author = {Aho, Alfred V. and Lam, Monica S. and Sethi, Ravi and Ullman, Jeffrey D.},\n title = {Compilers: Principles, Techniques, and Tools (2nd Edition)},\n year = {2006},\n isbn = {0321486811},\n publisher = {Addison-Wesley Longman Publishing Co., Inc.},\n address = {USA}\n}\"#)"
---
A. Aho, M. Lam, R. Sethi, J. Ullman: "Compilers: Principles, Techniques, and Tools (2nd Edition)". Addison-Wesley Longman Publishing Co., Inc., 2006. ISBN: 0321486811.
diff --git a/support/texlab/src/citation/snapshots/texlab__citation__tests__book_averroes_1998.snap b/support/texlab/crates/citeproc/src/snapshots/citeproc__tests__book_averroes_1998.snap
index 32b8a6ca5f..e03caa723e 100644
--- a/support/texlab/src/citation/snapshots/texlab__citation__tests__book_averroes_1998.snap
+++ b/support/texlab/crates/citeproc/src/snapshots/citeproc__tests__book_averroes_1998.snap
@@ -1,6 +1,5 @@
---
-source: src/citation/tests.rs
-assertion_line: 180
+source: crates/citeproc/src/tests.rs
expression: "render_entry(r#\"\n@book{averroes/bland,\n author = {Averroes},\n title = {The Epistle on the Possibility of Conjunction with the Active\n Intellect by {Ibn Rushd} with the Commentary of {Moses Narboni}},\n date = 1982,\n editor = {Bland, Kalman P.},\n translator = {Bland, Kalman P.},\n series = {Moreshet: Studies in {Jewish} History, Literature and Thought},\n number = 7,\n publisher = {Jewish Theological Seminary of America},\n location = {New York},\n keywords = {primary},\n langid = {english},\n langidopts = {variant=american},\n indextitle = {Epistle on the Possibility of Conjunction, The},\n shorttitle = {Possibility of Conjunction},\n annotation = {A \\texttt{book} entry with a \\texttt{series} and a\n \\texttt{number}. Note the concatenation of the \\texttt{editor}\n and \\texttt{translator} fields as well as the\n \\texttt{indextitle} field},\n}\"#)"
---
"The Epistle on the Possibility of Conjunction with the Active Intellect by Ibn Rushd with the Commentary of Moses Narboni". Ed. by K. Bland. Trans. by K. Bland. Moreshet: Studies in Jewish History, Literature and Thought 7. New York: Jewish Theological Seminary of America, 1982.
diff --git a/support/texlab/src/citation/snapshots/texlab__citation__tests__book_knuth_1984.snap b/support/texlab/crates/citeproc/src/snapshots/citeproc__tests__book_knuth_1984.snap
index 0276be0589..a15a63167d 100644
--- a/support/texlab/src/citation/snapshots/texlab__citation__tests__book_knuth_1984.snap
+++ b/support/texlab/crates/citeproc/src/snapshots/citeproc__tests__book_knuth_1984.snap
@@ -1,6 +1,5 @@
---
-source: src/citation/tests.rs
-assertion_line: 208
+source: crates/citeproc/src/tests.rs
expression: "render_entry(r#\"\n@book{knuth:ct:a,\n author = {Knuth, Donald E.},\n title = {The {\\TeX book}},\n date = 1984,\n maintitle = {Computers \\& Typesetting},\n volume = {A},\n publisher = {Addison-Wesley},\n location = {Reading, Mass.},\n langid = {english},\n langidopts = {variant=american},\n sorttitle = {Computers & Typesetting A},\n indexsorttitle= {The TeXbook},\n indextitle = {\\protect\\TeX book, The},\n shorttitle = {\\TeX book},\n annotation = {The first volume of a five-volume book. Note the\n \\texttt{sorttitle} field. We want this\n volume to be listed after the entry referring to the entire\n five-volume set. Also note the \\texttt{indextitle} and\n \\texttt{indexsorttitle} fields. Indexing packages that don't\n generate robust index entries require some control sequences\n to be protected from expansion},\n}\n \"#)"
---
D. Knuth: "The TeX book". *Computers & Typesetting*. Vol. A. Reading, Mass.: Addison-Wesley, 1984.
diff --git a/support/texlab/src/citation/snapshots/texlab__citation__tests__collection_matuz_1990.snap b/support/texlab/crates/citeproc/src/snapshots/citeproc__tests__collection_matuz_1990.snap
index 9ea78c80cf..0112a28139 100644
--- a/support/texlab/src/citation/snapshots/texlab__citation__tests__collection_matuz_1990.snap
+++ b/support/texlab/crates/citeproc/src/snapshots/citeproc__tests__collection_matuz_1990.snap
@@ -1,6 +1,5 @@
---
-source: src/citation/tests.rs
-assertion_line: 313
+source: crates/citeproc/src/tests.rs
expression: "render_entry(r#\"\n@collection{matuz:doody,\n editor = {Matuz, Roger},\n title = {Contemporary Literary Criticism},\n year = 1990,\n volume = 61,\n publisher = {Gale},\n location = {Detroit},\n pages = {204-208},\n langid = {english},\n langidopts = {variant=american},\n annotation = {A \\texttt{collection} entry providing the excerpt information\n for the \\texttt{doody} entry. Note the format of the\n \\texttt{pages} field},\n}\"#)"
---
"Contemporary Literary Criticism". Ed. by R. Matuz. Vol. 61. Detroit: Gale, 1990, 204-208.
diff --git a/support/texlab/src/citation/snapshots/texlab__citation__tests__inproceedings_combi_2004.snap b/support/texlab/crates/citeproc/src/snapshots/citeproc__tests__inproceedings_combi_2004.snap
index 9baef38be7..e4d3959d92 100644
--- a/support/texlab/src/citation/snapshots/texlab__citation__tests__inproceedings_combi_2004.snap
+++ b/support/texlab/crates/citeproc/src/snapshots/citeproc__tests__inproceedings_combi_2004.snap
@@ -1,6 +1,5 @@
---
-source: src/citation/tests.rs
-assertion_line: 290
+source: crates/citeproc/src/tests.rs
expression: "render_entry(r#\"\n@inproceedings{10.1145/967900.968040,\n author = {Combi, Carlo and Pozzi, Giuseppe},\n title = {Architectures for a Temporal Workflow Management System},\n year = {2004},\n isbn = {1581138121},\n publisher = {Association for Computing Machinery},\n address = {New York, NY, USA},\n url = {https://doi.org/10.1145/967900.968040},\n doi = {10.1145/967900.968040},\n booktitle = {Proceedings of the 2004 ACM Symposium on Applied Computing},\n pages = {659-666},\n numpages = {8},\n keywords = {active DBMS, temporal DBMS, workflow management system - WfMS, temporal workflow management system},\n location = {Nicosia, Cyprus},\n series = {SAC '04}\n}\"#)"
---
C. Combi, G. Pozzi: "Architectures for a Temporal Workflow Management System". *Proceedings of the 2004 ACM Symposium on Applied Computing*. SAC '04. Nicosia, Cyprus: Association for Computing Machinery, 2004, 659-666. ISBN: 1581138121. DOI: [10.1145/967900.968040](https://doi.org/10.1145/967900.968040). URL: [https://doi.org/10.1145/967900.968040](https://doi.org/10.1145/967900.968040).
diff --git a/support/texlab/src/citation/snapshots/texlab__citation__tests__inproceedings_erwin_2007.snap b/support/texlab/crates/citeproc/src/snapshots/citeproc__tests__inproceedings_erwin_2007.snap
index df9ab6569f..f544f35573 100644
--- a/support/texlab/src/citation/snapshots/texlab__citation__tests__inproceedings_erwin_2007.snap
+++ b/support/texlab/crates/citeproc/src/snapshots/citeproc__tests__inproceedings_erwin_2007.snap
@@ -1,6 +1,5 @@
---
-source: src/citation/tests.rs
-assertion_line: 269
+source: crates/citeproc/src/tests.rs
expression: "render_entry(r#\"\n@inproceedings{10.5555/1386993.1386994,\n author = {Erwin, Alva and Gopalan, Raj P. and Achuthan, N. R.},\n title = {A Bottom-up Projection Based Algorithm for Mining High Utility Itemsets},\n year = {2007},\n isbn = {9781920682651},\n publisher = {Australian Computer Society, Inc.},\n address = {AUS},\n booktitle = {Proceedings of the 2nd International Workshop on Integrating Artificial Intelligence and Data Mining - Volume 84},\n pages = {3-11},\n numpages = {9},\n keywords = {pattern growth, high utility itemset mining},\n location = {Gold Coast, Australia},\n series = {AIDM '07}\n}\"#)"
---
A. Erwin, R. Gopalan, N. Achuthan: "A Bottom-up Projection Based Algorithm for Mining High Utility Itemsets". *Proceedings of the 2nd International Workshop on Integrating Artificial Intelligence and Data Mining - Volume 84*. AIDM '07. Gold Coast, Australia: Australian Computer Society, Inc., 2007, 3-11. ISBN: 9781920682651.
diff --git a/support/texlab/src/citation/snapshots/texlab__citation__tests__mvbook_nietzsche_1988.snap b/support/texlab/crates/citeproc/src/snapshots/citeproc__tests__mvbook_nietzsche_1988.snap
index 5162b3114b..d86268cd90 100644
--- a/support/texlab/src/citation/snapshots/texlab__citation__tests__mvbook_nietzsche_1988.snap
+++ b/support/texlab/crates/citeproc/src/snapshots/citeproc__tests__mvbook_nietzsche_1988.snap
@@ -1,6 +1,5 @@
---
-source: src/citation/tests.rs
-assertion_line: 238
+source: crates/citeproc/src/tests.rs
expression: "render_entry(r#\"\n@string{dtv = {Deutscher Taschenbuch-Verlag}}\n\n@mvbook{nietzsche:ksa,\n author = {Nietzsche, Friedrich},\n title = {S{\\\"a}mtliche Werke},\n date = 1988,\n editor = {Colli, Giorgio and Montinari, Mazzino},\n edition = 2,\n volumes = 15,\n publisher = dtv # { and Walter de Gruyter},\n location = {M{\\\"u}nchen and Berlin and New York},\n langid = {german},\n sorttitle = {Werke-00-000},\n indexsorttitle= {Samtliche Werke},\n subtitle = {Kritische Studienausgabe},\n annotation = {The critical edition of Nietzsche's works. This is a\n \\texttt{mvbook} entry referring to a 15-volume work as a\n whole. Note the \\texttt{volumes} field and the format of the\n \\texttt{publisher} and \\texttt{location} fields in the\n database file. Also note the \\texttt{sorttitle} and\n field which is used to fine-tune the\n sorting order of the bibliography. We want this item listed\n first in the bibliography},\n}\"#)"
---
F. Nietzsche: "Sämtliche Werke. Kritische Studienausgabe". Ed. by G. Colli, M. Montinari. 2nd. München and Berlin and New York: Deutscher Taschenbuch-Verlag and Walter de Gruyter, 1988.
diff --git a/support/texlab/src/citation/snapshots/texlab__citation__tests__patent_almendro_1998.snap b/support/texlab/crates/citeproc/src/snapshots/citeproc__tests__patent_almendro_1998.snap
index 6f8c17f059..6cf8b39462 100644
--- a/support/texlab/src/citation/snapshots/texlab__citation__tests__patent_almendro_1998.snap
+++ b/support/texlab/crates/citeproc/src/snapshots/citeproc__tests__patent_almendro_1998.snap
@@ -1,6 +1,5 @@
---
-source: src/citation/tests.rs
-assertion_line: 334
+source: crates/citeproc/src/tests.rs
expression: "render_entry(r#\"\n@patent{almendro,\n author = {Almendro, Jos{\\'e} L. and Mart{\\'i}n, Jacinto and S{\\'a}nchez,\n Alberto and Nozal, Fernando},\n title = {Elektromagnetisches Signalhorn},\n number = {EU-29702195U},\n date = 1998,\n location = {countryfr and countryuk and countryde},\n langid = {german},\n annotation = {This is a \\texttt{patent} entry with a \\texttt{location}\n field. The number is given in the \\texttt{number} field. Note\n the format of the \\texttt{location} field in the database\n file. Compare \\texttt{laufenberg}, \\texttt{sorace}, and\n \\texttt{kowalik}},\n}\"#)"
---
J. Almendro, J. Martín, A. Sánchez, F. Nozal: "Elektromagnetisches Signalhorn". EU-29702195U (France and United Kingdom and Germany). 1998.
diff --git a/support/texlab/src/citation/tests.rs b/support/texlab/crates/citeproc/src/tests.rs
index 6caff1add0..a125afd695 100644
--- a/support/texlab/src/citation/tests.rs
+++ b/support/texlab/crates/citeproc/src/tests.rs
@@ -1,7 +1,7 @@
use insta::assert_snapshot;
+use parser::parse_bibtex;
use rowan::ast::AstNode;
-
-use crate::{parser::parse_bibtex, syntax::bibtex};
+use syntax::bibtex;
fn render_entry(input: &str) -> String {
let green = parse_bibtex(input);
diff --git a/support/texlab/crates/distro/Cargo.toml b/support/texlab/crates/distro/Cargo.toml
new file mode 100644
index 0000000000..b450aa2631
--- /dev/null
+++ b/support/texlab/crates/distro/Cargo.toml
@@ -0,0 +1,14 @@
+[package]
+name = "distro"
+version = "0.0.0"
+license.workspace = true
+authors.workspace = true
+edition.workspace = true
+rust-version.workspace = true
+
+[dependencies]
+anyhow = "1.0.70"
+rustc-hash = "1.1.0"
+
+[lib]
+doctest = false
diff --git a/support/texlab/src/distro/file_name_db.rs b/support/texlab/crates/distro/src/file_name_db.rs
index 9234d0a3f9..750ed11e68 100644
--- a/support/texlab/src/distro/file_name_db.rs
+++ b/support/texlab/crates/distro/src/file_name_db.rs
@@ -6,7 +6,7 @@ use std::{
use anyhow::Result;
use rustc_hash::FxHashSet;
-use crate::db::Language;
+use crate::Language;
#[derive(Debug)]
pub struct DistroFile(PathBuf);
diff --git a/support/texlab/src/distro/kpsewhich.rs b/support/texlab/crates/distro/src/kpsewhich.rs
index 24f4a3531a..24f4a3531a 100644
--- a/support/texlab/src/distro/kpsewhich.rs
+++ b/support/texlab/crates/distro/src/kpsewhich.rs
diff --git a/support/texlab/crates/distro/src/language.rs b/support/texlab/crates/distro/src/language.rs
new file mode 100644
index 0000000000..207b700581
--- /dev/null
+++ b/support/texlab/crates/distro/src/language.rs
@@ -0,0 +1,42 @@
+use std::path::Path;
+
+#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone, Copy, Hash)]
+pub enum Language {
+ Tex,
+ Bib,
+ Aux,
+ Log,
+ Root,
+ Tectonic,
+}
+
+impl Language {
+ pub fn from_path(path: &Path) -> Option<Self> {
+ let name = path.file_name()?;
+ if name.eq_ignore_ascii_case(".texlabroot") || name.eq_ignore_ascii_case("texlabroot") {
+ return Some(Self::Root);
+ }
+
+ if name.eq_ignore_ascii_case("Tectonic.toml") {
+ return Some(Self::Tectonic);
+ }
+
+ let extname = path.extension()?.to_str()?;
+ match extname.to_lowercase().as_str() {
+ "tex" | "sty" | "cls" | "def" | "lco" | "rnw" => Some(Self::Tex),
+ "bib" | "bibtex" => Some(Self::Bib),
+ "aux" => Some(Self::Aux),
+ "log" => Some(Self::Log),
+ _ => None,
+ }
+ }
+
+ pub fn from_id(id: &str) -> Option<Self> {
+ match id {
+ "tex" | "latex" => Some(Self::Tex),
+ "bib" | "bibtex" => Some(Self::Bib),
+ "texlabroot" => Some(Self::Root),
+ _ => None,
+ }
+ }
+}
diff --git a/support/texlab/src/distro.rs b/support/texlab/crates/distro/src/lib.rs
index 759374da81..5ad9a8529c 100644
--- a/support/texlab/src/distro.rs
+++ b/support/texlab/crates/distro/src/lib.rs
@@ -1,5 +1,6 @@
mod file_name_db;
mod kpsewhich;
+mod language;
mod miktex;
mod texlive;
@@ -7,7 +8,7 @@ use std::process::{Command, Stdio};
use anyhow::Result;
-pub use file_name_db::FileNameDB;
+pub use self::{file_name_db::FileNameDB, language::Language};
#[derive(Debug, PartialEq, Eq, Clone, Copy)]
pub enum DistroKind {
diff --git a/support/texlab/src/distro/miktex.rs b/support/texlab/crates/distro/src/miktex.rs
index 1dfe1b9522..1dfe1b9522 100644
--- a/support/texlab/src/distro/miktex.rs
+++ b/support/texlab/crates/distro/src/miktex.rs
diff --git a/support/texlab/src/distro/texlive.rs b/support/texlab/crates/distro/src/texlive.rs
index 8013033e6d..8013033e6d 100644
--- a/support/texlab/src/distro/texlive.rs
+++ b/support/texlab/crates/distro/src/texlive.rs
diff --git a/support/texlab/crates/parser/Cargo.toml b/support/texlab/crates/parser/Cargo.toml
new file mode 100644
index 0000000000..3f2efc0450
--- /dev/null
+++ b/support/texlab/crates/parser/Cargo.toml
@@ -0,0 +1,20 @@
+[package]
+name = "parser"
+version = "0.0.0"
+license.workspace = true
+authors.workspace = true
+edition.workspace = true
+rust-version.workspace = true
+
+[dependencies]
+logos = "0.13.0"
+once_cell = "1.17.1"
+regex = "1.7.3"
+rowan = "0.15.11"
+syntax = { path = "../syntax" }
+
+[dev-dependencies]
+insta = { version = "1.29.0", features = ["glob", "redactions", "json"] }
+
+[lib]
+doctest = false
diff --git a/support/texlab/src/parser/bibtex.rs b/support/texlab/crates/parser/src/bibtex.rs
index e03a39c9ae..193203016e 100644
--- a/support/texlab/src/parser/bibtex.rs
+++ b/support/texlab/crates/parser/src/bibtex.rs
@@ -1,7 +1,6 @@
use logos::Logos;
use rowan::{GreenNode, GreenNodeBuilder};
-
-use crate::syntax::bibtex::SyntaxKind::{self, *};
+use syntax::bibtex::SyntaxKind::{self, *};
pub fn parse_bibtex(input: &str) -> GreenNode {
let mut ptr = TokenPtr {
@@ -251,7 +250,7 @@ where
fn peek(&mut self) -> Option<(T, &'a str)> {
if self.token.is_none() {
- let kind = self.lexer.next()?;
+ let kind = self.lexer.next()?.unwrap();
let text = self.lexer.slice();
self.token = Some((kind, text));
}
@@ -275,7 +274,6 @@ enum RootToken {
Entry,
#[regex(r"[^@]+")]
- #[error]
Junk,
}
@@ -301,7 +299,7 @@ enum BodyToken {
#[regex(r"[^\s\(\)\{\}@,=]+")]
Name,
- #[error]
+ #[token("@")]
Error,
}
@@ -328,8 +326,7 @@ enum ValueToken {
#[regex(r"\d+", priority = 2)]
Integer,
- #[regex(r#"[^\s"\{\},]+"#)]
- #[error]
+ #[regex(r#"[^\s"\{\},#]+"#)]
Name,
}
@@ -378,7 +375,6 @@ enum ContentToken {
CommandName,
#[regex(r#"[^\s"\{\}\\~,]+"#)]
- #[error]
Word,
}
@@ -439,7 +435,7 @@ impl From<ContentToken> for SyntaxKind {
#[cfg(test)]
mod tests {
- use crate::syntax::bibtex;
+ use syntax::bibtex;
use super::parse_bibtex;
diff --git a/support/texlab/src/parser/build_log.rs b/support/texlab/crates/parser/src/build_log.rs
index 635f9adfb4..27f3699a66 100644
--- a/support/texlab/src/parser/build_log.rs
+++ b/support/texlab/crates/parser/src/build_log.rs
@@ -2,8 +2,7 @@ use std::{cmp::Ordering, path::PathBuf};
use once_cell::sync::Lazy;
use regex::{Match, Regex};
-
-use crate::syntax::{BuildError, BuildErrorLevel, BuildLog};
+use syntax::{BuildError, BuildErrorLevel, BuildLog};
const MAX_LINE_LENGTH: usize = 79;
diff --git a/support/texlab/src/parser/latex.rs b/support/texlab/crates/parser/src/latex.rs
index 591d2a1583..52e164a349 100644
--- a/support/texlab/src/parser/latex.rs
+++ b/support/texlab/crates/parser/src/latex.rs
@@ -1,8 +1,7 @@
mod lexer;
use rowan::{GreenNode, GreenNodeBuilder};
-
-use crate::syntax::latex::SyntaxKind::{self, *};
+use syntax::latex::SyntaxKind::{self, *};
use self::lexer::{
types::{CommandName, SectionLevel, Token},
@@ -697,6 +696,8 @@ impl<'a> Parser<'a> {
| Token::Eq
| Token::LBrack
| Token::RBrack
+ | Token::LParen
+ | Token::RParen
| Token::CommandName(CommandName::Generic) => self.path(),
Token::Whitespace | Token::LineBreak | Token::Comma => self.eat(),
Token::LCurly => self.curly_group_path(),
@@ -720,6 +721,8 @@ impl<'a> Parser<'a> {
| Token::Eq
| Token::LBrack
| Token::RBrack
+ | Token::LParen
+ | Token::RParen
| Token::CommandName(CommandName::Generic) => self.eat(),
Token::LCurly => self.curly_group_path(),
_ => break,
@@ -1119,7 +1122,7 @@ pub fn parse_latex(text: &str) -> GreenNode {
#[cfg(test)]
mod tests {
- use crate::syntax::latex;
+ use syntax::latex;
use super::parse_latex;
diff --git a/support/texlab/src/parser/latex/lexer.rs b/support/texlab/crates/parser/src/latex/lexer.rs
index ee5b8dd328..c0129ed3ba 100644
--- a/support/texlab/src/parser/latex/lexer.rs
+++ b/support/texlab/crates/parser/src/latex/lexer.rs
@@ -2,8 +2,7 @@ mod commands;
pub(super) mod types;
use logos::Logos;
-
-use crate::syntax::latex::SyntaxKind;
+use syntax::latex::SyntaxKind;
use self::types::{CommandName, Token};
@@ -49,7 +48,7 @@ impl<'a> Lexer<'a> {
fn tokenize(input: &str) -> Vec<(Token, &str)> {
let mut lexer = Token::lexer(input);
std::iter::from_fn(move || {
- let kind = lexer.next()?;
+ let kind = lexer.next()?.unwrap();
let text = lexer.slice();
Some((kind, text))
})
diff --git a/support/texlab/src/parser/latex/lexer/commands.rs b/support/texlab/crates/parser/src/latex/lexer/commands.rs
index ba609f5d7f..ba609f5d7f 100644
--- a/support/texlab/src/parser/latex/lexer/commands.rs
+++ b/support/texlab/crates/parser/src/latex/lexer/commands.rs
diff --git a/support/texlab/src/parser/latex/lexer/types.rs b/support/texlab/crates/parser/src/latex/lexer/types.rs
index 4355c021c1..4e6c67ab1f 100644
--- a/support/texlab/src/parser/latex/lexer/types.rs
+++ b/support/texlab/crates/parser/src/latex/lexer/types.rs
@@ -36,7 +36,6 @@ pub enum Token {
Eq,
#[regex(r"[^\s\\%\{\},\$\[\]\(\)=]+")]
- #[error]
Word,
#[regex(r"\$\$?")]
diff --git a/support/texlab/src/parser.rs b/support/texlab/crates/parser/src/lib.rs
index 51d56475cf..51d56475cf 100644
--- a/support/texlab/src/parser.rs
+++ b/support/texlab/crates/parser/src/lib.rs
diff --git a/support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@comment.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@comment.txt.snap
index f2e1163eff..7c665e628a 100644
--- a/support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@comment.txt.snap
+++ b/support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@comment.txt.snap
@@ -1,7 +1,7 @@
---
-source: src/parser/bibtex.rs
+source: crates/parser/src/bibtex.rs
expression: root
-input_file: src/parser/test_data/bibtex/comment.txt
+input_file: crates/parser/src/test_data/bibtex/comment.txt
---
ROOT@0..82
JUNK@0..16 "Some junk here\n\n"
diff --git a/support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@issue_809.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@issue_809.txt.snap
index 922e926cef..84c9f86ec0 100644
--- a/support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@issue_809.txt.snap
+++ b/support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@issue_809.txt.snap
@@ -1,6 +1,7 @@
---
-source: src/parser/bibtex.rs
+source: crates/parser/src/bibtex.rs
expression: root
+input_file: crates/parser/src/test_data/bibtex/issue_809.txt
---
ROOT@0..50
ENTRY@0..50
diff --git a/support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@preamble.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@preamble.txt.snap
index 26d8a919ba..b0d043b1a7 100644
--- a/support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@preamble.txt.snap
+++ b/support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@preamble.txt.snap
@@ -1,7 +1,7 @@
---
-source: src/parser/bibtex.rs
+source: crates/parser/src/bibtex.rs
expression: root
-input_file: src/parser/test_data/bibtex/preamble.txt
+input_file: crates/parser/src/test_data/bibtex/preamble.txt
---
ROOT@0..25
PREAMBLE@0..25
diff --git a/support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@samples__aho_2006.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@samples__aho_2006.txt.snap
index d1d34942d8..36db1ebb4c 100644
--- a/support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@samples__aho_2006.txt.snap
+++ b/support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@samples__aho_2006.txt.snap
@@ -1,7 +1,7 @@
---
-source: src/parser/bibtex.rs
+source: crates/parser/src/bibtex.rs
expression: root
-input_file: src/parser/test_data/bibtex/samples/aho_2006.txt
+input_file: crates/parser/src/test_data/bibtex/samples/aho_2006.txt
---
ROOT@0..314
ENTRY@0..314
diff --git a/support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@samples__aksin_2006.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@samples__aksin_2006.txt.snap
index 72e354e3c0..6b273d63a2 100644
--- a/support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@samples__aksin_2006.txt.snap
+++ b/support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@samples__aksin_2006.txt.snap
@@ -1,7 +1,7 @@
---
-source: src/parser/bibtex.rs
+source: crates/parser/src/bibtex.rs
expression: root
-input_file: src/parser/test_data/bibtex/samples/aksin_2006.txt
+input_file: crates/parser/src/test_data/bibtex/samples/aksin_2006.txt
---
ROOT@0..679
STRING@0..40
diff --git a/support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@samples__almendro_1998.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@samples__almendro_1998.txt.snap
index cff0323cb4..280dd5a4cf 100644
--- a/support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@samples__almendro_1998.txt.snap
+++ b/support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@samples__almendro_1998.txt.snap
@@ -1,7 +1,7 @@
---
-source: src/parser/bibtex.rs
+source: crates/parser/src/bibtex.rs
expression: root
-input_file: src/parser/test_data/bibtex/samples/almendro_1998.txt
+input_file: crates/parser/src/test_data/bibtex/samples/almendro_1998.txt
---
ROOT@0..706
ENTRY@0..706
diff --git a/support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@samples__averroes_1998.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@samples__averroes_1998.txt.snap
index c02d61d272..8fb5a718d0 100644
--- a/support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@samples__averroes_1998.txt.snap
+++ b/support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@samples__averroes_1998.txt.snap
@@ -1,7 +1,7 @@
---
-source: src/parser/bibtex.rs
+source: crates/parser/src/bibtex.rs
expression: root
-input_file: src/parser/test_data/bibtex/samples/averroes_1998.txt
+input_file: crates/parser/src/test_data/bibtex/samples/averroes_1998.txt
---
ROOT@0..1008
ENTRY@0..1008
diff --git a/support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@samples__betram_1996.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@samples__betram_1996.txt.snap
index c2748c1661..417041cde4 100644
--- a/support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@samples__betram_1996.txt.snap
+++ b/support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@samples__betram_1996.txt.snap
@@ -1,7 +1,7 @@
---
-source: src/parser/bibtex.rs
+source: crates/parser/src/bibtex.rs
expression: root
-input_file: src/parser/test_data/bibtex/samples/betram_1996.txt
+input_file: crates/parser/src/test_data/bibtex/samples/betram_1996.txt
---
ROOT@0..556
STRING@0..40
diff --git a/support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@samples__blom_2021.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@samples__blom_2021.txt.snap
index 417bda4ec9..86ee736c2b 100644
--- a/support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@samples__blom_2021.txt.snap
+++ b/support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@samples__blom_2021.txt.snap
@@ -1,7 +1,7 @@
---
-source: src/parser/bibtex.rs
+source: crates/parser/src/bibtex.rs
expression: root
-input_file: src/parser/test_data/bibtex/samples/blom_2021.txt
+input_file: crates/parser/src/test_data/bibtex/samples/blom_2021.txt
---
ROOT@0..860
ENTRY@0..860
diff --git a/support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@samples__combi_2004.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@samples__combi_2004.txt.snap
index 82f58a700f..d633886ced 100644
--- a/support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@samples__combi_2004.txt.snap
+++ b/support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@samples__combi_2004.txt.snap
@@ -1,7 +1,7 @@
---
-source: src/parser/bibtex.rs
+source: crates/parser/src/bibtex.rs
expression: root
-input_file: src/parser/test_data/bibtex/samples/combi_2004.txt
+input_file: crates/parser/src/test_data/bibtex/samples/combi_2004.txt
---
ROOT@0..674
ENTRY@0..674
diff --git a/support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@samples__erwin_2007.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@samples__erwin_2007.txt.snap
index 58094d2f42..2275d58d08 100644
--- a/support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@samples__erwin_2007.txt.snap
+++ b/support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@samples__erwin_2007.txt.snap
@@ -1,7 +1,7 @@
---
-source: src/parser/bibtex.rs
+source: crates/parser/src/bibtex.rs
expression: root
-input_file: src/parser/test_data/bibtex/samples/erwin_2007.txt
+input_file: crates/parser/src/test_data/bibtex/samples/erwin_2007.txt
---
ROOT@0..615
ENTRY@0..615
diff --git a/support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@samples__jain_1999.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@samples__jain_1999.txt.snap
index d9f83b339a..d409435d09 100644
--- a/support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@samples__jain_1999.txt.snap
+++ b/support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@samples__jain_1999.txt.snap
@@ -1,7 +1,7 @@
---
-source: src/parser/bibtex.rs
+source: crates/parser/src/bibtex.rs
expression: root
-input_file: src/parser/test_data/bibtex/samples/jain_1999.txt
+input_file: crates/parser/src/test_data/bibtex/samples/jain_1999.txt
---
ROOT@0..674
ENTRY@0..674
diff --git a/support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@samples__kastenholz_2006.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@samples__kastenholz_2006.txt.snap
index 8d67f95096..e93f8ce6cb 100644
--- a/support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@samples__kastenholz_2006.txt.snap
+++ b/support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@samples__kastenholz_2006.txt.snap
@@ -1,7 +1,7 @@
---
-source: src/parser/bibtex.rs
+source: crates/parser/src/bibtex.rs
expression: root
-input_file: src/parser/test_data/bibtex/samples/kastenholz_2006.txt
+input_file: crates/parser/src/test_data/bibtex/samples/kastenholz_2006.txt
---
ROOT@0..898
STRING@0..35
diff --git a/support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@samples__knuth_1984.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@samples__knuth_1984.txt.snap
index 2be9233f95..59e678cbee 100644
--- a/support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@samples__knuth_1984.txt.snap
+++ b/support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@samples__knuth_1984.txt.snap
@@ -1,7 +1,7 @@
---
-source: src/parser/bibtex.rs
+source: crates/parser/src/bibtex.rs
expression: root
-input_file: src/parser/test_data/bibtex/samples/knuth_1984.txt
+input_file: crates/parser/src/test_data/bibtex/samples/knuth_1984.txt
---
ROOT@0..993
ENTRY@0..993
diff --git a/support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@samples__matuz_1990.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@samples__matuz_1990.txt.snap
index 1e2b67f36c..75f0293f23 100644
--- a/support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@samples__matuz_1990.txt.snap
+++ b/support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@samples__matuz_1990.txt.snap
@@ -1,7 +1,7 @@
---
-source: src/parser/bibtex.rs
+source: crates/parser/src/bibtex.rs
expression: root
-input_file: src/parser/test_data/bibtex/samples/matuz_1990.txt
+input_file: crates/parser/src/test_data/bibtex/samples/matuz_1990.txt
---
ROOT@0..517
ENTRY@0..517
diff --git a/support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@samples__nietzsche_1998.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@samples__nietzsche_1998.txt.snap
index 40d1f230af..97fe0cf087 100644
--- a/support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@samples__nietzsche_1998.txt.snap
+++ b/support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@samples__nietzsche_1998.txt.snap
@@ -1,7 +1,7 @@
---
-source: src/parser/bibtex.rs
+source: crates/parser/src/bibtex.rs
expression: root
-input_file: src/parser/test_data/bibtex/samples/nietzsche_1998.txt
+input_file: crates/parser/src/test_data/bibtex/samples/nietzsche_1998.txt
---
ROOT@0..1112
STRING@0..49
diff --git a/support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@samples__rivest_1978.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@samples__rivest_1978.txt.snap
index b296d9cd4b..11a8f38bac 100644
--- a/support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@samples__rivest_1978.txt.snap
+++ b/support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@samples__rivest_1978.txt.snap
@@ -1,7 +1,7 @@
---
-source: src/parser/bibtex.rs
+source: crates/parser/src/bibtex.rs
expression: root
-input_file: src/parser/test_data/bibtex/samples/rivest_1978.txt
+input_file: crates/parser/src/test_data/bibtex/samples/rivest_1978.txt
---
ROOT@0..557
ENTRY@0..557
diff --git a/support/texlab/src/parser/snapshots/texlab__parser__build_log__tests__parse@001.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__build_log__tests__parse@001.txt.snap
index 1d91ff7fff..39808505c1 100644
--- a/support/texlab/src/parser/snapshots/texlab__parser__build_log__tests__parse@001.txt.snap
+++ b/support/texlab/crates/parser/src/snapshots/parser__build_log__tests__parse@001.txt.snap
@@ -1,7 +1,7 @@
---
-source: src/parser/build_log.rs
+source: crates/parser/src/build_log.rs
expression: parse_build_log(&text)
-input_file: src/parser/test_data/build_log/001.txt
+input_file: crates/parser/src/test_data/build_log/001.txt
---
BuildLog {
errors: [
diff --git a/support/texlab/src/parser/snapshots/texlab__parser__build_log__tests__parse@002.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__build_log__tests__parse@002.txt.snap
index 91fa71d636..6d4001e120 100644
--- a/support/texlab/src/parser/snapshots/texlab__parser__build_log__tests__parse@002.txt.snap
+++ b/support/texlab/crates/parser/src/snapshots/parser__build_log__tests__parse@002.txt.snap
@@ -1,7 +1,7 @@
---
-source: src/parser/build_log.rs
+source: crates/parser/src/build_log.rs
expression: parse_build_log(&text)
-input_file: src/parser/test_data/build_log/002.txt
+input_file: crates/parser/src/test_data/build_log/002.txt
---
BuildLog {
errors: [
diff --git a/support/texlab/src/parser/snapshots/texlab__parser__build_log__tests__parse@003.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__build_log__tests__parse@003.txt.snap
index 22d2ca86e5..bbc50a44c2 100644
--- a/support/texlab/src/parser/snapshots/texlab__parser__build_log__tests__parse@003.txt.snap
+++ b/support/texlab/crates/parser/src/snapshots/parser__build_log__tests__parse@003.txt.snap
@@ -1,7 +1,7 @@
---
-source: src/parser/build_log.rs
+source: crates/parser/src/build_log.rs
expression: parse_build_log(&text)
-input_file: src/parser/test_data/build_log/003.txt
+input_file: crates/parser/src/test_data/build_log/003.txt
---
BuildLog {
errors: [
diff --git a/support/texlab/src/parser/snapshots/texlab__parser__build_log__tests__parse@004.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__build_log__tests__parse@004.txt.snap
index 83219b5fff..c4f2ce5c72 100644
--- a/support/texlab/src/parser/snapshots/texlab__parser__build_log__tests__parse@004.txt.snap
+++ b/support/texlab/crates/parser/src/snapshots/parser__build_log__tests__parse@004.txt.snap
@@ -1,7 +1,7 @@
---
-source: src/parser/build_log.rs
+source: crates/parser/src/build_log.rs
expression: parse_build_log(&text)
-input_file: src/parser/test_data/build_log/004.txt
+input_file: crates/parser/src/test_data/build_log/004.txt
---
BuildLog {
errors: [
diff --git a/support/texlab/src/parser/snapshots/texlab__parser__build_log__tests__parse@005.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__build_log__tests__parse@005.txt.snap
index b77926323c..dafd6a4506 100644
--- a/support/texlab/src/parser/snapshots/texlab__parser__build_log__tests__parse@005.txt.snap
+++ b/support/texlab/crates/parser/src/snapshots/parser__build_log__tests__parse@005.txt.snap
@@ -1,7 +1,7 @@
---
-source: src/parser/build_log.rs
+source: crates/parser/src/build_log.rs
expression: parse_build_log(&text)
-input_file: src/parser/test_data/build_log/005.txt
+input_file: crates/parser/src/test_data/build_log/005.txt
---
BuildLog {
errors: [
diff --git a/support/texlab/src/parser/snapshots/texlab__parser__build_log__tests__parse@006.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__build_log__tests__parse@006.txt.snap
index 837aa9c295..ca9318c68d 100644
--- a/support/texlab/src/parser/snapshots/texlab__parser__build_log__tests__parse@006.txt.snap
+++ b/support/texlab/crates/parser/src/snapshots/parser__build_log__tests__parse@006.txt.snap
@@ -1,7 +1,7 @@
---
-source: src/parser/build_log.rs
+source: crates/parser/src/build_log.rs
expression: parse_build_log(&text)
-input_file: src/parser/test_data/build_log/006.txt
+input_file: crates/parser/src/test_data/build_log/006.txt
---
BuildLog {
errors: [
diff --git a/support/texlab/src/parser/snapshots/texlab__parser__build_log__tests__parse@007.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__build_log__tests__parse@007.txt.snap
index d509a01bd4..bf0c832fe2 100644
--- a/support/texlab/src/parser/snapshots/texlab__parser__build_log__tests__parse@007.txt.snap
+++ b/support/texlab/crates/parser/src/snapshots/parser__build_log__tests__parse@007.txt.snap
@@ -1,6 +1,7 @@
---
-source: src/parser/build_log.rs
+source: crates/parser/src/build_log.rs
expression: parse_build_log(&text)
+input_file: crates/parser/src/test_data/build_log/007.txt
---
BuildLog {
errors: [
diff --git a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@block_comments.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@block_comments.txt.snap
index 1a12800267..b93689a3b9 100644
--- a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@block_comments.txt.snap
+++ b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@block_comments.txt.snap
@@ -1,7 +1,7 @@
---
-source: src/parser/latex.rs
+source: crates/parser/src/latex.rs
expression: root
-input_file: src/parser/test_data/latex/block_comments.txt
+input_file: crates/parser/src/test_data/latex/block_comments.txt
---
ROOT@0..48
PREAMBLE@0..48
diff --git a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@caption__caption_default.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@caption__caption_default.txt.snap
index 8b314f42ad..bb82661568 100644
--- a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@caption__caption_default.txt.snap
+++ b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@caption__caption_default.txt.snap
@@ -1,7 +1,7 @@
---
-source: src/parser/latex.rs
+source: crates/parser/src/latex.rs
expression: root
-input_file: src/parser/test_data/latex/caption/caption_default.txt
+input_file: crates/parser/src/test_data/latex/caption/caption_default.txt
---
ROOT@0..27
PREAMBLE@0..27
diff --git a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@caption__caption_default_error.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@caption__caption_default_error.txt.snap
index 9bbabd4b56..741d4ea0c4 100644
--- a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@caption__caption_default_error.txt.snap
+++ b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@caption__caption_default_error.txt.snap
@@ -1,7 +1,7 @@
---
-source: src/parser/latex.rs
+source: crates/parser/src/latex.rs
expression: root
-input_file: src/parser/test_data/latex/caption/caption_default_error.txt
+input_file: crates/parser/src/test_data/latex/caption/caption_default_error.txt
---
ROOT@0..26
PREAMBLE@0..26
diff --git a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@caption__caption_figure.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@caption__caption_figure.txt.snap
index 4e12380396..56735873f9 100644
--- a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@caption__caption_figure.txt.snap
+++ b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@caption__caption_figure.txt.snap
@@ -1,7 +1,7 @@
---
-source: src/parser/latex.rs
+source: crates/parser/src/latex.rs
expression: root
-input_file: src/parser/test_data/latex/caption/caption_figure.txt
+input_file: crates/parser/src/test_data/latex/caption/caption_figure.txt
---
ROOT@0..39
PREAMBLE@0..39
diff --git a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@caption__caption_minimal.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@caption__caption_minimal.txt.snap
index 9e0769dd57..12ef5ffebb 100644
--- a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@caption__caption_minimal.txt.snap
+++ b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@caption__caption_minimal.txt.snap
@@ -1,7 +1,7 @@
---
-source: src/parser/latex.rs
+source: crates/parser/src/latex.rs
expression: root
-input_file: src/parser/test_data/latex/caption/caption_minimal.txt
+input_file: crates/parser/src/test_data/latex/caption/caption_minimal.txt
---
ROOT@0..22
PREAMBLE@0..22
diff --git a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@caption__caption_minimal_error.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@caption__caption_minimal_error.txt.snap
index 845f1f3682..7bc85c0b20 100644
--- a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@caption__caption_minimal_error.txt.snap
+++ b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@caption__caption_minimal_error.txt.snap
@@ -1,7 +1,7 @@
---
-source: src/parser/latex.rs
+source: crates/parser/src/latex.rs
expression: root
-input_file: src/parser/test_data/latex/caption/caption_minimal_error.txt
+input_file: crates/parser/src/test_data/latex/caption/caption_minimal_error.txt
---
ROOT@0..21
PREAMBLE@0..21
diff --git a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@citation__citation_empty.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@citation__citation_empty.txt.snap
index c075d59f77..d35246b26c 100644
--- a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@citation__citation_empty.txt.snap
+++ b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@citation__citation_empty.txt.snap
@@ -1,7 +1,7 @@
---
-source: src/parser/latex.rs
+source: crates/parser/src/latex.rs
expression: root
-input_file: src/parser/test_data/latex/citation/citation_empty.txt
+input_file: crates/parser/src/test_data/latex/citation/citation_empty.txt
---
ROOT@0..7
PREAMBLE@0..7
diff --git a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@citation__citation_missing_brace.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@citation__citation_missing_brace.txt.snap
index 1a2993bfeb..0855ea49ad 100644
--- a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@citation__citation_missing_brace.txt.snap
+++ b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@citation__citation_missing_brace.txt.snap
@@ -1,7 +1,7 @@
---
-source: src/parser/latex.rs
+source: crates/parser/src/latex.rs
expression: root
-input_file: src/parser/test_data/latex/citation/citation_missing_brace.txt
+input_file: crates/parser/src/test_data/latex/citation/citation_missing_brace.txt
---
ROOT@0..9
PREAMBLE@0..9
diff --git a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@citation__citation_multiple_keys.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@citation__citation_multiple_keys.txt.snap
index 92ad9815e4..e4d49e796e 100644
--- a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@citation__citation_multiple_keys.txt.snap
+++ b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@citation__citation_multiple_keys.txt.snap
@@ -1,7 +1,7 @@
---
-source: src/parser/latex.rs
+source: crates/parser/src/latex.rs
expression: root
-input_file: src/parser/test_data/latex/citation/citation_multiple_keys.txt
+input_file: crates/parser/src/test_data/latex/citation/citation_multiple_keys.txt
---
ROOT@0..15
PREAMBLE@0..15
diff --git a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@citation__citation_prenote.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@citation__citation_prenote.txt.snap
index a14278731f..654b97dfd9 100644
--- a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@citation__citation_prenote.txt.snap
+++ b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@citation__citation_prenote.txt.snap
@@ -1,7 +1,7 @@
---
-source: src/parser/latex.rs
+source: crates/parser/src/latex.rs
expression: root
-input_file: src/parser/test_data/latex/citation/citation_prenote.txt
+input_file: crates/parser/src/test_data/latex/citation/citation_prenote.txt
---
ROOT@0..15
PREAMBLE@0..15
diff --git a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@citation__citation_prenote_postnote.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@citation__citation_prenote_postnote.txt.snap
index 96c3996286..ca83218dfb 100644
--- a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@citation__citation_prenote_postnote.txt.snap
+++ b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@citation__citation_prenote_postnote.txt.snap
@@ -1,7 +1,7 @@
---
-source: src/parser/latex.rs
+source: crates/parser/src/latex.rs
expression: root
-input_file: src/parser/test_data/latex/citation/citation_prenote_postnote.txt
+input_file: crates/parser/src/test_data/latex/citation/citation_prenote_postnote.txt
---
ROOT@0..20
PREAMBLE@0..20
diff --git a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@citation__citation_redundant_comma.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@citation__citation_redundant_comma.txt.snap
index d97fad470c..015abf7011 100644
--- a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@citation__citation_redundant_comma.txt.snap
+++ b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@citation__citation_redundant_comma.txt.snap
@@ -1,7 +1,7 @@
---
-source: src/parser/latex.rs
+source: crates/parser/src/latex.rs
expression: root
-input_file: src/parser/test_data/latex/citation/citation_redundant_comma.txt
+input_file: crates/parser/src/test_data/latex/citation/citation_redundant_comma.txt
---
ROOT@0..12
PREAMBLE@0..12
diff --git a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@citation__citation_simple.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@citation__citation_simple.txt.snap
index 3e2bb4cdf8..99cc891d2b 100644
--- a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@citation__citation_simple.txt.snap
+++ b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@citation__citation_simple.txt.snap
@@ -1,7 +1,7 @@
---
-source: src/parser/latex.rs
+source: crates/parser/src/latex.rs
expression: root
-input_file: src/parser/test_data/latex/citation/citation_simple.txt
+input_file: crates/parser/src/test_data/latex/citation/citation_simple.txt
---
ROOT@0..10
PREAMBLE@0..10
diff --git a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@citation__citation_star.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@citation__citation_star.txt.snap
index 7ab875d747..4b66a7e7d9 100644
--- a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@citation__citation_star.txt.snap
+++ b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@citation__citation_star.txt.snap
@@ -1,7 +1,7 @@
---
-source: src/parser/latex.rs
+source: crates/parser/src/latex.rs
expression: root
-input_file: src/parser/test_data/latex/citation/citation_star.txt
+input_file: crates/parser/src/test_data/latex/citation/citation_star.txt
---
ROOT@0..10
PREAMBLE@0..10
diff --git a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@color__color_definition_simple.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@color__color_definition_simple.txt.snap
index 92ec32991d..d38951b148 100644
--- a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@color__color_definition_simple.txt.snap
+++ b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@color__color_definition_simple.txt.snap
@@ -1,7 +1,7 @@
---
-source: src/parser/latex.rs
+source: crates/parser/src/latex.rs
expression: root
-input_file: src/parser/test_data/latex/color/color_definition_simple.txt
+input_file: crates/parser/src/test_data/latex/color/color_definition_simple.txt
---
ROOT@0..33
PREAMBLE@0..33
diff --git a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@color__color_reference_simple.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@color__color_reference_simple.txt.snap
index 0033103085..dbf153dc18 100644
--- a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@color__color_reference_simple.txt.snap
+++ b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@color__color_reference_simple.txt.snap
@@ -1,7 +1,7 @@
---
-source: src/parser/latex.rs
+source: crates/parser/src/latex.rs
expression: root
-input_file: src/parser/test_data/latex/color/color_reference_simple.txt
+input_file: crates/parser/src/test_data/latex/color/color_reference_simple.txt
---
ROOT@0..13
PREAMBLE@0..13
diff --git a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@color__color_set_definition_error1.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@color__color_set_definition_error1.txt.snap
index 017f8aef82..9e3317ac05 100644
--- a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@color__color_set_definition_error1.txt.snap
+++ b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@color__color_set_definition_error1.txt.snap
@@ -1,7 +1,7 @@
---
-source: src/parser/latex.rs
+source: crates/parser/src/latex.rs
expression: root
-input_file: src/parser/test_data/latex/color/color_set_definition_error1.txt
+input_file: crates/parser/src/test_data/latex/color/color_set_definition_error1.txt
---
ROOT@0..39
PREAMBLE@0..39
diff --git a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@color__color_set_definition_error2.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@color__color_set_definition_error2.txt.snap
index 984dfcbabb..04b75973e5 100644
--- a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@color__color_set_definition_error2.txt.snap
+++ b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@color__color_set_definition_error2.txt.snap
@@ -1,7 +1,7 @@
---
-source: src/parser/latex.rs
+source: crates/parser/src/latex.rs
expression: root
-input_file: src/parser/test_data/latex/color/color_set_definition_error2.txt
+input_file: crates/parser/src/test_data/latex/color/color_set_definition_error2.txt
---
ROOT@0..30
PREAMBLE@0..30
diff --git a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@color__color_set_definition_error3.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@color__color_set_definition_error3.txt.snap
index 67fc1ed0bb..1133778fbf 100644
--- a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@color__color_set_definition_error3.txt.snap
+++ b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@color__color_set_definition_error3.txt.snap
@@ -1,7 +1,7 @@
---
-source: src/parser/latex.rs
+source: crates/parser/src/latex.rs
expression: root
-input_file: src/parser/test_data/latex/color/color_set_definition_error3.txt
+input_file: crates/parser/src/test_data/latex/color/color_set_definition_error3.txt
---
ROOT@0..25
PREAMBLE@0..25
diff --git a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@color__color_set_definition_error4.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@color__color_set_definition_error4.txt.snap
index e939ab2230..11d175d732 100644
--- a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@color__color_set_definition_error4.txt.snap
+++ b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@color__color_set_definition_error4.txt.snap
@@ -1,7 +1,7 @@
---
-source: src/parser/latex.rs
+source: crates/parser/src/latex.rs
expression: root
-input_file: src/parser/test_data/latex/color/color_set_definition_error4.txt
+input_file: crates/parser/src/test_data/latex/color/color_set_definition_error4.txt
---
ROOT@0..15
PREAMBLE@0..15
diff --git a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@color__color_set_definition_simple.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@color__color_set_definition_simple.txt.snap
index b699543115..903a780989 100644
--- a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@color__color_set_definition_simple.txt.snap
+++ b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@color__color_set_definition_simple.txt.snap
@@ -1,7 +1,7 @@
---
-source: src/parser/latex.rs
+source: crates/parser/src/latex.rs
expression: root
-input_file: src/parser/test_data/latex/color/color_set_definition_simple.txt
+input_file: crates/parser/src/test_data/latex/color/color_set_definition_simple.txt
---
ROOT@0..44
PREAMBLE@0..44
diff --git a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@command_definition__command_definition_no_argc.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@command_definition__command_definition_no_argc.txt.snap
index fac8dcb1e0..c4d51b8248 100644
--- a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@command_definition__command_definition_no_argc.txt.snap
+++ b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@command_definition__command_definition_no_argc.txt.snap
@@ -1,7 +1,7 @@
---
-source: src/parser/latex.rs
+source: crates/parser/src/latex.rs
expression: root
-input_file: src/parser/test_data/latex/command_definition/command_definition_no_argc.txt
+input_file: crates/parser/src/test_data/latex/command_definition/command_definition_no_argc.txt
---
ROOT@0..22
PREAMBLE@0..22
diff --git a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@command_definition__command_definition_no_impl.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@command_definition__command_definition_no_impl.txt.snap
index 0096ebbe60..4170bbb233 100644
--- a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@command_definition__command_definition_no_impl.txt.snap
+++ b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@command_definition__command_definition_no_impl.txt.snap
@@ -1,7 +1,7 @@
---
-source: src/parser/latex.rs
+source: crates/parser/src/latex.rs
expression: root
-input_file: src/parser/test_data/latex/command_definition/command_definition_no_impl.txt
+input_file: crates/parser/src/test_data/latex/command_definition/command_definition_no_impl.txt
---
ROOT@0..17
PREAMBLE@0..17
diff --git a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@command_definition__command_definition_no_impl_error.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@command_definition__command_definition_no_impl_error.txt.snap
index 018824e5e2..8a3bd36895 100644
--- a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@command_definition__command_definition_no_impl_error.txt.snap
+++ b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@command_definition__command_definition_no_impl_error.txt.snap
@@ -1,7 +1,7 @@
---
-source: src/parser/latex.rs
+source: crates/parser/src/latex.rs
expression: root
-input_file: src/parser/test_data/latex/command_definition/command_definition_no_impl_error.txt
+input_file: crates/parser/src/test_data/latex/command_definition/command_definition_no_impl_error.txt
---
ROOT@0..16
PREAMBLE@0..16
diff --git a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@command_definition__command_definition_optional.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@command_definition__command_definition_optional.txt.snap
index 3435088461..ff11be61d4 100644
--- a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@command_definition__command_definition_optional.txt.snap
+++ b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@command_definition__command_definition_optional.txt.snap
@@ -1,7 +1,7 @@
---
-source: src/parser/latex.rs
+source: crates/parser/src/latex.rs
expression: root
-input_file: src/parser/test_data/latex/command_definition/command_definition_optional.txt
+input_file: crates/parser/src/test_data/latex/command_definition/command_definition_optional.txt
---
ROOT@0..29
PREAMBLE@0..29
diff --git a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@command_definition__command_definition_simple.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@command_definition__command_definition_simple.txt.snap
index 806a0e2081..1d5fb28686 100644
--- a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@command_definition__command_definition_simple.txt.snap
+++ b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@command_definition__command_definition_simple.txt.snap
@@ -1,7 +1,7 @@
---
-source: src/parser/latex.rs
+source: crates/parser/src/latex.rs
expression: root
-input_file: src/parser/test_data/latex/command_definition/command_definition_simple.txt
+input_file: crates/parser/src/test_data/latex/command_definition/command_definition_simple.txt
---
ROOT@0..23
PREAMBLE@0..23
diff --git a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@command_definition__command_definition_with_begin.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@command_definition__command_definition_with_begin.txt.snap
index 2dfccb38dd..3e58111e6b 100644
--- a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@command_definition__command_definition_with_begin.txt.snap
+++ b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@command_definition__command_definition_with_begin.txt.snap
@@ -1,7 +1,7 @@
---
-source: src/parser/latex.rs
+source: crates/parser/src/latex.rs
expression: root
-input_file: src/parser/test_data/latex/command_definition/command_definition_with_begin.txt
+input_file: crates/parser/src/test_data/latex/command_definition/command_definition_with_begin.txt
---
ROOT@0..80
PREAMBLE@0..80
diff --git a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@command_definition__math_operator_no_impl.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@command_definition__math_operator_no_impl.txt.snap
index 4cdcd846b6..ea401584af 100644
--- a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@command_definition__math_operator_no_impl.txt.snap
+++ b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@command_definition__math_operator_no_impl.txt.snap
@@ -1,7 +1,7 @@
---
-source: src/parser/latex.rs
+source: crates/parser/src/latex.rs
expression: root
-input_file: src/parser/test_data/latex/command_definition/math_operator_no_impl.txt
+input_file: crates/parser/src/test_data/latex/command_definition/math_operator_no_impl.txt
---
ROOT@0..26
PREAMBLE@0..26
diff --git a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@command_definition__math_operator_simple.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@command_definition__math_operator_simple.txt.snap
index fe6beef40f..2833943059 100644
--- a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@command_definition__math_operator_simple.txt.snap
+++ b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@command_definition__math_operator_simple.txt.snap
@@ -1,7 +1,7 @@
---
-source: src/parser/latex.rs
+source: crates/parser/src/latex.rs
expression: root
-input_file: src/parser/test_data/latex/command_definition/math_operator_simple.txt
+input_file: crates/parser/src/test_data/latex/command_definition/math_operator_simple.txt
---
ROOT@0..31
PREAMBLE@0..31
diff --git a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@environment__environment_asymptote.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@environment__environment_asymptote.txt.snap
index a16c3a2563..48f11f6285 100644
--- a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@environment__environment_asymptote.txt.snap
+++ b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@environment__environment_asymptote.txt.snap
@@ -1,7 +1,7 @@
---
-source: src/parser/latex.rs
+source: crates/parser/src/latex.rs
expression: root
-input_file: src/parser/test_data/latex/environment/environment_asymptote.txt
+input_file: crates/parser/src/test_data/latex/environment/environment_asymptote.txt
---
ROOT@0..50
PREAMBLE@0..50
diff --git a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@environment__environment_definition.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@environment__environment_definition.txt.snap
index 4a99a3b175..2403d60ef1 100644
--- a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@environment__environment_definition.txt.snap
+++ b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@environment__environment_definition.txt.snap
@@ -1,7 +1,7 @@
---
-source: src/parser/latex.rs
+source: crates/parser/src/latex.rs
expression: root
-input_file: src/parser/test_data/latex/environment/environment_definition.txt
+input_file: crates/parser/src/test_data/latex/environment/environment_definition.txt
---
ROOT@0..47
PREAMBLE@0..47
diff --git a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@environment__environment_definition_optional_arg.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@environment__environment_definition_optional_arg.txt.snap
index c9304ff387..ae0fbd931a 100644
--- a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@environment__environment_definition_optional_arg.txt.snap
+++ b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@environment__environment_definition_optional_arg.txt.snap
@@ -1,7 +1,7 @@
---
-source: src/parser/latex.rs
+source: crates/parser/src/latex.rs
expression: root
-input_file: src/parser/test_data/latex/environment/environment_definition_optional_arg.txt
+input_file: crates/parser/src/test_data/latex/environment/environment_definition_optional_arg.txt
---
ROOT@0..44
PREAMBLE@0..44
diff --git a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@environment__environment_nested.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@environment__environment_nested.txt.snap
index 35b8155fd8..b4e1d6a458 100644
--- a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@environment__environment_nested.txt.snap
+++ b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@environment__environment_nested.txt.snap
@@ -1,7 +1,7 @@
---
-source: src/parser/latex.rs
+source: crates/parser/src/latex.rs
expression: root
-input_file: src/parser/test_data/latex/environment/environment_nested.txt
+input_file: crates/parser/src/test_data/latex/environment/environment_nested.txt
---
ROOT@0..43
PREAMBLE@0..43
diff --git a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@environment__environment_nested_missing_braces.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@environment__environment_nested_missing_braces.txt.snap
index 88f9d3b3fd..5d67bfe665 100644
--- a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@environment__environment_nested_missing_braces.txt.snap
+++ b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@environment__environment_nested_missing_braces.txt.snap
@@ -1,7 +1,7 @@
---
-source: src/parser/latex.rs
+source: crates/parser/src/latex.rs
expression: root
-input_file: src/parser/test_data/latex/environment/environment_nested_missing_braces.txt
+input_file: crates/parser/src/test_data/latex/environment/environment_nested_missing_braces.txt
---
ROOT@0..52
PREAMBLE@0..52
diff --git a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@environment__environment_simple.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@environment__environment_simple.txt.snap
index 996237cd42..f74b68fdf7 100644
--- a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@environment__environment_simple.txt.snap
+++ b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@environment__environment_simple.txt.snap
@@ -1,7 +1,7 @@
---
-source: src/parser/latex.rs
+source: crates/parser/src/latex.rs
expression: root
-input_file: src/parser/test_data/latex/environment/environment_simple.txt
+input_file: crates/parser/src/test_data/latex/environment/environment_simple.txt
---
ROOT@0..33
PREAMBLE@0..33
diff --git a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@equation.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@equation.txt.snap
index 55b92d4afb..71fff49984 100644
--- a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@equation.txt.snap
+++ b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@equation.txt.snap
@@ -1,7 +1,7 @@
---
-source: src/parser/latex.rs
+source: crates/parser/src/latex.rs
expression: root
-input_file: src/parser/test_data/latex/equation.txt
+input_file: crates/parser/src/test_data/latex/equation.txt
---
ROOT@0..13
PREAMBLE@0..13
diff --git a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@equation_missing_begin.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@equation_missing_begin.txt.snap
index 57e520cf38..1590fbed73 100644
--- a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@equation_missing_begin.txt.snap
+++ b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@equation_missing_begin.txt.snap
@@ -1,7 +1,7 @@
---
-source: src/parser/latex.rs
+source: crates/parser/src/latex.rs
expression: root
-input_file: src/parser/test_data/latex/equation_missing_begin.txt
+input_file: crates/parser/src/test_data/latex/equation_missing_begin.txt
---
ROOT@0..28
PREAMBLE@0..28
diff --git a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@generic_command_args.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@generic_command_args.txt.snap
index 0db73ad9aa..9057d8f024 100644
--- a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@generic_command_args.txt.snap
+++ b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@generic_command_args.txt.snap
@@ -1,7 +1,7 @@
---
-source: src/parser/latex.rs
+source: crates/parser/src/latex.rs
expression: root
-input_file: src/parser/test_data/latex/generic_command_args.txt
+input_file: crates/parser/src/test_data/latex/generic_command_args.txt
---
ROOT@0..14
PREAMBLE@0..14
diff --git a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@generic_command_empty.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@generic_command_empty.txt.snap
index 1886dedea7..ee8f593395 100644
--- a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@generic_command_empty.txt.snap
+++ b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@generic_command_empty.txt.snap
@@ -1,7 +1,7 @@
---
-source: src/parser/latex.rs
+source: crates/parser/src/latex.rs
expression: root
-input_file: src/parser/test_data/latex/generic_command_empty.txt
+input_file: crates/parser/src/test_data/latex/generic_command_empty.txt
---
ROOT@0..4
PREAMBLE@0..4
diff --git a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@generic_command_escape.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@generic_command_escape.txt.snap
new file mode 100644
index 0000000000..f973be4b12
--- /dev/null
+++ b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@generic_command_escape.txt.snap
@@ -0,0 +1,10 @@
+---
+source: crates/parser/src/latex.rs
+expression: root
+input_file: crates/parser/src/test_data/latex/generic_command_escape.txt
+---
+ROOT@0..2
+ PREAMBLE@0..2
+ GENERIC_COMMAND@0..2
+ COMMAND_NAME@0..2 "\\#"
+
diff --git a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@glossary__acronym_declaration.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@glossary__acronym_declaration.txt.snap
index 279817a877..fb24afbf24 100644
--- a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@glossary__acronym_declaration.txt.snap
+++ b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@glossary__acronym_declaration.txt.snap
@@ -1,7 +1,7 @@
---
-source: src/parser/latex.rs
+source: crates/parser/src/latex.rs
expression: root
-input_file: src/parser/test_data/latex/glossary/acronym_declaration.txt
+input_file: crates/parser/src/test_data/latex/glossary/acronym_declaration.txt
---
ROOT@0..64
PREAMBLE@0..64
diff --git a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@glossary__acronym_definition_options.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@glossary__acronym_definition_options.txt.snap
index 90388ec5ee..8dd76abbf3 100644
--- a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@glossary__acronym_definition_options.txt.snap
+++ b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@glossary__acronym_definition_options.txt.snap
@@ -1,7 +1,7 @@
---
-source: src/parser/latex.rs
+source: crates/parser/src/latex.rs
expression: root
-input_file: src/parser/test_data/latex/glossary/acronym_definition_options.txt
+input_file: crates/parser/src/test_data/latex/glossary/acronym_definition_options.txt
---
ROOT@0..76
PREAMBLE@0..76
diff --git a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@glossary__acronym_definition_simple.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@glossary__acronym_definition_simple.txt.snap
index eadfed4596..cf630440f8 100644
--- a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@glossary__acronym_definition_simple.txt.snap
+++ b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@glossary__acronym_definition_simple.txt.snap
@@ -1,7 +1,7 @@
---
-source: src/parser/latex.rs
+source: crates/parser/src/latex.rs
expression: root
-input_file: src/parser/test_data/latex/glossary/acronym_definition_simple.txt
+input_file: crates/parser/src/test_data/latex/glossary/acronym_definition_simple.txt
---
ROOT@0..44
PREAMBLE@0..44
diff --git a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@glossary__acronym_package.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@glossary__acronym_package.txt.snap
index 25c03edbad..721dfa5bf9 100644
--- a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@glossary__acronym_package.txt.snap
+++ b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@glossary__acronym_package.txt.snap
@@ -1,7 +1,7 @@
---
-source: src/parser/latex.rs
+source: crates/parser/src/latex.rs
expression: root
-input_file: src/parser/test_data/latex/glossary/acronym_package.txt
+input_file: crates/parser/src/test_data/latex/glossary/acronym_package.txt
---
ROOT@0..35
PREAMBLE@0..35
diff --git a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@glossary__acronym_reference_options.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@glossary__acronym_reference_options.txt.snap
index 1edbf986f8..6e470c3add 100644
--- a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@glossary__acronym_reference_options.txt.snap
+++ b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@glossary__acronym_reference_options.txt.snap
@@ -1,7 +1,7 @@
---
-source: src/parser/latex.rs
+source: crates/parser/src/latex.rs
expression: root
-input_file: src/parser/test_data/latex/glossary/acronym_reference_options.txt
+input_file: crates/parser/src/test_data/latex/glossary/acronym_reference_options.txt
---
ROOT@0..32
PREAMBLE@0..32
diff --git a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@glossary__acronym_reference_simple.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@glossary__acronym_reference_simple.txt.snap
index 38e68a3a33..5b83135522 100644
--- a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@glossary__acronym_reference_simple.txt.snap
+++ b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@glossary__acronym_reference_simple.txt.snap
@@ -1,7 +1,7 @@
---
-source: src/parser/latex.rs
+source: crates/parser/src/latex.rs
expression: root
-input_file: src/parser/test_data/latex/glossary/acronym_reference_simple.txt
+input_file: crates/parser/src/test_data/latex/glossary/acronym_reference_simple.txt
---
ROOT@0..19
PREAMBLE@0..19
diff --git a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@glossary__glossary_entry_definition_simple.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@glossary__glossary_entry_definition_simple.txt.snap
index 901d0bf8c2..52037c6bbf 100644
--- a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@glossary__glossary_entry_definition_simple.txt.snap
+++ b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@glossary__glossary_entry_definition_simple.txt.snap
@@ -1,7 +1,7 @@
---
-source: src/parser/latex.rs
+source: crates/parser/src/latex.rs
expression: root
-input_file: src/parser/test_data/latex/glossary/glossary_entry_definition_simple.txt
+input_file: crates/parser/src/test_data/latex/glossary/glossary_entry_definition_simple.txt
---
ROOT@0..39
PREAMBLE@0..39
diff --git a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@glossary__glossary_entry_reference_options.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@glossary__glossary_entry_reference_options.txt.snap
index 263f4a7146..07d1d8cdfa 100644
--- a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@glossary__glossary_entry_reference_options.txt.snap
+++ b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@glossary__glossary_entry_reference_options.txt.snap
@@ -1,7 +1,7 @@
---
-source: src/parser/latex.rs
+source: crates/parser/src/latex.rs
expression: root
-input_file: src/parser/test_data/latex/glossary/glossary_entry_reference_options.txt
+input_file: crates/parser/src/test_data/latex/glossary/glossary_entry_reference_options.txt
---
ROOT@0..25
PREAMBLE@0..25
diff --git a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@glossary__glossary_entry_reference_simple.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@glossary__glossary_entry_reference_simple.txt.snap
index 72713fee9a..db50fc3298 100644
--- a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@glossary__glossary_entry_reference_simple.txt.snap
+++ b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@glossary__glossary_entry_reference_simple.txt.snap
@@ -1,7 +1,7 @@
---
-source: src/parser/latex.rs
+source: crates/parser/src/latex.rs
expression: root
-input_file: src/parser/test_data/latex/glossary/glossary_entry_reference_simple.txt
+input_file: crates/parser/src/test_data/latex/glossary/glossary_entry_reference_simple.txt
---
ROOT@0..9
PREAMBLE@0..9
diff --git a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@graphics_path.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@graphics_path.txt.snap
index 392c6f3b6e..80bf58d783 100644
--- a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@graphics_path.txt.snap
+++ b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@graphics_path.txt.snap
@@ -1,7 +1,7 @@
---
-source: src/parser/latex.rs
+source: crates/parser/src/latex.rs
expression: root
-input_file: src/parser/test_data/latex/graphics_path.txt
+input_file: crates/parser/src/test_data/latex/graphics_path.txt
---
ROOT@0..28
PREAMBLE@0..28
diff --git a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@graphics_path_command.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@graphics_path_command.txt.snap
index 34d958314d..c8521d2de7 100644
--- a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@graphics_path_command.txt.snap
+++ b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@graphics_path_command.txt.snap
@@ -1,7 +1,7 @@
---
-source: src/parser/latex.rs
+source: crates/parser/src/latex.rs
expression: root
-input_file: src/parser/test_data/latex/graphics_path_command.txt
+input_file: crates/parser/src/test_data/latex/graphics_path_command.txt
---
ROOT@0..32
PREAMBLE@0..32
diff --git a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@graphics_path_options.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@graphics_path_options.txt.snap
index 88b92c1a3b..4ca53d2fe2 100644
--- a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@graphics_path_options.txt.snap
+++ b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@graphics_path_options.txt.snap
@@ -1,7 +1,7 @@
---
-source: src/parser/latex.rs
+source: crates/parser/src/latex.rs
expression: root
-input_file: src/parser/test_data/latex/graphics_path_options.txt
+input_file: crates/parser/src/test_data/latex/graphics_path_options.txt
---
ROOT@0..33
PREAMBLE@0..33
diff --git a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@group__curly_group_missing_end.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@group__curly_group_missing_end.txt.snap
index bc3e6e68ef..902cacfdd5 100644
--- a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@group__curly_group_missing_end.txt.snap
+++ b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@group__curly_group_missing_end.txt.snap
@@ -1,7 +1,7 @@
---
-source: src/parser/latex.rs
+source: crates/parser/src/latex.rs
expression: root
-input_file: src/parser/test_data/latex/group/curly_group_missing_end.txt
+input_file: crates/parser/src/test_data/latex/group/curly_group_missing_end.txt
---
ROOT@0..12
PREAMBLE@0..12
diff --git a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@group__curly_group_simple.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@group__curly_group_simple.txt.snap
index 156ec2e0a2..4f1b8473be 100644
--- a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@group__curly_group_simple.txt.snap
+++ b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@group__curly_group_simple.txt.snap
@@ -1,7 +1,7 @@
---
-source: src/parser/latex.rs
+source: crates/parser/src/latex.rs
expression: root
-input_file: src/parser/test_data/latex/group/curly_group_simple.txt
+input_file: crates/parser/src/test_data/latex/group/curly_group_simple.txt
---
ROOT@0..13
PREAMBLE@0..13
diff --git a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@group__equation_missing_end.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@group__equation_missing_end.txt.snap
index fad46a2c97..dfddb20f85 100644
--- a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@group__equation_missing_end.txt.snap
+++ b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@group__equation_missing_end.txt.snap
@@ -1,7 +1,7 @@
---
-source: src/parser/latex.rs
+source: crates/parser/src/latex.rs
expression: root
-input_file: src/parser/test_data/latex/group/equation_missing_end.txt
+input_file: crates/parser/src/test_data/latex/group/equation_missing_end.txt
---
ROOT@0..28
PREAMBLE@0..28
diff --git a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@group__escaped_brackets.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@group__escaped_brackets.txt.snap
index 9046238457..d9e1636cf8 100644
--- a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@group__escaped_brackets.txt.snap
+++ b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@group__escaped_brackets.txt.snap
@@ -1,7 +1,7 @@
---
-source: src/parser/latex.rs
+source: crates/parser/src/latex.rs
expression: root
-input_file: src/parser/test_data/latex/group/escaped_brackets.txt
+input_file: crates/parser/src/test_data/latex/group/escaped_brackets.txt
---
ROOT@0..6
PREAMBLE@0..6
diff --git a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@group__unmatched_braces.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@group__unmatched_braces.txt.snap
index cb181c7fdb..922776c8c5 100644
--- a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@group__unmatched_braces.txt.snap
+++ b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@group__unmatched_braces.txt.snap
@@ -1,7 +1,7 @@
---
-source: src/parser/latex.rs
+source: crates/parser/src/latex.rs
expression: root
-input_file: src/parser/test_data/latex/group/unmatched_braces.txt
+input_file: crates/parser/src/test_data/latex/group/unmatched_braces.txt
---
ROOT@0..2
PREAMBLE@0..2
diff --git a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@group__unmatched_brackets.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@group__unmatched_brackets.txt.snap
index 8e8accd9fc..12e455b505 100644
--- a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@group__unmatched_brackets.txt.snap
+++ b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@group__unmatched_brackets.txt.snap
@@ -1,7 +1,7 @@
---
-source: src/parser/latex.rs
+source: crates/parser/src/latex.rs
expression: root
-input_file: src/parser/test_data/latex/group/unmatched_brackets.txt
+input_file: crates/parser/src/test_data/latex/group/unmatched_brackets.txt
---
ROOT@0..2
PREAMBLE@0..2
diff --git a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@group__unmatched_brackets_with_group.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@group__unmatched_brackets_with_group.txt.snap
index 82c14ec404..765c7e4a8d 100644
--- a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@group__unmatched_brackets_with_group.txt.snap
+++ b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@group__unmatched_brackets_with_group.txt.snap
@@ -1,7 +1,7 @@
---
-source: src/parser/latex.rs
+source: crates/parser/src/latex.rs
expression: root
-input_file: src/parser/test_data/latex/group/unmatched_brackets_with_group.txt
+input_file: crates/parser/src/test_data/latex/group/unmatched_brackets_with_group.txt
---
ROOT@0..4
PREAMBLE@0..4
diff --git a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@hello_world.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@hello_world.txt.snap
index 7c1ff02b81..27bca69893 100644
--- a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@hello_world.txt.snap
+++ b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@hello_world.txt.snap
@@ -1,7 +1,7 @@
---
-source: src/parser/latex.rs
+source: crates/parser/src/latex.rs
expression: root
-input_file: src/parser/test_data/latex/hello_world.txt
+input_file: crates/parser/src/test_data/latex/hello_world.txt
---
ROOT@0..12
PREAMBLE@0..12
diff --git a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__biblatex_include_options.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__biblatex_include_options.txt.snap
index 9e0c086956..e3e34a68f6 100644
--- a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__biblatex_include_options.txt.snap
+++ b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__biblatex_include_options.txt.snap
@@ -1,7 +1,7 @@
---
-source: src/parser/latex.rs
+source: crates/parser/src/latex.rs
expression: root
-input_file: src/parser/test_data/latex/include/biblatex_include_options.txt
+input_file: crates/parser/src/test_data/latex/include/biblatex_include_options.txt
---
ROOT@0..42
PREAMBLE@0..42
diff --git a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__biblatex_include_simple.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__biblatex_include_simple.txt.snap
index 80c0afdc78..b4b4193dba 100644
--- a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__biblatex_include_simple.txt.snap
+++ b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__biblatex_include_simple.txt.snap
@@ -1,7 +1,7 @@
---
-source: src/parser/latex.rs
+source: crates/parser/src/latex.rs
expression: root
-input_file: src/parser/test_data/latex/include/biblatex_include_simple.txt
+input_file: crates/parser/src/test_data/latex/include/biblatex_include_simple.txt
---
ROOT@0..28
PREAMBLE@0..28
diff --git a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__bibtex_include_simple.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__bibtex_include_simple.txt.snap
index 0273ad8d6b..c39c9e2c68 100644
--- a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__bibtex_include_simple.txt.snap
+++ b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__bibtex_include_simple.txt.snap
@@ -1,7 +1,7 @@
---
-source: src/parser/latex.rs
+source: crates/parser/src/latex.rs
expression: root
-input_file: src/parser/test_data/latex/include/bibtex_include_simple.txt
+input_file: crates/parser/src/test_data/latex/include/bibtex_include_simple.txt
---
ROOT@0..22
PREAMBLE@0..22
diff --git a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__class_include_empty.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__class_include_empty.txt.snap
index 68b9f3c94e..a8d5a7077f 100644
--- a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__class_include_empty.txt.snap
+++ b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__class_include_empty.txt.snap
@@ -1,7 +1,7 @@
---
-source: src/parser/latex.rs
+source: crates/parser/src/latex.rs
expression: root
-input_file: src/parser/test_data/latex/include/class_include_empty.txt
+input_file: crates/parser/src/test_data/latex/include/class_include_empty.txt
---
ROOT@0..16
PREAMBLE@0..16
diff --git a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__class_include_options.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__class_include_options.txt.snap
index e501b654c4..4cf4473cfa 100644
--- a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__class_include_options.txt.snap
+++ b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__class_include_options.txt.snap
@@ -1,7 +1,7 @@
---
-source: src/parser/latex.rs
+source: crates/parser/src/latex.rs
expression: root
-input_file: src/parser/test_data/latex/include/class_include_options.txt
+input_file: crates/parser/src/test_data/latex/include/class_include_options.txt
---
ROOT@0..44
PREAMBLE@0..44
diff --git a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__class_include_simple.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__class_include_simple.txt.snap
index 5b4f6114a6..a6be2ec496 100644
--- a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__class_include_simple.txt.snap
+++ b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__class_include_simple.txt.snap
@@ -1,7 +1,7 @@
---
-source: src/parser/latex.rs
+source: crates/parser/src/latex.rs
expression: root
-input_file: src/parser/test_data/latex/include/class_include_simple.txt
+input_file: crates/parser/src/test_data/latex/include/class_include_simple.txt
---
ROOT@0..23
PREAMBLE@0..23
diff --git a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__graphics_include_command.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__graphics_include_command.txt.snap
index ea3e96323d..6f9f736d1f 100644
--- a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__graphics_include_command.txt.snap
+++ b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__graphics_include_command.txt.snap
@@ -1,7 +1,7 @@
---
-source: src/parser/latex.rs
+source: crates/parser/src/latex.rs
expression: root
-input_file: src/parser/test_data/latex/include/graphics_include_command.txt
+input_file: crates/parser/src/test_data/latex/include/graphics_include_command.txt
---
ROOT@0..52
PREAMBLE@0..52
diff --git a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__graphics_include_complicated_options.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__graphics_include_complicated_options.txt.snap
index 3b60d765b8..4b422dcd64 100644
--- a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__graphics_include_complicated_options.txt.snap
+++ b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__graphics_include_complicated_options.txt.snap
@@ -1,7 +1,7 @@
---
-source: src/parser/latex.rs
+source: crates/parser/src/latex.rs
expression: root
-input_file: src/parser/test_data/latex/include/graphics_include_complicated_options.txt
+input_file: crates/parser/src/test_data/latex/include/graphics_include_complicated_options.txt
---
ROOT@0..39
PREAMBLE@0..39
diff --git a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__graphics_include_options.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__graphics_include_options.txt.snap
index b0817db126..656d68c1ef 100644
--- a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__graphics_include_options.txt.snap
+++ b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__graphics_include_options.txt.snap
@@ -1,7 +1,7 @@
---
-source: src/parser/latex.rs
+source: crates/parser/src/latex.rs
expression: root
-input_file: src/parser/test_data/latex/include/graphics_include_options.txt
+input_file: crates/parser/src/test_data/latex/include/graphics_include_options.txt
---
ROOT@0..39
PREAMBLE@0..39
diff --git a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__graphics_include_simple.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__graphics_include_simple.txt.snap
index ef53c6faa5..39cb634ec2 100644
--- a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__graphics_include_simple.txt.snap
+++ b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__graphics_include_simple.txt.snap
@@ -1,7 +1,7 @@
---
-source: src/parser/latex.rs
+source: crates/parser/src/latex.rs
expression: root
-input_file: src/parser/test_data/latex/include/graphics_include_simple.txt
+input_file: crates/parser/src/test_data/latex/include/graphics_include_simple.txt
---
ROOT@0..29
PREAMBLE@0..29
diff --git a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__import_incomplete.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__import_incomplete.txt.snap
index b4fc1b4244..645133e65c 100644
--- a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__import_incomplete.txt.snap
+++ b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__import_incomplete.txt.snap
@@ -1,7 +1,7 @@
---
-source: src/parser/latex.rs
+source: crates/parser/src/latex.rs
expression: root
-input_file: src/parser/test_data/latex/include/import_incomplete.txt
+input_file: crates/parser/src/test_data/latex/include/import_incomplete.txt
---
ROOT@0..11
PREAMBLE@0..11
diff --git a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__import_simple.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__import_simple.txt.snap
index d703c0b994..b383dc435e 100644
--- a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__import_simple.txt.snap
+++ b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__import_simple.txt.snap
@@ -1,7 +1,7 @@
---
-source: src/parser/latex.rs
+source: crates/parser/src/latex.rs
expression: root
-input_file: src/parser/test_data/latex/include/import_simple.txt
+input_file: crates/parser/src/test_data/latex/include/import_simple.txt
---
ROOT@0..17
PREAMBLE@0..17
diff --git a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__inkscape_include_options.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__inkscape_include_options.txt.snap
index 4594b959f3..2c2c176fdb 100644
--- a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__inkscape_include_options.txt.snap
+++ b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__inkscape_include_options.txt.snap
@@ -1,7 +1,7 @@
---
-source: src/parser/latex.rs
+source: crates/parser/src/latex.rs
expression: root
-input_file: src/parser/test_data/latex/include/inkscape_include_options.txt
+input_file: crates/parser/src/test_data/latex/include/inkscape_include_options.txt
---
ROOT@0..30
PREAMBLE@0..30
diff --git a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__inkscape_include_simple.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__inkscape_include_simple.txt.snap
index b74c855e53..62cb7486db 100644
--- a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__inkscape_include_simple.txt.snap
+++ b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__inkscape_include_simple.txt.snap
@@ -1,7 +1,7 @@
---
-source: src/parser/latex.rs
+source: crates/parser/src/latex.rs
expression: root
-input_file: src/parser/test_data/latex/include/inkscape_include_simple.txt
+input_file: crates/parser/src/test_data/latex/include/inkscape_include_simple.txt
---
ROOT@0..20
PREAMBLE@0..20
diff --git a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__latex_include_equality_sign.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__latex_include_equality_sign.txt.snap
index f49d0ccea6..2fff7b1e8f 100644
--- a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__latex_include_equality_sign.txt.snap
+++ b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__latex_include_equality_sign.txt.snap
@@ -1,7 +1,7 @@
---
-source: src/parser/latex.rs
+source: crates/parser/src/latex.rs
expression: root
-input_file: src/parser/test_data/latex/include/latex_include_equality_sign.txt
+input_file: crates/parser/src/test_data/latex/include/latex_include_equality_sign.txt
---
ROOT@0..17
PREAMBLE@0..17
diff --git a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__latex_include_simple.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__latex_include_simple.txt.snap
index 1b853f4686..4841296f02 100644
--- a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__latex_include_simple.txt.snap
+++ b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__latex_include_simple.txt.snap
@@ -1,7 +1,7 @@
---
-source: src/parser/latex.rs
+source: crates/parser/src/latex.rs
expression: root
-input_file: src/parser/test_data/latex/include/latex_include_simple.txt
+input_file: crates/parser/src/test_data/latex/include/latex_include_simple.txt
---
ROOT@0..17
PREAMBLE@0..17
diff --git a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__latex_input_path_brackets.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__latex_input_path_brackets.txt.snap
index dee2e19577..7f13f6b247 100644
--- a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__latex_input_path_brackets.txt.snap
+++ b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__latex_input_path_brackets.txt.snap
@@ -1,7 +1,7 @@
---
-source: src/parser/latex.rs
+source: crates/parser/src/latex.rs
expression: root
-input_file: src/parser/test_data/latex/include/latex_input_path_brackets.txt
+input_file: crates/parser/src/test_data/latex/include/latex_input_path_brackets.txt
---
ROOT@0..20
PREAMBLE@0..20
diff --git a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__package_include_empty.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__package_include_empty.txt.snap
index c8746b66e5..086f2b0c75 100644
--- a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__package_include_empty.txt.snap
+++ b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__package_include_empty.txt.snap
@@ -1,7 +1,7 @@
---
-source: src/parser/latex.rs
+source: crates/parser/src/latex.rs
expression: root
-input_file: src/parser/test_data/latex/include/package_include_empty.txt
+input_file: crates/parser/src/test_data/latex/include/package_include_empty.txt
---
ROOT@0..13
PREAMBLE@0..13
diff --git a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__package_include_multiple.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__package_include_multiple.txt.snap
index e6ca358d8b..d42a4a76fe 100644
--- a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__package_include_multiple.txt.snap
+++ b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__package_include_multiple.txt.snap
@@ -1,7 +1,7 @@
---
-source: src/parser/latex.rs
+source: crates/parser/src/latex.rs
expression: root
-input_file: src/parser/test_data/latex/include/package_include_multiple.txt
+input_file: crates/parser/src/test_data/latex/include/package_include_multiple.txt
---
ROOT@0..28
PREAMBLE@0..28
diff --git a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__package_include_options.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__package_include_options.txt.snap
index a65948daf8..8ecffa39d5 100644
--- a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__package_include_options.txt.snap
+++ b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__package_include_options.txt.snap
@@ -1,7 +1,7 @@
---
-source: src/parser/latex.rs
+source: crates/parser/src/latex.rs
expression: root
-input_file: src/parser/test_data/latex/include/package_include_options.txt
+input_file: crates/parser/src/test_data/latex/include/package_include_options.txt
---
ROOT@0..41
PREAMBLE@0..41
diff --git a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__package_include_simple.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__package_include_simple.txt.snap
index 5f91723920..99304a8108 100644
--- a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__package_include_simple.txt.snap
+++ b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__package_include_simple.txt.snap
@@ -1,7 +1,7 @@
---
-source: src/parser/latex.rs
+source: crates/parser/src/latex.rs
expression: root
-input_file: src/parser/test_data/latex/include/package_include_simple.txt
+input_file: crates/parser/src/test_data/latex/include/package_include_simple.txt
---
ROOT@0..20
PREAMBLE@0..20
diff --git a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__pgf_library_import_simple.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__pgf_library_import_simple.txt.snap
index f20083a1bc..c55ce16744 100644
--- a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__pgf_library_import_simple.txt.snap
+++ b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__pgf_library_import_simple.txt.snap
@@ -1,7 +1,7 @@
---
-source: src/parser/latex.rs
+source: crates/parser/src/latex.rs
expression: root
-input_file: src/parser/test_data/latex/include/pgf_library_import_simple.txt
+input_file: crates/parser/src/test_data/latex/include/pgf_library_import_simple.txt
---
ROOT@0..19
PREAMBLE@0..19
diff --git a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__svg_include_options.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__svg_include_options.txt.snap
index 412e18691f..7e67683606 100644
--- a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__svg_include_options.txt.snap
+++ b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__svg_include_options.txt.snap
@@ -1,7 +1,7 @@
---
-source: src/parser/latex.rs
+source: crates/parser/src/latex.rs
expression: root
-input_file: src/parser/test_data/latex/include/svg_include_options.txt
+input_file: crates/parser/src/test_data/latex/include/svg_include_options.txt
---
ROOT@0..34
PREAMBLE@0..34
diff --git a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__svg_include_simple.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__svg_include_simple.txt.snap
index da3a9b4a6d..f776f9c2bc 100644
--- a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__svg_include_simple.txt.snap
+++ b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__svg_include_simple.txt.snap
@@ -1,7 +1,7 @@
---
-source: src/parser/latex.rs
+source: crates/parser/src/latex.rs
expression: root
-input_file: src/parser/test_data/latex/include/svg_include_simple.txt
+input_file: crates/parser/src/test_data/latex/include/svg_include_simple.txt
---
ROOT@0..24
PREAMBLE@0..24
diff --git a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__tikz_library_import_simple.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__tikz_library_import_simple.txt.snap
index e44115196a..fff99d5ad1 100644
--- a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__tikz_library_import_simple.txt.snap
+++ b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__tikz_library_import_simple.txt.snap
@@ -1,7 +1,7 @@
---
-source: src/parser/latex.rs
+source: crates/parser/src/latex.rs
expression: root
-input_file: src/parser/test_data/latex/include/tikz_library_import_simple.txt
+input_file: crates/parser/src/test_data/latex/include/tikz_library_import_simple.txt
---
ROOT@0..20
PREAMBLE@0..20
diff --git a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__verbatim_include_simple.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__verbatim_include_simple.txt.snap
index ffdc042047..28eda149c4 100644
--- a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__verbatim_include_simple.txt.snap
+++ b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__verbatim_include_simple.txt.snap
@@ -1,7 +1,7 @@
---
-source: src/parser/latex.rs
+source: crates/parser/src/latex.rs
expression: root
-input_file: src/parser/test_data/latex/include/verbatim_include_simple.txt
+input_file: crates/parser/src/test_data/latex/include/verbatim_include_simple.txt
---
ROOT@0..27
PREAMBLE@0..27
diff --git a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@inline.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@inline.txt.snap
index fa5e02f35d..b5696044a5 100644
--- a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@inline.txt.snap
+++ b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@inline.txt.snap
@@ -1,7 +1,7 @@
---
-source: src/parser/latex.rs
+source: crates/parser/src/latex.rs
expression: root
-input_file: src/parser/test_data/latex/inline.txt
+input_file: crates/parser/src/test_data/latex/inline.txt
---
ROOT@0..19
PREAMBLE@0..19
diff --git a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@inline_double_dollar.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@inline_double_dollar.txt.snap
index 692cd065a1..6d614db919 100644
--- a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@inline_double_dollar.txt.snap
+++ b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@inline_double_dollar.txt.snap
@@ -1,7 +1,7 @@
---
-source: src/parser/latex.rs
+source: crates/parser/src/latex.rs
expression: root
-input_file: src/parser/test_data/latex/inline_double_dollar.txt
+input_file: crates/parser/src/test_data/latex/inline_double_dollar.txt
---
ROOT@0..21
PREAMBLE@0..21
diff --git a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@issue_745.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@issue_745.txt.snap
index 1d9f6db48b..4165481528 100644
--- a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@issue_745.txt.snap
+++ b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@issue_745.txt.snap
@@ -1,7 +1,7 @@
---
-source: src/parser/latex.rs
+source: crates/parser/src/latex.rs
expression: root
-input_file: src/parser/test_data/latex/issue_745.txt
+input_file: crates/parser/src/test_data/latex/issue_745.txt
---
ROOT@0..271
PREAMBLE@0..271
diff --git a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@issue_789.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@issue_789.txt.snap
index 4756b13c49..9899e3c9ab 100644
--- a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@issue_789.txt.snap
+++ b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@issue_789.txt.snap
@@ -1,7 +1,7 @@
---
-source: src/parser/latex.rs
+source: crates/parser/src/latex.rs
expression: root
-input_file: src/parser/test_data/latex/issue_789.txt
+input_file: crates/parser/src/test_data/latex/issue_789.txt
---
ROOT@0..19
PREAMBLE@0..19
diff --git a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@issue_853.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@issue_853.txt.snap
index 0069449097..dc8c3a3d2b 100644
--- a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@issue_853.txt.snap
+++ b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@issue_853.txt.snap
@@ -1,7 +1,7 @@
---
-source: src/parser/latex.rs
+source: crates/parser/src/latex.rs
expression: root
-input_file: src/parser/test_data/latex/issue_853.txt
+input_file: crates/parser/src/test_data/latex/issue_853.txt
---
ROOT@0..135
PREAMBLE@0..135
diff --git a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@issue_857.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@issue_857.txt.snap
index 4ed4c71e59..b0edef17a8 100644
--- a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@issue_857.txt.snap
+++ b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@issue_857.txt.snap
@@ -1,7 +1,7 @@
---
-source: src/parser/latex.rs
+source: crates/parser/src/latex.rs
expression: root
-input_file: src/parser/test_data/latex/issue_857.txt
+input_file: crates/parser/src/test_data/latex/issue_857.txt
---
ROOT@0..55
PREAMBLE@0..55
diff --git a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@issue_874.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@issue_874.txt.snap
new file mode 100644
index 0000000000..8555f2bc48
--- /dev/null
+++ b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@issue_874.txt.snap
@@ -0,0 +1,28 @@
+---
+source: crates/parser/src/latex.rs
+expression: root
+input_file: crates/parser/src/test_data/latex/issue_874.txt
+---
+ROOT@0..37
+ PREAMBLE@0..37
+ GRAPHICS_INCLUDE@0..37
+ COMMAND_NAME@0..16 "\\includegraphics"
+ BRACK_GROUP_KEY_VALUE@16..27
+ L_BRACK@16..17 "["
+ KEY_VALUE_BODY@17..26
+ KEY_VALUE_PAIR@17..26
+ KEY@17..22
+ WORD@17..22 "scale"
+ EQUALITY_SIGN@22..23 "="
+ VALUE@23..26
+ TEXT@23..26
+ WORD@23..26 "0.2"
+ R_BRACK@26..27 "]"
+ CURLY_GROUP_WORD_LIST@27..37
+ L_CURLY@27..28 "{"
+ KEY@28..36
+ WORD@28..31 "7.4"
+ R_PAREN@31..32 ")"
+ WORD@32..36 ".jpg"
+ R_CURLY@36..37 "}"
+
diff --git a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@label__label_definition_line_break.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@label__label_definition_line_break.txt.snap
index 57c3a3bf3a..5eaed87fee 100644
--- a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@label__label_definition_line_break.txt.snap
+++ b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@label__label_definition_line_break.txt.snap
@@ -1,7 +1,7 @@
---
-source: src/parser/latex.rs
+source: crates/parser/src/latex.rs
expression: root
-input_file: src/parser/test_data/latex/label/label_definition_line_break.txt
+input_file: crates/parser/src/test_data/latex/label/label_definition_line_break.txt
---
ROOT@0..19
PREAMBLE@0..19
diff --git a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@label__label_definition_simple.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@label__label_definition_simple.txt.snap
index 49c17d26eb..cb693002b5 100644
--- a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@label__label_definition_simple.txt.snap
+++ b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@label__label_definition_simple.txt.snap
@@ -1,7 +1,7 @@
---
-source: src/parser/latex.rs
+source: crates/parser/src/latex.rs
expression: root
-input_file: src/parser/test_data/latex/label/label_definition_simple.txt
+input_file: crates/parser/src/test_data/latex/label/label_definition_simple.txt
---
ROOT@0..11
PREAMBLE@0..11
diff --git a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@label__label_number.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@label__label_number.txt.snap
index cc5824ea16..6e9613313a 100644
--- a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@label__label_number.txt.snap
+++ b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@label__label_number.txt.snap
@@ -1,7 +1,7 @@
---
-source: src/parser/latex.rs
+source: crates/parser/src/latex.rs
expression: root
-input_file: src/parser/test_data/latex/label/label_number.txt
+input_file: crates/parser/src/test_data/latex/label/label_number.txt
---
ROOT@0..21
PREAMBLE@0..21
diff --git a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@label__label_reference_equation.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@label__label_reference_equation.txt.snap
index c44c7a2c5c..b631f40b60 100644
--- a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@label__label_reference_equation.txt.snap
+++ b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@label__label_reference_equation.txt.snap
@@ -1,7 +1,7 @@
---
-source: src/parser/latex.rs
+source: crates/parser/src/latex.rs
expression: root
-input_file: src/parser/test_data/latex/label/label_reference_equation.txt
+input_file: crates/parser/src/test_data/latex/label/label_reference_equation.txt
---
ROOT@0..11
PREAMBLE@0..11
diff --git a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@label__label_reference_incomplete.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@label__label_reference_incomplete.txt.snap
index c654786a3e..054da6d258 100644
--- a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@label__label_reference_incomplete.txt.snap
+++ b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@label__label_reference_incomplete.txt.snap
@@ -1,7 +1,7 @@
---
-source: src/parser/latex.rs
+source: crates/parser/src/latex.rs
expression: root
-input_file: src/parser/test_data/latex/label/label_reference_incomplete.txt
+input_file: crates/parser/src/test_data/latex/label/label_reference_incomplete.txt
---
ROOT@0..47
PREAMBLE@0..47
diff --git a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@label__label_reference_multiple.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@label__label_reference_multiple.txt.snap
index 556a04766e..5a228e8972 100644
--- a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@label__label_reference_multiple.txt.snap
+++ b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@label__label_reference_multiple.txt.snap
@@ -1,7 +1,7 @@
---
-source: src/parser/latex.rs
+source: crates/parser/src/latex.rs
expression: root
-input_file: src/parser/test_data/latex/label/label_reference_multiple.txt
+input_file: crates/parser/src/test_data/latex/label/label_reference_multiple.txt
---
ROOT@0..14
PREAMBLE@0..14
diff --git a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@label__label_reference_range_error.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@label__label_reference_range_error.txt.snap
index ff82c6f558..a4b25eeb09 100644
--- a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@label__label_reference_range_error.txt.snap
+++ b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@label__label_reference_range_error.txt.snap
@@ -1,7 +1,7 @@
---
-source: src/parser/latex.rs
+source: crates/parser/src/latex.rs
expression: root
-input_file: src/parser/test_data/latex/label/label_reference_range_error.txt
+input_file: crates/parser/src/test_data/latex/label/label_reference_range_error.txt
---
ROOT@0..19
PREAMBLE@0..19
diff --git a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@label__label_reference_range_incomplete.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@label__label_reference_range_incomplete.txt.snap
index 5a8910b8d2..e18cd6ed97 100644
--- a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@label__label_reference_range_incomplete.txt.snap
+++ b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@label__label_reference_range_incomplete.txt.snap
@@ -1,7 +1,7 @@
---
-source: src/parser/latex.rs
+source: crates/parser/src/latex.rs
expression: root
-input_file: src/parser/test_data/latex/label/label_reference_range_incomplete.txt
+input_file: crates/parser/src/test_data/latex/label/label_reference_range_incomplete.txt
---
ROOT@0..15
PREAMBLE@0..15
diff --git a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@label__label_reference_range_simple.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@label__label_reference_range_simple.txt.snap
index a03632ff5b..335309607c 100644
--- a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@label__label_reference_range_simple.txt.snap
+++ b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@label__label_reference_range_simple.txt.snap
@@ -1,7 +1,7 @@
---
-source: src/parser/latex.rs
+source: crates/parser/src/latex.rs
expression: root
-input_file: src/parser/test_data/latex/label/label_reference_range_simple.txt
+input_file: crates/parser/src/test_data/latex/label/label_reference_range_simple.txt
---
ROOT@0..20
PREAMBLE@0..20
diff --git a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@label__label_reference_simple.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@label__label_reference_simple.txt.snap
index 3734ba74f9..ba3d08b472 100644
--- a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@label__label_reference_simple.txt.snap
+++ b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@label__label_reference_simple.txt.snap
@@ -1,7 +1,7 @@
---
-source: src/parser/latex.rs
+source: crates/parser/src/latex.rs
expression: root
-input_file: src/parser/test_data/latex/label/label_reference_simple.txt
+input_file: crates/parser/src/test_data/latex/label/label_reference_simple.txt
---
ROOT@0..9
PREAMBLE@0..9
diff --git a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@parameter.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@parameter.txt.snap
new file mode 100644
index 0000000000..aa038efb86
--- /dev/null
+++ b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@parameter.txt.snap
@@ -0,0 +1,10 @@
+---
+source: crates/parser/src/latex.rs
+expression: root
+input_file: crates/parser/src/test_data/latex/parameter.txt
+---
+ROOT@0..2
+ PREAMBLE@0..2
+ TEXT@0..2
+ WORD@0..2 "#1"
+
diff --git a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@parameter_error.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@parameter_error.txt.snap
new file mode 100644
index 0000000000..7f9a744622
--- /dev/null
+++ b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@parameter_error.txt.snap
@@ -0,0 +1,10 @@
+---
+source: crates/parser/src/latex.rs
+expression: root
+input_file: crates/parser/src/test_data/latex/parameter_error.txt
+---
+ROOT@0..1
+ PREAMBLE@0..1
+ TEXT@0..1
+ WORD@0..1 "#"
+
diff --git a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@structure__structure_enum_item.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@structure__structure_enum_item.txt.snap
index 45bcb12842..6045bdce2b 100644
--- a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@structure__structure_enum_item.txt.snap
+++ b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@structure__structure_enum_item.txt.snap
@@ -1,7 +1,7 @@
---
-source: src/parser/latex.rs
+source: crates/parser/src/latex.rs
expression: root
-input_file: src/parser/test_data/latex/structure/structure_enum_item.txt
+input_file: crates/parser/src/test_data/latex/structure/structure_enum_item.txt
---
ROOT@0..60
PREAMBLE@0..60
diff --git a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@structure__structure_invalid_nesting.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@structure__structure_invalid_nesting.txt.snap
index 877d7e28d4..df715917df 100644
--- a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@structure__structure_invalid_nesting.txt.snap
+++ b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@structure__structure_invalid_nesting.txt.snap
@@ -1,7 +1,7 @@
---
-source: src/parser/latex.rs
+source: crates/parser/src/latex.rs
expression: root
-input_file: src/parser/test_data/latex/structure/structure_invalid_nesting.txt
+input_file: crates/parser/src/test_data/latex/structure/structure_invalid_nesting.txt
---
ROOT@0..27
PREAMBLE@0..27
diff --git a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@structure__structure_nested.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@structure__structure_nested.txt.snap
index e4a3cddc7b..d9dab436e7 100644
--- a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@structure__structure_nested.txt.snap
+++ b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@structure__structure_nested.txt.snap
@@ -1,7 +1,7 @@
---
-source: src/parser/latex.rs
+source: crates/parser/src/latex.rs
expression: root
-input_file: src/parser/test_data/latex/structure/structure_nested.txt
+input_file: crates/parser/src/test_data/latex/structure/structure_nested.txt
---
ROOT@0..90
PREAMBLE@0..90
diff --git a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@structure__structure_siblings.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@structure__structure_siblings.txt.snap
index 4a925e7e44..66040952f0 100644
--- a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@structure__structure_siblings.txt.snap
+++ b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@structure__structure_siblings.txt.snap
@@ -1,7 +1,7 @@
---
-source: src/parser/latex.rs
+source: crates/parser/src/latex.rs
expression: root
-input_file: src/parser/test_data/latex/structure/structure_siblings.txt
+input_file: crates/parser/src/test_data/latex/structure/structure_siblings.txt
---
ROOT@0..35
PREAMBLE@0..35
diff --git a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@theorem_definition__theorem_definition_full.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@theorem_definition__theorem_definition_full.txt.snap
index 6aa441cbba..c21f26976e 100644
--- a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@theorem_definition__theorem_definition_full.txt.snap
+++ b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@theorem_definition__theorem_definition_full.txt.snap
@@ -1,7 +1,7 @@
---
-source: src/parser/latex.rs
+source: crates/parser/src/latex.rs
expression: root
-input_file: src/parser/test_data/latex/theorem_definition/theorem_definition_full.txt
+input_file: crates/parser/src/test_data/latex/theorem_definition/theorem_definition_full.txt
---
ROOT@0..31
PREAMBLE@0..31
diff --git a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@theorem_definition__theorem_definition_name_with_counter.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@theorem_definition__theorem_definition_name_with_counter.txt.snap
index d205e65183..d4c5d787b5 100644
--- a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@theorem_definition__theorem_definition_name_with_counter.txt.snap
+++ b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@theorem_definition__theorem_definition_name_with_counter.txt.snap
@@ -1,7 +1,7 @@
---
-source: src/parser/latex.rs
+source: crates/parser/src/latex.rs
expression: root
-input_file: src/parser/test_data/latex/theorem_definition/theorem_definition_name_with_counter.txt
+input_file: crates/parser/src/test_data/latex/theorem_definition/theorem_definition_name_with_counter.txt
---
ROOT@0..21
PREAMBLE@0..21
diff --git a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@theorem_definition__theorem_definition_name_with_description.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@theorem_definition__theorem_definition_name_with_description.txt.snap
index 8d198b3940..b269ac10d0 100644
--- a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@theorem_definition__theorem_definition_name_with_description.txt.snap
+++ b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@theorem_definition__theorem_definition_name_with_description.txt.snap
@@ -1,7 +1,7 @@
---
-source: src/parser/latex.rs
+source: crates/parser/src/latex.rs
expression: root
-input_file: src/parser/test_data/latex/theorem_definition/theorem_definition_name_with_description.txt
+input_file: crates/parser/src/test_data/latex/theorem_definition/theorem_definition_name_with_description.txt
---
ROOT@0..21
PREAMBLE@0..21
diff --git a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@theorem_definition__theorem_definition_name_with_description_and_counter.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@theorem_definition__theorem_definition_name_with_description_and_counter.txt.snap
index ffa7d31541..230f1fac29 100644
--- a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@theorem_definition__theorem_definition_name_with_description_and_counter.txt.snap
+++ b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@theorem_definition__theorem_definition_name_with_description_and_counter.txt.snap
@@ -1,7 +1,7 @@
---
-source: src/parser/latex.rs
+source: crates/parser/src/latex.rs
expression: root
-input_file: src/parser/test_data/latex/theorem_definition/theorem_definition_name_with_description_and_counter.txt
+input_file: crates/parser/src/test_data/latex/theorem_definition/theorem_definition_name_with_description_and_counter.txt
---
ROOT@0..26
PREAMBLE@0..26
diff --git a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@theorem_definition__theorem_definition_only_name.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@theorem_definition__theorem_definition_only_name.txt.snap
index afad760dd2..b01de34857 100644
--- a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@theorem_definition__theorem_definition_only_name.txt.snap
+++ b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@theorem_definition__theorem_definition_only_name.txt.snap
@@ -1,7 +1,7 @@
---
-source: src/parser/latex.rs
+source: crates/parser/src/latex.rs
expression: root
-input_file: src/parser/test_data/latex/theorem_definition/theorem_definition_only_name.txt
+input_file: crates/parser/src/test_data/latex/theorem_definition/theorem_definition_only_name.txt
---
ROOT@0..16
PREAMBLE@0..16
diff --git a/support/texlab/src/parser/test_data/bibtex/comment.txt b/support/texlab/crates/parser/src/test_data/bibtex/comment.txt
index f2ff586ab7..f2ff586ab7 100644
--- a/support/texlab/src/parser/test_data/bibtex/comment.txt
+++ b/support/texlab/crates/parser/src/test_data/bibtex/comment.txt
diff --git a/support/texlab/src/parser/test_data/bibtex/issue_809.txt b/support/texlab/crates/parser/src/test_data/bibtex/issue_809.txt
index c94b808fd5..c94b808fd5 100644
--- a/support/texlab/src/parser/test_data/bibtex/issue_809.txt
+++ b/support/texlab/crates/parser/src/test_data/bibtex/issue_809.txt
diff --git a/support/texlab/src/parser/test_data/bibtex/preamble.txt b/support/texlab/crates/parser/src/test_data/bibtex/preamble.txt
index 266b5ce228..266b5ce228 100644
--- a/support/texlab/src/parser/test_data/bibtex/preamble.txt
+++ b/support/texlab/crates/parser/src/test_data/bibtex/preamble.txt
diff --git a/support/texlab/src/parser/test_data/bibtex/samples/aho_2006.txt b/support/texlab/crates/parser/src/test_data/bibtex/samples/aho_2006.txt
index ff829b40d1..ff829b40d1 100644
--- a/support/texlab/src/parser/test_data/bibtex/samples/aho_2006.txt
+++ b/support/texlab/crates/parser/src/test_data/bibtex/samples/aho_2006.txt
diff --git a/support/texlab/src/parser/test_data/bibtex/samples/aksin_2006.txt b/support/texlab/crates/parser/src/test_data/bibtex/samples/aksin_2006.txt
index 88ea701c22..88ea701c22 100644
--- a/support/texlab/src/parser/test_data/bibtex/samples/aksin_2006.txt
+++ b/support/texlab/crates/parser/src/test_data/bibtex/samples/aksin_2006.txt
diff --git a/support/texlab/src/parser/test_data/bibtex/samples/almendro_1998.txt b/support/texlab/crates/parser/src/test_data/bibtex/samples/almendro_1998.txt
index ed16d33c67..ed16d33c67 100644
--- a/support/texlab/src/parser/test_data/bibtex/samples/almendro_1998.txt
+++ b/support/texlab/crates/parser/src/test_data/bibtex/samples/almendro_1998.txt
diff --git a/support/texlab/src/parser/test_data/bibtex/samples/averroes_1998.txt b/support/texlab/crates/parser/src/test_data/bibtex/samples/averroes_1998.txt
index 9f224353cc..9f224353cc 100644
--- a/support/texlab/src/parser/test_data/bibtex/samples/averroes_1998.txt
+++ b/support/texlab/crates/parser/src/test_data/bibtex/samples/averroes_1998.txt
diff --git a/support/texlab/src/parser/test_data/bibtex/samples/betram_1996.txt b/support/texlab/crates/parser/src/test_data/bibtex/samples/betram_1996.txt
index b2d77e216f..b2d77e216f 100644
--- a/support/texlab/src/parser/test_data/bibtex/samples/betram_1996.txt
+++ b/support/texlab/crates/parser/src/test_data/bibtex/samples/betram_1996.txt
diff --git a/support/texlab/src/parser/test_data/bibtex/samples/blom_2021.txt b/support/texlab/crates/parser/src/test_data/bibtex/samples/blom_2021.txt
index a502e53e03..a502e53e03 100644
--- a/support/texlab/src/parser/test_data/bibtex/samples/blom_2021.txt
+++ b/support/texlab/crates/parser/src/test_data/bibtex/samples/blom_2021.txt
diff --git a/support/texlab/src/parser/test_data/bibtex/samples/combi_2004.txt b/support/texlab/crates/parser/src/test_data/bibtex/samples/combi_2004.txt
index 7d8545577d..7d8545577d 100644
--- a/support/texlab/src/parser/test_data/bibtex/samples/combi_2004.txt
+++ b/support/texlab/crates/parser/src/test_data/bibtex/samples/combi_2004.txt
diff --git a/support/texlab/src/parser/test_data/bibtex/samples/erwin_2007.txt b/support/texlab/crates/parser/src/test_data/bibtex/samples/erwin_2007.txt
index 116f5e7098..116f5e7098 100644
--- a/support/texlab/src/parser/test_data/bibtex/samples/erwin_2007.txt
+++ b/support/texlab/crates/parser/src/test_data/bibtex/samples/erwin_2007.txt
diff --git a/support/texlab/src/parser/test_data/bibtex/samples/jain_1999.txt b/support/texlab/crates/parser/src/test_data/bibtex/samples/jain_1999.txt
index c367ef12ee..c367ef12ee 100644
--- a/support/texlab/src/parser/test_data/bibtex/samples/jain_1999.txt
+++ b/support/texlab/crates/parser/src/test_data/bibtex/samples/jain_1999.txt
diff --git a/support/texlab/src/parser/test_data/bibtex/samples/kastenholz_2006.txt b/support/texlab/crates/parser/src/test_data/bibtex/samples/kastenholz_2006.txt
index 457f871491..457f871491 100644
--- a/support/texlab/src/parser/test_data/bibtex/samples/kastenholz_2006.txt
+++ b/support/texlab/crates/parser/src/test_data/bibtex/samples/kastenholz_2006.txt
diff --git a/support/texlab/src/parser/test_data/bibtex/samples/knuth_1984.txt b/support/texlab/crates/parser/src/test_data/bibtex/samples/knuth_1984.txt
index 98c595e35c..98c595e35c 100644
--- a/support/texlab/src/parser/test_data/bibtex/samples/knuth_1984.txt
+++ b/support/texlab/crates/parser/src/test_data/bibtex/samples/knuth_1984.txt
diff --git a/support/texlab/src/parser/test_data/bibtex/samples/matuz_1990.txt b/support/texlab/crates/parser/src/test_data/bibtex/samples/matuz_1990.txt
index cb803aab51..cb803aab51 100644
--- a/support/texlab/src/parser/test_data/bibtex/samples/matuz_1990.txt
+++ b/support/texlab/crates/parser/src/test_data/bibtex/samples/matuz_1990.txt
diff --git a/support/texlab/src/parser/test_data/bibtex/samples/nietzsche_1998.txt b/support/texlab/crates/parser/src/test_data/bibtex/samples/nietzsche_1998.txt
index e245be39bb..e245be39bb 100644
--- a/support/texlab/src/parser/test_data/bibtex/samples/nietzsche_1998.txt
+++ b/support/texlab/crates/parser/src/test_data/bibtex/samples/nietzsche_1998.txt
diff --git a/support/texlab/src/parser/test_data/bibtex/samples/rivest_1978.txt b/support/texlab/crates/parser/src/test_data/bibtex/samples/rivest_1978.txt
index e1076145ea..e1076145ea 100644
--- a/support/texlab/src/parser/test_data/bibtex/samples/rivest_1978.txt
+++ b/support/texlab/crates/parser/src/test_data/bibtex/samples/rivest_1978.txt
diff --git a/support/texlab/src/parser/test_data/build_log/001.txt b/support/texlab/crates/parser/src/test_data/build_log/001.txt
index fc9968af0f..fc9968af0f 100644
--- a/support/texlab/src/parser/test_data/build_log/001.txt
+++ b/support/texlab/crates/parser/src/test_data/build_log/001.txt
diff --git a/support/texlab/src/parser/test_data/build_log/002.txt b/support/texlab/crates/parser/src/test_data/build_log/002.txt
index 8d438d1f12..8d438d1f12 100644
--- a/support/texlab/src/parser/test_data/build_log/002.txt
+++ b/support/texlab/crates/parser/src/test_data/build_log/002.txt
diff --git a/support/texlab/src/parser/test_data/build_log/003.txt b/support/texlab/crates/parser/src/test_data/build_log/003.txt
index 220614b91c..220614b91c 100644
--- a/support/texlab/src/parser/test_data/build_log/003.txt
+++ b/support/texlab/crates/parser/src/test_data/build_log/003.txt
diff --git a/support/texlab/src/parser/test_data/build_log/004.txt b/support/texlab/crates/parser/src/test_data/build_log/004.txt
index 4ab379cd53..4ab379cd53 100644
--- a/support/texlab/src/parser/test_data/build_log/004.txt
+++ b/support/texlab/crates/parser/src/test_data/build_log/004.txt
diff --git a/support/texlab/src/parser/test_data/build_log/005.txt b/support/texlab/crates/parser/src/test_data/build_log/005.txt
index 07c95bfc6b..07c95bfc6b 100644
--- a/support/texlab/src/parser/test_data/build_log/005.txt
+++ b/support/texlab/crates/parser/src/test_data/build_log/005.txt
diff --git a/support/texlab/src/parser/test_data/build_log/006.txt b/support/texlab/crates/parser/src/test_data/build_log/006.txt
index 3edb18b8c7..3edb18b8c7 100644
--- a/support/texlab/src/parser/test_data/build_log/006.txt
+++ b/support/texlab/crates/parser/src/test_data/build_log/006.txt
diff --git a/support/texlab/src/parser/test_data/build_log/007.txt b/support/texlab/crates/parser/src/test_data/build_log/007.txt
index 4c86405c0d..4c86405c0d 100644
--- a/support/texlab/src/parser/test_data/build_log/007.txt
+++ b/support/texlab/crates/parser/src/test_data/build_log/007.txt
diff --git a/support/texlab/src/parser/test_data/latex/block_comments.txt b/support/texlab/crates/parser/src/test_data/latex/block_comments.txt
index d4e63ab1c8..d4e63ab1c8 100644
--- a/support/texlab/src/parser/test_data/latex/block_comments.txt
+++ b/support/texlab/crates/parser/src/test_data/latex/block_comments.txt
diff --git a/support/texlab/src/parser/test_data/latex/caption/caption_default.txt b/support/texlab/crates/parser/src/test_data/latex/caption/caption_default.txt
index 9084f143bf..9084f143bf 100644
--- a/support/texlab/src/parser/test_data/latex/caption/caption_default.txt
+++ b/support/texlab/crates/parser/src/test_data/latex/caption/caption_default.txt
diff --git a/support/texlab/src/parser/test_data/latex/caption/caption_default_error.txt b/support/texlab/crates/parser/src/test_data/latex/caption/caption_default_error.txt
index 62e5962816..62e5962816 100644
--- a/support/texlab/src/parser/test_data/latex/caption/caption_default_error.txt
+++ b/support/texlab/crates/parser/src/test_data/latex/caption/caption_default_error.txt
diff --git a/support/texlab/src/parser/test_data/latex/caption/caption_figure.txt b/support/texlab/crates/parser/src/test_data/latex/caption/caption_figure.txt
index 8a1d3067d8..8a1d3067d8 100644
--- a/support/texlab/src/parser/test_data/latex/caption/caption_figure.txt
+++ b/support/texlab/crates/parser/src/test_data/latex/caption/caption_figure.txt
diff --git a/support/texlab/src/parser/test_data/latex/caption/caption_minimal.txt b/support/texlab/crates/parser/src/test_data/latex/caption/caption_minimal.txt
index 07af0af8ca..07af0af8ca 100644
--- a/support/texlab/src/parser/test_data/latex/caption/caption_minimal.txt
+++ b/support/texlab/crates/parser/src/test_data/latex/caption/caption_minimal.txt
diff --git a/support/texlab/src/parser/test_data/latex/caption/caption_minimal_error.txt b/support/texlab/crates/parser/src/test_data/latex/caption/caption_minimal_error.txt
index 747db731c1..747db731c1 100644
--- a/support/texlab/src/parser/test_data/latex/caption/caption_minimal_error.txt
+++ b/support/texlab/crates/parser/src/test_data/latex/caption/caption_minimal_error.txt
diff --git a/support/texlab/src/parser/test_data/latex/citation/citation_empty.txt b/support/texlab/crates/parser/src/test_data/latex/citation/citation_empty.txt
index 06704b89a4..06704b89a4 100644
--- a/support/texlab/src/parser/test_data/latex/citation/citation_empty.txt
+++ b/support/texlab/crates/parser/src/test_data/latex/citation/citation_empty.txt
diff --git a/support/texlab/src/parser/test_data/latex/citation/citation_missing_brace.txt b/support/texlab/crates/parser/src/test_data/latex/citation/citation_missing_brace.txt
index 1f8e4c9310..1f8e4c9310 100644
--- a/support/texlab/src/parser/test_data/latex/citation/citation_missing_brace.txt
+++ b/support/texlab/crates/parser/src/test_data/latex/citation/citation_missing_brace.txt
diff --git a/support/texlab/src/parser/test_data/latex/citation/citation_multiple_keys.txt b/support/texlab/crates/parser/src/test_data/latex/citation/citation_multiple_keys.txt
index be5da02c62..be5da02c62 100644
--- a/support/texlab/src/parser/test_data/latex/citation/citation_multiple_keys.txt
+++ b/support/texlab/crates/parser/src/test_data/latex/citation/citation_multiple_keys.txt
diff --git a/support/texlab/src/parser/test_data/latex/citation/citation_prenote.txt b/support/texlab/crates/parser/src/test_data/latex/citation/citation_prenote.txt
index 5ae28c28ec..5ae28c28ec 100644
--- a/support/texlab/src/parser/test_data/latex/citation/citation_prenote.txt
+++ b/support/texlab/crates/parser/src/test_data/latex/citation/citation_prenote.txt
diff --git a/support/texlab/src/parser/test_data/latex/citation/citation_prenote_postnote.txt b/support/texlab/crates/parser/src/test_data/latex/citation/citation_prenote_postnote.txt
index 23103b2476..23103b2476 100644
--- a/support/texlab/src/parser/test_data/latex/citation/citation_prenote_postnote.txt
+++ b/support/texlab/crates/parser/src/test_data/latex/citation/citation_prenote_postnote.txt
diff --git a/support/texlab/src/parser/test_data/latex/citation/citation_redundant_comma.txt b/support/texlab/crates/parser/src/test_data/latex/citation/citation_redundant_comma.txt
index 68e3c2d36e..68e3c2d36e 100644
--- a/support/texlab/src/parser/test_data/latex/citation/citation_redundant_comma.txt
+++ b/support/texlab/crates/parser/src/test_data/latex/citation/citation_redundant_comma.txt
diff --git a/support/texlab/src/parser/test_data/latex/citation/citation_simple.txt b/support/texlab/crates/parser/src/test_data/latex/citation/citation_simple.txt
index cd5809ef25..cd5809ef25 100644
--- a/support/texlab/src/parser/test_data/latex/citation/citation_simple.txt
+++ b/support/texlab/crates/parser/src/test_data/latex/citation/citation_simple.txt
diff --git a/support/texlab/src/parser/test_data/latex/citation/citation_star.txt b/support/texlab/crates/parser/src/test_data/latex/citation/citation_star.txt
index d1a2677021..d1a2677021 100644
--- a/support/texlab/src/parser/test_data/latex/citation/citation_star.txt
+++ b/support/texlab/crates/parser/src/test_data/latex/citation/citation_star.txt
diff --git a/support/texlab/src/parser/test_data/latex/color/color_definition_simple.txt b/support/texlab/crates/parser/src/test_data/latex/color/color_definition_simple.txt
index e8b58c8162..e8b58c8162 100644
--- a/support/texlab/src/parser/test_data/latex/color/color_definition_simple.txt
+++ b/support/texlab/crates/parser/src/test_data/latex/color/color_definition_simple.txt
diff --git a/support/texlab/src/parser/test_data/latex/color/color_reference_simple.txt b/support/texlab/crates/parser/src/test_data/latex/color/color_reference_simple.txt
index 4fea2b24ec..4fea2b24ec 100644
--- a/support/texlab/src/parser/test_data/latex/color/color_reference_simple.txt
+++ b/support/texlab/crates/parser/src/test_data/latex/color/color_reference_simple.txt
diff --git a/support/texlab/src/parser/test_data/latex/color/color_set_definition_error1.txt b/support/texlab/crates/parser/src/test_data/latex/color/color_set_definition_error1.txt
index f377ffcf2f..f377ffcf2f 100644
--- a/support/texlab/src/parser/test_data/latex/color/color_set_definition_error1.txt
+++ b/support/texlab/crates/parser/src/test_data/latex/color/color_set_definition_error1.txt
diff --git a/support/texlab/src/parser/test_data/latex/color/color_set_definition_error2.txt b/support/texlab/crates/parser/src/test_data/latex/color/color_set_definition_error2.txt
index 0b5fa35868..0b5fa35868 100644
--- a/support/texlab/src/parser/test_data/latex/color/color_set_definition_error2.txt
+++ b/support/texlab/crates/parser/src/test_data/latex/color/color_set_definition_error2.txt
diff --git a/support/texlab/src/parser/test_data/latex/color/color_set_definition_error3.txt b/support/texlab/crates/parser/src/test_data/latex/color/color_set_definition_error3.txt
index fb695b4530..fb695b4530 100644
--- a/support/texlab/src/parser/test_data/latex/color/color_set_definition_error3.txt
+++ b/support/texlab/crates/parser/src/test_data/latex/color/color_set_definition_error3.txt
diff --git a/support/texlab/src/parser/test_data/latex/color/color_set_definition_error4.txt b/support/texlab/crates/parser/src/test_data/latex/color/color_set_definition_error4.txt
index 7c494133bf..7c494133bf 100644
--- a/support/texlab/src/parser/test_data/latex/color/color_set_definition_error4.txt
+++ b/support/texlab/crates/parser/src/test_data/latex/color/color_set_definition_error4.txt
diff --git a/support/texlab/src/parser/test_data/latex/color/color_set_definition_simple.txt b/support/texlab/crates/parser/src/test_data/latex/color/color_set_definition_simple.txt
index c812e61041..c812e61041 100644
--- a/support/texlab/src/parser/test_data/latex/color/color_set_definition_simple.txt
+++ b/support/texlab/crates/parser/src/test_data/latex/color/color_set_definition_simple.txt
diff --git a/support/texlab/src/parser/test_data/latex/command_definition/command_definition_no_argc.txt b/support/texlab/crates/parser/src/test_data/latex/command_definition/command_definition_no_argc.txt
index ef63ef62cb..ef63ef62cb 100644
--- a/support/texlab/src/parser/test_data/latex/command_definition/command_definition_no_argc.txt
+++ b/support/texlab/crates/parser/src/test_data/latex/command_definition/command_definition_no_argc.txt
diff --git a/support/texlab/src/parser/test_data/latex/command_definition/command_definition_no_impl.txt b/support/texlab/crates/parser/src/test_data/latex/command_definition/command_definition_no_impl.txt
index 5ffc7e97c2..5ffc7e97c2 100644
--- a/support/texlab/src/parser/test_data/latex/command_definition/command_definition_no_impl.txt
+++ b/support/texlab/crates/parser/src/test_data/latex/command_definition/command_definition_no_impl.txt
diff --git a/support/texlab/src/parser/test_data/latex/command_definition/command_definition_no_impl_error.txt b/support/texlab/crates/parser/src/test_data/latex/command_definition/command_definition_no_impl_error.txt
index 9323f5a313..9323f5a313 100644
--- a/support/texlab/src/parser/test_data/latex/command_definition/command_definition_no_impl_error.txt
+++ b/support/texlab/crates/parser/src/test_data/latex/command_definition/command_definition_no_impl_error.txt
diff --git a/support/texlab/src/parser/test_data/latex/command_definition/command_definition_optional.txt b/support/texlab/crates/parser/src/test_data/latex/command_definition/command_definition_optional.txt
index c3fb7225f3..c3fb7225f3 100644
--- a/support/texlab/src/parser/test_data/latex/command_definition/command_definition_optional.txt
+++ b/support/texlab/crates/parser/src/test_data/latex/command_definition/command_definition_optional.txt
diff --git a/support/texlab/src/parser/test_data/latex/command_definition/command_definition_simple.txt b/support/texlab/crates/parser/src/test_data/latex/command_definition/command_definition_simple.txt
index ffce86f21c..ffce86f21c 100644
--- a/support/texlab/src/parser/test_data/latex/command_definition/command_definition_simple.txt
+++ b/support/texlab/crates/parser/src/test_data/latex/command_definition/command_definition_simple.txt
diff --git a/support/texlab/src/parser/test_data/latex/command_definition/command_definition_with_begin.txt b/support/texlab/crates/parser/src/test_data/latex/command_definition/command_definition_with_begin.txt
index e7ce7984cb..e7ce7984cb 100644
--- a/support/texlab/src/parser/test_data/latex/command_definition/command_definition_with_begin.txt
+++ b/support/texlab/crates/parser/src/test_data/latex/command_definition/command_definition_with_begin.txt
diff --git a/support/texlab/src/parser/test_data/latex/command_definition/math_operator_no_impl.txt b/support/texlab/crates/parser/src/test_data/latex/command_definition/math_operator_no_impl.txt
index 685be22ce6..685be22ce6 100644
--- a/support/texlab/src/parser/test_data/latex/command_definition/math_operator_no_impl.txt
+++ b/support/texlab/crates/parser/src/test_data/latex/command_definition/math_operator_no_impl.txt
diff --git a/support/texlab/src/parser/test_data/latex/command_definition/math_operator_simple.txt b/support/texlab/crates/parser/src/test_data/latex/command_definition/math_operator_simple.txt
index ffbf671f74..ffbf671f74 100644
--- a/support/texlab/src/parser/test_data/latex/command_definition/math_operator_simple.txt
+++ b/support/texlab/crates/parser/src/test_data/latex/command_definition/math_operator_simple.txt
diff --git a/support/texlab/src/parser/test_data/latex/environment/environment_asymptote.txt b/support/texlab/crates/parser/src/test_data/latex/environment/environment_asymptote.txt
index 76646075ea..76646075ea 100644
--- a/support/texlab/src/parser/test_data/latex/environment/environment_asymptote.txt
+++ b/support/texlab/crates/parser/src/test_data/latex/environment/environment_asymptote.txt
diff --git a/support/texlab/src/parser/test_data/latex/environment/environment_definition.txt b/support/texlab/crates/parser/src/test_data/latex/environment/environment_definition.txt
index d3a5291dca..d3a5291dca 100644
--- a/support/texlab/src/parser/test_data/latex/environment/environment_definition.txt
+++ b/support/texlab/crates/parser/src/test_data/latex/environment/environment_definition.txt
diff --git a/support/texlab/src/parser/test_data/latex/environment/environment_definition_optional_arg.txt b/support/texlab/crates/parser/src/test_data/latex/environment/environment_definition_optional_arg.txt
index bead3228a4..bead3228a4 100644
--- a/support/texlab/src/parser/test_data/latex/environment/environment_definition_optional_arg.txt
+++ b/support/texlab/crates/parser/src/test_data/latex/environment/environment_definition_optional_arg.txt
diff --git a/support/texlab/src/parser/test_data/latex/environment/environment_nested.txt b/support/texlab/crates/parser/src/test_data/latex/environment/environment_nested.txt
index 8d84019ac7..8d84019ac7 100644
--- a/support/texlab/src/parser/test_data/latex/environment/environment_nested.txt
+++ b/support/texlab/crates/parser/src/test_data/latex/environment/environment_nested.txt
diff --git a/support/texlab/src/parser/test_data/latex/environment/environment_nested_missing_braces.txt b/support/texlab/crates/parser/src/test_data/latex/environment/environment_nested_missing_braces.txt
index 35ce901a83..35ce901a83 100644
--- a/support/texlab/src/parser/test_data/latex/environment/environment_nested_missing_braces.txt
+++ b/support/texlab/crates/parser/src/test_data/latex/environment/environment_nested_missing_braces.txt
diff --git a/support/texlab/src/parser/test_data/latex/environment/environment_simple.txt b/support/texlab/crates/parser/src/test_data/latex/environment/environment_simple.txt
index 309b559957..309b559957 100644
--- a/support/texlab/src/parser/test_data/latex/environment/environment_simple.txt
+++ b/support/texlab/crates/parser/src/test_data/latex/environment/environment_simple.txt
diff --git a/support/texlab/src/parser/test_data/latex/equation.txt b/support/texlab/crates/parser/src/test_data/latex/equation.txt
index 7f85196961..7f85196961 100644
--- a/support/texlab/src/parser/test_data/latex/equation.txt
+++ b/support/texlab/crates/parser/src/test_data/latex/equation.txt
diff --git a/support/texlab/src/parser/test_data/latex/equation_missing_begin.txt b/support/texlab/crates/parser/src/test_data/latex/equation_missing_begin.txt
index 9e5707b196..9e5707b196 100644
--- a/support/texlab/src/parser/test_data/latex/equation_missing_begin.txt
+++ b/support/texlab/crates/parser/src/test_data/latex/equation_missing_begin.txt
diff --git a/support/texlab/src/parser/test_data/latex/generic_command_args.txt b/support/texlab/crates/parser/src/test_data/latex/generic_command_args.txt
index 2d62314c5c..2d62314c5c 100644
--- a/support/texlab/src/parser/test_data/latex/generic_command_args.txt
+++ b/support/texlab/crates/parser/src/test_data/latex/generic_command_args.txt
diff --git a/support/texlab/src/parser/test_data/latex/generic_command_empty.txt b/support/texlab/crates/parser/src/test_data/latex/generic_command_empty.txt
index eeb4a48255..eeb4a48255 100644
--- a/support/texlab/src/parser/test_data/latex/generic_command_empty.txt
+++ b/support/texlab/crates/parser/src/test_data/latex/generic_command_empty.txt
diff --git a/support/texlab/src/parser/test_data/latex/generic_command_escape.txt b/support/texlab/crates/parser/src/test_data/latex/generic_command_escape.txt
index 133d674d1e..133d674d1e 100644
--- a/support/texlab/src/parser/test_data/latex/generic_command_escape.txt
+++ b/support/texlab/crates/parser/src/test_data/latex/generic_command_escape.txt
diff --git a/support/texlab/src/parser/test_data/latex/glossary/acronym_declaration.txt b/support/texlab/crates/parser/src/test_data/latex/glossary/acronym_declaration.txt
index abf12b6cae..abf12b6cae 100644
--- a/support/texlab/src/parser/test_data/latex/glossary/acronym_declaration.txt
+++ b/support/texlab/crates/parser/src/test_data/latex/glossary/acronym_declaration.txt
diff --git a/support/texlab/src/parser/test_data/latex/glossary/acronym_definition_options.txt b/support/texlab/crates/parser/src/test_data/latex/glossary/acronym_definition_options.txt
index 47a69067ca..47a69067ca 100644
--- a/support/texlab/src/parser/test_data/latex/glossary/acronym_definition_options.txt
+++ b/support/texlab/crates/parser/src/test_data/latex/glossary/acronym_definition_options.txt
diff --git a/support/texlab/src/parser/test_data/latex/glossary/acronym_definition_simple.txt b/support/texlab/crates/parser/src/test_data/latex/glossary/acronym_definition_simple.txt
index 4fbf285927..4fbf285927 100644
--- a/support/texlab/src/parser/test_data/latex/glossary/acronym_definition_simple.txt
+++ b/support/texlab/crates/parser/src/test_data/latex/glossary/acronym_definition_simple.txt
diff --git a/support/texlab/src/parser/test_data/latex/glossary/acronym_package.txt b/support/texlab/crates/parser/src/test_data/latex/glossary/acronym_package.txt
index 86e60c4584..86e60c4584 100644
--- a/support/texlab/src/parser/test_data/latex/glossary/acronym_package.txt
+++ b/support/texlab/crates/parser/src/test_data/latex/glossary/acronym_package.txt
diff --git a/support/texlab/src/parser/test_data/latex/glossary/acronym_reference_options.txt b/support/texlab/crates/parser/src/test_data/latex/glossary/acronym_reference_options.txt
index 43fd03f12b..43fd03f12b 100644
--- a/support/texlab/src/parser/test_data/latex/glossary/acronym_reference_options.txt
+++ b/support/texlab/crates/parser/src/test_data/latex/glossary/acronym_reference_options.txt
diff --git a/support/texlab/src/parser/test_data/latex/glossary/acronym_reference_simple.txt b/support/texlab/crates/parser/src/test_data/latex/glossary/acronym_reference_simple.txt
index d9fb5b9a25..d9fb5b9a25 100644
--- a/support/texlab/src/parser/test_data/latex/glossary/acronym_reference_simple.txt
+++ b/support/texlab/crates/parser/src/test_data/latex/glossary/acronym_reference_simple.txt
diff --git a/support/texlab/src/parser/test_data/latex/glossary/glossary_entry_definition_simple.txt b/support/texlab/crates/parser/src/test_data/latex/glossary/glossary_entry_definition_simple.txt
index fb1e12899a..fb1e12899a 100644
--- a/support/texlab/src/parser/test_data/latex/glossary/glossary_entry_definition_simple.txt
+++ b/support/texlab/crates/parser/src/test_data/latex/glossary/glossary_entry_definition_simple.txt
diff --git a/support/texlab/src/parser/test_data/latex/glossary/glossary_entry_reference_options.txt b/support/texlab/crates/parser/src/test_data/latex/glossary/glossary_entry_reference_options.txt
index fbae075e1d..fbae075e1d 100644
--- a/support/texlab/src/parser/test_data/latex/glossary/glossary_entry_reference_options.txt
+++ b/support/texlab/crates/parser/src/test_data/latex/glossary/glossary_entry_reference_options.txt
diff --git a/support/texlab/src/parser/test_data/latex/glossary/glossary_entry_reference_simple.txt b/support/texlab/crates/parser/src/test_data/latex/glossary/glossary_entry_reference_simple.txt
index a603355f0f..a603355f0f 100644
--- a/support/texlab/src/parser/test_data/latex/glossary/glossary_entry_reference_simple.txt
+++ b/support/texlab/crates/parser/src/test_data/latex/glossary/glossary_entry_reference_simple.txt
diff --git a/support/texlab/src/parser/test_data/latex/graphics_path.txt b/support/texlab/crates/parser/src/test_data/latex/graphics_path.txt
index 0e9f431c36..0e9f431c36 100644
--- a/support/texlab/src/parser/test_data/latex/graphics_path.txt
+++ b/support/texlab/crates/parser/src/test_data/latex/graphics_path.txt
diff --git a/support/texlab/src/parser/test_data/latex/graphics_path_command.txt b/support/texlab/crates/parser/src/test_data/latex/graphics_path_command.txt
index 729ee51690..729ee51690 100644
--- a/support/texlab/src/parser/test_data/latex/graphics_path_command.txt
+++ b/support/texlab/crates/parser/src/test_data/latex/graphics_path_command.txt
diff --git a/support/texlab/src/parser/test_data/latex/graphics_path_options.txt b/support/texlab/crates/parser/src/test_data/latex/graphics_path_options.txt
index ae8aa84d86..ae8aa84d86 100644
--- a/support/texlab/src/parser/test_data/latex/graphics_path_options.txt
+++ b/support/texlab/crates/parser/src/test_data/latex/graphics_path_options.txt
diff --git a/support/texlab/src/parser/test_data/latex/group/curly_group_missing_end.txt b/support/texlab/crates/parser/src/test_data/latex/group/curly_group_missing_end.txt
index 6c7b76c0f8..6c7b76c0f8 100644
--- a/support/texlab/src/parser/test_data/latex/group/curly_group_missing_end.txt
+++ b/support/texlab/crates/parser/src/test_data/latex/group/curly_group_missing_end.txt
diff --git a/support/texlab/src/parser/test_data/latex/group/curly_group_simple.txt b/support/texlab/crates/parser/src/test_data/latex/group/curly_group_simple.txt
index 5084aae70a..5084aae70a 100644
--- a/support/texlab/src/parser/test_data/latex/group/curly_group_simple.txt
+++ b/support/texlab/crates/parser/src/test_data/latex/group/curly_group_simple.txt
diff --git a/support/texlab/src/parser/test_data/latex/group/equation_missing_end.txt b/support/texlab/crates/parser/src/test_data/latex/group/equation_missing_end.txt
index fcb715926a..fcb715926a 100644
--- a/support/texlab/src/parser/test_data/latex/group/equation_missing_end.txt
+++ b/support/texlab/crates/parser/src/test_data/latex/group/equation_missing_end.txt
diff --git a/support/texlab/src/parser/test_data/latex/group/escaped_brackets.txt b/support/texlab/crates/parser/src/test_data/latex/group/escaped_brackets.txt
index 144a5fdd6d..144a5fdd6d 100644
--- a/support/texlab/src/parser/test_data/latex/group/escaped_brackets.txt
+++ b/support/texlab/crates/parser/src/test_data/latex/group/escaped_brackets.txt
diff --git a/support/texlab/src/parser/test_data/latex/group/unmatched_braces.txt b/support/texlab/crates/parser/src/test_data/latex/group/unmatched_braces.txt
index 8f606b7dbe..8f606b7dbe 100644
--- a/support/texlab/src/parser/test_data/latex/group/unmatched_braces.txt
+++ b/support/texlab/crates/parser/src/test_data/latex/group/unmatched_braces.txt
diff --git a/support/texlab/src/parser/test_data/latex/group/unmatched_brackets.txt b/support/texlab/crates/parser/src/test_data/latex/group/unmatched_brackets.txt
index 94ea4d5c96..94ea4d5c96 100644
--- a/support/texlab/src/parser/test_data/latex/group/unmatched_brackets.txt
+++ b/support/texlab/crates/parser/src/test_data/latex/group/unmatched_brackets.txt
diff --git a/support/texlab/src/parser/test_data/latex/group/unmatched_brackets_with_group.txt b/support/texlab/crates/parser/src/test_data/latex/group/unmatched_brackets_with_group.txt
index ebf6229429..ebf6229429 100644
--- a/support/texlab/src/parser/test_data/latex/group/unmatched_brackets_with_group.txt
+++ b/support/texlab/crates/parser/src/test_data/latex/group/unmatched_brackets_with_group.txt
diff --git a/support/texlab/src/parser/test_data/latex/hello_world.txt b/support/texlab/crates/parser/src/test_data/latex/hello_world.txt
index c57eff55eb..c57eff55eb 100644
--- a/support/texlab/src/parser/test_data/latex/hello_world.txt
+++ b/support/texlab/crates/parser/src/test_data/latex/hello_world.txt
diff --git a/support/texlab/src/parser/test_data/latex/include/biblatex_include_options.txt b/support/texlab/crates/parser/src/test_data/latex/include/biblatex_include_options.txt
index 216e7ea165..216e7ea165 100644
--- a/support/texlab/src/parser/test_data/latex/include/biblatex_include_options.txt
+++ b/support/texlab/crates/parser/src/test_data/latex/include/biblatex_include_options.txt
diff --git a/support/texlab/src/parser/test_data/latex/include/biblatex_include_simple.txt b/support/texlab/crates/parser/src/test_data/latex/include/biblatex_include_simple.txt
index fe10ce257d..fe10ce257d 100644
--- a/support/texlab/src/parser/test_data/latex/include/biblatex_include_simple.txt
+++ b/support/texlab/crates/parser/src/test_data/latex/include/biblatex_include_simple.txt
diff --git a/support/texlab/src/parser/test_data/latex/include/bibtex_include_simple.txt b/support/texlab/crates/parser/src/test_data/latex/include/bibtex_include_simple.txt
index 955353f690..955353f690 100644
--- a/support/texlab/src/parser/test_data/latex/include/bibtex_include_simple.txt
+++ b/support/texlab/crates/parser/src/test_data/latex/include/bibtex_include_simple.txt
diff --git a/support/texlab/src/parser/test_data/latex/include/class_include_empty.txt b/support/texlab/crates/parser/src/test_data/latex/include/class_include_empty.txt
index 144b418175..144b418175 100644
--- a/support/texlab/src/parser/test_data/latex/include/class_include_empty.txt
+++ b/support/texlab/crates/parser/src/test_data/latex/include/class_include_empty.txt
diff --git a/support/texlab/src/parser/test_data/latex/include/class_include_options.txt b/support/texlab/crates/parser/src/test_data/latex/include/class_include_options.txt
index 32dc4279d7..32dc4279d7 100644
--- a/support/texlab/src/parser/test_data/latex/include/class_include_options.txt
+++ b/support/texlab/crates/parser/src/test_data/latex/include/class_include_options.txt
diff --git a/support/texlab/src/parser/test_data/latex/include/class_include_simple.txt b/support/texlab/crates/parser/src/test_data/latex/include/class_include_simple.txt
index 15f3d6ea0a..15f3d6ea0a 100644
--- a/support/texlab/src/parser/test_data/latex/include/class_include_simple.txt
+++ b/support/texlab/crates/parser/src/test_data/latex/include/class_include_simple.txt
diff --git a/support/texlab/src/parser/test_data/latex/include/graphics_include_command.txt b/support/texlab/crates/parser/src/test_data/latex/include/graphics_include_command.txt
index 14a4a96216..14a4a96216 100644
--- a/support/texlab/src/parser/test_data/latex/include/graphics_include_command.txt
+++ b/support/texlab/crates/parser/src/test_data/latex/include/graphics_include_command.txt
diff --git a/support/texlab/src/parser/test_data/latex/include/graphics_include_complicated_options.txt b/support/texlab/crates/parser/src/test_data/latex/include/graphics_include_complicated_options.txt
index d6b6910c14..d6b6910c14 100644
--- a/support/texlab/src/parser/test_data/latex/include/graphics_include_complicated_options.txt
+++ b/support/texlab/crates/parser/src/test_data/latex/include/graphics_include_complicated_options.txt
diff --git a/support/texlab/src/parser/test_data/latex/include/graphics_include_options.txt b/support/texlab/crates/parser/src/test_data/latex/include/graphics_include_options.txt
index 8d3c45f2a5..8d3c45f2a5 100644
--- a/support/texlab/src/parser/test_data/latex/include/graphics_include_options.txt
+++ b/support/texlab/crates/parser/src/test_data/latex/include/graphics_include_options.txt
diff --git a/support/texlab/src/parser/test_data/latex/include/graphics_include_simple.txt b/support/texlab/crates/parser/src/test_data/latex/include/graphics_include_simple.txt
index 629cf3e8a9..629cf3e8a9 100644
--- a/support/texlab/src/parser/test_data/latex/include/graphics_include_simple.txt
+++ b/support/texlab/crates/parser/src/test_data/latex/include/graphics_include_simple.txt
diff --git a/support/texlab/src/parser/test_data/latex/include/import_incomplete.txt b/support/texlab/crates/parser/src/test_data/latex/include/import_incomplete.txt
index 3d6bc5f043..3d6bc5f043 100644
--- a/support/texlab/src/parser/test_data/latex/include/import_incomplete.txt
+++ b/support/texlab/crates/parser/src/test_data/latex/include/import_incomplete.txt
diff --git a/support/texlab/src/parser/test_data/latex/include/import_simple.txt b/support/texlab/crates/parser/src/test_data/latex/include/import_simple.txt
index f38059d6c1..f38059d6c1 100644
--- a/support/texlab/src/parser/test_data/latex/include/import_simple.txt
+++ b/support/texlab/crates/parser/src/test_data/latex/include/import_simple.txt
diff --git a/support/texlab/src/parser/test_data/latex/include/inkscape_include_options.txt b/support/texlab/crates/parser/src/test_data/latex/include/inkscape_include_options.txt
index e6dd431c7c..e6dd431c7c 100644
--- a/support/texlab/src/parser/test_data/latex/include/inkscape_include_options.txt
+++ b/support/texlab/crates/parser/src/test_data/latex/include/inkscape_include_options.txt
diff --git a/support/texlab/src/parser/test_data/latex/include/inkscape_include_simple.txt b/support/texlab/crates/parser/src/test_data/latex/include/inkscape_include_simple.txt
index 4e3a4ea9ba..4e3a4ea9ba 100644
--- a/support/texlab/src/parser/test_data/latex/include/inkscape_include_simple.txt
+++ b/support/texlab/crates/parser/src/test_data/latex/include/inkscape_include_simple.txt
diff --git a/support/texlab/src/parser/test_data/latex/include/latex_include_equality_sign.txt b/support/texlab/crates/parser/src/test_data/latex/include/latex_include_equality_sign.txt
index 5a763b4e29..5a763b4e29 100644
--- a/support/texlab/src/parser/test_data/latex/include/latex_include_equality_sign.txt
+++ b/support/texlab/crates/parser/src/test_data/latex/include/latex_include_equality_sign.txt
diff --git a/support/texlab/src/parser/test_data/latex/include/latex_include_simple.txt b/support/texlab/crates/parser/src/test_data/latex/include/latex_include_simple.txt
index c0d3d390df..c0d3d390df 100644
--- a/support/texlab/src/parser/test_data/latex/include/latex_include_simple.txt
+++ b/support/texlab/crates/parser/src/test_data/latex/include/latex_include_simple.txt
diff --git a/support/texlab/src/parser/test_data/latex/include/latex_input_path_brackets.txt b/support/texlab/crates/parser/src/test_data/latex/include/latex_input_path_brackets.txt
index 6585f50d52..6585f50d52 100644
--- a/support/texlab/src/parser/test_data/latex/include/latex_input_path_brackets.txt
+++ b/support/texlab/crates/parser/src/test_data/latex/include/latex_input_path_brackets.txt
diff --git a/support/texlab/src/parser/test_data/latex/include/package_include_empty.txt b/support/texlab/crates/parser/src/test_data/latex/include/package_include_empty.txt
index 09e02cc1cc..09e02cc1cc 100644
--- a/support/texlab/src/parser/test_data/latex/include/package_include_empty.txt
+++ b/support/texlab/crates/parser/src/test_data/latex/include/package_include_empty.txt
diff --git a/support/texlab/src/parser/test_data/latex/include/package_include_multiple.txt b/support/texlab/crates/parser/src/test_data/latex/include/package_include_multiple.txt
index c1080aaf66..c1080aaf66 100644
--- a/support/texlab/src/parser/test_data/latex/include/package_include_multiple.txt
+++ b/support/texlab/crates/parser/src/test_data/latex/include/package_include_multiple.txt
diff --git a/support/texlab/src/parser/test_data/latex/include/package_include_options.txt b/support/texlab/crates/parser/src/test_data/latex/include/package_include_options.txt
index 83a50c12cf..83a50c12cf 100644
--- a/support/texlab/src/parser/test_data/latex/include/package_include_options.txt
+++ b/support/texlab/crates/parser/src/test_data/latex/include/package_include_options.txt
diff --git a/support/texlab/src/parser/test_data/latex/include/package_include_simple.txt b/support/texlab/crates/parser/src/test_data/latex/include/package_include_simple.txt
index 3cf1b4edc0..3cf1b4edc0 100644
--- a/support/texlab/src/parser/test_data/latex/include/package_include_simple.txt
+++ b/support/texlab/crates/parser/src/test_data/latex/include/package_include_simple.txt
diff --git a/support/texlab/src/parser/test_data/latex/include/pgf_library_import_simple.txt b/support/texlab/crates/parser/src/test_data/latex/include/pgf_library_import_simple.txt
index 25a2b24720..25a2b24720 100644
--- a/support/texlab/src/parser/test_data/latex/include/pgf_library_import_simple.txt
+++ b/support/texlab/crates/parser/src/test_data/latex/include/pgf_library_import_simple.txt
diff --git a/support/texlab/src/parser/test_data/latex/include/svg_include_options.txt b/support/texlab/crates/parser/src/test_data/latex/include/svg_include_options.txt
index 3eb90568ab..3eb90568ab 100644
--- a/support/texlab/src/parser/test_data/latex/include/svg_include_options.txt
+++ b/support/texlab/crates/parser/src/test_data/latex/include/svg_include_options.txt
diff --git a/support/texlab/src/parser/test_data/latex/include/svg_include_simple.txt b/support/texlab/crates/parser/src/test_data/latex/include/svg_include_simple.txt
index 964a3adcd6..964a3adcd6 100644
--- a/support/texlab/src/parser/test_data/latex/include/svg_include_simple.txt
+++ b/support/texlab/crates/parser/src/test_data/latex/include/svg_include_simple.txt
diff --git a/support/texlab/src/parser/test_data/latex/include/tikz_library_import_simple.txt b/support/texlab/crates/parser/src/test_data/latex/include/tikz_library_import_simple.txt
index ff616ebd11..ff616ebd11 100644
--- a/support/texlab/src/parser/test_data/latex/include/tikz_library_import_simple.txt
+++ b/support/texlab/crates/parser/src/test_data/latex/include/tikz_library_import_simple.txt
diff --git a/support/texlab/src/parser/test_data/latex/include/verbatim_include_simple.txt b/support/texlab/crates/parser/src/test_data/latex/include/verbatim_include_simple.txt
index a0b3fec843..a0b3fec843 100644
--- a/support/texlab/src/parser/test_data/latex/include/verbatim_include_simple.txt
+++ b/support/texlab/crates/parser/src/test_data/latex/include/verbatim_include_simple.txt
diff --git a/support/texlab/src/parser/test_data/latex/inline.txt b/support/texlab/crates/parser/src/test_data/latex/inline.txt
index 81a429dc26..81a429dc26 100644
--- a/support/texlab/src/parser/test_data/latex/inline.txt
+++ b/support/texlab/crates/parser/src/test_data/latex/inline.txt
diff --git a/support/texlab/src/parser/test_data/latex/inline_double_dollar.txt b/support/texlab/crates/parser/src/test_data/latex/inline_double_dollar.txt
index c3a7fee9f6..c3a7fee9f6 100644
--- a/support/texlab/src/parser/test_data/latex/inline_double_dollar.txt
+++ b/support/texlab/crates/parser/src/test_data/latex/inline_double_dollar.txt
diff --git a/support/texlab/src/parser/test_data/latex/issue_745.txt b/support/texlab/crates/parser/src/test_data/latex/issue_745.txt
index 4cbebeb2d8..4cbebeb2d8 100644
--- a/support/texlab/src/parser/test_data/latex/issue_745.txt
+++ b/support/texlab/crates/parser/src/test_data/latex/issue_745.txt
diff --git a/support/texlab/src/parser/test_data/latex/issue_789.txt b/support/texlab/crates/parser/src/test_data/latex/issue_789.txt
index 612c6de786..612c6de786 100644
--- a/support/texlab/src/parser/test_data/latex/issue_789.txt
+++ b/support/texlab/crates/parser/src/test_data/latex/issue_789.txt
diff --git a/support/texlab/src/parser/test_data/latex/issue_853.txt b/support/texlab/crates/parser/src/test_data/latex/issue_853.txt
index 312889717c..312889717c 100644
--- a/support/texlab/src/parser/test_data/latex/issue_853.txt
+++ b/support/texlab/crates/parser/src/test_data/latex/issue_853.txt
diff --git a/support/texlab/src/parser/test_data/latex/issue_857.txt b/support/texlab/crates/parser/src/test_data/latex/issue_857.txt
index 0640263c84..0640263c84 100644
--- a/support/texlab/src/parser/test_data/latex/issue_857.txt
+++ b/support/texlab/crates/parser/src/test_data/latex/issue_857.txt
diff --git a/support/texlab/crates/parser/src/test_data/latex/issue_874.txt b/support/texlab/crates/parser/src/test_data/latex/issue_874.txt
new file mode 100644
index 0000000000..adb3e438a2
--- /dev/null
+++ b/support/texlab/crates/parser/src/test_data/latex/issue_874.txt
@@ -0,0 +1 @@
+\includegraphics[scale=0.2]{7.4).jpg} \ No newline at end of file
diff --git a/support/texlab/src/parser/test_data/latex/label/label_definition_line_break.txt b/support/texlab/crates/parser/src/test_data/latex/label/label_definition_line_break.txt
index d567c6d25a..d567c6d25a 100644
--- a/support/texlab/src/parser/test_data/latex/label/label_definition_line_break.txt
+++ b/support/texlab/crates/parser/src/test_data/latex/label/label_definition_line_break.txt
diff --git a/support/texlab/src/parser/test_data/latex/label/label_definition_simple.txt b/support/texlab/crates/parser/src/test_data/latex/label/label_definition_simple.txt
index 43ebaf1cec..43ebaf1cec 100644
--- a/support/texlab/src/parser/test_data/latex/label/label_definition_simple.txt
+++ b/support/texlab/crates/parser/src/test_data/latex/label/label_definition_simple.txt
diff --git a/support/texlab/src/parser/test_data/latex/label/label_number.txt b/support/texlab/crates/parser/src/test_data/latex/label/label_number.txt
index 6e994af500..6e994af500 100644
--- a/support/texlab/src/parser/test_data/latex/label/label_number.txt
+++ b/support/texlab/crates/parser/src/test_data/latex/label/label_number.txt
diff --git a/support/texlab/src/parser/test_data/latex/label/label_reference_equation.txt b/support/texlab/crates/parser/src/test_data/latex/label/label_reference_equation.txt
index ab386645df..ab386645df 100644
--- a/support/texlab/src/parser/test_data/latex/label/label_reference_equation.txt
+++ b/support/texlab/crates/parser/src/test_data/latex/label/label_reference_equation.txt
diff --git a/support/texlab/src/parser/test_data/latex/label/label_reference_incomplete.txt b/support/texlab/crates/parser/src/test_data/latex/label/label_reference_incomplete.txt
index 1d0f79ec8e..1d0f79ec8e 100644
--- a/support/texlab/src/parser/test_data/latex/label/label_reference_incomplete.txt
+++ b/support/texlab/crates/parser/src/test_data/latex/label/label_reference_incomplete.txt
diff --git a/support/texlab/src/parser/test_data/latex/label/label_reference_multiple.txt b/support/texlab/crates/parser/src/test_data/latex/label/label_reference_multiple.txt
index e8bb38ee9e..e8bb38ee9e 100644
--- a/support/texlab/src/parser/test_data/latex/label/label_reference_multiple.txt
+++ b/support/texlab/crates/parser/src/test_data/latex/label/label_reference_multiple.txt
diff --git a/support/texlab/src/parser/test_data/latex/label/label_reference_range_error.txt b/support/texlab/crates/parser/src/test_data/latex/label/label_reference_range_error.txt
index 9213da0460..9213da0460 100644
--- a/support/texlab/src/parser/test_data/latex/label/label_reference_range_error.txt
+++ b/support/texlab/crates/parser/src/test_data/latex/label/label_reference_range_error.txt
diff --git a/support/texlab/src/parser/test_data/latex/label/label_reference_range_incomplete.txt b/support/texlab/crates/parser/src/test_data/latex/label/label_reference_range_incomplete.txt
index 841133d73a..841133d73a 100644
--- a/support/texlab/src/parser/test_data/latex/label/label_reference_range_incomplete.txt
+++ b/support/texlab/crates/parser/src/test_data/latex/label/label_reference_range_incomplete.txt
diff --git a/support/texlab/src/parser/test_data/latex/label/label_reference_range_simple.txt b/support/texlab/crates/parser/src/test_data/latex/label/label_reference_range_simple.txt
index a0e985ea88..a0e985ea88 100644
--- a/support/texlab/src/parser/test_data/latex/label/label_reference_range_simple.txt
+++ b/support/texlab/crates/parser/src/test_data/latex/label/label_reference_range_simple.txt
diff --git a/support/texlab/src/parser/test_data/latex/label/label_reference_simple.txt b/support/texlab/crates/parser/src/test_data/latex/label/label_reference_simple.txt
index dde4f444f4..dde4f444f4 100644
--- a/support/texlab/src/parser/test_data/latex/label/label_reference_simple.txt
+++ b/support/texlab/crates/parser/src/test_data/latex/label/label_reference_simple.txt
diff --git a/support/texlab/src/parser/test_data/latex/parameter.txt b/support/texlab/crates/parser/src/test_data/latex/parameter.txt
index d44ac7b947..d44ac7b947 100644
--- a/support/texlab/src/parser/test_data/latex/parameter.txt
+++ b/support/texlab/crates/parser/src/test_data/latex/parameter.txt
diff --git a/support/texlab/src/parser/test_data/latex/parameter_error.txt b/support/texlab/crates/parser/src/test_data/latex/parameter_error.txt
index 4287ca8617..4287ca8617 100644
--- a/support/texlab/src/parser/test_data/latex/parameter_error.txt
+++ b/support/texlab/crates/parser/src/test_data/latex/parameter_error.txt
diff --git a/support/texlab/src/parser/test_data/latex/structure/structure_enum_item.txt b/support/texlab/crates/parser/src/test_data/latex/structure/structure_enum_item.txt
index 3288ec259b..3288ec259b 100644
--- a/support/texlab/src/parser/test_data/latex/structure/structure_enum_item.txt
+++ b/support/texlab/crates/parser/src/test_data/latex/structure/structure_enum_item.txt
diff --git a/support/texlab/src/parser/test_data/latex/structure/structure_invalid_nesting.txt b/support/texlab/crates/parser/src/test_data/latex/structure/structure_invalid_nesting.txt
index 7203dd2d24..7203dd2d24 100644
--- a/support/texlab/src/parser/test_data/latex/structure/structure_invalid_nesting.txt
+++ b/support/texlab/crates/parser/src/test_data/latex/structure/structure_invalid_nesting.txt
diff --git a/support/texlab/src/parser/test_data/latex/structure/structure_nested.txt b/support/texlab/crates/parser/src/test_data/latex/structure/structure_nested.txt
index 082f10765b..082f10765b 100644
--- a/support/texlab/src/parser/test_data/latex/structure/structure_nested.txt
+++ b/support/texlab/crates/parser/src/test_data/latex/structure/structure_nested.txt
diff --git a/support/texlab/src/parser/test_data/latex/structure/structure_siblings.txt b/support/texlab/crates/parser/src/test_data/latex/structure/structure_siblings.txt
index d8e347c429..d8e347c429 100644
--- a/support/texlab/src/parser/test_data/latex/structure/structure_siblings.txt
+++ b/support/texlab/crates/parser/src/test_data/latex/structure/structure_siblings.txt
diff --git a/support/texlab/src/parser/test_data/latex/theorem_definition/theorem_definition_full.txt b/support/texlab/crates/parser/src/test_data/latex/theorem_definition/theorem_definition_full.txt
index 286d111ad1..286d111ad1 100644
--- a/support/texlab/src/parser/test_data/latex/theorem_definition/theorem_definition_full.txt
+++ b/support/texlab/crates/parser/src/test_data/latex/theorem_definition/theorem_definition_full.txt
diff --git a/support/texlab/src/parser/test_data/latex/theorem_definition/theorem_definition_name_with_counter.txt b/support/texlab/crates/parser/src/test_data/latex/theorem_definition/theorem_definition_name_with_counter.txt
index af1b6903a5..af1b6903a5 100644
--- a/support/texlab/src/parser/test_data/latex/theorem_definition/theorem_definition_name_with_counter.txt
+++ b/support/texlab/crates/parser/src/test_data/latex/theorem_definition/theorem_definition_name_with_counter.txt
diff --git a/support/texlab/src/parser/test_data/latex/theorem_definition/theorem_definition_name_with_description.txt b/support/texlab/crates/parser/src/test_data/latex/theorem_definition/theorem_definition_name_with_description.txt
index e5d6551666..e5d6551666 100644
--- a/support/texlab/src/parser/test_data/latex/theorem_definition/theorem_definition_name_with_description.txt
+++ b/support/texlab/crates/parser/src/test_data/latex/theorem_definition/theorem_definition_name_with_description.txt
diff --git a/support/texlab/src/parser/test_data/latex/theorem_definition/theorem_definition_name_with_description_and_counter.txt b/support/texlab/crates/parser/src/test_data/latex/theorem_definition/theorem_definition_name_with_description_and_counter.txt
index 89c37d9497..89c37d9497 100644
--- a/support/texlab/src/parser/test_data/latex/theorem_definition/theorem_definition_name_with_description_and_counter.txt
+++ b/support/texlab/crates/parser/src/test_data/latex/theorem_definition/theorem_definition_name_with_description_and_counter.txt
diff --git a/support/texlab/src/parser/test_data/latex/theorem_definition/theorem_definition_only_name.txt b/support/texlab/crates/parser/src/test_data/latex/theorem_definition/theorem_definition_only_name.txt
index 62adb2c4b9..62adb2c4b9 100644
--- a/support/texlab/src/parser/test_data/latex/theorem_definition/theorem_definition_only_name.txt
+++ b/support/texlab/crates/parser/src/test_data/latex/theorem_definition/theorem_definition_only_name.txt
diff --git a/support/texlab/crates/syntax/Cargo.toml b/support/texlab/crates/syntax/Cargo.toml
new file mode 100644
index 0000000000..92c334c7f2
--- /dev/null
+++ b/support/texlab/crates/syntax/Cargo.toml
@@ -0,0 +1,14 @@
+[package]
+name = "syntax"
+version = "0.0.0"
+license.workspace = true
+authors.workspace = true
+edition.workspace = true
+rust-version.workspace = true
+
+[dependencies]
+itertools = "0.10.5"
+rowan = "0.15.11"
+
+[lib]
+doctest = false
diff --git a/support/texlab/src/syntax/bibtex.rs b/support/texlab/crates/syntax/src/bibtex.rs
index 9b4b1ab77e..9b4b1ab77e 100644
--- a/support/texlab/src/syntax/bibtex.rs
+++ b/support/texlab/crates/syntax/src/bibtex.rs
diff --git a/support/texlab/src/syntax/latex.rs b/support/texlab/crates/syntax/src/latex.rs
index ce1ca125fd..ce1ca125fd 100644
--- a/support/texlab/src/syntax/latex.rs
+++ b/support/texlab/crates/syntax/src/latex.rs
diff --git a/support/texlab/src/syntax/latex/cst.rs b/support/texlab/crates/syntax/src/latex/cst.rs
index 767aa50ecc..767aa50ecc 100644
--- a/support/texlab/src/syntax/latex/cst.rs
+++ b/support/texlab/crates/syntax/src/latex/cst.rs
diff --git a/support/texlab/src/syntax/latex/kind.rs b/support/texlab/crates/syntax/src/latex/kind.rs
index 3eadc90b48..3eadc90b48 100644
--- a/support/texlab/src/syntax/latex/kind.rs
+++ b/support/texlab/crates/syntax/src/latex/kind.rs
diff --git a/support/texlab/src/syntax.rs b/support/texlab/crates/syntax/src/lib.rs
index dc8761b73d..c2c0552652 100644
--- a/support/texlab/src/syntax.rs
+++ b/support/texlab/crates/syntax/src/lib.rs
@@ -20,3 +20,16 @@ pub struct BuildError {
pub struct BuildLog {
pub errors: Vec<BuildError>,
}
+
+#[macro_export]
+macro_rules! match_ast {
+ (match $node:ident { $($tt:tt)* }) => { $crate::match_ast!(match ($node) { $($tt)* }) };
+
+ (match ($node:expr) {
+ $( $( $path:ident )::+ ($it:pat) => $res:expr, )*
+ _ => $catch_all:expr $(,)?
+ }) => {{
+ $( if let Some($it) = $($path::)+cast($node.clone()) { $res } else )*
+ { $catch_all }
+ }};
+}
diff --git a/support/texlab/crates/texlab/Cargo.toml b/support/texlab/crates/texlab/Cargo.toml
new file mode 100644
index 0000000000..09fff5f6db
--- /dev/null
+++ b/support/texlab/crates/texlab/Cargo.toml
@@ -0,0 +1,78 @@
+[package]
+name = "texlab"
+description = "LaTeX Language Server"
+version = "5.4.2"
+license.workspace = true
+readme = "README.md"
+authors.workspace = true
+edition.workspace = true
+rust-version.workspace = true
+homepage = "https://github.com/latex-lsp/texlab"
+repository = "https://github.com/latex-lsp/texlab"
+documentation = "https://github.com/latex-lsp/texlab"
+keywords = ["lsp", "server", "latex", "bibtex"]
+categories = ["development-tools"]
+exclude = [
+ ".gitattributes",
+ ".gitignore",
+ ".github/**",
+ "tests/it/**",
+ "*.snap",
+ "texlab.1",
+ "texlab.pdf",
+ "texlab.tex",
+]
+
+[[bin]]
+name = "texlab"
+test = false
+
+[lib]
+doctest = false
+
+[dependencies]
+anyhow = "1.0.70"
+base-db = { path = "../base-db" }
+citeproc = { path = "../citeproc" }
+clap = { version = "4.2.1", features = ["derive"] }
+crossbeam-channel = "0.5.8"
+dashmap = "5.4.0"
+dirs = "5.0.0"
+distro = { path = "../distro" }
+encoding_rs = "0.8.32"
+encoding_rs_io = "0.1.7"
+fern = "0.6.2"
+flate2 = "1.0.25"
+fuzzy-matcher = { version = "0.3.7", features = ["compact"] }
+human_name = { version = "2.0.1", default-features = false }
+itertools = "0.10.5"
+log = "0.4.17"
+lsp-server = "0.7.0"
+lsp-types = "0.94.0"
+notify = "5.1.0"
+once_cell = "1.17.1"
+parking_lot = "0.12.1"
+parser = { path = "../parser" }
+regex = "1.7.3"
+rowan = "0.15.11"
+rustc-hash = "1.1.0"
+serde = "1.0.159"
+serde_json = "1.0.95"
+serde_regex = "1.1.0"
+serde_repr = "0.1.12"
+smol_str = { version = "0.1.24", features = ["serde"] }
+syntax = { path = "../syntax" }
+tempfile = "3.5.0"
+thiserror = "1.0.40"
+threadpool = "1.8.1"
+titlecase = "2.2.1"
+
+[dev-dependencies]
+assert_unordered = "0.3.5"
+criterion = { version = "0.4.0" }
+insta = { version = "1.28.0", features = ["glob", "redactions", "json"] }
+
+[[bench]]
+name = "bench_main"
+path = "benches/bench_main.rs"
+harness = false
diff --git a/support/texlab/crates/texlab/benches/bench_main.rs b/support/texlab/crates/texlab/benches/bench_main.rs
new file mode 100644
index 0000000000..d9e4937dbd
--- /dev/null
+++ b/support/texlab/crates/texlab/benches/bench_main.rs
@@ -0,0 +1,43 @@
+use base_db::{Owner, Workspace};
+use criterion::{black_box, criterion_group, criterion_main, Criterion};
+use distro::Language;
+use lsp_types::{ClientCapabilities, Position, Url};
+use parser::parse_latex;
+use rowan::TextSize;
+
+const CODE: &str = include_str!("../../../texlab.tex");
+
+fn criterion_benchmark(c: &mut Criterion) {
+ c.bench_function("LaTeX/Parser", |b| {
+ b.iter(|| parse_latex(black_box(CODE)));
+ });
+
+ c.bench_function("LaTeX/Completion/Command", |b| {
+ let uri = Url::parse("http://example.com/texlab.tex").unwrap();
+ let text = CODE.to_string();
+ let mut workspace = Workspace::default();
+ workspace.open(
+ uri.clone(),
+ text,
+ Language::Tex,
+ Owner::Client,
+ TextSize::default(),
+ );
+
+ let client_capabilities = ClientCapabilities::default();
+
+ b.iter(|| {
+ texlab::features::completion::complete(
+ &workspace,
+ &uri,
+ Position::new(0, 1),
+ &client_capabilities,
+ None,
+ )
+ });
+ });
+}
+
+criterion_group!(benches, criterion_benchmark);
+
+criterion_main!(benches);
diff --git a/support/texlab/data/components.json.gz b/support/texlab/crates/texlab/data/components.json.gz
index b355f616ec..b355f616ec 100644
--- a/support/texlab/data/components.json.gz
+++ b/support/texlab/crates/texlab/data/components.json.gz
Binary files differ
diff --git a/support/texlab/data/lang_data.json b/support/texlab/crates/texlab/data/lang_data.json
index 3e22e41320..3e22e41320 100644
--- a/support/texlab/data/lang_data.json
+++ b/support/texlab/crates/texlab/data/lang_data.json
diff --git a/support/texlab/src/client.rs b/support/texlab/crates/texlab/src/client.rs
index 0439445092..0439445092 100644
--- a/support/texlab/src/client.rs
+++ b/support/texlab/crates/texlab/src/client.rs
diff --git a/support/texlab/src/features.rs b/support/texlab/crates/texlab/src/features.rs
index 0d82bcb4f4..0d82bcb4f4 100644
--- a/support/texlab/src/features.rs
+++ b/support/texlab/crates/texlab/src/features.rs
diff --git a/support/texlab/src/features/build.rs b/support/texlab/crates/texlab/src/features/build.rs
index 83a1d4cb32..a37fe65bf8 100644
--- a/support/texlab/src/features/build.rs
+++ b/support/texlab/crates/texlab/src/features/build.rs
@@ -7,12 +7,15 @@ use std::{
thread::{self, JoinHandle},
};
+use base_db::Workspace;
use encoding_rs_io::DecodeReaderBytesBuilder;
-use lsp_types::{notification::LogMessage, LogMessageParams, TextDocumentIdentifier, Url};
+use lsp_types::{
+ notification::LogMessage, ClientCapabilities, LogMessageParams, TextDocumentIdentifier, Url,
+};
use serde::{Deserialize, Serialize};
use serde_repr::{Deserialize_repr, Serialize_repr};
-use crate::{client::LspClient, db::Workspace, util::capabilities::ClientCapabilitiesExt, Db};
+use crate::{client::LspClient, util::capabilities::ClientCapabilitiesExt};
#[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
@@ -46,42 +49,34 @@ pub struct Command {
}
impl Command {
- pub fn new(db: &dyn Db, uri: Url, client: LspClient) -> Option<Self> {
- let workspace = Workspace::get(db);
- let document = match workspace.lookup_uri(db, &uri) {
- Some(child) => workspace
- .parents(db, child)
- .iter()
- .next()
- .copied()
- .unwrap_or(child),
- None => return None,
- };
-
- if document.location(db).path(db).is_none() {
+ pub fn new(
+ workspace: &Workspace,
+ uri: Url,
+ client: LspClient,
+ client_capabilities: &ClientCapabilities,
+ ) -> Option<Self> {
+ let Some(document) = workspace
+ .lookup(&uri)
+ .map(|child| workspace.parents(child).into_iter().next().unwrap_or(child)) else { return None };
+
+ let Some(path) = document.path.as_deref() else {
log::warn!("Document {uri} cannot be compiled; skipping...");
return None;
- }
+ };
- let config = &db.config().build;
+ let config = &workspace.config().build;
let program = config.program.clone();
- let path = document.location(db).path(db).as_deref().unwrap();
let args = config
.args
.iter()
.map(|arg| replace_placeholder(arg, path))
.collect();
- let working_dir = workspace
- .working_dir(db, document.directory(db))
- .path(db)
- .clone()?;
+ let working_dir = workspace.current_dir(&document.dir).to_file_path().ok()?;
Some(Self {
- uri: document.location(db).uri(db).clone(),
- progress: workspace
- .client_capabilities(db)
- .has_work_done_progress_support(),
+ uri: document.uri.clone(),
+ progress: client_capabilities.has_work_done_progress_support(),
program,
args,
working_dir,
@@ -118,30 +113,16 @@ impl Command {
}
};
- let (line_sender, line_receiver) = flume::unbounded();
- let (exit_sender, exit_receiver) = flume::unbounded();
- track_output(process.stderr.take().unwrap(), line_sender.clone());
- track_output(process.stdout.take().unwrap(), line_sender);
+ let (sender, receiver) = crossbeam_channel::unbounded();
+ track_output(process.stderr.take().unwrap(), sender.clone());
+ track_output(process.stdout.take().unwrap(), sender.clone());
let client = self.client.clone();
let handle = std::thread::spawn(move || {
let typ = lsp_types::MessageType::LOG;
- loop {
- let done = flume::Selector::new()
- .recv(&line_receiver, |line| match line {
- Ok(message) => {
- let params = LogMessageParams { message, typ };
- let _ = client.send_notification::<LogMessage>(params);
- false
- }
- Err(_) => true,
- })
- .recv(&exit_receiver, |_| true)
- .wait();
-
- if done {
- break;
- }
+ while let Ok(Some(message)) = receiver.recv() {
+ let params = LogMessageParams { message, typ };
+ let _ = client.send_notification::<LogMessage>(params);
}
});
@@ -153,7 +134,7 @@ impl Command {
}
});
- let _ = exit_sender.send(());
+ let _ = sender.send(None);
handle.join().unwrap();
drop(reporter);
@@ -163,7 +144,7 @@ impl Command {
fn track_output(
output: impl Read + Send + 'static,
- sender: flume::Sender<String>,
+ sender: crossbeam_channel::Sender<Option<String>>,
) -> JoinHandle<()> {
let reader = BufReader::new(
DecodeReaderBytesBuilder::new()
@@ -177,7 +158,7 @@ fn track_output(
let _ = reader
.lines()
.flatten()
- .try_for_each(|line| sender.send(line));
+ .try_for_each(|line| sender.send(Some(line)));
})
}
diff --git a/support/texlab/src/features/build/progress.rs b/support/texlab/crates/texlab/src/features/build/progress.rs
index 6f235bebd6..6f235bebd6 100644
--- a/support/texlab/src/features/build/progress.rs
+++ b/support/texlab/crates/texlab/src/features/build/progress.rs
diff --git a/support/texlab/src/features/completion.rs b/support/texlab/crates/texlab/src/features/completion.rs
index 949b5552e5..61528057a5 100644
--- a/support/texlab/src/features/completion.rs
+++ b/support/texlab/crates/texlab/src/features/completion.rs
@@ -18,15 +18,22 @@ mod tikz_library;
mod user_command;
mod user_environment;
-use lsp_types::{CompletionList, Position, Url};
+use base_db::Workspace;
+use lsp_types::{ClientCapabilities, ClientInfo, CompletionList, Position, Url};
-use crate::{features::completion::builder::CompletionBuilder, util::cursor::CursorContext, Db};
+use crate::{features::completion::builder::CompletionBuilder, util::cursor::CursorContext};
pub const COMPLETION_LIMIT: usize = 50;
-pub fn complete(db: &dyn Db, uri: &Url, position: Position) -> Option<CompletionList> {
- let context = CursorContext::new(db, uri, position, ())?;
- let mut builder = CompletionBuilder::new(&context);
+pub fn complete(
+ workspace: &Workspace,
+ uri: &Url,
+ position: Position,
+ client_capabilities: &ClientCapabilities,
+ client_info: Option<&ClientInfo>,
+) -> Option<CompletionList> {
+ let context = CursorContext::new(workspace, uri, position, ())?;
+ let mut builder = CompletionBuilder::new(&context, client_capabilities, client_info);
log::debug!("[Completion] Cursor: {:?}", context.cursor);
entry_type::complete(&context, &mut builder);
field::complete(&context, &mut builder);
diff --git a/support/texlab/crates/texlab/src/features/completion/acronym_ref.rs b/support/texlab/crates/texlab/src/features/completion/acronym_ref.rs
new file mode 100644
index 0000000000..3337ed542e
--- /dev/null
+++ b/support/texlab/crates/texlab/src/features/completion/acronym_ref.rs
@@ -0,0 +1,31 @@
+use base_db::DocumentData;
+use rowan::ast::AstNode;
+use syntax::latex;
+
+use crate::util::cursor::CursorContext;
+
+use super::builder::CompletionBuilder;
+
+pub fn complete<'db>(
+ context: &'db CursorContext,
+ builder: &mut CompletionBuilder<'db>,
+) -> Option<()> {
+ let (_, range, group) = context.find_curly_group_word()?;
+ latex::AcronymReference::cast(group.syntax().parent()?)?;
+
+ for document in &context.project.documents {
+ let DocumentData::Tex(data) = &document.data else { continue };
+
+ for name in data
+ .root_node()
+ .descendants()
+ .filter_map(latex::AcronymDefinition::cast)
+ .filter_map(|node| node.name())
+ .filter_map(|name| name.key())
+ {
+ builder.glossary_entry(range, name.to_string());
+ }
+ }
+
+ Some(())
+}
diff --git a/support/texlab/src/features/completion/argument.rs b/support/texlab/crates/texlab/src/features/completion/argument.rs
index 10b377cb0e..ae4cb98471 100644
--- a/support/texlab/src/features/completion/argument.rs
+++ b/support/texlab/crates/texlab/src/features/completion/argument.rs
@@ -1,16 +1,11 @@
use rowan::{ast::AstNode, TextRange};
+use syntax::latex;
-use crate::{
- syntax::latex,
- util::{components::COMPONENT_DATABASE, cursor::CursorContext},
-};
+use crate::util::{components::COMPONENT_DATABASE, cursor::CursorContext};
use super::builder::CompletionBuilder;
-pub fn complete<'db>(
- context: &'db CursorContext,
- builder: &mut CompletionBuilder<'db>,
-) -> Option<()> {
+pub fn complete<'a>(context: &'a CursorContext, builder: &mut CompletionBuilder<'a>) -> Option<()> {
let token = context.cursor.as_tex()?;
let range = if token.kind() == latex::WORD {
@@ -39,7 +34,7 @@ pub fn complete<'db>(
let command_name = command.name()?;
let command_name = &command_name.text()[1..];
- for component in COMPONENT_DATABASE.linked_components(context.db, context.document) {
+ for component in COMPONENT_DATABASE.linked_components(&context.project) {
for component_command in component
.commands
.iter()
diff --git a/support/texlab/src/features/completion/begin_snippet.rs b/support/texlab/crates/texlab/src/features/completion/begin_snippet.rs
index 06be4faf13..06be4faf13 100644
--- a/support/texlab/src/features/completion/begin_snippet.rs
+++ b/support/texlab/crates/texlab/src/features/completion/begin_snippet.rs
diff --git a/support/texlab/src/features/completion/builder.rs b/support/texlab/crates/texlab/src/features/completion/builder.rs
index 0373587a06..a503fc6e1c 100644
--- a/support/texlab/src/features/completion/builder.rs
+++ b/support/texlab/crates/texlab/src/features/completion/builder.rs
@@ -1,46 +1,49 @@
+use base_db::Document;
use fuzzy_matcher::{skim::SkimMatcherV2, FuzzyMatcher};
use itertools::Itertools;
use lsp_types::{
- CompletionItem, CompletionItemKind, CompletionList, CompletionTextEdit, Documentation,
- InsertTextFormat, MarkupContent, MarkupKind, TextEdit, Url,
+ ClientCapabilities, ClientInfo, CompletionItem, CompletionItemKind, CompletionList,
+ CompletionTextEdit, Documentation, InsertTextFormat, MarkupContent, MarkupKind, TextEdit, Url,
};
use once_cell::sync::Lazy;
use regex::Regex;
use rowan::{ast::AstNode, TextRange, TextSize};
use serde::{Deserialize, Serialize};
use smol_str::SmolStr;
+use syntax::{
+ bibtex::{self, HasName, HasType},
+ latex,
+};
-use crate::{
- db::{Document, ServerContext, Workspace},
- syntax::{
- bibtex::{self, HasName, HasType},
- latex,
- },
- util::{
- capabilities::ClientCapabilitiesExt,
- cursor::{Cursor, CursorContext},
- lang_data::{BibtexEntryTypeCategory, BibtexEntryTypeDoc, BibtexFieldDoc, LANGUAGE_DATA},
- line_index_ext::LineIndexExt,
- lsp_enums::Structure,
- },
+use crate::util::{
+ capabilities::ClientCapabilitiesExt,
+ cursor::{Cursor, CursorContext},
+ lang_data::{BibtexEntryTypeCategory, BibtexEntryTypeDoc, BibtexFieldDoc, LANGUAGE_DATA},
+ line_index_ext::LineIndexExt,
+ lsp_enums::Structure,
};
use super::COMPLETION_LIMIT;
-pub struct CompletionBuilder<'db> {
- context: &'db CursorContext<'db>,
- items: Vec<Item<'db>>,
+pub struct CompletionBuilder<'a> {
+ context: &'a CursorContext<'a>,
+ items: Vec<Item<'a>>,
matcher: SkimMatcherV2,
text_pattern: String,
file_pattern: String,
preselect: Option<String>,
snippets: bool,
markdown: bool,
- item_kinds: &'db [CompletionItemKind],
+ item_kinds: &'a [CompletionItemKind],
+ always_incomplete: bool,
}
-impl<'db> CompletionBuilder<'db> {
- pub fn new(context: &'db CursorContext) -> Self {
+impl<'a> CompletionBuilder<'a> {
+ pub fn new(
+ context: &'a CursorContext,
+ client_capabilities: &'a ClientCapabilities,
+ client_info: Option<&'a ClientInfo>,
+ ) -> Self {
let items = Vec::new();
let matcher = SkimMatcherV2::default().ignore_case();
let text_pattern = match &context.cursor {
@@ -94,7 +97,6 @@ impl<'db> CompletionBuilder<'db> {
.and_then(|name| name.key())
.map(|name| name.to_string());
- let client_capabilities = context.workspace.client_capabilities(context.db);
let snippets = client_capabilities.has_snippet_support();
let markdown = client_capabilities.has_completion_markdown_support();
let item_kinds = client_capabilities
@@ -105,6 +107,8 @@ impl<'db> CompletionBuilder<'db> {
.and_then(|cap| cap.value_set.as_deref())
.unwrap_or_default();
+ let always_incomplete = client_info.map_or(false, |info| info.name == "Visual Studio Code");
+
Self {
context,
items,
@@ -115,6 +119,7 @@ impl<'db> CompletionBuilder<'db> {
snippets,
markdown,
item_kinds,
+ always_incomplete,
}
}
@@ -133,8 +138,8 @@ impl<'db> CompletionBuilder<'db> {
pub fn generic_argument(
&mut self,
range: TextRange,
- name: &'db str,
- image: Option<&'db str>,
+ name: &'a str,
+ image: Option<&'a str>,
) -> Option<()> {
let score = self.matcher.fuzzy_match(name, &self.text_pattern)?;
self.items.push(Item {
@@ -148,8 +153,7 @@ impl<'db> CompletionBuilder<'db> {
}
pub fn begin_snippet(&mut self, range: TextRange) -> Option<()> {
- let capabilities = Workspace::get(self.context.db).client_capabilities(self.context.db);
- if capabilities.has_snippet_support() {
+ if self.snippets {
let score = self.matcher.fuzzy_match("begin", &self.text_pattern[1..])?;
self.items.push(Item {
range,
@@ -165,7 +169,7 @@ impl<'db> CompletionBuilder<'db> {
pub fn citation(
&mut self,
range: TextRange,
- document: Document,
+ document: &'a Document,
entry: &bibtex::Entry,
) -> Option<()> {
let key = entry.name_token()?.to_string();
@@ -202,7 +206,7 @@ impl<'db> CompletionBuilder<'db> {
Some(())
}
- pub fn color_model(&mut self, range: TextRange, name: &'db str) -> Option<()> {
+ pub fn color_model(&mut self, range: TextRange, name: &'a str) -> Option<()> {
let score = self.matcher.fuzzy_match(name, &self.text_pattern)?;
self.items.push(Item {
range,
@@ -214,7 +218,7 @@ impl<'db> CompletionBuilder<'db> {
Some(())
}
- pub fn color(&mut self, range: TextRange, name: &'db str) -> Option<()> {
+ pub fn color(&mut self, range: TextRange, name: &'a str) -> Option<()> {
let score = self.matcher.fuzzy_match(name, &self.text_pattern)?;
self.items.push(Item {
range,
@@ -229,10 +233,10 @@ impl<'db> CompletionBuilder<'db> {
pub fn component_command(
&mut self,
range: TextRange,
- name: &'db str,
- image: Option<&'db str>,
- glyph: Option<&'db str>,
- file_names: &'db [SmolStr],
+ name: &'a str,
+ image: Option<&'a str>,
+ glyph: Option<&'a str>,
+ file_names: &'a [SmolStr],
) -> Option<()> {
let score = self.matcher.fuzzy_match(name, &self.text_pattern[1..])?;
let data = Data::ComponentCommand {
@@ -255,8 +259,8 @@ impl<'db> CompletionBuilder<'db> {
pub fn component_environment(
&mut self,
range: TextRange,
- name: &'db str,
- file_names: &'db [SmolStr],
+ name: &'a str,
+ file_names: &'a [SmolStr],
) -> Option<()> {
let score = self.matcher.fuzzy_match(name, &self.text_pattern)?;
self.items.push(Item {
@@ -272,7 +276,7 @@ impl<'db> CompletionBuilder<'db> {
pub fn entry_type(
&mut self,
range: TextRange,
- entry_type: &'db BibtexEntryTypeDoc,
+ entry_type: &'a BibtexEntryTypeDoc,
) -> Option<()> {
let score = self
.matcher
@@ -288,7 +292,7 @@ impl<'db> CompletionBuilder<'db> {
Some(())
}
- pub fn field(&mut self, range: TextRange, field: &'db BibtexFieldDoc) -> Option<()> {
+ pub fn field(&mut self, range: TextRange, field: &'a BibtexFieldDoc) -> Option<()> {
let score = self.matcher.fuzzy_match(&field.name, &self.text_pattern)?;
self.items.push(Item {
range,
@@ -300,7 +304,7 @@ impl<'db> CompletionBuilder<'db> {
Some(())
}
- pub fn class(&mut self, range: TextRange, name: &'db str) -> Option<()> {
+ pub fn class(&mut self, range: TextRange, name: &'a str) -> Option<()> {
let score = self.matcher.fuzzy_match(name, &self.text_pattern)?;
self.items.push(Item {
range,
@@ -312,7 +316,7 @@ impl<'db> CompletionBuilder<'db> {
Some(())
}
- pub fn package(&mut self, range: TextRange, name: &'db str) -> Option<()> {
+ pub fn package(&mut self, range: TextRange, name: &'a str) -> Option<()> {
let score = self.matcher.fuzzy_match(name, &self.text_pattern)?;
self.items.push(Item {
range,
@@ -351,10 +355,10 @@ impl<'db> CompletionBuilder<'db> {
pub fn label(
&mut self,
range: TextRange,
- name: &'db str,
+ name: &'a str,
kind: Structure,
header: Option<String>,
- footer: Option<String>,
+ footer: Option<&'a str>,
text: String,
) -> Option<()> {
let score = self.matcher.fuzzy_match(&text, &self.text_pattern)?;
@@ -374,7 +378,7 @@ impl<'db> CompletionBuilder<'db> {
Some(())
}
- pub fn tikz_library(&mut self, range: TextRange, name: &'db str) -> Option<()> {
+ pub fn tikz_library(&mut self, range: TextRange, name: &'a str) -> Option<()> {
let score = self.matcher.fuzzy_match(name, &self.text_pattern)?;
self.items.push(Item {
range,
@@ -386,7 +390,7 @@ impl<'db> CompletionBuilder<'db> {
Some(())
}
- pub fn user_command(&mut self, range: TextRange, name: &'db str) -> Option<()> {
+ pub fn user_command(&mut self, range: TextRange, name: &'a str) -> Option<()> {
let score = self.matcher.fuzzy_match(name, &self.text_pattern[1..])?;
self.items.push(Item {
range,
@@ -398,7 +402,7 @@ impl<'db> CompletionBuilder<'db> {
Some(())
}
- pub fn user_environment(&mut self, range: TextRange, name: &'db str) -> Option<()> {
+ pub fn user_environment(&mut self, range: TextRange, name: &'a str) -> Option<()> {
let score = self.matcher.fuzzy_match(name, &self.text_pattern)?;
self.items.push(Item {
range,
@@ -426,14 +430,17 @@ impl<'db> CompletionBuilder<'db> {
.map(|(i, item)| self.convert_item(item, i))
.collect();
- let db = self.context.db;
- let always_incomplete = ServerContext::get(db).always_incomplete_completion_list(db);
- list.is_incomplete = always_incomplete || list.items.len() >= COMPLETION_LIMIT;
+ list.is_incomplete = self.always_incomplete || list.items.len() >= COMPLETION_LIMIT;
list
}
fn convert_item(&self, item: Item, index: usize) -> CompletionItem {
- let range = self.context.line_index.line_col_lsp_range(item.range);
+ let range = self
+ .context
+ .document
+ .line_index
+ .line_col_lsp_range(item.range);
+
let preselect = item.preselect;
let mut item = match item.data {
Data::EntryType { entry_type } => CompletionItem {
@@ -496,10 +503,7 @@ impl<'db> CompletionBuilder<'db> {
sort_text: Some(filter_text),
data: Some(
serde_json::to_value(CompletionItemData::Citation {
- uri: document
- .location(self.context.db)
- .uri(self.context.db)
- .clone(),
+ uri: document.uri.clone(),
key: key.clone(),
})
.unwrap(),
@@ -582,7 +586,7 @@ impl<'db> CompletionBuilder<'db> {
label: name.into(),
kind: Some(kind.completion_kind()),
detail: header,
- documentation: footer.map(Documentation::String),
+ documentation: footer.map(|footer| Documentation::String(footer.into())),
sort_text: Some(text.clone()),
filter_text: Some(text),
text_edit: Some(TextEdit::new(range, name.into()).into()),
@@ -590,7 +594,6 @@ impl<'db> CompletionBuilder<'db> {
},
Data::UserCommand { name } => {
let detail = "user-defined".into();
- let name = &name[1..];
CompletionItem {
kind: Some(Structure::Command.completion_kind()),
text_edit: Some(TextEdit::new(range, name.into()).into()),
@@ -656,53 +659,53 @@ impl<'db> CompletionBuilder<'db> {
}
#[derive(Debug, Clone)]
-struct Item<'db> {
+struct Item<'a> {
range: TextRange,
- data: Data<'db>,
+ data: Data<'a>,
preselect: bool,
score: i32,
}
#[derive(Debug, Clone)]
-enum Data<'db> {
+enum Data<'a> {
EntryType {
- entry_type: &'db BibtexEntryTypeDoc,
+ entry_type: &'a BibtexEntryTypeDoc,
},
Field {
- field: &'db BibtexFieldDoc,
+ field: &'a BibtexFieldDoc,
},
Argument {
- name: &'db str,
- image: Option<&'db str>,
+ name: &'a str,
+ image: Option<&'a str>,
},
BeginSnippet,
Citation {
- document: Document,
+ document: &'a Document,
key: String,
filter_text: String,
category: BibtexEntryTypeCategory,
},
ComponentCommand {
- name: &'db str,
- image: Option<&'db str>,
- glyph: Option<&'db str>,
- file_names: &'db [SmolStr],
+ name: &'a str,
+ image: Option<&'a str>,
+ glyph: Option<&'a str>,
+ file_names: &'a [SmolStr],
},
ComponentEnvironment {
- name: &'db str,
- file_names: &'db [SmolStr],
+ name: &'a str,
+ file_names: &'a [SmolStr],
},
Class {
- name: &'db str,
+ name: &'a str,
},
Package {
- name: &'db str,
+ name: &'a str,
},
Color {
- name: &'db str,
+ name: &'a str,
},
ColorModel {
- name: &'db str,
+ name: &'a str,
},
GlossaryEntry {
name: String,
@@ -714,20 +717,20 @@ enum Data<'db> {
name: String,
},
Label {
- name: &'db str,
+ name: &'a str,
kind: Structure,
header: Option<String>,
- footer: Option<String>,
+ footer: Option<&'a str>,
text: String,
},
UserCommand {
- name: &'db str,
+ name: &'a str,
},
UserEnvironment {
- name: &'db str,
+ name: &'a str,
},
TikzLibrary {
- name: &'db str,
+ name: &'a str,
},
}
diff --git a/support/texlab/src/features/completion/citation.rs b/support/texlab/crates/texlab/src/features/completion/citation.rs
index 68d72717a7..01afa5c28e 100644
--- a/support/texlab/src/features/completion/citation.rs
+++ b/support/texlab/crates/texlab/src/features/completion/citation.rs
@@ -1,9 +1,8 @@
+use base_db::DocumentData;
use rowan::{ast::AstNode, TextRange};
+use syntax::{bibtex, latex};
-use crate::{
- syntax::{bibtex, latex},
- util::cursor::CursorContext,
-};
+use crate::util::cursor::CursorContext;
use super::builder::CompletionBuilder;
@@ -27,15 +26,11 @@ pub fn complete<'db>(
};
check_citation(context).or_else(|| check_acronym(context))?;
- for document in context.related() {
- if let Some(data) = document.parse(context.db).as_bib() {
- for entry in data
- .root(context.db)
- .children()
- .filter_map(bibtex::Entry::cast)
- {
- builder.citation(range, document, &entry);
- }
+ for document in &context.project.documents {
+ let DocumentData::Bib(data) = &document.data else { continue };
+
+ for entry in data.root_node().children().filter_map(bibtex::Entry::cast) {
+ builder.citation(range, document, &entry);
}
}
diff --git a/support/texlab/src/features/completion/color.rs b/support/texlab/crates/texlab/src/features/completion/color.rs
index cce6517cb4..6a636cc687 100644
--- a/support/texlab/src/features/completion/color.rs
+++ b/support/texlab/crates/texlab/src/features/completion/color.rs
@@ -1,9 +1,7 @@
use rowan::ast::AstNode;
+use syntax::latex;
-use crate::{
- syntax::latex,
- util::{cursor::CursorContext, lang_data::LANGUAGE_DATA},
-};
+use crate::util::{cursor::CursorContext, lang_data::LANGUAGE_DATA};
use super::builder::CompletionBuilder;
diff --git a/support/texlab/src/features/completion/color_model.rs b/support/texlab/crates/texlab/src/features/completion/color_model.rs
index af700a96fb..107cb95b19 100644
--- a/support/texlab/src/features/completion/color_model.rs
+++ b/support/texlab/crates/texlab/src/features/completion/color_model.rs
@@ -1,6 +1,7 @@
use rowan::{ast::AstNode, TextRange};
+use syntax::latex;
-use crate::{syntax::latex, util::cursor::CursorContext};
+use crate::util::cursor::CursorContext;
use super::builder::CompletionBuilder;
diff --git a/support/texlab/src/features/completion/component_command.rs b/support/texlab/crates/texlab/src/features/completion/component_command.rs
index 20cef73848..ca1a1354ec 100644
--- a/support/texlab/src/features/completion/component_command.rs
+++ b/support/texlab/crates/texlab/src/features/completion/component_command.rs
@@ -8,7 +8,7 @@ pub fn complete<'db>(
) -> Option<()> {
let range = context.cursor.command_range(context.offset)?;
- for component in COMPONENT_DATABASE.linked_components(context.db, context.document) {
+ for component in COMPONENT_DATABASE.linked_components(&context.project) {
for command in &component.commands {
builder.component_command(
range,
diff --git a/support/texlab/src/features/completion/component_environment.rs b/support/texlab/crates/texlab/src/features/completion/component_environment.rs
index e58e319a46..496fb7ed85 100644
--- a/support/texlab/src/features/completion/component_environment.rs
+++ b/support/texlab/crates/texlab/src/features/completion/component_environment.rs
@@ -8,7 +8,7 @@ pub fn complete<'db>(
) -> Option<()> {
let (_, range) = context.find_environment_name()?;
- for component in COMPONENT_DATABASE.linked_components(context.db, context.document) {
+ for component in COMPONENT_DATABASE.linked_components(&context.project) {
for name in &component.environments {
builder.component_environment(range, name, &component.file_names);
}
diff --git a/support/texlab/src/features/completion/entry_type.rs b/support/texlab/crates/texlab/src/features/completion/entry_type.rs
index 38bc0e3f3a..73a93a5a40 100644
--- a/support/texlab/src/features/completion/entry_type.rs
+++ b/support/texlab/crates/texlab/src/features/completion/entry_type.rs
@@ -1,9 +1,7 @@
use rowan::{TextRange, TextSize};
+use syntax::bibtex;
-use crate::{
- syntax::bibtex,
- util::{cursor::CursorContext, lang_data::LANGUAGE_DATA},
-};
+use crate::util::{cursor::CursorContext, lang_data::LANGUAGE_DATA};
use super::builder::CompletionBuilder;
diff --git a/support/texlab/src/features/completion/field.rs b/support/texlab/crates/texlab/src/features/completion/field.rs
index ff6e54a562..d1f6a5e856 100644
--- a/support/texlab/src/features/completion/field.rs
+++ b/support/texlab/crates/texlab/src/features/completion/field.rs
@@ -1,9 +1,7 @@
use rowan::{ast::AstNode, TextRange};
+use syntax::bibtex::{self, HasName};
-use crate::{
- syntax::bibtex::{self, HasName},
- util::{cursor::CursorContext, lang_data::LANGUAGE_DATA},
-};
+use crate::util::{cursor::CursorContext, lang_data::LANGUAGE_DATA};
use super::builder::CompletionBuilder;
diff --git a/support/texlab/crates/texlab/src/features/completion/glossary_ref.rs b/support/texlab/crates/texlab/src/features/completion/glossary_ref.rs
new file mode 100644
index 0000000000..0d218a1b03
--- /dev/null
+++ b/support/texlab/crates/texlab/src/features/completion/glossary_ref.rs
@@ -0,0 +1,37 @@
+use base_db::DocumentData;
+use rowan::ast::AstNode;
+use syntax::latex;
+
+use crate::util::cursor::CursorContext;
+
+use super::builder::CompletionBuilder;
+
+pub fn complete<'db>(
+ context: &'db CursorContext,
+ builder: &mut CompletionBuilder<'db>,
+) -> Option<()> {
+ let (_, range, group) = context.find_curly_group_word()?;
+ latex::GlossaryEntryReference::cast(group.syntax().parent()?)?;
+
+ for document in &context.project.documents {
+ let DocumentData::Tex(data) = &document.data else { continue };
+
+ for node in data.root_node().descendants() {
+ if let Some(name) = latex::GlossaryEntryDefinition::cast(node.clone())
+ .and_then(|entry| entry.name())
+ .and_then(|name| name.key())
+ .map(|name| name.to_string())
+ {
+ builder.glossary_entry(range, name);
+ } else if let Some(name) = latex::AcronymDefinition::cast(node)
+ .and_then(|entry| entry.name())
+ .and_then(|name| name.key())
+ .map(|name| name.to_string())
+ {
+ builder.glossary_entry(range, name);
+ }
+ }
+ }
+
+ Some(())
+}
diff --git a/support/texlab/src/features/completion/import.rs b/support/texlab/crates/texlab/src/features/completion/import.rs
index bf6da78a43..826408368e 100644
--- a/support/texlab/src/features/completion/import.rs
+++ b/support/texlab/crates/texlab/src/features/completion/import.rs
@@ -1,10 +1,8 @@
use rowan::ast::AstNode;
use rustc_hash::FxHashSet;
+use syntax::latex;
-use crate::{
- syntax::latex,
- util::{components::COMPONENT_DATABASE, cursor::CursorContext},
-};
+use crate::util::{components::COMPONENT_DATABASE, cursor::CursorContext};
use super::builder::CompletionBuilder;
@@ -37,7 +35,7 @@ pub fn complete<'db>(
}
}
- let file_name_db = context.workspace.file_name_db(context.db);
+ let file_name_db = &context.workspace.distro().file_name_db;
for file_name in file_name_db
.iter()
.map(|(file_name, _)| file_name)
diff --git a/support/texlab/src/features/completion/include.rs b/support/texlab/crates/texlab/src/features/completion/include.rs
index 5d7654a208..1cc1a0972b 100644
--- a/support/texlab/src/features/completion/include.rs
+++ b/support/texlab/crates/texlab/src/features/completion/include.rs
@@ -4,9 +4,11 @@ use std::{
path::{Path, PathBuf},
};
+use base_db::DocumentData;
use rowan::{ast::AstNode, TextRange, TextSize};
+use syntax::latex;
-use crate::{syntax::latex, util::cursor::CursorContext};
+use crate::util::cursor::CursorContext;
use super::builder::CompletionBuilder;
@@ -14,12 +16,7 @@ pub fn complete<'db>(
context: &'db CursorContext,
builder: &mut CompletionBuilder<'db>,
) -> Option<()> {
- if context
- .document
- .location(context.db)
- .path(context.db)
- .is_none()
- {
+ if context.document.path.is_none() {
return None;
}
@@ -55,16 +52,10 @@ pub fn complete<'db>(
let mut dirs = vec![current_dir(context, &path_text, None)];
if include.kind() == latex::GRAPHICS_INCLUDE {
- for document in context.related() {
- if let Some(data) = document.parse(context.db).as_tex() {
- for path in data
- .analyze(context.db)
- .graphics_paths(context.db)
- .iter()
- .map(|node| node.path(context.db))
- {
- dirs.push(current_dir(context, &path_text, Some(path)));
- }
+ for document in &context.project.documents {
+ let DocumentData::Tex(data) = &document.data else { continue };
+ for graphics_path in &data.semantics.graphics_paths {
+ dirs.push(current_dir(context, &path_text, Some(graphics_path)));
}
}
}
@@ -102,16 +93,16 @@ fn current_dir(
) -> Option<PathBuf> {
let parent = context
.workspace
- .parents(context.db, context.document)
+ .parents(context.document)
.iter()
.next()
.map_or(context.document, Clone::clone);
let path = context
.workspace
- .working_dir(context.db, parent.directory(context.db))
- .path(context.db)
- .as_deref()?;
+ .current_dir(&parent.dir)
+ .to_file_path()
+ .ok()?;
let mut path = PathBuf::from(path.to_str()?.replace('\\', "/"));
if !path_text.is_empty() {
diff --git a/support/texlab/crates/texlab/src/features/completion/label.rs b/support/texlab/crates/texlab/src/features/completion/label.rs
new file mode 100644
index 0000000000..c85093b748
--- /dev/null
+++ b/support/texlab/crates/texlab/src/features/completion/label.rs
@@ -0,0 +1,72 @@
+use base_db::{semantics::tex::LabelKind, DocumentData};
+use rowan::{ast::AstNode, TextRange};
+use syntax::latex;
+
+use crate::util::{self, cursor::CursorContext, label::LabeledObject, lsp_enums::Structure};
+
+use super::builder::CompletionBuilder;
+
+pub fn complete<'db>(
+ context: &'db CursorContext,
+ builder: &mut CompletionBuilder<'db>,
+) -> Option<()> {
+ let (range, is_math) = find_reference(context).or_else(|| find_reference_range(context))?;
+
+ for document in &context.project.documents {
+ let DocumentData::Tex(data) = &document.data else { continue };
+ for label in data
+ .semantics
+ .labels
+ .iter()
+ .filter(|label| label.kind == LabelKind::Definition)
+ {
+ match util::label::render(context.workspace, &context.project, label) {
+ Some(rendered_label) => {
+ let kind = match &rendered_label.object {
+ LabeledObject::Section { .. } => Structure::Section,
+ LabeledObject::Float { .. } => Structure::Float,
+ LabeledObject::Theorem { .. } => Structure::Theorem,
+ LabeledObject::Equation => Structure::Equation,
+ LabeledObject::EnumItem => Structure::Item,
+ };
+
+ if is_math && kind != Structure::Equation {
+ continue;
+ }
+
+ let header = rendered_label.detail();
+ let footer = match &rendered_label.object {
+ LabeledObject::Float { caption, .. } => Some(caption.clone()),
+ _ => None,
+ };
+
+ let text = format!("{} {}", label.name.text, rendered_label.reference());
+
+ builder.label(range, &label.name.text, kind, header, footer, text);
+ }
+ None => {
+ let kind = Structure::Label;
+ let header = None;
+ let footer = None;
+ let text = label.name.text.clone();
+ builder.label(range, &label.name.text, kind, header, footer, text);
+ }
+ }
+ }
+ }
+
+ Some(())
+}
+
+fn find_reference(context: &CursorContext) -> Option<(TextRange, bool)> {
+ let (_, range, group) = context.find_curly_group_word_list()?;
+ let reference = latex::LabelReference::cast(group.syntax().parent()?)?;
+ let is_math = reference.command()?.text() == "\\eqref";
+ Some((range, is_math))
+}
+
+fn find_reference_range(context: &CursorContext) -> Option<(TextRange, bool)> {
+ let (_, range, group) = context.find_curly_group_word()?;
+ latex::LabelReferenceRange::cast(group.syntax().parent()?)?;
+ Some((range, false))
+}
diff --git a/support/texlab/crates/texlab/src/features/completion/theorem.rs b/support/texlab/crates/texlab/src/features/completion/theorem.rs
new file mode 100644
index 0000000000..1ac904234c
--- /dev/null
+++ b/support/texlab/crates/texlab/src/features/completion/theorem.rs
@@ -0,0 +1,21 @@
+use base_db::DocumentData;
+
+use crate::util::cursor::CursorContext;
+
+use super::builder::CompletionBuilder;
+
+pub fn complete<'db>(
+ context: &'db CursorContext,
+ builder: &mut CompletionBuilder<'db>,
+) -> Option<()> {
+ let (_, range) = context.find_environment_name()?;
+
+ for document in &context.project.documents {
+ let DocumentData::Tex(data) = &document.data else { continue };
+ for theorem in &data.semantics.theorem_definitions {
+ builder.user_environment(range, &theorem.name.text);
+ }
+ }
+
+ Some(())
+}
diff --git a/support/texlab/src/features/completion/tikz_library.rs b/support/texlab/crates/texlab/src/features/completion/tikz_library.rs
index 7ea26d50c2..5f09142cfd 100644
--- a/support/texlab/src/features/completion/tikz_library.rs
+++ b/support/texlab/crates/texlab/src/features/completion/tikz_library.rs
@@ -1,9 +1,7 @@
use rowan::ast::AstNode;
+use syntax::latex;
-use crate::{
- syntax::latex,
- util::{cursor::CursorContext, lang_data::LANGUAGE_DATA},
-};
+use crate::util::{cursor::CursorContext, lang_data::LANGUAGE_DATA};
use super::builder::CompletionBuilder;
diff --git a/support/texlab/crates/texlab/src/features/completion/user_command.rs b/support/texlab/crates/texlab/src/features/completion/user_command.rs
new file mode 100644
index 0000000000..26708e69ec
--- /dev/null
+++ b/support/texlab/crates/texlab/src/features/completion/user_command.rs
@@ -0,0 +1,21 @@
+use base_db::DocumentData;
+
+use crate::util::cursor::CursorContext;
+
+use super::builder::CompletionBuilder;
+
+pub fn complete<'db>(
+ context: &'db CursorContext,
+ builder: &mut CompletionBuilder<'db>,
+) -> Option<()> {
+ let range = context.cursor.command_range(context.offset)?;
+
+ for document in &context.project.documents {
+ let DocumentData::Tex(data) = &document.data else { continue };
+ for (_, name) in data.semantics.commands.iter().filter(|(r, _)| *r != range) {
+ builder.user_command(range, name);
+ }
+ }
+
+ Some(())
+}
diff --git a/support/texlab/crates/texlab/src/features/completion/user_environment.rs b/support/texlab/crates/texlab/src/features/completion/user_environment.rs
new file mode 100644
index 0000000000..4e06eac6da
--- /dev/null
+++ b/support/texlab/crates/texlab/src/features/completion/user_environment.rs
@@ -0,0 +1,26 @@
+use base_db::DocumentData;
+
+use crate::util::cursor::CursorContext;
+
+use super::builder::CompletionBuilder;
+
+pub fn complete<'db>(
+ context: &'db CursorContext,
+ builder: &mut CompletionBuilder<'db>,
+) -> Option<()> {
+ let (name, range) = context.find_environment_name()?;
+
+ for document in &context.project.documents {
+ let DocumentData::Tex(data) = &document.data else { continue };
+ for name in data
+ .semantics
+ .environments
+ .iter()
+ .filter(|n| n.as_str() != name)
+ {
+ builder.user_environment(range, name);
+ }
+ }
+
+ Some(())
+}
diff --git a/support/texlab/src/features/definition.rs b/support/texlab/crates/texlab/src/features/definition.rs
index 5843882bd0..c1a5f5162b 100644
--- a/support/texlab/src/features/definition.rs
+++ b/support/texlab/crates/texlab/src/features/definition.rs
@@ -4,21 +4,18 @@ mod entry;
mod label;
mod string;
+use base_db::{Document, Workspace};
use lsp_types::{GotoDefinitionResponse, LocationLink, Position, Url};
use rowan::TextRange;
-use crate::{
- db::Document,
- util::{cursor::CursorContext, line_index_ext::LineIndexExt},
- Db,
-};
+use crate::util::{cursor::CursorContext, line_index_ext::LineIndexExt};
pub fn goto_definition(
- db: &dyn Db,
+ workspace: &Workspace,
uri: &Url,
position: Position,
) -> Option<GotoDefinitionResponse> {
- let context = CursorContext::new(db, uri, position, ())?;
+ let context = CursorContext::new(workspace, uri, position, ())?;
log::debug!("[Definition] Cursor: {:?}", context.cursor);
let links: Vec<_> = command::goto_definition(&context)
@@ -31,12 +28,12 @@ pub fn goto_definition(
let origin_selection_range = Some(
context
.document
- .line_index(db)
+ .line_index
.line_col_lsp_range(result.origin_selection_range),
);
- let target_line_index = result.target.line_index(db);
- let target_uri = result.target.location(context.db).uri(context.db).clone();
+ let target_line_index = &result.target.line_index;
+ let target_uri = result.target.uri.clone();
let target_range = target_line_index.line_col_lsp_range(result.target_range);
let target_selection_range =
@@ -55,9 +52,9 @@ pub fn goto_definition(
}
#[derive(Debug, Clone)]
-struct DefinitionResult {
+struct DefinitionResult<'a> {
origin_selection_range: TextRange,
- target: Document,
+ target: &'a Document,
target_range: TextRange,
target_selection_range: TextRange,
}
diff --git a/support/texlab/crates/texlab/src/features/definition/command.rs b/support/texlab/crates/texlab/src/features/definition/command.rs
new file mode 100644
index 0000000000..9707247019
--- /dev/null
+++ b/support/texlab/crates/texlab/src/features/definition/command.rs
@@ -0,0 +1,45 @@
+use base_db::DocumentData;
+use rowan::ast::AstNode;
+use syntax::latex;
+
+use crate::util::cursor::CursorContext;
+
+use super::DefinitionResult;
+
+pub(super) fn goto_definition<'a>(
+ context: &CursorContext<'a>,
+) -> Option<Vec<DefinitionResult<'a>>> {
+ let name = context
+ .cursor
+ .as_tex()
+ .filter(|token| token.kind() == latex::COMMAND_NAME)?;
+
+ let origin_selection_range = name.text_range();
+
+ for document in &context.project.documents {
+ let DocumentData::Tex(data) = &document.data else { continue };
+
+ let root = data.root_node();
+ if let Some(result) = root
+ .descendants()
+ .filter_map(latex::CommandDefinition::cast)
+ .filter(|def| {
+ def.name()
+ .and_then(|name| name.command())
+ .map_or(false, |node| node.text() == name.text())
+ })
+ .find_map(|def| {
+ Some(DefinitionResult {
+ origin_selection_range,
+ target: document,
+ target_range: latex::small_range(&def),
+ target_selection_range: def.name()?.command()?.text_range(),
+ })
+ })
+ {
+ return Some(vec![result]);
+ }
+ }
+
+ None
+}
diff --git a/support/texlab/src/features/definition/document.rs b/support/texlab/crates/texlab/src/features/definition/document.rs
index 40cfdf1d38..a035eec718 100644
--- a/support/texlab/src/features/definition/document.rs
+++ b/support/texlab/crates/texlab/src/features/definition/document.rs
@@ -1,21 +1,22 @@
use rowan::TextRange;
-use crate::{db::dependency_graph, util::cursor::CursorContext};
+use crate::util::cursor::CursorContext;
use super::DefinitionResult;
-pub(super) fn goto_definition(context: &CursorContext) -> Option<Vec<DefinitionResult>> {
- let db = context.db;
+pub(super) fn goto_definition<'a>(
+ context: &CursorContext<'a>,
+) -> Option<Vec<DefinitionResult<'a>>> {
context
.workspace
- .parents(db, context.document)
+ .parents(context.document)
.iter()
.copied()
.chain(std::iter::once(context.document))
- .flat_map(|parent| dependency_graph(db, parent).edges.iter())
+ .flat_map(|parent| base_db::graph::Graph::new(context.workspace, parent).edges)
.filter(|edge| edge.source == context.document)
.find_map(|edge| {
- let range = edge.origin?.link.range(db);
+ let range = edge.weight?.link.path.range;
if range.contains_inclusive(context.offset) {
Some(vec![DefinitionResult {
origin_selection_range: range,
diff --git a/support/texlab/crates/texlab/src/features/definition/entry.rs b/support/texlab/crates/texlab/src/features/definition/entry.rs
new file mode 100644
index 0000000000..9cced101ff
--- /dev/null
+++ b/support/texlab/crates/texlab/src/features/definition/entry.rs
@@ -0,0 +1,42 @@
+use base_db::DocumentData;
+use rowan::ast::AstNode;
+use syntax::{
+ bibtex::{self, HasName},
+ latex,
+};
+
+use crate::util::cursor::CursorContext;
+
+use super::DefinitionResult;
+
+pub(super) fn goto_definition<'a>(
+ context: &CursorContext<'a>,
+) -> Option<Vec<DefinitionResult<'a>>> {
+ let word = context
+ .cursor
+ .as_tex()
+ .filter(|token| token.kind() == latex::WORD)?;
+
+ let key = latex::Key::cast(word.parent()?)?;
+
+ latex::Citation::cast(key.syntax().parent()?.parent()?)?;
+
+ let origin_selection_range = latex::small_range(&key);
+
+ for document in &context.project.documents {
+ let DocumentData::Bib(data) = &document.data else { continue };
+
+ for entry in data.root_node().children().filter_map(bibtex::Entry::cast) {
+ if let Some(key) = entry.name_token().filter(|k| k.text() == word.text()) {
+ return Some(vec![DefinitionResult {
+ origin_selection_range,
+ target: document,
+ target_selection_range: key.text_range(),
+ target_range: entry.syntax().text_range(),
+ }]);
+ }
+ }
+ }
+
+ None
+}
diff --git a/support/texlab/crates/texlab/src/features/definition/label.rs b/support/texlab/crates/texlab/src/features/definition/label.rs
new file mode 100644
index 0000000000..84f17b5704
--- /dev/null
+++ b/support/texlab/crates/texlab/src/features/definition/label.rs
@@ -0,0 +1,37 @@
+use base_db::{semantics::tex::LabelKind, DocumentData};
+
+use crate::util::{self, cursor::CursorContext};
+
+use super::DefinitionResult;
+
+pub(super) fn goto_definition<'a>(
+ context: &CursorContext<'a>,
+) -> Option<Vec<DefinitionResult<'a>>> {
+ let (name_text, origin_selection_range) = context
+ .find_label_name_key()
+ .or_else(|| context.find_label_name_command())?;
+
+ for document in &context.project.documents {
+ let DocumentData::Tex(data) = &document.data else { continue };
+
+ let Some(label) = data
+ .semantics
+ .labels
+ .iter()
+ .filter(|label| label.kind == LabelKind::Definition)
+ .find(|label| label.name.text == name_text) else { continue };
+
+ let target_selection_range = label.name.range;
+ let target_range = util::label::render(context.workspace, &context.project, label)
+ .map_or(target_selection_range, |label| label.range);
+
+ return Some(vec![DefinitionResult {
+ origin_selection_range,
+ target: document,
+ target_range,
+ target_selection_range,
+ }]);
+ }
+
+ None
+}
diff --git a/support/texlab/src/features/definition/string.rs b/support/texlab/crates/texlab/src/features/definition/string.rs
index 44ea1e9094..420d2818ea 100644
--- a/support/texlab/src/features/definition/string.rs
+++ b/support/texlab/crates/texlab/src/features/definition/string.rs
@@ -1,15 +1,16 @@
+use base_db::DocumentData;
use rowan::ast::AstNode;
+use syntax::bibtex::{self, HasName};
-use crate::{
- syntax::bibtex::{self, HasName},
- util::cursor::CursorContext,
-};
+use crate::util::cursor::CursorContext;
use super::DefinitionResult;
-pub(super) fn goto_definition(context: &CursorContext) -> Option<Vec<DefinitionResult>> {
- let db = context.db;
- let data = context.document.parse(db).as_bib()?;
+pub(super) fn goto_definition<'a>(
+ context: &CursorContext<'a>,
+) -> Option<Vec<DefinitionResult<'a>>> {
+ let DocumentData::Bib(data) = &context.document.data else { return None };
+
let key = context
.cursor
.as_bib()
@@ -19,7 +20,7 @@ pub(super) fn goto_definition(context: &CursorContext) -> Option<Vec<DefinitionR
let origin_selection_range = key.text_range();
- data.root(db)
+ data.root_node()
.children()
.filter_map(bibtex::StringDef::cast)
.find_map(|string| {
diff --git a/support/texlab/src/features/folding.rs b/support/texlab/crates/texlab/src/features/folding.rs
index 44ddc0c4fd..5d98736176 100644
--- a/support/texlab/src/features/folding.rs
+++ b/support/texlab/crates/texlab/src/features/folding.rs
@@ -1,21 +1,17 @@
+use base_db::{DocumentData, Workspace};
use lsp_types::{FoldingRange, FoldingRangeKind, Range, Url};
use rowan::ast::AstNode;
+use syntax::{bibtex, latex};
-use crate::{
- db::{parse::DocumentData, Workspace},
- syntax::{bibtex, latex},
- util::line_index_ext::LineIndexExt,
- Db,
-};
+use crate::util::line_index_ext::LineIndexExt;
-pub fn find_all(db: &dyn Db, uri: &Url) -> Option<Vec<FoldingRange>> {
- let document = Workspace::get(db).lookup_uri(db, uri)?;
- let line_index = document.line_index(db);
- let foldings = match document.parse(db) {
+pub fn find_all(workspace: &Workspace, uri: &Url) -> Option<Vec<FoldingRange>> {
+ let document = workspace.lookup(uri)?;
+ let line_index = &document.line_index;
+ let foldings = match &document.data {
DocumentData::Tex(data) => {
let mut results = Vec::new();
- let root = data.root(db);
- for node in root.descendants() {
+ for node in data.root_node().descendants() {
if let Some(folding) = latex::Environment::cast(node.clone())
.map(|node| latex::small_range(&node))
.or_else(|| {
@@ -32,7 +28,7 @@ pub fn find_all(db: &dyn Db, uri: &Url) -> Option<Vec<FoldingRange>> {
results
}
DocumentData::Bib(data) => {
- let root = data.root(db);
+ let root = data.root_node();
root.descendants()
.filter(|node| {
matches!(
@@ -43,7 +39,10 @@ pub fn find_all(db: &dyn Db, uri: &Url) -> Option<Vec<FoldingRange>> {
.map(|node| create_range(line_index.line_col_lsp_range(node.text_range())))
.collect()
}
- DocumentData::Log(_) | DocumentData::TexlabRoot(_) | DocumentData::Tectonic(_) => {
+ DocumentData::Aux(_)
+ | DocumentData::Log(_)
+ | DocumentData::Root
+ | DocumentData::Tectonic => {
return None;
}
};
diff --git a/support/texlab/crates/texlab/src/features/formatting.rs b/support/texlab/crates/texlab/src/features/formatting.rs
new file mode 100644
index 0000000000..f16ee8e243
--- /dev/null
+++ b/support/texlab/crates/texlab/src/features/formatting.rs
@@ -0,0 +1,29 @@
+mod bibtex_internal;
+mod latexindent;
+
+use base_db::{Formatter, Workspace};
+use distro::Language;
+use lsp_types::{FormattingOptions, TextEdit, Url};
+
+use self::{bibtex_internal::format_bibtex_internal, latexindent::format_with_latexindent};
+
+pub fn format_source_code(
+ workspace: &Workspace,
+ uri: &Url,
+ options: &FormattingOptions,
+) -> Option<Vec<TextEdit>> {
+ let document = workspace.lookup(uri)?;
+ match document.language {
+ Language::Tex => match workspace.config().formatting.tex_formatter {
+ Formatter::Null => None,
+ Formatter::Server => None,
+ Formatter::LatexIndent => format_with_latexindent(workspace, document),
+ },
+ Language::Bib => match workspace.config().formatting.bib_formatter {
+ Formatter::Null => None,
+ Formatter::Server => format_bibtex_internal(workspace, document, options),
+ Formatter::LatexIndent => format_with_latexindent(workspace, document),
+ },
+ Language::Aux | Language::Log | Language::Root | Language::Tectonic => None,
+ }
+}
diff --git a/support/texlab/src/features/formatting/bibtex_internal.rs b/support/texlab/crates/texlab/src/features/formatting/bibtex_internal.rs
index 5026c512f2..7ffca6e840 100644
--- a/support/texlab/src/features/formatting/bibtex_internal.rs
+++ b/support/texlab/crates/texlab/src/features/formatting/bibtex_internal.rs
@@ -1,16 +1,13 @@
+use base_db::{Document, LineIndex, Workspace};
use lsp_types::{FormattingOptions, TextEdit};
use rowan::{ast::AstNode, NodeOrToken};
+use syntax::bibtex::{self, HasName, HasType, HasValue};
-use crate::{
- db::Document,
- syntax::bibtex::{self, HasName, HasType, HasValue},
- util::{line_index::LineIndex, line_index_ext::LineIndexExt},
- Db,
-};
+use crate::util::line_index_ext::LineIndexExt;
pub fn format_bibtex_internal(
- db: &dyn Db,
- document: Document,
+ workspace: &Workspace,
+ document: &Document,
options: &FormattingOptions,
) -> Option<Vec<TextEdit>> {
let mut indent = String::new();
@@ -23,13 +20,14 @@ pub fn format_bibtex_internal(
indent.push('\t');
}
- let line_length = db.config().formatting.line_length;
+ let line_length = workspace.config().formatting.line_length;
- let line_index = document.line_index(db);
- let data = document.parse(db).as_bib()?;
+ let line_index = &document.line_index;
+
+ let data = document.data.as_bib()?;
let mut edits = Vec::new();
- for node in data.root(db).children().filter(|node| {
+ for node in data.root_node().children().filter(|node| {
matches!(
node.kind(),
bibtex::PREAMBLE | bibtex::STRING | bibtex::ENTRY
diff --git a/support/texlab/src/features/formatting/latexindent.rs b/support/texlab/crates/texlab/src/features/formatting/latexindent.rs
index 087b8f0941..c269550b74 100644
--- a/support/texlab/src/features/formatting/latexindent.rs
+++ b/support/texlab/crates/texlab/src/features/formatting/latexindent.rs
@@ -3,33 +3,30 @@ use std::{
process::{Command, Stdio},
};
+use base_db::{Document, LatexIndentConfig, Workspace};
+use distro::Language;
use lsp_types::TextEdit;
use rowan::{TextLen, TextRange};
use tempfile::tempdir;
-use crate::{
- db::{Document, Language, Workspace},
- util::line_index_ext::LineIndexExt,
- Db, LatexIndentConfig,
-};
+use crate::util::line_index_ext::LineIndexExt;
-pub fn format_with_latexindent(db: &dyn Db, document: Document) -> Option<Vec<TextEdit>> {
- let workspace = Workspace::get(db);
- let config = db.config();
+pub fn format_with_latexindent(
+ workspace: &Workspace,
+ document: &Document,
+) -> Option<Vec<TextEdit>> {
+ let config = workspace.config();
let target_dir = tempdir().ok()?;
- let source_dir = workspace
- .working_dir(db, document.directory(db))
- .path(db)
- .as_deref()?;
+ let source_dir = workspace.current_dir(&document.dir).to_file_path().ok()?;
let target_file = target_dir
.path()
- .join(if document.language(db) == Language::Bib {
+ .join(if document.language == Language::Bib {
"file.bib"
} else {
"file.tex"
});
- std::fs::write(&target_file, document.text(db)).ok()?;
+ std::fs::write(&target_file, &document.text).ok()?;
let args = build_arguments(&config.formatting.latex_indent, &target_file);
@@ -48,12 +45,12 @@ pub fn format_with_latexindent(db: &dyn Db, document: Document) -> Option<Vec<Te
.output()
.ok()?;
- let old_text = document.text(db);
+ let old_text = &document.text;
let new_text = String::from_utf8_lossy(&output.stdout).into_owned();
if new_text.is_empty() {
None
} else {
- let line_index = document.line_index(db);
+ let line_index = &document.line_index;
Some(vec![TextEdit {
range: line_index.line_col_lsp_range(TextRange::new(0.into(), old_text.text_len())),
new_text,
diff --git a/support/texlab/src/features/forward_search.rs b/support/texlab/crates/texlab/src/features/forward_search.rs
index 350fdd02b9..019c08022e 100644
--- a/support/texlab/src/features/forward_search.rs
+++ b/support/texlab/crates/texlab/src/features/forward_search.rs
@@ -4,11 +4,12 @@ use std::{
process::Stdio,
};
+use base_db::Workspace;
use log::error;
use lsp_types::{Position, Url};
use thiserror::Error;
-use crate::{db::Workspace, util::line_index_ext::LineIndexExt, Db};
+use crate::util::line_index_ext::LineIndexExt;
#[derive(Debug, Error)]
pub enum Error {
@@ -37,49 +38,48 @@ pub struct Command {
}
impl Command {
- pub fn configure(db: &dyn Db, uri: &Url, position: Option<Position>) -> Result<Self, Error> {
- let workspace = Workspace::get(db);
+ pub fn configure(
+ workspace: &Workspace,
+ uri: &Url,
+ position: Option<Position>,
+ ) -> Result<Self, Error> {
let child = workspace
- .lookup_uri(db, uri)
+ .lookup(uri)
.ok_or_else(|| Error::TexNotFound(uri.clone()))?;
- let parent = workspace
- .parents(db, child)
- .iter()
- .copied()
- .next()
- .unwrap_or(child);
+ let parent = *workspace.parents(child).iter().next().unwrap_or(&child);
+ if parent.uri.scheme() != "file" {
+ return Err(Error::NoLocalFile(parent.uri.clone()));
+ }
let output_dir = workspace
- .output_dir(db, workspace.working_dir(db, parent.directory(db)))
- .path(db)
- .as_deref()
- .ok_or_else(|| Error::NoLocalFile(uri.clone()))?;
+ .output_dir(&workspace.current_dir(&parent.dir))
+ .to_file_path()
+ .unwrap();
let tex_path = child
- .location(db)
- .path(db)
+ .path
.as_deref()
.ok_or_else(|| Error::NoLocalFile(uri.clone()))?;
- let pdf_path = match parent.location(db).stem(db) {
- Some(stem) => {
- let pdf_name = format!("{}.pdf", stem);
- output_dir.join(pdf_name)
- }
- None => {
- return Err(Error::InvalidTexFile(uri.clone()));
- }
+ let pdf_path = match parent
+ .path
+ .as_deref()
+ .unwrap()
+ .file_stem()
+ .and_then(|stem| stem.to_str())
+ {
+ Some(stem) => output_dir.join(format!("{}.pdf", stem)),
+ None => return Err(Error::InvalidTexFile(uri.clone())),
};
if !pdf_path.exists() {
return Err(Error::PdfNotFound(pdf_path));
}
- let position =
- position.unwrap_or_else(|| child.line_index(db).line_col_lsp(child.cursor(db)));
+ let position = position.unwrap_or_else(|| child.line_index.line_col_lsp(child.cursor));
- let Some(config) = &db.config().synctex else {
+ let Some(config) = &workspace.config().synctex else {
return Err(Error::Unconfigured);
};
diff --git a/support/texlab/crates/texlab/src/features/highlight.rs b/support/texlab/crates/texlab/src/features/highlight.rs
new file mode 100644
index 0000000000..c2f5337aec
--- /dev/null
+++ b/support/texlab/crates/texlab/src/features/highlight.rs
@@ -0,0 +1,15 @@
+mod label;
+
+use base_db::Workspace;
+use lsp_types::{DocumentHighlight, Position, Url};
+
+use crate::util::cursor::CursorContext;
+
+pub fn find_all(
+ workspace: &Workspace,
+ uri: &Url,
+ position: Position,
+) -> Option<Vec<DocumentHighlight>> {
+ let context = CursorContext::new(workspace, uri, position, ())?;
+ label::find_highlights(&context)
+}
diff --git a/support/texlab/crates/texlab/src/features/highlight/label.rs b/support/texlab/crates/texlab/src/features/highlight/label.rs
new file mode 100644
index 0000000000..171b5e4301
--- /dev/null
+++ b/support/texlab/crates/texlab/src/features/highlight/label.rs
@@ -0,0 +1,30 @@
+use base_db::{semantics::tex::LabelKind, DocumentData};
+use lsp_types::{DocumentHighlight, DocumentHighlightKind};
+
+use crate::util::{cursor::CursorContext, line_index_ext::LineIndexExt};
+
+pub fn find_highlights(context: &CursorContext) -> Option<Vec<DocumentHighlight>> {
+ let (name_text, _) = context.find_label_name_key()?;
+
+ let DocumentData::Tex(data) = &context.document.data else { return None };
+
+ let mut highlights = Vec::new();
+ let line_index = &context.document.line_index;
+ for label in data
+ .semantics
+ .labels
+ .iter()
+ .filter(|label| label.name.text == name_text)
+ {
+ let range = line_index.line_col_lsp_range(label.name.range);
+ let kind = Some(match label.kind {
+ LabelKind::Definition => DocumentHighlightKind::WRITE,
+ LabelKind::Reference => DocumentHighlightKind::READ,
+ LabelKind::ReferenceRange => DocumentHighlightKind::READ,
+ });
+
+ highlights.push(DocumentHighlight { range, kind });
+ }
+
+ Some(highlights)
+}
diff --git a/support/texlab/src/features/hover.rs b/support/texlab/crates/texlab/src/features/hover.rs
index 6baeab8ad6..0c70c48099 100644
--- a/support/texlab/src/features/hover.rs
+++ b/support/texlab/crates/texlab/src/features/hover.rs
@@ -5,16 +5,14 @@ mod field;
mod label;
mod string_ref;
+use base_db::Workspace;
use lsp_types::{Hover, HoverContents, MarkupContent, MarkupKind, Position, Url};
use rowan::TextRange;
-use crate::{
- util::{cursor::CursorContext, line_index_ext::LineIndexExt},
- Db,
-};
+use crate::util::{cursor::CursorContext, line_index_ext::LineIndexExt};
-pub fn find(db: &dyn Db, uri: &Url, position: Position) -> Option<Hover> {
- let context = CursorContext::new(db, uri, position, ())?;
+pub fn find(workspace: &Workspace, uri: &Url, position: Position) -> Option<Hover> {
+ let context = CursorContext::new(workspace, uri, position, ())?;
log::debug!("[Hover] Cursor: {:?}", context.cursor);
let result = label::find_hover(&context)
@@ -24,13 +22,12 @@ pub fn find(db: &dyn Db, uri: &Url, position: Position) -> Option<Hover> {
.or_else(|| field::find_hover(&context))
.or_else(|| entry_type::find_hover(&context))?;
- let line_index = context.document.line_index(db);
Some(Hover {
contents: HoverContents::Markup(MarkupContent {
kind: result.value_kind,
value: result.value,
}),
- range: Some(line_index.line_col_lsp_range(result.range)),
+ range: Some(context.document.line_index.line_col_lsp_range(result.range)),
})
}
diff --git a/support/texlab/src/features/hover/citation.rs b/support/texlab/crates/texlab/src/features/hover/citation.rs
index e0e17176d5..1f76404871 100644
--- a/support/texlab/src/features/hover/citation.rs
+++ b/support/texlab/crates/texlab/src/features/hover/citation.rs
@@ -1,7 +1,8 @@
use lsp_types::MarkupKind;
use rowan::ast::AstNode;
+use syntax::bibtex;
-use crate::{citation, syntax::bibtex, util::cursor::CursorContext};
+use crate::util::cursor::CursorContext;
use super::HoverResult;
@@ -11,12 +12,11 @@ pub(super) fn find_hover(context: &CursorContext) -> Option<HoverResult> {
.or_else(|| context.find_citation_key_command())
.or_else(|| context.find_entry_key())?;
- let value = context.related().find_map(|document| {
- let data = document.parse(context.db).as_bib()?;
- let root = data.root(context.db);
- let root = bibtex::Root::cast(root)?;
+ let value = context.project.documents.iter().find_map(|document| {
+ let data = document.data.as_bib()?;
+ let root = bibtex::Root::cast(data.root_node())?;
let entry = root.find_entry(&key)?;
- citation::render(&entry)
+ citeproc::render(&entry)
})?;
Some(HoverResult {
diff --git a/support/texlab/crates/texlab/src/features/hover/component.rs b/support/texlab/crates/texlab/src/features/hover/component.rs
new file mode 100644
index 0000000000..89954ebf0f
--- /dev/null
+++ b/support/texlab/crates/texlab/src/features/hover/component.rs
@@ -0,0 +1,23 @@
+use base_db::{semantics::tex::LinkKind, DocumentData};
+use lsp_types::MarkupKind;
+
+use crate::util::{components::COMPONENT_DATABASE, cursor::CursorContext};
+
+use super::HoverResult;
+
+pub(super) fn find_hover(context: &CursorContext) -> Option<HoverResult> {
+ let DocumentData::Tex(data) = &context.document.data else { return None };
+ data.semantics
+ .links
+ .iter()
+ .filter(|link| matches!(link.kind, LinkKind::Sty | LinkKind::Cls))
+ .filter(|link| link.path.range.contains_inclusive(context.offset))
+ .find_map(|link| {
+ let value = COMPONENT_DATABASE.documentation(&link.path.text)?.value;
+ Some(HoverResult {
+ value,
+ value_kind: MarkupKind::PlainText,
+ range: link.path.range,
+ })
+ })
+}
diff --git a/support/texlab/src/features/hover/entry_type.rs b/support/texlab/crates/texlab/src/features/hover/entry_type.rs
index 0f4ccbdb72..8875b30b2e 100644
--- a/support/texlab/src/features/hover/entry_type.rs
+++ b/support/texlab/crates/texlab/src/features/hover/entry_type.rs
@@ -1,9 +1,7 @@
use lsp_types::MarkupKind;
+use syntax::bibtex;
-use crate::{
- syntax::bibtex,
- util::{cursor::CursorContext, lang_data::LANGUAGE_DATA},
-};
+use crate::util::{cursor::CursorContext, lang_data::LANGUAGE_DATA};
use super::HoverResult;
diff --git a/support/texlab/src/features/hover/field.rs b/support/texlab/crates/texlab/src/features/hover/field.rs
index 48193997d6..8787a45c09 100644
--- a/support/texlab/src/features/hover/field.rs
+++ b/support/texlab/crates/texlab/src/features/hover/field.rs
@@ -1,10 +1,8 @@
use lsp_types::MarkupKind;
use rowan::ast::AstNode;
+use syntax::bibtex;
-use crate::{
- syntax::bibtex,
- util::{cursor::CursorContext, lang_data::LANGUAGE_DATA},
-};
+use crate::util::{cursor::CursorContext, lang_data::LANGUAGE_DATA};
use super::HoverResult;
diff --git a/support/texlab/crates/texlab/src/features/hover/label.rs b/support/texlab/crates/texlab/src/features/hover/label.rs
new file mode 100644
index 0000000000..5ed7ce5121
--- /dev/null
+++ b/support/texlab/crates/texlab/src/features/hover/label.rs
@@ -0,0 +1,26 @@
+use base_db::semantics::tex::LabelKind;
+use lsp_types::MarkupKind;
+
+use crate::util::{self, cursor::CursorContext};
+
+use super::HoverResult;
+
+pub(super) fn find_hover(context: &CursorContext) -> Option<HoverResult> {
+ let (name_text, range) = context
+ .find_label_name_key()
+ .or_else(|| context.find_label_name_command())?;
+
+ context
+ .project
+ .documents
+ .iter()
+ .filter_map(|document| document.data.as_tex())
+ .flat_map(|data| data.semantics.labels.iter())
+ .find(|label| label.kind == LabelKind::Definition && label.name.text == name_text)
+ .and_then(|label| util::label::render(context.workspace, &context.project, label))
+ .map(|label| HoverResult {
+ range,
+ value: label.reference(),
+ value_kind: MarkupKind::PlainText,
+ })
+}
diff --git a/support/texlab/src/features/hover/string_ref.rs b/support/texlab/crates/texlab/src/features/hover/string_ref.rs
index 41c4c5bddb..52310ad68e 100644
--- a/support/texlab/src/features/hover/string_ref.rs
+++ b/support/texlab/crates/texlab/src/features/hover/string_ref.rs
@@ -1,16 +1,15 @@
+use base_db::DocumentData;
+use citeproc::field::text::TextFieldData;
use lsp_types::MarkupKind;
use rowan::ast::AstNode;
+use syntax::bibtex::{self, HasName, HasValue};
-use crate::{
- citation::field::text::TextFieldData,
- syntax::bibtex::{self, HasName, HasValue},
- util::cursor::CursorContext,
-};
+use crate::util::cursor::CursorContext;
use super::HoverResult;
pub(super) fn find_hover(context: &CursorContext) -> Option<HoverResult> {
- let data = context.document.parse(context.db).as_bib()?;
+ let DocumentData::Bib(data) = &context.document.data else { return None };
let name = context
.cursor
@@ -22,7 +21,7 @@ pub(super) fn find_hover(context: &CursorContext) -> Option<HoverResult> {
})?;
for string in data
- .root(context.db)
+ .root_node()
.children()
.filter_map(bibtex::StringDef::cast)
{
diff --git a/support/texlab/crates/texlab/src/features/inlay_hint.rs b/support/texlab/crates/texlab/src/features/inlay_hint.rs
new file mode 100644
index 0000000000..40e2984ab8
--- /dev/null
+++ b/support/texlab/crates/texlab/src/features/inlay_hint.rs
@@ -0,0 +1,48 @@
+mod label;
+
+use base_db::{Document, Project, Workspace};
+use lsp_types::{InlayHint, InlayHintLabel, Range, Url};
+use rowan::{TextRange, TextSize};
+
+use crate::util::line_index_ext::LineIndexExt;
+
+pub fn find_all(workspace: &Workspace, uri: &Url, range: Range) -> Option<Vec<InlayHint>> {
+ let document = workspace.lookup(uri)?;
+ let range = document.line_index.offset_lsp_range(range);
+ let project = workspace.project(document);
+
+ let mut builder = InlayHintBuilder {
+ workspace,
+ document,
+ project,
+ range,
+ hints: Vec::new(),
+ };
+
+ label::find_hints(&mut builder);
+ Some(builder.hints)
+}
+
+struct InlayHintBuilder<'a> {
+ workspace: &'a Workspace,
+ document: &'a Document,
+ project: Project<'a>,
+ range: TextRange,
+ hints: Vec<InlayHint>,
+}
+
+impl<'db> InlayHintBuilder<'db> {
+ pub fn push(&mut self, offset: TextSize, text: String) {
+ let position = self.document.line_index.line_col_lsp(offset);
+ self.hints.push(InlayHint {
+ position,
+ label: InlayHintLabel::String(text),
+ kind: None,
+ text_edits: None,
+ tooltip: None,
+ padding_left: Some(true),
+ padding_right: None,
+ data: None,
+ });
+ }
+}
diff --git a/support/texlab/crates/texlab/src/features/inlay_hint/label.rs b/support/texlab/crates/texlab/src/features/inlay_hint/label.rs
new file mode 100644
index 0000000000..5269b5742d
--- /dev/null
+++ b/support/texlab/crates/texlab/src/features/inlay_hint/label.rs
@@ -0,0 +1,39 @@
+use base_db::{semantics::tex::LabelKind, DocumentData};
+
+use crate::util::{self, label::LabeledObject};
+
+use super::InlayHintBuilder;
+
+pub(super) fn find_hints(builder: &mut InlayHintBuilder) -> Option<()> {
+ let DocumentData::Tex(data) = &builder.document.data else { return None };
+
+ let range = builder.range;
+ for label in data
+ .semantics
+ .labels
+ .iter()
+ .filter(|label| label.kind == LabelKind::Definition)
+ .filter(|label| label.name.range.intersect(range).is_some())
+ {
+ let Some(rendered) = util::label::render(builder.workspace, &builder.project, label) else { continue };
+ let Some(number) = &rendered.number else { continue };
+
+ let text = match &rendered.object {
+ LabeledObject::Section { prefix, .. } => {
+ format!("{} {}", prefix, number)
+ }
+ LabeledObject::Float { kind, .. } => {
+ format!("{} {}", kind.as_str(), number)
+ }
+ LabeledObject::Theorem { kind, .. } => {
+ format!("{} {}", kind, number)
+ }
+ LabeledObject::Equation => format!("Equation ({})", number),
+ LabeledObject::EnumItem => format!("Item {}", number),
+ };
+
+ builder.push(label.name.range.end(), text);
+ }
+
+ Some(())
+}
diff --git a/support/texlab/crates/texlab/src/features/link.rs b/support/texlab/crates/texlab/src/features/link.rs
new file mode 100644
index 0000000000..9fb70d8b65
--- /dev/null
+++ b/support/texlab/crates/texlab/src/features/link.rs
@@ -0,0 +1,38 @@
+mod include;
+
+use base_db::{Document, Workspace};
+use lsp_types::{DocumentLink, Url};
+use rowan::TextRange;
+
+use crate::util::line_index_ext::LineIndexExt;
+
+pub fn find_all(workspace: &Workspace, uri: &Url) -> Option<Vec<DocumentLink>> {
+ let document = workspace.lookup(uri)?;
+ let mut builder = LinkBuilder {
+ workspace,
+ document,
+ links: Vec::new(),
+ };
+
+ include::find_links(&mut builder);
+ Some(builder.links)
+}
+
+struct LinkBuilder<'a> {
+ workspace: &'a Workspace,
+ document: &'a Document,
+ links: Vec<DocumentLink>,
+}
+
+impl<'a> LinkBuilder<'a> {
+ pub fn push(&mut self, range: TextRange, target: &Document) {
+ let range = self.document.line_index.line_col_lsp_range(range);
+ let target = Some(target.uri.clone());
+ self.links.push(DocumentLink {
+ range,
+ target,
+ tooltip: None,
+ data: None,
+ });
+ }
+}
diff --git a/support/texlab/crates/texlab/src/features/link/include.rs b/support/texlab/crates/texlab/src/features/link/include.rs
new file mode 100644
index 0000000000..eef47514af
--- /dev/null
+++ b/support/texlab/crates/texlab/src/features/link/include.rs
@@ -0,0 +1,22 @@
+use super::LinkBuilder;
+
+pub(super) fn find_links(builder: &mut LinkBuilder) -> Option<()> {
+ let parent = *builder
+ .workspace
+ .parents(builder.document)
+ .iter()
+ .next()
+ .unwrap_or(&builder.document);
+
+ let graph = base_db::graph::Graph::new(builder.workspace, parent);
+
+ for edge in &graph.edges {
+ if edge.source == builder.document {
+ if let Some(weight) = &edge.weight {
+ builder.push(weight.link.path.range, edge.target);
+ }
+ }
+ }
+
+ Some(())
+}
diff --git a/support/texlab/src/features/reference.rs b/support/texlab/crates/texlab/src/features/reference.rs
index 3815accc2f..21243e0b6c 100644
--- a/support/texlab/src/features/reference.rs
+++ b/support/texlab/crates/texlab/src/features/reference.rs
@@ -2,23 +2,20 @@ mod entry;
mod label;
mod string;
+use base_db::{Document, Workspace};
use lsp_types::{Location, Position, ReferenceContext, Url};
use rowan::TextRange;
-use crate::{
- db::Document,
- util::{cursor::CursorContext, line_index_ext::LineIndexExt},
- Db,
-};
+use crate::util::{cursor::CursorContext, line_index_ext::LineIndexExt};
pub fn find_all(
- db: &dyn Db,
+ workspace: &Workspace,
uri: &Url,
position: Position,
params: &ReferenceContext,
) -> Option<Vec<Location>> {
let mut results = Vec::new();
- let context = CursorContext::new(db, uri, position, params)?;
+ let context = CursorContext::new(workspace, uri, position, params)?;
log::debug!("[References] Cursor: {:?}", context.cursor);
label::find_all_references(&context, &mut results);
entry::find_all_references(&context, &mut results);
@@ -27,19 +24,16 @@ pub fn find_all(
let locations = results
.into_iter()
.map(|result| Location {
- uri: result.document.location(db).uri(db).clone(),
- range: result
- .document
- .line_index(db)
- .line_col_lsp_range(result.range),
+ uri: result.document.uri.clone(),
+ range: result.document.line_index.line_col_lsp_range(result.range),
})
.collect();
Some(locations)
}
-#[derive(Debug, Clone)]
-struct ReferenceResult {
- document: Document,
+#[derive(Debug)]
+struct ReferenceResult<'a> {
+ document: &'a Document,
range: TextRange,
}
diff --git a/support/texlab/src/features/reference/entry.rs b/support/texlab/crates/texlab/src/features/reference/entry.rs
index 0c8f374cb7..d84e7fa4cb 100644
--- a/support/texlab/src/features/reference/entry.rs
+++ b/support/texlab/crates/texlab/src/features/reference/entry.rs
@@ -1,31 +1,28 @@
+use base_db::DocumentData;
use lsp_types::ReferenceContext;
use rowan::ast::AstNode;
-
-use crate::{
- db::parse::DocumentData,
- syntax::{
- bibtex::{self, HasName},
- latex,
- },
- util::cursor::CursorContext,
+use syntax::{
+ bibtex::{self, HasName},
+ latex,
};
+use crate::util::cursor::CursorContext;
+
use super::ReferenceResult;
-pub(super) fn find_all_references(
- context: &CursorContext<&ReferenceContext>,
- results: &mut Vec<ReferenceResult>,
+pub(super) fn find_all_references<'a>(
+ context: &CursorContext<'a, &ReferenceContext>,
+ results: &mut Vec<ReferenceResult<'a>>,
) -> Option<()> {
- let db = context.db;
let (key_text, _) = context
.find_citation_key_word()
.or_else(|| context.find_citation_key_command())
.or_else(|| context.find_entry_key())?;
- for document in context.related() {
- match document.parse(db) {
+ for document in &context.project.documents {
+ match &document.data {
DocumentData::Tex(data) => {
- data.root(db)
+ data.root_node()
.descendants()
.filter_map(latex::Citation::cast)
.filter_map(|citation| citation.key_list())
@@ -37,7 +34,7 @@ pub(super) fn find_all_references(
});
}
DocumentData::Bib(data) if context.params.include_declaration => {
- data.root(db)
+ data.root_node()
.children()
.filter_map(bibtex::Entry::cast)
.filter_map(|entry| entry.name_token())
@@ -48,9 +45,10 @@ pub(super) fn find_all_references(
});
}
DocumentData::Bib(_)
+ | DocumentData::Aux(_)
| DocumentData::Log(_)
- | DocumentData::TexlabRoot(_)
- | DocumentData::Tectonic(_) => {}
+ | DocumentData::Root
+ | DocumentData::Tectonic => {}
};
}
diff --git a/support/texlab/crates/texlab/src/features/reference/label.rs b/support/texlab/crates/texlab/src/features/reference/label.rs
new file mode 100644
index 0000000000..3f0433e0f9
--- /dev/null
+++ b/support/texlab/crates/texlab/src/features/reference/label.rs
@@ -0,0 +1,36 @@
+use base_db::{semantics::tex::LabelKind, DocumentData};
+use lsp_types::ReferenceContext;
+
+use crate::util::cursor::CursorContext;
+
+use super::ReferenceResult;
+
+pub(super) fn find_all_references<'a>(
+ context: &CursorContext<'a, &ReferenceContext>,
+ results: &mut Vec<ReferenceResult<'a>>,
+) -> Option<()> {
+ let (name_text, _) = context
+ .find_label_name_key()
+ .or_else(|| context.find_label_name_command())?;
+
+ for document in &context.project.documents {
+ let DocumentData::Tex(data) = &document.data else { continue };
+
+ for label in data
+ .semantics
+ .labels
+ .iter()
+ .filter(|label| label.name.text == name_text)
+ .filter(|label| {
+ label.kind != LabelKind::Definition || context.params.include_declaration
+ })
+ {
+ results.push(ReferenceResult {
+ document,
+ range: label.name.range,
+ });
+ }
+ }
+
+ Some(())
+}
diff --git a/support/texlab/src/features/reference/string.rs b/support/texlab/crates/texlab/src/features/reference/string.rs
index c4bc6ded3d..eca592309c 100644
--- a/support/texlab/src/features/reference/string.rs
+++ b/support/texlab/crates/texlab/src/features/reference/string.rs
@@ -1,18 +1,16 @@
+use base_db::DocumentData;
use lsp_types::ReferenceContext;
use rowan::ast::AstNode;
+use syntax::bibtex::{self, HasName};
-use crate::{
- syntax::bibtex::{self, HasName},
- util::cursor::CursorContext,
-};
+use crate::util::cursor::CursorContext;
use super::ReferenceResult;
-pub(super) fn find_all_references(
- context: &CursorContext<&ReferenceContext>,
- results: &mut Vec<ReferenceResult>,
+pub(super) fn find_all_references<'a>(
+ context: &CursorContext<'a, &ReferenceContext>,
+ results: &mut Vec<ReferenceResult<'a>>,
) -> Option<()> {
- let db = context.db;
let name_text = context
.cursor
.as_bib()
@@ -23,8 +21,9 @@ pub(super) fn find_all_references(
})?
.text();
- let data = context.document.parse(db).as_bib()?;
- for node in data.root(db).descendants() {
+ let DocumentData::Bib(data) = &context.document.data else { return None };
+
+ for node in data.root_node().descendants() {
if let Some(name) = bibtex::StringDef::cast(node.clone())
.and_then(|string| string.name_token())
.filter(|name| context.params.include_declaration && name.text() == name_text)
diff --git a/support/texlab/src/features/rename.rs b/support/texlab/crates/texlab/src/features/rename.rs
index 51781517b6..3746b9ca44 100644
--- a/support/texlab/src/features/rename.rs
+++ b/support/texlab/crates/texlab/src/features/rename.rs
@@ -2,33 +2,29 @@ mod command;
mod entry;
mod label;
+use base_db::{Document, Workspace};
use lsp_types::{Position, Range, TextEdit, Url, WorkspaceEdit};
use rowan::TextRange;
use rustc_hash::FxHashMap;
-use crate::{
- db::Document,
- util::{cursor::CursorContext, line_index_ext::LineIndexExt},
- Db,
-};
+use crate::util::{cursor::CursorContext, line_index_ext::LineIndexExt};
-pub fn prepare_rename_all(db: &dyn Db, uri: &Url, position: Position) -> Option<Range> {
- let context = CursorContext::new(db, uri, position, ())?;
+pub fn prepare_rename_all(workspace: &Workspace, uri: &Url, position: Position) -> Option<Range> {
+ let context = CursorContext::new(workspace, uri, position, ())?;
let range = entry::prepare_rename(&context)
.or_else(|| label::prepare_rename(&context))
.or_else(|| command::prepare_rename(&context))?;
- let line_index = context.document.line_index(db);
- Some(line_index.line_col_lsp_range(range))
+ Some(context.document.line_index.line_col_lsp_range(range))
}
pub fn rename_all(
- db: &dyn Db,
+ workspace: &Workspace,
uri: &Url,
position: Position,
new_name: String,
) -> Option<WorkspaceEdit> {
- let context = CursorContext::new(db, uri, position, Params { new_name })?;
+ let context = CursorContext::new(workspace, uri, position, Params { new_name })?;
let result = entry::rename(&context)
.or_else(|| label::rename(&context))
.or_else(|| command::rename(&context))?;
@@ -37,15 +33,14 @@ pub fn rename_all(
.changes
.into_iter()
.map(|(document, old_edits)| {
- let line_index = document.line_index(db);
let new_edits = old_edits
.into_iter()
.map(|Indel { delete, insert }| {
- TextEdit::new(line_index.line_col_lsp_range(delete), insert)
+ TextEdit::new(document.line_index.line_col_lsp_range(delete), insert)
})
.collect();
- (document.location(db).uri(db).clone(), new_edits)
+ (document.uri.clone(), new_edits)
})
.collect();
@@ -63,7 +58,7 @@ struct Indel {
insert: String,
}
-#[derive(Debug, PartialEq, Eq, Clone)]
-struct RenameResult {
- changes: FxHashMap<Document, Vec<Indel>>,
+#[derive(Debug)]
+struct RenameResult<'a> {
+ changes: FxHashMap<&'a Document, Vec<Indel>>,
}
diff --git a/support/texlab/crates/texlab/src/features/rename/command.rs b/support/texlab/crates/texlab/src/features/rename/command.rs
new file mode 100644
index 0000000000..5cb14f80d1
--- /dev/null
+++ b/support/texlab/crates/texlab/src/features/rename/command.rs
@@ -0,0 +1,39 @@
+use base_db::DocumentData;
+use rowan::{TextRange, TextSize};
+use rustc_hash::FxHashMap;
+use syntax::latex;
+
+use crate::util::cursor::CursorContext;
+
+use super::{Indel, Params, RenameResult};
+
+pub(super) fn prepare_rename<T>(context: &CursorContext<T>) -> Option<TextRange> {
+ context.cursor.command_range(context.offset)
+}
+
+pub(super) fn rename<'a>(context: &CursorContext<'a, Params>) -> Option<RenameResult<'a>> {
+ prepare_rename(context)?;
+ let name = context.cursor.as_tex()?.text();
+ let mut changes = FxHashMap::default();
+ for document in &context.project.documents {
+ let DocumentData::Tex(data) = &document.data else { continue };
+
+ let root = data.root_node();
+ let edits = root
+ .descendants_with_tokens()
+ .filter_map(|element| element.into_token())
+ .filter(|token| token.kind() == latex::COMMAND_NAME && token.text() == name)
+ .map(|token| {
+ let range = token.text_range();
+ Indel {
+ delete: TextRange::new(range.start() + TextSize::from(1), range.end()),
+ insert: context.params.new_name.clone(),
+ }
+ })
+ .collect();
+
+ changes.insert(*document, edits);
+ }
+
+ Some(RenameResult { changes })
+}
diff --git a/support/texlab/src/features/rename/entry.rs b/support/texlab/crates/texlab/src/features/rename/entry.rs
index 67c0388f4f..fd1fb183f9 100644
--- a/support/texlab/src/features/rename/entry.rs
+++ b/support/texlab/crates/texlab/src/features/rename/entry.rs
@@ -1,15 +1,13 @@
+use base_db::DocumentData;
use rowan::{ast::AstNode, TextRange};
use rustc_hash::FxHashMap;
-
-use crate::{
- db::parse::DocumentData,
- syntax::{
- bibtex::{self, HasName},
- latex,
- },
- util::cursor::CursorContext,
+use syntax::{
+ bibtex::{self, HasName},
+ latex,
};
+use crate::util::cursor::CursorContext;
+
use super::{Indel, Params, RenameResult};
pub(super) fn prepare_rename<T>(context: &CursorContext<T>) -> Option<TextRange> {
@@ -20,17 +18,18 @@ pub(super) fn prepare_rename<T>(context: &CursorContext<T>) -> Option<TextRange>
Some(range)
}
-pub(super) fn rename(context: &CursorContext<Params>) -> Option<RenameResult> {
+pub(super) fn rename<'a>(context: &CursorContext<'a, Params>) -> Option<RenameResult<'a>> {
prepare_rename(context)?;
let (key_text, _) = context
.find_citation_key_word()
.or_else(|| context.find_entry_key())?;
let mut changes = FxHashMap::default();
- for document in context.related() {
- match document.parse(context.db) {
+ for document in &context.project.documents {
+ match &document.data {
DocumentData::Tex(data) => {
- let root = data.root(context.db);
+ let root = data.root_node();
+
let edits: Vec<_> = root
.descendants()
.filter_map(latex::Citation::cast)
@@ -42,10 +41,11 @@ pub(super) fn rename(context: &CursorContext<Params>) -> Option<RenameResult> {
insert: context.params.new_name.clone(),
})
.collect();
- changes.insert(document, edits);
+
+ changes.insert(*document, edits);
}
DocumentData::Bib(data) => {
- let root = data.root(context.db);
+ let root = data.root_node();
let edits: Vec<_> = root
.descendants()
.filter_map(bibtex::Entry::cast)
@@ -56,10 +56,14 @@ pub(super) fn rename(context: &CursorContext<Params>) -> Option<RenameResult> {
insert: context.params.new_name.clone(),
})
.collect();
- changes.insert(document, edits);
+
+ changes.insert(*document, edits);
}
- DocumentData::Log(_) | DocumentData::TexlabRoot(_) | DocumentData::Tectonic(_) => {}
- }
+ DocumentData::Aux(_)
+ | DocumentData::Log(_)
+ | DocumentData::Root
+ | DocumentData::Tectonic => {}
+ };
}
Some(RenameResult { changes })
diff --git a/support/texlab/crates/texlab/src/features/rename/label.rs b/support/texlab/crates/texlab/src/features/rename/label.rs
new file mode 100644
index 0000000000..803fb61989
--- /dev/null
+++ b/support/texlab/crates/texlab/src/features/rename/label.rs
@@ -0,0 +1,37 @@
+use base_db::DocumentData;
+use rowan::TextRange;
+use rustc_hash::FxHashMap;
+
+use crate::util::cursor::CursorContext;
+
+use super::{Indel, Params, RenameResult};
+
+pub(super) fn prepare_rename<T>(context: &CursorContext<T>) -> Option<TextRange> {
+ let (_, range) = context.find_label_name_key()?;
+ Some(range)
+}
+
+pub(super) fn rename<'a>(context: &CursorContext<'a, Params>) -> Option<RenameResult<'a>> {
+ prepare_rename(context)?;
+ let (name_text, _) = context.find_label_name_key()?;
+
+ let mut changes = FxHashMap::default();
+ for document in &context.project.documents {
+ let DocumentData::Tex(data) = &document.data else { continue };
+
+ let edits = data
+ .semantics
+ .labels
+ .iter()
+ .filter(|label| label.name.text == name_text)
+ .map(|label| Indel {
+ delete: label.name.range,
+ insert: context.params.new_name.clone(),
+ })
+ .collect();
+
+ changes.insert(*document, edits);
+ }
+
+ Some(RenameResult { changes })
+}
diff --git a/support/texlab/src/features/symbol.rs b/support/texlab/crates/texlab/src/features/symbol.rs
index 26a0ec87ef..b8005eaf44 100644
--- a/support/texlab/src/features/symbol.rs
+++ b/support/texlab/crates/texlab/src/features/symbol.rs
@@ -5,31 +5,35 @@ mod types;
use std::cmp::Reverse;
-use lsp_types::{DocumentSymbolResponse, SymbolInformation, Url, WorkspaceSymbolParams};
+use base_db::Workspace;
+use lsp_types::{
+ ClientCapabilities, DocumentSymbolResponse, SymbolInformation, Url, WorkspaceSymbolParams,
+};
-use crate::{db::Workspace, util::capabilities::ClientCapabilitiesExt, Db};
+use crate::util::capabilities::ClientCapabilitiesExt;
use self::{project_order::ProjectOrdering, types::InternalSymbol};
-pub fn find_document_symbols(db: &dyn Db, uri: &Url) -> Option<DocumentSymbolResponse> {
- let workspace = Workspace::get(db);
- let document = workspace.lookup_uri(db, uri)?;
+pub fn find_document_symbols(
+ workspace: &Workspace,
+ uri: &Url,
+ client_capabilties: &ClientCapabilities,
+) -> Option<DocumentSymbolResponse> {
+ let document = workspace.lookup(uri)?;
+ let project = workspace.project(document);
let mut buf = Vec::new();
- latex::find_symbols(db, document, &mut buf);
- bibtex::find_symbols(db, document, &mut buf);
+ latex::find_symbols(workspace, &project, document, &mut buf);
+ bibtex::find_symbols(document, &mut buf);
- let config = &db.config().symbols;
+ let config = &workspace.config().symbols;
- InternalSymbol::filter(&mut buf, &config);
+ InternalSymbol::filter(&mut buf, config);
- if workspace
- .client_capabilities(db)
- .has_hierarchical_document_symbol_support()
- {
+ if client_capabilties.has_hierarchical_document_symbol_support() {
let symbols = buf
.into_iter()
- .map(|symbol| symbol.into_document_symbol(db))
+ .map(|symbol| symbol.into_document_symbol())
.collect();
Some(DocumentSymbolResponse::Nested(symbols))
@@ -44,7 +48,7 @@ pub fn find_document_symbols(db: &dyn Db, uri: &Url) -> Option<DocumentSymbolRes
.map(|symbol| symbol.into_symbol_info(uri.clone()))
.collect();
- sort_symbols(db, &mut new_buf);
+ sort_symbols(workspace, &mut new_buf);
Some(DocumentSymbolResponse::Flat(new_buf))
}
}
@@ -57,16 +61,17 @@ struct WorkspaceSymbol {
#[must_use]
pub fn find_workspace_symbols(
- db: &dyn Db,
+ workspace: &Workspace,
params: &WorkspaceSymbolParams,
) -> Vec<SymbolInformation> {
let mut symbols = Vec::new();
- let workspace = Workspace::get(db);
- for document in workspace.documents(db).iter().copied() {
+ for document in workspace.iter() {
+ let project = workspace.project(document);
+
let mut buf = Vec::new();
- latex::find_symbols(db, document, &mut buf);
- bibtex::find_symbols(db, document, &mut buf);
+ latex::find_symbols(workspace, &project, document, &mut buf);
+ bibtex::find_symbols(document, &mut buf);
let mut new_buf = Vec::new();
for symbol in buf {
@@ -76,7 +81,7 @@ pub fn find_workspace_symbols(
for symbol in new_buf {
symbols.push(WorkspaceSymbol {
search_text: symbol.search_text(),
- info: symbol.into_symbol_info(document.location(db).uri(db).clone()),
+ info: symbol.into_symbol_info(document.uri.clone()),
});
}
}
@@ -102,20 +107,20 @@ pub fn find_workspace_symbols(
}
}
- sort_symbols(db, &mut filtered);
+ sort_symbols(workspace, &mut filtered);
filtered
}
-fn sort_symbols(db: &dyn Db, symbols: &mut [SymbolInformation]) {
- let ordering = ProjectOrdering::new(db);
+fn sort_symbols(workspace: &Workspace, symbols: &mut [SymbolInformation]) {
+ let ordering = ProjectOrdering::new(workspace);
symbols.sort_by(|left, right| {
let left_key = (
- ordering.get(db, &left.location.uri),
+ ordering.get(&left.location.uri),
left.location.range.start,
Reverse(left.location.range.end),
);
let right_key = (
- ordering.get(db, &right.location.uri),
+ ordering.get(&right.location.uri),
right.location.range.start,
Reverse(right.location.range.end),
);
diff --git a/support/texlab/src/features/symbol/bibtex.rs b/support/texlab/crates/texlab/src/features/symbol/bibtex.rs
index 80c10ee1ba..6ddfe964ce 100644
--- a/support/texlab/src/features/symbol/bibtex.rs
+++ b/support/texlab/crates/texlab/src/features/symbol/bibtex.rs
@@ -1,27 +1,22 @@
+use base_db::{Document, DocumentData, LineIndex};
use rowan::ast::AstNode;
+use syntax::bibtex::{self, HasName, HasType};
-use crate::{
- db::Document,
- syntax::bibtex::{self, HasName, HasType},
- util::{
- lang_data::{BibtexEntryTypeCategory, LANGUAGE_DATA},
- line_index::LineIndex,
- line_index_ext::LineIndexExt,
- },
- Db,
+use crate::util::{
+ lang_data::{BibtexEntryTypeCategory, LANGUAGE_DATA},
+ line_index_ext::LineIndexExt,
};
use super::types::{InternalSymbol, InternalSymbolKind};
-pub fn find_symbols(db: &dyn Db, document: Document, buf: &mut Vec<InternalSymbol>) -> Option<()> {
- let data = document.parse(db).as_bib()?;
- let line_index = document.line_index(db);
- for node in data.root(db).children() {
+pub fn find_symbols(document: &Document, buf: &mut Vec<InternalSymbol>) {
+ let DocumentData::Bib(data) = &document.data else { return };
+
+ let line_index = &document.line_index;
+ for node in data.root_node().children() {
process_string(node.clone(), line_index, buf)
.or_else(|| process_entry(node, line_index, buf));
}
-
- Some(())
}
fn process_string(
diff --git a/support/texlab/src/features/symbol/latex.rs b/support/texlab/crates/texlab/src/features/symbol/latex.rs
index 8bb5680483..0f67f4fbc5 100644
--- a/support/texlab/src/features/symbol/latex.rs
+++ b/support/texlab/crates/texlab/src/features/symbol/latex.rs
@@ -1,29 +1,36 @@
use std::str::FromStr;
+use base_db::{semantics::Span, Document, DocumentData, Project, Workspace};
use lsp_types::Range;
-use rowan::ast::AstNode;
+use rowan::{ast::AstNode, TextRange};
+use syntax::latex::{self, HasBrack, HasCurly};
use titlecase::titlecase;
-use crate::{
- db::{Document, Word, Workspace},
- syntax::latex::{self, HasBrack, HasCurly},
- util::{
- label::{find_caption_by_parent, LabeledFloatKind},
- line_index_ext::LineIndexExt,
- },
- Db,
+use crate::util::{
+ label::{find_caption_by_parent, LabeledFloatKind},
+ line_index_ext::LineIndexExt,
};
use super::types::{InternalSymbol, InternalSymbolKind};
-pub fn find_symbols(db: &dyn Db, document: Document, buf: &mut Vec<InternalSymbol>) -> Option<()> {
- let data = document.parse(db).as_tex()?;
- let mut symbols = visit(db, document, data.root(db));
+pub fn find_symbols(
+ workspace: &Workspace,
+ project: &Project,
+ document: &Document,
+ buf: &mut Vec<InternalSymbol>,
+) {
+ let DocumentData::Tex(data) = &document.data else { return };
+
+ let mut symbols = visit(workspace, project, document, data.root_node());
buf.append(&mut symbols);
- Some(())
}
-fn visit(db: &dyn Db, document: Document, node: latex::SyntaxNode) -> Vec<InternalSymbol> {
+fn visit(
+ workspace: &Workspace,
+ project: &Project,
+ document: &Document,
+ node: latex::SyntaxNode,
+) -> Vec<InternalSymbol> {
let symbol = match node.kind() {
latex::PART
| latex::CHAPTER
@@ -31,23 +38,25 @@ fn visit(db: &dyn Db, document: Document, node: latex::SyntaxNode) -> Vec<Intern
| latex::SUBSECTION
| latex::SUBSUBSECTION
| latex::PARAGRAPH
- | latex::SUBPARAGRAPH => visit_section(db, document, node.clone()),
- latex::ENUM_ITEM => visit_enum_item(db, document, node.clone()),
- latex::EQUATION => visit_equation(db, document, node.clone()),
+ | latex::SUBPARAGRAPH => visit_section(project, document, node.clone()),
+ latex::ENUM_ITEM => visit_enum_item(workspace, project, document, node.clone()),
+ latex::EQUATION => visit_equation(project, document, node.clone()),
latex::ENVIRONMENT => latex::Environment::cast(node.clone())
.and_then(|env| env.begin())
.and_then(|begin| begin.name())
.and_then(|name| name.key())
.map(|name| name.to_string())
.and_then(|name| {
- if db.config().syntax.math_environments.contains(&name) {
- visit_equation_environment(db, document, node.clone())
- } else if db.config().syntax.enum_environments.contains(&name) {
- visit_enumeration(db, document, node.clone(), &name)
+ let config = &workspace.config().syntax;
+
+ if config.math_environments.contains(&name) {
+ visit_equation_environment(project, document, node.clone())
+ } else if config.enum_environments.contains(&name) {
+ visit_enumeration(project, document, node.clone(), &name)
} else if let Ok(float_kind) = LabeledFloatKind::from_str(&name) {
- visit_float(db, document, node.clone(), float_kind)
+ visit_float(project, document, node.clone(), float_kind)
} else {
- visit_theorem(db, document, node.clone(), &name)
+ visit_theorem(project, document, node.clone(), &name)
}
}),
_ => None,
@@ -56,51 +65,53 @@ fn visit(db: &dyn Db, document: Document, node: latex::SyntaxNode) -> Vec<Intern
match symbol {
Some(mut parent) => {
for child in node.children() {
- parent.children.append(&mut visit(db, document, child));
+ parent
+ .children
+ .append(&mut visit(workspace, project, document, child));
}
+
vec![parent]
}
None => {
let mut symbols = Vec::new();
for child in node.children() {
- symbols.append(&mut visit(db, document, child));
+ symbols.append(&mut visit(workspace, project, document, child));
}
+
symbols
}
}
}
fn visit_section(
- db: &dyn Db,
- document: Document,
+ project: &Project,
+ document: &Document,
node: latex::SyntaxNode,
) -> Option<InternalSymbol> {
let section = latex::Section::cast(node)?;
let full_range = document
- .line_index(db)
+ .line_index
.line_col_lsp_range(latex::small_range(&section));
let group = section.name()?;
let group_text = group.content_text()?;
- let symbol = match find_label_by_parent(db, document, section.syntax()) {
- Some(NumberedLabel {
- name: label,
- range: selection_range,
- number,
- }) => {
- let name = match number {
- Some(number) => format!("{} {}", number.text(db), group_text),
+ let label = NumberedLabel::find(project, section.syntax());
+
+ let symbol = match label {
+ Some(label) => {
+ let name = match label.number {
+ Some(number) => format!("{} {}", number, group_text),
None => group_text,
};
InternalSymbol {
name,
- label: Some(label),
+ label: Some(label.name.text),
kind: InternalSymbolKind::Section,
deprecated: false,
full_range,
- selection_range,
+ selection_range: document.line_index.line_col_lsp_range(label.range),
children: Vec::new(),
}
}
@@ -119,11 +130,12 @@ fn visit_section(
}
fn visit_enum_item(
- db: &dyn Db,
- document: Document,
+ workspace: &Workspace,
+ project: &Project,
+ document: &Document,
node: latex::SyntaxNode,
) -> Option<InternalSymbol> {
- let enum_envs = &db.config().syntax.enum_environments;
+ let enum_envs = &workspace.config().syntax.enum_environments;
let enum_item = latex::EnumItem::cast(node.clone())?;
if !enum_item
.syntax()
@@ -138,7 +150,7 @@ fn visit_enum_item(
}
let full_range = document
- .line_index(db)
+ .line_index
.line_col_lsp_range(latex::small_range(&enum_item));
let name = enum_item
@@ -146,20 +158,14 @@ fn visit_enum_item(
.and_then(|label| label.content_text())
.unwrap_or_else(|| "Item".to_string());
- let symbol = match find_label_by_parent(db, document, &node) {
- Some(NumberedLabel {
- name: label,
- range: selection_range,
- number,
- }) => InternalSymbol {
- name: number
- .map(|num| num.text(db).clone())
- .unwrap_or_else(|| name.clone()),
- label: Some(label),
+ let symbol = match NumberedLabel::find(project, &node) {
+ Some(label) => InternalSymbol {
+ name: label.number.map_or_else(|| name.clone(), String::from),
+ label: Some(label.name.text),
kind: InternalSymbolKind::EnumerationItem,
deprecated: false,
full_range,
- selection_range,
+ selection_range: document.line_index.line_col_lsp_range(label.range),
children: Vec::new(),
},
None => InternalSymbol {
@@ -172,61 +178,58 @@ fn visit_enum_item(
children: Vec::new(),
},
};
+
Some(symbol)
}
fn visit_equation(
- db: &dyn Db,
- document: Document,
+ project: &Project,
+ document: &Document,
node: latex::SyntaxNode,
) -> Option<InternalSymbol> {
let equation = latex::Equation::cast(node)?;
let full_range = document
- .line_index(db)
+ .line_index
.line_col_lsp_range(latex::small_range(&equation));
- make_equation_symbol(db, document, equation.syntax(), full_range)
+ make_equation_symbol(project, document, equation.syntax(), full_range)
}
fn visit_equation_environment(
- db: &dyn Db,
- document: Document,
+ project: &Project,
+ document: &Document,
node: latex::SyntaxNode,
) -> Option<InternalSymbol> {
let environment = latex::Environment::cast(node)?;
let full_range = document
- .line_index(db)
+ .line_index
.line_col_lsp_range(latex::small_range(&environment));
- make_equation_symbol(db, document, environment.syntax(), full_range)
+ make_equation_symbol(project, document, environment.syntax(), full_range)
}
fn make_equation_symbol(
- db: &dyn Db,
- document: Document,
+ project: &Project,
+ document: &Document,
node: &latex::SyntaxNode,
full_range: Range,
) -> Option<InternalSymbol> {
- let symbol = match find_label_by_parent(db, document, node) {
- Some(NumberedLabel {
- name: label,
- range: selection_range,
- number,
- }) => {
- let name = match number {
- Some(number) => format!("Equation ({})", number.text(db)),
+ let symbol = match NumberedLabel::find(project, node) {
+ Some(label) => {
+ let name = match label.number {
+ Some(number) => format!("Equation ({})", number),
None => "Equation".to_string(),
};
InternalSymbol {
name,
- label: Some(label),
+ label: Some(label.name.text),
kind: InternalSymbolKind::Equation,
deprecated: false,
full_range,
- selection_range,
+ selection_range: document.line_index.line_col_lsp_range(label.range),
children: Vec::new(),
}
}
@@ -240,39 +243,36 @@ fn make_equation_symbol(
children: Vec::new(),
},
};
+
Some(symbol)
}
fn visit_enumeration(
- db: &dyn Db,
- document: Document,
+ project: &Project,
+ document: &Document,
node: latex::SyntaxNode,
env_name: &str,
) -> Option<InternalSymbol> {
let environment = latex::Environment::cast(node)?;
let full_range = document
- .line_index(db)
+ .line_index
.line_col_lsp_range(latex::small_range(&environment));
let name = titlecase(env_name);
- let symbol = match find_label_by_parent(db, document, environment.syntax()) {
- Some(NumberedLabel {
- name: label,
- range: selection_range,
- number,
- }) => {
- let name = match number {
- Some(number) => format!("{} {}", name, number.text(db)),
+ let symbol = match NumberedLabel::find(project, environment.syntax()) {
+ Some(label) => {
+ let name = match label.number {
+ Some(number) => format!("{} {}", name, number),
None => name,
};
InternalSymbol {
name,
- label: Some(label),
+ label: Some(label.name.text),
kind: InternalSymbolKind::Enumeration,
deprecated: false,
full_range,
- selection_range,
+ selection_range: document.line_index.line_col_lsp_range(label.range),
children: Vec::new(),
}
}
@@ -290,14 +290,14 @@ fn visit_enumeration(
}
fn visit_float(
- db: &dyn Db,
- document: Document,
+ project: &Project,
+ document: &Document,
node: latex::SyntaxNode,
float_kind: LabeledFloatKind,
) -> Option<InternalSymbol> {
let environment = latex::Environment::cast(node)?;
let full_range = document
- .line_index(db)
+ .line_index
.line_col_lsp_range(latex::small_range(&environment));
let (float_kind, symbol_kind) = match float_kind {
@@ -308,24 +308,20 @@ fn visit_float(
};
let caption = find_caption_by_parent(environment.syntax())?;
- let symbol = match find_label_by_parent(db, document, environment.syntax()) {
- Some(NumberedLabel {
- name: label,
- range: selection_range,
- number,
- }) => {
- let name = match number {
- Some(number) => format!("{} {}: {}", float_kind, number.text(db), caption),
+ let symbol = match NumberedLabel::find(project, environment.syntax()) {
+ Some(label) => {
+ let name = match label.number {
+ Some(number) => format!("{} {}: {}", float_kind, number, caption),
None => format!("{}: {}", float_kind, caption),
};
InternalSymbol {
name,
- label: Some(label),
+ label: Some(label.name.text),
kind: symbol_kind,
deprecated: false,
full_range,
- selection_range,
+ selection_range: document.line_index.line_col_lsp_range(label.range),
children: Vec::new(),
}
}
@@ -344,17 +340,17 @@ fn visit_float(
}
fn visit_theorem(
- db: &dyn Db,
- document: Document,
+ project: &Project,
+ document: &Document,
node: latex::SyntaxNode,
environment_name: &str,
) -> Option<InternalSymbol> {
- let definition = Workspace::get(db)
- .related(db, document)
+ let definition = project
+ .documents
.iter()
- .filter_map(|document| document.parse(db).as_tex())
- .flat_map(|data| data.analyze(db).theorem_environments(db))
- .find(|env| env.name(db).text(db) == environment_name)?;
+ .filter_map(|document| document.data.as_tex())
+ .flat_map(|data| data.semantics.theorem_definitions.iter())
+ .find(|theorem| theorem.name.text == environment_name)?;
let node = latex::Environment::cast(node)?;
let theorem_description = node
@@ -363,48 +359,36 @@ fn visit_theorem(
.and_then(|option| option.content_text());
let full_range = document
- .line_index(db)
+ .line_index
.line_col_lsp_range(latex::small_range(&node));
- let symbol = match find_label_by_parent(db, document, node.syntax()) {
- Some(NumberedLabel {
- name: label,
- range: selection_range,
- number,
- }) => {
- let name = match (number, theorem_description) {
+ let symbol = match NumberedLabel::find(project, node.syntax()) {
+ Some(label) => {
+ let name = match (label.number, theorem_description) {
(Some(number), Some(desc)) => {
- format!(
- "{} {} ({})",
- definition.description(db).text(db),
- number.text(db),
- desc
- )
+ format!("{} {} ({})", definition.description, number, desc)
}
- (Some(number), None) => format!(
- "{} {}",
- definition.description(db).text(db),
- number.text(db)
- ),
- (None, Some(desc)) => format!("{} ({})", definition.description(db).text(db), desc),
- (None, None) => definition.description(db).text(db).clone(),
+ (Some(number), None) => format!("{} {}", definition.description, number),
+ (None, Some(desc)) => format!("{} ({})", definition.description, desc),
+ (None, None) => definition.description.clone(),
};
InternalSymbol {
name,
- label: Some(label),
+ label: Some(label.name.text),
kind: InternalSymbolKind::Theorem,
deprecated: false,
full_range,
- selection_range,
+ selection_range: document.line_index.line_col_lsp_range(label.range),
children: Vec::new(),
}
}
None => {
let name = match theorem_description {
- Some(desc) => format!("{} ({})", definition.description(db).text(db), desc),
- None => definition.description(db).text(db).clone(),
+ Some(desc) => format!("{} ({})", definition.description, desc),
+ None => definition.description.clone(),
};
+
InternalSymbol {
name,
label: None,
@@ -416,31 +400,32 @@ fn visit_theorem(
}
}
};
+
Some(symbol)
}
-#[derive(Debug, PartialEq, Eq, Clone)]
-struct NumberedLabel {
- name: Word,
- range: Range,
- number: Option<Word>,
+#[derive(Debug)]
+struct NumberedLabel<'a> {
+ name: Span,
+ range: TextRange,
+ number: Option<&'a str>,
}
-fn find_label_by_parent(
- db: &dyn Db,
- document: Document,
- parent: &latex::SyntaxNode,
-) -> Option<NumberedLabel> {
- let node = parent.children().find_map(latex::LabelDefinition::cast)?;
- let name = Word::new(db, node.name()?.key()?.to_string());
- let range = document
- .line_index(db)
- .line_col_lsp_range(latex::small_range(&node));
+impl<'a> NumberedLabel<'a> {
+ fn find(project: &Project<'a>, parent: &latex::SyntaxNode) -> Option<Self> {
+ let label = parent.children().find_map(latex::LabelDefinition::cast)?;
+ let name = Span::from(&label.name()?.key()?);
+ let number = project
+ .documents
+ .iter()
+ .filter_map(|document| document.data.as_aux())
+ .find_map(|data| data.semantics.label_numbers.get(&name.text))
+ .map(|number| number.as_str());
- let number = Workspace::get(db).number_of_label(db, document, name);
- Some(NumberedLabel {
- name,
- range,
- number,
- })
+ Some(NumberedLabel {
+ name,
+ range: latex::small_range(&label),
+ number,
+ })
+ }
}
diff --git a/support/texlab/crates/texlab/src/features/symbol/project_order.rs b/support/texlab/crates/texlab/src/features/symbol/project_order.rs
new file mode 100644
index 0000000000..9dfb146f2b
--- /dev/null
+++ b/support/texlab/crates/texlab/src/features/symbol/project_order.rs
@@ -0,0 +1,203 @@
+use base_db::{graph, Document, Workspace};
+use itertools::Itertools;
+use lsp_types::Url;
+
+#[derive(Debug, PartialEq, Eq, Clone)]
+pub struct ProjectOrdering<'a> {
+ ordering: Vec<&'a Document>,
+}
+
+impl<'a> ProjectOrdering<'a> {
+ pub fn new(workspace: &'a Workspace) -> Self {
+ let ordering: Vec<_> = workspace
+ .iter()
+ .filter(|document| {
+ document
+ .data
+ .as_tex()
+ .map_or(false, |data| data.semantics.can_be_root)
+ })
+ .chain(workspace.iter())
+ .flat_map(|document| {
+ graph::Graph::new(workspace, document)
+ .preorder()
+ .rev()
+ .collect_vec()
+ })
+ .unique()
+ .collect();
+
+ Self { ordering }
+ }
+
+ pub fn get(&self, uri: &Url) -> usize {
+ self.ordering
+ .iter()
+ .position(|doc| doc.uri == *uri)
+ .unwrap_or(std::usize::MAX)
+ }
+}
+
+#[cfg(test)]
+mod tests {
+ use base_db::Owner;
+ use distro::Language;
+ use rowan::TextSize;
+
+ use super::*;
+
+ #[test]
+ fn test_no_cycles() {
+ let mut workspace = Workspace::default();
+
+ let a = Url::parse("http://example.com/a.tex").unwrap();
+ let b = Url::parse("http://example.com/b.tex").unwrap();
+ let c = Url::parse("http://example.com/c.tex").unwrap();
+
+ workspace.open(
+ a.clone(),
+ String::new(),
+ Language::Tex,
+ Owner::Client,
+ TextSize::default(),
+ );
+
+ workspace.open(
+ b.clone(),
+ String::new(),
+ Language::Tex,
+ Owner::Client,
+ TextSize::default(),
+ );
+
+ workspace.open(
+ c.clone(),
+ r#"\documentclass{article}\include{b}\include{a}"#.to_string(),
+ Language::Tex,
+ Owner::Client,
+ TextSize::default(),
+ );
+
+ let ordering = ProjectOrdering::new(&workspace);
+ assert_eq!(ordering.get(&a), 0);
+ assert_eq!(ordering.get(&b), 1);
+ assert_eq!(ordering.get(&c), 2);
+ }
+
+ #[test]
+ fn test_two_layers() {
+ let mut workspace = Workspace::default();
+
+ let a = Url::parse("http://example.com/a.tex").unwrap();
+ let b = Url::parse("http://example.com/b.tex").unwrap();
+ let c = Url::parse("http://example.com/c.tex").unwrap();
+
+ workspace.open(
+ a.clone(),
+ String::new(),
+ Language::Tex,
+ Owner::Client,
+ TextSize::default(),
+ );
+ workspace.open(
+ b.clone(),
+ r#"\include{a}"#.to_string(),
+ Language::Tex,
+ Owner::Client,
+ TextSize::default(),
+ );
+ workspace.open(
+ c.clone(),
+ r#"\begin{documnent}\include{b}\end{document}"#.to_string(),
+ Language::Tex,
+ Owner::Client,
+ TextSize::default(),
+ );
+
+ let ordering = ProjectOrdering::new(&workspace);
+ assert_eq!(ordering.get(&a), 0);
+ assert_eq!(ordering.get(&b), 1);
+ assert_eq!(ordering.get(&c), 2);
+ }
+
+ #[test]
+ fn test_cycles() {
+ let mut workspace = Workspace::default();
+
+ let a = Url::parse("http://example.com/a.tex").unwrap();
+ let b = Url::parse("http://example.com/b.tex").unwrap();
+ let c = Url::parse("http://example.com/c.tex").unwrap();
+ workspace.open(
+ a.clone(),
+ r#"\begin{document}\include{b}\end{document}"#.to_string(),
+ Language::Tex,
+ Owner::Client,
+ TextSize::default(),
+ );
+
+ workspace.open(
+ b.clone(),
+ r#"\include{a}"#.to_string(),
+ Language::Tex,
+ Owner::Client,
+ TextSize::default(),
+ );
+
+ workspace.open(
+ c.clone(),
+ r#"\include{a}"#.to_string(),
+ Language::Tex,
+ Owner::Client,
+ TextSize::default(),
+ );
+
+ let ordering = ProjectOrdering::new(&workspace);
+ assert_ne!(ordering.get(&a), 0);
+ }
+
+ #[test]
+ fn test_multiple_roots() {
+ let mut workspace = Workspace::default();
+
+ let a = Url::parse("http://example.com/a.tex").unwrap();
+ let b = Url::parse("http://example.com/b.tex").unwrap();
+ let c = Url::parse("http://example.com/c.tex").unwrap();
+ let d = Url::parse("http://example.com/d.tex").unwrap();
+
+ workspace.open(
+ a.clone(),
+ r#"\begin{document}\include{b}\end{document}"#.to_string(),
+ Language::Tex,
+ Owner::Client,
+ TextSize::default(),
+ );
+
+ workspace.open(
+ b.clone(),
+ String::new(),
+ Language::Tex,
+ Owner::Client,
+ TextSize::default(),
+ );
+
+ workspace.open(
+ c.clone(),
+ String::new(),
+ Language::Tex,
+ Owner::Client,
+ TextSize::default(),
+ );
+
+ workspace.open(
+ d.clone(),
+ r#"\begin{document}\include{c}\end{document}"#.to_string(),
+ Language::Tex,
+ Owner::Client,
+ TextSize::default(),
+ );
+
+ let ordering = ProjectOrdering::new(&workspace);
+ assert!(ordering.get(&b) < ordering.get(&a));
+ assert!(ordering.get(&c) < ordering.get(&d));
+ }
+}
diff --git a/support/texlab/src/features/symbol/types.rs b/support/texlab/crates/texlab/src/features/symbol/types.rs
index 9e8ea28792..b8fc9b462f 100644
--- a/support/texlab/src/features/symbol/types.rs
+++ b/support/texlab/crates/texlab/src/features/symbol/types.rs
@@ -1,10 +1,7 @@
+use base_db::SymbolConfig;
use lsp_types::{DocumentSymbol, Location, Range, SymbolInformation, SymbolKind, Url};
-use crate::{
- db::Word,
- util::{self, lang_data::BibtexEntryTypeCategory, lsp_enums::Structure},
- Db, SymbolConfig,
-};
+use crate::util::{self, lang_data::BibtexEntryTypeCategory, lsp_enums::Structure};
#[derive(Debug, PartialEq, Eq, Clone, Copy)]
pub enum InternalSymbolKind {
@@ -43,7 +40,7 @@ impl InternalSymbolKind {
#[derive(Debug, PartialEq, Eq, Clone)]
pub struct InternalSymbol {
pub name: String,
- pub label: Option<Word>,
+ pub label: Option<String>,
pub kind: InternalSymbolKind,
pub deprecated: bool,
pub full_range: Range,
@@ -102,17 +99,17 @@ impl InternalSymbol {
}
}
- pub fn into_document_symbol(self, db: &dyn Db) -> DocumentSymbol {
+ pub fn into_document_symbol(self) -> DocumentSymbol {
let children = self
.children
.into_iter()
- .map(|child| child.into_document_symbol(db))
+ .map(|child| child.into_document_symbol())
.collect();
#[allow(deprecated)]
DocumentSymbol {
name: self.name,
- detail: self.label.map(|word| word.text(db).clone()),
+ detail: self.label,
kind: self.kind.into_symbol_kind(),
deprecated: Some(self.deprecated),
range: self.full_range,
diff --git a/support/texlab/src/features/workspace_command.rs b/support/texlab/crates/texlab/src/features/workspace_command.rs
index cac998125e..cac998125e 100644
--- a/support/texlab/src/features/workspace_command.rs
+++ b/support/texlab/crates/texlab/src/features/workspace_command.rs
diff --git a/support/texlab/src/features/workspace_command/change_environment.rs b/support/texlab/crates/texlab/src/features/workspace_command/change_environment.rs
index ef2c96eae1..a7d2eba6cf 100644
--- a/support/texlab/src/features/workspace_command/change_environment.rs
+++ b/support/texlab/crates/texlab/src/features/workspace_command/change_environment.rs
@@ -1,6 +1,7 @@
use std::collections::hash_map::HashMap;
use anyhow::Result;
+use base_db::Workspace;
use lsp_types::{ApplyWorkspaceEditParams, TextDocumentPositionParams, TextEdit, WorkspaceEdit};
use rowan::ast::AstNode;
use serde::{Deserialize, Serialize};
@@ -9,11 +10,10 @@ use thiserror::Error;
use crate::{
normalize_uri,
util::{cursor::CursorContext, line_index_ext::LineIndexExt},
- Db,
};
fn change_environment_context(
- db: &dyn Db,
+ workspace: &Workspace,
args: Vec<serde_json::Value>,
) -> Result<CursorContext<Params>> {
let params: ChangeEnvironmentParams = serde_json::from_value(
@@ -28,7 +28,7 @@ fn change_environment_context(
let position = params.text_document_position.position;
CursorContext::new(
- db,
+ workspace,
&uri,
position,
Params {
@@ -39,10 +39,10 @@ fn change_environment_context(
}
pub fn change_environment(
- db: &dyn Db,
+ workspace: &Workspace,
args: Vec<serde_json::Value>,
) -> Option<((), ApplyWorkspaceEditParams)> {
- let context = change_environment_context(db, args).ok()?;
+ let context = change_environment_context(workspace, args).ok()?;
let (beg, end) = context.find_environment()?;
let beg_name = beg.to_string();
@@ -53,10 +53,10 @@ pub fn change_environment(
}
let new_name = &context.params.new_name;
- let line_index = context.document.line_index(db);
+ let line_index = &context.document.line_index;
let mut changes = HashMap::default();
changes.insert(
- context.document.location(db).uri(db).clone(),
+ context.document.uri.clone(),
vec![
TextEdit::new(
line_index.line_col_lsp_range(beg.syntax().text_range()),
diff --git a/support/texlab/src/features/workspace_command/clean.rs b/support/texlab/crates/texlab/src/features/workspace_command/clean.rs
index cea22fc687..d11c278d8c 100644
--- a/support/texlab/src/features/workspace_command/clean.rs
+++ b/support/texlab/crates/texlab/src/features/workspace_command/clean.rs
@@ -1,10 +1,11 @@
use std::process::Stdio;
use anyhow::Result;
+use base_db::Workspace;
use lsp_types::{TextDocumentIdentifier, Url};
use thiserror::Error;
-use crate::{db::Workspace, normalize_uri, Db};
+use crate::normalize_uri;
#[derive(Debug, Error)]
pub enum CleanError {
@@ -31,7 +32,11 @@ pub struct CleanCommand {
}
impl CleanCommand {
- pub fn new(db: &dyn Db, options: CleanOptions, args: Vec<serde_json::Value>) -> Result<Self> {
+ pub fn new(
+ workspace: &Workspace,
+ options: CleanOptions,
+ args: Vec<serde_json::Value>,
+ ) -> Result<Self> {
let params: TextDocumentIdentifier =
serde_json::from_value(args.into_iter().next().ok_or(CleanError::MissingArg)?)
.map_err(CleanError::InvalidArg)?;
@@ -39,26 +44,19 @@ impl CleanCommand {
let mut uri = params.uri;
normalize_uri(&mut uri);
- let workspace = Workspace::get(db);
-
let document = workspace
- .lookup_uri(db, &uri)
+ .lookup(&uri)
.ok_or_else(|| CleanError::DocumentNotFound(uri.clone()))?;
- let working_dir = workspace.working_dir(db, document.directory(db));
-
- let output_dir = workspace
- .output_dir(db, working_dir)
- .path(db)
- .as_deref()
- .ok_or_else(|| CleanError::NoLocalFile(uri.clone()))?;
-
let path = document
- .location(db)
- .path(db)
+ .path
.as_deref()
.ok_or_else(|| CleanError::NoLocalFile(uri.clone()))?;
+ let current_dir = workspace.current_dir(&document.dir);
+
+ let output_dir = workspace.output_dir(&current_dir).to_file_path().unwrap();
+
let flag = match options {
CleanOptions::Auxiliary => "-c",
CleanOptions::Artifacts => "-C",
diff --git a/support/texlab/crates/texlab/src/features/workspace_command/dep_graph.rs b/support/texlab/crates/texlab/src/features/workspace_command/dep_graph.rs
new file mode 100644
index 0000000000..faf20d301e
--- /dev/null
+++ b/support/texlab/crates/texlab/src/features/workspace_command/dep_graph.rs
@@ -0,0 +1,57 @@
+use anyhow::Result;
+use base_db::{graph, Document, Workspace};
+use itertools::Itertools;
+use std::io::Write;
+
+use rustc_hash::FxHashMap;
+
+pub fn show_dependency_graph(workspace: &Workspace) -> Result<String> {
+ let documents = workspace
+ .iter()
+ .enumerate()
+ .map(|(i, doc)| (doc, format!("v{i:0>5}")))
+ .collect::<FxHashMap<&Document, String>>();
+
+ let mut writer = Vec::new();
+ writeln!(&mut writer, "digraph G {{")?;
+ writeln!(&mut writer, "rankdir = LR;")?;
+
+ for (document, node) in &documents {
+ let label = document.uri.as_str();
+ let shape = if document
+ .data
+ .as_tex()
+ .map_or(false, |data| data.semantics.can_be_root)
+ {
+ "tripleoctagon"
+ } else if document
+ .data
+ .as_tex()
+ .map_or(false, |data| data.semantics.can_be_compiled)
+ {
+ "doubleoctagon"
+ } else {
+ "octagon"
+ };
+
+ writeln!(&mut writer, "\t{node} [label=\"{label}\", shape={shape}];")?;
+ }
+
+ for edge in workspace
+ .iter()
+ .flat_map(|start| graph::Graph::new(workspace, start).edges)
+ .unique()
+ {
+ let source = &documents[edge.source];
+ let target = &documents[edge.target];
+ let label = edge
+ .weight
+ .as_ref()
+ .map_or("<artifact>", |weight| &weight.link.path.text);
+
+ writeln!(&mut writer, "\t{source} -> {target} [label=\"{label}\"];")?;
+ }
+
+ writeln!(&mut writer, "}}")?;
+ Ok(String::from_utf8(writer)?)
+}
diff --git a/support/texlab/crates/texlab/src/lib.rs b/support/texlab/crates/texlab/src/lib.rs
new file mode 100644
index 0000000000..e17aab362b
--- /dev/null
+++ b/support/texlab/crates/texlab/src/lib.rs
@@ -0,0 +1,33 @@
+mod client;
+pub mod features;
+mod server;
+pub mod util;
+
+pub use self::{client::LspClient, server::Server};
+
+pub(crate) fn normalize_uri(uri: &mut lsp_types::Url) {
+ fn fix_drive_letter(text: &str) -> Option<String> {
+ if !text.is_ascii() {
+ return None;
+ }
+
+ match &text[1..] {
+ ":" => Some(text.to_ascii_uppercase()),
+ "%3A" | "%3a" => Some(format!("{}:", text[0..1].to_ascii_uppercase())),
+ _ => None,
+ }
+ }
+
+ if let Some(mut segments) = uri.path_segments() {
+ if let Some(mut path) = segments.next().and_then(fix_drive_letter) {
+ for segment in segments {
+ path.push('/');
+ path.push_str(segment);
+ }
+
+ uri.set_path(&path);
+ }
+ }
+
+ uri.set_fragment(None);
+}
diff --git a/support/texlab/src/main.rs b/support/texlab/crates/texlab/src/main.rs
index ed807f8799..ed807f8799 100644
--- a/support/texlab/src/main.rs
+++ b/support/texlab/crates/texlab/src/main.rs
diff --git a/support/texlab/src/server.rs b/support/texlab/crates/texlab/src/server.rs
index bf0ef64261..0d52c41463 100644
--- a/support/texlab/src/server.rs
+++ b/support/texlab/crates/texlab/src/server.rs
@@ -1,6 +1,5 @@
mod dispatch;
pub mod options;
-mod query;
use std::{
path::PathBuf,
@@ -8,22 +7,22 @@ use std::{
};
use anyhow::Result;
+use base_db::{Config, Owner, Workspace};
use crossbeam_channel::{Receiver, Sender};
-use log::{error, info};
+use distro::{Distro, Language};
use lsp_server::{Connection, ErrorCode, Message, RequestId};
use lsp_types::{notification::*, request::*, *};
use once_cell::sync::Lazy;
+use parking_lot::RwLock;
use rowan::{ast::AstNode, TextSize};
-use rustc_hash::FxHashSet;
+use rustc_hash::{FxHashMap, FxHashSet};
use serde::{Deserialize, Serialize};
use serde_repr::{Deserialize_repr, Serialize_repr};
+use syntax::bibtex;
use threadpool::ThreadPool;
use crate::{
- citation,
client::LspClient,
- db::{self, discover_dependencies, Document, Language, Owner, Workspace},
- distro::Distro,
features::{
build::{self, BuildParams, BuildResult, BuildStatus},
completion::{self, builder::CompletionItemData},
@@ -32,12 +31,10 @@ use crate::{
workspace_command::{change_environment, clean, dep_graph},
},
normalize_uri,
- syntax::bibtex,
util::{
self, capabilities::ClientCapabilitiesExt, components::COMPONENT_DATABASE,
line_index_ext::LineIndexExt,
},
- Config, Db,
};
use self::options::{Options, StartupOptions};
@@ -49,15 +46,18 @@ enum InternalMessage {
FileEvent(notify::Event),
ForwardSearch(Url),
Diagnostics,
- ChktexResult(Url, Vec<db::diagnostics::Diagnostic>),
+ ChktexResult(Url, Vec<lsp_types::Diagnostic>),
}
pub struct Server {
connection: Arc<Connection>,
internal_tx: Sender<InternalMessage>,
internal_rx: Receiver<InternalMessage>,
+ workspace: Arc<RwLock<Workspace>>,
client: LspClient,
- engine: query::Engine,
+ client_capabilities: Arc<ClientCapabilities>,
+ client_info: Option<Arc<ClientInfo>>,
+ chktex_diagnostics: FxHashMap<Url, Vec<Diagnostic>>,
watcher: FileWatcher,
pool: ThreadPool,
}
@@ -71,33 +71,38 @@ impl Server {
connection: Arc::new(connection),
internal_tx,
internal_rx,
+ workspace: Default::default(),
client,
- engine: query::Engine::default(),
+ client_capabilities: Default::default(),
+ client_info: Default::default(),
+ chktex_diagnostics: Default::default(),
watcher,
pool: threadpool::Builder::new().build(),
}
}
- fn run_with_db<R, Q>(&self, id: RequestId, query: Q)
+ fn run_query<R, Q>(&self, id: RequestId, query: Q)
where
R: Serialize,
- Q: FnOnce(&dyn Db) -> R + Send + 'static,
+ Q: FnOnce(&Workspace) -> R + Send + 'static,
{
let client = self.client.clone();
- self.engine.fork(move |db| {
- let response = lsp_server::Response::new_ok(id, query(db));
+ let workspace = Arc::clone(&self.workspace);
+ self.pool.execute(move || {
+ let response = lsp_server::Response::new_ok(id, query(&workspace.read()));
client.send_response(response).unwrap();
});
}
- fn run_and_request_with_db<R, S, Q>(&self, id: RequestId, query: Q)
+ fn run_query_and_request<R, S, Q>(&self, id: RequestId, query: Q)
where
R: Request,
S: Serialize,
- Q: FnOnce(&dyn Db) -> Option<(S, R::Params)> + Send + 'static,
+ Q: FnOnce(&Workspace) -> Option<(S, R::Params)> + Send + 'static,
{
let client = self.client.clone();
- self.engine.fork(move |db| match query(db) {
+ let workspace = Arc::clone(&self.workspace);
+ self.pool.execute(move || match query(&workspace.read()) {
Some((result, request_params)) => {
let response = lsp_server::Response::new_ok(id, result);
client.send_response(response).unwrap();
@@ -110,7 +115,7 @@ impl Server {
});
}
- fn run_errorable<R, Q>(&self, id: RequestId, query: Q)
+ fn run_fallible<R, Q>(&self, id: RequestId, query: Q)
where
R: Serialize,
Q: FnOnce() -> Result<R> + Send + 'static,
@@ -187,31 +192,18 @@ impl Server {
let (id, params) = self.connection.initialize_start()?;
let params: InitializeParams = serde_json::from_value(params)?;
- let db = self.engine.write();
- let workspace = Workspace::get(db);
- workspace
- .set_client_capabilities(db)
- .with_durability(salsa::Durability::HIGH)
- .to(params.capabilities);
-
- db::ServerContext::get(db)
- .set_always_incomplete_completion_list(db)
- .with_durability(salsa::Durability::HIGH)
- .to(params
- .client_info
- .map_or(false, |client| &client.name == "Visual Studio Code"));
-
- let root_dirs = params
+ self.client_capabilities = Arc::new(params.capabilities);
+ self.client_info = params.client_info.map(Arc::new);
+
+ let workspace_folders = params
.workspace_folders
.unwrap_or_default()
.into_iter()
- .map(|folder| db::Location::new(db, folder.uri))
+ .filter(|folder| folder.uri.scheme() == "file")
+ .flat_map(|folder| folder.uri.to_file_path())
.collect();
- workspace
- .set_root_dirs(db)
- .with_durability(salsa::Durability::HIGH)
- .to(root_dirs);
+ self.workspace.write().set_folders(workspace_folders);
let result = InitializeResult {
capabilities: self.capabilities(),
@@ -235,7 +227,7 @@ impl Server {
Distro::default()
});
- info!("Detected distribution: {:?}", distro.kind);
+ log::info!("Detected distribution: {:?}", distro.kind);
sender.send(InternalMessage::SetDistro(distro)).unwrap();
});
}
@@ -246,12 +238,7 @@ impl Server {
}
fn register_configuration(&mut self) {
- let db = self.engine.read();
-
- if Workspace::get(db)
- .client_capabilities(db)
- .has_push_configuration_support()
- {
+ if self.client_capabilities.has_push_configuration_support() {
let registration = Registration {
id: "pull-config".to_string(),
method: DidChangeConfiguration::METHOD.to_string(),
@@ -276,19 +263,27 @@ impl Server {
}
fn update_workspace(&mut self) {
- let db = self.engine.write();
- discover_dependencies(db);
- self.watcher.watch(db);
+ let mut workspace = self.workspace.write();
+ workspace.discover();
+ self.watcher.watch(&mut workspace);
+ drop(workspace);
self.publish_diagnostics_with_delay();
}
fn publish_diagnostics(&mut self) -> Result<()> {
- let db = self.engine.read();
+ let workspace = self.workspace.read();
+ let mut all_diagnostics = util::diagnostics::collect(&workspace);
+
+ for (uri, diagnostics) in &self.chktex_diagnostics {
+ let Some(document) = workspace.lookup(uri) else { continue };
+ let Some(existing) = all_diagnostics.get_mut(document) else { continue };
+ existing.extend(diagnostics.iter().cloned());
+ }
- let all_diagnostics = db::diagnostics::collect_filtered(db, Workspace::get(db));
+ util::diagnostics::filter(&mut all_diagnostics, &workspace);
for (document, diagnostics) in all_diagnostics {
- let uri = document.location(db).uri(db).clone();
+ let uri = document.uri.clone();
let version = None;
let params = PublishDiagnosticsParams {
uri,
@@ -304,9 +299,8 @@ impl Server {
}
fn publish_diagnostics_with_delay(&mut self) {
- let db = self.engine.read();
let sender = self.internal_tx.clone();
- let delay = db.config().diagnostics.delay;
+ let delay = self.workspace.read().config().diagnostics.delay;
self.pool.execute(move || {
std::thread::sleep(delay);
sender.send(InternalMessage::Diagnostics).unwrap();
@@ -314,12 +308,7 @@ impl Server {
}
fn pull_options(&mut self) {
- let db = self.engine.read();
- let workspace = Workspace::get(db);
- if !workspace
- .client_capabilities(db)
- .has_pull_configuration_support()
- {
+ if !self.client_capabilities.has_pull_configuration_support() {
return;
}
@@ -342,20 +331,16 @@ impl Server {
sender.send(InternalMessage::SetOptions(options)).unwrap();
}
Err(why) => {
- error!("Retrieving configuration failed: {}", why);
+ log::error!("Retrieving configuration failed: {}", why);
}
};
});
}
fn update_options(&mut self, options: Options) {
- let db = self.engine.write();
- db::ServerContext::get(db)
- .set_config(db)
- .with_durability(salsa::Durability::MEDIUM)
- .to(Config::from(options));
-
- self.watcher.watch(db);
+ let mut workspace = self.workspace.write();
+ workspace.set_config(Config::from(options));
+ self.watcher.watch(&mut workspace);
}
fn cancel(&self, _params: CancelParams) -> Result<()> {
@@ -367,12 +352,7 @@ impl Server {
}
fn did_change_configuration(&mut self, params: DidChangeConfigurationParams) -> Result<()> {
- let db = self.engine.read();
- let workspace = Workspace::get(db);
- if workspace
- .client_capabilities(db)
- .has_pull_configuration_support()
- {
+ if self.client_capabilities.has_pull_configuration_support() {
self.pull_options();
} else {
let options = self.client.parse_options(params.settings)?;
@@ -382,25 +362,24 @@ impl Server {
Ok(())
}
- fn did_open(&mut self, mut params: DidOpenTextDocumentParams) -> Result<()> {
- normalize_uri(&mut params.text_document.uri);
+ fn did_open(&mut self, params: DidOpenTextDocumentParams) -> Result<()> {
+ let mut uri = params.text_document.uri;
+ normalize_uri(&mut uri);
- let db = self.engine.write();
- let workspace = Workspace::get(db);
let language_id = &params.text_document.language_id;
let language = Language::from_id(language_id).unwrap_or(Language::Tex);
- let document = workspace.open(
- db,
- params.text_document.uri,
+ self.workspace.write().open(
+ uri.clone(),
params.text_document.text,
language,
Owner::Client,
+ TextSize::default(),
);
self.update_workspace();
- if self.engine.read().config().diagnostics.chktex.on_open {
- self.run_chktex(document);
+ if self.workspace.read().config().diagnostics.chktex.on_open {
+ self.run_chktex(&uri);
}
Ok(())
@@ -410,37 +389,35 @@ impl Server {
let mut uri = params.text_document.uri;
normalize_uri(&mut uri);
- let db = self.engine.write();
- let workspace = Workspace::get(db);
- let document = match workspace.lookup_uri(db, &uri) {
- Some(document) => document,
- None => return Ok(()),
- };
+ let mut workspace = self.workspace.write();
for change in params.content_changes {
+ let Some(document) = workspace.lookup(&uri) else { return Ok(()) };
match change.range {
Some(range) => {
- let range = document.line_index(db).offset_lsp_range(range);
- document.edit(db, range, &change.text);
+ let range = document.line_index.offset_lsp_range(range);
+ drop(document);
+ workspace.edit(&uri, range, &change.text);
}
None => {
- document
- .set_text(db)
- .with_durability(salsa::Durability::LOW)
- .to(change.text);
-
- document
- .set_cursor(db)
- .with_durability(salsa::Durability::LOW)
- .to(TextSize::from(0));
+ let language = document.language;
+ drop(document);
+ workspace.open(
+ uri.clone(),
+ change.text,
+ language,
+ Owner::Client,
+ TextSize::default(),
+ );
}
};
}
+ drop(workspace);
self.update_workspace();
- if self.engine.read().config().diagnostics.chktex.on_edit {
- self.run_chktex(document);
+ if self.workspace.read().config().diagnostics.chktex.on_edit {
+ self.run_chktex(&uri);
}
Ok(())
@@ -450,19 +427,14 @@ impl Server {
let mut uri = params.text_document.uri;
normalize_uri(&mut uri);
- let db = self.engine.read();
- let workspace = Workspace::get(db);
- if db.config().build.on_save {
+ if self.workspace.read().config().build.on_save {
self.build_internal(uri.clone(), |_| ())?;
}
self.publish_diagnostics_with_delay();
- let db = self.engine.read();
- if let Some(document) = workspace.lookup_uri(db, &uri) {
- if db.config().diagnostics.chktex.on_save {
- self.run_chktex(document);
- }
+ if self.workspace.read().config().diagnostics.chktex.on_save {
+ self.run_chktex(&uri);
}
Ok(())
@@ -471,49 +443,47 @@ impl Server {
fn did_close(&mut self, params: DidCloseTextDocumentParams) -> Result<()> {
let mut uri = params.text_document.uri;
normalize_uri(&mut uri);
-
- let db = self.engine.write();
- if let Some(document) = Workspace::get(db).lookup_uri(db, &uri) {
- document
- .set_owner(db)
- .with_durability(salsa::Durability::LOW)
- .to(Owner::Server);
- }
-
+ self.workspace.write().close(&uri);
self.publish_diagnostics_with_delay();
Ok(())
}
- fn run_chktex(&mut self, document: Document) {
- let db = self.engine.read();
- if let Some(command) = util::chktex::Command::new(db, document) {
- let sender = self.internal_tx.clone();
- let uri = document.location(db).uri(db).clone();
- self.pool.execute(move || {
- let diagnostics = command.run().unwrap_or_default();
- sender
- .send(InternalMessage::ChktexResult(uri, diagnostics))
- .unwrap();
- });
- }
+ fn run_chktex(&mut self, uri: &Url) {
+ let workspace = self.workspace.read();
+ let Some(document) = workspace.lookup(uri) else { return };
+ let Some(command) = util::chktex::Command::new(&workspace, document) else { return };
+
+ let sender = self.internal_tx.clone();
+ let uri = document.uri.clone();
+ self.pool.execute(move || {
+ let diagnostics = command.run().unwrap_or_default();
+ sender
+ .send(InternalMessage::ChktexResult(uri, diagnostics))
+ .unwrap();
+ });
}
fn document_link(&self, id: RequestId, params: DocumentLinkParams) -> Result<()> {
let mut uri = params.text_document.uri;
normalize_uri(&mut uri);
- self.run_with_db(id, move |db| link::find_all(db, &uri).unwrap_or_default());
+ self.run_query(id, move |workspace| {
+ link::find_all(workspace, &uri).unwrap_or_default()
+ });
Ok(())
}
fn document_symbols(&self, id: RequestId, params: DocumentSymbolParams) -> Result<()> {
let mut uri = params.text_document.uri;
normalize_uri(&mut uri);
- self.run_with_db(id, move |db| symbol::find_document_symbols(db, &uri));
+ let client_capabilities = Arc::clone(&self.client_capabilities);
+ self.run_query(id, move |workspace| {
+ symbol::find_document_symbols(workspace, &uri, &client_capabilities)
+ });
Ok(())
}
fn workspace_symbols(&self, id: RequestId, params: WorkspaceSymbolParams) -> Result<()> {
- self.run_with_db(id, move |db| symbol::find_workspace_symbols(db, &params));
+ self.run_query(id, move |db| symbol::find_workspace_symbols(db, &params));
Ok(())
}
@@ -521,12 +491,22 @@ impl Server {
let mut uri = params.text_document_position.text_document.uri;
normalize_uri(&mut uri);
let position = params.text_document_position.position;
- self.run_with_db(id, move |db| completion::complete(db, &uri, position));
+ let client_capabilities = Arc::clone(&self.client_capabilities);
+ let client_info = self.client_info.clone();
+ self.run_query(id, move |db| {
+ completion::complete(
+ db,
+ &uri,
+ position,
+ &client_capabilities,
+ client_info.as_deref(),
+ )
+ });
Ok(())
}
fn completion_resolve(&self, id: RequestId, mut item: CompletionItem) -> Result<()> {
- self.run_with_db(id, move |db| {
+ self.run_query(id, move |workspace| {
match item
.data
.clone()
@@ -538,13 +518,13 @@ impl Server {
.map(Documentation::MarkupContent);
}
Some(CompletionItemData::Citation { uri, key }) => {
- if let Some(root) = Workspace::get(db)
- .lookup_uri(db, &uri)
- .and_then(|document| document.parse(db).as_bib().map(|data| data.root(db)))
+ if let Some(data) = workspace
+ .lookup(&uri)
+ .and_then(|document| document.data.as_bib())
{
- item.documentation = bibtex::Root::cast(root)
+ item.documentation = bibtex::Root::cast(data.root_node())
.and_then(|root| root.find_entry(&key))
- .and_then(|entry| citation::render(&entry))
+ .and_then(|entry| citeproc::render(&entry))
.map(|value| {
Documentation::MarkupContent(MarkupContent {
kind: MarkupKind::Markdown,
@@ -565,7 +545,7 @@ impl Server {
fn folding_range(&self, id: RequestId, params: FoldingRangeParams) -> Result<()> {
let mut uri = params.text_document.uri;
normalize_uri(&mut uri);
- self.run_with_db(id, move |db| {
+ self.run_query(id, move |db| {
folding::find_all(db, &uri).unwrap_or_default()
});
Ok(())
@@ -575,7 +555,7 @@ impl Server {
let mut uri = params.text_document_position.text_document.uri;
normalize_uri(&mut uri);
let position = params.text_document_position.position;
- self.run_with_db(id, move |db| {
+ self.run_query(id, move |db| {
reference::find_all(db, &uri, position, &params.context).unwrap_or_default()
});
@@ -586,21 +566,18 @@ impl Server {
let mut uri = params.text_document_position_params.text_document.uri;
normalize_uri(&mut uri);
- let db = self.engine.write();
- let workspace = Workspace::get(db);
- if let Some(document) = workspace.lookup_uri(db, &uri) {
+ let workspace = self.workspace.read();
+ if let Some(document) = workspace.lookup(&uri) {
let position = document
- .line_index(db)
+ .line_index
.offset_lsp(params.text_document_position_params.position);
- document
- .set_cursor(db)
- .with_durability(salsa::Durability::LOW)
- .to(position);
+ drop(workspace);
+ self.workspace.write().set_cursor(&uri, position);
}
let position = params.text_document_position_params.position;
- self.run_with_db(id, move |db| hover::find(db, &uri, position));
+ self.run_query(id, move |db| hover::find(db, &uri, position));
Ok(())
}
@@ -608,7 +585,7 @@ impl Server {
let mut uri = params.text_document_position_params.text_document.uri;
normalize_uri(&mut uri);
let position = params.text_document_position_params.position;
- self.run_with_db(id, move |db| {
+ self.run_query(id, move |db| {
definition::goto_definition(db, &uri, position)
});
@@ -618,7 +595,7 @@ impl Server {
fn prepare_rename(&self, id: RequestId, params: TextDocumentPositionParams) -> Result<()> {
let mut uri = params.text_document.uri;
normalize_uri(&mut uri);
- self.run_with_db(id, move |db| {
+ self.run_query(id, move |db| {
rename::prepare_rename_all(db, &uri, params.position)
});
@@ -629,7 +606,7 @@ impl Server {
let mut uri = params.text_document_position.text_document.uri;
normalize_uri(&mut uri);
let position = params.text_document_position.position;
- self.run_with_db(id, move |db| {
+ self.run_query(id, move |db| {
rename::rename_all(db, &uri, position, params.new_name)
});
@@ -640,7 +617,7 @@ impl Server {
let mut uri = params.text_document_position_params.text_document.uri;
normalize_uri(&mut uri);
let position = params.text_document_position_params.position;
- self.run_with_db(id, move |db| {
+ self.run_query(id, move |db| {
highlight::find_all(db, &uri, position).unwrap_or_default()
});
Ok(())
@@ -649,7 +626,7 @@ impl Server {
fn formatting(&self, id: RequestId, params: DocumentFormattingParams) -> Result<()> {
let mut uri = params.text_document.uri;
normalize_uri(&mut uri);
- self.run_with_db(id, move |db| {
+ self.run_query(id, move |db| {
formatting::format_source_code(db, &uri, &params.options)
});
@@ -659,24 +636,26 @@ impl Server {
fn execute_command(&mut self, id: RequestId, params: ExecuteCommandParams) -> Result<()> {
match params.command.as_str() {
"texlab.cleanAuxiliary" => {
- let db = self.engine.read();
+ let workspace = self.workspace.read();
let opt = clean::CleanOptions::Auxiliary;
- let command = clean::CleanCommand::new(db, opt, params.arguments);
- self.run_errorable(id, || command?.run());
+ let command = clean::CleanCommand::new(&workspace, opt, params.arguments);
+ self.run_fallible(id, || command?.run());
}
"texlab.cleanArtifacts" => {
- let db = self.engine.read();
+ let workspace = self.workspace.read();
let opt = clean::CleanOptions::Auxiliary;
- let command = clean::CleanCommand::new(db, opt, params.arguments);
- self.run_errorable(id, || command?.run());
+ let command = clean::CleanCommand::new(&workspace, opt, params.arguments);
+ self.run_fallible(id, || command?.run());
}
"texlab.changeEnvironment" => {
- self.run_and_request_with_db::<ApplyWorkspaceEdit, _, _>(id, move |db| {
- change_environment::change_environment(db, params.arguments)
+ self.run_query_and_request::<ApplyWorkspaceEdit, _, _>(id, move |workspace| {
+ change_environment::change_environment(workspace, params.arguments)
});
}
"texlab.showDependencyGraph" => {
- self.run_with_db(id, move |db| dep_graph::show_dependency_graph(db).unwrap());
+ self.run_query(id, move |workspace| {
+ dep_graph::show_dependency_graph(workspace).unwrap()
+ });
}
_ => {
self.client
@@ -695,7 +674,7 @@ impl Server {
fn inlay_hints(&self, id: RequestId, params: InlayHintParams) -> Result<()> {
let mut uri = params.text_document.uri;
normalize_uri(&mut uri);
- self.run_with_db(id, move |db| {
+ self.run_query(id, move |db| {
inlay_hint::find_all(db, &uri, params.range).unwrap_or_default()
});
Ok(())
@@ -735,16 +714,14 @@ impl Server {
) -> Result<()> {
static LOCK: Lazy<Mutex<()>> = Lazy::new(|| Mutex::new(()));
- let db = self.engine.read();
- let compiler = match build::Command::new(db, uri.clone(), self.client.clone()) {
- Some(compiler) => compiler,
- None => {
- callback(BuildStatus::FAILURE);
- return Ok(());
- }
+ let workspace = self.workspace.read();
+ let client = self.client.clone();
+ let Some(compiler) = build::Command::new(&workspace, uri.clone(), client, &self.client_capabilities) else {
+ callback(BuildStatus::FAILURE);
+ return Ok(());
};
- let forward_search_after = db.config().build.forward_search_after;
+ let forward_search_after = workspace.config().build.forward_search_after;
let sender = self.internal_tx.clone();
self.pool.execute(move || {
@@ -781,8 +758,9 @@ impl Server {
position: Option<Position>,
callback: impl FnOnce(ForwardSearchStatus) + Send + 'static,
) -> Result<()> {
- let db = self.engine.read();
- let command = match forward_search::Command::configure(db, &uri, position) {
+ let workspace = self.workspace.read();
+
+ let command = match forward_search::Command::configure(&workspace, &uri, position) {
Ok(command) => command,
Err(why) => {
log::error!("Forward search failed: {}", why);
@@ -817,37 +795,27 @@ impl Server {
fn handle_file_event(&mut self, event: notify::Event) {
let mut changed = false;
- let db = self.engine.write();
- let workspace = Workspace::get(db);
+ let mut workspace = self.workspace.write();
match event.kind {
notify::EventKind::Create(_) | notify::EventKind::Modify(_) => {
for path in event.paths {
if workspace
- .lookup_path(db, &path)
- .map_or(true, |document| document.owner(db) == Owner::Server)
+ .lookup_path(&path)
+ .map_or(true, |document| document.owner == Owner::Server)
{
if let Some(language) = Language::from_path(&path) {
- workspace.load(db, &path, language, Owner::Server);
- changed = true;
+ changed |= workspace.load(&path, language, Owner::Server).is_ok();
}
}
}
}
notify::EventKind::Remove(_) => {
for path in event.paths {
- if let Some(document) = workspace.lookup_path(db, &path) {
- if document.owner(db) == Owner::Server {
- let mut documents = workspace
- .set_documents(db)
- .with_durability(salsa::Durability::LOW)
- .to(FxHashSet::default());
-
- documents.remove(&document);
- workspace
- .set_documents(db)
- .with_durability(salsa::Durability::MEDIUM)
- .to(documents);
-
+ if let Some(document) = workspace.lookup_path(&path) {
+ if document.owner == Owner::Server {
+ let uri = document.uri.clone();
+ drop(document);
+ workspace.remove(&uri);
changed = true;
}
}
@@ -856,6 +824,7 @@ impl Server {
notify::EventKind::Any | notify::EventKind::Access(_) | notify::EventKind::Other => {}
};
+ drop(workspace);
if changed {
self.publish_diagnostics_with_delay();
}
@@ -945,11 +914,7 @@ impl Server {
recv(&self.internal_rx) -> msg => {
match msg? {
InternalMessage::SetDistro(distro) => {
- let db = self.engine.write();
- Workspace::get(db)
- .set_file_name_db(db)
- .with_durability(salsa::Durability::HIGH)
- .to(distro.file_name_db);
+ self.workspace.write().set_distro(distro);
}
InternalMessage::SetOptions(options) => {
self.update_options(options);
@@ -964,12 +929,7 @@ impl Server {
self.publish_diagnostics()?;
}
InternalMessage::ChktexResult(uri, diagnostics) => {
- let db = self.engine.write();
- let workspace = Workspace::get(db);
- if let Some(document) = workspace.lookup_uri(db, &uri) {
- document.linter(db).set_chktex(db).to(diagnostics);
- }
-
+ self.chktex_diagnostics.insert(uri, diagnostics);
self.publish_diagnostics()?;
}
};
@@ -982,7 +942,6 @@ impl Server {
self.initialize()?;
self.process_messages()?;
self.pool.join();
- self.engine.finish();
Ok(())
}
}
@@ -1006,9 +965,8 @@ impl FileWatcher {
})
}
- pub fn watch(&mut self, db: &dyn Db) {
- let workspace = Workspace::get(db);
- workspace.watch(db, &mut self.watcher, &mut self.watched_dirs);
+ pub fn watch(&mut self, workspace: &mut Workspace) {
+ workspace.watch(&mut self.watcher, &mut self.watched_dirs);
}
}
diff --git a/support/texlab/src/server/dispatch.rs b/support/texlab/crates/texlab/src/server/dispatch.rs
index f5659ee3b4..add4954d5f 100644
--- a/support/texlab/src/server/dispatch.rs
+++ b/support/texlab/crates/texlab/src/server/dispatch.rs
@@ -1,5 +1,4 @@
use anyhow::Result;
-use log::warn;
use lsp_server::{ErrorCode, Notification, Request, RequestId, Response};
use serde::de::DeserializeOwned;
@@ -37,7 +36,7 @@ impl NotificationDispatcher {
pub fn default(self) {
if let Some(not) = &self.not {
- warn!("Unknown notification: {}", not.method);
+ log::warn!("Unknown notification: {}", not.method);
}
}
}
@@ -76,7 +75,7 @@ impl RequestDispatcher {
pub fn default(self) -> Option<Response> {
self.req.map(|req| {
- warn!("Unknown request: {}", req.method);
+ log::warn!("Unknown request: {}", req.method);
Response::new_err(
req.id,
ErrorCode::MethodNotFound as i32,
diff --git a/support/texlab/src/server/options.rs b/support/texlab/crates/texlab/src/server/options.rs
index 87f49691f0..a955905d3c 100644
--- a/support/texlab/src/server/options.rs
+++ b/support/texlab/crates/texlab/src/server/options.rs
@@ -1,10 +1,9 @@
use std::time::Duration;
+use base_db::{Config, Formatter, SynctexConfig};
use regex::Regex;
use serde::{Deserialize, Serialize};
-use crate::{Config, Formatter, SynctexConfig};
-
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
#[serde(default)]
diff --git a/support/texlab/src/util.rs b/support/texlab/crates/texlab/src/util.rs
index 6f27305f1b..5eed8a3357 100644
--- a/support/texlab/src/util.rs
+++ b/support/texlab/crates/texlab/src/util.rs
@@ -2,9 +2,9 @@ pub mod capabilities;
pub mod chktex;
pub mod components;
pub mod cursor;
+pub mod diagnostics;
pub mod label;
pub mod lang_data;
-pub mod line_index;
pub mod line_index_ext;
pub mod lsp_enums;
pub mod regex_filter;
diff --git a/support/texlab/src/util/capabilities.rs b/support/texlab/crates/texlab/src/util/capabilities.rs
index 987c0b48dd..987c0b48dd 100644
--- a/support/texlab/src/util/capabilities.rs
+++ b/support/texlab/crates/texlab/src/util/capabilities.rs
diff --git a/support/texlab/src/util/chktex.rs b/support/texlab/crates/texlab/src/util/chktex.rs
index 0774207917..91d74a9cdc 100644
--- a/support/texlab/src/util/chktex.rs
+++ b/support/texlab/crates/texlab/src/util/chktex.rs
@@ -4,19 +4,14 @@ use std::{
process::Stdio,
};
+use base_db::{Document, Workspace};
+use distro::Language;
use encoding_rs_io::DecodeReaderBytesBuilder;
+use lsp_types::{Diagnostic, NumberOrString};
use lsp_types::{DiagnosticSeverity, Position, Range};
use once_cell::sync::Lazy;
use regex::Regex;
-use crate::{
- db::{
- diagnostics::{Diagnostic, DiagnosticCode},
- Document, Workspace,
- },
- Db,
-};
-
#[derive(Debug)]
pub struct Command {
text: String,
@@ -24,25 +19,26 @@ pub struct Command {
}
impl Command {
- pub fn new(db: &dyn Db, document: Document) -> Option<Self> {
- document.parse(db).as_tex()?;
+ pub fn new(workspace: &Workspace, document: &Document) -> Option<Self> {
+ if document.language != Language::Tex {
+ return None;
+ }
- let workspace = Workspace::get(db);
let parent = workspace
- .parents(db, document)
- .iter()
+ .parents(document)
+ .into_iter()
.next()
- .map_or(document, Clone::clone);
+ .unwrap_or(document);
- let working_dir = workspace
- .working_dir(db, parent.directory(db))
- .path(db)
- .as_deref()?
- .to_owned();
+ if parent.uri.scheme() != "file" {
+ log::warn!("Calling ChkTeX on non-local files is not supported yet.");
+ return None;
+ }
+ let working_dir = workspace.current_dir(&parent.dir).to_file_path().ok()?;
log::debug!("Calling ChkTeX from directory: {}", working_dir.display());
- let text = document.text(db).clone();
+ let text = document.text.clone();
Some(Self { text, working_dir })
}
@@ -88,9 +84,14 @@ impl Command {
diagnostics.push(Diagnostic {
range,
- severity,
- code: DiagnosticCode::Chktex(code.into()),
+ severity: Some(severity),
+ code: Some(NumberOrString::String(code.into())),
message,
+ code_description: None,
+ source: Some(String::from("ChkTeX")),
+ related_information: None,
+ tags: None,
+ data: None,
});
}
diff --git a/support/texlab/src/util/components.rs b/support/texlab/crates/texlab/src/util/components.rs
index 022e7efbc8..9d51cd039d 100644
--- a/support/texlab/src/util/components.rs
+++ b/support/texlab/crates/texlab/src/util/components.rs
@@ -1,5 +1,6 @@
use std::io::Read;
+use base_db::{semantics::tex::LinkKind, Project};
use flate2::read::GzDecoder;
use itertools::Itertools;
use lsp_types::{MarkupContent, MarkupKind};
@@ -7,11 +8,6 @@ use once_cell::sync::Lazy;
use serde::Deserialize;
use smol_str::SmolStr;
-use crate::{
- db::{analysis::TexLinkKind, Document, Workspace},
- Db,
-};
-
#[derive(Debug, PartialEq, Eq, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ComponentDatabase {
@@ -29,15 +25,15 @@ impl ComponentDatabase {
})
}
- pub fn linked_components(&self, db: &dyn Db, child: Document) -> Vec<&Component> {
- Workspace::get(db)
- .related(db, child)
+ pub fn linked_components(&self, project: &Project) -> Vec<&Component> {
+ project
+ .documents
.iter()
- .filter_map(|document| document.parse(db).as_tex())
- .flat_map(|data| data.analyze(db).links(db))
- .filter_map(|link| match link.kind(db) {
- TexLinkKind::Sty => Some(format!("{}.sty", link.path(db).text(db))),
- TexLinkKind::Cls => Some(format!("{}.cls", link.path(db).text(db))),
+ .filter_map(|document| document.data.as_tex())
+ .flat_map(|data| data.semantics.links.iter())
+ .filter_map(|link| match link.kind {
+ LinkKind::Sty => Some(format!("{}.sty", link.path.text)),
+ LinkKind::Cls => Some(format!("{}.cls", link.path.text)),
_ => None,
})
.filter_map(|name| self.find(&name))
diff --git a/support/texlab/src/util/cursor.rs b/support/texlab/crates/texlab/src/util/cursor.rs
index d3168155da..8db642c0bf 100644
--- a/support/texlab/src/util/cursor.rs
+++ b/support/texlab/crates/texlab/src/util/cursor.rs
@@ -1,13 +1,9 @@
+use base_db::{Document, DocumentData, Project, Workspace};
use lsp_types::{Position, Url};
use rowan::{ast::AstNode, TextRange, TextSize};
+use syntax::{bibtex, latex};
-use crate::{
- db::{parse::DocumentData, Document, Workspace},
- syntax::{bibtex, latex},
- Db,
-};
-
-use super::{line_index::LineIndex, line_index_ext::LineIndexExt};
+use super::line_index_ext::LineIndexExt;
#[derive(Debug)]
pub enum Cursor {
@@ -121,57 +117,49 @@ impl Cursor {
}
}
-pub struct CursorContext<'db, T = ()> {
- pub db: &'db dyn Db,
- pub document: Document,
- pub line_index: &'db LineIndex,
- pub workspace: Workspace,
+pub struct CursorContext<'a, T = ()> {
+ pub workspace: &'a Workspace,
+ pub document: &'a Document,
+ pub project: Project<'a>,
pub cursor: Cursor,
pub offset: TextSize,
pub params: T,
}
-impl<'db, T> CursorContext<'db, T> {
- pub fn new(db: &'db dyn Db, uri: &Url, position: Position, params: T) -> Option<Self> {
- let workspace = Workspace::get(db);
- let document = workspace.lookup_uri(db, uri)?;
- let line_index = document.line_index(db);
- let offset = line_index.offset_lsp(position);
+impl<'a, T> CursorContext<'a, T> {
+ pub fn new(workspace: &'a Workspace, uri: &Url, position: Position, params: T) -> Option<Self> {
+ let document = workspace.lookup(uri)?;
+ let offset = document.line_index.offset_lsp(position);
- let cursor = match document.parse(db) {
+ let cursor = match &document.data {
DocumentData::Tex(data) => {
- let root = data.root(db);
+ let root = data.root_node();
let left = root.token_at_offset(offset).left_biased();
let right = root.token_at_offset(offset).right_biased();
Cursor::new_tex(left, right)
}
DocumentData::Bib(data) => {
- let root = data.root(db);
+ let root = data.root_node();
let left = root.token_at_offset(offset).left_biased();
let right = root.token_at_offset(offset).right_biased();
Cursor::new_bib(left, right)
}
- DocumentData::Log(_) | DocumentData::TexlabRoot(_) | DocumentData::Tectonic(_) => None,
+ DocumentData::Aux(_)
+ | DocumentData::Log(_)
+ | DocumentData::Root
+ | DocumentData::Tectonic => None,
};
Some(Self {
- db,
- document,
- line_index,
workspace,
+ document,
+ project: workspace.project(document),
cursor: cursor.unwrap_or(Cursor::Nothing),
offset,
params,
})
}
- pub fn related(&self) -> impl Iterator<Item = Document> + '_ {
- self.workspace
- .related(self.db, self.document)
- .iter()
- .copied()
- }
-
pub fn is_inside_latex_curly(&self, group: &impl latex::HasCurly) -> bool {
latex::small_range(group).contains(self.offset) || group.right_curly().is_none()
}
diff --git a/support/texlab/crates/texlab/src/util/diagnostics.rs b/support/texlab/crates/texlab/src/util/diagnostics.rs
new file mode 100644
index 0000000000..9bac4df44e
--- /dev/null
+++ b/support/texlab/crates/texlab/src/util/diagnostics.rs
@@ -0,0 +1,120 @@
+use base_db::{diagnostics::ErrorCode, Document, Workspace};
+use distro::Language;
+use lsp_types::{DiagnosticSeverity, NumberOrString};
+use rustc_hash::FxHashMap;
+use syntax::BuildErrorLevel;
+
+use crate::util;
+
+use super::line_index_ext::LineIndexExt;
+
+pub fn collect(workspace: &Workspace) -> FxHashMap<&Document, Vec<lsp_types::Diagnostic>> {
+ let mut results = FxHashMap::default();
+
+ for document in workspace.iter() {
+ let lsp_diagnostics = document
+ .diagnostics
+ .iter()
+ .map(|diagnostic| create_diagnostic(document, diagnostic))
+ .collect::<Vec<_>>();
+
+ results.insert(document, lsp_diagnostics);
+ }
+
+ for document in workspace
+ .iter()
+ .filter(|document| document.language == Language::Log)
+ {
+ for (document, diagnostics) in base_db::diagnostics::log::analyze(workspace, document) {
+ let lsp_diagnostics = diagnostics
+ .iter()
+ .map(|diagnostic| create_diagnostic(document, diagnostic))
+ .collect::<Vec<_>>();
+
+ results.get_mut(document).unwrap().extend(lsp_diagnostics);
+ }
+ }
+
+ results
+}
+
+fn create_diagnostic(
+ document: &Document,
+ diagnostic: &base_db::diagnostics::Diagnostic,
+) -> lsp_types::Diagnostic {
+ let range = document.line_index.line_col_lsp_range(diagnostic.range);
+
+ let severity = match &diagnostic.code {
+ ErrorCode::UnexpectedRCurly
+ | ErrorCode::RCurlyInserted
+ | ErrorCode::MismatchedEnvironment
+ | ErrorCode::ExpectingLCurly
+ | ErrorCode::ExpectingKey
+ | ErrorCode::ExpectingRCurly
+ | ErrorCode::ExpectingEq
+ | ErrorCode::ExpectingFieldValue => DiagnosticSeverity::ERROR,
+ ErrorCode::Build(error) => match error.level {
+ BuildErrorLevel::Error => DiagnosticSeverity::ERROR,
+ BuildErrorLevel::Warning => DiagnosticSeverity::WARNING,
+ },
+ };
+
+ let code = match &diagnostic.code {
+ ErrorCode::UnexpectedRCurly => Some(1),
+ ErrorCode::RCurlyInserted => Some(2),
+ ErrorCode::MismatchedEnvironment => Some(3),
+ ErrorCode::ExpectingLCurly => Some(4),
+ ErrorCode::ExpectingKey => Some(5),
+ ErrorCode::ExpectingRCurly => Some(6),
+ ErrorCode::ExpectingEq => Some(7),
+ ErrorCode::ExpectingFieldValue => Some(8),
+ ErrorCode::Build(_) => None,
+ };
+
+ let source = match &diagnostic.code {
+ ErrorCode::UnexpectedRCurly
+ | ErrorCode::RCurlyInserted
+ | ErrorCode::MismatchedEnvironment
+ | ErrorCode::ExpectingLCurly
+ | ErrorCode::ExpectingKey
+ | ErrorCode::ExpectingRCurly
+ | ErrorCode::ExpectingEq
+ | ErrorCode::ExpectingFieldValue => "texlab",
+ ErrorCode::Build(_) => "latex",
+ };
+
+ let message = String::from(match &diagnostic.code {
+ ErrorCode::UnexpectedRCurly => "Unexpected \"}\"",
+ ErrorCode::RCurlyInserted => "Missing \"}\" inserted",
+ ErrorCode::MismatchedEnvironment => "Mismatched environment",
+ ErrorCode::ExpectingLCurly => "Expecting a curly bracket: \"{\"",
+ ErrorCode::ExpectingKey => "Expecting a key",
+ ErrorCode::ExpectingRCurly => "Expecting a curly bracket: \"}\"",
+ ErrorCode::ExpectingEq => "Expecting an equality sign: \"=\"",
+ ErrorCode::ExpectingFieldValue => "Expecting a field value",
+ ErrorCode::Build(error) => &error.message,
+ });
+
+ lsp_types::Diagnostic {
+ severity: Some(severity),
+ code: code.map(NumberOrString::Number),
+ source: Some(String::from(source)),
+ ..lsp_types::Diagnostic::new_simple(range, message)
+ }
+}
+
+pub fn filter(
+ all_diagnostics: &mut FxHashMap<&Document, Vec<lsp_types::Diagnostic>>,
+ workspace: &Workspace,
+) {
+ let config = &workspace.config().diagnostics;
+ for diagnostics in all_diagnostics.values_mut() {
+ diagnostics.retain(|diagnostic| {
+ util::regex_filter::filter(
+ &diagnostic.message,
+ &config.allowed_patterns,
+ &config.ignored_patterns,
+ )
+ });
+ }
+}
diff --git a/support/texlab/crates/texlab/src/util/label.rs b/support/texlab/crates/texlab/src/util/label.rs
new file mode 100644
index 0000000000..33b860a173
--- /dev/null
+++ b/support/texlab/crates/texlab/src/util/label.rs
@@ -0,0 +1,202 @@
+use std::str::FromStr;
+
+use base_db::{
+ semantics::tex::{Label, LabelObject},
+ Project, Workspace,
+};
+use rowan::{ast::AstNode, TextRange};
+use syntax::latex::{self, HasCurly};
+
+use self::LabeledObject::*;
+
+#[derive(Debug, PartialEq, Eq, Clone, Copy)]
+pub enum LabeledFloatKind {
+ Figure,
+ Table,
+ Listing,
+ Algorithm,
+}
+
+impl LabeledFloatKind {
+ pub fn as_str(self) -> &'static str {
+ match self {
+ Self::Figure => "Figure",
+ Self::Table => "Table",
+ Self::Listing => "Listing",
+ Self::Algorithm => "Algorithm",
+ }
+ }
+}
+
+impl FromStr for LabeledFloatKind {
+ type Err = ();
+
+ fn from_str(s: &str) -> Result<Self, Self::Err> {
+ match s {
+ "figure" | "subfigure" => Ok(Self::Figure),
+ "table" | "subtable" => Ok(Self::Table),
+ "listing" | "lstlisting" => Ok(Self::Listing),
+ "algorithm" => Ok(Self::Algorithm),
+ _ => Err(()),
+ }
+ }
+}
+
+#[derive(Debug, PartialEq, Eq, Clone)]
+pub enum LabeledObject<'a> {
+ Section {
+ prefix: &'a str,
+ text: &'a str,
+ },
+ Float {
+ kind: LabeledFloatKind,
+ caption: &'a str,
+ },
+ Theorem {
+ kind: &'a str,
+ description: Option<&'a str>,
+ },
+ Equation,
+ EnumItem,
+}
+
+#[derive(Debug, PartialEq, Eq, Clone)]
+pub struct RenderedLabel<'a> {
+ pub range: TextRange,
+ pub number: Option<&'a str>,
+ pub object: LabeledObject<'a>,
+}
+
+impl<'a> RenderedLabel<'a> {
+ pub fn reference(&self) -> String {
+ match &self.number {
+ Some(number) => match &self.object {
+ Section { prefix, text } => format!("{} {} ({})", prefix, number, text),
+ Float { kind, caption } => {
+ format!("{} {}: {}", kind.as_str(), number, caption)
+ }
+ Theorem {
+ kind,
+ description: None,
+ } => format!("{} {}", kind, number),
+ Theorem {
+ kind,
+ description: Some(description),
+ } => format!("{} {} ({})", kind, number, description),
+ Equation => format!("Equation ({})", number),
+ EnumItem => format!("Item {}", number),
+ },
+ None => match &self.object {
+ Section { prefix, text } => format!("{} ({})", prefix, text),
+ Float { kind, caption } => format!("{}: {}", kind.as_str(), caption),
+ Theorem {
+ kind,
+ description: None,
+ } => String::from(*kind),
+ Theorem {
+ kind,
+ description: Some(description),
+ } => format!("{} ({})", kind, description),
+ Equation => "Equation".into(),
+ EnumItem => "Item".into(),
+ },
+ }
+ }
+
+ pub fn detail(&self) -> Option<String> {
+ match &self.object {
+ Section { .. } | Theorem { .. } | Equation | EnumItem => Some(self.reference()),
+ Float { kind, .. } => {
+ let result = match &self.number {
+ Some(number) => format!("{} {}", kind.as_str(), number),
+ None => kind.as_str().to_owned(),
+ };
+ Some(result)
+ }
+ }
+ }
+}
+
+pub fn render<'a>(
+ workspace: &'a Workspace,
+ project: &Project<'a>,
+ label: &'a Label,
+) -> Option<RenderedLabel<'a>> {
+ let number = project
+ .documents
+ .iter()
+ .filter_map(|document| document.data.as_aux())
+ .find_map(|data| data.semantics.label_numbers.get(&label.name.text))
+ .map(|number| number.as_str());
+
+ for target in &label.targets {
+ match &target.object {
+ LabelObject::Section { prefix, text } => {
+ return Some(RenderedLabel {
+ range: target.range,
+ number,
+ object: LabeledObject::Section { prefix, text },
+ });
+ }
+ LabelObject::EnumItem => {
+ return Some(RenderedLabel {
+ range: target.range,
+ number,
+ object: LabeledObject::EnumItem,
+ });
+ }
+ LabelObject::Environment {
+ name,
+ options,
+ caption,
+ } => {
+ let config = &workspace.config().syntax;
+ if config.math_environments.contains(name.as_str()) {
+ return Some(RenderedLabel {
+ range: target.range,
+ number,
+ object: LabeledObject::Equation,
+ });
+ }
+
+ if let Ok(kind) = LabeledFloatKind::from_str(name) {
+ return Some(RenderedLabel {
+ range: target.range,
+ number,
+ object: LabeledObject::Float {
+ kind,
+ caption: caption.as_deref()?,
+ },
+ });
+ }
+
+ if let Some(theorem) = project
+ .documents
+ .iter()
+ .filter_map(|document| document.data.as_tex())
+ .flat_map(|data| data.semantics.theorem_definitions.iter())
+ .find(|theorem| theorem.name.text == *name)
+ {
+ return Some(RenderedLabel {
+ range: target.range,
+ number,
+ object: LabeledObject::Theorem {
+ kind: &theorem.description,
+ description: options.as_deref(),
+ },
+ });
+ }
+ }
+ };
+ }
+
+ None
+}
+
+pub(crate) fn find_caption_by_parent(parent: &latex::SyntaxNode) -> Option<String> {
+ parent
+ .children()
+ .filter_map(latex::Caption::cast)
+ .find_map(|node| node.long())
+ .and_then(|node| node.content_text())
+}
diff --git a/support/texlab/src/util/lang_data.rs b/support/texlab/crates/texlab/src/util/lang_data.rs
index 734ceb6df2..734ceb6df2 100644
--- a/support/texlab/src/util/lang_data.rs
+++ b/support/texlab/crates/texlab/src/util/lang_data.rs
diff --git a/support/texlab/src/util/line_index_ext.rs b/support/texlab/crates/texlab/src/util/line_index_ext.rs
index becbb8bde7..bf4d9fa422 100644
--- a/support/texlab/src/util/line_index_ext.rs
+++ b/support/texlab/crates/texlab/src/util/line_index_ext.rs
@@ -1,8 +1,7 @@
+use base_db::{LineCol, LineColUtf16, LineIndex};
use lsp_types::{Position, Range};
use rowan::{TextRange, TextSize};
-use super::line_index::{LineColUtf16, LineIndex};
-
pub trait LineIndexExt {
fn offset_lsp(&self, line_col: Position) -> TextSize;
@@ -36,7 +35,17 @@ impl LineIndexExt for LineIndex {
fn line_col_lsp_range(&self, offset: TextRange) -> Range {
let start = self.line_col_lsp(offset.start());
- let end = self.line_col_lsp(offset.end());
+ let mut end = self.line_col_lsp(offset.end());
+ if end.line != start.line && end.character == 0 {
+ // Prefer keeping multi-line ranges on the same line
+ let line_end = self.offset(LineCol {
+ line: end.line,
+ col: 0,
+ });
+
+ end = self.line_col_lsp(line_end - TextSize::from(1));
+ }
+
Range::new(start, end)
}
}
diff --git a/support/texlab/src/util/lsp_enums.rs b/support/texlab/crates/texlab/src/util/lsp_enums.rs
index 75b97097c5..75b97097c5 100644
--- a/support/texlab/src/util/lsp_enums.rs
+++ b/support/texlab/crates/texlab/src/util/lsp_enums.rs
diff --git a/support/texlab/src/util/regex_filter.rs b/support/texlab/crates/texlab/src/util/regex_filter.rs
index a33417464e..a33417464e 100644
--- a/support/texlab/src/util/regex_filter.rs
+++ b/support/texlab/crates/texlab/src/util/regex_filter.rs
diff --git a/support/texlab/tests/lsp/fixture.rs b/support/texlab/crates/texlab/tests/lsp/fixture.rs
index ebebe1f5e6..02bed8c38a 100644
--- a/support/texlab/tests/lsp/fixture.rs
+++ b/support/texlab/crates/texlab/tests/lsp/fixture.rs
@@ -5,6 +5,7 @@ use std::{
};
use anyhow::Result;
+use distro::Language;
use lsp_server::Connection;
use lsp_types::{
notification::{DidOpenTextDocument, Exit, Initialized},
@@ -13,7 +14,7 @@ use lsp_types::{
Position, Range, TextDocumentIdentifier, TextDocumentItem, TextDocumentPositionParams, Url,
};
use tempfile::{tempdir, TempDir};
-use texlab::{db::Language, LspClient, Server};
+use texlab::{LspClient, Server};
#[derive(Debug)]
pub struct Fixture {
@@ -50,7 +51,7 @@ impl Fixture {
let language_id = String::from(match language {
Language::Tex => "latex",
Language::Bib => "bibtex",
- Language::Log | Language::TexlabRoot | Language::Tectonic => continue,
+ Language::Aux | Language::Log | Language::Root | Language::Tectonic => continue,
});
client.send_notification::<DidOpenTextDocument>(DidOpenTextDocumentParams {
@@ -124,7 +125,8 @@ static LOGGER: Once = Once::new();
pub struct TestBed {
fixture: Fixture,
locations: Vec<Location>,
- directory: TempDir,
+ _temp_dir: TempDir,
+ temp_dir_path: PathBuf,
client: LspClient,
client_thread: Option<JoinHandle<()>>,
server_thread: Option<JoinHandle<()>>,
@@ -184,12 +186,14 @@ impl TestBed {
})
};
- let directory = tempdir()?;
+ let temp_dir = tempdir()?;
+ let temp_dir_path = temp_dir.path().canonicalize()?;
+
let locations = fixture
.documents
.iter()
.flat_map(|document| {
- let uri = Url::from_file_path(directory.path().join(&document.path)).unwrap();
+ let uri = Url::from_file_path(temp_dir_path.join(&document.path)).unwrap();
document
.ranges
.iter()
@@ -200,7 +204,8 @@ impl TestBed {
Ok(TestBed {
fixture,
locations,
- directory,
+ _temp_dir: temp_dir,
+ temp_dir_path,
client,
client_thread: Some(client_thread),
server_thread: Some(server_thread),
@@ -217,7 +222,7 @@ impl TestBed {
self.client
.send_notification::<Initialized>(InitializedParams {})?;
- self.fixture.setup(&self.client, &self.directory.path())?;
+ self.fixture.setup(&self.client, self.directory())?;
Ok(())
}
@@ -232,7 +237,7 @@ impl TestBed {
.iter()
.find_map(|document| document.cursor.map(|cursor| (document, cursor)))?;
- let uri = Url::from_file_path(self.directory.path().join(&document.path)).unwrap();
+ let uri = Url::from_file_path(self.temp_dir_path.join(&document.path)).unwrap();
let id = TextDocumentIdentifier::new(uri);
Some(TextDocumentPositionParams::new(id, cursor))
}
@@ -242,7 +247,7 @@ impl TestBed {
}
pub fn directory(&self) -> &Path {
- self.directory.path()
+ &self.temp_dir_path
}
pub fn documents(&self) -> &[Document] {
@@ -250,17 +255,15 @@ impl TestBed {
}
pub fn redact(&self, uri: &Url) -> Url {
- let root = if cfg!(windows) {
- PathBuf::from("C:/")
- } else {
- PathBuf::from("/")
- };
+ if uri.scheme() != "file" {
+ return uri.clone();
+ }
- let path = uri.to_file_path().unwrap();
- let path = path.strip_prefix(self.directory()).unwrap_or(&path);
- let path = root.join(path);
+ let path = uri.to_file_path().unwrap().canonicalize().unwrap();
+ let path = path.strip_prefix(self.directory()).unwrap();
+ let path = path.to_str().unwrap();
- let uri = Url::from_file_path(path).unwrap();
- Url::parse(&uri.as_str().replace("file:///C:/", "file:///")).unwrap()
+ let text = format!("redacted://{}", path.replace('\\', "/"));
+ Url::parse(&text).unwrap()
}
}
diff --git a/support/texlab/tests/lsp/main.rs b/support/texlab/crates/texlab/tests/lsp/main.rs
index aeb4f8993c..aeb4f8993c 100644
--- a/support/texlab/tests/lsp/main.rs
+++ b/support/texlab/crates/texlab/tests/lsp/main.rs
diff --git a/support/texlab/tests/lsp/text_document.rs b/support/texlab/crates/texlab/tests/lsp/text_document.rs
index cfab1d04c8..cfab1d04c8 100644
--- a/support/texlab/tests/lsp/text_document.rs
+++ b/support/texlab/crates/texlab/tests/lsp/text_document.rs
diff --git a/support/texlab/tests/lsp/text_document/completion.rs b/support/texlab/crates/texlab/tests/lsp/text_document/completion.rs
index 3c2e7962d4..3c2e7962d4 100644
--- a/support/texlab/tests/lsp/text_document/completion.rs
+++ b/support/texlab/crates/texlab/tests/lsp/text_document/completion.rs
diff --git a/support/texlab/tests/lsp/text_document/definition.rs b/support/texlab/crates/texlab/tests/lsp/text_document/definition.rs
index 78eed633c8..78eed633c8 100644
--- a/support/texlab/tests/lsp/text_document/definition.rs
+++ b/support/texlab/crates/texlab/tests/lsp/text_document/definition.rs
diff --git a/support/texlab/tests/lsp/text_document/document_highlight.rs b/support/texlab/crates/texlab/tests/lsp/text_document/document_highlight.rs
index 5cfb8fbee8..5cfb8fbee8 100644
--- a/support/texlab/tests/lsp/text_document/document_highlight.rs
+++ b/support/texlab/crates/texlab/tests/lsp/text_document/document_highlight.rs
diff --git a/support/texlab/tests/lsp/text_document/document_link.rs b/support/texlab/crates/texlab/tests/lsp/text_document/document_link.rs
index 6aab6105de..6aab6105de 100644
--- a/support/texlab/tests/lsp/text_document/document_link.rs
+++ b/support/texlab/crates/texlab/tests/lsp/text_document/document_link.rs
diff --git a/support/texlab/tests/lsp/text_document/document_symbol.rs b/support/texlab/crates/texlab/tests/lsp/text_document/document_symbol.rs
index 6ac00176b9..6ac00176b9 100644
--- a/support/texlab/tests/lsp/text_document/document_symbol.rs
+++ b/support/texlab/crates/texlab/tests/lsp/text_document/document_symbol.rs
diff --git a/support/texlab/tests/lsp/text_document/folding_range.rs b/support/texlab/crates/texlab/tests/lsp/text_document/folding_range.rs
index 063ca7533d..063ca7533d 100644
--- a/support/texlab/tests/lsp/text_document/folding_range.rs
+++ b/support/texlab/crates/texlab/tests/lsp/text_document/folding_range.rs
diff --git a/support/texlab/tests/lsp/text_document/formatting.rs b/support/texlab/crates/texlab/tests/lsp/text_document/formatting.rs
index 295022c76a..65200b1d84 100644
--- a/support/texlab/tests/lsp/text_document/formatting.rs
+++ b/support/texlab/crates/texlab/tests/lsp/text_document/formatting.rs
@@ -1,8 +1,9 @@
+use base_db::LineIndex;
use insta::assert_snapshot;
use lsp_types::{
request::Formatting, ClientCapabilities, DocumentFormattingParams, FormattingOptions,
};
-use texlab::util::{line_index::LineIndex, line_index_ext::LineIndexExt};
+use texlab::util::line_index_ext::LineIndexExt;
use crate::fixture::TestBed;
diff --git a/support/texlab/tests/lsp/text_document/hover.rs b/support/texlab/crates/texlab/tests/lsp/text_document/hover.rs
index 5dafceb781..5dafceb781 100644
--- a/support/texlab/tests/lsp/text_document/hover.rs
+++ b/support/texlab/crates/texlab/tests/lsp/text_document/hover.rs
diff --git a/support/texlab/tests/lsp/text_document/inlay_hint.rs b/support/texlab/crates/texlab/tests/lsp/text_document/inlay_hint.rs
index d8ae8e304a..d8ae8e304a 100644
--- a/support/texlab/tests/lsp/text_document/inlay_hint.rs
+++ b/support/texlab/crates/texlab/tests/lsp/text_document/inlay_hint.rs
diff --git a/support/texlab/tests/lsp/text_document/references.rs b/support/texlab/crates/texlab/tests/lsp/text_document/references.rs
index 9933babbd4..9933babbd4 100644
--- a/support/texlab/tests/lsp/text_document/references.rs
+++ b/support/texlab/crates/texlab/tests/lsp/text_document/references.rs
diff --git a/support/texlab/tests/lsp/text_document/rename.rs b/support/texlab/crates/texlab/tests/lsp/text_document/rename.rs
index 183443809a..183443809a 100644
--- a/support/texlab/tests/lsp/text_document/rename.rs
+++ b/support/texlab/crates/texlab/tests/lsp/text_document/rename.rs
diff --git a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__acronym_package_ref.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__acronym_package_ref.snap
index 19c84e95fc..19c84e95fc 100644
--- a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__acronym_package_ref.snap
+++ b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__acronym_package_ref.snap
diff --git a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__acronym_ref_empty.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__acronym_ref_empty.snap
index 23e5b695ef..23e5b695ef 100644
--- a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__acronym_ref_empty.snap
+++ b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__acronym_ref_empty.snap
diff --git a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__acronym_ref_open_brace.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__acronym_ref_open_brace.snap
index 25171b679c..25171b679c 100644
--- a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__acronym_ref_open_brace.snap
+++ b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__acronym_ref_open_brace.snap
diff --git a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__acronym_ref_simple.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__acronym_ref_simple.snap
index 1d3f3329c1..1d3f3329c1 100644
--- a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__acronym_ref_simple.snap
+++ b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__acronym_ref_simple.snap
diff --git a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__argument_empty.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__argument_empty.snap
index ecc48b5a7f..ecc48b5a7f 100644
--- a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__argument_empty.snap
+++ b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__argument_empty.snap
diff --git a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__argument_open_brace.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__argument_open_brace.snap
index 530527a384..530527a384 100644
--- a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__argument_open_brace.snap
+++ b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__argument_open_brace.snap
diff --git a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__argument_word.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__argument_word.snap
index c98249c781..c98249c781 100644
--- a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__argument_word.snap
+++ b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__argument_word.snap
diff --git a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__begin_environment_without_snippet_support.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__begin_environment_without_snippet_support.snap
index bb9e30ae55..bb9e30ae55 100644
--- a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__begin_environment_without_snippet_support.snap
+++ b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__begin_environment_without_snippet_support.snap
diff --git a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__citation.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__citation.snap
index b8755fdef0..b8755fdef0 100644
--- a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__citation.snap
+++ b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__citation.snap
diff --git a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__citation_acronym.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__citation_acronym.snap
index 36478c45c8..36478c45c8 100644
--- a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__citation_acronym.snap
+++ b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__citation_acronym.snap
diff --git a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__citation_open_brace.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__citation_open_brace.snap
index 41a1d9ced3..41a1d9ced3 100644
--- a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__citation_open_brace.snap
+++ b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__citation_open_brace.snap
diff --git a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__citation_open_brace_multiple.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__citation_open_brace_multiple.snap
index 8ef509b463..8ef509b463 100644
--- a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__citation_open_brace_multiple.snap
+++ b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__citation_open_brace_multiple.snap
diff --git a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__color_model_definition_open_brace.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__color_model_definition_open_brace.snap
index 421335a4a5..421335a4a5 100644
--- a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__color_model_definition_open_brace.snap
+++ b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__color_model_definition_open_brace.snap
diff --git a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__color_model_definition_set_open_brace.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__color_model_definition_set_open_brace.snap
index 5d7338e48e..5d7338e48e 100644
--- a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__color_model_definition_set_open_brace.snap
+++ b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__color_model_definition_set_open_brace.snap
diff --git a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__color_model_definition_set_simple.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__color_model_definition_set_simple.snap
index 811b47c9ee..811b47c9ee 100644
--- a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__color_model_definition_set_simple.snap
+++ b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__color_model_definition_set_simple.snap
diff --git a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__color_model_definition_simple.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__color_model_definition_simple.snap
index dbb34f08d9..dbb34f08d9 100644
--- a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__color_model_definition_simple.snap
+++ b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__color_model_definition_simple.snap
diff --git a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__color_open_brace.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__color_open_brace.snap
index e30fc4c1b0..e30fc4c1b0 100644
--- a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__color_open_brace.snap
+++ b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__color_open_brace.snap
diff --git a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__color_simple.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__color_simple.snap
index 5aab0d8e3b..5aab0d8e3b 100644
--- a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__color_simple.snap
+++ b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__color_simple.snap
diff --git a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__color_word.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__color_word.snap
index fe803dc6cc..fe803dc6cc 100644
--- a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__color_word.snap
+++ b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__color_word.snap
diff --git a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__component_command_bibtex.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__component_command_bibtex.snap
index 616fb22a6b..616fb22a6b 100644
--- a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__component_command_bibtex.snap
+++ b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__component_command_bibtex.snap
diff --git a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__component_command_simple.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__component_command_simple.snap
index 0e40056a6e..0e40056a6e 100644
--- a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__component_command_simple.snap
+++ b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__component_command_simple.snap
diff --git a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__component_command_simple_package.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__component_command_simple_package.snap
index 360229fa7a..360229fa7a 100644
--- a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__component_command_simple_package.snap
+++ b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__component_command_simple_package.snap
diff --git a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__component_environment_class.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__component_environment_class.snap
index a2e5e17ac4..a2e5e17ac4 100644
--- a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__component_environment_class.snap
+++ b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__component_environment_class.snap
diff --git a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__component_environment_command_definition.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__component_environment_command_definition.snap
index 28d9c6e82c..28d9c6e82c 100644
--- a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__component_environment_command_definition.snap
+++ b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__component_environment_command_definition.snap
diff --git a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__component_environment_simple.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__component_environment_simple.snap
index f892dba5a7..f892dba5a7 100644
--- a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__component_environment_simple.snap
+++ b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__component_environment_simple.snap
diff --git a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__component_environment_simple_end.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__component_environment_simple_end.snap
index 95a2e1db04..95a2e1db04 100644
--- a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__component_environment_simple_end.snap
+++ b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__component_environment_simple_end.snap
diff --git a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__entry_type_after_preamble.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__entry_type_after_preamble.snap
index 0fd8b00254..0fd8b00254 100644
--- a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__entry_type_after_preamble.snap
+++ b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__entry_type_after_preamble.snap
diff --git a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__entry_type_after_string.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__entry_type_after_string.snap
index 6844fc1862..6844fc1862 100644
--- a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__entry_type_after_string.snap
+++ b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__entry_type_after_string.snap
diff --git a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__entry_type_at_empty.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__entry_type_at_empty.snap
index e74f5fed37..e74f5fed37 100644
--- a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__entry_type_at_empty.snap
+++ b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__entry_type_at_empty.snap
diff --git a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__entry_type_before_article.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__entry_type_before_article.snap
index f9defdee01..f9defdee01 100644
--- a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__entry_type_before_article.snap
+++ b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__entry_type_before_article.snap
diff --git a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__entry_type_before_preamble.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__entry_type_before_preamble.snap
index aad03a392b..aad03a392b 100644
--- a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__entry_type_before_preamble.snap
+++ b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__entry_type_before_preamble.snap
diff --git a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__entry_type_before_string.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__entry_type_before_string.snap
index e30c60a45c..e30c60a45c 100644
--- a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__entry_type_before_string.snap
+++ b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__entry_type_before_string.snap
diff --git a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__entry_type_complete_entry.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__entry_type_complete_entry.snap
index 2724026a26..2724026a26 100644
--- a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__entry_type_complete_entry.snap
+++ b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__entry_type_complete_entry.snap
diff --git a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__field_empty_entry_closed.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__field_empty_entry_closed.snap
index a5a1d7838e..a5a1d7838e 100644
--- a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__field_empty_entry_closed.snap
+++ b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__field_empty_entry_closed.snap
diff --git a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__field_empty_entry_open.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__field_empty_entry_open.snap
index 693d4ed141..693d4ed141 100644
--- a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__field_empty_entry_open.snap
+++ b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__field_empty_entry_open.snap
diff --git a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__field_entry_field_name.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__field_entry_field_name.snap
index cb0d41ed5d..cb0d41ed5d 100644
--- a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__field_entry_field_name.snap
+++ b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__field_entry_field_name.snap
diff --git a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__field_entry_two_fields_name_closed.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__field_entry_two_fields_name_closed.snap
index 66dbf62785..66dbf62785 100644
--- a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__field_entry_two_fields_name_closed.snap
+++ b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__field_entry_two_fields_name_closed.snap
diff --git a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__field_entry_two_fields_name_open.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__field_entry_two_fields_name_open.snap
index 221f78f335..221f78f335 100644
--- a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__field_entry_two_fields_name_open.snap
+++ b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__field_entry_two_fields_name_open.snap
diff --git a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__glossary_ref_open_brace.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__glossary_ref_open_brace.snap
index 1be95d5d99..1be95d5d99 100644
--- a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__glossary_ref_open_brace.snap
+++ b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__glossary_ref_open_brace.snap
diff --git a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__glossary_ref_simple.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__glossary_ref_simple.snap
index 81e9299d69..81e9299d69 100644
--- a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__glossary_ref_simple.snap
+++ b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__glossary_ref_simple.snap
diff --git a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__import_class_closed_brace.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__import_class_closed_brace.snap
index 9ed7978612..9ed7978612 100644
--- a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__import_class_closed_brace.snap
+++ b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__import_class_closed_brace.snap
diff --git a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__import_class_open_brace.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__import_class_open_brace.snap
index b650b621c6..b650b621c6 100644
--- a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__import_class_open_brace.snap
+++ b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__import_class_open_brace.snap
diff --git a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__import_package_closed_brace.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__import_package_closed_brace.snap
index f8cad5526c..f8cad5526c 100644
--- a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__import_package_closed_brace.snap
+++ b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__import_package_closed_brace.snap
diff --git a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__import_package_open_brace.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__import_package_open_brace.snap
index d234241e24..d234241e24 100644
--- a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__import_package_open_brace.snap
+++ b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__import_package_open_brace.snap
diff --git a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__issue_857_1.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__issue_857_1.snap
index 2b8f89b48d..2b8f89b48d 100644
--- a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__issue_857_1.snap
+++ b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__issue_857_1.snap
diff --git a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__issue_864.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__issue_864.snap
index 11adde5924..c49510429d 100644
--- a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__issue_864.snap
+++ b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__issue_864.snap
@@ -1,5 +1,5 @@
---
-source: tests/lsp/text_document/completion.rs
+source: crates/texlab/tests/lsp/text_document/completion.rs
expression: "complete(r#\"\n%! bug.tex\n\\documentclass{article}\n\\def\\ã‚ã„ã†ãˆãŠ{}\n\\begin{document}\n\\ã‚\n |\n ^\n\\end{document}\"#)"
---
[
diff --git a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__label.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__label.snap
index a186c56920..a186c56920 100644
--- a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__label.snap
+++ b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__label.snap
diff --git a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__project_resolution_import.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__project_resolution_import.snap
index 351dc96deb..351dc96deb 100644
--- a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__project_resolution_import.snap
+++ b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__project_resolution_import.snap
diff --git a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__project_resolution_texlabroot.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__project_resolution_texlabroot.snap
index 8ddefbc6ad..8ddefbc6ad 100644
--- a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__project_resolution_texlabroot.snap
+++ b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__project_resolution_texlabroot.snap
diff --git a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__theorem_begin.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__theorem_begin.snap
index f60725667f..f60725667f 100644
--- a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__theorem_begin.snap
+++ b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__theorem_begin.snap
diff --git a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__theorem_end.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__theorem_end.snap
index 0ec951db1d..0ec951db1d 100644
--- a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__theorem_end.snap
+++ b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__theorem_end.snap
diff --git a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__tikz_library_closed_brace.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__tikz_library_closed_brace.snap
index e727fbbc1d..e727fbbc1d 100644
--- a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__tikz_library_closed_brace.snap
+++ b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__tikz_library_closed_brace.snap
diff --git a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__tikz_library_open_brace.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__tikz_library_open_brace.snap
index 668b445c91..668b445c91 100644
--- a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__tikz_library_open_brace.snap
+++ b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__tikz_library_open_brace.snap
diff --git a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__user_command.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__user_command.snap
index 83e2e701ea..ce8c10d8e9 100644
--- a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__user_command.snap
+++ b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__user_command.snap
@@ -1,5 +1,5 @@
---
-source: tests/lsp/text_document/completion.rs
+source: crates/texlab/tests/lsp/text_document/completion.rs
expression: "complete(r#\"\n%! main.tex\n\\foobar\n\\fooba\n |\n ^^^^^\n\\begin{foo}\n\\end{foo}\n\\begin{fo}\"#)"
---
[
diff --git a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__user_environment.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__user_environment.snap
index c46a9beb26..c46a9beb26 100644
--- a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__user_environment.snap
+++ b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__user_environment.snap
diff --git a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__document_link__document_import.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__document_link__document_import.snap
index b27d0f7a32..24e4efd8aa 100644
--- a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__document_link__document_import.snap
+++ b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__document_link__document_import.snap
@@ -1,5 +1,5 @@
---
-source: tests/lsp/text_document/document_link.rs
+source: crates/texlab/tests/lsp/text_document/document_link.rs
expression: "find_links(r#\"\n%! foo.tex\n\\import{.}{bar/baz}\n|\n\n%! bar/baz.tex\"#)"
---
[
@@ -14,6 +14,6 @@ expression: "find_links(r#\"\n%! foo.tex\n\\import{.}{bar/baz}\n|\n\n%! bar/baz.
"character": 18
}
},
- "target": "file:///bar/baz.tex"
+ "target": "redacted://bar/baz.tex"
}
]
diff --git a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__document_link__document_include.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__document_link__document_include.snap
index fd88cb4a8c..c19654b797 100644
--- a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__document_link__document_include.snap
+++ b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__document_link__document_include.snap
@@ -1,5 +1,5 @@
---
-source: tests/lsp/text_document/document_link.rs
+source: crates/texlab/tests/lsp/text_document/document_link.rs
expression: "find_links(r#\"\n%! foo.tex\n\\input{bar.tex}\n|\n\n%! bar.tex\"#)"
---
[
@@ -14,6 +14,6 @@ expression: "find_links(r#\"\n%! foo.tex\n\\input{bar.tex}\n|\n\n%! bar.tex\"#)"
"character": 14
}
},
- "target": "file:///bar.tex"
+ "target": "redacted://bar.tex"
}
]
diff --git a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__document_symbol__enumerate_flat.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__document_symbol__enumerate_flat.snap
index cd18c3f06e..b160196d26 100644
--- a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__document_symbol__enumerate_flat.snap
+++ b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__document_symbol__enumerate_flat.snap
@@ -1,5 +1,5 @@
---
-source: tests/lsp/text_document/document_symbol.rs
+source: crates/texlab/tests/lsp/text_document/document_symbol.rs
expression: "find_symbols(r#\"\n%! main.tex\n\\documentclass{article}\n\n\\begin{document}\n\n\\begin{enumerate}\n \\item\\label{it:foo} Foo\n \\item\\label{it:bar} Bar\n \\item[Baz] Baz\n \\item[Qux]\\label{it:qux} Qux\n\\end{enumerate}\n\n\\end{document}\n|\n\n%! main.aux\n\\relax\n\\newlabel{it:foo}{{1}{1}}\n\\newlabel{it:qux}{{2}{1}}\"#,\n serde_json::json!({}), serde_json::Value::Null)"
---
[
@@ -8,7 +8,7 @@ expression: "find_symbols(r#\"\n%! main.tex\n\\documentclass{article}\n\n\\begin
"kind": 10,
"deprecated": false,
"location": {
- "uri": "file:///main.tex",
+ "uri": "redacted://main.tex",
"range": {
"start": {
"line": 4,
@@ -26,7 +26,7 @@ expression: "find_symbols(r#\"\n%! main.tex\n\\documentclass{article}\n\n\\begin
"kind": 22,
"deprecated": false,
"location": {
- "uri": "file:///main.tex",
+ "uri": "redacted://main.tex",
"range": {
"start": {
"line": 5,
@@ -44,7 +44,7 @@ expression: "find_symbols(r#\"\n%! main.tex\n\\documentclass{article}\n\n\\begin
"kind": 22,
"deprecated": false,
"location": {
- "uri": "file:///main.tex",
+ "uri": "redacted://main.tex",
"range": {
"start": {
"line": 6,
@@ -62,7 +62,7 @@ expression: "find_symbols(r#\"\n%! main.tex\n\\documentclass{article}\n\n\\begin
"kind": 22,
"deprecated": false,
"location": {
- "uri": "file:///main.tex",
+ "uri": "redacted://main.tex",
"range": {
"start": {
"line": 7,
@@ -80,7 +80,7 @@ expression: "find_symbols(r#\"\n%! main.tex\n\\documentclass{article}\n\n\\begin
"kind": 22,
"deprecated": false,
"location": {
- "uri": "file:///main.tex",
+ "uri": "redacted://main.tex",
"range": {
"start": {
"line": 8,
diff --git a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__document_symbol__enumerate_nested.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__document_symbol__enumerate_nested.snap
index 8f777b6d8f..8f777b6d8f 100644
--- a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__document_symbol__enumerate_nested.snap
+++ b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__document_symbol__enumerate_nested.snap
diff --git a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__document_symbol__equation_flat.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__document_symbol__equation_flat.snap
index d37fe4cbbf..6ff985fa81 100644
--- a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__document_symbol__equation_flat.snap
+++ b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__document_symbol__equation_flat.snap
@@ -1,5 +1,5 @@
---
-source: tests/lsp/text_document/document_symbol.rs
+source: crates/texlab/tests/lsp/text_document/document_symbol.rs
expression: "find_symbols(r#\"\n%! main.tex\n\\documentclass{article}\n\n\\begin{document}\n\n\\begin{equation}\\label{eq:foo}\n Foo\n\\end{equation}\n\n\\begin{equation}\\label{eq:bar}\n Bar\n\\end{equation}\n\n\\begin{equation}\n Baz\n\\end{equation}\n\n\\end{document}\n|\n\n%! main.aux\n\\relax\n\\newlabel{eq:foo}{{1}{1}}\"#,\n serde_json::json!({}), serde_json::Value::Null)"
---
[
@@ -8,7 +8,7 @@ expression: "find_symbols(r#\"\n%! main.tex\n\\documentclass{article}\n\n\\begin
"kind": 14,
"deprecated": false,
"location": {
- "uri": "file:///main.tex",
+ "uri": "redacted://main.tex",
"range": {
"start": {
"line": 4,
@@ -26,7 +26,7 @@ expression: "find_symbols(r#\"\n%! main.tex\n\\documentclass{article}\n\n\\begin
"kind": 14,
"deprecated": false,
"location": {
- "uri": "file:///main.tex",
+ "uri": "redacted://main.tex",
"range": {
"start": {
"line": 8,
@@ -44,7 +44,7 @@ expression: "find_symbols(r#\"\n%! main.tex\n\\documentclass{article}\n\n\\begin
"kind": 14,
"deprecated": false,
"location": {
- "uri": "file:///main.tex",
+ "uri": "redacted://main.tex",
"range": {
"start": {
"line": 12,
diff --git a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__document_symbol__equation_nested.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__document_symbol__equation_nested.snap
index 5965400814..5965400814 100644
--- a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__document_symbol__equation_nested.snap
+++ b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__document_symbol__equation_nested.snap
diff --git a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__document_symbol__float_flat.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__document_symbol__float_flat.snap
index e93be78925..742e405e0f 100644
--- a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__document_symbol__float_flat.snap
+++ b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__document_symbol__float_flat.snap
@@ -1,5 +1,5 @@
---
-source: tests/lsp/text_document/document_symbol.rs
+source: crates/texlab/tests/lsp/text_document/document_symbol.rs
expression: "find_symbols(r#\"\n%! main.tex\n\\documentclass{article}\n\n\\begin{document}\n\n\\begin{figure}\n Foo\n \\caption{Foo}\\label{fig:foo}\n\\end{figure}\n\n\\begin{figure}\n Bar\n \\caption{Bar}\\label{fig:bar}\n\\end{figure}\n\n\\begin{figure}\n Baz\n \\caption{Baz}\n\\end{figure}\n\n\\begin{figure}\n Qux\n\\end{figure}\n\n\\end{document}\n|\n\n%! main.aux\n\\relax\n\\@writefile{lof}{\\contentsline {figure}{\\numberline {1}{\\ignorespaces Foo}}{1}\\protected@file@percent }\n\\newlabel{fig:foo}{{1}{1}}\n\\@writefile{lof}{\\contentsline {figure}{\\numberline {2}{\\ignorespaces Bar}}{1}\\protected@file@percent }\n\\@writefile{lof}{\\contentsline {figure}{\\numberline {3}{\\ignorespaces Baz}}{1}\\protected@file@percent }\"#,\n serde_json::json!({}), serde_json::Value::Null)"
---
[
@@ -8,7 +8,7 @@ expression: "find_symbols(r#\"\n%! main.tex\n\\documentclass{article}\n\n\\begin
"kind": 6,
"deprecated": false,
"location": {
- "uri": "file:///main.tex",
+ "uri": "redacted://main.tex",
"range": {
"start": {
"line": 4,
@@ -26,7 +26,7 @@ expression: "find_symbols(r#\"\n%! main.tex\n\\documentclass{article}\n\n\\begin
"kind": 6,
"deprecated": false,
"location": {
- "uri": "file:///main.tex",
+ "uri": "redacted://main.tex",
"range": {
"start": {
"line": 9,
@@ -44,7 +44,7 @@ expression: "find_symbols(r#\"\n%! main.tex\n\\documentclass{article}\n\n\\begin
"kind": 6,
"deprecated": false,
"location": {
- "uri": "file:///main.tex",
+ "uri": "redacted://main.tex",
"range": {
"start": {
"line": 14,
diff --git a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__document_symbol__float_nested.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__document_symbol__float_nested.snap
index a625beb1fb..a625beb1fb 100644
--- a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__document_symbol__float_nested.snap
+++ b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__document_symbol__float_nested.snap
diff --git a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__document_symbol__ignored_patterns.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__document_symbol__ignored_patterns.snap
index 90c445fc01..c1981e9db2 100644
--- a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__document_symbol__ignored_patterns.snap
+++ b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__document_symbol__ignored_patterns.snap
@@ -1,5 +1,5 @@
---
-source: tests/lsp/text_document/document_symbol.rs
+source: crates/texlab/tests/lsp/text_document/document_symbol.rs
expression: "find_symbols(r#\"\n%! main.tex\n\\documentclass{article}\n\n\\begin{document}\n\n\\begin{equation}\\label{eq:foo}\n Foo\n\\end{equation}\n \n\\begin{enumerate}\n \\item Foo\n \\item Bar\n\\end{enumerate}\n\n\\end{document}\n|\"#,\n serde_json::json!({}),\n serde_json::json!({\n \"symbols\" : { \"ignoredPatterns\" : [\"Item\", \"Enumerate\"] }\n }))"
---
[
@@ -8,7 +8,7 @@ expression: "find_symbols(r#\"\n%! main.tex\n\\documentclass{article}\n\n\\begin
"kind": 14,
"deprecated": false,
"location": {
- "uri": "file:///main.tex",
+ "uri": "redacted://main.tex",
"range": {
"start": {
"line": 4,
diff --git a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__document_symbol__section_flat.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__document_symbol__section_flat.snap
index 85d9cef9e8..5ab04f4e60 100644
--- a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__document_symbol__section_flat.snap
+++ b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__document_symbol__section_flat.snap
@@ -1,5 +1,5 @@
---
-source: tests/lsp/text_document/document_symbol.rs
+source: crates/texlab/tests/lsp/text_document/document_symbol.rs
expression: "find_symbols(r#\"\n%! main.tex\n\\documentclass{article}\n\n\\begin{document}\n\n\\section{Foo}\n\n\\section{Bar}\\label{sec:bar}\n\n\\subsection{Baz}\\label{sec:baz}\n\n\\end{document}\n|\n\n%! main.aux\n\\relax\n\\@writefile{toc}{\\contentsline {section}{\\numberline {1}Foo}{1}\\protected@file@percent }\n\\@writefile{toc}{\\contentsline {section}{\\numberline {2}Bar}{1}\\protected@file@percent }\n\\newlabel{sec:bar}{{2}{1}}\"#,\n serde_json::json!({}), serde_json::Value::Null)"
---
[
@@ -8,7 +8,7 @@ expression: "find_symbols(r#\"\n%! main.tex\n\\documentclass{article}\n\n\\begin
"kind": 2,
"deprecated": false,
"location": {
- "uri": "file:///main.tex",
+ "uri": "redacted://main.tex",
"range": {
"start": {
"line": 4,
@@ -26,7 +26,7 @@ expression: "find_symbols(r#\"\n%! main.tex\n\\documentclass{article}\n\n\\begin
"kind": 2,
"deprecated": false,
"location": {
- "uri": "file:///main.tex",
+ "uri": "redacted://main.tex",
"range": {
"start": {
"line": 6,
@@ -44,7 +44,7 @@ expression: "find_symbols(r#\"\n%! main.tex\n\\documentclass{article}\n\n\\begin
"kind": 2,
"deprecated": false,
"location": {
- "uri": "file:///main.tex",
+ "uri": "redacted://main.tex",
"range": {
"start": {
"line": 8,
diff --git a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__document_symbol__section_nested.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__document_symbol__section_nested.snap
index bac292bf01..bac292bf01 100644
--- a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__document_symbol__section_nested.snap
+++ b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__document_symbol__section_nested.snap
diff --git a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__document_symbol__theorem_flat.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__document_symbol__theorem_flat.snap
index 55ab44980c..a20b9bb236 100644
--- a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__document_symbol__theorem_flat.snap
+++ b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__document_symbol__theorem_flat.snap
@@ -1,5 +1,5 @@
---
-source: tests/lsp/text_document/document_symbol.rs
+source: crates/texlab/tests/lsp/text_document/document_symbol.rs
expression: "find_symbols(r#\"\n%! main.tex\n\\documentclass{article}\n\\usepackage{amsthm}\n\\newtheorem{lemma}{Lemma}\n\n\\begin{document}\n\n\\begin{lemma}[Foo]\\label{thm:foo}\n Foo\n\\end{lemma}\n\n\\begin{lemma}\\label{thm:bar}\n Bar\n\\end{lemma}\n\n\\begin{lemma}\\label{thm:baz}\n Baz\n\\end{lemma}\n\n\\begin{lemma}[Qux]\n Qux\n\\end{lemma}\n\n\\end{document}\n|\n\n%! main.aux\n\\relax\n\\newlabel{thm:foo}{{1}{1}}\n\\newlabel{thm:bar}{{2}{1}}\"#,\n serde_json::json!({}), serde_json::Value::Null)"
---
[
@@ -8,7 +8,7 @@ expression: "find_symbols(r#\"\n%! main.tex\n\\documentclass{article}\n\\usepack
"kind": 13,
"deprecated": false,
"location": {
- "uri": "file:///main.tex",
+ "uri": "redacted://main.tex",
"range": {
"start": {
"line": 6,
@@ -26,7 +26,7 @@ expression: "find_symbols(r#\"\n%! main.tex\n\\documentclass{article}\n\\usepack
"kind": 13,
"deprecated": false,
"location": {
- "uri": "file:///main.tex",
+ "uri": "redacted://main.tex",
"range": {
"start": {
"line": 10,
@@ -44,7 +44,7 @@ expression: "find_symbols(r#\"\n%! main.tex\n\\documentclass{article}\n\\usepack
"kind": 13,
"deprecated": false,
"location": {
- "uri": "file:///main.tex",
+ "uri": "redacted://main.tex",
"range": {
"start": {
"line": 14,
@@ -62,7 +62,7 @@ expression: "find_symbols(r#\"\n%! main.tex\n\\documentclass{article}\n\\usepack
"kind": 13,
"deprecated": false,
"location": {
- "uri": "file:///main.tex",
+ "uri": "redacted://main.tex",
"range": {
"start": {
"line": 18,
diff --git a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__document_symbol__theorem_nested.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__document_symbol__theorem_nested.snap
index 82bdd6d1d9..82bdd6d1d9 100644
--- a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__document_symbol__theorem_nested.snap
+++ b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__document_symbol__theorem_nested.snap
diff --git a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__folding_range__bibtex.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__folding_range__bibtex.snap
index 2063cc39e5..2063cc39e5 100644
--- a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__folding_range__bibtex.snap
+++ b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__folding_range__bibtex.snap
diff --git a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__folding_range__latex.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__folding_range__latex.snap
index 74632eda56..74632eda56 100644
--- a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__folding_range__latex.snap
+++ b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__folding_range__latex.snap
diff --git a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__formatting__bibtex_internal_command.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__formatting__bibtex_internal_command.snap
index b98dd68758..b98dd68758 100644
--- a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__formatting__bibtex_internal_command.snap
+++ b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__formatting__bibtex_internal_command.snap
diff --git a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__formatting__bibtex_internal_insert_braces.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__formatting__bibtex_internal_insert_braces.snap
index a95f5d3006..a95f5d3006 100644
--- a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__formatting__bibtex_internal_insert_braces.snap
+++ b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__formatting__bibtex_internal_insert_braces.snap
diff --git a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__formatting__bibtex_internal_join_strings.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__formatting__bibtex_internal_join_strings.snap
index 3ea6bf18ad..3ea6bf18ad 100644
--- a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__formatting__bibtex_internal_join_strings.snap
+++ b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__formatting__bibtex_internal_join_strings.snap
diff --git a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__formatting__bibtex_internal_multiple_entries.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__formatting__bibtex_internal_multiple_entries.snap
index 966f133a76..966f133a76 100644
--- a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__formatting__bibtex_internal_multiple_entries.snap
+++ b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__formatting__bibtex_internal_multiple_entries.snap
diff --git a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__formatting__bibtex_internal_parens.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__formatting__bibtex_internal_parens.snap
index ca317db108..ca317db108 100644
--- a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__formatting__bibtex_internal_parens.snap
+++ b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__formatting__bibtex_internal_parens.snap
diff --git a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__formatting__bibtex_internal_preamble.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__formatting__bibtex_internal_preamble.snap
index 6448e3a791..6448e3a791 100644
--- a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__formatting__bibtex_internal_preamble.snap
+++ b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__formatting__bibtex_internal_preamble.snap
diff --git a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__formatting__bibtex_internal_string.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__formatting__bibtex_internal_string.snap
index a1739290fd..a1739290fd 100644
--- a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__formatting__bibtex_internal_string.snap
+++ b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__formatting__bibtex_internal_string.snap
diff --git a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__formatting__bibtex_internal_trailing_comma.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__formatting__bibtex_internal_trailing_comma.snap
index dd5c7b49f0..dd5c7b49f0 100644
--- a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__formatting__bibtex_internal_trailing_comma.snap
+++ b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__formatting__bibtex_internal_trailing_comma.snap
diff --git a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__formatting__bibtex_internal_wrap_long_lines.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__formatting__bibtex_internal_wrap_long_lines.snap
index c52b8a9317..c52b8a9317 100644
--- a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__formatting__bibtex_internal_wrap_long_lines.snap
+++ b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__formatting__bibtex_internal_wrap_long_lines.snap
diff --git a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__hover__citation_inside_cite.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__hover__citation_inside_cite.snap
index 6e6c6b264c..6e6c6b264c 100644
--- a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__hover__citation_inside_cite.snap
+++ b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__hover__citation_inside_cite.snap
diff --git a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__hover__citation_inside_entry.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__hover__citation_inside_entry.snap
index c13c16051d..c13c16051d 100644
--- a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__hover__citation_inside_entry.snap
+++ b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__hover__citation_inside_entry.snap
diff --git a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__hover__component_known_package.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__hover__component_known_package.snap
index ea1801d4ed..ea1801d4ed 100644
--- a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__hover__component_known_package.snap
+++ b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__hover__component_known_package.snap
diff --git a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__hover__entry_type_known_type.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__hover__entry_type_known_type.snap
index f3b146fb21..f3b146fb21 100644
--- a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__hover__entry_type_known_type.snap
+++ b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__hover__entry_type_known_type.snap
diff --git a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__hover__field_known.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__hover__field_known.snap
index 42d630c287..42d630c287 100644
--- a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__hover__field_known.snap
+++ b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__hover__field_known.snap
diff --git a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__hover__label_theorem_child_file.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__hover__label_theorem_child_file.snap
index 19b36c4ebb..19b36c4ebb 100644
--- a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__hover__label_theorem_child_file.snap
+++ b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__hover__label_theorem_child_file.snap
diff --git a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__hover__label_theorem_child_file_mumber.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__hover__label_theorem_child_file_mumber.snap
index 78ccef8e46..78ccef8e46 100644
--- a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__hover__label_theorem_child_file_mumber.snap
+++ b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__hover__label_theorem_child_file_mumber.snap
diff --git a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__hover__section.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__hover__section.snap
index c8aa265330..c8aa265330 100644
--- a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__hover__section.snap
+++ b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__hover__section.snap
diff --git a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__hover__string_inside_reference.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__hover__string_inside_reference.snap
index cfcc196e26..cfcc196e26 100644
--- a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__hover__string_inside_reference.snap
+++ b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__hover__string_inside_reference.snap
diff --git a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__inlay_hint__label_definition.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__inlay_hint__label_definition.snap
index b8568fd2fd..b8568fd2fd 100644
--- a/support/texlab/tests/lsp/text_document/snapshots/lsp__text_document__inlay_hint__label_definition.snap
+++ b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__inlay_hint__label_definition.snap
diff --git a/support/texlab/tests/lsp/workspace.rs b/support/texlab/crates/texlab/tests/lsp/workspace.rs
index 15e0679dea..15e0679dea 100644
--- a/support/texlab/tests/lsp/workspace.rs
+++ b/support/texlab/crates/texlab/tests/lsp/workspace.rs
diff --git a/support/texlab/tests/lsp/workspace/snapshots/lsp__workspace__symbol__filter_bibtex.snap b/support/texlab/crates/texlab/tests/lsp/workspace/snapshots/lsp__workspace__symbol__filter_bibtex.snap
index 0c2e328570..3e74634e7b 100644
--- a/support/texlab/tests/lsp/workspace/snapshots/lsp__workspace__symbol__filter_bibtex.snap
+++ b/support/texlab/crates/texlab/tests/lsp/workspace/snapshots/lsp__workspace__symbol__filter_bibtex.snap
@@ -1,5 +1,5 @@
---
-source: tests/lsp/workspace/symbol.rs
+source: crates/texlab/tests/lsp/workspace/symbol.rs
expression: "find_symbols(FIXTURE, \"bibtex\")"
---
[
@@ -8,7 +8,7 @@ expression: "find_symbols(FIXTURE, \"bibtex\")"
"kind": 24,
"deprecated": false,
"location": {
- "uri": "file:///main.bib",
+ "uri": "redacted://main.bib",
"range": {
"start": {
"line": 0,
@@ -26,7 +26,7 @@ expression: "find_symbols(FIXTURE, \"bibtex\")"
"kind": 15,
"deprecated": false,
"location": {
- "uri": "file:///main.bib",
+ "uri": "redacted://main.bib",
"range": {
"start": {
"line": 2,
diff --git a/support/texlab/tests/lsp/workspace/snapshots/lsp__workspace__symbol__filter_type_figure.snap b/support/texlab/crates/texlab/tests/lsp/workspace/snapshots/lsp__workspace__symbol__filter_type_figure.snap
index 090fe25045..66758aa90e 100644
--- a/support/texlab/tests/lsp/workspace/snapshots/lsp__workspace__symbol__filter_type_figure.snap
+++ b/support/texlab/crates/texlab/tests/lsp/workspace/snapshots/lsp__workspace__symbol__filter_type_figure.snap
@@ -1,5 +1,5 @@
---
-source: tests/lsp/workspace/symbol.rs
+source: crates/texlab/tests/lsp/workspace/symbol.rs
expression: "find_symbols(FIXTURE, \"figure\")"
---
[
@@ -8,7 +8,7 @@ expression: "find_symbols(FIXTURE, \"figure\")"
"kind": 6,
"deprecated": false,
"location": {
- "uri": "file:///main.tex",
+ "uri": "redacted://main.tex",
"range": {
"start": {
"line": 15,
diff --git a/support/texlab/tests/lsp/workspace/snapshots/lsp__workspace__symbol__filter_type_item.snap b/support/texlab/crates/texlab/tests/lsp/workspace/snapshots/lsp__workspace__symbol__filter_type_item.snap
index 6f739ffb29..fdc506b308 100644
--- a/support/texlab/tests/lsp/workspace/snapshots/lsp__workspace__symbol__filter_type_item.snap
+++ b/support/texlab/crates/texlab/tests/lsp/workspace/snapshots/lsp__workspace__symbol__filter_type_item.snap
@@ -1,5 +1,5 @@
---
-source: tests/lsp/workspace/symbol.rs
+source: crates/texlab/tests/lsp/workspace/symbol.rs
expression: "find_symbols(FIXTURE, \"item\")"
---
[
@@ -8,7 +8,7 @@ expression: "find_symbols(FIXTURE, \"item\")"
"kind": 22,
"deprecated": false,
"location": {
- "uri": "file:///main.tex",
+ "uri": "redacted://main.tex",
"range": {
"start": {
"line": 24,
@@ -26,7 +26,7 @@ expression: "find_symbols(FIXTURE, \"item\")"
"kind": 22,
"deprecated": false,
"location": {
- "uri": "file:///main.tex",
+ "uri": "redacted://main.tex",
"range": {
"start": {
"line": 25,
@@ -44,7 +44,7 @@ expression: "find_symbols(FIXTURE, \"item\")"
"kind": 22,
"deprecated": false,
"location": {
- "uri": "file:///main.tex",
+ "uri": "redacted://main.tex",
"range": {
"start": {
"line": 26,
diff --git a/support/texlab/tests/lsp/workspace/snapshots/lsp__workspace__symbol__filter_type_math.snap b/support/texlab/crates/texlab/tests/lsp/workspace/snapshots/lsp__workspace__symbol__filter_type_math.snap
index 6e63e65aa4..2dc59f021b 100644
--- a/support/texlab/tests/lsp/workspace/snapshots/lsp__workspace__symbol__filter_type_math.snap
+++ b/support/texlab/crates/texlab/tests/lsp/workspace/snapshots/lsp__workspace__symbol__filter_type_math.snap
@@ -1,5 +1,5 @@
---
-source: tests/lsp/workspace/symbol.rs
+source: crates/texlab/tests/lsp/workspace/symbol.rs
expression: "find_symbols(FIXTURE, \"math\")"
---
[
@@ -8,7 +8,7 @@ expression: "find_symbols(FIXTURE, \"math\")"
"kind": 14,
"deprecated": false,
"location": {
- "uri": "file:///main.tex",
+ "uri": "redacted://main.tex",
"range": {
"start": {
"line": 9,
@@ -26,7 +26,7 @@ expression: "find_symbols(FIXTURE, \"math\")"
"kind": 13,
"deprecated": false,
"location": {
- "uri": "file:///main.tex",
+ "uri": "redacted://main.tex",
"range": {
"start": {
"line": 33,
diff --git a/support/texlab/tests/lsp/workspace/snapshots/lsp__workspace__symbol__filter_type_section.snap b/support/texlab/crates/texlab/tests/lsp/workspace/snapshots/lsp__workspace__symbol__filter_type_section.snap
index fef2f41be6..eff280251a 100644
--- a/support/texlab/tests/lsp/workspace/snapshots/lsp__workspace__symbol__filter_type_section.snap
+++ b/support/texlab/crates/texlab/tests/lsp/workspace/snapshots/lsp__workspace__symbol__filter_type_section.snap
@@ -1,5 +1,5 @@
---
-source: tests/lsp/workspace/symbol.rs
+source: crates/texlab/tests/lsp/workspace/symbol.rs
expression: "find_symbols(FIXTURE, \"section\")"
---
[
@@ -8,7 +8,7 @@ expression: "find_symbols(FIXTURE, \"section\")"
"kind": 2,
"deprecated": false,
"location": {
- "uri": "file:///main.tex",
+ "uri": "redacted://main.tex",
"range": {
"start": {
"line": 7,
@@ -26,7 +26,7 @@ expression: "find_symbols(FIXTURE, \"section\")"
"kind": 2,
"deprecated": false,
"location": {
- "uri": "file:///main.tex",
+ "uri": "redacted://main.tex",
"range": {
"start": {
"line": 13,
@@ -44,7 +44,7 @@ expression: "find_symbols(FIXTURE, \"section\")"
"kind": 2,
"deprecated": false,
"location": {
- "uri": "file:///main.tex",
+ "uri": "redacted://main.tex",
"range": {
"start": {
"line": 21,
@@ -62,7 +62,7 @@ expression: "find_symbols(FIXTURE, \"section\")"
"kind": 2,
"deprecated": false,
"location": {
- "uri": "file:///main.tex",
+ "uri": "redacted://main.tex",
"range": {
"start": {
"line": 29,
diff --git a/support/texlab/tests/lsp/workspace/symbol.rs b/support/texlab/crates/texlab/tests/lsp/workspace/symbol.rs
index e726ed6860..e726ed6860 100644
--- a/support/texlab/tests/lsp/workspace/symbol.rs
+++ b/support/texlab/crates/texlab/tests/lsp/workspace/symbol.rs
diff --git a/support/texlab/src/db.rs b/support/texlab/src/db.rs
deleted file mode 100644
index 521655ce80..0000000000
--- a/support/texlab/src/db.rs
+++ /dev/null
@@ -1,15 +0,0 @@
-pub mod analysis;
-mod context;
-pub mod diagnostics;
-mod discovery;
-mod document;
-pub mod parse;
-mod workspace;
-
-pub use {context::*, discovery::*, document::*, workspace::*};
-
-#[salsa::interned]
-pub struct Word {
- #[return_ref]
- pub text: String,
-}
diff --git a/support/texlab/src/db/analysis.rs b/support/texlab/src/db/analysis.rs
deleted file mode 100644
index 1f1bd508a8..0000000000
--- a/support/texlab/src/db/analysis.rs
+++ /dev/null
@@ -1,221 +0,0 @@
-pub mod label;
-
-use rowan::{ast::AstNode, NodeOrToken, TextRange};
-
-use crate::{
- syntax::latex::{self, HasCurly},
- Db,
-};
-
-use super::Word;
-
-#[salsa::tracked]
-pub struct TexLink {
- pub kind: TexLinkKind,
- pub path: Word,
- pub range: TextRange,
- pub base_dir: Option<Word>,
-}
-
-impl TexLink {
- fn of_include(db: &dyn Db, node: latex::SyntaxNode, results: &mut Vec<Self>) -> Option<()> {
- let include = latex::Include::cast(node)?;
- let kind = match include.syntax().kind() {
- latex::LATEX_INCLUDE => TexLinkKind::Tex,
- latex::BIBLATEX_INCLUDE | latex::BIBTEX_INCLUDE => TexLinkKind::Bib,
- latex::PACKAGE_INCLUDE => TexLinkKind::Sty,
- latex::CLASS_INCLUDE => TexLinkKind::Cls,
- _ => return None,
- };
-
- for path in include.path_list()?.keys() {
- results.push(Self::new(
- db,
- kind,
- Word::new(db, path.to_string()),
- latex::small_range(&path),
- None,
- ));
- }
-
- Some(())
- }
-
- fn of_import(db: &dyn Db, node: latex::SyntaxNode, results: &mut Vec<Self>) -> Option<()> {
- let import = latex::Import::cast(node)?;
-
- let mut base_dir = import.directory()?.key()?.to_string();
- if !base_dir.ends_with('/') {
- base_dir.push('/');
- }
-
- let path = import.file()?.key()?;
- results.push(Self::new(
- db,
- TexLinkKind::Tex,
- Word::new(db, path.to_string()),
- latex::small_range(&path),
- Some(Word::new(db, base_dir)),
- ));
-
- Some(())
- }
-}
-
-#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone, Copy, Hash)]
-pub enum TexLinkKind {
- Sty,
- Cls,
- Tex,
- Bib,
-}
-
-impl TexLinkKind {
- pub fn extensions(self) -> &'static [&'static str] {
- match self {
- Self::Sty => &["sty"],
- Self::Cls => &["cls"],
- Self::Tex => &["tex"],
- Self::Bib => &["bib"],
- }
- }
-}
-
-#[salsa::tracked]
-pub struct TheoremEnvironment {
- pub name: Word,
- pub description: Word,
-}
-
-impl TheoremEnvironment {
- fn of_definition(db: &dyn Db, node: latex::SyntaxNode, results: &mut Vec<Self>) -> Option<()> {
- let theorem = latex::TheoremDefinition::cast(node)?;
- let name = theorem.name()?.key()?.to_string();
- let description = theorem.description()?;
- let description = description.content_text()?;
-
- results.push(Self::new(
- db,
- Word::new(db, name),
- Word::new(db, description),
- ));
-
- Some(())
- }
-}
-
-#[salsa::tracked]
-pub struct GraphicsPath {
- #[return_ref]
- pub path: String,
-}
-
-impl GraphicsPath {
- pub fn of_command(db: &dyn Db, node: latex::SyntaxNode, results: &mut Vec<Self>) -> Option<()> {
- let definition = latex::GraphicsPath::cast(node)?;
- for path in definition
- .path_list()
- .filter_map(|group| group.key())
- .map(|path| path.to_string())
- {
- results.push(GraphicsPath::new(db, path));
- }
-
- Some(())
- }
-}
-
-#[salsa::tracked]
-pub struct TexAnalysis {
- #[return_ref]
- pub links: Vec<TexLink>,
-
- #[return_ref]
- pub labels: Vec<label::Name>,
-
- #[return_ref]
- pub label_numbers: Vec<label::Number>,
-
- #[return_ref]
- pub theorem_environments: Vec<TheoremEnvironment>,
-
- #[return_ref]
- pub graphics_paths: Vec<GraphicsPath>,
-
- #[return_ref]
- pub command_name_ranges: Vec<TextRange>,
-
- #[return_ref]
- pub environment_names: Vec<String>,
-}
-
-#[salsa::tracked]
-impl TexAnalysis {
- #[salsa::tracked]
- pub fn has_document_environment(self, db: &dyn Db) -> bool {
- self.environment_names(db)
- .iter()
- .any(|name| name == "document")
- }
-}
-
-impl TexAnalysis {
- pub(super) fn analyze(db: &dyn Db, root: &latex::SyntaxNode) -> Self {
- let mut links = Vec::new();
- let mut labels = Vec::new();
- let mut label_numbers = Vec::new();
- let mut theorem_environments = Vec::new();
- let mut graphics_paths = Vec::new();
- let mut command_name_ranges = Vec::new();
- let mut environment_names = Vec::new();
-
- for element in root.descendants_with_tokens() {
- match element {
- NodeOrToken::Token(token) if token.kind() == latex::COMMAND_NAME => {
- command_name_ranges.push(token.text_range());
- }
- NodeOrToken::Token(_) => {}
- NodeOrToken::Node(node) => {
- TexLink::of_include(db, node.clone(), &mut links)
- .or_else(|| TexLink::of_import(db, node.clone(), &mut links))
- .or_else(|| label::Name::of_definition(db, node.clone(), &mut labels))
- .or_else(|| label::Name::of_reference(db, node.clone(), &mut labels))
- .or_else(|| label::Name::of_reference_range(db, node.clone(), &mut labels))
- .or_else(|| label::Number::of_number(db, node.clone(), &mut label_numbers))
- .or_else(|| {
- TheoremEnvironment::of_definition(
- db,
- node.clone(),
- &mut theorem_environments,
- )
- })
- .or_else(|| GraphicsPath::of_command(db, node.clone(), &mut graphics_paths))
- .or_else(|| {
- let range = latex::GenericCommand::cast(node.clone())?
- .name()?
- .text_range();
-
- command_name_ranges.push(range);
- Some(())
- })
- .or_else(|| {
- let begin = latex::Begin::cast(node.clone())?;
- environment_names.push(begin.name()?.key()?.to_string());
- Some(())
- });
- }
- };
- }
-
- Self::new(
- db,
- links,
- labels,
- label_numbers,
- theorem_environments,
- graphics_paths,
- command_name_ranges,
- environment_names,
- )
- }
-}
diff --git a/support/texlab/src/db/analysis/label.rs b/support/texlab/src/db/analysis/label.rs
deleted file mode 100644
index 77ee5268eb..0000000000
--- a/support/texlab/src/db/analysis/label.rs
+++ /dev/null
@@ -1,122 +0,0 @@
-use rowan::{
- ast::{AstNode, AstPtr},
- TextRange,
-};
-
-use crate::{db::Word, syntax::latex, Db};
-
-#[salsa::tracked]
-pub struct Number {
- pub name: Word,
- pub text: Word,
-}
-
-impl Number {
- pub(super) fn of_number(
- db: &dyn Db,
- node: latex::SyntaxNode,
- results: &mut Vec<Self>,
- ) -> Option<()> {
- let number = latex::LabelNumber::cast(node)?;
- let name = number.name()?.key()?.to_string();
- let text = number
- .text()?
- .syntax()
- .descendants_with_tokens()
- .filter_map(|element| element.into_node())
- .find(|node| node.kind() == latex::TEXT || node.kind() == latex::MIXED_GROUP)?
- .text()
- .to_string();
-
- results.push(Self::new(db, Word::new(db, name), Word::new(db, text)));
-
- Some(())
- }
-}
-
-#[derive(Debug, PartialEq, Eq, Clone, Hash)]
-pub enum Origin {
- Definition(AstPtr<latex::LabelDefinition>),
- Reference(AstPtr<latex::LabelReference>),
- ReferenceRange(AstPtr<latex::LabelReferenceRange>),
-}
-
-impl Origin {
- pub fn as_definition(&self) -> Option<&AstPtr<latex::LabelDefinition>> {
- match self {
- Self::Definition(ptr) => Some(ptr),
- _ => None,
- }
- }
-}
-
-#[salsa::tracked]
-pub struct Name {
- pub origin: Origin,
- pub name: Word,
- pub range: TextRange,
-}
-
-impl Name {
- pub(super) fn of_definition(
- db: &dyn Db,
- node: latex::SyntaxNode,
- results: &mut Vec<Self>,
- ) -> Option<()> {
- let label = latex::LabelDefinition::cast(node)?;
- let name = label.name()?.key()?;
- results.push(Self::new(
- db,
- Origin::Definition(AstPtr::new(&label)),
- Word::new(db, name.to_string()),
- latex::small_range(&name),
- ));
-
- Some(())
- }
-
- pub(super) fn of_reference(
- db: &dyn Db,
- node: latex::SyntaxNode,
- results: &mut Vec<Self>,
- ) -> Option<()> {
- let label = latex::LabelReference::cast(node)?;
- for name in label.name_list()?.keys() {
- results.push(Self::new(
- db,
- Origin::Reference(AstPtr::new(&label)),
- Word::new(db, name.to_string()),
- latex::small_range(&name),
- ));
- }
-
- Some(())
- }
-
- pub(super) fn of_reference_range(
- db: &dyn Db,
- node: latex::SyntaxNode,
- results: &mut Vec<Self>,
- ) -> Option<()> {
- let label = latex::LabelReferenceRange::cast(node)?;
- if let Some(name) = label.from().and_then(|name| name.key()) {
- results.push(Self::new(
- db,
- Origin::ReferenceRange(AstPtr::new(&label)),
- Word::new(db, name.to_string()),
- latex::small_range(&name),
- ));
- }
-
- if let Some(name) = label.to().and_then(|name| name.key()) {
- results.push(Self::new(
- db,
- Origin::ReferenceRange(AstPtr::new(&label)),
- Word::new(db, name.to_string()),
- latex::small_range(&name),
- ));
- }
-
- Some(())
- }
-}
diff --git a/support/texlab/src/db/context.rs b/support/texlab/src/db/context.rs
deleted file mode 100644
index c6277eb099..0000000000
--- a/support/texlab/src/db/context.rs
+++ /dev/null
@@ -1,18 +0,0 @@
-use crate::Config;
-
-/// Contains the global context of the server throughout the application.
-#[salsa::input(singleton)]
-pub struct ServerContext {
- /// The server configuration which is extracted from either
- /// the `workspace/configuration` or `workspace/didChangeConfiguration` messages.
- #[return_ref]
- pub config: Config,
-
- /// Disable usage of `isIncomplete = false` in completion lists.
- ///
- /// Due to the large number of completion results,
- /// the server can only send a subset of the items most of the time.
- /// When the filtered list is small enough, `CompletionList.isIncomplete` can be set to `false`.
- /// On VSCode, this optimization should not be done so this flag is needed.
- pub always_incomplete_completion_list: bool,
-}
diff --git a/support/texlab/src/db/diagnostics.rs b/support/texlab/src/db/diagnostics.rs
deleted file mode 100644
index 6b1a177133..0000000000
--- a/support/texlab/src/db/diagnostics.rs
+++ /dev/null
@@ -1,177 +0,0 @@
-pub mod bib;
-pub mod log;
-pub mod tex;
-
-use lsp_types::{DiagnosticSeverity, NumberOrString, Range};
-use rustc_hash::FxHashMap;
-
-use crate::{db::workspace::Workspace, util, Db};
-
-use super::document::{Document, Language};
-
-#[derive(Debug, PartialEq, Eq, Clone)]
-pub struct Diagnostic {
- pub severity: DiagnosticSeverity,
- pub range: Range,
- pub code: DiagnosticCode,
- pub message: String,
-}
-
-#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone, Hash)]
-pub enum DiagnosticCode {
- Tex(TexCode),
- Bib(BibCode),
- Log(Document),
- Chktex(String),
-}
-
-#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone, Copy, Hash)]
-pub enum TexCode {
- UnexpectedRCurly,
- RCurlyInserted,
- MismatchedEnvironment,
-}
-
-impl From<TexCode> for String {
- fn from(code: TexCode) -> Self {
- match code {
- TexCode::UnexpectedRCurly => "Unexpected \"}\"".to_string(),
- TexCode::RCurlyInserted => "Missing \"}\" inserted".to_string(),
- TexCode::MismatchedEnvironment => "Mismatched environment".to_string(),
- }
- }
-}
-
-impl From<TexCode> for NumberOrString {
- fn from(code: TexCode) -> Self {
- match code {
- TexCode::UnexpectedRCurly => NumberOrString::Number(1),
- TexCode::RCurlyInserted => NumberOrString::Number(2),
- TexCode::MismatchedEnvironment => NumberOrString::Number(3),
- }
- }
-}
-
-#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone, Copy, Hash)]
-#[allow(clippy::enum_variant_names)]
-pub enum BibCode {
- ExpectingLCurly,
- ExpectingKey,
- ExpectingRCurly,
- ExpectingEq,
- ExpectingFieldValue,
-}
-
-impl From<BibCode> for String {
- fn from(code: BibCode) -> Self {
- match code {
- BibCode::ExpectingLCurly => "Expecting a curly bracket: \"{\"".to_string(),
- BibCode::ExpectingKey => "Expecting a key".to_string(),
- BibCode::ExpectingRCurly => "Expecting a curly bracket: \"}\"".to_string(),
- BibCode::ExpectingEq => "Expecting an equality sign: \"=\"".to_string(),
- BibCode::ExpectingFieldValue => "Expecting a field value".to_string(),
- }
- }
-}
-
-impl From<BibCode> for NumberOrString {
- fn from(code: BibCode) -> Self {
- match code {
- BibCode::ExpectingLCurly => NumberOrString::Number(4),
- BibCode::ExpectingKey => NumberOrString::Number(5),
- BibCode::ExpectingRCurly => NumberOrString::Number(6),
- BibCode::ExpectingEq => NumberOrString::Number(7),
- BibCode::ExpectingFieldValue => NumberOrString::Number(8),
- }
- }
-}
-
-#[salsa::tracked(return_ref)]
-pub fn collect(db: &dyn Db, workspace: Workspace) -> FxHashMap<Document, Vec<Diagnostic>> {
- let mut results: FxHashMap<Document, Vec<Diagnostic>> = FxHashMap::default();
-
- for document in workspace.documents(db).iter().copied() {
- match document.language(db) {
- Language::Tex => {
- results.entry(document).or_default().extend(
- tex::collect(db, document)
- .iter()
- .chain(document.linter(db).chktex(db))
- .cloned(),
- );
- }
- Language::Bib => {
- results
- .entry(document)
- .or_default()
- .extend(bib::collect(db, document).iter().cloned());
- }
- Language::Log => {
- log::collect(db, workspace, document)
- .iter()
- .for_each(|(document, diagnostics)| {
- results
- .entry(*document)
- .or_default()
- .extend(diagnostics.clone());
- });
- }
- Language::TexlabRoot | Language::Tectonic => {}
- }
- }
-
- results
-}
-
-#[salsa::tracked]
-pub fn collect_filtered(
- db: &dyn Db,
- workspace: Workspace,
-) -> FxHashMap<Document, Vec<lsp_types::Diagnostic>> {
- let all_diagnostics = collect(db, workspace);
- let mut all_filtered: FxHashMap<Document, Vec<lsp_types::Diagnostic>> = FxHashMap::default();
-
- let config = &db.config().diagnostics;
- for document in workspace.documents(db) {
- let mut filtered = Vec::new();
- if !matches!(document.language(db), Language::Tex | Language::Bib) {
- continue;
- }
-
- if let Some(diagnostics) = all_diagnostics.get(document) {
- for diagnostic in diagnostics.iter().filter(|diag| {
- util::regex_filter::filter(
- &diag.message,
- &config.allowed_patterns,
- &config.ignored_patterns,
- )
- }) {
- let source = match diagnostic.code {
- DiagnosticCode::Tex(_) | DiagnosticCode::Bib(_) => "texlab",
- DiagnosticCode::Log(_) => "latex-build",
- DiagnosticCode::Chktex(_) => "chktex",
- };
-
- let code = match diagnostic.code.clone() {
- DiagnosticCode::Tex(code) => Some(code.into()),
- DiagnosticCode::Bib(code) => Some(code.into()),
- DiagnosticCode::Chktex(code) => Some(NumberOrString::String(code)),
- DiagnosticCode::Log(_) => None,
- };
-
- filtered.push(lsp_types::Diagnostic {
- range: diagnostic.range,
- code,
- severity: Some(diagnostic.severity),
- message: diagnostic.message.clone(),
- source: Some(source.to_string()),
- ..Default::default()
- });
- }
- }
-
- all_filtered.insert(*document, filtered);
- }
-
- all_filtered
-}
diff --git a/support/texlab/src/db/diagnostics/bib.rs b/support/texlab/src/db/diagnostics/bib.rs
deleted file mode 100644
index 4f5dfc55a1..0000000000
--- a/support/texlab/src/db/diagnostics/bib.rs
+++ /dev/null
@@ -1,112 +0,0 @@
-use lsp_types::DiagnosticSeverity;
-use rowan::{ast::AstNode, TextRange};
-
-use crate::{
- db::document::Document,
- syntax::bibtex::{self, HasDelims, HasEq, HasName, HasType, HasValue},
- util::line_index_ext::LineIndexExt,
- Db,
-};
-
-use super::{BibCode, Diagnostic, DiagnosticCode};
-
-#[salsa::tracked(return_ref)]
-pub fn collect(db: &dyn Db, document: Document) -> Vec<Diagnostic> {
- let mut results = Vec::new();
- let data = match document.parse(db).as_bib() {
- Some(data) => data,
- None => return results,
- };
-
- for node in data.root(db).descendants() {
- analyze_entry(db, document, node.clone(), &mut results)
- .or_else(|| analyze_field(db, document, node, &mut results));
- }
-
- results
-}
-
-fn analyze_entry(
- db: &dyn Db,
- document: Document,
- node: bibtex::SyntaxNode,
- results: &mut Vec<Diagnostic>,
-) -> Option<()> {
- let line_index = document.line_index(db);
-
- let entry = bibtex::Entry::cast(node)?;
- if entry.left_delim_token().is_none() {
- let code = BibCode::ExpectingLCurly;
- results.push(Diagnostic {
- severity: DiagnosticSeverity::ERROR,
- range: line_index.line_col_lsp_range(entry.type_token()?.text_range()),
- code: DiagnosticCode::Bib(code),
- message: String::from(code),
- });
-
- return Some(());
- }
-
- if entry.name_token().is_none() {
- let code = BibCode::ExpectingKey;
- results.push(Diagnostic {
- severity: DiagnosticSeverity::ERROR,
- range: line_index.line_col_lsp_range(entry.left_delim_token()?.text_range()),
- code: DiagnosticCode::Bib(code),
- message: String::from(code),
- });
-
- return Some(());
- }
-
- if entry.right_delim_token().is_none() {
- let code = BibCode::ExpectingRCurly;
- results.push(Diagnostic {
- severity: DiagnosticSeverity::ERROR,
- range: line_index
- .line_col_lsp_range(TextRange::empty(entry.syntax().text_range().end())),
- code: DiagnosticCode::Bib(code),
- message: String::from(code),
- });
-
- return Some(());
- }
-
- Some(())
-}
-
-fn analyze_field(
- db: &dyn Db,
- document: Document,
- node: bibtex::SyntaxNode,
- results: &mut Vec<Diagnostic>,
-) -> Option<()> {
- let line_index = document.line_index(db);
-
- let field = bibtex::Field::cast(node)?;
- if field.eq_token().is_none() {
- let code = BibCode::ExpectingEq;
- results.push(Diagnostic {
- severity: DiagnosticSeverity::ERROR,
- range: line_index.line_col_lsp_range(field.name_token()?.text_range()),
- code: DiagnosticCode::Bib(code),
- message: String::from(code),
- });
-
- return Some(());
- }
-
- if field.value().is_none() {
- let code = BibCode::ExpectingFieldValue;
- results.push(Diagnostic {
- severity: DiagnosticSeverity::ERROR,
- range: line_index.line_col_lsp_range(field.name_token()?.text_range()),
- code: DiagnosticCode::Bib(code),
- message: String::from(code),
- });
-
- return Some(());
- }
-
- Some(())
-}
diff --git a/support/texlab/src/db/diagnostics/log.rs b/support/texlab/src/db/diagnostics/log.rs
deleted file mode 100644
index 368fd3fdcc..0000000000
--- a/support/texlab/src/db/diagnostics/log.rs
+++ /dev/null
@@ -1,100 +0,0 @@
-use lsp_types::{DiagnosticSeverity, Position, Range, Url};
-use rowan::{TextLen, TextRange, TextSize};
-use rustc_hash::FxHashMap;
-
-use crate::{
- db::{document::Document, workspace::Workspace},
- syntax::{BuildError, BuildErrorLevel},
- util::line_index_ext::LineIndexExt,
- Db,
-};
-
-use super::{Diagnostic, DiagnosticCode};
-
-#[salsa::tracked(return_ref)]
-pub fn collect(
- db: &dyn Db,
- workspace: Workspace,
- log_document: Document,
-) -> FxHashMap<Document, Vec<Diagnostic>> {
- let mut results = FxHashMap::default();
-
- let log = match log_document.parse(db).as_log() {
- Some(data) => data.log(db),
- None => return results,
- };
-
- let root_document = match workspace.parents(db, log_document).iter().next().copied() {
- Some(document) => document,
- None => return results,
- };
-
- let base_path = match root_document
- .location(db)
- .path(db)
- .as_deref()
- .and_then(|path| path.parent())
- {
- Some(path) => path,
- None => return results,
- };
-
- for error in &log.errors {
- let full_path = base_path.join(&error.relative_path);
- let full_path_uri = if let Ok(uri) = Url::from_file_path(&full_path) {
- uri
- } else {
- continue;
- };
-
- let severity = match error.level {
- BuildErrorLevel::Error => DiagnosticSeverity::ERROR,
- BuildErrorLevel::Warning => DiagnosticSeverity::WARNING,
- };
-
- let range = find_range_of_hint(db, workspace, &full_path_uri, error).unwrap_or_else(|| {
- let line = error.line.unwrap_or(0);
- Range::new(Position::new(line, 0), Position::new(line, 0))
- });
-
- let diagnostic = Diagnostic {
- severity,
- range,
- code: DiagnosticCode::Log(log_document),
- message: error.message.clone(),
- };
-
- let tex_document = workspace
- .lookup_uri(db, &full_path_uri)
- .unwrap_or(root_document);
-
- results.entry(tex_document).or_default().push(diagnostic);
- }
-
- results
-}
-
-fn find_range_of_hint(
- db: &dyn Db,
- workspace: Workspace,
- uri: &Url,
- error: &BuildError,
-) -> Option<Range> {
- let document = workspace.lookup_uri(db, uri)?;
- let text = document.text(db);
- let line = error.line? as usize;
- let hint = error.hint.as_deref()?;
- let line_index = document.line_index(db);
-
- let line_start = line_index.newlines.get(line).copied()?;
- let line_end = line_index
- .newlines
- .get(line + 1)
- .copied()
- .unwrap_or(text.text_len());
-
- let line_text = &text[line_start.into()..line_end.into()];
- let hint_start = line_start + TextSize::try_from(line_text.find(hint)?).unwrap();
- let hint_end = hint_start + hint.text_len();
- Some(line_index.line_col_lsp_range(TextRange::new(hint_start, hint_end)))
-}
diff --git a/support/texlab/src/db/diagnostics/tex.rs b/support/texlab/src/db/diagnostics/tex.rs
deleted file mode 100644
index a7b030a5bf..0000000000
--- a/support/texlab/src/db/diagnostics/tex.rs
+++ /dev/null
@@ -1,147 +0,0 @@
-use lsp_types::DiagnosticSeverity;
-use rowan::{ast::AstNode, NodeOrToken, TextRange};
-
-use crate::{db::document::Document, syntax::latex, util::line_index_ext::LineIndexExt, Db};
-
-use super::{Diagnostic, DiagnosticCode, TexCode};
-
-#[salsa::tracked]
-pub fn collect(db: &dyn Db, document: Document) -> Vec<Diagnostic> {
- let mut results = Vec::new();
-
- if !document.location(db).uri(db).as_str().ends_with(".tex") {
- return results;
- }
-
- let data = match document.parse(db).as_tex() {
- Some(data) => data,
- None => return results,
- };
-
- let mut traversal = data.root(db).preorder();
- while let Some(event) = traversal.next() {
- match event {
- rowan::WalkEvent::Enter(node) => {
- if let Some(environment) = latex::Environment::cast(node.clone()) {
- if environment
- .begin()
- .and_then(|begin| begin.name())
- .and_then(|name| name.key())
- .map_or(false, |name| {
- db.config()
- .syntax
- .verbatim_environments
- .contains(&name.to_string())
- })
- {
- traversal.skip_subtree();
- continue;
- }
- }
-
- analyze_environment(db, document, node.clone(), &mut results)
- .or_else(|| analyze_curly_group(db, document, node.clone(), &mut results))
- .or_else(|| analyze_curly_braces(document, db, node, &mut results));
- }
- rowan::WalkEvent::Leave(_) => {
- continue;
- }
- };
- }
-
- results
-}
-
-fn analyze_environment(
- db: &dyn Db,
- document: Document,
- node: latex::SyntaxNode,
- results: &mut Vec<Diagnostic>,
-) -> Option<()> {
- let environment = latex::Environment::cast(node)?;
- let name1 = environment.begin()?.name()?.key()?;
- let name2 = environment.end()?.name()?.key()?;
- if name1 != name2 {
- let code = TexCode::MismatchedEnvironment;
- results.push(Diagnostic {
- severity: DiagnosticSeverity::ERROR,
- range: document
- .line_index(db)
- .line_col_lsp_range(latex::small_range(&name1)),
- code: DiagnosticCode::Tex(code),
- message: String::from(code),
- });
- }
-
- Some(())
-}
-
-fn analyze_curly_group(
- db: &dyn Db,
- document: Document,
- node: latex::SyntaxNode,
- results: &mut Vec<Diagnostic>,
-) -> Option<()> {
- if !matches!(
- node.kind(),
- latex::CURLY_GROUP
- | latex::CURLY_GROUP_COMMAND
- | latex::CURLY_GROUP_KEY_VALUE
- | latex::CURLY_GROUP_WORD
- | latex::CURLY_GROUP_WORD_LIST
- ) {
- return None;
- }
-
- let is_inside_verbatim_environment = node
- .ancestors()
- .filter_map(latex::Environment::cast)
- .filter_map(|env| env.begin())
- .filter_map(|begin| begin.name())
- .filter_map(|name| name.key())
- .any(|name| {
- ["asy", "lstlisting", "minted", "verbatim"].contains(&name.to_string().as_str())
- });
-
- if !is_inside_verbatim_environment
- && !node
- .children_with_tokens()
- .filter_map(NodeOrToken::into_token)
- .any(|token| token.kind() == latex::R_CURLY)
- {
- let code = TexCode::RCurlyInserted;
- results.push(Diagnostic {
- severity: DiagnosticSeverity::ERROR,
- range: document
- .line_index(db)
- .line_col_lsp_range(TextRange::empty(node.text_range().end())),
- code: DiagnosticCode::Tex(code),
- message: String::from(code),
- });
- }
-
- Some(())
-}
-
-fn analyze_curly_braces(
- document: Document,
- db: &dyn Db,
- node: rowan::SyntaxNode<latex::LatexLanguage>,
- results: &mut Vec<Diagnostic>,
-) -> Option<()> {
- if node.kind() == latex::ERROR && node.first_token()?.text() == "}" {
- let code = TexCode::UnexpectedRCurly;
- results.push(Diagnostic {
- severity: DiagnosticSeverity::ERROR,
- range: document
- .line_index(db)
- .line_col_lsp_range(node.text_range()),
- code: DiagnosticCode::Tex(code),
- message: String::from(code),
- });
-
- Some(())
- } else {
- None
- }
-}
diff --git a/support/texlab/src/db/discovery.rs b/support/texlab/src/db/discovery.rs
deleted file mode 100644
index 9cc5a4e807..0000000000
--- a/support/texlab/src/db/discovery.rs
+++ /dev/null
@@ -1,258 +0,0 @@
-use std::path::Path;
-
-use itertools::Itertools;
-use lsp_types::Url;
-use rustc_hash::FxHashSet;
-
-use crate::{util::HOME_DIR, Db};
-
-use super::{
- analysis::TexLink,
- document::{Document, Language, Location, Owner},
- workspace::Workspace,
-};
-
-#[salsa::accumulator]
-pub struct MissingDependencies(MissingDependency);
-
-#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone, Copy, Hash)]
-pub struct MissingDependency {
- pub location: Location,
-}
-
-#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone, Copy, Hash)]
-pub struct Dependency {
- pub source: Document,
- pub target: Document,
- pub origin: Option<DependencyOrigin>,
-}
-
-#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone, Copy, Hash)]
-pub struct DependencyOrigin {
- pub link: TexLink,
- pub old_base_dir: Location,
- pub new_base_dir: Location,
-}
-
-pub fn hidden_dependencies(
- db: &dyn Db,
- document: Document,
- base_dir: Location,
- dependencies: &mut Vec<Dependency>,
-) {
- let uri = document.location(db).uri(db).as_str();
- if document.language(db) == Language::Tex && !uri.ends_with(".aux") {
- dependencies.extend(hidden_dependency(db, document, base_dir, "log"));
- dependencies.extend(hidden_dependency(db, document, base_dir, "aux"));
- }
-}
-
-#[salsa::tracked]
-pub fn hidden_dependency(
- db: &dyn Db,
- source: Document,
- base_dir: Location,
- extension: &'static str,
-) -> Option<Dependency> {
- let workspace = Workspace::get(db);
-
- let stem = source.location(db).stem(db)?;
- let name = format!("{stem}.{extension}");
-
- let location = workspace.output_dir(db, base_dir).join(db, &name)?;
- match workspace.lookup(db, location) {
- Some(target) => Some(Dependency {
- source,
- target,
- origin: None,
- }),
- None => {
- MissingDependencies::push(db, MissingDependency { location });
- None
- }
- }
-}
-
-pub fn source_dependencies<'db>(
- db: &'db dyn Db,
- source: Document,
- base_dir: Location,
-) -> impl Iterator<Item = Dependency> + 'db {
- source
- .parse(db)
- .as_tex()
- .into_iter()
- .flat_map(|data| data.analyze(db).links(db))
- .filter_map(move |link| source_dependency(db, source, base_dir, *link))
-}
-
-#[salsa::tracked]
-pub fn source_dependency(
- db: &dyn Db,
- source: Document,
- base_dir: Location,
- link: TexLink,
-) -> Option<Dependency> {
- let workspace = Workspace::get(db);
-
- let stem = link.path(db).text(db);
-
- let mut file_names = vec![stem.clone()];
- link.kind(db)
- .extensions()
- .iter()
- .map(|ext| format!("{stem}.{ext}"))
- .for_each(|name| file_names.push(name));
-
- let file_name_db = workspace.file_name_db(db);
- let distro_files = file_names
- .iter()
- .filter_map(|name| file_name_db.get(name))
- .filter(|path| {
- HOME_DIR
- .as_deref()
- .map_or(false, |dir| path.starts_with(dir))
- })
- .flat_map(Url::from_file_path)
- .map(|uri| Location::new(db, uri));
-
- for location in file_names
- .iter()
- .filter_map(|file_name| base_dir.join(db, file_name))
- .chain(distro_files)
- {
- match workspace.lookup(db, location) {
- Some(target) => {
- let origin = Some(DependencyOrigin {
- link,
- old_base_dir: base_dir,
- new_base_dir: link
- .base_dir(db)
- .and_then(|path| base_dir.join(db, path.text(db)))
- .unwrap_or(base_dir),
- });
-
- return Some(Dependency {
- source,
- target,
- origin,
- });
- }
- None => {
- MissingDependencies::push(db, MissingDependency { location });
- }
- };
- }
-
- None
-}
-
-#[derive(Debug, PartialEq, Eq, Clone, Hash)]
-pub struct DependencyGraph {
- pub start: Document,
- pub edges: Vec<Dependency>,
-}
-
-impl DependencyGraph {
- pub fn preorder(&self) -> impl DoubleEndedIterator<Item = Document> + '_ {
- std::iter::once(self.start)
- .chain(self.edges.iter().map(|group| group.target))
- .unique()
- }
-}
-
-#[salsa::tracked(return_ref)]
-pub fn dependency_graph(db: &dyn Db, start: Document) -> DependencyGraph {
- let workspace = Workspace::get(db);
-
- let base_dir = workspace.working_dir(db, start.directory(db));
- let mut edges = Vec::new();
- let mut stack = vec![(start, base_dir)];
- let mut visited = FxHashSet::default();
-
- while let Some((source, base_dir)) = stack.pop() {
- for edge in source_dependencies(db, source, base_dir) {
- edges.push(edge);
- if visited.insert(edge.target) {
- stack.push((edge.target, edge.origin.unwrap().new_base_dir));
- }
- }
-
- hidden_dependencies(db, source, base_dir, &mut edges);
- }
-
- DependencyGraph { start, edges }
-}
-
-pub fn discover_dependencies(db: &mut dyn Db) {
- let workspace = Workspace::get(db);
- loop {
- let mut changed = discover_parents(db, workspace);
-
- let paths: FxHashSet<_> = workspace
- .documents(db)
- .iter()
- .flat_map(|&start| dependency_graph::accumulated::<MissingDependencies>(db, start))
- .filter_map(|link| link.location.path(db).as_deref())
- .filter(|path| path.is_file())
- .map(Path::to_path_buf)
- .collect();
-
- for path in paths {
- if workspace.lookup_path(db, &path).is_none() {
- let language = Language::from_path(&path).unwrap_or(Language::Tex);
- changed |= workspace.load(db, &path, language, Owner::Server).is_some();
- }
- }
-
- if !changed {
- break;
- }
- }
-}
-
-fn discover_parents(db: &mut dyn Db, workspace: Workspace) -> bool {
- let mut changed = false;
-
- let dirs: FxHashSet<_> = workspace
- .documents(db)
- .iter()
- .flat_map(|document| document.ancestor_dirs(db))
- .filter(|path| is_part_of_workspace(db, workspace, path))
- .map(Path::to_path_buf)
- .collect();
-
- for path in dirs
- .iter()
- .flat_map(std::fs::read_dir)
- .flatten()
- .flatten()
- .filter(|entry| entry.file_type().map_or(false, |ty| ty.is_file()))
- .map(|entry| entry.path())
- {
- if let Some(language) = Language::from_path(&path) {
- let can_be_parent = matches!(
- language,
- Language::Tex | Language::TexlabRoot | Language::Tectonic
- );
-
- if can_be_parent && workspace.lookup_path(db, &path).is_none() {
- changed |= workspace.load(db, &path, language, Owner::Server).is_some();
- }
- }
- }
-
- changed
-}
-
-fn is_part_of_workspace(db: &dyn Db, workspace: Workspace, path: &Path) -> bool {
- let root_dirs = workspace.root_dirs(db);
- if root_dirs.is_empty() {
- return true;
- }
-
- root_dirs
- .iter()
- .filter_map(|dir| dir.path(db).as_deref())
- .any(|dir| path.starts_with(dir))
-}
diff --git a/support/texlab/src/db/document.rs b/support/texlab/src/db/document.rs
deleted file mode 100644
index 40d0ab025f..0000000000
--- a/support/texlab/src/db/document.rs
+++ /dev/null
@@ -1,199 +0,0 @@
-use std::path::{Path, PathBuf};
-
-use lsp_types::Url;
-use rowan::{TextRange, TextSize};
-
-use crate::{
- db::{
- diagnostics::Diagnostic,
- parse::{BibDocumentData, LogDocumentData, TectonicData, TexDocumentData, TexlabRootData},
- },
- parser::{parse_bibtex, parse_build_log, parse_latex},
- util::line_index::LineIndex,
- Db,
-};
-
-use super::{
- analysis::TexLinkKind,
- parse::{self, DocumentData},
-};
-
-#[salsa::interned]
-pub struct Location {
- #[return_ref]
- pub uri: Url,
-}
-
-#[salsa::tracked]
-impl Location {
- #[salsa::tracked(return_ref)]
- pub fn path(self, db: &dyn Db) -> Option<PathBuf> {
- let uri = self.uri(db);
- if uri.scheme() == "file" {
- uri.to_file_path().ok()
- } else {
- None
- }
- }
-
- pub fn stem(self, db: &dyn Db) -> Option<String> {
- let path = self.uri(db).to_file_path().ok()?;
- let stem = path.file_stem()?.to_str()?;
- Some(String::from(stem))
- }
-
- pub fn join(self, db: &dyn Db, path: &str) -> Option<Location> {
- let uri = self.uri(db).join(path).ok()?;
- Some(Location::new(db, uri))
- }
-}
-
-#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone, Copy, Hash)]
-pub enum Owner {
- Client,
- Server,
-}
-
-#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone, Copy, Hash)]
-pub enum Language {
- Tex,
- Bib,
- Log,
- TexlabRoot,
- Tectonic,
-}
-
-impl Language {
- pub fn from_path(path: &Path) -> Option<Self> {
- let name = path.file_name()?;
- if name.eq_ignore_ascii_case(".texlabroot") || name.eq_ignore_ascii_case("texlabroot") {
- return Some(Self::TexlabRoot);
- }
-
- if name.eq_ignore_ascii_case("Tectonic.toml") {
- return Some(Self::Tectonic);
- }
-
- let extname = path.extension()?.to_str()?;
- match extname.to_lowercase().as_str() {
- "tex" | "sty" | "cls" | "def" | "lco" | "aux" | "rnw" => Some(Self::Tex),
- "bib" | "bibtex" => Some(Self::Bib),
- "log" => Some(Self::Log),
- _ => None,
- }
- }
-
- pub fn from_id(id: &str) -> Option<Self> {
- match id {
- "tex" | "latex" => Some(Self::Tex),
- "bib" | "bibtex" => Some(Self::Bib),
- "texlabroot" => Some(Self::TexlabRoot),
- _ => None,
- }
- }
-}
-
-#[salsa::input]
-pub struct LinterData {
- #[return_ref]
- pub chktex: Vec<Diagnostic>,
-}
-
-#[salsa::input]
-pub struct Document {
- /// An object containing the URI of the document.
- pub location: Location,
-
- /// The source code.
- #[return_ref]
- pub text: String,
-
- /// The programming language.
- pub language: Language,
-
- /// The program (either server or client) which opened the document.
- pub owner: Owner,
-
- /// An estimate of the current cursor position.
- pub cursor: TextSize,
-
- /// The diagnostics reported from external linters such as ChkTeX.
- pub linter: LinterData,
-}
-
-impl Document {
- pub fn edit(self, db: &mut dyn Db, range: TextRange, replace_with: &str) {
- let mut text = self.set_text(db).to(String::new());
- text.replace_range(std::ops::Range::<usize>::from(range), replace_with);
- self.set_text(db).to(text);
- self.set_cursor(db).to(range.start());
- }
-
- pub fn directory(self, db: &dyn Db) -> Location {
- self.location(db).join(db, ".").unwrap()
- }
-
- pub fn ancestor_dirs<'db>(self, db: &'db dyn Db) -> impl Iterator<Item = &'db Path> + 'db {
- self.location(db)
- .path(db)
- .as_deref()
- .into_iter()
- .flat_map(|path| path.ancestors())
- .skip(1)
- }
-}
-
-#[salsa::tracked]
-impl Document {
- #[salsa::tracked]
- pub fn parse(self, db: &dyn Db) -> DocumentData {
- let text = self.text(db);
- match self.language(db) {
- Language::Tex => {
- let data = TexDocumentData::new(db, parse_latex(text));
- parse::DocumentData::Tex(data)
- }
- Language::Bib => {
- let data = BibDocumentData::new(db, parse_bibtex(text));
- DocumentData::Bib(data)
- }
- Language::Log => {
- let data = LogDocumentData::new(db, parse_build_log(text));
- DocumentData::Log(data)
- }
- Language::TexlabRoot => {
- let data = TexlabRootData;
- DocumentData::TexlabRoot(data)
- }
- Language::Tectonic => {
- let data = TectonicData;
- DocumentData::Tectonic(data)
- }
- }
- }
-
- #[salsa::tracked]
- pub fn can_be_root(self, db: &dyn Db) -> bool {
- self.parse(db).as_tex().map_or(false, |data| {
- let analysis = data.analyze(db);
- analysis.has_document_environment(db)
- && !analysis
- .links(db)
- .iter()
- .filter(|link| link.kind(db) == TexLinkKind::Cls)
- .any(|link| link.path(db).text(db) == "subfiles")
- })
- }
-
- #[salsa::tracked]
- pub fn can_be_built(self, db: &dyn Db) -> bool {
- self.parse(db)
- .as_tex()
- .map_or(false, |data| data.analyze(db).has_document_environment(db))
- }
-
- #[salsa::tracked(return_ref)]
- pub fn line_index(self, db: &dyn Db) -> LineIndex {
- LineIndex::new(self.text(db))
- }
-}
diff --git a/support/texlab/src/db/parse.rs b/support/texlab/src/db/parse.rs
deleted file mode 100644
index 7187135d52..0000000000
--- a/support/texlab/src/db/parse.rs
+++ /dev/null
@@ -1,79 +0,0 @@
-use crate::{
- db::analysis::TexAnalysis,
- syntax::{bibtex, latex, BuildLog},
- Db,
-};
-
-#[salsa::interned]
-pub struct TexDocumentData {
- pub green: rowan::GreenNode,
-}
-
-impl TexDocumentData {
- pub fn root(self, db: &dyn Db) -> latex::SyntaxNode {
- latex::SyntaxNode::new_root(self.green(db))
- }
-}
-
-#[salsa::tracked]
-impl TexDocumentData {
- #[salsa::tracked]
- pub fn analyze(self, db: &dyn Db) -> TexAnalysis {
- let root = latex::SyntaxNode::new_root(self.green(db));
- TexAnalysis::analyze(db, &root)
- }
-}
-
-#[salsa::interned]
-pub struct BibDocumentData {
- pub green: rowan::GreenNode,
-}
-
-impl BibDocumentData {
- pub fn root(self, db: &dyn Db) -> bibtex::SyntaxNode {
- bibtex::SyntaxNode::new_root(self.green(db))
- }
-}
-
-#[salsa::interned]
-pub struct LogDocumentData {
- pub log: BuildLog,
-}
-
-#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone, Copy, Hash)]
-pub struct TexlabRootData;
-
-#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone, Copy, Hash)]
-pub struct TectonicData;
-
-#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone, Copy, Hash)]
-pub enum DocumentData {
- Tex(TexDocumentData),
- Bib(BibDocumentData),
- Log(LogDocumentData),
- TexlabRoot(TexlabRootData),
- Tectonic(TectonicData),
-}
-
-impl DocumentData {
- pub fn as_tex(self) -> Option<TexDocumentData> {
- match self {
- Self::Tex(data) => Some(data),
- _ => None,
- }
- }
-
- pub fn as_bib(self) -> Option<BibDocumentData> {
- match self {
- Self::Bib(data) => Some(data),
- _ => None,
- }
- }
-
- pub fn as_log(self) -> Option<LogDocumentData> {
- match self {
- Self::Log(data) => Some(data),
- _ => None,
- }
- }
-}
diff --git a/support/texlab/src/db/workspace.rs b/support/texlab/src/db/workspace.rs
deleted file mode 100644
index 67c99792a2..0000000000
--- a/support/texlab/src/db/workspace.rs
+++ /dev/null
@@ -1,211 +0,0 @@
-use std::{
- borrow::Cow,
- path::{Path, PathBuf},
-};
-
-use itertools::Itertools;
-use lsp_types::{ClientCapabilities, Url};
-use rowan::TextSize;
-use rustc_hash::FxHashSet;
-
-use crate::{
- db::document::{Document, Location},
- distro::FileNameDB,
- Db,
-};
-
-use super::{
- dependency_graph,
- document::{Language, LinterData, Owner},
- Word,
-};
-
-#[salsa::input(singleton)]
-pub struct Workspace {
- #[return_ref]
- pub documents: FxHashSet<Document>,
-
- #[return_ref]
- pub client_capabilities: ClientCapabilities,
-
- #[return_ref]
- pub root_dirs: Vec<Location>,
-
- #[return_ref]
- pub file_name_db: FileNameDB,
-}
-
-impl Workspace {
- pub fn lookup(self, db: &dyn Db, location: Location) -> Option<Document> {
- self.documents(db)
- .iter()
- .find(|document| document.location(db) == location)
- .copied()
- }
-
- pub fn lookup_uri(self, db: &dyn Db, uri: &Url) -> Option<Document> {
- self.documents(db)
- .iter()
- .find(|document| document.location(db).uri(db) == uri)
- .copied()
- }
-
- pub fn lookup_path(self, db: &dyn Db, path: &Path) -> Option<Document> {
- self.documents(db)
- .iter()
- .find(|document| document.location(db).path(db).as_deref() == Some(path))
- .copied()
- }
-
- pub fn index_files<'db>(self, db: &'db dyn Db) -> impl Iterator<Item = Document> + 'db {
- self.documents(db)
- .iter()
- .copied()
- .filter(|&document| document.can_be_root(db))
- }
-
- pub fn open(
- self,
- db: &mut dyn Db,
- uri: Url,
- text: String,
- language: Language,
- owner: Owner,
- ) -> Document {
- let location = Location::new(db, uri);
- let cursor = TextSize::from(0);
- match self.lookup(db, location) {
- Some(document) => {
- document.set_text(db).to(text);
- document.set_language(db).to(language);
- document.set_owner(db).to(owner);
- document.set_cursor(db).to(cursor);
- document
- }
- None => {
- let document = Document::new(
- db,
- location,
- text,
- language,
- owner,
- cursor,
- LinterData::new(db, Vec::new()),
- );
-
- let mut documents = self.set_documents(db).to(FxHashSet::default());
- documents.insert(document);
- self.set_documents(db).to(documents);
- document
- }
- }
- }
-
- pub fn load(
- self,
- db: &mut dyn Db,
- path: &Path,
- language: Language,
- owner: Owner,
- ) -> Option<Document> {
- log::debug!("Loading document {} from disk...", path.display());
-
- let uri = Url::from_file_path(path).ok()?;
- let data = std::fs::read(path).ok()?;
- let text = match String::from_utf8_lossy(&data) {
- Cow::Borrowed(_) => unsafe { String::from_utf8_unchecked(data) },
- Cow::Owned(text) => text,
- };
-
- Some(self.open(db, uri, text, language, owner))
- }
-
- pub fn watch(
- self,
- db: &dyn Db,
- watcher: &mut dyn notify::Watcher,
- watched_dirs: &mut FxHashSet<PathBuf>,
- ) {
- let output_dirs = self
- .documents(db)
- .iter()
- .map(|document| self.working_dir(db, document.directory(db)))
- .map(|base_dir| self.output_dir(db, base_dir))
- .filter_map(|location| location.path(db).as_deref());
-
- self.documents(db)
- .iter()
- .map(|document| document.location(db))
- .filter_map(|location| location.path(db).as_deref())
- .filter_map(|path| path.parent())
- .chain(output_dirs)
- .filter(|path| watched_dirs.insert(path.to_path_buf()))
- .for_each(|path| {
- let _ = watcher.watch(path, notify::RecursiveMode::NonRecursive);
- });
- }
-}
-
-#[salsa::tracked]
-impl Workspace {
- #[salsa::tracked]
- pub fn working_dir(self, db: &dyn Db, base_dir: Location) -> Location {
- if let Some(dir) = db
- .config()
- .root_dir
- .as_ref()
- .and_then(|path| base_dir.join(db, path))
- {
- return dir;
- }
-
- self.documents(db)
- .iter()
- .filter(|doc| matches!(doc.language(db), Language::TexlabRoot | Language::Tectonic))
- .filter_map(|doc| doc.location(db).join(db, "."))
- .find(|root_dir| {
- base_dir
- .uri(db)
- .as_str()
- .starts_with(root_dir.uri(db).as_str())
- })
- .unwrap_or(base_dir)
- }
-
- #[salsa::tracked]
- pub fn output_dir(self, db: &dyn Db, base_dir: Location) -> Location {
- let mut path = db.config().build.output_dir.clone();
- if !path.ends_with('/') {
- path.push('/');
- }
-
- base_dir.join(db, &path).unwrap_or(base_dir)
- }
-
- #[salsa::tracked(return_ref)]
- pub fn parents(self, db: &dyn Db, child: Document) -> Vec<Document> {
- self.index_files(db)
- .filter(|&parent| dependency_graph(db, parent).preorder().contains(&child))
- .collect()
- }
-
- #[salsa::tracked(return_ref)]
- pub fn related(self, db: &dyn Db, child: Document) -> FxHashSet<Document> {
- self.index_files(db)
- .chain(self.documents(db).iter().copied())
- .map(|start| dependency_graph(db, start).preorder().collect_vec())
- .filter(|project| project.contains(&child))
- .flatten()
- .collect()
- }
-
- #[salsa::tracked]
- pub fn number_of_label(self, db: &dyn Db, child: Document, name: Word) -> Option<Word> {
- self.related(db, child)
- .iter()
- .filter_map(|document| document.parse(db).as_tex())
- .flat_map(|data| data.analyze(db).label_numbers(db))
- .find(|number| number.name(db) == name)
- .map(|number| number.text(db))
- }
-}
diff --git a/support/texlab/src/features/completion/acronym_ref.rs b/support/texlab/src/features/completion/acronym_ref.rs
deleted file mode 100644
index be7725fa2f..0000000000
--- a/support/texlab/src/features/completion/acronym_ref.rs
+++ /dev/null
@@ -1,29 +0,0 @@
-use rowan::ast::AstNode;
-
-use crate::{syntax::latex, util::cursor::CursorContext};
-
-use super::builder::CompletionBuilder;
-
-pub fn complete<'db>(
- context: &'db CursorContext,
- builder: &mut CompletionBuilder<'db>,
-) -> Option<()> {
- let (_, range, group) = context.find_curly_group_word()?;
- latex::AcronymReference::cast(group.syntax().parent()?)?;
-
- for document in context.related() {
- if let Some(data) = document.parse(context.db).as_tex() {
- for name in data
- .root(context.db)
- .descendants()
- .filter_map(latex::AcronymDefinition::cast)
- .filter_map(|node| node.name())
- .filter_map(|name| name.key())
- {
- builder.glossary_entry(range, name.to_string());
- }
- }
- }
-
- Some(())
-}
diff --git a/support/texlab/src/features/completion/glossary_ref.rs b/support/texlab/src/features/completion/glossary_ref.rs
deleted file mode 100644
index 34d53bf24d..0000000000
--- a/support/texlab/src/features/completion/glossary_ref.rs
+++ /dev/null
@@ -1,35 +0,0 @@
-use rowan::ast::AstNode;
-
-use crate::{syntax::latex, util::cursor::CursorContext};
-
-use super::builder::CompletionBuilder;
-
-pub fn complete<'db>(
- context: &'db CursorContext,
- builder: &mut CompletionBuilder<'db>,
-) -> Option<()> {
- let (_, range, group) = context.find_curly_group_word()?;
- latex::GlossaryEntryReference::cast(group.syntax().parent()?)?;
-
- for document in context.related() {
- if let Some(data) = document.parse(context.db).as_tex() {
- for node in data.root(context.db).descendants() {
- if let Some(name) = latex::GlossaryEntryDefinition::cast(node.clone())
- .and_then(|entry| entry.name())
- .and_then(|name| name.key())
- .map(|name| name.to_string())
- {
- builder.glossary_entry(range, name);
- } else if let Some(name) = latex::AcronymDefinition::cast(node)
- .and_then(|entry| entry.name())
- .and_then(|name| name.key())
- .map(|name| name.to_string())
- {
- builder.glossary_entry(range, name);
- }
- }
- }
- }
-
- Some(())
-}
diff --git a/support/texlab/src/features/completion/label.rs b/support/texlab/src/features/completion/label.rs
deleted file mode 100644
index ae3e010b0e..0000000000
--- a/support/texlab/src/features/completion/label.rs
+++ /dev/null
@@ -1,79 +0,0 @@
-use rowan::{ast::AstNode, TextRange};
-
-use crate::{
- syntax::latex,
- util::{self, cursor::CursorContext, label::LabeledObject, lsp_enums::Structure},
-};
-
-use super::builder::CompletionBuilder;
-
-pub fn complete<'db>(
- context: &'db CursorContext,
- builder: &mut CompletionBuilder<'db>,
-) -> Option<()> {
- let (range, is_math) = find_reference(context).or_else(|| find_reference_range(context))?;
-
- let db = context.db;
- for document in context.related() {
- if let Some(data) = document.parse(db).as_tex() {
- for label in data
- .analyze(db)
- .labels(db)
- .iter()
- .filter(|label| label.origin(db).as_definition().is_some())
- {
- match util::label::render(db, document, *label) {
- Some(rendered_label) => {
- let kind = match &rendered_label.object {
- LabeledObject::Section { .. } => Structure::Section,
- LabeledObject::Float { .. } => Structure::Float,
- LabeledObject::Theorem { .. } => Structure::Theorem,
- LabeledObject::Equation => Structure::Equation,
- LabeledObject::EnumItem => Structure::Item,
- };
-
- if is_math && kind != Structure::Equation {
- continue;
- }
-
- let header = rendered_label.detail(db);
- let footer = match &rendered_label.object {
- LabeledObject::Float { caption, .. } => Some(caption.clone()),
- _ => None,
- };
-
- let text = format!(
- "{} {}",
- label.name(db).text(db),
- rendered_label.reference(db)
- );
-
- builder.label(range, label.name(db).text(db), kind, header, footer, text);
- }
- None => {
- let kind = Structure::Label;
- let header = None;
- let footer = None;
- let text = label.name(db).text(db).clone();
- builder.label(range, label.name(db).text(db), kind, header, footer, text);
- }
- }
- }
- }
- }
-
- Some(())
-}
-
-fn find_reference(context: &CursorContext) -> Option<(TextRange, bool)> {
- let (_, range, group) = context.find_curly_group_word_list()?;
- let reference = latex::LabelReference::cast(group.syntax().parent()?)?;
- let is_math = reference.command()?.text() == "\\eqref";
- Some((range, is_math))
-}
-
-fn find_reference_range(context: &CursorContext) -> Option<(TextRange, bool)> {
- let (_, range, group) = context.find_curly_group_word()?;
- latex::LabelReferenceRange::cast(group.syntax().parent()?)?;
- Some((range, false))
-}
diff --git a/support/texlab/src/features/completion/theorem.rs b/support/texlab/src/features/completion/theorem.rs
deleted file mode 100644
index cd0dfe3a84..0000000000
--- a/support/texlab/src/features/completion/theorem.rs
+++ /dev/null
@@ -1,21 +0,0 @@
-use crate::util::cursor::CursorContext;
-
-use super::builder::CompletionBuilder;
-
-pub fn complete<'db>(
- context: &'db CursorContext,
- builder: &mut CompletionBuilder<'db>,
-) -> Option<()> {
- let (_, range) = context.find_environment_name()?;
-
- let db = context.db;
- for document in context.related() {
- if let Some(data) = document.parse(db).as_tex() {
- for environment in data.analyze(db).theorem_environments(db) {
- builder.user_environment(range, environment.name(db).text(db));
- }
- }
- }
-
- Some(())
-}
diff --git a/support/texlab/src/features/completion/user_command.rs b/support/texlab/src/features/completion/user_command.rs
deleted file mode 100644
index 14c2222701..0000000000
--- a/support/texlab/src/features/completion/user_command.rs
+++ /dev/null
@@ -1,30 +0,0 @@
-use crate::util::cursor::CursorContext;
-
-use super::builder::CompletionBuilder;
-
-pub fn complete<'db>(
- context: &'db CursorContext,
- builder: &mut CompletionBuilder<'db>,
-) -> Option<()> {
- let range = context.cursor.command_range(context.offset)?;
- let token = context.cursor.as_tex()?;
-
- let db = context.db;
- for document in context.related() {
- if let Some(data) = document.parse(db).as_tex() {
- let text = document.text(db);
- for name in data
- .analyze(db)
- .command_name_ranges(db)
- .iter()
- .copied()
- .filter(|range| *range != token.text_range())
- .map(|range| &text[std::ops::Range::<usize>::from(range)])
- {
- builder.user_command(range, name);
- }
- }
- }
-
- Some(())
-}
diff --git a/support/texlab/src/features/completion/user_environment.rs b/support/texlab/src/features/completion/user_environment.rs
deleted file mode 100644
index cf6c2a7c78..0000000000
--- a/support/texlab/src/features/completion/user_environment.rs
+++ /dev/null
@@ -1,25 +0,0 @@
-use crate::util::cursor::CursorContext;
-
-use super::builder::CompletionBuilder;
-
-pub fn complete<'db>(
- context: &'db CursorContext,
- builder: &mut CompletionBuilder<'db>,
-) -> Option<()> {
- let (name, range) = context.find_environment_name()?;
-
- for document in context.related() {
- if let Some(data) = document.parse(context.db).as_tex() {
- for name in data
- .analyze(context.db)
- .environment_names(context.db)
- .iter()
- .filter(|n| n.as_str() != name)
- {
- builder.user_environment(range, name);
- }
- }
- }
-
- Some(())
-}
diff --git a/support/texlab/src/features/definition/command.rs b/support/texlab/src/features/definition/command.rs
deleted file mode 100644
index 743a0f6d3c..0000000000
--- a/support/texlab/src/features/definition/command.rs
+++ /dev/null
@@ -1,41 +0,0 @@
-use rowan::ast::AstNode;
-
-use crate::{syntax::latex, util::cursor::CursorContext};
-
-use super::DefinitionResult;
-
-pub(super) fn goto_definition(context: &CursorContext) -> Option<Vec<DefinitionResult>> {
- let name = context
- .cursor
- .as_tex()
- .filter(|token| token.kind() == latex::COMMAND_NAME)?;
-
- let origin_selection_range = name.text_range();
-
- for document in context.related() {
- if let Some(data) = document.parse(context.db).as_tex() {
- let root = data.root(context.db);
- if let Some(result) = root
- .descendants()
- .filter_map(latex::CommandDefinition::cast)
- .filter(|def| {
- def.name()
- .and_then(|name| name.command())
- .map_or(false, |node| node.text() == name.text())
- })
- .find_map(|def| {
- Some(DefinitionResult {
- origin_selection_range,
- target: document,
- target_range: latex::small_range(&def),
- target_selection_range: def.name()?.command()?.text_range(),
- })
- })
- {
- return Some(vec![result]);
- }
- }
- }
-
- None
-}
diff --git a/support/texlab/src/features/definition/entry.rs b/support/texlab/src/features/definition/entry.rs
deleted file mode 100644
index a945b18c41..0000000000
--- a/support/texlab/src/features/definition/entry.rs
+++ /dev/null
@@ -1,43 +0,0 @@
-use rowan::ast::AstNode;
-
-use crate::{
- syntax::{
- bibtex::{self, HasName},
- latex,
- },
- util::cursor::CursorContext,
-};
-
-use super::DefinitionResult;
-
-pub(super) fn goto_definition(context: &CursorContext) -> Option<Vec<DefinitionResult>> {
- let db = context.db;
-
- let word = context
- .cursor
- .as_tex()
- .filter(|token| token.kind() == latex::WORD)?;
-
- let key = latex::Key::cast(word.parent()?)?;
-
- latex::Citation::cast(key.syntax().parent()?.parent()?)?;
-
- let origin_selection_range = latex::small_range(&key);
-
- for document in context.related() {
- if let Some(data) = document.parse(db).as_bib() {
- for entry in data.root(db).children().filter_map(bibtex::Entry::cast) {
- if let Some(key) = entry.name_token().filter(|k| k.text() == word.text()) {
- return Some(vec![DefinitionResult {
- origin_selection_range,
- target: document,
- target_selection_range: key.text_range(),
- target_range: entry.syntax().text_range(),
- }]);
- }
- }
- }
- }
-
- None
-}
diff --git a/support/texlab/src/features/definition/label.rs b/support/texlab/src/features/definition/label.rs
deleted file mode 100644
index a1cc4ed15b..0000000000
--- a/support/texlab/src/features/definition/label.rs
+++ /dev/null
@@ -1,38 +0,0 @@
-use crate::{
- db::analysis::label,
- util::{self, cursor::CursorContext},
-};
-
-use super::DefinitionResult;
-
-pub(super) fn goto_definition(context: &CursorContext) -> Option<Vec<DefinitionResult>> {
- let db = context.db;
- let (name_text, origin_selection_range) = context
- .find_label_name_key()
- .or_else(|| context.find_label_name_command())?;
-
- for document in context.related() {
- if let Some(data) = document.parse(db).as_tex() {
- if let Some(label) = data
- .analyze(db)
- .labels(db)
- .iter()
- .filter(|label| matches!(label.origin(db), label::Origin::Definition(_)))
- .find(|label| label.name(db).text(db) == name_text.as_str())
- {
- let target_selection_range = label.range(db);
- let target_range = util::label::render(db, document, *label)
- .map_or(target_selection_range, |label| label.range);
-
- return Some(vec![DefinitionResult {
- origin_selection_range,
- target: document,
- target_range,
- target_selection_range,
- }]);
- }
- }
- }
-
- None
-}
diff --git a/support/texlab/src/features/formatting.rs b/support/texlab/src/features/formatting.rs
deleted file mode 100644
index 4a98df3f88..0000000000
--- a/support/texlab/src/features/formatting.rs
+++ /dev/null
@@ -1,33 +0,0 @@
-mod bibtex_internal;
-mod latexindent;
-
-use lsp_types::{FormattingOptions, TextEdit, Url};
-
-use crate::{
- db::{Language, Workspace},
- Db, Formatter,
-};
-
-use self::{bibtex_internal::format_bibtex_internal, latexindent::format_with_latexindent};
-
-pub fn format_source_code(
- db: &dyn Db,
- uri: &Url,
- options: &FormattingOptions,
-) -> Option<Vec<TextEdit>> {
- let workspace = Workspace::get(db);
- let document = workspace.lookup_uri(db, uri)?;
- match document.language(db) {
- Language::Tex => match db.config().formatting.tex_formatter {
- Formatter::Null => None,
- Formatter::Server => None,
- Formatter::LatexIndent => format_with_latexindent(db, document),
- },
- Language::Bib => match db.config().formatting.bib_formatter {
- Formatter::Null => None,
- Formatter::Server => format_bibtex_internal(db, document, options),
- Formatter::LatexIndent => format_with_latexindent(db, document),
- },
- Language::Log | Language::TexlabRoot | Language::Tectonic => None,
- }
-}
diff --git a/support/texlab/src/features/highlight.rs b/support/texlab/src/features/highlight.rs
deleted file mode 100644
index 52746a040f..0000000000
--- a/support/texlab/src/features/highlight.rs
+++ /dev/null
@@ -1,10 +0,0 @@
-mod label;
-
-use lsp_types::{DocumentHighlight, Position, Url};
-
-use crate::{util::cursor::CursorContext, Db};
-
-pub fn find_all(db: &dyn Db, uri: &Url, position: Position) -> Option<Vec<DocumentHighlight>> {
- let context = CursorContext::new(db, uri, position, ())?;
- label::find_highlights(&context)
-}
diff --git a/support/texlab/src/features/highlight/label.rs b/support/texlab/src/features/highlight/label.rs
deleted file mode 100644
index e362295b04..0000000000
--- a/support/texlab/src/features/highlight/label.rs
+++ /dev/null
@@ -1,32 +0,0 @@
-use lsp_types::{DocumentHighlight, DocumentHighlightKind};
-
-use crate::{
- db::analysis::label,
- util::{cursor::CursorContext, line_index_ext::LineIndexExt},
-};
-
-pub fn find_highlights(context: &CursorContext) -> Option<Vec<DocumentHighlight>> {
- let db = context.db;
- let (name_text, _) = context.find_label_name_key()?;
- let data = context.document.parse(db).as_tex()?;
-
- let mut highlights = Vec::new();
- let line_index = context.document.line_index(db);
- for label in data
- .analyze(db)
- .labels(db)
- .iter()
- .filter(|label| label.name(db).text(db) == &name_text)
- {
- let range = line_index.line_col_lsp_range(label.range(db));
- let kind = Some(match label.origin(db) {
- label::Origin::Definition(_) => DocumentHighlightKind::WRITE,
- label::Origin::Reference(_) => DocumentHighlightKind::READ,
- label::Origin::ReferenceRange(_) => DocumentHighlightKind::READ,
- });
-
- highlights.push(DocumentHighlight { range, kind });
- }
-
- Some(highlights)
-}
diff --git a/support/texlab/src/features/hover/component.rs b/support/texlab/src/features/hover/component.rs
deleted file mode 100644
index 61a428a9ce..0000000000
--- a/support/texlab/src/features/hover/component.rs
+++ /dev/null
@@ -1,28 +0,0 @@
-use lsp_types::MarkupKind;
-
-use crate::{
- db::analysis::TexLinkKind,
- util::{components::COMPONENT_DATABASE, cursor::CursorContext},
-};
-
-use super::HoverResult;
-
-pub(super) fn find_hover(context: &CursorContext) -> Option<HoverResult> {
- let db = context.db;
- let links = context.document.parse(db).as_tex()?.analyze(db).links(db);
- links
- .iter()
- .filter(|link| matches!(link.kind(db), TexLinkKind::Sty | TexLinkKind::Cls))
- .filter(|link| link.range(db).contains_inclusive(context.offset))
- .find_map(|link| {
- let value = COMPONENT_DATABASE
- .documentation(link.path(db).text(db))?
- .value;
-
- Some(HoverResult {
- value,
- value_kind: MarkupKind::PlainText,
- range: link.range(db),
- })
- })
-}
diff --git a/support/texlab/src/features/hover/label.rs b/support/texlab/src/features/hover/label.rs
deleted file mode 100644
index eafc104de6..0000000000
--- a/support/texlab/src/features/hover/label.rs
+++ /dev/null
@@ -1,23 +0,0 @@
-use lsp_types::MarkupKind;
-
-use crate::{
- db::Word,
- util::{self, cursor::CursorContext},
-};
-
-use super::HoverResult;
-
-pub(super) fn find_hover(context: &CursorContext) -> Option<HoverResult> {
- let (name_text, range) = context
- .find_label_name_key()
- .or_else(|| context.find_label_name_command())?;
-
- let db = context.db;
- util::label::find_label_definition(db, context.document, Word::new(db, name_text))
- .and_then(|(document, label)| util::label::render(db, document, label))
- .map(|label| HoverResult {
- range,
- value: label.reference(db),
- value_kind: MarkupKind::PlainText,
- })
-}
diff --git a/support/texlab/src/features/inlay_hint.rs b/support/texlab/src/features/inlay_hint.rs
deleted file mode 100644
index 5d2f5d4e11..0000000000
--- a/support/texlab/src/features/inlay_hint.rs
+++ /dev/null
@@ -1,45 +0,0 @@
-mod label;
-
-use lsp_types::{InlayHint, InlayHintLabel, Range, Url};
-use rowan::TextSize;
-
-use crate::{
- db::Workspace,
- util::{line_index::LineIndex, line_index_ext::LineIndexExt},
- Db,
-};
-
-pub fn find_all(db: &dyn Db, uri: &Url, range: Range) -> Option<Vec<InlayHint>> {
- let document = Workspace::get(db).lookup_uri(db, uri)?;
- let line_index = document.line_index(db);
-
- let mut builder = InlayHintBuilder {
- line_index,
- hints: Vec::new(),
- };
-
- let range = line_index.offset_lsp_range(range);
- label::find_hints(db, document, range, &mut builder);
- Some(builder.hints)
-}
-
-struct InlayHintBuilder<'db> {
- line_index: &'db LineIndex,
- hints: Vec<InlayHint>,
-}
-
-impl<'db> InlayHintBuilder<'db> {
- pub fn push(&mut self, offset: TextSize, text: String) {
- let position = self.line_index.line_col_lsp(offset);
- self.hints.push(InlayHint {
- position,
- label: InlayHintLabel::String(text),
- kind: None,
- text_edits: None,
- tooltip: None,
- padding_left: Some(true),
- padding_right: None,
- data: None,
- });
- }
-}
diff --git a/support/texlab/src/features/inlay_hint/label.rs b/support/texlab/src/features/inlay_hint/label.rs
deleted file mode 100644
index ca52433e7b..0000000000
--- a/support/texlab/src/features/inlay_hint/label.rs
+++ /dev/null
@@ -1,48 +0,0 @@
-use rowan::TextRange;
-
-use crate::{
- db::{analysis::label, Document},
- util::{self, label::LabeledObject},
- Db,
-};
-
-use super::InlayHintBuilder;
-
-pub(super) fn find_hints(
- db: &dyn Db,
- document: Document,
- range: TextRange,
- builder: &mut InlayHintBuilder,
-) -> Option<()> {
- let data = document.parse(db).as_tex()?;
- for label in data
- .analyze(db)
- .labels(db)
- .iter()
- .copied()
- .filter(|label| matches!(label.origin(db), label::Origin::Definition(_)))
- .filter(|label| label.range(db).intersect(range).is_some())
- {
- if let Some(rendered) = util::label::render(db, document, label) {
- if let Some(number) = &rendered.number {
- let text = match &rendered.object {
- LabeledObject::Section { prefix, .. } => {
- format!("{} {}", prefix, number.text(db))
- }
- LabeledObject::Float { kind, .. } => {
- format!("{} {}", kind.as_str(), number.text(db))
- }
- LabeledObject::Theorem { kind, .. } => {
- format!("{} {}", kind.text(db), number.text(db))
- }
- LabeledObject::Equation => format!("Equation ({})", number.text(db)),
- LabeledObject::EnumItem => format!("Item {}", number.text(db)),
- };
-
- builder.push(label.range(db).end(), text);
- }
- }
- }
-
- Some(())
-}
diff --git a/support/texlab/src/features/link.rs b/support/texlab/src/features/link.rs
deleted file mode 100644
index c252fc4a91..0000000000
--- a/support/texlab/src/features/link.rs
+++ /dev/null
@@ -1,41 +0,0 @@
-mod include;
-
-use lsp_types::{DocumentLink, Url};
-use rowan::TextRange;
-
-use crate::{
- db::{Document, Workspace},
- util::{line_index::LineIndex, line_index_ext::LineIndexExt},
- Db,
-};
-
-pub fn find_all(db: &dyn Db, uri: &Url) -> Option<Vec<DocumentLink>> {
- let document = Workspace::get(db).lookup_uri(db, uri)?;
- let mut builder = LinkBuilder {
- db,
- line_index: document.line_index(db),
- links: Vec::new(),
- };
-
- include::find_links(db, document, &mut builder);
- Some(builder.links)
-}
-
-struct LinkBuilder<'db> {
- db: &'db dyn Db,
- line_index: &'db LineIndex,
- links: Vec<DocumentLink>,
-}
-
-impl<'db> LinkBuilder<'db> {
- pub fn push(&mut self, range: TextRange, target: Document) {
- let range = self.line_index.line_col_lsp_range(range);
- let target = Some(target.location(self.db).uri(self.db).clone());
- self.links.push(DocumentLink {
- range,
- target,
- tooltip: None,
- data: None,
- });
- }
-}
diff --git a/support/texlab/src/features/link/include.rs b/support/texlab/src/features/link/include.rs
deleted file mode 100644
index f0c9d147fb..0000000000
--- a/support/texlab/src/features/link/include.rs
+++ /dev/null
@@ -1,25 +0,0 @@
-use crate::{
- db::{dependency_graph, Document, Workspace},
- Db,
-};
-
-use super::LinkBuilder;
-
-pub(super) fn find_links(db: &dyn Db, document: Document, builder: &mut LinkBuilder) -> Option<()> {
- let workspace = Workspace::get(db);
- let parent = workspace
- .parents(db, document)
- .iter()
- .next()
- .copied()
- .unwrap_or(document);
-
- let graph = dependency_graph(db, parent);
- for edge in graph.edges.iter().filter(|edge| edge.source == document) {
- if let Some(origin) = edge.origin {
- builder.push(origin.link.range(db), edge.target);
- }
- }
-
- Some(())
-}
diff --git a/support/texlab/src/features/reference/label.rs b/support/texlab/src/features/reference/label.rs
deleted file mode 100644
index 394542320c..0000000000
--- a/support/texlab/src/features/reference/label.rs
+++ /dev/null
@@ -1,36 +0,0 @@
-use lsp_types::ReferenceContext;
-
-use crate::util::cursor::CursorContext;
-
-use super::ReferenceResult;
-
-pub(super) fn find_all_references(
- context: &CursorContext<&ReferenceContext>,
- results: &mut Vec<ReferenceResult>,
-) -> Option<()> {
- let db = context.db;
- let (name_text, _) = context
- .find_label_name_key()
- .or_else(|| context.find_label_name_command())?;
-
- for document in context.related() {
- if let Some(data) = document.parse(db).as_tex() {
- for label in data
- .analyze(db)
- .labels(db)
- .iter()
- .filter(|label| label.name(db).text(db) == &name_text)
- .filter(|label| {
- label.origin(db).as_definition().is_none() || context.params.include_declaration
- })
- {
- results.push(ReferenceResult {
- document,
- range: label.range(db),
- });
- }
- }
- }
-
- Some(())
-}
diff --git a/support/texlab/src/features/rename/command.rs b/support/texlab/src/features/rename/command.rs
deleted file mode 100644
index 1e5f2ff0ca..0000000000
--- a/support/texlab/src/features/rename/command.rs
+++ /dev/null
@@ -1,37 +0,0 @@
-use rowan::{TextRange, TextSize};
-use rustc_hash::FxHashMap;
-
-use crate::{syntax::latex, util::cursor::CursorContext};
-
-use super::{Indel, Params, RenameResult};
-
-pub(super) fn prepare_rename<T>(context: &CursorContext<T>) -> Option<TextRange> {
- context.cursor.command_range(context.offset)
-}
-
-pub(super) fn rename(context: &CursorContext<Params>) -> Option<RenameResult> {
- prepare_rename(context)?;
- let name = context.cursor.as_tex()?.text();
- let mut changes = FxHashMap::default();
- for document in context.related() {
- if let Some(data) = document.parse(context.db).as_tex() {
- let root = data.root(context.db);
- let edits = root
- .descendants_with_tokens()
- .filter_map(|element| element.into_token())
- .filter(|token| token.kind() == latex::COMMAND_NAME && token.text() == name)
- .map(|token| {
- let range = token.text_range();
- Indel {
- delete: TextRange::new(range.start() + TextSize::from(1), range.end()),
- insert: context.params.new_name.clone(),
- }
- })
- .collect();
-
- changes.insert(document, edits);
- }
- }
-
- Some(RenameResult { changes })
-}
diff --git a/support/texlab/src/features/rename/label.rs b/support/texlab/src/features/rename/label.rs
deleted file mode 100644
index 7e596209d8..0000000000
--- a/support/texlab/src/features/rename/label.rs
+++ /dev/null
@@ -1,76 +0,0 @@
-use rowan::{ast::AstNode, TextRange};
-use rustc_hash::FxHashMap;
-
-use crate::{syntax::latex, util::cursor::CursorContext};
-
-use super::{Indel, Params, RenameResult};
-
-pub(super) fn prepare_rename<T>(context: &CursorContext<T>) -> Option<TextRange> {
- let (_, range) = context.find_label_name_key()?;
- Some(range)
-}
-
-pub(super) fn rename(context: &CursorContext<Params>) -> Option<RenameResult> {
- prepare_rename(context)?;
- let (name_text, _) = context.find_label_name_key()?;
-
- let mut changes = FxHashMap::default();
- for document in context.related() {
- if let Some(data) = document.parse(context.db).as_tex() {
- let mut edits = Vec::new();
- for node in data.root(context.db).descendants() {
- if let Some(range) = latex::LabelDefinition::cast(node.clone())
- .and_then(|label| label.name())
- .and_then(|name| name.key())
- .filter(|name| name.to_string() == name_text)
- .map(|name| latex::small_range(&name))
- {
- edits.push(Indel {
- delete: range,
- insert: context.params.new_name.clone(),
- });
- }
-
- latex::LabelReference::cast(node.clone())
- .and_then(|label| label.name_list())
- .into_iter()
- .flat_map(|label| label.keys())
- .filter(|name| name.to_string() == name_text)
- .for_each(|name| {
- edits.push(Indel {
- delete: latex::small_range(&name),
- insert: context.params.new_name.clone(),
- });
- });
-
- if let Some(label) = latex::LabelReferenceRange::cast(node.clone()) {
- if let Some(name_from) = label
- .from()
- .and_then(|name| name.key())
- .filter(|name| name.to_string() == name_text)
- {
- edits.push(Indel {
- delete: latex::small_range(&name_from),
- insert: context.params.new_name.clone(),
- });
- }
-
- if let Some(name_to) = label
- .to()
- .and_then(|name| name.key())
- .filter(|name| name.to_string() == name_text)
- {
- edits.push(Indel {
- delete: latex::small_range(&name_to),
- insert: context.params.new_name.clone(),
- });
- }
- }
- }
-
- changes.insert(document, edits);
- }
- }
-
- Some(RenameResult { changes })
-}
diff --git a/support/texlab/src/features/symbol/project_order.rs b/support/texlab/src/features/symbol/project_order.rs
deleted file mode 100644
index f4aeb63bca..0000000000
--- a/support/texlab/src/features/symbol/project_order.rs
+++ /dev/null
@@ -1,202 +0,0 @@
-use itertools::Itertools;
-use lsp_types::Url;
-
-use crate::{
- db::{dependency_graph, Document, Workspace},
- Db,
-};
-
-#[derive(Debug, PartialEq, Eq, Clone)]
-pub struct ProjectOrdering {
- ordering: Vec<Document>,
-}
-
-impl ProjectOrdering {
- pub fn new(db: &dyn Db) -> Self {
- let workspace = Workspace::get(db);
-
- let ordering: Vec<_> = workspace
- .index_files(db)
- .chain(workspace.documents(db).iter().copied())
- .flat_map(|document| {
- dependency_graph(db, document)
- .preorder()
- .rev()
- .collect_vec()
- })
- .unique()
- .collect();
-
- Self { ordering }
- }
-
- pub fn get(&self, db: &dyn Db, uri: &Url) -> usize {
- self.ordering
- .iter()
- .position(|doc| doc.location(db).uri(db) == uri)
- .unwrap_or(std::usize::MAX)
- }
-}
-
-#[cfg(test)]
-mod tests {
- use crate::{
- db::{Language, Owner},
- Database,
- };
-
- use super::*;
-
- #[test]
- fn test_no_cycles() {
- let mut db = Database::default();
- let workspace = Workspace::get(&db);
-
- let a = workspace.open(
- &mut db,
- Url::parse("http://example.com/a.tex").unwrap(),
- String::new(),
- Language::Tex,
- Owner::Client,
- );
-
- let b = workspace.open(
- &mut db,
- Url::parse("http://example.com/b.tex").unwrap(),
- String::new(),
- Language::Tex,
- Owner::Client,
- );
-
- let c = workspace.open(
- &mut db,
- Url::parse("http://example.com/c.tex").unwrap(),
- r#"\documentclass{article}\include{b}\include{a}"#.to_string(),
- Language::Tex,
- Owner::Client,
- );
-
- let ordering = ProjectOrdering::new(&db);
-
- assert_eq!(ordering.get(&db, a.location(&db).uri(&db)), 0);
- assert_eq!(ordering.get(&db, b.location(&db).uri(&db)), 1);
- assert_eq!(ordering.get(&db, c.location(&db).uri(&db)), 2);
- }
-
- #[test]
- fn test_two_layers() {
- let mut db = Database::default();
- let workspace = Workspace::get(&db);
-
- let a = workspace.open(
- &mut db,
- Url::parse("http://example.com/a.tex").unwrap(),
- String::new(),
- Language::Tex,
- Owner::Client,
- );
-
- let b = workspace.open(
- &mut db,
- Url::parse("http://example.com/b.tex").unwrap(),
- r#"\include{a}"#.to_string(),
- Language::Tex,
- Owner::Client,
- );
-
- let c = workspace.open(
- &mut db,
- Url::parse("http://example.com/c.tex").unwrap(),
- r#"\documentclass{article}\include{b}"#.to_string(),
- Language::Tex,
- Owner::Client,
- );
-
- let ordering = ProjectOrdering::new(&db);
-
- assert_eq!(ordering.get(&db, a.location(&db).uri(&db)), 0);
- assert_eq!(ordering.get(&db, b.location(&db).uri(&db)), 1);
- assert_eq!(ordering.get(&db, c.location(&db).uri(&db)), 2);
- }
-
- #[test]
- fn test_cycles() {
- let mut db = Database::default();
- let workspace = Workspace::get(&db);
-
- let a = workspace.open(
- &mut db,
- Url::parse("http://example.com/a.tex").unwrap(),
- r#"\documentclass{article}\include{b}"#.to_string(),
- Language::Tex,
- Owner::Client,
- );
-
- workspace.open(
- &mut db,
- Url::parse("http://example.com/b.tex").unwrap(),
- r#"\include{a}"#.to_string(),
- Language::Tex,
- Owner::Client,
- );
-
- workspace.open(
- &mut db,
- Url::parse("http://example.com/c.tex").unwrap(),
- r#"\include{a}"#.to_string(),
- Language::Tex,
- Owner::Client,
- );
-
- let ordering = ProjectOrdering::new(&db);
- assert_ne!(ordering.get(&db, a.location(&db).uri(&db)), 0);
- }
-
- #[test]
- fn test_multiple_roots() {
- let mut db = Database::default();
- let workspace = Workspace::get(&db);
-
- let a = workspace.open(
- &mut db,
- Url::parse("http://example.com/a.tex").unwrap(),
- r#"\documentclass{article}\include{b}"#.to_string(),
- Language::Tex,
- Owner::Client,
- );
-
- let b = workspace.open(
- &mut db,
- Url::parse("http://example.com/b.tex").unwrap(),
- String::new(),
- Language::Tex,
- Owner::Client,
- );
-
- let c = workspace.open(
- &mut db,
- Url::parse("http://example.com/c.tex").unwrap(),
- String::new(),
- Language::Tex,
- Owner::Client,
- );
-
- let d = workspace.open(
- &mut db,
- Url::parse("http://example.com/d.tex").unwrap(),
- r#"\documentclass{article}\include{c}"#.to_string(),
- Language::Tex,
- Owner::Client,
- );
-
- let ordering = ProjectOrdering::new(&db);
- assert!(
- ordering.get(&db, b.location(&db).uri(&db))
- < ordering.get(&db, a.location(&db).uri(&db))
- );
- assert!(
- ordering.get(&db, c.location(&db).uri(&db))
- < ordering.get(&db, d.location(&db).uri(&db))
- );
- }
-}
diff --git a/support/texlab/src/features/workspace_command/dep_graph.rs b/support/texlab/src/features/workspace_command/dep_graph.rs
deleted file mode 100644
index 84e87c4026..0000000000
--- a/support/texlab/src/features/workspace_command/dep_graph.rs
+++ /dev/null
@@ -1,57 +0,0 @@
-use anyhow::Result;
-use itertools::Itertools;
-use std::io::Write;
-
-use rustc_hash::FxHashMap;
-
-use crate::{
- db::{dependency_graph, Document, Workspace},
- Db,
-};
-
-pub fn show_dependency_graph(db: &dyn Db) -> Result<String> {
- let workspace = Workspace::get(db);
-
- let documents = workspace
- .documents(db)
- .iter()
- .enumerate()
- .map(|(i, doc)| (*doc, format!("v{i:0>5}")))
- .collect::<FxHashMap<Document, String>>();
-
- let mut writer = Vec::new();
- writeln!(&mut writer, "digraph G {{")?;
- writeln!(&mut writer, "rankdir = LR;")?;
-
- for (document, node) in &documents {
- let label = document.location(db).uri(db).as_str();
- let shape = if document.can_be_root(db) {
- "tripleoctagon"
- } else if document.can_be_built(db) {
- "doubleoctagon"
- } else {
- "octagon"
- };
-
- writeln!(&mut writer, "\t{node} [label=\"{label}\", shape={shape}];")?;
- }
-
- for edge in workspace
- .documents(db)
- .iter()
- .flat_map(|start| dependency_graph(db, *start).edges.iter())
- .unique()
- {
- let source = &documents[&edge.source];
- let target = &documents[&edge.target];
- let label = edge
- .origin
- .as_ref()
- .map_or("<artifact>", |origin| &origin.link.path(db).text(db));
-
- writeln!(&mut writer, "\t{source} -> {target} [label=\"{label}\"];")?;
- }
-
- writeln!(&mut writer, "}}")?;
- Ok(String::from_utf8(writer)?)
-}
diff --git a/support/texlab/src/lib.rs b/support/texlab/src/lib.rs
deleted file mode 100644
index d80375fa03..0000000000
--- a/support/texlab/src/lib.rs
+++ /dev/null
@@ -1,125 +0,0 @@
-#![allow(clippy::needless_lifetimes)]
-
-pub(crate) mod citation;
-mod client;
-mod config;
-pub mod db;
-pub(crate) mod distro;
-pub mod features;
-pub mod parser;
-mod server;
-pub mod syntax;
-pub mod util;
-
-pub use self::{client::LspClient, config::*, server::Server};
-
-#[salsa::jar(db = Db)]
-pub struct Jar(
- db::Word,
- db::ServerContext,
- db::Location,
- db::Location_path,
- db::LinterData,
- db::Document,
- db::Document_parse,
- db::Document_can_be_root,
- db::Document_can_be_built,
- db::Document_line_index,
- db::parse::TexDocumentData,
- db::parse::TexDocumentData_analyze,
- db::parse::BibDocumentData,
- db::parse::LogDocumentData,
- db::analysis::TexLink,
- db::analysis::label::Number,
- db::analysis::label::Name,
- db::analysis::TheoremEnvironment,
- db::analysis::GraphicsPath,
- db::analysis::TexAnalysis,
- db::analysis::TexAnalysis_has_document_environment,
- db::MissingDependencies,
- db::hidden_dependency,
- db::source_dependency,
- db::dependency_graph,
- db::Workspace,
- db::Workspace_working_dir,
- db::Workspace_output_dir,
- db::Workspace_parents,
- db::Workspace_related,
- db::Workspace_number_of_label,
- db::diagnostics::tex::collect,
- db::diagnostics::bib::collect,
- db::diagnostics::log::collect,
- db::diagnostics::collect,
- db::diagnostics::collect_filtered,
-);
-
-pub trait Db: salsa::DbWithJar<Jar> {
- fn config(&self) -> &Config;
-}
-
-#[salsa::db(crate::Jar)]
-pub struct Database {
- storage: salsa::Storage<Self>,
-}
-
-impl Db for Database {
- fn config(&self) -> &Config {
- db::ServerContext::get(self).config(self)
- }
-}
-
-impl Default for Database {
- fn default() -> Self {
- let storage = salsa::Storage::default();
- let db = Self { storage };
-
- db::ServerContext::new(&db, Default::default(), Default::default());
-
- db::Workspace::new(
- &db,
- Default::default(),
- Default::default(),
- Default::default(),
- Default::default(),
- );
-
- db
- }
-}
-
-impl salsa::Database for Database {}
-
-impl salsa::ParallelDatabase for Database {
- fn snapshot(&self) -> salsa::Snapshot<Self> {
- salsa::Snapshot::new(Self {
- storage: self.storage.snapshot(),
- })
- }
-}
-
-pub(crate) fn normalize_uri(uri: &mut lsp_types::Url) {
- fn fix_drive_letter(text: &str) -> Option<String> {
- if !text.is_ascii() {
- return None;
- }
-
- match &text[1..] {
- ":" => Some(text.to_ascii_uppercase()),
- "%3A" | "%3a" => Some(format!("{}:", text[0..1].to_ascii_uppercase())),
- _ => None,
- }
- }
-
- if let Some(mut segments) = uri.path_segments() {
- if let Some(mut path) = segments.next().and_then(fix_drive_letter) {
- for segment in segments {
- path.push('/');
- path.push_str(segment);
- }
-
- uri.set_path(&path);
- }
- }
-
- uri.set_fragment(None);
-}
diff --git a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@generic_command_escape.txt.snap b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@generic_command_escape.txt.snap
deleted file mode 100644
index 6ae6cd50be..0000000000
--- a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@generic_command_escape.txt.snap
+++ /dev/null
@@ -1,10 +0,0 @@
----
-source: src/parser/latex.rs
-expression: root
-input_file: src/parser/test_data/latex/generic_command_escape.txt
----
-ROOT@0..2
- PREAMBLE@0..2
- GENERIC_COMMAND@0..2
- COMMAND_NAME@0..2 "\\#"
-
diff --git a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@parameter.txt.snap b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@parameter.txt.snap
deleted file mode 100644
index 333db9df78..0000000000
--- a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@parameter.txt.snap
+++ /dev/null
@@ -1,10 +0,0 @@
----
-source: src/parser/latex.rs
-expression: root
-input_file: src/parser/test_data/latex/parameter.txt
----
-ROOT@0..2
- PREAMBLE@0..2
- TEXT@0..2
- WORD@0..2 "#1"
-
diff --git a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@parameter_error.txt.snap b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@parameter_error.txt.snap
deleted file mode 100644
index 8e3b45ad67..0000000000
--- a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@parameter_error.txt.snap
+++ /dev/null
@@ -1,10 +0,0 @@
----
-source: src/parser/latex.rs
-expression: root
-input_file: src/parser/test_data/latex/parameter_error.txt
----
-ROOT@0..1
- PREAMBLE@0..1
- TEXT@0..1
- WORD@0..1 "#"
-
diff --git a/support/texlab/src/server/query.rs b/support/texlab/src/server/query.rs
deleted file mode 100644
index f19d15f85b..0000000000
--- a/support/texlab/src/server/query.rs
+++ /dev/null
@@ -1,32 +0,0 @@
-use salsa::{DbWithJar, ParallelDatabase};
-use threadpool::ThreadPool;
-
-use crate::{Database, Db};
-
-#[derive(Default)]
-pub struct Engine {
- db: Database,
- pool: ThreadPool,
-}
-
-impl Engine {
- pub fn read(&self) -> &dyn Db {
- &self.db
- }
-
- pub fn write(&mut self) -> &mut dyn Db {
- self.pool.join();
- &mut self.db
- }
-
- pub fn fork<F: FnOnce(&dyn Db) + Send + 'static>(&self, action: F) {
- let snapshot = self.db.snapshot();
- self.pool.execute(move || {
- action(snapshot.as_jar_db());
- });
- }
-
- pub fn finish(self) {
- self.pool.join();
- }
-}
diff --git a/support/texlab/src/util/label.rs b/support/texlab/src/util/label.rs
deleted file mode 100644
index 74c72b234a..0000000000
--- a/support/texlab/src/util/label.rs
+++ /dev/null
@@ -1,267 +0,0 @@
-use std::str::FromStr;
-
-use rowan::{ast::AstNode, TextRange};
-
-use crate::{
- db::{analysis::label, Document, Word, Workspace},
- syntax::latex::{self, HasBrack, HasCurly},
- Db,
-};
-
-use self::LabeledObject::*;
-
-#[derive(Debug, PartialEq, Eq, Clone, Copy)]
-pub enum LabeledFloatKind {
- Figure,
- Table,
- Listing,
- Algorithm,
-}
-
-impl LabeledFloatKind {
- pub fn as_str(self) -> &'static str {
- match self {
- Self::Figure => "Figure",
- Self::Table => "Table",
- Self::Listing => "Listing",
- Self::Algorithm => "Algorithm",
- }
- }
-}
-
-impl FromStr for LabeledFloatKind {
- type Err = ();
-
- fn from_str(s: &str) -> Result<Self, Self::Err> {
- match s {
- "figure" | "subfigure" => Ok(Self::Figure),
- "table" | "subtable" => Ok(Self::Table),
- "listing" | "lstlisting" => Ok(Self::Listing),
- "algorithm" => Ok(Self::Algorithm),
- _ => Err(()),
- }
- }
-}
-
-#[derive(Debug, PartialEq, Eq, Clone)]
-pub enum LabeledObject {
- Section {
- prefix: &'static str,
- text: String,
- },
- Float {
- kind: LabeledFloatKind,
- caption: String,
- },
- Theorem {
- kind: Word,
- description: Option<String>,
- },
- Equation,
- EnumItem,
-}
-
-#[derive(Debug, PartialEq, Eq, Clone)]
-pub struct RenderedLabel {
- pub range: TextRange,
- pub number: Option<Word>,
- pub object: LabeledObject,
-}
-
-impl RenderedLabel {
- pub fn reference(&self, db: &dyn Db) -> String {
- match &self.number {
- Some(number) => match &self.object {
- Section { prefix, text } => format!("{} {} ({})", prefix, number.text(db), text),
- Float { kind, caption } => {
- format!("{} {}: {}", kind.as_str(), number.text(db), caption)
- }
- Theorem {
- kind,
- description: None,
- } => format!("{} {}", kind.text(db), number.text(db)),
- Theorem {
- kind,
- description: Some(description),
- } => format!("{} {} ({})", kind.text(db), number.text(db), description),
- Equation => format!("Equation ({})", number.text(db)),
- EnumItem => format!("Item {}", number.text(db)),
- },
- None => match &self.object {
- Section { prefix, text } => format!("{} ({})", prefix, text),
- Float { kind, caption } => format!("{}: {}", kind.as_str(), caption),
- Theorem {
- kind,
- description: None,
- } => kind.text(db).into(),
- Theorem {
- kind,
- description: Some(description),
- } => format!("{} ({})", kind.text(db), description),
- Equation => "Equation".into(),
- EnumItem => "Item".into(),
- },
- }
- }
-
- pub fn detail(&self, db: &dyn Db) -> Option<String> {
- match &self.object {
- Section { .. } | Theorem { .. } | Equation | EnumItem => Some(self.reference(db)),
- Float { kind, .. } => {
- let result = match &self.number {
- Some(number) => format!("{} {}", kind.as_str(), number.text(db)),
- None => kind.as_str().to_owned(),
- };
- Some(result)
- }
- }
- }
-}
-
-pub fn render(db: &dyn Db, document: Document, label_def: label::Name) -> Option<RenderedLabel> {
- let workspace = Workspace::get(db);
- let label_num = workspace.number_of_label(db, document, label_def.name(db));
- let root = document.parse(db).as_tex()?.root(db);
-
- label_def
- .origin(db)
- .as_definition()?
- .to_node(&root)
- .syntax()
- .ancestors()
- .find_map(|parent| {
- render_label_float(parent.clone(), label_num)
- .or_else(|| render_label_section(parent.clone(), label_num))
- .or_else(|| render_label_enum_item(db, parent.clone(), label_num))
- .or_else(|| render_label_equation(db, parent.clone(), label_num))
- .or_else(|| render_label_theorem(db, document, parent, label_num))
- })
-}
-
-pub fn find_label_definition(
- db: &dyn Db,
- child: Document,
- name: Word,
-) -> Option<(Document, label::Name)> {
- Workspace::get(db)
- .related(db, child)
- .iter()
- .find_map(|document| {
- let data = document.parse(db).as_tex()?;
- let label = data
- .analyze(db)
- .labels(db)
- .iter()
- .filter(|label| label.origin(db).as_definition().is_some())
- .find(|label| label.name(db) == name)?;
-
- Some((*document, *label))
- })
-}
-
-fn render_label_float(parent: latex::SyntaxNode, number: Option<Word>) -> Option<RenderedLabel> {
- let environment = latex::Environment::cast(parent.clone())?;
- let environment_name = environment.begin()?.name()?.key()?.to_string();
- let kind = LabeledFloatKind::from_str(&environment_name).ok()?;
- let caption = find_caption_by_parent(&parent)?;
- Some(RenderedLabel {
- range: latex::small_range(&environment),
- number,
- object: LabeledObject::Float { caption, kind },
- })
-}
-
-fn render_label_section(parent: latex::SyntaxNode, number: Option<Word>) -> Option<RenderedLabel> {
- let section = latex::Section::cast(parent)?;
- let text_group = section.name()?;
- let text = text_group.content_text()?;
-
- Some(RenderedLabel {
- range: latex::small_range(&section),
- number,
- object: LabeledObject::Section {
- prefix: match section.syntax().kind() {
- latex::PART => "Part",
- latex::CHAPTER => "Chapter",
- latex::SECTION => "Section",
- latex::SUBSECTION => "Subsection",
- latex::SUBSUBSECTION => "Subsubsection",
- latex::PARAGRAPH => "Paragraph",
- latex::SUBPARAGRAPH => "Subparagraph",
- _ => unreachable!(),
- },
- text,
- },
- })
-}
-
-fn render_label_enum_item(
- db: &dyn Db,
- parent: latex::SyntaxNode,
- number: Option<Word>,
-) -> Option<RenderedLabel> {
- let enum_item = latex::EnumItem::cast(parent)?;
- Some(RenderedLabel {
- range: latex::small_range(&enum_item),
- number: enum_item
- .label()
- .and_then(|label| label.content_text())
- .map(|text| Word::new(db, text))
- .or(number),
- object: LabeledObject::EnumItem,
- })
-}
-
-fn render_label_equation(
- db: &dyn Db,
- parent: latex::SyntaxNode,
- number: Option<Word>,
-) -> Option<RenderedLabel> {
- let env = latex::Environment::cast(parent)?;
- let env_name = env.begin()?.name()?.key()?.to_string();
-
- if !db.config().syntax.math_environments.contains(&env_name) {
- return None;
- }
-
- Some(RenderedLabel {
- range: latex::small_range(&env),
- number,
- object: LabeledObject::Equation,
- })
-}
-
-fn render_label_theorem(
- db: &dyn Db,
- document: Document,
- parent: latex::SyntaxNode,
- number: Option<Word>,
-) -> Option<RenderedLabel> {
- let environment = latex::Environment::cast(parent)?;
- let begin = environment.begin()?;
- let description = begin.options().and_then(|options| options.content_text());
-
- let environment_name = begin.name()?.key()?.to_string();
-
- let kind = Workspace::get(db)
- .related(db, document)
- .iter()
- .filter_map(|document| document.parse(db).as_tex())
- .flat_map(|data| data.analyze(db).theorem_environments(db))
- .find(|env| env.name(db).text(db) == &environment_name)
- .map(|env| env.description(db))?;
-
- Some(RenderedLabel {
- range: latex::small_range(&environment),
- number,
- object: LabeledObject::Theorem { kind, description },
- })
-}
-
-pub fn find_caption_by_parent(parent: &latex::SyntaxNode) -> Option<String> {
- parent
- .children()
- .filter_map(latex::Caption::cast)
- .find_map(|node| node.long())
- .and_then(|node| node.content_text())
-}
diff --git a/support/texlab/texlab.1 b/support/texlab/texlab.1
index 4f7196658d..a34e068d09 100644
--- a/support/texlab/texlab.1
+++ b/support/texlab/texlab.1
@@ -1,7 +1,7 @@
.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.47.13.
-.TH TEXLAB "1" "March 2023" "texlab 5.4.1" "User Commands"
+.TH TEXLAB "1" "April 2023" "texlab 5.4.2" "User Commands"
.SH NAME
-texlab \- manual page for texlab 5.4.1
+texlab \- manual page for texlab 5.4.2
.SH SYNOPSIS
.B texlab
[\fI\,OPTIONS\/\fR]
diff --git a/support/texlab/texlab.pdf b/support/texlab/texlab.pdf
index 42c4d34fe5..90d24c7a04 100644
--- a/support/texlab/texlab.pdf
+++ b/support/texlab/texlab.pdf
Binary files differ
diff --git a/systems/texlive/tlnet/tlpkg/installer/ctan-mirrors.pl b/systems/texlive/tlnet/tlpkg/installer/ctan-mirrors.pl
index cfeba8e728..ed8859323c 100644
--- a/systems/texlive/tlnet/tlpkg/installer/ctan-mirrors.pl
+++ b/systems/texlive/tlnet/tlpkg/installer/ctan-mirrors.pl
@@ -18,6 +18,7 @@ $mirrors = {
'https://mirrors.sjtug.sjtu.edu.cn/ctan/' => 1,
'https://mirrors.sustech.edu.cn/CTAN/' => 1,
'https://mirrors.tuna.tsinghua.edu.cn/CTAN/' => 1,
+ 'https://mirrors.ustc.edu.cn/CTAN/' => 1,
'https://mirrors.zju.edu.cn/CTAN/' => 1,
},
'Hong Kong' => {
@@ -43,9 +44,9 @@ $mirrors = {
},
'Korea' => {
'http://ftp.ktug.org/tex-archive/' => 1,
- 'https://cran.asia/tex/' => 1,
'https://ftp.kaist.ac.kr/pub/tex-archive/' => 1,
'https://lab.uklee.pe.kr/tex-archive/' => 1,
+ 'https://mirror.kakao.com/CTAN/' => 1,
'https://mirror.navercorp.com/CTAN/' => 1,
},
'Singapore' => {
diff --git a/systems/texlive/tlnet/tlpkg/texlive.tlpdb b/systems/texlive/tlnet/tlpkg/texlive.tlpdb
index dd930ae463..d5f787ceb3 100644
--- a/systems/texlive/tlnet/tlpkg/texlive.tlpdb
+++ b/systems/texlive/tlnet/tlpkg/texlive.tlpdb
@@ -26,7 +26,7 @@ depend container_split_src_files/1
depend frozen/0
depend minrelease/2016
depend release/2023
-depend revision/66823
+depend revision/66828
name 00texlive.image
category TLCore
@@ -4725,7 +4725,7 @@ depend setting_available_architectures:aarch64-linux amd64-freebsd amd64-netbsd
name 00texlive.installer
category TLCore
-revision 66817
+revision 66825
shortdesc TeX Live standalone installer package
longdesc This package defines the files to go into the installer
longdesc archives (install-tl-unx.tar.gz, install-tl.zip) built by the
@@ -176223,16 +176223,16 @@ catalogue-topics version-control doc-mgmt
name latexindent
category Package
-revision 66795
+revision 66828
shortdesc Indent a LaTeX document, highlighting the programming structure
longdesc The Perl script processes a LaTeX file, indenting parts so as
longdesc to highlight the structure for the reader. Included are also
longdesc binary (executable) files for Windows, Ubuntu Linux, and macOS.
depend latexindent.ARCH
-containersize 72868
-containerchecksum d96cd152d4a446d5d1c08f61e796b0fc06e221e56d7aa16e0d622924485c72dbe94780706f3208479e741a293bab12ea9417b207379befc317781c48b59e93c1
-doccontainersize 1318792
-doccontainerchecksum 4355ac9905d9afa1dbc14be0f78c1604a24d2604d607bb25df27f5c3faeff64674fe3ad4e356b11835cd1f4337472c9f40a85cb1d8dbd684ff581addf1ef8ca4
+containersize 72912
+containerchecksum 020d13f2e02b15b88f17c5bfdb9b57b9b56f7ceafb89e94f70451b060ba10f54e5cfd9ec36a14d6547e674754ed34e24d15c4dcfcc2a174aa43a46f7f1fe5172
+doccontainersize 1320052
+doccontainerchecksum 44da950332a7877a8a3dccaedd36543d99ee54531c5816e67559d0240623fbb278ed23bdfd0bb45ada51aefeaba709863cbcf15de34c639d191b0f9ad42e3f69
docfiles size=443
texmf-dist/doc/support/latexindent/README details="Readme"
texmf-dist/doc/support/latexindent/contributors.bib
@@ -176292,7 +176292,7 @@ catalogue-contact-repository https://github.com/cmhughes/latexindent.pl
catalogue-ctan /support/latexindent
catalogue-license gpl3
catalogue-topics code-layout
-catalogue-version 3.20.5
+catalogue-version 3.20.6
name latexindent.aarch64-linux
category Package
@@ -176377,10 +176377,10 @@ binfiles arch=universal-darwin size=1
name latexindent.windows
category Package
-revision 66794
+revision 66828
shortdesc windows files of latexindent
-containersize 3546488
-containerchecksum 88cdc9daed218df52d59902e2b22a459b6d644de7c73167e085f131c4ef73e6f7cc53068c96b9c2d381ca52dcf32533321bbe5c04e159d239f2ba8876b0214f0
+containersize 3546372
+containerchecksum be6d37677315f0b43e0e6d4bcf70cc87e7d4d9f6649c99f41aa8a71acaa3c38effb083a5c2e52455a73be6120c6bdbbd0014ad245eb8c0b2cd59edcaccbb7562
binfiles arch=windows size=2125
bin/windows/latexindent.exe
@@ -247942,7 +247942,7 @@ catalogue-topics float
name photobook
category Package
-revision 66813
+revision 66826
shortdesc A document class for typesetting photo books
relocated 1
longdesc The photobook LaTeX document class extends the book class
@@ -247976,10 +247976,10 @@ depend xargs
depend xcolor
depend xint
depend xkeyval
-containersize 31664
-containerchecksum ddd63cd1c33e5f0026d93417508d8385953fb52857ae2f46a04cdc7a8455618c4a32ab40713db9c9294b63912e43969732cde4c81795f4fbf971c0c5dc63c08c
-doccontainersize 153756
-doccontainerchecksum 05eb34aea1e5fab85e7e6a86d6d03d65f0c8813231d2c3df587421a911f4a99b63d1b016c8555cde0159d02f09af516e49f1a5f433ea3f165906815e4a0846ab
+containersize 31596
+containerchecksum 8ca89fb324f212a6dfd6ae28765da72e328adbe7619d6cbf69e5e6e36561e70b5711d2bd4841e0ad643a22cae822bde3f64ca30922d50abe14711d340b9c118a
+doccontainersize 153572
+doccontainerchecksum 5279aa5d13f2cbc0952827840aa78e67ef9e3779ac16b10e6f81252ac0d6082305352058aec9520c39fb96923787ef29b1ac6c00605281ef9ef124a8305949ab
docfiles size=53
RELOC/doc/latex/photobook/DEPENDS.txt
RELOC/doc/latex/photobook/LICENSE
@@ -247997,7 +247997,7 @@ catalogue-contact-repository https://github.com/flynx/photobook
catalogue-ctan /macros/latex/contrib/photobook
catalogue-license bsd3
catalogue-topics class
-catalogue-version 0.1.17
+catalogue-version 0.1.18
name physconst
category Package
@@ -248554,22 +248554,22 @@ catalogue-topics doc-supp
name piton
category Package
-revision 66763
+revision 66827
shortdesc Typeset Python listings with LPEG
relocated 1
longdesc This package uses the Lua library LPEG to typeset and highlight
longdesc Python listings.
-containersize 12724
-containerchecksum fe64b54eb5886015e271dfcb20b29308a784258ee3fe89078b04f3ba1dbd04db5c10ceac092cf924900b9bf3b61178959bf3c480ddeb42b3626b1d0e10f9c871
-doccontainersize 611736
-doccontainerchecksum 3bff2b128fa8095b51f70b06553ba5b042286581ad5e1576179fdc37041692ea11286b173635282a91257cb82b3a817ae8f66746092bfece1641a6e25dcb800d
+containersize 12760
+containerchecksum 28becf2a6c08f2a7a094728682a3dda14176b675261cfe2bc7e236116f1d2fbde7078a3b2d01226e484ce0f7a8ad2d4f117397846bcae5a02be16e0946220ed7
+doccontainersize 612608
+doccontainerchecksum e0199730605f635fd6d1a2a81c5a4977d630416b19f7137f23e56072dacc50edc9618772d6ef399c40cd3c6da957cd163d9797ded615a58ce25c59cb761a1051
docfiles size=264
RELOC/doc/lualatex/piton/README.md details="Readme"
RELOC/doc/lualatex/piton/piton-french.pdf details="Package documentation (French)" language="fr"
RELOC/doc/lualatex/piton/piton-french.tex
RELOC/doc/lualatex/piton/piton.pdf details="Package documentation (English)"
-srccontainersize 35888
-srccontainerchecksum bc5306c715c25e79c2b61311719c345e06d592f791929e1464ba12e45da4864db5f331c2babfc2758c89ecad73996e44c81801a019912bbaef900ce1ff7ae447
+srccontainersize 36048
+srccontainerchecksum 42ada52e7e3734fea77b1549fc04e4c2290773182e6e8f3dd5d7b92882bfe258cf125edaa8a80553b2416f316946db5e93dca79cc7b0a0c01b75648c97cee624
srcfiles size=43
RELOC/source/lualatex/piton/piton.dtx
RELOC/source/lualatex/piton/piton.ins
@@ -248579,7 +248579,7 @@ catalogue-also codehigh
catalogue-ctan /macros/luatex/latex/piton
catalogue-license lppl1.3
catalogue-topics listing synt-hlt luatex
-catalogue-version 1.5
+catalogue-version 1.5a
name pittetd
category Package
@@ -311560,7 +311560,7 @@ docfiles size=376
name texlive-scripts
category TLCore
-revision 66817
+revision 66825
shortdesc TeX Live infrastructure programs
longdesc Includes install-tl, tl-portable, rungs, etc.; not needed for
longdesc tlmgr to run but still ours. Not included in tlcritical.
@@ -311568,10 +311568,10 @@ depend texlive-scripts.ARCH
depend texlive.infra
execute addMap mathpple.map
postaction shortcut type=menu name="TeX Live command-line" cmd=TEXDIR/tlpkg/installer/tl-cmd.bat
-containersize 114032
-containerchecksum 7052771b319a3d3facf294efcc5fdf2c0bb7b4a3d4224e81bde98218dd265f68ccb2badd015246049f160aa83261383566d39432ca68a1f9f29ed0a5d1fe6788
-doccontainersize 423552
-doccontainerchecksum 1bac29a1647050239f221c73912644d2218730718fdbfd814a7738511d1aa9003b2895820a4f69af97174953d18b4541b4bc97e7494fc0d04732201545232517
+containersize 114020
+containerchecksum a10dc9fe300aa0c6172b4b7bfbdcb92cacef2a0c10a857bd05a029f6d0c64500ebf04a22f23ccfd2f5b83a5c405adb0d37a608ea3e353598c38539bb39f9d744
+doccontainersize 423760
+doccontainerchecksum ac8e093cd1e43f9e4e8761d5f85509157ba07f88f373dee76ce5626096286ca4e0047f8e8956dafe75f87c017dc618eedad8da8347e682649942556c6ad143eb
docfiles size=538
doc.html
texmf-dist/doc/man/man1/fmtutil-sys.1
diff --git a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5 b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5
index ec1b8d4919..b493c7f995 100644
--- a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5
+++ b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5
@@ -1 +1 @@
-0f00c8c5e541dc2429f29e2e842d763f texlive.tlpdb
+56351373a4fb7a86b9bf8d51f93b6ff1 texlive.tlpdb
diff --git a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512 b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512
index 5409d5b580..f0856d0a9d 100644
--- a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512
+++ b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512
@@ -1 +1 @@
-666add834f99b857aa97ef8094f1b9ee4d8322251bc4443c15c49f097a453de1dc47f8596aada9b1a808fc02a42021b0957b1eaddd9a069f0fc331468a9ef779 texlive.tlpdb
+311e6278d01fc421a4a8a1ece840871fb004d398d90f4ecd8ae9b20daa43a0ec663df1b186085d07167135a7d3f15c239ca3a58aa4f753eb494c37f93dcc21ca texlive.tlpdb
diff --git a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc
index 1d7ee76922..8622e6c5cc 100644
--- a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc
+++ b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc
@@ -1,10 +1,10 @@
-----BEGIN PGP SIGNATURE-----
-iQEcBAEBCgAGBQJkNKFgAAoJEEzhh34ZQ4xwfasH/2ZDLoovJ7ukYUfT1OXxjYfq
-T0ew4Kdnp+YWkrPy1QvlOM9ab+0XtVB7OoXWxhmt1Pg0ul5BK8QBQ5SYTc2X7u5d
-StBJcbDuwIyU6HheDLgnJKP4nUdpYA4n47C8w25/kmpf2yMbKTehJZbzFJ98pttx
-YjRY9v0y8JnZmH9oSs07rDLZH5tmA7L4P4P5JZQk0gYM4RofSCmXxP8Or8knOHiu
-ljdtMZZJCnTObBBiUtB6fQGN1f6A0ev3Z/2/ajbR1K6ND1/9pAiqaUNsrEVwxs7E
-5/SnqPbCGnWC2T/Jlj0yObmNkssm9l1bfYQRW8r805JXNH0VMhILDLQ2/uyNLTg=
-=Jza7
+iQEcBAEBCgAGBQJkNfMOAAoJEEzhh34ZQ4xw+FoH/0YHTg4GpT2xhat+Rib4jjHf
+uFIC9+7slIUe296Hr1kCvg29V4BqdM9C9pEcSy5b/+O6le7hikTDuzK7eXN7pnij
+Ze4UbNQQ2vMEZBkaP4eNKDvNGhmMj9wIV4nHbu9wuoJyO6i3JGuypOk/3/idi6VT
+MFmG6JY5iAwf6GItavtcRCWCxqVzeiKmr3+Zbz0euoxIlefySOoXyaI6L3Jap7/q
+BNzhdbcc8iMLFurTb9YSUwvnGQLt3F/PQjTC/hprCVZP7saW0siHKtlRPWKaKttv
++gRq/eDXMC9vpST0PM/sHSYrMrhbBLme7ZU5AIKE1NzmJKW/PmsT68rENVReDgk=
+=dfry
-----END PGP SIGNATURE-----
diff --git a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz
index ab27db1fc0..989e5dc7dd 100644
--- a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz
+++ b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz
Binary files differ
diff --git a/timestamp b/timestamp
index 018991ee76..f467deba93 100644
--- a/timestamp
+++ b/timestamp
@@ -2,4 +2,4 @@
# The source CTAN of this site's material:
dante.ctan.org
# The year-month-day-hour-minute of this site's material:
-2023-04-11-02-02
+2023-04-12-02-02