Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 7 additions & 4 deletions docling_core/transforms/serializer/latex.py
Original file line number Diff line number Diff line change
Expand Up @@ -569,10 +569,13 @@ def _serialize_image_part(
):
return create_ser_result(text=image_placeholder, span_source=item)
else:
return create_ser_result(
text=f"\\includegraphics[width=\\linewidth]{{{item.image.uri!s}}}",
span_source=item,
)
path = str(item.image.uri)
line = f"\\includegraphics[width=\\linewidth]{{{path}}}"
if "%" in path or "#" in path:
# graphicx can't take "\%" or "\#" in a file name, so make
# them ordinary characters inside a group instead.
line = f"\\begingroup\\catcode`\\%=12 \\catcode`\\#=12 {line}\\endgroup"
return create_ser_result(text=line, span_source=item)
else: # EMBEDDED not supported natively
return create_ser_result(
text="% embedded image not supported in LaTeX serializer",
Expand Down
31 changes: 30 additions & 1 deletion tests/test_latex_serialization.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,8 @@
import yaml

from docling_core.transforms.serializer.latex import LaTeXDocSerializer, LaTeXParams
from docling_core.types.doc.base import ImageRefMode
from docling_core.types.doc import ImageRef
from docling_core.types.doc.base import ImageRefMode, Size
from docling_core.types.doc.document import (
BaseMeta,
CodeMetaField,
Expand Down Expand Up @@ -537,3 +538,31 @@ def test_latex_meta_name_filters_on_picture_and_table():
assert "annotation[description]: A sample bar chart" in allowed
assert "annotation[description]: A table description" in allowed
assert "annotation[classification]" not in allowed


@pytest.mark.parametrize(
"uri, expected_line",
[
(
Path("100% Report_artifacts/img.png"),
r"\begingroup\catcode`\%=12 \catcode`\#=12 "
r"\includegraphics[width=\linewidth]{100% Report_artifacts/img.png}\endgroup",
),
(
Path("odd/a#b.png"),
r"\begingroup\catcode`\%=12 \catcode`\#=12 \includegraphics[width=\linewidth]{odd/a#b.png}\endgroup",
),
(
Path("doc_artifacts/image_000001_ab12.png"),
r"\includegraphics[width=\linewidth]{doc_artifacts/image_000001_ab12.png}",
),
],
)
def test_latex_referenced_image_path(uri: Path, expected_line: str):
"""A '%' or '#' in a referenced image path must not break the generated LaTeX."""
doc = DoclingDocument(name="x")
doc.add_picture(image=ImageRef(mimetype="image/png", dpi=72, size=Size(width=10, height=10), uri=uri))

out = LaTeXDocSerializer(doc=doc, params=LaTeXParams(image_mode=ImageRefMode.REFERENCED)).serialize().text

assert expected_line in out.splitlines()
Loading