Hyponatremic seizure, cut off of sodium

Reading File
Finding Sources
Searching PubMed

hyponatremia seizure sodium threshold

Reading File
Reading File
Finding Sources
Reading File
Reading File
Here is a complete, textbook-sourced answer on hyponatremic seizures and the sodium cutoff:

Hyponatremic Seizures - Sodium Cutoff & Clinical Essentials

Sodium Threshold for Seizures

The cutoff is < 120 mEq/L for seizures in most clinical contexts - but this is not a fixed rule. The key qualifier is rate of fall, not just the absolute value:
ScenarioSeizure Risk
Acute hyponatremia (< 48 h)Seizures can occur even at Na > 120 mEq/L
Chronic hyponatremia (> 48 h)Much less risk; seizures rare unless Na < 120 mEq/L
Profound hyponatremia (< 125 mEq/L)Nausea, vomiting, confusion, seizures (5%), coma
As Symptom to Diagnosis (4th ed.) states: "Acute hyponatremia may cause seizures, brain damage, brainstem herniation, respiratory arrest...Seizures can occur even at sodium levels above 120 mEq/L." In chronic hyponatremia, seizures are much less frequent and brain adaptation (astrocyte osmolality reduction) protects against edema.

Why Seizures Occur - Pathophysiology

  1. Hyponatremia lowers extracellular osmolality
  2. Osmotic gradient drives water into brain astrocytes
  3. This causes cerebral edema and raised ICP
  4. Acute swelling - before CNS adaptation can occur - produces seizures, herniation, and respiratory arrest
  5. In chronic hyponatremia, astrocytes compensate by exporting osmolytes (taurine, inositol), reducing edema

Severity Classification

GradeSerum NaTypical Symptoms
Mild130-135 mEq/LOften asymptomatic
Moderate125-129 mEq/LNausea, headache, confusion
Profound / Severe< 125 mEq/LSeizures (~5%), coma, herniation risk
  • Symptoms are also more common when Na is < 125 mEq/L: nausea (44-49%), vomiting (27-30%), gait disturbance (31%), headache (27%), confusion (14-30%), seizures (5%), coma.
  • Symptom to Diagnosis, 4th ed.

Immediate Management of Hyponatremic Seizures

First-line: 3% Hypertonic Saline IV
  • Dose (pediatric): 3-5 mL/kg bolus over 15-30 minutes until seizure stops
  • Dose (adult/Rosen's Emergency Medicine): 100 mL of 3% hypertonic saline bolus; repeat up to 3 times if seizures persist
  • Target: Raise Na to > 124 mEq/L (Miller's Anesthesia, 10e) or raise by 4-6 mEq/L within 6 hours to abort severe symptoms (Rosen's Emergency Medicine)
  • Raising Na by just 5 mEq/L is typically sufficient to stop seizures (Tintinalli's Emergency Medicine, 9e)

Correction Rate Limits - Avoid Osmotic Demyelination Syndrome (ODS)

Patient TypeMax Correction Rate
High-risk (chronic, malnourished, alcoholic, hypokalemia)6 mEq/L per 24 hours
Low-risk patients12 mEq/L per 24 hours
Acute symptomatic (seizures)Rapid initial 5 mEq/L rise is safe and necessary
Key rule: In chronic hyponatremia (even if Na is critically low), if it was reached slowly, it must also be corrected slowly - EXCEPT in active seizures where rapid bolus correction to abort the seizure takes priority.

Quick Memory Anchor

  • < 120 mEq/L = seizure cutoff (classical teaching)
  • Acute fall = seizures possible even above 120
  • Treatment = 3% NaCl bolus to raise Na by ~5 mEq/L
  • ODS risk = don't exceed 12 mEq/24h (6 mEq in high-risk)

Sources: Miller's Anesthesia 10e; Symptom to Diagnosis 4e; Tintinalli's Emergency Medicine 9e; Rosen's Emergency Medicine 9e; Harriet Lane Handbook 23e

Create a quick-reference guide for hyponatremia management

Asking for Preferences
Finding Sources
Finding Sources
Reading File
Reading File
Reading File
Reading File
Finding Sources
Running Command

mkdir -p /tmp/workspace/hyponatremia-guide && ls /tmp/workspace/hyponatremia-guide/

Writing File

~/hyponatremia-guide/build_guide.py

from reportlab.lib.pagesizes import A4
from reportlab.lib import colors
from reportlab.lib.units import cm, mm
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.platypus import (
    SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle,
    HRFlowable, KeepTogether
)
from reportlab.lib.enums import TA_CENTER, TA_LEFT, TA_JUSTIFY
from reportlab.platypus import PageBreak
from reportlab.lib.colors import HexColor

OUTPUT = "/tmp/workspace/hyponatremia-guide/Hyponatremia_Quick_Reference.pdf"

# -- Colour palette --
NAVY    = HexColor("#1A3A5C")
TEAL    = HexColor("#0E7490")
AMBER   = HexColor("#B45309")
RED     = HexColor("#B91C1C")
GREEN   = HexColor("#166534")
LGREY   = HexColor("#F1F5F9")
MGREY   = HexColor("#CBD5E1")
WHITE   = colors.white
BLACK   = colors.black
LBLUE   = HexColor("#DBEAFE")
LGREEN  = HexColor("#DCFCE7")
LRED    = HexColor("#FEE2E2")
LYELLOW = HexColor("#FEF9C3")
LORANGE = HexColor("#FFEDD5")

PAGE_W, PAGE_H = A4
MARGIN = 1.5*cm

doc = SimpleDocTemplate(
    OUTPUT,
    pagesize=A4,
    rightMargin=MARGIN, leftMargin=MARGIN,
    topMargin=1.8*cm, bottomMargin=1.5*cm,
    title="Hyponatremia Quick Reference Guide",
    author="Orris Medical Reference",
)

styles = getSampleStyleSheet()

def sty(name, **kw):
    s = ParagraphStyle(name, parent=styles["Normal"], **kw)
    return s

H0 = sty("H0", fontSize=20, textColor=WHITE, fontName="Helvetica-Bold",
         alignment=TA_CENTER, leading=26, spaceAfter=0)
H1 = sty("H1", fontSize=12, textColor=WHITE, fontName="Helvetica-Bold",
         leading=16, spaceAfter=2)
H2 = sty("H2", fontSize=10, textColor=NAVY, fontName="Helvetica-Bold",
         leading=14, spaceAfter=3, spaceBefore=4)
BODY = sty("BODY", fontSize=8.5, textColor=BLACK, leading=12,
           spaceAfter=2, fontName="Helvetica")
BODY_SM = sty("BODY_SM", fontSize=7.8, textColor=BLACK, leading=11,
              spaceAfter=1, fontName="Helvetica")
BOLD_SM = sty("BOLD_SM", fontSize=8, textColor=BLACK, fontName="Helvetica-Bold",
              leading=11, spaceAfter=1)
CAPTION = sty("CAPTION", fontSize=7, textColor=HexColor("#475569"),
              leading=10, fontName="Helvetica-Oblique", alignment=TA_CENTER)
WARN = sty("WARN", fontSize=8, textColor=RED, fontName="Helvetica-Bold",
           leading=11, spaceAfter=2)
FOOTER = sty("FOOTER", fontSize=6.5, textColor=HexColor("#64748B"),
             leading=9, fontName="Helvetica", alignment=TA_CENTER)

CONTENT_W = PAGE_W - 2*MARGIN

def header_box(text, bg=NAVY, fg=WHITE, pad=8):
    tbl = Table([[Paragraph(text, sty("hdr", fontSize=11, textColor=fg,
                  fontName="Helvetica-Bold", leading=14, alignment=TA_CENTER))]],
                colWidths=[CONTENT_W])
    tbl.setStyle(TableStyle([
        ("BACKGROUND", (0,0), (-1,-1), bg),
        ("TOPPADDING", (0,0), (-1,-1), pad),
        ("BOTTOMPADDING", (0,0), (-1,-1), pad),
        ("LEFTPADDING", (0,0), (-1,-1), 8),
        ("RIGHTPADDING", (0,0), (-1,-1), 8),
        ("ROUNDEDCORNERS", [4, 4, 4, 4]),
    ]))
    return tbl

def section_header(text, bg=TEAL):
    return header_box(text, bg=bg)

def two_col(left, right, lw=None, rw=None, vpad=4):
    lw = lw or CONTENT_W * 0.48
    rw = rw or CONTENT_W * 0.48
    gap = CONTENT_W - lw - rw
    tbl = Table([[left, right]], colWidths=[lw, rw])
    tbl.setStyle(TableStyle([
        ("VALIGN", (0,0), (-1,-1), "TOP"),
        ("LEFTPADDING", (0,0), (-1,-1), 0),
        ("RIGHTPADDING", (0,0), (-1,-1), 0),
        ("TOPPADDING", (0,0), (-1,-1), 0),
        ("BOTTOMPADDING", (0,0), (-1,-1), 0),
    ]))
    return tbl

def colored_cell(text, bg=LGREY, style=None):
    p = Paragraph(text, style or BODY_SM)
    t = Table([[p]], colWidths=["100%"])
    t.setStyle(TableStyle([
        ("BACKGROUND", (0,0), (-1,-1), bg),
        ("TOPPADDING", (0,0), (-1,-1), 4),
        ("BOTTOMPADDING", (0,0), (-1,-1), 4),
        ("LEFTPADDING", (0,0), (-1,-1), 6),
        ("RIGHTPADDING", (0,0), (-1,-1), 6),
    ]))
    return t

def make_table(data, col_widths, header_bg=NAVY, row_bg1=WHITE, row_bg2=LGREY,
               header_fg=WHITE, fontsize=8):
    header = data[0]
    rows = data[1:]

    hdr_style = sty("thdr", fontSize=fontsize, textColor=header_fg,
                    fontName="Helvetica-Bold", leading=fontsize+3, alignment=TA_CENTER)
    cell_style = sty("tcell", fontSize=fontsize-0.5, textColor=BLACK,
                     fontName="Helvetica", leading=fontsize+2, alignment=TA_LEFT)
    cell_center = sty("tcc", fontSize=fontsize-0.5, textColor=BLACK,
                      fontName="Helvetica", leading=fontsize+2, alignment=TA_CENTER)

    tdata = [[Paragraph(str(h), hdr_style) for h in header]]
    for i, row in enumerate(rows):
        tdata.append([Paragraph(str(c), cell_style) for c in row])

    tbl = Table(tdata, colWidths=col_widths, repeatRows=1)
    ts = [
        ("BACKGROUND", (0,0), (-1,0), header_bg),
        ("GRID", (0,0), (-1,-1), 0.4, MGREY),
        ("TOPPADDING", (0,0), (-1,-1), 4),
        ("BOTTOMPADDING", (0,0), (-1,-1), 4),
        ("LEFTPADDING", (0,0), (-1,-1), 5),
        ("RIGHTPADDING", (0,0), (-1,-1), 5),
        ("VALIGN", (0,0), (-1,-1), "MIDDLE"),
    ]
    for i in range(1, len(tdata)):
        bg = row_bg1 if i % 2 == 0 else row_bg2
        ts.append(("BACKGROUND", (0,i), (-1,i), bg))
    tbl.setStyle(TableStyle(ts))
    return tbl

story = []

# =====================================================================
# TITLE BANNER
# =====================================================================
title_tbl = Table(
    [[Paragraph("HYPONATREMIA", sty("t1", fontSize=24, textColor=WHITE,
                fontName="Helvetica-Bold", alignment=TA_CENTER, leading=30)),
      Paragraph("Quick Reference Guide", sty("t2", fontSize=13, textColor=HexColor("#BAE6FD"),
                fontName="Helvetica", alignment=TA_CENTER, leading=18))]],
    colWidths=[CONTENT_W * 0.5, CONTENT_W * 0.5]
)
title_tbl.setStyle(TableStyle([
    ("BACKGROUND", (0,0), (-1,-1), NAVY),
    ("TOPPADDING", (0,0), (-1,-1), 14),
    ("BOTTOMPADDING", (0,0), (-1,-1), 14),
    ("LEFTPADDING", (0,0), (-1,-1), 10),
    ("VALIGN", (0,0), (-1,-1), "MIDDLE"),
]))
story.append(title_tbl)
story.append(Spacer(1, 4*mm))

subtitle_data = [
    [Paragraph("For Emergency, ICU & General Medicine Clinicians", sty("sub",
      fontSize=8.5, textColor=HexColor("#475569"), fontName="Helvetica-Oblique",
      alignment=TA_CENTER))]
]
sub_tbl = Table(subtitle_data, colWidths=[CONTENT_W])
sub_tbl.setStyle(TableStyle([
    ("BACKGROUND", (0,0), (-1,-1), LGREY),
    ("TOPPADDING", (0,0), (-1,-1), 4),
    ("BOTTOMPADDING", (0,0), (-1,-1), 4),
]))
story.append(sub_tbl)
story.append(Spacer(1, 5*mm))

# =====================================================================
# SECTION 1 — DEFINITION & CLASSIFICATION
# =====================================================================
story.append(KeepTogether([
    section_header("1. DEFINITION & SEVERITY CLASSIFICATION"),
    Spacer(1, 3*mm),
]))

classify_data = [
    ["Grade", "Serum Na+", "Common Symptoms"],
    ["Mild", "130–135 mEq/L", "Often asymptomatic; subtle cognitive changes"],
    ["Moderate", "125–129 mEq/L", "Nausea (44-49%), headache (27%), confusion (14-30%), gait disturbance (31%)"],
    ["Severe / Profound", "< 125 mEq/L", "Vomiting (27-30%), seizures (~5%), coma, brainstem herniation, death"],
]
story.append(make_table(classify_data,
    [CONTENT_W*0.14, CONTENT_W*0.20, CONTENT_W*0.66],
    header_bg=NAVY))
story.append(Spacer(1, 2*mm))
story.append(Paragraph(
    "<b>Duration matters:</b>  Acute (&lt;48 h) vs Chronic (&gt;48 h) — when duration unknown, assume <b>chronic</b>.",
    BODY_SM))
story.append(Spacer(1, 5*mm))

# =====================================================================
# SECTION 2 — PATHOPHYSIOLOGY SNAPSHOT
# =====================================================================
story.append(KeepTogether([
    section_header("2. PATHOPHYSIOLOGY SNAPSHOT", bg=TEAL),
    Spacer(1, 3*mm),
]))

path_data = [
    ["Acute (&lt;48 h)", "Chronic (&gt;48 h)"],
    [
        "Extracellular Na+ falls\n→ Plasma becomes hypotonic\n→ Water floods brain astrocytes\n→ Cerebral edema, raised ICP\n→ Seizures / herniation even at Na &gt;120",
        "Astrocytes export osmolytes (taurine, inositol)\n→ Intracellular osmolality falls\n→ Less water influx, less edema\n→ Symptoms occur at lower Na levels\n→ Seizures much less frequent"
    ]
]
path_tbl = Table(
    [[Paragraph("<b>Acute (&lt;48 h)</b>", sty("ph", fontSize=9, textColor=WHITE, fontName="Helvetica-Bold",
                alignment=TA_CENTER, leading=12)),
      Paragraph("<b>Chronic (&gt;48 h)</b>", sty("ph2", fontSize=9, textColor=WHITE, fontName="Helvetica-Bold",
                alignment=TA_CENTER, leading=12))],
     [Paragraph("Extracellular Na<sup>+</sup> falls → plasma hypotonic → water floods brain astrocytes → cerebral edema, raised ICP → seizures/herniation possible even at Na &gt; 120 mEq/L",
                BODY_SM),
      Paragraph("Astrocytes export osmolytes (taurine, inositol) → intracellular osmolality falls → less water influx → less edema → symptoms occur at lower Na levels → seizures much less frequent",
                BODY_SM)]],
    colWidths=[CONTENT_W*0.49, CONTENT_W*0.49]
)
path_tbl.setStyle(TableStyle([
    ("BACKGROUND", (0,0), (0,0), RED),
    ("BACKGROUND", (1,0), (1,0), GREEN),
    ("BACKGROUND", (0,1), (0,1), HexColor("#FFF1F2")),
    ("BACKGROUND", (1,1), (1,1), LGREEN),
    ("GRID", (0,0), (-1,-1), 0.4, MGREY),
    ("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"),
]))
story.append(path_tbl)
story.append(Spacer(1, 5*mm))

# =====================================================================
# SECTION 3 — DIAGNOSTIC APPROACH
# =====================================================================
story.append(KeepTogether([
    section_header("3. DIAGNOSTIC APPROACH (4-Step Framework)", bg=HexColor("#1E3A5F")),
    Spacer(1, 3*mm),
]))

steps = [
    ("Step 1", "Scan for diagnostic clues",
     "Hyperglycemia → hyperglycemic hyponatremia | Thiazide use → diuretic-induced | "
     "Post-marathon → EAH | Hyperkalemia → adrenal insufficiency or renal failure | "
     "Very low Uosm → psychogenic polydipsia / beer potomania | Normal osmolality → pseudohyponatremia"),
    ("Step 2", "Assess volume status",
     "<b>Hypervolemic:</b> HF, cirrhosis, nephrotic syndrome, renal failure (edema, JVD)<br/>"
     "<b>Hypovolemic:</b> hypotension, orthostasis, diarrhea/vomiting, diuretics<br/>"
     "<b>Euvolemic:</b> neither hyper- nor hypovolemic → proceed to Step 3"),
    ("Step 3", "Urine Na+ in apparent euvolemia",
     "UNa &lt; 20-30 mEq/L → occult <b>hypovolemia</b> (avid renal Na retention)<br/>"
     "UNa &gt; 20-30 mEq/L → true <b>euvolemia</b> → proceed to Step 4"),
    ("Step 4", "Rule out endocrine before diagnosing SIADH",
     "Exclude <b>hypothyroidism</b> (TSH) and <b>adrenal insufficiency</b> (morning cortisol/ACTH stim)<br/>"
     "If normal → diagnose <b>SIADH</b>"),
]
for num, title, text in steps:
    row_tbl = Table([[
        Paragraph(num, sty("snum", fontSize=9, textColor=WHITE, fontName="Helvetica-Bold",
                           alignment=TA_CENTER, leading=12)),
        Paragraph(f"<b>{title}</b><br/>{text}", BODY_SM)
    ]], colWidths=[CONTENT_W*0.09, CONTENT_W*0.91])
    row_tbl.setStyle(TableStyle([
        ("BACKGROUND", (0,0), (0,-1), TEAL),
        ("BACKGROUND", (1,0), (1,-1), WHITE),
        ("GRID", (0,0), (-1,-1), 0.4, MGREY),
        ("VALIGN", (0,0), (-1,-1), "MIDDLE"),
        ("TOPPADDING", (0,0), (-1,-1), 5),
        ("BOTTOMPADDING", (0,0), (-1,-1), 5),
        ("LEFTPADDING", (0,0), (-1,-1), 5),
        ("RIGHTPADDING", (0,0), (-1,-1), 5),
    ]))
    story.append(row_tbl)
    story.append(Spacer(1, 1*mm))
story.append(Spacer(1, 3*mm))

# SIADH box
siadh_criteria = [
    ["SIADH Diagnostic Criteria"],
    ["1. Serum hypo-osmolality (&lt;275 mOsm/kg)"],
    ["2. Urine osmolality inappropriately elevated (&gt;100–200 mOsm/kg)"],
    ["3. Urine Na+ elevated (&gt;20–30 mEq/L) with adequate Na intake"],
    ["4. Clinical euvolemia (no edema, no orthostasis)"],
    ["5. Normal renal, adrenal, thyroid, cardiac, hepatic function"],
    ["6. Not on diuretics"],
]
siadh_tbl = Table(
    [[Paragraph("<b>SIADH Diagnostic Criteria</b>", sty("sh", fontSize=9, textColor=WHITE,
                fontName="Helvetica-Bold", alignment=TA_CENTER, leading=13))]]+
    [[Paragraph(f"{'• '+r[0]}", BODY_SM)] for r in siadh_criteria[1:]],
    colWidths=[CONTENT_W]
)
siadh_tbl.setStyle(TableStyle([
    ("BACKGROUND", (0,0), (-1,0), HexColor("#0369A1")),
    ("BACKGROUND", (0,1), (-1,-1), LBLUE),
    ("GRID", (0,0), (-1,-1), 0.3, HexColor("#BAE6FD")),
    ("TOPPADDING", (0,0), (-1,-1), 4),
    ("BOTTOMPADDING", (0,0), (-1,-1), 4),
    ("LEFTPADDING", (0,0), (-1,-1), 8),
]))
story.append(siadh_tbl)
story.append(Spacer(1, 5*mm))

# =====================================================================
# SECTION 4 — TREATMENT
# =====================================================================
story.append(KeepTogether([
    section_header("4. TREATMENT", bg=HexColor("#7C3AED")),
    Spacer(1, 3*mm),
]))

tx_data = [
    ["Presentation", "First-line Treatment", "Key Notes"],
    ["<b>Severe symptoms</b>\n(seizures, coma, vomiting, respiratory arrest)",
     "3% Hypertonic Saline IV\n• Adult: 100 mL bolus (repeat x2 if needed)\n• Peds: 3–5 mL/kg over 15–30 min\nTarget: raise Na by 5 mEq/L",
     "Raising Na by 5 mEq/L typically aborts seizures. Target Na &gt;124 mEq/L. Do NOT wait to confirm Na before treating."],
    ["<b>Moderate symptoms</b>\n(nausea, confusion, headache)",
     "3% NaCl at low rate 0.5–1 mL/kg/h\nOR fluid restriction if SIADH",
     "Correct slower than acute. Monitor Na q1–4h."],
    ["<b>Mild / Asymptomatic</b>\nChronic hyponatremia",
     "Treat underlying cause:\n• Hypovolemic → isotonic saline\n• Hypervolemic (HF/cirrhosis) → fluid restriction ± loop diuretic\n• SIADH → fluid restriction, salt tabs, vaptans (tolvaptan/conivaptan)",
     "Avoid rapid correction. No active therapy within 24h of hypertonic saline."],
    ["<b>Exercise-Associated\nHyponatremia (EAH)</b>",
     "If symptomatic: 3% NaCl bolus 100 mL (adult)\nDo NOT give hypotonic or isotonic IV fluids!",
     "Develops acutely; aggressive correction is safe. Symptoms at Na 125–130 mEq/L possible."],
]
story.append(make_table(tx_data,
    [CONTENT_W*0.22, CONTENT_W*0.38, CONTENT_W*0.40],
    header_bg=HexColor("#7C3AED"),
    row_bg1=WHITE, row_bg2=HexColor("#F5F3FF"),
    fontsize=7.8))
story.append(Spacer(1, 3*mm))

# Hypertonic saline note
hs_box = Table([[
    Paragraph("Isotonic (0.9%) saline", sty("hsb", fontSize=8.5, textColor=NAVY,
               fontName="Helvetica-Bold", leading=12)),
    Paragraph("may be used for mild hyponatremia (esp. hypovolemic), but account for additional fluid load. "
              "Loop diuretics (furosemide 20 mg IV) may be added alongside saline infusions to enhance free-water excretion.",
              BODY_SM)
]], colWidths=[CONTENT_W*0.28, CONTENT_W*0.72])
hs_box.setStyle(TableStyle([
    ("BACKGROUND", (0,0), (-1,-1), LYELLOW),
    ("GRID", (0,0), (-1,-1), 0.3, HexColor("#FDE68A")),
    ("VALIGN", (0,0), (-1,-1), "MIDDLE"),
    ("TOPPADDING", (0,0), (-1,-1), 5),
    ("BOTTOMPADDING", (0,0), (-1,-1), 5),
    ("LEFTPADDING", (0,0), (-1,-1), 6),
]))
story.append(hs_box)
story.append(Spacer(1, 5*mm))

# =====================================================================
# SECTION 5 — CORRECTION RATE LIMITS
# =====================================================================
story.append(KeepTogether([
    section_header("5. SAFE CORRECTION RATE LIMITS", bg=AMBER),
    Spacer(1, 3*mm),
]))

rate_data = [
    ["Patient Category", "Max Correction Rate", "Rationale"],
    ["<b>Standard (low-risk)</b>", "<b>8–12 mEq/L per 24 h</b>\n(max 18 mEq/L per 48 h)",
     "Prevents ODS in most patients"],
    ["<b>High-risk for ODS</b>\n(alcohol abuse, malnutrition, Na &lt;105 mEq/L, hypokalemia, liver disease, diuretic-induced)",
     "<b>6 mEq/L per 24 h</b>", "These patients are at greatest risk of demyelination"],
    ["<b>Acute symptomatic\n(seizure / herniation)</b>",
     "Rapid 5 mEq/L rise is <b>safe and necessary</b>\nto abort seizure, then revert to safe rate",
     "Life-threatening cerebral edema overrides the ODS risk temporarily"],
    ["<b>Acute EAH</b>",
     "Aggressive correction safe (developed rapidly)",
     "Rapid onset = safe to correct rapidly"],
]
story.append(make_table(rate_data,
    [CONTENT_W*0.30, CONTENT_W*0.30, CONTENT_W*0.40],
    header_bg=AMBER, row_bg2=LORANGE, fontsize=7.8))
story.append(Spacer(1, 2*mm))
story.append(Paragraph(
    "<b>If correction is too fast:</b>  Administer desmopressin (DDAVP) and D5W to slow or reverse the rate of sodium rise.",
    BODY_SM))
story.append(Spacer(1, 5*mm))

# =====================================================================
# SECTION 6 — ODS
# =====================================================================
story.append(KeepTogether([
    section_header("6. OSMOTIC DEMYELINATION SYNDROME (ODS)", bg=RED),
    Spacer(1, 3*mm),
]))

ods_left = [
    Paragraph("<b>Mechanism</b>", H2),
    Paragraph("In chronic hyponatremia, astrocytes lower intracellular osmolality by exporting osmolytes. "
              "Rapid correction renders serum hypertonic vs. astrocytes → water exits cells → "
              "cytoskeletal damage → oligodendrocyte death → demyelination (pons most affected).", BODY_SM),
    Spacer(1, 3*mm),
    Paragraph("<b>Onset</b>", H2),
    Paragraph("Symptoms appear <b>2–6 days</b> after overcorrection. MRI may not show lesions for <b>up to 4 weeks</b>.", BODY_SM),
    Spacer(1, 3*mm),
    Paragraph("<b>Symptoms</b>", H2),
    Paragraph("Spastic quadriparesis · pseudobulbar palsy (dysarthria, dysphagia, diplopia) · "
              "coma · movement disorders · seizures · ataxia · behavioral disorders · death", BODY_SM),
]

ods_right = [
    Paragraph("<b>Risk Factors</b>", H2),
]
rf_items = [
    "Na+ &lt;105 mEq/L (virtually always &lt;120)",
    "Alcohol abuse",
    "Malnutrition",
    "Hypokalemia",
    "Advanced liver disease",
    "Diuretic-associated hyponatremia",
    "Treated cortisol deficiency",
    "Vaptan (tolvaptan) treatment",
]
for rf in rf_items:
    ods_right.append(Paragraph(f"• {rf}", BODY_SM))
ods_right.append(Spacer(1, 3*mm))
ods_right.append(Paragraph("<b>Prevention</b>", H2))
ods_right.append(Paragraph(
    "• Keep correction &lt;6–12 mEq/L/24h<br/>"
    "• DDAVP + D5W to reverse if overcorrected<br/>"
    "• Consider prophylactic DDAVP + 3% NaCl in very high-risk patients",
    BODY_SM))

ods_tbl = Table([[ods_left, ods_right]], colWidths=[CONTENT_W*0.49, CONTENT_W*0.49])
ods_tbl.setStyle(TableStyle([
    ("VALIGN", (0,0), (-1,-1), "TOP"),
    ("BACKGROUND", (0,0), (0,0), HexColor("#FFF1F2")),
    ("BACKGROUND", (1,0), (1,0), LRED),
    ("BOX", (0,0), (-1,-1), 0.5, MGREY),
    ("INNERGRID", (0,0), (-1,-1), 0.3, MGREY),
    ("TOPPADDING", (0,0), (-1,-1), 6),
    ("BOTTOMPADDING", (0,0), (-1,-1), 6),
    ("LEFTPADDING", (0,0), (-1,-1), 7),
    ("RIGHTPADDING", (0,0), (-1,-1), 7),
]))
story.append(ods_tbl)
story.append(Spacer(1, 5*mm))

# =====================================================================
# SECTION 7 — SODIUM CUTOFF & SEIZURE ALERT
# =====================================================================
story.append(KeepTogether([
    section_header("7. SEIZURE THRESHOLD & SODIUM CUTOFFS", bg=HexColor("#B91C1C")),
    Spacer(1, 3*mm),
]))

cutoff_data = [
    ["Na+ Level", "Risk", "Action"],
    ["130–135 mEq/L", "Low — usually asymptomatic", "Investigate cause; treat underlying condition"],
    ["125–129 mEq/L", "Moderate — nausea, headache, confusion", "Fluid restriction / treat cause; monitor closely"],
    ["120–124 mEq/L", "High — seizures possible\n(esp. if acute onset)", "Consider 3% NaCl if symptomatic; urgent evaluation"],
    ["&lt;120 mEq/L", "<b>CRITICAL — seizures likely\n(classical cutoff)</b>", "<b>3% NaCl immediately</b>; ICU monitoring"],
    ["&lt;115 mEq/L", "<b>EMERGENCY — herniation, death risk</b>", "<b>Emergent treatment; neurology/ICU consult</b>"],
]
story.append(make_table(cutoff_data,
    [CONTENT_W*0.20, CONTENT_W*0.35, CONTENT_W*0.45],
    header_bg=RED, row_bg2=LRED, fontsize=8))
story.append(Spacer(1, 2*mm))

alert_box = Table([[
    Paragraph("⚠  ACUTE ONSET CAVEAT:", sty("alert", fontSize=8.5, textColor=RED,
               fontName="Helvetica-Bold", leading=12)),
    Paragraph("In acute hyponatremia (&lt;48 h), seizures and herniation can occur at Na &gt;120 mEq/L "
              "(even 125–130 in EAH). The absolute value is less important than the <b>rate of fall</b>.",
              BODY_SM)
]], colWidths=[CONTENT_W*0.28, CONTENT_W*0.72])
alert_box.setStyle(TableStyle([
    ("BACKGROUND", (0,0), (-1,-1), LRED),
    ("BOX", (0,0), (-1,-1), 1, RED),
    ("VALIGN", (0,0), (-1,-1), "MIDDLE"),
    ("TOPPADDING", (0,0), (-1,-1), 6),
    ("BOTTOMPADDING", (0,0), (-1,-1), 6),
    ("LEFTPADDING", (0,0), (-1,-1), 8),
]))
story.append(alert_box)
story.append(Spacer(1, 5*mm))

# =====================================================================
# SECTION 8 — MONITORING
# =====================================================================
story.append(KeepTogether([
    section_header("8. MONITORING PROTOCOL", bg=HexColor("#065F46")),
    Spacer(1, 3*mm),
]))
mon_items = [
    "Check serum Na+ <b>every 1–4 hours</b> during active treatment with hypertonic saline",
    "Monitor ECF volume status alongside serum Na+",
    "Track urine Na+ and urine osmolality to guide therapy",
    "Document total Na+ rise per 24h and per 48h — alert if approaching limits",
    "If Na+ corrects faster than target, <b>immediately give DDAVP 2 mcg IV + D5W</b> to arrest the rise",
    "Transition from IV to oral management when patient is stable and Na+ > 125 mEq/L",
]
mon_tbl = Table(
    [[Paragraph(f"• {item}", BODY_SM)] for item in mon_items],
    colWidths=[CONTENT_W]
)
mon_tbl.setStyle(TableStyle([
    ("BACKGROUND", (0,0), (-1,-1), LGREEN),
    ("GRID", (0,0), (-1,-1), 0.3, HexColor("#A7F3D0")),
    ("TOPPADDING", (0,0), (-1,-1), 4),
    ("BOTTOMPADDING", (0,0), (-1,-1), 4),
    ("LEFTPADDING", (0,0), (-1,-1), 8),
]))
story.append(mon_tbl)
story.append(Spacer(1, 5*mm))

# =====================================================================
# SECTION 9 — SPECIAL POPULATIONS
# =====================================================================
story.append(KeepTogether([
    section_header("9. SPECIAL POPULATIONS & CAUSES", bg=HexColor("#6B21A8")),
    Spacer(1, 3*mm),
]))

sp_data = [
    ["Population / Cause", "Key Features", "Treatment Pearl"],
    ["SIADH\n(many causes: malignancy, CNS, pulmonary, drugs)",
     "Euvolemic; elevated UNa; concentrated urine; exclude endocrine",
     "Fluid restriction ± salt tabs; vaptans (tolvaptan) for resistant cases; treat underlying cause"],
    ["Heart Failure / Cirrhosis / Nephrotic Syndrome",
     "Hypervolemic; edema; JVD; low UNa (&lt;10); avid Na retention",
     "Fluid restriction + loop diuretics; treat underlying condition; vaptans in select cases"],
    ["Diuretic-induced\n(thiazides most common)",
     "Hypovolemic; low UNa after diuretic stopped; high ODS risk",
     "Stop diuretic; cautious saline replacement; high ODS risk — max 6 mEq/24h"],
    ["Adrenal Insufficiency",
     "Euvolemic/hypovolemic; hyperkalemia; low cortisol; elevated ACTH",
     "Hydrocortisone IV; Na corrects with glucocorticoid replacement"],
    ["Hypothyroidism",
     "Euvolemic; TSH elevated; myxedema features",
     "Thyroid hormone replacement; Na corrects slowly"],
    ["Exercise-Associated\nHyponatremia (EAH)",
     "Acute onset during/after endurance event; weight gain; brain edema risk",
     "3% NaCl if symptomatic; NO hypotonic fluids; aggressive correction safe"],
    ["DDAVP for enuresis\n(esp. children)",
     "Acute hyponatremia; Na range 104–130 at seizure onset",
     "Stop DDAVP; fluid restriction; 3% NaCl if seizures"],
    ["Psychogenic polydipsia / beer potomania / Ecstasy",
     "Very low Uosm; water intoxication; acute",
     "Fluid restriction; water intake cessation; 3% NaCl if severe symptoms"],
]
story.append(make_table(sp_data,
    [CONTENT_W*0.22, CONTENT_W*0.38, CONTENT_W*0.40],
    header_bg=HexColor("#6B21A8"),
    row_bg2=HexColor("#F5F3FF"),
    fontsize=7.5))
story.append(Spacer(1, 5*mm))

# =====================================================================
# SECTION 10 — 3% NaCl QUICK REFERENCE
# =====================================================================
story.append(KeepTogether([
    section_header("10. 3% HYPERTONIC SALINE — DOSING AT A GLANCE", bg=HexColor("#0F4C81")),
    Spacer(1, 3*mm),
]))

hs_data = [
    ["Indication", "Dose", "Rate / Duration", "Target"],
    ["Seizure / Severe encephalopathy (Adult)",
     "100 mL 3% NaCl IV bolus\n(repeat up to 3×)",
     "Over 10–15 min per bolus",
     "Raise Na by 5 mEq/L to abort seizure; then maintain &lt;12 mEq/L rise per 24h"],
    ["Seizure / Severe encephalopathy (Pediatric)",
     "3–5 mL/kg 3% NaCl IV",
     "Over 15–30 min",
     "Seizure cessation; target Na &gt;124 mEq/L"],
    ["Moderate symptoms (Adult)",
     "3% NaCl 0.5–1 mL/kg/h",
     "Continuous infusion",
     "&lt;8–12 mEq/L rise per 24h; frequent Na monitoring"],
    ["EAH — symptomatic (Adult)",
     "100 mL 3% NaCl bolus",
     "Over 10 min; repeat if needed",
     "Symptom resolution; correction rate not restricted given acute onset"],
]
story.append(make_table(hs_data,
    [CONTENT_W*0.25, CONTENT_W*0.25, CONTENT_W*0.22, CONTENT_W*0.28],
    header_bg=HexColor("#0F4C81"),
    row_bg2=LBLUE,
    fontsize=7.8))
story.append(Spacer(1, 5*mm))

# =====================================================================
# FOOTER / REFERENCES
# =====================================================================
HRFlowable(width=CONTENT_W, thickness=0.5, color=MGREY)
story.append(HRFlowable(width=CONTENT_W, thickness=0.5, color=MGREY))
story.append(Spacer(1, 2*mm))
story.append(Paragraph(
    "<b>Sources:</b>  Symptom to Diagnosis 4e · Tintinalli's Emergency Medicine 9e · Rosen's Emergency Medicine 9e · "
    "Miller's Anesthesia 10e · Harriet Lane Handbook 23e · Barash Clinical Anesthesia 9e · "
    "Harrison's Principles of Internal Medicine 22e · Brenner & Rector's The Kidney · "
    "National Kidney Foundation Primer on Kidney Diseases 8e",
    FOOTER))
story.append(Spacer(1, 1*mm))
story.append(Paragraph(
    "This guide is for educational reference only. Clinical decisions must be made by qualified healthcare professionals.",
    FOOTER))

# =====================================================================
# BUILD
# =====================================================================
doc.build(story)
print(f"PDF saved to {OUTPUT}")
Running Command

cd /tmp/workspace/hyponatremia-guide && python build_guide.py 2>&1

Running Command

ls -lh /tmp/workspace/hyponatremia-guide/Hyponatremia_Quick_Reference.pdf

Your quick-reference guide is ready:

Hyponatremia Quick Reference

PDF Document · PDF


The PDF is a single-page, color-coded clinical reference covering 10 sections:
SectionContent
1. ClassificationMild / Moderate / Severe grades with Na+ thresholds and symptoms
2. PathophysiologyAcute vs Chronic side-by-side comparison
3. Diagnostic Approach4-step framework (clues → volume status → urine Na → endocrine) + SIADH criteria box
4. TreatmentSevere / Moderate / Mild / EAH management with specific regimens
5. Correction Rate LimitsStandard (12 mEq/24h) vs High-risk (6 mEq/24h) vs Seizure (5 mEq rapid bolus)
6. ODSMechanism, timing, risk factors, prevention and reversal
7. Seizure ThresholdColor-coded Na+ cutoff table from 130 → <115, plus acute-onset caveat
8. Monitoring ProtocolFrequency of checks, when to give DDAVP rescue
9. Special PopulationsSIADH, HF/cirrhosis, diuretics, adrenal, hypothyroidism, EAH, DDAVP, polydipsia
10. 3% NaCl DosingAdult vs pediatric bolus and infusion doses with targets
Sources: Tintinalli's 9e, Rosen's 9e, Miller's Anesthesia 10e, Harriet Lane 23e, Symptom to Diagnosis 4e, Harrison's 22e, Brenner & Rector's The Kidney.
This is a shared conversation. Sign in to Orris to start your own chat.