From a82e8da6baf875773b4c7090afdfeceaacce02f4 Mon Sep 17 00:00:00 2001 From: prompt.ac/@jeffrey Date: Thu, 28 May 2026 14:38:25 +0000 Subject: [PATCH] meetings: pivot template to notepat-charts cards aesthetic Replace the arxiv-letter Tufte layout with a 4×6 phone-proportioned flip-deck. Each meeting becomes a cover card + key-ideas card + one card per section, cycling through eight soft pastel page tints (warm cream → pale rose → peach → lemon → mint → sky → lilac → sand). - Bold lowercase titles with a pink-dot period, ywft-processing-bold - Subtitle line under each section title for context - Speaker labels in Berkeley Mono small caps + monospaced timestamps - Whistlepop callouts move from margin sidenotes to inline boxes (no margin on a 4in page): pink-bar highlights, amber-bordered decisions with optional tag, cyan-bar actions with ARROW NAME - Key-ideas card replaces the bullet list with \keyidea{LABEL}{text} rows so DECISION / HIGHLIGHT / ACTION read as tagged entries - cli.mjs now emits \cardtitle{name} (auto-clearpage + pink dot) for every section directive and symlinks ac-meeting-cards.sty - ac-meeting.sty (arxiv-letter) deleted — single canonical template Visual lineage: papers/notepat-charts/notepat-charts.pdf. Co-Authored-By: Claude Opus 4.7 (1M context) --- meetings/cli.mjs | 25 +++++++++++++------------ meetings/sample-jeffrey-x-scott/ac-meeting-cards.sty | 1 + meetings/sample-jeffrey-x-scott/ac-meeting.sty | 1 - meetings/sample-jeffrey-x-scott/meeting.tex | 46 ++++++++++++++++------------------------------ meetings/template/ac-meeting-cards.sty | 296 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ meetings/template/ac-meeting.sty | 289 ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- meetings/template/meeting.tex.tmpl | 33 +++++---------------------------- 7 file(s) changed, 331 insertion(s)(+), 360 deletion(s)(-) diff --git a/meetings/cli.mjs b/meetings/cli.mjs --- a/meetings/cli.mjs +++ b/meetings/cli.mjs @@ -309,22 +309,23 @@ const r = s % 60; return `${String(m).padStart(2, "0")}:${String(r).padStart(2, "0")}`; } -// Compose KEY_IDEAS \item lines from directives. decisions/actions/highlights -// surface here; other directive types live inline in the body. +// Compose KEY_IDEAS rows from directives. Decisions/actions/highlights +// surface here as \keyidea{LABEL}{text}; other directive types live +// inline in the body. function renderKeyIdeas(directives) { const items = []; for (const d of directives) { if (d.type === "decision" && d.text) { - items.push(` \\item Decision: ${escapeTex(d.text)}`); + items.push(`\\keyidea{Decision}{${escapeTex(d.text)}}`); } else if (d.type === "action" && d.text) { - const who = d.person ? `${escapeTex(d.person)} --- ` : ""; - items.push(` \\item Action --- ${who}${escapeTex(d.text)}`); + const who = d.person ? escapeTex(d.person).toUpperCase() : ""; + items.push(`\\keyidea{Action${who ? " — " + who : ""}}{${escapeTex(d.text)}}`); } else if (d.type === "highlight" && d.text) { - items.push(` \\item Highlighted: ${escapeTex(d.text)}`); + items.push(`\\keyidea{Highlight}{${escapeTex(d.text)}}`); } } if (items.length === 0) { - items.push(" \\item \\textit{(no directives captured — transcript only)}"); + items.push("\\keyidea{}{\\textit{(no directives captured --- transcript only)}}"); } return items.join("\n"); } @@ -371,10 +372,10 @@ } else { const d = it.d; switch (d.type) { case "section": - out.push(`\\section{${escapeTex(d.name || "Section")}}`); + out.push(`\\cardtitle{${escapeTex((d.name || "Section").toLowerCase())}}`); break; case "subsection": - out.push(`\\subsection{${escapeTex(d.name || "Subsection")}}`); + out.push(`\\subsection{${escapeTex((d.name || "Subsection").toLowerCase())}}`); break; case "break": case "lone-short": @@ -427,7 +428,7 @@ if (!existsSync(tx) || !existsSync(dsl)) { die("build needs transcript + directives — run parse first"); } const templatePath = join(HERE, "template/meeting.tex.tmpl"); - const styPath = join(HERE, "template/ac-meeting.sty"); + const styPath = join(HERE, "template/ac-meeting-cards.sty"); if (!existsSync(templatePath)) die(`missing template: ${templatePath}`); const out = join(dir, "meeting.pdf"); @@ -445,8 +446,8 @@ const directives = directivesFile.directives || []; // Symlink the stylesheet so xelatex finds it locally. Re-link each // build in case the .sty has moved. - const styLink = join(dir, "ac-meeting.sty"); - try { execSync(`rm -f "${styLink}"`); } catch {} + const styLink = join(dir, "ac-meeting-cards.sty"); + try { execSync(`rm -f "${styLink}" "${join(dir, "ac-meeting.sty")}"`); } catch {} try { symlinkSync(styPath, styLink); } catch { // If symlink fails (rare — different fs), copy. copyFileSync(styPath, styLink); diff --git a/meetings/sample-jeffrey-x-scott/ac-meeting-cards.sty b/meetings/sample-jeffrey-x-scott/ac-meeting-cards.sty new file mode 100644 --- /dev/null +++ b/meetings/sample-jeffrey-x-scott/ac-meeting-cards.sty @@ -0,0 +1,1 @@ +../template/ac-meeting-cards.sty \ No newline at end of file diff --git a/meetings/sample-jeffrey-x-scott/ac-meeting.sty b/meetings/sample-jeffrey-x-scott/ac-meeting.sty deleted file mode 100644 --- a/meetings/sample-jeffrey-x-scott/ac-meeting.sty +++ /dev/null @@ -1,1 +0,0 @@ -../template/ac-meeting.sty \ No newline at end of file diff --git a/meetings/sample-jeffrey-x-scott/meeting.tex b/meetings/sample-jeffrey-x-scott/meeting.tex --- a/meetings/sample-jeffrey-x-scott/meeting.tex +++ b/meetings/sample-jeffrey-x-scott/meeting.tex @@ -1,16 +1,8 @@ % !TEX program = xelatex -% Sample meeting — exercises every macro in ac-meeting.sty so we can -% verify the template compiles before wiring the real build pipeline. +% Sample meeting in the cards layout — exercises every macro in +% ac-meeting-cards.sty so we can verify the template compiles. -\documentclass[11pt,letterpaper]{article} - -\usepackage[ - paperwidth=8.5in, paperheight=11in, - top=0.9in, bottom=0.9in, - inner=0.9in, outer=2.6in, - marginparwidth=1.8in, marginparsep=0.2in, - twoside=false, -]{geometry} +\documentclass[11pt]{article} \usepackage{fontspec} \usepackage{unicode-math} @@ -31,25 +23,20 @@ urlcolor=acpink, pdftitle={jeffrey x scott — sample meeting}, } -\usepackage{ac-meeting} +\usepackage{ac-meeting-cards} \begin{document} -\pagestyle{empty} -\meetingtitle{jeffrey x scott} -\meetingmeta{2026-05-30}{53 min}{jeffrey, scott}{2026-05-30-1600-jeffrey-x-scott.wav} +\meetingcover{jeffrey x scott}{2026-05-30 \enspace$\cdot$\enspace 53 min \enspace$\cdot$\enspace jeffrey, scott}{2026-05-30-1600-jeffrey-x-scott.wav} \begin{keyideas} -\begin{itemize} - \item Decision: ship trancepenta stems by Friday. - \item Highlighted: scott's bridge motif idea is the spine of the next section. - \item Action — jeffrey: send scott the bare project file with no mastering. -\end{itemize} + \keyidea{Decision}{Ship trancepenta stems Friday, unmastered, bare project export.} + \keyidea{Highlight}{Scott's bridge motif idea is the spine of the next section.} + \keyidea{Action --- JEFFREY}{Send scott the bare project file by Friday end-of-day.} \end{keyideas} -\vspace{1.5em} - -\section{Opening} +\section*{opening{\color{acpink}.}} +\cardsubtitle{small talk and framing.} \turn{jeffrey}{00:00}{Hey Scott — thanks for jumping on. I wanted to talk through where the trancepenta stems land before Friday.} @@ -65,7 +52,8 @@ \turn{jeffrey}{01:12}{That's a really good read. Let me sit with that.} \mnote{Sage made a similar point about letting motifs breathe in a chat last week.} -\section{Decisions} +\section*{decisions{\color{acpink}.}} +\cardsubtitle{what we committed to.} \turn{scott}{02:30}{So timing-wise — when can you get me the bare stems?} @@ -75,7 +63,8 @@ \mdecision{Ship trancepenta stems Friday, unmastered, bare project export.}{50/50 split, publishing his} \maction{jeffrey}{Send scott the bare project file with no mastering by Friday end-of-day.} -\section{Tangents} +\section*{tangents{\color{acpink}.}} +\cardsubtitle{the small detours.} \turn{scott}{04:15}{Random question — have you been keeping up with the whistlegraph stuff lately?} @@ -91,12 +80,9 @@ \turn{scott}{05:51}{OK, sending you my notes on the bridge after this.} \turn{jeffrey}{05:58}{Perfect — talk soon.} -\whistlebreak - -\section{Notes for the future} +\section*{notes for the future{\color{acpink}.}} +\cardsubtitle{what to revisit next time.} \turn{jeffrey}{06:00}{For the followup we should plan out a second pass once the stems are in.} - -\meetingcolophon \end{document} diff --git a/meetings/template/ac-meeting-cards.sty b/meetings/template/ac-meeting-cards.sty new file mode 100644 --- /dev/null +++ b/meetings/template/ac-meeting-cards.sty @@ -0,0 +1,296 @@ +% ac-meeting-cards.sty — phone-sized meeting deliverable in the +% notepat-charts visual register. +% +% Each meeting becomes a small flippable deck: +% - 4" × 6" portrait, soft pastel page tint +% - Cover card: title + participants + date + duration +% - Key Ideas card: 3-5 bullets pulled from highlights/decisions/actions +% - One card per \section (auto-page-break) +% - Speaker turns as paragraphs with monospaced label + timestamp +% - Whistlepop directives render as inline cards (highlights/decisions/ +% actions get their own visual treatment without margin sidenotes) +% - Footer: "MEETING · N" centered, no watermark +% +% Visual lineage: papers/notepat-charts/notepat-charts.pdf — bold lowercase +% titles with a colored period dot, inline colored typography, generous +% whitespace, one topic per card. + +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{ac-meeting-cards}[2026/05/28 Aesthetic Computer meeting cards] + +% === PAGE SIZE === +\RequirePackage[ + paperwidth=4in, + paperheight=6in, + top=0.45in, + bottom=0.55in, + left=0.35in, + right=0.35in, +]{geometry} + +% === PACKAGES === +\RequirePackage{xcolor} +\RequirePackage{tikz} +\RequirePackage{eso-pic} +\RequirePackage{titlesec} +\RequirePackage{tcolorbox} +\tcbuselibrary{breakable,skins} +\RequirePackage{fancyhdr} +\RequirePackage{enumitem} + +% === FONTS === +\newfontfamily\acbold{ywft-processing-bold}[ + Path=../../system/public/type/webfonts/, + Extension=.ttf +] +\newfontfamily\aclight{ywft-processing-light}[ + Path=../../system/public/type/webfonts/, + Extension=.ttf +] +\IfFontExistsTF{Berkeley Mono}{% + \newfontfamily\acmono{Berkeley Mono} +}{% + \newfontfamily\acmono{Menlo} +} + +% === COLORS === +\definecolor{acpink}{RGB}{205,92,155} +\definecolor{acpurple}{RGB}{120,80,180} +\definecolor{acdark}{RGB}{40,36,48} +\definecolor{acgray}{RGB}{119,119,119} +\definecolor{acsoftgray}{RGB}{170,165,180} + +% Pastel page backgrounds (from notepat-charts palette). One per card +% cycle, so a long meeting reads as a flip-book of colored notepad pages. +\definecolor{bgWarmCream}{RGB}{252,246,238} +\definecolor{bgPaleRose}{RGB}{252,240,242} +\definecolor{bgPalePeach}{RGB}{254,240,226} +\definecolor{bgPaleLemon}{RGB}{252,250,226} +\definecolor{bgPaleMint}{RGB}{232,250,238} +\definecolor{bgPaleSky}{RGB}{232,244,252} +\definecolor{bgPaleLilac}{RGB}{242,238,252} +\definecolor{bgPaleSand}{RGB}{248,244,232} + +% Inline callout accents +\definecolor{popdecision}{RGB}{210,140,40} +\definecolor{popaction}{RGB}{60,140,170} +\definecolor{pophighlight}{RGB}{205,92,155} +\definecolor{popquote}{RGB}{90,90,100} + +% === PAGE BACKGROUND CYCLING === +% Each page picks a color based on (page - 1) mod 8. Computed in-place +% via a TeX \count loop because LaTeX doesn't have a clean \mod operator +% that works inside background overlays. +\newcount\acbgmod +\newcommand{\meetingbg}{% + \begin{tikzpicture}[remember picture, overlay] + \acbgmod=\numexpr\c@page-1\relax + \loop\ifnum\acbgmod>7 \advance\acbgmod by -8 \repeat + \ifcase\acbgmod% + \fill[bgWarmCream] (current page.south west) rectangle (current page.north east);% + \or\fill[bgPaleRose] (current page.south west) rectangle (current page.north east);% + \or\fill[bgPalePeach] (current page.south west) rectangle (current page.north east);% + \or\fill[bgPaleLemon] (current page.south west) rectangle (current page.north east);% + \or\fill[bgPaleMint] (current page.south west) rectangle (current page.north east);% + \or\fill[bgPaleSky] (current page.south west) rectangle (current page.north east);% + \or\fill[bgPaleLilac] (current page.south west) rectangle (current page.north east);% + \or\fill[bgPaleSand] (current page.south west) rectangle (current page.north east);% + \fi + \end{tikzpicture}% +} +\AddToShipoutPictureBG{\meetingbg} + +% === SECTIONS = NEW CARD === +\let\origsection\section +\renewcommand{\section}{\clearpage\origsection} + +% Bold lowercase section title with a colored period dot at the end. +\titleformat{\section}[block] + {\acbold\fontsize{22pt}{26pt}\selectfont\color{acdark}\raggedright} + {}{0pt} + {} + [{\vspace{-0.25em}}] +\titlespacing{\section}{0pt}{0em}{0.4em} + +\titleformat{\subsection}[block] + {\acbold\fontsize{12pt}{14pt}\selectfont\color{acpurple}\raggedright} + {}{0pt}{} +\titlespacing{\subsection}{0pt}{0.6em}{0.2em} + +\setcounter{secnumdepth}{-1} + +% === SECTION-TITLE HELPER === +% \cardtitle{name} — render the section title with a final colored period, +% matching notepat-charts ("the notepat layout."). The pink dot is the +% only ornament on the page. +% \cardtitle puts a section title with a colored period at the top of a +% fresh card. Used by cli.mjs build for every section directive — the +% \clearpage is explicit because we use \section* (which skips the auto +% break installed on the unstarred \section above). +\newcommand{\cardtitle}[1]{% + \clearpage\section*{#1{\color{acpink}.}}% +} +\newcommand{\cardsubtitle}[1]{% + {\fontsize{9.5pt}{12pt}\selectfont\color{acgray}#1\par}% + \vspace{0.6em}% +} + +% === COVER === +% \meetingcover{title}{date · duration · participants}{wav basename} +% Title page only — vertically centered, no card break before, just the +% pink-dot title and a tiny meta line under it. +\newcommand{\meetingcover}[3]{% + \thispagestyle{empty}% + \begin{tikzpicture}[remember picture, overlay] + \node[anchor=center, text width=3.3in, align=center] + at ([yshift=0.3in]current page.center) {% + {\acbold\fontsize{30pt}{34pt}\selectfont\color{acdark}#1{\color{acpink}.}}\\[0.7em] + {\fontsize{10pt}{13pt}\selectfont\itshape\color{acgray}#2}\\[0.4em] + {\acmono\fontsize{7pt}{9pt}\selectfont\color{acsoftgray}#3}% + }; + \end{tikzpicture}% + \null\clearpage% +} + +% === KEY IDEAS === +% Renders the "key ideas." card. Each \keyidea{label}{text} is a row +% with a small colored tag (decision/action/highlight) and the body. +\newenvironment{keyideas}{% + \cardtitle{key ideas}% + \cardsubtitle{the meeting in one card.}% + \begin{list}{}{% + \setlength{\leftmargin}{0pt}% + \setlength{\itemindent}{0pt}% + \setlength{\itemsep}{0.5em}% + \setlength{\parsep}{0pt}% + \setlength{\topsep}{0pt}% + }% +}{% + \end{list}% +} +\newcommand{\keyidea}[2]{% + \item + {\acbold\fontsize{8pt}{10pt}\selectfont\MakeUppercase{#1}}\quad + {\fontsize{10pt}{13pt}\selectfont #2}% +} + +% === SPEAKER TURNS === +% Compact paragraph form: speaker label + timestamp on one line, body +% reading after. Uses Berkeley Mono for the label so it scans like +% system output, distinct from spoken words. +\newcommand{\turn}[3]{% + \par\vspace{0.4em}% + \noindent + {\acmono\fontsize{7.5pt}{10pt}\selectfont\bfseries\color{acdark}\MakeUppercase{#1}}% + \hspace{0.5em}% + {\acmono\fontsize{7pt}{9pt}\selectfont\color{acsoftgray}#2}% + \par\noindent\fontsize{10pt}{13pt}\selectfont\ignorespaces#3\par +} + +% === WHISTLEPOP CALLOUTS (inline — no margin space on a 4in page) === + +% Highlight — soft pink bar to the left, no border, no fill heavy. +\newtcolorbox{whistlepophighlight}{% + enhanced, breakable, sharp corners, + colback=acpink!7, colframe=pophighlight, + boxrule=0pt, leftrule=2pt, + left=0.5em, right=0.5em, top=0.3em, bottom=0.3em, + before skip=0.45em, after skip=0.45em, +} +\newcommand{\mhighlight}[1]{\begin{whistlepophighlight}\fontsize{10pt}{13pt}\selectfont #1\end{whistlepophighlight}} + +% Decision — amber border + label tag. +\newtcolorbox{whistlepopdecision}{% + enhanced, breakable, sharp corners, + colback=white!75, colframe=popdecision, + boxrule=0.8pt, + left=0.6em, right=0.6em, top=0.4em, bottom=0.4em, + before skip=0.6em, after skip=0.6em, +} +\newcommand{\mdecision}[2]{% + \begin{whistlepopdecision}% + {\acbold\fontsize{7pt}{9pt}\selectfont\color{popdecision}DECISION{\color{popdecision}.}}\par\vspace{0.15em}% + \fontsize{10pt}{13pt}\selectfont #1% + \ifx&\else + \par\vspace{0.1em}% + {\fontsize{8.5pt}{11pt}\selectfont\itshape\color{popdecision}— #2}% + \fi + \end{whistlepopdecision}% +} + +% Action — cyan bar + "→ NAME" prefix. +\newtcolorbox{whistlepopaction}[1]{% + enhanced, breakable, sharp corners, + colback=popaction!7, colframe=popaction, + boxrule=0pt, leftrule=2pt, + left=0.5em, right=0.5em, top=0.3em, bottom=0.3em, + before skip=0.45em, after skip=0.45em, +} +\newcommand{\maction}[2]{% + \begin{whistlepopaction}{#1}% + {\acbold\fontsize{7pt}{9pt}\selectfont\color{popaction}$\rightarrow$ \MakeUppercase{#1}}\par\vspace{0.1em}% + \fontsize{10pt}{13pt}\selectfont #2% + \end{whistlepopaction}% +} + +% Quote — italic, gray accent, hanging indent. +\newcommand{\mquote}[1]{% + \par\vspace{0.4em}% + \begingroup + \leftskip=0.8em\rightskip=0.4em + \color{popquote}\itshape\fontsize{10pt}{13pt}\selectfont #1\par + \endgroup + \vspace{0.3em}% +} + +% Note — inline italic gray parenthetical, smaller type. +\newcommand{\mnote}[1]{% + \par\vspace{0.2em}% + {\fontsize{8.5pt}{11pt}\selectfont\itshape\color{acgray}— #1}\par + \vspace{0.2em}% +} + +% Freeform — small monospaced tag + the verbatim text. +\newcommand{\mfreeform}[1]{% + \par\vspace{0.2em}% + {\acmono\fontsize{6.5pt}{8pt}\selectfont\color{acsoftgray}[freeform]}\enspace% + {\fontsize{8.5pt}{11pt}\selectfont\itshape\color{acgray}#1}\par + \vspace{0.2em}% +} + +% Skipped — inline tag, monospaced. +\newcommand{\mskipped}[1]{% + {\acmono\fontsize{8pt}{10pt}\selectfont\color{acsoftgray}[\,skipped #1\,]}% +} + +% Section break from a lone short whistle (when not promoted to \section). +\newcommand{\whistlebreak}{% + \par\vspace{0.7em}% + \begin{center}% + {\color{acsoftgray}\fontsize{10pt}{12pt}\selectfont$\sim$\hspace{0.3em}$\sim$\hspace{0.3em}$\sim$}% + \end{center}% + \vspace{0.4em}\par\noindent\ignorespaces% +} + +% === FOOTER === +\pagestyle{fancy} +\fancyhf{} +\renewcommand{\headrulewidth}{0pt} +\renewcommand{\footrulewidth}{0pt} +\fancyfoot[C]{% + {\acbold\fontsize{6.5pt}{8pt}\selectfont\color{acsoftgray}% + MEETING \enspace$\cdot$\enspace \thepage}% +} + +% === LIST + PARAGRAPH === +\setlist[itemize]{nosep, leftmargin=1em, itemsep=0.2em} +\setlist[enumerate]{nosep, leftmargin=1.2em, itemsep=0.2em} +\setlength{\parindent}{0pt} +\setlength{\parskip}{0.4em} +\linespread{1.15} + +\tolerance=600 +\emergencystretch=1.5em +\hyphenpenalty=200 + +\endinput diff --git a/meetings/template/ac-meeting.sty b/meetings/template/ac-meeting.sty deleted file mode 100644 --- a/meetings/template/ac-meeting.sty +++ /dev/null @@ -1,289 +0,0 @@ -% ac-meeting.sty — Aesthetic Computer meeting transcript layout -% Usage: \usepackage{ac-meeting} after fontspec, xcolor, geometry, titlesec. -% -% A meeting deliverable: title block, key ideas summary, speaker-attributed -% conversation transcript, and margin/callout treatments for whistlepop -% directives (highlight, decision, action, quote, section, freeform note). -% -% Layout grammar: -% - Single column, ~5.5in body width -% - 1.5in left margin reserved for whistlepop sidenotes / margin glyphs -% - YWFT Processing for chrome (title, callout labels, section heads) -% - Latin Modern Roman for body transcript -% - Berkeley Mono for the speaker labels + timestamps (fixed-width = scan) -% -% Whistlepop visual vocabulary: -% \mhighlight{prev sentence} → callout box around prev sentence -% \mdecision{prev sentence}{label} → decision pull-quote w/ ★ glyph -% \maction{person}{prev sentence} → action item, named glyph in margin -% \mquote{prev sentence} → block-quote treatment -% \mnote{margin note text} → tufte-style sidenote -% \mfreeform{verbatim directive} → tagged margin note (unparsed) -% \mskipped{N seconds} → "[skipped Ns]" inline placeholder - -\NeedsTeXFormat{LaTeX2e} -\ProvidesPackage{ac-meeting}[2026/05/27 Aesthetic Computer meeting layout] - -\RequirePackage{tikz} -\RequirePackage{tcolorbox} -\tcbuselibrary{skins,breakable} -\RequirePackage{titlesec} - -% \marginnote is provided by the marginnote package, which isn't in the -% basic TeX Live install. Alias it to the LaTeX kernel's \marginpar — -% same API for our use (single-arg margin note), slightly less -% placement control but no extra dependency. If marginnote is added -% later (richer footnote-style placement) this alias can be deleted. -\providecommand{\marginnote}[1]{\marginpar{\raggedright #1}} -\RequirePackage{enumitem} -\RequirePackage{xcolor} - -% === FONTS === -% Same convention as ac-paper-layout.sty so the meeting feels like a -% sibling of the arxiv working drafts. Berkeley Mono is used by the -% slides and the menubar — pulling it in here makes speaker labels and -% timestamps read as "system output", a different register from body -% prose without needing a different color. -\newfontfamily\acbold{ywft-processing-bold}[ - Path=../../system/public/type/webfonts/, - Extension=.ttf -] -\newfontfamily\aclight{ywft-processing-light}[ - Path=../../system/public/type/webfonts/, - Extension=.ttf -] - -% Berkeley Mono — system-installed (slides depend on it too). -% Falls back to a generic monospaced family if absent. -\IfFontExistsTF{Berkeley Mono}{% - \newfontfamily\acmono{Berkeley Mono} -}{% - \newfontfamily\acmono{Menlo} -} - -% === COLORS (AC palette + meeting-specific tints) === -\definecolor{acpink}{RGB}{180,72,135} -\definecolor{acpurple}{RGB}{120,80,180} -\definecolor{acdark}{RGB}{40,36,48} -\definecolor{acgray}{RGB}{119,119,119} -\definecolor{acsoft}{RGB}{248,242,250} - -% Whistlepop accents — each directive has a stable hue so the eye learns -% the vocabulary across many meetings. Decisions are warm-amber (weighty, -% commits us), actions cyan (forward-looking, who-owes-what), highlights -% pink (the house accent), quotes neutral gray (verbatim), notes muted. -\definecolor{popdecision}{RGB}{210,140,40} -\definecolor{popaction}{RGB}{60,140,170} -\definecolor{pophighlight}{RGB}{180,72,135} -\definecolor{popquote}{RGB}{90,90,100} -\definecolor{popnote}{RGB}{140,130,150} - -% === SECTION FORMATTING === -% Sections come from whistlepops (`section `) or from short -% lone-whistle punctuation. Plain Title Case bold, dark, no numbers — -% same restraint as the essay style. -\titleformat{\section}[block] - {\normalfont\bfseries\fontsize{14pt}{17pt}\selectfont\color{acdark}\raggedright} - {}{0pt}{} -\titlespacing{\section}{0pt}{2em}{0.6em} - -\titleformat{\subsection}[block] - {\normalfont\bfseries\fontsize{11pt}{13pt}\selectfont\color{acgray}\raggedright} - {}{0pt}{} -\titlespacing{\subsection}{0pt}{1.2em}{0.2em} - -\setcounter{secnumdepth}{-1} - -% === TITLE BLOCK === -% \meetingtitle{Title} — large pink title (matches essay style) -% \meetingdate{2026-05-30} — ISO date below the title -% \meetingparticipants{a, b} — comma-separated names -% \meetingduration{53 min} — human duration -% \meetingsource{path/to.wav} — italic gray sub-line -\newcommand{\meetingtitle}[1]{% - \begin{center}% - \begin{tikzpicture} - \node[acdark, opacity=0.22, - font=\aclight\fontsize{32pt}{36pt}\selectfont, - inner sep=0pt] at (2pt, -2pt) {#1}; - \node[acpink, - font=\aclight\fontsize{32pt}{36pt}\selectfont, - inner sep=0pt] at (0, 0) {#1}; - \end{tikzpicture}% - \end{center}% - \vspace{0.4em}% -} -\newcommand{\meetingmeta}[4]{% - \begin{center}% - {\fontsize{11pt}{14pt}\selectfont\itshape\color{acgray}% - #1 \enspace·\enspace #2 \enspace·\enspace #3}\\[0.3em] - {\acmono\fontsize{8pt}{10pt}\selectfont\color{acgray}#4}% - \end{center}% - \vspace{1.8em}% -} - -% === KEY IDEAS BLOCK === -% A summary block at the top of the meeting, populated by the build pass -% from highlight/decision/action whistlepops + (eventually) an LLM pass -% over the transcript. Renders as a soft-tinted card. -\newtcolorbox{keyideas}{% - enhanced, breakable, - colback=acsoft, colframe=acpink!50!white, - boxrule=0.5pt, arc=2pt, - left=1em, right=1em, top=0.6em, bottom=0.6em, - title={\acbold\color{acpink}KEY IDEAS}, - attach boxed title to top left={xshift=1em, yshift*=-0.4em}, - boxed title style={ - colback=white, colframe=acpink!50!white, - boxrule=0.5pt, arc=2pt, top=2pt, bottom=2pt, left=4pt, right=4pt, - }, -} - -% === SPEAKER TURNS === -% \turn{speaker}{HH:MM}{utterance text} -% Speaker label in Berkeley Mono small caps; timestamp in monospaced gray -% to the right; body in serif. Hanging indent puts the body flush-left -% with the speaker name's first letter for column alignment. -\newcommand{\turn}[3]{% - \par\vspace{0.45em}% - \noindent - {\acmono\fontsize{8.5pt}{11pt}\selectfont\bfseries\color{acdark}\MakeUppercase{#1}}% - \hspace{0.6em}% - {\acmono\fontsize{8pt}{10pt}\selectfont\color{acgray}#2}% - \par\noindent\hspace{0pt}\ignorespaces#3\par -} - -% === WHISTLEPOP RENDERINGS === - -% Highlight: previous sentence framed in a soft pink-tinted box, with a -% small "♦" glyph in the left margin so the eye finds it scanning down. -\newtcolorbox{whistlepophighlight}{% - enhanced, breakable, sharp corners, - colback=acsoft, colframe=pophighlight, - boxrule=0pt, leftrule=2pt, - left=0.6em, right=0.6em, top=0.4em, bottom=0.4em, - before skip=0.5em, after skip=0.5em, -} -\newcommand{\mhighlight}[1]{% - \marginnote{\color{pophighlight}\fontsize{10pt}{12pt}\selectfont\textbf{$\diamondsuit$}}% - \begin{whistlepophighlight}#1\end{whistlepophighlight}% -} - -% Decision: amber-bordered pull-quote with the literal word "DECISION" as -% a label, and an optional short tag underneath (the decision in 3-5 words). -\newtcolorbox{whistlepopdecision}{% - enhanced, breakable, sharp corners, - colback=white, colframe=popdecision, - boxrule=1pt, - left=0.8em, right=0.8em, top=0.5em, bottom=0.5em, - before skip=0.6em, after skip=0.6em, - title={\acbold\color{popdecision}\fontsize{8pt}{10pt}\selectfont DECISION}, - coltitle=popdecision, - attach boxed title to top left={xshift=0.5em, yshift*=-0.35em}, - boxed title style={colback=white, frame hidden}, -} -\newcommand{\mdecision}[2]{% - \marginnote{\color{popdecision}\fontsize{12pt}{14pt}\selectfont$\star$}% - \begin{whistlepopdecision}% - #1% - \ifx&% - \else - \par\vspace{0.2em}% - {\itshape\color{popdecision}\small — #2}% - \fi - \end{whistlepopdecision}% -} - -% Action item: cyan accent, "ACTION — " label, body underneath. -\newtcolorbox{whistlepopaction}[1]{% - enhanced, breakable, sharp corners, - colback=white, colframe=popaction, - boxrule=0pt, leftrule=2pt, - left=0.6em, right=0.6em, top=0.4em, bottom=0.4em, - before skip=0.5em, after skip=0.5em, - title={\acbold\color{popaction}\fontsize{8pt}{10pt}\selectfont ACTION{} \textperiodcentered{} \MakeUppercase{#1}}, - coltitle=popaction, - attach boxed title to top left={xshift=0.4em, yshift*=-0.35em}, - boxed title style={colback=white, frame hidden}, -} -\newcommand{\maction}[2]{% - \marginnote{\color{popaction}\fontsize{10pt}{12pt}\selectfont$\rightarrow$ \MakeUppercase{#1}}% - \begin{whistlepopaction}{#1}#2\end{whistlepopaction}% -} - -% Quote: block-quote, neutral gray rule on the left, no fill. -\newcommand{\mquote}[1]{% - \par\vspace{0.4em}% - \noindent - \begin{minipage}{\linewidth}% - \color{popquote}% - \hspace*{0pt}\hfill\begin{minipage}{0.92\linewidth}% - \itshape #1% - \end{minipage}\hfill\hspace*{0pt}% - \end{minipage}% - \par\vspace{0.4em}% -} - -% Margin note: a true sidenote, anchored at the call site. -\newcommand{\mnote}[1]{% - \marginnote{\fontsize{8pt}{10pt}\selectfont\color{popnote}\itshape #1}% -} - -% Freeform (unparsed directive): margin note tagged "[freeform]" so it's -% clear the parser couldn't match a verb — leaves the raw words for the -% human reader to interpret. -\newcommand{\mfreeform}[1]{% - \marginnote{\fontsize{8pt}{10pt}\selectfont\color{popnote}% - {\acmono\fontsize{6.5pt}{8pt}\selectfont [freeform]}\\#1}% -} - -% Skipped span: inline placeholder showing how long was removed from -% the body by a `skip` / `redact` whistlepop. -\newcommand{\mskipped}[1]{% - {\acmono\fontsize{8pt}{10pt}\selectfont\color{acgray}[\,skipped #1\,]}% -} - -% Start/end shaded range — wrap a span of turns in this environment. -\newenvironment{whistlepoprange}[1][highlight]{% - \par - \begin{tcolorbox}[enhanced, breakable, sharp corners, - colback=acsoft, colframe=pophighlight, - boxrule=0pt, leftrule=1.5pt, - left=0.4em, right=0.4em, top=0.2em, bottom=0.2em, - before skip=0.5em, after skip=0.5em]% -}{% - \end{tcolorbox}\par -} - -% === SECTION BREAK FROM LONE WHISTLE === -\newcommand{\whistlebreak}{% - \par\vspace{1.2em}% - \begin{center}% - {\color{acgray}\fontsize{12pt}{14pt}\selectfont$\sim$\hspace{0.4em}$\sim$\hspace{0.4em}$\sim$}% - \end{center}% - \vspace{0.6em}\par\noindent\ignorespaces% -} - -% === COLOPHON === -\newcommand{\meetingcolophon}{% - \par\vspace{2em}% - \noindent{\color{acgray}\rule{3em}{0.4pt}}\par - \vspace{0.4em}% - \noindent{\acmono\fontsize{7.5pt}{10pt}\selectfont\color{acgray}% - rendered by \texttt{meetings/cli.mjs build} \enspace·\enspace - transcript via WhisperX \enspace·\enspace - whistlepops via \texttt{detect-whistlepops.mjs}}\par -} - -% === LIST + PARAGRAPH === -\setlist[itemize]{leftmargin=1.4em, itemsep=0.2em, topsep=0.3em, parsep=0pt} -\setlist[enumerate]{leftmargin=1.4em, itemsep=0.2em, topsep=0.3em, parsep=0pt} -\setlength{\parindent}{0pt} -\setlength{\parskip}{0.3em} -\linespread{1.15} - -\tolerance=400 -\emergencystretch=2em -\hyphenpenalty=200 - -\endinput diff --git a/meetings/template/meeting.tex.tmpl b/meetings/template/meeting.tex.tmpl --- a/meetings/template/meeting.tex.tmpl +++ b/meetings/template/meeting.tex.tmpl @@ -1,18 +1,10 @@ % !TEX program = xelatex % Template substituted by meetings/cli.mjs build — placeholder names are % wrapped in double curly braces (see cli.mjs cmdBuild for the list). -% Do not document the placeholders inline here; the substitution is -% literal string-replace and would corrupt the comments. +% Do not document the placeholders inline here; substitution is literal +% string-replace and would corrupt comments. -\documentclass[11pt,letterpaper]{article} - -\usepackage[ - paperwidth=8.5in, paperheight=11in, - top=0.9in, bottom=0.9in, - inner=0.9in, outer=2.6in, - marginparwidth=1.8in, marginparsep=0.2in, - twoside=false, -]{geometry} +\documentclass[11pt]{article} \usepackage{fontspec} \usepackage{unicode-math} @@ -23,13 +15,6 @@ BoldFont=lmroman10-bold, ItalicFont=lmroman10-italic, BoldItalicFont=lmroman10-bolditalic, ] -\setsansfont{Latin Modern Sans}[ - Extension=.otf, - UprightFont=lmsans10-regular, - BoldFont=lmsans10-bold, - ItalicFont=lmsans10-oblique, - BoldItalicFont=lmsans10-boldoblique, -] \usepackage{xcolor} \usepackage{hyperref} @@ -42,24 +27,16 @@ pdfsubject={meeting transcript}, pdfauthor={Aesthetic Computer · meetings/cli.mjs}, } -\usepackage{ac-meeting} +\usepackage{ac-meeting-cards} \begin{document} -\pagestyle{empty} -\meetingtitle{ {{TITLE}} } -\meetingmeta{ {{DATE}} }{ {{DURATION}} }{ {{PARTICIPANTS}} }{ source: {{SOURCE_WAV}} } +\meetingcover{ {{TITLE}} }{ {{DATE}} \enspace$\cdot$\enspace {{DURATION}} \enspace$\cdot$\enspace {{PARTICIPANTS}} }{ {{SOURCE_WAV}} } \begin{keyideas} -\begin{itemize} {{KEY_IDEAS}} -\end{itemize} \end{keyideas} -\vspace{1.5em} - {{BODY}} - -\meetingcolophon \end{document} -- tangled.sh