Skip to content

API Reference

The full public surface of @nandan-varma/platex. For guided explanations, see Compiling LaTeX; for the CLI, see the CLI reference; for the service, the HTTP API.

Export Entry points Description
compile(source, options?) Node Compile LaTeX; the core function
createPlatexClient(config?) Node, /client Build a reusable client with baked-in defaults
handleCompileRequest(request, options?) Node, /client Request → Response handler
createRequestHandler(client, options?) Node, /client Bind a handler to a specific client
createApp(config?) /server Hono app factory for the HTTP service
createCompileRoute(config?) /server Just the POST /compile route

All types below are exported too (CompileOptions, CompileResult, CompileLimits, PlatexClient, PlatexClientConfig, LatexError, LatexWarning, RawPassLog, Engine, BibEngine, PassCount, WarningCode).

function compile(source: string, options?: CompileOptions): Promise<CompileResult>;

source is the main.tex content. Resolves to a CompileResult. Compiles remotely when a serviceUrl resolves, otherwise locally (Node entry only).

Accepted per-call by compile(), and (minus files/signal) as defaults by createPlatexClient.

Option Type Default Description
engine 'pdflatex' | 'xelatex' | 'lualatex' 'pdflatex' TeX engine for local system-TeX compiles; Tectonic is always XeTeX-based
passes 'auto' | 1 | 2 | 3 'auto' 'auto' reruns until output is stable
bibliography 'bibtex' | 'biber' | 'none' 'bibtex' Bibliography engine
files Record<string, Buffer> {} Additional files: .bib, images, included .tex files
serviceUrl string PLATEX_SERVICE_URL URL of the platex service. If unset, compiles locally
apiKey string PLATEX_API_KEY Sent as Authorization: Bearer <apiKey> to the service
headers Record<string, string> {} Extra headers merged into the remote request
timeout number 30000 Overall wall-clock budget (ms) for the entire pipeline — not per-process
limits CompileLimits see below Input-size ceilings for this call
retry number 0 Extra attempts on retryable remote failures (network, timeout, 5xx). Never on 4xx or abort
fetch typeof fetch global fetch Custom fetch implementation for the remote path
signal AbortSignal — Cancel an in-flight compile
interface CompileLimits {
maxSourceBytes?: number; // default 5_000_000 — max source, UTF-8 bytes
maxFilesCount?: number; // default 50 — max entries in `files`
maxTotalFilesBytes?: number; // default 25_000_000 — combined decoded size of all files
}

Only meaningful for local compilation and the server’s own enforcement. A remote client cannot raise the server’s limits by passing these; see Server configuration.

function createPlatexClient(config?: PlatexClientConfig): PlatexClient;
interface PlatexClient {
compile(source: string, options?: CompileOptions): Promise<CompileResult>;
health(): Promise<boolean>; // pings GET <serviceUrl>/health; true immediately if no serviceUrl
}

config accepts everything in CompileOptions except files and signal. Returns plain functions — destructuring works, no this binding required.

function handleCompileRequest(
request: Request,
options?: CompileOptions & { responseFormat?: 'pdf' | 'json' },
): Promise<Response>;

Parses the JSON body, calls compile(), returns a Response.

responseFormat Success Failure
'pdf' (default) 200, raw PDF bytes (application/pdf) 422, JSON { errors, warnings }
'json' 200, { pdf: base64 | null, errors, warnings } 200, { pdf: null, errors, warnings }

Other statuses: 400 for bad input, 502 if the remote service is unreachable.

Request body: { source: string, engine?, passes?, bibliography?, files?: Record<string, base64>, timeout? } — only source is required.

createRequestHandler(client, options?) binds the same behavior to a specific PlatexClient.

interface CompileResult {
pdf: Buffer | null; // null on fatal compile error
errors: LatexError[]; // structured errors with file + line number
warnings: LatexWarning[]; // overfull boxes, undefined refs, etc.
logs: RawPassLog[]; // per-pass raw .log content for debugging
}
interface LatexError {
type: 'error';
file: string | null;
line: number | null;
message: string;
context: string | null; // surrounding lines from the TeX log
source: 'latex' | 'bibtex' | 'biber';
}
interface LatexWarning {
type: 'warning';
code: WarningCode;
file: string | null;
line: number | null;
message: string;
}
type WarningCode =
| 'overfull-hbox' | 'underfull-hbox'
| 'overfull-vbox' | 'underfull-vbox'
| 'undefined-reference' | 'undefined-citation'
| 'multiply-defined-label'
| 'font-warning' | 'package-warning' | 'other';
interface RawPassLog {
passNumber: number;
engine: Engine | 'bibtex' | 'biber';
stdout: string;
stderr: string;
log: string; // raw .log content
exitCode: number;
timedOut: boolean; // true if this pass was killed for exceeding its time budget
}
type Engine = 'pdflatex' | 'xelatex' | 'lualatex' | 'tectonic';
type BibEngine = 'bibtex' | 'biber' | 'none';
type PassCount = 'auto' | 1 | 2 | 3;

The @nandan-varma/platex/server entry point exports createApp(config?) and createCompileRoute(config?). Their config (apiKey, maxConcurrentCompiles, limits, maxRequestBodyBytes) is documented on Server configuration.

files keys become filenames inside the compilation sandbox — use this for .bib files, images, or any \input-ed sub-document.

import { readFile } from 'node:fs/promises';
import { compile } from '@nandan-varma/platex';
const result = await compile(source, {
bibliography: 'bibtex',
files: {
'refs.bib': await readFile('refs.bib'),
'figures/logo.png': await readFile('logo.png'),
},
serviceUrl: process.env.PLATEX_SERVICE_URL,
});