article-cli 1.2.0__tar.gz → 1.3.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: article-cli
3
- Version: 1.2.0
3
+ Version: 1.3.1
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
  [![PyPI version](https://badge.fury.io/py/article-cli.svg)](https://badge.fury.io/py/article-cli)
60
60
  [![Python Support](https://img.shields.io/pypi/pyversions/article-cli.svg)](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
- - **LaTeX Compilation**: Compile documents with latexmk/pdflatex, watch mode, shell escape support
68
- - **GitHub Actions Workflows**: Automated PDF compilation, artifact upload, and GitHub releases
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
  [![PyPI version](https://badge.fury.io/py/article-cli.svg)](https://badge.fury.io/py/article-cli)
5
5
  [![Python Support](https://img.shields.io/pypi/pyversions/article-cli.svg)](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
- - **LaTeX Compilation**: Compile documents with latexmk/pdflatex, watch mode, shell escape support
13
- - **GitHub Actions Workflows**: Automated PDF compilation, artifact upload, and GitHub releases
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
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "article-cli"
7
- version = "1.2.0"
7
+ version = "1.3.1"
8
8
  authors = [
9
9
  {name = "Christophe Prud'homme", email = "prudhomm@cemosis.fr"},
10
10
  ]
@@ -8,7 +8,7 @@ This package provides tools for:
8
8
  - Git hooks setup
9
9
  """
10
10
 
11
- __version__ = "1.2.0"
11
+ __version__ = "1.3.1"
12
12
  __author__ = "Christophe Prud'homme"
13
13
  __email__ = "prudhomm@cemosis.fr"
14
14
 
@@ -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