Alertes personnalisées avec tcolorbox (+ Pandoc)
Après avoir réussi la création d'alerte avec le paquet `alertmessage`, j'ai essayé avec `tcolorbox`.
Je suis arrivée finalement très vite à un résultat, mais qui demande quelques ajustements.
Les avantages de `tcolorbox` :
- Beaucoup plus personnalisable,
- Permet autant d'alerte que l'on souhaite (`alertmessage` est limité à 4, alors que j'en ai 5),
- Compatibilité avec le Markdown et plus précisément le GFM, du coup avec tous mes futurs documents.
documents futurs.
Pour info, je souhaite proposer ce template sur Github, l'interopérabilité est donc bienvenue.
J'ai donc ce code dans le `template.tex` :
% =============================
% Alertes
% =============================
% Définition des couleurs
\definecolor{notecolor}{HTML}{183394}
\definecolor{tipcolor}{HTML}{339418}
\definecolor{importantcolor}{HTML}{FFC800}
\definecolor{warningcolor}{HTML}{FF7500}
\definecolor{cautioncolor}{HTML}{BD0404}
% Environnement pour les alertes
\newtcolorbox{alertbox}[3][]{
enhanced,
colframe=#2,
colback=gray!10,
coltitle=black,
rounded corners,
boxrule=0pt,
fonttitle=\bfseries,
left=10pt,
before upper={\includegraphics[width=12pt]{#3}\hspace{6pt}}
}
Et toujours un script Lua :
function BlockQuote(el)
if #el.content > 0 and el.content[1].t == "Para" then
local para = el.content[1]
if #para.content > 1 and para.content[1].t == "Image" then
local img = para.content[1]
-- Associe les images aux styles de box
local alert_types = {
["note.svg"] = {"notecolor", "note.svg"},
["lightbulb.svg"] = {"tipcolor", "lightbulb.svg"},
["important.svg"] = {"importantcolor", "important.svg"},
["warning.svg"] = {"warningcolor", "warning.svg"},
["fire.svg"] = {"cautioncolor", "fire.svg"}
}
local alert_data = alert_types[img.src:match("[^/]+$")]
if alert_data then
local color, icon = alert_data[1], alert_data[2]
-- Récupérer uniquement le texte après l’image
local message_parts = {}
for i = 2, #para.content do -- Ignore l'image
table.insert(message_parts, pandoc.utils.stringify(para.content[i]))
end
local message = table.concat(message_parts, " ")
return pandoc.RawBlock("latex", "\\begin{alertbox}{" .. color .. "}{" .. icon:gsub("%.svg", ".pdf") .. "}\n" .. message .. "\n\\end{alertbox}")
end
end
end
end
La commande Pandoc :
pandoc test.md --pdf-engine=lualatex --from markdown+hard_line_breaks+mark+emoji --metadata-file=metadata.yaml --template=template.tex --no-highlight --lua-filter=newpage.lua --lua-filter=alert.lua -o livre.pdf --pdf-engine-opt=--shell-escape
Les icônes au format svg ont été transformées en pdf, car le svg n'est pas compatible.
A priori, les modifications que je cherche à mettre en œuvre doivent être dans le script Lua et plus précisément sur la ligne du retour qui comprends la fonction `pandoc.RawBlock`.
Ce que je cherche à faire :
- Une taille d'icône plus grande (8mm)
- Une marge à droite de l'icône (3mm)
- Une bordure à droite, de la couleur de l'icône (0.5mm d'épaisseur)
- Le texte à gauche de l'icône justifié
- Icone et texte alignée sur la verticale en haut.
Image de référence ici : https://www.swisstransfer.com/d/df445e82-faa9-49ba-b2b2-47524cd57ac8
L'iA m'a donné ce genre de réponse pour atteindre ces objectifs :
return pandoc.RawBlock("latex", "\\begin{alertbox}{" .. color .. "}\n" ..
"\\begin{minipage}{\\linewidth}\n" ..
" \\raisebox{-0.1\\height}{\\includegraphics[width=8mm]{"
.. icon:gsub("%.svg", ".pdf") .. "}} % Icône\n" ..
" \\hspace{3mm} % Marge de 3mm\n" ..
" \\vrule width 0.5mm height 8mm % Ligne verticale\n" ..
" \\hspace{3mm} % Marge après la ligne\n" ..
" \\begin{minipage}{\\linewidth - 14mm} % Ajustement largeur texte\n" ..
" \\raggedright " .. message .. "\n" ..
" \\end{minipage}\n" ..
"\\end{minipage}\n" ..
"\\end{alertbox}\n")
Mais cela ne fonctionne pas du tout.