diff --git a/CHANGES.rst b/CHANGES.rst index e9da73a..a8efe25 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -8,6 +8,13 @@ in reverse chronological order. Releases follow `semantic versioning `_. +0.1.2 - 2022-xx-xx +------------------ + +- :gh:`12` adds support for glossaries and glossaries-extra. Thanks to + :ghuser:`axtimhaus`! + + 0.1.1 - 2022-02-08 ------------------ diff --git a/README.rst b/README.rst index afeda43..f66bfe7 100644 --- a/README.rst +++ b/README.rst @@ -79,7 +79,7 @@ in ``\includegraphics``), all possible candidates are returned. PDF ~~~ -``generate_pdf()`` allows to conveniently generate PDFs with Python. The function is +``compile_pdf()`` allows to conveniently generate PDFs with Python. The function is mainly used for validating test cases. .. code-block:: python @@ -87,7 +87,7 @@ mainly used for validating test cases. import latex_dependency_scanner as lds - lds.generate_pdf("document.tex", "document.pdf") + lds.compile_pdf("document.tex", "document.pdf") Changes diff --git a/src/latex_dependency_scanner/scanner.py b/src/latex_dependency_scanner/scanner.py index 5437245..393ddcc 100644 --- a/src/latex_dependency_scanner/scanner.py +++ b/src/latex_dependency_scanner/scanner.py @@ -37,11 +37,12 @@ REGEX_TEX = re.compile( - r"\\(?Pusepackage|RequirePackage|include|addbibresource|bibliography|putbib|" - r"includegraphics|input|(sub)?import|lstinputlisting)" + r"\\(?Pusepackage|RequirePackage|include|addbibresource|bibliography|putbib" + r"|includegraphics|input|(sub)?import|lstinputlisting|glsxtrresourcefile" + r"|GlsXtrLoadResources)" r"(<[^<>]*>)?" r"(\[[^\[\]]*\])?" - r"({(?P[^{}]*)})?{(?P[^{}]*)}", + r"({(?P[^{}]*)})?(\[[^\[\]]*src=)?{(?P[^{}]*)}", re.M, ) """re.Pattern: The regular expression pattern to extract included files from a LaTeX @@ -138,6 +139,11 @@ def yield_nodes_from_node( common_extensions = [ext] else: common_extensions = COMMON_GRAPHICS_EXTENSIONS + elif match.group("type") in [ + "glsxtrresourcefile", + "GlsXtrLoadResources", + ]: + common_extensions = [".glstex", ".bib"] # .bib for bib2gls elif match.group("type") == "lstinputlistings": common_extensions = [""] else: diff --git a/tests/resources/acronyms.glstex b/tests/resources/acronyms.glstex new file mode 100644 index 0000000..d121d4b --- /dev/null +++ b/tests/resources/acronyms.glstex @@ -0,0 +1 @@ +\newabbreviation{abc}{ABC}{AlphaBetaGamma} diff --git a/tests/resources/symbols.bib b/tests/resources/symbols.bib new file mode 100644 index 0000000..7a0a217 --- /dev/null +++ b/tests/resources/symbols.bib @@ -0,0 +1,4 @@ +@symbol{Ab, + name = {\ensuremath{A_b}}, + description = {Symbol Ab}, +} diff --git a/tests/test_regex.py b/tests/test_regex.py index 4ea93e8..903a064 100644 --- a/tests/test_regex.py +++ b/tests/test_regex.py @@ -59,6 +59,14 @@ "\\addbibresource{bibfile}", {"type": "addbibresource", "file": "bibfile", "relative_to": None}, ), + ( + "\\glsxtrresourcefile{glsfile}", + {"type": "glsxtrresourcefile", "file": "glsfile", "relative_to": None}, + ), + ( + "\\GlsXtrLoadResources[src={glsfile}, selection={all}]", + {"type": "GlsXtrLoadResources", "file": "glsfile", "relative_to": None}, + ), ], ) def test_regex_tex(text, expected): diff --git a/tests/test_scan.py b/tests/test_scan.py index b782709..60ca20c 100644 --- a/tests/test_scan.py +++ b/tests/test_scan.py @@ -393,3 +393,76 @@ def test_biblatex_bibliography_without_extension_and_file(tmp_path): nodes = scan(tmp_path / "document.tex") assert nodes == [tmp_path / "document.tex", tmp_path / "bibliography.bib"] + + +@pytest.mark.end_to_end +def test_glossaries(tmp_path): + """Test document with glossaries""" + source = """ + \\documentclass{article} + \\usepackage{glossaries} + \\glsxtrresourcefile{symbols} + \\GlsXtrLoadResources[src={acronyms}] + \\begin{document} + \\printunsrtsymbols + \\printunsrtglossaries + \\end{document} + """ + tmp_path.joinpath("document.tex").write_text(textwrap.dedent(source)) + shutil.copy(TEST_RESOURCES / "symbols.bib", tmp_path / "symbols.bib") + shutil.copy(TEST_RESOURCES / "acronyms.glstex", tmp_path / "acronyms.glstex") + + nodes = scan(tmp_path / "document.tex") + + assert nodes == [ + tmp_path / "document.tex", + tmp_path / "symbols.bib", + tmp_path / "acronyms.glstex", + ] + + +@pytest.mark.end_to_end +def test_glossaries_both_extensions_present(tmp_path): + """Test document with glossaries and present files symbols.bib AND symbols.glstex""" + source = """ + \\documentclass{article} + \\usepackage{glossaries} + \\glsxtrresourcefile{symbols} + \\begin{document} + \\printunsrtsymbols + \\printunsrtglossaries + \\end{document} + """ + tmp_path.joinpath("document.tex").write_text(textwrap.dedent(source)) + shutil.copy(TEST_RESOURCES / "symbols.bib", tmp_path / "symbols.bib") + shutil.copy(TEST_RESOURCES / "acronyms.glstex", tmp_path / "symbols.glstex") + + nodes = scan(tmp_path / "document.tex") + + assert nodes == [tmp_path / "document.tex", tmp_path / "symbols.glstex"] + + +@pytest.mark.end_to_end +def test_glossaries_without_files(tmp_path): + """Test document with glossaries""" + source = """ + \\documentclass{article} + \\usepackage{glossaries} + \\glsxtrresourcefile{symbols} + \\GlsXtrLoadResources[src={acronyms}] + \\begin{document} + \\printunsrtsymbols + \\printunsrtglossaries + \\end{document} + """ + tmp_path.joinpath("document.tex").write_text(textwrap.dedent(source)) + + nodes = scan(tmp_path / "document.tex") + + assert nodes == [ + tmp_path / "document.tex", + tmp_path / "symbols.glstex", + tmp_path / "symbols.bib", + tmp_path / "acronyms.glstex", + tmp_path / "acronyms.bib", + ]