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.
Files changed (531) hide show
  1. texsmith-0.3.0/.github/issues/plain-md-caption-inline-formatting.md +134 -0
  2. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/.github/workflows/ci.yml +22 -10
  3. texsmith-0.3.0/.wiki/1919_eclipse_positive.jpg +0 -0
  4. texsmith-0.3.0/.wiki/Albert_Einstein_and_Charlie_Chaplin_City_Lights_premiere_1931.jpg +0 -0
  5. texsmith-0.3.0/.wiki/Albert_Einstein_and_his_wife_Mileva_Maric.jpg +0 -0
  6. texsmith-0.3.0/.wiki/Albert_Einstein_as_a_child.jpg +0 -0
  7. texsmith-0.3.0/.wiki/Einstein-Oslofjord_cropped.jpg +0 -0
  8. texsmith-0.3.0/.wiki/README.md +20 -0
  9. texsmith-0.3.0/CHANGELOG.md +114 -0
  10. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/PKG-INFO +6 -3
  11. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/README.md +4 -1
  12. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/about/devel/index.md +0 -1
  13. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/cli/index.md +3 -0
  14. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/examples/letters.md +12 -0
  15. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/guide/plumbing/pipeline.md +1 -1
  16. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/guide/templates/fragments.md +29 -1
  17. texsmith-0.3.0/docs/syntax/abbr.md +93 -0
  18. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/syntax/captions.md +2 -2
  19. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/syntax/notes.md +77 -0
  20. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/syntax/supported.md +3 -2
  21. texsmith-0.3.0/docs/syntax/tables.md +444 -0
  22. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/pyproject.toml +5 -2
  23. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/scripts/ci/python_versions.py +1 -0
  24. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/__init__.py +3 -6
  25. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/handlers/_assets.py +12 -0
  26. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/handlers/admonitions.py +2 -0
  27. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/handlers/basic.py +3 -0
  28. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/handlers/blocks.py +34 -3
  29. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/handlers/inline.py +16 -12
  30. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/latex/engines/__init__.py +9 -1
  31. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/latex/engines/tectonic/__init__.py +25 -1
  32. texsmith-0.3.0/src/texsmith/adapters/latex/partials/horizontal_rule.tex +1 -0
  33. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/latex/partials/table.tex +6 -11
  34. texsmith-0.3.0/src/texsmith/adapters/latex/partials/yaml_table.tex +39 -0
  35. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/latex/tectonic.py +2 -2
  36. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/latex/utils.py +22 -0
  37. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/markdown/__init__.py +18 -0
  38. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/transformers/strategies.py +39 -8
  39. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/core/context.py +2 -0
  40. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/core/conversion/__init__.py +2 -0
  41. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/core/conversion/core.py +72 -81
  42. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/core/conversion/execution.py +45 -47
  43. texsmith-0.3.0/src/texsmith/core/conversion/glossary.py +239 -0
  44. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/core/conversion/inputs.py +63 -23
  45. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/core/conversion/models.py +1 -0
  46. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/core/conversion/renderer.py +23 -17
  47. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/core/conversion/service.py +1 -1
  48. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/core/conversion/templates.py +36 -30
  49. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/core/conversion_contexts.py +32 -11
  50. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/core/documents.py +11 -2
  51. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/core/fragments/__init__.py +80 -4
  52. texsmith-0.3.0/src/texsmith/core/fragments/resolution.py +124 -0
  53. texsmith-0.3.0/src/texsmith/core/html_utils.py +25 -0
  54. texsmith-0.3.0/src/texsmith/core/http.py +57 -0
  55. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/core/templates/loader.py +6 -1
  56. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/core/templates/wrapper.py +41 -0
  57. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/extensions/__init__.py +12 -0
  58. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/extensions/latex_raw.py +4 -1
  59. texsmith-0.3.0/src/texsmith/extensions/marginnote/__init__.py +14 -0
  60. texsmith-0.3.0/src/texsmith/extensions/marginnote/markdown.py +102 -0
  61. texsmith-0.3.0/src/texsmith/extensions/marginnote/renderer.py +73 -0
  62. texsmith-0.3.0/src/texsmith/extensions/tables/__init__.py +77 -0
  63. texsmith-0.3.0/src/texsmith/extensions/tables/constants.py +158 -0
  64. texsmith-0.3.0/src/texsmith/extensions/tables/html.py +353 -0
  65. texsmith-0.3.0/src/texsmith/extensions/tables/layout.py +340 -0
  66. texsmith-0.3.0/src/texsmith/extensions/tables/markdown.py +698 -0
  67. texsmith-0.3.0/src/texsmith/extensions/tables/renderer.py +316 -0
  68. texsmith-0.3.0/src/texsmith/extensions/tables/schema.py +868 -0
  69. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/fonts/coverage.py +2 -3
  70. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/fonts/downloader.py +4 -2
  71. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/fonts/fallback.py +32 -1
  72. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/fonts/ucharclasses.py +2 -2
  73. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/fragments/extra/__init__.py +11 -9
  74. texsmith-0.3.0/src/texsmith/fragments/extra/ts-extra.jinja.tex +61 -0
  75. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/fragments/fonts/__init__.py +2 -2
  76. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/fragments/fonts/ts-fonts.jinja.sty +0 -5
  77. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/fragments/glossary/__init__.py +6 -1
  78. texsmith-0.3.0/src/texsmith/fragments/glossary/ts-glossary-backmatter.jinja.tex +38 -0
  79. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/fragments/glossary/ts-glossary.jinja.sty +14 -0
  80. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/quotes.py +1 -2
  81. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/templates/article/template/manifest.toml +20 -0
  82. texsmith-0.3.0/src/texsmith/templates/article/template/template.tex +186 -0
  83. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/templates/book/template/template.tex +7 -2
  84. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/ui/cli/_options.py +10 -0
  85. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/ui/cli/commands/render.py +20 -3
  86. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/ui/cli/presenter.py +18 -1
  87. texsmith-0.3.0/src/texsmith/version.py +16 -0
  88. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_api_service.py +14 -15
  89. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_article_template.py +10 -10
  90. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_blocks.py +29 -1
  91. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_cli.py +95 -0
  92. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_cli_convert.py +4 -1
  93. texsmith-0.3.0/tests/test_fragment_resolution.py +208 -0
  94. texsmith-0.3.0/tests/test_front_matter_glossary.py +269 -0
  95. texsmith-0.3.0/tests/test_lists.py +114 -0
  96. texsmith-0.3.0/tests/test_marginnote_extension.py +226 -0
  97. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_markdown_quotes.py +13 -0
  98. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_strip_tags.py +23 -0
  99. texsmith-0.3.0/tests/test_tables_html.py +291 -0
  100. texsmith-0.3.0/tests/test_tables_layout.py +450 -0
  101. texsmith-0.3.0/tests/test_tables_markdown.py +425 -0
  102. texsmith-0.3.0/tests/test_tables_renderer.py +317 -0
  103. texsmith-0.3.0/tests/test_tables_schema.py +761 -0
  104. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_template_attributes.py +78 -1
  105. texsmith-0.3.0/tests/test_version.py +17 -0
  106. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/uv.lock +50 -50
  107. texsmith-0.2.1.dev0/CHANGELOG.md +0 -65
  108. texsmith-0.2.1.dev0/docs/syntax/abbr.md +0 -51
  109. texsmith-0.2.1.dev0/docs/syntax/tables.md +0 -52
  110. texsmith-0.2.1.dev0/fonts-test.tex +0 -180
  111. texsmith-0.2.1.dev0/src/texsmith/adapters/latex/partials/horizontal_rule.tex +0 -1
  112. texsmith-0.2.1.dev0/src/texsmith/core/execution.py +0 -34
  113. texsmith-0.2.1.dev0/src/texsmith/fragments/extra/ts-extra.jinja.tex +0 -13
  114. texsmith-0.2.1.dev0/src/texsmith/fragments/glossary/ts-glossary-backmatter.jinja.tex +0 -23
  115. texsmith-0.2.1.dev0/src/texsmith/templates/article/template/template.tex +0 -74
  116. texsmith-0.2.1.dev0/test.md +0 -12
  117. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/.editorconfig +0 -0
  118. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/.gitignore +0 -0
  119. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/.vscode/settings.json +0 -0
  120. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/AGENT.md +0 -0
  121. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/LICENSE.md +0 -0
  122. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/Makefile +0 -0
  123. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/.nav.yml +0 -0
  124. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/about/.nav.yml +0 -0
  125. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/about/author.md +0 -0
  126. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/about/contribute.md +0 -0
  127. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/about/devel/config.md +0 -0
  128. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/about/devel/glossary.md +0 -0
  129. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/about/devel/plugins.md +0 -0
  130. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/about/devel/tables.md +0 -0
  131. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/about/index.md +0 -0
  132. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/about/license.md +0 -0
  133. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/about/other-resources.md +0 -0
  134. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/about/release-notes.md +0 -0
  135. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/about/versioning.md +0 -0
  136. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/api/bibliography.md +0 -0
  137. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/api/cli.md +0 -0
  138. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/api/core.md +0 -0
  139. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/api/custom-transformers.md +0 -0
  140. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/api/handlers.md +0 -0
  141. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/api/high-level.md +0 -0
  142. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/api/index.md +0 -0
  143. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/api/latex.md +0 -0
  144. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/api/markdown.md +0 -0
  145. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/api/plugins.md +0 -0
  146. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/api/transformers.md +0 -0
  147. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/assets/.nav.yml +0 -0
  148. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/assets/drawio-viewer.js +0 -0
  149. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/assets/examples/README.md +0 -0
  150. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/assets/examples/cheese.bib +0 -0
  151. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/assets/examples/cheese.md +0 -0
  152. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/assets/examples/code.py +0 -0
  153. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/assets/examples/dialects.md +0 -0
  154. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/assets/examples/mozzarella.svg +0 -0
  155. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/assets/js/auto-reload.js +0 -0
  156. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/assets/mermaid.mmd +0 -0
  157. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/assets/mermaid.svg +0 -0
  158. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/assets/pipeline.png +0 -0
  159. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/assets/standards.svg +0 -0
  160. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/assets/ts-anvil.svg +0 -0
  161. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/assets/ts-dark.svg +0 -0
  162. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/assets/ts-light.svg +0 -0
  163. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/assets/ts-logo.svg +0 -0
  164. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/assets/workflow.drawio +0 -0
  165. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/cli/bibliography.md +0 -0
  166. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/cli/build.md +0 -0
  167. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/cli/slots.md +0 -0
  168. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/cli/templates.md +0 -0
  169. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/css/brand.css +0 -0
  170. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/css/extra.css +0 -0
  171. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/examples/book.md +0 -0
  172. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/examples/colorful.md +0 -0
  173. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/examples/cooking.md +0 -0
  174. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/examples/diagrams.md +0 -0
  175. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/examples/index.md +0 -0
  176. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/examples/languages.md +0 -0
  177. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/examples/paper.md +0 -0
  178. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/examples/pgcd.drawio +0 -0
  179. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/examples/snippet-configs/letter.yml +0 -0
  180. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/examples/snippets.md +0 -0
  181. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/examples/texsmith.md +0 -0
  182. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/guide/.nav.yml +0 -0
  183. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/guide/extensions.md +0 -0
  184. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/guide/features/.nav.yml +0 -0
  185. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/guide/features/acronyms.md +0 -0
  186. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/guide/features/bibliography.md +0 -0
  187. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/guide/features/headings.md +0 -0
  188. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/guide/features/listings.md +0 -0
  189. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/guide/features/tags.md +0 -0
  190. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/guide/fonts.md +0 -0
  191. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/guide/fragments/.nav.yml +0 -0
  192. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/guide/fragments/geometry.md +0 -0
  193. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/guide/fragments/glossary.md +0 -0
  194. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/guide/fragments/index.md +0 -0
  195. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/guide/fragments/typesetting.md +0 -0
  196. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/guide/front-matter.md +0 -0
  197. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/guide/getting-started.md +0 -0
  198. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/guide/limitations.md +0 -0
  199. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/guide/metadata.md +0 -0
  200. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/guide/mkdocs.md +0 -0
  201. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/guide/plumbing/.nav.yml +0 -0
  202. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/guide/plumbing/engines.md +0 -0
  203. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/guide/plumbing/index.md +0 -0
  204. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/guide/plumbing/latex.md +0 -0
  205. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/guide/plumbing/tex.md +0 -0
  206. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/guide/tectonic.md +0 -0
  207. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/guide/templates/discovery.md +0 -0
  208. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/guide/templates/index.md +0 -0
  209. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/guide/templates/mermaid.md +0 -0
  210. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/guide/templates/partials.md +0 -0
  211. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/guide/templates/template-cookbook.md +0 -0
  212. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/guide/troubleshooting.md +0 -0
  213. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/hooks/mkdocs_hooks.py +0 -0
  214. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/index.md +0 -0
  215. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/js/mathjax.js +0 -0
  216. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/syntax/admonitions.md +0 -0
  217. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/syntax/code.md +0 -0
  218. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/syntax/deflists.md +0 -0
  219. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/syntax/extra.md +0 -0
  220. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/syntax/formatting.md +0 -0
  221. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/syntax/images.md +0 -0
  222. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/syntax/index.md +0 -0
  223. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/syntax/math.md +0 -0
  224. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/syntax/mermaid.md +0 -0
  225. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/syntax/progressbar.md +0 -0
  226. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/syntax/references.md +0 -0
  227. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/syntax/smartypants.md +0 -0
  228. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/syntax/wikilinks.md +0 -0
  229. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/docs/texsmith-logo.pdf +0 -0
  230. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/mkdocs.yml +0 -0
  231. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/noxfile.py +0 -0
  232. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/packages/mkdocs_texsmith/.editorconfig +0 -0
  233. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/packages/mkdocs_texsmith/.gitignore +0 -0
  234. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/packages/mkdocs_texsmith/.markdownlint.yaml +0 -0
  235. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/packages/mkdocs_texsmith/LICENSE.md +0 -0
  236. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/packages/mkdocs_texsmith/Makefile +0 -0
  237. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/packages/mkdocs_texsmith/README.md +0 -0
  238. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/packages/mkdocs_texsmith/docs/about.md +0 -0
  239. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/packages/mkdocs_texsmith/docs/images/latex-hummingbird.svg +0 -0
  240. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/packages/mkdocs_texsmith/docs/index.md +0 -0
  241. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/packages/mkdocs_texsmith/hatch_build.py +0 -0
  242. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/packages/mkdocs_texsmith/mkdocs.yml +0 -0
  243. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/packages/mkdocs_texsmith/noxfile.py +0 -0
  244. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/packages/mkdocs_texsmith/pyproject.toml +0 -0
  245. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/packages/mkdocs_texsmith/src/mkdocs_plugin_texsmith/__init__.py +0 -0
  246. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/packages/mkdocs_texsmith/src/mkdocs_plugin_texsmith/plugin.py +0 -0
  247. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/packages/mkdocs_texsmith/tests/test_import.py +0 -0
  248. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/packages/mkdocs_texsmith/tests/test_plugin_config.py +0 -0
  249. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/packages/mkdocs_texsmith/uv.lock +0 -0
  250. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/pyrightconfig.json +0 -0
  251. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/scripts/refresh_cli_help.sh +0 -0
  252. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/__init__.py +0 -0
  253. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/docker.py +0 -0
  254. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/handlers/__init__.py +0 -0
  255. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/handlers/_helpers.py +0 -0
  256. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/handlers/_mermaid.py +0 -0
  257. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/handlers/code.py +0 -0
  258. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/handlers/links.py +0 -0
  259. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/handlers/media.py +0 -0
  260. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/latex/__init__.py +0 -0
  261. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/latex/engines/latex/__init__.py +0 -0
  262. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/latex/engines/latex/log.py +0 -0
  263. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/latex/engines/latex/runner.py +0 -0
  264. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/latex/formatter.py +0 -0
  265. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/latex/latexmk.py +0 -0
  266. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/latex/partials/acronym.tex +0 -0
  267. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/latex/partials/add.tex +0 -0
  268. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/latex/partials/addition.tex +0 -0
  269. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/latex/partials/blockquote.tex +0 -0
  270. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/latex/partials/callout.tex +0 -0
  271. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/latex/partials/choices.tex +0 -0
  272. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/latex/partials/citation.tex +0 -0
  273. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/latex/partials/codeblock.tex +0 -0
  274. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/latex/partials/codeblock_listings.tex +0 -0
  275. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/latex/partials/codeblock_pygments.tex +0 -0
  276. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/latex/partials/codeblock_verbatim.tex +0 -0
  277. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/latex/partials/codeinline.tex +0 -0
  278. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/latex/partials/codeinlinett.tex +0 -0
  279. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/latex/partials/comment.tex +0 -0
  280. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/latex/partials/del.tex +0 -0
  281. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/latex/partials/deletion.tex +0 -0
  282. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/latex/partials/description_list.tex +0 -0
  283. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/latex/partials/enquote.tex +0 -0
  284. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/latex/partials/epigraph.tex +0 -0
  285. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/latex/partials/exercises_solutions.tex +0 -0
  286. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/latex/partials/figure.tex +0 -0
  287. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/latex/partials/figure_tcolorbox.tex +0 -0
  288. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/latex/partials/footnote.tex +0 -0
  289. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/latex/partials/glossary.tex +0 -0
  290. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/latex/partials/heading.tex +0 -0
  291. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/latex/partials/highlight.tex +0 -0
  292. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/latex/partials/href.tex +0 -0
  293. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/latex/partials/icon.tex +0 -0
  294. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/latex/partials/include.tex +0 -0
  295. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/latex/partials/index.tex +0 -0
  296. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/latex/partials/italic.tex +0 -0
  297. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/latex/partials/keystroke.tex +0 -0
  298. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/latex/partials/label.tex +0 -0
  299. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/latex/partials/list_acronyms.tex +0 -0
  300. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/latex/partials/list_glossary.tex +0 -0
  301. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/latex/partials/multicolumn.tex +0 -0
  302. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/latex/partials/ordered_list.tex +0 -0
  303. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/latex/partials/pagestyle.tex +0 -0
  304. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/latex/partials/ref.tex +0 -0
  305. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/latex/partials/regex.tex +0 -0
  306. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/latex/partials/smallcaps.tex +0 -0
  307. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/latex/partials/strikethrough.tex +0 -0
  308. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/latex/partials/strong.tex +0 -0
  309. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/latex/partials/subscript.tex +0 -0
  310. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/latex/partials/substitution.tex +0 -0
  311. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/latex/partials/superscript.tex +0 -0
  312. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/latex/partials/tabbed.tex +0 -0
  313. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/latex/partials/underline.tex +0 -0
  314. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/latex/partials/unordered_list.tex +0 -0
  315. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/latex/partials/url.tex +0 -0
  316. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/latex/pygments.py +0 -0
  317. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/latex/pyxindy.py +0 -0
  318. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/latex/renderer.py +0 -0
  319. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/latex/xindy/latex.xdy +0 -0
  320. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/latex/xindy/tex.xdy +0 -0
  321. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/plugins/__init__.py +0 -0
  322. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/plugins/material.py +0 -0
  323. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/plugins/snippet.py +0 -0
  324. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/transformers/__init__.py +0 -0
  325. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/transformers/base.py +0 -0
  326. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/adapters/transformers/utils.py +0 -0
  327. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/core/__init__.py +0 -0
  328. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/core/bibliography/__init__.py +0 -0
  329. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/core/bibliography/collection.py +0 -0
  330. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/core/bibliography/doi.py +0 -0
  331. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/core/bibliography/issues.py +0 -0
  332. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/core/bibliography/parsing.py +0 -0
  333. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/core/callouts.py +0 -0
  334. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/core/config.py +0 -0
  335. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/core/conversion/_utils.py +0 -0
  336. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/core/conversion/debug.py +0 -0
  337. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/core/conversion/pipeline.py +0 -0
  338. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/core/diagnostics.py +0 -0
  339. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/core/exceptions.py +0 -0
  340. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/core/fonts/__init__.py +0 -0
  341. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/core/fragments/base.py +0 -0
  342. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/core/metadata.py +0 -0
  343. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/core/mustache.py +0 -0
  344. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/core/partials.py +0 -0
  345. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/core/rules.py +0 -0
  346. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/core/templates/__init__.py +0 -0
  347. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/core/templates/base.py +0 -0
  348. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/core/templates/builtins.py +0 -0
  349. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/core/templates/context_usage.py +0 -0
  350. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/core/templates/manifest.py +0 -0
  351. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/core/templates/runtime.py +0 -0
  352. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/core/templates/session.py +0 -0
  353. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/core/templates/text.py +0 -0
  354. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/core/user_dir.py +0 -0
  355. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/devtools.py +0 -0
  356. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/extensions/index/__init__.py +0 -0
  357. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/extensions/index/markdown.py +0 -0
  358. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/extensions/index/mkdocs_plugin.py +0 -0
  359. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/extensions/index/registry.py +0 -0
  360. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/extensions/index/renderer.py +0 -0
  361. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/extensions/index/templates/index.tex +0 -0
  362. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/extensions/latex_text.py +0 -0
  363. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/extensions/mermaid.py +0 -0
  364. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/extensions/missing_footnotes.py +0 -0
  365. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/extensions/multi_citations.py +0 -0
  366. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/extensions/progressbar/__init__.py +0 -0
  367. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/extensions/progressbar/markdown.py +0 -0
  368. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/extensions/progressbar/renderer.py +0 -0
  369. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/extensions/smallcaps.py +0 -0
  370. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/extensions/texlogos/__init__.py +0 -0
  371. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/extensions/texlogos/markdown.py +0 -0
  372. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/extensions/texlogos/renderer.py +0 -0
  373. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/extensions/texlogos/specs.py +0 -0
  374. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/fonts/__init__.py +0 -0
  375. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/fonts/cache.py +0 -0
  376. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/fonts/constants.py +0 -0
  377. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/fonts/html_scripts.py +0 -0
  378. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/fonts/logging.py +0 -0
  379. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/fonts/pipeline.py +0 -0
  380. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/fonts/scripts.py +0 -0
  381. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/fragments/__init__.py +0 -0
  382. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/fragments/bibliography/__init__.py +0 -0
  383. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/fragments/bibliography/fragment.toml +0 -0
  384. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/fragments/bibliography/ts-bibliography-backmatter.jinja.tex +0 -0
  385. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/fragments/bibliography/ts-bibliography.jinja.tex +0 -0
  386. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/fragments/callouts/__init__.py +0 -0
  387. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/fragments/callouts/fragment.toml +0 -0
  388. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/fragments/callouts/ts-callouts.jinja.sty +0 -0
  389. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/fragments/code/__init__.py +0 -0
  390. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/fragments/code/fragment.toml +0 -0
  391. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/fragments/code/ts-code.jinja.sty +0 -0
  392. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/fragments/extra/fragment.toml +0 -0
  393. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/fragments/fonts/fragment.toml +0 -0
  394. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/fragments/frame/__init__.py +0 -0
  395. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/fragments/frame/fragment.toml +0 -0
  396. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/fragments/frame/ts-frame.tex.jinja +0 -0
  397. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/fragments/geometry/__init__.py +0 -0
  398. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/fragments/geometry/fragment.toml +0 -0
  399. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/fragments/geometry/paper.py +0 -0
  400. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/fragments/geometry/ts_geometry.tex.jinja +0 -0
  401. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/fragments/glossary/fragment.toml +0 -0
  402. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/fragments/index/__init__.py +0 -0
  403. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/fragments/index/fragment.toml +0 -0
  404. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/fragments/index/ts-index-backmatter.jinja.tex +0 -0
  405. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/fragments/index/ts-index.jinja.sty +0 -0
  406. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/fragments/keystrokes/__init__.py +0 -0
  407. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/fragments/keystrokes/fragment.toml +0 -0
  408. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/fragments/keystrokes/ts-keystrokes.jinja.sty +0 -0
  409. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/fragments/todolist/__init__.py +0 -0
  410. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/fragments/todolist/fragment.toml +0 -0
  411. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/fragments/todolist/ts-todolist.jinja.sty +0 -0
  412. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/fragments/typesetting/__init__.py +0 -0
  413. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/fragments/typesetting/fragment.toml +0 -0
  414. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/fragments/typesetting/ts-typesetting.tex.jinja +0 -0
  415. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/index.py +0 -0
  416. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/plugins/__init__.py +0 -0
  417. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/progressbar.py +0 -0
  418. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/smart_dashes.py +0 -0
  419. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/templates/__init__.py +0 -0
  420. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/templates/article/README.md +0 -0
  421. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/templates/article/__init__.py +0 -0
  422. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/templates/article/template/mermaid-config.json +0 -0
  423. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/templates/book/README.md +0 -0
  424. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/templates/book/__init__.py +0 -0
  425. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/templates/book/overrides/codeblock.tex +0 -0
  426. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/templates/book/overrides/codeinline.tex +0 -0
  427. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/templates/book/template/fixtoc.sty +0 -0
  428. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/templates/book/template/manifest.toml +0 -0
  429. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/templates/common/__init__.py +0 -0
  430. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/templates/common/latexmkrc +0 -0
  431. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/templates/letter/README.md +0 -0
  432. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/templates/letter/__init__.py +0 -0
  433. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/templates/letter/demo.md +0 -0
  434. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/templates/letter/fonts/modernline bold.otf +0 -0
  435. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/templates/letter/fonts/modernline.otf +0 -0
  436. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/templates/letter/manifest.toml +0 -0
  437. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/templates/letter/template/callouts.jinja.sty +0 -0
  438. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/templates/letter/template/template.tex +0 -0
  439. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/templates/snippet/README.md +0 -0
  440. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/templates/snippet/__init__.py +0 -0
  441. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/templates/snippet/template/manifest.toml +0 -0
  442. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/templates/snippet/template/template.tex +0 -0
  443. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/texlogos.py +0 -0
  444. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/ui/__init__.py +0 -0
  445. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/ui/cli/__init__.py +0 -0
  446. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/ui/cli/app.py +0 -0
  447. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/ui/cli/bibliography.py +0 -0
  448. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/ui/cli/commands/__init__.py +0 -0
  449. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/ui/cli/commands/templates.py +0 -0
  450. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/ui/cli/diagnostics.py +0 -0
  451. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/ui/cli/state.py +0 -0
  452. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/src/texsmith/ui/cli/utils.py +0 -0
  453. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/fixtures/bib/a.bib +0 -0
  454. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/fixtures/bib/b.bib +0 -0
  455. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/fixtures/template-info/article.txt +0 -0
  456. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/fixtures/template-info/book.txt +0 -0
  457. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/fixtures/template-info/letter.txt +0 -0
  458. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/fixtures/template-info/snippet.txt +0 -0
  459. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_admonitions.py +0 -0
  460. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_assets.py +0 -0
  461. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_attribute_ownership.py +0 -0
  462. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_baseline_regressions.py +0 -0
  463. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_bibliography.py +0 -0
  464. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_bibliography_fragment.py +0 -0
  465. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_callouts.py +0 -0
  466. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_citations.py +0 -0
  467. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_cli_bibliography.py +0 -0
  468. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_cli_templates_commands.py +0 -0
  469. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_code_engines.py +0 -0
  470. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_combining_marks.py +0 -0
  471. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_counter_extension.py +0 -0
  472. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_data_script_rendering.py +0 -0
  473. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_dependency_warnings.py +0 -0
  474. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_diagnostics.py +0 -0
  475. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_diagrams_backend.py +0 -0
  476. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_docker.py +0 -0
  477. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_document_state.py +0 -0
  478. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_engine_helpers.py +0 -0
  479. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_extra_fragment.py +0 -0
  480. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_fallback_cache_refresh.py +0 -0
  481. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_fonts_fallback.py +0 -0
  482. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_formatting.py +0 -0
  483. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_fragment_configs.py +0 -0
  484. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_fragments/geometry.md +0 -0
  485. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_fragments.py +0 -0
  486. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_geometry_fragment.py +0 -0
  487. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_headings.py +0 -0
  488. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_html_script_detection.py +0 -0
  489. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_index_extension.py +0 -0
  490. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_latex_log.py +0 -0
  491. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_letter_template.py +0 -0
  492. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_links.py +0 -0
  493. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_markdown_latex_raw.py +0 -0
  494. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_markdown_latex_text.py +0 -0
  495. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_markdown_mermaid.py +0 -0
  496. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_markdown_module.py +0 -0
  497. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_markdown_smart_dashes.py +0 -0
  498. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_media_conversion.py +0 -0
  499. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_mkdocs/docs/code.md +0 -0
  500. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_mkdocs/docs/formatting.md +0 -0
  501. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_mkdocs/docs/headings.md +0 -0
  502. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_mkdocs/docs/index.md +0 -0
  503. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_mkdocs/docs/pgcd.drawio +0 -0
  504. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_mkdocs/mkdocs.yml +0 -0
  505. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_mkdocs_html.py +0 -0
  506. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_mkdocs_integration.py +0 -0
  507. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_mkdocs_plugin.py +0 -0
  508. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_mustache.py +0 -0
  509. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_partials.py +0 -0
  510. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_presenter.py +0 -0
  511. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_press_metadata.py +0 -0
  512. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_progressbar_extension.py +0 -0
  513. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_renderer_entry_points.py +0 -0
  514. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_renderer_fallback_manager.py +0 -0
  515. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_renderer_parser_fallback.py +0 -0
  516. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_rule_ordering.py +0 -0
  517. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_script_wrapping.py +0 -0
  518. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_snippet_cache.py +0 -0
  519. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_snippet_parser.py +0 -0
  520. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_tectonic_downloads.py +0 -0
  521. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_template_emitters.py +0 -0
  522. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_template_loader.py +0 -0
  523. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_template_renderer.py +0 -0
  524. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_template_renderer_slots.py +0 -0
  525. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_template_wrapping.py +0 -0
  526. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_texlogos_extension.py +0 -0
  527. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_title_levels.py +0 -0
  528. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_transformers.py +0 -0
  529. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_typesetting_fragment.py +0 -0
  530. {texsmith-0.2.1.dev0 → texsmith-0.3.0}/tests/test_user_dir.py +0 -0
  531. {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:
@@ -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.2.1.dev0
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.6
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
- <img src="docs/assets/ts-logo.svg" width="70%" />
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
- <img src="docs/assets/ts-logo.svg" width="70%" />
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
- `build_binder_context` 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.
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` list in front matter. Each
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
  ```