texsmith 0.2.1.dev0__tar.gz → 0.3.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- texsmith-0.3.0/.github/issues/plain-md-caption-inline-formatting.md +134 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/.github/workflows/ci.yml +22 -10
- texsmith-0.3.0/.wiki/1919_eclipse_positive.jpg +0 -0
- texsmith-0.3.0/.wiki/Albert_Einstein_and_Charlie_Chaplin_City_Lights_premiere_1931.jpg +0 -0
- texsmith-0.3.0/.wiki/Albert_Einstein_and_his_wife_Mileva_Maric.jpg +0 -0
- texsmith-0.3.0/.wiki/Albert_Einstein_as_a_child.jpg +0 -0
- texsmith-0.3.0/.wiki/Einstein-Oslofjord_cropped.jpg +0 -0
- texsmith-0.3.0/.wiki/README.md +20 -0
- texsmith-0.3.0/CHANGELOG.md +114 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/PKG-INFO +6 -3
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/README.md +4 -1
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/about/devel/index.md +0 -1
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/cli/index.md +3 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/examples/letters.md +12 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/guide/plumbing/pipeline.md +1 -1
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/guide/templates/fragments.md +29 -1
- texsmith-0.3.0/docs/syntax/abbr.md +93 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/syntax/captions.md +2 -2
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/syntax/notes.md +77 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/syntax/supported.md +3 -2
- texsmith-0.3.0/docs/syntax/tables.md +444 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/pyproject.toml +5 -2
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/scripts/ci/python_versions.py +1 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/__init__.py +3 -6
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/handlers/_assets.py +12 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/handlers/admonitions.py +2 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/handlers/basic.py +3 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/handlers/blocks.py +34 -3
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/handlers/inline.py +16 -12
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/latex/engines/__init__.py +9 -1
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/latex/engines/tectonic/__init__.py +25 -1
- texsmith-0.3.0/src/texsmith/adapters/latex/partials/horizontal_rule.tex +1 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/latex/partials/table.tex +6 -11
- texsmith-0.3.0/src/texsmith/adapters/latex/partials/yaml_table.tex +39 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/latex/tectonic.py +2 -2
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/latex/utils.py +22 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/markdown/__init__.py +18 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/transformers/strategies.py +39 -8
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/core/context.py +2 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/core/conversion/__init__.py +2 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/core/conversion/core.py +72 -81
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/core/conversion/execution.py +45 -47
- texsmith-0.3.0/src/texsmith/core/conversion/glossary.py +239 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/core/conversion/inputs.py +63 -23
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/core/conversion/models.py +1 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/core/conversion/renderer.py +23 -17
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/core/conversion/service.py +1 -1
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/core/conversion/templates.py +36 -30
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/core/conversion_contexts.py +32 -11
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/core/documents.py +11 -2
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/core/fragments/__init__.py +80 -4
- texsmith-0.3.0/src/texsmith/core/fragments/resolution.py +124 -0
- texsmith-0.3.0/src/texsmith/core/html_utils.py +25 -0
- texsmith-0.3.0/src/texsmith/core/http.py +57 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/core/templates/loader.py +6 -1
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/core/templates/wrapper.py +41 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/extensions/__init__.py +12 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/extensions/latex_raw.py +4 -1
- texsmith-0.3.0/src/texsmith/extensions/marginnote/__init__.py +14 -0
- texsmith-0.3.0/src/texsmith/extensions/marginnote/markdown.py +102 -0
- texsmith-0.3.0/src/texsmith/extensions/marginnote/renderer.py +73 -0
- texsmith-0.3.0/src/texsmith/extensions/tables/__init__.py +77 -0
- texsmith-0.3.0/src/texsmith/extensions/tables/constants.py +158 -0
- texsmith-0.3.0/src/texsmith/extensions/tables/html.py +353 -0
- texsmith-0.3.0/src/texsmith/extensions/tables/layout.py +340 -0
- texsmith-0.3.0/src/texsmith/extensions/tables/markdown.py +698 -0
- texsmith-0.3.0/src/texsmith/extensions/tables/renderer.py +316 -0
- texsmith-0.3.0/src/texsmith/extensions/tables/schema.py +868 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/fonts/coverage.py +2 -3
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/fonts/downloader.py +4 -2
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/fonts/fallback.py +32 -1
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/fonts/ucharclasses.py +2 -2
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/fragments/extra/__init__.py +11 -9
- texsmith-0.3.0/src/texsmith/fragments/extra/ts-extra.jinja.tex +61 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/fragments/fonts/__init__.py +2 -2
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/fragments/fonts/ts-fonts.jinja.sty +0 -5
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/fragments/glossary/__init__.py +6 -1
- texsmith-0.3.0/src/texsmith/fragments/glossary/ts-glossary-backmatter.jinja.tex +38 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/fragments/glossary/ts-glossary.jinja.sty +14 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/quotes.py +1 -2
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/templates/article/template/manifest.toml +20 -0
- texsmith-0.3.0/src/texsmith/templates/article/template/template.tex +186 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/templates/book/template/template.tex +7 -2
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/ui/cli/_options.py +10 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/ui/cli/commands/render.py +20 -3
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/ui/cli/presenter.py +18 -1
- texsmith-0.3.0/src/texsmith/version.py +16 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_api_service.py +14 -15
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_article_template.py +10 -10
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_blocks.py +29 -1
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_cli.py +95 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_cli_convert.py +4 -1
- texsmith-0.3.0/tests/test_fragment_resolution.py +208 -0
- texsmith-0.3.0/tests/test_front_matter_glossary.py +269 -0
- texsmith-0.3.0/tests/test_lists.py +114 -0
- texsmith-0.3.0/tests/test_marginnote_extension.py +226 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_markdown_quotes.py +13 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_strip_tags.py +23 -0
- texsmith-0.3.0/tests/test_tables_html.py +291 -0
- texsmith-0.3.0/tests/test_tables_layout.py +450 -0
- texsmith-0.3.0/tests/test_tables_markdown.py +425 -0
- texsmith-0.3.0/tests/test_tables_renderer.py +317 -0
- texsmith-0.3.0/tests/test_tables_schema.py +761 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_template_attributes.py +78 -1
- texsmith-0.3.0/tests/test_version.py +17 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/uv.lock +50 -50
- texsmith-0.2.1.dev0/CHANGELOG.md +0 -65
- texsmith-0.2.1.dev0/docs/syntax/abbr.md +0 -51
- texsmith-0.2.1.dev0/docs/syntax/tables.md +0 -52
- texsmith-0.2.1.dev0/fonts-test.tex +0 -180
- texsmith-0.2.1.dev0/src/texsmith/adapters/latex/partials/horizontal_rule.tex +0 -1
- texsmith-0.2.1.dev0/src/texsmith/core/execution.py +0 -34
- texsmith-0.2.1.dev0/src/texsmith/fragments/extra/ts-extra.jinja.tex +0 -13
- texsmith-0.2.1.dev0/src/texsmith/fragments/glossary/ts-glossary-backmatter.jinja.tex +0 -23
- texsmith-0.2.1.dev0/src/texsmith/templates/article/template/template.tex +0 -74
- texsmith-0.2.1.dev0/test.md +0 -12
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/.editorconfig +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/.gitignore +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/.vscode/settings.json +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/AGENT.md +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/LICENSE.md +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/Makefile +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/.nav.yml +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/about/.nav.yml +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/about/author.md +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/about/contribute.md +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/about/devel/config.md +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/about/devel/glossary.md +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/about/devel/plugins.md +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/about/devel/tables.md +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/about/index.md +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/about/license.md +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/about/other-resources.md +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/about/release-notes.md +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/about/versioning.md +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/api/bibliography.md +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/api/cli.md +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/api/core.md +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/api/custom-transformers.md +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/api/handlers.md +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/api/high-level.md +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/api/index.md +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/api/latex.md +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/api/markdown.md +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/api/plugins.md +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/api/transformers.md +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/assets/.nav.yml +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/assets/drawio-viewer.js +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/assets/examples/README.md +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/assets/examples/cheese.bib +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/assets/examples/cheese.md +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/assets/examples/code.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/assets/examples/dialects.md +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/assets/examples/mozzarella.svg +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/assets/js/auto-reload.js +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/assets/mermaid.mmd +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/assets/mermaid.svg +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/assets/pipeline.png +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/assets/standards.svg +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/assets/ts-anvil.svg +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/assets/ts-dark.svg +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/assets/ts-light.svg +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/assets/ts-logo.svg +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/assets/workflow.drawio +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/cli/bibliography.md +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/cli/build.md +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/cli/slots.md +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/cli/templates.md +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/css/brand.css +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/css/extra.css +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/examples/book.md +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/examples/colorful.md +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/examples/cooking.md +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/examples/diagrams.md +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/examples/index.md +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/examples/languages.md +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/examples/paper.md +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/examples/pgcd.drawio +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/examples/snippet-configs/letter.yml +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/examples/snippets.md +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/examples/texsmith.md +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/guide/.nav.yml +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/guide/extensions.md +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/guide/features/.nav.yml +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/guide/features/acronyms.md +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/guide/features/bibliography.md +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/guide/features/headings.md +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/guide/features/listings.md +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/guide/features/tags.md +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/guide/fonts.md +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/guide/fragments/.nav.yml +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/guide/fragments/geometry.md +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/guide/fragments/glossary.md +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/guide/fragments/index.md +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/guide/fragments/typesetting.md +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/guide/front-matter.md +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/guide/getting-started.md +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/guide/limitations.md +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/guide/metadata.md +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/guide/mkdocs.md +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/guide/plumbing/.nav.yml +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/guide/plumbing/engines.md +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/guide/plumbing/index.md +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/guide/plumbing/latex.md +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/guide/plumbing/tex.md +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/guide/tectonic.md +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/guide/templates/discovery.md +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/guide/templates/index.md +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/guide/templates/mermaid.md +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/guide/templates/partials.md +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/guide/templates/template-cookbook.md +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/guide/troubleshooting.md +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/hooks/mkdocs_hooks.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/index.md +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/js/mathjax.js +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/syntax/admonitions.md +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/syntax/code.md +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/syntax/deflists.md +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/syntax/extra.md +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/syntax/formatting.md +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/syntax/images.md +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/syntax/index.md +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/syntax/math.md +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/syntax/mermaid.md +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/syntax/progressbar.md +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/syntax/references.md +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/syntax/smartypants.md +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/syntax/wikilinks.md +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/texsmith-logo.pdf +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/mkdocs.yml +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/noxfile.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/packages/mkdocs_texsmith/.editorconfig +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/packages/mkdocs_texsmith/.gitignore +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/packages/mkdocs_texsmith/.markdownlint.yaml +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/packages/mkdocs_texsmith/LICENSE.md +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/packages/mkdocs_texsmith/Makefile +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/packages/mkdocs_texsmith/README.md +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/packages/mkdocs_texsmith/docs/about.md +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/packages/mkdocs_texsmith/docs/images/latex-hummingbird.svg +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/packages/mkdocs_texsmith/docs/index.md +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/packages/mkdocs_texsmith/hatch_build.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/packages/mkdocs_texsmith/mkdocs.yml +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/packages/mkdocs_texsmith/noxfile.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/packages/mkdocs_texsmith/pyproject.toml +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/packages/mkdocs_texsmith/src/mkdocs_plugin_texsmith/__init__.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/packages/mkdocs_texsmith/src/mkdocs_plugin_texsmith/plugin.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/packages/mkdocs_texsmith/tests/test_import.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/packages/mkdocs_texsmith/tests/test_plugin_config.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/packages/mkdocs_texsmith/uv.lock +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/pyrightconfig.json +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/scripts/refresh_cli_help.sh +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/__init__.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/docker.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/handlers/__init__.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/handlers/_helpers.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/handlers/_mermaid.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/handlers/code.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/handlers/links.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/handlers/media.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/latex/__init__.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/latex/engines/latex/__init__.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/latex/engines/latex/log.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/latex/engines/latex/runner.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/latex/formatter.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/latex/latexmk.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/latex/partials/acronym.tex +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/latex/partials/add.tex +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/latex/partials/addition.tex +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/latex/partials/blockquote.tex +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/latex/partials/callout.tex +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/latex/partials/choices.tex +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/latex/partials/citation.tex +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/latex/partials/codeblock.tex +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/latex/partials/codeblock_listings.tex +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/latex/partials/codeblock_pygments.tex +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/latex/partials/codeblock_verbatim.tex +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/latex/partials/codeinline.tex +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/latex/partials/codeinlinett.tex +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/latex/partials/comment.tex +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/latex/partials/del.tex +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/latex/partials/deletion.tex +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/latex/partials/description_list.tex +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/latex/partials/enquote.tex +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/latex/partials/epigraph.tex +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/latex/partials/exercises_solutions.tex +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/latex/partials/figure.tex +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/latex/partials/figure_tcolorbox.tex +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/latex/partials/footnote.tex +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/latex/partials/glossary.tex +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/latex/partials/heading.tex +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/latex/partials/highlight.tex +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/latex/partials/href.tex +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/latex/partials/icon.tex +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/latex/partials/include.tex +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/latex/partials/index.tex +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/latex/partials/italic.tex +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/latex/partials/keystroke.tex +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/latex/partials/label.tex +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/latex/partials/list_acronyms.tex +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/latex/partials/list_glossary.tex +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/latex/partials/multicolumn.tex +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/latex/partials/ordered_list.tex +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/latex/partials/pagestyle.tex +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/latex/partials/ref.tex +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/latex/partials/regex.tex +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/latex/partials/smallcaps.tex +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/latex/partials/strikethrough.tex +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/latex/partials/strong.tex +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/latex/partials/subscript.tex +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/latex/partials/substitution.tex +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/latex/partials/superscript.tex +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/latex/partials/tabbed.tex +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/latex/partials/underline.tex +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/latex/partials/unordered_list.tex +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/latex/partials/url.tex +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/latex/pygments.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/latex/pyxindy.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/latex/renderer.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/latex/xindy/latex.xdy +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/latex/xindy/tex.xdy +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/plugins/__init__.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/plugins/material.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/plugins/snippet.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/transformers/__init__.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/transformers/base.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/transformers/utils.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/core/__init__.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/core/bibliography/__init__.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/core/bibliography/collection.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/core/bibliography/doi.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/core/bibliography/issues.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/core/bibliography/parsing.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/core/callouts.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/core/config.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/core/conversion/_utils.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/core/conversion/debug.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/core/conversion/pipeline.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/core/diagnostics.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/core/exceptions.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/core/fonts/__init__.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/core/fragments/base.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/core/metadata.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/core/mustache.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/core/partials.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/core/rules.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/core/templates/__init__.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/core/templates/base.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/core/templates/builtins.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/core/templates/context_usage.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/core/templates/manifest.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/core/templates/runtime.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/core/templates/session.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/core/templates/text.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/core/user_dir.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/devtools.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/extensions/index/__init__.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/extensions/index/markdown.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/extensions/index/mkdocs_plugin.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/extensions/index/registry.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/extensions/index/renderer.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/extensions/index/templates/index.tex +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/extensions/latex_text.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/extensions/mermaid.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/extensions/missing_footnotes.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/extensions/multi_citations.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/extensions/progressbar/__init__.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/extensions/progressbar/markdown.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/extensions/progressbar/renderer.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/extensions/smallcaps.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/extensions/texlogos/__init__.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/extensions/texlogos/markdown.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/extensions/texlogos/renderer.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/extensions/texlogos/specs.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/fonts/__init__.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/fonts/cache.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/fonts/constants.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/fonts/html_scripts.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/fonts/logging.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/fonts/pipeline.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/fonts/scripts.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/fragments/__init__.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/fragments/bibliography/__init__.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/fragments/bibliography/fragment.toml +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/fragments/bibliography/ts-bibliography-backmatter.jinja.tex +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/fragments/bibliography/ts-bibliography.jinja.tex +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/fragments/callouts/__init__.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/fragments/callouts/fragment.toml +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/fragments/callouts/ts-callouts.jinja.sty +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/fragments/code/__init__.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/fragments/code/fragment.toml +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/fragments/code/ts-code.jinja.sty +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/fragments/extra/fragment.toml +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/fragments/fonts/fragment.toml +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/fragments/frame/__init__.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/fragments/frame/fragment.toml +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/fragments/frame/ts-frame.tex.jinja +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/fragments/geometry/__init__.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/fragments/geometry/fragment.toml +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/fragments/geometry/paper.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/fragments/geometry/ts_geometry.tex.jinja +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/fragments/glossary/fragment.toml +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/fragments/index/__init__.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/fragments/index/fragment.toml +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/fragments/index/ts-index-backmatter.jinja.tex +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/fragments/index/ts-index.jinja.sty +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/fragments/keystrokes/__init__.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/fragments/keystrokes/fragment.toml +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/fragments/keystrokes/ts-keystrokes.jinja.sty +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/fragments/todolist/__init__.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/fragments/todolist/fragment.toml +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/fragments/todolist/ts-todolist.jinja.sty +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/fragments/typesetting/__init__.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/fragments/typesetting/fragment.toml +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/fragments/typesetting/ts-typesetting.tex.jinja +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/index.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/plugins/__init__.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/progressbar.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/smart_dashes.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/templates/__init__.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/templates/article/README.md +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/templates/article/__init__.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/templates/article/template/mermaid-config.json +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/templates/book/README.md +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/templates/book/__init__.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/templates/book/overrides/codeblock.tex +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/templates/book/overrides/codeinline.tex +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/templates/book/template/fixtoc.sty +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/templates/book/template/manifest.toml +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/templates/common/__init__.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/templates/common/latexmkrc +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/templates/letter/README.md +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/templates/letter/__init__.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/templates/letter/demo.md +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/templates/letter/fonts/modernline bold.otf +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/templates/letter/fonts/modernline.otf +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/templates/letter/manifest.toml +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/templates/letter/template/callouts.jinja.sty +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/templates/letter/template/template.tex +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/templates/snippet/README.md +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/templates/snippet/__init__.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/templates/snippet/template/manifest.toml +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/templates/snippet/template/template.tex +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/texlogos.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/ui/__init__.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/ui/cli/__init__.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/ui/cli/app.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/ui/cli/bibliography.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/ui/cli/commands/__init__.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/ui/cli/commands/templates.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/ui/cli/diagnostics.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/ui/cli/state.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/ui/cli/utils.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/fixtures/bib/a.bib +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/fixtures/bib/b.bib +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/fixtures/template-info/article.txt +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/fixtures/template-info/book.txt +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/fixtures/template-info/letter.txt +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/fixtures/template-info/snippet.txt +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_admonitions.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_assets.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_attribute_ownership.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_baseline_regressions.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_bibliography.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_bibliography_fragment.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_callouts.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_citations.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_cli_bibliography.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_cli_templates_commands.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_code_engines.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_combining_marks.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_counter_extension.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_data_script_rendering.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_dependency_warnings.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_diagnostics.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_diagrams_backend.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_docker.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_document_state.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_engine_helpers.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_extra_fragment.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_fallback_cache_refresh.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_fonts_fallback.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_formatting.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_fragment_configs.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_fragments/geometry.md +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_fragments.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_geometry_fragment.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_headings.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_html_script_detection.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_index_extension.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_latex_log.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_letter_template.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_links.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_markdown_latex_raw.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_markdown_latex_text.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_markdown_mermaid.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_markdown_module.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_markdown_smart_dashes.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_media_conversion.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_mkdocs/docs/code.md +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_mkdocs/docs/formatting.md +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_mkdocs/docs/headings.md +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_mkdocs/docs/index.md +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_mkdocs/docs/pgcd.drawio +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_mkdocs/mkdocs.yml +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_mkdocs_html.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_mkdocs_integration.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_mkdocs_plugin.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_mustache.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_partials.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_presenter.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_press_metadata.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_progressbar_extension.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_renderer_entry_points.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_renderer_fallback_manager.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_renderer_parser_fallback.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_rule_ordering.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_script_wrapping.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_snippet_cache.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_snippet_parser.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_tectonic_downloads.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_template_emitters.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_template_loader.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_template_renderer.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_template_renderer_slots.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_template_wrapping.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_texlogos_extension.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_title_levels.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_transformers.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_typesetting_fragment.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_user_dir.py +0 -0
- {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_utils.py +0 -0
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
# Plain Markdown table caption with inline formatting is silently dropped
|
|
2
|
+
|
|
3
|
+
## Summary
|
|
4
|
+
|
|
5
|
+
When a `Table: …` caption line above a plain Markdown table (i.e. not a
|
|
6
|
+
` ```yaml table ` fence) contains inline Markdown markers — italics
|
|
7
|
+
(`*x*`), inline code (`` `x` ``), links, etc. — the caption is **silently
|
|
8
|
+
dropped**: it does not become a `<caption>` element on the table and
|
|
9
|
+
instead remains as a plain paragraph in the output (so it renders as body
|
|
10
|
+
text in front of the table, unrelated to it).
|
|
11
|
+
|
|
12
|
+
This is the symmetric counterpart of the yaml-table caption bug fixed in
|
|
13
|
+
`extensions/tables/html.py` (use of `_set_inline_content` for the caption
|
|
14
|
+
text). The plain-Markdown path has its own preprocessor and treeprocessor
|
|
15
|
+
and was not addressed by that fix.
|
|
16
|
+
|
|
17
|
+
## Reproduction
|
|
18
|
+
|
|
19
|
+
```markdown
|
|
20
|
+
Table: Coverage of the old foundation (*Info1*, *Info2*)
|
|
21
|
+
|
|
22
|
+
| Skill | Description |
|
|
23
|
+
|-------|-------------|
|
|
24
|
+
| Foo | Bar |
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
After `texsmith --build … article`, the rendered LaTeX contains:
|
|
28
|
+
|
|
29
|
+
```latex
|
|
30
|
+
Table: Coverage of the old foundation (\emph{Info1}, \emph{Info2})
|
|
31
|
+
|
|
32
|
+
\begin{table}[H]
|
|
33
|
+
\centering
|
|
34
|
+
\begin{tabular}{ll}
|
|
35
|
+
…
|
|
36
|
+
\end{tabular}
|
|
37
|
+
\end{table}
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
— the `Table: …` line is rendered as a regular paragraph; the caption is
|
|
41
|
+
**not** attached to the table at all (no `\caption{…}` is emitted).
|
|
42
|
+
|
|
43
|
+
The same source without italics works correctly:
|
|
44
|
+
|
|
45
|
+
```markdown
|
|
46
|
+
Table: Coverage of the old foundation
|
|
47
|
+
|
|
48
|
+
| … |
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
→ produces a proper `\caption{Coverage of the old foundation}` inside the
|
|
52
|
+
table environment.
|
|
53
|
+
|
|
54
|
+
## Root cause
|
|
55
|
+
|
|
56
|
+
[`_MarkdownTableCaptionTreeprocessor._caption_from_paragraph`](../../src/texsmith/extensions/tables/markdown.py)
|
|
57
|
+
early-returns when the paragraph contains any child elements:
|
|
58
|
+
|
|
59
|
+
```python
|
|
60
|
+
@staticmethod
|
|
61
|
+
def _caption_from_paragraph(
|
|
62
|
+
paragraph: ElementTree.Element,
|
|
63
|
+
) -> _CaptionInfo | None:
|
|
64
|
+
if len(paragraph):
|
|
65
|
+
# Caption paragraphs are expected to be plain text.
|
|
66
|
+
return None
|
|
67
|
+
text = (paragraph.text or "").strip()
|
|
68
|
+
if not text.startswith("Table:"):
|
|
69
|
+
return None
|
|
70
|
+
return _parse_caption_line(text)
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
A paragraph containing `<em>`, `<code>`, `<a>` etc. has
|
|
74
|
+
`len(paragraph) > 0`, so the treeprocessor returns `None` and the
|
|
75
|
+
paragraph is left in the document. No fallback handles this case —
|
|
76
|
+
`_attach_caption` is also written under the assumption that the caption
|
|
77
|
+
is plain text (it does `caption.text = info.text`).
|
|
78
|
+
|
|
79
|
+
## Suggested fix
|
|
80
|
+
|
|
81
|
+
Two changes:
|
|
82
|
+
|
|
83
|
+
1. In `_caption_from_paragraph`, do **not** short-circuit on
|
|
84
|
+
`len(paragraph) > 0`. Inspect `paragraph.text` (text before the first
|
|
85
|
+
child) for the `Table:` prefix; if present, return a richer
|
|
86
|
+
`_CaptionInfo` that preserves the paragraph's inline structure.
|
|
87
|
+
|
|
88
|
+
2. In `_attach_caption`, instead of `caption.text = info.text`, build the
|
|
89
|
+
`<caption>` element by:
|
|
90
|
+
- Setting `caption.text` to the leading text after stripping
|
|
91
|
+
`"Table:"` (and trimming any leading whitespace).
|
|
92
|
+
- Moving the paragraph's children into the new `<caption>` element
|
|
93
|
+
(preserving order).
|
|
94
|
+
- If the existing `_CAPTION_LINE_RE` extracts a `{#label}` suffix,
|
|
95
|
+
that suffix lives in the *trailing tail* of the last child or in
|
|
96
|
+
the leading text when no children exist; we need to detect it on
|
|
97
|
+
whichever node carries it and strip it before moving children.
|
|
98
|
+
|
|
99
|
+
A clean shape:
|
|
100
|
+
|
|
101
|
+
```python
|
|
102
|
+
@staticmethod
|
|
103
|
+
def _caption_from_paragraph(paragraph):
|
|
104
|
+
leading = (paragraph.text or "").lstrip()
|
|
105
|
+
if not leading.startswith("Table:"):
|
|
106
|
+
return None
|
|
107
|
+
# Strip the Table: prefix from the leading text, leaving inline
|
|
108
|
+
# structure intact.
|
|
109
|
+
return _CaptionInfoRich(
|
|
110
|
+
leading=leading[len("Table:"):].lstrip(),
|
|
111
|
+
children=list(paragraph),
|
|
112
|
+
# tail of last child holds the optional {#label} suffix
|
|
113
|
+
trailing=…,
|
|
114
|
+
)
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
`_attach_caption` then becomes a transfer of (leading text, children,
|
|
118
|
+
trailing text without `{#label}`) into a fresh `<caption>` element, with
|
|
119
|
+
the label peeled off and assigned to `table.set("id", label)` as today.
|
|
120
|
+
|
|
121
|
+
## Workaround
|
|
122
|
+
|
|
123
|
+
Use a ` ```yaml table ` fence instead of a plain Markdown table — the
|
|
124
|
+
yaml-table preprocessor handles caption italics correctly since the fix
|
|
125
|
+
to `extensions/tables/html.py` that wraps caption text through
|
|
126
|
+
`_set_inline_content`.
|
|
127
|
+
|
|
128
|
+
## Out of scope but worth verifying
|
|
129
|
+
|
|
130
|
+
- Inline code in captions (`` `foo` ``) likely fails the same way. Same
|
|
131
|
+
root cause.
|
|
132
|
+
- Inline links (`[text](url)`) probably same.
|
|
133
|
+
- Whether the source-line-level capture path used in some other table
|
|
134
|
+
flows has the same blind spot is worth a quick audit while at it.
|
|
@@ -21,6 +21,7 @@ jobs:
|
|
|
21
21
|
- name: Install uv
|
|
22
22
|
uses: astral-sh/setup-uv@v7
|
|
23
23
|
with:
|
|
24
|
+
version: "0.9.18"
|
|
24
25
|
enable-cache: true
|
|
25
26
|
cache-python: false
|
|
26
27
|
env:
|
|
@@ -55,6 +56,7 @@ jobs:
|
|
|
55
56
|
- name: Install uv
|
|
56
57
|
uses: astral-sh/setup-uv@v7
|
|
57
58
|
with:
|
|
59
|
+
version: "0.9.18"
|
|
58
60
|
enable-cache: true
|
|
59
61
|
cache-python: false
|
|
60
62
|
env:
|
|
@@ -65,7 +67,7 @@ jobs:
|
|
|
65
67
|
|
|
66
68
|
- name: Install Cairo (macOS)
|
|
67
69
|
if: runner.os == 'macOS'
|
|
68
|
-
run: brew install cairo
|
|
70
|
+
run: brew list cairo >/dev/null 2>&1 || brew install cairo
|
|
69
71
|
|
|
70
72
|
- name: Run pytest
|
|
71
73
|
run: uv run pytest
|
|
@@ -92,6 +94,7 @@ jobs:
|
|
|
92
94
|
- name: Install uv
|
|
93
95
|
uses: astral-sh/setup-uv@v7
|
|
94
96
|
with:
|
|
97
|
+
version: "0.9.18"
|
|
95
98
|
enable-cache: true
|
|
96
99
|
cache-python: false
|
|
97
100
|
env:
|
|
@@ -128,6 +131,7 @@ jobs:
|
|
|
128
131
|
# Install system dependencies (Playwright, cairo, etc.)
|
|
129
132
|
- name: Install system dependencies
|
|
130
133
|
run: |
|
|
134
|
+
sudo apt-get update
|
|
131
135
|
sudo apt-get install -y libglib2.0-0 libnspr4 libnss3 libatk1.0-0 \
|
|
132
136
|
libatk-bridge2.0-0 libcups2 libxkbcommon0 libatspi2.0-0 libxcomposite1 \
|
|
133
137
|
libxdamage1 libxfixes3 libxrandr2 libgbm1 libcairo2 libpango-1.0-0
|
|
@@ -136,6 +140,7 @@ jobs:
|
|
|
136
140
|
- name: Install uv
|
|
137
141
|
uses: astral-sh/setup-uv@v7
|
|
138
142
|
with:
|
|
143
|
+
version: "0.9.18"
|
|
139
144
|
enable-cache: true
|
|
140
145
|
cache-python: false
|
|
141
146
|
|
|
@@ -149,6 +154,21 @@ jobs:
|
|
|
149
154
|
uv run playwright install-deps
|
|
150
155
|
uv run playwright install chromium
|
|
151
156
|
|
|
157
|
+
# Build the main Python package distribution before docs/examples touch the repo
|
|
158
|
+
- name: Build distributions (texsmith)
|
|
159
|
+
run: uv build
|
|
160
|
+
|
|
161
|
+
# Build the MkDocs plugin distribution before docs/examples touch the repo
|
|
162
|
+
- name: Build distributions (mkdocs_texsmith)
|
|
163
|
+
working-directory: packages/mkdocs_texsmith
|
|
164
|
+
run: uv build
|
|
165
|
+
|
|
166
|
+
# Ensure no generated artifacts pollute the version calculation
|
|
167
|
+
- name: Verify clean git state
|
|
168
|
+
run: |
|
|
169
|
+
git status --porcelain
|
|
170
|
+
test -z "$(git status --porcelain)"
|
|
171
|
+
|
|
152
172
|
# Build all examples (clean + all)
|
|
153
173
|
- name: Build examples
|
|
154
174
|
run: |
|
|
@@ -165,15 +185,6 @@ jobs:
|
|
|
165
185
|
run: |
|
|
166
186
|
make docs
|
|
167
187
|
|
|
168
|
-
# Build the main Python package distribution
|
|
169
|
-
- name: Build distributions (texsmith)
|
|
170
|
-
run: uv build
|
|
171
|
-
|
|
172
|
-
# Build the MkDocs plugin distribution
|
|
173
|
-
- name: Build distributions (mkdocs_texsmith)
|
|
174
|
-
working-directory: packages/mkdocs_texsmith
|
|
175
|
-
run: uv build
|
|
176
|
-
|
|
177
188
|
# Upload all artifacts needed for the release job
|
|
178
189
|
- name: Upload release artifacts
|
|
179
190
|
uses: actions/upload-artifact@v4
|
|
@@ -242,6 +253,7 @@ jobs:
|
|
|
242
253
|
- name: Install uv
|
|
243
254
|
uses: astral-sh/setup-uv@v7
|
|
244
255
|
with:
|
|
256
|
+
version: "0.9.18"
|
|
245
257
|
enable-cache: true
|
|
246
258
|
cache-python: false
|
|
247
259
|
env:
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# Cached Wikipedia images
|
|
2
|
+
|
|
3
|
+
This folder contains locally cached copies of Wikipedia images used in the examples.
|
|
4
|
+
|
|
5
|
+
Why this exists:
|
|
6
|
+
|
|
7
|
+
- CI (especially Windows) occasionally hits HTTP 429 rate limits when fetching directly from `upload.wikimedia.org`.
|
|
8
|
+
- Keeping a local copy makes the examples deterministic and prevents flaky builds.
|
|
9
|
+
|
|
10
|
+
How it works:
|
|
11
|
+
|
|
12
|
+
- The Markdown examples still reference HTTP URLs, but we point them to the repo via
|
|
13
|
+
`https://raw.githubusercontent.com/yves-chevallier/texsmith/refs/heads/master/.wiki/...`.
|
|
14
|
+
- This preserves the HTTP fetch path in the renderer while avoiding third‑party rate limits.
|
|
15
|
+
|
|
16
|
+
If you need to add new images:
|
|
17
|
+
|
|
18
|
+
1. Download the file from Wikipedia (or another source with a compatible license).
|
|
19
|
+
2. Place it in this folder using a stable filename.
|
|
20
|
+
3. Update the example markdown to reference the raw GitHub URL.
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to this project are documented in this file.
|
|
4
|
+
|
|
5
|
+
The format is based on [Keep a Changelog 1.1.0](https://keepachangelog.com/en/1.1.0/)
|
|
6
|
+
and the project follows [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
|
+
|
|
8
|
+
## [Unreleased]
|
|
9
|
+
|
|
10
|
+
### Added
|
|
11
|
+
|
|
12
|
+
- Structured `glossary:` front-matter section, validated with pydantic, that complements the existing `*[KEY]: …` body syntax. Each entry carries an explicit `description` and an optional `group`; groups are declared at the top with their displayed title (`groups: {tech: Acronymes techniques, …}`), and entries with no group fall back to the standard acronym table. TeXSmith emits one localised `\printglossary[type=<group>, title=<title>]` per group in declaration order, plus `\printglossary[type=\acronymtype]` for ungrouped entries; the default acronym title now uses `\acronymname` so `babel` localises it (e.g. *Acronymes* under `language: french`). Front-matter entries that never appear in the body are still defined in the glossary; entries that do appear are auto-substituted with `\acrshort{KEY}` whenever the strict, case-sensitive form occurs in the text — `\Gls`/`\GLS` casing helpers are not synthesised (a documented limitation). The `article` template now loads `babel` before `extra_packages` so the `glossaries` package picks up the active language. New `examples/glossary/` tutorial.
|
|
13
|
+
- `article` template now supports `listoffigures: true` and `listoftables: true` front-matter flags (mirroring the `book` template), plus a `lists_position: toc | backmatter` knob to choose whether the lists are inserted right after the table of contents (default) or just before the backmatter and references. Each list is wrapped in `\ifnum\value{figure|table}>0` so empty documents don't emit blank pages.
|
|
14
|
+
- New `yaml table` Markdown fence describing complex tables in YAML and compiling to `tabular` / `tabularx` / `longtable` on demand. Supports multi-row and multi-column cells (in headers and body), nested grouped headers, width-groups, separators with optional labels, footers, captions via the standard `Table: …` syntax, and explicit width control. Validation errors surface as inline error admonitions with a clear, localised message. New `examples/tables/` tutorial pairs each YAML source with its rendered output and ships a Makefile to build the demo PDF.
|
|
15
|
+
- `ts-extra` now auto-loads the `multirow` package when `\multirow` is detected in the rendered LaTeX.
|
|
16
|
+
- `Table: <caption> {#label}` now also works on plain Markdown tables: a tree processor pairs the caption paragraph with the following `<table>` and injects a `<caption>` child carrying the caption text (and optional `id` from the `{#label}` part). Both the yaml-table renderer and the legacy table renderer consume `<caption>` directly, so the LaTeX output gets a proper `\caption{…}` with its `\label{…}`.
|
|
17
|
+
- 0.5 em of vertical breathing room is inserted between the caption and the table body for both yaml-tables and plain Markdown tables when a caption is present.
|
|
18
|
+
- New `yaml table-config` fence applied right below a plain Markdown table sends per-column attributes (`align`, `width`, `width-group`) and table-level settings to the yaml-table renderer. Marks the table with `data-ts-*` attributes so it goes through the same `tabular` / `tabularx` / `longtable` selection as full yaml-tables, including caption handling. A `BlockProcessor` parses the fence into a real ElementTree marker so a sibling tree processor can bind the config to the preceding `<table>`.
|
|
19
|
+
- New explicit `width: X` value (case-insensitive, alias for `tabularx`'s `X` column) marks a single column as flexible without needing a `width-group` shim. When any column carries `width: X`, only that column expands; the others keep their natural width.
|
|
20
|
+
- `align` accepts long forms (`left`, `right`, `center`, `centre`, `justify`, `justified`) in addition to the short single-letter forms; both are normalised to the short form internally.
|
|
21
|
+
- New `{margin}[note]{side?}` inline shorthand for margin notes, joining the unified `{keyword}[content]` family (alongside `{index}[term]` and `{latex}[payload]`). The optional single-letter suffix picks a side — `l` / `i` force the left margin (scoped `\reversemarginpar`), `r` / `o` the right; without a suffix the note follows the document's default (right in `oneside`, outer in `twoside`). Inline markdown inside the note is preserved (bold, italic, code, links). Compiles to `\marginnote{…}` from the LaTeX `marginnote` package, which `ts-extra` now auto-loads on detection. Three defensive layers keep notes within the page on any geometry: (1) `\marginfont` is configured with `\footnotesize`, `\sloppy`, `\emergencystretch=1em` and lowered hyphenation penalties so long words break (or inter-word spacing stretches) rather than overflow; (2) an `\AtBeginDocument` hook clamps `\marginparwidth` to the horizontal space the document's geometry actually reserves on each side (recto and, in twoside, verso), minus `\marginparsep` and a 6 pt safety buffer; (3) a custom `geometry: {left: 3cm, right: 4cm}` yields notes that still fit on both pages with no manual `marginparwidth=…` tweak. New `examples/marginnote/` tutorial with a Makefile; extension documented in `docs/syntax/notes.md`.
|
|
22
|
+
|
|
23
|
+
### Fixed
|
|
24
|
+
|
|
25
|
+
- Two long-standing test assertions that had drifted away from the templates they exercise: `test_render_template_applies_markdown_metadata` expected the title/subtitle pair `\\\large` (pre-spacing format) but the article template now emits `\\[0.5em]\large` (commit `c9aff0f`); `test_article_template_supports_columns_option` expected the `twocolumn` documentclass option, but the article template intentionally omits it and uses `\twocolumn[…]` after `\maketitle` so `\@thanks` stays populated and affiliation footnotes survive (`\tsreplayfn` flushes them). Both assertions updated to match the current — correct — template behaviour.
|
|
26
|
+
- Python 3.10 compatibility regression: `enum.StrEnum` is 3.11+, but `requires-python = ">=3.10"` and the CI matrix exercises 3.10. The `tables` extension imported `StrEnum` unconditionally, breaking 50 test files at collection time on 3.10 (every test that transitively touches the markdown processor). Added a tiny version-guarded shim that subclasses `str, Enum` on 3.10 and re-exports the stdlib class on 3.11+. Aligned `ruff target-version` with `requires-python` so the version guard isn't flagged as `UP036 outdated version block`.
|
|
27
|
+
- Page-number prefix (`n1` / `n2`) leaking into grouped acronym tables produced by the `glossaries` package. Two-part fix: (1) bumped the `pyxindy` dependency to **0.0.7**, which routes every `markup-locref` slot (`:open` / `:close` / `:sep` / `:prefix`) through the existing `_normalize_markup_string` helper so the xindy `~n` newline escape no longer leaks into the rendered output (`_update_locfmt` previously copied the raw strings verbatim); (2) extended TeXSmith's defensive post-processor (`adapters/latex/engines/__init__.py`) to glob `*-gls` in addition to `*.gls` so files emitted by `\newglossary*{<type>}` (e.g. `glossary.technical-gls`) go through `sanitize_glossary_output` for users still on pyxindy <0.0.7.
|
|
28
|
+
- Glossary page numbers were not clickable: the `glossaries` package only wraps numbers in `\hyperpage` when `hyperref` is loaded *before* it. Both the `article` and `book` templates now load `babel` and `hyperref` before `\VAR{extra_packages}` (which carries `glossaries` via `ts-glossary`), enabling both babel-localised acronym titles and hyperref-backed clickable backreferences. Same constraint that applies to babel localisation, made explicit in the preamble comments.
|
|
29
|
+
- HTML comments (`<!-- ... -->`) are now stripped before rendering and no longer appear verbatim in the LaTeX output. A shared `core.html_utils.strip_html_comments` helper runs in `extract_slot_fragments` (before node serialisation, where `str(comment_node)` would otherwise silently drop the `<!--`/`-->` delimiters and expose the raw comment text) and from the `discard_unwanted` PRE-phase handler.
|
|
30
|
+
- `tabularx` column specifications now use `>{\raggedright\arraybackslash}X`, `>{\raggedleft\arraybackslash}X`, and `>{\centering\arraybackslash}X` for all columns (including the first), replacing the previous `l`/`X` split. This prevents text overflow in two-column (`twocolumn`) document layouts and improves line-breaking throughout.
|
|
31
|
+
- Inline formatting (bold, italic, etc.) inside quoted text (`"**bold**"`) is now correctly rendered — `AtomicString` was preventing further inline processing inside `<q>` elements.
|
|
32
|
+
- Silent exception swallowing in post-render rule/asset collection now emits a diagnostic warning instead of discarding the error.
|
|
33
|
+
- Nested list environments (`\begin{itemize}`) no longer appear glued to the parent item text on the same line; a newline is now inserted between the item content and any nested `\begin{itemize|enumerate|description}`.
|
|
34
|
+
- Table caption numbering no longer skips numbers (e.g. 1, 2, 4, …). `ts-extra` previously auto-loaded `ltablex` under single-column layouts, which silently transformed every `tabularx` into a `longtable` internally and bumped the `table` counter twice per use. Replaced by a plain `tabularx` load; explicit `longtable` is still detected on demand.
|
|
35
|
+
|
|
36
|
+
### Changed
|
|
37
|
+
|
|
38
|
+
- Removed dead code after the early `return` in `_allow_hyphenation` (unreachable lines).
|
|
39
|
+
- Dropped the unused `fragments` field from `ExecutionContext`; fragment resolution was already propagated through `template_overrides`.
|
|
40
|
+
- Deduplicated `runtime_common.get("code")` lookups in `_render_slot_fragments` into a single local variable.
|
|
41
|
+
- Reverted an uncommitted injection of `template_overrides` into the Jinja render context (`runtime_common`) — it had no consumer and exposed internal state unnecessarily.
|
|
42
|
+
- **Tables extension refactor (SSOT).** Introduced `texsmith.extensions.tables.constants` housing `TableAttr` (StrEnum for every `data-ts-*` attribute), `PERCENT_RE`, `ALIGN_ALIASES` / `ALIGN_WRAPPERS`, and a `Priority` class that documents each pipeline position. Removed the duplicate `_PERCENT_RE` in `layout.py`. Collapsed the three identical align/width/width-group validator triplets (`LeafColumn`, `ColumnGroup`, `ColumnConfig`) into a shared `_ColumnAttrs` base. Extracted a single `_consume_fence` helper used by both preprocessors and the block processor; the two preprocessors now fail identically (admonition surfaced on parse error) instead of diverging between silent fall-through and block-level error emission. Caption handling no longer wraps the table in a throwaway `<figure>` / `<figcaption>` to be unwrapped by `render_figures`; the `<caption>` is injected directly into the `<table>`. `render_figures` keeps its figure-with-table path (still reached by `pymdownx.blocks.caption`) and routes via a new `is_texsmith_table()` helper instead of literal attribute comparison. The `build_error_element` helper in `tables.html` lets the preprocessor and the block processor share admonition construction.
|
|
43
|
+
- **`slot_options` plumbing simplified.** The per-slot render flags (`SlotOptions`) now live only on `Document` and are read directly by the consumer (`extract_slot_fragments`) instead of being copied through `ExecutionContext` and `BinderContext`. The `parse_slot_mapping_with_options` and `extract_front_matter_slots_with_options` wrappers were removed; `parse_slot_mapping` and `extract_front_matter_slots` now always return a `(selectors, options)` tuple.
|
|
44
|
+
- **Fragment resolution extracted.** New `core.fragments.resolution` module with a typed `FragmentModifiers(append, prepend, disable)` dataclass, `parse_modifiers(raw)` for front-matter shapes, and a pure `merge_fragments(defaults, override, *, cli_enable, cli_disable)` function. `_resolve_fragments_list` is now a 15-line orchestrator instead of a 65-line dispatcher with three nested helpers.
|
|
45
|
+
- **Silent `except Exception` handlers documented or warned.** Font-fallback scans in `conversion/renderer.py` now emit a warning via the diagnostic emitter on failure; user-supplied `should_render` callbacks in `core/fragments` warn with the fragment name instead of silently swallowing the failure; the third-party template-distribution discovery in `templates/loader.py` keeps its broad catch but carries an explicit comment and `# noqa: BLE001` explaining why it is intentional.
|
|
46
|
+
|
|
47
|
+
### Removed
|
|
48
|
+
|
|
49
|
+
- **`ExecutionContext` and `BinderContext` merged into `ConversionContext`.** Both classes carried an almost identical set of fields resolved at two successive stages (pre- and post-template-binding); they were collapsed into a single `core.conversion_contexts.ConversionContext` with optional `config` / `template_binding` fields that become populated when `bind_template` runs. Dead fields dropped: `BinderContext.documents: list[Document]` (only ever appended, never read meaningfully), `BinderContext.bound_segments` (written in `_render_document`, never read). The file `core/execution.py` has been deleted.
|
|
50
|
+
|
|
51
|
+
- **Function renames tracking the new context class:**
|
|
52
|
+
- `resolve_execution_context` → `resolve_conversion_context` (returns the partially-populated `ConversionContext`).
|
|
53
|
+
- `build_binder_context` → `bind_template` (mutates the context in place to populate `config`, `template_binding`, and the template-refined `slot_requests`; same object returned for chaining). Its keyword parameter `execution=` is renamed to `context=`.
|
|
54
|
+
- `ConversionResult.binder_context` field renamed to `ConversionResult.context`.
|
|
55
|
+
|
|
56
|
+
## [0.2.2] - 2026-02-24
|
|
57
|
+
|
|
58
|
+
### Added
|
|
59
|
+
|
|
60
|
+
- CLI/API version reporting (`texsmith --version`, `get_version()`).
|
|
61
|
+
- Configurable HTTP user agent for remote asset and emoji fetching (`--http-user-agent` / `TEXSMITH_HTTP_USER_AGENT`).
|
|
62
|
+
- TLS download helper with cert guidance for network fetches.
|
|
63
|
+
- Cached Wikipedia images for the book example under `.wiki/` with documentation.
|
|
64
|
+
|
|
65
|
+
### Changed
|
|
66
|
+
|
|
67
|
+
- Horizontal rules now force a page break in LaTeX output.
|
|
68
|
+
- Asset summaries hide temporary build roots and `.converted` cache files.
|
|
69
|
+
- Letter example no longer hard-codes the format, allowing snippet overrides; docs include local build steps.
|
|
70
|
+
- Book example images now resolve via raw GitHub URLs to avoid third‑party rate limits.
|
|
71
|
+
- CI now runs `apt-get update` before installing system dependencies.
|
|
72
|
+
|
|
73
|
+
### Fixed
|
|
74
|
+
|
|
75
|
+
- Playwright SVG conversion now handles `viewBox`-only SVGs to prevent blank PDFs.
|
|
76
|
+
- Suppressed noisy Tectonic `lineno` UTF‑8 warnings and made console output encoding-safe.
|
|
77
|
+
- XeTeX fallback transitions no longer leak across scripts; arrow glyphs prefer Noto Sans Symbols.
|
|
78
|
+
- Convert common Unicode symbols to LaTeX math macros to avoid missing glyphs.
|
|
79
|
+
|
|
80
|
+
## [0.1.0] - 2025-12-20
|
|
81
|
+
|
|
82
|
+
### Added
|
|
83
|
+
|
|
84
|
+
- Initial TeXSmith CLI for Markdown to LaTeX/PDF conversion, including multi-document rendering and slot-aware templates.
|
|
85
|
+
- Template system with built-in article/book/letter/snippet variants plus user template discovery and overrides.
|
|
86
|
+
- Fragment system for typography, geometry, fonts, glossary/index, code blocks, and callouts.
|
|
87
|
+
- Extensions for bibliography/citations, acronyms, mermaid/drawio diagrams, and rich admonitions.
|
|
88
|
+
- Asset pipeline for fonts/emoji, hashed assets, and download helpers for Tectonic/Biber/PyXindy.
|
|
89
|
+
- Documentation and examples (`docs/`, `mkdocs.yml`, `examples/`) plus developer docs and scripts (`README.md`, `DEVEL.md`, `scripts/`).
|
|
90
|
+
- Tooling and quality gates (`pyproject.toml`, `noxfile.py`, `Makefile`, tests, CI, coverage, ruff/pyright configs).
|
|
91
|
+
|
|
92
|
+
### Changed
|
|
93
|
+
|
|
94
|
+
- Renamed the project to TeXSmith and refactored the codebase into `src/texsmith` with a `texsmith.core` conversion pipeline.
|
|
95
|
+
- Reworked bibliography handling, front matter parsing, slot injection, and template rendering orchestration.
|
|
96
|
+
- Switched the default LaTeX engine to Tectonic and improved typography, headings, and smart punctuation defaults.
|
|
97
|
+
|
|
98
|
+
### Fixed
|
|
99
|
+
|
|
100
|
+
- Numerous issues across templates (article/book), MkDocs output, snippets, CI, and Windows compatibility.
|
|
101
|
+
|
|
102
|
+
### History
|
|
103
|
+
|
|
104
|
+
- 2025-10-18: Seeded the initial LaTeX renderer and template set under `latex/`.
|
|
105
|
+
- 2025-10-19: Added performance instrumentation and the first `docs/` content.
|
|
106
|
+
- 2025-10-20: CLI accepted Markdown input, introduced article templates, examples, and a `build` command.
|
|
107
|
+
- 2025-10-21: Added render phases, acronyms/index extensions, and renamed the project to TeXSmith.
|
|
108
|
+
- 2025-10-23: Added the EPFL thesis template, `LICENSE.md`, `DEVEL.md`, and multi-document CLI support.
|
|
109
|
+
- 2025-10-27: Major refactor around `texsmith.core`, `ConversionService`, diagnostics, and regression tests.
|
|
110
|
+
- 2025-11-16: Added the mermaid extension and expanded built-in templates and docs.
|
|
111
|
+
- 2025-11-24: Introduced rule/slot validation diagnostics and refined fragment registry behavior.
|
|
112
|
+
- 2025-11-27: Made Tectonic the default engine and added download helpers/Makefiles for fonts and tools.
|
|
113
|
+
- 2025-12-01: Added diagram generation via Playwright and `ts-typesetting` fragments.
|
|
114
|
+
- 2025-12-11: Polished CLI options, snippets, and CI pipelines leading up to the release tag.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: texsmith
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.3.0
|
|
4
4
|
Summary: A Markdown to LaTeX converter.
|
|
5
5
|
Project-URL: Homepage, https://github.com/yves-chevallier/texsmith
|
|
6
6
|
Author-email: Yves Chevallier <yves.chevalier@heig-vd.ch>
|
|
@@ -32,7 +32,7 @@ Requires-Dist: pymupdf>=1.24.3
|
|
|
32
32
|
Requires-Dist: pypdf>=6.1.1
|
|
33
33
|
Requires-Dist: python-markdown-math>=0.9
|
|
34
34
|
Requires-Dist: python-slugify>=8.0.4
|
|
35
|
-
Requires-Dist: pyxindy>=0.0.
|
|
35
|
+
Requires-Dist: pyxindy>=0.0.7
|
|
36
36
|
Requires-Dist: pyyaml>=6.0.3
|
|
37
37
|
Requires-Dist: requests>=2.32.5
|
|
38
38
|
Requires-Dist: rich>=13.9.0
|
|
@@ -57,7 +57,8 @@ Description-Content-Type: text/markdown
|
|
|
57
57
|
TeXSmith is a [Python](https://www.python.org/) package and CLI tool to convert **Markdown** or **HTML** documents into LaTeX format. It is designed to be extensible via templates and integrates with [MkDocs](https://www.mkdocs.org/) for generating printable documents from documentation sites.
|
|
58
58
|
|
|
59
59
|
<p align="center">
|
|
60
|
-
|
|
60
|
+
<!-- Absolute link for compatibility with PyPi -->
|
|
61
|
+
<img src="https://raw.githubusercontent.com/yves-chevallier/texsmith/master/docs/assets/ts-logo.svg" width="70%" />
|
|
61
62
|
</p>
|
|
62
63
|
|
|
63
64
|
## TL;DR
|
|
@@ -67,6 +68,8 @@ pip install texsmith
|
|
|
67
68
|
texsmith input.md input.bib -o build/ --build
|
|
68
69
|
```
|
|
69
70
|
|
|
71
|
+
Check the installed version with `texsmith --version` or in Python with `texsmith.get_version()`.
|
|
72
|
+
|
|
70
73
|
## Key features
|
|
71
74
|
|
|
72
75
|
- **MkDocs-native Markdown** – Ships with the same Material + pymdown extension stack you use in MkDocs, so tabs, callouts, annotations, tooltips, and data tables survive the conversion.
|
|
@@ -14,7 +14,8 @@
|
|
|
14
14
|
TeXSmith is a [Python](https://www.python.org/) package and CLI tool to convert **Markdown** or **HTML** documents into LaTeX format. It is designed to be extensible via templates and integrates with [MkDocs](https://www.mkdocs.org/) for generating printable documents from documentation sites.
|
|
15
15
|
|
|
16
16
|
<p align="center">
|
|
17
|
-
|
|
17
|
+
<!-- Absolute link for compatibility with PyPi -->
|
|
18
|
+
<img src="https://raw.githubusercontent.com/yves-chevallier/texsmith/master/docs/assets/ts-logo.svg" width="70%" />
|
|
18
19
|
</p>
|
|
19
20
|
|
|
20
21
|
## TL;DR
|
|
@@ -24,6 +25,8 @@ pip install texsmith
|
|
|
24
25
|
texsmith input.md input.bib -o build/ --build
|
|
25
26
|
```
|
|
26
27
|
|
|
28
|
+
Check the installed version with `texsmith --version` or in Python with `texsmith.get_version()`.
|
|
29
|
+
|
|
27
30
|
## Key features
|
|
28
31
|
|
|
29
32
|
- **MkDocs-native Markdown** – Ships with the same Material + pymdown extension stack you use in MkDocs, so tabs, callouts, annotations, tooltips, and data tables survive the conversion.
|
|
@@ -31,7 +31,6 @@ Roadmap and development notes for TeXSmith. I keep this file as a running checkl
|
|
|
31
31
|
- [ ] Support for `tocloft` package to customize list of figures/tables
|
|
32
32
|
- [ ] Support for `enumitem` package to customize lists
|
|
33
33
|
- [ ] Develop submodules as standalone plugins
|
|
34
|
-
- [ ] Marginalia (`marginpar` package with footnotes syntax)
|
|
35
34
|
- [ ] Epigraph Plugin
|
|
36
35
|
- [ ] Letterine
|
|
37
36
|
- [ ] Custom variables to insert in a document using mustaches
|
|
@@ -134,6 +134,9 @@ $ texsmith --help
|
|
|
134
134
|
`--hash-assets`
|
|
135
135
|
: Hash the filenames of stored assets instead of preserving their original names. This helps avoid filename collisions when multiple assets with the same name are used in different documents.
|
|
136
136
|
|
|
137
|
+
`--http-user-agent`
|
|
138
|
+
: Override the User-Agent header used when fetching remote assets (images, emoji). You can also set `TEXSMITH_HTTP_USER_AGENT` in the environment.
|
|
139
|
+
|
|
137
140
|
`--manifest`, `-m`
|
|
138
141
|
: Generate a `manifest.json` file alongside the LaTeX output, containing metadata about the rendered document, including input sources, template details, and rendering options.
|
|
139
142
|
|
|
@@ -98,3 +98,15 @@ The former French AFNOR standard **NF Z 11-001**, replaced by ISO 269 back in 19
|
|
|
98
98
|
While our documentation already covers the underlying standards that govern letter layout, what actually matters in practice is finding a tool that can embody these rules with precision, consistency, and a healthy respect for typographic sanity. This is the point where LaTeX—and specifically KOMA-Script’s `scrlttr2`—quietly distinguishes itself from the rest. Designed in the German tradition of rigorous typesetting, `scrlttr2` follows the logic of formal letter standards with an almost pedantic accuracy, offering a layout engine that behaves predictably and stays faithful to the structural constraints imposed by modern correspondence norms. Yet it remains flexible enough to emulate the conventions of other national styles without falling apart or requiring awkward hacks.
|
|
99
99
|
|
|
100
100
|
In short, choosing `scrlttr2` was less about tradition and more about engineering. It gives us a letter typesetting engine that is standards-aware, robust enough for large-scale automation, and structured enough to keep our layouts consistent across contexts. It is not the easiest tool, nor the most forgiving, but for anyone who values correctness, longevity, and the quiet satisfaction of seeing a letter snap perfectly into place, it is simply the right one.
|
|
101
|
+
|
|
102
|
+
## Build the exemple locally
|
|
103
|
+
|
|
104
|
+
To build the letter example locally, navigate to the `examples/letter` directory and run the following command:
|
|
105
|
+
|
|
106
|
+
```bash
|
|
107
|
+
git clone https://github.com/yves-chevallier/texsmith.git
|
|
108
|
+
cd texsmith
|
|
109
|
+
uv sync
|
|
110
|
+
cd examples/letter
|
|
111
|
+
make
|
|
112
|
+
```
|
|
@@ -15,7 +15,7 @@ Templates define the layout and expose slots that get filled with content from y
|
|
|
15
15
|
`Document.from_markdown` runs Python-Markdown with the bundled extensions (smallcaps, texlogos, index, Mermaid, raw LaTeX fences, etc.), extracts front matter, and caches the resulting HTML. `Document.from_html` can either keep the whole file or extract a selector (`article.md-content__inner` by default). Heading strategies are decided here (keep, drop, or promote the first heading into `press.title`), numbering defaults are resolved, and slot directives declared in front matter (`press.slot.*`) are seeded into the document slot mapping.
|
|
16
16
|
|
|
17
17
|
3. **Bind the template and attributes**
|
|
18
|
-
`
|
|
18
|
+
`bind_template` resolves which template runtime to use (`TemplateBinding`) and which slots exist. Template attributes declared in `manifest.toml` (`TemplateAttributeSpec`) are merged in a strict order: template defaults → fragment defaults → front matter (`press.*` or direct fields) → CLI/session overrides. Attribute ownership is enforced so two fragments or the template cannot claim the same attribute. Before anything renders, mustache placeholders in HTML, front matter, and template overrides are expanded against the merged context so later stages see concrete values.
|
|
19
19
|
|
|
20
20
|
4. **Split content into slots**
|
|
21
21
|
Slot requests come from CLI `--slot`, front matter, or defaults. `extract_slot_fragments` walks the HTML to find the requested headings/IDs, pulls those sections out, and assigns them to template slots (abstract, mainmatter, appendix, etc.). Base heading levels and offsets are computed per slot so sectioning commands line up with the template’s depth configuration. Any missing selectors produce warnings and the remainder of the document flows into the default slot.
|
|
@@ -40,10 +40,14 @@ written into the build directory as `ts-*.sty` and loaded via
|
|
|
40
40
|
|
|
41
41
|
## Using fragments in documents
|
|
42
42
|
|
|
43
|
-
Fragments are declared under the `press.fragments`
|
|
43
|
+
Fragments are declared under the `press.fragments` key in front matter. Each
|
|
44
44
|
entry is either the name of a built-in fragment or a path to a custom Jinja
|
|
45
45
|
template (absolute or relative to the Markdown file).
|
|
46
46
|
|
|
47
|
+
### Explicit list (replaces template defaults)
|
|
48
|
+
|
|
49
|
+
Provide a plain list to replace the template's default fragment set entirely:
|
|
50
|
+
|
|
47
51
|
```yaml
|
|
48
52
|
---
|
|
49
53
|
press:
|
|
@@ -58,6 +62,30 @@ press:
|
|
|
58
62
|
---
|
|
59
63
|
```
|
|
60
64
|
|
|
65
|
+
### Modifier dict (extends template defaults)
|
|
66
|
+
|
|
67
|
+
When you only need to add or remove a few fragments without restating the full
|
|
68
|
+
list, use the dict form with any combination of `append`, `prepend`, and
|
|
69
|
+
`disable`:
|
|
70
|
+
|
|
71
|
+
```yaml
|
|
72
|
+
---
|
|
73
|
+
press:
|
|
74
|
+
template: article
|
|
75
|
+
fragments:
|
|
76
|
+
append:
|
|
77
|
+
- ./fragments/heiglogo # add a custom fragment at the end
|
|
78
|
+
prepend:
|
|
79
|
+
- ./fragments/header # add a fragment at the start
|
|
80
|
+
disable:
|
|
81
|
+
- ts-geometry # remove a specific built-in fragment
|
|
82
|
+
---
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
All three keys are optional. Omitted keys leave the corresponding part of the
|
|
86
|
+
default list unchanged. `disable` is applied first (before `prepend`/`append`),
|
|
87
|
+
so the same fragment cannot appear in both `disable` and `prepend`/`append`.
|
|
88
|
+
|
|
61
89
|
TeXSmith renders each fragment into the output directory and injects the
|
|
62
90
|
corresponding `\usepackage{…}` lines into `\VAR{extra_packages}`.
|
|
63
91
|
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
# Abbreviations / Acronyms
|
|
2
|
+
|
|
3
|
+
Enable the `texsmith.abbr` extension and you can sprinkle definitions directly into your Markdown. Drop the abbreviation between square brackets, follow it with the expanded form in parentheses, and the parser does the rest.
|
|
4
|
+
|
|
5
|
+
```markdown
|
|
6
|
+
The HTML specification is maintained by the W3C.
|
|
7
|
+
|
|
8
|
+
*[HTML]: HyperText Markup Language
|
|
9
|
+
*[W3C]: World Wide Web Consortium
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
TeXSmith renders that snippet as:
|
|
13
|
+
|
|
14
|
+
```text
|
|
15
|
+
$ uv run texsmith abbr.md
|
|
16
|
+
The \acrshort{HTML} specification is maintained by the \acrshort{W3C}.
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
Which displays as:
|
|
20
|
+
|
|
21
|
+
```md {.snippet width="65%"}
|
|
22
|
+
---
|
|
23
|
+
press:
|
|
24
|
+
template: article
|
|
25
|
+
paper:
|
|
26
|
+
width: 150mm
|
|
27
|
+
height: 90mm
|
|
28
|
+
orientation: landscape
|
|
29
|
+
frame: true
|
|
30
|
+
fragments:
|
|
31
|
+
ts-frame
|
|
32
|
+
---
|
|
33
|
+
The HTML specification is maintained by the W3C.
|
|
34
|
+
|
|
35
|
+
*[HTML]: HyperText Markup Language
|
|
36
|
+
*[W3C]: World Wide Web Consortium
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
Of course, this also works on this HTML site. Try hovering over the abbreviations.
|
|
40
|
+
|
|
41
|
+
Acronyms are collected automatically during the LaTeX pass:
|
|
42
|
+
|
|
43
|
+
```text
|
|
44
|
+
$ uv run texsmith test.md -tarticle 1>/dev/null
|
|
45
|
+
$ rg newacronym build/test.tex
|
|
46
|
+
92:\newacronym{HTML}{HTML}{HyperText Markup Language}
|
|
47
|
+
93:\newacronym{W3C}{W3C}{World Wide Web Consortium}
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
## Front-matter glossary
|
|
51
|
+
|
|
52
|
+
For longer documents you can declare acronyms in a structured `glossary:` section
|
|
53
|
+
in the YAML front matter. Each entry carries an explicit description and may be
|
|
54
|
+
attached to a group; TeXSmith renders one localised `\printglossary` table per
|
|
55
|
+
group (in declaration order) followed by a default table for ungrouped entries.
|
|
56
|
+
The legacy `*[KEY]: …` body syntax keeps working and merges with the
|
|
57
|
+
front-matter entries.
|
|
58
|
+
|
|
59
|
+
```yaml
|
|
60
|
+
---
|
|
61
|
+
glossary:
|
|
62
|
+
style: long # default; any glossaries-package style works
|
|
63
|
+
groups:
|
|
64
|
+
technique: Acronymes techniques
|
|
65
|
+
institutionnel: Acronymes institutionnels
|
|
66
|
+
entries:
|
|
67
|
+
API:
|
|
68
|
+
group: technique
|
|
69
|
+
description: Application Programming Interface
|
|
70
|
+
ONU:
|
|
71
|
+
group: institutionnel
|
|
72
|
+
description: Organisation des Nations Unies
|
|
73
|
+
DOI: Digital Object Identifier # short form: ungrouped, description only
|
|
74
|
+
---
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
The section is validated with pydantic, so unknown keys, missing descriptions,
|
|
78
|
+
or references to undeclared groups raise a clear error at conversion time. The
|
|
79
|
+
default acronym-table title follows the document language (it expands to
|
|
80
|
+
`\acronymname` from the `glossaries` package, which is localised by `babel`).
|
|
81
|
+
|
|
82
|
+
### Automatic substitution and limitations
|
|
83
|
+
|
|
84
|
+
Unlike LaTeX, TeXSmith does **not** require `\gls{…}` / `\Gls{…}` calls in the
|
|
85
|
+
source: the converter scans the body and replaces every **strict, case-sensitive**
|
|
86
|
+
match of an acronym key with `\acrshort{KEY}`. As a consequence, casing helpers
|
|
87
|
+
such as `\Gls`, `\GLS`, `\acrlong`, etc. are not synthesised — the substitution
|
|
88
|
+
is the same regardless of where the acronym appears in the text. If you need
|
|
89
|
+
those forms, drop down to raw LaTeX (e.g. with an explicit `\Gls{KEY}` written
|
|
90
|
+
as a raw-LaTeX inline).
|
|
91
|
+
|
|
92
|
+
*[HTML]: HyperText Markup Language
|
|
93
|
+
*[W3C]: World Wide Web Consortium
|
|
@@ -142,9 +142,9 @@ Caption: This is the caption for the figure.
|
|
|
142
142
|
Tables follow the same pattern:
|
|
143
143
|
|
|
144
144
|
```md
|
|
145
|
+
Table: This is the caption for the table. {#my-table}
|
|
146
|
+
|
|
145
147
|
| Header 1 | Header 2 |
|
|
146
148
|
|----------|----------|
|
|
147
149
|
| Cell 1 | Cell 2 |
|
|
148
|
-
|
|
149
|
-
Table: This is the caption for the table. {#my-table, short="Short caption for list of tables"}
|
|
150
150
|
```
|