2025 Focused Update of the 2019 ESC/EAS Guidelines for the management of dyslipidaemias.

Searching the Web

2025 Focused Update ESC EAS Guidelines management dyslipidaemias

Searching PubMed

ESC EAS dyslipidaemia guidelines 2025 focused update

Searching PubMed

dyslipidaemia LDL-C targets cardiovascular risk 2025 guidelines

Reading Article

PMID: 40885687

Reading Article

PMID: 41785983

Reading Web Page

https://www.escardio.org/communities/councils/cardiology-pra…

Reading Web Page

https://reference.medscape.com/cc1/p10/dyslipidemia-guidelin…

I now have all the material needed for a thorough, well-structured summary. Here is the full overview:

2025 Focused Update of the 2019 ESC/EAS Guidelines for the Management of Dyslipidaemias

Published: September 2025 at ESC Congress in Madrid. Simultaneously published in the European Heart Journal (Eur Heart J 2025;46(42):4359-4378) and Atherosclerosis. Authors: Mach, Koskinas, Roeters van Lennep et al. PMID: 40885687
Important: This update does not replace the 2019 full guidelines - it refines specific areas where new evidence has emerged since 2019. An erratum was also published (PMID: 41932222).

What Has NOT Changed

The 2025 update strongly confirms the LDL-C targets and risk categories from 2019. The 2021 ESC prevention guidelines proposed a different, stepwise approach inconsistent with the 2019 lipid document - the 2025 update explicitly realigns with the 2019 graduated approach, not the 2021 stepwise model.

1. Cardiovascular Risk Stratification - SCORE2 and SCORE2-OP (Updated)

The most significant structural change is the replacement of the older SCORE model with:
ToolAge GroupWhat It Estimates
SCORE240-69 years10-year risk of fatal and non-fatal CV events
SCORE2-OP≥70 yearsSame, extended to age 89
Key differences from SCORE:
  • Captures both fatal and non-fatal atherosclerotic cardiovascular events (ASCVD)
  • Uses non-HDL cholesterol as the core lipid indicator (replaces total cholesterol)
  • Updated country-specific risk cluster calibrations
  • Risk stratification: Class I, Level B

Risk Categories and LDL-C Targets (Confirmed from 2019)

Risk CategorySCORE2/SCORE2-OPLDL-C Target
Low<2%<3.0 mmol/L (<116 mg/dL)
Moderate2-10%<2.6 mmol/L (<100 mg/dL)
High10-20%<1.8 mmol/L (<70 mg/dL) + ≥50% reduction
Very High>20%, or established ASCVD<1.4 mmol/L (<55 mg/dL) + ≥50% reduction
ExtremeRecurrent ACS/very high-risk FH<1.0 mmol/L (<40 mg/dL)

Risk Modifiers (New Emphasis)

Certain factors can upgrade risk classification, especially for patients near treatment thresholds:
  • Subclinical coronary atherosclerosis on imaging or elevated CAC score by CT
  • hs-CRP >2 mg/L
  • Lp(a) >50 mg/dL (>105 nmol/L) - now formally recognized as a cardiovascular risk factor
  • Hypertriglyceridaemia - also now flagged as an additional risk factor
Note: Atrial fibrillation, LV hypertrophy, and CKD were removed from the updated risk modifier list.

2. LDL-C Lowering Therapies - New Agents Added

Treatment Hierarchy (Confirmed)

Statins remain first-line. The update adds two new agents and provides clearer combination therapy pathways.

New Agent 1: Bempedoic Acid

Bempedoic acid is an oral ATP-citrate lyase inhibitor that blocks cholesterol synthesis upstream of HMG-CoA reductase (and therefore does not cause myopathy, since it requires activation only in hepatocytes, not muscle).
IndicationRecommendation
Patients unable to take statinsClass I, Level B
Add-on to max-tolerated statin ± ezetimibe in high-risk patients not at LDL goalClass IIa, Level C

New Agent 2: Evinacumab

Evinacumab is an anti-ANGPTL3 monoclonal antibody.
  • Indicated for Homozygous Familial Hypercholesterolaemia (HoFH) aged ≥5 years who have not reached LDL-C goal despite other therapy
  • Class IIa, Level B

Confirmed Non-statin Agents with Proven CV Benefit

When LDL-C goals are not achieved on maximum tolerated statin, the following can be used alone or in combination:
  • Ezetimibe
  • PCSK9 monoclonal antibodies (evolocumab, alirocumab)
  • Bempedoic acid (newly added)

3. Acute Coronary Syndrome (ACS) - Early Intensive Therapy (New Emphasis)

Two key new recommendations specifically address in-hospital initiation:
  1. Intensification during index hospitalization (Class I, Level C): For patients already on lipid-lowering therapy before ACS admission, therapy should be appropriately intensified based on how much additional LDL-C lowering is needed.
  2. Combination therapy at index hospitalization (Class IIa, Level B): For lipid-lowering naive patients presenting with ACS, initiating high-intensity statin + ezetimibe during index hospitalization should be considered when the LDL-C goal is not expected to be achieved with statin alone.
The philosophy is early, non-stepwise, combination therapy rather than waiting to see the effect of monotherapy first.

4. Hypertriglyceridaemia - New Recommendations

DrugIndicationRecommendation
Icosapent ethyl (omega-3 fatty acid)High/very high-risk patients with elevated triglycerides on a statinClass IIa, Level B
Volanesorsen (RNA-targeted therapy against APOC3)Familial chylomicronaemia syndrome with severe hypertriglyceridaemia, to reduce pancreatitis riskClass IIa, Level B

5. Special Populations - New Guidance

HIV

  • Statin therapy is now recommended for people ≥40 years living with HIV (Class I)
  • Reflects their elevated baseline ASCVD risk and evidence for statin benefit in this group

Cancer / Cardio-oncology

  • Statins are recommended for patients at risk of cancer therapy-related CV toxicity
  • Reflects growing evidence in the cardio-oncology space

6. What Was Explicitly Dropped

  • Dietary supplements and vitamins: Explicitly not recommended for LDL-C reduction. This reverses some prior ambiguity - supplements (e.g., red yeast rice, plant sterols in supplement form, berberine) have insufficient CV outcome evidence and are not to be used in place of proven pharmacotherapy.

Summary of Key New vs. Confirmed Recommendations

Domain2019 Status2025 Update
Risk modelSCORE (fatal events only)SCORE2 / SCORE2-OP (fatal + non-fatal)
LDL-C targetsSetConfirmed unchanged
Bempedoic acidNot includedClass I (statin-intolerant); IIa (add-on)
EvinacumabNot includedClass IIa for HoFH ≥5 years
ACS - combination therapyRecommendedEarlier and more explicit in-hospital initiation
Icosapent ethylMentionedClass IIa for high/very-high risk + elevated TG
VolanesorsenNot includedClass IIa for familial chylomicronaemia
HIV patientsLimited guidanceStatins recommended ≥40 years
Cancer patientsLimited guidanceStatins recommended for cardio-oncology
Dietary supplementsAmbiguousExplicitly NOT recommended
Lp(a)Risk modifierStrengthened: >50 mg/dL formally a risk factor

Key Clinical Bottom Line

The 2025 ESC/EAS Focused Update can be summarised in three priorities:
  1. Assess risk better - use SCORE2/SCORE2-OP and incorporate risk modifiers (Lp(a), CAC, hs-CRP, hypertriglyceridaemia)
  2. Start therapy earlier and more intensively - especially in ACS (combination therapy from day 1 of hospitalization)
  3. More pharmacological tools - bempedoic acid and evinacumab fill gaps for statin-intolerant patients and HoFH, while icosapent ethyl and volanesorsen expand hypertriglyceridaemia management
A detailed review is also available in: Pradhan A et al., Am J Cardiol 2026 PMID: 41785983.

Since this is a... ... um, update to the 2019 lipid guidelines, uh, please also include the 2019 lipid guidelines along with the 20-- latest ESC update and create a joint notes, uh... Uh, for me, a-also... No, that's it.

Asking for Preferences
Searching the Web

2019 ESC EAS Guidelines management dyslipidaemias full recommendations LDL targets risk categories pharmacotherapy

Reading File
Searching PubMed

ESC EAS dyslipidaemia guidelines 2019 LDL cholesterol cardiovascular risk

Reading Web Page

https://www.acc.org/latest-in-cardiology/ten-points-to-remem…

Reading File
Running Command

mkdir -p /home/daytona/workspace/dyslipidaemia-notes && echo "Directory ready"

Writing File

~/dyslipidaemia-notes/build_pdf.py

from reportlab.lib.pagesizes import A4
from reportlab.lib import colors
from reportlab.lib.units import cm
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.enums import TA_CENTER, TA_LEFT, TA_JUSTIFY
from reportlab.platypus import (
    SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle,
    PageBreak, HRFlowable, KeepTogether
)
from reportlab.platypus.tableofcontents import TableOfContents
from reportlab.lib.colors import HexColor
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont
import os

OUTPUT = "/home/daytona/workspace/dyslipidaemia-notes/ESC_EAS_Dyslipidaemia_Joint_Notes.pdf"

# ── Colour palette ──────────────────────────────────────────────────────────
NAVY      = HexColor("#0D3B66")
TEAL      = HexColor("#1A6B72")
AMBER     = HexColor("#E8A020")
LIGHT_BG  = HexColor("#F0F6FA")
HIGHLIGHT = HexColor("#FFF3CD")
UPDATE_BG = HexColor("#E8F4F0")
ROW_ALT   = HexColor("#EAF2F8")
WHITE     = colors.white
BLACK     = colors.black
DARK_GREY = HexColor("#333333")
MID_GREY  = HexColor("#666666")
BORDER    = HexColor("#C0C8D0")

# ── Document ─────────────────────────────────────────────────────────────────
doc = SimpleDocTemplate(
    OUTPUT, pagesize=A4,
    leftMargin=2*cm, rightMargin=2*cm,
    topMargin=2.5*cm, bottomMargin=2.5*cm,
    title="ESC/EAS Dyslipidaemia Guidelines – Joint Notes",
    author="Clinical Notes"
)

styles = getSampleStyleSheet()
W = A4[0] - 4*cm   # usable width

def make_style(name, parent="Normal", **kwargs):
    return ParagraphStyle(name, parent=styles[parent], **kwargs)

# Custom styles
s_cover_title = make_style("CoverTitle", fontSize=26, textColor=WHITE,
                            fontName="Helvetica-Bold", alignment=TA_CENTER,
                            spaceAfter=8, leading=32)
s_cover_sub = make_style("CoverSub", fontSize=13, textColor=HexColor("#D0E8F5"),
                          fontName="Helvetica", alignment=TA_CENTER, leading=18)
s_cover_note = make_style("CoverNote", fontSize=10, textColor=HexColor("#A0C4D8"),
                           fontName="Helvetica-Oblique", alignment=TA_CENTER)

s_h1 = make_style("H1", fontSize=16, textColor=WHITE, fontName="Helvetica-Bold",
                   spaceBefore=14, spaceAfter=4, leading=20)
s_h2 = make_style("H2", fontSize=13, textColor=NAVY, fontName="Helvetica-Bold",
                   spaceBefore=12, spaceAfter=4, borderPad=4)
s_h3 = make_style("H3", fontSize=11, textColor=TEAL, fontName="Helvetica-Bold",
                   spaceBefore=8, spaceAfter=3)
s_body = make_style("Body", fontSize=9.5, textColor=DARK_GREY, leading=14,
                     spaceAfter=5, alignment=TA_JUSTIFY)
s_bullet = make_style("Bullet", fontSize=9.5, textColor=DARK_GREY, leading=14,
                       leftIndent=14, firstLineIndent=-10, spaceAfter=3)
s_sub_bullet = make_style("SubBullet", fontSize=9, textColor=MID_GREY, leading=13,
                            leftIndent=28, firstLineIndent=-10, spaceAfter=2)
s_note = make_style("Note", fontSize=8.5, textColor=HexColor("#555555"),
                     fontName="Helvetica-Oblique", leading=12,
                     leftIndent=10, spaceAfter=4)
s_caption = make_style("Caption", fontSize=8, textColor=MID_GREY,
                        fontName="Helvetica-Oblique", alignment=TA_CENTER)
s_update = make_style("Update", fontSize=9, textColor=HexColor("#0A4A3A"),
                       fontName="Helvetica", leading=13, leftIndent=10,
                       spaceAfter=3)
s_toc_h = make_style("TocH", fontSize=10, textColor=NAVY, fontName="Helvetica-Bold",
                      spaceAfter=2, leading=14)
s_footer = make_style("Footer", fontSize=7.5, textColor=MID_GREY,
                       fontName="Helvetica-Oblique", alignment=TA_CENTER)

def b(text): return f"<b>{text}</b>"
def i(text): return f"<i>{text}</i>"
def bullet(text, style=s_bullet): return Paragraph(f"&#8226;  {text}", style)
def subbullet(text): return Paragraph(f"&#9702;  {text}", s_sub_bullet)
def h2(text): return Paragraph(text, s_h2)
def h3(text): return Paragraph(text, s_h3)
def body(text): return Paragraph(text, s_body)
def note(text): return Paragraph(f"<i>{text}</i>", s_note)
def sp(h=6): return Spacer(1, h)
def hr(): return HRFlowable(width="100%", thickness=0.5, color=BORDER, spaceAfter=6, spaceBefore=4)

def section_header(text):
    """Navy banner heading."""
    data = [[Paragraph(text, s_h1)]]
    t = Table(data, colWidths=[W])
    t.setStyle(TableStyle([
        ("BACKGROUND", (0,0), (-1,-1), NAVY),
        ("TOPPADDING",    (0,0), (-1,-1), 8),
        ("BOTTOMPADDING", (0,0), (-1,-1), 8),
        ("LEFTPADDING",   (0,0), (-1,-1), 12),
        ("RIGHTPADDING",  (0,0), (-1,-1), 12),
        ("ROUNDEDCORNERS", [4]),
    ]))
    return t

def update_box(text):
    """Green tinted box for 2025 update highlights."""
    data = [[Paragraph(f"<b>2025 UPDATE</b>  {text}", s_update)]]
    t = Table(data, colWidths=[W])
    t.setStyle(TableStyle([
        ("BACKGROUND", (0,0), (-1,-1), UPDATE_BG),
        ("TOPPADDING",    (0,0), (-1,-1), 6),
        ("BOTTOMPADDING", (0,0), (-1,-1), 6),
        ("LEFTPADDING",   (0,0), (-1,-1), 10),
        ("RIGHTPADDING",  (0,0), (-1,-1), 10),
        ("BOX", (0,0), (-1,-1), 1, TEAL),
        ("ROUNDEDCORNERS", [3]),
    ]))
    return t

def highlight_box(text, bg=HIGHLIGHT):
    data = [[Paragraph(text, s_body)]]
    t = Table(data, colWidths=[W])
    t.setStyle(TableStyle([
        ("BACKGROUND", (0,0), (-1,-1), bg),
        ("TOPPADDING",    (0,0), (-1,-1), 6),
        ("BOTTOMPADDING", (0,0), (-1,-1), 6),
        ("LEFTPADDING",   (0,0), (-1,-1), 10),
        ("RIGHTPADDING",  (0,0), (-1,-1), 10),
        ("BOX", (0,0), (-1,-1), 1, AMBER),
        ("ROUNDEDCORNERS", [3]),
    ]))
    return t

def make_table(headers, rows, col_widths=None, alt_rows=True):
    if col_widths is None:
        col_widths = [W / len(headers)] * len(headers)
    header_row = [Paragraph(b(h), make_style("TH", fontSize=9, textColor=WHITE,
                              fontName="Helvetica-Bold", alignment=TA_CENTER,
                              leading=12)) for h in headers]
    data = [header_row]
    for row in rows:
        data.append([Paragraph(str(cell), make_style("TD", fontSize=8.8,
                                textColor=DARK_GREY, leading=12)) for cell in row])
    t = Table(data, colWidths=col_widths, repeatRows=1)
    ts = [
        ("BACKGROUND",    (0,0), (-1,0),  NAVY),
        ("GRID",          (0,0), (-1,-1), 0.4, BORDER),
        ("TOPPADDING",    (0,0), (-1,-1), 5),
        ("BOTTOMPADDING", (0,0), (-1,-1), 5),
        ("LEFTPADDING",   (0,0), (-1,-1), 6),
        ("RIGHTPADDING",  (0,0), (-1,-1), 6),
        ("VALIGN",        (0,0), (-1,-1), "TOP"),
        ("ROWBACKGROUNDS", (0,1), (-1,-1), [WHITE, ROW_ALT] if alt_rows else [WHITE]),
    ]
    t.setStyle(TableStyle(ts))
    return t

# ═══════════════════════════════════════════════════════════════════════════
# BUILD STORY
# ═══════════════════════════════════════════════════════════════════════════
story = []

# ── COVER PAGE ──────────────────────────────────────────────────────────────
cover_bg = Table([[""]], colWidths=[W + 4*cm], rowHeights=[A4[1]])
cover_bg.setStyle(TableStyle([("BACKGROUND", (0,0), (-1,-1), NAVY)]))

story.append(Spacer(1, 3*cm))
story.append(Paragraph("ESC / EAS GUIDELINES", s_cover_sub))
story.append(Spacer(1, 0.4*cm))
story.append(Paragraph("Management of Dyslipidaemias", s_cover_title))
story.append(Spacer(1, 0.3*cm))
story.append(Paragraph("Joint Comprehensive Clinical Notes", s_cover_sub))
story.append(Spacer(1, 1*cm))

# Subtitle bar
bar_data = [[Paragraph("2019 Full Guidelines  &#8226;  2025 Focused Update", make_style(
    "BarText", fontSize=12, textColor=WHITE, fontName="Helvetica-Bold",
    alignment=TA_CENTER))]]
bar = Table(bar_data, colWidths=[W])
bar.setStyle(TableStyle([
    ("BACKGROUND",    (0,0), (-1,-1), TEAL),
    ("TOPPADDING",    (0,0), (-1,-1), 10),
    ("BOTTOMPADDING", (0,0), (-1,-1), 10),
]))
story.append(bar)
story.append(Spacer(1, 0.8*cm))
story.append(Paragraph(
    "Mach F, Koskinas KC, Roeters van Lennep JE et al. | "
    "Eur Heart J 2019 &amp; 2025  |  Atherosclerosis 2025",
    s_cover_note))
story.append(Spacer(1, 0.4*cm))
story.append(Paragraph(
    "PMID: 31504573 (2019)  &#8226;  PMID: 40885687 (2025 Update)",
    s_cover_note))
story.append(Spacer(1, 2*cm))
story.append(Paragraph(
    "These notes integrate the 2019 ESC/EAS full guidelines with the 2025 Focused Update. "
    "Sections marked <b>2025 UPDATE</b> reflect new or changed recommendations published at "
    "ESC Congress 2025, Madrid. Unchanged 2019 content is presented in full.",
    make_style("CoverBody", fontSize=10, textColor=HexColor("#B0CCE0"),
               alignment=TA_CENTER, leading=15)))
story.append(PageBreak())

# ── TABLE OF CONTENTS (manual) ───────────────────────────────────────────────
story.append(section_header("Table of Contents"))
story.append(sp(10))

toc_items = [
    ("1.", "Overview and Scope"),
    ("2.", "Cardiovascular Risk Assessment"),
    ("3.", "LDL-C Targets by Risk Category"),
    ("4.", "Lipid Measurements and Biomarkers"),
    ("5.", "Lifestyle Interventions"),
    ("6.", "Pharmacological LDL-C Lowering"),
    ("7.", "Non-LDL Lipid Management"),
    ("8.", "Familial Hypercholesterolaemia (FH)"),
    ("9.", "Acute Coronary Syndrome (ACS)"),
    ("10.", "Special Populations"),
    ("11.", "Key Drug Comparison Table"),
    ("12.", "Summary of 2025 Changes vs 2019"),
    ("13.", "Quick Reference Card"),
]
for num, title in toc_items:
    story.append(Paragraph(f"<b>{num}</b>  {title}", s_toc_h))
    story.append(sp(3))

story.append(PageBreak())

# ═══════════════════════════════════════════════════════════════════════════
# SECTION 1 – OVERVIEW
# ═══════════════════════════════════════════════════════════════════════════
story.append(section_header("1. Overview and Scope"))
story.append(sp(8))
story.append(body(
    "The ESC/EAS Dyslipidaemia Guidelines provide evidence-based recommendations for "
    "lipid management to reduce atherosclerotic cardiovascular disease (ASCVD) risk. "
    "The 2019 full guidelines (Mach F et al., Eur Heart J 2020;41:111-188) established "
    "the current framework of risk-based LDL-C targets and pharmacotherapy hierarchy. "
    "The <b>2025 Focused Update</b> (Mach F, Koskinas KC, Roeters van Lennep JE et al., "
    "Eur Heart J 2025;46(42):4359-4378) addresses specific areas where new evidence "
    "warranted updated recommendations – it does <b>not</b> replace the 2019 document."))
story.append(sp(4))

key_pts = [
    ("Core principle", "Lipid modification, primarily LDL-C lowering, is the cornerstone of ASCVD prevention. 'Lower is better' applies across all risk categories."),
    ("Risk-based approach", "Treatment targets and intervention thresholds are stratified by total cardiovascular risk (low / moderate / high / very high / extreme)."),
    ("2025 Update scope", "Only Class I, IIa, and III recommendations that warranted change based on evidence up to 31 March 2025 were revised."),
    ("What did NOT change", "LDL-C targets, the 4-tier risk category framework, statins as first-line therapy, and the general pharmacotherapy hierarchy remain identical to 2019."),
]
story.append(make_table(
    ["Domain", "Key Point"],
    key_pts,
    col_widths=[4*cm, W - 4*cm]
))
story.append(PageBreak())

# ═══════════════════════════════════════════════════════════════════════════
# SECTION 2 – CV RISK ASSESSMENT
# ═══════════════════════════════════════════════════════════════════════════
story.append(section_header("2. Cardiovascular Risk Assessment"))
story.append(sp(8))

story.append(h2("2.1  Risk Stratification – Overview"))
story.append(body(
    "Individuals are classified into four (now five with 'extreme') categories based on "
    "their estimated 10-year CV risk and the presence of specific high-risk conditions. "
    "Risk stratification determines both the LDL-C treatment target and when to initiate therapy."))
story.append(sp(4))

story.append(h2("2.2  Risk Scoring Systems"))
story.append(h3("2019: SCORE (Systematic COronary Risk Evaluation)"))
story.append(body(
    "The 2019 guidelines used the original <b>SCORE</b> algorithm, which estimated 10-year "
    "risk of <b>fatal cardiovascular events only</b> (not non-fatal). SCORE uses: age, sex, "
    "smoking status, systolic blood pressure, and total cholesterol. Country-specific charts "
    "were applied for low-risk and high-risk European regions."))
story.append(sp(3))

story.append(update_box(
    "SCORE replaced by <b>SCORE2</b> (ages 40-69) and <b>SCORE2-OP</b> (ages ≥70). "
    "These newer models estimate 10-year risk of BOTH fatal AND non-fatal CV events, "
    "use non-HDL cholesterol instead of total cholesterol, extend calculation up to age 89, "
    "and include updated country-specific risk cluster calibrations. "
    "<b>Class I, Level B</b> – mandatory for risk estimation in persons without known CVD."))
story.append(sp(6))

story.append(h2("2.3  Risk Categories"))
risk_cats = [
    [b("Extreme Risk"), "Recurrent ASCVD events (2nd event within 2 years on max tolerated therapy), OR polyvascular disease, OR very high-risk FH with ASCVD", b("<1.0 mmol/L\n(<40 mg/dL)")],
    [b("Very High Risk"), "Documented ASCVD (clinical or imaging); Diabetes with target organ damage or ≥3 major risk factors or early-onset T1DM >20 years; SCORE ≥10% (2019) / SCORE2 >20% (2025); Severe CKD (eGFR <30); HeFH with ASCVD or another major risk factor", b("<1.4 mmol/L\n(<55 mg/dL) + ≥50% reduction")],
    [b("High Risk"), "Markedly elevated single risk factors (TC >8 mmol/L, LDL-C >4.9 mmol/L, BP ≥180/110 mmHg); FH without other major risk factors; Moderate CKD (eGFR 30-59); T2DM without organ damage with duration ≥10 years or another risk factor; SCORE 5-9% / SCORE2 10-20%", b("<1.8 mmol/L\n(<70 mg/dL) + ≥50% reduction")],
    [b("Moderate Risk"), "SCORE 1-4% / SCORE2 2-10%; T1DM <35 yrs or T2DM <50 yrs with <10 years DM and no organ damage/risk factors", b("<2.6 mmol/L\n(<100 mg/dL)")],
    [b("Low Risk"), "SCORE <1% / SCORE2 <2%", b("<3.0 mmol/L\n(<116 mg/dL)")],
]
story.append(make_table(
    ["Risk Category", "Criteria", "LDL-C Target"],
    risk_cats,
    col_widths=[3.0*cm, W - 6.5*cm, 3.5*cm]
))
story.append(note(
    "* Extreme risk category introduced in 2025 update (consider LDL-C goal <1.0 mmol/L / <40 mg/dL)."))
story.append(sp(6))

story.append(h2("2.4  Risk Modifiers (2019 and 2025)"))
story.append(body(
    "Risk modifiers are conditions that upgrade a patient's risk category, particularly relevant "
    "for those in the moderate-risk group or near a treatment threshold."))
story.append(sp(3))
story.append(h3("2019 Risk Modifiers"))
for rm in [
    "Social deprivation",
    "Obesity and central obesity",
    "Physical inactivity",
    "Psychosocial stress (work, life)",
    "Family history of premature CVD",
    "Autoimmune disorders (e.g. rheumatoid arthritis, SLE, psoriasis)",
    "Major psychiatric disorders",
    "HIV infection",
    "Atrial fibrillation (AF)",
    "Left ventricular hypertrophy (LVH)",
    "Chronic kidney disease (CKD)",
    "Obstructive sleep apnoea",
    "Non-alcoholic fatty liver disease (NAFLD)",
    "Lp(a) ≥50 mg/dL",
    "hsCRP ≥2 mg/L",
    "ABI <0.9",
]:
    story.append(bullet(rm))
story.append(sp(4))

story.append(update_box(
    "2025 update refines risk modifiers: <b>Lp(a) >50 mg/dL (>105 nmol/L)</b> and "
    "<b>hypertriglyceridaemia</b> are now formally recognised as additional independent "
    "CV risk factors, not just modifiers. "
    "Subclinical coronary atherosclerosis on imaging and elevated <b>CAC score by CT</b> "
    "are now explicitly included as risk modifiers. "
    "<b>Removed</b> from modifier list: atrial fibrillation, left ventricular hypertrophy, CKD. "
    "hs-CRP >2 mg/L retained as a modifier."))
story.append(PageBreak())

# ═══════════════════════════════════════════════════════════════════════════
# SECTION 3 – LDL-C TARGETS
# ═══════════════════════════════════════════════════════════════════════════
story.append(section_header("3. LDL-C Targets by Risk Category"))
story.append(sp(8))
story.append(highlight_box(
    "<b>Core principle (unchanged 2019 → 2025):</b>  LDL-C targets remain identical. "
    "The 'lower is better' principle is strongly endorsed by Mendelian randomisation data "
    "and RCTs demonstrating incremental risk reduction at every level of LDL-C lowering. "
    "Both a percentage reduction AND an absolute target must be achieved in high/very-high/extreme risk."))
story.append(sp(8))

ldl_targets = [
    ["Low", "<2% (SCORE2)", "<3.0 mmol/L (<116 mg/dL)", "Consider drug if uncontrolled on lifestyle"],
    ["Moderate", "2-10% (SCORE2)", "<2.6 mmol/L (<100 mg/dL)", "Drug if LDL-C ≥2.6 despite lifestyle"],
    ["High", "10-20% (SCORE2)", "<1.8 mmol/L (<70 mg/dL)\n+ ≥50% reduction from baseline", "Drug intervention with lifestyle"],
    ["Very High", ">20% (SCORE2) or conditions above", "<1.4 mmol/L (<55 mg/dL)\n+ ≥50% reduction from baseline", "Immediate drug + lifestyle; combination if needed"],
    ["Extreme*", "Recurrent ACS / polyvascular / HoFH", "<1.0 mmol/L (<40 mg/dL)\nConsider if goal not reached", "Max intensity therapy; PCSK9i strongly considered"],
]
story.append(make_table(
    ["Risk Category", "10-yr Risk", "LDL-C Target", "Intervention"],
    ldl_targets,
    col_widths=[2.8*cm, 3.2*cm, 4.5*cm, W - 10.5*cm]
))
story.append(sp(4))
story.append(note("* Extreme risk category: added in 2025 Focused Update as a practical category for the highest-risk patients."))
story.append(sp(6))

story.append(h2("3.1  Non-HDL Cholesterol"))
story.append(body(
    "Non-HDL cholesterol (total cholesterol minus HDL-C) is a co-primary target in the "
    "2019 guidelines, particularly important in patients with hypertriglyceridaemia, "
    "diabetes, obesity, or metabolic syndrome. Non-HDL targets are 0.8 mmol/L "
    "(~30 mg/dL) higher than the corresponding LDL-C target. The 2025 SCORE2 model "
    "elevates non-HDL-C to be the core lipid variable in risk estimation (replacing total cholesterol)."))
story.append(sp(4))
story.append(h2("3.2  Apolipoprotein B (ApoB)"))
story.append(body(
    "ApoB ≥100 mg/dL corresponds to the very-high risk LDL-C goal. ApoB is preferred "
    "in patients where LDL-C calculation may be unreliable (e.g. high TG, diabetes). "
    "ApoB targets: <100 mg/dL (high risk), <80 mg/dL (very high risk), <65 mg/dL (extreme risk)."))
story.append(PageBreak())

# ═══════════════════════════════════════════════════════════════════════════
# SECTION 4 – LIPID MEASUREMENTS
# ═══════════════════════════════════════════════════════════════════════════
story.append(section_header("4. Lipid Measurements and Biomarkers"))
story.append(sp(8))
story.append(h2("4.1  Standard Lipid Profile"))
story.append(body(
    "A full fasting or non-fasting lipid profile includes: total cholesterol (TC), "
    "HDL-C, LDL-C (calculated via Friedewald or directly measured), triglycerides (TG), "
    "and non-HDL cholesterol. Non-fasting samples are acceptable for initial screening."))
story.append(sp(4))
story.append(h2("4.2  LDL-C Calculation"))
story.append(body(
    "<b>Friedewald equation</b>: LDL-C = TC - HDL-C - (TG/2.2) [mmol/L] or (TG/5) [mg/dL]. "
    "Unreliable when TG >4.5 mmol/L. In these cases, use direct LDL-C measurement or calculate "
    "non-HDL-C and ApoB as surrogates."))
story.append(sp(4))
story.append(h2("4.3  Lipoprotein(a) – Lp(a)"))
story.append(body(
    "Lp(a) should be measured at least once in each adult. It is an independent, largely "
    "genetically determined CV risk factor. Elevated Lp(a) substantially increases residual "
    "risk even at LDL-C goal."))
story.append(sp(3))
story.append(update_box(
    "<b>2025:</b> Lp(a) >50 mg/dL (>105 nmol/L) is now formally classified as an "
    "independent CV risk factor (upgraded from 'risk modifier'). Lp(a) is also "
    "included as a risk modifier for upgrading risk category in borderline patients. "
    "Dedicated Lp(a)-lowering therapies (e.g. pelacarsen, olpasiran) are in Phase 3 trials "
    "but not yet guideline-recommended."))
story.append(sp(6))
story.append(h2("4.4  High-sensitivity CRP (hs-CRP)"))
story.append(body(
    "hs-CRP ≥2 mg/L is a risk modifier supporting initiation of statin therapy in borderline "
    "moderate-risk patients (retained in 2025 update). It is not a lipid treatment target."))
story.append(sp(4))
story.append(h2("4.5  Coronary Artery Calcium (CAC) Score"))
story.append(update_box(
    "<b>2025:</b> CAC score by CT and detection of subclinical coronary atherosclerosis "
    "by imaging are now explicitly recommended as risk modifiers to improve risk classification "
    "in borderline cases. A CAC score >100 or >75th percentile generally upgrades risk."))
story.append(PageBreak())

# ═══════════════════════════════════════════════════════════════════════════
# SECTION 5 – LIFESTYLE
# ═══════════════════════════════════════════════════════════════════════════
story.append(section_header("5. Lifestyle Interventions"))
story.append(sp(8))
story.append(body(
    "Lifestyle modification is the foundation of dyslipidaemia management at all risk levels "
    "and should be implemented regardless of drug therapy. These recommendations are unchanged "
    "in the 2025 update."))
story.append(sp(4))

story.append(h2("5.1  Diet"))
diet_items = [
    ("Saturated fat", "Reduce to <7% of total energy. Replace with unsaturated fats (PUFA preferentially over MUFA)."),
    ("Trans fats", "Minimise industrial trans fats (<1% of energy). Strongly associated with CVD."),
    ("Dietary cholesterol", "Limit to <300 mg/day. Eggs in moderation (≤6/week)."),
    ("Fruits and vegetables", "≥400 g/day. High fibre (soluble fibre 5-10 g/day lowers LDL-C by ~5%)."),
    ("Whole grains", "Replace refined grains. Associated with lower CVD risk."),
    ("Fish", "2-3 portions/week, including oily fish. Omega-3 fats reduce TG."),
    ("Nuts", "28-42 g/day associated with LDL-C reduction."),
    ("Plant sterols/stanols", "2 g/day reduces LDL-C by 10-15%. Available in enriched foods."),
    ("Alcohol", "Limit to ≤100 g/week. Alcohol raises TG; completely avoid in hypertriglyceridaemia."),
    ("Salt", "Reduce to <5 g/day – primarily targets blood pressure but reduces overall CV risk."),
]
story.append(make_table(
    ["Dietary Component", "Recommendation"],
    diet_items,
    col_widths=[4.5*cm, W - 4.5*cm]
))
story.append(sp(6))

story.append(h2("5.2  Physical Activity"))
for pa in [
    "Aerobic exercise: ≥150 min/week moderate intensity OR ≥75 min/week vigorous intensity",
    "Resistance training: 2 days/week additionally recommended",
    "Reduces TG by 10-20%, raises HDL-C by 3-5%, modest LDL-C reduction",
    "Reduces insulin resistance and improves metabolic syndrome components",
]:
    story.append(bullet(pa))
story.append(sp(4))

story.append(h2("5.3  Smoking"))
story.append(body(
    "Smoking cessation is the single most cost-effective CV risk reduction intervention. "
    "Cessation reduces total CV risk and partially improves HDL-C levels. All smoking "
    "cessation aids (NRT, varenicline, bupropion) are recommended."))
story.append(sp(4))

story.append(h2("5.4  Weight Management"))
story.append(body(
    "Obesity (BMI ≥30 kg/m²) and abdominal obesity (waist circumference >94 cm men, "
    ">80 cm women) are independent risk factors. Even modest weight loss (5-10%) improves "
    "the lipid profile: lowers TG, raises HDL-C, modestly reduces LDL-C."))
story.append(sp(4))

story.append(update_box(
    "<b>2025:</b> Dietary supplements and vitamins (including omega-3 supplements not from "
    "prescription icosapent ethyl, berberine, red yeast rice, coenzyme Q10, etc.) are "
    "<b>NOT recommended</b> for LDL-C reduction. They lack evidence for CV event reduction "
    "and should not substitute proven pharmacotherapy. Class III (no benefit/harm)."))
story.append(PageBreak())

# ═══════════════════════════════════════════════════════════════════════════
# SECTION 6 – PHARMACOLOGICAL LDL-C LOWERING
# ═══════════════════════════════════════════════════════════════════════════
story.append(section_header("6. Pharmacological LDL-C Lowering"))
story.append(sp(8))

story.append(h2("6.1  Statins (HMG-CoA Reductase Inhibitors) – First Line"))
story.append(body(
    "Statins are the cornerstone of LDL-C lowering therapy. They competitively inhibit "
    "HMG-CoA reductase, reducing hepatic cholesterol synthesis and upregulating LDL "
    "receptors. Statins have the most extensive CV outcome evidence of any lipid-lowering drug."))
story.append(sp(3))

statin_table = [
    ["Rosuvastatin 20-40 mg", "High", "45-55%", "CKD: preferred (not renally cleared)"],
    ["Atorvastatin 40-80 mg", "High", "40-50%", "Most widely used. Many drug interactions via CYP3A4"],
    ["Rosuvastatin 5-10 mg", "Moderate", "30-40%", "Lower-dose option"],
    ["Atorvastatin 10-20 mg", "Moderate", "30-40%", ""],
    ["Simvastatin 20-40 mg", "Moderate", "25-35%", "Avoid 80 mg dose (myopathy risk); multiple interactions"],
    ["Pravastatin 40-80 mg", "Moderate", "25-35%", "Safest in drug interactions; safe in pregnancy"],
    ["Fluvastatin 80 mg XL", "Moderate", "25-35%", "Less evidence for CV outcomes"],
    ["Pitavastatin 2-4 mg", "Moderate", "30-40%", "Minimal CYP450 interactions; preferred in HIV"],
    ["Lovastatin 40 mg", "Moderate", "25-35%", ""],
]
story.append(make_table(
    ["Drug / Dose", "Intensity", "LDL-C Reduction", "Notes"],
    statin_table,
    col_widths=[4.5*cm, 2.5*cm, 3*cm, W - 10*cm]
))
story.append(sp(3))
story.append(note(
    "Recommendation: Initiate the highest tolerated statin dose to achieve the LDL-C target "
    "for the patient's risk category. High-intensity statin ≥50% LDL-C reduction; "
    "moderate intensity 30-49%; low intensity <30%."))
story.append(sp(4))
story.append(h3("Statin Safety"))
for item in [
    "Myopathy/rhabdomyolysis: rare but serious; check CK if symptomatic. Risk higher with CYP3A4 interactions, hypothyroidism, renal failure.",
    "New-onset diabetes: small but real risk (~10-12% relative increase). Benefit greatly outweighs risk in high-risk patients.",
    "Liver enzyme elevation: usually mild and transient. Routine ALT monitoring not required unless symptomatic.",
    "Statin intolerance: defined as inability to tolerate ≥2 statins due to muscle/other AEs. True prevalence ~5-10%.",
]:
    story.append(bullet(item))
story.append(sp(6))

story.append(h2("6.2  Ezetimibe – Second Line / Add-on"))
story.append(body(
    "Ezetimibe inhibits NPC1L1 at the intestinal brush border, reducing cholesterol absorption. "
    "Lowers LDL-C by 15-20% as monotherapy. In combination with a statin, the reduction is "
    "additive (~25% additional reduction on top of statin effect)."))
story.append(sp(3))
story.append(body(
    "<b>IMPROVE-IT trial</b> (18,144 patients post-ACS): Simvastatin + ezetimibe vs "
    "simvastatin alone. LDL-C reduced to 1.37 mmol/L (53 mg/dL). Significant reduction "
    "in major CV events (HR 0.936, 95% CI 0.89-0.99). Confirmed the 'lower is better' hypothesis. "
    "<b>Recommendation: Class I, Level B</b> – if statin alone does not achieve LDL-C goal."))
story.append(sp(4))

story.append(h2("6.3  PCSK9 Inhibitors (Monoclonal Antibodies) – Powerful Add-on"))
story.append(body(
    "PCSK9 (proprotein convertase subtilisin/kexin type 9) promotes LDL receptor degradation. "
    "Inhibiting PCSK9 markedly increases LDL-receptor recycling and dramatically lowers LDL-C."))
story.append(sp(3))
pcsk9_table = [
    ["Evolocumab (Repatha)", "140 mg SC q2w or 420 mg SC monthly", "50-60%", "FOURIER trial: 15% relative risk reduction in major CV events"],
    ["Alirocumab (Praluent)", "75 mg or 150 mg SC q2w", "45-60%", "ODYSSEY OUTCOMES trial: 15% relative risk reduction; mortality benefit in highest-risk"],
]
story.append(make_table(
    ["Drug", "Dose", "LDL-C Reduction", "Key Trial"],
    pcsk9_table,
    col_widths=[3.5*cm, 4*cm, 3*cm, W - 10.5*cm]
))
story.append(sp(3))
story.append(body(
    "<b>Indications (Class I, Level A):</b>"))
story.append(bullet("Secondary prevention: very-high risk patients not at goal on maximum tolerated statin + ezetimibe"))
story.append(bullet("Very-high risk FH patients (HeFH or HoFH) not at LDL-C goal on maximum statin + ezetimibe"))
story.append(sp(4))

story.append(h2("6.4  Bempedoic Acid (NEW in 2025)"))
story.append(body(
    "Bempedoic acid inhibits ATP-citrate lyase (ACL), an enzyme upstream of HMG-CoA reductase "
    "in the cholesterol biosynthesis pathway. Critically, bempedoic acid requires activation "
    "by a hepatic enzyme (ACSVL1) that is absent in skeletal muscle – meaning it does NOT "
    "cause myopathy, making it an excellent option for statin-intolerant patients."))
story.append(sp(3))
story.append(body(
    "<b>CLEAR Outcomes trial</b> (13,970 statin-intolerant patients): Bempedoic acid 180 mg/day "
    "vs placebo. LDL-C reduction ~21%. Significant 13% relative reduction in MACE "
    "(HR 0.87, 95% CI 0.79-0.96). First CV outcome trial proving benefit for bempedoic acid."))
story.append(sp(3))

story.append(update_box(
    "<b>2025 Recommendations for Bempedoic Acid:</b>  "
    "(1) In patients who cannot use statins (statin-intolerant): bempedoic acid recommended "
    "to lower LDL-C – <b>Class I, Level B</b>.  "
    "(2) As add-on to maximum tolerated statin ± ezetimibe in high/very-high risk patients "
    "not at LDL-C goal – <b>Class IIa, Level C</b>.  "
    "Dose: 180 mg oral once daily. Available as monotherapy or fixed-dose combination "
    "with ezetimibe (Nilemdo/Nexlizet)."))
story.append(sp(4))

story.append(h2("6.5  Bile Acid Sequestrants (Resins)"))
story.append(body(
    "Cholestyramine, colestipol, colesevelam interrupt enterohepatic bile acid circulation, "
    "upregulating LDL receptors. Reduce LDL-C by 15-30%. GI tolerability limits use. "
    "Class IIb; mainly used as add-on in FH or statin-intolerant patients. "
    "Note: Interfere with absorption of many drugs."))
story.append(sp(4))

story.append(h2("6.6  Inclisiran (siRNA) – Class I in 2019, Emerging"))
story.append(body(
    "Inclisiran is a small interfering RNA that silences hepatic PCSK9 mRNA, reducing "
    "LDL-C by ~50% with dosing only twice per year (after initial doses at 0, 3 months). "
    "Endorsed in 2019 guidelines as an option for patients who cannot use statins or "
    "in combination. CV outcome data now available (ORION-4). Class I, Level A for "
    "secondary prevention in patients not at goal on statin + ezetimibe."))
story.append(sp(4))

story.append(h2("6.7  Evinacumab (NEW for HoFH in 2025)"))
story.append(update_box(
    "<b>2025:</b> Evinacumab (anti-ANGPTL3 monoclonal antibody) is now recommended for "
    "patients with <b>Homozygous FH (HoFH)</b> aged ≥5 years who have not reached their "
    "LDL-C goal on other therapies.  "
    "Mechanism: Inhibits ANGPTL3, activating both lipoprotein lipase and endothelial lipase, "
    "lowering LDL-C by ~50% even in patients with no functional LDL receptors (unique among "
    "lipid-lowering drugs).  "
    "<b>Class IIa, Level B.</b>"))
story.append(sp(4))

story.append(h2("6.8  Treatment Algorithm for LDL-C Lowering"))
algo = [
    ["Step 1", "Initiate lifestyle interventions for all patients"],
    ["Step 2", "Start high-intensity statin (maximise tolerated dose) aiming for LDL-C target"],
    ["Step 3", "If target not achieved on max statin → add Ezetimibe"],
    ["Step 4", "If target still not achieved → add PCSK9 inhibitor (or inclisiran)\n[or bempedoic acid as alternative if PCSK9i not tolerated/available]"],
    ["Step 5 (HoFH only)", "Add evinacumab if LDL-C target not achieved"],
    ["Statin-intolerant", "Bempedoic acid (Class I) ± ezetimibe; alternatively PCSK9 inhibitor"],
]
story.append(make_table(
    ["Step", "Action"],
    algo,
    col_widths=[3.5*cm, W - 3.5*cm]
))
story.append(note(
    "2025 update: For ACS patients, combination therapy (high-intensity statin + ezetimibe) "
    "should be initiated during the index hospitalisation if LDL-C goal not expected to be "
    "reached with statin alone – no step-wise waiting approach."))
story.append(PageBreak())

# ═══════════════════════════════════════════════════════════════════════════
# SECTION 7 – NON-LDL LIPID MANAGEMENT
# ═══════════════════════════════════════════════════════════════════════════
story.append(section_header("7. Non-LDL Lipid Management"))
story.append(sp(8))

story.append(h2("7.1  Triglycerides (TG)"))
story.append(body(
    "Normal TG: <1.7 mmol/L (<150 mg/dL). Elevated TG (1.7-5.6 mmol/L) is an additional "
    "CV risk factor. Severe hypertriglyceridaemia (>10 mmol/L) primarily increases pancreatitis "
    "risk. Elevated TG is often part of the metabolic syndrome / insulin resistance cluster."))
story.append(sp(3))
story.append(h3("TG-Lowering Strategies (2019)"))
for item in [
    "Lifestyle: weight loss, reduce refined carbohydrates, reduce alcohol, increase physical activity",
    "Fibrates: reduce TG by 30-50%; primarily for severe hypertriglyceridaemia and pancreatitis prevention",
    "Omega-3 fatty acids (high-dose ≥2 g/day): reduce TG by 25-30%",
    "Niacin: no longer recommended due to absence of CV benefit and significant side-effects",
    "Statins: also reduce TG by 10-30%; first choice if elevated TG is part of mixed dyslipidaemia",
]:
    story.append(bullet(item))
story.append(sp(4))

story.append(update_box(
    "<b>2025 New Recommendations for Hypertriglyceridaemia:</b><br/>"
    "(1) <b>Icosapent ethyl</b> (prescription-grade EPA, 2g twice daily) is now recommended "
    "in patients at <b>high or very high CV risk</b> with elevated TG (1.5-5.6 mmol/L) "
    "DESPITE being on a statin, to reduce CV event risk – <b>Class IIa, Level B</b> "
    "(based on REDUCE-IT trial: 25% relative reduction in MACE vs placebo).<br/>"
    "(2) <b>Volanesorsen</b> (anti-sense oligonucleotide targeting APOC3) is now considered "
    "for patients with <b>familial chylomicronaemia syndrome</b> and severe hypertriglyceridaemia "
    "to reduce pancreatitis risk – <b>Class IIa, Level B</b>.<br/>"
    "(3) <b>Hypertriglyceridaemia</b> is now explicitly recognised as an independent CV risk "
    "factor (not just a modifier)."))
story.append(sp(6))

story.append(h2("7.2  HDL-C"))
story.append(body(
    "Low HDL-C (<1.0 mmol/L in men, <1.2 mmol/L in women) is an independent CV risk factor "
    "used in risk stratification. However, there is currently no pharmacological therapy "
    "proven to reduce CV events by specifically raising HDL-C. Lifestyle (exercise, smoking "
    "cessation, moderate alcohol) modestly increases HDL-C. HDL-C is not a treatment target."))
story.append(PageBreak())

# ═══════════════════════════════════════════════════════════════════════════
# SECTION 8 – FAMILIAL HYPERCHOLESTEROLAEMIA
# ═══════════════════════════════════════════════════════════════════════════
story.append(section_header("8. Familial Hypercholesterolaemia (FH)"))
story.append(sp(8))

story.append(h2("8.1  Diagnosis"))
story.append(body(
    "FH is an autosomal co-dominant disorder caused by mutations in LDLR, APOB, or PCSK9 "
    "genes (rarely LDLRAP1 for HoFH). Leads to lifelong markedly elevated LDL-C and "
    "premature ASCVD. Estimated prevalence: HeFH 1:200-300; HoFH 1:160,000-300,000."))
story.append(sp(3))

story.append(h3("Dutch Lipid Clinic Network (DLCN) Score"))
story.append(body(
    "Most widely used diagnostic tool. Considers: family history, personal clinical history "
    "(premature CVD), physical examination (tendon xanthomata, arcus cornealis), LDL-C levels, "
    "and genetic testing. Score ≥8: definite FH; 6-7: probable FH; 3-5: possible FH."))
story.append(sp(3))
story.append(body(
    "<b>Suspect FH when:</b> LDL-C >5.0 mmol/L (190 mg/dL) in adults, or premature CVD "
    "(men <55 years, women <65 years), or family history of premature CVD or "
    "very high LDL-C."))
story.append(sp(4))

story.append(h2("8.2  Treatment of Heterozygous FH (HeFH)"))
story.append(body(
    "All HeFH patients require pharmacological therapy. Risk-category based approach applies:"))
story.append(bullet("LDL-C target <2.6 mmol/L (<100 mg/dL) for HeFH at high risk (primary prevention, no major additional risk factors)"))
story.append(bullet("LDL-C target <1.8 mmol/L (<70 mg/dL) for HeFH at very high risk (primary prevention with additional risk factors)"))
story.append(bullet("LDL-C target <1.4 mmol/L (<55 mg/dL) + ≥50% reduction for HeFH with ASCVD (very high risk)"))
story.append(sp(3))
story.append(body(
    "Treatment hierarchy: High-intensity statin → add ezetimibe → add PCSK9 inhibitor. "
    "PCSK9 inhibitors are Class I, Level A in very-high risk FH not at goal."))
story.append(sp(4))

story.append(h2("8.3  Treatment of Homozygous FH (HoFH)"))
story.append(body(
    "HoFH is a medical emergency. LDL-C typically 10-20 mmol/L (400-800 mg/dL) from birth. "
    "Without treatment, coronary heart disease before age 20."))
story.append(sp(3))
story.append(body("Treatment options in 2019: High-intensity statin + ezetimibe; PCSK9 inhibitors "
    "(limited efficacy in null/null mutations – no functioning LDL receptor); "
    "LDL apheresis (weekly or biweekly); lomitapide (MTP inhibitor); "
    "mipomersen (anti-sense APOB, not available in Europe)."))
story.append(sp(3))
story.append(update_box(
    "<b>2025:</b> <b>Evinacumab</b> (anti-ANGPTL3 mAb) now recommended for HoFH aged ≥5 years "
    "not at LDL-C goal on other therapy – <b>Class IIa, Level B</b>. "
    "Unlike all other LDL-lowering drugs, evinacumab works independently of LDL receptors "
    "(lowers LDL-C via enhanced TG-rich lipoprotein clearance and VLDL reduction), "
    "providing ~50% LDL-C reduction even in receptor-null patients. "
    "This fills a major unmet need in HoFH."))
story.append(sp(4))

story.append(h2("8.4  Cascade Screening"))
story.append(body(
    "Universal cascade screening of all first-degree relatives of an FH patient is recommended. "
    "Genetic testing is the most efficient method. Lipid screening from childhood (fasting "
    "LDL-C at age 5-10 years) is recommended for children with a parent with definite FH. "
    "Statins can be considered from age 8-10 in children with FH."))
story.append(PageBreak())

# ═══════════════════════════════════════════════════════════════════════════
# SECTION 9 – ACUTE CORONARY SYNDROME
# ═══════════════════════════════════════════════════════════════════════════
story.append(section_header("9. Acute Coronary Syndrome (ACS)"))
story.append(sp(8))

story.append(h2("9.1  2019 Recommendations"))
story.append(body(
    "In the 2019 guidelines, all ACS patients are automatically classified as very-high risk "
    "(if not already extreme risk). High-intensity statin should be initiated or continued as "
    "early as possible. LDL-C target: <1.4 mmol/L (<55 mg/dL) + ≥50% reduction from baseline. "
    "If LDL-C goal not reached with maximum statin: add ezetimibe → then PCSK9 inhibitor."))
story.append(sp(3))
story.append(body(
    "In 2019, the preferred approach was to use statins first, check LDL-C at 4-6 weeks, "
    "then intensify therapy in a step-wise fashion. Combination therapy was generally "
    "initiated sequentially."))
story.append(sp(4))

story.append(update_box(
    "<b>2025 – Major Change in ACS Management:</b><br/>"
    "The update moves from a step-wise to an EARLY COMBINATION approach:<br/><br/>"
    "1. For patients <b>already on lipid-lowering therapy</b> before ACS: "
    "appropriately intensify during the INDEX HOSPITALISATION based on how much additional "
    "LDL-C reduction is needed to reach goal – <b>Class I, Level C</b>.<br/><br/>"
    "2. For patients who are <b>treatment naive</b> presenting with ACS: initiating "
    "<b>high-intensity statin + ezetimibe combination</b> during index hospitalisation "
    "SHOULD BE CONSIDERED when LDL-C goal is not expected to be achieved with statin alone – "
    "<b>Class IIa, Level B</b>.<br/><br/>"
    "Rationale: Combination therapy is safe, effective, and avoids the clinical inertia of "
    "step-wise titration. Evidence from RACING (rosuvastatin + ezetimibe) and EVIACS trials."))
story.append(sp(4))

story.append(h2("9.2  Timing of PCSK9 Inhibitors Post-ACS"))
story.append(body(
    "PCSK9 inhibitors initiated during or shortly after ACS admission show CV benefit. "
    "ODYSSEY OUTCOMES demonstrated mortality benefit with alirocumab in post-ACS patients "
    "with LDL-C ≥1.8 mmol/L on high-intensity statin. Initiating in hospital or early "
    "after discharge is appropriate."))
story.append(PageBreak())

# ═══════════════════════════════════════════════════════════════════════════
# SECTION 10 – SPECIAL POPULATIONS
# ═══════════════════════════════════════════════════════════════════════════
story.append(section_header("10. Special Populations"))
story.append(sp(8))

story.append(h2("10.1  Diabetes Mellitus"))
story.append(body(
    "Diabetes is a major CV risk factor. Risk category depends on type, duration, complications:"))
dm_table = [
    ["T2DM, very high risk", "With target organ damage (microalbuminuria, retinopathy, neuropathy) OR ≥3 major RF OR early-onset T1DM >20 years", "<1.4 mmol/L + ≥50% reduction"],
    ["T2DM, high risk", "Duration ≥10 years without organ damage, OR with 1 additional RF", "<1.8 mmol/L + ≥50% reduction"],
    ["T2DM/T1DM, moderate risk", "T2DM <50 yrs, T1DM <35 yrs, duration <10 years, no organ damage/RF", "<2.6 mmol/L"],
]
story.append(make_table(
    ["Category", "Criteria", "LDL-C Target"],
    dm_table,
    col_widths=[3.5*cm, W - 7*cm, 3.5*cm]
))
story.append(sp(3))
story.append(body(
    "Statins are NOT recommended in premenopausal women with DM who are considering pregnancy "
    "or not using adequate contraception (teratogenic). Statins are recommended in T1DM at "
    "high or very high risk."))
story.append(sp(4))

story.append(h2("10.2  Chronic Kidney Disease (CKD)"))
story.append(body(
    "CKD increases CV risk substantially. Statins + ezetimibe are recommended in non-dialysis "
    "CKD (Class I). In dialysis patients, initiating new statin therapy is NOT recommended "
    "(AURORA, 4D trials showed no benefit); continuing pre-existing statins is acceptable."))
story.append(bullet("Severe CKD (eGFR <30): very-high risk category → LDL-C <1.4 mmol/L"))
story.append(bullet("Moderate CKD (eGFR 30-59): high-risk category → LDL-C <1.8 mmol/L"))
story.append(bullet("Rosuvastatin preferred in CKD (not renally eliminated); avoid high-dose simvastatin"))
story.append(sp(4))

story.append(h2("10.3  Heart Failure and Valvular Disease"))
story.append(body(
    "Statins are NOT recommended to improve outcomes in patients with heart failure without "
    "established ASCVD (no CV outcome benefit in CORONA, GISSI-HF). However, statins should "
    "be continued in patients with established ASCVD who subsequently develop HF. "
    "Aortic stenosis: statins do NOT slow progression of aortic stenosis."))
story.append(sp(4))

story.append(h2("10.4  Stroke / Cerebrovascular Disease"))
story.append(body(
    "Statins are recommended in patients with ischaemic stroke/TIA for secondary prevention "
    "(Class I). Target LDL-C <1.4 mmol/L + ≥50% reduction in very-high risk patients. "
    "In patients with intracerebral haemorrhage, use of statins should be reconsidered. "
    "PCSK9 inhibitors: use caution – FOURIER showed non-significant increase in haemorrhagic stroke."))
story.append(sp(4))

story.append(h2("10.5  Peripheral Arterial Disease (PAD)"))
story.append(body(
    "PAD is equivalent to ASCVD → very-high risk category. Statins are Class I for all PAD patients. "
    "LDL-C target: <1.4 mmol/L + ≥50% reduction. Statins also reduce limb events and improve "
    "walking distance."))
story.append(sp(4))

story.append(h2("10.6  Women and Pregnancy"))
story.append(body(
    "Most lipid-lowering drugs are contraindicated in pregnancy. Statins: Class X (teratogenic "
    "in animal studies) – stop 3 months before planned pregnancy. Ezetimibe and PCSK9 inhibitors: "
    "avoid in pregnancy; insufficient safety data. Bile acid sequestrants are the only agents "
    "considered relatively safe in pregnancy."))
story.append(bullet("FH in pregnancy: intensify dietary therapy; bile acid sequestrants may be used"))
story.append(bullet("Post-menopausal women: same risk stratification and LDL-C targets as men"))
story.append(sp(4))

story.append(h2("10.7  Elderly Patients (≥75 years)"))
story.append(body(
    "CV risk is high in elderly, and absolute benefit of lipid-lowering is substantial. "
    "For secondary prevention, statins should be continued. For primary prevention in older "
    "adults (≥75 years), initiation may be considered with careful assessment of benefit, "
    "frailty, comorbidities, and polypharmacy. Lower starting doses recommended."))
story.append(sp(4))

story.append(h2("10.8  HIV Patients"))
story.append(update_box(
    "<b>2025 – NEW:</b> Statin therapy is now <b>recommended</b> for people aged ≥40 years "
    "living with HIV – <b>Class I</b> (class level to be confirmed in full text). "
    "Rationale: HIV increases CV risk by ~2-fold through immune activation, inflammation, "
    "and antiretroviral drug effects on lipid metabolism. "
    "Drug interactions: antiretroviral protease inhibitors inhibit CYP3A4 – "
    "avoid simvastatin and lovastatin; use pitavastatin, pravastatin, or rosuvastatin (low dose). "
    "This is a significant expansion from the 2019 guidance which treated HIV as a risk modifier."))
story.append(sp(4))

story.append(h2("10.9  Cancer / Cardio-Oncology"))
story.append(update_box(
    "<b>2025 – NEW:</b> Statins are now recommended for patients at risk of "
    "<b>cancer therapy-related cardiovascular toxicity</b>. "
    "Increasing evidence shows that cancer therapies (e.g. anthracyclines, HER2 inhibitors, "
    "androgen deprivation therapy for prostate cancer) accelerate ASCVD risk. "
    "Statin therapy reduces CV events in this setting. "
    "Cardio-oncology guidelines increasingly endorse lipid management alongside cancer treatment."))
story.append(sp(4))

story.append(h2("10.10  Children and Adolescents"))
story.append(body(
    "Primary prevention in children focuses on FH. Universal lipid screening in children "
    "is not recommended; targeted screening in high-risk families is. Dietary intervention "
    "from age 2. Statins may be initiated from age 8-10 in children with FH at high risk. "
    "Pravastatin and rosuvastatin are approved for paediatric FH."))
story.append(PageBreak())

# ═══════════════════════════════════════════════════════════════════════════
# SECTION 11 – KEY DRUG TABLE
# ═══════════════════════════════════════════════════════════════════════════
story.append(section_header("11. Key Drug Comparison Table"))
story.append(sp(8))

drugs = [
    ["Statins\n(all)", "Inhibit HMG-CoA reductase", "30-55%", "I, A", "Myopathy, new-onset DM, ↑LFT", "First-line all risk categories", "2019"],
    ["Ezetimibe", "Inhibit NPC1L1 (intestinal absorption)", "15-20%", "I, B", "GI symptoms (rare)", "Add-on to statin; statin-intolerant", "2019"],
    ["Evolocumab\nAlirocumab", "Anti-PCSK9 mAb (↑LDL-R recycling)", "50-60%", "I, A", "Injection site reactions, flu-like symptoms", "Not at goal on statin + ezetimibe; FH", "2019"],
    ["Inclisiran", "siRNA silences PCSK9 mRNA", "~50%", "I, A", "Injection site reactions", "Not at goal – twice yearly dosing", "2019"],
    ["Bempedoic acid", "Inhibit ATP-citrate lyase (upstream HMG-CoA)", "~21%", "I, B (statin-intolerant)\nIIa, C (add-on)", "Hyperuricaemia, gout flares, tendon rupture (rare)", "Statin-intolerant; add-on to statin ± EZE", "NEW 2025"],
    ["Evinacumab", "Anti-ANGPTL3 mAb (LDL-R independent)", "~50%", "IIa, B", "Nasopharyngitis, dizziness, nausea", "HoFH ≥5 yrs not at goal", "NEW 2025"],
    ["Icosapent ethyl", "EPA omega-3 (TG lowering; pleiotropic)", "TG ↓~20-30%", "IIa, B", "AF (modest ↑), fishy taste, bleeding", "High/very-high risk + elevated TG on statin", "NEW 2025"],
    ["Volanesorsen", "ASO targeting APOC3 mRNA (TG lowering)", "TG ↓~70-80%", "IIa, B", "Thrombocytopenia, injection site reactions", "Familial chylomicronaemia syndrome (pancreatitis prevention)", "NEW 2025"],
    ["Fibrates", "PPARα agonist (TG lowering)", "TG ↓30-50%\nLDL ↓5-20%", "IIb, A", "Myopathy with statins, ↑creatinine, GI", "Severe hypertriglyceridaemia", "2019"],
    ["Bile acid\nsequestrants", "Interrupt enterohepatic bile acid recirculation", "15-30%", "IIb, A", "GI bloating, constipation, drug interactions", "Add-on; safe in pregnancy (relative)", "2019"],
]
story.append(make_table(
    ["Drug", "Mechanism", "LDL/TG Reduction", "Class/Level", "Key Side Effects", "Main Indication", "Guideline"],
    drugs,
    col_widths=[2.2*cm, 3.0*cm, 2.0*cm, 1.8*cm, 3.0*cm, 3.3*cm, 1.7*cm]
))
story.append(PageBreak())

# ═══════════════════════════════════════════════════════════════════════════
# SECTION 12 – SUMMARY OF CHANGES
# ═══════════════════════════════════════════════════════════════════════════
story.append(section_header("12. Summary of Changes: 2019 vs 2025"))
story.append(sp(8))

changes = [
    [b("Risk scoring system"), "SCORE (fatal events only; TC-based)", "SCORE2 + SCORE2-OP (fatal + non-fatal; non-HDL-C based; age 40-89)"],
    [b("Risk modifiers"), "AF, LVH, CKD included; Lp(a) as modifier", "AF, LVH, CKD removed; Lp(a) >50 mg/dL now independent RF; CAC score added; hypertriglyceridaemia as RF"],
    [b("Extreme risk category"), "Not formally defined", "Introduced: LDL-C goal <1.0 mmol/L (<40 mg/dL) for recurrent ACS/polyvascular disease/very high-risk FH with ASCVD"],
    [b("LDL-C targets"), "Defined for 4 categories", "Confirmed unchanged; extreme risk addition"],
    [b("Bempedoic acid"), "Not included", "Class I, Level B (statin-intolerant); Class IIa, Level C (add-on)"],
    [b("Evinacumab"), "Not included", "Class IIa, Level B for HoFH ≥5 yrs not at goal"],
    [b("ACS – initial therapy"), "High-intensity statin; step-wise escalation at 4-6 weeks", "Combination statin + ezetimibe at index hospitalisation if goal not expected with statin alone (Class IIa, Level B)"],
    [b("Icosapent ethyl"), "Mentioned but not clearly recommended", "Class IIa, Level B for high/very-high risk + elevated TG on statin"],
    [b("Volanesorsen"), "Not included", "Class IIa, Level B for familial chylomicronaemia syndrome"],
    [b("HIV patients"), "Risk modifier; limited guidance", "Statin therapy recommended for ≥40 years living with HIV"],
    [b("Cancer / cardio-oncology"), "Limited guidance", "Statins recommended for patients at risk of cancer therapy-related CV toxicity"],
    [b("Dietary supplements"), "Ambiguous; some mentioned with limited evidence", "Explicitly NOT recommended (Class III) for LDL-C reduction"],
    [b("Non-HDL-C in risk"), "Secondary target", "Core variable in SCORE2 risk model"],
]
story.append(make_table(
    ["Domain", "2019 Guideline", "2025 Update"],
    changes,
    col_widths=[3.8*cm, (W - 3.8*cm) / 2, (W - 3.8*cm) / 2]
))
story.append(PageBreak())

# ═══════════════════════════════════════════════════════════════════════════
# SECTION 13 – QUICK REFERENCE CARD
# ═══════════════════════════════════════════════════════════════════════════
story.append(section_header("13. Quick Reference Card"))
story.append(sp(8))

story.append(highlight_box(
    "<b>LDL-C TARGETS (Unchanged 2019 / 2025):</b><br/>"
    "Low risk (&lt;2%): &lt;3.0 mmol/L (&lt;116 mg/dL)  |  "
    "Moderate risk (2-10%): &lt;2.6 mmol/L (&lt;100 mg/dL)  |  "
    "High risk (10-20%): &lt;1.8 mmol/L (&lt;70 mg/dL) + ≥50% reduction  |  "
    "Very high risk (&gt;20% or ASCVD): &lt;1.4 mmol/L (&lt;55 mg/dL) + ≥50% reduction  |  "
    "Extreme risk (NEW 2025): &lt;1.0 mmol/L (&lt;40 mg/dL)"))
story.append(sp(6))

story.append(h2("Treatment Algorithm at a Glance"))
story.append(bullet("<b>Step 1:</b> Lifestyle + maximise statin dose"))
story.append(bullet("<b>Step 2:</b> Add ezetimibe if target not reached"))
story.append(bullet("<b>Step 3:</b> Add PCSK9 inhibitor (or inclisiran) if still not at target"))
story.append(bullet("<b>Statin intolerant:</b> Bempedoic acid (Class I, Level B) ± ezetimibe"))
story.append(bullet("<b>HoFH not at goal:</b> Consider evinacumab (Class IIa, Level B)"))
story.append(bullet("<b>ACS naive:</b> Start statin + ezetimibe at index hospitalisation if goal unlikely with statin alone"))
story.append(sp(6))

story.append(h2("New Drugs in 2025 – At a Glance"))
new_drugs = [
    ["Bempedoic acid 180 mg od", "ACL inhibitor (no myopathy)", "~21% LDL-C ↓", "Statin intolerant (I,B); add-on (IIa,C)"],
    ["Evinacumab IV q4w", "Anti-ANGPTL3 mAb", "~50% LDL-C ↓ (LDL-R independent)", "HoFH ≥5 yrs (IIa,B)"],
    ["Icosapent ethyl 2g bd", "Prescription EPA omega-3", "TG ↓20-30%; MACE ↓25%", "High/very-high risk + elevated TG on statin (IIa,B)"],
    ["Volanesorsen SC", "Anti-APOC3 ASO", "TG ↓70-80%", "Familial chylomicronaemia syndrome (IIa,B)"],
]
story.append(make_table(
    ["Drug", "Mechanism", "Effect", "Indication (Class/Level)"],
    new_drugs,
    col_widths=[3.5*cm, 3.5*cm, 3.5*cm, W - 10.5*cm]
))
story.append(sp(6))

story.append(h2("Special Populations – Key Points"))
sp_pts = [
    ["Diabetes (T2DM very high risk)", "<1.4 mmol/L + ≥50% reduction. Avoid statins if considering pregnancy."],
    ["CKD non-dialysis", "Statin + ezetimibe recommended. Avoid new statin start in dialysis."],
    ["Post-ACS", "Very-high/extreme risk. Start combination therapy at hospitalisation (2025)."],
    ["HeFH", "PCSK9i Class I,A for very-high risk not at goal."],
    ["HoFH", "Evinacumab now added (2025). LDL apheresis; lomitapide."],
    ["HIV ≥40 yrs", "Statins now recommended (2025). Use pitavastatin/pravastatin."],
    ["Pregnancy", "Stop statins 3 months before. Bile acid sequestrants safest option."],
    ["Cardio-oncology", "Statins for cancer therapy-related CV toxicity risk (2025)."],
    ["Elderly (≥75)", "Secondary prevention: continue statins. Primary: individual risk-benefit."],
]
story.append(make_table(
    ["Population", "Key Guidance"],
    sp_pts,
    col_widths=[4.5*cm, W - 4.5*cm]
))
story.append(sp(8))

story.append(h2("Risk Scoring Quick Guide"))
scoring = [
    ["SCORE2 (ages 40-69)", "Fatal + non-fatal CV events; non-HDL-C based; 4 European risk regions", "Primary prevention"],
    ["SCORE2-OP (ages ≥70)", "Same as SCORE2; extends to age 89; calibrated for older adults", "Primary prevention elderly"],
    ["Both SCORE2/OP", "Used for primary prevention only. Not used when ASCVD, DM with organ damage, CKD, or FH already classifies as high/very-high risk automatically.", "Primary prevention only"],
]
story.append(make_table(
    ["Tool", "Description", "Use"],
    scoring,
    col_widths=[4*cm, W - 7*cm, 3*cm]
))
story.append(sp(8))

story.append(hr())
story.append(Paragraph(
    "Sources: 2019 ESC/EAS Guidelines for the Management of Dyslipidaemias, Eur Heart J 2020;41:111-188 (PMID: 31504573) | "
    "2025 Focused Update, Eur Heart J 2025;46(42):4359-4378 (PMID: 40885687) | Atherosclerosis 2025 (DOI: 10.1016/j.atherosclerosis.2025.120479) | "
    "Pradhan A et al. Am J Cardiol 2026 (PMID: 41785983). "
    "Note: These are educational notes only. Always refer to the original guideline documents for clinical decision-making.",
    s_footer))

# ── Build ────────────────────────────────────────────────────────────────────
doc.build(story)
print(f"PDF created: {OUTPUT}")
Running Command

cd /home/daytona/workspace/dyslipidaemia-notes && python build_pdf.py 2>&1

Running Command

ls -lh /home/daytona/workspace/dyslipidaemia-notes/ESC_EAS_Dyslipidaemia_Joint_N…

Your PDF is ready:

ESC EAS Dyslipidaemia Joint Notes

PDF Document · PDF


Here is what the document contains across 13 sections:
Section 1 – Overview and Scope Context for both guidelines, what the 2025 update does and does not change.
Section 2 – Cardiovascular Risk Assessment Full SCORE vs SCORE2/SCORE2-OP comparison, all five risk categories with criteria, and the complete list of risk modifiers (with what was added and removed in 2025).
Section 3 – LDL-C Targets Full target table (low through extreme risk), non-HDL-C and ApoB co-targets, with mmol/L and mg/dL values.
Section 4 – Lipid Measurements and Biomarkers LDL-C calculation, Lp(a) (upgraded to independent RF in 2025), hs-CRP, CAC scoring.
Section 5 – Lifestyle Interventions Detailed dietary component table, physical activity, smoking cessation, weight management - plus the 2025 explicit ban on dietary supplements.
Section 6 – Pharmacological LDL-C Lowering Full statin intensity table, ezetimibe, PCSK9 inhibitors (with key trials), bempedoic acid (CLEAR Outcomes), evinacumab for HoFH, inclisiran, bile acid sequestrants - plus the full treatment algorithm.
Section 7 – Non-LDL Lipid Management TG targets, fibrates, icosapent ethyl (REDUCE-IT), volanesorsen, HDL-C.
Section 8 – Familial Hypercholesterolaemia HeFH diagnosis (DLCN score), treatment targets by risk, HoFH (evinacumab added in 2025), cascade screening.
Section 9 – ACS 2019 step-wise approach vs 2025 early combination therapy at index hospitalisation.
Section 10 – Special Populations DM, CKD, HF, stroke, PAD, women/pregnancy, elderly, HIV (new 2025), cardio-oncology (new 2025), children.
Section 11 – Key Drug Comparison Table All agents side-by-side: mechanism, LDL reduction %, class/level, side effects, indication, whether 2019 or new in 2025.
Section 12 – Changes 2019 vs 2025 Full comparison table across every updated domain.
Section 13 – Quick Reference Card LDL-C targets at a glance, treatment algorithm, new 2025 drugs summary, special populations cheatsheet, SCORE2 guide.
This is a shared conversation. Sign in to Orris to start your own chat.