Commit Briefs
Paginate the References slide
A terminal slide can't scroll, so a long bibliography ran off the bottom. bib.Process now emits one '## References' slide plus as many '## References (cont.)' slides as needed, at most 6 entries each.
Add <!-- run --> slide directive: auto-run code, hide source
A slide carrying '<!-- run -->' executes its code blocks automatically when it is shown and displays only their output -- the source is stripped before rendering. Built for terminal plots (UnicodePlots.jl): navigating to the slide draws the graph with no keystroke. - autoRun() fires executeCodeCmd on slide entry (batched with the image load), or restores a per-page cached result on revisit so the slide doesn't re-run and flicker. - code.Warm() kicks off a throwaway 'using UnicodePlots' at load so the first auto-run slide doesn't stall on Julia's precompile. - cached execution temp dirs are cleaned on quit.
Order references alphabetically
Process now numbers cited entries 1..N in alphabetical order of the reference (first author's family name, then year, then title; entries with no author sort by title) and lists the References slide in that order -- IEEE-numbered with alphabetical ordering. In-text [n] markers therefore need not appear in ascending order. Replaces first-appearance numbering.
Resolve a relative theme: path against the deck's directory
A 'theme: theme.json' in the frontmatter now loads from the presentation file's folder, like bibliography and images already do, instead of the process's working directory -- so 'slides sub/dir/deck.md' finds sub/dir/theme.json. Builtin keywords (ascii/light/dark/notty), URLs and absolute paths are unchanged.
Size figures from the measured height of the slide's prose
computeMediaBudget now renders the slide's text alone -- images and $$ blocks removed, captions kept -- and measures how many rows it actually occupies at the current width, then splits the remaining height across the media items. Replaces the fixed reservedRows guess, which was too small when a slide carried a paragraph or a bullet list around the figure, so the figure overran the text beneath it (or pushed it off the bottom). Cached in Model.mediaRows and refreshed on every page change and resize, so the fit re-measures as Kitty's font size changes.
Add <!-- center --> slide directive
A slide with '<!-- center -->' on its own line gets every text line horizontally centered within the content width after rendering; Kitty graphics placeholders keep their existing PadLeft centering. The marker is stripped before glamour sees it, like <!-- pause -->. For closer / section / figure-caption slides.
Fit stacked media to the viewport; warm the LaTeX cache
mediaBudget() splits a slide's usable height across every media item it carries (each image and each $$…$$ block is a real graphic), so slides with several stacked figures/equations no longer overflow the viewport and get their last figure clipped off the bottom. Recomputed on every WindowSizeMsg, so it tracks Kitty font-size / zoom live. Replaces the fixed reservedRows=10 guess. latex.Warm() pre-renders every unique display-math block in the deck concurrently in the background from Load(), so navigating to a slide with equations is a cache hit instead of tectonic's cold start one block at a time. loadImagesCmd rasterizes a slide's blocks in parallel too. dpi 200 (down from 300) roughly halves Ghostscript's work; the PNG is downscaled to a few cells regardless, with TextAlphaBits=4 keeping edges smooth.
Reorganize examples/ into one folder per demo, track the personal ones
Every example is now its own self-contained folder (matching the arquimedes/matlab-laser-mic pattern that was already here), instead of a flat mix of loose .md files and asset folders. Updates the few repo-root-relative paths that pointed at the old flat layout: Makefile, docs/development, custom_theme.md's theme path, and preprocess.md's import path. arquimedes/ and matlab-laser-mic/ are no longer gitignored -- they're real presentations built with this fork, worth keeping versioned instead of local-only.
Center code-execution text output, demo a GIF saved from code
UnicodePlots (and any other code block's plain stdout) now centers the same way image-based plots already do via their own PadLeft, instead of hugging the left edge while GR/CairoMakie output sits in the middle. Also adds a Julia example that saves an animated GIF from a ctrl+e block -- confirms the existing GIF cache path (Fase 7) already applies to execution-produced images too, no code change needed there.
Play animated GIFs for real via Kitty's native animation
A .gif with more than one frame now decodes every frame (respecting per-frame disposal, since GIF frames can be partial and rely on compositing over previous ones), transmits them under a single image id, and starts looping playback -- all server-side, so once sent there's nothing left for this process to do per frame. Single-frame GIFs still take the plain static-image path. Adds DeleteSeq to free an animated image's memory once it's no longer needed, though nothing calls it automatically yet: an off-screen animation keeps ticking in the terminal for the rest of the session, same accepted tradeoff this fork already makes for static images never being explicitly freed either.
Run code execution async and show plots as real images
Ctrl+E now runs off the render path (a tea.Cmd), so a slow first-time compile (Julia's Plots/Makie precompilation can take minutes) no longer freezes the presentation -- the existing spinner shows while it runs. Any image file a code block's execution leaves behind (savefig, save, ...) is now picked up from its own temp working directory and shown below the text output, reusing the image package's Kitty pipeline. For Julia specifically: --color=yes so UnicodePlots' ANSI output survives being captured (Julia disables color when stdout isn't a TTY), COLUMNS/ LINES sized to the slide so it has a real canvas instead of a fixed 80x24 fallback, and GKSwstype=100 so GR.jl/Plots.jl's GR backend never tries to open a window it can't display. julia-bin added to the dev shell for local verification.
Rewrite README for this fork, drop upstream community files
README now documents this fork's own features (LaTeX, images, bibliography), install instructions specific to this repo, and drops package-manager badges/links that pointed at the upstream project. CODE_OF_CONDUCT.md, CONTRIBUTING.md, and SECURITY.md were written for an open-source project accepting outside contributions and vulnerability reports to the original maintainer's email -- neither applies to a personal fork, so they're removed rather than adjusted. Same reasoning for .github/FUNDING.yml (pointed at the upstream maintainer's sponsor page) and the issue/PR templates. LICENSE keeps Maas Lalani's original MIT copyright notice (required to keep redistributing this fork under MIT) and adds a second line for this fork's own changes.
Refresh vendorHash for the added bubbles/v2/spinner dependency
nix build was failing: the pinned vendorHash predated the spinner component being wired into internal/model, so the sandboxed vendor dir it unpacks to was missing that package.
Trim unnecessary comments in this session's new code
Shortens several multi-paragraph explanatory comments down to their essential point, and drops a stale reference to an uncommitted spike directory and a doc comment that only restated the function name. Also gitignores the personal example presentations under examples/, kept local only.
Remove upstream GitHub Actions workflows
Not needed for a personal fork.
Polish layout, sizing, and physics notation for projector use
- Compute image/formula budget and margins from real viewport size instead of hard-coded columns/rows, and center content that's narrower than the available width. - Keep the status bar pinned to the bottom and stop content from overflowing the margin when the terminal is resized/zoomed. - Show a spinner while images/formulas are still loading instead of a blank gap. - Add physics vector/derivative notation (vec, hat, dot, ddot, bar) to the inline LaTeX-to-Unicode converter, and named operators (sin, log, lim, ...); non-combining glyphs are used since combining marks get silently dropped somewhere in the render pipeline. - Graduated heading styles (bold/banner h1, bold h2) for visual hierarchy since terminal font size itself isn't controllable from the app.
Add numbered bibliography and citation support
Adds a hand-rolled BibTeX parser (internal/bib) that resolves [@key] citations in order of first appearance, rewrites them to numbered markdown links, and appends a generated References slide in an IEEE-ish format. Enabled per-presentation via a bibliography: field in the frontmatter; slides without it are unaffected.
add LaTeX math rendering ($...$ inline, $$...$$ block)
Block math ($$...$$) compiles via tectonic + ghostscript to a PNG and reuses internal/image's Kitty transmission/cache/placeholder pipeline unchanged, so it gets a real, persistently-cached image. Inline math ($...$) never becomes an image -- a Kitty placeholder forced to one row would squash anything with vertical extent, so it's approximated as Unicode text instead, which also doubles as the fallback for block math when there's no graphics support or compilation fails. Found and fixed a real tectonic/standalone interaction along the way: the default (non-preview) standalone backend doesn't recognize \[...\] or equation* as document content in this bundle ("Missing $ inserted"), confirmed by hand with tectonic/gs directly before wiring it in -- needs \documentclass[preview,border=2pt]{standalone}.
add real image rendering via Kitty Graphics Protocol
Renders  as actual terminal graphics using Kitty Unicode Placeholders, with the caption shown below via glamour. Falls back to today's plain-text image rendering on terminals that don't answer the capability probe, so this is a no-op change for anyone not on Kitty. Image decoding/transmission is kept off the render path: View() only ever does a non-blocking cache lookup, while the slow work (decode, PNG re-encode, transmit) runs in a tea.Cmd triggered on page change and window resize. Images are sent as PNG so Kitty does the scaling itself, avoiding a resize dependency.
add nix flake devshell and build
Sets up a reproducible dev environment (go, tectonic, ghostscript, imagemagick) and a buildGoModule package output, so the fork can be built and tested without a system-wide Go toolchain, ahead of adding LaTeX/image/bibliography support.
