Issue #3613189: Render the PDF ticket document through a theme template
The page around the tickets was assembled in PHP: TicketBuilder::document() concatenated a doctype, a head with a hand-built stylesheet string, and a body, joining ticket bodies with a page-break div. The ticket itself was already a Twig template, so the inner markup was themeable while the page around it was not.
What changes
A yoyaku_ticket_document theme hook and its yoyaku-ticket-document.html.twig template now own the page: the document shell, the print styles, and the page break between tickets. document() renders that theme hook and returns the HTML, so nothing about the printed page is built by string concatenation any more.
The styles stay inline, in a <style> element, because a PDF renderer draws this HTML on its own and never fetches the site's stylesheets, so an attached library would be dropped. The summary's mail template carries its styles for the same reason. The template documents this, and points at @page for margins.
ticketBody() becomes ticketElement() and returns the yoyaku_ticket render array unrendered, so the document template prints each ticket in place. The whole page is now one render pass instead of one per ticket plus a concatenation, which also means metadata bubbles once.
Behaviour is unchanged: same styles, same break between tickets and none after the last, same combinedPdf() and per-ticket documents() output.
Tests: two new, both asserting what the template is responsible for rather than the PDF bytes: the page shell (doctype, inline styles, exactly one break, positioned between the two tickets) and a single-ticket document carrying no break at all. The existing PDF tests still pass, 17 in the ticket suite. phpcs, phpstan and cspell clean.
No French strings: the template is structural and adds no translatable text.
Follow-up filed for theme suggestions on this and the summary templates.