Automatic Package Installation¶
The killer feature of jettex is automatic detection and installation of missing LaTeX packages - just like R's tinytex.
How It Works¶
When you use compile_tex(), jettex:
- Attempts compilation - Runs the LaTeX engine on your document
- Parses errors - If compilation fails, parses the log file for missing packages
- Finds packages - Uses tlmgr to find which packages provide the missing files
- Installs packages - Automatically installs the required packages
- Retries compilation - Tries again (up to 3 times by default)
import jettex
# This will automatically install any missing packages
result = jettex.compile_tex("complex_document.tex")
if result.success:
print(f"PDF created: {result.output_file}")
Using compile_tex¶
The compile_tex() function is the main interface for auto-install:
result = jettex.compile_tex(
"document.tex",
engine="pdflatex", # Engine: pdflatex, xelatex, lualatex
max_attempts=3, # Max compilation attempts
output_dir=None, # Output directory
quiet=False, # Suppress progress output
)
Engine Selection¶
# Use pdflatex (default)
result = jettex.compile_tex("document.tex", engine="pdflatex")
# Use xelatex for Unicode/OpenType fonts
result = jettex.compile_tex("document.tex", engine="xelatex")
# Use lualatex for Lua scripting
result = jettex.compile_tex("document.tex", engine="lualatex")
Controlling Attempts¶
# Try more times for documents with many missing packages
result = jettex.compile_tex("document.tex", max_attempts=5)
# Only try once (fail if any packages are missing)
result = jettex.compile_tex("document.tex", max_attempts=1)
Quiet Mode¶
Error Detection¶
jettex detects various types of missing file errors:
Missing Style Files (.sty)¶
Missing Class Files (.cls)¶
Missing Fonts¶
Missing Files¶
Manual Package Detection¶
You can also use the package detection functions directly:
Parse Log Files¶
from jettex import parse_log_file
# Parse a log file for missing files
missing_files = parse_log_file("document.log")
print(f"Missing files: {missing_files}")
Find Packages for Files¶
from jettex import find_packages_for_files, PackageInfo
# Find packages that provide the missing files
package_info = find_packages_for_files(["geometry.sty", "hyperref.sty"])
for info in package_info:
print(f"{info.filename} -> {info.package}")
Install Missing Packages¶
from jettex import install_missing_packages
# Install the packages
installed = install_missing_packages(package_info)
print(f"Installed: {installed}")
Comparison with Standard Compilation¶
| Function | Auto-Install | Use Case |
|---|---|---|
compile_tex() |
Yes | General use, unknown packages |
pdflatex() |
No | When you know all packages are installed |
xelatex() |
No | Direct xelatex without auto-install |
lualatex() |
No | Direct lualatex without auto-install |
Example: Complex Document¶
Here's a complete example with a document that uses many packages:
import jettex
# Ensure TinyTeX is installed
if not jettex.is_tinytex_installed():
jettex.install_tinytex()
# Compile with auto-install
result = jettex.compile_tex(
"thesis.tex",
engine="xelatex",
max_attempts=5,
quiet=False,
)
if result.success:
print(f"Thesis compiled successfully!")
print(f"Output: {result.output_file}")
else:
print("Compilation failed after all attempts")
print(f"Check log: {result.log_file}")
Limitations¶
- Network required - Package installation requires internet access
- CTAN packages only - Only packages available in TeX Live can be auto-installed
- Some errors not detectable - Complex errors may not be parsed correctly
- Compilation time - First compilation may be slower due to package downloads
CLI Usage¶
From the command line, auto-install is enabled by default: