pdfmd-cli 3.28.49__tar.gz → 3.29.24__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 (244) hide show
  1. {pdfmd_cli-3.28.49/pdfmd_cli.egg-info → pdfmd_cli-3.29.24}/PKG-INFO +179 -9
  2. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/README.md +178 -8
  3. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/pdfmd.py +1316 -56
  4. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24/pdfmd_cli.egg-info}/PKG-INFO +179 -9
  5. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/pdfmd_cli.egg-info/SOURCES.txt +24 -0
  6. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/pdfmd_cli.egg-info/entry_points.txt +1 -0
  7. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/pdfmd_css/__init__.py +56 -9
  8. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/pdfmd_help/__init__.py +1 -1
  9. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/pdfmd_images/remote.py +1 -1
  10. pdfmd_cli-3.29.24/pdfmd_lua/cover.lua +53 -0
  11. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/pdfmd_lua/csv_table.lua +26 -1
  12. pdfmd_cli-3.29.24/pdfmd_lua/ebook.lua +51 -0
  13. pdfmd_cli-3.29.24/pdfmd_lua/ebook_input.lua +53 -0
  14. pdfmd_cli-3.29.24/pdfmd_lua/markup.lua +692 -0
  15. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/pdfmd_setup/inventory.py +4 -1
  16. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/pdfmd_setup/registry.py +20 -1
  17. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/pdfmd_tables/convert.py +6 -0
  18. pdfmd_cli-3.29.24/pdfmd_tables/sheets.py +130 -0
  19. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/pyproject.toml +2 -0
  20. pdfmd_cli-3.29.24/tests/test_browser_engine.py +114 -0
  21. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/tests/test_build_record.py +1 -0
  22. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/tests/test_calibre.py +10 -6
  23. pdfmd_cli-3.29.24/tests/test_calibre_markdown.py +138 -0
  24. pdfmd_cli-3.29.24/tests/test_calibre_targets.py +506 -0
  25. pdfmd_cli-3.29.24/tests/test_cover.py +131 -0
  26. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/tests/test_css.py +3 -2
  27. pdfmd_cli-3.29.24/tests/test_css_v2.py +148 -0
  28. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/tests/test_doctor.py +13 -0
  29. pdfmd_cli-3.29.24/tests/test_ebook_input.py +156 -0
  30. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/tests/test_engine_chain.py +37 -3
  31. pdfmd_cli-3.29.24/tests/test_folder_settings.py +132 -0
  32. pdfmd_cli-3.29.24/tests/test_install_calibre.py +222 -0
  33. pdfmd_cli-3.29.24/tests/test_install_core_tex.py +145 -0
  34. pdfmd_cli-3.29.24/tests/test_markup_appendix.py +62 -0
  35. pdfmd_cli-3.29.24/tests/test_markup_callouts.py +201 -0
  36. pdfmd_cli-3.29.24/tests/test_markup_center.py +103 -0
  37. pdfmd_cli-3.29.24/tests/test_markup_highlight.py +95 -0
  38. pdfmd_cli-3.29.24/tests/test_markup_keep.py +82 -0
  39. pdfmd_cli-3.29.24/tests/test_markup_landscape.py +103 -0
  40. pdfmd_cli-3.29.24/tests/test_markup_toc.py +108 -0
  41. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/tests/test_native.py +9 -2
  42. pdfmd_cli-3.29.24/tests/test_pan_tec.py +36 -0
  43. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/tests/test_polish.py +5 -5
  44. pdfmd_cli-3.29.24/tests/test_show_comments.py +142 -0
  45. pdfmd_cli-3.29.24/tests/test_spreadsheets.py +137 -0
  46. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/LICENSE +0 -0
  47. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/pdfmd_check/__init__.py +0 -0
  48. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/pdfmd_check/lint.py +0 -0
  49. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/pdfmd_chem/__init__.py +0 -0
  50. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/pdfmd_chem/__main__.py +0 -0
  51. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/pdfmd_chem/batch.py +0 -0
  52. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/pdfmd_chem/render.py +0 -0
  53. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/pdfmd_chem/siunitx.py +0 -0
  54. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/pdfmd_cli.egg-info/dependency_links.txt +0 -0
  55. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/pdfmd_cli.egg-info/requires.txt +0 -0
  56. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/pdfmd_cli.egg-info/top_level.txt +0 -0
  57. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/pdfmd_direct/__init__.py +0 -0
  58. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/pdfmd_direct/defaults.py +0 -0
  59. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/pdfmd_direct/html.py +0 -0
  60. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/pdfmd_direct/typst.py +0 -0
  61. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/pdfmd_edit/__init__.py +0 -0
  62. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/pdfmd_flat/__init__.py +0 -0
  63. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/pdfmd_flat/asciify.py +0 -0
  64. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/pdfmd_flat/keep.py +0 -0
  65. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/pdfmd_history/__init__.py +0 -0
  66. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/pdfmd_history/git.py +0 -0
  67. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/pdfmd_history/hst.py +0 -0
  68. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/pdfmd_history/versions.py +0 -0
  69. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/pdfmd_images/__init__.py +0 -0
  70. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/pdfmd_images/scan.py +0 -0
  71. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/pdfmd_images/svg.py +0 -0
  72. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/pdfmd_inkmd/LICENSE +0 -0
  73. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/pdfmd_inkmd/VENDORED.md +0 -0
  74. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/pdfmd_inkmd/__init__.py +0 -0
  75. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/pdfmd_inkmd/_kerning_data.py +0 -0
  76. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/pdfmd_inkmd/assets/fonts/DejaVuSans-LICENSE.txt +0 -0
  77. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/pdfmd_inkmd/assets/fonts/DejaVuSans.ttf +0 -0
  78. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/pdfmd_inkmd/ast.py +0 -0
  79. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/pdfmd_inkmd/cidfont.py +0 -0
  80. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/pdfmd_inkmd/embedded.py +0 -0
  81. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/pdfmd_inkmd/embedded_metrics.py +0 -0
  82. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/pdfmd_inkmd/emoji.py +0 -0
  83. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/pdfmd_inkmd/emoji_font.py +0 -0
  84. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/pdfmd_inkmd/fonts.py +0 -0
  85. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/pdfmd_inkmd/html_filter.py +0 -0
  86. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/pdfmd_inkmd/image_loader.py +0 -0
  87. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/pdfmd_inkmd/layout.py +0 -0
  88. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/pdfmd_inkmd/parser.py +0 -0
  89. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/pdfmd_inkmd/pdf.py +0 -0
  90. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/pdfmd_inkmd/py.typed +0 -0
  91. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/pdfmd_inkmd/render.py +0 -0
  92. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/pdfmd_inkmd/truetype.py +0 -0
  93. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/pdfmd_inkmd/url_filter.py +0 -0
  94. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/pdfmd_labels/__init__.py +0 -0
  95. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/pdfmd_labels/replay.py +0 -0
  96. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/pdfmd_labels/scan.py +0 -0
  97. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/pdfmd_lua/__init__.py +0 -0
  98. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/pdfmd_lua/ascii.lua +0 -0
  99. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/pdfmd_lua/chem.lua +0 -0
  100. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/pdfmd_lua/chem_client.lua +0 -0
  101. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/pdfmd_lua/code.lua +0 -0
  102. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/pdfmd_lua/code_wrap.tex +0 -0
  103. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/pdfmd_lua/diagram.lua +0 -0
  104. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/pdfmd_lua/flat.lua +0 -0
  105. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/pdfmd_lua/graphicx.tex +0 -0
  106. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/pdfmd_lua/graphviz.cjs +0 -0
  107. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/pdfmd_lua/images.lua +0 -0
  108. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/pdfmd_lua/katex.cjs +0 -0
  109. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/pdfmd_lua/mathjax.cjs +0 -0
  110. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/pdfmd_lua/pagebreak.lua +0 -0
  111. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/pdfmd_lua/pdf_images.lua +0 -0
  112. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/pdfmd_lua/raw.lua +0 -0
  113. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/pdfmd_lua/select.lua +0 -0
  114. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/pdfmd_lua/table_width.lua +0 -0
  115. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/pdfmd_lua/title_meta.lua +0 -0
  116. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/pdfmd_lua/typst.lua +0 -0
  117. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/pdfmd_lua/weasyprint.lua +0 -0
  118. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/pdfmd_mhchem/LICENSE +0 -0
  119. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/pdfmd_mhchem/__init__.py +0 -0
  120. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/pdfmd_mhchem/parser.py +0 -0
  121. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/pdfmd_office/__init__.py +0 -0
  122. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/pdfmd_office/docx.py +0 -0
  123. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/pdfmd_office/docx_post.py +0 -0
  124. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/pdfmd_office/fonts.py +0 -0
  125. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/pdfmd_office/fragments.py +0 -0
  126. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/pdfmd_office/labels.py +0 -0
  127. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/pdfmd_office/odt.py +0 -0
  128. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/pdfmd_office/office.lua +0 -0
  129. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/pdfmd_office/properties.py +0 -0
  130. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/pdfmd_office/spec.py +0 -0
  131. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/pdfmd_office/units.py +0 -0
  132. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/pdfmd_raw/__init__.py +0 -0
  133. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/pdfmd_setup/__init__.py +0 -0
  134. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/pdfmd_setup/fancy.py +0 -0
  135. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/pdfmd_setup/plain.py +0 -0
  136. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/pdfmd_tables/__init__.py +0 -0
  137. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/pdfmd_tables/scan.py +0 -0
  138. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/pdfmd_tables/verify.py +0 -0
  139. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/pdfmd_templates/__init__.py +0 -0
  140. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/pdfmd_templates/data/article/__name__.md +0 -0
  141. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/pdfmd_templates/data/article/description.txt +0 -0
  142. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/pdfmd_templates/data/article/next.txt +0 -0
  143. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/pdfmd_templates/data/article/refs.bib +0 -0
  144. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/pdfmd_templates/data/book/__name__.md +0 -0
  145. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/pdfmd_templates/data/book/description.txt +0 -0
  146. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/pdfmd_templates/data/book/next.txt +0 -0
  147. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/pdfmd_templates/data/book/parts/10-introduction.md +0 -0
  148. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/pdfmd_templates/data/book/parts/20-methods.md +0 -0
  149. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/pdfmd_templates/data/book/parts/30-results.md +0 -0
  150. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/pdfmd_templates/data/notes/__name__.md +0 -0
  151. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/pdfmd_templates/data/notes/description.txt +0 -0
  152. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/pdfmd_templates/data/notes/next.txt +0 -0
  153. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/pdfmd_templates/data/report/__name__.md +0 -0
  154. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/pdfmd_templates/data/report/data.csv +0 -0
  155. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/pdfmd_templates/data/report/description.txt +0 -0
  156. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/pdfmd_templates/data/report/next.txt +0 -0
  157. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/pdfmd_templates/data/slides/__name__.md +0 -0
  158. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/pdfmd_templates/data/slides/description.txt +0 -0
  159. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/pdfmd_templates/data/slides/next.txt +0 -0
  160. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/pdfmd_unicode/__init__.py +0 -0
  161. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/pdfmd_unicode/_catalog.py +0 -0
  162. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/pdfmd_unicode/_scripts.py +0 -0
  163. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/pdfmd_unicode/_tessdata_catalog.py +0 -0
  164. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/pdfmd_unicode/colorfont.py +0 -0
  165. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/pdfmd_unicode/emoji.py +0 -0
  166. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/pdfmd_unicode/fonts.py +0 -0
  167. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/pdfmd_unicode/install.py +0 -0
  168. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/pdfmd_unicode/plan.py +0 -0
  169. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/pdfmd_unicode/scripts.py +0 -0
  170. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/pdfmd_unicode/tessdata.py +0 -0
  171. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/pdfmd_unicode/translit.py +0 -0
  172. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/setup.cfg +0 -0
  173. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/tests/test_api.py +0 -0
  174. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/tests/test_apple_emoji.py +0 -0
  175. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/tests/test_ascii.py +0 -0
  176. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/tests/test_attach.py +0 -0
  177. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/tests/test_attach_format.py +0 -0
  178. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/tests/test_autolog.py +0 -0
  179. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/tests/test_bopen.py +0 -0
  180. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/tests/test_budget.py +0 -0
  181. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/tests/test_cache_location.py +0 -0
  182. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/tests/test_check.py +0 -0
  183. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/tests/test_check_source.py +0 -0
  184. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/tests/test_chem.py +0 -0
  185. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/tests/test_code_blocks.py +0 -0
  186. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/tests/test_compat.py +0 -0
  187. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/tests/test_completion.py +0 -0
  188. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/tests/test_config.py +0 -0
  189. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/tests/test_csv_table.py +0 -0
  190. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/tests/test_diagrams.py +0 -0
  191. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/tests/test_direct.py +0 -0
  192. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/tests/test_display_path.py +0 -0
  193. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/tests/test_docx_tables.py +0 -0
  194. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/tests/test_edit.py +0 -0
  195. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/tests/test_edit_pdf.py +0 -0
  196. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/tests/test_embedding.py +0 -0
  197. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/tests/test_engine_filters.py +0 -0
  198. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/tests/test_flat.py +0 -0
  199. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/tests/test_header_includes.py +0 -0
  200. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/tests/test_help.py +0 -0
  201. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/tests/test_history.py +0 -0
  202. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/tests/test_images.py +0 -0
  203. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/tests/test_install_diagram.py +0 -0
  204. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/tests/test_install_ocr.py +0 -0
  205. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/tests/test_install_python.py +0 -0
  206. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/tests/test_jobs.py +0 -0
  207. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/tests/test_katex_scale.py +0 -0
  208. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/tests/test_keep_source.py +0 -0
  209. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/tests/test_labels.py +0 -0
  210. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/tests/test_latex_errors.py +0 -0
  211. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/tests/test_lookup.py +0 -0
  212. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/tests/test_lua_trust.py +0 -0
  213. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/tests/test_markdown_features.py +0 -0
  214. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/tests/test_mathfont.py +0 -0
  215. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/tests/test_mathjax.py +0 -0
  216. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/tests/test_mhchem.py +0 -0
  217. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/tests/test_office.py +0 -0
  218. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/tests/test_office_latex.py +0 -0
  219. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/tests/test_old_python_syntax.py +0 -0
  220. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/tests/test_package_helper.py +0 -0
  221. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/tests/test_packaging.py +0 -0
  222. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/tests/test_pagebreak.py +0 -0
  223. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/tests/test_pdf_input.py +0 -0
  224. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/tests/test_picture_cache_protocol.py +0 -0
  225. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/tests/test_plot_cache.py +0 -0
  226. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/tests/test_presets.py +0 -0
  227. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/tests/test_raw.py +0 -0
  228. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/tests/test_rawcode.py +0 -0
  229. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/tests/test_reader.py +0 -0
  230. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/tests/test_remote_csl.py +0 -0
  231. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/tests/test_sections.py +0 -0
  232. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/tests/test_setup.py +0 -0
  233. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/tests/test_soffice_parts.py +0 -0
  234. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/tests/test_standalone_source.py +0 -0
  235. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/tests/test_table_widths.py +0 -0
  236. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/tests/test_tables.py +0 -0
  237. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/tests/test_templates.py +0 -0
  238. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/tests/test_tessdata.py +0 -0
  239. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/tests/test_texpackages.py +0 -0
  240. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/tests/test_text_input.py +0 -0
  241. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/tests/test_translit.py +0 -0
  242. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/tests/test_typst_input.py +0 -0
  243. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/tests/test_unicode.py +0 -0
  244. {pdfmd_cli-3.28.49 → pdfmd_cli-3.29.24}/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.24
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.
@@ -1297,6 +1359,12 @@ Water,18.015,1.20
1297
1359
  `---`, `:--`, `:-:`, `--:` as in a pipe table; `align=` wins. If such a row is really data, say `separator="none"`.
1298
1360
  `widths="5,1,1"` sets relative widths, and a second row with unequal dashes does too. Without either, pdfmd picks
1299
1361
  widths that suit the contents.
1362
+ - **A spreadsheet** (v3.29) works as the file: `::: {.csv file="results.xlsx" sheet="Run 2"}` (`.xlsx`, `.xlsm`, `.xls`, `.ods`;
1363
+ `sheet=` is a name or a number counted from 1, the first sheet when it is left out). The sheet is read by `openpyxl` (xlsx and
1364
+ xlsm: the values the file stores, so a cell shown as `1.50` is `1.5`, a date is `2026-01-02`), else by `pandas`, else by
1365
+ LibreOffice (the sheet by number); none of them is a `WARN` that says what to install (`pip install openpyxl`). The converted
1366
+ CSV is kept in pdfmd's cache by the file's content, the attached source carries the spreadsheet itself, and
1367
+ `--expand-tables` reads it too.
1300
1368
  - The first row is the header unless you add `header="false"`.
1301
1369
  - Large files are capped at 10 rows × 7 columns, so a huge CSV can't
1302
1370
  silently fill 40 pages. A cut table keeps both ends: the first 7 rows, a row
@@ -1358,10 +1426,28 @@ code, pre { font-family: "JetBrains Mono" }
1358
1426
  With `css-scope: all` (`pdfmd-options`, or `--css-scope all`; the default is `html`) the sheet is read for the other writers
1359
1427
  too: those four rules become the paper, margins, font, size, line spacing, indent, link colour and code font that LaTeX,
1360
1428
  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.
1429
+ "body font-size 11pt -> fontsize=11pt" for each one it used, and names what it did not: tables, anything else).
1430
+ Only rules that say it plainly count: `@page`, `html`/`body`/`:root`, `a`, `code`/`pre`, `h1`-`h5`; the last one wins. A media
1431
+ 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",
1432
+ `only` and `not` count, `(orientation: landscape)` is read against the sheet's own `@page` size, and a feature of the screen or of
1433
+ 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
1434
+ and 12 pt) is named, not used. It is a small reader on purpose: a CSS cascade has no counterpart in LaTeX.
1435
+
1436
+ Headings (v3.29): `h1`-`h5` with a `color`, `font-size` (`em`, `%`, `pt`, `px`: of the body's size), `font-family`,
1437
+ `font-weight` or `font-style` are set for LaTeX too, as titlesec's starred formats (the numbering and the spacing stay the
1438
+ class's; `h1` is `\section`, `h2` `\subsection` ... `h5` `\subparagraph`; `h6` has no LaTeX level). It is done only for the plain
1439
+ article class, and never over a document that formats its headings itself: a `titlesec`, `sectsty`, KOMA or memoir command, or a
1440
+ `\section` of its own, in the preamble, the `header-includes` or a metadata file, is named in a `CSS` note and nothing is added
1441
+ (and when `titlesec` is not installed, one LaTeX warning says so). A family needs XeLaTeX or LuaLaTeX.
1442
+
1443
+ ### A cover: `cover`
1444
+
1445
+ `pdfmd-options: {cover: true}` puts the title block (title, subtitle, author, date) on a page of its own and starts the text
1446
+ on the next (v3.29): LaTeX's `titlepage` class option (for the article, report and book classes and KOMA's; another class is
1447
+ left alone), and a page break after the title block of an HTML-family PDF (WeasyPrint, a browser, Calibre) or an HTML page.
1448
+ `cover: picture.png` (relative to the document) puts that picture on the first page of such a PDF, before the title, and is the
1449
+ cover of an EPUB, so of the Kindle book Calibre makes from it (Pandoc's own `cover-image:` does the same for an EPUB). A
1450
+ Word, OpenDocument or Typst file says once that the key was not applied. Off by default: the title block stays on page 1.
1365
1451
 
1366
1452
  ### Code: wrapping and line numbers
1367
1453
 
@@ -1503,6 +1589,79 @@ It is off unless asked (the document, a metadata file, or `pdfmd --setup` under
1503
1589
  [KIND ...]` and `--no-pagebreak` decide for one run. A spelling already in the output's own language stays as written,
1504
1590
  and slides leave a break out with a note. The built-in renderer (no Pandoc) reads the comment and TeX spellings anyway.
1505
1591
 
1592
+ **Callouts in every format** (v3.29, the first kind of *universal markup* after page breaks). GitHub's and Obsidian's
1593
+ `> [!NOTE]`, a fenced `::: note` and Quarto's `::: callout-tip` are a block quote or a div to Pandoc, and print as plain text.
1594
+ Ask for them and each becomes a box of the writer's own: LaTeX a `tcolorbox` (a plain indented quote when that package is not
1595
+ installed), Typst a tinted block, HTML, EPUB and the HTML engines' PDFs a `div.callout` with its style, every other writer
1596
+ (Word, OpenDocument, Markdown ...) a block quote with a bold title:
1597
+
1598
+ ```yaml
1599
+ pdfmd-options:
1600
+ markup: callouts # or: markup: true (every kind there is)
1601
+ ```
1602
+
1603
+ ```markdown
1604
+ > [!warning] Mind the gap
1605
+ > The title is the rest of the first line, the body the lines after it.
1606
+
1607
+ ::: {.tip title="Another way"}
1608
+ A fenced div takes `note`, `tip`, `important`, `warning` or `caution` as its class, `title=` for the title.
1609
+ :::
1610
+ ```
1611
+
1612
+ The five kinds are GitHub's (`note`, `tip`, `important`, `warning`, `caution`); Obsidian's others map to them (`info`, `todo`,
1613
+ `example`, `abstract` to note; `success`, `check`, `hint` to tip; `question`, `help`, `faq` to important; `failure`, `danger`,
1614
+ `error`, `bug` to caution; `attention` to warning), and an unknown name is a note titled with it. A fold marker (`[!tip]-`) is
1615
+ dropped. Off unless asked (the document, a metadata file, or `pdfmd --setup` under *Universal markup*); `--markup [KIND ...]` and
1616
+ `--no-markup` decide for one run. The built-in renderer (no Pandoc) does not read it yet, and there is no Word shaded box yet.
1617
+
1618
+ **A table of contents where you put it** (v3.29, `markup: toc`). `[TOC]`, `[[_TOC_]]` and `<!-- toc -->` alone in a paragraph, or
1619
+ a raw `\tableofcontents` for a writer that is not LaTeX, become the contents at that place: LaTeX's `\tableofcontents` (filled in
1620
+ one build, with the page numbers), Typst's `#outline()`, a Word TOC field (Word offers to update it when the file is opened) and,
1621
+ for every other writer (HTML, EPUB, Markdown, OpenDocument ...), a nested list of links to the headings down to level 3, with a
1622
+ bold "Contents" above it. `markup: [callouts, toc]` or `markup: true` for both; `--markup toc` for one run. A marker inside a
1623
+ sentence is text.
1624
+
1625
+ **Centred text** (v3.29, `markup: center`). `<center>` ... `</center>` around blocks (the closing tag in its own paragraph),
1626
+ `<div align="center">`, `<div style="text-align: center">`, a fenced `::: center` and, for writers that are not LaTeX, a raw
1627
+ `\begin{center}` ... `\end{center}` all centre what they hold: LaTeX's `center` environment, Typst's `#align(center)[...]`, a
1628
+ `text-align` div in HTML, EPUB and the HTML engines' PDFs. Word and OpenDocument keep the text as it is and say so once (no
1629
+ centring for a block there yet). `markup: [callouts, toc, center]` or `true` for all; `--markup center` for one run.
1630
+
1631
+ **Highlighted text** (v3.29, `markup: highlight`). `==marked text==` (across several words, with emphasis inside, over a line
1632
+ break) is highlighted: LaTeX with `soul`'s `\hl` in a pale yellow (plain text when `soul` is not installed), Typst with
1633
+ `#highlight[...]`, HTML, EPUB and `--to gfm` with `<mark>`; Pandoc's own Markdown output keeps `==...==`, and Word and OpenDocument
1634
+ keep the text and say once that it is not highlighted. A lone `==` or one inside code stays as written; a closing `==` followed by
1635
+ punctuation (`==end==.`) works. `markup: [callouts, toc, center, highlight]` or `true` for all; `--markup highlight` for one run.
1636
+
1637
+ **Blocks kept on one page** (v3.29, `markup: keep`). A fenced `::: keep` (also `nobreak`, `keep-together`), a div with
1638
+ `style="break-inside: avoid"` and, for writers that are not LaTeX, a raw `\begin{samepage}` ... `\end{samepage}` hold what they
1639
+ contain on one page where it fits: LaTeX's `samepage` environment, Typst's `#block(breakable: false)[...]`, a `break-inside:
1640
+ avoid` div in HTML, EPUB and the HTML engines' PDFs. Word and OpenDocument keep the text and say once that it is not held.
1641
+ `--markup keep` for one run.
1642
+
1643
+ **Landscape pages** (v3.29, `markup: landscape`). A fenced `::: landscape`, a div with `style="page: landscape"` and, for writers
1644
+ that are not LaTeX, a raw `\begin{landscape}` ... `\end{landscape}` put what they hold on pages turned sideways, the document
1645
+ going back to portrait after it: LaTeX with `pdflscape` (the page is rotated in the PDF; `lscape`, or no turning, when it is not
1646
+ installed), Typst with `#page(flipped: true)[...]`, WeasyPrint and the browsers with a named page (`@page landscape`: the browsers
1647
+ get the document's paper turned; WeasyPrint's is its own A4 unless your own `@page landscape` says otherwise). Calibre's PDF cannot
1648
+ name page types, and Word and OpenDocument have no sections made from here: they keep the text and say once that no landscape page
1649
+ was made. `--markup landscape` for one run.
1650
+
1651
+ **Where the appendix starts** (v3.29, `markup: appendix`). A raw `\appendix`, `<!-- appendix -->` or a heading with the class
1652
+ `{.appendix}` marks the start: the sections after it are lettered (A, B, A.1) in LaTeX (`\appendix`) and Typst (a heading
1653
+ numbering of letters and a counter reset). It matters for a document that numbers its sections (`--number-sections`); without
1654
+ numbers Typst gets nothing and LaTeX's `\appendix` changes nothing visible. Other writers keep their own numbering and say once
1655
+ that the lettering is not made.
1656
+
1657
+ **Showing the comments of the text** (v3.29, `show-comments`). An `<!-- HTML comment -->` is invisible in every output. With
1658
+ `pdfmd-options: {show-comments: true}` (or `--show-comments` for one run, `--no-show-comments` to switch it off; also a row in
1659
+ `pdfmd --setup`) each one is shown: a box labelled *Comment* in LaTeX, Typst, HTML, EPUB and the HTML engines' PDFs, a real Word
1660
+ comment in a `.docx` (anchored on the paragraph after it, so Word's review pane lists them), `[comment: ...]` in italics for one
1661
+ inside a paragraph. The Markdown family (`--to gfm`, `markdown`) keeps the comment as it is; OpenDocument and PowerPoint drop
1662
+ it, with a note once. pdfmd's own markers stay invisible (`<!-- pdfmd: ... -->`, `<!-- pagebreak -->`, `<!-- toc -->`,
1663
+ `<!-- appendix -->`), and so does an empty comment. It is off unless asked and is not one of the kinds `markup: true` turns on.
1664
+
1506
1665
  **PDF images in HTML.** A browser does not show a PDF in `<img>`, an SVG it does. For an HTML build (a web page, an
1507
1666
  EPUB, a PDF through WeasyPrint) every image that is a PDF, `![fig](plot.pdf)` or `<img src="plot.pdf">`, is converted to
1508
1667
  an SVG with poppler's `pdftocairo` (or `mutool`, `pdf2svg`, `inkscape`) and stays vector; the first page is used and the
@@ -1760,6 +1919,17 @@ document or its metadata files say (the command line beats all of them);
1760
1919
  `translit:` is the romanization packs of the name lookup. `PDFMD_CONFIG=other.yaml`
1761
1920
  uses another file, `PDFMD_CONFIG=` (empty) none.
1762
1921
 
1922
+ **Settings for a folder** (v3.29): a `.pdfmd/config.yaml` in a document's folder, or in any folder above it, has the same
1923
+ `options:` for everything under it. The order, strongest first: the command line, the document's `pdfmd-options`, its metadata
1924
+ files, the folder settings (the nearest folder first, then the ones above it), your global `config.yaml`, pdfmd's own defaults.
1925
+ `inherit: false` in a folder's file stops the walk upward there. A folder cannot set what belongs to this computer (`translit`,
1926
+ `setup-ui`, `disabled`): they are ignored with a `WARN`. A mapping such as `stamp:` or `backup:` in a folder's file stays off
1927
+ until it says `enabled: true`, as in the global file. A build lists the folder files it used on its `FOUND` line
1928
+ (`--verbose`: `AUTO SETTINGS`). A folder's options cannot name code (a Lua filter or a preamble is read from the document's own
1929
+ front matter only), a `.pdfmd/config.yaml` owned by another user (a shared `/tmp`) is not read, and a path in it (`css: house.css`)
1930
+ is relative to the document, as everywhere, not to the folder file. Writing the file from `pdfmd --setup DIR`, and carrying it in
1931
+ an attached source, are not done yet.
1932
+
1763
1933
  ```yaml
1764
1934
  translit: [greek, hangul]
1765
1935
  options:
@@ -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.
@@ -1262,6 +1324,12 @@ Water,18.015,1.20
1262
1324
  `---`, `:--`, `:-:`, `--:` as in a pipe table; `align=` wins. If such a row is really data, say `separator="none"`.
1263
1325
  `widths="5,1,1"` sets relative widths, and a second row with unequal dashes does too. Without either, pdfmd picks
1264
1326
  widths that suit the contents.
1327
+ - **A spreadsheet** (v3.29) works as the file: `::: {.csv file="results.xlsx" sheet="Run 2"}` (`.xlsx`, `.xlsm`, `.xls`, `.ods`;
1328
+ `sheet=` is a name or a number counted from 1, the first sheet when it is left out). The sheet is read by `openpyxl` (xlsx and
1329
+ xlsm: the values the file stores, so a cell shown as `1.50` is `1.5`, a date is `2026-01-02`), else by `pandas`, else by
1330
+ LibreOffice (the sheet by number); none of them is a `WARN` that says what to install (`pip install openpyxl`). The converted
1331
+ CSV is kept in pdfmd's cache by the file's content, the attached source carries the spreadsheet itself, and
1332
+ `--expand-tables` reads it too.
1265
1333
  - The first row is the header unless you add `header="false"`.
1266
1334
  - Large files are capped at 10 rows × 7 columns, so a huge CSV can't
1267
1335
  silently fill 40 pages. A cut table keeps both ends: the first 7 rows, a row
@@ -1323,10 +1391,28 @@ code, pre { font-family: "JetBrains Mono" }
1323
1391
  With `css-scope: all` (`pdfmd-options`, or `--css-scope all`; the default is `html`) the sheet is read for the other writers
1324
1392
  too: those four rules become the paper, margins, font, size, line spacing, indent, link colour and code font that LaTeX,
1325
1393
  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.
1394
+ "body font-size 11pt -> fontsize=11pt" for each one it used, and names what it did not: tables, anything else).
1395
+ Only rules that say it plainly count: `@page`, `html`/`body`/`:root`, `a`, `code`/`pre`, `h1`-`h5`; the last one wins. A media
1396
+ 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",
1397
+ `only` and `not` count, `(orientation: landscape)` is read against the sheet's own `@page` size, and a feature of the screen or of
1398
+ 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
1399
+ and 12 pt) is named, not used. It is a small reader on purpose: a CSS cascade has no counterpart in LaTeX.
1400
+
1401
+ Headings (v3.29): `h1`-`h5` with a `color`, `font-size` (`em`, `%`, `pt`, `px`: of the body's size), `font-family`,
1402
+ `font-weight` or `font-style` are set for LaTeX too, as titlesec's starred formats (the numbering and the spacing stay the
1403
+ class's; `h1` is `\section`, `h2` `\subsection` ... `h5` `\subparagraph`; `h6` has no LaTeX level). It is done only for the plain
1404
+ article class, and never over a document that formats its headings itself: a `titlesec`, `sectsty`, KOMA or memoir command, or a
1405
+ `\section` of its own, in the preamble, the `header-includes` or a metadata file, is named in a `CSS` note and nothing is added
1406
+ (and when `titlesec` is not installed, one LaTeX warning says so). A family needs XeLaTeX or LuaLaTeX.
1407
+
1408
+ ### A cover: `cover`
1409
+
1410
+ `pdfmd-options: {cover: true}` puts the title block (title, subtitle, author, date) on a page of its own and starts the text
1411
+ on the next (v3.29): LaTeX's `titlepage` class option (for the article, report and book classes and KOMA's; another class is
1412
+ left alone), and a page break after the title block of an HTML-family PDF (WeasyPrint, a browser, Calibre) or an HTML page.
1413
+ `cover: picture.png` (relative to the document) puts that picture on the first page of such a PDF, before the title, and is the
1414
+ cover of an EPUB, so of the Kindle book Calibre makes from it (Pandoc's own `cover-image:` does the same for an EPUB). A
1415
+ Word, OpenDocument or Typst file says once that the key was not applied. Off by default: the title block stays on page 1.
1330
1416
 
1331
1417
  ### Code: wrapping and line numbers
1332
1418
 
@@ -1468,6 +1554,79 @@ It is off unless asked (the document, a metadata file, or `pdfmd --setup` under
1468
1554
  [KIND ...]` and `--no-pagebreak` decide for one run. A spelling already in the output's own language stays as written,
1469
1555
  and slides leave a break out with a note. The built-in renderer (no Pandoc) reads the comment and TeX spellings anyway.
1470
1556
 
1557
+ **Callouts in every format** (v3.29, the first kind of *universal markup* after page breaks). GitHub's and Obsidian's
1558
+ `> [!NOTE]`, a fenced `::: note` and Quarto's `::: callout-tip` are a block quote or a div to Pandoc, and print as plain text.
1559
+ Ask for them and each becomes a box of the writer's own: LaTeX a `tcolorbox` (a plain indented quote when that package is not
1560
+ installed), Typst a tinted block, HTML, EPUB and the HTML engines' PDFs a `div.callout` with its style, every other writer
1561
+ (Word, OpenDocument, Markdown ...) a block quote with a bold title:
1562
+
1563
+ ```yaml
1564
+ pdfmd-options:
1565
+ markup: callouts # or: markup: true (every kind there is)
1566
+ ```
1567
+
1568
+ ```markdown
1569
+ > [!warning] Mind the gap
1570
+ > The title is the rest of the first line, the body the lines after it.
1571
+
1572
+ ::: {.tip title="Another way"}
1573
+ A fenced div takes `note`, `tip`, `important`, `warning` or `caution` as its class, `title=` for the title.
1574
+ :::
1575
+ ```
1576
+
1577
+ The five kinds are GitHub's (`note`, `tip`, `important`, `warning`, `caution`); Obsidian's others map to them (`info`, `todo`,
1578
+ `example`, `abstract` to note; `success`, `check`, `hint` to tip; `question`, `help`, `faq` to important; `failure`, `danger`,
1579
+ `error`, `bug` to caution; `attention` to warning), and an unknown name is a note titled with it. A fold marker (`[!tip]-`) is
1580
+ dropped. Off unless asked (the document, a metadata file, or `pdfmd --setup` under *Universal markup*); `--markup [KIND ...]` and
1581
+ `--no-markup` decide for one run. The built-in renderer (no Pandoc) does not read it yet, and there is no Word shaded box yet.
1582
+
1583
+ **A table of contents where you put it** (v3.29, `markup: toc`). `[TOC]`, `[[_TOC_]]` and `<!-- toc -->` alone in a paragraph, or
1584
+ a raw `\tableofcontents` for a writer that is not LaTeX, become the contents at that place: LaTeX's `\tableofcontents` (filled in
1585
+ one build, with the page numbers), Typst's `#outline()`, a Word TOC field (Word offers to update it when the file is opened) and,
1586
+ for every other writer (HTML, EPUB, Markdown, OpenDocument ...), a nested list of links to the headings down to level 3, with a
1587
+ bold "Contents" above it. `markup: [callouts, toc]` or `markup: true` for both; `--markup toc` for one run. A marker inside a
1588
+ sentence is text.
1589
+
1590
+ **Centred text** (v3.29, `markup: center`). `<center>` ... `</center>` around blocks (the closing tag in its own paragraph),
1591
+ `<div align="center">`, `<div style="text-align: center">`, a fenced `::: center` and, for writers that are not LaTeX, a raw
1592
+ `\begin{center}` ... `\end{center}` all centre what they hold: LaTeX's `center` environment, Typst's `#align(center)[...]`, a
1593
+ `text-align` div in HTML, EPUB and the HTML engines' PDFs. Word and OpenDocument keep the text as it is and say so once (no
1594
+ centring for a block there yet). `markup: [callouts, toc, center]` or `true` for all; `--markup center` for one run.
1595
+
1596
+ **Highlighted text** (v3.29, `markup: highlight`). `==marked text==` (across several words, with emphasis inside, over a line
1597
+ break) is highlighted: LaTeX with `soul`'s `\hl` in a pale yellow (plain text when `soul` is not installed), Typst with
1598
+ `#highlight[...]`, HTML, EPUB and `--to gfm` with `<mark>`; Pandoc's own Markdown output keeps `==...==`, and Word and OpenDocument
1599
+ keep the text and say once that it is not highlighted. A lone `==` or one inside code stays as written; a closing `==` followed by
1600
+ punctuation (`==end==.`) works. `markup: [callouts, toc, center, highlight]` or `true` for all; `--markup highlight` for one run.
1601
+
1602
+ **Blocks kept on one page** (v3.29, `markup: keep`). A fenced `::: keep` (also `nobreak`, `keep-together`), a div with
1603
+ `style="break-inside: avoid"` and, for writers that are not LaTeX, a raw `\begin{samepage}` ... `\end{samepage}` hold what they
1604
+ contain on one page where it fits: LaTeX's `samepage` environment, Typst's `#block(breakable: false)[...]`, a `break-inside:
1605
+ avoid` div in HTML, EPUB and the HTML engines' PDFs. Word and OpenDocument keep the text and say once that it is not held.
1606
+ `--markup keep` for one run.
1607
+
1608
+ **Landscape pages** (v3.29, `markup: landscape`). A fenced `::: landscape`, a div with `style="page: landscape"` and, for writers
1609
+ that are not LaTeX, a raw `\begin{landscape}` ... `\end{landscape}` put what they hold on pages turned sideways, the document
1610
+ going back to portrait after it: LaTeX with `pdflscape` (the page is rotated in the PDF; `lscape`, or no turning, when it is not
1611
+ installed), Typst with `#page(flipped: true)[...]`, WeasyPrint and the browsers with a named page (`@page landscape`: the browsers
1612
+ get the document's paper turned; WeasyPrint's is its own A4 unless your own `@page landscape` says otherwise). Calibre's PDF cannot
1613
+ name page types, and Word and OpenDocument have no sections made from here: they keep the text and say once that no landscape page
1614
+ was made. `--markup landscape` for one run.
1615
+
1616
+ **Where the appendix starts** (v3.29, `markup: appendix`). A raw `\appendix`, `<!-- appendix -->` or a heading with the class
1617
+ `{.appendix}` marks the start: the sections after it are lettered (A, B, A.1) in LaTeX (`\appendix`) and Typst (a heading
1618
+ numbering of letters and a counter reset). It matters for a document that numbers its sections (`--number-sections`); without
1619
+ numbers Typst gets nothing and LaTeX's `\appendix` changes nothing visible. Other writers keep their own numbering and say once
1620
+ that the lettering is not made.
1621
+
1622
+ **Showing the comments of the text** (v3.29, `show-comments`). An `<!-- HTML comment -->` is invisible in every output. With
1623
+ `pdfmd-options: {show-comments: true}` (or `--show-comments` for one run, `--no-show-comments` to switch it off; also a row in
1624
+ `pdfmd --setup`) each one is shown: a box labelled *Comment* in LaTeX, Typst, HTML, EPUB and the HTML engines' PDFs, a real Word
1625
+ comment in a `.docx` (anchored on the paragraph after it, so Word's review pane lists them), `[comment: ...]` in italics for one
1626
+ inside a paragraph. The Markdown family (`--to gfm`, `markdown`) keeps the comment as it is; OpenDocument and PowerPoint drop
1627
+ it, with a note once. pdfmd's own markers stay invisible (`<!-- pdfmd: ... -->`, `<!-- pagebreak -->`, `<!-- toc -->`,
1628
+ `<!-- appendix -->`), and so does an empty comment. It is off unless asked and is not one of the kinds `markup: true` turns on.
1629
+
1471
1630
  **PDF images in HTML.** A browser does not show a PDF in `<img>`, an SVG it does. For an HTML build (a web page, an
1472
1631
  EPUB, a PDF through WeasyPrint) every image that is a PDF, `![fig](plot.pdf)` or `<img src="plot.pdf">`, is converted to
1473
1632
  an SVG with poppler's `pdftocairo` (or `mutool`, `pdf2svg`, `inkscape`) and stays vector; the first page is used and the
@@ -1725,6 +1884,17 @@ document or its metadata files say (the command line beats all of them);
1725
1884
  `translit:` is the romanization packs of the name lookup. `PDFMD_CONFIG=other.yaml`
1726
1885
  uses another file, `PDFMD_CONFIG=` (empty) none.
1727
1886
 
1887
+ **Settings for a folder** (v3.29): a `.pdfmd/config.yaml` in a document's folder, or in any folder above it, has the same
1888
+ `options:` for everything under it. The order, strongest first: the command line, the document's `pdfmd-options`, its metadata
1889
+ files, the folder settings (the nearest folder first, then the ones above it), your global `config.yaml`, pdfmd's own defaults.
1890
+ `inherit: false` in a folder's file stops the walk upward there. A folder cannot set what belongs to this computer (`translit`,
1891
+ `setup-ui`, `disabled`): they are ignored with a `WARN`. A mapping such as `stamp:` or `backup:` in a folder's file stays off
1892
+ until it says `enabled: true`, as in the global file. A build lists the folder files it used on its `FOUND` line
1893
+ (`--verbose`: `AUTO SETTINGS`). A folder's options cannot name code (a Lua filter or a preamble is read from the document's own
1894
+ front matter only), a `.pdfmd/config.yaml` owned by another user (a shared `/tmp`) is not read, and a path in it (`css: house.css`)
1895
+ is relative to the document, as everywhere, not to the folder file. Writing the file from `pdfmd --setup DIR`, and carrying it in
1896
+ an attached source, are not done yet.
1897
+
1728
1898
  ```yaml
1729
1899
  translit: [greek, hangul]
1730
1900
  options: