scitex 2.14.0__py3-none-any.whl → 2.15.3__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.
- scitex/__init__.py +71 -17
- scitex/_env_loader.py +156 -0
- scitex/_mcp_resources/__init__.py +37 -0
- scitex/_mcp_resources/_cheatsheet.py +135 -0
- scitex/_mcp_resources/_figrecipe.py +138 -0
- scitex/_mcp_resources/_formats.py +102 -0
- scitex/_mcp_resources/_modules.py +337 -0
- scitex/_mcp_resources/_session.py +149 -0
- scitex/_mcp_tools/__init__.py +4 -0
- scitex/_mcp_tools/audio.py +66 -0
- scitex/_mcp_tools/diagram.py +11 -95
- scitex/_mcp_tools/introspect.py +210 -0
- scitex/_mcp_tools/plt.py +260 -305
- scitex/_mcp_tools/scholar.py +74 -0
- scitex/_mcp_tools/social.py +27 -0
- scitex/_mcp_tools/template.py +24 -0
- scitex/_mcp_tools/writer.py +17 -210
- scitex/ai/_gen_ai/_PARAMS.py +10 -7
- scitex/ai/classification/reporters/_SingleClassificationReporter.py +45 -1603
- scitex/ai/classification/reporters/_mixins/__init__.py +36 -0
- scitex/ai/classification/reporters/_mixins/_constants.py +67 -0
- scitex/ai/classification/reporters/_mixins/_cv_summary.py +387 -0
- scitex/ai/classification/reporters/_mixins/_feature_importance.py +119 -0
- scitex/ai/classification/reporters/_mixins/_metrics.py +275 -0
- scitex/ai/classification/reporters/_mixins/_plotting.py +179 -0
- scitex/ai/classification/reporters/_mixins/_reports.py +153 -0
- scitex/ai/classification/reporters/_mixins/_storage.py +160 -0
- scitex/ai/classification/timeseries/_TimeSeriesSlidingWindowSplit.py +30 -1550
- scitex/ai/classification/timeseries/_sliding_window_core.py +467 -0
- scitex/ai/classification/timeseries/_sliding_window_plotting.py +369 -0
- scitex/audio/README.md +40 -36
- scitex/audio/__init__.py +129 -61
- scitex/audio/_branding.py +185 -0
- scitex/audio/_mcp/__init__.py +32 -0
- scitex/audio/_mcp/handlers.py +59 -6
- scitex/audio/_mcp/speak_handlers.py +238 -0
- scitex/audio/_relay.py +225 -0
- scitex/audio/_tts.py +18 -10
- scitex/audio/engines/base.py +17 -10
- scitex/audio/engines/elevenlabs_engine.py +7 -2
- scitex/audio/mcp_server.py +228 -75
- scitex/canvas/README.md +1 -1
- scitex/canvas/editor/_dearpygui/__init__.py +25 -0
- scitex/canvas/editor/_dearpygui/_editor.py +147 -0
- scitex/canvas/editor/_dearpygui/_handlers.py +476 -0
- scitex/canvas/editor/_dearpygui/_panels/__init__.py +17 -0
- scitex/canvas/editor/_dearpygui/_panels/_control.py +119 -0
- scitex/canvas/editor/_dearpygui/_panels/_element_controls.py +190 -0
- scitex/canvas/editor/_dearpygui/_panels/_preview.py +43 -0
- scitex/canvas/editor/_dearpygui/_panels/_sections.py +390 -0
- scitex/canvas/editor/_dearpygui/_plotting.py +187 -0
- scitex/canvas/editor/_dearpygui/_rendering.py +504 -0
- scitex/canvas/editor/_dearpygui/_selection.py +295 -0
- scitex/canvas/editor/_dearpygui/_state.py +93 -0
- scitex/canvas/editor/_dearpygui/_utils.py +61 -0
- scitex/canvas/editor/flask_editor/_core/__init__.py +27 -0
- scitex/canvas/editor/flask_editor/_core/_bbox_extraction.py +200 -0
- scitex/canvas/editor/flask_editor/_core/_editor.py +173 -0
- scitex/canvas/editor/flask_editor/_core/_export_helpers.py +353 -0
- scitex/canvas/editor/flask_editor/_core/_routes_basic.py +190 -0
- scitex/canvas/editor/flask_editor/_core/_routes_export.py +332 -0
- scitex/canvas/editor/flask_editor/_core/_routes_panels.py +252 -0
- scitex/canvas/editor/flask_editor/_core/_routes_save.py +218 -0
- scitex/canvas/editor/flask_editor/_core.py +25 -1684
- scitex/canvas/editor/flask_editor/templates/__init__.py +32 -70
- scitex/cli/__init__.py +38 -43
- scitex/cli/audio.py +160 -41
- scitex/cli/capture.py +133 -20
- scitex/cli/introspect.py +488 -0
- scitex/cli/main.py +200 -109
- scitex/cli/mcp.py +60 -34
- scitex/cli/plt.py +414 -0
- scitex/cli/repro.py +15 -8
- scitex/cli/resource.py +15 -8
- scitex/cli/scholar/__init__.py +154 -8
- scitex/cli/scholar/_crossref_scitex.py +296 -0
- scitex/cli/scholar/_fetch.py +25 -3
- scitex/cli/social.py +355 -0
- scitex/cli/stats.py +136 -11
- scitex/cli/template.py +129 -12
- scitex/cli/tex.py +15 -8
- scitex/cli/writer.py +49 -299
- scitex/cloud/__init__.py +41 -2
- scitex/config/README.md +1 -1
- scitex/config/__init__.py +16 -2
- scitex/config/_env_registry.py +256 -0
- scitex/context/__init__.py +22 -0
- scitex/dev/__init__.py +20 -1
- scitex/diagram/__init__.py +42 -19
- scitex/diagram/mcp_server.py +13 -125
- scitex/gen/__init__.py +50 -14
- scitex/gen/_list_packages.py +4 -4
- scitex/introspect/__init__.py +82 -0
- scitex/introspect/_call_graph.py +303 -0
- scitex/introspect/_class_hierarchy.py +163 -0
- scitex/introspect/_core.py +41 -0
- scitex/introspect/_docstring.py +131 -0
- scitex/introspect/_examples.py +113 -0
- scitex/introspect/_imports.py +271 -0
- scitex/{gen/_inspect_module.py → introspect/_list_api.py} +48 -56
- scitex/introspect/_mcp/__init__.py +41 -0
- scitex/introspect/_mcp/handlers.py +233 -0
- scitex/introspect/_members.py +155 -0
- scitex/introspect/_resolve.py +89 -0
- scitex/introspect/_signature.py +131 -0
- scitex/introspect/_source.py +80 -0
- scitex/introspect/_type_hints.py +172 -0
- scitex/io/_save.py +1 -2
- scitex/io/bundle/README.md +1 -1
- scitex/logging/_formatters.py +19 -9
- scitex/mcp_server.py +98 -5
- scitex/os/__init__.py +4 -0
- scitex/{gen → os}/_check_host.py +4 -5
- scitex/plt/__init__.py +245 -550
- scitex/plt/_subplots/_AxisWrapperMixins/_SeabornMixin/_wrappers.py +5 -10
- scitex/plt/docs/EXTERNAL_PACKAGE_BRANDING.md +149 -0
- scitex/plt/gallery/README.md +1 -1
- scitex/plt/utils/_hitmap/__init__.py +82 -0
- scitex/plt/utils/_hitmap/_artist_extraction.py +343 -0
- scitex/plt/utils/_hitmap/_color_application.py +346 -0
- scitex/plt/utils/_hitmap/_color_conversion.py +121 -0
- scitex/plt/utils/_hitmap/_constants.py +40 -0
- scitex/plt/utils/_hitmap/_hitmap_core.py +334 -0
- scitex/plt/utils/_hitmap/_path_extraction.py +357 -0
- scitex/plt/utils/_hitmap/_query.py +113 -0
- scitex/plt/utils/_hitmap.py +46 -1616
- scitex/plt/utils/_metadata/__init__.py +80 -0
- scitex/plt/utils/_metadata/_artists/__init__.py +25 -0
- scitex/plt/utils/_metadata/_artists/_base.py +195 -0
- scitex/plt/utils/_metadata/_artists/_collections.py +356 -0
- scitex/plt/utils/_metadata/_artists/_extract.py +57 -0
- scitex/plt/utils/_metadata/_artists/_images.py +80 -0
- scitex/plt/utils/_metadata/_artists/_lines.py +261 -0
- scitex/plt/utils/_metadata/_artists/_patches.py +247 -0
- scitex/plt/utils/_metadata/_artists/_text.py +106 -0
- scitex/plt/utils/_metadata/_csv.py +416 -0
- scitex/plt/utils/_metadata/_detect.py +225 -0
- scitex/plt/utils/_metadata/_legend.py +127 -0
- scitex/plt/utils/_metadata/_rounding.py +117 -0
- scitex/plt/utils/_metadata/_verification.py +202 -0
- scitex/schema/README.md +1 -1
- scitex/scholar/__init__.py +8 -0
- scitex/scholar/_mcp/crossref_handlers.py +265 -0
- scitex/scholar/core/Scholar.py +63 -1700
- scitex/scholar/core/_mixins/__init__.py +36 -0
- scitex/scholar/core/_mixins/_enrichers.py +270 -0
- scitex/scholar/core/_mixins/_library_handlers.py +100 -0
- scitex/scholar/core/_mixins/_loaders.py +103 -0
- scitex/scholar/core/_mixins/_pdf_download.py +375 -0
- scitex/scholar/core/_mixins/_pipeline.py +312 -0
- scitex/scholar/core/_mixins/_project_handlers.py +125 -0
- scitex/scholar/core/_mixins/_savers.py +69 -0
- scitex/scholar/core/_mixins/_search.py +103 -0
- scitex/scholar/core/_mixins/_services.py +88 -0
- scitex/scholar/core/_mixins/_url_finding.py +105 -0
- scitex/scholar/crossref_scitex.py +367 -0
- scitex/scholar/docs/EXTERNAL_PACKAGE_BRANDING.md +149 -0
- scitex/scholar/examples/00_run_all.sh +120 -0
- scitex/scholar/jobs/_executors.py +27 -3
- scitex/scholar/pdf_download/ScholarPDFDownloader.py +38 -416
- scitex/scholar/pdf_download/_cli.py +154 -0
- scitex/scholar/pdf_download/strategies/__init__.py +11 -8
- scitex/scholar/pdf_download/strategies/manual_download_fallback.py +80 -3
- scitex/scholar/pipelines/ScholarPipelineBibTeX.py +73 -121
- scitex/scholar/pipelines/ScholarPipelineParallel.py +80 -138
- scitex/scholar/pipelines/ScholarPipelineSingle.py +43 -63
- scitex/scholar/pipelines/_single_steps.py +71 -36
- scitex/scholar/storage/_LibraryManager.py +97 -1695
- scitex/scholar/storage/_mixins/__init__.py +30 -0
- scitex/scholar/storage/_mixins/_bibtex_handlers.py +128 -0
- scitex/scholar/storage/_mixins/_library_operations.py +218 -0
- scitex/scholar/storage/_mixins/_metadata_conversion.py +226 -0
- scitex/scholar/storage/_mixins/_paper_saving.py +456 -0
- scitex/scholar/storage/_mixins/_resolution.py +376 -0
- scitex/scholar/storage/_mixins/_storage_helpers.py +121 -0
- scitex/scholar/storage/_mixins/_symlink_handlers.py +226 -0
- scitex/security/README.md +3 -3
- scitex/session/README.md +1 -1
- scitex/session/__init__.py +26 -7
- scitex/session/_decorator.py +1 -1
- scitex/sh/README.md +1 -1
- scitex/sh/__init__.py +7 -4
- scitex/social/__init__.py +155 -0
- scitex/social/docs/EXTERNAL_PACKAGE_BRANDING.md +149 -0
- scitex/stats/_mcp/_handlers/__init__.py +31 -0
- scitex/stats/_mcp/_handlers/_corrections.py +113 -0
- scitex/stats/_mcp/_handlers/_descriptive.py +78 -0
- scitex/stats/_mcp/_handlers/_effect_size.py +106 -0
- scitex/stats/_mcp/_handlers/_format.py +94 -0
- scitex/stats/_mcp/_handlers/_normality.py +110 -0
- scitex/stats/_mcp/_handlers/_posthoc.py +224 -0
- scitex/stats/_mcp/_handlers/_power.py +247 -0
- scitex/stats/_mcp/_handlers/_recommend.py +102 -0
- scitex/stats/_mcp/_handlers/_run_test.py +279 -0
- scitex/stats/_mcp/_handlers/_stars.py +48 -0
- scitex/stats/_mcp/handlers.py +19 -1171
- scitex/stats/auto/_stat_style.py +175 -0
- scitex/stats/auto/_style_definitions.py +411 -0
- scitex/stats/auto/_styles.py +22 -620
- scitex/stats/descriptive/__init__.py +11 -8
- scitex/stats/descriptive/_ci.py +39 -0
- scitex/stats/power/_power.py +15 -4
- scitex/str/__init__.py +2 -1
- scitex/str/_title_case.py +63 -0
- scitex/template/README.md +1 -1
- scitex/template/__init__.py +25 -10
- scitex/template/_code_templates.py +147 -0
- scitex/template/_mcp/handlers.py +81 -0
- scitex/template/_mcp/tool_schemas.py +55 -0
- scitex/template/_templates/__init__.py +51 -0
- scitex/template/_templates/audio.py +233 -0
- scitex/template/_templates/canvas.py +312 -0
- scitex/template/_templates/capture.py +268 -0
- scitex/template/_templates/config.py +43 -0
- scitex/template/_templates/diagram.py +294 -0
- scitex/template/_templates/io.py +107 -0
- scitex/template/_templates/module.py +53 -0
- scitex/template/_templates/plt.py +202 -0
- scitex/template/_templates/scholar.py +267 -0
- scitex/template/_templates/session.py +130 -0
- scitex/template/_templates/session_minimal.py +43 -0
- scitex/template/_templates/session_plot.py +67 -0
- scitex/template/_templates/session_stats.py +77 -0
- scitex/template/_templates/stats.py +323 -0
- scitex/template/_templates/writer.py +296 -0
- scitex/template/clone_writer_directory.py +5 -5
- scitex/ui/_backends/_email.py +10 -2
- scitex/ui/_backends/_webhook.py +5 -1
- scitex/web/_search_pubmed.py +10 -6
- scitex/writer/README.md +1 -1
- scitex/writer/__init__.py +43 -34
- scitex/writer/_mcp/handlers.py +11 -744
- scitex/writer/_mcp/tool_schemas.py +5 -335
- scitex-2.15.3.dist-info/METADATA +667 -0
- {scitex-2.14.0.dist-info → scitex-2.15.3.dist-info}/RECORD +241 -120
- scitex/canvas/editor/flask_editor/templates/_scripts.py +0 -4933
- scitex/canvas/editor/flask_editor/templates/_styles.py +0 -1658
- scitex/diagram/_compile.py +0 -312
- scitex/diagram/_diagram.py +0 -355
- scitex/diagram/_mcp/__init__.py +0 -4
- scitex/diagram/_mcp/handlers.py +0 -400
- scitex/diagram/_mcp/tool_schemas.py +0 -157
- scitex/diagram/_presets.py +0 -173
- scitex/diagram/_schema.py +0 -182
- scitex/diagram/_split.py +0 -278
- scitex/gen/_ci.py +0 -12
- scitex/gen/_title_case.py +0 -89
- scitex/plt/_mcp/__init__.py +0 -4
- scitex/plt/_mcp/_handlers_annotation.py +0 -102
- scitex/plt/_mcp/_handlers_figure.py +0 -195
- scitex/plt/_mcp/_handlers_plot.py +0 -252
- scitex/plt/_mcp/_handlers_style.py +0 -219
- scitex/plt/_mcp/handlers.py +0 -74
- scitex/plt/_mcp/tool_schemas.py +0 -497
- scitex/plt/mcp_server.py +0 -231
- scitex/scholar/examples/SUGGESTIONS.md +0 -865
- scitex/scholar/examples/dev.py +0 -38
- scitex-2.14.0.dist-info/METADATA +0 -1238
- /scitex/{gen → context}/_detect_environment.py +0 -0
- /scitex/{gen → context}/_get_notebook_path.py +0 -0
- /scitex/{gen/_shell.py → sh/_shell_legacy.py} +0 -0
- {scitex-2.14.0.dist-info → scitex-2.15.3.dist-info}/WHEEL +0 -0
- {scitex-2.14.0.dist-info → scitex-2.15.3.dist-info}/entry_points.txt +0 -0
- {scitex-2.14.0.dist-info → scitex-2.15.3.dist-info}/licenses/LICENSE +0 -0
|
@@ -0,0 +1,296 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# Timestamp: 2026-01-25
|
|
3
|
+
# File: src/scitex/template/_templates/writer.py
|
|
4
|
+
# ----------------------------------------
|
|
5
|
+
|
|
6
|
+
"""Template for stx.writer LaTeX manuscript compilation module usage."""
|
|
7
|
+
|
|
8
|
+
TEMPLATE = {
|
|
9
|
+
"name": "Writer Module",
|
|
10
|
+
"description": "stx.writer usage for LaTeX manuscript compilation and paper writing",
|
|
11
|
+
"filename": "writer_script.py",
|
|
12
|
+
"priority": 9,
|
|
13
|
+
"content": '''#!/usr/bin/env python3
|
|
14
|
+
# -*- coding: utf-8 -*-
|
|
15
|
+
# Timestamp: {timestamp}
|
|
16
|
+
# File: {filepath}
|
|
17
|
+
|
|
18
|
+
"""
|
|
19
|
+
stx.writer - LaTeX Manuscript Compilation
|
|
20
|
+
=========================================
|
|
21
|
+
|
|
22
|
+
stx.writer provides:
|
|
23
|
+
- LaTeX to PDF compilation
|
|
24
|
+
- BibTeX bibliography processing
|
|
25
|
+
- Figure and table management
|
|
26
|
+
- Word count and statistics
|
|
27
|
+
- Manuscript structure scaffolding
|
|
28
|
+
|
|
29
|
+
Usage Patterns
|
|
30
|
+
--------------
|
|
31
|
+
1. CLI: scitex writer <command> [options]
|
|
32
|
+
2. MCP: writer_usage tool for documentation
|
|
33
|
+
3. Python API: stx.writer.* functions
|
|
34
|
+
|
|
35
|
+
Typical Workflow
|
|
36
|
+
----------------
|
|
37
|
+
1. Clone paper template: scitex template clone paper ./manuscript
|
|
38
|
+
2. Write manuscript: Edit .tex files
|
|
39
|
+
3. Compile: scitex writer compile ./manuscript
|
|
40
|
+
4. Check: scitex writer wordcount ./manuscript
|
|
41
|
+
"""
|
|
42
|
+
|
|
43
|
+
import scitex as stx
|
|
44
|
+
|
|
45
|
+
# ============================================================
|
|
46
|
+
# Pattern 1: CLI Usage (Recommended)
|
|
47
|
+
# ============================================================
|
|
48
|
+
|
|
49
|
+
"""
|
|
50
|
+
CLI Commands:
|
|
51
|
+
-------------
|
|
52
|
+
|
|
53
|
+
# Compile manuscript to PDF
|
|
54
|
+
scitex writer compile ./manuscript
|
|
55
|
+
scitex writer compile ./manuscript --output paper.pdf
|
|
56
|
+
|
|
57
|
+
# Compile with bibliography
|
|
58
|
+
scitex writer compile ./manuscript --bib
|
|
59
|
+
|
|
60
|
+
# Clean auxiliary files
|
|
61
|
+
scitex writer clean ./manuscript
|
|
62
|
+
|
|
63
|
+
# Word count
|
|
64
|
+
scitex writer wordcount ./manuscript
|
|
65
|
+
|
|
66
|
+
# Check for common LaTeX errors
|
|
67
|
+
scitex writer check ./manuscript
|
|
68
|
+
|
|
69
|
+
# Watch for changes and auto-compile
|
|
70
|
+
scitex writer watch ./manuscript
|
|
71
|
+
"""
|
|
72
|
+
|
|
73
|
+
# ============================================================
|
|
74
|
+
# Pattern 2: Project Structure
|
|
75
|
+
# ============================================================
|
|
76
|
+
|
|
77
|
+
"""
|
|
78
|
+
Recommended Manuscript Structure:
|
|
79
|
+
---------------------------------
|
|
80
|
+
|
|
81
|
+
manuscript/
|
|
82
|
+
main.tex # Main document
|
|
83
|
+
sections/
|
|
84
|
+
abstract.tex # Abstract
|
|
85
|
+
introduction.tex # Introduction
|
|
86
|
+
methods.tex # Methods
|
|
87
|
+
results.tex # Results
|
|
88
|
+
discussion.tex # Discussion
|
|
89
|
+
references.tex # References section
|
|
90
|
+
figures/
|
|
91
|
+
fig1.png # Figure files
|
|
92
|
+
fig2.pdf
|
|
93
|
+
tables/
|
|
94
|
+
table1.tex # LaTeX tables
|
|
95
|
+
references.bib # BibTeX bibliography
|
|
96
|
+
config/
|
|
97
|
+
preamble.tex # Custom packages/macros
|
|
98
|
+
|
|
99
|
+
Create this structure with:
|
|
100
|
+
scitex template clone paper ./manuscript
|
|
101
|
+
"""
|
|
102
|
+
|
|
103
|
+
# ============================================================
|
|
104
|
+
# Pattern 3: LaTeX Best Practices
|
|
105
|
+
# ============================================================
|
|
106
|
+
|
|
107
|
+
"""
|
|
108
|
+
LaTeX Writing Guidelines:
|
|
109
|
+
-------------------------
|
|
110
|
+
|
|
111
|
+
1. Document Structure:
|
|
112
|
+
\\\\documentclass[article]
|
|
113
|
+
\\\\input[config/preamble]
|
|
114
|
+
\\\\begin[document]
|
|
115
|
+
\\\\input[sections/abstract]
|
|
116
|
+
\\\\input[sections/introduction]
|
|
117
|
+
\\\\input[sections/methods]
|
|
118
|
+
\\\\input[sections/results]
|
|
119
|
+
\\\\input[sections/discussion]
|
|
120
|
+
\\\\bibliography[references]
|
|
121
|
+
\\\\end[document]
|
|
122
|
+
|
|
123
|
+
2. Figure Inclusion:
|
|
124
|
+
\\\\begin[figure][htbp]
|
|
125
|
+
\\\\centering
|
|
126
|
+
\\\\includegraphics[width=0.8\\\\linewidth][figures/fig1.png]
|
|
127
|
+
\\\\caption[Description of the figure.]
|
|
128
|
+
\\\\label[fig:main]
|
|
129
|
+
\\\\end[figure]
|
|
130
|
+
|
|
131
|
+
3. Table Inclusion:
|
|
132
|
+
\\\\begin[table][htbp]
|
|
133
|
+
\\\\centering
|
|
134
|
+
\\\\caption[Description of the table.]
|
|
135
|
+
\\\\label[tab:results]
|
|
136
|
+
\\\\input[tables/table1]
|
|
137
|
+
\\\\end[table]
|
|
138
|
+
|
|
139
|
+
4. Citations:
|
|
140
|
+
As shown in previous work~\\\\cite[author2023]...
|
|
141
|
+
Multiple citations~\\\\cite[ref1,ref2,ref3]...
|
|
142
|
+
|
|
143
|
+
5. Cross-references:
|
|
144
|
+
See Figure~\\\\ref[fig:main]...
|
|
145
|
+
Table~\\\\ref[tab:results] shows...
|
|
146
|
+
Section~\\\\ref[sec:methods] describes...
|
|
147
|
+
|
|
148
|
+
Note: Replace [] with curly braces in actual LaTeX code.
|
|
149
|
+
"""
|
|
150
|
+
|
|
151
|
+
# ============================================================
|
|
152
|
+
# Pattern 4: BibTeX Management
|
|
153
|
+
# ============================================================
|
|
154
|
+
|
|
155
|
+
"""
|
|
156
|
+
BibTeX Best Practices:
|
|
157
|
+
----------------------
|
|
158
|
+
|
|
159
|
+
# references.bib structure
|
|
160
|
+
@article key=author2023,
|
|
161
|
+
author = Smith, John and Doe, Jane,
|
|
162
|
+
title = Title of the Paper,
|
|
163
|
+
journal = Journal Name,
|
|
164
|
+
year = 2023,
|
|
165
|
+
volume = 10,
|
|
166
|
+
pages = 1--15,
|
|
167
|
+
doi = 10.1000/example
|
|
168
|
+
|
|
169
|
+
|
|
170
|
+
# Enrich with scitex scholar
|
|
171
|
+
scitex scholar enrich --bibtex references.bib
|
|
172
|
+
|
|
173
|
+
# This adds:
|
|
174
|
+
# - Missing DOIs
|
|
175
|
+
# - Abstracts
|
|
176
|
+
# - Citation counts
|
|
177
|
+
# - Impact factors
|
|
178
|
+
"""
|
|
179
|
+
|
|
180
|
+
# ============================================================
|
|
181
|
+
# Pattern 5: Integration with SciTeX
|
|
182
|
+
# ============================================================
|
|
183
|
+
|
|
184
|
+
@stx.session
|
|
185
|
+
def main(
|
|
186
|
+
manuscript_dir="./manuscript",
|
|
187
|
+
CONFIG=stx.INJECTED,
|
|
188
|
+
logger=stx.INJECTED,
|
|
189
|
+
):
|
|
190
|
+
"""Manuscript preparation workflow."""
|
|
191
|
+
from pathlib import Path
|
|
192
|
+
|
|
193
|
+
ms_dir = Path(manuscript_dir)
|
|
194
|
+
|
|
195
|
+
# 1. Generate figures from analysis
|
|
196
|
+
logger.info("Generating figures...")
|
|
197
|
+
# (figures created with stx.plt would go in ms_dir/figures/)
|
|
198
|
+
|
|
199
|
+
# 2. Generate tables from data
|
|
200
|
+
logger.info("Generating tables...")
|
|
201
|
+
# (tables created with stx.io.save() in LaTeX format)
|
|
202
|
+
|
|
203
|
+
# 3. Copy to manuscript directory
|
|
204
|
+
import shutil
|
|
205
|
+
if (CONFIG.SDIR_OUT / "figures").exists():
|
|
206
|
+
for fig in (CONFIG.SDIR_OUT / "figures").glob("*.png"):
|
|
207
|
+
shutil.copy(fig, ms_dir / "figures" / fig.name)
|
|
208
|
+
logger.info("Copied figure to manuscript")
|
|
209
|
+
|
|
210
|
+
logger.info("Figures ready in manuscript/figures/")
|
|
211
|
+
return 0
|
|
212
|
+
|
|
213
|
+
# ============================================================
|
|
214
|
+
# Pattern 6: Python API
|
|
215
|
+
# ============================================================
|
|
216
|
+
|
|
217
|
+
def python_api_example():
|
|
218
|
+
"""Direct Python API for writer."""
|
|
219
|
+
from scitex.writer import (
|
|
220
|
+
compile_manuscript,
|
|
221
|
+
clean_auxiliary,
|
|
222
|
+
word_count,
|
|
223
|
+
check_manuscript,
|
|
224
|
+
)
|
|
225
|
+
|
|
226
|
+
# Compile
|
|
227
|
+
result = compile_manuscript(
|
|
228
|
+
manuscript_dir="./manuscript",
|
|
229
|
+
output="paper.pdf",
|
|
230
|
+
bibliography=True
|
|
231
|
+
)
|
|
232
|
+
print("Compilation complete")
|
|
233
|
+
|
|
234
|
+
# Word count
|
|
235
|
+
stats = word_count("./manuscript")
|
|
236
|
+
print("Word count complete")
|
|
237
|
+
|
|
238
|
+
# Check for issues
|
|
239
|
+
issues = check_manuscript("./manuscript")
|
|
240
|
+
for issue in issues:
|
|
241
|
+
print("Warning found")
|
|
242
|
+
|
|
243
|
+
# Clean
|
|
244
|
+
clean_auxiliary("./manuscript")
|
|
245
|
+
|
|
246
|
+
# ============================================================
|
|
247
|
+
# Pattern 7: Automated Paper Generation
|
|
248
|
+
# ============================================================
|
|
249
|
+
|
|
250
|
+
"""
|
|
251
|
+
Automated Workflow:
|
|
252
|
+
-------------------
|
|
253
|
+
|
|
254
|
+
1. Run analysis scripts:
|
|
255
|
+
python scripts/analysis.py
|
|
256
|
+
|
|
257
|
+
2. Figures auto-generated to:
|
|
258
|
+
script_out/FINISHED_SUCCESS/<session>/
|
|
259
|
+
|
|
260
|
+
3. Copy figures to manuscript:
|
|
261
|
+
cp script_out/FINISHED_SUCCESS/*/figures/* manuscript/figures/
|
|
262
|
+
|
|
263
|
+
4. Compile manuscript:
|
|
264
|
+
scitex writer compile ./manuscript
|
|
265
|
+
|
|
266
|
+
5. Check word count:
|
|
267
|
+
scitex writer wordcount ./manuscript
|
|
268
|
+
"""
|
|
269
|
+
|
|
270
|
+
# ============================================================
|
|
271
|
+
# MCP Tools Reference
|
|
272
|
+
# ============================================================
|
|
273
|
+
|
|
274
|
+
"""
|
|
275
|
+
MCP Tools:
|
|
276
|
+
----------
|
|
277
|
+
|
|
278
|
+
Documentation:
|
|
279
|
+
- writer_usage() # Get complete usage guide
|
|
280
|
+
|
|
281
|
+
Note: Most writer operations are done via CLI:
|
|
282
|
+
- scitex writer compile <dir>
|
|
283
|
+
- scitex writer clean <dir>
|
|
284
|
+
- scitex writer wordcount <dir>
|
|
285
|
+
- scitex writer check <dir>
|
|
286
|
+
- scitex writer watch <dir>
|
|
287
|
+
"""
|
|
288
|
+
|
|
289
|
+
if __name__ == "__main__":
|
|
290
|
+
main()
|
|
291
|
+
''',
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
__all__ = ["TEMPLATE"]
|
|
295
|
+
|
|
296
|
+
# EOF
|
|
@@ -25,8 +25,8 @@ TEMPLATE_REPO_URL = "https://github.com/ywatanabe1989/scitex-writer.git"
|
|
|
25
25
|
def clone_writer_directory(
|
|
26
26
|
project_dir: str,
|
|
27
27
|
git_strategy: Optional[str] = "child",
|
|
28
|
-
branch: Optional[str] =
|
|
29
|
-
tag: Optional[str] =
|
|
28
|
+
branch: Optional[str] = "main",
|
|
29
|
+
tag: Optional[str] = None,
|
|
30
30
|
) -> bool:
|
|
31
31
|
"""
|
|
32
32
|
Create a new paper directory from the scitex-writer template repository.
|
|
@@ -39,10 +39,10 @@ def clone_writer_directory(
|
|
|
39
39
|
git_strategy : str, optional
|
|
40
40
|
Git initialization strategy ('child', 'parent', None). Default is 'child'.
|
|
41
41
|
branch : str, optional
|
|
42
|
-
Specific branch of the template repository to clone.
|
|
42
|
+
Specific branch of the template repository to clone. Default is 'main'.
|
|
43
43
|
Mutually exclusive with tag parameter.
|
|
44
44
|
tag : str, optional
|
|
45
|
-
Specific tag/release of the template repository to clone.
|
|
45
|
+
Specific tag/release of the template repository to clone. If None, uses the branch.
|
|
46
46
|
Mutually exclusive with branch parameter.
|
|
47
47
|
|
|
48
48
|
Returns
|
|
@@ -53,7 +53,7 @@ def clone_writer_directory(
|
|
|
53
53
|
Example
|
|
54
54
|
-------
|
|
55
55
|
>>> from scitex.template import clone_writer_directory
|
|
56
|
-
>>> clone_writer_directory("my_paper") # Uses
|
|
56
|
+
>>> clone_writer_directory("my_paper") # Uses main branch
|
|
57
57
|
>>> clone_writer_directory("./papers/my_paper")
|
|
58
58
|
>>> clone_writer_directory("my_paper", branch="develop")
|
|
59
59
|
>>> clone_writer_directory("my_paper", tag="v2.0.0")
|
scitex/ui/_backends/_email.py
CHANGED
|
@@ -24,8 +24,16 @@ class EmailBackend(BaseNotifyBackend):
|
|
|
24
24
|
recipient: Optional[str] = None,
|
|
25
25
|
sender: Optional[str] = None,
|
|
26
26
|
):
|
|
27
|
-
self.recipient =
|
|
28
|
-
|
|
27
|
+
self.recipient = (
|
|
28
|
+
recipient
|
|
29
|
+
or os.getenv("SCITEX_UI_EMAIL_NOTIFICATION_TO")
|
|
30
|
+
or os.getenv("SCITEX_NOTIFY_EMAIL_TO")
|
|
31
|
+
)
|
|
32
|
+
self.sender = (
|
|
33
|
+
sender
|
|
34
|
+
or os.getenv("SCITEX_UI_EMAIL_NOTIFICATION_FROM")
|
|
35
|
+
or os.getenv("SCITEX_NOTIFY_EMAIL_FROM")
|
|
36
|
+
)
|
|
29
37
|
|
|
30
38
|
def is_available(self) -> bool:
|
|
31
39
|
return bool(
|
scitex/ui/_backends/_webhook.py
CHANGED
|
@@ -22,7 +22,11 @@ class WebhookBackend(BaseNotifyBackend):
|
|
|
22
22
|
name = "webhook"
|
|
23
23
|
|
|
24
24
|
def __init__(self, url: Optional[str] = None):
|
|
25
|
-
self.url =
|
|
25
|
+
self.url = (
|
|
26
|
+
url
|
|
27
|
+
or os.getenv("SCITEX_UI_WEBHOOK_URL")
|
|
28
|
+
or os.getenv("SCITEX_NOTIFY_WEBHOOK_URL")
|
|
29
|
+
)
|
|
26
30
|
|
|
27
31
|
def is_available(self) -> bool:
|
|
28
32
|
return bool(self.url)
|
scitex/web/_search_pubmed.py
CHANGED
|
@@ -179,9 +179,11 @@ def get_crossref_metrics(
|
|
|
179
179
|
|
|
180
180
|
# Use provided email or fallback to environment variables
|
|
181
181
|
if not email:
|
|
182
|
-
email =
|
|
183
|
-
"
|
|
184
|
-
os.getenv("
|
|
182
|
+
email = (
|
|
183
|
+
os.getenv("SCITEX_SCHOLAR_CROSSREF_EMAIL")
|
|
184
|
+
or os.getenv("SCITEX_CROSSREF_EMAIL")
|
|
185
|
+
or os.getenv("SCITEX_SCHOLAR_PUBMED_EMAIL")
|
|
186
|
+
or os.getenv("SCITEX_PUBMED_EMAIL", "research@example.com")
|
|
185
187
|
)
|
|
186
188
|
headers = {"User-Agent": f"SciTeX/1.0 (mailto:{email})"}
|
|
187
189
|
|
|
@@ -218,9 +220,11 @@ async def get_crossref_metrics_async(
|
|
|
218
220
|
|
|
219
221
|
# Use provided email or fallback to environment variables
|
|
220
222
|
if not email:
|
|
221
|
-
email =
|
|
222
|
-
"
|
|
223
|
-
os.getenv("
|
|
223
|
+
email = (
|
|
224
|
+
os.getenv("SCITEX_SCHOLAR_CROSSREF_EMAIL")
|
|
225
|
+
or os.getenv("SCITEX_CROSSREF_EMAIL")
|
|
226
|
+
or os.getenv("SCITEX_SCHOLAR_PUBMED_EMAIL")
|
|
227
|
+
or os.getenv("SCITEX_PUBMED_EMAIL", "research@example.com")
|
|
224
228
|
)
|
|
225
229
|
headers = {"User-Agent": f"SciTeX/1.0 (mailto:{email})"}
|
|
226
230
|
|
scitex/writer/README.md
CHANGED
scitex/writer/__init__.py
CHANGED
|
@@ -1,46 +1,55 @@
|
|
|
1
1
|
#!/usr/bin/env python3
|
|
2
|
-
# File: /home/ywatanabe/proj/scitex-code/src/scitex/writer/__init__.py
|
|
3
|
-
|
|
4
2
|
"""
|
|
5
|
-
SciTeX Writer -
|
|
6
|
-
|
|
7
|
-
Python wrapper around scitex-writer shell scripts for LaTeX compilation.
|
|
3
|
+
SciTeX Writer - Thin wrapper delegating to scitex-writer package.
|
|
8
4
|
|
|
9
|
-
|
|
10
|
-
|
|
5
|
+
Single source of truth: scitex-writer package
|
|
6
|
+
This module re-exports scitex-writer as-is, without modifications.
|
|
11
7
|
|
|
12
|
-
|
|
13
|
-
>>> writer = Writer(project_dir=Path("."))
|
|
14
|
-
>>> result = writer.compile_manuscript()
|
|
15
|
-
|
|
16
|
-
# Using unified compile function
|
|
17
|
-
>>> result = compile("manuscript", project_dir=Path("."))
|
|
18
|
-
>>> results = compile("manuscript", "supplementary", project_dir=Path("."))
|
|
19
|
-
>>> results = await compile("all", project_dir=Path("."), async_=True)
|
|
8
|
+
Install: pip install scitex-writer
|
|
20
9
|
"""
|
|
21
10
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
11
|
+
import os as _os
|
|
12
|
+
|
|
13
|
+
# Set branding environment variables BEFORE importing scitex-writer
|
|
14
|
+
_os.environ.setdefault("SCITEX_WRITER_BRAND", "scitex.writer")
|
|
15
|
+
_os.environ.setdefault("SCITEX_WRITER_ALIAS", "sw")
|
|
16
|
+
|
|
17
|
+
# Re-export from scitex-writer package (single source of truth)
|
|
18
|
+
try:
|
|
19
|
+
from scitex_writer import __version__ as writer_version
|
|
20
|
+
from scitex_writer import (
|
|
21
|
+
bib,
|
|
22
|
+
compile,
|
|
23
|
+
figures,
|
|
24
|
+
guidelines,
|
|
25
|
+
project,
|
|
26
|
+
prompts,
|
|
27
|
+
tables,
|
|
28
|
+
)
|
|
29
|
+
|
|
30
|
+
HAS_WRITER_PKG = True
|
|
31
|
+
|
|
32
|
+
except ImportError:
|
|
33
|
+
HAS_WRITER_PKG = False
|
|
34
|
+
writer_version = None
|
|
35
|
+
bib = None
|
|
36
|
+
compile = None
|
|
37
|
+
figures = None
|
|
38
|
+
guidelines = None
|
|
39
|
+
project = None
|
|
40
|
+
prompts = None
|
|
41
|
+
tables = None
|
|
25
42
|
|
|
26
43
|
__all__ = [
|
|
27
|
-
"
|
|
44
|
+
"HAS_WRITER_PKG",
|
|
45
|
+
"writer_version",
|
|
46
|
+
"bib",
|
|
28
47
|
"compile",
|
|
29
|
-
"
|
|
48
|
+
"figures",
|
|
49
|
+
"guidelines",
|
|
50
|
+
"project",
|
|
51
|
+
"prompts",
|
|
52
|
+
"tables",
|
|
30
53
|
]
|
|
31
54
|
|
|
32
|
-
|
|
33
|
-
# Clean up namespace - hide internal submodules
|
|
34
|
-
def _cleanup():
|
|
35
|
-
import sys
|
|
36
|
-
|
|
37
|
-
_this = sys.modules[__name__]
|
|
38
|
-
for _attr in list(vars(_this).keys()):
|
|
39
|
-
if _attr in ("_dataclasses",):
|
|
40
|
-
delattr(_this, _attr)
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
_cleanup()
|
|
44
|
-
del _cleanup
|
|
45
|
-
|
|
46
55
|
# EOF
|