Sphinx extension for Typst output
Project description
typsphinx
Sphinx extension for Typst output format support.
Overview
typsphinx is a Sphinx extension that enables generating Typst documents from reStructuredText sources. Typst is a modern typesetting system designed as an alternative to LaTeX, offering faster compilation and a more intuitive syntax.
Features
- Convert Sphinx documentation to Typst format: Seamlessly transform your reStructuredText/Markdown documents
- Standard docutils nodes: Full support for paragraphs, sections, lists, tables, admonitions, and more
- Mathematical expressions:
- LaTeX syntax via mitex (
@preview/mitex:0.2.4) - Native Typst math syntax
- LaTeX syntax via mitex (
- Code blocks with syntax highlighting: Using codly package (
@preview/codly:1.3.0)- Automatic line numbering
- Syntax highlighting for multiple languages
- Highlight specific lines
- Images and figures: Embed images with captions and references
- Cross-references and citations: Maintain document structure with internal links
- Customizable templates: Use default or custom Typst templates
- Direct PDF generation: Self-contained PDF generation via typst-py (no external Typst CLI required)
- Multi-document support: Generate multiple Typst files with toctree integration using
#include()
Requirements
- Python 3.9 or higher
- Sphinx 5.0 or higher
- typst-py 0.11.1 or higher
Installation
From PyPI (Beta Release)
pip install typsphinx
Using uv (recommended for development)
# Clone the repository
git clone https://github.com/YuSabo90002/typsphinx.git
cd typsphinx
# Install dependencies with uv
uv sync
# For development dependencies
uv sync --extra dev
Quick Start
Basic Configuration
Configure Typst output in your conf.py:
# conf.py
# Note: typsphinx is auto-discovered via entry points.
# Adding to extensions list is optional but recommended for clarity.
# extensions = ['typsphinx']
# Optional: Configure Typst builder
typst_use_mitex = True # Use mitex for LaTeX math (default: True)
Build Typst Output
# Generate Typst files
sphinx-build -b typst source build/typst
# Generate PDF directly
sphinx-build -b typstpdf source build/pdf
Example Document
Create a simple reStructuredText document:
==============
My Document
==============
This is a paragraph with **bold** and *italic* text.
Math Example
============
Inline math: :math:`E = mc^2`
Block math:
.. math::
\int_{-\infty}^{\infty} e^{-x^2} dx = \sqrt{\pi}
Code Example
============
.. code-block:: python
def hello_world():
print("Hello, Typst!")
This will generate a Typst file with:
- Proper heading hierarchy
- Formatted text with emphasis
- LaTeX math via mitex (or native Typst math)
- Syntax-highlighted code blocks with codly
Advanced Usage
Custom Templates
Create a custom Typst template:
# conf.py
typst_template = '_templates/custom.typ'
typst_elements = {
'papersize': 'a4',
'fontsize': '11pt',
'lang': 'ja',
}
Template Parameter Mapping
Map Sphinx metadata to template parameters:
# conf.py
typst_template_mapping = {
'title': 'project',
'authors': ['author'],
'date': 'release',
}
Multi-Document Projects
Use toctree to combine multiple documents:
.. toctree::
:maxdepth: 2
:numbered:
intro
chapter1
chapter2
This generates #include() directives in Typst with proper heading level adjustments.
Working with Third-Party Extensions
typsphinx integrates with Sphinx's standard extension mechanism. For custom nodes from third-party extensions (e.g., sphinxcontrib-mermaid), you can register Typst handlers in your conf.py:
# conf.py
def setup(app):
# Example: Support sphinxcontrib-mermaid diagrams
if 'sphinxcontrib.mermaid' in app.config.extensions:
from sphinxcontrib.mermaid import mermaid
from docutils import nodes
def typst_visit_mermaid(self, node):
"""Render Mermaid diagram as image in Typst output"""
# Export diagram as SVG and include in Typst
diagram_path = f"diagrams/{node['name']}.svg"
self.add_text(f'#image("{diagram_path}")\n\n')
raise nodes.SkipNode
# Register with Sphinx's standard API
app.add_node(mermaid, typst=(typst_visit_mermaid, None))
How it works:
- typsphinx uses Sphinx's standard
app.add_node()API (no custom registry needed) - Unknown nodes trigger
unknown_visit()which logs a warning and extracts text content - Users can add Typst support for any extension by registering handlers in
conf.py
For more details, see the Sphinx Extension API documentation.
Configuration Options
See docs/configuration.rst for all available configuration options:
typst_use_mitex: Enable/disable mitex for LaTeX mathtypst_template: Custom template pathtypst_elements: Template parameters (paper size, fonts, etc.)typst_template_mapping: Sphinx metadata to template parameter mappingtypst_toctree_defaults: Default toctree options
Development
This project uses uv for fast package management and follows TDD (Test-Driven Development) practices.
Setup Development Environment
# Install with development dependencies
uv sync --extra dev
# Run tests (286 tests, 93% coverage)
uv run pytest
# Run tests with coverage report
uv run pytest --cov=typsphinx --cov-report=html
# Run tests across multiple Python versions
uv run tox
# Run linters
uv run black .
uv run ruff check .
uv run mypy sphinxcontrib/
Testing Strategy
- Unit tests: 286 tests covering all major components
- Integration tests: Full build process validation
- Example projects:
examples/basic/andexamples/advanced/ - Code coverage: 93% overall
Project Structure
typsphinx/
├── sphinxcontrib/typst/ # Main package
│ ├── builder.py # Typst builder
│ ├── writer.py # Doctree writer
│ ├── translator.py # Node translator
│ ├── template_engine.py # Template processor
│ ├── pdf.py # PDF generation
│ └── templates/ # Default templates
├── tests/ # Test suite
├── docs/ # Documentation
├── examples/ # Example projects
└── pyproject.toml # Project configuration
Known Limitations (v0.2.0)
- Bibliography: BibTeX integration not yet supported
- Glossary: Glossary generation not yet supported
See full requirements verification in project documentation.
Documentation
Contributing
Contributions are welcome! Please:
- Fork the repository
- Create a feature branch
- Write tests for new features
- Ensure all tests pass:
uv run pytest - Submit a pull request
Development Guidelines
- Follow TDD (Test-Driven Development)
- Maintain 80%+ code coverage
- Use black for code formatting
- Follow Sphinx extension conventions
- Add tests for all new features
License
MIT License - see LICENSE file for details.
Acknowledgments
- Built on top of Sphinx
- Uses Typst for typesetting
- Integrates mitex for LaTeX math
- Uses codly for code highlighting
- Uses gentle-clues for admonitions
- Developed with Claude Code and Kiro-style Spec-Driven Development
Version History
See CHANGELOG.md for detailed version history.
Status: Stable (v0.2.2) - Production ready Python: 3.9+ | Sphinx: 5.0+ | Typst: 0.11.1+
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file typsphinx-0.3.0.tar.gz.
File metadata
- Download URL: typsphinx-0.3.0.tar.gz
- Upload date:
- Size: 72.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
fa844d237f19cc53a74db2b43ce6424e2bcc0d90698c4ea1743718b86e47bf39
|
|
| MD5 |
135f6053d277d1bbba206f8a565c730a
|
|
| BLAKE2b-256 |
b1ad5c75d1b51824c967d460cd9537e6c4bcc13c17d9a28ae1c2428e3c1b5ced
|
File details
Details for the file typsphinx-0.3.0-py3-none-any.whl.
File metadata
- Download URL: typsphinx-0.3.0-py3-none-any.whl
- Upload date:
- Size: 28.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5a409e7d833902bb47e3ac9de281fab5fa88408795d0fe05044b0650f8854e08
|
|
| MD5 |
d043801ec0a0af607465c676a33131b0
|
|
| BLAKE2b-256 |
7448ec4c951fae550f3b632a8cbf122415e32ddeece7e155b431319ede8cf774
|