scientific-writer 2.1.1__py3-none-any.whl → 2.2.2__py3-none-any.whl

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.

Potentially problematic release.


This version of scientific-writer might be problematic. Click here for more details.

Files changed (311) hide show
  1. scientific_writer/.claude/settings.local.json +30 -0
  2. scientific_writer/.claude/skills/citation-management/SKILL.md +1046 -0
  3. scientific_writer/.claude/skills/citation-management/assets/bibtex_template.bib +264 -0
  4. scientific_writer/.claude/skills/citation-management/assets/citation_checklist.md +386 -0
  5. scientific_writer/.claude/skills/citation-management/references/bibtex_formatting.md +908 -0
  6. scientific_writer/.claude/skills/citation-management/references/citation_validation.md +794 -0
  7. scientific_writer/.claude/skills/citation-management/references/google_scholar_search.md +725 -0
  8. scientific_writer/.claude/skills/citation-management/references/metadata_extraction.md +870 -0
  9. scientific_writer/.claude/skills/citation-management/references/pubmed_search.md +839 -0
  10. scientific_writer/.claude/skills/citation-management/scripts/doi_to_bibtex.py +204 -0
  11. scientific_writer/.claude/skills/citation-management/scripts/extract_metadata.py +569 -0
  12. scientific_writer/.claude/skills/citation-management/scripts/format_bibtex.py +349 -0
  13. scientific_writer/.claude/skills/citation-management/scripts/search_google_scholar.py +282 -0
  14. scientific_writer/.claude/skills/citation-management/scripts/search_pubmed.py +398 -0
  15. scientific_writer/.claude/skills/citation-management/scripts/validate_citations.py +497 -0
  16. scientific_writer/.claude/skills/clinical-reports/IMPLEMENTATION_SUMMARY.md +641 -0
  17. scientific_writer/.claude/skills/clinical-reports/README.md +236 -0
  18. scientific_writer/.claude/skills/clinical-reports/SKILL.md +1088 -0
  19. scientific_writer/.claude/skills/clinical-reports/assets/case_report_template.md +352 -0
  20. scientific_writer/.claude/skills/clinical-reports/assets/clinical_trial_csr_template.md +353 -0
  21. scientific_writer/.claude/skills/clinical-reports/assets/clinical_trial_sae_template.md +359 -0
  22. scientific_writer/.claude/skills/clinical-reports/assets/consult_note_template.md +305 -0
  23. scientific_writer/.claude/skills/clinical-reports/assets/discharge_summary_template.md +453 -0
  24. scientific_writer/.claude/skills/clinical-reports/assets/hipaa_compliance_checklist.md +395 -0
  25. scientific_writer/.claude/skills/clinical-reports/assets/history_physical_template.md +305 -0
  26. scientific_writer/.claude/skills/clinical-reports/assets/lab_report_template.md +309 -0
  27. scientific_writer/.claude/skills/clinical-reports/assets/pathology_report_template.md +249 -0
  28. scientific_writer/.claude/skills/clinical-reports/assets/quality_checklist.md +338 -0
  29. scientific_writer/.claude/skills/clinical-reports/assets/radiology_report_template.md +318 -0
  30. scientific_writer/.claude/skills/clinical-reports/assets/soap_note_template.md +253 -0
  31. scientific_writer/.claude/skills/clinical-reports/references/case_report_guidelines.md +570 -0
  32. scientific_writer/.claude/skills/clinical-reports/references/clinical_trial_reporting.md +693 -0
  33. scientific_writer/.claude/skills/clinical-reports/references/data_presentation.md +530 -0
  34. scientific_writer/.claude/skills/clinical-reports/references/diagnostic_reports_standards.md +629 -0
  35. scientific_writer/.claude/skills/clinical-reports/references/medical_terminology.md +588 -0
  36. scientific_writer/.claude/skills/clinical-reports/references/patient_documentation.md +744 -0
  37. scientific_writer/.claude/skills/clinical-reports/references/peer_review_standards.md +585 -0
  38. scientific_writer/.claude/skills/clinical-reports/references/regulatory_compliance.md +577 -0
  39. scientific_writer/.claude/skills/clinical-reports/scripts/check_deidentification.py +346 -0
  40. scientific_writer/.claude/skills/clinical-reports/scripts/compliance_checker.py +78 -0
  41. scientific_writer/.claude/skills/clinical-reports/scripts/extract_clinical_data.py +102 -0
  42. scientific_writer/.claude/skills/clinical-reports/scripts/format_adverse_events.py +103 -0
  43. scientific_writer/.claude/skills/clinical-reports/scripts/generate_report_template.py +163 -0
  44. scientific_writer/.claude/skills/clinical-reports/scripts/terminology_validator.py +133 -0
  45. scientific_writer/.claude/skills/clinical-reports/scripts/validate_case_report.py +334 -0
  46. scientific_writer/.claude/skills/clinical-reports/scripts/validate_trial_report.py +89 -0
  47. scientific_writer/.claude/skills/document-skills/docx/LICENSE.txt +30 -0
  48. scientific_writer/.claude/skills/document-skills/docx/SKILL.md +197 -0
  49. scientific_writer/.claude/skills/document-skills/docx/docx-js.md +350 -0
  50. scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
  51. scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
  52. scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
  53. scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
  54. scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
  55. scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
  56. scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
  57. scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
  58. scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
  59. scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
  60. scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
  61. scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
  62. scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
  63. scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
  64. scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
  65. scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
  66. scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
  67. scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
  68. scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
  69. scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
  70. scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
  71. scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
  72. scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
  73. scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
  74. scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
  75. scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
  76. scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
  77. scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
  78. scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
  79. scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
  80. scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
  81. scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/mce/mc.xsd +75 -0
  82. scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/microsoft/wml-2010.xsd +560 -0
  83. scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/microsoft/wml-2012.xsd +67 -0
  84. scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/microsoft/wml-2018.xsd +14 -0
  85. scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/microsoft/wml-cex-2018.xsd +20 -0
  86. scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/microsoft/wml-cid-2016.xsd +13 -0
  87. scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
  88. scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/microsoft/wml-symex-2015.xsd +8 -0
  89. scientific_writer/.claude/skills/document-skills/docx/ooxml/scripts/pack.py +159 -0
  90. scientific_writer/.claude/skills/document-skills/docx/ooxml/scripts/unpack.py +29 -0
  91. scientific_writer/.claude/skills/document-skills/docx/ooxml/scripts/validate.py +69 -0
  92. scientific_writer/.claude/skills/document-skills/docx/ooxml/scripts/validation/__init__.py +15 -0
  93. scientific_writer/.claude/skills/document-skills/docx/ooxml/scripts/validation/base.py +951 -0
  94. scientific_writer/.claude/skills/document-skills/docx/ooxml/scripts/validation/docx.py +274 -0
  95. scientific_writer/.claude/skills/document-skills/docx/ooxml/scripts/validation/pptx.py +315 -0
  96. scientific_writer/.claude/skills/document-skills/docx/ooxml/scripts/validation/redlining.py +279 -0
  97. scientific_writer/.claude/skills/document-skills/docx/ooxml.md +610 -0
  98. scientific_writer/.claude/skills/document-skills/docx/scripts/__init__.py +1 -0
  99. scientific_writer/.claude/skills/document-skills/docx/scripts/document.py +1276 -0
  100. scientific_writer/.claude/skills/document-skills/docx/scripts/templates/comments.xml +3 -0
  101. scientific_writer/.claude/skills/document-skills/docx/scripts/templates/commentsExtended.xml +3 -0
  102. scientific_writer/.claude/skills/document-skills/docx/scripts/templates/commentsExtensible.xml +3 -0
  103. scientific_writer/.claude/skills/document-skills/docx/scripts/templates/commentsIds.xml +3 -0
  104. scientific_writer/.claude/skills/document-skills/docx/scripts/templates/people.xml +3 -0
  105. scientific_writer/.claude/skills/document-skills/docx/scripts/utilities.py +374 -0
  106. scientific_writer/.claude/skills/document-skills/pdf/LICENSE.txt +30 -0
  107. scientific_writer/.claude/skills/document-skills/pdf/SKILL.md +294 -0
  108. scientific_writer/.claude/skills/document-skills/pdf/forms.md +205 -0
  109. scientific_writer/.claude/skills/document-skills/pdf/reference.md +612 -0
  110. scientific_writer/.claude/skills/document-skills/pdf/scripts/check_bounding_boxes.py +70 -0
  111. scientific_writer/.claude/skills/document-skills/pdf/scripts/check_bounding_boxes_test.py +226 -0
  112. scientific_writer/.claude/skills/document-skills/pdf/scripts/check_fillable_fields.py +12 -0
  113. scientific_writer/.claude/skills/document-skills/pdf/scripts/convert_pdf_to_images.py +35 -0
  114. scientific_writer/.claude/skills/document-skills/pdf/scripts/create_validation_image.py +41 -0
  115. scientific_writer/.claude/skills/document-skills/pdf/scripts/extract_form_field_info.py +152 -0
  116. scientific_writer/.claude/skills/document-skills/pdf/scripts/fill_fillable_fields.py +114 -0
  117. scientific_writer/.claude/skills/document-skills/pdf/scripts/fill_pdf_form_with_annotations.py +108 -0
  118. scientific_writer/.claude/skills/document-skills/pptx/LICENSE.txt +30 -0
  119. scientific_writer/.claude/skills/document-skills/pptx/SKILL.md +484 -0
  120. scientific_writer/.claude/skills/document-skills/pptx/html2pptx.md +625 -0
  121. scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
  122. scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
  123. scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
  124. scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
  125. scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
  126. scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
  127. scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
  128. scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
  129. scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
  130. scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
  131. scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
  132. scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
  133. scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
  134. scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
  135. scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
  136. scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
  137. scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
  138. scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
  139. scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
  140. scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
  141. scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
  142. scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
  143. scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
  144. scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
  145. scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
  146. scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
  147. scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
  148. scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
  149. scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
  150. scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
  151. scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
  152. scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/mce/mc.xsd +75 -0
  153. scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/microsoft/wml-2010.xsd +560 -0
  154. scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/microsoft/wml-2012.xsd +67 -0
  155. scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/microsoft/wml-2018.xsd +14 -0
  156. scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/microsoft/wml-cex-2018.xsd +20 -0
  157. scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/microsoft/wml-cid-2016.xsd +13 -0
  158. scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
  159. scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/microsoft/wml-symex-2015.xsd +8 -0
  160. scientific_writer/.claude/skills/document-skills/pptx/ooxml/scripts/pack.py +159 -0
  161. scientific_writer/.claude/skills/document-skills/pptx/ooxml/scripts/unpack.py +29 -0
  162. scientific_writer/.claude/skills/document-skills/pptx/ooxml/scripts/validate.py +69 -0
  163. scientific_writer/.claude/skills/document-skills/pptx/ooxml/scripts/validation/__init__.py +15 -0
  164. scientific_writer/.claude/skills/document-skills/pptx/ooxml/scripts/validation/base.py +951 -0
  165. scientific_writer/.claude/skills/document-skills/pptx/ooxml/scripts/validation/docx.py +274 -0
  166. scientific_writer/.claude/skills/document-skills/pptx/ooxml/scripts/validation/pptx.py +315 -0
  167. scientific_writer/.claude/skills/document-skills/pptx/ooxml/scripts/validation/redlining.py +279 -0
  168. scientific_writer/.claude/skills/document-skills/pptx/ooxml.md +427 -0
  169. scientific_writer/.claude/skills/document-skills/pptx/scripts/html2pptx.js +979 -0
  170. scientific_writer/.claude/skills/document-skills/pptx/scripts/inventory.py +1020 -0
  171. scientific_writer/.claude/skills/document-skills/pptx/scripts/rearrange.py +231 -0
  172. scientific_writer/.claude/skills/document-skills/pptx/scripts/replace.py +385 -0
  173. scientific_writer/.claude/skills/document-skills/pptx/scripts/thumbnail.py +450 -0
  174. scientific_writer/.claude/skills/document-skills/xlsx/LICENSE.txt +30 -0
  175. scientific_writer/.claude/skills/document-skills/xlsx/SKILL.md +289 -0
  176. scientific_writer/.claude/skills/document-skills/xlsx/recalc.py +178 -0
  177. scientific_writer/.claude/skills/hypothesis-generation/SKILL.md +155 -0
  178. scientific_writer/.claude/skills/hypothesis-generation/assets/hypothesis_output_template.md +302 -0
  179. scientific_writer/.claude/skills/hypothesis-generation/references/experimental_design_patterns.md +327 -0
  180. scientific_writer/.claude/skills/hypothesis-generation/references/hypothesis_quality_criteria.md +196 -0
  181. scientific_writer/.claude/skills/hypothesis-generation/references/literature_search_strategies.md +505 -0
  182. scientific_writer/.claude/skills/latex-posters/README.md +417 -0
  183. scientific_writer/.claude/skills/latex-posters/SKILL.md +919 -0
  184. scientific_writer/.claude/skills/latex-posters/assets/baposter_template.tex +257 -0
  185. scientific_writer/.claude/skills/latex-posters/assets/beamerposter_template.tex +244 -0
  186. scientific_writer/.claude/skills/latex-posters/assets/poster_quality_checklist.md +358 -0
  187. scientific_writer/.claude/skills/latex-posters/assets/tikzposter_template.tex +251 -0
  188. scientific_writer/.claude/skills/latex-posters/references/latex_poster_packages.md +745 -0
  189. scientific_writer/.claude/skills/latex-posters/references/poster_content_guide.md +748 -0
  190. scientific_writer/.claude/skills/latex-posters/references/poster_design_principles.md +806 -0
  191. scientific_writer/.claude/skills/latex-posters/references/poster_layout_design.md +900 -0
  192. scientific_writer/.claude/skills/latex-posters/scripts/review_poster.sh +214 -0
  193. scientific_writer/.claude/skills/literature-review/SKILL.md +546 -0
  194. scientific_writer/.claude/skills/literature-review/assets/review_template.md +412 -0
  195. scientific_writer/.claude/skills/literature-review/references/citation_styles.md +166 -0
  196. scientific_writer/.claude/skills/literature-review/references/database_strategies.md +381 -0
  197. scientific_writer/.claude/skills/literature-review/scripts/generate_pdf.py +176 -0
  198. scientific_writer/.claude/skills/literature-review/scripts/search_databases.py +303 -0
  199. scientific_writer/.claude/skills/literature-review/scripts/verify_citations.py +222 -0
  200. scientific_writer/.claude/skills/markitdown/INSTALLATION_GUIDE.md +318 -0
  201. scientific_writer/.claude/skills/markitdown/LICENSE.txt +22 -0
  202. scientific_writer/.claude/skills/markitdown/OPENROUTER_INTEGRATION.md +359 -0
  203. scientific_writer/.claude/skills/markitdown/QUICK_REFERENCE.md +309 -0
  204. scientific_writer/.claude/skills/markitdown/README.md +184 -0
  205. scientific_writer/.claude/skills/markitdown/SKILL.md +450 -0
  206. scientific_writer/.claude/skills/markitdown/SKILL_SUMMARY.md +307 -0
  207. scientific_writer/.claude/skills/markitdown/assets/example_usage.md +463 -0
  208. scientific_writer/.claude/skills/markitdown/references/api_reference.md +399 -0
  209. scientific_writer/.claude/skills/markitdown/references/file_formats.md +542 -0
  210. scientific_writer/.claude/skills/markitdown/scripts/batch_convert.py +228 -0
  211. scientific_writer/.claude/skills/markitdown/scripts/convert_literature.py +283 -0
  212. scientific_writer/.claude/skills/markitdown/scripts/convert_with_ai.py +243 -0
  213. scientific_writer/.claude/skills/paper-2-web/SKILL.md +455 -0
  214. scientific_writer/.claude/skills/paper-2-web/references/installation.md +141 -0
  215. scientific_writer/.claude/skills/paper-2-web/references/paper2poster.md +346 -0
  216. scientific_writer/.claude/skills/paper-2-web/references/paper2video.md +305 -0
  217. scientific_writer/.claude/skills/paper-2-web/references/paper2web.md +187 -0
  218. scientific_writer/.claude/skills/paper-2-web/references/usage_examples.md +436 -0
  219. scientific_writer/.claude/skills/peer-review/SKILL.md +375 -0
  220. scientific_writer/.claude/skills/peer-review/references/common_issues.md +552 -0
  221. scientific_writer/.claude/skills/peer-review/references/reporting_standards.md +290 -0
  222. scientific_writer/.claude/skills/research-grants/README.md +285 -0
  223. scientific_writer/.claude/skills/research-grants/SKILL.md +896 -0
  224. scientific_writer/.claude/skills/research-grants/assets/budget_justification_template.md +453 -0
  225. scientific_writer/.claude/skills/research-grants/assets/nih_specific_aims_template.md +166 -0
  226. scientific_writer/.claude/skills/research-grants/assets/nsf_project_summary_template.md +92 -0
  227. scientific_writer/.claude/skills/research-grants/references/broader_impacts.md +392 -0
  228. scientific_writer/.claude/skills/research-grants/references/darpa_guidelines.md +636 -0
  229. scientific_writer/.claude/skills/research-grants/references/doe_guidelines.md +586 -0
  230. scientific_writer/.claude/skills/research-grants/references/nih_guidelines.md +851 -0
  231. scientific_writer/.claude/skills/research-grants/references/nsf_guidelines.md +570 -0
  232. scientific_writer/.claude/skills/research-grants/references/specific_aims_guide.md +458 -0
  233. scientific_writer/.claude/skills/research-lookup/README.md +116 -0
  234. scientific_writer/.claude/skills/research-lookup/SKILL.md +443 -0
  235. scientific_writer/.claude/skills/research-lookup/examples.py +174 -0
  236. scientific_writer/.claude/skills/research-lookup/lookup.py +93 -0
  237. scientific_writer/.claude/skills/research-lookup/research_lookup.py +335 -0
  238. scientific_writer/.claude/skills/research-lookup/scripts/research_lookup.py +261 -0
  239. scientific_writer/.claude/skills/scholar-evaluation/SKILL.md +254 -0
  240. scientific_writer/.claude/skills/scholar-evaluation/references/evaluation_framework.md +663 -0
  241. scientific_writer/.claude/skills/scholar-evaluation/scripts/calculate_scores.py +378 -0
  242. scientific_writer/.claude/skills/scientific-critical-thinking/SKILL.md +530 -0
  243. scientific_writer/.claude/skills/scientific-critical-thinking/references/common_biases.md +364 -0
  244. scientific_writer/.claude/skills/scientific-critical-thinking/references/evidence_hierarchy.md +484 -0
  245. scientific_writer/.claude/skills/scientific-critical-thinking/references/experimental_design.md +496 -0
  246. scientific_writer/.claude/skills/scientific-critical-thinking/references/logical_fallacies.md +478 -0
  247. scientific_writer/.claude/skills/scientific-critical-thinking/references/scientific_method.md +169 -0
  248. scientific_writer/.claude/skills/scientific-critical-thinking/references/statistical_pitfalls.md +506 -0
  249. scientific_writer/.claude/skills/scientific-schematics/SKILL.md +2035 -0
  250. scientific_writer/.claude/skills/scientific-schematics/assets/block_diagram_template.tex +199 -0
  251. scientific_writer/.claude/skills/scientific-schematics/assets/circuit_template.tex +159 -0
  252. scientific_writer/.claude/skills/scientific-schematics/assets/flowchart_template.tex +161 -0
  253. scientific_writer/.claude/skills/scientific-schematics/assets/pathway_template.tex +162 -0
  254. scientific_writer/.claude/skills/scientific-schematics/assets/tikz_styles.tex +422 -0
  255. scientific_writer/.claude/skills/scientific-schematics/references/best_practices.md +562 -0
  256. scientific_writer/.claude/skills/scientific-schematics/references/diagram_types.md +637 -0
  257. scientific_writer/.claude/skills/scientific-schematics/references/python_libraries.md +791 -0
  258. scientific_writer/.claude/skills/scientific-schematics/references/tikz_guide.md +734 -0
  259. scientific_writer/.claude/skills/scientific-schematics/scripts/circuit_generator.py +307 -0
  260. scientific_writer/.claude/skills/scientific-schematics/scripts/compile_tikz.py +292 -0
  261. scientific_writer/.claude/skills/scientific-schematics/scripts/generate_flowchart.py +281 -0
  262. scientific_writer/.claude/skills/scientific-schematics/scripts/pathway_diagram.py +406 -0
  263. scientific_writer/.claude/skills/scientific-writing/SKILL.md +443 -0
  264. scientific_writer/.claude/skills/scientific-writing/references/citation_styles.md +720 -0
  265. scientific_writer/.claude/skills/scientific-writing/references/figures_tables.md +806 -0
  266. scientific_writer/.claude/skills/scientific-writing/references/imrad_structure.md +658 -0
  267. scientific_writer/.claude/skills/scientific-writing/references/reporting_guidelines.md +748 -0
  268. scientific_writer/.claude/skills/scientific-writing/references/writing_principles.md +824 -0
  269. scientific_writer/.claude/skills/treatment-plans/README.md +483 -0
  270. scientific_writer/.claude/skills/treatment-plans/SKILL.md +817 -0
  271. scientific_writer/.claude/skills/treatment-plans/assets/chronic_disease_management_plan.tex +636 -0
  272. scientific_writer/.claude/skills/treatment-plans/assets/general_medical_treatment_plan.tex +616 -0
  273. scientific_writer/.claude/skills/treatment-plans/assets/mental_health_treatment_plan.tex +745 -0
  274. scientific_writer/.claude/skills/treatment-plans/assets/pain_management_plan.tex +770 -0
  275. scientific_writer/.claude/skills/treatment-plans/assets/perioperative_care_plan.tex +724 -0
  276. scientific_writer/.claude/skills/treatment-plans/assets/quality_checklist.md +471 -0
  277. scientific_writer/.claude/skills/treatment-plans/assets/rehabilitation_treatment_plan.tex +727 -0
  278. scientific_writer/.claude/skills/treatment-plans/references/goal_setting_frameworks.md +411 -0
  279. scientific_writer/.claude/skills/treatment-plans/references/intervention_guidelines.md +507 -0
  280. scientific_writer/.claude/skills/treatment-plans/references/regulatory_compliance.md +476 -0
  281. scientific_writer/.claude/skills/treatment-plans/references/specialty_specific_guidelines.md +607 -0
  282. scientific_writer/.claude/skills/treatment-plans/references/treatment_plan_standards.md +456 -0
  283. scientific_writer/.claude/skills/treatment-plans/scripts/check_completeness.py +318 -0
  284. scientific_writer/.claude/skills/treatment-plans/scripts/generate_template.py +244 -0
  285. scientific_writer/.claude/skills/treatment-plans/scripts/timeline_generator.py +369 -0
  286. scientific_writer/.claude/skills/treatment-plans/scripts/validate_treatment_plan.py +367 -0
  287. scientific_writer/.claude/skills/venue-templates/SKILL.md +590 -0
  288. scientific_writer/.claude/skills/venue-templates/assets/grants/nih_specific_aims.tex +235 -0
  289. scientific_writer/.claude/skills/venue-templates/assets/grants/nsf_proposal_template.tex +375 -0
  290. scientific_writer/.claude/skills/venue-templates/assets/journals/nature_article.tex +171 -0
  291. scientific_writer/.claude/skills/venue-templates/assets/journals/neurips_article.tex +283 -0
  292. scientific_writer/.claude/skills/venue-templates/assets/journals/plos_one.tex +317 -0
  293. scientific_writer/.claude/skills/venue-templates/assets/posters/beamerposter_academic.tex +311 -0
  294. scientific_writer/.claude/skills/venue-templates/references/conferences_formatting.md +564 -0
  295. scientific_writer/.claude/skills/venue-templates/references/grants_requirements.md +787 -0
  296. scientific_writer/.claude/skills/venue-templates/references/journals_formatting.md +486 -0
  297. scientific_writer/.claude/skills/venue-templates/references/posters_guidelines.md +628 -0
  298. scientific_writer/.claude/skills/venue-templates/scripts/customize_template.py +206 -0
  299. scientific_writer/.claude/skills/venue-templates/scripts/query_template.py +260 -0
  300. scientific_writer/.claude/skills/venue-templates/scripts/validate_format.py +255 -0
  301. scientific_writer/CLAUDE.md +748 -0
  302. scientific_writer/__init__.py +2 -2
  303. scientific_writer/api.py +14 -7
  304. scientific_writer/cli.py +12 -7
  305. scientific_writer/core.py +27 -5
  306. {scientific_writer-2.1.1.dist-info → scientific_writer-2.2.2.dist-info}/METADATA +5 -1
  307. scientific_writer-2.2.2.dist-info/RECORD +312 -0
  308. scientific_writer-2.1.1.dist-info/RECORD +0 -11
  309. {scientific_writer-2.1.1.dist-info → scientific_writer-2.2.2.dist-info}/WHEEL +0 -0
  310. {scientific_writer-2.1.1.dist-info → scientific_writer-2.2.2.dist-info}/entry_points.txt +0 -0
  311. {scientific_writer-2.1.1.dist-info → scientific_writer-2.2.2.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,307 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ Generate circuit diagrams using Schemdraw.
4
+
5
+ This script provides a high-level interface for creating publication-quality
6
+ electrical circuit diagrams for scientific papers.
7
+
8
+ Requirements:
9
+ pip install schemdraw
10
+
11
+ Usage:
12
+ from circuit_generator import CircuitBuilder
13
+
14
+ builder = CircuitBuilder()
15
+ builder.add_voltage_source('Vs', '5V')
16
+ builder.add_resistor('R1', '1kΩ')
17
+ builder.add_capacitor('C1', '10µF')
18
+ builder.add_ground()
19
+ builder.save('circuit.pdf')
20
+ """
21
+
22
+ import argparse
23
+ from typing import Optional, Dict, Any
24
+
25
+ try:
26
+ import schemdraw
27
+ import schemdraw.elements as elm
28
+ except ImportError:
29
+ print("Error: schemdraw not installed. Install with: pip install schemdraw")
30
+ exit(1)
31
+
32
+
33
+ class CircuitBuilder:
34
+ """High-level interface for building circuits with Schemdraw."""
35
+
36
+ def __init__(self, fontsize: int = 10, font: str = 'Arial'):
37
+ """
38
+ Initialize circuit builder.
39
+
40
+ Args:
41
+ fontsize: Font size for labels
42
+ font: Font family for labels
43
+ """
44
+ self.drawing = schemdraw.Drawing(fontsize=fontsize, font=font)
45
+ self.elements = {}
46
+ self.last_element = None
47
+
48
+ def add_voltage_source(self, label: str, value: str,
49
+ direction: str = 'down') -> 'CircuitBuilder':
50
+ """
51
+ Add a voltage source.
52
+
53
+ Args:
54
+ label: Element label (e.g., 'Vs')
55
+ value: Voltage value (e.g., '5V')
56
+ direction: up, down, left, right
57
+
58
+ Returns:
59
+ self for chaining
60
+ """
61
+ element = self.drawing.add(elm.SourceV().label(f'{label}\\n{value}'))
62
+ self.elements[label] = element
63
+ self.last_element = element
64
+ return self
65
+
66
+ def add_current_source(self, label: str, value: str,
67
+ direction: str = 'down') -> 'CircuitBuilder':
68
+ """Add a current source."""
69
+ element = self.drawing.add(elm.SourceI().label(f'{label}\\n{value}'))
70
+ self.elements[label] = element
71
+ self.last_element = element
72
+ return self
73
+
74
+ def add_resistor(self, label: str, value: str,
75
+ direction: str = 'right') -> 'CircuitBuilder':
76
+ """
77
+ Add a resistor.
78
+
79
+ Args:
80
+ label: Element label (e.g., 'R1')
81
+ value: Resistance value (e.g., '1kΩ')
82
+ direction: up, down, left, right
83
+ """
84
+ cmd = getattr(self.drawing.add(elm.Resistor()), direction)
85
+ element = cmd().label(f'{label}\\n{value}')
86
+ self.elements[label] = element
87
+ self.last_element = element
88
+ return self
89
+
90
+ def add_capacitor(self, label: str, value: str,
91
+ direction: str = 'down') -> 'CircuitBuilder':
92
+ """Add a capacitor."""
93
+ cmd = getattr(self.drawing.add(elm.Capacitor()), direction)
94
+ element = cmd().label(f'{label}\\n{value}')
95
+ self.elements[label] = element
96
+ self.last_element = element
97
+ return self
98
+
99
+ def add_inductor(self, label: str, value: str,
100
+ direction: str = 'right') -> 'CircuitBuilder':
101
+ """Add an inductor."""
102
+ cmd = getattr(self.drawing.add(elm.Inductor()), direction)
103
+ element = cmd().label(f'{label}\\n{value}')
104
+ self.elements[label] = element
105
+ self.last_element = element
106
+ return self
107
+
108
+ def add_diode(self, label: str, direction: str = 'right') -> 'CircuitBuilder':
109
+ """Add a diode."""
110
+ cmd = getattr(self.drawing.add(elm.Diode()), direction)
111
+ element = cmd().label(label)
112
+ self.elements[label] = element
113
+ self.last_element = element
114
+ return self
115
+
116
+ def add_led(self, label: str, direction: str = 'right') -> 'CircuitBuilder':
117
+ """Add an LED."""
118
+ cmd = getattr(self.drawing.add(elm.LED()), direction)
119
+ element = cmd().label(label)
120
+ self.elements[label] = element
121
+ self.last_element = element
122
+ return self
123
+
124
+ def add_opamp(self, label: str) -> 'CircuitBuilder':
125
+ """Add an operational amplifier."""
126
+ element = self.drawing.add(elm.Opamp().label(label))
127
+ self.elements[label] = element
128
+ self.last_element = element
129
+ return self
130
+
131
+ def add_ground(self) -> 'CircuitBuilder':
132
+ """Add a ground symbol."""
133
+ element = self.drawing.add(elm.Ground())
134
+ self.last_element = element
135
+ return self
136
+
137
+ def add_line(self, direction: str = 'right',
138
+ length: Optional[float] = None) -> 'CircuitBuilder':
139
+ """
140
+ Add a connecting wire.
141
+
142
+ Args:
143
+ direction: up, down, left, right
144
+ length: Optional line length
145
+ """
146
+ line = elm.Line()
147
+ cmd = getattr(line, direction)
148
+ if length:
149
+ element = self.drawing.add(cmd(length))
150
+ else:
151
+ element = self.drawing.add(cmd())
152
+ self.last_element = element
153
+ return self
154
+
155
+ def add_dot(self, label: Optional[str] = None) -> 'CircuitBuilder':
156
+ """Add a connection dot (for junctions)."""
157
+ element = self.drawing.add(elm.Dot())
158
+ if label:
159
+ element.label(label)
160
+ self.last_element = element
161
+ return self
162
+
163
+ def push(self) -> 'CircuitBuilder':
164
+ """Save current position (push to stack)."""
165
+ self.drawing.push()
166
+ return self
167
+
168
+ def pop(self) -> 'CircuitBuilder':
169
+ """Return to saved position (pop from stack)."""
170
+ self.drawing.pop()
171
+ return self
172
+
173
+ def save(self, filename: str, dpi: int = 300):
174
+ """
175
+ Save circuit diagram.
176
+
177
+ Args:
178
+ filename: Output filename (.pdf, .svg, .png)
179
+ dpi: Resolution for raster outputs
180
+ """
181
+ if filename.endswith('.png'):
182
+ self.drawing.save(filename, dpi=dpi)
183
+ else:
184
+ self.drawing.save(filename)
185
+ print(f"Circuit saved to {filename}")
186
+
187
+ def show(self):
188
+ """Display circuit (for interactive use)."""
189
+ self.drawing.draw()
190
+
191
+
192
+ def create_rc_filter(output: str = 'rc_filter.pdf'):
193
+ """Create an RC low-pass filter circuit."""
194
+ builder = CircuitBuilder()
195
+
196
+ # Input
197
+ builder.add_dot('$V_{in}$')
198
+ builder.add_resistor('R', '1kΩ', 'right')
199
+
200
+ # Junction
201
+ builder.add_dot()
202
+ builder.push()
203
+
204
+ # Capacitor to ground
205
+ builder.add_capacitor('C', '10µF', 'down')
206
+ builder.add_ground()
207
+
208
+ # Output
209
+ builder.pop()
210
+ builder.add_line('right')
211
+ builder.add_dot('$V_{out}$')
212
+
213
+ builder.save(output)
214
+ return builder
215
+
216
+
217
+ def create_voltage_divider(output: str = 'voltage_divider.pdf'):
218
+ """Create a voltage divider circuit."""
219
+ builder = CircuitBuilder()
220
+
221
+ # Voltage source
222
+ builder.add_voltage_source('$V_s$', '5V', 'down')
223
+
224
+ # First resistor
225
+ builder.add_resistor('$R_1$', '1kΩ', 'right')
226
+
227
+ # Junction and output
228
+ builder.add_dot('$V_{out}$')
229
+ builder.push()
230
+
231
+ # Second resistor to ground
232
+ builder.add_resistor('$R_2$', '2kΩ', 'down')
233
+ builder.add_line('left')
234
+ builder.add_ground()
235
+
236
+ builder.save(output)
237
+ return builder
238
+
239
+
240
+ def create_opamp_amplifier(output: str = 'opamp_circuit.pdf'):
241
+ """Create a non-inverting amplifier circuit."""
242
+ builder = CircuitBuilder()
243
+
244
+ # Input
245
+ builder.add_dot('$V_{in}$')
246
+ builder.add_line('right', 1)
247
+ builder.add_opamp('OA1')
248
+ builder.add_line('right', 1)
249
+ builder.add_dot('$V_{out}$')
250
+
251
+ builder.save(output)
252
+ return builder
253
+
254
+
255
+ def main():
256
+ """Command-line interface."""
257
+ parser = argparse.ArgumentParser(
258
+ description='Generate circuit diagrams using Schemdraw',
259
+ formatter_class=argparse.RawDescriptionHelpFormatter,
260
+ epilog="""
261
+ Examples:
262
+ # Generate example circuits
263
+ python circuit_generator.py --example rc_filter
264
+ python circuit_generator.py --example voltage_divider
265
+ python circuit_generator.py --example opamp
266
+
267
+ # Custom output
268
+ python circuit_generator.py --example rc_filter -o my_filter.pdf
269
+ """
270
+ )
271
+
272
+ parser.add_argument('--example',
273
+ choices=['rc_filter', 'voltage_divider', 'opamp'],
274
+ help='Generate example circuit')
275
+ parser.add_argument('-o', '--output',
276
+ help='Output filename (default: based on example name)')
277
+ parser.add_argument('--dpi', type=int, default=300,
278
+ help='DPI for PNG output (default: 300)')
279
+
280
+ args = parser.parse_args()
281
+
282
+ if not args.example:
283
+ parser.print_help()
284
+ return
285
+
286
+ # Determine output filename
287
+ if args.output:
288
+ output = args.output
289
+ else:
290
+ output = f"{args.example}.pdf"
291
+
292
+ # Generate circuit
293
+ if args.example == 'rc_filter':
294
+ create_rc_filter(output)
295
+ elif args.example == 'voltage_divider':
296
+ create_voltage_divider(output)
297
+ elif args.example == 'opamp':
298
+ create_opamp_amplifier(output)
299
+
300
+ print(f"\nCircuit diagram saved to: {output}")
301
+ print("\nTo use in LaTeX:")
302
+ print(f" \\includegraphics{{{output}}}")
303
+
304
+
305
+ if __name__ == '__main__':
306
+ main()
307
+
@@ -0,0 +1,292 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ Compile TikZ diagrams to PDF and PNG.
4
+
5
+ This script provides a convenient interface for compiling standalone TikZ
6
+ files to various output formats, with options for preview and cleanup.
7
+
8
+ Requirements:
9
+ - pdflatex (from TeX distribution)
10
+ - convert (ImageMagick, for PNG output)
11
+
12
+ Usage:
13
+ python compile_tikz.py diagram.tex
14
+ python compile_tikz.py diagram.tex --png --dpi 300
15
+ python compile_tikz.py diagram.tex --preview
16
+ """
17
+
18
+ import argparse
19
+ import os
20
+ import subprocess
21
+ import sys
22
+ import tempfile
23
+ import shutil
24
+ from pathlib import Path
25
+ from typing import Optional, List
26
+
27
+
28
+ class TikZCompiler:
29
+ """Compile TikZ diagrams to various formats."""
30
+
31
+ def __init__(self, verbose: bool = False):
32
+ """
33
+ Initialize compiler.
34
+
35
+ Args:
36
+ verbose: Print detailed output
37
+ """
38
+ self.verbose = verbose
39
+
40
+ def _run_command(self, cmd: List[str], cwd: Optional[str] = None) -> bool:
41
+ """Run a command and return success status."""
42
+ if self.verbose:
43
+ print(f"Running: {' '.join(cmd)}")
44
+
45
+ try:
46
+ result = subprocess.run(
47
+ cmd,
48
+ cwd=cwd,
49
+ stdout=subprocess.PIPE if not self.verbose else None,
50
+ stderr=subprocess.PIPE if not self.verbose else None,
51
+ text=True
52
+ )
53
+
54
+ if result.returncode != 0:
55
+ if not self.verbose and result.stderr:
56
+ print(f"Error: {result.stderr}")
57
+ return False
58
+ return True
59
+
60
+ except FileNotFoundError:
61
+ print(f"Error: Command not found: {cmd[0]}")
62
+ return False
63
+ except Exception as e:
64
+ print(f"Error running command: {e}")
65
+ return False
66
+
67
+ def compile_to_pdf(self, tex_file: str, output: Optional[str] = None,
68
+ cleanup: bool = True) -> Optional[str]:
69
+ """
70
+ Compile TikZ file to PDF.
71
+
72
+ Args:
73
+ tex_file: Input .tex file
74
+ output: Output .pdf filename (default: same as input)
75
+ cleanup: Remove auxiliary files
76
+
77
+ Returns:
78
+ Path to output PDF if successful, None otherwise
79
+ """
80
+ tex_path = Path(tex_file).resolve()
81
+
82
+ if not tex_path.exists():
83
+ print(f"Error: File not found: {tex_file}")
84
+ return None
85
+
86
+ # Determine output path
87
+ if output:
88
+ pdf_path = Path(output).resolve()
89
+ else:
90
+ pdf_path = tex_path.with_suffix('.pdf')
91
+
92
+ # Create temporary directory for compilation
93
+ with tempfile.TemporaryDirectory() as tmpdir:
94
+ # Copy tex file to temp directory
95
+ temp_tex = Path(tmpdir) / tex_path.name
96
+ shutil.copy(tex_path, temp_tex)
97
+
98
+ # Copy any additional files (tikz_styles.tex, etc.)
99
+ for aux_file in tex_path.parent.glob('*.tex'):
100
+ if aux_file != tex_path:
101
+ shutil.copy(aux_file, tmpdir)
102
+
103
+ # Compile with pdflatex
104
+ print(f"Compiling {tex_path.name} to PDF...")
105
+
106
+ # Run pdflatex (may need to run twice for references)
107
+ for i in range(2):
108
+ success = self._run_command(
109
+ ['pdflatex', '-interaction=nonstopmode', temp_tex.name],
110
+ cwd=tmpdir
111
+ )
112
+
113
+ if not success:
114
+ print(f"Compilation failed (pass {i+1}/2)")
115
+ if i == 1: # Only fail on second pass
116
+ return None
117
+
118
+ # Copy PDF to output location
119
+ temp_pdf = temp_tex.with_suffix('.pdf')
120
+ if temp_pdf.exists():
121
+ shutil.copy(temp_pdf, pdf_path)
122
+ print(f"✓ PDF created: {pdf_path}")
123
+ return str(pdf_path)
124
+ else:
125
+ print("Error: PDF not created")
126
+ return None
127
+
128
+ def pdf_to_png(self, pdf_file: str, output: Optional[str] = None,
129
+ dpi: int = 300) -> Optional[str]:
130
+ """
131
+ Convert PDF to PNG using ImageMagick.
132
+
133
+ Args:
134
+ pdf_file: Input PDF file
135
+ output: Output PNG filename (default: same as input)
136
+ dpi: Resolution in DPI
137
+
138
+ Returns:
139
+ Path to output PNG if successful, None otherwise
140
+ """
141
+ pdf_path = Path(pdf_file)
142
+
143
+ if not pdf_path.exists():
144
+ print(f"Error: PDF not found: {pdf_file}")
145
+ return None
146
+
147
+ # Determine output path
148
+ if output:
149
+ png_path = Path(output)
150
+ else:
151
+ png_path = pdf_path.with_suffix('.png')
152
+
153
+ print(f"Converting to PNG ({dpi} DPI)...")
154
+
155
+ # Use ImageMagick convert
156
+ success = self._run_command([
157
+ 'convert',
158
+ '-density', str(dpi),
159
+ '-quality', '100',
160
+ str(pdf_path),
161
+ '-flatten', # Remove transparency
162
+ str(png_path)
163
+ ])
164
+
165
+ if success and png_path.exists():
166
+ print(f"✓ PNG created: {png_path}")
167
+ return str(png_path)
168
+ else:
169
+ print("Error: PNG conversion failed")
170
+ print("Hint: Make sure ImageMagick is installed")
171
+ return None
172
+
173
+ def preview_pdf(self, pdf_file: str) -> bool:
174
+ """
175
+ Open PDF in system viewer.
176
+
177
+ Args:
178
+ pdf_file: PDF file to preview
179
+
180
+ Returns:
181
+ True if successful
182
+ """
183
+ pdf_path = Path(pdf_file)
184
+
185
+ if not pdf_path.exists():
186
+ print(f"Error: PDF not found: {pdf_file}")
187
+ return False
188
+
189
+ print(f"Opening {pdf_path.name}...")
190
+
191
+ # Determine system-specific open command
192
+ if sys.platform == 'darwin': # macOS
193
+ cmd = ['open', str(pdf_path)]
194
+ elif sys.platform.startswith('linux'): # Linux
195
+ cmd = ['xdg-open', str(pdf_path)]
196
+ elif sys.platform == 'win32': # Windows
197
+ cmd = ['start', str(pdf_path)]
198
+ else:
199
+ print(f"Error: Unsupported platform: {sys.platform}")
200
+ return False
201
+
202
+ return self._run_command(cmd)
203
+
204
+
205
+ def main():
206
+ """Command-line interface."""
207
+ parser = argparse.ArgumentParser(
208
+ description='Compile TikZ diagrams to PDF and PNG',
209
+ formatter_class=argparse.RawDescriptionHelpFormatter,
210
+ epilog="""
211
+ Examples:
212
+ # Compile to PDF
213
+ python compile_tikz.py diagram.tex
214
+
215
+ # Compile to PDF and PNG
216
+ python compile_tikz.py diagram.tex --png --dpi 300
217
+
218
+ # Compile and preview
219
+ python compile_tikz.py diagram.tex --preview
220
+
221
+ # Custom output filenames
222
+ python compile_tikz.py diagram.tex -o my_diagram.pdf
223
+ python compile_tikz.py diagram.tex --png --png-output my_diagram.png
224
+
225
+ # Verbose output
226
+ python compile_tikz.py diagram.tex --verbose
227
+ """
228
+ )
229
+
230
+ parser.add_argument('input', help='Input .tex file')
231
+ parser.add_argument('-o', '--output', help='Output PDF filename')
232
+ parser.add_argument('--png', action='store_true',
233
+ help='Also generate PNG')
234
+ parser.add_argument('--png-output', help='PNG output filename')
235
+ parser.add_argument('--dpi', type=int, default=300,
236
+ help='DPI for PNG output (default: 300)')
237
+ parser.add_argument('--preview', action='store_true',
238
+ help='Open PDF after compilation')
239
+ parser.add_argument('--no-cleanup', action='store_true',
240
+ help='Keep auxiliary files')
241
+ parser.add_argument('-v', '--verbose', action='store_true',
242
+ help='Verbose output')
243
+
244
+ args = parser.parse_args()
245
+
246
+ # Check input file
247
+ if not Path(args.input).exists():
248
+ print(f"Error: Input file not found: {args.input}")
249
+ sys.exit(1)
250
+
251
+ if not args.input.endswith('.tex'):
252
+ print("Warning: Input file doesn't have .tex extension")
253
+
254
+ # Initialize compiler
255
+ compiler = TikZCompiler(verbose=args.verbose)
256
+
257
+ # Compile to PDF
258
+ pdf_file = compiler.compile_to_pdf(
259
+ args.input,
260
+ output=args.output,
261
+ cleanup=not args.no_cleanup
262
+ )
263
+
264
+ if not pdf_file:
265
+ print("\n❌ Compilation failed")
266
+ sys.exit(1)
267
+
268
+ # Convert to PNG if requested
269
+ if args.png:
270
+ png_file = compiler.pdf_to_png(
271
+ pdf_file,
272
+ output=args.png_output,
273
+ dpi=args.dpi
274
+ )
275
+
276
+ if not png_file:
277
+ print("\n⚠ PDF created but PNG conversion failed")
278
+
279
+ # Preview if requested
280
+ if args.preview:
281
+ compiler.preview_pdf(pdf_file)
282
+
283
+ print("\n✓ Done!")
284
+ print(f"\nTo use in LaTeX:")
285
+ print(f" \\input{{{Path(pdf_file).stem}.tex}}")
286
+ print(f" or")
287
+ print(f" \\includegraphics{{{Path(pdf_file).name}}}")
288
+
289
+
290
+ if __name__ == '__main__':
291
+ main()
292
+