scientific-writer 2.3.1__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.
- scientific_writer/.claude/WRITER.md +822 -0
- scientific_writer/.claude/settings.local.json +30 -0
- scientific_writer/.claude/skills/citation-management/SKILL.md +1046 -0
- scientific_writer/.claude/skills/citation-management/assets/bibtex_template.bib +264 -0
- scientific_writer/.claude/skills/citation-management/assets/citation_checklist.md +386 -0
- scientific_writer/.claude/skills/citation-management/references/bibtex_formatting.md +908 -0
- scientific_writer/.claude/skills/citation-management/references/citation_validation.md +794 -0
- scientific_writer/.claude/skills/citation-management/references/google_scholar_search.md +725 -0
- scientific_writer/.claude/skills/citation-management/references/metadata_extraction.md +870 -0
- scientific_writer/.claude/skills/citation-management/references/pubmed_search.md +839 -0
- scientific_writer/.claude/skills/citation-management/scripts/doi_to_bibtex.py +204 -0
- scientific_writer/.claude/skills/citation-management/scripts/extract_metadata.py +569 -0
- scientific_writer/.claude/skills/citation-management/scripts/format_bibtex.py +349 -0
- scientific_writer/.claude/skills/citation-management/scripts/search_google_scholar.py +282 -0
- scientific_writer/.claude/skills/citation-management/scripts/search_pubmed.py +398 -0
- scientific_writer/.claude/skills/citation-management/scripts/validate_citations.py +497 -0
- scientific_writer/.claude/skills/clinical-reports/IMPLEMENTATION_SUMMARY.md +641 -0
- scientific_writer/.claude/skills/clinical-reports/README.md +236 -0
- scientific_writer/.claude/skills/clinical-reports/SKILL.md +1088 -0
- scientific_writer/.claude/skills/clinical-reports/assets/case_report_template.md +352 -0
- scientific_writer/.claude/skills/clinical-reports/assets/clinical_trial_csr_template.md +353 -0
- scientific_writer/.claude/skills/clinical-reports/assets/clinical_trial_sae_template.md +359 -0
- scientific_writer/.claude/skills/clinical-reports/assets/consult_note_template.md +305 -0
- scientific_writer/.claude/skills/clinical-reports/assets/discharge_summary_template.md +453 -0
- scientific_writer/.claude/skills/clinical-reports/assets/hipaa_compliance_checklist.md +395 -0
- scientific_writer/.claude/skills/clinical-reports/assets/history_physical_template.md +305 -0
- scientific_writer/.claude/skills/clinical-reports/assets/lab_report_template.md +309 -0
- scientific_writer/.claude/skills/clinical-reports/assets/pathology_report_template.md +249 -0
- scientific_writer/.claude/skills/clinical-reports/assets/quality_checklist.md +338 -0
- scientific_writer/.claude/skills/clinical-reports/assets/radiology_report_template.md +318 -0
- scientific_writer/.claude/skills/clinical-reports/assets/soap_note_template.md +253 -0
- scientific_writer/.claude/skills/clinical-reports/references/case_report_guidelines.md +570 -0
- scientific_writer/.claude/skills/clinical-reports/references/clinical_trial_reporting.md +693 -0
- scientific_writer/.claude/skills/clinical-reports/references/data_presentation.md +530 -0
- scientific_writer/.claude/skills/clinical-reports/references/diagnostic_reports_standards.md +629 -0
- scientific_writer/.claude/skills/clinical-reports/references/medical_terminology.md +588 -0
- scientific_writer/.claude/skills/clinical-reports/references/patient_documentation.md +744 -0
- scientific_writer/.claude/skills/clinical-reports/references/peer_review_standards.md +585 -0
- scientific_writer/.claude/skills/clinical-reports/references/regulatory_compliance.md +577 -0
- scientific_writer/.claude/skills/clinical-reports/scripts/check_deidentification.py +346 -0
- scientific_writer/.claude/skills/clinical-reports/scripts/compliance_checker.py +78 -0
- scientific_writer/.claude/skills/clinical-reports/scripts/extract_clinical_data.py +102 -0
- scientific_writer/.claude/skills/clinical-reports/scripts/format_adverse_events.py +103 -0
- scientific_writer/.claude/skills/clinical-reports/scripts/generate_report_template.py +163 -0
- scientific_writer/.claude/skills/clinical-reports/scripts/terminology_validator.py +133 -0
- scientific_writer/.claude/skills/clinical-reports/scripts/validate_case_report.py +334 -0
- scientific_writer/.claude/skills/clinical-reports/scripts/validate_trial_report.py +89 -0
- scientific_writer/.claude/skills/document-skills/docx/LICENSE.txt +30 -0
- scientific_writer/.claude/skills/document-skills/docx/SKILL.md +197 -0
- scientific_writer/.claude/skills/document-skills/docx/docx-js.md +350 -0
- scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
- scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
- scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
- scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
- scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
- scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
- scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
- scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
- scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
- scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
- scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
- scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
- scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
- scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
- scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
- scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
- scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
- scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
- scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
- scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
- scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
- scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
- scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
- scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
- scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
- scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
- scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
- scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
- scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
- scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
- scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
- scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/mce/mc.xsd +75 -0
- scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/microsoft/wml-2010.xsd +560 -0
- scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/microsoft/wml-2012.xsd +67 -0
- scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/microsoft/wml-2018.xsd +14 -0
- scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/microsoft/wml-cex-2018.xsd +20 -0
- scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/microsoft/wml-cid-2016.xsd +13 -0
- scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
- scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/microsoft/wml-symex-2015.xsd +8 -0
- scientific_writer/.claude/skills/document-skills/docx/ooxml/scripts/pack.py +159 -0
- scientific_writer/.claude/skills/document-skills/docx/ooxml/scripts/unpack.py +29 -0
- scientific_writer/.claude/skills/document-skills/docx/ooxml/scripts/validate.py +69 -0
- scientific_writer/.claude/skills/document-skills/docx/ooxml/scripts/validation/__init__.py +15 -0
- scientific_writer/.claude/skills/document-skills/docx/ooxml/scripts/validation/base.py +951 -0
- scientific_writer/.claude/skills/document-skills/docx/ooxml/scripts/validation/docx.py +274 -0
- scientific_writer/.claude/skills/document-skills/docx/ooxml/scripts/validation/pptx.py +315 -0
- scientific_writer/.claude/skills/document-skills/docx/ooxml/scripts/validation/redlining.py +279 -0
- scientific_writer/.claude/skills/document-skills/docx/ooxml.md +610 -0
- scientific_writer/.claude/skills/document-skills/docx/scripts/__init__.py +1 -0
- scientific_writer/.claude/skills/document-skills/docx/scripts/document.py +1276 -0
- scientific_writer/.claude/skills/document-skills/docx/scripts/templates/comments.xml +3 -0
- scientific_writer/.claude/skills/document-skills/docx/scripts/templates/commentsExtended.xml +3 -0
- scientific_writer/.claude/skills/document-skills/docx/scripts/templates/commentsExtensible.xml +3 -0
- scientific_writer/.claude/skills/document-skills/docx/scripts/templates/commentsIds.xml +3 -0
- scientific_writer/.claude/skills/document-skills/docx/scripts/templates/people.xml +3 -0
- scientific_writer/.claude/skills/document-skills/docx/scripts/utilities.py +374 -0
- scientific_writer/.claude/skills/document-skills/pdf/LICENSE.txt +30 -0
- scientific_writer/.claude/skills/document-skills/pdf/SKILL.md +294 -0
- scientific_writer/.claude/skills/document-skills/pdf/forms.md +205 -0
- scientific_writer/.claude/skills/document-skills/pdf/reference.md +612 -0
- scientific_writer/.claude/skills/document-skills/pdf/scripts/check_bounding_boxes.py +70 -0
- scientific_writer/.claude/skills/document-skills/pdf/scripts/check_bounding_boxes_test.py +226 -0
- scientific_writer/.claude/skills/document-skills/pdf/scripts/check_fillable_fields.py +12 -0
- scientific_writer/.claude/skills/document-skills/pdf/scripts/convert_pdf_to_images.py +35 -0
- scientific_writer/.claude/skills/document-skills/pdf/scripts/create_validation_image.py +41 -0
- scientific_writer/.claude/skills/document-skills/pdf/scripts/extract_form_field_info.py +152 -0
- scientific_writer/.claude/skills/document-skills/pdf/scripts/fill_fillable_fields.py +114 -0
- scientific_writer/.claude/skills/document-skills/pdf/scripts/fill_pdf_form_with_annotations.py +108 -0
- scientific_writer/.claude/skills/document-skills/pptx/LICENSE.txt +30 -0
- scientific_writer/.claude/skills/document-skills/pptx/SKILL.md +484 -0
- scientific_writer/.claude/skills/document-skills/pptx/html2pptx.md +625 -0
- scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
- scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
- scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
- scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
- scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
- scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
- scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
- scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
- scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
- scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
- scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
- scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
- scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
- scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
- scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
- scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
- scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
- scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
- scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
- scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
- scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
- scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
- scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
- scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
- scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
- scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
- scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
- scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
- scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
- scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
- scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
- scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/mce/mc.xsd +75 -0
- scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/microsoft/wml-2010.xsd +560 -0
- scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/microsoft/wml-2012.xsd +67 -0
- scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/microsoft/wml-2018.xsd +14 -0
- scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/microsoft/wml-cex-2018.xsd +20 -0
- scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/microsoft/wml-cid-2016.xsd +13 -0
- scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
- scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/microsoft/wml-symex-2015.xsd +8 -0
- scientific_writer/.claude/skills/document-skills/pptx/ooxml/scripts/pack.py +159 -0
- scientific_writer/.claude/skills/document-skills/pptx/ooxml/scripts/unpack.py +29 -0
- scientific_writer/.claude/skills/document-skills/pptx/ooxml/scripts/validate.py +69 -0
- scientific_writer/.claude/skills/document-skills/pptx/ooxml/scripts/validation/__init__.py +15 -0
- scientific_writer/.claude/skills/document-skills/pptx/ooxml/scripts/validation/base.py +951 -0
- scientific_writer/.claude/skills/document-skills/pptx/ooxml/scripts/validation/docx.py +274 -0
- scientific_writer/.claude/skills/document-skills/pptx/ooxml/scripts/validation/pptx.py +315 -0
- scientific_writer/.claude/skills/document-skills/pptx/ooxml/scripts/validation/redlining.py +279 -0
- scientific_writer/.claude/skills/document-skills/pptx/ooxml.md +427 -0
- scientific_writer/.claude/skills/document-skills/pptx/scripts/html2pptx.js +979 -0
- scientific_writer/.claude/skills/document-skills/pptx/scripts/inventory.py +1020 -0
- scientific_writer/.claude/skills/document-skills/pptx/scripts/rearrange.py +231 -0
- scientific_writer/.claude/skills/document-skills/pptx/scripts/replace.py +385 -0
- scientific_writer/.claude/skills/document-skills/pptx/scripts/thumbnail.py +450 -0
- scientific_writer/.claude/skills/document-skills/xlsx/LICENSE.txt +30 -0
- scientific_writer/.claude/skills/document-skills/xlsx/SKILL.md +289 -0
- scientific_writer/.claude/skills/document-skills/xlsx/recalc.py +178 -0
- scientific_writer/.claude/skills/hypothesis-generation/SKILL.md +155 -0
- scientific_writer/.claude/skills/hypothesis-generation/assets/hypothesis_output_template.md +302 -0
- scientific_writer/.claude/skills/hypothesis-generation/references/experimental_design_patterns.md +327 -0
- scientific_writer/.claude/skills/hypothesis-generation/references/hypothesis_quality_criteria.md +196 -0
- scientific_writer/.claude/skills/hypothesis-generation/references/literature_search_strategies.md +505 -0
- scientific_writer/.claude/skills/latex-posters/README.md +417 -0
- scientific_writer/.claude/skills/latex-posters/SKILL.md +919 -0
- scientific_writer/.claude/skills/latex-posters/assets/baposter_template.tex +257 -0
- scientific_writer/.claude/skills/latex-posters/assets/beamerposter_template.tex +244 -0
- scientific_writer/.claude/skills/latex-posters/assets/poster_quality_checklist.md +358 -0
- scientific_writer/.claude/skills/latex-posters/assets/tikzposter_template.tex +251 -0
- scientific_writer/.claude/skills/latex-posters/references/latex_poster_packages.md +745 -0
- scientific_writer/.claude/skills/latex-posters/references/poster_content_guide.md +748 -0
- scientific_writer/.claude/skills/latex-posters/references/poster_design_principles.md +806 -0
- scientific_writer/.claude/skills/latex-posters/references/poster_layout_design.md +900 -0
- scientific_writer/.claude/skills/latex-posters/scripts/review_poster.sh +214 -0
- scientific_writer/.claude/skills/literature-review/SKILL.md +546 -0
- scientific_writer/.claude/skills/literature-review/assets/review_template.md +412 -0
- scientific_writer/.claude/skills/literature-review/references/citation_styles.md +166 -0
- scientific_writer/.claude/skills/literature-review/references/database_strategies.md +381 -0
- scientific_writer/.claude/skills/literature-review/scripts/generate_pdf.py +176 -0
- scientific_writer/.claude/skills/literature-review/scripts/search_databases.py +303 -0
- scientific_writer/.claude/skills/literature-review/scripts/verify_citations.py +222 -0
- scientific_writer/.claude/skills/markitdown/INSTALLATION_GUIDE.md +318 -0
- scientific_writer/.claude/skills/markitdown/LICENSE.txt +22 -0
- scientific_writer/.claude/skills/markitdown/OPENROUTER_INTEGRATION.md +359 -0
- scientific_writer/.claude/skills/markitdown/QUICK_REFERENCE.md +309 -0
- scientific_writer/.claude/skills/markitdown/README.md +184 -0
- scientific_writer/.claude/skills/markitdown/SKILL.md +450 -0
- scientific_writer/.claude/skills/markitdown/SKILL_SUMMARY.md +307 -0
- scientific_writer/.claude/skills/markitdown/assets/example_usage.md +463 -0
- scientific_writer/.claude/skills/markitdown/references/api_reference.md +399 -0
- scientific_writer/.claude/skills/markitdown/references/file_formats.md +542 -0
- scientific_writer/.claude/skills/markitdown/scripts/batch_convert.py +228 -0
- scientific_writer/.claude/skills/markitdown/scripts/convert_literature.py +283 -0
- scientific_writer/.claude/skills/markitdown/scripts/convert_with_ai.py +243 -0
- scientific_writer/.claude/skills/paper-2-web/SKILL.md +455 -0
- scientific_writer/.claude/skills/paper-2-web/references/installation.md +141 -0
- scientific_writer/.claude/skills/paper-2-web/references/paper2poster.md +346 -0
- scientific_writer/.claude/skills/paper-2-web/references/paper2video.md +305 -0
- scientific_writer/.claude/skills/paper-2-web/references/paper2web.md +187 -0
- scientific_writer/.claude/skills/paper-2-web/references/usage_examples.md +436 -0
- scientific_writer/.claude/skills/peer-review/SKILL.md +375 -0
- scientific_writer/.claude/skills/peer-review/references/common_issues.md +552 -0
- scientific_writer/.claude/skills/peer-review/references/reporting_standards.md +290 -0
- scientific_writer/.claude/skills/research-grants/README.md +285 -0
- scientific_writer/.claude/skills/research-grants/SKILL.md +896 -0
- scientific_writer/.claude/skills/research-grants/assets/budget_justification_template.md +453 -0
- scientific_writer/.claude/skills/research-grants/assets/nih_specific_aims_template.md +166 -0
- scientific_writer/.claude/skills/research-grants/assets/nsf_project_summary_template.md +92 -0
- scientific_writer/.claude/skills/research-grants/references/broader_impacts.md +392 -0
- scientific_writer/.claude/skills/research-grants/references/darpa_guidelines.md +636 -0
- scientific_writer/.claude/skills/research-grants/references/doe_guidelines.md +586 -0
- scientific_writer/.claude/skills/research-grants/references/nih_guidelines.md +851 -0
- scientific_writer/.claude/skills/research-grants/references/nsf_guidelines.md +570 -0
- scientific_writer/.claude/skills/research-grants/references/specific_aims_guide.md +458 -0
- scientific_writer/.claude/skills/research-lookup/README.md +116 -0
- scientific_writer/.claude/skills/research-lookup/SKILL.md +443 -0
- scientific_writer/.claude/skills/research-lookup/examples.py +174 -0
- scientific_writer/.claude/skills/research-lookup/lookup.py +93 -0
- scientific_writer/.claude/skills/research-lookup/research_lookup.py +335 -0
- scientific_writer/.claude/skills/research-lookup/scripts/research_lookup.py +261 -0
- scientific_writer/.claude/skills/scholar-evaluation/SKILL.md +254 -0
- scientific_writer/.claude/skills/scholar-evaluation/references/evaluation_framework.md +663 -0
- scientific_writer/.claude/skills/scholar-evaluation/scripts/calculate_scores.py +378 -0
- scientific_writer/.claude/skills/scientific-critical-thinking/SKILL.md +530 -0
- scientific_writer/.claude/skills/scientific-critical-thinking/references/common_biases.md +364 -0
- scientific_writer/.claude/skills/scientific-critical-thinking/references/evidence_hierarchy.md +484 -0
- scientific_writer/.claude/skills/scientific-critical-thinking/references/experimental_design.md +496 -0
- scientific_writer/.claude/skills/scientific-critical-thinking/references/logical_fallacies.md +478 -0
- scientific_writer/.claude/skills/scientific-critical-thinking/references/scientific_method.md +169 -0
- scientific_writer/.claude/skills/scientific-critical-thinking/references/statistical_pitfalls.md +506 -0
- scientific_writer/.claude/skills/scientific-schematics/SKILL.md +2035 -0
- scientific_writer/.claude/skills/scientific-schematics/assets/block_diagram_template.tex +199 -0
- scientific_writer/.claude/skills/scientific-schematics/assets/circuit_template.tex +159 -0
- scientific_writer/.claude/skills/scientific-schematics/assets/flowchart_template.tex +161 -0
- scientific_writer/.claude/skills/scientific-schematics/assets/pathway_template.tex +162 -0
- scientific_writer/.claude/skills/scientific-schematics/assets/tikz_styles.tex +422 -0
- scientific_writer/.claude/skills/scientific-schematics/references/best_practices.md +562 -0
- scientific_writer/.claude/skills/scientific-schematics/references/diagram_types.md +637 -0
- scientific_writer/.claude/skills/scientific-schematics/references/python_libraries.md +791 -0
- scientific_writer/.claude/skills/scientific-schematics/references/tikz_guide.md +734 -0
- scientific_writer/.claude/skills/scientific-schematics/scripts/circuit_generator.py +307 -0
- scientific_writer/.claude/skills/scientific-schematics/scripts/compile_tikz.py +292 -0
- scientific_writer/.claude/skills/scientific-schematics/scripts/generate_flowchart.py +281 -0
- scientific_writer/.claude/skills/scientific-schematics/scripts/pathway_diagram.py +406 -0
- scientific_writer/.claude/skills/scientific-writing/SKILL.md +443 -0
- scientific_writer/.claude/skills/scientific-writing/references/citation_styles.md +720 -0
- scientific_writer/.claude/skills/scientific-writing/references/figures_tables.md +806 -0
- scientific_writer/.claude/skills/scientific-writing/references/imrad_structure.md +658 -0
- scientific_writer/.claude/skills/scientific-writing/references/reporting_guidelines.md +748 -0
- scientific_writer/.claude/skills/scientific-writing/references/writing_principles.md +824 -0
- scientific_writer/.claude/skills/treatment-plans/README.md +488 -0
- scientific_writer/.claude/skills/treatment-plans/SKILL.md +1536 -0
- scientific_writer/.claude/skills/treatment-plans/assets/STYLING_QUICK_REFERENCE.md +185 -0
- scientific_writer/.claude/skills/treatment-plans/assets/chronic_disease_management_plan.tex +665 -0
- scientific_writer/.claude/skills/treatment-plans/assets/general_medical_treatment_plan.tex +547 -0
- scientific_writer/.claude/skills/treatment-plans/assets/medical_treatment_plan.sty +222 -0
- scientific_writer/.claude/skills/treatment-plans/assets/mental_health_treatment_plan.tex +774 -0
- scientific_writer/.claude/skills/treatment-plans/assets/one_page_treatment_plan.tex +193 -0
- scientific_writer/.claude/skills/treatment-plans/assets/pain_management_plan.tex +799 -0
- scientific_writer/.claude/skills/treatment-plans/assets/perioperative_care_plan.tex +753 -0
- scientific_writer/.claude/skills/treatment-plans/assets/quality_checklist.md +471 -0
- scientific_writer/.claude/skills/treatment-plans/assets/rehabilitation_treatment_plan.tex +756 -0
- scientific_writer/.claude/skills/treatment-plans/references/goal_setting_frameworks.md +411 -0
- scientific_writer/.claude/skills/treatment-plans/references/intervention_guidelines.md +507 -0
- scientific_writer/.claude/skills/treatment-plans/references/regulatory_compliance.md +476 -0
- scientific_writer/.claude/skills/treatment-plans/references/specialty_specific_guidelines.md +655 -0
- scientific_writer/.claude/skills/treatment-plans/references/treatment_plan_standards.md +485 -0
- scientific_writer/.claude/skills/treatment-plans/scripts/check_completeness.py +318 -0
- scientific_writer/.claude/skills/treatment-plans/scripts/generate_template.py +244 -0
- scientific_writer/.claude/skills/treatment-plans/scripts/timeline_generator.py +369 -0
- scientific_writer/.claude/skills/treatment-plans/scripts/validate_treatment_plan.py +367 -0
- scientific_writer/.claude/skills/venue-templates/SKILL.md +590 -0
- scientific_writer/.claude/skills/venue-templates/assets/grants/nih_specific_aims.tex +235 -0
- scientific_writer/.claude/skills/venue-templates/assets/grants/nsf_proposal_template.tex +375 -0
- scientific_writer/.claude/skills/venue-templates/assets/journals/nature_article.tex +171 -0
- scientific_writer/.claude/skills/venue-templates/assets/journals/neurips_article.tex +283 -0
- scientific_writer/.claude/skills/venue-templates/assets/journals/plos_one.tex +317 -0
- scientific_writer/.claude/skills/venue-templates/assets/posters/beamerposter_academic.tex +311 -0
- scientific_writer/.claude/skills/venue-templates/references/conferences_formatting.md +564 -0
- scientific_writer/.claude/skills/venue-templates/references/grants_requirements.md +787 -0
- scientific_writer/.claude/skills/venue-templates/references/journals_formatting.md +486 -0
- scientific_writer/.claude/skills/venue-templates/references/posters_guidelines.md +628 -0
- scientific_writer/.claude/skills/venue-templates/scripts/customize_template.py +206 -0
- scientific_writer/.claude/skills/venue-templates/scripts/query_template.py +260 -0
- scientific_writer/.claude/skills/venue-templates/scripts/validate_format.py +255 -0
- scientific_writer/__init__.py +43 -0
- scientific_writer/api.py +393 -0
- scientific_writer/cli.py +326 -0
- scientific_writer/core.py +275 -0
- scientific_writer/models.py +76 -0
- scientific_writer/utils.py +289 -0
- scientific_writer-2.3.1.dist-info/METADATA +272 -0
- scientific_writer-2.3.1.dist-info/RECORD +315 -0
- scientific_writer-2.3.1.dist-info/WHEEL +4 -0
- scientific_writer-2.3.1.dist-info/entry_points.txt +2 -0
- scientific_writer-2.3.1.dist-info/licenses/LICENSE +22 -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
|
+
|