Tags: ,

Categories:

Updated:

As the self-declared nerdiest member of the organising committee of MCQMC 2026, I happily volunteered to build the programme book. Previous MCQMC conferences had developed LaTeX templates for talk and session submissions, along with Python code to read data from spreadsheets and produce LaTeX files that ultimately produce the programme.

My goal was instead to develop a purely TeX solution that avoids data duplication and uses text as data. The solution had to remain fully compatible with those templates — so that past submitters would find the format familiar — while also improving the tooling around them. The result is confschedule.

confschedule is a LaTeX package that automates the full pipeline from raw submission files to a typeset programme. It produces schedule grids, session and abstract listings, and a participant index, all generated from a single source of truth and all automatically cross-referenced. See an example.

The core idea

Each talk or session lives in its own .tex file — compatible with the format that submitters already used. The package ingests those files, builds an internal database of sessions, talks, and participants, and then typesets everything from it. The programme structure is written once; the package handles numbering, page references, and the participant index automatically.

A directory ingestion module written in Lua (process-submissions.lua) runs under LuaLaTeX. LuaLaTeX is optional, however: the pipeline can be driven entirely from TeX by calling \openSession, \closeSession, and \input directly. The Lua module is simply a convenience that scans a directory tree and emits those calls automatically.

Getting the files

The package is distributed as a .dtx file, the standard LaTeX format for documented sources. Running tex confschedule.dtx generates:

  • confschedule.sty — the package itself,
  • process-submissions.lua — the Lua directory processor,
  • talk-template.tex and session-template.tex — standalone submission templates for speakers and organisers.

Organising the submission files

Under a root folder (e.g. sessions/), each session gets its own subdirectory named by an identifier:

sessions/
  contrib-1/
    session.tex    % session metadata and description
    01.tex         % first talk
    02.tex         % second talk
    04.tex         % 03.tex absent: placeholder emitted automatically
  invited-1/
    session.tex
    01.tex
  plenaries/
    plenary01.tex

Files with leading digits (01.tex, 02.tex, …) are counted as talk slots. If a number is missing — because a speaker withdrew — the package automatically inserts a blank placeholder rather than silently renumbering everything else. Files without a leading digit (typically the session description file) are processed but do not advance the slot counter.

The session file

A session file uses the session environment. The body is the session description, which is reproduced verbatim in the programme. The interface accepts one organiser directly; additional organisers can be added with \addSessionOrganizer in the optional setup argument.

\begin{session}
  {Numerical Optimisation}     % session title
  {Jane Smith}                 % chair / first organiser
  {MIT}                        % affiliation
  {j.smith@mit.edu}            % email
  [\addSessionOrganizer{Second Organiser}{Affil}{email@uni.ac.uk}]
This session covers recent advances in first-order methods
for large-scale optimisation problems.
\end{session}

A talk file

A talk file uses the talk environment. The body is the abstract, reproduced verbatim in the abstract section of the programme:

\begin{talk}
  {A Fast Gradient Method}     % title
  {Alice Brown}                % speaker
  {Stanford University}        % affiliation
  {a.brown@stanford.edu}       % email
  {C.~White}                   % co-authors (empty if none)
  {}                           % special note (empty if none)
We present a gradient method achieving optimal complexity
for smooth strongly-convex objectives.
\end{talk}

Submission files are self-contained documents that compile independently to give a preview of how the abstract will appear in the programme — no access to the full programme source is required.

The main document

Here is a minimal but complete main document, showing the full pipeline from ingestion to typeset output:

\documentclass{book}
\usepackage{confschedule}

% Register session types: identifier, display label, background colour.
\defineSessionType{contrib}{Contributed Talk}{blue!15}
\defineSessionType{special}{Invited Talk}{green!20}
\defineSessionType{plenary}{Plenary}{orange!30}

\begin{document}

% Ingest all sessions under sessions/.
% Requires LuaLaTeX; omit this block and call \openSession/\closeSession
% manually to drive the pipeline from TeX.
\setDefaultSessionType{contrib}
\directlua{
  local proc = require("process-submissions")
  proc.process_root("sessions")
}

% Assign rooms; override colour or label for individual sessions.
\setSessionsData{plenary-1}{location={Auditorium}}
\setSessionsData{contrib-1, contrib-2}{location={Room A}}

% Add a session containing a single talk (e.g. a plenary).
\addSessionTalk[plenary]{plenary-1}{Chair Name}{plenaries/plenary01.tex}

\chapter{Programme}

\begin{schedule}{2}{Monday Morning}
  \scheduleEvent{gray!20}{09:00}{Registration and Coffee}
  \scheduleSessionTalk{10:00}{plenary-1}
  \scheduleEvent{gray!20}{11:00}{Coffee Break}
  \scheduleSessions{11:30-12:30}
    {11:30 -- 12:00, 12:00 -- 12:30}
    {contrib-1, contrib-2}
\end{schedule}

\chapter{Session Descriptions}
\renderSessions{contrib,special}

\chapter{Abstracts}
\renderTalks*{contrib,special}   % starred: include chair line per talk

\chapter{Participants}
\printParticipants

\end{document}

Key features

The full package documentation can be produced by running pdflatex on the .dtx file.

Schedule grids. The schedule environment produces a tabularx-based grid with a header row, full-width rows for plenary or standalone talks, and multi-column concurrent-session blocks. Each session type has its own background colour; alternating talk rows use configurable colours (clrScheduleOdd, clrScheduleEven). Page references to the abstract section are inserted automatically.

Session and abstract listings. \renderSessions{types} outputs sessions in schedule order, filtered by type. Each entry contains a coloured slot bar, a \subsection* title with a \label, the organiser list, the session description (re-input verbatim from the submission file), and a talk list with fill-to-right page references.

\renderTalks{types} (or \renderTalks*{types} for the starred form, which adds a chair line) renders non-cancelled talk abstracts in schedule order, also filtered by type.

Participant index. Every speaker, session organiser, and anyone registered via \addParticipant is stored in a unified database. Names are normalised automatically: Alice Brown and Brown, Alice resolve to the same entry. \printParticipants typesets an alphabetically sorted two-column list with affiliations, emails, and page references to each person’s sessions and talks. The starred form \printParticipants* additionally lists each person’s scheduled slots — useful for a detailed programme booklet and for checking whether participants are double-booked.

Cancellations. If a speaker withdraws after the programme is set, adding [\cancelTalk] to the optional hook argument of their talk environment marks the talk as cancelled. It then appears with strikethrough in the schedule and is silently omitted from the abstract section. The speaker’s entry in the participant index is unaffected; \removeParticipant{email} suppresses them there too if needed.

Counts. The database can be queried anywhere in the document:

This conference features
\sessionCount{contrib,special} sessions,
\talkCount{contrib,special} contributed talks, and
\participantCount{} registered participants.

Colour customisation. Session type colours are set via \defineSessionType and can be overridden per session with \setSessionsData. The three schedule row colours (clrScheduleEmpty, clrScheduleOdd, clrScheduleEven) can be redefined with \definecolor or \colorlet before or after loading the package**.

Talk Withdrawals The package handles missing talks in two ways. If a speaker withdraws before the programme is finalised, deleting their file causes the package to emit a blank placeholder automatically, so that the slot numbering of remaining talks is unaffected.

If the withdrawal comes after the programme is set, \cancelTalk in the optional hook marks the talk without removing it from the source:

\begin{talk}
  {Convergence Rates}
  {Bob Green}{Cambridge}{b.green@cam.ac.uk}{}{}
  [\cancelTalk]
The abstract text is retained but will not appear in the programme.
\end{talk}