De LaTeX-editor toont je code en de gezette pagina's naast elkaar. Wat je typt, verschijnt meteen op de pagina's - koppen, lijsten, tabellen, formules, voetnoten en verwijzingen - en een klik op een tekst in het voorbeeld brengt je naar de plek in de code. Je kunt de tekst ook direct op de pagina bewerken. Zo schrijf je snel brieven, opgavenbladen, verslagen en flyers zonder TeX te installeren.
Alles draait in je browser. Documenten worden niet geüpload, er is geen registratie en geen reclame.
Commando's, omgevingen, formules en commentaar in eigen kleuren, regelnummers, automatische \end{…} en een duidelijke lijst met problemen en hun regel.
A4, Letter of je eigen papierformaat, de marges van de standaardklassen of van geometry, paginanummers, voetnoten onderaan de pagina en de Latin Modern-lettertypen van LaTeX.
Formules in de tekst en apart, genummerde vergelijkingen, align, matrices en de symbolen van amsmath - gezet met KaTeX, direct op de pagina.
tabular en tabularx met lijnen en samengevoegde cellen, figuren met bijschriften, \label en \ref, inhoudsopgave en literatuurlijst.
Sleep een afbeelding in de editor en gebruik haar met \includegraphics. Afbeeldingen worden met het document in je browser bewaard.
PDF via het afdrukvenster, elke pagina als PNG, JPG of WebP, één HTML-bestand, platte tekst, of de LaTeX-bron met de afbeeldingen als ZIP.
Elke https-pagina (en localhost) kan de editor insluiten met een <iframe> en ?embed=1 - geen registratie, geen sleutel. Ingesloten verbergt de editor deze tekst en toont hij een knop Opslaan. Er zijn twee manieren om het document erin en eruit te krijgen.
src= opent een bestand (je server moet CORS toestaan), webhook= zorgt dat "Opslaan" (Ctrl+S) het document naar dat adres stuurt. Voeg &token=… toe voor een header Authorization: Bearer … en &auto om na elke wijziging op te slaan.
<iframe src="https://latex.giit.ch/?embed=1&src=https://your-site.com/docs/flyer.tex&webhook=https://your-site.com/save.php"
allow="clipboard-write" style="width:100%;height:800px;border:0"></iframe>
De webhook krijgt een POST met JSON { editor, event: "save", id, name, content, assets, updated }. Een klein PHP-script dat het opslaat:
<?php
header('Access-Control-Allow-Origin: https://latex.giit.ch');
header('Access-Control-Allow-Headers: Content-Type, Authorization');
header('Access-Control-Allow-Methods: POST, OPTIONS');
if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') exit;
if (($_SERVER['HTTP_AUTHORIZATION'] ?? '') !== 'Bearer SECRET') { http_response_code(403); exit; }
$d = json_decode(file_get_contents('php://input'), true);
$name = preg_replace('/[^\w\- ]/u', '_', $d['name']);
file_put_contents(__DIR__ . "/docs/$name.tex", $d['content']);
echo '{"ok":true}';
De editor zegt latexeditor:ready, je pagina antwoordt met latexeditor:load, de editor meldt latexeditor:loaded, latexeditor:change bij echte bewerkingen en latexeditor:save wanneer de gebruiker opslaat. Je pagina mag latexeditor:get (de huidige toestand) of latexeditor:save (op Opslaan drukken) sturen. Opslaan loopt dan via je eigen login en sessie.
<iframe id="ed" src="https://latex.giit.ch/?embed=1" allow="clipboard-write" style="width:100%;height:800px;border:0"></iframe>
<script>
const ed = document.getElementById('ed');
const ORIGIN = 'https://latex.giit.ch';
addEventListener('message', async e => {
if (e.source !== ed.contentWindow || e.origin !== ORIGIN) return;
const m = e.data;
if (m.type === 'latexeditor:ready') { // de editor is klaar: geef hem het document
ed.contentWindow.postMessage({
type: 'latexeditor:load',
name: 'Flyer',
content: await (await fetch('/docs/flyer.tex')).text(),
assets: { 'logo.png': 'data:image/png;base64,…' } // afbeeldingen, optioneel
}, ORIGIN);
}
if (m.type === 'latexeditor:change') document.title = '● not saved'; // een echte bewerking
if (m.type === 'latexeditor:save') { // de gebruiker klikte op "Opslaan"
await fetch('/api/save', { method: 'POST', headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ name: m.name, content: m.content, assets: m.assets }) });
document.title = 'Saved';
}
});
// Een opslaanknop op je eigen pagina: het antwoord komt als latexeditor:save
function saveNow() { ed.contentWindow.postMessage({ type: 'latexeditor:get' }, ORIGIN); }
</script>
AI-assistent binnen je pagina: die werkt ook in het frame. Met allow="clipboard-write" op het iframe gebruikt "Prompt kopiëren" direct het klembord (anders valt de editor terug op het oude kopieercommando, of toont hij de prompt om met de hand te kopiëren). Een link die de AI stuurt, kan een editor binnen een andere website niet bereiken, dus vraagt de editor de AI en de gebruiker om in plaats daarvan het hele antwoord van de AI in de editor te plakken - of de editor in een eigen venster te openen.
window.open("https://latex.giit.ch/?embed=window", "latexeditor-17") opent de volledige editor in een eigen venster en spreekt dezelfde berichten met window.opener. Links van een AI bereiken hem daar. latexeditor:load kan ook context: { host, title, rules } meegeven - de AI-prompt zegt dan waar het document thuishoort en volgt je regels - en hook: { url, token, assets: false }, een webhook alleen voor dit document die nooit wordt opgeslagen. Als het venster met niet-opgeslagen wijzigingen wordt gesloten, stuurt het latexeditor:closing.
Geef de editor je eigen prompt, een adres op je site en een sleutel voor deze editorsessie. Het AI-venster toont dan "Verbonden met" je site, wat je de AI vertelt, en de keuze het huidige document wijzigen of een nieuw maken; Prompt kopiëren zet alles bij elkaar. De AI post het resultaat met de sleutel naar je server, en je pagina opent het in de editor - een nieuw document opent apart en blijft in de browser van de gebruiker. Eén sleutel per editorsessie: hij blijft geldig zolang de editor open is, en alleen zolang de editor er geen heeft, vraagt hij erom met latexeditor:key-request. De editor verstuurt de sleutel nooit zelf en slaat hem nooit op; het adres moet https zijn op je eigen host of een subdomein ervan.
const key = async () => (await fetch('/api/ai-key.php?doc=17')).json(); // één sleutel per editorsessie
const k = await key();
ed.contentWindow.postMessage({ type: 'latexeditor:load', name: 'Flyer', content, ai: {
label: 'My Site', prompt: 'Keep the [[placeholders]]. Write in German.',
endpoint: 'https://your-site.com/api/ai-result.php', key: k.key } }, ORIGIN);
// onthoud de id uit latexeditor:loaded en negeer change/save/closing met een andere id
// alleen zolang de editor geen sleutel heeft:
if (m.type === 'latexeditor:key-request') { const k = await key(); ed.contentWindow.postMessage({ type: 'latexeditor:ai', key: k.key }, ORIGIN); }
// zolang de editor open is, meld het elke minuut aan je server; het sluiten van de editor of de pagina maakt de sleutel ongeldig
setInterval(() => fetch('/api/ai-key.php?alive=' + k.key.slice(0, 8)), 60000);
// je server heeft een resultaat (polling, SSE …): target is "current" of "new"
ed.contentWindow.postMessage({ type: 'latexeditor:load', name: 'Flyer', content: draft, from: 'ai', target }, ORIGIN);
<?php // api/ai-key.php - de sleutel van deze editorsessie van de ingelogde gebruiker (je pagina roept het aan)
session_start(); // controleer of de gebruiker dit document mag bewerken
$key = bin2hex(random_bytes(24));
$_SESSION['ai'][hash('sha256', $key)] = ['doc' => (int)$_GET['doc'], 'seen' => time()]; // of in je database; ?alive= zet seen opnieuw
echo json_encode(['key' => $key]);
<?php // api/ai-result.php - de AI post hierheen (geen CORS-headers: AI's roepen het aan vanaf een server)
$key = preg_replace('/^Bearer\s+/', '', $_SERVER['HTTP_AUTHORIZATION'] ?? '');
$row = find_key(hash('sha256', $key)); // je database: niet ongeldig gemaakt, gezien in de laatste 3 minuten
if (!$row) { http_response_code(401); exit('{"ok":false,"error":"key not valid"}'); }
$d = json_decode(file_get_contents('php://input', false, null, 0, 2000000), true);
save_draft($row['doc'], $d['content'], $d['target'] === 'new' ? 'new' : 'current'); // je pagina toont het met latexeditor:load
echo '{"ok":true}';
Maak sleutels met minstens 128 willekeurige bits, sla alleen hun hash op, koppel elke sleutel aan de ingelogde gebruiker, het document en deze editorsessie, maak er één per sessie, houd hem alleen geldig zolang je pagina de sessie als open meldt, en maak hem ongeldig wanneer de editor of de pagina sluit.
Het hele protocol staat in llms.txt - geef het aan een AI en die bouwt de koppeling voor je systeem. De SVG-editor werkt op dezelfde manier met het voorvoegsel svgeditor: - svg.giit.ch.
Nee. De editor draait volledig in je browser. Je documenten en afbeeldingen worden nooit naar een server gestuurd, tenzij je zelf een webhook naar je eigen server instelt.
Klik op "Exporteren", kies PDF en klik op "Afdrukken / Opslaan als PDF". Kies in het afdrukvenster "Opslaan als PDF" als printer. De pagina's komen er precies zo uit als in het voorbeeld, met selecteerbare tekst.
Nee. De editor zet LaTeX zelf in de browser. Hij begrijpt de commando's die de meeste documenten gebruiken - secties, lijsten, tabellen, figuren, formules, kleuren, voetnoten, verwijzingen. TikZ-tekeningen en fontspec-lettertypen worden niet getoond; de code blijft geldige LaTeX die je op elk moment met pdflatex kunt compileren.
Sleep of plak een afbeelding in de editor, of voeg haar toe in het tabblad Afbeeldingen rechts. Ze wordt met het document in je browser bewaard en gebruikt door \includegraphics{name}.
Alleen in je browser. Klik op de mapknop linksboven (Mijn documenten) om ze te openen, te hernoemen, te dupliceren, te downloaden of te verwijderen. Als je de sitegegevens van je browser wist, verdwijnen ze, dus download de documenten die je wilt bewaren - of laat de editor ze naar je eigen server sturen ("Opslaan op server").
Ja, elke AI - ChatGPT, Claude, Gemini, Copilot of de AI in je programmeertool. Klik op "AI-assistent", dan op "Prompt kopiëren", plak hem in je AI en zeg wat die moet schrijven. De AI antwoordt met een link; klik erop en het document verschijnt in je editor. "Ongedaan maken" draait elke wijziging terug.
Ja. Sluit hem in met een iframe en wissel documenten uit met postMessage, of laat hem elke opgeslagen versie met een webhook naar je server sturen. Zie De editor op je eigen website gebruiken voor voorbeelden.
Nee. De editor is gratis, zonder reclame en zonder registratie.