rxiv-maker 1.18.5__tar.gz → 1.19.1__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 (386) hide show
  1. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/.gitignore +5 -0
  2. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/CHANGELOG.md +45 -0
  3. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/PKG-INFO +1 -1
  4. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/__version__.py +1 -1
  5. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/cli/commands/__init__.py +2 -0
  6. rxiv_maker-1.19.1/src/rxiv_maker/cli/commands/biorxiv.py +51 -0
  7. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/cli/framework/base.py +91 -0
  8. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/cli/framework/workflow_commands.py +99 -31
  9. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/cli/main.py +2 -1
  10. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/converters/md2tex.py +8 -8
  11. rxiv_maker-1.19.1/src/rxiv_maker/engines/operations/prepare_biorxiv.py +411 -0
  12. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/tex/style/rxiv_maker_style.cls +2 -2
  13. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/cli/test_changelog_command.py +2 -2
  14. rxiv_maker-1.19.1/tests/unit/test_biorxiv_command.py +17 -0
  15. rxiv_maker-1.19.1/tests/unit/test_prepare_biorxiv.py +377 -0
  16. rxiv_maker-1.18.5/tests/fixtures/docx_export/sample_manuscript/2025__unknown_et_al__rxiv.docx +0 -0
  17. rxiv_maker-1.18.5/tests/fixtures/docx_export/sample_manuscript/sample_manuscript.docx +0 -0
  18. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/LICENSE +0 -0
  19. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/README.md +0 -0
  20. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/pyproject.toml +0 -0
  21. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/docs/api/README.md +0 -0
  22. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/docs/api/index.md +0 -0
  23. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/logo/logo-rxiv-maker.afdesign +0 -0
  24. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/logo/logo-rxiv-maker.png +0 -0
  25. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/logo/logo-rxiv-maker.svg +0 -0
  26. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/__init__.py +0 -0
  27. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/cli/__init__.py +0 -0
  28. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/cli/__main__.py +0 -0
  29. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/cli/commands/arxiv.py +0 -0
  30. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/cli/commands/bibliography.py +0 -0
  31. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/cli/commands/build.py +0 -0
  32. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/cli/commands/cache_management.py +0 -0
  33. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/cli/commands/changelog.py +0 -0
  34. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/cli/commands/check_installation.py +0 -0
  35. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/cli/commands/clean.py +0 -0
  36. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/cli/commands/completion.py +0 -0
  37. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/cli/commands/config.py +0 -0
  38. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/cli/commands/create_repo.py +0 -0
  39. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/cli/commands/docx.py +0 -0
  40. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/cli/commands/figures.py +0 -0
  41. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/cli/commands/get_rxiv_preprint.py +0 -0
  42. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/cli/commands/init.py +0 -0
  43. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/cli/commands/install_deps.py +0 -0
  44. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/cli/commands/repo_init.py +0 -0
  45. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/cli/commands/repos.py +0 -0
  46. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/cli/commands/repos_search.py +0 -0
  47. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/cli/commands/setup.py +0 -0
  48. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/cli/commands/track_changes.py +0 -0
  49. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/cli/commands/upgrade.py +0 -0
  50. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/cli/commands/validate.py +0 -0
  51. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/cli/commands/version.py +0 -0
  52. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/cli/framework/__init__.py +0 -0
  53. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/cli/framework/cache_commands.py +0 -0
  54. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/cli/framework/config_commands.py +0 -0
  55. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/cli/framework/content_commands.py +0 -0
  56. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/cli/framework/decorators.py +0 -0
  57. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/cli/framework/utility_commands.py +0 -0
  58. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/cli/framework.py +0 -0
  59. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/cli/interactive.py +0 -0
  60. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/cli/interactive_prompts.py +0 -0
  61. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/config/defaults.py +0 -0
  62. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/config/validator.py +0 -0
  63. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/converters/__init__.py +0 -0
  64. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/converters/citation_processor.py +0 -0
  65. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/converters/code_processor.py +0 -0
  66. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/converters/comment_processor.py +0 -0
  67. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/converters/custom_command_processor.py +0 -0
  68. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/converters/figure_processor.py +0 -0
  69. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/converters/html_processor.py +0 -0
  70. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/converters/list_processor.py +0 -0
  71. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/converters/math_processor.py +0 -0
  72. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/converters/python_executor.py +0 -0
  73. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/converters/section_processor.py +0 -0
  74. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/converters/supplementary_note_processor.py +0 -0
  75. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/converters/table_processor.py +0 -0
  76. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/converters/text_formatters.py +0 -0
  77. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/converters/types.py +0 -0
  78. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/converters/url_processor.py +0 -0
  79. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/core/cache/__init__.py +0 -0
  80. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/core/cache/advanced_cache.py +0 -0
  81. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/core/cache/bibliography_cache.py +0 -0
  82. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/core/cache/cache_utils.py +0 -0
  83. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/core/cache/doi_cache.py +0 -0
  84. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/core/cache/secure_cache_utils.py +0 -0
  85. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/core/content_processor.py +0 -0
  86. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/core/environment_bootstrap.py +0 -0
  87. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/core/environment_manager.py +0 -0
  88. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/core/error_codes.py +0 -0
  89. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/core/error_recovery.py +0 -0
  90. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/core/logging_config.py +0 -0
  91. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/core/managers/__init__.py +0 -0
  92. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/core/managers/cache_manager.py +0 -0
  93. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/core/managers/config_manager.py +0 -0
  94. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/core/managers/dependency_manager.py +0 -0
  95. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/core/managers/execution_manager.py +0 -0
  96. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/core/managers/file_manager.py +0 -0
  97. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/core/managers/install_manager.py +0 -0
  98. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/core/managers/state_manager.py +0 -0
  99. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/core/managers/unified_config_manager.py +0 -0
  100. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/core/managers/validation_manager.py +0 -0
  101. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/core/managers/workflow_manager.py +0 -0
  102. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/core/path_manager.py +0 -0
  103. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/core/progress_framework.py +0 -0
  104. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/core/repo_config.py +0 -0
  105. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/core/repository.py +0 -0
  106. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/core/session_optimizer.py +0 -0
  107. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/core/validation_framework.py +0 -0
  108. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/data/tips.yaml +0 -0
  109. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/engines/__init__.py +0 -0
  110. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/engines/operations/__init__.py +0 -0
  111. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/engines/operations/add_bibliography.py +0 -0
  112. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/engines/operations/build_manager.py +0 -0
  113. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/engines/operations/cleanup.py +0 -0
  114. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/engines/operations/fix_bibliography.py +0 -0
  115. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/engines/operations/generate_docs.py +0 -0
  116. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/engines/operations/generate_figures.py +0 -0
  117. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/engines/operations/generate_preprint.py +0 -0
  118. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/engines/operations/prepare_arxiv.py +0 -0
  119. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/engines/operations/setup_environment.py +0 -0
  120. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/engines/operations/track_changes.py +0 -0
  121. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/engines/operations/validate.py +0 -0
  122. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/engines/operations/validate_pdf.py +0 -0
  123. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/exporters/__init__.py +0 -0
  124. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/exporters/docx_citation_mapper.py +0 -0
  125. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/exporters/docx_content_processor.py +0 -0
  126. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/exporters/docx_exporter.py +0 -0
  127. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/exporters/docx_writer.py +0 -0
  128. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/install/__init__.py +0 -0
  129. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/install/dependency_handlers/__init__.py +0 -0
  130. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/install/dependency_handlers/latex.py +0 -0
  131. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/install/dependency_handlers/r_lang.py +0 -0
  132. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/install/dependency_handlers/system_libs.py +0 -0
  133. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/install/platform_installers/__init__.py +0 -0
  134. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/install/platform_installers/base.py +0 -0
  135. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/install/platform_installers/linux.py +0 -0
  136. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/install/platform_installers/macos.py +0 -0
  137. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/install/platform_installers/windows.py +0 -0
  138. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/install/utils/__init__.py +0 -0
  139. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/install/utils/logging.py +0 -0
  140. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/install/utils/progress.py +0 -0
  141. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/install/utils/verification.py +0 -0
  142. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/manuscript_utils/__init__.py +0 -0
  143. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/manuscript_utils/figure_utils.py +0 -0
  144. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/processors/__init__.py +0 -0
  145. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/processors/author_processor.py +0 -0
  146. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/processors/markdown_preprocessor.py +0 -0
  147. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/processors/template_processor.py +0 -0
  148. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/processors/yaml_processor.py +0 -0
  149. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/rxiv_maker_cli.py +0 -0
  150. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/scripts/__init__.py +0 -0
  151. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/scripts/custom_doc_generator.py +0 -0
  152. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/scripts/validate_manuscript.py +0 -0
  153. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/services/__init__.py +0 -0
  154. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/services/base.py +0 -0
  155. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/services/build_service.py +0 -0
  156. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/services/configuration_service.py +0 -0
  157. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/services/manuscript_service.py +0 -0
  158. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/services/publication_service.py +0 -0
  159. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/services/validation_service.py +0 -0
  160. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/templates/__init__.py +0 -0
  161. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/templates/manager.py +0 -0
  162. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/templates/registry.py +0 -0
  163. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/tex/python_execution_section.tex +0 -0
  164. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/utils/__init__.py +0 -0
  165. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/utils/accent_character_map.py +0 -0
  166. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/utils/author_affiliation_processor.py +0 -0
  167. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/utils/author_name_formatter.py +0 -0
  168. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/utils/bibliography_checksum.py +0 -0
  169. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/utils/bibliography_parser.py +0 -0
  170. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/utils/bst_generator.py +0 -0
  171. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/utils/changelog_parser.py +0 -0
  172. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/utils/citation_range_formatter.py +0 -0
  173. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/utils/citation_utils.py +0 -0
  174. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/utils/comment_filter.py +0 -0
  175. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/utils/dependency_checker.py +0 -0
  176. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/utils/docx_helpers.py +0 -0
  177. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/utils/doi_resolver.py +0 -0
  178. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/utils/email_encoder.py +0 -0
  179. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/utils/figure_checksum.py +0 -0
  180. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/utils/file_helpers.py +0 -0
  181. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/utils/github.py +0 -0
  182. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/utils/homebrew_checker.py +0 -0
  183. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/utils/install_detector.py +0 -0
  184. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/utils/label_extractor.py +0 -0
  185. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/utils/operation_ids.py +0 -0
  186. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/utils/pdf_splitter.py +0 -0
  187. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/utils/pdf_utils.py +0 -0
  188. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/utils/performance.py +0 -0
  189. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/utils/platform.py +0 -0
  190. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/utils/python_execution_reporter.py +0 -0
  191. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/utils/retry.py +0 -0
  192. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/utils/rich_upgrade_notifier.py +0 -0
  193. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/utils/text_utils.py +0 -0
  194. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/utils/tips.py +0 -0
  195. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/utils/title_sync.py +0 -0
  196. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/utils/unicode_safe.py +0 -0
  197. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/utils/update_checker.py +0 -0
  198. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/utils/url_to_doi.py +0 -0
  199. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/validate.py +0 -0
  200. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/validators/__init__.py +0 -0
  201. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/validators/base_validator.py +0 -0
  202. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/validators/citation_validator.py +0 -0
  203. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/validators/doi/__init__.py +0 -0
  204. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/validators/doi/api_clients.py +0 -0
  205. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/validators/doi/metadata_comparator.py +0 -0
  206. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/validators/doi_validator.py +0 -0
  207. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/validators/figure_validator.py +0 -0
  208. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/validators/latex_error_parser.py +0 -0
  209. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/validators/math_validator.py +0 -0
  210. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/validators/pdf_validator.py +0 -0
  211. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/validators/reference_validator.py +0 -0
  212. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/rxiv_maker/validators/syntax_validator.py +0 -0
  213. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/tex/style/rxiv_maker_style.bst +0 -0
  214. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/src/tex/template.tex +0 -0
  215. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/__init__.py +0 -0
  216. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/cli/__init__.py +0 -0
  217. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/cli/test_build.py +0 -0
  218. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/cli/test_init_command.py +0 -0
  219. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/cli/test_main.py +0 -0
  220. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/conftest.py +0 -0
  221. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/e2e/__init__.py +0 -0
  222. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/e2e/test_dummy_manuscript_generator.py +0 -0
  223. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/e2e/test_figure_workflow_validation.py +0 -0
  224. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/fixtures/00_CONFIG.yml +0 -0
  225. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/fixtures/01_MAIN.md +0 -0
  226. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/fixtures/03_REFERENCES.bib +0 -0
  227. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/fixtures/FIGURES/Fig1.png +0 -0
  228. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/fixtures/FIGURES/Fig2.png +0 -0
  229. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/fixtures/FIGURES/Fig3.png +0 -0
  230. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/fixtures/README.md +0 -0
  231. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/fixtures/docx_export/sample_manuscript/01_MAIN.md +0 -0
  232. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/fixtures/docx_export/sample_manuscript/02_SUPPLEMENTARY_INFO.md +0 -0
  233. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/fixtures/docx_export/sample_manuscript/03_REFERENCES.bib +0 -0
  234. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/integration/__init__.py +0 -0
  235. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/integration/test_article_generation.py +0 -0
  236. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/integration/test_bibliography_author_format_docx.py +0 -0
  237. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/integration/test_binary_distribution.py +0 -0
  238. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/integration/test_centralized_components.py +0 -0
  239. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/integration/test_citation_injection.py +0 -0
  240. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/integration/test_comment_system_integration.py +0 -0
  241. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/integration/test_docx_export_integration.py +0 -0
  242. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/integration/test_doi_fallback_integration.py +0 -0
  243. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/integration/test_doi_validation_integration.py +0 -0
  244. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/integration/test_example_manuscript.py +0 -0
  245. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/integration/test_guillaume_fixtures.py +0 -0
  246. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/integration/test_homebrew_workflow_validation.py +0 -0
  247. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/integration/test_infrastructure_suite.py +0 -0
  248. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/integration/test_init_build_workflow.py +0 -0
  249. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/integration/test_install_verification_integration.py +0 -0
  250. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/integration/test_latex_dependency_integration.py +0 -0
  251. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/integration/test_manuscript_directory_integration.py +0 -0
  252. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/integration/test_manuscript_python_execution_reporting.py +0 -0
  253. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/integration/test_practical_manuscript_workflows.py +0 -0
  254. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/integration/test_pypi_package_integration.py +0 -0
  255. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/integration/test_python_execution_integration.py +0 -0
  256. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/integration/test_repository_cli_integration.py +0 -0
  257. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/integration/test_supplementary_formatting.py +0 -0
  258. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/integration/test_user_reported_issue.py +0 -0
  259. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/integration/test_validation_workflow.py +0 -0
  260. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/regression/README.md +0 -0
  261. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/regression/conftest.py +0 -0
  262. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/regression/test_cli_argument_parsing.py +0 -0
  263. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/regression/test_discord_reported_issues.py +0 -0
  264. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/regression/test_error_message_quality.py +0 -0
  265. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/regression/test_google_colab_integration.py +0 -0
  266. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/regression/test_guillaume_edge_cases.py +0 -0
  267. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/regression/test_guillaume_pr131_rewrite.py +0 -0
  268. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/regression/test_path_resolution.py +0 -0
  269. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/regression/test_widget_author_behavior.py +0 -0
  270. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/regression/test_widget_interactions_playwright.py +0 -0
  271. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/smoke/__init__.py +0 -0
  272. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/smoke/test_basic_functionality.py +0 -0
  273. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/smoke/test_cli_smoke.py +0 -0
  274. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/system/__init__.py +0 -0
  275. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/system/test_ci_matrix.py +0 -0
  276. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/system/test_cli_workflows.py +0 -0
  277. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/system/test_end_to_end.py +0 -0
  278. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/test_homebrew_checker.py +0 -0
  279. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/test_install_detector.py +0 -0
  280. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/unit/__init__.py +0 -0
  281. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/unit/exporters/__init__.py +0 -0
  282. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/unit/exporters/test_docx_citation_mapper.py +0 -0
  283. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/unit/exporters/test_docx_content_processor.py +0 -0
  284. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/unit/test_add_bibliography.py +0 -0
  285. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/unit/test_arxiv_command.py +0 -0
  286. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/unit/test_async_execution_manager.py +0 -0
  287. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/unit/test_author_name_formatter.py +0 -0
  288. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/unit/test_author_processor.py +0 -0
  289. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/unit/test_bst_generator.py +0 -0
  290. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/unit/test_build_command.py +0 -0
  291. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/unit/test_build_manager.py +0 -0
  292. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/unit/test_build_manager_manuscript_path.py +0 -0
  293. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/unit/test_cache_security.py +0 -0
  294. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/unit/test_cache_utils.py +0 -0
  295. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/unit/test_check_installation_command.py +0 -0
  296. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/unit/test_citation_processor.py +0 -0
  297. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/unit/test_citation_rendering.py +0 -0
  298. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/unit/test_citation_style.py +0 -0
  299. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/unit/test_citation_utils.py +0 -0
  300. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/unit/test_cli_cleanup_integration.py +0 -0
  301. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/unit/test_cli_structure.py +0 -0
  302. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/unit/test_comment_processor.py +0 -0
  303. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/unit/test_conda_installation_manager.py +0 -0
  304. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/unit/test_conda_platform_detection.py +0 -0
  305. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/unit/test_cross_platform_optimizations.py +0 -0
  306. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/unit/test_custom_command_processor.py +0 -0
  307. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/unit/test_dependency_manager.py +0 -0
  308. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/unit/test_dependency_package_names.py +0 -0
  309. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/unit/test_docx_doi_resolution.py +0 -0
  310. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/unit/test_docx_helpers.py +0 -0
  311. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/unit/test_doi_fallback_system.py +0 -0
  312. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/unit/test_doi_resolver.py +0 -0
  313. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/unit/test_doi_validator.py +0 -0
  314. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/unit/test_email_encoder.py +0 -0
  315. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/unit/test_environment_manager.py +0 -0
  316. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/unit/test_error_handling_scenarios.py +0 -0
  317. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/unit/test_execution_manager_comprehensive.py +0 -0
  318. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/unit/test_figure_generator.py +0 -0
  319. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/unit/test_figure_processor.py +0 -0
  320. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/unit/test_figure_processor_error_handling.py +0 -0
  321. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/unit/test_file_helpers.py +0 -0
  322. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/unit/test_fix_bibliography.py +0 -0
  323. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/unit/test_generate_docs.py +0 -0
  324. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/unit/test_generate_preprint.py +0 -0
  325. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/unit/test_github.py +0 -0
  326. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/unit/test_github_actions_integration.py +0 -0
  327. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/unit/test_importlib_edge_cases.py +0 -0
  328. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/unit/test_install_platform_installers.py +0 -0
  329. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/unit/test_install_system_libs.py +0 -0
  330. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/unit/test_install_verification.py +0 -0
  331. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/unit/test_interactive_path_change.py +0 -0
  332. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/unit/test_interactive_validators.py +0 -0
  333. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/unit/test_latex_dependency_handler.py +0 -0
  334. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/unit/test_manuscript_figure_utils.py +0 -0
  335. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/unit/test_manuscript_repository.py +0 -0
  336. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/unit/test_math_processor.py +0 -0
  337. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/unit/test_md2tex.py +0 -0
  338. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/unit/test_mermaid_fallback.py +0 -0
  339. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/unit/test_path_manager.py +0 -0
  340. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/unit/test_pdf_validator.py +0 -0
  341. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/unit/test_platform_comprehensive.py +0 -0
  342. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/unit/test_platform_detector.py +0 -0
  343. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/unit/test_processor_suite.py +0 -0
  344. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/unit/test_python_execution_reporter.py +0 -0
  345. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/unit/test_python_executor.py +0 -0
  346. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/unit/test_release_orchestrator.py +0 -0
  347. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/unit/test_repository_manager.py +0 -0
  348. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/unit/test_rich_upgrade_notifier.py +0 -0
  349. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/unit/test_rxiv_setup_command.py +0 -0
  350. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/unit/test_security_features.py +0 -0
  351. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/unit/test_security_scanner.py +0 -0
  352. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/unit/test_setup_environment.py +0 -0
  353. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/unit/test_style_file_resolution.py +0 -0
  354. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/unit/test_supplementary_note_processor.py +0 -0
  355. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/unit/test_table_rotation.py +0 -0
  356. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/unit/test_template_processor.py +0 -0
  357. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/unit/test_text_formatters.py +0 -0
  358. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/unit/test_text_utils.py +0 -0
  359. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/unit/test_tips.py +0 -0
  360. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/unit/test_title_sync.py +0 -0
  361. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/unit/test_title_sync_validation.py +0 -0
  362. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/unit/test_track_changes.py +0 -0
  363. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/unit/test_trailing_slash_regression.py +0 -0
  364. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/unit/test_upgrade_command.py +0 -0
  365. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/unit/test_url_to_doi.py +0 -0
  366. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/unit/test_utils.py +0 -0
  367. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/unit/test_validate_backticks.py +0 -0
  368. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/unit/test_validate_command_fixed.py +0 -0
  369. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/unit/test_validate_manuscript.py +0 -0
  370. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/unit/test_validation_suite.py +0 -0
  371. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/unit/test_validators.py +0 -0
  372. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/unit/test_yaml_processor.py +0 -0
  373. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/visual/README.md +0 -0
  374. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/visual/figure-positioning/00_CONFIG.yml +0 -0
  375. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/visual/figure-positioning/01_MAIN.md +0 -0
  376. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/visual/figure-positioning/03_REFERENCES.bib +0 -0
  377. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/visual/figure-positioning/FIGURES/Figure__positioning_test.png +0 -0
  378. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/visual/figure-positioning/FIGURES/Figure__positioning_test.py +0 -0
  379. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/visual/figure-positioning/FIGURES/ReadyFig.png +0 -0
  380. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/visual/figure-positioning/FIGURES/ReadyFig.py +0 -0
  381. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/visual/figure-positioning/README.md +0 -0
  382. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/visual/methods-placement/00_CONFIG.yml +0 -0
  383. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/visual/methods-placement/01_MAIN.md +0 -0
  384. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/visual/methods-placement/02_SUPPLEMENTARY_INFO.md +0 -0
  385. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/visual/methods-placement/03_REFERENCES.bib +0 -0
  386. {rxiv_maker-1.18.5 → rxiv_maker-1.19.1}/tests/visual/methods-placement/README.md +0 -0
@@ -394,3 +394,8 @@ rxivdraft/MANUSCRIPT/2025__antónio_d_brito_et_al__rxiv.pdf
394
394
  .gemini-clipboard/
395
395
  gha-creds-*.json
396
396
  fatetracking/MANUSCRIPT/.rxiv_cache
397
+
398
+ # Claude-mem context (override negations above)
399
+ **/CLAUDE.md
400
+
401
+ **/*.docx
@@ -7,6 +7,51 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [1.19.1] - 2026-02-05
11
+
12
+ ### Fixed
13
+
14
+ - **bioRxiv Character Encoding**: Enhanced HTML entity encoding to handle all Unicode characters
15
+ - Now uses numeric character references (e.g., `č` for č) for characters without named HTML entities
16
+ - Properly encodes Lithuanian characters (č, ū, ė) and other special characters
17
+ - Example: "Vaitkevičiūtė" → "Vaitkevičiūtė"
18
+ - Ensures bioRxiv TSV files handle international author names correctly
19
+
20
+ - **LaTeX Section Spacing**: Fixed spacing issues in PDF output for section headers
21
+ - Added proper blank lines (`\n\n`) after all LaTeX section commands in markdown conversion
22
+ - Increased spacing after `\subsubsection` titles from 1pt to 8pt in LaTeX class file
23
+ - Changed subsubsection title format to use `\enskip` for consistent visual spacing
24
+ - Fixes runin format issue where text appeared to run directly into section titles
25
+ - Example fix: "Manuscripts.A central" → "Manuscripts. A central" (with visible space)
26
+
27
+ ## [1.19.0] - 2026-02-05
28
+
29
+ ### Added
30
+
31
+ - **bioRxiv Submission Package Command**: New `rxiv biorxiv` command generates complete submission package
32
+ - Generates bioRxiv author template (TSV format) with HTML entity encoding for special characters
33
+ - Includes manuscript PDF, source files (TeX, figures, bibliography)
34
+ - Creates ZIP archive ready for bioRxiv upload
35
+ - Supports custom submission directory and ZIP filename options
36
+ - HTML entity encoding for accented characters (António → António, Åbo → Åbo)
37
+ - Automatic handling of multiple corresponding authors (keeps last one)
38
+ - Command options: `--biorxiv-dir`, `--zip-filename`, `--no-zip`
39
+
40
+ ### Changed
41
+
42
+ - **Code Architecture**: Centralized common submission logic in BaseCommand
43
+ - Refactored ArxivCommand and BioRxivCommand to share common patterns
44
+ - Added `_clear_output_directory()`, `_ensure_pdf_built()`, `_set_submission_defaults()` helper methods
45
+ - Eliminated ~64 lines of duplicated code between commands
46
+ - Improved maintainability and consistency across submission commands
47
+
48
+ ### Fixed
49
+
50
+ - **bioRxiv Character Encoding**: Special characters now properly encoded as HTML entities
51
+ - Previously stripped accents to ASCII (António → Antonio)
52
+ - Now preserves original characters using HTML entities (António → António)
53
+ - Complies with bioRxiv's TSV import requirements for international author names
54
+
10
55
  ## [1.18.5] - 2026-02-05
11
56
 
12
57
  ### Fixed
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: rxiv-maker
3
- Version: 1.18.5
3
+ Version: 1.19.1
4
4
  Summary: Write scientific preprints in Markdown. Generate publication-ready PDFs efficiently.
5
5
  Project-URL: Homepage, https://github.com/HenriquesLab/rxiv-maker
6
6
  Project-URL: Documentation, https://github.com/HenriquesLab/rxiv-maker#readme
@@ -1,3 +1,3 @@
1
1
  """Version information."""
2
2
 
3
- __version__ = "1.18.5"
3
+ __version__ = "1.19.1"
@@ -2,6 +2,7 @@
2
2
 
3
3
  from .arxiv import arxiv
4
4
  from .bibliography import bibliography
5
+ from .biorxiv import biorxiv
5
6
  from .build import build as pdf
6
7
  from .cache_management import cache_group as cache
7
8
  from .changelog import changelog
@@ -29,6 +30,7 @@ from .version import version
29
30
  __all__ = [
30
31
  "arxiv",
31
32
  "bibliography",
33
+ "biorxiv",
32
34
  "cache",
33
35
  "changelog",
34
36
  "config",
@@ -0,0 +1,51 @@
1
+ """bioRxiv submission package generation command."""
2
+
3
+ import rich_click as click
4
+
5
+ from ..framework.workflow_commands import BioRxivCommand
6
+
7
+
8
+ @click.command(context_settings={"help_option_names": ["-h", "--help"]})
9
+ @click.argument("manuscript_path", type=click.Path(exists=True, file_okay=False), required=False)
10
+ @click.option("--output-dir", "-o", default="output", help="Output directory for generated files")
11
+ @click.option(
12
+ "--biorxiv-dir",
13
+ "-b",
14
+ help="Custom bioRxiv submission directory (default: output/biorxiv_submission)",
15
+ )
16
+ @click.option(
17
+ "--zip-filename",
18
+ "-z",
19
+ help="Custom ZIP filename (default: {manuscript}_biorxiv.zip)",
20
+ )
21
+ @click.option(
22
+ "--no-zip",
23
+ is_flag=True,
24
+ help="Don't create ZIP file (only create submission directory)",
25
+ )
26
+ @click.pass_context
27
+ def biorxiv(ctx, manuscript_path, output_dir, biorxiv_dir, zip_filename, no_zip):
28
+ r"""Generate bioRxiv submission package.
29
+
30
+ Creates a complete submission package including:
31
+ - bioRxiv author template (TSV file)
32
+ - Manuscript PDF
33
+ - Source files (TeX, figures, bibliography)
34
+ - ZIP file for upload
35
+
36
+ \b
37
+ Example:
38
+ rxiv biorxiv # Full package with ZIP
39
+ rxiv biorxiv --no-zip # Package without ZIP
40
+ rxiv biorxiv -b custom_dir # Custom submission directory
41
+ rxiv biorxiv -z my_submission.zip # Custom ZIP filename
42
+ """
43
+ command = BioRxivCommand()
44
+ return command.run(
45
+ ctx,
46
+ manuscript_path=manuscript_path,
47
+ output_dir=output_dir,
48
+ biorxiv_dir=biorxiv_dir,
49
+ zip_filename=zip_filename,
50
+ no_zip=no_zip,
51
+ )
@@ -162,6 +162,97 @@ class BaseCommand(ABC):
162
162
  if suggestion:
163
163
  self.console.print(f"💡 {suggestion}", style="yellow")
164
164
 
165
+ def _clear_output_directory(self) -> None:
166
+ """Clear and recreate the output directory.
167
+
168
+ Raises:
169
+ CommandExecutionError: If path_manager is not initialized
170
+ """
171
+ import shutil
172
+
173
+ if not self.path_manager:
174
+ raise CommandExecutionError("Path manager not initialized")
175
+
176
+ if self.path_manager.output_dir.exists():
177
+ shutil.rmtree(self.path_manager.output_dir)
178
+ self.path_manager.output_dir.mkdir(parents=True, exist_ok=True)
179
+
180
+ def _ensure_pdf_built(self, progress_task=None, quiet: bool = True) -> None:
181
+ """Ensure PDF is built, building it if necessary.
182
+
183
+ Args:
184
+ progress_task: Optional progress task to update
185
+ quiet: Whether to suppress build output
186
+
187
+ Raises:
188
+ CommandExecutionError: If path_manager is not initialized or build fails
189
+ """
190
+ from ...engines.operations.build_manager import BuildManager
191
+
192
+ if not self.path_manager:
193
+ raise CommandExecutionError("Path manager not initialized")
194
+
195
+ pdf_filename = f"{self.path_manager.manuscript_name}.pdf"
196
+ pdf_path = self.path_manager.output_dir / pdf_filename
197
+
198
+ if not pdf_path.exists():
199
+ if progress_task:
200
+ progress_task.update(description="Building PDF first...")
201
+
202
+ build_manager = BuildManager(
203
+ manuscript_path=str(self.path_manager.manuscript_path),
204
+ output_dir=str(self.path_manager.output_dir),
205
+ verbose=self.verbose,
206
+ quiet=quiet,
207
+ )
208
+
209
+ try:
210
+ success = build_manager.build()
211
+ if not success:
212
+ raise CommandExecutionError("PDF build failed")
213
+ except Exception as e:
214
+ raise CommandExecutionError(f"Failed to build PDF: {e}") from e
215
+
216
+ def _set_submission_defaults(
217
+ self,
218
+ submission_type: str,
219
+ submission_dir: Optional[str] = None,
220
+ zip_filename: Optional[str] = None,
221
+ ) -> tuple[str, str]:
222
+ """Set default paths for submission directories and ZIP files.
223
+
224
+ Args:
225
+ submission_type: Type of submission ("arxiv" or "biorxiv")
226
+ submission_dir: Custom submission directory path (optional)
227
+ zip_filename: Custom ZIP filename (optional)
228
+
229
+ Returns:
230
+ Tuple of (submission_dir, zip_filename) with defaults applied
231
+
232
+ Raises:
233
+ CommandExecutionError: If path_manager is not initialized
234
+ """
235
+ from pathlib import Path
236
+
237
+ if not self.path_manager:
238
+ raise CommandExecutionError("Path manager not initialized")
239
+
240
+ manuscript_output_dir = str(self.path_manager.output_dir)
241
+
242
+ # Set default submission directory
243
+ if submission_dir is None:
244
+ submission_dir = str(Path(manuscript_output_dir) / f"{submission_type}_submission")
245
+
246
+ # Set default ZIP filename
247
+ if zip_filename is None:
248
+ manuscript_name = self.path_manager.manuscript_name
249
+ if submission_type == "arxiv":
250
+ zip_filename = str(Path(manuscript_output_dir) / "for_arxiv.zip")
251
+ else:
252
+ zip_filename = str(Path(manuscript_output_dir) / f"{manuscript_name}_{submission_type}.zip")
253
+
254
+ return submission_dir, zip_filename
255
+
165
256
  @abstractmethod
166
257
  def execute_operation(self, **kwargs) -> Any:
167
258
  """Execute the main command operation.
@@ -366,46 +366,25 @@ class ArxivCommand(BaseCommand):
366
366
  no_zip: Don't create zip file
367
367
  """
368
368
  import sys
369
- from pathlib import Path
370
369
 
371
- from rxiv_maker.engines.operations.build_manager import BuildManager
372
370
  from rxiv_maker.engines.operations.prepare_arxiv import main as prepare_arxiv_main
373
371
 
374
- if self.path_manager is None:
375
- raise CommandExecutionError("Path manager not initialized")
376
-
372
+ # Set defaults using shared helper
373
+ arxiv_dir, zip_filename = self._set_submission_defaults("arxiv", arxiv_dir, zip_filename)
377
374
  manuscript_output_dir = str(self.path_manager.output_dir)
378
375
 
379
- # Set defaults using PathManager
380
- if arxiv_dir is None:
381
- arxiv_dir = str(Path(manuscript_output_dir) / "arxiv_submission")
382
- if zip_filename is None:
383
- zip_filename = str(Path(manuscript_output_dir) / "for_arxiv.zip")
384
-
385
376
  with self.create_progress() as progress:
386
- # Clear output directory first (similar to PDF command)
377
+ # Clear output directory using shared helper
387
378
  task = progress.add_task("Clearing output directory...", total=None)
388
- if self.path_manager.output_dir.exists():
389
- shutil.rmtree(self.path_manager.output_dir)
390
- self.path_manager.output_dir.mkdir(parents=True, exist_ok=True)
379
+ self._clear_output_directory()
391
380
 
392
- # First, ensure PDF is built
381
+ # Ensure PDF is built using shared helper
393
382
  progress.update(task, description="Checking PDF exists...")
394
- pdf_filename = f"{self.path_manager.manuscript_name}.pdf"
395
- pdf_path = self.path_manager.output_dir / pdf_filename
396
-
397
- if not pdf_path.exists():
398
- progress.update(task, description="Building PDF first...")
399
- build_manager = BuildManager(
400
- manuscript_path=str(self.path_manager.manuscript_path),
401
- output_dir=str(self.path_manager.output_dir),
402
- verbose=self.verbose,
403
- quiet=False,
404
- )
405
- success = build_manager.run()
406
- if not success:
407
- self.error_message("PDF build failed. Cannot prepare arXiv package.")
408
- raise CommandExecutionError("PDF build failed")
383
+ try:
384
+ self._ensure_pdf_built(progress_task=task, quiet=False)
385
+ except CommandExecutionError:
386
+ self.error_message("PDF build failed. Cannot prepare arXiv package.")
387
+ raise
409
388
 
410
389
  # Prepare arXiv package
411
390
  progress.update(task, description="Preparing arXiv package...")
@@ -524,6 +503,95 @@ class ArxivCommand(BaseCommand):
524
503
  return year, first_author
525
504
 
526
505
 
506
+ class BioRxivCommand(BaseCommand):
507
+ """BioRxiv command implementation for generating submission package."""
508
+
509
+ def execute_operation(
510
+ self,
511
+ output_dir: str = "output",
512
+ biorxiv_dir: Optional[str] = None,
513
+ zip_filename: Optional[str] = None,
514
+ no_zip: bool = False,
515
+ ) -> None:
516
+ """Execute bioRxiv submission package preparation.
517
+
518
+ Args:
519
+ output_dir: Output directory for generated files
520
+ biorxiv_dir: Custom bioRxiv submission directory path
521
+ zip_filename: Custom zip filename
522
+ no_zip: Don't create zip file
523
+ """
524
+ from pathlib import Path
525
+
526
+ from ...engines.operations.prepare_biorxiv import (
527
+ BioRxivAuthorError,
528
+ create_biorxiv_zip,
529
+ generate_biorxiv_author_tsv,
530
+ prepare_biorxiv_package,
531
+ )
532
+
533
+ # Set defaults using shared helper
534
+ biorxiv_dir, zip_filename = self._set_submission_defaults("biorxiv", biorxiv_dir, zip_filename)
535
+
536
+ with self.create_progress() as progress:
537
+ # Clear output directory using shared helper
538
+ task = progress.add_task("Clearing output directory...", total=None)
539
+ self._clear_output_directory()
540
+
541
+ # Ensure PDF is built using shared helper
542
+ progress.update(task, description="Checking PDF exists...")
543
+ self._ensure_pdf_built(progress_task=task, quiet=True)
544
+
545
+ # Generate bioRxiv author template TSV
546
+ progress.update(task, description="Generating bioRxiv author template...")
547
+ output_path = self.path_manager.output_dir
548
+ tsv_file = output_path / "biorxiv_authors.tsv"
549
+
550
+ try:
551
+ generate_biorxiv_author_tsv(
552
+ config_path=self.path_manager.get_config_file_path(),
553
+ output_path=tsv_file,
554
+ )
555
+ except BioRxivAuthorError as e:
556
+ progress.update(task, completed=True)
557
+ raise CommandExecutionError(f"Failed to generate bioRxiv template: {e}") from e
558
+
559
+ # Prepare bioRxiv submission package
560
+ progress.update(task, description="Preparing bioRxiv submission package...")
561
+ try:
562
+ biorxiv_path = prepare_biorxiv_package(
563
+ manuscript_path=self.path_manager.manuscript_path,
564
+ output_dir=self.path_manager.output_dir,
565
+ biorxiv_dir=Path(biorxiv_dir),
566
+ )
567
+ except Exception as e:
568
+ progress.update(task, completed=True)
569
+ raise CommandExecutionError(f"Failed to prepare bioRxiv package: {e}") from e
570
+
571
+ # Create ZIP file if requested
572
+ zip_path = None
573
+ if not no_zip:
574
+ progress.update(task, description="Creating ZIP package...")
575
+ try:
576
+ zip_path = create_biorxiv_zip(
577
+ biorxiv_path=biorxiv_path,
578
+ zip_filename=zip_filename,
579
+ manuscript_path=self.path_manager.manuscript_path,
580
+ )
581
+ except Exception as e:
582
+ progress.update(task, completed=True)
583
+ raise CommandExecutionError(f"Failed to create ZIP: {e}") from e
584
+
585
+ progress.update(task, completed=True)
586
+
587
+ # Show success message
588
+ self.console.print("\n[green]✅ bioRxiv submission package ready![/green]")
589
+ self.console.print(f" 📁 Package directory: {biorxiv_path}")
590
+ if zip_path:
591
+ self.console.print(f" 📦 ZIP file: {zip_path}")
592
+ self.console.print("\n📤 Upload to: https://submit.biorxiv.org/")
593
+
594
+
527
595
  class TrackChangesCommand(BaseCommand):
528
596
  """Track changes command implementation using the framework."""
529
597
 
@@ -60,7 +60,7 @@ click.rich_click.COMMAND_GROUPS = {
60
60
  },
61
61
  {
62
62
  "name": "Workflow Commands",
63
- "commands": ["get-rxiv-preprint", "arxiv", "track-changes", "setup"],
63
+ "commands": ["get-rxiv-preprint", "arxiv", "biorxiv", "track-changes", "setup"],
64
64
  },
65
65
  {
66
66
  "name": "Configuration",
@@ -252,6 +252,7 @@ main.add_command(commands.docx)
252
252
  main.add_command(commands.figures)
253
253
  main.add_command(commands.get_rxiv_preprint, name="get-rxiv-preprint")
254
254
  main.add_command(commands.arxiv)
255
+ main.add_command(commands.biorxiv)
255
256
  main.add_command(commands.init)
256
257
  main.add_command(commands.bibliography)
257
258
  main.add_command(commands.track_changes)
@@ -185,7 +185,7 @@ def convert_markdown_to_latex(
185
185
 
186
186
  # Post-processing: catch any remaining unconverted headers
187
187
  # This is a safety net in case some headers weren't converted properly
188
- content = re.sub(r"^### (.+)$", r"\\subsubsection{\1}", content, flags=re.MULTILINE)
188
+ content = re.sub(r"^### (.+)$", r"\\subsubsection{\1}\n\n", content, flags=re.MULTILINE)
189
189
 
190
190
  # Process supplementary note references BEFORE citations
191
191
  # (for both main and supplementary content)
@@ -457,26 +457,26 @@ def _process_tables_with_protection(
457
457
 
458
458
 
459
459
  def _convert_headers(content: LatexContent, is_supplementary: bool = False) -> LatexContent:
460
- """Convert markdown headers to LaTeX sections."""
460
+ """Convert markdown headers to LaTeX sections with proper spacing."""
461
461
  if is_supplementary:
462
462
  # For supplementary content, use \\section* for the first header
463
463
  # to avoid "Note 1:" prefix
464
464
  # First, find the first # header and replace it with \section*
465
- content = re.sub(r"^# (.+)$", r"\\section*{\1}", content, flags=re.MULTILINE, count=1)
465
+ content = re.sub(r"^# (.+)$", r"\\section*{\1}\n\n", content, flags=re.MULTILINE, count=1)
466
466
  # Then replace any remaining # headers with regular \section
467
- content = re.sub(r"^# (.+)$", r"\\section{\1}", content, flags=re.MULTILINE)
467
+ content = re.sub(r"^# (.+)$", r"\\section{\1}\n\n", content, flags=re.MULTILINE)
468
468
  else:
469
- content = re.sub(r"^# (.+)$", r"\\section{\1}", content, flags=re.MULTILINE)
469
+ content = re.sub(r"^# (.+)$", r"\\section{\1}\n\n", content, flags=re.MULTILINE)
470
470
 
471
- content = re.sub(r"^## (.+)$", r"\\subsection{\1}", content, flags=re.MULTILINE)
471
+ content = re.sub(r"^## (.+)$", r"\\subsection{\1}\n\n", content, flags=re.MULTILINE)
472
472
 
473
473
  # For supplementary content, ### headers are handled by the
474
474
  # supplementary note processor
475
475
  # For non-supplementary content, convert all ### headers normally
476
476
  if not is_supplementary:
477
- content = re.sub(r"^### (.+)$", r"\\subsubsection{\1}", content, flags=re.MULTILINE)
477
+ content = re.sub(r"^### (.+)$", r"\\subsubsection{\1}\n\n", content, flags=re.MULTILINE)
478
478
 
479
- content = re.sub(r"^#### (.+)$", r"\\paragraph{\1}", content, flags=re.MULTILINE)
479
+ content = re.sub(r"^#### (.+)$", r"\\paragraph{\1}\n\n", content, flags=re.MULTILINE)
480
480
  return content
481
481
 
482
482