Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ All templates support **multi-language output** via the `{{language}}` placehold
| `article` | Single-column academic article with running heads and author affiliations | 0.4.0 |
| `audit-report` | Security and usage audit report with a band cover, severity-coded findings, risk matrix, fix roadmap and evidence catalogue | 0.1.0 |
| `book` | Long-form book layout with epigraphs and front matter | 0.3.0 |
| `consultation-report` | Written record of a paid consultation session: questions, findings, prioritised recommendations, resources, next steps and raw notes | 0.1.0 |
| `contract` | Services agreement layout with parties block, numbered clauses, annexes and signature block; clause text is for you to write | 0.1.0 |
| `cv` | Curriculum vitae — clean, ATS-friendly résumé | 0.2.0 |
| `general` | Editorial foundation for essays and other documents; serif type and spaced paragraphs | 0.4.0 |
Expand Down
Binary file added consultation-report/assets/pergamino.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
312 changes: 312 additions & 0 deletions consultation-report/main.tex
Original file line number Diff line number Diff line change
@@ -0,0 +1,312 @@
% Consultation report.
% Text in double braces is filled in when the project is created; the %
% comments say what to replace. Tectonic reads UTF-8 directly.
\documentclass[11pt,a4paper]{article}

\usepackage[{{language}}]{babel}
\usepackage[T1]{fontenc}
\usepackage[lining]{ebgaramond}
\usepackage[scale=0.92]{sourcesanspro}
\usepackage[scale=0.82]{sourcecodepro}
\usepackage{microtype}
\usepackage[a4paper,left=27mm,right=24mm,top=30mm,bottom=32mm,
headheight=14pt,headsep=14mm,footskip=14mm]{geometry}
\usepackage{xcolor}
\usepackage{enumitem}
\usepackage{fancyhdr}
\usepackage{titlesec}
\usepackage{needspace}
\usepackage{etoolbox}
\usepackage{booktabs}
\usepackage{array}
\usepackage{tabularx}
\usepackage{float}
\usepackage{graphicx}
\usepackage{lastpage}
\usepackage{tikz}
\usepackage[most]{tcolorbox}
\usepackage{url}
\usepackage{hyperref}

% Parchment texture for the cover; it also sits behind every page when the
% paper_texture placeholder is true (for documents read on screen). The image
% is stretched to the page height and cropped by the page edge, so it covers
% the page with no seam.
\usepackage{eso-pic}
\newcommand{\papertexture}{{{paper_texture}}}
\newcommand{\texturebg}{\AtPageLowerLeft{\makebox[\paperwidth][l]{%
\includegraphics[width=\paperheight,height=\paperheight]{assets/pergamino.jpg}}}}
\ifdefstring{\papertexture}{true}{\AddToShipoutPictureBG{\texturebg}}{}
\newcommand{\covertexture}{\ifdefstring{\papertexture}{true}{}{\AddToShipoutPictureBG*{\texturebg}}}

% Palette, defined once. The accent placeholder (garnet by default) drives
% rules and numbers. Priority tones are garnet, brass and graphite, and each
% badge also differs in form (solid, solid, outlined) so it reads in greyscale.
\definecolor{benchparchment}{HTML}{F4F0EA}
\definecolor{benchlamp}{HTML}{F6ECD2}
\definecolor{benchink}{HTML}{1D1510}
\definecolor{benchsepia}{HTML}{6B5A43}
\definecolor{benchgraphite}{HTML}{5D5852}
\definecolor{benchbrass}{HTML}{8A6A2C}
\definecolor{benchgarnet}{HTML}{87222C}
\colorlet{cronink}{benchink}
\definecolor{cronaccent}{HTML}{{{accent}}}
\colorlet{cronmuted}{benchsepia}
\colorlet{cronrule}{benchsepia!35!white}
\hypersetup{colorlinks=true,linkcolor=cronink,urlcolor=cronaccent,
citecolor=cronaccent,breaklinks=true,pdftitle={{{title}}},pdfauthor={{{consultant}}}}
\urlstyle{sf}

% Fixed labels. English defaults first, then one override block per language.
\newcommand{\lblClient}{Client}
\newcommand{\lblConsultant}{Consultant}
\newcommand{\lblSessionDate}{Session date}
\newcommand{\lblDuration}{Duration}
\newcommand{\lblSessionType}{Session type}
\newcommand{\lblReference}{Reference}
\newcommand{\lblClassification}{Classification}
\newcommand{\lblPreparedFor}{Prepared for}
\newcommand{\lblPreparedBy}{Prepared by}
\newcommand{\lblPage}{Page}
\newcommand{\lblOf}{of}
\newcommand{\lblDate}{Date}
\newcommand{\lblAttendees}{Attendees}
\newcommand{\lblFormat}{Format}
\newcommand{\lblTopics}{Topics}
\newcommand{\lblContext}{Context}
\newcommand{\lblObservation}{Observation}
\newcommand{\lblInsight}{Key insight}
\newcommand{\lblPriority}{Priority}
\newcommand{\lblEffort}{Effort}
\newcommand{\lblRecommendation}{Recommendation}
\newcommand{\lblprhigh}{High}
\newcommand{\lblprmedium}{Medium}
\newcommand{\lblprlow}{Low}
\newcommand{\lblefsmall}{Small}
\newcommand{\lblefmedium}{Medium}
\newcommand{\lbleflarge}{Large}
\newcommand{\lblResource}{Resource}
\newcommand{\lblLink}{Link}
\newcommand{\lblAction}{Action}
\newcommand{\lblOwner}{Owner}
\newcommand{\lblTarget}{Target date}
\newcommand{\lblowclient}{Client}
\newcommand{\lblowconsultant}{Consultant}
\newcommand{\lblGlance}{Session at a glance}
\newcommand{\lblQuestions}{Questions brought to the session}
\newcommand{\lblFound}{What we found}
\newcommand{\lblRecommendations}{Recommendations}
\newcommand{\lblResources}{Resources shared}
\newcommand{\lblNextSteps}{Next steps}
\newcommand{\lblNotes}{Notes taken during the session}
\newcommand{\lblFollowUp}{Follow-up}
\newcommand{\lblDefTitle}{Consultation report}
\newcommand{\lblDefOrg}{Example Consulting}
\newcommand{\lblDefConsultant}{Example Consultant}
\newcommand{\lblDefClient}{Example Client}
\newcommand{\lblDefDate}{12 November 2026}
\newcommand{\lblDefDuration}{90 minutes}
\newcommand{\lblDefType}{Advisory session}
\newcommand{\lblDefClass}{Confidential}
\newcommand{\lblDefBooking}{To book a follow-up session, write to [email protected] or use the booking link at example.org/book.}
\addto\captionsspanish{%
\renewcommand{\lblClient}{Cliente}
\renewcommand{\lblConsultant}{Consultor}
\renewcommand{\lblSessionDate}{Fecha de la sesión}
\renewcommand{\lblDuration}{Duración}
\renewcommand{\lblSessionType}{Tipo de sesión}
\renewcommand{\lblReference}{Referencia}
\renewcommand{\lblClassification}{Clasificación}
\renewcommand{\lblPreparedFor}{Preparado para}
\renewcommand{\lblPreparedBy}{Preparado por}
\renewcommand{\lblPage}{Página}
\renewcommand{\lblOf}{de}
\renewcommand{\lblDate}{Fecha}
\renewcommand{\lblAttendees}{Asistentes}
\renewcommand{\lblFormat}{Formato}
\renewcommand{\lblTopics}{Temas}
\renewcommand{\lblContext}{Contexto}
\renewcommand{\lblObservation}{Observación}
\renewcommand{\lblInsight}{Idea clave}
\renewcommand{\lblPriority}{Prioridad}
\renewcommand{\lblEffort}{Esfuerzo}
\renewcommand{\lblRecommendation}{Recomendación}
\renewcommand{\lblprhigh}{Alta}
\renewcommand{\lblprmedium}{Media}
\renewcommand{\lblprlow}{Baja}
\renewcommand{\lblefsmall}{Pequeño}
\renewcommand{\lblefmedium}{Medio}
\renewcommand{\lbleflarge}{Grande}
\renewcommand{\lblResource}{Recurso}
\renewcommand{\lblLink}{Enlace}
\renewcommand{\lblAction}{Acción}
\renewcommand{\lblOwner}{Responsable}
\renewcommand{\lblTarget}{Fecha objetivo}
\renewcommand{\lblowclient}{Cliente}
\renewcommand{\lblowconsultant}{Consultor}
\renewcommand{\lblGlance}{La sesión de un vistazo}
\renewcommand{\lblQuestions}{Preguntas planteadas en la sesión}
\renewcommand{\lblFound}{Lo que encontramos}
\renewcommand{\lblRecommendations}{Recomendaciones}
\renewcommand{\lblResources}{Recursos compartidos}
\renewcommand{\lblNextSteps}{Próximos pasos}
\renewcommand{\lblNotes}{Notas tomadas durante la sesión}
\renewcommand{\lblFollowUp}{Seguimiento}
\renewcommand{\lblDefTitle}{Informe de consultoría}
\renewcommand{\lblDefOrg}{Consultoría de ejemplo}
\renewcommand{\lblDefConsultant}{Consultor de ejemplo}
\renewcommand{\lblDefClient}{Cliente de ejemplo}
\renewcommand{\lblDefDate}{12 de noviembre de 2026}
\renewcommand{\lblDefDuration}{90 minutos}
\renewcommand{\lblDefType}{Sesión de asesoría}
\renewcommand{\lblDefClass}{Confidencial}
\renewcommand{\lblDefBooking}{Para reservar una sesión de seguimiento, usa el enlace example.org/book o escribe a [email protected].}}

% A value left at its English default follows the document language.
\newcommand{\localize}[3]{\ifstrequal{#1}{#2}{#3}{#1}}
% Report metadata, set once and reused by the cover, header and footer.
\newcommand{\RepTitle}{\localize{{{title}}}{Consultation report}{\lblDefTitle}}
\newcommand{\RepOrg}{\localize{{{organisation}}}{Example Consulting}{\lblDefOrg}}
\newcommand{\RepConsultant}{\localize{{{consultant}}}{Example Consultant}{\lblDefConsultant}}
\newcommand{\RepClient}{\localize{{{client}}}{Example Client}{\lblDefClient}}
\newcommand{\RepDate}{\localize{{{session_date}}}{12 November 2026}{\lblDefDate}}
\newcommand{\RepDuration}{\localize{{{duration}}}{90 minutes}{\lblDefDuration}}
\newcommand{\RepType}{\localize{{{session_type}}}{Advisory session}{\lblDefType}}
\newcommand{\RepRef}{{{reference}}}
\newcommand{\RepClass}{\localize{{{classification}}}{Confidential}{\lblDefClass}}
\newcommand{\RepBooking}{\localize{{{booking}}}{To book a follow-up session, write to [email protected] or use the booking link at example.org/book.}{\lblDefBooking}}
\newcommand{\RepLogo}{{{logo}}}
\let\placelogo\includegraphics

% Letterspacing does not work with xetex, so small caps carry the emphasis.
\renewcommand{\textls}[2][]{#2}
\newcommand{\caps}[1]{{\sffamily\scshape #1}}
\newcommand{\metalabel}[1]{{\sffamily\scriptsize\scshape\color{cronmuted}#1}}

% Page style: running head on top, classification and page count below.
\fancypagestyle{cron}{%
\fancyhf{}
\fancyhead[L]{\small\caps{\RepClient}}
\fancyhead[R]{\small\itshape\RepTitle\ \textperiodcentered\ \RepRef}
\fancyfoot[L]{\small\caps{\RepClass}}
\fancyfoot[R]{\small\sffamily\lblPage\ \thepage\ \lblOf\ \pageref{LastPage}}
\renewcommand{\headrulewidth}{0.4pt}
\renewcommand{\footrulewidth}{0.4pt}
\renewcommand{\headrule}{\hbox to\headwidth{\color{cronrule}\leaders\hrule height \headrulewidth\hfill}}
\renewcommand{\footrule}{\hbox to\headwidth{\color{cronrule}\leaders\hrule height \footrulewidth\hfill}}}
\pagestyle{cron}
\fancypagestyle{plain}{\pagestyle{cron}}

% Headings.
\titleformat{\section}{\normalfont\fontsize{20}{24}\selectfont\color{cronink}}
{\textcolor{cronaccent}{\thesection}}{0.7em}{}[{\vspace{3pt}\color{cronrule}\titlerule}]
\titlespacing*{\section}{0pt}{2.2\baselineskip}{1\baselineskip}
\titleformat{\subsection}{\sffamily\bfseries\normalsize\color{cronink}}
{\textcolor{cronaccent}{\thesubsection}}{0.7em}{}
\titlespacing*{\subsection}{0pt}{1.4\baselineskip}{0.4\baselineskip}

\frenchspacing
\let\origsection\section
\let\origsubsection\subsection
\renewcommand{\subsection}{\Needspace{6\baselineskip}\origsubsection}
\renewcommand{\section}{\needspace{8\baselineskip}\origsection}
\setlength{\parindent}{0pt}
\setlength{\parskip}{0.6\baselineskip}
\setlength{\emergencystretch}{2em}
\renewcommand{\arraystretch}{1.25}
\setlist{leftmargin=1.5em,itemsep=2pt,topsep=3pt,parsep=0pt}
\setlist[itemize]{label={\color{cronaccent}\textbullet}}
\setlist[enumerate]{label={\sffamily\bfseries\color{cronaccent}\arabic*.},leftmargin=1.8em,itemsep=4pt}

% Cells start flush: no paragraph skip inside tables.
\AtBeginEnvironment{tabularx}{\setlength{\parskip}{0pt}}

% Priority badges: solid garnet, solid brass, outlined graphite.
\newcommand{\prioritybadge}[1]{\csname prbadge#1\endcsname}
\newcommand{\prbadgehigh}{\tcbox[on line,enhanced,colback=benchgarnet,colframe=benchgarnet,
boxrule=0.6pt,arc=2pt,left=5pt,right=5pt,top=1.5pt,bottom=1.5pt,boxsep=0pt,
fontupper=\sffamily\scriptsize\bfseries\scshape\color{white}]{\lblprhigh}}
\newcommand{\prbadgemedium}{\tcbox[on line,enhanced,colback=benchbrass,colframe=benchbrass,
boxrule=0.6pt,arc=2pt,left=5pt,right=5pt,top=1.5pt,bottom=1.5pt,boxsep=0pt,
fontupper=\sffamily\scriptsize\bfseries\scshape\color{white}]{\lblprmedium}}
\newcommand{\prbadgelow}{\tcbox[on line,enhanced,colback=white,colframe=benchgraphite,
boxrule=0.6pt,arc=2pt,left=5pt,right=5pt,top=1.5pt,bottom=1.5pt,boxsep=0pt,
fontupper=\sffamily\scriptsize\bfseries\scshape\color{benchgraphite}]{\lblprlow}}
\newcommand{\effortlabel}[1]{{\sffamily\small\csname lblef#1\endcsname}}
\newcommand{\ownerlabel}[1]{{\sffamily\small\csname lblow#1\endcsname}}

% Parts inside a finding: small accent captions.
\newcommand{\findingpart}[1]{\par\needspace{4\baselineskip}\vspace{2pt}{\sffamily\scriptsize\scshape\bfseries
\color{cronaccent}#1}\par\vspace{-3pt}}

% Key insight callout: a tinted panel with a brass bar.
\tcbset{cronbox/.style={enhanced,breakable,colback=#1!7,colframe=#1!7,
boxrule=0pt,arc=0pt,outer arc=0pt,borderline west={2.4pt}{0pt}{#1},
left=11pt,right=10pt,top=7pt,bottom=7pt,before skip=9pt,after skip=9pt,
fonttitle=\sffamily\scriptsize\scshape\bfseries,coltitle=#1,
attach boxed title to top left={xshift=-1pt,yshift=-1pt},
boxed title style={empty,left=0pt,top=0pt,bottom=0pt}}}
\newtcolorbox{insight}{cronbox=benchbrass,title={\lblInsight}}

% Raw notes: a quiet block, graphite sans type, thin rule on the left.
\newenvironment{rawnotes}
{\begin{tcolorbox}[enhanced,breakable,colback=white,colframe=white,boxrule=0pt,
arc=0pt,borderline west={0.8pt}{0pt}{cronrule},left=12pt,right=4pt,top=2pt,bottom=2pt,
before skip=4pt,after skip=4pt]
\sffamily\small\color{benchgraphite}\setlength{\parskip}{3pt}
\setlist[itemize]{label={\color{benchgraphite}--},leftmargin=1.2em,itemsep=1pt}}
{\end{tcolorbox}}

% Table helpers. \recrow{n}{title}{rationale}{high|medium|low}{small|medium|large}
\newcommand{\recrow}[5]{{\sffamily\bfseries\color{cronaccent}#1} &
\textbf{#2}\par{\small\color{cronmuted}#3} & \prioritybadge{#4} & \effortlabel{#5} \\[3pt]}
% \actrow{action}{client|consultant}{target date}
\newcommand{\actrow}[3]{#1 & \ownerlabel{#2} & {\sffamily\small #3} \\}
% \resrow{resource}{url}
\newcommand{\resrow}[2]{#1 & {\small\url{#2}} \\}

\begin{document}

% Cover: title block framed by garnet rules on the parchment.
\begingroup
\thispagestyle{empty}
\covertexture
\noindent\begin{minipage}[t][\dimexpr\textheight-2\baselineskip\relax][t]{\textwidth}
\begin{tikzpicture}[remember picture,overlay]
\node[anchor=north west,inner sep=0pt,fill=benchgarnet,minimum width=\paperwidth,
minimum height=2.4mm] at ([yshift=-22mm]current page.north west) {};
\node[anchor=north west,inner sep=0pt,fill=benchgarnet,minimum width=\paperwidth,
minimum height=0.9mm] at ([yshift=-132mm]current page.north west) {};
\node[anchor=north west,inner sep=0pt,fill=benchgarnet,minimum width=\paperwidth,
minimum height=0.35mm] at ([yshift=-134mm]current page.north west) {};
\end{tikzpicture}\par\nointerlineskip
\raggedright\color{cronink}
\vspace*{2mm}
\IfFileExists{\RepLogo}{\placelogo[height=12mm]{\RepLogo}\par\vspace{5mm}}{}
{\large\color{cronmuted}\caps{\RepOrg}\par}
\vspace{18mm}
{\sffamily\small\scshape\color{cronaccent}\RepType\par}
\vspace{4mm}
{\fontsize{38}{42}\selectfont\RepTitle\par}
\vspace{6mm}
{\fontsize{16}{20}\selectfont\itshape\color{cronmuted}\lblPreparedFor\ \RepClient\par}
\vspace{40mm}\color{cronink}
\begin{tabular}{@{}p{5.6cm}p{5.6cm}@{}}
\metalabel{\lblClient} & \metalabel{\lblConsultant} \\[2pt]
\RepClient & \RepConsultant \\[18pt]
\metalabel{\lblSessionDate} & \metalabel{\lblDuration} \\[2pt]
\RepDate & \RepDuration \\[18pt]
\metalabel{\lblSessionType} & \metalabel{\lblReference} \\[2pt]
\RepType & \RepRef \\[18pt]
\metalabel{\lblClassification} & \\[2pt]
{\sffamily\small\scshape\bfseries\color{benchgarnet}\RepClass} & \\
\end{tabular}
\vfill
{\color{cronmuted}\small\lblPreparedBy\ \RepConsultant, \RepOrg\par}
\end{minipage}
\endgroup
\clearpage

\input{sections/{{language}}}

\end{document}
Loading
Loading