Run LaTeX compilation directly in your browser using WebAssembly. Supports XeLaTeX, PdfLaTeX, and LuaLaTeX with BibTeX integration.
- XeLaTeX: Compile with XeTeX engine + bibtex8 + dvipdfmx
- PdfLaTeX: Compile with PdfTeX engine + bibtex8
- LuaLaTeX: Compile with LuaHBTeX engine + bibtex8
- Multi-file Support: Handle complex projects with multiple .tex and .bib files
- SyncTeX: Generate SyncTeX files for editor synchronization
- Browser-based: All compilation runs entirely in the browser with no server required
- Web Worker Support: Non-blocking compilation using Web Workers
npm install texlyre-busytexBusyTeX requires WASM files (~175MB) that are hosted on GitHub Releases:
# Download to default location (./public/core)
npx texlyre-busytex download-assets
# Or specify custom location
npx texlyre-busytex download-assets ./static/wasm
npx texlyre-busytex download-assets ./public/assetsAssets will be downloaded to <destination>/busytex/ directory.
import { BusyTexRunner, XeLatex } from 'texlyre-busytex';
const runner = new BusyTexRunner({
busytexBasePath: '/core/busytex'
});
await runner.initialize();
const xelatex = new XeLatex(runner);
const result = await xelatex.compile({
input: `\\documentclass{article}
\\usepackage{amsmath}
\\begin{document}
\\section{Introduction}
Hello, LaTeX!
\\begin{equation}
E = mc^2
\\end{equation}
\\end{document}`
});
if (result.success && result.pdf) {
const blob = new Blob([result.pdf], { type: 'application/pdf' });
const url = URL.createObjectURL(blob);
window.open(url);
}const result = await xelatex.compile({
input: `\\documentclass{article}
\\begin{document}
\\cite{sample2023}
\\bibliographystyle{plain}
\\bibliography{references}
\\end{document}`,
bibtex: true,
additionalFiles: [
{
path: 'references.bib',
content: `@article{sample2023,
title={Sample Article},
author={Author, John},
year={2023}
}`
}
]
});const result = await xelatex.compile({
input: `\\documentclass{article}
\\begin{document}
\\input{chapter1.tex}
\\input{chapter2.tex}
\\end{document}`,
additionalFiles: [
{
path: 'chapter1.tex',
content: '\\section{Chapter 1}\nContent...'
},
{
path: 'chapter2.tex',
content: '\\section{Chapter 2}\nContent...'
}
]
});import { PdfLatex, LuaLatex } from 'texlyre-busytex';
const pdflatex = new PdfLatex(runner);
const result = await pdflatex.compile({ input: '...' });
const lualatex = new LuaLatex(runner);
const result2 = await lualatex.compile({ input: '...' });const runner = new BusyTexRunner({
busytexBasePath: '/core/busytex',
verbose: true
});
await runner.initialize(true); // true = use Web Workerconst result = await xelatex.compile({ input: '...' });
if (result.synctex) {
const blob = new Blob([result.synctex], { type: 'application/gzip' });
const url = URL.createObjectURL(blob);
const link = document.createElement('a');
link.href = url;
link.download = 'main.synctex.gz';
link.click();
}constructor(config?: BusyTexConfig)Config Options:
busytexBasePath: Path to BusyTeX assets (default:'/core/busytex')verbose: Enable verbose logging (default:false)
Methods:
initialize(useWorker?: boolean): Promise<void>- Initialize the runnerisInitialized(): boolean- Check if initializedterminate(): void- Clean up resources
constructor(runner: BusyTexRunner, verbose?: boolean)
compile(options: CompileOptions): Promise<CompileResult>CompileOptions:
input: Main LaTeX document contentbibtex?: Enable BibTeX compilation (default:false)verbose?: Verbosity level -'silent','info', or'debug'(default:'silent')additionalFiles?: Array of{ path: string, content: string | Uint8Array }
CompileResult:
success: Compilation succeededpdf?: PDF output as Uint8Arraysynctex?: SyncTeX output as Uint8Arraylog: Compilation logexitCode: Process exit codelogs: Detailed log entries
git clone https://github.com/TeXlyre/texlyre-busytex.git
cd texlyre-busytex
npm install
npm run download-assets
npm run buildnpm run exampleThen open http://localhost:3000
# Create archive and upload to GitHub Releases
npm run upload-assetsContributions are welcome! Please feel free to submit a Pull Request.
- Fork the repository
- Create your feature branch (
git checkout -b feature/amazing-feature) - Download assets:
npm run download-assets - Make your changes
- Build:
npm run build - Test with example:
npm run example - Commit your changes (
git commit -m 'Add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
This is an experimental build of TeXLive 2025 with the intent of integration into TeXlyre. Sustained work on this package is not guaranteed and major changes may be introduced at any time.
Besides bibtex8, pdftex, luatex, xetex, dvipdf, other packages are not included. Additionally, some fonts, as well as external scripts called through shell-escape are not available.
MIT License © Fares Abawi
This project uses BusyTeX WASM, which is also licensed under the MIT license.
Built with BusyTeX - A WebAssembly port of TeX Live.