pdfmd-cli 3.28.49__tar.gz → 3.29.8__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 (230) hide show
  1. {pdfmd_cli-3.28.49/pdfmd_cli.egg-info → pdfmd_cli-3.29.8}/PKG-INFO +80 -9
  2. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/README.md +79 -8
  3. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/pdfmd.py +976 -53
  4. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8/pdfmd_cli.egg-info}/PKG-INFO +80 -9
  5. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/pdfmd_cli.egg-info/SOURCES.txt +10 -0
  6. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/pdfmd_cli.egg-info/entry_points.txt +1 -0
  7. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/pdfmd_css/__init__.py +56 -9
  8. pdfmd_cli-3.29.8/pdfmd_lua/ebook.lua +51 -0
  9. pdfmd_cli-3.29.8/pdfmd_lua/ebook_input.lua +53 -0
  10. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/pyproject.toml +2 -0
  11. pdfmd_cli-3.29.8/tests/test_browser_engine.py +114 -0
  12. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/tests/test_build_record.py +1 -0
  13. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/tests/test_calibre.py +6 -4
  14. pdfmd_cli-3.29.8/tests/test_calibre_markdown.py +138 -0
  15. pdfmd_cli-3.29.8/tests/test_calibre_targets.py +506 -0
  16. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/tests/test_css.py +3 -2
  17. pdfmd_cli-3.29.8/tests/test_css_v2.py +148 -0
  18. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/tests/test_doctor.py +13 -0
  19. pdfmd_cli-3.29.8/tests/test_ebook_input.py +156 -0
  20. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/tests/test_engine_chain.py +37 -3
  21. pdfmd_cli-3.29.8/tests/test_install_calibre.py +223 -0
  22. pdfmd_cli-3.29.8/tests/test_install_core_tex.py +145 -0
  23. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/tests/test_native.py +9 -2
  24. pdfmd_cli-3.29.8/tests/test_pan_tec.py +36 -0
  25. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/tests/test_polish.py +5 -5
  26. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/LICENSE +0 -0
  27. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/pdfmd_check/__init__.py +0 -0
  28. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/pdfmd_check/lint.py +0 -0
  29. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/pdfmd_chem/__init__.py +0 -0
  30. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/pdfmd_chem/__main__.py +0 -0
  31. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/pdfmd_chem/batch.py +0 -0
  32. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/pdfmd_chem/render.py +0 -0
  33. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/pdfmd_chem/siunitx.py +0 -0
  34. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/pdfmd_cli.egg-info/dependency_links.txt +0 -0
  35. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/pdfmd_cli.egg-info/requires.txt +0 -0
  36. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/pdfmd_cli.egg-info/top_level.txt +0 -0
  37. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/pdfmd_direct/__init__.py +0 -0
  38. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/pdfmd_direct/defaults.py +0 -0
  39. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/pdfmd_direct/html.py +0 -0
  40. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/pdfmd_direct/typst.py +0 -0
  41. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/pdfmd_edit/__init__.py +0 -0
  42. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/pdfmd_flat/__init__.py +0 -0
  43. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/pdfmd_flat/asciify.py +0 -0
  44. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/pdfmd_flat/keep.py +0 -0
  45. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/pdfmd_help/__init__.py +0 -0
  46. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/pdfmd_history/__init__.py +0 -0
  47. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/pdfmd_history/git.py +0 -0
  48. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/pdfmd_history/hst.py +0 -0
  49. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/pdfmd_history/versions.py +0 -0
  50. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/pdfmd_images/__init__.py +0 -0
  51. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/pdfmd_images/remote.py +0 -0
  52. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/pdfmd_images/scan.py +0 -0
  53. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/pdfmd_images/svg.py +0 -0
  54. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/pdfmd_inkmd/LICENSE +0 -0
  55. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/pdfmd_inkmd/VENDORED.md +0 -0
  56. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/pdfmd_inkmd/__init__.py +0 -0
  57. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/pdfmd_inkmd/_kerning_data.py +0 -0
  58. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/pdfmd_inkmd/assets/fonts/DejaVuSans-LICENSE.txt +0 -0
  59. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/pdfmd_inkmd/assets/fonts/DejaVuSans.ttf +0 -0
  60. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/pdfmd_inkmd/ast.py +0 -0
  61. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/pdfmd_inkmd/cidfont.py +0 -0
  62. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/pdfmd_inkmd/embedded.py +0 -0
  63. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/pdfmd_inkmd/embedded_metrics.py +0 -0
  64. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/pdfmd_inkmd/emoji.py +0 -0
  65. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/pdfmd_inkmd/emoji_font.py +0 -0
  66. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/pdfmd_inkmd/fonts.py +0 -0
  67. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/pdfmd_inkmd/html_filter.py +0 -0
  68. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/pdfmd_inkmd/image_loader.py +0 -0
  69. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/pdfmd_inkmd/layout.py +0 -0
  70. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/pdfmd_inkmd/parser.py +0 -0
  71. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/pdfmd_inkmd/pdf.py +0 -0
  72. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/pdfmd_inkmd/py.typed +0 -0
  73. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/pdfmd_inkmd/render.py +0 -0
  74. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/pdfmd_inkmd/truetype.py +0 -0
  75. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/pdfmd_inkmd/url_filter.py +0 -0
  76. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/pdfmd_labels/__init__.py +0 -0
  77. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/pdfmd_labels/replay.py +0 -0
  78. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/pdfmd_labels/scan.py +0 -0
  79. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/pdfmd_lua/__init__.py +0 -0
  80. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/pdfmd_lua/ascii.lua +0 -0
  81. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/pdfmd_lua/chem.lua +0 -0
  82. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/pdfmd_lua/chem_client.lua +0 -0
  83. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/pdfmd_lua/code.lua +0 -0
  84. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/pdfmd_lua/code_wrap.tex +0 -0
  85. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/pdfmd_lua/csv_table.lua +0 -0
  86. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/pdfmd_lua/diagram.lua +0 -0
  87. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/pdfmd_lua/flat.lua +0 -0
  88. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/pdfmd_lua/graphicx.tex +0 -0
  89. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/pdfmd_lua/graphviz.cjs +0 -0
  90. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/pdfmd_lua/images.lua +0 -0
  91. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/pdfmd_lua/katex.cjs +0 -0
  92. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/pdfmd_lua/mathjax.cjs +0 -0
  93. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/pdfmd_lua/pagebreak.lua +0 -0
  94. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/pdfmd_lua/pdf_images.lua +0 -0
  95. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/pdfmd_lua/raw.lua +0 -0
  96. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/pdfmd_lua/select.lua +0 -0
  97. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/pdfmd_lua/table_width.lua +0 -0
  98. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/pdfmd_lua/title_meta.lua +0 -0
  99. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/pdfmd_lua/typst.lua +0 -0
  100. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/pdfmd_lua/weasyprint.lua +0 -0
  101. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/pdfmd_mhchem/LICENSE +0 -0
  102. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/pdfmd_mhchem/__init__.py +0 -0
  103. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/pdfmd_mhchem/parser.py +0 -0
  104. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/pdfmd_office/__init__.py +0 -0
  105. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/pdfmd_office/docx.py +0 -0
  106. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/pdfmd_office/docx_post.py +0 -0
  107. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/pdfmd_office/fonts.py +0 -0
  108. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/pdfmd_office/fragments.py +0 -0
  109. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/pdfmd_office/labels.py +0 -0
  110. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/pdfmd_office/odt.py +0 -0
  111. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/pdfmd_office/office.lua +0 -0
  112. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/pdfmd_office/properties.py +0 -0
  113. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/pdfmd_office/spec.py +0 -0
  114. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/pdfmd_office/units.py +0 -0
  115. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/pdfmd_raw/__init__.py +0 -0
  116. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/pdfmd_setup/__init__.py +0 -0
  117. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/pdfmd_setup/fancy.py +0 -0
  118. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/pdfmd_setup/inventory.py +0 -0
  119. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/pdfmd_setup/plain.py +0 -0
  120. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/pdfmd_setup/registry.py +0 -0
  121. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/pdfmd_tables/__init__.py +0 -0
  122. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/pdfmd_tables/convert.py +0 -0
  123. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/pdfmd_tables/scan.py +0 -0
  124. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/pdfmd_tables/verify.py +0 -0
  125. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/pdfmd_templates/__init__.py +0 -0
  126. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/pdfmd_templates/data/article/__name__.md +0 -0
  127. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/pdfmd_templates/data/article/description.txt +0 -0
  128. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/pdfmd_templates/data/article/next.txt +0 -0
  129. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/pdfmd_templates/data/article/refs.bib +0 -0
  130. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/pdfmd_templates/data/book/__name__.md +0 -0
  131. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/pdfmd_templates/data/book/description.txt +0 -0
  132. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/pdfmd_templates/data/book/next.txt +0 -0
  133. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/pdfmd_templates/data/book/parts/10-introduction.md +0 -0
  134. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/pdfmd_templates/data/book/parts/20-methods.md +0 -0
  135. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/pdfmd_templates/data/book/parts/30-results.md +0 -0
  136. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/pdfmd_templates/data/notes/__name__.md +0 -0
  137. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/pdfmd_templates/data/notes/description.txt +0 -0
  138. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/pdfmd_templates/data/notes/next.txt +0 -0
  139. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/pdfmd_templates/data/report/__name__.md +0 -0
  140. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/pdfmd_templates/data/report/data.csv +0 -0
  141. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/pdfmd_templates/data/report/description.txt +0 -0
  142. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/pdfmd_templates/data/report/next.txt +0 -0
  143. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/pdfmd_templates/data/slides/__name__.md +0 -0
  144. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/pdfmd_templates/data/slides/description.txt +0 -0
  145. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/pdfmd_templates/data/slides/next.txt +0 -0
  146. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/pdfmd_unicode/__init__.py +0 -0
  147. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/pdfmd_unicode/_catalog.py +0 -0
  148. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/pdfmd_unicode/_scripts.py +0 -0
  149. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/pdfmd_unicode/_tessdata_catalog.py +0 -0
  150. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/pdfmd_unicode/colorfont.py +0 -0
  151. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/pdfmd_unicode/emoji.py +0 -0
  152. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/pdfmd_unicode/fonts.py +0 -0
  153. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/pdfmd_unicode/install.py +0 -0
  154. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/pdfmd_unicode/plan.py +0 -0
  155. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/pdfmd_unicode/scripts.py +0 -0
  156. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/pdfmd_unicode/tessdata.py +0 -0
  157. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/pdfmd_unicode/translit.py +0 -0
  158. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/setup.cfg +0 -0
  159. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/tests/test_api.py +0 -0
  160. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/tests/test_apple_emoji.py +0 -0
  161. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/tests/test_ascii.py +0 -0
  162. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/tests/test_attach.py +0 -0
  163. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/tests/test_attach_format.py +0 -0
  164. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/tests/test_autolog.py +0 -0
  165. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/tests/test_bopen.py +0 -0
  166. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/tests/test_budget.py +0 -0
  167. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/tests/test_cache_location.py +0 -0
  168. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/tests/test_check.py +0 -0
  169. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/tests/test_check_source.py +0 -0
  170. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/tests/test_chem.py +0 -0
  171. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/tests/test_code_blocks.py +0 -0
  172. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/tests/test_compat.py +0 -0
  173. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/tests/test_completion.py +0 -0
  174. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/tests/test_config.py +0 -0
  175. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/tests/test_csv_table.py +0 -0
  176. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/tests/test_diagrams.py +0 -0
  177. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/tests/test_direct.py +0 -0
  178. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/tests/test_display_path.py +0 -0
  179. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/tests/test_docx_tables.py +0 -0
  180. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/tests/test_edit.py +0 -0
  181. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/tests/test_edit_pdf.py +0 -0
  182. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/tests/test_embedding.py +0 -0
  183. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/tests/test_engine_filters.py +0 -0
  184. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/tests/test_flat.py +0 -0
  185. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/tests/test_header_includes.py +0 -0
  186. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/tests/test_help.py +0 -0
  187. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/tests/test_history.py +0 -0
  188. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/tests/test_images.py +0 -0
  189. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/tests/test_install_diagram.py +0 -0
  190. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/tests/test_install_ocr.py +0 -0
  191. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/tests/test_install_python.py +0 -0
  192. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/tests/test_jobs.py +0 -0
  193. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/tests/test_katex_scale.py +0 -0
  194. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/tests/test_keep_source.py +0 -0
  195. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/tests/test_labels.py +0 -0
  196. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/tests/test_latex_errors.py +0 -0
  197. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/tests/test_lookup.py +0 -0
  198. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/tests/test_lua_trust.py +0 -0
  199. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/tests/test_markdown_features.py +0 -0
  200. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/tests/test_mathfont.py +0 -0
  201. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/tests/test_mathjax.py +0 -0
  202. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/tests/test_mhchem.py +0 -0
  203. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/tests/test_office.py +0 -0
  204. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/tests/test_office_latex.py +0 -0
  205. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/tests/test_old_python_syntax.py +0 -0
  206. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/tests/test_package_helper.py +0 -0
  207. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/tests/test_packaging.py +0 -0
  208. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/tests/test_pagebreak.py +0 -0
  209. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/tests/test_pdf_input.py +0 -0
  210. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/tests/test_picture_cache_protocol.py +0 -0
  211. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/tests/test_plot_cache.py +0 -0
  212. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/tests/test_presets.py +0 -0
  213. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/tests/test_raw.py +0 -0
  214. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/tests/test_rawcode.py +0 -0
  215. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/tests/test_reader.py +0 -0
  216. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/tests/test_remote_csl.py +0 -0
  217. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/tests/test_sections.py +0 -0
  218. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/tests/test_setup.py +0 -0
  219. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/tests/test_soffice_parts.py +0 -0
  220. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/tests/test_standalone_source.py +0 -0
  221. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/tests/test_table_widths.py +0 -0
  222. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/tests/test_tables.py +0 -0
  223. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/tests/test_templates.py +0 -0
  224. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/tests/test_tessdata.py +0 -0
  225. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/tests/test_texpackages.py +0 -0
  226. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/tests/test_text_input.py +0 -0
  227. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/tests/test_translit.py +0 -0
  228. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/tests/test_typst_input.py +0 -0
  229. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/tests/test_unicode.py +0 -0
  230. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.8}/tests/test_versions.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pdfmd-cli
3
- Version: 3.28.49
3
+ Version: 3.29.8
4
4
  Summary: One command from Markdown to a good-looking PDF: a Pandoc wrapper with smart defaults, project-file discovery and a multi-engine fallback chain
5
5
  Author: Ali Perdekhan
6
6
  License-Expression: MIT AND Apache-2.0
@@ -245,8 +245,60 @@ when none can. `pdf-engine:` in `pdfmd-options`, the front matter, a metadata fi
245
245
  instead: Pandoc writes one HTML page (math as MathML, which Calibre draws with its own
246
246
  MathJax) and Calibre turns it into a PDF with the document's paper, margins, `fontsize:` and
247
247
  language, page numbers, and bookmarks from the headings. LaTeX in the document is made native
248
- or drawn as a picture, as for a Word file. Calibre is never tried on its own: only when you
249
- name it (`-e calibre`, or `pdf-engine: calibre` in `pdfmd-options:`).
248
+ or drawn as a picture, as for a Word file. Calibre is not in the numbered chain: it comes first when you
249
+ name it (`-e calibre`, or `pdf-engine: calibre` in `pdfmd-options:`), and (v3.29.1) it and the browsers
250
+ (`-e edge`, `chrome`, `chromium`, `brave`: Pandoc's HTML page, printed headless) are tried last when no engine is named
251
+ and LaTeX, Typst and the HTML engines have all failed, ahead of LibreOffice; `--doctor` lists them as last resorts.
252
+ A comma list of your own never adds them (`-e pandoc` is every engine Pandoc drives, not these).
253
+
254
+ With no Pandoc at all, Calibre reads the Markdown itself (v3.29): its own Markdown reader (tables, footnotes, fenced code, lists)
255
+ prints it, before the rough built-in renderers, with the document's paper and margins. It has no math (formulas are text) and
256
+ none of Pandoc's syntax, and says so (`NOTE`, `WARN`). `-e calibre` or `-e native` without Pandoc picks it; with Pandoc,
257
+ `-e calibre` is the HTML route above.
258
+
259
+ `pdfmd --install calibre` (v3.29) gets Calibre when it is missing (190 to 360 MB). In a terminal on a Mac or Windows it offers
260
+ `brew install --cask calibre` or `winget install --id calibre.calibre -e` first. Otherwise (or on answering `d`) pdfmd downloads the
261
+ release file for your machine and checks it against the SHA-256 GitHub lists for it, and refuses a download whose checksum is not
262
+ listed: on macOS it opens the disk image read-only and copies `calibre.app` into `~/Applications`, on Linux (x86-64, ARM)
263
+ it unpacks the archive into pdfmd's data folder (no root, no desktop entries), and either way runs `ebook-convert --version`
264
+ to check. Windows: `winget`, or the installer from calibre-ebook.com. Calibre is a program pdfmd runs, never one it contains.
265
+
266
+ A browser prints a Markdown document too (v3.29): `-e edge`, `-e chrome`, `-e chromium` or `-e brave` (or `-e browser` for the
267
+ first one installed) has Pandoc write one self-contained HTML page and the browser, headless, print it with the document's
268
+ paper and margins (`papersize`, `geometry`, `margin`: as `@page`) and 12pt text. The math is MathML, which the browser draws
269
+ itself; LaTeX in the document is made native or drawn as a picture, as for a Word file. Like Calibre, a browser comes first when you
270
+ name it and last when you do not (see above); an `.html` file already goes to one first when it has scripts or MathML.
271
+
272
+ Calibre also writes ebooks (v3.29): `pdfmd book.md -o book.azw3` (or `--to azw3`) has Pandoc write an EPUB 3 (chapters,
273
+ contents, the metadata, the math as MathML) and Calibre turn it into the target, `book.azw3` beside the document. The
274
+ twelve targets only Calibre writes are `azw3`, `mobi`, `kepub`, `lit`, `lrf`, `pdb`, `rb`, `snb`, `tcr`, `pmlz`, `htmlz`
275
+ and `txtz`; each was converted back to text to check that its words, list and table are there. (Before v3.29 `-o
276
+ book.azw3` wrote a PDF under that name.) `epub`, `docx`, `rtf`, `txt` and `fb2` Pandoc writes itself, with more of its own
277
+ features (styles, tables, footnotes); they go through Calibre only when `-e calibre` is on the command line (a
278
+ `pdf-engine: calibre` is a PDF setting), with a NOTE. `-e calibre` with another target (`.tex`, `.html`, `.md`) stops and
279
+ lists what Calibre writes. One document at a time, not `-b` or `-r`.
280
+
281
+ The math of an ebook: a Kindle or a Kobo does not draw MathML, and a MOBI has no place for it. `azw3`, `mobi`, `kepub`, `lit`
282
+ and `lrf` (and `docx` through Calibre) get each formula drawn by LaTeX as a picture, in the document's own preamble and with
283
+ its `\ce` and siunitx, as a Word file's pictures are (needs a LaTeX engine and Poppler's `pdftocairo`); the plain formats
284
+ (`pdb`, `rb`, `snb`, `tcr`, `pmlz`, `txtz`, `rtf`, `txt`, `fb2`) get the formulas as text, the simple ones with their
285
+ superscripts and the rest as TeX, with one `WARN` that counts them, and so does a picture target on a machine with no LaTeX.
286
+ `epub` and `htmlz` keep the MathML. A `--mathml` or `--math-method` of your own is kept.
287
+
288
+ An ebook can be the input too (v3.29): `pdfmd book.epub` builds `book.pdf` beside it, `pdfmd book.mobi -o book.md` writes its
289
+ Markdown (with its pictures in `media/`) for you to edit, `pdfmd book.azw3 --to docx` a Word file. An EPUB is read by Pandoc;
290
+ `mobi`, `azw`, `azw3`, `azw4`, `kepub`, `lit`, `lrf`, `pdb`, `prc`, `chm`, `snb`, `tcr`, `rb`, `pmlz`, `htmlz` and `txtz` first go
291
+ through Calibre's `ebook-convert` into an EPUB (Calibre is needed for those, not for an EPUB). The closing line names the
292
+ book. One book at a time, not with other files, `-b` or `-r`; a book with DRM, and an ebook of nothing but pictures (a comic),
293
+ cannot be read. A formula a MOBI holds as a picture stays a picture. Calibre's own scaffolding in the converted book (an
294
+ anchor for every file it split the book into, its page-break divs and classes) is dropped from the Markdown; with
295
+ `-o book.md` the pictures are copied to a `media/` folder beside it.
296
+
297
+ LibreOffice writes what Pandoc cannot too (v3.29): `pdfmd letter.md -o letter.doc` (Word 97) has Pandoc write the Word file (the
298
+ same one `-o letter.docx` writes: your reference document, native equations and tables, pictures for what LaTeX alone can draw)
299
+ and headless LibreOffice turn it into `.doc`. `rtf`, `odt`, `txt` and `epub` go through LibreOffice only with `-e soffice` (or
300
+ `-e libreoffice`, `-e office`) first on the command line, with a NOTE; without it Pandoc writes them from the document itself,
301
+ which is the better file. `-e soffice` with another target (`.tex`, `.md`) lists what it writes.
250
302
 
251
303
  For everything at once, `pdfmd --doctor` is one page on the Markdown-to-PDF tools, fonts
252
304
  and emoji, PDF reading (batchocr, Tesseract, Poppler, OCR languages), your config file and
@@ -278,6 +330,8 @@ MISS xelatex: could not build it (! LaTeX Error: File `stix2.sty' not found.)
278
330
  OK typst: built a PDF in 1.1 s
279
331
  ```
280
332
 
333
+ The last resorts are tried too (v3.29): an installed browser (`edge: built a PDF in 6.1 s`) and Calibre, which also writes a small
334
+ ebook (`calibre:azw3: built an AZW3 ebook in 18.0 s`), so a missing Qt library shows here and not in the middle of a book.
281
335
  It takes a few seconds per engine (a minute or more if TeX has to fetch packages); without `--deep` nothing is built.
282
336
 
283
337
  ### Tab completion
@@ -349,6 +403,10 @@ OK notes.md > notes.pdf
349
403
  - `pdfmd --install math:mathjax` (MathJax 4 and its STIX Two math font, about 12 MB to download, about 2 MB on
350
404
  disk) and `pdfmd --install math:katex` (KaTeX, about 1.5 MB) are for WeasyPrint's PDFs, not the built-in
351
405
  renderer: they typeset its math (see "WeasyPrint does not typeset math itself" below).
406
+ - `pdfmd --install core:tex` (also `cortex`, about 50 MB) is the other core: **Pandoc and Tectonic**, the self-contained
407
+ LaTeX engine (its release from GitHub, checked against the SHA-256 GitHub lists, into pdfmd's own tools folder). Tectonic
408
+ fetches the TeX files a document needs from the network the first time, then works from its cache. `core:typst`
409
+ (or `core`) is `--install full` below. `pan-tec` (see "Other command names") runs pdfmd on it.
352
410
  - `pdfmd --install full` leaves the fallback behind: it installs **Pandoc** (the
353
411
  real binary from PyPI's `pypandoc_binary`, about 35 MB, also `--install pandoc`
354
412
  / `pdfmd-cli[pandoc]`) and **Typst** (Typst's own release from GitHub, about
@@ -1065,9 +1123,9 @@ stamped or backed up unless you ask (`stamp=True`, `backup=True`). A failure rai
1065
1123
  `variables=` a dict of Pandoc variables, `extra_args=` anything else the command line takes, `cwd=` the folder it runs
1066
1124
  in and `timeout=` seconds.
1067
1125
 
1068
- ### Other command names: `mdpdf`, `inkmd` and `batchmd`
1126
+ ### Other command names: `mdpdf`, `inkmd`, `batchmd` and `pan-tec`
1069
1127
 
1070
- pdfmd also installs `mdpdf`, `inkmd` and `batchmd` commands that take those tools' own keys
1128
+ pdfmd also installs `mdpdf`, `inkmd`, `batchmd` and `pan-tec` commands that take those tools' own keys
1071
1129
  and do what they did, with pdfmd behind them:
1072
1130
 
1073
1131
  ```sh
@@ -1079,6 +1137,10 @@ batchmd ~/notes # every .md in the folder, as pdfmd
1079
1137
  batchmd -e inkmd # the current folder, with the built-in renderer
1080
1138
  ```
1081
1139
 
1140
+ `pan-tec` is the first version of pdfmd, a shell function around `pandoc "$@" --pdf-engine=tectonic --pdf-engine-opt=--chatter=minimal`
1141
+ (v3.29): `pan-tec test.md -o ex.pdf` is `pdfmd -e tectonic test.md -o ex.pdf --pdf-engine-opt=--chatter=minimal`, with everything else
1142
+ pdfmd does. Name another engine (`-e typst`) or a chatter level of your own and that is used instead.
1143
+
1082
1144
  `batchmd` is `pdfmd -b`: each Markdown file in the folder becomes its own PDF beside it.
1083
1145
  It takes the current folder when you name none (`pdfmd -b` alone refuses), and every
1084
1146
  other option is pdfmd's.
@@ -1358,10 +1420,19 @@ code, pre { font-family: "JetBrains Mono" }
1358
1420
  With `css-scope: all` (`pdfmd-options`, or `--css-scope all`; the default is `html`) the sheet is read for the other writers
1359
1421
  too: those four rules become the paper, margins, font, size, line spacing, indent, link colour and code font that LaTeX,
1360
1422
  Typst and Word take, **below** what the document, its metadata and the command line set (`--verbose` says
1361
- "body font-size 11pt -> fontsize=11pt" for each one it used, and names what it did not: headings, tables, anything else).
1362
- Only rules that say it plainly count: `@page`, `html`/`body`/`:root`, `a`, `code`/`pre`; the last one wins; `@media print`
1363
- counts as if it stood alone, `@media screen` and any other condition do not; a body size LaTeX has no class for (anything but 10,
1364
- 11 and 12 pt) is named, not used. It is a small reader on purpose: a CSS cascade has no counterpart in LaTeX.
1423
+ "body font-size 11pt -> fontsize=11pt" for each one it used, and names what it did not: tables, anything else).
1424
+ Only rules that say it plainly count: `@page`, `html`/`body`/`:root`, `a`, `code`/`pre`, `h1`-`h5`; the last one wins. A media
1425
+ query is read as a browser prints (v3.29): `print` and `all` apply, `screen` and the other media types do not, a comma is "or",
1426
+ `only` and `not` count, `(orientation: landscape)` is read against the sheet's own `@page` size, and a feature of the screen or of
1427
+ a width (`(min-width: 600px)`) is not for a printed page and is named. A body size LaTeX has no class for (anything but 10, 11
1428
+ and 12 pt) is named, not used. It is a small reader on purpose: a CSS cascade has no counterpart in LaTeX.
1429
+
1430
+ Headings (v3.29): `h1`-`h5` with a `color`, `font-size` (`em`, `%`, `pt`, `px`: of the body's size), `font-family`,
1431
+ `font-weight` or `font-style` are set for LaTeX too, as titlesec's starred formats (the numbering and the spacing stay the
1432
+ class's; `h1` is `\section`, `h2` `\subsection` ... `h5` `\subparagraph`; `h6` has no LaTeX level). It is done only for the plain
1433
+ article class, and never over a document that formats its headings itself: a `titlesec`, `sectsty`, KOMA or memoir command, or a
1434
+ `\section` of its own, in the preamble, the `header-includes` or a metadata file, is named in a `CSS` note and nothing is added
1435
+ (and when `titlesec` is not installed, one LaTeX warning says so). A family needs XeLaTeX or LuaLaTeX.
1365
1436
 
1366
1437
  ### Code: wrapping and line numbers
1367
1438
 
@@ -210,8 +210,60 @@ when none can. `pdf-engine:` in `pdfmd-options`, the front matter, a metadata fi
210
210
  instead: Pandoc writes one HTML page (math as MathML, which Calibre draws with its own
211
211
  MathJax) and Calibre turns it into a PDF with the document's paper, margins, `fontsize:` and
212
212
  language, page numbers, and bookmarks from the headings. LaTeX in the document is made native
213
- or drawn as a picture, as for a Word file. Calibre is never tried on its own: only when you
214
- name it (`-e calibre`, or `pdf-engine: calibre` in `pdfmd-options:`).
213
+ or drawn as a picture, as for a Word file. Calibre is not in the numbered chain: it comes first when you
214
+ name it (`-e calibre`, or `pdf-engine: calibre` in `pdfmd-options:`), and (v3.29.1) it and the browsers
215
+ (`-e edge`, `chrome`, `chromium`, `brave`: Pandoc's HTML page, printed headless) are tried last when no engine is named
216
+ and LaTeX, Typst and the HTML engines have all failed, ahead of LibreOffice; `--doctor` lists them as last resorts.
217
+ A comma list of your own never adds them (`-e pandoc` is every engine Pandoc drives, not these).
218
+
219
+ With no Pandoc at all, Calibre reads the Markdown itself (v3.29): its own Markdown reader (tables, footnotes, fenced code, lists)
220
+ prints it, before the rough built-in renderers, with the document's paper and margins. It has no math (formulas are text) and
221
+ none of Pandoc's syntax, and says so (`NOTE`, `WARN`). `-e calibre` or `-e native` without Pandoc picks it; with Pandoc,
222
+ `-e calibre` is the HTML route above.
223
+
224
+ `pdfmd --install calibre` (v3.29) gets Calibre when it is missing (190 to 360 MB). In a terminal on a Mac or Windows it offers
225
+ `brew install --cask calibre` or `winget install --id calibre.calibre -e` first. Otherwise (or on answering `d`) pdfmd downloads the
226
+ release file for your machine and checks it against the SHA-256 GitHub lists for it, and refuses a download whose checksum is not
227
+ listed: on macOS it opens the disk image read-only and copies `calibre.app` into `~/Applications`, on Linux (x86-64, ARM)
228
+ it unpacks the archive into pdfmd's data folder (no root, no desktop entries), and either way runs `ebook-convert --version`
229
+ to check. Windows: `winget`, or the installer from calibre-ebook.com. Calibre is a program pdfmd runs, never one it contains.
230
+
231
+ A browser prints a Markdown document too (v3.29): `-e edge`, `-e chrome`, `-e chromium` or `-e brave` (or `-e browser` for the
232
+ first one installed) has Pandoc write one self-contained HTML page and the browser, headless, print it with the document's
233
+ paper and margins (`papersize`, `geometry`, `margin`: as `@page`) and 12pt text. The math is MathML, which the browser draws
234
+ itself; LaTeX in the document is made native or drawn as a picture, as for a Word file. Like Calibre, a browser comes first when you
235
+ name it and last when you do not (see above); an `.html` file already goes to one first when it has scripts or MathML.
236
+
237
+ Calibre also writes ebooks (v3.29): `pdfmd book.md -o book.azw3` (or `--to azw3`) has Pandoc write an EPUB 3 (chapters,
238
+ contents, the metadata, the math as MathML) and Calibre turn it into the target, `book.azw3` beside the document. The
239
+ twelve targets only Calibre writes are `azw3`, `mobi`, `kepub`, `lit`, `lrf`, `pdb`, `rb`, `snb`, `tcr`, `pmlz`, `htmlz`
240
+ and `txtz`; each was converted back to text to check that its words, list and table are there. (Before v3.29 `-o
241
+ book.azw3` wrote a PDF under that name.) `epub`, `docx`, `rtf`, `txt` and `fb2` Pandoc writes itself, with more of its own
242
+ features (styles, tables, footnotes); they go through Calibre only when `-e calibre` is on the command line (a
243
+ `pdf-engine: calibre` is a PDF setting), with a NOTE. `-e calibre` with another target (`.tex`, `.html`, `.md`) stops and
244
+ lists what Calibre writes. One document at a time, not `-b` or `-r`.
245
+
246
+ The math of an ebook: a Kindle or a Kobo does not draw MathML, and a MOBI has no place for it. `azw3`, `mobi`, `kepub`, `lit`
247
+ and `lrf` (and `docx` through Calibre) get each formula drawn by LaTeX as a picture, in the document's own preamble and with
248
+ its `\ce` and siunitx, as a Word file's pictures are (needs a LaTeX engine and Poppler's `pdftocairo`); the plain formats
249
+ (`pdb`, `rb`, `snb`, `tcr`, `pmlz`, `txtz`, `rtf`, `txt`, `fb2`) get the formulas as text, the simple ones with their
250
+ superscripts and the rest as TeX, with one `WARN` that counts them, and so does a picture target on a machine with no LaTeX.
251
+ `epub` and `htmlz` keep the MathML. A `--mathml` or `--math-method` of your own is kept.
252
+
253
+ An ebook can be the input too (v3.29): `pdfmd book.epub` builds `book.pdf` beside it, `pdfmd book.mobi -o book.md` writes its
254
+ Markdown (with its pictures in `media/`) for you to edit, `pdfmd book.azw3 --to docx` a Word file. An EPUB is read by Pandoc;
255
+ `mobi`, `azw`, `azw3`, `azw4`, `kepub`, `lit`, `lrf`, `pdb`, `prc`, `chm`, `snb`, `tcr`, `rb`, `pmlz`, `htmlz` and `txtz` first go
256
+ through Calibre's `ebook-convert` into an EPUB (Calibre is needed for those, not for an EPUB). The closing line names the
257
+ book. One book at a time, not with other files, `-b` or `-r`; a book with DRM, and an ebook of nothing but pictures (a comic),
258
+ cannot be read. A formula a MOBI holds as a picture stays a picture. Calibre's own scaffolding in the converted book (an
259
+ anchor for every file it split the book into, its page-break divs and classes) is dropped from the Markdown; with
260
+ `-o book.md` the pictures are copied to a `media/` folder beside it.
261
+
262
+ LibreOffice writes what Pandoc cannot too (v3.29): `pdfmd letter.md -o letter.doc` (Word 97) has Pandoc write the Word file (the
263
+ same one `-o letter.docx` writes: your reference document, native equations and tables, pictures for what LaTeX alone can draw)
264
+ and headless LibreOffice turn it into `.doc`. `rtf`, `odt`, `txt` and `epub` go through LibreOffice only with `-e soffice` (or
265
+ `-e libreoffice`, `-e office`) first on the command line, with a NOTE; without it Pandoc writes them from the document itself,
266
+ which is the better file. `-e soffice` with another target (`.tex`, `.md`) lists what it writes.
215
267
 
216
268
  For everything at once, `pdfmd --doctor` is one page on the Markdown-to-PDF tools, fonts
217
269
  and emoji, PDF reading (batchocr, Tesseract, Poppler, OCR languages), your config file and
@@ -243,6 +295,8 @@ MISS xelatex: could not build it (! LaTeX Error: File `stix2.sty' not found.)
243
295
  OK typst: built a PDF in 1.1 s
244
296
  ```
245
297
 
298
+ The last resorts are tried too (v3.29): an installed browser (`edge: built a PDF in 6.1 s`) and Calibre, which also writes a small
299
+ ebook (`calibre:azw3: built an AZW3 ebook in 18.0 s`), so a missing Qt library shows here and not in the middle of a book.
246
300
  It takes a few seconds per engine (a minute or more if TeX has to fetch packages); without `--deep` nothing is built.
247
301
 
248
302
  ### Tab completion
@@ -314,6 +368,10 @@ OK notes.md > notes.pdf
314
368
  - `pdfmd --install math:mathjax` (MathJax 4 and its STIX Two math font, about 12 MB to download, about 2 MB on
315
369
  disk) and `pdfmd --install math:katex` (KaTeX, about 1.5 MB) are for WeasyPrint's PDFs, not the built-in
316
370
  renderer: they typeset its math (see "WeasyPrint does not typeset math itself" below).
371
+ - `pdfmd --install core:tex` (also `cortex`, about 50 MB) is the other core: **Pandoc and Tectonic**, the self-contained
372
+ LaTeX engine (its release from GitHub, checked against the SHA-256 GitHub lists, into pdfmd's own tools folder). Tectonic
373
+ fetches the TeX files a document needs from the network the first time, then works from its cache. `core:typst`
374
+ (or `core`) is `--install full` below. `pan-tec` (see "Other command names") runs pdfmd on it.
317
375
  - `pdfmd --install full` leaves the fallback behind: it installs **Pandoc** (the
318
376
  real binary from PyPI's `pypandoc_binary`, about 35 MB, also `--install pandoc`
319
377
  / `pdfmd-cli[pandoc]`) and **Typst** (Typst's own release from GitHub, about
@@ -1030,9 +1088,9 @@ stamped or backed up unless you ask (`stamp=True`, `backup=True`). A failure rai
1030
1088
  `variables=` a dict of Pandoc variables, `extra_args=` anything else the command line takes, `cwd=` the folder it runs
1031
1089
  in and `timeout=` seconds.
1032
1090
 
1033
- ### Other command names: `mdpdf`, `inkmd` and `batchmd`
1091
+ ### Other command names: `mdpdf`, `inkmd`, `batchmd` and `pan-tec`
1034
1092
 
1035
- pdfmd also installs `mdpdf`, `inkmd` and `batchmd` commands that take those tools' own keys
1093
+ pdfmd also installs `mdpdf`, `inkmd`, `batchmd` and `pan-tec` commands that take those tools' own keys
1036
1094
  and do what they did, with pdfmd behind them:
1037
1095
 
1038
1096
  ```sh
@@ -1044,6 +1102,10 @@ batchmd ~/notes # every .md in the folder, as pdfmd
1044
1102
  batchmd -e inkmd # the current folder, with the built-in renderer
1045
1103
  ```
1046
1104
 
1105
+ `pan-tec` is the first version of pdfmd, a shell function around `pandoc "$@" --pdf-engine=tectonic --pdf-engine-opt=--chatter=minimal`
1106
+ (v3.29): `pan-tec test.md -o ex.pdf` is `pdfmd -e tectonic test.md -o ex.pdf --pdf-engine-opt=--chatter=minimal`, with everything else
1107
+ pdfmd does. Name another engine (`-e typst`) or a chatter level of your own and that is used instead.
1108
+
1047
1109
  `batchmd` is `pdfmd -b`: each Markdown file in the folder becomes its own PDF beside it.
1048
1110
  It takes the current folder when you name none (`pdfmd -b` alone refuses), and every
1049
1111
  other option is pdfmd's.
@@ -1323,10 +1385,19 @@ code, pre { font-family: "JetBrains Mono" }
1323
1385
  With `css-scope: all` (`pdfmd-options`, or `--css-scope all`; the default is `html`) the sheet is read for the other writers
1324
1386
  too: those four rules become the paper, margins, font, size, line spacing, indent, link colour and code font that LaTeX,
1325
1387
  Typst and Word take, **below** what the document, its metadata and the command line set (`--verbose` says
1326
- "body font-size 11pt -> fontsize=11pt" for each one it used, and names what it did not: headings, tables, anything else).
1327
- Only rules that say it plainly count: `@page`, `html`/`body`/`:root`, `a`, `code`/`pre`; the last one wins; `@media print`
1328
- counts as if it stood alone, `@media screen` and any other condition do not; a body size LaTeX has no class for (anything but 10,
1329
- 11 and 12 pt) is named, not used. It is a small reader on purpose: a CSS cascade has no counterpart in LaTeX.
1388
+ "body font-size 11pt -> fontsize=11pt" for each one it used, and names what it did not: tables, anything else).
1389
+ Only rules that say it plainly count: `@page`, `html`/`body`/`:root`, `a`, `code`/`pre`, `h1`-`h5`; the last one wins. A media
1390
+ query is read as a browser prints (v3.29): `print` and `all` apply, `screen` and the other media types do not, a comma is "or",
1391
+ `only` and `not` count, `(orientation: landscape)` is read against the sheet's own `@page` size, and a feature of the screen or of
1392
+ a width (`(min-width: 600px)`) is not for a printed page and is named. A body size LaTeX has no class for (anything but 10, 11
1393
+ and 12 pt) is named, not used. It is a small reader on purpose: a CSS cascade has no counterpart in LaTeX.
1394
+
1395
+ Headings (v3.29): `h1`-`h5` with a `color`, `font-size` (`em`, `%`, `pt`, `px`: of the body's size), `font-family`,
1396
+ `font-weight` or `font-style` are set for LaTeX too, as titlesec's starred formats (the numbering and the spacing stay the
1397
+ class's; `h1` is `\section`, `h2` `\subsection` ... `h5` `\subparagraph`; `h6` has no LaTeX level). It is done only for the plain
1398
+ article class, and never over a document that formats its headings itself: a `titlesec`, `sectsty`, KOMA or memoir command, or a
1399
+ `\section` of its own, in the preamble, the `header-includes` or a metadata file, is named in a `CSS` note and nothing is added
1400
+ (and when `titlesec` is not installed, one LaTeX warning says so). A family needs XeLaTeX or LuaLaTeX.
1330
1401
 
1331
1402
  ### Code: wrapping and line numbers
1332
1403