#!/usr/bin/env python3 """Typeset mathematical content with LaTeX, publish vector pages with ReportLab.""" import argparse import subprocess from pathlib import Path from pdfrw import PdfReader from pdfrw.buildxobj import pagexobj from pdfrw.toreportlab import makerl from reportlab.pdfgen import canvas from reportlab.lib.colors import HexColor def main(): parser = argparse.ArgumentParser() parser.add_argument("source", type=Path) parser.add_argument("output", type=Path) parser.add_argument("--build-dir", type=Path, required=True) args = parser.parse_args() source = args.source.resolve() build = args.build_dir.resolve() build.mkdir(parents=True, exist_ok=True) args.output.parent.mkdir(parents=True, exist_ok=True) for _ in range(2): result = subprocess.run( ["pdflatex", "-interaction=nonstopmode", "-halt-on-error", "-output-directory", str(build), str(source)], capture_output=True, text=True, ) (build / "pdflatex_console.log").write_text(result.stdout + result.stderr) if result.returncode: raise RuntimeError(f"LaTeX failed; see {build / 'pdflatex_console.log'}") source_pdf = build / (source.stem + ".pdf") reader = PdfReader(str(source_pdf)) publisher = canvas.Canvas(str(args.output), pageCompression=1) publisher.setTitle("Localized realization of prescribed incompressible affine motion") publisher.setAuthor("") publisher.setSubject("Complete proof supplement for OMEGA Paper VIII") publisher.setCreator("LaTeX mathematical typesetting; ReportLab PDF composition") for index, page in enumerate(reader.pages, 1): form = pagexobj(page) x0, y0, x1, y1 = map(float, page.MediaBox) width, height = x1 - x0, y1 - y0 publisher.setPageSize((width, height)) publisher.saveState() publisher.translate(-x0, -y0) publisher.doForm(makerl(publisher, form)) publisher.restoreState() publisher.setStrokeColor(HexColor("#CFD8DD")) publisher.setLineWidth(0.45) publisher.line(76.5, 43, width - 76.5, 43) publisher.setFont("Helvetica", 8) publisher.setFillColor(HexColor("#536874")) publisher.drawString(76.5, 30, "OMEGA Paper VIII | Complete proof supplement") publisher.drawRightString(width - 76.5, 30, f"{index} / {len(reader.pages)}") publisher.showPage() publisher.save() print(f"Created {args.output.resolve()} ({len(reader.pages)} pages)") if __name__ == "__main__": main()