article-cli 1.2.0__tar.gz → 1.3.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {article_cli-1.2.0 → article_cli-1.3.0}/PKG-INFO +113 -6
- {article_cli-1.2.0 → article_cli-1.3.0}/README.md +112 -5
- {article_cli-1.2.0 → article_cli-1.3.0}/pyproject.toml +1 -1
- {article_cli-1.2.0 → article_cli-1.3.0}/src/article_cli/__init__.py +1 -1
- {article_cli-1.2.0 → article_cli-1.3.0}/src/article_cli/cli.py +185 -2
- {article_cli-1.2.0 → article_cli-1.3.0}/src/article_cli/config.py +164 -1
- article_cli-1.3.0/src/article_cli/fonts.py +314 -0
- {article_cli-1.2.0 → article_cli-1.3.0}/src/article_cli/latex_compiler.py +187 -4
- {article_cli-1.2.0 → article_cli-1.3.0}/src/article_cli/repository_setup.py +590 -53
- article_cli-1.3.0/src/article_cli/themes.py +383 -0
- article_cli-1.3.0/tests/__init__.py +1 -0
- {article_cli-1.2.0 → article_cli-1.3.0}/tests/test_config.py +62 -61
- article_cli-1.3.0/tests/test_fonts.py +239 -0
- article_cli-1.3.0/tests/test_latex_compiler.py +340 -0
- article_cli-1.3.0/tests/test_repository_setup.py +482 -0
- article_cli-1.3.0/tests/test_themes.py +384 -0
- article_cli-1.2.0/tests/__init__.py +0 -1
- {article_cli-1.2.0 → article_cli-1.3.0}/.gitignore +0 -0
- {article_cli-1.2.0 → article_cli-1.3.0}/LICENSE +0 -0
- {article_cli-1.2.0 → article_cli-1.3.0}/src/article_cli/__main__.py +0 -0
- {article_cli-1.2.0 → article_cli-1.3.0}/src/article_cli/git_manager.py +0 -0
- {article_cli-1.2.0 → article_cli-1.3.0}/src/article_cli/zotero.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: article-cli
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.3.0
|
|
4
4
|
Summary: CLI tool for managing LaTeX articles with git integration and Zotero bibliography
|
|
5
5
|
Project-URL: Homepage, https://github.com/feelpp/article.cli
|
|
6
6
|
Project-URL: Documentation, https://github.com/feelpp/article.cli#readme
|
|
@@ -59,13 +59,15 @@ Description-Content-Type: text/markdown
|
|
|
59
59
|
[](https://badge.fury.io/py/article-cli)
|
|
60
60
|
[](https://pypi.org/project/article-cli/)
|
|
61
61
|
|
|
62
|
-
A command-line tool for managing LaTeX articles with git integration and Zotero bibliography synchronization.
|
|
62
|
+
A command-line tool for managing LaTeX articles and presentations with git integration and Zotero bibliography synchronization.
|
|
63
63
|
|
|
64
64
|
## Features
|
|
65
65
|
|
|
66
|
-
- **Repository Initialization**: Complete setup for LaTeX article projects with one command
|
|
67
|
-
- **
|
|
68
|
-
- **
|
|
66
|
+
- **Repository Initialization**: Complete setup for LaTeX article or presentation projects with one command
|
|
67
|
+
- **Project Types**: Support for articles, Beamer presentations, and posters
|
|
68
|
+
- **LaTeX Compilation**: Compile documents with latexmk/pdflatex/xelatex/lualatex, watch mode, shell escape support
|
|
69
|
+
- **Font Installation**: Download and install fonts for XeLaTeX projects (Marianne, Roboto Mono, etc.)
|
|
70
|
+
- **GitHub Actions Workflows**: Automated PDF compilation with XeLaTeX support, artifact upload, and GitHub releases
|
|
69
71
|
- **Git Release Management**: Create, list, and delete releases with gitinfo2 support
|
|
70
72
|
- **Zotero Integration**: Synchronize bibliography from Zotero with robust pagination and error handling
|
|
71
73
|
- **LaTeX Build Management**: Clean build files and manage LaTeX compilation artifacts
|
|
@@ -168,6 +170,24 @@ default_branch = "main"
|
|
|
168
170
|
|
|
169
171
|
[latex]
|
|
170
172
|
clean_extensions = [".aux", ".bbl", ".blg", ".log", ".out", ".synctex.gz"]
|
|
173
|
+
|
|
174
|
+
[fonts]
|
|
175
|
+
directory = "fonts"
|
|
176
|
+
|
|
177
|
+
[fonts.sources]
|
|
178
|
+
marianne = "https://github.com/ArnaudBelcworking/Marianne/archive/refs/heads/master.zip"
|
|
179
|
+
roboto-mono = "https://github.com/googlefonts/RobotoMono/releases/download/v3.000/RobotoMono-v3.000.zip"
|
|
180
|
+
|
|
181
|
+
[themes]
|
|
182
|
+
directory = "."
|
|
183
|
+
|
|
184
|
+
# Custom theme sources (numpex is built-in)
|
|
185
|
+
# [themes.sources.my-theme]
|
|
186
|
+
# url = "https://example.com/theme.zip"
|
|
187
|
+
# description = "My custom theme"
|
|
188
|
+
# files = ["beamerthememytheme.sty"]
|
|
189
|
+
# requires_fonts = false
|
|
190
|
+
# engine = "pdflatex"
|
|
171
191
|
```
|
|
172
192
|
|
|
173
193
|
## Usage
|
|
@@ -178,6 +198,12 @@ clean_extensions = [".aux", ".bbl", ".blg", ".log", ".out", ".synctex.gz"]
|
|
|
178
198
|
# Initialize a new article repository (auto-detects main .tex file)
|
|
179
199
|
article-cli init --title "My Article Title" --authors "John Doe,Jane Smith"
|
|
180
200
|
|
|
201
|
+
# Initialize a Beamer presentation project
|
|
202
|
+
article-cli init --title "My Presentation" --authors "Author" --type presentation
|
|
203
|
+
|
|
204
|
+
# Initialize with numpex theme (requires theme files from presentation.template.d)
|
|
205
|
+
article-cli init --title "NumPEx Talk" --authors "Author" --type presentation --theme numpex
|
|
206
|
+
|
|
181
207
|
# Specify custom Zotero group ID
|
|
182
208
|
article-cli init --title "My Article" --authors "Author" --group-id 1234567
|
|
183
209
|
|
|
@@ -189,11 +215,12 @@ article-cli init --title "My Article" --authors "Author" --force
|
|
|
189
215
|
```
|
|
190
216
|
|
|
191
217
|
The `init` command sets up:
|
|
192
|
-
- **GitHub Actions workflow** for automated PDF compilation and releases
|
|
218
|
+
- **GitHub Actions workflow** for automated PDF compilation and releases (with XeLaTeX support for presentations)
|
|
193
219
|
- **pyproject.toml** with dependencies and article-cli configuration
|
|
194
220
|
- **README.md** with comprehensive documentation
|
|
195
221
|
- **.gitignore** with LaTeX-specific patterns
|
|
196
222
|
- **VS Code configuration** for LaTeX Workshop with auto-build and SyncTeX
|
|
223
|
+
- **Font configuration** (for presentation projects using custom themes)
|
|
197
224
|
|
|
198
225
|
### Git Release Management
|
|
199
226
|
|
|
@@ -233,6 +260,12 @@ article-cli compile main.tex
|
|
|
233
260
|
# Compile with pdflatex engine
|
|
234
261
|
article-cli compile --engine pdflatex
|
|
235
262
|
|
|
263
|
+
# Compile with XeLaTeX (for custom fonts)
|
|
264
|
+
article-cli compile --engine xelatex
|
|
265
|
+
|
|
266
|
+
# Compile with LuaLaTeX
|
|
267
|
+
article-cli compile --engine lualatex
|
|
268
|
+
|
|
236
269
|
# Enable shell escape (for code highlighting, etc.)
|
|
237
270
|
article-cli compile --shell-escape
|
|
238
271
|
|
|
@@ -246,6 +279,64 @@ article-cli compile --clean-first --clean-after
|
|
|
246
279
|
article-cli compile --output-dir build/
|
|
247
280
|
```
|
|
248
281
|
|
|
282
|
+
### Font Installation
|
|
283
|
+
|
|
284
|
+
Install fonts for XeLaTeX projects (useful for custom Beamer themes):
|
|
285
|
+
|
|
286
|
+
```bash
|
|
287
|
+
# Install default fonts (Marianne, Roboto Mono) to fonts/ directory
|
|
288
|
+
article-cli install-fonts
|
|
289
|
+
|
|
290
|
+
# Install to a custom directory
|
|
291
|
+
article-cli install-fonts --dir custom-fonts/
|
|
292
|
+
|
|
293
|
+
# Force re-download even if fonts exist
|
|
294
|
+
article-cli install-fonts --force
|
|
295
|
+
|
|
296
|
+
# List installed fonts
|
|
297
|
+
article-cli install-fonts --list
|
|
298
|
+
```
|
|
299
|
+
|
|
300
|
+
**Default fonts:**
|
|
301
|
+
- **Marianne**: French government official font
|
|
302
|
+
- **Roboto Mono**: Google's monospace font for code
|
|
303
|
+
|
|
304
|
+
### Theme Installation
|
|
305
|
+
|
|
306
|
+
Install Beamer themes for presentations:
|
|
307
|
+
|
|
308
|
+
```bash
|
|
309
|
+
# List available themes
|
|
310
|
+
article-cli install-theme --list
|
|
311
|
+
|
|
312
|
+
# Install numpex theme (NumPEx Beamer theme)
|
|
313
|
+
article-cli install-theme numpex
|
|
314
|
+
|
|
315
|
+
# Install to a custom directory
|
|
316
|
+
article-cli install-theme numpex --dir themes/
|
|
317
|
+
|
|
318
|
+
# Force re-download even if theme exists
|
|
319
|
+
article-cli install-theme numpex --force
|
|
320
|
+
|
|
321
|
+
# Install from a custom URL
|
|
322
|
+
article-cli install-theme my-theme --url https://example.com/theme.zip
|
|
323
|
+
```
|
|
324
|
+
|
|
325
|
+
**Available themes:**
|
|
326
|
+
- **numpex**: NumPEx Beamer theme following French government visual identity (requires XeLaTeX and custom fonts)
|
|
327
|
+
|
|
328
|
+
**Complete presentation setup:**
|
|
329
|
+
```bash
|
|
330
|
+
# 1. Install the theme
|
|
331
|
+
article-cli install-theme numpex
|
|
332
|
+
|
|
333
|
+
# 2. Install required fonts
|
|
334
|
+
article-cli install-fonts
|
|
335
|
+
|
|
336
|
+
# 3. Compile with XeLaTeX
|
|
337
|
+
article-cli compile presentation.tex --engine xelatex
|
|
338
|
+
```
|
|
339
|
+
|
|
249
340
|
### Project Setup
|
|
250
341
|
|
|
251
342
|
```bash
|
|
@@ -292,6 +383,22 @@ MIT License - see LICENSE file for details.
|
|
|
292
383
|
|
|
293
384
|
## Changelog
|
|
294
385
|
|
|
386
|
+
### v1.2.0
|
|
387
|
+
- Add font installation command (`install-fonts`) for XeLaTeX projects
|
|
388
|
+
- Support Marianne and Roboto Mono fonts by default
|
|
389
|
+
- Add theme installation command (`install-theme`) for Beamer presentations
|
|
390
|
+
- Built-in support for numpex theme with automatic download
|
|
391
|
+
- Extended GitHub Actions workflow with XeLaTeX and multi-document support
|
|
392
|
+
- Add presentation project type with Beamer template support
|
|
393
|
+
- Add `--engine` option for xelatex and lualatex compilation
|
|
394
|
+
- Improved CI/CD with font installation steps
|
|
395
|
+
|
|
396
|
+
### v1.1.0
|
|
397
|
+
- Add `init` command for repository initialization
|
|
398
|
+
- Add `compile` command with watch mode and multiple engines
|
|
399
|
+
- GitHub Actions workflow generation
|
|
400
|
+
- VS Code configuration generation
|
|
401
|
+
|
|
295
402
|
### v1.0.0
|
|
296
403
|
- Initial release
|
|
297
404
|
- Git release management
|
|
@@ -4,13 +4,15 @@
|
|
|
4
4
|
[](https://badge.fury.io/py/article-cli)
|
|
5
5
|
[](https://pypi.org/project/article-cli/)
|
|
6
6
|
|
|
7
|
-
A command-line tool for managing LaTeX articles with git integration and Zotero bibliography synchronization.
|
|
7
|
+
A command-line tool for managing LaTeX articles and presentations with git integration and Zotero bibliography synchronization.
|
|
8
8
|
|
|
9
9
|
## Features
|
|
10
10
|
|
|
11
|
-
- **Repository Initialization**: Complete setup for LaTeX article projects with one command
|
|
12
|
-
- **
|
|
13
|
-
- **
|
|
11
|
+
- **Repository Initialization**: Complete setup for LaTeX article or presentation projects with one command
|
|
12
|
+
- **Project Types**: Support for articles, Beamer presentations, and posters
|
|
13
|
+
- **LaTeX Compilation**: Compile documents with latexmk/pdflatex/xelatex/lualatex, watch mode, shell escape support
|
|
14
|
+
- **Font Installation**: Download and install fonts for XeLaTeX projects (Marianne, Roboto Mono, etc.)
|
|
15
|
+
- **GitHub Actions Workflows**: Automated PDF compilation with XeLaTeX support, artifact upload, and GitHub releases
|
|
14
16
|
- **Git Release Management**: Create, list, and delete releases with gitinfo2 support
|
|
15
17
|
- **Zotero Integration**: Synchronize bibliography from Zotero with robust pagination and error handling
|
|
16
18
|
- **LaTeX Build Management**: Clean build files and manage LaTeX compilation artifacts
|
|
@@ -113,6 +115,24 @@ default_branch = "main"
|
|
|
113
115
|
|
|
114
116
|
[latex]
|
|
115
117
|
clean_extensions = [".aux", ".bbl", ".blg", ".log", ".out", ".synctex.gz"]
|
|
118
|
+
|
|
119
|
+
[fonts]
|
|
120
|
+
directory = "fonts"
|
|
121
|
+
|
|
122
|
+
[fonts.sources]
|
|
123
|
+
marianne = "https://github.com/ArnaudBelcworking/Marianne/archive/refs/heads/master.zip"
|
|
124
|
+
roboto-mono = "https://github.com/googlefonts/RobotoMono/releases/download/v3.000/RobotoMono-v3.000.zip"
|
|
125
|
+
|
|
126
|
+
[themes]
|
|
127
|
+
directory = "."
|
|
128
|
+
|
|
129
|
+
# Custom theme sources (numpex is built-in)
|
|
130
|
+
# [themes.sources.my-theme]
|
|
131
|
+
# url = "https://example.com/theme.zip"
|
|
132
|
+
# description = "My custom theme"
|
|
133
|
+
# files = ["beamerthememytheme.sty"]
|
|
134
|
+
# requires_fonts = false
|
|
135
|
+
# engine = "pdflatex"
|
|
116
136
|
```
|
|
117
137
|
|
|
118
138
|
## Usage
|
|
@@ -123,6 +143,12 @@ clean_extensions = [".aux", ".bbl", ".blg", ".log", ".out", ".synctex.gz"]
|
|
|
123
143
|
# Initialize a new article repository (auto-detects main .tex file)
|
|
124
144
|
article-cli init --title "My Article Title" --authors "John Doe,Jane Smith"
|
|
125
145
|
|
|
146
|
+
# Initialize a Beamer presentation project
|
|
147
|
+
article-cli init --title "My Presentation" --authors "Author" --type presentation
|
|
148
|
+
|
|
149
|
+
# Initialize with numpex theme (requires theme files from presentation.template.d)
|
|
150
|
+
article-cli init --title "NumPEx Talk" --authors "Author" --type presentation --theme numpex
|
|
151
|
+
|
|
126
152
|
# Specify custom Zotero group ID
|
|
127
153
|
article-cli init --title "My Article" --authors "Author" --group-id 1234567
|
|
128
154
|
|
|
@@ -134,11 +160,12 @@ article-cli init --title "My Article" --authors "Author" --force
|
|
|
134
160
|
```
|
|
135
161
|
|
|
136
162
|
The `init` command sets up:
|
|
137
|
-
- **GitHub Actions workflow** for automated PDF compilation and releases
|
|
163
|
+
- **GitHub Actions workflow** for automated PDF compilation and releases (with XeLaTeX support for presentations)
|
|
138
164
|
- **pyproject.toml** with dependencies and article-cli configuration
|
|
139
165
|
- **README.md** with comprehensive documentation
|
|
140
166
|
- **.gitignore** with LaTeX-specific patterns
|
|
141
167
|
- **VS Code configuration** for LaTeX Workshop with auto-build and SyncTeX
|
|
168
|
+
- **Font configuration** (for presentation projects using custom themes)
|
|
142
169
|
|
|
143
170
|
### Git Release Management
|
|
144
171
|
|
|
@@ -178,6 +205,12 @@ article-cli compile main.tex
|
|
|
178
205
|
# Compile with pdflatex engine
|
|
179
206
|
article-cli compile --engine pdflatex
|
|
180
207
|
|
|
208
|
+
# Compile with XeLaTeX (for custom fonts)
|
|
209
|
+
article-cli compile --engine xelatex
|
|
210
|
+
|
|
211
|
+
# Compile with LuaLaTeX
|
|
212
|
+
article-cli compile --engine lualatex
|
|
213
|
+
|
|
181
214
|
# Enable shell escape (for code highlighting, etc.)
|
|
182
215
|
article-cli compile --shell-escape
|
|
183
216
|
|
|
@@ -191,6 +224,64 @@ article-cli compile --clean-first --clean-after
|
|
|
191
224
|
article-cli compile --output-dir build/
|
|
192
225
|
```
|
|
193
226
|
|
|
227
|
+
### Font Installation
|
|
228
|
+
|
|
229
|
+
Install fonts for XeLaTeX projects (useful for custom Beamer themes):
|
|
230
|
+
|
|
231
|
+
```bash
|
|
232
|
+
# Install default fonts (Marianne, Roboto Mono) to fonts/ directory
|
|
233
|
+
article-cli install-fonts
|
|
234
|
+
|
|
235
|
+
# Install to a custom directory
|
|
236
|
+
article-cli install-fonts --dir custom-fonts/
|
|
237
|
+
|
|
238
|
+
# Force re-download even if fonts exist
|
|
239
|
+
article-cli install-fonts --force
|
|
240
|
+
|
|
241
|
+
# List installed fonts
|
|
242
|
+
article-cli install-fonts --list
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
**Default fonts:**
|
|
246
|
+
- **Marianne**: French government official font
|
|
247
|
+
- **Roboto Mono**: Google's monospace font for code
|
|
248
|
+
|
|
249
|
+
### Theme Installation
|
|
250
|
+
|
|
251
|
+
Install Beamer themes for presentations:
|
|
252
|
+
|
|
253
|
+
```bash
|
|
254
|
+
# List available themes
|
|
255
|
+
article-cli install-theme --list
|
|
256
|
+
|
|
257
|
+
# Install numpex theme (NumPEx Beamer theme)
|
|
258
|
+
article-cli install-theme numpex
|
|
259
|
+
|
|
260
|
+
# Install to a custom directory
|
|
261
|
+
article-cli install-theme numpex --dir themes/
|
|
262
|
+
|
|
263
|
+
# Force re-download even if theme exists
|
|
264
|
+
article-cli install-theme numpex --force
|
|
265
|
+
|
|
266
|
+
# Install from a custom URL
|
|
267
|
+
article-cli install-theme my-theme --url https://example.com/theme.zip
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
**Available themes:**
|
|
271
|
+
- **numpex**: NumPEx Beamer theme following French government visual identity (requires XeLaTeX and custom fonts)
|
|
272
|
+
|
|
273
|
+
**Complete presentation setup:**
|
|
274
|
+
```bash
|
|
275
|
+
# 1. Install the theme
|
|
276
|
+
article-cli install-theme numpex
|
|
277
|
+
|
|
278
|
+
# 2. Install required fonts
|
|
279
|
+
article-cli install-fonts
|
|
280
|
+
|
|
281
|
+
# 3. Compile with XeLaTeX
|
|
282
|
+
article-cli compile presentation.tex --engine xelatex
|
|
283
|
+
```
|
|
284
|
+
|
|
194
285
|
### Project Setup
|
|
195
286
|
|
|
196
287
|
```bash
|
|
@@ -237,6 +328,22 @@ MIT License - see LICENSE file for details.
|
|
|
237
328
|
|
|
238
329
|
## Changelog
|
|
239
330
|
|
|
331
|
+
### v1.2.0
|
|
332
|
+
- Add font installation command (`install-fonts`) for XeLaTeX projects
|
|
333
|
+
- Support Marianne and Roboto Mono fonts by default
|
|
334
|
+
- Add theme installation command (`install-theme`) for Beamer presentations
|
|
335
|
+
- Built-in support for numpex theme with automatic download
|
|
336
|
+
- Extended GitHub Actions workflow with XeLaTeX and multi-document support
|
|
337
|
+
- Add presentation project type with Beamer template support
|
|
338
|
+
- Add `--engine` option for xelatex and lualatex compilation
|
|
339
|
+
- Improved CI/CD with font installation steps
|
|
340
|
+
|
|
341
|
+
### v1.1.0
|
|
342
|
+
- Add `init` command for repository initialization
|
|
343
|
+
- Add `compile` command with watch mode and multiple engines
|
|
344
|
+
- GitHub Actions workflow generation
|
|
345
|
+
- VS Code configuration generation
|
|
346
|
+
|
|
240
347
|
### v1.0.0
|
|
241
348
|
- Initial release
|
|
242
349
|
- Git release management
|
|
@@ -36,6 +36,10 @@ Examples:
|
|
|
36
36
|
%(prog)s delete v1.0.0 # Delete release
|
|
37
37
|
%(prog)s update-bibtex # Update from Zotero
|
|
38
38
|
%(prog)s config create # Create sample config file
|
|
39
|
+
%(prog)s install-fonts # Install fonts for XeLaTeX
|
|
40
|
+
%(prog)s install-fonts --list # List installed fonts
|
|
41
|
+
%(prog)s install-theme numpex # Install numpex Beamer theme
|
|
42
|
+
%(prog)s install-theme --list # List available themes
|
|
39
43
|
|
|
40
44
|
Environment variables:
|
|
41
45
|
ZOTERO_API_KEY : Your Zotero API key (required for update-bibtex)
|
|
@@ -76,6 +80,23 @@ Environment variables:
|
|
|
76
80
|
action="store_true",
|
|
77
81
|
help="Overwrite existing files",
|
|
78
82
|
)
|
|
83
|
+
init_parser.add_argument(
|
|
84
|
+
"--type",
|
|
85
|
+
choices=["article", "presentation", "poster"],
|
|
86
|
+
default="article",
|
|
87
|
+
help="Project type (default: article). Use 'presentation' for Beamer slides.",
|
|
88
|
+
)
|
|
89
|
+
init_parser.add_argument(
|
|
90
|
+
"--theme",
|
|
91
|
+
default="",
|
|
92
|
+
help="Beamer theme for presentations (e.g., 'numpex', 'metropolis').",
|
|
93
|
+
)
|
|
94
|
+
init_parser.add_argument(
|
|
95
|
+
"--aspect-ratio",
|
|
96
|
+
choices=["169", "43", "1610"],
|
|
97
|
+
default="169",
|
|
98
|
+
help="Aspect ratio for presentations (default: 169 for 16:9).",
|
|
99
|
+
)
|
|
79
100
|
|
|
80
101
|
# Setup command
|
|
81
102
|
subparsers.add_parser("setup", help="Setup git hooks for gitinfo2")
|
|
@@ -94,9 +115,9 @@ Environment variables:
|
|
|
94
115
|
)
|
|
95
116
|
compile_parser.add_argument(
|
|
96
117
|
"--engine",
|
|
97
|
-
choices=["latexmk", "pdflatex"],
|
|
118
|
+
choices=["latexmk", "pdflatex", "xelatex", "lualatex"],
|
|
98
119
|
default="latexmk",
|
|
99
|
-
help="LaTeX engine to use (default: latexmk)",
|
|
120
|
+
help="LaTeX engine to use (default: latexmk). Use xelatex/lualatex for custom fonts.",
|
|
100
121
|
)
|
|
101
122
|
compile_parser.add_argument(
|
|
102
123
|
"--shell-escape",
|
|
@@ -167,6 +188,57 @@ Environment variables:
|
|
|
167
188
|
|
|
168
189
|
config_subparsers.add_parser("show", help="Show current configuration")
|
|
169
190
|
|
|
191
|
+
# Install-fonts command
|
|
192
|
+
fonts_parser = subparsers.add_parser(
|
|
193
|
+
"install-fonts", help="Download and install fonts for XeLaTeX projects"
|
|
194
|
+
)
|
|
195
|
+
fonts_parser.add_argument(
|
|
196
|
+
"--dir",
|
|
197
|
+
type=Path,
|
|
198
|
+
help="Directory to install fonts (default: fonts/)",
|
|
199
|
+
)
|
|
200
|
+
fonts_parser.add_argument(
|
|
201
|
+
"--force",
|
|
202
|
+
action="store_true",
|
|
203
|
+
help="Re-download fonts even if already installed",
|
|
204
|
+
)
|
|
205
|
+
fonts_parser.add_argument(
|
|
206
|
+
"--list",
|
|
207
|
+
action="store_true",
|
|
208
|
+
dest="list_fonts",
|
|
209
|
+
help="List installed fonts instead of installing",
|
|
210
|
+
)
|
|
211
|
+
|
|
212
|
+
# Install-theme command
|
|
213
|
+
theme_parser = subparsers.add_parser(
|
|
214
|
+
"install-theme", help="Download and install Beamer themes for presentations"
|
|
215
|
+
)
|
|
216
|
+
theme_parser.add_argument(
|
|
217
|
+
"theme_name",
|
|
218
|
+
nargs="?",
|
|
219
|
+
help="Name of theme to install (e.g., 'numpex')",
|
|
220
|
+
)
|
|
221
|
+
theme_parser.add_argument(
|
|
222
|
+
"--dir",
|
|
223
|
+
type=Path,
|
|
224
|
+
help="Directory to install theme (default: current directory)",
|
|
225
|
+
)
|
|
226
|
+
theme_parser.add_argument(
|
|
227
|
+
"--force",
|
|
228
|
+
action="store_true",
|
|
229
|
+
help="Re-download theme even if already installed",
|
|
230
|
+
)
|
|
231
|
+
theme_parser.add_argument(
|
|
232
|
+
"--list",
|
|
233
|
+
action="store_true",
|
|
234
|
+
dest="list_themes",
|
|
235
|
+
help="List available themes instead of installing",
|
|
236
|
+
)
|
|
237
|
+
theme_parser.add_argument(
|
|
238
|
+
"--url",
|
|
239
|
+
help="Custom URL to download theme from (use with theme_name)",
|
|
240
|
+
)
|
|
241
|
+
|
|
170
242
|
return parser
|
|
171
243
|
|
|
172
244
|
|
|
@@ -185,6 +257,9 @@ def handle_init_command(args: argparse.Namespace, config: Config) -> int:
|
|
|
185
257
|
group_id=args.group_id,
|
|
186
258
|
force=args.force,
|
|
187
259
|
main_tex_file=args.tex_file,
|
|
260
|
+
project_type=args.type,
|
|
261
|
+
theme=args.theme,
|
|
262
|
+
aspect_ratio=args.aspect_ratio,
|
|
188
263
|
)
|
|
189
264
|
else 1
|
|
190
265
|
)
|
|
@@ -413,6 +488,108 @@ def handle_config_command(args: argparse.Namespace, config: Config) -> int:
|
|
|
413
488
|
return 1
|
|
414
489
|
|
|
415
490
|
|
|
491
|
+
def handle_install_fonts_command(args: argparse.Namespace, config: Config) -> int:
|
|
492
|
+
"""Handle the install-fonts command"""
|
|
493
|
+
try:
|
|
494
|
+
from .fonts import FontInstaller, install_fonts_from_config
|
|
495
|
+
|
|
496
|
+
fonts_config = config.get_fonts_config()
|
|
497
|
+
|
|
498
|
+
# Override directory if specified on command line
|
|
499
|
+
fonts_dir = (
|
|
500
|
+
args.dir if args.dir else Path(fonts_config.get("directory", "fonts"))
|
|
501
|
+
)
|
|
502
|
+
|
|
503
|
+
# List installed fonts if requested
|
|
504
|
+
if args.list_fonts:
|
|
505
|
+
installer = FontInstaller(fonts_dir=fonts_dir)
|
|
506
|
+
installed = installer.list_installed()
|
|
507
|
+
|
|
508
|
+
if not installed:
|
|
509
|
+
print_info(f"No fonts installed in {fonts_dir}")
|
|
510
|
+
return 0
|
|
511
|
+
|
|
512
|
+
print_info(f"Installed fonts in {fonts_dir}:")
|
|
513
|
+
for font_name in installed:
|
|
514
|
+
font_files = installer.get_font_files(font_name)
|
|
515
|
+
print(f" - {font_name} ({len(font_files)} font files)")
|
|
516
|
+
|
|
517
|
+
return 0
|
|
518
|
+
|
|
519
|
+
# Install fonts
|
|
520
|
+
sources = fonts_config.get("sources", [])
|
|
521
|
+
installer = FontInstaller(fonts_dir=fonts_dir, sources=sources)
|
|
522
|
+
|
|
523
|
+
success = installer.install_all(force=args.force)
|
|
524
|
+
return 0 if success else 1
|
|
525
|
+
|
|
526
|
+
except Exception as e:
|
|
527
|
+
print_error(f"Font installation failed: {e}")
|
|
528
|
+
return 1
|
|
529
|
+
|
|
530
|
+
|
|
531
|
+
def handle_install_theme_command(args: argparse.Namespace, config: Config) -> int:
|
|
532
|
+
"""Handle the install-theme command"""
|
|
533
|
+
try:
|
|
534
|
+
from .themes import ThemeInstaller
|
|
535
|
+
|
|
536
|
+
themes_config = config.get_themes_config()
|
|
537
|
+
|
|
538
|
+
# Override directory if specified on command line
|
|
539
|
+
themes_dir = args.dir if args.dir else Path(themes_config.get("directory", "."))
|
|
540
|
+
|
|
541
|
+
# Get configured sources
|
|
542
|
+
sources = themes_config.get("sources", {})
|
|
543
|
+
|
|
544
|
+
installer = ThemeInstaller(themes_dir=themes_dir, sources=sources)
|
|
545
|
+
|
|
546
|
+
# List available themes if requested
|
|
547
|
+
if args.list_themes:
|
|
548
|
+
available = installer.list_available()
|
|
549
|
+
installed = installer.list_installed()
|
|
550
|
+
|
|
551
|
+
print_info("Available themes:")
|
|
552
|
+
for theme in available:
|
|
553
|
+
name = theme["name"]
|
|
554
|
+
desc = theme.get("description", "")
|
|
555
|
+
engine = theme.get("engine", "pdflatex")
|
|
556
|
+
fonts = (
|
|
557
|
+
" (requires custom fonts)" if theme.get("requires_fonts") else ""
|
|
558
|
+
)
|
|
559
|
+
installed_marker = (
|
|
560
|
+
" [installed]" if any(i["name"] == name for i in installed) else ""
|
|
561
|
+
)
|
|
562
|
+
print(f" - {name}: {desc}")
|
|
563
|
+
print(f" Engine: {engine}{fonts}{installed_marker}")
|
|
564
|
+
|
|
565
|
+
return 0
|
|
566
|
+
|
|
567
|
+
# Theme name is required for installation
|
|
568
|
+
if not args.theme_name:
|
|
569
|
+
print_error("Theme name is required. Use --list to see available themes.")
|
|
570
|
+
return 1
|
|
571
|
+
|
|
572
|
+
# Install from custom URL if provided
|
|
573
|
+
if args.url:
|
|
574
|
+
success = installer.install_from_url(
|
|
575
|
+
name=args.theme_name,
|
|
576
|
+
url=args.url,
|
|
577
|
+
force=args.force,
|
|
578
|
+
)
|
|
579
|
+
else:
|
|
580
|
+
# Install from known sources
|
|
581
|
+
success = installer.install_theme(
|
|
582
|
+
name=args.theme_name,
|
|
583
|
+
force=args.force,
|
|
584
|
+
)
|
|
585
|
+
|
|
586
|
+
return 0 if success else 1
|
|
587
|
+
|
|
588
|
+
except Exception as e:
|
|
589
|
+
print_error(f"Theme installation failed: {e}")
|
|
590
|
+
return 1
|
|
591
|
+
|
|
592
|
+
|
|
416
593
|
def main(argv: Optional[list] = None) -> int:
|
|
417
594
|
"""
|
|
418
595
|
Main entry point for article-cli
|
|
@@ -466,6 +643,12 @@ def main(argv: Optional[list] = None) -> int:
|
|
|
466
643
|
elif args.command == "config":
|
|
467
644
|
return handle_config_command(args, config)
|
|
468
645
|
|
|
646
|
+
elif args.command == "install-fonts":
|
|
647
|
+
return handle_install_fonts_command(args, config)
|
|
648
|
+
|
|
649
|
+
elif args.command == "install-theme":
|
|
650
|
+
return handle_install_theme_command(args, config)
|
|
651
|
+
|
|
469
652
|
else:
|
|
470
653
|
print_error(f"Unknown command: {args.command}")
|
|
471
654
|
return 1
|